Subversion Repositories spk

Rev

Go to most recent revision | Details | 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
 
107
			if ( overlay->CreateSound ( file ) )
108
			{
109
				SMOSound *s = new SMOSound;
110
				s->sFilename = file;
111
				AddMouseEvent ( section, s );
112
			}
113
		}
114
		else if ( cmd == "COLOUR" )
115
		{
116
			SMOColour *c = new SMOColour;
117
			c->iColour[0] = rest.GetToken ( ",", 1, 1 ).ConvertEquation();
118
			c->iColour[1] = rest.GetToken ( ",", 2, 2 ).ConvertEquation();
119
			c->iColour[2] = rest.GetToken ( ",", 3, 3 ).ConvertEquation();
120
			AddMouseEvent ( section, c );
121
		}
122
		else if ( cmd == "SWITCHVARIABLE" )
123
		{
124
			SMOSwitchV *v = new SMOSwitchV;
125
			v->sVariable = rest.GetToken ( ",", 1, 1 ).upper();
126
			v->lSwitch.SplitToken ( ',', rest.GetToken ( ",", 2 ) );
127
			AddMouseEvent ( section, v );
128
		}
129
		else if ( cmd == "CLOSE" )
130
		{
131
			SMouseOver *m = new SMouseOver;
132
			m->iType = MO_CLOSE;
133
			AddMouseEvent ( section, m );
134
		}
135
		else if ( cmd == "SEND" )
136
		{
137
			SMOSend *m = new SMOSend;
138
			m->sName = rest.GetToken ( ",", 1, 1 );
139
			m->sData = rest.GetToken ( ",", 2 );
140
			if ( m->sData.Empty() )
141
				m->sData = "1";
142
			AddMouseEvent ( section, m );
143
		}
144
	}
145
	else if ( section.Empty() )
146
	{
147
		if ( cmd == "POS" )
148
		{
149
			m_iX = rest.GetToken ( ",", 1, 1 ).ConvertEquation();
150
			m_iY = rest.GetToken ( ",", 2, 2 ).ConvertEquation();
151
		}
152
		if ( cmd == "FadeIn" )
153
		{
154
			m_iStartFade = rest.GetToken ( ",", 1, 1 ).ConvertEquation();
155
			m_iFadeTo = rest.GetToken ( ",", 2, 2 ).ConvertEquation();
156
		}
157
		else if ( cmd == "ALPHA" )
158
			m_iMaxAlpha = rest.ConvertEquation();
159
		else if ( cmd == "STARTHIDDEN" )
160
			m_bStartHidden = true;
161
		else if ( cmd == "LOCALVARIABLE" )
162
			m_lVaribles.PushBack ( CyString("$") + rest.GetToken ( ",", 1, 1 ).upper() + "$" , rest.GetToken ( ",", 2, 2 ));
163
	}
164
}
165
 
166
 
167
CyString CRenderObject::ParseVaribles ( CyString str, CyStringList *varibles )
168
{
169
	if ( !str.IsIn ( "$" ) )
170
		return str;
171
 
172
	for ( SStringList *it = varibles->Head(); it; it = it->next )
173
	{
174
		if ( it->data.Empty() )
175
			continue;
176
		str.FindReplace ( it->str, it->data );
177
	}
178
	return str;
179
}
180
 
181
 
182
void CRenderObject::StartAnimation ( SAnimate *anim )
183
{
184
	if ( anim->iType == ANIM_MOVE )
185
	{
186
		SAnimatePos *pos = (SAnimatePos *)anim;
187
		m_iX = pos->iX;
188
		m_iY = pos->iY;
189
		EndAnimation ( anim );
190
	}
191
	else if ( anim->iType == ANIM_MOVELINEAR )
192
	{
193
		m_iStartX = m_iX;
194
		m_iStartY = m_iY;
195
	}
196
}
197
 
198
void CRenderObject::EndAnimation ( SAnimate *anim )
199
{
200
	if ( anim->iType == ANIM_FLASH )
201
		m_iAlpha = m_iMaxAlpha;
202
	anim->bRemove = true;
203
}
204
 
205
void CRenderObject::DoAnimation ( SAnimate *anim, int iDt )
206
{
207
	switch ( anim->iType )
208
	{
209
		case ANIM_FADEOUT:
210
			if ( Fade ( ((SAnimateFadeOut*)anim)->iTime, anim->iDone, ((SAnimateFadeOut*)anim)->iTime, true ) )
211
				EndAnimation ( anim );
212
			break;
213
		case ANIM_FADEIN:
214
			if ( Fade ( ((SAnimateFadeIn*)anim)->iTime, anim->iDone, ((SAnimateFadeIn*)anim)->iTime, false ) )
215
				EndAnimation ( anim );
216
			break;
217
		case ANIM_FLASH:
218
			{
219
				SAnimateFlash *fa = (SAnimateFlash*)anim;
220
				fa->iDoneCycle += iDt;
221
				if ( Fade ( fa->iCycle, fa->iDoneCycle, fa->iCycle, fa->bIn ) )
222
				{
223
					fa->bIn = !fa->bIn;
224
					fa->iDoneCycle = 0;
225
				}
226
				if ( fa->iDone >= fa->iTime )
227
					EndAnimation ( anim );
228
			}
229
			break;
230
		case ANIM_MOVELINEAR:
231
			{
232
				SAnimateLinear *l = (SAnimateLinear*)anim;
233
				if ( l->iDone > l->iTime )
234
				{
235
					m_iX = l->iX;
236
					m_iY = l->iY;
237
					EndAnimation ( anim );
238
				}
239
				else
240
				{
241
					float t = (float)l->iDone / (float)l->iTime;
242
 
243
					if ( l->iX == m_iX ) m_iX = l->iX;
244
					else				 m_iX = (int)(((1 - t) * (float)m_iStartX) + (t * (float)l->iX));
245
 
246
					if ( l->iY == m_iY ) m_iY = l->iY;
247
					else				 m_iY = (int)(((1 - t) * (float)m_iStartY) + (t * (float)l->iY));
248
				}
249
			}
250
			break;
251
	}
252
}
253
 
254
bool CRenderObject::Fade ( int end, int current, int maxtime, bool reverse )
255
{
256
	if ( current >= end )
257
	{
258
		if ( reverse )
259
			m_iAlpha = 0;
260
		else
261
			m_iAlpha = m_iMaxAlpha;
262
		return true;
263
	}
264
	else
265
	{
266
		float t = (float)current / (float)maxtime;
267
		if ( reverse )
268
			t = (1 - t);
269
		m_iAlpha = (int) (t * (float)m_iMaxAlpha);
270
	}
271
	return false;
272
}
273
 
274
int CRenderObject::SetMouseClicked ( COverlay *overlay, CyString name, int but, bool b ) 
275
{ 
276
	int ret = 0;
277
 
278
	if ( but == 0 )
279
	{
280
		m_bClicked = b; 
281
		for ( SMouseOver *mo = m_lMouseClick.First(); mo; mo = m_lMouseClick.Next() )
282
		{
283
			if ( (mo->iType == MO_CLOSE) && (b) )
284
				ret = 1;
285
			else if ( (b) && (!mo->bStarted) )
286
			{
287
				if ( mo->iType == MO_SOUND )
288
				{
289
					SMOSound *s = (SMOSound *)mo;
290
					overlay->PlaySound ( s->sFilename );
291
				}
292
				else if ( mo->iType == MO_SWITCHVARIABLE )
293
				{
294
					SMOSwitchV *s = (SMOSwitchV *)mo;
295
					// find the varible to switch
296
					SStringList *node, *opt;
297
					for ( node = m_lVaribles.Head(); node; node = node->next )
298
					{
299
						if ( node->str == (CyString("$") + s->sVariable + "$") )
300
							break;
301
					}
302
 
303
					if ( node )
304
					{
305
						// find the current option;
306
						for ( opt = s->lSwitch.Head(); opt; opt = opt->next )
307
						{
308
							if ( opt->str == node->data )
309
								break;
310
						}
311
 
312
						if ( opt )
313
						{
314
							if ( opt->next )
315
								node->data = opt->next->str;
316
							else
317
								node->data = s->lSwitch.Head()->str;
318
						}
319
					}
320
				}
321
				else if ( mo->iType == MO_SEND )
322
				{
323
					SMOSend *s = (SMOSend *)mo;
324
					overlay->Send ( name + ":" + s->sName + ":" + s->sData );
325
				}
326
				mo->bStarted = true;
327
			}
328
			else if ( !b )
329
				mo->bStarted = false;
330
		}
331
	}
332
 
333
	return ret;
334
}
335
 
336
void CRenderObject::Update ( COverlay *overlay, float dt, int mousex, int mousey, int offsetx, int offsety ) 
337
{
338
	int iDt = (int)(dt * 1000);
339
	m_iStarted += iDt;
340
 
341
	if ( m_iAlpha > m_iMaxAlpha )
342
		m_iAlpha = m_iMaxAlpha;
343
 
344
	if ( (m_iFadeTo) && (m_iStarted >= m_iStartFade) )
345
	{
346
		if ( Fade (m_iFadeTo + m_iStartFade, m_iStarted, m_iFadeTo - m_iStartFade, false) )
347
			m_iFadeTo = 0;
348
	}
349
 
350
	for ( SAnimate *it = m_lAnimations.First(); it; it = m_lAnimations.Next() )
351
	{
352
		if ( it->iDone )
353
		{
354
			DoAnimation ( it, iDt );
355
			it->iDone += iDt;
356
		}
357
		else if ( m_iStarted > it->iStartTime )
358
		{
359
			it->iDone = iDt;
360
			StartAnimation ( it );
361
		}
362
 
363
		if ( it->bRemove )
364
			m_lAnimations.RemoveCurrent ();
365
	}
366
 
367
	m_bMouseOver = false;
368
	if ( (!m_lMouseOver.empty()) && (mousex != -1) && (mousey != -1) )
369
	{
370
		for ( SMouseOver *mo = m_lMouseOver.First(); mo; mo = m_lMouseOver.Next() )
371
		{	
372
			m_bMouseOver = CheckMouse ( mousex, mousey, offsetx, offsety );
373
 
374
			if ( m_bMouseOver )
375
			{
376
				if ( (mo->iType == MO_SOUND) && (!((SMOSound *)mo)->bStarted) )
377
				{
378
					SMOSound *s = (SMOSound *)mo;
379
					overlay->PlaySound ( s->sFilename );
380
					s->bStarted = true;
381
				}
382
			}
383
			else
384
			{
385
				if ( mo->iType == MO_SOUND )
386
					((SMOSound *)mo)->bStarted = false;
387
			}
388
		}
389
	}
390
}
391
 
392
int CRenderObject::ConvertAnimationTime ( CyString t )
393
{
394
	if ( t.Left(1) == '+' )
395
	{
396
		if ( !m_lAnimations.empty() )
397
			t = CyString::Number(m_lAnimations.Last()->iStartTime) + t;
398
	}
399
	return t.ConvertEquation ();
400
}
401