e3053e1f6fef8debcc2197f9a00196b8e1cb48f7
[platform/core/uifw/dali-core.git] / automated-tests / src / dali-internal / utc-Dali-Internal-FrustumCulling.cpp
1 /*
2  * Copyright (c) 2014 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 #include <iostream>
19 #include <algorithm>
20 #include <stdlib.h>
21 #include <dali/public-api/dali-core.h>
22 #include <dali-test-suite-utils.h>
23 #include <dali/devel-api/object/property-buffer.h>
24 #include <dali/devel-api/rendering/geometry.h>
25 #include <dali/devel-api/rendering/material.h>
26 #include <dali/devel-api/rendering/renderer.h>
27 #include <dali/devel-api/rendering/sampler.h>
28 #include <dali/devel-api/rendering/shader.h>
29
30 using namespace Dali;
31
32 #define MAKE_SHADER(A)#A
33
34 const char* VERTEX_SHADER = MAKE_SHADER(
35 attribute mediump vec2    aPosition;
36 attribute mediump vec2    aTexCoord;
37 uniform   mediump mat4    uMvpMatrix;
38 uniform   mediump vec3    uSize;
39 varying   mediump vec2    vTexCoord;
40
41 void main()
42 {
43   mediump vec4 vertexPosition = vec4(aPosition, 0.0, 1.0);
44   vertexPosition.xyz *= uSize;
45   vertexPosition = uMvpMatrix * vertexPosition;
46   vTexCoord = aTexCoord;
47   gl_Position = vertexPosition;
48 }
49 );
50
51 const char* FRAGMENT_SHADER = MAKE_SHADER(
52 uniform Sampler2D sTexture;
53 varying mediump vec2 vTexCoord;
54 void main()
55 {
56   gl_FragColor = texture2D( sTexture, vTexCoord );
57 }
58 );
59
60 Geometry CreateGeometry()
61 {
62   const float halfQuadSize = .5f;
63   struct TexturedQuadVertex { Vector2 position; Vector2 textureCoordinates; };
64   TexturedQuadVertex texturedQuadVertexData[4] = {
65     { Vector2(-halfQuadSize, -halfQuadSize), Vector2(0.f, 0.f) },
66     { Vector2( halfQuadSize, -halfQuadSize), Vector2(1.f, 0.f) },
67     { Vector2(-halfQuadSize,  halfQuadSize), Vector2(0.f, 1.f) },
68     { Vector2( halfQuadSize,  halfQuadSize), Vector2(1.f, 1.f) } };
69
70   Property::Map texturedQuadVertexFormat;
71   texturedQuadVertexFormat["aPosition"] = Property::VECTOR2;
72   texturedQuadVertexFormat["aTexCoord"] = Property::VECTOR2;
73   PropertyBuffer texturedQuadVertices = PropertyBuffer::New( texturedQuadVertexFormat, 4 );
74   texturedQuadVertices.SetData(texturedQuadVertexData);
75
76   // Create indices
77   unsigned int indexData[6] = { 0, 3, 1, 0, 2, 3 };
78   Property::Map indexFormat;
79   indexFormat["indices"] = Property::INTEGER;
80   PropertyBuffer indices = PropertyBuffer::New( indexFormat, sizeof(indexData)/sizeof(indexData[0]) );
81   indices.SetData(indexData);
82
83   // Create the geometry object
84   Geometry texturedQuadGeometry = Geometry::New();
85   texturedQuadGeometry.AddVertexBuffer( texturedQuadVertices );
86   texturedQuadGeometry.SetIndexBuffer( indices );
87
88   return texturedQuadGeometry;
89 }
90
91 int UtcFrustumCullN(void)
92 {
93   TestApplication application;
94   TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
95   TraceCallStack& drawTrace = glAbstraction.GetDrawTrace();
96   drawTrace.Enable(true);
97
98   PixelBuffer* pixelBuffer = new PixelBuffer[ 4 ];
99   BufferImage image = BufferImage::New( pixelBuffer, 1, 1 );
100
101   Geometry geometry = CreateGeometry();
102   Material material = Material::New( Shader::New( VERTEX_SHADER, FRAGMENT_SHADER ) );
103   Sampler sampler = Sampler::New( image, "sTexture" );
104   material.AddSampler( sampler );
105   Renderer renderer = Renderer::New( geometry, material );
106
107   Actor meshActor = Actor::New();
108   meshActor.AddRenderer( renderer );
109   meshActor.SetSize( Vector3( 400.0f, 400.0f, 0.1f) );
110   drawTrace.Reset();
111
112   meshActor.SetParentOrigin( ParentOrigin::CENTER );
113   meshActor.SetAnchorPoint( AnchorPoint::CENTER );
114   Stage::GetCurrent().Add( meshActor );
115
116   application.SendNotification();
117   application.Render(16);
118   DALI_TEST_CHECK( drawTrace.FindMethod( "DrawElements" ) );
119   END_TEST;
120 }
121
122 int UtcFrustumLeftCullP(void)
123 {
124   TestApplication application;
125   TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
126   TraceCallStack& drawTrace = glAbstraction.GetDrawTrace();
127   drawTrace.Enable(true);
128
129   PixelBuffer* pixelBuffer = new PixelBuffer[ 4 ];
130   BufferImage image = BufferImage::New( pixelBuffer, 1, 1 );
131
132   Geometry geometry = CreateGeometry();
133   Material material = Material::New( Shader::New( VERTEX_SHADER, FRAGMENT_SHADER ) );
134   Sampler sampler = Sampler::New( image, "sTexture" );
135   material.AddSampler( sampler );
136   Renderer renderer = Renderer::New( geometry, material );
137
138   Actor meshActor = Actor::New();
139   meshActor.AddRenderer( renderer );
140   meshActor.SetSize( Vector3( 400.0f, 400.0f, 0.1f) );
141   drawTrace.Reset();
142
143   float offset = -0.01f;
144
145   meshActor.SetParentOrigin( Vector3( offset, 0.5f, 0.5f ) );
146   meshActor.SetAnchorPoint( AnchorPoint::CENTER_RIGHT );
147   Stage::GetCurrent().Add( meshActor );
148
149   application.SendNotification();
150   application.Render(16);
151
152   // This will be box culled
153   DALI_TEST_CHECK( !drawTrace.FindMethod( "DrawElements" ) );
154
155   float radius = meshActor.GetTargetSize().Length() * 0.5f;
156   Vector2 stageSize = Stage::GetCurrent().GetSize();
157
158   drawTrace.Reset();
159   meshActor.SetParentOrigin( Vector3( -radius/stageSize.width + offset, 0.5f, 0.5f ) );
160   meshActor.SetAnchorPoint( AnchorPoint::CENTER );
161   application.SendNotification();
162   application.Render(16);
163
164   // This will be sphere culled
165   DALI_TEST_CHECK( !drawTrace.FindMethod( "DrawElements" ) );
166
167   END_TEST;
168 }
169
170 int UtcFrustumRightCullP(void)
171 {
172   TestApplication application;
173   TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
174   TraceCallStack& drawTrace = glAbstraction.GetDrawTrace();
175   drawTrace.Enable(true);
176
177   PixelBuffer* pixelBuffer = new PixelBuffer[ 4 ];
178   BufferImage image = BufferImage::New( pixelBuffer, 1, 1 );
179
180   Geometry geometry = CreateGeometry();
181   Material material = Material::New( Shader::New( VERTEX_SHADER, FRAGMENT_SHADER ) );
182   Sampler sampler = Sampler::New( image, "sTexture" );
183   material.AddSampler( sampler );
184   Renderer renderer = Renderer::New( geometry, material );
185
186   Actor meshActor = Actor::New();
187   meshActor.AddRenderer( renderer );
188   meshActor.SetSize( Vector3( 400.0f, 400.0f, 0.1f) );
189   drawTrace.Reset();
190
191   float offset = 1.01f;
192
193   meshActor.SetParentOrigin( Vector3( offset, 0.5f, 0.5f ) );
194   meshActor.SetAnchorPoint( AnchorPoint::CENTER_LEFT );
195   Stage::GetCurrent().Add( meshActor );
196
197   application.SendNotification();
198   application.Render(16);
199
200   // This will be box culled
201   DALI_TEST_CHECK( !drawTrace.FindMethod( "DrawElements" ) );
202
203   float radius = meshActor.GetTargetSize().Length() * 0.5f;
204   Vector2 stageSize = Stage::GetCurrent().GetSize();
205
206   drawTrace.Reset();
207   meshActor.SetParentOrigin( Vector3( radius/stageSize.width + offset, 0.5f, 0.5f ) );
208   meshActor.SetAnchorPoint( AnchorPoint::CENTER );
209   application.SendNotification();
210   application.Render(16);
211
212   // This will be sphere culled
213   DALI_TEST_CHECK( !drawTrace.FindMethod( "DrawElements" ) );
214
215   END_TEST;
216 }
217
218 int UtcFrustumTopCullP(void)
219 {
220   TestApplication application;
221   TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
222   TraceCallStack& drawTrace = glAbstraction.GetDrawTrace();
223   drawTrace.Enable(true);
224
225   PixelBuffer* pixelBuffer = new PixelBuffer[ 4 ];
226   BufferImage image = BufferImage::New( pixelBuffer, 1, 1 );
227
228   Geometry geometry = CreateGeometry();
229   Material material = Material::New( Shader::New( VERTEX_SHADER, FRAGMENT_SHADER ) );
230   Sampler sampler = Sampler::New( image, "sTexture" );
231   material.AddSampler( sampler );
232   Renderer renderer = Renderer::New( geometry, material );
233
234   Actor meshActor = Actor::New();
235   meshActor.AddRenderer( renderer );
236   meshActor.SetSize( Vector3( 400.0f, 400.0f, 0.1f) );
237   drawTrace.Reset();
238
239   float offset = -0.01f;
240
241   meshActor.SetParentOrigin( Vector3( 0.5f, offset, 0.5f ) );
242   meshActor.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER );
243   Stage::GetCurrent().Add( meshActor );
244
245   application.SendNotification();
246   application.Render(16);
247
248   // This will be box culled
249   DALI_TEST_CHECK( !drawTrace.FindMethod( "DrawElements" ) );
250
251   float radius = meshActor.GetTargetSize().Length() * 0.5f;
252   Vector2 stageSize = Stage::GetCurrent().GetSize();
253
254   drawTrace.Reset();
255   meshActor.SetParentOrigin( Vector3( 0.5f, -radius/stageSize.width + offset, 0.5f ) );
256   meshActor.SetAnchorPoint( AnchorPoint::CENTER );
257   application.SendNotification();
258   application.Render(16);
259
260   // This will be sphere culled
261   DALI_TEST_CHECK( !drawTrace.FindMethod( "DrawElements" ) );
262
263   END_TEST;
264 }
265
266 int UtcFrustumBottomCullP(void)
267 {
268   TestApplication application;
269   TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
270   TraceCallStack& drawTrace = glAbstraction.GetDrawTrace();
271   drawTrace.Enable(true);
272
273   PixelBuffer* pixelBuffer = new PixelBuffer[ 4 ];
274   BufferImage image = BufferImage::New( pixelBuffer, 1, 1 );
275
276   Geometry geometry = CreateGeometry();
277   Material material = Material::New( Shader::New( VERTEX_SHADER, FRAGMENT_SHADER ) );
278   Sampler sampler = Sampler::New( image, "sTexture" );
279   material.AddSampler( sampler );
280   Renderer renderer = Renderer::New( geometry, material );
281
282   Actor meshActor = Actor::New();
283   meshActor.AddRenderer( renderer );
284   meshActor.SetSize( Vector3( 400.0f, 400.0f, 0.1f) );
285   drawTrace.Reset();
286
287   float offset = 1.01f;
288
289   meshActor.SetParentOrigin( Vector3( 0.5f, offset, 0.5f ) );
290   meshActor.SetAnchorPoint( AnchorPoint::TOP_CENTER );
291   Stage::GetCurrent().Add( meshActor );
292
293   application.SendNotification();
294   application.Render(16);
295
296   // This will be box culled
297   DALI_TEST_CHECK( !drawTrace.FindMethod( "DrawElements" ) );
298
299   float radius = meshActor.GetTargetSize().Length() * 0.5f;
300   Vector2 stageSize = Stage::GetCurrent().GetSize();
301
302   drawTrace.Reset();
303   meshActor.SetParentOrigin( Vector3( 0.5f, radius/stageSize.width + offset, 0.5f ) );
304   meshActor.SetAnchorPoint( AnchorPoint::CENTER );
305   application.SendNotification();
306   application.Render(16);
307
308   // This will be sphere culled
309   DALI_TEST_CHECK( !drawTrace.FindMethod( "DrawElements" ) );
310
311   END_TEST;
312 }
313
314 int UtcFrustumNearCullP(void)
315 {
316   TestApplication application;
317   TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
318   TraceCallStack& drawTrace = glAbstraction.GetDrawTrace();
319   drawTrace.Enable(true);
320
321   PixelBuffer* pixelBuffer = new PixelBuffer[ 4 ];
322   BufferImage image = BufferImage::New( pixelBuffer, 1, 1 );
323
324   Geometry geometry = CreateGeometry();
325   Material material = Material::New( Shader::New( VERTEX_SHADER, FRAGMENT_SHADER ) );
326   Sampler sampler = Sampler::New( image, "sTexture" );
327   material.AddSampler( sampler );
328   Renderer renderer = Renderer::New( geometry, material );
329
330   Actor meshActor = Actor::New();
331   meshActor.AddRenderer( renderer );
332   meshActor.SetSize( Vector3( 400.0f, 400.0f, 0.1f) );
333   drawTrace.Reset();
334
335   meshActor.SetParentOrigin( Vector3( 0.5f, 0.5f, 7.0f ) );
336   meshActor.SetAnchorPoint( AnchorPoint::CENTER );
337   Stage::GetCurrent().Add( meshActor );
338
339   application.SendNotification();
340   application.Render(16);
341
342   // This will be sphere culled
343   DALI_TEST_CHECK( !drawTrace.FindMethod( "DrawElements" ) );
344   END_TEST;
345 }
346
347 int UtcFrustumFarCullP(void)
348 {
349   TestApplication application;
350   TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
351   TraceCallStack& drawTrace = glAbstraction.GetDrawTrace();
352   drawTrace.Enable(true);
353
354   PixelBuffer* pixelBuffer = new PixelBuffer[ 4 ];
355   BufferImage image = BufferImage::New( pixelBuffer, 1, 1 );
356
357   Geometry geometry = CreateGeometry();
358   Material material = Material::New( Shader::New( VERTEX_SHADER, FRAGMENT_SHADER ) );
359   Sampler sampler = Sampler::New( image, "sTexture" );
360   material.AddSampler( sampler );
361   Renderer renderer = Renderer::New( geometry, material );
362
363   Actor meshActor = Actor::New();
364   meshActor.AddRenderer( renderer );
365   meshActor.SetSize( Vector3( 400.0f, 400.0f, 0.1f) );
366   drawTrace.Reset();
367
368   meshActor.SetParentOrigin( Vector3( 0.5f, 0.5f, -7.0f ) );
369   meshActor.SetAnchorPoint( AnchorPoint::CENTER );
370   Stage::GetCurrent().Add( meshActor );
371
372   application.SendNotification();
373   application.Render(16);
374
375   // This will be sphere culled
376   DALI_TEST_CHECK( !drawTrace.FindMethod( "DrawElements" ) );
377   END_TEST;
378 }
379
380 int UtcFrustumCullDisabledP(void)
381 {
382     TestApplication application;
383   TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
384   TraceCallStack& drawTrace = glAbstraction.GetDrawTrace();
385   drawTrace.Enable(true);
386
387   PixelBuffer* pixelBuffer = new PixelBuffer[ 4 ];
388   BufferImage image = BufferImage::New( pixelBuffer, 1, 1 );
389
390   Geometry geometry = CreateGeometry();
391   Material material = Material::New( Shader::New( VERTEX_SHADER, FRAGMENT_SHADER, Shader::HINT_MODIFIES_GEOMETRY ) );
392   Sampler sampler = Sampler::New( image, "sTexture" );
393   material.AddSampler( sampler );
394   Renderer renderer = Renderer::New( geometry, material );
395
396   Actor meshActor = Actor::New();
397   meshActor.AddRenderer( renderer );
398   meshActor.SetSize( Vector3( 400.0f, 400.0f, 0.1f) );
399   drawTrace.Reset();
400
401   meshActor.SetParentOrigin( ParentOrigin::CENTER );
402   meshActor.SetAnchorPoint( AnchorPoint::CENTER );
403   Stage::GetCurrent().Add( meshActor );
404
405   application.SendNotification();
406   application.Render(16);
407
408   // This should not be culled
409   DALI_TEST_CHECK( drawTrace.FindMethod( "DrawElements" ) );
410   END_TEST;
411 }