velage/engine/largepos.hpp
miri 3ea07456e2 stuff added,
YEES OHMYGOD FINALLY SHIT'S WORKING
2023-12-15 19:00:02 +01:00

164 lines
No EOL
3.2 KiB
C++

#ifndef __LARGEPOS_H__
#define __LARGEPOS_H__
#include <glm/ext/vector_float3.hpp>
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>
#define MAX_DOUBLE 1000000.0
// a class to preserve the exact position of object's positions in deep space
class largePos{
public:
//position in Mm (Megameteres)
long long int ix=0;
long long int iy=0;
long long int iz=0;
//position down to µm (in m)
long double fx=0.0;
long double fy=0.0;
long double fz=0.0;
// convert mega big brain int + float into normal opengl understandable stuff glm::vec4(x,y,z, object scale)
glm::vec4 toFloatSpace(long double scale, largePos point){
long double Mm=scale/1e6;
float x = (ix-point.ix)/Mm;
float y = (iy-point.iy)/Mm;
float z = (iz-point.iz)/Mm;
x+=(fx-point.fx)/scale;
y+=(fy-point.fy)/scale;
z+=(fz-point.fz)/scale;
return glm::vec4(-x,-y,-z,scale);
};
largePos operator+(largePos b){
largePos ret = *this;
ret.ix+=b.ix;
ret.iy+=b.iy;
ret.iz+=b.iz;
ret.fx+=b.fx;
ret.fy+=b.fy;
ret.fz+=b.fz;
if(ret.fx>MAX_DOUBLE){
ret.ix+=1; ret.fx=(this->fx-MAX_DOUBLE)+b.fx;
}
if(ret.fx<-MAX_DOUBLE){
ret.ix-=1; ret.fx=(this->fx+MAX_DOUBLE)+b.fx;
}
if(ret.fy>MAX_DOUBLE){
ret.iy+=1; ret.fy=(this->fy-MAX_DOUBLE)+b.fy;
}
if(ret.fy<-MAX_DOUBLE){
ret.iy-=1; ret.fy=(this->fy+MAX_DOUBLE)+b.fy;
}
if(ret.fz>MAX_DOUBLE){
ret.iz+=1; ret.fz=(this->fz-MAX_DOUBLE)+b.fz;
}
if(ret.fz<-MAX_DOUBLE){
ret.iz-=1; ret.fz=(this->fz+MAX_DOUBLE)+b.fz;
}
return ret;
}
largePos operator-(){
largePos ret;
ret.ix=-this->ix;
ret.iy=-this->iy;
ret.iz=-this->iz;
ret.fx=-this->fx;
ret.fy=-this->fy;
ret.fz=-this->fz;
return ret;
}
largePos operator-(largePos b){
return *this + -b;
}
largePos operator=(largePos b){
ix=b.ix;
iy=b.iy;
iz=b.iz;
fx=b.fx;
fy=b.fy;
fz=b.fz;
return *this;
}
largePos operator+(glm::vec3 b){
largePos ret;
ret.fx=b.x;
ret.fy=b.y;
ret.fz=b.z;
ret = *this+ret;
// if(ret.fx>MAX_DOUBLE){
// ret.ix+=1; ret.fx=(this->fx-MAX_DOUBLE)+b.x;
// }
// if(ret.fx<-MAX_DOUBLE){
// ret.ix-=1; ret.fx=(this->fx+MAX_DOUBLE)+b.x;
// }
// if(ret.fy>MAX_DOUBLE){
// ret.iy+=1; ret.fy=(this->fy-MAX_DOUBLE)+b.y;
// }
// if(ret.fy<-MAX_DOUBLE){
// ret.iy-=1; ret.fy=(this->fy+MAX_DOUBLE)+b.y;
// }
// if(ret.fz>MAX_DOUBLE){
// ret.iz+=1; ret.fz=(this->fz-MAX_DOUBLE)+b.z;
// }
// if(ret.fz<-MAX_DOUBLE){
// ret.iz-=1; ret.fz=(this->fz+MAX_DOUBLE)+b.z;
// }
return ret;
}
largePos operator-(glm::vec3 b){
return *this + -b;
}
largePos operator+=(largePos b){
largePos ret=*this+b;
*this=ret;
return ret;
}
largePos operator-=(largePos b){
largePos ret=*this-b;
*this=ret;
return ret;
}
largePos operator+=(glm::vec3 b){
largePos ret=*this+b;
*this=ret;
return ret;
}
largePos operator-=(glm::vec3 b){
largePos ret=*this-b;
*this=ret;
return ret;
}
private:
};
#endif