Fully refactored Math::Matrix, removed matrix.h and moved remaining functions to other files

dev
Tomasz Kapuściński 2022-01-05 19:12:35 +01:00
parent 208f142cd2
commit 9c37f6cbd5
46 changed files with 183 additions and 194 deletions

View File

@ -179,7 +179,6 @@ add_library(colobotbase STATIC
math/geometry.h math/geometry.h
math/half.cpp math/half.cpp
math/half.h math/half.h
math/matrix.h
math/sphere.h math/sphere.h
object/auto/auto.cpp object/auto/auto.cpp
object/auto/auto.h object/auto/auto.h

View File

@ -127,7 +127,7 @@ void CCloud::Draw()
m_engine->SetState(ENG_RSTATE_TTEXTURE_BLACK | ENG_RSTATE_FOG | ENG_RSTATE_WRAP); m_engine->SetState(ENG_RSTATE_TTEXTURE_BLACK | ENG_RSTATE_FOG | ENG_RSTATE_WRAP);
Math::Matrix matrix = glm::mat4(1.0f); glm::mat4 matrix = glm::mat4(1.0f);
device->SetTransform(TRANSFORM_WORLD, matrix); device->SetTransform(TRANSFORM_WORLD, matrix);
float size = m_brickSize/2.0f; float size = m_brickSize/2.0f;

View File

@ -232,7 +232,7 @@ CEngine::CEngine(CApplication *app, CSystemUtils* systemUtils)
m_terrainTexParams.filter = TEX_FILTER_BILINEAR; m_terrainTexParams.filter = TEX_FILTER_BILINEAR;
// Compute bias matrix for shadow mapping // Compute bias matrix for shadow mapping
Math::Matrix temp1, temp2; glm::mat4 temp1, temp2;
Math::LoadScaleMatrix(temp1, glm::vec3(0.5f, 0.5f, 0.5f)); Math::LoadScaleMatrix(temp1, glm::vec3(0.5f, 0.5f, 0.5f));
Math::LoadTranslationMatrix(temp2, glm::vec3(1.0f, 1.0f, 1.0f)); Math::LoadTranslationMatrix(temp2, glm::vec3(1.0f, 1.0f, 1.0f));
m_shadowBias = temp1 * temp2; m_shadowBias = temp1 * temp2;
@ -899,8 +899,7 @@ int CEngine::CreateObject()
m_objects[objRank].used = true; m_objects[objRank].used = true;
Math::Matrix mat; glm::mat4 mat = glm::mat4(1.0f);
mat = glm::mat4(1.0f);
SetObjectTransform(objRank, mat); SetObjectTransform(objRank, mat);
m_objects[objRank].drawWorld = true; m_objects[objRank].drawWorld = true;
@ -959,14 +958,14 @@ EngineObjectType CEngine::GetObjectType(int objRank)
} }
void CEngine::SetObjectTransform(int objRank, const Math::Matrix& transform) void CEngine::SetObjectTransform(int objRank, const glm::mat4& transform)
{ {
assert(objRank >= 0 && objRank < static_cast<int>( m_objects.size() )); assert(objRank >= 0 && objRank < static_cast<int>( m_objects.size() ));
m_objects[objRank].transform = transform; m_objects[objRank].transform = transform;
} }
void CEngine::GetObjectTransform(int objRank, Math::Matrix& transform) void CEngine::GetObjectTransform(int objRank, glm::mat4& transform)
{ {
assert(objRank >= 0 && objRank < static_cast<int>( m_objects.size() )); assert(objRank >= 0 && objRank < static_cast<int>( m_objects.size() ));
@ -1928,7 +1927,7 @@ bool CEngine::DetectTriangle(const glm::vec2& mouse, Vertex3D* triangle, int obj
} }
//! Use only after world transform already set //! Use only after world transform already set
bool CEngine::IsVisible(const Math::Matrix& matrix, int objRank) bool CEngine::IsVisible(const glm::mat4& matrix, int objRank)
{ {
assert(objRank >= 0 && objRank < static_cast<int>(m_objects.size())); assert(objRank >= 0 && objRank < static_cast<int>(m_objects.size()));
@ -1949,7 +1948,7 @@ bool CEngine::IsVisible(const Math::Matrix& matrix, int objRank)
return false; return false;
} }
int CEngine::ComputeSphereVisibility(const Math::Matrix& m, const glm::vec3& center, float radius) int CEngine::ComputeSphereVisibility(const glm::mat4& m, const glm::vec3& center, float radius)
{ {
glm::vec3 vec[6]; glm::vec3 vec[6];
float originPlane[6]; float originPlane[6];
@ -3225,12 +3224,12 @@ bool CEngine::GetPauseBlurEnabled()
return m_pauseBlurEnabled; return m_pauseBlurEnabled;
} }
const Math::Matrix& CEngine::GetMatView() const glm::mat4& CEngine::GetMatView()
{ {
return m_matView; return m_matView;
} }
const Math::Matrix& CEngine::GetMatProj() const glm::mat4& CEngine::GetMatProj()
{ {
return m_matProj; return m_matProj;
} }
@ -3670,7 +3669,7 @@ void CEngine::Draw3DScene()
if (m_debugGoto) if (m_debugGoto)
{ {
Math::Matrix worldMatrix = glm::mat4(1.0f); glm::mat4 worldMatrix = glm::mat4(1.0f);
m_device->SetTransform(TRANSFORM_WORLD, worldMatrix); m_device->SetTransform(TRANSFORM_WORLD, worldMatrix);
SetState(ENG_RSTATE_OPAQUE_COLOR); SetState(ENG_RSTATE_OPAQUE_COLOR);
@ -3807,7 +3806,7 @@ void CEngine::Capture3DScene()
void CEngine::DrawCaptured3DScene() void CEngine::DrawCaptured3DScene()
{ {
Math::Matrix identity; glm::mat4 identity = glm::mat4(1.0f);
m_device->SetTransform(TRANSFORM_PROJECTION, identity); m_device->SetTransform(TRANSFORM_PROJECTION, identity);
m_device->SetTransform(TRANSFORM_VIEW, identity); m_device->SetTransform(TRANSFORM_VIEW, identity);
@ -3831,7 +3830,7 @@ void CEngine::DrawCaptured3DScene()
renderer->DrawPrimitive(PrimitiveType::TRIANGLE_STRIP, 4, vertices); renderer->DrawPrimitive(PrimitiveType::TRIANGLE_STRIP, 4, vertices);
} }
void CEngine::RenderDebugSphere(const Math::Sphere& sphere, const Math::Matrix& transform, const Gfx::Color& color) void CEngine::RenderDebugSphere(const Math::Sphere& sphere, const glm::mat4& transform, const Gfx::Color& color)
{ {
static constexpr int LONGITUDE_DIVISIONS = 16; static constexpr int LONGITUDE_DIVISIONS = 16;
static constexpr int LATITUDE_DIVISIONS = 8; static constexpr int LATITUDE_DIVISIONS = 8;
@ -3895,12 +3894,12 @@ void CEngine::RenderDebugSphere(const Math::Sphere& sphere, const Math::Matrix&
for (std::size_t i = 0; i < verticesTemplate.size(); ++i) for (std::size_t i = 0; i < verticesTemplate.size(); ++i)
{ {
auto pos = Math::MatrixVectorMultiply(transform, sphere.pos + verticesTemplate[i] * sphere.radius); auto pos = Math::Transform(transform, sphere.pos + verticesTemplate[i] * sphere.radius);
m_pendingDebugDraws.vertices[i + firstVert] = VertexCol{pos, color}; m_pendingDebugDraws.vertices[i + firstVert] = VertexCol{pos, color};
} }
} }
void CEngine::RenderDebugBox(const glm::vec3& mins, const glm::vec3& maxs, const Math::Matrix& transform, const Gfx::Color& color) void CEngine::RenderDebugBox(const glm::vec3& mins, const glm::vec3& maxs, const glm::mat4& transform, const Gfx::Color& color)
{ {
static constexpr int NUM_LINE_STRIPS = 4; static constexpr int NUM_LINE_STRIPS = 4;
static constexpr int VERTS_IN_LINE_STRIP = 4; static constexpr int VERTS_IN_LINE_STRIP = 4;
@ -3949,7 +3948,7 @@ void CEngine::RenderPendingDebugDraws()
{ {
if (m_pendingDebugDraws.firsts.empty()) return; if (m_pendingDebugDraws.firsts.empty()) return;
m_device->SetTransform(TRANSFORM_WORLD, Math::Matrix{}); m_device->SetTransform(TRANSFORM_WORLD, glm::mat4(1.0f));
SetState(ENG_RSTATE_OPAQUE_COLOR); SetState(ENG_RSTATE_OPAQUE_COLOR);
@ -4070,7 +4069,7 @@ void CEngine::RenderShadowMap()
// To prevent 'shadow shimmering', we ensure that the position only moves in texel-sized // To prevent 'shadow shimmering', we ensure that the position only moves in texel-sized
// increments. To do this we transform the position to a space where the light's forward/right/up // increments. To do this we transform the position to a space where the light's forward/right/up
// axes are aligned with the x/y/z axes (not necessarily in that order, and +/- signs don't matter). // axes are aligned with the x/y/z axes (not necessarily in that order, and +/- signs don't matter).
Math::Matrix lightRotation; glm::mat4 lightRotation;
Math::LoadViewMatrix(lightRotation, glm::vec3{0, 0, 0}, lightDir, worldUp); Math::LoadViewMatrix(lightRotation, glm::vec3{0, 0, 0}, lightDir, worldUp);
pos = Math::MatrixVectorMultiply(lightRotation, pos); pos = Math::MatrixVectorMultiply(lightRotation, pos);
// ...then we round to the nearest worldUnitsPerTexel: // ...then we round to the nearest worldUnitsPerTexel:
@ -4089,11 +4088,11 @@ void CEngine::RenderShadowMap()
Math::LoadOrthoProjectionMatrix(m_shadowProjMat, -dist, dist, -dist, dist, -depth, depth); Math::LoadOrthoProjectionMatrix(m_shadowProjMat, -dist, dist, -dist, dist, -depth, depth);
Math::LoadViewMatrix(m_shadowViewMat, pos, lookAt, worldUp); Math::LoadViewMatrix(m_shadowViewMat, pos, lookAt, worldUp);
Math::Matrix scaleMat; glm::mat4 scaleMat;
Math::LoadScaleMatrix(scaleMat, glm::vec3(1.0f, 1.0f, -1.0f)); Math::LoadScaleMatrix(scaleMat, glm::vec3(1.0f, 1.0f, -1.0f));
m_shadowViewMat = scaleMat * m_shadowViewMat; m_shadowViewMat = scaleMat * m_shadowViewMat;
Math::Matrix temporary = m_shadowProjMat * m_shadowViewMat; glm::mat4 temporary = m_shadowProjMat * m_shadowViewMat;
m_shadowTextureMat = m_shadowBias * temporary; m_shadowTextureMat = m_shadowBias * temporary;
m_shadowViewMat = scaleMat * m_shadowViewMat; m_shadowViewMat = scaleMat * m_shadowViewMat;
@ -4719,7 +4718,7 @@ void CEngine::DrawShadowSpots()
m_device->SetRenderState(RENDER_STATE_DEPTH_WRITE, false); m_device->SetRenderState(RENDER_STATE_DEPTH_WRITE, false);
m_device->SetRenderState(RENDER_STATE_LIGHTING, false); m_device->SetRenderState(RENDER_STATE_LIGHTING, false);
Math::Matrix matrix = glm::mat4(1.0f); glm::mat4 matrix = glm::mat4(1.0f);
m_device->SetTransform(TRANSFORM_WORLD, matrix); m_device->SetTransform(TRANSFORM_WORLD, matrix);
@ -5579,7 +5578,7 @@ void CEngine::UpdateObjectShadowSpotNormal(int objRank)
m_shadowSpots[shadowRank].normal = norm; m_shadowSpots[shadowRank].normal = norm;
} }
int CEngine::AddStaticMesh(const std::string& key, const CModelMesh* mesh, const Math::Matrix& worldMatrix) int CEngine::AddStaticMesh(const std::string& key, const CModelMesh* mesh, const glm::mat4& worldMatrix)
{ {
int baseObjRank = -1; int baseObjRank = -1;
@ -5624,7 +5623,7 @@ void CEngine::DeleteStaticMesh(int meshHandle)
DeleteObject(objRank); DeleteObject(objRank);
} }
const Math::Matrix& CEngine::GetStaticMeshWorldMatrix(int meshHandle) const glm::mat4& CEngine::GetStaticMeshWorldMatrix(int meshHandle)
{ {
int objRank = meshHandle; int objRank = meshHandle;
return m_objects[objRank].transform; return m_objects[objRank].transform;
@ -5715,11 +5714,11 @@ void CEngine::DisablePauseBlur()
void CEngine::SetWindowCoordinates() void CEngine::SetWindowCoordinates()
{ {
Math::Matrix matWorldWindow = glm::mat4(1.0f); glm::mat4 matWorldWindow = glm::mat4(1.0f);
Math::Matrix matViewWindow = glm::mat4(1.0f); glm::mat4 matViewWindow = glm::mat4(1.0f);
Math::Matrix matProjWindow; glm::mat4 matProjWindow;
Math::LoadOrthoProjectionMatrix(matProjWindow, 0.0f, m_size.x, m_size.y, 0.0f, -1.0f, 1.0f); Math::LoadOrthoProjectionMatrix(matProjWindow, 0.0f, m_size.x, m_size.y, 0.0f, -1.0f, 1.0f);
m_device->SetTransform(TRANSFORM_VIEW, matViewWindow); m_device->SetTransform(TRANSFORM_VIEW, matViewWindow);

View File

@ -32,7 +32,6 @@
#include "graphics/core/texture.h" #include "graphics/core/texture.h"
#include "graphics/core/vertex.h" #include "graphics/core/vertex.h"
#include "math/matrix.h"
#include "math/sphere.h" #include "math/sphere.h"
#include <glm/glm.hpp> #include <glm/glm.hpp>
@ -275,7 +274,7 @@ struct EngineObject
//! Type of object //! Type of object
EngineObjectType type = ENG_OBJTYPE_NULL; EngineObjectType type = ENG_OBJTYPE_NULL;
//! Transformation matrix //! Transformation matrix
Math::Matrix transform; glm::mat4 transform;
//! Distance to object from eye point //! Distance to object from eye point
float distance = 0.0f; float distance = 0.0f;
//! Rank of the associated shadow //! Rank of the associated shadow
@ -700,7 +699,7 @@ public:
* @param key key unique per object class * @param key key unique per object class
* @return mesh instance handle * @return mesh instance handle
*/ */
int AddStaticMesh(const std::string& key, const Gfx::CModelMesh* mesh, const Math::Matrix& worldMatrix); int AddStaticMesh(const std::string& key, const Gfx::CModelMesh* mesh, const glm::mat4& worldMatrix);
//! Removes given static mesh //! Removes given static mesh
void DeleteStaticMesh(int meshHandle); void DeleteStaticMesh(int meshHandle);
@ -709,7 +708,7 @@ public:
void AddStaticMeshShadowSpot(int meshHandle, const Gfx::ModelShadowSpot& shadowSpot); void AddStaticMeshShadowSpot(int meshHandle, const Gfx::ModelShadowSpot& shadowSpot);
//! Returns static mesh world matrix //! Returns static mesh world matrix
const Math::Matrix& GetStaticMeshWorldMatrix(int meshHandle); const glm::mat4& GetStaticMeshWorldMatrix(int meshHandle);
//! Sets transparency for static mesh //! Sets transparency for static mesh
void SetStaticMeshTransparency(int meshHandle, float value); void SetStaticMeshTransparency(int meshHandle, float value);
@ -763,8 +762,8 @@ public:
//@{ //@{
//! Management of object transform //! Management of object transform
void SetObjectTransform(int objRank, const Math::Matrix& transform); void SetObjectTransform(int objRank, const glm::mat4& transform);
void GetObjectTransform(int objRank, Math::Matrix& transform); void GetObjectTransform(int objRank, glm::mat4& transform);
//@} //@}
//! Sets drawWorld for given object //! Sets drawWorld for given object
@ -1153,9 +1152,9 @@ public:
//@} //@}
//! Returns the view matrix //! Returns the view matrix
const Math::Matrix& GetMatView(); const glm::mat4& GetMatView();
//! Returns the projection matrix //! Returns the projection matrix
const Math::Matrix& GetMatProj(); const glm::mat4& GetMatProj();
//! Returns the camera center point //! Returns the camera center point
TEST_VIRTUAL glm::vec3 GetEyePt(); TEST_VIRTUAL glm::vec3 GetEyePt();
//! Returns the camera target point //! Returns the camera target point
@ -1173,8 +1172,8 @@ public:
//! Updates the scene after a change of parameters //! Updates the scene after a change of parameters
void ApplyChange(); void ApplyChange();
void RenderDebugSphere(const Math::Sphere&, const Math::Matrix& transform = Math::Matrix{}, const Color& = Color{0.0f, 0.0f, 1.0f, 1.0f}); void RenderDebugSphere(const Math::Sphere&, const glm::mat4& transform = glm::mat4(1.0f), const Color & = Color{0.0f, 0.0f, 1.0f, 1.0f});
void RenderDebugBox(const glm::vec3& mins, const glm::vec3& maxs, const Math::Matrix& transform = Math::Matrix{}, const Color& = Color{0.0f, 0.0f, 1.0f, 1.0f}); void RenderDebugBox(const glm::vec3& mins, const glm::vec3& maxs, const glm::mat4& transform = glm::mat4(1.0f), const Color & = Color{0.0f, 0.0f, 1.0f, 1.0f});
void SetDebugLights(bool debugLights); void SetDebugLights(bool debugLights);
bool GetDebugLights(); bool GetDebugLights();
@ -1260,9 +1259,9 @@ protected:
Texture CreateTexture(const std::string &texName, const TextureCreateParams &params, CImage* image = nullptr); Texture CreateTexture(const std::string &texName, const TextureCreateParams &params, CImage* image = nullptr);
//! Tests whether the given object is visible //! Tests whether the given object is visible
bool IsVisible(const Math::Matrix& matrix, int objRank); bool IsVisible(const glm::mat4& matrix, int objRank);
int ComputeSphereVisibility(const Math::Matrix& m, const glm::vec3& center, float radius); int ComputeSphereVisibility(const glm::mat4& m, const glm::vec3& center, float radius);
bool InPlane(glm::vec3 normal, float originPlane, glm::vec3 center, float radius); bool InPlane(glm::vec3 normal, float originPlane, glm::vec3 center, float radius);
@ -1339,32 +1338,32 @@ protected:
bool m_screenshotMode; bool m_screenshotMode;
//! Projection matrix for 3D scene //! Projection matrix for 3D scene
Math::Matrix m_matProj; glm::mat4 m_matProj;
//! View matrix for 3D scene //! View matrix for 3D scene
Math::Matrix m_matView; glm::mat4 m_matView;
//! Camera vertical field-of-view angle for 3D scene. A.k.a. m_vfov //! Camera vertical field-of-view angle for 3D scene. A.k.a. m_vfov
float m_focus; float m_focus;
//! Horizontal field-of-view angle, calculated from vertical FOV and aspect ratio //! Horizontal field-of-view angle, calculated from vertical FOV and aspect ratio
float m_hfov; float m_hfov;
//! Projection matrix for rendering shadow maps //! Projection matrix for rendering shadow maps
Math::Matrix m_shadowProjMat; glm::mat4 m_shadowProjMat;
//! View matrix for rendering shadow maps //! View matrix for rendering shadow maps
Math::Matrix m_shadowViewMat; glm::mat4 m_shadowViewMat;
//! Texture matrix for rendering shadow maps //! Texture matrix for rendering shadow maps
Math::Matrix m_shadowTextureMat; glm::mat4 m_shadowTextureMat;
//! Texture bias for sampling shadow maps //! Texture bias for sampling shadow maps
Math::Matrix m_shadowBias; glm::mat4 m_shadowBias;
//! Vertical synchronization controll //! Vertical synchronization controll
int m_vsync; int m_vsync;
//! World matrix for 2D interface //! World matrix for 2D interface
Math::Matrix m_matWorldInterface; glm::mat4 m_matWorldInterface;
//! Projection matrix for 2D interface //! Projection matrix for 2D interface
Math::Matrix m_matProjInterface; glm::mat4 m_matProjInterface;
//! View matrix for 2D interface //! View matrix for 2D interface
Math::Matrix m_matViewInterface; glm::mat4 m_matViewInterface;
//! Current size of viewport window //! Current size of viewport window
glm::ivec2 m_size; glm::ivec2 m_size;

View File

@ -26,6 +26,8 @@
#include "graphics/engine/engine.h" #include "graphics/engine/engine.h"
#include "math/func.h"
// Graphics module namespace // Graphics module namespace
namespace Gfx namespace Gfx

View File

@ -140,8 +140,8 @@ bool CPyro::Create(PyroType type, CObject* obj, float force)
m_power = true; m_power = true;
pos = power->GetPosition(); pos = power->GetPosition();
pos.y += 1.0f; pos.y += 1.0f;
Math::Matrix* mat = obj->GetWorldMatrix(0); glm::mat4 mat = obj->GetWorldMatrix(0);
m_posPower = Math::Transform(*mat, pos); m_posPower = Math::Transform(mat, pos);
} }
if ( oType == OBJECT_POWER || if ( oType == OBJECT_POWER ||
@ -158,15 +158,15 @@ bool CPyro::Create(PyroType type, CObject* obj, float force)
if ( oType == OBJECT_STATION ) if ( oType == OBJECT_STATION )
{ {
m_power = true; m_power = true;
Math::Matrix* mat = obj->GetWorldMatrix(0); glm::mat4 mat = obj->GetWorldMatrix(0);
m_posPower = Math::Transform(*mat, glm::vec3(-15.0f, 7.0f, 0.0f)); m_posPower = Math::Transform(mat, glm::vec3(-15.0f, 7.0f, 0.0f));
m_pos = m_posPower; m_pos = m_posPower;
} }
if ( oType == OBJECT_ENERGY ) if ( oType == OBJECT_ENERGY )
{ {
m_power = true; m_power = true;
Math::Matrix* mat = obj->GetWorldMatrix(0); glm::mat4 mat = obj->GetWorldMatrix(0);
m_posPower = Math::Transform(*mat, glm::vec3(-7.0f, 6.0f, 0.0f)); m_posPower = Math::Transform(mat, glm::vec3(-7.0f, 6.0f, 0.0f));
m_pos = m_posPower; m_pos = m_posPower;
} }
if ( oType == OBJECT_NUCLEAR ) if ( oType == OBJECT_NUCLEAR )
@ -396,8 +396,8 @@ bool CPyro::Create(PyroType type, CObject* obj, float force)
m_speed = 1.0f/15.0f; m_speed = 1.0f/15.0f;
pos = glm::vec3(-3.0f, 2.0f, 0.0f); pos = glm::vec3(-3.0f, 2.0f, 0.0f);
Math::Matrix* mat = obj->GetWorldMatrix(0); glm::mat4 mat = obj->GetWorldMatrix(0);
m_pos = Math::Transform(*mat, pos); m_pos = Math::Transform(mat, pos);
m_engine->DeleteShadowSpot(m_object->GetObjectRank(0)); m_engine->DeleteShadowSpot(m_object->GetObjectRank(0));
} }
@ -1541,8 +1541,8 @@ void CPyro::CreateTriangle(CObject* obj, ObjectType oType, int part)
glm::vec3 speed; glm::vec3 speed;
float mass; float mass;
Math::Matrix* mat = obj->GetWorldMatrix(part); glm::mat4 mat = obj->GetWorldMatrix(part);
glm::vec3 pos = Math::Transform(*mat, offset); glm::vec3 pos = Math::Transform(mat, offset);
if ( m_type == PT_FRAGV || m_type == PT_EGG ) if ( m_type == PT_FRAGV || m_type == PT_EGG )
{ {
speed.x = (Math::Rand()-0.5f)*10.0f; speed.x = (Math::Rand()-0.5f)*10.0f;

View File

@ -117,7 +117,7 @@ void CGL33Device::DebugLights()
glDepthMask(GL_FALSE); glDepthMask(GL_FALSE);
glDisable(GL_BLEND); glDisable(GL_BLEND);
Math::Matrix saveWorldMat = m_worldMat; glm::mat4 saveWorldMat = m_worldMat;
glm::mat4 identity = glm::mat4(1.0f); glm::mat4 identity = glm::mat4(1.0f);
SetTransform(TRANSFORM_WORLD, identity); SetTransform(TRANSFORM_WORLD, identity);
@ -577,7 +577,7 @@ void CGL33Device::Restore()
//UpdateTextureState(2); //UpdateTextureState(2);
} }
void CGL33Device::SetTransform(TransformType type, const Math::Matrix &matrix) void CGL33Device::SetTransform(TransformType type, const glm::mat4 &matrix)
{ {
if (type == TRANSFORM_WORLD) if (type == TRANSFORM_WORLD)
{ {
@ -588,13 +588,13 @@ void CGL33Device::SetTransform(TransformType type, const Math::Matrix &matrix)
m_combinedMatrixOutdated = true; m_combinedMatrixOutdated = true;
// normal transform // normal transform
Math::Matrix normalMat = glm::inverse(normalMat); glm::mat4 normalMat = glm::inverse(normalMat);
glUniformMatrix4fv(m_uniforms.normalMatrix, 1, GL_TRUE, glm::value_ptr(normalMat)); glUniformMatrix4fv(m_uniforms.normalMatrix, 1, GL_TRUE, glm::value_ptr(normalMat));
} }
else if (type == TRANSFORM_VIEW) else if (type == TRANSFORM_VIEW)
{ {
Math::Matrix scale = glm::mat4(1.0f); glm::mat4 scale = glm::mat4(1.0f);
scale[2][2] = -1.0f; scale[2][2] = -1.0f;
m_viewMat = scale * matrix; m_viewMat = scale * matrix;
@ -619,7 +619,7 @@ void CGL33Device::SetTransform(TransformType type, const Math::Matrix &matrix)
} }
else if (type == TRANSFORM_SHADOW) else if (type == TRANSFORM_SHADOW)
{ {
Math::Matrix temp = matrix; glm::mat4 temp = matrix;
glUniformMatrix4fv(m_uniforms.shadowMatrix, 1, GL_FALSE, glm::value_ptr(temp)); glUniformMatrix4fv(m_uniforms.shadowMatrix, 1, GL_FALSE, glm::value_ptr(temp));
} }
else else

View File

@ -31,8 +31,6 @@
#include "graphics/opengl/glframebuffer.h" #include "graphics/opengl/glframebuffer.h"
#include "graphics/opengl/glutil.h" #include "graphics/opengl/glutil.h"
#include "math/matrix.h"
#include <map> #include <map>
#include <memory> #include <memory>
#include <set> #include <set>
@ -124,7 +122,7 @@ public:
void Restore() override; void Restore() override;
void SetTransform(TransformType type, const Math::Matrix &matrix) override; void SetTransform(TransformType type, const glm::mat4 &matrix) override;
void SetMaterial(const Material &material) override; void SetMaterial(const Material &material) override;
@ -239,15 +237,15 @@ private:
DeviceConfig m_config; DeviceConfig m_config;
//! Current world matrix //! Current world matrix
Math::Matrix m_worldMat; glm::mat4 m_worldMat;
//! Current view matrix //! Current view matrix
Math::Matrix m_viewMat; glm::mat4 m_viewMat;
//! OpenGL modelview matrix = world matrix * view matrix //! OpenGL modelview matrix = world matrix * view matrix
Math::Matrix m_modelviewMat; glm::mat4 m_modelviewMat;
//! Current projection matrix //! Current projection matrix
Math::Matrix m_projectionMat; glm::mat4 m_projectionMat;
//! Combined world-view-projection matrix //! Combined world-view-projection matrix
Math::Matrix m_combinedMatrix; glm::mat4 m_combinedMatrix;
//! true means combined matrix is outdated //! true means combined matrix is outdated
bool m_combinedMatrixOutdated = true; bool m_combinedMatrixOutdated = true;

View File

@ -6244,7 +6244,7 @@ void CRobotMain::UpdateDebugCrashSpheres()
{ {
for (const auto& crashSphere : obj->GetAllCrashSpheres()) for (const auto& crashSphere : obj->GetAllCrashSpheres())
{ {
m_engine->RenderDebugSphere(crashSphere.sphere, Math::Matrix{}, Gfx::Color{0.0f, 0.0f, 1.0f, 1.0f}); m_engine->RenderDebugSphere(crashSphere.sphere, glm::mat4(1.0f), Gfx::Color{0.0f, 0.0f, 1.0f, 1.0f});
} }
} }
} }

View File

@ -29,5 +29,4 @@
#include "math/func.h" #include "math/func.h"
#include "math/geometry.h" #include "math/geometry.h"
#include "math/half.h" #include "math/half.h"
#include "math/matrix.h"

View File

@ -27,9 +27,9 @@
#include "math/const.h" #include "math/const.h"
#include "math/func.h" #include "math/func.h"
#include "math/matrix.h"
#include <glm/glm.hpp> #include <glm/glm.hpp>
#include <glm/ext.hpp>
#include <cmath> #include <cmath>
#include <cstdlib> #include <cstdlib>
@ -263,7 +263,7 @@ inline float RotateAngle(const glm::vec2&center, const glm::vec2&p1, const glm::
* \param at view direction * \param at view direction
* \param worldUp up vector * \param worldUp up vector
*/ */
inline void LoadViewMatrix(Math::Matrix &mat, const glm::vec3 &from, inline void LoadViewMatrix(glm::mat4 &mat, const glm::vec3 &from,
const glm::vec3 &at, const glm::vec3 &worldUp) const glm::vec3 &at, const glm::vec3 &worldUp)
{ {
// Get the z basis vector, which points straight ahead. This is the // Get the z basis vector, which points straight ahead. This is the
@ -332,7 +332,7 @@ inline void LoadViewMatrix(Math::Matrix &mat, const glm::vec3 &from,
* \param nearPlane distance to near cut plane * \param nearPlane distance to near cut plane
* \param farPlane distance to far cut plane * \param farPlane distance to far cut plane
*/ */
inline void LoadProjectionMatrix(Math::Matrix &mat, float fov = Math::PI / 2.0f, float aspect = 1.0f, inline void LoadProjectionMatrix(glm::mat4 &mat, float fov = Math::PI / 2.0f, float aspect = 1.0f,
float nearPlane = 1.0f, float farPlane = 1000.0f) float nearPlane = 1.0f, float farPlane = 1000.0f)
{ {
assert(fabs(farPlane - nearPlane) >= 0.01f); assert(fabs(farPlane - nearPlane) >= 0.01f);
@ -356,7 +356,7 @@ inline void LoadProjectionMatrix(Math::Matrix &mat, float fov = Math::PI / 2.0f,
* \param bottom,top coordinates for bottom and top horizontal clipping planes * \param bottom,top coordinates for bottom and top horizontal clipping planes
* \param zNear,zFar distance to nearer and farther depth clipping planes * \param zNear,zFar distance to nearer and farther depth clipping planes
*/ */
inline void LoadOrthoProjectionMatrix(Math::Matrix &mat, float left, float right, float bottom, float top, inline void LoadOrthoProjectionMatrix(glm::mat4 &mat, float left, float right, float bottom, float top,
float zNear = -1.0f, float zFar = 1.0f) float zNear = -1.0f, float zFar = 1.0f)
{ {
mat = glm::mat4(1.0f); mat = glm::mat4(1.0f);
@ -375,7 +375,7 @@ inline void LoadOrthoProjectionMatrix(Math::Matrix &mat, float left, float right
* \param mat result matrix * \param mat result matrix
* \param trans vector of translation * \param trans vector of translation
*/ */
inline void LoadTranslationMatrix(Math::Matrix &mat, const glm::vec3 &trans) inline void LoadTranslationMatrix(glm::mat4 &mat, const glm::vec3 &trans)
{ {
mat = glm::translate(glm::mat4(1.0f), trans); mat = glm::translate(glm::mat4(1.0f), trans);
} }
@ -385,7 +385,7 @@ inline void LoadTranslationMatrix(Math::Matrix &mat, const glm::vec3 &trans)
* \param mat result matrix * \param mat result matrix
* \param scale vector with scaling factors for X, Y, Z * \param scale vector with scaling factors for X, Y, Z
*/ */
inline void LoadScaleMatrix(Math::Matrix &mat, const glm::vec3 &scale) inline void LoadScaleMatrix(glm::mat4 &mat, const glm::vec3 &scale)
{ {
mat = glm::scale(glm::mat4(1.0f), scale); mat = glm::scale(glm::mat4(1.0f), scale);
} }
@ -395,7 +395,7 @@ inline void LoadScaleMatrix(Math::Matrix &mat, const glm::vec3 &scale)
* \param mat result matrix * \param mat result matrix
* \param angle angle [radians] * \param angle angle [radians]
*/ */
inline void LoadRotationXMatrix(Math::Matrix &mat, float angle) inline void LoadRotationXMatrix(glm::mat4 &mat, float angle)
{ {
mat = glm::mat4(1.0f); mat = glm::mat4(1.0f);
@ -410,7 +410,7 @@ inline void LoadRotationXMatrix(Math::Matrix &mat, float angle)
* \param mat result matrix * \param mat result matrix
* \param angle angle [radians] * \param angle angle [radians]
*/ */
inline void LoadRotationYMatrix(Math::Matrix &mat, float angle) inline void LoadRotationYMatrix(glm::mat4 &mat, float angle)
{ {
mat = glm::mat4(1.0f); mat = glm::mat4(1.0f);
@ -425,7 +425,7 @@ inline void LoadRotationYMatrix(Math::Matrix &mat, float angle)
* \param mat result matrix * \param mat result matrix
* \param angle angle [radians] * \param angle angle [radians]
*/ */
inline void LoadRotationZMatrix(Math::Matrix &mat, float angle) inline void LoadRotationZMatrix(glm::mat4 &mat, float angle)
{ {
mat = glm::mat4(1.0f); mat = glm::mat4(1.0f);
@ -441,7 +441,7 @@ inline void LoadRotationZMatrix(Math::Matrix &mat, float angle)
* \param dir axis of rotation * \param dir axis of rotation
* \param angle angle [radians] * \param angle angle [radians]
*/ */
inline void LoadRotationMatrix(Math::Matrix &mat, const glm::vec3 &dir, float angle) inline void LoadRotationMatrix(glm::mat4 &mat, const glm::vec3 &dir, float angle)
{ {
float cos = cosf(angle); float cos = cosf(angle);
float sin = sinf(angle); float sin = sinf(angle);
@ -463,9 +463,9 @@ inline void LoadRotationMatrix(Math::Matrix &mat, const glm::vec3 &dir, float an
} }
//! Calculates the matrix to make three rotations in the order X, Z and Y //! Calculates the matrix to make three rotations in the order X, Z and Y
inline void LoadRotationXZYMatrix(Math::Matrix &mat, const glm::vec3 &angles) inline void LoadRotationXZYMatrix(glm::mat4 &mat, const glm::vec3 &angles)
{ {
Math::Matrix temp; glm::mat4 temp;
LoadRotationXMatrix(temp, angles.x); LoadRotationXMatrix(temp, angles.x);
LoadRotationZMatrix(mat, angles.z); LoadRotationZMatrix(mat, angles.z);
@ -476,9 +476,9 @@ inline void LoadRotationXZYMatrix(Math::Matrix &mat, const glm::vec3 &angles)
} }
//! Calculates the matrix to make three rotations in the order Z, X and Y //! Calculates the matrix to make three rotations in the order Z, X and Y
inline void LoadRotationZXYMatrix(Math::Matrix &mat, const glm::vec3 &angles) inline void LoadRotationZXYMatrix(glm::mat4 &mat, const glm::vec3 &angles)
{ {
Math::Matrix temp; glm::mat4 temp;
LoadRotationZMatrix(temp, angles.z); LoadRotationZMatrix(temp, angles.z);
LoadRotationXMatrix(mat, angles.x); LoadRotationXMatrix(mat, angles.x);
@ -606,11 +606,38 @@ inline glm::vec3 LookatPoint(const glm::vec3 &eye, float angleH, float angleV, f
//! Transforms the point \a p by matrix \a m //! Transforms the point \a p by matrix \a m
/** Is equal to multiplying the matrix by the vector (of course without perspective divide). */ /** Is equal to multiplying the matrix by the vector (of course without perspective divide). */
inline glm::vec3 Transform(const Math::Matrix &m, const glm::vec3 &p) inline glm::vec3 Transform(const glm::mat4 &m, const glm::vec3 &p)
{ {
return glm::vec3(m * glm::vec4(p, 1.0f)); return glm::vec3(m * glm::vec4(p, 1.0f));
} }
//! Calculates the result of multiplying m * v
/**
The multiplication is performed thus:
\verbatim
[ m.m[0 ] m.m[4 ] m.m[8 ] m.m[12] ] [ v.x ]
[ m.m[1 ] m.m[5 ] m.m[9 ] m.m[13] ] [ v.y ]
[ m.m[2 ] m.m[6 ] m.m[10] m.m[14] ] * [ v.z ]
[ m.m[3 ] m.m[7 ] m.m[11] m.m[15] ] [ 1 ]
\endverbatim
The result, a 4x1 vector is then converted to 3x1 by dividing
x,y,z coords by the fourth coord (w). */
inline glm::vec3 MatrixVectorMultiply(const glm::mat4& m, const glm::vec3& v, bool wDivide = false)
{
glm::vec4 result = m * glm::vec4(v, 1.0f);
if (!wDivide)
return result;
if (IsZero(result.w))
return glm::vec3(result);
return glm::vec3(result) / result.w;
}
//! Calculates the projection of the point \a p on a straight line \a a to \a b //! Calculates the projection of the point \a p on a straight line \a a to \a b
/** /**
* \param p point to project * \param p point to project
@ -627,11 +654,11 @@ inline glm::vec3 Projection(const glm::vec3 &a, const glm::vec3 &b, const glm::v
//! Calculates point of view to look at a center two angles and a distance //! Calculates point of view to look at a center two angles and a distance
inline glm::vec3 RotateView(glm::vec3 center, float angleH, float angleV, float dist) inline glm::vec3 RotateView(glm::vec3 center, float angleH, float angleV, float dist)
{ {
Math::Matrix mat1, mat2; glm::mat4 mat1, mat2;
LoadRotationZMatrix(mat1, -angleV); LoadRotationZMatrix(mat1, -angleV);
LoadRotationYMatrix(mat2, -angleH); LoadRotationYMatrix(mat2, -angleH);
Math::Matrix mat = mat2 * mat1; glm::mat4 mat = mat2 * mat1;
glm::vec3 eye{}; glm::vec3 eye{};
eye.x = 0.0f+dist; eye.x = 0.0f+dist;

View File

@ -1,72 +0,0 @@
/*
* This file is part of the Colobot: Gold Edition source code
* Copyright (C) 2001-2021, Daniel Roux, EPSITEC SA & TerranovaTeam
* http://epsitec.ch; http://colobot.info; http://github.com/colobot
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
* See the GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see http://gnu.org/licenses
*/
/**
* \file math/matrix.h
* \brief Matrix struct and related functions
*/
#pragma once
#include "math/const.h"
#include "math/func.h"
#include <cmath>
#include <cassert>
#include <glm/glm.hpp>
#include <glm/gtc/type_ptr.hpp>
// Math module namespace
namespace Math
{
using Matrix = glm::mat4;
//! Calculates the result of multiplying m * v
/**
The multiplication is performed thus:
\verbatim
[ m.m[0 ] m.m[4 ] m.m[8 ] m.m[12] ] [ v.x ]
[ m.m[1 ] m.m[5 ] m.m[9 ] m.m[13] ] [ v.y ]
[ m.m[2 ] m.m[6 ] m.m[10] m.m[14] ] * [ v.z ]
[ m.m[3 ] m.m[7 ] m.m[11] m.m[15] ] [ 1 ]
\endverbatim
The result, a 4x1 vector is then converted to 3x1 by dividing
x,y,z coords by the fourth coord (w). */
inline glm::vec3 MatrixVectorMultiply(const Math::Matrix &m, const glm::vec3 &v, bool wDivide = false)
{
glm::vec4 result = m * glm::vec4(v, 1.0);
if (!wDivide)
return result;
if (IsZero(result.w))
return glm::vec3(result);
return glm::vec3(result) / result.w;
}
} // namespace Math

View File

@ -127,8 +127,8 @@ void CAutoDerrick::Init()
glm::vec3 CAutoDerrick::GetCargoPos() glm::vec3 CAutoDerrick::GetCargoPos()
{ {
glm::vec3 pos = glm::vec3(7.0f, 0.0f, 0.0f); glm::vec3 pos = glm::vec3(7.0f, 0.0f, 0.0f);
Math::Matrix* mat = m_object->GetWorldMatrix(0); glm::mat4 mat = m_object->GetWorldMatrix(0);
pos = Math::Transform(*mat, pos); pos = Math::Transform(mat, pos);
m_terrain->AdjustToFloor(pos); m_terrain->AdjustToFloor(pos);
return pos; return pos;
} }

View File

@ -29,6 +29,8 @@
#include "level/parser/parserline.h" #include "level/parser/parserline.h"
#include "level/parser/parserparam.h" #include "level/parser/parserparam.h"
#include "math/func.h"
#include "object/object_manager.h" #include "object/object_manager.h"
#include "object/old_object.h" #include "object/old_object.h"

View File

@ -23,6 +23,8 @@
#include "graphics/engine/particle.h" #include "graphics/engine/particle.h"
#include "graphics/engine/water.h" #include "graphics/engine/water.h"
#include "math/func.h"
#include "object/old_object.h" #include "object/old_object.h"
#include "sound/sound.h" #include "sound/sound.h"

View File

@ -25,6 +25,8 @@
#include "level/parser/parserline.h" #include "level/parser/parserline.h"
#include "level/parser/parserparam.h" #include "level/parser/parserparam.h"
#include "math/func.h"
#include "object/object_manager.h" #include "object/object_manager.h"
#include "object/old_object.h" #include "object/old_object.h"

View File

@ -25,6 +25,8 @@
#include "level/parser/parserline.h" #include "level/parser/parserline.h"
#include "level/parser/parserparam.h" #include "level/parser/parserparam.h"
#include "math/func.h"
#include "object/object_manager.h" #include "object/object_manager.h"
#include "object/old_object.h" #include "object/old_object.h"

View File

@ -339,7 +339,6 @@ Error CAutoTower::GetError()
void CAutoTower::FireStopUpdate(float progress, bool bLightOn) void CAutoTower::FireStopUpdate(float progress, bool bLightOn)
{ {
Math::Matrix* mat;
glm::vec3 pos, speed; glm::vec3 pos, speed;
glm::vec2 dim; glm::vec2 dim;
int i; int i;
@ -365,7 +364,7 @@ void CAutoTower::FireStopUpdate(float progress, bool bLightOn)
return; return;
} }
mat = m_object->GetWorldMatrix(0); glm::mat4 mat = m_object->GetWorldMatrix(0);
speed = glm::vec3(0.0f, 0.0f, 0.0f); speed = glm::vec3(0.0f, 0.0f, 0.0f);
dim.x = 2.0f; dim.x = 2.0f;
@ -388,7 +387,7 @@ void CAutoTower::FireStopUpdate(float progress, bool bLightOn)
pos.x = listpos[i*2+0]; pos.x = listpos[i*2+0];
pos.y = 18.0f; pos.y = 18.0f;
pos.z = listpos[i*2+1]; pos.z = listpos[i*2+1];
pos = Transform(*mat, pos); pos = Math::Transform(mat, pos);
m_partiStop[i] = m_particle->CreateParticle(pos, speed, m_partiStop[i] = m_particle->CreateParticle(pos, speed,
dim, Gfx::PARTISELR, dim, Gfx::PARTISELR,

View File

@ -29,6 +29,8 @@
#include "level/parser/parserline.h" #include "level/parser/parserline.h"
#include "level/parser/parserparam.h" #include "level/parser/parserparam.h"
#include "math/func.h"
#include "object/old_object.h" #include "object/old_object.h"

View File

@ -25,6 +25,8 @@
#include "graphics/engine/oldmodelmanager.h" #include "graphics/engine/oldmodelmanager.h"
#include "graphics/engine/particle.h" #include "graphics/engine/particle.h"
#include "math/func.h"
#include "object/old_object.h" #include "object/old_object.h"
#include "object/subclass/base_alien.h" #include "object/subclass/base_alien.h"

View File

@ -24,6 +24,8 @@
#include "graphics/engine/oldmodelmanager.h" #include "graphics/engine/oldmodelmanager.h"
#include "math/func.h"
#include "object/old_object.h" #include "object/old_object.h"
#include "physics/physics.h" #include "physics/physics.h"

View File

@ -24,6 +24,8 @@
#include "graphics/engine/oldmodelmanager.h" #include "graphics/engine/oldmodelmanager.h"
#include "math/func.h"
#include "object/old_object.h" #include "object/old_object.h"
#include "physics/physics.h" #include "physics/physics.h"

View File

@ -25,6 +25,8 @@
#include "graphics/engine/oldmodelmanager.h" #include "graphics/engine/oldmodelmanager.h"
#include "graphics/engine/particle.h" #include "graphics/engine/particle.h"
#include "math/func.h"
#include "object/old_object.h" #include "object/old_object.h"
#include "object/subclass/base_alien.h" #include "object/subclass/base_alien.h"

View File

@ -1719,7 +1719,6 @@ bool CMotionVehicle::EventFrame(const Event &event)
bool CMotionVehicle::EventFrameFly(const Event &event) bool CMotionVehicle::EventFrameFly(const Event &event)
{ {
Math::Matrix* mat;
glm::vec3 pos, angle, paw[3]; glm::vec3 pos, angle, paw[3];
float hope[3], actual, final, h, a; float hope[3], actual, final, h, a;
int i; int i;

View File

@ -30,6 +30,8 @@
#include "level/parser/parserline.h" #include "level/parser/parserline.h"
#include "level/parser/parserparam.h" #include "level/parser/parserparam.h"
#include "math/const.h"
#include "script/scriptfunc.h" #include "script/scriptfunc.h"
#include <stdexcept> #include <stdexcept>

View File

@ -1182,11 +1182,11 @@ CObjectUPtr CObjectFactory::CreateTeen(const ObjectCreateParams& params)
obj->SetRotationY(angle); obj->SetRotationY(angle);
obj->SetFloorHeight(0.0f); obj->SetFloorHeight(0.0f);
Math::Matrix* mat = obj->GetWorldMatrix(0); glm::mat4 mat = obj->GetWorldMatrix(0);
pos = Math::Transform(*mat, glm::vec3(-56.0f, 22.0f, 0.0f)); pos = Math::Transform(mat, glm::vec3(-56.0f, 22.0f, 0.0f));
m_particle->CreateParticle(pos, glm::vec3(0.0f, 0.0f, 0.0f), { 20.0f, 20.0f }, Gfx::PARTISELY, 1.0f, 0.0f, 0.0f); m_particle->CreateParticle(pos, glm::vec3(0.0f, 0.0f, 0.0f), { 20.0f, 20.0f }, Gfx::PARTISELY, 1.0f, 0.0f, 0.0f);
pos = Math::Transform(*mat, glm::vec3(-65.0f, 40.0f, 0.0f)); pos = Math::Transform(mat, glm::vec3(-65.0f, 40.0f, 0.0f));
Gfx::Color color; Gfx::Color color;
color.r = 4.0f; color.r = 4.0f;
color.g = 2.0f; color.g = 2.0f;
@ -1444,11 +1444,11 @@ CObjectUPtr CObjectFactory::CreateTeen(const ObjectCreateParams& params)
obj->SetRotationY(angle); obj->SetRotationY(angle);
obj->SetFloorHeight(0.0f); obj->SetFloorHeight(0.0f);
Math::Matrix* mat = obj->GetWorldMatrix(0); glm::mat4 mat = obj->GetWorldMatrix(0);
pos = Math::Transform(*mat, glm::vec3(0.0f, 50.0f, 0.0f)); pos = Math::Transform(mat, glm::vec3(0.0f, 50.0f, 0.0f));
m_particle->CreateParticle(pos, glm::vec3(0.0f, 0.0f, 0.0f), { 100.0f, 100.0f }, Gfx::PARTISELY, 1.0f, 0.0f, 0.0f); m_particle->CreateParticle(pos, glm::vec3(0.0f, 0.0f, 0.0f), { 100.0f, 100.0f }, Gfx::PARTISELY, 1.0f, 0.0f, 0.0f);
pos = Math::Transform(*mat, glm::vec3(0.0f, 50.0f, 0.0f)); pos = Math::Transform(mat, glm::vec3(0.0f, 50.0f, 0.0f));
Gfx::Color color; Gfx::Color color;
color.r = 4.0f; color.r = 4.0f;
color.g = 2.0f; color.g = 2.0f;

View File

@ -1720,12 +1720,12 @@ void COldObject::SetTransporterPart(int part)
// Returns matrices of an object portion. // Returns matrices of an object portion.
Math::Matrix COldObject::GetRotateMatrix(int part) glm::mat4 COldObject::GetRotateMatrix(int part)
{ {
return m_objectPart[part].matRotate; return m_objectPart[part].matRotate;
} }
Math::Matrix COldObject::GetWorldMatrix(int part) glm::mat4 COldObject::GetWorldMatrix(int part)
{ {
if ( m_objectPart[0].bTranslate || if ( m_objectPart[0].bTranslate ||
m_objectPart[0].bRotate ) m_objectPart[0].bRotate )

View File

@ -64,10 +64,10 @@ struct ObjectPart
bool bTranslate = false; bool bTranslate = false;
bool bRotate = false; bool bRotate = false;
bool bZoom = false; bool bZoom = false;
Math::Matrix matTranslate; glm::mat4 matTranslate;
Math::Matrix matRotate; glm::mat4 matRotate;
Math::Matrix matTransform; glm::mat4 matTransform;
Math::Matrix matWorld; glm::mat4 matWorld;
}; };
namespace Ui namespace Ui

View File

@ -28,6 +28,8 @@
#include "level/parser/parserline.h" #include "level/parser/parserline.h"
#include "level/parser/parserparam.h" #include "level/parser/parserparam.h"
#include "math/func.h"
#include "object/object_create_params.h" #include "object/object_create_params.h"
#include "sound/sound.h" #include "sound/sound.h"

View File

@ -95,13 +95,13 @@ void CStaticObject::Write(CLevelParserLine* line)
void CStaticObject::TransformCrashSphere(Math::Sphere& crashSphere) void CStaticObject::TransformCrashSphere(Math::Sphere& crashSphere)
{ {
Math::Matrix worldMatrix = m_engine->GetStaticMeshWorldMatrix(m_meshHandle); glm::mat4 worldMatrix = m_engine->GetStaticMeshWorldMatrix(m_meshHandle);
Math::Transform(worldMatrix, crashSphere.pos); Math::Transform(worldMatrix, crashSphere.pos);
} }
void CStaticObject::TransformCameraCollisionSphere(Math::Sphere& collisionSphere) void CStaticObject::TransformCameraCollisionSphere(Math::Sphere& collisionSphere)
{ {
Math::Matrix worldMatrix = m_engine->GetStaticMeshWorldMatrix(m_meshHandle); glm::mat4 worldMatrix = m_engine->GetStaticMeshWorldMatrix(m_meshHandle);
Math::Transform(worldMatrix, collisionSphere.pos); Math::Transform(worldMatrix, collisionSphere.pos);
} }

View File

@ -122,7 +122,6 @@ Error CTaskFireAnt::Start(glm::vec3 impact)
Error CTaskFireAnt::IsEnded() Error CTaskFireAnt::IsEnded()
{ {
Math::Matrix* mat;
glm::vec3 pos, speed; glm::vec3 pos, speed;
glm::vec2 dim; glm::vec2 dim;
float angle, dist; float angle, dist;
@ -169,8 +168,8 @@ Error CTaskFireAnt::IsEnded()
for ( i=0 ; i<20 ; i++ ) for ( i=0 ; i<20 ; i++ )
{ {
pos = glm::vec3(-2.5f, -0.7f, 0.0f); pos = glm::vec3(-2.5f, -0.7f, 0.0f);
mat = m_object->GetWorldMatrix(2); glm::mat4 mat = m_object->GetWorldMatrix(2);
pos = Math::Transform(*mat, pos); pos = Math::Transform(mat, pos);
dist = glm::distance(pos, m_impact); dist = glm::distance(pos, m_impact);
speed = m_impact-pos; speed = m_impact-pos;
speed.x += (Math::Rand()-0.5f)*dist*1.2f; speed.x += (Math::Rand()-0.5f)*dist*1.2f;

View File

@ -18,6 +18,8 @@
*/ */
#include "math/func.h"
#include "object/task/taskgungoal.h" #include "object/task/taskgungoal.h"
#include "object/old_object.h" #include "object/old_object.h"

View File

@ -134,7 +134,6 @@ bool CTaskPen::EventProcess(const Event &event)
Error CTaskPen::Start(bool bDown, TraceColor color) Error CTaskPen::Start(bool bDown, TraceColor color)
{ {
glm::vec3 pos; glm::vec3 pos;
Math::Matrix* mat;
ObjectType type; ObjectType type;
int i; int i;
@ -179,9 +178,9 @@ Error CTaskPen::Start(bool bDown, TraceColor color)
m_timeDown = 0.0f; m_timeDown = 0.0f;
} }
mat = m_object->GetWorldMatrix(0); glm::mat4 mat = m_object->GetWorldMatrix(0);
pos = glm::vec3(-3.0f, 7.0f, 0.0f); pos = glm::vec3(-3.0f, 7.0f, 0.0f);
pos = Math::Transform(*mat, pos); // position of carousel pos = Math::Transform(mat, pos); // position of carousel
m_supportPos = pos; m_supportPos = pos;
m_phase = TPP_UP; m_phase = TPP_UP;

View File

@ -70,7 +70,6 @@ CTaskShield::~CTaskShield()
bool CTaskShield::EventProcess(const Event &event) bool CTaskShield::EventProcess(const Event &event)
{ {
Math::Matrix matrix;
glm::vec3 pos, speed, goal, angle; glm::vec3 pos, speed, goal, angle;
Gfx::Color color; Gfx::Color color;
glm::vec2 dim; glm::vec2 dim;
@ -178,6 +177,7 @@ bool CTaskShield::EventProcess(const Event &event)
angle.x = (Math::Rand()-0.5f)*Math::PI*1.2f; angle.x = (Math::Rand()-0.5f)*Math::PI*1.2f;
angle.y = 0.0f; angle.y = 0.0f;
angle.z = (Math::Rand()-0.5f)*Math::PI*1.2f; angle.z = (Math::Rand()-0.5f)*Math::PI*1.2f;
glm::mat4 matrix;
Math::LoadRotationXZYMatrix(matrix, angle); Math::LoadRotationXZYMatrix(matrix, angle);
goal = Math::Transform(matrix, glm::vec3(0.0f, GetRadius()-dim.x, 0.0f)); goal = Math::Transform(matrix, glm::vec3(0.0f, GetRadius()-dim.x, 0.0f));
goal += pos; goal += pos;

View File

@ -1441,7 +1441,7 @@ void CPhysics::UpdateMotionStruct(float rTime, Motion &motion)
bool CPhysics::EventFrame(const Event &event) bool CPhysics::EventFrame(const Event &event)
{ {
ObjectType type; ObjectType type;
Math::Matrix objRotate, matRotate; glm::mat4 objRotate, matRotate;
glm::vec3 iPos{ 0, 0, 0 }, iAngle{ 0, 0, 0 }, tAngle{ 0, 0, 0 }, pos{ 0, 0, 0 }, newpos{ 0, 0, 0 }, angle{ 0, 0, 0 }, newangle{ 0, 0, 0 }, n{ 0, 0, 0 }; glm::vec3 iPos{ 0, 0, 0 }, iAngle{ 0, 0, 0 }, tAngle{ 0, 0, 0 }, pos{ 0, 0, 0 }, newpos{ 0, 0, 0 }, angle{ 0, 0, 0 }, newangle{ 0, 0, 0 }, n{ 0, 0, 0 };
float h, w; float h, w;
int i; int i;
@ -2288,7 +2288,7 @@ void CPhysics::FloorAdapt(float aTime, float rTime,
Character* character; Character* character;
ObjectType type; ObjectType type;
glm::vec3 norm{ 0, 0, 0 }; glm::vec3 norm{ 0, 0, 0 };
Math::Matrix matRotate; glm::mat4 matRotate;
float level, h, f, a1, volume, freq, force; float level, h, f, a1, volume, freq, force;
bool bSlopingTerrain; bool bSlopingTerrain;
@ -2498,7 +2498,7 @@ void CPhysics::FloorAngle(const glm::vec3 &pos, glm::vec3 &angle)
int CPhysics::ObjectAdapt(const glm::vec3 &pos, const glm::vec3 &angle) int CPhysics::ObjectAdapt(const glm::vec3 &pos, const glm::vec3 &angle)
{ {
Math::Matrix matRotate; glm::mat4 matRotate;
glm::vec3 iPos{ 0, 0, 0 }, oAngle{ 0, 0, 0 }, oSpeed{ 0, 0, 0 }; glm::vec3 iPos{ 0, 0, 0 }, oAngle{ 0, 0, 0 }, oSpeed{ 0, 0, 0 };
float distance, force, volume; float distance, force, volume;
int colType; int colType;

View File

@ -3739,7 +3739,7 @@ void CScriptFunctions::uObject(CBotVar* botThis, void* user)
} }
else else
{ {
Math::Matrix matRotate; glm::mat4 matRotate;
Math::LoadRotationZXYMatrix(matRotate, object->GetRotation()); Math::LoadRotationZXYMatrix(matRotate, object->GetRotation());
pos = physics->GetLinMotion(MO_CURSPEED); pos = physics->GetLinMotion(MO_CURSPEED);
pos = Math::Transform(matRotate, pos); pos = Math::Transform(matRotate, pos);

View File

@ -30,6 +30,8 @@
#include "graphics/core/renderers.h" #include "graphics/core/renderers.h"
#include "math/func.h"
namespace Ui namespace Ui
{ {
// Object's constructor. // Object's constructor.

View File

@ -36,6 +36,8 @@
#include "level/parser/parser.h" #include "level/parser/parser.h"
#include "math/func.h"
#include "script/script.h" #include "script/script.h"
#include "ui/controls/scroll.h" #include "ui/controls/scroll.h"

View File

@ -26,6 +26,8 @@
#include "graphics/core/device.h" #include "graphics/core/device.h"
#include "graphics/engine/engine.h" #include "graphics/engine/engine.h"
#include "math/func.h"
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>

View File

@ -24,6 +24,8 @@
#include "graphics/engine/engine.h" #include "graphics/engine/engine.h"
#include "math/func.h"
#include <cassert> #include <cassert>
#include <cstring> #include <cstring>

View File

@ -27,6 +27,8 @@
#include "graphics/engine/engine.h" #include "graphics/engine/engine.h"
#include "math/func.h"
#include <cmath> #include <cmath>
namespace Ui namespace Ui

View File

@ -32,6 +32,8 @@
#include "level/player_profile.h" #include "level/player_profile.h"
#include "level/robotmain.h" #include "level/robotmain.h"
#include "math/func.h"
#include "sound/sound.h" #include "sound/sound.h"
#include "ui/controls/button.h" #include "ui/controls/button.h"

View File

@ -31,6 +31,8 @@
#include "level/robotmain.h" #include "level/robotmain.h"
#include "math/func.h"
#include "sound/sound.h" #include "sound/sound.h"
#include "ui/maindialog.h" #include "ui/maindialog.h"

View File

@ -21,6 +21,8 @@
#include "graphics/engine/particle.h" #include "graphics/engine/particle.h"
#include "math/func.h"
namespace UI namespace UI
{ {
CParticlesGenerator::CParticlesGenerator() CParticlesGenerator::CParticlesGenerator()

View File

@ -706,8 +706,8 @@ void CScreenApperance::SetCamera(float x, float y, float cameraDistance)
glm::vec3 p2D(x, y, cameraDistance); glm::vec3 p2D(x, y, cameraDistance);
glm::vec3 p3D{}; glm::vec3 p3D{};
Math::Matrix matView; glm::mat4 matView;
Math::Matrix matProj = engine->GetMatProj(); glm::mat4 matProj = engine->GetMatProj();
Math::LoadViewMatrix(matView, glm::vec3(0.0f, 0.0f, -cameraDistance), Math::LoadViewMatrix(matView, glm::vec3(0.0f, 0.0f, -cameraDistance),
glm::vec3(0.0f, 0.0f, 0.0f), glm::vec3(0.0f, 0.0f, 0.0f),

View File

@ -29,6 +29,8 @@
#include "graphics/engine/camera.h" #include "graphics/engine/camera.h"
#include "math/func.h"
#include "ui/controls/button.h" #include "ui/controls/button.h"
#include "ui/controls/check.h" #include "ui/controls/check.h"
#include "ui/controls/editvalue.h" #include "ui/controls/editvalue.h"