add display state
This commit is contained in:
@@ -33,6 +33,7 @@ errorret_t displayInit(void) {
|
||||
#ifdef displayPlatformInit
|
||||
errorChain(displayPlatformInit());
|
||||
#endif
|
||||
errorChain(displaySetState((displaystate_t){ .flags = 0 }));
|
||||
errorChain(textureInit(
|
||||
&TEXTURE_WHITE, 4, 4,
|
||||
TEXTURE_FORMAT_RGBA, (texturedata_t){ .rgbaColors = TEXTURE_WHITE_PIXELS }
|
||||
@@ -110,6 +111,13 @@ errorret_t displayUpdate(void) {
|
||||
errorOk();
|
||||
}
|
||||
|
||||
errorret_t displaySetState(displaystate_t state) {
|
||||
#ifdef displayPlatformSetState
|
||||
errorChain(displayPlatformSetState(state));
|
||||
#endif
|
||||
errorOk();
|
||||
}
|
||||
|
||||
errorret_t displayDispose(void) {
|
||||
errorChain(shaderDispose(&SHADER_UNLIT));
|
||||
errorChain(spriteBatchDispose());
|
||||
|
||||
@@ -40,15 +40,26 @@ extern display_t DISPLAY;
|
||||
|
||||
/**
|
||||
* Initializes the display system.
|
||||
* @return An errorret_t indicating success or failure.
|
||||
*/
|
||||
errorret_t displayInit(void);
|
||||
|
||||
/**
|
||||
* Tells the display system to actually draw the frame.
|
||||
* @return An errorret_t indicating success or failure.
|
||||
*/
|
||||
errorret_t displayUpdate(void);
|
||||
|
||||
/**
|
||||
* Sets the display state.
|
||||
*
|
||||
* @param state The state to set.
|
||||
* @return An errorret_t indicating success or failure.
|
||||
*/
|
||||
errorret_t displaySetState(displaystate_t state);
|
||||
|
||||
/**
|
||||
* Disposes of the display system.
|
||||
* @return An errorret_t indicating success or failure.
|
||||
*/
|
||||
errorret_t displayDispose(void);
|
||||
@@ -0,0 +1,17 @@
|
||||
/**
|
||||
* Copyright (c) 2026 Dominic Masters
|
||||
*
|
||||
* This software is released under the MIT License.
|
||||
* https://opensource.org/licenses/MIT
|
||||
*/
|
||||
|
||||
#pragma once
|
||||
#include "dusk.h"
|
||||
|
||||
#define DISPLAY_STATE_FLAG_CULL (1 << 0)
|
||||
#define DISPLAY_STATE_FLAG_DEPTH_TEST (1 << 1)
|
||||
#define DISPLAY_STATE_FLAG_BLEND (1 << 2)
|
||||
|
||||
typedef struct {
|
||||
uint8_t flags;
|
||||
} displaystate_t;
|
||||
@@ -56,6 +56,10 @@ errorret_t sceneRender(void) {
|
||||
shader_t *shaderCurrent = NULL;
|
||||
mat4 view, proj, model;
|
||||
|
||||
errorChain(displaySetState((displaystate_t){
|
||||
.flags = DISPLAY_STATE_FLAG_CULL | DISPLAY_STATE_FLAG_DEPTH_TEST
|
||||
}));
|
||||
|
||||
// For each camera
|
||||
for(entityid_t camIndex = 0; camIndex < camCount; camIndex++) {
|
||||
entityid_t camEnt = camEnts[camIndex];
|
||||
@@ -148,6 +152,9 @@ errorret_t sceneRender(void) {
|
||||
errorChain(shaderSetMatrix(&SHADER_UNLIT, SHADER_UNLIT_PROJECTION, proj));
|
||||
errorChain(shaderSetMatrix(&SHADER_UNLIT, SHADER_UNLIT_VIEW, view));
|
||||
errorChain(shaderSetMatrix(&SHADER_UNLIT, SHADER_UNLIT_MODEL, model));
|
||||
errorChain(displaySetState((displaystate_t){
|
||||
.flags = DISPLAY_STATE_FLAG_BLEND
|
||||
}));
|
||||
|
||||
errorChain(uiRender());
|
||||
|
||||
|
||||
@@ -75,10 +75,6 @@ errorret_t displayInitDolphin(void) {
|
||||
)
|
||||
);
|
||||
|
||||
// Setup cull modes
|
||||
GX_SetCullMode(GX_CULL_NONE);
|
||||
GX_SetBlendMode(GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_CLEAR);
|
||||
GX_SetZMode(GX_TRUE, GX_ALWAYS, GX_FALSE);
|
||||
GX_SetDispCopyGamma(GX_GM_1_0);
|
||||
GX_SetColorUpdate(GX_TRUE);
|
||||
|
||||
@@ -103,12 +99,36 @@ errorret_t displayUpdateDolphin(void) {
|
||||
errorOk();
|
||||
}
|
||||
|
||||
errorret_t displaySetStateDolphin(displaystate_t state) {
|
||||
if(state.flags & DISPLAY_STATE_FLAG_CULL) {
|
||||
GX_SetCullMode(GX_CULL_BACK);
|
||||
} else {
|
||||
GX_SetCullMode(GX_CULL_NONE);
|
||||
}
|
||||
|
||||
if(state.flags & DISPLAY_STATE_FLAG_DEPTH_TEST) {
|
||||
GX_SetZMode(GX_TRUE, GX_LEQUAL, GX_TRUE);
|
||||
} else {
|
||||
GX_SetZMode(GX_FALSE, GX_ALWAYS, GX_FALSE);
|
||||
}
|
||||
|
||||
if(state.flags & DISPLAY_STATE_FLAG_BLEND) {
|
||||
GX_SetBlendMode(
|
||||
GX_BM_BLEND, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_CLEAR
|
||||
);
|
||||
} else {
|
||||
GX_SetBlendMode(
|
||||
GX_BM_NONE, GX_BL_SRCALPHA, GX_BL_INVSRCALPHA, GX_LO_CLEAR
|
||||
);
|
||||
}
|
||||
|
||||
errorOk();
|
||||
}
|
||||
|
||||
errorret_t displaySwapDolphin(void) {
|
||||
GX_DrawDone();
|
||||
|
||||
DISPLAY.whichFrameBuffer ^= 1;
|
||||
// GX_SetZMode(GX_TRUE, GX_LEQUAL, GX_TRUE);
|
||||
// GX_SetColorUpdate(GX_TRUE);
|
||||
GX_CopyDisp(DISPLAY.frameBuffer[DISPLAY.whichFrameBuffer], GX_TRUE);
|
||||
VIDEO_SetNextFramebuffer(DISPLAY.frameBuffer[DISPLAY.whichFrameBuffer]);
|
||||
VIDEO_Flush();
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
|
||||
#pragma once
|
||||
#include "error/error.h"
|
||||
#include "display/displaystate.h"
|
||||
|
||||
#define DISPLAY_DOLPHIN_FIFO_SIZE (256*1024)
|
||||
|
||||
@@ -31,3 +32,8 @@ errorret_t displayUpdateDolphin(void);
|
||||
* Swaps the display buffers on Dolphin.
|
||||
*/
|
||||
errorret_t displaySwapDolphin(void);
|
||||
|
||||
/**
|
||||
* Sets the display state on Dolphin.
|
||||
*/
|
||||
errorret_t displaySetStateDolphin(displaystate_t state);
|
||||
@@ -11,5 +11,6 @@
|
||||
#define displayPlatformInit displayInitDolphin
|
||||
#define displayPlatformUpdate displayUpdateDolphin
|
||||
#define displayPlatformSwap displaySwapDolphin
|
||||
#define displayPlatformSetState displaySetStateDolphin
|
||||
|
||||
typedef displaydolphin_t displayplatform_t;
|
||||
@@ -8,20 +8,6 @@
|
||||
#include "displaygl.h"
|
||||
|
||||
errorret_t displayOpenGLInit(void) {
|
||||
glDisable(GL_CULL_FACE);
|
||||
errorChain(errorGLCheck());
|
||||
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
errorChain(errorGLCheck());
|
||||
glDepthFunc(GL_LEQUAL);
|
||||
errorChain(errorGLCheck());
|
||||
glClearDepth(1.0f);
|
||||
errorChain(errorGLCheck());
|
||||
|
||||
glEnable(GL_BLEND);
|
||||
errorChain(errorGLCheck());
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
errorChain(errorGLCheck());
|
||||
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
||||
errorChain(errorGLCheck());
|
||||
|
||||
|
||||
@@ -13,4 +13,5 @@ typedef displaysdl2_t displayplatform_t;
|
||||
#define displayPlatformInit displaySDL2Init
|
||||
#define displayPlatformUpdate displaySDL2Update
|
||||
#define displayPlatformSwap displaySDL2Swap
|
||||
#define displayPlatformSetState displaySDL2SetState
|
||||
#define displayPlatformDispose displaySDL2Dispose
|
||||
@@ -102,6 +102,42 @@ errorret_t displaySDL2Swap(void) {
|
||||
errorOk();
|
||||
}
|
||||
|
||||
errorret_t displaySDL2SetState(displaystate_t state) {
|
||||
if(state.flags & DISPLAY_STATE_FLAG_CULL) {
|
||||
glEnable(GL_CULL_FACE);
|
||||
errorChain(errorGLCheck());
|
||||
glCullFace(GL_BACK);
|
||||
errorChain(errorGLCheck());
|
||||
} else {
|
||||
glDisable(GL_CULL_FACE);
|
||||
errorChain(errorGLCheck());
|
||||
}
|
||||
|
||||
if(state.flags & DISPLAY_STATE_FLAG_DEPTH_TEST) {
|
||||
glEnable(GL_DEPTH_TEST);
|
||||
errorChain(errorGLCheck());
|
||||
glDepthFunc(GL_LEQUAL);
|
||||
errorChain(errorGLCheck());
|
||||
glClearDepth(1.0f);
|
||||
errorChain(errorGLCheck());
|
||||
} else {
|
||||
glDisable(GL_DEPTH_TEST);
|
||||
errorChain(errorGLCheck());
|
||||
}
|
||||
|
||||
if(state.flags & DISPLAY_STATE_FLAG_BLEND) {
|
||||
glEnable(GL_BLEND);
|
||||
errorChain(errorGLCheck());
|
||||
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
|
||||
errorChain(errorGLCheck());
|
||||
} else {
|
||||
glDisable(GL_BLEND);
|
||||
errorChain(errorGLCheck());
|
||||
}
|
||||
|
||||
errorOk();
|
||||
}
|
||||
|
||||
void displaySDL2Dispose(void) {
|
||||
if(DISPLAY.glContext) {
|
||||
SDL_GL_DeleteContext(DISPLAY.glContext);
|
||||
|
||||
@@ -7,6 +7,7 @@
|
||||
|
||||
#pragma once
|
||||
#include "error/error.h"
|
||||
#include "display/displaystate.h"
|
||||
|
||||
typedef struct {
|
||||
SDL_Window *window;
|
||||
@@ -29,6 +30,11 @@ errorret_t displaySDL2Update(void);
|
||||
*/
|
||||
errorret_t displaySDL2Swap(void);
|
||||
|
||||
/**
|
||||
* Sets the SDL2 display state.
|
||||
*/
|
||||
errorret_t displaySDL2SetState(displaystate_t state);
|
||||
|
||||
/**
|
||||
* Disposes/Cleans up the SDL2 Render system.
|
||||
*/
|
||||
|
||||
Reference in New Issue
Block a user