don't click here

The SX Engine

Discussion in 'Engineering & Reverse Engineering' started by Uhyve, Dec 2, 2010.

Thread Status:
Not open for further replies.
  1. Uhyve

    Uhyve

    Master Procrastinator Member
    46
    0
    6
    Huddersfield, England
    SX Engine
    Ah, I knew I read someone talking about having a standard block size. I actually had that working, but it broke at some point while I was making normal scales work. I'd make a small equation so you wouldn't have to do all the scaling by hand, but I'm not actually that great at proper maths equations... it's actually not too difficult once you understand that bit of code, since after that, you just add it onto 1 and that's your scale.

    I actually do feel like I'm understanding more and more about how the DEF files work. I can really see myself getting stuck on Paths though. But then again, I can always release the program as open source (if I haven't already done that by that point), I'm sure someone on the internet would be able to figure it out if I can't.

    Edit: Added a download link to the newest version, fresh off the compiler.
     
  2. Weird, I tried testing this out, but when I tried clicking on the .exe it wouldn't load. Do I need to launch it in DosBox or something?
     
  3. Uhyve

    Uhyve

    Master Procrastinator Member
    46
    0
    6
    Huddersfield, England
    SX Engine
    Nah, it should just work. I should really put in some error messages. But I'd be willing to bet, that's a DirectX error, try installing the DirectX updater (it checks all of the individual DirectX components, for the odd one that is out of date):
    DirectX Web Updater

    If it's not that, I guess I must've used some DirectX function that you're graphics card can't do, because that's exactly what happens when a program fails to create a renderer.
     
  4. That explains it then, my graphics card I have right now is a piece of crap, and can't run anything worth a damn. I'll try it when I get a better graphics card, I guess.
     
  5. Uhyve

    Uhyve

    Master Procrastinator Member
    46
    0
    6
    Huddersfield, England
    SX Engine
    Yeah, if it's that, I'll try fixing it in the next build, I've got a pretty new computer so I didn't really do much to make sure it'd work on older machines.

    Edit: Still not sure whether anyone cares (which is why I'm just editing an old post), but I figure it'll probably be a good idea to document how the DEF files work. Just been figuring out renderflags (I was just specifying specific renderflags originally, which means I was probably missing some stuff). Basically, these are binary flags, I'll give an example of one:

    00000010 (2)

    So if the 7th number means transparent, the object would be transparent. Say the 6th number is the mirror texture flag, and we wanted a transparent mirrored object, we'd set it like this:

    00000110 (5)

    The renderflags are basically the same but not binary formatted:

    8448

    Which means:

    00100001 00000000 (8192 + 256)

    You can work this out using annoyingly complicated powers of two logic but I won't bore you guys with that. Not totally done with renderflags yet though, as I still need to know what each flag is actually meant to do, I think that in the example above, 256 means mirror texture. I realized this a while back but now I've bothered implementing this, I just realized that the massive scales must be the offset flag, just like the comments hint at in the DEF files (no idea why that never occurred to me).

    PS Just got fillcolors working, the DE levels are now starting to look more like levels.
     
  6. Uhyve

    Uhyve

    Master Procrastinator Member
    46
    0
    6
    Huddersfield, England
    SX Engine
    Figured I'd release the source as a Christmas present. There's no actual progress since last release and it's super messy since I wasn't actually planning on releasing anything, but at least if I get lazy and stop working on it now, people don't have to start again from scratch.

    And yes, it's realllly messy.

    http://code.google.com/p/sx-engine/source/detail?r=2
     
  7. Andrew75

    Andrew75

    Technical Artist Member
    2,030
    107
    43
    Project AXSX(Sonic Xtreme) + Misc Projects
    Hey , don't get to lazy now, hope to see this project bare more fruit !
    Anyways merry belated X-mas!.
    Would have replied yesterday, had a really fulfilling day with family.
     
  8. SANiK

    SANiK

    Tech Member
    413
    0
    16
    That is alright guess work but it is actually simpler than that.
    Try:
    Code (Text):
    1. unsigned int combinedScaleOffset=atoi(num.c_str());
    2.  
    3. //Decompose combined data
    4. usedCubes[currentCube].yScale = 1+(signed short)combinedScaleOffset/128.0f;
    5. usedCubes[currentCube].yOffset = (signed short)(combinedScaleOffset >> 16)/256.0f;
    The scale and offset are stored as a combined 32bit number.
    The top 16 bits are the relative offset and the bottom 16 bits are the relative scale.

    The scale is relative to 1 which you've figured out already and it uses 128.0f accuracy which you've also figured out.
    The offset is 256.0f accuracy.
     
  9. SANiK

    SANiK

    Tech Member
    413
    0
    16
    Ofer made up as he went along. There are various functional differences in the DEF format, even though the DEF files show the same file version number.
    You might also want to invest time in a nice database to manage the resources.

    2) make hexdump actual hex data not strings
    3) Palettes lack a Value or HexDump, they use FileName "..."
    10) Implement UV orientation (flip/rotate), as well as implement it on the image data level
    18) CRYSTAL2.DEF: Trunks of snowball trees aren't transparent

    Bugs:
    1) Double sided Crystal1 ramp going up... in video it doesn't disappear but it fades out... is this "weak double sided" or "double sided but blocking the camera..."
    2) GALAXY1, Playme.def, DE_*, and RAMPS top-plane slope fiasco... they seem to use different settings
    3) JG_07 Wood support bridge doesn't uses flat but has auto values... so I use auto... looks good but unsure if actual working of engine
    5) Figure out how to use correct value of local shading. Also, is it added to the global shading or overridden?
    6) Figure difference between X 90 and X 45 cube types instead of processing them the same...
    8) Figure why the shadows seem to be inverted on the X thing... darker side is showing with lighter side behind it... wrong X setup, wrong shadoing, or discard shadows for X type?
    9) Why is death egg so light
    10) Check Fern_01 for unk2 and ... that fence might be transparent
    11) Check out Diamon in Neo_01
    12) Screen2 and scrreen1 water animating has blanks - transparent flag/auto alpha on first frame only?
    13) TEST_05C.DEF = egypt level
    14) Frame size might actually be 1 pixel thick?
    15) (Blending) Transparency needs to be implemented for all sides. Not per texture blending but per renderflag blending.
    16) Rotatation on renderflag level and texture level needs to be implemented
    17) Texture scrolling needs to be implemented
    18) Crystal frost, ramps have garbled textures on side
    19) Shading algorithm is off
    20) Fish eye algorithm is off
    21) Some corners missing due to optomization algo I think in X shapes?

    Code (Text):
    1. //Layout.c
    2. #include "common.h"
    3.  
    4. //Defines
    5. //TEXTURE:VALUE001=Flags
    6. //#define LAYOUT_TXTR_GlobalMapping      1
    7. //#define LAYOUT_TXTR_LocalMapping      2
    8. //#define LAYOUT_TXTR_Animation          4
    9. #define LAYOUT_TXTR_Bitmap            8    //Overrides LAYOUT_TXTR_FLAT_FILL & LAYOUT_TXTR_AUTO_FILL
    10. #define LAYOUT_TXTR_FLAT_FILL          16 //Default, if 0
    11. #define LAYOUT_TXTR_AUTO_FILL          32 //Overrides LAYOUT_TXTR_FLAT_FILL
    12. #define LAYOUT_TXTR_FRAME1            64 //Draw X (what's the need for LAYOUT_TXTR_DRAW_X then...?)
    13. #define LAYOUT_TXTR_FRAME2            128 //Draw []
    14. //#define LAYOUT_TXTR_DRAW_X            256 //Undefined? //"Continues animation" is 256 //Might mean Draw_regardless...?
    15.  
    16. //TEXTURE:VALUE002=Render mode
    17. #define LAYOUT_Opaque                  1
    18. #define LAYOUT_Transparent            2
    19. #define LAYOUT_Blend                  16
    20. #define LAYOUT_Darken                  32    //Undoc
    21. #define LAYOUT_Lighten                64    //Undoc
    22. //#define LAYOUT_Disolve                128
    23. #define LAYOUT_FlipH                  256
    24. #define LAYOUT_FlipV                  512
    25. //#define LAYOUT_Ditr                    1024
    26. #define LAYOUT_AutoTrans              2048
    27. //#define LAYOUT_RemapColors            4096
    28. #define LAYOUT_BestQuality            8192
    29. //#define LAYOUT_Rotate                  16384
    30.  
    31. //TEXTURE:VALUE003=Palette (Palette Name)
    32. //TEXTURE:VALUE004=Unknown
    33. //TEXTURE:VALUE005=Unknown
    34. //TEXTURE:VALUE006=MaxFrames (New version: Uses stated animation count + Detection; Old version: Used detection to figure out animation count, e.g. if 0.pcx exists try 1.pcx etc.)
    35. //TEXTURE:VALUE007=Unknown
    36. //TEXTURE:VALUE008=Texture File Path
    37. //TEXTURE:VALUE009=Unknown
    38. //TEXTURE:VALUE010=Weight (Variable Name)
    39. //TEXTURE:VALUE011=Elastic (Variable Name)
    40. //TEXTURE:VALUE012=FrictionX (Variable Name)
    41. //TEXTURE:VALUE013=FrictionY (Variable Name)
    42. //TEXTURE:VALUE014=FrictionZ (Variable Name)
    43.  
    44. //TEXTURE:VALUE015=Physics flags
    45. //#define LAYOUT_AlignPlayer            1
    46. //#define LAYOUT_AlignWorld              2
    47. //#define LAYOUT_RotWorldCW              4
    48. //#define LAYOUT_RotWorldCCW            8
    49. //#define LAYOUT_unknownNameButLetPlayerPass  16
    50.  
    51. //TEXTURE:VALUE016=Magnet (Variable Name)
    52. //TEXTURE:VALUE017=Fill1 color (Flat fill color, autofill left) (color)
    53. //TEXTURE:VALUE018=Frame1 color (\ color) (|- color) (color)
    54. //TEXTURE:VALUE019=Frame2 color  (/ color) (_| color) (color)
    55. //TEXTURE:VALUE020=Fill2 color (autofill right) (color)
    56. //TEXTURE:VALUE021=Autofill color (color) (enables extra mode?) Color(r,g,b) r=gradient center shift, g=gradient format, b=gradient bar count ...
    57. //TEXTURE:VALUE022=Scroll color (probably direction? X,Y, and speed?)
    58.  
    59. //CUBE:VALUE001=Flags
    60. //#define  LAYOUT_CDF_EmptyCube          0    //Denotes empty space
    61. #define LAYOUT_CDF_Active              1
    62. //#define LAYOUT_CDF_Sloped              2
    63. //#define LAYOUT_CDF_DSloped            4
    64. #define LAYOUT_CDF_Chkrs              8      //CDF_Chkrs means depending on x,y,z position of tile, the sides of cube interchange
    65. //#define LAYOUT_CDF_Sprite              16
    66. //#define LAYOUT_CDF_Pass                32
    67.  
    68. //CUBE:VALUE002=Type (0=Cube, 1=Sprite Center, 2=Sprite Front, 3=Cross Y45, 4= Cross Y90, 5=Diamond, 6=Sprite & Shadow, 7=Pyramid)
    69. //CUBE:VALUE003=Back (Texture Name)    //New Version: No texture, means no side
    70. //CUBE:VALUE004=Top (Texture Name)     //New Version: No texture, means no side
    71. //CUBE:VALUE005=Right (Texture Name)    //New Version: No texture, means no side
    72. //CUBE:VALUE006=Bottom (Texture Name)    //New Version: No texture, means no side
    73. //CUBE:VALUE007=Left (Texture Name)    //New Version: No texture, means no side
    74. //CUBE:VALUE008=Front (Texture Name)    //New Version: No texture, means no side
    75. //CUBE:VALUE009=Unknown
    76. //CUBE:VALUE010=Unknown
    77. //CUBE:VALUE011=Attack (0-31?)
    78. //CUBE:VALUE012=Shield (0-31?)
    79. //CUBE:VALUE013=Unknown
    80. //CUBE:VALUE014=Unknown
    81. //CUBE:VALUE015=Slope Direction
    82. ////
    83. //CUBE:VALUE016=X Size/Offset
    84. //CUBE:VALUE017=Y Size/Offset
    85. //CUBE:VALUE018=Z Size/Offset
    86. //CUBE:VALUE019=Unknown
    87.  
    88. //CUBE:VALUE020 (Double Sided),VALUE021 (Partial Face, Old Version Use Only: Faces not to Draw),VALUE022 (Not on grid, Old Version Use Only: For Mesh Optomization),VALUE023 (Auto determination, Old Version Use Only: Engine fills in blanks it seems?)
    89. #define LAYOUT_BACK                    1
    90. #define LAYOUT_TOP                    2
    91. #define LAYOUT_RIGHT                  4
    92. #define LAYOUT_BOTTOM                  8
    93. #define LAYOUT_LEFT                    16
    94. #define LAYOUT_FRONT                  32
    95. //#define LAYOUT_HORIZONTAL              64
    96. //#define LAYOUT_VERTICAL                128
    97. //#define LAYOUT_SIDE                    256
    98.  
    99. //CUBE:VALUE024=Unknown
    100. //CUBE:VALUE025=Unknown
    101. //CUBE:VALUE026=Swap (Cube #) //Cube ID of new cube to spawn, but when is it triggered?
    102. //CUBE:VALUE027=Unknown
    103. //CUBE:VALUE028=Unknown
    104. //CUBE:VALUE029=RenderFlags Back (Renderflags are the same as texture renderflags but with shading, where shading is upper 16bits); shading seems to be -15 to +15
    105. //CUBE:VALUE030=RenderFlags Top
    106. //CUBE:VALUE031=RenderFlags Right
    107. //CUBE:VALUE032=RenderFlags Bottom
    108. //CUBE:VALUE033=RenderFlags Left
    109. //CUBE:VALUE034=RenderFlags Front
    110.  
    111. //QUBIX:VALUE001=Layout Texture FileName without FileFormat
    112. //QUBIX:VALUE002=Background Texture FileName without FileFormat
    113. //QUBIX:VALUE003=Unknown
    114. //QUBIX:VALUE004=Unknown
    115. //QUBIX:VALUE005=Specular Color (color)
    116. //QUBIX:VALUE006=Fog Color (color)
    117.  
    118. //Variables
    119. byte layout_drawPhase=0;
    120. float slopeElevation[16][4]={
    121. //top left, top right, front left, front right
    122. {1.0f, 1.0f,
    123.  1.0f, 1.0f}, //0
    124.  
    125. {1.0f, 0.0f,
    126.  1.0f, 0.0f}, //1
    127. {1.0f, 1.0f,
    128.  1.0f, 1.0f}, //2
    129. {1.0f, 1.0f,
    130.  1.0f, 1.0f}, //3
    131. {0.0f, 1.0f,
    132.  0.0f, 1.0f}, //4
    133.  
    134. {1.0f, 1.0f,
    135.  0.0f, 0.0f}, //5
    136. {1.0f, 1.0f,
    137.  1.0f, 1.0f}, //6
    138. {1.0f, 1.0f,
    139.  1.0f, 1.0f}, //7
    140. {0.0f, 0.0f,
    141.  1.0f, 1.0f}, //8
    142.  
    143. {1.0f, 1.0f,
    144.  1.0f, 1.0f}, //9
    145. {1.0f, 1.0f,
    146.  1.0f, 1.0f}, //10
    147. {1.0f, 1.0f,
    148.  1.0f, 1.0f}, //11
    149. {1.0f, 1.0f,
    150.  1.0f, 1.0f}, //12
    151. };
    152.  
    153. //Functions
    154. sdword layout_getIntValue(byte *a_stringData)
    155. {
    156.   if(a_stringData == NULL) return 0;
    157.   
    158.   //If it's already in numeric form, just return the number
    159.   if((util_isDigit(a_stringData[0])) || (a_stringData[0]=='-')) return atoi(a_stringData);
    160.  
    161.   //If it's Color(#,#,#) then parse it into 0xRRGGBBFF
    162.   if(strncmp(a_stringData, "Color(", sizeof("Color(")-1) == 0)
    163.   {
    164.     dword red,green,blue;
    165.     sscanf(a_stringData, "Color(%d,%d,%d)", &red, &green, &blue);
    166. &nbsp;&nbsp;&nbsp;&nbsp;return (((byte)red)<<24) | (((byte)green)<<16) | (((byte)blue)<<8) | 0xFF;
    167. &nbsp;&nbsp;}
    168. &nbsp;&nbsp;
    169. &nbsp;&nbsp;//Else decode the value
    170. &nbsp;&nbsp;sdword intData=0;
    171. &nbsp;&nbsp;
    172. &nbsp;&nbsp;//TEXTURE:VALUE001=Flags
    173. &nbsp;&nbsp;if(strstr(a_stringData, "TXTR_Bitmap") != NULL) intData|=LAYOUT_TXTR_Bitmap;
    174. &nbsp;&nbsp;if(strstr(a_stringData, "TXTR_FLAT_FILL") != NULL) intData|=LAYOUT_TXTR_FLAT_FILL;
    175. &nbsp;&nbsp;if(strstr(a_stringData, "TXTR_AUTO_FILL") != NULL) intData|=LAYOUT_TXTR_AUTO_FILL;
    176. &nbsp;&nbsp;if(strstr(a_stringData, "TXTR_FRAME1") != NULL) intData|=LAYOUT_TXTR_FRAME1;
    177. &nbsp;&nbsp;if(strstr(a_stringData, "TXTR_FRAME2") != NULL) intData|=LAYOUT_TXTR_FRAME2;
    178. &nbsp;&nbsp;
    179. &nbsp;&nbsp;//CUBE:VALUE029 to inclusive VALUE034
    180. &nbsp;&nbsp;//TEXTURE:VALUE002=Render mode
    181. &nbsp;&nbsp;if(strstr(a_stringData, "Opaque") != NULL) intData|=LAYOUT_Opaque;
    182. &nbsp;&nbsp;if(strstr(a_stringData, "Transparent") != NULL) intData|=LAYOUT_Transparent;
    183. &nbsp;&nbsp;if(strstr(a_stringData, "FlipH") != NULL) intData|=LAYOUT_FlipH;
    184. &nbsp;&nbsp;if(strstr(a_stringData, "FlipV") != NULL) intData|=LAYOUT_FlipV;
    185. &nbsp;&nbsp;if(strstr(a_stringData, "AutoTrans") != NULL) intData|=LAYOUT_AutoTrans;
    186. &nbsp;&nbsp;if(strstr(a_stringData, "BestQuality") != NULL) intData|=LAYOUT_BestQuality;
    187. &nbsp;&nbsp;
    188. &nbsp;&nbsp;//CUBE:VALUE001=Flags
    189. &nbsp;&nbsp;if(strstr(a_stringData, "CDF_Active") != NULL) intData|=LAYOUT_CDF_Active;
    190. &nbsp;&nbsp;if(strstr(a_stringData, "CDF_Chkrs") != NULL) intData|=LAYOUT_CDF_Chkrs;
    191. &nbsp;&nbsp;
    192. &nbsp;&nbsp;//CUBE:VALUE020 to inclusive VALUE023
    193. &nbsp;&nbsp;if(strstr(a_stringData, "BACK") != NULL) intData|=LAYOUT_BACK;
    194. &nbsp;&nbsp;if(strstr(a_stringData, "TOP") != NULL) intData|=LAYOUT_TOP;
    195. &nbsp;&nbsp;if(strstr(a_stringData, "RIGHT") != NULL) intData|=LAYOUT_RIGHT;
    196. &nbsp;&nbsp;if(strstr(a_stringData, "BOTTOM") != NULL) intData|=LAYOUT_BOTTOM;
    197. &nbsp;&nbsp;if(strstr(a_stringData, "LEFT") != NULL) intData|=LAYOUT_LEFT;
    198. &nbsp;&nbsp;if(strstr(a_stringData, "FRONT") != NULL) intData|=LAYOUT_FRONT;
    199. &nbsp;&nbsp;
    200. &nbsp;&nbsp;return intData;
    201. }
    202.  
    203. void layout_parsePath(byte *a_destString, byte *a_fileDirectory, byte *a_layoutStringData, byte *a_fileFormat)
    204. {
    205. &nbsp;&nbsp;dword fileDirectoryLen=strlen(a_fileDirectory);
    206. &nbsp;&nbsp;
    207. &nbsp;&nbsp;//Prepare the full file path
    208. &nbsp;&nbsp;memcpy(a_destString, a_fileDirectory, fileDirectoryLen);
    209. &nbsp;&nbsp;dword stringDataLen=strlen(a_layoutStringData)-2;
    210. &nbsp;&nbsp;memcpy(&a_destString[fileDirectoryLen], &a_layoutStringData[1], stringDataLen);
    211. &nbsp;&nbsp;a_destString[fileDirectoryLen+stringDataLen]=0;
    212. &nbsp;&nbsp;
    213. &nbsp;&nbsp;//Convert : to backward slash
    214. &nbsp;&nbsp;byte *charPointer=&a_destString[fileDirectoryLen];
    215. &nbsp;&nbsp;while(*charPointer)
    216. &nbsp;&nbsp;{
    217. &nbsp;&nbsp;&nbsp;&nbsp;if(*charPointer == ':') *charPointer='\\';
    218. &nbsp;&nbsp;&nbsp;&nbsp;charPointer++;
    219. &nbsp;&nbsp;}
    220. &nbsp;&nbsp;
    221. &nbsp;&nbsp;//Append the file format
    222. &nbsp;&nbsp;strcat(a_destString, a_fileFormat);&nbsp;&nbsp;
    223. }
    224.  
    225. void layout_parseDef(Layout *a_layout, byte *a_fileName)
    226. {
    227. &nbsp;&nbsp;//Get the size of the file
    228. &nbsp;&nbsp;dword fileSize=file_getSize(a_fileName);
    229. &nbsp;&nbsp;
    230. &nbsp;&nbsp;//Allocate and load the file into a buffer (and convert the buffer into a null terminated string)
    231. &nbsp;&nbsp;byte *fileBuffer=malloc(fileSize+1);
    232. &nbsp;&nbsp;file_read(a_fileName, fileBuffer, 0, fileSize);
    233. &nbsp;&nbsp;fileBuffer[fileSize]=0;
    234. &nbsp;&nbsp;
    235. &nbsp;&nbsp;//Remove comments, repetitive whitespace, and shift data down
    236. &nbsp;&nbsp;byte *fileDestPointer=fileBuffer;
    237. &nbsp;&nbsp;byte *fileSrcPointer=fileBuffer;
    238. &nbsp;&nbsp;byte stringMode=0;
    239. &nbsp;&nbsp;byte commentMode=0;
    240. &nbsp;&nbsp;byte whitespaceMode=0;
    241. &nbsp;&nbsp;while(*fileSrcPointer != 0)
    242. &nbsp;&nbsp;{
    243. &nbsp;&nbsp;&nbsp;&nbsp;//Is it a comment?
    244. &nbsp;&nbsp;&nbsp;&nbsp;if((!stringMode) && (!commentMode) && (*fileSrcPointer == '/') && (fileSrcPointer[1] == '/'))
    245. &nbsp;&nbsp;&nbsp;&nbsp;{
    246. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;commentMode=1;
    247. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileSrcPointer++;
    248. &nbsp;&nbsp;&nbsp;&nbsp;}
    249. &nbsp;&nbsp;&nbsp;&nbsp;//Is it a string?
    250. &nbsp;&nbsp;&nbsp;&nbsp;else if((!commentMode) && (*fileSrcPointer == '"'))
    251. &nbsp;&nbsp;&nbsp;&nbsp;{
    252. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;whitespaceMode=0;
    253. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*fileDestPointer++=*fileSrcPointer++;
    254. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stringMode=!stringMode;
    255. &nbsp;&nbsp;&nbsp;&nbsp;}
    256. &nbsp;&nbsp;&nbsp;&nbsp;//Is it inside a comment?
    257. &nbsp;&nbsp;&nbsp;&nbsp;else if(commentMode)
    258. &nbsp;&nbsp;&nbsp;&nbsp;{
    259. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(*fileSrcPointer == '\n')
    260. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    261. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*fileDestPointer++=*fileSrcPointer;
    262. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;commentMode=!commentMode;
    263. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    264. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileSrcPointer++;
    265. &nbsp;&nbsp;&nbsp;&nbsp;}
    266. &nbsp;&nbsp;&nbsp;&nbsp;//Is it duplicate whitespace
    267. &nbsp;&nbsp;&nbsp;&nbsp;else if((!stringMode) && (whitespaceMode) && ((*fileSrcPointer == '\t') || (*fileSrcPointer == '\r') || (*fileSrcPointer == ' ')))
    268. &nbsp;&nbsp;&nbsp;&nbsp;{
    269. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Ignore it
    270. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileSrcPointer++;
    271. &nbsp;&nbsp;&nbsp;&nbsp;}
    272. &nbsp;&nbsp;&nbsp;&nbsp;//Is it all else
    273. &nbsp;&nbsp;&nbsp;&nbsp;else
    274. &nbsp;&nbsp;&nbsp;&nbsp;{
    275. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;whitespaceMode=((*fileSrcPointer == '\t') || (*fileSrcPointer == '\r') || (*fileSrcPointer == ' ') || (*fileSrcPointer == '\n'));
    276. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*fileDestPointer++=*fileSrcPointer++;
    277. &nbsp;&nbsp;&nbsp;&nbsp;}
    278. &nbsp;&nbsp;}
    279. &nbsp;&nbsp;*fileDestPointer++=0; //Add terminating null
    280. &nbsp;&nbsp;
    281. &nbsp;&nbsp;//Calculate new fileSize
    282. &nbsp;&nbsp;fileSize=(dword)fileDestPointer-(dword)fileBuffer;
    283. &nbsp;&nbsp;
    284. &nbsp;&nbsp;//Parse the file
    285. &nbsp;&nbsp;dword fileOffset=0;
    286. &nbsp;&nbsp;while(1)
    287. &nbsp;&nbsp;{
    288. &nbsp;&nbsp;&nbsp;&nbsp;if(fileOffset >= fileSize) break;
    289. &nbsp;&nbsp;&nbsp;&nbsp;
    290. &nbsp;&nbsp;&nbsp;&nbsp;//Is it data?
    291. &nbsp;&nbsp;&nbsp;&nbsp;if(strncmp(&fileBuffer[fileOffset], "NEW_", sizeof("NEW_")-1) == 0)
    292. &nbsp;&nbsp;&nbsp;&nbsp;{
    293. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileOffset+=(sizeof("NEW_")-1);
    294. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    295. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Get type
    296. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword typeOffset=fileOffset;
    297. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword typeLen=0;
    298. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while((util_isLetter(fileBuffer[fileOffset])) && (fileBuffer[fileOffset] != 0))
    299. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    300. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;typeLen++;
    301. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileOffset++;
    302. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    303. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(fileBuffer[fileOffset] == 0) break;
    304. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    305. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//fwrite(&fileBuffer[typeOffset], typeLen, 1, stdout);printf(":");
    306. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    307. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Get name
    308. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while((fileBuffer[fileOffset] != '"') && (fileBuffer[fileOffset] != 0)) fileOffset++;
    309. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(fileBuffer[fileOffset] == 0) break;
    310. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    311. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword nameOffset=fileOffset;
    312. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword nameLen=2; //Include the first " and the last "
    313. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    314. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileOffset++; //Skip the "
    315. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while((fileBuffer[fileOffset] != '"') && (fileBuffer[fileOffset] != 0))
    316. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    317. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;nameLen++;
    318. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileOffset++;
    319. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    320. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(fileBuffer[fileOffset] == 0) break;
    321. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    322. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//fwrite(&fileBuffer[nameOffset], nameLen, 1, stdout);printf("\n");
    323. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    324. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Get {
    325. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while((fileBuffer[fileOffset] != '{') && (fileBuffer[fileOffset] != 0)) fileOffset++;
    326. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(fileBuffer[fileOffset] == 0) break;
    327. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileOffset++; //Skip the {
    328. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    329. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Figure which type it is
    330. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;List *typeListPointer=NULL;
    331. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//VARIABLE
    332. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((typeLen == (sizeof("VARIABLE")-1)) && !strncmp(&fileBuffer[typeOffset], "VARIABLE", typeLen)){typeListPointer=&a_layout->variableList;}
    333. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//PALETTE
    334. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if((typeLen == (sizeof("PALETTE")-1)) && !strncmp(&fileBuffer[typeOffset], "PALETTE", typeLen)){typeListPointer=&a_layout->paletteList;}
    335. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//CAMERA
    336. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if((typeLen == (sizeof("CAMERA")-1)) && !strncmp(&fileBuffer[typeOffset], "CAMERA", typeLen)){typeListPointer=&a_layout->cameraList;}
    337. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//TEXTURE
    338. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if((typeLen == (sizeof("TEXTURE")-1)) && !strncmp(&fileBuffer[typeOffset], "TEXTURE", typeLen)){typeListPointer=&a_layout->textureList;}
    339. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//QUBIX
    340. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if((typeLen == (sizeof("QUBIX")-1)) && !strncmp(&fileBuffer[typeOffset], "QUBIX", typeLen)){typeListPointer=&a_layout->qubixList;}
    341. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//ACTOR
    342. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if((typeLen == (sizeof("ACTOR")-1)) && !strncmp(&fileBuffer[typeOffset], "ACTOR", typeLen)){typeListPointer=&a_layout->actorList;}
    343. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//PATH
    344. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if((typeLen == (sizeof("PATH")-1)) && !strncmp(&fileBuffer[typeOffset], "PATH", typeLen)){typeListPointer=&a_layout->pathList;}
    345. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//CUBE
    346. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if((typeLen == (sizeof("CUBE")-1)) && !strncmp(&fileBuffer[typeOffset], "CUBE", typeLen)){typeListPointer=&a_layout->cubeList;}
    347. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//UNKNOWN
    348. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
    349. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    350. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("Warning: Unknown Data Type: NEW_");
    351. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fwrite(&fileBuffer[typeOffset], typeLen, 1, stdout);
    352. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("\n");
    353. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    354. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    355. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Add the proper list entry
    356. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(typeListPointer != NULL)
    357. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    358. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LayoutElement *layoutElementPointer=malloc(sizeof(LayoutElement));
    359.  
    360. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Copy the element name to the element template, add term null to name
    361. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layoutElementPointer->elementName=malloc(nameLen+1);
    362. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(layoutElementPointer->elementName, &fileBuffer[nameOffset], nameLen);
    363. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layoutElementPointer->elementName[nameLen]=0;
    364. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    365. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Initiate the two lists in the element
    366. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list_init(&layoutElementPointer->valueList);
    367. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list_init(&layoutElementPointer->hexDumpList);
    368. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    369. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Add the list element to the typeListPointer
    370. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list_addEntry(typeListPointer, layoutElementPointer);
    371. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    372. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Scan for values or hexdumps, whilst getting }
    373. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while((fileBuffer[fileOffset] != '}') && (fileBuffer[fileOffset] != 0))
    374. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    375. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(fileOffset >= fileSize) break;
    376.  
    377. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Is it a value?
    378. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(strncmp(&fileBuffer[fileOffset], "Value", sizeof("Value")-1) == 0)
    379. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    380. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileOffset+=(sizeof("Value")-1);
    381. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    382. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Get id
    383. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword id=0;
    384. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while((!util_isDigit(fileBuffer[fileOffset])) && (fileBuffer[fileOffset] != 0)) fileOffset++; //Approach the first digit
    385. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(fileBuffer[fileOffset] == 0) break;
    386. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while((util_isDigit(fileBuffer[fileOffset])) && (fileBuffer[fileOffset] != 0)) //Process digit
    387. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    388. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id*=10;
    389. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;id+=fileBuffer[fileOffset]-='0';
    390. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileOffset++;
    391. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    392. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(fileBuffer[fileOffset] == 0) break;
    393. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    394. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Get ,
    395. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while((fileBuffer[fileOffset] != ',') && (fileBuffer[fileOffset] != 0)) fileOffset++;
    396. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(fileBuffer[fileOffset] == 0) break;
    397. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileOffset++; //Skip the ,
    398. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    399. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Get stringData
    400. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword dataOffset=fileOffset;
    401. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword dataLen=0;
    402. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while((fileBuffer[fileOffset] != '\n') && (fileBuffer[fileOffset] != 0))
    403. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    404. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataLen++;
    405. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileOffset++;
    406. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    407. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(fileBuffer[fileOffset] == 0) break;
    408. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    409. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Trim string data on Left
    410. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while((dataLen > 0) && ((fileBuffer[dataOffset] == ' ') || (fileBuffer[dataOffset] == '\t') || (fileBuffer[dataOffset] == '\r')))
    411. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    412. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataOffset++;
    413. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataLen--;
    414. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    415. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    416. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Trim string data on Right
    417. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while((dataLen > 0) && ((fileBuffer[dataOffset+dataLen-1] == ' ') || (fileBuffer[dataOffset+dataLen-1] == '\t') || (fileBuffer[dataOffset+dataLen-1] == '\r')))
    418. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    419. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dataLen--;
    420. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    421. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    422. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Add Value to list
    423. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    424. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LayoutValue *layoutValuePointer=malloc(sizeof(LayoutValue));
    425. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    426. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Set the id
    427. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer->id=id;
    428. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    429. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Copy the value string data name to the element template, add term null to data
    430. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer->stringData=malloc(dataLen+1);
    431. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(layoutValuePointer->stringData, &fileBuffer[dataOffset], dataLen);
    432. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer->stringData[dataLen]=0;
    433. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    434. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Generate int value
    435. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer->intData=layout_getIntValue(layoutValuePointer->stringData);
    436. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    437. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Add to listElement's value list
    438. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list_addEntry(&layoutElementPointer->valueList, layoutValuePointer);
    439. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    440. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    441. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Is it a hexdump?
    442. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if(strncmp(&fileBuffer[fileOffset], "HexDump", sizeof("HexDump")-1) == 0)
    443. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    444. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileOffset+=(sizeof("HexDump")-1);
    445. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    446. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Get hexDumpData
    447. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while((fileBuffer[fileOffset] != '"') && (fileBuffer[fileOffset] != 0)) fileOffset++;
    448. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(fileBuffer[fileOffset] == 0) break;
    449. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    450. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword hexOffset=fileOffset;
    451. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword hexLen=2; //Include the first " and the last "
    452. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    453. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileOffset++; //Skip the "
    454. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while((fileBuffer[fileOffset] != '"') && (fileBuffer[fileOffset] != 0))
    455. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    456. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hexLen++;
    457. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileOffset++;
    458. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    459. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(fileBuffer[fileOffset] == 0) break;
    460. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    461. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Add hexDump to list
    462. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    463. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte *hexDumpData=malloc(hexLen+1);
    464. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(hexDumpData, &fileBuffer[hexOffset], hexLen);
    465. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hexDumpData[hexLen]=0;
    466. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    467. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Add to listElement's hexdump list
    468. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list_addEntry(&layoutElementPointer->hexDumpList, hexDumpData);
    469. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    470. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    471. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//All else
    472. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
    473. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    474. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileOffset++;
    475. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    476. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    477. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(fileBuffer[fileOffset] == 0) break;
    478. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileOffset++; //Skip the {
    479. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    480. &nbsp;&nbsp;&nbsp;&nbsp;}
    481. &nbsp;&nbsp;&nbsp;&nbsp;//All else
    482. &nbsp;&nbsp;&nbsp;&nbsp;else
    483. &nbsp;&nbsp;&nbsp;&nbsp;{
    484. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;fileOffset++;
    485. &nbsp;&nbsp;&nbsp;&nbsp;}
    486. &nbsp;&nbsp;}
    487. &nbsp;&nbsp;
    488. &nbsp;&nbsp;//Free the file from memory
    489. &nbsp;&nbsp;free(fileBuffer);
    490. }
    491.  
    492. LayoutValue *layout_getLayoutValue(LayoutElement *a_layoutElement, dword a_id)
    493. {
    494. &nbsp;&nbsp;dword entryIndex=0;
    495. &nbsp;&nbsp;dword entryTotal=list_getEntryCount(&a_layoutElement->valueList);
    496. &nbsp;&nbsp;while(entryIndex < entryTotal)
    497. &nbsp;&nbsp;{
    498. &nbsp;&nbsp;&nbsp;&nbsp;LayoutValue *layoutValuePointer=list_getEntry(&a_layoutElement->valueList, entryIndex);
    499. &nbsp;&nbsp;&nbsp;&nbsp;
    500. &nbsp;&nbsp;&nbsp;&nbsp;//Found a matching id
    501. &nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer->id == a_id)
    502. &nbsp;&nbsp;&nbsp;&nbsp;{
    503. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return layoutValuePointer;
    504. &nbsp;&nbsp;&nbsp;&nbsp;}
    505. &nbsp;&nbsp;&nbsp;&nbsp;
    506. &nbsp;&nbsp;&nbsp;&nbsp;//Goto the next entry
    507. &nbsp;&nbsp;&nbsp;&nbsp;entryIndex++;
    508. &nbsp;&nbsp;}
    509. &nbsp;&nbsp;
    510. &nbsp;&nbsp;//No such id found, return NULL
    511. &nbsp;&nbsp;return NULL;
    512. }
    513.  
    514. void layout_parsePcx(Layout *a_layout, byte *a_fileName)
    515. {
    516. &nbsp;&nbsp;if(a_layout == NULL) return;
    517. &nbsp;&nbsp;
    518. &nbsp;&nbsp;//Load the .pcx (ignoring the palette)
    519. &nbsp;&nbsp;FILE *file=fopen(a_fileName, "rb");
    520. &nbsp;&nbsp;if(!file) return;
    521. &nbsp;&nbsp;
    522. &nbsp;&nbsp;//Read the header
    523. &nbsp;&nbsp;if(fgetc(file)!=0xA) return;
    524. &nbsp;&nbsp;if(fgetc(file)!=0x5) return;
    525. &nbsp;&nbsp;if(fgetc(file)!=1) return;
    526. &nbsp;&nbsp;if(fgetc(file)!=8) return;
    527. &nbsp;&nbsp;
    528. &nbsp;&nbsp;//Get the image size
    529. &nbsp;&nbsp;word tempWidth;
    530. &nbsp;&nbsp;word tempHeight;
    531. &nbsp;&nbsp;word imageWidth;
    532. &nbsp;&nbsp;word imageHeight;
    533. &nbsp;&nbsp;fread(&tempWidth, 2, 1, file);
    534. &nbsp;&nbsp;fread(&tempHeight, 2, 1, file);
    535. &nbsp;&nbsp;fread(&imageWidth, 2, 1, file);
    536. &nbsp;&nbsp;fread(&imageHeight, 2, 1, file);
    537. &nbsp;&nbsp;imageWidth-=tempWidth;
    538. &nbsp;&nbsp;imageHeight-=tempHeight;
    539. &nbsp;&nbsp;imageWidth++;
    540. &nbsp;&nbsp;imageHeight++;
    541. &nbsp;&nbsp;if(!imageWidth || !imageHeight) return;
    542. &nbsp;&nbsp;
    543. &nbsp;&nbsp;//Expect 1 color plane
    544. &nbsp;&nbsp;fseek(file, 53, SEEK_CUR);
    545. &nbsp;&nbsp;if(fgetc(file)!=1) return;
    546. &nbsp;&nbsp;
    547. &nbsp;&nbsp;//Get the number of bytes per line
    548. &nbsp;&nbsp;word pcxBytesPerLine;
    549. &nbsp;&nbsp;fread(&pcxBytesPerLine, 2, 1, file);
    550. &nbsp;&nbsp;
    551. &nbsp;&nbsp;//Skip to the image data
    552. &nbsp;&nbsp;fseek(file, 128, SEEK_SET);
    553. &nbsp;&nbsp;
    554. &nbsp;&nbsp;//Calculate some constants
    555. &nbsp;&nbsp;dword dataSize=imageWidth * imageHeight;
    556.  
    557. &nbsp;&nbsp;//Allocate the buffer where the image is to be copied
    558. &nbsp;&nbsp;byte *pcxBitmap=malloc(dataSize);
    559.  
    560. &nbsp;&nbsp;//Decode the image
    561. &nbsp;&nbsp;{
    562. &nbsp;&nbsp;&nbsp;&nbsp;dword y=0;
    563. &nbsp;&nbsp;&nbsp;&nbsp;while(y < imageHeight)
    564. &nbsp;&nbsp;&nbsp;&nbsp;{
    565. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Setup the address at which the bitmap's written to
    566. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte *bitmap_rw=&pcxBitmap[y*imageWidth];
    567. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    568. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Loop till a break's requested
    569. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword subPixelCount=0;
    570. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(1)
    571. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    572. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Get the count and read values
    573. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte rleData=fgetc(file);&nbsp;&nbsp;
    574. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte rleValue=rleData;
    575. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte rleCount=1;
    576. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(0xC0 == (rleData & 0xC0))
    577. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    578. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rleCount=rleData & 0x3F;
    579. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rleValue=fgetc(file);
    580. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    581. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    582. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Decompress the RLE
    583. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(rleCount)
    584. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    585. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;subPixelCount++;
    586. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    587. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//8-bit transfer
    588. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*bitmap_rw++=rleValue;
    589. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    590. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Check if the scanline's done
    591. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(subPixelCount == imageWidth)
    592. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    593. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;subPixelCount=0;
    594. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;goto reset;
    595. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    596. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    597. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Decrement the counter
    598. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rleCount--;
    599. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    600. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    601. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;reset:
    602. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;y++;
    603. &nbsp;&nbsp;&nbsp;&nbsp;}
    604. &nbsp;&nbsp;}
    605.  
    606. &nbsp;&nbsp;//Find the true map dimensions
    607. &nbsp;&nbsp;dword sectionWidth=0;
    608. &nbsp;&nbsp;dword sectionHeight=0;
    609. &nbsp;&nbsp;{
    610. &nbsp;&nbsp;&nbsp;&nbsp;dword count=0;
    611. &nbsp;&nbsp;&nbsp;&nbsp;byte *bitmap_rw=NULL;
    612.  
    613. &nbsp;&nbsp;&nbsp;&nbsp;//Find the width (5th palette color = separator)
    614. &nbsp;&nbsp;&nbsp;&nbsp;bitmap_rw=pcxBitmap+1;
    615. &nbsp;&nbsp;&nbsp;&nbsp; for(count=0; *bitmap_rw == 5; count++)
    616. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bitmap_rw++;
    617. &nbsp;&nbsp;&nbsp;&nbsp;a_layout->layoutWidth=count;
    618. &nbsp;&nbsp;&nbsp;&nbsp;
    619. &nbsp;&nbsp;&nbsp;&nbsp;//Find the height (5th palette color = separator)
    620. &nbsp;&nbsp;&nbsp;&nbsp;bitmap_rw=pcxBitmap+imageWidth;
    621. &nbsp;&nbsp;&nbsp;&nbsp;for(count=0; *bitmap_rw == 5; count++)
    622. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bitmap_rw+=imageWidth;
    623. &nbsp;&nbsp;&nbsp;&nbsp;a_layout->layoutDepth=count; //Depth
    624. &nbsp;&nbsp;&nbsp;&nbsp;
    625. &nbsp;&nbsp;&nbsp;&nbsp;//Calculate the Height
    626. &nbsp;&nbsp;&nbsp;&nbsp;sectionWidth=imageWidth/(a_layout->layoutWidth+2);
    627. &nbsp;&nbsp;&nbsp;&nbsp;sectionHeight=imageHeight/(a_layout->layoutDepth+2);
    628. &nbsp;&nbsp;&nbsp;&nbsp;a_layout->layoutHeight=sectionWidth * sectionHeight; //Height
    629. &nbsp;&nbsp;}
    630. &nbsp;&nbsp;
    631. &nbsp;&nbsp;//Get the layout map buffer ready
    632. &nbsp;&nbsp;a_layout->layoutMap=malloc(a_layout->layoutWidth * a_layout->layoutHeight * a_layout->layoutDepth);
    633. &nbsp;&nbsp;
    634. &nbsp;&nbsp;//Copy the tiles in the correct order
    635. &nbsp;&nbsp;{
    636. &nbsp;&nbsp;&nbsp;&nbsp;sdword x,y,z,w;
    637. &nbsp;&nbsp;&nbsp;&nbsp;byte *bitmap_rw=pcxBitmap;
    638. &nbsp;&nbsp;&nbsp;&nbsp;for(y=0; y<sectionHeight; y++)
    639. &nbsp;&nbsp;&nbsp;&nbsp;{
    640. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bitmap_rw+=imageWidth;
    641. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(z=a_layout->layoutDepth-1; z>=0; z--)
    642. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    643. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(x=0; x<sectionWidth; x++)
    644. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    645. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bitmap_rw++; //Skip separator
    646. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte *sync=&a_layout->layoutMap[(y*sectionWidth*a_layout->layoutWidth*a_layout->layoutDepth)+(x*a_layout->layoutWidth*a_layout->layoutDepth)+(z*a_layout->layoutWidth)];
    647. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(w=0; w<a_layout->layoutWidth; w++)
    648. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    649. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*sync++=~(*bitmap_rw++);
    650. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    651. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bitmap_rw++; //Skip separator
    652. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    653. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    654. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bitmap_rw+=imageWidth;
    655. &nbsp;&nbsp;&nbsp;&nbsp;}
    656. &nbsp;&nbsp;}
    657. &nbsp;&nbsp;
    658. &nbsp;&nbsp;//Close the file
    659. &nbsp;&nbsp;fclose(file);
    660. }
    661.  
    662. dword layout_doesNeighborHaveNormalSide(Layout *a_layout, byte a_tileId, word a_x, word a_y, word a_z, word a_side)
    663. { //True = side is existant and non-scaled
    664. &nbsp;&nbsp;
    665. &nbsp;&nbsp;byte *sync;
    666. &nbsp;&nbsp;
    667. &nbsp;&nbsp;//Draw the map
    668. &nbsp;&nbsp;if(a_z >= a_layout->layoutDepth) return 0;
    669. &nbsp;&nbsp;if(a_x >= a_layout->layoutWidth) return 0;
    670. &nbsp;&nbsp;if(a_y >= a_layout->layoutHeight) return 0;
    671. &nbsp;&nbsp;
    672. &nbsp;&nbsp;//Does cube exist?
    673. &nbsp;&nbsp;sync=&a_layout->layoutMap[(a_y*a_layout->layoutWidth*a_layout->layoutDepth)+(a_z*a_layout->layoutWidth)+a_x];
    674. &nbsp;&nbsp;if(*sync)
    675. &nbsp;&nbsp;{
    676. &nbsp;&nbsp;&nbsp;&nbsp;//If the cubes are the same return true
    677. &nbsp;&nbsp;&nbsp;&nbsp;//Since this function will only be called if the original is unmodified
    678. &nbsp;&nbsp;&nbsp;&nbsp;if(a_tileId == *sync) return -1;
    679. &nbsp;&nbsp;&nbsp;&nbsp;
    680. &nbsp;&nbsp;&nbsp;&nbsp;//Read cube type
    681. &nbsp;&nbsp;&nbsp;&nbsp;LayoutElement *layoutElementPointer=NULL;
    682. &nbsp;&nbsp;&nbsp;&nbsp;LayoutValue *layoutValuePointer=NULL;
    683. &nbsp;&nbsp;&nbsp;&nbsp;
    684. &nbsp;&nbsp;&nbsp;&nbsp;//Get cube element id
    685. &nbsp;&nbsp;&nbsp;&nbsp;layoutElementPointer=list_getEntry(&a_layout->cubeList, (*sync)-1);
    686. &nbsp;&nbsp;&nbsp;&nbsp;if(layoutElementPointer == NULL) return 0;
    687. &nbsp;&nbsp;&nbsp;&nbsp;
    688. &nbsp;&nbsp;&nbsp;&nbsp;//Read cubeType
    689. &nbsp;&nbsp;&nbsp;&nbsp;dword cubeType=0;
    690. &nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 2);
    691. &nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL) cubeType=layoutValuePointer->intData;
    692. &nbsp;&nbsp;&nbsp;&nbsp;
    693. &nbsp;&nbsp;&nbsp;&nbsp;//Type is not cube
    694. &nbsp;&nbsp;&nbsp;&nbsp;if(cubeType != 0) return 0;
    695. &nbsp;&nbsp;&nbsp;&nbsp;
    696. &nbsp;&nbsp;&nbsp;&nbsp;//Check if cube has any scaling or offsetting
    697. &nbsp;&nbsp;&nbsp;&nbsp;///Nonexistant value's means values should be 0 by default
    698. &nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 16);
    699. &nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL)
    700. &nbsp;&nbsp;&nbsp;&nbsp;{
    701. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer->intData != 0) return 0;
    702. &nbsp;&nbsp;&nbsp;&nbsp;}
    703. &nbsp;&nbsp;&nbsp;&nbsp;
    704. &nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 17);
    705. &nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL)
    706. &nbsp;&nbsp;&nbsp;&nbsp;{
    707. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer->intData != 0) return 0;
    708. &nbsp;&nbsp;&nbsp;&nbsp;}
    709. &nbsp;&nbsp;&nbsp;&nbsp;
    710. &nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 18);
    711. &nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL)
    712. &nbsp;&nbsp;&nbsp;&nbsp;{
    713. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer->intData != 0) return 0;
    714. &nbsp;&nbsp;&nbsp;&nbsp;}
    715. &nbsp;&nbsp;&nbsp;&nbsp;
    716. &nbsp;&nbsp;&nbsp;&nbsp;//Check if side is to be drawn by checking if there's a texture
    717. &nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 3+a_side);
    718. &nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer == NULL) return 0;
    719. &nbsp;&nbsp;&nbsp;&nbsp;
    720. &nbsp;&nbsp;&nbsp;&nbsp;//Check that the cube is not a slope
    721. &nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 15);
    722. &nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL)
    723. &nbsp;&nbsp;&nbsp;&nbsp;{
    724. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Side qube is a slope
    725. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer->intData != 0) return 0;&nbsp;&nbsp;
    726. &nbsp;&nbsp;&nbsp;&nbsp;}
    727. &nbsp;&nbsp;&nbsp;&nbsp;
    728. &nbsp;&nbsp;&nbsp;&nbsp;//Side exists and is not scaled
    729. &nbsp;&nbsp;&nbsp;&nbsp;return -1;
    730. &nbsp;&nbsp;}
    731.  
    732. &nbsp;&nbsp;//No qube exists
    733. &nbsp;&nbsp;return 0;
    734. }
    735.  
    736. float layout_getDropDistance(Layout *a_layout, byte *a_slopeType, word a_x, word a_y, word a_z)
    737. {
    738. &nbsp;&nbsp;byte *sync;
    739. &nbsp;&nbsp;sdword y=0;
    740. &nbsp;&nbsp;float height=0.0f;
    741. &nbsp;&nbsp;*a_slopeType=0;
    742. &nbsp;&nbsp;
    743. &nbsp;&nbsp;//Skip the current piece
    744. &nbsp;&nbsp;a_y--;
    745. &nbsp;&nbsp;
    746. &nbsp;&nbsp;//Draw the map
    747. &nbsp;&nbsp;if(a_z >= a_layout->layoutDepth) return -1;
    748. &nbsp;&nbsp;if(a_x >= a_layout->layoutWidth) return -1;
    749. &nbsp;&nbsp;if(a_y >= a_layout->layoutHeight) return -1;
    750. &nbsp;&nbsp;
    751. &nbsp;&nbsp;for(y=a_y; y >= 0; y--) //Down to up
    752. &nbsp;&nbsp;{
    753. &nbsp;&nbsp;&nbsp;&nbsp;sync=&a_layout->layoutMap[(y*a_layout->layoutWidth*a_layout->layoutDepth)+(a_z*a_layout->layoutWidth)+a_x];
    754. &nbsp;&nbsp;&nbsp;&nbsp;if(*sync)
    755. &nbsp;&nbsp;&nbsp;&nbsp;{
    756. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Read cube type
    757. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LayoutElement *layoutElementPointer=NULL;
    758. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LayoutValue *layoutValuePointer=NULL;
    759. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    760. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Get cube element id
    761. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layoutElementPointer=list_getEntry(&a_layout->cubeList, (*sync)-1);
    762. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutElementPointer == NULL) return -1;
    763. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    764. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Read cubeType
    765. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword cubeType=0;
    766. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 2);
    767. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL) cubeType=layoutValuePointer->intData;
    768. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    769. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(cubeType == 0)
    770. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    771. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Return slope type
    772. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 15);
    773. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL) //Only apply the slope transformation if the cubeType is "Cube"
    774. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    775. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;*a_slopeType=layoutValuePointer->intData;
    776. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    777. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;return height;
    778. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    779. &nbsp;&nbsp;&nbsp;&nbsp;}
    780. &nbsp;&nbsp;&nbsp;&nbsp;height+=1.0f;
    781. &nbsp;&nbsp;}
    782. &nbsp;&nbsp;
    783. &nbsp;&nbsp;return -1;
    784. }
    Code (Text):
    1. void layout_drawCube(Layout *a_layout, float *a_matrix, byte a_tileId, word a_x, word a_y, word a_z)
    2. {
    3. &nbsp;&nbsp;LayoutElement *layoutElementPointer=NULL;
    4. &nbsp;&nbsp;LayoutValue *layoutValuePointer=NULL;
    5. &nbsp;&nbsp;
    6. &nbsp;&nbsp;//Do not draw if far away
    7. &nbsp;&nbsp;{
    8. &nbsp;&nbsp;&nbsp;&nbsp;float tempX=a_x;
    9. &nbsp;&nbsp;&nbsp;&nbsp;float tempY=a_y;
    10. &nbsp;&nbsp;&nbsp;&nbsp;float tempZ=a_z*1.54f;
    11. &nbsp;&nbsp;&nbsp;&nbsp;
    12. &nbsp;&nbsp;&nbsp;&nbsp;//Apply the matrices to the point
    13. &nbsp;&nbsp;&nbsp;&nbsp;vector_matrix_mul(tempX, tempY, tempZ, a_matrix);
    14. &nbsp;&nbsp;&nbsp;&nbsp;
    15. &nbsp;&nbsp;&nbsp;&nbsp;float distanceFromCamera=tempZ;//sqrt((tempX*tempX)+(tempY*tempY)+(tempZ*tempZ));
    16. &nbsp;&nbsp;&nbsp;&nbsp;//if(distanceFromCamera > 24.0f) return; //Do not draw far away cubes
    17. &nbsp;&nbsp;&nbsp;&nbsp;//if(distanceFromCamera >= 30.0f) { printf("%f %f %f\n", tempX, tempY, tempZ); return; } //Do not draw far away cubes
    18. &nbsp;&nbsp;&nbsp;&nbsp;if(distanceFromCamera < 0.0f) return;
    19. &nbsp;&nbsp;&nbsp;&nbsp;else if(distanceFromCamera >= 30.0f) return;
    20. &nbsp;&nbsp;}
    21. &nbsp;&nbsp;
    22. &nbsp;&nbsp;//Get cube element id
    23. &nbsp;&nbsp;layoutElementPointer=list_getEntry(&a_layout->cubeList, a_tileId-1);
    24. &nbsp;&nbsp;if(layoutElementPointer == NULL) return;
    25. &nbsp;&nbsp;
    26. &nbsp;&nbsp;//Read cubeFlags
    27. &nbsp;&nbsp;dword cubeFlags=0;
    28. &nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 1);
    29. &nbsp;&nbsp;if(layoutValuePointer != NULL) cubeFlags=layoutValuePointer->intData;
    30. &nbsp;&nbsp;
    31. &nbsp;&nbsp;//Is the cube active? If not don't draw it
    32. &nbsp;&nbsp;if(!(cubeFlags & LAYOUT_CDF_Active))
    33. &nbsp;&nbsp;&nbsp;&nbsp;return;
    34. &nbsp;&nbsp;
    35. &nbsp;&nbsp;//Read cubeType
    36. &nbsp;&nbsp;dword cubeType=0;
    37. &nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 2);
    38. &nbsp;&nbsp;if(layoutValuePointer != NULL) cubeType=layoutValuePointer->intData;
    39. &nbsp;&nbsp;
    40. &nbsp;&nbsp;//Generate cube texture lookup id based on side (for use with Value 003+[sideId])
    41. &nbsp;&nbsp;byte textureToSide[6]={0,1,2,3,4,5};
    42. &nbsp;&nbsp;
    43. &nbsp;&nbsp;//Is the cube in checkers mode? If so, remix the sides based on position of tile
    44. &nbsp;&nbsp;if(cubeFlags & LAYOUT_CDF_Chkrs)
    45. &nbsp;&nbsp;{
    46. &nbsp;&nbsp;&nbsp;&nbsp;if(((a_x+a_y+a_z)&1))
    47. &nbsp;&nbsp;&nbsp;&nbsp;{
    48. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;textureToSide[0]=5;
    49. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;textureToSide[1]=3;
    50. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;textureToSide[2]=4;
    51. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;textureToSide[3]=1;
    52. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;textureToSide[4]=2;
    53. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;textureToSide[5]=0;
    54. &nbsp;&nbsp;&nbsp;&nbsp;}
    55. &nbsp;&nbsp;}
    56. &nbsp;&nbsp;
    57. &nbsp;&nbsp;//Fetch cube scale
    58. &nbsp;&nbsp;dword unmodifiedShape=-1;
    59. &nbsp;&nbsp;float xScale=1.0f;
    60. &nbsp;&nbsp;float yScale=1.0f;
    61. &nbsp;&nbsp;float zScale=1.0f;
    62. &nbsp;&nbsp;float xOffset=0.0f;
    63. &nbsp;&nbsp;float yOffset=0.0f;
    64. &nbsp;&nbsp;float zOffset=0.0f;
    65. &nbsp;&nbsp;{
    66. &nbsp;&nbsp;&nbsp;&nbsp;dword value=0;
    67. &nbsp;&nbsp;
    68. &nbsp;&nbsp;&nbsp;&nbsp;//Get xso
    69. &nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 16);
    70. &nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL)
    71. &nbsp;&nbsp;&nbsp;&nbsp;{
    72. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value=layoutValuePointer->intData;
    73. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(value != 0) unmodifiedShape=0;
    74. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xScale=1+(sword)(value>>0)/128.0f;
    75. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;xOffset=(sword)(value>>16)/256.0f;
    76. &nbsp;&nbsp;&nbsp;&nbsp;}
    77. &nbsp;&nbsp;&nbsp;&nbsp;
    78. &nbsp;&nbsp;&nbsp;&nbsp;//Get yso
    79. &nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 17);
    80. &nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL)
    81. &nbsp;&nbsp;&nbsp;&nbsp;{
    82. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value=layoutValuePointer->intData;
    83. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(value != 0) unmodifiedShape=0;
    84. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yScale=1+(sword)(value>>0)/128.0f;
    85. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;yOffset=(sword)(value>>16)/256.0f;
    86. &nbsp;&nbsp;&nbsp;&nbsp;}
    87. &nbsp;&nbsp;&nbsp;&nbsp;
    88. &nbsp;&nbsp;&nbsp;&nbsp;//Get zso
    89. &nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 18);
    90. &nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL)
    91. &nbsp;&nbsp;&nbsp;&nbsp;{
    92. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;value=layoutValuePointer->intData;
    93. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(value != 0) unmodifiedShape=0;
    94. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zScale=1+(sword)(value>>0)/128.0f;
    95. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;zOffset=(sword)(value>>16)/256.0f;
    96. &nbsp;&nbsp;&nbsp;&nbsp;}
    97. &nbsp;&nbsp;}
    98. &nbsp;&nbsp;
    99. &nbsp;&nbsp;//Initiate the cube mesh
    100. &nbsp;&nbsp;Vertex cubeVertex[9]=
    101. &nbsp;&nbsp;{
    102. &nbsp;&nbsp;&nbsp;&nbsp;{xOffset+a_x-0.5f*xScale, yOffset+a_y+0.5f*yScale, (zOffset+a_z)*1.54f-0.5f*1.54f*zScale}, //Front, top-left
    103. &nbsp;&nbsp;&nbsp;&nbsp;{xOffset+a_x+0.5f*xScale, yOffset+a_y+0.5f*yScale, (zOffset+a_z)*1.54f-0.5f*1.54f*zScale}, //Front, top-right
    104. &nbsp;&nbsp;&nbsp;&nbsp;{xOffset+a_x-0.5f*xScale, yOffset+a_y-0.5f*yScale, (zOffset+a_z)*1.54f-0.5f*1.54f*zScale}, //Front, bottom-left
    105. &nbsp;&nbsp;&nbsp;&nbsp;{xOffset+a_x+0.5f*xScale, yOffset+a_y-0.5f*yScale, (zOffset+a_z)*1.54f-0.5f*1.54f*zScale}, //Front, bottom-right
    106. &nbsp;&nbsp;&nbsp;&nbsp;
    107. &nbsp;&nbsp;&nbsp;&nbsp;{xOffset+a_x-0.5f*xScale, yOffset+a_y+0.5f*yScale, (zOffset+a_z)*1.54f+0.5f*1.54f*zScale}, //Back, top-left
    108. &nbsp;&nbsp;&nbsp;&nbsp;{xOffset+a_x+0.5f*xScale, yOffset+a_y+0.5f*yScale, (zOffset+a_z)*1.54f+0.5f*1.54f*zScale}, //Back, top-right
    109. &nbsp;&nbsp;&nbsp;&nbsp;{xOffset+a_x-0.5f*xScale, yOffset+a_y-0.5f*yScale, (zOffset+a_z)*1.54f+0.5f*1.54f*zScale}, //Back, bottom-left
    110. &nbsp;&nbsp;&nbsp;&nbsp;{xOffset+a_x+0.5f*xScale, yOffset+a_y-0.5f*yScale, (zOffset+a_z)*1.54f+0.5f*1.54f*zScale}, //Back, bottom-right
    111. &nbsp;&nbsp;&nbsp;&nbsp;
    112. &nbsp;&nbsp;&nbsp;&nbsp;{xOffset+a_x, yOffset+a_y, (zOffset+a_z)*1.54f}, //Center
    113. &nbsp;&nbsp;};
    114. &nbsp;&nbsp;
    115. &nbsp;&nbsp;//Deform cube mesh if there's a slope
    116. &nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 15);
    117. &nbsp;&nbsp;if((layoutValuePointer != NULL) && (cubeType == 0)) //Only apply the slope transformation if the cubeType is "Cube"
    118. &nbsp;&nbsp;{
    119. &nbsp;&nbsp;&nbsp;&nbsp;dword value=layoutValuePointer->intData;
    120. &nbsp;&nbsp;&nbsp;&nbsp;if(value != 0) unmodifiedShape=0;
    121. &nbsp;&nbsp;
    122. &nbsp;&nbsp;&nbsp;&nbsp;//Use the appropriate transformation
    123. &nbsp;&nbsp;&nbsp;&nbsp;switch(value)
    124. &nbsp;&nbsp;&nbsp;&nbsp;{
    125. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 0: break; //None
    126. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    127. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 5: //Left plane: back down to front
    128. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&cubeVertex[0], &cubeVertex[2], sizeof(Vertex));
    129. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&cubeVertex[1], &cubeVertex[3], sizeof(Vertex));
    130. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
    131. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    132. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 8: //Left plane: front down to back
    133. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&cubeVertex[5], &cubeVertex[1], sizeof(Vertex));
    134. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&cubeVertex[4], &cubeVertex[0], sizeof(Vertex));
    135. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
    136. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    137. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 6: //Left plane: back up to front
    138. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&cubeVertex[2], &cubeVertex[0], sizeof(Vertex));
    139. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&cubeVertex[3], &cubeVertex[1], sizeof(Vertex));
    140. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
    141. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    142. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 7: //Left plane: front up to back
    143. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&cubeVertex[6], &cubeVertex[4], sizeof(Vertex));
    144. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&cubeVertex[7], &cubeVertex[5], sizeof(Vertex));
    145. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
    146. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    147. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 1: //Front plane: left down to right
    148. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&cubeVertex[1], &cubeVertex[3], sizeof(Vertex));
    149. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&cubeVertex[5], &cubeVertex[7], sizeof(Vertex));
    150. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
    151. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    152. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 4: //Front plane: right down to left
    153. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&cubeVertex[0], &cubeVertex[1], sizeof(Vertex));
    154. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&cubeVertex[4], &cubeVertex[5], sizeof(Vertex));
    155. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
    156. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    157. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 2: //Front plane: left up to right
    158. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&cubeVertex[3], &cubeVertex[2], sizeof(Vertex));
    159. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&cubeVertex[7], &cubeVertex[6], sizeof(Vertex));
    160. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
    161. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    162. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 3: //Front plane: right up to left
    163. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&cubeVertex[2], &cubeVertex[0], sizeof(Vertex));
    164. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&cubeVertex[6], &cubeVertex[4], sizeof(Vertex));
    165. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
    166. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    167. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Questionable setup *fix*
    168. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 12: //Top plane: back down to front
    169. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&cubeVertex[1], &cubeVertex[0], sizeof(Vertex));
    170. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&cubeVertex[3], &cubeVertex[2], sizeof(Vertex));
    171. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
    172. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    173. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 9: //Top plane: back up to front //10-12
    174. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&cubeVertex[0], &cubeVertex[4], sizeof(Vertex));
    175. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&cubeVertex[2], &cubeVertex[6], sizeof(Vertex));
    176. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
    177. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    178. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 11: //Top plane: front down to back //12-10
    179. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//memcpy(&cubeVertex[5], &cubeVertex[1], sizeof(Vertex));
    180. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//memcpy(&cubeVertex[7], &cubeVertex[3], sizeof(Vertex));
    181. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&cubeVertex[5], &cubeVertex[4], sizeof(Vertex));
    182. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&cubeVertex[7], &cubeVertex[6], sizeof(Vertex));
    183. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
    184. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    185. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 10: //Top plane: front up to back
    186. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&cubeVertex[4], &cubeVertex[5], sizeof(Vertex));
    187. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&cubeVertex[6], &cubeVertex[7], sizeof(Vertex));
    188. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
    189. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    190. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;/*case 9: //Top plane: back down to front
    191. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&cubeVertex[1], &cubeVertex[0], sizeof(Vertex));
    192. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&cubeVertex[3], &cubeVertex[2], sizeof(Vertex));
    193. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
    194. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    195. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 12: //Top plane: front down to back
    196. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&cubeVertex[5], &cubeVertex[1], sizeof(Vertex));
    197. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&cubeVertex[7], &cubeVertex[3], sizeof(Vertex));
    198. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&cubeVertex[1], &cubeVertex[0], sizeof(Vertex));
    199. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&cubeVertex[3], &cubeVertex[2], sizeof(Vertex));
    200. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&cubeVertex[0], &cubeVertex[4], sizeof(Vertex));
    201. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&cubeVertex[2], &cubeVertex[6], sizeof(Vertex));
    202. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
    203. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    204. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 10: //Top plane: back up to front
    205. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&cubeVertex[0], &cubeVertex[4], sizeof(Vertex));
    206. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&cubeVertex[2], &cubeVertex[6], sizeof(Vertex));
    207. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&cubeVertex[4], &cubeVertex[5], sizeof(Vertex));
    208. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&cubeVertex[6], &cubeVertex[7], sizeof(Vertex));
    209. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&cubeVertex[5], &cubeVertex[1], sizeof(Vertex));
    210. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&cubeVertex[7], &cubeVertex[3], sizeof(Vertex));
    211. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
    212. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    213. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;case 11: //Top plane: front up to back
    214. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&cubeVertex[4], &cubeVertex[5], sizeof(Vertex));
    215. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;memcpy(&cubeVertex[6], &cubeVertex[7], sizeof(Vertex));
    216. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;*/
    217. &nbsp;&nbsp;&nbsp;&nbsp;}
    218. &nbsp;&nbsp;}
    219. &nbsp;&nbsp;
    220. &nbsp;&nbsp;//Transform the mesh based on the cubeType
    221. &nbsp;&nbsp;if(cubeType == 0) //Cube
    222. &nbsp;&nbsp;{
    223. &nbsp;&nbsp;&nbsp;&nbsp;//return;
    224. &nbsp;&nbsp;}
    225. &nbsp;&nbsp;else if(cubeType == 1) //Sprite Center
    226. &nbsp;&nbsp;{
    227. &nbsp;&nbsp;&nbsp;&nbsp;//return;
    228. &nbsp;&nbsp;}
    229. &nbsp;&nbsp;else if(cubeType == 2) //Sprite Front (unk)
    230. &nbsp;&nbsp;{
    231. &nbsp;&nbsp;&nbsp;&nbsp;//printf("unk2 found\n");
    232. &nbsp;&nbsp;&nbsp;&nbsp;//system("pause");
    233. &nbsp;&nbsp;&nbsp;&nbsp;//return;
    234. &nbsp;&nbsp;&nbsp;&nbsp;//Found in Fern_01
    235. &nbsp;&nbsp;}
    236. &nbsp;&nbsp;else if(cubeType == 3) //45 deg X
    237. &nbsp;&nbsp;{
    238. &nbsp;&nbsp;&nbsp;&nbsp;//return;
    239. &nbsp;&nbsp;}
    240. &nbsp;&nbsp;else if(cubeType == 4) //90 deg X
    241. &nbsp;&nbsp;{
    242. &nbsp;&nbsp;&nbsp;&nbsp;//return;
    243. &nbsp;&nbsp;}
    244. &nbsp;&nbsp;else if(cubeType == 5) //Diamond (unk)
    245. &nbsp;&nbsp;{
    246. &nbsp;&nbsp;&nbsp;&nbsp;//printf("unk5 found\n");
    247. &nbsp;&nbsp;&nbsp;&nbsp;//system("pause");
    248. &nbsp;&nbsp;&nbsp;&nbsp;//return;
    249. &nbsp;&nbsp;&nbsp;&nbsp;//Found in Neo_01
    250. &nbsp;&nbsp;}
    251. &nbsp;&nbsp;else if(cubeType == 6) //Sprite with Shadow
    252. &nbsp;&nbsp;{
    253. &nbsp;&nbsp;&nbsp;&nbsp;//return;
    254. &nbsp;&nbsp;}
    255. &nbsp;&nbsp;else if(cubeType == 7) //Pyramid (unk)
    256. &nbsp;&nbsp;{
    257. &nbsp;&nbsp;&nbsp;&nbsp;//printf("unk7 found\n");
    258. &nbsp;&nbsp;&nbsp;&nbsp;//system("pause");
    259. &nbsp;&nbsp;&nbsp;&nbsp;return;
    260. &nbsp;&nbsp;}
    261. &nbsp;&nbsp;
    262. &nbsp;&nbsp;//Figure which sides are double sided
    263. &nbsp;&nbsp;dword doubleSidedFlag=0;
    264. &nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 20);
    265. &nbsp;&nbsp;if(layoutValuePointer != NULL) doubleSidedFlag=layoutValuePointer->intData;
    266. &nbsp;&nbsp;
    267. &nbsp;&nbsp;//Setup draw settings
    268. &nbsp;&nbsp;texture_enable(true);
    269. &nbsp;&nbsp;texture_color(255, 255, 255);
    270. &nbsp;&nbsp;texture_smooth(false);
    271. &nbsp;&nbsp;
    272. &nbsp;&nbsp;//Front Face
    273. &nbsp;&nbsp;do
    274. &nbsp;&nbsp;{
    275. &nbsp;&nbsp;&nbsp;&nbsp;//Choose texture, if there's no texture do not draw
    276. &nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 3+textureToSide[5]);
    277. &nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer == NULL) break;
    278. &nbsp;&nbsp;&nbsp;&nbsp;List *listPointer=&a_layout->layoutTexture[layoutValuePointer->intData].frameList;
    279. &nbsp;&nbsp;&nbsp;&nbsp;texture_set(list_getEntry(listPointer, (a_layout->clock)%list_getEntryCount(listPointer)));
    280. &nbsp;&nbsp;&nbsp;&nbsp;
    281. &nbsp;&nbsp;&nbsp;&nbsp;//Can this face be optimized?
    282. &nbsp;&nbsp;&nbsp;&nbsp;//Can only be applied to shapes that are not modified via scaling or offsetting
    283. &nbsp;&nbsp;&nbsp;&nbsp;if(unmodifiedShape)
    284. &nbsp;&nbsp;&nbsp;&nbsp;{
    285. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Do not draw if the in the front shape's back face is visible
    286. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layout_doesNeighborHaveNormalSide(a_layout, a_tileId, a_x, a_y, a_z-1, 0)) break;
    287. &nbsp;&nbsp;&nbsp;&nbsp;}
    288. &nbsp;&nbsp;&nbsp;&nbsp;
    289. &nbsp;&nbsp;&nbsp;&nbsp;//Is it blended? Don't draw it on the first draw stage
    290. &nbsp;&nbsp;&nbsp;&nbsp;if(layout_drawPhase == 0)
    291. &nbsp;&nbsp;&nbsp;&nbsp;{
    292. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LayoutElement *textureElement=a_layout->layoutTexture[layoutValuePointer->intData].textureElement;
    293. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(textureElement != NULL)
    294. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    295. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(textureElement, 2);
    296. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL)
    297. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    298. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer->intData & LAYOUT_Blend) break;
    299. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    300. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    301. &nbsp;&nbsp;&nbsp;&nbsp;}
    302. &nbsp;&nbsp;&nbsp;&nbsp;
    303. &nbsp;&nbsp;&nbsp;&nbsp;//Is it double sided?
    304. &nbsp;&nbsp;&nbsp;&nbsp;texture_noclip(doubleSidedFlag & LAYOUT_FRONT);
    305.  
    306. &nbsp;&nbsp;&nbsp;&nbsp;//Apply global shading
    307. &nbsp;&nbsp;&nbsp;&nbsp;sword shadeDelta=255+a_layout->layoutShading[5];
    308. &nbsp;&nbsp;&nbsp;&nbsp;shadeDelta=(byte)shadeDelta;
    309. &nbsp;&nbsp;&nbsp;&nbsp;
    310. &nbsp;&nbsp;&nbsp;&nbsp;//Apply local shading
    311. &nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 29+5);
    312. &nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL)
    313. &nbsp;&nbsp;&nbsp;&nbsp;{
    314. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbyte localShadeDelta=layoutValuePointer->intData >> 16;
    315. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shadeDelta+=localShadeDelta*16;
    316. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    317. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Is it blended
    318. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer->intData & LAYOUT_Blend) texture_alpha(128);
    319. &nbsp;&nbsp;&nbsp;&nbsp;}
    320. &nbsp;&nbsp;&nbsp;&nbsp;if(shadeDelta < 0) shadeDelta=0; else if(shadeDelta > 255) shadeDelta=255;
    321. &nbsp;&nbsp;&nbsp;&nbsp;if(cubeType == 0) texture_color(shadeDelta, shadeDelta, shadeDelta);
    322. &nbsp;&nbsp;&nbsp;&nbsp;else texture_color(255, 255, 255);
    323. &nbsp;&nbsp;&nbsp;&nbsp;
    324. &nbsp;&nbsp;&nbsp;&nbsp;//Setup uvs
    325. &nbsp;&nbsp;&nbsp;&nbsp;float uvAx=0.0f, uvAy=0.0f;
    326. &nbsp;&nbsp;&nbsp;&nbsp;float uvBx=0.0f, uvBy=1.0f;
    327. &nbsp;&nbsp;&nbsp;&nbsp;float uvCx=1.0f, uvCy=1.0f;
    328. &nbsp;&nbsp;&nbsp;&nbsp;float uvDx=1.0f, uvDy=0.0f;
    329. &nbsp;&nbsp;&nbsp;&nbsp;
    330. &nbsp;&nbsp;&nbsp;&nbsp;//Manage UVs
    331. &nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 29+textureToSide[5]);
    332. &nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL)
    333. &nbsp;&nbsp;&nbsp;&nbsp;{
    334. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer->intData & LAYOUT_FlipH)
    335. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    336. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float temp;
    337. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    338. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvAx;uvAx=uvDx;uvDx=temp;
    339. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvAy;uvAy=uvDy;uvDy=temp;
    340. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvBx;uvBx=uvCx;uvCx=temp;
    341. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvBy;uvBy=uvCy;uvCy=temp;
    342. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    343. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer->intData & LAYOUT_FlipV)
    344. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    345. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float temp;
    346. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    347. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvAx;uvAx=uvBx;uvBx=temp;
    348. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvAy;uvAy=uvBy;uvBy=temp;
    349. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvDx;uvDx=uvCx;uvCx=temp;
    350. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvDy;uvDy=uvCy;uvCy=temp;
    351. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    352. &nbsp;&nbsp;&nbsp;&nbsp;}
    353. &nbsp;&nbsp;&nbsp;&nbsp;
    354. &nbsp;&nbsp;&nbsp;&nbsp;//Draw
    355. &nbsp;&nbsp;&nbsp;&nbsp;if((cubeType == 4) || (cubeType == 3))
    356. &nbsp;&nbsp;&nbsp;&nbsp;{ //Back-right leg
    357. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glBegin(GL_QUADS);
    358. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvDx, uvDy); reflex(a_matrix, cubeVertex[8].x, cubeVertex[0].y, cubeVertex[8].z);
    359. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvCx, uvCy); reflex(a_matrix, cubeVertex[8].x, cubeVertex[2].y, cubeVertex[8].z);
    360. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvBx, uvBy); reflex(a_matrix, cubeVertex[7].x, cubeVertex[7].y, cubeVertex[7].z);
    361. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvAx, uvAy); reflex(a_matrix, cubeVertex[5].x, cubeVertex[5].y, cubeVertex[5].z);
    362. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glEnd();
    363. &nbsp;&nbsp;&nbsp;&nbsp;}
    364. &nbsp;&nbsp;&nbsp;&nbsp;else
    365. &nbsp;&nbsp;&nbsp;&nbsp;{
    366. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glBegin(GL_QUADS);
    367. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvAx, uvAy); reflex(a_matrix, cubeVertex[0].x, cubeVertex[0].y, cubeVertex[0].z);
    368. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvBx, uvBy); reflex(a_matrix, cubeVertex[2].x, cubeVertex[2].y, cubeVertex[2].z);
    369. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvCx, uvCy); reflex(a_matrix, cubeVertex[3].x, cubeVertex[3].y, cubeVertex[3].z);
    370. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvDx, uvDy); reflex(a_matrix, cubeVertex[1].x, cubeVertex[1].y, cubeVertex[1].z);
    371. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glEnd();
    372. &nbsp;&nbsp;&nbsp;&nbsp;}
    373. &nbsp;&nbsp;} while(0);
    374. &nbsp;&nbsp;
    375. &nbsp;&nbsp;//Top Face
    376. &nbsp;&nbsp;do
    377. &nbsp;&nbsp;{
    378. &nbsp;&nbsp;&nbsp;&nbsp;texture_alpha(255);
    379. &nbsp;&nbsp;&nbsp;&nbsp;
    380. &nbsp;&nbsp;&nbsp;&nbsp;//Choose texture, if there's no texture do not draw
    381. &nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 3+textureToSide[1]);
    382. &nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer == NULL) break;
    383. &nbsp;&nbsp;&nbsp;&nbsp;List *listPointer=&a_layout->layoutTexture[layoutValuePointer->intData].frameList;
    384. &nbsp;&nbsp;&nbsp;&nbsp;texture_set(list_getEntry(listPointer, (a_layout->clock)%list_getEntryCount(listPointer)));
    385. &nbsp;&nbsp;&nbsp;&nbsp;
    386. &nbsp;&nbsp;&nbsp;&nbsp;//Can this face be optimized?
    387. &nbsp;&nbsp;&nbsp;&nbsp;//Can only be applied to shapes that are not modified via scaling or offsetting
    388. &nbsp;&nbsp;&nbsp;&nbsp;if(unmodifiedShape)
    389. &nbsp;&nbsp;&nbsp;&nbsp;{
    390. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Do not draw if the above shape's bottom face is visible
    391. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layout_doesNeighborHaveNormalSide(a_layout, a_tileId, a_x, a_y+1, a_z, 3)) break;
    392. &nbsp;&nbsp;&nbsp;&nbsp;}
    393. &nbsp;&nbsp;&nbsp;&nbsp;
    394. &nbsp;&nbsp;&nbsp;&nbsp;//Is it blended? Don't draw it on the first draw stage
    395. &nbsp;&nbsp;&nbsp;&nbsp;if(layout_drawPhase == 0)
    396. &nbsp;&nbsp;&nbsp;&nbsp;{
    397. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LayoutElement *textureElement=a_layout->layoutTexture[layoutValuePointer->intData].textureElement;
    398. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(textureElement != NULL)
    399. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    400. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(textureElement, 2);
    401. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL)
    402. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    403. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer->intData & LAYOUT_Blend) break;
    404. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    405. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    406. &nbsp;&nbsp;&nbsp;&nbsp;}
    407. &nbsp;&nbsp;&nbsp;&nbsp;
    408. &nbsp;&nbsp;&nbsp;&nbsp;//Is it double sided?
    409. &nbsp;&nbsp;&nbsp;&nbsp;texture_noclip(doubleSidedFlag & LAYOUT_TOP);
    410. &nbsp;&nbsp;&nbsp;&nbsp;
    411. &nbsp;&nbsp;&nbsp;&nbsp;//Apply global shading
    412. &nbsp;&nbsp;&nbsp;&nbsp;sword shadeDelta=255+a_layout->layoutShading[1];
    413. &nbsp;&nbsp;&nbsp;&nbsp;shadeDelta=(byte)shadeDelta;
    414. &nbsp;&nbsp;&nbsp;&nbsp;
    415. &nbsp;&nbsp;&nbsp;&nbsp;//Apply local shading
    416. &nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 29+1);
    417. &nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL)
    418. &nbsp;&nbsp;&nbsp;&nbsp;{
    419. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbyte localShadeDelta=layoutValuePointer->intData >> 16;
    420. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shadeDelta+=localShadeDelta*16;
    421. &nbsp;&nbsp;&nbsp;&nbsp;}
    422. &nbsp;&nbsp;&nbsp;&nbsp;if(shadeDelta < 0) shadeDelta=0; else if(shadeDelta > 255) shadeDelta=255;
    423. &nbsp;&nbsp;&nbsp;&nbsp;if(cubeType == 0) texture_color(shadeDelta, shadeDelta, shadeDelta);
    424. &nbsp;&nbsp;&nbsp;&nbsp;else texture_color(255, 255, 255);
    425. &nbsp;&nbsp;&nbsp;&nbsp;
    426. &nbsp;&nbsp;&nbsp;&nbsp;//Setup uvs
    427. &nbsp;&nbsp;&nbsp;&nbsp;float uvAx=1.0f, uvAy=1.0f;
    428. &nbsp;&nbsp;&nbsp;&nbsp;float uvBx=1.0f, uvBy=0.0f;
    429. &nbsp;&nbsp;&nbsp;&nbsp;float uvCx=0.0f, uvCy=0.0f;
    430. &nbsp;&nbsp;&nbsp;&nbsp;float uvDx=0.0f, uvDy=1.0f;
    431. &nbsp;&nbsp;&nbsp;&nbsp;
    432. &nbsp;&nbsp;&nbsp;&nbsp;//Manage UVs
    433. &nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 29+textureToSide[1]);
    434. &nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL)
    435. &nbsp;&nbsp;&nbsp;&nbsp;{
    436. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer->intData & LAYOUT_FlipH)
    437. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    438. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float temp;
    439. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvAx;uvAx=uvDx;uvDx=temp;
    440. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvAy;uvAy=uvDy;uvDy=temp;
    441. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvBx;uvBx=uvCx;uvCx=temp;
    442. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvBy;uvBy=uvCy;uvCy=temp;
    443. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    444. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer->intData & LAYOUT_FlipV)
    445. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    446. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float temp;
    447. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    448. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvAx;uvAx=uvBx;uvBx=temp;
    449. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvAy;uvAy=uvBy;uvBy=temp;
    450. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvDx;uvDx=uvCx;uvCx=temp;
    451. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvDy;uvDy=uvCy;uvCy=temp;
    452. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    453. &nbsp;&nbsp;&nbsp;&nbsp;}
    454. &nbsp;&nbsp;&nbsp;&nbsp;
    455. &nbsp;&nbsp;&nbsp;&nbsp;//Draw
    456. &nbsp;&nbsp;&nbsp;&nbsp;glBegin(GL_QUADS);
    457. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvAx, uvAy); reflex(a_matrix, cubeVertex[1].x, cubeVertex[1].y, cubeVertex[1].z);
    458. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvBx, uvBy); reflex(a_matrix, cubeVertex[5].x, cubeVertex[5].y, cubeVertex[5].z);
    459. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvCx, uvCy); reflex(a_matrix, cubeVertex[4].x, cubeVertex[4].y, cubeVertex[4].z);
    460. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvDx, uvDy); reflex(a_matrix, cubeVertex[0].x, cubeVertex[0].y, cubeVertex[0].z);
    461. &nbsp;&nbsp;&nbsp;&nbsp;glEnd();
    462. &nbsp;&nbsp;} while(0);
    463. &nbsp;&nbsp;
    464. &nbsp;&nbsp;//Back Face
    465. &nbsp;&nbsp;do
    466. &nbsp;&nbsp;{
    467. &nbsp;&nbsp;&nbsp;&nbsp;texture_alpha(255);
    468. &nbsp;&nbsp;&nbsp;&nbsp;
    469. &nbsp;&nbsp;&nbsp;&nbsp;//Choose texture, if there's no texture do not draw
    470. &nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 3+textureToSide[0]);
    471. &nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer == NULL) break;
    472. &nbsp;&nbsp;&nbsp;&nbsp;List *listPointer=&a_layout->layoutTexture[layoutValuePointer->intData].frameList;
    473. &nbsp;&nbsp;&nbsp;&nbsp;texture_set(list_getEntry(listPointer, (a_layout->clock)%list_getEntryCount(listPointer)));
    474. &nbsp;&nbsp;&nbsp;&nbsp;
    475. &nbsp;&nbsp;&nbsp;&nbsp;//Can this face be optimized?
    476. &nbsp;&nbsp;&nbsp;&nbsp;//Can only be applied to shapes that are not modified via scaling or offsetting
    477. &nbsp;&nbsp;&nbsp;&nbsp;if(unmodifiedShape)
    478. &nbsp;&nbsp;&nbsp;&nbsp;{
    479. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Do not draw if the in the back shape's front face is visible
    480. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layout_doesNeighborHaveNormalSide(a_layout, a_tileId, a_x, a_y, a_z+1, 5)) break;
    481. &nbsp;&nbsp;&nbsp;&nbsp;}
    482. &nbsp;&nbsp;&nbsp;&nbsp;
    483. &nbsp;&nbsp;&nbsp;&nbsp;//Is it blended? Don't draw it on the first draw stage
    484. &nbsp;&nbsp;&nbsp;&nbsp;if(layout_drawPhase == 0)
    485. &nbsp;&nbsp;&nbsp;&nbsp;{
    486. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LayoutElement *textureElement=a_layout->layoutTexture[layoutValuePointer->intData].textureElement;
    487. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(textureElement != NULL)
    488. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    489. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(textureElement, 2);
    490. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL)
    491. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    492. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer->intData & LAYOUT_Blend) break;
    493. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    494. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    495. &nbsp;&nbsp;&nbsp;&nbsp;}
    496. &nbsp;&nbsp;&nbsp;&nbsp;
    497. &nbsp;&nbsp;&nbsp;&nbsp;//Is it double sided?
    498. &nbsp;&nbsp;&nbsp;&nbsp;texture_noclip(doubleSidedFlag & LAYOUT_BACK);
    499. &nbsp;&nbsp;&nbsp;&nbsp;
    500. &nbsp;&nbsp;&nbsp;&nbsp;//Apply global shading
    501. &nbsp;&nbsp;&nbsp;&nbsp;sword shadeDelta=255+a_layout->layoutShading[0];
    502. &nbsp;&nbsp;&nbsp;&nbsp;shadeDelta=(byte)shadeDelta;
    503. &nbsp;&nbsp;&nbsp;&nbsp;
    504. &nbsp;&nbsp;&nbsp;&nbsp;//Apply local shading
    505. &nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 29+0);
    506. &nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL)
    507. &nbsp;&nbsp;&nbsp;&nbsp;{
    508. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbyte localShadeDelta=layoutValuePointer->intData >> 16;
    509. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shadeDelta+=localShadeDelta*16;
    510. &nbsp;&nbsp;&nbsp;&nbsp;}
    511. &nbsp;&nbsp;&nbsp;&nbsp;if(shadeDelta < 0) shadeDelta=0; else if(shadeDelta > 255) shadeDelta=255;
    512. &nbsp;&nbsp;&nbsp;&nbsp;if(cubeType == 0) texture_color(shadeDelta, shadeDelta, shadeDelta);
    513. &nbsp;&nbsp;&nbsp;&nbsp;else texture_color(255, 255, 255);
    514. &nbsp;&nbsp;&nbsp;&nbsp;
    515. &nbsp;&nbsp;&nbsp;&nbsp;//Setup uvs
    516. &nbsp;&nbsp;&nbsp;&nbsp;float uvAx=0.0f, uvAy=0.0f;
    517. &nbsp;&nbsp;&nbsp;&nbsp;float uvBx=0.0f, uvBy=1.0f;
    518. &nbsp;&nbsp;&nbsp;&nbsp;float uvCx=1.0f, uvCy=1.0f;
    519. &nbsp;&nbsp;&nbsp;&nbsp;float uvDx=1.0f, uvDy=0.0f;
    520. &nbsp;&nbsp;&nbsp;&nbsp;
    521. &nbsp;&nbsp;&nbsp;&nbsp;//Manage UVs
    522. &nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 29+textureToSide[0]);
    523. &nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL)
    524. &nbsp;&nbsp;&nbsp;&nbsp;{
    525. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer->intData & LAYOUT_FlipH)
    526. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    527. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float temp;
    528. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvAx;uvAx=uvDx;uvDx=temp;
    529. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvAy;uvAy=uvDy;uvDy=temp;
    530. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvBx;uvBx=uvCx;uvCx=temp;
    531. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvBy;uvBy=uvCy;uvCy=temp;
    532. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    533. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer->intData & LAYOUT_FlipV)
    534. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    535. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float temp;
    536. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    537. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvAx;uvAx=uvBx;uvBx=temp;
    538. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvAy;uvAy=uvBy;uvBy=temp;
    539. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvDx;uvDx=uvCx;uvCx=temp;
    540. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvDy;uvDy=uvCy;uvCy=temp;
    541. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    542. &nbsp;&nbsp;&nbsp;&nbsp;}
    543. &nbsp;&nbsp;&nbsp;&nbsp;
    544. &nbsp;&nbsp;&nbsp;&nbsp;//Draw
    545. &nbsp;&nbsp;&nbsp;&nbsp;if((cubeType == 4) || (cubeType == 3))
    546. &nbsp;&nbsp;&nbsp;&nbsp;{ //Front-left leg
    547. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glBegin(GL_QUADS);
    548. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvAx, uvAy); reflex(a_matrix, cubeVertex[0].x, cubeVertex[0].y, cubeVertex[0].z);
    549. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvBx, uvBy); reflex(a_matrix, cubeVertex[2].x, cubeVertex[2].y, cubeVertex[2].z);
    550. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvCx, uvCy); reflex(a_matrix, cubeVertex[8].x, cubeVertex[2].y, cubeVertex[8].z);
    551. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvDx, uvDy); reflex(a_matrix, cubeVertex[8].x, cubeVertex[0].y, cubeVertex[8].z);
    552. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glEnd();
    553. &nbsp;&nbsp;&nbsp;&nbsp;}
    554. &nbsp;&nbsp;&nbsp;&nbsp;else
    555. &nbsp;&nbsp;&nbsp;&nbsp;{
    556. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glBegin(GL_QUADS);
    557. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvAx, uvAy); reflex(a_matrix, cubeVertex[5].x, cubeVertex[5].y, cubeVertex[5].z);
    558. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvBx, uvBy); reflex(a_matrix, cubeVertex[7].x, cubeVertex[7].y, cubeVertex[7].z);
    559. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvCx, uvCy); reflex(a_matrix, cubeVertex[6].x, cubeVertex[6].y, cubeVertex[6].z);
    560. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvDx, uvDy); reflex(a_matrix, cubeVertex[4].x, cubeVertex[4].y, cubeVertex[4].z);
    561. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glEnd();
    562. &nbsp;&nbsp;&nbsp;&nbsp;}
    563. &nbsp;&nbsp;} while(0);
    564. &nbsp;&nbsp;
    565. &nbsp;&nbsp;//Bottom Face
    566. &nbsp;&nbsp;do
    567. &nbsp;&nbsp;{
    568. &nbsp;&nbsp;&nbsp;&nbsp;texture_alpha(255);
    569. &nbsp;&nbsp;&nbsp;&nbsp;
    570. &nbsp;&nbsp;&nbsp;&nbsp;//Choose texture, if there's no texture do not draw
    571. &nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 3+textureToSide[3]);
    572. &nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer == NULL) break;
    573. &nbsp;&nbsp;&nbsp;&nbsp;List *listPointer=&a_layout->layoutTexture[layoutValuePointer->intData].frameList;
    574. &nbsp;&nbsp;&nbsp;&nbsp;texture_set(list_getEntry(listPointer, (a_layout->clock)%list_getEntryCount(listPointer)));
    575. &nbsp;&nbsp;&nbsp;&nbsp;
    576. &nbsp;&nbsp;&nbsp;&nbsp;//Can this face be optimized?
    577. &nbsp;&nbsp;&nbsp;&nbsp;//Can only be applied to shapes that are not modified via scaling or offsetting
    578. &nbsp;&nbsp;&nbsp;&nbsp;if(unmodifiedShape)
    579. &nbsp;&nbsp;&nbsp;&nbsp;{
    580. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Do not draw if the bottom shape's top face is visible
    581. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layout_doesNeighborHaveNormalSide(a_layout, a_tileId, a_x, a_y-1, a_z, 1)) break;
    582. &nbsp;&nbsp;&nbsp;&nbsp;}
    583. &nbsp;&nbsp;&nbsp;&nbsp;
    584. &nbsp;&nbsp;&nbsp;&nbsp;//Is it blended? Don't draw it on the first draw stage
    585. &nbsp;&nbsp;&nbsp;&nbsp;if(layout_drawPhase == 0)
    586. &nbsp;&nbsp;&nbsp;&nbsp;{
    587. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LayoutElement *textureElement=a_layout->layoutTexture[layoutValuePointer->intData].textureElement;
    588. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(textureElement != NULL)
    589. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    590. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(textureElement, 2);
    591. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL)
    592. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    593. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer->intData & LAYOUT_Blend) break;
    594. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    595. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    596. &nbsp;&nbsp;&nbsp;&nbsp;}
    597. &nbsp;&nbsp;&nbsp;&nbsp;
    598. &nbsp;&nbsp;&nbsp;&nbsp;//Is it double sided?
    599. &nbsp;&nbsp;&nbsp;&nbsp;texture_noclip(doubleSidedFlag & LAYOUT_BOTTOM);
    600. &nbsp;&nbsp;&nbsp;&nbsp;
    601. &nbsp;&nbsp;&nbsp;&nbsp;//Apply global shading
    602. &nbsp;&nbsp;&nbsp;&nbsp;sword shadeDelta=255+a_layout->layoutShading[3];
    603. &nbsp;&nbsp;&nbsp;&nbsp;shadeDelta=(byte)shadeDelta;
    604. &nbsp;&nbsp;&nbsp;&nbsp;
    605. &nbsp;&nbsp;&nbsp;&nbsp;//Apply local shading
    606. &nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 29+3);
    607. &nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL)
    608. &nbsp;&nbsp;&nbsp;&nbsp;{
    609. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbyte localShadeDelta=layoutValuePointer->intData >> 16;
    610. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shadeDelta+=localShadeDelta*16;
    611. &nbsp;&nbsp;&nbsp;&nbsp;}
    612. &nbsp;&nbsp;&nbsp;&nbsp;if(shadeDelta < 0) shadeDelta=0; else if(shadeDelta > 255) shadeDelta=255;
    613. &nbsp;&nbsp;&nbsp;&nbsp;if(cubeType == 0) texture_color(shadeDelta, shadeDelta, shadeDelta);
    614. &nbsp;&nbsp;&nbsp;&nbsp;else texture_color(255, 255, 255);
    615. &nbsp;&nbsp;&nbsp;&nbsp;
    616. &nbsp;&nbsp;&nbsp;&nbsp;//Darken?
    617. &nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 29+3);
    618. &nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL)
    619. &nbsp;&nbsp;&nbsp;&nbsp;{
    620. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer->intData & LAYOUT_Darken) texture_color(0, 0, 0);
    621. &nbsp;&nbsp;&nbsp;&nbsp;}
    622. &nbsp;&nbsp;&nbsp;&nbsp;
    623. &nbsp;&nbsp;&nbsp;&nbsp;//Setup uvs
    624. &nbsp;&nbsp;&nbsp;&nbsp;float uvAx=0.0f, uvAy=0.0f;
    625. &nbsp;&nbsp;&nbsp;&nbsp;float uvBx=1.0f, uvBy=0.0f;
    626. &nbsp;&nbsp;&nbsp;&nbsp;float uvCx=1.0f, uvCy=1.0f;
    627. &nbsp;&nbsp;&nbsp;&nbsp;float uvDx=0.0f, uvDy=1.0f;
    628. &nbsp;&nbsp;&nbsp;&nbsp;
    629. &nbsp;&nbsp;&nbsp;&nbsp;//Manage UVs
    630. &nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 29+textureToSide[3]);
    631. &nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL)
    632. &nbsp;&nbsp;&nbsp;&nbsp;{
    633. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer->intData & LAYOUT_FlipH)
    634. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    635. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float temp;
    636. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvAx;uvAx=uvDx;uvDx=temp;
    637. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvAy;uvAy=uvDy;uvDy=temp;
    638. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvBx;uvBx=uvCx;uvCx=temp;
    639. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvBy;uvBy=uvCy;uvCy=temp;
    640. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    641. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer->intData & LAYOUT_FlipV)
    642. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    643. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float temp;
    644. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    645. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvAx;uvAx=uvBx;uvBx=temp;
    646. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvAy;uvAy=uvBy;uvBy=temp;
    647. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvDx;uvDx=uvCx;uvCx=temp;
    648. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvDy;uvDy=uvCy;uvCy=temp;
    649. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    650. &nbsp;&nbsp;&nbsp;&nbsp;}
    651. &nbsp;&nbsp;&nbsp;&nbsp;
    652. &nbsp;&nbsp;&nbsp;&nbsp;//Draw
    653. &nbsp;&nbsp;&nbsp;&nbsp;if((cubeType == 6) || (cubeType == 1) || (cubeType == 2))
    654. &nbsp;&nbsp;&nbsp;&nbsp;{ //Draw a Shadow? (Special case for a sprite)
    655. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    656. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Set texture color to black
    657. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;texture_color(0, 0, 0);
    658. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;texture_alpha(100);
    659. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    660. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Find how far to drop the shadow
    661. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte slopeOfProjectPlane=0;
    662. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float shadowDropDistance=layout_getDropDistance(a_layout, &slopeOfProjectPlane, a_x, a_y, a_z);
    663. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    664. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Do not draw if shadowDropDistance is negative
    665. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(shadowDropDistance < 0) break;
    666. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    667. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Draw a bottom face facing up
    668. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glBegin(GL_QUADS);
    669. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvAx, uvAy); reflex(a_matrix, cubeVertex[6].x, a_y-0.45f-shadowDropDistance-(1.0f-slopeElevation[slopeOfProjectPlane][0])*0.75f, cubeVertex[6].z);
    670. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvDx, uvDy); reflex(a_matrix, cubeVertex[2].x, a_y-0.45f-shadowDropDistance-(1.0f-slopeElevation[slopeOfProjectPlane][2])*0.75f, cubeVertex[2].z);
    671. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvCx, uvCy); reflex(a_matrix, cubeVertex[3].x, a_y-0.45f-shadowDropDistance-(1.0f-slopeElevation[slopeOfProjectPlane][3])*0.75f, cubeVertex[3].z);
    672. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvBx, uvBy); reflex(a_matrix, cubeVertex[7].x, a_y-0.45f-shadowDropDistance-(1.0f-slopeElevation[slopeOfProjectPlane][1])*0.75f, cubeVertex[7].z);
    673. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glEnd();
    674. &nbsp;&nbsp;&nbsp;&nbsp;}
    675. &nbsp;&nbsp;&nbsp;&nbsp;else
    676. &nbsp;&nbsp;&nbsp;&nbsp;{
    677. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glBegin(GL_QUADS);
    678. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvAx, uvAy); reflex(a_matrix, cubeVertex[6].x, cubeVertex[6].y, cubeVertex[6].z);
    679. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvBx, uvBy); reflex(a_matrix, cubeVertex[7].x, cubeVertex[7].y, cubeVertex[7].z);
    680. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvCx, uvCy); reflex(a_matrix, cubeVertex[3].x, cubeVertex[3].y, cubeVertex[3].z);
    681. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvDx, uvDy); reflex(a_matrix, cubeVertex[2].x, cubeVertex[2].y, cubeVertex[2].z);
    682. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glEnd();
    683. &nbsp;&nbsp;&nbsp;&nbsp;}
    684. &nbsp;&nbsp;} while(0);
    685. &nbsp;&nbsp;
    686. &nbsp;&nbsp;//Right face
    687. &nbsp;&nbsp;do
    688. &nbsp;&nbsp;{
    689. &nbsp;&nbsp;&nbsp;&nbsp;texture_alpha(255);
    690. &nbsp;&nbsp;&nbsp;&nbsp;
    691. &nbsp;&nbsp;&nbsp;&nbsp;//Choose texture, if there's no texture do not draw
    692. &nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 3+textureToSide[2]);
    693. &nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer == NULL) break;
    694. &nbsp;&nbsp;&nbsp;&nbsp;List *listPointer=&a_layout->layoutTexture[layoutValuePointer->intData].frameList;
    695. &nbsp;&nbsp;&nbsp;&nbsp;texture_set(list_getEntry(listPointer, (a_layout->clock)%list_getEntryCount(listPointer)));
    696. &nbsp;&nbsp;&nbsp;&nbsp;
    697. &nbsp;&nbsp;&nbsp;&nbsp;//Can this face be optimized?
    698. &nbsp;&nbsp;&nbsp;&nbsp;//Can only be applied to shapes that are not modified via scaling or offsetting
    699. &nbsp;&nbsp;&nbsp;&nbsp;if(unmodifiedShape)
    700. &nbsp;&nbsp;&nbsp;&nbsp;{
    701. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Do not draw if the right shape's left face is visible
    702. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layout_doesNeighborHaveNormalSide(a_layout, a_tileId, a_x+1, a_y, a_z, 4)) break;
    703. &nbsp;&nbsp;&nbsp;&nbsp;}
    704. &nbsp;&nbsp;&nbsp;&nbsp;
    705. &nbsp;&nbsp;&nbsp;&nbsp;//Is it blended? Don't draw it on the first draw stage
    706. &nbsp;&nbsp;&nbsp;&nbsp;if(layout_drawPhase == 0)
    707. &nbsp;&nbsp;&nbsp;&nbsp;{
    708. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LayoutElement *textureElement=a_layout->layoutTexture[layoutValuePointer->intData].textureElement;
    709. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(textureElement != NULL)
    710. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    711. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(textureElement, 2);
    712. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL)
    713. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    714. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer->intData & LAYOUT_Blend) break;
    715. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    716. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    717. &nbsp;&nbsp;&nbsp;&nbsp;}
    718. &nbsp;&nbsp;&nbsp;&nbsp;
    719. &nbsp;&nbsp;&nbsp;&nbsp;//Is it double sided?
    720. &nbsp;&nbsp;&nbsp;&nbsp;texture_noclip(doubleSidedFlag & LAYOUT_RIGHT);
    721. &nbsp;&nbsp;&nbsp;&nbsp;
    722. &nbsp;&nbsp;&nbsp;&nbsp;//Apply global shading
    723. &nbsp;&nbsp;&nbsp;&nbsp;sword shadeDelta=255+a_layout->layoutShading[2];
    724. &nbsp;&nbsp;&nbsp;&nbsp;shadeDelta=(byte)shadeDelta;
    725. &nbsp;&nbsp;&nbsp;&nbsp;
    726. &nbsp;&nbsp;&nbsp;&nbsp;//Apply local shading
    727. &nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 29+2);
    728. &nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL)
    729. &nbsp;&nbsp;&nbsp;&nbsp;{
    730. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbyte localShadeDelta=layoutValuePointer->intData >> 16;
    731. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shadeDelta+=localShadeDelta*16;
    732. &nbsp;&nbsp;&nbsp;&nbsp;}
    733. &nbsp;&nbsp;&nbsp;&nbsp;if(shadeDelta < 0) shadeDelta=0; else if(shadeDelta > 255) shadeDelta=255;
    734. &nbsp;&nbsp;&nbsp;&nbsp;if(cubeType == 0) texture_color(shadeDelta, shadeDelta, shadeDelta);
    735. &nbsp;&nbsp;&nbsp;&nbsp;else texture_color(255, 255, 255);
    736. &nbsp;&nbsp;&nbsp;&nbsp;
    737. &nbsp;&nbsp;&nbsp;&nbsp;//Setup uvs
    738. &nbsp;&nbsp;&nbsp;&nbsp;float uvAx=1.0f, uvAy=1.0f;
    739. &nbsp;&nbsp;&nbsp;&nbsp;float uvBx=1.0f, uvBy=0.0f;
    740. &nbsp;&nbsp;&nbsp;&nbsp;float uvCx=0.0f, uvCy=0.0f;
    741. &nbsp;&nbsp;&nbsp;&nbsp;float uvDx=0.0f, uvDy=1.0f;
    742. &nbsp;&nbsp;&nbsp;&nbsp;
    743. &nbsp;&nbsp;&nbsp;&nbsp;//Manage UVs
    744. &nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 29+textureToSide[2]);
    745. &nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL)
    746. &nbsp;&nbsp;&nbsp;&nbsp;{
    747. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer->intData & LAYOUT_FlipH)
    748. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    749. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float temp;
    750. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvAx;uvAx=uvDx;uvDx=temp;
    751. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvAy;uvAy=uvDy;uvDy=temp;
    752. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvBx;uvBx=uvCx;uvCx=temp;
    753. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvBy;uvBy=uvCy;uvCy=temp;
    754. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    755. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer->intData & LAYOUT_FlipV)
    756. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    757. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float temp;
    758. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    759. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvAx;uvAx=uvBx;uvBx=temp;
    760. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvAy;uvAy=uvBy;uvBy=temp;
    761. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvDx;uvDx=uvCx;uvCx=temp;
    762. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvDy;uvDy=uvCy;uvCy=temp;
    763. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    764. &nbsp;&nbsp;&nbsp;&nbsp;}
    765. &nbsp;&nbsp;&nbsp;&nbsp;
    766. &nbsp;&nbsp;&nbsp;&nbsp;//Draw
    767. &nbsp;&nbsp;&nbsp;&nbsp;if((cubeType == 4) || (cubeType == 3))
    768. &nbsp;&nbsp;&nbsp;&nbsp;{ //Front-right leg
    769. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glBegin(GL_QUADS);
    770. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvDx, uvDy); reflex(a_matrix, cubeVertex[3].x, cubeVertex[3].y, cubeVertex[3].z);
    771. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvCx, uvCy); reflex(a_matrix, cubeVertex[1].x, cubeVertex[1].y, cubeVertex[1].z);
    772. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvBx, uvBy); reflex(a_matrix, cubeVertex[8].x, cubeVertex[0].y, cubeVertex[8].z);
    773. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvAx, uvAy); reflex(a_matrix, cubeVertex[8].x, cubeVertex[2].y, cubeVertex[8].z);
    774. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glEnd();
    775. &nbsp;&nbsp;&nbsp;&nbsp;}
    776. &nbsp;&nbsp;&nbsp;&nbsp;else
    777. &nbsp;&nbsp;&nbsp;&nbsp;{
    778. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glBegin(GL_QUADS);
    779. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvAx, uvAy); reflex(a_matrix, cubeVertex[7].x, cubeVertex[7].y, cubeVertex[7].z);
    780. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvBx, uvBy); reflex(a_matrix, cubeVertex[5].x, cubeVertex[5].y, cubeVertex[5].z);
    781. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvCx, uvCy); reflex(a_matrix, cubeVertex[1].x, cubeVertex[1].y, cubeVertex[1].z);
    782. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvDx, uvDy); reflex(a_matrix, cubeVertex[3].x, cubeVertex[3].y, cubeVertex[3].z);
    783. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glEnd();
    784. &nbsp;&nbsp;&nbsp;&nbsp;}
    785. &nbsp;&nbsp;} while(0);
    786. &nbsp;&nbsp;
    787. &nbsp;&nbsp;//Left Face
    788. &nbsp;&nbsp;do
    789. &nbsp;&nbsp;{
    790. &nbsp;&nbsp;&nbsp;&nbsp;texture_alpha(255);
    791. &nbsp;&nbsp;&nbsp;&nbsp;
    792. &nbsp;&nbsp;&nbsp;&nbsp;//Choose texture, if there's no texture do not draw
    793. &nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 3+textureToSide[4]);
    794. &nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer == NULL) break;
    795. &nbsp;&nbsp;&nbsp;&nbsp;List *listPointer=&a_layout->layoutTexture[layoutValuePointer->intData].frameList;
    796. &nbsp;&nbsp;&nbsp;&nbsp;texture_set(list_getEntry(listPointer, (a_layout->clock)%list_getEntryCount(listPointer)));
    797. &nbsp;&nbsp;&nbsp;&nbsp;
    798. &nbsp;&nbsp;&nbsp;&nbsp;//Can this face be optimized?
    799. &nbsp;&nbsp;&nbsp;&nbsp;//Can only be applied to shapes that are not modified via scaling or offsetting
    800. &nbsp;&nbsp;&nbsp;&nbsp;if(unmodifiedShape)
    801. &nbsp;&nbsp;&nbsp;&nbsp;{
    802. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Do not draw if the left shape's right face is visible
    803. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layout_doesNeighborHaveNormalSide(a_layout, a_tileId, a_x-1, a_y, a_z, 2)) break;
    804. &nbsp;&nbsp;&nbsp;&nbsp;}
    805. &nbsp;&nbsp;&nbsp;&nbsp;
    806. &nbsp;&nbsp;&nbsp;&nbsp;//Is it blended? Don't draw it on the first draw stage
    807. &nbsp;&nbsp;&nbsp;&nbsp;if(layout_drawPhase == 0)
    808. &nbsp;&nbsp;&nbsp;&nbsp;{
    809. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LayoutElement *textureElement=a_layout->layoutTexture[layoutValuePointer->intData].textureElement;
    810. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(textureElement != NULL)
    811. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    812. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(textureElement, 2);
    813. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL)
    814. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    815. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer->intData & LAYOUT_Blend) break;
    816. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    817. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    818. &nbsp;&nbsp;&nbsp;&nbsp;}
    819. &nbsp;&nbsp;&nbsp;&nbsp;
    820. &nbsp;&nbsp;&nbsp;&nbsp;//Is it double sided?
    821. &nbsp;&nbsp;&nbsp;&nbsp;texture_noclip(doubleSidedFlag & LAYOUT_LEFT);
    822. &nbsp;&nbsp;&nbsp;&nbsp;
    823. &nbsp;&nbsp;&nbsp;&nbsp;//Apply global shading
    824. &nbsp;&nbsp;&nbsp;&nbsp;sword shadeDelta=255+a_layout->layoutShading[4];
    825. &nbsp;&nbsp;&nbsp;&nbsp;shadeDelta=(byte)shadeDelta;
    826. &nbsp;&nbsp;&nbsp;&nbsp;
    827. &nbsp;&nbsp;&nbsp;&nbsp;//Apply local shading
    828. &nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 29+4);
    829. &nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL)
    830. &nbsp;&nbsp;&nbsp;&nbsp;{
    831. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbyte localShadeDelta=layoutValuePointer->intData >> 16;
    832. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;shadeDelta+=localShadeDelta*16;
    833. &nbsp;&nbsp;&nbsp;&nbsp;}
    834. &nbsp;&nbsp;&nbsp;&nbsp;if(shadeDelta < 0) shadeDelta=0; else if(shadeDelta > 255) shadeDelta=255;
    835. &nbsp;&nbsp;&nbsp;&nbsp;if(cubeType == 0) texture_color(shadeDelta, shadeDelta, shadeDelta);
    836. &nbsp;&nbsp;&nbsp;&nbsp;else texture_color(255, 255, 255);
    837. &nbsp;&nbsp;&nbsp;&nbsp;
    838. &nbsp;&nbsp;&nbsp;&nbsp;//Setup uvs
    839. &nbsp;&nbsp;&nbsp;&nbsp;float uvAx=1.0f, uvAy=0.0f;
    840. &nbsp;&nbsp;&nbsp;&nbsp;float uvBx=0.0f, uvBy=0.0f;
    841. &nbsp;&nbsp;&nbsp;&nbsp;float uvCx=0.0f, uvCy=1.0f;
    842. &nbsp;&nbsp;&nbsp;&nbsp;float uvDx=1.0f, uvDy=1.0f;
    843. &nbsp;&nbsp;&nbsp;&nbsp;
    844. &nbsp;&nbsp;&nbsp;&nbsp;//Manage UVs
    845. &nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 29+textureToSide[4]);
    846. &nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL)
    847. &nbsp;&nbsp;&nbsp;&nbsp;{
    848. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer->intData & LAYOUT_FlipH)
    849. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    850. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float temp;
    851. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    852. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvAx;uvAx=uvBx;uvBx=temp;
    853. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvAy;uvAy=uvBy;uvBy=temp;
    854. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvDx;uvDx=uvCx;uvCx=temp;
    855. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvDy;uvDy=uvCy;uvCy=temp;
    856. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    857. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer->intData & LAYOUT_FlipV)
    858. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    859. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;float temp;
    860. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    861. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvAx;uvAx=uvDx;uvDx=temp;
    862. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvAy;uvAy=uvDy;uvDy=temp;
    863. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvBx;uvBx=uvCx;uvCx=temp;
    864. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;temp=uvBy;uvBy=uvCy;uvCy=temp;
    865. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    866. &nbsp;&nbsp;&nbsp;&nbsp;}
    867. &nbsp;&nbsp;&nbsp;&nbsp;
    868. &nbsp;&nbsp;&nbsp;&nbsp;//Draw
    869. &nbsp;&nbsp;&nbsp;&nbsp;if((cubeType == 4) || (cubeType == 3))
    870. &nbsp;&nbsp;&nbsp;&nbsp;{
    871. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glBegin(GL_QUADS);
    872. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvAx, uvAy); reflex(a_matrix, cubeVertex[8].x, cubeVertex[0].y, cubeVertex[8].z);
    873. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvBx, uvBy); reflex(a_matrix, cubeVertex[4].x, cubeVertex[4].y, cubeVertex[4].z);
    874. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvCx, uvCy); reflex(a_matrix, cubeVertex[6].x, cubeVertex[6].y, cubeVertex[6].z);
    875. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvDx, uvDy); reflex(a_matrix, cubeVertex[8].x, cubeVertex[2].y, cubeVertex[8].z);
    876. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glEnd();
    877. &nbsp;&nbsp;&nbsp;&nbsp;}
    878. &nbsp;&nbsp;&nbsp;&nbsp;else
    879. &nbsp;&nbsp;&nbsp;&nbsp;{
    880. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glBegin(GL_QUADS);
    881. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvAx, uvAy); reflex(a_matrix, cubeVertex[0].x, cubeVertex[0].y, cubeVertex[0].z);
    882. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvBx, uvBy); reflex(a_matrix, cubeVertex[4].x, cubeVertex[4].y, cubeVertex[4].z);
    883. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvCx, uvCy); reflex(a_matrix, cubeVertex[6].x, cubeVertex[6].y, cubeVertex[6].z);
    884. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(uvDx, uvDy); reflex(a_matrix, cubeVertex[2].x, cubeVertex[2].y, cubeVertex[2].z);
    885. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glEnd();
    886. &nbsp;&nbsp;&nbsp;&nbsp;}
    887. &nbsp;&nbsp;} while(0);
    888. &nbsp;&nbsp;
    889. &nbsp;&nbsp;//Reset draw settings
    890. &nbsp;&nbsp;texture_noclip(false);
    891. &nbsp;&nbsp;texture_alpha(255);
    892. &nbsp;&nbsp;texture_color(255, 255, 255);
    893. }
    894.  
    895. void layout_draw(Layout *a_layout, float *a_matrix)
    896. {
    897. &nbsp;&nbsp;byte *sync;
    898. &nbsp;&nbsp;sdword x=0;
    899. &nbsp;&nbsp;sdword y=0;
    900. &nbsp;&nbsp;sdword z=0;
    901. &nbsp;&nbsp;
    902. &nbsp;&nbsp;//Draw the bg
    903. &nbsp;&nbsp;/*if((layout_drawPhase == 0) && (a_layout->layoutBackgroundTexture))
    904. &nbsp;&nbsp;{
    905. &nbsp;&nbsp;&nbsp;&nbsp;camera_2D();
    906. &nbsp;&nbsp;&nbsp;&nbsp;texture_color(255, 255, 255);
    907. &nbsp;&nbsp;&nbsp;&nbsp;texture_smooth(true);
    908. &nbsp;&nbsp;&nbsp;&nbsp;glDisable(GL_LIGHTING);
    909. &nbsp;&nbsp;&nbsp;&nbsp;texture_set(a_layout->layoutBackgroundTexture);
    910. &nbsp;&nbsp;&nbsp;&nbsp;//else texture_set(&tile_dummy);
    911. &nbsp;&nbsp;&nbsp;&nbsp;glBegin(GL_QUADS);
    912. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(0, 0); glVertex2f(0, 0);
    913. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(0, 1); glVertex2f(0, PH);
    914. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(1, 1); glVertex2f(PW, PH);
    915. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;glTexCoord2f(1, 0); glVertex2f(PW, 0);
    916. &nbsp;&nbsp;&nbsp;&nbsp;glEnd();
    917. &nbsp;&nbsp;&nbsp;&nbsp;glEnable(GL_LIGHTING);
    918. &nbsp;&nbsp;&nbsp;&nbsp;glDisable(GL_LIGHTING);
    919. &nbsp;&nbsp;&nbsp;&nbsp;camera_3D(45);
    920. &nbsp;&nbsp;}*/
    921.  
    922. &nbsp;&nbsp;//Draw the map
    923. &nbsp;&nbsp;for(z=a_layout->layoutDepth-1; z >= 0; z--) //Back to front
    924. &nbsp;&nbsp;{
    925. &nbsp;&nbsp;&nbsp;&nbsp;for(y=0; y < a_layout->layoutHeight; y++) //Down to up
    926. &nbsp;&nbsp;&nbsp;&nbsp;{
    927. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sync=&a_layout->layoutMap[(y*a_layout->layoutWidth*a_layout->layoutDepth)+(z*a_layout->layoutWidth)];
    928. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for(x=0; x < a_layout->layoutWidth; x++)
    929. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    930. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(*sync)
    931. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    932. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layout_drawCube(a_layout, a_matrix, *sync++, x, y, z);
    933. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;} else sync++;
    934. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    935. &nbsp;&nbsp;&nbsp;&nbsp;}
    936. &nbsp;&nbsp;}
    937. &nbsp;&nbsp;
    938. &nbsp;&nbsp;layout_drawPhase=!layout_drawPhase;
    939. }
    940.  
    941. void layout_init(Layout *a_layout)
    942. {
    943. &nbsp;&nbsp;//Initiate the lists
    944. &nbsp;&nbsp;list_init(&a_layout->variableList);
    945. &nbsp;&nbsp;list_init(&a_layout->paletteList);
    946. &nbsp;&nbsp;list_init(&a_layout->cameraList);
    947. &nbsp;&nbsp;list_init(&a_layout->textureList);
    948. &nbsp;&nbsp;list_init(&a_layout->qubixList);
    949. &nbsp;&nbsp;list_init(&a_layout->actorList);
    950. &nbsp;&nbsp;list_init(&a_layout->pathList);
    951. &nbsp;&nbsp;list_init(&a_layout->cubeList);
    952. &nbsp;&nbsp;
    953. &nbsp;&nbsp;//Set the proper NULLs
    954. &nbsp;&nbsp;a_layout->clock=0;
    955. &nbsp;&nbsp;a_layout->layoutTexture=NULL;
    956. &nbsp;&nbsp;a_layout->layoutWidth=0;
    957. &nbsp;&nbsp;a_layout->layoutHeight=0;
    958. &nbsp;&nbsp;a_layout->layoutDepth=0;
    959. &nbsp;&nbsp;a_layout->layoutMap=NULL;
    960. &nbsp;&nbsp;a_layout->layoutBackgroundTexture=NULL;
    961. &nbsp;&nbsp;memset(a_layout->layoutShading, 0, sizeof(a_layout->layoutShading));
    962. }
    963.  
    964. void layout_loadDef(Layout *a_layout, byte *a_defFileName)
    965. {
    966. &nbsp;&nbsp;//Parse the DEF file
    967. &nbsp;&nbsp;layout_parseDef(a_layout, a_defFileName);
    968. }
    969.  
    970. void layout_build(Layout *a_layout, byte *a_pcxBaseDirPath)
    971. {
    972. &nbsp;&nbsp;byte stringBuffer[512]={0};
    973. &nbsp;&nbsp;
    974. &nbsp;&nbsp;//Texture:Process and load all the textures
    975. &nbsp;&nbsp;do
    976. &nbsp;&nbsp;{
    977. &nbsp;&nbsp;&nbsp;&nbsp;dword textureTotal=list_getEntryCount(&a_layout->textureList);
    978. &nbsp;&nbsp;&nbsp;&nbsp;if(!textureTotal) break;
    979. &nbsp;&nbsp;&nbsp;&nbsp;
    980. &nbsp;&nbsp;&nbsp;&nbsp;//Create the memory for the textures
    981. &nbsp;&nbsp;&nbsp;&nbsp;a_layout->layoutTexture=malloc(sizeof(LayoutTexture) * textureTotal);
    982. &nbsp;&nbsp;&nbsp;&nbsp;
    983. &nbsp;&nbsp;&nbsp;&nbsp;//Process each
    984. &nbsp;&nbsp;&nbsp;&nbsp;{
    985. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword textureCounter=0;
    986. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(textureCounter < textureTotal)
    987. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    988. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LayoutElement *layoutElementPointer=list_getEntry(&a_layout->textureList, textureCounter);
    989. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LayoutValue *layoutValuePointer=NULL;
    990. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Image image;
    991. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    992. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Initiate the LayoutTexture
    993. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list_init(&a_layout->layoutTexture[textureCounter].frameList);
    994. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a_layout->layoutTexture[textureCounter].textureElement=layoutElementPointer;
    995. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    996. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Read texture type
    997. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword textureType=0;
    998. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 1);
    999. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL) textureType=layoutValuePointer->intData;
    1000. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1001. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Read texture render mode information
    1002. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword textureRenderMode=0;
    1003. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 2);
    1004. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL) textureRenderMode=layoutValuePointer->intData;
    1005. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1006. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Read shade colors
    1007. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword shadeLeftColor=0xFF;
    1008. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword shadeRightColor=0xFF;
    1009. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword frameLeftColor=0xFF;
    1010. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword frameRightColor=0xFF;
    1011. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1012. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Fetch shade left color
    1013. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 17);
    1014. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL) shadeLeftColor=layoutValuePointer->intData;
    1015. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1016. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Fetch shade right color
    1017. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 20);
    1018. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL) shadeRightColor=layoutValuePointer->intData;
    1019. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1020. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Fetch frame left color
    1021. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 18);
    1022. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL) frameLeftColor=layoutValuePointer->intData;
    1023. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1024. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Fetch frame right color
    1025. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 19);
    1026. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL) frameRightColor=layoutValuePointer->intData;
    1027. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1028. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Get ready to load all frames
    1029. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword frameCounter=0;
    1030. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bool firstFrameHasAlpha=1;
    1031. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(1)
    1032. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    1033. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bool lastFrameSuccess=0;
    1034. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1035. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Do we load a bitmap or use a fresh texture?
    1036. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(textureType & LAYOUT_TXTR_Bitmap)
    1037. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    1038. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Read texture file name
    1039. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 8);
    1040.  
    1041. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//A file path is stated
    1042. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL)
    1043. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    1044. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Prepare the full file path
    1045. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(frameCounter == 0)
    1046. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layout_parsePath(stringBuffer, a_pcxBaseDirPath, layoutValuePointer->stringData, ".pcx");
    1047. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
    1048. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    1049. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Mutate file path
    1050. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword pathLen=strlen(stringBuffer)-4;
    1051. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1052. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(util_isDigit(stringBuffer[pathLen-1]))
    1053. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    1054. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(stringBuffer[pathLen-1] == '9')
    1055. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    1056. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stringBuffer[pathLen-1]='0';
    1057. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(util_isDigit(stringBuffer[pathLen-2]))
    1058. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    1059. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(stringBuffer[pathLen-2] == '9')
    1060. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    1061. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;stringBuffer[pathLen-2]='0';
    1062. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(util_isDigit(stringBuffer[pathLen-3]))
    1063. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    1064. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(stringBuffer[pathLen-3] == '9')
    1065. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
    1066. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else stringBuffer[pathLen-3]++;
    1067. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    1068. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    1069. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else stringBuffer[pathLen-2]++;
    1070. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    1071. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else break;
    1072. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    1073. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else stringBuffer[pathLen-1]++;
    1074. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    1075. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else break; //Can't mutate
    1076. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    1077. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1078. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Attempt to load frame
    1079. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(image_loadPcx(&image, stringBuffer, 1))
    1080. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    1081. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Do we use transparency? //AutoTrans always
    1082. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(/*(textureRenderMode & LAYOUT_AutoTrans) &&*/ firstFrameHasAlpha)
    1083. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    1084. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(frameCounter==0)
    1085. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;firstFrameHasAlpha=image_autoAlpha(&image); //Always apply autotrans
    1086. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else
    1087. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;image_autoAlpha(&image);
    1088. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    1089. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1090. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Increment the frame count
    1091. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;frameCounter++;
    1092. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1093. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Success
    1094. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;lastFrameSuccess=1;
    1095. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    1096. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    1097. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1098. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Load a dummy frame if frameCounter is 0
    1099. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(frameCounter == 0)
    1100. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    1101. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;image_create(&image, 32, 32, 1);
    1102. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;image_fillFlat(&image, 0x8080A0FF);
    1103. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    1104. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if(lastFrameSuccess == 0)
    1105. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;//If last frame was not a success and we already loaded 1 frame, break
    1106. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    1107. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if(textureType & LAYOUT_TXTR_AUTO_FILL)
    1108. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    1109. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Auto fill
    1110. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;image_create(&image, 32, 32, 1);
    1111. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;image_fillAuto(&image, shadeLeftColor, shadeRightColor);
    1112. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    1113. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else //LAYOUT_TXTR_FLAT_FILL is default
    1114. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    1115. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Flat fill
    1116. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;image_create(&image, 32, 32, 1);
    1117. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//image_fillFlat(&image, shadeLeftColor);
    1118. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;image_fillAuto(&image, shadeLeftColor, shadeRightColor); //MAKE JG07 WOOD look pretty since it's flat but not auto...
    1119. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    1120. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1121. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Does the image have a box frame?
    1122. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(textureType & LAYOUT_TXTR_FRAME2)
    1123. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    1124. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;image_drawFrame(&image, frameLeftColor, frameRightColor);
    1125. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    1126. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1127. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Does the image have a X frame?
    1128. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(textureType & LAYOUT_TXTR_FRAME1)
    1129. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    1130. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;image_drawCross(&image, frameLeftColor, frameRightColor);
    1131. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    1132. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1133. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Do we blend?
    1134. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(textureRenderMode & LAYOUT_Blend)
    1135. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    1136. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;image_blendAlpha(&image);
    1137. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    1138. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1139. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Process the image and make it a texture
    1140. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Texture *texture=malloc(sizeof(Texture));
    1141. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;texture_fromImage(texture, &image);
    1142. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;image_destroy(&image);
    1143. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1144. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;list_addEntry(&a_layout->layoutTexture[textureCounter].frameList, texture);
    1145. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1146. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//If last frame was not a success, break
    1147. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(lastFrameSuccess == 0) break;
    1148. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    1149. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1150. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Goto next texture
    1151. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;textureCounter++;
    1152. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    1153. &nbsp;&nbsp;&nbsp;&nbsp;}
    1154. &nbsp;&nbsp;} while(0);
    1155. &nbsp;&nbsp;
    1156. &nbsp;&nbsp;//Qubix:Load the layout & background image
    1157. &nbsp;&nbsp;do
    1158. &nbsp;&nbsp;{
    1159. &nbsp;&nbsp;&nbsp;&nbsp;LayoutElement *layoutElementPointer=NULL;
    1160. &nbsp;&nbsp;&nbsp;&nbsp;LayoutValue *layoutValuePointer=NULL;
    1161. &nbsp;&nbsp;&nbsp;&nbsp;
    1162. &nbsp;&nbsp;&nbsp;&nbsp;//Load the layout
    1163. &nbsp;&nbsp;&nbsp;&nbsp;{
    1164. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Get first qubix element
    1165. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layoutElementPointer=list_getEntry(&a_layout->qubixList, 0);
    1166. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutElementPointer == NULL) break;
    1167. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1168. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Get layout texture file name
    1169. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 1);
    1170. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer == NULL) break;
    1171. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1172. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Prepare the full file path
    1173. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layout_parsePath(stringBuffer, a_pcxBaseDirPath, layoutValuePointer->stringData, ".pcx");
    1174. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1175. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Parse
    1176. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layout_parsePcx(a_layout, stringBuffer);
    1177. &nbsp;&nbsp;&nbsp;&nbsp;}
    1178. &nbsp;&nbsp;&nbsp;&nbsp;
    1179. &nbsp;&nbsp;&nbsp;&nbsp;//Load background image
    1180. &nbsp;&nbsp;&nbsp;&nbsp;{
    1181. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 2);
    1182. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer == NULL) break;
    1183. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1184. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Prepare the full file path
    1185. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layout_parsePath(stringBuffer, a_pcxBaseDirPath, layoutValuePointer->stringData, ".pcx");
    1186. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1187. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Load image
    1188. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Image image;
    1189. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(!image_loadPcx(&image, stringBuffer, 0)) break;
    1190. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1191. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;a_layout->layoutBackgroundTexture=malloc(sizeof(Texture));
    1192. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;texture_fromImage(a_layout->layoutBackgroundTexture, &image);
    1193. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1194. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;image_destroy(&image);
    1195. &nbsp;&nbsp;&nbsp;&nbsp;}
    1196. &nbsp;&nbsp;} while(0);
    1197. &nbsp;&nbsp;
    1198. &nbsp;&nbsp;//Cube:Link the textures to the cubes by storing the engine texture's index in the intData of the cube's texture reference
    1199. &nbsp;&nbsp;do
    1200. &nbsp;&nbsp;{
    1201. &nbsp;&nbsp;&nbsp;&nbsp;dword cubeTotal=list_getEntryCount(&a_layout->cubeList);
    1202. &nbsp;&nbsp;&nbsp;&nbsp;dword textureTotal=list_getEntryCount(&a_layout->textureList);
    1203. &nbsp;&nbsp;&nbsp;&nbsp;if(!cubeTotal) break;
    1204. &nbsp;&nbsp;&nbsp;&nbsp;if(!textureTotal) break;
    1205. &nbsp;&nbsp;&nbsp;&nbsp;
    1206. &nbsp;&nbsp;&nbsp;&nbsp;//Loop through each cube
    1207. &nbsp;&nbsp;&nbsp;&nbsp;dword cubeCounter=0;
    1208. &nbsp;&nbsp;&nbsp;&nbsp;while(cubeCounter < cubeTotal)
    1209. &nbsp;&nbsp;&nbsp;&nbsp;{
    1210. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LayoutElement *layoutElementPointer=list_getEntry(&a_layout->cubeList, cubeCounter);
    1211. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LayoutValue *layoutValuePointer=NULL;
    1212. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1213. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Loop through each side
    1214. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword sideCounter=0;
    1215. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(sideCounter < 6) //6 sides in a cube
    1216. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    1217. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//See if there's a texture set for the said side
    1218. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 3+sideCounter);
    1219. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1220. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(layoutValuePointer != NULL)
    1221. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    1222. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//A texture is set, now we must find the texture by matching names
    1223. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword textureCounter=0;
    1224. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(textureCounter < textureTotal)
    1225. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    1226. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LayoutElement *layoutSubElementPointer=list_getEntry(&a_layout->textureList, textureCounter);
    1227. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1228. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(strcmp(layoutValuePointer->stringData, layoutSubElementPointer->elementName) == 0)
    1229. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    1230. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//We have found a match, link textures
    1231. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer->intData=textureCounter;
    1232. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;
    1233. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    1234. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1235. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Goto next texture
    1236. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;textureCounter++;
    1237. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    1238. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1239. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Has a match failed to be found? A cube with a texture given that's not in the actual texture list at all
    1240. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Just let it be
    1241. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    1242. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1243. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Goto next side
    1244. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sideCounter++;
    1245. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    1246. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1247. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Goto next cube
    1248. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cubeCounter++;
    1249. &nbsp;&nbsp;&nbsp;&nbsp;}
    1250. &nbsp;&nbsp;} while(0);
    1251. &nbsp;&nbsp;
    1252. &nbsp;&nbsp;//Variable:Find some important variables and transfer their values over
    1253. &nbsp;&nbsp;do
    1254. &nbsp;&nbsp;{
    1255. &nbsp;&nbsp;&nbsp;&nbsp;dword variableTotal=list_getEntryCount(&a_layout->variableList);
    1256. &nbsp;&nbsp;&nbsp;&nbsp;if(!variableTotal) break;
    1257. &nbsp;&nbsp;&nbsp;&nbsp;
    1258. &nbsp;&nbsp;&nbsp;&nbsp;//Loop through each variable
    1259. &nbsp;&nbsp;&nbsp;&nbsp;dword variableCounter=0;
    1260. &nbsp;&nbsp;&nbsp;&nbsp;while(variableCounter < variableTotal)
    1261. &nbsp;&nbsp;&nbsp;&nbsp;{
    1262. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LayoutElement *layoutElementPointer=list_getEntry(&a_layout->variableList, variableCounter);
    1263. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LayoutValue *layoutValuePointer=NULL;
    1264.  
    1265. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Scan to see if it's a key variable
    1266. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(strcmp(layoutElementPointer->elementName, "\"SYS_BackShading\"") == 0)
    1267. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    1268. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Get the value
    1269. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 2);
    1270. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL) a_layout->layoutShading[0]=layoutValuePointer->intData;
    1271. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    1272. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if(strcmp(layoutElementPointer->elementName, "\"SYS_TopShading\"") == 0)
    1273. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    1274. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Get the value
    1275. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 2);
    1276. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL) a_layout->layoutShading[1]=layoutValuePointer->intData;
    1277. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    1278. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if(strcmp(layoutElementPointer->elementName, "\"SYS_RightShading\"") == 0)
    1279. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    1280. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Get the value
    1281. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 2);
    1282. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL) a_layout->layoutShading[2]=layoutValuePointer->intData;
    1283. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    1284. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if(strcmp(layoutElementPointer->elementName, "\"SYS_BottomShading\"") == 0)
    1285. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    1286. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Get the value
    1287. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 2);
    1288. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL) a_layout->layoutShading[3]=layoutValuePointer->intData;
    1289. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    1290. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if(strcmp(layoutElementPointer->elementName, "\"SYS_LeftShading\"") == 0)
    1291. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    1292. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Get the value
    1293. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 2);
    1294. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL) a_layout->layoutShading[4]=layoutValuePointer->intData;
    1295. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    1296. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else if(strcmp(layoutElementPointer->elementName, "\"SYS_FrontShading\"") == 0)
    1297. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    1298. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Get the value
    1299. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;layoutValuePointer=layout_getLayoutValue(layoutElementPointer, 2);
    1300. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(layoutValuePointer != NULL) a_layout->layoutShading[5]=layoutValuePointer->intData;
    1301. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    1302. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1303. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Goto next variable
    1304. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;variableCounter++;
    1305. &nbsp;&nbsp;&nbsp;&nbsp;}
    1306. &nbsp;&nbsp;} while(0);
    1307. }
    1308.  
    1309. void layout_debug(Layout *a_layout)
    1310. {
    1311. &nbsp;&nbsp;//VARIABLE
    1312. &nbsp;&nbsp;{
    1313. &nbsp;&nbsp;&nbsp;&nbsp;dword entryIndex=0;
    1314. &nbsp;&nbsp;&nbsp;&nbsp;dword entryTotal=list_getEntryCount(&a_layout->variableList);
    1315. &nbsp;&nbsp;&nbsp;&nbsp;while(entryIndex < entryTotal)
    1316. &nbsp;&nbsp;&nbsp;&nbsp;{
    1317. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LayoutElement *layoutElementPointer=list_getEntry(&a_layout->variableList, entryIndex);
    1318. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1319. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Print element name
    1320. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("[VARIABLE:%s]\n", layoutElementPointer->elementName);
    1321. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1322. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Loop through element value list
    1323. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    1324. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword entryIndex=0;
    1325. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword entryTotal=list_getEntryCount(&layoutElementPointer->valueList);
    1326. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(entryIndex < entryTotal)
    1327. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    1328. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LayoutValue *layoutValuePointer=list_getEntry(&layoutElementPointer->valueList, entryIndex);
    1329. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1330. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Print value id & data
    1331. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d=%s\n", layoutValuePointer->id, layoutValuePointer->stringData);
    1332. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1333. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Goto the next entry
    1334. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;entryIndex++;
    1335. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    1336. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    1337. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1338. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Loop through element hexdump list
    1339. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    1340. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword entryIndex=0;
    1341. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword entryTotal=list_getEntryCount(&layoutElementPointer->hexDumpList);
    1342. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(entryIndex < entryTotal)
    1343. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    1344. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte *hexDump=list_getEntry(&layoutElementPointer->hexDumpList, entryIndex);
    1345. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1346. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Print value id & data
    1347. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("HexDump=%s\n", hexDump);
    1348. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1349. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Goto the next entry
    1350. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;entryIndex++;
    1351. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    1352. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    1353. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1354. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Goto the next entry
    1355. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;entryIndex++;
    1356. &nbsp;&nbsp;&nbsp;&nbsp;}
    1357. &nbsp;&nbsp;}
    1358. &nbsp;&nbsp;//list_init(&a_layout->paletteList);
    1359. &nbsp;&nbsp;//list_init(&a_layout->cameraList);
    1360. &nbsp;&nbsp;//TEXTURE
    1361. &nbsp;&nbsp;{
    1362. &nbsp;&nbsp;&nbsp;&nbsp;dword entryIndex=0;
    1363. &nbsp;&nbsp;&nbsp;&nbsp;dword entryTotal=list_getEntryCount(&a_layout->textureList);
    1364. &nbsp;&nbsp;&nbsp;&nbsp;while(entryIndex < entryTotal)
    1365. &nbsp;&nbsp;&nbsp;&nbsp;{
    1366. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LayoutElement *layoutElementPointer=list_getEntry(&a_layout->textureList, entryIndex);
    1367. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1368. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Print element name
    1369. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("[TEXTURE:%s]\n", layoutElementPointer->elementName);
    1370. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1371. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Loop through element value list
    1372. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    1373. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword entryIndex=0;
    1374. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword entryTotal=list_getEntryCount(&layoutElementPointer->valueList);
    1375. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(entryIndex < entryTotal)
    1376. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    1377. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;LayoutValue *layoutValuePointer=list_getEntry(&layoutElementPointer->valueList, entryIndex);
    1378. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1379. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Print value id & data
    1380. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("%d=%s\n", layoutValuePointer->id, layoutValuePointer->stringData);
    1381. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1382. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Goto the next entry
    1383. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;entryIndex++;
    1384. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    1385. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    1386. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1387. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Loop through element hexdump list
    1388. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    1389. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword entryIndex=0;
    1390. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;dword entryTotal=list_getEntryCount(&layoutElementPointer->hexDumpList);
    1391. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(entryIndex < entryTotal)
    1392. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{
    1393. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;byte *hexDump=list_getEntry(&layoutElementPointer->hexDumpList, entryIndex);
    1394. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1395. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Print value id & data
    1396. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;printf("HexDump=%s\n", hexDump);
    1397. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1398. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Goto the next entry
    1399. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;entryIndex++;
    1400. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    1401. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
    1402. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
    1403. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Goto the next entry
    1404. &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;entryIndex++;
    1405. &nbsp;&nbsp;&nbsp;&nbsp;}
    1406. &nbsp;&nbsp;}
    1407. &nbsp;&nbsp;//list_init(&a_layout->qubixList);
    1408. &nbsp;&nbsp;//list_init(&a_layout->actorList);
    1409. &nbsp;&nbsp;//list_init(&a_layout->pathList);
    1410. &nbsp;&nbsp;//list_init(&a_layout->cubeList);
    1411. }
     
  10. Uhyve

    Uhyve

    Master Procrastinator Member
    46
    0
    6
    Huddersfield, England
    SX Engine
    Ah man, that is alot simpler, feel like I should've thought of that.

    Yeah, I noticed some stuff in the JG_0* levels that suggested something like that happening, some sort of database probably would be the best idea. My code feels really hacky at this point...

    ... Especially after seeing that. That is really clean code, I'm kind of embarrassed to have released my source now. Gonna have to spend some time looking through all that, I'm not too proud to admit that I'm alittle giddy right now. My code has so many glitches, I've constantly been wondering how you managed to get some of the stuff working.
     
  11. SANiK

    SANiK

    Tech Member
    413
    0
    16
    Well even my code is hacky, but that is expected when reverse engineering. Furthermore I could have used a loop for certain parts of the above code, but I did not and instead I wrote things out in case there was an unexpected exception to how something might be handled. All part of the learning process.

    I would suggest you focus more on coding than on cleansiness.
    Do this so you can understand the file format better and write a file format specification.
    After that is done, you can finally start coding a neater map viewer since you will have the ability to preplan your code from your specification notes.

    Trying to reverse engineer and make a complete product at the same time will only exhaust you.
     
  12. SegaLoco

    SegaLoco

    W)(at did you say? Banned
    Dude, are you considering porting to OpenGL sometime, or will this stay a Direct3D thing?
     
  13. Uhyve

    Uhyve

    Master Procrastinator Member
    46
    0
    6
    Huddersfield, England
    SX Engine
    Yeah, that sounds like a good idea, I've never been very patient when it comes to programming, but in this case, that sounds like the best way of going.

    I'll probably be leaving it as DirectX for now. But the project is open source, so if anyone thinks that they're up to the task, they can always get in contact. I assume that it's also pretty dependent on MSVS, so I dunno if it would compile for Linux, since I've barely ever used GCC. Would be nice though.
     
  14. kazade

    kazade

    Member
    64
    0
    0
    A 2D Physics Engine
    Just so you know, I'm taking a look at an SDL/OpenGL port (developing on Ubuntu). I'll let you know how it goes...

    P.S. Thank you for open sourcing it. Respect++;
     
  15. SANiK

    SANiK

    Tech Member
    413
    0
    16
    In Level.cpp there is a typo:
    usedCubes[currentCube].zScale = (1+(signed short)combinedScaleOffset)/128.0f;

    The 1+ should be outside the parenthesis.
     
  16. Uhyve

    Uhyve

    Master Procrastinator Member
    46
    0
    6
    Huddersfield, England
    SX Engine
    Right, with the correct scaling, everything looked way too big, so that was me trying to fix it without really understanding the code. Got it figured out now, my problem was that I was already adding 1 to the scale somewhere else in the code, so it looked more right with the +1 inside the parenthesis because it was getting divided by 128. Now I've just gotta figure out where the offsets are going wrong, I'd put money on me overlooking some old bit of code.

    Nice. I'll try to keep away from using any more DirectX features to make it alittle bit less of a moving target. I can see the pointless shaders (HLSL) being annoying, they're really just there for fun.

    Edit: Heh, got it. I was using my old bit of "offset" code, which worked by altering the axis of the scaling (seemed to work surprisingly well, even though it was obviously completely wrong), now I'm actually adding onto the block positions and it's fine.
     
  17. SANiK

    SANiK

    Tech Member
    413
    0
    16
    I would get rid of the shaders totally as well as smoothing and keep it pixel filled.

    I would split the engine up into the following classes:
    Code (Text):
    1. //Sonic X-treme components
    2. class sxValue //A growing linked list that takes an index an returns the string or value stored there
    3. class sxHexDump //A linked list that contains raw byte data
    4.  
    5. class sxVariable
    6. class sxPalette
    7. class sxCamera
    8. class sxPath
    9. class sxTexture
    10. class sxQubix
    11. class sxCube
    12. class sxActorType
    13.  
    14. class sxFilePcx //Loads a pcx file and returns a palette array and an index array
    15. class sxFileDef //Loads a def file and creates the above classes in sxSystem. Remember multiple DEF files can be loaded and they merge variables and other settings.
    16.  
    17. class sxSystem //Keeps the merged DEF classes.
    18.  
    19. //Engine based components
    20. class enCamera
    21. class enInput
    22. class enPoly&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//Rendering 3D polygons with an enTexture
    23. class enImage&nbsp;&nbsp; //Software image manipulation code for generating some of the dynamic textures in X-treme.
    24. class enTexture&nbsp;&nbsp;//Abstraction layer to send texture to renderer
    25. class enSprite&nbsp;&nbsp;&nbsp;&nbsp;//Rendering on screen enTextures for UIs
    26. class enBillboard&nbsp;&nbsp;//Rendering 3D billboard sprites
    27. class enMath&nbsp;&nbsp;&nbsp;&nbsp; //Math function
    28.  
    29. class enSystem //Encompasses everything
     
  18. Uhyve

    Uhyve

    Master Procrastinator Member
    46
    0
    6
    Huddersfield, England
    SX Engine
    That seems like a good way of organizing stuff, I'm already getting to a point where moving around the huge classes is getting annoying. But yeah, I think I can manage that, my code is a bit messy but I don't think it'll be too hard to modularize. Plus, a general rearrangement of code will probably help me get rid of any old useless stuff. In fact, yeah, I don't think that'll be too difficult actually.

    Yeah, I'm gonna need to get rid of the shaders, it was becoming a bit of a hassle keeping them in really. The bloom is pretty useless, and shader based lighting seems to be quite slow.

    PS Heh, I like open source, it's been up for less than a month and I've already got a ton of useful help. If anyone hadn't guessed, I'm not a professional coder, I've got a degree and everything, but not a job yet, so I'm still super inexperienced in certain areas.
     
  19. kazade

    kazade

    Member
    64
    0
    0
    A 2D Physics Engine
    The main problem I'm having is the use of D3DXVector, D3DXMatrix and D3DXPlane (and probably others I haven't go to yet) in public interfaces. Those make it difficult to port, but I understand there's not much you can do about that aside from using a different math library which will just make more work for you. Fortunately, I've written a GL math library that's similar to the D3DX stuff: http://blog.kazade.co.uk/p/kazmath.html

    So the way I've started implementing stuff is by duplicating files (e.g. Camera.h -> CameraGL.h) and replacing things with my math library. I'm currently writing a library for sprites ( https://launchpad.net/kazsprite ), when I've done that I can move on. So far I've ported the window init code and the camera.
     
  20. Uhyve

    Uhyve

    Master Procrastinator Member
    46
    0
    6
    Huddersfield, England
    SX Engine
    Oh yeah, it hadn't even occurred to me that the matrix math is using DirectX, that's a pain, it gets used quite a lot in the engine.

    Does OpenGL have native support for any specific mesh types? Just wondering because the cubes that are used in the engine is an actual mesh file (.x file). That was more out of laziness though, I can make it create the mesh in memory at run time if need be.
     
Thread Status:
Not open for further replies.