summaryrefslogtreecommitdiff
path: root/glgrav.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'glgrav.cpp')
-rw-r--r--glgrav.cpp298
1 files changed, 191 insertions, 107 deletions
diff --git a/glgrav.cpp b/glgrav.cpp
index 8e7e6a7..95b00b4 100644
--- a/glgrav.cpp
+++ b/glgrav.cpp
@@ -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);
+ }
}