Morph-SynRJ
view efx_screen3.cxx @ 0:22de913c2d84
morph-synrj intro
| author | "Cedric Pinson <cedric.pinson@alcove.fr> <mornifle@plopbyte.net>" |
|---|---|
| date | Tue Nov 27 15:23:52 2007 +0100 (2007-11-27) |
| parents | |
| children |
line source
1 #include "efx_screen3.h"
2 #include "sys_assert.h"
3 #include "mth_vector3.h"
4 #include "gl_header.h"
5 #include "cmn_intro.h"
6 #include "mth_quaternion.h"
8 extern fxSync * sync;
10 #define END_PART_OF_RUBBER 39
12 const float ColorMesh[]={167.0/255,92.0/255,5.0/255,1};
14 static const char* Greetz[]={
15 //"---------------- ----------------"
17 //" 2004",
18 //" sota",
19 //"[ SYNrJ ]",0};
21 " by syn[rj]",
22 "Morph",
23 "",
24 "",
25 "",
26 "",0 };
29 static const char* GreetzList[]={
30 "analogik",
31 "bypass",
32 "calodox",
33 "deathless",
34 "conspiracy",
35 "condense",
36 "cryonics",
37 "eldorado",
38 "equinox",
39 "excess",
40 "fairlight",
41 "farbraush",
42 "hansa",
43 "haujobb",
44 "inf",
45 "kewlers",
46 "kolor",
47 "mankind",
48 "mfx",
49 "moppi",
50 "nomad",
51 "tpolm",
52 "orange juice",
53 "scenemusic",
54 "scoopex",
55 "razor 1911",
56 0};
59 efxScreen3_t::efxScreen3_t()
60 {
61 internalTime=0;
62 currentShapeToMorph=0;
63 morphFrac=0;
64 rub=0;
65 rubTexture=0;
66 backGroundTexture=0;
67 backGroundTexture2=0;
68 waitingRubber=10;
69 rubberAngle=-240;
70 rubberTransition=true;
71 rubberTransformPart2=false;
72 Effect3StartInitialized=false;
73 }
75 void efxScreen3_t::Init()
76 {
77 // make a background
78 int size=256;
79 float div=4.0/size;
80 backGroundTexture=txtCreatePerlin2d(size,size,div,div,0.8,10);
81 backGroundTexture2=txtCreateGrid(size,size,8,0.2);
85 // count greetz list
86 nbGreetz=0;
87 nbLetters=0;
88 while (GreetzList[nbGreetz]!=0) {
89 nbLetters+=strlen(GreetzList[nbGreetz]);
90 nbGreetz++;
91 }
92 // nbGreetz--;
95 // init rubber
96 InitRubbers(2);
98 // must be called after InitRubber because there is a dependance
99 InitDesign();
100 }
105 void efxScreen3_t::InitDesign()
106 { //0123456789a
108 const int ResYRub=rub->MorphShape().ResY();
110 SYS_ASSERT(rub);
113 design.Init(ResYRub*2+nbGreetz);
116 /// exit the rubber
117 const float EndPartOfRubber=END_PART_OF_RUBBER+1 ;
118 const float EndPartOfRubberAlpha=END_PART_OF_RUBBER;
119 const float EndPartOfRubberOffset=0.01;
120 designElementsRubber=new cmnDesignElementRubberEnd_t[ResYRub];
122 for (int i=0;i<ResYRub;i++) {
123 designElementsRubber[i].position.Init();
124 designElementsRubber[i].target.InitRandomVectorInBox(100);
125 designElementsRubber[i].target.Normalize();
126 designElementsRubber[i].alpha=1;
127 designElementsRubber[i].target*=100;
128 designElementsRubber[i].Init(EndPartOfRubber+EndPartOfRubberOffset*i,designElementsRubber[i].position,designElementsRubber[i].target,1);
129 design.AddElement(&designElementsRubber[i]);
130 }
132 designElementsRubberAlpha=new cmnDesignElementRubberEnd_t[ResYRub];
133 for (i=0;i<ResYRub;i++) {
134 designElementsRubberAlpha[i].position.Init();
135 designElementsRubberAlpha[i].alpha=1;
136 designElementsRubberAlpha[i].target.Init();
137 designElementsRubberAlpha[i].Init(EndPartOfRubberAlpha+EndPartOfRubberOffset*i,designElementsRubberAlpha[i].position,designElementsRubberAlpha[i].target,1);
138 design.AddElement(&designElementsRubberAlpha[i]);
139 }
142 const float StartTimeGreetz=15;
143 const float StepTimeGreetz=1.0;
144 const float StartGreetzPositionX=-90;
145 const float StartGreetzPositionY=-65;
146 const int nbLinesPerPass=13;
147 //const float StepTimeGreetz=0.5;
149 font->SetScale(0.6);
151 designElementsFont=new cmnDesignElementFont_t[nbGreetz];
152 float currentTimeToadd=0;
153 for (i=0;i<nbGreetz;i++) {
154 int modulex=(i%2?0:1)*10;
155 designElementsFont[i].position.Init(StartGreetzPositionX+modulex,StartGreetzPositionY+(i%nbLinesPerPass)*font->SizeOfCharY(),100);
156 designElementsFont[i].target.Init(StartGreetzPositionX+modulex,StartGreetzPositionY+(i%nbLinesPerPass)*font->SizeOfCharY(),0);
157 designElementsFont[i].endLife=100.0;
158 designElementsFont[i].alpha=1.0;
159 designElementsFont[i].scalex=0.6;
160 designElementsFont[i].scaley=0.6;
161 designElementsFont[i].alphaFactor=-0.05;
162 designElementsFont[i].text=GreetzList[i];
163 designElementsFont[i].Init(1e6+StartTimeGreetz+i*StepTimeGreetz+currentTimeToadd);
164 if ((i+1)%nbLinesPerPass==0)
165 currentTimeToadd+=0.3;
166 design.AddElement(&designElementsFont[i]);
167 }
168 }
172 void efxScreen3_t::InitRubbers(int _nbShapes)
173 {
175 const int NbLigneByMap=3;
176 const int SizeOfGenerateMap=256;
178 #ifdef HIGHRES
179 const int RubberResolutionX=256;
180 const int RubberResolutionY=256;
181 #else
182 #ifdef MIDDLERES
183 const int RubberResolutionX=190;
184 const int RubberResolutionY=210;
185 #endif
186 #endif
191 if (rubTexture)
192 glDeleteTextures(1,&rubTexture);
193 int size=256;
194 float div=1.0/size;
195 rubTexture=txtCreatePerlin2d(size,size,div,div,1.0,6);
197 rub=new efxRub_t;
198 rub->Init(_nbShapes,RubberResolutionX,RubberResolutionY);
199 rub->SetTexture(rubTexture);
200 //rub->GenerateRandom(256,256,40,180);
202 int nbTexts=0;
203 while (Greetz[nbTexts]!=0)
204 nbTexts++;
205 //nbTexts--;
207 int nb=mth::Floor(nbTexts*1.0/NbLigneByMap);
208 int maxShape=mth::Min(nb,_nbShapes);
209 int i=0;
210 for (i=0;i<maxShape;i++)
211 rub->Generate(SizeOfGenerateMap,SizeOfGenerateMap,40,180,i,&Greetz[i*NbLigneByMap],NbLigneByMap);
213 int nb2=nbTexts-(nb*NbLigneByMap);
214 if (nb2>0 && maxShape-nb>0)
215 rub->Generate(SizeOfGenerateMap,SizeOfGenerateMap,40,180,i,&Greetz[nb*NbLigneByMap],nb2);
219 translateYrubber=new mth::Vector3_t[RubberResolutionY];
220 float minRadius=20;
222 for ( i=0;i<RubberResolutionY;i++) {
223 retry:
224 translateYrubber[i].InitRandomVectorInBox(25);
225 translateYrubber[i][1]=0;
226 if (translateYrubber[i].MagSqr()>1e-4)
227 translateYrubber[i].Normalize();
228 else
229 goto retry;
230 translateYrubber[i][2]=mth::Abs(translateYrubber[i][2]);
231 translateYrubber[i]*=minRadius+i;
232 }
234 rubberTransitionAlpha=new float[RubberResolutionY];
235 rubberEffect1Angle=new float[RubberResolutionY];
236 rubberEffect2Translation=new float[RubberResolutionY];
237 for (i=0;i<RubberResolutionY;i++) {
238 rubberTransitionAlpha[i]=0;
239 rubberEffect1Angle[i]=0;
240 rubberEffect2Translation[i]=0;
241 }
242 rubberIndexEffect2=0;
243 rubberIndexEffect1=0;
245 }
249 void efxScreen3_t::UpdateRubbers()
250 {
251 const float MorphAdd = 2.5;
252 const float StartPosRubber = 12.0;
253 const float TranslateAdd = 1.0;
254 const float TranslateOffsetY = 1.0;
255 const float RotationAdd = -15.0;
256 const float RubberMaxRadiusTransition=20; // voir dans initRubbers
257 const float MaxRadiusOfAcylinder=RubberMaxRadiusTransition+rub->MorphShape().ResY();
258 const float TransitionAdd = 20;
259 const float TimeRubberStart = 1;
260 const float TimeRubberTransitionEnd = TimeRubberStart+MaxRadiusOfAcylinder/TransitionAdd ;
261 const float TimeRubberWait =mth::Abs(/*375.0*/90.0/RotationAdd) ;
263 const float BaseDistBlend = 5.0;
264 const float BaseDistBlendSqr = 1.0/(BaseDistBlend*BaseDistBlend);
265 const float BaseMinimumBlend = 0.15;
266 const float AlphaDelay=0.5;
267 const float AlphaVariablePartTransition = 0.15f;
269 const float TimeRubberEffect1Start = TimeRubberTransitionEnd+5; //+0.5;
270 const float TimeRubberEffect1End = TimeRubberEffect1Start+15;
271 const float RotationEffect1Add = -2.0;
272 const float RotationEffect1AddPerY = -0.05;
274 const float TimeRubberEffect2Start = TimeRubberEffect1Start+3.5;//TimeRubberTransitionEnd+4;
275 const float TimeRubberEffect2End = TimeRubberEffect1Start+15;
276 const float TranslationEffect2Add = -2.0;
277 const float TranslationEffect2AddPerY = -0.1;
279 const float TimeAttenuateTransformStart = mth::Min(TimeRubberEffect1Start,TimeRubberEffect2Start)+(mth::Max(TimeRubberEffect2End,TimeRubberEffect1End)-mth::Min(TimeRubberEffect1Start,TimeRubberEffect2Start))*0.75;
280 const float TimeAttenuateTransformEnd = mth::Max(TimeRubberEffect2End,TimeRubberEffect1End)+15;
283 const float TimeRubberEffect3Start = END_PART_OF_RUBBER;//TimeAttenuateTransformEnd-5;
284 const float TimeRubberEffect3End = TimeRubberEffect3Start+10;
287 if (internalTime>=TimeRubberStart && internalTime<TimeRubberTransitionEnd) {
289 float dt=Timer->GetFrameTime();
290 float factor;
291 mth::Vector3_t n;
292 int jend=rub->MorphShape().ResY();
293 for (int j=0;j<jend-1;j++) {
294 n=translateYrubber[j];
295 factor=n.MagSqr();
296 if (factor>1e-1)
297 n*=1.0/mth::Sqrt(factor);
299 if ( internalTime > TimeRubberStart+(RubberMaxRadiusTransition+j)/TransitionAdd) {
300 translateYrubber[j].Init();
301 rubberTransitionAlpha[j]+=AlphaDelay*Timer->GetFrameTime();
302 } else {
303 translateYrubber[j]+=n*(-TransitionAdd*dt);
304 rubberTransitionAlpha[j]=BaseMinimumBlend + mth::Max(0,AlphaVariablePartTransition-translateYrubber[j].MagSqr()*BaseDistBlendSqr);
305 }
308 }
310 } else {
312 if (internalTime>=TimeRubberTransitionEnd && rubberTransition) {
313 rubberTransition=false;
314 waitingRubber=TimeRubberWait;
315 }
317 if (waitingRubber>0)
318 waitingRubber-=Timer->GetFrameTime();
319 else
320 morphFrac+=MorphAdd *Timer->GetFrameTime();
322 if (morphFrac>1.0) {
323 morphFrac=0;
324 currentShapeToMorph++;
325 waitingRubber=TimeRubberWait;
326 }
328 int resolutionY=rub->MorphShape().ResY();
329 if (internalTime>=TimeRubberEffect1Start && internalTime<TimeAttenuateTransformEnd) {
330 rubberTransformPart2=true;
331 float prevVal=rubberEffect1Angle[rubberIndexEffect1];
332 rubberIndexEffect1=(rubberIndexEffect1+1)%resolutionY;
333 rubberEffect1Angle[rubberIndexEffect1]=(prevVal+3.14/4*mth::Sin(RotationEffect1Add*mth::Sin(Timer->GetRealTime())*Timer->GetFrameTime()));
334 }
336 if (internalTime>=TimeRubberEffect2Start && internalTime<TimeAttenuateTransformEnd) {
337 rubberTransformPart2=true;
338 float prevVal=rubberEffect2Translation[rubberIndexEffect2];
339 rubberIndexEffect2=(rubberIndexEffect2+1)%resolutionY;
340 rubberEffect2Translation[rubberIndexEffect2]=(prevVal+10*TranslationEffect2Add*mth::Sin(Timer->GetRealTime())*Timer->GetFrameTime());
341 }
343 if (internalTime>=TimeAttenuateTransformStart && internalTime<TimeAttenuateTransformEnd) {
344 float factor=1-(internalTime-TimeAttenuateTransformStart)/(TimeAttenuateTransformEnd-TimeAttenuateTransformStart);
345 rubberEffect1Angle[rubberIndexEffect1]*=factor;
346 rubberEffect2Translation[rubberIndexEffect2]*=factor;
347 } else if (internalTime>TimeAttenuateTransformEnd)
348 rubberTransformPart2=false;
353 }
355 // end part
356 if (internalTime>=TimeRubberEffect3Start)
357 Effect3StartInitialized=true;
360 rubberAngle+=RotationAdd*Timer->GetFrameTime();
361 rub->MakeMorph(currentShapeToMorph%rub->NbShapes(),(currentShapeToMorph+1)%rub->NbShapes(),morphFrac);
363 if (rubberTransformPart2 && internalTime<TimeAttenuateTransformEnd) {
364 int y=rub->MorphShape().ResY();
365 mth::Vector3_t* vertexes=rub->MorphShape().Vertexes();
366 for (int k=0;k<y;k++) {
367 mth::Quaternion_t q(0,rubberEffect1Angle[(rubberIndexEffect1-k+y)%y],0);
368 int x=rub->MorphShape().ResX();
369 int idx=k*x;
370 for (int l=0;l<x;l++) {
371 vertexes[idx+l]=q.Rotate(vertexes[idx+l]);
372 vertexes[idx+l][0]+=rubberEffect2Translation[(rubberIndexEffect2-k+y)%y];
373 }
374 }
375 }
378 }
380 void efxScreen3_t::Update()
381 {
382 internalTime+=Timer->GetFrameTime();
384 UpdateRubbers();
386 // activate one greetz
387 if (sync->GetGreetzSync() == true) {
388 for (int i=0;i<nbGreetz;i++)
389 if (designElementsFont[i].start>1e5+0.5) {
390 designElementsFont[i].start=0;
391 break;
392 }
393 }
395 design.Update();
396 }
400 void efxScreen3_t::DrawRubber()
401 {
403 cmnPushMatrix();
405 glFrontFace(GL_CW);
406 glEnable(GL_LIGHTING);
407 glEnable(GL_LIGHT0);
408 glShadeModel(GL_SMOOTH);
411 float light[4]={0.0,0.0,1,0};
412 mth::Vector3_t l(0,0,1);
413 l[0]=mth::Cos(Timer->GetRealTime());
414 l[1]=mth::Sin(Timer->GetRealTime());
415 l[2]=1;
416 l.Normalize();
417 light[0]=l[0];
418 light[1]=l[1];
419 light[2]=l[2];
421 glLightfv(GL_LIGHT0,GL_POSITION,light);
423 // touffus[i].SetTint(219.0/255,127.0/255,13.0/255);
425 // light[0]=1.0*0+146.0/255;light[1]=1.0*0+148.0/255;light[2]=1.0*0+173.0/255;
426 light[0]=219.0/255;light[1]=127.0/255;light[2]=0.0/255;
428 memcpy(light,ColorMesh,sizeof(float)*4);
431 // light[0]=219.0/255;light[1]=127.0/255;light[2]=13.0/255;
432 glLightfv(GL_LIGHT0,GL_DIFFUSE,light) ;
434 light[0]=0.2;light[1]=0.2;light[2]=0.2;
435 glLightfv(GL_LIGHT0,GL_AMBIENT,light) ;
437 glTranslatef(35,0,0);
439 if (rubberTransition || Effect3StartInitialized)
440 DrawRubberTransition();
441 else
442 DrawRubberFull();
444 glDisable(GL_LIGHT0);
445 glDisable(GL_LIGHTING);
447 cmnPopMatrix();
449 }
451 void efxScreen3_t::DrawRubberFull()
452 {
453 glEnable(GL_CULL_FACE);
454 glDisable(GL_BLEND);
455 glBlendFunc(GL_ONE,GL_ONE);
458 glBlendFunc(GL_ONE,GL_ONE_MINUS_SRC_ALPHA);
459 float mt[4]={1,1,1,1};
460 glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,mt);
463 glRotatef(rubberAngle,0,1,0);
464 rub->MorphShape().Draw();
465 }
467 void efxScreen3_t::DrawRubberTransition()
468 {
470 const float BaseDistBlend = 5.0;
471 const float BaseDistBlendSqr = 1.0/(BaseDistBlend*BaseDistBlend);
472 const float BaseMinimumBlend = 0.15;
474 glDisable(GL_CULL_FACE);
475 glEnable(GL_BLEND);
476 glBlendFunc(GL_ONE,GL_ONE_MINUS_SRC_ALPHA);
477 // glBlendFunc(GL_ONE,GL_ONE);
479 float mt[4]={1,1,1,1};
480 float a;
481 int jend=rub->MorphShape().ResY();
482 for (int j=0;j<jend-1;j++) {
484 if (Effect3StartInitialized) {
485 translateYrubber[j]=designElementsRubber[j].position;
486 rubberTransitionAlpha[j]=designElementsRubberAlpha[j].alpha;
488 }
490 //a=BaseMinimumBlend + mth::Max(0,1.0-translateYrubber[j].MagSqr()*BaseDistBlendSqr);
491 mt[3]=rubberTransitionAlpha[j];
492 if (translateYrubber[j][0]==0 && translateYrubber[j][2]==0 )
493 glEnable(GL_CULL_FACE);
494 else
495 glDisable(GL_CULL_FACE);
498 glPushMatrix();
499 glMaterialfv(GL_FRONT_AND_BACK,GL_DIFFUSE,mt);
500 glTranslatef(translateYrubber[j][0],translateYrubber[j][1],translateYrubber[j][2]);
501 glRotatef(rubberAngle,0,1,0);
502 rub->MorphShape().DrawRow(j);
503 glPopMatrix();
504 }
506 }
509 void efxScreen3_t::Draw()
510 {
511 cmnSetFrustrum(90);
512 cmnSetCamera( mth::Vector3_t(0* 12.5, 0, 100 ), mth::Vector3_t( 0 , 0, 0 ) );
514 cmnPushGLState();
515 cmnPushMatrix();
517 glEnable(GL_BLEND);
518 glBlendFunc(GL_ONE,GL_ONE);
519 // cmnDisplayBackground(backGroundTexture,167,92,5,255,1);
520 // cmnDisplayBackground(backGroundTexture2,167,92,5,255,1);GLuint _texture,int _r=33,int _g=137,int _b=255,int _a=255, int _nbPasses=2,int _side=0);
521 cmnDisplayBackground(backGroundTexture,33,137,255,255,1);
522 cmnDisplayBackground(backGroundTexture2,33,137,255,255,1);
524 // design.Draw();
527 DrawRubber();
528 cmnPopMatrix();
529 cmnPopGLState();
531 glDisable(GL_DEPTH_TEST);
532 glColor4f(0.1,0.1,0.1,1);
533 glEnable(GL_BLEND);
534 glBlendFunc(GL_SRC_ALPHA,GL_ONE);
535 design.Draw();
536 cmnSetPlanarView();
537 // design.Draw();
540 }
