summaryrefslogtreecommitdiff
path: root/engine-ocean/Game/Systems/charactercontrollersystem.cpp
blob: c5e7174323b35e7cb7c311b5e0460c156c4c1298 (plain)
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){}