forked from sin365/AxibugEmuOnline
Merge pull request 'master' (#87) from Alienjack/AxibugEmuOnline:master into master
Reviewed-on: sin365/AxibugEmuOnline#87
This commit is contained in:
commit
85b175f831
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -21,7 +21,6 @@ namespace AxibugEmuOnline.Client.ClientCore
|
||||
public static AppLogin login;
|
||||
public static AppChat chat;
|
||||
public static UserDataManager user;
|
||||
//public static AppNetGame netgame;
|
||||
public static AppEmu emu;
|
||||
/// <summary>
|
||||
/// nes Rom库
|
||||
@ -36,6 +35,7 @@ namespace AxibugEmuOnline.Client.ClientCore
|
||||
public static AppRoom roomMgr;
|
||||
public static AppSettings settings;
|
||||
public static AppShare share;
|
||||
public static GamePadManager gamePadMgr;
|
||||
private static object gameSavMgr;
|
||||
static bool bTest;
|
||||
static string mTestSrvIP;
|
||||
@ -49,11 +49,19 @@ namespace AxibugEmuOnline.Client.ClientCore
|
||||
|
||||
#endregion
|
||||
|
||||
|
||||
static string s_persistentRoot =
|
||||
#if UNITY_PSP2 && !UNITY_EDITOR //PSV真机
|
||||
public static string PersistentDataPath => "ux0:data/AxibugEmu";
|
||||
"ux0:data/AxibugEmu";
|
||||
#else
|
||||
public static string PersistentDataPath => Application.persistentDataPath;
|
||||
Application.persistentDataPath;
|
||||
#endif
|
||||
public static string PersistentDataPath(RomPlatformType emuPlatform)
|
||||
{
|
||||
return s_persistentRoot + "/" + emuPlatform.ToString();
|
||||
}
|
||||
public static string PersistentDataRoot() => s_persistentRoot;
|
||||
|
||||
public static void Init(bool isTest = false, string testSrvIP = "", bool bUseLocalWebApi = false, string mLocalWebApi = "")
|
||||
{
|
||||
log = new LogManager(OnLogOut);
|
||||
@ -70,7 +78,6 @@ namespace AxibugEmuOnline.Client.ClientCore
|
||||
chat = new AppChat();
|
||||
user = new UserDataManager();
|
||||
emu = new AppEmu();
|
||||
//netgame = new AppNetGame();
|
||||
httpAPI = new HttpAPI();
|
||||
if (bUseLocalWebApi)
|
||||
httpAPI.WebHost = mLocalWebApi;
|
||||
@ -80,6 +87,8 @@ namespace AxibugEmuOnline.Client.ClientCore
|
||||
roomMgr = new AppRoom();
|
||||
share = new AppShare();
|
||||
gameSavMgr = new AppGameSavMgr();
|
||||
gamePadMgr = new GamePadManager();
|
||||
|
||||
bTest = isTest;
|
||||
mTestSrvIP = testSrvIP;
|
||||
var go = new GameObject("[AppAxibugEmuOnline]");
|
||||
@ -99,8 +108,8 @@ namespace AxibugEmuOnline.Client.ClientCore
|
||||
private static void PSP2Init()
|
||||
{
|
||||
//PSVita最好手动创建目录
|
||||
if (!Directory.Exists(PersistentDataPath))
|
||||
Directory.CreateDirectory(PersistentDataPath);
|
||||
if (!Directory.Exists("ux0:data/AxibugEmu"))
|
||||
Directory.CreateDirectory("ux0:data/AxibugEmu");
|
||||
|
||||
#if UNITY_PSP2
|
||||
//创建PSV弹窗UI
|
||||
@ -202,6 +211,9 @@ namespace AxibugEmuOnline.Client.ClientCore
|
||||
private static void Tick()
|
||||
{
|
||||
nesRomLib.ExecuteFetchRomInfo();
|
||||
starRomLib.ExecuteFetchRomInfo();
|
||||
|
||||
gamePadMgr.Update();
|
||||
}
|
||||
|
||||
public static Coroutine StartCoroutine(IEnumerator itor)
|
||||
|
@ -1,4 +1,5 @@
|
||||
using AxibugEmuOnline.Client.ClientCore;
|
||||
using System.Text;
|
||||
using UnityEngine;
|
||||
|
||||
namespace AxibugEmuOnline.Client
|
||||
|
@ -1,6 +1,7 @@
|
||||
using Assets.Script.AppMain.Filter;
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.ComponentModel;
|
||||
using System.Linq;
|
||||
using System.Reflection;
|
||||
using UnityEngine;
|
||||
@ -53,12 +54,12 @@ namespace AxibugEmuOnline.Client
|
||||
var rangeAtt = param.GetCustomAttribute<RangeAttribute>();
|
||||
float min = 0;
|
||||
float max = 10;
|
||||
if (rangeAtt != null)
|
||||
{
|
||||
min = rangeAtt.min; max = rangeAtt.max;
|
||||
}
|
||||
if (rangeAtt != null) { min = rangeAtt.min; max = rangeAtt.max; }
|
||||
|
||||
var editableParam = new EditableParamerter(param.Name, paramObj, min, max);
|
||||
var descrip = param.GetCustomAttribute<DescriptionAttribute>();
|
||||
string name = descrip != null ? descrip.Description : param.Name;
|
||||
|
||||
var editableParam = new EditableParamerter(name, paramObj, min, max);
|
||||
m_editableParamList.Add(editableParam);
|
||||
}
|
||||
}
|
||||
@ -86,15 +87,23 @@ namespace AxibugEmuOnline.Client
|
||||
public object MinValue { get; private set; }
|
||||
public object MaxValue { get; private set; }
|
||||
|
||||
public EditableParamerter(string name, FilterParameter paramObject, object minValue, object maxValue)
|
||||
public EditableParamerter(string name, FilterParameter paramObject, float minValue, float maxValue)
|
||||
{
|
||||
m_paramObject = paramObject;
|
||||
Name = name;
|
||||
|
||||
var paramType = paramObject.GetType();
|
||||
|
||||
MinValue = minValue;
|
||||
MaxValue = maxValue;
|
||||
if (paramObject.ValueType == typeof(int))
|
||||
{
|
||||
MinValue = (int)minValue;
|
||||
MaxValue = (int)maxValue;
|
||||
}
|
||||
else if (paramObject.ValueType == typeof(float))
|
||||
{
|
||||
MinValue = minValue;
|
||||
MaxValue = maxValue;
|
||||
}
|
||||
}
|
||||
|
||||
public void ResetToDefault() => m_paramObject.Value = null;
|
||||
|
@ -331,6 +331,18 @@ namespace AxibugEmuOnline.Client
|
||||
float.TryParse(rawStr, out floatVal);
|
||||
return floatVal;
|
||||
}
|
||||
else if (valueType == typeof(int))
|
||||
{
|
||||
int intVal;
|
||||
int.TryParse(rawStr, out intVal);
|
||||
return intVal;
|
||||
}
|
||||
else if (valueType == typeof(bool))
|
||||
{
|
||||
bool boolVal;
|
||||
bool.TryParse(rawStr, out boolVal);
|
||||
return boolVal;
|
||||
}
|
||||
else if (valueType.IsEnum)
|
||||
{
|
||||
var names = Enum.GetNames(valueType);
|
||||
|
@ -29,20 +29,75 @@ namespace Assets.Script.AppMain.Filter
|
||||
{
|
||||
m_defaultValue = defaultValue;
|
||||
}
|
||||
|
||||
public static implicit operator T(FilterParameter<T> value)
|
||||
{
|
||||
return value.GetValue();
|
||||
}
|
||||
|
||||
public static implicit operator FilterParameter<T>(T value)
|
||||
{
|
||||
return new FilterParameter<T>(value);
|
||||
}
|
||||
}
|
||||
|
||||
public class BoolParameter : FilterParameter<bool>
|
||||
{
|
||||
public BoolParameter(bool defaultValue) : base(defaultValue) { }
|
||||
|
||||
public static implicit operator bool(BoolParameter value)
|
||||
{
|
||||
return value.GetValue();
|
||||
}
|
||||
|
||||
public static implicit operator BoolParameter(bool value)
|
||||
{
|
||||
return new BoolParameter(value);
|
||||
}
|
||||
}
|
||||
|
||||
public class Vector2Parameter : FilterParameter<Vector2>
|
||||
{
|
||||
public Vector2Parameter(Vector2 defaultValue) : base(defaultValue) { }
|
||||
|
||||
public static implicit operator Vector2(Vector2Parameter value)
|
||||
{
|
||||
return value.GetValue();
|
||||
}
|
||||
|
||||
public static implicit operator Vector2Parameter(Vector2 value)
|
||||
{
|
||||
return new Vector2Parameter(value);
|
||||
}
|
||||
}
|
||||
|
||||
public class FloatParameter : FilterParameter<float>
|
||||
{
|
||||
public FloatParameter(float defaultValue) : base(defaultValue) { }
|
||||
|
||||
public static implicit operator float(FloatParameter value)
|
||||
{
|
||||
return value.GetValue();
|
||||
}
|
||||
|
||||
public static implicit operator FloatParameter(float value)
|
||||
{
|
||||
return new FloatParameter(value);
|
||||
}
|
||||
}
|
||||
|
||||
public class IntParameter : FilterParameter<int>
|
||||
{
|
||||
public IntParameter(int defaultValue) : base(defaultValue) { }
|
||||
|
||||
public static implicit operator int(IntParameter value)
|
||||
{
|
||||
return value.GetValue();
|
||||
}
|
||||
|
||||
public static implicit operator IntParameter(int value)
|
||||
{
|
||||
return new IntParameter(value);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 36463068bd4c2274cb302669fa552345
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,173 @@
|
||||
using Assets.Script.AppMain.Filter;
|
||||
using AxibugEmuOnline.Client;
|
||||
using System.ComponentModel;
|
||||
using UnityEngine;
|
||||
using Random = UnityEngine.Random;
|
||||
|
||||
|
||||
public class SimpleCRT : FilterEffect
|
||||
{
|
||||
public override string Name => nameof(SimpleCRT);
|
||||
|
||||
protected override string ShaderName => "Filter/yunoda-3DCG/SimpleCRT";
|
||||
|
||||
[Range(0, 1000)][Description("White Noise Freq")] public IntParameter whiteNoiseFrequency = new IntParameter(1);
|
||||
[Range(0, 1)][Description("White Noise Time Left (sec)")] public FloatParameter whiteNoiseLength = new FloatParameter(0.1f);
|
||||
private float whiteNoiseTimeLeft;
|
||||
|
||||
[Range(0, 1000)][Description("Screen Jump Freq")] public IntParameter screenJumpFrequency = 1;
|
||||
[Range(0, 1f)][Description("Screen Jump Length")] public FloatParameter screenJumpLength = 0.2f;
|
||||
[Range(0, 1f)][Description("Jump Min")] public FloatParameter screenJumpMinLevel = 0.1f;
|
||||
[Range(0, 1f)][Description("Jump Max")] public FloatParameter screenJumpMaxLevel = 0.9f;
|
||||
private float screenJumpTimeLeft;
|
||||
|
||||
[Range(0, 1f)][Description("Flickering Strength")] public FloatParameter flickeringStrength = 0.002f;
|
||||
[Range(0, 333f)][Description("Flickering Cycle")] public FloatParameter flickeringCycle = 111f;
|
||||
|
||||
[Description("Slip Page")] public BoolParameter isSlippage = true;
|
||||
[Description("Slip Noise")] public BoolParameter isSlippageNoise = true;
|
||||
[Range(0, 1)][Description("Slip Strength")] public FloatParameter slippageStrength = 0.005f;
|
||||
[Range(0, 100)][Description("Slip Intervalw")] public float slippageInterval = 1f;
|
||||
[Range(0, 330)][Description("Slip Scroll Speed")] public float slippageScrollSpeed = 33f;
|
||||
[Range(0, 100f)][Description("Slip Size")] public FloatParameter slippageSize = 11f;
|
||||
|
||||
[Range(0, 1f)][Description("Chromatic Aberration Strength")] public FloatParameter chromaticAberrationStrength = 0.005f;
|
||||
[Description("Chromatic Aberration")] public bool isChromaticAberration = true;
|
||||
|
||||
[Description("Multiple Ghost")] public BoolParameter isMultipleGhost = true;
|
||||
[Range(0, 1f)][Description("Multiple Ghost Strength")] public FloatParameter multipleGhostStrength = 0.01f;
|
||||
|
||||
[Description("Scanline")] public BoolParameter isScanline = true;
|
||||
[Description("Monochrome")] public BoolParameter isMonochrome = false;
|
||||
|
||||
[Description("Letter Box")] public bool isLetterBox = false;
|
||||
public bool isLetterBoxEdgeBlur = false;
|
||||
[Description("Letter Box Type")] public FilterParameter<LeterBoxType> letterBoxType = default(LeterBoxType);
|
||||
public enum LeterBoxType
|
||||
{
|
||||
Black,
|
||||
Blur
|
||||
}
|
||||
|
||||
#region Properties in shader
|
||||
private int _WhiteNoiseOnOff;
|
||||
private int _ScanlineOnOff;
|
||||
private int _MonochormeOnOff;
|
||||
private int _ScreenJumpLevel;
|
||||
private int _FlickeringStrength;
|
||||
private int _FlickeringCycle;
|
||||
private int _SlippageStrength;
|
||||
private int _SlippageSize;
|
||||
private int _SlippageInterval;
|
||||
private int _SlippageScrollSpeed;
|
||||
private int _SlippageNoiseOnOff;
|
||||
private int _SlippageOnOff;
|
||||
private int _ChromaticAberrationStrength;
|
||||
private int _ChromaticAberrationOnOff;
|
||||
private int _MultipleGhostOnOff;
|
||||
private int _MultipleGhostStrength;
|
||||
private int _LetterBoxOnOff;
|
||||
private int _LetterBoxType;
|
||||
private int _LetterBoxEdgeBlurOnOff;
|
||||
private int _DecalTex;
|
||||
private int _DecalTexOnOff;
|
||||
private int _DecalTexPos;
|
||||
private int _DecalTexScale;
|
||||
private int _FilmDirtOnOff;
|
||||
private int _FilmDirtTex;
|
||||
#endregion
|
||||
|
||||
protected override void OnInit(Material renderMat)
|
||||
{
|
||||
base.OnInit(renderMat);
|
||||
|
||||
_WhiteNoiseOnOff = Shader.PropertyToID("_WhiteNoiseOnOff");
|
||||
_ScanlineOnOff = Shader.PropertyToID("_ScanlineOnOff");
|
||||
_MonochormeOnOff = Shader.PropertyToID("_MonochormeOnOff");
|
||||
_ScreenJumpLevel = Shader.PropertyToID("_ScreenJumpLevel");
|
||||
_FlickeringStrength = Shader.PropertyToID("_FlickeringStrength");
|
||||
_FlickeringCycle = Shader.PropertyToID("_FlickeringCycle");
|
||||
_SlippageStrength = Shader.PropertyToID("_SlippageStrength");
|
||||
_SlippageSize = Shader.PropertyToID("_SlippageSize");
|
||||
_SlippageInterval = Shader.PropertyToID("_SlippageInterval");
|
||||
_SlippageScrollSpeed = Shader.PropertyToID("_SlippageScrollSpeed");
|
||||
_SlippageNoiseOnOff = Shader.PropertyToID("_SlippageNoiseOnOff");
|
||||
_SlippageOnOff = Shader.PropertyToID("_SlippageOnOff");
|
||||
_ChromaticAberrationStrength = Shader.PropertyToID("_ChromaticAberrationStrength");
|
||||
_ChromaticAberrationOnOff = Shader.PropertyToID("_ChromaticAberrationOnOff");
|
||||
_MultipleGhostOnOff = Shader.PropertyToID("_MultipleGhostOnOff");
|
||||
_MultipleGhostStrength = Shader.PropertyToID("_MultipleGhostStrength");
|
||||
_LetterBoxOnOff = Shader.PropertyToID("_LetterBoxOnOff");
|
||||
_LetterBoxType = Shader.PropertyToID("_LetterBoxType");
|
||||
_DecalTex = Shader.PropertyToID("_DecalTex");
|
||||
_DecalTexOnOff = Shader.PropertyToID("_DecalTexOnOff");
|
||||
_DecalTexPos = Shader.PropertyToID("_DecalTexPos");
|
||||
_DecalTexScale = Shader.PropertyToID("_DecalTexScale");
|
||||
_FilmDirtOnOff = Shader.PropertyToID("_FilmDirtOnOff");
|
||||
_FilmDirtTex = Shader.PropertyToID("_FilmDirtTex");
|
||||
}
|
||||
|
||||
protected override void OnRenderer(Material renderMat, Texture src, RenderTexture result)
|
||||
{
|
||||
SetShaderParameter(renderMat);
|
||||
|
||||
Graphics.Blit(src, result, renderMat);
|
||||
}
|
||||
|
||||
private void SetShaderParameter(Material material)
|
||||
{
|
||||
///////White noise
|
||||
whiteNoiseTimeLeft -= 0.01f;
|
||||
if (whiteNoiseTimeLeft <= 0)
|
||||
{
|
||||
if (Random.Range(0, 1000) < whiteNoiseFrequency)
|
||||
{
|
||||
material.SetInteger(_WhiteNoiseOnOff, 1);
|
||||
whiteNoiseTimeLeft = whiteNoiseLength;
|
||||
}
|
||||
else
|
||||
{
|
||||
material.SetInteger(_WhiteNoiseOnOff, 0);
|
||||
}
|
||||
}
|
||||
//////
|
||||
|
||||
material.SetInteger(_LetterBoxOnOff, isLetterBox ? 0 : 1);
|
||||
//material.SetInteger(_LetterBoxEdgeBlurOnOff, isLetterBoxEdgeBlur ? 0 : 1);
|
||||
material.SetInteger(_LetterBoxType, (int)letterBoxType.GetValue());
|
||||
|
||||
material.SetInteger(_ScanlineOnOff, isScanline ? 1 : 0);
|
||||
material.SetInteger(_MonochormeOnOff, isMonochrome ? 1 : 0);
|
||||
material.SetFloat(_FlickeringStrength, flickeringStrength);
|
||||
material.SetFloat(_FlickeringCycle, flickeringCycle);
|
||||
material.SetFloat(_ChromaticAberrationStrength, chromaticAberrationStrength);
|
||||
material.SetInteger(_ChromaticAberrationOnOff, isChromaticAberration ? 1 : 0);
|
||||
material.SetInteger(_MultipleGhostOnOff, isMultipleGhost ? 1 : 0);
|
||||
material.SetFloat(_MultipleGhostStrength, multipleGhostStrength);
|
||||
|
||||
//////Slippage
|
||||
material.SetInteger(_SlippageOnOff, isSlippage ? 1 : 0);
|
||||
material.SetFloat(_SlippageInterval, slippageInterval);
|
||||
material.SetFloat(_SlippageNoiseOnOff, isSlippageNoise ? Random.Range(0, 1f) : 1);
|
||||
material.SetFloat(_SlippageScrollSpeed, slippageScrollSpeed);
|
||||
material.SetFloat(_SlippageStrength, slippageStrength);
|
||||
material.SetFloat(_SlippageSize, slippageSize);
|
||||
//////
|
||||
|
||||
//////Screen Jump Noise
|
||||
screenJumpTimeLeft -= 0.01f;
|
||||
if (screenJumpTimeLeft <= 0)
|
||||
{
|
||||
if (Random.Range(0, 1000) < screenJumpFrequency)
|
||||
{
|
||||
var level = Random.Range(screenJumpMinLevel, screenJumpMaxLevel);
|
||||
material.SetFloat(_ScreenJumpLevel, level);
|
||||
screenJumpTimeLeft = screenJumpLength;
|
||||
}
|
||||
else
|
||||
{
|
||||
material.SetFloat(_ScreenJumpLevel, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: d4ffc7492874c2241827f1d70c24a1e3
|
@ -0,0 +1,237 @@
|
||||
Shader "Filter/yunoda-3DCG/SimpleCRT"
|
||||
{
|
||||
Properties
|
||||
{
|
||||
_MainTex ("Texture", 2D) = "white" {}
|
||||
_DecalTex ("Decal Texture", 2D) = "white" {}
|
||||
_FilmDirtTex ("Dirt Texture", 2D) = "white" {}
|
||||
}
|
||||
SubShader
|
||||
{
|
||||
Pass
|
||||
{
|
||||
CGPROGRAM
|
||||
#include "UnityCG.cginc"
|
||||
|
||||
#pragma vertex vert
|
||||
#pragma fragment frag
|
||||
|
||||
struct appdata
|
||||
{
|
||||
float4 vertex : POSITION;
|
||||
float2 uv : TEXCOORD0;
|
||||
};
|
||||
|
||||
struct v2f
|
||||
{
|
||||
float2 uv : TEXCOORD0;
|
||||
float2 decaluv : TEXCOORD1;
|
||||
float4 vertex : SV_POSITION;
|
||||
};
|
||||
|
||||
sampler2D _MainTex;
|
||||
float4 _MainTex_ST;
|
||||
float4 _MainTex_TexelSize;
|
||||
|
||||
int _WhiteNoiseOnOff;
|
||||
int _ScanlineOnOff;
|
||||
int _MonochormeOnOff;
|
||||
|
||||
int _LetterBoxOnOff;
|
||||
int _LetterBoxEdgeBlur;
|
||||
int _LetterBoxType;
|
||||
|
||||
float _ScreenJumpLevel;
|
||||
|
||||
float _FlickeringStrength;
|
||||
float _FlickeringCycle;
|
||||
|
||||
int _SlippageOnOff;
|
||||
float _SlippageStrength;
|
||||
float _SlippageInterval;
|
||||
float _SlippageScrollSpeed;
|
||||
float _SlippageNoiseOnOff;
|
||||
float _SlippageSize;
|
||||
|
||||
float _ChromaticAberrationStrength;
|
||||
int _ChromaticAberrationOnOff;
|
||||
|
||||
int _MultipleGhostOnOff;
|
||||
float _MultipleGhostStrength;
|
||||
|
||||
sampler2D _DecalTex;
|
||||
float4 _DecalTex_ST;
|
||||
int _DecalTexOnOff;
|
||||
float2 _DecalTexPos;
|
||||
float2 _DecalTexScale;
|
||||
|
||||
int _FilmDirtOnOff;
|
||||
sampler2D _FilmDirtTex;
|
||||
float4 _FilmDirtTex_ST;
|
||||
|
||||
float GetRandom(float x);
|
||||
float EaseIn(float t0, float t1, float t);
|
||||
|
||||
v2f vert (appdata v)
|
||||
{
|
||||
v2f o;
|
||||
o.vertex = UnityObjectToClipPos(v.vertex);
|
||||
o.uv = TRANSFORM_TEX(v.uv, _MainTex);
|
||||
o.decaluv = TRANSFORM_TEX(v.uv, _DecalTex);
|
||||
return o;
|
||||
}
|
||||
|
||||
fixed4 frag (v2f i) : SV_Target
|
||||
{
|
||||
float2 uv = i.uv;
|
||||
|
||||
/////Jump noise
|
||||
uv.y = frac(uv.y + _ScreenJumpLevel);
|
||||
/////
|
||||
|
||||
/////frickering
|
||||
float flickeringNoise = GetRandom(_Time.y);
|
||||
float flickeringMask = pow(abs(sin(i.uv.y * _FlickeringCycle + _Time.y)), 10);
|
||||
uv.x = uv.x + (flickeringNoise * _FlickeringStrength * flickeringMask);
|
||||
/////
|
||||
|
||||
/////slippage
|
||||
float scrollSpeed = _Time.x * _SlippageScrollSpeed;
|
||||
float slippageMask = pow(abs(sin(i.uv.y * _SlippageInterval + scrollSpeed)), _SlippageSize);
|
||||
float stepMask = round(sin(i.uv.y * _SlippageInterval + scrollSpeed - 1));
|
||||
uv.x = uv.x + (_SlippageNoiseOnOff * _SlippageStrength * slippageMask * stepMask) * _SlippageOnOff;
|
||||
/////
|
||||
|
||||
/////Chromatic Aberration
|
||||
float red = tex2D(_MainTex, float2(uv.x - _ChromaticAberrationStrength * _ChromaticAberrationOnOff, uv.y)).r;
|
||||
float green = tex2D(_MainTex, float2(uv.x, uv.y)).g;
|
||||
float blue = tex2D(_MainTex, float2(uv.x + _ChromaticAberrationStrength * _ChromaticAberrationOnOff, uv.y)).b;
|
||||
float4 color = float4(red, green, blue, 1);
|
||||
/////
|
||||
|
||||
/////Multiple Ghost
|
||||
float4 ghost1st = tex2D(_MainTex, uv - float2(1, 0) * _MultipleGhostStrength * _MultipleGhostOnOff);
|
||||
float4 ghost2nd = tex2D(_MainTex, uv - float2(1, 0) * _MultipleGhostStrength * 2 * _MultipleGhostOnOff);
|
||||
color = color * 0.8 + ghost1st * 0.15 + ghost2nd * 0.05;
|
||||
/////
|
||||
|
||||
/////File dirt
|
||||
float2 pp = -1.0 + 2.0 * uv;
|
||||
float time = _Time.x;
|
||||
float aaRad = 0.1;
|
||||
float2 nseLookup2 = pp + time * 1000;
|
||||
float3 nse2 =
|
||||
tex2D(_FilmDirtTex, 0.1 * nseLookup2.xy).xyz +
|
||||
tex2D(_FilmDirtTex, 0.01 * nseLookup2.xy).xyz +
|
||||
tex2D(_FilmDirtTex, 0.004 * nseLookup2.xy).xyz;
|
||||
float thresh = 0.6;
|
||||
float mul1 = smoothstep(thresh - aaRad, thresh + aaRad, nse2.x);
|
||||
float mul2 = smoothstep(thresh - aaRad, thresh + aaRad, nse2.y);
|
||||
float mul3 = smoothstep(thresh - aaRad, thresh + aaRad, nse2.z);
|
||||
|
||||
float seed = tex2D(_FilmDirtTex, float2(time * 0.35, time)).x;
|
||||
|
||||
float result = clamp(0, 1, seed + 0.7);
|
||||
|
||||
result += 0.06 * EaseIn(19.2, 19.4, time);
|
||||
|
||||
float band = 0.05;
|
||||
if(_FilmDirtOnOff == 1)
|
||||
{
|
||||
if( 0.3 < seed && 0.3 + band > seed )
|
||||
color *= mul1 * result;
|
||||
else if( 0.6 < seed && 0.6 + band > seed )
|
||||
color *= mul2 * result;
|
||||
else if( 0.9 < seed && 0.9 + band > seed )
|
||||
color *= mul3 * result;
|
||||
}
|
||||
/////
|
||||
|
||||
/////Letter box
|
||||
float band_uv = fmod(_MainTex_TexelSize.z, 640) / _MainTex_TexelSize.z / 2;
|
||||
if(i.uv.x < band_uv || 1 - band_uv < i.uv.x)
|
||||
{
|
||||
float pi = 6.28318530718;
|
||||
float directions = 16.0;
|
||||
float quality = 3.0;
|
||||
float size = 8.0;
|
||||
|
||||
float2 Radius = size * _MainTex_ST.zw;
|
||||
float4 samplingColor = tex2D(_MainTex, uv);
|
||||
|
||||
for(float d = 0.0; d < pi; d += pi / directions)
|
||||
{
|
||||
for(float i = 1.0 / quality; i <= 1.0; i += 1.0 / quality)
|
||||
{
|
||||
samplingColor += tex2D(_MainTex, uv + float2(cos(d), sin(d)) * 0.015 * i);
|
||||
}
|
||||
}
|
||||
samplingColor /= quality * directions - 15.0;
|
||||
|
||||
if(_LetterBoxOnOff == 1)
|
||||
{
|
||||
color = color;
|
||||
}
|
||||
else if(_LetterBoxType == 0) // LetterBox is Black
|
||||
{
|
||||
color = 0;
|
||||
}
|
||||
else if(_LetterBoxType == 1) // LetterBox is Blur
|
||||
{
|
||||
color = samplingColor;
|
||||
}
|
||||
}
|
||||
/////
|
||||
|
||||
/////White noise
|
||||
if(_WhiteNoiseOnOff == 1)
|
||||
{
|
||||
return frac(sin(dot(i.uv, float2(12.9898, 78.233)) + _Time.x) * 43758.5453);
|
||||
}
|
||||
/////
|
||||
|
||||
/////Decal texture
|
||||
float4 decal = tex2D(_DecalTex, (i.decaluv - _DecalTexPos) * _DecalTexScale) * _DecalTexOnOff;
|
||||
color = color * (1 - decal.a) + decal;
|
||||
/////
|
||||
|
||||
/////Scanline
|
||||
float scanline = sin((i.uv.y + _Time.x) * 800.0) * 0.04;
|
||||
color -= scanline * _ScanlineOnOff;
|
||||
/////
|
||||
|
||||
//////scanline noise
|
||||
float noiseAlpha = 1;
|
||||
if(pow(sin(uv.y + _Time.y * 2), 200) >= 0.999)
|
||||
{
|
||||
noiseAlpha = GetRandom(uv.y);
|
||||
//color *= noiseAlpha;
|
||||
}
|
||||
//////
|
||||
|
||||
//////Monochorome
|
||||
if(_MonochormeOnOff == 1)
|
||||
{
|
||||
color.xyz = 0.299f * color.r + 0.587f * color.g + 0.114f * color.b;
|
||||
}
|
||||
//////
|
||||
|
||||
return color;
|
||||
}
|
||||
|
||||
float GetRandom(float x)
|
||||
{
|
||||
return frac(sin(dot(x, float2(12.9898, 78.233))) * 43758.5453);
|
||||
}
|
||||
|
||||
float EaseIn(float t0, float t1, float t)
|
||||
{
|
||||
return 2.0 * smoothstep(t0, 2.0 * t1 - t0, t);
|
||||
}
|
||||
ENDCG
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -0,0 +1,9 @@
|
||||
fileFormatVersion: 2
|
||||
guid: fdf9f1937116ab84c97a58a4cf82fbf8
|
||||
ShaderImporter:
|
||||
externalObjects: {}
|
||||
defaultTextures: []
|
||||
nonModifiableTextures: []
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -9,7 +9,7 @@ namespace AxibugEmuOnline.Client
|
||||
{
|
||||
public class CacheManager
|
||||
{
|
||||
static readonly string CacheDirPath = $"{App.PersistentDataPath}/Caches";
|
||||
static readonly string CacheDirPath = $"{App.PersistentDataRoot()}/Caches";
|
||||
static readonly string TextureCacheDirPath = $"{CacheDirPath}/Texture";
|
||||
|
||||
public void GetSpriteCache(string url, Action<Sprite, string> callback)
|
||||
|
@ -0,0 +1,8 @@
|
||||
fileFormatVersion: 2
|
||||
guid: 5fe26f58ab822c44888b86305c5326e0
|
||||
folderAsset: yes
|
||||
DefaultImporter:
|
||||
externalObjects: {}
|
||||
userData:
|
||||
assetBundleName:
|
||||
assetBundleVariant:
|
@ -0,0 +1,26 @@
|
||||
namespace AxibugEmuOnline.Client.Manager
|
||||
{
|
||||
public partial class GamePadManager
|
||||
{
|
||||
/// <summary>
|
||||
/// 被Unity所识别的通用GamePad类
|
||||
/// </summary>
|
||||
public class GamePad
|
||||
{
|
||||
internal GamePadInfo m_info;
|
||||
public int Index => m_info.Index;
|
||||
public string Name => m_info.Name;
|
||||
public bool Offline { get; internal set; }
|
||||
|
||||
internal GamePad(GamePadInfo info)
|
||||
{
|
||||
m_info = info;
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"{Index}:{Name}{(Offline ? "(Offline)" : string.Empty)}";
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c2c0a06020f65a747af5490a6112361b
|
@ -0,0 +1,121 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using UnityEngine;
|
||||
|
||||
namespace AxibugEmuOnline.Client.Manager
|
||||
{
|
||||
public partial class GamePadManager
|
||||
{
|
||||
#region Events
|
||||
public delegate void GamePadConnectedHandle(GamePad newConnectGamePad);
|
||||
/// <summary> 当一个手柄连接时触发 </summary>
|
||||
public event GamePadConnectedHandle OnGamePadConnected;
|
||||
|
||||
public delegate void GamePadDisConnectedHandle(GamePad disConnectGamePad);
|
||||
/// <summary> 当一个手柄断开时触发 </summary>
|
||||
public event GamePadDisConnectedHandle OnGamePadDisConnected;
|
||||
#endregion
|
||||
|
||||
Dictionary<GamePadInfo, GamePad> m_gamePads = new Dictionary<GamePadInfo, GamePad>();
|
||||
HashSet<GamePadInfo> m_temp = new HashSet<GamePadInfo>();
|
||||
|
||||
public void Update()
|
||||
{
|
||||
m_temp.Clear();
|
||||
foreach (var info in m_gamePads.Keys)
|
||||
m_temp.Add(info); //记录需要被移除的手柄
|
||||
|
||||
var devices = Input.GetJoystickNames();
|
||||
for (int i = 0; i < devices.Length; i++)
|
||||
{
|
||||
var info = new GamePadInfo { Index = i, Name = devices[i] };
|
||||
m_temp.Remove(info);
|
||||
|
||||
if (!m_gamePads.ContainsKey(info))
|
||||
{
|
||||
m_gamePads[info] = new GamePad(info);
|
||||
OnGamePadConnected?.Invoke(m_gamePads[info]);
|
||||
};
|
||||
}
|
||||
|
||||
foreach (var info in m_temp)
|
||||
{
|
||||
if (m_gamePads.TryGetValue(info, out GamePad gp))
|
||||
{
|
||||
m_gamePads.Remove(info);
|
||||
gp.Offline = true;
|
||||
OnGamePadDisConnected?.Invoke(gp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// 获取所有已连接的手柄,返回的结果顺序与手柄序号无关
|
||||
/// </summary>
|
||||
/// <returns></returns>
|
||||
public GamePad[] GetGamePads()
|
||||
{
|
||||
return m_gamePads.Values.ToArray();
|
||||
}
|
||||
|
||||
internal struct GamePadInfo : IEquatable<GamePadInfo>, IComparable<GamePadInfo>
|
||||
{
|
||||
internal int Index;
|
||||
internal string Name;
|
||||
|
||||
public override bool Equals(object obj)
|
||||
{
|
||||
if (obj is GamePadInfo)
|
||||
{
|
||||
return Equals((GamePadInfo)obj);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
public bool Equals(GamePadInfo other)
|
||||
{
|
||||
return Index == other.Index && Name == other.Name;
|
||||
}
|
||||
|
||||
public override int GetHashCode()
|
||||
{
|
||||
// Custom hash code implementation without HashCombine
|
||||
int hash = 17;
|
||||
hash = hash * 31 + Index.GetHashCode();
|
||||
hash = hash * 31 + (Name != null ? Name.GetHashCode() : 0);
|
||||
return hash;
|
||||
}
|
||||
|
||||
public int CompareTo(GamePadInfo other)
|
||||
{
|
||||
int indexComparison = Index.CompareTo(other.Index);
|
||||
if (indexComparison != 0)
|
||||
{
|
||||
return indexComparison;
|
||||
}
|
||||
return string.Compare(Name, other.Name, StringComparison.Ordinal);
|
||||
}
|
||||
|
||||
public static bool operator ==(GamePadInfo left, GamePadInfo right)
|
||||
{
|
||||
return left.Equals(right);
|
||||
}
|
||||
|
||||
public static bool operator !=(GamePadInfo left, GamePadInfo right)
|
||||
{
|
||||
return !(left == right);
|
||||
}
|
||||
|
||||
public static bool operator <(GamePadInfo left, GamePadInfo right)
|
||||
{
|
||||
return left.CompareTo(right) < 0;
|
||||
}
|
||||
|
||||
public static bool operator >(GamePadInfo left, GamePadInfo right)
|
||||
{
|
||||
return left.CompareTo(right) > 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: ce4d215abea527e4a8cf1103cbfecf6b
|
@ -21,8 +21,8 @@ namespace AxibugEmuOnline.Client
|
||||
/// <summary> 指示该Rom文件的存放路径 </summary>
|
||||
public string LocalFilePath =>
|
||||
IsUserRom ?
|
||||
$"{App.PersistentDataPath}/UserRoms/{Platform}/{FileName}" :
|
||||
$"{App.PersistentDataPath}/RemoteRoms/{Platform}/{FileName}";
|
||||
$"{App.PersistentDataPath(Platform)}/UserRoms/{FileName}" :
|
||||
$"{App.PersistentDataPath(Platform)}/RemoteRoms/{FileName}";
|
||||
|
||||
/// <summary> 指示该Rom文件是否已下载完毕 </summary>
|
||||
public bool RomReady => hasLocalFile;
|
||||
|
@ -43,6 +43,8 @@ namespace AxibugEmuOnline.Client
|
||||
|
||||
private void OnRomStarStateChanged(int romID, bool star)
|
||||
{
|
||||
if (nesRomFetchList == null) return;
|
||||
|
||||
var targetRom = nesRomFetchList.FirstOrDefault(rom => rom.ID == romID);
|
||||
if (targetRom == null) return;
|
||||
|
||||
@ -59,7 +61,7 @@ namespace AxibugEmuOnline.Client
|
||||
/// <summary> 清除所有下载的Rom文件 </summary>
|
||||
public void ClearRomFile()
|
||||
{
|
||||
var path = $"{App.PersistentDataPath}/RemoteRoms/{m_platform}";
|
||||
var path = $"{App.PersistentDataPath(m_platform)}/RemoteRoms";
|
||||
if (Directory.Exists(path)) Directory.Delete(path, true);
|
||||
}
|
||||
|
||||
|
@ -48,7 +48,7 @@ namespace AxibugEmuOnline.Client
|
||||
|
||||
public void SaveSRAMToFile(byte[] sramContent, string romName)
|
||||
{
|
||||
string sramDirectoryPath = $"{App.PersistentDataPath}/sav";
|
||||
string sramDirectoryPath = $"{App.PersistentDataPath(AxibugProtobuf.RomPlatformType.Nes)}/{Config.path.szSavePath}";
|
||||
Directory.CreateDirectory(sramDirectoryPath);
|
||||
romName = Path.GetFileNameWithoutExtension(romName);
|
||||
File.WriteAllBytes($"{sramDirectoryPath}/{romName}.sav", sramContent);
|
||||
@ -56,7 +56,7 @@ namespace AxibugEmuOnline.Client
|
||||
|
||||
public void SaveDISKToFile(byte[] diskFileContent, string romName)
|
||||
{
|
||||
string diskFileDirectoryPath = $"{App.PersistentDataPath}/dsv";
|
||||
string diskFileDirectoryPath = $"{App.PersistentDataPath(AxibugProtobuf.RomPlatformType.Nes)}/dsv";
|
||||
Directory.CreateDirectory(diskFileDirectoryPath);
|
||||
romName = Path.GetFileNameWithoutExtension(romName);
|
||||
File.WriteAllBytes($"{diskFileDirectoryPath}/{romName}.dsv", diskFileContent);
|
||||
@ -65,14 +65,14 @@ namespace AxibugEmuOnline.Client
|
||||
public EmulatorConfig Config { get; private set; } = new EmulatorConfig();
|
||||
public void PrepareDirectory(string directPath)
|
||||
{
|
||||
Directory.CreateDirectory($"{App.PersistentDataPath}/{directPath}");
|
||||
Directory.CreateDirectory($"{App.PersistentDataPath(AxibugProtobuf.RomPlatformType.Nes)}/{directPath}");
|
||||
}
|
||||
|
||||
public void SaveFile(byte[] fileData, string directPath, string fileName)
|
||||
{
|
||||
PrepareDirectory(directPath);
|
||||
|
||||
var fileFullpath = $"{App.PersistentDataPath}/{directPath}/{fileName}";
|
||||
var fileFullpath = $"{App.PersistentDataPath(AxibugProtobuf.RomPlatformType.Nes)}/{directPath}/{fileName}";
|
||||
File.WriteAllBytes(fileFullpath, fileData);
|
||||
}
|
||||
|
||||
@ -80,7 +80,8 @@ namespace AxibugEmuOnline.Client
|
||||
{
|
||||
try
|
||||
{
|
||||
var data = File.ReadAllBytes($"{App.PersistentDataPath}/{directPath}/{fileName}");
|
||||
var path = $"{App.PersistentDataPath(AxibugProtobuf.RomPlatformType.Nes)}/{directPath}/{fileName}";
|
||||
var data = File.ReadAllBytes(path);
|
||||
if (data == null) return null;
|
||||
return new MemoryStream(data);
|
||||
}
|
||||
@ -88,7 +89,6 @@ namespace AxibugEmuOnline.Client
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
public bool TryGetMapperNo(ROM rom, out int mapperNo)
|
||||
|
@ -5,7 +5,6 @@ using System.Diagnostics;
|
||||
using System.Globalization;
|
||||
using System.IO;
|
||||
using System.Xml.Linq;
|
||||
using UnityEditor;
|
||||
using UnityEngine;
|
||||
using VirtualNes.Core;
|
||||
using VirtualNes.Core.Debug;
|
||||
@ -181,6 +180,17 @@ namespace AxibugEmuOnline.Client
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
public IControllerSetuper GetControllerSetuper()
|
||||
{
|
||||
return ControllerMapper;
|
||||
}
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
StopGame();
|
||||
}
|
||||
|
||||
#if UNITY_EDITOR
|
||||
/// <summary>
|
||||
/// 编辑器用
|
||||
@ -207,15 +217,9 @@ namespace AxibugEmuOnline.Client
|
||||
db.AddInfo(new RomDB.RomInfo { CRC = crc, Mapper = mapper });
|
||||
}
|
||||
|
||||
EditorUtility.SetDirty(db);
|
||||
AssetDatabase.SaveAssets();
|
||||
UnityEditor.EditorUtility.SetDirty(db);
|
||||
UnityEditor.AssetDatabase.SaveAssets();
|
||||
}
|
||||
#endif
|
||||
public IControllerSetuper GetControllerSetuper()
|
||||
{
|
||||
return ControllerMapper;
|
||||
}
|
||||
|
||||
public void Dispose() { }
|
||||
}
|
||||
}
|
@ -153,7 +153,7 @@ namespace AxibugEmuOnline.Client
|
||||
private FilterEffect.EditableParamerter m_param;
|
||||
private FilterPreset m_preset;
|
||||
|
||||
public override bool Visible => m_param.ValueType.IsEnum || m_param.ValueType == typeof(float);
|
||||
public override bool Visible => true;
|
||||
|
||||
public override string Name => m_param.Name;
|
||||
public Opt_ParamEditor(Filter filter, FilterEffect.EditableParamerter editParam, FilterPreset preset)
|
||||
|
@ -139,6 +139,7 @@ namespace AxibugEmuOnline.Client
|
||||
{
|
||||
DownloadingFlag.SetActiveEx(false);
|
||||
FileReadyFlag.SetActiveEx(false);
|
||||
Star.SetActiveEx(IsStar);
|
||||
|
||||
if (m_romfile == null) return;
|
||||
if (!m_romfile.InfoReady) return;
|
||||
|
@ -8,6 +8,10 @@ namespace AxibugEmuOnline.Client
|
||||
[SerializeField]
|
||||
OptionUI_ValueEditItem_FloatEdit com_floatEdit;
|
||||
[SerializeField]
|
||||
OptionUI_ValueEditItem_IntEdit com_intEdit;
|
||||
[SerializeField]
|
||||
OptionUI_ValueEditItem_BoolEdit com_boolEdit;
|
||||
[SerializeField]
|
||||
OptionUI_ValueEditItem_EnumEdit com_enumEdit;
|
||||
|
||||
IValueEditControl m_currentCom;
|
||||
@ -15,6 +19,8 @@ namespace AxibugEmuOnline.Client
|
||||
protected override void OnSetData(OptionMenu menuData)
|
||||
{
|
||||
com_floatEdit.gameObject.SetActive(false);
|
||||
com_intEdit.gameObject.SetActive(false);
|
||||
com_boolEdit.gameObject.SetActive(false);
|
||||
com_enumEdit.gameObject.SetActive(false);
|
||||
|
||||
if (menuData is ValueSetMenu)
|
||||
@ -24,13 +30,21 @@ namespace AxibugEmuOnline.Client
|
||||
{
|
||||
m_currentCom = com_floatEdit;
|
||||
}
|
||||
else if(valueMenu.ValueType == typeof(int))
|
||||
{
|
||||
m_currentCom = com_intEdit;
|
||||
}
|
||||
else if(valueMenu.ValueType == typeof(bool))
|
||||
{
|
||||
m_currentCom = com_boolEdit;
|
||||
}
|
||||
else if (valueMenu.ValueType.IsEnum)
|
||||
{
|
||||
m_currentCom = com_enumEdit;
|
||||
}
|
||||
else
|
||||
{
|
||||
App.log.Warning($"尚未支持的数据类型:{valueMenu.ValueType}");
|
||||
App.log.Error($"尚未支持的数据类型:{valueMenu.ValueType}");
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -0,0 +1,39 @@
|
||||
using System;
|
||||
using System.Collections.Generic;
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace AxibugEmuOnline.Client
|
||||
{
|
||||
public class OptionUI_ValueEditItem_BoolEdit : MonoBehaviour, IValueEditControl
|
||||
{
|
||||
[SerializeField]
|
||||
Text txt_value;
|
||||
|
||||
private ValueSetMenu m_valueMenu;
|
||||
|
||||
public void SetData(ValueSetMenu valueMenu)
|
||||
{
|
||||
m_valueMenu = valueMenu;
|
||||
txt_value.text = valueMenu.ValueRaw.ToString();
|
||||
}
|
||||
|
||||
public void OnLeft()
|
||||
{
|
||||
OnExecute();
|
||||
}
|
||||
|
||||
public void OnRight()
|
||||
{
|
||||
OnExecute();
|
||||
}
|
||||
|
||||
public void OnExecute()
|
||||
{
|
||||
var value = (bool)m_valueMenu.ValueRaw;
|
||||
value = !value;
|
||||
txt_value.text = value.ToString();
|
||||
m_valueMenu.OnValueChanged(value);
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: c864ef7d3920dfc4cb69a86ef3af426b
|
@ -0,0 +1,58 @@
|
||||
using UnityEngine;
|
||||
using UnityEngine.UI;
|
||||
|
||||
namespace AxibugEmuOnline.Client
|
||||
{
|
||||
public class OptionUI_ValueEditItem_IntEdit : MonoBehaviour, IValueEditControl
|
||||
{
|
||||
[SerializeField]
|
||||
Slider slider;
|
||||
[SerializeField]
|
||||
Text txt_value;
|
||||
|
||||
int m_step;
|
||||
private ValueSetMenu m_valueMenu;
|
||||
|
||||
private void Awake()
|
||||
{
|
||||
slider.onValueChanged.AddListener(OnSliderValueChanged);
|
||||
}
|
||||
|
||||
private void OnSliderValueChanged(float value)
|
||||
{
|
||||
int intValue = (int)value;
|
||||
txt_value.text = $"{intValue}";
|
||||
|
||||
if (!m_dataSetting) m_valueMenu.OnValueChanged(intValue);
|
||||
}
|
||||
|
||||
bool m_dataSetting;
|
||||
public void SetData(ValueSetMenu valueMenu)
|
||||
{
|
||||
m_dataSetting = true;
|
||||
m_valueMenu = valueMenu;
|
||||
slider.minValue = (int)valueMenu.Min;
|
||||
slider.maxValue = (int)valueMenu.Max;
|
||||
slider.value = (int)valueMenu.ValueRaw;
|
||||
slider.wholeNumbers = true;
|
||||
m_step = 1;
|
||||
m_dataSetting = false;
|
||||
}
|
||||
|
||||
public void OnLeft()
|
||||
{
|
||||
var newValue = Mathf.Clamp(slider.value - m_step, slider.minValue, slider.maxValue);
|
||||
slider.value = newValue;
|
||||
}
|
||||
|
||||
public void OnRight()
|
||||
{
|
||||
var newValue = Mathf.Clamp(slider.value + m_step, slider.minValue, slider.maxValue);
|
||||
slider.value = newValue;
|
||||
}
|
||||
|
||||
public void OnExecute()
|
||||
{
|
||||
}
|
||||
}
|
||||
}
|
@ -0,0 +1,2 @@
|
||||
fileFormatVersion: 2
|
||||
guid: abad743de1574354f99efc5054aa6b43
|
@ -319,6 +319,12 @@ namespace VirtualNes.Core
|
||||
return false;
|
||||
}
|
||||
|
||||
internal void QueueClear()
|
||||
{
|
||||
queue.Clear();
|
||||
exqueue.Clear();
|
||||
}
|
||||
|
||||
private void QueueFlush()
|
||||
{
|
||||
while (queue.wrptr != queue.rdptr)
|
||||
@ -651,5 +657,11 @@ namespace VirtualNes.Core
|
||||
public int rdptr;
|
||||
public int wrptr;
|
||||
public QUEUEDATA[] data = new QUEUEDATA[8192];
|
||||
|
||||
public void Clear()
|
||||
{
|
||||
rdptr = 0;wrptr = 0;
|
||||
data = new QUEUEDATA[8192];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -355,6 +355,7 @@ namespace VirtualNes.Core
|
||||
private void LoadDISK()
|
||||
{
|
||||
//todo : 磁碟机读取支持
|
||||
Debuger.LogError($"磁碟机尚未支持");
|
||||
}
|
||||
|
||||
private void LoadSRAM()
|
||||
@ -1070,6 +1071,10 @@ namespace VirtualNes.Core
|
||||
|
||||
public void Dispose()
|
||||
{
|
||||
SaveSRAM();
|
||||
SaveDISK();
|
||||
SaveTurboFile();
|
||||
|
||||
cpu?.Dispose();
|
||||
ppu?.Dispose();
|
||||
apu?.Dispose();
|
||||
@ -1081,7 +1086,7 @@ namespace VirtualNes.Core
|
||||
{
|
||||
int i;
|
||||
if (rom.IsNSF()) return;
|
||||
if (rom.IsSAVERAM()) return;
|
||||
if (!rom.IsSAVERAM()) return;
|
||||
|
||||
for (i = 0; i < SAVERAM_SIZE; i++)
|
||||
{
|
||||
@ -1841,10 +1846,11 @@ namespace VirtualNes.Core
|
||||
);
|
||||
|
||||
|
||||
cpu.SetDmaCycles(state.reg.cpureg.DMA_cycles);
|
||||
emul_cycles = state.reg.cpureg.emul_cycles;
|
||||
base_cycles = state.reg.cpureg.base_cycles;
|
||||
|
||||
cpu.SetDmaCycles(state.reg.cpureg.DMA_cycles);
|
||||
|
||||
// LOAD PPU STATE
|
||||
MMU.PPUREG[0] = state.reg.ppureg.reg0;
|
||||
MMU.PPUREG[1] = state.reg.ppureg.reg1;
|
||||
@ -1857,6 +1863,8 @@ namespace VirtualNes.Core
|
||||
MMU.PPU56Toggle = state.reg.ppureg.toggle56;
|
||||
}
|
||||
|
||||
apu.QueueClear();
|
||||
|
||||
//RAM STATE
|
||||
{
|
||||
// SAVE RAM STATE
|
||||
|
@ -244,11 +244,11 @@ namespace VirtualNes.Core
|
||||
|
||||
FileNameCheck(fname);
|
||||
|
||||
if (Supporter.S.TryGetMapperNo(this, out int mapperNo))
|
||||
{
|
||||
Debuger.Log($"ROMDB Set Mapper #{mapper:000} to #{mapperNo:000}");
|
||||
mapper = mapperNo;
|
||||
}
|
||||
//if (Supporter.S.TryGetMapperNo(this, out int mapperNo))
|
||||
//{
|
||||
// Debuger.Log($"ROMDB Set Mapper #{mapper:000} to #{mapperNo:000}");
|
||||
// mapper = mapperNo;
|
||||
//}
|
||||
|
||||
RomPatch.DoPatch(ref crc, ref lpPRG, ref lpCHR, ref mapper, ref header);
|
||||
|
||||
|
@ -12,7 +12,7 @@
|
||||
public bool bIpsPath = true;
|
||||
|
||||
public string szRomPath = "roms";
|
||||
public string szSavePath = "save";
|
||||
public string szSavePath = "sav";
|
||||
public string szStatePath = "state";
|
||||
public string szSnapshotPath = "snapshot";
|
||||
public string szMoviePath = "movie";
|
||||
|
@ -12,7 +12,7 @@ PlayerSettings:
|
||||
targetDevice: 2
|
||||
useOnDemandResources: 0
|
||||
accelerometerFrequency: 60
|
||||
companyName: DefaultCompany
|
||||
companyName: AlienTechnology
|
||||
productName: AxibugEmuOnline.Client
|
||||
defaultCursor: {fileID: 0}
|
||||
cursorHotspot: {x: 0, y: 0}
|
||||
@ -164,7 +164,7 @@ PlayerSettings:
|
||||
androidMinAspectRatio: 1
|
||||
applicationIdentifier:
|
||||
Android: com.DefaultCompany.AxibugEmuOnline.Client
|
||||
Standalone: com.DefaultCompany.AxibugEmuOnline.Client
|
||||
Standalone: com.AlienTechnology.AxibugEmuOnline.Client
|
||||
buildNumber:
|
||||
Standalone: 0
|
||||
VisionOS: 0
|
||||
|
Loading…
Reference in New Issue
Block a user