From d9b3d5ba1085063aacec5abe232aefae6b1ca1c0 Mon Sep 17 00:00:00 2001 From: leo Date: Tue, 19 Sep 2000 01:03:23 +0000 Subject: Fixed endianess bugs git-svn-id: http://svn.leocad.org/trunk@124 c7d43263-9d01-0410-8a33-9dba5d9f93d6 --- common/pieceinf.cpp | 2094 ++++++++++++++++++++++++++------------------------- 1 file changed, 1067 insertions(+), 1027 deletions(-) diff --git a/common/pieceinf.cpp b/common/pieceinf.cpp index dff6ea3..8512078 100644 --- a/common/pieceinf.cpp +++ b/common/pieceinf.cpp @@ -13,6 +13,7 @@ #include "matrix.h" #include "vector.h" #include "defines.h" +#include "config.h" #define SIDES 16 static float sintbl[SIDES]; @@ -260,1095 +261,1134 @@ void PieceInfo::DeRef() void PieceInfo::LoadInformation() { - FileDisk bin; - char filename[LC_MAXPATH]; - void* buf; - unsigned long verts, *longs, fixverts; - unsigned char *bytes, *tmp, bt; - unsigned short *ushorts, sh; - float scale, shift; - short* shorts; - CONNECTIONINFO* pConnection; - DRAWGROUP* pGroup; - int i, j; - - // We don't want memory leaks. - FreeInformation(); - - // Create a display for the bounding box. - m_nBoxList = glGenLists(1); - glNewList(m_nBoxList, GL_COMPILE); - glEnableClientState(GL_VERTEX_ARRAY); + FileDisk bin; + char filename[LC_MAXPATH]; + void* buf; + unsigned long verts, *longs, fixverts; + unsigned char *bytes, *tmp, bt; + unsigned short *ushorts, sh; + float scale, shift; + short* shorts; + CONNECTIONINFO* pConnection; + DRAWGROUP* pGroup; + int i, j; + + // We don't want memory leaks. + FreeInformation (); + + // Create a display for the bounding box. + m_nBoxList = glGenLists(1); + glNewList(m_nBoxList, GL_COMPILE); + glEnableClientState(GL_VERTEX_ARRAY); + + float box[24][3] = { + { m_fDimensions[0], m_fDimensions[1], m_fDimensions[2] }, + { m_fDimensions[3], m_fDimensions[1], m_fDimensions[2] }, + { m_fDimensions[3], m_fDimensions[4], m_fDimensions[2] }, + { m_fDimensions[0], m_fDimensions[4], m_fDimensions[2] }, + { m_fDimensions[0], m_fDimensions[1], m_fDimensions[5] }, + { m_fDimensions[0], m_fDimensions[4], m_fDimensions[5] }, + { m_fDimensions[3], m_fDimensions[4], m_fDimensions[5] }, + { m_fDimensions[3], m_fDimensions[1], m_fDimensions[5] }, + { m_fDimensions[3], m_fDimensions[4], m_fDimensions[2] }, + { m_fDimensions[3], m_fDimensions[1], m_fDimensions[2] }, + { m_fDimensions[3], m_fDimensions[1], m_fDimensions[5] }, + { m_fDimensions[3], m_fDimensions[4], m_fDimensions[5] }, + { m_fDimensions[0], m_fDimensions[4], m_fDimensions[5] }, + { m_fDimensions[0], m_fDimensions[1], m_fDimensions[5] }, + { m_fDimensions[0], m_fDimensions[1], m_fDimensions[2] }, + { m_fDimensions[0], m_fDimensions[4], m_fDimensions[2] }, + { m_fDimensions[0], m_fDimensions[1], m_fDimensions[5] }, + { m_fDimensions[3], m_fDimensions[1], m_fDimensions[5] }, + { m_fDimensions[3], m_fDimensions[1], m_fDimensions[2] }, + { m_fDimensions[0], m_fDimensions[1], m_fDimensions[2] }, + { m_fDimensions[0], m_fDimensions[4], m_fDimensions[2] }, + { m_fDimensions[3], m_fDimensions[4], m_fDimensions[2] }, + { m_fDimensions[3], m_fDimensions[4], m_fDimensions[5] }, + { m_fDimensions[0], m_fDimensions[4], m_fDimensions[5] } + }; + glVertexPointer (3, GL_FLOAT, 0, box); + glDrawArrays (GL_QUADS, 0, 24); + glEndList (); + + // Open pieces.bin and buffer the information we need. + strcpy (filename, project->GetLibraryPath()); + strcat (filename, "pieces.bin"); + if (!bin.Open (filename, "rb")) + return; + + buf = malloc(m_nSize); + bin.Seek(m_nOffset, SEEK_SET); + bin.Read(buf, m_nSize); + bin.Close(); + + // hacks to get things working on big endian machines +#ifdef LC_BIG_ENDIAN +#define GUINT16(val) ((guint16) ( \ + (((guint16) (val) & (guint16) 0x00ffU) << 8) | \ + (((guint16) (val) & (guint16) 0xff00U) >> 8))) +#define GUINT32(val) ((guint32) ( \ + (((guint32) (val) & (guint32) 0x000000ffU) << 24) | \ + (((guint32) (val) & (guint32) 0x0000ff00U) << 8) | \ + (((guint32) (val) & (guint32) 0x00ff0000U) >> 8) | \ + (((guint32) (val) & (guint32) 0xff000000U) >> 24))) +#define GINT16(val) ((gint16)GUINT16(val)) +#define GINT32(val) ((gint32)GUINT32(val)) +#else +#define GUINT16(val) val +#define GUINT32(val) val +#define GINT16(val) val +#define GINT32(val) val +#endif + + shift = 1.0f/(1<<14); + scale = 0.01f; + if (m_nFlags & LC_PIECE_MEDIUM) scale = 0.001f; + if (m_nFlags & LC_PIECE_SMALL) scale = 0.0001f; + longs = (unsigned long*)buf; + fixverts = verts = GUINT32(*longs); + bytes = (unsigned char*)(longs + 1); + bytes += verts * sizeof(short) * 3; + + // Read connections + m_nConnectionCount = GUINT16(*((unsigned short*)bytes)); + bytes += sizeof (unsigned short); + m_pConnections = (CONNECTIONINFO*)malloc (m_nConnectionCount * sizeof(CONNECTIONINFO)); + + sh = m_nConnectionCount; + for (pConnection = m_pConnections; sh--; pConnection++) + { + pConnection->type = *bytes; + bytes++; + + shorts = GINT16((short*)bytes); + pConnection->center[0] = (float)(GINT16(*shorts))*scale; + shorts++; + pConnection->center[1] = (float)(GINT16(*shorts))*scale; + shorts++; + pConnection->center[2] = (float)(GINT16(*shorts))*scale; + shorts++; + pConnection->normal[0] = (float)(GINT16(*shorts))*shift; + shorts++; + pConnection->normal[1] = (float)(GINT16(*shorts))*shift; + shorts++; + pConnection->normal[2] = (float)(GINT16(*shorts))*shift; + shorts++; + + bytes = (unsigned char*)shorts; + } + + // Load textures + m_nTextureCount = *bytes; + if (m_nTextureCount > 0) + m_pTextures = (TEXTURE*)malloc(m_nTextureCount*sizeof(TEXTURE)); + bytes++; + + for (sh = 0; sh < m_nTextureCount; sh++) + { + char name[9]; + TEXTURE* tex = &m_pTextures[sh]; + tex->color = ConvertColor(*bytes); + bytes++; - float box[24][3] = { - { m_fDimensions[0], m_fDimensions[1], m_fDimensions[2] }, - { m_fDimensions[3], m_fDimensions[1], m_fDimensions[2] }, - { m_fDimensions[3], m_fDimensions[4], m_fDimensions[2] }, - { m_fDimensions[0], m_fDimensions[4], m_fDimensions[2] }, - { m_fDimensions[0], m_fDimensions[1], m_fDimensions[5] }, - { m_fDimensions[0], m_fDimensions[4], m_fDimensions[5] }, - { m_fDimensions[3], m_fDimensions[4], m_fDimensions[5] }, - { m_fDimensions[3], m_fDimensions[1], m_fDimensions[5] }, - { m_fDimensions[3], m_fDimensions[4], m_fDimensions[2] }, - { m_fDimensions[3], m_fDimensions[1], m_fDimensions[2] }, - { m_fDimensions[3], m_fDimensions[1], m_fDimensions[5] }, - { m_fDimensions[3], m_fDimensions[4], m_fDimensions[5] }, - { m_fDimensions[0], m_fDimensions[4], m_fDimensions[5] }, - { m_fDimensions[0], m_fDimensions[1], m_fDimensions[5] }, - { m_fDimensions[0], m_fDimensions[1], m_fDimensions[2] }, - { m_fDimensions[0], m_fDimensions[4], m_fDimensions[2] }, - { m_fDimensions[0], m_fDimensions[1], m_fDimensions[5] }, - { m_fDimensions[3], m_fDimensions[1], m_fDimensions[5] }, - { m_fDimensions[3], m_fDimensions[1], m_fDimensions[2] }, - { m_fDimensions[0], m_fDimensions[1], m_fDimensions[2] }, - { m_fDimensions[0], m_fDimensions[4], m_fDimensions[2] }, - { m_fDimensions[3], m_fDimensions[4], m_fDimensions[2] }, - { m_fDimensions[3], m_fDimensions[4], m_fDimensions[5] }, - { m_fDimensions[0], m_fDimensions[4], m_fDimensions[5] } - }; - glVertexPointer (3, GL_FLOAT, 0, box); - glDrawArrays(GL_QUADS, 0, 24); - glEndList(); - - // Open pieces.bin and buffer the information we need. - strcpy(filename, project->GetLibraryPath()); - strcat(filename, "pieces.bin"); - if (!bin.Open(filename, "rb")) - return; - - buf = malloc(m_nSize); - bin.Seek(m_nOffset, SEEK_SET); - bin.Read(buf, m_nSize); - bin.Close(); - - shift = 1.0f/(1<<14); - scale = 0.01f; - if (m_nFlags & LC_PIECE_MEDIUM) scale = 0.001f; - if (m_nFlags & LC_PIECE_SMALL) scale = 0.0001f; - longs = (unsigned long*)buf; - fixverts = verts = *longs; - bytes = (unsigned char*)(longs + 1); - bytes += verts * sizeof(short) * 3; - - // Read connections - m_nConnectionCount = *((unsigned short*)bytes); - bytes += sizeof(unsigned short); - m_pConnections = (CONNECTIONINFO*)malloc(m_nConnectionCount * sizeof(CONNECTIONINFO)); - - sh = m_nConnectionCount; - for (pConnection = m_pConnections; sh--; pConnection++) - { - pConnection->type = *bytes; - bytes++; - - shorts = (short*)bytes; - pConnection->center[0] = (float)(*shorts)*scale; - shorts++; - pConnection->center[1] = (float)(*shorts)*scale; - shorts++; - pConnection->center[2] = (float)(*shorts)*scale; - shorts++; - pConnection->normal[0] = (float)(*shorts)*shift; - shorts++; - pConnection->normal[1] = (float)(*shorts)*shift; - shorts++; - pConnection->normal[2] = (float)(*shorts)*shift; - shorts++; - - bytes = (unsigned char*)shorts; - } + strcpy(name, (char*)bytes); + tex->texture = project->FindTexture(name); - // Load textures - m_nTextureCount = *bytes; - if (m_nTextureCount > 0) - m_pTextures = (TEXTURE*)malloc(m_nTextureCount*sizeof(TEXTURE)); - bytes++; + shorts = GINT16((short*)(bytes + 8)); + for (i = 0; i < 4; i++) + { + tex->vertex[i][0] = (float)GINT16(shorts[0])*scale; + tex->vertex[i][1] = (float)GINT16(shorts[1])*scale; + tex->vertex[i][2] = (float)GINT16(shorts[2])*scale; + shorts += 3; + } - for (sh = 0; sh < m_nTextureCount; sh++) - { - char name[9]; - TEXTURE* tex = &m_pTextures[sh]; - tex->color = ConvertColor(*bytes); - bytes++; + for (i = 0; i < 4; i++) + { + tex->coords[i][0] = (float)GINT16(shorts[0]); + tex->coords[i][1] = (float)GINT16(shorts[1]); + shorts += 2; + } - strcpy(name, (char*)bytes); - tex->texture = project->FindTexture(name); + bytes += 8 + 20*sizeof(unsigned short); + } - shorts = (short*)(bytes + 8); - for (i = 0; i < 4; i++) - { - tex->vertex[i][0] = (float)shorts[0]*scale; - tex->vertex[i][1] = (float)shorts[1]*scale; - tex->vertex[i][2] = (float)shorts[2]*scale; - shorts += 3; - } + // Read groups + m_nGroupCount = GUINT16(*((unsigned short*)bytes)); + bytes += sizeof(unsigned short); + m_pGroups = (DRAWGROUP*)malloc(sizeof(DRAWGROUP)*m_nGroupCount); + memset(m_pGroups, 0, sizeof(DRAWGROUP)*m_nGroupCount); - for (i = 0; i < 4; i++) - { - tex->coords[i][0] = (float)shorts[0]; - tex->coords[i][1] = (float)shorts[1]; - shorts += 2; - } + // First we need to know the number of vertexes + tmp = bytes; + sh = m_nGroupCount; + unsigned long quads = 0; + while (sh--) + { + bt = *bytes; + bytes++; + bytes += bt*sizeof(unsigned short); - bytes += 8 + 20*sizeof(unsigned short); + while (*bytes) + { + if (*bytes == LC_MESH) + { + if (fixverts > 65535) + { + unsigned long colors, *p; + p = (unsigned long*)(bytes + 1); + colors = GUINT32(*p); + p++; + + while (colors--) + { + p++; // color code + quads += GUINT32(*p); + p += GUINT32(*p) + 1; + p += GUINT32(*p) + 1; + p += GUINT32(*p) + 1; + } + + bytes = (unsigned char*)p; } - - // Read groups - m_nGroupCount = *((unsigned short*)bytes); - bytes += sizeof(unsigned short); - m_pGroups = (DRAWGROUP*)malloc(sizeof(DRAWGROUP)*m_nGroupCount); - memset(m_pGroups, 0, sizeof(DRAWGROUP)*m_nGroupCount); - - // First we need to know the number of vertexes - tmp = bytes; - sh = m_nGroupCount; - unsigned long quads = 0; - while (sh--) + else { - bt = *bytes; - bytes++; - bytes += bt*sizeof(unsigned short); + unsigned short colors, *p; + p = (unsigned short*)(bytes + 1); + colors = GUINT16(*p); + p++; + + while (colors--) + { + p++; // color code + quads += GUINT16(*p); + p += GUINT16(*p) + 1; + p += GUINT16(*p) + 1; + p += GUINT16(*p) + 1; + } + + bytes = (unsigned char*)p; + } + } + + if (*bytes == LC_STUD) + { + verts += (2*SIDES)+1; + quads += 4*SIDES; + bytes += 2*sizeof(unsigned char) + 12*sizeof(float); + } + + if (*bytes == LC_STUD2) + { + verts += 4*SIDES; + quads += 12*SIDES; + bytes += 2*sizeof(unsigned char) + 12*sizeof(float); + } + + if (*bytes == LC_STUD3) + { + verts += (2*SIDES)+1; + quads += 4*SIDES; + bytes += 2*sizeof(unsigned char) + 12*sizeof(float); + } + + if (*bytes == LC_STUD4) + { + verts += 4*SIDES; + quads += 12*SIDES; + bytes += 2*sizeof(unsigned char) + 12*sizeof(float); + } + } + bytes++; // should be 0 + } + + m_fVertexArray = (float*)malloc(3*sizeof(float)*verts); + m_nVertexCount = verts; + if ((verts > 65535) || (quads > 65535)) + m_nFlags |= LC_PIECE_LONGDATA; + else + m_nFlags &= ~LC_PIECE_LONGDATA; + + // Copy the 'fixed' vertexes + shorts = GINT16((short*)(longs + 1)); + for (verts = 0; verts < GUINT32(*longs); verts++) + { + m_fVertexArray[verts*3] = (float)GINT16(*shorts)*scale; + shorts++; + m_fVertexArray[verts*3+1] = (float)GINT16(*shorts)*scale; + shorts++; + m_fVertexArray[verts*3+2] = (float)GINT16(*shorts)*scale; + shorts++; + } + + // Read groups + bytes = tmp; + sh = m_nGroupCount; + for (pGroup = m_pGroups; sh--; pGroup++) + { + bt = *bytes; + bytes++; - while (*bytes) - { - if (*bytes == LC_MESH) - { - if (fixverts > 65535) - { - unsigned long colors, *p; - p = (unsigned long*)(bytes + 1); - colors = *p; - p++; + pGroup->connections[bt] = 0xFFFF; + while(bt--) + { + unsigned short tmp = GUINT16(*bytes); + pGroup->connections[bt] = tmp; + bytes += sizeof(unsigned short); + } - while (colors--) - { - p++; // color code - quads += *p; - p += *p + 1; - p += *p + 1; - p += *p + 1; - } + // Currently there's only one type of drawinfo (mesh or stud) + // per group but this will change in the future. + switch (*bytes) + { + case LC_MESH: + if (fixverts > 65535) + { + unsigned long colors, *p; + bytes++; + p = (unsigned long*)bytes; + colors = GUINT32(*p); + p++; - bytes = (unsigned char*)p; - } - else - { - unsigned short colors, *p; - p = (unsigned short*)(bytes + 1); - colors = *p; - p++; + while (colors--) + { + *p = ConvertColor(GUINT32(*p)); + p++; // color code +#ifdef LC_BIG_ENDIAN + int f; + f = GUINT32(*p) + 1; + while (f--) { *p = GUINT32(*p); p++; }; + f = GUINT32(*p) + 1; + while (f--) { *p = GUINT32(*p); p++; }; + f = GUINT32(*p) + 1; + while (f--) { *p = GUINT32(*p); p++; }; +#else + p += GUINT32(*p) + 1; + p += GUINT32(*p) + 1; + p += GUINT32(*p) + 1; +#endif + } - while (colors--) - { - p++; // color code - quads += *p; - p += *p + 1; - p += *p + 1; - p += *p + 1; - } + i = (unsigned char*)p - bytes; + pGroup->drawinfo = malloc(i); + memcpy(pGroup->drawinfo, bytes, i); + bytes = (unsigned char*)p; + } + else + { + unsigned short colors, *p; + bytes++; + p = (unsigned short*)bytes; + colors = GUINT16(*p); + p++; - bytes = (unsigned char*)p; - } - } + while (colors--) + { + *p = ConvertColor(GUINT16(*p)); + p++; // color code +#ifdef LC_BIG_ENDIAN + int f; + f = GUINT16(*p) + 1; + while (f--) { *p = GUINT16(*p); p++; }; + f = GUINT16(*p) + 1; + while (f--) { *p = GUINT16(*p); p++; }; + f = GUINT16(*p) + 1; + while (f--) { *p = GUINT16(*p); p++; }; +#else + p += *p + 1; + p += *p + 1; + p += *p + 1; +#endif + } - if (*bytes == LC_STUD) - { - verts += (2*SIDES)+1; - quads += 4*SIDES; - bytes += 2*sizeof(unsigned char) + 12*sizeof(float); - } + i = (unsigned char*)p - bytes; - if (*bytes == LC_STUD2) - { - verts += 4*SIDES; - quads += 12*SIDES; - bytes += 2*sizeof(unsigned char) + 12*sizeof(float); - } - - if (*bytes == LC_STUD3) - { - verts += (2*SIDES)+1; - quads += 4*SIDES; - bytes += 2*sizeof(unsigned char) + 12*sizeof(float); - } + if (m_nFlags & LC_PIECE_LONGDATA) + { + pGroup->drawinfo = malloc(i*sizeof(unsigned long)/sizeof(unsigned short)); + longs = (unsigned long*)pGroup->drawinfo; - if (*bytes == LC_STUD4) - { - verts += 4*SIDES; - quads += 12*SIDES; - bytes += 2*sizeof(unsigned char) + 12*sizeof(float); - } - } - bytes++; // should be 0 + for (ushorts = (unsigned short*)bytes; ushorts != p; ushorts++, longs++) + *longs = GUINT16(*ushorts); } - - m_fVertexArray = (float*)malloc(3*sizeof(float)*verts); - m_nVertexCount = verts; - if ((verts > 65535) || (quads > 65535)) - m_nFlags |= LC_PIECE_LONGDATA; else - m_nFlags &= ~LC_PIECE_LONGDATA; - - // Copy the 'fixed' vertexes - shorts = (short*)(longs + 1); - for (verts = 0; verts < *longs; verts++) { - m_fVertexArray[verts*3] = (float)(*shorts)*scale; - shorts++; - m_fVertexArray[verts*3+1] = (float)(*shorts)*scale; - shorts++; - m_fVertexArray[verts*3+2] = (float)(*shorts)*scale; - shorts++; + pGroup->drawinfo = malloc(i); + memcpy(pGroup->drawinfo, bytes, i); } - // Read groups - bytes = tmp; - sh = m_nGroupCount; - for (pGroup = m_pGroups; sh--; pGroup++) - { - bt = *bytes; - bytes++; - - pGroup->connections[bt] = 0xFFFF; - while(bt--) - { - unsigned short tmp = *bytes; - pGroup->connections[bt] = tmp; - bytes += sizeof(unsigned short); - } - - // Currently there's only one type of drawinfo (mesh or stud) - // per group but this will change in the future. - switch (*bytes) - { - case LC_MESH: - if (fixverts > 65535) - { - unsigned long colors, *p; - bytes++; - p = (unsigned long*)bytes; - colors = *p; - p++; - - while (colors--) - { - *p = ConvertColor(*p); - p++; // color code - p += *p + 1; - p += *p + 1; - p += *p + 1; - } - - i = (unsigned char*)p - bytes; - pGroup->drawinfo = malloc(i); - memcpy(pGroup->drawinfo, bytes, i); - bytes = (unsigned char*)p; - } - else - { - unsigned short colors, *p; - bytes++; - p = (unsigned short*)bytes; - colors = *p; - p++; - - while (colors--) - { - *p = ConvertColor(*p); - p++; // color code - p += *p + 1; - p += *p + 1; - p += *p + 1; - } - - i = (unsigned char*)p - bytes; - - if (m_nFlags & LC_PIECE_LONGDATA) - { - pGroup->drawinfo = malloc(i*sizeof(unsigned long)/sizeof(unsigned short)); - longs = (unsigned long*)pGroup->drawinfo; - - for (ushorts = (unsigned short*)bytes; ushorts != p; ushorts++, longs++) - *longs = *ushorts; - } - else - { - pGroup->drawinfo = malloc(i); - memcpy(pGroup->drawinfo, bytes, i); - } - - bytes = (unsigned char*)p; - } - break; - - case LC_STUD: - { - int size; - Matrix mat((float*)(bytes+2)); - unsigned short color = ConvertColor(*(bytes+1)); - - // Create the vertexes - for (i = 0; i < SIDES; i++) - { - m_fVertexArray[(verts+i+SIDES)*3] = - m_fVertexArray[(verts+i)*3] = - LC_STUD_RADIUS * costbl[i]; - m_fVertexArray[(verts+i+SIDES)*3+1] = - m_fVertexArray[(verts+i)*3+1] = - LC_STUD_RADIUS * sintbl[i]; - m_fVertexArray[(verts+i)*3+2] = 0; - m_fVertexArray[(verts+i+SIDES)*3+2] = LC_STUD_HEIGHT; - } - m_fVertexArray[(verts+2*SIDES)*3] = 0; - m_fVertexArray[(verts+2*SIDES)*3+1] = 0; - m_fVertexArray[(verts+2*SIDES)*3+2] = LC_STUD_HEIGHT; - - mat.TransformPoints(&m_fVertexArray[verts*3], 2*SIDES+1); - // colors + 2*num_prim + sides*prims - size = 9+SIDES*11; - - if (m_nFlags & LC_PIECE_LONGDATA) - { - pGroup->drawinfo = malloc(sizeof(unsigned long)*size); - longs = (unsigned long*)pGroup->drawinfo; - - longs[0] = 2; // colors - longs[1] = color; - longs[2] = SIDES*4; - j = 3; - - for (i = 0; i < SIDES; i++) - { - longs[3+i*4] = (unsigned long)verts + i; - if (i == SIDES-1) - { - longs[4+i*4] = (unsigned long)verts; - longs[5+i*4] = (unsigned long)verts + SIDES; - } - else - { - longs[4+i*4] = (unsigned long)verts + i + 1; - longs[5+i*4] = (unsigned long)verts + SIDES + i + 1; - } - longs[6+i*4] = (unsigned long)verts + SIDES + i; - } - j += 4*SIDES; - longs[j] = SIDES*3; - j++; - - for (i = 0; i < SIDES; i++) - { - longs[j+i*3] = (unsigned short)verts + 2*SIDES; - longs[1+j+i*3] = (unsigned short)verts + SIDES + i; - if (i == SIDES-1) - longs[2+j+i*3] = (unsigned short)verts + SIDES; - else - longs[2+j+i*3] = (unsigned short)verts + SIDES + i + 1; - } - - j += 3*SIDES; - longs[j] = 0; j++; // lines - longs[j] = LC_COL_EDGES; j++; // color - longs[j] = 0; j++; // quads - longs[j] = 0; j++; // tris - longs[j] = 4*SIDES; j++; - - for (i = 0; i < SIDES; i++) - { - longs[j+i*4] = (unsigned long)verts + i; - if (i == SIDES-1) - longs[1+j+i*4] = (unsigned long)verts; - else - longs[1+j+i*4] = (unsigned long)verts + i + 1; - - longs[2+j+i*4] = longs[j+i*4] + SIDES; - longs[3+j+i*4] = longs[1+j+i*4] + SIDES; - } - } - else - { - pGroup->drawinfo = malloc(sizeof(unsigned short)*size); - ushorts = (unsigned short*)pGroup->drawinfo; - - ushorts[0] = 2; // colors - ushorts[1] = color; - ushorts[2] = SIDES*4; - j = 3; - - for (i = 0; i < SIDES; i++) - { - ushorts[3+i*4] = (unsigned short)(verts + i); - if (i == SIDES-1) - { - ushorts[4+i*4] = (unsigned short)verts; - ushorts[5+i*4] = (unsigned short)verts + SIDES; - } - else - { - ushorts[4+i*4] = (unsigned short)verts + i + 1; - ushorts[5+i*4] = (unsigned short)verts + SIDES + i + 1; - } - ushorts[6+i*4] = (unsigned short)verts + SIDES + i; - } - j += 4*SIDES; - ushorts[j] = SIDES*3; - j++; - - for (i = 0; i < SIDES; i++) - { - ushorts[j+i*3] = (unsigned short)verts + 2*SIDES; - ushorts[1+j+i*3] = (unsigned short)verts + SIDES + i; - if (i == SIDES-1) - ushorts[2+j+i*3] = (unsigned short)verts + SIDES; - else - ushorts[2+j+i*3] = (unsigned short)verts + SIDES + i + 1; - } - - j += 3*SIDES; - ushorts[j] = 0; j++; // lines - ushorts[j] = LC_COL_EDGES; j++; // color - ushorts[j] = 0; j++; // quads - ushorts[j] = 0; j++; // tris - ushorts[j] = 4*SIDES; j++; - - for (i = 0; i < SIDES; i++) - { - ushorts[j+i*4] = (unsigned short)verts + i; - if (i == SIDES-1) - ushorts[1+j+i*4] = (unsigned short)verts; - else - ushorts[1+j+i*4] = (unsigned short)verts + i + 1; - - ushorts[2+j+i*4] = ushorts[j+i*4] + SIDES; - ushorts[3+j+i*4] = ushorts[1+j+i*4] + SIDES; - } - } - - verts += 2*SIDES+1; - bytes += 2*sizeof(unsigned char) + 12*sizeof(float); - } break; - - case LC_STUD2: - { - int size; - Matrix mat((float*)(bytes+2)); - unsigned short color = ConvertColor(*(bytes+1)); - - // Create the vertexes - for (i = 0; i < SIDES; i++) - { - // outside - m_fVertexArray[(verts+i+SIDES)*3] = - m_fVertexArray[(verts+i)*3] = - LC_STUD_RADIUS * costbl[i]; - m_fVertexArray[(verts+i+SIDES)*3+1] = - m_fVertexArray[(verts+i)*3+1] = - LC_STUD_RADIUS * sintbl[i]; - m_fVertexArray[(verts+i)*3+2] = LC_STUD_HEIGHT; - m_fVertexArray[(verts+i+SIDES)*3+2] = 0; - - // inside - m_fVertexArray[(verts+i+2*SIDES)*3] = - m_fVertexArray[(verts+i+3*SIDES)*3] = - 0.16f * costbl[i]; - m_fVertexArray[(verts+i+2*SIDES)*3+1] = - m_fVertexArray[(verts+i+3*SIDES)*3+1] = - 0.16f * sintbl[i]; - m_fVertexArray[(verts+i+3*SIDES)*3+2] = LC_STUD_HEIGHT; - m_fVertexArray[(verts+i+2*SIDES)*3+2] = 0; - } - - mat.TransformPoints(&m_fVertexArray[verts*3], 4*SIDES); - // colors + 2*num_prim + sides*prims - size = 9+SIDES*20; - - if (m_nFlags & LC_PIECE_LONGDATA) - { - pGroup->drawinfo = malloc(sizeof(unsigned long)*size); - longs = (unsigned long*)pGroup->drawinfo; - - longs[0] = 2; // colors - longs[1] = color; - longs[2] = SIDES*12; - j = 3; - - // outside - for (i = 0; i < SIDES; i++) - { - longs[j+i*4] = (unsigned long)(verts + SIDES + i); - if (i == SIDES-1) - { - longs[j+1+i*4] = (unsigned long)verts + SIDES; - longs[j+2+i*4] = (unsigned long)verts; - } - else - { - longs[j+1+i*4] = (unsigned long)verts + SIDES + i + 1; - longs[j+2+i*4] = (unsigned long)verts + i + 1; - } - longs[j+3+i*4] = (unsigned long)verts + i; - } - j += 4*SIDES; - - // inside - for (i = 0; i < SIDES; i++) - { - longs[j+i*4] = (unsigned long)(verts + 2*SIDES + i); - if (i == SIDES-1) - { - longs[j+1+i*4] = (unsigned long)verts + 2*SIDES; - longs[j+2+i*4] = (unsigned long)verts + 3*SIDES; - } - else - { - longs[j+1+i*4] = (unsigned long)verts + 2*SIDES + i + 1; - longs[j+2+i*4] = (unsigned long)verts + 3*SIDES + i + 1; - } - longs[j+3+i*4] = (unsigned long)verts + 3*SIDES + i; - } - j += 4*SIDES; - - // ring - for (i = 0; i < SIDES; i++) - { - longs[j+i*4] = (unsigned long)(verts + i); - if (i == SIDES-1) - { - longs[j+1+i*4] = (unsigned long)verts; - longs[j+2+i*4] = (unsigned long)verts + 3*SIDES; - } - else - { - longs[j+1+i*4] = (unsigned long)verts + i + 1; - longs[j+2+i*4] = (unsigned long)verts + 3*SIDES + i + 1; - } - longs[j+3+i*4] = (unsigned long)verts + 3*SIDES + i; - } - j += 4*SIDES; - - longs[j] = 0; j++; // tris - longs[j] = 0; j++; // lines - longs[j] = LC_COL_EDGES; j++; // color - longs[j] = 0; j++; // quads - longs[j] = 0; j++; // tris - longs[j] = 8*SIDES; j++; - - // outside - for (i = 0; i < SIDES; i++) - { - longs[j+i*4] = (unsigned long)verts + i; - if (i == SIDES-1) - longs[1+j+i*4] = (unsigned long)verts; - else - longs[1+j+i*4] = (unsigned long)verts + i + 1; - - longs[2+j+i*4] = longs[j+i*4] + SIDES; - longs[3+j+i*4] = longs[1+j+i*4] + SIDES; - } - j += 4*SIDES; - - // inside - for (i = 0; i < SIDES; i++) - { - longs[j+i*4] = (unsigned long)verts + 2*SIDES + i; - if (i == SIDES-1) - longs[1+j+i*4] = (unsigned long)verts + 2*SIDES; - else - longs[1+j+i*4] = (unsigned long)verts + 2*SIDES + i + 1; - - longs[2+j+i*4] = longs[j+i*4] + SIDES; - longs[3+j+i*4] = longs[1+j+i*4] + SIDES; - } - } - else - { - pGroup->drawinfo = malloc(sizeof(unsigned short)*size); - ushorts = (unsigned short*)pGroup->drawinfo; - - ushorts[0] = 2; // colors - ushorts[1] = color; - ushorts[2] = SIDES*12; - j = 3; + bytes = (unsigned char*)p; + } + break; - // outside - for (i = 0; i < SIDES; i++) - { - ushorts[j+i*4] = (unsigned short)(verts + SIDES + i); - if (i == SIDES-1) - { - ushorts[j+1+i*4] = (unsigned short)verts + SIDES; - ushorts[j+2+i*4] = (unsigned short)verts; - } - else - { - ushorts[j+1+i*4] = (unsigned short)verts + SIDES + i + 1; - ushorts[j+2+i*4] = (unsigned short)verts + i + 1; - } - ushorts[j+3+i*4] = (unsigned short)verts + i; - } - j += 4*SIDES; - - // inside - for (i = 0; i < SIDES; i++) - { - ushorts[j+i*4] = (unsigned short)(verts + 3*SIDES + i); - if (i == SIDES-1) - { - ushorts[j+1+i*4] = (unsigned short)verts + 3*SIDES; - ushorts[j+2+i*4] = (unsigned short)verts + 2*SIDES; - } - else - { - ushorts[j+1+i*4] = (unsigned short)verts + 3*SIDES + i + 1; - ushorts[j+2+i*4] = (unsigned short)verts + 2*SIDES + i + 1; - } - ushorts[j+3+i*4] = (unsigned short)verts + 2*SIDES + i; - } - j += 4*SIDES; - - // ring - for (i = 0; i < SIDES; i++) - { - ushorts[j+i*4] = (unsigned short)(verts + i); - if (i == SIDES-1) - { - ushorts[j+1+i*4] = (unsigned short)verts; - ushorts[j+2+i*4] = (unsigned short)verts + 3*SIDES; - } - else - { - ushorts[j+1+i*4] = (unsigned short)verts + i + 1; - ushorts[j+2+i*4] = (unsigned short)verts + 3*SIDES + i + 1; - } - ushorts[j+3+i*4] = (unsigned short)verts + 3*SIDES + i; - } - j += 4*SIDES; + case LC_STUD: + { + int size; + Matrix mat((float*)(bytes+2)); + unsigned short color = ConvertColor(*(bytes+1)); + + // Create the vertexes + for (i = 0; i < SIDES; i++) + { + m_fVertexArray[(verts+i+SIDES)*3] = + m_fVertexArray[(verts+i)*3] = + LC_STUD_RADIUS * costbl[i]; + m_fVertexArray[(verts+i+SIDES)*3+1] = + m_fVertexArray[(verts+i)*3+1] = + LC_STUD_RADIUS * sintbl[i]; + m_fVertexArray[(verts+i)*3+2] = 0; + m_fVertexArray[(verts+i+SIDES)*3+2] = LC_STUD_HEIGHT; + } + m_fVertexArray[(verts+2*SIDES)*3] = 0; + m_fVertexArray[(verts+2*SIDES)*3+1] = 0; + m_fVertexArray[(verts+2*SIDES)*3+2] = LC_STUD_HEIGHT; + + mat.TransformPoints(&m_fVertexArray[verts*3], 2*SIDES+1); + // colors + 2*num_prim + sides*prims + size = 9+SIDES*11; + + if (m_nFlags & LC_PIECE_LONGDATA) + { + pGroup->drawinfo = malloc(sizeof(unsigned long)*size); + longs = (unsigned long*)pGroup->drawinfo; + + longs[0] = 2; // colors + longs[1] = color; + longs[2] = SIDES*4; + j = 3; + + for (i = 0; i < SIDES; i++) + { + longs[3+i*4] = (unsigned long)verts + i; + if (i == SIDES-1) + { + longs[4+i*4] = (unsigned long)verts; + longs[5+i*4] = (unsigned long)verts + SIDES; + } + else + { + longs[4+i*4] = (unsigned long)verts + i + 1; + longs[5+i*4] = (unsigned long)verts + SIDES + i + 1; + } + longs[6+i*4] = (unsigned long)verts + SIDES + i; + } + j += 4*SIDES; + longs[j] = SIDES*3; + j++; - ushorts[j] = 0; j++; // tris - ushorts[j] = 0; j++; // lines - ushorts[j] = LC_COL_EDGES; j++; // color - ushorts[j] = 0; j++; // quads - ushorts[j] = 0; j++; // tris - ushorts[j] = 8*SIDES; j++; + for (i = 0; i < SIDES; i++) + { + longs[j+i*3] = (unsigned short)verts + 2*SIDES; + longs[1+j+i*3] = (unsigned short)verts + SIDES + i; + if (i == SIDES-1) + longs[2+j+i*3] = (unsigned short)verts + SIDES; + else + longs[2+j+i*3] = (unsigned short)verts + SIDES + i + 1; + } - // outside - for (i = 0; i < SIDES; i++) - { - ushorts[j+i*4] = (unsigned short)verts + i; - if (i == SIDES-1) - ushorts[1+j+i*4] = (unsigned short)verts; - else - ushorts[1+j+i*4] = (unsigned short)verts + i + 1; - - ushorts[2+j+i*4] = ushorts[j+i*4] + SIDES; - ushorts[3+j+i*4] = ushorts[1+j+i*4] + SIDES; - } - j += 4*SIDES; + j += 3*SIDES; + longs[j] = 0; j++; // lines + longs[j] = LC_COL_EDGES; j++; // color + longs[j] = 0; j++; // quads + longs[j] = 0; j++; // tris + longs[j] = 4*SIDES; j++; - // inside - for (i = 0; i < SIDES; i++) - { - ushorts[j+i*4] = (unsigned short)verts + 2*SIDES + i; - if (i == SIDES-1) - ushorts[1+j+i*4] = (unsigned short)verts + 2*SIDES; - else - ushorts[1+j+i*4] = (unsigned short)verts + 2*SIDES + i + 1; - - ushorts[2+j+i*4] = ushorts[j+i*4] + SIDES; - ushorts[3+j+i*4] = ushorts[1+j+i*4] + SIDES; - } - } + for (i = 0; i < SIDES; i++) + { + longs[j+i*4] = (unsigned long)verts + i; + if (i == SIDES-1) + longs[1+j+i*4] = (unsigned long)verts; + else + longs[1+j+i*4] = (unsigned long)verts + i + 1; + + longs[2+j+i*4] = longs[j+i*4] + SIDES; + longs[3+j+i*4] = longs[1+j+i*4] + SIDES; + } + } + else + { + pGroup->drawinfo = malloc(sizeof(unsigned short)*size); + ushorts = (unsigned short*)pGroup->drawinfo; + + ushorts[0] = 2; // colors + ushorts[1] = color; + ushorts[2] = SIDES*4; + j = 3; + + for (i = 0; i < SIDES; i++) + { + ushorts[3+i*4] = (unsigned short)(verts + i); + if (i == SIDES-1) + { + ushorts[4+i*4] = (unsigned short)verts; + ushorts[5+i*4] = (unsigned short)verts + SIDES; + } + else + { + ushorts[4+i*4] = (unsigned short)verts + i + 1; + ushorts[5+i*4] = (unsigned short)verts + SIDES + i + 1; + } + ushorts[6+i*4] = (unsigned short)verts + SIDES + i; + } + j += 4*SIDES; + ushorts[j] = SIDES*3; + j++; - verts += 4*SIDES; - bytes += 2*sizeof(unsigned char) + 12*sizeof(float); - } break; + for (i = 0; i < SIDES; i++) + { + ushorts[j+i*3] = (unsigned short)verts + 2*SIDES; + ushorts[1+j+i*3] = (unsigned short)verts + SIDES + i; + if (i == SIDES-1) + ushorts[2+j+i*3] = (unsigned short)verts + SIDES; + else + ushorts[2+j+i*3] = (unsigned short)verts + SIDES + i + 1; + } - case LC_STUD3: - { - int size; - Matrix mat((float*)(bytes+2)); - unsigned short color = ConvertColor(*(bytes+1)); + j += 3*SIDES; + ushorts[j] = 0; j++; // lines + ushorts[j] = LC_COL_EDGES; j++; // color + ushorts[j] = 0; j++; // quads + ushorts[j] = 0; j++; // tris + ushorts[j] = 4*SIDES; j++; - // Create the vertexes - for (i = 0; i < SIDES; i++) - { - m_fVertexArray[(verts+i+SIDES)*3] = - m_fVertexArray[(verts+i)*3] = - 0.16f * costbl[i]; - m_fVertexArray[(verts+i+SIDES)*3+1] = - m_fVertexArray[(verts+i)*3+1] = - 0.16f * sintbl[i]; - m_fVertexArray[(verts+i)*3+2] = 0; - m_fVertexArray[(verts+i+SIDES)*3+2] = LC_STUD_HEIGHT; - } - m_fVertexArray[(verts+2*SIDES)*3] = 0; - m_fVertexArray[(verts+2*SIDES)*3+1] = 0; - m_fVertexArray[(verts+2*SIDES)*3+2] = LC_STUD_HEIGHT; + for (i = 0; i < SIDES; i++) + { + ushorts[j+i*4] = (unsigned short)verts + i; + if (i == SIDES-1) + ushorts[1+j+i*4] = (unsigned short)verts; + else + ushorts[1+j+i*4] = (unsigned short)verts + i + 1; + + ushorts[2+j+i*4] = ushorts[j+i*4] + SIDES; + ushorts[3+j+i*4] = ushorts[1+j+i*4] + SIDES; + } + } - mat.TransformPoints(&m_fVertexArray[verts*3], 2*SIDES+1); - // colors + 2*num_prim + sides*prims - size = 9+SIDES*11; + verts += 2*SIDES+1; + bytes += 2*sizeof(unsigned char) + 12*sizeof(float); + } break; - if (m_nFlags & LC_PIECE_LONGDATA) - { - pGroup->drawinfo = malloc(sizeof(unsigned long)*size); - longs = (unsigned long*)pGroup->drawinfo; + case LC_STUD2: + { + int size; + Matrix mat((float*)(bytes+2)); + unsigned short color = ConvertColor(*(bytes+1)); + + // Create the vertexes + for (i = 0; i < SIDES; i++) + { + // outside + m_fVertexArray[(verts+i+SIDES)*3] = + m_fVertexArray[(verts+i)*3] = + LC_STUD_RADIUS * costbl[i]; + m_fVertexArray[(verts+i+SIDES)*3+1] = + m_fVertexArray[(verts+i)*3+1] = + LC_STUD_RADIUS * sintbl[i]; + m_fVertexArray[(verts+i)*3+2] = LC_STUD_HEIGHT; + m_fVertexArray[(verts+i+SIDES)*3+2] = 0; + + // inside + m_fVertexArray[(verts+i+2*SIDES)*3] = + m_fVertexArray[(verts+i+3*SIDES)*3] = + 0.16f * costbl[i]; + m_fVertexArray[(verts+i+2*SIDES)*3+1] = + m_fVertexArray[(verts+i+3*SIDES)*3+1] = + 0.16f * sintbl[i]; + m_fVertexArray[(verts+i+3*SIDES)*3+2] = LC_STUD_HEIGHT; + m_fVertexArray[(verts+i+2*SIDES)*3+2] = 0; + } + + mat.TransformPoints(&m_fVertexArray[verts*3], 4*SIDES); + // colors + 2*num_prim + sides*prims + size = 9+SIDES*20; + + if (m_nFlags & LC_PIECE_LONGDATA) + { + pGroup->drawinfo = malloc(sizeof(unsigned long)*size); + longs = (unsigned long*)pGroup->drawinfo; + + longs[0] = 2; // colors + longs[1] = color; + longs[2] = SIDES*12; + j = 3; + + // outside + for (i = 0; i < SIDES; i++) + { + longs[j+i*4] = (unsigned long)(verts + SIDES + i); + if (i == SIDES-1) + { + longs[j+1+i*4] = (unsigned long)verts + SIDES; + longs[j+2+i*4] = (unsigned long)verts; + } + else + { + longs[j+1+i*4] = (unsigned long)verts + SIDES + i + 1; + longs[j+2+i*4] = (unsigned long)verts + i + 1; + } + longs[j+3+i*4] = (unsigned long)verts + i; + } + j += 4*SIDES; - longs[0] = 2; // colors - longs[1] = color; - longs[2] = SIDES*4; - j = 3; + // inside + for (i = 0; i < SIDES; i++) + { + longs[j+i*4] = (unsigned long)(verts + 2*SIDES + i); + if (i == SIDES-1) + { + longs[j+1+i*4] = (unsigned long)verts + 2*SIDES; + longs[j+2+i*4] = (unsigned long)verts + 3*SIDES; + } + else + { + longs[j+1+i*4] = (unsigned long)verts + 2*SIDES + i + 1; + longs[j+2+i*4] = (unsigned long)verts + 3*SIDES + i + 1; + } + longs[j+3+i*4] = (unsigned long)verts + 3*SIDES + i; + } + j += 4*SIDES; - for (i = 0; i < SIDES; i++) - { - longs[3+i*4] = (unsigned long)verts + SIDES + i; - if (i == SIDES-1) - { - longs[4+i*4] = (unsigned long)verts + SIDES; - longs[5+i*4] = (unsigned long)verts; - } - else - { - longs[4+i*4] = (unsigned long)verts + SIDES + i + 1; - longs[5+i*4] = (unsigned long)verts + i + 1; - } - longs[6+i*4] = (unsigned long)verts + i; - } - j += 4*SIDES; - longs[j] = SIDES*3; - j++; + // ring + for (i = 0; i < SIDES; i++) + { + longs[j+i*4] = (unsigned long)(verts + i); + if (i == SIDES-1) + { + longs[j+1+i*4] = (unsigned long)verts; + longs[j+2+i*4] = (unsigned long)verts + 3*SIDES; + } + else + { + longs[j+1+i*4] = (unsigned long)verts + i + 1; + longs[j+2+i*4] = (unsigned long)verts + 3*SIDES + i + 1; + } + longs[j+3+i*4] = (unsigned long)verts + 3*SIDES + i; + } + j += 4*SIDES; - for (i = 0; i < SIDES; i++) - { - if (i == SIDES-1) - longs[j+i*3] = (unsigned short)verts + SIDES; - else - longs[j+i*3] = (unsigned short)verts + SIDES + i + 1; - longs[1+j+i*3] = (unsigned short)verts + SIDES + i; - longs[2+j+i*3] = (unsigned short)verts + 2*SIDES; - } + longs[j] = 0; j++; // tris + longs[j] = 0; j++; // lines + longs[j] = LC_COL_EDGES; j++; // color + longs[j] = 0; j++; // quads + longs[j] = 0; j++; // tris + longs[j] = 8*SIDES; j++; - j += 3*SIDES; - longs[j] = 0; j++; // lines - longs[j] = LC_COL_EDGES; j++; // color - longs[j] = 0; j++; // quads - longs[j] = 0; j++; // tris - longs[j] = 4*SIDES; j++; + // outside + for (i = 0; i < SIDES; i++) + { + longs[j+i*4] = (unsigned long)verts + i; + if (i == SIDES-1) + longs[1+j+i*4] = (unsigned long)verts; + else + longs[1+j+i*4] = (unsigned long)verts + i + 1; + + longs[2+j+i*4] = longs[j+i*4] + SIDES; + longs[3+j+i*4] = longs[1+j+i*4] + SIDES; + } + j += 4*SIDES; - for (i = 0; i < SIDES; i++) - { - longs[j+i*4] = (unsigned long)verts + i; - if (i == SIDES-1) - longs[1+j+i*4] = (unsigned long)verts; - else - longs[1+j+i*4] = (unsigned long)verts + i + 1; - - longs[2+j+i*4] = longs[j+i*4] + SIDES; - longs[3+j+i*4] = longs[1+j+i*4] + SIDES; - } - } - else - { - pGroup->drawinfo = malloc(sizeof(unsigned short)*size); - ushorts = (unsigned short*)pGroup->drawinfo; + // inside + for (i = 0; i < SIDES; i++) + { + longs[j+i*4] = (unsigned long)verts + 2*SIDES + i; + if (i == SIDES-1) + longs[1+j+i*4] = (unsigned long)verts + 2*SIDES; + else + longs[1+j+i*4] = (unsigned long)verts + 2*SIDES + i + 1; + + longs[2+j+i*4] = longs[j+i*4] + SIDES; + longs[3+j+i*4] = longs[1+j+i*4] + SIDES; + } + } + else + { + pGroup->drawinfo = malloc(sizeof(unsigned short)*size); + ushorts = (unsigned short*)pGroup->drawinfo; + + ushorts[0] = 2; // colors + ushorts[1] = color; + ushorts[2] = SIDES*12; + j = 3; + + // outside + for (i = 0; i < SIDES; i++) + { + ushorts[j+i*4] = (unsigned short)(verts + SIDES + i); + if (i == SIDES-1) + { + ushorts[j+1+i*4] = (unsigned short)verts + SIDES; + ushorts[j+2+i*4] = (unsigned short)verts; + } + else + { + ushorts[j+1+i*4] = (unsigned short)verts + SIDES + i + 1; + ushorts[j+2+i*4] = (unsigned short)verts + i + 1; + } + ushorts[j+3+i*4] = (unsigned short)verts + i; + } + j += 4*SIDES; - ushorts[0] = 2; // colors - ushorts[1] = color; - ushorts[2] = SIDES*4; - j = 3; + // inside + for (i = 0; i < SIDES; i++) + { + ushorts[j+i*4] = (unsigned short)(verts + 3*SIDES + i); + if (i == SIDES-1) + { + ushorts[j+1+i*4] = (unsigned short)verts + 3*SIDES; + ushorts[j+2+i*4] = (unsigned short)verts + 2*SIDES; + } + else + { + ushorts[j+1+i*4] = (unsigned short)verts + 3*SIDES + i + 1; + ushorts[j+2+i*4] = (unsigned short)verts + 2*SIDES + i + 1; + } + ushorts[j+3+i*4] = (unsigned short)verts + 2*SIDES + i; + } + j += 4*SIDES; - for (i = 0; i < SIDES; i++) - { - ushorts[3+i*4] = (unsigned short)(verts + SIDES + i); - if (i == SIDES-1) - { - ushorts[4+i*4] = (unsigned short)verts + SIDES; - ushorts[5+i*4] = (unsigned short)verts; - } - else - { - ushorts[4+i*4] = (unsigned short)verts + SIDES + i + 1; - ushorts[5+i*4] = (unsigned short)verts + i + 1; - } - ushorts[6+i*4] = (unsigned short)verts + i; - } - j += 4*SIDES; - ushorts[j] = SIDES*3; - j++; + // ring + for (i = 0; i < SIDES; i++) + { + ushorts[j+i*4] = (unsigned short)(verts + i); + if (i == SIDES-1) + { + ushorts[j+1+i*4] = (unsigned short)verts; + ushorts[j+2+i*4] = (unsigned short)verts + 3*SIDES; + } + else + { + ushorts[j+1+i*4] = (unsigned short)verts + i + 1; + ushorts[j+2+i*4] = (unsigned short)verts + 3*SIDES + i + 1; + } + ushorts[j+3+i*4] = (unsigned short)verts + 3*SIDES + i; + } + j += 4*SIDES; - for (i = 0; i < SIDES; i++) - { - if (i == SIDES-1) - ushorts[j+i*3] = (unsigned short)verts + SIDES; - else - ushorts[j+i*3] = (unsigned short)verts + SIDES + i + 1; - ushorts[1+j+i*3] = (unsigned short)verts + SIDES + i; - ushorts[2+j+i*3] = (unsigned short)verts + 2*SIDES; - } + ushorts[j] = 0; j++; // tris + ushorts[j] = 0; j++; // lines + ushorts[j] = LC_COL_EDGES; j++; // color + ushorts[j] = 0; j++; // quads + ushorts[j] = 0; j++; // tris + ushorts[j] = 8*SIDES; j++; - j += 3*SIDES; - ushorts[j] = 0; j++; // lines - ushorts[j] = LC_COL_EDGES; j++; // color - ushorts[j] = 0; j++; // quads - ushorts[j] = 0; j++; // tris - ushorts[j] = 4*SIDES; j++; + // outside + for (i = 0; i < SIDES; i++) + { + ushorts[j+i*4] = (unsigned short)verts + i; + if (i == SIDES-1) + ushorts[1+j+i*4] = (unsigned short)verts; + else + ushorts[1+j+i*4] = (unsigned short)verts + i + 1; + + ushorts[2+j+i*4] = ushorts[j+i*4] + SIDES; + ushorts[3+j+i*4] = ushorts[1+j+i*4] + SIDES; + } + j += 4*SIDES; - for (i = 0; i < SIDES; i++) - { - ushorts[j+i*4] = (unsigned short)verts + i; - if (i == SIDES-1) - ushorts[1+j+i*4] = (unsigned short)verts; - else - ushorts[1+j+i*4] = (unsigned short)verts + i + 1; - - ushorts[2+j+i*4] = ushorts[j+i*4] + SIDES; - ushorts[3+j+i*4] = ushorts[1+j+i*4] + SIDES; - } - } + // inside + for (i = 0; i < SIDES; i++) + { + ushorts[j+i*4] = (unsigned short)verts + 2*SIDES + i; + if (i == SIDES-1) + ushorts[1+j+i*4] = (unsigned short)verts + 2*SIDES; + else + ushorts[1+j+i*4] = (unsigned short)verts + 2*SIDES + i + 1; + + ushorts[2+j+i*4] = ushorts[j+i*4] + SIDES; + ushorts[3+j+i*4] = ushorts[1+j+i*4] + SIDES; + } + } - verts += 2*SIDES+1; - bytes += 2*sizeof(unsigned char) + 12*sizeof(float); - } break; + verts += 4*SIDES; + bytes += 2*sizeof(unsigned char) + 12*sizeof(float); + } break; - case LC_STUD4: - { - int size; - Matrix mat((float*)(bytes+2)); - unsigned short color = ConvertColor(*(bytes+1)); + case LC_STUD3: + { + int size; + Matrix mat((float*)(bytes+2)); + unsigned short color = ConvertColor(*(bytes+1)); + + // Create the vertexes + for (i = 0; i < SIDES; i++) + { + m_fVertexArray[(verts+i+SIDES)*3] = + m_fVertexArray[(verts+i)*3] = + 0.16f * costbl[i]; + m_fVertexArray[(verts+i+SIDES)*3+1] = + m_fVertexArray[(verts+i)*3+1] = + 0.16f * sintbl[i]; + m_fVertexArray[(verts+i)*3+2] = 0; + m_fVertexArray[(verts+i+SIDES)*3+2] = LC_STUD_HEIGHT; + } + m_fVertexArray[(verts+2*SIDES)*3] = 0; + m_fVertexArray[(verts+2*SIDES)*3+1] = 0; + m_fVertexArray[(verts+2*SIDES)*3+2] = LC_STUD_HEIGHT; + + mat.TransformPoints(&m_fVertexArray[verts*3], 2*SIDES+1); + // colors + 2*num_prim + sides*prims + size = 9+SIDES*11; + + if (m_nFlags & LC_PIECE_LONGDATA) + { + pGroup->drawinfo = malloc(sizeof(unsigned long)*size); + longs = (unsigned long*)pGroup->drawinfo; + + longs[0] = 2; // colors + longs[1] = color; + longs[2] = SIDES*4; + j = 3; + + for (i = 0; i < SIDES; i++) + { + longs[3+i*4] = (unsigned long)verts + SIDES + i; + if (i == SIDES-1) + { + longs[4+i*4] = (unsigned long)verts + SIDES; + longs[5+i*4] = (unsigned long)verts; + } + else + { + longs[4+i*4] = (unsigned long)verts + SIDES + i + 1; + longs[5+i*4] = (unsigned long)verts + i + 1; + } + longs[6+i*4] = (unsigned long)verts + i; + } + j += 4*SIDES; + longs[j] = SIDES*3; + j++; - // Create the vertexes - for (i = 0; i < SIDES; i++) - { - // outside - m_fVertexArray[(verts+i+SIDES)*3] = - m_fVertexArray[(verts+i)*3] = - LC_KNOB_RADIUS * costbl[i]; - m_fVertexArray[(verts+i+SIDES)*3+1] = - m_fVertexArray[(verts+i)*3+1] = - LC_KNOB_RADIUS * sintbl[i]; - m_fVertexArray[(verts+i)*3+2] = LC_STUD_HEIGHT; - m_fVertexArray[(verts+i+SIDES)*3+2] = 0; - - // inside - m_fVertexArray[(verts+i+2*SIDES)*3] = - m_fVertexArray[(verts+i+3*SIDES)*3] = - LC_STUD_RADIUS * costbl[i]; - m_fVertexArray[(verts+i+2*SIDES)*3+1] = - m_fVertexArray[(verts+i+3*SIDES)*3+1] = - LC_STUD_RADIUS * sintbl[i]; - m_fVertexArray[(verts+i+3*SIDES)*3+2] = LC_STUD_HEIGHT; - m_fVertexArray[(verts+i+2*SIDES)*3+2] = 0; - } + for (i = 0; i < SIDES; i++) + { + if (i == SIDES-1) + longs[j+i*3] = (unsigned short)verts + SIDES; + else + longs[j+i*3] = (unsigned short)verts + SIDES + i + 1; + longs[1+j+i*3] = (unsigned short)verts + SIDES + i; + longs[2+j+i*3] = (unsigned short)verts + 2*SIDES; + } - mat.TransformPoints(&m_fVertexArray[verts*3], 4*SIDES); - // colors + 2*num_prim + sides*prims - size = 9+SIDES*20; + j += 3*SIDES; + longs[j] = 0; j++; // lines + longs[j] = LC_COL_EDGES; j++; // color + longs[j] = 0; j++; // quads + longs[j] = 0; j++; // tris + longs[j] = 4*SIDES; j++; - if (m_nFlags & LC_PIECE_LONGDATA) - { - pGroup->drawinfo = malloc(sizeof(unsigned long)*size); - longs = (unsigned long*)pGroup->drawinfo; + for (i = 0; i < SIDES; i++) + { + longs[j+i*4] = (unsigned long)verts + i; + if (i == SIDES-1) + longs[1+j+i*4] = (unsigned long)verts; + else + longs[1+j+i*4] = (unsigned long)verts + i + 1; + + longs[2+j+i*4] = longs[j+i*4] + SIDES; + longs[3+j+i*4] = longs[1+j+i*4] + SIDES; + } + } + else + { + pGroup->drawinfo = malloc(sizeof(unsigned short)*size); + ushorts = (unsigned short*)pGroup->drawinfo; + + ushorts[0] = 2; // colors + ushorts[1] = color; + ushorts[2] = SIDES*4; + j = 3; + + for (i = 0; i < SIDES; i++) + { + ushorts[3+i*4] = (unsigned short)(verts + SIDES + i); + if (i == SIDES-1) + { + ushorts[4+i*4] = (unsigned short)verts + SIDES; + ushorts[5+i*4] = (unsigned short)verts; + } + else + { + ushorts[4+i*4] = (unsigned short)verts + SIDES + i + 1; + ushorts[5+i*4] = (unsigned short)verts + i + 1; + } + ushorts[6+i*4] = (unsigned short)verts + i; + } + j += 4*SIDES; + ushorts[j] = SIDES*3; + j++; - longs[0] = 2; // colors - longs[1] = color; - longs[2] = SIDES*12; - j = 3; + for (i = 0; i < SIDES; i++) + { + if (i == SIDES-1) + ushorts[j+i*3] = (unsigned short)verts + SIDES; + else + ushorts[j+i*3] = (unsigned short)verts + SIDES + i + 1; + ushorts[1+j+i*3] = (unsigned short)verts + SIDES + i; + ushorts[2+j+i*3] = (unsigned short)verts + 2*SIDES; + } - // outside - for (i = 0; i < SIDES; i++) - { - longs[j+i*4] = (unsigned long)(verts + i); - if (i == SIDES-1) - { - longs[j+1+i*4] = (unsigned long)verts; - longs[j+2+i*4] = (unsigned long)verts + SIDES; - } - else - { - longs[j+1+i*4] = (unsigned long)verts + i + 1; - longs[j+2+i*4] = (unsigned long)verts + SIDES + i + 1; - } - longs[j+3+i*4] = (unsigned long)verts + SIDES + i; - } - j += 4*SIDES; + j += 3*SIDES; + ushorts[j] = 0; j++; // lines + ushorts[j] = LC_COL_EDGES; j++; // color + ushorts[j] = 0; j++; // quads + ushorts[j] = 0; j++; // tris + ushorts[j] = 4*SIDES; j++; - // inside - for (i = 0; i < SIDES; i++) - { - longs[j+i*4] = (unsigned long)(verts + 3*SIDES + i); - if (i == SIDES-1) - { - longs[j+1+i*4] = (unsigned long)verts + 3*SIDES; - longs[j+2+i*4] = (unsigned long)verts + 2*SIDES; - } - else - { - longs[j+1+i*4] = (unsigned long)verts + 3*SIDES + i + 1; - longs[j+2+i*4] = (unsigned long)verts + 2*SIDES + i + 1; - } - longs[j+3+i*4] = (unsigned long)verts + 2*SIDES + i; - } - j += 4*SIDES; + for (i = 0; i < SIDES; i++) + { + ushorts[j+i*4] = (unsigned short)verts + i; + if (i == SIDES-1) + ushorts[1+j+i*4] = (unsigned short)verts; + else + ushorts[1+j+i*4] = (unsigned short)verts + i + 1; + + ushorts[2+j+i*4] = ushorts[j+i*4] + SIDES; + ushorts[3+j+i*4] = ushorts[1+j+i*4] + SIDES; + } + } - // ring - for (i = 0; i < SIDES; i++) - { - longs[j+i*4] = (unsigned long)(verts + 3*SIDES + i); - if (i == SIDES-1) - { - longs[j+1+i*4] = (unsigned long)verts + 3*SIDES; - longs[j+2+i*4] = (unsigned long)verts; - } - else - { - longs[j+1+i*4] = (unsigned long)verts + 3*SIDES + i + 1; - longs[j+2+i*4] = (unsigned long)verts + i + 1; - } - longs[j+3+i*4] = (unsigned long)verts + i; - } - j += 4*SIDES; + verts += 2*SIDES+1; + bytes += 2*sizeof(unsigned char) + 12*sizeof(float); + } break; - longs[j] = 0; j++; // tris - longs[j] = 0; j++; // lines - longs[j] = LC_COL_EDGES; j++; // color - longs[j] = 0; j++; // quads - longs[j] = 0; j++; // tris - longs[j] = 8*SIDES; j++; + case LC_STUD4: + { + int size; + Matrix mat((float*)(bytes+2)); + unsigned short color = ConvertColor(*(bytes+1)); + + // Create the vertexes + for (i = 0; i < SIDES; i++) + { + // outside + m_fVertexArray[(verts+i+SIDES)*3] = + m_fVertexArray[(verts+i)*3] = + LC_KNOB_RADIUS * costbl[i]; + m_fVertexArray[(verts+i+SIDES)*3+1] = + m_fVertexArray[(verts+i)*3+1] = + LC_KNOB_RADIUS * sintbl[i]; + m_fVertexArray[(verts+i)*3+2] = LC_STUD_HEIGHT; + m_fVertexArray[(verts+i+SIDES)*3+2] = 0; + + // inside + m_fVertexArray[(verts+i+2*SIDES)*3] = + m_fVertexArray[(verts+i+3*SIDES)*3] = + LC_STUD_RADIUS * costbl[i]; + m_fVertexArray[(verts+i+2*SIDES)*3+1] = + m_fVertexArray[(verts+i+3*SIDES)*3+1] = + LC_STUD_RADIUS * sintbl[i]; + m_fVertexArray[(verts+i+3*SIDES)*3+2] = LC_STUD_HEIGHT; + m_fVertexArray[(verts+i+2*SIDES)*3+2] = 0; + } + + mat.TransformPoints(&m_fVertexArray[verts*3], 4*SIDES); + // colors + 2*num_prim + sides*prims + size = 9+SIDES*20; + + if (m_nFlags & LC_PIECE_LONGDATA) + { + pGroup->drawinfo = malloc(sizeof(unsigned long)*size); + longs = (unsigned long*)pGroup->drawinfo; + + longs[0] = 2; // colors + longs[1] = color; + longs[2] = SIDES*12; + j = 3; + + // outside + for (i = 0; i < SIDES; i++) + { + longs[j+i*4] = (unsigned long)(verts + i); + if (i == SIDES-1) + { + longs[j+1+i*4] = (unsigned long)verts; + longs[j+2+i*4] = (unsigned long)verts + SIDES; + } + else + { + longs[j+1+i*4] = (unsigned long)verts + i + 1; + longs[j+2+i*4] = (unsigned long)verts + SIDES + i + 1; + } + longs[j+3+i*4] = (unsigned long)verts + SIDES + i; + } + j += 4*SIDES; - // outside - for (i = 0; i < SIDES; i++) - { - longs[j+i*4] = (unsigned long)verts + i; - if (i == SIDES-1) - longs[1+j+i*4] = (unsigned long)verts; - else - longs[1+j+i*4] = (unsigned long)verts + i + 1; - - longs[2+j+i*4] = longs[j+i*4] + SIDES; - longs[3+j+i*4] = longs[1+j+i*4] + SIDES; - } - j += 4*SIDES; + // inside + for (i = 0; i < SIDES; i++) + { + longs[j+i*4] = (unsigned long)(verts + 3*SIDES + i); + if (i == SIDES-1) + { + longs[j+1+i*4] = (unsigned long)verts + 3*SIDES; + longs[j+2+i*4] = (unsigned long)verts + 2*SIDES; + } + else + { + longs[j+1+i*4] = (unsigned long)verts + 3*SIDES + i + 1; + longs[j+2+i*4] = (unsigned long)verts + 2*SIDES + i + 1; + } + longs[j+3+i*4] = (unsigned long)verts + 2*SIDES + i; + } + j += 4*SIDES; - // inside - for (i = 0; i < SIDES; i++) - { - longs[j+i*4] = (unsigned long)verts + 2*SIDES + i; - if (i == SIDES-1) - longs[1+j+i*4] = (unsigned long)verts + 2*SIDES; - else - longs[1+j+i*4] = (unsigned long)verts + 2*SIDES + i + 1; - - longs[2+j+i*4] = longs[j+i*4] + SIDES; - longs[3+j+i*4] = longs[1+j+i*4] + SIDES; - } - } - else - { - pGroup->drawinfo = malloc(sizeof(unsigned short)*size); - ushorts = (unsigned short*)pGroup->drawinfo; + // ring + for (i = 0; i < SIDES; i++) + { + longs[j+i*4] = (unsigned long)(verts + 3*SIDES + i); + if (i == SIDES-1) + { + longs[j+1+i*4] = (unsigned long)verts + 3*SIDES; + longs[j+2+i*4] = (unsigned long)verts; + } + else + { + longs[j+1+i*4] = (unsigned long)verts + 3*SIDES + i + 1; + longs[j+2+i*4] = (unsigned long)verts + i + 1; + } + longs[j+3+i*4] = (unsigned long)verts + i; + } + j += 4*SIDES; - ushorts[0] = 2; // colors - ushorts[1] = color; - ushorts[2] = SIDES*12; - j = 3; + longs[j] = 0; j++; // tris + longs[j] = 0; j++; // lines + longs[j] = LC_COL_EDGES; j++; // color + longs[j] = 0; j++; // quads + longs[j] = 0; j++; // tris + longs[j] = 8*SIDES; j++; - // outside - for (i = 0; i < SIDES; i++) - { - ushorts[j+i*4] = (unsigned short)(verts + i); - if (i == SIDES-1) - { - ushorts[j+1+i*4] = (unsigned short)verts; - ushorts[j+2+i*4] = (unsigned short)verts + SIDES; - } - else - { - ushorts[j+1+i*4] = (unsigned short)verts + i + 1; - ushorts[j+2+i*4] = (unsigned short)verts + SIDES + i + 1; - } - ushorts[j+3+i*4] = (unsigned short)verts + SIDES + i; - } - j += 4*SIDES; + // outside + for (i = 0; i < SIDES; i++) + { + longs[j+i*4] = (unsigned long)verts + i; + if (i == SIDES-1) + longs[1+j+i*4] = (unsigned long)verts; + else + longs[1+j+i*4] = (unsigned long)verts + i + 1; + + longs[2+j+i*4] = longs[j+i*4] + SIDES; + longs[3+j+i*4] = longs[1+j+i*4] + SIDES; + } + j += 4*SIDES; - // inside - for (i = 0; i < SIDES; i++) - { - ushorts[j+i*4] = (unsigned short)(verts + 2*SIDES + i); - if (i == SIDES-1) - { - ushorts[j+1+i*4] = (unsigned short)verts + 2*SIDES; - ushorts[j+2+i*4] = (unsigned short)verts + 3*SIDES; - } - else - { - ushorts[j+1+i*4] = (unsigned short)verts + 2*SIDES + i + 1; - ushorts[j+2+i*4] = (unsigned short)verts + 3*SIDES + i + 1; - } - ushorts[j+3+i*4] = (unsigned short)verts + 3*SIDES + i; - } - j += 4*SIDES; + // inside + for (i = 0; i < SIDES; i++) + { + longs[j+i*4] = (unsigned long)verts + 2*SIDES + i; + if (i == SIDES-1) + longs[1+j+i*4] = (unsigned long)verts + 2*SIDES; + else + longs[1+j+i*4] = (unsigned long)verts + 2*SIDES + i + 1; + + longs[2+j+i*4] = longs[j+i*4] + SIDES; + longs[3+j+i*4] = longs[1+j+i*4] + SIDES; + } + } + else + { + pGroup->drawinfo = malloc(sizeof(unsigned short)*size); + ushorts = (unsigned short*)pGroup->drawinfo; + + ushorts[0] = 2; // colors + ushorts[1] = color; + ushorts[2] = SIDES*12; + j = 3; + + // outside + for (i = 0; i < SIDES; i++) + { + ushorts[j+i*4] = (unsigned short)(verts + i); + if (i == SIDES-1) + { + ushorts[j+1+i*4] = (unsigned short)verts; + ushorts[j+2+i*4] = (unsigned short)verts + SIDES; + } + else + { + ushorts[j+1+i*4] = (unsigned short)verts + i + 1; + ushorts[j+2+i*4] = (unsigned short)verts + SIDES + i + 1; + } + ushorts[j+3+i*4] = (unsigned short)verts + SIDES + i; + } + j += 4*SIDES; - // ring - for (i = 0; i < SIDES; i++) - { - ushorts[j+i*4] = (unsigned short)(verts + 3*SIDES + i); - if (i == SIDES-1) - { - ushorts[j+1+i*4] = (unsigned short)verts + 3*SIDES; - ushorts[j+2+i*4] = (unsigned short)verts; - } - else - { - ushorts[j+1+i*4] = (unsigned short)verts + 3*SIDES + i + 1; - ushorts[j+2+i*4] = (unsigned short)verts + i + 1; - } - ushorts[j+3+i*4] = (unsigned short)verts + i; - } - j += 4*SIDES; + // inside + for (i = 0; i < SIDES; i++) + { + ushorts[j+i*4] = (unsigned short)(verts + 2*SIDES + i); + if (i == SIDES-1) + { + ushorts[j+1+i*4] = (unsigned short)verts + 2*SIDES; + ushorts[j+2+i*4] = (unsigned short)verts + 3*SIDES; + } + else + { + ushorts[j+1+i*4] = (unsigned short)verts + 2*SIDES + i + 1; + ushorts[j+2+i*4] = (unsigned short)verts + 3*SIDES + i + 1; + } + ushorts[j+3+i*4] = (unsigned short)verts + 3*SIDES + i; + } + j += 4*SIDES; - ushorts[j] = 0; j++; // tris - ushorts[j] = 0; j++; // lines - ushorts[j] = LC_COL_EDGES; j++; // color - ushorts[j] = 0; j++; // quads - ushorts[j] = 0; j++; // tris - ushorts[j] = 8*SIDES; j++; + // ring + for (i = 0; i < SIDES; i++) + { + ushorts[j+i*4] = (unsigned short)(verts + 3*SIDES + i); + if (i == SIDES-1) + { + ushorts[j+1+i*4] = (unsigned short)verts + 3*SIDES; + ushorts[j+2+i*4] = (unsigned short)verts; + } + else + { + ushorts[j+1+i*4] = (unsigned short)verts + 3*SIDES + i + 1; + ushorts[j+2+i*4] = (unsigned short)verts + i + 1; + } + ushorts[j+3+i*4] = (unsigned short)verts + i; + } + j += 4*SIDES; - // outside - for (i = 0; i < SIDES; i++) - { - ushorts[j+i*4] = (unsigned short)verts + i; - if (i == SIDES-1) - ushorts[1+j+i*4] = (unsigned short)verts; - else - ushorts[1+j+i*4] = (unsigned short)verts + i + 1; - - ushorts[2+j+i*4] = ushorts[j+i*4] + SIDES; - ushorts[3+j+i*4] = ushorts[1+j+i*4] + SIDES; - } - j += 4*SIDES; + ushorts[j] = 0; j++; // tris + ushorts[j] = 0; j++; // lines + ushorts[j] = LC_COL_EDGES; j++; // color + ushorts[j] = 0; j++; // quads + ushorts[j] = 0; j++; // tris + ushorts[j] = 8*SIDES; j++; - // inside - for (i = 0; i < SIDES; i++) - { - ushorts[j+i*4] = (unsigned short)verts + 2*SIDES + i; - if (i == SIDES-1) - ushorts[1+j+i*4] = (unsigned short)verts + 2*SIDES; - else - ushorts[1+j+i*4] = (unsigned short)verts + 2*SIDES + i + 1; - - ushorts[2+j+i*4] = ushorts[j+i*4] + SIDES; - ushorts[3+j+i*4] = ushorts[1+j+i*4] + SIDES; - } - } + // outside + for (i = 0; i < SIDES; i++) + { + ushorts[j+i*4] = (unsigned short)verts + i; + if (i == SIDES-1) + ushorts[1+j+i*4] = (unsigned short)verts; + else + ushorts[1+j+i*4] = (unsigned short)verts + i + 1; + + ushorts[2+j+i*4] = ushorts[j+i*4] + SIDES; + ushorts[3+j+i*4] = ushorts[1+j+i*4] + SIDES; + } + j += 4*SIDES; - verts += 4*SIDES; - bytes += 2*sizeof(unsigned char) + 12*sizeof(float); - } break; - } - bytes++; // should be 0 + // inside + for (i = 0; i < SIDES; i++) + { + ushorts[j+i*4] = (unsigned short)verts + 2*SIDES + i; + if (i == SIDES-1) + ushorts[1+j+i*4] = (unsigned short)verts + 2*SIDES; + else + ushorts[1+j+i*4] = (unsigned short)verts + 2*SIDES + i + 1; + + ushorts[2+j+i*4] = ushorts[j+i*4] + SIDES; + ushorts[3+j+i*4] = ushorts[1+j+i*4] + SIDES; } + } + + verts += 4*SIDES; + bytes += 2*sizeof(unsigned char) + 12*sizeof(float); + } break; + } + bytes++; // should be 0 + } - free(buf); + free(buf); /* // Now create the information for the CD @@ -1500,7 +1540,7 @@ void PieceInfo::ZoomExtents() up.Cross (right, front); up.Normalize (); - mat[0] = right.X (); mat[4] = right.Y (); mat[8] = right.Z (); mat[12] = 0.0; + mat[0] = -right.X (); mat[4] = -right.Y (); mat[8] = -right.Z (); mat[12] = 0.0; mat[1] = up.X (); mat[5] = up.Y (); mat[9] = up.Z (); mat[13] = 0.0; mat[2] = front.X (); mat[6] = front.Y (); mat[10] = front.Z (); mat[14] = 0.0; mat[3] = 0.0; mat[7] = 0.0; mat[11] = 0.0; mat[15] = 1.0; -- cgit v1.2.3