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
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
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
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) {
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
00073
00074 if (_pReflectionModel) _pReflectionModel->setScene(_pScene);
00075
00076
00077
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 }