Optional pose;

This commit is contained in:
bjorn 2017-11-20 21:16:16 -08:00
parent 659a2899e6
commit 652c31f8d4
6 changed files with 38 additions and 29 deletions

View File

@ -31,7 +31,7 @@ int l_lovrMeshDraw(lua_State* L) {
Mesh* mesh = luax_checktype(L, 1, Mesh);
float transform[16];
luax_readtransform(L, 2, transform, 1);
lovrMeshDraw(mesh, transform);
lovrMeshDraw(mesh, transform, NULL);
return 0;
}

View File

@ -80,7 +80,7 @@ void lovrGraphicsPresent() {
glfwSwapBuffers(state.window);
}
void lovrGraphicsPrepare() {
void lovrGraphicsPrepare(float* pose) {
Shader* shader = lovrGraphicsGetActiveShader();
if (!shader) {
@ -121,6 +121,15 @@ void lovrGraphicsPrepare() {
// Point size
lovrShaderSetFloat(shader, "lovrPointSize", &state.pointSize, 1);
// Pose
if (pose) {
lovrShaderSetMatrix(shader, "lovrPose", pose, MAX_BONES * 16);
} else {
float identity[16];
mat4_identity(identity);
lovrShaderSetMatrix(shader, "lovrPose", identity, 16);
}
// Material
Material* material = lovrGraphicsGetMaterial();
@ -502,7 +511,7 @@ static void lovrGraphicsDrawPrimitive(GLenum mode, bool hasNormals, bool hasTexC
float* data = state.streamData.data;
unsigned int* indices = state.streamIndices.data;
lovrGraphicsPrepare();
lovrGraphicsPrepare(NULL);
lovrGraphicsBindVertexArray(state.streamVAO);
lovrGraphicsBindVertexBuffer(state.streamVBO);
glBufferData(GL_ARRAY_BUFFER, state.streamData.length * sizeof(float), data, GL_STREAM_DRAW);
@ -524,6 +533,9 @@ static void lovrGraphicsDrawPrimitive(GLenum mode, bool hasNormals, bool hasTexC
glDisableVertexAttribArray(LOVR_SHADER_TEX_COORD);
}
glDisableVertexAttribArray(LOVR_SHADER_BONES);
glDisableVertexAttribArray(LOVR_SHADER_BONE_WEIGHTS);
if (useIndices) {
lovrGraphicsBindIndexBuffer(state.streamIBO);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, state.streamIndices.length * sizeof(unsigned int), indices, GL_STREAM_DRAW);

View File

@ -113,7 +113,7 @@ void lovrGraphicsDestroy();
void lovrGraphicsReset();
void lovrGraphicsClear(bool color, bool depth);
void lovrGraphicsPresent();
void lovrGraphicsPrepare();
void lovrGraphicsPrepare(float* pose);
void lovrGraphicsCreateWindow(int w, int h, bool fullscreen, int msaa, const char* title, const char* icon);
int lovrGraphicsGetWidth();
int lovrGraphicsGetHeight();

View File

@ -127,7 +127,7 @@ void lovrMeshDestroy(const Ref* ref) {
free(mesh);
}
void lovrMeshDraw(Mesh* mesh, mat4 transform) {
void lovrMeshDraw(Mesh* mesh, mat4 transform, float* pose) {
if (mesh->isMapped) {
lovrMeshUnmap(mesh);
}
@ -138,7 +138,7 @@ void lovrMeshDraw(Mesh* mesh, mat4 transform) {
}
lovrGraphicsSetDefaultShader(SHADER_DEFAULT);
lovrGraphicsPrepare();
lovrGraphicsPrepare(pose);
lovrGraphicsBindVertexArray(mesh->vao);
lovrMeshBindAttributes(mesh);
size_t start = mesh->rangeStart;

View File

@ -60,7 +60,7 @@ typedef struct {
Mesh* lovrMeshCreate(size_t count, MeshFormat* format, MeshDrawMode drawMode, MeshUsage usage);
void lovrMeshDestroy(const Ref* ref);
void lovrMeshDraw(Mesh* mesh, mat4 transform);
void lovrMeshDraw(Mesh* mesh, mat4 transform, float* pose);
MeshFormat lovrMeshGetVertexFormat(Mesh* mesh);
MeshDrawMode lovrMeshGetDrawMode(Mesh* mesh);
void lovrMeshSetDrawMode(Mesh* mesh, MeshDrawMode drawMode);

View File

@ -13,31 +13,28 @@ static void renderNode(Model* model, int nodeIndex) {
lovrGraphicsPush();
lovrGraphicsMatrixTransform(MATRIX_MODEL, model->nodeTransforms[nodeIndex]);
float globalInverse[16];
mat4_set(globalInverse, model->nodeTransforms[nodeIndex]);
mat4_invert(globalInverse);
if (model->animator) {
float globalInverse[16];
mat4_set(globalInverse, model->nodeTransforms[nodeIndex]);
mat4_invert(globalInverse);
for (int i = 0; i < model->modelData->bones.length; i++) {
Bone* bone = &model->modelData->bones.data[i];
for (int i = 0; i < model->modelData->bones.length; i++) {
Bone* bone = &model->modelData->bones.data[i];
int nodeIndex = -1;
for (int j = 0; j < model->modelData->nodeCount; j++) {
if (!strcmp(model->modelData->nodes[j].name, bone->name)) {
nodeIndex = j;
break;
int nodeIndex = -1;
for (int j = 0; j < model->modelData->nodeCount; j++) {
if (!strcmp(model->modelData->nodes[j].name, bone->name)) {
nodeIndex = j;
break;
}
}
mat4 bonePose = model->pose[i];
mat4_identity(bonePose);
mat4_set(bonePose, globalInverse);
mat4_multiply(bonePose, model->nodeTransforms[nodeIndex]);
mat4_multiply(bonePose, bone->offset);
}
mat4 bonePose = model->pose[i];
mat4_identity(bonePose);
mat4_set(bonePose, globalInverse);
mat4_multiply(bonePose, model->nodeTransforms[nodeIndex]);
mat4_multiply(bonePose, bone->offset);
}
Shader* shader = lovrGraphicsGetActiveShader();
if (shader) {
lovrShaderSetMatrix(shader, "lovrPose", (float*) model->pose, MAX_BONES * 16);
}
for (int i = 0; i < node->primitives.length; i++) {
@ -46,7 +43,7 @@ static void renderNode(Model* model, int nodeIndex) {
lovrGraphicsSetMaterial(model->materials[primitive->material]);
}
lovrMeshSetDrawRange(model->mesh, primitive->drawStart, primitive->drawCount);
lovrMeshDraw(model->mesh, NULL);
lovrMeshDraw(model->mesh, NULL, (float*) model->pose);
}
lovrGraphicsPop();