201 if (triangles.size() == 0)
205 glm::vec3 e1, e2, no;
207 std::vector<size_t> count_normals;
209 for (
size_t i=0; i<vertices.size(); i++)
211 vertices[i].normal = glm::vec3(0.0);
212 count_normals.push_back(0);
215 for (
size_t i=0; i<triangles.size(); i++)
217 const glm::uvec3& face = triangles[i];
219 V& va = vertices[face[0]];
220 V& vb = vertices[face[1]];
221 V& vc = vertices[face[2]];
223 e1 = vb.position - va.position;
224 e2 = vc.position - va.position;
226 no = glm::cross(e1, e2);
232 count_normals[face[0]]++;
233 count_normals[face[1]]++;
234 count_normals[face[2]]++;
237 for (
size_t i=0; i<vertices.size(); i++)
239 if (count_normals[i] > 0)
240 vertices[i].normal = glm::normalize(vertices[i].normal / (
float)count_normals[i]);
265 SMikkTSpaceInterface callbacks
267 .m_getNumFaces = [] (
const SMikkTSpaceContext * pContext) ->
int
271 const std::vector<glm::uvec3>& triangles = data->
triangles;
273 return triangles.size();
276 .m_getNumVerticesOfFace = [] (
const SMikkTSpaceContext*,
const int) ->
int
282 .m_getPosition = [] (
const SMikkTSpaceContext * pContext,
float fvPosOut[],
const int iFace,
const int iVert)
287 const std::vector<glm::uvec3>& triangles = data->
triangles;
289 const std::vector<V>& vertices = mesh->getVertices();
291 const V& vertex = vertices[triangles[iFace][iVert]];
292 const glm::vec3& position = vertex.position;
294 fvPosOut[0] = position.x;
295 fvPosOut[1] = position.y;
296 fvPosOut[2] = position.z;
299 .m_getNormal = [] (
const SMikkTSpaceContext * pContext,
float fvNormOut[],
const int iFace,
const int iVert)
304 const std::vector<glm::uvec3>& triangles = data->
triangles;
306 const std::vector<V>& vertices = mesh->getVertices();
308 const V& vertex = vertices[triangles[iFace][iVert]];
309 const glm::vec3& normal = vertex.normal;
311 fvNormOut[0] = normal.x;
312 fvNormOut[1] = normal.y;
313 fvNormOut[2] = normal.z;
316 .m_getTexCoord = [] (
const SMikkTSpaceContext * pContext,
float fvTexcOut[],
const int iFace,
const int iVert)
321 const std::vector<glm::uvec3>& triangles = data->
triangles;
323 const std::vector<V>& vertices = mesh->getVertices();
325 const V& vertex = vertices[triangles[iFace][iVert]];
326 const glm::vec2& tex_coords = vertex.tex_coords;
328 fvTexcOut[0] = tex_coords.x;
329 fvTexcOut[1] = tex_coords.y;
332 .m_setTSpaceBasic = [] (
const SMikkTSpaceContext * pContext,
const float fvTangent[],
const float fSign,
const int iFace,
const int iVert)
337 const std::vector<glm::uvec3>& triangles = data->
triangles;
339 std::vector<V>& vertices = mesh->getVertices();
341 V& vertex = vertices[triangles[iFace][iVert]];
343 vertex.tangent = glm::vec3(fvTangent[0], fvTangent[1], fvTangent[2]);
344 vertex.bitangent = fSign * glm::cross(vertex.normal, vertex.tangent);
347 .m_setTSpace = [] (
const SMikkTSpaceContext *,
const float[],
const float[],
const float ,
const float,
const tbool ,
const int ,
const int )
360 .m_pInterface = &callbacks,
361 .m_pUserData = &user_data