Пример #1
0
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);
}
Пример #2
0
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);
}
Пример #3
0
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);
}
Пример #4
0
// 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;
}
Пример #5
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();
	}
}
Пример #6
0
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();
}