00001 /* 00002 File: HierMesh.h 00003 00004 Function: Provides a recursively-subdividable mesh of quadrilaterals 00005 or triangles. 00006 00007 Author(s): Andrew Willmott 00008 00009 Copyright: (c) 1997-2000, Andrew Willmott 00010 */ 00011 00012 00013 #ifndef __HierMesh__ 00014 #define __HierMesh__ 00015 00016 #include "RadMesh.h" 00017 00018 // element capable of hierarchical subdivision... 00019 00020 class HierElem; 00021 typedef Array<HierElem> HierElemList; 00022 typedef HierElem *HierElemPtr; 00023 00024 class HierElem : public NbRadElem 00025 { 00026 public: 00027 HierElem(); 00028 virtual ~HierElem(); 00029 00030 virtual Void SetParent(HierElem &parent); 00031 virtual HierElem *New() 00032 { return(new HierElem); }; 00033 00034 Bool HasChildren() 00035 { return(child[0] != 0);}; 00036 Void FreeChildren(); 00037 00038 Void Draw(Renderer &r); 00039 virtual Void DrawLeaf(Renderer &r); 00040 Void DrawQuad(Renderer &r, RenderStyle start, Int code, 00041 RadElem *mid); 00042 Void DrawTri(Renderer &r, RenderStyle start, Int code, 00043 RadElem *mid); 00044 Void ProjQuad(Renderer &r, RenderStyle start, Int code, 00045 RadElem *mid); 00046 Void ProjTri(Renderer &r, RenderStyle start, Int code, 00047 RadElem *mid); 00048 00049 Void Reanimate(RadElem *parent); 00050 Void ConnectNeighbours(); 00051 Void Subdivide(); 00052 00053 Void SetColour(const Colour &c); 00054 00055 Void ColourVertices(Int weights[]); 00056 RadElem *FindContainer(Coord &coord); 00057 // find the leaf element containing this coord. 00058 00059 Void CreatePatches(PatchList &patches); 00060 Void CreateElements(PatchList &elements, 00061 IndexList &eltParents, Int parent); 00062 GCLReal RadError(); 00063 00064 // utilities 00065 Int CalcMidCode(RadElem *mid); 00066 Void CollectLeaves(PatchList &leaves); 00067 Void SplitElement(Int &numElems, HierElemPtr subElems[5]); 00068 Void CorrectLeaves(); 00069 00070 // Printing and Parsing 00071 Void Print(ostream &s); 00072 Void PrintRec(ostream &s); 00073 virtual Void PrintSelf(ostream &s); 00074 Void Parse(istream &s); 00075 virtual Void ParseSelf(istream &s); 00076 Void PrintID(ostream &s); // Print code ID. 00077 StrConst Name(); 00078 00079 GCLReal MemoryUse(); 00080 00081 // Accessor functions 00082 HierElem *&NbFace(Int i) 00083 { return((HierElem*&) nbFace[i]); }; 00084 00085 // Fields 00086 HierElem *child[4]; // Children, if subdivided... 00087 HierElem *parent; 00088 Int level; // level of the quadtree. 00089 UInt32 treeCode; // used to encode position in quadtree. 00090 }; 00091 00092 /* 00093 Field explanations. 00094 00095 treeCode: Defines the path from the root of the tree to this node. 00096 At level i of the tree, (3 & (treeCode >> (2 * (level 00097 - i)))) is the child to follow. E.g., treeCode = 00098 011110 for a level 3 patch: the patch is child 2 of 00099 child 3 of child 1 of the root. With 32 bit integers, 00100 this allows for 16 different levels: the lowest will 00101 have 1/65535 the side length of the highest, so that 00102 should be plenty. 00103 */ 00104 00105 // A grid of HierElems 00106 00107 class HierGrid : public GridBase 00108 { 00109 public: 00110 Void CreatePatches(PatchList &patches); 00111 Void Draw(Renderer &r); 00112 Void ColourVertices(Int weights[]); 00113 RadElem *FindContainer(Coord &coord); 00114 Void Reanimate(RadElem *parent); 00115 00116 Void Print(ostream &s); 00117 Void Parse(istream &s); 00118 StrConst Name(); 00119 00120 RadElemPtr AddChild(RadElem &quad, Int i, Int j, Int in, Int jn); 00121 // override. 00122 Void ConnectChildren(); 00123 00124 GCLReal MemoryUse(); 00125 00126 // Fields 00127 HierElemList children; 00128 }; 00129 00130 #endif