Subversion Repositories spk

Rev

Rev 11 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
11 cycrow 1
#include "RenderObject.h"
2
 
3
CRenderObject::CRenderObject () 
4
{ 
5
	m_bClicked = false;
6
	m_iStarted = 0; 
7
	m_iStartFade = 0;
8
	m_iFadeTo = 0;
9
	m_iAlpha = 255;
10
	m_iMaxAlpha = 255;
11
	m_bStartHidden = false;
12
	m_iColour[0] = m_iColour[1] = m_iColour[2] = 255;
13
	m_bMouseOver = false;
14
	m_bDontRender = false;
15
}
16
 
17
CRenderObject::~CRenderObject ()
18
{
19
	for ( SAnimate *it = m_lAnimations.First(); it; it = m_lAnimations.Next() )
20
		delete it;
21
 
22
	CLinkList<SMouseOver> *list = NULL;
23
	for ( int i = 0; i < 2; i++ )
24
	{
25
		if ( i == 0 )
26
			list = &m_lMouseOver;
27
		else if ( i == 1 )
28
			list = &m_lMouseClick;
29
 
30
		for ( SMouseOver *mo = list->First(); mo; mo = list->Next() )
31
		{
32
			if ( mo->iType == MO_TEXTURE )
33
			{
34
				if ( ((SMOTexture *)mo)->pTexture )
35
					((SMOTexture *)mo)->pTexture->Release();
36
			}
37
			delete mo;
38
		}
39
	}
40
 
41
	m_lVaribles.Clear();
42
	m_lAnimations.clear();
43
	m_lMouseOver.clear();
44
	m_lMouseClick.clear();
45
}
46
 
47
void CRenderObject::AddMouseEvent ( CyString section, SMouseOver *e )
48
{
49
	if ( section == "MOUSEOVER" )
50
		m_lMouseOver.push_back ( e );
51
	else if ( section == "ONCLICK" )
52
		m_lMouseClick.push_back ( e );
53
}
54
 
55
void CRenderObject::ParseSetting ( COverlay *overlay, CyString cmd, CyString rest, CyString section ) 
56
{
57
	cmd.ToUpper();
58
	if ( section == "ANIMATE" )
59
	{
60
		SAnimate *anim = NULL;
61
		if ( cmd == "FADEOUT" )
62
		{
63
			anim = (SAnimate *)new SAnimateFadeOut;
64
			((SAnimateFadeOut *)anim)->iTime = rest.GetToken ( ",", 2, 2 ).ConvertEquation();
65
		}
66
		else if ( cmd == "FADEIN" )
67
		{
68
			anim = (SAnimate *)new SAnimateFadeIn;
69
			((SAnimateFadeIn *)anim)->iTime = rest.GetToken ( ",", 2, 2 ).ConvertEquation();
70
		}
71
		else if ( cmd == "FLASH" )
72
		{
73
			anim = (SAnimate *)new SAnimateFlash;
74
			((SAnimateFlash *)anim)->iTime = rest.GetToken ( ",", 2, 2 ).ConvertEquation();
75
			((SAnimateFlash *)anim)->iCycle = rest.GetToken ( ",", 3, 3 ).ConvertEquation();
76
		}
77
		else if ( cmd == "MOVE" )
78
		{
79
			anim = (SAnimate *)new SAnimatePos;
80
			((SAnimatePos *)anim)->iX = rest.GetToken ( ",", 2, 2 ).ConvertEquation();
81
			((SAnimatePos *)anim)->iY = rest.GetToken ( ",", 3, 3 ).ConvertEquation();
82
		}
83
		else if ( cmd == "MOVELINEAR" )
84
		{
85
			anim = (SAnimate *)new SAnimateLinear;
86
			((SAnimateLinear *)anim)->iX = rest.GetToken ( ",", 2, 2 ).ConvertEquation();
87
			((SAnimateLinear *)anim)->iY = rest.GetToken ( ",", 3, 3 ).ConvertEquation();
88
			((SAnimateLinear *)anim)->iTime = rest.GetToken ( ",", 4, 4 ).ConvertEquation();
89
		}
90
 
91
		if ( anim )
92
		{
93
			anim->iDone = 0;
94
			anim->bRemove = false;
95
			anim->iStartTime = ConvertAnimationTime ( rest.GetToken ( ",", 1, 1 ) );
96
			m_lAnimations.push_back ( anim );
97
		}
98
	}
99
	else if ( (section == "MOUSEOVER") || (section == "ONCLICK") )
100
	{
101
		if ( (cmd == "SOUND") && (overlay) )
102
		{
103
			CyString file = rest;
104
			file = file.FindReplace ( "\\", "/" );
105
			file.RemoveSpaces ();
106
 
123 cycrow 107
#ifdef FMOD
11 cycrow 108
			if ( overlay->CreateSound ( file ) )
109
			{
110
				SMOSound *s = new SMOSound;
111
				s->sFilename = file;
112
				AddMouseEvent ( section, s );
113
			}
123 cycrow 114
#endif
11 cycrow 115
		}
116
		else if ( cmd == "COLOUR" )
117
		{
118
			SMOColour *c = new SMOColour;
119
			c->iColour[0] = rest.GetToken ( ",", 1, 1 ).ConvertEquation();
120
			c->iColour[1] = rest.GetToken ( ",", 2, 2 ).ConvertEquation();
121
			c->iColour[2] = rest.GetToken ( ",", 3, 3 ).ConvertEquation();
122
			AddMouseEvent ( section, c );
123
		}
124
		else if ( cmd == "SWITCHVARIABLE" )
125
		{
126
			SMOSwitchV *v = new SMOSwitchV;
127
			v->sVariable = rest.GetToken ( ",", 1, 1 ).upper();
128
			v->lSwitch.SplitToken ( ',', rest.GetToken ( ",", 2 ) );
129
			AddMouseEvent ( section, v );
130
		}
131
		else if ( cmd == "CLOSE" )
132
		{
133
			SMouseOver *m = new SMouseOver;
134
			m->iType = MO_CLOSE;
135
			AddMouseEvent ( section, m );
136
		}
137
		else if ( cmd == "SEND" )
138
		{
139
			SMOSend *m = new SMOSend;
140
			m->sName = rest.GetToken ( ",", 1, 1 );
141
			m->sData = rest.GetToken ( ",", 2 );
142
			if ( m->sData.Empty() )
143
				m->sData = "1";
144
			AddMouseEvent ( section, m );
145
		}
146
	}
147
	else if ( section.Empty() )
148
	{
149
		if ( cmd == "POS" )
150
		{
151
			m_iX = rest.GetToken ( ",", 1, 1 ).ConvertEquation();
152
			m_iY = rest.GetToken ( ",", 2, 2 ).ConvertEquation();
153
		}
154
		if ( cmd == "FadeIn" )
155
		{
156
			m_iStartFade = rest.GetToken ( ",", 1, 1 ).ConvertEquation();
157
			m_iFadeTo = rest.GetToken ( ",", 2, 2 ).ConvertEquation();
158
		}
159
		else if ( cmd == "ALPHA" )
160
			m_iMaxAlpha = rest.ConvertEquation();
161
		else if ( cmd == "STARTHIDDEN" )
162
			m_bStartHidden = true;
163
		else if ( cmd == "LOCALVARIABLE" )
164
			m_lVaribles.PushBack ( CyString("$") + rest.GetToken ( ",", 1, 1 ).upper() + "$" , rest.GetToken ( ",", 2, 2 ));
165
	}
166
}
167
 
168
 
169
CyString CRenderObject::ParseVaribles ( CyString str, CyStringList *varibles )
170
{
171
	if ( !str.IsIn ( "$" ) )
172
		return str;
173
 
174
	for ( SStringList *it = varibles->Head(); it; it = it->next )
175
	{
176
		if ( it->data.Empty() )
177
			continue;
178
		str.FindReplace ( it->str, it->data );
179
	}
180
	return str;
181
}
182
 
183
 
184
void CRenderObject::StartAnimation ( SAnimate *anim )
185
{
186
	if ( anim->iType == ANIM_MOVE )
187
	{
188
		SAnimatePos *pos = (SAnimatePos *)anim;
189
		m_iX = pos->iX;
190
		m_iY = pos->iY;
191
		EndAnimation ( anim );
192
	}
193
	else if ( anim->iType == ANIM_MOVELINEAR )
194
	{
195
		m_iStartX = m_iX;
196
		m_iStartY = m_iY;
197
	}
198
}
199
 
200
void CRenderObject::EndAnimation ( SAnimate *anim )
201
{
202
	if ( anim->iType == ANIM_FLASH )
203
		m_iAlpha = m_iMaxAlpha;
204
	anim->bRemove = true;
205
}
206
 
207
void CRenderObject::DoAnimation ( SAnimate *anim, int iDt )
208
{
209
	switch ( anim->iType )
210
	{
211
		case ANIM_FADEOUT:
212
			if ( Fade ( ((SAnimateFadeOut*)anim)->iTime, anim->iDone, ((SAnimateFadeOut*)anim)->iTime, true ) )
213
				EndAnimation ( anim );
214
			break;
215
		case ANIM_FADEIN:
216
			if ( Fade ( ((SAnimateFadeIn*)anim)->iTime, anim->iDone, ((SAnimateFadeIn*)anim)->iTime, false ) )
217
				EndAnimation ( anim );
218
			break;
219
		case ANIM_FLASH:
220
			{
221
				SAnimateFlash *fa = (SAnimateFlash*)anim;
222
				fa->iDoneCycle += iDt;
223
				if ( Fade ( fa->iCycle, fa->iDoneCycle, fa->iCycle, fa->bIn ) )
224
				{
225
					fa->bIn = !fa->bIn;
226
					fa->iDoneCycle = 0;
227
				}
228
				if ( fa->iDone >= fa->iTime )
229
					EndAnimation ( anim );
230
			}
231
			break;
232
		case ANIM_MOVELINEAR:
233
			{
234
				SAnimateLinear *l = (SAnimateLinear*)anim;
235
				if ( l->iDone > l->iTime )
236
				{
237
					m_iX = l->iX;
238
					m_iY = l->iY;
239
					EndAnimation ( anim );
240
				}
241
				else
242
				{
243
					float t = (float)l->iDone / (float)l->iTime;
244
 
245
					if ( l->iX == m_iX ) m_iX = l->iX;
246
					else				 m_iX = (int)(((1 - t) * (float)m_iStartX) + (t * (float)l->iX));
247
 
248
					if ( l->iY == m_iY ) m_iY = l->iY;
249
					else				 m_iY = (int)(((1 - t) * (float)m_iStartY) + (t * (float)l->iY));
250
				}
251
			}
252
			break;
253
	}
254
}
255
 
256
bool CRenderObject::Fade ( int end, int current, int maxtime, bool reverse )
257
{
258
	if ( current >= end )
259
	{
260
		if ( reverse )
261
			m_iAlpha = 0;
262
		else
263
			m_iAlpha = m_iMaxAlpha;
264
		return true;
265
	}
266
	else
267
	{
268
		float t = (float)current / (float)maxtime;
269
		if ( reverse )
270
			t = (1 - t);
271
		m_iAlpha = (int) (t * (float)m_iMaxAlpha);
272
	}
273
	return false;
274
}
275
 
276
int CRenderObject::SetMouseClicked ( COverlay *overlay, CyString name, int but, bool b ) 
277
{ 
278
	int ret = 0;
279
 
280
	if ( but == 0 )
281
	{
282
		m_bClicked = b; 
283
		for ( SMouseOver *mo = m_lMouseClick.First(); mo; mo = m_lMouseClick.Next() )
284
		{
285
			if ( (mo->iType == MO_CLOSE) && (b) )
286
				ret = 1;
287
			else if ( (b) && (!mo->bStarted) )
288
			{
289
				if ( mo->iType == MO_SOUND )
290
				{
123 cycrow 291
#ifdef FMOD
11 cycrow 292
					SMOSound *s = (SMOSound *)mo;
293
					overlay->PlaySound ( s->sFilename );
123 cycrow 294
#endif
11 cycrow 295
				}
296
				else if ( mo->iType == MO_SWITCHVARIABLE )
297
				{
298
					SMOSwitchV *s = (SMOSwitchV *)mo;
299
					// find the varible to switch
300
					SStringList *node, *opt;
301
					for ( node = m_lVaribles.Head(); node; node = node->next )
302
					{
303
						if ( node->str == (CyString("$") + s->sVariable + "$") )
304
							break;
305
					}
306
 
307
					if ( node )
308
					{
309
						// find the current option;
310
						for ( opt = s->lSwitch.Head(); opt; opt = opt->next )
311
						{
312
							if ( opt->str == node->data )
313
								break;
314
						}
315
 
316
						if ( opt )
317
						{
318
							if ( opt->next )
319
								node->data = opt->next->str;
320
							else
321
								node->data = s->lSwitch.Head()->str;
322
						}
323
					}
324
				}
325
				else if ( mo->iType == MO_SEND )
326
				{
327
					SMOSend *s = (SMOSend *)mo;
328
					overlay->Send ( name + ":" + s->sName + ":" + s->sData );
329
				}
330
				mo->bStarted = true;
331
			}
332
			else if ( !b )
333
				mo->bStarted = false;
334
		}
335
	}
336
 
337
	return ret;
338
}
339
 
340
void CRenderObject::Update ( COverlay *overlay, float dt, int mousex, int mousey, int offsetx, int offsety ) 
341
{
342
	int iDt = (int)(dt * 1000);
343
	m_iStarted += iDt;
344
 
345
	if ( m_iAlpha > m_iMaxAlpha )
346
		m_iAlpha = m_iMaxAlpha;
347
 
348
	if ( (m_iFadeTo) && (m_iStarted >= m_iStartFade) )
349
	{
350
		if ( Fade (m_iFadeTo + m_iStartFade, m_iStarted, m_iFadeTo - m_iStartFade, false) )
351
			m_iFadeTo = 0;
352
	}
353
 
354
	for ( SAnimate *it = m_lAnimations.First(); it; it = m_lAnimations.Next() )
355
	{
356
		if ( it->iDone )
357
		{
358
			DoAnimation ( it, iDt );
359
			it->iDone += iDt;
360
		}
361
		else if ( m_iStarted > it->iStartTime )
362
		{
363
			it->iDone = iDt;
364
			StartAnimation ( it );
365
		}
366
 
367
		if ( it->bRemove )
368
			m_lAnimations.RemoveCurrent ();
369
	}
370
 
371
	m_bMouseOver = false;
372
	if ( (!m_lMouseOver.empty()) && (mousex != -1) && (mousey != -1) )
373
	{
374
		for ( SMouseOver *mo = m_lMouseOver.First(); mo; mo = m_lMouseOver.Next() )
375
		{	
376
			m_bMouseOver = CheckMouse ( mousex, mousey, offsetx, offsety );
377
 
378
			if ( m_bMouseOver )
379
			{
380
				if ( (mo->iType == MO_SOUND) && (!((SMOSound *)mo)->bStarted) )
381
				{
382
					SMOSound *s = (SMOSound *)mo;
123 cycrow 383
#ifdef FMOD
11 cycrow 384
					overlay->PlaySound ( s->sFilename );
123 cycrow 385
#endif
11 cycrow 386
					s->bStarted = true;
387
				}
388
			}
389
			else
390
			{
391
				if ( mo->iType == MO_SOUND )
392
					((SMOSound *)mo)->bStarted = false;
393
			}
394
		}
395
	}
396
}
397
 
398
int CRenderObject::ConvertAnimationTime ( CyString t )
399
{
400
	if ( t.Left(1) == '+' )
401
	{
402
		if ( !m_lAnimations.empty() )
403
			t = CyString::Number(m_lAnimations.Last()->iStartTime) + t;
404
	}
405
	return t.ConvertEquation ();
406
}
407