diff --git a/src/glfw.c b/src/glfw.c index eb3bb385..42219733 100644 --- a/src/glfw.c +++ b/src/glfw.c @@ -39,6 +39,8 @@ void initGlfw(GLFWerrorfun onError, GLFWwindowclosefun onClose, void* userPointe glfwSetTime(0); glfwSwapInterval(0); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glEnable(GL_DEPTH_TEST); glDepthFunc(GL_LESS); } diff --git a/src/graphics/graphics.c b/src/graphics/graphics.c index 7cf85cde..17ec8f4d 100644 --- a/src/graphics/graphics.c +++ b/src/graphics/graphics.c @@ -19,9 +19,8 @@ void lovrGraphicsInit() { state.projection = mat4_init(); state.lastTransform = mat4_init(); state.lastProjection = mat4_init(); - state.defaultShader = lovrGraphicsNewShader(lovrDefaultVertexShader, lovrDefaultFragmentShader); - + state.lastColor = LOVR_COLOR(255, 255, 255, 255); lovrGraphicsReset(); } @@ -39,10 +38,10 @@ void lovrGraphicsReset() { memset(state.lastTransform, 0, 16); memset(state.lastProjection, 0, 16); - // TODO customize via lovr.conf - lovrGraphicsSetProjection(.1f, 100.f, 67 * M_PI / 180); - + lovrGraphicsSetProjection(.1f, 100.f, 67 * M_PI / 180); // TODO customize via lovr.conf lovrGraphicsSetShader(state.defaultShader); + lovrGraphicsSetBackgroundColor(0, 0, 0, 0); + lovrGraphicsSetColor(255, 255, 255, 255); lovrGraphicsSetColorMask(1, 1, 1, 1); } @@ -88,6 +87,18 @@ void lovrGraphicsPrepare() { lovrShaderSendFloatMat4(shader, uniformId, projection); memcpy(lastProjection, projection, 16 * sizeof(float)); } + + if (state.lastColor != state.color) { + int uniformId = lovrShaderGetUniformId(shader, "lovrColor"); + float color[4] = { + LOVR_COLOR_R(state.color) / 255.f, + LOVR_COLOR_G(state.color) / 255.f, + LOVR_COLOR_B(state.color) / 255.f, + LOVR_COLOR_A(state.color) / 255.f + }; + lovrShaderSendFloatVec4(shader, uniformId, color); + state.lastColor = state.color; + } } void lovrGraphicsGetBackgroundColor(float* r, float* g, float* b, float* a) { @@ -103,6 +114,17 @@ void lovrGraphicsSetBackgroundColor(float r, float g, float b, float a) { glClearColor(r / 255, g / 255, b / 255, a / 255); } +void lovrGraphicsGetColor(unsigned char* r, unsigned char* g, unsigned char* b, unsigned char* a) { + *r = LOVR_COLOR_R(state.color); + *g = LOVR_COLOR_G(state.color); + *b = LOVR_COLOR_B(state.color); + *a = LOVR_COLOR_A(state.color); +} + +void lovrGraphicsSetColor(unsigned char r, unsigned char g, unsigned char b, unsigned char a) { + state.color = LOVR_COLOR(r, g, b, a); +} + void lovrGraphicsGetColorMask(unsigned char* r, unsigned char* g, unsigned char* b, unsigned char* a) { unsigned char mask = state.colorMask; *r = mask & 0x1; diff --git a/src/graphics/graphics.h b/src/graphics/graphics.h index daaa20a4..40df4417 100644 --- a/src/graphics/graphics.h +++ b/src/graphics/graphics.h @@ -7,6 +7,12 @@ #define LOVR_GRAPHICS_TYPES typedef vec_t(mat4) vec_mat4_t; +#define LOVR_COLOR(r, g, b, a) ((a << 0) | (b << 8) | (g << 16) | (r << 24)) +#define LOVR_COLOR_R(c) (c >> 24 & 0xff) +#define LOVR_COLOR_G(c) (c >> 16 & 0xff) +#define LOVR_COLOR_B(c) (c >> 8 & 0xff) +#define LOVR_COLOR_A(c) (c >> 0 & 0xff) + typedef struct { Shader* activeShader; Shader* defaultShader; @@ -14,6 +20,8 @@ typedef struct { mat4 lastTransform; mat4 projection; mat4 lastProjection; + unsigned int color; + unsigned int lastColor; unsigned char colorMask; } GraphicsState; #endif @@ -25,6 +33,8 @@ void lovrGraphicsPresent(); void lovrGraphicsPrepare(); void lovrGraphicsGetBackgroundColor(float* r, float* g, float* b, float* a); void lovrGraphicsSetBackgroundColor(float r, float g, float b, float a); +void lovrGraphicsGetColor(unsigned char* r, unsigned char* g, unsigned char* b, unsigned char* a); +void lovrGraphicsSetColor(unsigned char r, unsigned char g, unsigned char b, unsigned char a); void lovrGraphicsGetColorMask(unsigned char* r, unsigned char* g, unsigned char* b, unsigned char* a); void lovrGraphicsSetColorMask(unsigned char r, unsigned char g, unsigned char b, unsigned char a); Shader* lovrGraphicsGetShader(); diff --git a/src/lovr/graphics.c b/src/lovr/graphics.c index f538d962..bbf686df 100644 --- a/src/lovr/graphics.c +++ b/src/lovr/graphics.c @@ -11,6 +11,8 @@ const luaL_Reg lovrGraphics[] = { { "present", l_lovrGraphicsPresent }, { "getBackgroundColor", l_lovrGraphicsGetBackgroundColor }, { "setBackgroundColor", l_lovrGraphicsSetBackgroundColor }, + { "getColor", l_lovrGraphicsGetColor }, + { "setColor", l_lovrGraphicsSetColor }, { "getColorMask", l_lovrGraphicsGetColorMask }, { "setColorMask", l_lovrGraphicsSetColorMask }, { "setShader", l_lovrGraphicsSetShader }, @@ -88,6 +90,31 @@ int l_lovrGraphicsSetBackgroundColor(lua_State* L) { return 0; } +int l_lovrGraphicsGetColor(lua_State* L) { + unsigned char r, g, b, a; + lovrGraphicsGetColor(&r, &g, &b, &a); + lua_pushinteger(L, r); + lua_pushinteger(L, g); + lua_pushinteger(L, b); + lua_pushinteger(L, a); + return 4; +} + +int l_lovrGraphicsSetColor(lua_State* L) { + if (lua_gettop(L) <= 1 && lua_isnoneornil(L, 1)) { + lovrGraphicsSetColor(255, 255, 255, 255); + return 0; + } + + unsigned char r = lua_tointeger(L, 1); + unsigned char g = lua_tointeger(L, 2); + unsigned char b = lua_tointeger(L, 3); + unsigned char a = lua_isnoneornil(L, 4) ? 255 : lua_tointeger(L, 4); + lovrGraphicsSetColor(r, g, b, a); + + return 0; +} + int l_lovrGraphicsGetColorMask(lua_State* L) { unsigned char r, g, b, a; lovrGraphicsGetColorMask(&r, &g, &b, &a); diff --git a/src/lovr/graphics.h b/src/lovr/graphics.h index 9fc74431..dd39912f 100644 --- a/src/lovr/graphics.h +++ b/src/lovr/graphics.h @@ -13,6 +13,8 @@ int l_lovrGraphicsClear(lua_State* L); int l_lovrGraphicsPresent(lua_State* L); int l_lovrGraphicsGetBackgroundColor(lua_State* L); int l_lovrGraphicsSetBackgroundColor(lua_State* L); +int l_lovrGraphicsGetColor(lua_State* L); +int l_lovrGraphicsSetColor(lua_State* L); int l_lovrGraphicsGetColorMask(lua_State* L); int l_lovrGraphicsSetColorMask(lua_State* L); int l_lovrGraphicsGetShader(lua_State* L);