Mesh.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. /*
  2. * Copyright (c) 2021, Jesse Buhagiar <jooster669@gmail.com>
  3. * Copyright (c) 2021, Mathieu Gaillard <gaillard.mathieu.39@gmail.com>
  4. * Copyright (c) 2021, Pedro Pereira <pmh.pereira@gmail.com>
  5. *
  6. * SPDX-License-Identifier: BSD-2-Clause
  7. */
  8. #include <LibGL/GL/gl.h>
  9. #include <LibGfx/Color.h>
  10. #include <LibGfx/Vector3.h>
  11. #include <LibGfx/Vector4.h>
  12. #include "Mesh.h"
  13. const Color colors[] {
  14. Color::Red,
  15. Color::Green,
  16. Color::Blue,
  17. Color::Magenta,
  18. Color::Yellow,
  19. Color::Cyan,
  20. Color::White
  21. };
  22. Mesh::Mesh(Vector<Vertex> vertices, Vector<TexCoord> tex_coords, Vector<Vertex> normals, Vector<Triangle> triangles)
  23. : m_vertex_list(move(vertices))
  24. , m_tex_coords(move(tex_coords))
  25. , m_normal_list(move(normals))
  26. , m_triangle_list(move(triangles))
  27. {
  28. }
  29. void Mesh::draw(float uv_scale)
  30. {
  31. for (u32 i = 0; i < m_triangle_list.size(); i++) {
  32. const auto& triangle = m_triangle_list[i];
  33. const FloatVector3 vertex_a(
  34. m_vertex_list.at(triangle.a).x,
  35. m_vertex_list.at(triangle.a).y,
  36. m_vertex_list.at(triangle.a).z);
  37. const FloatVector3 vertex_b(
  38. m_vertex_list.at(triangle.b).x,
  39. m_vertex_list.at(triangle.b).y,
  40. m_vertex_list.at(triangle.b).z);
  41. const FloatVector3 vertex_c(
  42. m_vertex_list.at(triangle.c).x,
  43. m_vertex_list.at(triangle.c).y,
  44. m_vertex_list.at(triangle.c).z);
  45. FloatVector3 normal_a, normal_b, normal_c;
  46. if (has_normals()) {
  47. normal_a = FloatVector3(
  48. m_normal_list.at(triangle.normal_index0).x,
  49. m_normal_list.at(triangle.normal_index0).y,
  50. m_normal_list.at(triangle.normal_index0).z);
  51. normal_b = FloatVector3(
  52. m_normal_list.at(triangle.normal_index1).x,
  53. m_normal_list.at(triangle.normal_index1).y,
  54. m_normal_list.at(triangle.normal_index1).z);
  55. normal_c = FloatVector3(
  56. m_normal_list.at(triangle.normal_index2).x,
  57. m_normal_list.at(triangle.normal_index2).y,
  58. m_normal_list.at(triangle.normal_index2).z);
  59. } else {
  60. // Compute the triangle normal
  61. const FloatVector3 vec_ab = vertex_b - vertex_a;
  62. const FloatVector3 vec_ac = vertex_c - vertex_a;
  63. normal_a = vec_ab.cross(vec_ac).normalized();
  64. normal_b = normal_a;
  65. normal_c = normal_a;
  66. }
  67. glBegin(GL_TRIANGLES);
  68. if (is_textured())
  69. glTexCoord2f(m_tex_coords.at(triangle.tex_coord_index0).u * uv_scale, (1.0f - m_tex_coords.at(triangle.tex_coord_index0).v) * uv_scale);
  70. // Vertex 1
  71. glNormal3f(normal_a.x(), normal_a.y(), normal_a.z());
  72. glVertex3f(
  73. m_vertex_list.at(triangle.a).x,
  74. m_vertex_list.at(triangle.a).y,
  75. m_vertex_list.at(triangle.a).z);
  76. if (is_textured())
  77. glTexCoord2f(m_tex_coords.at(triangle.tex_coord_index1).u * uv_scale, (1.0f - m_tex_coords.at(triangle.tex_coord_index1).v) * uv_scale);
  78. // Vertex 2
  79. glNormal3f(normal_b.x(), normal_b.y(), normal_b.z());
  80. glVertex3f(
  81. m_vertex_list.at(triangle.b).x,
  82. m_vertex_list.at(triangle.b).y,
  83. m_vertex_list.at(triangle.b).z);
  84. if (is_textured())
  85. glTexCoord2f(m_tex_coords.at(triangle.tex_coord_index2).u * uv_scale, (1.0f - m_tex_coords.at(triangle.tex_coord_index2).v) * uv_scale);
  86. // Vertex 3
  87. glNormal3f(normal_c.x(), normal_c.y(), normal_c.z());
  88. glVertex3f(
  89. m_vertex_list.at(triangle.c).x,
  90. m_vertex_list.at(triangle.c).y,
  91. m_vertex_list.at(triangle.c).z);
  92. glEnd();
  93. }
  94. }