1 /* 2 Copyright (c) 2008-2009 NetAllied Systems GmbH 3 4 This file is part of COLLADASaxFrameworkLoader. 5 6 Licensed under the MIT Open Source License, 7 for details please see LICENSE file or the website 8 http://www.opensource.org/licenses/mit-license.php 9 */ 10 11 #include "COLLADASaxFWLStableHeaders.h" 12 #include "COLLADASaxFWLLibraryLightsLoader.h" 13 #include "COLLADASaxFWLLoader.h" 14 #include "COLLADASaxFWLFileLoader.h" 15 16 #include "COLLADAFWIWriter.h" 17 #include "COLLADAFWLight.h" 18 #include "COLLADAFWColor.h" 19 20 21 namespace COLLADASaxFWL 22 { 23 24 //------------------------------ LibraryLightsLoader(IFilePartLoader * callingFilePartLoader)25 LibraryLightsLoader::LibraryLightsLoader( IFilePartLoader* callingFilePartLoader ) 26 : FilePartLoader(callingFilePartLoader) 27 , mCurrentColorValueIndex(0) 28 { 29 } 30 31 //------------------------------ ~LibraryLightsLoader()32 LibraryLightsLoader::~LibraryLightsLoader() 33 { 34 } 35 36 //------------------------------ getUniqueId()37 const COLLADAFW::UniqueId& LibraryLightsLoader::getUniqueId () 38 { 39 if ( mCurrentLight ) 40 return mCurrentLight->getUniqueId (); 41 return COLLADAFW::UniqueId::INVALID; 42 } 43 44 //------------------------------ end__library_lights()45 bool LibraryLightsLoader::end__library_lights() 46 { 47 moveUpInSidTree(); 48 finish(); 49 return true; 50 } 51 52 //------------------------------ begin__light(const light__AttributeData & attributeData)53 bool LibraryLightsLoader::begin__light( const light__AttributeData& attributeData ) 54 { 55 mCurrentLight = FW_NEW COLLADAFW::Light( createUniqueIdFromId( attributeData.id, COLLADAFW::Light::ID())); 56 57 if ( attributeData.name ) 58 mCurrentLight->setName( (const char*) attributeData.name ); 59 else if ( attributeData.id ) 60 mCurrentLight->setName( (const char*) attributeData.id ); 61 62 if ( attributeData.id ) 63 mCurrentLight->setOriginalId ( (const char*)attributeData.id ); 64 65 addToSidTree( attributeData.id, 0); 66 67 return true; 68 } 69 70 //------------------------------ end__light()71 bool LibraryLightsLoader::end__light() 72 { 73 moveUpInSidTree(); 74 if ( (getObjectFlags() & Loader::LIGHT_FLAG) != 0 ) 75 { 76 getFileLoader()->addLight( mCurrentLight ); 77 } 78 mCurrentLight = 0; 79 return true; 80 } 81 82 //------------------------------ begin__light__technique_common__ambient()83 bool LibraryLightsLoader::begin__light__technique_common__ambient() 84 { 85 mCurrentLight->setLightType(COLLADAFW::Light::AMBIENT_LIGHT); 86 return true; 87 } 88 89 //------------------------------ begin__color____TargetableFloat3(const color____TargetableFloat3__AttributeData & attributeData)90 bool LibraryLightsLoader::begin__color____TargetableFloat3( const color____TargetableFloat3__AttributeData& attributeData ) 91 { 92 addToSidTree( 0, attributeData.sid, &mCurrentLight->getColor()); 93 return true; 94 } 95 96 //------------------------------ end__color____TargetableFloat3()97 bool LibraryLightsLoader::end__color____TargetableFloat3() 98 { 99 // set alpha to a valid value, although it is not used by lights 100 mCurrentLight->getColor().setAlpha(1); 101 mCurrentColorValueIndex = 0; 102 moveUpInSidTree(); 103 return true; 104 } 105 106 //------------------------------ data__color____TargetableFloat3(const float * data,size_t length)107 bool LibraryLightsLoader::data__color____TargetableFloat3( const float* data, size_t length ) 108 { 109 COLLADAFW::Color& color = mCurrentLight->getColor(); 110 for ( size_t i = 0; i < length; ++i) 111 { 112 switch ( mCurrentColorValueIndex ) 113 { 114 case 0: 115 color.setRed(data[i]); 116 break; 117 case 1: 118 color.setGreen(data[i]); 119 break; 120 case 2: 121 color.setBlue(data[i]); 122 break; 123 } 124 mCurrentColorValueIndex++; 125 } 126 return true; 127 } 128 129 //------------------------------ begin__directional()130 bool LibraryLightsLoader::begin__directional() 131 { 132 mCurrentLight->setLightType(COLLADAFW::Light::DIRECTIONAL_LIGHT); 133 return true; 134 } 135 136 //------------------------------ begin__point()137 bool LibraryLightsLoader::begin__point() 138 { 139 mCurrentLight->setLightType(COLLADAFW::Light::POINT_LIGHT); 140 return true; 141 } 142 begin__constant_attenuation(const constant_attenuation__AttributeData & attributeData)143 bool LibraryLightsLoader::begin__constant_attenuation( const constant_attenuation__AttributeData& attributeData ) 144 { 145 addToSidTree( 0, attributeData.sid, &mCurrentLight->getConstantAttenuation()); 146 return true; 147 } 148 149 //------------------------------ data__constant_attenuation(float value)150 bool LibraryLightsLoader::data__constant_attenuation( float value ) 151 { 152 mCurrentLight->setConstantAttenuation(value); 153 return true; 154 } 155 156 //------------------------------ end__constant_attenuation()157 bool LibraryLightsLoader::end__constant_attenuation() 158 { 159 moveUpInSidTree(); 160 return true; 161 } 162 163 //------------------------------ begin__linear_attenuation(const linear_attenuation__AttributeData & attributeData)164 bool LibraryLightsLoader::begin__linear_attenuation( const linear_attenuation__AttributeData& attributeData ) 165 { 166 addToSidTree( 0, attributeData.sid, &mCurrentLight->getLinearAttenuation()); 167 return true; 168 } 169 170 //------------------------------ data__linear_attenuation(float value)171 bool LibraryLightsLoader::data__linear_attenuation( float value ) 172 { 173 mCurrentLight->setLinearAttenuation(value); 174 return true; 175 } 176 177 //------------------------------ end__linear_attenuation()178 bool LibraryLightsLoader::end__linear_attenuation() 179 { 180 moveUpInSidTree(); 181 return true; 182 } 183 184 //------------------------------ begin__quadratic_attenuation(const quadratic_attenuation__AttributeData & attributeData)185 bool LibraryLightsLoader::begin__quadratic_attenuation( const quadratic_attenuation__AttributeData& attributeData ) 186 { 187 addToSidTree( 0, attributeData.sid, &mCurrentLight->getQuadraticAttenuation()); 188 return true; 189 } 190 191 //------------------------------ data__quadratic_attenuation(float value)192 bool LibraryLightsLoader::data__quadratic_attenuation( float value ) 193 { 194 mCurrentLight->setQuadraticAttenuation(value); 195 return true; 196 } 197 198 //------------------------------ end__quadratic_attenuation()199 bool LibraryLightsLoader::end__quadratic_attenuation() 200 { 201 moveUpInSidTree(); 202 return true; 203 } 204 205 //------------------------------ begin__spot()206 bool LibraryLightsLoader::begin__spot() 207 { 208 mCurrentLight->setLightType(COLLADAFW::Light::SPOT_LIGHT); 209 return true; 210 } 211 212 //------------------------------ begin__falloff_angle(const falloff_angle__AttributeData & attributeData)213 bool LibraryLightsLoader::begin__falloff_angle( const falloff_angle__AttributeData& attributeData ) 214 { 215 addToSidTree( 0, attributeData.sid, &mCurrentLight->getFallOffAngle()); 216 return true; 217 } 218 219 //------------------------------ data__falloff_angle(float value)220 bool LibraryLightsLoader::data__falloff_angle( float value ) 221 { 222 mCurrentLight->setFallOffAngle(value); 223 return true; 224 } 225 226 //------------------------------ end__falloff_angle()227 bool LibraryLightsLoader::end__falloff_angle() 228 { 229 moveUpInSidTree(); 230 return true; 231 } 232 233 //------------------------------ begin__falloff_exponent(const falloff_exponent__AttributeData & attributeData)234 bool LibraryLightsLoader::begin__falloff_exponent( const falloff_exponent__AttributeData& attributeData ) 235 { 236 addToSidTree( 0, attributeData.sid, &mCurrentLight->getFallOffExponent()); 237 return true; 238 } 239 240 //------------------------------ data__falloff_exponent(float value)241 bool LibraryLightsLoader::data__falloff_exponent( float value ) 242 { 243 mCurrentLight->setFallOffExponent(value); 244 return true; 245 } 246 247 //------------------------------ end__falloff_exponent()248 bool LibraryLightsLoader::end__falloff_exponent() 249 { 250 moveUpInSidTree(); 251 return true; 252 } 253 254 } // namespace COLLADASaxFWL 255