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
840 _geometry = geometry;840 _geometry = geometry;
841 841
842 foreach (const FBXMesh& mesh, _geometry.meshes) {842 foreach (const FBXMesh& mesh, _geometry.meshes) {
843 NetworkMesh networkMesh = { QOpenGLBuffer(QOpenGLBuffer::IndexBuffer), QOpenGLBuffer(QOpenGLBuffer::VertexBuffer) };843 NetworkMesh networkMesh;
844 844
845 int totalIndices = 0;845 int totalIndices = 0;
846 foreach (const FBXMeshPart& part, mesh.parts) {846 foreach (const FBXMeshPart& part, mesh.parts) {
@@ -870,67 +870,103 @@ void NetworkGeometry::setGeometry(const FBXGeometry& geometry) { · 23 unmodified lines
870 870
871 totalIndices += (part.quadIndices.size() + part.triangleIndices.size());871 totalIndices += (part.quadIndices.size() + part.triangleIndices.size());
872 }872 }
873 873
874 networkMesh.indexBuffer.create();874 {
875 networkMesh.indexBuffer.bind();875 networkMesh._indexBuffer = gpu::BufferPointer(new gpu::Buffer());
876 networkMesh.indexBuffer.setUsagePattern(QOpenGLBuffer::StaticDraw);876 networkMesh._indexBuffer->resize(totalIndices * sizeof(int));
877 networkMesh.indexBuffer.allocate(totalIndices * sizeof(int));877 int offset = 0;
878 int offset = 0;878 foreach(const FBXMeshPart& part, mesh.parts) {
879 foreach (const FBXMeshPart& part, mesh.parts) {879 networkMesh._indexBuffer->setSubData(offset, part.quadIndices.size() * sizeof(int),
880 glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, offset, part.quadIndices.size() * sizeof(int),880 (gpu::Resource::Byte*) part.quadIndices.constData());
881 part.quadIndices.constData());881 offset += part.quadIndices.size() * sizeof(int);
882 offset += part.quadIndices.size() * sizeof(int);882 networkMesh._indexBuffer->setSubData(offset, part.triangleIndices.size() * sizeof(int),
883 glBufferSubData(GL_ELEMENT_ARRAY_BUFFER, offset, part.triangleIndices.size() * sizeof(int),883 (gpu::Resource::Byte*) part.triangleIndices.constData());
884 part.triangleIndices.constData());884 offset += part.triangleIndices.size() * sizeof(int);
885 offset += part.triangleIndices.size() * sizeof(int);885 }
886 }886 }
887 networkMesh.indexBuffer.release();887
888 888 {
889 networkMesh.vertexBuffer.create();889 networkMesh._vertexBuffer = gpu::BufferPointer(new gpu::Buffer());
890 networkMesh.vertexBuffer.bind();890 // if we don't need to do any blending, the positions/normals can be static
891 networkMesh.vertexBuffer.setUsagePattern(QOpenGLBuffer::StaticDraw);891 if (mesh.blendshapes.isEmpty()) {
892 892 int normalsOffset = mesh.vertices.size() * sizeof(glm::vec3);
893 // if we don't need to do any blending, the positions/normals can be static893 int tangentsOffset = normalsOffset + mesh.normals.size() * sizeof(glm::vec3);
894 if (mesh.blendshapes.isEmpty()) {894 int colorsOffset = tangentsOffset + mesh.tangents.size() * sizeof(glm::vec3);
895 int normalsOffset = mesh.vertices.size() * sizeof(glm::vec3);895 int texCoordsOffset = colorsOffset + mesh.colors.size() * sizeof(glm::vec3);
896 int tangentsOffset = normalsOffset + mesh.normals.size() * sizeof(glm::vec3);896 int clusterIndicesOffset = texCoordsOffset + mesh.texCoords.size() * sizeof(glm::vec2);
897 int colorsOffset = tangentsOffset + mesh.tangents.size() * sizeof(glm::vec3);897 int clusterWeightsOffset = clusterIndicesOffset + mesh.clusterIndices.size() * sizeof(glm::vec4);
898 int texCoordsOffset = colorsOffset + mesh.colors.size() * sizeof(glm::vec3);898
899 int clusterIndicesOffset = texCoordsOffset + mesh.texCoords.size() * sizeof(glm::vec2);899 networkMesh._vertexBuffer->resize(clusterWeightsOffset + mesh.clusterWeights.size() * sizeof(glm::vec4));
900 int clusterWeightsOffset = clusterIndicesOffset + mesh.clusterIndices.size() * sizeof(glm::vec4);900 //networkMesh.vertexBuffer.allocate(clusterWeightsOffset + mesh.clusterWeights.size() * sizeof(glm::vec4));
901 901
902 networkMesh.vertexBuffer.allocate(clusterWeightsOffset + mesh.clusterWeights.size() * sizeof(glm::vec4));902 networkMesh._vertexBuffer->setSubData(0, mesh.vertices.size() * sizeof(glm::vec3), (gpu::Resource::Byte*) mesh.vertices.constData());
903 networkMesh.vertexBuffer.write(0, mesh.vertices.constData(), mesh.vertices.size() * sizeof(glm::vec3));903 networkMesh._vertexBuffer->setSubData(normalsOffset, mesh.normals.size() * sizeof(glm::vec3), (gpu::Resource::Byte*) mesh.normals.constData());
904 networkMesh.vertexBuffer.write(normalsOffset, mesh.normals.constData(), mesh.normals.size() * sizeof(glm::vec3));904 networkMesh._vertexBuffer->setSubData(tangentsOffset,
905 networkMesh.vertexBuffer.write(tangentsOffset, mesh.tangents.constData(),905 mesh.tangents.size() * sizeof(glm::vec3), (gpu::Resource::Byte*) mesh.tangents.constData());
906 mesh.tangents.size() * sizeof(glm::vec3));906 networkMesh._vertexBuffer->setSubData(colorsOffset, mesh.colors.size() * sizeof(glm::vec3), (gpu::Resource::Byte*) mesh.colors.constData());
907 networkMesh.vertexBuffer.write(colorsOffset, mesh.colors.constData(), mesh.colors.size() * sizeof(glm::vec3));907 networkMesh._vertexBuffer->setSubData(texCoordsOffset,
908 networkMesh.vertexBuffer.write(texCoordsOffset, mesh.texCoords.constData(),908 mesh.texCoords.size() * sizeof(glm::vec2), (gpu::Resource::Byte*) mesh.texCoords.constData());
909 mesh.texCoords.size() * sizeof(glm::vec2));909 networkMesh._vertexBuffer->setSubData(clusterIndicesOffset,
910 networkMesh.vertexBuffer.write(clusterIndicesOffset, mesh.clusterIndices.constData(),910 mesh.clusterIndices.size() * sizeof(glm::vec4), (gpu::Resource::Byte*) mesh.clusterIndices.constData());
911 mesh.clusterIndices.size() * sizeof(glm::vec4));911 networkMesh._vertexBuffer->setSubData(clusterWeightsOffset,
912 networkMesh.vertexBuffer.write(clusterWeightsOffset, mesh.clusterWeights.constData(),912 mesh.clusterWeights.size() * sizeof(glm::vec4), (gpu::Resource::Byte*) mesh.clusterWeights.constData());
913 mesh.clusterWeights.size() * sizeof(glm::vec4));913
914 914 // otherwise, at least the cluster indices/weights can be static
915 // otherwise, at least the cluster indices/weights can be static915 networkMesh._vertexStream = gpu::BufferStreamPointer(new gpu::BufferStream());
916 } else {916 networkMesh._vertexStream->addBuffer(networkMesh._vertexBuffer, 0, sizeof(glm::vec3));
917 int colorsOffset = mesh.tangents.size() * sizeof(glm::vec3);917 if (mesh.normals.size()) networkMesh._vertexStream->addBuffer(networkMesh._vertexBuffer, normalsOffset, sizeof(glm::vec3));
918 int texCoordsOffset = colorsOffset + mesh.colors.size() * sizeof(glm::vec3);918 if (mesh.tangents.size()) networkMesh._vertexStream->addBuffer(networkMesh._vertexBuffer, tangentsOffset, sizeof(glm::vec3));
919 int clusterIndicesOffset = texCoordsOffset + mesh.texCoords.size() * sizeof(glm::vec2);919 if (mesh.colors.size()) networkMesh._vertexStream->addBuffer(networkMesh._vertexBuffer, colorsOffset, sizeof(glm::vec3));
920 int clusterWeightsOffset = clusterIndicesOffset + mesh.clusterIndices.size() * sizeof(glm::vec4);920 if (mesh.texCoords.size()) networkMesh._vertexStream->addBuffer(networkMesh._vertexBuffer, texCoordsOffset, sizeof(glm::vec2));
921 networkMesh.vertexBuffer.allocate(clusterWeightsOffset + mesh.clusterWeights.size() * sizeof(glm::vec4));921 if (mesh.clusterIndices.size()) networkMesh._vertexStream->addBuffer(networkMesh._vertexBuffer, clusterIndicesOffset, sizeof(glm::vec4));
922 networkMesh.vertexBuffer.write(0, mesh.tangents.constData(), mesh.tangents.size() * sizeof(glm::vec3)); 922 if (mesh.clusterWeights.size()) networkMesh._vertexStream->addBuffer(networkMesh._vertexBuffer, clusterWeightsOffset, sizeof(glm::vec4));
923 networkMesh.vertexBuffer.write(colorsOffset, mesh.colors.constData(), mesh.colors.size() * sizeof(glm::vec3)); 923
924 networkMesh.vertexBuffer.write(texCoordsOffset, mesh.texCoords.constData(),924 int channelNum = 0;
925 mesh.texCoords.size() * sizeof(glm::vec2));925 networkMesh._vertexFormat = gpu::Stream::FormatPointer(new gpu::Stream::Format());
926 networkMesh.vertexBuffer.write(clusterIndicesOffset, mesh.clusterIndices.constData(),926 networkMesh._vertexFormat->setAttribute(gpu::Stream::POSITION, channelNum++, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::POS_XYZ), 0);
927 mesh.clusterIndices.size() * sizeof(glm::vec4));927 if (mesh.normals.size()) networkMesh._vertexFormat->setAttribute(gpu::Stream::NORMAL, channelNum++, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ));
928 networkMesh.vertexBuffer.write(clusterWeightsOffset, mesh.clusterWeights.constData(),928 if (mesh.tangents.size()) networkMesh._vertexFormat->setAttribute(gpu::Stream::TANGENT, channelNum++, gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ));
929 mesh.clusterWeights.size() * sizeof(glm::vec4)); 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 }
930 }968 }
931 969
932 networkMesh.vertexBuffer.release();
933
934 _meshes.append(networkMesh);970 _meshes.append(networkMesh);
935 }971 }
936 972