src/rcrt/loaders/LightLoader.cpp

Go to the documentation of this file.
00001 #include "LightLoader.h"
00002 #include "../lights/lights.h"
00003 
00004 using namespace std;
00005 
00006 namespace rcrt
00007 {
00008 
00009 LightLoader::LightLoader(string lightFile):XMLLoader(lightFile),initialised(false)
00010 {
00011 }
00012 
00013 LightLoader::~LightLoader()
00014 {
00015 }
00016 
00017 void LightLoader::init()
00018 {
00019         initialised = true;
00020         
00021         nextStartTag("light");
00022         name = parser.getAttributeValue("","name");
00023         string lType = parser.getAttributeValue("","type");
00024         if(lType == "point"){
00025                 type = POINT;
00026                 initPoint();            
00027         } else if (lType == "area"){
00028                 type = AREA;
00029                 initArea();
00030         } else if (lType == "dir"){
00031                 type = DIR;
00032                 initDir();
00033         } else if (lType == "sphere"){
00034                 type = SPHERE;
00035                 initSphere();
00036         } else {
00037                 throw runtime_error("[LightLoader]: Light does not have a valid(point|area) type: "
00038                                 + lType);
00039         }
00040 }
00041 
00042 void LightLoader::initSphere()
00043 {
00044         nextStartTag("power");
00045         RGBColor power(convertTo<float>(parser.getAttributeValue("","r")) * 1.9,
00046                 convertTo<float>(parser.getAttributeValue("","g")) * 1.9,
00047                 convertTo<float>(parser.getAttributeValue("","b")) * 1.9);
00048         nextStartTag("loc");
00049         Point3D loc(convertTo<float>(parser.getAttributeValue("","x")),
00050                 convertTo<float>(parser.getAttributeValue("","y")),
00051                 convertTo<float>(parser.getAttributeValue("","z")));
00052         nextStartTag("r");
00053         float radius = convertTo<float>(parser.getAttributeValue("","val"));
00054         nextStartTag("s");
00055         int samp = convertTo<int>(parser.getAttributeValue("","val"));
00056         light = new SphericalLight(power, radius, loc, samp);   
00057 }
00058 
00059 void LightLoader::initPoint()
00060 {
00061         nextStartTag("power");
00062         RGBColor power(convertTo<float>(parser.getAttributeValue("","r")) * 0.2,
00063                 convertTo<float>(parser.getAttributeValue("","g")) * 0.2,
00064                 convertTo<float>(parser.getAttributeValue("","b")) * 0.2);
00065         nextStartTag("loc");
00066         Point3D loc(convertTo<float>(parser.getAttributeValue("","x")),
00067                 convertTo<float>(parser.getAttributeValue("","y")),
00068                 convertTo<float>(parser.getAttributeValue("","z")));
00069         light = new PointLight(power, loc);     
00070 }
00071 
00072 void LightLoader::initArea()
00073 {
00074         nextStartTag("power");
00075         RGBColor power(convertTo<float>(parser.getAttributeValue("","r")),
00076                 convertTo<float>(parser.getAttributeValue("","g")),
00077                 convertTo<float>(parser.getAttributeValue("","b")));
00078         nextStartTag("loc");
00079         Point3D loc(convertTo<float>(parser.getAttributeValue("","x")),
00080                 convertTo<float>(parser.getAttributeValue("","y")),
00081                 convertTo<float>(parser.getAttributeValue("","z")));
00082         nextStartTag("span1");
00083         Vec3D span1(convertTo<float>(parser.getAttributeValue("","x")),
00084                 convertTo<float>(parser.getAttributeValue("","y")),
00085                 convertTo<float>(parser.getAttributeValue("","z")));
00086         nextStartTag("span2");
00087         Vec3D span2(convertTo<float>(parser.getAttributeValue("","x")),
00088                 convertTo<float>(parser.getAttributeValue("","y")),
00089                 convertTo<float>(parser.getAttributeValue("","z")));
00090         nextStartTag("no");
00091         Vec3D no(convertTo<float>(parser.getAttributeValue("","x")),
00092                 convertTo<float>(parser.getAttributeValue("","y")),
00093                 convertTo<float>(parser.getAttributeValue("","z")));
00094         light = new AreaLight(power, loc, span1, span2, no);    
00095 }
00096 
00097 void LightLoader::initDir()
00098 {
00099         nextStartTag("power");
00100         RGBColor power(convertTo<float>(parser.getAttributeValue("","r")),
00101                 convertTo<float>(parser.getAttributeValue("","g")),
00102                 convertTo<float>(parser.getAttributeValue("","b")));
00103         nextStartTag("dir");
00104         Vec3D dir(convertTo<float>(parser.getAttributeValue("","x")),
00105                 convertTo<float>(parser.getAttributeValue("","y")),
00106                 convertTo<float>(parser.getAttributeValue("","z")));
00107         light = new DirLight(power, dir);
00108 }
00109 
00110 Light* LightLoader::getLight()
00111 {
00112         return light;
00113 }
00114 
00115 bool LightLoader::nextFrame()
00116 {
00117         if(!initialised)
00118                 init();
00119         return true;
00120 }
00121 
00122 bool LightLoader::goToFrame(const int& n)
00123 {
00124         if(!initialised)
00125                 init();
00126         return true;
00127 }
00128 
00129 }

Generated on Thu Jan 31 19:26:19 2008 for RenderingCompetitionRayTracer by  doxygen 1.5.3