Optimize matrix stack;

This commit is contained in:
bjorn 2016-11-27 10:57:36 -08:00
parent cf6c862aaa
commit 40eeeabcff
2 changed files with 20 additions and 27 deletions

View File

@ -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

View File

@ -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;