Huge refactoring v3
parent
65f2c63643
commit
8f03c3226d
|
@ -10,9 +10,8 @@ Player::Player(ObjectNameTag name) : RigidBody(name) {
|
||||||
loadObj(ShooterConsts::CUBE_OBJ, Vec3D{0.5, 1.9, 0.5});
|
loadObj(ShooterConsts::CUBE_OBJ, Vec3D{0.5, 1.9, 0.5});
|
||||||
setAcceleration(Vec3D{0, -ShooterConsts::GRAVITY, 0});
|
setAcceleration(Vec3D{0, -ShooterConsts::GRAVITY, 0});
|
||||||
setCollision(true);
|
setCollision(true);
|
||||||
setVisible(false);
|
//setVisible(false);
|
||||||
|
|
||||||
//setColor({240, 168, 168});
|
|
||||||
Vec3D randColor = Vec3D::Random();
|
Vec3D randColor = Vec3D::Random();
|
||||||
setColor({static_cast<sf::Uint8>(randColor.x()*255), static_cast<sf::Uint8>(randColor.y()*255), static_cast<sf::Uint8>(randColor.z()*255)});
|
setColor({static_cast<sf::Uint8>(randColor.x()*255), static_cast<sf::Uint8>(randColor.y()*255), static_cast<sf::Uint8>(randColor.z()*255)});
|
||||||
|
|
||||||
|
@ -73,7 +72,7 @@ void Player::addWeapon(std::shared_ptr<Weapon> weapon) {
|
||||||
attach(weapon);
|
attach(weapon);
|
||||||
|
|
||||||
_weapons.back()->translate(position());
|
_weapons.back()->translate(position());
|
||||||
_weapons.back()->rotateRelativePoint(position() + Vec3D{0, 1.8, 0}, Vec3D{0, 1, 0}, _angle.y());
|
_weapons.back()->rotateRelativePoint(position() + Vec3D{0, 1.8, 0}, Vec3D{0, 1, 0}, angle().y());
|
||||||
_weapons.back()->rotateRelativePoint(position() + Vec3D{0, 1.8, 0}, left(), headAngle());
|
_weapons.back()->rotateRelativePoint(position() + Vec3D{0, 1.8, 0}, left(), headAngle());
|
||||||
|
|
||||||
_weapons.back()->setAddTraceCallBack(_addTraceCallBack);
|
_weapons.back()->setAddTraceCallBack(_addTraceCallBack);
|
||||||
|
|
|
@ -89,11 +89,11 @@ void Shooter::start() {
|
||||||
|
|
||||||
player->initWeapons();
|
player->initWeapons();
|
||||||
|
|
||||||
|
player->translate(Vec3D{0, 0, 0});
|
||||||
camera->translateToPoint(player->position() + Vec3D{0, 1.8, 0});
|
camera->translateToPoint(player->position() + Vec3D{0, 1.8, 0});
|
||||||
player->attach(camera);
|
player->attach(camera);
|
||||||
|
|
||||||
world->addBody(player);
|
world->addBody(player);
|
||||||
player->translate(Vec3D{0, 10, 0});
|
|
||||||
|
|
||||||
// connecting to the server
|
// connecting to the server
|
||||||
InitNetwork();
|
InitNetwork();
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
|
||||||
int main() {
|
int main() {
|
||||||
Shooter game;
|
Shooter game;
|
||||||
|
|
||||||
|
|
|
@ -126,30 +126,3 @@ void Camera::clear() {
|
||||||
_triangles.clear();
|
_triangles.clear();
|
||||||
_V = Matrix4x4::View(left(), up(), lookAt(), position());
|
_V = Matrix4x4::View(left(), up(), lookAt(), position());
|
||||||
}
|
}
|
||||||
|
|
||||||
// OpenGL function
|
|
||||||
GLfloat *Camera::view() const {
|
|
||||||
auto* v = (GLfloat*)malloc(4*4*sizeof(GLfloat));
|
|
||||||
|
|
||||||
v[0] = -(GLfloat)left().x();
|
|
||||||
v[4] = -(GLfloat)left().y();
|
|
||||||
v[8] = -(GLfloat)left().z();
|
|
||||||
v[12] = (GLfloat)position().dot(left());
|
|
||||||
|
|
||||||
v[1] = (GLfloat)up().x();
|
|
||||||
v[5] = (GLfloat)up().y();
|
|
||||||
v[9] = (GLfloat)up().z();
|
|
||||||
v[13] = -(GLfloat)position().dot(up());
|
|
||||||
|
|
||||||
v[2] = -(GLfloat)lookAt().x();
|
|
||||||
v[6] = -(GLfloat)lookAt().y();
|
|
||||||
v[10] = -(GLfloat)lookAt().z();
|
|
||||||
v[14] = (GLfloat)position().dot(lookAt());
|
|
||||||
|
|
||||||
v[3] = (GLfloat)0.0f;
|
|
||||||
v[7] = (GLfloat)0.0f;
|
|
||||||
v[11] = (GLfloat)0.0f;
|
|
||||||
v[15] = (GLfloat)1.0f;
|
|
||||||
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
|
@ -38,8 +38,6 @@ public:
|
||||||
[[nodiscard]] int buffSize() const { return _triangles.size(); }
|
[[nodiscard]] int buffSize() const { return _triangles.size(); }
|
||||||
std::vector<std::shared_ptr<Triangle>> sorted();
|
std::vector<std::shared_ptr<Triangle>> sorted();
|
||||||
|
|
||||||
// OpenGL function
|
|
||||||
[[nodiscard]] GLfloat* view() const;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -43,12 +43,14 @@ void Engine::create(int screenWidth, int screenHeight, const std::string &name,
|
||||||
world->update();
|
world->update();
|
||||||
|
|
||||||
if(_useOpenGL) {
|
if(_useOpenGL) {
|
||||||
GLfloat* view = camera->view();
|
GLfloat* view = camera->glView();
|
||||||
for(auto & it : *world) {
|
for(auto & it : *world) {
|
||||||
if (it.second->isVisible()) {
|
if (it.second->isVisible()) {
|
||||||
|
GLfloat* model = it.second->glModel();
|
||||||
GLfloat* geometry = Screen::glMeshToGLfloatArray(it.second, camera->position());
|
GLfloat* geometry = Screen::glMeshToGLfloatArray(it.second, camera->position());
|
||||||
screen->glDrawMesh(geometry, view, 3 * it.second->triangles().size());
|
screen->glDrawMesh(geometry, view, model, 3 * it.second->triangles().size());
|
||||||
free(geometry);
|
free(geometry);
|
||||||
|
free(model);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
free(view);
|
free(view);
|
||||||
|
|
|
@ -85,9 +85,13 @@ Matrix4x4 Matrix4x4::Translation(const Vec3D& v) {
|
||||||
t._arr[2][2] = 1.0;
|
t._arr[2][2] = 1.0;
|
||||||
t._arr[3][3] = 1.0;
|
t._arr[3][3] = 1.0;
|
||||||
|
|
||||||
t._arr[0][3] = v.x();
|
//t._arr[0][3] = v.x();
|
||||||
t._arr[1][3] = v.y();
|
//t._arr[1][3] = v.y();
|
||||||
t._arr[2][3] = v.z();
|
//t._arr[2][3] = v.z();
|
||||||
|
|
||||||
|
t._arr[3][0] = v.x();
|
||||||
|
t._arr[3][1] = v.y();
|
||||||
|
t._arr[3][2] = v.z();
|
||||||
|
|
||||||
return t;
|
return t;
|
||||||
}
|
}
|
||||||
|
@ -210,3 +214,15 @@ Matrix4x4 Matrix4x4::View(const Vec3D &left, const Vec3D &up, const Vec3D &lookA
|
||||||
|
|
||||||
return V;
|
return V;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Vec3D Matrix4x4::x() const {
|
||||||
|
return Vec3D(_arr[0][0], _arr[1][0],_arr[2][0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
Vec3D Matrix4x4::y() const {
|
||||||
|
return Vec3D(_arr[0][1], _arr[1][1],_arr[2][1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
Vec3D Matrix4x4::z() const {
|
||||||
|
return Vec3D(_arr[0][2], _arr[1][2],_arr[2][2]);
|
||||||
|
}
|
||||||
|
|
|
@ -21,6 +21,10 @@ public:
|
||||||
[[nodiscard]] Vec4D operator*(const Vec4D& point4D) const;
|
[[nodiscard]] Vec4D operator*(const Vec4D& point4D) const;
|
||||||
[[nodiscard]] Vec3D operator*(const Vec3D& vec) const;
|
[[nodiscard]] Vec3D operator*(const Vec3D& vec) const;
|
||||||
|
|
||||||
|
[[nodiscard]] Vec3D x() const;
|
||||||
|
[[nodiscard]] Vec3D y() const;
|
||||||
|
[[nodiscard]] Vec3D z() const;
|
||||||
|
|
||||||
// Any useful matrix (static methods)
|
// Any useful matrix (static methods)
|
||||||
Matrix4x4 static Identity();
|
Matrix4x4 static Identity();
|
||||||
Matrix4x4 static Zero();
|
Matrix4x4 static Zero();
|
||||||
|
|
|
@ -29,42 +29,17 @@ void Mesh::loadObj(const std::string& filename, const Vec3D& scale) {
|
||||||
this->scale(scale);
|
this->scale(scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
Mesh::Mesh(ObjectNameTag nameTag, const std::string& filename, const Vec3D& scale) : Object(nameTag) {
|
Mesh::Mesh(ObjectNameTag nameTag, const std::string& filename, const Vec3D& scale) : Object(std::move(nameTag)) {
|
||||||
loadObj(filename, scale);
|
loadObj(filename, scale);
|
||||||
}
|
}
|
||||||
|
|
||||||
Mesh::Mesh(ObjectNameTag nameTag, const vector<Triangle> &tries) : Object(nameTag), _tris(tries) {
|
Mesh::Mesh(ObjectNameTag nameTag, const vector<Triangle> &tries) : Object(std::move(nameTag)), _tris(tries) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Mesh Mesh::Obj(ObjectNameTag nameTag, const std::string& filename) {
|
Mesh Mesh::Obj(ObjectNameTag nameTag, const std::string& filename) {
|
||||||
return Mesh(std::move(nameTag), filename);
|
return Mesh(std::move(nameTag), filename);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Mesh::rotate(const Vec3D &r) {
|
|
||||||
Object::rotate(r);
|
|
||||||
*this *= Matrix4x4::Rotation(r);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Mesh::rotate(const Vec3D &v, double r) {
|
|
||||||
Object::rotate(v, r);
|
|
||||||
*this *= Matrix4x4::Rotation(v, r);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Mesh::scale(const Vec3D &s) {
|
|
||||||
Object::scale(s);
|
|
||||||
*this *= Matrix4x4::Scale(s);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Mesh::rotateRelativePoint(const Vec3D &s, const Vec3D &r) {
|
|
||||||
Object::rotateRelativePoint(s, r);
|
|
||||||
*this *= Matrix4x4::Rotation(r);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Mesh::rotateRelativePoint(const Vec3D &s, const Vec3D &v, double r) {
|
|
||||||
Object::rotateRelativePoint(s, v, r);
|
|
||||||
*this *= Matrix4x4::Rotation(v, r);
|
|
||||||
}
|
|
||||||
|
|
||||||
void Mesh::setColor(const sf::Color& c) {
|
void Mesh::setColor(const sf::Color& c) {
|
||||||
_color = c;
|
_color = c;
|
||||||
|
|
||||||
|
@ -78,7 +53,7 @@ void Mesh::setColor(const sf::Color& c) {
|
||||||
|
|
||||||
Mesh Mesh::LineTo(ObjectNameTag nameTag, const Vec3D& from, const Vec3D& to, double line_width, const sf::Color& color) {
|
Mesh Mesh::LineTo(ObjectNameTag nameTag, const Vec3D& from, const Vec3D& to, double line_width, const sf::Color& color) {
|
||||||
|
|
||||||
Mesh line(nameTag);
|
Mesh line(std::move(nameTag));
|
||||||
|
|
||||||
Vec3D v1 = (to - from).normalized();
|
Vec3D v1 = (to - from).normalized();
|
||||||
Vec3D v2 = from.cross(from + Vec3D{1, 0, 0}).normalized();
|
Vec3D v2 = from.cross(from + Vec3D{1, 0, 0}).normalized();
|
||||||
|
@ -115,10 +90,6 @@ Mesh Mesh::LineTo(ObjectNameTag nameTag, const Vec3D& from, const Vec3D& to, dou
|
||||||
return line;
|
return line;
|
||||||
}
|
}
|
||||||
|
|
||||||
Mesh::Mesh(const Mesh &mesh) : Object(mesh.name()), _tris(mesh._tris), _color(mesh._color), _visible(mesh._visible) {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
void Mesh::setTriangles(const vector<Triangle> &t) {
|
void Mesh::setTriangles(const vector<Triangle> &t) {
|
||||||
_tris.clear();
|
_tris.clear();
|
||||||
for (auto & tri : t) {
|
for (auto & tri : t) {
|
||||||
|
|
|
@ -21,7 +21,7 @@ private:
|
||||||
public:
|
public:
|
||||||
explicit Mesh(ObjectNameTag nameTag) : Object(std::move(nameTag)) {};
|
explicit Mesh(ObjectNameTag nameTag) : Object(std::move(nameTag)) {};
|
||||||
Mesh& operator=(const Mesh& mesh) = delete;
|
Mesh& operator=(const Mesh& mesh) = delete;
|
||||||
Mesh(const Mesh& mesh);
|
Mesh(const Mesh& mesh) = default;
|
||||||
|
|
||||||
explicit Mesh(ObjectNameTag nameTag, const std::vector<Triangle>& tries);
|
explicit Mesh(ObjectNameTag nameTag, const std::vector<Triangle>& tries);
|
||||||
explicit Mesh(ObjectNameTag nameTag, const std::string& filename, const Vec3D& scale = Vec3D{1, 1, 1});
|
explicit Mesh(ObjectNameTag nameTag, const std::string& filename, const Vec3D& scale = Vec3D{1, 1, 1});
|
||||||
|
@ -32,16 +32,6 @@ public:
|
||||||
[[nodiscard]] std::vector<Triangle>& triangles() { return _tris; }
|
[[nodiscard]] std::vector<Triangle>& triangles() { return _tris; }
|
||||||
void setTriangles(const std::vector<Triangle>& t);
|
void setTriangles(const std::vector<Triangle>& t);
|
||||||
|
|
||||||
// Translate body
|
|
||||||
// Rotate body around XYZ axes
|
|
||||||
void rotate(const Vec3D& r) override;
|
|
||||||
// Rotate body around normalised vector 'v' by 'r' radians
|
|
||||||
void rotate(const Vec3D& v, double r) override;
|
|
||||||
// Rotate body around XYZ by (r._x, r._y, r.z) radians relative val 'point4D'
|
|
||||||
void rotateRelativePoint(const Vec3D& point, const Vec3D& r) override;
|
|
||||||
// Rotate body around normalised vector 'v' by 'r' radians relative val 'point4D'
|
|
||||||
void rotateRelativePoint(const Vec3D& point4D, const Vec3D& v, double r) override;
|
|
||||||
void scale(const Vec3D& s) override;
|
|
||||||
[[nodiscard]] int size() const { return _tris.size()*3; }
|
[[nodiscard]] int size() const { return _tris.size()*3; }
|
||||||
|
|
||||||
[[nodiscard]] sf::Color color() const { return _color; }
|
[[nodiscard]] sf::Color color() const { return _color; }
|
||||||
|
|
|
@ -7,6 +7,7 @@
|
||||||
#include "utils/Log.h"
|
#include "utils/Log.h"
|
||||||
|
|
||||||
void Object::translate(const Vec3D &dv) {
|
void Object::translate(const Vec3D &dv) {
|
||||||
|
|
||||||
_position = _position + dv;
|
_position = _position + dv;
|
||||||
|
|
||||||
for(auto &[attachedName, attachedObject] : _attachedObjects) {
|
for(auto &[attachedName, attachedObject] : _attachedObjects) {
|
||||||
|
@ -17,6 +18,9 @@ void Object::translate(const Vec3D &dv) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Object::scale(const Vec3D &s) {
|
void Object::scale(const Vec3D &s) {
|
||||||
|
|
||||||
|
_transformMatrix = Matrix4x4::Scale(s)*_transformMatrix;
|
||||||
|
|
||||||
for(auto &[attachedName, attachedObject] : _attachedObjects) {
|
for(auto &[attachedName, attachedObject] : _attachedObjects) {
|
||||||
if(!attachedObject.expired()) {
|
if(!attachedObject.expired()) {
|
||||||
attachedObject.lock()->scale(s);
|
attachedObject.lock()->scale(s);
|
||||||
|
@ -29,9 +33,7 @@ void Object::rotate(const Vec3D &r) {
|
||||||
|
|
||||||
Matrix4x4 rotationMatrix = Matrix4x4::RotationZ(r.z())*Matrix4x4::RotationY(r.y())*Matrix4x4::RotationX(r.z());
|
Matrix4x4 rotationMatrix = Matrix4x4::RotationZ(r.z())*Matrix4x4::RotationY(r.y())*Matrix4x4::RotationX(r.z());
|
||||||
|
|
||||||
_left = rotationMatrix * _left;
|
_transformMatrix = rotationMatrix*_transformMatrix;
|
||||||
_up = rotationMatrix * _up;
|
|
||||||
_lookAt = rotationMatrix * _lookAt;
|
|
||||||
|
|
||||||
for(auto &[attachedName, attachedObject] : _attachedObjects) {
|
for(auto &[attachedName, attachedObject] : _attachedObjects) {
|
||||||
if(!attachedObject.expired()) {
|
if(!attachedObject.expired()) {
|
||||||
|
@ -43,9 +45,7 @@ void Object::rotate(const Vec3D &r) {
|
||||||
void Object::rotate(const Vec3D &v, double rv) {
|
void Object::rotate(const Vec3D &v, double rv) {
|
||||||
Matrix4x4 rotationMatrix = Matrix4x4::Rotation(v, rv);
|
Matrix4x4 rotationMatrix = Matrix4x4::Rotation(v, rv);
|
||||||
|
|
||||||
_left = rotationMatrix * _left;
|
_transformMatrix = rotationMatrix*_transformMatrix;
|
||||||
_up = rotationMatrix * _up;
|
|
||||||
_lookAt = rotationMatrix * _lookAt;
|
|
||||||
|
|
||||||
for(auto &[attachedName, attachedObject] : _attachedObjects) {
|
for(auto &[attachedName, attachedObject] : _attachedObjects) {
|
||||||
if(!attachedObject.expired()) {
|
if(!attachedObject.expired()) {
|
||||||
|
@ -58,15 +58,13 @@ void Object::rotateRelativePoint(const Vec3D &s, const Vec3D &r) {
|
||||||
_angle = _angle + r;
|
_angle = _angle + r;
|
||||||
|
|
||||||
// Translate XYZ by vector r1
|
// Translate XYZ by vector r1
|
||||||
Vec3D r1(_position - s);
|
Vec3D r1(position() - s);
|
||||||
|
|
||||||
// In translated coordinate system we rotate body and position
|
// In translated coordinate system we rotate body and position
|
||||||
Matrix4x4 rotationMatrix = Matrix4x4::Rotation(r);
|
Matrix4x4 rotationMatrix = Matrix4x4::Rotation(r);
|
||||||
Vec3D r2(rotationMatrix*r1);
|
Vec3D r2(rotationMatrix*r1);
|
||||||
|
|
||||||
_left = rotationMatrix * _left;
|
_transformMatrix = rotationMatrix*_transformMatrix;
|
||||||
_up = rotationMatrix * _up;
|
|
||||||
_lookAt = rotationMatrix * _lookAt;
|
|
||||||
|
|
||||||
// After rotation we translate XYZ by vector -r2 and recalculate position
|
// After rotation we translate XYZ by vector -r2 and recalculate position
|
||||||
_position = s + r2;
|
_position = s + r2;
|
||||||
|
@ -80,14 +78,12 @@ void Object::rotateRelativePoint(const Vec3D &s, const Vec3D &r) {
|
||||||
|
|
||||||
void Object::rotateRelativePoint(const Vec3D &s, const Vec3D &v, double r) {
|
void Object::rotateRelativePoint(const Vec3D &s, const Vec3D &v, double r) {
|
||||||
// Translate XYZ by vector r1
|
// Translate XYZ by vector r1
|
||||||
Vec3D r1(_position - s);
|
Vec3D r1(position() - s);
|
||||||
// In translated coordinate system we rotate body and position
|
// In translated coordinate system we rotate body and position
|
||||||
Matrix4x4 rotationMatrix = Matrix4x4::Rotation(v, r);
|
Matrix4x4 rotationMatrix = Matrix4x4::Rotation(v, r);
|
||||||
Vec3D r2 = rotationMatrix*r1;
|
Vec3D r2 = rotationMatrix*r1;
|
||||||
|
|
||||||
_left = rotationMatrix * _left;
|
_transformMatrix = rotationMatrix*_transformMatrix;
|
||||||
_up = rotationMatrix * _up;
|
|
||||||
_lookAt = rotationMatrix * _lookAt;
|
|
||||||
|
|
||||||
// After rotation we translate XYZ by vector -r2 and recalculate position
|
// After rotation we translate XYZ by vector -r2 and recalculate position
|
||||||
_position = s + r2;
|
_position = s + r2;
|
||||||
|
@ -104,7 +100,7 @@ void Object::rotateLeft(double rl) {
|
||||||
_angleLeftUpLookAt.y(),
|
_angleLeftUpLookAt.y(),
|
||||||
_angleLeftUpLookAt.z()};
|
_angleLeftUpLookAt.z()};
|
||||||
|
|
||||||
rotate(Vec3D(_left), rl);
|
rotate(left(), rl);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Object::rotateUp(double ru) {
|
void Object::rotateUp(double ru) {
|
||||||
|
@ -112,18 +108,18 @@ void Object::rotateUp(double ru) {
|
||||||
_angleLeftUpLookAt.y() + ru,
|
_angleLeftUpLookAt.y() + ru,
|
||||||
_angleLeftUpLookAt.z()};
|
_angleLeftUpLookAt.z()};
|
||||||
|
|
||||||
rotate(Vec3D(_up), ru);
|
rotate(up(), ru);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Object::rotateLookAt(double rlAt) {
|
void Object::rotateLookAt(double rlAt) {
|
||||||
_angleLeftUpLookAt = Vec3D{_angleLeftUpLookAt.x(),
|
_angleLeftUpLookAt = Vec3D{_angleLeftUpLookAt.x(),
|
||||||
_angleLeftUpLookAt.y(),
|
_angleLeftUpLookAt.y(),
|
||||||
_angleLeftUpLookAt.z() + rlAt};
|
_angleLeftUpLookAt.z() + rlAt};
|
||||||
rotate(Vec3D(_lookAt), rlAt);
|
rotate(lookAt(), rlAt);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Object::translateToPoint(const Vec3D &point) {
|
void Object::translateToPoint(const Vec3D &point) {
|
||||||
translate(point - _position);
|
translate(point - position());
|
||||||
}
|
}
|
||||||
|
|
||||||
void Object::rotateToAngle(const Vec3D &v) {
|
void Object::rotateToAngle(const Vec3D &v) {
|
||||||
|
@ -162,6 +158,59 @@ void Object::unattach(const ObjectNameTag& tag) {
|
||||||
_attachedObjects.erase(tag);
|
_attachedObjects.erase(tag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// OpenGL function
|
||||||
|
GLfloat* Object::glView() const {
|
||||||
|
auto* v = (GLfloat*)malloc(4*4*sizeof(GLfloat));
|
||||||
|
|
||||||
|
v[0] = -(GLfloat)left().x();
|
||||||
|
v[4] = -(GLfloat)left().y();
|
||||||
|
v[8] = -(GLfloat)left().z();
|
||||||
|
v[12] = (GLfloat)position().dot(left());
|
||||||
|
|
||||||
|
v[1] = (GLfloat)up().x();
|
||||||
|
v[5] = (GLfloat)up().y();
|
||||||
|
v[9] = (GLfloat)up().z();
|
||||||
|
v[13] = -(GLfloat)position().dot(up());
|
||||||
|
|
||||||
|
v[2] = -(GLfloat)lookAt().x();
|
||||||
|
v[6] = -(GLfloat)lookAt().y();
|
||||||
|
v[10] = -(GLfloat)lookAt().z();
|
||||||
|
v[14] = (GLfloat)position().dot(lookAt());
|
||||||
|
|
||||||
|
v[3] = (GLfloat)0.0f;
|
||||||
|
v[7] = (GLfloat)0.0f;
|
||||||
|
v[11] = (GLfloat)0.0f;
|
||||||
|
v[15] = (GLfloat)1.0f;
|
||||||
|
|
||||||
|
return v;
|
||||||
|
}
|
||||||
|
|
||||||
|
GLfloat* Object::glModel() const {
|
||||||
|
auto* m = (GLfloat*)malloc(4*4*sizeof(GLfloat));
|
||||||
|
|
||||||
|
m[0] = (GLfloat)left().x();
|
||||||
|
m[4] = (GLfloat)up().x();
|
||||||
|
m[8] = (GLfloat)lookAt().x();
|
||||||
|
m[12] = (GLfloat)position().x();
|
||||||
|
|
||||||
|
m[1] = (GLfloat)left().y();
|
||||||
|
m[5] = (GLfloat)up().y();
|
||||||
|
m[9] = (GLfloat)lookAt().y();
|
||||||
|
m[13] = (GLfloat)position().y();
|
||||||
|
|
||||||
|
m[2] = (GLfloat)left().z();
|
||||||
|
m[6] = (GLfloat)up().z();
|
||||||
|
m[10] =(GLfloat)lookAt().z();
|
||||||
|
m[14] = (GLfloat)position().z();
|
||||||
|
|
||||||
|
m[3] = (GLfloat)0.0f;
|
||||||
|
m[7] = (GLfloat)0.0f;
|
||||||
|
m[11] = (GLfloat)0.0f;
|
||||||
|
m[15] = (GLfloat)1.0f;
|
||||||
|
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
Object::~Object() {
|
Object::~Object() {
|
||||||
_attachedObjects.clear();
|
_attachedObjects.clear();
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,6 +10,8 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
#include "Matrix4x4.h"
|
||||||
|
#include <SFML/OpenGL.hpp>
|
||||||
|
|
||||||
class ObjectNameTag final {
|
class ObjectNameTag final {
|
||||||
private:
|
private:
|
||||||
|
@ -28,10 +30,7 @@ private:
|
||||||
bool checkIfAttached(Object* obj);
|
bool checkIfAttached(Object* obj);
|
||||||
const ObjectNameTag _nameTag;
|
const ObjectNameTag _nameTag;
|
||||||
|
|
||||||
protected:
|
Matrix4x4 _transformMatrix = Matrix4x4::Identity();
|
||||||
Vec3D _left {1, 0, 0}; // internal X
|
|
||||||
Vec3D _up {0, 1, 0}; // internal Y
|
|
||||||
Vec3D _lookAt {0, 0, 1}; // internal Z
|
|
||||||
|
|
||||||
std::map<ObjectNameTag, std::weak_ptr<Object>> _attachedObjects;
|
std::map<ObjectNameTag, std::weak_ptr<Object>> _attachedObjects;
|
||||||
|
|
||||||
|
@ -39,33 +38,40 @@ protected:
|
||||||
Vec3D _angle {0, 0, 0};
|
Vec3D _angle {0, 0, 0};
|
||||||
Vec3D _angleLeftUpLookAt{0, 0, 0};
|
Vec3D _angleLeftUpLookAt{0, 0, 0};
|
||||||
public:
|
public:
|
||||||
Object(ObjectNameTag nameTag) : _nameTag(nameTag) {};
|
explicit Object(ObjectNameTag nameTag) : _nameTag(std::move(nameTag)) {};
|
||||||
|
explicit Object(const Object& object) : _nameTag(object.name()), _transformMatrix(object.model()) {};
|
||||||
|
|
||||||
virtual void translate(const Vec3D& dv);
|
void translate(const Vec3D& dv);
|
||||||
virtual void translateToPoint(const Vec3D& point);
|
void translateToPoint(const Vec3D& point);
|
||||||
virtual void scale(const Vec3D& s);
|
void scale(const Vec3D& s);
|
||||||
virtual void rotate(const Vec3D& r);
|
void rotate(const Vec3D& r);
|
||||||
virtual void rotate(const Vec3D& v, double rv);
|
void rotate(const Vec3D& v, double rv);
|
||||||
virtual void rotateToAngle(const Vec3D& v);
|
void rotateToAngle(const Vec3D& v);
|
||||||
virtual void rotateRelativePoint(const Vec3D& s, const Vec3D& r);
|
void rotateRelativePoint(const Vec3D& s, const Vec3D& r);
|
||||||
virtual void rotateRelativePoint(const Vec3D& s, const Vec3D& v, double r);
|
void rotateRelativePoint(const Vec3D& s, const Vec3D& v, double r);
|
||||||
void rotateLeft(double rl);
|
void rotateLeft(double rl);
|
||||||
void rotateUp(double ru);
|
void rotateUp(double ru);
|
||||||
void rotateLookAt(double rlAt);
|
void rotateLookAt(double rlAt);
|
||||||
|
|
||||||
[[nodiscard]] Vec3D position() const { return _position; }
|
[[nodiscard]] Vec3D left() const { return _transformMatrix.x(); }
|
||||||
|
[[nodiscard]] Vec3D up() const { return _transformMatrix.y(); }
|
||||||
|
[[nodiscard]] Vec3D lookAt() const { return _transformMatrix.z(); }
|
||||||
|
[[nodiscard]] Vec3D position() const { return _position; }
|
||||||
|
|
||||||
[[nodiscard]] Vec3D angle() const { return _angle; }
|
[[nodiscard]] Vec3D angle() const { return _angle; }
|
||||||
[[nodiscard]] Vec3D angleLeftUpLookAt() const { return _angleLeftUpLookAt; }
|
[[nodiscard]] Vec3D angleLeftUpLookAt() const { return _angleLeftUpLookAt; }
|
||||||
|
|
||||||
[[nodiscard]] Vec3D left() const { return _left; }
|
|
||||||
[[nodiscard]] Vec3D up() const { return _up; }
|
|
||||||
[[nodiscard]] Vec3D lookAt() const { return _lookAt; }
|
|
||||||
|
|
||||||
void attach(std::shared_ptr<Object> object);
|
void attach(std::shared_ptr<Object> object);
|
||||||
void unattach(const ObjectNameTag& tag);
|
void unattach(const ObjectNameTag& tag);
|
||||||
std::shared_ptr<Object> attached(const ObjectNameTag& tag);
|
std::shared_ptr<Object> attached(const ObjectNameTag& tag);
|
||||||
|
|
||||||
ObjectNameTag name() const { return _nameTag; }
|
[[nodiscard]] ObjectNameTag name() const { return _nameTag; }
|
||||||
|
|
||||||
|
[[nodiscard]] Matrix4x4 model() const { return _transformMatrix; }
|
||||||
|
|
||||||
|
// OpenGL function
|
||||||
|
[[nodiscard]] GLfloat* glModel() const;
|
||||||
|
[[nodiscard]] GLfloat* glView() const;
|
||||||
|
|
||||||
virtual ~Object();
|
virtual ~Object();
|
||||||
};
|
};
|
||||||
|
|
|
@ -10,9 +10,12 @@
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
|
||||||
ResourceManager* ResourceManager::_instance = nullptr;
|
ResourceManager* ResourceManager::_instance = nullptr;
|
||||||
|
bool ResourceManager::_validInstance = false;
|
||||||
|
|
||||||
|
|
||||||
void ResourceManager::init() {
|
void ResourceManager::init() {
|
||||||
_instance = new ResourceManager();
|
_instance = new ResourceManager();
|
||||||
|
_validInstance = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResourceManager::unloadTextures() {
|
void ResourceManager::unloadTextures() {
|
||||||
|
@ -41,6 +44,10 @@ void ResourceManager::unloadObjects() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void ResourceManager::unloadAllResources() {
|
void ResourceManager::unloadAllResources() {
|
||||||
|
if(!_validInstance) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
unloadTextures();
|
unloadTextures();
|
||||||
unloadSoundBuffers();
|
unloadSoundBuffers();
|
||||||
unloadFonts();
|
unloadFonts();
|
||||||
|
@ -49,12 +56,12 @@ void ResourceManager::unloadAllResources() {
|
||||||
|
|
||||||
void ResourceManager::free() {
|
void ResourceManager::free() {
|
||||||
unloadAllResources();
|
unloadAllResources();
|
||||||
|
_validInstance = false;
|
||||||
delete _instance;
|
delete _instance;
|
||||||
_instance = nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<sf::Texture> ResourceManager::loadTexture(const std::string& filename) {
|
std::shared_ptr<sf::Texture> ResourceManager::loadTexture(const std::string& filename) {
|
||||||
if(!_instance) {
|
if(!_validInstance) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -78,7 +85,7 @@ std::shared_ptr<sf::Texture> ResourceManager::loadTexture(const std::string& fil
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<sf::SoundBuffer> ResourceManager::loadSoundBuffer(const std::string& filename) {
|
std::shared_ptr<sf::SoundBuffer> ResourceManager::loadSoundBuffer(const std::string& filename) {
|
||||||
if(!_instance) {
|
if(!_validInstance) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -101,7 +108,7 @@ std::shared_ptr<sf::SoundBuffer> ResourceManager::loadSoundBuffer(const std::str
|
||||||
}
|
}
|
||||||
|
|
||||||
std::shared_ptr<sf::Font> ResourceManager::loadFont(const std::string& filename) {
|
std::shared_ptr<sf::Font> ResourceManager::loadFont(const std::string& filename) {
|
||||||
if(!_instance) {
|
if(!_validInstance) {
|
||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -124,9 +131,14 @@ std::shared_ptr<sf::Font> ResourceManager::loadFont(const std::string& filename)
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::shared_ptr<Mesh>> ResourceManager::loadObjects(const std::string &filename) {
|
std::vector<std::shared_ptr<Mesh>> ResourceManager::loadObjects(const std::string &filename) {
|
||||||
|
|
||||||
std::vector<std::shared_ptr<Mesh>> objects{};
|
std::vector<std::shared_ptr<Mesh>> objects{};
|
||||||
std::map<std::string, sf::Color> maters{};
|
std::map<std::string, sf::Color> maters{};
|
||||||
|
|
||||||
|
if(!_validInstance) {
|
||||||
|
return objects;
|
||||||
|
}
|
||||||
|
|
||||||
// If objects is already loaded - return pointer to it
|
// If objects is already loaded - return pointer to it
|
||||||
auto it = _instance->_objects.find(filename);
|
auto it = _instance->_objects.find(filename);
|
||||||
if (it != _instance->_objects.end()) {
|
if (it != _instance->_objects.end()) {
|
||||||
|
|
|
@ -18,18 +18,19 @@ private:
|
||||||
std::map<std::string, std::vector<std::shared_ptr<Mesh>>> _objects;
|
std::map<std::string, std::vector<std::shared_ptr<Mesh>>> _objects;
|
||||||
|
|
||||||
static ResourceManager* _instance;
|
static ResourceManager* _instance;
|
||||||
|
static bool _validInstance;
|
||||||
|
|
||||||
ResourceManager() = default;
|
ResourceManager() = default;
|
||||||
public:
|
|
||||||
ResourceManager(const ResourceManager&) = delete;
|
|
||||||
ResourceManager& operator=(ResourceManager&) = delete;
|
|
||||||
|
|
||||||
// Unloads all currently loaded textures.
|
// Unloads all currently loaded textures.
|
||||||
static void unloadObjects();
|
static void unloadObjects();
|
||||||
static void unloadTextures();
|
static void unloadTextures();
|
||||||
static void unloadSoundBuffers();
|
static void unloadSoundBuffers();
|
||||||
static void unloadFonts();
|
static void unloadFonts();
|
||||||
|
|
||||||
|
public:
|
||||||
|
ResourceManager(const ResourceManager&) = delete;
|
||||||
|
ResourceManager& operator=(ResourceManager&) = delete;
|
||||||
|
|
||||||
static void unloadAllResources();
|
static void unloadAllResources();
|
||||||
|
|
||||||
static void init();
|
static void init();
|
||||||
|
|
|
@ -135,7 +135,7 @@ void Screen::drawText(const sf::Text &text) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// OpenGL functions
|
// OpenGL functions
|
||||||
void Screen::glDrawMesh(GLfloat* geometry, GLfloat* view, size_t count) {
|
void Screen::glDrawMesh(GLfloat* geometry, GLfloat* view, GLfloat* model, size_t count) {
|
||||||
// OpenGL:
|
// OpenGL:
|
||||||
// Make the window the active window for OpenGL calls
|
// Make the window the active window for OpenGL calls
|
||||||
_window->setActive(true);
|
_window->setActive(true);
|
||||||
|
@ -180,6 +180,7 @@ void Screen::glDrawMesh(GLfloat* geometry, GLfloat* view, size_t count) {
|
||||||
glLoadIdentity();
|
glLoadIdentity();
|
||||||
|
|
||||||
glLoadMatrixf(view);
|
glLoadMatrixf(view);
|
||||||
|
glMultMatrixf(model);
|
||||||
|
|
||||||
// Draw the mesh
|
// Draw the mesh
|
||||||
glDrawArrays(GL_TRIANGLES, 0, count);
|
glDrawArrays(GL_TRIANGLES, 0, count);
|
||||||
|
@ -195,9 +196,10 @@ GLfloat* Screen::glMeshToGLfloatArray(std::shared_ptr<Mesh> mesh, const Vec3D& c
|
||||||
auto* geometry = (GLfloat*)malloc(7*3*triangles.size()*sizeof(GLfloat));
|
auto* geometry = (GLfloat*)malloc(7*3*triangles.size()*sizeof(GLfloat));
|
||||||
|
|
||||||
for(int i = 0; i < triangles.size(); i++) {
|
for(int i = 0; i < triangles.size(); i++) {
|
||||||
|
|
||||||
int stride = 21*i;
|
int stride = 21*i;
|
||||||
|
|
||||||
double dot = triangles[i].norm().dot((pos + Vec3D(triangles[i][0]) - cameraPosition).normalized());
|
double dot = triangles[i].norm().dot((pos + mesh->model()*Vec3D(triangles[i][0]) - cameraPosition).normalized());
|
||||||
sf::Color color = triangles[i].color();
|
sf::Color color = triangles[i].color();
|
||||||
sf::Color ambientColor = sf::Color((sf::Uint8)(color.r * (0.3 * std::abs(dot) + 0.7)),
|
sf::Color ambientColor = sf::Color((sf::Uint8)(color.r * (0.3 * std::abs(dot) + 0.7)),
|
||||||
(sf::Uint8)(color.g * (0.3 * std::abs(dot) + 0.7)),
|
(sf::Uint8)(color.g * (0.3 * std::abs(dot) + 0.7)),
|
||||||
|
@ -205,27 +207,27 @@ GLfloat* Screen::glMeshToGLfloatArray(std::shared_ptr<Mesh> mesh, const Vec3D& c
|
||||||
(sf::Uint8)color.a);
|
(sf::Uint8)color.a);
|
||||||
|
|
||||||
|
|
||||||
geometry[stride + 0] = (GLfloat)triangles[i][0].x() + pos.x();
|
geometry[stride + 0] = (GLfloat)triangles[i][0].x();
|
||||||
geometry[stride + 1] = (GLfloat)triangles[i][0].y() + pos.y();
|
geometry[stride + 1] = (GLfloat)triangles[i][0].y();
|
||||||
geometry[stride + 2] = (GLfloat)triangles[i][0].z() + pos.z();
|
geometry[stride + 2] = (GLfloat)triangles[i][0].z();
|
||||||
|
|
||||||
geometry[stride + 3] = (GLfloat)ambientColor.r/255.0f;
|
geometry[stride + 3] = (GLfloat)ambientColor.r/255.0f;
|
||||||
geometry[stride + 4] = (GLfloat)ambientColor.g/255.0f;
|
geometry[stride + 4] = (GLfloat)ambientColor.g/255.0f;
|
||||||
geometry[stride + 5] = (GLfloat)ambientColor.b/255.0f;
|
geometry[stride + 5] = (GLfloat)ambientColor.b/255.0f;
|
||||||
geometry[stride + 6] = (GLfloat)ambientColor.a/255.0f;
|
geometry[stride + 6] = (GLfloat)ambientColor.a/255.0f;
|
||||||
|
|
||||||
geometry[stride + 7] = (GLfloat)triangles[i][1].x() + pos.x();
|
geometry[stride + 7] = (GLfloat)triangles[i][1].x();
|
||||||
geometry[stride + 8] = (GLfloat)triangles[i][1].y() + pos.y();
|
geometry[stride + 8] = (GLfloat)triangles[i][1].y();
|
||||||
geometry[stride + 9] = (GLfloat)triangles[i][1].z() + pos.z();
|
geometry[stride + 9] = (GLfloat)triangles[i][1].z();
|
||||||
|
|
||||||
geometry[stride + 10] = (GLfloat)ambientColor.r/255.0f;
|
geometry[stride + 10] = (GLfloat)ambientColor.r/255.0f;
|
||||||
geometry[stride + 11] = (GLfloat)ambientColor.g/255.0f;
|
geometry[stride + 11] = (GLfloat)ambientColor.g/255.0f;
|
||||||
geometry[stride + 12] = (GLfloat)ambientColor.b/255.0f;
|
geometry[stride + 12] = (GLfloat)ambientColor.b/255.0f;
|
||||||
geometry[stride + 13] = (GLfloat)ambientColor.a/255.0f;
|
geometry[stride + 13] = (GLfloat)ambientColor.a/255.0f;
|
||||||
|
|
||||||
geometry[stride + 14] = (GLfloat)triangles[i][2].x() + pos.x();
|
geometry[stride + 14] = (GLfloat)triangles[i][2].x();
|
||||||
geometry[stride + 15] = (GLfloat)triangles[i][2].y() + pos.y();
|
geometry[stride + 15] = (GLfloat)triangles[i][2].y();
|
||||||
geometry[stride + 16] = (GLfloat)triangles[i][2].z() + pos.z();
|
geometry[stride + 16] = (GLfloat)triangles[i][2].z();
|
||||||
|
|
||||||
geometry[stride + 17] = (GLfloat)ambientColor.r/255.0f;
|
geometry[stride + 17] = (GLfloat)ambientColor.r/255.0f;
|
||||||
geometry[stride + 18] = (GLfloat)ambientColor.g/255.0f;
|
geometry[stride + 18] = (GLfloat)ambientColor.g/255.0f;
|
||||||
|
|
|
@ -53,7 +53,7 @@ public:
|
||||||
void setMouseCursorVisible(bool visible);
|
void setMouseCursorVisible(bool visible);
|
||||||
|
|
||||||
// OpenGL functions
|
// OpenGL functions
|
||||||
void glDrawMesh(GLfloat* geometry, GLfloat* view, size_t count);
|
void glDrawMesh(GLfloat* geometry, GLfloat* view, GLfloat* model, size_t count);
|
||||||
static GLfloat* glMeshToGLfloatArray(std::shared_ptr<Mesh> mesh, const Vec3D& cameraPosition);
|
static GLfloat* glMeshToGLfloatArray(std::shared_ptr<Mesh> mesh, const Vec3D& cameraPosition);
|
||||||
|
|
||||||
[[nodiscard]] std::shared_ptr<sf::RenderWindow> renderWindow() { return _window; }
|
[[nodiscard]] std::shared_ptr<sf::RenderWindow> renderWindow() { return _window; }
|
||||||
|
|
|
@ -6,13 +6,16 @@
|
||||||
#include "ResourceManager.h"
|
#include "ResourceManager.h"
|
||||||
|
|
||||||
SoundController* SoundController::_instance = nullptr;
|
SoundController* SoundController::_instance = nullptr;
|
||||||
|
bool SoundController::_validInstance = false;
|
||||||
|
|
||||||
|
|
||||||
void SoundController::init() {
|
void SoundController::init() {
|
||||||
_instance = new SoundController();
|
_instance = new SoundController();
|
||||||
|
_validInstance = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SoundController::playSound(const SoundTag& soundTag, const std::string& filename) {
|
void SoundController::playSound(const SoundTag& soundTag, const std::string& filename) {
|
||||||
if(!_instance) {
|
if(!_validInstance) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,7 +25,7 @@ void SoundController::playSound(const SoundTag& soundTag, const std::string& fil
|
||||||
}
|
}
|
||||||
|
|
||||||
void SoundController::pauseSound(const SoundTag& soundTag) {
|
void SoundController::pauseSound(const SoundTag& soundTag) {
|
||||||
if(!_instance) {
|
if(!_validInstance) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -32,7 +35,7 @@ void SoundController::pauseSound(const SoundTag& soundTag) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void SoundController::stopSound(const SoundTag& soundTag) {
|
void SoundController::stopSound(const SoundTag& soundTag) {
|
||||||
if(!_instance) {
|
if(!_validInstance) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -43,7 +46,7 @@ void SoundController::stopSound(const SoundTag& soundTag) {
|
||||||
}
|
}
|
||||||
|
|
||||||
sf::Sound::Status SoundController::getStatus(const SoundTag& soundTag) {
|
sf::Sound::Status SoundController::getStatus(const SoundTag& soundTag) {
|
||||||
if(_instance == nullptr) {
|
if(!_validInstance) {
|
||||||
return sf::Sound::Status::Stopped;
|
return sf::Sound::Status::Stopped;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -56,11 +59,13 @@ sf::Sound::Status SoundController::getStatus(const SoundTag& soundTag) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void SoundController::free() {
|
void SoundController::free() {
|
||||||
for(auto& [soundTag, sound] : _instance->_sounds) {
|
if(_validInstance) {
|
||||||
sound.stop();
|
for(auto& [soundTag, sound] : _instance->_sounds) {
|
||||||
|
sound.stop();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
_instance->_sounds.clear();
|
_instance->_sounds.clear();
|
||||||
|
_validInstance = false;
|
||||||
delete _instance;
|
delete _instance;
|
||||||
_instance = nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,6 +26,7 @@ private:
|
||||||
std::map<SoundTag, sf::Sound> _sounds;
|
std::map<SoundTag, sf::Sound> _sounds;
|
||||||
|
|
||||||
static SoundController* _instance;
|
static SoundController* _instance;
|
||||||
|
static bool _validInstance;
|
||||||
|
|
||||||
SoundController() = default;
|
SoundController() = default;
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -44,6 +44,7 @@ IntersectionInformation World::rayCast(const Vec3D& from, const Vec3D& to, const
|
||||||
for (auto& escapeTag : tagsToSkip) {
|
for (auto& escapeTag : tagsToSkip) {
|
||||||
if (name.str().find(escapeTag) != std::string::npos) {
|
if (name.str().find(escapeTag) != std::string::npos) {
|
||||||
escapeThisBody = true;
|
escapeThisBody = true;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if(escapeThisBody) {
|
if(escapeThisBody) {
|
||||||
|
@ -51,7 +52,7 @@ IntersectionInformation World::rayCast(const Vec3D& from, const Vec3D& to, const
|
||||||
}
|
}
|
||||||
|
|
||||||
for(auto& tri : body->triangles()) {
|
for(auto& tri : body->triangles()) {
|
||||||
Triangle tri_translated(tri[0] + body->position().makePoint4D(), tri[1] + body->position().makePoint4D(), tri[2] + body->position().makePoint4D());
|
Triangle tri_translated(body->model()*tri[0] + body->position().makePoint4D(), body->model()*tri[1] + body->position().makePoint4D(), body->model()*tri[2] + body->position().makePoint4D());
|
||||||
|
|
||||||
Plane plane(tri_translated);
|
Plane plane(tri_translated);
|
||||||
auto intersection = plane.intersection(from, to);
|
auto intersection = plane.intersection(from, to);
|
||||||
|
|
|
@ -7,13 +7,15 @@
|
||||||
#include "Timeline.h"
|
#include "Timeline.h"
|
||||||
|
|
||||||
Timeline* Timeline::_instance = nullptr;
|
Timeline* Timeline::_instance = nullptr;
|
||||||
|
bool Timeline::_validInstance = false;
|
||||||
|
|
||||||
void Timeline::init() {
|
void Timeline::init() {
|
||||||
_instance = new Timeline();
|
_instance = new Timeline();
|
||||||
|
_validInstance = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Timeline::animate(const AnimationListTag& listName, Animation* anim) {
|
void Timeline::animate(const AnimationListTag& listName, Animation* anim) {
|
||||||
if(!_instance) {
|
if(!_validInstance) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -21,7 +23,7 @@ void Timeline::animate(const AnimationListTag& listName, Animation* anim) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Timeline::deleteAllAnimations() {
|
void Timeline::deleteAllAnimations() {
|
||||||
if(!_instance) {
|
if(!_validInstance) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,7 +38,7 @@ void Timeline::deleteAllAnimations() {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Timeline::deleteAnimationList(const AnimationListTag& listName) {
|
void Timeline::deleteAnimationList(const AnimationListTag& listName) {
|
||||||
if(!_instance) {
|
if(!_validInstance) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,7 +47,7 @@ void Timeline::deleteAnimationList(const AnimationListTag& listName) {
|
||||||
}
|
}
|
||||||
|
|
||||||
[[nodiscard]] bool Timeline::isInAnimList(const AnimationListTag& listName) {
|
[[nodiscard]] bool Timeline::isInAnimList(const AnimationListTag& listName) {
|
||||||
if(!_instance) {
|
if(!_validInstance) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -53,7 +55,7 @@ void Timeline::deleteAnimationList(const AnimationListTag& listName) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Timeline::update() {
|
void Timeline::update() {
|
||||||
if(!_instance) {
|
if(!_validInstance) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -85,7 +87,7 @@ void Timeline::update() {
|
||||||
|
|
||||||
void Timeline::free() {
|
void Timeline::free() {
|
||||||
Timeline::deleteAllAnimations();
|
Timeline::deleteAllAnimations();
|
||||||
|
_validInstance = false;
|
||||||
|
|
||||||
delete _instance;
|
delete _instance;
|
||||||
_instance = nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -25,6 +25,7 @@ private:
|
||||||
std::map<AnimationListTag, std::list<Animation*>> _animations;
|
std::map<AnimationListTag, std::list<Animation*>> _animations;
|
||||||
|
|
||||||
static Timeline* _instance;
|
static Timeline* _instance;
|
||||||
|
static bool _validInstance;
|
||||||
|
|
||||||
Timeline() = default;
|
Timeline() = default;
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -20,7 +20,7 @@ Vec3D RigidBody::_findFurthestPoint(const Vec3D& direction) {
|
||||||
|
|
||||||
for(auto& tri : triangles()){
|
for(auto& tri : triangles()){
|
||||||
for(int i = 0; i < 3; i++){
|
for(int i = 0; i < 3; i++){
|
||||||
Vec3D point = Vec3D(tri[i]) + position();
|
Vec3D point = model()*Vec3D(tri[i]) + position();
|
||||||
|
|
||||||
double distance = point.dot(direction.normalized());
|
double distance = point.dot(direction.normalized());
|
||||||
if(distance > maxDistance) {
|
if(distance > maxDistance) {
|
||||||
|
|
|
@ -56,6 +56,7 @@ protected:
|
||||||
|
|
||||||
public:
|
public:
|
||||||
explicit RigidBody(ObjectNameTag nameTag) : Mesh(std::move(nameTag)) {};
|
explicit RigidBody(ObjectNameTag nameTag) : Mesh(std::move(nameTag)) {};
|
||||||
|
explicit RigidBody(const RigidBody& rigidBody) = default;
|
||||||
explicit RigidBody(const Mesh& mesh);
|
explicit RigidBody(const Mesh& mesh);
|
||||||
RigidBody(ObjectNameTag nameTag, const std::string& filename, const Vec3D& scale = Vec3D{1, 1, 1});
|
RigidBody(ObjectNameTag nameTag, const std::string& filename, const Vec3D& scale = Vec3D{1, 1, 1});
|
||||||
|
|
||||||
|
|
|
@ -8,28 +8,33 @@
|
||||||
using namespace std::chrono;
|
using namespace std::chrono;
|
||||||
|
|
||||||
Time* Time::_instance = nullptr;
|
Time* Time::_instance = nullptr;
|
||||||
|
bool Time::_validInstance = false;
|
||||||
|
|
||||||
void Time::init() {
|
void Time::init() {
|
||||||
_instance = new Time();
|
_instance = new Time();
|
||||||
|
_validInstance = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
double Time::time() {
|
double Time::time() {
|
||||||
if(!_instance)
|
if(!_validInstance) {
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
return _instance->_time;
|
return _instance->_time;
|
||||||
}
|
}
|
||||||
|
|
||||||
double Time::deltaTime() {
|
double Time::deltaTime() {
|
||||||
if(!_instance)
|
if(!_validInstance) {
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
return _instance->_deltaTime;
|
return _instance->_deltaTime;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Time::update() {
|
void Time::update() {
|
||||||
if(!_instance)
|
if(!_validInstance) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
high_resolution_clock::time_point t = high_resolution_clock::now();
|
high_resolution_clock::time_point t = high_resolution_clock::now();
|
||||||
|
|
||||||
|
@ -53,15 +58,14 @@ void Time::update() {
|
||||||
}
|
}
|
||||||
|
|
||||||
int Time::fps() {
|
int Time::fps() {
|
||||||
if(!_instance)
|
if(!_validInstance) {
|
||||||
return 0;
|
return 0;
|
||||||
|
}
|
||||||
// Cast is faster than floor and has the same behavior for positive numbers
|
// Cast is faster than floor and has the same behavior for positive numbers
|
||||||
return static_cast<int>(_instance->_lastFps);
|
return static_cast<int>(_instance->_lastFps);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Time::free() {
|
void Time::free() {
|
||||||
Time* t = _instance;
|
_validInstance = false;
|
||||||
|
|
||||||
delete _instance;
|
delete _instance;
|
||||||
_instance = nullptr;
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,6 +24,7 @@ private:
|
||||||
double _deltaTime = 0;
|
double _deltaTime = 0;
|
||||||
|
|
||||||
static Time* _instance;
|
static Time* _instance;
|
||||||
|
static bool _validInstance;
|
||||||
|
|
||||||
Time() = default;
|
Time() = default;
|
||||||
|
|
||||||
|
|
|
@ -82,7 +82,7 @@ std::map<ObjectNameTag, double> Weapon::addTrace(std::function<IntersectionInfor
|
||||||
}
|
}
|
||||||
|
|
||||||
// add trace line
|
// add trace line
|
||||||
Vec3D lineFrom = position() + Vec3D(triangles().back()[0]);
|
Vec3D lineFrom = position() + model()*Vec3D(triangles().back()[0]);
|
||||||
Vec3D lineTo = rayCast.intersected ? rayCast.pointOfIntersection : position() + -lookAt() * ShooterConsts::FIRE_DISTANCE + randV;
|
Vec3D lineTo = rayCast.intersected ? rayCast.pointOfIntersection : position() + -lookAt() * ShooterConsts::FIRE_DISTANCE + randV;
|
||||||
_addTraceCallBack(lineFrom, lineTo);
|
_addTraceCallBack(lineFrom, lineTo);
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue