History

INtroducing the stream format and the Stream and making it work for the model mesh

Sam Gateau committed 12 years ago

Commit 23905591 parent 7b5d2ef9 files · +547 −73Browse files

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

Unified · Split

interface/src/renderer/GeometryCache.cpp+96−3
@@ -773,7 +773,7 @@ void NetworkGeometry::setGeometry(const FBXGeometry& geometry) { · 772 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();777 networkMesh.indexBuffer.create();
778 networkMesh.indexBuffer.bind();778 networkMesh.indexBuffer.bind();
779 networkMesh.indexBuffer.setUsagePattern(QOpenGLBuffer::StaticDraw);779 networkMesh.indexBuffer.setUsagePattern(QOpenGLBuffer::StaticDraw);
@@ -788,8 +788,25 @@ void NetworkGeometry::setGeometry(const FBXGeometry& geometry) { · 8 unmodified lines
788 offset += part.triangleIndices.size() * sizeof(int);788 offset += part.triangleIndices.size() * sizeof(int);
789 }789 }
790 networkMesh.indexBuffer.release();790 networkMesh.indexBuffer.release();
791 791 */
792 networkMesh.vertexBuffer.create();792 {
793 networkMesh._indexBuffer = gpu::BufferPtr(new gpu::Buffer());
794 //networkMesh._indexBuffer.bind();
795 //networkMesh._indexBuffer.setUsagePattern(QOpenGLBuffer::StaticDraw);
796 networkMesh._indexBuffer->resize(totalIndices * sizeof(int));
797 int offset = 0;
798 foreach(const FBXMeshPart& part, mesh.parts) {
799 networkMesh._indexBuffer->setSubData(offset, part.quadIndices.size() * sizeof(int),
800 (gpu::Resource::Byte*) part.quadIndices.constData());
801 offset += part.quadIndices.size() * sizeof(int);
802 networkMesh._indexBuffer->setSubData(offset, part.triangleIndices.size() * sizeof(int),
803 (gpu::Resource::Byte*) part.triangleIndices.constData());
804 offset += part.triangleIndices.size() * sizeof(int);
805 }
806 // networkMesh.indexBuffer.release();
807 }
808
809 /* networkMesh.vertexBuffer.create();
793 networkMesh.vertexBuffer.bind();810 networkMesh.vertexBuffer.bind();
794 networkMesh.vertexBuffer.setUsagePattern(QOpenGLBuffer::StaticDraw);811 networkMesh.vertexBuffer.setUsagePattern(QOpenGLBuffer::StaticDraw);
795 812
@@ -833,6 +850,82 @@ void NetworkGeometry::setGeometry(const FBXGeometry& geometry) { · 37 unmodified lines
833 }850 }
834 851
835 networkMesh.vertexBuffer.release();852 networkMesh.vertexBuffer.release();
853*/
854 {
855 networkMesh._vertexBuffer = gpu::BufferPtr(new gpu::Buffer());
856 // if we don't need to do any blending, the positions/normals can be static
857 if (mesh.blendshapes.isEmpty()) {
858 int normalsOffset = mesh.vertices.size() * sizeof(glm::vec3);
859 int tangentsOffset = normalsOffset + mesh.normals.size() * sizeof(glm::vec3);
860 int colorsOffset = tangentsOffset + mesh.tangents.size() * sizeof(glm::vec3);
861 int texCoordsOffset = colorsOffset + mesh.colors.size() * sizeof(glm::vec3);
862 int clusterIndicesOffset = texCoordsOffset + mesh.texCoords.size() * sizeof(glm::vec2);
863 int clusterWeightsOffset = clusterIndicesOffset + mesh.clusterIndices.size() * sizeof(glm::vec4);
864
865 networkMesh._vertexBuffer->resize(clusterWeightsOffset + mesh.clusterWeights.size() * sizeof(glm::vec4));
866 //networkMesh.vertexBuffer.allocate(clusterWeightsOffset + mesh.clusterWeights.size() * sizeof(glm::vec4));
867
868 networkMesh._vertexBuffer->setSubData(0, mesh.vertices.size() * sizeof(glm::vec3), (gpu::Resource::Byte*) mesh.vertices.constData());
869 networkMesh._vertexBuffer->setSubData(normalsOffset, mesh.normals.size() * sizeof(glm::vec3), (gpu::Resource::Byte*) mesh.normals.constData());
870 networkMesh._vertexBuffer->setSubData(tangentsOffset,
871 mesh.tangents.size() * sizeof(glm::vec3), (gpu::Resource::Byte*) mesh.tangents.constData());
872 networkMesh._vertexBuffer->setSubData(colorsOffset, mesh.colors.size() * sizeof(glm::vec3), (gpu::Resource::Byte*) mesh.colors.constData());
873 networkMesh._vertexBuffer->setSubData(texCoordsOffset,
874 mesh.texCoords.size() * sizeof(glm::vec2), (gpu::Resource::Byte*) mesh.texCoords.constData());
875 networkMesh._vertexBuffer->setSubData(clusterIndicesOffset,
876 mesh.clusterIndices.size() * sizeof(glm::vec4), (gpu::Resource::Byte*) mesh.clusterIndices.constData());
877 networkMesh._vertexBuffer->setSubData(clusterWeightsOffset,
878 mesh.clusterWeights.size() * sizeof(glm::vec4), (gpu::Resource::Byte*) mesh.clusterWeights.constData());
879
880 // otherwise, at least the cluster indices/weights can be static
881 networkMesh._vertexStream.addBuffer(networkMesh._vertexBuffer, 0, sizeof(glm::vec3));
882 if (mesh.normals.size()) networkMesh._vertexStream.addBuffer(networkMesh._vertexBuffer, normalsOffset, sizeof(glm::vec3));
883 if (mesh.tangents.size()) networkMesh._vertexStream.addBuffer(networkMesh._vertexBuffer, tangentsOffset, sizeof(glm::vec3));
884 if (mesh.colors.size()) networkMesh._vertexStream.addBuffer(networkMesh._vertexBuffer, colorsOffset, sizeof(glm::vec3));
885 if (mesh.texCoords.size()) networkMesh._vertexStream.addBuffer(networkMesh._vertexBuffer, texCoordsOffset, sizeof(glm::vec2));
886 if (mesh.clusterIndices.size()) networkMesh._vertexStream.addBuffer(networkMesh._vertexBuffer, clusterIndicesOffset, sizeof(glm::vec4));
887 if (mesh.clusterWeights.size()) networkMesh._vertexStream.addBuffer(networkMesh._vertexBuffer, clusterWeightsOffset, sizeof(glm::vec4));
888
889 int channelNum = 0;
890 networkMesh._vertexFormat.setAttribute(gpu::StreamFormat::SLOT_POSITION, channelNum++, gpu::Element(gpu::Element::DIM_VEC3, gpu::Element::TYPE_FLOAT, gpu::Element::SEMANTIC_POS_XYZ), 0);
891 if (mesh.normals.size()) networkMesh._vertexFormat.setAttribute(gpu::StreamFormat::SLOT_NORMAL, channelNum++, gpu::Element(gpu::Element::DIM_VEC3, gpu::Element::TYPE_FLOAT, gpu::Element::SEMANTIC_POS_XYZ), 0);
892 if (mesh.tangents.size()) networkMesh._vertexFormat.setAttribute(gpu::StreamFormat::SLOT_TANGENT, channelNum++, gpu::Element(gpu::Element::DIM_VEC3, gpu::Element::TYPE_FLOAT, gpu::Element::SEMANTIC_POS_XYZ), 0);
893 if (mesh.colors.size()) networkMesh._vertexFormat.setAttribute(gpu::StreamFormat::SLOT_COLOR, channelNum++, gpu::Element(gpu::Element::DIM_VEC3, gpu::Element::TYPE_FLOAT, gpu::Element::SEMANTIC_POS_XYZ), 0);
894 if (mesh.texCoords.size()) networkMesh._vertexFormat.setAttribute(gpu::StreamFormat::SLOT_TEXCOORD, channelNum++, gpu::Element(gpu::Element::DIM_VEC2, gpu::Element::TYPE_FLOAT, gpu::Element::SEMANTIC_POS_XYZ), 0);
895 if (mesh.clusterIndices.size()) networkMesh._vertexFormat.setAttribute(gpu::StreamFormat::SLOT_SKIN_CLUSTER_INDEX, channelNum++, gpu::Element(gpu::Element::DIM_VEC4, gpu::Element::TYPE_FLOAT, gpu::Element::SEMANTIC_POS_XYZ), 0);
896 if (mesh.clusterWeights.size()) networkMesh._vertexFormat.setAttribute(gpu::StreamFormat::SLOT_SKIN_CLUSTER_WEIGHT, channelNum++, gpu::Element(gpu::Element::DIM_VEC4, gpu::Element::TYPE_FLOAT, gpu::Element::SEMANTIC_POS_XYZ), 0);
897 }
898 else {
899 int colorsOffset = mesh.tangents.size() * sizeof(glm::vec3);
900 int texCoordsOffset = colorsOffset + mesh.colors.size() * sizeof(glm::vec3);
901 int clusterIndicesOffset = texCoordsOffset + mesh.texCoords.size() * sizeof(glm::vec2);
902 int clusterWeightsOffset = clusterIndicesOffset + mesh.clusterIndices.size() * sizeof(glm::vec4);
903
904 networkMesh._vertexBuffer->resize(clusterWeightsOffset + mesh.clusterWeights.size() * sizeof(glm::vec4));
905 networkMesh._vertexBuffer->setSubData(0, mesh.tangents.size() * sizeof(glm::vec3), (gpu::Resource::Byte*) mesh.tangents.constData());
906 networkMesh._vertexBuffer->setSubData(colorsOffset, mesh.colors.size() * sizeof(glm::vec3), (gpu::Resource::Byte*) mesh.colors.constData());
907 networkMesh._vertexBuffer->setSubData(texCoordsOffset,
908 mesh.texCoords.size() * sizeof(glm::vec2), (gpu::Resource::Byte*) mesh.texCoords.constData());
909 networkMesh._vertexBuffer->setSubData(clusterIndicesOffset,
910 mesh.clusterIndices.size() * sizeof(glm::vec4), (gpu::Resource::Byte*) mesh.clusterIndices.constData());
911 networkMesh._vertexBuffer->setSubData(clusterWeightsOffset,
912 mesh.clusterWeights.size() * sizeof(glm::vec4), (gpu::Resource::Byte*) mesh.clusterWeights.constData());
913
914 if (mesh.tangents.size()) networkMesh._vertexStream.addBuffer(networkMesh._vertexBuffer, 0, sizeof(glm::vec3));
915 if (mesh.colors.size()) networkMesh._vertexStream.addBuffer(networkMesh._vertexBuffer, colorsOffset, sizeof(glm::vec3));
916 if (mesh.texCoords.size()) networkMesh._vertexStream.addBuffer(networkMesh._vertexBuffer, texCoordsOffset, sizeof(glm::vec2));
917 if (mesh.clusterIndices.size()) networkMesh._vertexStream.addBuffer(networkMesh._vertexBuffer, clusterIndicesOffset, sizeof(glm::vec4));
918 if (mesh.clusterWeights.size()) networkMesh._vertexStream.addBuffer(networkMesh._vertexBuffer, clusterWeightsOffset, sizeof(glm::vec4));
919
920 int channelNum = 0;
921 if (mesh.tangents.size()) networkMesh._vertexFormat.setAttribute(gpu::StreamFormat::SLOT_TANGENT, channelNum++, gpu::Element(gpu::Element::DIM_VEC3, gpu::Element::TYPE_FLOAT, gpu::Element::SEMANTIC_POS_XYZ), 0);
922 if (mesh.colors.size()) networkMesh._vertexFormat.setAttribute(gpu::StreamFormat::SLOT_COLOR, channelNum++, gpu::Element(gpu::Element::DIM_VEC3, gpu::Element::TYPE_FLOAT, gpu::Element::SEMANTIC_POS_XYZ), 0);
923 if (mesh.texCoords.size()) networkMesh._vertexFormat.setAttribute(gpu::StreamFormat::SLOT_TEXCOORD, channelNum++, gpu::Element(gpu::Element::DIM_VEC2, gpu::Element::TYPE_FLOAT, gpu::Element::SEMANTIC_POS_XYZ), 0);
924 if (mesh.clusterIndices.size()) networkMesh._vertexFormat.setAttribute(gpu::StreamFormat::SLOT_SKIN_CLUSTER_INDEX, channelNum++, gpu::Element(gpu::Element::DIM_VEC4, gpu::Element::TYPE_FLOAT, gpu::Element::SEMANTIC_POS_XYZ), 0);
925 if (mesh.clusterWeights.size()) networkMesh._vertexFormat.setAttribute(gpu::StreamFormat::SLOT_SKIN_CLUSTER_WEIGHT, channelNum++, gpu::Element(gpu::Element::DIM_VEC4, gpu::Element::TYPE_FLOAT, gpu::Element::SEMANTIC_POS_XYZ), 0);
926
927 }
928 }
836 929
837 _meshes.append(networkMesh);930 _meshes.append(networkMesh);
838 }931 }