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;
|
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 },
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue