mirror of https://github.com/bjornbytes/lovr.git
Color object;
This commit is contained in:
parent
9efa89768c
commit
b65673bc3f
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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() {
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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));
|
||||
|
|
Loading…
Reference in New Issue