/** * Create a CoreEngine. The default window settings are 60 FPS, * windowed mode with dimensions 640x480. A CoreEngine instance is * passive insofar as enforcing these settings - it is a * placeholder for the information. It is the job of an * intermediate os layer to query these settings and apply them, * or update them with correct values if the default ones are * incorrect. */ CoreEngine::CoreEngine(){ for (int i = 0; i < ENGINE_MAX_EVENT_TYPES; i += 1){ events[i].reserve(ENGINE_INIT_EVENTS_STACK); } // Window Properties setWindowDimensions(640, 480); setWindowFullscreen(0); setClearBuffer(1); setWindowFps(60); // Initialize member pointers camera = NULL; view = NULL; // Initialize Fps members last_render_time = elapsed_time_in_milliseconds(); frame_count = 0; }
void getGameScreenDimensions(HWND game, HWND overlay, screen_dimensions_t *dimensions) { RECT clientRect; POINT clientTopLeft = { .x = 0, .y = 0 }; GetClientRect(game, &clientRect); ClientToScreen(game, &clientTopLeft); int newLeftX = (int)clientTopLeft.x; int newTopY = (int)clientTopLeft.y; int newWidth = (int)clientRect.right; int newHeight = (int)clientRect.bottom; int newXOffset = 0, newYOffset = 0; // has the game window position and/or size changed since we last checked? bool changedPosition, changedSize, enlarged; changedPosition = (dimensions->leftX != newLeftX || dimensions->topY != newTopY); changedSize = (dimensions->width != newWidth || dimensions->height != newHeight); enlarged = (changedSize && (newWidth > dimensions->width || newHeight > dimensions->height)); if (!changedPosition && !changedSize) { return; } dimensions->leftX = newLeftX; dimensions->topY = newTopY; dimensions->width = newWidth; dimensions->height = newHeight; double dblWidth = (double)newWidth; double dblHeight = (double)newHeight; dimensions->aspect = dblWidth / dblHeight; switch (dimensions->aspectMode) { case AM_FIXED: case AM_STRETCH: dimensions->xScale = dblWidth / dimensions->basicWidthAsDouble; dimensions->yScale = dblHeight / dimensions->basicHeightAsDouble; dimensions->leftOffset = 0; dimensions->topOffset = 0; break; case AM_PILLARBOX: newXOffset = setScreenOffsetsPillarboxed(dimensions, dblWidth, dblHeight); break; case AM_LETTERBOX: newYOffset = setScreenOffsetsLetterboxed(dimensions, dblWidth, dblHeight); break; case AM_WINDOW_FRAME: if (dimensions->aspect < dimensions->basicAspect) { newYOffset = setScreenOffsetsLetterboxed(dimensions, dblWidth, dblHeight); } else { newXOffset = setScreenOffsetsPillarboxed(dimensions, dblWidth, dblHeight); } break; default: printf("Encountered invalid aspect mode."); exit(EXIT_FAILURE); } if (!enlarged) { RECT fullscreenRect = { .right = (LONG)screenWidth, .bottom = (LONG)screenHeight }; IDirect3DDevice9_SetScissorRect(d3dDevice, &fullscreenRect); IDirect3DDevice9_Clear(d3dDevice, 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_RGBA(0, 0, 0, 0), 1.0f, 0); } setWindowDimensions(dimensions, newXOffset, newYOffset); MoveWindow(overlay, newLeftX + newXOffset, newTopY + newYOffset, (int)screenWidth, (int)screenHeight, true); }