Convert more shaders in dali-toolkit and dali-scene-loader to use shader compilation...
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / visuals / wireframe / wireframe-visual.cpp
1 /*
2  * Copyright (c) 2018 Samsung Electronics Co., Ltd.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  *
16  */
17
18
19 // CLASS HEADER
20 #include "wireframe-visual.h"
21
22 // INTERNAL INCLUDES
23 #include <dali-toolkit/public-api/visuals/visual-properties.h>
24 #include <dali-toolkit/internal/visuals/visual-factory-impl.h>
25 #include <dali-toolkit/internal/visuals/visual-factory-cache.h>
26 #include <dali-toolkit/internal/visuals/visual-string-constants.h>
27 #include <dali-toolkit/internal/visuals/visual-base-data-impl.h>
28 #include <dali-toolkit/internal/graphics/builtin-shader-extern-gen.h>
29
30 namespace Dali
31 {
32
33 namespace Toolkit
34 {
35
36 namespace Internal
37 {
38
39 namespace
40 {
41 const char * const POSITION_ATTRIBUTE_NAME("aPosition");
42 const char * const INDEX_NAME("indices");
43 }
44
45 WireframeVisualPtr WireframeVisual::New( VisualFactoryCache& factoryCache, const Property::Map& properties )
46 {
47   Visual::BasePtr emtptyVisual;
48
49   return New(factoryCache, emtptyVisual, properties);
50 }
51
52 WireframeVisualPtr WireframeVisual::New( VisualFactoryCache& factoryCache, Visual::BasePtr actualVisual )
53 {
54   return new WireframeVisual( factoryCache, actualVisual );
55 }
56
57 WireframeVisualPtr WireframeVisual::New( VisualFactoryCache& factoryCache, Visual::BasePtr actualVisual, const Property::Map& properties )
58 {
59   WireframeVisualPtr wireframeVisual( new WireframeVisual( factoryCache, actualVisual ) );
60
61   // Instead of calling SetProperties, looking for the only valid property 'transform'
62   Property::Value* transformValue = properties.Find( Toolkit::Visual::Property::TRANSFORM, TRANSFORM );
63   Property::Map transformMap;
64   if( transformValue && transformValue->Get( transformMap ) )
65   {
66     wireframeVisual->SetTransformAndSize( transformMap, Vector2::ZERO );
67   }
68
69   return wireframeVisual;
70 }
71
72 WireframeVisual::WireframeVisual( VisualFactoryCache& factoryCache, Visual::BasePtr actualVisual )
73 : Visual::Base( factoryCache, Visual::FittingMode::FILL, actualVisual ? actualVisual->GetType() : Toolkit::Visual::WIREFRAME ),
74   mActualVisual( actualVisual )
75 {
76 }
77
78 WireframeVisual::~WireframeVisual()
79 {
80 }
81
82 float WireframeVisual::GetHeightForWidth( float width )
83 {
84   if( mActualVisual )
85   {
86     return mActualVisual->GetHeightForWidth( width );
87   }
88   else
89   {
90     return Visual::Base::GetHeightForWidth( width );
91   }
92 }
93
94 void WireframeVisual::GetNaturalSize( Vector2& naturalSize )
95 {
96   if( mActualVisual )
97   {
98     mActualVisual->GetNaturalSize( naturalSize );
99   }
100   else
101   {
102     Visual::Base::GetNaturalSize( naturalSize );
103   }
104 }
105
106 void WireframeVisual::DoCreatePropertyMap( Property::Map& map ) const
107 {
108   if( mActualVisual )
109   {
110     mActualVisual->CreatePropertyMap( map );
111   }
112   else
113   {
114     map.Clear();
115     map.Insert( Toolkit::Visual::Property::TYPE, Toolkit::Visual::WIREFRAME );
116   }
117 }
118
119 void WireframeVisual::DoCreateInstancePropertyMap( Property::Map& map ) const
120 {
121   // Do nothing
122 }
123
124 void WireframeVisual::DoSetProperties( const Property::Map& propertyMap )
125 {
126   Property::Value* mixValue = propertyMap.Find( Toolkit::Visual::Property::MIX_COLOR, MIX_COLOR );
127   if( mixValue )
128   {
129     Vector4 mixColor;
130     mixValue->Get( mixColor );
131     SetMixColor( mixColor );
132   }
133 }
134
135 void WireframeVisual::DoSetOnScene( Actor& actor )
136 {
137   InitializeRenderer();
138
139   actor.AddRenderer( mImpl->mRenderer );
140
141   // Wireframe generated and ready to display
142   ResourceReady( Toolkit::Visual::ResourceStatus::READY );
143 }
144
145 void WireframeVisual::InitializeRenderer()
146 {
147   Shader shader = mFactoryCache.GetShader( VisualFactoryCache::WIREFRAME_SHADER );
148   if( !shader )
149   {
150     shader = Shader::New( SHADER_WIREFRAME_VISUAL_SHADER_VERT, SHADER_WIREFRAME_VISUAL_SHADER_FRAG );
151     mFactoryCache.SaveShader( VisualFactoryCache::WIREFRAME_SHADER, shader );
152   }
153
154   Geometry geometry = mFactoryCache.GetGeometry( VisualFactoryCache::WIREFRAME_GEOMETRY );
155   if( !geometry )
156   {
157     geometry = CreateQuadWireframeGeometry();
158     mFactoryCache.SaveGeometry( VisualFactoryCache::WIREFRAME_GEOMETRY, geometry );
159   }
160
161   //Create the renderer
162   mImpl->mRenderer = Renderer::New( geometry, shader);
163
164   //Register transform properties
165   mImpl->mTransform.RegisterUniforms( mImpl->mRenderer, Direction::LEFT_TO_RIGHT );
166 }
167
168 Geometry WireframeVisual::CreateQuadWireframeGeometry()
169 {
170   const float halfWidth = 0.5f;
171   const float halfHeight = 0.5f;
172   struct QuadVertex { Vector2 position;};
173   QuadVertex quadVertexData[4] =
174   {
175       { Vector2(-halfWidth, -halfHeight) },
176       { Vector2( halfWidth, -halfHeight) },
177       { Vector2( halfWidth,  halfHeight) },
178       { Vector2(-halfWidth,  halfHeight) }
179   };
180
181   Property::Map quadVertexFormat;
182   quadVertexFormat[POSITION_ATTRIBUTE_NAME] = Property::VECTOR2;
183   VertexBuffer quadVertices = VertexBuffer::New( quadVertexFormat );
184   quadVertices.SetData( quadVertexData, 4 );
185
186   // Create indices
187   unsigned short indexData[10] = { 0, 1, 1, 2, 2, 3, 3, 0 };
188
189   // Create the geometry object
190   Geometry geometry = Geometry::New();
191   geometry.AddVertexBuffer( quadVertices );
192   geometry.SetIndexBuffer( indexData, sizeof(indexData)/sizeof(indexData[0]) );
193   geometry.SetType( Geometry::LINES );
194
195   return geometry;
196 }
197
198 void WireframeVisual::OnSetTransform()
199 {
200   if( mImpl->mRenderer )
201   {
202     //Register transform properties
203     mImpl->mTransform.RegisterUniforms( mImpl->mRenderer, Direction::LEFT_TO_RIGHT );
204   }
205 }
206
207 Visual::Base& WireframeVisual::GetVisualObject()
208 {
209   if( mActualVisual )
210   {
211     return *mActualVisual.Get();
212   }
213
214   return *this;
215 }
216
217 } // namespace Internal
218
219 } // namespace Toolkit
220
221 } // namespace Dali