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
773773
774774 totalIndices += (part.quadIndices.size() + part.triangleIndices.size());
775775 }
776−
776+ /*
777777 networkMesh.indexBuffer.create();
778778 networkMesh.indexBuffer.bind();
779779 networkMesh.indexBuffer.setUsagePattern(QOpenGLBuffer::StaticDraw);
@@ -788,8 +788,25 @@ void NetworkGeometry::setGeometry(const FBXGeometry& geometry) { · 8 unmodified lines
788788 offset += part.triangleIndices.size() * sizeof(int);
789789 }
790790 networkMesh.indexBuffer.release();
791−
792− networkMesh.vertexBuffer.create();
791+ */
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();
793810 networkMesh.vertexBuffer.bind();
794811 networkMesh.vertexBuffer.setUsagePattern(QOpenGLBuffer::StaticDraw);
795812
@@ -833,6 +850,82 @@ void NetworkGeometry::setGeometry(const FBXGeometry& geometry) { · 37 unmodified lines
833850 }
834851
835852 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+ }
836929
837930 _meshes.append(networkMesh);
838931 }