lovr.graphics.setAlphaSampling for alpha to coverage;

This commit is contained in:
bjorn 2018-12-11 22:52:33 -08:00
parent 28ab5377c8
commit 2540953422
4 changed files with 34 additions and 8 deletions

View File

@ -387,6 +387,16 @@ static int l_lovrGraphicsReset(lua_State* L) {
return 0;
}
static int l_lovrGraphicsGetAlphaSampling(lua_State* L) {
lua_pushboolean(L, lovrGraphicsGetAlphaSampling());
return 1;
}
static int l_lovrGraphicsSetAlphaSampling(lua_State* L) {
lovrGraphicsSetAlphaSampling(lua_toboolean(L, 1));
return 0;
}
static int l_lovrGraphicsGetBackgroundColor(lua_State* L) {
Color color = lovrGraphicsGetBackgroundColor();
lua_pushnumber(L, color.r);
@ -1349,6 +1359,8 @@ static const luaL_Reg lovrGraphics[] = {
// State
{ "reset", l_lovrGraphicsReset },
{ "getAlphaSampling", l_lovrGraphicsGetAlphaSampling },
{ "setAlphaSampling", l_lovrGraphicsSetAlphaSampling },
{ "getBackgroundColor", l_lovrGraphicsGetBackgroundColor },
{ "setBackgroundColor", l_lovrGraphicsSetBackgroundColor },
{ "getBlendMode", l_lovrGraphicsGetBlendMode },

View File

@ -203,6 +203,17 @@ void lovrGraphicsPopPipeline() {
state.pipeline = &state.pipelines[state.pipelineIndex];
}
bool lovrGraphicsGetAlphaSampling() {
return state.pipeline->alphaSampling;
}
void lovrGraphicsSetAlphaSampling(bool sample) {
if (state.pipeline->alphaSampling != sample) {
state.pipeline->alphaSampling = sample;
state.pipeline->dirty = true;
}
}
Color lovrGraphicsGetBackgroundColor() {
return state.pipeline->backgroundColor;
}
@ -938,14 +949,15 @@ void lovrGraphicsPrint(const char* str, mat4 transform, float wrap, HorizontalAl
lovrGraphicsMatrixTransform(transform);
lovrGraphicsScale((float[3]) { scale, scale, scale });
lovrGraphicsTranslate((float[3]) { 0, offsety, 0 });
state.pipeline->alphaCoverage = true;
lovrGraphicsPushPipeline();
lovrGraphicsSetAlphaSampling(true);
lovrGraphicsDraw(&(DrawCommand) {
.shader = SHADER_FONT,
.diffuseTexture = font->texture,
.mode = MESH_TRIANGLES,
.vertex.count = vertexCount
});
state.pipeline->alphaCoverage = false;
lovrGraphicsPopPipeline();
lovrGraphicsPop();
}

View File

@ -100,7 +100,7 @@ typedef struct {
} Camera;
typedef struct {
bool alphaCoverage;
bool alphaSampling;
Color backgroundColor;
BlendMode blendMode;
BlendAlphaMode blendAlphaMode;
@ -179,6 +179,8 @@ Buffer* lovrGraphicsGetIdentityBuffer();
void lovrGraphicsReset();
void lovrGraphicsPushPipeline();
void lovrGraphicsPopPipeline();
bool lovrGraphicsGetAlphaSampling();
void lovrGraphicsSetAlphaSampling(bool alphaSampling);
Color lovrGraphicsGetBackgroundColor();
void lovrGraphicsSetBackgroundColor(Color color);
void lovrGraphicsGetBlendMode(BlendMode* mode, BlendAlphaMode* alphaMode);

View File

@ -48,7 +48,7 @@ typedef enum {
static struct {
Texture* defaultTexture;
bool alphaCoverage;
bool alphaToCoverage;
BlendMode blendMode;
BlendAlphaMode blendAlphaMode;
bool culling;
@ -633,7 +633,7 @@ void lovrGpuInit(bool srgb, getProcAddressProc getProcAddress) {
glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
state.srgb = srgb;
state.alphaCoverage = false;
state.alphaToCoverage = false;
glDisable(GL_SAMPLE_ALPHA_TO_COVERAGE);
state.blendMode = BLEND_ALPHA;
@ -690,9 +690,9 @@ void lovrGpuDestroy() {
void lovrGpuBindPipeline(Pipeline* pipeline) {
// Alpha Coverage
if (state.alphaCoverage != pipeline->alphaCoverage) {
state.alphaCoverage = pipeline->alphaCoverage;
if (state.alphaCoverage) {
if (state.alphaToCoverage != pipeline->alphaSampling) {
state.alphaToCoverage = pipeline->alphaSampling;
if (state.alphaToCoverage) {
glEnable(GL_SAMPLE_ALPHA_TO_COVERAGE);
} else {
glDisable(GL_SAMPLE_ALPHA_TO_COVERAGE);