2 * Copyright (c) 2014 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 #include <dali/public-api/dali-core.h>
22 #include <dali-test-suite-utils.h>
27 void utc_dali_material_startup(void)
29 test_return_value = TET_UNDEF;
32 void utc_dali_material_cleanup(void)
34 test_return_value = TET_PASS;
40 static AnimatableMesh CreateMeshData(Material material)
42 AnimatableMesh::Faces faces;
43 for(int i=0; i<10-3; i++)
49 return AnimatableMesh::New(10, faces, material);
52 }// anonymous namespace
55 // Positive test case for a method
56 int UtcDaliMaterialNew01(void)
58 TestApplication application;
59 tet_infoline("Testing constructors, New and destructors");
62 DALI_TEST_CHECK( ! material );
64 material = Material::New("material");
65 DALI_TEST_CHECK( material );
67 Material* material2 = new Material();
68 DALI_TEST_CHECK( ! *material2 );
71 Material material3 = material;
74 Material material5 = material;
79 int UtcDaliMaterialDownCast(void)
81 TestApplication application;
83 Material material = Material::New("material");
84 BaseHandle handle(material);
86 Material mat2 = Material::DownCast( handle );
87 DALI_TEST_CHECK( mat2 );
91 int UtcDaliMaterialSettersAndGetters(void)
93 TestApplication application;
94 Material material = Material::New("material");
95 DALI_TEST_EQUALS( material.GetName(), "material", TEST_LOCATION );
96 material.SetName( "AnotherMaterial" );
97 DALI_TEST_EQUALS( material.GetName(), "AnotherMaterial", TEST_LOCATION );
99 DALI_TEST_EQUALS( material.GetOpacity(), Material::DEFAULT_OPACITY, 0.001, TEST_LOCATION);
100 material.SetOpacity(0.38f);
101 DALI_TEST_EQUALS( material.GetOpacity(), 0.38f, 0.001, TEST_LOCATION);
103 DALI_TEST_EQUALS( material.GetShininess(), Material::DEFAULT_SHININESS, 0.001, TEST_LOCATION);
104 material.SetShininess(0.47f);
105 DALI_TEST_EQUALS( material.GetShininess(), 0.47f, 0.001, TEST_LOCATION);
107 DALI_TEST_EQUALS( material.GetAmbientColor(), Material::DEFAULT_AMBIENT_COLOR, 0.001, TEST_LOCATION);
108 material.SetAmbientColor(Color::BLACK);
109 DALI_TEST_EQUALS( material.GetAmbientColor(), Color::BLACK, 0.001, TEST_LOCATION);
111 DALI_TEST_EQUALS( material.GetDiffuseColor(), Material::DEFAULT_DIFFUSE_COLOR, 0.001, TEST_LOCATION);
112 material.SetDiffuseColor(Color::BLUE);
113 DALI_TEST_EQUALS( material.GetDiffuseColor(), Color::BLUE, 0.001, TEST_LOCATION);
115 DALI_TEST_EQUALS( material.GetSpecularColor(), Material::DEFAULT_SPECULAR_COLOR, 0.001, TEST_LOCATION);
116 material.SetSpecularColor(Color::GREEN);
117 DALI_TEST_EQUALS( material.GetSpecularColor(), Color::GREEN, 0.001, TEST_LOCATION);
119 DALI_TEST_EQUALS( material.GetEmissiveColor(), Material::DEFAULT_EMISSIVE_COLOR, 0.001, TEST_LOCATION);
120 material.SetEmissiveColor(Color::MAGENTA);
121 DALI_TEST_EQUALS( material.GetEmissiveColor(), Color::MAGENTA, 0.001, TEST_LOCATION);
123 material.SetDiffuseTextureFileName("diffuse-texture.png");
124 DALI_TEST_EQUALS( material.GetDiffuseFileName(), "diffuse-texture.png", TEST_LOCATION);
126 material.SetOpacityTextureFileName("opacity-texture.png");
127 DALI_TEST_EQUALS( material.GetOpacityTextureFileName(), "opacity-texture.png", TEST_LOCATION);
129 material.SetNormalMapFileName("normal-map.png");
130 DALI_TEST_EQUALS( material.GetNormalMapFileName(), "normal-map.png", TEST_LOCATION);
132 Image diffuseTexture = Image::New("diffuse-texture.png");
133 material.SetDiffuseTexture(diffuseTexture);
134 DALI_TEST_EQUALS( material.GetDiffuseTexture(), diffuseTexture, TEST_LOCATION );
136 Image opacityTexture = Image::New("opacity-texture.png");
137 material.SetOpacityTexture(opacityTexture);
138 DALI_TEST_EQUALS( material.GetOpacityTexture(), opacityTexture, TEST_LOCATION);
140 Image normalMap = Image::New("normal-map.png");
141 material.SetNormalMap(normalMap);
142 DALI_TEST_EQUALS( material.GetNormalMap(), normalMap, TEST_LOCATION);
144 DALI_TEST_EQUALS( material.GetMapU(), (unsigned int)Material::DEFAULT_MAPPING_MODE, TEST_LOCATION );
145 DALI_TEST_EQUALS( material.GetMapV(), (unsigned int)Material::DEFAULT_MAPPING_MODE, TEST_LOCATION );
146 material.SetMapU( Material::MAPPING_MODE_WRAP );
147 material.SetMapV( Material::MAPPING_MODE_MIRROR );
148 DALI_TEST_EQUALS( material.GetMapU(), (unsigned int)Material::MAPPING_MODE_WRAP, TEST_LOCATION );
149 DALI_TEST_EQUALS( material.GetMapV(), (unsigned int)Material::MAPPING_MODE_MIRROR, TEST_LOCATION );
151 DALI_TEST_EQUALS( material.GetDiffuseUVIndex(), Material::DEFAULT_DIFFUSE_UV_INDEX, TEST_LOCATION );
152 material.SetDiffuseUVIndex( 1u );
153 DALI_TEST_EQUALS( material.GetDiffuseUVIndex(), 1u, TEST_LOCATION );
155 DALI_TEST_EQUALS( material.GetOpacityUVIndex(), Material::DEFAULT_OPACITY_UV_INDEX, TEST_LOCATION );
156 material.SetOpacityUVIndex( 1u );
157 DALI_TEST_EQUALS( material.GetOpacityUVIndex(), 1u, TEST_LOCATION );
159 DALI_TEST_EQUALS( material.GetNormalUVIndex(), Material::DEFAULT_NORMAL_UV_INDEX, TEST_LOCATION );
160 material.SetNormalUVIndex( 1u );
161 DALI_TEST_EQUALS( material.GetNormalUVIndex(), 1u, TEST_LOCATION );
163 DALI_TEST_EQUALS( material.GetHasHeightMap(), Material::DEFAULT_HAS_HEIGHT_MAP, TEST_LOCATION );
164 material.SetHasHeightMap(true);
165 DALI_TEST_EQUALS( material.GetHasHeightMap(), true, TEST_LOCATION );
169 int UtcDaliMaterialStage01(void)
171 TestApplication application;
172 TraceCallStack& textureTrace = application.GetGlAbstraction().GetTextureTrace();
173 textureTrace.Enable(true);
174 TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
177 Material material = Material::New("material");
178 Image image = Image::New( "image.png", Image::Immediate, Image::Never );
179 DALI_TEST_CHECK(image);
180 application.SendNotification();
181 application.Render(16);
183 std::vector<GLuint> ids;
185 application.GetGlAbstraction().SetNextTextureIds( ids );
186 Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::DISCARD );
187 Integration::ResourcePointer resource(bitmap);
188 bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
189 DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
190 Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
191 DALI_TEST_CHECK( request != NULL );
194 application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
197 material.SetDiffuseTexture(image);
198 application.SendNotification();
199 application.Render();
201 AnimatableMesh mesh = CreateMeshData(material);
203 application.SendNotification();
204 application.Render();
206 MeshActor meshActor = MeshActor::New(mesh);
207 meshActor.SetSize(100, 100);
208 meshActor.SetAffectedByLighting(false);
209 Stage::GetCurrent().Add(meshActor);
210 application.SendNotification();
211 application.Render();
213 material.SetOpacity(0.5f);
214 application.SendNotification();
215 application.Render();
216 DALI_TEST_EQUALS( material.GetOpacity(), 0.5f, 0.001f, TEST_LOCATION );
218 Stage::GetCurrent().Remove(meshActor);
219 application.SendNotification();
220 application.Render();
222 DALI_TEST_CHECK( glAbstraction.CheckNoTexturesDeleted() );
223 DALI_TEST_CHECK( ! textureTrace.FindMethod( "DeleteTextures" ) );
225 application.SendNotification();
226 application.Render();
228 // Mesh should be destroyed, reducing connection count on material to zero.
229 // This should also reduce connection count on image to zero
230 DALI_TEST_EQUALS( material.GetOpacity(), 0.5f, 0.001f, TEST_LOCATION );
232 // SceneGraph::Material & SceneGraph::RenderMaterial should be destroyed
233 // Image should be destroyed
234 application.SendNotification();
235 application.Render();
237 application.Render();
238 DALI_TEST_CHECK( textureTrace.FindMethod( "DeleteTextures" ) );
239 DALI_TEST_CHECK( glAbstraction.CheckTextureDeleted( 23 ) );
244 int UtcDaliMaterialStage01MemCheck(void)
246 TestApplication application;
247 tet_result(TET_PASS);
251 int UtcDaliMaterialStage02(void)
253 TestApplication application;
254 TraceCallStack& textureTrace = application.GetGlAbstraction().GetTextureTrace();
255 textureTrace.Enable(true);
256 TestGlAbstraction& glAbstraction = application.GetGlAbstraction();
259 Material material = Material::New("material");
261 Image image = Image::New( "image.png", Image::OnDemand, Image::Unused );
262 DALI_TEST_CHECK(image);
263 application.SendNotification();
264 application.Render(16);
265 DALI_TEST_CHECK( !application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
266 DALI_TEST_CHECK( application.GetPlatform().GetRequest() == NULL );
268 std::vector<GLuint> ids;
270 application.GetGlAbstraction().SetNextTextureIds( ids );
272 material.SetDiffuseTexture(image);
273 application.SendNotification();
274 application.Render();
275 DALI_TEST_CHECK( !application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
276 DALI_TEST_CHECK( application.GetPlatform().GetRequest() == NULL );
278 AnimatableMesh mesh = CreateMeshData(material);
280 application.SendNotification();
281 application.Render();
282 DALI_TEST_CHECK( !application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
283 DALI_TEST_CHECK( application.GetPlatform().GetRequest() == NULL );
286 MeshActor meshActor = MeshActor::New(mesh);
287 meshActor.SetSize(100, 100);
288 meshActor.SetAffectedByLighting(false);
289 Stage::GetCurrent().Add(meshActor);
290 application.SendNotification();
291 application.Render();
293 // Image connection count should go to one - image should get loaded
294 DALI_TEST_CHECK( application.GetPlatform().WasCalled(TestPlatformAbstraction::LoadResourceFunc) );
295 Integration::ResourceRequest* request = application.GetPlatform().GetRequest();
296 DALI_TEST_CHECK( request != NULL );
298 Integration::Bitmap* bitmap = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::DISCARD );
299 Integration::ResourcePointer resource(bitmap);
300 bitmap->GetPackedPixelsProfile()->ReserveBuffer(Pixel::RGBA8888, 80, 80, 80, 80);
303 application.GetPlatform().SetResourceLoaded(request->GetId(), request->GetType()->id, resource);
305 application.Render();
307 material.SetOpacity(0.5f);
308 application.SendNotification();
309 application.Render();
310 DALI_TEST_EQUALS( material.GetOpacity(), 0.5f, 0.001f, TEST_LOCATION );
312 Stage::GetCurrent().Remove(meshActor);
313 application.SendNotification();
314 application.Render();
316 // This should reduce connection count on material to zero, freeing the texture:
317 DALI_TEST_CHECK( textureTrace.FindMethod( "DeleteTextures" ) );
318 DALI_TEST_CHECK( glAbstraction.CheckTextureDeleted( 23 ) );
320 application.SendNotification();
321 application.Render();
323 // Mesh should be destroyed, reducing connection count on material to zero.
324 // This should also reduce connection count on image to zero, freeing it
325 DALI_TEST_EQUALS( material.GetOpacity(), 0.5f, 0.001f, TEST_LOCATION );
327 application.SendNotification();
328 application.Render();
330 // SceneGraph::Material & SceneGraph::RenderMaterial should be destroyed