00001
00007 #ifndef PRIMITIVE_REP_H
00008 #define PRIMITIVE_REP_H
00009
00010
00011
00012
00013
00014
00015 #include <iostream>
00016 #include "Vector3.h"
00017 #include "AffineTransform.h"
00018
00019
00020
00021
00022
00023
00024 #define PRIM_IN 1
00025 #define PRIM_OUT -1
00026 #define PRIM_ON 0
00027
00028
00029 using namespace std;
00030
00032
00042 class PrimitiveRep {
00043
00044
00045 public:
00046
00048 const AffineTransform &td() const;
00050 const AffineTransform &ti() const;
00051
00053 virtual void transform( const AffineTransform &md, const AffineTransform &mi);
00054
00055
00057 int id(PrimitiveRep *p) const = 0;
00059 Box3d bbox() const = 0;
00061 virtual int classify( Vector3 q) const = 0;
00063 virtual Vector3 point( Real u, Real v) const = 0;
00065 virtual Vector3 normal( Real u, Real v) const = 0;
00067 virtual Vector3 gradient( const Vector3 &q) const = 0;
00069 virtual Inode *intersect( const Ray &r) const = 0;
00071 virtual Poly *uv_decomp( Real level) const = 0;
00073 virtual Vector3 texc( Real u, Real v) const = 0;
00075 virtual Vector3 du( Real u, Real v) const = 0;
00077 virtual Vector3 dv( Real u, Real v) const = 0;
00079 virtual AffineTransform local(PrimitiveRep *p) const = 0;
00080
00082 virtual ofstream &operator<<(ofstream &out) = 0;
00083
00084 protected :
00085
00087 Box3d b;
00089 AffineTransform &td;
00091 AffineTransform &ti;
00092 };
00093
00094 inline const AffineTransform &
00095 PrimitiveRep::td() const { return td;}
00096
00097 inline const AffineTransform &
00098 PrimitiveRep::ti() const { return ti;}
00099
00100 inline void
00101 PrimitiveRep::transform(Prim *p, const AffineTransform &md, const AffineTransform &mi)
00102 {
00103 td = md*td;
00104 ti = ti*mi;
00105 }
00106
00107 #endif //PRIMITIVE_REP_H