1 #ifndef DALI_TOOLKIT_INTERNAL_OBJ_LOADER_H
2 #define DALI_TOOLKIT_INTERNAL_OBJ_LOADER_H
5 * Copyright (c) 2022 Samsung Electronics Co., Ltd.
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
22 #include <dali/public-api/rendering/renderer.h>
47 Vertex(const Vector3& position, const Vector3& normal, const Vector2& textureCoord)
63 VertexExt(const Vector3& tangent, const Vector3& binormal)
77 pointMin = Vector3(std::numeric_limits<float>::max(), std::numeric_limits<float>::max(), std::numeric_limits<float>::max());
78 pointMax = Vector3(std::numeric_limits<float>::min(), std::numeric_limits<float>::min(), std::numeric_limits<float>::min());
81 void ConsiderNewPointInVolume(const Vector3& position)
83 pointMin.x = std::min(position.x, pointMin.x);
84 pointMin.y = std::min(position.y, pointMin.y);
85 pointMin.z = std::min(position.z, pointMin.z);
87 pointMax.x = std::max(position.x, pointMax.x);
88 pointMax.y = std::max(position.y, pointMax.y);
89 pointMax.z = std::max(position.z, pointMax.z);
96 //Defines bit masks to declare which properties are needed by anyone requesting a geometry.
99 TEXTURE_COORDINATES = 1 << 0,
105 virtual ~ObjLoader();
107 bool IsSceneLoaded();
108 bool IsMaterialLoaded();
110 bool LoadObject(char* objBuffer, std::streampos fileSize);
112 void LoadMaterial(char* objBuffer, std::streampos fileSize, std::string& diffuseTextureUrl, std::string& normalTextureUrl, std::string& glossTextureUrl);
114 Geometry CreateGeometry(int objectProperties, bool useSoftNormals);
121 bool IsTexturePresent();
122 bool IsDiffuseMapPresent();
123 bool IsNormalMapPresent();
124 bool IsSpecularMapPresent();
127 BoundingVolume mSceneAABB;
130 bool mMaterialLoaded;
131 bool mHasTexturePoints;
133 //Material file properties.
136 bool mHasSpecularMap;
138 Dali::Vector<Vector3> mPoints;
139 Dali::Vector<Vector2> mTextures;
140 Dali::Vector<Vector2> mTextures2;
141 Dali::Vector<Vector3> mNormals;
142 Dali::Vector<Vector3> mTangents;
143 Dali::Vector<Vector3> mBiTangents;
144 Dali::Vector<TriIndex> mTriangles;
147 * @brief Calculates normals for each point on a per-face basis.
149 * There are multiple normals per point, each corresponding to the normal of a face connecting to the point.
151 * @param[in] vertices The vertices of the object.
152 * @param[in, out] triangles The triangles that form the faces. The normals of each triangle will be updated.
153 * @param[in, out] normals The normals to be calculated.
155 void CalculateHardFaceNormals(const Dali::Vector<Vector3>& vertices,
156 Dali::Vector<TriIndex>& triangles,
157 Dali::Vector<Vector3>& normals);
160 * @brief Calculates smoothed normals for each point.
162 * There is one normal per point, an average of the connecting faces.
164 * @param[in] vertices The vertices of the object.
165 * @param[in, out] triangles The triangles that form the faces. The normals of each triangle will be updated.
166 * @param[in, out] normals The normals to be calculated.
168 void CalculateSoftFaceNormals(const Dali::Vector<Vector3>& vertices,
169 Dali::Vector<TriIndex>& triangles,
170 Dali::Vector<Vector3>& normals);
173 * @brief Calculates tangents and bitangents for each point of the object.
175 * These are calculated using the object's points, texture coordinates and normals, so these must be initialised first.
177 void CalculateTangentFrame();
179 void CenterAndScale(bool center, Dali::Vector<Vector3>& points);
182 * @brief Using the data loaded from the file, create arrays of data to be used in creating the geometry.
184 * @param[in] vertices The vertices of the object.
185 * @param[in] textures The texture coordinates of the object.
186 * @param[in] verticesExt Extension to vertices, storing tangents and bitangents.
187 * @param[in] indices Indices of corresponding values to match triangles to their respective data.
188 * @param[in] useSoftNormals Indicates whether we should average the normals at each point to smooth the surface or not.
190 void CreateGeometryArray(Dali::Vector<Vertex>& vertices,
191 Dali::Vector<Vector2>& textures,
192 Dali::Vector<VertexExt>& verticesExt,
193 Dali::Vector<unsigned short>& indices,
194 bool useSoftNormals);
197 } // namespace Internal
199 } // namespace Toolkit
203 #endif // DALI_TOOLKIT_INTERNAL_OBJ_LOADER_H