summaryrefslogtreecommitdiff
path: root/common/pieceinf.cpp
diff options
context:
space:
mode:
authorleo2000-09-19 01:03:23 +0000
committerleo2000-09-19 01:03:23 +0000
commitd9b3d5ba1085063aacec5abe232aefae6b1ca1c0 (patch)
tree94301fad1ffb69cb9aa4d886898d01c6ac8f28b7 /common/pieceinf.cpp
parent1b3c74b742ea7a2bf5886597a983c9ddc62069e1 (diff)
Fixed endianess bugs
git-svn-id: http://svn.leocad.org/trunk@124 c7d43263-9d01-0410-8a33-9dba5d9f93d6
Diffstat (limited to 'common/pieceinf.cpp')
-rw-r--r--common/pieceinf.cpp2094
1 files 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;