mirror of https://github.com/bjornbytes/lovr.git
lovr.graphics.get/setColorMask;
This commit is contained in:
parent
c87d6dec3d
commit
e316e6156b
|
@ -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 },
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue