History

fix the bug for blend shape when more than one and clean the model rendering with the new stream and buffer gpu api

Sam Gateau committed 12 years ago

Commit f413f931 parent ed067795 files · +37 −220Browse files

Showing the changes to interface/src/renderer/GeometryCache.cpp (1 of 5 files). Show all

Unified · Split

interface/src/renderer/GeometryCache.cpp+3−66
@@ -743,7 +743,7 @@ void NetworkGeometry::setGeometry(const FBXGeometry& geometry) { · 742 unmodified lines
743 _geometry = geometry;743 _geometry = geometry;
744 744
745 foreach (const FBXMesh& mesh, _geometry.meshes) {745 foreach (const FBXMesh& mesh, _geometry.meshes) {
746 NetworkMesh networkMesh = { QOpenGLBuffer(QOpenGLBuffer::IndexBuffer), QOpenGLBuffer(QOpenGLBuffer::VertexBuffer) };746 NetworkMesh networkMesh;
747 747
748 int totalIndices = 0;748 int totalIndices = 0;
749 foreach (const FBXMeshPart& part, mesh.parts) {749 foreach (const FBXMeshPart& part, mesh.parts) {
@@ -773,26 +773,9 @@ void NetworkGeometry::setGeometry(const FBXGeometry& geometry) { · 23 unmodified lines
773 773
774 totalIndices += (part.quadIndices.size() + part.triangleIndices.size());774 totalIndices += (part.quadIndices.size() + part.triangleIndices.size());
775 }775 }
776 /*776
777 networkMesh.indexBuffer.create();
778 networkMesh.indexBuffer.bind();
779 networkMesh.indexBuffer.setUsagePattern(QOpenGLBuffer::StaticDraw);
780 networkMesh.indexBuffer.allocate(totalIndices * sizeof(int));
781 int offset = 0;
782 foreach (const FBXMeshPart& part, mesh.parts) {
783 glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, offset, part.quadIndices.size() * sizeof(int),
784 part.quadIndices.constData());
785 offset += part.quadIndices.size() * sizeof(int);
786 glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, offset, part.triangleIndices.size() * sizeof(int),
787 part.triangleIndices.constData());
788 offset += part.triangleIndices.size() * sizeof(int);
789 }
790 networkMesh.indexBuffer.release();
791 */
792 {777 {
793 networkMesh._indexBuffer = gpu::BufferPtr(new gpu::Buffer());778 networkMesh._indexBuffer = gpu::BufferPtr(new gpu::Buffer());
794 //networkMesh._indexBuffer.bind();
795 //networkMesh._indexBuffer.setUsagePattern(QOpenGLBuffer::StaticDraw);
796 networkMesh._indexBuffer->resize(totalIndices * sizeof(int));779 networkMesh._indexBuffer->resize(totalIndices * sizeof(int));
797 int offset = 0;780 int offset = 0;
798 foreach(const FBXMeshPart& part, mesh.parts) {781 foreach(const FBXMeshPart& part, mesh.parts) {
@@ -803,54 +786,8 @@ void NetworkGeometry::setGeometry(const FBXGeometry& geometry) { · 4 unmodified lines
803 (gpu::Resource::Byte*) part.triangleIndices.constData());786 (gpu::Resource::Byte*) part.triangleIndices.constData());
804 offset += part.triangleIndices.size() * sizeof(int);787 offset += part.triangleIndices.size() * sizeof(int);
805 }788 }
806 // networkMesh.indexBuffer.release();
807 }789 }
808 790
809 /* networkMesh.vertexBuffer.create();
810 networkMesh.vertexBuffer.bind();
811 networkMesh.vertexBuffer.setUsagePattern(QOpenGLBuffer::StaticDraw);
812
813 // if we don't need to do any blending, the positions/normals can be static
814 if (mesh.blendshapes.isEmpty()) {
815 int normalsOffset = mesh.vertices.size() * sizeof(glm::vec3);
816 int tangentsOffset = normalsOffset + mesh.normals.size() * sizeof(glm::vec3);
817 int colorsOffset = tangentsOffset + mesh.tangents.size() * sizeof(glm::vec3);
818 int texCoordsOffset = colorsOffset + mesh.colors.size() * sizeof(glm::vec3);
819 int clusterIndicesOffset = texCoordsOffset + mesh.texCoords.size() * sizeof(glm::vec2);
820 int clusterWeightsOffset = clusterIndicesOffset + mesh.clusterIndices.size() * sizeof(glm::vec4);
821
822 networkMesh.vertexBuffer.allocate(clusterWeightsOffset + mesh.clusterWeights.size() * sizeof(glm::vec4));
823 networkMesh.vertexBuffer.write(0, mesh.vertices.constData(), mesh.vertices.size() * sizeof(glm::vec3));
824 networkMesh.vertexBuffer.write(normalsOffset, mesh.normals.constData(), mesh.normals.size() * sizeof(glm::vec3));
825 networkMesh.vertexBuffer.write(tangentsOffset, mesh.tangents.constData(),
826 mesh.tangents.size() * sizeof(glm::vec3));
827 networkMesh.vertexBuffer.write(colorsOffset, mesh.colors.constData(), mesh.colors.size() * sizeof(glm::vec3));
828 networkMesh.vertexBuffer.write(texCoordsOffset, mesh.texCoords.constData(),
829 mesh.texCoords.size() * sizeof(glm::vec2));
830 networkMesh.vertexBuffer.write(clusterIndicesOffset, mesh.clusterIndices.constData(),
831 mesh.clusterIndices.size() * sizeof(glm::vec4));
832 networkMesh.vertexBuffer.write(clusterWeightsOffset, mesh.clusterWeights.constData(),
833 mesh.clusterWeights.size() * sizeof(glm::vec4));
834
835 // otherwise, at least the cluster indices/weights can be static
836 } else {
837 int colorsOffset = mesh.tangents.size() * sizeof(glm::vec3);
838 int texCoordsOffset = colorsOffset + mesh.colors.size() * sizeof(glm::vec3);
839 int clusterIndicesOffset = texCoordsOffset + mesh.texCoords.size() * sizeof(glm::vec2);
840 int clusterWeightsOffset = clusterIndicesOffset + mesh.clusterIndices.size() * sizeof(glm::vec4);
841 networkMesh.vertexBuffer.allocate(clusterWeightsOffset + mesh.clusterWeights.size() * sizeof(glm::vec4));
842 networkMesh.vertexBuffer.write(0, mesh.tangents.constData(), mesh.tangents.size() * sizeof(glm::vec3));
843 networkMesh.vertexBuffer.write(colorsOffset, mesh.colors.constData(), mesh.colors.size() * sizeof(glm::vec3));
844 networkMesh.vertexBuffer.write(texCoordsOffset, mesh.texCoords.constData(),
845 mesh.texCoords.size() * sizeof(glm::vec2));
846 networkMesh.vertexBuffer.write(clusterIndicesOffset, mesh.clusterIndices.constData(),
847 mesh.clusterIndices.size() * sizeof(glm::vec4));
848 networkMesh.vertexBuffer.write(clusterWeightsOffset, mesh.clusterWeights.constData(),
849 mesh.clusterWeights.size() * sizeof(glm::vec4));
850 }
851
852 networkMesh.vertexBuffer.release();
853*/
854 {791 {
855 networkMesh._vertexBuffer = gpu::BufferPtr(new gpu::Buffer());792 networkMesh._vertexBuffer = gpu::BufferPtr(new gpu::Buffer());
856 // if we don't need to do any blending, the positions/normals can be static793 // if we don't need to do any blending, the positions/normals can be static
@@ -932,7 +869,7 @@ void NetworkGeometry::setGeometry(const FBXGeometry& geometry) { · 75 unmodified lines
932 869
933 }870 }
934 }871 }
935 872
936 _meshes.append(networkMesh);873 _meshes.append(networkMesh);
937 }874 }
938 875