mirror of https://github.com/bjornbytes/lovr.git
Optimize matrix stack;
This commit is contained in:
parent
cf6c862aaa
commit
40eeeabcff
|
@ -14,7 +14,9 @@ static GraphicsState state;
|
||||||
// Base
|
// Base
|
||||||
|
|
||||||
void lovrGraphicsInit() {
|
void lovrGraphicsInit() {
|
||||||
vec_init(&state.transforms);
|
for (int i = 0; i < MAX_TRANSFORMS; i++) {
|
||||||
|
state.transforms[i] = mat4_init();
|
||||||
|
}
|
||||||
state.projection = mat4_init();
|
state.projection = mat4_init();
|
||||||
state.defaultShader = lovrShaderCreate(lovrDefaultVertexShader, lovrDefaultFragmentShader);
|
state.defaultShader = lovrShaderCreate(lovrDefaultVertexShader, lovrDefaultFragmentShader);
|
||||||
state.skyboxShader = lovrShaderCreate(lovrSkyboxVertexShader, lovrSkyboxFragmentShader);
|
state.skyboxShader = lovrShaderCreate(lovrSkyboxVertexShader, lovrSkyboxFragmentShader);
|
||||||
|
@ -33,7 +35,9 @@ void lovrGraphicsInit() {
|
||||||
void lovrGraphicsDestroy() {
|
void lovrGraphicsDestroy() {
|
||||||
lovrGraphicsSetShader(NULL);
|
lovrGraphicsSetShader(NULL);
|
||||||
glUseProgram(0);
|
glUseProgram(0);
|
||||||
vec_deinit(&state.transforms);
|
for (int i = 0; i < MAX_TRANSFORMS; i++) {
|
||||||
|
mat4_deinit(state.transforms[i]);
|
||||||
|
}
|
||||||
mat4_deinit(state.projection);
|
mat4_deinit(state.projection);
|
||||||
lovrRelease(&state.defaultShader->ref);
|
lovrRelease(&state.defaultShader->ref);
|
||||||
lovrRelease(&state.skyboxShader->ref);
|
lovrRelease(&state.skyboxShader->ref);
|
||||||
|
@ -46,16 +50,7 @@ void lovrGraphicsDestroy() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrGraphicsReset() {
|
void lovrGraphicsReset() {
|
||||||
int i;
|
state.transform = 0;
|
||||||
mat4 matrix;
|
|
||||||
|
|
||||||
vec_foreach(&state.transforms, matrix, i) {
|
|
||||||
mat4_deinit(matrix);
|
|
||||||
}
|
|
||||||
|
|
||||||
vec_clear(&state.transforms);
|
|
||||||
vec_push(&state.transforms, mat4_init());
|
|
||||||
|
|
||||||
lovrGraphicsSetProjection(.1f, 100.f, 67 * M_PI / 180); // TODO customize via lovr.conf
|
lovrGraphicsSetProjection(.1f, 100.f, 67 * M_PI / 180); // TODO customize via lovr.conf
|
||||||
lovrGraphicsSetShader(NULL);
|
lovrGraphicsSetShader(NULL);
|
||||||
lovrGraphicsBindTexture(NULL);
|
lovrGraphicsBindTexture(NULL);
|
||||||
|
@ -91,7 +86,7 @@ void lovrGraphicsPresent() {
|
||||||
|
|
||||||
void lovrGraphicsPrepare() {
|
void lovrGraphicsPrepare() {
|
||||||
Shader* shader = lovrGraphicsGetShader();
|
Shader* shader = lovrGraphicsGetShader();
|
||||||
lovrShaderBind(shader, vec_last(&state.transforms), state.projection, state.color, 0);
|
lovrShaderBind(shader, state.transforms[state.transform], state.projection, state.color, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
// State
|
// State
|
||||||
|
@ -282,34 +277,29 @@ int lovrGraphicsGetHeight() {
|
||||||
// Transforms
|
// Transforms
|
||||||
|
|
||||||
int lovrGraphicsPush() {
|
int lovrGraphicsPush() {
|
||||||
vec_mat4_t* transforms = &state.transforms;
|
if (++state.transform >= MAX_TRANSFORMS) { return 1; }
|
||||||
if (transforms->length >= 64) { return 1; }
|
memcpy(state.transforms[state.transform], state.transforms[state.transform - 1], 16 * sizeof(float));
|
||||||
vec_push(transforms, mat4_copy(vec_last(transforms)));
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int lovrGraphicsPop() {
|
int lovrGraphicsPop() {
|
||||||
vec_mat4_t* transforms = &state.transforms;
|
return --state.transform < 0;
|
||||||
if (transforms->length <= 1) { return 1; }
|
|
||||||
mat4_deinit(vec_pop(transforms));
|
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrGraphicsOrigin() {
|
void lovrGraphicsOrigin() {
|
||||||
vec_mat4_t* transforms = &state.transforms;
|
mat4_setIdentity(state.transforms[state.transform]);
|
||||||
mat4_setIdentity(vec_last(transforms));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrGraphicsTranslate(float x, float y, float z) {
|
void lovrGraphicsTranslate(float x, float y, float z) {
|
||||||
mat4_translate(vec_last(&state.transforms), x, y, z);
|
mat4_translate(state.transforms[state.transform], x, y, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrGraphicsRotate(float w, float x, float y, float z) {
|
void lovrGraphicsRotate(float w, float x, float y, float z) {
|
||||||
mat4_rotate(vec_last(&state.transforms), w, x, y, z);
|
mat4_rotate(state.transforms[state.transform], w, x, y, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrGraphicsScale(float x, float y, float z) {
|
void lovrGraphicsScale(float x, float y, float z) {
|
||||||
mat4_scale(vec_last(&state.transforms), x, y, z);
|
mat4_scale(state.transforms[state.transform], x, y, z);
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrGraphicsTransform(float tx, float ty, float tz, float sx, float sy, float sz, float angle, float ax, float ay, float az) {
|
void lovrGraphicsTransform(float tx, float ty, float tz, float sx, float sy, float sz, float angle, float ax, float ay, float az) {
|
||||||
|
@ -340,7 +330,7 @@ void lovrGraphicsTransform(float tx, float ty, float tz, float sx, float sy, flo
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrGraphicsMatrixTransform(mat4 transform) {
|
void lovrGraphicsMatrixTransform(mat4 transform) {
|
||||||
mat4_multiply(vec_last(&state.transforms), transform);
|
mat4_multiply(state.transforms[state.transform], transform);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Primitives
|
// Primitives
|
||||||
|
|
|
@ -8,6 +8,8 @@
|
||||||
#ifndef LOVR_GRAPHICS_TYPES
|
#ifndef LOVR_GRAPHICS_TYPES
|
||||||
#define LOVR_GRAPHICS_TYPES
|
#define LOVR_GRAPHICS_TYPES
|
||||||
|
|
||||||
|
#define MAX_TRANSFORMS 64
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
int x;
|
int x;
|
||||||
int y;
|
int y;
|
||||||
|
@ -40,7 +42,8 @@ typedef struct {
|
||||||
Shader* defaultShader;
|
Shader* defaultShader;
|
||||||
Shader* skyboxShader;
|
Shader* skyboxShader;
|
||||||
Texture* defaultTexture;
|
Texture* defaultTexture;
|
||||||
vec_mat4_t transforms;
|
int transform;
|
||||||
|
mat4 transforms[MAX_TRANSFORMS];
|
||||||
mat4 projection;
|
mat4 projection;
|
||||||
unsigned int color;
|
unsigned int color;
|
||||||
char colorMask;
|
char colorMask;
|
||||||
|
|
Loading…
Reference in New Issue