void Weapon::FindRotationGun(XYZ start, XYZ target) { XYZ temppoint1, temppoint2, tempforward; float distance; temppoint1 = start; temppoint2 = target; distance = findDistance(temppoint1, temppoint2); gunrotate2 = asin((temppoint1.y - temppoint2.y) / distance) * RAD2DEG; temppoint1.y = 0; temppoint2.y = 0; gunrotate1 = acos((temppoint1.z - temppoint2.z) / findDistance(temppoint1, temppoint2)) * RAD2DEG; if(temppoint1.x > temppoint2.x) gunrotate1 = 360 - gunrotate1; tempforward = target - start; tempforward = DoRotation(tempforward, -90, 0, 0); tempforward = DoRotation(tempforward, 0, gunrotate1 - 90, 0); tempforward = DoRotation(tempforward, 0, 0, gunrotate2 - 90); tempforward.y = 0; Normalise(&tempforward); gunrotate3 = acos(0 - tempforward.z) * RAD2DEG; if(0 > tempforward.x) gunrotate3 = 360 - gunrotate3; }
void Controls::Update(CSceneManager2D* sm, std::vector<GameObject*> &levelAssets, bool ml_state, bool mr_state, float dt, bool guiOnly) { this->mL_state = ml_state; this->mR_state = mr_state; ball = levelAssets[0]; key = ""; if (Application::IsKeyPressed('1') && m_GUI->GetToolCount()[0]) key = "1"; else if (Application::IsKeyPressed('2') && m_GUI->GetToolCount()[1]) key = "2"; else if (Application::IsKeyPressed('3') && m_GUI->GetToolCount()[2]) key = "3"; if (key != "") mL_state = true; cursor->Update(dt, mL_state || mR_state); //MouseLeft Vector2 mousePos(cursor->GetCursPos().x, cursor->GetCursPos().y ); if (!guiOnly) { //States switch (c_state) { case SELECTION:// check g_obj and GUI GetSelection(levelAssets, mousePos); break; case PLACEMENT: GetPlacement(levelAssets, mousePos); break; case ROTATION: DoRotation(levelAssets, mousePos, dt); break; } } else { GetSelection(mousePos); } }
void Sprites::Draw() { static int i,j,k; static float M[16]; static XYZ point; static float distancemult; static int lasttype; static int lastspecial; static int whichpatchx,whichpatchz; static XYZ start,end,colpoint; static bool check; static bool blend; static float tempmult; static XYZ difference; static float lightcolor[3]; static float viewdistsquared=viewdistance*viewdistance; static XYZ tempviewer; tempviewer=viewer+viewerfacing*6; check=0; lightcolor[0]=light.color[0]*.5+light.ambient[0]; lightcolor[1]=light.color[1]*.5+light.ambient[1]; lightcolor[2]=light.color[2]*.5+light.ambient[2]; checkdelay-=multiplier*10; if(checkdelay<=0){ check=1; checkdelay=1; } lasttype=-1; lastspecial=-1; glEnable(GL_BLEND); glDisable(GL_LIGHTING); glDisable(GL_CULL_FACE); glEnable(GL_TEXTURE_2D); blend = 1; glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); glDepthMask(0); glAlphaFunc(GL_GREATER, 0.0001); for(i=0;i<numsprites;i++){ if(type[i]==cloudsprite&&lasttype!=type[i]){ glBindTexture( GL_TEXTURE_2D, cloudtexture); if(!blend){ blend=1; glAlphaFunc(GL_GREATER, 0.0001); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); } } if(type[i]==cloudimpactsprite&&lasttype!=type[i]){ glBindTexture( GL_TEXTURE_2D, cloudimpacttexture); if(!blend){ blend=1; glAlphaFunc(GL_GREATER, 0.0001); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); } } if(type[i]==breathsprite&&lasttype!=type[i]){ glBindTexture( GL_TEXTURE_2D, cloudimpacttexture); if(!blend){ blend=1; glAlphaFunc(GL_GREATER, 0.0001); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); } } if(type[i]==smoketype&&lasttype!=type[i]){ glBindTexture( GL_TEXTURE_2D, smoketexture); if(!blend){ blend=1; glAlphaFunc(GL_GREATER, 0.0001); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); } } if(type[i]==bloodsprite&&lasttype!=type[i]){ glBindTexture( GL_TEXTURE_2D, bloodtexture); if(!blend){ blend=1; glAlphaFunc(GL_GREATER, 0.0001); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); } } if(type[i]==splintersprite&&(lasttype!=type[i]||lastspecial!=special[i])){ if(special[i]==0)glBindTexture( GL_TEXTURE_2D, splintertexture); if(special[i]==1)glBindTexture( GL_TEXTURE_2D, leaftexture); if(special[i]==2)glBindTexture( GL_TEXTURE_2D, snowflaketexture); if(special[i]==3)glBindTexture( GL_TEXTURE_2D, toothtexture); if(!blend){ blend=1; glAlphaFunc(GL_GREATER, 0.0001); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); } } if(type[i]==snowsprite&&lasttype!=type[i]){ glBindTexture( GL_TEXTURE_2D, snowflaketexture); if(!blend){ blend=1; glAlphaFunc(GL_GREATER, 0.0001); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); } } if(type[i]==weaponshinesprite&&lasttype!=type[i]){ glBindTexture( GL_TEXTURE_2D, shinetexture); if(blend){ blend=0; glAlphaFunc(GL_GREATER, 0.001); glBlendFunc(GL_SRC_ALPHA,GL_ONE); } } if((type[i]==flamesprite||type[i]==weaponflamesprite)&&lasttype!=type[i]){ glBindTexture( GL_TEXTURE_2D, flametexture); if(blend||lasttype==bloodflamesprite){ blend=0; glAlphaFunc(GL_GREATER, 0.3); glBlendFunc(GL_SRC_ALPHA,GL_ONE); } } if((type[i]==bloodflamesprite)&&lasttype!=type[i]){ glBindTexture( GL_TEXTURE_2D, bloodflametexture); if(blend){ blend=0; glAlphaFunc(GL_GREATER, 0.3); glBlendFunc(GL_ONE,GL_ZERO); //glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); } } if(type[i]!=snowsprite)distancemult=(viewdistsquared-(findDistancefast(&viewer,&position[i])-(viewdistsquared*fadestart))*(1/(1-fadestart)))/viewdistsquared; if(type[i]==snowsprite)distancemult=(144-(findDistancefast(&tempviewer,&position[i])-(144*fadestart))*(1/(1-fadestart)))/144; if(type[i]!=flamesprite){ if(distancemult>=1)glColor4f(color[i][0]*lightcolor[0],color[i][1]*lightcolor[1],color[i][2]*lightcolor[2],opacity[i]); if(distancemult<1)glColor4f(color[i][0]*lightcolor[0],color[i][1]*lightcolor[1],color[i][2]*lightcolor[2],opacity[i]*distancemult); } if(type[i]==flamesprite){ if(distancemult>=1)glColor4f(color[i][0],color[i][1],color[i][2],opacity[i]); if(distancemult<1)glColor4f(color[i][0],color[i][1],color[i][2],opacity[i]*distancemult); } lasttype=type[i]; lastspecial=special[i]; glMatrixMode(GL_MODELVIEW); // Select The Modelview Matrix glPushMatrix(); glTranslatef(position[i].x,position[i].y,position[i].z); if((type[i]==flamesprite||type[i]==weaponflamesprite||type[i]==weaponshinesprite)){ difference=viewer-position[i]; Normalise(&difference); glTranslatef(difference.x*size[i]/4, difference.y*size[i]/4, difference.z*size[i]/4); } if(type[i]==snowsprite){ glRotatef(rotation[i]*.2,0,.3,1); glTranslatef(1,0,0); } glGetFloatv(GL_MODELVIEW_MATRIX,M); point.x=M[12]; point.y=M[13]; point.z=M[14]; glLoadIdentity(); glTranslatef(point.x, point.y, point.z); glRotatef(rotation[i],0,0,1); if((type[i]==flamesprite||type[i]==weaponflamesprite||type[i]==weaponshinesprite||type[i]==bloodflamesprite)){ if(alivetime[i]<.14)glScalef(alivetime[i]/.14,alivetime[i]/.14,alivetime[i]/.14); } if(type[i]==smoketype||type[i]==snowsprite||type[i]==weaponshinesprite||type[i]==breathsprite){ if(alivetime[i]<.3){ if(distancemult>=1)glColor4f(color[i][0]*lightcolor[0],color[i][1]*lightcolor[1],color[i][2]*lightcolor[2],opacity[i]*alivetime[i]/.3); if(distancemult<1)glColor4f(color[i][0]*lightcolor[0],color[i][1]*lightcolor[1],color[i][2]*lightcolor[2],opacity[i]*distancemult*alivetime[i]/.3); } } if(type[i]==splintersprite&&special[i]>0&&special[i]!=3){ if(alivetime[i]<.2){ if(distancemult>=1)glColor4f(color[i][0]*lightcolor[0],color[i][1]*lightcolor[1],color[i][2]*lightcolor[2],alivetime[i]/.2); if(distancemult<1)glColor4f(color[i][0]*lightcolor[0],color[i][1]*lightcolor[1],color[i][2]*lightcolor[2],distancemult*alivetime[i]/.2); } else{ if(distancemult>=1)glColor4f(color[i][0]*lightcolor[0],color[i][1]*lightcolor[1],color[i][2]*lightcolor[2],1); if(distancemult<1)glColor4f(color[i][0]*lightcolor[0],color[i][1]*lightcolor[1],color[i][2]*lightcolor[2],1); } } if(type[i]==splintersprite&&(special[i]==0||special[i]==3)){ if(distancemult>=1)glColor4f(color[i][0]*lightcolor[0],color[i][1]*lightcolor[1],color[i][2]*lightcolor[2],1); if(distancemult<1)glColor4f(color[i][0]*lightcolor[0],color[i][1]*lightcolor[1],color[i][2]*lightcolor[2],1); } /* if(type[i]==snowsprite){ glRotatef(rotation[i],0,0,1); glTranslatef(1,0,0); }*/ glBegin(GL_TRIANGLES); glTexCoord2f(1.0f, 1.0f); glVertex3f( .5*size[i], .5*size[i], 0.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-.5*size[i], .5*size[i], 0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( .5*size[i],-.5*size[i], 0.0f); glTexCoord2f(0.0f, 0.0f); glVertex3f(-.5*size[i],-.5*size[i], 0.0f); glTexCoord2f(1.0f, 0.0f); glVertex3f( .5*size[i], -.5*size[i], 0.0f); glTexCoord2f(0.0f, 1.0f); glVertex3f(-.5*size[i], .5*size[i], 0.0f); glEnd(); glPopMatrix(); } tempmult=multiplier; for(i=numsprites-1;i>=0;i--){ multiplier=tempmult; if(type[i]!=snowsprite)position[i]+=velocity[i]*multiplier; if(type[i]!=snowsprite)velocity[i]+=windvector*multiplier; if(type[i]==flamesprite||type[i]==smoketype)position[i]+=windvector*multiplier/2; if((type[i]==flamesprite||type[i]==weaponflamesprite||type[i]==weaponshinesprite||type[i]==bloodflamesprite))multiplier*=speed[i]*.7; alivetime[i]+=multiplier; if(type[i]==cloudsprite||type[i]==cloudimpactsprite){ opacity[i]-=multiplier/2; size[i]+=multiplier/2; velocity[i].y+=gravity*multiplier*.25; } if(type[i]==breathsprite){ opacity[i]-=multiplier/2; size[i]+=multiplier/2; if(findLength(&velocity[i])<=multiplier)velocity[i]=0; else{ XYZ slowdown; slowdown=velocity[i]*-1; Normalise(&slowdown); slowdown*=multiplier; velocity[i]+=slowdown; } } if(type[i]==snowsprite){ size[i]-=multiplier/120; rotation[i]+=multiplier*360; position[i].y-=multiplier; position[i]+=windvector*multiplier; if(position[i].y<tempviewer.y-6)position[i].y+=12; if(position[i].y>tempviewer.y+6)position[i].y-=12; if(position[i].z<tempviewer.z-6)position[i].z+=12; if(position[i].z>tempviewer.z+6)position[i].z-=12; if(position[i].x<tempviewer.x-6)position[i].x+=12; if(position[i].x>tempviewer.x+6)position[i].x-=12; } if(type[i]==bloodsprite){ bool spritehit=0; rotation[i]+=multiplier*100; velocity[i].y+=gravity*multiplier; if(check){ XYZ where,startpoint,endpoint,movepoint,footpoint; float rotationpoint; int whichtri; for(j=0;j<numplayers;j++){ if(!spritehit&&player[j].dead&&alivetime[i]>.1){ where=oldposition[i]; where-=player[j].coords; if(!player[j].skeleton.free)where=DoRotation(where,0,-player[j].rotation,0); startpoint=where; where=position[i]; where-=player[j].coords; if(!player[j].skeleton.free)where=DoRotation(where,0,-player[j].rotation,0); endpoint=where; movepoint=0; rotationpoint=0; whichtri=player[j].skeleton.drawmodel.LineCheck(&startpoint,&endpoint, &footpoint, &movepoint, &rotationpoint); if(whichtri!=-1){ spritehit=1; player[j].DoBloodBigWhere(0,160,oldposition[i]); DeleteSprite(i); } } } whichpatchx=position[i].x/(terrain.size/subdivision*terrain.scale*terraindetail); whichpatchz=position[i].z/(terrain.size/subdivision*terrain.scale*terraindetail); if(whichpatchx>0&&whichpatchz>0&&whichpatchx<subdivision&&whichpatchz<subdivision) if(terrain.patchobjectnum[whichpatchx][whichpatchz]){ if(!spritehit) for(j=0;j<terrain.patchobjectnum[whichpatchx][whichpatchz];j++){ k=terrain.patchobjects[whichpatchx][whichpatchz][j]; start=oldposition[i]; end=position[i]; if(!spritehit) if(objects.model[k].LineCheck(&start,&end,&colpoint,&objects.position[k],&objects.rotation[k])!=-1){ if(detail==2||(detail==1&&abs(Random()%4)==0)||(detail==0&&abs(Random()%8)==0))objects.model[k].MakeDecal(blooddecalfast,DoRotation(colpoint-objects.position[k],0,-objects.rotation[k],0),size[i]*1.6/*+abs((float)(Random()%100))/2400*/,.5,Random()%360); DeleteSprite(i); spritehit=1; } } } if(!spritehit) if(position[i].y<terrain.getHeight(position[i].x,position[i].z)){ terrain.MakeDecal(blooddecalfast,position[i],size[i]*1.6/*+abs((float)(Random()%100))/2400*/,.6,Random()%360); DeleteSprite(i); } } } if(type[i]==splintersprite){ rotation[i]+=rotatespeed[i]*multiplier; opacity[i]-=multiplier/2; if(special[i]==0||special[i]==2||special[i]==3)velocity[i].y+=gravity*multiplier; if(special[i]==1)velocity[i].y+=gravity*multiplier*.5; } if(type[i]==flamesprite||type[i]==weaponflamesprite||type[i]==weaponshinesprite||type[i]==bloodflamesprite){ rotation[i]+=multiplier*rotatespeed[i]; opacity[i]-=multiplier*5/4; if(type[i]!=weaponshinesprite&&type[i]!=bloodflamesprite) if(opacity[i]<.5&&opacity[i]+multiplier*5/4>=.5&&(abs(Random()%4)==0||(initialsize[i]>2&&Random()%2==0)))MakeSprite(smoketype, position[i],velocity[i], .9,.9,.6, size[i]*1.2, .4); if(alivetime[i]>.14&&(type[i]==flamesprite)){ velocity[i]=0; velocity[i].y=1.5; } } /*if(type[i]==smoketype){ opacity[i]-=multiplier/3/initialsize[i]; size[i]+=multiplier; velocity[i]=0; velocity[i].y=1.5; rotation[i]+=multiplier*rotatespeed[i]/5; }*/ if(type[i]==smoketype){ opacity[i]-=multiplier/3/initialsize[i]; color[i][0]-=multiplier; color[i][1]-=multiplier; color[i][2]-=multiplier; if(color[i][0]<.6)color[i][0]=.6; if(color[i][1]<.6)color[i][1]=.6; if(color[i][2]<.6)color[i][2]=.6; size[i]+=multiplier; velocity[i]=0; velocity[i].y=1.5; rotation[i]+=multiplier*rotatespeed[i]/5; } if(opacity[i]<=0||size[i]<=0)DeleteSprite(i); } if(check) for(i=numsprites-1;i>=0;i--){ oldposition[i]=position[i]; } glAlphaFunc(GL_GREATER, 0.0001); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); }