Shkyera Engine
Easy to use, game engine for Python
Loading...
Searching...
No Matches
BillboardComponent.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <iostream>
4#include <string>
5
6#include <glm/glm.hpp>
7#include <glm/gtc/matrix_transform.hpp>
8
10#include <AssetManager/Mesh.hpp>
12
13namespace shkyera {
14
15template <RuntimeMode Mode = RuntimeMode::PRODUCTION>
17 public:
19
20 enum class Scale { World, Camera };
21
23
28
29 glm::mat4 getModelMatrix(const glm::mat4& baseMatrix, const glm::vec3& cameraPosition,
30 const glm::mat4& viewMatrix) const {
31 glm::vec3 position = glm::vec3(baseMatrix[3]);
32
33 glm::vec3 scaleVec(glm::length(glm::vec3(baseMatrix[0])), glm::length(glm::vec3(baseMatrix[1])),
34 glm::length(glm::vec3(baseMatrix[2])));
35
36 if (scale == Scale::Camera) {
37 float distance = glm::distance(cameraPosition, position);
38 scaleVec *= distance / 30.0f;
39 }
40
41 glm::mat4 translation = glm::translate(glm::mat4(1.0f), position);
42
43 glm::mat4 rotation(1.0f);
45 glm::mat3 camRot = glm::mat3(viewMatrix);
46 camRot = glm::transpose(camRot);
47 rotation = glm::mat4(camRot);
48 rotation = glm::rotate(rotation, glm::radians(180.0f), glm::vec3(1, 0, 0));
50 glm::vec3 dir = cameraPosition - position;
51 dir.y = 0.0f; // ignore vertical component
52 if (glm::length(dir) > 0.0001f) {
53 dir = glm::normalize(dir);
54 }
55 float angle = std::atan2(dir.x, dir.z);
56 rotation = glm::rotate(glm::mat4(1.0f), angle, glm::vec3(0, 1, 0));
58 glm::vec3 right = glm::normalize(glm::vec3(baseMatrix[0]));
59 glm::vec3 up = glm::normalize(glm::vec3(baseMatrix[1]));
60 glm::vec3 forward = glm::normalize(glm::vec3(baseMatrix[2]));
61 glm::mat3 R_base;
62 R_base[0] = right;
63 R_base[1] = up;
64 R_base[2] = forward;
65 rotation = glm::mat4(R_base);
66 }
67
68 glm::mat4 correction = glm::rotate(glm::mat4(1.0f), glm::radians(90.0f), glm::vec3(1.0f, 0.0f, 0.0f));
69
70 glm::mat4 scaling = glm::scale(glm::mat4(1.0f), scaleVec);
71
73 return model;
74 }
75};
76
77} // namespace shkyera
Definition Asset.hpp:6
Definition BillboardComponent.hpp:16
HandleAndAsset< Material > material
Definition BillboardComponent.hpp:27
Occlusion occlusion
Definition BillboardComponent.hpp:26
Orientation orientation
Definition BillboardComponent.hpp:24
Scale scale
Definition BillboardComponent.hpp:25
glm::mat4 getModelMatrix(const glm::mat4 &baseMatrix, const glm::vec3 &cameraPosition, const glm::mat4 &viewMatrix) const
Definition BillboardComponent.hpp:29
Occlusion
Definition BillboardComponent.hpp:22
Orientation
Definition BillboardComponent.hpp:18
Scale
Definition BillboardComponent.hpp:20
Definition Clock.hpp:9