Fix gaps on rendered mesh during rotation

Gaps caused by mistakenly calculating the transformation matrix per face loaded
in causing the matrix to continually update rotation prematurely.
This commit is contained in:
Doyle Thai 2017-06-08 22:38:29 +10:00
parent 285d3d2681
commit d9f50d4581
1 changed files with 41 additions and 39 deletions

View File

@ -1326,6 +1326,37 @@ void DTRRender_Mesh(DTRRenderBuffer *const renderBuffer, DTRMesh *const mesh, co
{
if (!mesh) return;
DqnMat4 viewPModelViewProjection = {};
{
LOCAL_PERSIST f32 rotateDegrees = 0;
rotateDegrees += dt * 20.0f;
// Create model matrix
DqnMat4 translateMatrix = DqnMat4_Translate(pos.x, pos.y, pos.z);
DqnMat4 scaleMatrix = DqnMat4_Scale(scale, scale, scale);
DqnMat4 rotateMatrix =
DqnMat4_Rotate(DQN_DEGREES_TO_RADIANS(rotateDegrees), 0.0f, 1.0f, 0.0f);
DqnMat4 modelMatrix = DqnMat4_Mul(translateMatrix, DqnMat4_Mul(rotateMatrix, scaleMatrix));
// Create camera matrix
DqnV3 eye = DqnV3_3f(0, 0, 1);
DqnV3 up = DqnV3_3f(0, 1, 0);
DqnV3 center = DqnV3_3f(0, 0, 0);
DqnMat4 viewMatrix = DqnMat4_LookAt(eye, center, up);
// Create projection matrix
f32 aspectRatio = (f32)renderBuffer->width / (f32)renderBuffer->height;
DqnMat4 perspective = DqnMat4_Perspective(80.0f, aspectRatio, 0.5f, 100.0f);
perspective = DqnMat4_Identity();
perspective.e[2][3] = -1.0f / DqnV3_Length(eye, center);
// Combine matrix + matrix that maps NDC to screen space
DqnMat4 viewport = GLViewport(0, 0, (f32)renderBuffer->width, (f32)renderBuffer->height);
DqnMat4 modelView = DqnMat4_Mul(viewMatrix, modelMatrix);
DqnMat4 modelViewProjection = DqnMat4_Mul(perspective, modelView);
viewPModelViewProjection = DqnMat4_Mul(viewport, modelViewProjection);
}
for (u32 i = 0; i < mesh->numFaces; i++)
{
DTRMeshFace face = mesh->faces[i];
@ -1367,36 +1398,6 @@ void DTRRender_Mesh(DTRRenderBuffer *const renderBuffer, DTRMesh *const mesh, co
norm3 = mesh->normals[norm3Index];
}
// Apply vertex shader, model view projection
DqnMat4 modelMatrix = {};
{
LOCAL_PERSIST f32 rotateDegrees = 0;
rotateDegrees += (dt * 0.0025f);
rotateDegrees = 0.0f;
DqnMat4 translateMatrix = DqnMat4_Translate(pos.x, pos.y, pos.z);
DqnMat4 scaleMatrix = DqnMat4_Scale(scale, scale, scale);
DqnMat4 rotateMatrix = DqnMat4_Rotate(DQN_DEGREES_TO_RADIANS(rotateDegrees), 0.0f, 1.0f, 0.0f);
modelMatrix = DqnMat4_Mul(translateMatrix, DqnMat4_Mul(rotateMatrix, scaleMatrix));
}
DqnV3 eye = DqnV3_3f(0, 0, 1);
DqnV3 up = DqnV3_3f(0, 1, 0);
DqnV3 center = DqnV3_3f(0, 0, 0);
DqnMat4 viewMatrix = DqnMat4_LookAt(eye, center, up);
f32 aspectRatio = (f32)renderBuffer->width / (f32)renderBuffer->height;
DqnMat4 perspective = DqnMat4_Perspective(80.0f, aspectRatio, 0.5f, 100.0f);
perspective = DqnMat4_Identity();
perspective.e[2][3] = -1.0f / DqnV3_Length(eye, center);
DqnMat4 viewport = GLViewport(0, 0, (f32)renderBuffer->width, (f32)renderBuffer->height);
DqnMat4 modelView = DqnMat4_Mul(viewMatrix, modelMatrix);
DqnMat4 modelViewProjection = DqnMat4_Mul(perspective, modelView);
DqnMat4 viewPModelViewProjection = DqnMat4_Mul(viewport, modelViewProjection);
v1 = DqnMat4_MulV4(viewPModelViewProjection, v1);
v2 = DqnMat4_MulV4(viewPModelViewProjection, v2);
v3 = DqnMat4_MulV4(viewPModelViewProjection, v3);
@ -1415,16 +1416,17 @@ void DTRRender_Mesh(DTRRenderBuffer *const renderBuffer, DTRMesh *const mesh, co
v3.x = (f32)(i32)(v3.x + 0.5f);
v3.y = (f32)(i32)(v3.y + 0.5f);
i32 textureAIndex = face.texIndex[0];
i32 textureBIndex = face.texIndex[1];
i32 textureCIndex = face.texIndex[2];
i32 uv1Index = face.texIndex[0];
i32 uv2Index = face.texIndex[1];
i32 uv3Index = face.texIndex[2];
DqnV2 uv1 = mesh->texUV[textureAIndex].xy;
DqnV2 uv2 = mesh->texUV[textureBIndex].xy;
DqnV2 uv3 = mesh->texUV[textureCIndex].xy;
DQN_ASSERT(textureAIndex < (i32)mesh->numTexUV);
DQN_ASSERT(textureBIndex < (i32)mesh->numTexUV);
DQN_ASSERT(textureCIndex < (i32)mesh->numTexUV);
DQN_ASSERT(uv1Index < (i32)mesh->numTexUV);
DQN_ASSERT(uv2Index < (i32)mesh->numTexUV);
DQN_ASSERT(uv3Index < (i32)mesh->numTexUV);
DqnV2 uv1 = mesh->texUV[uv1Index].xy;
DqnV2 uv2 = mesh->texUV[uv2Index].xy;
DqnV2 uv3 = mesh->texUV[uv3Index].xy;
bool DEBUG_SIMPLE_MODE = false;
DqnV4 modelCol = DqnV4_1f(1);