X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=examples%2Freflection-demo%2Freflection-example.cpp;h=4f04401df71c7b5de5fd014373145ae2c28f83f0;hb=708a5e016f973900a20a885914d3b70741fa80d9;hp=0900d80f35d765394e5e516498dfd7085f92e740;hpb=8d7d6de46d7996e938db3846fa468b844302304a;p=platform%2Fcore%2Fuifw%2Fdali-demo.git diff --git a/examples/reflection-demo/reflection-example.cpp b/examples/reflection-demo/reflection-example.cpp index 0900d80..4f04401 100644 --- a/examples/reflection-demo/reflection-example.cpp +++ b/examples/reflection-demo/reflection-example.cpp @@ -24,7 +24,6 @@ #include "gltf-scene.h" using namespace Dali; -using Dali::Toolkit::TextLabel; namespace { @@ -167,6 +166,14 @@ struct Model Shader shader; Geometry geometry; }; +using ModelPtr = std::unique_ptr; + +using ActorContainer = std::vector; +using CameraContainer = std::vector; +using ModelContainer = std::vector; +using TextureSetContainer = std::vector; + +const Vector3 DEFAULT_LIGHT_DIRECTION( 0.5, 0.5, -1 ); template bool LoadFile( const std::string& filename, std::vector& bytes ) @@ -229,10 +236,11 @@ Shader CreateShader( const std::string& vsh, const std::string& fsh ) return Shader::New( std::string(vshShaderSource.data()), std::string(fshShaderSource.data()) ); } -std::unique_ptr CreateModel( glTF& gltf, - const glTF_Mesh* mesh, - const std::string& vertexShaderSource, - const std::string& fragmentShaderSource ) +ModelPtr CreateModel( + glTF& gltf, + const glTF_Mesh* mesh, + const std::string& vertexShaderSource, + const std::string& fragmentShaderSource ) { /* * Obtain interleaved buffer for first mesh with position and normal attributes @@ -262,7 +270,7 @@ std::unique_ptr CreateModel( glTF& gltf, auto indexBuffer = gltf.GetMeshIndexBuffer( mesh ); geometry.SetIndexBuffer( indexBuffer.data(), indexBuffer.size() ); geometry.SetType( Geometry::Type::TRIANGLES ); - std::unique_ptr retval( new Model() ); + ModelPtr retval( new Model() ); retval->shader = CreateShader( vertexShaderSource, fragmentShaderSource ); retval->geometry = geometry; return retval; @@ -275,6 +283,177 @@ void ReplaceShader( Actor& actor, const std::string& vsh, const std::string& fsh renderer.SetShader( shader ); } +void CreateTextureSetsFromGLTF( glTF* gltf, const std::string& basePath, TextureSetContainer& textureSets ) +{ + const auto& materials = gltf->GetMaterials(); + const auto& textures = gltf->GetTextures(); + + std::map textureCache{}; + + for(const auto& material : materials ) + { + TextureSet textureSet; + if(material.pbrMetallicRoughness.enabled) + { + textureSet = TextureSet::New(); + std::string filename( basePath ); + filename += '/'; + filename += textures[material.pbrMetallicRoughness.baseTextureColor.index].uri; + Dali::PixelData pixelData = Dali::Toolkit::SyncImageLoader::Load( filename ); + + auto cacheKey = textures[material.pbrMetallicRoughness.baseTextureColor.index].uri; + auto iter = textureCache.find(cacheKey); + Texture texture; + if(iter == textureCache.end()) + { + texture = Texture::New(TextureType::TEXTURE_2D, pixelData.GetPixelFormat(), pixelData.GetWidth(), + pixelData.GetHeight()); + texture.Upload(pixelData); + texture.GenerateMipmaps(); + textureCache[cacheKey] = texture; + } + else + { + texture = iter->second; + } + textureSet.SetTexture( 0, texture ); + Dali::Sampler sampler = Dali::Sampler::New(); + sampler.SetWrapMode( Dali::WrapMode::REPEAT, Dali::WrapMode::REPEAT, Dali::WrapMode::REPEAT ); + sampler.SetFilterMode( Dali::FilterMode::LINEAR_MIPMAP_LINEAR, Dali::FilterMode::LINEAR ); + textureSet.SetSampler( 0, sampler ); + } + textureSets.emplace_back( textureSet ); + } +} + + +/** + * Creates models from glTF + */ +void CreateModelsFromGLTF( glTF* gltf, ModelContainer& models ) +{ + const auto& meshes = gltf->GetMeshes(); + for( const auto& mesh : meshes ) + { + // change shader to use texture if material indicates that + if(mesh->material != 0xffffffff && gltf->GetMaterials()[mesh->material].pbrMetallicRoughness.enabled) + { + models.emplace_back( CreateModel( *gltf, mesh, VERTEX_SHADER, TEXTURED_FRAGMENT_SHADER ) ); + } + else + { + models.emplace_back( CreateModel( *gltf, mesh, VERTEX_SHADER, FRAGMENT_SHADER ) ); + } + } +} + +Actor CreateSceneFromGLTF( + Window window, + glTF* gltf, + ModelContainer& models, + ActorContainer& actors, + CameraContainer& cameras, + TextureSetContainer& textureSets ) +{ + const auto& nodes = gltf->GetNodes(); + + Vector3 cameraPosition; + + // for each node create nodes and children + // resolve parents later + actors.reserve( nodes.size() ); + for( const auto& node : nodes ) + { + auto actor = node.cameraId != 0xffffffff ? CameraActor::New( window.GetSize() ) : Actor::New(); + + actor.SetProperty( Actor::Property::SIZE, Vector3( 1, 1, 1 ) ); + actor.SetProperty( Dali::Actor::Property::NAME, node.name ); + actor.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER ); + actor.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER ); + actor.SetProperty( Actor::Property::POSITION, Vector3( node.translation[0], node.translation[1], node.translation[2] )); + actor.SetProperty( Actor::Property::SCALE, Vector3( node.scale[0], node.scale[1], node.scale[2] ) ); + actor.SetProperty( Actor::Property::ORIENTATION, Quaternion(node.rotationQuaternion[3], + node.rotationQuaternion[0], + node.rotationQuaternion[1], + node.rotationQuaternion[2])); + + actors.emplace_back( actor ); + + // Initially add each actor to the very first one + if(actors.size() > 1) + { + actors[0].Add(actor); + } + + // If mesh, create and add renderer + if(node.meshId != 0xffffffff) + { + const auto& model = models[node.meshId].get(); + auto renderer = Renderer::New( model->geometry, model->shader ); + + // if textured, add texture set + auto materialId = gltf->GetMeshes()[node.meshId]->material; + if( materialId != 0xffffffff ) + { + if( gltf->GetMaterials()[materialId].pbrMetallicRoughness.enabled ) + { + renderer.SetTextures( textureSets[materialId] ); + } + } + + actor.AddRenderer( renderer ); + } + + // Reset and attach main camera + if( node.cameraId != 0xffffffff ) + { + cameraPosition = Vector3(node.translation[0], node.translation[1], node.translation[2]); + auto quatY = Quaternion( Degree(180.0f), Vector3( 0.0, 1.0, 0.0) ); + auto cameraActor = CameraActor::DownCast( actor ); + cameraActor.SetProperty( Actor::Property::ORIENTATION, Quaternion(node.rotationQuaternion[3], + node.rotationQuaternion[0], + node.rotationQuaternion[1], + node.rotationQuaternion[2] ) + * quatY + ); + cameraActor.SetProjectionMode( Camera::PERSPECTIVE_PROJECTION ); + + const auto camera = gltf->GetCameras()[node.cameraId]; + cameraActor.SetNearClippingPlane( camera->znear ); + cameraActor.SetFarClippingPlane( camera->zfar ); + cameraActor.SetFieldOfView( camera->yfov ); + + cameraActor.SetProperty( CameraActor::Property::INVERT_Y_AXIS, true); + cameraActor.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER ); + cameraActor.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER ); + + cameras.emplace_back( cameraActor ); + } + } + + // Resolve hierarchy dependencies + auto i = 0u; + for( const auto& node : nodes ) + { + if(!node.children.empty()) + { + for(const auto& childId : node.children) + { + actors[i].Add( actors[childId+1] ); + } + } + ++i; + } + + for( auto& actor : actors ) + { + actor.RegisterProperty( "lightDir", DEFAULT_LIGHT_DIRECTION ); + actor.RegisterProperty( "eyePos", cameraPosition ); + } + + return actors[0]; +} + } // unnamed namespace // This example shows how to create and display mirrored reflection using CameraActor @@ -316,22 +495,21 @@ private: auto gltf = glTF(DEMO_GAME_DIR "/reflection"); // Define direction of light - mLightDir = Vector3( 0.5, 0.5, -1 ); /** * Instantiate texture sets */ - CreateTextureSetsFromGLTF( &gltf, DEMO_GAME_DIR ); + CreateTextureSetsFromGLTF( &gltf, DEMO_GAME_DIR, mTextureSets ); /** * Create models */ - CreateModelsFromGLTF( &gltf ); + CreateModelsFromGLTF( &gltf, mModels ); /** - * Create scene nodes + * Create scene nodes & add to 3D Layer */ - CreateSceneFromGLTF( window, &gltf ); + mLayer3D.Add( CreateSceneFromGLTF( window, &gltf, mModels, mActors, mCameras, mTextureSets ) ); auto planeActor = mLayer3D.FindChildByName( "Plane" ); auto solarActor = mLayer3D.FindChildByName( "solar_root" ); @@ -430,173 +608,6 @@ private: mTickTimer.Start(); } - void CreateSceneFromGLTF( Window window, glTF* gltf ) - { - const auto& nodes = gltf->GetNodes(); - - // for each node create nodes and children - // resolve parents later - std::vector actors; - actors.reserve( nodes.size() ); - for( const auto& node : nodes ) - { - auto actor = node.cameraId != 0xffffffff ? CameraActor::New( window.GetSize() ) : Actor::New(); - - actor.SetProperty( Actor::Property::SIZE, Vector3( 1, 1, 1 ) ); - actor.SetProperty( Dali::Actor::Property::NAME, node.name ); - actor.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER ); - actor.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER ); - actor.SetProperty( Actor::Property::POSITION, Vector3( node.translation[0], node.translation[1], node.translation[2] )); - actor.SetProperty( Actor::Property::SCALE, Vector3( node.scale[0], node.scale[1], node.scale[2] ) ); - actor.SetProperty( Actor::Property::ORIENTATION, Quaternion(node.rotationQuaternion[3], - node.rotationQuaternion[0], - node.rotationQuaternion[1], - node.rotationQuaternion[2])); - - actors.emplace_back( actor ); - - // Initially add each actor to the very first one - if(actors.size() > 1) - { - actors[0].Add(actor); - } - - // If mesh, create and add renderer - if(node.meshId != 0xffffffff) - { - const auto& model = mModels[node.meshId].get(); - auto renderer = Renderer::New( model->geometry, model->shader ); - - // if textured, add texture set - auto materialId = gltf->GetMeshes()[node.meshId]->material; - if( materialId != 0xffffffff ) - { - if( gltf->GetMaterials()[materialId].pbrMetallicRoughness.enabled ) - { - renderer.SetTextures( mTextureSets[materialId] ); - } - } - - actor.AddRenderer( renderer ); - } - - // Reset and attach main camera - if( node.cameraId != 0xffffffff ) - { - mCameraPos = Vector3(node.translation[0], node.translation[1], node.translation[2]); - auto quatY = Quaternion( Degree(180.0f), Vector3( 0.0, 1.0, 0.0) ); - auto cameraActor = CameraActor::DownCast( actor ); - cameraActor.SetProperty( Actor::Property::ORIENTATION, Quaternion(node.rotationQuaternion[3], - node.rotationQuaternion[0], - node.rotationQuaternion[1], - node.rotationQuaternion[2] ) - * quatY - ); - cameraActor.SetProjectionMode( Camera::PERSPECTIVE_PROJECTION ); - - const auto camera = gltf->GetCameras()[node.cameraId]; - cameraActor.SetNearClippingPlane( camera->znear ); - cameraActor.SetFarClippingPlane( camera->zfar ); - cameraActor.SetFieldOfView( camera->yfov ); - - cameraActor.SetProperty( CameraActor::Property::INVERT_Y_AXIS, true); - cameraActor.SetProperty( Actor::Property::ANCHOR_POINT, AnchorPoint::CENTER ); - cameraActor.SetProperty( Actor::Property::PARENT_ORIGIN, ParentOrigin::CENTER ); - - mCameras.emplace_back( cameraActor ); - } - } - - // Resolve hierarchy dependencies - auto i = 0u; - for( const auto& node : nodes ) - { - if(!node.children.empty()) - { - for(const auto& childId : node.children) - { - actors[i].Add( actors[childId+1] ); - } - } - ++i; - } - - mActors = std::move(actors); - - // Add root actor to the window - mLayer3D.Add( mActors[0] ); - - for( auto& actor : mActors ) - { - actor.RegisterProperty( "lightDir", mLightDir ); - actor.RegisterProperty( "eyePos", mCameraPos ); - } - - } - - /** - * Creates models from glTF - */ - void CreateModelsFromGLTF( glTF* gltf ) - { - const auto& meshes = gltf->GetMeshes(); - for( const auto& mesh : meshes ) - { - // change shader to use texture if material indicates that - if(mesh->material != 0xffffffff && gltf->GetMaterials()[mesh->material].pbrMetallicRoughness.enabled) - { - mModels.emplace_back( CreateModel( *gltf, mesh, VERTEX_SHADER, TEXTURED_FRAGMENT_SHADER ) ); - } - else - { - mModels.emplace_back( CreateModel( *gltf, mesh, VERTEX_SHADER, FRAGMENT_SHADER ) ); - } - } - } - - void CreateTextureSetsFromGLTF( glTF* gltf, const std::string& basePath ) - { - const auto& materials = gltf->GetMaterials(); - const auto& textures = gltf->GetTextures(); - - std::map textureCache{}; - - for(const auto& material : materials ) - { - TextureSet textureSet; - if(material.pbrMetallicRoughness.enabled) - { - textureSet = TextureSet::New(); - std::string filename( basePath ); - filename += '/'; - filename += textures[material.pbrMetallicRoughness.baseTextureColor.index].uri; - Dali::PixelData pixelData = Dali::Toolkit::SyncImageLoader::Load( filename ); - - auto cacheKey = textures[material.pbrMetallicRoughness.baseTextureColor.index].uri; - auto iter = textureCache.find(cacheKey); - Texture texture; - if(iter == textureCache.end()) - { - texture = Texture::New(TextureType::TEXTURE_2D, pixelData.GetPixelFormat(), pixelData.GetWidth(), - pixelData.GetHeight()); - texture.Upload(pixelData); - texture.GenerateMipmaps(); - textureCache[cacheKey] = texture; - } - else - { - texture = iter->second; - } - textureSet.SetTexture( 0, texture ); - Dali::Sampler sampler = Dali::Sampler::New(); - sampler.SetWrapMode( Dali::WrapMode::REPEAT, Dali::WrapMode::REPEAT, Dali::WrapMode::REPEAT ); - sampler.SetFilterMode( Dali::FilterMode::LINEAR_MIPMAP_LINEAR, Dali::FilterMode::LINEAR ); - textureSet.SetSampler( 0, sampler ); - } - mTextureSets.emplace_back( textureSet ); - } - } - void OnPan( Actor actor, const PanGesture& panGesture ) { auto displacement = panGesture.screenDisplacement; @@ -649,10 +660,10 @@ private: Layer mLayer3D{}; - std::vector mActors {}; - std::vector mCameras {}; - std::vector> mModels {}; - std::vector mTextureSets {}; + ActorContainer mActors {}; + CameraContainer mCameras {}; + ModelContainer mModels {}; + TextureSetContainer mTextureSets {}; Animation mAnimation {}; float mMockTime { 0.0f }; @@ -661,8 +672,6 @@ private: Property::Index mSunKFactorUniformIndex {}; PanGestureDetector mPanGestureDetector {}; - Vector3 mCameraPos { Vector3::ZERO }; - Vector3 mLightDir { Vector3::ZERO }; Timer mTickTimer {}; CameraActor mCamera3D {};