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);
|
Mesh* mesh = luax_checktype(L, 1, Mesh);
|
||||||
float transform[16];
|
float transform[16];
|
||||||
luax_readtransform(L, 2, transform, 1);
|
luax_readtransform(L, 2, transform, 1);
|
||||||
lovrMeshDraw(mesh, transform);
|
lovrMeshDraw(mesh, transform, NULL);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -80,7 +80,7 @@ void lovrGraphicsPresent() {
|
||||||
glfwSwapBuffers(state.window);
|
glfwSwapBuffers(state.window);
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrGraphicsPrepare() {
|
void lovrGraphicsPrepare(float* pose) {
|
||||||
Shader* shader = lovrGraphicsGetActiveShader();
|
Shader* shader = lovrGraphicsGetActiveShader();
|
||||||
|
|
||||||
if (!shader) {
|
if (!shader) {
|
||||||
|
@ -121,6 +121,15 @@ void lovrGraphicsPrepare() {
|
||||||
// Point size
|
// Point size
|
||||||
lovrShaderSetFloat(shader, "lovrPointSize", &state.pointSize, 1);
|
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* material = lovrGraphicsGetMaterial();
|
Material* material = lovrGraphicsGetMaterial();
|
||||||
|
|
||||||
|
@ -502,7 +511,7 @@ static void lovrGraphicsDrawPrimitive(GLenum mode, bool hasNormals, bool hasTexC
|
||||||
float* data = state.streamData.data;
|
float* data = state.streamData.data;
|
||||||
unsigned int* indices = state.streamIndices.data;
|
unsigned int* indices = state.streamIndices.data;
|
||||||
|
|
||||||
lovrGraphicsPrepare();
|
lovrGraphicsPrepare(NULL);
|
||||||
lovrGraphicsBindVertexArray(state.streamVAO);
|
lovrGraphicsBindVertexArray(state.streamVAO);
|
||||||
lovrGraphicsBindVertexBuffer(state.streamVBO);
|
lovrGraphicsBindVertexBuffer(state.streamVBO);
|
||||||
glBufferData(GL_ARRAY_BUFFER, state.streamData.length * sizeof(float), data, GL_STREAM_DRAW);
|
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_TEX_COORD);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
glDisableVertexAttribArray(LOVR_SHADER_BONES);
|
||||||
|
glDisableVertexAttribArray(LOVR_SHADER_BONE_WEIGHTS);
|
||||||
|
|
||||||
if (useIndices) {
|
if (useIndices) {
|
||||||
lovrGraphicsBindIndexBuffer(state.streamIBO);
|
lovrGraphicsBindIndexBuffer(state.streamIBO);
|
||||||
glBufferData(GL_ELEMENT_ARRAY_BUFFER, state.streamIndices.length * sizeof(unsigned int), indices, GL_STREAM_DRAW);
|
glBufferData(GL_ELEMENT_ARRAY_BUFFER, state.streamIndices.length * sizeof(unsigned int), indices, GL_STREAM_DRAW);
|
||||||
|
|
|
@ -113,7 +113,7 @@ void lovrGraphicsDestroy();
|
||||||
void lovrGraphicsReset();
|
void lovrGraphicsReset();
|
||||||
void lovrGraphicsClear(bool color, bool depth);
|
void lovrGraphicsClear(bool color, bool depth);
|
||||||
void lovrGraphicsPresent();
|
void lovrGraphicsPresent();
|
||||||
void lovrGraphicsPrepare();
|
void lovrGraphicsPrepare(float* pose);
|
||||||
void lovrGraphicsCreateWindow(int w, int h, bool fullscreen, int msaa, const char* title, const char* icon);
|
void lovrGraphicsCreateWindow(int w, int h, bool fullscreen, int msaa, const char* title, const char* icon);
|
||||||
int lovrGraphicsGetWidth();
|
int lovrGraphicsGetWidth();
|
||||||
int lovrGraphicsGetHeight();
|
int lovrGraphicsGetHeight();
|
||||||
|
|
|
@ -127,7 +127,7 @@ void lovrMeshDestroy(const Ref* ref) {
|
||||||
free(mesh);
|
free(mesh);
|
||||||
}
|
}
|
||||||
|
|
||||||
void lovrMeshDraw(Mesh* mesh, mat4 transform) {
|
void lovrMeshDraw(Mesh* mesh, mat4 transform, float* pose) {
|
||||||
if (mesh->isMapped) {
|
if (mesh->isMapped) {
|
||||||
lovrMeshUnmap(mesh);
|
lovrMeshUnmap(mesh);
|
||||||
}
|
}
|
||||||
|
@ -138,7 +138,7 @@ void lovrMeshDraw(Mesh* mesh, mat4 transform) {
|
||||||
}
|
}
|
||||||
|
|
||||||
lovrGraphicsSetDefaultShader(SHADER_DEFAULT);
|
lovrGraphicsSetDefaultShader(SHADER_DEFAULT);
|
||||||
lovrGraphicsPrepare();
|
lovrGraphicsPrepare(pose);
|
||||||
lovrGraphicsBindVertexArray(mesh->vao);
|
lovrGraphicsBindVertexArray(mesh->vao);
|
||||||
lovrMeshBindAttributes(mesh);
|
lovrMeshBindAttributes(mesh);
|
||||||
size_t start = mesh->rangeStart;
|
size_t start = mesh->rangeStart;
|
||||||
|
|
|
@ -60,7 +60,7 @@ typedef struct {
|
||||||
|
|
||||||
Mesh* lovrMeshCreate(size_t count, MeshFormat* format, MeshDrawMode drawMode, MeshUsage usage);
|
Mesh* lovrMeshCreate(size_t count, MeshFormat* format, MeshDrawMode drawMode, MeshUsage usage);
|
||||||
void lovrMeshDestroy(const Ref* ref);
|
void lovrMeshDestroy(const Ref* ref);
|
||||||
void lovrMeshDraw(Mesh* mesh, mat4 transform);
|
void lovrMeshDraw(Mesh* mesh, mat4 transform, float* pose);
|
||||||
MeshFormat lovrMeshGetVertexFormat(Mesh* mesh);
|
MeshFormat lovrMeshGetVertexFormat(Mesh* mesh);
|
||||||
MeshDrawMode lovrMeshGetDrawMode(Mesh* mesh);
|
MeshDrawMode lovrMeshGetDrawMode(Mesh* mesh);
|
||||||
void lovrMeshSetDrawMode(Mesh* mesh, MeshDrawMode drawMode);
|
void lovrMeshSetDrawMode(Mesh* mesh, MeshDrawMode drawMode);
|
||||||
|
|
|
@ -13,31 +13,28 @@ static void renderNode(Model* model, int nodeIndex) {
|
||||||
lovrGraphicsPush();
|
lovrGraphicsPush();
|
||||||
lovrGraphicsMatrixTransform(MATRIX_MODEL, model->nodeTransforms[nodeIndex]);
|
lovrGraphicsMatrixTransform(MATRIX_MODEL, model->nodeTransforms[nodeIndex]);
|
||||||
|
|
||||||
float globalInverse[16];
|
if (model->animator) {
|
||||||
mat4_set(globalInverse, model->nodeTransforms[nodeIndex]);
|
float globalInverse[16];
|
||||||
mat4_invert(globalInverse);
|
mat4_set(globalInverse, model->nodeTransforms[nodeIndex]);
|
||||||
|
mat4_invert(globalInverse);
|
||||||
|
|
||||||
for (int i = 0; i < model->modelData->bones.length; i++) {
|
for (int i = 0; i < model->modelData->bones.length; i++) {
|
||||||
Bone* bone = &model->modelData->bones.data[i];
|
Bone* bone = &model->modelData->bones.data[i];
|
||||||
|
|
||||||
int nodeIndex = -1;
|
int nodeIndex = -1;
|
||||||
for (int j = 0; j < model->modelData->nodeCount; j++) {
|
for (int j = 0; j < model->modelData->nodeCount; j++) {
|
||||||
if (!strcmp(model->modelData->nodes[j].name, bone->name)) {
|
if (!strcmp(model->modelData->nodes[j].name, bone->name)) {
|
||||||
nodeIndex = j;
|
nodeIndex = j;
|
||||||
break;
|
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++) {
|
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]);
|
lovrGraphicsSetMaterial(model->materials[primitive->material]);
|
||||||
}
|
}
|
||||||
lovrMeshSetDrawRange(model->mesh, primitive->drawStart, primitive->drawCount);
|
lovrMeshSetDrawRange(model->mesh, primitive->drawStart, primitive->drawCount);
|
||||||
lovrMeshDraw(model->mesh, NULL);
|
lovrMeshDraw(model->mesh, NULL, (float*) model->pose);
|
||||||
}
|
}
|
||||||
|
|
||||||
lovrGraphicsPop();
|
lovrGraphicsPop();
|
||||||
|
|
Loading…
Reference in New Issue