X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Fmodel3d-view%2Fmodel3d-view-impl.cpp;h=5b4990934cba635b84ffb416228a7f218eec10a2;hp=6d05a50f97d018b19fa2847b7d731a43247b569d;hb=f546dd5d83a968e573f8f053a01ce43df32c71a0;hpb=24d1c5037a28d3b8e9094dbb65630687e079705a diff --git a/dali-toolkit/internal/controls/model3d-view/model3d-view-impl.cpp b/dali-toolkit/internal/controls/model3d-view/model3d-view-impl.cpp index 6d05a50..5b49909 100644 --- a/dali-toolkit/internal/controls/model3d-view/model3d-view-impl.cpp +++ b/dali-toolkit/internal/controls/model3d-view/model3d-view-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2015 Samsung Electronics Co., Ltd. + * Copyright (c) 2020 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,13 +23,14 @@ #include #include #include -#include +#include #include -#include #include +#include // INTERNAL INCLUDES #include +#include namespace Dali { @@ -43,6 +44,34 @@ namespace Internal namespace { +// Texture indices are constants. +enum TextureIndex +{ + DIFFUSE_TEXTURE_INDEX, + NORMAL_TEXTURE_INDEX, + GLOSS_TEXTURE_INDEX +}; + +/** + * @brief Loads a texture from a file. + * @param[in] imageUrl The URL of the file + * @return A texture if loading succeeds, an empty handle otherwise + */ +Texture LoadTexture( const char* imageUrl ) +{ + Texture texture; + Devel::PixelBuffer pixelBuffer = LoadImageFromFile( imageUrl ); + if( pixelBuffer ) + { + texture = Texture::New( TextureType::TEXTURE_2D, pixelBuffer.GetPixelFormat(), pixelBuffer.GetWidth(), pixelBuffer.GetHeight() ); + PixelData pixelData = Devel::PixelBuffer::Convert( pixelBuffer ); + texture.Upload( pixelData ); + texture.GenerateMipmaps(); + } + + return texture; +} + // Type registration BaseHandle Create() { @@ -247,28 +276,9 @@ const char* NRMMAP_FRAGMENT_SHADER = MAKE_SHADER( using namespace Dali; -void LookAt(Matrix& result, const Vector3& eye, const Vector3& target, const Vector3& up) -{ - Vector3 vZ = target - eye; - vZ.Normalize(); - - Vector3 vX = up.Cross(vZ); - vX.Normalize(); - - Vector3 vY = vZ.Cross(vX); - vY.Normalize(); - - result.SetInverseTransformComponents(vX, vY, vZ, eye); -} - - Model3dView::Model3dView() - : Control( ControlBehaviour( ACTOR_BEHAVIOUR_NONE ) ) +: Control( ControlBehaviour( CONTROL_BEHAVIOUR_DEFAULT ) ) { - mTexture0Url = ""; - mTexture1Url = ""; - mTexture2Url = ""; - mIlluminationType = Toolkit::Model3dView::DIFFUSE_WITH_NORMAL_MAP; mCameraFOV = Math::PI_OVER_180 * 45.f; @@ -317,6 +327,7 @@ void Model3dView::SetProperty( BaseObject* object, Property::Index index, const { impl.LoadMaterial(); impl.CreateMaterial(); + impl.LoadTextures(); } break; } @@ -414,16 +425,14 @@ Property::Value Model3dView::GetProperty( BaseObject* object, Property::Index in ///////////////////////////////////////////////////////////// -void Model3dView::OnStageConnection( int depth ) +void Model3dView::OnSceneConnection( int depth ) { - Control::OnStageConnection( depth ); - CustomActor self = Self(); self.AddRenderer( mRenderer ); if( mObjLoader.IsSceneLoaded() ) { - mMesh = mObjLoader.CreateGeometry(mIlluminationType); + mMesh = mObjLoader.CreateGeometry( GetShaderProperties( mIlluminationType ), true ); CreateMaterial(); LoadTextures(); @@ -437,6 +446,8 @@ void Model3dView::OnStageConnection( int depth ) constraint.AddSource( Source( self, Toolkit::Model3dView::Property::LIGHT_POSITION ) ); constraint.Apply(); } + + Control::OnSceneConnection( depth ); } /////////////////////////////////////////////////////////// @@ -448,9 +459,13 @@ void Model3dView::OnInitialize() { //Create empty versions of the geometry and material so we always have a Renderer Geometry mesh = Geometry::New(); - Shader shader = Shader::New( SIMPLE_VERTEX_SHADER, SIMPLE_FRAGMENT_SHADER, (Shader::ShaderHints)(Shader::HINT_REQUIRES_SELF_DEPTH_TEST | Shader::HINT_MODIFIES_GEOMETRY) ); + Shader shader = Shader::New( SIMPLE_VERTEX_SHADER, SIMPLE_FRAGMENT_SHADER ); mRenderer = Renderer::New( mesh, shader ); + DevelControl::SetAccessibilityConstructor( Self(), []( Dali::Actor actor ) { + return std::unique_ptr< Dali::Accessibility::Accessible >( + new Control::Impl::AccessibleImpl( actor, Dali::Accessibility::Role::IMAGE ) ); + } ); } void Model3dView::LoadGeometry() @@ -462,9 +477,7 @@ void Model3dView::LoadGeometry() if (FileLoader::ReadFile(mObjUrl,fileSize,fileContent,FileLoader::TEXT)) { mObjLoader.ClearArrays(); - - std::string materialUrl; - mObjLoader.Load(fileContent.Begin(), fileSize, materialUrl); + mObjLoader.LoadObject(fileContent.Begin(), fileSize); //Get size information from the obj loaded mSceneCenter = mObjLoader.GetCenter(); @@ -520,11 +533,13 @@ void Model3dView::CreateGeometry() { if( mObjLoader.IsSceneLoaded() ) { - mMesh = mObjLoader.CreateGeometry(mIlluminationType); + mMesh = mObjLoader.CreateGeometry( GetShaderProperties( mIlluminationType ), true ); if( mRenderer ) { mRenderer.SetGeometry( mMesh ); + mRenderer.SetProperty( Renderer::Property::DEPTH_WRITE_MODE, DepthWriteMode::ON ); + mRenderer.SetProperty( Renderer::Property::DEPTH_TEST_MODE, DepthTestMode::ON ); } } } @@ -555,22 +570,23 @@ void Model3dView::CreateMaterial() { if( mObjLoader.IsMaterialLoaded() && (mTexture0Url != "") && mObjLoader.IsTexturePresent() ) { - if( (mTexture2Url != "") && (mTexture1Url != "") && (mIlluminationType == Toolkit::Model3dView::DIFFUSE_WITH_NORMAL_MAP) && mObjLoader.IsNormalMapPresent() ) + if( (mTexture2Url != "") && (mTexture1Url != "") && (mIlluminationType == Toolkit::Model3dView::DIFFUSE_WITH_NORMAL_MAP) ) { - mShader = Shader::New( NRMMAP_VERTEX_SHADER, NRMMAP_FRAGMENT_SHADER, (Shader::ShaderHints)(Shader::HINT_REQUIRES_SELF_DEPTH_TEST | Shader::HINT_MODIFIES_GEOMETRY) ); + mShader = Shader::New( NRMMAP_VERTEX_SHADER, NRMMAP_FRAGMENT_SHADER ); } - else if( mIlluminationType == Toolkit::Model3dView::DIFFUSE_WITH_TEXTURE ) + else if( mIlluminationType == Toolkit::Model3dView::DIFFUSE_WITH_TEXTURE || + mIlluminationType == Toolkit::Model3dView::DIFFUSE_WITH_NORMAL_MAP ) { - mShader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER, (Shader::ShaderHints)(Shader::HINT_REQUIRES_SELF_DEPTH_TEST | Shader::HINT_MODIFIES_GEOMETRY) ); + mShader = Shader::New( VERTEX_SHADER, FRAGMENT_SHADER ); } else { - mShader = Shader::New( SIMPLE_VERTEX_SHADER, SIMPLE_FRAGMENT_SHADER, (Shader::ShaderHints)(Shader::HINT_REQUIRES_SELF_DEPTH_TEST | Shader::HINT_MODIFIES_GEOMETRY) ); + mShader = Shader::New( SIMPLE_VERTEX_SHADER, SIMPLE_FRAGMENT_SHADER ); } } else { - mShader = Shader::New( SIMPLE_VERTEX_SHADER, SIMPLE_FRAGMENT_SHADER, (Shader::ShaderHints)(Shader::HINT_REQUIRES_SELF_DEPTH_TEST | Shader::HINT_MODIFIES_GEOMETRY) ); + mShader = Shader::New( SIMPLE_VERTEX_SHADER, SIMPLE_FRAGMENT_SHADER ); } mTextureSet = TextureSet::New(); @@ -579,7 +595,7 @@ void Model3dView::CreateMaterial() { mRenderer.SetTextures( mTextureSet ); mRenderer.SetShader( mShader ); - mRenderer.SetProperty( Renderer::Property::FACE_CULLING_MODE, Renderer::NONE); + mRenderer.SetProperty( Renderer::Property::FACE_CULLING_MODE, FaceCullingMode::BACK ); } UpdateShaderUniforms(); @@ -588,43 +604,74 @@ void Model3dView::CreateMaterial() void Model3dView::LoadTextures() { if( !mTextureSet ) - return ; + { + return; + } + + Sampler sampler = Sampler::New(); + sampler.SetFilterMode( FilterMode::LINEAR_MIPMAP_LINEAR, FilterMode::LINEAR_MIPMAP_LINEAR ); - if( mTexture0Url != "" ) + // Setup diffuse texture. + if( !mTexture0Url.empty() && ( mIlluminationType != Toolkit::Model3dView::DIFFUSE ) ) { - std::string imgUrl = mImagesUrl + mTexture0Url; + std::string imageUrl = mImagesUrl + mTexture0Url; //Load textures - Image tex0 = ResourceImage::New( imgUrl ); - if( tex0 ) + Texture diffuseTexture = LoadTexture( imageUrl.c_str() ); + if( diffuseTexture ) { - mTextureSet.SetImage( 0u, tex0 ); + mTextureSet.SetTexture( DIFFUSE_TEXTURE_INDEX, diffuseTexture ); + mTextureSet.SetSampler( DIFFUSE_TEXTURE_INDEX, sampler ); } } - if( (mTexture1Url != "") && (mIlluminationType == Toolkit::Model3dView::DIFFUSE_WITH_NORMAL_MAP) ) + if( mIlluminationType == Toolkit::Model3dView::DIFFUSE_WITH_NORMAL_MAP ) { - std::string imgUrl = mImagesUrl + mTexture1Url; + // Setup normal map texture. + if( !mTexture1Url.empty() ) + { + std::string imageUrl = mImagesUrl + mTexture1Url; - //Load textures - Image tex1 = ResourceImage::New( imgUrl ); - if (tex1) + //Load textures + Texture normalTexture = LoadTexture( imageUrl.c_str() ); + if( normalTexture ) + { + mTextureSet.SetTexture( NORMAL_TEXTURE_INDEX, normalTexture ); + mTextureSet.SetSampler( NORMAL_TEXTURE_INDEX, sampler ); + } + } + if( !mTexture2Url.empty() ) { - mTextureSet.SetImage( 1u, tex1 ); + // Setup gloss map texture. + std::string imageUrl = mImagesUrl + mTexture2Url; + + //Load textures + Texture glossTexture = LoadTexture( imageUrl.c_str() ); + if( glossTexture ) + { + mTextureSet.SetTexture( GLOSS_TEXTURE_INDEX, glossTexture ); + mTextureSet.SetSampler( GLOSS_TEXTURE_INDEX, sampler ); + } } } +} - if( (mTexture2Url != "") && (mIlluminationType == Toolkit::Model3dView::DIFFUSE_WITH_NORMAL_MAP) ) +int Model3dView::GetShaderProperties( Toolkit::Model3dView::IlluminationType illuminationType ) +{ + int objectProperties = 0; + + if( illuminationType == Toolkit::Model3dView::DIFFUSE_WITH_TEXTURE || + illuminationType == Toolkit::Model3dView::DIFFUSE_WITH_NORMAL_MAP ) { - std::string imgUrl = mImagesUrl + mTexture2Url; + objectProperties |= ObjLoader::TEXTURE_COORDINATES; + } - //Load textures - Image tex2 = ResourceImage::New( imgUrl ); - if( tex2 ) - { - mTextureSet.SetImage( 2u, tex2 ); - } + if( illuminationType == Toolkit::Model3dView::DIFFUSE_WITH_NORMAL_MAP ) + { + objectProperties |= ObjLoader::TANGENTS | ObjLoader::BINORMALS; } + + return objectProperties; } } // namespace Internal