// *********************************************** // CREATION.C - responsible for all tmd creation // *********************************************** // **** includes #include "make_tmd.h" #include "maps.h" #include "creation.h" #include "global.h" #include "calcs.h" //uncomment one of these to determine how the ground gets drawn //#define _GROUND_NO_TEXTURE_FLAT_ //#define _GROUND_NO_TEXTURE_SMOOTH_ //#define _GROUND_TEXTURED_FLAT_ #define _GROUND_TEXTURED_SMOOTH_ // **** structures typedef struct { u_char height[21][21]; } HEIGHTTYPE; typedef struct { u_char texture[20][20]; } TEXTURETYPE; typedef struct { u_char colour[40][40][3]; } COLOURTYPE; // **** private function prototypes u_char ReadHeight(u_long, u_long, u_long); u_char ReadTexture(u_long, u_long, u_long); void ReadColour(u_long, u_long, u_long, u_char*, u_char); void VPyramidUp(VERTEX*, long, long, long, long, long); u_long createTree(u_long, u_char, u_char, u_char); u_long createSmallBuilding(u_long, u_char, u_char, u_char); u_long createTallBuilding(u_long, u_char, u_char, u_char); u_long createRaft(u_long, u_char, u_char, u_char); u_long createChurch(u_long, u_char, u_char, u_char); // **** create Sky u_long createSky(u_long tMemAddress) { u_long counter; SVECTOR tOrientation = {0, 0, 0}; long tPoint[3]; VERTEX v[49]; COLOUR rgb[5]; TEXTURE txt[2]; for (counter=0; counter<8; counter++) { tOrientation.vy = counter*512; tOrientation.vx = tOrientation.vz = 0; Calculate3dOffset(&tOrientation, 0, 0, 40000, &tPoint[0]); TMD_setVERTEX(&v[counter*2], tPoint[0]+512*10, 4000, tPoint[2]+512*10); TMD_setVERTEX(&v[counter*2+1], tPoint[0]+512*10, -1000, tPoint[2]+512*10); TMD_setVERTEX(&v[counter*2+33], (tPoint[0]*0.4)+512*10, -6000, (tPoint[2]*0.4)+512*10); TMD_setVERTEX(&v[counter*2+16], (tPoint[0]*0.5)+512*10, 1000, (tPoint[2]*0.5)+512*10); TMD_setVERTEX(&v[counter*2+17], (tPoint[0]*0.5)+512*10, -2000, (tPoint[2]*0.5)+512*10); } TMD_setVERTEX(&v[48], 0, -8000, 0); // colour for sky behind mountains TMD_setCOLOUR(&rgb[0], CurrentMap->skyBottom[0], CurrentMap->skyBottom[1], CurrentMap->skyBottom[2]); // colour for very top of sky TMD_setCOLOUR(&rgb[2], CurrentMap->skyTop[0], CurrentMap->skyTop[1], CurrentMap->skyTop[2]); // colour of middleground TMD_setCOLOUR(&rgb[1], CurrentMap->middle[0], CurrentMap->middle[1], CurrentMap->middle[2]); TMD_setCOLOUR(&rgb[3], (rgb[0].r<<1)-4, (rgb[0].g<<1)-4, (rgb[0].b<<1)-4); TMD_setCOLOUR(&rgb[4], 0, 0, 0); if (CurrentMap->background == 0) TMD_setTEXTURE(&txt[0], 0, 960, 0, 832, 0, 0,0, 1,0, 0,1, 1,1); else TMD_setTEXTURE(&txt[0], 0, 960, 0, 832, 0, 0,CurrentMap->background*64-64, 255,CurrentMap->background*64-64, 0,CurrentMap->background*64-1, 255,CurrentMap->background*64-1); TMD_setTEXTURE(&txt[1], 0, 960, 1, 896, 0, 0,(long)(CurrentMap->middleground)*64-64, 255,(long)(CurrentMap->middleground)*64-64, 0,(long)(CurrentMap->middleground)*64-1, 255,(long)(CurrentMap->middleground)*64-1); TMD_prepare(tMemAddress, &v[0], &rgb[0], &txt[0]); for (counter=0; counter<8; counter++) { TMD_set3_NS_GP( counter*2+32+1, 48, ((counter*2+3)%16)+32, 2, 4, 2); TMD_set4_NS_GP( counter*2+32+1, ((counter*2+3)%16)+32, counter*2+1, (counter*2+16+3)%16, 2, 2, 3, 3); TMD_set4_TX_NS_FP( counter*2+1, (counter*2+3)%16, counter*2, (counter*2+2)%16, 0, 0); if (CurrentMap->middleground != 0) TMD_set4_TX_NS_FP( counter*2+16+1, ((counter*2+16+3)%16)+16, counter*2+16, ((counter*2+2+16)%16)+16, 1, 1); } return TMD_finish(); } // **** create ground model in memory u_long createGround(u_long tMemAddress) { u_long counter1, counter2; u_char tTxtx, tTxty; long averageY; VERTEX v[842]; COLOUR rgb[5]; TEXTURE txt[4]; for (counter1=0; counter1<21; counter1++) { for (counter2=0; counter2<21; counter2++) { long height = (long) (ReadHeight(CurrentMap->heightAddr, counter1, counter2)); TMD_setVERTEX(&v[counter1+counter2*21], counter1*512, -(height<<4), (20-counter2)*512); } } for (counter1=0; counter1<20; counter1++) { for (counter2=0; counter2<20; counter2++) { averageY = (v[(counter1)+(counter2)*21].vy + v[(counter1)+(counter2+1)*21].vy + v[(counter1+1)+(counter2)*21].vy + v[(counter1+1)+(counter2+1)*21].vy) >> 2; TMD_setVERTEX(&v[441+counter1+counter2*20], counter1*512+256, averageY, (20-counter2)*512-256); } } TMD_prepare(tMemAddress, &v[0], &rgb[0], &txt[0]); for (counter1=0; counter1<20; counter1++) { for (counter2=0; counter2<20; counter2++) { u_char colour[3]; tTxtx = (ReadTexture(CurrentMap->textureAddr, counter1, counter2) % 8) * 32; tTxty = (ReadTexture(CurrentMap->textureAddr, counter1, counter2) / 8) * 32; TMD_setTEXTURE(&txt[0], 0, 384+tTxtx/2, tTxty/32, 320, 0, tTxtx, tTxty, tTxtx+31, tTxty, tTxtx+15, tTxty+15, NULL, NULL); TMD_setTEXTURE(&txt[1], 0, 384+tTxtx/2, tTxty/32, 320, 0, tTxtx+31, tTxty, tTxtx+31, tTxty+31, tTxtx+15, tTxty+15, NULL, NULL); TMD_setTEXTURE(&txt[2], 0, 384+tTxtx/2, tTxty/32, 320, 0, tTxtx+31, tTxty+31, tTxtx, tTxty+31, tTxtx+15, tTxty+15, NULL, NULL); TMD_setTEXTURE(&txt[3], 0, 384+tTxtx/2, tTxty/32, 320, 0, tTxtx, tTxty+31, tTxtx, tTxty, tTxtx+15, tTxty+15, NULL, NULL); // printf("--- %d,%d ", tTxtx, tTxty); ReadColour(CurrentMap->colourAddr, counter1, counter2, &colour[0], 0); TMD_setCOLOUR(&rgb[0], colour[0], colour[1], colour[2]); ReadColour(CurrentMap->colourAddr, counter1, counter2, &colour[0], 1); TMD_setCOLOUR(&rgb[1], colour[0], colour[1], colour[2]); ReadColour(CurrentMap->colourAddr, counter1, counter2, &colour[0], 2); TMD_setCOLOUR(&rgb[2], colour[0], colour[1], colour[2]); ReadColour(CurrentMap->colourAddr, counter1, counter2, &colour[0], 3); TMD_setCOLOUR(&rgb[3], colour[0], colour[1], colour[2]); TMD_setCOLOUR(&rgb[4], (rgb[0].r+rgb[1].r+rgb[2].r+rgb[3].r)>>2, (rgb[0].g+rgb[1].g+rgb[2].g+rgb[3].g)>>2, (rgb[0].b+rgb[1].b+rgb[2].b+rgb[3].b)>>2); #ifdef _GROUND_TEXTURED_SMOOTH_ // texture gradient pigment TMD_set3_TX_NS_GP( (counter1)+(counter2)*21, (counter1+1)+(counter2)*21, (counter1)+(counter2)*20+441, 0, 1, 4, 0); TMD_set3_TX_NS_GP( (counter1+1)+(counter2)*21, (counter1+1)+(counter2+1)*21, (counter1)+(counter2)*20+441, 1, 3, 4, 1); TMD_set3_TX_NS_GP( (counter1+1)+(counter2+1)*21, (counter1)+(counter2+1)*21, (counter1)+(counter2)*20+441, 3, 2, 4, 2); TMD_set3_TX_NS_GP( (counter1)+(counter2+1)*21, (counter1)+(counter2)*21, (counter1)+(counter2)*20+441, 2, 0, 4, 3); #endif #ifdef _GROUND_TEXTURED_FLAT_ // texture flat pigment TMD_set3_TX_NS_FP( (counter1)+(counter2)*21, (counter1+1)+(counter2)*21, (counter1)+(counter2)*20+441, 4, 0); TMD_set3_TX_NS_FP( (counter1+1)+(counter2)*21, (counter1+1)+(counter2+1)*21, (counter1)+(counter2)*20+441, 4, 1); TMD_set3_TX_NS_FP( (counter1+1)+(counter2+1)*21, (counter1)+(counter2+1)*21, (counter1)+(counter2)*20+441, 4, 2); TMD_set3_TX_NS_FP( (counter1)+(counter2+1)*21, (counter1)+(counter2)*21, (counter1)+(counter2)*20+441, 4, 3); #endif #ifdef _GROUND_NO_TEXTURE_FLAT_ // no texture flat pigment TMD_set3_NS_FP( (counter1)+(counter2)*21, (counter1+1)+(counter2)*21, (counter1)+(counter2)*20+441, 4); TMD_set3_NS_FP( (counter1+1)+(counter2)*21, (counter1+1)+(counter2+1)*21, (counter1)+(counter2)*20+441, 4); TMD_set3_NS_FP( (counter1+1)+(counter2+1)*21, (counter1)+(counter2+1)*21, (counter1)+(counter2)*20+441, 4); TMD_set3_NS_FP( (counter1)+(counter2+1)*21, (counter1)+(counter2)*21, (counter1)+(counter2)*20+441, 4); #endif #ifdef _GROUND_NO_TEXTURE_SMOOTH_ // no texture gradient pigment TMD_set3_NS_GP( (counter1)+(counter2)*21, (counter1+1)+(counter2)*21, (counter1)+(counter2)*20+441, 0, 1, 4); TMD_set3_NS_GP( (counter1+1)+(counter2)*21, (counter1+1)+(counter2+1)*21, (counter1)+(counter2)*20+441, 1, 3, 4); TMD_set3_NS_GP( (counter1+1)+(counter2+1)*21, (counter1)+(counter2+1)*21, (counter1)+(counter2)*20+441, 3, 2, 4); TMD_set3_NS_GP( (counter1)+(counter2+1)*21, (counter1)+(counter2)*21, (counter1)+(counter2)*20+441, 2, 0, 4); #endif } } return TMD_finish(); } // **** create whatever object is required u_long createObject(u_char tType, u_long tMemAddress, u_char tR, u_char tG, u_char tB) { u_long returnValue; switch(tType) { case TREE_TMD: returnValue = createTree(tMemAddress,tR,tG,tB); break; case SMALL_BUILDING_TMD: returnValue = createSmallBuilding(tMemAddress,tR,tG,tB); break; case RAFT_TMD: returnValue = createRaft(tMemAddress,tR,tG,tB); break; case CHURCH_TMD: returnValue = createChurch(tMemAddress,tR,tG,tB); break; case TALL_BUILDING_TMD: returnValue = createTallBuilding(tMemAddress,tR,tG,tB); break; }; return returnValue; } // **** create an object u_long createTree(u_long tMemAddress, u_char tR, u_char tG, u_char tB) { VERTEX v[19]; COLOUR rgb[4]; TEXTURE txt[2]; VPyramidUp(&v[0], 128, -256, 128, 400, 700); VPyramidUp(&v[5], 128, -512, 128, 400, 700-64); VPyramidUp(&v[10], 128, -768, 128, 400, 700-128); TMD_setVERTEX(&v[15], 128+128, 0, 0+128); TMD_setVERTEX(&v[16], -96+128, 0, 96+128); TMD_setVERTEX(&v[17], -96+128, 0, -96+128); TMD_setVERTEX(&v[18], 0+128, -900, 0+128); TMD_setCOLOUR(&rgb[0], (255*tR)>>8, (255*tG)>>8, (255*tB)>>8); TMD_setCOLOUR(&rgb[1], (191*tR)>>8, (191*tG)>>8, (191*tB)>>8); TMD_setCOLOUR(&rgb[2], (143*tR)>>8, (143*tG)>>8, (143*tB)>>8); TMD_setCOLOUR(&rgb[3], (128*tR)>>8, (64*tG)>>8, (24*tB)>>8); TMD_setTEXTURE(&txt[0], 0, 384, 1, 320, 0, 0, 32, 31, 63, 0, 63, NULL, NULL); TMD_setTEXTURE(&txt[1], 0, 384, 1, 320, 0, 0, 32, 0, 63, 31, 63, NULL, NULL); TMD_prepare(tMemAddress, &v[0], &rgb[0], &txt[0]); TMD_set3_TX_NS_FP( 0, 1, 2, 2, 1); TMD_set3_TX_NS_FP( 0, 2, 3, 2, 0); TMD_set3_TX_NS_FP( 0, 3, 4, 2, 1); TMD_set3_TX_NS_FP( 0, 4, 1, 2, 0); TMD_set3_TX_NS_FP( 5, 6, 7, 1, 0); TMD_set3_TX_NS_FP( 5, 7, 8, 1, 1); TMD_set3_TX_NS_FP( 5, 8, 9, 1, 0); TMD_set3_TX_NS_FP( 5, 9, 6, 1, 1); TMD_set3_TX_NS_FP( 10, 11, 12, 0, 1); TMD_set3_TX_NS_FP( 10, 12, 13, 0, 0); TMD_set3_TX_NS_FP( 10, 13, 14, 0, 1); TMD_set3_TX_NS_FP( 10, 14, 11, 0, 0); TMD_set3_NS_FP( 18, 15, 17, 3); TMD_set3_NS_FP( 18, 17, 16, 3); TMD_set3_NS_FP( 18, 16, 15, 3); return TMD_finish(); } // **** create a small building u_long createSmallBuilding(u_long tMemAddress, u_char tR, u_char tG, u_char tB) { VERTEX v[19]; COLOUR rgb[6]; TEXTURE txt[5]; TMD_setVERTEX(&v[0], 0, -512, 0); TMD_setVERTEX(&v[1], 0, 0, 0); TMD_setVERTEX(&v[2], 512, -1024, 0); TMD_setVERTEX(&v[3], 512, -512, 0); TMD_setVERTEX(&v[4], 512, 0, 0); TMD_setVERTEX(&v[5], 1024, -512, 0); TMD_setVERTEX(&v[6], 1024, 0, 0); TMD_setVERTEX(&v[7], 512, -1024, 512); TMD_setVERTEX(&v[8], 1024, -512, 512); TMD_setVERTEX(&v[9], 1024, 0, 512); TMD_setVERTEX(&v[10], 512, -1024, 1024); TMD_setVERTEX(&v[11], 1024, -512, 1024); TMD_setVERTEX(&v[12], 1024, 0, 1024); TMD_setVERTEX(&v[13], 512, -512, 1024); TMD_setVERTEX(&v[14], 512, 0, 1024); TMD_setVERTEX(&v[15], 0, -512, 1024); TMD_setVERTEX(&v[16], 0, 0, 1024); TMD_setVERTEX(&v[17], 0, -512, 512); TMD_setVERTEX(&v[18], 0, 0, 512); TMD_setCOLOUR(&rgb[0], (128*tR)>>8, (128*tG)>>8, (128*tB)>>8); TMD_setCOLOUR(&rgb[1], (128*tR)>>8, (128*tG)>>8, (32*tB)>>8); TMD_setTEXTURE(&txt[0], 0, 400, 0, 320, 0, 32, 0, 63, 0, 32, 31, 63, 31); TMD_setTEXTURE(&txt[1], 0, 400, 0, 320, 0, 63, 0, 63, 31, 32, 31, NULL, NULL); TMD_setTEXTURE(&txt[2], 0, 400, 0, 320, 0, 32, 0, 63, 31, 32, 31, NULL, NULL); TMD_setTEXTURE(&txt[3], 0, 400, 1, 320, 0, 32, 32, 63, 32, 32, 63, 63, 63); TMD_setTEXTURE(&txt[4], 0, 416, 0, 320, 0, 64, 0, 95, 0, 64, 31, 95, 31); TMD_prepare(tMemAddress, &v[0], &rgb[0], &txt[0]); // front TMD_set4_TX_NS_FP(0, 3, 1, 4, 0, 0); TMD_set4_TX_NS_FP(3, 5, 4, 6, 0, 0); TMD_set3_TX_NS_FP(2, 3, 0, 0, 1); TMD_set3_TX_NS_FP(5, 3, 2, 0, 1); // side TMD_set4_TX_NS_FP(5, 8, 6, 9, 0, 0); TMD_set4_TX_NS_FP(8, 11, 9, 12, 0, 4); TMD_set4_TX_NS_FP(2, 7, 5, 8, 1, 3); TMD_set4_TX_NS_FP(7, 10, 8, 11, 1, 3); // rear TMD_set4_TX_NS_FP(11, 13, 12, 14, 0, 0); TMD_set4_TX_NS_FP(13, 15, 14, 16, 0, 0); TMD_set3_TX_NS_FP(10, 13, 11, 0, 1); TMD_set3_TX_NS_FP(15, 13, 10, 0, 1); // side TMD_set4_TX_NS_FP(15, 17, 16, 18, 0, 0); TMD_set4_TX_NS_FP(17, 0, 18, 1, 0, 0); TMD_set4_TX_NS_FP(10, 7, 15, 17, 1, 3); TMD_set4_TX_NS_FP(7, 2, 17, 0, 1, 3); return TMD_finish(); } // **** create a small building u_long createTallBuilding(u_long tMemAddress, u_char tR, u_char tG, u_char tB) { VERTEX v[19+8]; COLOUR rgb[6]; TEXTURE txt[5]; TMD_setVERTEX(&v[0], 0, -512, 0); TMD_setVERTEX(&v[1], 0, 0, 0); TMD_setVERTEX(&v[2], 512, -1536, 0); TMD_setVERTEX(&v[3], 512, -512, 0); TMD_setVERTEX(&v[4], 512, 0, 0); TMD_setVERTEX(&v[5], 1024, -512, 0); TMD_setVERTEX(&v[6], 1024, 0, 0); TMD_setVERTEX(&v[7], 512, -1536, 512); TMD_setVERTEX(&v[8], 1024, -512, 512); TMD_setVERTEX(&v[9], 1024, 0, 512); TMD_setVERTEX(&v[10], 512, -1536, 1024); TMD_setVERTEX(&v[11], 1024, -512, 1024); TMD_setVERTEX(&v[12], 1024, 0, 1024); TMD_setVERTEX(&v[13], 512, -512, 1024); TMD_setVERTEX(&v[14], 512, 0, 1024); TMD_setVERTEX(&v[15], 0, -512, 1024); TMD_setVERTEX(&v[16], 0, 0, 1024); TMD_setVERTEX(&v[17], 0, -512, 512); TMD_setVERTEX(&v[18], 0, 0, 512); TMD_setVERTEX(&v[19], 0, -1024, 0); TMD_setVERTEX(&v[20], 512, -1024, 0); TMD_setVERTEX(&v[21], 1024, -1024, 0); TMD_setVERTEX(&v[22], 1024, -1024, 512); TMD_setVERTEX(&v[23], 1024, -1024, 1024); TMD_setVERTEX(&v[24], 512, -1024, 1024); TMD_setVERTEX(&v[25], 0, -1024, 1024); TMD_setVERTEX(&v[26], 0, -1024, 512); TMD_setCOLOUR(&rgb[0], (128*tR)>>8, (128*tG)>>8, (128*tB)>>8); TMD_setCOLOUR(&rgb[1], (128*tR)>>8, (128*tG)>>8, (32*tB)>>8); TMD_setTEXTURE(&txt[0], 0, 400, 0, 320, 0, 32, 0, 63, 0, 32, 31, 63, 31); TMD_setTEXTURE(&txt[1], 0, 400, 0, 320, 0, 63, 0, 63, 31, 32, 31, NULL, NULL); TMD_setTEXTURE(&txt[2], 0, 400, 0, 320, 0, 32, 0, 63, 31, 32, 31, NULL, NULL); TMD_setTEXTURE(&txt[3], 0, 400, 1, 320, 0, 32, 32, 63, 32, 32, 63, 63, 63); TMD_setTEXTURE(&txt[4], 0, 416, 0, 320, 0, 64, 0, 95, 0, 64, 31, 95, 31); TMD_prepare(tMemAddress, &v[0], &rgb[0], &txt[0]); // front TMD_set4_TX_NS_FP(0, 3, 1, 4, 0, 0); TMD_set4_TX_NS_FP(3, 5, 4, 6, 0, 0); TMD_set4_TX_NS_FP(19, 20, 0, 3, 0, 0); TMD_set4_TX_NS_FP(20, 21, 3, 5, 0, 0); TMD_set3_TX_NS_FP(2, 20, 19, 0, 1); TMD_set3_TX_NS_FP(21, 20, 2, 0, 1); // side TMD_set4_TX_NS_FP(5, 8, 6, 9, 0, 0); TMD_set4_TX_NS_FP(8, 11, 9, 12, 0, 4); TMD_set4_TX_NS_FP(21, 22, 5, 8, 0, 0); TMD_set4_TX_NS_FP(22, 23, 8, 11, 0, 0); TMD_set4_TX_NS_FP(2, 7, 21, 22, 1, 3); TMD_set4_TX_NS_FP(7, 10, 22, 23, 1, 3); // rear TMD_set4_TX_NS_FP(11, 13, 12, 14, 0, 0); TMD_set4_TX_NS_FP(13, 15, 14, 16, 0, 0); TMD_set4_TX_NS_FP(23, 24, 11, 13, 0, 0); TMD_set4_TX_NS_FP(24, 25, 13, 15, 0, 0); TMD_set3_TX_NS_FP(10, 24, 23, 0, 1); TMD_set3_TX_NS_FP(25, 24, 10, 0, 1); // side TMD_set4_TX_NS_FP(15, 17, 16, 18, 0, 0); TMD_set4_TX_NS_FP(17, 0, 18, 1, 0, 0); TMD_set4_TX_NS_FP(25, 26, 15, 17, 0, 0); TMD_set4_TX_NS_FP(26, 19, 17, 0, 0, 0); TMD_set4_TX_NS_FP(10, 7, 25, 26, 1, 3); TMD_set4_TX_NS_FP(7, 2, 26, 19, 1, 3); return TMD_finish(); } // **** create a raft u_long createRaft(u_long tMemAddress, u_char tR, u_char tG, u_char tB) { VERTEX v[16]; COLOUR rgb[6]; TEXTURE txt[5]; TMD_setVERTEX(&v[0], 0, -98, 0); TMD_setVERTEX(&v[1], 0, -98, 512); TMD_setVERTEX(&v[2], 512, -98, 512); TMD_setVERTEX(&v[3], 512, -98, 0); TMD_setVERTEX(&v[4], 0, 0, 0); TMD_setVERTEX(&v[5], 0, 0, 512); TMD_setVERTEX(&v[6], 512, 0, 512); TMD_setVERTEX(&v[7], 512, 0, 0); VPyramidUp(&v[8], 512-50, -98, 50, 800, 50); TMD_setVERTEX(&v[13], 512-50, -850, 50); TMD_setVERTEX(&v[14], 512-50, -550, 50); TMD_setVERTEX(&v[15], 512+200, -750, 250); TMD_setCOLOUR(&rgb[0], (128*tR)>>8, (128*tG)>>8, (128*tB)>>8); TMD_setCOLOUR(&rgb[1], 0,0,0); TMD_setCOLOUR(&rgb[2], 0,0,255); TMD_setCOLOUR(&rgb[3], 0,255,0); TMD_setCOLOUR(&rgb[4], 255,0,0); TMD_setTEXTURE(&txt[0], 0, 432, 1, 320, 0, 96, 32, 127, 32, 96, 64, 127, 64); TMD_prepare(tMemAddress, &v[0], &rgb[0], &txt[0]); // raft body TMD_set4_TX_NS_FP(0, 1, 3, 2, 0, 0); TMD_set4_TX_NS_FP(3, 2, 7, 6, 0, 0); TMD_set4_TX_NS_FP(0, 3, 4, 7, 0, 0); TMD_set4_TX_NS_FP(2, 1, 6, 5, 0, 0); TMD_set4_TX_NS_FP(1, 0, 5, 4, 0, 0); TMD_set3_NS_FP(8, 10, 9, 1); TMD_set3_NS_FP(8, 11, 10, 1); TMD_set3_NS_FP(8, 12, 11, 1); TMD_set3_NS_FP(8, 9, 12, 1); TMD_set3_NS_GP(13, 14, 15, 2,3,4); TMD_set3_NS_GP(15, 14, 13, 4,3,2); return TMD_finish(); } // **** create a church u_long createChurch(u_long tMemAddress, u_char tR, u_char tG, u_char tB) { VERTEX v[41]; COLOUR rgb[5]; TEXTURE txt[3]; u_long counter, counter2; TMD_setVERTEX(&v[0], 0, -2048, 0); TMD_setVERTEX(&v[5], 512, -2048, 0); TMD_setVERTEX(&v[10], 1024, -2048, 0); TMD_setVERTEX(&v[15], 1024, -2048, 512); TMD_setVERTEX(&v[20], 1024, -2048, 1024); TMD_setVERTEX(&v[25], 512, -2048, 1024); TMD_setVERTEX(&v[30], 0, -2048, 1024); TMD_setVERTEX(&v[35], 0, -2048, 512); for (counter=0; counter<8; counter++) { for (counter2=1;counter2<5; counter2++) { TMD_setVERTEX(&v[5*counter+counter2], v[counter*5].vx, v[counter*5].vy+512*counter2, v[counter*5].vz); } } TMD_setVERTEX(&v[40], 512, -2500, 512); TMD_setCOLOUR(&rgb[0], (128*tR)>>8, (128*tG)>>8, (128*tB)>>8); TMD_setCOLOUR(&rgb[1], (114*tR)>>8, (114*tG)>>8, (114*tB)>>8); TMD_setCOLOUR(&rgb[2], (64*tR)>>8, (64*tG)>>8, (64*tB)>>8); TMD_setCOLOUR(&rgb[3], (96*tR)>>8, (96*tG)>>8, (96*tB)>>8); TMD_setCOLOUR(&rgb[4], (96*tR)>>8, (70*tG)>>8, (32*tB)>>8); TMD_setTEXTURE(&txt[0], 0, 448, 0, 320, 0, 128, 0, 159, 0, 128, 31, 159, 31); TMD_setTEXTURE(&txt[2], 0, 448, 1, 320, 0, 128, 32, 159, 32, 128, 63, 159, 63); TMD_setTEXTURE(&txt[1], 0, 416, 1, 320, 0, 79, 32, 95, 63, 64, 63, NULL, NULL); TMD_prepare(tMemAddress, &v[0], &rgb[0], &txt[0]); for (counter=0; counter<8; counter++) { for (counter2=0; counter2<4; counter2++) { if (counter2 != 1) TMD_set4_TX_NS_FP( counter*5+counter2, (counter*5+counter2+5)%40, counter*5+counter2+1, (counter*5+counter2+6)%40, counter/2, 0); else TMD_set4_TX_NS_FP( counter*5+counter2, (counter*5+counter2+5)%40, counter*5+counter2+1, (counter*5+counter2+6)%40, counter/2, 2); } } TMD_set3_TX_NS_FP(40, 10, 0, 4, 1); TMD_set3_TX_NS_FP(40, 20, 10, 4, 1); TMD_set3_TX_NS_FP(40, 30, 20, 4, 1); TMD_set3_TX_NS_FP(40, 0, 30, 4, 1); return TMD_finish(); } u_long MakeTitleModel(u_long tMemAddress) { VERTEX v[25+4*20]; COLOUR rgb[27]; TEXTURE txt[7]; long counter1, counter2; SVECTOR tOrientation; long tPoint[3]; for (counter1 =0; counter1<5; counter1++) { for (counter2 = 0; counter2<5; counter2++) { u_long xdist, ydist, hyp; TMD_setVERTEX(&v[counter1+counter2*5], 512*counter1-1024, 0, 512*counter2-1024); xdist = abs(512*counter1-1024); ydist = abs(512*counter2-1024); xdist *= xdist; ydist *= ydist; hyp = pow(xdist + ydist, 0.5); if (hyp>1023) hyp = 1023; TMD_setCOLOUR(&rgb[counter1+counter2*5], 255-hyp/4, 255-hyp/4, 255-hyp/4); } } TMD_setCOLOUR(&rgb[25], 63, 63, 63); TMD_setCOLOUR(&rgb[26], 127, 127, 127); for (counter1=0; counter1<4; counter1++) { tOrientation.vy = counter1*512+1024; tOrientation.vx = tOrientation.vz = 0; Calculate3dOffset(&tOrientation, -220, 0, 1424, &tPoint[0]); TMD_setVERTEX(&v[25+counter1*20], tPoint[0], 0, tPoint[2]); TMD_setVERTEX(&v[25+counter1*20+1], tPoint[0], -400, tPoint[2]); Calculate3dOffset(&tOrientation, -460, 0, 1584, &tPoint[0]); TMD_setVERTEX(&v[25+counter1*20+2], tPoint[0], 0, tPoint[2]); TMD_setVERTEX(&v[25+counter1*20+3], tPoint[0], -400, tPoint[2]); Calculate3dOffset(&tOrientation, -160, 0, 1424, &tPoint[0]); TMD_setVERTEX(&v[25+counter1*20+4], tPoint[0], 0, tPoint[2]); TMD_setVERTEX(&v[25+counter1*20+5], tPoint[0], -400, tPoint[2]); Calculate3dOffset(&tOrientation, -160, 0, 1984, &tPoint[0]); TMD_setVERTEX(&v[25+counter1*20+6], tPoint[0], 0, tPoint[2]); TMD_setVERTEX(&v[25+counter1*20+7], tPoint[0], -400, tPoint[2]); Calculate3dOffset(&tOrientation, 160, 0, 1424, &tPoint[0]); TMD_setVERTEX(&v[25+counter1*20+8], tPoint[0], 0, tPoint[2]); TMD_setVERTEX(&v[25+counter1*20+9], tPoint[0], -400, tPoint[2]); Calculate3dOffset(&tOrientation, 160, 0, 1984, &tPoint[0]); TMD_setVERTEX(&v[25+counter1*20+10], tPoint[0], 0, tPoint[2]); TMD_setVERTEX(&v[25+counter1*20+11], tPoint[0], -400, tPoint[2]); Calculate3dOffset(&tOrientation, 220, 0, 1424, &tPoint[0]); TMD_setVERTEX(&v[25+counter1*20+12], tPoint[0], 0, tPoint[2]); TMD_setVERTEX(&v[25+counter1*20+13], tPoint[0], -400, tPoint[2]); Calculate3dOffset(&tOrientation, 460, 0, 1584, &tPoint[0]); TMD_setVERTEX(&v[25+counter1*20+14], tPoint[0], 0, tPoint[2]); TMD_setVERTEX(&v[25+counter1*20+15], tPoint[0], -400, tPoint[2]); Calculate3dOffset(&tOrientation, -160, 0, 1424, &tPoint[0]); TMD_setVERTEX(&v[25+counter1*20+16], tPoint[0], -350, tPoint[2]); TMD_setVERTEX(&v[25+counter1*20+17], tPoint[0], -450, tPoint[2]); Calculate3dOffset(&tOrientation, 160, 0, 1424, &tPoint[0]); TMD_setVERTEX(&v[25+counter1*20+18], tPoint[0], -350, tPoint[2]); TMD_setVERTEX(&v[25+counter1*20+19], tPoint[0], -450, tPoint[2]); } TMD_setTEXTURE(&txt[0], 0, 448, 0, 320, 0, 128, 0, 159, 0, 128, 31, 159, 31); TMD_setTEXTURE(&txt[1], 1, 320, 233, 512, 0, 16, 0, 79, 0, 16, 15, 79, 16); TMD_setTEXTURE(&txt[2], 1, 320, 233, 512, 0, 16, 0+16, 79, 0+16, 16, 15+16, 79, 16+16); TMD_setTEXTURE(&txt[3], 1, 320, 233, 512, 0, 16, 0+32, 79, 0+32, 16, 15+32, 79, 16+32); TMD_setTEXTURE(&txt[4], 1, 320, 233, 512, 0, 16, 0+48, 79, 0+48, 16, 15+48, 79, 16+48); TMD_setTEXTURE(&txt[5], 0, 416, 1, 320, 0, 64, 32, 95, 32, 64, 63, 95, 63); TMD_setTEXTURE(&txt[6], 0, 432, 1, 320, 0, 96, 32, 127, 32, 96, 63, 127, 63); TMD_prepare(tMemAddress, &v[0], &rgb[0], &txt[0]); for (counter1 =0; counter1<4; counter1++) { for (counter2 = 0; counter2<4; counter2++) { TMD_set4_TX_NS_GP( counter1+1+counter2*5, counter1+counter2*5, counter1+1+counter2*5+5, counter1+counter2*5+5, counter1+1+counter2*5, counter1+counter2*5, counter1+1+counter2*5+5, counter1+counter2*5+5, 5); } } for (counter1=0; counter1<4; counter1++) { TMD_set4_TX_NS_GP( 25+counter1*20, 25+counter1*20+1, 25+counter1*20+4, 25+counter1*20+5, 26, 25, 26, 25, 6); TMD_set4_TX_NS_GP( 25+counter1*20+8, 25+counter1*20+9, 25+counter1*20+12, 25+counter1*20+13, 26, 25, 26, 25, 6); TMD_set4_TX_NS_GP( 25+counter1*20+3, 25+counter1*20+1, 25+counter1*20+2, 25+counter1*20+0, 0, 25, 25, 26, 0); TMD_set4_TX_NS_GP( 25+counter1*20+11, 25+counter1*20+9, 25+counter1*20+10, 25+counter1*20+8, 0, 25, 25, 26, 0); TMD_set4_TX_NS_GP( 25+counter1*20+5, 25+counter1*20+7, 25+counter1*20+4, 25+counter1*20+6, 25, 0, 26, 25, 0); TMD_set4_TX_NS_GP( 25+counter1*20+13, 25+counter1*20+15, 25+counter1*20+12, 25+counter1*20+14, 25, 0, 26, 25, 0); TMD_set4_TX_NS_FP( 25+counter1*20+17, 25+counter1*20+19, 25+counter1*20+16, 25+counter1*20+18, 25, counter1+1); } return TMD_finish(); } // **** read correct height from height data array u_char ReadHeight(u_long tMemAddress, u_long x, u_long y) { HEIGHTTYPE *start = (HEIGHTTYPE *) tMemAddress; return start->height[20-y][x]; } // **** read correct height from height data array u_char ReadTexture(u_long tMemAddress, u_long x, u_long y) { TEXTURETYPE *start = (TEXTURETYPE *) tMemAddress; return start->texture[19-y][x]; } // **** read correct colour from colour data array void ReadColour(u_long tMemAddress, u_long x, u_long y, u_char *tarray, u_char tCorner) { COLOURTYPE *start = (COLOURTYPE *) tMemAddress; u_long tX, tY; switch(tCorner) { case 0: tX = (38-y*2)+1, tY = (x*2); break; case 1: tX = (38-y*2)+1, tY = (x*2)+1; break; case 2: tX = (38-y*2), tY = (x*2); break; case 3: tX = (38-y*2), tY = (x*2)+1; break; } tarray[0] = start->colour[tX][tY][0]; tarray[1] = start->colour[tX][tY][1]; tarray[2] = start->colour[tX][tY][2]; } // **** create a four sided up pointy pyramid void VPyramidUp(VERTEX* tArray, long tXoffset, long tYoffset, long tZoffset, long tHeight, long tSize) { tSize /= 2; TMD_setVERTEX(&tArray[0], tXoffset, tYoffset-tHeight, tZoffset); TMD_setVERTEX(&tArray[1], tXoffset-tSize, tYoffset, tZoffset+tSize); TMD_setVERTEX(&tArray[2], tXoffset+tSize, tYoffset, tZoffset+tSize); TMD_setVERTEX(&tArray[3], tXoffset+tSize, tYoffset, tZoffset-tSize); TMD_setVERTEX(&tArray[4], tXoffset-tSize, tYoffset, tZoffset-tSize); }