2 * Copyright (c) 2021 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
19 #include "dali-scene-loader/public-api/node-definition.h"
20 #include "dali-scene-loader/public-api/renderer-state.h"
21 #include "dali-scene-loader/public-api/utils.h"
27 void NodeDefinition::Renderable::RegisterResources(IResourceReceiver& receiver) const
29 receiver.Register(ResourceType::Shader, mShaderIdx);
32 void NodeDefinition::Renderable::ReflectResources(IResourceReflector& reflector)
34 reflector.Reflect(ResourceType::Shader, mShaderIdx);
37 void NodeDefinition::Renderable::OnCreate(const NodeDefinition& node, CreateParams& params, Actor& actor) const
39 DALI_ASSERT_DEBUG(mShaderIdx != INVALID_INDEX);
40 auto& resources = params.mResources;
41 Shader shader = resources.mShaders[mShaderIdx].second;
43 static Geometry defaultGeometry = Geometry::New();
44 Renderer renderer = Renderer::New(defaultGeometry, shader);
46 RendererState::Apply(resources.mShaders[mShaderIdx].first.mRendererState, renderer);
48 actor.AddRenderer(renderer);
51 const std::string NodeDefinition::ORIGINAL_MATRIX_PROPERTY_NAME = "originalMatrix";
53 Actor NodeDefinition::CreateActor(CreateParams& params) const
55 Actor actor = Actor::New();
56 SetActorCentered(actor);
58 actor.SetProperty(Actor::Property::NAME, mName);
59 actor.SetProperty(Actor::Property::POSITION, mPosition);
60 actor.SetProperty(Actor::Property::ORIENTATION, mOrientation);
61 actor.SetProperty(Actor::Property::SCALE, mScale);
62 actor.SetProperty(Actor::Property::SIZE, mSize);
63 actor.SetProperty(Actor::Property::VISIBLE, mIsVisible);
65 actor.RegisterProperty(ORIGINAL_MATRIX_PROPERTY_NAME, GetLocalSpace(), Property::AccessMode::READ_ONLY);
69 mRenderable->OnCreate(*this, params, actor);
72 for(auto& e : mExtras)
74 actor.RegisterProperty(e.mKey, e.mValue);
77 for(auto& c : mConstraints)
79 params.mConstrainables.push_back(ConstraintRequest{&c, actor});
85 Matrix NodeDefinition::GetLocalSpace() const
87 Matrix localSpace{false};
88 localSpace.SetTransformComponents(mScale, mOrientation, mPosition);
92 void ModelNode::RegisterResources(IResourceReceiver& receiver) const
94 Renderable::RegisterResources(receiver);
95 receiver.Register(ResourceType::Mesh, mMeshIdx);
96 receiver.Register(ResourceType::Material, mMaterialIdx);
99 void ModelNode::ReflectResources(IResourceReflector& reflector)
101 Renderable::ReflectResources(reflector);
102 reflector.Reflect(ResourceType::Mesh, mMeshIdx);
103 reflector.Reflect(ResourceType::Material, mMaterialIdx);
106 void ModelNode::OnCreate(const NodeDefinition& node, NodeDefinition::CreateParams& params, Actor& actor) const
108 DALI_ASSERT_DEBUG(mMeshIdx != INVALID_INDEX);
109 Renderable::OnCreate(node, params, actor);
111 auto& resources = params.mResources;
112 auto& mesh = resources.mMeshes[mMeshIdx];
114 auto renderer = actor.GetRendererAt(0);
115 Geometry geometry = mesh.second.geometry;
116 renderer.SetGeometry(geometry);
118 auto shader = renderer.GetShader();
120 if(mesh.first.IsSkinned())
122 params.mSkinnables.push_back(SkinningShaderConfigurationRequest{mesh.first.mSkeletonIdx, shader});
125 if(mesh.first.HasBlendShapes())
127 params.mBlendshapeRequests.push_back(BlendshapeShaderConfigurationRequest{node.mName, mMeshIdx, shader});
130 TextureSet textures = resources.mMaterials[mMaterialIdx].second;
132 // Set the blend shape texture.
133 if(mesh.second.blendShapeGeometry)
135 TextureSet newTextureSet = TextureSet::New();
136 newTextureSet.SetTexture(0u, mesh.second.blendShapeGeometry);
138 const unsigned int numberOfTextures = textures.GetTextureCount();
139 for(unsigned int index = 0u; index < numberOfTextures; ++index)
141 const unsigned int newIndex = index + 1u;
142 newTextureSet.SetTexture(newIndex, textures.GetTexture(index));
143 newTextureSet.SetSampler(newIndex, textures.GetSampler(index));
146 textures = newTextureSet;
149 renderer.SetTextures(textures);
151 actor.SetProperty(Actor::Property::COLOR, mColor);
153 auto& matDef = resources.mMaterials[mMaterialIdx].first;
154 actor.RegisterProperty("uMetallicFactor", matDef.mMetallic);
155 actor.RegisterProperty("uRoughnessFactor", matDef.mRoughness);
157 Index envIdx = matDef.mEnvironmentIdx;
158 actor.RegisterProperty("uIblIntensity", resources.mEnvironmentMaps[envIdx].first.mIblIntensity);
160 const auto alphaCutoff = matDef.GetAlphaCutoff();
161 if(alphaCutoff > 0.f)
163 actor.RegisterProperty("uAlphaThreshold", alphaCutoff);
167 void ArcNode::OnCreate(const NodeDefinition& node, NodeDefinition::CreateParams& params, Actor& actor) const
169 ModelNode::OnCreate(node, params, actor);
171 actor.RegisterProperty("antiAliasing", mAntiAliasing ? 1 : 0);
172 actor.RegisterProperty("arcCaps", mArcCaps);
173 actor.RegisterProperty("radius", mRadius);
175 const float startAngleRadians = mStartAngleDegrees * Math::PI_OVER_180;
176 Vector2 startPolar{std::cos(startAngleRadians), std::sin(startAngleRadians)};
177 actor.RegisterProperty("startAngle", startPolar);
179 const float endAngleRadians = mEndAngleDegrees * Math::PI_OVER_180;
180 Vector2 endPolar{std::cos(endAngleRadians), std::sin(endAngleRadians)};
181 actor.RegisterProperty("endAngle", endPolar);
184 void ArcNode::GetEndVectorWithDiffAngle(float startAngle, float diffAngle, Vector2& endVector)
186 float endAngle = 0.f;
188 if(diffAngle <= 0.001f)
190 //0.001 is used to ensure is empty arc when startAngle = endAngle + 360 * N
191 endAngle = startAngle + 0.001f;
193 else if(diffAngle >= 360.f)
195 endAngle = diffAngle + 359.99f;
199 endAngle = startAngle + 360.0f + diffAngle;
201 endVector.x = cosf(endAngle * Math::PI_OVER_180);
202 endVector.y = sinf(endAngle * Math::PI_OVER_180);
205 } // namespace SceneLoader