void SetCameraView(CAMERA *Cam, float AspectRatio) { //kamerabeallitas :) MATRIX m; VECTOR3 u,dir; dir=V3_Normalize(V3_Sub(Cam->Target,Cam->Eye)); M_Rotate(dir.x,dir.y,dir.z,(float)Cam->Roll*360.0f/255.0f*(float)radtheta,m); M_Xformd(m,Cam->Up,u); //itt keszul a rotated up vector (a rollhoz) Cam->i=V3_Normalize(V3_Cross(dir,u)); Cam->j=V3_Normalize(V3_Cross(dir,Cam->i)); //kamera sikjaban egysegvektorok (billboardinghoz) glMatrixMode(GL_PROJECTION); glLoadIdentity(); gluPerspective(Cam->Fov,AspectRatio,0.1,2000.0); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); gluLookAt(Cam->Eye.x,Cam->Eye.y,Cam->Eye.z, Cam->Target.x,Cam->Target.y,Cam->Target.z, u.x,u.y,u.z); }
void GeneratePrimitive(OBJECT *Object) { int x,y; int x1,x2,y1,y2; VECTOR3 v; #ifdef INCLUDE_OBJ_STORED if (Object->Primitive!=aDDict_STORED) { Object->VertexNum=0; Object->PolygonNum=0; } #else Object->VertexNum=0; Object->PolygonNum=0; #endif //M_Identity(Object->ModelView); //Object->Primitive=PrimitiveID; switch (Object->Primitive) { #ifdef INCLUDE_OBJ_BOX case aDDict_BOX: { for (int x=0; x<14; x++) Object->AddVertex(BoxVertexData[x*5]/10.0f,BoxVertexData[x*5+1]/10.0f,BoxVertexData[x*5+2]/10.0f,BoxVertexData[x*5+3]/10.0f,BoxVertexData[x*5+4]/10.0f); for (int x=0; x<24; x++) Object->AddPolygon(BoxPolyData[x*7],BoxPolyData[x*7+1],BoxPolyData[x*7+2],BoxPolyData[x*7+3],BoxPolyData[x*7+4],BoxPolyData[x*7+5],BoxPolyData[x*7+6],0.5f,0.5f,1,0,0); } break; #endif #ifdef INCLUDE_OBJ_SPHERE case aDDict_SPHERE: Object->AddVertex(0,-0.5,0,0.5,0); Object->AddVertex(0,0.5,0,0.5,0); float theta,phi; for (x=1; x<Object->Param1-1; x++) { theta=(float)((x/(float)(Object->Param1-1)*180-90)*radtheta); for (int y=0; y<Object->Param2; y++) { phi=y/(float)Object->Param2*360.0f*(float)radtheta; v.x=(float)cos(theta)*(float)cos(phi)*0.5f; v.y=(float)cos(theta)*(float)sin(phi)*0.5f; v.z=(float)sin(theta)*0.5f; Object->AddVertex(v.x,v.z,-v.y,x/(float)Object->Param1,y/(float)Object->Param2); } } for (x=0; x<Object->Param1-1; x++) { x1=(x-1)*Object->Param2; x2=x*Object->Param2; for (int y=0; y<Object->Param2; y++) { y1=y+2; y2=(y+1)%Object->Param2+2; if (x>0 && x<Object->Param1-2) { Object->AddPolygon(x1+y1,x2+y1,x2+y2,aDDict_GOURAUDSHADE,(x)/(float)(Object->Param1),(y)/(float)Object->Param2,(x+1)/(float)(Object->Param1),y/(float)Object->Param2,(x+1)/(float)(Object->Param1),(y+1)/(float)Object->Param2,1,0,1); Object->AddPolygon(x1+y1,x2+y2,x1+y2,aDDict_GOURAUDSHADE,(x)/(float)(Object->Param1),(y)/(float)Object->Param2,(x+1)/(float)(Object->Param1),(y+1)/(float)Object->Param2,x/(float)(Object->Param1),(y+1)/(float)Object->Param2,0,1,1); } else if (x==0) Object->AddPolygon(y2,0,y1,aDDict_GOURAUDSHADE,(1)/(float)(Object->Param1),(y+1)/(float)Object->Param2,0,(y+1)/(float)Object->Param2,(1)/(float)(Object->Param1),(y)/(float)Object->Param2,1,1,1); else Object->AddPolygon(x1+y1,1,x1+y2,aDDict_GOURAUDSHADE,(x)/(float)(Object->Param1),(y)/(float)Object->Param2,1,(y+1)/(float)Object->Param2,(x)/(float)(Object->Param1),(y+1)/(float)Object->Param2,1,1,1); } } break; #endif #ifdef INCLUDE_OBJ_CYLINDER case aDDict_CYLINDER: Object->AddVertex(0,-0.5,0,0.5,0.5); Object->AddVertex(0,0.5,0,0.5,0.5); for (y=0; y<Object->Param2+1; y++) { for (x=0; x<Object->Param1; x++) { float theta=(float)((x/(float)Object->Param1*360.0f)*radtheta); v.x=(float)cos(theta)*0.5f; v.y=(float)sin(theta)*0.5f; v.z=-0.5f+y/(float)Object->Param2; Object->AddVertex(v.x,v.z,-v.y,x/(float)Object->Param1,v.z+0.5f); } } for (x=0; x<Object->Param1; x++) { x1=x; x2=(x+1)%Object->Param1; if (Object->Param3) { Object->AddPolygon(0,x1+2,x2+2,0.5f,0.5f,(float)sin(x/(float)(Object->Param1)*360*radtheta)*0.5f+0.5f,(float)cos(x/(float)(Object->Param1)*360*radtheta)*0.5f+0.5f,(float)sin((x+1)/(float)(Object->Param1)*360*radtheta)*0.5f+0.5f,(float)cos((x+1)/(float)(Object->Param1)*360*radtheta)*0.5f+0.5f,1,1,1); Object->AddPolygon(x1+Object->Param1*Object->Param2+2,1,x2+Object->Param1*Object->Param2+2,(float)sin(x/(float)(Object->Param1)*360*radtheta)*0.5f+0.5f,(float)cos(x/(float)(Object->Param1)*360*radtheta)*0.5f+0.5f,0.5f,0.5f,(float)sin((x+1)/(float)(Object->Param1)*360*radtheta)*0.5f+0.5f,(float)cos((x+1)/(float)(Object->Param1)*360*radtheta)*0.5f+0.5f,1,1,1); } for (int y=0; y<Object->Param2; y++) { y1=y*Object->Param1+2; y2=(y+1)*Object->Param1+2; Object->AddPolygon(x2+y1,x1+y1,x2+y2,aDDict_GOURAUDSHADE,(x+1)/(float)(Object->Param1),y/(float)Object->Param2,x/(float)(Object->Param1),y/(float)Object->Param2,(x+1)/(float)(Object->Param1),(y+1)/(float)Object->Param2,1,1,0); Object->AddPolygon(x2+y2,x1+y1,x1+y2,aDDict_GOURAUDSHADE,(x+1)/(float)(Object->Param1),(y+1)/(float)Object->Param2,x/(float)(Object->Param1),y/(float)Object->Param2,x/(float)(Object->Param1),(y+1)/(float)Object->Param2,0,1,1); } } break; #endif #ifdef INCLUDE_OBJ_CONE case aDDict_CONE: Object->AddVertex(0,0.5,0,0.5,0.5); Object->AddVertex(0,-0.5,0,0.5,0.5); for (y=1; y<=Object->Param3; y++) { for (x=0; x<Object->Param1; x++) { float theta=(float)((x/(float)Object->Param1*360.0f)*radtheta); v.x=(float)cos(theta)*0.5f*y/(float)Object->Param3; v.y=(float)sin(theta)*0.5f*y/(float)Object->Param3; v.z=-(-0.5f+y/(float)Object->Param3); Object->AddVertex(v.x,v.z,-v.y,v.x+0.5f,v.y+0.5f); } } for (x=0; x<Object->Param1; x++) { x1=x; x2=(x+1)%Object->Param1; Object->AddPolygon(x1+2,0,x2+2,aDDict_GOURAUDSHADE,1,1,1); if (Object->Param2) Object->AddPolygon(1,x1+Object->Param1*(Object->Param3-1)+2,x2+Object->Param1*(Object->Param3-1)+2,1,1,1); for (int y=0; y<Object->Param3-1; y++) { y1=y*Object->Param1+2; y2=(y+1)*Object->Param1+2; Object->AddPolygon(x1+y1,x2+y1,x2+y2,aDDict_GOURAUDSHADE,1,0,1); Object->AddPolygon(x1+y1,x2+y2,x1+y2,aDDict_GOURAUDSHADE,0,1,1); } } break; #endif #ifdef INCLUDE_OBJ_PLANE case aDDict_PLANE: for (x=0; x<=Object->Param1; x++) for (y=0; y<=Object->Param2; y++) Object->AddVertex(x/(float)Object->Param1-0.5f,0,y/(float)Object->Param2-0.5f,x/(float)Object->Param1,y/(float)Object->Param2); for (x=0; x<Object->Param1; x++) { x1=x*(Object->Param2+1); x2=(x+1)*(Object->Param2+1); for (int y=0; y<Object->Param2; y++) { y1=y; y2=(y+1)%(Object->Param2+1); Object->AddPolygon(x1+y1,x2+y1,x2+y2,1,0,1); Object->AddPolygon(x1+y1,x2+y2,x1+y2,0,1,1); } } break; #endif #ifdef INCLUDE_OBJ_CIRCLE case aDDict_CIRCLE: for (x=0; x<Object->Param1; x++) { theta=(float)((x/(float)Object->Param1*360.0f)*radtheta); v.x=(float)cos(theta); v.y=(float)sin(theta); v.z=0; float p=Object->Param2/255.0f*0.5f; Object->AddVertex(v.x*0.5f,v.z,-v.y*0.5f,x/(float)Object->Param1,0); Object->AddVertex(v.x*p,v.z,-v.y*p,x/(float)Object->Param1,1); } for (x=0; x<Object->Param1; x++) { x1=(x)%Object->Param1*2; x2=(x+1)%Object->Param1*2; y1=0; y2=1; Object->AddPolygon(x1+y1,x2+y1,x2+y2,aDDict_FLATSHADE,x/(float)Object->Param1,0,(x+1)/(float)Object->Param1,0,(x+1)/(float)Object->Param1,1,1,0,1); Object->AddPolygon(x1+y1,x2+y2,x1+y2,aDDict_FLATSHADE,x/(float)Object->Param1,0,(x+1)/(float)Object->Param1,1,x/(float)Object->Param1,1,0,1,1); } break; #endif #ifdef INCLUDE_OBJ_LINE case aDDict_LINE: for (x=-1; x<=Object->Param1; x++) { Object->AddVertex(0,0,-0.5f+x/(float)(Object->Param1-1),0,0); /*if (x>0 && x<Object->Param1) Object->AddEdge(x,x+1,-1);*/ } break; #endif #ifdef INCLUDE_OBJ_ARC case aDDict_ARC: for (x=-1; x<=Object->Param1; x++) { float phase=x/(float)(Object->Param1-1)*(float)Object->Param2*radtheta; Object->AddVertex((float)(0.5f*cos(phase)),0,(float)(0.5f*sin(phase)),0,0); /*if (x>0 && x<Object->Param1) Object->AddEdge(x,x+1,-1);*/ } break; #endif #ifdef INCLUDE_OBJ_LOFT case aDDict_LOFT: { VECTOR3 Up=V3_Make(0,1,0); Object->Backface=false; OBJECT *v1,*v2; v1=(OBJECT*)Object->Param1; v2=(OBJECT*)Object->Param2; if (v1 && v2) { bool xc=v1->Param2==360, yc=v2->Param2==360; int v1v=v1->VertexNum-2; int v2v=v2->VertexNum-2; if (xc) v1v--; if (yc) v2v--; int xx=0; if ((v1->VertexNum>1) && (v2->VertexNum>1)) { int xa,ya; for (xa=1;xa<=v1v;xa++) { VECTOR3 va,vb,vc; va=v1->VertexList[xa-1].Position; vb=v1->VertexList[xa].Position; vc=v1->VertexList[xa+1].Position; M_Xformd(v1->ModelView,va,va); M_Xformd(v1->ModelView,vb,vb); M_Xformd(v1->ModelView,vc,vc); VECTOR3 a1=V3_Normalize(V3_Sub(vb,va)); VECTOR3 a2=V3_Normalize(V3_Sub(vc,va)); VECTOR3 dir=V3_Normalize(V3_Add(a1,a2)); VECTOR3 nx=V3_Cross(Up,dir); VECTOR3 ny=V3_Cross(nx,dir); int yy=0; for (ya=1;ya<=v2v;ya++) { VECTOR3 yv=v2->VertexList[ya].Position; M_Xformd(v2->ModelView,yv,yv); VECTOR3 nv=V3_Add(V3_Mults(nx,yv.x),V3_Mults(ny,yv.z)); nv=V3_Add(nv,vb); Object->AddVertex(nv.x,nv.y,nv.z,xx/(float)(v1v-1),yy/(float)(v2v-1)); yy++; } xx++; } if (xc) v1v++; if (yc) v2v++; for (xx=0;xx<=v2v-2;xx++) for (int yy=0;yy<=v1v-2;yy++) { int xa=xx, ya=yy; int x1=xx+1,y1=yy+1; int v2vs=v2v; if (yc) { v2vs--; xa%=v2v-1; x1%=v2v-1; } if (xc) { ya%=v1v-1; y1%=v1v-1; } Object->AddPolygon(ya*v2vs+xa,ya*v2vs+x1,y1*v2vs+x1,aDDict_GOURAUDSHADE,xx/((float)v2v-1),yy/((float)v1v-1),(xx+1)/((float)v2v-1),yy/((float)v1v-1),(xx+1)/((float)v2v-1),(yy+1)/((float)v1v-1),1,0,1); Object->AddPolygon(ya*v2vs+xa,y1*v2vs+x1,y1*v2vs+xa,aDDict_GOURAUDSHADE,xx/((float)v2v-1),yy/((float)v1v-1),(xx+1)/((float)v2v-1),(yy+1)/((float)v1v-1),xx/((float)v2v-1),(yy+1)/((float)v1v-1),0,1,1); } } } } break; #endif #ifdef INCLUDE_OBJ_FUR case aDDict_FUR: { srand(115); //9,26,30,35,39,46,62,75,79,115,116,126 //135 volt az utolso OBJECT *Host=(OBJECT*)Object->Param5; for (int x=0; x<Host->PolygonNum; x++) { VECTOR3 Ha,Hb,Hc; Ha=Host->VertexList[Host->PolygonList[x].v[0]].Position; Hb=Host->VertexList[Host->PolygonList[x].v[1]].Position; Hc=Host->VertexList[Host->PolygonList[x].v[2]].Position; MATRIX m; memcpy(&m,Host->ModelView,sizeof(MATRIX)); //for (int a=0; a<4; a++) for (int b=0; b<4; b++) m[a][b]=KillFloat(m[a][b],2); M_Xformd(m,Ha,Ha); M_Xformd(m,Hb,Hb); M_Xformd(m,Hc,Hc); VECTOR3 Origin=V3_Mults(V3_Add(V3_Add(Ha,Hb),Hc),1/3.0f); VECTOR3 i=V3_Normalize(V3_Cross(V3_Sub(Hc,Ha),V3_Sub(Hb,Ha))); for (int y=0; y<Object->Param2; y++) { VECTOR3 Random=V3_Normalize(V3_Make((float)rand(),(float)rand(),(float)rand())); VECTOR3 j=V3_Cross(i,Random); VECTOR3 k=V3_Mults(V3_Cross(i,j),0.5f); VECTOR3 a,b,c,d; float r=((rand()/(float)RAND_MAX)-0.5f)*2.0f; i=V3_Mults(i,Object->Param3/255.0f); k=V3_Mults(k,Object->Param1/255.0f); a=V3_Add(Origin,k); b=V3_Add(V3_Add(Origin,k),i); c=V3_Add(V3_Sub(Origin,k),i); d=V3_Sub(Origin,k); Object->AddVertex(a.x,a.y,a.z,0,0); Object->AddVertex(b.x,b.y,b.z,0,1); Object->AddVertex(c.x,c.y,c.z,1,1); Object->AddVertex(d.x,d.y,d.z,1,0); Object->AddPolygon((x*Object->Param2+y)*4,(x*Object->Param2+y)*4+1,(x*Object->Param2+y)*4+2,aDDict_GOURAUDSHADE,1,0,1); Object->AddPolygon((x*Object->Param2+y)*4,(x*Object->Param2+y)*4+2,(x*Object->Param2+y)*4+3,aDDict_GOURAUDSHADE,0,1,1); } } } break; #endif #ifdef INCLUDE_OBJ_SUPERSHAPE case aDDict_SUPERSHAPE: { SUPERSHAPE *s=(SUPERSHAPE*)Object->Param1; for (int x=0; x<=s->Xres; x++) { float phi=LinearInterpolate((float)s->Rangex1,(float)s->Rangex2,x/(float)(s->Xres))/180.0f*3.1415f; float r0=0; if (!s->Sphere) r0=s->Trad0; float r1a=SuperShapeRad(s->SuperShape1.mint+s->SuperShape1.mfloat/255.0f,s->SuperShape1.n1,s->SuperShape1.n2,s->SuperShape1.n3,s->SuperShape1.a,s->SuperShape1.b,phi)+r0; if (s->RadFunc) { float r1; if (s->RadFunc==1) r1=s->Rada*phi; if (s->RadFunc==2) r1=(float)(s->Rada*exp(s->Radb*phi)); r1a*=r1; } float r1=s->Verta*phi; for (int y=0; y<=s->Yres; y++) { float ro=LinearInterpolate((float)s->Rangey1,(float)s->Rangey2,y/(float)(s->Yres))/180.0f*3.1415f; float r2a=SuperShapeRad(s->SuperShape2.mint+s->SuperShape2.mfloat/255.0f,s->SuperShape2.n1,s->SuperShape2.n2,s->SuperShape2.n3,s->SuperShape2.a,s->SuperShape2.b,ro); VECTOR3 pos; if (s->Sphere) pos=V3_Make((float)(r1a*cos(phi )*r2a*cos(ro )),(float)(r1a*sin(phi )*r2a*cos(ro )),(float)(r2a*sin(ro ))); else pos=V3_Make((float)(cos(phi )*(r1a+r2a*cos(ro ))),(float)(sin(phi )*(r1a+r2a*cos(ro ))),(float)(r2a*sin(ro ))); if (s->VertFunc) pos.z*=r1; Object->AddVertex(pos.x,pos.y,pos.z,x/(float)(s->Xres),y/(float)(s->Yres)); } } for (x=0; x<s->Xres; x++) { for (int y=0; y<s->Yres; y++) { Object->AddPolygon(x*(s->Yres+1)+y,(x+1)*(s->Yres+1)+y+1,(x+1)*(s->Yres+1)+y,aDDict_GOURAUDSHADE,0,1,1); Object->AddPolygon(x*(s->Yres+1)+y,(x)*(s->Yres+1)+y+1,(x+1)*(s->Yres+1)+y+1,aDDict_GOURAUDSHADE,1,0,1); } } } break; #endif case -25472: default: break; } #ifdef INCLUDE_OBJ_STORED if (Object->Primitive!=aDDict_STORED) { Object->CalculateTextureCoordinates(); } #else Object->CalculateTextureCoordinates(); #endif for (x=0; x<Object->PolygonNum; x++) { if (Object->Shading!=aDDict_DEFAULTSHADE) Object->PolygonList[x].CurrentShading=Object->Shading; } }
void SCENE::SetupDummies() { bool Lighting=true; //na ez lovi be a scene display listjeit ObjDummyCount=CountObjects(); ObjDummies=new OBJDUMMY[ObjDummyCount]; memset(ObjDummies,0,sizeof(OBJDUMMY)*ObjDummyCount); //dummy tomb int FilledDummy=0; int x; for (x=0; x<ObjectNum; x++) //dummy tomb feltoltese { if (ObjectList[x].Primitive<100 && ObjectList[x].Primitive!=11 /*clone*/) CalculateDummy(&ObjectList[x],FilledDummy,&ObjectList[x].ModelView); if (ObjectList[x].Primitive==11 /*clone*/) SetupClones(this,x,FilledDummy,&ObjectList[x].ModelView); } qsort(ObjDummies,ObjDummyCount,sizeof(OBJDUMMY),DummyCompare); //attributumsort glNewList(ZmaskList,GL_COMPILE); //ket lista keszul, egy a zmaskos objecteknek, egy a nem zmaskosoknak //ez a zmaskos, a nem zmaskos a valtaskor kap erteket glBegin(GL_TRIANGLES); unsigned char c[4],o[4]; for (x=0; x<4; x++) c[x]=o[x]=2; for (int z=0; z<ObjDummyCount; z++) //a fo loop { //glErrorCheck(); OBJECT *LastObject=NULL; if (z) LastObject=ObjDummies[z-1].OriginalObj; //ez az elozo object, referencianak h melyik //attributum valtozott OBJECT *Object=ObjDummies[z].OriginalObj; //az aktualis object //MATRIX Position; //memcpy(&Position,ObjDummies[z].ModelView,sizeof(MATRIX)); //az object pozicioja /*MATRIX InvTransp; memcpy(&InvTransp,&Position,sizeof(MATRIX)); M_Invert(InvTransp); M_Transpose(InvTransp);*/ //eltranszformaljuk az osszes vertexet a vegleges pozicioba, es kiszamoljuk a normalokat, //erre azert van szukseg mert igy jok lesznek a normalok es a nonuniform scalezettek nem bugzanak be for (x=0; x<Object->VertexNum; x++) { Object->VertexList[x].MapTransformedPosition=Object->VertexList[x].Position; M_Xformd(ObjDummies[z].ModelView,Object->VertexList[x].MapTransformedPosition,Object->VertexList[x].MapTransformedPosition); } Object->CalculateNormals(); //ha szinvaltozas van bool NewCol=!LastObject; if (!ColorDiscard && LastObject) for (int a=0; a<4; a++) if (Object->Color.c[a]!=LastObject->Color.c[a]) NewCol=true; bool Cut; //ha elertunk a zmask valtashoz bool ZmaskChange=!Object->ZMask && (!LastObject || LastObject->ZMask); NewCol=ZmaskChange || NewCol; //ha envmap objecthez ertunk bool EnvmapTurnOn=((LastObject && !ObjDummies[z-1].Envmap) || !LastObject) && ObjDummies[z].Envmap; //ha wireframe valtas van //bool WireframeChange=!LastObject || ZmaskChange || EnvmapTurnOn || (Object->Wireframe != LastObject->Wireframe); //ha kikapcsolodott a textura bool TextureDisable=(!Object->Textured && ((LastObject && LastObject->Textured) || !LastObject));// || (WireframeChange && Object->Wireframe && !ObjDummies[z].Envmap); //ha valtozott a textura bool TextureChange=Object->Textured && (ZmaskChange || (!LastObject || !LastObject->Textured) || (LastObject && LastObject->Material->TextureID*8+LastObject->Material->SlotNumber!=Object->Material->TextureID*8+Object->Material->SlotNumber));// || (WireframeChange && !Object->Wireframe && Object->Textured)); //ha valtozott a blendmode bool BlendChange=!LastObject || LastObject->SRCBlend!=Object->SRCBlend || LastObject->DSTBlend!=Object->DSTBlend; //ha valtozott az envmap bool EnvmapChange=Object->EnvMap && LastObject && ObjDummies[z-1].Envmap && (LastObject->EnvMap->TextureID*8+LastObject->EnvMap->SlotNumber!=Object->EnvMap->TextureID*8+Object->EnvMap->SlotNumber); //ha valtozott a backface culling ki be kapcsoltsaga bool BackChange=!LastObject || ZmaskChange || (Object->Backface != LastObject->Backface); //ha valtozott a backface culling iranya bool BackFrontChange=!LastObject || ZmaskChange || (Object->Backface && Object->Backfront!=LastObject->Backfront); //ha valtozott az alpha epsilon bool AepsilonChange=!LastObject || ZmaskChange || (Object->AEpsilon != LastObject->AEpsilon); //ha meg kell szakitani modvaltas miatt a glbegin() glend()-et Cut=ZmaskChange || (!ObjDummies[z].Envmap && (TextureDisable || TextureChange || BlendChange) ) || (ObjDummies[z].Envmap && (EnvmapTurnOn || EnvmapChange)) || (NewCol && !ColorDiscard) || BackChange || BackFrontChange || AepsilonChange; //||WireframeChange; //ha meg kell szakitani, akkor megszakitjuk :) if (Cut) glEnd(); //zmask valtas, innen a nem zmaskos objectek jonnek (kulon listaba mert egy world tobb scenebol //allhat, es eloszor a zmaskos scene listakat kell renderelni, utana a nem zmaskosakat) if (ZmaskChange) { glEndList(); glNewList(NoZmaskList,GL_COMPILE); } //alpha epsilon valtas if (AepsilonChange) { glAlphaFunc(GL_GEQUAL,Object->AEpsilon/255.0f); } //szinvaltas if (!ColorDiscard && NewCol) glColor4ub(Object->Color.c[0],Object->Color.c[1],Object->Color.c[2],Object->Color.c[3]); //backface cull ki/bekapcs if (BackChange) if (Object->Backface) glEnable(GL_CULL_FACE); else glDisable(GL_CULL_FACE); //backface cull reverse if (BackFrontChange) if (Object->Backfront) glCullFace(GL_FRONT); else glCullFace(GL_BACK); //ha nem envmap az object if (!ObjDummies[z].Envmap) { //textura kikapcs if (TextureDisable) glDisable(GL_TEXTURE_2D); //texturavaltas if (TextureChange) { glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D,Object->Material->ImageData.TextureHandle); } //blendmodevaltas if (BlendChange) glBlendFunc(Object->DSTBlend,Object->SRCBlend); } else //ha envmap az object { //envmap bekapcs if (EnvmapTurnOn) { glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D,Object->EnvMap->ImageData.TextureHandle); glEnable(GL_TEXTURE_GEN_S); glEnable(GL_TEXTURE_GEN_T); glBlendFunc(GL_ONE,GL_ONE); } //envmap textura valtas if (EnvmapChange) glBindTexture(GL_TEXTURE_2D,Object->EnvMap->ImageData.TextureHandle); } /*if (WireframeChange) { if (!Object->Wireframe || ObjDummies[z].Envmap) { if (Lighting) glEnable(GL_LIGHTING); } else { Lighting=glIsEnabled(GL_LIGHTING)!=0; glDisable(GL_LIGHTING); } }*/ //ha vagas volt, ujra kell glbegin if (Cut) if (!Object->Wireframe || ObjDummies[z].Envmap) glBegin(GL_TRIANGLES); else glBegin(GL_LINES); if (!Object->Wireframe || ObjDummies[z].Envmap) { for (x=0; x<Object->PolygonNum; x++) { if (Object->PolygonList[x].CurrentShading!=aDDict_GOURAUDSHADE) glNormal3f(Object->PolygonList[x].CurrentNormal.x,Object->PolygonList[x].CurrentNormal.y,Object->PolygonList[x].CurrentNormal.z); //vertex1 if (Object->PolygonList[x].CurrentShading==aDDict_GOURAUDSHADE) glNormal3f(Object->VertexList[Object->PolygonList[x].v[0]].CurrentNormal.x,Object->VertexList[Object->PolygonList[x].v[0]].CurrentNormal.y,Object->VertexList[Object->PolygonList[x].v[0]].CurrentNormal.z); if (Object->Textured) glTexCoord2f(Object->PolygonList[x].ct[0].x,Object->PolygonList[x].ct[0].y); glVertex3f(Object->VertexList[Object->PolygonList[x].v[0]].MapTransformedPosition.x,Object->VertexList[Object->PolygonList[x].v[0]].MapTransformedPosition.y,Object->VertexList[Object->PolygonList[x].v[0]].MapTransformedPosition.z); //vertex2 if (Object->PolygonList[x].CurrentShading==aDDict_GOURAUDSHADE) glNormal3f(Object->VertexList[Object->PolygonList[x].v[1]].CurrentNormal.x,Object->VertexList[Object->PolygonList[x].v[1]].CurrentNormal.y,Object->VertexList[Object->PolygonList[x].v[1]].CurrentNormal.z); if (Object->Textured) glTexCoord2f(Object->PolygonList[x].ct[1].x,Object->PolygonList[x].ct[1].y); glVertex3f(Object->VertexList[Object->PolygonList[x].v[1]].MapTransformedPosition.x,Object->VertexList[Object->PolygonList[x].v[1]].MapTransformedPosition.y,Object->VertexList[Object->PolygonList[x].v[1]].MapTransformedPosition.z); //vertex3 if (Object->PolygonList[x].CurrentShading==aDDict_GOURAUDSHADE) glNormal3f(Object->VertexList[Object->PolygonList[x].v[2]].CurrentNormal.x,Object->VertexList[Object->PolygonList[x].v[2]].CurrentNormal.y,Object->VertexList[Object->PolygonList[x].v[2]].CurrentNormal.z); if (Object->Textured) glTexCoord2f(Object->PolygonList[x].ct[2].x,Object->PolygonList[x].ct[2].y); glVertex3f(Object->VertexList[Object->PolygonList[x].v[2]].MapTransformedPosition.x,Object->VertexList[Object->PolygonList[x].v[2]].MapTransformedPosition.y,Object->VertexList[Object->PolygonList[x].v[2]].MapTransformedPosition.z); } /*if (ObjDummies[z].Envmap) { glEnd(); glColor4f(0,1,0,1); glDisable(GL_BLEND); glDisable(GL_LINE_SMOOTH); glDisable(GL_TEXTURE_2D); glBlendFunc(GL_ONE,GL_ZERO); glDisable(GL_LIGHTING); glBegin(GL_LINES); for (x=0; x<Object->VertexNum; x++) { glVertex3f(Object->VertexList[x].MapTransformedPosition.x,Object->VertexList[x].MapTransformedPosition.y,Object->VertexList[x].MapTransformedPosition.z); glVertex3f(Object->VertexList[x].MapTransformedPosition.x+Object->VertexList[x].CurrentNormal.x/5.0f, Object->VertexList[x].MapTransformedPosition.y+Object->VertexList[x].CurrentNormal.y/5.0f, Object->VertexList[x].MapTransformedPosition.z+Object->VertexList[x].CurrentNormal.z/5.0f); } glEnd(); } glBegin(GL_TRIANGLES);*/ } else { glEnd(); glPushAttrib(GL_LIGHTING_BIT); glPushAttrib(GL_TEXTURE_BIT); glDisable(GL_LIGHTING); glDisable(GL_TEXTURE_2D); glBegin(GL_LINES); for (x=0; x<Object->EdgeNum; x++) if (Object->EdgeList[x].InWireframe) { glVertex3f(Object->VertexList[Object->EdgeList[x].v1].MapTransformedPosition.x,Object->VertexList[Object->EdgeList[x].v1].MapTransformedPosition.y,Object->VertexList[Object->EdgeList[x].v1].MapTransformedPosition.z); glVertex3f(Object->VertexList[Object->EdgeList[x].v2].MapTransformedPosition.x,Object->VertexList[Object->EdgeList[x].v2].MapTransformedPosition.y,Object->VertexList[Object->EdgeList[x].v2].MapTransformedPosition.z); } glEnd(); glPopAttrib(); glPopAttrib(); glBegin(GL_LINES); } } //ha elertunk minden vegere, lezarjuk a stuffot glEnd(); glEndList(); }