Wrath of Zeus
Made by Torchlight Games for CSE 125 SP24
Loading...
Searching...
No Matches
model.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <vector>
4#include <string>
5#include <map>
6#include <memory>
7#include <optional>
8#include <set>
9
10#include <GL/glew.h>
11#include <glm/glm.hpp>
12#include <assimp/Importer.hpp>
13#include <assimp/scene.h>
14#include <assimp/postprocess.h>
15#include "assimp/material.h"
16
17#include "client/renderable.hpp"
18#include "client/shader.hpp"
19#include "client/util.hpp"
20#include "client/bone.hpp"
21
22#define MAX_BONE_INFLUENCE 4
23
28struct Vertex {
29 glm::vec3 position;
30 glm::vec3 normal;
31 glm::vec2 textureCoords;
32 int m_boneIDs[MAX_BONE_INFLUENCE]; /* Bone indices which influence the vertex */
33 float m_weights[MAX_BONE_INFLUENCE]; /* Weights for each bone */
34 glm::vec3 tangent;
35 glm::vec3 bitangent;
36};
37
38class Texture {
39 public:
48 Texture(const std::string& filepath, const aiTextureType& type);
49
53 GLuint getID() const;
54
55 /*
56 * Get the type of texture. Either "texture_diffuse" or "texture_specular".
57 */
58 std::string getType() const;
59 private:
60 GLuint ID;
61 std::string type;
62};
63
64struct Material {
65 glm::vec3 ambient;
66 glm::vec3 diffuse;
67 glm::vec3 specular;
68 float shininess;
69};
70
71struct BoneInfo {
72 /*id is index in finalBoneMatrices*/
73 int id;
74
75 /*offset matrix transforms vertex from model space to bone space*/
76 glm::mat4 offset;
77};
78
86class Mesh : public Renderable {
87 public:
91 Mesh(
92 const std::vector<Vertex>& vertices,
93 const std::vector<unsigned int>& indices,
94 const std::vector<Texture>& textures,
95 const Material& material
96 );
97
106 void draw(Shader* shader,
107 glm::vec3 camPos,
108 bool fill) override;
109
110
111 std::optional<glm::vec3> solidColor;
113 private:
114 std::vector<Vertex> vertices;
115 std::vector<unsigned int> indices;
116 std::vector<Texture> textures;
117
118 // render data opengl needs
119 GLuint VAO, VBO, EBO;
120 void setupNormalMaps();
121};
122
123
124class Model : public Renderable {
125 public:
133 explicit Model(const std::string& filepath, bool flip_uvs);
134
141 void draw(Shader* shader,
142 glm::vec3 camPos,
143 bool fill) override;
144
151 void draw(Shader* shader,
152 glm::vec3 camPos,
153 bool fill,
154 glm::vec3 color);
155
162 void translateAbsolute(const glm::vec3& new_pos) override;
163
171 void translateRelative(const glm::vec3& delta) override;
172
182 virtual void scaleAbsolute(const float& new_factor) override;
183
192 virtual void scaleAbsolute(const glm::vec3& scale) override;
193
203 void scaleRelative(const float& new_factor) override;
204
213 void scaleRelative(const glm::vec3& scale) override;
214
223 void rotateAbsolute(const glm::vec3& dir, bool is_player = false, const glm::vec3& axis = glm::vec3(0.0f, 1.0f, 0.0f)) override;
224
233 void rotateAbsolute(const float& angle, const glm::vec3& axis = glm::vec3(0.0f, 1.0f, 0.0f)) override;
234
243 void rotateRelative(const glm::vec3& dir, const glm::vec3& axis = glm::vec3(0.0f, 1.0f, 0.0f)) override;
244
249 void clear() override;
250
254 void clearScale() override;
255
259 void clearPosition() override;
260
268 glm::vec3 getDimensions();
269
276 void setDimensions(const glm::vec3& dimensions);
277
278 void overrideSolidColor(std::optional<glm::vec3> color);
279
280
281 auto& getBoneInfoMap() { return m_boneInfoMap; }
282 int& getBoneCount() { return m_boneCounter; }
283
284
285 private:
286 std::vector<Mesh> meshes;
287 Bbox bbox;
288 glm::vec3 dimensions;
289
290 std::map<std::string, BoneInfo> m_boneInfoMap;
291 int m_boneCounter = 0;
292
293
294 void processNode(aiNode* node, const aiScene* scene);
295 Mesh processMesh(aiMesh* mesh, const aiScene* scene);
296 void setDefaultVertexBoneData(Vertex& vertex);
297 void setVertexBoneData(Vertex& vertex, int boneID, float weight);
298 void extractBoneWeight(std::vector<Vertex>& vertices, aiMesh* mesh, const aiScene* scene);
299
300 std::vector<Texture> loadMaterialTextures(aiMaterial* mat, const aiTextureType& type);
301
302
303 // store the directory of the model file so that textures can be
304 // loaded relative to the model file
305 std::string directory;
306};
Definition: model.hpp:86
Material material
Definition: model.hpp:112
void draw(Shader *shader, glm::vec3 camPos, bool fill) override
Definition: model.cpp:139
std::optional< glm::vec3 > solidColor
Definition: model.hpp:111
Definition: model.hpp:124
glm::vec3 getDimensions()
Definition: model.cpp:333
void rotateAbsolute(const glm::vec3 &dir, bool is_player=false, const glm::vec3 &axis=glm::vec3(0.0f, 1.0f, 0.0f)) override
Rotates the item along the specified axis. If no axis is specified, then assumes a rotation on the y-...
Definition: model.cpp:291
void rotateRelative(const glm::vec3 &dir, const glm::vec3 &axis=glm::vec3(0.0f, 1.0f, 0.0f)) override
Rotates the item along the specified axis. If no axis is specified, then assumes a rotation on the y-...
Definition: model.cpp:305
void translateAbsolute(const glm::vec3 &new_pos) override
Definition: model.cpp:249
virtual void scaleAbsolute(const float &new_factor) override
Definition: model.cpp:263
void scaleRelative(const float &new_factor) override
Definition: model.cpp:277
void setDimensions(const glm::vec3 &dimensions)
Definition: model.cpp:337
int & getBoneCount()
Definition: model.hpp:282
void clearPosition() override
Definition: model.cpp:326
void translateRelative(const glm::vec3 &delta) override
Definition: model.cpp:256
void overrideSolidColor(std::optional< glm::vec3 > color)
Definition: model.cpp:523
void draw(Shader *shader, glm::vec3 camPos, bool fill) override
Definition: model.cpp:227
auto & getBoneInfoMap()
Definition: model.hpp:281
void clear() override
Definition: model.cpp:312
void clearScale() override
Definition: model.cpp:319
Definition: renderable.hpp:22
Definition: shader.hpp:12
Definition: model.hpp:38
GLuint getID() const
Definition: model.cpp:579
std::string getType() const
Definition: model.cpp:583
GLuint shader
Definition: glad.h:1843
GLsizei GLenum const void * indices
Definition: glad.h:1649
unsigned int GLuint
Definition: glad.h:115
GLuint color
Definition: glad.h:2250
GLint GLint GLsizei GLint GLenum GLenum type
Definition: glad.h:1531
const GLuint * textures
Definition: glad.h:1676
#define MAX_BONE_INFLUENCE
Definition: model.hpp:22
Definition: util.hpp:30
Definition: model.hpp:71
glm::mat4 offset
Definition: model.hpp:76
int id
Definition: model.hpp:73
Definition: model.hpp:64
glm::vec3 diffuse
Definition: model.hpp:66
float shininess
Definition: model.hpp:68
glm::vec3 specular
Definition: model.hpp:67
glm::vec3 ambient
Definition: model.hpp:65
Definition: model.hpp:28
glm::vec3 position
Definition: model.hpp:29
glm::vec2 textureCoords
Definition: model.hpp:31
glm::vec3 normal
Definition: model.hpp:30
glm::vec3 tangent
Definition: model.hpp:34
glm::vec3 bitangent
Definition: model.hpp:35
int m_boneIDs[MAX_BONE_INFLUENCE]
Definition: model.hpp:32
float m_weights[MAX_BONE_INFLUENCE]
Definition: model.hpp:33