00001 /*
00002 File: RT_Prim.h
00003
00004 Function: Defines raytracing primitives
00005
00006 Author(s): Andrew Willmott
00007
00008 Copyright: (c) 1997-2000, Andrew Willmott
00009 */
00010
00011 #ifndef __RT_Prim__
00012 #define __RT_Prim__
00013
00014 #include "RT_Defs.h"
00015
00016 // Tri flags...
00017
00018 const Byte TRI_HIT = 0x0001;
00019 const Byte GEN_HIT = 0x0001;
00020 const Byte TRI_INACTIVE = 0x0002;
00021 const Byte TRI_2SIDED_R = 0x0004; // two-sided for rendering purposes
00022 const Byte TRI_2SIDED_V = 0x0008; // two-sided for visibility purposes
00023
00024 class RT_Tri;
00025 class RT_Gen;
00026 typedef RT_Gen *RT_GenPtr;
00027
00028 // An object is a collection of primitives which share a list of (world space)
00029 // points and normals.
00030 class RT_Object
00031 {
00032 public:
00033 Void Init(Int numTris, Int numGens = 0);
00034 // call this, then fill in point & tri data
00035 Void Setup();
00036 // call once tri & gen data has been filled in
00037 Void Free();
00038
00039 Point* points;
00040 Int numPoints;
00041 Vector* normals;
00042 Int numNormals;
00043
00044 RT_Tri* tris;
00045 Int numTris;
00046 RT_GenPtr* gens;
00047 Int numGens;
00048 Void* data; // extra info we might need.
00049
00050 Int id; // per-object id.
00051 Int tag; // groups this object belongs to
00052
00053 Int stamp; // local time stamp;
00054 static Int gStamp; // global time stamp;
00055
00056 static Void IncTime() { gStamp++; };
00057 Void Stamp() { stamp = gStamp; };
00058 Bool IsStamped() { return(stamp == gStamp); };
00059 };
00060
00061
00062 // --- RT primitives ----------------------------------------------------------
00063
00064
00065 enum RT_PrimTag
00066 {
00067 rt_triangle,
00068 rt_gen,
00069 rt_grid
00070 };
00071
00072 class RT_Prim
00073 {
00074 protected:
00075 Int stamp; // local time stamp;
00076 static Int gStamp; // global time stamp;
00077
00078 public:
00079 RT_Object* object;
00080 Byte primType;
00081 Byte flags; // See values above
00082 Int id;
00083 Float area; // surface area
00084 #ifdef RT_OPAC
00085 Int cells; // number of grid cells covered
00086 #endif
00087
00088 Bool IsTrue(Int i) { return(flags & i); };
00089 static Void IncTime() { gStamp++; };
00090 Void Stamp() { stamp = gStamp; };
00091 Bool IsStamped() { return(stamp == gStamp); };
00092 };
00093
00094 class RT_Tri : public RT_Prim
00095 {
00096 public:
00097 Int v[3]; // vertex indices
00098 #ifdef RT_NORM
00099 Int n[3]; // normal indices
00100 #endif
00101
00102 Vector normal; // face normal
00103 Float d; // completes the plane equation
00104 Byte normMajorAxis; // largest component of normal
00105
00106 // Methods
00107
00108 Void Init(Int v1, Int v2, Int v3, RT_Object *obj, Int triID);
00109
00110 Bool PointIsInside(Point &p);
00111 Void FindBaryCoords(Point &p, Vector &coords);
00112 Void UpdateBounds(Point &min, Point &max);
00113 Void MakeNormal();
00114
00115 Void Draw();
00116
00117 Point& Vertex(Int i) { return(object->points[v[i]]); };
00118 #ifdef RT_NORM
00119 Point& Normal(Int i) { return(object->normals[n[i]]); };
00120 #endif
00121 };
00122
00123 class RT_Gen : public RT_Prim
00124 // generic RT object.
00125 {
00126 public:
00127 GCLReal hitT;
00128
00129 Void Init(const Point ¢re, GCLReal radius,
00130 RT_Object *obj, Int genID);
00131
00132 virtual Bool Intersect(Point &start, Vector &dir, GCLReal tMin,
00133 GCLReal tMax) = 0;
00134
00135 virtual Void UpdateBounds(Point &min, Point &max) = 0;
00136 virtual Void FindBounds(Point &min, Point &max) = 0;
00137 };
00138
00139 class RT_Sphere : public RT_Gen
00140 {
00141 public:
00142 Point centre;
00143 GCLReal radius;
00144 GCLReal sqrRad;
00145
00146 Void Init(const Point ¢re, GCLReal radius, RT_Object *obj,
00147 Int genID);
00148
00149 Bool Intersect(Point &start, Vector &dir, GCLReal tMin,
00150 GCLReal tMax);
00151
00152 Void UpdateBounds(Point &min, Point &max);
00153 Void FindBounds(Point &min, Point &max);
00154 };
00155
00156 #endif
00157