This is old C++ code originally intended to be a playground for 3D math.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

127 lines
3.3 KiB

#include "vertex.h"
const vertex& vertex::operator=(const vertex& v) {
if(this==&v)
return *this;
original=v.original;
transformed=v.transformed;
trans_stage=v.trans_stage;
return *this;
}
vertex operator*(const double& a, const vertex& v) {
return v * a;
}
vertex vertex::operator*(const double& a) const {
vertex v=*this;
v.original=v.original*a;
v.transformed=v.transformed*a;
return v;
}
double vertex::operator% (const vertex& v) const {
return transformed%v.transformed;
}
vertex vertex::operator| (const vertex& v) const {
vertex w=*this;
w.original=w.original|v.original;
w.transformed=w.transformed|v.transformed;
return w;
}
vertex vertex::operator+ (const vertex& v) const {
vertex w=*this;
w.original=w.original+v.original;
w.transformed=w.transformed+v.transformed;
return w;
}
vertex vertex::operator- (const vertex& v) const {
vertex w=*this;
w.original=w.original-v.original;
w.transformed=w.transformed-v.transformed;
return w;
}
vertex vertex::norm(void) const {
vertex w;
w.original=original*(1/original.v_betr());
w.transformed=transformed*(1/transformed.v_betr());
return w;
}
double vertex::betr(void) const {
return transformed.v_betr();
}
void vertex::reset(void) {
if(trans_stage!=0) {
trans_stage=0;
transformed=original;
}
}
void vertex::transform(const Mmn<double>& t_mat, int p) {
if(trans_stage < p) {
transformed=t_mat % transformed;
trans_stage=p;
}
}
void vertex::project_2d(double lcx, double sw, double sh,
double ph_ar, double sy, int p) {
if(trans_stage < p) {
transformed[X]=transformed[X]/transformed[Z] *
(lcx * sw) + 0.5*sw;
transformed[Y]=-transformed[Y]/transformed[Z] *
(lcx * ph_ar * sh) + 0.5*sy*sh;
transformed[Z]=1/transformed[Z]; // 1/Z ist linear im projezierten
// Polygon kann ich also über die
// Polygonkanten interpolieren
// brauche ich fuer z-Buffer,
// Texturemapping und evtl. noch mehr.
trans_stage=p;
}
}
inline double vertex::unproject_X(double tx, double tz,
double lcx, double sw) {
return (tx - 0.5*sw) / (lcx * sw) / tz;
}
inline double vertex::unproject_Y(double ty, double tz,
double lcx, double sh,
double ph_ar, double sy) {
return (ty - 0.5*sy*sh) / (lcx * ph_ar * sh) / tz;
}
inline double vertex::unproject_Z(double tz) {
return 1/tz;
}
inline double vertex::unproject_U(double tu, double tz,
double lcx, double sw) {
return (tu - 0.5*sw) / (lcx * sw) / tz;
}
inline double vertex::unproject_V(double tv, double tz,
double lcx, double sh,
double ph_ar, double sy) {
return (tv - 0.5*sy*sh) / (lcx * ph_ar * sh) / tz;
}
void vertex_list::reset(void) {
for(unsigned i=0; i<count; i++)
content[i].reset();
if(variable) {
delete [] variable;
variable=NULL;
var_count=0;
}
}