Added NFF loader. No standard shapes yet (sphere, cone), but a class for them (StandardShapes) has been declared.
Fixed a small bug in the DXF loader, a few test models, however, are still corrupted. git-svn-id: https://assimp.svn.sourceforge.net/svnroot/assimp/trunk@121 67173fc5-114c-0410-ac8e-9d2fd5bffc1fpull/1/head
parent
56563016b0
commit
f69446937b
|
@ -92,21 +92,21 @@ bool DXFImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler) const
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
bool DXFImporter::GetNextLine()
|
bool DXFImporter::GetNextLine()
|
||||||
{
|
{
|
||||||
if(!SkipLine(buffer,&buffer))return false;
|
if(!SkipLine(&buffer))return false;
|
||||||
if(!SkipSpaces(buffer,&buffer))return GetNextLine();
|
if(!SkipSpaces(&buffer))return GetNextLine();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
bool DXFImporter::GetNextToken()
|
bool DXFImporter::GetNextToken()
|
||||||
{
|
{
|
||||||
SkipSpaces(buffer,&buffer);
|
SkipSpaces(&buffer);
|
||||||
groupCode = strtol10s(buffer,&buffer);
|
groupCode = strtol10s(buffer,&buffer);
|
||||||
if(!GetNextLine())return false;
|
if(!GetNextLine())return false;
|
||||||
|
|
||||||
// copy the data line to a separate buffer
|
// copy the data line to a separate buffer
|
||||||
char* m = cursor;
|
char* m = cursor, *end = &cursor[4096];
|
||||||
while (!IsLineEnd ( *buffer ) && m < (cursor+sizeof(cursor)/sizeof(char)))
|
while (!IsLineEnd ( *buffer ) && m < end)
|
||||||
*m++ = *buffer++;
|
*m++ = *buffer++;
|
||||||
|
|
||||||
*m = '\0';
|
*m = '\0';
|
||||||
|
@ -143,10 +143,6 @@ void DXFImporter::InternReadFile( const std::string& pFile,
|
||||||
if (!::strcmp(cursor,"ENTITIES"))
|
if (!::strcmp(cursor,"ENTITIES"))
|
||||||
if (!ParseEntities())break;
|
if (!ParseEntities())break;
|
||||||
|
|
||||||
// HEADER section - just to print the file format version
|
|
||||||
else if (!::strcmp(cursor,"HEADER"))
|
|
||||||
if (!ParseHeader())break;
|
|
||||||
|
|
||||||
// other sections such as BLOCK - skip them to make
|
// other sections such as BLOCK - skip them to make
|
||||||
// sure there will be no name conflicts
|
// sure there will be no name conflicts
|
||||||
else
|
else
|
||||||
|
@ -273,27 +269,6 @@ bool DXFImporter::ParseEntities()
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
|
||||||
bool DXFImporter::ParseHeader()
|
|
||||||
{
|
|
||||||
// --- at the moment we don't need any information from the header
|
|
||||||
while (GetNextToken())
|
|
||||||
{
|
|
||||||
if (!groupCode)
|
|
||||||
{
|
|
||||||
if (!::strcmp(cursor,"ENDSEC"))
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
// print comment strings
|
|
||||||
else if (999 == groupCode)
|
|
||||||
{
|
|
||||||
DefaultLogger::get()->info(std::string( cursor ));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
bool DXFImporter::Parse3DFace()
|
bool DXFImporter::Parse3DFace()
|
||||||
{
|
{
|
||||||
|
|
|
@ -106,12 +106,6 @@ protected:
|
||||||
*/
|
*/
|
||||||
bool ParseEntities();
|
bool ParseEntities();
|
||||||
|
|
||||||
// -------------------------------------------------------------------
|
|
||||||
/** Parses the HEADER section in the file
|
|
||||||
* @return false if the end of the file was reached
|
|
||||||
*/
|
|
||||||
bool ParseHeader();
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------
|
// -------------------------------------------------------------------
|
||||||
/** Parses a 3DFACE section in the file
|
/** Parses a 3DFACE section in the file
|
||||||
* @return false if the end of the file was reached
|
* @return false if the end of the file was reached
|
||||||
|
|
|
@ -157,7 +157,7 @@ bool GenVertexNormalsProcess::GenMeshVertexNormals (aiMesh* pMesh)
|
||||||
vertexFinder.FindPositions( posThis, posEpsilon, verticesFound);
|
vertexFinder.FindPositions( posThis, posEpsilon, verticesFound);
|
||||||
|
|
||||||
aiVector3D pcNor;
|
aiVector3D pcNor;
|
||||||
unsigned int div = 0;
|
//unsigned int div = 0;
|
||||||
for (unsigned int a = 0; a < verticesFound.size(); ++a)
|
for (unsigned int a = 0; a < verticesFound.size(); ++a)
|
||||||
{
|
{
|
||||||
unsigned int vidx = verticesFound[a];
|
unsigned int vidx = verticesFound[a];
|
||||||
|
@ -167,7 +167,7 @@ bool GenVertexNormalsProcess::GenMeshVertexNormals (aiMesh* pMesh)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
pcNor += pMesh->mNormals[vidx];
|
pcNor += pMesh->mNormals[vidx];
|
||||||
++div;
|
//++div;
|
||||||
}
|
}
|
||||||
pcNor.Normalize();
|
pcNor.Normalize();
|
||||||
pcNew[i] = pcNor;
|
pcNew[i] = pcNor;
|
||||||
|
|
|
@ -110,6 +110,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#if (!defined AI_BUILD_NO_DXF_IMPORTER)
|
#if (!defined AI_BUILD_NO_DXF_IMPORTER)
|
||||||
# include "DXFLoader.h"
|
# include "DXFLoader.h"
|
||||||
#endif
|
#endif
|
||||||
|
#if (!defined AI_BUILD_NO_NFF_IMPORTER)
|
||||||
|
# include "NFFLoader.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
// PostProcess-Steps
|
// PostProcess-Steps
|
||||||
|
@ -228,6 +231,9 @@ Importer::Importer() :
|
||||||
#if (!defined AI_BUILD_NO_DXF_IMPORTER)
|
#if (!defined AI_BUILD_NO_DXF_IMPORTER)
|
||||||
mImporter.push_back( new DXFImporter());
|
mImporter.push_back( new DXFImporter());
|
||||||
#endif
|
#endif
|
||||||
|
#if (!defined AI_BUILD_NO_NFF_IMPORTER)
|
||||||
|
mImporter.push_back( new NFFImporter());
|
||||||
|
#endif
|
||||||
|
|
||||||
// add an instance of each post processing step here in the order
|
// add an instance of each post processing step here in the order
|
||||||
// of sequence it is executed. steps that are added here are not validated -
|
// of sequence it is executed. steps that are added here are not validated -
|
||||||
|
|
|
@ -0,0 +1,391 @@
|
||||||
|
/*
|
||||||
|
---------------------------------------------------------------------------
|
||||||
|
Open Asset Import Library (ASSIMP)
|
||||||
|
---------------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2006-2008, 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 Implementation of the STL importer class */
|
||||||
|
|
||||||
|
// internal headers
|
||||||
|
#include "NFFLoader.h"
|
||||||
|
#include "MaterialSystem.h"
|
||||||
|
#include "ParsingUtils.h"
|
||||||
|
#include "StandardShapes.h"
|
||||||
|
#include "fast_atof.h"
|
||||||
|
|
||||||
|
// public assimp headers
|
||||||
|
#include "../include/IOStream.h"
|
||||||
|
#include "../include/IOSystem.h"
|
||||||
|
#include "../include/aiScene.h"
|
||||||
|
#include "../include/aiAssert.h"
|
||||||
|
#include "../include/DefaultLogger.h"
|
||||||
|
|
||||||
|
// boost headers
|
||||||
|
#include <boost/scoped_ptr.hpp>
|
||||||
|
|
||||||
|
using namespace Assimp;
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
// Constructor to be privately used by Importer
|
||||||
|
NFFImporter::NFFImporter()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
// Destructor, private as well
|
||||||
|
NFFImporter::~NFFImporter()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
// Returns whether the class can handle the format of the given file.
|
||||||
|
bool NFFImporter::CanRead( const std::string& pFile, IOSystem* pIOHandler) const
|
||||||
|
{
|
||||||
|
// simple check of file extension is enough for the moment
|
||||||
|
std::string::size_type pos = pFile.find_last_of('.');
|
||||||
|
// no file extension - can't read
|
||||||
|
if( pos == std::string::npos)return false;
|
||||||
|
std::string extension = pFile.substr( pos);
|
||||||
|
|
||||||
|
return !(extension.length() != 4 || extension[0] != '.' ||
|
||||||
|
extension[1] != 'n' && extension[1] != 'N' ||
|
||||||
|
extension[2] != 'f' && extension[2] != 'F' ||
|
||||||
|
extension[3] != 'f' && extension[3] != 'F');
|
||||||
|
}
|
||||||
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
bool GetNextLine(const char*& buffer, char out[4096])
|
||||||
|
{
|
||||||
|
char* _out = out;
|
||||||
|
char* const end = _out+4096;
|
||||||
|
while (!IsLineEnd( *buffer ) && _out < end)
|
||||||
|
*_out++ = *buffer++;
|
||||||
|
*_out = '\0';
|
||||||
|
|
||||||
|
if ('\0' == *buffer)return false;
|
||||||
|
while (IsLineEnd( *buffer ))++buffer;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
#define AI_NFF_PARSE_FLOAT(f) \
|
||||||
|
SkipSpaces(&sz); \
|
||||||
|
sz = fast_atof_move(sz, f);
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
#define AI_NFF_PARSE_TRIPLE(v) \
|
||||||
|
AI_NFF_PARSE_FLOAT(v.x) \
|
||||||
|
AI_NFF_PARSE_FLOAT(v.y) \
|
||||||
|
AI_NFF_PARSE_FLOAT(v.z)
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
// Imports the given file into the given scene structure.
|
||||||
|
void NFFImporter::InternReadFile( const std::string& pFile,
|
||||||
|
aiScene* pScene, IOSystem* pIOHandler)
|
||||||
|
{
|
||||||
|
boost::scoped_ptr<IOStream> file( pIOHandler->Open( pFile, "rb"));
|
||||||
|
|
||||||
|
// Check whether we can read from the file
|
||||||
|
if( file.get() == NULL)
|
||||||
|
throw new ImportErrorException( "Failed to open NFF file " + pFile + ".");
|
||||||
|
|
||||||
|
unsigned int m = (unsigned int)file->FileSize();
|
||||||
|
|
||||||
|
// allocate storage and copy the contents of the file to a memory buffer
|
||||||
|
// (terminate it with zero)
|
||||||
|
std::vector<char> mBuffer2(m+1);
|
||||||
|
file->Read(&mBuffer2[0],m,1);
|
||||||
|
const char* buffer = &mBuffer2[0];
|
||||||
|
mBuffer2[m] = '\0';
|
||||||
|
|
||||||
|
// mesh arrays - separate here to make the handling of
|
||||||
|
// the pointers below easier.
|
||||||
|
std::vector<MeshInfo> meshes;
|
||||||
|
std::vector<MeshInfo> meshesWithNormals;
|
||||||
|
std::vector<MeshInfo> meshesLocked;
|
||||||
|
MeshInfo* currentMeshWithNormals = NULL;
|
||||||
|
MeshInfo* currentMesh = NULL;
|
||||||
|
|
||||||
|
char line[4096];
|
||||||
|
const char* sz;
|
||||||
|
unsigned int sphere = 0,cylinder = 0,cone = 0,numNamed = 0;
|
||||||
|
while (GetNextLine(buffer,line))
|
||||||
|
{
|
||||||
|
if ('p' == line[0])
|
||||||
|
{
|
||||||
|
MeshInfo* out = NULL;
|
||||||
|
// 'pp' - polygon patch primitive
|
||||||
|
if ('p' == line[1])
|
||||||
|
{
|
||||||
|
if (meshesWithNormals.empty())
|
||||||
|
{
|
||||||
|
meshesWithNormals.push_back(MeshInfo(true));
|
||||||
|
currentMeshWithNormals = &meshesWithNormals.back();
|
||||||
|
}
|
||||||
|
|
||||||
|
sz = &line[2];out = currentMeshWithNormals;
|
||||||
|
}
|
||||||
|
// 'p' - polygon primitive
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (meshes.empty())
|
||||||
|
{
|
||||||
|
meshes.push_back(MeshInfo(false));
|
||||||
|
currentMesh = &meshes.back();
|
||||||
|
}
|
||||||
|
sz = &line[1];out = currentMesh;
|
||||||
|
}
|
||||||
|
SkipSpaces(sz,&sz);
|
||||||
|
m = strtol10(sz);
|
||||||
|
|
||||||
|
out->faces.push_back(m);
|
||||||
|
for (unsigned int n = 0; n < m;++n)
|
||||||
|
{
|
||||||
|
if(!GetNextLine(buffer,line))
|
||||||
|
{
|
||||||
|
DefaultLogger::get()->error("NFF: Unexpected EOF was encountered");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
aiVector3D v; sz = &line[0];
|
||||||
|
AI_NFF_PARSE_TRIPLE(v);
|
||||||
|
out->vertices.push_back(v);
|
||||||
|
|
||||||
|
if (&meshesWithNormals.back() == out)
|
||||||
|
{
|
||||||
|
AI_NFF_PARSE_TRIPLE(v);
|
||||||
|
out->normals.push_back(v);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 'f' - shading information block
|
||||||
|
else if ('f' == line[0] && IsSpace(line[1]))
|
||||||
|
{
|
||||||
|
SkipSpaces(&line[1],&sz);
|
||||||
|
|
||||||
|
ShadingInfo s; // color;
|
||||||
|
|
||||||
|
// read just the RGB colors, the rest is ignored for the moment
|
||||||
|
sz = fast_atof_move(sz, s.color.r);
|
||||||
|
SkipSpaces(&sz);
|
||||||
|
sz = fast_atof_move(sz, s.color.g);
|
||||||
|
SkipSpaces(&sz);
|
||||||
|
sz = fast_atof_move(sz, s.color.b);
|
||||||
|
|
||||||
|
// check whether we have this material already -
|
||||||
|
// although we have the RRM-Step, this is necessary here.
|
||||||
|
// otherwise we would generate hundreds of small meshes
|
||||||
|
// with just a few faces - this is surely never wanted.
|
||||||
|
currentMesh = currentMeshWithNormals = NULL;
|
||||||
|
for (std::vector<MeshInfo>::iterator it = meshes.begin(), end = meshes.end();
|
||||||
|
it != end;++it)
|
||||||
|
{
|
||||||
|
if ((*it).bLocked)continue;
|
||||||
|
if ((*it).shader == s)
|
||||||
|
{
|
||||||
|
if ((*it).bHasNormals)currentMeshWithNormals = &(*it);
|
||||||
|
else currentMesh = &(*it);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!currentMesh)
|
||||||
|
{
|
||||||
|
meshes.push_back(MeshInfo(false));
|
||||||
|
currentMesh = &meshes.back();
|
||||||
|
currentMesh->shader = s;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!currentMeshWithNormals)
|
||||||
|
{
|
||||||
|
meshesWithNormals.push_back(MeshInfo(true));
|
||||||
|
currentMeshWithNormals = &meshesWithNormals.back();
|
||||||
|
currentMeshWithNormals->shader = s;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// 's' - sphere
|
||||||
|
else if ('s' == line[0] && IsSpace(line[1]))
|
||||||
|
{
|
||||||
|
meshesLocked.push_back(MeshInfo(false,true));
|
||||||
|
MeshInfo& currentMesh = meshesLocked.back();
|
||||||
|
|
||||||
|
sz = &line[1];
|
||||||
|
aiVector3D center; float radius;
|
||||||
|
AI_NFF_PARSE_TRIPLE(center);
|
||||||
|
AI_NFF_PARSE_FLOAT(radius);
|
||||||
|
|
||||||
|
currentMesh.center = center;
|
||||||
|
|
||||||
|
// generate the sphere - it consists of simple triangles
|
||||||
|
StandardShapes::MakeSphere(aiVector3D(), radius, 500.0f, currentMesh.vertices);
|
||||||
|
currentMesh.faces.resize(currentMesh.vertices.size(),3);
|
||||||
|
|
||||||
|
// generate a name for the mesh
|
||||||
|
::sprintf(currentMesh.name,"sphere_%i",sphere++);
|
||||||
|
}
|
||||||
|
// 'c' - cone
|
||||||
|
else if ('c' == line[0] && IsSpace(line[1]))
|
||||||
|
{
|
||||||
|
meshesLocked.push_back(MeshInfo(false,true));
|
||||||
|
MeshInfo& currentMesh = meshes.back();
|
||||||
|
|
||||||
|
sz = &line[1];
|
||||||
|
aiVector3D center1, center2; float radius1, radius2;
|
||||||
|
AI_NFF_PARSE_TRIPLE(center1);
|
||||||
|
AI_NFF_PARSE_FLOAT(radius1);
|
||||||
|
AI_NFF_PARSE_TRIPLE(center2);
|
||||||
|
AI_NFF_PARSE_FLOAT(radius2);
|
||||||
|
|
||||||
|
// compute the center point of the cone/cylinder
|
||||||
|
center2 = (center2-center1)/2.f;
|
||||||
|
currentMesh.center = center1+center2;
|
||||||
|
center1 = -center2;
|
||||||
|
|
||||||
|
// generate the cone - it consists of simple triangles
|
||||||
|
StandardShapes::MakeCone(center1, radius1, center2, radius2, 500.0f, currentMesh.vertices);
|
||||||
|
currentMesh.faces.resize(currentMesh.vertices.size(),3);
|
||||||
|
|
||||||
|
// generate a name for the mesh
|
||||||
|
if (radius1 != radius2)
|
||||||
|
::sprintf(currentMesh.name,"cone_%i",cone++);
|
||||||
|
else ::sprintf(currentMesh.name,"cylinder_%i",cylinder++);
|
||||||
|
}
|
||||||
|
// '#' - comment
|
||||||
|
else if ('#' == line[0])
|
||||||
|
{
|
||||||
|
DefaultLogger::get()->info(line);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// copy all arrays into one large
|
||||||
|
meshes.reserve(meshes.size()+meshesLocked.size()+meshesWithNormals.size());
|
||||||
|
meshes.insert(meshes.end(),meshesLocked.begin(),meshesLocked.end());
|
||||||
|
meshes.insert(meshes.end(),meshesWithNormals.begin(),meshesWithNormals.end());
|
||||||
|
|
||||||
|
// now generate output meshes. first find out how many meshes we'll need
|
||||||
|
std::vector<MeshInfo>::const_iterator it = meshes.begin(), end = meshes.end();
|
||||||
|
for (;it != end;++it)
|
||||||
|
{
|
||||||
|
if (!(*it).faces.empty())
|
||||||
|
{
|
||||||
|
++pScene->mNumMeshes;
|
||||||
|
if ((*it).name[0])++numNamed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// generate a dummy root node - assign all unnamed elements such
|
||||||
|
// as polygons and polygon patches to the root node and generate
|
||||||
|
// sub nodes for named objects such as spheres and cones.
|
||||||
|
aiNode* const root = new aiNode();
|
||||||
|
root->mName.Set("<NFF_Root>");
|
||||||
|
root->mNumChildren = numNamed;
|
||||||
|
root->mNumMeshes = pScene->mNumMeshes-numNamed;
|
||||||
|
|
||||||
|
aiNode** ppcChildren;
|
||||||
|
unsigned int* pMeshes;
|
||||||
|
if (root->mNumMeshes)
|
||||||
|
pMeshes = root->mMeshes = new unsigned int[root->mNumMeshes];
|
||||||
|
if (root->mNumChildren)
|
||||||
|
ppcChildren = root->mChildren = new aiNode*[root->mNumChildren];
|
||||||
|
|
||||||
|
|
||||||
|
if (!pScene->mNumMeshes)throw new ImportErrorException("NFF: No meshes loaded");
|
||||||
|
pScene->mMeshes = new aiMesh*[pScene->mNumMeshes];
|
||||||
|
pScene->mMaterials = new aiMaterial*[pScene->mNumMaterials = pScene->mNumMeshes];
|
||||||
|
for (it = meshes.begin(), m = 0; it != end;++it)
|
||||||
|
{
|
||||||
|
if ((*it).faces.empty())continue;
|
||||||
|
|
||||||
|
const MeshInfo& src = *it;
|
||||||
|
aiMesh* const mesh = pScene->mMeshes[m] = new aiMesh();
|
||||||
|
mesh->mNumVertices = (unsigned int)src.vertices.size();
|
||||||
|
mesh->mNumFaces = (unsigned int)src.faces.size();
|
||||||
|
|
||||||
|
// generate sub nodes for named meshes
|
||||||
|
if (src.name[0])
|
||||||
|
{
|
||||||
|
aiNode* const node = *ppcChildren = new aiNode();
|
||||||
|
node->mParent = root;
|
||||||
|
node->mNumMeshes = 1;
|
||||||
|
node->mMeshes = new unsigned int[1];
|
||||||
|
node->mMeshes[0] = m;
|
||||||
|
|
||||||
|
// setup the transformation matrix of the node
|
||||||
|
node->mTransformation.a4 = src.center.x;
|
||||||
|
node->mTransformation.b4 = src.center.y;
|
||||||
|
node->mTransformation.c4 = src.center.z;
|
||||||
|
|
||||||
|
++ppcChildren;
|
||||||
|
}
|
||||||
|
else *pMeshes++ = m;
|
||||||
|
|
||||||
|
// copy vertex positions
|
||||||
|
mesh->mVertices = new aiVector3D[mesh->mNumVertices];
|
||||||
|
::memcpy(mesh->mVertices,&src.vertices[0],sizeof(aiVector3D)*mesh->mNumVertices);
|
||||||
|
if (src.bHasNormals)
|
||||||
|
{
|
||||||
|
ai_assert(src.normals.size() == src.vertices.size());
|
||||||
|
|
||||||
|
// copy normal vectors
|
||||||
|
mesh->mNormals = new aiVector3D[mesh->mNumVertices];
|
||||||
|
::memcpy(mesh->mNormals,&src.normals[0],sizeof(aiVector3D)*mesh->mNumVertices);
|
||||||
|
}
|
||||||
|
|
||||||
|
// generate faces
|
||||||
|
unsigned int p = 0;
|
||||||
|
aiFace* pFace = mesh->mFaces = new aiFace[mesh->mNumFaces];
|
||||||
|
for (std::vector<unsigned int>::const_iterator it2 = src.faces.begin(),
|
||||||
|
end2 = src.faces.end();
|
||||||
|
it2 != end2;++it2,++pFace)
|
||||||
|
{
|
||||||
|
pFace->mIndices = new unsigned int [ pFace->mNumIndices = *it2 ];
|
||||||
|
for (unsigned int o = 0; o < pFace->mNumIndices;++o)
|
||||||
|
pFace->mIndices[o] = p++;
|
||||||
|
}
|
||||||
|
|
||||||
|
// generate a material for the mesh
|
||||||
|
MaterialHelper* pcMat = (MaterialHelper*)(pScene->
|
||||||
|
mMaterials[m++] = new MaterialHelper());
|
||||||
|
|
||||||
|
aiString s;
|
||||||
|
s.Set(AI_DEFAULT_MATERIAL_NAME);
|
||||||
|
pcMat->AddProperty(&s, AI_MATKEY_NAME);
|
||||||
|
|
||||||
|
pcMat->AddProperty(&src.shader.color,1,AI_MATKEY_COLOR_DIFFUSE);
|
||||||
|
pcMat->AddProperty(&src.shader.color,1,AI_MATKEY_COLOR_SPECULAR);
|
||||||
|
}
|
||||||
|
pScene->mRootNode = root;
|
||||||
|
}
|
|
@ -0,0 +1,133 @@
|
||||||
|
/*
|
||||||
|
Open Asset Import Library (ASSIMP)
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2006-2008, 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 Declaration of the NFF importer class. */
|
||||||
|
#ifndef AI_NFFLOADER_H_INCLUDED
|
||||||
|
#define AI_NFFLOADER_H_INCLUDED
|
||||||
|
|
||||||
|
#include "BaseImporter.h"
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
#include "../include/aiTypes.h"
|
||||||
|
|
||||||
|
namespace Assimp {
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
/** NFF (Neutral File Format) Importer class
|
||||||
|
*/
|
||||||
|
class NFFImporter : public BaseImporter
|
||||||
|
{
|
||||||
|
friend class Importer;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
/** Constructor to be privately used by Importer */
|
||||||
|
NFFImporter();
|
||||||
|
|
||||||
|
/** Destructor, private as well */
|
||||||
|
~NFFImporter();
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
/** Returns whether the class can handle the format of the given file.
|
||||||
|
* See BaseImporter::CanRead() for details. */
|
||||||
|
bool CanRead( const std::string& pFile, IOSystem* pIOHandler) const;
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
/** Called by Importer::GetExtensionList() for each loaded importer.
|
||||||
|
* See BaseImporter::GetExtensionList() for details
|
||||||
|
*/
|
||||||
|
void GetExtensionList(std::string& append)
|
||||||
|
{
|
||||||
|
append.append("*.nff");
|
||||||
|
}
|
||||||
|
|
||||||
|
// -------------------------------------------------------------------
|
||||||
|
/** Imports the given file into the given scene structure.
|
||||||
|
* See BaseImporter::InternReadFile() for details
|
||||||
|
*/
|
||||||
|
void InternReadFile( const std::string& pFile, aiScene* pScene,
|
||||||
|
IOSystem* pIOHandler);
|
||||||
|
|
||||||
|
private:
|
||||||
|
|
||||||
|
|
||||||
|
// describes face material properties
|
||||||
|
struct ShadingInfo
|
||||||
|
{
|
||||||
|
ShadingInfo()
|
||||||
|
: color(0.6f,0.6f,0.6f,1.0f)
|
||||||
|
{}
|
||||||
|
|
||||||
|
aiColor4D color;
|
||||||
|
//float diffuse, specular; --- not implemented yet
|
||||||
|
|
||||||
|
bool operator == (const ShadingInfo& other) const
|
||||||
|
{return color == other.color;}
|
||||||
|
};
|
||||||
|
|
||||||
|
// describes a NFF mesh
|
||||||
|
struct MeshInfo
|
||||||
|
{
|
||||||
|
MeshInfo(bool bHN, bool bL = false)
|
||||||
|
: bHasNormals(bHN)
|
||||||
|
, bLocked(bL)
|
||||||
|
{
|
||||||
|
name[0] = '\0'; // by default meshes are unnamed
|
||||||
|
}
|
||||||
|
|
||||||
|
ShadingInfo shader;
|
||||||
|
bool bHasNormals, bLocked;
|
||||||
|
|
||||||
|
// for spheres, cones and cylinders: center point of the object
|
||||||
|
aiVector3D center;
|
||||||
|
|
||||||
|
char name[128];
|
||||||
|
|
||||||
|
std::vector<aiVector3D> vertices, normals;
|
||||||
|
std::vector<unsigned int> faces;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
} // end of namespace Assimp
|
||||||
|
|
||||||
|
#endif // AI_NFFIMPORTER_H_IN
|
|
@ -46,8 +46,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
#include "../include/aiAssert.h"
|
#include "../include/aiAssert.h"
|
||||||
|
|
||||||
namespace Assimp
|
namespace Assimp {
|
||||||
{
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
/** \brief Helper class to remove single and multi line comments from a file
|
/** \brief Helper class to remove single and multi line comments from a file
|
||||||
|
|
|
@ -50,7 +50,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
// public assimp headers
|
// public assimp headers
|
||||||
#include "../include/IOStream.h"
|
#include "../include/IOStream.h"
|
||||||
#include "../include/IOSystem.h"
|
#include "../include/IOSystem.h"
|
||||||
#include "../include/aiMesh.h"
|
|
||||||
#include "../include/aiScene.h"
|
#include "../include/aiScene.h"
|
||||||
#include "../include/aiAssert.h"
|
#include "../include/aiAssert.h"
|
||||||
#include "../include/DefaultLogger.h"
|
#include "../include/DefaultLogger.h"
|
||||||
|
|
|
@ -45,8 +45,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include "BaseImporter.h"
|
#include "BaseImporter.h"
|
||||||
#include "../include/aiTypes.h"
|
#include "../include/aiTypes.h"
|
||||||
|
|
||||||
namespace Assimp
|
namespace Assimp {
|
||||||
{
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
/** Clas to load STL files
|
/** Clas to load STL files
|
||||||
|
@ -90,7 +89,7 @@ protected:
|
||||||
|
|
||||||
// -------------------------------------------------------------------
|
// -------------------------------------------------------------------
|
||||||
/** Loads a binary .stl file
|
/** Loads a binary .stl file
|
||||||
* @return true if the default vertex color should be used as material color
|
* @return true if the default vertex color must be used as material color
|
||||||
*/
|
*/
|
||||||
bool LoadBinaryFile();
|
bool LoadBinaryFile();
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,82 @@
|
||||||
|
/*
|
||||||
|
Open Asset Import Library (ASSIMP)
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2006-2008, 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 Implementation of the StandardShapes class
|
||||||
|
*/
|
||||||
|
#include "../include/aiTypes.h"
|
||||||
|
#include "../include/DefaultLogger.h"
|
||||||
|
#include "../include/aiAssert.h"
|
||||||
|
|
||||||
|
#include "StandardShapes.h"
|
||||||
|
|
||||||
|
namespace Assimp {
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
void StandardShapes::MakeSphere(
|
||||||
|
aiVector3D& center,
|
||||||
|
float radius,
|
||||||
|
float tess,
|
||||||
|
std::vector<aiVector3D>& positions)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
void StandardShapes::MakeCone(
|
||||||
|
aiVector3D& center1,
|
||||||
|
float radius1,
|
||||||
|
aiVector3D& center2,
|
||||||
|
float radius2,
|
||||||
|
float tess,
|
||||||
|
std::vector<aiVector3D>& positions,
|
||||||
|
bool bOpened /*= false*/)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
void StandardShapes::MakeCircle(
|
||||||
|
aiVector3D& center,
|
||||||
|
aiVector3D& normal,
|
||||||
|
float radius,
|
||||||
|
float tess,
|
||||||
|
std::vector<aiVector3D>& positions)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
} // ! Assimp
|
|
@ -0,0 +1,118 @@
|
||||||
|
/*
|
||||||
|
Open Asset Import Library (ASSIMP)
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2006-2008, 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 Declares a helper class, "StandardShapes" which generates
|
||||||
|
* vertices for standard shapes, such as cylnders, cones, spheres ..
|
||||||
|
*/
|
||||||
|
#ifndef AI_STANDARD_SHAPES_H_INC
|
||||||
|
#define AI_STANDARD_SHAPES_H_INC
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
namespace Assimp {
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
/** \brief Helper class to generate vertex buffers for standard geometric
|
||||||
|
* shapes, such as cylinders, cones, boxes, spheres, elipsoids ... .
|
||||||
|
*/
|
||||||
|
class ASSIMP_API StandardShapes
|
||||||
|
{
|
||||||
|
// class cannot be instanced
|
||||||
|
StandardShapes() {}
|
||||||
|
|
||||||
|
public:
|
||||||
|
|
||||||
|
/** @brief Generates a sphere
|
||||||
|
*
|
||||||
|
* @param center Center point of the sphere
|
||||||
|
* @param radius Radius of the sphere
|
||||||
|
* @param tess Number of triangles in the equator line of the sphere
|
||||||
|
* @param positions Receives output triangles.
|
||||||
|
*/
|
||||||
|
static void MakeSphere(aiVector3D& center,float radius,float tess,
|
||||||
|
std::vector<aiVector3D>& positions);
|
||||||
|
|
||||||
|
/** @brief Generates a cone or a cylinder, either opened or closed.
|
||||||
|
*
|
||||||
|
* @code
|
||||||
|
*
|
||||||
|
* |-----| <- radius 1
|
||||||
|
*
|
||||||
|
* __x__ <- center 1
|
||||||
|
* / \
|
||||||
|
* / \
|
||||||
|
* / \
|
||||||
|
* / \
|
||||||
|
* /______x______\ <- center 2
|
||||||
|
*
|
||||||
|
* |-------------| <- radius 2
|
||||||
|
*
|
||||||
|
* @endcode
|
||||||
|
*
|
||||||
|
* @param center1 First center point
|
||||||
|
* @param radius1 First radius
|
||||||
|
* @param center2 Second center point
|
||||||
|
* @param radius2 Second radius
|
||||||
|
* @param tess Number of triangles per circle
|
||||||
|
* @param bOpened true for an open cone/cylinder.
|
||||||
|
* @param positions Receives output triangles.
|
||||||
|
*/
|
||||||
|
static void MakeCone(aiVector3D& center1,float radius1,
|
||||||
|
aiVector3D& center2,float radius2,float tess,
|
||||||
|
std::vector<aiVector3D>& positions,bool bOpened = false);
|
||||||
|
|
||||||
|
/** @brief Generates a flat circle
|
||||||
|
*
|
||||||
|
* @param center Center point of the circle
|
||||||
|
* @param radius Radius of the circle
|
||||||
|
* @param normal Normal vector of the circle.
|
||||||
|
* This is also the normal vector of all triangles generated by
|
||||||
|
* this function.
|
||||||
|
* @param tess Number of triangles
|
||||||
|
* @param positions Receives output triangles.
|
||||||
|
*/
|
||||||
|
static void MakeCircle(aiVector3D& center, aiVector3D& normal,
|
||||||
|
float radius, float tess,
|
||||||
|
std::vector<aiVector3D>& positions);
|
||||||
|
|
||||||
|
};
|
||||||
|
} // ! Assimp
|
||||||
|
|
||||||
|
#endif // !! AI_STANDARD_SHAPES_H_INC
|
|
@ -99,6 +99,12 @@ struct aiColor3D
|
||||||
aiColor3D (float _r, float _g, float _b) : r(_r), g(_g), b(_b) {}
|
aiColor3D (float _r, float _g, float _b) : r(_r), g(_g), b(_b) {}
|
||||||
aiColor3D (const aiColor3D& o) : r(o.r), g(o.g), b(o.b) {}
|
aiColor3D (const aiColor3D& o) : r(o.r), g(o.g), b(o.b) {}
|
||||||
|
|
||||||
|
bool operator == (const aiColor3D& other) const
|
||||||
|
{return r == other.r && g == other.g && b == other.b;}
|
||||||
|
|
||||||
|
bool operator != (const aiColor3D& other) const
|
||||||
|
{return r != other.r || g != other.g || b != other.b;}
|
||||||
|
|
||||||
#endif // !__cplusplus
|
#endif // !__cplusplus
|
||||||
|
|
||||||
//! Red, green and blue color values
|
//! Red, green and blue color values
|
||||||
|
@ -120,6 +126,12 @@ struct aiColor4D
|
||||||
aiColor4D (const aiColor4D& o)
|
aiColor4D (const aiColor4D& o)
|
||||||
: r(o.r), g(o.g), b(o.b), a(o.a) {}
|
: r(o.r), g(o.g), b(o.b), a(o.a) {}
|
||||||
|
|
||||||
|
bool operator == (const aiColor4D& other) const
|
||||||
|
{return r == other.r && g == other.g && b == other.b && a == other.a;}
|
||||||
|
|
||||||
|
bool operator != (const aiColor4D& other) const
|
||||||
|
{return r != other.r || g != other.g || b != other.b || a != other.a;}
|
||||||
|
|
||||||
#endif // !__cplusplus
|
#endif // !__cplusplus
|
||||||
|
|
||||||
//! Red, green, blue and alpha color values
|
//! Red, green, blue and alpha color values
|
||||||
|
|
|
@ -818,6 +818,10 @@
|
||||||
RelativePath="..\..\code\SplitLargeMeshes.h"
|
RelativePath="..\..\code\SplitLargeMeshes.h"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\code\StandardShapes.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\..\code\StringComparison.h"
|
RelativePath="..\..\code\StringComparison.h"
|
||||||
>
|
>
|
||||||
|
@ -1085,6 +1089,18 @@
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
</Filter>
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="RAW"
|
||||||
|
>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="NFF"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\code\NFFLoader.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
</Filter>
|
</Filter>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter
|
<Filter
|
||||||
|
@ -1190,6 +1206,10 @@
|
||||||
RelativePath="..\..\code\SplitLargeMeshes.cpp"
|
RelativePath="..\..\code\SplitLargeMeshes.cpp"
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\code\StandardShapes.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
<File
|
<File
|
||||||
RelativePath="..\..\code\TextureTransform.cpp"
|
RelativePath="..\..\code\TextureTransform.cpp"
|
||||||
>
|
>
|
||||||
|
@ -1377,6 +1397,18 @@
|
||||||
>
|
>
|
||||||
</File>
|
</File>
|
||||||
</Filter>
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="RAW"
|
||||||
|
>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="NFF"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath="..\..\code\NFFLoader.cpp"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
</Filter>
|
</Filter>
|
||||||
</Filter>
|
</Filter>
|
||||||
<Filter
|
<Filter
|
||||||
|
|
Loading…
Reference in New Issue