Main Page Class Hierarchy Compound List File List Compound Members File Members

RT_Grid.h

Go to the documentation of this file.
00001 /*
00002 File: RT_Grid.h
00003 
00004 Function: Interface for hierarchical grid raytracer
00005 
00006 Author(s): Andrew Willmott, 1996-2000
00007 
00008 Copyright: (c) 1997-2000, Andrew Willmott
00009 */
00010 
00011 #ifndef __RT_Grid__
00012 #define __RT_Grid__
00013 
00014 #include "RT_Defs.h"
00015 #include "RT_Prim.h"
00016 #include "RT_RayStats.h"
00017 #include "gcl/VecUtil.h"
00018 
00019 class Renderer;
00020 
00021 // --- RT_Grid support classes ------------------------------------------------
00022 
00023 
00024 // Private data structures
00025 
00026 struct PrimEntry;
00027 struct PrimListEntry;
00028 struct ObjEntry;
00029 class GridStore;
00030 
00031 #ifdef RT_MEM_DEFRAG
00032 const Int PAGE_BITS = 12; // 2 ^ PAGE_BITS = size of a memory page.
00033 const Int PAGE_PTR_BITS = PAGE_BITS - 2;
00034 const Int PAGE_PTR_SIZE = 1 << PAGE_PTR_BITS;
00035 const Int PAGE_PTR_MASK = (1 << PAGE_PTR_BITS) - 1;
00036 #else
00037  const Int PAGE_BITS = 16; // 2 ^ PAGE_BITS = size of a memory page.
00038  const Int PAGE_PTR_BITS = PAGE_BITS - 2;
00039  const Int PAGE_PTR_SIZE = 1 << PAGE_PTR_BITS;
00040  const Int PAGE_PTR_MASK = (1 << PAGE_PTR_BITS) - 1;
00041 #endif
00042 
00043  class GridStore
00046 {
00047 
00048 public:
00049 Void Init(Int size);
00050 Void Free();
00051  Int NumPages() 
00052 { return numPages; };
00053  GCLReal MemoryUsage()
00054 { return(mem / 1024.0); };
00055 
00056  PrimEntry*& operator [](Int i)
00057 { return(pages[i >> PAGE_PTR_BITS][i & PAGE_PTR_MASK]); };
00058 
00059 protected:
00060  PrimEntry*** pages; // Array of pointers to page data
00061  Int numPages; // How many page pointers we have
00062  Int mem;
00063 };
00064 
00065 
00066 // --- RT_Grid Class ----------------------------------------------------------
00067 
00068 
00069  class RT_Grid 
00070 {
00071 public:
00072 // --- Public interface -------------------------------------------------------
00073 
00074 Void MasterInit();
00075 Void Init();
00076 Void Free();
00077 
00078 Void AddObject(RT_Object *object);
00079 Void RemoveObject(RT_Object *object);
00080 Void PrepareGrid(); 
00081 
00082 Bool IntersectionExists(
00083 const Point& start,
00084 const Point& end,
00085 RT_Prim* origPrim = 0,
00086 RayStats* stats = 0
00087 );
00088 
00089 RT_Prim* ClosestIntersection(
00090 const Point& start,
00091 const Vector& direction,
00092 RT_Prim* origPrim = 0,
00093 RayStats* stats = 0
00094 );
00095 
00096 // Misc
00097 Void HierPrint(ostream& s, Int index);
00098  static Void SetTag(Int tag)
00099 { sTag = tag; };
00100 Void Draw(Renderer &r, Int level);
00101 
00102 // Memory management
00103 Void DumpMemoryUsage();
00104 GCLReal GridMemoryUsage();
00105 GCLReal MemoryUsage();
00106 static Void SetMemLimit(Int maxKbs);
00107 
00108 // Low-level
00109  Void SetBounds(Point &bmin, Point &bmax)
00110 { min = bmin; max = bmax; };
00111 Void SetupGrid();
00112 Void AddTriangle(RT_Tri *tri);
00113 Void AddGeneric(RT_Gen *gen);
00114  GCLReal GetScale()
00115 { return(MaxElt(max - min)); };
00116 
00117 // Caching
00118  RT_Prim* hitPrim; 
00119  GCLReal hitT; 
00120 
00121  Point min, max; 
00122 
00123 // --- Private! ---------------------------------------------------------------
00124 protected:
00125  ObjEntry* addedObjs; 
00126  ObjEntry* addObjs; 
00127 
00128  GridStore grid; 
00129  PrimListEntry* addPrims; 
00130  RT_Grid* subGrids; 
00131  RT_Grid* next; 
00132 
00133  GCLReal cellSize;
00134  GCLReal areaLimit;
00135  Int numCells[3];
00136  Int xSpan, ySpan; 
00137  Int totalCells, totalPrims;
00138 
00139 // Class globals
00140 
00141 public:
00142  static GCLReal sEpsilon; 
00143  static Int sMem; 
00144  static Int sMemLimit; 
00145  static Int sTriMem; 
00146  static Int sGenMem; 
00147  static Int sPointMem; 
00148 
00149  static Int sMaxCells; 
00150  static Int sMaxCellPrims;
00151  static GCLReal sPushSizeLimit;
00152  static GCLReal sMaxCellRatio;
00153  static GCLReal sMinDensity;
00154  static GCLReal sMaxExpand;
00155 
00156 // Grid maintenance
00157 
00158 protected:
00159  Int dirty; 
00160  Int level; 
00161  RT_Grid* parent; 
00162 
00163  Int stamp; 
00164  static Int sStamp; 
00165  static Int sTag; 
00166 
00167 // Methods
00168 
00169  static Void IncTime()
00170 { sStamp++; };
00171  Void Stamp()
00172 { stamp = sStamp; };
00173  Bool IsStamped()
00174 { return(stamp == sStamp); };
00175 
00176 Void UpdateBounds(Point& cellMin, Point& cellMax);
00177 Void UpdateBounds(RT_Object *object);
00178 
00179 Void CreateNestedGrids();
00180 Void CullSubGrids();
00181 Void PushPrimitives();
00182 Int CountPolys(PrimEntry *entry);
00183 
00184 Bool FindGridStart(
00185 const Point& start, 
00186 const Vector& direction,
00187 Int cell[3],
00188 Int increment[3],
00189 Int limit[3], 
00190 GCLReal& tRay,
00191 Vector& tDelta,
00192 Vector& tMax
00193 );
00194 
00195 Void RayClampEntryPoint(Int index, Bool backEntry[3], 
00196 Vector& fujiPoint, Int cell[3]);
00197 };
00198 
00199  struct ObjEntry
00200 {
00201  RT_Object* object;
00202  ObjEntry* next;
00203 };
00204 
00205 #endif

Generated at Sat Aug 5 00:26:54 2000 for Radiator by doxygen 1.1.0 written by Dimitri van Heesch, © 1997-2000

AltStyle によって変換されたページ (->オリジナル) /