Color object;

This commit is contained in:
bjorn 2017-08-02 01:25:56 -07:00
parent 9efa89768c
commit b65673bc3f
7 changed files with 60 additions and 74 deletions

View File

@ -165,22 +165,21 @@ int l_lovrGraphicsPresent(lua_State* L) {
// State
int l_lovrGraphicsGetBackgroundColor(lua_State* L) {
unsigned char r, g, b, a;
lovrGraphicsGetBackgroundColor(&r, &g, &b, &a);
lua_pushnumber(L, r);
lua_pushnumber(L, g);
lua_pushnumber(L, b);
lua_pushnumber(L, a);
Color color = lovrGraphicsGetBackgroundColor();
lua_pushnumber(L, color.r);
lua_pushnumber(L, color.g);
lua_pushnumber(L, color.b);
lua_pushnumber(L, color.a);
return 4;
}
int l_lovrGraphicsSetBackgroundColor(lua_State* L) {
unsigned char r, g, b, a;
r = luaL_checknumber(L, 1);
g = luaL_checknumber(L, 2);
b = luaL_checknumber(L, 3);
a = luaL_optnumber(L, 4, 255.0);
lovrGraphicsSetBackgroundColor(r, g, b, a);
Color color;
color.r = luaL_checknumber(L, 1);
color.g = luaL_checknumber(L, 2);
color.b = luaL_checknumber(L, 3);
color.a = luaL_optnumber(L, 4, 255.0);
lovrGraphicsSetBackgroundColor(color);
return 0;
}
@ -201,42 +200,36 @@ int l_lovrGraphicsSetBlendMode(lua_State* L) {
}
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);
Color color = lovrGraphicsGetColor();
lua_pushinteger(L, color.r);
lua_pushinteger(L, color.g);
lua_pushinteger(L, color.b);
lua_pushinteger(L, color.a);
return 4;
}
int l_lovrGraphicsSetColor(lua_State* L) {
unsigned char r, g, b, a;
r = g = b = a = 0xff;
Color color = { 0xff, 0xff, 0xff, 0xff };
if (lua_gettop(L) == 1 && lua_isnumber(L, 1)) {
unsigned int x = lua_tointeger(L, 1);
r = LOVR_COLOR_R(x);
g = LOVR_COLOR_G(x);
b = LOVR_COLOR_B(x);
a = LOVR_COLOR_A(x);
} else if (lua_istable(L, 1)) {
if (lua_istable(L, 1)) {
for (int i = 1; i <= 4; i++) {
lua_rawgeti(L, 1, i);
}
r = luaL_checknumber(L, -4);
g = luaL_checknumber(L, -3);
b = luaL_checknumber(L, -2);
a = lua_gettop(L) > 1 ? luaL_checknumber(L, 2) : luaL_optnumber(L, -1, 255);
color.r = luaL_checknumber(L, -4);
color.g = luaL_checknumber(L, -3);
color.b = luaL_checknumber(L, -2);
color.a = luaL_optnumber(L, -1, 255);
lua_pop(L, 4);
} else if (lua_gettop(L) >= 3) {
r = lua_tointeger(L, 1);
g = lua_tointeger(L, 2);
b = lua_tointeger(L, 3);
a = lua_isnoneornil(L, 4) ? 255 : lua_tointeger(L, 4);
color.r = lua_tointeger(L, 1);
color.g = lua_tointeger(L, 2);
color.b = lua_tointeger(L, 3);
color.a = lua_isnoneornil(L, 4) ? 255 : lua_tointeger(L, 4);
} else {
return luaL_error(L, "Invalid color, expected 3 numbers, 4 numbers, or a table");
}
lovrGraphicsSetColor(r, g, b, a);
lovrGraphicsSetColor(color);
return 0;
}

View File

@ -123,9 +123,9 @@ void lovrGraphicsReset() {
lovrGraphicsSetProjection(mat4_perspective(projection, .01f, 100.f, 67 * M_PI / 180., (float) w / h));
lovrGraphicsSetShader(NULL);
lovrGraphicsBindTexture(NULL);
lovrGraphicsSetBackgroundColor(0, 0, 0, 255);
lovrGraphicsSetBackgroundColor((Color) { 0, 0, 0, 0 });
lovrGraphicsSetBlendMode(BLEND_ALPHA, BLEND_ALPHA_MULTIPLY);
lovrGraphicsSetColor(255, 255, 255, 255);
lovrGraphicsSetColor((Color) { 255, 255, 255, 255 });
lovrGraphicsSetLineWidth(1);
lovrGraphicsSetPointSize(1);
lovrGraphicsSetCullingEnabled(0);
@ -153,16 +153,13 @@ void lovrGraphicsPrepare() {
// State
void lovrGraphicsGetBackgroundColor(unsigned char* r, unsigned char* g, unsigned char* b, unsigned char* a) {
*r = LOVR_COLOR_R(state.backgroundColor);
*g = LOVR_COLOR_G(state.backgroundColor);
*b = LOVR_COLOR_B(state.backgroundColor);
*a = LOVR_COLOR_A(state.backgroundColor);
Color lovrGraphicsGetBackgroundColor() {
return state.backgroundColor;
}
void lovrGraphicsSetBackgroundColor(unsigned char r, unsigned char g, unsigned char b, unsigned char a) {
state.backgroundColor = LOVR_COLOR(r, g, b, a);
glClearColor(r / 255., g / 255., b / 255., a / 255.);
void lovrGraphicsSetBackgroundColor(Color color) {
state.backgroundColor = color;
glClearColor(color.r / 255., color.g / 255., color.b / 255., color.a / 255.);
}
void lovrGraphicsGetBlendMode(BlendMode* mode, BlendAlphaMode* alphaMode) {
@ -220,15 +217,12 @@ void lovrGraphicsSetBlendMode(BlendMode mode, BlendAlphaMode alphaMode) {
}
}
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);
Color lovrGraphicsGetColor() {
return 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 lovrGraphicsSetColor(Color color) {
state.color = color;
}
int lovrGraphicsIsCullingEnabled() {

View File

@ -84,10 +84,10 @@ typedef struct {
vec_float_t shapeData;
vec_uint_t shapeIndices;
unsigned int backgroundColor;
Color backgroundColor;
BlendMode blendMode;
BlendAlphaMode blendAlphaMode;
unsigned int color;
Color color;
int culling;
TextureFilter defaultFilter;
CompareMode depthTest;
@ -107,12 +107,12 @@ void lovrGraphicsPresent();
void lovrGraphicsPrepare();
// State
void lovrGraphicsGetBackgroundColor(unsigned char* r, unsigned char* g, unsigned char* b, unsigned char* a);
void lovrGraphicsSetBackgroundColor(unsigned char r, unsigned char g, unsigned char b, unsigned char a);
Color lovrGraphicsGetBackgroundColor();
void lovrGraphicsSetBackgroundColor(Color color);
void lovrGraphicsGetBlendMode(BlendMode* mode, BlendAlphaMode* alphaMode);
void lovrGraphicsSetBlendMode(BlendMode mode, BlendAlphaMode alphaMode);
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);
Color lovrGraphicsGetColor();
void lovrGraphicsSetColor(Color color);
int lovrGraphicsIsCullingEnabled();
void lovrGraphicsSetCullingEnabled(int culling);
TextureFilter lovrGraphicsGetDefaultFilter();

View File

@ -179,7 +179,7 @@ Shader* lovrShaderCreate(const char* vertexSource, const char* fragmentSource) {
shader->id = id;
mat4_identity(shader->transform);
mat4_identity(shader->projection);
shader->color = 0;
shader->color = (Color) { 0, 0, 0, 0 };
// Send initial uniform values to shader
lovrShaderBind(shader, shader->transform, shader->projection, shader->color, 1);
@ -194,7 +194,7 @@ void lovrShaderDestroy(const Ref* ref) {
free(shader);
}
void lovrShaderBind(Shader* shader, mat4 transform, mat4 projection, unsigned int color, int force) {
void lovrShaderBind(Shader* shader, mat4 transform, mat4 projection, Color color, int force) {
// Bind shader if necessary
int program;
@ -235,14 +235,9 @@ void lovrShaderBind(Shader* shader, mat4 transform, mat4 projection, unsigned in
}
// Update color if necessary
if (force || shader->color != color) {
if (force || memcmp(&shader->color, &color, 4 * sizeof(uint8_t))) {
int uniformId = lovrShaderGetUniformId(shader, "lovrColor");
float c[4] = {
LOVR_COLOR_R(color) / 255.f,
LOVR_COLOR_G(color) / 255.f,
LOVR_COLOR_B(color) / 255.f,
LOVR_COLOR_A(color) / 255.f
};
float c[4] = { color.r / 255., color.g / 255., color.b / 255., color.a / 255. };
lovrShaderSendFloatVec4(shader, uniformId, 1, c);
shader->color = color;
}

View File

@ -27,7 +27,7 @@ typedef struct {
map_uniform_t uniforms;
float transform[16];
float projection[16];
unsigned int color;
Color color;
} Shader;
extern const char* lovrShaderVertexPrefix;
@ -44,7 +44,7 @@ GLuint linkShaders(GLuint vertexShader, GLuint fragmentShader);
Shader* lovrShaderCreate(const char* vertexSource, const char* fragmentSource);
void lovrShaderDestroy(const Ref* ref);
void lovrShaderBind(Shader* shader, mat4 transform, mat4 projection, unsigned int color, int force);
void lovrShaderBind(Shader* shader, mat4 transform, mat4 projection, Color color, int force);
int lovrShaderGetAttributeId(Shader* shader, const char* name);
int lovrShaderGetUniformId(Shader* shader, const char* name);
int lovrShaderGetUniformType(Shader* shader, const char* name, GLenum* type, int* count);

View File

@ -662,13 +662,12 @@ void lovrHeadsetRenderTo(headsetRenderCallback callback, void* userdata) {
lovrGraphicsPopCanvas();
if (state.isMirrored) {
unsigned char r, g, b, a;
lovrGraphicsGetColor(&r, &g, &b, &a);
lovrGraphicsSetColor(255, 255, 255, 255);
Color oldColor = lovrGraphicsGetColor();
lovrGraphicsSetColor((Color) { 255, 255, 255, 255 });
Shader* lastShader = lovrGraphicsGetShader();
lovrGraphicsSetShader(NULL);
lovrGraphicsPlaneFullscreen(state.texture);
lovrGraphicsSetShader(lastShader);
lovrGraphicsSetColor(r, g, b, a);
lovrGraphicsSetColor(oldColor);
}
}

View File

@ -1,4 +1,5 @@
#include "lib/vec/vec.h"
#include <stdint.h>
#include <stddef.h>
#pragma once
@ -17,6 +18,10 @@ typedef struct ref {
int count;
} Ref;
typedef struct {
uint8_t r, g, b, a;
} Color;
void error(const char* format, ...);
void lovrSleep(double seconds);
void* lovrAlloc(size_t size, void (*destructor)(const Ref* ref));