RadShader.cc

Go to the documentation of this file.
00001 #include <gra/shader/RadShader.h>
00002 #include <esg/explorer/ObjsExplorer.h>
00003 #include <esg/energy/PolygonalEnergy.h>
00004 #include <esg/mesh/Mesh.h>
00005 
00006 using namespace gra;
00007 
00008 void RadShader::setScene(Scene * pScene)
00009 {
00010     _pScene = pScene;
00011 
00012     if (!_pScene || !_pScene->root()) return;
00013 
00014     /*
00015      * Triangulate geometries
00016      */
00017 
00018     ObjsExplorer     explorer;
00019     Matrix4          trMat;
00020     bool             transformed;
00021     PolygonalEnergy* pE;
00022     Mesh*            pMesh;
00023     Geometry*        pGeom;
00024     Emittance*       pEmittance;
00025     int              ids = 0;
00026 
00027     explorer.explore(*(_pScene->root()));
00028     
00029     for (SceneGraphObject * pObj = explorer.result(trMat, transformed);
00030          pObj;
00031          pObj = explorer.result(trMat, transformed))
00032     {
00033         if (!pObj->supportsEnergy()) continue;
00034 
00035         // inspect geometry
00036         pGeom = pObj->geometry();
00037         if (!pGeom) continue;
00038         pMesh = pGeom->mesh(_meshDensity);
00039         if (!pMesh) continue;
00040 
00041         pE = new PolygonalEnergy(new AutoPtr<Mesh>(pMesh),
00042                                  PolygonalEnergy::FACET_BASED);
00043 
00044         // init energy
00045         Color3f       emission;
00046         Mesh::Plane * pPlane;
00047         pMesh->resetActSolid();
00048         do {
00049             pMesh->resetActPlane();
00050             do {
00051                 pPlane = pMesh->getActPlane();
00052                 pPlane->jmeno_roviny = ids++;
00053 
00054                 pEmittance = pObj->emittance();
00055                 if (pEmittance) { // light source
00056                     if (pEmittance->intensity(pMesh->getActPlaneCentroid(),
00057                                               emission))
00058                         pE->setRegionEnergy(pPlane->jmeno_roviny, emission);
00059                     else
00060                         pE->setRegionEnergy(pPlane->jmeno_roviny,
00061                                             Color3f(0.,0.,0.));
00062                 } else
00063                     pE->setRegionEnergy(pPlane->jmeno_roviny,
00064                                         Color3f(0.,0.,0.));
00065             } while (pMesh->goToNextPlane());
00066         } while (pMesh->goToNextSolid());
00067         
00068         pObj->setEnergyState(new AutoPtr<EnergyCoat>(pE));
00069     }
00070 
00071     /*
00072      * Init radiosity reflection model
00073      */
00074     if (_pReflectionModel) _pReflectionModel->setScene(_pScene);
00075 
00076     /*
00077      * Anounce local shader
00078      */
00079     if (_pLocalShader) _pLocalShader->setScene(_pScene);
00080 }
00081 
00082 void RadShader::distributeEnergy()
00083 {
00084     PointEnv fakeEnv;
00085     if (_pReflectionModel)
00086         (void) _pReflectionModel->illuminatePoint(fakeEnv);
00087 }
00088 
00089 bool RadShader::setRenderedShape(SceneGraphObject * s, const Matrix4 * m)
00090 {
00091     if (!_pLocalShader) return false;
00092     return _pLocalShader->setRenderedShape(s, m);
00093 }
00094 
00095 Color3f* RadShader::illuminatePoint(const Vector3& point,
00096                                     const Vector3& normal,
00097                                     const Vector3& vDir,
00098                                     float          dist,
00099                                     double*        pNV,
00100                                     const Matrix4* mat)
00101 {
00102     if (!_pLocalShader) return NULL;
00103     return _pLocalShader->illuminatePoint(point,normal,vDir,dist,NULL,mat);
00104 }

Generated on Tue Nov 21 15:11:42 2006 for gra by  doxygen 1.4.6