/* Copyright (C) 2005, 2010 - Cryptic Sea This file is part of Gish. Gish is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ void renderlevelback(void) { int count,count2; int lightcount; int blocknum; int lightrange; float vec[3]; float texcoord[2]; updateogg(); for (count=view.position[1]-view.zoomy;count<=view.position[1]+view.zoomy;count++) if (count>=0 && count<256) for (count2=view.position[0]-view.zoomx;count2<=view.position[0]+view.zoomx;count2++) if (count2>=0 && count2<256) { blocknum=level.backgrid[count][count2]; if (block[blocknum].animation!=0) if (block[blocknum].animationspeed!=0) blocknum+=(game.framenum/block[blocknum].animationspeed)%block[blocknum].animation; if (!game.godmode) if (!editor.active || !editor.showgrid) if (level.grid[count][count2]!=0 && level.gridmod[count][count2]==0) if (!texture[level.grid[count][count2]].isalpha) blocknum=0; if (!game.godmode) if (!editor.active || !editor.showgrid) if (level.foregrid[count][count2]!=0) if (!texture[level.foregrid[count][count2]].isalpha) blocknum=0; if (blocknum!=0) { glBindTexture(GL_TEXTURE_2D,texture[blocknum].glname); glBegin(GL_QUADS); glColor3fv(level.ambient[0]); vec[0]=(float)count2; vec[1]=(float)count+1.0f; glTexCoord2f(0.0f,0.0f); glVertex3f(vec[0],vec[1],0.0f); vec[0]=(float)count2+1.0f; vec[1]=(float)count+1.0f; glTexCoord2f(1.0f,0.0f); glVertex3f(vec[0],vec[1],0.0f); vec[0]=(float)count2+1.0f; vec[1]=(float)count; glTexCoord2f(1.0f,1.0f); glVertex3f(vec[0],vec[1],0.0f); vec[0]=(float)count2; vec[1]=(float)count; glTexCoord2f(0.0f,1.0f); glVertex3f(vec[0],vec[1],0.0f); glEnd(); } } glBlendFunc(GL_SRC_ALPHA,GL_ONE); glEnable(GL_STENCIL_TEST); glActiveTextureARB(GL_TEXTURE1_ARB); glEnable(GL_TEXTURE_2D); glBindTexture(GL_TEXTURE_2D,texture[332].glname); glDisable(GL_TEXTURE_2D); glActiveTextureARB(GL_TEXTURE0_ARB); for (lightcount=0;lightcount=0 && count<256) for (count2=view.position[0]-view.zoomx;count2<=view.position[0]+view.zoomx;count2++) if (count2>=0 && count2<256) { blocknum=level.backgrid[count][count2]; if (block[blocknum].animation!=0) if (block[blocknum].animationspeed!=0) blocknum+=(game.framenum/block[blocknum].animationspeed)%block[blocknum].animation; if (!editor.active || !editor.showgrid) if (level.grid[count][count2]!=0 && level.gridmod[count][count2]==0) if (!texture[level.grid[count][count2]].isalpha) blocknum=0; if (!editor.active || !editor.showgrid) if (level.foregrid[count][count2]!=0) if (!texture[level.foregrid[count][count2]].isalpha) blocknum=0; lightrange=frame.light[lightcount].intensity*0.5f; if ((count2-frame.light[lightcount].position[0])>lightrange+1) blocknum=0; if ((count-frame.light[lightcount].position[1])>lightrange+1) blocknum=0; if (blocknum!=0) { glBindTexture(GL_TEXTURE_2D,texture[blocknum].glname); glActiveTextureARB(GL_TEXTURE1_ARB); glEnable(GL_TEXTURE_2D); glBegin(GL_QUADS); glColor3fv(frame.light[lightcount].color); vec[0]=(float)count2; vec[1]=(float)count+1.0f; glMultiTexCoord2fARB(GL_TEXTURE0_ARB,0.0f,0.0f); setuplighttexcoord(lightcount,vec); glVertex3f(vec[0],vec[1],0.0f); vec[0]=(float)count2+1.0f; vec[1]=(float)count+1.0f; glMultiTexCoord2fARB(GL_TEXTURE0_ARB,1.0f,0.0f); setuplighttexcoord(lightcount,vec); glVertex3f(vec[0],vec[1],0.0f); vec[0]=(float)count2+1.0f; vec[1]=(float)count; glMultiTexCoord2fARB(GL_TEXTURE0_ARB,1.0f,1.0f); setuplighttexcoord(lightcount,vec); glVertex3f(vec[0],vec[1],0.0f); vec[0]=(float)count2; vec[1]=(float)count; glMultiTexCoord2fARB(GL_TEXTURE0_ARB,0.0f,1.0f); setuplighttexcoord(lightcount,vec); glVertex3f(vec[0],vec[1],0.0f); glEnd(); glDisable(GL_TEXTURE_2D); glActiveTextureARB(GL_TEXTURE0_ARB); } } } glDisable(GL_STENCIL_TEST); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); } void renderlevel(void) { int count,count2,count3; int lightcount; int blocknum; int lightrange; float vec[3],vec2[3],vec3[3]; float normal[3]; float scale; updateogg(); for (count=view.position[1]-view.zoomy;count<=view.position[1]+view.zoomy;count++) if (count>=0 && count<256) for (count2=view.position[0]-view.zoomx;count2<=view.position[0]+view.zoomx;count2++) if (count2>=0 && count2<256) { blocknum=level.grid[count][count2]; if (block[blocknum].animation!=0) if (block[blocknum].animationspeed!=0) blocknum+=(game.framenum/block[blocknum].animationspeed)%block[blocknum].animation; if (level.gridmod[count][count2]==1) blocknum=0; if (blocknum>=240 && blocknum<248) if (level.gridmod[count][count2]==2) blocknum+=8; if (!editor.active || !editor.showgrid) if (level.foregrid[count][count2]!=0) if (!texture[level.foregrid[count][count2]].isalpha) blocknum=0; if (blocknum!=0) { glBindTexture(GL_TEXTURE_2D,texture[blocknum].glname); glBegin(GL_QUADS); glColor3fv(level.ambient[1]); vec[0]=(float)count2; vec[1]=(float)count+1.0f; glTexCoord2f(0.0f,0.0f); glVertex3f(vec[0],vec[1],0.0f); vec[0]=(float)count2+1.0f; vec[1]=(float)count+1.0f; glTexCoord2f(1.0f,0.0f); glVertex3f(vec[0],vec[1],0.0f); vec[0]=(float)count2+1.0f; vec[1]=(float)count; glTexCoord2f(1.0f,1.0f); glVertex3f(vec[0],vec[1],0.0f); vec[0]=(float)count2; vec[1]=(float)count; glTexCoord2f(0.0f,1.0f); glVertex3f(vec[0],vec[1],0.0f); glEnd(); /* if (block[blocknum].friction<0.1f) { glDisable(GL_TEXTURE_2D); for (count3=0;count3>count3)&1)==0) { normal[0]=-(block[blocknum].line[count3][3]-block[blocknum].line[count3][1]); normal[1]=(block[blocknum].line[count3][2]-block[blocknum].line[count3][0]); normal[2]=0.0f; normalizevector(normal,normal); glBegin(GL_QUADS); glColor4f(0.25f,0.25f,0.25f,1.0f); vec[0]=(float)count2+block[blocknum].line[count3][0]; vec[1]=(float)count+block[blocknum].line[count3][1]; vec[2]=0.0f; glVertex3fv(vec); vec[0]=(float)count2+block[blocknum].line[count3][2]; vec[1]=(float)count+block[blocknum].line[count3][3]; vec[2]=0.0f; glVertex3fv(vec); glColor4f(0.25f,0.25f,0.25f,0.0f); vec[0]=(float)count2+block[blocknum].line[count3][2]-normal[0]*0.125f*0.5f; vec[1]=(float)count+block[blocknum].line[count3][3]-normal[1]*0.125f*0.5f; vec[2]=0.0f; glVertex3fv(vec); vec[0]=(float)count2+block[blocknum].line[count3][0]-normal[0]*0.125f*0.5f; vec[1]=(float)count+block[blocknum].line[count3][1]-normal[1]*0.125f*0.5f; vec[2]=0.0f; glVertex3fv(vec); glEnd(); } glEnable(GL_TEXTURE_2D); } */ } } glBlendFunc(GL_ONE,GL_ONE); glEnable(GL_STENCIL_TEST); for (lightcount=0;lightcount=0 && count<256) for (count2=view.position[0]-view.zoomx;count2<=view.position[0]+view.zoomx;count2++) if (count2>=0 && count2<256) { blocknum=level.grid[count][count2]; if (block[blocknum].animation!=0) if (block[blocknum].animationspeed!=0) blocknum+=(game.framenum/block[blocknum].animationspeed)%block[blocknum].animation; if (level.gridmod[count][count2]==1) blocknum=0; if (blocknum>=240 && blocknum<248) if (level.gridmod[count][count2]==2) blocknum+=8; if (!editor.active || !editor.showgrid) if (level.foregrid[count][count2]!=0) if (!texture[level.foregrid[count][count2]].isalpha) blocknum=0; lightrange=frame.light[lightcount].intensity*0.5f; if ((count2-frame.light[lightcount].position[0])>lightrange+1) blocknum=0; if ((count-frame.light[lightcount].position[1])>lightrange+1) blocknum=0; if (blocknum!=0) { glBindTexture(GL_TEXTURE_2D,texture[blocknum].glname); for (count3=0;count3>count3)&1)==0) { normal[0]=-(block[blocknum].line[count3][3]-block[blocknum].line[count3][1]); normal[1]=(block[blocknum].line[count3][2]-block[blocknum].line[count3][0]); normal[2]=0.0f; normalizevector(normal,normal); glBegin(GL_QUADS); vec[0]=(float)count2+block[blocknum].line[count3][0]; vec[1]=(float)count+block[blocknum].line[count3][1]; vec[2]=0.0f; subtractvectors(vec2,frame.light[lightcount].position,vec); normalizevector(vec3,vec2); scale=frame.light[lightcount].intensity*dotproduct(vec3,normal)/(vec2[0]*vec2[0]+vec2[1]*vec2[1]); scalevector(vec2,frame.light[lightcount].color,scale); glColor3fv(vec2); glTexCoord2f(block[blocknum].line[count3][0],1.0f-block[blocknum].line[count3][1]); glVertex3f(vec[0],vec[1],0.0f); vec[0]=(float)count2+block[blocknum].line[count3][2]; vec[1]=(float)count+block[blocknum].line[count3][3]; vec[2]=0.0f; subtractvectors(vec2,frame.light[lightcount].position,vec); normalizevector(vec3,vec2); scale=frame.light[lightcount].intensity*dotproduct(vec3,normal)/(vec2[0]*vec2[0]+vec2[1]*vec2[1]); scalevector(vec2,frame.light[lightcount].color,scale); glColor3fv(vec2); glTexCoord2f(block[blocknum].line[count3][2],1.0f-block[blocknum].line[count3][3]); glVertex3f(vec[0],vec[1],0.0f); vec[0]=(float)count2+block[blocknum].line[count3][2]-normal[0]*0.125f; vec[1]=(float)count+block[blocknum].line[count3][3]-normal[1]*0.125f; glColor3f(0.0f,0.0f,0.0f); glTexCoord2f((block[blocknum].line[count3][2]-normal[0]*0.125f),1.0f-(block[blocknum].line[count3][3]-normal[1]*0.125f)); glVertex3f(vec[0],vec[1],0.0f); vec[0]=(float)count2+block[blocknum].line[count3][0]-normal[0]*0.125f; vec[1]=(float)count+block[blocknum].line[count3][1]-normal[1]*0.125f; glColor3f(0.0f,0.0f,0.0f); glTexCoord2f((block[blocknum].line[count3][0]-normal[0]*0.125f),1.0f-(block[blocknum].line[count3][1]-normal[1]*0.125f)); glVertex3f(vec[0],vec[1],0.0f); glEnd(); } } } } glDisable(GL_STENCIL_TEST); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); } void renderlevelfore(void) { int count,count2; int blocknum; float vec[3]; updateogg(); for (count=view.position[1]-view.zoomy;count<=view.position[1]+view.zoomy;count++) if (count>=0 && count<256) for (count2=view.position[0]-view.zoomx;count2<=view.position[0]+view.zoomx;count2++) if (count2>=0 && count2<256) { blocknum=level.foregrid[count][count2]; if (block[blocknum].animation!=0) if (block[blocknum].animationspeed!=0) blocknum+=(game.framenum/block[blocknum].animationspeed)%block[blocknum].animation; if (blocknum!=0) { glBindTexture(GL_TEXTURE_2D,texture[blocknum].glname); glBegin(GL_QUADS); glColor3fv(level.ambient[2]); vec[0]=(float)count2; vec[1]=(float)count+1.0f; glTexCoord2f(0.0f,0.0f); glVertex3f(vec[0],vec[1],0.0f); vec[0]=(float)count2+1.0f; vec[1]=(float)count+1.0f; glTexCoord2f(1.0f,0.0f); glVertex3f(vec[0],vec[1],0.0f); vec[0]=(float)count2+1.0f; vec[1]=(float)count; glTexCoord2f(1.0f,1.0f); glVertex3f(vec[0],vec[1],0.0f); vec[0]=(float)count2; vec[1]=(float)count; glTexCoord2f(0.0f,1.0f); glVertex3f(vec[0],vec[1],0.0f); glEnd(); } } } void renderbonds(void) { int count; float vec[3]; glDisable(GL_TEXTURE_2D); glBegin(GL_LINES); glColor4f(0.0f,1.0f,0.0f,1.0f); for (count=0;count>1)+vec[0]*(windowinfo.resolutionx>>1); count=(windowinfo.resolutiony>>1)+vec[1]*(windowinfo.resolutionx>>1); count2-=64; count-=64; if (count2<0) count2=0; if (count<0) count=0; if (count2>windowinfo.resolutionx-128) count2=windowinfo.resolutionx-128; if (count>windowinfo.resolutiony-128) count=windowinfo.resolutiony-128; glBindTexture(GL_TEXTURE_2D,texture[331].glname); glCopyTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,count2,count,128,128,0); glBlendFunc(GL_ONE,GL_ZERO); //glDisable(GL_ALPHA_TEST); glBindTexture(GL_TEXTURE_2D,texture[331].glname); glBegin(GL_TRIANGLES); glColor3f(0.75f,0.75f,0.75f); for (count2=0;count2<32;count2++) { subtractvectors(vec2,objectrender[objectnum].vertex[count2],object[objectrender[objectnum].objectnum].position); normalizevector(vec2,vec2); glTexCoord2f(0.5f+vec2[0]*0.3f,0.5f+vec2[1]*0.3f); glVertex3fv(objectrender[objectnum].vertex[count2]); subtractvectors(vec2,objectrender[objectnum].vertex[((count2+1)&31)],object[objectrender[objectnum].objectnum].position); normalizevector(vec2,vec2); glTexCoord2f(0.5f+vec2[0]*0.3f,0.5f+vec2[1]*0.3f); glVertex3fv(objectrender[objectnum].vertex[((count2+1)&31)]); glTexCoord2f(0.5f,0.5f); glVertex3fv(objectrender[objectnum].vertex[32]); } glEnd(); /* for (count=0;count<16;count++) { glBegin(GL_TRIANGLES); glColor3f(0.5f,0.5f,0.5f); subtractvectors(vec2,particle[object[objectnum].particle[count]].position,object[objectnum].position); normalizevector(vec2,vec2); glTexCoord2f(0.5f+vec2[0]*0.3f,0.5f+vec2[1]*0.3f); glVertex3fv(particle[object[objectnum].particle[count]].position); subtractvectors(vec2,particle[object[objectnum].particle[((count+1)&15)]].position,object[objectnum].position); normalizevector(vec2,vec2); glTexCoord2f(0.5f+vec2[0]*0.3f,0.5f+vec2[1]*0.3f); glVertex3fv(particle[object[objectnum].particle[((count+1)&15)]].position); glTexCoord2f(0.5f,0.5f); glVertex3fv(object[objectnum].position); glEnd(); } */ //glEnable(GL_ALPHA_TEST); glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); } void setuplighttexcoord(int lightcount,float position[3]) { float texcoord[2]; texcoord[0]=(position[0]-frame.light[lightcount].position[0])/frame.light[lightcount].intensity+0.5f; texcoord[1]=(position[1]-frame.light[lightcount].position[1])/frame.light[lightcount].intensity+0.5f; glMultiTexCoord2fARB(GL_TEXTURE1_ARB,texcoord[0],texcoord[1]); } float calclight(int lightcount,float position[3],float normal[3]) { float vec[3],vec2[3]; float scale; subtractvectors(vec,frame.light[lightcount].position,position); normalizevector(vec2,vec); scale=frame.light[lightcount].intensity*dotproduct(vec2,normal)/(vec[0]*vec[0]+vec[1]*vec[1]); return(scale); } void renderparticles(void) { int count; float vec[3]; float alpha; for (count=0;count>lightcount)&1)==1) { glStencilMask((1<>1); vec[0]+=(float)(640>>1); vec[1]*=(float)(640>>1); vec[1]=(float)(480>>1)-vec[1]; x=vec[0]; y=vec[1]; drawtext(sprite[count].text,(x|TEXT_CENTER),(y|TEXT_CENTER),sprite[count].size,sprite[count].red,sprite[count].green,sprite[count].blue,sprite[count].alpha); } }