151 if (triangles.size() == 0)
154 glm::vec3 e1, e2, no;
156 std::vector<size_t> count_normals;
158 for (
size_t i=0; i<vertices.size(); i++)
160 vertices[i].normal = glm::vec3(0.0);
161 count_normals.push_back(0);
164 for (
size_t i=0; i<triangles.size(); i++)
166 const glm::ivec3& face = triangles[i];
168 V& va = vertices[face[0]];
169 V& vb = vertices[face[1]];
170 V& vc = vertices[face[2]];
172 e1 = vb.position - va.position;
173 e2 = vc.position - va.position;
175 no = glm::cross(e1, e2);
181 count_normals[face[0]]++;
182 count_normals[face[1]]++;
183 count_normals[face[2]]++;
186 for (
size_t i=0; i<vertices.size(); i++)
188 if (count_normals[i] > 0)
189 vertices[i].normal = glm::normalize(vertices[i].normal / (
float)count_normals[i]);
222 SMikkTSpaceInterface callbacks
224 .m_getNumFaces = [] (
const SMikkTSpaceContext * pContext) ->
int
227 const std::vector<glm::uvec3>& triangles = data->
triangles;
229 return triangles.size();
232 .m_getNumVerticesOfFace = [] (
const SMikkTSpaceContext*,
const int) ->
int
238 .m_getPosition = [] (
const SMikkTSpaceContext * pContext,
float fvPosOut[],
const int iFace,
const int iVert)
242 const std::vector<glm::uvec3>& triangles = data->
triangles;
244 const std::vector<V>& vertices = mesh->getVertices();
246 const V& vertex = vertices[triangles[iFace][iVert]];
247 const glm::vec3& position = vertex.position;
249 fvPosOut[0] = position.x;
250 fvPosOut[1] = position.y;
251 fvPosOut[2] = position.z;
254 .m_getNormal = [] (
const SMikkTSpaceContext * pContext,
float fvNormOut[],
const int iFace,
const int iVert)
258 const std::vector<glm::uvec3>& triangles = data->
triangles;
260 const std::vector<V>& vertices = mesh->getVertices();
262 const V& vertex = vertices[triangles[iFace][iVert]];
263 const glm::vec3& normal = vertex.normal;
265 fvNormOut[0] = normal.x;
266 fvNormOut[1] = normal.y;
267 fvNormOut[2] = normal.z;
270 .m_getTexCoord = [] (
const SMikkTSpaceContext * pContext,
float fvTexcOut[],
const int iFace,
const int iVert)
274 const std::vector<glm::uvec3>& triangles = data->
triangles;
276 const std::vector<V>& vertices = mesh->getVertices();
278 const V& vertex = vertices[triangles[iFace][iVert]];
279 const glm::vec2& tex_coords = vertex.tex_coords;
281 fvTexcOut[0] = tex_coords.x;
282 fvTexcOut[1] = tex_coords.y;
285 .m_setTSpaceBasic = [] (
const SMikkTSpaceContext * pContext,
const float fvTangent[],
const float fSign,
const int iFace,
const int iVert)
289 const std::vector<glm::uvec3>& triangles = data->
triangles;
291 std::vector<V>& vertices = mesh->getVertices();
293 V& vertex = vertices[triangles[iFace][iVert]];
295 vertex.tangent = glm::vec3(fvTangent[0], fvTangent[1], fvTangent[2]);
296 vertex.bitangent = fSign * glm::cross(vertex.normal, vertex.tangent);
299 .m_setTSpace = [] (
const SMikkTSpaceContext *,
const float[],
const float[],
const float ,
const float,
const tbool ,
const int ,
const int )
312 .m_pInterface = &callbacks,
313 .m_pUserData = &user_data