00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #include <stdint.h>
00021 #include <iostream>
00022
00023 #ifndef _FRZ_VERTEX_HPP_
00024 #define _FRZ_VERTEX_HPP_
00025
00026 #include "frz_misc.hpp"
00027
00028 namespace Frz {
00029
00040 struct vertex {
00041 union {
00042 float x;
00043 uint32_t a;
00044 };
00045 union {
00046 float y;
00047 uint32_t b;
00048 };
00049 union {
00050 float z;
00051 uint32_t c;
00052 };
00053 union {
00054 float t;
00055 uint32_t s;
00056 };
00057
00065 vertex(float _x=0.f, float _y=0.f, float _z=0.f, float _t=1.0f):
00066 x(_x), y(_y), z(_z), t(_t) {}
00067
00072 vertex(const vertex &v): x(v.x), y(v.y), z(v.z), t(v.t) {}
00073
00081 vertex(uint32_t _a, uint32_t _b, uint32_t _c, uint32_t _s):
00082 a(_a), b(_b), c(_c), s(_s) {}
00083
00088 vertex(vector float v) { set(v); }
00089
00094 void set(vector float v) { store_unaligned(&x, v); }
00095
00102 vertex operator-(const vertex &a) const {return vertex(x-a.x, y-a.y, z-a.z);}
00103
00110 vertex operator+(const vertex &a) const {return vertex(x+a.x, y+a.y, z+a.z);}
00111
00118 vertex operator*(const vertex &b) const {
00119 return vertex(y*b.z-z*b.y, z*b.x-x*b.z, x*b.y-y*b.x);
00120 }
00121
00129 vertex operator*(float f) const { return vertex(x*f, y*f, z*f); }
00130
00135 void normalize(void);
00136
00141 float norm2(void);
00142
00147 float norm(void);
00148
00155 void update_norm(const vertex &a, const vertex &b, const vertex &c);
00156
00164 friend std::ostream &operator<<(std::ostream &os, const vertex &v) {
00165 os <<"("<<v.x<<","<<v.y<<","<<v.z<<","<<v.t<<")";
00166 return os;
00167 }
00168
00173 vector float v() const { return load_unaligned(&x); }
00174 };
00175
00183 struct svertex {
00184 int16_t x;
00185 int16_t y;
00186 int16_t z;
00187 int16_t t;
00188
00196 svertex(int16_t _x=0, int16_t _y=0, int16_t _z=0, int16_t _t=0x7fff)
00197 : x(_x), y(_y), z(_z), t(_t) {}
00198
00203 svertex(const svertex &v): x(v.x), y(v.y), z(v.z), t(v.t) {}
00204
00209 svertex(const vertex &v);
00210 };
00211
00212 }
00213
00214 #endif