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; }
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; }
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; } }
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; }