コード例 #1
0
ファイル: bigbutton.c プロジェクト: LastShadowChaos/portal3DS
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;
}
コード例 #2
0
ファイル: room.c プロジェクト: SkipperGames/portal3DS
void roomOriginSize(room_s* r, vect3Di_s* o, vect3Di_s* s)
{
	if(!r || (!o && !s))return;

	vect3Di_s m=vect3Di(8192,8192,8192); vect3Di_s M=vect3Di(0,0,0);

	listCell_s *lc=r->rectangles.first;

	while(lc)
	{
		m=vmini(lc->data.position,m);
		m=vmini(vaddi(lc->data.position,lc->data.size),m);
		M=vmaxi(lc->data.position,M);
		M=vmaxi(vaddi(lc->data.position,lc->data.size),M);
		lc=lc->next;
	}

	if(o)*o=m;
	if(s)*s=vsubi(M,m);
}
コード例 #3
0
ファイル: room.c プロジェクト: SkipperGames/portal3DS
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;
}
コード例 #5
0
ファイル: room.c プロジェクト: SkipperGames/portal3DS
void generateRectangleGeometry(rectangle_s* rec, vect3Di_s* texCoords, rectangleVertex_s* vbuf, int* numvert, u16* ibuf, int* numind)
{
	if(!rec || !texCoords || !vbuf || !ibuf || !numvert || !numind)return;

	vect3Di_s v1, v2;
	getRectangleUnitVectors(rec, &v1, &v2);

	int vertexIndices[4];
	vect3Di_s vertices[4] = {rec->position, vaddi(rec->position, v1), vaddi(rec->position, rec->size), vaddi(rec->position, v2)};
	
	// printf("%f %f, %f %f\n", (texCoords[0].x)*0.0078125, (texCoords[0].y)*0.0078125, (texCoords[2].x)*0.0078125, (texCoords[2].y)*0.0078125);

	int i;
	for(i=0; i<4; i++)
	{
		vertexIndices[i] = (*numvert)++;
		vbuf[vertexIndices[i]] = (rectangleVertex_s){vertices[i].x, vertices[i].y, vertices[i].z, (texCoords[i].x), (texCoords[i].y), 0, 0};
	}

	if(rec->lightData.lightMap)
	{
		if(rec->lightData.lightMap->rot)
		{
			vect3Di_s p1 = rec->lightData.lightMap->lmPos;
			vect3Di_s p2 = vaddi(rec->lightData.lightMap->lmPos, vect3Di(rec->lightData.lightMap->lmSize.y, rec->lightData.lightMap->lmSize.x, 0));

			printf("%d %d : %d %d\n",p1.x,p1.y,p2.x,p2.y);

			vbuf[vertexIndices[0]].u2 = p1.x;
			vbuf[vertexIndices[0]].v2 = p1.y;

			vbuf[vertexIndices[1]].u2 = p1.x;
			vbuf[vertexIndices[1]].v2 = p2.y - 1;

			vbuf[vertexIndices[2]].u2 = p2.x - 1;
			vbuf[vertexIndices[2]].v2 = p2.y - 1;

			vbuf[vertexIndices[3]].u2 = p2.x - 1;
			vbuf[vertexIndices[3]].v2 = p1.y;
		}else{
			vect3Di_s p1 = rec->lightData.lightMap->lmPos;
			vect3Di_s p2 = vaddi(rec->lightData.lightMap->lmPos, rec->lightData.lightMap->lmSize);

			vbuf[vertexIndices[0]].u2 = p1.x;
			vbuf[vertexIndices[0]].v2 = p1.y;

			vbuf[vertexIndices[1]].u2 = p2.x - 1;
			vbuf[vertexIndices[1]].v2 = p1.y;

			vbuf[vertexIndices[2]].u2 = p2.x - 1;
			vbuf[vertexIndices[2]].v2 = p2.y - 1;

			vbuf[vertexIndices[3]].u2 = p1.x;
			vbuf[vertexIndices[3]].v2 = p2.y - 1;
		}
	}

	ibuf[(*numind)++] = vertexIndices[0];
	ibuf[(*numind)++] = vertexIndices[1];
	ibuf[(*numind)++] = vertexIndices[3];

	ibuf[(*numind)++] = vertexIndices[1];
	ibuf[(*numind)++] = vertexIndices[2];
	ibuf[(*numind)++] = vertexIndices[3];
}