Showing the changes to interface/src/renderer/GeometryCache.cpp (1 of 9 files). Show all
Unified · Split
| @@ -773,7 +773,7 @@ void NetworkGeometry::setGeometry(const FBXGeometry& geometry) { · 772 unmodified lines | |||
| 773 | 773 | ||
| 774 | totalIndices += (part.quadIndices.size() + part.triangleIndices.size()); | 774 | totalIndices += (part.quadIndices.size() + part.triangleIndices.size()); |
| 775 | } | 775 | } |
| 776 | 776 | /* | |
| 777 | networkMesh.indexBuffer.create(); | 777 | networkMesh.indexBuffer.create(); |
| 778 | networkMesh.indexBuffer.bind(); | 778 | networkMesh.indexBuffer.bind(); |
| 779 | networkMesh.indexBuffer.setUsagePattern(QOpenGLBuffer::StaticDraw); | 779 | networkMesh.indexBuffer.setUsagePattern(QOpenGLBuffer::StaticDraw); |
| @@ -788,8 +788,25 @@ void NetworkGeometry::setGeometry(const FBXGeometry& geometry) { · 8 unmodified lines | |||
| 788 | offset += part.triangleIndices.size() * sizeof(int); | 788 | offset += part.triangleIndices.size() * sizeof(int); |
| 789 | } | 789 | } |
| 790 | networkMesh.indexBuffer.release(); | 790 | networkMesh.indexBuffer.release(); |
| 791 | 791 | */ | |
| 792 | networkMesh.vertexBuffer.create(); | 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(); | ||
| 793 | networkMesh.vertexBuffer.bind(); | 810 | networkMesh.vertexBuffer.bind(); |
| 794 | networkMesh.vertexBuffer.setUsagePattern(QOpenGLBuffer::StaticDraw); | 811 | networkMesh.vertexBuffer.setUsagePattern(QOpenGLBuffer::StaticDraw); |
| 795 | 812 | ||
| @@ -833,6 +850,82 @@ void NetworkGeometry::setGeometry(const FBXGeometry& geometry) { · 37 unmodified lines | |||
| 833 | } | 850 | } |
| 834 | 851 | ||
| 835 | networkMesh.vertexBuffer.release(); | 852 | 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 | } | ||
| 836 | 929 | ||
| 837 | _meshes.append(networkMesh); | 930 | _meshes.append(networkMesh); |
| 838 | } | 931 | } |