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 }