mirror of
https://github.com/BluestormDNA/ProjectPSX.git
synced 2025-04-02 10:52:34 -04:00
140 lines
5.1 KiB
C#
140 lines
5.1 KiB
C#
using OpenToolkit.Windowing.Common;
|
|
using OpenToolkit.Windowing.Desktop;
|
|
using OpenToolkit.Graphics.OpenGL;
|
|
using System.Collections.Generic;
|
|
using OpenToolkit.Windowing.Common.Input;
|
|
using ProjectPSX.Devices.Input;
|
|
using System;
|
|
|
|
namespace ProjectPSX.OpenTK {
|
|
public class Window : GameWindow, IHostWindow {
|
|
|
|
private ProjectPSX psx;
|
|
private int[] displayBuffer;
|
|
private Dictionary<Key, GamepadInputsEnum> _gamepadKeyMap;
|
|
private AudioPlayer audioPlayer = new AudioPlayer();
|
|
private int vSyncCounter;
|
|
|
|
public Window(GameWindowSettings gameWindowSettings, NativeWindowSettings nativeWindowSettings) : base(gameWindowSettings, nativeWindowSettings) {
|
|
psx = new ProjectPSX(this, @"C:\Users\Wapens\source\repos\ProjectPSX\ProjectPSX\bin\r4.bin");
|
|
psx.POWER_ON();
|
|
|
|
_gamepadKeyMap = new Dictionary<Key, GamepadInputsEnum>() {
|
|
{ Key.Space, GamepadInputsEnum.Space},
|
|
{ Key.Z , GamepadInputsEnum.Z },
|
|
{ Key.C , GamepadInputsEnum.C },
|
|
{ Key.Enter , GamepadInputsEnum.Enter },
|
|
{ Key.Up , GamepadInputsEnum.Up },
|
|
{ Key.Right , GamepadInputsEnum.Right },
|
|
{ Key.Down , GamepadInputsEnum.Down },
|
|
{ Key.Left , GamepadInputsEnum.Left },
|
|
{ Key.F1 , GamepadInputsEnum.D1 },
|
|
{ Key.F3 , GamepadInputsEnum.D3 },
|
|
{ Key.Q , GamepadInputsEnum.Q },
|
|
{ Key.E , GamepadInputsEnum.E },
|
|
{ Key.W , GamepadInputsEnum.W },
|
|
{ Key.D , GamepadInputsEnum.D },
|
|
{ Key.S , GamepadInputsEnum.S },
|
|
{ Key.A , GamepadInputsEnum.A },
|
|
};
|
|
}
|
|
|
|
protected override void OnLoad() {
|
|
GL.Enable(EnableCap.Blend);
|
|
GL.BlendFunc(BlendingFactor.SrcAlpha, BlendingFactor.OneMinusSrcAlpha);
|
|
GL.Enable(EnableCap.DepthTest);
|
|
GL.DepthFunc(DepthFunction.Lequal);
|
|
GL.Enable(EnableCap.Texture2D);
|
|
GL.ClearColor(1, 1, 1, 1);
|
|
}
|
|
|
|
protected override void OnRenderFrame(FrameEventArgs args) {
|
|
//Console.WriteLine(this.RenderFrequency);
|
|
GL.Clear(ClearBufferMask.ColorBufferBit | ClearBufferMask.DepthBufferBit);
|
|
|
|
int id = GL.GenTexture();
|
|
GL.BindTexture(TextureTarget.Texture2D, id);
|
|
|
|
GL.TexImage2D(TextureTarget.Texture2D, 0,
|
|
PixelInternalFormat.Rgb,
|
|
1024, 512, 0,
|
|
PixelFormat.Bgra,
|
|
PixelType.UnsignedByte,
|
|
displayBuffer);
|
|
|
|
GL.TexParameter(TextureTarget.Texture2D,
|
|
TextureParameterName.TextureMinFilter, (int)TextureMinFilter.Linear);
|
|
GL.TexParameter(TextureTarget.Texture2D,
|
|
TextureParameterName.TextureMagFilter, (int)TextureMagFilter.Nearest);
|
|
|
|
GL.Begin(PrimitiveType.Quads);
|
|
GL.TexCoord2(0, 1); GL.Vertex2(-1, -1);
|
|
GL.TexCoord2(1, 1); GL.Vertex2(1, -1);
|
|
GL.TexCoord2(1, 0); GL.Vertex2(1, 1);
|
|
GL.TexCoord2(0, 0); GL.Vertex2(-1, 1);
|
|
GL.End();
|
|
|
|
GL.DeleteTexture(id);
|
|
SwapBuffers();
|
|
//Console.WriteLine("painting");
|
|
}
|
|
|
|
protected override void OnUpdateFrame(FrameEventArgs args) {
|
|
base.OnUpdateFrame(args);
|
|
psx.RunFrame();
|
|
}
|
|
|
|
protected override void OnKeyDown(KeyboardKeyEventArgs e) {
|
|
GamepadInputsEnum? button = GetGamepadButton(e.Key);
|
|
if (button != null)
|
|
psx.JoyPadDown(button.Value);
|
|
}
|
|
|
|
protected override void OnKeyUp(KeyboardKeyEventArgs e) {
|
|
GamepadInputsEnum? button = GetGamepadButton(e.Key);
|
|
if (button != null)
|
|
psx.JoyPadUp(button.Value);
|
|
}
|
|
|
|
private GamepadInputsEnum? GetGamepadButton(Key keyCode) {
|
|
if (_gamepadKeyMap.TryGetValue(keyCode, out GamepadInputsEnum gamepadButtonValue))
|
|
return gamepadButtonValue;
|
|
return null;
|
|
}
|
|
|
|
public void Render(int[] vram) {
|
|
vSyncCounter++;
|
|
displayBuffer = vram;
|
|
}
|
|
|
|
public int GetVPS() {
|
|
int fps = vSyncCounter;
|
|
vSyncCounter = 0;
|
|
return fps;
|
|
}
|
|
|
|
public void SetWindowText(string newText) {
|
|
this.Title = newText;
|
|
}
|
|
|
|
public void SetDisplayMode(int horizontalRes, int verticalRes, bool is24BitDepth) {
|
|
//throw new System.NotImplementedException();
|
|
}
|
|
|
|
public void SetHorizontalRange(ushort displayX1, ushort displayX2) {
|
|
//throw new System.NotImplementedException();
|
|
}
|
|
|
|
public void SetVRAMStart(ushort displayVRAMXStart, ushort displayVRAMYStart) {
|
|
//throw new System.NotImplementedException();
|
|
}
|
|
|
|
public void SetVerticalRange(ushort displayY1, ushort displayY2) {
|
|
//throw new System.NotImplementedException();
|
|
}
|
|
|
|
public void Play(byte[] samples) {
|
|
audioPlayer.UpdateAudio(samples);
|
|
}
|
|
}
|
|
}
|