summary refs log tree commit diff
path: root/src/Window_N64.c
diff options
context:
space:
mode:
authorWlodekM <[email protected]>2024-06-16 10:35:45 +0300
committerWlodekM <[email protected]>2024-06-16 10:35:45 +0300
commitabef6da56913f1c55528103e60a50451a39628b1 (patch)
treeb3c8092471ecbb73e568cd0d336efa0e7871ee8d /src/Window_N64.c
initial commit
Diffstat (limited to 'src/Window_N64.c')
-rw-r--r--src/Window_N64.c197
1 files changed, 197 insertions, 0 deletions
diff --git a/src/Window_N64.c b/src/Window_N64.c
new file mode 100644
index 0000000..1034d34
--- /dev/null
+++ b/src/Window_N64.c
@@ -0,0 +1,197 @@
+#include "Core.h"
+#if defined CC_BUILD_N64
+#include "Window.h"
+#include "Platform.h"
+#include "Input.h"
+#include "Event.h"
+#include "Graphics.h"
+#include "String.h"
+#include "Funcs.h"
+#include "Bitmap.h"
+#include "Errors.h"
+#include "ExtMath.h"
+#include <libdragon.h>
+
+static cc_bool launcherMode;
+
+struct _DisplayData DisplayInfo;
+struct _WindowData WindowInfo;
+
+void Window_PreInit(void) {
+    display_init(RESOLUTION_320x240, DEPTH_32_BPP, 2, GAMMA_NONE, FILTERS_DISABLED);
+    //display_init(RESOLUTION_320x240, DEPTH_16_BPP, 3, GAMMA_NONE, ANTIALIAS_RESAMPLE_FETCH_ALWAYS);    
+}
+
+void Window_Init(void) {
+	DisplayInfo.Width  = display_get_width();
+	DisplayInfo.Height = display_get_height();
+	DisplayInfo.ScaleX = 0.5f;
+	DisplayInfo.ScaleY = 0.5f;
+	
+	Window_Main.Width   = DisplayInfo.Width;
+	Window_Main.Height  = DisplayInfo.Height;
+	Window_Main.Focused = true;
+	Window_Main.Exists  = true;
+
+	Input.Sources = INPUT_SOURCE_GAMEPAD;
+	DisplayInfo.ContentOffsetX = 10;
+	DisplayInfo.ContentOffsetY = 10;
+	joypad_init();
+
+	// change defaults to make more sense for N64
+	BindMapping* binds = (BindMapping*)PadBind_Defaults;
+	BindMapping_Set(&binds[BIND_JUMP],         CCPAD_A, 0);
+	BindMapping_Set(&binds[BIND_INVENTORY],    CCPAD_B, 0);
+	BindMapping_Set(&binds[BIND_PLACE_BLOCK],  CCPAD_Z, 0);
+	BindMapping_Set(&binds[BIND_HOTBAR_RIGHT], CCPAD_L, 0);
+	BindMapping_Set(&binds[BIND_DELETE_BLOCK], CCPAD_R, 0);
+
+	BindMapping_Set(&binds[BIND_FORWARD], CCPAD_CUP,    0);
+	BindMapping_Set(&binds[BIND_BACK],    CCPAD_CDOWN,  0);
+	BindMapping_Set(&binds[BIND_LEFT],    CCPAD_CLEFT,  0);
+	BindMapping_Set(&binds[BIND_RIGHT],   CCPAD_CRIGHT, 0);
+
+	BindMapping_Set(&binds[BIND_FLY_UP],   CCPAD_UP,    0);
+	BindMapping_Set(&binds[BIND_FLY_DOWN], CCPAD_DOWN,  0);
+	BindMapping_Set(&binds[BIND_SPEED],    CCPAD_LEFT,  0);
+	BindMapping_Set(&binds[BIND_FLY],      CCPAD_RIGHT, 0);
+}
+
+void Window_Free(void) { }
+
+void Window_Create2D(int width, int height) { launcherMode = true;  }
+void Window_Create3D(int width, int height) { launcherMode = false; }
+
+void Window_SetTitle(const cc_string* title) { }
+void Clipboard_GetText(cc_string* value) { }
+void Clipboard_SetText(const cc_string* value) { }
+
+int Window_GetWindowState(void) { return WINDOW_STATE_FULLSCREEN; }
+cc_result Window_EnterFullscreen(void) { return 0; }
+cc_result Window_ExitFullscreen(void)  { return 0; }
+int Window_IsObscured(void)            { return 0; }
+
+void Window_Show(void) { }
+void Window_SetSize(int width, int height) { }
+
+void Window_RequestClose(void) {
+	Event_RaiseVoid(&WindowEvents.Closing);
+}
+
+
+/*########################################################################################################################*
+*----------------------------------------------------Input processing-----------------------------------------------------*
+*#########################################################################################################################*/
+void Window_ProcessEvents(float delta) {
+	joypad_poll();
+}
+
+void Cursor_SetPosition(int x, int y) { } // Makes no sense for PSP
+void Window_EnableRawMouse(void)  { Input.RawMode = true;  }
+void Window_DisableRawMouse(void) { Input.RawMode = false; }
+void Window_UpdateRawMouse(void)  { }
+
+
+/*########################################################################################################################*
+*-------------------------------------------------------Gamepads----------------------------------------------------------*
+*#########################################################################################################################*/
+static void HandleButtons(int port, joypad_buttons_t btns) {
+	Gamepad_SetButton(port, CCPAD_L, btns.l);
+	Gamepad_SetButton(port, CCPAD_R, btns.r);
+	
+	Gamepad_SetButton(port, CCPAD_A, btns.a);
+	Gamepad_SetButton(port, CCPAD_B, btns.b);
+	Gamepad_SetButton(port, CCPAD_Z, btns.z);
+	
+	Gamepad_SetButton(port, CCPAD_START,  btns.start);
+	
+	Gamepad_SetButton(port, CCPAD_LEFT,   btns.d_left);
+	Gamepad_SetButton(port, CCPAD_RIGHT,  btns.d_right);
+	Gamepad_SetButton(port, CCPAD_UP,     btns.d_up);
+	Gamepad_SetButton(port, CCPAD_DOWN,   btns.d_down);
+
+	Gamepad_SetButton(port, CCPAD_CLEFT,  btns.c_left);
+	Gamepad_SetButton(port, CCPAD_CRIGHT, btns.c_right);
+	Gamepad_SetButton(port, CCPAD_CUP,    btns.c_up);
+	Gamepad_SetButton(port, CCPAD_CDOWN,  btns.c_down);
+}
+
+#define AXIS_SCALE 8.0f
+static void ProcessAnalogInput(int port, joypad_inputs_t* inputs, float delta) {
+	int x = inputs->stick_x;
+	int y = inputs->stick_y;
+
+	if (Math_AbsI(x) <= 8) x = 0;
+	if (Math_AbsI(y) <= 8) y = 0;
+	
+	Gamepad_SetAxis(port, PAD_AXIS_RIGHT, x / AXIS_SCALE, -y / AXIS_SCALE, delta);
+}
+
+void Window_ProcessGamepads(float delta) {
+	for (int port = 0; port < INPUT_MAX_GAMEPADS; port++)
+	{
+		if (!joypad_is_connected(port)) continue;
+		
+		joypad_inputs_t inputs = joypad_get_inputs(port);
+		HandleButtons(port, inputs.btn);
+		ProcessAnalogInput(port, &inputs, delta);
+	}
+}
+
+
+/*########################################################################################################################*
+*------------------------------------------------------Framebuffer--------------------------------------------------------*
+*#########################################################################################################################*/
+void Window_AllocFramebuffer(struct Bitmap* bmp, int width, int height) {
+	bmp->scan0  = (BitmapCol*)Mem_Alloc(width * height, 4, "window pixels");
+	bmp->width  = width;
+	bmp->height = height;
+}
+
+void Window_DrawFramebuffer(Rect2D r, struct Bitmap* bmp) {
+	surface_t* fb  = display_get();
+	cc_uint32* src = (cc_uint32*)bmp->scan0;
+	cc_uint8*  dst = (cc_uint8*)fb->buffer;
+
+	for (int y = 0; y < bmp->height; y++) 
+	{
+		Mem_Copy(dst + y * fb->stride,
+				 src + y * bmp->width, 
+				 bmp->width * 4);
+	}
+	
+    display_show(fb);
+}
+
+void Window_FreeFramebuffer(struct Bitmap* bmp) {
+	Mem_Free(bmp->scan0);
+}
+
+
+/*########################################################################################################################*
+*------------------------------------------------------Soft keyboard------------------------------------------------------*
+*#########################################################################################################################*/
+void OnscreenKeyboard_Open(struct OpenKeyboardArgs* args) { /* TODO implement */ }
+void OnscreenKeyboard_SetText(const cc_string* text) { }
+void OnscreenKeyboard_Draw2D(Rect2D* r, struct Bitmap* bmp) { }
+void OnscreenKeyboard_Draw3D(void) { }
+void OnscreenKeyboard_Close(void) { /* TODO implement */ }
+
+
+/*########################################################################################################################*
+*-------------------------------------------------------Misc/Other--------------------------------------------------------*
+*#########################################################################################################################*/
+void Window_ShowDialog(const char* title, const char* msg) {
+	/* TODO implement */
+	Platform_LogConst(title);
+	Platform_LogConst(msg);
+}
+
+cc_result Window_OpenFileDialog(const struct OpenFileDialogArgs* args) {
+	return ERR_NOT_SUPPORTED;
+}
+
+cc_result Window_SaveFileDialog(const struct SaveFileDialogArgs* args) {
+	return ERR_NOT_SUPPORTED;
+}
+#endif