Introduce the input stream stage to the gpu::Batch and apply it for model rendering
Showing the changes to interface/src/renderer/GeometryCache.cpp (1 of 17 files). Show all
Unified · Split
| @@ -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 static | 893 | 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 static | 915 | 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 | ||