1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
|
#include "charactercontrollersystem.h"
#include "Game/Components/CollisionComponents/CollisionComponent.h"
#include "Game/Components/CollisionComponents/CylinderCollider.h"
#include "Game/Components/TransformComponent.h"
#include "Game/Systems/CollisionSystems/ellipsoidtrianglecollisionsystem.h"
#include <glm/gtx/quaternion.hpp>
CharacterControllerSystem::CharacterControllerSystem(std::map<std::string, std::shared_ptr<GameObject>>& gameobjects,
std::shared_ptr<Camera>& camera_param,
std::map<int, Input>& input_map,
std::map<std::string, BlackboardData>& global_blackboard):
m_gameobjects(gameobjects),
camera(camera_param),
m_input_map(input_map),
m_global_blackboard(global_blackboard)
{
}
void CharacterControllerSystem::draw(){
}
TransformComponent* CharacterControllerSystem::getPlayerTransform(){
return m_gameobjects.at("player")->getComponent<TransformComponent>();
}
glm::vec3 CharacterControllerSystem::getPlayerPos(){
return m_gameobjects.at("player")->getComponent<TransformComponent>()->getPos();
}
float CharacterControllerSystem::jumpPlayer(float &initial_v, double deltaTime, float snapshot_time, float gravity){
float t = deltaTime-snapshot_time;
float delta_y = initial_v*t + (.5f)*gravity*t*t;
return delta_y;
}
bool CharacterControllerSystem::movePlayerLaterally(glm::vec3 dir, glm::vec3 perp, glm::vec3 &m_pos, float dt){
glm::vec3 translationDir;
bool moving_laterally = false;
std::shared_ptr<ModelTransform> temp_mt = getPlayerTransform()->getMT();
if (m_input_map[GLFW_KEY_W].isActive){
m_currentSpeed = RUN_SPEED;
moving_laterally = true;
} else if (m_input_map[GLFW_KEY_S].isActive){
m_currentSpeed = -RUN_SPEED;
moving_laterally = true;
} else {
m_currentSpeed = 0.f;
}
glm::mat4 rot = glm::mat4(1.f);
// player turning
if (m_input_map[GLFW_KEY_D].isActive){
m_currentTurnSpeed = -TURN_SPEED;
moving_laterally = true;
} else if (m_input_map[GLFW_KEY_A].isActive){
m_currentTurnSpeed = TURN_SPEED;
moving_laterally = true;
} else {
m_currentTurnSpeed = 0.f;
}
// rotate player
getPlayerTransform()->getMT()->rotate(m_currentTurnSpeed*dt, glm::vec3(0.f, 1.f, 0.f));
//translate player based on rotation
float distance = m_currentSpeed*dt;
glm::vec4 movement = distance*glm::vec4(1.f,0.f,0.f, 0.f);
glm::vec4 transl = getPlayerTransform()->getMT()->getRotation()*movement;
translationDir = glm::vec3(transl.x, 0.f, transl.z);
temp_mt->translate(translationDir);
glm::vec3 potential_pos = temp_mt->getPos();
m_pos = potential_pos;
return moving_laterally;
}
void CharacterControllerSystem::handlePlayerMovement(double deltaTime){
// timing
float dt = deltaTime - snapshot_time;
snapshot_time = deltaTime;
// get player positions
m_pos = getPlayerPos();
getPlayerTransform()->old_pos = m_pos;
// movement
getPlayerTransform()->movingLaterally = false;
float speedFactor = horiz_velocity * deltaTime;
glm::vec3 look = camera->getLook();
glm::vec3 dir = glm::normalize(glm::vec3(look.x, 0.f, look.z)) * speedFactor;
glm::vec3 perp = glm::vec3(look.z, 0.f, -look.x) * speedFactor;
// updates m_pos
if (movePlayerLaterally(dir, perp, m_pos, dt)){
getPlayerTransform()->movingLaterally = true;
}
if (m_input_map[GLFW_KEY_SPACE].isActive && (getPlayerTransform()->onGround)){
getPlayerTransform()->gravity = -25.f;
getPlayerTransform()->yVelocity = 20.f;
getPlayerTransform()->onGround = false;
//if (!gravity) gravity = true;
m_global_blackboard["player"].conditionData["isJumping"].conditionTrue = true;
} else if (!m_input_map[GLFW_KEY_SPACE].isActive && getPlayerTransform()->onGround){
m_global_blackboard["player"].conditionData["isJumping"].conditionTrue = false;
}
// PLAYER-SPECIFIC GRAVITY (comment these two lines to keep player still)
//if (gravity){
m_pos.y += jumpPlayer(getPlayerTransform()->yVelocity, dt, 0, getPlayerTransform()->gravity);
getPlayerTransform()->yVelocity = getPlayerTransform()->yVelocity + getPlayerTransform()->gravity*(dt);
//}
// store m_pos as estimated final_pos
m_global_blackboard["player"].locationData.setToPos = m_pos;
getPlayerTransform()->estimated_final_pos = m_pos;
}
void CharacterControllerSystem::update(double deltaTime){
handlePlayerMovement(deltaTime);
}
void CharacterControllerSystem::scrollEvent(double distance){}
void CharacterControllerSystem::mousePosEvent(double xpos, double ypos){}
|