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

View File

@ -334,12 +334,13 @@ void lovrGraphicsReset() {
lovrGraphicsSetBlendMode(BLEND_ALPHA, BLEND_ALPHA_MULTIPLY);
lovrGraphicsSetCanvas(NULL);
lovrGraphicsSetColor((Color) { 1, 1, 1, 1 });
lovrGraphicsSetColorMask(true, true, true, true);
lovrGraphicsSetCullingEnabled(false);
lovrGraphicsSetDefaultFilter((TextureFilter) { .mode = FILTER_TRILINEAR });
lovrGraphicsSetDepthTest(COMPARE_LEQUAL, true);
lovrGraphicsSetFont(NULL);
lovrGraphicsSetLineWidth(1);
lovrGraphicsSetPointSize(1);
lovrGraphicsSetLineWidth(1.f);
lovrGraphicsSetPointSize(1.f);
lovrGraphicsSetShader(NULL);
lovrGraphicsSetStencilTest(COMPARE_NONE, 0);
lovrGraphicsSetWinding(WINDING_COUNTERCLOCKWISE);
@ -399,6 +400,17 @@ void lovrGraphicsSetColor(Color color) {
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() {
return state.pipeline.culling;
}
@ -449,7 +461,7 @@ float lovrGraphicsGetLineWidth() {
return state.pipeline.lineWidth;
}
void lovrGraphicsSetLineWidth(uint8_t width) {
void lovrGraphicsSetLineWidth(float width) {
state.pipeline.lineWidth = width;
}

View File

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

View File

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