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

AnaRad.cc

Go to the documentation of this file.
00001 /*
00002 File: AnaRad.cc
00003 
00004 Function: See header file
00005 
00006 Author(s): Andrew Willmott
00007 
00008 Copyright: (c) 1997-2000, Andrew Willmott
00009 
00010 Notes: 
00011 
00012 */
00013 
00014 #include "AnaRad.h"
00015 #include "AnaMesh.h"
00016 #ifdef RAD_VIS
00017 #include "gcl/Forms.h"
00018 #endif
00019 
00020  Bool AnaRad::Render()
00021 // Returns true if no interruptions.
00022 {
00023 Int i, j;
00024 Colour patchIrr;
00025 GCLReal save;
00026 GCLReal sumArea, sumAF, sumAFLog, patchFactor;
00027 Point p;
00028 Vector n;
00029 
00030 RadMethod::Render();
00031 
00032 lights.Clear();
00033 if (!gRadControl->patchView)
00034 for (j = 0; j < baseElems.NumItems(); j++)
00035 if (len(baseElems[j]->Emittance()) > 0) // A light!
00036 lights.Append(baseElems[j]);
00037 
00038 gRadControl->jitterRot = false;
00039 sumArea = 0.0;
00040 sumAF = 0.0;
00041 sumAFLog = 0.0;
00042 theMI = 0.0;
00043 
00044 Stage(1);
00045 
00046 for (i = 0; i < patches.NumItems(); i++)
00047 {
00048 p = patches[i]->Centre();
00049 n = patches[i]->Normal();
00050 
00051 patchIrr = cBlack;
00052 sumArea += patches[i]->area;
00053 
00054 if (lights.NumItems() > 0)
00055 {
00056 for (j = 0; j < lights.NumItems(); j++) 
00057 {
00058 patchFactor = lights[j]->PatchFactor(p, n);
00059 if (patchFactor > 0)
00060 patchFactor *= lights[j]->Visibility(patches[i]);
00061 
00062 sumAF += patches[i]->area * patchFactor;
00063 sumAFLog += patches[i]->area * patchFactor * 
00064 log(patchFactor / lights[j]->area);
00065 
00066 patchIrr += patchFactor * lights[j]->Emittance();
00067 }
00068 }
00069 else
00070 {
00071 for (j = 0; j < patches.NumItems(); j++) 
00072 {
00073 patchFactor = patches[j]->PatchFactor(p, n);
00074 if (patchFactor > 0)
00075 patchFactor *= patches[j]->Visibility(patches[i]);
00076 
00077 sumAF += patches[i]->area * patchFactor;
00078 sumAFLog += patches[i]->area * patchFactor * 
00079 log(patchFactor / patches[j]->area);
00080 
00081 patchIrr += patchFactor * patches[j]->Emittance();
00082 }
00083 } 
00084 
00085 patches[i]->SetColour(patches[i]->Emittance() + 
00086 patches[i]->Reflectance() * patchIrr);
00087 }
00088 
00089 cout << sumAFLog << ", " << sumAF << ", " << sumArea << endl;
00090 theMI = (sumAFLog + sumAF * log(sumArea)) / sumArea;
00091 
00092 Stage(2);
00093 
00094 return(0);
00095 }
00096 
00097  RadElem *AnaRad::NewMesh()
00098 {
00099 return(new AnaGrid);
00100 }
00101 
00102 #ifdef RAD_VIS
00103 
00104 Void AnaRad::DumpStats(){}
00105 
00106 Int AnaRad::Stage(Int stage)
00107 {
00108 switch (stage)
00109 {
00110 case 1:
00111 break;
00112 case 2:
00113 ColourVertices();
00114 display->Redraw();
00115 Field(out1) << "Mutual Information: " << theMI << show;
00116 Field(out2) << "illum patches: " << lights.NumItems()
00117 << " patches:" << patches.NumItems() << show;
00118 Field(out3) << "Rays: " << gRadControl->rays << show;
00119 break;
00120 }
00121 
00122 if (Pause()) return(1);
00123 
00124 return(0);
00125 }
00126 
00127 #else
00128 
00129  Void AnaRad::DumpStats()
00130 {
00131 cout << dumpID
00132 << ' ' << totTime
00133 << ' ' << gRadControl->stage
00134 << ' ' << lights.NumItems()
00135 << ' ' << patches.NumItems()
00136 << ' ' << gRadControl->rays
00137 << ' ' << theMI
00138 << endl;
00139 
00140 DumpScene();
00141 }
00142 
00143  Int AnaRad::Stage(Int stage)
00144 {
00145 if (CheckTime()) return(1);
00146 
00147 gRadControl->stage = stage;
00148 
00149 switch (stage)
00150 {
00151 case 1: // pre setup
00152 cout << "method ana " << endl;
00153 cout << "sub " << gRadControl->patchSubdivs << endl;
00154 cout << "scene " << sceneName << endl;
00155 cout << "format ID time stage illumPatches patches rays MI" << endl; 
00156 cout << "-------------------------------------------------" << endl;
00157 
00158 DumpStats();
00159 break;
00160 
00161 case 2:
00162 DumpStats();
00163 break;
00164 
00165 default:
00166 break;
00167 }
00168 
00169 if (Idle()) return(0);
00170 timer.ContTimer(); 
00171 return(0);
00172 }
00173 
00174 #endif
00175 

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

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