Merge pull request #227 from chatrat12/wide-screen-support

Added simple wide screen support #187
This commit is contained in:
lambertjamesd 2023-09-04 21:40:25 -06:00 committed by GitHub
commit f1283a397a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 32 additions and 2 deletions

View file

@ -21,8 +21,10 @@ void gameplayOptionsInit(struct GameplayOptions* gameplayOptions) {
gameplayOptions->selectedItem = GameplayOptionMovingPortals;
gameplayOptions->movingPortals = menuBuildCheckbox(&gDejaVuSansFont, "Movable Portals", GAMEPLAY_X + 8, GAMEPLAY_Y + 8);
gameplayOptions->wideScreen = menuBuildCheckbox(&gDejaVuSansFont, "Wide Screen", GAMEPLAY_X + 8, GAMEPLAY_Y + 28);
gameplayOptions->movingPortals.checked = (gSaveData.controls.flags & ControlSaveFlagsInvert) != 0;
gameplayOptions->wideScreen.checked = (gSaveData.controls.flags & ControlSaveWideScreen) != 0;
}
enum MenuDirection gameplayOptionsUpdate(struct GameplayOptions* gameplayOptions) {
@ -62,6 +64,18 @@ enum MenuDirection gameplayOptionsUpdate(struct GameplayOptions* gameplayOptions
}
break;
case GameplayOptionWideScreen:
if (controllerGetButtonDown(0, A_BUTTON)) {
gameplayOptions->wideScreen.checked = !gameplayOptions->wideScreen.checked;
soundPlayerPlay(SOUNDS_BUTTONCLICKRELEASE, 1.0f, 0.5f, NULL, NULL);
if (gameplayOptions->wideScreen.checked) {
gSaveData.controls.flags |= ControlSaveWideScreen;
} else {
gSaveData.controls.flags &= ~ControlSaveWideScreen;
}
}
break;
}
if (controllerDir & ControllerDirectionLeft) {
@ -80,6 +94,9 @@ void gameplayOptionsRender(struct GameplayOptions* gameplayOptions, struct Rende
gSPDisplayList(renderState->dl++, gameplayOptions->movingPortals.outline);
renderState->dl = menuCheckboxRender(&gameplayOptions->movingPortals, renderState->dl);
gSPDisplayList(renderState->dl++, gameplayOptions->wideScreen.outline);
renderState->dl = menuCheckboxRender(&gameplayOptions->wideScreen, renderState->dl);
gSPDisplayList(renderState->dl++, ui_material_revert_list[SOLID_ENV_INDEX]);
@ -89,5 +106,8 @@ void gameplayOptionsRender(struct GameplayOptions* gameplayOptions, struct Rende
menuSetRenderColor(renderState, gameplayOptions->selectedItem == GameplayOptionMovingPortals, &gSelectionGray, &gColorWhite);
gSPDisplayList(renderState->dl++, gameplayOptions->movingPortals.text);
menuSetRenderColor(renderState, gameplayOptions->selectedItem == GameplayOptionWideScreen, &gSelectionGray, &gColorWhite);
gSPDisplayList(renderState->dl++, gameplayOptions->wideScreen.text);
gSPDisplayList(renderState->dl++, ui_material_revert_list[DEJAVU_SANS_INDEX]);
}

View file

@ -6,12 +6,14 @@
enum GameplayOption {
GameplayOptionMovingPortals,
GameplayOptionWideScreen,
GameplayOptionCount,
};
struct GameplayOptions {
struct MenuCheckbox movingPortals;
struct MenuCheckbox wideScreen;
Gfx* lookSensitivityText;
Gfx* lookAccelerationText;
short selectedItem;

View file

@ -38,6 +38,7 @@ enum ControlSaveFlags {
ControlSaveTankControls = (1 << 1),
ControlSaveMoveablePortals = (1 << 8),
ControlSaveWideScreen = (1 << 9),
};
struct ControlSaveState {

View file

@ -12,6 +12,7 @@
#include "portal_render.h"
#include "../scene/dynamic_scene.h"
#include "../levels/levels.h"
#include "../savefile/savefile.h"
#include "../build/assets/models/portal/portal_blue.h"
#include "../build/assets/models/portal/portal_blue_face.h"
@ -21,6 +22,8 @@
#define MIN_VP_WIDTH 64
#define CAMERA_CLIPPING_RADIUS 0.2f
#define PORTAL_CLIPPING_OFFSET 0.1f
#define ASPECT_SD 1.333333333333333 // 4:3
#define ASPECT_WIDE 1.777777777777778 // 16:9
void renderPropsInit(struct RenderProps* props, struct Camera* camera, float aspectRatio, struct RenderState* renderState, u16 roomIndex) {
props->camera = *camera;
@ -109,6 +112,10 @@ Vp* renderPropsBuildViewport(struct RenderProps* props, struct RenderState* rend
void renderPlanFinishView(struct RenderPlan* renderPlan, struct Scene* scene, struct RenderProps* properties, struct RenderState* renderState);
inline static float getAspect()
{
return (gSaveData.controls.flags & ControlSaveWideScreen) != 0 ? ASPECT_WIDE : ASPECT_SD;
}
#define CALC_SCREEN_SPACE(clip_space, screen_size) ((clip_space + 1.0f) * ((screen_size) / 2))
@ -146,7 +153,7 @@ int renderPlanPortal(struct RenderPlan* renderPlan, struct Scene* scene, struct
struct ScreenClipper clipper;
screenClipperInitWithCamera(&clipper, &current->camera, (float)SCREEN_WD / (float)SCREEN_HT, portalTransform);
screenClipperInitWithCamera(&clipper, &current->camera, getAspect(), portalTransform);
struct Box2D clippingBounds;
screenClipperBoundingPoints(&clipper, gPortalOutline, sizeof(gPortalOutline) / sizeof(*gPortalOutline), &clippingBounds);
@ -437,7 +444,7 @@ void renderPlanAdjustViewportDepth(struct RenderPlan* renderPlan) {
}
void renderPlanBuild(struct RenderPlan* renderPlan, struct Scene* scene, struct RenderState* renderState) {
renderPropsInit(&renderPlan->stageProps[0], &scene->camera, (float)SCREEN_WD / (float)SCREEN_HT, renderState, scene->player.body.currentRoom);
renderPropsInit(&renderPlan->stageProps[0], &scene->camera, getAspect(), renderState, scene->player.body.currentRoom);
renderPlan->stageCount = 1;
renderPlan->clippedPortalIndex = -1;
renderPlan->nearPolygonCount = 0;