spoonedit/Tools/MapTools/include/Transform.h

64 lines
1.9 KiB
C++

//
// Created by tv on 30.04.23.
//
#ifndef SPOONTOOL_TRANSFORM_H
#define SPOONTOOL_TRANSFORM_H
#include<Vector3.h>
#include<yaml-cpp/yaml.h>
#include<glm/mat4x4.hpp>
#include "glm/ext/vector_float3.hpp"
#include "glm/ext/matrix_transform.hpp"
#include<glm/mat3x2.hpp>
#include<glm/mat3x3.hpp>
#include<glm/vec3.hpp>
#include<glm/vec2.hpp>
struct Transform{
inline Transform(): Position(0,0,0), Scale(1,1,1), Rotation(0,0,0),
LastPosition(0,0,0), LastScale(0,0,0), LastRotation(0,0,0){}
inline Transform(Vector3 pos, Vector3 scale, Vector3 rot): Position(pos), Scale(scale), Rotation(rot),
LastPosition(0,0,0), LastScale(0,0,0), LastRotation(0,0,0){}
inline void updateMatricies() {
glm::vec3& pos = *(glm::vec3*)&Position;
glm::vec3& rot = *(glm::vec3*)&Rotation;
glm::vec3& scale = *(glm::vec3*)&Scale;
glm::mat4 translationMatrix = glm::translate(glm::mat4(1),glm::vec3(pos.x,pos.y,pos.z));
glm::mat4 rotationMatrixZ = glm::rotate(glm::mat4(1),glm::radians(rot.z), glm::vec3(0,0,1));
glm::mat4 rotationMatrixY = glm::rotate(rotationMatrixZ,glm::radians(rot.y), glm::vec3(0,1,0));
rotationMatrix = glm::rotate(rotationMatrixY,glm::radians(rot.x), glm::vec3(1,0,0));
glm::mat4 scaleMatrix = glm::scale(glm::mat4(1),scale);
matrix = translationMatrix * rotationMatrix * scaleMatrix;
}
inline void recalcMatriciesIfNeeded() {
if( Position != LastPosition ||
Scale != LastScale ||
Rotation != LastRotation ) {
updateMatricies();
LastPosition = Position;
LastScale = Scale;
LastRotation = Rotation;
}
}
Vector3 Position,Scale,Rotation;
glm::mat4 matrix, rotationMatrix;
void InsertIntoYaml(YAML::Emitter &Emitter);
private:
Vector3 LastPosition,LastScale,LastRotation;
};
#endif //SPOONTOOL_TRANSFORM_H