vec2 Tile2D_Update_CheckMove(Tile2D_Entity *self, vec2 dir, float dt) { Tile2D_Entity *lst; vec2 org, org1; float f, g; char *s, *s1; // bt2d_cam->org[0]=v2x(self->org); // bt2d_cam->org[2]=v2y(self->org); s=Tile2D_TexNameForBox( v2x(self->org)+0.5, v2y(self->org), 1, 2); if(!s) { self->vel=v2add(self->vel, vec2(0, -dt*10)); // tile2d_player_y-=bt2d_state->dt_f*10; }else { f=1.0-dt; if(f<0)f=0; if(v2y(self->vel)<0) { self->vel= vec2(v2x(self->vel)*f, 0); }else { self->vel= vec2(v2x(self->vel)*f, v2y(self->vel)); } } org1=v2addscale(self->org, self->vel, dt); s1=Tile2D_TexNameForBox( v2x(org1)+0.5, v2y(org1)+0.2, 1, 1.75); if(s1) { self->vel=vec2(0, v2y(self->vel)); if(v2y(tile2d_player->vel)<0) { self->vel=vec2(v2x(self->vel), 0); } } lst=Tile2D_Entity_QueryMoveCollide(self, org1, TILE2D_QFL_SKIPNONSOLID); if(lst) { self->vel=vec2(0, 0); } org=v2addscale( self->org, self->vel, dt); return(org); }
bool Tile2D_CheckBoxBox( vec2 amins, vec2 amaxs, vec2 bmins, vec2 bmaxs) { if(v2x(amaxs)<v2x(bmins)) return(false); if(v2x(bmaxs)<v2x(amins)) return(false); if(v2y(amaxs)<v2y(bmins)) return(false); if(v2y(bmaxs)<v2y(amins)) return(false); return(true); }
vec2 Tile2D_Update_CheckMoveFly(Tile2D_Entity *self, float dt) { Tile2D_Entity *lst; vec2 org, org1; float f, g; char *s, *s1; self->other=NULL; s=Tile2D_TexNameForBox( v2x(self->org)+0.5, v2y(self->org), 1, 2); if(s) { self->flags|=TILE2D_EFL_BLOCKED; return(self->org); } org1=v2addscale( self->org, self->vel, dt); lst=Tile2D_Entity_QueryMoveCollide(self, org1, TILE2D_QFL_SKIPOWNER|TILE2D_QFL_SKIPNONSOLID); if(lst) { self->flags|=TILE2D_EFL_BLOCKED; self->other=lst; return(self->org); } org=v2addscale( self->org, self->vel, dt); return(org); }
// The three vectors from aAx1 to the other three atoms can be thought // of as the basis for a coordinate system. We would like that // coordinate system to be right handed, and we return true if that is // the case. If not, swapping aSa and aSb would form a right hand // system. static int isExpectedTwist(struct part *p, struct atom *aAx1, struct atom *aAx2, struct atom *aSa, struct atom *aSb) { struct xyz v0; struct xyz v1; struct xyz v2; struct xyz v3; struct xyz v1_x_v2; if (aAx1->virtualConstructionAtoms || aAx2->virtualConstructionAtoms || aSa->virtualConstructionAtoms || aSb->virtualConstructionAtoms) { return 0; } v0 = p->positions[aAx1->index]; v1 = p->positions[aAx2->index]; v2 = p->positions[aSa->index]; v3 = p->positions[aSb->index]; vsub(v1, v0); vsub(v2, v0); vsub(v3, v0); v2x(v1_x_v2, v1, v2); return vdot(v1_x_v2, v3) > 0.0; }
void Tile2D_DrawEntity_Sprite(Tile2D_Entity *self) { float pt[8]; float x, y, xs, ys, xc, yc; float f, g, h; int i, j, k; if(self->spr_tex<=0) return; x=v2x(self->org); y=v2y(self->org); xs=v2x(self->spr_size); ys=v2y(self->spr_size); xc=v2x(self->spr_center); yc=v2y(self->spr_center); LBXGL_Shader_BindTexture(self->spr_tex); x=x-xc; y=y-yc; pt[0]=x; pt[1]=y; pt[2]=x+xs; pt[3]=y; pt[4]=x+xs; pt[5]=y+ys; pt[6]=x; pt[7]=y+ys; h=self->spr_angle*(128/M_PI); for(i=0; i<4; i++) { f=cos(h)*pt[i*2+0]+sin(h)*pt[i*2+1]; g=-sin(h)*pt[i*2+0]+cos(h)*pt[i*2+1]; pt[i*2+0]=f; pt[i*2+1]=g; } // x=0; y=5; if(v2x(self->vel)>=0) { LBXGL_Shader_Begin(PDGL_QUADS); LBXGL_Shader_TexCoord2f(1, 0); LBXGL_Shader_Vertex3f(pt[0], 0, pt[1]); LBXGL_Shader_TexCoord2f(0, 0); LBXGL_Shader_Vertex3f(pt[2], 0, pt[3]); LBXGL_Shader_TexCoord2f(0, 1); LBXGL_Shader_Vertex3f(pt[4], 0, pt[5]); LBXGL_Shader_TexCoord2f(1, 1); LBXGL_Shader_Vertex3f(pt[6], 0, pt[7]); LBXGL_Shader_End(); }else { LBXGL_Shader_Begin(PDGL_QUADS); LBXGL_Shader_TexCoord2f(0, 0); LBXGL_Shader_Vertex3f(pt[0], 0, pt[1]); LBXGL_Shader_TexCoord2f(1, 0); LBXGL_Shader_Vertex3f(pt[2], 0, pt[3]); LBXGL_Shader_TexCoord2f(1, 1); LBXGL_Shader_Vertex3f(pt[4], 0, pt[5]); LBXGL_Shader_TexCoord2f(0, 1); LBXGL_Shader_Vertex3f(pt[6], 0, pt[7]); LBXGL_Shader_End(); } }
BT2D_API void Tile2D_DrawWorld() { Tile2D_Entity *tmp; char *s, *s0, *s1; int tex; float x, y; int i, j; LBXGL_Sprite_SetCameraOrgRot(bt2d_cam->org, bt2d_cam->rot); glEnable(GL_ALPHA_TEST); tex=LBXGL_Texture_LoadImage("textures/voxel/dirt"); LBXGL_Shader_BindTexture(tex); s0=NULL; // LBXGL_Shader_Begin(PDGL_QUADS); for(i=0; i<tile2d_map_xs; i++) { for(j=0; j<tile2d_map_ys; j++) { x=i-(tile2d_map_xs/2); y=j-(tile2d_map_ys/2); s1=Tile2D_TexNameForColor(tile2d_map+(j*tile2d_map_xs+i)*4); if(s1!=s0) { if(s0) { LBXGL_Shader_End(); } if(s1) { tex=LBXGL_Texture_LoadImage(s1); LBXGL_Shader_BindTexture(tex); LBXGL_Shader_Begin(PDGL_QUADS); } s0=s1; } if(!s0) continue; LBXGL_Shader_TexCoord2f(0, 0); LBXGL_Shader_Vertex3f(x, 0, y); LBXGL_Shader_TexCoord2f(1, 0); LBXGL_Shader_Vertex3f(x+1, 0, y); LBXGL_Shader_TexCoord2f(1, 1); LBXGL_Shader_Vertex3f(x+1, 0, y+1); LBXGL_Shader_TexCoord2f(0, 1); LBXGL_Shader_Vertex3f(x, 0, y+1); } } if(s0) LBXGL_Shader_End(); Tile2D_DrawEntities(); #if 0 if(tile2d_player->impulse&BT_IMPULSE_FIRE) { i=((int)floor(bt2d_state->time_f*8))&1; switch(i) { case 0: s="sprites/tile2d/player/play_fire1"; break; case 1: s="sprites/tile2d/player/play_fire2"; break; } #if 0 i=((int)floor(bt2d_state->time_f*16))&15; if(!i) { tmp=Tile2D_SpawnEntity_Bullet( v2add(tile2d_player->org, vec2(0, 1.0)), vec2(10, 0)); tmp->next=tile2d_entity; tile2d_entity=tmp; } #endif }else if(fabs(v2y(tile2d_player->vel))>1.0) { i=((int)floor(bt2d_state->time_f*8))&1; switch(i) { case 0: s="sprites/tile2d/player/play_fly1"; break; case 1: s="sprites/tile2d/player/play_fly2"; break; } }else if((fabs(v2x(tile2d_player->vel))>=0.2) && (fabs(v2x(tile2d_player->vel))>fabs(v2y(tile2d_player->vel)))) { if(fabs(v2x(tile2d_player->vel))>=2.0) { i=((int)floor(bt2d_state->time_f*8))&3; } else { i=((int)floor(bt2d_state->time_f*4))&3; } // i=((int)floor(bt2d_state->time_f*v2len(tile2d_player->vel)))&3; switch(i) { case 0: s="sprites/tile2d/player/play_0"; break; case 1: s="sprites/tile2d/player/play_1"; break; case 2: s="sprites/tile2d/player/play_2"; break; case 3: s="sprites/tile2d/player/play_3"; break; } }else { s="sprites/tile2d/player/play_idle1"; } tex=LBXGL_Texture_LoadImage(s); LBXGL_Shader_BindTexture(tex); x=v2x(tile2d_player->org); y=v2y(tile2d_player->org); // x=0; y=5; if(v2x(tile2d_player->vel)>=0) { LBXGL_Shader_Begin(PDGL_QUADS); LBXGL_Shader_TexCoord2f(1, 0); LBXGL_Shader_Vertex3f(x, 0, y); LBXGL_Shader_TexCoord2f(0, 0); LBXGL_Shader_Vertex3f(x+2, 0, y); LBXGL_Shader_TexCoord2f(0, 1); LBXGL_Shader_Vertex3f(x+2, 0, y+2); LBXGL_Shader_TexCoord2f(1, 1); LBXGL_Shader_Vertex3f(x, 0, y+2); LBXGL_Shader_End(); }else { LBXGL_Shader_Begin(PDGL_QUADS); LBXGL_Shader_TexCoord2f(0, 0); LBXGL_Shader_Vertex3f(x, 0, y); LBXGL_Shader_TexCoord2f(1, 0); LBXGL_Shader_Vertex3f(x+2, 0, y); LBXGL_Shader_TexCoord2f(1, 1); LBXGL_Shader_Vertex3f(x+2, 0, y+2); LBXGL_Shader_TexCoord2f(0, 1); LBXGL_Shader_Vertex3f(x, 0, y+2); LBXGL_Shader_End(); } #endif LBXGL_Shader_BindTexture(-1); pdglDisableTexture2D(); }