TerraForge3D  2.3.1
3D Terrain And Landscape Generator
Model.cpp
1#include <Model.h>
2#include <iostream>
3
4#include <glm/gtc/constants.hpp>
5#include <glm/gtc/quaternion.hpp>
6#include <glm/gtc/matrix_transform.hpp>
7#include <glm/ext/matrix_relational.hpp>
8#include <glm/ext/vector_relational.hpp>
9#include <glm/ext/scalar_relational.hpp>
10
11#include <glad/glad.h>
12
13Model::Model(std::string n)
14{
15 name = n;
16 mesh = new Mesh();
17}
18
19void Model::SetupMeshOnGPU()
20{
21 glGenVertexArrays(1, &vao);
22 glBindVertexArray(vao);
23 glGenBuffers(1, &vbo);
24 glBindBuffer(GL_ARRAY_BUFFER, vbo);
25 //glBufferData(GL_ARRAY_BUFFER, sizeof(Vert) * mesh.vertexCount, mesh.vert, GL_DYNAMIC_DRAW);
26 glGenBuffers(1, &ebo);
27 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
28 //glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(int) * mesh.indexCount, mesh.indices, GL_DYNAMIC_DRAW);
29 glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, sizeof(Vert), (void *)offsetof(Vert, position));
30 glEnableVertexAttribArray(0);
31 glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, sizeof(Vert), (void *)offsetof(Vert, normal));
32 glEnableVertexAttribArray(1);
33 glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vert), (void *)offsetof(Vert, texCoord));
34 glEnableVertexAttribArray(2);
35 glVertexAttribPointer(3, 4, GL_FLOAT, GL_FALSE, sizeof(Vert), (void *)offsetof(Vert, extras1));
36 glEnableVertexAttribArray(3);
37 std::cout << "Setup Model " << name << " on GPU.\n";
38}
39
40void Model::UploadToGPU()
41{
42 if (!mesh)
43 {
44 std::cout << "In Model " << name << " mesh not available.\n";
45 return;
46 }
47
48 if (!mesh->IsValid())
49 {
50 std::cout << "In Model " << name << " mesh not valid.\n";
51 return;
52 }
53
54 glBindVertexArray(vao);
55 glBindBuffer(GL_ARRAY_BUFFER, vbo);
56 glBufferData(GL_ARRAY_BUFFER, sizeof(Vert) * mesh->vertexCount, mesh->vert, GL_DYNAMIC_DRAW);
57 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
58 glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(int) * mesh->indexCount, mesh->indices, GL_DYNAMIC_DRAW);
59 glVertexAttribPointer(0, 4, GL_FLOAT, GL_FALSE, sizeof(Vert), (void *)offsetof(Vert, position));
60 glEnableVertexAttribArray(0);
61 glVertexAttribPointer(1, 4, GL_FLOAT, GL_FALSE, sizeof(Vert), (void *)offsetof(Vert, normal));
62 glEnableVertexAttribArray(1);
63 glVertexAttribPointer(2, 2, GL_FLOAT, GL_FALSE, sizeof(Vert), (void *)offsetof(Vert, texCoord));
64 glEnableVertexAttribArray(2);
65 glVertexAttribPointer(3, 4, GL_FLOAT, GL_FALSE, sizeof(Vert), (void *)offsetof(Vert, extras1));
66 glEnableVertexAttribArray(3);
67}
68
69void Model::Update()
70{
71 modelMatrix = glm::translate(glm::mat4(1.0f), position);
72 modelMatrix = glm::rotate(modelMatrix, rotation.x, glm::vec3(1, 0, 0));
73 modelMatrix = glm::rotate(modelMatrix, rotation.y, glm::vec3(0, 1, 0));
74 modelMatrix = glm::rotate(modelMatrix, rotation.z, glm::vec3(0, 0, 1));
75 modelMatrix = glm::scale(modelMatrix, scale);
76}
77
78void Model::Render()
79{
80 if (!mesh)
81 {
82 return;
83 }
84
85 glBindVertexArray(vao);
86 glDrawElements(GL_TRIANGLES, mesh->indexCount, GL_UNSIGNED_INT, 0);
87 glBindVertexArray(0);
88}
89
90
91Model::~Model()
92{
93 if (mesh)
94 {
95 delete mesh;
96 }
97}
Definition: Mesh.h:21
Definition: Mesh.h:13