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