summaryrefslogtreecommitdiffstats
path: root/3rdparty/assimp/code/DXFLoader.cpp
diff options
context:
space:
mode:
Diffstat (limited to '3rdparty/assimp/code/DXFLoader.cpp')
-rw-r--r--3rdparty/assimp/code/DXFLoader.cpp609
1 files changed, 0 insertions, 609 deletions
diff --git a/3rdparty/assimp/code/DXFLoader.cpp b/3rdparty/assimp/code/DXFLoader.cpp
deleted file mode 100644
index fc68ee88..00000000
--- a/3rdparty/assimp/code/DXFLoader.cpp
+++ /dev/null
@@ -1,609 +0,0 @@
-/*
----------------------------------------------------------------------------
-Open Asset Import Library (ASSIMP)
----------------------------------------------------------------------------
-
-Copyright (c) 2006-2010, ASSIMP Development Team
-
-All rights reserved.
-
-Redistribution and use of this software in source and binary forms,
-with or without modification, are permitted provided that the following
-conditions are met:
-
-* Redistributions of source code must retain the above
- copyright notice, this list of conditions and the
- following disclaimer.
-
-* Redistributions in binary form must reproduce the above
- copyright notice, this list of conditions and the
- following disclaimer in the documentation and/or other
- materials provided with the distribution.
-
-* Neither the name of the ASSIMP team, nor the names of its
- contributors may be used to endorse or promote products
- derived from this software without specific prior
- written permission of the ASSIMP Development Team.
-
-THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
----------------------------------------------------------------------------
-*/
-
-/** @file DXFLoader.cpp
- * @brief Implementation of the DXF importer class
- */
-
-#include "AssimpPCH.h"
-#ifndef ASSIMP_BUILD_NO_DXF_IMPORTER
-
-#include "DXFLoader.h"
-#include "ParsingUtils.h"
-#include "ConvertToLHProcess.h"
-#include "fast_atof.h"
-
-using namespace Assimp;
-
-// AutoCAD Binary DXF<CR><LF><SUB><NULL>
-#define AI_DXF_BINARY_IDENT ("AutoCAD Binary DXF\r\n\x1a\0")
-#define AI_DXF_BINARY_IDENT_LEN (24)
-
-// color indices for DXF - 16 are supported
-static aiColor4D g_aclrDxfIndexColors[] =
-{
- aiColor4D (0.6f, 0.6f, 0.6f, 1.0f),
- aiColor4D (1.0f, 0.0f, 0.0f, 1.0f), // red
- aiColor4D (0.0f, 1.0f, 0.0f, 1.0f), // green
- aiColor4D (0.0f, 0.0f, 1.0f, 1.0f), // blue
- aiColor4D (0.3f, 1.0f, 0.3f, 1.0f), // light green
- aiColor4D (0.3f, 0.3f, 1.0f, 1.0f), // light blue
- aiColor4D (1.0f, 0.3f, 0.3f, 1.0f), // light red
- aiColor4D (1.0f, 0.0f, 1.0f, 1.0f), // pink
- aiColor4D (1.0f, 0.6f, 0.0f, 1.0f), // orange
- aiColor4D (0.6f, 0.3f, 0.0f, 1.0f), // dark orange
- aiColor4D (1.0f, 1.0f, 0.0f, 1.0f), // yellow
- aiColor4D (0.3f, 0.3f, 0.3f, 1.0f), // dark gray
- aiColor4D (0.8f, 0.8f, 0.8f, 1.0f), // light gray
- aiColor4D (0.0f, 00.f, 0.0f, 1.0f), // black
- aiColor4D (1.0f, 1.0f, 1.0f, 1.0f), // white
- aiColor4D (0.6f, 0.0f, 1.0f, 1.0f) // violet
-};
-#define AI_DXF_NUM_INDEX_COLORS (sizeof(g_aclrDxfIndexColors)/sizeof(g_aclrDxfIndexColors[0]))
-
-// invalid/unassigned color value
-aiColor4D g_clrInvalid = aiColor4D(get_qnan(),0.f,0.f,1.f);
-
-// ------------------------------------------------------------------------------------------------
-// Constructor to be privately used by Importer
-DXFImporter::DXFImporter()
-{}
-
-// ------------------------------------------------------------------------------------------------
-// Destructor, private as well
-DXFImporter::~DXFImporter()
-{}
-
-// ------------------------------------------------------------------------------------------------
-// Returns whether the class can handle the format of the given file.
-bool DXFImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler, bool checkSig) const
-{
- return SimpleExtensionCheck(pFile,"dxf");
-}
-
-// ------------------------------------------------------------------------------------------------
-// Get a list of all supported file extensions
-void DXFImporter::GetExtensionList(std::set<std::string>& extensions)
-{
- extensions.insert("dxf");
-}
-
-// ------------------------------------------------------------------------------------------------
-// Get a copy of the next data line, skip strange data
-bool DXFImporter::GetNextLine()
-{
- if (!SkipLine(&buffer))
- return false;
- if (!SkipSpaces(&buffer))
- return GetNextLine();
- else if (*buffer == '{') {
- // some strange meta data ...
- while (true)
- {
- if (!SkipLine(&buffer))
- return false;
-
- if (SkipSpaces(&buffer) && *buffer == '}')
- break;
- }
- return GetNextLine();
- }
- return true;
-}
-
-// ------------------------------------------------------------------------------------------------
-// Get the next token in the file
-bool DXFImporter::GetNextToken()
-{
- if (bRepeat) {
- bRepeat = false;
- return true;
- }
-
- SkipSpaces(&buffer);
- groupCode = strtol10s(buffer,&buffer);
- if (!GetNextLine())
- return false;
-
- // copy the data line to a separate buffer
- char* m = cursor, *end = &cursor[4096];
- while (!IsSpaceOrNewLine( *buffer ) && m < end)
- *m++ = *buffer++;
-
- *m = '\0';
- GetNextLine();
- return true;
-}
-
-// ------------------------------------------------------------------------------------------------
-// Imports the given file into the given scene structure.
-void DXFImporter::InternReadFile( const std::string& pFile,
- aiScene* pScene, IOSystem* pIOHandler)
-{
- boost::scoped_ptr<IOStream> file( pIOHandler->Open( pFile));
-
- // Check whether we can read from the file
- if ( file.get() == NULL) {
- throw DeadlyImportError( "Failed to open DXF file " + pFile + "");
- }
-
- // read the contents of the file in a buffer
- std::vector<char> buffer2;
- TextFileToBuffer(file.get(),buffer2);
- buffer = &buffer2[0];
-
- bRepeat = false;
- mDefaultLayer = NULL;
-
- // check whether this is a binaray DXF file - we can't read binary DXF files :-(
- if (!strncmp(AI_DXF_BINARY_IDENT,buffer,AI_DXF_BINARY_IDENT_LEN))
- throw DeadlyImportError("DXF: Binary files are not supported at the moment");
-
- // now get all lines of the file
- while (GetNextToken()) {
-
- if (2 == groupCode) {
-
- // ENTITIES and BLOCKS sections - skip the whole rest, no need to waste our time with them
- if (!::strcmp(cursor,"ENTITIES") || !::strcmp(cursor,"BLOCKS")) {
- if (!ParseEntities())
- break;
- else bRepeat = true;
- }
-
- // other sections - skip them to make sure there will be no name conflicts
- else {
- while ( GetNextToken()) {
- if (!::strcmp(cursor,"ENDSEC"))
- break;
- }
- }
- }
- // print comment strings
- else if (999 == groupCode) {
- DefaultLogger::get()->info(std::string( cursor ));
- }
- else if (!groupCode && !::strcmp(cursor,"EOF"))
- break;
- }
-
- // find out how many valud layers we have
- for (std::vector<LayerInfo>::const_iterator it = mLayers.begin(),end = mLayers.end(); it != end;++it) {
- if (!(*it).vPositions.empty())
- ++pScene->mNumMeshes;
- }
-
- if (!pScene->mNumMeshes)
- throw DeadlyImportError("DXF: this file contains no 3d data");
-
- pScene->mMeshes = new aiMesh*[ pScene->mNumMeshes ];
- unsigned int m = 0;
- for (std::vector<LayerInfo>::const_iterator it = mLayers.begin(),end = mLayers.end();it != end;++it) {
- if ((*it).vPositions.empty()) {
- continue;
- }
- // generate the output mesh
- aiMesh* pMesh = pScene->mMeshes[m++] = new aiMesh();
- const std::vector<aiVector3D>& vPositions = (*it).vPositions;
- const std::vector<aiColor4D>& vColors = (*it).vColors;
-
- // check whether we need vertex colors here
- aiColor4D* clrOut = NULL;
- const aiColor4D* clr = NULL;
- for (std::vector<aiColor4D>::const_iterator it2 = (*it).vColors.begin(), end2 = (*it).vColors.end();it2 != end2; ++it2) {
-
- if ((*it2).r == (*it2).r) /* qnan? */ {
- clrOut = pMesh->mColors[0] = new aiColor4D[vPositions.size()];
- for (unsigned int i = 0; i < vPositions.size();++i)
- clrOut[i] = aiColor4D(0.6f,0.6f,0.6f,1.0f);
-
- clr = &vColors[0];
- break;
- }
- }
-
- pMesh->mNumFaces = (unsigned int)vPositions.size() / 4u;
- pMesh->mFaces = new aiFace[pMesh->mNumFaces];
-
- aiVector3D* vpOut = pMesh->mVertices = new aiVector3D[vPositions.size()];
- const aiVector3D* vp = &vPositions[0];
-
- for (unsigned int i = 0; i < pMesh->mNumFaces;++i) {
- aiFace& face = pMesh->mFaces[i];
-
- // check whether we need four, three or two indices here
- if (vp[1] == vp[2]) {
- face.mNumIndices = 2;
- }
- else if (vp[3] == vp[2]) {
- face.mNumIndices = 3;
- }
- else face.mNumIndices = 4;
- face.mIndices = new unsigned int[face.mNumIndices];
-
- for (unsigned int a = 0; a < face.mNumIndices;++a) {
- *vpOut++ = vp[a];
- if (clr) {
- if (is_not_qnan( clr[a].r )) {
- *clrOut = clr[a];
- }
- ++clrOut;
- }
- face.mIndices[a] = pMesh->mNumVertices++;
- }
- vp += 4;
- }
- }
-
- // generate the output scene graph
- pScene->mRootNode = new aiNode();
- pScene->mRootNode->mName.Set("<DXF_ROOT>");
-
- if (1 == pScene->mNumMeshes) {
- pScene->mRootNode->mMeshes = new unsigned int[ pScene->mRootNode->mNumMeshes = 1 ];
- pScene->mRootNode->mMeshes[0] = 0;
- }
- else
- {
- pScene->mRootNode->mChildren = new aiNode*[ pScene->mRootNode->mNumChildren = pScene->mNumMeshes ];
- for (m = 0; m < pScene->mRootNode->mNumChildren;++m) {
- aiNode* p = pScene->mRootNode->mChildren[m] = new aiNode();
- p->mName.length = ::strlen( mLayers[m].name );
- strcpy(p->mName.data, mLayers[m].name);
-
- p->mMeshes = new unsigned int[p->mNumMeshes = 1];
- p->mMeshes[0] = m;
- p->mParent = pScene->mRootNode;
- }
- }
-
- // generate a default material
- MaterialHelper* pcMat = new MaterialHelper();
- aiString s;
- s.Set(AI_DEFAULT_MATERIAL_NAME);
- pcMat->AddProperty(&s, AI_MATKEY_NAME);
-
- aiColor4D clrDiffuse(0.6f,0.6f,0.6f,1.0f);
- pcMat->AddProperty(&clrDiffuse,1,AI_MATKEY_COLOR_DIFFUSE);
-
- clrDiffuse = aiColor4D(1.0f,1.0f,1.0f,1.0f);
- pcMat->AddProperty(&clrDiffuse,1,AI_MATKEY_COLOR_SPECULAR);
-
- clrDiffuse = aiColor4D(0.05f,0.05f,0.05f,1.0f);
- pcMat->AddProperty(&clrDiffuse,1,AI_MATKEY_COLOR_AMBIENT);
-
- pScene->mNumMaterials = 1;
- pScene->mMaterials = new aiMaterial*[1];
- pScene->mMaterials[0] = pcMat;
-
- // flip winding order to be ccw
- FlipWindingOrderProcess flipper;
- flipper.Execute(pScene);
-
- // --- everything destructs automatically ---
-}
-
-// ------------------------------------------------------------------------------------------------
-bool DXFImporter::ParseEntities()
-{
- while (GetNextToken()) {
- if (!groupCode) {
- if (!::strcmp(cursor,"3DFACE") || !::strcmp(cursor,"LINE") || !::strcmp(cursor,"3DLINE")){
- //http://sourceforge.net/tracker/index.php?func=detail&aid=2970566&group_id=226462&atid=1067632
- Parse3DFace();
- bRepeat = true;
- }
- if (!::strcmp(cursor,"POLYLINE") || !::strcmp(cursor,"LWPOLYLINE")){
- ParsePolyLine();
- bRepeat = true;
- }
- if (!::strcmp(cursor,"ENDSEC")) {
- return true;
- }
- }
- }
- return false;
-}
-
-// ------------------------------------------------------------------------------------------------
-void DXFImporter::SetLayer(LayerInfo*& out)
-{
- for (std::vector<LayerInfo>::iterator it = mLayers.begin(),end = mLayers.end();it != end;++it) {
- if (!::strcmp( (*it).name, cursor )) {
- out = &(*it);
- break;
- }
- }
- if (!out) {
- // we don't have this layer yet
- mLayers.push_back(LayerInfo());
- out = &mLayers.back();
- ::strcpy(out->name,cursor);
- }
-}
-
-// ------------------------------------------------------------------------------------------------
-void DXFImporter::SetDefaultLayer(LayerInfo*& out)
-{
- if (!mDefaultLayer) {
- mLayers.push_back(LayerInfo());
- mDefaultLayer = &mLayers.back();
- }
- out = mDefaultLayer;
-}
-
-// ------------------------------------------------------------------------------------------------
-bool DXFImporter::ParsePolyLine()
-{
- bool ret = false;
- LayerInfo* out = NULL;
-
- std::vector<aiVector3D> positions;
- std::vector<aiColor4D> colors;
- std::vector<unsigned int> indices;
- unsigned int flags = 0;
-
- while (GetNextToken()) {
- switch (groupCode)
- {
- case 0:
- {
- if (!::strcmp(cursor,"VERTEX")) {
- aiVector3D v;aiColor4D clr(g_clrInvalid);
- unsigned int idx[4] = {0xffffffff,0xffffffff,0xffffffff,0xffffffff};
- ParsePolyLineVertex(v, clr, idx);
- if (0xffffffff == idx[0]) {
- positions.push_back(v);
- colors.push_back(clr);
- }
- else {
- // check whether we have a fourth coordinate
- if (0xffffffff == idx[3]) {
- idx[3] = idx[2];
- }
-
- indices.reserve(indices.size()+4);
- for (unsigned int m = 0; m < 4;++m)
- indices.push_back(idx[m]);
- }
- bRepeat = true;
- }
- else if (!::strcmp(cursor,"ENDSEQ")) {
- ret = true;
- }
- break;
- }
-
- // flags --- important that we know whether it is a polyface mesh
- case 70:
- {
- if (!flags) {
- flags = strtol10(cursor);
- }
- break;
- };
-
- // optional number of vertices
- case 71:
- {
- positions.reserve(strtol10(cursor));
- break;
- }
-
- // optional number of faces
- case 72:
- {
- indices.reserve(strtol10(cursor));
- break;
- }
-
- // 8 specifies the layer
- case 8:
- {
- SetLayer(out);
- break;
- }
- }
- }
- if (!(flags & 64)) {
- DefaultLogger::get()->warn("DXF: Only polyface meshes are currently supported");
- return ret;
- }
-
- if (positions.size() < 3 || indices.size() < 3) {
- DefaultLogger::get()->warn("DXF: Unable to parse POLYLINE element - not enough vertices");
- return ret;
- }
-
- // use a default layer if necessary
- if (!out) {
- SetDefaultLayer(out);
- }
-
- flags = (unsigned int)(out->vPositions.size()+indices.size());
- out->vPositions.reserve(flags);
- out->vColors.reserve(flags);
-
- // generate unique vertices
- for (std::vector<unsigned int>::const_iterator it = indices.begin(), end = indices.end();it != end; ++it) {
- unsigned int idx = *it;
- if (idx > positions.size() || !idx) {
- DefaultLogger::get()->error("DXF: Polyface mesh index os out of range");
- idx = (unsigned int) positions.size();
- }
- out->vPositions.push_back(positions[idx-1]); // indices are one-based.
- out->vColors.push_back(colors[idx-1]); // indices are one-based.
- }
-
- return ret;
-}
-
-// ------------------------------------------------------------------------------------------------
-bool DXFImporter::ParsePolyLineVertex(aiVector3D& out,aiColor4D& clr, unsigned int* outIdx)
-{
- bool ret = false;
- while (GetNextToken()) {
- switch (groupCode)
- {
- case 0: ret = true;
- break;
-
- // todo - handle the correct layer for the vertex. At the moment it is assumed that all vertices of
- // a polyline are placed on the same global layer.
-
- // x position of the first corner
- case 10: out.x = fast_atof(cursor);break;
-
- // y position of the first corner
- case 20: out.y = -fast_atof(cursor);break;
-
- // z position of the first corner
- case 30: out.z = fast_atof(cursor);break;
-
- // POLYFACE vertex indices
- case 71: outIdx[0] = strtol10(cursor);break;
- case 72: outIdx[1] = strtol10(cursor);break;
- case 73: outIdx[2] = strtol10(cursor);break;
- // case 74: outIdx[3] = strtol10(cursor);break;
-
- // color
- case 62: clr = g_aclrDxfIndexColors[strtol10(cursor) % AI_DXF_NUM_INDEX_COLORS]; break;
- };
- if (ret) {
- break;
- }
- }
- return ret;
-}
-
-// ------------------------------------------------------------------------------------------------
-bool DXFImporter::Parse3DFace()
-{
- bool ret = false;
- LayerInfo* out = NULL;
-
- aiVector3D vip[4]; // -- vectors are initialized to zero
- aiColor4D clr(g_clrInvalid);
-
- // this is also used for for parsing line entities
- bool bThird = false;
-
- while (GetNextToken()) {
- switch (groupCode) {
- case 0:
- ret = true;
- break;
-
- // 8 specifies the layer
- case 8: {
- SetLayer(out);
- break;
- }
-
- // x position of the first corner
- case 10: vip[0].x = fast_atof(cursor);break;
-
- // y position of the first corner
- case 20: vip[0].y = -fast_atof(cursor);break;
-
- // z position of the first corner
- case 30: vip[0].z = fast_atof(cursor);break;
-
- // x position of the second corner
- case 11: vip[1].x = fast_atof(cursor);break;
-
- // y position of the second corner
- case 21: vip[1].y = -fast_atof(cursor);break;
-
- // z position of the second corner
- case 31: vip[1].z = fast_atof(cursor);break;
-
- // x position of the third corner
- case 12: vip[2].x = fast_atof(cursor);
- bThird = true;break;
-
- // y position of the third corner
- case 22: vip[2].y = -fast_atof(cursor);
- bThird = true;break;
-
- // z position of the third corner
- case 32: vip[2].z = fast_atof(cursor);
- bThird = true;break;
-
- // x position of the fourth corner
- case 13: vip[3].x = fast_atof(cursor);
- bThird = true;break;
-
- // y position of the fourth corner
- case 23: vip[3].y = -fast_atof(cursor);
- bThird = true;break;
-
- // z position of the fourth corner
- case 33: vip[3].z = fast_atof(cursor);
- bThird = true;break;
-
- // color
- case 62: clr = g_aclrDxfIndexColors[strtol10(cursor) % AI_DXF_NUM_INDEX_COLORS]; break;
- };
- if (ret)
- break;
- }
-
- if (!bThird)
- vip[2] = vip[1];
-
- // use a default layer if necessary
- if (!out) {
- SetDefaultLayer(out);
- }
- // add the faces to the face list for this layer
- out->vPositions.push_back(vip[0]);
- out->vPositions.push_back(vip[1]);
- out->vPositions.push_back(vip[2]);
- out->vPositions.push_back(vip[3]); // might be equal to the third
-
- for (unsigned int i = 0; i < 4;++i)
- out->vColors.push_back(clr);
- return ret;
-}
-
-#endif // !! ASSIMP_BUILD_NO_DXF_IMPORTER
-