From ec6117e9bb7ba773dc8fd3dfa56ef68cd9d0b08f Mon Sep 17 00:00:00 2001 From: sam gateau Date: Tue, 18 Sep 2018 17:40:29 -0700 Subject: [PATCH] bringing the blendshape in skin shader only work in master --- libraries/fbx/src/FBX.h | 2 +- libraries/fbx/src/FBXReader_Mesh.cpp | 2 +- libraries/gpu/src/gpu/Transform.slh | 12 ++ .../render-utils/src/CauterizedModel.cpp | 6 +- .../render-utils/src/MeshPartPayload.cpp | 16 +-- libraries/render-utils/src/MeshPartPayload.h | 2 +- libraries/render-utils/src/Model.cpp | 125 ++++++------------ libraries/render-utils/src/Model.h | 17 ++- .../render-utils/src/SoftAttachmentModel.cpp | 2 +- libraries/render-utils/src/model.slv | 12 +- libraries/render-utils/src/model_fade.slv | 7 +- libraries/render-utils/src/model_lightmap.slv | 6 +- .../render-utils/src/model_normal_map.slv | 10 +- .../src/model_normal_map_fade.slv | 6 +- libraries/render-utils/src/model_shadow.slv | 8 +- .../render-utils/src/model_shadow_fade.slv | 8 +- .../src/render-utils/model_lightmap.slp | 1 + .../src/render-utils/model_lightmap_fade.slp | 1 + .../model_lightmap_normal_map.slp | 1 + .../model_lightmap_normal_map_fade.slp | 1 + .../src/render-utils/model_translucent.slp | 1 + .../model_translucent_normal_map.slp | 1 + .../model_translucent_normal_map_fade.slp | 2 +- libraries/render-utils/src/skin_model.slv | 8 +- libraries/render-utils/src/skin_model_dq.slv | 8 +- .../render-utils/src/skin_model_fade.slv | 7 +- .../render-utils/src/skin_model_fade_dq.slv | 6 +- .../src/skin_model_normal_map.slv | 8 +- .../src/skin_model_normal_map_dq.slv | 8 +- .../src/skin_model_normal_map_fade.slv | 7 +- .../src/skin_model_normal_map_fade_dq.slv | 8 +- .../render-utils/src/skin_model_shadow.slv | 8 +- .../render-utils/src/skin_model_shadow_dq.slv | 8 +- .../src/skin_model_shadow_fade.slv | 7 +- .../src/skin_model_shadow_fade_dq.slv | 7 +- 35 files changed, 141 insertions(+), 198 deletions(-) diff --git a/libraries/fbx/src/FBX.h b/libraries/fbx/src/FBX.h index fdebb16bc8..3eb963550e 100644 --- a/libraries/fbx/src/FBX.h +++ b/libraries/fbx/src/FBX.h @@ -31,7 +31,7 @@ #if defined(Q_OS_ANDROID) #define FBX_PACK_NORMALS 0 #else -#define FBX_PACK_NORMALS 1 +#define FBX_PACK_NORMALS 0 #endif #if FBX_PACK_NORMALS diff --git a/libraries/fbx/src/FBXReader_Mesh.cpp b/libraries/fbx/src/FBXReader_Mesh.cpp index e8b5abcc9c..692c55d297 100644 --- a/libraries/fbx/src/FBXReader_Mesh.cpp +++ b/libraries/fbx/src/FBXReader_Mesh.cpp @@ -765,7 +765,7 @@ void FBXReader::buildModelMesh(FBXMesh& extractedMesh, const QString& url) { // This work is going into rc73 release which is meant to be used for the SPot500 event and we are picking the format // that works best for blendshaped and skinned meshes aka the avatars. // We will improve this technique in a hot fix to 73. - hasBlendShapes = true; + hasBlendShapes = false; // If has blend shapes allocate and assign buffers for pos and tangents now if (hasBlendShapes) { diff --git a/libraries/gpu/src/gpu/Transform.slh b/libraries/gpu/src/gpu/Transform.slh index d0b7587da6..c6780a64d2 100644 --- a/libraries/gpu/src/gpu/Transform.slh +++ b/libraries/gpu/src/gpu/Transform.slh @@ -214,6 +214,18 @@ TransformObject getTransformObject() { } <@endfunc@> +<@func transformModelToWorldAndEyeAndClipPos(cameraTransform, objectTransform, modelPos, worldPos, eyePos, clipPos)@> + { // transformModelToEyeAndClipPos + vec4 eyeWAPos; + <$transformModelToEyeWorldAlignedPos($cameraTransform$, $objectTransform$, $modelPos$, eyeWAPos)$> + <$worldPos$> = vec4(eyeWAPos.xyz - <$cameraTransform$>._view[3].xyz, 1.0); + <$clipPos$> = <$cameraTransform$>._projectionViewUntranslated * eyeWAPos; + <$eyePos$> = vec4((<$cameraTransform$>._view * vec4(eyeWAPos.xyz, 0.0)).xyz, 1.0); + + <$transformStereoClipsSpace($cameraTransform$, $clipPos$)$> + } +<@endfunc@> + <@func transformModelToEyePos(cameraTransform, objectTransform, modelPos, eyePos)@> { // transformModelToEyePos vec4 eyeWAPos; diff --git a/libraries/render-utils/src/CauterizedModel.cpp b/libraries/render-utils/src/CauterizedModel.cpp index ffb652f923..e4f0dd0ecd 100644 --- a/libraries/render-utils/src/CauterizedModel.cpp +++ b/libraries/render-utils/src/CauterizedModel.cpp @@ -86,7 +86,7 @@ void CauterizedModel::createRenderItemSet() { // Create the render payloads int numParts = (int)mesh->getNumParts(); for (int partIndex = 0; partIndex < numParts; partIndex++) { - if (!fbxGeometry.meshes[i].blendshapes.empty() && _blendedVertexBuffers.find(i) == _blendedVertexBuffers.end()) { + if (_blendshapeBuffers.find(i) == _blendshapeBuffers.end()) { initializeBlendshapes(fbxGeometry.meshes[i], i); } auto ptr = std::make_shared(shared_from_this(), i, partIndex, shapeID, transform, offset); @@ -97,7 +97,7 @@ void CauterizedModel::createRenderItemSet() { shapeID++; } } - _blendedVertexBuffersInitialized = true; + _blendshapeBuffersInitialized = true; } else { Model::createRenderItemSet(); } @@ -176,7 +176,7 @@ void CauterizedModel::updateClusterMatrices() { // post the blender if we're not currently waiting for one to finish auto modelBlender = DependencyManager::get(); - if (_blendedVertexBuffersInitialized && modelBlender->shouldComputeBlendshapes() && geometry.hasBlendedMeshes() && _blendshapeCoefficients != _blendedBlendshapeCoefficients) { + if (_blendshapeBuffersInitialized && modelBlender->shouldComputeBlendshapes() && geometry.hasBlendedMeshes() && _blendshapeCoefficients != _blendedBlendshapeCoefficients) { _blendedBlendshapeCoefficients = _blendshapeCoefficients; modelBlender->noteRequiresBlend(getThisPointer()); } diff --git a/libraries/render-utils/src/MeshPartPayload.cpp b/libraries/render-utils/src/MeshPartPayload.cpp index 94a5026fb4..a08f5858d7 100644 --- a/libraries/render-utils/src/MeshPartPayload.cpp +++ b/libraries/render-utils/src/MeshPartPayload.cpp @@ -208,9 +208,11 @@ ModelMeshPartPayload::ModelMeshPartPayload(ModelPointer model, int meshIndex, in bool useDualQuaternionSkinning = model->getUseDualQuaternionSkinning(); - if (!model->getFBXGeometry().meshes[meshIndex].blendshapes.isEmpty()) { - _blendedVertexBuffer = model->_blendedVertexBuffers[meshIndex]; + auto buffer = model->_blendshapeBuffers.find(meshIndex); + if (buffer != model->_blendshapeBuffers.end()) { + _blendshapeBuffer = buffer->second; } + auto& modelMesh = model->getGeometry()->getMeshes().at(_meshIndex); const Model::MeshState& state = model->getMeshState(_meshIndex); @@ -389,14 +391,10 @@ ShapeKey ModelMeshPartPayload::getShapeKey() const { void ModelMeshPartPayload::bindMesh(gpu::Batch& batch) { batch.setIndexBuffer(gpu::UINT32, (_drawMesh->getIndexBuffer()._buffer), 0); batch.setInputFormat((_drawMesh->getVertexFormat())); - if (_isBlendShaped && _blendedVertexBuffer) { - batch.setInputBuffer(0, _blendedVertexBuffer, 0, sizeof(glm::vec3)); - // Stride is 2*sizeof(glm::vec3) because normal and tangents are interleaved - batch.setInputBuffer(1, _blendedVertexBuffer, _drawMesh->getNumVertices() * sizeof(glm::vec3), 2 * sizeof(NormalType)); - batch.setInputStream(2, _drawMesh->getVertexStream().makeRangedStream(2)); - } else { - batch.setInputStream(0, _drawMesh->getVertexStream()); + if (_blendshapeBuffer) { + batch.setResourceBuffer(0, _blendshapeBuffer); } + batch.setInputStream(0, _drawMesh->getVertexStream()); } void ModelMeshPartPayload::bindTransform(gpu::Batch& batch, RenderArgs::RenderMode renderMode) const { diff --git a/libraries/render-utils/src/MeshPartPayload.h b/libraries/render-utils/src/MeshPartPayload.h index 5c7177e890..33ab091f09 100644 --- a/libraries/render-utils/src/MeshPartPayload.h +++ b/libraries/render-utils/src/MeshPartPayload.h @@ -135,7 +135,7 @@ public: private: void initCache(const ModelPointer& model); - gpu::BufferPointer _blendedVertexBuffer; + gpu::BufferPointer _blendshapeBuffer; render::ShapeKey _shapeKey { render::ShapeKey::Builder::invalid() }; }; diff --git a/libraries/render-utils/src/Model.cpp b/libraries/render-utils/src/Model.cpp index b9ed43c339..3bc22f9e79 100644 --- a/libraries/render-utils/src/Model.cpp +++ b/libraries/render-utils/src/Model.cpp @@ -308,12 +308,12 @@ bool Model::updateGeometry() { state.clusterDualQuaternions.resize(mesh.clusters.size()); state.clusterMatrices.resize(mesh.clusters.size()); _meshStates.push_back(state); - if (!mesh.blendshapes.empty() && _blendedVertexBuffers.find(i) == _blendedVertexBuffers.end()) { + if (_blendshapeBuffers.find(i) == _blendshapeBuffers.end()) { initializeBlendshapes(mesh, i); } i++; } - _blendedVertexBuffersInitialized = true; + _blendshapeBuffersInitialized = true; needFullUpdate = true; emit rigReady(); } @@ -1034,9 +1034,9 @@ void Model::removeFromScene(const render::ScenePointer& scene, render::Transacti _modelMeshMaterialNames.clear(); _modelMeshRenderItemShapes.clear(); - _blendedVertexBuffers.clear(); - _normalsAndTangents.clear(); - _blendedVertexBuffersInitialized = false; + _blendshapeBuffers.clear(); + _blendshapeOffsets.clear(); + _blendshapeBuffersInitialized = false; _addedToScene = false; @@ -1304,26 +1304,21 @@ Blender::Blender(ModelPointer model, int blendNumber, const Geometry::WeakPointe } void Blender::run() { - QVector vertices; - QVector normalsAndTangents; + QVector blendshapeOffsets; if (_model && _model->isLoaded()) { DETAILED_PROFILE_RANGE_EX(simulation_animation, __FUNCTION__, 0xFFFF0000, 0, { { "url", _model->getURL().toString() } }); int offset = 0; - int normalsAndTangentsOffset = 0; auto meshes = _model->getFBXGeometry().meshes; int meshIndex = 0; foreach (const FBXMesh& mesh, meshes) { - auto modelMeshNormalsAndTangents = _model->_normalsAndTangents.find(meshIndex++); - if (mesh.blendshapes.isEmpty() || modelMeshNormalsAndTangents == _model->_normalsAndTangents.end()) { + auto modelMeshBlendshapeOffsets = _model->_blendshapeOffsets.find(meshIndex++); + if (mesh.blendshapes.isEmpty() || modelMeshBlendshapeOffsets == _model->_blendshapeOffsets.end()) { continue; } - vertices += mesh.vertices; - normalsAndTangents += modelMeshNormalsAndTangents->second; - glm::vec3* meshVertices = vertices.data() + offset; - NormalType* meshNormalsAndTangents = normalsAndTangents.data() + normalsAndTangentsOffset; - offset += mesh.vertices.size(); - normalsAndTangentsOffset += modelMeshNormalsAndTangents->second.size(); + blendshapeOffsets += modelMeshBlendshapeOffsets->second; + BlendshapeOffset* meshBlendshapeOffsets = blendshapeOffsets.data() + offset; + offset += modelMeshBlendshapeOffsets->second.size(); const float NORMAL_COEFFICIENT_SCALE = 0.01f; for (int i = 0, n = qMin(_blendshapeCoefficients.size(), mesh.blendshapes.size()); i < n; i++) { float vertexCoefficient = _blendshapeCoefficients.at(i); @@ -1336,26 +1331,15 @@ void Blender::run() { tbb::parallel_for(tbb::blocked_range(0, blendshape.indices.size()), [&](const tbb::blocked_range& range) { for (auto j = range.begin(); j < range.end(); j++) { int index = blendshape.indices.at(j); - meshVertices[index] += blendshape.vertices.at(j) * vertexCoefficient; + auto& currentBlendshapeOffset = meshBlendshapeOffsets[index]; + currentBlendshapeOffset.positionOffsetAndSpare += glm::vec4(blendshape.vertices.at(j) * vertexCoefficient, 0.0f); - glm::vec3 normal = mesh.normals.at(index) + blendshape.normals.at(j) * normalCoefficient; - glm::vec3 tangent; + currentBlendshapeOffset.normalOffsetAndSpare += glm::vec4(blendshape.normals.at(j) * normalCoefficient, 0.0f); if (index < mesh.tangents.size()) { - tangent = mesh.tangents.at(index); if ((int)j < blendshape.tangents.size()) { - tangent += blendshape.tangents.at(j) * normalCoefficient; + currentBlendshapeOffset.tangentOffsetAndSpare += glm::vec4(blendshape.tangents.at(j) * normalCoefficient, 0.0f); } } -#if FBX_PACK_NORMALS - glm::uint32 finalNormal; - glm::uint32 finalTangent; - buffer_helpers::packNormalAndTangent(normal, tangent, finalNormal, finalTangent); -#else - const auto& finalNormal = normal; - const auto& finalTangent = tangent; -#endif - meshNormalsAndTangents[2 * index] = finalNormal; - meshNormalsAndTangents[2 * index + 1] = finalTangent; } }); } @@ -1363,8 +1347,7 @@ void Blender::run() { } // post the result to the ModelBlender, which will dispatch to the model if still alive QMetaObject::invokeMethod(DependencyManager::get().data(), "setBlendedVertices", - Q_ARG(ModelPointer, _model), Q_ARG(int, _blendNumber), Q_ARG(QVector, vertices), - Q_ARG(QVector, normalsAndTangents)); + Q_ARG(ModelPointer, _model), Q_ARG(int, _blendNumber), Q_ARG(QVector, blendshapeOffsets)); } void Model::setScaleToFit(bool scaleToFit, const glm::vec3& dimensions, bool forceRescale) { @@ -1525,7 +1508,7 @@ void Model::updateClusterMatrices() { // post the blender if we're not currently waiting for one to finish auto modelBlender = DependencyManager::get(); - if (_blendedVertexBuffersInitialized && modelBlender->shouldComputeBlendshapes() && geometry.hasBlendedMeshes() && _blendshapeCoefficients != _blendedBlendshapeCoefficients) { + if (_blendshapeBuffersInitialized && modelBlender->shouldComputeBlendshapes() && geometry.hasBlendedMeshes() && _blendshapeCoefficients != _blendedBlendshapeCoefficients) { _blendedBlendshapeCoefficients = _blendshapeCoefficients; modelBlender->noteRequiresBlend(getThisPointer()); } @@ -1542,39 +1525,34 @@ bool Model::maybeStartBlender() { return false; } -void Model::setBlendedVertices(int blendNumber, const QVector& vertices, const QVector& normalsAndTangents) { - if (!isLoaded() || blendNumber < _appliedBlendNumber || !_blendedVertexBuffersInitialized) { +void Model::setBlendedVertices(int blendNumber, const QVector& blendshapeOffsets) { + if (!isLoaded() || blendNumber < _appliedBlendNumber || !_blendshapeBuffersInitialized) { return; } _appliedBlendNumber = blendNumber; const FBXGeometry& fbxGeometry = getFBXGeometry(); int index = 0; - int normalAndTangentIndex = 0; for (int i = 0; i < fbxGeometry.meshes.size(); i++) { const FBXMesh& mesh = fbxGeometry.meshes.at(i); - auto meshNormalsAndTangents = _normalsAndTangents.find(i); - if (mesh.blendshapes.isEmpty() || meshNormalsAndTangents == _normalsAndTangents.end()) { + auto meshBlendshapeOffsets = _blendshapeOffsets.find(i); + if (mesh.blendshapes.isEmpty() || meshBlendshapeOffsets == _blendshapeOffsets.end()) { continue; } - const auto vertexCount = mesh.vertices.size(); - const auto verticesSize = vertexCount * sizeof(glm::vec3); - const auto& buffer = _blendedVertexBuffers.find(i); - assert(buffer != _blendedVertexBuffers.end()); - buffer->second->resize(mesh.vertices.size() * sizeof(glm::vec3) + meshNormalsAndTangents->second.size() * sizeof(NormalType)); - buffer->second->setSubData(0, verticesSize, (gpu::Byte*) vertices.constData() + index * sizeof(glm::vec3)); - buffer->second->setSubData(verticesSize, meshNormalsAndTangents->second.size() * sizeof(NormalType), (const gpu::Byte*) normalsAndTangents.data() + normalAndTangentIndex * sizeof(NormalType)); + const auto& buffer = _blendshapeBuffers.find(i); + assert(buffer != _blendshapeBuffers.end()); + const auto blendshapeOffsetSize = meshBlendshapeOffsets->second.size() * sizeof(BlendshapeOffset); + buffer->second->setData(blendshapeOffsetSize, (gpu::Byte*) blendshapeOffsets.constData() + index * sizeof(BlendshapeOffset)); - index += vertexCount; - normalAndTangentIndex += meshNormalsAndTangents->second.size(); + index += meshBlendshapeOffsets->second.size(); } } void Model::deleteGeometry() { _deleteGeometryCounter++; - _blendedVertexBuffers.clear(); - _normalsAndTangents.clear(); - _blendedVertexBuffersInitialized = false; + _blendshapeBuffers.clear(); + _blendshapeOffsets.clear(); + _blendshapeBuffersInitialized = false; _meshStates.clear(); _rig.destroyAnimGraph(); _blendedBlendshapeCoefficients.clear(); @@ -1607,39 +1585,12 @@ const render::ItemIDs& Model::fetchRenderItemIDs() const { } void Model::initializeBlendshapes(const FBXMesh& mesh, int index) { - _blendedVertexBuffers[index] = std::make_shared(); - QVector normalsAndTangents; - normalsAndTangents.resize(2 * mesh.normals.size()); - - // Interleave normals and tangents - // Parallel version for performance - tbb::parallel_for(tbb::blocked_range(0, mesh.normals.size()), [&](const tbb::blocked_range& range) { - auto normalsRange = std::make_pair(mesh.normals.begin() + range.begin(), mesh.normals.begin() + range.end()); - auto tangentsRange = std::make_pair(mesh.tangents.begin() + range.begin(), mesh.tangents.begin() + range.end()); - auto normalsAndTangentsIt = normalsAndTangents.begin() + 2 * range.begin(); - - for (auto normalIt = normalsRange.first, tangentIt = tangentsRange.first; - normalIt != normalsRange.second; - ++normalIt, ++tangentIt) { -#if FBX_PACK_NORMALS - glm::uint32 finalNormal; - glm::uint32 finalTangent; - buffer_helpers::packNormalAndTangent(*normalIt, *tangentIt, finalNormal, finalTangent); -#else - const auto& finalNormal = *normalIt; - const auto& finalTangent = *tangentIt; -#endif - *normalsAndTangentsIt = finalNormal; - ++normalsAndTangentsIt; - *normalsAndTangentsIt = finalTangent; - ++normalsAndTangentsIt; - } - }); - const auto verticesSize = mesh.vertices.size() * sizeof(glm::vec3); - _blendedVertexBuffers[index]->resize(mesh.vertices.size() * sizeof(glm::vec3) + normalsAndTangents.size() * sizeof(NormalType)); - _blendedVertexBuffers[index]->setSubData(0, verticesSize, (const gpu::Byte*) mesh.vertices.constData()); - _blendedVertexBuffers[index]->setSubData(verticesSize, normalsAndTangents.size() * sizeof(NormalType), (const gpu::Byte*) normalsAndTangents.data()); - _normalsAndTangents[index] = normalsAndTangents; + _blendshapeBuffers[index] = std::make_shared(); + QVector blendshapeOffset; + blendshapeOffset.fill(BlendshapeOffset(), 3 * mesh.vertices.size()); + const auto blendshapeOffsetsSize = blendshapeOffset.size() * sizeof(BlendshapeOffset); + _blendshapeBuffers[index]->setData(blendshapeOffsetsSize, (const gpu::Byte*) blendshapeOffset.constData()); + _blendshapeOffsets[index] = blendshapeOffset; } void Model::createRenderItemSet() { @@ -1680,7 +1631,7 @@ void Model::createRenderItemSet() { // Create the render payloads int numParts = (int)mesh->getNumParts(); for (int partIndex = 0; partIndex < numParts; partIndex++) { - if (!fbxGeometry.meshes[i].blendshapes.empty() && _blendedVertexBuffers.find(i) == _blendedVertexBuffers.end()) { + if (_blendshapeBuffers.find(i) == _blendshapeBuffers.end()) { initializeBlendshapes(fbxGeometry.meshes[i], i); } _modelMeshRenderItems << std::make_shared(shared_from_this(), i, partIndex, shapeID, transform, offset); @@ -1794,9 +1745,9 @@ void ModelBlender::noteRequiresBlend(ModelPointer model) { _modelsRequiringBlends.insert(model); } -void ModelBlender::setBlendedVertices(ModelPointer model, int blendNumber, QVector vertices, QVector normalsAndTangents) { +void ModelBlender::setBlendedVertices(ModelPointer model, int blendNumber, QVector blendshapeOffsets) { if (model) { - model->setBlendedVertices(blendNumber, vertices, normalsAndTangents); + model->setBlendedVertices(blendNumber, blendshapeOffsets); } { Lock lock(_mutex); diff --git a/libraries/render-utils/src/Model.h b/libraries/render-utils/src/Model.h index 447f75dd9d..da141bf905 100644 --- a/libraries/render-utils/src/Model.h +++ b/libraries/render-utils/src/Model.h @@ -75,6 +75,12 @@ struct SortedTriangleSet { int subMeshIndex; }; +struct BlendshapeOffset { + glm::vec4 positionOffsetAndSpare; + glm::vec4 normalOffsetAndSpare; + glm::vec4 tangentOffsetAndSpare; +}; + /// A generic 3D model displaying geometry loaded from a URL. class Model : public QObject, public std::enable_shared_from_this, public scriptable::ModelProvider { Q_OBJECT @@ -144,7 +150,7 @@ public: bool maybeStartBlender(); /// Sets blended vertices computed in a separate thread. - void setBlendedVertices(int blendNumber, const QVector& vertices, const QVector& normalsAndTangents); + void setBlendedVertices(int blendNumber, const QVector& blendshapeOffsets); bool isLoaded() const { return (bool)_renderGeometry && _renderGeometry->isGeometryLoaded(); } bool isAddedToScene() const { return _addedToScene; } @@ -344,7 +350,7 @@ public: void addMaterial(graphics::MaterialLayer material, const std::string& parentMaterialName); void removeMaterial(graphics::MaterialPointer material, const std::string& parentMaterialName); - std::unordered_map> _normalsAndTangents; + std::unordered_map> _blendshapeOffsets; public slots: void loadURLFinished(bool success); @@ -424,8 +430,8 @@ protected: QUrl _url; - std::unordered_map _blendedVertexBuffers; - bool _blendedVertexBuffersInitialized { false }; + std::unordered_map _blendshapeBuffers; + bool _blendshapeBuffersInitialized{ false }; QVector>> _dilatedTextures; @@ -506,6 +512,7 @@ private: Q_DECLARE_METATYPE(ModelPointer) Q_DECLARE_METATYPE(Geometry::WeakPointer) +Q_DECLARE_METATYPE(BlendshapeOffset) /// Handle management of pending models that need blending class ModelBlender : public QObject, public Dependency { @@ -520,7 +527,7 @@ public: bool shouldComputeBlendshapes() { return _computeBlendshapes; } public slots: - void setBlendedVertices(ModelPointer model, int blendNumber, QVector vertices, QVector normalsAndTangents); + void setBlendedVertices(ModelPointer model, int blendNumber, QVector blendshapeOffsets); void setComputeBlendshapes(bool computeBlendshapes) { _computeBlendshapes = computeBlendshapes; } private: diff --git a/libraries/render-utils/src/SoftAttachmentModel.cpp b/libraries/render-utils/src/SoftAttachmentModel.cpp index b9a6581f1d..114ccab712 100644 --- a/libraries/render-utils/src/SoftAttachmentModel.cpp +++ b/libraries/render-utils/src/SoftAttachmentModel.cpp @@ -78,7 +78,7 @@ void SoftAttachmentModel::updateClusterMatrices() { // post the blender if we're not currently waiting for one to finish auto modelBlender = DependencyManager::get(); - if (_blendedVertexBuffersInitialized && modelBlender->shouldComputeBlendshapes() && geometry.hasBlendedMeshes() && _blendshapeCoefficients != _blendedBlendshapeCoefficients) { + if (_blendshapeBuffersInitialized && modelBlender->shouldComputeBlendshapes() && geometry.hasBlendedMeshes() && _blendshapeCoefficients != _blendedBlendshapeCoefficients) { _blendedBlendshapeCoefficients = _blendshapeCoefficients; modelBlender->noteRequiresBlend(getThisPointer()); } diff --git a/libraries/render-utils/src/model.slv b/libraries/render-utils/src/model.slv index 3763b8d2de..bc5371df34 100644 --- a/libraries/render-utils/src/model.slv +++ b/libraries/render-utils/src/model.slv @@ -1,10 +1,9 @@ <@include gpu/Config.slh@> <$VERSION_HEADER$> -// Generated on <$_SCRIBE_DATE$> -// model.vert -// vertex shader +// <$_SCRIBE_FILENAME$> +// Generated on <$_SCRIBE_DATE$> // -// Created by Andrzej Kapolka on 10/14/13. +// Created by Hifi Engine Team. // Copyright 2013 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. @@ -21,6 +20,7 @@ <$declareMaterialTexMapArrayBuffer()$> +layout(location=RENDER_UTILS_ATTR_POSITION_WS) out vec4 _positionWS; layout(location=RENDER_UTILS_ATTR_POSITION_ES) out vec4 _positionES; layout(location=RENDER_UTILS_ATTR_TEXCOORD01) out vec4 _texCoord01; layout(location=RENDER_UTILS_ATTR_NORMAL_WS) out vec3 _normalWS; @@ -32,11 +32,11 @@ void main(void) { TexMapArray texMapArray = getTexMapArray(); <$evalTexMapArrayTexcoord0(texMapArray, inTexCoord0, _texCoord01.xy)$> - <$evalTexMapArrayTexcoord1(texMapArray, inTexCoord0, _texCoord01.zw)$> + <$evalTexMapArrayTexcoord1(texMapArray, inTexCoord1, _texCoord01.zw)$> // standard transform TransformCamera cam = getTransformCamera(); TransformObject obj = getTransformObject(); - <$transformModelToEyeAndClipPos(cam, obj, inPosition, _positionES, gl_Position)$> + <$transformModelToWorldAndEyeAndClipPos(cam, obj, inPosition, _positionWS, _positionES, gl_Position)$> <$transformModelToWorldDir(cam, obj, inNormal.xyz, _normalWS)$> } diff --git a/libraries/render-utils/src/model_fade.slv b/libraries/render-utils/src/model_fade.slv index 84f4f08fed..97c861616c 100644 --- a/libraries/render-utils/src/model_fade.slv +++ b/libraries/render-utils/src/model_fade.slv @@ -1,8 +1,7 @@ <@include gpu/Config.slh@> <$VERSION_HEADER$> -// Generated on <$_SCRIBE_DATE$> -// model_fade.vert -// vertex shader +// <$_SCRIBE_FILENAME$> +// Generated on <$_SCRIBE_DATE$> // // Created by Olivier Prat on 04/24/17. // Copyright 2017 High Fidelity, Inc. @@ -33,7 +32,7 @@ void main(void) { TexMapArray texMapArray = getTexMapArray(); <$evalTexMapArrayTexcoord0(texMapArray, inTexCoord0, _texCoord01.xy)$> - <$evalTexMapArrayTexcoord1(texMapArray, inTexCoord0, _texCoord01.zw)$> + <$evalTexMapArrayTexcoord1(texMapArray, inTexCoord1, _texCoord01.zw)$> // standard transform TransformCamera cam = getTransformCamera(); diff --git a/libraries/render-utils/src/model_lightmap.slv b/libraries/render-utils/src/model_lightmap.slv index 7306e2c831..fe508d0912 100644 --- a/libraries/render-utils/src/model_lightmap.slv +++ b/libraries/render-utils/src/model_lightmap.slv @@ -1,9 +1,7 @@ <@include gpu/Config.slh@> <$VERSION_HEADER$> -// Generated on <$_SCRIBE_DATE$> -// -// model_lightmap.vert -// vertex shader +// <$_SCRIBE_FILENAME$> +// Generated on <$_SCRIBE_DATE$> // // Created by Sam Gateau on 11/21/14. // Copyright 2013 High Fidelity, Inc. diff --git a/libraries/render-utils/src/model_normal_map.slv b/libraries/render-utils/src/model_normal_map.slv index 4a1a0c9264..90d28acc90 100644 --- a/libraries/render-utils/src/model_normal_map.slv +++ b/libraries/render-utils/src/model_normal_map.slv @@ -1,11 +1,9 @@ <@include gpu/Config.slh@> <$VERSION_HEADER$> -// Generated on <$_SCRIBE_DATE$> +// <$_SCRIBE_FILENAME$> +// Generated on <$_SCRIBE_DATE$> // -// model_normal_map.vert -// vertex shader -// -// Created by Andrzej Kapolka on 10/14/13. +// Created by Hifi Engine Team. // Copyright 2013 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. @@ -36,7 +34,7 @@ void main(void) { TexMapArray texMapArray = getTexMapArray(); <$evalTexMapArrayTexcoord0(texMapArray, inTexCoord0, _texCoord01.xy)$> - <$evalTexMapArrayTexcoord1(texMapArray, inTexCoord0, _texCoord01.zw)$> + <$evalTexMapArrayTexcoord1(texMapArray, inTexCoord1, _texCoord01.zw)$> // standard transform TransformCamera cam = getTransformCamera(); diff --git a/libraries/render-utils/src/model_normal_map_fade.slv b/libraries/render-utils/src/model_normal_map_fade.slv index 090027ac79..e2bba7f811 100644 --- a/libraries/render-utils/src/model_normal_map_fade.slv +++ b/libraries/render-utils/src/model_normal_map_fade.slv @@ -1,9 +1,7 @@ <@include gpu/Config.slh@> <$VERSION_HEADER$> -// Generated on <$_SCRIBE_DATE$> -// -// model_normal_map_fade.vert -// vertex shader +// <$_SCRIBE_FILENAME$> +// Generated on <$_SCRIBE_DATE$> // // Created by Olivier Prat on 04/24/17. // Copyright 2017 High Fidelity, Inc. diff --git a/libraries/render-utils/src/model_shadow.slv b/libraries/render-utils/src/model_shadow.slv index c81235b392..0e6f05f09f 100644 --- a/libraries/render-utils/src/model_shadow.slv +++ b/libraries/render-utils/src/model_shadow.slv @@ -1,11 +1,9 @@ <@include gpu/Config.slh@> <$VERSION_HEADER$> -// Generated on <$_SCRIBE_DATE$> +// <$_SCRIBE_FILENAME$> +// Generated on <$_SCRIBE_DATE$> // -// model_shadow.vert -// vertex shader -// -// Created by Andrzej Kapolka on 3/24/14. +// Created by Hifi Engine Team. // Copyright 2014 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. diff --git a/libraries/render-utils/src/model_shadow_fade.slv b/libraries/render-utils/src/model_shadow_fade.slv index cf180c2dc8..70ffe855fb 100644 --- a/libraries/render-utils/src/model_shadow_fade.slv +++ b/libraries/render-utils/src/model_shadow_fade.slv @@ -1,11 +1,9 @@ <@include gpu/Config.slh@> <$VERSION_HEADER$> -// Generated on <$_SCRIBE_DATE$> +// <$_SCRIBE_FILENAME$> +// Generated on <$_SCRIBE_DATE$> // -// model_shadow_fade.vert -// vertex shader -// -// Created by Olivier Prat on 06/045/17. +// Created by Olivier Prat on 06/05/17. // Copyright 2017 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. diff --git a/libraries/render-utils/src/render-utils/model_lightmap.slp b/libraries/render-utils/src/render-utils/model_lightmap.slp index e69de29bb2..ea0b2cf566 100644 --- a/libraries/render-utils/src/render-utils/model_lightmap.slp +++ b/libraries/render-utils/src/render-utils/model_lightmap.slp @@ -0,0 +1 @@ +VERTEX model \ No newline at end of file diff --git a/libraries/render-utils/src/render-utils/model_lightmap_fade.slp b/libraries/render-utils/src/render-utils/model_lightmap_fade.slp index e69de29bb2..9505946c8d 100644 --- a/libraries/render-utils/src/render-utils/model_lightmap_fade.slp +++ b/libraries/render-utils/src/render-utils/model_lightmap_fade.slp @@ -0,0 +1 @@ +VERTEX model_fade \ No newline at end of file diff --git a/libraries/render-utils/src/render-utils/model_lightmap_normal_map.slp b/libraries/render-utils/src/render-utils/model_lightmap_normal_map.slp index e69de29bb2..c50be6285b 100644 --- a/libraries/render-utils/src/render-utils/model_lightmap_normal_map.slp +++ b/libraries/render-utils/src/render-utils/model_lightmap_normal_map.slp @@ -0,0 +1 @@ +VERTEX model_normal_map diff --git a/libraries/render-utils/src/render-utils/model_lightmap_normal_map_fade.slp b/libraries/render-utils/src/render-utils/model_lightmap_normal_map_fade.slp index e69de29bb2..93df8e9a9a 100644 --- a/libraries/render-utils/src/render-utils/model_lightmap_normal_map_fade.slp +++ b/libraries/render-utils/src/render-utils/model_lightmap_normal_map_fade.slp @@ -0,0 +1 @@ +VERTEX model_normal_map_fade \ No newline at end of file diff --git a/libraries/render-utils/src/render-utils/model_translucent.slp b/libraries/render-utils/src/render-utils/model_translucent.slp index e69de29bb2..ea0b2cf566 100644 --- a/libraries/render-utils/src/render-utils/model_translucent.slp +++ b/libraries/render-utils/src/render-utils/model_translucent.slp @@ -0,0 +1 @@ +VERTEX model \ No newline at end of file diff --git a/libraries/render-utils/src/render-utils/model_translucent_normal_map.slp b/libraries/render-utils/src/render-utils/model_translucent_normal_map.slp index e69de29bb2..659899f9f8 100644 --- a/libraries/render-utils/src/render-utils/model_translucent_normal_map.slp +++ b/libraries/render-utils/src/render-utils/model_translucent_normal_map.slp @@ -0,0 +1 @@ +VERTEX model_normal_map \ No newline at end of file diff --git a/libraries/render-utils/src/render-utils/model_translucent_normal_map_fade.slp b/libraries/render-utils/src/render-utils/model_translucent_normal_map_fade.slp index 01953a9891..41fbdeafbe 100644 --- a/libraries/render-utils/src/render-utils/model_translucent_normal_map_fade.slp +++ b/libraries/render-utils/src/render-utils/model_translucent_normal_map_fade.slp @@ -1 +1 @@ -VERTEX model_translucent_normal_map +VERTEX model_normal_map_fade diff --git a/libraries/render-utils/src/skin_model.slv b/libraries/render-utils/src/skin_model.slv index d44ca0ae3f..b5d186ecf1 100644 --- a/libraries/render-utils/src/skin_model.slv +++ b/libraries/render-utils/src/skin_model.slv @@ -1,11 +1,9 @@ <@include gpu/Config.slh@> <$VERSION_HEADER$> -// Generated on <$_SCRIBE_DATE$> +// <$_SCRIBE_FILENAME$> +// Generated on <$_SCRIBE_DATE$> // -// skin_model.vert -// vertex shader -// -// Created by Andrzej Kapolka on 10/14/13. +// Created by Hifi Engine Team. // Copyright 2013 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. diff --git a/libraries/render-utils/src/skin_model_dq.slv b/libraries/render-utils/src/skin_model_dq.slv index ff73c7a398..38867ca1fe 100644 --- a/libraries/render-utils/src/skin_model_dq.slv +++ b/libraries/render-utils/src/skin_model_dq.slv @@ -1,11 +1,9 @@ <@include gpu/Config.slh@> <$VERSION_HEADER$> -// Generated on <$_SCRIBE_DATE$> +// <$_SCRIBE_FILENAME$> +// Generated on <$_SCRIBE_DATE$> // -// skin_model_dq.vert -// vertex shader -// -// Created by Andrzej Kapolka on 10/14/13. +// Created by Hifi Engine Team. // Copyright 2013 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. diff --git a/libraries/render-utils/src/skin_model_fade.slv b/libraries/render-utils/src/skin_model_fade.slv index 1689476d38..24d7d6c4cc 100644 --- a/libraries/render-utils/src/skin_model_fade.slv +++ b/libraries/render-utils/src/skin_model_fade.slv @@ -1,10 +1,9 @@ <@include gpu/Config.slh@> <$VERSION_HEADER$> -// Generated on <$_SCRIBE_DATE$> -// -// skin_model_fade.vert -// vertex shader +// <$_SCRIBE_FILENAME$> +// Generated on <$_SCRIBE_DATE$> // +// Created by Hifi Engine Team. // Created by Olivier Prat on 06/045/17. // Copyright 2017 High Fidelity, Inc. // diff --git a/libraries/render-utils/src/skin_model_fade_dq.slv b/libraries/render-utils/src/skin_model_fade_dq.slv index 6e64305de7..3bc3f8226b 100644 --- a/libraries/render-utils/src/skin_model_fade_dq.slv +++ b/libraries/render-utils/src/skin_model_fade_dq.slv @@ -1,9 +1,7 @@ <@include gpu/Config.slh@> <$VERSION_HEADER$> -// Generated on <$_SCRIBE_DATE$> -// -// skin_model_fade_dq.vert -// vertex shader +// <$_SCRIBE_FILENAME$> +// Generated on <$_SCRIBE_DATE$> // // Created by Olivier Prat on 06/045/17. // Copyright 2017 High Fidelity, Inc. diff --git a/libraries/render-utils/src/skin_model_normal_map.slv b/libraries/render-utils/src/skin_model_normal_map.slv index f67220c6bd..7b302bc695 100644 --- a/libraries/render-utils/src/skin_model_normal_map.slv +++ b/libraries/render-utils/src/skin_model_normal_map.slv @@ -1,11 +1,9 @@ <@include gpu/Config.slh@> <$VERSION_HEADER$> -// Generated on <$_SCRIBE_DATE$> +// <$_SCRIBE_FILENAME$> +// Generated on <$_SCRIBE_DATE$> // -// skin_model_normal_map.vert -// vertex shader -// -// Created by Andrzej Kapolka on 10/29/13. +// Created by Hifi Engine Team. // Copyright 2013 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. diff --git a/libraries/render-utils/src/skin_model_normal_map_dq.slv b/libraries/render-utils/src/skin_model_normal_map_dq.slv index b5ffbdc49d..7c251e9264 100644 --- a/libraries/render-utils/src/skin_model_normal_map_dq.slv +++ b/libraries/render-utils/src/skin_model_normal_map_dq.slv @@ -1,11 +1,9 @@ <@include gpu/Config.slh@> <$VERSION_HEADER$> -// Generated on <$_SCRIBE_DATE$> +// <$_SCRIBE_FILENAME$> +// Generated on <$_SCRIBE_DATE$> // -// skin_model_normal_map_dq.vert -// vertex shader -// -// Created by Andrzej Kapolka on 10/29/13. +// Created by Hifi Engine Team. // Copyright 2013 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. diff --git a/libraries/render-utils/src/skin_model_normal_map_fade.slv b/libraries/render-utils/src/skin_model_normal_map_fade.slv index 5759416d44..e1a015be6d 100644 --- a/libraries/render-utils/src/skin_model_normal_map_fade.slv +++ b/libraries/render-utils/src/skin_model_normal_map_fade.slv @@ -1,10 +1,9 @@ <@include gpu/Config.slh@> <$VERSION_HEADER$> -// Generated on <$_SCRIBE_DATE$> -// -// skin_model_normal_map_fade.vert -// vertex shader +// <$_SCRIBE_FILENAME$> +// Generated on <$_SCRIBE_DATE$> // +// Created by Hifi Engine Team. // Created by Olivier Prat on 06/045/17. // Copyright 2017 High Fidelity, Inc. // diff --git a/libraries/render-utils/src/skin_model_normal_map_fade_dq.slv b/libraries/render-utils/src/skin_model_normal_map_fade_dq.slv index e48bf47758..970e5362b5 100644 --- a/libraries/render-utils/src/skin_model_normal_map_fade_dq.slv +++ b/libraries/render-utils/src/skin_model_normal_map_fade_dq.slv @@ -1,11 +1,9 @@ <@include gpu/Config.slh@> <$VERSION_HEADER$> -// Generated on <$_SCRIBE_DATE$> +// <$_SCRIBE_FILENAME$> +// Generated on <$_SCRIBE_DATE$> // -// skin_model_normal_map_fade_dq.vert -// vertex shader -// -// Created by Andrzej Kapolka on 10/29/13. +// Created by Hifi Engine Team. // Copyright 2013 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. diff --git a/libraries/render-utils/src/skin_model_shadow.slv b/libraries/render-utils/src/skin_model_shadow.slv index 03da2e074e..8ddfd34fcd 100644 --- a/libraries/render-utils/src/skin_model_shadow.slv +++ b/libraries/render-utils/src/skin_model_shadow.slv @@ -1,11 +1,9 @@ <@include gpu/Config.slh@> <$VERSION_HEADER$> -// Generated on <$_SCRIBE_DATE$> +// <$_SCRIBE_FILENAME$> +// Generated on <$_SCRIBE_DATE$> // -// skin_model_shadow.vert -// vertex shader -// -// Created by Andrzej Kapolka on 3/24/14. +// Created by Hifi Engine Team. // Copyright 2014 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. diff --git a/libraries/render-utils/src/skin_model_shadow_dq.slv b/libraries/render-utils/src/skin_model_shadow_dq.slv index a60eed62d3..d75af69acd 100644 --- a/libraries/render-utils/src/skin_model_shadow_dq.slv +++ b/libraries/render-utils/src/skin_model_shadow_dq.slv @@ -1,11 +1,9 @@ <@include gpu/Config.slh@> <$VERSION_HEADER$> -// Generated on <$_SCRIBE_DATE$> +// <$_SCRIBE_FILENAME$> +// Generated on <$_SCRIBE_DATE$> // -// skin_model_shadow_dq.vert -// vertex shader -// -// Created by Andrzej Kapolka on 3/24/14. +// Created by Hifi Engine Team. // Copyright 2014 High Fidelity, Inc. // // Distributed under the Apache License, Version 2.0. diff --git a/libraries/render-utils/src/skin_model_shadow_fade.slv b/libraries/render-utils/src/skin_model_shadow_fade.slv index 4881cb9f62..afad370abc 100644 --- a/libraries/render-utils/src/skin_model_shadow_fade.slv +++ b/libraries/render-utils/src/skin_model_shadow_fade.slv @@ -1,10 +1,9 @@ <@include gpu/Config.slh@> <$VERSION_HEADER$> -// Generated on <$_SCRIBE_DATE$> -// -// skin_model_shadow_fade.vert -// vertex shader +// <$_SCRIBE_FILENAME$> +// Generated on <$_SCRIBE_DATE$> // +// Created by Hifi Engine Team. // Created by Olivier Prat on 06/045/17. // Copyright 2017 High Fidelity, Inc. // diff --git a/libraries/render-utils/src/skin_model_shadow_fade_dq.slv b/libraries/render-utils/src/skin_model_shadow_fade_dq.slv index c45107b47c..c5737e6c21 100644 --- a/libraries/render-utils/src/skin_model_shadow_fade_dq.slv +++ b/libraries/render-utils/src/skin_model_shadow_fade_dq.slv @@ -1,10 +1,9 @@ <@include gpu/Config.slh@> <$VERSION_HEADER$> -// Generated on <$_SCRIBE_DATE$> -// -// skin_model_shadow_fade_dq.vert -// vertex shader +// <$_SCRIBE_FILENAME$> +// Generated on <$_SCRIBE_DATE$> // +// Created by Hifi Engine Team. // Created by Olivier Prat on 06/045/17. // Copyright 2017 High Fidelity, Inc. //