From 79ccca42964405aea4f0f7268979fa7ed3776f13 Mon Sep 17 00:00:00 2001 From: leo Date: Sat, 14 Apr 2012 02:20:27 +0000 Subject: [PATCH] Updated functions to use the new mesh class. --- common/lc_mesh.cpp | 214 +++++++++++++++++++++++++++++++ common/lc_mesh.h | 24 ++-- common/pieceinf.cpp | 300 +++++--------------------------------------- common/pieceinf.h | 20 --- common/project.cpp | 168 ++++++------------------- win/Tools.cpp | 5 +- 6 files changed, 297 insertions(+), 434 deletions(-) diff --git a/common/lc_mesh.cpp b/common/lc_mesh.cpp index 04fd5e63..95f5b660 100644 --- a/common/lc_mesh.cpp +++ b/common/lc_mesh.cpp @@ -1,6 +1,8 @@ #include "lc_global.h" #include "lc_mesh.h" #include "lc_colors.h" +#include "lc_file.h" +#include "globals.h" struct lcVertex { @@ -37,6 +39,109 @@ void lcMesh::Create(int NumSections, int NumVertices, int NumIndices) } } +void lcMesh::CreateBox() +{ + Create(2, 8, 36 + 24); + + Vector3 Min(-0.4f, -0.4f, -0.96f); + Vector3 Max(0.4f, 0.4f, 0.16f); + + float* Verts = (float*)mVertexBuffer.mData; + lcuint16* Indices = (lcuint16*)mIndexBuffer.mData; + + *Verts++ = Min[0]; *Verts++ = Min[1]; *Verts++ = Min[2]; + *Verts++ = Min[0]; *Verts++ = Max[1]; *Verts++ = Min[2]; + *Verts++ = Max[0]; *Verts++ = Max[1]; *Verts++ = Min[2]; + *Verts++ = Max[0]; *Verts++ = Min[1]; *Verts++ = Min[2]; + *Verts++ = Min[0]; *Verts++ = Min[1]; *Verts++ = Max[2]; + *Verts++ = Min[0]; *Verts++ = Max[1]; *Verts++ = Max[2]; + *Verts++ = Max[0]; *Verts++ = Max[1]; *Verts++ = Max[2]; + *Verts++ = Max[0]; *Verts++ = Min[1]; *Verts++ = Max[2]; + + lcMeshSection* Section = &mSections[0]; + Section->ColorIndex = gDefaultColor; + Section->IndexOffset = 0; + Section->NumIndices = 36; + Section->PrimitiveType = GL_TRIANGLES; + + *Indices++ = 0; + *Indices++ = 1; + *Indices++ = 2; + *Indices++ = 0; + *Indices++ = 2; + *Indices++ = 3; + + *Indices++ = 7; + *Indices++ = 6; + *Indices++ = 5; + *Indices++ = 7; + *Indices++ = 5; + *Indices++ = 4; + + *Indices++ = 0; + *Indices++ = 1; + *Indices++ = 5; + *Indices++ = 0; + *Indices++ = 5; + *Indices++ = 4; + + *Indices++ = 2; + *Indices++ = 3; + *Indices++ = 7; + *Indices++ = 2; + *Indices++ = 7; + *Indices++ = 6; + + *Indices++ = 0; + *Indices++ = 3; + *Indices++ = 7; + *Indices++ = 0; + *Indices++ = 7; + *Indices++ = 4; + + *Indices++ = 1; + *Indices++ = 2; + *Indices++ = 6; + *Indices++ = 1; + *Indices++ = 6; + *Indices++ = 5; + + Section = &mSections[1]; + Section->ColorIndex = gEdgeColor; + Section->IndexOffset = 36 * 2; + Section->NumIndices = 24; + Section->PrimitiveType = GL_LINES; + + *Indices++ = 0; + *Indices++ = 1; + *Indices++ = 1; + *Indices++ = 2; + *Indices++ = 2; + *Indices++ = 3; + *Indices++ = 3; + *Indices++ = 0; + + *Indices++ = 4; + *Indices++ = 5; + *Indices++ = 5; + *Indices++ = 6; + *Indices++ = 6; + *Indices++ = 7; + *Indices++ = 7; + *Indices++ = 4; + + *Indices++ = 0; + *Indices++ = 4; + *Indices++ = 1; + *Indices++ = 5; + *Indices++ = 2; + *Indices++ = 6; + *Indices++ = 3; + *Indices++ = 7; + + UpdateBuffers(); +} + void lcMesh::Render(int DefaultColorIdx, bool Selected, bool Focused) { char* ElementsOffset; @@ -144,6 +249,14 @@ bool lcMesh::MinIntersectDist(const Vector3& Start, const Vector3& End, float& M return Hit; } +bool lcMesh::MinIntersectDist(const Vector3& Start, const Vector3& End, float& MinDist, Vector3& Intersection) +{ + if (mIndexType == GL_UNSIGNED_SHORT) + return MinIntersectDist(Start, End, MinDist, Intersection); + else + return MinIntersectDist(Start, End, MinDist, Intersection); +} + // Return true if a polygon intersects a set of planes. static bool PolygonIntersectsPlanes(float* p1, float* p2, float* p3, float* p4, const Vector4* Planes, int NumPlanes) // TODO: move to lc_math { @@ -231,3 +344,104 @@ bool lcMesh::IntersectsPlanes(const Vector4* Planes, int NumPlanes) return false; } + +bool lcMesh::IntersectsPlanes(const Vector4* Planes, int NumPlanes) +{ + if (mIndexType == GL_UNSIGNED_SHORT) + return IntersectsPlanes(Planes, NumPlanes); + else + return IntersectsPlanes(Planes, NumPlanes); +} + +template +void lcMesh::ExportPOVRay(lcFile& File, const char* MeshName, char ColorTable[LC_MAXCOLORS][64]) +{ + char Line[1024]; + + sprintf(Line, "#declare lc_%s = union {\n", MeshName); + File.WriteLine(Line); + + float* Verts = (float*)mVertexBuffer.mData; + + for (int SectionIdx = 0; SectionIdx < mNumSections; SectionIdx++) + { + lcMeshSection* Section = &mSections[SectionIdx]; + + if (Section->PrimitiveType != GL_TRIANGLES) + continue; + + IndexType* Indices = (IndexType*)mIndexBuffer.mData + Section->IndexOffset / sizeof(IndexType); + + File.WriteLine(" mesh {\n"); + + for (int Idx = 0; Idx < Section->NumIndices; Idx += 3) + { + sprintf(Line, " triangle { <%.2f, %.2f, %.2f>, <%.2f, %.2f, %.2f>, <%.2f, %.2f, %.2f> }\n", + -Verts[Indices[Idx+0]*3+1], -Verts[Indices[Idx+0]*3], Verts[Indices[Idx+0]*3+2], + -Verts[Indices[Idx+1]*3+1], -Verts[Indices[Idx+1]*3], Verts[Indices[Idx+1]*3+2], + -Verts[Indices[Idx+2]*3+1], -Verts[Indices[Idx+2]*3], Verts[Indices[Idx+2]*3+2]); + File.WriteLine(Line); + } + + if (Section->ColorIndex != gDefaultColor) + { + sprintf(Line, "material { texture { %s normal { bumps 0.1 scale 2 } } }", ColorTable[Section->ColorIndex]); + File.WriteLine(Line); + } + + File.WriteLine(" }\n"); + } +} + +void lcMesh::ExportPOVRay(lcFile& File, const char* MeshName, char ColorTable[LC_MAXCOLORS][64]) +{ + if (mIndexType == GL_UNSIGNED_SHORT) + ExportPOVRay(File, MeshName, ColorTable); + else + ExportPOVRay(File, MeshName, ColorTable); +} + +template +void lcMesh::ExportWavefrontIndices(lcFile& File, int DefaultColorIndex, int VertexOffset) +{ + char Line[1024]; + + float* Verts = (float*)mVertexBuffer.mData; + + for (int SectionIdx = 0; SectionIdx < mNumSections; SectionIdx++) + { + lcMeshSection* Section = &mSections[SectionIdx]; + + if (Section->PrimitiveType != GL_TRIANGLES) + continue; + + IndexType* Indices = (IndexType*)mIndexBuffer.mData + Section->IndexOffset / sizeof(IndexType); + + if (Section->ColorIndex == gDefaultColor) + sprintf(Line, "usemtl %s\n", altcolornames[DefaultColorIndex]); + else + sprintf(Line, "usemtl %s\n", altcolornames[Section->ColorIndex]); + File.WriteLine(Line); + + for (int Idx = 0; Idx < Section->NumIndices; Idx += 3) + { + long int idx1 = Indices[Idx + 0] + VertexOffset; + long int idx2 = Indices[Idx + 1] + VertexOffset; + long int idx3 = Indices[Idx + 2] + VertexOffset; + + if (idx1 != idx2 && idx1 != idx3 && idx2 != idx3) + sprintf(Line, "f %ld %ld %ld\n", idx1, idx2, idx3); + File.WriteLine(Line); + } + } + + File.WriteLine("\n"); +} + +void lcMesh::ExportWavefrontIndices(lcFile& File, int DefaultColorIndex, int VertexOffset) +{ + if (mIndexType == GL_UNSIGNED_SHORT) + ExportWavefrontIndices(File, DefaultColorIndex, VertexOffset); + else + ExportWavefrontIndices(File, DefaultColorIndex, VertexOffset); +} diff --git a/common/lc_mesh.h b/common/lc_mesh.h index 51729022..30549bca 100644 --- a/common/lc_mesh.h +++ b/common/lc_mesh.h @@ -112,28 +112,24 @@ public: ~lcMesh(); void Create(int NumSections, int NumVertices, int NumIndices); + void CreateBox(); void Render(int ColorIdx, bool Selected, bool Focused); - bool MinIntersectDist(const Vector3& Start, const Vector3& End, float& MinDist, Vector3& Intersection) - { - if (mIndexType == GL_UNSIGNED_SHORT) - return MinIntersectDist(Start, End, MinDist, Intersection); - else - return MinIntersectDist(Start, End, MinDist, Intersection); - } + template + void ExportPOVRay(lcFile& File, const char* MeshName, char ColorTable[LC_MAXCOLORS][64]); + void ExportPOVRay(lcFile& File, const char* MeshName, char ColorTable[LC_MAXCOLORS][64]); - bool IntersectsPlanes(const Vector4* Planes, int NumPlanes) - { - if (mIndexType == GL_UNSIGNED_SHORT) - return IntersectsPlanes(Planes, NumPlanes); - else - return IntersectsPlanes(Planes, NumPlanes); - } + template + void ExportWavefrontIndices(lcFile& File, int DefaultColorIndex, int VertexOffset); + void ExportWavefrontIndices(lcFile& File, int DefaultColorIndex, int VertexOffset); template bool MinIntersectDist(const Vector3& Start, const Vector3& End, float& MinDist, Vector3& Intersection); + bool MinIntersectDist(const Vector3& Start, const Vector3& End, float& MinDist, Vector3& Intersection); + template bool IntersectsPlanes(const Vector4* Planes, int NumPlanes); + bool IntersectsPlanes(const Vector4* Planes, int NumPlanes); void UpdateBuffers() { diff --git a/common/pieceinf.cpp b/common/pieceinf.cpp index de0f8d98..f1670134 100644 --- a/common/pieceinf.cpp +++ b/common/pieceinf.cpp @@ -211,7 +211,6 @@ void PieceInfo::LoadIndex(lcFile& file) // TODO: don't change ref. if we're reloading ? m_nRef = 0; m_nVertexCount = 0; - m_fVertexArray = NULL; m_nGroupCount = 0; m_pGroups = NULL; m_nBoxList = 0; @@ -244,7 +243,6 @@ void PieceInfo::CreatePlaceholder(const char* Name) { m_nRef = 0; m_nVertexCount = 0; - m_fVertexArray = NULL; m_nGroupCount = 0; m_pGroups = NULL; m_nBoxList = 0; @@ -639,20 +637,11 @@ void PieceInfo::BuildMesh(void* Data, int* SectionIndices) lcuint16 ConnectionCount = LCUINT16(*((lcuint16*)bytes)); bytes += 2 + (1 + 6 * 2) * ConnectionCount; bytes++; // TextureCount - bytes += sizeof(lcuint16); // m_nGroupCount + bytes += sizeof(lcuint16); // GroupCount - for (DRAWGROUP* pGroup = m_pGroups; sh--; pGroup++) + while (sh--) { - lcuint8 bt = *bytes; - bytes++; - - pGroup->connections[bt] = 0xFFFF; - - while (bt--) - { - pGroup->connections[bt] = LCUINT16(*((lcuint16*)bytes)); - bytes += sizeof(lcuint16); - } + bytes += 1 + 2 * *bytes; switch (*bytes) { @@ -714,144 +703,39 @@ void PieceInfo::LoadInformation() { if (m_nFlags & LC_PIECE_PLACEHOLDER) { - m_nGroupCount = 1; - m_pGroups = (DRAWGROUP*)malloc(sizeof(DRAWGROUP)*m_nGroupCount); - memset(m_pGroups, 0, sizeof(DRAWGROUP)*m_nGroupCount); - - int verts = 8; - m_fVertexArray = (float*)malloc(3*sizeof(float)*verts); - m_nVertexCount = verts; - - Vector3 Min(-0.4f, -0.4f, -0.96f); - Vector3 Max(0.4f, 0.4f, 0.16f); - - m_fVertexArray[0*3+0] = Min[0]; m_fVertexArray[0*3+1] = Min[1]; m_fVertexArray[0*3+2] = Min[2]; - m_fVertexArray[1*3+0] = Min[0]; m_fVertexArray[1*3+1] = Max[1]; m_fVertexArray[1*3+2] = Min[2]; - m_fVertexArray[2*3+0] = Max[0]; m_fVertexArray[2*3+1] = Max[1]; m_fVertexArray[2*3+2] = Min[2]; - m_fVertexArray[3*3+0] = Max[0]; m_fVertexArray[3*3+1] = Min[1]; m_fVertexArray[3*3+2] = Min[2]; - m_fVertexArray[4*3+0] = Min[0]; m_fVertexArray[4*3+1] = Min[1]; m_fVertexArray[4*3+2] = Max[2]; - m_fVertexArray[5*3+0] = Min[0]; m_fVertexArray[5*3+1] = Max[1]; m_fVertexArray[5*3+2] = Max[2]; - m_fVertexArray[6*3+0] = Max[0]; m_fVertexArray[6*3+1] = Max[1]; m_fVertexArray[6*3+2] = Max[2]; - m_fVertexArray[7*3+0] = Max[0]; m_fVertexArray[7*3+1] = Min[1]; m_fVertexArray[7*3+2] = Max[2]; - - m_pGroups->connections[0] = 0xFFFF; - - m_pGroups->drawinfo = malloc((1 + 1 + 3 + 36 + 1 + 3 + 24) * 2); - lcuint16* drawinfo = (lcuint16*)m_pGroups->drawinfo; - - *drawinfo++ = 2; - *drawinfo++ = LC_COL_DEFAULT; - *drawinfo++ = 0; - *drawinfo++ = 36; - - *drawinfo++ = 0; - *drawinfo++ = 1; - *drawinfo++ = 2; - *drawinfo++ = 0; - *drawinfo++ = 2; - *drawinfo++ = 3; - - *drawinfo++ = 7; - *drawinfo++ = 6; - *drawinfo++ = 5; - *drawinfo++ = 7; - *drawinfo++ = 5; - *drawinfo++ = 4; - - *drawinfo++ = 0; - *drawinfo++ = 1; - *drawinfo++ = 5; - *drawinfo++ = 0; - *drawinfo++ = 5; - *drawinfo++ = 4; - - *drawinfo++ = 2; - *drawinfo++ = 3; - *drawinfo++ = 7; - *drawinfo++ = 2; - *drawinfo++ = 7; - *drawinfo++ = 6; - - *drawinfo++ = 0; - *drawinfo++ = 3; - *drawinfo++ = 7; - *drawinfo++ = 0; - *drawinfo++ = 7; - *drawinfo++ = 4; - - *drawinfo++ = 1; - *drawinfo++ = 2; - *drawinfo++ = 6; - *drawinfo++ = 1; - *drawinfo++ = 6; - *drawinfo++ = 5; - - *drawinfo++ = 0; - *drawinfo++ = LC_COL_EDGES; - *drawinfo++ = 0; - *drawinfo++ = 0; - *drawinfo++ = 24; - - *drawinfo++ = 0; - *drawinfo++ = 1; - *drawinfo++ = 1; - *drawinfo++ = 2; - *drawinfo++ = 2; - *drawinfo++ = 3; - *drawinfo++ = 3; - *drawinfo++ = 0; - - *drawinfo++ = 4; - *drawinfo++ = 5; - *drawinfo++ = 5; - *drawinfo++ = 6; - *drawinfo++ = 6; - *drawinfo++ = 7; - *drawinfo++ = 7; - *drawinfo++ = 4; - - *drawinfo++ = 0; - *drawinfo++ = 4; - *drawinfo++ = 1; - *drawinfo++ = 5; - *drawinfo++ = 2; - *drawinfo++ = 6; - *drawinfo++ = 3; - *drawinfo++ = 7; - + mMesh->CreateBox(); return; } - lcDiskFile bin; - char filename[LC_MAXPATH]; - void* buf; - lcuint32 verts, *longs, fixverts; - lcuint16 sh; - lcuint8 *bytes, *tmp, bt; - float scale, shift; - lcint16* shorts; + lcDiskFile bin; + char filename[LC_MAXPATH]; + void* buf; + lcuint32 verts, *longs, fixverts; + lcuint16 sh; + lcuint8 *bytes, *tmp, bt; + float scale, shift; + lcint16* shorts; - // We don't want memory leaks. - FreeInformation (); + FreeInformation(); - // Open pieces.bin and buffer the information we need. - strcpy (filename, lcGetPiecesLibrary()->GetLibraryPath()); - strcat (filename, "pieces.bin"); - if (!bin.Open (filename, "rb")) - return; + // Open pieces.bin and buffer the information we need. + strcpy (filename, lcGetPiecesLibrary()->GetLibraryPath()); + strcat (filename, "pieces.bin"); + if (!bin.Open (filename, "rb")) + return; - buf = malloc(m_nSize); - bin.Seek(m_nOffset, SEEK_SET); - bin.ReadBuffer(buf, m_nSize); + buf = malloc(m_nSize); + bin.Seek(m_nOffset, SEEK_SET); + bin.ReadBuffer(buf, m_nSize); - 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 = (lcuint32*)buf; - fixverts = verts = LCUINT32(*longs); - bytes = (unsigned char*)(longs + 1); - bytes += verts * sizeof(lcint16) * 3; + 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 = (lcuint32*)buf; + fixverts = verts = LCUINT32(*longs); + bytes = (unsigned char*)(longs + 1); + bytes += verts * sizeof(lcint16) * 3; lcuint16 ConnectionCount = LCUINT16(*((lcuint16*)bytes)); bytes += 2 + (1 + 6 * 2) * ConnectionCount; @@ -1013,7 +897,7 @@ void PieceInfo::LoadInformation() mMesh = new lcMesh(); mMesh->Create(NumSections, NumVertices, NumIndices); - m_nVertexCount = verts; + m_nVertexCount = NumVertices; float* OutVertex = (float*)mMesh->mVertexBuffer.mData; @@ -1058,9 +942,6 @@ void PieceInfo::FreeInformation() free(m_pGroups); m_pGroups = NULL; } - - if (m_nFlags & LC_PIECE_LONGDATA_INDICES) - m_nFlags &= ~LC_PIECE_LONGDATA_INDICES; } // Zoom extents for the preview window and print catalog @@ -1219,124 +1100,3 @@ void PieceInfo::RenderPiece(int nColor) { mMesh->Render(nColor, false, false); } - -void PieceInfo::WriteWavefront(FILE* file, unsigned char color, unsigned long* start) -{ - unsigned short group; - const char* colname; - - for (group = 0; group < m_nGroupCount; group++) - { - if (m_nFlags & LC_PIECE_LONGDATA_INDICES) - { - unsigned long* info = (unsigned long*)m_pGroups[group].drawinfo; - unsigned long count, colors = *info; - info++; - - while (colors--) - { - if (*info == LC_COL_DEFAULT) - colname = altcolornames[color]; - else - { - if (*info >= LC_MAXCOLORS) - { - info++; - info += *info + 1; - info += *info + 1; - info += *info + 1; - continue; - } - colname = altcolornames[*info]; - } - info++; - - // skip if color only has lines - if ((info[0] == 0) && (info[1] == 0)) - { - info += 2; - info += *info + 1; - continue; - } - - fprintf(file, "usemtl %s\n", colname); - - for (count = *info, info++; count; count -= 4) - { - fprintf(file, "f %ld %ld %ld %ld\n", info[0] + *start, info[1] + *start, info[2] + *start, info[3] + *start); - info += 4; - } - - for (count = *info, info++; count; count -= 3) - { - long int idx1 = info[0] + *start; - long int idx2 = info[1] + *start; - long int idx3 = info[2] + *start; - - if (idx1 != idx2 && idx1 != idx3 && idx2 != idx3) - fprintf(file, "f %ld %ld %ld\n", idx1, idx2, idx3); - - info += 3; - } - info += *info + 1; - } - } - else - { - unsigned short* info = (unsigned short*)m_pGroups[group].drawinfo; - unsigned short count, colors = *info; - info++; - - while (colors--) - { - if (*info == LC_COL_DEFAULT) - colname = altcolornames[color]; - else - { - if (*info >= LC_MAXCOLORS) - { - info++; - info += *info + 1; - info += *info + 1; - info += *info + 1; - continue; - } - colname = altcolornames[*info]; - } - info++; - - // skip if color only has lines - if ((info[0] == 0) && (info[1] == 0)) - { - info += 2; - info += *info + 1; - continue; - } - - fprintf(file, "usemtl %s\n", colname); - - for (count = *info, info++; count; count -= 4) - { - fprintf(file, "f %ld %ld %ld %ld\n", info[0] + *start, info[1] + *start, info[2] + *start, info[3] + *start); - info += 4; - } - - for (count = *info, info++; count; count -= 3) - { - long int idx1 = info[0] + *start; - long int idx2 = info[1] + *start; - long int idx3 = info[2] + *start; - - if (idx1 != idx2 && idx1 != idx3 && idx2 != idx3) - fprintf(file, "f %ld %ld %ld\n", idx1, idx2, idx3); - - info += 3; - } - info += *info + 1; - } - } - } - - *start += m_nVertexCount; - fputs("\n", file); -} diff --git a/common/pieceinf.h b/common/pieceinf.h index 6cc42de6..71c1282e 100644 --- a/common/pieceinf.h +++ b/common/pieceinf.h @@ -17,29 +17,11 @@ #define LC_PIECE_NAME_LEN 256 -class Texture; - -struct CONNECTIONINFO -{ - unsigned char type; - float center[3]; - float normal[3]; -}; - struct DRAWGROUP { - unsigned short connections[6]; void* drawinfo; }; -struct TEXTURE -{ - Texture* texture; - unsigned char color; - float vertex[4][3]; - float coords[4][2]; -}; - unsigned char ConvertColor(int c); class PieceInfo @@ -82,7 +64,6 @@ class PieceInfo void ZoomExtents(float Fov, float Aspect, float* EyePos = NULL) const; void RenderOnce(int nColor); void RenderPiece(int nColor); - void WriteWavefront(FILE* file, unsigned char color, unsigned long* start); // Implementation GLuint GetBoxDisplayList() @@ -112,7 +93,6 @@ public: // Nobody should change these unsigned char m_nFlags; unsigned long m_nVertexCount; - float* m_fVertexArray; unsigned short m_nGroupCount; DRAWGROUP* m_pGroups; diff --git a/common/project.cpp b/common/project.cpp index 0eb4b841..389a26ba 100644 --- a/common/project.cpp +++ b/common/project.cpp @@ -3,6 +3,7 @@ #include "lc_global.h" #include "lc_math.h" +#include "lc_mesh.h" #include #include #include @@ -3990,124 +3991,8 @@ void Project::HandleCommand(LC_COMMANDS id, unsigned long nParam) *Ptr = '_'; sprintf(PieceTable + Index * LC_PIECE_NAME_LEN, "lc_%s", Name); - sprintf(Line, "#declare lc_%s = union {\n", Name); - POVFile.WriteLine(Line); - for (lcuint16 g = 0; g < Info->m_nGroupCount; g++) - { - if (Info->m_nFlags & LC_PIECE_LONGDATA_INDICES) - { - lcuint32* info = (lcuint32*)Info->m_pGroups[g].drawinfo; - lcuint32 count, curcolor, colors = *info; - info++; - - while (colors--) - { - curcolor = *info; - info++; - - // Skip if color only has lines. - if ((*info == 0) && (info[1] == 0)) - { - info += 2; - info += *info + 1; - continue; - } - - POVFile.WriteLine(" mesh {\n"); - - for (count = *info, info++; count; count -= 4) - { - sprintf(Line, " triangle { <%.2f, %.2f, %.2f>, <%.2f, %.2f, %.2f>, <%.2f, %.2f, %.2f> }\n", - -Info->m_fVertexArray[info[0]*3+1], -Info->m_fVertexArray[info[0]*3], Info->m_fVertexArray[info[0]*3+2], - -Info->m_fVertexArray[info[1]*3+1], -Info->m_fVertexArray[info[1]*3], Info->m_fVertexArray[info[1]*3+2], - -Info->m_fVertexArray[info[2]*3+1], -Info->m_fVertexArray[info[2]*3], Info->m_fVertexArray[info[2]*3+2]); - POVFile.WriteLine(Line); - sprintf(Line, " triangle { <%.2f, %.2f, %.2f>, <%.2f, %.2f, %.2f>, <%.2f, %.2f, %.2f> }\n", - -Info->m_fVertexArray[info[2]*3+1], -Info->m_fVertexArray[info[2]*3], Info->m_fVertexArray[info[2]*3+2], - -Info->m_fVertexArray[info[3]*3+1], -Info->m_fVertexArray[info[3]*3], Info->m_fVertexArray[info[3]*3+2], - -Info->m_fVertexArray[info[0]*3+1], -Info->m_fVertexArray[info[0]*3], Info->m_fVertexArray[info[0]*3+2]); - POVFile.WriteLine(Line); - info += 4; - } - - for (count = *info, info++; count; count -= 3) - { - sprintf(Line, " triangle { <%.2f, %.2f, %.2f>, <%.2f, %.2f, %.2f>, <%.2f, %.2f, %.2f> }\n", - -Info->m_fVertexArray[info[0]*3+1], -Info->m_fVertexArray[info[0]*3], Info->m_fVertexArray[info[0]*3+2], - -Info->m_fVertexArray[info[1]*3+1], -Info->m_fVertexArray[info[1]*3], Info->m_fVertexArray[info[1]*3+2], - -Info->m_fVertexArray[info[2]*3+1], -Info->m_fVertexArray[info[2]*3], Info->m_fVertexArray[info[2]*3+2]); - POVFile.WriteLine(Line); - info += 3; - } - info += *info + 1; - - if (curcolor != LC_COL_DEFAULT && curcolor != LC_COL_EDGES) - { - sprintf(Line, "material { texture { %s normal { bumps 0.1 scale 2 } } }", ColorTable[curcolor]); - POVFile.WriteLine(Line); - } - - POVFile.WriteLine(" }\n"); - } - } - else - { - unsigned short* info = (unsigned short*)Info->m_pGroups[g].drawinfo; - unsigned short count, curcolor, colors = *info; - info++; - - while (colors--) - { - curcolor = *info; - info++; - - // Skip if color only has lines. - if ((*info == 0) && (info[1] == 0)) - { - info += 2; - info += *info + 1; - continue; - } - - POVFile.WriteLine(" mesh {\n"); - - for (count = *info, info++; count; count -= 4) - { - sprintf(Line, " triangle { <%.2f, %.2f, %.2f>, <%.2f, %.2f, %.2f>, <%.2f, %.2f, %.2f> }\n", - -Info->m_fVertexArray[info[0]*3+1], -Info->m_fVertexArray[info[0]*3], Info->m_fVertexArray[info[0]*3+2], - -Info->m_fVertexArray[info[1]*3+1], -Info->m_fVertexArray[info[1]*3], Info->m_fVertexArray[info[1]*3+2], - -Info->m_fVertexArray[info[2]*3+1], -Info->m_fVertexArray[info[2]*3], Info->m_fVertexArray[info[2]*3+2]); - POVFile.WriteLine(Line); - sprintf(Line, " triangle { <%.2f, %.2f, %.2f>, <%.2f, %.2f, %.2f>, <%.2f, %.2f, %.2f> }\n", - -Info->m_fVertexArray[info[2]*3+1], -Info->m_fVertexArray[info[2]*3], Info->m_fVertexArray[info[2]*3+2], - -Info->m_fVertexArray[info[3]*3+1], -Info->m_fVertexArray[info[3]*3], Info->m_fVertexArray[info[3]*3+2], - -Info->m_fVertexArray[info[0]*3+1], -Info->m_fVertexArray[info[0]*3], Info->m_fVertexArray[info[0]*3+2]); - POVFile.WriteLine(Line); - info += 4; - } - - for (count = *info, info++; count; count -= 3) - { - sprintf(Line, " triangle { <%.2f, %.2f, %.2f>, <%.2f, %.2f, %.2f>, <%.2f, %.2f, %.2f> }\n", - -Info->m_fVertexArray[info[0]*3+1], -Info->m_fVertexArray[info[0]*3], Info->m_fVertexArray[info[0]*3+2], - -Info->m_fVertexArray[info[1]*3+1], -Info->m_fVertexArray[info[1]*3], Info->m_fVertexArray[info[1]*3+2], - -Info->m_fVertexArray[info[2]*3+1], -Info->m_fVertexArray[info[2]*3], Info->m_fVertexArray[info[2]*3+2]); - POVFile.WriteLine(Line); - info += 3; - } - info += *info + 1; - - if (curcolor != LC_COL_DEFAULT && curcolor != LC_COL_EDGES) - { - sprintf(Line, "material { texture { %s normal { bumps 0.1 scale 2 } } }", ColorTable[curcolor]); - POVFile.WriteLine(Line); - } - - POVFile.WriteLine(" }\n"); - } - } - } + Info->mMesh->ExportPOVRay(POVFile, Name, ColorTable); POVFile.WriteLine("}\n\n"); @@ -4208,9 +4093,17 @@ void Project::HandleCommand(LC_COMMANDS id, unsigned long nParam) if (!SystemDoDialog(LC_DLG_WAVEFRONT, filename)) break; + lcDiskFile OBJFile; + char Line[1024]; + + if (!OBJFile.Open(filename, "wt")) + { + SystemDoMessageBox("Could not open file for writing.", LC_MB_OK|LC_MB_ICONERROR); + break; + } + char buf[LC_MAXPATH], *ptr; - FILE* stream = fopen(filename, "wt"); - unsigned long vert = 1, i; + lcuint32 vert = 1, i; Piece* pPiece; const char* OldLocale = setlocale(LC_NUMERIC, "C"); @@ -4226,11 +4119,20 @@ void Project::HandleCommand(LC_COMMANDS id, unsigned long nParam) else ptr = buf; } - fputs("# Model exported from LeoCAD\n", stream); + + OBJFile.WriteLine("# Model exported from LeoCAD\n"); + if (strlen(buf) != 0) - fprintf(stream,"# Original name: %s\n", ptr); + { + sprintf(Line, "# Original name: %s\n", ptr); + OBJFile.WriteLine(Line); + } + if (strlen(m_strAuthor)) - fprintf(stream, "# Author: %s\n", m_strAuthor); + { + sprintf(Line, "# Author: %s\n", m_strAuthor); + OBJFile.WriteLine(Line); + } strcpy(buf, filename); ptr = strrchr(buf, '.'); @@ -4250,7 +4152,8 @@ void Project::HandleCommand(LC_COMMANDS id, unsigned long nParam) ptr = buf; } - fprintf(stream, "#\n\nmtllib %s\n\n", ptr); + sprintf(Line, "#\n\nmtllib %s\n\n", ptr); + OBJFile.WriteLine(Line); FILE* mat = fopen(buf, "wt"); fputs("# Colors used by LeoCAD\n# You need to add transparency values\n#\n\n", mat); @@ -4265,28 +4168,35 @@ void Project::HandleCommand(LC_COMMANDS id, unsigned long nParam) pPiece->GetRotation(rot); Matrix mat(rot, pos); PieceInfo* pInfo = pPiece->GetPieceInfo(); + float* Verts = (float*)pInfo->mMesh->mVertexBuffer.mData; for (i = 0; i < pInfo->m_nVertexCount*3; i += 3) { - mat.TransformPoint(tmp, &pInfo->m_fVertexArray[i]); - fprintf(stream, "v %.2f %.2f %.2f\n", tmp[0], tmp[1], tmp[2]); + mat.TransformPoint(tmp, &Verts[i]); + sprintf(Line, "v %.2f %.2f %.2f\n", tmp[0], tmp[1], tmp[2]); + OBJFile.WriteLine(Line); } - fputs("#\n\n", stream); + + OBJFile.WriteLine("#\n\n"); } for (pPiece = m_pPieces; pPiece; pPiece = pPiece->m_pNext) { + PieceInfo* Info = pPiece->GetPieceInfo(); + strcpy(buf, pPiece->GetName()); for (i = 0; i < strlen(buf); i++) if ((buf[i] == '#') || (buf[i] == ' ')) buf[i] = '_'; - fprintf(stream, "g %s\n", buf); - pPiece->GetPieceInfo()->WriteWavefront(stream, pPiece->mColorCode, &vert); + sprintf(Line, "g %s\n", buf); + OBJFile.WriteLine(Line); + + Info->mMesh->ExportWavefrontIndices(OBJFile, pPiece->mColorCode, vert); + vert += Info->m_nVertexCount; } setlocale(LC_NUMERIC, OldLocale); - fclose(stream); } break; case LC_FILE_PROPERTIES: diff --git a/win/Tools.cpp b/win/Tools.cpp index 1d5a1679..7309912e 100644 --- a/win/Tools.cpp +++ b/win/Tools.cpp @@ -1,4 +1,5 @@ #include "lc_global.h" +#include "lc_mesh.h" #include "Tools.h" #include "resource.h" #include "PrefSht.h" @@ -484,9 +485,11 @@ void Export3DStudio() pPiece->GetPosition(pos); pPiece->GetRotation(rot); Matrix mat(rot, pos); + float* Verts = (float*)pInfo->mMesh->mVertexBuffer.mData; + for (c = 0; c < pInfo->m_nVertexCount; c++) { - mat.TransformPoint(tmp, &pInfo->m_fVertexArray[c*3]); + mat.TransformPoint(tmp, &Verts[c*3]); mobj->vertexarray[c].x = tmp[0]; mobj->vertexarray[c].y = tmp[1]; mobj->vertexarray[c].z = tmp[2];