Пример #1
0
void initDoor(door_struct* d, room_struct* r, vect3D position, bool orientation)
{
	if(!d || !r)return;

	//for collisions

	rectangle_struct rec;
	rec.material=NULL;

	if(!orientation){rec.position=addVect(position,vect(-1,0,0)); rec.size=vect(2,8,0); rec.normal=vect(0,0,inttof32(1));}
	else {rec.position=addVect(position,vect(0,0,-1)); rec.size=vect(0,8,2); rec.normal=vect(inttof32(1),0,0);}

	d->rectangle[0]=addRoomRectangle(r, rec, NULL, false);
	if(d->rectangle[0])d->rectangle[0]->hide=true;

	rec.position.y+=rec.size.y;
	rec.size.y=-rec.size.y;
	d->rectangle[1]=addRoomRectangle(r, rec, NULL, false);
	if(d->rectangle[1])d->rectangle[1]->hide=true;

	initModelInstance(&d->modelInstance, &doorModel);
	d->position=convertVect(vect(position.x+r->position.x, position.y, position.z+r->position.y));
	d->orientation=orientation;
	d->active=false;
	d->used=true;
}
Пример #2
0
void initBigButton(bigButton_s* bb, room_s* r, vect3Di_s pos)
{
	if(!bb || !r)return;
	
	bb->room=r;
	
	md2InstanceInit(&bb->modelInstance, &bigButtonModel, &bigButtonTexture);
	
	{//for collisions
		rectangle_s rec;
		rectangle_s* recp;
		rec.material=NULL;
		
		rec.position=vaddi(pos,vect3Di(-1,1,-1));
		rec.size=vect3Di(2,0,2);
		rec.normal=vect3Df(0,-1.0f,0);
		recp=addRoomRectangle(r, rec);
		if(recp){recp->hide=true;recp->collides=true;bb->surface=recp;}

		rec.position=vaddi(pos,vect3Di(-1,0,-1));
		rec.size=vect3Di(2,1,0);
		rec.normal=vect3Df(0,0,-1.0f);
		recp=addRoomRectangle(r, rec);
		if(recp){recp->hide=true;recp->collides=true;}

		rec.position=vaddi(pos,vect3Di(-1,1,1));
		rec.size=vect3Di(2,-1,0);
		rec.normal=vect3Df(0,0,1.0f);
		recp=addRoomRectangle(r, rec);
		if(recp){recp->hide=true;recp->collides=true;}

		rec.position=vaddi(pos,vect3Di(-1,0,-1));
		rec.size=vect3Di(0,1,2);
		rec.normal=vect3Df(-1.0f,0,0);
		recp=addRoomRectangle(r, rec);
		if(recp){recp->hide=true;recp->collides=true;}

		rec.position=vaddi(pos,vect3Di(1,1,-1));
		rec.size=vect3Di(0,-1,2)
		;rec.normal=vect3Df(1.0f,0,0);
		recp=addRoomRectangle(r, rec);
		if(recp){recp->hide=true;recp->collides=true;}

	}
	
	// pos=vect(pos.x+r->position.x, pos.y, pos.z+r->position.y);
	bb->position=convertRectangleVector(pos);
	
	initActivator(&bb->activator);
	bb->active=false;
	
	bb->used=true;
}
Пример #3
0
void insertRoom(room_s* r1, room_s* r2, vect3Di_s v, u8 orientation)
{
	if(!r1 || !r2)return;

	listCell_s *lc=r2->rectangles.first;

	vect3Di_s o=vect3Di(0,0,0), s=vect3Di(0,0,0);
	roomOriginSize(r2,&o,&s);

	switch(orientation) //TODO : do pre-rotation ?
	{
		case 0:
			v.z-=s.x/2; //not a mistake
			break;
		case 1:
			v.z+=s.x/2; //not a mistake
			break;
		case 4:	case 5:
			v.x-=s.x/2;
			break;
	}
	v.y-=4;

	while(lc)
	{
		rectangle_s rec=lc->data;
		rec.position=vsubi(rec.position,o);

		//rotate
		rec.position=orientVector(rec.position,orientation);
		rec.size=orientVector(rec.size,orientation);
		if(!(orientation%2) || orientation==1)invertRectangle(&rec);

		rec.position=vaddi(rec.position,v);
		rectangle_s* recp=addRoomRectangle(r1, rec);
		if(recp)
		{
			// recp->hide=true; //TEMP ?
			recp->collides=!lc->data.portalable;
			// recp->lightData.vertex=lc->data.lightData.vertex;
		}
		lc=lc->next;
	}
}
Пример #4
0
void initEnergyDevice(room_s* r, energyDevice_s* ed, vect3Di_s pos, deviceOrientation_t or, bool type)
{
	if(!ed)return;
	
	initActivator(&ed->activator);
	md2InstanceInit(&ed->modelInstance, type?(&energyLauncherModel):(&energyCatcherModel), &energyLauncherTexture);
	ed->orientation=or;
	
	ed->surface=NULL;
	
	{//for collisions
		rectangle_s rec;
		rectangle_s* recp;
		rec.material=NULL;
		
			if(or!=mY)
			{
				rec.position=vaddi(pos,vect3Di(-1,4,-1));
				rec.size=vect3Di(2,0,2);
				rec.normal=vect3Df(0,-1.0f,0);
				recp=addRoomRectangle(r, rec);
				if(recp){recp->hide=true;recp->collides=true;}
				if(or==pY)ed->surface=recp;
			}
			if(or!=pY)
			{
				rec.position=vaddi(pos,vect3Di(1,-4,1));
				rec.size=vect3Di(-2,0,-2);
				rec.normal=vect3Df(0,1.0f,0);
				recp=addRoomRectangle(r, rec);
				if(recp){recp->hide=true;recp->collides=true;}
				if(or==mY)ed->surface=recp;
			}
			if(or!=pZ)
			{
				rec.position=vaddi(pos,vect3Di(-1,-4,-1));
				rec.size=vect3Di(2,8,0);
				rec.normal=vect3Df(0,0,1.0f);
				recp=addRoomRectangle(r, rec);
				if(recp){recp->hide=true;recp->collides=true;}
				if(or==mZ)ed->surface=recp;
			}
			if(or!=mZ)
			{
				rec.position=vaddi(pos,vect3Di(-1,4,1));
				rec.size=vect3Di(2,-8,0);
				rec.normal=vect3Df(0,0,-1.0f);
				recp=addRoomRectangle(r, rec);
				if(recp){recp->hide=true;recp->collides=true;}
				if(or==pZ)ed->surface=recp;
			}
			if(or!=pX)
			{
				rec.position=vaddi(pos,vect3Di(-1,-4,-1));
				rec.size=vect3Di(0,8,2);
				rec.normal=vect3Df(1.0f,0,0);
				recp=addRoomRectangle(r, rec);
				if(recp){recp->hide=true;recp->collides=true;}
				if(or==mX)ed->surface=recp;
			}
			if(or!=mX)
			{
				rec.position=vaddi(pos,vect3Di(1,4,-1));
				rec.size=vect3Di(0,-8,2);
				rec.normal=vect3Df(-1.0f,0,0);
				recp=addRoomRectangle(r, rec);
				if(recp){recp->hide=true;recp->collides=true;}
				if(or==pX)ed->surface=recp;
			}
	}
	// pos=vect3Di(pos.x+r->position.x, pos.y, pos.z+r->position.y);
	ed->position=convertRectangleVector(pos);
	
	ed->active=type;
	ed->type=type;
	ed->used=true;
}