AxibugEmuOnline/AxibugEmuOnline.Client/Assets/Runtime/Renderer/UnityRenderer.cs
2024-06-28 18:08:25 +08:00

72 lines
2.1 KiB
C#

using System.Runtime.InteropServices;
using UnityEngine;
namespace AxibugEmuOnline.Client.UNES.Renderer
{
public class UnityRenderer : IRenderer
{
public UNESBehaviour UnesBehaviour;
public RenderTexture RenderTexture;
public string Name => "Unity";
private Texture2D _drawTexture;
private Color[] _pixelCache;
private Texture2D _clearTexture;
public void Init(UNESBehaviour nes)
{
UnesBehaviour = nes;
RenderTexture = nes.RenderTexture;
_drawTexture = new Texture2D(UNESBehaviour.GameWidth, UNESBehaviour.GameHeight);
_pixelCache = new Color[UNESBehaviour.GameWidth * UNESBehaviour.GameHeight];
_clearTexture = new Texture2D(1, 1);
_clearTexture.SetPixel(0, 0, Color.clear);
_clearTexture.Apply();
}
public void HandleRender()
{
if (RenderTexture.filterMode != UnesBehaviour.FilterMode)
{
RenderTexture.filterMode = UnesBehaviour.FilterMode;
}
for (var y = 0; y < UNESBehaviour.GameHeight; y++)
{
for (var x = 0; x < UNESBehaviour.GameWidth; x++)
{
var rawIndex = UNESBehaviour.GameWidth * y + x;
var color = GetColor(UnesBehaviour.RawBitmap[rawIndex]);
var texIndex = UNESBehaviour.GameWidth * (UNESBehaviour.GameHeight - y - 1) + x;
_pixelCache[texIndex] = color;
}
}
_drawTexture.SetPixels(_pixelCache);
_drawTexture.Apply();
Graphics.Blit(_drawTexture, RenderTexture);
}
public Color GetColor(uint value)
{
var r = 0xFF0000 & value;
r >>= 16;
var b = 0xFF & value;
var g = 0xFF00 & value;
g >>= 8;
var color = new Color(r / 255f, g / 255f, b / 255f);
return color;
}
public void End()
{
Graphics.Blit(_clearTexture, RenderTexture);
}
}
}