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 | 840 | _geometry = geometry; |
| 841 | 841 | |
| 842 | 842 | foreach (const FBXMesh& mesh, _geometry.meshes) { |
| 843 | − NetworkMesh networkMesh = { QOpenGLBuffer(QOpenGLBuffer::IndexBuffer), QOpenGLBuffer(QOpenGLBuffer::VertexBuffer) }; | |
| 843 | + NetworkMesh networkMesh; | |
| 844 | 844 | |
| 845 | 845 | int totalIndices = 0; |
| 846 | 846 | foreach (const FBXMeshPart& part, mesh.parts) { |
| @@ -870,67 +870,103 @@ void NetworkGeometry::setGeometry(const FBXGeometry& geometry) { · 23 unmodified lines | ||
| 870 | 870 | |
| 871 | 871 | totalIndices += (part.quadIndices.size() + part.triangleIndices.size()); |
| 872 | 872 | } |
| 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 | + } | |
| 886 | 886 | } |
| 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 | + } | |
| 930 | 968 | } |
| 931 | − | |
| 932 | − networkMesh.vertexBuffer.release(); | |
| 933 | − | |
| 969 | + | |
| 934 | 970 | _meshes.append(networkMesh); |
| 935 | 971 | } |
| 936 | 972 | |