Commit 08852f39e92948ae06e70c8ce2c65351a1308e40
[dali_1.2.48] Merge branch 'devel/master'
Change-Id: I3c31aed793ca79db87198c3e0fd6736b48e0137a
Showing
4 changed files
with
155 additions
and
139 deletions
examples/image-view/image-view-example.cpp
| @@ -15,9 +15,11 @@ | @@ -15,9 +15,11 @@ | ||
| 15 | * | 15 | * |
| 16 | */ | 16 | */ |
| 17 | 17 | ||
| 18 | +#include <string> | ||
| 18 | #include "shared/view.h" | 19 | #include "shared/view.h" |
| 19 | #include <dali/dali.h> | 20 | #include <dali/dali.h> |
| 20 | #include <dali-toolkit/dali-toolkit.h> | 21 | #include <dali-toolkit/dali-toolkit.h> |
| 22 | +#include <dali-toolkit/devel-api/controls/text-controls/text-label-devel.h> | ||
| 21 | 23 | ||
| 22 | using namespace Dali; | 24 | using namespace Dali; |
| 23 | 25 | ||
| @@ -29,16 +31,41 @@ const char* TOOLBAR_IMAGE( DEMO_IMAGE_DIR "top-bar.png" ); | @@ -29,16 +31,41 @@ const char* TOOLBAR_IMAGE( DEMO_IMAGE_DIR "top-bar.png" ); | ||
| 29 | const char* APPLICATION_TITLE( "Image view" ); | 31 | const char* APPLICATION_TITLE( "Image view" ); |
| 30 | 32 | ||
| 31 | const char* IMAGE_PATH[] = { | 33 | const char* IMAGE_PATH[] = { |
| 32 | - DEMO_IMAGE_DIR "blocks-ball.png", | ||
| 33 | DEMO_IMAGE_DIR "gallery-small-23.jpg", | 34 | DEMO_IMAGE_DIR "gallery-small-23.jpg", |
| 34 | - DEMO_IMAGE_DIR "selection-popup-bg.2.9.png", | 35 | + DEMO_IMAGE_DIR "woodEffect.jpg", |
| 35 | DEMO_IMAGE_DIR "heartsframe.9.png", | 36 | DEMO_IMAGE_DIR "heartsframe.9.png", |
| 37 | + DEMO_IMAGE_DIR "World.svg" | ||
| 36 | }; | 38 | }; |
| 37 | 39 | ||
| 38 | -const unsigned int NUM_IMAGES = sizeof(IMAGE_PATH) / sizeof(char*); | 40 | +const unsigned int NUMBER_OF_IMAGES = 3; |
| 39 | 41 | ||
| 40 | -const unsigned int COLUMNS = 3; | ||
| 41 | -const unsigned int ROWS = 4; | 42 | +enum CellPlacement |
| 43 | +{ | ||
| 44 | + TOP_BUTTON, | ||
| 45 | + LOWER_BUTTON, | ||
| 46 | + IMAGE, | ||
| 47 | + NUMBER_OF_ROWS | ||
| 48 | +}; | ||
| 49 | + | ||
| 50 | + | ||
| 51 | +unsigned int GetButtonIndex( Toolkit::Button button ) | ||
| 52 | +{ | ||
| 53 | + std::string buttonName = button.GetName(); | ||
| 54 | + unsigned int index = 0; | ||
| 55 | + | ||
| 56 | + if ( buttonName != "") | ||
| 57 | + { | ||
| 58 | + index = std::stoul( buttonName ); | ||
| 59 | + } | ||
| 60 | + | ||
| 61 | + return index; | ||
| 62 | +} | ||
| 63 | + | ||
| 64 | + | ||
| 65 | +const unsigned int NUMBER_OF_RESOURCES = sizeof(IMAGE_PATH) / sizeof(char*); | ||
| 66 | + | ||
| 67 | +std::string EXAMPLE_INSTRUCTIONS = "Instructions: Change button cycles through different image visuals, " | ||
| 68 | + "on/off takes the ImageView and it's current visual on or off stage."; | ||
| 42 | 69 | ||
| 43 | } // namespace | 70 | } // namespace |
| 44 | 71 | ||
| @@ -49,9 +76,7 @@ class ImageViewController: public ConnectionTracker | @@ -49,9 +76,7 @@ class ImageViewController: public ConnectionTracker | ||
| 49 | ImageViewController( Application& application ) | 76 | ImageViewController( Application& application ) |
| 50 | : mApplication( application ), | 77 | : mApplication( application ), |
| 51 | mCurrentPositionToggle( 0, 0 ), | 78 | mCurrentPositionToggle( 0, 0 ), |
| 52 | - mCurrentPositionImage( 0, 0 ), | ||
| 53 | - mToggleOff( true ), | ||
| 54 | - mImageIdx( 1 ) | 79 | + mCurrentPositionImage( 0, 0 ) |
| 55 | { | 80 | { |
| 56 | // Connect to the Application's Init signal | 81 | // Connect to the Application's Init signal |
| 57 | mApplication.InitSignal().Connect( this, &ImageViewController::Create ); | 82 | mApplication.InitSignal().Connect( this, &ImageViewController::Create ); |
| @@ -76,109 +101,99 @@ class ImageViewController: public ConnectionTracker | @@ -76,109 +101,99 @@ class ImageViewController: public ConnectionTracker | ||
| 76 | APPLICATION_TITLE ); | 101 | APPLICATION_TITLE ); |
| 77 | 102 | ||
| 78 | 103 | ||
| 79 | - mTable = Toolkit::TableView::New( ROWS, COLUMNS ); | 104 | + // Create a table view to show a pair of buttons above each image. |
| 105 | + mTable = Toolkit::TableView::New( CellPlacement::NUMBER_OF_ROWS, NUMBER_OF_IMAGES ); | ||
| 80 | mTable.SetAnchorPoint( AnchorPoint::CENTER ); | 106 | mTable.SetAnchorPoint( AnchorPoint::CENTER ); |
| 81 | mTable.SetParentOrigin( ParentOrigin::CENTER ); | 107 | mTable.SetParentOrigin( ParentOrigin::CENTER ); |
| 82 | - mTable.SetResizePolicy( ResizePolicy::SIZE_FIXED_OFFSET_FROM_PARENT, Dimension::ALL_DIMENSIONS ); | ||
| 83 | - Vector3 offset( -50.0f, -350.0f, 0.0f ); | 108 | + mTable.SetResizePolicy( ResizePolicy::SIZE_RELATIVE_TO_PARENT, Dimension::ALL_DIMENSIONS ); |
| 109 | + Vector3 offset( 0.9f, 0.70f, 0.0f ); | ||
| 84 | mTable.SetSizeModeFactor( offset ); | 110 | mTable.SetSizeModeFactor( offset ); |
| 85 | - | 111 | + mTable.SetFitHeight(CellPlacement::TOP_BUTTON); |
| 112 | + mTable.SetFitHeight(CellPlacement::LOWER_BUTTON); | ||
| 86 | mContentLayer.Add( mTable ); | 113 | mContentLayer.Add( mTable ); |
| 87 | 114 | ||
| 88 | - for( unsigned int y = 0; y < ROWS; ++y ) | ||
| 89 | - { | ||
| 90 | - for( unsigned int x = 0; x < COLUMNS; ++x ) | ||
| 91 | - { | ||
| 92 | - mImageViews[x][y] = Toolkit::ImageView::New( IMAGE_PATH[ 0 ] ); | ||
| 93 | - mImageViews[x][y].SetParentOrigin( ParentOrigin::CENTER ); | ||
| 94 | - mImageViews[x][y].SetAnchorPoint( AnchorPoint::CENTER ); | ||
| 95 | - mImageViews[x][y].SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS ); | 115 | + Toolkit::TextLabel instructions = Toolkit::TextLabel::New( EXAMPLE_INSTRUCTIONS ); |
| 116 | + instructions.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH ); | ||
| 117 | + instructions.SetParentOrigin(ParentOrigin::BOTTOM_CENTER); | ||
| 118 | + instructions.SetY(-50.0f); | ||
| 119 | + instructions.SetProperty( Toolkit::TextLabel::Property::ENABLE_AUTO_SCROLL, true ); | ||
| 120 | + instructions.SetProperty( Toolkit::TextLabel::Property::AUTO_SCROLL_LOOP_COUNT, 10 ); | ||
| 121 | + mContentLayer.Add(instructions); | ||
| 96 | 122 | ||
| 97 | - mTable.AddChild( mImageViews[x][y], Toolkit::TableView::CellPosition( y, x ) ); | ||
| 98 | - } | 123 | + for( unsigned int x = 0; x < NUMBER_OF_IMAGES; x++ ) |
| 124 | + { | ||
| 125 | + Toolkit::PushButton button = Toolkit::PushButton::New(); | ||
| 126 | + button.SetProperty( Toolkit::Button::Property::LABEL, "on/off" ); | ||
| 127 | + button.SetParentOrigin( ParentOrigin::TOP_CENTER ); | ||
| 128 | + button.SetAnchorPoint( AnchorPoint::TOP_CENTER ); | ||
| 129 | + button.ClickedSignal().Connect( this, &ImageViewController::ToggleImageOnStage ); | ||
| 130 | + button.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH ); | ||
| 131 | + button.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::HEIGHT ); | ||
| 132 | + std::string s = std::to_string(x); | ||
| 133 | + button.SetName( s ); | ||
| 134 | + mTable.AddChild( button, Toolkit::TableView::CellPosition( CellPlacement::TOP_BUTTON, x ) ); | ||
| 135 | + | ||
| 136 | + Toolkit::PushButton button2 = Toolkit::PushButton::New(); | ||
| 137 | + button2.SetProperty( Toolkit::Button::Property::LABEL, "Change" ); | ||
| 138 | + button2.SetParentOrigin( ParentOrigin::BOTTOM_CENTER ); | ||
| 139 | + button2.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER ); | ||
| 140 | + button2.ClickedSignal().Connect( this, &ImageViewController::ChangeImageClicked ); | ||
| 141 | + button2.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH ); | ||
| 142 | + button2.SetResizePolicy( ResizePolicy::USE_NATURAL_SIZE, Dimension::HEIGHT ); | ||
| 143 | + button2.SetName( s ); | ||
| 144 | + mTable.AddChild( button2, Toolkit::TableView::CellPosition( CellPlacement::LOWER_BUTTON, x ) ); | ||
| 145 | + | ||
| 146 | + mImageViews[x] = Toolkit::ImageView::New( IMAGE_PATH[ 0 ] ); | ||
| 147 | + mImageViews[x].SetParentOrigin( ParentOrigin::CENTER ); | ||
| 148 | + mImageViews[x].SetAnchorPoint( AnchorPoint::CENTER ); | ||
| 149 | + mImageViews[x].SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::ALL_DIMENSIONS ); | ||
| 150 | + mTable.AddChild( mImageViews[x], Toolkit::TableView::CellPosition( CellPlacement::IMAGE, x ) ); | ||
| 151 | + | ||
| 152 | + // Set changeable counter and toggle for each ImageView | ||
| 153 | + mImageViewImageIndexStatus[x] = true; | ||
| 154 | + mImageViewToggleStatus[x] = true; | ||
| 99 | } | 155 | } |
| 100 | 156 | ||
| 101 | - Toolkit::TableView buttonsTable = Toolkit::TableView::New( 3, 1 ); | ||
| 102 | - buttonsTable.SetAnchorPoint( AnchorPoint::BOTTOM_CENTER ); | ||
| 103 | - buttonsTable.SetParentOrigin( ParentOrigin::BOTTOM_CENTER ); | ||
| 104 | - buttonsTable.SetFitHeight( 0 ); | ||
| 105 | - buttonsTable.SetFitHeight( 1 ); | ||
| 106 | - buttonsTable.SetFitHeight( 2 ); | ||
| 107 | - buttonsTable.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH ); | ||
| 108 | - | ||
| 109 | - Toolkit::PushButton button = Toolkit::PushButton::New(); | ||
| 110 | - button.SetProperty( Toolkit::Button::Property::LABEL, "Toggle on/off stage" ); | ||
| 111 | - button.SetParentOrigin( ParentOrigin::CENTER ); | ||
| 112 | - button.SetAnchorPoint( AnchorPoint::CENTER ); | ||
| 113 | - button.ClickedSignal().Connect( this, &ImageViewController::ToggleImageOnStage ); | ||
| 114 | - button.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH ); | ||
| 115 | - buttonsTable.AddChild( button, Toolkit::TableView::CellPosition( 0, 0 ) ); | ||
| 116 | - | ||
| 117 | - Toolkit::PushButton button2 = Toolkit::PushButton::New(); | ||
| 118 | - button2.SetProperty( Toolkit::Button::Property::LABEL, "Change Image" ); | ||
| 119 | - button2.SetParentOrigin( ParentOrigin::CENTER ); | ||
| 120 | - button2.SetAnchorPoint( AnchorPoint::CENTER ); | ||
| 121 | - button2.ClickedSignal().Connect( this, &ImageViewController::ChangeImageClicked ); | ||
| 122 | - button2.SetResizePolicy( ResizePolicy::FILL_TO_PARENT, Dimension::WIDTH ); | ||
| 123 | - buttonsTable.AddChild( button2, Toolkit::TableView::CellPosition( 1, 0 ) ); | ||
| 124 | - | ||
| 125 | - mContentLayer.Add(buttonsTable); | ||
| 126 | - | ||
| 127 | Stage::GetCurrent().KeyEventSignal().Connect(this, &ImageViewController::OnKeyEvent); | 157 | Stage::GetCurrent().KeyEventSignal().Connect(this, &ImageViewController::OnKeyEvent); |
| 128 | } | 158 | } |
| 129 | 159 | ||
| 130 | private: | 160 | private: |
| 161 | + | ||
| 131 | bool ToggleImageOnStage( Toolkit::Button button ) | 162 | bool ToggleImageOnStage( Toolkit::Button button ) |
| 132 | { | 163 | { |
| 133 | - Toolkit::ImageView imageView = mImageViews[ mCurrentPositionToggle.columnIndex ][ mCurrentPositionToggle.rowIndex ]; | 164 | + unsigned int buttonIndex = GetButtonIndex( button ); |
| 134 | 165 | ||
| 135 | - if( mToggleOff ) | 166 | + Toolkit::ImageView imageView = mImageViews[ buttonIndex ]; |
| 167 | + | ||
| 168 | + if( mImageViewToggleStatus[ buttonIndex ] ) | ||
| 136 | { | 169 | { |
| 137 | imageView.Unparent(); | 170 | imageView.Unparent(); |
| 138 | } | 171 | } |
| 139 | else | 172 | else |
| 140 | { | 173 | { |
| 141 | - mTable.AddChild( imageView, mCurrentPositionToggle ); | 174 | + mTable.AddChild( imageView, Toolkit::TableView::CellPosition( 2, GetButtonIndex( button ) ) ); |
| 142 | } | 175 | } |
| 143 | 176 | ||
| 144 | - ++mCurrentPositionToggle.columnIndex; | ||
| 145 | - if( mCurrentPositionToggle.columnIndex == COLUMNS ) | ||
| 146 | - { | ||
| 147 | - mCurrentPositionToggle.columnIndex = 0; | ||
| 148 | - ++mCurrentPositionToggle.rowIndex; | ||
| 149 | - } | ||
| 150 | - if( mCurrentPositionToggle.rowIndex == ROWS ) | ||
| 151 | - { | ||
| 152 | - mCurrentPositionToggle.rowIndex = 0; | ||
| 153 | - mToggleOff = !mToggleOff; | ||
| 154 | - } | 177 | + mImageViewToggleStatus[ buttonIndex ] = !mImageViewToggleStatus[ buttonIndex ]; |
| 155 | 178 | ||
| 156 | return true; | 179 | return true; |
| 157 | } | 180 | } |
| 158 | 181 | ||
| 159 | bool ChangeImageClicked( Toolkit::Button button ) | 182 | bool ChangeImageClicked( Toolkit::Button button ) |
| 160 | { | 183 | { |
| 161 | - Toolkit::ImageView imageView = mImageViews[ mCurrentPositionImage.columnIndex ][ mCurrentPositionImage.rowIndex ]; | ||
| 162 | - | ||
| 163 | - imageView.SetImage( IMAGE_PATH[ mImageIdx ] ); | 184 | + unsigned int buttonIndex = GetButtonIndex( button ); |
| 164 | 185 | ||
| 165 | - ++mCurrentPositionImage.columnIndex; | ||
| 166 | - if( mCurrentPositionImage.columnIndex == COLUMNS ) | ||
| 167 | - { | ||
| 168 | - mCurrentPositionImage.columnIndex = 0; | ||
| 169 | - ++mCurrentPositionImage.rowIndex; | ||
| 170 | - } | ||
| 171 | - if( mCurrentPositionImage.rowIndex == ROWS ) | 186 | + if ( mImageViews[buttonIndex].OnStage() ) |
| 172 | { | 187 | { |
| 173 | - mCurrentPositionImage.rowIndex = 0; | ||
| 174 | - ++mImageIdx; | 188 | + mImageViews[buttonIndex].SetImage( IMAGE_PATH[ mImageViewImageIndexStatus[buttonIndex] ] ); |
| 175 | 189 | ||
| 176 | - if( mImageIdx == NUM_IMAGES ) | 190 | + ++mImageViewImageIndexStatus[buttonIndex]; |
| 191 | + | ||
| 192 | + if( mImageViewImageIndexStatus[buttonIndex] == NUMBER_OF_RESOURCES ) | ||
| 177 | { | 193 | { |
| 178 | - mImageIdx = 0; | 194 | + mImageViewImageIndexStatus[buttonIndex] = 0; |
| 179 | } | 195 | } |
| 180 | } | 196 | } |
| 181 | - | ||
| 182 | return true; | 197 | return true; |
| 183 | } | 198 | } |
| 184 | 199 | ||
| @@ -203,14 +218,13 @@ private: | @@ -203,14 +218,13 @@ private: | ||
| 203 | Toolkit::ToolBar mToolBar; ///< The View's Toolbar. | 218 | Toolkit::ToolBar mToolBar; ///< The View's Toolbar. |
| 204 | Layer mContentLayer; ///< Content layer | 219 | Layer mContentLayer; ///< Content layer |
| 205 | Toolkit::TableView mTable; | 220 | Toolkit::TableView mTable; |
| 206 | - Toolkit::ImageView mImageViews[ COLUMNS ][ ROWS ]; | 221 | + Toolkit::ImageView mImageViews[ NUMBER_OF_IMAGES ]; |
| 222 | + bool mImageViewToggleStatus[ NUMBER_OF_IMAGES ]; | ||
| 223 | + unsigned int mImageViewImageIndexStatus[ NUMBER_OF_IMAGES ]; | ||
| 207 | 224 | ||
| 208 | Toolkit::TableView::CellPosition mCurrentPositionToggle; | 225 | Toolkit::TableView::CellPosition mCurrentPositionToggle; |
| 209 | Toolkit::TableView::CellPosition mCurrentPositionImage; | 226 | Toolkit::TableView::CellPosition mCurrentPositionImage; |
| 210 | 227 | ||
| 211 | - bool mToggleOff; | ||
| 212 | - int mImageIdx; | ||
| 213 | - | ||
| 214 | }; | 228 | }; |
| 215 | 229 | ||
| 216 | void RunTest( Application& application ) | 230 | void RunTest( Application& application ) |
examples/rendering-basic-pbr/obj-loader.cpp
| @@ -20,7 +20,6 @@ | @@ -20,7 +20,6 @@ | ||
| 20 | 20 | ||
| 21 | // EXTERNAL INCLUDES | 21 | // EXTERNAL INCLUDES |
| 22 | #include <dali/integration-api/debug.h> | 22 | #include <dali/integration-api/debug.h> |
| 23 | -#include <string> | ||
| 24 | #include <sstream> | 23 | #include <sstream> |
| 25 | #include <string.h> | 24 | #include <string.h> |
| 26 | 25 | ||
| @@ -35,7 +34,7 @@ const int MAX_POINT_INDICES = 4; | @@ -35,7 +34,7 @@ const int MAX_POINT_INDICES = 4; | ||
| 35 | ObjLoader::ObjLoader() | 34 | ObjLoader::ObjLoader() |
| 36 | : mSceneLoaded( false ), | 35 | : mSceneLoaded( false ), |
| 37 | mMaterialLoaded( false ), | 36 | mMaterialLoaded( false ), |
| 38 | - mHasTexturePoints( false ), | 37 | + mHasTextureUv( false ), |
| 39 | mHasDiffuseMap( false ), | 38 | mHasDiffuseMap( false ), |
| 40 | mHasNormalMap( false ), | 39 | mHasNormalMap( false ), |
| 41 | mHasSpecularMap( false ) | 40 | mHasSpecularMap( false ) |
| @@ -58,10 +57,10 @@ bool ObjLoader::IsMaterialLoaded() | @@ -58,10 +57,10 @@ bool ObjLoader::IsMaterialLoaded() | ||
| 58 | return mMaterialLoaded; | 57 | return mMaterialLoaded; |
| 59 | } | 58 | } |
| 60 | 59 | ||
| 61 | -void ObjLoader::CalculateHardFaceNormals( const Dali::Vector<Vector3>& vertices, Dali::Vector<TriIndex>& triangles, | 60 | +void ObjLoader::CalculateHardFaceNormals( const Dali::Vector<Vector3>& points, Dali::Vector<TriIndex>& triangles, |
| 62 | Dali::Vector<Vector3>& normals ) | 61 | Dali::Vector<Vector3>& normals ) |
| 63 | { | 62 | { |
| 64 | - int numFaceVertices = 3 * triangles.Size(); //Vertex per face, as each point has different normals for each face. | 63 | + int numFaceVertices = 3 * triangles.Size(); //Vertices per face, as each vertex has different normals instance for each face. |
| 65 | int normalIndex = 0; //Tracks progress through the array of normals. | 64 | int normalIndex = 0; //Tracks progress through the array of normals. |
| 66 | 65 | ||
| 67 | normals.Clear(); | 66 | normals.Clear(); |
| @@ -71,19 +70,19 @@ void ObjLoader::CalculateHardFaceNormals( const Dali::Vector<Vector3>& vertices, | @@ -71,19 +70,19 @@ void ObjLoader::CalculateHardFaceNormals( const Dali::Vector<Vector3>& vertices, | ||
| 71 | for( unsigned long i = 0; i < triangles.Size(); i++ ) | 70 | for( unsigned long i = 0; i < triangles.Size(); i++ ) |
| 72 | { | 71 | { |
| 73 | //Triangle vertices. | 72 | //Triangle vertices. |
| 74 | - const Vector3& v0 = vertices[triangles[i].pointIndex[0]]; | ||
| 75 | - const Vector3& v1 = vertices[triangles[i].pointIndex[1]]; | ||
| 76 | - const Vector3& v2 = vertices[triangles[i].pointIndex[2]]; | 73 | + const Vector3& v0 = points[triangles[i].pointIndex[0]]; |
| 74 | + const Vector3& v1 = points[triangles[i].pointIndex[1]]; | ||
| 75 | + const Vector3& v2 = points[triangles[i].pointIndex[2]]; | ||
| 77 | 76 | ||
| 78 | //Triangle edges. | 77 | //Triangle edges. |
| 79 | Vector3 edge1 = v1 - v0; | 78 | Vector3 edge1 = v1 - v0; |
| 80 | Vector3 edge2 = v2 - v0; | 79 | Vector3 edge2 = v2 - v0; |
| 81 | 80 | ||
| 82 | - //Using edges as vectors on the plane, cross to get the normal. | 81 | + //Using edges as vectors on the plane, cross product to get the normal. |
| 83 | Vector3 normalVector = edge1.Cross(edge2); | 82 | Vector3 normalVector = edge1.Cross(edge2); |
| 84 | normalVector.Normalize(); | 83 | normalVector.Normalize(); |
| 85 | 84 | ||
| 86 | - //Assign normals to points. | 85 | + //Assign normal index to triangle vertex and set the normal vector to the list of normals. |
| 87 | for( unsigned long j = 0; j < 3; j++, normalIndex++ ) | 86 | for( unsigned long j = 0; j < 3; j++, normalIndex++ ) |
| 88 | { | 87 | { |
| 89 | triangles[i].normalIndex[j] = normalIndex; | 88 | triangles[i].normalIndex[j] = normalIndex; |
| @@ -92,22 +91,22 @@ void ObjLoader::CalculateHardFaceNormals( const Dali::Vector<Vector3>& vertices, | @@ -92,22 +91,22 @@ void ObjLoader::CalculateHardFaceNormals( const Dali::Vector<Vector3>& vertices, | ||
| 92 | } | 91 | } |
| 93 | } | 92 | } |
| 94 | 93 | ||
| 95 | -void ObjLoader::CalculateSoftFaceNormals( const Dali::Vector<Vector3>& vertices, Dali::Vector<TriIndex>& triangles, | 94 | +void ObjLoader::CalculateSoftFaceNormals( const Dali::Vector<Vector3>& points, Dali::Vector<TriIndex>& triangles, |
| 96 | Dali::Vector<Vector3>& normals ) | 95 | Dali::Vector<Vector3>& normals ) |
| 97 | { | 96 | { |
| 98 | int normalIndex = 0; //Tracks progress through the array of normals. | 97 | int normalIndex = 0; //Tracks progress through the array of normals. |
| 99 | 98 | ||
| 100 | normals.Clear(); | 99 | normals.Clear(); |
| 101 | - normals.Resize( vertices.Size() ); //One (averaged) normal per point. | 100 | + normals.Resize( points.Size() ); //One (averaged) normal per point. |
| 102 | 101 | ||
| 103 | //For each triangle, calculate the normal by crossing two vectors on the triangle's plane | 102 | //For each triangle, calculate the normal by crossing two vectors on the triangle's plane |
| 104 | //We then add the triangle's normal to the cumulative normals at each point of it | 103 | //We then add the triangle's normal to the cumulative normals at each point of it |
| 105 | for( unsigned long i = 0; i < triangles.Size(); i++ ) | 104 | for( unsigned long i = 0; i < triangles.Size(); i++ ) |
| 106 | { | 105 | { |
| 107 | - //Triangle vertices. | ||
| 108 | - const Vector3& v0 = vertices[triangles[i].pointIndex[0]]; | ||
| 109 | - const Vector3& v1 = vertices[triangles[i].pointIndex[1]]; | ||
| 110 | - const Vector3& v2 = vertices[triangles[i].pointIndex[2]]; | 106 | + //Triangle points. |
| 107 | + const Vector3& v0 = points[triangles[i].pointIndex[0]]; | ||
| 108 | + const Vector3& v1 = points[triangles[i].pointIndex[1]]; | ||
| 109 | + const Vector3& v2 = points[triangles[i].pointIndex[2]]; | ||
| 111 | 110 | ||
| 112 | //Triangle edges. | 111 | //Triangle edges. |
| 113 | Vector3 edge1 = v1 - v0; | 112 | Vector3 edge1 = v1 - v0; |
| @@ -116,11 +115,12 @@ void ObjLoader::CalculateSoftFaceNormals( const Dali::Vector<Vector3>& vertices, | @@ -116,11 +115,12 @@ void ObjLoader::CalculateSoftFaceNormals( const Dali::Vector<Vector3>& vertices, | ||
| 116 | //Using edges as vectors on the plane, cross to get the normal. | 115 | //Using edges as vectors on the plane, cross to get the normal. |
| 117 | Vector3 normalVector = edge1.Cross(edge2); | 116 | Vector3 normalVector = edge1.Cross(edge2); |
| 118 | 117 | ||
| 119 | - //Add this triangle's normal to the cumulative normal of each constituent point and set the index of the normal accordingly. | ||
| 120 | - for( unsigned long j = 0; j < 3; j++, normalIndex++ ) | 118 | + //Add this triangle's normal to the cumulative normal of each constituent triangle point and set the index of the normal accordingly. |
| 119 | + for( unsigned long j = 0; j < 3; j++) | ||
| 121 | { | 120 | { |
| 122 | - triangles[i].normalIndex[j] = triangles[i].pointIndex[j]; //Normal index matches up to vertex index, as one normal per vertex. | ||
| 123 | - normals[triangles[i].normalIndex[j]] += normalVector; | 121 | + normalIndex = triangles[i].pointIndex[j]; |
| 122 | + triangles[i].normalIndex[j] = normalIndex; //Normal index matches up to vertex index, as one normal per vertex. | ||
| 123 | + normals[normalIndex] += normalVector; | ||
| 124 | } | 124 | } |
| 125 | } | 125 | } |
| 126 | 126 | ||
| @@ -135,9 +135,9 @@ void ObjLoader::CalculateTangentFrame() | @@ -135,9 +135,9 @@ void ObjLoader::CalculateTangentFrame() | ||
| 135 | { | 135 | { |
| 136 | //Reset tangent vector to hold new values. | 136 | //Reset tangent vector to hold new values. |
| 137 | mTangents.Clear(); | 137 | mTangents.Clear(); |
| 138 | - mTangents.Resize( mPoints.Size() ); | 138 | + mTangents.Resize( mNormals.Size() ); |
| 139 | 139 | ||
| 140 | - //For each triangle, calculate the tangent vector and then add it to the total tangent vector of each point. | 140 | + //For each triangle, calculate the tangent vector and then add it to the total tangent vector of each normal. |
| 141 | for ( unsigned long a = 0; a < mTriangles.Size(); a++ ) | 141 | for ( unsigned long a = 0; a < mTriangles.Size(); a++ ) |
| 142 | { | 142 | { |
| 143 | Vector3 tangentVector; | 143 | Vector3 tangentVector; |
| @@ -149,27 +149,29 @@ void ObjLoader::CalculateTangentFrame() | @@ -149,27 +149,29 @@ void ObjLoader::CalculateTangentFrame() | ||
| 149 | Vector3 edge1 = v1 - v0; | 149 | Vector3 edge1 = v1 - v0; |
| 150 | Vector3 edge2 = v2 - v0; | 150 | Vector3 edge2 = v2 - v0; |
| 151 | 151 | ||
| 152 | - const Vector2& w0 = mTextures[mTriangles[a].textureIndex[0]]; | ||
| 153 | - const Vector2& w1 = mTextures[mTriangles[a].textureIndex[1]]; | ||
| 154 | - const Vector2& w2 = mTextures[mTriangles[a].textureIndex[2]]; | 152 | + const Vector2& w0 = mTextureUv[mTriangles[a].textureIndex[0]]; |
| 153 | + const Vector2& w1 = mTextureUv[mTriangles[a].textureIndex[1]]; | ||
| 154 | + const Vector2& w2 = mTextureUv[mTriangles[a].textureIndex[2]]; | ||
| 155 | 155 | ||
| 156 | float deltaU1 = w1.x - w0.x; | 156 | float deltaU1 = w1.x - w0.x; |
| 157 | float deltaV1 = w1.y - w0.y; | 157 | float deltaV1 = w1.y - w0.y; |
| 158 | float deltaU2 = w2.x - w0.x; | 158 | float deltaU2 = w2.x - w0.x; |
| 159 | float deltaV2 = w2.y - w0.y; | 159 | float deltaV2 = w2.y - w0.y; |
| 160 | 160 | ||
| 161 | - float f = 1.0f / (deltaU1 * deltaV2 - deltaU2 * deltaV1); | 161 | + // 1.0/f could cause division by zero in some cases, this factor will act |
| 162 | + // as a weight of the tangent vector and it is fixed when it is normalised. | ||
| 163 | + float f = (deltaU1 * deltaV2 - deltaU2 * deltaV1); | ||
| 162 | 164 | ||
| 163 | tangentVector.x = f * ( deltaV2 * edge1.x - deltaV1 * edge2.x ); | 165 | tangentVector.x = f * ( deltaV2 * edge1.x - deltaV1 * edge2.x ); |
| 164 | tangentVector.y = f * ( deltaV2 * edge1.y - deltaV1 * edge2.y ); | 166 | tangentVector.y = f * ( deltaV2 * edge1.y - deltaV1 * edge2.y ); |
| 165 | tangentVector.z = f * ( deltaV2 * edge1.z - deltaV1 * edge2.z ); | 167 | tangentVector.z = f * ( deltaV2 * edge1.z - deltaV1 * edge2.z ); |
| 166 | 168 | ||
| 167 | - mTangents[mTriangles[a].pointIndex[0]] += tangentVector; | ||
| 168 | - mTangents[mTriangles[a].pointIndex[1]] += tangentVector; | ||
| 169 | - mTangents[mTriangles[a].pointIndex[2]] += tangentVector; | 169 | + mTangents[mTriangles[a].normalIndex[0]] += tangentVector; |
| 170 | + mTangents[mTriangles[a].normalIndex[1]] += tangentVector; | ||
| 171 | + mTangents[mTriangles[a].normalIndex[2]] += tangentVector; | ||
| 170 | } | 172 | } |
| 171 | 173 | ||
| 172 | - //Orthogonalize tangents and set binormals. | 174 | + //Orthogonalize tangents. |
| 173 | for ( unsigned long a = 0; a < mTangents.Size(); a++ ) | 175 | for ( unsigned long a = 0; a < mTangents.Size(); a++ ) |
| 174 | { | 176 | { |
| 175 | const Vector3& n = mNormals[a]; | 177 | const Vector3& n = mNormals[a]; |
| @@ -219,14 +221,15 @@ void ObjLoader::CreateGeometryArray( Dali::Vector<Vector3>& positions, | @@ -219,14 +221,15 @@ void ObjLoader::CreateGeometryArray( Dali::Vector<Vector3>& positions, | ||
| 219 | bool mustCalculateTangents = ( mTangents.Size() == 0 ) || ( mTangents.Size() != mNormals.Size() ); | 221 | bool mustCalculateTangents = ( mTangents.Size() == 0 ) || ( mTangents.Size() != mNormals.Size() ); |
| 220 | 222 | ||
| 221 | //However, we don't need to do this if the object doesn't use textures to begin with. | 223 | //However, we don't need to do this if the object doesn't use textures to begin with. |
| 222 | - mustCalculateTangents &= mHasTexturePoints; | 224 | + mustCalculateTangents &= mHasTextureUv; |
| 223 | 225 | ||
| 224 | - //We also have to recalculate the normals if we need to calculate tangents, | ||
| 225 | - // as we need just one normal, tangent per vertex, rather than the supplied per-face vertices. | ||
| 226 | - //Alternatively, we need to calculate the normals if there weren't any to begin with. | ||
| 227 | - if( mNormals.Size() == 0 || mustCalculateTangents ) | 226 | + // We calculate the normals if hard normals(flat normals) is set. |
| 227 | + // Use the normals provided by the file to make the tangent calculation per normal, | ||
| 228 | + // the correct results depends of normal generated by file, otherwise we need to recalculate | ||
| 229 | + // the normal programmatically. | ||
| 230 | + if( ( ( mNormals.Size() == 0 ) && mustCalculateTangents ) || !useSoftNormals ) | ||
| 228 | { | 231 | { |
| 229 | - if( useSoftNormals || mustCalculateTangents ) | 232 | + if( useSoftNormals ) |
| 230 | { | 233 | { |
| 231 | CalculateSoftFaceNormals( mPoints, mTriangles, mNormals ); | 234 | CalculateSoftFaceNormals( mPoints, mTriangles, mNormals ); |
| 232 | } | 235 | } |
| @@ -236,16 +239,16 @@ void ObjLoader::CreateGeometryArray( Dali::Vector<Vector3>& positions, | @@ -236,16 +239,16 @@ void ObjLoader::CreateGeometryArray( Dali::Vector<Vector3>& positions, | ||
| 236 | } | 239 | } |
| 237 | } | 240 | } |
| 238 | 241 | ||
| 239 | - if( mHasTexturePoints && mustCalculateTangents ) | 242 | + if( mHasTextureUv && mustCalculateTangents ) |
| 240 | { | 243 | { |
| 241 | CalculateTangentFrame(); | 244 | CalculateTangentFrame(); |
| 242 | } | 245 | } |
| 243 | 246 | ||
| 244 | - bool mapsCorrespond; //True if the sizes of the arrays necessary for the object agree. | 247 | + bool mapsCorrespond; //True if the sizes of the arrays necessary to draw the object match. |
| 245 | 248 | ||
| 246 | - if ( mHasTexturePoints ) | 249 | + if ( mHasTextureUv ) |
| 247 | { | 250 | { |
| 248 | - mapsCorrespond = ( mPoints.Size() == mTextures.Size() ) && ( mTextures.Size() == mNormals.Size() ); | 251 | + mapsCorrespond = ( mPoints.Size() == mTextureUv.Size() ) && ( mTextureUv.Size() == mNormals.Size() ); |
| 249 | } | 252 | } |
| 250 | else | 253 | else |
| 251 | { | 254 | { |
| @@ -278,9 +281,9 @@ void ObjLoader::CreateGeometryArray( Dali::Vector<Vector3>& positions, | @@ -278,9 +281,9 @@ void ObjLoader::CreateGeometryArray( Dali::Vector<Vector3>& positions, | ||
| 278 | 281 | ||
| 279 | normals[mTriangles[ui].pointIndex[j]] = mNormals[mTriangles[ui].normalIndex[j]]; | 282 | normals[mTriangles[ui].pointIndex[j]] = mNormals[mTriangles[ui].normalIndex[j]]; |
| 280 | 283 | ||
| 281 | - if ( mHasTexturePoints ) | 284 | + if ( mHasTextureUv ) |
| 282 | { | 285 | { |
| 283 | - textures[mTriangles[ui].pointIndex[j]] = mTextures[mTriangles[ui].textureIndex[j]]; | 286 | + textures[mTriangles[ui].pointIndex[j]] = mTextureUv[mTriangles[ui].textureIndex[j]]; |
| 284 | tangents[mTriangles[ui].pointIndex[j]] = mTangents[mTriangles[ui].normalIndex[j]]; | 287 | tangents[mTriangles[ui].pointIndex[j]] = mTangents[mTriangles[ui].normalIndex[j]]; |
| 285 | } | 288 | } |
| 286 | } | 289 | } |
| @@ -304,9 +307,9 @@ void ObjLoader::CreateGeometryArray( Dali::Vector<Vector3>& positions, | @@ -304,9 +307,9 @@ void ObjLoader::CreateGeometryArray( Dali::Vector<Vector3>& positions, | ||
| 304 | positions[index] = mPoints[mTriangles[ui].pointIndex[j]]; | 307 | positions[index] = mPoints[mTriangles[ui].pointIndex[j]]; |
| 305 | normals[index] = mNormals[mTriangles[ui].normalIndex[j]]; | 308 | normals[index] = mNormals[mTriangles[ui].normalIndex[j]]; |
| 306 | 309 | ||
| 307 | - if( mHasTexturePoints ) | 310 | + if( mHasTextureUv ) |
| 308 | { | 311 | { |
| 309 | - textures[index] = mTextures[mTriangles[ui].textureIndex[j]]; | 312 | + textures[index] = mTextureUv[mTriangles[ui].textureIndex[j]]; |
| 310 | tangents[index] = mTangents[mTriangles[ui].normalIndex[j]]; | 313 | tangents[index] = mTangents[mTriangles[ui].normalIndex[j]]; |
| 311 | } | 314 | } |
| 312 | 315 | ||
| @@ -335,7 +338,7 @@ bool ObjLoader::LoadObject( char* objBuffer, std::streampos fileSize ) | @@ -335,7 +338,7 @@ bool ObjLoader::LoadObject( char* objBuffer, std::streampos fileSize ) | ||
| 335 | 338 | ||
| 336 | std::string strMatActual; | 339 | std::string strMatActual; |
| 337 | 340 | ||
| 338 | - std::string input = objBuffer; | 341 | + std::string input( objBuffer, fileSize ); |
| 339 | std::istringstream ss(input); | 342 | std::istringstream ss(input); |
| 340 | ss.imbue( std::locale( "C" ) ); | 343 | ss.imbue( std::locale( "C" ) ); |
| 341 | 344 | ||
| @@ -388,9 +391,8 @@ bool ObjLoader::LoadObject( char* objBuffer, std::streampos fileSize ) | @@ -388,9 +391,8 @@ bool ObjLoader::LoadObject( char* objBuffer, std::streampos fileSize ) | ||
| 388 | { | 391 | { |
| 389 | isline >> texture.x; | 392 | isline >> texture.x; |
| 390 | isline >> texture.y; | 393 | isline >> texture.y; |
| 391 | - | ||
| 392 | texture.y = 1.0-texture.y; | 394 | texture.y = 1.0-texture.y; |
| 393 | - mTextures.PushBack( texture ); | 395 | + mTextureUv.PushBack( texture ); |
| 394 | } | 396 | } |
| 395 | else if ( tag == "#_#vt1" ) | 397 | else if ( tag == "#_#vt1" ) |
| 396 | { | 398 | { |
| @@ -398,7 +400,7 @@ bool ObjLoader::LoadObject( char* objBuffer, std::streampos fileSize ) | @@ -398,7 +400,7 @@ bool ObjLoader::LoadObject( char* objBuffer, std::streampos fileSize ) | ||
| 398 | isline >> texture.y; | 400 | isline >> texture.y; |
| 399 | 401 | ||
| 400 | texture.y = 1.0-texture.y; | 402 | texture.y = 1.0-texture.y; |
| 401 | - mTextures2.PushBack( texture ); | 403 | + mTextureUv2.PushBack( texture ); |
| 402 | } | 404 | } |
| 403 | else if ( tag == "s" ) | 405 | else if ( tag == "s" ) |
| 404 | { | 406 | { |
| @@ -413,7 +415,7 @@ bool ObjLoader::LoadObject( char* objBuffer, std::streampos fileSize ) | @@ -413,7 +415,7 @@ bool ObjLoader::LoadObject( char* objBuffer, std::streampos fileSize ) | ||
| 413 | } | 415 | } |
| 414 | 416 | ||
| 415 | int numIndices = 0; | 417 | int numIndices = 0; |
| 416 | - while( isline >> vet[numIndices] && numIndices < MAX_POINT_INDICES ) | 418 | + while( ( numIndices < MAX_POINT_INDICES ) && ( isline >> vet[numIndices] ) ) |
| 417 | { | 419 | { |
| 418 | numIndices++; | 420 | numIndices++; |
| 419 | } | 421 | } |
| @@ -523,7 +525,7 @@ bool ObjLoader::LoadObject( char* objBuffer, std::streampos fileSize ) | @@ -523,7 +525,7 @@ bool ObjLoader::LoadObject( char* objBuffer, std::streampos fileSize ) | ||
| 523 | { | 525 | { |
| 524 | CenterAndScale( true, mPoints ); | 526 | CenterAndScale( true, mPoints ); |
| 525 | mSceneLoaded = true; | 527 | mSceneLoaded = true; |
| 526 | - mHasTexturePoints = hasTexture; | 528 | + mHasTextureUv = hasTexture; |
| 527 | return true; | 529 | return true; |
| 528 | } | 530 | } |
| 529 | 531 | ||
| @@ -627,7 +629,7 @@ Geometry ObjLoader::CreateGeometry( int objectProperties, bool useSoftNormals ) | @@ -627,7 +629,7 @@ Geometry ObjLoader::CreateGeometry( int objectProperties, bool useSoftNormals ) | ||
| 627 | surface.AddVertexBuffer( normalBuffer ); | 629 | surface.AddVertexBuffer( normalBuffer ); |
| 628 | 630 | ||
| 629 | //Some need tangent | 631 | //Some need tangent |
| 630 | - if( ( objectProperties & TANGENTS ) && mHasTexturePoints ) | 632 | + if( ( objectProperties & TANGENTS ) && mHasTextureUv ) |
| 631 | { | 633 | { |
| 632 | Property::Map tangentMap; | 634 | Property::Map tangentMap; |
| 633 | tangentMap["aTangent"] = Property::VECTOR3; | 635 | tangentMap["aTangent"] = Property::VECTOR3; |
| @@ -638,7 +640,7 @@ Geometry ObjLoader::CreateGeometry( int objectProperties, bool useSoftNormals ) | @@ -638,7 +640,7 @@ Geometry ObjLoader::CreateGeometry( int objectProperties, bool useSoftNormals ) | ||
| 638 | } | 640 | } |
| 639 | 641 | ||
| 640 | //Some need texture coordinates | 642 | //Some need texture coordinates |
| 641 | - if( ( objectProperties & TEXTURE_COORDINATES ) && mHasTexturePoints ) | 643 | + if( ( objectProperties & TEXTURE_COORDINATES ) && mHasTextureUv ) |
| 642 | { | 644 | { |
| 643 | Property::Map textCoordMap; | 645 | Property::Map textCoordMap; |
| 644 | textCoordMap["aTexCoord"] = Property::VECTOR2; | 646 | textCoordMap["aTexCoord"] = Property::VECTOR2; |
| @@ -672,8 +674,8 @@ Vector3 ObjLoader::GetSize() | @@ -672,8 +674,8 @@ Vector3 ObjLoader::GetSize() | ||
| 672 | void ObjLoader::ClearArrays() | 674 | void ObjLoader::ClearArrays() |
| 673 | { | 675 | { |
| 674 | mPoints.Clear(); | 676 | mPoints.Clear(); |
| 675 | - mTextures.Clear(); | ||
| 676 | - mTextures2.Clear(); | 677 | + mTextureUv.Clear(); |
| 678 | + mTextureUv2.Clear(); | ||
| 677 | mNormals.Clear(); | 679 | mNormals.Clear(); |
| 678 | mTangents.Clear(); | 680 | mTangents.Clear(); |
| 679 | mBiTangents.Clear(); | 681 | mBiTangents.Clear(); |
| @@ -685,7 +687,7 @@ void ObjLoader::ClearArrays() | @@ -685,7 +687,7 @@ void ObjLoader::ClearArrays() | ||
| 685 | 687 | ||
| 686 | bool ObjLoader::IsTexturePresent() | 688 | bool ObjLoader::IsTexturePresent() |
| 687 | { | 689 | { |
| 688 | - return mHasTexturePoints; | 690 | + return mHasTextureUv; |
| 689 | } | 691 | } |
| 690 | 692 | ||
| 691 | bool ObjLoader::IsDiffuseMapPresent() | 693 | bool ObjLoader::IsDiffuseMapPresent() |
examples/rendering-basic-pbr/obj-loader.h
| @@ -95,8 +95,8 @@ public: | @@ -95,8 +95,8 @@ public: | ||
| 95 | private: | 95 | private: |
| 96 | 96 | ||
| 97 | Dali::Vector<Vector3> mPoints; | 97 | Dali::Vector<Vector3> mPoints; |
| 98 | - Dali::Vector<Vector2> mTextures; | ||
| 99 | - Dali::Vector<Vector2> mTextures2; | 98 | + Dali::Vector<Vector2> mTextureUv; |
| 99 | + Dali::Vector<Vector2> mTextureUv2; | ||
| 100 | Dali::Vector<Vector3> mNormals; | 100 | Dali::Vector<Vector3> mNormals; |
| 101 | Dali::Vector<Vector3> mTangents; | 101 | Dali::Vector<Vector3> mTangents; |
| 102 | Dali::Vector<Vector3> mBiTangents; | 102 | Dali::Vector<Vector3> mBiTangents; |
| @@ -106,7 +106,7 @@ private: | @@ -106,7 +106,7 @@ private: | ||
| 106 | 106 | ||
| 107 | bool mSceneLoaded; | 107 | bool mSceneLoaded; |
| 108 | bool mMaterialLoaded; | 108 | bool mMaterialLoaded; |
| 109 | - bool mHasTexturePoints; | 109 | + bool mHasTextureUv; |
| 110 | 110 | ||
| 111 | //Material file properties. | 111 | //Material file properties. |
| 112 | bool mHasDiffuseMap; | 112 | bool mHasDiffuseMap; |
packaging/com.samsung.dali-demo.spec
| @@ -2,7 +2,7 @@ | @@ -2,7 +2,7 @@ | ||
| 2 | 2 | ||
| 3 | Name: com.samsung.dali-demo | 3 | Name: com.samsung.dali-demo |
| 4 | Summary: The OpenGLES Canvas Core Demo | 4 | Summary: The OpenGLES Canvas Core Demo |
| 5 | -Version: 1.2.47 | 5 | +Version: 1.2.48 |
| 6 | Release: 1 | 6 | Release: 1 |
| 7 | Group: System/Libraries | 7 | Group: System/Libraries |
| 8 | License: Apache-2.0 | 8 | License: Apache-2.0 |