2 * Copyright (c) 2020 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.
21 Vector3 ToHueSaturationLightness(Vector3 rgb)
23 float min = std::min(rgb.r, std::min(rgb.g, rgb.b));
24 float max = std::max(rgb.r, std::max(rgb.g, rgb.b));
26 Vector3 hsl(max - min, 0.f, (max + min) * .5f);
27 if (hsl.x * hsl.x > .0f)
32 hsl.x = (rgb.g - rgb.b) / hsl.x;
36 hsl.x = 2.f + (rgb.b - rgb.r) / hsl.x;
40 hsl.x = 4.f + (rgb.r - rgb.g) / hsl.x;
56 Vector3 FromHueSaturationLightness(Vector3 hsl)
59 if (hsl.y * hsl.y > 0.f)
67 int i = FastFloor(hsl.x);
69 float p = hsl.z * (1.0 - hsl.y);
70 float q = hsl.z * (1.0 - (hsl.y * ff));
71 float t = hsl.z * (1.0 - (hsl.y * (1.f - ff)));
115 rgb = Vector3::ONE * hsl.z;
121 Geometry CreateCuboidWireframeGeometry()
132 Vector3 vertexData[] = {
133 Vector3(-.5, -.5, -.5),
134 Vector3( .5, -.5, -.5),
135 Vector3(-.5, .5, -.5),
136 Vector3( .5, .5, -.5),
137 Vector3(-.5, -.5, .5),
138 Vector3( .5, -.5, .5),
139 Vector3(-.5, .5, .5),
140 Vector3( .5, .5, .5),
143 uint16_t indices[] = {
144 0, 1, 1, 3, 3, 2, 2, 0,
145 0, 4, 1, 5, 3, 7, 2, 6,
146 4, 5, 5, 7, 7, 6, 6, 4
148 VertexBuffer vertexBuffer = VertexBuffer::New( Property::Map()
149 .Add( "aPosition", Property::VECTOR3));
150 vertexBuffer.SetData(vertexData, std::extent<decltype(vertexData)>::value );
152 Geometry geometry = Geometry::New();
153 geometry.AddVertexBuffer( vertexBuffer );
154 geometry.SetIndexBuffer( indices, std::extent<decltype(indices)>::value );
155 geometry.SetType(Geometry::LINES);
159 Renderer CreateRenderer(TextureSet textures, Geometry geometry, Shader shader, uint32_t options)
161 Renderer renderer = Renderer::New(geometry, shader);
162 renderer.SetProperty(Renderer::Property::BLEND_MODE,
163 (options & OPTION_BLEND) ? BlendMode::ON : BlendMode::OFF);
164 renderer.SetProperty(Renderer::Property::DEPTH_TEST_MODE,
165 (options & OPTION_DEPTH_TEST) ? DepthTestMode::ON : DepthTestMode::OFF);
166 renderer.SetProperty(Renderer::Property::DEPTH_WRITE_MODE,
167 (options & OPTION_DEPTH_WRITE) ? DepthWriteMode::ON : DepthWriteMode::OFF);
168 renderer.SetProperty(Renderer::Property::FACE_CULLING_MODE, FaceCullingMode::BACK);
172 textures = TextureSet::New();
175 renderer.SetTextures(textures);
179 void CenterActor(Actor actor)
181 actor.SetProperty(Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER );
182 actor.SetProperty(Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER );
187 auto actor = Actor::New();
192 Renderer CloneRenderer(Renderer original)
194 Geometry geom = original.GetGeometry();
195 Shader shader = original.GetShader();
196 Renderer clone = Renderer::New(geom, shader);
199 Property::IndexContainer indices;
200 original.GetPropertyIndices(indices);
202 for (auto& i: indices)
204 auto actualIndex = PropertyRanges::DEFAULT_RENDERER_PROPERTY_START_INDEX + i;
205 clone.SetProperty(actualIndex, original.GetProperty(actualIndex));
208 // Copy texture references (and create TextureSet, if there's any textures).
209 TextureSet ts = original.GetTextures();
210 clone.SetTextures(ts);
215 Actor CloneActor(Actor original)
217 using namespace Dali;
219 auto clone = Actor::New();
220 clone.SetProperty(Actor::Property::NAME, original.GetProperty(Actor::Property::NAME));
223 // Don't copy every single one of them.
224 // Definitely don't copy resize policy related things, which will internally enable
225 // relayout, which in turn will result in losing the ability to set Z size.
227 Actor::Property::PARENT_ORIGIN,
228 Actor::Property::ANCHOR_POINT,
229 Actor::Property::SIZE,
230 Actor::Property::POSITION,
231 Actor::Property::ORIENTATION,
232 Actor::Property::SCALE,
233 Actor::Property::VISIBLE,
234 Actor::Property::COLOR,
235 Actor::Property::NAME,
238 clone.SetProperty(i, original.GetProperty(i));
242 for(unsigned int i = 0; i < original.GetRendererCount(); ++i)
244 auto rClone = CloneRenderer(original.GetRendererAt(i));
245 clone.AddRenderer(rClone);
248 // Recurse into children.
249 for(unsigned int i = 0; i < original.GetChildCount(); ++i)
251 Actor newChild = CloneActor(original.GetChildAt(i));