summaryrefslogtreecommitdiffhomepage
path: root/src/rcore_web.c
diff options
context:
space:
mode:
authorRay <[email protected]>2023-10-14 12:49:54 +0200
committerRay <[email protected]>2023-10-14 12:49:54 +0200
commitb34c2ecbcb9da1d438b70acf8125ef5424744d11 (patch)
tree09c56fbad54fa55c1686616b49d64116d6d61a38 /src/rcore_web.c
parent4521a142c35fe9fe1386d79ae783363c9c164827 (diff)
downloadraylib-b34c2ecbcb9da1d438b70acf8125ef5424744d11.tar.gz
raylib-b34c2ecbcb9da1d438b70acf8125ef5424744d11.zip
WARNING: REDESIGN: `InitPlatform()` to initialize all platform data #3313
`InitGraphicsDevice()` could be confusing because the function actually initialized many things: window, graphics, inputs, callbacks, timming, storage... restructured it.
Diffstat (limited to 'src/rcore_web.c')
-rw-r--r--src/rcore_web.c198
1 files changed, 88 insertions, 110 deletions
diff --git a/src/rcore_web.c b/src/rcore_web.c
index 277d1378..3b9373bb 100644
--- a/src/rcore_web.c
+++ b/src/rcore_web.c
@@ -87,17 +87,18 @@ static PlatformData platform = { 0 }; // Platform specific data
//----------------------------------------------------------------------------------
// Module Internal Functions Declaration
//----------------------------------------------------------------------------------
-static bool InitGraphicsDevice(int width, int height); // Initialize graphics device
+static int InitPlatform(void); // Initialize platform (graphics, inputs and more)
+static void ClosePlatform(void); // Close platform
// Error callback event
-static void ErrorCallback(int error, const char *description); // GLFW3 Error Callback, runs on GLFW3 error
+static void ErrorCallback(int error, const char *description); // GLFW3 Error Callback, runs on GLFW3 error
// Window callbacks events
-static void WindowSizeCallback(GLFWwindow *window, int width, int height); // GLFW3 WindowSize Callback, runs when window is resized
-static void WindowIconifyCallback(GLFWwindow *window, int iconified); // GLFW3 WindowIconify Callback, runs when window is minimized/restored
-static void WindowMaximizeCallback(GLFWwindow *window, int maximized); // GLFW3 Window Maximize Callback, runs when window is maximized
-static void WindowFocusCallback(GLFWwindow *window, int focused); // GLFW3 WindowFocus Callback, runs when window get/lose focus
-static void WindowDropCallback(GLFWwindow *window, int count, const char **paths); // GLFW3 Window Drop Callback, runs when drop files into window
+static void WindowSizeCallback(GLFWwindow *window, int width, int height); // GLFW3 WindowSize Callback, runs when window is resized
+static void WindowIconifyCallback(GLFWwindow *window, int iconified); // GLFW3 WindowIconify Callback, runs when window is minimized/restored
+static void WindowMaximizeCallback(GLFWwindow *window, int maximized); // GLFW3 Window Maximize Callback, runs when window is maximized
+static void WindowFocusCallback(GLFWwindow *window, int focused); // GLFW3 WindowFocus Callback, runs when window get/lose focus
+static void WindowDropCallback(GLFWwindow *window, int count, const char **paths); // GLFW3 Window Drop Callback, runs when drop files into window
// Input callbacks events
static void KeyCallback(GLFWwindow *window, int key, int scancode, int action, int mods); // GLFW3 Keyboard Callback, runs on key pressed
@@ -107,11 +108,12 @@ static void MouseCursorPosCallback(GLFWwindow *window, double x, double y);
static void MouseScrollCallback(GLFWwindow *window, double xoffset, double yoffset); // GLFW3 Srolling Callback, runs on mouse wheel
static void CursorEnterCallback(GLFWwindow *window, int enter); // GLFW3 Cursor Enter Callback, cursor enters client area
-// Emscripten callback events
+// Emscripten window callback events
static EM_BOOL EmscriptenFullscreenChangeCallback(int eventType, const EmscriptenFullscreenChangeEvent *event, void *userData);
static EM_BOOL EmscriptenWindowResizedCallback(int eventType, const EmscriptenUiEvent *event, void *userData);
static EM_BOOL EmscriptenResizeCallback(int eventType, const EmscriptenUiEvent *event, void *userData);
+// Emscripten input callback events
static EM_BOOL EmscriptenMouseCallback(int eventType, const EmscriptenMouseEvent *mouseEvent, void *userData);
static EM_BOOL EmscriptenTouchCallback(int eventType, const EmscriptenTouchEvent *touchEvent, void *userData);
static EM_BOOL EmscriptenGamepadCallback(int eventType, const EmscriptenGamepadEvent *gamepadEvent, void *userData);
@@ -160,67 +162,32 @@ void InitWindow(int width, int height, const char *title)
TRACELOG(LOG_INFO, " > raudio:.... not loaded (optional)");
#endif
- // NOTE: Keep internal pointer to input title string (no copy)
+ // Initialize window data
+ CORE.Window.screen.width = width;
+ CORE.Window.screen.height = height;
+ CORE.Window.eventWaiting = false;
+ CORE.Window.screenScale = MatrixIdentity(); // No draw scaling required by default
if ((title != NULL) && (title[0] != 0)) CORE.Window.title = title;
// Initialize global input state
- memset(&CORE.Input, 0, sizeof(CORE.Input));
+ memset(&CORE.Input, 0, sizeof(CORE.Input)); // Reset CORE.Input structure to 0
CORE.Input.Keyboard.exitKey = KEY_ESCAPE;
- CORE.Input.Mouse.scale = (Vector2){1.0f, 1.0f};
+ CORE.Input.Mouse.scale = (Vector2){ 1.0f, 1.0f };
CORE.Input.Mouse.cursor = MOUSE_CURSOR_ARROW;
- CORE.Input.Gamepad.lastButtonPressed = 0; // GAMEPAD_BUTTON_UNKNOWN
- CORE.Window.eventWaiting = false;
+ CORE.Input.Gamepad.lastButtonPressed = GAMEPAD_BUTTON_UNKNOWN;
-
- // Platform specific init window
- //--------------------------------------------------------------
- // Initialize graphics device (display device and OpenGL context)
- // NOTE: returns true if window and graphic device has been initialized successfully
- CORE.Window.ready = InitGraphicsDevice(width, height);
-
- // If graphic device is no properly initialized, we end program
- if (!CORE.Window.ready) { TRACELOG(LOG_FATAL, "PLATFORM: Failed to initialize graphic device"); return; }
- else SetWindowPosition(GetMonitorWidth(GetCurrentMonitor())/2 - CORE.Window.screen.width/2, GetMonitorHeight(GetCurrentMonitor())/2 - CORE.Window.screen.height/2);
-
- // Initialize hi-res timer
- InitTimer();
-
- // Initialize base path for storage
- CORE.Storage.basePath = GetWorkingDirectory();
-
- // Setup callback functions for the DOM events
- emscripten_set_fullscreenchange_callback("#canvas", NULL, 1, EmscriptenFullscreenChangeCallback);
-
- // WARNING: Below resize code was breaking fullscreen mode for sample games and examples, it needs review
- // Check fullscreen change events(note this is done on the window since most browsers don't support this on #canvas)
- // emscripten_set_fullscreenchange_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, NULL, 1, EmscriptenResizeCallback);
- // Check Resize event (note this is done on the window since most browsers don't support this on #canvas)
- emscripten_set_resize_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, NULL, 1, EmscriptenResizeCallback);
-
- // Trigger this once to get initial window sizing
- EmscriptenResizeCallback(EMSCRIPTEN_EVENT_RESIZE, NULL, NULL);
-
- // Support keyboard events -> Not used, GLFW.JS takes care of that
- // emscripten_set_keypress_callback("#canvas", NULL, 1, EmscriptenKeyboardCallback);
- // emscripten_set_keydown_callback("#canvas", NULL, 1, EmscriptenKeyboardCallback);
-
- // Support mouse events
- emscripten_set_click_callback("#canvas", NULL, 1, EmscriptenMouseCallback);
-
- // Support touch events
- emscripten_set_touchstart_callback("#canvas", NULL, 1, EmscriptenTouchCallback);
- emscripten_set_touchend_callback("#canvas", NULL, 1, EmscriptenTouchCallback);
- emscripten_set_touchmove_callback("#canvas", NULL, 1, EmscriptenTouchCallback);
- emscripten_set_touchcancel_callback("#canvas", NULL, 1, EmscriptenTouchCallback);
-
- // Support gamepad events (not provided by GLFW3 on emscripten)
- emscripten_set_gamepadconnected_callback(NULL, 1, EmscriptenGamepadCallback);
- emscripten_set_gamepaddisconnected_callback(NULL, 1, EmscriptenGamepadCallback);
+ // Initialize platform
+ //--------------------------------------------------------------
+ InitPlatform();
//--------------------------------------------------------------
+ // Initialize OpenGL context (states and resources)
+ // NOTE: CORE.Window.currentFbo.width and CORE.Window.currentFbo.height not used, just stored as globals in rlgl
+ rlglInit(CORE.Window.currentFbo.width, CORE.Window.currentFbo.height);
- // Initialize random seed
- SetRandomSeed((unsigned int)time(NULL));
+ // Setup default viewport
+ // NOTE: It updated CORE.Window.render.width and CORE.Window.render.height
+ SetupViewport(CORE.Window.currentFbo.width, CORE.Window.currentFbo.height);
#if defined(SUPPORT_MODULE_RTEXT) && defined(SUPPORT_DEFAULT_FONT)
// Load default font
@@ -264,6 +231,9 @@ void InitWindow(int width, int height, const char *title)
CORE.Time.frameCounter = 0;
#endif
+ // Initialize random seed
+ SetRandomSeed((unsigned int)time(NULL));
+
TRACELOG(LOG_INFO, "PLATFORM: WEB: Application initialized successfully");
}
@@ -285,10 +255,9 @@ void CloseWindow(void)
rlglClose(); // De-init rlgl
- // Platform specific close window
- //--------------------------------------------------------------
- glfwDestroyWindow(platform.handle);
- glfwTerminate();
+ // De-initialize platform
+ //--------------------------------------------------------------
+ ClosePlatform();
//--------------------------------------------------------------
#if defined(SUPPORT_EVENTS_AUTOMATION)
@@ -814,43 +783,14 @@ void PollInputEvents(void)
// Module Internal Functions Definition
//----------------------------------------------------------------------------------
-// Initialize display device and framebuffer
-// NOTE: width and height represent the screen (framebuffer) desired size, not actual display size
-// If width or height are 0, default display size will be used for framebuffer size
-// NOTE: returns false in case graphic device could not be created
-static bool InitGraphicsDevice(int width, int height)
+// Initialize platform: graphics, inputs and more
+static int InitPlatform(void)
{
- CORE.Window.screen.width = width; // User desired width
- CORE.Window.screen.height = height; // User desired height
- CORE.Window.screenScale = MatrixIdentity(); // No draw scaling required by default
-
- // Set the screen minimum and maximum default values to 0
- CORE.Window.screenMin.width = 0;
- CORE.Window.screenMin.height = 0;
- CORE.Window.screenMax.width = 0;
- CORE.Window.screenMax.height = 0;
-
- // NOTE: Framebuffer (render area - CORE.Window.render.width, CORE.Window.render.height) could include black bars...
- // ...in top-down or left-right to match display aspect ratio (no weird scaling)
-
glfwSetErrorCallback(ErrorCallback);
-/*
- // TODO: Setup GLFW custom allocators to match raylib ones
- const GLFWallocator allocator = {
- .allocate = MemAlloc,
- .deallocate = MemFree,
- .reallocate = MemRealloc,
- .user = NULL
- };
-
- glfwInitAllocator(&allocator);
-*/
- if (!glfwInit())
- {
- TRACELOG(LOG_WARNING, "GLFW: Failed to initialize GLFW");
- return false;
- }
+ // Initialize GLFW internal global state
+ int result = glfwInit();
+ if (result == GLFW_FALSE) { TRACELOG(LOG_WARNING, "GLFW: Failed to initialize GLFW"); return -1; }
glfwDefaultWindowHints(); // Set default windows hints
// glfwWindowHint(GLFW_RED_BITS, 8); // Framebuffer red color component bits
@@ -1016,7 +956,7 @@ static bool InitGraphicsDevice(int width, int height)
{
glfwTerminate();
TRACELOG(LOG_WARNING, "GLFW: Failed to initialize Window");
- return false;
+ return -1;
}
// WARNING: glfwCreateWindow() title doesn't work with emscripten
@@ -1037,6 +977,12 @@ static bool InitGraphicsDevice(int width, int height)
glfwSetCursorEnterCallback(platform.handle, CursorEnterCallback);
glfwMakeContextCurrent(platform.handle);
+
+ // Load OpenGL extensions
+ // NOTE: GL procedures address loader is required to load extensions
+ rlLoadExtensions(glfwGetProcAddress);
+
+ if ((CORE.Window.flags & FLAG_WINDOW_MINIMIZED) > 0) MinimizeWindow();
// Try to enable GPU V-Sync, so frames are limited to screen refresh rate (60Hz -> 60 FPS)
// NOTE: V-Sync can be enabled by graphic driver configuration, it doesn't need
@@ -1055,22 +1001,54 @@ static bool InitGraphicsDevice(int width, int height)
TRACELOG(LOG_INFO, " > Screen size: %i x %i", CORE.Window.screen.width, CORE.Window.screen.height);
TRACELOG(LOG_INFO, " > Render size: %i x %i", CORE.Window.render.width, CORE.Window.render.height);
TRACELOG(LOG_INFO, " > Viewport offsets: %i, %i", CORE.Window.renderOffset.x, CORE.Window.renderOffset.y);
+
+ // If graphic device is no properly initialized, we end program
+ if (!CORE.Window.ready) { TRACELOG(LOG_FATAL, "PLATFORM: Failed to initialize graphic device"); return -1; }
+ else SetWindowPosition(GetMonitorWidth(GetCurrentMonitor())/2 - CORE.Window.screen.width/2, GetMonitorHeight(GetCurrentMonitor())/2 - CORE.Window.screen.height/2);
- // Load OpenGL extensions
- // NOTE: GL procedures address loader is required to load extensions
- rlLoadExtensions(glfwGetProcAddress);
+ // Initialize hi-res timer
+ InitTimer();
+
+ // Initialize base path for storage
+ CORE.Storage.basePath = GetWorkingDirectory();
+
+ // Setup callback functions for the DOM events
+ emscripten_set_fullscreenchange_callback("#canvas", NULL, 1, EmscriptenFullscreenChangeCallback);
- // Initialize OpenGL context (states and resources)
- // NOTE: CORE.Window.currentFbo.width and CORE.Window.currentFbo.height not used, just stored as globals in rlgl
- rlglInit(CORE.Window.currentFbo.width, CORE.Window.currentFbo.height);
+ // WARNING: Below resize code was breaking fullscreen mode for sample games and examples, it needs review
+ // Check fullscreen change events(note this is done on the window since most browsers don't support this on #canvas)
+ // emscripten_set_fullscreenchange_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, NULL, 1, EmscriptenResizeCallback);
+ // Check Resize event (note this is done on the window since most browsers don't support this on #canvas)
+ emscripten_set_resize_callback(EMSCRIPTEN_EVENT_TARGET_WINDOW, NULL, 1, EmscriptenResizeCallback);
- // Setup default viewport
- // NOTE: It updated CORE.Window.render.width and CORE.Window.render.height
- SetupViewport(CORE.Window.currentFbo.width, CORE.Window.currentFbo.height);
+ // Trigger this once to get initial window sizing
+ EmscriptenResizeCallback(EMSCRIPTEN_EVENT_RESIZE, NULL, NULL);
- if ((CORE.Window.flags & FLAG_WINDOW_MINIMIZED) > 0) MinimizeWindow();
+ // Support keyboard events -> Not used, GLFW.JS takes care of that
+ // emscripten_set_keypress_callback("#canvas", NULL, 1, EmscriptenKeyboardCallback);
+ // emscripten_set_keydown_callback("#canvas", NULL, 1, EmscriptenKeyboardCallback);
+
+ // Support mouse events
+ emscripten_set_click_callback("#canvas", NULL, 1, EmscriptenMouseCallback);
+
+ // Support touch events
+ emscripten_set_touchstart_callback("#canvas", NULL, 1, EmscriptenTouchCallback);
+ emscripten_set_touchend_callback("#canvas", NULL, 1, EmscriptenTouchCallback);
+ emscripten_set_touchmove_callback("#canvas", NULL, 1, EmscriptenTouchCallback);
+ emscripten_set_touchcancel_callback("#canvas", NULL, 1, EmscriptenTouchCallback);
- return true;
+ // Support gamepad events (not provided by GLFW3 on emscripten)
+ emscripten_set_gamepadconnected_callback(NULL, 1, EmscriptenGamepadCallback);
+ emscripten_set_gamepaddisconnected_callback(NULL, 1, EmscriptenGamepadCallback);
+
+ return 0;
+}
+
+// Close platform
+static void ClosePlatform(void)
+{
+ glfwDestroyWindow(platform.handle);
+ glfwTerminate();
}
// GLFW3 Error Callback, runs on GLFW3 error