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 "wireframe-visual.h"
22 #include <dali-toolkit/public-api/visuals/visual-properties.h>
23 #include <dali-toolkit/internal/visuals/visual-factory-impl.h>
24 #include <dali-toolkit/internal/visuals/visual-factory-cache.h>
25 #include <dali-toolkit/internal/visuals/visual-string-constants.h>
26 #include <dali-toolkit/internal/visuals/visual-base-data-impl.h>
27 #include <dali-toolkit/internal/graphics/builtin-shader-extern-gen.h>
40 const char * const POSITION_ATTRIBUTE_NAME("aPosition");
41 const char * const INDEX_NAME("indices");
44 WireframeVisualPtr WireframeVisual::New( VisualFactoryCache& factoryCache, const Property::Map& properties )
46 Visual::BasePtr emtptyVisual;
48 return New(factoryCache, emtptyVisual, properties);
51 WireframeVisualPtr WireframeVisual::New( VisualFactoryCache& factoryCache, Visual::BasePtr actualVisual )
53 WireframeVisualPtr wireframeVisual(new WireframeVisual(factoryCache, actualVisual));
54 wireframeVisual->Initialize();
55 return wireframeVisual;
58 WireframeVisualPtr WireframeVisual::New( VisualFactoryCache& factoryCache, Visual::BasePtr actualVisual, const Property::Map& properties )
60 WireframeVisualPtr wireframeVisual( new WireframeVisual( factoryCache, actualVisual ) );
62 // Instead of calling SetProperties, looking for the only valid property 'transform'
63 Property::Value* transformValue = properties.Find( Toolkit::Visual::Property::TRANSFORM, TRANSFORM );
64 Property::Map transformMap;
65 if( transformValue && transformValue->Get( transformMap ) )
67 wireframeVisual->SetTransformAndSize( transformMap, Vector2::ZERO );
69 wireframeVisual->Initialize();
70 return wireframeVisual;
73 WireframeVisual::WireframeVisual( VisualFactoryCache& factoryCache, Visual::BasePtr actualVisual )
74 : Visual::Base( factoryCache, Visual::FittingMode::FILL, actualVisual ? actualVisual->GetType() : Toolkit::Visual::WIREFRAME ),
75 mActualVisual( actualVisual )
79 WireframeVisual::~WireframeVisual()
83 float WireframeVisual::GetHeightForWidth( float width )
87 return mActualVisual->GetHeightForWidth( width );
91 return Visual::Base::GetHeightForWidth( width );
95 void WireframeVisual::GetNaturalSize( Vector2& naturalSize )
99 mActualVisual->GetNaturalSize( naturalSize );
103 Visual::Base::GetNaturalSize( naturalSize );
107 void WireframeVisual::DoCreatePropertyMap( Property::Map& map ) const
111 mActualVisual->CreatePropertyMap( map );
116 map.Insert( Toolkit::Visual::Property::TYPE, Toolkit::Visual::WIREFRAME );
120 void WireframeVisual::DoCreateInstancePropertyMap( Property::Map& map ) const
125 void WireframeVisual::DoSetProperties( const Property::Map& propertyMap )
127 Property::Value* mixValue = propertyMap.Find( Toolkit::Visual::Property::MIX_COLOR, MIX_COLOR );
131 mixValue->Get( mixColor );
132 SetMixColor( mixColor );
136 void WireframeVisual::DoSetOnScene( Actor& actor )
138 actor.AddRenderer( mImpl->mRenderer );
140 // Wireframe generated and ready to display
141 ResourceReady( Toolkit::Visual::ResourceStatus::READY );
144 void WireframeVisual::OnInitialize()
146 Shader shader = mFactoryCache.GetShader( VisualFactoryCache::WIREFRAME_SHADER );
149 shader = Shader::New( SHADER_WIREFRAME_VISUAL_SHADER_VERT, SHADER_WIREFRAME_VISUAL_SHADER_FRAG );
150 mFactoryCache.SaveShader( VisualFactoryCache::WIREFRAME_SHADER, shader );
153 Geometry geometry = mFactoryCache.GetGeometry( VisualFactoryCache::WIREFRAME_GEOMETRY );
156 geometry = CreateQuadWireframeGeometry();
157 mFactoryCache.SaveGeometry( VisualFactoryCache::WIREFRAME_GEOMETRY, geometry );
160 //Create the renderer
161 mImpl->mRenderer = Renderer::New( geometry, shader);
163 //Register transform properties
164 mImpl->mTransform.RegisterUniforms( mImpl->mRenderer, Direction::LEFT_TO_RIGHT );
167 Geometry WireframeVisual::CreateQuadWireframeGeometry()
169 const float halfWidth = 0.5f;
170 const float halfHeight = 0.5f;
171 struct QuadVertex { Vector2 position;};
172 QuadVertex quadVertexData[4] =
174 { Vector2(-halfWidth, -halfHeight) },
175 { Vector2( halfWidth, -halfHeight) },
176 { Vector2( halfWidth, halfHeight) },
177 { Vector2(-halfWidth, halfHeight) }
180 Property::Map quadVertexFormat;
181 quadVertexFormat[POSITION_ATTRIBUTE_NAME] = Property::VECTOR2;
182 VertexBuffer quadVertices = VertexBuffer::New( quadVertexFormat );
183 quadVertices.SetData( quadVertexData, 4 );
186 unsigned short indexData[10] = { 0, 1, 1, 2, 2, 3, 3, 0 };
188 // Create the geometry object
189 Geometry geometry = Geometry::New();
190 geometry.AddVertexBuffer( quadVertices );
191 geometry.SetIndexBuffer( indexData, sizeof(indexData)/sizeof(indexData[0]) );
192 geometry.SetType( Geometry::LINES );
197 void WireframeVisual::OnSetTransform()
199 if( mImpl->mRenderer )
201 //Register transform properties
202 mImpl->mTransform.RegisterUniforms( mImpl->mRenderer, Direction::LEFT_TO_RIGHT );
206 Visual::Base& WireframeVisual::GetVisualObject()
210 return *mActualVisual.Get();
216 } // namespace Internal
218 } // namespace Toolkit