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

RadMesh.h

Go to the documentation of this file.
00001 /*
00002 File: RadMesh.h
00003 
00004 Function: Defines a basic mesh of radiosity elements. These can be either
00005 quads (parallelograms), or triangles. 
00006 
00007 Author(s): Andrew Willmott
00008 
00009 Copyright: (c) 1995-2000, Andrew Willmott
00010 */
00011 
00012 #ifndef __RadMesh__
00013 #define __RadMesh__
00014 
00015 #include "gcl/Geometry.h"
00016 #include "gcl/Renderer.h"
00017 #include "RadControl.h"
00018 #include "gcl/Texture.h"
00019 #include "cl/PtrArray.h"
00020 #include "cl/NArray.h"
00021 
00022 class RadElem;
00023 
00024  class RadProps
00026 {
00027 public:
00028 RadProps();
00029 
00030  Colour reflectance; 
00031  Colour emittance;
00032 
00033  PointList *points; 
00034  ColourList *colours; 
00035  PointList *normals; 
00036  CoordList *texCoords; 
00037 
00038  Texture *texture;
00039  Int id;
00040 
00041 Void InterpolateIndexes(
00042 RadElem *srcElt, 
00043 Int srcVtx1, 
00044 Int srcVtx2, 
00045 RadElem *dstElt, 
00046 Int dstVtx,
00047 GCLReal m = 0.5
00048 );
00049 
00052 };
00053 
00054  struct CompareStats
00056 {
00057  GCLReal areaSum;
00058  Colour cSum;
00059  Colour cSqrSum;
00060  Colour refSum;
00061 };
00062 
00063  class PatchStats
00065 {
00066 public:
00067 Void Init();
00068 Void Update(RadElem *patch);
00069 Void Report(ostream &s);
00070 
00071  GCLReal minArea;
00072  GCLReal maxArea; 
00073  Reflectance minRefl;
00074  Reflectance maxRefl;
00075  Colour maxPower;
00076  Colour totalPower;
00077 };
00078 
00079 
00080  typedef RadElem *RadElemPtr;
00081  typedef PtrArray<RadElem> PatchList;
00082  typedef Array<RadElem> RadElemList;
00083 
00084  class RadElem
00085 {
00086 public:
00087 RadElem();
00088 virtual ~RadElem(); 
00089 
00090  Int index[4]; 
00091  Int clrIdx[4]; 
00092  Int normIdx[4]; 
00093  Int texIdx[4]; 
00094  RadProps *props; 
00095 
00096  Point centre; 
00097  Vector normal; 
00098  Colour colour; 
00099  GCLReal area; 
00100 #ifdef RAD_TEXTURE
00101 Colour localRefl;
00102 #endif
00103 #ifdef RAD_VIS
00104 Byte highlight; 
00105 #endif
00106 
00107 virtual Void Draw(Renderer &r); 
00108 // Draw this element
00109 
00110 // Sampling methods
00111 
00112 Void Compare(RadElem *to, GCLReal edgeLen, CompareStats &stats);
00113 virtual Colour Sample(Coord c);
00115 
00116 Coord FindCoord(Point &p);
00118 virtual RadElem *FindContainer(Coord &coord);
00120 virtual Colour SampleLeaf(Coord c);
00122 
00123 // Form factor-calculation methods
00124 
00125 GCLReal EstPatchFactor(const Point &p, const Vector &n);
00127 GCLReal PatchFactor(const Point &p, const Vector &n);
00129 GCLReal ApproxPatchFactor(const Point &p, const Vector &np);
00132 GCLReal EstFormFactor(RadElem *to);
00136 GCLReal EdgeArea(const Vector &p, const Vector &q, 
00137 const Vector &n);
00138 GCLReal SampledFormFactor(Int n, RadElem *to, GCLReal &error);
00139 Int OrientInfo(RadElem *to);
00140 
00141 // Visibility methods
00142 
00143 GCLReal Visibility(RadElem *to);
00144 
00145 GCLReal CentreVis(const Point &p, const Vector &n);
00146 GCLReal Visibility16(const Point &p, const Vector &n);
00147 Bool PotentiallyVis(RadElem *to);
00148 Bool PotentiallyVisAndTouching(RadElem *to, Bool &touching);
00149 GCLReal Visibility44(RadElem *to);
00150 
00151 Void SetVisPoints(Point p[]);
00152 GCLReal RadVis4x4(RadElem *to);
00153 GCLReal RadVis16x1(const Point &p, const Vector &n);
00154 
00155 // Radiosity methods....
00156 
00157 virtual Void ColourVertices(Int weights[]); 
00159 virtual Void CreatePatches(PatchList &patches);
00161 // Utility
00162 
00163 virtual Void Print(ostream &s);
00164 virtual Void Parse(istream &s);
00165 virtual Void Reanimate(RadElem *parent);
00166 virtual StrConst Name();
00167 
00168 Void SetProps(RadProps *props);
00169 Void SetHighlight(Int h);
00170 Void DrawHighlight(Renderer &r);
00171 Void RaiseVertex(Renderer &r, Int i);
00173  Void SetColour(const Colour &c)
00175 { colour = c; };
00176 
00177 // Property accessor methods
00178  
00179  Vector &Vertex(Int i) {return((*props->points)[index[i]]);};
00180  Colour &VtxClr(Int i) {return((*props->colours)[clrIdx[i]]);};
00181  Vector &Normal(Int i) {return((*props->normals)[normIdx[i]]);};
00182 Coord &TexCoord(Int i) {return((*props->texCoords)[texIdx[i]]);};
00183 
00184 Void SetIndexes(
00185 Int dstIdx, 
00186 RadElem *src, 
00187 Int srcIdx
00188 );
00189 
00190 Void SetAllIndexes(
00191 RadElem *s0, 
00192 Int i0, 
00193 RadElem *s1, 
00194 Int i1, 
00195 RadElem *s2, 
00196 Int i2,
00197 RadElem *s3, 
00198 Int i3
00199 );
00200  
00201  Vector &Normal() {return(normal);};
00202  Vector &Centre() {return(centre);};
00203 Colour &Emittance() {return(props->emittance);};
00204 #ifdef RAD_TEXTURE
00205 Colour &Reflectance() {return(localRefl);};
00206  #else
00207 Colour &Reflectance() {return(props->reflectance);};
00208  #endif
00209 Int Sides() {return((index[3] < 0) ? 3 : 4);};
00210  
00211  Bool IsTri() {return(index[3] < 0);};
00212  Bool IsQuad() {return(index[3] >= 0);};
00213  Bool IsTextured() {return(props->texCoords != 0);};
00214  Bool HasNormals() {return(props->normals != 0);};
00215 Void SendPoints(Renderer &r)
00216 { r.P(Vertex(0)).P(Vertex(1)).P(Vertex(2));
00217 if (IsQuad()) r.P(Vertex(3)); };
00218 
00219 virtual GCLReal 
00220 MemoryUse();
00221  
00222  static Int sGridMem;
00223 static Int sGridChildMem;
00224 };
00225 
00226 ostream &operator << (ostream &s, RadElem &rq);
00227 istream &operator >> (istream &s, RadElem &rq);
00228 
00229 // --- An elem with neighbour info --------------------------------------------
00230 
00231  class NbRadElem : public RadElem
00232 {
00233 public:
00234 NbRadElem();
00235 
00236 NbRadElem *nbFace[4]; 
00238  Byte nbEdge[4];
00243 GCLReal MemoryUse();
00244 };
00245 
00246 
00247 // --- An elem that can be gridded --------------------------------------------
00248 
00249 
00250  class GridBase : public NbRadElem
00251 {
00252 public:
00253 Void Mesh(GCLReal density);
00254 
00255 virtual RadElemPtr AddChild(RadElem &elem, Int i, Int j, Int in, Int jn) = 0;
00257 Int FindChildIndex(Coord &coord);
00259 
00260  Int rows, cols;
00261 };
00262 
00263  class RadGrid : public GridBase
00264 {
00265 public:
00266 Void CreatePatches(PatchList &patches);
00267 Void Draw(Renderer &r);
00268 Void ColourVertices(Int weights[]);
00269 RadElem *FindContainer(Coord &coord); 
00270 Void Reanimate(RadElem *parent);
00271 
00272 Void Print(ostream &s);
00273 Void Parse(istream &s);
00274 StrConst Name();
00275 
00276 GCLReal MemoryUse();
00277 
00278 RadElemPtr AddChild(RadElem &elem, Int i, Int j, Int in, Int jn); 
00279  RadElemList children;
00280 };
00281 
00282  const GCLReal kRaySurfEps = 1e-6; // amount to offset vis testing from
00283 // surfaces to aVoid self-intersection.
00284 
00285 #endif

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

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