home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Chip 2001 February
/
Chip_2001-02_cd1.bin
/
bonus
/
demos
/
CS
/
exp
/
SOURCES
/
DEMO
/
EFEKT_10.CPP
< prev
next >
Wrap
C/C++ Source or Header
|
2000-08-16
|
3KB
|
154 lines
/*
deformacia gule
return:
0 - doslo k chybe
1 - este nezacal
2 - prebehol v poriadku
3 - uz skoncil
*/
#include <iostream>
#include "api3ds.h"
#include "efekt.h"
#include "efekt_10.h"
#include "syncs.h"
extern int sync_id;
int efekt_10::init()
{
cout << "Efekt 10 init ... ";
start=TRUE;
counter=ZACIATOK10*refresh;
//->init
f_cntr=0.0;
amount=0.0;
//<-
cout << "ok" << endl;
return 1;
}
int efekt_10::load()
{
cout << "Loading efekt10 ... ";
// -> load
FILE *stream;
stream=fopen(CFGNAME10,"r");
if (!stream) return 0;
fscanf(stream,"file name %s\n",scene_name);
fscanf(stream,"object name %s\n",object_name);
fscanf(stream,"visibility %f\n",&vis);
fscanf(stream,"minvisibility %f\n",&minvis);
Vector3f o,i,j,k;
fscanf(stream,"Descent origin (%f,%f,%f)\n",&o.x,&o.y,&o.z);
fscanf(stream,"Descent right (%f,%f,%f)\n",&i.x,&i.y,&i.z);
fscanf(stream,"Descent up (%f,%f,%f)\n",&j.x,&j.y,&j.z);
fscanf(stream,"Descent forward (%f,%f,%f)\n",&k.x,&k.y,&k.z);
cam.SetAll(o,i,j,k);
fclose(stream);
cam.FarClipplane(vis);
cam.NearClipplane(minvis);
cam.HorizontalFOV(PI/3);
cam.VerticalFOV(PI/4);
Loader3DS loader;
sce = loader.Load(scene_name, texture_library);
obj = dynamic_cast<Object3DS*>(sce->GetObject(object_name));
numver = obj->NumVertices();
vtx = obj->Vertices();
Vertex3DS *v=vtx;
DeformVtx *d=infoDV;
for (int i=numver;i;i--)
{
d->x=v->x;
d->y=v->y;
d->z=v->z;
d->a1=atan2(v->x,v->y);
d->a2=atan2(v->x,v->z);
d->a3=atan2(v->y,v->z);
v++;
d++;
}
// <-
cout << "ok!"<<endl;
return 1;
}
int efekt_10::free() //vrati 3 ako ok, 0 ak doslo k chybe
{
end=true;
cout << "Efekt 08 free ... ";
// -> free
// <-
cout << "ok!" << endl;
return 3;
}
int efekt_10::update()
{
id=Sync[GetSyncNum(float(counter)/float(refresh))].id;
// -> update
f_cntr+=0.01;
if (amount<(0.7-0.0055)) amount+=0.0055;
else amount=0.7;
// <-
return 1;
}
int efekt_10::go(double t)
{
if (t<ZACIATOK10) return 1;
if (end) return 3;
if (counter>=KONIEC10*refresh) return free();
if (!start) if (!init()) return 0;
int cur_frm=(int)(t*refresh);
if (cur_frm>KONIEC10*refresh) cur_frm=int(KONIEC10*refresh);
if (cur_frm>counter)
while (counter<cur_frm)
{
counter++;
if (counter<KONIEC10*refresh) update();
}
if (counter>=KONIEC10*refresh) return free();
//tu sa kresli->
glDisable(GL_LIGHTING);
glDisable(GL_FOG);
cam.GL();
Vertex3DS *v=vtx;
DeformVtx *d=infoDV;
if (amount>0.0)
{
for (int i=numver;i;i--)
{
float aa=( sin(3*d->a1+f_cntr)*cos(3*d->a2-f_cntr*0.7)+sin(2*d->a3+1.4*f_cntr) )*0.5;
v->R=fabs(aa);
v->G=fabs(aa);
v->B=fabs(aa);
v->s+=cos(aa-f_cntr)/1000;
v->t+=sin(aa+f_cntr)/1000;
aa=1/ (amount*(1+0.15*sin(f_cntr*5.64))*(1+0.7*aa));
v->w=aa;
v++;
d++;
}
sce->Render();
}
//<-
return 2;
}