mirror of https://github.com/bjornbytes/lovr.git
Use ShaderBlock for transforms/colors;
This commit is contained in:
parent
e2886d3bb5
commit
40454d1380
|
@ -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++) {
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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"
|
||||
|
|
Loading…
Reference in New Issue