Files
DrawingSongHLE/Assets/Code/Framebuffer.cs
2020-12-05 19:34:02 -07:00

55 lines
1.6 KiB
C#

using System;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices;
using UnityEngine;
public class Framebuffer : MonoBehaviour
{
Texture2D texture;
ushort[] framebuffer;
byte[] frameBufferSubmit;
public SpriteRenderer spriteRenderer;
// Start is called before the first frame update
void Start()
{
texture = new Texture2D(Config.FRAMEBUFFER_WIDTH, Config.FRAMEBUFFER_HEIGHT, TextureFormat.RGB565, false);
texture.filterMode = FilterMode.Point;
framebuffer = new ushort[Config.FRAMEBUFFER_WIDTH * Config.FRAMEBUFFER_HEIGHT];
frameBufferSubmit = new byte[framebuffer.Length * 2];
var sprite = Sprite.Create(texture, new Rect(0, 0, Config.FRAMEBUFFER_WIDTH, Config.FRAMEBUFFER_HEIGHT),
new Vector2(0.5f, 0.5f), 100);
spriteRenderer.sprite = sprite;
}
// Update is called once per frame
void Update()
{
}
public void FrameUpdate()
{
Buffer.BlockCopy(framebuffer, 0, frameBufferSubmit, 0, frameBufferSubmit.Length);
texture.LoadRawTextureData(frameBufferSubmit);
texture.Apply();
// Clear framebuffer after uploading
for (int i = 0; i < framebuffer.Length; ++i)
framebuffer[i] = 0;
}
public void SetPixel(int x, int y, ushort color)
{
y = Config.FRAMEBUFFER_HEIGHT - 1 - y;
framebuffer[y * Config.FRAMEBUFFER_WIDTH + x] = color;
}
public ushort GetPixel(int x, int y)
{
y = Config.FRAMEBUFFER_HEIGHT - 1 - y;
return framebuffer[y * Config.FRAMEBUFFER_WIDTH + x];
}
}