Ejemplo n.º 1
0
int lineintersectobject2(float *intersectpoint,float *normal,float *scale,float *startpoint,float *endpoint,int objectnum,int *particlelist)
  {
  int count;
  int particlelisttemp[2];
  float intersectpointtemp[3];
  float normaltemp[3];
  float scaletemp;

  if (fabs(startpoint[0]-object[objectnum].position[0])>10.0f)
    return(0);
  if (fabs(startpoint[1]-object[objectnum].position[1])>10.0f)
    return(0);

  *scale=1.0f;
  for (count=0;count<object[objectnum].numofcdlines;count++)
    {
    particlelisttemp[0]=object[objectnum].cdline[count][0];
    particlelisttemp[1]=object[objectnum].cdline[count][1];

    if (lineintersectline3(intersectpointtemp,normaltemp,&scaletemp,startpoint,endpoint,particle[object[objectnum].particle[particlelisttemp[0]]].position,particle[object[objectnum].particle[particlelisttemp[1]]].position))
      if (scaletemp<*scale)
        {
        *scale=scaletemp;
        particlelist[0]=particlelisttemp[0];
        particlelist[1]=particlelisttemp[1];
        copyvector(normal,normaltemp);
        copyvector(intersectpoint,intersectpointtemp);
        }
    }
  if (*scale<1.0f)
    return(1);

  return(0);
  }
Ejemplo n.º 2
0
void createanchor(float position[3])
  {
  //int count;
  float vec[3];

  memset(&object[numofobjects],0,sizeof(object[numofobjects]));

  object[numofobjects].type = OBJ_TYPE_ANCHOR;
  object[numofobjects].timetolive=10000;

  object[numofobjects].radius=1.0f;

  object[numofobjects].friction=0.8f;

  object[numofobjects].numofparticles=0;

  copyvector(vec,position);
  vec[0]+=0.00001f;
  createparticle(2,position,NULL,10000.0f,numofobjects,10000);
  object[numofobjects].particle[0]=numofparticles-1;
  copyvector(object[numofobjects].position,position);

  object[numofobjects].numofcdlines=0;

  object[numofobjects].soundnum[0]=-1;
  object[numofobjects].soundnum[1]=-1;
  object[numofobjects].soundnum[2]=-1;
  object[numofobjects].soundnum[3]=-1;

  numofobjects++;
  }
Ejemplo n.º 3
0
int pointintersectobject(float *intersectpoint,float *normal,float *scale,float *point,int objectnum,int objectnum2,int *particlelist)
  {
  int count;
  int particlelisttemp[2];
  float vec[3];
  float intersectpointtemp[3];
  float normaltemp[3];
  float scaletemp;
  float angle;

  *scale=0.0f;
  for (count=0;count<object[objectnum].numofcdlines;count++)
    {
    particlelisttemp[0]=object[objectnum].cdline[count][0];
    particlelisttemp[1]=object[objectnum].cdline[count][1];

    normaltemp[0]=particle[object[objectnum].particle[particlelisttemp[0]]].position[1]-particle[object[objectnum].particle[particlelisttemp[1]]].position[1];
    normaltemp[1]=particle[object[objectnum].particle[particlelisttemp[1]]].position[0]-particle[object[objectnum].particle[particlelisttemp[0]]].position[0];
    normaltemp[2]=0.0f;
    normalizevector(normaltemp,normaltemp);

    scaleaddvectors(vec,point,normaltemp,0.5f);
    if (object[objectnum].type==10)
      scaleaddvectors(vec,point,normaltemp,0.25f);
    if (object[objectnum].type==2 && object[objectnum].size[0]<=0.5f)
      scaleaddvectors(vec,point,normaltemp,0.25f);
    if (object[objectnum2].type==2 && object[objectnum2].size[0]<=0.5f)
      scaleaddvectors(vec,point,normaltemp,0.25f);

    if (lineintersectline2(intersectpointtemp,normaltemp,&scaletemp,vec,point,particle[object[objectnum].particle[particlelisttemp[0]]].position,particle[object[objectnum].particle[particlelisttemp[1]]].position))
      {
      subtractvectors(vec,intersectpointtemp,object[objectnum2].position);
      normalizevector(vec,vec);
      if (object[objectnum2].type==OBJ_TYPE_GISH)
        angle=0.707f;
      else
        angle=0.0f;

      if (object[objectnum].type==2 && object[objectnum].size[0]<=0.5f)
        angle=0.0f;

      if (dotproduct(vec,normaltemp)<angle)
      if (scaletemp>*scale)
        {
        *scale=scaletemp;
        particlelist[0]=particlelisttemp[0];
        particlelist[1]=particlelisttemp[1];
        copyvector(normal,normaltemp);
        copyvector(intersectpoint,intersectpointtemp);
        }
      }
    }

  if (*scale>0.0f)
    return(1);

  return(0);
  }
Ejemplo n.º 4
0
LVAL xssample(V)
{
  LVAL x, result, temp, elem;
  int n, N, replace, i, j;
  
  x = xlgaseq();
  n = getfixnum(xlgafixnum());
  N = seqlen(x);
  replace = (moreargs()) ? (xlgetarg() != NIL) : FALSE;
  xllastarg();

  if (! replace && n > N) n = N;

  xlstkcheck(4);
  xlprotect(x);
  xlsave(result);
  xlsave(elem);
  xlsave(temp);
  x = (listp(x)) ? coerce_to_tvec(x, s_true) : copyvector(x);
  result = NIL;
  if (N > 0 && n > 0) {
    for (i = 0; i < n; i++) {
      j = (replace) ? osrand(N) : i + osrand(N - i);
      elem = gettvecelement(x, j);
      result = cons(elem, result);
      if (! replace) {           /* swap elements i and j */
        temp = gettvecelement(x, i);
        settvecelement(x, i, elem);
        settvecelement(x, j, temp);
      }
    }
  }
  xlpopn(4);
  return(result);
}
Ejemplo n.º 5
0
void createhead(float position[3],float sizex,float sizey,float mass,float friction)
  {
  int count;
  float vec[3];
  float angle;

  memset(&object[numofobjects],0,sizeof(object[numofobjects]));

  object[numofobjects].type = OBJ_TYPE_HEAD;
  object[numofobjects].timetolive=10000;
  if (sizex>=sizey)
    object[numofobjects].radius=sizex*1.25f;
  else
    object[numofobjects].radius=sizey*1.25f;

  object[numofobjects].mass=mass;

  object[numofobjects].texturenum=animation[19].stand[0];

  object[numofobjects].friction=friction;

  object[numofobjects].numofparticles=8;
  for (count=0;count<8;count++)
    {
    angle=(float)count*pi/4.0f;
    vec[0]=position[0]+cos(angle)*sizex*0.5f;
    vec[1]=position[1]-sin(angle)*sizey*0.5f;
    vec[2]=0.0f;

    createparticle(3,vec,NULL,mass/8.0f,numofobjects,10000);
    object[numofobjects].particle[count]=numofparticles-1;
    }

  for (count=0;count<8;count++)
    {
    createbond(object[numofobjects].particle[((count+1)&7)],object[numofobjects].particle[count],1,numofobjects);
    createbond(object[numofobjects].particle[((count+2)&7)],object[numofobjects].particle[count],1,numofobjects);
    createbond(object[numofobjects].particle[((count+4)&7)],object[numofobjects].particle[count],1,numofobjects);
    }
  copyvector(object[numofobjects].position,position);

  object[numofobjects].numofcdlines=8;

  for (count=0;count<8;count++)
    {
    object[numofobjects].cdline[count][0]=count;
    object[numofobjects].cdline[count][1]=((count+1)&7);
    }

  object[numofobjects].soundnum[0]=-1;
  object[numofobjects].soundnum[1]=-1;
  object[numofobjects].soundnum[2]=-1;
  object[numofobjects].soundnum[3]=-1;

  numofobjects++;
  }
Ejemplo n.º 6
0
static void
shclip(float *Pnt, int side)
{
	float	P[4];

	if (side == 6) {
		ip1[nout] = WtoVx(Pnt);
		ip2[nout++] = WtoVy(Pnt);
	} else {
		copyvector(P, Pnt);
		if (first[side]) {
			first[side] = 0;
			copyvector(F[side], P);
		} else if (intersect(side, I, P)) {
			shclip(I, side + 1);
		}
		copyvector(S[side], P);
		if (visible(side)) 
			shclip(S[side], side + 1);
	}
}
Ejemplo n.º 7
0
void createamber(float position[3])
  {
  int count;
  float vec[3];
  float angle;

  memset(&object[numofobjects],0,sizeof(object[numofobjects]));

  object[numofobjects].type = OBJ_TYPE_AMBER;
  object[numofobjects].timetolive=10000;
  object[numofobjects].radius=1.0f;
  object[numofobjects].texturenum=369;

  object[numofobjects].friction=0.3f;

  object[numofobjects].numofparticles=8;
  for (count=0;count<8;count++)
    {
    angle=(float)count*pi/4.0f;
    vec[0]=position[0]+cos(angle)*0.35f;
    vec[1]=position[1]-sin(angle)*0.35f;
    vec[2]=0.0f;

    createparticle(3,vec,NULL,0.125f,numofobjects,10000);
    object[numofobjects].particle[count]=numofparticles-1;
    }

  for (count=0;count<8;count++)
    {
    createbond(object[numofobjects].particle[((count+1)&7)],object[numofobjects].particle[count],1,numofobjects);
    createbond(object[numofobjects].particle[((count+2)&7)],object[numofobjects].particle[count],1,numofobjects);
    createbond(object[numofobjects].particle[((count+4)&7)],object[numofobjects].particle[count],1,numofobjects);
    }
  copyvector(object[numofobjects].position,position);

  object[numofobjects].numofcdlines=8;

  for (count=0;count<8;count++)
    {
    object[numofobjects].cdline[count][0]=count;
    object[numofobjects].cdline[count][1]=((count+1)&7);
    }

  object[numofobjects].soundnum[0]=-1;
  object[numofobjects].soundnum[1]=-1;
  object[numofobjects].soundnum[2]=-1;
  object[numofobjects].soundnum[3]=-1;

  numofobjects++;
  }
Ejemplo n.º 8
0
void createareaswitch(float position[3],float sizex,float sizey)
  {
  memset(&object[numofobjects],0,sizeof(object[numofobjects]));

  object[numofobjects].type = OBJ_TYPE_AREASWITCH;
  object[numofobjects].timetolive=10000;
  copyvector(object[numofobjects].position,position);
  object[numofobjects].size[0]=sizex;
  object[numofobjects].size[1]=sizey;

  object[numofobjects].soundnum[0]=-1;
  object[numofobjects].soundnum[1]=-1;
  object[numofobjects].soundnum[2]=-1;
  object[numofobjects].soundnum[3]=-1;

  numofobjects++;
  }
Ejemplo n.º 9
0
void bondsimulation(void)
{
    int count,count2;
    int part1,part2;
    float vec[3];
    float bondnormal[3];
    float veclength;
    float force[2];

    for (count=0; count<32; count++)
    {
        for (count2=0; count2<numofparticles; count2++)
            copyvector(particle[count2].prevvelocity,particle[count2].velocity);

        for (count2=0; count2<numofbonds; count2++)
            if ((count&bond[count2].cycles)==0)
            {
                part1=bond[count2].part1;
                part2=bond[count2].part2;

                subtractvectors(bondnormal,particle[part2].position,particle[part1].position);
                veclength=vectorlength(bondnormal)-bond[count2].length;
                normalizevector(bondnormal,bondnormal);

                zerovector(vec);
                scaleaddvectors(vec,vec,particle[part2].prevvelocity,1.0f);
                scaleaddvectors(vec,vec,particle[part1].prevvelocity,-1.0f);

                veclength+=dotproduct(vec,bondnormal);
                if (bondtype[bond[count2].type].compression==0.0f)
                    if (veclength<0.0f)
                        veclength=0.0f;

                veclength*=bond[count2].elasticity;

                veclength/=(particle[part1].mass+particle[part2].mass);

                force[0]=veclength*particle[part2].mass;
                force[1]=veclength*particle[part1].mass;

                scaleaddvectors(particle[part1].velocity,particle[part1].velocity,bondnormal,force[0]);
                scaleaddvectors(particle[part2].velocity,particle[part2].velocity,bondnormal,-force[1]);
            }
    }
}
Ejemplo n.º 10
0
void creategenerator(float position[3],float mass)
  {
  memset(&object[numofobjects],0,sizeof(object[numofobjects]));

  object[numofobjects].type = OBJ_TYPE_GENERATOR;
  object[numofobjects].timetolive=10000;
  object[numofobjects].mass=mass;
  copyvector(object[numofobjects].position,position);

  object[numofobjects].radius=2.0f;

  object[numofobjects].soundnum[0]=-1;
  object[numofobjects].soundnum[1]=-1;
  object[numofobjects].soundnum[2]=-1;
  object[numofobjects].soundnum[3]=-1;

  numofobjects++;
  }
Ejemplo n.º 11
0
void rotateorientation(float orientation[3][3],float *rotationvector,float rotationangle)
  {
  int count;
  float pointtemp[3],cosnormal[3],sinnormal[3];
  float axisnormal[3];
  float vectorlengthvalue,dotproductvalue;

  normalizevector(axisnormal,rotationvector);

  if (fabs(rotationangle)<.003f)
    return;

  for (count=0;count<3;count++)
    {
    copyvector(pointtemp,orientation[count]);

    crossproduct(sinnormal,axisnormal,pointtemp);

    normalizevector(sinnormal,sinnormal);

    crossproduct(cosnormal,sinnormal,axisnormal);

    normalizevector(cosnormal,cosnormal);

    dotproductvalue=dotproduct(axisnormal,pointtemp);
    pointtemp[0]-=axisnormal[0]*dotproductvalue;
    pointtemp[1]-=axisnormal[1]*dotproductvalue;
    pointtemp[2]-=axisnormal[2]*dotproductvalue;
    vectorlengthvalue=vectorlength(pointtemp);

    orientation[count][0]=axisnormal[0]*dotproductvalue+cosnormal[0]*cos(rotationangle)*vectorlengthvalue+sinnormal[0]*sin(rotationangle)*vectorlengthvalue;
    orientation[count][1]=axisnormal[1]*dotproductvalue+cosnormal[1]*cos(rotationangle)*vectorlengthvalue+sinnormal[1]*sin(rotationangle)*vectorlengthvalue;
    orientation[count][2]=axisnormal[2]*dotproductvalue+cosnormal[2]*cos(rotationangle)*vectorlengthvalue+sinnormal[2]*sin(rotationangle)*vectorlengthvalue;

    normalizevector(orientation[count],orientation[count]);
    }
  }
Ejemplo n.º 12
0
void editlevelrope(void)
  {
  int count,count2;
  int simtimer;
  int simcount;
  float vec[3],vec2[3];

  ropeedit.numofpoints=0;
  for (count=0;count<level.numofobjects;count++)
    {
    if (level.object[count].type>=2 && level.object[count].type<=5)
      {
      for (count2=0;count2<4;count2++)
        {
        if (count2==0 || count2==3)
          vec[0]=level.object[count].position[0]-level.object[count].size[0]*0.5f;
        else
          vec[0]=level.object[count].position[0]+level.object[count].size[0]*0.5f;
        if (count2<2)
          vec[1]=level.object[count].position[1]+level.object[count].size[1]*0.5f;
        else
          vec[1]=level.object[count].position[1]-level.object[count].size[1]*0.5f;
        vec[2]=0.0f;
        copyvector(ropeedit.point[ropeedit.numofpoints].position,vec);
        ropeedit.point[ropeedit.numofpoints].objectnum=count;
        ropeedit.point[ropeedit.numofpoints].particlenum=count2;
        ropeedit.numofpoints++;

        copyvector(level.object[count].vertex[count2],vec);
        }
      }
    if (level.object[count].type>=6 && level.object[count].type<=7)
      {
      for (count2=0;count2<4;count2++)
        {
        vec[0]=level.object[count].position[0];
        vec[1]=level.object[count].position[1];
        if (count2==0)
          vec[0]=level.object[count].position[0]+level.object[count].size[0]*0.5f;
        if (count2==1)
          vec[1]=level.object[count].position[1]-level.object[count].size[1]*0.5f;
        if (count2==2)
          vec[0]=level.object[count].position[0]-level.object[count].size[0]*0.5f;
        if (count2==3)
          vec[1]=level.object[count].position[1]+level.object[count].size[1]*0.5f;
        vec[2]=0.0f;
        copyvector(ropeedit.point[ropeedit.numofpoints].position,vec);
        ropeedit.point[ropeedit.numofpoints].objectnum=count;
        ropeedit.point[ropeedit.numofpoints].particlenum=count2*4;
        ropeedit.numofpoints++;

        copyvector(level.object[count].vertex[count2],vec);
        }

      count2=4;
      vec[0]=level.object[count].position[0];
      vec[1]=level.object[count].position[1];
      vec[2]=0.0f;

      copyvector(ropeedit.point[ropeedit.numofpoints].position,vec);
      ropeedit.point[ropeedit.numofpoints].objectnum=count;
      ropeedit.point[ropeedit.numofpoints].particlenum=16;
      ropeedit.numofpoints++;

      copyvector(level.object[count].vertex[count2],vec);
      }
    if (level.object[count].type==8)
      {
      vec[0]=level.object[count].position[0];
      vec[1]=level.object[count].position[1];
      vec[2]=0.0f;
      copyvector(ropeedit.point[ropeedit.numofpoints].position,vec);
      ropeedit.point[ropeedit.numofpoints].objectnum=count;
      ropeedit.point[ropeedit.numofpoints].particlenum=0;
      ropeedit.numofpoints++;
      copyvector(level.object[count].vertex[0],vec);
      }
    }
  ropeedit.pointnum=-1;

  simtimer=SDL_GetTicks();

  resetmenuitems();

  while (!menuitem[0].active && !windowinfo.shutdown)
    {
    glClearColor(0.0f,0.0f,0.0f,0.0f);
    glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE);
    glStencilMask(~0);
    glClearStencil(0);
    glClear(GL_COLOR_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
    glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_FALSE);
    glStencilMask(0);

    setuptextdisplay();
    glColor3fv(level.ambient[3]);
    if (level.background[0]!=0)
      displaybackground(660);

    numofmenuitems=0;
    createmenuitem("",0,0,16,1.0f,1.0f,1.0f,1.0f);
    setmenuitem(MO_HOTKEY,SCAN_ESC);

    checksystemmessages();
    checkkeyboard();
    checkmouse();
    checkmenuitems();

    //setupperspectiveviewport(0,0,640,480,1.0f,100.0f);
    setuporthoviewport(0,0,640,480,10.0f,7.5f,20.0f);
    setupviewpoint(view.position,view.orientation);

    setupframelighting();

    rendershadows();

    glEnable(GL_ALPHA_TEST);
    glAlphaFunc(GL_GREATER,0.0f);

    renderlevelback();
    renderlevel();
    renderlevelobjects();
    renderlevelfore();

    glDisable(GL_ALPHA_TEST);

    renderropeedit();

    setuptextdisplay();

    drawtext(TXT_NUMOFROPES":/i",0,368,16,1.0f,1.0f,1.0f,1.0f,level.numofropes);
    drawtext(TXT_TEXTURENUM":/i",0,384,16,1.0f,1.0f,1.0f,1.0f,ropeedit.texturenum);

    drawmenuitems();

    drawmousecursor(768+font.cursornum,mouse.x,mouse.y,16,1.0f,1.0f,1.0f,1.0f);

    SDL_GL_SwapBuffers();

    vec[0]=view.position[0]+(float)(mouse.x-320)/32.0f;
    vec[1]=view.position[1]+(float)(240-mouse.y)/32.0f;
    vec[2]=0.0f;

    ropeedit.pointhighlight=-1;
    for (count=0;count<ropeedit.numofpoints;count++)
      {
      subtractvectors(vec2,ropeedit.point[count].position,vec);
      if (vectorlength(vec2)<0.25f)
        ropeedit.pointhighlight=count;
      }

    if (ropeedit.pointnum==-1)
      {
      if (mouse.lmb && !prevmouse.lmb)
      if (ropeedit.pointhighlight!=-1)
        ropeedit.pointnum=ropeedit.pointhighlight;
      }
    else
      {
      if (mouse.lmb && !prevmouse.lmb)
        {
        if (ropeedit.pointhighlight!=-1)
        if (ropeedit.point[ropeedit.pointnum].objectnum!=ropeedit.point[ropeedit.pointhighlight].objectnum)
          {
          level.rope[level.numofropes].type=1;
          if (keyboard[SCAN_2])
            level.rope[level.numofropes].type=2;
          if (keyboard[SCAN_3])
            level.rope[level.numofropes].type=3;
          if (keyboard[SCAN_4])
            level.rope[level.numofropes].type=4;
          if (keyboard[SCAN_5])
            level.rope[level.numofropes].type=5;
          if (keyboard[SCAN_6])
            level.rope[level.numofropes].type=6;
          if (keyboard[SCAN_7])
            level.rope[level.numofropes].type=7;
          if (keyboard[SCAN_8])
            level.rope[level.numofropes].type=8;
          if (keyboard[SCAN_9])
            level.rope[level.numofropes].type=9;
          if (keyboard[SCAN_0])
            level.rope[level.numofropes].type=10;
          level.rope[level.numofropes].obj1=ropeedit.point[ropeedit.pointnum].objectnum;
          level.rope[level.numofropes].obj1part=ropeedit.point[ropeedit.pointnum].particlenum;
  
          level.rope[level.numofropes].obj2=ropeedit.point[ropeedit.pointhighlight].objectnum;
          level.rope[level.numofropes].obj2part=ropeedit.point[ropeedit.pointhighlight].particlenum;
          level.rope[level.numofropes].texturenum=ropeedit.texturenum;
  
          level.numofropes++;
          }
        ropeedit.pointnum=-1;
        }
      }

    if (mouse.rmb && !prevmouse.rmb)
      {
      for (count=0;count<level.numofropes;count++)
        {
        if (ropeedit.point[ropeedit.pointhighlight].objectnum==level.rope[count].obj1 && ropeedit.point[ropeedit.pointhighlight].particlenum==level.rope[count].obj1part)
          deletelevelrope(count);
        }
      for (count=0;count<level.numofropes;count++)
        {
        if (ropeedit.point[ropeedit.pointhighlight].objectnum==level.rope[count].obj2 && ropeedit.point[ropeedit.pointhighlight].particlenum==level.rope[count].obj2part)
          deletelevelrope(count);
        }
      /*
      for (count=0;count<level.numofropes;count++)
        {
        if (pointintersectline(vec,level.object[level.rope[count].obj1].vertex[level.rope[count].obj1part],level.object[level.rope[count].obj2].vertex[level.rope[count].obj2part],0.25f))
          deletelevelrope(count);
        }
      */
      }

    simcount=0;
    while (SDL_GetTicks()-simtimer>20 && simcount<5)
      {
      simcount++;
      count=SDL_GetTicks()-simtimer-20;
      simtimer=SDL_GetTicks()-count;

      if (!menuinputkeyboard)
        {
        if (keyboard[SCAN_W])
          view.position[1]+=0.2f;
        if (keyboard[SCAN_S])
          view.position[1]-=0.2f;
        if (keyboard[SCAN_A])
          view.position[0]-=0.2f;
        if (keyboard[SCAN_D])
          view.position[0]+=0.2f;
        }
      }

    if (keyboard[SCAN_Q] && !prevkeyboard[SCAN_Q])
    if (ropeedit.texturenum<3)
      ropeedit.texturenum++;

    if (keyboard[SCAN_Z] && !prevkeyboard[SCAN_Z])
    if (ropeedit.texturenum>0)
      ropeedit.texturenum--;
    }

  resetmenuitems();
  }
Ejemplo n.º 13
0
static void createtrisfromball(triman* tman, vectorf *spherev, GLint *spherei, int ind_num, ball *b)
{
   int pos;
   float explosion;
   float momentum;
   float scale;
   register int i;
   vectorf avgdir,dvect,mvect;

   tman->scalefac = b->radius;
   copyvector(&tman->color,&b->color);
   explosion = 1.0f + tman->explosion * 2.0 * rnd();
   momentum = tman->momentum;

   tman->num_tri = ind_num/3;
   
   /* reserveer geheugen voor de poly's in een bal */
   
   tman->tris = (tri *)malloc(tman->num_tri * sizeof(tri));
   tman->vertices = (vectorf *)malloc(ind_num * sizeof(vectorf));
   tman->normals = (vectorf *)malloc(ind_num/3 * sizeof(vectorf));
   
   for (i=0; i<(tman->num_tri); i++) {
      tman->tris[i].far = FALSE;
      tman->tris[i].gone = 0;
      pos = i * 3;
      /* kopieer elke poly apart naar een tri structure */
      copyvector(&tman->vertices[pos+0],&spherev[spherei[pos+0]]);
      copyvector(&tman->vertices[pos+1],&spherev[spherei[pos+1]]);
      copyvector(&tman->vertices[pos+2],&spherev[spherei[pos+2]]);
      /* Calculate average direction of shrapnel */
      addvectors(&avgdir,&tman->vertices[pos+0],&tman->vertices[pos+1]);
      addvectors(&avgdir,&avgdir,&tman->vertices[pos+2]);
      scalevector(&avgdir,&avgdir,0.33333);
      
      /* should normalize first, NYI */
      copyvector(&tman->normals[i],&avgdir);
     
      /* copy de lokatie */
      addvectors(&tman->tris[i].loc,&b->loc,&avgdir);
      /* en translate alle triangles terug naar hun eigen oorsprong */
      tman->vertices[pos+0].x -= avgdir.x;
      tman->vertices[pos+0].y -= avgdir.y;
      tman->vertices[pos+0].z -= avgdir.z;
      tman->vertices[pos+1].x -= avgdir.x;
      tman->vertices[pos+1].y -= avgdir.y;
      tman->vertices[pos+1].z -= avgdir.z;
      tman->vertices[pos+2].x -= avgdir.x;
      tman->vertices[pos+2].y -= avgdir.y;
      tman->vertices[pos+2].z -= avgdir.z;
      /* alwaar opschaling plaatsvindt */
      scale = b->radius * 2;
      scalevector(&tman->vertices[pos+0],&tman->vertices[pos+0],scale);
      scalevector(&tman->vertices[pos+1],&tman->vertices[pos+1],scale);
      scalevector(&tman->vertices[pos+2],&tman->vertices[pos+2],scale);
            
      tman->vertices[pos+0].x += avgdir.x;
      tman->vertices[pos+0].y += avgdir.y;
      tman->vertices[pos+0].z += avgdir.z;
      tman->vertices[pos+1].x += avgdir.x;
      tman->vertices[pos+1].y += avgdir.y;
      tman->vertices[pos+1].z += avgdir.z;
      tman->vertices[pos+2].x += avgdir.x;
      tman->vertices[pos+2].y += avgdir.y;
      tman->vertices[pos+2].z += avgdir.z;

      /* bereken nieuwe richting */
      scalevector(&tman->tris[i].dir,&avgdir,explosion);
      dvect.x = (0.1f - 0.2f*rnd());
      dvect.y = (0.15f - 0.3f*rnd());
      dvect.z = (0.1f - 0.2f*rnd());
      addvectors(&tman->tris[i].dir,&tman->tris[i].dir,&dvect);

      /* add ball's momentum to each piece of the exploded ball */
      mvect.x = b->dir.x * momentum;
      mvect.y = 0;
      mvect.z = b->dir.z * momentum;
      addvectors(&tman->tris[i].dir,&tman->tris[i].dir,&mvect);
   }
}
Ejemplo n.º 14
0
void objectsound(int objectnum)
  {
  int x,y;
  float vec[3];
  float scale;
  float pitch;

  x=object[objectnum].position[0];
  y=object[objectnum].position[1];
  if (block[level.foregrid[y][x]].density!=0.0f)
    {
    x=object[objectnum].prevposition[0];
    y=object[objectnum].prevposition[1];
    if (block[level.foregrid[y][x]].density==0.0f)
      {
      pitch=4.0f/object[objectnum].mass;

      if (pitch<0.5f)
        pitch=0.5f;

      if (pitch>1.0f)
        pitch=1.0f;

      scale=vectorlength(object[objectnum].velocity)*2.5f;

      x=object[objectnum].position[0];
      y=object[objectnum].position[1];

      if (block[level.foregrid[y][x]].foredamage==0)
        playsound(17,object[objectnum].position,NULL,scale,0,pitch,objectnum,3);
      else
        playsound(18,object[objectnum].position,NULL,scale,0,pitch,objectnum,3);
      }
    }
  if (object[objectnum].type==2 || object[objectnum].type==3)
    {
    subtractvectors(vec,object[objectnum].velocity,object[objectnum].prevvelocity);
    scale=vectorlength(vec);
    if (scale>0.025f)
      {
      pitch=1.0f/(object[objectnum].mass*0.2f);

      scale*=(1.0f/pitch);

      if (pitch<0.2f)
        pitch=0.2f;

      if (pitch>1.0f)
        pitch=1.0f;

      playsound(1,object[objectnum].position,NULL,scale*5.0f,0,pitch,objectnum,0);
      }
    }
  /*
  if (object[objectnum].type==2 || object[objectnum].type==3)
    {
    //scale=object[objectnum].frictionapplied;

    if (object[objectnum].numoforientations!=0)
      {
      vec[0]=vectorlength(object[objectnum].velocity);
      vec[1]=dotproduct(object[objectnum].velocity,object[objectnum].orientation[1]);
      scale=sqrt(vec[0]*vec[0]-vec[1]*vec[1]);
      }
    else
      scale=0.0f;

    if (scale>0.01f)
      {
      pitch=1.0f/(object[objectnum].mass*0.2f);
      scale*=(1.0f/pitch);

      if (pitch<0.2f)
        pitch=0.2f;

      if (pitch>1.0f)
        pitch=1.0f;

      if (object[objectnum].soundnum[1]==-1)
        playsound(6,object[objectnum].position,NULL,scale*5.0f,1,pitch,objectnum,1);
      }
    if (object[objectnum].soundnum[1]!=-1)
      {
      if (scale<0.005f)
        deletesound(object[objectnum].soundnum[1]);
      else
        {
        pitch=1.0f/(object[objectnum].mass*0.2f);
        scale*=(1.0f/pitch);

        alSourcef(sound[object[objectnum].soundnum[1]].alname,AL_GAIN,scale*5.0f);
        }
      }
    }
  */
  if (object[objectnum].type==4)
    {
    subtractvectors(vec,object[objectnum].velocity,object[objectnum].prevvelocity);
    scale=vectorlength(vec);
    if (scale>0.025f)
      {
      pitch=1.0f/(object[objectnum].mass*0.2f);

      scale*=(2.0f/pitch);

      if (pitch<0.2f)
        pitch=0.2f;

      if (pitch>1.0f)
        pitch=1.0f;

      playsound(2,object[objectnum].position,NULL,scale*5.0f,0,pitch,objectnum,0);
      }
    }
  if (object[objectnum].type==1)
    {
    subtractvectors(vec,object[objectnum].velocity,object[objectnum].prevvelocity);
    scale=vectorlength(vec);
    if (scale>0.025f)
      {
      if ((object[objectnum].button&8)==0)
        playsound(5,object[objectnum].position,NULL,scale*7.0f,0,1.0f,objectnum,0);
      else
        playsound(2,object[objectnum].position,NULL,scale*7.0f,0,1.0f,objectnum,0);
      }
    }

  copyvector(object[objectnum].prevvelocity,object[objectnum].velocity);
  object[objectnum].frictionapplied=0.0f;
  }
Ejemplo n.º 15
0
void renderlevelobjects(void)
  {
  int count,count2;
  int objectnum;
  float vec[3];
  float angle;

  for (count=0;count<level.numofobjects;count++)
    {
    if (level.object[count].type==1)
      {
      glDisable(GL_TEXTURE_2D);

      for (count2=0;count2<16;count2++)
        {
        glBegin(GL_TRIANGLES);

        glColor4f(0.0f,0.0f,0.0f,1.0f);

        angle=(float)count2*pi/8.0f;
        vec[0]=level.object[count].position[0]+cos(angle)*0.9f;
        vec[1]=level.object[count].position[1]-sin(angle)*0.9f;
        vec[2]=0.0f;
        glVertex3fv(vec);

        angle=(float)(count2+1)*pi/8.0f;
        vec[0]=level.object[count].position[0]+cos(angle)*0.9f;
        vec[1]=level.object[count].position[1]-sin(angle)*0.9f;
        vec[2]=0.0f;
        glVertex3fv(vec);

        glVertex3fv(level.object[count].position);

        glEnd();
        }

      glEnable(GL_TEXTURE_2D);
      }
    if (level.object[count].type>=2 && level.object[count].type<=5)
      {
      glBindTexture(GL_TEXTURE_2D,texture[level.object[count].texturenum+256].glname);
  
      glBegin(GL_QUADS);

      glColor4f(1.0f,1.0f,1.0f,1.0f);

      glTexCoord2f(0.0f,0.0f);
      glVertex3f(level.object[count].position[0]-level.object[count].size[0]*0.5f,level.object[count].position[1]+level.object[count].size[1]*0.5f,0.0f);

      glTexCoord2f(1.0f,0.0f);
      glVertex3f(level.object[count].position[0]+level.object[count].size[0]*0.5f,level.object[count].position[1]+level.object[count].size[1]*0.5f,0.0f);

      glTexCoord2f(1.0f,1.0f);
      glVertex3f(level.object[count].position[0]+level.object[count].size[0]*0.5f,level.object[count].position[1]-level.object[count].size[1]*0.5f,0.0f);

      glTexCoord2f(0.0f,1.0f);
      glVertex3f(level.object[count].position[0]-level.object[count].size[0]*0.5f,level.object[count].position[1]-level.object[count].size[1]*0.5f,0.0f);

      glEnd();
      }
    if (level.object[count].type==6 || level.object[count].type==7 || level.object[count].type==17)
      {
      glBindTexture(GL_TEXTURE_2D,texture[level.object[count].texturenum+256].glname);

      for (count2=0;count2<16;count2++)
        {
        glBegin(GL_TRIANGLES);

        glColor4f(1.0f,1.0f,1.0f,1.0f);

        angle=(float)count2*pi/8.0f;
        vec[0]=level.object[count].position[0]+cos(angle)*level.object[count].size[0]*0.5f;
        vec[1]=level.object[count].position[1]-sin(angle)*level.object[count].size[1]*0.5f;
        vec[2]=0.0f;
        glTexCoord2f(0.5f+cos(angle)*0.5f,0.5f+sin(angle)*0.5f);
        glVertex3fv(vec);

        angle=(float)(count2+1)*pi/8.0f;
        vec[0]=level.object[count].position[0]+cos(angle)*level.object[count].size[0]*0.5f;
        vec[1]=level.object[count].position[1]-sin(angle)*level.object[count].size[1]*0.5f;
        vec[2]=0.0f;
        glTexCoord2f(0.5f+cos(angle)*0.5f,0.5f+sin(angle)*0.5f);
        glVertex3fv(vec);

        glTexCoord2f(0.5f,0.5f);
        glVertex3fv(level.object[count].position);

        glEnd();
        }
      }
    if (level.object[count].type==8)
      {
      glBindTexture(GL_TEXTURE_2D,texture[level.object[count].texturenum+256].glname);
  
      glBegin(GL_QUADS);

      glColor4f(1.0f,1.0f,1.0f,1.0f);

      glTexCoord2f(0.0f,0.0f);
      glVertex3f(level.object[count].position[0]-0.25f,level.object[count].position[1]+0.25f,0.0f);

      glTexCoord2f(1.0f,0.0f);
      glVertex3f(level.object[count].position[0]+0.25f,level.object[count].position[1]+0.25f,0.0f);

      glTexCoord2f(1.0f,1.0f);
      glVertex3f(level.object[count].position[0]+0.25f,level.object[count].position[1]-0.25f,0.0f);

      glTexCoord2f(0.0f,1.0f);
      glVertex3f(level.object[count].position[0]-0.25f,level.object[count].position[1]-0.25f,0.0f);

      glEnd();
      }
    if (level.object[count].type==9 || level.object[count].type==10)
      {
      glBindTexture(GL_TEXTURE_2D,texture[level.object[count].texturenum+256].glname);
  
      glBegin(GL_QUADS);

      glColor4f(1.0f,1.0f,1.0f,1.0f);

      glTexCoord2f(0.0f,0.0f);
      glVertex3f(level.object[count].position[0]-0.5f,level.object[count].position[1]+0.5f,0.0f);

      glTexCoord2f(1.0f,0.0f);
      glVertex3f(level.object[count].position[0]+0.5f,level.object[count].position[1]+0.5f,0.0f);

      glTexCoord2f(1.0f,1.0f);
      glVertex3f(level.object[count].position[0]+0.5f,level.object[count].position[1],0.0f);

      glTexCoord2f(0.0f,1.0f);
      glVertex3f(level.object[count].position[0]-0.5f,level.object[count].position[1],0.0f);

      glEnd();
      }
    if (level.object[count].type>=20 && level.object[count].type<40)
      {
      glBindTexture(GL_TEXTURE_2D,texture[animation[level.object[count].type-20].stand[0]].glname);
  
      glBegin(GL_QUADS);

      glColor4f(1.0f,1.0f,1.0f,1.0f);

      glTexCoord2f(0.0f,0.0f);
      glVertex3f(level.object[count].position[0]-level.object[count].size[0]*0.5f,level.object[count].position[1]+level.object[count].size[1]*0.5f,0.0f);

      glTexCoord2f(1.0f,0.0f);
      glVertex3f(level.object[count].position[0]+level.object[count].size[0]*0.5f,level.object[count].position[1]+level.object[count].size[1]*0.5f,0.0f);

      glTexCoord2f(1.0f,1.0f);
      glVertex3f(level.object[count].position[0]+level.object[count].size[0]*0.5f,level.object[count].position[1]-level.object[count].size[1]*0.5f,0.0f);

      glTexCoord2f(0.0f,1.0f);
      glVertex3f(level.object[count].position[0]-level.object[count].size[0]*0.5f,level.object[count].position[1]-level.object[count].size[1]*0.5f,0.0f);

      glEnd();
      }
    if (level.object[count].type==11)
      {
      glBindTexture(GL_TEXTURE_2D,texture[level.object[count].texturenum+256].glname);
  
      glBegin(GL_QUADS);

      glColor4f(1.0f,1.0f,1.0f,1.0f);

      glTexCoord2f(0.0f,0.0f);
      glVertex3f(level.object[count].position[0]-0.125f,level.object[count].position[1]+0.5f,0.0f);
                                                   
      glTexCoord2f(1.0f,0.0f);
      glVertex3f(level.object[count].position[0]+0.125f,level.object[count].position[1]+0.5f,0.0f);

      glTexCoord2f(1.0f,1.0f);
      glVertex3f(level.object[count].position[0]+0.25f,level.object[count].position[1]-0.5f,0.0f);

      glTexCoord2f(0.0f,1.0f);
      glVertex3f(level.object[count].position[0]-0.25f,level.object[count].position[1]-0.5f,0.0f);

      glEnd();
      }
    if (level.object[count].type==12)
      {
      glBindTexture(GL_TEXTURE_2D,texture[level.object[count].texturenum+256].glname);
  
      glBegin(GL_QUADS);

      glColor4f(1.0f,1.0f,1.0f,1.0f);

      glTexCoord2f(0.0f,0.0f);
      glVertex3f(level.object[count].position[0]-0.5f,level.object[count].position[1]+0.25f,0.0f);
                                                   
      glTexCoord2f(1.0f,0.0f);
      glVertex3f(level.object[count].position[0]+0.5f,level.object[count].position[1]+0.125f,0.0f);

      glTexCoord2f(1.0f,1.0f);
      glVertex3f(level.object[count].position[0]+0.5f,level.object[count].position[1]-0.125f,0.0f);

      glTexCoord2f(0.0f,1.0f);
      glVertex3f(level.object[count].position[0]-0.5f,level.object[count].position[1]-0.25f,0.0f);

      glEnd();
      }
    if (level.object[count].type==13)
      {
      glBindTexture(GL_TEXTURE_2D,texture[level.object[count].texturenum+256].glname);
  
      glBegin(GL_QUADS);

      glColor4f(1.0f,1.0f,1.0f,1.0f);

      glTexCoord2f(0.0f,0.0f);
      glVertex3f(level.object[count].position[0]-0.25f,level.object[count].position[1]+0.5f,0.0f);
                                                   
      glTexCoord2f(1.0f,0.0f);
      glVertex3f(level.object[count].position[0]+0.25f,level.object[count].position[1]+0.5f,0.0f);

      glTexCoord2f(1.0f,1.0f);
      glVertex3f(level.object[count].position[0]+0.125f,level.object[count].position[1]-0.5f,0.0f);

      glTexCoord2f(0.0f,1.0f);
      glVertex3f(level.object[count].position[0]-0.125f,level.object[count].position[1]-0.5f,0.0f);

      glEnd();
      }
    if (level.object[count].type==14)
      {
      glBindTexture(GL_TEXTURE_2D,texture[level.object[count].texturenum+256].glname);
  
      glBegin(GL_QUADS);

      glColor4f(1.0f,1.0f,1.0f,1.0f);

      glTexCoord2f(0.0f,0.0f);
      glVertex3f(level.object[count].position[0]-0.5f,level.object[count].position[1]+0.125f,0.0f);
                                                   
      glTexCoord2f(1.0f,0.0f);
      glVertex3f(level.object[count].position[0]+0.5f,level.object[count].position[1]+0.25f,0.0f);

      glTexCoord2f(1.0f,1.0f);
      glVertex3f(level.object[count].position[0]+0.5f,level.object[count].position[1]-0.25f,0.0f);

      glTexCoord2f(0.0f,1.0f);
      glVertex3f(level.object[count].position[0]-0.5f,level.object[count].position[1]-0.125f,0.0f);

      glEnd();
      }
    if (level.object[count].type==15 || level.object[count].type==16 || level.object[count].type==18)
      {
      glDisable(GL_TEXTURE_2D);
  
      glBegin(GL_LINES);

      glColor4f(1.0f,1.0f,1.0f,1.0f);

      glVertex3f(level.object[count].position[0]-level.object[count].size[0]*0.5f,level.object[count].position[1]+level.object[count].size[1]*0.5f,0.0f);
      glVertex3f(level.object[count].position[0]+level.object[count].size[0]*0.5f,level.object[count].position[1]+level.object[count].size[1]*0.5f,0.0f);

      glVertex3f(level.object[count].position[0]+level.object[count].size[0]*0.5f,level.object[count].position[1]+level.object[count].size[1]*0.5f,0.0f);
      glVertex3f(level.object[count].position[0]+level.object[count].size[0]*0.5f,level.object[count].position[1]-level.object[count].size[1]*0.5f,0.0f);

      glVertex3f(level.object[count].position[0]+level.object[count].size[0]*0.5f,level.object[count].position[1]-level.object[count].size[1]*0.5f,0.0f);
      glVertex3f(level.object[count].position[0]-level.object[count].size[0]*0.5f,level.object[count].position[1]-level.object[count].size[1]*0.5f,0.0f);

      glVertex3f(level.object[count].position[0]-level.object[count].size[0]*0.5f,level.object[count].position[1]-level.object[count].size[1]*0.5f,0.0f);
      glVertex3f(level.object[count].position[0]-level.object[count].size[0]*0.5f,level.object[count].position[1]+level.object[count].size[1]*0.5f,0.0f);

      glEnd();

      glEnable(GL_TEXTURE_2D);
      }
    glDisable(GL_TEXTURE_2D);
    glBegin(GL_LINES);

    glColor4f(0.5f,0.5f,0.5f,1.0f);
    if (count==editor.objectnum)
      glColor4f(0.0f,1.0f,0.0f,1.0f);
    else if (editor.objectnum!=-1)
      {
      if (count==level.object[editor.objectnum].link)
        glColor4f(1.0f,0.0f,0.0f,1.0f);
      }

    vec[0]=level.object[count].position[0]-0.5f;
    vec[1]=level.object[count].position[1]+0.5f;
    vec[2]=0.0f;
    glVertex3fv(vec);

    vec[0]=level.object[count].position[0]+0.5f;
    vec[1]=level.object[count].position[1]-0.5f;
    vec[2]=0.0f;
    glVertex3fv(vec);

    vec[0]=level.object[count].position[0]+0.5f;
    vec[1]=level.object[count].position[1]+0.5f;
    vec[2]=0.0f;
    glVertex3fv(vec);

    vec[0]=level.object[count].position[0]-0.5f;
    vec[1]=level.object[count].position[1]-0.5f;
    vec[2]=0.0f;
    glVertex3fv(vec);

    glEnd();
    glEnable(GL_TEXTURE_2D);
    }

  glDisable(GL_TEXTURE_2D);

  glBegin(GL_LINES);

  for (count=0;count<level.numofropes;count++)
  if (level.rope[count].obj1!=-1 && level.rope[count].obj2!=-1)
    {
    if (level.rope[count].type==1)
      glColor4f(0.75f,0.75f,0.0f,1.0f);
    if (level.rope[count].type==2)
      glColor4f(1.0f,1.0f,0.0f,1.0f);
    if (level.rope[count].type==3)
      glColor4f(0.5f,0.5f,0.5f,1.0f);
    if (level.rope[count].type==4)
      glColor4f(0.75f,0.75f,0.75f,1.0f);
    if (level.rope[count].type>=5 && level.rope[count].type<10)
      glColor4f(0.75f,0.0f,0.75f,1.0f);
    if (level.rope[count].type==10)
      glColor4f(0.0f,0.75f,0.75f,1.0f);

    objectnum=level.rope[count].obj1;
    copyvector(vec,level.object[objectnum].position);
    if (level.object[objectnum].type>=2 && level.object[objectnum].type<=5)
      {
      if (level.rope[count].obj1part==0)
        {
        vec[0]-=level.object[objectnum].size[0]*0.5f;
        vec[1]+=level.object[objectnum].size[1]*0.5f;
        }
      if (level.rope[count].obj1part==1)
        {
        vec[0]+=level.object[objectnum].size[0]*0.5f;
        vec[1]+=level.object[objectnum].size[1]*0.5f;
        }
      if (level.rope[count].obj1part==2)
        {
        vec[0]+=level.object[objectnum].size[0]*0.5f;
        vec[1]-=level.object[objectnum].size[1]*0.5f;
        }
      if (level.rope[count].obj1part==3)
        {
        vec[0]-=level.object[objectnum].size[0]*0.5f;
        vec[1]-=level.object[objectnum].size[1]*0.5f;
        }
      }
    if (level.object[objectnum].type>=6 && level.object[objectnum].type<=7)
      {
      if (level.rope[count].obj1part==0)
        vec[0]+=level.object[objectnum].size[0]*0.5f;
      if (level.rope[count].obj1part==4)
        vec[1]-=level.object[objectnum].size[1]*0.5f;
      if (level.rope[count].obj1part==8)
        vec[0]-=level.object[objectnum].size[0]*0.5f;
      if (level.rope[count].obj1part==12)
        vec[1]+=level.object[objectnum].size[1]*0.5f;
      }
    glVertex3fv(vec);

    objectnum=level.rope[count].obj2;
    copyvector(vec,level.object[objectnum].position);
    if (level.object[objectnum].type>=2 && level.object[objectnum].type<=5)
      {
      if (level.rope[count].obj2part==0)
        {
        vec[0]-=level.object[objectnum].size[0]*0.5f;
        vec[1]+=level.object[objectnum].size[1]*0.5f;
        }
      if (level.rope[count].obj2part==1)
        {
        vec[0]+=level.object[objectnum].size[0]*0.5f;
        vec[1]+=level.object[objectnum].size[1]*0.5f;
        }
      if (level.rope[count].obj2part==2)
        {
        vec[0]+=level.object[objectnum].size[0]*0.5f;
        vec[1]-=level.object[objectnum].size[1]*0.5f;
        }
      if (level.rope[count].obj2part==3)
        {
        vec[0]-=level.object[objectnum].size[0]*0.5f;
        vec[1]-=level.object[objectnum].size[1]*0.5f;
        }
      }
    if (level.object[objectnum].type>=6 && level.object[objectnum].type<=7)
      {
      if (level.rope[count].obj2part==0)
        vec[0]+=level.object[objectnum].size[0]*0.5f;
      if (level.rope[count].obj2part==4)
        vec[1]-=level.object[objectnum].size[1]*0.5f;
      if (level.rope[count].obj2part==8)
        vec[0]-=level.object[objectnum].size[0]*0.5f;
      if (level.rope[count].obj2part==12)
        vec[1]+=level.object[objectnum].size[1]*0.5f;
      }
    glVertex3fv(vec);
    }

  glEnd();

  glEnable(GL_TEXTURE_2D);
  }
Ejemplo n.º 16
0
void createbox(float position[3],float sizex,float sizey,float mass,float friction)
  {
  int count,count2;
  float vec[3];

  memset(&object[numofobjects],0,sizeof(object[numofobjects]));

  object[numofobjects].type = OBJ_TYPE_BOX;
  object[numofobjects].timetolive=10000;
  object[numofobjects].mass=mass;

  object[numofobjects].numofparticles=4;
  if (sizex>=sizey)
    object[numofobjects].radius=sizex*1.5f;
  else
    object[numofobjects].radius=sizey*1.5f;

  object[numofobjects].size[0]=sizex;
  object[numofobjects].size[1]=sizey;

  object[numofobjects].friction=friction;

  count=0;

  vec[0]=-sizex*0.5f;
  vec[1]=sizey*0.5f;
  vec[2]=0.0f;
  addvectors(vec,vec,position);
  object[numofobjects].particle[count]=numofparticles;
  count++;
  createparticle(3,vec,NULL,mass*0.25f,-1,10000);

  vec[0]=sizex*0.5f;
  vec[1]=sizey*0.5f;
  vec[2]=0.0f;
  addvectors(vec,vec,position);
  object[numofobjects].particle[count]=numofparticles;
  count++;
  createparticle(3,vec,NULL,mass*0.25f,-1,10000);

  vec[0]=sizex*0.5f;
  vec[1]=-sizey*0.5f;
  vec[2]=0.0f;
  addvectors(vec,vec,position);
  object[numofobjects].particle[count]=numofparticles;
  count++;
  createparticle(3,vec,NULL,mass*0.25f,-1,10000);

  vec[0]=-sizex*0.5f;
  vec[1]=-sizey*0.5f;
  vec[2]=0.0f;
  addvectors(vec,vec,position);
  object[numofobjects].particle[count]=numofparticles;
  count++;
  createparticle(3,vec,NULL,mass*0.25f,-1,10000);

  for (count=0;count<object[numofobjects].numofparticles;count++)
  for (count2=count+1;count2<object[numofobjects].numofparticles;count2++)
    createbond(object[numofobjects].particle[count],object[numofobjects].particle[count2],1,-1);

  copyvector(object[numofobjects].position,position);

  object[numofobjects].numofcdlines=4;

  for (count=0;count<4;count++)
    {
    object[numofobjects].cdline[count][0]=count;
    object[numofobjects].cdline[count][1]=((count+1)&3);
    }
  object[numofobjects].texcoord[0][0]=0.0f;
  object[numofobjects].texcoord[0][1]=0.0f;
  object[numofobjects].texcoord[1][0]=1.0f;
  object[numofobjects].texcoord[1][1]=0.0f;
  object[numofobjects].texcoord[2][0]=1.0f;
  object[numofobjects].texcoord[2][1]=1.0f;
  object[numofobjects].texcoord[3][0]=0.0f;
  object[numofobjects].texcoord[3][1]=1.0f;

  object[numofobjects].soundnum[0]=-1;
  object[numofobjects].soundnum[1]=-1;
  object[numofobjects].soundnum[2]=-1;
  object[numofobjects].soundnum[3]=-1;

  numofobjects++;
  }
Ejemplo n.º 17
0
void createrope(int type,int particlenum,int particlenum2,int objectnum,int objectnum2,int texturenum)
  {
  int count/*,count2*/;
  int length;
  float vec[3],vec2[3];
  float mass;

  if (type<5)
    {
    if (type==1)
      mass=0.125f;
    if (type==2)
      mass=0.25f;
    if (type==3)
      mass=1.0f;
    if (type==4)
      mass=2.0f;

    subtractvectors(vec,particle[particlenum2].position,particle[particlenum].position);
    length=vectorlength(vec);
    if (length<1)
      length=1;
    length*=2;
  
    scalevector(vec,vec,1.0f/(float)length);
    copyvector(vec2,particle[particlenum].position);
    addvectors(vec2,vec2,vec);
    createparticle(4,vec2,NULL,mass,-1,10000);
    createbond(particlenum,numofparticles-1,4,numofropes);
    rope[numofropes].type=type;
    rope[numofropes].part1=particlenum;
    rope[numofropes].part2=numofparticles-1;
    if (type<3)
      rope[numofropes].texturenum=360;
    else
      rope[numofropes].texturenum=361;
    numofropes++;
  
    for (count=1;count<length-1;count++)
      {
      addvectors(vec2,vec2,vec);
      createparticle(4,vec2,NULL,mass,-1,10000);
      createbond(numofparticles-2,numofparticles-1,4,numofropes);
      rope[numofropes].type=type;
      rope[numofropes].part1=numofparticles-2;
      rope[numofropes].part2=numofparticles-1;
      if (type<3)
        rope[numofropes].texturenum=360;
      else
        rope[numofropes].texturenum=361;
      numofropes++;
      }
    createbond(numofparticles-1,particlenum2,4,numofropes);
    rope[numofropes].type=type;
    rope[numofropes].part1=numofparticles-1;
    rope[numofropes].part2=particlenum2;
    if (type<3)
      rope[numofropes].texturenum=360;
    else
      rope[numofropes].texturenum=361;
    numofropes++;
    }
  else 
    {
    if (type<10)
      createbond(particlenum,particlenum2,7,numofropes);
    else
      createbond(particlenum,particlenum2,8,numofropes);

    if (type<9)
      {
      if (level.object[objectnum2].type==6 || level.object[objectnum2].type==7)
        {
        subtractvectors(vec,level.object[objectnum2].position,particle[particlenum].position);
        subtractvectors(vec2,particle[particlenum2].position,object[objectnum2].position);
        rope[numofropes].range=vectorlength(vec2);
  
        bond[numofbonds-1].length=vectorlength(vec)-rope[numofropes].range;
        bond[numofbonds-1].maxlength=vectorlength(vec)-rope[numofropes].range;
        }
      if (level.object[objectnum2].type>=2 && level.object[objectnum2].type<6)
        {
        subtractvectors(vec2,level.object[objectnum2].position,object[objectnum].position);
        subtractvectors(vec,particle[particlenum2].position,particle[particlenum].position);
  
        if (fabs(vec2[0])>fabs(vec2[1]))
          vec[1]=0.0f;
        else
          vec[0]=0.0f;
  
        normalizevector(vec,vec);
  
        if (type==5 || type==9)
          copyvector(vec2,particle[particlenum2].position);
        if (type==6 || type==8)
          scaleaddvectors(vec2,particle[particlenum2].position,vec,-level.object[objectnum].lightcolor[0]*0.5f);
        if (type==7)
          scaleaddvectors(vec2,particle[particlenum2].position,vec,-level.object[objectnum].lightcolor[0]);
        subtractvectors(vec2,particle[particlenum].position,vec2);
        bond[numofbonds-1].length=vectorlength(vec2);
        bond[numofbonds-1].maxlength=vectorlength(vec2);
  
        if (type==5)
          scaleaddvectors(vec2,particle[particlenum2].position,vec,level.object[objectnum].lightcolor[0]);
        if (type==6 || type==8)
          scaleaddvectors(vec2,particle[particlenum2].position,vec,level.object[objectnum].lightcolor[0]*0.5f);
        if (type==7 || type==9)
          copyvector(vec2,particle[particlenum2].position);
        subtractvectors(vec2,particle[particlenum].position,vec2);
        rope[numofropes].range=(vectorlength(vec2)-bond[numofbonds-1].maxlength)*0.5f;
        }
      }

    rope[numofropes].type=type;
    rope[numofropes].part1=particlenum;
    rope[numofropes].part2=particlenum2;
    rope[numofropes].bondnum=numofbonds-1;
    if (type==5)
      rope[numofropes].angle=0.0f;
    if (type==6)
      rope[numofropes].angle=pi/2.0f;
    if (type==7)
      rope[numofropes].angle=pi;
    if (type==8)
      rope[numofropes].angle=3.0f*pi/2.0f;

    rope[numofropes].cycle=level.object[objectnum].lightcolor[1];
    rope[numofropes].cyclelength=level.object[objectnum].lightcolor[2];
    rope[numofropes].cyclecount=0.0f;
    rope[numofropes].link=level.object[objectnum].link;
    if (texturenum==0)
      rope[numofropes].texturenum=0;
    if (texturenum==1)
      rope[numofropes].texturenum=362;
    if (texturenum==2)
      rope[numofropes].texturenum=362;
    if (texturenum==3)
      rope[numofropes].texturenum=362;

    numofropes++;
    }
  }
Ejemplo n.º 18
0
void createwheel(float position[3],float sizex,float sizey,float mass,float friction,int anchor)
  {
  int count;
  float vec[3];
  float angle;

  memset(&object[numofobjects],0,sizeof(object[numofobjects]));

  object[numofobjects].type = OBJ_TYPE_WHEEL;
  object[numofobjects].timetolive=10000;
  if (sizex>=sizey)
    object[numofobjects].radius=sizex*1.25f;
  else
    object[numofobjects].radius=sizey*1.25f;

  object[numofobjects].mass=mass;

  object[numofobjects].friction=friction;

  object[numofobjects].numofparticles=17;
  for (count=0;count<16;count++)
    {
    angle=(float)count*pi/8.0f;
    vec[0]=position[0]+cos(angle)*sizex*0.5f;
    vec[1]=position[1]-sin(angle)*sizey*0.5f;
    vec[2]=0.0f;

    createparticle(3,vec,NULL,mass/20.0f,numofobjects,10000);
    object[numofobjects].particle[count]=numofparticles-1;
    }

  count=16;
  if (!anchor)
    createparticle(3,position,NULL,mass/5.0f,numofobjects,10000);
  else
    createparticle(2,position,NULL,mass/5.0f,numofobjects,10000);
  object[numofobjects].particle[count]=numofparticles-1;


  for (count=0;count<16;count++)
    {
    createbond(object[numofobjects].particle[((count+1)&15)],object[numofobjects].particle[(count&15)],1,numofobjects);
    createbond(object[numofobjects].particle[((count+2)&15)],object[numofobjects].particle[(count&15)],1,numofobjects);
    createbond(object[numofobjects].particle[((count+3)&15)],object[numofobjects].particle[(count&15)],1,numofobjects);
    //createbond(object[numofobjects].particle[((count+4)&15)],object[numofobjects].particle[(count&15)],1,numofobjects);
    //createbond(object[numofobjects].particle[((count+8)&15)],object[numofobjects].particle[(count&15)],1,numofobjects);
    createbond(object[numofobjects].particle[16],object[numofobjects].particle[(count&15)],1,numofobjects);
    }
  copyvector(object[numofobjects].position,position);

  object[numofobjects].numofcdlines=16;

  for (count=0;count<16;count++)
    {
    object[numofobjects].cdline[count][0]=count;
    object[numofobjects].cdline[count][1]=((count+1)&15);
    }

  object[numofobjects].soundnum[0]=-1;
  object[numofobjects].soundnum[1]=-1;
  object[numofobjects].soundnum[2]=-1;
  object[numofobjects].soundnum[3]=-1;

  numofobjects++;
  }
Ejemplo n.º 19
0
void createtarboy(float position[3])
{
  int resolution = 16; //standard: 16
  int count;
  float vec[3];
  float angle;
  float size;

  memset(&object[numofobjects],0,sizeof(object[numofobjects]));

  object[numofobjects].type = OBJ_TYPE_GISH;
  object[numofobjects].timetolive=10000;
  object[numofobjects].radius=1.5f;
  object[numofobjects].mass=4.0f;
  object[numofobjects].friction=1.2f;
 
  if (numofobjects==0)
    object[numofobjects].direction=1;

  object[numofobjects].hitpoints=1000;
  

  /* Particles */
  object[numofobjects].numofparticles = resolution;
  for (count=0; count < resolution; count++)
  {
    // Changing resolution changes count range.
    angle=(float)count*pi/8.0f;
    size=0.9f;
    if (game.supersize)
      size=0.9f*1.25f;
    if (game.difficulty==4)
      size=0.9f*0.8f;
    vec[0]=position[0]+cos(angle)*size;
    vec[1]=position[1]-sin(angle)*size;
    vec[2]=0.0f;
    createparticle(1,vec,NULL,0.25f,numofobjects,10000);
    object[numofobjects].particle[count] = numofparticles - 1;
  }
  
  /* Create bonds */
  for (count = 0; count < resolution; count++)
  {
    _object *o;
    int i1, i2;

    o = &object[numofobjects];

    i1 = o->particle[(count+1)&(resolution-1)];
    i2 = o->particle[(count&(resolution-1))];
    createbond(i1, i2, 3, -1);
    
    i1 = o->particle[((count+2)&(resolution-1))];
    i2 = o->particle[(count&(resolution-1))];
    createbond(i1, i2, 3, -1);

    i1 = o->particle[((count+(resolution / 2))&(resolution-1))];
    i2 = o->particle[(count&(resolution-1))];
    createbond(i1, i2, 2, numofobjects);
  }
  copyvector(object[numofobjects].position, position);

  object[numofobjects].numofcdlines = resolution;

  /* lines around */
  for (count = 0; count < resolution; count++)
  {
    object[numofobjects].cdline[count][0]=count;
    object[numofobjects].cdline[count][1]=((count+1)&(resolution-1));
  }

  /* set no sounds */
  object[numofobjects].soundnum[0]=-1;
  object[numofobjects].soundnum[1]=-1;
  object[numofobjects].soundnum[2]=-1;
  object[numofobjects].soundnum[3]=-1;

  numofobjects++;
}
Ejemplo n.º 20
0
void createbutton(float position[3],float mass)
  {
  int count,count2;
  float vec[3];

  memset(&object[numofobjects],0,sizeof(object[numofobjects]));

  object[numofobjects].type = OBJ_TYPE_BUTTON;
  object[numofobjects].timetolive=10000;

  object[numofobjects].friction=0.3f;
  object[numofobjects].radius=1.5f;

  object[numofobjects].numofparticles=7;

  count=0;

  vec[0]=position[0]-0.499f;
  vec[1]=position[1]+0.5f;
  vec[2]=0.0f;
  createparticle(3,vec,NULL,mass/16.0f,numofobjects,10000);
  object[numofobjects].particle[count]=numofparticles-1;
  count++;

  vec[0]=position[0]-0.125f;
  vec[1]=position[1]+0.75f;
  vec[2]=0.0f;
  createparticle(3,vec,NULL,mass/16.0f,numofobjects,10000);
  object[numofobjects].particle[count]=numofparticles-1;
  count++;

  vec[0]=position[0]+0.125f;
  vec[1]=position[1]+0.75f;
  vec[2]=0.0f;
  createparticle(3,vec,NULL,mass/16.0f,numofobjects,10000);
  object[numofobjects].particle[count]=numofparticles-1;
  count++;

  vec[0]=position[0]+0.499f;
  vec[1]=position[1]+0.5f;
  vec[2]=0.0f;
  createparticle(3,vec,NULL,mass/16.0f,numofobjects,10000);
  object[numofobjects].particle[count]=numofparticles-1;
  count++;

  vec[0]=position[0]+0.499f;
  vec[1]=position[1]-0.125f;
  vec[2]=0.0f;
  createparticle(3,vec,NULL,mass/16.0f,numofobjects,10000);
  object[numofobjects].particle[count]=numofparticles-1;
  count++;

  vec[0]=position[0]-0.499f;
  vec[1]=position[1]-0.125f;
  vec[2]=0.0f;
  createparticle(3,vec,NULL,mass/16.0f,numofobjects,10000);
  object[numofobjects].particle[count]=numofparticles-1;
  count++;

  vec[0]=position[0];
  vec[1]=position[1]-0.125f;
  vec[2]=0.0f;
  createparticle(2,vec,NULL,1.0f,numofobjects,10000);
  object[numofobjects].particle[count]=numofparticles-1;
  count++;

  for (count=0;count<6;count++)
  for (count2=count+1;count2<6;count2++)
    createbond(object[numofobjects].particle[count],object[numofobjects].particle[count2],1,numofobjects);

  copyvector(object[numofobjects].position,position);

  object[numofobjects].numofcdlines=6;
  for (count=0;count<6;count++)
    {
    object[numofobjects].cdline[count][0]=count;
    object[numofobjects].cdline[count][1]=((count+1)%6);
    }

  object[numofobjects].soundnum[0]=-1;
  object[numofobjects].soundnum[1]=-1;
  object[numofobjects].soundnum[2]=-1;
  object[numofobjects].soundnum[3]=-1;

  numofobjects++;
  }
Ejemplo n.º 21
0
void createswitch(float position[3],float mass,int rotate)
  {
  int count,count2;
  float vec[3],vec2[3];
  float orientation[2][2];

  if (rotate==0)
    {
    orientation[0][0]=1.0f;
    orientation[0][1]=0.0f;
    orientation[1][0]=0.0f;
    orientation[1][1]=1.0f;
    }
  if (rotate==1)
    {
    orientation[0][0]=0.0f;
    orientation[0][1]=-1.0f;
    orientation[1][0]=1.0f;
    orientation[1][1]=0.0f;
    }
  if (rotate==2)
    {
    orientation[0][0]=-1.0f;
    orientation[0][1]=0.0f;
    orientation[1][0]=0.0f;
    orientation[1][1]=-1.0f;
    }
  if (rotate==3)
    {
    orientation[0][0]=0.0f;
    orientation[0][1]=-1.0f;
    orientation[1][0]=-1.0f;
    orientation[1][1]=0.0f;
    }

  memset(&object[numofobjects],0,sizeof(object[numofobjects]));

  object[numofobjects].type = OBJ_TYPE_SWITCH;
  object[numofobjects].timetolive=10000;

  object[numofobjects].radius=1.5f;

  object[numofobjects].friction=0.3f;

  object[numofobjects].rotate=rotate;

  object[numofobjects].numofparticles=5;

  count=0;

  vec[0]=-0.875f;
  vec[1]=0.875f;
  vec2[0]=position[0]+vec[0]*orientation[0][0]+vec[1]*orientation[1][0];
  vec2[1]=position[1]+vec[0]*orientation[0][1]+vec[1]*orientation[1][1];
  vec2[2]=0.0f;
  createparticle(3,vec2,NULL,mass/8.0f,numofobjects,10000);
  object[numofobjects].particle[count]=numofparticles-1;
  count++;

  vec[0]=0.25f;
  vec[1]=0.0f;
  vec2[0]=position[0]+vec[0]*orientation[0][0]+vec[1]*orientation[1][0];
  vec2[1]=position[1]+vec[0]*orientation[0][1]+vec[1]*orientation[1][1];
  vec2[2]=0.0f;
  createparticle(3,vec2,NULL,mass/8.0f,numofobjects,10000);
  object[numofobjects].particle[count]=numofparticles-1;
  count++;

  vec[0]=-0.25f;
  vec[1]=-0.5f;
  vec[2]=0.0f;
  vec2[0]=position[0]+vec[0]*orientation[0][0]+vec[1]*orientation[1][0];
  vec2[1]=position[1]+vec[0]*orientation[0][1]+vec[1]*orientation[1][1];
  vec2[2]=0.0f;
  createparticle(3,vec2,NULL,mass/8.0f,numofobjects,10000);
  object[numofobjects].particle[count]=numofparticles-1;
  count++;

  vec[0]=-1.125f;
  vec[1]=0.625f;
  vec[2]=0.0f;
  vec2[0]=position[0]+vec[0]*orientation[0][0]+vec[1]*orientation[1][0];
  vec2[1]=position[1]+vec[0]*orientation[0][1]+vec[1]*orientation[1][1];
  vec2[2]=0.0f;
  createparticle(3,vec2,NULL,mass/8.0f,numofobjects,10000);
  object[numofobjects].particle[count]=numofparticles-1;
  count++;

  vec[0]=0.0f;
  vec[1]=-0.25f;
  vec[2]=0.0f;
  vec2[0]=position[0]+vec[0]*orientation[0][0]+vec[1]*orientation[1][0];
  vec2[1]=position[1]+vec[0]*orientation[0][1]+vec[1]*orientation[1][1];
  vec2[2]=0.0f;
  createparticle(2,vec2,NULL,10000.0f,numofobjects,10000);
  object[numofobjects].particle[count]=numofparticles-1;
  count++;

  for (count=0;count<5;count++)
  for (count2=count+1;count2<5;count2++)
    createbond(object[numofobjects].particle[count],object[numofobjects].particle[count2],1,numofobjects);

  copyvector(object[numofobjects].position,position);

  object[numofobjects].numofcdlines=4;
  for (count=0;count<4;count++)
    {
    object[numofobjects].cdline[count][0]=count;
    if (rotate!=3)
      object[numofobjects].cdline[count][1]=((count+1)&3);
    else
      object[numofobjects].cdline[count][1]=((count-1)&3);
    }

  object[numofobjects].texcoord[0][0]=0.0f;
  object[numofobjects].texcoord[0][1]=0.0f;
  object[numofobjects].texcoord[1][0]=1.0f;
  object[numofobjects].texcoord[1][1]=0.0f;
  object[numofobjects].texcoord[2][0]=1.0f;
  object[numofobjects].texcoord[2][1]=1.0f;
  object[numofobjects].texcoord[3][0]=0.0f;
  object[numofobjects].texcoord[3][1]=1.0f;

  object[numofobjects].soundnum[0]=-1;
  object[numofobjects].soundnum[1]=-1;
  object[numofobjects].soundnum[2]=-1;
  object[numofobjects].soundnum[3]=-1;

  numofobjects++;
  }
Ejemplo n.º 22
0
void setuprenderobjects(void)
  {
  int count,count2;
  float vec[3],vec2[3];
  //float intersectpoint[3];
  float normal[3];
  float angle;
  float scale;
  float w;

  numofobjectrenders=0;

  for (count=0;count<numofobjects;count++)
  if (object[count].texturenum!=0)
    {
    if (object[count].type==8)
      {
      subtractvectors(vec,view.position,object[count].position);
      if (fabs(vec[0])-object[count].radius<view.zoom)
      if (fabs(vec[1])-object[count].radius<view.zoom)
        {
        objectrender[numofobjectrenders].type=8;
        objectrender[numofobjectrenders].depth=-1.0f;
        if (object[count].texturenum==58)
          objectrender[numofobjectrenders].texturenum=256+object[count].texturenum+1+(game.framenum/7)%5;
        else
          objectrender[numofobjectrenders].texturenum=256+object[count].texturenum;
        objectrender[numofobjectrenders].objectnum=count;
        objectrender[numofobjectrenders].lightflags=0;
        objectrender[numofobjectrenders].alpha=1.0f;

        scale=0.35f;

        objectrender[numofobjectrenders].numofverts=4;
        for (count2=0;count2<4;count2++)
          {
          if (count2==0 || count2==3)
            vec[0]=object[count].position[0]-scale;
          else
            vec[0]=object[count].position[0]+scale;
          if (count2<2)
            vec[1]=object[count].position[1]+scale*2.0f;
          else
            vec[1]=object[count].position[1];
          vec[2]=0.0f;

          copyvector(objectrender[numofobjectrenders].vertex[count2],vec);
          if (count2==0 || count2==3)
            objectrender[numofobjectrenders].texcoord[count2][0]=0.0f;
          else
            objectrender[numofobjectrenders].texcoord[count2][0]=1.0f;
          if (count2<2)
            objectrender[numofobjectrenders].texcoord[count2][1]=0.0f;
          else
            objectrender[numofobjectrenders].texcoord[count2][1]=1.0f;
          }
        objectrender[numofobjectrenders].numoftris=2;
        objectrender[numofobjectrenders].tri[0][0]=0;
        objectrender[numofobjectrenders].tri[0][1]=1;
        objectrender[numofobjectrenders].tri[0][2]=2;
        objectrender[numofobjectrenders].tri[1][0]=0;
        objectrender[numofobjectrenders].tri[1][1]=2;
        objectrender[numofobjectrenders].tri[1][2]=3;

        numofobjectrenders++;

        objectrender[numofobjectrenders].type=8;
        objectrender[numofobjectrenders].depth=-1.0f;
        objectrender[numofobjectrenders].texturenum=256+object[count].texturenum;
        objectrender[numofobjectrenders].objectnum=count;
        objectrender[numofobjectrenders].lightflags=0;
        objectrender[numofobjectrenders].alpha=1.0f;

        objectrender[numofobjectrenders].numofverts=4;
        for (count2=0;count2<4;count2++)
          {
          if (count2==0 || count2==3)
            vec[0]=object[count].position[0]-scale;
          else
            vec[0]=object[count].position[0]+scale;
          if (count2<2)
            vec[1]=object[count].position[1];
          else
            vec[1]=object[count].position[1]-scale*2.0f;
          vec[2]=0.0f;

          copyvector(objectrender[numofobjectrenders].vertex[count2],vec);
          if (count2==0 || count2==3)
            objectrender[numofobjectrenders].texcoord[count2][0]=0.0f;
          else
            objectrender[numofobjectrenders].texcoord[count2][0]=1.0f;
          if (count2<2)
            objectrender[numofobjectrenders].texcoord[count2][1]=0.0f;
          else
            objectrender[numofobjectrenders].texcoord[count2][1]=1.0f;
          }
        objectrender[numofobjectrenders].numoftris=2;
        objectrender[numofobjectrenders].tri[0][0]=0;
        objectrender[numofobjectrenders].tri[0][1]=1;
        objectrender[numofobjectrenders].tri[0][2]=2;
        objectrender[numofobjectrenders].tri[1][0]=0;
        objectrender[numofobjectrenders].tri[1][1]=2;
        objectrender[numofobjectrenders].tri[1][2]=3;

        numofobjectrenders++;
        }
      }
    }

  for (count=0;count<numofobjects;count++)
  if (object[count].texturenum!=0)
    {
    if (object[count].type==10)
      {
      subtractvectors(vec,view.position,object[count].position);
      if (fabs(vec[0])-object[count].radius<view.zoom)
      if (fabs(vec[1])-object[count].radius<view.zoom)
        {
        objectrender[numofobjectrenders].type=2;
        objectrender[numofobjectrenders].depth=2.0f;
        objectrender[numofobjectrenders].texturenum=object[count].texturenum+256;
        objectrender[numofobjectrenders].objectnum=count;
        objectrender[numofobjectrenders].lightflags=setuprenderobjectlight(count);
        objectrender[numofobjectrenders].alpha=1.0f;

        objectrender[numofobjectrenders].numofverts=4;
        for (count2=0;count2<4;count2++)
          {
          copyvector(objectrender[numofobjectrenders].vertex[count2],particle[object[count].particle[count2]].position);
          objectrender[numofobjectrenders].texcoord[count2][0]=object[count].texcoord[count2][0];
          objectrender[numofobjectrenders].texcoord[count2][1]=object[count].texcoord[count2][1];
          }
        objectrender[numofobjectrenders].numoftris=2;
        objectrender[numofobjectrenders].tri[0][0]=0;
        objectrender[numofobjectrenders].tri[0][1]=1;
        objectrender[numofobjectrenders].tri[0][2]=2;
        objectrender[numofobjectrenders].tri[1][0]=0;
        objectrender[numofobjectrenders].tri[1][1]=2;
        objectrender[numofobjectrenders].tri[1][2]=3;

        objectrender[numofobjectrenders].numofedges=4;
        for (count2=0;count2<4;count2++)
          {
          normal[0]=-(particle[object[count].particle[((count2+1)&3)]].position[1]-particle[object[count].particle[count2]].position[1]);
          normal[1]=(particle[object[count].particle[((count2+1)&3)]].position[0]-particle[object[count].particle[count2]].position[0]);
          normal[2]=0.0f;
          normalizevector(normal,normal);
          if (object[count].rotate==3)
            negvector(normal,normal);
          copyvector(objectrender[numofobjectrenders].edgenormal[count2],normal);

          copyvector(objectrender[numofobjectrenders].edgevertex[count2][0],particle[object[count].particle[count2]].position);
          copyvector(objectrender[numofobjectrenders].edgevertex[count2][1],particle[object[count].particle[((count2+1)&3)]].position);
          copyvector(vec,particle[object[count].particle[((count2+1)&3)]].position);
          vec[0]-=normal[0]*0.125f;
          vec[1]-=normal[1]*0.125f;
          copyvector(objectrender[numofobjectrenders].edgevertex[count2][2],vec);
          copyvector(vec,particle[object[count].particle[count2]].position);
          vec[0]-=normal[0]*0.125f;
          vec[1]-=normal[1]*0.125f;
          copyvector(objectrender[numofobjectrenders].edgevertex[count2][3],vec);

          if (count2==0)
            {
            normal[0]=0.0f;
            normal[1]=0.125f;
            }
          if (count2==1)
            {
            normal[0]=-0.125f;
            normal[1]=0.0f;
            }
          if (count2==2)
            {
            normal[0]=0.0f;
            normal[1]=-0.125f;
            }
          if (count2==3)
            {
            normal[0]=0.125f;
            normal[1]=0.0f;
            }

          objectrender[numofobjectrenders].edgetexcoord[count2][0][0]=object[count].texcoord[count2][0];
          objectrender[numofobjectrenders].edgetexcoord[count2][0][1]=object[count].texcoord[count2][1];
          objectrender[numofobjectrenders].edgetexcoord[count2][1][0]=object[count].texcoord[((count2+1)&3)][0];
          objectrender[numofobjectrenders].edgetexcoord[count2][1][1]=object[count].texcoord[((count2+1)&3)][1];
          objectrender[numofobjectrenders].edgetexcoord[count2][2][0]=object[count].texcoord[((count2+1)&3)][0]+normal[0];
          objectrender[numofobjectrenders].edgetexcoord[count2][2][1]=object[count].texcoord[((count2+1)&3)][1]+normal[1];
          objectrender[numofobjectrenders].edgetexcoord[count2][3][0]=object[count].texcoord[count2][0]+normal[0];
          objectrender[numofobjectrenders].edgetexcoord[count2][3][1]=object[count].texcoord[count2][1]+normal[1];
          }

        numofobjectrenders++;
        }
      }
    }

  for (count=0;count<numofobjects;count++)
  if (object[count].texturenum!=0)
    {

    /* gish */
    if (object[count].type==OBJ_TYPE_GISH)
      {
      subtractvectors(vec,view.position,object[count].position);
      if (fabs(vec[0])-object[count].radius<view.zoom)
      if (fabs(vec[1])-object[count].radius<view.zoom)
        {
        objectrender[numofobjectrenders].type=1;
        objectrender[numofobjectrenders].depth=0.0f;
        objectrender[numofobjectrenders].angle=object[count].angle;
        objectrender[numofobjectrenders].objectnum=count;
        objectrender[numofobjectrenders].lightflags=setuprenderobjectlight(count);
        objectrender[numofobjectrenders].alpha=1.0f;
        if (count==0)
          objectrender[numofobjectrenders].texturenum=370+object[count].frame;
        else if (count==1)
          objectrender[numofobjectrenders].texturenum=390+object[count].frame;
        else if (count==2)
          objectrender[numofobjectrenders].texturenum=410+object[count].frame;
        else
          objectrender[numofobjectrenders].texturenum=430+object[count].frame;

        objectrender[numofobjectrenders].numofverts=33;

        for (count2=0;count2<16;count2++)
          {
          if (!object[count].particlestick[count2])
            copyvector(objectrender[numofobjectrenders].vertex[count2*2+0],particle[object[count].particle[count2]].position);
          else
            copyvector(objectrender[numofobjectrenders].vertex[count2*2+0],object[count].particlestickposition[count2]);
          }
        for (count2=0;count2<16;count2++)
          {
          addvectors(vec,objectrender[numofobjectrenders].vertex[count2*2+0],objectrender[numofobjectrenders].vertex[((count2+1)&15)*2+0]);
          addvectors(vec2,objectrender[numofobjectrenders].vertex[((count2-1)&15)*2+0],objectrender[numofobjectrenders].vertex[((count2+2)&15)*2+0]);

          w=1.0f/16.0f;

          scalevector(vec,vec,0.5f+w);
          scalevector(vec2,vec2,w);
          subtractvectors(vec,vec,vec2);

          copyvector(objectrender[numofobjectrenders].vertex[count2*2+1],vec);
          }

        /*
        for (count2=0;count2<16;count2++)
          {
          if (!object[count].particlestick[count2])
            copyvector(objectrender[numofobjectrenders].vertex[count2*2+0],particle[object[count].particle[count2]].position);
          else
            copyvector(objectrender[numofobjectrenders].vertex[count2*2+0],object[count].particlestickposition[count2]);

          w=1.0f/16.0f;

          //addvectors(vec,particle[object[count].particle[((count2+0)&15)]].position,particle[object[count].particle[((count2+1)&15)]].position);
          //addvectors(vec2,particle[object[count].particle[((count2-1)&15)]].position,particle[object[count].particle[((count2+2)&15)]].position);
          if (!object[count].particlestick[((count2+0)&15)])
            copyvector(vec,particle[object[count].particle[((count2+0)&15)]].position);
          else
            copyvector(vec,object[count].particlestickposition[((count2+0)&15)]);
          if (!object[count].particlestick[((count2+1)&15)])
            addvectors(vec,vec,particle[object[count].particle[((count2+1)&15)]].position);
          else
            addvectors(vec,vec,object[count].particlestickposition[((count2+1)&15)]);

          if (!object[count].particlestick[((count2-1)&15)])
            copyvector(vec2,particle[object[count].particle[((count2-1)&15)]].position);
          else
            copyvector(vec2,object[count].particlestickposition[((count2-1)&15)]);
          if (!object[count].particlestick[((count2+2)&15)])
            addvectors(vec2,vec2,particle[object[count].particle[((count2+2)&15)]].position);
          else
            addvectors(vec2,vec2,object[count].particlestickposition[((count2+2)&15)]);

          scalevector(vec,vec,0.5f+w);
          scalevector(vec2,vec2,w);
          subtractvectors(vec,vec,vec2);

          copyvector(objectrender[numofobjectrenders].vertex[count2*2+1],vec);
          }
        */

        for (count2=0;count2<32;count2++)
          {
          vec[0]=objectrender[numofobjectrenders].vertex[((count2-1)&31)][1]-objectrender[numofobjectrenders].vertex[((count2+0)&31)][1];
          vec[1]=objectrender[numofobjectrenders].vertex[((count2+0)&31)][0]-objectrender[numofobjectrenders].vertex[((count2-1)&31)][0];
          vec[2]=0.0f;
          vec2[0]=objectrender[numofobjectrenders].vertex[((count2+0)&31)][1]-objectrender[numofobjectrenders].vertex[((count2+1)&31)][1];
          vec2[1]=objectrender[numofobjectrenders].vertex[((count2+1)&31)][0]-objectrender[numofobjectrenders].vertex[((count2+0)&31)][0];
          vec2[2]=0.0f;

          addvectors(vec,vec,vec2);
          normalizevector(vec,vec);

          objectrender[numofobjectrenders].texcoord[count2][0]=0.5f+vec[0]*0.5f;
          objectrender[numofobjectrenders].texcoord[count2][1]=0.5f+vec[1]*0.5f;
          }
        count2=32;
        copyvector(objectrender[numofobjectrenders].vertex[count2],object[count].position);
        objectrender[numofobjectrenders].texcoord[count2][0]=0.5f;
        objectrender[numofobjectrenders].texcoord[count2][1]=0.5f;

        numofobjectrenders++;
        }
      }
    }

  for (count=0;count<numofobjects;count++)
  if (object[count].texturenum!=0)
    {
    if (object[count].type==2 || object[count].type==20)
      {
      subtractvectors(vec,view.position,object[count].position);
      if (fabs(vec[0])-object[count].radius<view.zoom)
      if (fabs(vec[1])-object[count].radius<view.zoom)
        {
        objectrender[numofobjectrenders].type=2;
        objectrender[numofobjectrenders].depth=2.0f;
        objectrender[numofobjectrenders].texturenum=object[count].texturenum+256;
        objectrender[numofobjectrenders].objectnum=count;
        objectrender[numofobjectrenders].lightflags=setuprenderobjectlight(count);
        objectrender[numofobjectrenders].alpha=1.0f;
        if (object[count].timetolive<50)
          objectrender[numofobjectrenders].alpha=(float)object[count].timetolive/50.0f;

        objectrender[numofobjectrenders].numofverts=4;
        for (count2=0;count2<4;count2++)
          {
          copyvector(objectrender[numofobjectrenders].vertex[count2],particle[object[count].particle[count2]].position);
          objectrender[numofobjectrenders].texcoord[count2][0]=object[count].texcoord[count2][0];
          objectrender[numofobjectrenders].texcoord[count2][1]=object[count].texcoord[count2][1];
          }
        objectrender[numofobjectrenders].numoftris=2;
        objectrender[numofobjectrenders].tri[0][0]=0;
        objectrender[numofobjectrenders].tri[0][1]=1;
        objectrender[numofobjectrenders].tri[0][2]=2;
        objectrender[numofobjectrenders].tri[1][0]=0;
        objectrender[numofobjectrenders].tri[1][1]=2;
        objectrender[numofobjectrenders].tri[1][2]=3;

        objectrender[numofobjectrenders].numofedges=4;
        for (count2=0;count2<4;count2++)
          {
          normal[0]=-(particle[object[count].particle[((count2+1)&3)]].position[1]-particle[object[count].particle[count2]].position[1]);
          normal[1]=(particle[object[count].particle[((count2+1)&3)]].position[0]-particle[object[count].particle[count2]].position[0]);
          normal[2]=0.0f;
          normalizevector(normal,normal);
          copyvector(objectrender[numofobjectrenders].edgenormal[count2],normal);

          copyvector(objectrender[numofobjectrenders].edgevertex[count2][0],particle[object[count].particle[count2]].position);
          copyvector(objectrender[numofobjectrenders].edgevertex[count2][1],particle[object[count].particle[((count2+1)&3)]].position);
          copyvector(vec,particle[object[count].particle[((count2+1)&3)]].position);
          vec[0]-=normal[0]*0.125f;
          vec[1]-=normal[1]*0.125f;
          copyvector(objectrender[numofobjectrenders].edgevertex[count2][2],vec);
          copyvector(vec,particle[object[count].particle[count2]].position);
          vec[0]-=normal[0]*0.125f;
          vec[1]-=normal[1]*0.125f;
          copyvector(objectrender[numofobjectrenders].edgevertex[count2][3],vec);

          if (count2==0)
            {
            normal[0]=0.0f;
            normal[1]=0.125f;
            }
          if (count2==1)
            {
            normal[0]=-0.125f;
            normal[1]=0.0f;
            }
          if (count2==2)
            {
            normal[0]=0.0f;
            normal[1]=-0.125f;
            }
          if (count2==3)
            {
            normal[0]=0.125f;
            normal[1]=0.0f;
            }

          objectrender[numofobjectrenders].edgetexcoord[count2][0][0]=object[count].texcoord[count2][0];
          objectrender[numofobjectrenders].edgetexcoord[count2][0][1]=object[count].texcoord[count2][1];
          objectrender[numofobjectrenders].edgetexcoord[count2][1][0]=object[count].texcoord[((count2+1)&3)][0];
          objectrender[numofobjectrenders].edgetexcoord[count2][1][1]=object[count].texcoord[((count2+1)&3)][1];
          objectrender[numofobjectrenders].edgetexcoord[count2][2][0]=object[count].texcoord[((count2+1)&3)][0]+normal[0];
          objectrender[numofobjectrenders].edgetexcoord[count2][2][1]=object[count].texcoord[((count2+1)&3)][1]+normal[1];
          objectrender[numofobjectrenders].edgetexcoord[count2][3][0]=object[count].texcoord[count2][0]+normal[0];
          objectrender[numofobjectrenders].edgetexcoord[count2][3][1]=object[count].texcoord[count2][1]+normal[1];
          }

        numofobjectrenders++;
        }
      }
    }

  for (count=0;count<numofobjects;count++)
  if (object[count].texturenum!=0)
    {
    if (object[count].type==3)
      {
      subtractvectors(vec,view.position,object[count].position);
      if (fabs(vec[0])-object[count].radius<view.zoom)
      if (fabs(vec[1])-object[count].radius<view.zoom)
        {
        objectrender[numofobjectrenders].type=3;
        objectrender[numofobjectrenders].depth=1.0f;
        objectrender[numofobjectrenders].texturenum=object[count].texturenum+256;
        objectrender[numofobjectrenders].objectnum=count;
        objectrender[numofobjectrenders].lightflags=setuprenderobjectlight(count);
        objectrender[numofobjectrenders].alpha=1.0f;
        if (object[count].timetolive<50)
          objectrender[numofobjectrenders].alpha=(float)object[count].timetolive/50.0f;
  
        objectrender[numofobjectrenders].numofverts=17;
        for (count2=0;count2<16;count2++)
          {
          copyvector(objectrender[numofobjectrenders].vertex[count2],particle[object[count].particle[count2]].position);
          angle=(float)count2*pi/8.0f;
          objectrender[numofobjectrenders].texcoord[count2][0]=0.5f+cos(angle)*0.5f;
          objectrender[numofobjectrenders].texcoord[count2][1]=0.5f+sin(angle)*0.5f;
          }
        count2=16;
        copyvector(objectrender[numofobjectrenders].vertex[count2],object[count].position);
        objectrender[numofobjectrenders].texcoord[count2][0]=0.5f;
        objectrender[numofobjectrenders].texcoord[count2][1]=0.5f;

        objectrender[numofobjectrenders].numoftris=16;
        for (count2=0;count2<16;count2++)
          {
          objectrender[numofobjectrenders].tri[count2][0]=count2;
          objectrender[numofobjectrenders].tri[count2][1]=((count2+1)&15);
          objectrender[numofobjectrenders].tri[count2][2]=16;
          }

        numofobjectrenders++;
        }
      }
    }

  for (count=0;count<numofobjects;count++)
  if (object[count].texturenum!=0)
    {
    if (object[count].type==4)
      {
      subtractvectors(vec,view.position,object[count].position);
      if (fabs(vec[0])-object[count].radius<view.zoom)
      if (fabs(vec[1])-object[count].radius<view.zoom)
        {
        objectrender[numofobjectrenders].type=4;
        objectrender[numofobjectrenders].depth=1.0f;
        objectrender[numofobjectrenders].texturenum=object[count].texturenum;
        objectrender[numofobjectrenders].objectnum=count;
        objectrender[numofobjectrenders].lightflags=setuprenderobjectlight(count);
        objectrender[numofobjectrenders].alpha=1.0f;

        objectrender[numofobjectrenders].numofverts=4;
        for (count2=0;count2<4;count2++)
          {
          subtractvectors(vec,particle[object[count].particle[count2]].position,object[count].position);
          if (object[count].beasttype==12)
            {
            if (count2==0)
              {
              subtractvectors(vec,particle[object[count].particle[0]].position,particle[object[count].particle[3]].position);
              addvectors(vec,particle[object[count].particle[0]].position,vec);
              subtractvectors(vec,vec,object[count].position);
              }
            if (count2==1)
              {
              subtractvectors(vec,particle[object[count].particle[1]].position,particle[object[count].particle[2]].position);
              addvectors(vec,particle[object[count].particle[1]].position,vec);
              subtractvectors(vec,vec,object[count].position);
              }
            }
          scaleaddvectors(objectrender[numofobjectrenders].vertex[count2],object[count].position,vec,2.0f);
          if ((object[count].direction==0 && (count2==0 || count2==3)) || (object[count].direction==1 && (count2==1 || count2==2)))
            objectrender[numofobjectrenders].texcoord[count2][0]=0.0f;
          else
            objectrender[numofobjectrenders].texcoord[count2][0]=1.0f;
          if (count2<2)
            objectrender[numofobjectrenders].texcoord[count2][1]=0.0f;
          else
            objectrender[numofobjectrenders].texcoord[count2][1]=1.0f;
          }
        objectrender[numofobjectrenders].numoftris=2;
        objectrender[numofobjectrenders].tri[0][0]=0;
        objectrender[numofobjectrenders].tri[0][1]=1;
        objectrender[numofobjectrenders].tri[0][2]=2;
        objectrender[numofobjectrenders].tri[1][0]=0;
        objectrender[numofobjectrenders].tri[1][1]=2;
        objectrender[numofobjectrenders].tri[1][2]=3;

        numofobjectrenders++;
        }
      }
    }


  for (count=0;count<numofbosses;count++)
  if (boss[count].texturenum!=0)
    {
    subtractvectors(vec,view.position,boss[count].position);
    if (fabs(vec[0])-4.0f<view.zoom)
    if (fabs(vec[1])-4.0f<view.zoom)
      {
      objectrender[numofobjectrenders].type=4;
      objectrender[numofobjectrenders].depth=1.0f;
      objectrender[numofobjectrenders].texturenum=boss[count].texturenum;
      objectrender[numofobjectrenders].objectnum=count;
      objectrender[numofobjectrenders].lightflags=255;
      objectrender[numofobjectrenders].alpha=1.0f;

      objectrender[numofobjectrenders].numofverts=4;
      for (count2=0;count2<4;count2++)
        {
        copyvector(vec,boss[count].position);

        //subtractvectors(vec2,object[0].position,boss[count].position);
        copyvector(vec2,boss[count].velocity);
        normalizevector(vec2,vec2);
        if (boss[count].direction==1)
          negvector(vec2,vec2);
        normal[0]=-vec2[1];
        normal[1]=vec2[0];
        normal[2]=0.0f;

        if (count2==0 || count2==3)
          scaleaddvectors(vec,vec,vec2,-boss[count].size[0]);
        else
          scaleaddvectors(vec,vec,vec2,boss[count].size[0]);

        if (count2<2)
          scaleaddvectors(vec,vec,normal,boss[count].size[1]);
        else
          scaleaddvectors(vec,vec,normal,-boss[count].size[1]);

        copyvector(objectrender[numofobjectrenders].vertex[count2],vec);

        if ((boss[count].direction==0 && (count2==0 || count2==3)) || (boss[count].direction==1 && (count2==1 || count2==2)))
          objectrender[numofobjectrenders].texcoord[count2][0]=0.0f;
        else
          objectrender[numofobjectrenders].texcoord[count2][0]=1.0f;
        if (count2<2)
          objectrender[numofobjectrenders].texcoord[count2][1]=0.0f;
        else
          objectrender[numofobjectrenders].texcoord[count2][1]=1.0f;
        }
      objectrender[numofobjectrenders].numoftris=2;
      objectrender[numofobjectrenders].tri[0][0]=0;
      objectrender[numofobjectrenders].tri[0][1]=1;
      objectrender[numofobjectrenders].tri[0][2]=2;
      objectrender[numofobjectrenders].tri[1][0]=0;
      objectrender[numofobjectrenders].tri[1][1]=2;
      objectrender[numofobjectrenders].tri[1][2]=3;

      numofobjectrenders++;
      }
    }

  for (count=0;count<numofobjects;count++)
  if (object[count].texturenum!=0)
    {
    if (object[count].type==5 || object[count].type==6)
      {
      subtractvectors(vec,view.position,object[count].position);
      if (fabs(vec[0])-object[count].radius<view.zoom)
      if (fabs(vec[1])-object[count].radius<view.zoom)
        {
        objectrender[numofobjectrenders].type=5;
        objectrender[numofobjectrenders].depth=1.1f;
        objectrender[numofobjectrenders].texturenum=object[count].texturenum;
        objectrender[numofobjectrenders].objectnum=count;
        objectrender[numofobjectrenders].lightflags=setuprenderobjectlight(count);
        objectrender[numofobjectrenders].alpha=1.0f;
        if (object[count].timetolive<50)
          objectrender[numofobjectrenders].alpha=(float)object[count].timetolive/50.0f;

        objectrender[numofobjectrenders].numofverts=9;
        for (count2=0;count2<8;count2++)
          {
          if ((count2&1)==0)
            scale=1.0f;
          else
            scale=1.41f;

          subtractvectors(vec,particle[object[count].particle[count2]].position,object[count].position);
          scaleaddvectors(objectrender[numofobjectrenders].vertex[count2],object[count].position,vec,scale);

          angle=(float)count2*pi/4.0f;
          if (object[count].direction==0)
            objectrender[numofobjectrenders].texcoord[count2][0]=0.5f+cos(angle)*0.5f*scale;
          else
            objectrender[numofobjectrenders].texcoord[count2][0]=0.5f-cos(angle)*0.5f*scale;
          objectrender[numofobjectrenders].texcoord[count2][1]=0.5f+sin(angle)*0.5f*scale;
          }
        count2=8;
        copyvector(objectrender[numofobjectrenders].vertex[count2],object[count].position);
        objectrender[numofobjectrenders].texcoord[count2][0]=0.5f;
        objectrender[numofobjectrenders].texcoord[count2][1]=0.5f;

        objectrender[numofobjectrenders].numoftris=8;
        for (count2=0;count2<8;count2++)
          {
          objectrender[numofobjectrenders].tri[count2][0]=count2;
          objectrender[numofobjectrenders].tri[count2][1]=((count2+1)&7);
          objectrender[numofobjectrenders].tri[count2][2]=8;
          }

        numofobjectrenders++;
        }
      }
    }

  for (count=0;count<numofobjects;count++)
  if (object[count].texturenum!=0)
    {
    if (object[count].type==9)
      {
      subtractvectors(vec,view.position,object[count].position);
      if (fabs(vec[0])-object[count].radius<view.zoom)
      if (fabs(vec[1])-object[count].radius<view.zoom)
        {
        objectrender[numofobjectrenders].type=9;
        objectrender[numofobjectrenders].depth=2.0f;
        objectrender[numofobjectrenders].texturenum=object[count].texturenum+256;
        objectrender[numofobjectrenders].objectnum=count;
        objectrender[numofobjectrenders].lightflags=setuprenderobjectlight(count);
        objectrender[numofobjectrenders].alpha=1.0f;

        objectrender[numofobjectrenders].numofverts=6;
        for (count2=0;count2<6;count2++)
          copyvector(objectrender[numofobjectrenders].vertex[count2],particle[object[count].particle[count2]].position);

        objectrender[numofobjectrenders].texcoord[0][0]=0.0f;
        objectrender[numofobjectrenders].texcoord[0][1]=1.0f;
        objectrender[numofobjectrenders].texcoord[1][0]=0.0f;
        objectrender[numofobjectrenders].texcoord[1][1]=0.0f;
        objectrender[numofobjectrenders].texcoord[2][0]=1.0f;
        objectrender[numofobjectrenders].texcoord[2][1]=0.0f;
        objectrender[numofobjectrenders].texcoord[3][0]=1.0f;
        objectrender[numofobjectrenders].texcoord[3][1]=1.0f;
        objectrender[numofobjectrenders].texcoord[4][0]=1.0f;
        objectrender[numofobjectrenders].texcoord[4][1]=0.0f;
        objectrender[numofobjectrenders].texcoord[5][0]=0.0f;
        objectrender[numofobjectrenders].texcoord[5][1]=0.0f;

        objectrender[numofobjectrenders].numoftris=4;
        objectrender[numofobjectrenders].tri[0][0]=0;
        objectrender[numofobjectrenders].tri[0][1]=1;
        objectrender[numofobjectrenders].tri[0][2]=2;
        objectrender[numofobjectrenders].tri[1][0]=0;
        objectrender[numofobjectrenders].tri[1][1]=2;
        objectrender[numofobjectrenders].tri[1][2]=3;
        objectrender[numofobjectrenders].tri[2][0]=0;
        objectrender[numofobjectrenders].tri[2][1]=3;
        objectrender[numofobjectrenders].tri[2][2]=4;
        objectrender[numofobjectrenders].tri[3][0]=0;
        objectrender[numofobjectrenders].tri[3][1]=4;
        objectrender[numofobjectrenders].tri[3][2]=5;

        numofobjectrenders++;
        }
      }
    }

  for (count=0;count<numofropes;count++)
  if (rope[count].texturenum!=0)
    {
    scale=1.0f;
    if (rope[count].type>=5 && rope[count].type<10)
      scale=bond[rope[count].bondnum].length+1.0f;

    subtractvectors(vec,view.position,particle[rope[count].part1].position);
    if (fabs(vec[0])-scale<view.zoom)
    if (fabs(vec[1])-scale<view.zoom)
      {
      objectrender[numofobjectrenders].type=32;
      objectrender[numofobjectrenders].depth=3.0f+(float)count/1000.0f;
      objectrender[numofobjectrenders].objectnum=count;
      objectrender[numofobjectrenders].texturenum=rope[count].texturenum;
      objectrender[numofobjectrenders].lightflags=setuprenderropelight(count,scale);
      objectrender[numofobjectrenders].alpha=1.0f;

      normal[0]=particle[rope[count].part1].position[1]-particle[rope[count].part2].position[1];
      normal[1]=particle[rope[count].part2].position[0]-particle[rope[count].part1].position[0];
      normal[2]=0.0f;
      normalizevector(normal,normal);
      if (rope[count].type==1 || rope[count].type==3)
        scalevector(normal,normal,0.35f);
      if (rope[count].type==2 || rope[count].type==4)
        scalevector(normal,normal,0.5f);
      if (rope[count].type>=5 && rope[count].type<=10)
        scalevector(normal,normal,0.5f);

      objectrender[numofobjectrenders].numofverts=4;
      count2=0;
      subtractvectors(objectrender[numofobjectrenders].vertex[count2],particle[rope[count].part1].position,normal);
      objectrender[numofobjectrenders].texcoord[count2][0]=0.0f;
      objectrender[numofobjectrenders].texcoord[count2][1]=0.0f;
      count2=1;
      addvectors(objectrender[numofobjectrenders].vertex[count2],particle[rope[count].part1].position,normal);
      objectrender[numofobjectrenders].texcoord[count2][0]=1.0f;
      objectrender[numofobjectrenders].texcoord[count2][1]=0.0f;
      count2=2;
      addvectors(objectrender[numofobjectrenders].vertex[count2],particle[rope[count].part2].position,normal);
      objectrender[numofobjectrenders].texcoord[count2][0]=1.0f;
      objectrender[numofobjectrenders].texcoord[count2][1]=1.0f;
      count2=3;
      subtractvectors(objectrender[numofobjectrenders].vertex[count2],particle[rope[count].part2].position,normal);
      objectrender[numofobjectrenders].texcoord[count2][0]=0.0f;
      objectrender[numofobjectrenders].texcoord[count2][1]=1.0f;

      objectrender[numofobjectrenders].numoftris=2;
      objectrender[numofobjectrenders].tri[0][0]=0;
      objectrender[numofobjectrenders].tri[0][1]=1;
      objectrender[numofobjectrenders].tri[0][2]=2;
      objectrender[numofobjectrenders].tri[1][0]=0;
      objectrender[numofobjectrenders].tri[1][1]=2;
      objectrender[numofobjectrenders].tri[1][2]=3;

      numofobjectrenders++;
      }
    }
  }
Ejemplo n.º 23
0
void createbeast(int beasttype,float position[3],float sizex,float sizey,float mass,float friction)
  {
  int count,count2;
  float vec[3];

  memset(&object[numofobjects],0,sizeof(object[numofobjects]));

  object[numofobjects].type = OBJ_TYPE_BEAST;
  object[numofobjects].timetolive=10000;

  object[numofobjects].beasttype=beasttype;
  object[numofobjects].animationnum=beasttype;
  object[numofobjects].texturenum=animation[object[numofobjects].animationnum].stand[0];
  object[numofobjects].mass=mass;

  object[numofobjects].hitpoints=250;
  if (beasttype==7 || beasttype==13)
    object[numofobjects].hitpoints=15000;

  object[numofobjects].size[0]=sizex;
  object[numofobjects].size[1]=sizey;

  object[numofobjects].numofparticles=4;

  if (sizex>=sizey)
    object[numofobjects].radius=sizex*1.5f;
  else
    object[numofobjects].radius=sizey*1.5f;

  object[numofobjects].friction=friction;

  count=0;

  vec[0]=-sizex*0.5f;
  vec[1]=sizey*0.5f;
  vec[2]=0.0f;
  addvectors(vec,vec,position);
  object[numofobjects].particle[count]=numofparticles;
  count++;
  createparticle(3,vec,NULL,mass*0.5f,-1,10000);

  vec[0]=sizex*0.5f;
  vec[1]=sizey*0.5f;
  vec[2]=0.0f;
  addvectors(vec,vec,position);
  object[numofobjects].particle[count]=numofparticles;
  count++;
  createparticle(3,vec,NULL,mass*0.5f,-1,10000);

  vec[0]=sizex*0.5f;
  vec[1]=-sizey*0.5f;
  vec[2]=0.0f;
  addvectors(vec,vec,position);
  object[numofobjects].particle[count]=numofparticles;
  count++;
  if (beasttype!=12)
    createparticle(3,vec,NULL,mass*0.5f,-1,10000);
  else
    createparticle(2,vec,NULL,mass*0.5f,-1,10000);

  vec[0]=-sizex*0.5f;
  vec[1]=-sizey*0.5f;
  vec[2]=0.0f;
  addvectors(vec,vec,position);
  object[numofobjects].particle[count]=numofparticles;
  count++;
  if (beasttype!=12)
    createparticle(3,vec,NULL,mass*0.5f,-1,10000);
  else
    createparticle(2,vec,NULL,mass*0.5f,-1,10000);

  for (count=0;count<object[numofobjects].numofparticles;count++)
  for (count2=count+1;count2<object[numofobjects].numofparticles;count2++)
    createbond(object[numofobjects].particle[count],object[numofobjects].particle[count2],6,numofobjects);

  copyvector(object[numofobjects].position,position);

  object[numofobjects].numofcdlines=4;

  for (count=0;count<4;count++)
    {
    object[numofobjects].cdline[count][0]=count;
    object[numofobjects].cdline[count][1]=((count+1)&3);
    }

  object[numofobjects].soundnum[0]=-1;
  object[numofobjects].soundnum[1]=-1;
  object[numofobjects].soundnum[2]=-1;
  object[numofobjects].soundnum[3]=-1;

  numofobjects++;
  }
Ejemplo n.º 24
0
void editlevelobjects(void)
  {
  int count,count2;
  int x,y;
  int simtimer;
  int simcount;
  float vec[3],vec2[3];

  simtimer=SDL_GetTicks();

  resetmenuitems();

  while (!menuitem[0].active && !windowinfo.shutdown)
    {
    glClearColor(0.0f,0.0f,0.0f,0.0f);
    glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE);
    glStencilMask(~0);
    glClearStencil(0);
    glClear(GL_COLOR_BUFFER_BIT|GL_STENCIL_BUFFER_BIT);
    glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_FALSE);
    glStencilMask(0);

    setuptextdisplay();
    glColor3fv(level.ambient[3]);
    if (level.background[0]!=0)
      displaybackground(660);

    numofmenuitems=0;
    createmenuitem("",0,0,16,1.0f,1.0f,1.0f,1.0f);
    setmenuitem(MO_HOTKEY,SCAN_ESC);
    if (editor.objectnum!=-1)
      {
      createmenuitem("Mass   ",(640|TEXT_END),0,16,1.0f,1.0f,1.0f,1.0f);
      setmenuitem(MO_FLOATINPUT,&level.object[editor.objectnum].mass);
      setmenuitem(MO_HOTKEY,SCAN_M);
      createmenuitem("Friction",(640|TEXT_END),32,16,1.0f,1.0f,1.0f,1.0f);
      setmenuitem(MO_FLOATINPUT,&level.object[editor.objectnum].friction);
      setmenuitem(MO_HOTKEY,SCAN_F);
      createmenuitem("LType",(640|TEXT_END),64,16,1.0f,1.0f,1.0f,1.0f);
      setmenuitem(MO_INTINPUT,&level.object[editor.objectnum].lighttype);
      createmenuitem("Red  ",(640|TEXT_END),96,16,1.0f,1.0f,1.0f,1.0f);
      setmenuitem(MO_FLOATINPUT,&level.object[editor.objectnum].lightcolor[0]);
      createmenuitem("Green",(640|TEXT_END),128,16,1.0f,1.0f,1.0f,1.0f);
      setmenuitem(MO_FLOATINPUT,&level.object[editor.objectnum].lightcolor[1]);
      createmenuitem("Blue ",(640|TEXT_END),160,16,1.0f,1.0f,1.0f,1.0f);
      setmenuitem(MO_FLOATINPUT,&level.object[editor.objectnum].lightcolor[2]);
      createmenuitem("Inten",(640|TEXT_END),192,16,1.0f,1.0f,1.0f,1.0f);
      setmenuitem(MO_FLOATINPUT,&level.object[editor.objectnum].lightintensity);
      }

    checksystemmessages();
    checkkeyboard();
    checkmouse();
    checkmenuitems();

    view.zoom=10.0f;
    if (keyboard[SCAN_EQUALS])
      view.zoom=20.0f;
    if (keyboard[SCAN_MINUS])
      view.zoom=5.0f;

    view.zoomx=view.zoom+0.5f;
    view.zoomy=view.zoom*0.75f+0.5f;

    setuporthoviewport(0,0,640,480,view.zoom,view.zoom*0.75f,20.0f);
    setupviewpoint(view.position,view.orientation);

    setupframelighting();

    rendershadows();

    renderlevelback();
    renderlevel();
    //renderlevelfore();

    renderlevelfore();
    renderlevelobjects();

    if (keyboard[SCAN_L])
      renderlevellines();

    setuptextdisplay();

    drawtext(TXT_OBJECTSET":/i",0,352,16,1.0f,1.0f,1.0f,1.0f,editor.objecttype);
    drawtext(TXT_OBJECTNUM":/i",0,368,16,1.0f,1.0f,1.0f,1.0f,editor.objectnum);
    if (editor.objectnum!=-1)
      drawtext(TXT_OBJECTYPE":/i",0,384,16,1.0f,1.0f,1.0f,1.0f,level.object[editor.objectnum].type);
    drawtext(TXT_OBJECTS":/i",0,400,16,1.0f,1.0f,1.0f,1.0f,level.numofobjects);
    drawtext(TXT_ROPES":/i",0,416,16,1.0f,1.0f,1.0f,1.0f,level.numofropes);
    if (editor.objectnum!=-1)
      {
      drawtext(TXT_LINK":/i",0,432,16,1.0f,1.0f,1.0f,1.0f,level.object[editor.objectnum].link);
      }

    drawmenuitems();

    drawmousecursor(768+font.cursornum,mouse.x,mouse.y,16,1.0f,1.0f,1.0f,1.0f);

    SDL_GL_SwapBuffers();

    if (mouse.x<512 || mouse.y>224)
      {
      x=view.position[0]+(float)(mouse.x-320)/32.0f;
      y=view.position[1]+(float)(240-mouse.y)/32.0f;
      if (!keyboard[SCAN_K])
        {
        if (mouse.lmb && !prevmouse.lmb)
          {
          if (!keyboard[SCAN_H])
            {
            vec[0]=(float)x+0.5f;
            vec[1]=(float)y+0.5f;
            vec[2]=0.0f;
            }
          else
            {
            vec[0]=(float)x;
            vec[1]=(float)y;
            vec[2]=0.0f;
            }

    
          memset(&level.object[level.numofobjects],0,sizeof(level.object[level.numofobjects]));
          level.object[level.numofobjects].type=editor.objecttype;
          level.object[level.numofobjects].link=-1;
          copyvector(level.object[level.numofobjects].position,vec);
          if (editor.objectnum==-1 || level.object[level.numofobjects].type!=level.object[editor.objectnum].type)
            {
            level.object[level.numofobjects].texturenum=0;
            level.object[level.numofobjects].size[0]=1.0f;
            level.object[level.numofobjects].size[1]=1.0f;
            level.object[level.numofobjects].mass=1.0f;
            level.object[level.numofobjects].friction=0.8f;
            level.object[level.numofobjects].lightcolor[0]=1.0f;
            level.object[level.numofobjects].lightcolor[1]=1.0f;
            level.object[level.numofobjects].lightcolor[2]=1.0f;
            level.object[level.numofobjects].lightintensity=16.0f;
            }
          else
            {
            level.object[level.numofobjects].texturenum=level.object[editor.objectnum].texturenum;
            level.object[level.numofobjects].size[0]=level.object[editor.objectnum].size[0];
            level.object[level.numofobjects].size[1]=level.object[editor.objectnum].size[1];
            level.object[level.numofobjects].mass=level.object[editor.objectnum].mass;
            level.object[level.numofobjects].friction=level.object[editor.objectnum].friction;
            level.object[level.numofobjects].lighttype=level.object[editor.objectnum].lighttype;
            level.object[level.numofobjects].lightcolor[0]=level.object[editor.objectnum].lightcolor[0];
            level.object[level.numofobjects].lightcolor[1]=level.object[editor.objectnum].lightcolor[1];
            level.object[level.numofobjects].lightcolor[2]=level.object[editor.objectnum].lightcolor[2];
            level.object[level.numofobjects].lightintensity=level.object[editor.objectnum].lightintensity;
            }

          editor.objectnum=level.numofobjects;
          level.numofobjects++;
          }
        }
      if (keyboard[SCAN_K])
        {
        vec[0]=view.position[0]+(float)(mouse.x-320)/32.0f;
        vec[1]=view.position[1]+(float)(240-mouse.y)/32.0f;
        vec[2]=0.0f;

        if (mouse.lmb && !prevmouse.lmb)
          {
          if (editor.objectnum!=-1)
          for (count=0;count<level.numofobjects;count++)
            {
            subtractvectors(vec2,vec,level.object[count].position);
            if (vectorlength(vec2)<0.5f)
              level.object[editor.objectnum].link=count;
            }
          }
        if (mouse.rmb && !prevmouse.rmb)
          level.object[editor.objectnum].link=-1;
        }
      if (mouse.rmb && !prevmouse.rmb)
        {
        vec[0]=view.position[0]+(float)(mouse.x-320)/32.0f;
        vec[1]=view.position[1]+(float)(240-mouse.y)/32.0f;
        vec[2]=0.0f;
  
        editor.objectnum=-1;
  
        for (count=0;count<level.numofobjects;count++)
          {
          subtractvectors(vec2,vec,level.object[count].position);
          if (vectorlength(vec2)<0.5f)
            editor.objectnum=count;
          }
        }
      }
    if (!menuinputkeyboard)
      {
      if (editor.objectnum!=-1)
        {
        vec[0]=1.0f;
        if (level.object[editor.objectnum].type==6 || level.object[editor.objectnum].type==7 || level.object[editor.objectnum].type==17)
          vec[0]=0.2f;

        if (keyboard[SCAN_HOME] && !prevkeyboard[SCAN_HOME])
        if (level.numofobjects>1)
          {
          count2=0;
          if (keyboard[SCAN_SHIFT])
            count2=2;
          memcpy(&level.object[255],&level.object[count2],sizeof(level.object[0]));
          memcpy(&level.object[count2],&level.object[editor.objectnum],sizeof(level.object[0]));
          memcpy(&level.object[editor.objectnum],&level.object[255],sizeof(level.object[0]));

          for (count=0;count<level.numofobjects;count++)
            {
            if (level.object[count].link==count2)
              level.object[count].link=editor.objectnum;
            else if (level.object[count].link==editor.objectnum)
              level.object[count].link=count2;
            }

          for (count=0;count<level.numofropes;count++)
            {
            if (level.rope[count].obj1==count2)
              level.rope[count].obj1=editor.objectnum;
            else if (level.rope[count].obj1==editor.objectnum)
              level.rope[count].obj1=count2;
            if (level.rope[count].obj2==count2)
              level.rope[count].obj2=editor.objectnum;
            else if (level.rope[count].obj2==editor.objectnum)
              level.rope[count].obj2=count2;
            }
          editor.objectnum=count2;
          }
        if (keyboard[SCAN_END] && !prevkeyboard[SCAN_END])
        if (level.numofobjects>2)
          {
          count2=1;
          if (keyboard[SCAN_SHIFT])
            count2=3;
          memcpy(&level.object[255],&level.object[count2],sizeof(level.object[0]));
          memcpy(&level.object[count2],&level.object[editor.objectnum],sizeof(level.object[0]));
          memcpy(&level.object[editor.objectnum],&level.object[255],sizeof(level.object[0]));

          for (count=0;count<level.numofobjects;count++)
            {
            if (level.object[count].link==count2)
              level.object[count].link=editor.objectnum;
            else if (level.object[count].link==editor.objectnum)
              level.object[count].link=count2;
            }

          for (count=0;count<level.numofropes;count++)
            {
            if (level.rope[count].obj1==count2)
              level.rope[count].obj1=editor.objectnum;
            else if (level.rope[count].obj1==editor.objectnum)
              level.rope[count].obj1=count2;
            if (level.rope[count].obj2==count2)
              level.rope[count].obj2=editor.objectnum;
            else if (level.rope[count].obj2==editor.objectnum)
              level.rope[count].obj2=count2;
            }
          editor.objectnum=count2;
          }
        if (keyboard[SCAN_LEFT] && !prevkeyboard[SCAN_LEFT])
        if (level.object[editor.objectnum].size[0]>vec[0])
          level.object[editor.objectnum].size[0]-=vec[0];
    
        if (keyboard[SCAN_RIGHT] && !prevkeyboard[SCAN_RIGHT])
        if (level.object[editor.objectnum].size[0]<16.0f)
          level.object[editor.objectnum].size[0]+=vec[0];
  
        if (keyboard[SCAN_DOWN] && !prevkeyboard[SCAN_DOWN])
        if (level.object[editor.objectnum].size[1]>vec[0])
          level.object[editor.objectnum].size[1]-=vec[0];
    
        if (keyboard[SCAN_UP] && !prevkeyboard[SCAN_UP])
        if (level.object[editor.objectnum].size[1]<16.0f)
          level.object[editor.objectnum].size[1]+=vec[0];

        if (keyboard[SCAN_LFT_BRACKET] && !prevkeyboard[SCAN_LFT_BRACKET])
          {
          if (!keyboard[SCAN_SHIFT])
            level.object[editor.objectnum].texturenum--;
          else
            level.object[editor.objectnum].texturenum-=10;
          if (level.object[editor.objectnum].texturenum<0)
            level.object[editor.objectnum].texturenum=0;
          }
        if (keyboard[SCAN_RGT_BRACKET] && !prevkeyboard[SCAN_RGT_BRACKET])
          {
          if (!keyboard[SCAN_SHIFT])
            level.object[editor.objectnum].texturenum++;
          else
            level.object[editor.objectnum].texturenum+=10;
          if (level.object[editor.objectnum].texturenum>255)
            level.object[editor.objectnum].texturenum=255;
          }
        }
  
      if (keyboard[SCAN_Q] && !prevkeyboard[SCAN_Q])
        {
        if (!keyboard[SCAN_SHIFT])
          editor.objecttype++;
        else
          editor.objecttype+=10;
        if (editor.objecttype>255)
          editor.objecttype=255;
        }
      if (keyboard[SCAN_Z] && !prevkeyboard[SCAN_Z])
        {
        if (!keyboard[SCAN_SHIFT])
          editor.objecttype--;
        else
          editor.objecttype-=10;
        if (editor.objecttype<0)
          editor.objecttype=0;
        }
      if (keyboard[SCAN_DELETE] && !prevkeyboard[SCAN_DELETE])
        deletelevelobject(editor.objectnum);
      if (keyboard[SCAN_F5] && !prevkeyboard[SCAN_F5])
        {
        setuplevel();
        setupgame();
        }
      }

    simcount=0;
    while (SDL_GetTicks()-simtimer>20 && simcount<5)
      {
      simcount++;
      count=SDL_GetTicks()-simtimer-20;
      simtimer=SDL_GetTicks()-count;

      if (!menuinputkeyboard)
        {
        if (keyboard[SCAN_W])
          view.position[1]+=0.2f;
        if (keyboard[SCAN_S])
          view.position[1]-=0.2f;
        if (keyboard[SCAN_A])
          view.position[0]-=0.2f;
        if (keyboard[SCAN_D])
          view.position[0]+=0.2f;
        }
      }
    }

  resetmenuitems();
  }
Ejemplo n.º 25
0
void objectcycle(void)
  {
  int count,count2,count3,count4;
  int x,y;
  float vec[3],vec2[3];
  float veclength,bondlength;
  float angle,spin;
  float intersectpoint[3];
  float normal[3];
  float scale,scale2;

  for (count=0;count<numofropes;count++)
    {
    updateogg();

    if (rope[count].type>=5 && rope[count].type<9)
      {
      bond[rope[count].bondnum].length=bond[rope[count].bondnum].maxlength+(rope[count].range-cos(rope[count].angle)*rope[count].range);

      if (rope[count].cyclelength==0.0f)
        {
        if (rope[count].link==-1 || object[rope[count].link].idata[0]==1)
          {
          rope[count].angle+=2.0f*pi/(50.0f*rope[count].cycle);
          if (rope[count].angle>2.0f*pi)
            rope[count].angle-=2.0f*pi;
          }
        }
      else
        {
        if (rope[count].link==-1)
          {
          if (rope[count].cyclecount<rope[count].cyclelength*2.0f*pi)
            {
            rope[count].angle+=2.0f*pi/(50.0f*rope[count].cycle);
            if (rope[count].angle>2.0f*pi)
              rope[count].angle-=2.0f*pi;
            rope[count].cyclecount+=2.0f*pi/(50.0f*rope[count].cycle);
            }
          }
        else
          {
          count2=0;
          if (object[rope[count].link].idata[0]==1 && rope[count].cyclecount==0.0f)
            count2=1;
          if (rope[count].cyclecount>0.0f && rope[count].cyclecount<rope[count].cyclelength*2.0f*pi)
            count2=1;
          if (rope[count].cyclecount>rope[count].cyclelength*2.0f*pi+2.0f*pi/(50.0f*rope[count].cycle))
            count2=1;
          if (object[rope[count].link].idata[0]==0 && rope[count].cyclecount>0.0f)
            count2=1;

          if (count2==1)
            {
            rope[count].angle+=2.0f*pi/(50.0f*rope[count].cycle);
            if (rope[count].angle>2.0f*pi)
              rope[count].angle-=2.0f*pi;
            rope[count].cyclecount+=2.0f*pi/(50.0f*rope[count].cycle);
            if (rope[count].cyclecount>=rope[count].cyclelength*4.0f*pi)
              rope[count].cyclecount=0.0f;
            }
          }
        }
      }
    }

  for (count=0;count<numofobjects;count++)
    {
    updateogg();

    if (object[count].damagedelay>0)
      object[count].damagedelay--;

    if (object[count].numofparticles!=0)
      {
      zerovector(object[count].velocity);
      for (count2=0;count2<object[count].numofparticles;count2++)
        addvectors(object[count].velocity,object[count].velocity,particle[object[count].particle[count2]].velocity);
      scalevector(object[count].velocity,object[count].velocity,1.0f/(float)object[count].numofparticles);
  
      zerovector(object[count].position);
      for (count2=0;count2<object[count].numofparticles;count2++)
        addvectors(object[count].position,object[count].position,particle[object[count].particle[count2]].position);
      scalevector(object[count].position,object[count].position,1.0f/(float)object[count].numofparticles);
      }

    objectsound(count);

    if (object[count].link!=-1)
      {
      if (object[count].lighttype==1 || object[count].lighttype==3)
        {
        if (object[object[count].link].idata[0])
          object[count].lighton=0;
        else
          object[count].lighton=1;
        }
      if (object[count].lighttype==2)
        {
        if (object[object[count].link].idata[0])
          object[count].lighton=1;
        else
          object[count].lighton=0;
        }
      }
    if (object[count].lighttype==3)
      {
      object[count].lightintensity+=((rand()&255)/255.0f-0.5f)*0.2f*object[count].lightintensitymax;
      if (object[count].lightintensity<object[count].lightintensitymax*0.5f)
        object[count].lightintensity=object[count].lightintensitymax*0.5f;
      if (object[count].lightintensity>object[count].lightintensitymax*1.5f)
        object[count].lightintensity=object[count].lightintensitymax*1.5f;
      }

    if (object[count].type==9)
    if (object[count].idata[0]==0 || object[count].idata[1]==0)
      {
      vec[1]=particle[object[count].particle[6]].position[1]-particle[object[count].particle[4]].position[1];
      vec[1]*=0.08f;
      vec[1]-=particle[object[count].particle[4]].velocity[1];
      particle[object[count].particle[4]].velocity[1]+=vec[1];

      vec[1]=particle[object[count].particle[6]].position[1]-particle[object[count].particle[5]].position[1];
      vec[1]*=0.08f;
      vec[1]-=particle[object[count].particle[5]].velocity[1];
      particle[object[count].particle[5]].velocity[1]+=vec[1];

      if (particle[object[count].particle[4]].position[1]>particle[object[count].particle[6]].position[1]-0.1f)
      if (particle[object[count].particle[5]].position[1]>particle[object[count].particle[6]].position[1]-0.1f)
        {
        if (object[count].idata[0]==1)
          playsound(14,object[count].position,NULL,0.2f,0,1.0f,-1,0);
        object[count].idata[0]=0;
        }
      if (particle[object[count].particle[4]].position[1]<particle[object[count].particle[6]].position[1]-0.2f)
      if (particle[object[count].particle[5]].position[1]<particle[object[count].particle[6]].position[1]-0.2f)
        {
        if (object[count].idata[0]==0)
          playsound(14,object[count].position,NULL,0.2f,0,1.0f,-1,0);
        object[count].idata[0]=1;
        }

      if (object[count].link!=-1)
        if (object[object[count].link].idata[0]==1)
          object[count].idata[0]=1;
      }
    if (object[count].type==9)
    if (object[count].idata[0]==1 && object[count].idata[1]==1)
      {
      vec[1]=particle[object[count].particle[6]].position[1]-0.375f-particle[object[count].particle[4]].position[1];
      vec[1]*=0.08f;
      vec[1]-=particle[object[count].particle[4]].velocity[1];
      particle[object[count].particle[4]].velocity[1]+=vec[1];

      vec[1]=particle[object[count].particle[6]].position[1]-0.375f-particle[object[count].particle[5]].position[1];
      vec[1]*=0.08f;
      vec[1]-=particle[object[count].particle[5]].velocity[1];
      particle[object[count].particle[5]].velocity[1]+=vec[1];
      }
    if (object[count].type==16)
    if (object[count].idata[0]==0 || object[count].idata[1]==0)
      {
      object[count].idata[0]=0;
      if (fabs(object[0].position[0]-object[count].position[0])<object[count].size[0]*0.5f)
      if (fabs(object[0].position[1]-object[count].position[1])<object[count].size[1]*0.5f)
        {
        object[count].idata[0]=1;
        if (object[count].idata[1]==2)
          {
          if ((rand()&3)==0)
            playsound(8,object[count].position,NULL,1.0f,0,1.0f,-1,0);
          else
            playsound(9,object[count].position,NULL,1.0f,0,1.0f,-1,0);
          game.bonus[8]++;
          }
        }
      if (level.gametype==11)
      if (fabs(object[1].position[0]-object[count].position[0])<object[count].size[0]*0.5f)
      if (fabs(object[1].position[1]-object[count].position[1])<object[count].size[1]*0.5f)
        {
        object[count].idata[0]=1;
        if (object[count].idata[1]==2)
          {
          if ((rand()&3)==0)
            playsound(8,object[count].position,NULL,1.0f,0,1.0f,-1,0);
          else
            playsound(9,object[count].position,NULL,1.0f,0,1.0f,-1,0);
          game.bonus[8]++;
          }
        }
      }
    if (object[count].type==15)
      {
      if (object[count].link==-1 || object[object[count].link].idata[0]==1)
      if ((game.framenum&255)==128)
        {
        createwheel(object[count].position,object[count].size[0],object[count].size[1],object[count].mass,0.8f,0);
        object[numofobjects-1].texturenum=object[count].texturenum;
        object[numofobjects-1].timetolive=512;
        object[numofobjects-1].link=-1;
        for (count2=0;count2<object[numofobjects-1].numofparticles;count2++)
          {
          particle[object[numofobjects-1].particle[count2]].velocity[0]=object[count].lightcolor[0]/PHYSICSCYCLE;
          particle[object[numofobjects-1].particle[count2]].velocity[1]=object[count].lightcolor[1]/PHYSICSCYCLE;
          }
        }
      }

    if (object[count].type==10)
      {
      if (object[count].rotate==0 || object[count].rotate==2)
        count3=1;
      else
        count3=0;
      for (count2=1;count2<=2;count2++)
        {
        vec[count3]=particle[object[count].particle[4]].position[count3]-particle[object[count].particle[count2]].position[count3];

        if (vec[count3]<0.0f)
          vec[count3]+=0.25f;
        else
          vec[count3]-=0.25f;

        if (vec[count3]<0.0f)
          {
          vec[2]=-0.04f;
          if (vec[2]<vec[count3])
            vec[2]=vec[count3];
          }
        else
          {
          vec[2]=0.04f;
          if (vec[2]>vec[count3])
            vec[2]=vec[count3];
          }


        vec[2]-=particle[object[count].particle[count2]].velocity[count3];

        particle[object[count].particle[count2]].velocity[count3]+=vec[2];

        if (particle[object[count].particle[count2]].position[count3]>particle[object[count].particle[4]].position[count3]+0.25f)
          particle[object[count].particle[count2]].position[count3]=particle[object[count].particle[4]].position[count3]+0.25f;
        if (particle[object[count].particle[count2]].position[count3]<particle[object[count].particle[4]].position[count3]-0.25f)
          particle[object[count].particle[count2]].position[count3]=particle[object[count].particle[4]].position[count3]-0.25f;
        }

      vec[0]=particle[object[count].particle[4]].position[count3]-particle[object[count].particle[1]].position[count3];
      if (object[count].rotate==3)
        vec[0]=-vec[0];

      if (vec[0]<-0.2f)
        {
        if (object[count].idata[0]==1)
          playsound(14,object[count].position,NULL,0.2f,0,1.0f,-1,0);
        object[count].idata[0]=0;
        }
      if (vec[0]>0.2f)
        {
        if (object[count].idata[0]==0)
          playsound(14,object[count].position,NULL,0.2f,0,1.0f,-1,0);
        object[count].idata[0]=1;
        }

      if (object[count].link!=-1)
        if (object[object[count].link].idata[0]==1)
          object[count].idata[0]=1;
      }
    if (object[count].type==1)
      {
      if (count!=0)
      if (level.gametype==0 && game.levelnum==34)
        objectai(count);

      for (count2=0;count2<16;count2++)
        {
        x=particle[object[count].particle[count2]].position[0];
        y=particle[object[count].particle[count2]].position[1];

        if (x>0 && x<254)
        if (y>0 && y<254)
          {
          if (block[level.foregrid[y][x]].density!=0.0f)
          if ((rand()&255)==0)
            {
            createparticle(5,object[count].position,object[count].velocity,0.125f*0.25f,-1,100+(rand()&63));
            particle[numofparticles-1].rendersize=0.125+(float)(rand()&127)/1000.0f;
            particle[numofparticles-1].texturenum=366;
            }
          if (block[level.foregrid[y][x]].foredamage!=0)
            object[count].hitpoints-=block[level.foregrid[y][x]].foredamage;
          if ((level.grid[y][x]>=248 && level.grid[y][x]<=255 && level.gridmod[y][x]==0) || (level.grid[y][x]>=240 && level.grid[y][x]<=247 && level.gridmod[y][x]==2))
            {
            vec[0]=(float)x+0.5f;
            vec[1]=(float)y+0.5f;
            vec[2]=0.0f;
            subtractvectors(vec2,vec,particle[object[count].particle[count2]].position);
            if (vectorlength(vec2)<0.45f)
              {
              scale=1.0f;

              if (level.grid[y][x]==251 || (level.grid[y][x]==251-8 && level.gridmod[y][x]==2))
                {
                if (game.numoflives<99 && game.difficulty!=3)
                  {
                  game.numoflives++;
                  createsprite(0,vec);
                  sprintf(sprite[numofsprites-1].text,"1UP");
                  sprite[numofsprites-1].size=14;
                  }
                else
                  {
                  game.score[0]+=1000;
                  createsprite(1000,vec);
                  }
                }
              if (level.grid[y][x]==252 || (level.grid[y][x]==252-8 && level.gridmod[y][x]==2))
                {
                if (object[count].hitpoints<900)
                  object[count].hitpoints+=100;
                else
                  object[count].hitpoints=1000;
                }
              if (level.grid[y][x]==253 || (level.grid[y][x]==253-8 && level.gridmod[y][x]==2))
                {
                if (level.gametype!=15)
                  {
                  game.score[0]+=50;
                  createsprite(50,vec);
                  }
                else
                  game.score[count]++;
                }
              if (level.grid[y][x]==254 || (level.grid[y][x]==254-8 && level.gridmod[y][x]==2))
                {
                game.score[0]+=100;
                createsprite(100,vec);
                if (game.oldschool==0)
                  scale=0.9f;
                }
              if (level.grid[y][x]==255 || (level.grid[y][x]==255-8 && level.gridmod[y][x]==2))
                {
                game.score[0]+=1000;
                createsprite(1000,vec);
                if (game.oldschool==0)
                  scale=0.8f;
                }

              if (level.grid[y][x]==252 || (level.grid[y][x]==252-8 && level.gridmod[y][x]==2))
                playsound(20,vec,NULL,0.7f,0,scale,-1,0);
              else
                playsound(10,vec,NULL,0.4f,0,scale,-1,0);

              level.gridmod[y][x]=1;

              if (level.grid[y][x]>=248 && level.grid[y][x]<=255)
                game.bonus[level.grid[y][x]-248]++;
              if (level.grid[y][x]>=240 && level.grid[y][x]<=247)
                game.bonus[level.grid[y][x]-240]++;
              }
            }
          }
        }

      count4=0;
      for (count2=0;count2<16;count2++)
      for (count3=0;count3<16;count3++)
      if (abs(count2-count3)>6)
        {
        subtractvectors(vec,particle[object[count].particle[count3]].position,particle[object[count].particle[count2]].position);
        veclength=vectorlength(vec);
        if (veclength<0.15f)
          count4++;
        //if (veclength<0.15f)
        //  object[count].hitpoints-=(0.2f-veclength)*500.0f;
        }

      if (count4>=2)
        object[count].hitpoints-=(count4-1)*50;

      if (object[count].numoforientations==0)
        copyvector(object[count].orientation[1],yaxis);
      else
        normalizevector(object[count].orientation[1],object[count].orientation[1]);
      crossproduct(object[count].orientation[0],zaxis,object[count].orientation[1]);
      normalizevector(object[count].orientation[0],object[count].orientation[0]);

      if (dotproduct(object[count].velocity,object[count].orientation[0])<-0.02f)
        object[count].direction=0;
      if (dotproduct(object[count].velocity,object[count].orientation[0])>0.02f)
        object[count].direction=1;

      angle=atan2(object[count].orientation[0][1],object[count].orientation[0][0]);
      spin=cos(angle)*fabs(cos(angle))*object[count].axis[0]+sin(angle)*fabs(sin(angle))*object[count].axis[1];

      if (spin<-1.0f)
        spin=-1.0f;
      if (spin>1.0f)
        spin=1.0f;
      if (angle<object[count].angle-pi)
        angle+=2.0f*pi;
      if (angle>object[count].angle+pi)
        angle-=2.0f*pi;
      /*
      scale=(angle-object[count].angle);
      if (scale<-0.1f)
        scale=-0.1f;
      if (scale>0.1f)
        scale=0.1f;

      object[count].angle+=scale;
      */
      object[count].angle+=(angle-object[count].angle)*0.05f;

      if (object[count].angle<0.0f)
        object[count].angle+=2.0f*pi;
      if (object[count].angle>2.0f*pi)
        object[count].angle-=2.0f*pi;

      for (count2=0;count2<16;count2++)
        {
        subtractvectors(vec,particle[object[count].particle[count2]].position,object[count].position);
        crossproduct(vec2,zaxis,vec);
        normalizevector(vec2,vec2);

        if (object[count].numoforientations!=0)
          {
          scaleaddvectors(particle[object[count].particle[count2]].velocity,particle[object[count].particle[count2]].velocity,vec2,spin*0.004f);
          }

        //if (object[count].numoforientations==0)
          {
          scaleaddvectors(particle[object[count].particle[count2]].velocity,particle[object[count].particle[count2]].velocity,xaxis,object[count].axis[0]*0.001f);
          if (object[count].axis[1]<0.0f)
            scaleaddvectors(particle[object[count].particle[count2]].velocity,particle[object[count].particle[count2]].velocity,yaxis,object[count].axis[1]*0.001f);
          else
            scaleaddvectors(particle[object[count].particle[count2]].velocity,particle[object[count].particle[count2]].velocity,yaxis,object[count].axis[1]*0.0005f);
          }
        }

      if ((object[count].button&4)==4)
        object[count].friction=0.01f;
      else
        object[count].friction=1.2f;
      if ((object[count].button&2)==2 || (object[count].button&8)==8)
        {
        for (count2=0;count2<numofbonds;count2++)
        if (bond[count2].objectnum==count && bond[count2].type==2)
          {
          bond[count2].cycles=0;
          //bond[count2].elasticity=0.02f;
          }
        }
      else
        {
        for (count2=0;count2<numofbonds;count2++)
        if (bond[count2].objectnum==count && bond[count2].type==2)
          {
          bond[count2].cycles=31;
          /*
          if ((object[count].button&4)==4)
            bond[count2].elasticity=0.005f;
          else
            bond[count2].elasticity=0.02f;
          */
          }
        }
      if ((object[count].button&8)==8)
        {
        for (count2=0;count2<object[count].numofparticles;count2++)
          {
          particle[object[count].particle[count2]].gravity=10.0f/(PHYSICSCYCLE*PHYSICSCYCLE);
          particle[object[count].particle[count2]].mass=0.5f;
          }
        }
      else
        {
        for (count2=0;count2<object[count].numofparticles;count2++)
          {
          particle[object[count].particle[count2]].gravity=4.0f/(PHYSICSCYCLE*PHYSICSCYCLE);
          particle[object[count].particle[count2]].mass=0.25f;
          }
        }
      }
    if (object[count].type==20)
      {
      subtractvectors(object[count].orientation[1],particle[object[count].particle[0]].position,particle[object[count].particle[3]].position);
      normalizevector(object[count].orientation[1],object[count].orientation[1]);
      object[count].orientation[0][0]=object[count].orientation[1][1];
      object[count].orientation[0][1]=-object[count].orientation[1][0];
      object[count].orientation[0][2]=0.0f;

      object[count].data[0]+=object[count].axis[0]*0.05f;
      if (object[count].data[0]<0.0f)
        object[count].data[0]+=0.02f;
      if (object[count].data[0]>0.0f)
        object[count].data[0]-=0.02f;
      if (object[count].data[0]<-0.5f)
        object[count].data[0]=-0.5f;
      if (object[count].data[0]>0.5f)
        object[count].data[0]=0.5f;

      object[count].data[1]+=object[count].axis[1]*0.008f;
      if ((object[count].button&2)==2)
        object[count].data[1]=0.0f;
      if (object[count].data[1]<0.0f)
        object[count].data[1]+=0.004f;
      if (object[count].data[1]>0.0f)
        object[count].data[1]-=0.004f;
      if (object[count].data[1]<-0.3f)
        object[count].data[1]=-0.3f;
      if (object[count].data[1]>0.3f)
        object[count].data[1]=0.3f;

      for (count2=0;count2<4;count2++)
        {
        copyvector(vec,particle[object[count].particle[count2]].velocity);
        if (count2==1 || count2==2)
          {
          //normal[0]=object[count].orientation[0][0]*cos(object[count].data[0])+object[count].orientation[0][1]*sin(object[count].data[0]);
          //normal[1]=object[count].orientation[1][1]*cos(object[count].data[0])-object[count].orientation[1][0]*sin(object[count].data[0]);
          scalevector(normal,object[count].orientation[0],cos(object[count].data[0]));
          scaleaddvectors(normal,normal,object[count].orientation[1],-sin(object[count].data[0]));
          calculatefriction(vec,vec2,normal,0.8f);
          subtractvectors(particle[object[count].particle[count2]].velocity,particle[object[count].particle[count2]].velocity,vec2);
          }
        else
          {
          copyvector(normal,object[count].orientation[0]);
          scaleaddvectors(vec,vec,normal,-object[count].data[1]);
          vec[2]=1.0f/PHYSICSCYCLE;
          calculatefriction(vec,vec2,zaxis,0.8f);
          vec2[2]=0.0f;
          subtractvectors(particle[object[count].particle[count2]].velocity,particle[object[count].particle[count2]].velocity,vec2);
          }
        //copyvector(particle[object[count].particle[count2]].velocity,vec);
        }

      for (count2=0;count2<4;count2++)
        {
        subtractvectors(vec,particle[object[count].particle[count2]].position,object[count].position);
        crossproduct(vec2,zaxis,vec);
        normalizevector(vec2,vec2);

        //scaleaddvectors(particle[object[count].particle[count2]].velocity,particle[object[count].particle[count2]].velocity,vec2,object[count].axis[0]*0.002f);
        //scaleaddvectors(particle[object[count].particle[count2]].velocity,particle[object[count].particle[count2]].velocity,object[count].orientation[0],object[count].axis[1]*0.003f);
        }
      }
    if (object[count].type==4)
      {
      for (count2=0;count2<4;count2++)
        {
        x=particle[object[count].particle[count2]].position[0];
        y=particle[object[count].particle[count2]].position[1];

        if (x>0 && x<254)
        if (y>0 && y<254)
          {
          if (block[level.foregrid[y][x]].foredamage!=0)
            object[count].hitpoints-=block[level.foregrid[y][x]].foredamage*4;
          }
        }
      if (object[count].hitpoints<0)
      if (object[count].timetolive>45)
        object[count].timetolive=45;

      subtractvectors(object[count].orientation[1],particle[object[count].particle[0]].position,particle[object[count].particle[3]].position);
      normalizevector(object[count].orientation[1],object[count].orientation[1]);
      object[count].orientation[0][0]=object[count].orientation[1][1];
      object[count].orientation[0][1]=-object[count].orientation[1][0];
      object[count].orientation[0][2]=0.0f;

      objectai(count);

      if (object[0].position[0]<object[count].position[0])
        object[count].direction=0;
      else
        object[count].direction=1;

      if (object[count].velocity[0]<-0.01f)
        object[count].direction=0;
      if (object[count].velocity[0]>0.01f)
        object[count].direction=1;
      if (object[count].link!=-1)
        object[object[count].link].direction=object[count].direction;

      if (dotproduct(object[count].orientation[1],yaxis)>0.7f)
      if (object[count].numoforientations!=0)
        {
        if (object[count].beasttype>=0 && object[count].beasttype<=2)
          scale=2.0f;
        if (object[count].beasttype==8 || object[count].beasttype==11)
          scale=2.0f;
        if (object[count].beasttype==16)
          scale=2.0f;
        if (object[count].beasttype>=3 && object[count].beasttype<=6)
          scale=2.0f;
        if (object[count].beasttype==9 || object[count].beasttype==10)
          scale=2.0f;
        if (object[count].beasttype==7 || object[count].beasttype==13)
          scale=1.5f;
        if (object[count].beasttype==15)
          scale=2.5f;

        if (object[count].axis[0]==-1.0f)
          {
          for (count2=0;count2<4;count2++)
          if (particle[object[count].particle[count2]].velocity[0]>-3.0f/PHYSICSCYCLE)
            particle[object[count].particle[count2]].velocity[0]-=scale/(PHYSICSCYCLE*PHYSICSCYCLE);
          }
        if (object[count].axis[0]==1.0f)
          {
          for (count2=0;count2<4;count2++)
          if (particle[object[count].particle[count2]].velocity[0]<3.0f/PHYSICSCYCLE)
            particle[object[count].particle[count2]].velocity[0]+=scale/(PHYSICSCYCLE*PHYSICSCYCLE);
          }
        }

      if (object[count].beasttype==0 || object[count].beasttype==2 || object[count].beasttype==8 || object[count].beasttype==16)
      if (object[count].numoforientations!=0)
      if ((object[count].button&2)==2)
        for (count2=0;count2<4;count2++)
          {
          if (object[count].beasttype!=8)
            scaleaddvectors(particle[object[count].particle[count2]].velocity,particle[object[count].particle[count2]].velocity,yaxis,0.08f);
          else
            scaleaddvectors(particle[object[count].particle[count2]].velocity,particle[object[count].particle[count2]].velocity,yaxis,0.12f);
          }
      if (object[count].beasttype==15)
      if (object[count].numoforientations!=0)
      if ((object[count].button&2)==2)
        for (count2=0;count2<2;count2++)
          scaleaddvectors(particle[object[count].particle[count2]].velocity,particle[object[count].particle[count2]].velocity,yaxis,0.08f);

      if (object[count].numoforientations!=0)
      if (dotproduct(object[count].orientation[1],yaxis)<0.7f)
        {
        if (object[count].orientation[1][0]<0.0f)
          spin=1.0f;
        else
          spin=-1.0f;
        for (count2=0;count2<4;count2++)
          {
          subtractvectors(vec,particle[object[count].particle[count2]].position,object[count].position);
          crossproduct(vec2,zaxis,vec);
          normalizevector(vec2,vec2);
  
          scaleaddvectors(particle[object[count].particle[count2]].velocity,particle[object[count].particle[count2]].velocity,vec2,spin*0.003f);
          }
        }
      }
    }
  }