From edb485cb0f2ccac6c5f6533bc398611639b48a50 Mon Sep 17 00:00:00 2001 From: samcake Date: Fri, 2 Oct 2015 12:24:41 -0700 Subject: [PATCH] working on getting the Model payload to use model::Mesh --- libraries/fbx/src/FBXReader_Mesh.cpp | 25 +++++++++++++++---------- libraries/gpu/src/gpu/Stream.cpp | 13 +++++++++++++ libraries/gpu/src/gpu/Stream.h | 4 +++- libraries/render-utils/src/Model.cpp | 15 +++++++++------ 4 files changed, 40 insertions(+), 17 deletions(-) diff --git a/libraries/fbx/src/FBXReader_Mesh.cpp b/libraries/fbx/src/FBXReader_Mesh.cpp index 21b51245cb..299968d663 100644 --- a/libraries/fbx/src/FBXReader_Mesh.cpp +++ b/libraries/fbx/src/FBXReader_Mesh.cpp @@ -415,29 +415,34 @@ void FBXReader::buildModelMesh(ExtractedMesh& extracted, const QString& url) { if (normalsSize) { mesh->addAttribute(gpu::Stream::NORMAL, - model::BufferView(attribBuffer, normalsOffset, normalsSize, - gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ))); + model::BufferView(attribBuffer, normalsOffset, normalsSize, + gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ))); } if (tangentsSize) { mesh->addAttribute(gpu::Stream::TANGENT, - model::BufferView(attribBuffer, tangentsOffset, tangentsSize, - gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ))); + model::BufferView(attribBuffer, tangentsOffset, tangentsSize, + gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ))); } if (colorsSize) { mesh->addAttribute(gpu::Stream::COLOR, - model::BufferView(attribBuffer, colorsOffset, colorsSize, - gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::RGB))); + model::BufferView(attribBuffer, colorsOffset, colorsSize, + gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::RGB))); } if (texCoordsSize) { mesh->addAttribute(gpu::Stream::TEXCOORD, - model::BufferView( attribBuffer, texCoordsOffset, texCoordsSize, - gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::UV))); + model::BufferView( attribBuffer, texCoordsOffset, texCoordsSize, + gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::UV))); } if (texCoords1Size) { + mesh->addAttribute( gpu::Stream::TEXCOORD1, + model::BufferView(attribBuffer, texCoords1Offset, texCoords1Size, + gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::UV))); + } else if (texCoordsSize) { mesh->addAttribute(gpu::Stream::TEXCOORD1, - model::BufferView(attribBuffer, texCoords1Offset, texCoords1Size, - gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::UV))); + model::BufferView(attribBuffer, texCoordsOffset, texCoordsSize, + gpu::Element(gpu::VEC2, gpu::FLOAT, gpu::UV))); } + if (clusterIndicesSize) { mesh->addAttribute(gpu::Stream::SKIN_CLUSTER_INDEX, model::BufferView(attribBuffer, clusterIndicesOffset, clusterIndicesSize, diff --git a/libraries/gpu/src/gpu/Stream.cpp b/libraries/gpu/src/gpu/Stream.cpp index 61150ab90e..183f2137fb 100644 --- a/libraries/gpu/src/gpu/Stream.cpp +++ b/libraries/gpu/src/gpu/Stream.cpp @@ -92,3 +92,16 @@ void BufferStream::addBuffer(const BufferPointer& buffer, Offset offset, Offset _offsets.push_back(offset); _strides.push_back(stride); } + +BufferStream BufferStream::makeRangedStream(uint32 offset, uint32 count) const { + if ((offset < _buffers.size())) { + auto rangeSize = std::min(count, (uint32)(_buffers.size() - offset)); + BufferStream newStream; + newStream._buffers.insert(newStream._buffers.begin(), _buffers.begin() + offset, _buffers.begin() + offset + rangeSize); + newStream._offsets.insert(newStream._offsets.begin(), _offsets.begin() + offset, _offsets.begin() + offset + rangeSize); + newStream._strides.insert(newStream._strides.begin(), _strides.begin() + offset, _strides.begin() + offset + rangeSize); + return newStream; + } + + return BufferStream(); +} diff --git a/libraries/gpu/src/gpu/Stream.h b/libraries/gpu/src/gpu/Stream.h index 420aa50f72..53509c1033 100644 --- a/libraries/gpu/src/gpu/Stream.h +++ b/libraries/gpu/src/gpu/Stream.h @@ -139,7 +139,9 @@ public: const Buffers& getBuffers() const { return _buffers; } const Offsets& getOffsets() const { return _offsets; } const Strides& getStrides() const { return _strides; } - uint8 getNumBuffers() const { return _buffers.size(); } + uint32 getNumBuffers() const { return _buffers.size(); } + + BufferStream makeRangedStream(uint32 offset, uint32 count = -1) const; protected: Buffers _buffers; diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index c7649d27ed..872592a9a4 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -1573,14 +1573,17 @@ void Model::renderPart(RenderArgs* args, int meshIndex, int partIndex, int shape // batch.setInputFormat(networkMesh._vertexFormat); // batch.setInputStream(0, *networkMesh._vertexStream); } else { - return; - batch.setIndexBuffer(gpu::UINT32, (networkMesh._indexBuffer), 0); - batch.setInputFormat((drawMesh->getVertexFormat())); - auto inputStream = drawMesh->makeBufferStream(); + batch.setIndexBuffer(gpu::UINT32, (networkMesh._indexBuffer), 0); + batch.setInputFormat((drawMesh->getVertexFormat())); - batch.setInputStream(0, inputStream); + batch.setInputBuffer(0, _blendedVertexBuffers[meshIndex], 0, sizeof(glm::vec3)); + batch.setInputBuffer(1, _blendedVertexBuffers[meshIndex], vertexCount * sizeof(glm::vec3), sizeof(glm::vec3)); + + auto inputStream = drawMesh->makeBufferStream().makeRangedStream(2); - /* batch.setInputFormat(networkMesh._vertexFormat); + batch.setInputStream(2, inputStream); + + /* batch.setInputFormat(networkMesh._vertexFormat); batch.setInputBuffer(0, _blendedVertexBuffers[meshIndex], 0, sizeof(glm::vec3)); batch.setInputBuffer(1, _blendedVertexBuffers[meshIndex], vertexCount * sizeof(glm::vec3), sizeof(glm::vec3));