mirror of https://github.com/bjornbytes/lovr.git
Optional pose;
This commit is contained in:
parent
659a2899e6
commit
652c31f8d4
|
@ -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;
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
|
|
Loading…
Reference in New Issue