add display state
This commit is contained in:
@@ -33,6 +33,7 @@ errorret_t displayInit(void) {
|
|||||||
#ifdef displayPlatformInit
|
#ifdef displayPlatformInit
|
||||||
errorChain(displayPlatformInit());
|
errorChain(displayPlatformInit());
|
||||||
#endif
|
#endif
|
||||||
|
errorChain(displaySetState((displaystate_t){ .flags = 0 }));
|
||||||
errorChain(textureInit(
|
errorChain(textureInit(
|
||||||
&TEXTURE_WHITE, 4, 4,
|
&TEXTURE_WHITE, 4, 4,
|
||||||
TEXTURE_FORMAT_RGBA, (texturedata_t){ .rgbaColors = TEXTURE_WHITE_PIXELS }
|
TEXTURE_FORMAT_RGBA, (texturedata_t){ .rgbaColors = TEXTURE_WHITE_PIXELS }
|
||||||
@@ -110,6 +111,13 @@ errorret_t displayUpdate(void) {
|
|||||||
errorOk();
|
errorOk();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
errorret_t displaySetState(displaystate_t state) {
|
||||||
|
#ifdef displayPlatformSetState
|
||||||
|
errorChain(displayPlatformSetState(state));
|
||||||
|
#endif
|
||||||
|
errorOk();
|
||||||
|
}
|
||||||
|
|
||||||
errorret_t displayDispose(void) {
|
errorret_t displayDispose(void) {
|
||||||
errorChain(shaderDispose(&SHADER_UNLIT));
|
errorChain(shaderDispose(&SHADER_UNLIT));
|
||||||
errorChain(spriteBatchDispose());
|
errorChain(spriteBatchDispose());
|
||||||
|
|||||||
@@ -40,15 +40,26 @@ extern display_t DISPLAY;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Initializes the display system.
|
* Initializes the display system.
|
||||||
|
* @return An errorret_t indicating success or failure.
|
||||||
*/
|
*/
|
||||||
errorret_t displayInit(void);
|
errorret_t displayInit(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Tells the display system to actually draw the frame.
|
* Tells the display system to actually draw the frame.
|
||||||
|
* @return An errorret_t indicating success or failure.
|
||||||
*/
|
*/
|
||||||
errorret_t displayUpdate(void);
|
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.
|
* Disposes of the display system.
|
||||||
|
* @return An errorret_t indicating success or failure.
|
||||||
*/
|
*/
|
||||||
errorret_t displayDispose(void);
|
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;
|
||||||
@@ -55,6 +55,10 @@ errorret_t sceneRender(void) {
|
|||||||
|
|
||||||
shader_t *shaderCurrent = NULL;
|
shader_t *shaderCurrent = NULL;
|
||||||
mat4 view, proj, model;
|
mat4 view, proj, model;
|
||||||
|
|
||||||
|
errorChain(displaySetState((displaystate_t){
|
||||||
|
.flags = DISPLAY_STATE_FLAG_CULL | DISPLAY_STATE_FLAG_DEPTH_TEST
|
||||||
|
}));
|
||||||
|
|
||||||
// For each camera
|
// For each camera
|
||||||
for(entityid_t camIndex = 0; camIndex < camCount; camIndex++) {
|
for(entityid_t camIndex = 0; camIndex < camCount; camIndex++) {
|
||||||
@@ -148,6 +152,9 @@ errorret_t sceneRender(void) {
|
|||||||
errorChain(shaderSetMatrix(&SHADER_UNLIT, SHADER_UNLIT_PROJECTION, proj));
|
errorChain(shaderSetMatrix(&SHADER_UNLIT, SHADER_UNLIT_PROJECTION, proj));
|
||||||
errorChain(shaderSetMatrix(&SHADER_UNLIT, SHADER_UNLIT_VIEW, view));
|
errorChain(shaderSetMatrix(&SHADER_UNLIT, SHADER_UNLIT_VIEW, view));
|
||||||
errorChain(shaderSetMatrix(&SHADER_UNLIT, SHADER_UNLIT_MODEL, model));
|
errorChain(shaderSetMatrix(&SHADER_UNLIT, SHADER_UNLIT_MODEL, model));
|
||||||
|
errorChain(displaySetState((displaystate_t){
|
||||||
|
.flags = DISPLAY_STATE_FLAG_BLEND
|
||||||
|
}));
|
||||||
|
|
||||||
errorChain(uiRender());
|
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_SetDispCopyGamma(GX_GM_1_0);
|
||||||
GX_SetColorUpdate(GX_TRUE);
|
GX_SetColorUpdate(GX_TRUE);
|
||||||
|
|
||||||
@@ -103,12 +99,36 @@ errorret_t displayUpdateDolphin(void) {
|
|||||||
errorOk();
|
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) {
|
errorret_t displaySwapDolphin(void) {
|
||||||
GX_DrawDone();
|
GX_DrawDone();
|
||||||
|
|
||||||
DISPLAY.whichFrameBuffer ^= 1;
|
DISPLAY.whichFrameBuffer ^= 1;
|
||||||
// GX_SetZMode(GX_TRUE, GX_LEQUAL, GX_TRUE);
|
|
||||||
// GX_SetColorUpdate(GX_TRUE);
|
|
||||||
GX_CopyDisp(DISPLAY.frameBuffer[DISPLAY.whichFrameBuffer], GX_TRUE);
|
GX_CopyDisp(DISPLAY.frameBuffer[DISPLAY.whichFrameBuffer], GX_TRUE);
|
||||||
VIDEO_SetNextFramebuffer(DISPLAY.frameBuffer[DISPLAY.whichFrameBuffer]);
|
VIDEO_SetNextFramebuffer(DISPLAY.frameBuffer[DISPLAY.whichFrameBuffer]);
|
||||||
VIDEO_Flush();
|
VIDEO_Flush();
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "error/error.h"
|
#include "error/error.h"
|
||||||
|
#include "display/displaystate.h"
|
||||||
|
|
||||||
#define DISPLAY_DOLPHIN_FIFO_SIZE (256*1024)
|
#define DISPLAY_DOLPHIN_FIFO_SIZE (256*1024)
|
||||||
|
|
||||||
@@ -30,4 +31,9 @@ errorret_t displayUpdateDolphin(void);
|
|||||||
/**
|
/**
|
||||||
* Swaps the display buffers on Dolphin.
|
* Swaps the display buffers on Dolphin.
|
||||||
*/
|
*/
|
||||||
errorret_t displaySwapDolphin(void);
|
errorret_t displaySwapDolphin(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the display state on Dolphin.
|
||||||
|
*/
|
||||||
|
errorret_t displaySetStateDolphin(displaystate_t state);
|
||||||
@@ -11,5 +11,6 @@
|
|||||||
#define displayPlatformInit displayInitDolphin
|
#define displayPlatformInit displayInitDolphin
|
||||||
#define displayPlatformUpdate displayUpdateDolphin
|
#define displayPlatformUpdate displayUpdateDolphin
|
||||||
#define displayPlatformSwap displaySwapDolphin
|
#define displayPlatformSwap displaySwapDolphin
|
||||||
|
#define displayPlatformSetState displaySetStateDolphin
|
||||||
|
|
||||||
typedef displaydolphin_t displayplatform_t;
|
typedef displaydolphin_t displayplatform_t;
|
||||||
@@ -8,20 +8,6 @@
|
|||||||
#include "displaygl.h"
|
#include "displaygl.h"
|
||||||
|
|
||||||
errorret_t displayOpenGLInit(void) {
|
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);
|
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
|
||||||
errorChain(errorGLCheck());
|
errorChain(errorGLCheck());
|
||||||
|
|
||||||
|
|||||||
@@ -13,4 +13,5 @@ typedef displaysdl2_t displayplatform_t;
|
|||||||
#define displayPlatformInit displaySDL2Init
|
#define displayPlatformInit displaySDL2Init
|
||||||
#define displayPlatformUpdate displaySDL2Update
|
#define displayPlatformUpdate displaySDL2Update
|
||||||
#define displayPlatformSwap displaySDL2Swap
|
#define displayPlatformSwap displaySDL2Swap
|
||||||
|
#define displayPlatformSetState displaySDL2SetState
|
||||||
#define displayPlatformDispose displaySDL2Dispose
|
#define displayPlatformDispose displaySDL2Dispose
|
||||||
@@ -102,6 +102,42 @@ errorret_t displaySDL2Swap(void) {
|
|||||||
errorOk();
|
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) {
|
void displaySDL2Dispose(void) {
|
||||||
if(DISPLAY.glContext) {
|
if(DISPLAY.glContext) {
|
||||||
SDL_GL_DeleteContext(DISPLAY.glContext);
|
SDL_GL_DeleteContext(DISPLAY.glContext);
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "error/error.h"
|
#include "error/error.h"
|
||||||
|
#include "display/displaystate.h"
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
SDL_Window *window;
|
SDL_Window *window;
|
||||||
@@ -29,6 +30,11 @@ errorret_t displaySDL2Update(void);
|
|||||||
*/
|
*/
|
||||||
errorret_t displaySDL2Swap(void);
|
errorret_t displaySDL2Swap(void);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the SDL2 display state.
|
||||||
|
*/
|
||||||
|
errorret_t displaySDL2SetState(displaystate_t state);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Disposes/Cleans up the SDL2 Render system.
|
* Disposes/Cleans up the SDL2 Render system.
|
||||||
*/
|
*/
|
||||||
|
|||||||
Reference in New Issue
Block a user