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