00001 /* 00002 File: HRElem.h 00003 00004 Function: Defines the element type used by the various hierarchical 00005 radiosity methods. 00006 00007 Author: Andrew Willmott 00008 00009 Copyright: (c) 2000, Andrew Willmott 00010 */ 00011 00012 #ifndef __HRElem__ 00013 #define __HRElem__ 00014 00015 #include "HRLink.h" 00016 #include "cl/PtrArray.h" 00017 00018 00019 // --- Hierarchical Radiosity Element ----------------------------------------- 00020 00021 00022 struct HRStats 00023 { 00024 Void Init(); 00025 00026 Int numLinks; 00027 Int numPatches; 00028 Int numVolClusters; 00029 Int numFaceClusters; 00030 Int numAliens; 00031 }; 00032 00033 enum HRFlags 00034 { 00035 hrPatch = 0x0001, 00036 hrCluster = 0x0002, 00037 hrFaceClus = 0x0004, 00038 hrIntNode = 0x0010, 00039 hrHasLights = 0x0020, 00040 hrHasNonLights = 0x0040, 00041 hrMixed = 0x0060, 00042 hrMark = 0x0080, 00043 hrAll = 0xFFFF 00044 }; 00045 00046 typedef PtrArray<HRLinkList> LinkStack; 00047 00048 class ShadeInfo 00049 { 00050 public: 00051 ShadeInfo(); 00052 00053 LinkStack linkStack; 00054 Int level; 00055 Void *data; 00056 }; 00057 00058 00059 class HRElem 00061 { 00062 public: 00063 HRElem(); 00064 virtual ~HRElem(); 00065 00066 virtual Void Reset(); 00067 // clear all data structures associated with this elt. 00068 00069 // Link refinement 00070 Bool Refine(); 00075 Bool RefineLink(HRLink *link, Int levels); 00077 Void RefineFurther(Void*); 00079 00080 // Solving 00081 Void PushPull(Void *v = 0); 00083 Void GatherAll(Void *v = 0); 00085 Void Gather(); 00087 00088 // Stub routines for wavelet radiosity 00089 00090 virtual Bool IsLeaf() = 0; 00092 virtual Void ApplyToChildren(Void (HRElem::*method)(Void*), 00093 Void *ref = 0) = 0; 00095 virtual Void MakeChildLinks(HRElem *other, HRLink *link, 00096 Int which, Int levels) = 0; 00098 virtual Void DistributeColours(); 00101 virtual Void DistributeColoursBest(ShadeInfo &shadeInfo); 00105 // Standard hierarchy routines. 00106 00107 virtual GCLReal Error() = 0; 00109 virtual Void Add() = 0; 00111 virtual Void Push() = 0; 00113 virtual Void Pull() = 0; 00115 virtual Void ClearB() = 0; 00117 virtual Void ClearR() = 0; 00119 virtual Void CalcLeafRadiosity() = 0; 00121 virtual Void InitRad(); 00123 00124 // Visualisation stuff 00125 00126 Void DrawMatrix(Renderer &r, Int baseNum); 00127 virtual Void DrawMatrixRec(Void *dmi); 00128 Void DrawContributors(Renderer &r); 00130 Void DrawContributorsRec(Void *r); 00131 Void DrawElem(Renderer &r); 00133 virtual Void DrawNodeElem(Renderer &r) = 0; 00135 virtual Void DrawLeafElem(Renderer &r) = 0; 00137 00138 // misc. 00139 00140 Void CalcStats(Void *statsIn); 00142 Void DumpHierarchy(Void *v = 0); 00143 00144 Bool IsPatch() 00145 { return(flags.IsSet(hrPatch)); }; 00146 Bool IsCluster() 00147 { return(flags.IsSet(hrCluster)); }; 00148 Bool IsFaceClus() 00149 { return(flags.IsSet(hrFaceClus)); }; 00150 00151 // Fields: just the links to other elements & flags. 00152 00153 Flags16 flags; 00154 HRLinkList links; 00155 UInt32 id; 00156 static UInt32 gID; 00157 #ifdef RAD_VIS 00158 virtual Void SetHighlight(Int n) 00159 { eltHighlight = n; }; 00160 HRElem *eltParent; 00161 Byte eltHighlight; 00162 #endif 00163 00164 // --- Generic wavelet radiosity routines ------------------------------------- 00165 00166 // these are more flexible than the hard-coded routines in the 00167 // HaarLink && Flatlet/Multiwavelet links. 00168 00169 GCLReal EltVis(HRElem *toElt); 00170 GCLReal EltVisToPoint(Point &p); 00172 00173 virtual Void EltSetVisPoints(HRElem *to, Point p[]) = 0; 00175 virtual Void EltUpdateBounds(Point &min, Point &max) = 0; 00177 00178 virtual GCLReal EltProjArea(const Vector &v) = 0; 00181 virtual GCLReal EltArea() = 0; 00183 virtual Point EltCentre() = 0; 00185 virtual Colour EltRho() = 0; 00187 00188 virtual Void EltSampleTransport(Int numSamples, Point p[], Vector n[], 00189 Matd &coeffs) = 0; 00193 virtual GCLReal EltCalcTransport(HRElem *from, Matd &coeffs) = 0; 00198 virtual Int NumCoeffs() { return 1; }; 00199 virtual Colour *R_Coeffs() = 0; 00201 virtual Colour *B_Coeffs() = 0; 00203 00204 // cluster/vector radiosity 00205 virtual Colour EltE() = 0; 00206 virtual Colour EltBA(); 00208 virtual Void AddIrradiance(const Colour &E, const Vector &m) = 0; 00209 virtual Void AddChanIrradiance(const Colour &E, Int chan); 00210 virtual Colour GetPower(const Vector &m) = 0; 00211 virtual Void EltGetSamples(Int numSamples, Point pts[]) = 0; 00212 virtual GCLReal EltMaxProjArea(const Vector &v); 00215 00216 virtual Void DebugInfo(); 00217 00218 static ostream *out; 00219 }; 00220 00221 typedef HRElem *HRElemPtr; 00222 typedef PtrArray<HRElem> HRElemList; 00223 00224 struct DMInfo 00226 { 00227 Renderer *r; 00228 Int baseNum; 00229 }; 00230 00231 GCLReal VecError(const SubVecd &v); 00233 00234 #endif