Darklight
Kayıt: Oct 31, 2002 Mesajlar: 185 Nereden: Ankara
|
Tarih: Mon May 03, 2004 12:35 am Mesaj konusu: |
|
|
Function pointer ismindende anlasildigi gibi yazdiginiz bir fonksiyona pointer tutan degiskendir. Peki yararı ne heryere type switch yazmaktan kurtarir insani ve her objenize cok esnek bir sekilde RENDERER ve BEHAVIOUR yazmanızı saglar. Yani inanilmaz bir ozgurluk ve esneklik (Denedim calisiyorda baya güzel yani)
diyelimki sahnedeki objelerinizi temsil eden SahneObjeniz var
typedef struct _sceneObj{
int ID;
int type; //ENTITY / LIGHT / CAM / GROUP
Matrix TM;
entityObj *entity;
lightObj *light;
camObj *cam;
void (*renderingfunc)(int);
struct _sceneObj *child,*parent,*next,*prev;
}sceneObj;
bu kısımda entity nesnelerinden kasteddigim sahnenizdeki renderlediginiz objeler
//Mesela bende
GLUT
GLU
BUFFERED
MESH
tipinde veriyapisinda tuttugum entityler var hepsinin kendisine gore farkli avantajlari var tabiii
Sİmdi Bunun Rendererimizi yazdigimizda SceneGraphimizi renderleyen asagidaki basit fonksiyona bakalim
sObj->renderingfunc(sObj->entity); fonksiyonu ile istedigimiz tipteki entity istedigimiz renderer fonksiyonın içine sokariz ayni zamanda
sObj->behaviourfunc(sObj->entity); fonksiyonu ile istedigimiz tipteki entity istedigimiz behaviour fonksiyonın içine sokariz ayni zamanda
SceneGraphimizi renderleyelim simdide
/*------
FONKSIYON ISMI:renderSceneObj
YAPTIGI IS:
------*/
void renderSceneObj(sceneObj *sObj){
switch(sObj->type){
case SCENEOBJ_GROUP:
glPushMatrix();
glMultMatrixf(sObj->TM.index);
if(sObj->child!=NULL){
renderSceneObj(sObj->child);
}else if(sObj->next!=NULL){
glPopMatrix();
renderSceneObj(sObj->next);
}
glPopMatrix();
break;
case SCENEOBJ_CAMERA:
glPushMatrix();
glMultMatrixf(sObj->TM.index);
//renderCamera();
if(sObj->child!=NULL){
renderSceneObj(sObj->child);
}else if(sObj->next!=NULL){
glPopMatrix();
renderSceneObj(sObj->next);
}
glPopMatrix();
break;
case SCENEOBJ_ENTITY:
glPushMatrix();
glMultMatrixf(sObj->TM.index);
sObj->renderingfunc(sObj->entity);
if(sObj->child!=NULL) {
renderSceneObj(sObj->child);
}else if(sObj->next!=NULL){
glPopMatrix();
renderSceneObj(sObj->next);
}
glPopMatrix();
break;
}
}
/*------
FONKSIYON ISMI:renderTextureGluObj
YAPTIGI IS:Ekrana GLUObjlerini Renderler
-----*/
void renderTextureGluObj(entityObj *e){
disk *d;
sphere *s;
cylinder *c;
gluQuadricDrawStyle(quadric,GL_FILL);
gluQuadricNormals(quadric,GL_FLAT);
setGraphicMode(MODE_TEXTURE_NORMAL);
glBindTexture(GL_TEXTURE_2D, e->texID);
gluQuadricTexture(quadric, TRUE);
switch(e->pgluobj.type){
case GLUOBJ_SPHERE:
s=e->pgluobj.psphere;
gluSphere(quadric,s->radious,s->slices,s->stacks);
break;
case GLUOBJ_DISK:
d=e->pgluobj.pdisk;
gluDisk(quadric, d->innerRadious,d->outerRadious,d->slices, d->loops);
break;
case GLUOBJ_CYLINDER:
c=e->pgluobj.pcylinder;
gluCylinder(quadric, c->baseRadious,c->topRadious,c->height, c->slices, c->stacks);
break;
}
}
/*------
FONKSIYON ISMI:renderTextureBufferedObj
YAPTIGI IS:Ekran Buffered Objelerini Renderler
-----*/
void renderTextureBufferedObj(entityObj *e){
int ivertexDimension=3;
int itexDimension=2;
glShadeModel(GL_FLAT);
glBindTexture(GL_TEXTURE_2D, e->texID);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
glEnableClientState(GL_VERTEX_ARRAY);
glTexCoordPointer(itexDimension,GL_FLOAT,0,e->pbuffered.t);
glVertexPointer(ivertexDimension,GL_FLOAT,0,e->pbuffered.v);
glDrawArrays(GL_QUADS,0,e->pbuffered.size);
glDisableClientState(GL_VERTEX_ARRAY);
glDisableClientState(GL_TEXTURE_COORD_ARRAY);
glBindTexture(GL_TEXTURE_2D,0);
}
Eger bu fonksiyon olmasaydı ne yapacaktiniz her bir rendering fonksiyonu için switch case fonksiyonu yazacaktiniz. Hızlı deneme ve test için kodlarda kullanılması gerekli bence
Nasil calisiyor peki
http://www.function-pointer.org
http://www.function-pointer.org
[ Bu mesajı düzenleyen: Darklight _FIL 03-05-2004 01:39 ] |
|