diff options
Diffstat (limited to 'glgrav.cpp')
-rw-r--r-- | glgrav.cpp | 298 |
1 files changed, 191 insertions, 107 deletions
@@ -84,21 +84,21 @@ static bool fog_light=false; static GLfloat fog_col[4]={0.0f,0.0f,0.0f,1.0f}; static struct - { - GLfloat x,y,z; - GLfloat ang; - GLfloat speed; - } camera={0.0f,0.0f,0.0f,0.0f,0.0f}; +{ + GLfloat x,y,z; + GLfloat ang; + GLfloat speed; +} camera={0.0f,0.0f,0.0f,0.0f,0.0f}; static struct - { - int mx,my; - bool lmb; - bool shift; - bool ctrl; - bool pgup; - bool pgdn; - } control; +{ + int mx,my; + bool lmb; + bool shift; + bool ctrl; + bool pgup; + bool pgdn; +} control; static void Reshape(int w,int h); static void Mouse(int b,int s, int x, int y); @@ -139,10 +139,10 @@ int main(int argc, char *argv[]) mass.clear(); if (!config.read(argc == 2 ? argv[1] : "dat",mass)) - { + { cerr << "Config file reading failed : \n" << config.error() << endl; exit(1); - } + } config.getCamera(camera.x,camera.y,camera.z,camera.ang); @@ -154,41 +154,45 @@ int main(int argc, char *argv[]) fog=config.enabled(Config::fog); if (config.particlesDefined()) - { + { GLfloat adec,amin; config.getParticles(adec,amin,particleSize); particles=new Particles(adec,amin); render_particles=true; - } + } else + { render_particles=false; + } if (config.sparksDefined()) - { + { int num,len; GLfloat adec,amin,delta; config.getSparks(num,adec,amin,len,delta); - sparks=new Sparks(num,adec,amin,len,delta); + sparks=new Sparks(num,adec,amin,len,delta); render_sparks=true; - } + } else + { render_sparks=false; + } config.windowSize(width,height); width=max(width,100); height=max(height,100); -# ifdef DEBUG - { +#ifdef DEBUG + { vector<Mass>::size_type f; for(f=0;f<mass.size();f++) cout << "Initial : " << mass[f] << endl; - } -# endif + } +#endif glutDisplayFunc(Display); glutMouseFunc(Mouse); @@ -227,35 +231,35 @@ int main(int argc, char *argv[]) glutAddMenuEntry("None",MENU_LOOK+LOOK_NONE); for(li=0;li<look.size();li++) - { + { glutSetMenu(travel_menu); glutAddMenuEntry(look[li].c_str(),MENU_TRAVEL+li); glutSetMenu(look_menu); glutAddMenuEntry(look[li].c_str(),MENU_LOOK+li); - } + } // Create frame skip menu // frame_skip_menu=glutCreateMenu(FrameSkipMenu); for(f=0;f<20;f++) - { + { char s[64]; int skip; if (f) - { + { skip=f+1; sprintf(s,"Draw every %d frames",skip); - } + } else - { + { skip=f; strcpy(s,"No frame skip"); - } + } glutAddMenuEntry(s,MENU_FRAME_SKIP+skip); - } + } glutSetMenu(menu); glutAddSubMenu("Travel as",travel_menu); @@ -266,21 +270,23 @@ int main(int argc, char *argv[]) // Create optional debug menu // -# ifdef DEBUG - { +#ifdef DEBUG + { debug_menu=glutCreateMenu(DebugMenu); glutAddMenuEntry("Dump Objects",DBG_DUMPOBJ); glutSetMenu(menu); glutAddSubMenu("DEBUG",debug_menu); - } -# endif + } +#endif // Open GL initialisation // glShadeModel(GL_SMOOTH); if (!light) - glDisable(GL_LIGHTING); + { + glDisable(GL_LIGHTING); + } glEnable(GL_DEPTH_TEST); glEnable(GL_COLOR_MATERIAL); @@ -292,7 +298,7 @@ int main(int argc, char *argv[]) glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); if (fog) - { + { GLfloat dist; config.getFog(dist,fog_col[0],fog_col[1],fog_col[2],fog_light); @@ -303,7 +309,7 @@ int main(int argc, char *argv[]) glFogi(GL_FOG_MODE,GL_LINEAR); glClearColor(fog_col[0],fog_col[1],fog_col[2],1.0); - } + } // Enter the main loop // @@ -332,12 +338,12 @@ static void Mouse(int b,int s, int x, int y) int mod=glutGetModifiers(); if (b==GLUT_LEFT_BUTTON) - { + { control.lmb=(s==GLUT_DOWN); control.shift=mod&GLUT_ACTIVE_SHIFT; control.ctrl=mod&GLUT_ACTIVE_CTRL; - } + } } @@ -355,7 +361,7 @@ static void Menu(int item) #endif switch (item) - { + { case MENU_SOLID: solid=!solid; SetOption(MENU_SOLID,"Solid",solid); @@ -366,7 +372,9 @@ static void Menu(int item) SetOption(MENU_LIGHTING,"Lighting",light); if (!light) + { glDisable(GL_LIGHTING); + } break; case MENU_TEXTURE: @@ -390,21 +398,25 @@ static void Menu(int item) case MENU_FOG: if (config.enabled(Config::fog)) - { + { fog=!fog; SetOption(MENU_FOG,"Fog",fog); if (fog) + { glClearColor(fog_col[0],fog_col[1],fog_col[2],1.0); + } else + { glClearColor(0.0f,0.0f,0.0f,1.0); } + } break; case MENU_QUIT: exit(EXIT_SUCCESS); break; - } + } } @@ -419,7 +431,9 @@ static void TravelMenu(int item) travel_as=item-MENU_TRAVEL; if (travel_as!=LOOK_NONE and look_at==travel_as) + { travel_as=old; + } } @@ -434,7 +448,9 @@ static void LookMenu(int item) look_at=item-MENU_LOOK; if (look_at!=LOOK_NONE and look_at==travel_as) + { look_at=old; + } } @@ -454,12 +470,14 @@ static void DebugMenu(int item) vector<Mass>::size_type f; switch (item) - { + { case DBG_DUMPOBJ: for(f=0;f<mass.size();f++) + { cout << mass[f] << endl; + } break; - } + } } #endif @@ -467,9 +485,13 @@ static void DebugMenu(int item) static void SetOption(int opt, string text, bool flag) { if (flag) + { text+=" Off"; + } else + { text+=" On"; + } glutChangeToMenuEntry(opt,text.c_str(),opt); } @@ -478,7 +500,7 @@ static void SetOption(int opt, string text, bool flag) static void Key(int key, int mx, int my) { switch(key) - { + { case GLUT_KEY_PAGE_DOWN: control.pgdn=true; break; @@ -489,7 +511,7 @@ static void Key(int key, int mx, int my) default: break; - } + } } @@ -500,7 +522,7 @@ static void SetView() glLoadIdentity(); if ((look_at!=LOOK_NONE)&&(findMass(mass,look[look_at],lm))) - { + { double x,y,z; lm.getPosition(x,y,z); @@ -513,12 +535,12 @@ static void SetView() static_cast<GLdouble>(camera.z), x,y,z, 0.0,1.0,0.0); - } + } else - { + { glRotatef(360.0-camera.ang,0.0f,1.0f,0.0f); glTranslatef(-camera.x,-camera.y,-camera.z); - } + } } @@ -528,11 +550,11 @@ static void DrawMasses(Mass::DrawItem item) Mass lm; for(i=mass.begin();i!=mass.end();i++) - { + { SetView(); if (light) - { + { GLfloat light[4]; GLfloat pos[4]; string name; @@ -540,7 +562,7 @@ static void DrawMasses(Mass::DrawItem item) name=config.light(light); if (name!=i->getName() && findMass(mass,name,lm)) - { + { double x,y,z; lm.getPosition(x,y,z); @@ -557,17 +579,17 @@ static void DrawMasses(Mass::DrawItem item) if (fog) glEnable(GL_FOG); - } + } else - { + { if (!fog_light) glDisable(GL_FOG); glDisable(GL_LIGHTING); - } } + } i->draw(solid,texture,item); - } + } } @@ -575,10 +597,10 @@ static void Display(void) { Mass lm; - /* Looking up/down doesn't work yet... - */ + // Looking up/down doesn't work yet... + // if ((travel_as!=LOOK_NONE)&&(findMass(mass,look[travel_as],lm))) - { + { double x,y,z; lm.getPosition(x,y,z); @@ -586,19 +608,23 @@ static void Display(void) camera.x=static_cast<GLfloat>(x); camera.y=static_cast<GLfloat>(y); camera.z=static_cast<GLfloat>(z); - } + } else - { + { GLPrint("Pos: %d,%d,%d",(int)camera.x,(int)camera.y,(int)camera.z); GLPrint("Angle: %d",(int)camera.ang); - } + } glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT); if (fog) + { glEnable(GL_FOG); + } else + { glDisable(GL_FOG); + } DrawMasses(Mass::eMass); @@ -611,19 +637,21 @@ static void Display(void) glDisable(GL_TEXTURE_2D); if (fog) + { glEnable(GL_FOG); + } if (particles && render_particles) - { + { glPointSize(particleSize); particles->draw(); - } + } if (sparks && render_sparks) - { + { glPointSize(1); - sparks->draw(); - } + sparks->draw(); + } glDisable(GL_BLEND); @@ -655,35 +683,51 @@ static void Shatter(vector<Mass>& mv, Mass& m,int no,double delta,int shield) texture=m.getTexture(id); for(f=0;f<no;f++) + { if (mv.size()<config.maxMass()) - { + { npx=px+RND(size*2)-size; npy=py+RND(size*2)-size; npz=pz+RND(size*2)-size; if (npx<px) + { ndx=dx-DRand()*delta; + } else + { ndx=dx+DRand()*delta; + } if (npy<py) + { ndy=dy-DRand()*delta; + } else + { ndy=dy+DRand()*delta; + } if (npz<pz) + { ndz=dz-DRand()*delta; + } else + { ndz=dz+DRand()*delta; + } Mass m(name,nm,config.scale(), npx,npy,npz,ndx,ndy,ndz,r,g,b,0.5,shield); if (texture) + { m.setTexture(id); + } mv.push_back(m); - } + } + } } @@ -702,27 +746,27 @@ static void HandleCollision(Config::Collide collide, int shield; switch(collide) - { + { case Config::merge: if (m1.getMass()>=m2.getMass()) - { + { win=&m1; lose=&m2; del[idx2]=true; - } + } else - { + { win=&m2; lose=&m1; del[idx1]=true; - } + } merge_mass=win->getMass()+lose->getMass(); win->reset(merge_mass); if (sparks) - { + { double x1,y1,z1; double x2,y2,z2; @@ -730,25 +774,25 @@ static void HandleCollision(Config::Collide collide, m2.getPosition(x2,y2,z2); sparks->add(x1+(x2-x1)/2, - y1+(y2-y1)/2, - z1+(z2-z1)/2); - } + y1+(y2-y1)/2, + z1+(z2-z1)/2); + } break; case Config::delta_merge: if (m1.getMass()>=m2.getMass()) - { + { win=&m1; lose=&m2; del[idx2]=true; - } + } else - { + { win=&m2; lose=&m1; del[idx1]=true; - } + } win->getDelta(odx,ody,odz); lose->getDelta(dx,dy,dz); @@ -762,7 +806,7 @@ static void HandleCollision(Config::Collide collide, win->reset(merge_mass,odx,ody,odz); if (sparks) - { + { double x1,y1,z1; double x2,y2,z2; @@ -770,9 +814,9 @@ static void HandleCollision(Config::Collide collide, m2.getPosition(x2,y2,z2); sparks->add(x1+(x2-x1)/2, - y1+(y2-y1)/2, - z1+(z2-z1)/2); - } + y1+(y2-y1)/2, + z1+(z2-z1)/2); + } break; @@ -780,23 +824,23 @@ static void HandleCollision(Config::Collide collide, config.getShatter(no,delta,min,max,shield); if (m1.getMass()<min || m2.getMass()<min) - { + { HandleCollision(Config::merge,del,mv,m1,m2,idx1,idx2); return; - } + } if ((m1.getMass()<max && m2.getMass()>=max) || (m2.getMass()<max && m1.getMass()>=max)) - { + { HandleCollision(Config::merge,del,mv,m1,m2,idx1,idx2); return; - } + } Shatter(mv,m1,no,delta,shield); Shatter(mv,m2,no,delta,shield); if (sparks) - { + { double x1,y1,z1; double x2,y2,z2; @@ -804,9 +848,9 @@ static void HandleCollision(Config::Collide collide, m2.getPosition(x2,y2,z2); sparks->add(x1+(x2-x1)/2, - y1+(y2-y1)/2, - z1+(z2-z1)/2); - } + y1+(y2-y1)/2, + z1+(z2-z1)/2); + } del[idx1]=true; del[idx2]=true; @@ -818,7 +862,7 @@ static void HandleCollision(Config::Collide collide, default: break; - } + } } @@ -832,24 +876,38 @@ static void Update(void) new_mass=mass; for(f=0;f<mass.size();f++) + { del_mass.push_back(false); + } for(f=0;f<mass.size();f++) + { for(r=0;r<mass.size();r++) + { if (f!=r && !del_mass[f] && !del_mass[r]) + { if (new_mass[f].calcAttraction(mass[r],config.gravConst())) + { HandleCollision (config.collide(), del_mass,new_mass,new_mass[f],mass[r],f,r); + } + } + } + } mass.clear(); for(f=0;f<new_mass.size();f++) + { if (f>mass.size() || !del_mass[f]) + { mass.push_back(new_mass[f]); + } + } for(f=0;f<mass.size();f++) - { + { GLfloat r,g,b; double x,y,z; double px,py,pz; @@ -861,6 +919,7 @@ static void Update(void) mass[f].getPreviousPosition(px,py,pz); if (particles && !mass[f].isMassless()) + { particles->add(static_cast<GLfloat>(x), static_cast<GLfloat>(y), static_cast<GLfloat>(z), @@ -868,70 +927,95 @@ static void Update(void) static_cast<GLfloat>(py), static_cast<GLfloat>(pz), r,g,b); - } + } + } mva=(control.mx-(width/2))/(100.0f*width/800.0); if (mva<-0.5 || mva>0.5) - { + { camera.ang-=mva; if (camera.ang<0.0) + { camera.ang+=360.0; + } else if (camera.ang>=360.0) + { camera.ang-=360.0; } + } if (control.pgup) + { camera.y+=10; + } if (control.pgdn) + { camera.y-=10; + } control.pgup=false; control.pgdn=false; if (control.lmb) - { + { if (camera.speed<20.0) + { camera.speed+=0.5; + } if (control.ctrl) + { camera.speed*=10; + } if (control.shift) - { + { camera.x+=(GLfloat)(sin(camera.ang*M_PI/180.0)*camera.speed); camera.z+=(GLfloat)(cos(camera.ang*M_PI/180.0)*camera.speed); - } + } else - { + { camera.x-=(GLfloat)(sin(camera.ang*M_PI/180.0)*camera.speed); camera.z-=(GLfloat)(cos(camera.ang*M_PI/180.0)*camera.speed); - } + } if (control.ctrl) + { camera.speed/=10; } + } else - { + { if (camera.speed>0.0) + { camera.speed-=0.5; + } if (camera.speed<0.0) + { camera.speed+=0.5; } + } frame++; if (sparks) + { sparks->update(); + } if (particles) + { particles->update(); + } if (!frame_skip || (frame%frame_skip)==0) + { glutPostWindowRedisplay(win); + } } |