OpenGL: dirty bit for GPU matrix API
Have matrices changed since the most recent bind? Part of T49450
This commit is contained in:
parent
225edf4e66
commit
a92d20a0a4
|
@ -135,6 +135,7 @@ void gpuMatrixBegin3D_legacy(void);
|
|||
|
||||
/* set uniform values for currently bound shader */
|
||||
void gpuBindMatrices(GLuint program);
|
||||
bool gpuMatricesDirty(void); /* since last bind */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
|
|
|
@ -52,7 +52,9 @@ typedef struct {
|
|||
|
||||
MatrixMode mode;
|
||||
unsigned top; /* of current stack (would have to replicate if gpuResume2D/3D are implemented) */
|
||||
|
||||
|
||||
bool dirty;
|
||||
|
||||
/* TODO: cache of derived matrices (Normal, MVP, inverse MVP, etc)
|
||||
* generate as needed for shaders, invalidate when original matrices change
|
||||
*
|
||||
|
@ -95,6 +97,7 @@ void gpuMatrixBegin3D_legacy()
|
|||
/* copy top matrix from each legacy stack into new fresh stack */
|
||||
state.mode = MATRIX_MODE_3D;
|
||||
state.top = 0;
|
||||
state.dirty = true;
|
||||
glGetFloatv(GL_MODELVIEW_MATRIX, (float*)ModelView3D);
|
||||
glGetFloatv(GL_PROJECTION_MATRIX, (float*)Projection3D);
|
||||
}
|
||||
|
@ -146,6 +149,7 @@ void gpuPopMatrix()
|
|||
BLI_assert(state.mode != MATRIX_MODE_INACTIVE);
|
||||
BLI_assert(state.top > 0);
|
||||
state.top--;
|
||||
state.dirty = true;
|
||||
}
|
||||
|
||||
void gpuLoadMatrix3D(const float m[4][4])
|
||||
|
@ -153,6 +157,7 @@ void gpuLoadMatrix3D(const float m[4][4])
|
|||
BLI_assert(state.mode == MATRIX_MODE_3D);
|
||||
copy_m4_m4(ModelView3D, m);
|
||||
CHECKMAT(ModelView3D);
|
||||
state.dirty = true;
|
||||
}
|
||||
|
||||
void gpuLoadMatrix2D(const float m[3][3])
|
||||
|
@ -160,6 +165,7 @@ void gpuLoadMatrix2D(const float m[3][3])
|
|||
BLI_assert(state.mode == MATRIX_MODE_2D);
|
||||
copy_m3_m3(ModelView2D, m);
|
||||
CHECKMAT(ModelView2D);
|
||||
state.dirty = true;
|
||||
}
|
||||
|
||||
void gpuLoadIdentity()
|
||||
|
@ -174,6 +180,7 @@ void gpuLoadIdentity()
|
|||
default:
|
||||
BLI_assert(false);
|
||||
}
|
||||
state.dirty = true;
|
||||
}
|
||||
|
||||
void gpuTranslate2f(float x, float y)
|
||||
|
@ -192,8 +199,8 @@ void gpuTranslate2fv(const float vec[2])
|
|||
|
||||
void gpuTranslate3f(float x, float y, float z)
|
||||
{
|
||||
#if 1
|
||||
BLI_assert(state.mode == MATRIX_MODE_3D);
|
||||
#if 1
|
||||
translate_m4(ModelView3D, x, y, z);
|
||||
CHECKMAT(ModelView3D);
|
||||
#else /* above works well in early testing, below is generic version */
|
||||
|
@ -204,6 +211,7 @@ void gpuTranslate3f(float x, float y, float z)
|
|||
m[3][2] = z;
|
||||
gpuMultMatrix3D(m);
|
||||
#endif
|
||||
state.dirty = true;
|
||||
}
|
||||
|
||||
void gpuTranslate3fv(const float vec[3])
|
||||
|
@ -275,6 +283,7 @@ void gpuMultMatrix3D(const float m[4][4])
|
|||
BLI_assert(state.mode == MATRIX_MODE_3D);
|
||||
mul_m4_m4_pre(ModelView3D, m);
|
||||
CHECKMAT(ModelView3D);
|
||||
state.dirty = true;
|
||||
}
|
||||
|
||||
void gpuMultMatrix2D(const float m[3][3])
|
||||
|
@ -282,6 +291,7 @@ void gpuMultMatrix2D(const float m[3][3])
|
|||
BLI_assert(state.mode == MATRIX_MODE_2D);
|
||||
mul_m3_m3_pre(ModelView2D, m);
|
||||
CHECKMAT(ModelView2D);
|
||||
state.dirty = true;
|
||||
}
|
||||
|
||||
void gpuRotate3fv(float deg, const float axis[3])
|
||||
|
@ -293,10 +303,11 @@ void gpuRotate3fv(float deg, const float axis[3])
|
|||
|
||||
void gpuRotateAxis(float deg, char axis)
|
||||
{
|
||||
#if 1 /* rotate_m4 works in place, right? */
|
||||
BLI_assert(state.mode == MATRIX_MODE_3D);
|
||||
#if 1 /* rotate_m4 works in place, right? */
|
||||
rotate_m4(ModelView3D, axis, DEG2RADF(deg));
|
||||
CHECKMAT(ModelView3D);
|
||||
state.dirty = true;
|
||||
#else /* rotate_m4 creates a new matrix */
|
||||
Mat4 m;
|
||||
rotate_m4(m, axis, DEG2RADF(deg));
|
||||
|
@ -325,6 +336,8 @@ static void mat4_ortho_set(float m[4][4], float left, float right, float bottom,
|
|||
m[1][3] = 0.0f;
|
||||
m[2][3] = 0.0f;
|
||||
m[3][3] = 1.0f;
|
||||
|
||||
state.dirty = true;
|
||||
}
|
||||
|
||||
static void mat4_frustum_set(float m[][4], float left, float right, float bottom, float top, float near, float far)
|
||||
|
@ -348,6 +361,8 @@ static void mat4_frustum_set(float m[][4], float left, float right, float bottom
|
|||
m[1][3] = 0.0f;
|
||||
m[2][3] = -1.0f;
|
||||
m[3][3] = 0.0f;
|
||||
|
||||
state.dirty = true;
|
||||
}
|
||||
|
||||
static void mat4_look_from_origin(float m[4][4], float lookdir[3], float camup[3])
|
||||
|
@ -412,6 +427,8 @@ static void mat4_look_from_origin(float m[4][4], float lookdir[3], float camup[3
|
|||
m[1][3] = 0.0f;
|
||||
m[2][3] = 0.0f;
|
||||
m[3][3] = 1.0f;
|
||||
|
||||
state.dirty = true;
|
||||
}
|
||||
|
||||
void gpuOrtho(float left, float right, float bottom, float top, float near, float far)
|
||||
|
@ -419,6 +436,7 @@ void gpuOrtho(float left, float right, float bottom, float top, float near, floa
|
|||
BLI_assert(state.mode == MATRIX_MODE_3D);
|
||||
mat4_ortho_set(Projection3D, left, right, bottom, top, near, far);
|
||||
CHECKMAT(Projection3D);
|
||||
state.dirty = true;
|
||||
}
|
||||
|
||||
void gpuOrtho2D(float left, float right, float bottom, float top)
|
||||
|
@ -429,6 +447,7 @@ void gpuOrtho2D(float left, float right, float bottom, float top)
|
|||
mat4_ortho_set(m, left, right, bottom, top, -1.0f, 1.0f);
|
||||
copy_m3_m4(Projection2D, m);
|
||||
CHECKMAT(Projection2D);
|
||||
state.dirty = true;
|
||||
}
|
||||
|
||||
void gpuFrustum(float left, float right, float bottom, float top, float near, float far)
|
||||
|
@ -436,6 +455,7 @@ void gpuFrustum(float left, float right, float bottom, float top, float near, fl
|
|||
BLI_assert(state.mode == MATRIX_MODE_3D);
|
||||
mat4_frustum_set(Projection3D, left, right, bottom, top, near, far);
|
||||
CHECKMAT(Projection3D);
|
||||
state.dirty = true;
|
||||
}
|
||||
|
||||
void gpuPerspective(float fovy, float aspect, float near, float far)
|
||||
|
@ -634,4 +654,11 @@ void gpuBindMatrices(GLuint program)
|
|||
|
||||
glUniformMatrix4fv(loc_MVP, 1, GL_FALSE, gpuGetModelViewProjectionMatrix3D(NULL));
|
||||
}
|
||||
|
||||
state.dirty = false;
|
||||
}
|
||||
|
||||
bool gpuMatricesDirty()
|
||||
{
|
||||
return state.dirty;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue