2 * Copyright (c) 2018 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 "scene-impl.h"
22 #include <dali/integration-api/debug.h>
34 : Control( ControlBehaviour( CONTROL_BEHAVIOUR_DEFAULT ) ),
35 mRoot( Actor::New() ),
36 mDefaultCamera( CameraActor::New() ),
37 mLightType( Toolkit::Scene::LightType::NONE ),
38 mLightVector( Vector3::ONE ),
39 mLightColor( Vector3::ONE )
47 Toolkit::Scene Scene::New( const std::string& filePath )
49 Scene* impl = new Scene();
51 Dali::Toolkit::Scene handle = Dali::Toolkit::Scene( *impl );
53 // Second-phase init of the implementation
54 // This can only be done after the CustomActor connection has been made...
56 impl->CreateScene( filePath );
61 Toolkit::Scene Scene::New( const std::string& filePath, const std::string& diffuseTexturePath, const std::string& specularTexturePath, Vector4 ScaleFactor )
63 Scene* impl = new Scene();
65 Dali::Toolkit::Scene handle = Dali::Toolkit::Scene( *impl );
67 // Second-phase init of the implementation
68 // This can only be done after the CustomActor connection has been made...
70 impl->SetCubeMap( diffuseTexturePath, specularTexturePath, ScaleFactor );
71 impl->CreateScene( filePath );
76 bool Scene::CreateScene( const std::string& filePath )
78 if( std::string::npos != filePath.rfind( GLTF_EXT ) )
80 Internal::GltfLoader gltfloader;
81 return( gltfloader.LoadScene( filePath, *this ) );
87 uint32_t Scene::GetAnimationCount()
89 return mAnimationArray.size();
92 bool Scene::PlayAnimation( uint32_t index )
94 if( GetAnimationCount() <= index )
99 mAnimationArray[index].Play();
103 bool Scene::PlayAnimations()
105 if( GetAnimationCount() == 0 )
110 for( unsigned int i=0; i<mAnimationArray.size(); ++i )
118 bool Scene::SetLight( Toolkit::Scene::LightType type, Vector3 lightVector, Vector3 lightColor )
120 if( type > Toolkit::Scene::LightType::DIRECTIONAL_LIGHT )
125 mLightType = static_cast<Toolkit::Scene::LightType>(
126 ( mLightType >= Toolkit::Scene::LightType::IMAGE_BASED_LIGHT ) ?
127 Toolkit::Scene::LightType::IMAGE_BASED_LIGHT + type :
130 mLightVector = lightVector;
131 mLightColor = lightColor;
133 for( unsigned int i = 0; i<mShaderArray.size(); ++i )
135 mShaderArray[i].RegisterProperty( "uLightType", ( GetLightType() & ~Toolkit::Scene::LightType::IMAGE_BASED_LIGHT ) );
136 mShaderArray[i].RegisterProperty( "uLightVector", lightVector );
137 mShaderArray[i].RegisterProperty( "uLightColor", lightColor );
143 unsigned char* Scene::CropBuffer( unsigned char* sourceBuffer, unsigned int bytesPerPixel, unsigned int width, unsigned int height, unsigned int xOffset, unsigned int yOffset, unsigned int xFaceSize, unsigned int yFaceSize )
145 unsigned int byteSize = bytesPerPixel * xFaceSize * yFaceSize;
146 unsigned char* destBuffer = reinterpret_cast<unsigned char*>( malloc( byteSize + 4u ) );
148 int srcStride = width * bytesPerPixel;
149 int destStride = xFaceSize * bytesPerPixel;
150 int srcOffset = xOffset * bytesPerPixel + yOffset * srcStride;
152 for( uint16_t row = yOffset; row < yOffset + yFaceSize; ++row )
154 memcpy( destBuffer + destOffset, sourceBuffer + srcOffset, destStride );
155 srcOffset += srcStride;
156 destOffset += destStride;
162 void Scene::UploadTextureFace( Texture& texture, Devel::PixelBuffer pixelBuffer, int faceIndex )
164 unsigned char* imageBuffer = pixelBuffer.GetBuffer();
165 unsigned int bytesPerPixel = Pixel::GetBytesPerPixel( pixelBuffer.GetPixelFormat() );
166 unsigned int imageWidth = pixelBuffer.GetWidth();
167 unsigned int imageHeight = pixelBuffer.GetHeight();
169 CubeType cubeType = ( imageWidth / 4 == imageHeight / 3 ) ? CROSS_HORIZENTAL :
170 ( ( imageWidth / 6 == imageHeight ) ? ARRAY_HORIZENTAL : NONE );
173 if( cubeType == CROSS_HORIZENTAL )
175 faceSize = imageWidth / 4;
177 else if( cubeType == ARRAY_HORIZENTAL )
179 faceSize = imageWidth / 6;
186 unsigned int xOffset = cubeMap_index_x[cubeType][faceIndex] * faceSize;
187 unsigned int yOffset = cubeMap_index_y[cubeType][faceIndex] * faceSize;
189 unsigned char* tempImageBuffer = CropBuffer( imageBuffer, bytesPerPixel, imageWidth, imageHeight, xOffset, yOffset, faceSize, faceSize );
190 PixelData pixelData = PixelData::New( tempImageBuffer, faceSize * faceSize * bytesPerPixel, faceSize, faceSize, pixelBuffer.GetPixelFormat(), PixelData::FREE );
191 texture.Upload( pixelData, CubeMapLayer::POSITIVE_X + faceIndex, 0, 0, 0, faceSize, faceSize );
194 void Scene::SetCubeMap( const std::string& diffuseTexturePath, const std::string& specularTexturePath, Vector4 ScaleFactor )
196 mLightType = Toolkit::Scene::LightType::IMAGE_BASED_LIGHT;
199 std::string imageBrdfUrl = DALI_IMAGE_DIR "brdfLUT.png";
200 mBRDFTexture = LoadTexture( imageBrdfUrl.c_str(), true );
207 Devel::PixelBuffer diffusePixelBuffer = LoadImageFromFile( diffuseTexturePath );
208 int diffuseFaceSize = diffusePixelBuffer.GetWidth() / 4;
209 mDiffuseTexture = Texture::New( TextureType::TEXTURE_CUBE, diffusePixelBuffer.GetPixelFormat(), diffuseFaceSize, diffuseFaceSize );
210 for( int i = 0; i<6; ++i )
212 UploadTextureFace( mDiffuseTexture, diffusePixelBuffer, i );
214 mDiffuseTexture.GenerateMipmaps();
217 Devel::PixelBuffer specularPixelBuffer = LoadImageFromFile( specularTexturePath );
218 int specularFaceSize = specularPixelBuffer.GetWidth() / 4;
219 mSpecularTexture = Texture::New( TextureType::TEXTURE_CUBE, specularPixelBuffer.GetPixelFormat(), specularFaceSize, specularFaceSize );
220 for( int i = 0; i<6; ++i )
222 UploadTextureFace( mSpecularTexture, specularPixelBuffer, i );
224 mSpecularTexture.GenerateMipmaps();
226 mIBLScaleFactor = ScaleFactor;
229 bool Scene::SetDefaultCamera( const Dali::Camera::Type type, const float nearPlane, const Vector3 cameraPosition )
231 mDefaultCamera.SetParentOrigin( ParentOrigin::CENTER );
232 mDefaultCamera.SetAnchorPoint( AnchorPoint::CENTER );
233 mDefaultCamera.SetType( type );
234 mDefaultCamera.SetNearClippingPlane( nearPlane );
235 mDefaultCamera.SetPosition( cameraPosition );
239 void Scene::AddCamera( CameraActor& cameraActor )
241 mCameraActorArray.push_back( cameraActor );
244 void Scene::AddAnimation( Animation& animation )
246 mAnimationArray.push_back( animation );
249 void Scene::AddShader( Shader shader )
251 mShaderArray.push_back( shader );
254 Actor Scene::GetRoot()
259 CameraActor Scene::GetDefaultCamera()
261 return mDefaultCamera;
264 CameraActor Scene::GetCamera( const int cameraIndex )
266 if( cameraIndex < 0 )
268 return GetDefaultCamera();
270 return mCameraActorArray[cameraIndex];
273 Toolkit::Scene::LightType Scene::GetLightType()
278 Vector3 Scene::GetLightVector()
283 Vector3 Scene::GetLightColor()
288 Vector4 Scene::GetIBLScaleFactor()
290 return mIBLScaleFactor;
293 Texture Scene::GetBRDFTexture()
298 Texture Scene::GetSpecularTexture()
300 return mSpecularTexture;
303 Texture Scene::GetDiffuseTexture()
305 return mDiffuseTexture;
308 Texture Scene::LoadTexture( const char *imageUrl, bool generateMipmaps )
312 Devel::PixelBuffer pixelBuffer = LoadImageFromFile( imageUrl );
315 texture = Texture::New( TextureType::TEXTURE_2D, pixelBuffer.GetPixelFormat(), pixelBuffer.GetWidth(), pixelBuffer.GetHeight() );
316 PixelData pixelData = Devel::PixelBuffer::Convert( pixelBuffer );
317 texture.Upload( pixelData );
319 if( generateMipmaps )
321 texture.GenerateMipmaps();
328 void Scene::OnInitialize()
330 mRoot.SetParentOrigin( ParentOrigin::CENTER );
331 mRoot.SetAnchorPoint( AnchorPoint::CENTER );
333 Layer layer = Layer::New();
334 layer.SetBehavior( Layer::LAYER_3D );
335 layer.SetParentOrigin( ParentOrigin::CENTER );
336 layer.SetAnchorPoint( AnchorPoint::CENTER );
340 // Apply some default resizing rules.
341 self.SetParentOrigin( ParentOrigin::CENTER );
342 self.SetAnchorPoint( AnchorPoint::CENTER );
345 mShaderArray.clear();
346 mCameraActorArray.clear();
347 mAnimationArray.clear();
350 }//namespace Internal