Skip to content

Commit 8be60d9

Browse files
committed
Optimized mesh skinning further, added support for GPU skinning
1 parent a9b5d1e commit 8be60d9

File tree

12 files changed

+97
-14
lines changed

12 files changed

+97
-14
lines changed

Core/Contents/Include/PolyGLVertexBuffer.h

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,9 @@ namespace Polycode {
5151
GLuint getColorBufferID();
5252
GLuint getTangentBufferID();
5353
GLuint getIndexBufferID();
54-
54+
GLuint getBoneWeightBufferID();
55+
GLuint getBoneIndexBufferID();
56+
5557
protected:
5658

5759
GLuint vertexBufferID;
@@ -60,6 +62,9 @@ namespace Polycode {
6062
GLuint colorBufferID;
6163
GLuint tangentBufferID;
6264
GLuint indexBufferID;
65+
66+
GLuint boneWeightBufferID;
67+
GLuint boneIndexBufferID;
6368
};
6469

6570
}

Core/Contents/Include/PolyMesh.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,7 @@ namespace Polycode {
391391
VertexDataArray vertexTangentArray;
392392

393393
VertexDataArray vertexBoneWeightArray;
394-
IndexDataArray vertexBoneIndexArray;
394+
VertexDataArray vertexBoneIndexArray;
395395

396396
IndexDataArray indexArray;
397397

Core/Contents/Include/PolySceneMesh.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,8 @@ namespace Polycode {
241241
* If this flag is set to false, backface culling is disabled when rendering this entity, rendering both sides of each face. Set to true by default.
242242
*/
243243
bool backfaceCulled;
244+
245+
bool sendBoneMatricesToMaterial;
244246

245247
protected:
246248

@@ -252,7 +254,8 @@ namespace Polycode {
252254
ShaderBinding *localShaderOptions;
253255
String fileName;
254256

255-
257+
std::vector<Matrix4> materialBoneMatrices;
258+
256259
VertexDataArray skeletalVertexPositions;
257260
VertexDataArray skeletalVertexNormals;
258261

Core/Contents/Include/PolyShader.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ namespace Polycode {
8888
const String& getName() const;
8989

9090
ShaderBinding *createBinding();
91-
virtual void reload() {}
91+
virtual void reload() {}
9292

9393
int getExpectedParamType(String name);
9494

@@ -145,6 +145,7 @@ namespace Polycode {
145145
void *data;
146146
int type;
147147
bool ownsPointer;
148+
unsigned int arraySize;
148149

149150
// Convenience getters/setters for Lua users
150151
Number getNumber();

Core/Contents/Source/PolyBone.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ Matrix4 Bone::buildFinalMatrix() const {
8383
}
8484

8585
void Bone::rebuildFinalMatrix() {
86-
finalMatrix = buildFinalMatrix();
86+
finalMatrix = restMatrix * buildFinalMatrix();
8787
}
8888

8989
void Bone::setBoneMatrix(const Matrix4& matrix) {

Core/Contents/Source/PolyGLRenderer.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -419,6 +419,20 @@ void OpenGLRenderer::drawVertexBuffer(VertexBuffer *buffer, bool enableColorBuff
419419
glVertexAttribPointer(6, 3, GL_FLOAT, 0, 0, (char *)NULL);
420420
}
421421

422+
if(glVertexBuffer->getBoneWeightBufferID() != -1) {
423+
424+
glBindBufferARB( GL_ARRAY_BUFFER_ARB, glVertexBuffer->getBoneWeightBufferID());
425+
glEnableVertexAttribArrayARB(7);
426+
glVertexAttribPointer(7, 4, GL_FLOAT, 0, 0, (char *)NULL);
427+
}
428+
429+
if(glVertexBuffer->getBoneIndexBufferID() != -1) {
430+
431+
glBindBufferARB( GL_ARRAY_BUFFER_ARB, glVertexBuffer->getBoneIndexBufferID());
432+
glEnableVertexAttribArrayARB(8);
433+
glVertexAttribPointer(8, 4, GL_FLOAT, 0, 0, (char *)NULL);
434+
}
435+
422436
GLenum mode = GL_TRIANGLES;
423437

424438
switch(buffer->meshType) {
@@ -454,6 +468,9 @@ void OpenGLRenderer::drawVertexBuffer(VertexBuffer *buffer, bool enableColorBuff
454468
}
455469

456470
glDisableVertexAttribArrayARB(6);
471+
glDisableVertexAttribArrayARB(7);
472+
glDisableVertexAttribArrayARB(8);
473+
457474
glDisableClientState( GL_VERTEX_ARRAY);
458475
glDisableClientState( GL_TEXTURE_COORD_ARRAY );
459476
glDisableClientState( GL_NORMAL_ARRAY );

Core/Contents/Source/PolyGLSLShader.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,9 @@ void GLSLShader::linkProgram() {
121121
shader_id = glCreateProgram();
122122
glAttachShader(shader_id, ((GLSLProgram*)fp)->program);
123123
glAttachShader(shader_id, ((GLSLProgram*)vp)->program);
124-
glBindAttribLocation(shader_id, 6, "vTangent");
124+
glBindAttribLocation(shader_id, 6, "vTangent");
125+
glBindAttribLocation(shader_id, 7, "vBoneWeights");
126+
glBindAttribLocation(shader_id, 8, "vBoneIndices");
125127
glLinkProgram(shader_id);
126128
if(vp) {
127129
vp->addEventListener(this, Event::RESOURCE_RELOAD_EVENT);

Core/Contents/Source/PolyGLSLShaderModule.cpp

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -246,7 +246,20 @@ void GLSLShaderModule::updateGLSLParam(Renderer *renderer, GLSLShader *glslShade
246246
break;
247247
case ProgramParam::PARAM_MATRIX:
248248
if(localParam) {
249-
setUniformMatrix(paramLocation, localParam->getMatrix4());
249+
if(localParam->arraySize > 0) {
250+
Matrix4 *matPointer = (Matrix4*)localParam->data;
251+
std::vector<float> matrixData;
252+
for(int i=0; i < localParam->arraySize; i++) {
253+
for(int j=0; j < 16; j++) {
254+
matrixData.push_back(matPointer[i].ml[j]);
255+
}
256+
}
257+
258+
glUniformMatrix4fv(paramLocation, localParam->arraySize, false, &matrixData[0]);
259+
260+
} else {
261+
setUniformMatrix(paramLocation, localParam->getMatrix4());
262+
}
250263
} else {
251264
Matrix4 defaultMatrix;
252265
setUniformMatrix(paramLocation, defaultMatrix);

Core/Contents/Source/PolyGLVertexBuffer.cpp

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ OpenGLVertexBuffer::OpenGLVertexBuffer(Mesh *mesh) : VertexBuffer() {
5454
colorBufferID = -1;
5555
tangentBufferID = -1;
5656
indexBufferID = -1;
57+
boneWeightBufferID = -1;
58+
boneIndexBufferID = -1;
5759

5860

5961
meshType = mesh->getMeshType();
@@ -85,7 +87,21 @@ OpenGLVertexBuffer::OpenGLVertexBuffer(Mesh *mesh) : VertexBuffer() {
8587
glBufferDataARB(GL_ARRAY_BUFFER_ARB, mesh->vertexTangentArray.getDataSize() * sizeof(PolyRendererVertexType), mesh->vertexTangentArray.getArrayData(), GL_STATIC_DRAW_ARB);
8688
}
8789

88-
if(mesh->vertexTangentArray.getDataSize() == vertexCount * 4) {
90+
if(mesh->vertexBoneWeightArray.getDataSize() == vertexCount * 4) {
91+
glGenBuffersARB(1, &boneWeightBufferID);
92+
glBindBufferARB(GL_ARRAY_BUFFER_ARB, boneWeightBufferID);
93+
94+
glBufferDataARB(GL_ARRAY_BUFFER_ARB, mesh->vertexBoneWeightArray.getDataSize() * sizeof(PolyRendererVertexType), mesh->vertexBoneWeightArray.getArrayData(), GL_STATIC_DRAW_ARB);
95+
}
96+
97+
if(mesh->vertexBoneIndexArray.getDataSize() == vertexCount * 4) {
98+
glGenBuffersARB(1, &boneIndexBufferID);
99+
glBindBufferARB(GL_ARRAY_BUFFER_ARB, boneIndexBufferID);
100+
101+
glBufferDataARB(GL_ARRAY_BUFFER_ARB, mesh->vertexBoneIndexArray.getDataSize() * sizeof(PolyRendererVertexType), mesh->vertexBoneIndexArray.getArrayData(), GL_STATIC_DRAW_ARB);
102+
}
103+
104+
if(mesh->vertexColorArray.getDataSize() == vertexCount * 4) {
89105
glGenBuffersARB(1, &colorBufferID);
90106
glBindBufferARB(GL_ARRAY_BUFFER_ARB, colorBufferID);
91107

@@ -98,6 +114,7 @@ OpenGLVertexBuffer::OpenGLVertexBuffer(Mesh *mesh) : VertexBuffer() {
98114
glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, mesh->indexArray.getDataSize() * sizeof(PolyRendererIndexType), mesh->indexArray.getArrayData(), GL_STATIC_DRAW_ARB);
99115
indexCount = mesh->indexArray.getDataSize();
100116
}
117+
101118
}
102119

103120
OpenGLVertexBuffer::~OpenGLVertexBuffer() {
@@ -106,6 +123,16 @@ OpenGLVertexBuffer::~OpenGLVertexBuffer() {
106123
glDeleteBuffersARB(1, &normalBufferID);
107124
glDeleteBuffersARB(1, &colorBufferID);
108125
glDeleteBuffersARB(1, &indexBufferID);
126+
glDeleteBuffersARB(1, &boneWeightBufferID);
127+
glDeleteBuffersARB(1, &boneIndexBufferID);
128+
}
129+
130+
GLuint OpenGLVertexBuffer::getBoneWeightBufferID() {
131+
return boneWeightBufferID;
132+
}
133+
134+
GLuint OpenGLVertexBuffer::getBoneIndexBufferID() {
135+
return boneIndexBufferID;
109136
}
110137

111138
GLuint OpenGLVertexBuffer::getColorBufferID() {

Core/Contents/Source/PolyMesh.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ void Mesh::saveToFile(OSFILE *outFile, bool writeNormals, bool writeTangents, bo
197197

198198
if(writeBoneWeights) {
199199
writeVertexBlock(&vertexBoneWeightArray, outFile);
200-
writeIndexBlock(&vertexBoneIndexArray, outFile);
200+
writeVertexBlock(&vertexBoneIndexArray, outFile);
201201
}
202202
}
203203

@@ -258,7 +258,7 @@ void Mesh::loadFromFileV2(OSFILE *inFile) {
258258
break;
259259
case RenderDataArray::BONE_INDEX_DATA_ARRAY:
260260
vertexBoneIndexArray.data.resize(blockSize);
261-
OSBasics::read(&vertexBoneIndexArray.data[0], sizeof(PolyRendererIndexType), blockSize, inFile);
261+
OSBasics::read(&vertexBoneIndexArray.data[0], sizeof(PolyRendererVertexType), blockSize, inFile);
262262
break;
263263
}
264264
}

0 commit comments

Comments
 (0)