Mesh.cpp 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. #include "../Unix/GameCodeStd.h"
  2. #include "../GameCode4/GameCode.h"
  3. #include "../ResourceCache/ResCache.h"
  4. #include "OpenGLRenderer.h"
  5. #include "Lights.h"
  6. #include "Mesh.h"
  7. // #include "Raycast.h"
  8. #include "SceneNodes.h"
  9. std::shared_ptr<IResourceLoader> CreateGlbMeshResourceLoader()
  10. {
  11. return std::shared_ptr<IResourceLoader>(GCC_NEW GlbMeshResourceLoader());
  12. }
  13. unsigned int GlbMeshResourceLoader::VGetLoadedResourceSize(char *rawBuffer, unsigned int rawSize)
  14. {
  15. // The raw data of the SDK Mesh file is needed by the CDXUTMesh class, so we're going to keep it around.
  16. return rawSize;
  17. }
  18. //
  19. // SdkMeshResourceLoader::VLoadResource - Chapter 16, page 561
  20. //
  21. bool GlbMeshResourceLoader::VLoadResource(char *rawBuffer, unsigned int rawSize, std::shared_ptr<ResHandle> handle)
  22. {
  23. std::shared_ptr<OpenGLGlbMeshResourceExtraData> extra = std::shared_ptr<OpenGLGlbMeshResourceExtraData>(GCC_NEW OpenGLGlbMeshResourceExtraData());
  24. // load the mesh
  25. extra->m_pScene = aiImportFileFromMemory(rawBuffer, rawSize, 0, "glb");
  26. if (!extra->m_pScene || extra->m_pScene->mFlags & AI_SCENE_FLAGS_INCOMPLETE || !extra->m_pScene->mRootNode) {
  27. GCC_ERROR(std::string("Failed to open scene file: ") + aiGetErrorString());
  28. return false;
  29. }
  30. handle->SetExtra(std::shared_ptr<OpenGLGlbMeshResourceExtraData>(extra));
  31. return true;
  32. }
  33. OpenGLShaderMeshNode::OpenGLShaderMeshNode(const ActorId actorId,
  34. WeakBaseRenderComponentPtr renderComponent,
  35. std::string meshFileName,
  36. RenderPass renderPass,
  37. const glm::mat4 t)
  38. : SceneNode(actorId, renderComponent, renderPass, t),
  39. m_vao(0),
  40. m_vbo(0),
  41. m_ebo(0),
  42. m_numIndices(0),
  43. m_numMeshes(0)
  44. {
  45. m_meshFileName = meshFileName;
  46. }
  47. int OpenGLShaderMeshNode::VOnRestore(Scene *pScene)
  48. {
  49. m_ShaderProgram.OnRestore(pScene);
  50. // Force the Mesh to reload
  51. Resource resource(m_meshFileName);
  52. std::shared_ptr<ResHandle> pResourceHandle = g_pApp->m_ResCache->GetHandle(&resource);
  53. std::shared_ptr<OpenGLGlbMeshResourceExtraData> extra = static_pointer_cast<OpenGLGlbMeshResourceExtraData>(pResourceHandle->GetExtra());
  54. for (int i = 0; i < m_numMeshes; i++) {
  55. glDeleteVertexArrays(1, &m_vao[i]);
  56. glDeleteBuffers(1, &m_vbo[i]);
  57. glDeleteBuffers(1, &m_ebo[i]);
  58. }
  59. if (m_vao) { delete[] m_vao; }
  60. if (m_vbo) { delete[] m_vbo; }
  61. if (m_ebo) { delete[] m_ebo; }
  62. if (m_numIndices) { delete[] m_numIndices; }
  63. if (m_numVerts) { delete[] m_numVerts; }
  64. m_numMeshes = extra->m_pScene->mNumMeshes;
  65. m_vao = GCC_NEW GLuint[m_numMeshes];
  66. m_vbo = GCC_NEW GLuint[m_numMeshes];
  67. m_ebo = GCC_NEW GLuint[m_numMeshes];
  68. m_numIndices = GCC_NEW size_t[m_numMeshes];
  69. m_numVerts = GCC_NEW size_t[m_numMeshes];
  70. for (int i = 0; i < extra->m_pScene->mNumMeshes; i++)
  71. {
  72. const aiMesh* p_AIMesh = extra->m_pScene->mMeshes[i];
  73. m_numVerts[i] = p_AIMesh->mNumVertices;
  74. VertexUnlitTextured *pVerts = GCC_NEW VertexUnlitTextured[m_numVerts[i]];
  75. GCC_ASSERT(pVerts && "Out of memory in OpenGLShaderMeshNode::VOnRestore");
  76. if (!pVerts)
  77. return 1;
  78. for (int j = 0; j < m_numVerts[i]; j++)
  79. {
  80. pVerts[j].Pos = glm::vec3(
  81. p_AIMesh->mVertices[j].x,
  82. p_AIMesh->mVertices[j].y,
  83. p_AIMesh->mVertices[j].z
  84. );
  85. pVerts[j].Normal = glm::vec3(
  86. p_AIMesh->mNormals[j].x,
  87. p_AIMesh->mNormals[j].y,
  88. p_AIMesh->mNormals[j].z
  89. );
  90. pVerts[j].Uv = glm::vec2(
  91. p_AIMesh->mTextureCoords[0][j].x,
  92. p_AIMesh->mTextureCoords[0][j].y
  93. );
  94. }
  95. m_numIndices[i] = p_AIMesh->mNumFaces * 3;
  96. GLuint *pIndices = GCC_NEW GLuint[m_numIndices[i]];
  97. GCC_ASSERT(pIndices && "Out of memory in OpenGLShaderMeshNode::VOnRestore");
  98. if (!pIndices)
  99. {
  100. delete[] pVerts;
  101. return 1;
  102. }
  103. GLuint *current = pIndices;
  104. for (int j = 0; j < p_AIMesh->mNumFaces; j++)
  105. {
  106. *(current + 0) = p_AIMesh->mFaces[j].mIndices[0];
  107. *(current + 1) = p_AIMesh->mFaces[j].mIndices[1];
  108. *(current + 2) = p_AIMesh->mFaces[j].mIndices[2];
  109. current += 3;
  110. }
  111. glCreateVertexArrays(1, &m_vao[i]);
  112. glCreateBuffers(1, &m_vbo[i]);
  113. glNamedBufferStorage(m_vbo[i], sizeof(VertexUnlitTextured) * m_numVerts[i], pVerts, 0);
  114. glVertexArrayVertexBuffer(m_vao[i], 0, m_vbo[i], 0, sizeof(VertexUnlitTextured));
  115. glEnableVertexArrayAttrib(m_vao[i], 0);
  116. glVertexArrayAttribFormat(m_vao[i], 0, 3, GL_FLOAT, GL_FALSE, 0);
  117. glVertexArrayAttribBinding(m_vao[i], 0, 0);
  118. glEnableVertexArrayAttrib(m_vao[i], 1);
  119. glVertexArrayAttribFormat(m_vao[i], 1, 3, GL_FLOAT, GL_FALSE, offsetof(VertexUnlitTextured, Normal));
  120. glVertexArrayAttribBinding(m_vao[i], 1, 0);
  121. glEnableVertexArrayAttrib(m_vao[i], 2);
  122. glVertexArrayAttribFormat(m_vao[i], 2, 2, GL_FLOAT, GL_FALSE, offsetof(VertexUnlitTextured, Uv));
  123. glVertexArrayAttribBinding(m_vao[i], 2, 0);
  124. delete[] pVerts;
  125. glCreateBuffers(1, &m_ebo[i]);
  126. glNamedBufferStorage(m_ebo[i], sizeof(GLuint) * m_numIndices[i], pIndices, 0);
  127. glVertexArrayElementBuffer(m_vao[i], m_ebo[i]);
  128. delete[] pIndices;
  129. }
  130. // TODO (munnellg) - calcualte the bounding sphere here
  131. return 1;
  132. }
  133. int OpenGLShaderMeshNode::VRender(Scene *pScene)
  134. {
  135. // GridRenderComponent* grc = static_cast<GridRenderComponent*>(m_RenderComponent);
  136. // m_ShaderProgram.SetTexture(grc->GetTextureResource());
  137. m_ShaderProgram.SetupRender(pScene, this);
  138. for (int i = 0; i < m_numMeshes; i++)
  139. {
  140. glBindVertexArray(m_vao[i]);
  141. glDrawElements(GL_TRIANGLES, m_numIndices[i], GL_UNSIGNED_INT, 0);
  142. }
  143. glBindVertexArray(0);
  144. return 0;
  145. }