Use ShaderBlock for transforms/colors;

This commit is contained in:
bjorn 2018-12-07 18:19:03 -08:00
parent e2886d3bb5
commit 40454d1380
3 changed files with 31 additions and 32 deletions

View File

@ -76,6 +76,14 @@ void lovrGraphicsSetWindow(WindowFlags* flags) {
vertexFormatAppend(&format, "lovrNormal", ATTR_FLOAT, 3);
vertexFormatAppend(&format, "lovrTexCoord", ATTR_FLOAT, 2);
state.defaultMesh = lovrMeshCreate(65536, format, MESH_TRIANGLES, USAGE_STREAM, false);
vec_uniform_t uniforms;
vec_init(&uniforms);
vec_push(&uniforms, ((Uniform) { .name = "model", .type = UNIFORM_MATRIX, .components = 4, .count = MAX_BATCHES }));
vec_push(&uniforms, ((Uniform) { .name = "color", .type = UNIFORM_FLOAT, .components = 4, .count = MAX_BATCHES }));
state.block = lovrShaderBlockCreate(&uniforms, BLOCK_UNIFORM, USAGE_STREAM);
vec_deinit(&uniforms);
lovrGraphicsReset();
state.initialized = true;
}
@ -403,36 +411,20 @@ void lovrGraphicsDraw(DrawCommand* draw) {
if (!shader) shader = state.defaultShaders[draw->shader] = lovrShaderCreateDefault(draw->shader);
mat4 transform = state.transforms[state.transform];
lovrShaderSetMatrices(shader, "lovrModel", transform, 0, 16);
lovrShaderSetMatrices(shader, "lovrViews", state.camera.viewMatrix[0], 0, 32);
lovrShaderSetMatrices(shader, "lovrProjections", state.camera.projection[0], 0, 32);
float modelView[32];
mat4_multiply(mat4_set(modelView, state.camera.viewMatrix[0]), transform);
mat4_multiply(mat4_set(modelView + 16, state.camera.viewMatrix[1]), transform);
lovrShaderSetMatrices(shader, "lovrTransforms", modelView, 0, 32);
Buffer* drawDataBuffer = lovrShaderBlockGetBuffer(state.block);
if (lovrShaderHasUniform(shader, "lovrNormalMatrices")) {
if (mat4_invert(modelView) && mat4_invert(modelView + 16)) {
mat4_transpose(modelView);
mat4_transpose(modelView + 16);
} else {
mat4_identity(modelView);
mat4_identity(modelView + 16);
}
struct {
float model[MAX_BATCHES][16];
float color[MAX_BATCHES][4];
}* drawData = lovrBufferMap(drawDataBuffer, 0);
float normalMatrices[18] = {
modelView[0], modelView[1], modelView[2],
modelView[4], modelView[5], modelView[6],
modelView[8], modelView[9], modelView[10],
modelView[16], modelView[17], modelView[18],
modelView[20], modelView[21], modelView[22],
modelView[24], modelView[25], modelView[26]
};
lovrShaderSetMatrices(shader, "lovrNormalMatrices", normalMatrices, 0, 18);
}
memcpy(drawData->model[0], transform, 16 * sizeof(float));
memcpy(drawData->color[0], (float*) &pipeline->color, 4 * sizeof(float));
lovrBufferFlush(drawDataBuffer, 0, sizeof(*drawData));
lovrShaderSetBlock(shader, "lovrDrawData", state.block, ACCESS_READ);
if (draw->pose) {
lovrShaderSetMatrices(shader, "lovrPose", draw->pose, 0, MAX_BONES * 16);
@ -441,7 +433,6 @@ void lovrGraphicsDraw(DrawCommand* draw) {
}
lovrShaderSetInts(shader, "lovrViewportCount", &viewportCount, 0, 1);
lovrShaderSetColor(shader, "lovrColor", pipeline->color);
lovrShaderSetFloats(shader, "lovrPointSize", &pipeline->pointSize, 0, 1);
for (int i = 0; i < MAX_MATERIAL_SCALARS; i++) {

View File

@ -14,6 +14,7 @@
#define MAX_TRANSFORMS 64
#define MAX_PIPELINES 16
#define MAX_BATCHES 256
typedef void (*StencilCallback)(void* userdata);
@ -143,6 +144,7 @@ typedef struct {
Material* defaultMaterial;
Font* defaultFont;
Mesh* defaultMesh;
ShaderBlock* block;
TextureFilter defaultFilter;
float transforms[MAX_TRANSFORMS][16];
int transform;

View File

@ -5,8 +5,9 @@ const char* lovrShaderVertexPrefix = ""
"#define MAX_BONES 48 \n"
"#define lovrView lovrViews[lovrViewportIndex] \n"
"#define lovrProjection lovrProjections[lovrViewportIndex] \n"
"#define lovrTransform lovrTransforms[lovrViewportIndex] \n"
"#define lovrNormalMatrix lovrNormalMatrices[lovrViewportIndex] \n"
"#define lovrModel lovrDrawData.model[0] \n"
"#define lovrTransform (lovrView * lovrModel) \n"
"#define lovrNormalMatrix mat3(transpose(inverse(lovrTransform))) \n"
"#define lovrInstanceID (gl_InstanceID / lovrViewportCount) \n"
"#define lovrPoseMatrix ("
"lovrPose[lovrBones[0]] * lovrBoneWeights[0] +"
@ -23,11 +24,12 @@ const char* lovrShaderVertexPrefix = ""
"in vec4 lovrBoneWeights; \n"
"out vec2 texCoord; \n"
"out vec4 vertexColor; \n"
"uniform mat4 lovrModel; \n"
"uniform lovrDrawData { \n"
" mat4 model[256]; \n"
" vec4 color[256]; \n"
"} lovrDrawData; \n"
"uniform mat4 lovrViews[2]; \n"
"uniform mat4 lovrProjections[2]; \n"
"uniform mat4 lovrTransforms[2]; \n"
"uniform mat3 lovrNormalMatrices[2]; \n"
"uniform mat3 lovrMaterialTransform; \n"
"uniform float lovrPointSize; \n"
"uniform mat4 lovrPose[MAX_BONES]; \n"
@ -53,12 +55,16 @@ const char* lovrShaderVertexSuffix = ""
const char* lovrShaderFragmentPrefix = ""
"#define PIXEL PIXEL \n"
"#define FRAGMENT FRAGMENT \n"
"#define lovrColor lovrDrawData.color[0] \n"
"in vec2 texCoord; \n"
"in vec4 vertexColor; \n"
"out vec4 lovrCanvas[gl_MaxDrawBuffers]; \n"
"uniform lovrDrawData { \n"
" mat4 model[256]; \n"
" vec4 color[256]; \n"
"} lovrDrawData; \n"
"uniform float lovrMetalness; \n"
"uniform float lovrRoughness; \n"
"uniform vec4 lovrColor; \n"
"uniform vec4 lovrDiffuseColor; \n"
"uniform vec4 lovrEmissiveColor; \n"
"uniform sampler2D lovrDiffuseTexture; \n"