GBA.Unity/Assets/emulator/VideoProvider.cs
2024-08-16 14:51:15 +08:00

90 lines
2.9 KiB
C#

using OptimeGBA;
using System;
using System.Runtime.InteropServices;
using UnityEngine;
using UnityEngine.UI;
public class VideoProvider : MonoBehaviour
{
public RawImage m_drawCanvas;
private RectTransform m_drawCanvasrect;
private IntPtr wrapTexBufferPointer;
private Texture2D wrapTex;
private int TexBufferSize;
uint[] wrapTexBuffer = new uint[240 * 160];
Color32[] DisplayColorBuffer = new Color32[240 * 160];
public void OnRenderFrame()
{
if (wrapTex == null)
{
wrapTex = new Texture2D(240, 160, TextureFormat.RGBA32, false);
wrapTex.filterMode = FilterMode.Point;
//wrapTexBuffer = screenData;
// 固定数组,防止垃圾回收器移动它
GCHandle handle = GCHandle.Alloc(wrapTexBuffer, GCHandleType.Pinned);
// 获取数组的指针
wrapTexBufferPointer = handle.AddrOfPinnedObject();
m_drawCanvas.texture = wrapTex;
TexBufferSize = wrapTexBuffer.Length * 4;
m_drawCanvasrect = m_drawCanvas.GetComponent<RectTransform>();
float targetWidth = ((float)240 / 160) * m_drawCanvasrect.rect.height;
m_drawCanvasrect.SetSizeWithCurrentAnchors(RectTransform.Axis.Horizontal, targetWidth);
}
DrawDisplay();
}
public void DrawDisplay()
{
var buf = Emulator.instance.ShowBackBuf ? Emulator.instance.gba.Ppu.Renderer.ScreenBack : Emulator.instance.gba.Ppu.Renderer.ScreenFront;
unsafe
{
for (uint i = 0; i < 240 * 160; i++)
{
wrapTexBuffer[i] = PpuRenderer.ColorLutCorrected[buf[i] & 0x7FFF];
fixed (uint* p = &wrapTexBuffer[i])
{
byte* bp = (byte*)p;
DisplayColorBuffer[i] = new Color32(*(bp++), *(bp++), *(bp++), *(bp++));
}
}
}
//wrapTex.LoadRawTextureData(wrapTexBufferPointer, TexBufferSize);
wrapTex.SetPixels32(DisplayColorBuffer, 0);
wrapTex.Apply();
}
//public void SetDrawData(uint[] screenData, byte[] lineColorMode, int screenWidth, int screenHeight)
//{
// if (wrapTex == null)
// {
// //wrapTex = new Texture2D(272, 240, TextureFormat.BGRA32, false);
// wrapTex = new Texture2D(272, 240, TextureFormat.RGBA32, false);
// wrapTex.filterMode = FilterMode.Point;
// wrapTexBuffer = screenData;
// // 固定数组,防止垃圾回收器移动它
// GCHandle handle = GCHandle.Alloc(wrapTexBuffer, GCHandleType.Pinned);
// // 获取数组的指针
// wrapTexBufferPointer = handle.AddrOfPinnedObject();
// Image.texture = wrapTex;
// Image.material.SetTexture("_MainTex", wrapTex);
// TexBufferSize = wrapTexBuffer.Length * 4;
// }
// wrapTex.LoadRawTextureData(wrapTexBufferPointer, TexBufferSize);
// wrapTex.Apply();
//}
}