History

Merge pull request #3740 from samcake/temp0

Introduce the input stream stage to the gpu::Batch and apply it for model rendering

AndrewMeadows committed 12 years ago

Commit efd96262 parents ca7b975 bed524717 files · +1038 −272Browse files

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

Unified · Split

interface/src/renderer/GeometryCache.cpp+96−60
@@ -840,7 +840,7 @@ void NetworkGeometry::setGeometry(const FBXGeometry& geometry) { · 839 unmodified lines
840840 _geometry = geometry;
841841
842842 foreach (const FBXMesh& mesh, _geometry.meshes) {
843− NetworkMesh networkMesh = { QOpenGLBuffer(QOpenGLBuffer::IndexBuffer), QOpenGLBuffer(QOpenGLBuffer::VertexBuffer) };
843+ NetworkMesh networkMesh;
844844
845845 int totalIndices = 0;
846846 foreach (const FBXMeshPart& part, mesh.parts) {
@@ -870,67 +870,103 @@ void NetworkGeometry::setGeometry(const FBXGeometry& geometry) { · 23 unmodified lines
870870
871871 totalIndices += (part.quadIndices.size() + part.triangleIndices.size());
872872 }
873−
874− networkMesh.indexBuffer.create();
875− networkMesh.indexBuffer.bind();
876− networkMesh.indexBuffer.setUsagePattern(QOpenGLBuffer::StaticDraw);
877− networkMesh.indexBuffer.allocate(totalIndices * sizeof(int));
878− int offset = 0;
879− foreach (const FBXMeshPart& part, mesh.parts) {
880− glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, offset, part.quadIndices.size() * sizeof(int),
881− part.quadIndices.constData());
882− offset += part.quadIndices.size() * sizeof(int);
883− glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, offset, part.triangleIndices.size() * sizeof(int),
884− part.triangleIndices.constData());
885− offset += part.triangleIndices.size() * sizeof(int);
873+
874+ {
875+ networkMesh._indexBuffer = gpu::BufferPointer(new gpu::Buffer());
876+ networkMesh._indexBuffer->resize(totalIndices * sizeof(int));
877+ int offset = 0;
878+ foreach(const FBXMeshPart& part, mesh.parts) {
879+ networkMesh._indexBuffer->setSubData(offset, part.quadIndices.size() * sizeof(int),
880+ (gpu::Resource::Byte*) part.quadIndices.constData());
881+ offset += part.quadIndices.size() * sizeof(int);
882+ networkMesh._indexBuffer->setSubData(offset, part.triangleIndices.size() * sizeof(int),
883+ (gpu::Resource::Byte*) part.triangleIndices.constData());
884+ offset += part.triangleIndices.size() * sizeof(int);
885+ }
886886 }
887− networkMesh.indexBuffer.release();
888−
889− networkMesh.vertexBuffer.create();
890− networkMesh.vertexBuffer.bind();
891− networkMesh.vertexBuffer.setUsagePattern(QOpenGLBuffer::StaticDraw);
892−
893− // if we don't need to do any blending, the positions/normals can be static
894− if (mesh.blendshapes.isEmpty()) {
895− int normalsOffset = mesh.vertices.size() * sizeof(glm::vec3);
896− int tangentsOffset = normalsOffset + mesh.normals.size() * sizeof(glm::vec3);
897− int colorsOffset = tangentsOffset + mesh.tangents.size() * sizeof(glm::vec3);
898− int texCoordsOffset = colorsOffset + mesh.colors.size() * sizeof(glm::vec3);
899− int clusterIndicesOffset = texCoordsOffset + mesh.texCoords.size() * sizeof(glm::vec2);
900− int clusterWeightsOffset = clusterIndicesOffset + mesh.clusterIndices.size() * sizeof(glm::vec4);
901−
902− networkMesh.vertexBuffer.allocate(clusterWeightsOffset + mesh.clusterWeights.size() * sizeof(glm::vec4));
903− networkMesh.vertexBuffer.write(0, mesh.vertices.constData(), mesh.vertices.size() * sizeof(glm::vec3));
904− networkMesh.vertexBuffer.write(normalsOffset, mesh.normals.constData(), mesh.normals.size() * sizeof(glm::vec3));
905− networkMesh.vertexBuffer.write(tangentsOffset, mesh.tangents.constData(),
906− mesh.tangents.size() * sizeof(glm::vec3));
907− networkMesh.vertexBuffer.write(colorsOffset, mesh.colors.constData(), mesh.colors.size() * sizeof(glm::vec3));
908− networkMesh.vertexBuffer.write(texCoordsOffset, mesh.texCoords.constData(),
909− mesh.texCoords.size() * sizeof(glm::vec2));
910− networkMesh.vertexBuffer.write(clusterIndicesOffset, mesh.clusterIndices.constData(),
911− mesh.clusterIndices.size() * sizeof(glm::vec4));
912− networkMesh.vertexBuffer.write(clusterWeightsOffset, mesh.clusterWeights.constData(),
913− mesh.clusterWeights.size() * sizeof(glm::vec4));
914−
915− // otherwise, at least the cluster indices/weights can be static
916− } else {
917− int colorsOffset = mesh.tangents.size() * sizeof(glm::vec3);
918− int texCoordsOffset = colorsOffset + mesh.colors.size() * sizeof(glm::vec3);
919− int clusterIndicesOffset = texCoordsOffset + mesh.texCoords.size() * sizeof(glm::vec2);
920− int clusterWeightsOffset = clusterIndicesOffset + mesh.clusterIndices.size() * sizeof(glm::vec4);
921− networkMesh.vertexBuffer.allocate(clusterWeightsOffset + mesh.clusterWeights.size() * sizeof(glm::vec4));
922− networkMesh.vertexBuffer.write(0, mesh.tangents.constData(), mesh.tangents.size() * sizeof(glm::vec3));
923− networkMesh.vertexBuffer.write(colorsOffset, mesh.colors.constData(), mesh.colors.size() * sizeof(glm::vec3));
924− networkMesh.vertexBuffer.write(texCoordsOffset, mesh.texCoords.constData(),
925− mesh.texCoords.size() * sizeof(glm::vec2));
926− networkMesh.vertexBuffer.write(clusterIndicesOffset, mesh.clusterIndices.constData(),
927− mesh.clusterIndices.size() * sizeof(glm::vec4));
928− networkMesh.vertexBuffer.write(clusterWeightsOffset, mesh.clusterWeights.constData(),
929− mesh.clusterWeights.size() * sizeof(glm::vec4));
887+
888+ {
889+ networkMesh._vertexBuffer = gpu::BufferPointer(new gpu::Buffer());
890+ // if we don't need to do any blending, the positions/normals can be static
891+ if (mesh.blendshapes.isEmpty()) {
892+ int normalsOffset = mesh.vertices.size() * sizeof(glm::vec3);
893+ int tangentsOffset = normalsOffset + mesh.normals.size() * sizeof(glm::vec3);
894+ int colorsOffset = tangentsOffset + mesh.tangents.size() * sizeof(glm::vec3);
895+ int texCoordsOffset = colorsOffset + mesh.colors.size() * sizeof(glm::vec3);
896+ int clusterIndicesOffset = texCoordsOffset + mesh.texCoords.size() * sizeof(glm::vec2);
897+ int clusterWeightsOffset = clusterIndicesOffset + mesh.clusterIndices.size() * sizeof(glm::vec4);
898+
899+ networkMesh._vertexBuffer->resize(clusterWeightsOffset + mesh.clusterWeights.size() * sizeof(glm::vec4));
900+ //networkMesh.vertexBuffer.allocate(clusterWeightsOffset + mesh.clusterWeights.size() * sizeof(glm::vec4));
901+
902+ networkMesh._vertexBuffer->setSubData(0, mesh.vertices.size() * sizeof(glm::vec3), (gpu::Resource::Byte*) mesh.vertices.constData());
903+ networkMesh._vertexBuffer->setSubData(normalsOffset, mesh.normals.size() * sizeof(glm::vec3), (gpu::Resource::Byte*) mesh.normals.constData());
904+ networkMesh._vertexBuffer->setSubData(tangentsOffset,
905+ 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+ // otherwise, at least the cluster indices/weights can be static
915+ networkMesh._vertexStream = gpu::BufferStreamPointer(new gpu::BufferStream());
916+ networkMesh._vertexStream->addBuffer(networkMesh._vertexBuffer, 0, sizeof(glm::vec3));
917+ if (mesh.normals.size()) networkMesh._vertexStream->addBuffer(networkMesh._vertexBuffer, normalsOffset, sizeof(glm::vec3));
918+ if (mesh.tangents.size()) networkMesh._vertexStream->addBuffer(networkMesh._vertexBuffer, tangentsOffset, sizeof(glm::vec3));
919+ if (mesh.colors.size()) networkMesh._vertexStream->addBuffer(networkMesh._vertexBuffer, colorsOffset, sizeof(glm::vec3));
920+ if (mesh.texCoords.size()) networkMesh._vertexStream->addBuffer(networkMesh._vertexBuffer, texCoordsOffset, sizeof(glm::vec2));
921+ if (mesh.clusterIndices.size()) networkMesh._vertexStream->addBuffer(networkMesh._vertexBuffer, clusterIndicesOffset, sizeof(glm::vec4));
922+ if (mesh.clusterWeights.size()) networkMesh._vertexStream->addBuffer(networkMesh._vertexBuffer, clusterWeightsOffset, sizeof(glm::vec4));
923+
924+ int channelNum = 0;
925+ networkMesh._vertexFormat = gpu::Stream::FormatPointer(new gpu::Stream::Format());
926+ networkMesh._vertexFormat->setAttribute(gpu::Stream::POSITION, channelNum++, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::POS_XYZ), 0);
927+ if (mesh.normals.size()) networkMesh._vertexFormat->setAttribute(gpu::Stream::NORMAL, channelNum++, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ));
928+ if (mesh.tangents.size()) networkMesh._vertexFormat->setAttribute(gpu::Stream::TANGENT, channelNum++, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ));
929+ if (mesh.colors.size()) networkMesh._vertexFormat->setAttribute(gpu::Stream::COLOR, channelNum++, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::RGB));
930+ if (mesh.texCoords.size()) networkMesh._vertexFormat->setAttribute(gpu::Stream::TEXCOORD, channelNum++, gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::UV));
931+ if (mesh.clusterIndices.size()) networkMesh._vertexFormat->setAttribute(gpu::Stream::SKIN_CLUSTER_INDEX, channelNum++, gpu::Element(gpu::VEC4, gpu::NFLOAT, gpu::XYZW));
932+ if (mesh.clusterWeights.size()) networkMesh._vertexFormat->setAttribute(gpu::Stream::SKIN_CLUSTER_WEIGHT, channelNum++, gpu::Element(gpu::VEC4, gpu::NFLOAT, gpu::XYZW));
933+ }
934+ else {
935+ int colorsOffset = mesh.tangents.size() * sizeof(glm::vec3);
936+ int texCoordsOffset = colorsOffset + mesh.colors.size() * sizeof(glm::vec3);
937+ int clusterIndicesOffset = texCoordsOffset + mesh.texCoords.size() * sizeof(glm::vec2);
938+ int clusterWeightsOffset = clusterIndicesOffset + mesh.clusterIndices.size() * sizeof(glm::vec4);
939+
940+ networkMesh._vertexBuffer->resize(clusterWeightsOffset + mesh.clusterWeights.size() * sizeof(glm::vec4));
941+ networkMesh._vertexBuffer->setSubData(0, mesh.tangents.size() * sizeof(glm::vec3), (gpu::Resource::Byte*) mesh.tangents.constData());
942+ networkMesh._vertexBuffer->setSubData(colorsOffset, mesh.colors.size() * sizeof(glm::vec3), (gpu::Resource::Byte*) mesh.colors.constData());
943+ networkMesh._vertexBuffer->setSubData(texCoordsOffset,
944+ mesh.texCoords.size() * sizeof(glm::vec2), (gpu::Resource::Byte*) mesh.texCoords.constData());
945+ networkMesh._vertexBuffer->setSubData(clusterIndicesOffset,
946+ mesh.clusterIndices.size() * sizeof(glm::vec4), (gpu::Resource::Byte*) mesh.clusterIndices.constData());
947+ networkMesh._vertexBuffer->setSubData(clusterWeightsOffset,
948+ mesh.clusterWeights.size() * sizeof(glm::vec4), (gpu::Resource::Byte*) mesh.clusterWeights.constData());
949+
950+ networkMesh._vertexStream = gpu::BufferStreamPointer(new gpu::BufferStream());
951+ if (mesh.tangents.size()) networkMesh._vertexStream->addBuffer(networkMesh._vertexBuffer, 0, sizeof(glm::vec3));
952+ if (mesh.colors.size()) networkMesh._vertexStream->addBuffer(networkMesh._vertexBuffer, colorsOffset, sizeof(glm::vec3));
953+ if (mesh.texCoords.size()) networkMesh._vertexStream->addBuffer(networkMesh._vertexBuffer, texCoordsOffset, sizeof(glm::vec2));
954+ if (mesh.clusterIndices.size()) networkMesh._vertexStream->addBuffer(networkMesh._vertexBuffer, clusterIndicesOffset, sizeof(glm::vec4));
955+ if (mesh.clusterWeights.size()) networkMesh._vertexStream->addBuffer(networkMesh._vertexBuffer, clusterWeightsOffset, sizeof(glm::vec4));
956+
957+ int channelNum = 0;
958+ networkMesh._vertexFormat = gpu::Stream::FormatPointer(new gpu::Stream::Format());
959+ networkMesh._vertexFormat->setAttribute(gpu::Stream::POSITION, channelNum++, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::POS_XYZ));
960+ if (mesh.normals.size()) networkMesh._vertexFormat->setAttribute(gpu::Stream::NORMAL, channelNum++, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ));
961+ if (mesh.tangents.size()) networkMesh._vertexFormat->setAttribute(gpu::Stream::TANGENT, channelNum++, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ));
962+ if (mesh.colors.size()) networkMesh._vertexFormat->setAttribute(gpu::Stream::COLOR, channelNum++, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::RGB));
963+ if (mesh.texCoords.size()) networkMesh._vertexFormat->setAttribute(gpu::Stream::TEXCOORD, channelNum++, gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::UV));
964+ if (mesh.clusterIndices.size()) networkMesh._vertexFormat->setAttribute(gpu::Stream::SKIN_CLUSTER_INDEX, channelNum++, gpu::Element(gpu::VEC4, gpu::NFLOAT, gpu::XYZW));
965+ if (mesh.clusterWeights.size()) networkMesh._vertexFormat->setAttribute(gpu::Stream::SKIN_CLUSTER_WEIGHT, channelNum++, gpu::Element(gpu::VEC4, gpu::NFLOAT, gpu::XYZW));
966+
967+ }
930968 }
931−
932− networkMesh.vertexBuffer.release();
933−
969+
934970 _meshes.append(networkMesh);
935971 }
936972