continue;
}
- Dali::Shader shader = renderer.GetShader();
- if(!shader)
- {
- continue;
- }
-
if(boneData.constraint)
{
boneData.constraint.Remove();
boneData.constraint.Reset();
}
- if(shader.GetPropertyIndex(boneData.propertyName) == Property::INVALID_INDEX)
+ auto propBoneXform = renderer.GetPropertyIndex(boneData.propertyName);
+ if(propBoneXform == Property::INVALID_INDEX)
{
- auto propBoneXform = shader.RegisterProperty(boneData.propertyName, Matrix{false});
+ propBoneXform = renderer.RegisterProperty(boneData.propertyName, Matrix{false});
+ }
- Matrix inverseMatrix = boneData.inverseMatrix;
- // Constrain bone matrix to joint transform.
- boneData.constraint = Constraint::New<Matrix>(shader, propBoneXform, [inverseMatrix](Matrix& output, const PropertyInputContainer& inputs)
- { Matrix::Multiply(output, inverseMatrix, inputs[0]->GetMatrix()); });
+ Matrix inverseMatrix = boneData.inverseMatrix;
+ // Constrain bone matrix to joint transform.
+ boneData.constraint = Constraint::New<Matrix>(renderer, propBoneXform, [inverseMatrix](Matrix& output, const PropertyInputContainer& inputs)
+ { Matrix::Multiply(output, inverseMatrix, inputs[0]->GetMatrix()); });
- Actor joint = Self();
- boneData.constraint.AddSource(Source{joint, Actor::Property::WORLD_MATRIX});
- boneData.constraint.ApplyPost();
- }
+ Actor joint = Self();
+ boneData.constraint.AddSource(Source{joint, Actor::Property::WORLD_MATRIX});
+ boneData.constraint.ApplyPost();
break;
}
}
{
mesh.first.mModelPrimitive = ModelPrimitive::New();
- auto primitive = mesh.first.mModelPrimitive;
+ auto primitive = mesh.first.mModelPrimitive;
GetImplementation(primitive).SetRenderer(renderer);
- Index envIndex = resources.mMaterials[mMaterialIdx].first.mEnvironmentIdx;
+ Index envIndex = resources.mMaterials[mMaterialIdx].first.mEnvironmentIdx;
uint32_t specularMipmap = resources.mEnvironmentMaps[envIndex].second.mSpecularMipmapLevels;
GetImplementation(primitive).SetImageBasedLightTexture(resources.mEnvironmentMaps[envIndex].second.mDiffuse,
resources.mEnvironmentMaps[envIndex].second.mSpecular,
renderer.RegisterProperty("uMask", mask);
renderer.RegisterProperty("uAlphaThreshold", alphaCutoff);
- Index envIndex = matDef.mEnvironmentIdx;
+ Index envIndex = matDef.mEnvironmentIdx;
uint32_t specularMipmap = resources.mEnvironmentMaps[envIndex].second.mSpecularMipmapLevels;
renderer.RegisterProperty(IBL_MAXLOD.data(), static_cast<float>(specularMipmap));
renderer.RegisterProperty(IBL_INTENSITY_STRING.data(), resources.mEnvironmentMaps[envIndex].first.mIblIntensity);
node.SetProperty(Actor::Property::COLOR, mColor);
{
- matDef.mMaterial = Material::New();
- auto material = matDef.mMaterial;
+ matDef.mMaterial = Material::New();
+ auto material = matDef.mMaterial;
uint32_t textureIndexOffset = (mesh.second.blendShapeGeometry) ? 1 : 0;
uint32_t textureIndex = 0;
for(uint32_t i = 0; i < MAX_NUMBER_OF_MATERIAL_TEXTURE; ++i)
{
namespace
{
-
const std::map<Property::Type, Constraint (*)(Actor&, Property::Index)>& GetConstraintFactory()
{
static const std::map<Property::Type, Constraint (*)(Actor&, Property::Index)> sConstraintFactory = {
{Property::Type::BOOLEAN,
[](Actor& a, Property::Index i) {
- return Constraint::New<bool>(a, i, [](bool& current, const PropertyInputContainer& inputs) {
- current = inputs[0]->GetBoolean();
- });
+ return Constraint::New<bool>(a, i, [](bool& current, const PropertyInputContainer& inputs) { current = inputs[0]->GetBoolean(); });
}},
{Property::Type::INTEGER,
[](Actor& a, Property::Index i) {
- return Constraint::New<int>(a, i, [](int& current, const PropertyInputContainer& inputs) {
- current = inputs[0]->GetInteger();
- });
+ return Constraint::New<int>(a, i, [](int& current, const PropertyInputContainer& inputs) { current = inputs[0]->GetInteger(); });
}},
{Property::Type::FLOAT,
[](Actor& a, Property::Index i) {
private:
NodeDefinition::CreateParams& mCreationContext;
- std::vector<ModelNode> mActorStack;
- ModelNode mRoot;
+ std::vector<ModelNode> mActorStack;
+ ModelNode mRoot;
};
-void SortAndDeduplicateSkinningRequests(std::vector<SkinningShaderConfigurationRequest>& requests)
+template<typename RequestType>
+void SortAndDeduplicateRequests(std::vector<RequestType>& requests)
{
- // Sort requests by shaders.
+ // Sort requests by shaders and primitives.
std::sort(requests.begin(), requests.end());
// Remove duplicates.
- auto i = requests.begin();
- auto iEnd = requests.end();
- Shader s = i->mShader;
- Index skeletonIdx = i->mSkeletonIdx;
- ++i;
+ auto iter = requests.begin();
+ auto iterEnd = requests.end();
+
+ Shader shader = iter->mShader;
+ ModelPrimitive modelPrimitive = iter->mPrimitive;
+ ++iter;
do
{
- // Multiple identical shader instances are removed.
- while(i != iEnd && i->mShader == s)
+ // Multiple identical shader and primitive instances are removed.
+ while(iter != iterEnd && iter->mShader == shader && iter->mPrimitive == modelPrimitive)
{
- // Cannot have multiple skeletons input to the same shader.
- // NOTE: DliModel now makes sure this doesn't happen.
- DALI_ASSERT_ALWAYS(i->mSkeletonIdx == skeletonIdx &&
- "Skinning shader must not be shared between different skeletons.");
-
- i->mShader = Shader();
- ++i;
+ // Mark as removed
+ iter->mShader = Shader();
+ ++iter;
}
- if(i == iEnd)
+ if(iter == iterEnd)
{
break;
}
- s = i->mShader;
- skeletonIdx = i->mSkeletonIdx;
- ++i;
+ shader = iter->mShader;
+ modelPrimitive = iter->mPrimitive;
+ ++iter;
} while(true);
- requests.erase(std::remove_if(requests.begin(), requests.end(), [](const SkinningShaderConfigurationRequest& sscr) {
- return !sscr.mShader;
- }),
+ requests.erase(std::remove_if(requests.begin(), requests.end(), [](const RequestType& sscr) { return !sscr.mShader; }),
requests.end());
}
{
auto iBegin = mNodes.begin();
auto iEnd = mNodes.end();
- auto iFind = std::find_if(iBegin, iEnd, [&name](const std::unique_ptr<NodeDefinition>& nd) {
- return nd->mName == name;
- });
+ auto iFind = std::find_if(iBegin, iEnd, [&name](const std::unique_ptr<NodeDefinition>& nd) { return nd->mName == name; });
auto result = iFind != iEnd ? iFind->get() : nullptr;
if(result && outIndex)
{
auto iBegin = mNodes.begin();
auto iEnd = mNodes.end();
- auto iFind = std::find_if(iBegin, iEnd, [&name](const std::unique_ptr<NodeDefinition>& nd) {
- return nd->mName == name;
- });
+ auto iFind = std::find_if(iBegin, iEnd, [&name](const std::unique_ptr<NodeDefinition>& nd) { return nd->mName == name; });
auto result = iFind != iEnd ? iFind->get() : nullptr;
if(result && outIndex)
{
auto iBegin = mNodes.begin();
auto iEnd = mNodes.end();
- auto iFind = std::find_if(iBegin, iEnd, [&node](const std::unique_ptr<NodeDefinition>& n) {
- return n.get() == &node;
- });
+ auto iFind = std::find_if(iBegin, iEnd, [&node](const std::unique_ptr<NodeDefinition>& n) { return n.get() == &node; });
return iFind != iEnd ? std::distance(iBegin, iFind) : INVALID_INDEX;
}
return;
}
- SortAndDeduplicateSkinningRequests(requests);
+ SortAndDeduplicateRequests(requests);
for(auto& request : requests)
{
Index boneIdx = 0;
for(auto& joint : skeleton.mJoints)
{
- auto node = GetNode(joint.mNodeIdx);
+ auto node = GetNode(joint.mNodeIdx);
ModelNode modelNode = ModelNode::DownCast(rootActor.FindChildByName(node->mName));
if(!modelNode)
{
return true;
}
- // Sort requests by shaders.
- std::sort(requests.begin(), requests.end());
-
- // Remove duplicates.
- auto i = requests.begin();
- auto iEnd = requests.end();
- Shader s = i->mShader;
- ++i;
- do
- {
- // Multiple identical shader instances are removed.
- while(i != iEnd && i->mShader == s)
- {
- i->mShader = Shader();
- ++i;
- }
-
- if(i == iEnd)
- {
- break;
- }
- s = i->mShader;
- ++i;
- } while(true);
+ SortAndDeduplicateRequests(requests);
// Configure the rest.
bool ok = true;
- for(auto& i : requests)
+ for(auto& request : requests)
{
Index iNode;
- if(FindNode(i.mNodeName, &iNode))
+ if(FindNode(request.mNodeName, &iNode))
{
const auto& node = GetNode(iNode);
- const auto& mesh = resources.mMeshes[i.mMeshIdx];
+ const auto& mesh = resources.mMeshes[request.mMeshIdx];
if(mesh.first.HasBlendShapes())
{
- Actor actor = rootActor.FindChildByName(node->mName);
- Scene3D::ModelNode node = Scene3D::ModelNode::DownCast(actor);
+ Actor actor = rootActor.FindChildByName(node->mName);
+ Scene3D::ModelNode node = Scene3D::ModelNode::DownCast(actor);
if(!node)
{
continue;
{
data.unnormalizeFactors.push_back(factor);
}
- data.version = mesh.first.mBlendShapeVersion;
+ data.version = mesh.first.mBlendShapeVersion;
data.bufferOffset = mesh.second.blendShapeBufferOffset;
- data.mActor = actor;
- Internal::GetImplementation(node).SetBlendShapeData(data, i.mPrimitive);
+ data.mActor = actor;
+ Internal::GetImplementation(node).SetBlendShapeData(data, request.mPrimitive);
}
}
}
// We're searching from the end assuming a higher probability of operations targeting
// recently added nodes. (conf.: root, which is immovable, cannot be removed, and was
// the first to be added, is index 0.)
- auto iFind = std::find_if(mNodes.rbegin(), mNodes.rend(), [&name](const std::unique_ptr<NodeDefinition>& nd) {
- return nd->mName == name;
- }).base();
+ auto iFind = std::find_if(mNodes.rbegin(), mNodes.rend(), [&name](const std::unique_ptr<NodeDefinition>& nd) { return nd->mName == name; })
+ .base();
const bool success = iFind != mNodes.begin();
if(success && result)