Das schlimme am "with" ist, dass es Fehler produzieren kann, wenn nämlich sich das with z.B. auf ein Element aus einem dynamischen Array bezieht, welches dann intern vergrößert wird... ich meine, damit kommt der nicht klar...
Naja, aber ich bin dankbar für das with, ansonsten gibt es ewig lange Konstrukte und meine Zeilen würden nicht mehr vollständig auf den Bildschirm passen... und dann verliere ich wirklich die Übersicht.
Es ist schade, dass es keine Defines gibt, sonst könnte man da nämlich auch damit abkürzen... in C++ hab ich damit richtig dreckig programmiert...
Code: Alles auswählen
#define VEC1(exp) TVec3 r; forExt(i, 3) r.v[i]=exp; return r;
#define VEC2(exp) forExt(i, 3) v[i]exp; return *this;
class TVec3{
public:
float v[3];
TVec3&operator = (float s) { forExt(i, 3) v[i]=s; return *this; };
TVec3 operator - () { VEC1( -v[i] ) };
TVec3 operator - (TVec3 opp) { VEC1( v[i]-opp.v[i] ) };
TVec3 operator - (float s) { VEC1( v[i]-s ) };
TVec3 operator + (TVec3 opp) { VEC1( v[i]+opp.v[i] ) };
TVec3 operator + (float s) { VEC1( v[i]+s ) };
TVec3 operator * (float s) { VEC1( v[i]*s ) };
TVec3 operator / (float s) { DIV0( s, return operator=(0); , return operator*(1.0/s); ) };
TVec3&operator -=(TVec3 opp) { VEC2( -=opp.v[i] ) };
TVec3&operator -=(float s) { VEC2( -=s ) };
TVec3&operator +=(TVec3 opp) { VEC2( +=opp.v[i] ) };
TVec3&operator +=(float s) { VEC2( +=s ) };
TVec3&operator *=(float s) { VEC2( *=s ) };
TVec3&operator /=(float s) { DIV0( s, return *this; , VEC2( /=s; ) ) };
float&operator [](int index) { return v[index]; };
float lngSQ() { return sqr(v[0])+sqr(v[1])+sqr(v[2]); };
float lng() { return sqrt(lngSQ()); };
void writeTo( char *p ) { *(p++)=_Byte(v[0]); *(p++)=_Byte(v[1]); *p=_Byte(v[2]); } ;
};
TVec3 crt(float a, float b, float c) { TVec3 r={a,b,c}; return r; };
float dot(TVec3 v1, TVec3 v2) { float r=0; forExt(i,3) r+=v1[i]*v2[i]; return r; };
TVec3 crs(TVec3 v1, TVec3 v2) { TVec3 r; forExt(i,3) r.v[i]=v1[(i+1)%3]*v2[(i+2)%3]-v1[(i+2)%3]*v2[(i+1)%3]; return r; };
TVec3 nrm(TVec3 v) { return v / v.lng(); }
TVec3 lrp(TVec3 v1, TVec3 v2, float s) { TVec3 r; forExt(i,3)r.v[i]=v1[i]+s*(v2[i]-v1[i]); return r; };
TVec3 normal(TVec3 v1, TVec3 v2, TVec3 v3) { return crs(v2-v1, v3-v1); }
TVec3 sat(TVec3 v) { VEC1( sat(v[i]) ) };
bool same(TVec3*v1, TVec3*v2, float s) { return (*v1-*v2).lng()<s; };
TVec3 min(TVec3 v1, TVec3 v2) { VEC1( min(v1[i], v2[i]) ) };
TVec3 max(TVec3 v1, TVec3 v2) { VEC1( max(v1[i], v2[i]) ) };
TVec3 min(TVec3 v, float s) { VEC1( min(v[i],s) ) };
TVec3 max(TVec3 v, float s) { VEC1( max(v[i],s) ) };
TVec3 reflect(TVec3 i, TVec3 n) { return i-(n*dot(i,n)*2); }
TVec3 refract(TVec3 i, TVec3 n, float ind) { float w,k; w=-(dot(i,n)*ind); k=1.0+(w-ind)*(w+ind);
return k>-ZERO_TOLERANCE?i*ind+n*(w-sqrt(k)):reflect(i, n); }
TVec3 barycentric(TVec3* v1, TVec3* v2, TVec3* v3, float f, float g) { return *v1 + (*v2-*v1)*f + (*v3-*v1)*g; };
float dist_point_line(TVec3 v, TVec3 lpos, TVec3 ldir) { return crs(v-lpos,ldir).lng()/ldir.lng(); };
float projdist_point_line(TVec3 v, TVec3 lpos, TVec3 ldir) { return dot(v-lpos,ldir); };
#undef VEC1
#undef VEC2
//---------------------------------------------------------------------------
class TMatrix4x4 {
public:
float m[16];
TMatrix4x4&operator = (float s) { forExt(i, 16) m[i]=s; return *this; };
TMatrix4x4 operator * (TMatrix4x4 mat) { TMatrix4x4 r; r=0; forExt3D(i,j,k,4,4,4) r.m[i*4+j]+=m[k*4+j]*mat.m[i*4+k]; return r; };
TMatrix4x4&operator *=(TMatrix4x4 mat) { TMatrix4x4 r=*this; *this=0; forExt3D(i,j,k,4,4,4) m[i*4+j]+=r.m[k*4+j]*mat.m[i*4+k]; return *this; };
TVec3 getAxisX(){ return crt(m[0], m[4], m[8]); };
TVec3 getAxisY(){ return crt(m[1], m[5], m[9]); };
TVec3 getAxisZ(){ return crt(m[2], m[6], m[10]); };
TVec3 getPos() { return crt(m[3], m[7], m[11]); };
TVec3 transformCoord(TVec3 v) { TVec3 r=transformNormal(v); forExt(i,3)r[i]+=m[i*4+3]; return r; };
TVec3 transformNormal(TVec3 v) { TVec3 r; r=0; forExt2D(i,j,3,3)r.v[i]+=v[j]*m[i*4+j]; return r; };
};
TMatrix4x4 matScaling(TVec3 v) { TMatrix4x4 m={v[0],0,0,0,0,v[1],0,0,0,0,v[2],0,0,0,0,1}; return m; };
TMatrix4x4 matScaling(float s) { TMatrix4x4 m={s,0,0,0,0,s,0,0,0,0,s,0,0,0,0,1}; return m; };
TMatrix4x4 matRot(float, TVec3);
TMatrix4x4 matRotX(float a) { TMatrix4x4 m={1,0,0,0,0,cos(a),-sin(a),0,0,sin(a),cos(a),0,0,0,0,1}; return m; };
TMatrix4x4 matRotY(float a) { TMatrix4x4 m={cos(a),0,sin(a),0,0,1,0,0,-sin(a),0,cos(a),0,0,0,0,1}; return m; };
TMatrix4x4 matRotZ(float a) { TMatrix4x4 m={cos(a),-sin(a),0,0,sin(a),cos(a),0,0,0,0,1,0,0,0,0,1}; return m; };
TMatrix4x4 matRotZXY(TVec3 v) { return matRotZ(v[2])*matRotX(v[0])*matRotY(v[1]); };
TMatrix4x4 matIdentity() { TMatrix4x4 m={1,0,0,0,0,1,0,0,0,0,1,0,0,0,0,1}; return m; };
TMatrix4x4 matTranslation(TVec3 v) { TMatrix4x4 m={1,0,0,v[0],0,1,0,v[1],0,0,1,v[2],0,0,0,1}; return m; };
TMatrix4x4 transpose(TMatrix4x4 m) { TMatrix4x4 r; forExt2D(i,j,4,4)r.m[i*4+j]=m.m[j*4+i]; return r; };