#define DALI_TOOLKIT_INTERNAL_OBJ_LOADER_H
/*
- * Copyright (c) 2016 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.
namespace Dali
{
-
namespace Toolkit
{
-
class ObjLoader;
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;
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;
{
void Init()
{
- pointMin = Vector3( std::numeric_limits<float>::max(), std::numeric_limits<float>::max(), std::numeric_limits<float>::max() );
- pointMax = Vector3( std::numeric_limits<float>::min(), std::numeric_limits<float>::min(), std::numeric_limits<float>::min() );
+ pointMin = Vector3(std::numeric_limits<float>::max(), std::numeric_limits<float>::max(), std::numeric_limits<float>::max());
+ pointMax = Vector3(std::numeric_limits<float>::min(), std::numeric_limits<float>::min(), std::numeric_limits<float>::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;
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;
bool mHasNormalMap;
bool mHasSpecularMap;
- Dali::Vector<Vector3> mPoints;
- Dali::Vector<Vector2> mTextures;
- Dali::Vector<Vector2> mTextures2;
- Dali::Vector<Vector3> mNormals;
- Dali::Vector<Vector3> mTangents;
- Dali::Vector<Vector3> mBiTangents;
+ Dali::Vector<Vector3> mPoints;
+ Dali::Vector<Vector2> mTextures;
+ Dali::Vector<Vector2> mTextures2;
+ Dali::Vector<Vector3> mNormals;
+ Dali::Vector<Vector3> mTangents;
+ Dali::Vector<Vector3> mBiTangents;
Dali::Vector<TriIndex> mTriangles;
- void CalculateTangentArray( const Dali::Vector<Vector3>& vertex,
- const Dali::Vector<Vector2>& texcoord,
- Dali::Vector<TriIndex>& triangle,
- Dali::Vector<Vector3>& normal,
- Dali::Vector<Vector3>& tangent );
-
- void CenterAndScale( bool center, Dali::Vector<Vector3>& points );
-
-
- void CreateGeometryArray( Dali::Vector<Vertex> & vertices,
- Dali::Vector<Vector2> & textures,
- Dali::Vector<VertexExt> & verticesExt,
- Dali::Vector<unsigned short> & 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<Vector3>& vertices,
+ Dali::Vector<TriIndex>& triangles,
+ Dali::Vector<Vector3>& 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<Vector3>& vertices,
+ Dali::Vector<TriIndex>& triangles,
+ Dali::Vector<Vector3>& 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<Vector3>& 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<Vertex>& vertices,
+ Dali::Vector<Vector2>& textures,
+ Dali::Vector<VertexExt>& verticesExt,
+ Dali::Vector<unsigned short>& indices,
+ bool useSoftNormals);
};
-
-
} // namespace Internal
} // namespace Toolkit
} // namespace Dali
-
-
-
#endif // DALI_TOOLKIT_INTERNAL_OBJ_LOADER_H