lovr.graphics.get/setColorMask;

This commit is contained in:
bjorn 2019-12-10 13:44:51 -08:00
parent c87d6dec3d
commit e316e6156b
4 changed files with 67 additions and 21 deletions

View File

@ -543,6 +543,25 @@ static int l_lovrGraphicsSetColor(lua_State* L) {
return 0; return 0;
} }
static int l_lovrGraphicsGetColorMask(lua_State* L) {
bool r, b, g, a;
lovrGraphicsGetColorMask(&r, &g, &b, &a);
lua_pushboolean(L, r);
lua_pushboolean(L, g);
lua_pushboolean(L, b);
lua_pushboolean(L, a);
return 4;
}
static int l_lovrGraphicsSetColorMask(lua_State* L) {
bool r = lua_toboolean(L, 1);
bool g = lua_toboolean(L, 2);
bool b = lua_toboolean(L, 3);
bool a = lua_toboolean(L, 4);
lovrGraphicsSetColorMask(r, g, b, a);
return 0;
}
static int l_lovrGraphicsIsCullingEnabled(lua_State* L) { static int l_lovrGraphicsIsCullingEnabled(lua_State* L) {
lua_pushboolean(L, lovrGraphicsIsCullingEnabled()); lua_pushboolean(L, lovrGraphicsIsCullingEnabled());
return 1; return 1;
@ -949,7 +968,11 @@ static int l_lovrGraphicsStencil(lua_State* L) {
lovrGraphicsClear(NULL, NULL, &clearTo); lovrGraphicsClear(NULL, NULL, &clearTo);
} }
lua_settop(L, 1); lua_settop(L, 1);
bool r, g, b, a;
lovrGraphicsGetColorMask(&r, &g, &b, &a);
lovrGraphicsSetColorMask(false, false, false, false);
lovrGraphicsStencil(action, replaceValue, stencilCallback, L); lovrGraphicsStencil(action, replaceValue, stencilCallback, L);
lovrGraphicsSetColorMask(r, g, b, a);
return 0; return 0;
} }
@ -1616,6 +1639,8 @@ static const luaL_Reg lovrGraphics[] = {
{ "setCanvas", l_lovrGraphicsSetCanvas }, { "setCanvas", l_lovrGraphicsSetCanvas },
{ "getColor", l_lovrGraphicsGetColor }, { "getColor", l_lovrGraphicsGetColor },
{ "setColor", l_lovrGraphicsSetColor }, { "setColor", l_lovrGraphicsSetColor },
{ "getColorMask", l_lovrGraphicsGetColorMask },
{ "setColorMask", l_lovrGraphicsSetColorMask },
{ "isCullingEnabled", l_lovrGraphicsIsCullingEnabled }, { "isCullingEnabled", l_lovrGraphicsIsCullingEnabled },
{ "setCullingEnabled", l_lovrGraphicsSetCullingEnabled }, { "setCullingEnabled", l_lovrGraphicsSetCullingEnabled },
{ "getDefaultFilter", l_lovrGraphicsGetDefaultFilter }, { "getDefaultFilter", l_lovrGraphicsGetDefaultFilter },

View File

@ -334,12 +334,13 @@ void lovrGraphicsReset() {
lovrGraphicsSetBlendMode(BLEND_ALPHA, BLEND_ALPHA_MULTIPLY); lovrGraphicsSetBlendMode(BLEND_ALPHA, BLEND_ALPHA_MULTIPLY);
lovrGraphicsSetCanvas(NULL); lovrGraphicsSetCanvas(NULL);
lovrGraphicsSetColor((Color) { 1, 1, 1, 1 }); lovrGraphicsSetColor((Color) { 1, 1, 1, 1 });
lovrGraphicsSetColorMask(true, true, true, true);
lovrGraphicsSetCullingEnabled(false); lovrGraphicsSetCullingEnabled(false);
lovrGraphicsSetDefaultFilter((TextureFilter) { .mode = FILTER_TRILINEAR }); lovrGraphicsSetDefaultFilter((TextureFilter) { .mode = FILTER_TRILINEAR });
lovrGraphicsSetDepthTest(COMPARE_LEQUAL, true); lovrGraphicsSetDepthTest(COMPARE_LEQUAL, true);
lovrGraphicsSetFont(NULL); lovrGraphicsSetFont(NULL);
lovrGraphicsSetLineWidth(1); lovrGraphicsSetLineWidth(1.f);
lovrGraphicsSetPointSize(1); lovrGraphicsSetPointSize(1.f);
lovrGraphicsSetShader(NULL); lovrGraphicsSetShader(NULL);
lovrGraphicsSetStencilTest(COMPARE_NONE, 0); lovrGraphicsSetStencilTest(COMPARE_NONE, 0);
lovrGraphicsSetWinding(WINDING_COUNTERCLOCKWISE); lovrGraphicsSetWinding(WINDING_COUNTERCLOCKWISE);
@ -399,6 +400,17 @@ void lovrGraphicsSetColor(Color color) {
gammaCorrect(&state.linearColor); gammaCorrect(&state.linearColor);
} }
void lovrGraphicsGetColorMask(bool* r, bool* g, bool* b, bool* a) {
*r = state.pipeline.colorMask & 0x8;
*g = state.pipeline.colorMask & 0x4;
*b = state.pipeline.colorMask & 0x2;
*a = state.pipeline.colorMask & 0x1;
}
void lovrGraphicsSetColorMask(bool r, bool g, bool b, bool a) {
state.pipeline.colorMask = (r << 3) | (g << 2) | (b << 1) | a;
}
bool lovrGraphicsIsCullingEnabled() { bool lovrGraphicsIsCullingEnabled() {
return state.pipeline.culling; return state.pipeline.culling;
} }
@ -449,7 +461,7 @@ float lovrGraphicsGetLineWidth() {
return state.pipeline.lineWidth; return state.pipeline.lineWidth;
} }
void lovrGraphicsSetLineWidth(uint8_t width) { void lovrGraphicsSetLineWidth(float width) {
state.pipeline.lineWidth = width; state.pipeline.lineWidth = width;
} }

View File

@ -77,17 +77,18 @@ typedef struct {
} Camera; } Camera;
typedef struct { typedef struct {
bool alphaSampling : 1; float lineWidth;
uint8_t blendMode : 3; // BlendMode unsigned alphaSampling : 1;
uint8_t blendAlphaMode : 1; // BlendAlphaMode unsigned blendMode : 3; // BlendMode
bool culling : 1; unsigned blendAlphaMode : 1; // BlendAlphaMode
uint8_t depthTest : 3; // CompareMode unsigned colorMask : 4;
bool depthWrite : 1; unsigned culling : 1;
uint8_t lineWidth : 8; unsigned depthTest : 3; // CompareMode
uint8_t stencilValue: 8; unsigned depthWrite : 1;
uint8_t stencilMode : 3; // CompareMode unsigned stencilValue: 8;
uint8_t winding : 1; // Winding unsigned stencilMode : 3; // CompareMode
bool wireframe : 1; unsigned winding : 1; // Winding
unsigned wireframe : 1;
} Pipeline; } Pipeline;
// Base // Base
@ -119,6 +120,8 @@ struct Canvas* lovrGraphicsGetCanvas(void);
void lovrGraphicsSetCanvas(struct Canvas* canvas); void lovrGraphicsSetCanvas(struct Canvas* canvas);
Color lovrGraphicsGetColor(void); Color lovrGraphicsGetColor(void);
void lovrGraphicsSetColor(Color color); void lovrGraphicsSetColor(Color color);
void lovrGraphicsGetColorMask(bool* r, bool* g, bool* b, bool* a);
void lovrGraphicsSetColorMask(bool r, bool g, bool b, bool a);
bool lovrGraphicsIsCullingEnabled(void); bool lovrGraphicsIsCullingEnabled(void);
void lovrGraphicsSetCullingEnabled(bool culling); void lovrGraphicsSetCullingEnabled(bool culling);
TextureFilter lovrGraphicsGetDefaultFilter(void); TextureFilter lovrGraphicsGetDefaultFilter(void);
@ -128,7 +131,7 @@ void lovrGraphicsSetDepthTest(CompareMode depthTest, bool write);
struct Font* lovrGraphicsGetFont(void); struct Font* lovrGraphicsGetFont(void);
void lovrGraphicsSetFont(struct Font* font); void lovrGraphicsSetFont(struct Font* font);
float lovrGraphicsGetLineWidth(void); float lovrGraphicsGetLineWidth(void);
void lovrGraphicsSetLineWidth(uint8_t width); void lovrGraphicsSetLineWidth(float width);
float lovrGraphicsGetPointSize(void); float lovrGraphicsGetPointSize(void);
void lovrGraphicsSetPointSize(float size); void lovrGraphicsSetPointSize(float size);
struct Shader* lovrGraphicsGetShader(void); struct Shader* lovrGraphicsGetShader(void);

View File

@ -66,11 +66,12 @@ static struct {
bool blendEnabled; bool blendEnabled;
BlendMode blendMode; BlendMode blendMode;
BlendAlphaMode blendAlphaMode; BlendAlphaMode blendAlphaMode;
uint8_t colorMask;
bool culling; bool culling;
bool depthEnabled; bool depthEnabled;
CompareMode depthTest; CompareMode depthTest;
bool depthWrite; bool depthWrite;
uint8_t lineWidth; float lineWidth;
uint32_t primitiveRestart; uint32_t primitiveRestart;
bool stencilEnabled; bool stencilEnabled;
CompareMode stencilMode; CompareMode stencilMode;
@ -782,6 +783,12 @@ static void lovrGpuBindPipeline(Pipeline* pipeline) {
} }
} }
// Color mask
if (state.colorMask != pipeline->colorMask) {
state.colorMask = pipeline->colorMask;
glColorMask(state.colorMask & 0x8, state.colorMask & 0x4, state.colorMask & 0x2, state.colorMask & 0x1);
}
// Culling // Culling
if (state.culling != pipeline->culling) { if (state.culling != pipeline->culling) {
state.culling = pipeline->culling; state.culling = pipeline->culling;
@ -1072,6 +1079,9 @@ void lovrGpuInit(void* (*getProcAddress)(const char*)) {
glBlendEquation(GL_FUNC_ADD); glBlendEquation(GL_FUNC_ADD);
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA); glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
state.colorMask = 0xf;
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
state.culling = false; state.culling = false;
glDisable(GL_CULL_FACE); glDisable(GL_CULL_FACE);
@ -1082,7 +1092,7 @@ void lovrGpuInit(void* (*getProcAddress)(const char*)) {
glDepthFunc(convertCompareMode(state.depthTest)); glDepthFunc(convertCompareMode(state.depthTest));
glDepthMask(state.depthWrite); glDepthMask(state.depthWrite);
state.lineWidth = 1; state.lineWidth = 1.f;
glLineWidth(state.lineWidth); glLineWidth(state.lineWidth);
state.stencilEnabled = false; state.stencilEnabled = false;
@ -1244,8 +1254,6 @@ void lovrGpuPresent() {
void lovrGpuStencil(StencilAction action, int replaceValue, StencilCallback callback, void* userdata) { void lovrGpuStencil(StencilAction action, int replaceValue, StencilCallback callback, void* userdata) {
lovrGraphicsFlush(); lovrGraphicsFlush();
glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE);
if (!state.stencilEnabled) { if (!state.stencilEnabled) {
state.stencilEnabled = true; state.stencilEnabled = true;
glEnable(GL_STENCIL_TEST); glEnable(GL_STENCIL_TEST);
@ -1269,8 +1277,6 @@ void lovrGpuStencil(StencilAction action, int replaceValue, StencilCallback call
callback(userdata); callback(userdata);
lovrGraphicsFlush(); lovrGraphicsFlush();
state.stencilWriting = false; state.stencilWriting = false;
glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE);
state.stencilMode = ~0; // Dirty state.stencilMode = ~0; // Dirty
} }