X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Fcontrols%2Fmodel3d-view%2Fobj-loader.h;h=0f7019fe97189245562a88f1164f7247b9771d02;hb=7018f61b640b6fcf9cb576b537bafcb6bb8240e8;hp=a877bb96aff55d12646e196b4bebfae8ba3a31f5;hpb=4d4724513d345467aad5d6ff0ff103b191c32a3f;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-toolkit/internal/controls/model3d-view/obj-loader.h b/dali-toolkit/internal/controls/model3d-view/obj-loader.h index a877bb9..0f7019f 100644 --- a/dali-toolkit/internal/controls/model3d-view/obj-loader.h +++ b/dali-toolkit/internal/controls/model3d-view/obj-loader.h @@ -1,8 +1,8 @@ -#ifndef __DALI_TOOLKIT_INTERNAL_OBJ_LOADER_H__ -#define __DALI_TOOLKIT_INTERNAL_OBJ_LOADER_H__ +#ifndef DALI_TOOLKIT_INTERNAL_OBJ_LOADER_H +#define DALI_TOOLKIT_INTERNAL_OBJ_LOADER_H /* - * Copyright (c) 2015 Samsung Electronics Co., Ltd. + * Copyright (c) 2021 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. @@ -19,15 +19,13 @@ */ // EXTERNAL INCLUDES -#include +#include #include namespace Dali { - namespace Toolkit { - class ObjLoader; namespace Internal @@ -35,22 +33,24 @@ namespace Internal class ObjLoader { public: - struct TriIndex { - int pntIndex[3]; - int nrmIndex[3]; - int texIndex[3]; + int pointIndex[3]; + int normalIndex[3]; + int textureIndex[3]; }; struct Vertex { Vertex() - {} + { + } - Vertex( const Vector3& position, const Vector3& normal, const Vector2& textureCoord ) - : position( position ), normal( normal ) - {} + Vertex(const Vector3& position, const Vector3& normal, const Vector2& textureCoord) + : position(position), + normal(normal) + { + } Vector3 position; Vector3 normal; @@ -59,11 +59,14 @@ public: struct VertexExt { VertexExt() - {} + { + } - VertexExt( const Vector3& tangent, const Vector3& binormal ) - : tangent( tangent), bitangent( binormal ) - {} + VertexExt(const Vector3& tangent, const Vector3& binormal) + : tangent(tangent), + bitangent(binormal) + { + } Vector3 tangent; Vector3 bitangent; @@ -73,19 +76,19 @@ public: { void Init() { - pointMin = Vector3( std::numeric_limits::max(), std::numeric_limits::max(), std::numeric_limits::max() ); - pointMax = Vector3( std::numeric_limits::min(), std::numeric_limits::min(), std::numeric_limits::min() ); + pointMin = Vector3(std::numeric_limits::max(), std::numeric_limits::max(), std::numeric_limits::max()); + pointMax = Vector3(std::numeric_limits::min(), std::numeric_limits::min(), std::numeric_limits::min()); } - void ConsiderNewPointInVolume( const Vector3& position ) + void ConsiderNewPointInVolume(const Vector3& position) { - pointMin.x = std::min( position.x, pointMin.x ); - pointMin.y = std::min( position.y, pointMin.y ); - pointMin.z = std::min( position.z, pointMin.z ); + pointMin.x = std::min(position.x, pointMin.x); + pointMin.y = std::min(position.y, pointMin.y); + pointMin.z = std::min(position.z, pointMin.z); - pointMax.x = std::max( position.x, pointMax.x ); - pointMax.y = std::max( position.y, pointMax.y ); - pointMax.z = std::max( position.z, pointMax.z ); + pointMax.x = std::max(position.x, pointMax.x); + pointMax.y = std::max(position.y, pointMax.y); + pointMax.z = std::max(position.z, pointMax.z); } Vector3 pointMin; @@ -96,35 +99,33 @@ public: enum ObjectProperties { TEXTURE_COORDINATES = 1 << 0, - TANGENTS = 1 << 1, - BINORMALS = 1 << 2 + TANGENTS = 1 << 1, + BINORMALS = 1 << 2 }; ObjLoader(); virtual ~ObjLoader(); - bool IsSceneLoaded(); - bool IsMaterialLoaded(); + bool IsSceneLoaded(); + bool IsMaterialLoaded(); - bool LoadObject( char* objBuffer, std::streampos fileSize ); + bool LoadObject(char* objBuffer, std::streampos fileSize); - void LoadMaterial( char* objBuffer, std::streampos fileSize, std::string& diffuseTextureUrl, - std::string& normalTextureUrl, std::string& glossTextureUrl ); + void LoadMaterial(char* objBuffer, std::streampos fileSize, std::string& diffuseTextureUrl, std::string& normalTextureUrl, std::string& glossTextureUrl); - Geometry CreateGeometry( int objectProperties ); + Geometry CreateGeometry(int objectProperties, bool useSoftNormals); - Vector3 GetCenter(); - Vector3 GetSize(); + Vector3 GetCenter(); + Vector3 GetSize(); - void ClearArrays(); + void ClearArrays(); - bool IsTexturePresent(); - bool IsDiffuseMapPresent(); - bool IsNormalMapPresent(); - bool IsSpecularMapPresent(); + bool IsTexturePresent(); + bool IsDiffuseMapPresent(); + bool IsNormalMapPresent(); + bool IsSpecularMapPresent(); private: - BoundingVolume mSceneAABB; bool mSceneLoaded; @@ -136,39 +137,69 @@ private: bool mHasNormalMap; bool mHasSpecularMap; - Dali::Vector mPoints; - Dali::Vector mTextures; - Dali::Vector mTextures2; - Dali::Vector mNormals; - Dali::Vector mTangents; - Dali::Vector mBiTangents; + Dali::Vector mPoints; + Dali::Vector mTextures; + Dali::Vector mTextures2; + Dali::Vector mNormals; + Dali::Vector mTangents; + Dali::Vector mBiTangents; Dali::Vector mTriangles; - void CalculateTangentArray( const Dali::Vector& vertex, - const Dali::Vector& texcoord, - Dali::Vector& triangle, - Dali::Vector& normal, - Dali::Vector& tangent ); - - void CenterAndScale( bool center, Dali::Vector& points ); - - - void CreateGeometryArray( Dali::Vector & vertices, - Dali::Vector & textures, - Dali::Vector & verticesExt, - Dali::Vector & indices ); - + /** + * @brief Calculates normals for each point on a per-face basis. + * + * There are multiple normals per point, each corresponding to the normal of a face connecting to the point. + * + * @param[in] vertices The vertices of the object. + * @param[in, out] triangles The triangles that form the faces. The normals of each triangle will be updated. + * @param[in, out] normals The normals to be calculated. + */ + void CalculateHardFaceNormals(const Dali::Vector& vertices, + Dali::Vector& triangles, + Dali::Vector& normals); + + /** + * @brief Calculates smoothed normals for each point. + * + * There is one normal per point, an average of the connecting faces. + * + * @param[in] vertices The vertices of the object. + * @param[in, out] triangles The triangles that form the faces. The normals of each triangle will be updated. + * @param[in, out] normals The normals to be calculated. + */ + void CalculateSoftFaceNormals(const Dali::Vector& vertices, + Dali::Vector& triangles, + Dali::Vector& normals); + + /** + * @brief Calculates tangents and bitangents for each point of the object. + * + * These are calculated using the object's points, texture coordinates and normals, so these must be initialised first. + */ + void CalculateTangentFrame(); + + void CenterAndScale(bool center, Dali::Vector& points); + + /** + * @brief Using the data loaded from the file, create arrays of data to be used in creating the geometry. + * + * @param[in] vertices The vertices of the object. + * @param[in] textures The texture coordinates of the object. + * @param[in] verticesExt Extension to vertices, storing tangents and bitangents. + * @param[in] indices Indices of corresponding values to match triangles to their respective data. + * @param[in] useSoftNormals Indicates whether we should average the normals at each point to smooth the surface or not. + */ + void CreateGeometryArray(Dali::Vector& vertices, + Dali::Vector& textures, + Dali::Vector& verticesExt, + Dali::Vector& indices, + bool useSoftNormals); }; - - } // namespace Internal } // namespace Toolkit } // namespace Dali - - - -#endif // __DALI_TOOLKIT_INTERNAL_OBJ_LOADER_H__ +#endif // DALI_TOOLKIT_INTERNAL_OBJ_LOADER_H