commit
ae0850b88c
|
@ -2,7 +2,7 @@ sudo: required
|
||||||
language: cpp
|
language: cpp
|
||||||
|
|
||||||
before_install:
|
before_install:
|
||||||
- if [ "$TRAVIS_OS_NAME" = "linux" ]; then sudo apt-get update -qq && sudo apt-get install cmake && sudo apt-get install cmake python3 && sudo apt-get install -qq freeglut3-dev libxmu-dev libxi-dev ; fi
|
- if [ "$TRAVIS_OS_NAME" = "linux" ]; then sudo apt-get update -qq && sudo apt-get install cmake && sudo apt-get install cmake python3 && sudo apt-get install -qq freeglut3-dev libxmu-dev libxi-dev ; echo -n | openssl s_client -connect scan.coverity.com:443 | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' | sudo tee -a /etc/ssl/certs/ca- ; fi
|
||||||
- if [ "$TRAVIS_OS_NAME" = "osx" ]; then brew install cmake python3 homebrew/x11/freeglut; fi
|
- if [ "$TRAVIS_OS_NAME" = "osx" ]; then brew install cmake python3 homebrew/x11/freeglut; fi
|
||||||
- echo -e "#ifndef A_R_H_INC\n#define A_R_H_INC\n#define GitVersion ${TRAVIS_JOB_ID}\n#define GitBranch \"${TRAVIS_BRANCH}\"\n#endif // A_R_H_INC" > revision.h
|
- echo -e "#ifndef A_R_H_INC\n#define A_R_H_INC\n#define GitVersion ${TRAVIS_JOB_ID}\n#define GitBranch \"${TRAVIS_BRANCH}\"\n#endif // A_R_H_INC" > revision.h
|
||||||
# install latest LCOV (1.9 was failing)
|
# install latest LCOV (1.9 was failing)
|
||||||
|
@ -16,6 +16,7 @@ osx_image: xcode8.3
|
||||||
|
|
||||||
env:
|
env:
|
||||||
global:
|
global:
|
||||||
|
# COVERITY_SCAN_TOKEN
|
||||||
- secure: "lZ7pHQvl5dpZWzBQAaIMf0wqrvtcZ4wiZKeIZjf83TEsflW8+z0uTpIuN30ZV6Glth/Sq1OhLnTP5+N57fZU/1ebA5twHdvP4bS5CIUUg71/CXQZNl36xeaqvxsG/xRrdpKOsPdjAOsQ9KPTQulsX43XDLS7CasMiLvYOpqKcPc="
|
- secure: "lZ7pHQvl5dpZWzBQAaIMf0wqrvtcZ4wiZKeIZjf83TEsflW8+z0uTpIuN30ZV6Glth/Sq1OhLnTP5+N57fZU/1ebA5twHdvP4bS5CIUUg71/CXQZNl36xeaqvxsG/xRrdpKOsPdjAOsQ9KPTQulsX43XDLS7CasMiLvYOpqKcPc="
|
||||||
- PV=r8e PLATF=linux-x86_64 NDK_HOME=${TRAVIS_BUILD_DIR}/android-ndk-${PV} PATH=${PATH}:${NDK_HOME}
|
- PV=r8e PLATF=linux-x86_64 NDK_HOME=${TRAVIS_BUILD_DIR}/android-ndk-${PV} PATH=${PATH}:${NDK_HOME}
|
||||||
matrix:
|
matrix:
|
||||||
|
@ -23,11 +24,7 @@ env:
|
||||||
- LINUX=1 TRAVIS_NO_EXPORT=NO ENABLE_COVERALLS=OFF
|
- LINUX=1 TRAVIS_NO_EXPORT=NO ENABLE_COVERALLS=OFF
|
||||||
- LINUX=1 SHARED_BUILD=ON ENABLE_COVERALLS=OFF
|
- LINUX=1 SHARED_BUILD=ON ENABLE_COVERALLS=OFF
|
||||||
- LINUX=1 SHARED_BUILD=OFF ENABLE_COVERALLS=OFF
|
- LINUX=1 SHARED_BUILD=OFF ENABLE_COVERALLS=OFF
|
||||||
#exclude:
|
|
||||||
# - os: linux
|
|
||||||
# compiler: clang
|
|
||||||
# - os: osx
|
|
||||||
# compiler: gcc
|
|
||||||
compiler:
|
compiler:
|
||||||
- gcc
|
- gcc
|
||||||
- clang
|
- clang
|
||||||
|
|
|
@ -78,12 +78,10 @@ OPTION ( ASSIMP_COVERALLS
|
||||||
"Eańable this to measure test coverage."
|
"Eańable this to measure test coverage."
|
||||||
OFF
|
OFF
|
||||||
)
|
)
|
||||||
|
|
||||||
option ( SYSTEM_IRRXML
|
option ( SYSTEM_IRRXML
|
||||||
"Use system installed Irrlicht/IrrXML library."
|
"Use system installed Irrlicht/IrrXML library."
|
||||||
OFF
|
OFF
|
||||||
)
|
)
|
||||||
|
|
||||||
OPTION ( BUILD_DOCS
|
OPTION ( BUILD_DOCS
|
||||||
"Build documentation using Doxygen."
|
"Build documentation using Doxygen."
|
||||||
OFF
|
OFF
|
||||||
|
|
16
Readme.md
16
Readme.md
|
@ -1,6 +1,6 @@
|
||||||
Open Asset Import Library (assimp)
|
Open Asset Import Library (assimp)
|
||||||
==================================
|
==================================
|
||||||
|
### Current build status ###
|
||||||
[![Linux Build Status](https://travis-ci.org/assimp/assimp.svg)](https://travis-ci.org/assimp/assimp)
|
[![Linux Build Status](https://travis-ci.org/assimp/assimp.svg)](https://travis-ci.org/assimp/assimp)
|
||||||
[![Windows Build Status](https://ci.appveyor.com/api/projects/status/tmo433wax6u6cjp4?svg=true)](https://ci.appveyor.com/project/kimkulling/assimp)
|
[![Windows Build Status](https://ci.appveyor.com/api/projects/status/tmo433wax6u6cjp4?svg=true)](https://ci.appveyor.com/project/kimkulling/assimp)
|
||||||
<a href="https://scan.coverity.com/projects/5607">
|
<a href="https://scan.coverity.com/projects/5607">
|
||||||
|
@ -9,22 +9,19 @@ Open Asset Import Library (assimp)
|
||||||
</a>
|
</a>
|
||||||
<span class="badge-patreon"><a href="https://www.patreon.com/assimp" title="Donate to this project using Patreon"><img src="https://img.shields.io/badge/patreon-donate-yellow.svg" alt="Patreon donate button" /></a></span>
|
<span class="badge-patreon"><a href="https://www.patreon.com/assimp" title="Donate to this project using Patreon"><img src="https://img.shields.io/badge/patreon-donate-yellow.svg" alt="Patreon donate button" /></a></span>
|
||||||
[![Coverage Status](https://coveralls.io/repos/github/assimp/assimp/badge.svg?branch=master)](https://coveralls.io/github/assimp/assimp?branch=master)
|
[![Coverage Status](https://coveralls.io/repos/github/assimp/assimp/badge.svg?branch=master)](https://coveralls.io/github/assimp/assimp?branch=master)
|
||||||
|
[![Join the chat at https://gitter.im/assimp/assimp](https://badges.gitter.im/assimp/assimp.svg)](https://gitter.im/assimp/assimp?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||||
<br>
|
<br>
|
||||||
|
|
||||||
APIs are provided for C and C++. There are various bindings to other languages (C#, Java, Python, Delphi, D). Assimp also runs on Android and iOS.
|
APIs are provided for C and C++. There are various bindings to other languages (C#, Java, Python, Delphi, D). Assimp also runs on Android and iOS.
|
||||||
|
|
||||||
Additionally, assimp features various __mesh post processing tools__: normals and tangent space generation, triangulation, vertex cache locality optimization, removal of degenerate primitives and duplicate vertices, sorting by primitive type, merging of redundant materials and many more.
|
Additionally, assimp features various __mesh post processing tools__: normals and tangent space generation, triangulation, vertex cache locality optimization, removal of degenerate primitives and duplicate vertices, sorting by primitive type, merging of redundant materials and many more.
|
||||||
|
|
||||||
This is the development trunk containing the latest features and bugfixes. For productive use though, we recommend one of the stable releases available from [assimp.sf.net](http://assimp.sf.net) or from *nix package repositories.
|
This is the development repo containing the latest features and bugfixes. For productive use though, we recommend one of the stable releases available from [Github Assimp Releases](https://github.com/assimp/assimp/releases).
|
||||||
The current build status is:
|
|
||||||
|
|
||||||
Gitter chat: [![Join the chat at https://gitter.im/assimp/assimp](https://badges.gitter.im/assimp/assimp.svg)](https://gitter.im/assimp/assimp?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)<br>
|
One-off donations via PayPal:
|
||||||
|
<br>[![PayPal](https://www.paypalobjects.com/en_US/i/btn/btn_donate_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=4JRJVPXC4QJM4)
|
||||||
And we also have an IRC-channel at freenode: #assetimporterlib . You can easily join us via: [KiwiIRC/freenote](https://kiwiirc.com/client/irc.freenode.net), choose your nickname and type
|
|
||||||
> /join #assetimporterlib
|
|
||||||
|
|
||||||
<br>
|
<br>
|
||||||
__[open3mod](https://github.com/acgessler/open3mod) is a powerful 3D model viewer based on Assimp's import and export abilities.__
|
|
||||||
|
|
||||||
Please check our Wiki as well: https://github.com/assimp/assimp/wiki
|
Please check our Wiki as well: https://github.com/assimp/assimp/wiki
|
||||||
|
|
||||||
|
@ -100,6 +97,9 @@ Take a look into the `INSTALL` file. Our build system is CMake, if you used CMak
|
||||||
* [Pascal](port/AssimpPascal/Readme.md)
|
* [Pascal](port/AssimpPascal/Readme.md)
|
||||||
* [Javascript (Alpha)](https://github.com/makc/assimp2json)
|
* [Javascript (Alpha)](https://github.com/makc/assimp2json)
|
||||||
|
|
||||||
|
### Other tools ###
|
||||||
|
[open3mod](https://github.com/acgessler/open3mod) is a powerful 3D model viewer based on Assimp's import and export abilities.
|
||||||
|
|
||||||
#### Repository structure ####
|
#### Repository structure ####
|
||||||
Open Asset Import Library is implemented in C++. The directory structure is:
|
Open Asset Import Library is implemented in C++. The directory structure is:
|
||||||
|
|
||||||
|
|
|
@ -46,7 +46,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include "3DSExporter.h"
|
#include "3DSExporter.h"
|
||||||
#include "3DSLoader.h"
|
#include "3DSLoader.h"
|
||||||
#include "3DSHelper.h"
|
#include "3DSHelper.h"
|
||||||
#include "SceneCombiner.h"
|
#include <assimp/SceneCombiner.h>
|
||||||
#include "SplitLargeMeshes.h"
|
#include "SplitLargeMeshes.h"
|
||||||
#include "StringComparison.h"
|
#include "StringComparison.h"
|
||||||
#include <assimp/IOSystem.hpp>
|
#include <assimp/IOSystem.hpp>
|
||||||
|
|
|
@ -50,7 +50,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include "AMFImporter.hpp"
|
#include "AMFImporter.hpp"
|
||||||
|
|
||||||
// Header files, Assimp.
|
// Header files, Assimp.
|
||||||
#include "SceneCombiner.h"
|
#include <assimp/SceneCombiner.h>
|
||||||
#include "StandardShapes.h"
|
#include "StandardShapes.h"
|
||||||
#include "StringUtils.h"
|
#include "StringUtils.h"
|
||||||
|
|
||||||
|
|
|
@ -46,6 +46,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
#ifndef ASSIMP_BUILD_NO_ASE_IMPORTER
|
#ifndef ASSIMP_BUILD_NO_ASE_IMPORTER
|
||||||
|
|
||||||
|
#ifndef ASSIMP_BUILD_NO_3DS_IMPORTER
|
||||||
|
|
||||||
// internal headers
|
// internal headers
|
||||||
#include "ASELoader.h"
|
#include "ASELoader.h"
|
||||||
#include "StringComparison.h"
|
#include "StringComparison.h"
|
||||||
|
@ -1320,4 +1322,6 @@ bool ASEImporter::GenerateNormals(ASE::Mesh& mesh) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif // ASSIMP_BUILD_NO_3DS_IMPORTER
|
||||||
|
|
||||||
#endif // !! ASSIMP_BUILD_NO_BASE_IMPORTER
|
#endif // !! ASSIMP_BUILD_NO_BASE_IMPORTER
|
||||||
|
|
|
@ -53,6 +53,7 @@ struct aiNode;
|
||||||
|
|
||||||
namespace Assimp {
|
namespace Assimp {
|
||||||
|
|
||||||
|
#ifndef ASSIMP_BUILD_NO_3DS_IMPORTER
|
||||||
|
|
||||||
// --------------------------------------------------------------------------------
|
// --------------------------------------------------------------------------------
|
||||||
/** Importer class for the 3DS ASE ASCII format.
|
/** Importer class for the 3DS ASE ASCII format.
|
||||||
|
@ -63,9 +64,6 @@ public:
|
||||||
ASEImporter();
|
ASEImporter();
|
||||||
~ASEImporter();
|
~ASEImporter();
|
||||||
|
|
||||||
|
|
||||||
public:
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------
|
// -------------------------------------------------------------------
|
||||||
/** Returns whether the class can handle the format of the given file.
|
/** Returns whether the class can handle the format of the given file.
|
||||||
* See BaseImporter::CanRead() for details.
|
* See BaseImporter::CanRead() for details.
|
||||||
|
@ -201,6 +199,9 @@ protected:
|
||||||
bool noSkeletonMesh;
|
bool noSkeletonMesh;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
#endif // ASSIMP_BUILD_NO_3DS_IMPORTER
|
||||||
|
|
||||||
} // end of namespace Assimp
|
} // end of namespace Assimp
|
||||||
|
|
||||||
|
|
||||||
#endif // AI_3DSIMPORTER_H_INC
|
#endif // AI_3DSIMPORTER_H_INC
|
||||||
|
|
|
@ -46,6 +46,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
|
||||||
#ifndef ASSIMP_BUILD_NO_ASE_IMPORTER
|
#ifndef ASSIMP_BUILD_NO_ASE_IMPORTER
|
||||||
|
#ifndef ASSIMP_BUILD_NO_3DS_IMPORTER
|
||||||
|
|
||||||
// internal headers
|
// internal headers
|
||||||
#include "TextureTransform.h"
|
#include "TextureTransform.h"
|
||||||
|
@ -2151,4 +2152,6 @@ void Parser::ParseLV4MeshLong(unsigned int& iOut)
|
||||||
iOut = strtoul10(filePtr,&filePtr);
|
iOut = strtoul10(filePtr,&filePtr);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif // ASSIMP_BUILD_NO_3DS_IMPORTER
|
||||||
|
|
||||||
#endif // !! ASSIMP_BUILD_NO_BASE_IMPORTER
|
#endif // !! ASSIMP_BUILD_NO_BASE_IMPORTER
|
||||||
|
|
|
@ -49,6 +49,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include <assimp/mesh.h>
|
#include <assimp/mesh.h>
|
||||||
#include <assimp/anim.h>
|
#include <assimp/anim.h>
|
||||||
|
|
||||||
|
#ifndef ASSIMP_BUILD_NO_3DS_IMPORTER
|
||||||
|
|
||||||
// for some helper routines like IsSpace()
|
// for some helper routines like IsSpace()
|
||||||
#include "ParsingUtils.h"
|
#include "ParsingUtils.h"
|
||||||
#include "qnan.h"
|
#include "qnan.h"
|
||||||
|
@ -662,4 +664,6 @@ public:
|
||||||
} // Namespace ASE
|
} // Namespace ASE
|
||||||
} // Namespace ASSIMP
|
} // Namespace ASSIMP
|
||||||
|
|
||||||
|
#endif // ASSIMP_BUILD_NO_3DS_IMPORTER
|
||||||
|
|
||||||
#endif // !! include guard
|
#endif // !! include guard
|
||||||
|
|
|
@ -325,10 +325,13 @@ inline size_t WriteArray(IOStream * stream, const T* in, unsigned int size)
|
||||||
{
|
{
|
||||||
AssbinChunkWriter chunk( container, ASSBIN_CHUNK_AINODE );
|
AssbinChunkWriter chunk( container, ASSBIN_CHUNK_AINODE );
|
||||||
|
|
||||||
|
size_t nb_metadata = (node->mMetaData != NULL ? node->mMetaData->mNumProperties : 0);
|
||||||
|
|
||||||
Write<aiString>(&chunk,node->mName);
|
Write<aiString>(&chunk,node->mName);
|
||||||
Write<aiMatrix4x4>(&chunk,node->mTransformation);
|
Write<aiMatrix4x4>(&chunk,node->mTransformation);
|
||||||
Write<unsigned int>(&chunk,node->mNumChildren);
|
Write<unsigned int>(&chunk,node->mNumChildren);
|
||||||
Write<unsigned int>(&chunk,node->mNumMeshes);
|
Write<unsigned int>(&chunk,node->mNumMeshes);
|
||||||
|
Write<unsigned int>(&chunk,nb_metadata);
|
||||||
|
|
||||||
for (unsigned int i = 0; i < node->mNumMeshes;++i) {
|
for (unsigned int i = 0; i < node->mNumMeshes;++i) {
|
||||||
Write<unsigned int>(&chunk,node->mMeshes[i]);
|
Write<unsigned int>(&chunk,node->mMeshes[i]);
|
||||||
|
@ -337,6 +340,39 @@ inline size_t WriteArray(IOStream * stream, const T* in, unsigned int size)
|
||||||
for (unsigned int i = 0; i < node->mNumChildren;++i) {
|
for (unsigned int i = 0; i < node->mNumChildren;++i) {
|
||||||
WriteBinaryNode( &chunk, node->mChildren[i] );
|
WriteBinaryNode( &chunk, node->mChildren[i] );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < nb_metadata; ++i) {
|
||||||
|
const aiString& key = node->mMetaData->mKeys[i];
|
||||||
|
aiMetadataType type = node->mMetaData->mValues[i].mType;
|
||||||
|
void* value = node->mMetaData->mValues[i].mData;
|
||||||
|
|
||||||
|
Write<aiString>(&chunk, key);
|
||||||
|
Write<uint16_t>(&chunk, type);
|
||||||
|
|
||||||
|
switch (type) {
|
||||||
|
case AI_BOOL:
|
||||||
|
Write<bool>(&chunk, *((bool*) value));
|
||||||
|
break;
|
||||||
|
case AI_INT32:
|
||||||
|
Write<int32_t>(&chunk, *((int32_t*) value));
|
||||||
|
break;
|
||||||
|
case AI_UINT64:
|
||||||
|
Write<uint64_t>(&chunk, *((uint64_t*) value));
|
||||||
|
break;
|
||||||
|
case AI_FLOAT:
|
||||||
|
Write<float>(&chunk, *((float*) value));
|
||||||
|
break;
|
||||||
|
case AI_DOUBLE:
|
||||||
|
Write<double>(&chunk, *((double*) value));
|
||||||
|
break;
|
||||||
|
case AI_AISTRING:
|
||||||
|
Write<aiString>(&chunk, *((aiString*) value));
|
||||||
|
break;
|
||||||
|
case AI_AIVECTOR3D:
|
||||||
|
Write<aiVector3D>(&chunk, *((aiVector3D*) value));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------------
|
||||||
|
|
|
@ -210,6 +210,8 @@ void AssbinImporter::ReadBinaryNode( IOStream * stream, aiNode** node, aiNode* p
|
||||||
(*node)->mTransformation = Read<aiMatrix4x4>(stream);
|
(*node)->mTransformation = Read<aiMatrix4x4>(stream);
|
||||||
(*node)->mNumChildren = Read<unsigned int>(stream);
|
(*node)->mNumChildren = Read<unsigned int>(stream);
|
||||||
(*node)->mNumMeshes = Read<unsigned int>(stream);
|
(*node)->mNumMeshes = Read<unsigned int>(stream);
|
||||||
|
unsigned int nb_metadata = Read<unsigned int>(stream);
|
||||||
|
|
||||||
if(parent)
|
if(parent)
|
||||||
{
|
{
|
||||||
(*node)->mParent = parent;
|
(*node)->mParent = parent;
|
||||||
|
@ -231,6 +233,41 @@ void AssbinImporter::ReadBinaryNode( IOStream * stream, aiNode** node, aiNode* p
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (nb_metadata)
|
||||||
|
{
|
||||||
|
(*node)->mMetaData = aiMetadata::Alloc(nb_metadata);
|
||||||
|
for (unsigned int i = 0; i < nb_metadata; ++i) {
|
||||||
|
(*node)->mMetaData->mKeys[i] = Read<aiString>(stream);
|
||||||
|
(*node)->mMetaData->mValues[i].mType = (aiMetadataType) Read<uint16_t>(stream);
|
||||||
|
void* data = NULL;
|
||||||
|
|
||||||
|
switch ((*node)->mMetaData->mValues[i].mType) {
|
||||||
|
case AI_BOOL:
|
||||||
|
data = new bool(Read<bool>(stream));
|
||||||
|
break;
|
||||||
|
case AI_INT32:
|
||||||
|
data = new int32_t(Read<int32_t>(stream));
|
||||||
|
break;
|
||||||
|
case AI_UINT64:
|
||||||
|
data = new uint64_t(Read<uint64_t>(stream));
|
||||||
|
break;
|
||||||
|
case AI_FLOAT:
|
||||||
|
data = new float(Read<float>(stream));
|
||||||
|
break;
|
||||||
|
case AI_DOUBLE:
|
||||||
|
data = new double(Read<double>(stream));
|
||||||
|
break;
|
||||||
|
case AI_AISTRING:
|
||||||
|
data = new aiString(Read<aiString>(stream));
|
||||||
|
break;
|
||||||
|
case AI_AIVECTOR3D:
|
||||||
|
data = new aiVector3D(Read<aiVector3D>(stream));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
(*node)->mMetaData->mValues[i].mData = data;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// -----------------------------------------------------------------------------------
|
// -----------------------------------------------------------------------------------
|
||||||
|
|
|
@ -45,8 +45,9 @@ Assimp C export interface. See Exporter.cpp for some notes.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef ASSIMP_BUILD_NO_EXPORT
|
#ifndef ASSIMP_BUILD_NO_EXPORT
|
||||||
|
|
||||||
#include "CInterfaceIOWrapper.h"
|
#include "CInterfaceIOWrapper.h"
|
||||||
#include "SceneCombiner.h"
|
#include <assimp/SceneCombiner.h>
|
||||||
#include "ScenePrivate.h"
|
#include "ScenePrivate.h"
|
||||||
#include <assimp/Exporter.hpp>
|
#include <assimp/Exporter.hpp>
|
||||||
|
|
||||||
|
|
|
@ -337,7 +337,6 @@ void BaseImporter::ConvertToUTF8(std::vector<char>& data)
|
||||||
if(*((uint32_t*)&data.front()) == 0x0000FFFE) {
|
if(*((uint32_t*)&data.front()) == 0x0000FFFE) {
|
||||||
DefaultLogger::get()->debug("Found UTF-32 BOM ...");
|
DefaultLogger::get()->debug("Found UTF-32 BOM ...");
|
||||||
|
|
||||||
const uint32_t* sstart = (uint32_t*)&data.front()+1, *send = (uint32_t*)&data.back()+1;
|
|
||||||
std::vector<char> output;
|
std::vector<char> output;
|
||||||
int *ptr = (int*)&data[ 0 ];
|
int *ptr = (int*)&data[ 0 ];
|
||||||
int *end = ptr + ( data.size() / sizeof(int) ) +1;
|
int *end = ptr + ( data.size() / sizeof(int) ) +1;
|
||||||
|
@ -358,11 +357,7 @@ void BaseImporter::ConvertToUTF8(std::vector<char>& data)
|
||||||
if(*((uint16_t*)&data.front()) == 0xFEFF) {
|
if(*((uint16_t*)&data.front()) == 0xFEFF) {
|
||||||
DefaultLogger::get()->debug("Found UTF-16 BOM ...");
|
DefaultLogger::get()->debug("Found UTF-16 BOM ...");
|
||||||
|
|
||||||
const uint16_t* sstart = (uint16_t*)&data.front()+1, *send = (uint16_t*)(&data.back()+1);
|
|
||||||
std::vector<unsigned char> output;
|
std::vector<unsigned char> output;
|
||||||
int16_t *ptr = (int16_t*) &data[ 0 ];
|
|
||||||
int16_t *end = ptr + (data.size() / sizeof(int)) + 1;
|
|
||||||
|
|
||||||
utf8::utf16to8(data.begin(), data.end(), back_inserter(output));
|
utf8::utf16to8(data.begin(), data.end(), back_inserter(output));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
|
@ -253,10 +253,7 @@ public:
|
||||||
* a compiler complain is the result.
|
* a compiler complain is the result.
|
||||||
* @param dest Destination value to be written
|
* @param dest Destination value to be written
|
||||||
* @param db File database, including input stream. */
|
* @param db File database, including input stream. */
|
||||||
template <typename T> inline void Convert (T& dest,
|
template <typename T> inline void Convert (T& dest, const FileDatabase& db) const;
|
||||||
const FileDatabase& db) const;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// --------------------------------------------------------
|
// --------------------------------------------------------
|
||||||
// generic converter
|
// generic converter
|
||||||
|
|
|
@ -43,10 +43,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
* @brief Implementation of some blender modifiers (i.e subdivision, mirror).
|
* @brief Implementation of some blender modifiers (i.e subdivision, mirror).
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef ASSIMP_BUILD_NO_BLEND_IMPORTER
|
#ifndef ASSIMP_BUILD_NO_BLEND_IMPORTER
|
||||||
|
|
||||||
#include "BlenderModifier.h"
|
#include "BlenderModifier.h"
|
||||||
#include "SceneCombiner.h"
|
#include <assimp/SceneCombiner.h>
|
||||||
#include "Subdivision.h"
|
#include "Subdivision.h"
|
||||||
#include <assimp/scene.h>
|
#include <assimp/scene.h>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
|
@ -266,7 +266,7 @@ void BlenderModifier_Mirror :: DoIt(aiNode& out, ConversionData& conv_data, co
|
||||||
|
|
||||||
std::copy(out.mMeshes,out.mMeshes+out.mNumMeshes,nind);
|
std::copy(out.mMeshes,out.mMeshes+out.mNumMeshes,nind);
|
||||||
std::transform(out.mMeshes,out.mMeshes+out.mNumMeshes,nind+out.mNumMeshes,
|
std::transform(out.mMeshes,out.mMeshes+out.mNumMeshes,nind+out.mNumMeshes,
|
||||||
std::bind1st(std::plus< unsigned int >(),out.mNumMeshes));
|
[&out](unsigned int n) { return out.mNumMeshes + n; });
|
||||||
|
|
||||||
delete[] out.mMeshes;
|
delete[] out.mMeshes;
|
||||||
out.mMeshes = nind;
|
out.mMeshes = nind;
|
||||||
|
|
|
@ -96,6 +96,7 @@ SET( PUBLIC_HEADERS
|
||||||
${HEADER_PATH}/Exporter.hpp
|
${HEADER_PATH}/Exporter.hpp
|
||||||
${HEADER_PATH}/DefaultIOStream.h
|
${HEADER_PATH}/DefaultIOStream.h
|
||||||
${HEADER_PATH}/DefaultIOSystem.h
|
${HEADER_PATH}/DefaultIOSystem.h
|
||||||
|
${HEADER_PATH}/SceneCombiner.h
|
||||||
)
|
)
|
||||||
|
|
||||||
SET( Core_SRCS
|
SET( Core_SRCS
|
||||||
|
@ -148,7 +149,6 @@ SET( Common_SRCS
|
||||||
SpatialSort.cpp
|
SpatialSort.cpp
|
||||||
SpatialSort.h
|
SpatialSort.h
|
||||||
SceneCombiner.cpp
|
SceneCombiner.cpp
|
||||||
SceneCombiner.h
|
|
||||||
ScenePreprocessor.cpp
|
ScenePreprocessor.cpp
|
||||||
ScenePreprocessor.h
|
ScenePreprocessor.h
|
||||||
SkeletonMeshBuilder.cpp
|
SkeletonMeshBuilder.cpp
|
||||||
|
@ -647,6 +647,9 @@ ADD_ASSIMP_IMPORTER(X3D
|
||||||
X3DImporter_Rendering.cpp
|
X3DImporter_Rendering.cpp
|
||||||
X3DImporter_Shape.cpp
|
X3DImporter_Shape.cpp
|
||||||
X3DImporter_Texturing.cpp
|
X3DImporter_Texturing.cpp
|
||||||
|
FIReader.hpp
|
||||||
|
FIReader.cpp
|
||||||
|
X3DVocabulary.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
ADD_ASSIMP_IMPORTER( GLTF
|
ADD_ASSIMP_IMPORTER( GLTF
|
||||||
|
@ -732,10 +735,12 @@ SET ( openddl_parser_SRCS
|
||||||
../contrib/openddlparser/code/OpenDDLCommon.cpp
|
../contrib/openddlparser/code/OpenDDLCommon.cpp
|
||||||
../contrib/openddlparser/code/OpenDDLExport.cpp
|
../contrib/openddlparser/code/OpenDDLExport.cpp
|
||||||
../contrib/openddlparser/code/Value.cpp
|
../contrib/openddlparser/code/Value.cpp
|
||||||
|
../contrib/openddlparser/code/OpenDDLStream.cpp
|
||||||
../contrib/openddlparser/include/openddlparser/OpenDDLParser.h
|
../contrib/openddlparser/include/openddlparser/OpenDDLParser.h
|
||||||
../contrib/openddlparser/include/openddlparser/OpenDDLParserUtils.h
|
../contrib/openddlparser/include/openddlparser/OpenDDLParserUtils.h
|
||||||
../contrib/openddlparser/include/openddlparser/OpenDDLCommon.h
|
../contrib/openddlparser/include/openddlparser/OpenDDLCommon.h
|
||||||
../contrib/openddlparser/include/openddlparser/OpenDDLExport.h
|
../contrib/openddlparser/include/openddlparser/OpenDDLExport.h
|
||||||
|
../contrib/openddlparser/include/openddlparser/OpenDDLStream.h
|
||||||
../contrib/openddlparser/include/openddlparser/DDLNode.h
|
../contrib/openddlparser/include/openddlparser/DDLNode.h
|
||||||
../contrib/openddlparser/include/openddlparser/Value.h
|
../contrib/openddlparser/include/openddlparser/Value.h
|
||||||
)
|
)
|
||||||
|
|
|
@ -45,7 +45,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include "ColladaExporter.h"
|
#include "ColladaExporter.h"
|
||||||
#include "Bitmap.h"
|
#include "Bitmap.h"
|
||||||
#include "fast_atof.h"
|
#include "fast_atof.h"
|
||||||
#include "SceneCombiner.h"
|
#include <assimp/SceneCombiner.h>
|
||||||
#include "StringUtils.h"
|
#include "StringUtils.h"
|
||||||
#include "XMLTools.h"
|
#include "XMLTools.h"
|
||||||
#include <assimp/DefaultIOSystem.h>
|
#include <assimp/DefaultIOSystem.h>
|
||||||
|
|
|
@ -132,7 +132,6 @@ void ColladaLoader::SetupProperties(const Importer* pImp)
|
||||||
ignoreUpDirection = pImp->GetPropertyInteger(AI_CONFIG_IMPORT_COLLADA_IGNORE_UP_DIRECTION,0) != 0;
|
ignoreUpDirection = pImp->GetPropertyInteger(AI_CONFIG_IMPORT_COLLADA_IGNORE_UP_DIRECTION,0) != 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
// Get file extension list
|
// Get file extension list
|
||||||
const aiImporterDesc* ColladaLoader::GetInfo () const
|
const aiImporterDesc* ColladaLoader::GetInfo () const
|
||||||
|
@ -1904,14 +1903,13 @@ const Collada::Node* ColladaLoader::FindNodeBySID( const Collada::Node* pNode, c
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
// Finds a proper name for a node derived from the collada-node's properties
|
// Finds a proper unique name for a node derived from the collada-node's properties.
|
||||||
|
// The name must be unique for proper node-bone association.
|
||||||
std::string ColladaLoader::FindNameForNode( const Collada::Node* pNode)
|
std::string ColladaLoader::FindNameForNode( const Collada::Node* pNode)
|
||||||
{
|
{
|
||||||
// now setup the name of the node. We take the name if not empty, otherwise the collada ID
|
// Now setup the name of the assimp node. The collada name might not be
|
||||||
// FIX: Workaround for XSI calling the instanced visual scene 'untitled' by default.
|
// unique, so we use the collada ID.
|
||||||
if (!pNode->mName.empty() && pNode->mName != "untitled")
|
if (!pNode->mID.empty())
|
||||||
return pNode->mName;
|
|
||||||
else if (!pNode->mID.empty())
|
|
||||||
return pNode->mID;
|
return pNode->mID;
|
||||||
else if (!pNode->mSID.empty())
|
else if (!pNode->mSID.empty())
|
||||||
return pNode->mSID;
|
return pNode->mSID;
|
||||||
|
|
|
@ -44,7 +44,6 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
* @brief Implementation of the Collada parser helper
|
* @brief Implementation of the Collada parser helper
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
|
||||||
#ifndef ASSIMP_BUILD_NO_COLLADA_IMPORTER
|
#ifndef ASSIMP_BUILD_NO_COLLADA_IMPORTER
|
||||||
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
@ -1866,7 +1865,7 @@ void ColladaParser::ReadMesh( Mesh* pMesh)
|
||||||
ReadIndexData( pMesh);
|
ReadIndexData( pMesh);
|
||||||
} else
|
} else
|
||||||
{
|
{
|
||||||
// ignore the rest
|
// ignore the restf
|
||||||
SkipElement();
|
SkipElement();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -2216,8 +2215,9 @@ void ColladaParser::ReadIndexData( Mesh* pMesh)
|
||||||
else if (IsElement("extra"))
|
else if (IsElement("extra"))
|
||||||
{
|
{
|
||||||
SkipElement("extra");
|
SkipElement("extra");
|
||||||
} else
|
} else if ( IsElement("ph")) {
|
||||||
{
|
SkipElement("ph");
|
||||||
|
} else {
|
||||||
ThrowException( format() << "Unexpected sub element <" << mReader->getNodeName() << "> in tag <" << elementName << ">" );
|
ThrowException( format() << "Unexpected sub element <" << mReader->getNodeName() << "> in tag <" << elementName << ">" );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -54,7 +54,7 @@ Here we implement only the C++ interface (Assimp::Exporter).
|
||||||
#ifndef ASSIMP_BUILD_NO_EXPORT
|
#ifndef ASSIMP_BUILD_NO_EXPORT
|
||||||
|
|
||||||
#include "BlobIOSystem.h"
|
#include "BlobIOSystem.h"
|
||||||
#include "SceneCombiner.h"
|
#include <assimp/SceneCombiner.h>
|
||||||
#include "BaseProcess.h"
|
#include "BaseProcess.h"
|
||||||
#include "Importer.h" // need this for GetPostProcessingStepInstanceList()
|
#include "Importer.h" // need this for GetPostProcessingStepInstanceList()
|
||||||
|
|
||||||
|
@ -172,8 +172,10 @@ public:
|
||||||
GetPostProcessingStepInstanceList(mPostProcessingSteps);
|
GetPostProcessingStepInstanceList(mPostProcessingSteps);
|
||||||
|
|
||||||
// grab all built-in exporters
|
// grab all built-in exporters
|
||||||
mExporters.resize(ASSIMP_NUM_EXPORTERS);
|
if ( 0 != ( ASSIMP_NUM_EXPORTERS ) ) {
|
||||||
std::copy(gExporters,gExporters+ASSIMP_NUM_EXPORTERS,mExporters.begin());
|
mExporters.resize( ASSIMP_NUM_EXPORTERS );
|
||||||
|
std::copy( gExporters, gExporters + ASSIMP_NUM_EXPORTERS, mExporters.begin() );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
~ExporterPimpl()
|
~ExporterPimpl()
|
||||||
|
@ -187,7 +189,6 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
aiExportDataBlob* blob;
|
aiExportDataBlob* blob;
|
||||||
std::shared_ptr< Assimp::IOSystem > mIOSystem;
|
std::shared_ptr< Assimp::IOSystem > mIOSystem;
|
||||||
bool mIsDefaultIOHandler;
|
bool mIsDefaultIOHandler;
|
||||||
|
@ -408,6 +409,7 @@ aiReturn Exporter::Export( const aiScene* pScene, const char* pFormatId, const c
|
||||||
|
|
||||||
pimpl->mError = std::string("Found no exporter to handle this file format: ") + pFormatId;
|
pimpl->mError = std::string("Found no exporter to handle this file format: ") + pFormatId;
|
||||||
ASSIMP_END_EXCEPTION_REGION(aiReturn);
|
ASSIMP_END_EXCEPTION_REGION(aiReturn);
|
||||||
|
|
||||||
return AI_FAILURE;
|
return AI_FAILURE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -492,7 +494,6 @@ ExportProperties::ExportProperties(const ExportProperties &other)
|
||||||
// empty
|
// empty
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
// Set a configuration property
|
// Set a configuration property
|
||||||
bool ExportProperties::SetPropertyInteger(const char* szName, int iValue) {
|
bool ExportProperties::SetPropertyInteger(const char* szName, int iValue) {
|
||||||
|
|
|
@ -161,8 +161,7 @@ uint32_t ReadWord(const char* input, const char*& cursor, const char* end)
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
uint64_t ReadDoubleWord(const char* input, const char*& cursor, const char* end)
|
uint64_t ReadDoubleWord(const char* input, const char*& cursor, const char* end) {
|
||||||
{
|
|
||||||
const size_t k_to_read = sizeof(uint64_t);
|
const size_t k_to_read = sizeof(uint64_t);
|
||||||
if(Offset(cursor, end) < k_to_read) {
|
if(Offset(cursor, end) < k_to_read) {
|
||||||
TokenizeError("cannot ReadDoubleWord, out of bounds",input, cursor);
|
TokenizeError("cannot ReadDoubleWord, out of bounds",input, cursor);
|
||||||
|
@ -176,7 +175,6 @@ uint64_t ReadDoubleWord(const char* input, const char*& cursor, const char* end)
|
||||||
return dword;
|
return dword;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
uint8_t ReadByte(const char* input, const char*& cursor, const char* end)
|
uint8_t ReadByte(const char* input, const char*& cursor, const char* end)
|
||||||
{
|
{
|
||||||
|
@ -447,8 +445,9 @@ void TokenizeBinary(TokenList& output_tokens, const char* input, unsigned int le
|
||||||
const uint32_t flags = ReadWord(input, cursor, input + length);
|
const uint32_t flags = ReadWord(input, cursor, input + length);
|
||||||
|
|
||||||
const uint8_t padding_0 = ReadByte(input, cursor, input + length); // unused
|
const uint8_t padding_0 = ReadByte(input, cursor, input + length); // unused
|
||||||
|
(void) padding_0;
|
||||||
const uint8_t padding_1 = ReadByte(input, cursor, input + length); // unused
|
const uint8_t padding_1 = ReadByte(input, cursor, input + length); // unused
|
||||||
|
(void) padding_1;
|
||||||
while (cursor < input + length)
|
while (cursor < input + length)
|
||||||
{
|
{
|
||||||
if(!ReadScope(output_tokens, input, cursor, input + length, flags)) {
|
if(!ReadScope(output_tokens, input, cursor, input + length, flags)) {
|
||||||
|
|
|
@ -436,6 +436,19 @@ private:
|
||||||
|
|
||||||
aiScene* const out;
|
aiScene* const out;
|
||||||
const FBX::Document& doc;
|
const FBX::Document& doc;
|
||||||
|
|
||||||
|
bool FindTextureIndexByFilename(const Video& video, unsigned int& index) {
|
||||||
|
index = 0;
|
||||||
|
const char* videoFileName = video.FileName().c_str();
|
||||||
|
for (auto texture = textures_converted.begin(); texture != textures_converted.end(); ++texture)
|
||||||
|
{
|
||||||
|
if (!strcmp(texture->first->FileName().c_str(), videoFileName)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
index++;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
Converter::Converter( aiScene* out, const Document& doc )
|
Converter::Converter( aiScene* out, const Document& doc )
|
||||||
|
@ -1749,7 +1762,7 @@ unsigned int Converter::ConvertVideo( const Video& video )
|
||||||
out_tex->mWidth = static_cast<unsigned int>( video.ContentLength() ); // total data size
|
out_tex->mWidth = static_cast<unsigned int>( video.ContentLength() ); // total data size
|
||||||
out_tex->mHeight = 0; // fixed to 0
|
out_tex->mHeight = 0; // fixed to 0
|
||||||
|
|
||||||
// steal the data from the Video to avoid an additional copy
|
// steal the data from the Video to avoid an additional copy
|
||||||
out_tex->pcData = reinterpret_cast<aiTexel*>( const_cast<Video&>( video ).RelinquishContent() );
|
out_tex->pcData = reinterpret_cast<aiTexel*>( const_cast<Video&>( video ).RelinquishContent() );
|
||||||
|
|
||||||
// try to extract a hint from the file extension
|
// try to extract a hint from the file extension
|
||||||
|
@ -1783,22 +1796,32 @@ void Converter::TrySetTextureProperties( aiMaterial* out_mat, const TextureMap&
|
||||||
path.Set( tex->RelativeFilename() );
|
path.Set( tex->RelativeFilename() );
|
||||||
|
|
||||||
const Video* media = tex->Media();
|
const Video* media = tex->Media();
|
||||||
if ( media != 0 && media->ContentLength() > 0 ) {
|
if (media != 0) {
|
||||||
unsigned int index;
|
bool textureReady = false; //tells if our texture is ready (if it was loaded or if it was found)
|
||||||
|
unsigned int index;
|
||||||
|
|
||||||
VideoMap::const_iterator it = textures_converted.find( media );
|
VideoMap::const_iterator it = textures_converted.find(media);
|
||||||
if ( it != textures_converted.end() ) {
|
if (it != textures_converted.end()) {
|
||||||
index = ( *it ).second;
|
index = (*it).second;
|
||||||
}
|
textureReady = true;
|
||||||
else {
|
}
|
||||||
index = ConvertVideo( *media );
|
else {
|
||||||
textures_converted[ media ] = index;
|
if (media->ContentLength() > 0) {
|
||||||
}
|
index = ConvertVideo(*media);
|
||||||
|
textures_converted[media] = index;
|
||||||
|
textureReady = true;
|
||||||
|
}
|
||||||
|
else if (doc.Settings().searchEmbeddedTextures) { //try to find the texture on the already-loaded textures by the filename, if the flag is on
|
||||||
|
textureReady = FindTextureIndexByFilename(*media, index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// setup texture reference string (copied from ColladaLoader::FindFilenameForEffectTexture)
|
// setup texture reference string (copied from ColladaLoader::FindFilenameForEffectTexture), if the texture is ready
|
||||||
path.data[ 0 ] = '*';
|
if (textureReady) {
|
||||||
path.length = 1 + ASSIMP_itoa10( path.data + 1, MAXLEN - 1, index );
|
path.data[0] = '*';
|
||||||
}
|
path.length = 1 + ASSIMP_itoa10(path.data + 1, MAXLEN - 1, index);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
out_mat->AddProperty( &path, _AI_MATKEY_TEXTURE_BASE, target, 0 );
|
out_mat->AddProperty( &path, _AI_MATKEY_TEXTURE_BASE, target, 0 );
|
||||||
|
|
||||||
|
|
|
@ -565,7 +565,7 @@ std::vector<const Connection*> Document::GetConnectionsSequenced(uint64_t id,
|
||||||
temp.push_back((*it).second);
|
temp.push_back((*it).second);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::sort(temp.begin(), temp.end(), std::mem_fun(&Connection::Compare));
|
std::sort(temp.begin(), temp.end(), std::mem_fn(&Connection::Compare));
|
||||||
|
|
||||||
return temp; // NRVO should handle this
|
return temp; // NRVO should handle this
|
||||||
}
|
}
|
||||||
|
@ -617,7 +617,7 @@ std::vector<const Connection*> Document::GetConnectionsSequenced(uint64_t id, bo
|
||||||
temp.push_back((*it).second);
|
temp.push_back((*it).second);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::sort(temp.begin(), temp.end(), std::mem_fun(&Connection::Compare));
|
std::sort(temp.begin(), temp.end(), std::mem_fn(&Connection::Compare));
|
||||||
return temp; // NRVO should handle this
|
return temp; // NRVO should handle this
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -63,6 +63,7 @@ struct ImportSettings
|
||||||
, readWeights(true)
|
, readWeights(true)
|
||||||
, preservePivots(true)
|
, preservePivots(true)
|
||||||
, optimizeEmptyAnimationCurves(true)
|
, optimizeEmptyAnimationCurves(true)
|
||||||
|
, searchEmbeddedTextures(false)
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
||||||
|
@ -137,6 +138,10 @@ struct ImportSettings
|
||||||
* values matching the corresponding node transformation.
|
* values matching the corresponding node transformation.
|
||||||
* The default value is true. */
|
* The default value is true. */
|
||||||
bool optimizeEmptyAnimationCurves;
|
bool optimizeEmptyAnimationCurves;
|
||||||
|
|
||||||
|
/** search for embedded loaded textures, where no embedded texture data is provided.
|
||||||
|
* The default value is false. */
|
||||||
|
bool searchEmbeddedTextures;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -131,6 +131,7 @@ void FBXImporter::SetupProperties(const Importer* pImp)
|
||||||
settings.strictMode = pImp->GetPropertyBool(AI_CONFIG_IMPORT_FBX_STRICT_MODE, false);
|
settings.strictMode = pImp->GetPropertyBool(AI_CONFIG_IMPORT_FBX_STRICT_MODE, false);
|
||||||
settings.preservePivots = pImp->GetPropertyBool(AI_CONFIG_IMPORT_FBX_PRESERVE_PIVOTS, true);
|
settings.preservePivots = pImp->GetPropertyBool(AI_CONFIG_IMPORT_FBX_PRESERVE_PIVOTS, true);
|
||||||
settings.optimizeEmptyAnimationCurves = pImp->GetPropertyBool(AI_CONFIG_IMPORT_FBX_OPTIMIZE_EMPTY_ANIMATION_CURVES, true);
|
settings.optimizeEmptyAnimationCurves = pImp->GetPropertyBool(AI_CONFIG_IMPORT_FBX_OPTIMIZE_EMPTY_ANIMATION_CURVES, true);
|
||||||
|
settings.searchEmbeddedTextures = pImp->GetPropertyBool(AI_CONFIG_IMPORT_FBX_SEARCH_EMBEDDED_TEXTURES, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
|
|
@ -281,7 +281,7 @@ Video::Video(uint64_t id, const Element& element, const Document& doc, const std
|
||||||
const Scope& sc = GetRequiredScope(element);
|
const Scope& sc = GetRequiredScope(element);
|
||||||
|
|
||||||
const Element* const Type = sc["Type"];
|
const Element* const Type = sc["Type"];
|
||||||
const Element* const FileName = sc["FileName"];
|
const Element* const FileName = sc.FindElementCaseInsensitive("FileName"); //some files retain the information as "Filename", others "FileName", who knows
|
||||||
const Element* const RelativeFilename = sc["RelativeFilename"];
|
const Element* const RelativeFilename = sc["RelativeFilename"];
|
||||||
const Element* const Content = sc["Content"];
|
const Element* const Content = sc["Content"];
|
||||||
|
|
||||||
|
@ -291,35 +291,40 @@ Video::Video(uint64_t id, const Element& element, const Document& doc, const std
|
||||||
|
|
||||||
if(FileName) {
|
if(FileName) {
|
||||||
fileName = ParseTokenAsString(GetRequiredToken(*FileName,0));
|
fileName = ParseTokenAsString(GetRequiredToken(*FileName,0));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(RelativeFilename) {
|
if(RelativeFilename) {
|
||||||
relativeFileName = ParseTokenAsString(GetRequiredToken(*RelativeFilename,0));
|
relativeFileName = ParseTokenAsString(GetRequiredToken(*RelativeFilename,0));
|
||||||
}
|
}
|
||||||
|
|
||||||
if(Content) {
|
if(Content) {
|
||||||
const Token& token = GetRequiredToken(*Content, 0);
|
//this field is ommited when the embedded texture is already loaded, let's ignore if it´s not found
|
||||||
const char* data = token.begin();
|
try {
|
||||||
if(!token.IsBinary()) {
|
const Token& token = GetRequiredToken(*Content, 0);
|
||||||
DOMWarning("video content is not binary data, ignoring", &element);
|
const char* data = token.begin();
|
||||||
}
|
if (!token.IsBinary()) {
|
||||||
else if(static_cast<size_t>(token.end() - data) < 5) {
|
DOMWarning("video content is not binary data, ignoring", &element);
|
||||||
DOMError("binary data array is too short, need five (5) bytes for type signature and element count", &element);
|
}
|
||||||
}
|
else if (static_cast<size_t>(token.end() - data) < 5) {
|
||||||
else if(*data != 'R') {
|
DOMError("binary data array is too short, need five (5) bytes for type signature and element count", &element);
|
||||||
DOMWarning("video content is not raw binary data, ignoring", &element);
|
}
|
||||||
}
|
else if (*data != 'R') {
|
||||||
else {
|
DOMWarning("video content is not raw binary data, ignoring", &element);
|
||||||
// read number of elements
|
}
|
||||||
uint32_t len = 0;
|
else {
|
||||||
::memcpy(&len, data + 1, sizeof(len));
|
// read number of elements
|
||||||
AI_SWAP4(len);
|
uint32_t len = 0;
|
||||||
|
::memcpy(&len, data + 1, sizeof(len));
|
||||||
|
AI_SWAP4(len);
|
||||||
|
|
||||||
contentLength = len;
|
contentLength = len;
|
||||||
|
|
||||||
content = new uint8_t[len];
|
content = new uint8_t[len];
|
||||||
::memcpy(content, data + 5, len);
|
::memcpy(content, data + 5, len);
|
||||||
}
|
}
|
||||||
|
} catch (runtime_error runtimeError) {
|
||||||
|
//we don´t need the content data for contents that has already been loaded
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
props = GetPropertyTable(doc,"Video.FbxVideo",element,sc);
|
props = GetPropertyTable(doc,"Video.FbxVideo",element,sc);
|
||||||
|
|
|
@ -357,7 +357,7 @@ void MeshGeometry::ReadVertexData(const std::string& type, int index, const Scop
|
||||||
// avoids losing the material if there are more material layers
|
// avoids losing the material if there are more material layers
|
||||||
// coming of which at least one contains actual data (did observe
|
// coming of which at least one contains actual data (did observe
|
||||||
// that with one test file).
|
// that with one test file).
|
||||||
const size_t count_neg = std::count_if(temp_materials.begin(),temp_materials.end(),std::bind2nd(std::less<int>(),0));
|
const size_t count_neg = std::count_if(temp_materials.begin(),temp_materials.end(),[](int n) { return n < 0; });
|
||||||
if(count_neg == temp_materials.size()) {
|
if(count_neg == temp_materials.size()) {
|
||||||
FBXImporter::LogWarn("ignoring dummy material layer (all entries -1)");
|
FBXImporter::LogWarn("ignoring dummy material layer (all entries -1)");
|
||||||
return;
|
return;
|
||||||
|
|
|
@ -49,6 +49,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include "LogAux.h"
|
#include "LogAux.h"
|
||||||
|
#include "fast_atof.h"
|
||||||
|
|
||||||
#include "FBXCompileConfig.h"
|
#include "FBXCompileConfig.h"
|
||||||
#include "FBXTokenizer.h"
|
#include "FBXTokenizer.h"
|
||||||
|
@ -137,6 +138,17 @@ public:
|
||||||
return it == elements.end() ? NULL : (*it).second;
|
return it == elements.end() ? NULL : (*it).second;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const Element* FindElementCaseInsensitive(const std::string& elementName) const {
|
||||||
|
const char* elementNameCStr = elementName.c_str();
|
||||||
|
for (auto element = elements.begin(); element != elements.end(); ++element)
|
||||||
|
{
|
||||||
|
if (!ASSIMP_strincmp(element->first.c_str(), elementNameCStr, MAXLEN)) {
|
||||||
|
return element->second;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
ElementCollection GetCollection(const std::string& index) const {
|
ElementCollection GetCollection(const std::string& index) const {
|
||||||
return elements.equal_range(index);
|
return elements.equal_range(index);
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,172 @@
|
||||||
|
/*
|
||||||
|
Open Asset Import Library (assimp)
|
||||||
|
----------------------------------------------------------------------
|
||||||
|
|
||||||
|
Copyright (c) 2006-2017, assimp 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 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 FIReader.hpp
|
||||||
|
/// \brief Reader for Fast Infoset encoded binary XML files.
|
||||||
|
/// \date 2017
|
||||||
|
/// \author Patrick Daehne
|
||||||
|
|
||||||
|
#ifndef INCLUDED_AI_FI_READER_H
|
||||||
|
#define INCLUDED_AI_FI_READER_H
|
||||||
|
|
||||||
|
#include <irrXML.h>
|
||||||
|
#include <memory>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
#include <cstdint>
|
||||||
|
|
||||||
|
namespace Assimp {
|
||||||
|
|
||||||
|
struct FIValue {
|
||||||
|
virtual const std::string &toString() const = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct FIStringValue: public FIValue {
|
||||||
|
std::string value;
|
||||||
|
static std::shared_ptr<FIStringValue> create(std::string &&value);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct FIByteValue: public FIValue {
|
||||||
|
std::vector<uint8_t> value;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct FIHexValue: public FIByteValue {
|
||||||
|
static std::shared_ptr<FIHexValue> create(std::vector<uint8_t> &&value);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct FIBase64Value: public FIByteValue {
|
||||||
|
static std::shared_ptr<FIBase64Value> create(std::vector<uint8_t> &&value);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct FIShortValue: public FIValue {
|
||||||
|
std::vector<int16_t> value;
|
||||||
|
static std::shared_ptr<FIShortValue> create(std::vector<int16_t> &&value);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct FIIntValue: public FIValue {
|
||||||
|
std::vector<int32_t> value;
|
||||||
|
static std::shared_ptr<FIIntValue> create(std::vector<int32_t> &&value);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct FILongValue: public FIValue {
|
||||||
|
std::vector<int64_t> value;
|
||||||
|
static std::shared_ptr<FILongValue> create(std::vector<int64_t> &&value);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct FIBoolValue: public FIValue {
|
||||||
|
std::vector<bool> value;
|
||||||
|
static std::shared_ptr<FIBoolValue> create(std::vector<bool> &&value);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct FIFloatValue: public FIValue {
|
||||||
|
std::vector<float> value;
|
||||||
|
static std::shared_ptr<FIFloatValue> create(std::vector<float> &&value);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct FIDoubleValue: public FIValue {
|
||||||
|
std::vector<double> value;
|
||||||
|
static std::shared_ptr<FIDoubleValue> create(std::vector<double> &&value);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct FIUUIDValue: public FIByteValue {
|
||||||
|
static std::shared_ptr<FIUUIDValue> create(std::vector<uint8_t> &&value);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct FICDATAValue: public FIStringValue {
|
||||||
|
static std::shared_ptr<FICDATAValue> create(std::string &&value);
|
||||||
|
};
|
||||||
|
|
||||||
|
struct FIDecoder {
|
||||||
|
virtual std::shared_ptr<const FIValue> decode(const uint8_t *data, size_t len) = 0;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct FIQName {
|
||||||
|
const char *name;
|
||||||
|
const char *prefix;
|
||||||
|
const char *uri;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct FIVocabulary {
|
||||||
|
const char **restrictedAlphabetTable;
|
||||||
|
size_t restrictedAlphabetTableSize;
|
||||||
|
const char **encodingAlgorithmTable;
|
||||||
|
size_t encodingAlgorithmTableSize;
|
||||||
|
const char **prefixTable;
|
||||||
|
size_t prefixTableSize;
|
||||||
|
const char **namespaceNameTable;
|
||||||
|
size_t namespaceNameTableSize;
|
||||||
|
const char **localNameTable;
|
||||||
|
size_t localNameTableSize;
|
||||||
|
const char **otherNCNameTable;
|
||||||
|
size_t otherNCNameTableSize;
|
||||||
|
const char **otherURITable;
|
||||||
|
size_t otherURITableSize;
|
||||||
|
const std::shared_ptr<const FIValue> *attributeValueTable;
|
||||||
|
size_t attributeValueTableSize;
|
||||||
|
const std::shared_ptr<const FIValue> *charactersTable;
|
||||||
|
size_t charactersTableSize;
|
||||||
|
const std::shared_ptr<const FIValue> *otherStringTable;
|
||||||
|
size_t otherStringTableSize;
|
||||||
|
const FIQName *elementNameTable;
|
||||||
|
size_t elementNameTableSize;
|
||||||
|
const FIQName *attributeNameTable;
|
||||||
|
size_t attributeNameTableSize;
|
||||||
|
};
|
||||||
|
|
||||||
|
class IOStream;
|
||||||
|
|
||||||
|
class FIReader: public irr::io::IIrrXMLReader<char, irr::io::IXMLBase> {
|
||||||
|
public:
|
||||||
|
|
||||||
|
virtual std::shared_ptr<const FIValue> getAttributeEncodedValue(int idx) const = 0;
|
||||||
|
|
||||||
|
virtual std::shared_ptr<const FIValue> getAttributeEncodedValue(const char *name) const = 0;
|
||||||
|
|
||||||
|
virtual void registerDecoder(const std::string &algorithmUri, std::unique_ptr<FIDecoder> decoder) = 0;
|
||||||
|
|
||||||
|
virtual void registerVocabulary(const std::string &vocabularyUri, const FIVocabulary *vocabulary) = 0;
|
||||||
|
|
||||||
|
static std::unique_ptr<FIReader> create(IOStream *stream);
|
||||||
|
|
||||||
|
};// class IFIReader
|
||||||
|
|
||||||
|
}// namespace Assimp
|
||||||
|
|
||||||
|
#endif // INCLUDED_AI_FI_READER_H
|
|
@ -66,8 +66,7 @@ namespace MDL {
|
||||||
* \brief Data structure for the HL2 main header
|
* \brief Data structure for the HL2 main header
|
||||||
*/
|
*/
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
struct Header_HL2
|
struct Header_HL2 {
|
||||||
{
|
|
||||||
//! magic number: "IDST"/"IDSQ"
|
//! magic number: "IDST"/"IDSQ"
|
||||||
char ident[4];
|
char ident[4];
|
||||||
|
|
||||||
|
@ -139,7 +138,7 @@ struct Header_HL2
|
||||||
//! Number of animation transitions
|
//! Number of animation transitions
|
||||||
int32_t numtransitions;
|
int32_t numtransitions;
|
||||||
int32_t transitionindex;
|
int32_t transitionindex;
|
||||||
} PACK_STRUCT;
|
} /* PACK_STRUCT */;
|
||||||
|
|
||||||
#include "./../include/assimp/Compiler/poppack1.h"
|
#include "./../include/assimp/Compiler/poppack1.h"
|
||||||
|
|
||||||
|
|
|
@ -53,7 +53,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include "fast_atof.h"
|
#include "fast_atof.h"
|
||||||
#include "GenericProperty.h"
|
#include "GenericProperty.h"
|
||||||
|
|
||||||
#include "SceneCombiner.h"
|
#include <assimp/SceneCombiner.h>
|
||||||
#include "StandardShapes.h"
|
#include "StandardShapes.h"
|
||||||
#include "Importer.h"
|
#include "Importer.h"
|
||||||
|
|
||||||
|
|
|
@ -48,7 +48,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#define AI_IRRLOADER_H_INCLUDED
|
#define AI_IRRLOADER_H_INCLUDED
|
||||||
|
|
||||||
#include "IRRShared.h"
|
#include "IRRShared.h"
|
||||||
#include "SceneCombiner.h"
|
#include <assimp/SceneCombiner.h>
|
||||||
#include "Importer.h"
|
#include "Importer.h"
|
||||||
#include "StringUtils.h"
|
#include "StringUtils.h"
|
||||||
#include <assimp/anim.h>
|
#include <assimp/anim.h>
|
||||||
|
|
|
@ -231,7 +231,9 @@ void GetImporterInstanceList(std::vector< BaseImporter* >& out)
|
||||||
out.push_back( new MDLImporter());
|
out.push_back( new MDLImporter());
|
||||||
#endif
|
#endif
|
||||||
#if (!defined ASSIMP_BUILD_NO_ASE_IMPORTER)
|
#if (!defined ASSIMP_BUILD_NO_ASE_IMPORTER)
|
||||||
|
#if (!defined ASSIMP_BUILD_NO_3DS_IMPORTER)
|
||||||
out.push_back( new ASEImporter());
|
out.push_back( new ASEImporter());
|
||||||
|
# endif
|
||||||
#endif
|
#endif
|
||||||
#if (!defined ASSIMP_BUILD_NO_HMP_IMPORTER)
|
#if (!defined ASSIMP_BUILD_NO_HMP_IMPORTER)
|
||||||
out.push_back( new HMPImporter());
|
out.push_back( new HMPImporter());
|
||||||
|
|
|
@ -54,6 +54,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
// internal headers
|
// internal headers
|
||||||
#include "LWOFileData.h"
|
#include "LWOFileData.h"
|
||||||
|
#include <assimp/anim.h>
|
||||||
|
|
||||||
using namespace Assimp;
|
using namespace Assimp;
|
||||||
using namespace Assimp::LWO;
|
using namespace Assimp::LWO;
|
||||||
|
@ -163,7 +164,7 @@ void AnimResolver::UpdateAnimRangeSetup()
|
||||||
{
|
{
|
||||||
const double start_time = delta - std::fmod(my_first-first,delta);
|
const double start_time = delta - std::fmod(my_first-first,delta);
|
||||||
std::vector<LWO::Key>::iterator n = std::find_if((*it).keys.begin(),(*it).keys.end(),
|
std::vector<LWO::Key>::iterator n = std::find_if((*it).keys.begin(),(*it).keys.end(),
|
||||||
std::bind1st(std::greater<double>(),start_time)),m;
|
[start_time](double t) { return start_time > t; }),m;
|
||||||
|
|
||||||
size_t ofs = 0;
|
size_t ofs = 0;
|
||||||
if (n != (*it).keys.end()) {
|
if (n != (*it).keys.end()) {
|
||||||
|
|
|
@ -48,11 +48,12 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#ifndef AI_LWO_ANIMATION_INCLUDED
|
#ifndef AI_LWO_ANIMATION_INCLUDED
|
||||||
#define AI_LWO_ANIMATION_INCLUDED
|
#define AI_LWO_ANIMATION_INCLUDED
|
||||||
|
|
||||||
#include <assimp/anim.h>
|
//
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <list>
|
#include <list>
|
||||||
|
|
||||||
struct aiNodeAnim;
|
struct aiNodeAnim;
|
||||||
|
struct aiVectorKey;
|
||||||
|
|
||||||
namespace Assimp {
|
namespace Assimp {
|
||||||
namespace LWO {
|
namespace LWO {
|
||||||
|
@ -166,7 +167,6 @@ struct Envelope
|
||||||
//! Keyframes for this envelope
|
//! Keyframes for this envelope
|
||||||
std::vector<Key> keys;
|
std::vector<Key> keys;
|
||||||
|
|
||||||
|
|
||||||
// temporary data for AnimResolver
|
// temporary data for AnimResolver
|
||||||
size_t old_first,old_last;
|
size_t old_first,old_last;
|
||||||
};
|
};
|
||||||
|
@ -198,8 +198,7 @@ public:
|
||||||
* @param Output tick rate, per second
|
* @param Output tick rate, per second
|
||||||
* @note The input envelopes are possibly modified.
|
* @note The input envelopes are possibly modified.
|
||||||
*/
|
*/
|
||||||
AnimResolver(std::list<Envelope>& envelopes,
|
AnimResolver(std::list<Envelope>& envelopes, double tick);
|
||||||
double tick);
|
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
|
|
@ -51,7 +51,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include "ParsingUtils.h"
|
#include "ParsingUtils.h"
|
||||||
#include "fast_atof.h"
|
#include "fast_atof.h"
|
||||||
|
|
||||||
#include "SceneCombiner.h"
|
#include <assimp/SceneCombiner.h>
|
||||||
#include "GenericProperty.h"
|
#include "GenericProperty.h"
|
||||||
#include "SkeletonMeshBuilder.h"
|
#include "SkeletonMeshBuilder.h"
|
||||||
#include "ConvertToLHProcess.h"
|
#include "ConvertToLHProcess.h"
|
||||||
|
|
|
@ -46,7 +46,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#define AI_LWSLOADER_H_INCLUDED
|
#define AI_LWSLOADER_H_INCLUDED
|
||||||
|
|
||||||
#include "LWOFileData.h"
|
#include "LWOFileData.h"
|
||||||
#include "SceneCombiner.h"
|
#include <assimp/SceneCombiner.h>
|
||||||
#include "BaseImporter.h"
|
#include "BaseImporter.h"
|
||||||
|
|
||||||
struct aiImporterDesc;
|
struct aiImporterDesc;
|
||||||
|
|
|
@ -142,14 +142,14 @@ struct Frame
|
||||||
//! name of frame
|
//! name of frame
|
||||||
char name[ AI_MD3_MAXFRAME ];
|
char name[ AI_MD3_MAXFRAME ];
|
||||||
|
|
||||||
} PACK_STRUCT;
|
} /* PACK_STRUCT */;
|
||||||
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------
|
||||||
/** @brief Data structure for the tag header
|
/**
|
||||||
|
* @brief Data structure for the tag header
|
||||||
*/
|
*/
|
||||||
struct Tag
|
struct Tag {
|
||||||
{
|
|
||||||
//! name of the tag
|
//! name of the tag
|
||||||
char NAME[ AI_MD3_MAXQPATH ];
|
char NAME[ AI_MD3_MAXQPATH ];
|
||||||
|
|
||||||
|
@ -157,14 +157,13 @@ struct Tag
|
||||||
aiVector3D origin;
|
aiVector3D origin;
|
||||||
ai_real orientation[3][3];
|
ai_real orientation[3][3];
|
||||||
|
|
||||||
} PACK_STRUCT;
|
} /* PACK_STRUCT */;
|
||||||
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------
|
||||||
/** @brief Data structure for the surface header
|
/** @brief Data structure for the surface header
|
||||||
*/
|
*/
|
||||||
struct Surface
|
struct Surface {
|
||||||
{
|
|
||||||
//! magic number
|
//! magic number
|
||||||
int32_t IDENT;
|
int32_t IDENT;
|
||||||
|
|
||||||
|
@ -186,7 +185,6 @@ struct Surface
|
||||||
//! number of triangles in the surface
|
//! number of triangles in the surface
|
||||||
uint32_t NUM_TRIANGLES;
|
uint32_t NUM_TRIANGLES;
|
||||||
|
|
||||||
|
|
||||||
//! offset to the triangle data
|
//! offset to the triangle data
|
||||||
uint32_t OFS_TRIANGLES;
|
uint32_t OFS_TRIANGLES;
|
||||||
|
|
||||||
|
@ -201,19 +199,18 @@ struct Surface
|
||||||
|
|
||||||
//! offset to the end of the Surface object
|
//! offset to the end of the Surface object
|
||||||
int32_t OFS_END;
|
int32_t OFS_END;
|
||||||
} PACK_STRUCT;
|
} /*PACK_STRUCT*/;
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------
|
||||||
/** @brief Data structure for a shader defined in there
|
/** @brief Data structure for a shader defined in there
|
||||||
*/
|
*/
|
||||||
struct Shader
|
struct Shader {
|
||||||
{
|
|
||||||
//! filename of the shader
|
//! filename of the shader
|
||||||
char NAME[ AI_MD3_MAXQPATH ];
|
char NAME[ AI_MD3_MAXQPATH ];
|
||||||
|
|
||||||
//! index of the shader
|
//! index of the shader
|
||||||
uint32_t SHADER_INDEX;
|
uint32_t SHADER_INDEX;
|
||||||
} PACK_STRUCT;
|
} /*PACK_STRUCT*/;
|
||||||
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------
|
||||||
|
@ -223,7 +220,7 @@ struct Triangle
|
||||||
{
|
{
|
||||||
//! triangle indices
|
//! triangle indices
|
||||||
uint32_t INDEXES[3];
|
uint32_t INDEXES[3];
|
||||||
} PACK_STRUCT;
|
} /*PACK_STRUCT*/;
|
||||||
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------
|
||||||
|
@ -233,7 +230,7 @@ struct TexCoord
|
||||||
{
|
{
|
||||||
//! UV coordinates
|
//! UV coordinates
|
||||||
ai_real U,V;
|
ai_real U,V;
|
||||||
} PACK_STRUCT;
|
} /*PACK_STRUCT*/;
|
||||||
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------
|
||||||
|
@ -246,7 +243,7 @@ struct Vertex
|
||||||
|
|
||||||
//! encoded normal vector
|
//! encoded normal vector
|
||||||
uint16_t NORMAL;
|
uint16_t NORMAL;
|
||||||
} PACK_STRUCT;
|
} /*PACK_STRUCT*/;
|
||||||
|
|
||||||
#include "./../include/assimp/Compiler/poppack1.h"
|
#include "./../include/assimp/Compiler/poppack1.h"
|
||||||
|
|
||||||
|
|
|
@ -53,7 +53,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#ifndef ASSIMP_BUILD_NO_MD3_IMPORTER
|
#ifndef ASSIMP_BUILD_NO_MD3_IMPORTER
|
||||||
|
|
||||||
#include "MD3Loader.h"
|
#include "MD3Loader.h"
|
||||||
#include "SceneCombiner.h"
|
#include <assimp/SceneCombiner.h>
|
||||||
#include "GenericProperty.h"
|
#include "GenericProperty.h"
|
||||||
#include "RemoveComments.h"
|
#include "RemoveComments.h"
|
||||||
#include "ParsingUtils.h"
|
#include "ParsingUtils.h"
|
||||||
|
|
|
@ -157,7 +157,7 @@ struct Frame
|
||||||
|
|
||||||
//! Name of the frame
|
//! Name of the frame
|
||||||
char name [ 16 ] ;
|
char name [ 16 ] ;
|
||||||
} PACK_STRUCT;
|
} /*PACK_STRUCT*/;
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
/** \brief Data structure for a MDC triangle
|
/** \brief Data structure for a MDC triangle
|
||||||
|
|
|
@ -53,10 +53,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#ifndef AI_MDLFILEHELPER_H_INC
|
#ifndef AI_MDLFILEHELPER_H_INC
|
||||||
#define AI_MDLFILEHELPER_H_INC
|
#define AI_MDLFILEHELPER_H_INC
|
||||||
|
|
||||||
|
#include <assimp/anim.h>
|
||||||
|
#include <assimp/mesh.h>
|
||||||
|
#include <assimp/Compiler/pushpack1.h>
|
||||||
#include "ByteSwapper.h"
|
#include "ByteSwapper.h"
|
||||||
#include "./../include/assimp/anim.h"
|
|
||||||
#include "./../include/assimp/mesh.h"
|
|
||||||
#include "./../include/assimp/Compiler/pushpack1.h"
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
|
@ -90,7 +90,6 @@ namespace MDL {
|
||||||
#define AI_MDL_MAGIC_NUMBER_BE_GS7 AI_MAKE_MAGIC("MDL7")
|
#define AI_MDL_MAGIC_NUMBER_BE_GS7 AI_MAKE_MAGIC("MDL7")
|
||||||
#define AI_MDL_MAGIC_NUMBER_LE_GS7 AI_MAKE_MAGIC("7LDM")
|
#define AI_MDL_MAGIC_NUMBER_LE_GS7 AI_MAKE_MAGIC("7LDM")
|
||||||
|
|
||||||
|
|
||||||
// common limitations for Quake1 meshes. The loader does not check them,
|
// common limitations for Quake1 meshes. The loader does not check them,
|
||||||
// (however it warns) but models should not exceed these limits.
|
// (however it warns) but models should not exceed these limits.
|
||||||
#if (!defined AI_MDL_VERSION)
|
#if (!defined AI_MDL_VERSION)
|
||||||
|
@ -119,8 +118,7 @@ namespace MDL {
|
||||||
/** \struct Header
|
/** \struct Header
|
||||||
* \brief Data structure for the MDL main header
|
* \brief Data structure for the MDL main header
|
||||||
*/
|
*/
|
||||||
struct Header
|
struct Header {
|
||||||
{
|
|
||||||
//! magic number: "IDPO"
|
//! magic number: "IDPO"
|
||||||
uint32_t ident;
|
uint32_t ident;
|
||||||
|
|
||||||
|
@ -166,15 +164,14 @@ struct Header
|
||||||
|
|
||||||
//! Could be the total size of the file (and not a float)
|
//! Could be the total size of the file (and not a float)
|
||||||
float size;
|
float size;
|
||||||
} PACK_STRUCT;
|
} /* PACK_STRUCT */;
|
||||||
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------------
|
||||||
/** \struct Header_MDL7
|
/** \struct Header_MDL7
|
||||||
* \brief Data structure for the MDL 7 main header
|
* \brief Data structure for the MDL 7 main header
|
||||||
*/
|
*/
|
||||||
struct Header_MDL7
|
struct Header_MDL7 {
|
||||||
{
|
|
||||||
//! magic number: "MDL7"
|
//! magic number: "MDL7"
|
||||||
char ident[4];
|
char ident[4];
|
||||||
|
|
||||||
|
@ -226,15 +223,14 @@ struct Header_MDL7
|
||||||
|
|
||||||
//! Size of the Frame_MDL7 data structure used in the file
|
//! Size of the Frame_MDL7 data structure used in the file
|
||||||
uint16_t frame_stc_size;
|
uint16_t frame_stc_size;
|
||||||
} PACK_STRUCT;
|
} /* PACK_STRUCT */;
|
||||||
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------------
|
||||||
/** \struct Bone_MDL7
|
/** \struct Bone_MDL7
|
||||||
* \brief Data structure for a bone in a MDL7 file
|
* \brief Data structure for a bone in a MDL7 file
|
||||||
*/
|
*/
|
||||||
struct Bone_MDL7
|
struct Bone_MDL7 {
|
||||||
{
|
|
||||||
//! Index of the parent bone of *this* bone. 0xffff means:
|
//! Index of the parent bone of *this* bone. 0xffff means:
|
||||||
//! "hey, I have no parent, I'm an orphan"
|
//! "hey, I have no parent, I'm an orphan"
|
||||||
uint16_t parent_index;
|
uint16_t parent_index;
|
||||||
|
@ -246,7 +242,7 @@ struct Bone_MDL7
|
||||||
|
|
||||||
//! Optional name of the bone
|
//! Optional name of the bone
|
||||||
char name[1 /* DUMMY SIZE */];
|
char name[1 /* DUMMY SIZE */];
|
||||||
} PACK_STRUCT;
|
} /* PACK_STRUCT */;
|
||||||
|
|
||||||
#if (!defined AI_MDL7_BONE_STRUCT_SIZE__NAME_IS_20_CHARS)
|
#if (!defined AI_MDL7_BONE_STRUCT_SIZE__NAME_IS_20_CHARS)
|
||||||
# define AI_MDL7_BONE_STRUCT_SIZE__NAME_IS_20_CHARS (16 + 20)
|
# define AI_MDL7_BONE_STRUCT_SIZE__NAME_IS_20_CHARS (16 + 20)
|
||||||
|
@ -268,8 +264,7 @@ struct Bone_MDL7
|
||||||
/** \struct Group_MDL7
|
/** \struct Group_MDL7
|
||||||
* \brief Group in a MDL7 file
|
* \brief Group in a MDL7 file
|
||||||
*/
|
*/
|
||||||
struct Group_MDL7
|
struct Group_MDL7 {
|
||||||
{
|
|
||||||
//! = '1' -> triangle based Mesh
|
//! = '1' -> triangle based Mesh
|
||||||
unsigned char typ;
|
unsigned char typ;
|
||||||
|
|
||||||
|
@ -295,7 +290,7 @@ struct Group_MDL7
|
||||||
|
|
||||||
//! Number of frames
|
//! Number of frames
|
||||||
int32_t numframes;
|
int32_t numframes;
|
||||||
} PACK_STRUCT;
|
} /* PACK_STRUCT */;
|
||||||
|
|
||||||
#define AI_MDL7_SKINTYPE_MIPFLAG 0x08
|
#define AI_MDL7_SKINTYPE_MIPFLAG 0x08
|
||||||
#define AI_MDL7_SKINTYPE_MATERIAL 0x10
|
#define AI_MDL7_SKINTYPE_MATERIAL 0x10
|
||||||
|
@ -310,41 +305,36 @@ struct Group_MDL7
|
||||||
/** \struct Deformer_MDL7
|
/** \struct Deformer_MDL7
|
||||||
* \brief Deformer in a MDL7 file
|
* \brief Deformer in a MDL7 file
|
||||||
*/
|
*/
|
||||||
struct Deformer_MDL7
|
struct Deformer_MDL7 {
|
||||||
{
|
|
||||||
int8_t deformer_version; // 0
|
int8_t deformer_version; // 0
|
||||||
int8_t deformer_typ; // 0 - bones
|
int8_t deformer_typ; // 0 - bones
|
||||||
int8_t _unused_[2];
|
int8_t _unused_[2];
|
||||||
int32_t group_index;
|
int32_t group_index;
|
||||||
int32_t elements;
|
int32_t elements;
|
||||||
int32_t deformerdata_size;
|
int32_t deformerdata_size;
|
||||||
} PACK_STRUCT;
|
} /* PACK_STRUCT */;
|
||||||
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------------
|
||||||
/** \struct DeformerElement_MDL7
|
/** \struct DeformerElement_MDL7
|
||||||
* \brief Deformer element in a MDL7 file
|
* \brief Deformer element in a MDL7 file
|
||||||
*/
|
*/
|
||||||
struct DeformerElement_MDL7
|
struct DeformerElement_MDL7 {
|
||||||
{
|
|
||||||
//! bei deformer_typ==0 (==bones) element_index == bone index
|
//! bei deformer_typ==0 (==bones) element_index == bone index
|
||||||
int32_t element_index;
|
int32_t element_index;
|
||||||
char element_name[AI_MDL7_MAX_BONENAMESIZE];
|
char element_name[AI_MDL7_MAX_BONENAMESIZE];
|
||||||
int32_t weights;
|
int32_t weights;
|
||||||
} PACK_STRUCT;
|
} /* PACK_STRUCT */;
|
||||||
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------------
|
||||||
/** \struct DeformerWeight_MDL7
|
/** \struct DeformerWeight_MDL7
|
||||||
* \brief Deformer weight in a MDL7 file
|
* \brief Deformer weight in a MDL7 file
|
||||||
*/
|
*/
|
||||||
struct DeformerWeight_MDL7
|
struct DeformerWeight_MDL7 {
|
||||||
{
|
|
||||||
//! for deformer_typ==0 (==bones) index == vertex index
|
//! for deformer_typ==0 (==bones) index == vertex index
|
||||||
int32_t index;
|
int32_t index;
|
||||||
float weight;
|
float weight;
|
||||||
} PACK_STRUCT;
|
} /* PACK_STRUCT */;
|
||||||
|
|
||||||
|
|
||||||
// don't know why this was in the original headers ...
|
// don't know why this was in the original headers ...
|
||||||
typedef int32_t MD7_MATERIAL_ASCDEFSIZE;
|
typedef int32_t MD7_MATERIAL_ASCDEFSIZE;
|
||||||
|
@ -353,17 +343,15 @@ typedef int32_t MD7_MATERIAL_ASCDEFSIZE;
|
||||||
/** \struct ColorValue_MDL7
|
/** \struct ColorValue_MDL7
|
||||||
* \brief Data structure for a color value in a MDL7 file
|
* \brief Data structure for a color value in a MDL7 file
|
||||||
*/
|
*/
|
||||||
struct ColorValue_MDL7
|
struct ColorValue_MDL7 {
|
||||||
{
|
|
||||||
float r,g,b,a;
|
float r,g,b,a;
|
||||||
} PACK_STRUCT;
|
} /* PACK_STRUCT */;
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------------
|
||||||
/** \struct Material_MDL7
|
/** \struct Material_MDL7
|
||||||
* \brief Data structure for a Material in a MDL7 file
|
* \brief Data structure for a Material in a MDL7 file
|
||||||
*/
|
*/
|
||||||
struct Material_MDL7
|
struct Material_MDL7 {
|
||||||
{
|
|
||||||
//! Diffuse base color of the material
|
//! Diffuse base color of the material
|
||||||
ColorValue_MDL7 Diffuse;
|
ColorValue_MDL7 Diffuse;
|
||||||
|
|
||||||
|
@ -378,15 +366,13 @@ struct Material_MDL7
|
||||||
|
|
||||||
//! Phong power
|
//! Phong power
|
||||||
float Power;
|
float Power;
|
||||||
} PACK_STRUCT;
|
} /* PACK_STRUCT */;
|
||||||
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------------
|
||||||
/** \struct Skin
|
/** \struct Skin
|
||||||
* \brief Skin data structure #1 - used by Quake1, MDL2, MDL3 and MDL4
|
* \brief Skin data structure #1 - used by Quake1, MDL2, MDL3 and MDL4
|
||||||
*/
|
*/
|
||||||
struct Skin
|
struct Skin {
|
||||||
{
|
|
||||||
//! 0 = single (Skin), 1 = group (GroupSkin)
|
//! 0 = single (Skin), 1 = group (GroupSkin)
|
||||||
//! For MDL3-5: Defines the type of the skin and there
|
//! For MDL3-5: Defines the type of the skin and there
|
||||||
//! fore the size of the data to skip:
|
//! fore the size of the data to skip:
|
||||||
|
@ -402,7 +388,7 @@ struct Skin
|
||||||
|
|
||||||
//! Texture data
|
//! Texture data
|
||||||
uint8_t *data;
|
uint8_t *data;
|
||||||
} PACK_STRUCT;
|
} /* PACK_STRUCT */;
|
||||||
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------------
|
||||||
|
@ -410,11 +396,10 @@ struct Skin
|
||||||
* \brief Skin data structure #2 - used by MDL5, MDL6 and MDL7
|
* \brief Skin data structure #2 - used by MDL5, MDL6 and MDL7
|
||||||
* \see Skin
|
* \see Skin
|
||||||
*/
|
*/
|
||||||
struct Skin_MDL5
|
struct Skin_MDL5 {
|
||||||
{
|
|
||||||
int32_t size, width, height;
|
int32_t size, width, height;
|
||||||
uint8_t *data;
|
uint8_t *data;
|
||||||
} PACK_STRUCT;
|
} /* PACK_STRUCT */;
|
||||||
|
|
||||||
// maximum length of texture file name
|
// maximum length of texture file name
|
||||||
#if (!defined AI_MDL7_MAX_TEXNAMESIZE)
|
#if (!defined AI_MDL7_MAX_TEXNAMESIZE)
|
||||||
|
@ -425,44 +410,40 @@ struct Skin_MDL5
|
||||||
/** \struct Skin_MDL7
|
/** \struct Skin_MDL7
|
||||||
* \brief Skin data structure #3 - used by MDL7 and HMP7
|
* \brief Skin data structure #3 - used by MDL7 and HMP7
|
||||||
*/
|
*/
|
||||||
struct Skin_MDL7
|
struct Skin_MDL7 {
|
||||||
{
|
|
||||||
uint8_t typ;
|
uint8_t typ;
|
||||||
int8_t _unused_[3];
|
int8_t _unused_[3];
|
||||||
int32_t width;
|
int32_t width;
|
||||||
int32_t height;
|
int32_t height;
|
||||||
char texture_name[AI_MDL7_MAX_TEXNAMESIZE];
|
char texture_name[AI_MDL7_MAX_TEXNAMESIZE];
|
||||||
} PACK_STRUCT;
|
} /* PACK_STRUCT */;
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------------
|
||||||
/** \struct RGB565
|
/** \struct RGB565
|
||||||
* \brief Data structure for a RGB565 pixel in a texture
|
* \brief Data structure for a RGB565 pixel in a texture
|
||||||
*/
|
*/
|
||||||
struct RGB565
|
struct RGB565 {
|
||||||
{
|
|
||||||
uint16_t r : 5;
|
uint16_t r : 5;
|
||||||
uint16_t g : 6;
|
uint16_t g : 6;
|
||||||
uint16_t b : 5;
|
uint16_t b : 5;
|
||||||
} PACK_STRUCT;
|
} /* PACK_STRUCT */;
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------------
|
||||||
/** \struct ARGB4
|
/** \struct ARGB4
|
||||||
* \brief Data structure for a ARGB4444 pixel in a texture
|
* \brief Data structure for a ARGB4444 pixel in a texture
|
||||||
*/
|
*/
|
||||||
struct ARGB4
|
struct ARGB4 {
|
||||||
{
|
|
||||||
uint16_t a : 4;
|
uint16_t a : 4;
|
||||||
uint16_t r : 4;
|
uint16_t r : 4;
|
||||||
uint16_t g : 4;
|
uint16_t g : 4;
|
||||||
uint16_t b : 4;
|
uint16_t b : 4;
|
||||||
} PACK_STRUCT;
|
} /*PACK_STRUCT*/;
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------------
|
||||||
/** \struct GroupSkin
|
/** \struct GroupSkin
|
||||||
* \brief Skin data structure #2 (group of pictures)
|
* \brief Skin data structure #2 (group of pictures)
|
||||||
*/
|
*/
|
||||||
struct GroupSkin
|
struct GroupSkin {
|
||||||
{
|
|
||||||
//! 0 = single (Skin), 1 = group (GroupSkin)
|
//! 0 = single (Skin), 1 = group (GroupSkin)
|
||||||
int32_t group;
|
int32_t group;
|
||||||
|
|
||||||
|
@ -474,14 +455,13 @@ struct GroupSkin
|
||||||
|
|
||||||
//! Data of each image
|
//! Data of each image
|
||||||
uint8_t **data;
|
uint8_t **data;
|
||||||
} PACK_STRUCT;
|
} /* PACK_STRUCT */;
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------------
|
||||||
/** \struct TexCoord
|
/** \struct TexCoord
|
||||||
* \brief Texture coordinate data structure used by the Quake1 MDL format
|
* \brief Texture coordinate data structure used by the Quake1 MDL format
|
||||||
*/
|
*/
|
||||||
struct TexCoord
|
struct TexCoord {
|
||||||
{
|
|
||||||
//! Is the vertex on the noundary between front and back piece?
|
//! Is the vertex on the noundary between front and back piece?
|
||||||
int32_t onseam;
|
int32_t onseam;
|
||||||
|
|
||||||
|
@ -490,33 +470,31 @@ struct TexCoord
|
||||||
|
|
||||||
//! Texture coordinate in the ty direction
|
//! Texture coordinate in the ty direction
|
||||||
int32_t t;
|
int32_t t;
|
||||||
} PACK_STRUCT;
|
} /* PACK_STRUCT */;
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------------
|
||||||
/** \struct TexCoord_MDL3
|
/** \struct TexCoord_MDL3
|
||||||
* \brief Data structure for an UV coordinate in the 3DGS MDL3 format
|
* \brief Data structure for an UV coordinate in the 3DGS MDL3 format
|
||||||
*/
|
*/
|
||||||
struct TexCoord_MDL3
|
struct TexCoord_MDL3 {
|
||||||
{
|
|
||||||
//! position, horizontally in range 0..skinwidth-1
|
//! position, horizontally in range 0..skinwidth-1
|
||||||
int16_t u;
|
int16_t u;
|
||||||
|
|
||||||
//! position, vertically in range 0..skinheight-1
|
//! position, vertically in range 0..skinheight-1
|
||||||
int16_t v;
|
int16_t v;
|
||||||
} PACK_STRUCT;
|
} /* PACK_STRUCT */;
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------------
|
||||||
/** \struct TexCoord_MDL7
|
/** \struct TexCoord_MDL7
|
||||||
* \brief Data structure for an UV coordinate in the 3DGS MDL7 format
|
* \brief Data structure for an UV coordinate in the 3DGS MDL7 format
|
||||||
*/
|
*/
|
||||||
struct TexCoord_MDL7
|
struct TexCoord_MDL7 {
|
||||||
{
|
|
||||||
//! position, horizontally in range 0..1
|
//! position, horizontally in range 0..1
|
||||||
float u;
|
float u;
|
||||||
|
|
||||||
//! position, vertically in range 0..1
|
//! position, vertically in range 0..1
|
||||||
float v;
|
float v;
|
||||||
} PACK_STRUCT;
|
} /* PACK_STRUCT */;
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------------
|
||||||
/** \struct SkinSet_MDL7
|
/** \struct SkinSet_MDL7
|
||||||
|
@ -532,7 +510,7 @@ struct SkinSet_MDL7
|
||||||
|
|
||||||
//! Material index
|
//! Material index
|
||||||
int32_t material; // size 4
|
int32_t material; // size 4
|
||||||
} PACK_STRUCT;
|
} /* PACK_STRUCT */;
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------------
|
||||||
/** \struct Triangle
|
/** \struct Triangle
|
||||||
|
@ -545,7 +523,7 @@ struct Triangle
|
||||||
|
|
||||||
//! Vertex indices
|
//! Vertex indices
|
||||||
int32_t vertex[3];
|
int32_t vertex[3];
|
||||||
} PACK_STRUCT;
|
} /* PACK_STRUCT */;
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------------
|
||||||
/** \struct Triangle_MDL3
|
/** \struct Triangle_MDL3
|
||||||
|
@ -558,7 +536,7 @@ struct Triangle_MDL3
|
||||||
|
|
||||||
//! Index of 3 skin vertices in range 0..numskinverts
|
//! Index of 3 skin vertices in range 0..numskinverts
|
||||||
uint16_t index_uv[3];
|
uint16_t index_uv[3];
|
||||||
} PACK_STRUCT;
|
} /* PACK_STRUCT */;
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------------
|
||||||
/** \struct Triangle_MDL7
|
/** \struct Triangle_MDL7
|
||||||
|
@ -571,7 +549,7 @@ struct Triangle_MDL7
|
||||||
|
|
||||||
//! Two skinsets. The second will be used for multi-texturing
|
//! Two skinsets. The second will be used for multi-texturing
|
||||||
SkinSet_MDL7 skinsets[2];
|
SkinSet_MDL7 skinsets[2];
|
||||||
} PACK_STRUCT;
|
} /* PACK_STRUCT */;
|
||||||
|
|
||||||
#if (!defined AI_MDL7_TRIANGLE_STD_SIZE_ONE_UV)
|
#if (!defined AI_MDL7_TRIANGLE_STD_SIZE_ONE_UV)
|
||||||
# define AI_MDL7_TRIANGLE_STD_SIZE_ONE_UV (6+sizeof(SkinSet_MDL7)-sizeof(uint32_t))
|
# define AI_MDL7_TRIANGLE_STD_SIZE_ONE_UV (6+sizeof(SkinSet_MDL7)-sizeof(uint32_t))
|
||||||
|
@ -599,7 +577,7 @@ struct Vertex
|
||||||
{
|
{
|
||||||
uint8_t v[3];
|
uint8_t v[3];
|
||||||
uint8_t normalIndex;
|
uint8_t normalIndex;
|
||||||
} PACK_STRUCT;
|
} /* PACK_STRUCT */;
|
||||||
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------------
|
||||||
|
@ -625,8 +603,7 @@ struct Vertex_MDL7
|
||||||
uint8_t norm162index;
|
uint8_t norm162index;
|
||||||
float norm[3];
|
float norm[3];
|
||||||
};
|
};
|
||||||
} PACK_STRUCT;
|
} /* PACK_STRUCT */;
|
||||||
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------------
|
||||||
/** \struct BoneTransform_MDL7
|
/** \struct BoneTransform_MDL7
|
||||||
|
@ -643,12 +620,11 @@ struct BoneTransform_MDL7
|
||||||
//! I HATE 3DGS AND THE SILLY DEVELOPER WHO DESIGNED
|
//! I HATE 3DGS AND THE SILLY DEVELOPER WHO DESIGNED
|
||||||
//! THIS STUPID FILE FORMAT!
|
//! THIS STUPID FILE FORMAT!
|
||||||
int8_t _unused_[2];
|
int8_t _unused_[2];
|
||||||
} PACK_STRUCT;
|
} /* PACK_STRUCT */;
|
||||||
|
|
||||||
|
|
||||||
#define AI_MDL7_MAX_FRAMENAMESIZE 16
|
#define AI_MDL7_MAX_FRAMENAMESIZE 16
|
||||||
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------------
|
||||||
/** \struct Frame_MDL7
|
/** \struct Frame_MDL7
|
||||||
* \brief Frame data structure used by MDL7 files
|
* \brief Frame data structure used by MDL7 files
|
||||||
|
@ -678,7 +654,7 @@ struct SimpleFrame
|
||||||
|
|
||||||
//! Vertex list of the frame
|
//! Vertex list of the frame
|
||||||
Vertex *verts;
|
Vertex *verts;
|
||||||
} PACK_STRUCT;
|
} /* PACK_STRUCT */;
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------------
|
||||||
/** \struct Frame
|
/** \struct Frame
|
||||||
|
@ -691,7 +667,7 @@ struct Frame
|
||||||
|
|
||||||
//! Frame data
|
//! Frame data
|
||||||
SimpleFrame frame;
|
SimpleFrame frame;
|
||||||
} PACK_STRUCT;
|
} /* PACK_STRUCT */;
|
||||||
|
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------------
|
||||||
|
@ -708,7 +684,7 @@ struct SimpleFrame_MDLn_SP
|
||||||
|
|
||||||
//! Vertex list of the frame
|
//! Vertex list of the frame
|
||||||
Vertex_MDL4 *verts;
|
Vertex_MDL4 *verts;
|
||||||
} PACK_STRUCT;
|
} /* PACK_STRUCT */;
|
||||||
|
|
||||||
// -------------------------------------------------------------------------------------
|
// -------------------------------------------------------------------------------------
|
||||||
/** \struct GroupFrame
|
/** \struct GroupFrame
|
||||||
|
@ -730,7 +706,7 @@ struct GroupFrame
|
||||||
|
|
||||||
//! List of single frames
|
//! List of single frames
|
||||||
SimpleFrame *frames;
|
SimpleFrame *frames;
|
||||||
} PACK_STRUCT;
|
} /* PACK_STRUCT */;
|
||||||
|
|
||||||
#include "./../include/assimp/Compiler/poppack1.h"
|
#include "./../include/assimp/Compiler/poppack1.h"
|
||||||
|
|
||||||
|
@ -738,8 +714,7 @@ struct GroupFrame
|
||||||
/** \struct IntFace_MDL7
|
/** \struct IntFace_MDL7
|
||||||
* \brief Internal data structure to temporarily represent a face
|
* \brief Internal data structure to temporarily represent a face
|
||||||
*/
|
*/
|
||||||
struct IntFace_MDL7
|
struct IntFace_MDL7 {
|
||||||
{
|
|
||||||
// provide a constructor for our own convenience
|
// provide a constructor for our own convenience
|
||||||
IntFace_MDL7()
|
IntFace_MDL7()
|
||||||
{
|
{
|
||||||
|
|
|
@ -109,28 +109,6 @@ ObjFile::Model *ObjFileParser::GetModel() const {
|
||||||
return m_pModel;
|
return m_pModel;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*void ignoreNewLines(IOStreamBuffer<char> &streamBuffer, std::vector<char> &buffer)
|
|
||||||
{
|
|
||||||
auto curPosition = buffer.begin();
|
|
||||||
do
|
|
||||||
{
|
|
||||||
while (*curPosition!='\n'&&*curPosition!='\\')
|
|
||||||
{
|
|
||||||
++curPosition;
|
|
||||||
}
|
|
||||||
if (*curPosition=='\\')
|
|
||||||
{
|
|
||||||
std::vector<char> tempBuf;
|
|
||||||
do
|
|
||||||
{
|
|
||||||
streamBuffer.getNextDataLine(tempBuf, '\\' );
|
|
||||||
} while (tempBuf[0]=='\n');
|
|
||||||
*curPosition = ' ';
|
|
||||||
std::copy(tempBuf.cbegin(), tempBuf.cend(), ++curPosition);
|
|
||||||
}
|
|
||||||
} while (*curPosition!='\n');
|
|
||||||
}*/
|
|
||||||
|
|
||||||
void ObjFileParser::parseFile( IOStreamBuffer<char> &streamBuffer ) {
|
void ObjFileParser::parseFile( IOStreamBuffer<char> &streamBuffer ) {
|
||||||
// only update every 100KB or it'll be too slow
|
// only update every 100KB or it'll be too slow
|
||||||
//const unsigned int updateProgressEveryBytes = 100 * 1024;
|
//const unsigned int updateProgressEveryBytes = 100 * 1024;
|
||||||
|
@ -201,7 +179,18 @@ void ObjFileParser::parseFile( IOStreamBuffer<char> &streamBuffer ) {
|
||||||
|
|
||||||
case 'u': // Parse a material desc. setter
|
case 'u': // Parse a material desc. setter
|
||||||
{
|
{
|
||||||
getMaterialDesc();
|
std::string name;
|
||||||
|
|
||||||
|
getNameNoSpace(m_DataIt, m_DataItEnd, name);
|
||||||
|
|
||||||
|
size_t nextSpace = name.find(" ");
|
||||||
|
if (nextSpace != std::string::npos)
|
||||||
|
name = name.substr(0, nextSpace);
|
||||||
|
|
||||||
|
if(name == "usemtl")
|
||||||
|
{
|
||||||
|
getMaterialDesc();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
|
@ -91,11 +91,11 @@ static inline std::string &TrimLeft(std::string &s, bool newlines = true)
|
||||||
{
|
{
|
||||||
if (!newlines)
|
if (!newlines)
|
||||||
{
|
{
|
||||||
s.erase(s.begin(), std::find_if(s.begin(), s.end(), std::not1(std::ptr_fun(Assimp::IsSpace<char>))));
|
s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](char c) { return !Assimp::IsSpace<char>(c); }));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
s.erase(s.begin(), std::find_if(s.begin(), s.end(), std::not1(std::ptr_fun(Assimp::IsSpaceOrNewLine<char>))));
|
s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](char c) { return !Assimp::IsSpaceOrNewLine<char>(c); }));
|
||||||
}
|
}
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
@ -105,11 +105,11 @@ static inline std::string &TrimRight(std::string &s, bool newlines = true)
|
||||||
{
|
{
|
||||||
if (!newlines)
|
if (!newlines)
|
||||||
{
|
{
|
||||||
s.erase(std::find_if(s.rbegin(), s.rend(), std::not1(std::ptr_fun(Assimp::IsSpace<char>))).base(),s.end());
|
s.erase(std::find_if(s.rbegin(), s.rend(), [](char c) { return !Assimp::IsSpace<char>(c); }).base(),s.end());
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
s.erase(s.begin(), std::find_if(s.begin(), s.end(), std::not1(std::ptr_fun(Assimp::IsSpaceOrNewLine<char>))));
|
s.erase(s.begin(), std::find_if(s.begin(), s.end(), [](char c) { return !Assimp::IsSpaceOrNewLine<char>(c); }));
|
||||||
}
|
}
|
||||||
return s;
|
return s;
|
||||||
}
|
}
|
||||||
|
|
|
@ -49,7 +49,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
#include "OptimizeGraph.h"
|
#include "OptimizeGraph.h"
|
||||||
#include "ProcessHelper.h"
|
#include "ProcessHelper.h"
|
||||||
#include "SceneCombiner.h"
|
#include <assimp/SceneCombiner.h>
|
||||||
#include "Exceptional.h"
|
#include "Exceptional.h"
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
|
|
||||||
|
|
|
@ -50,7 +50,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
#include "OptimizeMeshes.h"
|
#include "OptimizeMeshes.h"
|
||||||
#include "ProcessHelper.h"
|
#include "ProcessHelper.h"
|
||||||
#include "SceneCombiner.h"
|
#include <assimp/SceneCombiner.h>
|
||||||
#include "Exceptional.h"
|
#include "Exceptional.h"
|
||||||
|
|
||||||
using namespace Assimp;
|
using namespace Assimp;
|
||||||
|
|
|
@ -159,6 +159,9 @@ void PLYImporter::InternReadFile(const std::string& pFile,
|
||||||
|
|
||||||
// Get the file-size
|
// Get the file-size
|
||||||
size_t fileSize = fileStream->FileSize();
|
size_t fileSize = fileStream->FileSize();
|
||||||
|
if ( 0 == fileSize ) {
|
||||||
|
throw DeadlyImportError("File " + pFile + " is empty.");
|
||||||
|
}
|
||||||
|
|
||||||
IOStreamBuffer<char> streamedBuffer(1024 * 1024);
|
IOStreamBuffer<char> streamedBuffer(1024 * 1024);
|
||||||
streamedBuffer.open(fileStream.get());
|
streamedBuffer.open(fileStream.get());
|
||||||
|
|
|
@ -935,30 +935,6 @@ bool PLY::PropertyInstance::ParseValue(const char* &pCur,
|
||||||
ai_assert(NULL != out);
|
ai_assert(NULL != out);
|
||||||
|
|
||||||
//calc element size
|
//calc element size
|
||||||
unsigned int lsize = 0;
|
|
||||||
switch (eType)
|
|
||||||
{
|
|
||||||
case EDT_Char:
|
|
||||||
case EDT_UChar:
|
|
||||||
lsize = 1;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case EDT_UShort:
|
|
||||||
case EDT_Short:
|
|
||||||
lsize = 2;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case EDT_UInt:
|
|
||||||
case EDT_Int:
|
|
||||||
case EDT_Float:
|
|
||||||
lsize = 4;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case EDT_Double:
|
|
||||||
lsize = 8;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool ret = true;
|
bool ret = true;
|
||||||
switch (eType)
|
switch (eType)
|
||||||
{
|
{
|
||||||
|
@ -990,6 +966,7 @@ bool PLY::PropertyInstance::ParseValue(const char* &pCur,
|
||||||
out->fDouble = (double)d;
|
out->fDouble = (double)d;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case EDT_INVALID:
|
||||||
default:
|
default:
|
||||||
ret = false;
|
ret = false;
|
||||||
break;
|
break;
|
||||||
|
@ -1032,6 +1009,10 @@ bool PLY::PropertyInstance::ParseValueBinary(IOStreamBuffer<char> &streamBuffer,
|
||||||
case EDT_Double:
|
case EDT_Double:
|
||||||
lsize = 8;
|
lsize = 8;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case EDT_INVALID:
|
||||||
|
default:
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
//read the next file block if needed
|
//read the next file block if needed
|
||||||
|
|
|
@ -47,7 +47,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
#include "PretransformVertices.h"
|
#include "PretransformVertices.h"
|
||||||
#include "ProcessHelper.h"
|
#include "ProcessHelper.h"
|
||||||
#include "SceneCombiner.h"
|
#include <assimp/SceneCombiner.h>
|
||||||
#include "Exceptional.h"
|
#include "Exceptional.h"
|
||||||
|
|
||||||
using namespace Assimp;
|
using namespace Assimp;
|
||||||
|
|
|
@ -51,7 +51,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
* OptimizeGraph step.
|
* OptimizeGraph step.
|
||||||
*/
|
*/
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
#include "SceneCombiner.h"
|
#include <assimp/SceneCombiner.h>
|
||||||
#include "StringUtils.h"
|
#include "StringUtils.h"
|
||||||
#include "fast_atof.h"
|
#include "fast_atof.h"
|
||||||
#include "Hash.h"
|
#include "Hash.h"
|
||||||
|
|
|
@ -43,12 +43,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
#ifndef ASSIMP_BUILD_NO_EXPORT
|
#ifndef ASSIMP_BUILD_NO_EXPORT
|
||||||
#ifndef ASSIMP_BUILD_NO_STEP_EXPORTER
|
#ifndef ASSIMP_BUILD_NO_STEP_EXPORTER
|
||||||
|
|
||||||
#include "StepExporter.h"
|
#include "StepExporter.h"
|
||||||
#include "ConvertToLHProcess.h"
|
#include "ConvertToLHProcess.h"
|
||||||
#include "Bitmap.h"
|
#include "Bitmap.h"
|
||||||
#include "BaseImporter.h"
|
#include "BaseImporter.h"
|
||||||
#include "fast_atof.h"
|
#include "fast_atof.h"
|
||||||
#include "SceneCombiner.h"
|
#include <assimp/SceneCombiner.h>
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
#include <set>
|
#include <set>
|
||||||
|
|
|
@ -40,7 +40,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "Subdivision.h"
|
#include "Subdivision.h"
|
||||||
#include "SceneCombiner.h"
|
#include <assimp/SceneCombiner.h>
|
||||||
#include "SpatialSort.h"
|
#include "SpatialSort.h"
|
||||||
#include "ProcessHelper.h"
|
#include "ProcessHelper.h"
|
||||||
#include "Vertex.h"
|
#include "Vertex.h"
|
||||||
|
|
|
@ -140,7 +140,7 @@ void X3DExporter::AttrHelper_Col3DArrToString(const aiColor3D* pArray, const siz
|
||||||
AttrHelper_CommaToPoint(pTargetString);
|
AttrHelper_CommaToPoint(pTargetString);
|
||||||
}
|
}
|
||||||
|
|
||||||
void X3DExporter::AttrHelper_Color3ToAttrList(std::list<SAttribute> pList, const std::string& pName, const aiColor3D& pValue, const aiColor3D& pDefaultValue)
|
void X3DExporter::AttrHelper_Color3ToAttrList(std::list<SAttribute>& pList, const std::string& pName, const aiColor3D& pValue, const aiColor3D& pDefaultValue)
|
||||||
{
|
{
|
||||||
string tstr;
|
string tstr;
|
||||||
|
|
||||||
|
@ -150,7 +150,7 @@ string tstr;
|
||||||
pList.push_back({pName, tstr});
|
pList.push_back({pName, tstr});
|
||||||
}
|
}
|
||||||
|
|
||||||
void X3DExporter::AttrHelper_FloatToAttrList(std::list<SAttribute> pList, const string& pName, const float pValue, const float pDefaultValue)
|
void X3DExporter::AttrHelper_FloatToAttrList(std::list<SAttribute>& pList, const string& pName, const float pValue, const float pDefaultValue)
|
||||||
{
|
{
|
||||||
string tstr;
|
string tstr;
|
||||||
|
|
||||||
|
|
|
@ -134,7 +134,7 @@ private:
|
||||||
|
|
||||||
/// \fn void AttrHelper_FloatToAttrList(std::list<SAttribute> pList, const std::string& pName, const float pValue, const float pDefaultValue)
|
/// \fn void AttrHelper_FloatToAttrList(std::list<SAttribute> pList, const std::string& pName, const float pValue, const float pDefaultValue)
|
||||||
/// \overload void AttrHelper_Col3DArrToString(const aiColor3D* pArray, const size_t pArray_Size, std::string& pTargetString)
|
/// \overload void AttrHelper_Col3DArrToString(const aiColor3D* pArray, const size_t pArray_Size, std::string& pTargetString)
|
||||||
void AttrHelper_FloatToAttrList(std::list<SAttribute> pList, const std::string& pName, const float pValue, const float pDefaultValue);
|
void AttrHelper_FloatToAttrList(std::list<SAttribute> &pList, const std::string& pName, const float pValue, const float pDefaultValue);
|
||||||
|
|
||||||
/// \fn void AttrHelper_Color3ToAttrList(std::list<SAttribute> pList, const std::string& pName, const aiColor3D& pValue, const aiColor3D& pDefaultValue)
|
/// \fn void AttrHelper_Color3ToAttrList(std::list<SAttribute> pList, const std::string& pName, const aiColor3D& pValue, const aiColor3D& pDefaultValue)
|
||||||
/// Add attribute to list if value not equal to default.
|
/// Add attribute to list if value not equal to default.
|
||||||
|
@ -142,7 +142,7 @@ private:
|
||||||
/// \param [in] pName - name of new attribute.
|
/// \param [in] pName - name of new attribute.
|
||||||
/// \param [in] pValue - value of the new attribute.
|
/// \param [in] pValue - value of the new attribute.
|
||||||
/// \param [in] pDefaultValue - default value for checking: if pValue is equal to pDefaultValue then attribute will not be added.
|
/// \param [in] pDefaultValue - default value for checking: if pValue is equal to pDefaultValue then attribute will not be added.
|
||||||
void AttrHelper_Color3ToAttrList(std::list<SAttribute> pList, const std::string& pName, const aiColor3D& pValue, const aiColor3D& pDefaultValue);
|
void AttrHelper_Color3ToAttrList(std::list<SAttribute> &pList, const std::string& pName, const aiColor3D& pValue, const aiColor3D& pDefaultValue);
|
||||||
|
|
||||||
/// \fn void NodeHelper_OpenNode(const std::string& pNodeName, const size_t pTabLevel, const bool pEmptyElement, const std::list<SAttribute>& pAttrList)
|
/// \fn void NodeHelper_OpenNode(const std::string& pNodeName, const size_t pTabLevel, const bool pEmptyElement, const std::list<SAttribute>& pAttrList)
|
||||||
/// Begin new XML-node element.
|
/// Begin new XML-node element.
|
||||||
|
|
|
@ -52,10 +52,12 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
// Header files, Assimp.
|
// Header files, Assimp.
|
||||||
#include <assimp/DefaultIOSystem.h>
|
#include <assimp/DefaultIOSystem.h>
|
||||||
#include "fast_atof.h"
|
#include "fast_atof.h"
|
||||||
|
#include "FIReader.hpp"
|
||||||
|
|
||||||
// Header files, stdlib.
|
// Header files, stdlib.
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <iterator>
|
||||||
|
|
||||||
namespace Assimp {
|
namespace Assimp {
|
||||||
|
|
||||||
|
@ -66,14 +68,53 @@ const aiImporterDesc X3DImporter::Description = {
|
||||||
"smalcom",
|
"smalcom",
|
||||||
"",
|
"",
|
||||||
"See documentation in source code. Chapter: Limitations.",
|
"See documentation in source code. Chapter: Limitations.",
|
||||||
aiImporterFlags_SupportTextFlavour | aiImporterFlags_LimitedSupport | aiImporterFlags_Experimental,
|
aiImporterFlags_SupportTextFlavour | aiImporterFlags_SupportBinaryFlavour | aiImporterFlags_LimitedSupport | aiImporterFlags_Experimental,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
"x3d"
|
"x3d x3db"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
//const std::regex X3DImporter::pattern_nws(R"([^, \t\r\n]+)");
|
||||||
|
//const std::regex X3DImporter::pattern_true(R"(^\s*(?:true|1)\s*$)", std::regex::icase);
|
||||||
|
|
||||||
|
struct WordIterator: public std::iterator<std::input_iterator_tag, const char*> {
|
||||||
|
static const char *whitespace;
|
||||||
|
const char *start_, *end_;
|
||||||
|
WordIterator(const char *start, const char *end): start_(start), end_(end) {
|
||||||
|
start_ = start + strspn(start, whitespace);
|
||||||
|
if (start_ >= end_) {
|
||||||
|
start_ = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
WordIterator(): start_(0), end_(0) {}
|
||||||
|
WordIterator(const WordIterator &other): start_(other.start_), end_(other.end_) {}
|
||||||
|
WordIterator &operator=(const WordIterator &other) {
|
||||||
|
start_ = other.start_;
|
||||||
|
end_ = other.end_;
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
bool operator==(WordIterator &other) const { return start_ == other.start_; }
|
||||||
|
bool operator!=(WordIterator &other) const { return start_ != other.start_; }
|
||||||
|
WordIterator &operator++() {
|
||||||
|
start_ += strcspn(start_, whitespace);
|
||||||
|
start_ += strspn(start_, whitespace);
|
||||||
|
if (start_ >= end_) {
|
||||||
|
start_ = 0;
|
||||||
|
}
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
WordIterator operator++(int) {
|
||||||
|
WordIterator result(*this);
|
||||||
|
++(*this);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
const char *operator*() const { return start_; }
|
||||||
|
};
|
||||||
|
|
||||||
|
const char *WordIterator::whitespace = ", \t\r\n";
|
||||||
|
|
||||||
X3DImporter::X3DImporter()
|
X3DImporter::X3DImporter()
|
||||||
: NodeElement_Cur( nullptr )
|
: NodeElement_Cur( nullptr )
|
||||||
, mReader( nullptr ) {
|
, mReader( nullptr ) {
|
||||||
|
@ -81,7 +122,6 @@ X3DImporter::X3DImporter()
|
||||||
}
|
}
|
||||||
|
|
||||||
X3DImporter::~X3DImporter() {
|
X3DImporter::~X3DImporter() {
|
||||||
delete mReader;
|
|
||||||
// Clear() is accounting if data already is deleted. So, just check again if all data is deleted.
|
// Clear() is accounting if data already is deleted. So, just check again if all data is deleted.
|
||||||
Clear();
|
Clear();
|
||||||
}
|
}
|
||||||
|
@ -241,7 +281,7 @@ void X3DImporter::XML_CheckNode_MustBeEmpty()
|
||||||
|
|
||||||
void X3DImporter::XML_CheckNode_SkipUnsupported(const std::string& pParentNodeName)
|
void X3DImporter::XML_CheckNode_SkipUnsupported(const std::string& pParentNodeName)
|
||||||
{
|
{
|
||||||
static const size_t Uns_Skip_Len = 190;
|
static const size_t Uns_Skip_Len = 192;
|
||||||
const char* Uns_Skip[ Uns_Skip_Len ] = {
|
const char* Uns_Skip[ Uns_Skip_Len ] = {
|
||||||
// CAD geometry component
|
// CAD geometry component
|
||||||
"CADAssembly", "CADFace", "CADLayer", "CADPart", "IndexedQuadSet", "QuadSet",
|
"CADAssembly", "CADFace", "CADLayer", "CADPart", "IndexedQuadSet", "QuadSet",
|
||||||
|
@ -276,7 +316,7 @@ void X3DImporter::XML_CheckNode_SkipUnsupported(const std::string& pParentNodeNa
|
||||||
// Navigation component
|
// Navigation component
|
||||||
"Billboard", "Collision", "LOD", "NavigationInfo", "OrthoViewpoint", "Viewpoint", "ViewpointGroup",
|
"Billboard", "Collision", "LOD", "NavigationInfo", "OrthoViewpoint", "Viewpoint", "ViewpointGroup",
|
||||||
// Networking component
|
// Networking component
|
||||||
"Anchor", "LoadSensor",
|
"EXPORT", "IMPORT", "Anchor", "LoadSensor",
|
||||||
// NURBS component
|
// NURBS component
|
||||||
"Contour2D", "ContourPolyline2D", "CoordinateDouble", "NurbsCurve", "NurbsCurve2D", "NurbsOrientationInterpolator", "NurbsPatchSurface",
|
"Contour2D", "ContourPolyline2D", "CoordinateDouble", "NurbsCurve", "NurbsCurve2D", "NurbsOrientationInterpolator", "NurbsPatchSurface",
|
||||||
"NurbsPositionInterpolator", "NurbsSet", "NurbsSurfaceInterpolator", "NurbsSweptSurface", "NurbsSwungSurface", "NurbsTextureCoordinate",
|
"NurbsPositionInterpolator", "NurbsSet", "NurbsSurfaceInterpolator", "NurbsSweptSurface", "NurbsSwungSurface", "NurbsTextureCoordinate",
|
||||||
|
@ -368,38 +408,65 @@ bool X3DImporter::XML_SearchNode(const std::string& pNodeName)
|
||||||
|
|
||||||
bool X3DImporter::XML_ReadNode_GetAttrVal_AsBool(const int pAttrIdx)
|
bool X3DImporter::XML_ReadNode_GetAttrVal_AsBool(const int pAttrIdx)
|
||||||
{
|
{
|
||||||
std::string val(mReader->getAttributeValue(pAttrIdx));
|
auto boolValue = std::dynamic_pointer_cast<const FIBoolValue>(mReader->getAttributeEncodedValue(pAttrIdx));
|
||||||
|
if (boolValue) {
|
||||||
|
if (boolValue->value.size() == 1) {
|
||||||
|
return boolValue->value.front();
|
||||||
|
}
|
||||||
|
throw DeadlyImportError("Invalid bool value");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
std::string val(mReader->getAttributeValue(pAttrIdx));
|
||||||
|
|
||||||
if(val == "false")
|
if(val == "false")
|
||||||
return false;
|
return false;
|
||||||
else if(val == "true")
|
else if(val == "true")
|
||||||
return true;
|
return true;
|
||||||
else
|
else
|
||||||
throw DeadlyImportError("Bool attribute value can contain \"false\" or \"true\" not the \"" + val + "\"");
|
throw DeadlyImportError("Bool attribute value can contain \"false\" or \"true\" not the \"" + val + "\"");
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
float X3DImporter::XML_ReadNode_GetAttrVal_AsFloat(const int pAttrIdx)
|
float X3DImporter::XML_ReadNode_GetAttrVal_AsFloat(const int pAttrIdx)
|
||||||
{
|
{
|
||||||
std::string val;
|
auto floatValue = std::dynamic_pointer_cast<const FIFloatValue>(mReader->getAttributeEncodedValue(pAttrIdx));
|
||||||
float tvalf;
|
if (floatValue) {
|
||||||
|
if (floatValue->value.size() == 1) {
|
||||||
|
return floatValue->value.front();
|
||||||
|
}
|
||||||
|
throw DeadlyImportError("Invalid float value");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
std::string val;
|
||||||
|
float tvalf;
|
||||||
|
|
||||||
ParseHelper_FixTruncatedFloatString(mReader->getAttributeValue(pAttrIdx), val);
|
ParseHelper_FixTruncatedFloatString(mReader->getAttributeValue(pAttrIdx), val);
|
||||||
fast_atoreal_move(val.c_str(), tvalf, false);
|
fast_atoreal_move(val.c_str(), tvalf, false);
|
||||||
|
|
||||||
return tvalf;
|
return tvalf;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t X3DImporter::XML_ReadNode_GetAttrVal_AsI32(const int pAttrIdx)
|
int32_t X3DImporter::XML_ReadNode_GetAttrVal_AsI32(const int pAttrIdx)
|
||||||
{
|
{
|
||||||
return strtol10(mReader->getAttributeValue(pAttrIdx));
|
auto intValue = std::dynamic_pointer_cast<const FIIntValue>(mReader->getAttributeEncodedValue(pAttrIdx));
|
||||||
|
if (intValue) {
|
||||||
|
if (intValue->value.size() == 1) {
|
||||||
|
return intValue->value.front();
|
||||||
|
}
|
||||||
|
throw DeadlyImportError("Invalid int value");
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return strtol10(mReader->getAttributeValue(pAttrIdx));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void X3DImporter::XML_ReadNode_GetAttrVal_AsCol3f(const int pAttrIdx, aiColor3D& pValue)
|
void X3DImporter::XML_ReadNode_GetAttrVal_AsCol3f(const int pAttrIdx, aiColor3D& pValue)
|
||||||
{
|
{
|
||||||
std::list<float> tlist;
|
std::vector<float> tlist;
|
||||||
std::list<float>::iterator it;
|
std::vector<float>::iterator it;
|
||||||
|
|
||||||
XML_ReadNode_GetAttrVal_AsListF(pAttrIdx, tlist);
|
XML_ReadNode_GetAttrVal_AsArrF(pAttrIdx, tlist);
|
||||||
if(tlist.size() != 3) Throw_ConvertFail_Str2ArrF(mReader->getAttributeValue(pAttrIdx));
|
if(tlist.size() != 3) Throw_ConvertFail_Str2ArrF(mReader->getAttributeValue(pAttrIdx));
|
||||||
|
|
||||||
it = tlist.begin();
|
it = tlist.begin();
|
||||||
|
@ -410,10 +477,10 @@ void X3DImporter::XML_ReadNode_GetAttrVal_AsCol3f(const int pAttrIdx, aiColor3D&
|
||||||
|
|
||||||
void X3DImporter::XML_ReadNode_GetAttrVal_AsVec2f(const int pAttrIdx, aiVector2D& pValue)
|
void X3DImporter::XML_ReadNode_GetAttrVal_AsVec2f(const int pAttrIdx, aiVector2D& pValue)
|
||||||
{
|
{
|
||||||
std::list<float> tlist;
|
std::vector<float> tlist;
|
||||||
std::list<float>::iterator it;
|
std::vector<float>::iterator it;
|
||||||
|
|
||||||
XML_ReadNode_GetAttrVal_AsListF(pAttrIdx, tlist);
|
XML_ReadNode_GetAttrVal_AsArrF(pAttrIdx, tlist);
|
||||||
if(tlist.size() != 2) Throw_ConvertFail_Str2ArrF(mReader->getAttributeValue(pAttrIdx));
|
if(tlist.size() != 2) Throw_ConvertFail_Str2ArrF(mReader->getAttributeValue(pAttrIdx));
|
||||||
|
|
||||||
it = tlist.begin();
|
it = tlist.begin();
|
||||||
|
@ -423,10 +490,10 @@ void X3DImporter::XML_ReadNode_GetAttrVal_AsVec2f(const int pAttrIdx, aiVector2D
|
||||||
|
|
||||||
void X3DImporter::XML_ReadNode_GetAttrVal_AsVec3f(const int pAttrIdx, aiVector3D& pValue)
|
void X3DImporter::XML_ReadNode_GetAttrVal_AsVec3f(const int pAttrIdx, aiVector3D& pValue)
|
||||||
{
|
{
|
||||||
std::list<float> tlist;
|
std::vector<float> tlist;
|
||||||
std::list<float>::iterator it;
|
std::vector<float>::iterator it;
|
||||||
|
|
||||||
XML_ReadNode_GetAttrVal_AsListF(pAttrIdx, tlist);
|
XML_ReadNode_GetAttrVal_AsArrF(pAttrIdx, tlist);
|
||||||
if(tlist.size() != 3) Throw_ConvertFail_Str2ArrF(mReader->getAttributeValue(pAttrIdx));
|
if(tlist.size() != 3) Throw_ConvertFail_Str2ArrF(mReader->getAttributeValue(pAttrIdx));
|
||||||
|
|
||||||
it = tlist.begin();
|
it = tlist.begin();
|
||||||
|
@ -435,181 +502,95 @@ void X3DImporter::XML_ReadNode_GetAttrVal_AsVec3f(const int pAttrIdx, aiVector3D
|
||||||
pValue.z = *it;
|
pValue.z = *it;
|
||||||
}
|
}
|
||||||
|
|
||||||
void X3DImporter::XML_ReadNode_GetAttrVal_AsListB(const int pAttrIdx, std::list<bool>& pValue)
|
|
||||||
{
|
|
||||||
// make copy of attribute value - string with list of bool values. Also all bool values is strings.
|
|
||||||
size_t tok_str_len = strlen(mReader->getAttributeValue(pAttrIdx));
|
|
||||||
if ( 0 == tok_str_len ) {
|
|
||||||
Throw_IncorrectAttrValue( mReader->getAttributeName( pAttrIdx ) );
|
|
||||||
}
|
|
||||||
|
|
||||||
tok_str_len++;// take in account terminating '\0'.
|
|
||||||
char *tok_str = new char[tok_str_len];
|
|
||||||
|
|
||||||
strcpy(tok_str, mReader->getAttributeValue(pAttrIdx));
|
|
||||||
// change all spacebars to symbol '\0'. That is needed for parsing.
|
|
||||||
for(size_t i = 0; i < tok_str_len; i++)
|
|
||||||
{
|
|
||||||
if(tok_str[i] == ' ') tok_str[i] = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
// at now check what current token is
|
|
||||||
for(char *tok_cur = tok_str, *tok_end = (tok_str + tok_str_len); tok_cur < tok_end;)
|
|
||||||
{
|
|
||||||
if(strncmp(tok_cur, "true", 4) == 0)
|
|
||||||
{
|
|
||||||
pValue.push_back(true);
|
|
||||||
tok_cur += 5;// five, not four. Because '\0' must be skipped too.
|
|
||||||
}
|
|
||||||
else if(strncmp(tok_cur, "false", 5) == 0)
|
|
||||||
{
|
|
||||||
pValue.push_back(true);
|
|
||||||
tok_cur += 6;// six, not five. Because '\0' must be skipped too.
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Throw_IncorrectAttrValue(mReader->getAttributeName(pAttrIdx));
|
|
||||||
}
|
|
||||||
}// for(char* tok_cur = tok_str, tok_end = (tok_str + tok_str_len); tok_cur < tok_end;)
|
|
||||||
|
|
||||||
// delete temporary string
|
|
||||||
delete [] tok_str;
|
|
||||||
}
|
|
||||||
|
|
||||||
void X3DImporter::XML_ReadNode_GetAttrVal_AsArrB(const int pAttrIdx, std::vector<bool>& pValue)
|
void X3DImporter::XML_ReadNode_GetAttrVal_AsArrB(const int pAttrIdx, std::vector<bool>& pValue)
|
||||||
{
|
{
|
||||||
std::list<bool> tlist;
|
auto boolValue = std::dynamic_pointer_cast<const FIBoolValue>(mReader->getAttributeEncodedValue(pAttrIdx));
|
||||||
|
if (boolValue) {
|
||||||
|
pValue = boolValue->value;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const char *val = mReader->getAttributeValue(pAttrIdx);
|
||||||
|
pValue.clear();
|
||||||
|
|
||||||
XML_ReadNode_GetAttrVal_AsListB(pAttrIdx, tlist);// read as list
|
//std::cregex_iterator wordItBegin(val, val + strlen(val), pattern_nws);
|
||||||
// and copy to array
|
//const std::cregex_iterator wordItEnd;
|
||||||
if(tlist.size() > 0)
|
//std::transform(wordItBegin, wordItEnd, std::back_inserter(pValue), [](const std::cmatch &match) { return std::regex_match(match.str(), pattern_true); });
|
||||||
{
|
|
||||||
pValue.reserve(tlist.size());
|
|
||||||
for(std::list<bool>::iterator it = tlist.begin(); it != tlist.end(); it++) pValue.push_back(*it);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void X3DImporter::XML_ReadNode_GetAttrVal_AsListI32(const int pAttrIdx, std::list<int32_t>& pValue)
|
WordIterator wordItBegin(val, val + strlen(val));
|
||||||
{
|
WordIterator wordItEnd;
|
||||||
const char* tstr = mReader->getAttributeValue(pAttrIdx);
|
std::transform(wordItBegin, wordItEnd, std::back_inserter(pValue), [](const char *match) { return (::tolower(match[0]) == 't') || (match[0] == '1'); });
|
||||||
const char* tstr_end = tstr + strlen(tstr);
|
}
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
const char* ostr;
|
|
||||||
|
|
||||||
int32_t tval32;
|
|
||||||
|
|
||||||
tval32 = strtol10(tstr, &ostr);
|
|
||||||
if(ostr == tstr) break;
|
|
||||||
|
|
||||||
while((ostr < tstr_end) && (*ostr == ' ')) ostr++;// skip spaces between values.
|
|
||||||
|
|
||||||
tstr = ostr;
|
|
||||||
pValue.push_back(tval32);
|
|
||||||
} while(tstr < tstr_end);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void X3DImporter::XML_ReadNode_GetAttrVal_AsArrI32(const int pAttrIdx, std::vector<int32_t>& pValue)
|
void X3DImporter::XML_ReadNode_GetAttrVal_AsArrI32(const int pAttrIdx, std::vector<int32_t>& pValue)
|
||||||
{
|
{
|
||||||
std::list<int32_t> tlist;
|
auto intValue = std::dynamic_pointer_cast<const FIIntValue>(mReader->getAttributeEncodedValue(pAttrIdx));
|
||||||
|
if (intValue) {
|
||||||
|
pValue = intValue->value;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const char *val = mReader->getAttributeValue(pAttrIdx);
|
||||||
|
pValue.clear();
|
||||||
|
|
||||||
XML_ReadNode_GetAttrVal_AsListI32(pAttrIdx, tlist);// read as list
|
//std::cregex_iterator wordItBegin(val, val + strlen(val), pattern_nws);
|
||||||
// and copy to array
|
//const std::cregex_iterator wordItEnd;
|
||||||
if(tlist.size() > 0)
|
//std::transform(wordItBegin, wordItEnd, std::back_inserter(pValue), [](const std::cmatch &match) { return std::stoi(match.str()); });
|
||||||
{
|
|
||||||
pValue.reserve(tlist.size());
|
|
||||||
for(std::list<int32_t>::iterator it = tlist.begin(); it != tlist.end(); it++) pValue.push_back(*it);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void X3DImporter::XML_ReadNode_GetAttrVal_AsListF(const int pAttrIdx, std::list<float>& pValue)
|
WordIterator wordItBegin(val, val + strlen(val));
|
||||||
{
|
WordIterator wordItEnd;
|
||||||
std::string str_fixed;
|
std::transform(wordItBegin, wordItEnd, std::back_inserter(pValue), [](const char *match) { return atoi(match); });
|
||||||
|
}
|
||||||
// at first check string values like '.xxx'.
|
|
||||||
ParseHelper_FixTruncatedFloatString(mReader->getAttributeValue(pAttrIdx), str_fixed);
|
|
||||||
if(!str_fixed.size()) Throw_ConvertFail_Str2ArrF(mReader->getAttributeValue(pAttrIdx));
|
|
||||||
|
|
||||||
// and convert all values and place it in list.
|
|
||||||
const char* pstr = str_fixed.c_str();
|
|
||||||
const char* pstr_end = pstr + str_fixed.size();
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
float tvalf;
|
|
||||||
|
|
||||||
while((*pstr == ' ') && (pstr < pstr_end)) pstr++;// skip spaces between values.
|
|
||||||
|
|
||||||
if(pstr < pstr_end)// additional check, because attribute value can be ended with spaces.
|
|
||||||
{
|
|
||||||
pstr = fast_atoreal_move(pstr, tvalf, false);
|
|
||||||
pValue.push_back(tvalf);
|
|
||||||
}
|
|
||||||
} while(pstr < pstr_end);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void X3DImporter::XML_ReadNode_GetAttrVal_AsArrF(const int pAttrIdx, std::vector<float>& pValue)
|
void X3DImporter::XML_ReadNode_GetAttrVal_AsArrF(const int pAttrIdx, std::vector<float>& pValue)
|
||||||
{
|
{
|
||||||
std::list<float> tlist;
|
auto floatValue = std::dynamic_pointer_cast<const FIFloatValue>(mReader->getAttributeEncodedValue(pAttrIdx));
|
||||||
|
if (floatValue) {
|
||||||
|
pValue = floatValue->value;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const char *val = mReader->getAttributeValue(pAttrIdx);
|
||||||
|
pValue.clear();
|
||||||
|
|
||||||
XML_ReadNode_GetAttrVal_AsListF(pAttrIdx, tlist);// read as list
|
//std::cregex_iterator wordItBegin(val, val + strlen(val), pattern_nws);
|
||||||
// and copy to array
|
//const std::cregex_iterator wordItEnd;
|
||||||
if(tlist.size() > 0)
|
//std::transform(wordItBegin, wordItEnd, std::back_inserter(pValue), [](const std::cmatch &match) { return std::stof(match.str()); });
|
||||||
{
|
|
||||||
pValue.reserve(tlist.size());
|
|
||||||
for(std::list<float>::iterator it = tlist.begin(); it != tlist.end(); it++) pValue.push_back(*it);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void X3DImporter::XML_ReadNode_GetAttrVal_AsListD(const int pAttrIdx, std::list<double>& pValue)
|
WordIterator wordItBegin(val, val + strlen(val));
|
||||||
{
|
WordIterator wordItEnd;
|
||||||
std::string str_fixed;
|
std::transform(wordItBegin, wordItEnd, std::back_inserter(pValue), [](const char *match) { return atof(match); });
|
||||||
|
}
|
||||||
// at first check string values like '.xxx'.
|
|
||||||
ParseHelper_FixTruncatedFloatString(mReader->getAttributeValue(pAttrIdx), str_fixed);
|
|
||||||
if(!str_fixed.size()) Throw_ConvertFail_Str2ArrF(mReader->getAttributeValue(pAttrIdx));
|
|
||||||
|
|
||||||
// and convert all values and place it in list.
|
|
||||||
const char* pstr = str_fixed.c_str();
|
|
||||||
const char* pstr_end = pstr + str_fixed.size();
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
double tvald;
|
|
||||||
|
|
||||||
while((*pstr == ' ') && (pstr < pstr_end)) pstr++;// skip spaces between values.
|
|
||||||
|
|
||||||
if(pstr < pstr_end)// additional check, because attribute value can be ended with spaces.
|
|
||||||
{
|
|
||||||
pstr = fast_atoreal_move(pstr, tvald, false);
|
|
||||||
pValue.push_back(tvald);
|
|
||||||
}
|
|
||||||
} while(pstr < pstr_end);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void X3DImporter::XML_ReadNode_GetAttrVal_AsArrD(const int pAttrIdx, std::vector<double>& pValue)
|
void X3DImporter::XML_ReadNode_GetAttrVal_AsArrD(const int pAttrIdx, std::vector<double>& pValue)
|
||||||
{
|
{
|
||||||
std::list<double> tlist;
|
auto doubleValue = std::dynamic_pointer_cast<const FIDoubleValue>(mReader->getAttributeEncodedValue(pAttrIdx));
|
||||||
|
if (doubleValue) {
|
||||||
|
pValue = doubleValue->value;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const char *val = mReader->getAttributeValue(pAttrIdx);
|
||||||
|
pValue.clear();
|
||||||
|
|
||||||
XML_ReadNode_GetAttrVal_AsListD(pAttrIdx, tlist);// read as list
|
//std::cregex_iterator wordItBegin(val, val + strlen(val), pattern_nws);
|
||||||
// and copy to array
|
//const std::cregex_iterator wordItEnd;
|
||||||
if(tlist.size() > 0)
|
//std::transform(wordItBegin, wordItEnd, std::back_inserter(pValue), [](const std::cmatch &match) { return std::stod(match.str()); });
|
||||||
{
|
|
||||||
pValue.reserve(tlist.size());
|
WordIterator wordItBegin(val, val + strlen(val));
|
||||||
for(std::list<double>::iterator it = tlist.begin(); it != tlist.end(); it++) pValue.push_back(*it);
|
WordIterator wordItEnd;
|
||||||
}
|
std::transform(wordItBegin, wordItEnd, std::back_inserter(pValue), [](const char *match) { return atof(match); });
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void X3DImporter::XML_ReadNode_GetAttrVal_AsListCol3f(const int pAttrIdx, std::list<aiColor3D>& pValue)
|
void X3DImporter::XML_ReadNode_GetAttrVal_AsListCol3f(const int pAttrIdx, std::list<aiColor3D>& pValue)
|
||||||
{
|
{
|
||||||
std::list<float> tlist;
|
std::vector<float> tlist;
|
||||||
|
|
||||||
XML_ReadNode_GetAttrVal_AsListF(pAttrIdx, tlist);// read as list
|
XML_ReadNode_GetAttrVal_AsArrF(pAttrIdx, tlist);// read as list
|
||||||
if(tlist.size() % 3) Throw_ConvertFail_Str2ArrF(mReader->getAttributeValue(pAttrIdx));
|
if(tlist.size() % 3) Throw_ConvertFail_Str2ArrF(mReader->getAttributeValue(pAttrIdx));
|
||||||
|
|
||||||
// copy data to array
|
// copy data to array
|
||||||
for(std::list<float>::iterator it = tlist.begin(); it != tlist.end();)
|
for(std::vector<float>::iterator it = tlist.begin(); it != tlist.end();)
|
||||||
{
|
{
|
||||||
aiColor3D tcol;
|
aiColor3D tcol;
|
||||||
|
|
||||||
|
@ -635,13 +616,13 @@ void X3DImporter::XML_ReadNode_GetAttrVal_AsArrCol3f(const int pAttrIdx, std::ve
|
||||||
|
|
||||||
void X3DImporter::XML_ReadNode_GetAttrVal_AsListCol4f(const int pAttrIdx, std::list<aiColor4D>& pValue)
|
void X3DImporter::XML_ReadNode_GetAttrVal_AsListCol4f(const int pAttrIdx, std::list<aiColor4D>& pValue)
|
||||||
{
|
{
|
||||||
std::list<float> tlist;
|
std::vector<float> tlist;
|
||||||
|
|
||||||
XML_ReadNode_GetAttrVal_AsListF(pAttrIdx, tlist);// read as list
|
XML_ReadNode_GetAttrVal_AsArrF(pAttrIdx, tlist);// read as list
|
||||||
if(tlist.size() % 4) Throw_ConvertFail_Str2ArrF(mReader->getAttributeValue(pAttrIdx));
|
if(tlist.size() % 4) Throw_ConvertFail_Str2ArrF(mReader->getAttributeValue(pAttrIdx));
|
||||||
|
|
||||||
// copy data to array
|
// copy data to array
|
||||||
for(std::list<float>::iterator it = tlist.begin(); it != tlist.end();)
|
for(std::vector<float>::iterator it = tlist.begin(); it != tlist.end();)
|
||||||
{
|
{
|
||||||
aiColor4D tcol;
|
aiColor4D tcol;
|
||||||
|
|
||||||
|
@ -671,16 +652,16 @@ void X3DImporter::XML_ReadNode_GetAttrVal_AsArrCol4f(const int pAttrIdx, std::ve
|
||||||
|
|
||||||
void X3DImporter::XML_ReadNode_GetAttrVal_AsListVec2f(const int pAttrIdx, std::list<aiVector2D>& pValue)
|
void X3DImporter::XML_ReadNode_GetAttrVal_AsListVec2f(const int pAttrIdx, std::list<aiVector2D>& pValue)
|
||||||
{
|
{
|
||||||
std::list<float> tlist;
|
std::vector<float> tlist;
|
||||||
|
|
||||||
XML_ReadNode_GetAttrVal_AsListF(pAttrIdx, tlist);// read as list
|
XML_ReadNode_GetAttrVal_AsArrF(pAttrIdx, tlist);// read as list
|
||||||
if ( tlist.size() % 2 )
|
if ( tlist.size() % 2 )
|
||||||
{
|
{
|
||||||
Throw_ConvertFail_Str2ArrF( mReader->getAttributeValue( pAttrIdx ) );
|
Throw_ConvertFail_Str2ArrF( mReader->getAttributeValue( pAttrIdx ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
// copy data to array
|
// copy data to array
|
||||||
for(std::list<float>::iterator it = tlist.begin(); it != tlist.end();)
|
for(std::vector<float>::iterator it = tlist.begin(); it != tlist.end();)
|
||||||
{
|
{
|
||||||
aiVector2D tvec;
|
aiVector2D tvec;
|
||||||
|
|
||||||
|
@ -708,16 +689,16 @@ void X3DImporter::XML_ReadNode_GetAttrVal_AsArrVec2f(const int pAttrIdx, std::ve
|
||||||
|
|
||||||
void X3DImporter::XML_ReadNode_GetAttrVal_AsListVec3f(const int pAttrIdx, std::list<aiVector3D>& pValue)
|
void X3DImporter::XML_ReadNode_GetAttrVal_AsListVec3f(const int pAttrIdx, std::list<aiVector3D>& pValue)
|
||||||
{
|
{
|
||||||
std::list<float> tlist;
|
std::vector<float> tlist;
|
||||||
|
|
||||||
XML_ReadNode_GetAttrVal_AsListF(pAttrIdx, tlist);// read as list
|
XML_ReadNode_GetAttrVal_AsArrF(pAttrIdx, tlist);// read as list
|
||||||
if ( tlist.size() % 3 )
|
if ( tlist.size() % 3 )
|
||||||
{
|
{
|
||||||
Throw_ConvertFail_Str2ArrF( mReader->getAttributeValue( pAttrIdx ) );
|
Throw_ConvertFail_Str2ArrF( mReader->getAttributeValue( pAttrIdx ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
// copy data to array
|
// copy data to array
|
||||||
for(std::list<float>::iterator it = tlist.begin(); it != tlist.end();)
|
for(std::vector<float>::iterator it = tlist.begin(); it != tlist.end();)
|
||||||
{
|
{
|
||||||
aiVector3D tvec;
|
aiVector3D tvec;
|
||||||
|
|
||||||
|
@ -907,9 +888,9 @@ void X3DImporter::GeometryHelper_MakeQL_RectParallelepiped(const aiVector3D& pSi
|
||||||
|
|
||||||
#undef MESH_RectParallelepiped_CREATE_VERT
|
#undef MESH_RectParallelepiped_CREATE_VERT
|
||||||
|
|
||||||
void X3DImporter::GeometryHelper_CoordIdxStr2FacesArr(const std::list<int32_t>& pCoordIdx, std::vector<aiFace>& pFaces, unsigned int& pPrimitiveTypes) const
|
void X3DImporter::GeometryHelper_CoordIdxStr2FacesArr(const std::vector<int32_t>& pCoordIdx, std::vector<aiFace>& pFaces, unsigned int& pPrimitiveTypes) const
|
||||||
{
|
{
|
||||||
std::list<int32_t> f_data(pCoordIdx);
|
std::vector<int32_t> f_data(pCoordIdx);
|
||||||
std::vector<unsigned int> inds;
|
std::vector<unsigned int> inds;
|
||||||
unsigned int prim_type = 0;
|
unsigned int prim_type = 0;
|
||||||
|
|
||||||
|
@ -922,7 +903,7 @@ void X3DImporter::GeometryHelper_CoordIdxStr2FacesArr(const std::list<int32_t>&
|
||||||
pFaces.reserve(f_data.size() / 3);
|
pFaces.reserve(f_data.size() / 3);
|
||||||
inds.reserve(4);
|
inds.reserve(4);
|
||||||
//PrintVectorSet("build. ci", pCoordIdx);
|
//PrintVectorSet("build. ci", pCoordIdx);
|
||||||
for(std::list<int32_t>::iterator it = f_data.begin(); it != f_data.end(); it++)
|
for(std::vector<int32_t>::iterator it = f_data.begin(); it != f_data.end(); it++)
|
||||||
{
|
{
|
||||||
// when face is got count how many indices in it.
|
// when face is got count how many indices in it.
|
||||||
if(*it == (-1))
|
if(*it == (-1))
|
||||||
|
@ -1014,7 +995,7 @@ void X3DImporter::MeshGeometry_AddColor(aiMesh& pMesh, const std::list<aiColor4D
|
||||||
}// if(pColorPerVertex) else
|
}// if(pColorPerVertex) else
|
||||||
}
|
}
|
||||||
|
|
||||||
void X3DImporter::MeshGeometry_AddColor(aiMesh& pMesh, const std::list<int32_t>& pCoordIdx, const std::list<int32_t>& pColorIdx,
|
void X3DImporter::MeshGeometry_AddColor(aiMesh& pMesh, const std::vector<int32_t>& pCoordIdx, const std::vector<int32_t>& pColorIdx,
|
||||||
const std::list<aiColor3D>& pColors, const bool pColorPerVertex) const
|
const std::list<aiColor3D>& pColors, const bool pColorPerVertex) const
|
||||||
{
|
{
|
||||||
std::list<aiColor4D> tcol;
|
std::list<aiColor4D> tcol;
|
||||||
|
@ -1029,7 +1010,7 @@ void X3DImporter::MeshGeometry_AddColor(aiMesh& pMesh, const std::list<int32_t>&
|
||||||
MeshGeometry_AddColor(pMesh, pCoordIdx, pColorIdx, tcol, pColorPerVertex);
|
MeshGeometry_AddColor(pMesh, pCoordIdx, pColorIdx, tcol, pColorPerVertex);
|
||||||
}
|
}
|
||||||
|
|
||||||
void X3DImporter::MeshGeometry_AddColor(aiMesh& pMesh, const std::list<int32_t>& pCoordIdx, const std::list<int32_t>& pColorIdx,
|
void X3DImporter::MeshGeometry_AddColor(aiMesh& pMesh, const std::vector<int32_t>& pCoordIdx, const std::vector<int32_t>& pColorIdx,
|
||||||
const std::list<aiColor4D>& pColors, const bool pColorPerVertex) const
|
const std::list<aiColor4D>& pColors, const bool pColorPerVertex) const
|
||||||
{
|
{
|
||||||
std::vector<aiColor4D> col_tgt_arr;
|
std::vector<aiColor4D> col_tgt_arr;
|
||||||
|
@ -1060,7 +1041,7 @@ void X3DImporter::MeshGeometry_AddColor(aiMesh& pMesh, const std::list<int32_t>&
|
||||||
}
|
}
|
||||||
// create list with colors for every vertex.
|
// create list with colors for every vertex.
|
||||||
col_tgt_arr.resize(pMesh.mNumVertices);
|
col_tgt_arr.resize(pMesh.mNumVertices);
|
||||||
for(std::list<int32_t>::const_iterator colidx_it = pColorIdx.begin(), coordidx_it = pCoordIdx.begin(); colidx_it != pColorIdx.end(); colidx_it++, coordidx_it++)
|
for(std::vector<int32_t>::const_iterator colidx_it = pColorIdx.begin(), coordidx_it = pCoordIdx.begin(); colidx_it != pColorIdx.end(); colidx_it++, coordidx_it++)
|
||||||
{
|
{
|
||||||
if ( *colidx_it == ( -1 ) )
|
if ( *colidx_it == ( -1 ) )
|
||||||
{
|
{
|
||||||
|
@ -1108,7 +1089,7 @@ void X3DImporter::MeshGeometry_AddColor(aiMesh& pMesh, const std::list<int32_t>&
|
||||||
// create list with colors for every vertex using faces indices.
|
// create list with colors for every vertex using faces indices.
|
||||||
col_tgt_arr.resize(pMesh.mNumFaces);
|
col_tgt_arr.resize(pMesh.mNumFaces);
|
||||||
|
|
||||||
std::list<int32_t>::const_iterator colidx_it = pColorIdx.begin();
|
std::vector<int32_t>::const_iterator colidx_it = pColorIdx.begin();
|
||||||
for(size_t fi = 0; fi < pMesh.mNumFaces; fi++)
|
for(size_t fi = 0; fi < pMesh.mNumFaces; fi++)
|
||||||
{
|
{
|
||||||
if((unsigned int)*colidx_it > pMesh.mNumFaces) throw DeadlyImportError("MeshGeometry_AddColor2. Face idx is out of range.");
|
if((unsigned int)*colidx_it > pMesh.mNumFaces) throw DeadlyImportError("MeshGeometry_AddColor2. Face idx is out of range.");
|
||||||
|
@ -1138,7 +1119,7 @@ void X3DImporter::MeshGeometry_AddColor(aiMesh& pMesh, const std::list<int32_t>&
|
||||||
MeshGeometry_AddColor(pMesh, col_tgt_list, pColorPerVertex);
|
MeshGeometry_AddColor(pMesh, col_tgt_list, pColorPerVertex);
|
||||||
}
|
}
|
||||||
|
|
||||||
void X3DImporter::MeshGeometry_AddNormal(aiMesh& pMesh, const std::list<int32_t>& pCoordIdx, const std::list<int32_t>& pNormalIdx,
|
void X3DImporter::MeshGeometry_AddNormal(aiMesh& pMesh, const std::vector<int32_t>& pCoordIdx, const std::vector<int32_t>& pNormalIdx,
|
||||||
const std::list<aiVector3D>& pNormals, const bool pNormalPerVertex) const
|
const std::list<aiVector3D>& pNormals, const bool pNormalPerVertex) const
|
||||||
{
|
{
|
||||||
std::vector<size_t> tind;
|
std::vector<size_t> tind;
|
||||||
|
@ -1153,35 +1134,36 @@ void X3DImporter::MeshGeometry_AddNormal(aiMesh& pMesh, const std::list<int32_t>
|
||||||
|
|
||||||
if(pNormalPerVertex)
|
if(pNormalPerVertex)
|
||||||
{
|
{
|
||||||
const std::list<int32_t>* srcidx;
|
|
||||||
|
|
||||||
if(pNormalIdx.size() > 0)
|
if(pNormalIdx.size() > 0)
|
||||||
{
|
{
|
||||||
// check indices array count.
|
// check indices array count.
|
||||||
if(pNormalIdx.size() != pCoordIdx.size()) throw DeadlyImportError("Normals and Coords inidces count must be equal.");
|
if(pNormalIdx.size() != pCoordIdx.size()) throw DeadlyImportError("Normals and Coords inidces count must be equal.");
|
||||||
|
|
||||||
srcidx = &pNormalIdx;
|
tind.reserve(pNormalIdx.size());
|
||||||
|
for(std::vector<int32_t>::const_iterator it = pNormalIdx.begin(); it != pNormalIdx.end(); it++)
|
||||||
|
{
|
||||||
|
if(*it != (-1)) tind.push_back(*it);
|
||||||
|
}
|
||||||
|
|
||||||
|
// copy normals to mesh
|
||||||
|
pMesh.mNormals = new aiVector3D[pMesh.mNumVertices];
|
||||||
|
for(size_t i = 0; (i < pMesh.mNumVertices) && (i < tind.size()); i++)
|
||||||
|
{
|
||||||
|
if(tind[i] >= norm_arr_copy.size())
|
||||||
|
throw DeadlyImportError("MeshGeometry_AddNormal. Normal index(" + to_string(tind[i]) +
|
||||||
|
") is out of range. Normals count: " + to_string(norm_arr_copy.size()) + ".");
|
||||||
|
|
||||||
|
pMesh.mNormals[i] = norm_arr_copy[tind[i]];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
srcidx = &pCoordIdx;
|
if(pNormals.size() != pMesh.mNumVertices) throw DeadlyImportError("MeshGeometry_AddNormal. Normals and vertices count must be equal.");
|
||||||
}
|
|
||||||
|
|
||||||
tind.reserve(srcidx->size());
|
// copy normals to mesh
|
||||||
for(std::list<int32_t>::const_iterator it = srcidx->begin(); it != srcidx->end(); it++)
|
pMesh.mNormals = new aiVector3D[pMesh.mNumVertices];
|
||||||
{
|
std::list<aiVector3D>::const_iterator norm_it = pNormals.begin();
|
||||||
if(*it != (-1)) tind.push_back(*it);
|
for(size_t i = 0; i < pMesh.mNumVertices; i++) pMesh.mNormals[i] = *norm_it++;
|
||||||
}
|
|
||||||
|
|
||||||
// copy normals to mesh
|
|
||||||
pMesh.mNormals = new aiVector3D[pMesh.mNumVertices];
|
|
||||||
for(size_t i = 0; (i < pMesh.mNumVertices) && (i < tind.size()); i++)
|
|
||||||
{
|
|
||||||
if(tind[i] >= norm_arr_copy.size())
|
|
||||||
throw DeadlyImportError("MeshGeometry_AddNormal. Normal index(" + to_string(tind[i]) +
|
|
||||||
") is out of range. Normals count: " + to_string(norm_arr_copy.size()) + ".");
|
|
||||||
|
|
||||||
pMesh.mNormals[i] = norm_arr_copy[tind[i]];
|
|
||||||
}
|
}
|
||||||
}// if(pNormalPerVertex)
|
}// if(pNormalPerVertex)
|
||||||
else
|
else
|
||||||
|
@ -1190,7 +1172,7 @@ void X3DImporter::MeshGeometry_AddNormal(aiMesh& pMesh, const std::list<int32_t>
|
||||||
{
|
{
|
||||||
if(pMesh.mNumFaces != pNormalIdx.size()) throw DeadlyImportError("Normals faces count must be equal to mesh faces count.");
|
if(pMesh.mNumFaces != pNormalIdx.size()) throw DeadlyImportError("Normals faces count must be equal to mesh faces count.");
|
||||||
|
|
||||||
std::list<int32_t>::const_iterator normidx_it = pNormalIdx.begin();
|
std::vector<int32_t>::const_iterator normidx_it = pNormalIdx.begin();
|
||||||
|
|
||||||
tind.reserve(pNormalIdx.size());
|
tind.reserve(pNormalIdx.size());
|
||||||
for(size_t i = 0, i_e = pNormalIdx.size(); i < i_e; i++) tind.push_back(*normidx_it++);
|
for(size_t i = 0, i_e = pNormalIdx.size(); i < i_e; i++) tind.push_back(*normidx_it++);
|
||||||
|
@ -1243,7 +1225,7 @@ void X3DImporter::MeshGeometry_AddNormal(aiMesh& pMesh, const std::list<aiVector
|
||||||
}// if(pNormalPerVertex) else
|
}// if(pNormalPerVertex) else
|
||||||
}
|
}
|
||||||
|
|
||||||
void X3DImporter::MeshGeometry_AddTexCoord(aiMesh& pMesh, const std::list<int32_t>& pCoordIdx, const std::list<int32_t>& pTexCoordIdx,
|
void X3DImporter::MeshGeometry_AddTexCoord(aiMesh& pMesh, const std::vector<int32_t>& pCoordIdx, const std::vector<int32_t>& pTexCoordIdx,
|
||||||
const std::list<aiVector2D>& pTexCoords) const
|
const std::list<aiVector2D>& pTexCoords) const
|
||||||
{
|
{
|
||||||
std::vector<aiVector3D> texcoord_arr_copy;
|
std::vector<aiVector3D> texcoord_arr_copy;
|
||||||
|
@ -1316,7 +1298,7 @@ void X3DImporter::MeshGeometry_AddTexCoord(aiMesh& pMesh, const std::list<aiVect
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
aiMesh* X3DImporter::GeometryHelper_MakeMesh(const std::list<int32_t>& pCoordIdx, const std::list<aiVector3D>& pVertices) const
|
aiMesh* X3DImporter::GeometryHelper_MakeMesh(const std::vector<int32_t>& pCoordIdx, const std::list<aiVector3D>& pVertices) const
|
||||||
{
|
{
|
||||||
std::vector<aiFace> faces;
|
std::vector<aiFace> faces;
|
||||||
unsigned int prim_type = 0;
|
unsigned int prim_type = 0;
|
||||||
|
@ -1419,9 +1401,12 @@ void X3DImporter::ParseHelper_FixTruncatedFloatString(const char* pInStr, std::s
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
extern FIVocabulary X3D_vocabulary_3_2;
|
||||||
|
extern FIVocabulary X3D_vocabulary_3_3;
|
||||||
|
|
||||||
void X3DImporter::ParseFile(const std::string& pFile, IOSystem* pIOHandler)
|
void X3DImporter::ParseFile(const std::string& pFile, IOSystem* pIOHandler)
|
||||||
{
|
{
|
||||||
irr::io::IrrXMLReader* OldReader = mReader;// store current XMLreader.
|
std::unique_ptr<FIReader> OldReader = std::move(mReader);// store current XMLreader.
|
||||||
std::unique_ptr<IOStream> file(pIOHandler->Open(pFile, "rb"));
|
std::unique_ptr<IOStream> file(pIOHandler->Open(pFile, "rb"));
|
||||||
|
|
||||||
// Check whether we can read from the file
|
// Check whether we can read from the file
|
||||||
|
@ -1429,19 +1414,18 @@ void X3DImporter::ParseFile(const std::string& pFile, IOSystem* pIOHandler)
|
||||||
{
|
{
|
||||||
throw DeadlyImportError( "Failed to open X3D file " + pFile + "." );
|
throw DeadlyImportError( "Failed to open X3D file " + pFile + "." );
|
||||||
}
|
}
|
||||||
// generate a XML reader for it
|
mReader = FIReader::create(file.get());
|
||||||
std::unique_ptr<CIrrXML_IOStreamReader> mIOWrapper(new CIrrXML_IOStreamReader(file.get()));
|
|
||||||
mReader = irr::io::createIrrXMLReader(mIOWrapper.get());
|
|
||||||
if ( !mReader )
|
if ( !mReader )
|
||||||
{
|
{
|
||||||
throw DeadlyImportError( "Failed to create XML reader for file" + pFile + "." );
|
throw DeadlyImportError( "Failed to create XML reader for file" + pFile + "." );
|
||||||
}
|
}
|
||||||
|
mReader->registerVocabulary("urn:web3d:x3d:fi-vocabulary-3.2", &X3D_vocabulary_3_2);
|
||||||
|
mReader->registerVocabulary("urn:web3d:x3d:fi-vocabulary-3.3", &X3D_vocabulary_3_3);
|
||||||
// start reading
|
// start reading
|
||||||
ParseNode_Root();
|
ParseNode_Root();
|
||||||
|
|
||||||
delete mReader;
|
|
||||||
// restore old XMLreader
|
// restore old XMLreader
|
||||||
mReader = OldReader;
|
mReader = std::move(OldReader);
|
||||||
}
|
}
|
||||||
|
|
||||||
void X3DImporter::ParseNode_Root()
|
void X3DImporter::ParseNode_Root()
|
||||||
|
@ -1655,7 +1639,7 @@ bool X3DImporter::CanRead(const std::string& pFile, IOSystem* pIOHandler, bool p
|
||||||
{
|
{
|
||||||
const std::string extension = GetExtension(pFile);
|
const std::string extension = GetExtension(pFile);
|
||||||
|
|
||||||
if(extension == "x3d") return true;
|
if((extension == "x3d") || (extension == "x3db")) return true;
|
||||||
|
|
||||||
if(!extension.length() || pCheckSig)
|
if(!extension.length() || pCheckSig)
|
||||||
{
|
{
|
||||||
|
@ -1670,6 +1654,7 @@ bool X3DImporter::CanRead(const std::string& pFile, IOSystem* pIOHandler, bool p
|
||||||
void X3DImporter::GetExtensionList(std::set<std::string>& pExtensionList)
|
void X3DImporter::GetExtensionList(std::set<std::string>& pExtensionList)
|
||||||
{
|
{
|
||||||
pExtensionList.insert("x3d");
|
pExtensionList.insert("x3d");
|
||||||
|
pExtensionList.insert("x3db");
|
||||||
}
|
}
|
||||||
|
|
||||||
const aiImporterDesc* X3DImporter::GetInfo () const
|
const aiImporterDesc* X3DImporter::GetInfo () const
|
||||||
|
@ -1679,9 +1664,13 @@ const aiImporterDesc* X3DImporter::GetInfo () const
|
||||||
|
|
||||||
void X3DImporter::InternReadFile(const std::string& pFile, aiScene* pScene, IOSystem* pIOHandler)
|
void X3DImporter::InternReadFile(const std::string& pFile, aiScene* pScene, IOSystem* pIOHandler)
|
||||||
{
|
{
|
||||||
|
mpIOHandler = pIOHandler;
|
||||||
|
|
||||||
Clear();// delete old graph.
|
Clear();// delete old graph.
|
||||||
mFileDir = DefaultIOSystem::absolutePath(pFile);
|
std::string::size_type slashPos = pFile.find_last_of("\\/");
|
||||||
|
pIOHandler->PushDirectory(slashPos == std::string::npos ? std::string() : pFile.substr(0, slashPos + 1));
|
||||||
ParseFile(pFile, pIOHandler);
|
ParseFile(pFile, pIOHandler);
|
||||||
|
pIOHandler->PopDirectory();
|
||||||
//
|
//
|
||||||
// Assimp use static arrays of objects for fast speed of rendering. That's good, but need some additional operations/
|
// Assimp use static arrays of objects for fast speed of rendering. That's good, but need some additional operations/
|
||||||
// We know that geometry objects(meshes) are stored in <Shape>, also in <Shape>-><Appearance> materials(in Assimp logical view)
|
// We know that geometry objects(meshes) are stored in <Shape>, also in <Shape>-><Appearance> materials(in Assimp logical view)
|
||||||
|
|
|
@ -56,6 +56,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include <assimp/types.h>
|
#include <assimp/types.h>
|
||||||
#include "BaseImporter.h"
|
#include "BaseImporter.h"
|
||||||
#include "irrXMLWrapper.h"
|
#include "irrXMLWrapper.h"
|
||||||
|
#include "FIReader.hpp"
|
||||||
|
//#include <regex>
|
||||||
|
|
||||||
namespace Assimp {
|
namespace Assimp {
|
||||||
|
|
||||||
|
@ -101,7 +103,7 @@ namespace Assimp {
|
||||||
/// Navigation component:
|
/// Navigation component:
|
||||||
/// "Billboard", "Collision", "LOD", "NavigationInfo", "OrthoViewpoint", "Viewpoint", "ViewpointGroup"
|
/// "Billboard", "Collision", "LOD", "NavigationInfo", "OrthoViewpoint", "Viewpoint", "ViewpointGroup"
|
||||||
/// Networking component:
|
/// Networking component:
|
||||||
/// "Anchor", "LoadSensor"
|
/// "EXPORT", "IMPORT", "Anchor", "LoadSensor"
|
||||||
/// NURBS component:
|
/// NURBS component:
|
||||||
/// "Contour2D", "ContourPolyline2D", "CoordinateDouble", "NurbsCurve", "NurbsCurve2D", "NurbsOrientationInterpolator", "NurbsPatchSurface",
|
/// "Contour2D", "ContourPolyline2D", "CoordinateDouble", "NurbsCurve", "NurbsCurve2D", "NurbsOrientationInterpolator", "NurbsPatchSurface",
|
||||||
/// "NurbsPositionInterpolator", "NurbsSet", "NurbsSurfaceInterpolator", "NurbsSweptSurface", "NurbsSwungSurface", "NurbsTextureCoordinate",
|
/// "NurbsPositionInterpolator", "NurbsSet", "NurbsSurfaceInterpolator", "NurbsSweptSurface", "NurbsSwungSurface", "NurbsTextureCoordinate",
|
||||||
|
@ -449,33 +451,21 @@ private:
|
||||||
/// Read attribute value.
|
/// Read attribute value.
|
||||||
/// \param [in] pAttrIdx - attribute index (\ref mReader->getAttribute* set).
|
/// \param [in] pAttrIdx - attribute index (\ref mReader->getAttribute* set).
|
||||||
/// \param [out] pValue - read data.
|
/// \param [out] pValue - read data.
|
||||||
void XML_ReadNode_GetAttrVal_AsListB(const int pAttrIdx, std::list<bool>& pValue);
|
|
||||||
|
|
||||||
/// \overload void XML_ReadNode_GetAttrVal_AsListBool(const int pAttrIdx, std::list<bool>& pValue)
|
|
||||||
void XML_ReadNode_GetAttrVal_AsArrB(const int pAttrIdx, std::vector<bool>& pValue);
|
void XML_ReadNode_GetAttrVal_AsArrB(const int pAttrIdx, std::vector<bool>& pValue);
|
||||||
|
|
||||||
/// Read attribute value.
|
/// Read attribute value.
|
||||||
/// \param [in] pAttrIdx - attribute index (\ref mReader->getAttribute* set).
|
/// \param [in] pAttrIdx - attribute index (\ref mReader->getAttribute* set).
|
||||||
/// \param [out] pValue - read data.
|
/// \param [out] pValue - read data.
|
||||||
void XML_ReadNode_GetAttrVal_AsListI32(const int pAttrIdx, std::list<int32_t>& pValue);
|
|
||||||
|
|
||||||
/// \overload void XML_ReadNode_GetAttrVal_AsListI32(const int pAttrIdx, std::list<int32_t>& pValue)
|
|
||||||
void XML_ReadNode_GetAttrVal_AsArrI32(const int pAttrIdx, std::vector<int32_t>& pValue);
|
void XML_ReadNode_GetAttrVal_AsArrI32(const int pAttrIdx, std::vector<int32_t>& pValue);
|
||||||
|
|
||||||
/// Read attribute value.
|
/// Read attribute value.
|
||||||
/// \param [in] pAttrIdx - attribute index (\ref mReader->getAttribute* set).
|
/// \param [in] pAttrIdx - attribute index (\ref mReader->getAttribute* set).
|
||||||
/// \param [out] pValue - read data.
|
/// \param [out] pValue - read data.
|
||||||
void XML_ReadNode_GetAttrVal_AsListF(const int pAttrIdx, std::list<float>& pValue);
|
|
||||||
|
|
||||||
/// \overload void XML_ReadNode_GetAttrVal_AsListF(const int pAttrIdx, std::list<float>& pValue)
|
|
||||||
void XML_ReadNode_GetAttrVal_AsArrF(const int pAttrIdx, std::vector<float>& pValue);
|
void XML_ReadNode_GetAttrVal_AsArrF(const int pAttrIdx, std::vector<float>& pValue);
|
||||||
|
|
||||||
/// Read attribute value.
|
/// Read attribute value.
|
||||||
/// \param [in] pAttrIdx - attribute index (\ref mReader->getAttribute* set).
|
/// \param [in] pAttrIdx - attribute index (\ref mReader->getAttribute* set).
|
||||||
/// \param [out] pValue - read data.
|
/// \param [out] pValue - read data.
|
||||||
void XML_ReadNode_GetAttrVal_AsListD(const int pAttrIdx, std::list<double>& pValue);
|
|
||||||
|
|
||||||
/// \overload void XML_ReadNode_GetAttrVal_AsListD(const int pAttrIdx, std::list<double>& pValue)
|
|
||||||
void XML_ReadNode_GetAttrVal_AsArrD(const int pAttrIdx, std::vector<double>& pValue);
|
void XML_ReadNode_GetAttrVal_AsArrD(const int pAttrIdx, std::vector<double>& pValue);
|
||||||
|
|
||||||
/// Read attribute value.
|
/// Read attribute value.
|
||||||
|
@ -554,7 +544,7 @@ private:
|
||||||
/// \param [in] pCoordIdx - vertices indices divided by delimiter "-1".
|
/// \param [in] pCoordIdx - vertices indices divided by delimiter "-1".
|
||||||
/// \param [in] pFaces - created faces array.
|
/// \param [in] pFaces - created faces array.
|
||||||
/// \param [in] pPrimitiveTypes - type of primitives in faces.
|
/// \param [in] pPrimitiveTypes - type of primitives in faces.
|
||||||
void GeometryHelper_CoordIdxStr2FacesArr(const std::list<int32_t>& pCoordIdx, std::vector<aiFace>& pFaces, unsigned int& pPrimitiveTypes) const;
|
void GeometryHelper_CoordIdxStr2FacesArr(const std::vector<int32_t>& pCoordIdx, std::vector<aiFace>& pFaces, unsigned int& pPrimitiveTypes) const;
|
||||||
|
|
||||||
/// Add colors to mesh.
|
/// Add colors to mesh.
|
||||||
/// a. If colorPerVertex is FALSE, colours are applied to each face, as follows:
|
/// a. If colorPerVertex is FALSE, colours are applied to each face, as follows:
|
||||||
|
@ -573,11 +563,11 @@ private:
|
||||||
/// then pColorIdx contain color indices for every faces and must not contain delimiter "-1".
|
/// then pColorIdx contain color indices for every faces and must not contain delimiter "-1".
|
||||||
/// \param [in] pColors - defined colors.
|
/// \param [in] pColors - defined colors.
|
||||||
/// \param [in] pColorPerVertex - if \ref pColorPerVertex is true then color in \ref pColors defined for every vertex, if false - for every face.
|
/// \param [in] pColorPerVertex - if \ref pColorPerVertex is true then color in \ref pColors defined for every vertex, if false - for every face.
|
||||||
void MeshGeometry_AddColor(aiMesh& pMesh, const std::list<int32_t>& pCoordIdx, const std::list<int32_t>& pColorIdx,
|
void MeshGeometry_AddColor(aiMesh& pMesh, const std::vector<int32_t>& pCoordIdx, const std::vector<int32_t>& pColorIdx,
|
||||||
const std::list<aiColor4D>& pColors, const bool pColorPerVertex) const;
|
const std::list<aiColor4D>& pColors, const bool pColorPerVertex) const;
|
||||||
|
|
||||||
/// \overload void MeshGeometry_AddColor(aiMesh& pMesh, const std::list<int32_t>& pCoordIdx, const std::list<int32_t>& pColorIdx, const std::list<aiColor4D>& pColors, const bool pColorPerVertex) const;
|
/// \overload void MeshGeometry_AddColor(aiMesh& pMesh, const std::list<int32_t>& pCoordIdx, const std::list<int32_t>& pColorIdx, const std::list<aiColor4D>& pColors, const bool pColorPerVertex) const;
|
||||||
void MeshGeometry_AddColor(aiMesh& pMesh, const std::list<int32_t>& pCoordIdx, const std::list<int32_t>& pColorIdx,
|
void MeshGeometry_AddColor(aiMesh& pMesh, const std::vector<int32_t>& pCoordIdx, const std::vector<int32_t>& pColorIdx,
|
||||||
const std::list<aiColor3D>& pColors, const bool pColorPerVertex) const;
|
const std::list<aiColor3D>& pColors, const bool pColorPerVertex) const;
|
||||||
|
|
||||||
/// Add colors to mesh.
|
/// Add colors to mesh.
|
||||||
|
@ -590,14 +580,14 @@ private:
|
||||||
void MeshGeometry_AddColor(aiMesh& pMesh, const std::list<aiColor3D>& pColors, const bool pColorPerVertex) const;
|
void MeshGeometry_AddColor(aiMesh& pMesh, const std::list<aiColor3D>& pColors, const bool pColorPerVertex) const;
|
||||||
|
|
||||||
/// Add normals to mesh. Function work similar to \ref MeshGeometry_AddColor;
|
/// Add normals to mesh. Function work similar to \ref MeshGeometry_AddColor;
|
||||||
void MeshGeometry_AddNormal(aiMesh& pMesh, const std::list<int32_t>& pCoordIdx, const std::list<int32_t>& pNormalIdx,
|
void MeshGeometry_AddNormal(aiMesh& pMesh, const std::vector<int32_t>& pCoordIdx, const std::vector<int32_t>& pNormalIdx,
|
||||||
const std::list<aiVector3D>& pNormals, const bool pNormalPerVertex) const;
|
const std::list<aiVector3D>& pNormals, const bool pNormalPerVertex) const;
|
||||||
|
|
||||||
/// Add normals to mesh. Function work similar to \ref MeshGeometry_AddColor;
|
/// Add normals to mesh. Function work similar to \ref MeshGeometry_AddColor;
|
||||||
void MeshGeometry_AddNormal(aiMesh& pMesh, const std::list<aiVector3D>& pNormals, const bool pNormalPerVertex) const;
|
void MeshGeometry_AddNormal(aiMesh& pMesh, const std::list<aiVector3D>& pNormals, const bool pNormalPerVertex) const;
|
||||||
|
|
||||||
/// Add texture coordinates to mesh. Function work similar to \ref MeshGeometry_AddColor;
|
/// Add texture coordinates to mesh. Function work similar to \ref MeshGeometry_AddColor;
|
||||||
void MeshGeometry_AddTexCoord(aiMesh& pMesh, const std::list<int32_t>& pCoordIdx, const std::list<int32_t>& pTexCoordIdx,
|
void MeshGeometry_AddTexCoord(aiMesh& pMesh, const std::vector<int32_t>& pCoordIdx, const std::vector<int32_t>& pTexCoordIdx,
|
||||||
const std::list<aiVector2D>& pTexCoords) const;
|
const std::list<aiVector2D>& pTexCoords) const;
|
||||||
|
|
||||||
/// Add texture coordinates to mesh. Function work similar to \ref MeshGeometry_AddColor;
|
/// Add texture coordinates to mesh. Function work similar to \ref MeshGeometry_AddColor;
|
||||||
|
@ -607,7 +597,7 @@ private:
|
||||||
/// \param [in] pCoordIdx - vertices indices divided by delimiter "-1".
|
/// \param [in] pCoordIdx - vertices indices divided by delimiter "-1".
|
||||||
/// \param [in] pVertices - vertices of mesh.
|
/// \param [in] pVertices - vertices of mesh.
|
||||||
/// \return created mesh.
|
/// \return created mesh.
|
||||||
aiMesh* GeometryHelper_MakeMesh(const std::list<int32_t>& pCoordIdx, const std::list<aiVector3D>& pVertices) const;
|
aiMesh* GeometryHelper_MakeMesh(const std::vector<int32_t>& pCoordIdx, const std::list<aiVector3D>& pVertices) const;
|
||||||
|
|
||||||
/***********************************************/
|
/***********************************************/
|
||||||
/******** Functions: parse set private *********/
|
/******** Functions: parse set private *********/
|
||||||
|
@ -826,13 +816,16 @@ private:
|
||||||
/****************** Constants ******************/
|
/****************** Constants ******************/
|
||||||
/***********************************************/
|
/***********************************************/
|
||||||
static const aiImporterDesc Description;
|
static const aiImporterDesc Description;
|
||||||
|
//static const std::regex pattern_nws;
|
||||||
|
//static const std::regex pattern_true;
|
||||||
|
|
||||||
|
|
||||||
/***********************************************/
|
/***********************************************/
|
||||||
/****************** Variables ******************/
|
/****************** Variables ******************/
|
||||||
/***********************************************/
|
/***********************************************/
|
||||||
CX3DImporter_NodeElement* NodeElement_Cur;///< Current element.
|
CX3DImporter_NodeElement* NodeElement_Cur;///< Current element.
|
||||||
irr::io::IrrXMLReader* mReader;///< Pointer to XML-reader object
|
std::unique_ptr<FIReader> mReader;///< Pointer to XML-reader object
|
||||||
std::string mFileDir;
|
IOSystem *mpIOHandler;
|
||||||
};// class X3DImporter
|
};// class X3DImporter
|
||||||
|
|
||||||
}// namespace Assimp
|
}// namespace Assimp
|
||||||
|
|
|
@ -285,7 +285,7 @@ void X3DImporter::ParseNode_Geometry3D_ElevationGrid()
|
||||||
bool ccw = true;
|
bool ccw = true;
|
||||||
bool colorPerVertex = true;
|
bool colorPerVertex = true;
|
||||||
float creaseAngle = 0;
|
float creaseAngle = 0;
|
||||||
std::list<float> height;
|
std::vector<float> height;
|
||||||
bool normalPerVertex = true;
|
bool normalPerVertex = true;
|
||||||
bool solid = true;
|
bool solid = true;
|
||||||
int32_t xDimension = 0;
|
int32_t xDimension = 0;
|
||||||
|
@ -301,7 +301,7 @@ void X3DImporter::ParseNode_Geometry3D_ElevationGrid()
|
||||||
MACRO_ATTRREAD_CHECK_RET("colorPerVertex", colorPerVertex, XML_ReadNode_GetAttrVal_AsBool);
|
MACRO_ATTRREAD_CHECK_RET("colorPerVertex", colorPerVertex, XML_ReadNode_GetAttrVal_AsBool);
|
||||||
MACRO_ATTRREAD_CHECK_RET("normalPerVertex", normalPerVertex, XML_ReadNode_GetAttrVal_AsBool);
|
MACRO_ATTRREAD_CHECK_RET("normalPerVertex", normalPerVertex, XML_ReadNode_GetAttrVal_AsBool);
|
||||||
MACRO_ATTRREAD_CHECK_RET("creaseAngle", creaseAngle, XML_ReadNode_GetAttrVal_AsFloat);
|
MACRO_ATTRREAD_CHECK_RET("creaseAngle", creaseAngle, XML_ReadNode_GetAttrVal_AsFloat);
|
||||||
MACRO_ATTRREAD_CHECK_REF("height", height, XML_ReadNode_GetAttrVal_AsListF);
|
MACRO_ATTRREAD_CHECK_REF("height", height, XML_ReadNode_GetAttrVal_AsArrF);
|
||||||
MACRO_ATTRREAD_CHECK_RET("xDimension", xDimension, XML_ReadNode_GetAttrVal_AsI32);
|
MACRO_ATTRREAD_CHECK_RET("xDimension", xDimension, XML_ReadNode_GetAttrVal_AsI32);
|
||||||
MACRO_ATTRREAD_CHECK_RET("xSpacing", xSpacing, XML_ReadNode_GetAttrVal_AsFloat);
|
MACRO_ATTRREAD_CHECK_RET("xSpacing", xSpacing, XML_ReadNode_GetAttrVal_AsFloat);
|
||||||
MACRO_ATTRREAD_CHECK_RET("zDimension", zDimension, XML_ReadNode_GetAttrVal_AsI32);
|
MACRO_ATTRREAD_CHECK_RET("zDimension", zDimension, XML_ReadNode_GetAttrVal_AsI32);
|
||||||
|
@ -326,7 +326,7 @@ void X3DImporter::ParseNode_Geometry3D_ElevationGrid()
|
||||||
CX3DImporter_NodeElement_ElevationGrid& grid_alias = *((CX3DImporter_NodeElement_ElevationGrid*)ne);// create alias for conveience
|
CX3DImporter_NodeElement_ElevationGrid& grid_alias = *((CX3DImporter_NodeElement_ElevationGrid*)ne);// create alias for conveience
|
||||||
|
|
||||||
{// create grid vertices list
|
{// create grid vertices list
|
||||||
std::list<float>::const_iterator he_it = height.begin();
|
std::vector<float>::const_iterator he_it = height.begin();
|
||||||
|
|
||||||
for(int32_t zi = 0; zi < zDimension; zi++)// rows
|
for(int32_t zi = 0; zi < zDimension; zi++)// rows
|
||||||
{
|
{
|
||||||
|
@ -863,29 +863,29 @@ void X3DImporter::ParseNode_Geometry3D_IndexedFaceSet()
|
||||||
{
|
{
|
||||||
std::string use, def;
|
std::string use, def;
|
||||||
bool ccw = true;
|
bool ccw = true;
|
||||||
std::list<int32_t> colorIndex;
|
std::vector<int32_t> colorIndex;
|
||||||
bool colorPerVertex = true;
|
bool colorPerVertex = true;
|
||||||
bool convex = true;
|
bool convex = true;
|
||||||
std::list<int32_t> coordIndex;
|
std::vector<int32_t> coordIndex;
|
||||||
float creaseAngle = 0;
|
float creaseAngle = 0;
|
||||||
std::list<int32_t> normalIndex;
|
std::vector<int32_t> normalIndex;
|
||||||
bool normalPerVertex = true;
|
bool normalPerVertex = true;
|
||||||
bool solid = true;
|
bool solid = true;
|
||||||
std::list<int32_t> texCoordIndex;
|
std::vector<int32_t> texCoordIndex;
|
||||||
CX3DImporter_NodeElement* ne( nullptr );
|
CX3DImporter_NodeElement* ne( nullptr );
|
||||||
|
|
||||||
MACRO_ATTRREAD_LOOPBEG;
|
MACRO_ATTRREAD_LOOPBEG;
|
||||||
MACRO_ATTRREAD_CHECKUSEDEF_RET(def, use);
|
MACRO_ATTRREAD_CHECKUSEDEF_RET(def, use);
|
||||||
MACRO_ATTRREAD_CHECK_RET("ccw", ccw, XML_ReadNode_GetAttrVal_AsBool);
|
MACRO_ATTRREAD_CHECK_RET("ccw", ccw, XML_ReadNode_GetAttrVal_AsBool);
|
||||||
MACRO_ATTRREAD_CHECK_REF("colorIndex", colorIndex, XML_ReadNode_GetAttrVal_AsListI32);
|
MACRO_ATTRREAD_CHECK_REF("colorIndex", colorIndex, XML_ReadNode_GetAttrVal_AsArrI32);
|
||||||
MACRO_ATTRREAD_CHECK_RET("colorPerVertex", colorPerVertex, XML_ReadNode_GetAttrVal_AsBool);
|
MACRO_ATTRREAD_CHECK_RET("colorPerVertex", colorPerVertex, XML_ReadNode_GetAttrVal_AsBool);
|
||||||
MACRO_ATTRREAD_CHECK_RET("convex", convex, XML_ReadNode_GetAttrVal_AsBool);
|
MACRO_ATTRREAD_CHECK_RET("convex", convex, XML_ReadNode_GetAttrVal_AsBool);
|
||||||
MACRO_ATTRREAD_CHECK_REF("coordIndex", coordIndex, XML_ReadNode_GetAttrVal_AsListI32);
|
MACRO_ATTRREAD_CHECK_REF("coordIndex", coordIndex, XML_ReadNode_GetAttrVal_AsArrI32);
|
||||||
MACRO_ATTRREAD_CHECK_RET("creaseAngle", creaseAngle, XML_ReadNode_GetAttrVal_AsFloat);
|
MACRO_ATTRREAD_CHECK_RET("creaseAngle", creaseAngle, XML_ReadNode_GetAttrVal_AsFloat);
|
||||||
MACRO_ATTRREAD_CHECK_REF("normalIndex", normalIndex, XML_ReadNode_GetAttrVal_AsListI32);
|
MACRO_ATTRREAD_CHECK_REF("normalIndex", normalIndex, XML_ReadNode_GetAttrVal_AsArrI32);
|
||||||
MACRO_ATTRREAD_CHECK_RET("normalPerVertex", normalPerVertex, XML_ReadNode_GetAttrVal_AsBool);
|
MACRO_ATTRREAD_CHECK_RET("normalPerVertex", normalPerVertex, XML_ReadNode_GetAttrVal_AsBool);
|
||||||
MACRO_ATTRREAD_CHECK_RET("solid", solid, XML_ReadNode_GetAttrVal_AsBool);
|
MACRO_ATTRREAD_CHECK_RET("solid", solid, XML_ReadNode_GetAttrVal_AsBool);
|
||||||
MACRO_ATTRREAD_CHECK_REF("texCoordIndex", texCoordIndex, XML_ReadNode_GetAttrVal_AsListI32);
|
MACRO_ATTRREAD_CHECK_REF("texCoordIndex", texCoordIndex, XML_ReadNode_GetAttrVal_AsArrI32);
|
||||||
MACRO_ATTRREAD_LOOPEND;
|
MACRO_ATTRREAD_LOOPEND;
|
||||||
|
|
||||||
// if "USE" defined then find already defined element.
|
// if "USE" defined then find already defined element.
|
||||||
|
|
|
@ -123,14 +123,14 @@ void X3DImporter::ParseNode_MetadataBoolean()
|
||||||
{
|
{
|
||||||
std::string def, use;
|
std::string def, use;
|
||||||
std::string name, reference;
|
std::string name, reference;
|
||||||
std::list<bool> value;
|
std::vector<bool> value;
|
||||||
CX3DImporter_NodeElement* ne( nullptr );
|
CX3DImporter_NodeElement* ne( nullptr );
|
||||||
|
|
||||||
MACRO_ATTRREAD_LOOPBEG;
|
MACRO_ATTRREAD_LOOPBEG;
|
||||||
MACRO_ATTRREAD_CHECKUSEDEF_RET(def, use);
|
MACRO_ATTRREAD_CHECKUSEDEF_RET(def, use);
|
||||||
MACRO_ATTRREAD_CHECK_RET("name", name, mReader->getAttributeValue);
|
MACRO_ATTRREAD_CHECK_RET("name", name, mReader->getAttributeValue);
|
||||||
MACRO_ATTRREAD_CHECK_RET("reference", reference, mReader->getAttributeValue);
|
MACRO_ATTRREAD_CHECK_RET("reference", reference, mReader->getAttributeValue);
|
||||||
MACRO_ATTRREAD_CHECK_REF("value", value, XML_ReadNode_GetAttrVal_AsListB);
|
MACRO_ATTRREAD_CHECK_REF("value", value, XML_ReadNode_GetAttrVal_AsArrB);
|
||||||
MACRO_ATTRREAD_LOOPEND;
|
MACRO_ATTRREAD_LOOPEND;
|
||||||
|
|
||||||
MACRO_METADATA_FINDCREATE(def, use, reference, value, ne, CX3DImporter_NodeElement_MetaBoolean, "MetadataBoolean", ENET_MetaBoolean);
|
MACRO_METADATA_FINDCREATE(def, use, reference, value, ne, CX3DImporter_NodeElement_MetaBoolean, "MetadataBoolean", ENET_MetaBoolean);
|
||||||
|
@ -147,14 +147,14 @@ void X3DImporter::ParseNode_MetadataDouble()
|
||||||
{
|
{
|
||||||
std::string def, use;
|
std::string def, use;
|
||||||
std::string name, reference;
|
std::string name, reference;
|
||||||
std::list<double> value;
|
std::vector<double> value;
|
||||||
CX3DImporter_NodeElement* ne( nullptr );
|
CX3DImporter_NodeElement* ne( nullptr );
|
||||||
|
|
||||||
MACRO_ATTRREAD_LOOPBEG;
|
MACRO_ATTRREAD_LOOPBEG;
|
||||||
MACRO_ATTRREAD_CHECKUSEDEF_RET(def, use);
|
MACRO_ATTRREAD_CHECKUSEDEF_RET(def, use);
|
||||||
MACRO_ATTRREAD_CHECK_RET("name", name, mReader->getAttributeValue);
|
MACRO_ATTRREAD_CHECK_RET("name", name, mReader->getAttributeValue);
|
||||||
MACRO_ATTRREAD_CHECK_RET("reference", reference, mReader->getAttributeValue);
|
MACRO_ATTRREAD_CHECK_RET("reference", reference, mReader->getAttributeValue);
|
||||||
MACRO_ATTRREAD_CHECK_REF("value", value, XML_ReadNode_GetAttrVal_AsListD);
|
MACRO_ATTRREAD_CHECK_REF("value", value, XML_ReadNode_GetAttrVal_AsArrD);
|
||||||
MACRO_ATTRREAD_LOOPEND;
|
MACRO_ATTRREAD_LOOPEND;
|
||||||
|
|
||||||
MACRO_METADATA_FINDCREATE(def, use, reference, value, ne, CX3DImporter_NodeElement_MetaDouble, "MetadataDouble", ENET_MetaDouble);
|
MACRO_METADATA_FINDCREATE(def, use, reference, value, ne, CX3DImporter_NodeElement_MetaDouble, "MetadataDouble", ENET_MetaDouble);
|
||||||
|
@ -171,14 +171,14 @@ void X3DImporter::ParseNode_MetadataFloat()
|
||||||
{
|
{
|
||||||
std::string def, use;
|
std::string def, use;
|
||||||
std::string name, reference;
|
std::string name, reference;
|
||||||
std::list<float> value;
|
std::vector<float> value;
|
||||||
CX3DImporter_NodeElement* ne( nullptr );
|
CX3DImporter_NodeElement* ne( nullptr );
|
||||||
|
|
||||||
MACRO_ATTRREAD_LOOPBEG;
|
MACRO_ATTRREAD_LOOPBEG;
|
||||||
MACRO_ATTRREAD_CHECKUSEDEF_RET(def, use);
|
MACRO_ATTRREAD_CHECKUSEDEF_RET(def, use);
|
||||||
MACRO_ATTRREAD_CHECK_RET("name", name, mReader->getAttributeValue);
|
MACRO_ATTRREAD_CHECK_RET("name", name, mReader->getAttributeValue);
|
||||||
MACRO_ATTRREAD_CHECK_RET("reference", reference, mReader->getAttributeValue);
|
MACRO_ATTRREAD_CHECK_RET("reference", reference, mReader->getAttributeValue);
|
||||||
MACRO_ATTRREAD_CHECK_REF("value", value, XML_ReadNode_GetAttrVal_AsListF);
|
MACRO_ATTRREAD_CHECK_REF("value", value, XML_ReadNode_GetAttrVal_AsArrF);
|
||||||
MACRO_ATTRREAD_LOOPEND;
|
MACRO_ATTRREAD_LOOPEND;
|
||||||
|
|
||||||
MACRO_METADATA_FINDCREATE(def, use, reference, value, ne, CX3DImporter_NodeElement_MetaFloat, "MetadataFloat", ENET_MetaFloat);
|
MACRO_METADATA_FINDCREATE(def, use, reference, value, ne, CX3DImporter_NodeElement_MetaFloat, "MetadataFloat", ENET_MetaFloat);
|
||||||
|
@ -195,14 +195,14 @@ void X3DImporter::ParseNode_MetadataInteger()
|
||||||
{
|
{
|
||||||
std::string def, use;
|
std::string def, use;
|
||||||
std::string name, reference;
|
std::string name, reference;
|
||||||
std::list<int32_t> value;
|
std::vector<int32_t> value;
|
||||||
CX3DImporter_NodeElement* ne( nullptr );
|
CX3DImporter_NodeElement* ne( nullptr );
|
||||||
|
|
||||||
MACRO_ATTRREAD_LOOPBEG;
|
MACRO_ATTRREAD_LOOPBEG;
|
||||||
MACRO_ATTRREAD_CHECKUSEDEF_RET(def, use);
|
MACRO_ATTRREAD_CHECKUSEDEF_RET(def, use);
|
||||||
MACRO_ATTRREAD_CHECK_RET("name", name, mReader->getAttributeValue);
|
MACRO_ATTRREAD_CHECK_RET("name", name, mReader->getAttributeValue);
|
||||||
MACRO_ATTRREAD_CHECK_RET("reference", reference, mReader->getAttributeValue);
|
MACRO_ATTRREAD_CHECK_RET("reference", reference, mReader->getAttributeValue);
|
||||||
MACRO_ATTRREAD_CHECK_REF("value", value, XML_ReadNode_GetAttrVal_AsListI32);
|
MACRO_ATTRREAD_CHECK_REF("value", value, XML_ReadNode_GetAttrVal_AsArrI32);
|
||||||
MACRO_ATTRREAD_LOOPEND;
|
MACRO_ATTRREAD_LOOPEND;
|
||||||
|
|
||||||
MACRO_METADATA_FINDCREATE(def, use, reference, value, ne, CX3DImporter_NodeElement_MetaInteger, "MetadataInteger", ENET_MetaInteger);
|
MACRO_METADATA_FINDCREATE(def, use, reference, value, ne, CX3DImporter_NodeElement_MetaInteger, "MetadataInteger", ENET_MetaInteger);
|
||||||
|
|
|
@ -51,9 +51,14 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
// Header files, Assimp.
|
// Header files, Assimp.
|
||||||
#include <assimp/DefaultIOSystem.h>
|
#include <assimp/DefaultIOSystem.h>
|
||||||
|
|
||||||
|
//#include <regex>
|
||||||
|
|
||||||
namespace Assimp
|
namespace Assimp
|
||||||
{
|
{
|
||||||
|
|
||||||
|
//static std::regex pattern_parentDir(R"((^|/)[^/]+/../)");
|
||||||
|
static std::string parentDir("/../");
|
||||||
|
|
||||||
// <Inline
|
// <Inline
|
||||||
// DEF="" ID
|
// DEF="" ID
|
||||||
// USE="" IDREF
|
// USE="" IDREF
|
||||||
|
@ -89,12 +94,30 @@ void X3DImporter::ParseNode_Networking_Inline()
|
||||||
|
|
||||||
if(load && (url.size() > 0))
|
if(load && (url.size() > 0))
|
||||||
{
|
{
|
||||||
DefaultIOSystem io_handler;
|
std::string full_path = mpIOHandler->CurrentDirectory() + url.front();
|
||||||
std::string full_path;
|
|
||||||
|
|
||||||
full_path = mFileDir + "/" + url.front();
|
//full_path = std::regex_replace(full_path, pattern_parentDir, "$1");
|
||||||
|
for (std::string::size_type pos = full_path.find(parentDir); pos != std::string::npos; pos = full_path.find(parentDir, pos)) {
|
||||||
|
if (pos > 0) {
|
||||||
|
std::string::size_type pos2 = full_path.rfind('/', pos - 1);
|
||||||
|
if (pos2 != std::string::npos) {
|
||||||
|
full_path.erase(pos2, pos - pos2 + 3);
|
||||||
|
pos = pos2;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
full_path.erase(0, pos + 4);
|
||||||
|
pos = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
pos += 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
// Attribute "url" can contain list of strings. But we need only one - first.
|
// Attribute "url" can contain list of strings. But we need only one - first.
|
||||||
ParseFile(full_path, &io_handler);
|
std::string::size_type slashPos = full_path.find_last_of("\\/");
|
||||||
|
mpIOHandler->PushDirectory(slashPos == std::string::npos ? std::string() : full_path.substr(0, slashPos + 1));
|
||||||
|
ParseFile(full_path, mpIOHandler);
|
||||||
|
mpIOHandler->PopDirectory();
|
||||||
}
|
}
|
||||||
|
|
||||||
// check for X3DMetadataObject childs.
|
// check for X3DMetadataObject childs.
|
||||||
|
|
|
@ -52,6 +52,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
// Header files, stdlib.
|
// Header files, stdlib.
|
||||||
#include <list>
|
#include <list>
|
||||||
|
#include <vector>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
|
||||||
/// \class CX3DImporter_NodeElement
|
/// \class CX3DImporter_NodeElement
|
||||||
|
@ -264,7 +265,7 @@ public:
|
||||||
/// This struct describe metavalue of type boolean.
|
/// This struct describe metavalue of type boolean.
|
||||||
struct CX3DImporter_NodeElement_MetaBoolean : public CX3DImporter_NodeElement_Meta
|
struct CX3DImporter_NodeElement_MetaBoolean : public CX3DImporter_NodeElement_Meta
|
||||||
{
|
{
|
||||||
std::list<bool> Value;///< Stored value.
|
std::vector<bool> Value;///< Stored value.
|
||||||
|
|
||||||
/// \fn CX3DImporter_NodeElement_MetaBoolean(CX3DImporter_NodeElement* pParent)
|
/// \fn CX3DImporter_NodeElement_MetaBoolean(CX3DImporter_NodeElement* pParent)
|
||||||
/// Constructor
|
/// Constructor
|
||||||
|
@ -279,7 +280,7 @@ struct CX3DImporter_NodeElement_MetaBoolean : public CX3DImporter_NodeElement_Me
|
||||||
/// This struct describe metavalue of type double.
|
/// This struct describe metavalue of type double.
|
||||||
struct CX3DImporter_NodeElement_MetaDouble : public CX3DImporter_NodeElement_Meta
|
struct CX3DImporter_NodeElement_MetaDouble : public CX3DImporter_NodeElement_Meta
|
||||||
{
|
{
|
||||||
std::list<double> Value;///< Stored value.
|
std::vector<double> Value;///< Stored value.
|
||||||
|
|
||||||
/// \fn CX3DImporter_NodeElement_MetaDouble(CX3DImporter_NodeElement* pParent)
|
/// \fn CX3DImporter_NodeElement_MetaDouble(CX3DImporter_NodeElement* pParent)
|
||||||
/// Constructor
|
/// Constructor
|
||||||
|
@ -294,7 +295,7 @@ struct CX3DImporter_NodeElement_MetaDouble : public CX3DImporter_NodeElement_Met
|
||||||
/// This struct describe metavalue of type float.
|
/// This struct describe metavalue of type float.
|
||||||
struct CX3DImporter_NodeElement_MetaFloat : public CX3DImporter_NodeElement_Meta
|
struct CX3DImporter_NodeElement_MetaFloat : public CX3DImporter_NodeElement_Meta
|
||||||
{
|
{
|
||||||
std::list<float> Value;///< Stored value.
|
std::vector<float> Value;///< Stored value.
|
||||||
|
|
||||||
/// \fn CX3DImporter_NodeElement_MetaFloat(CX3DImporter_NodeElement* pParent)
|
/// \fn CX3DImporter_NodeElement_MetaFloat(CX3DImporter_NodeElement* pParent)
|
||||||
/// Constructor
|
/// Constructor
|
||||||
|
@ -309,7 +310,7 @@ struct CX3DImporter_NodeElement_MetaFloat : public CX3DImporter_NodeElement_Meta
|
||||||
/// This struct describe metavalue of type integer.
|
/// This struct describe metavalue of type integer.
|
||||||
struct CX3DImporter_NodeElement_MetaInteger : public CX3DImporter_NodeElement_Meta
|
struct CX3DImporter_NodeElement_MetaInteger : public CX3DImporter_NodeElement_Meta
|
||||||
{
|
{
|
||||||
std::list<int32_t> Value;///< Stored value.
|
std::vector<int32_t> Value;///< Stored value.
|
||||||
|
|
||||||
/// \fn CX3DImporter_NodeElement_MetaInteger(CX3DImporter_NodeElement* pParent)
|
/// \fn CX3DImporter_NodeElement_MetaInteger(CX3DImporter_NodeElement* pParent)
|
||||||
/// Constructor
|
/// Constructor
|
||||||
|
@ -508,7 +509,7 @@ public:
|
||||||
/// If the angle between the geometric normals of two adjacent faces is less than the crease angle, normals shall be calculated so that the faces are
|
/// If the angle between the geometric normals of two adjacent faces is less than the crease angle, normals shall be calculated so that the faces are
|
||||||
/// shaded smoothly across the edge; otherwise, normals shall be calculated so that a lighting discontinuity across the edge is produced.
|
/// shaded smoothly across the edge; otherwise, normals shall be calculated so that a lighting discontinuity across the edge is produced.
|
||||||
float CreaseAngle;
|
float CreaseAngle;
|
||||||
std::list<int32_t> CoordIdx;///< Coordinates list by faces. In X3D format: "-1" - delimiter for faces.
|
std::vector<int32_t> CoordIdx;///< Coordinates list by faces. In X3D format: "-1" - delimiter for faces.
|
||||||
|
|
||||||
/***********************************************/
|
/***********************************************/
|
||||||
/****************** Functions ******************/
|
/****************** Functions ******************/
|
||||||
|
@ -554,21 +555,21 @@ public:
|
||||||
/// direction. If normals are not generated but are supplied using a Normal node, and the orientation of the normals does not match the setting of the
|
/// direction. If normals are not generated but are supplied using a Normal node, and the orientation of the normals does not match the setting of the
|
||||||
/// ccw field, results are undefined.
|
/// ccw field, results are undefined.
|
||||||
bool CCW;
|
bool CCW;
|
||||||
std::list<int32_t> ColorIndex;///< Field to specify the polygonal faces by indexing into the <Color> or <ColorRGBA>.
|
std::vector<int32_t> ColorIndex;///< Field to specify the polygonal faces by indexing into the <Color> or <ColorRGBA>.
|
||||||
bool ColorPerVertex;///< If true then colors are defined for every vertex, else for every face(line).
|
bool ColorPerVertex;///< If true then colors are defined for every vertex, else for every face(line).
|
||||||
/// \var Convex
|
/// \var Convex
|
||||||
/// The convex field indicates whether all polygons in the shape are convex (TRUE). A polygon is convex if it is planar, does not intersect itself,
|
/// The convex field indicates whether all polygons in the shape are convex (TRUE). A polygon is convex if it is planar, does not intersect itself,
|
||||||
/// and all of the interior angles at its vertices are less than 180 degrees. Non planar and self intersecting polygons may produce undefined results
|
/// and all of the interior angles at its vertices are less than 180 degrees. Non planar and self intersecting polygons may produce undefined results
|
||||||
/// even if the convex field is FALSE.
|
/// even if the convex field is FALSE.
|
||||||
bool Convex;
|
bool Convex;
|
||||||
std::list<int32_t> CoordIndex;///< Field to specify the polygonal faces by indexing into the <Coordinate>.
|
std::vector<int32_t> CoordIndex;///< Field to specify the polygonal faces by indexing into the <Coordinate>.
|
||||||
/// \var CreaseAngle
|
/// \var CreaseAngle
|
||||||
/// If the angle between the geometric normals of two adjacent faces is less than the crease angle, normals shall be calculated so that the faces are
|
/// If the angle between the geometric normals of two adjacent faces is less than the crease angle, normals shall be calculated so that the faces are
|
||||||
/// shaded smoothly across the edge; otherwise, normals shall be calculated so that a lighting discontinuity across the edge is produced.
|
/// shaded smoothly across the edge; otherwise, normals shall be calculated so that a lighting discontinuity across the edge is produced.
|
||||||
float CreaseAngle;
|
float CreaseAngle;
|
||||||
std::list<int32_t> NormalIndex;///< Field to specify the polygonal faces by indexing into the <Normal>.
|
std::vector<int32_t> NormalIndex;///< Field to specify the polygonal faces by indexing into the <Normal>.
|
||||||
bool NormalPerVertex;///< If true then normals are defined for every vertex, else for every face(line).
|
bool NormalPerVertex;///< If true then normals are defined for every vertex, else for every face(line).
|
||||||
std::list<int32_t> TexCoordIndex;///< Field to specify the polygonal faces by indexing into the <TextureCoordinate>.
|
std::vector<int32_t> TexCoordIndex;///< Field to specify the polygonal faces by indexing into the <TextureCoordinate>.
|
||||||
|
|
||||||
/***********************************************/
|
/***********************************************/
|
||||||
/****************** Functions ******************/
|
/****************** Functions ******************/
|
||||||
|
@ -616,10 +617,10 @@ public:
|
||||||
bool CCW;
|
bool CCW;
|
||||||
bool ColorPerVertex;///< If true then colors are defined for every vertex, else for every face(line).
|
bool ColorPerVertex;///< If true then colors are defined for every vertex, else for every face(line).
|
||||||
bool NormalPerVertex;///< If true then normals are defined for every vertex, else for every face(line).
|
bool NormalPerVertex;///< If true then normals are defined for every vertex, else for every face(line).
|
||||||
std::list<int32_t> CoordIndex;///< Field to specify the polygonal faces by indexing into the <Coordinate>.
|
std::vector<int32_t> CoordIndex;///< Field to specify the polygonal faces by indexing into the <Coordinate>.
|
||||||
std::list<int32_t> NormalIndex;///< Field to specify the polygonal faces by indexing into the <Normal>.
|
std::vector<int32_t> NormalIndex;///< Field to specify the polygonal faces by indexing into the <Normal>.
|
||||||
std::list<int32_t> TexCoordIndex;///< Field to specify the polygonal faces by indexing into the <TextureCoordinate>.
|
std::vector<int32_t> TexCoordIndex;///< Field to specify the polygonal faces by indexing into the <TextureCoordinate>.
|
||||||
std::list<int32_t> VertexCount;///< Field describes how many vertices are to be used in each polyline(polygon) from the <Coordinate> field.
|
std::vector<int32_t> VertexCount;///< Field describes how many vertices are to be used in each polyline(polygon) from the <Coordinate> field.
|
||||||
|
|
||||||
/***********************************************/
|
/***********************************************/
|
||||||
/****************** Functions ******************/
|
/****************** Functions ******************/
|
||||||
|
|
|
@ -180,16 +180,16 @@ void X3DImporter::ParseNode_Rendering_Coordinate()
|
||||||
void X3DImporter::ParseNode_Rendering_IndexedLineSet()
|
void X3DImporter::ParseNode_Rendering_IndexedLineSet()
|
||||||
{
|
{
|
||||||
std::string use, def;
|
std::string use, def;
|
||||||
std::list<int32_t> colorIndex;
|
std::vector<int32_t> colorIndex;
|
||||||
bool colorPerVertex = true;
|
bool colorPerVertex = true;
|
||||||
std::list<int32_t> coordIndex;
|
std::vector<int32_t> coordIndex;
|
||||||
CX3DImporter_NodeElement* ne( nullptr );
|
CX3DImporter_NodeElement* ne( nullptr );
|
||||||
|
|
||||||
MACRO_ATTRREAD_LOOPBEG;
|
MACRO_ATTRREAD_LOOPBEG;
|
||||||
MACRO_ATTRREAD_CHECKUSEDEF_RET(def, use);
|
MACRO_ATTRREAD_CHECKUSEDEF_RET(def, use);
|
||||||
MACRO_ATTRREAD_CHECK_REF("colorIndex", colorIndex, XML_ReadNode_GetAttrVal_AsListI32);
|
MACRO_ATTRREAD_CHECK_REF("colorIndex", colorIndex, XML_ReadNode_GetAttrVal_AsArrI32);
|
||||||
MACRO_ATTRREAD_CHECK_RET("colorPerVertex", colorPerVertex, XML_ReadNode_GetAttrVal_AsBool);
|
MACRO_ATTRREAD_CHECK_RET("colorPerVertex", colorPerVertex, XML_ReadNode_GetAttrVal_AsBool);
|
||||||
MACRO_ATTRREAD_CHECK_REF("coordIndex", coordIndex, XML_ReadNode_GetAttrVal_AsListI32);
|
MACRO_ATTRREAD_CHECK_REF("coordIndex", coordIndex, XML_ReadNode_GetAttrVal_AsArrI32);
|
||||||
MACRO_ATTRREAD_LOOPEND;
|
MACRO_ATTRREAD_LOOPEND;
|
||||||
|
|
||||||
// if "USE" defined then find already defined element.
|
// if "USE" defined then find already defined element.
|
||||||
|
@ -256,7 +256,7 @@ void X3DImporter::ParseNode_Rendering_IndexedTriangleFanSet()
|
||||||
std::string use, def;
|
std::string use, def;
|
||||||
bool ccw = true;
|
bool ccw = true;
|
||||||
bool colorPerVertex = true;
|
bool colorPerVertex = true;
|
||||||
std::list<int32_t> index;
|
std::vector<int32_t> index;
|
||||||
bool normalPerVertex = true;
|
bool normalPerVertex = true;
|
||||||
bool solid = true;
|
bool solid = true;
|
||||||
CX3DImporter_NodeElement* ne( nullptr );
|
CX3DImporter_NodeElement* ne( nullptr );
|
||||||
|
@ -265,7 +265,7 @@ void X3DImporter::ParseNode_Rendering_IndexedTriangleFanSet()
|
||||||
MACRO_ATTRREAD_CHECKUSEDEF_RET(def, use);
|
MACRO_ATTRREAD_CHECKUSEDEF_RET(def, use);
|
||||||
MACRO_ATTRREAD_CHECK_RET("ccw", ccw, XML_ReadNode_GetAttrVal_AsBool);
|
MACRO_ATTRREAD_CHECK_RET("ccw", ccw, XML_ReadNode_GetAttrVal_AsBool);
|
||||||
MACRO_ATTRREAD_CHECK_RET("colorPerVertex", colorPerVertex, XML_ReadNode_GetAttrVal_AsBool);
|
MACRO_ATTRREAD_CHECK_RET("colorPerVertex", colorPerVertex, XML_ReadNode_GetAttrVal_AsBool);
|
||||||
MACRO_ATTRREAD_CHECK_REF("index", index, XML_ReadNode_GetAttrVal_AsListI32);
|
MACRO_ATTRREAD_CHECK_REF("index", index, XML_ReadNode_GetAttrVal_AsArrI32);
|
||||||
MACRO_ATTRREAD_CHECK_RET("normalPerVertex", normalPerVertex, XML_ReadNode_GetAttrVal_AsBool);
|
MACRO_ATTRREAD_CHECK_RET("normalPerVertex", normalPerVertex, XML_ReadNode_GetAttrVal_AsBool);
|
||||||
MACRO_ATTRREAD_CHECK_RET("solid", solid, XML_ReadNode_GetAttrVal_AsBool);
|
MACRO_ATTRREAD_CHECK_RET("solid", solid, XML_ReadNode_GetAttrVal_AsBool);
|
||||||
MACRO_ATTRREAD_LOOPEND;
|
MACRO_ATTRREAD_LOOPEND;
|
||||||
|
@ -288,9 +288,46 @@ void X3DImporter::ParseNode_Rendering_IndexedTriangleFanSet()
|
||||||
|
|
||||||
ne_alias.CCW = ccw;
|
ne_alias.CCW = ccw;
|
||||||
ne_alias.ColorPerVertex = colorPerVertex;
|
ne_alias.ColorPerVertex = colorPerVertex;
|
||||||
ne_alias.CoordIndex = index;
|
|
||||||
ne_alias.NormalPerVertex = normalPerVertex;
|
ne_alias.NormalPerVertex = normalPerVertex;
|
||||||
ne_alias.Solid = solid;
|
ne_alias.Solid = solid;
|
||||||
|
|
||||||
|
ne_alias.CoordIndex.clear();
|
||||||
|
int counter = 0;
|
||||||
|
int32_t idx[3];
|
||||||
|
for(std::vector<int32_t>::const_iterator idx_it = index.begin(); idx_it != index.end(); idx_it++)
|
||||||
|
{
|
||||||
|
idx[2] = *idx_it;
|
||||||
|
if (idx[2] < 0)
|
||||||
|
{
|
||||||
|
counter = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (counter >= 2)
|
||||||
|
{
|
||||||
|
if(ccw)
|
||||||
|
{
|
||||||
|
ne_alias.CoordIndex.push_back(idx[0]);
|
||||||
|
ne_alias.CoordIndex.push_back(idx[1]);
|
||||||
|
ne_alias.CoordIndex.push_back(idx[2]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ne_alias.CoordIndex.push_back(idx[0]);
|
||||||
|
ne_alias.CoordIndex.push_back(idx[2]);
|
||||||
|
ne_alias.CoordIndex.push_back(idx[1]);
|
||||||
|
}
|
||||||
|
ne_alias.CoordIndex.push_back(-1);
|
||||||
|
idx[1] = idx[2];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
idx[counter] = idx[2];
|
||||||
|
}
|
||||||
|
++counter;
|
||||||
|
}
|
||||||
|
}// for(std::list<int32_t>::const_iterator idx_it = index.begin(); idx_it != ne_alias.index.end(); idx_it++)
|
||||||
|
|
||||||
// check for child nodes
|
// check for child nodes
|
||||||
if(!mReader->isEmptyElement())
|
if(!mReader->isEmptyElement())
|
||||||
{
|
{
|
||||||
|
@ -337,7 +374,7 @@ void X3DImporter::ParseNode_Rendering_IndexedTriangleSet()
|
||||||
std::string use, def;
|
std::string use, def;
|
||||||
bool ccw = true;
|
bool ccw = true;
|
||||||
bool colorPerVertex = true;
|
bool colorPerVertex = true;
|
||||||
std::list<int32_t> index;
|
std::vector<int32_t> index;
|
||||||
bool normalPerVertex = true;
|
bool normalPerVertex = true;
|
||||||
bool solid = true;
|
bool solid = true;
|
||||||
CX3DImporter_NodeElement* ne( nullptr );
|
CX3DImporter_NodeElement* ne( nullptr );
|
||||||
|
@ -346,7 +383,7 @@ void X3DImporter::ParseNode_Rendering_IndexedTriangleSet()
|
||||||
MACRO_ATTRREAD_CHECKUSEDEF_RET(def, use);
|
MACRO_ATTRREAD_CHECKUSEDEF_RET(def, use);
|
||||||
MACRO_ATTRREAD_CHECK_RET("ccw", ccw, XML_ReadNode_GetAttrVal_AsBool);
|
MACRO_ATTRREAD_CHECK_RET("ccw", ccw, XML_ReadNode_GetAttrVal_AsBool);
|
||||||
MACRO_ATTRREAD_CHECK_RET("colorPerVertex", colorPerVertex, XML_ReadNode_GetAttrVal_AsBool);
|
MACRO_ATTRREAD_CHECK_RET("colorPerVertex", colorPerVertex, XML_ReadNode_GetAttrVal_AsBool);
|
||||||
MACRO_ATTRREAD_CHECK_REF("index", index, XML_ReadNode_GetAttrVal_AsListI32);
|
MACRO_ATTRREAD_CHECK_REF("index", index, XML_ReadNode_GetAttrVal_AsArrI32);
|
||||||
MACRO_ATTRREAD_CHECK_RET("normalPerVertex", normalPerVertex, XML_ReadNode_GetAttrVal_AsBool);
|
MACRO_ATTRREAD_CHECK_RET("normalPerVertex", normalPerVertex, XML_ReadNode_GetAttrVal_AsBool);
|
||||||
MACRO_ATTRREAD_CHECK_RET("solid", solid, XML_ReadNode_GetAttrVal_AsBool);
|
MACRO_ATTRREAD_CHECK_RET("solid", solid, XML_ReadNode_GetAttrVal_AsBool);
|
||||||
MACRO_ATTRREAD_LOOPEND;
|
MACRO_ATTRREAD_LOOPEND;
|
||||||
|
@ -369,9 +406,34 @@ void X3DImporter::ParseNode_Rendering_IndexedTriangleSet()
|
||||||
|
|
||||||
ne_alias.CCW = ccw;
|
ne_alias.CCW = ccw;
|
||||||
ne_alias.ColorPerVertex = colorPerVertex;
|
ne_alias.ColorPerVertex = colorPerVertex;
|
||||||
ne_alias.CoordIndex = index;
|
|
||||||
ne_alias.NormalPerVertex = normalPerVertex;
|
ne_alias.NormalPerVertex = normalPerVertex;
|
||||||
ne_alias.Solid = solid;
|
ne_alias.Solid = solid;
|
||||||
|
|
||||||
|
ne_alias.CoordIndex.clear();
|
||||||
|
int counter = 0;
|
||||||
|
int32_t idx[3];
|
||||||
|
for(std::vector<int32_t>::const_iterator idx_it = index.begin(); idx_it != index.end(); idx_it++)
|
||||||
|
{
|
||||||
|
idx[counter++] = *idx_it;
|
||||||
|
if (counter > 2)
|
||||||
|
{
|
||||||
|
counter = 0;
|
||||||
|
if(ccw)
|
||||||
|
{
|
||||||
|
ne_alias.CoordIndex.push_back(idx[0]);
|
||||||
|
ne_alias.CoordIndex.push_back(idx[1]);
|
||||||
|
ne_alias.CoordIndex.push_back(idx[2]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ne_alias.CoordIndex.push_back(idx[0]);
|
||||||
|
ne_alias.CoordIndex.push_back(idx[2]);
|
||||||
|
ne_alias.CoordIndex.push_back(idx[1]);
|
||||||
|
}
|
||||||
|
ne_alias.CoordIndex.push_back(-1);
|
||||||
|
}
|
||||||
|
}// for(std::list<int32_t>::const_iterator idx_it = index.begin(); idx_it != ne_alias.index.end(); idx_it++)
|
||||||
|
|
||||||
// check for child nodes
|
// check for child nodes
|
||||||
if(!mReader->isEmptyElement())
|
if(!mReader->isEmptyElement())
|
||||||
{
|
{
|
||||||
|
@ -418,7 +480,7 @@ void X3DImporter::ParseNode_Rendering_IndexedTriangleStripSet()
|
||||||
std::string use, def;
|
std::string use, def;
|
||||||
bool ccw = true;
|
bool ccw = true;
|
||||||
bool colorPerVertex = true;
|
bool colorPerVertex = true;
|
||||||
std::list<int32_t> index;
|
std::vector<int32_t> index;
|
||||||
bool normalPerVertex = true;
|
bool normalPerVertex = true;
|
||||||
bool solid = true;
|
bool solid = true;
|
||||||
CX3DImporter_NodeElement* ne( nullptr );
|
CX3DImporter_NodeElement* ne( nullptr );
|
||||||
|
@ -427,7 +489,7 @@ void X3DImporter::ParseNode_Rendering_IndexedTriangleStripSet()
|
||||||
MACRO_ATTRREAD_CHECKUSEDEF_RET(def, use);
|
MACRO_ATTRREAD_CHECKUSEDEF_RET(def, use);
|
||||||
MACRO_ATTRREAD_CHECK_RET("ccw", ccw, XML_ReadNode_GetAttrVal_AsBool);
|
MACRO_ATTRREAD_CHECK_RET("ccw", ccw, XML_ReadNode_GetAttrVal_AsBool);
|
||||||
MACRO_ATTRREAD_CHECK_RET("colorPerVertex", colorPerVertex, XML_ReadNode_GetAttrVal_AsBool);
|
MACRO_ATTRREAD_CHECK_RET("colorPerVertex", colorPerVertex, XML_ReadNode_GetAttrVal_AsBool);
|
||||||
MACRO_ATTRREAD_CHECK_REF("index", index, XML_ReadNode_GetAttrVal_AsListI32);
|
MACRO_ATTRREAD_CHECK_REF("index", index, XML_ReadNode_GetAttrVal_AsArrI32);
|
||||||
MACRO_ATTRREAD_CHECK_RET("normalPerVertex", normalPerVertex, XML_ReadNode_GetAttrVal_AsBool);
|
MACRO_ATTRREAD_CHECK_RET("normalPerVertex", normalPerVertex, XML_ReadNode_GetAttrVal_AsBool);
|
||||||
MACRO_ATTRREAD_CHECK_RET("solid", solid, XML_ReadNode_GetAttrVal_AsBool);
|
MACRO_ATTRREAD_CHECK_RET("solid", solid, XML_ReadNode_GetAttrVal_AsBool);
|
||||||
MACRO_ATTRREAD_LOOPEND;
|
MACRO_ATTRREAD_LOOPEND;
|
||||||
|
@ -450,9 +512,42 @@ void X3DImporter::ParseNode_Rendering_IndexedTriangleStripSet()
|
||||||
|
|
||||||
ne_alias.CCW = ccw;
|
ne_alias.CCW = ccw;
|
||||||
ne_alias.ColorPerVertex = colorPerVertex;
|
ne_alias.ColorPerVertex = colorPerVertex;
|
||||||
ne_alias.CoordIndex = index;
|
|
||||||
ne_alias.NormalPerVertex = normalPerVertex;
|
ne_alias.NormalPerVertex = normalPerVertex;
|
||||||
ne_alias.Solid = solid;
|
ne_alias.Solid = solid;
|
||||||
|
|
||||||
|
ne_alias.CoordIndex.clear();
|
||||||
|
int counter = 0;
|
||||||
|
int32_t idx[3];
|
||||||
|
for(std::vector<int32_t>::const_iterator idx_it = index.begin(); idx_it != index.end(); idx_it++)
|
||||||
|
{
|
||||||
|
idx[2] = *idx_it;
|
||||||
|
if (idx[2] < 0)
|
||||||
|
{
|
||||||
|
counter = 0;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (counter >= 2)
|
||||||
|
{
|
||||||
|
if(ccw)
|
||||||
|
{
|
||||||
|
ne_alias.CoordIndex.push_back(idx[0]);
|
||||||
|
ne_alias.CoordIndex.push_back(idx[1]);
|
||||||
|
ne_alias.CoordIndex.push_back(idx[2]);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
ne_alias.CoordIndex.push_back(idx[0]);
|
||||||
|
ne_alias.CoordIndex.push_back(idx[2]);
|
||||||
|
ne_alias.CoordIndex.push_back(idx[1]);
|
||||||
|
}
|
||||||
|
ne_alias.CoordIndex.push_back(-1);
|
||||||
|
}
|
||||||
|
idx[counter & 1] = idx[2];
|
||||||
|
++counter;
|
||||||
|
}
|
||||||
|
}// for(std::list<int32_t>::const_iterator idx_it = index.begin(); idx_it != ne_alias.index.end(); idx_it++)
|
||||||
|
|
||||||
// check for child nodes
|
// check for child nodes
|
||||||
if(!mReader->isEmptyElement())
|
if(!mReader->isEmptyElement())
|
||||||
{
|
{
|
||||||
|
@ -492,12 +587,12 @@ void X3DImporter::ParseNode_Rendering_IndexedTriangleStripSet()
|
||||||
void X3DImporter::ParseNode_Rendering_LineSet()
|
void X3DImporter::ParseNode_Rendering_LineSet()
|
||||||
{
|
{
|
||||||
std::string use, def;
|
std::string use, def;
|
||||||
std::list<int32_t> vertexCount;
|
std::vector<int32_t> vertexCount;
|
||||||
CX3DImporter_NodeElement* ne( nullptr );
|
CX3DImporter_NodeElement* ne( nullptr );
|
||||||
|
|
||||||
MACRO_ATTRREAD_LOOPBEG;
|
MACRO_ATTRREAD_LOOPBEG;
|
||||||
MACRO_ATTRREAD_CHECKUSEDEF_RET(def, use);
|
MACRO_ATTRREAD_CHECKUSEDEF_RET(def, use);
|
||||||
MACRO_ATTRREAD_CHECK_REF("vertexCount", vertexCount, XML_ReadNode_GetAttrVal_AsListI32);
|
MACRO_ATTRREAD_CHECK_REF("vertexCount", vertexCount, XML_ReadNode_GetAttrVal_AsArrI32);
|
||||||
MACRO_ATTRREAD_LOOPEND;
|
MACRO_ATTRREAD_LOOPEND;
|
||||||
|
|
||||||
// if "USE" defined then find already defined element.
|
// if "USE" defined then find already defined element.
|
||||||
|
@ -521,7 +616,7 @@ void X3DImporter::ParseNode_Rendering_LineSet()
|
||||||
size_t coord_num = 0;
|
size_t coord_num = 0;
|
||||||
|
|
||||||
ne_alias.CoordIndex.clear();
|
ne_alias.CoordIndex.clear();
|
||||||
for(std::list<int32_t>::const_iterator vc_it = ne_alias.VertexCount.begin(); vc_it != ne_alias.VertexCount.end(); vc_it++)
|
for(std::vector<int32_t>::const_iterator vc_it = ne_alias.VertexCount.begin(); vc_it != ne_alias.VertexCount.end(); vc_it++)
|
||||||
{
|
{
|
||||||
if(*vc_it < 2) throw DeadlyImportError("LineSet. vertexCount shall be greater than or equal to two.");
|
if(*vc_it < 2) throw DeadlyImportError("LineSet. vertexCount shall be greater than or equal to two.");
|
||||||
|
|
||||||
|
@ -627,7 +722,7 @@ void X3DImporter::ParseNode_Rendering_TriangleFanSet()
|
||||||
std::string use, def;
|
std::string use, def;
|
||||||
bool ccw = true;
|
bool ccw = true;
|
||||||
bool colorPerVertex = true;
|
bool colorPerVertex = true;
|
||||||
std::list<int32_t> fanCount;
|
std::vector<int32_t> fanCount;
|
||||||
bool normalPerVertex = true;
|
bool normalPerVertex = true;
|
||||||
bool solid = true;
|
bool solid = true;
|
||||||
CX3DImporter_NodeElement* ne( nullptr );
|
CX3DImporter_NodeElement* ne( nullptr );
|
||||||
|
@ -636,7 +731,7 @@ void X3DImporter::ParseNode_Rendering_TriangleFanSet()
|
||||||
MACRO_ATTRREAD_CHECKUSEDEF_RET(def, use);
|
MACRO_ATTRREAD_CHECKUSEDEF_RET(def, use);
|
||||||
MACRO_ATTRREAD_CHECK_RET("ccw", ccw, XML_ReadNode_GetAttrVal_AsBool);
|
MACRO_ATTRREAD_CHECK_RET("ccw", ccw, XML_ReadNode_GetAttrVal_AsBool);
|
||||||
MACRO_ATTRREAD_CHECK_RET("colorPerVertex", colorPerVertex, XML_ReadNode_GetAttrVal_AsBool);
|
MACRO_ATTRREAD_CHECK_RET("colorPerVertex", colorPerVertex, XML_ReadNode_GetAttrVal_AsBool);
|
||||||
MACRO_ATTRREAD_CHECK_REF("fanCount", fanCount, XML_ReadNode_GetAttrVal_AsListI32);
|
MACRO_ATTRREAD_CHECK_REF("fanCount", fanCount, XML_ReadNode_GetAttrVal_AsArrI32);
|
||||||
MACRO_ATTRREAD_CHECK_RET("normalPerVertex", normalPerVertex, XML_ReadNode_GetAttrVal_AsBool);
|
MACRO_ATTRREAD_CHECK_RET("normalPerVertex", normalPerVertex, XML_ReadNode_GetAttrVal_AsBool);
|
||||||
MACRO_ATTRREAD_CHECK_RET("solid", solid, XML_ReadNode_GetAttrVal_AsBool);
|
MACRO_ATTRREAD_CHECK_RET("solid", solid, XML_ReadNode_GetAttrVal_AsBool);
|
||||||
MACRO_ATTRREAD_LOOPEND;
|
MACRO_ATTRREAD_LOOPEND;
|
||||||
|
@ -669,7 +764,7 @@ void X3DImporter::ParseNode_Rendering_TriangleFanSet()
|
||||||
// assign indices for first triangle
|
// assign indices for first triangle
|
||||||
coord_num_first = 0;
|
coord_num_first = 0;
|
||||||
coord_num_prev = 1;
|
coord_num_prev = 1;
|
||||||
for(std::list<int32_t>::const_iterator vc_it = ne_alias.VertexCount.begin(); vc_it != ne_alias.VertexCount.end(); vc_it++)
|
for(std::vector<int32_t>::const_iterator vc_it = ne_alias.VertexCount.begin(); vc_it != ne_alias.VertexCount.end(); vc_it++)
|
||||||
{
|
{
|
||||||
if(*vc_it < 3) throw DeadlyImportError("TriangleFanSet. fanCount shall be greater than or equal to three.");
|
if(*vc_it < 3) throw DeadlyImportError("TriangleFanSet. fanCount shall be greater than or equal to three.");
|
||||||
|
|
||||||
|
@ -818,7 +913,7 @@ void X3DImporter::ParseNode_Rendering_TriangleStripSet()
|
||||||
std::string use, def;
|
std::string use, def;
|
||||||
bool ccw = true;
|
bool ccw = true;
|
||||||
bool colorPerVertex = true;
|
bool colorPerVertex = true;
|
||||||
std::list<int32_t> stripCount;
|
std::vector<int32_t> stripCount;
|
||||||
bool normalPerVertex = true;
|
bool normalPerVertex = true;
|
||||||
bool solid = true;
|
bool solid = true;
|
||||||
CX3DImporter_NodeElement* ne( nullptr );
|
CX3DImporter_NodeElement* ne( nullptr );
|
||||||
|
@ -827,7 +922,7 @@ void X3DImporter::ParseNode_Rendering_TriangleStripSet()
|
||||||
MACRO_ATTRREAD_CHECKUSEDEF_RET(def, use);
|
MACRO_ATTRREAD_CHECKUSEDEF_RET(def, use);
|
||||||
MACRO_ATTRREAD_CHECK_RET("ccw", ccw, XML_ReadNode_GetAttrVal_AsBool);
|
MACRO_ATTRREAD_CHECK_RET("ccw", ccw, XML_ReadNode_GetAttrVal_AsBool);
|
||||||
MACRO_ATTRREAD_CHECK_RET("colorPerVertex", colorPerVertex, XML_ReadNode_GetAttrVal_AsBool);
|
MACRO_ATTRREAD_CHECK_RET("colorPerVertex", colorPerVertex, XML_ReadNode_GetAttrVal_AsBool);
|
||||||
MACRO_ATTRREAD_CHECK_REF("stripCount", stripCount, XML_ReadNode_GetAttrVal_AsListI32);
|
MACRO_ATTRREAD_CHECK_REF("stripCount", stripCount, XML_ReadNode_GetAttrVal_AsArrI32);
|
||||||
MACRO_ATTRREAD_CHECK_RET("normalPerVertex", normalPerVertex, XML_ReadNode_GetAttrVal_AsBool);
|
MACRO_ATTRREAD_CHECK_RET("normalPerVertex", normalPerVertex, XML_ReadNode_GetAttrVal_AsBool);
|
||||||
MACRO_ATTRREAD_CHECK_RET("solid", solid, XML_ReadNode_GetAttrVal_AsBool);
|
MACRO_ATTRREAD_CHECK_RET("solid", solid, XML_ReadNode_GetAttrVal_AsBool);
|
||||||
MACRO_ATTRREAD_LOOPEND;
|
MACRO_ATTRREAD_LOOPEND;
|
||||||
|
@ -860,7 +955,7 @@ void X3DImporter::ParseNode_Rendering_TriangleStripSet()
|
||||||
|
|
||||||
ne_alias.CoordIndex.clear();
|
ne_alias.CoordIndex.clear();
|
||||||
coord_num_sb = 0;
|
coord_num_sb = 0;
|
||||||
for(std::list<int32_t>::const_iterator vc_it = ne_alias.VertexCount.begin(); vc_it != ne_alias.VertexCount.end(); vc_it++)
|
for(std::vector<int32_t>::const_iterator vc_it = ne_alias.VertexCount.begin(); vc_it != ne_alias.VertexCount.end(); vc_it++)
|
||||||
{
|
{
|
||||||
if(*vc_it < 3) throw DeadlyImportError("TriangleStripSet. stripCount shall be greater than or equal to three.");
|
if(*vc_it < 3) throw DeadlyImportError("TriangleStripSet. stripCount shall be greater than or equal to three.");
|
||||||
|
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -43,12 +43,13 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
#ifndef ASSIMP_BUILD_NO_EXPORT
|
#ifndef ASSIMP_BUILD_NO_EXPORT
|
||||||
#ifndef ASSIMP_BUILD_NO_X_EXPORTER
|
#ifndef ASSIMP_BUILD_NO_X_EXPORTER
|
||||||
|
|
||||||
#include "XFileExporter.h"
|
#include "XFileExporter.h"
|
||||||
#include "ConvertToLHProcess.h"
|
#include "ConvertToLHProcess.h"
|
||||||
#include "Bitmap.h"
|
#include "Bitmap.h"
|
||||||
#include "BaseImporter.h"
|
#include "BaseImporter.h"
|
||||||
#include "fast_atof.h"
|
#include "fast_atof.h"
|
||||||
#include "SceneCombiner.h"
|
#include <assimp/SceneCombiner.h>
|
||||||
#include <assimp/DefaultIOSystem.h>
|
#include <assimp/DefaultIOSystem.h>
|
||||||
#include <ctime>
|
#include <ctime>
|
||||||
#include <set>
|
#include <set>
|
||||||
|
|
|
@ -237,8 +237,9 @@ aiNode* XFileImporter::CreateNodes( aiScene* pScene, aiNode* pParent, const XFil
|
||||||
// Creates the meshes for the given node.
|
// Creates the meshes for the given node.
|
||||||
void XFileImporter::CreateMeshes( aiScene* pScene, aiNode* pNode, const std::vector<XFile::Mesh*>& pMeshes)
|
void XFileImporter::CreateMeshes( aiScene* pScene, aiNode* pNode, const std::vector<XFile::Mesh*>& pMeshes)
|
||||||
{
|
{
|
||||||
if( pMeshes.size() == 0)
|
if (pMeshes.empty()) {
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// create a mesh for each mesh-material combination in the source node
|
// create a mesh for each mesh-material combination in the source node
|
||||||
std::vector<aiMesh*> meshes;
|
std::vector<aiMesh*> meshes;
|
||||||
|
|
|
@ -466,15 +466,12 @@ void XFileParser::ParseDataObjectMesh( Mesh* pMesh)
|
||||||
pMesh->mPosFaces.resize( numPosFaces);
|
pMesh->mPosFaces.resize( numPosFaces);
|
||||||
for( unsigned int a = 0; a < numPosFaces; a++)
|
for( unsigned int a = 0; a < numPosFaces; a++)
|
||||||
{
|
{
|
||||||
unsigned int numIndices = ReadInt();
|
|
||||||
if( numIndices < 3) {
|
|
||||||
ThrowException( format() << "Invalid index count " << numIndices << " for face " << a << "." );
|
|
||||||
}
|
|
||||||
|
|
||||||
// read indices
|
// read indices
|
||||||
|
unsigned int numIndices = ReadInt();
|
||||||
Face& face = pMesh->mPosFaces[a];
|
Face& face = pMesh->mPosFaces[a];
|
||||||
for( unsigned int b = 0; b < numIndices; b++)
|
for (unsigned int b = 0; b < numIndices; b++) {
|
||||||
face.mIndices.push_back( ReadInt());
|
face.mIndices.push_back( ReadInt() );
|
||||||
|
}
|
||||||
TestForSeparator();
|
TestForSeparator();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -48,8 +48,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include "ByteSwapper.h"
|
#include "ByteSwapper.h"
|
||||||
|
|
||||||
#include "SplitLargeMeshes.h"
|
#include "SplitLargeMeshes.h"
|
||||||
#include "SceneCombiner.h"
|
|
||||||
|
|
||||||
|
#include <assimp/SceneCombiner.h>
|
||||||
#include <assimp/version.h>
|
#include <assimp/version.h>
|
||||||
#include <assimp/IOSystem.hpp>
|
#include <assimp/IOSystem.hpp>
|
||||||
#include <assimp/Exporter.hpp>
|
#include <assimp/Exporter.hpp>
|
||||||
|
@ -185,8 +185,11 @@ inline Ref<Accessor> ExportData(Asset& a, std::string& meshName, Ref<Buffer>& bu
|
||||||
unsigned int bytesPerComp = ComponentTypeSize(compType);
|
unsigned int bytesPerComp = ComponentTypeSize(compType);
|
||||||
|
|
||||||
size_t offset = buffer->byteLength;
|
size_t offset = buffer->byteLength;
|
||||||
|
// make sure offset is correctly byte-aligned, as required by spec
|
||||||
|
size_t padding = offset % bytesPerComp;
|
||||||
|
offset += padding;
|
||||||
size_t length = count * numCompsOut * bytesPerComp;
|
size_t length = count * numCompsOut * bytesPerComp;
|
||||||
buffer->Grow(length);
|
buffer->Grow(length + padding);
|
||||||
|
|
||||||
// bufferView
|
// bufferView
|
||||||
Ref<BufferView> bv = a.bufferViews.Create(a.FindUniqueID(meshName, "view"));
|
Ref<BufferView> bv = a.bufferViews.Create(a.FindUniqueID(meshName, "view"));
|
||||||
|
|
|
@ -3,18 +3,40 @@ PROJECT( OpenDDL-Parser )
|
||||||
SET ( OPENDDL_PARSER_VERSION_MAJOR 0 )
|
SET ( OPENDDL_PARSER_VERSION_MAJOR 0 )
|
||||||
SET ( OPENDDL_PARSER_VERSION_MINOR 1 )
|
SET ( OPENDDL_PARSER_VERSION_MINOR 1 )
|
||||||
SET ( OPENDDL_PARSER_VERSION_PATCH 0 )
|
SET ( OPENDDL_PARSER_VERSION_PATCH 0 )
|
||||||
SET ( OPENDDL_PARSER_VERSION ${CPPCORE_VERSION_MAJOR}.${CPPCORE_VERSION_MINOR}.${CPPCORE_VERSION_PATCH} )
|
SET ( OPENDDL_PARSER_VERSION ${OPENDDL_PARSER_VERSION_MAJOR}.${OPENDDL_PARSER_VERSION_MINOR}.${OPENDDL_PARSER_VERSION_PATCH} )
|
||||||
SET ( PROJECT_VERSION "${OPENDDL_PARSER_VERSION}" )
|
SET ( PROJECT_VERSION "${OPENDDL_PARSER_VERSION}" )
|
||||||
|
|
||||||
|
option( DDL_USE_CPP11 "Set to ON to use C++11 features ( always on on windows )." ON )
|
||||||
|
option( DDL_DEBUG_OUTPUT "Set to ON to use output debug texts" OFF )
|
||||||
|
option( DDL_STATIC_LIBRARY "Set to ON to build static libary of OpenDDL Parser." ON )
|
||||||
|
option( COVERALLS "Generate coveralls data" OFF )
|
||||||
|
|
||||||
|
if ( DDL_USE_CPP11 )
|
||||||
|
if( CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX )
|
||||||
|
set( OPENDDL_CXXFLAGS -std=c++0x )
|
||||||
|
elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang")
|
||||||
|
set( OPENDDL_CXXFLAGS --std=c++11 )
|
||||||
|
endif()
|
||||||
|
else( DDL_USE_CPP11 )
|
||||||
|
add_definitions( -DOPENDDL_NO_USE_CPP11 )
|
||||||
|
endif( DDL_USE_CPP11)
|
||||||
|
|
||||||
if( CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX )
|
if( CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX )
|
||||||
find_package(Threads)
|
find_package(Threads)
|
||||||
else()
|
else()
|
||||||
add_definitions( -D_CRT_SECURE_NO_WARNINGS )
|
add_definitions( -D_CRT_SECURE_NO_WARNINGS )
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if ( DDL_STATIC_LIBRARY )
|
||||||
|
add_definitions( -DOPENDDL_STATIC_LIBARY )
|
||||||
|
endif()
|
||||||
|
|
||||||
add_definitions( -DOPENDDLPARSER_BUILD )
|
add_definitions( -DOPENDDLPARSER_BUILD )
|
||||||
add_definitions( -DOPENDDL_NO_USE_CPP11 )
|
|
||||||
add_definitions( -D_VARIADIC_MAX=10 )
|
add_definitions( -D_VARIADIC_MAX=10 )
|
||||||
|
add_definitions( -DGTEST_HAS_PTHREAD=0 )
|
||||||
|
if ( DDL_DEBUG_OUTPUT )
|
||||||
|
add_definitions( -DDDL_DEBUG_HEADER_NAME)
|
||||||
|
endif()
|
||||||
|
|
||||||
INCLUDE_DIRECTORIES(
|
INCLUDE_DIRECTORIES(
|
||||||
./
|
./
|
||||||
|
@ -24,9 +46,10 @@ INCLUDE_DIRECTORIES(
|
||||||
)
|
)
|
||||||
|
|
||||||
link_directories(
|
link_directories(
|
||||||
./
|
${CMAKE_HOME_DIRECTORY}/lib
|
||||||
)
|
)
|
||||||
|
|
||||||
|
set( CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} ${PROJECT_SOURCE_DIR}/cmake )
|
||||||
SET( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_HOME_DIRECTORY}/lib )
|
SET( CMAKE_LIBRARY_OUTPUT_DIRECTORY ${CMAKE_HOME_DIRECTORY}/lib )
|
||||||
SET( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_HOME_DIRECTORY}/lib )
|
SET( CMAKE_ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_HOME_DIRECTORY}/lib )
|
||||||
SET( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_HOME_DIRECTORY}/bin )
|
SET( CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_HOME_DIRECTORY}/bin )
|
||||||
|
@ -40,18 +63,38 @@ if( WIN32 AND NOT CYGWIN )
|
||||||
endif()
|
endif()
|
||||||
elseif( CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX )
|
elseif( CMAKE_COMPILER_IS_GNUCC OR CMAKE_COMPILER_IS_GNUCXX )
|
||||||
# Update if necessary
|
# Update if necessary
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-long-long -pedantic -std=c++0x")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-long-long -pedantic ${OPENDDL_CXXFLAGS}")
|
||||||
elseif ( "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" )
|
elseif ( "${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang" )
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-long-long -pedantic -std=c++11")
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wno-long-long -pedantic ${OPENDDL_CXXFLAGS} -Wwrite-strings")
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
|
if (COVERALLS)
|
||||||
|
include(Coveralls)
|
||||||
|
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -g -O0 -fprofile-arcs -ftest-coverage")
|
||||||
|
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -g -O0 -fprofile-arcs -ftest-coverage")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
# Include the doc component.
|
||||||
|
FIND_PACKAGE( doxygen )
|
||||||
|
IF ( DOXYGEN_FOUND )
|
||||||
|
CONFIGURE_FILE( doc/openddlparser_doc.in doc/doxygenfile @ONLY )
|
||||||
|
ADD_CUSTOM_TARGET( doc ALL ${DOXYGEN_EXECUTABLE} doc/doxygenfile
|
||||||
|
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
||||||
|
COMMENT "Generating API documentation with Doxygen" VERBATIM )
|
||||||
|
ENDIF ( DOXYGEN_FOUND )
|
||||||
|
|
||||||
SET ( openddl_parser_src
|
SET ( openddl_parser_src
|
||||||
|
code/OpenDDLCommon.cpp
|
||||||
|
code/OpenDDLExport.cpp
|
||||||
code/OpenDDLParser.cpp
|
code/OpenDDLParser.cpp
|
||||||
|
code/OpenDDLStream.cpp
|
||||||
code/DDLNode.cpp
|
code/DDLNode.cpp
|
||||||
code/Value.cpp
|
code/Value.cpp
|
||||||
|
include/openddlparser/OpenDDLCommon.h
|
||||||
|
include/openddlparser/OpenDDLExport.h
|
||||||
include/openddlparser/OpenDDLParser.h
|
include/openddlparser/OpenDDLParser.h
|
||||||
include/openddlparser/OpenDDLParserUtils.h
|
include/openddlparser/OpenDDLParserUtils.h
|
||||||
include/openddlparser/OpenDDLCommon.h
|
include/openddlparser/OpenDDLStream.h
|
||||||
include/openddlparser/DDLNode.h
|
include/openddlparser/DDLNode.h
|
||||||
include/openddlparser/Value.h
|
include/openddlparser/Value.h
|
||||||
README.md
|
README.md
|
||||||
|
@ -59,6 +102,69 @@ SET ( openddl_parser_src
|
||||||
|
|
||||||
SOURCE_GROUP( code FILES ${openddl_parser_src} )
|
SOURCE_GROUP( code FILES ${openddl_parser_src} )
|
||||||
|
|
||||||
ADD_LIBRARY( openddl_parser SHARED
|
if ( DDL_STATIC_LIBRARY )
|
||||||
${openddl_parser_src}
|
ADD_LIBRARY( openddl_parser STATIC
|
||||||
|
${openddl_parser_src}
|
||||||
|
)
|
||||||
|
else()
|
||||||
|
ADD_LIBRARY( openddl_parser SHARED
|
||||||
|
${openddl_parser_src}
|
||||||
|
)
|
||||||
|
endif()
|
||||||
|
|
||||||
|
SET ( GTEST_PATH contrib/gtest-1.7.0 )
|
||||||
|
|
||||||
|
SET ( gtest_src
|
||||||
|
${GTEST_PATH}/src/gtest-death-test.cc
|
||||||
|
${GTEST_PATH}/src/gtest-filepath.cc
|
||||||
|
${GTEST_PATH}/src/gtest-internal-inl.h
|
||||||
|
${GTEST_PATH}/src/gtest-port.cc
|
||||||
|
${GTEST_PATH}/src/gtest-printers.cc
|
||||||
|
${GTEST_PATH}/src/gtest-test-part.cc
|
||||||
|
${GTEST_PATH}/src/gtest-typed-test.cc
|
||||||
|
${GTEST_PATH}/src/gtest.cc
|
||||||
|
${GTEST_PATH}/src/gtest_main.cc
|
||||||
)
|
)
|
||||||
|
|
||||||
|
SET( openddl_parser_unittest_src
|
||||||
|
test/UnitTestCommon.h
|
||||||
|
test/DDLNodeTest.cpp
|
||||||
|
test/OpenDDLCommonTest.cpp
|
||||||
|
test/OpenDDLExportTest.cpp
|
||||||
|
test/OpenDDLParserTest.cpp
|
||||||
|
test/OpenDDLParserUtilsTest.cpp
|
||||||
|
test/OpenDDLStreamTest.cpp
|
||||||
|
test/OpenDDLIntegrationTest.cpp
|
||||||
|
test/ValueTest.cpp
|
||||||
|
test/OpenDDLDefectsTest.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
SOURCE_GROUP( code FILES ${openddl_parser_unittest_src} )
|
||||||
|
SOURCE_GROUP( gtest FILES ${gtest_src} )
|
||||||
|
|
||||||
|
ADD_EXECUTABLE( openddl_parser_unittest
|
||||||
|
${gtest_src}
|
||||||
|
${openddl_parser_unittest_src}
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries( openddl_parser_unittest openddl_parser ${CMAKE_THREAD_LIBS_INIT} )
|
||||||
|
|
||||||
|
SET( openddl_parser_demo_src
|
||||||
|
demo/main.cpp
|
||||||
|
)
|
||||||
|
|
||||||
|
if (COVERALLS)
|
||||||
|
set(COVERAGE_SRCS ${gtest_src} ${openddl_parser_unittest_src} )
|
||||||
|
|
||||||
|
# Create the coveralls target.
|
||||||
|
coveralls_setup(
|
||||||
|
"${COVERAGE_SRCS}" # The source files.
|
||||||
|
ON # If we should upload.
|
||||||
|
"${PROJECT_SOURCE_DIR}/cmake/") # (Optional) Alternate project cmake module path.
|
||||||
|
endif()
|
||||||
|
|
||||||
|
ADD_EXECUTABLE( openddl_parser_demo
|
||||||
|
${openddl_parser_demo_src}
|
||||||
|
)
|
||||||
|
|
||||||
|
target_link_libraries( openddl_parser_demo openddl_parser )
|
||||||
|
|
|
@ -12,5 +12,8 @@ Improvements value interface, serveral bugfixes.
|
||||||
- Henry Read ( henrya2 ):
|
- Henry Read ( henrya2 ):
|
||||||
Static build option, Interface improvements
|
Static build option, Interface improvements
|
||||||
|
|
||||||
|
- (wise86-android)
|
||||||
|
fix several mem-leaks
|
||||||
|
|
||||||
- Paul Holland ( pkholland ):
|
- Paul Holland ( pkholland ):
|
||||||
Bugfixes.
|
Bugfixes.
|
||||||
|
|
|
@ -11,7 +11,7 @@ Current coverity check status:
|
||||||
<img alt="Coverity Scan Build Status"
|
<img alt="Coverity Scan Build Status"
|
||||||
src="https://scan.coverity.com/projects/5606/badge.svg"/>
|
src="https://scan.coverity.com/projects/5606/badge.svg"/>
|
||||||
</a>
|
</a>
|
||||||
|
Current test coverage:[![Coverage Status](https://coveralls.io/repos/github/kimkulling/openddl-parser/badge.svg?branch=master)](https://coveralls.io/github/kimkulling/openddl-parser?branch=cpp_coveralls)
|
||||||
Get the source code
|
Get the source code
|
||||||
===================
|
===================
|
||||||
You can get the code from our git repository, which is located at GitHub. You can clone the repository with the following command:
|
You can get the code from our git repository, which is located at GitHub. You can clone the repository with the following command:
|
||||||
|
@ -25,7 +25,7 @@ After installing it you can open a console and enter:
|
||||||
|
|
||||||
> cmake CMakeLists.txt
|
> cmake CMakeLists.txt
|
||||||
|
|
||||||
This command will generate a build environment for your installed build enrironment ( for Visual-Studio-users the project files will be generated, for gcc-users the makefiles will be generated ).
|
This command will generate a build environment for your preferred build tool ( for Visual-Studio-users the project files will be generated, for gcc-users the makefiles will be generated ).
|
||||||
When using an IDE open the IDE and run the build. When using GNU-make type in your console:
|
When using an IDE open the IDE and run the build. When using GNU-make type in your console:
|
||||||
|
|
||||||
> make
|
> make
|
||||||
|
|
|
@ -68,8 +68,8 @@ DDLNode::DDLNode( const std::string &type, const std::string &name, size_t idx,
|
||||||
}
|
}
|
||||||
|
|
||||||
DDLNode::~DDLNode() {
|
DDLNode::~DDLNode() {
|
||||||
releaseDataType<Property>( m_properties );
|
delete m_properties;
|
||||||
releaseDataType<Value>( m_value );
|
delete m_value;
|
||||||
releaseReferencedNames( m_references );
|
releaseReferencedNames( m_references );
|
||||||
|
|
||||||
delete m_dtArrayList;
|
delete m_dtArrayList;
|
||||||
|
@ -77,6 +77,9 @@ DDLNode::~DDLNode() {
|
||||||
if( s_allocatedNodes[ m_idx ] == this ) {
|
if( s_allocatedNodes[ m_idx ] == this ) {
|
||||||
s_allocatedNodes[ m_idx ] = ddl_nullptr;
|
s_allocatedNodes[ m_idx ] = ddl_nullptr;
|
||||||
}
|
}
|
||||||
|
for ( size_t i = 0; i<m_children.size(); i++ ){
|
||||||
|
delete m_children[ i ];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void DDLNode::attachParent( DDLNode *parent ) {
|
void DDLNode::attachParent( DDLNode *parent ) {
|
||||||
|
@ -91,9 +94,8 @@ void DDLNode::attachParent( DDLNode *parent ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void DDLNode::detachParent() {
|
void DDLNode::detachParent() {
|
||||||
if( m_parent ) {
|
if( ddl_nullptr != m_parent ) {
|
||||||
std::vector<DDLNode*>::iterator it;
|
DDLNodeIt it = std::find( m_parent->m_children.begin(), m_parent->m_children.end(), this );
|
||||||
it = std::find( m_parent->m_children.begin(), m_parent->m_children.end(), this );
|
|
||||||
if( m_parent->m_children.end() != it ) {
|
if( m_parent->m_children.end() != it ) {
|
||||||
m_parent->m_children.erase( it );
|
m_parent->m_children.erase( it );
|
||||||
}
|
}
|
||||||
|
@ -126,6 +128,8 @@ const std::string &DDLNode::getName() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
void DDLNode::setProperties( Property *prop ) {
|
void DDLNode::setProperties( Property *prop ) {
|
||||||
|
if(m_properties!=ddl_nullptr)
|
||||||
|
delete m_properties;
|
||||||
m_properties = prop;
|
m_properties = prop;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -187,6 +191,10 @@ Reference *DDLNode::getReferences() const {
|
||||||
return m_references;
|
return m_references;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void DDLNode::dump(IOStreamBase &stream) {
|
||||||
|
// Todo!
|
||||||
|
}
|
||||||
|
|
||||||
DDLNode *DDLNode::create( const std::string &type, const std::string &name, DDLNode *parent ) {
|
DDLNode *DDLNode::create( const std::string &type, const std::string &name, DDLNode *parent ) {
|
||||||
const size_t idx( s_allocatedNodes.size() );
|
const size_t idx( s_allocatedNodes.size() );
|
||||||
DDLNode *node = new DDLNode( type, name, idx, parent );
|
DDLNode *node = new DDLNode( type, name, idx, parent );
|
||||||
|
@ -197,7 +205,7 @@ DDLNode *DDLNode::create( const std::string &type, const std::string &name, DDLN
|
||||||
|
|
||||||
void DDLNode::releaseNodes() {
|
void DDLNode::releaseNodes() {
|
||||||
if( s_allocatedNodes.size() > 0 ) {
|
if( s_allocatedNodes.size() > 0 ) {
|
||||||
for( DllNodeList::iterator it = s_allocatedNodes.begin(); it != s_allocatedNodes.end(); it++ ) {
|
for( DDLNodeIt it = s_allocatedNodes.begin(); it != s_allocatedNodes.end(); it++ ) {
|
||||||
if( *it ) {
|
if( *it ) {
|
||||||
delete *it;
|
delete *it;
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,6 +22,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
-----------------------------------------------------------------------------------------------*/
|
-----------------------------------------------------------------------------------------------*/
|
||||||
#include <openddlparser/OpenDDLCommon.h>
|
#include <openddlparser/OpenDDLCommon.h>
|
||||||
#include <openddlparser/DDLNode.h>
|
#include <openddlparser/DDLNode.h>
|
||||||
|
#include <openddlparser/Value.h>
|
||||||
|
|
||||||
BEGIN_ODDLPARSER_NS
|
BEGIN_ODDLPARSER_NS
|
||||||
|
|
||||||
|
@ -84,7 +85,14 @@ Name::~Name() {
|
||||||
m_id = ddl_nullptr;
|
m_id = ddl_nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
Reference::Reference()
|
Name::Name( const Name &name ){
|
||||||
|
m_type=name.m_type;
|
||||||
|
m_id=new Text(name.m_id->m_buffer,name.m_id->m_len);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Reference::Reference()
|
||||||
: m_numRefs( 0 )
|
: m_numRefs( 0 )
|
||||||
, m_referencedName( ddl_nullptr ) {
|
, m_referencedName( ddl_nullptr ) {
|
||||||
// empty
|
// empty
|
||||||
|
@ -96,8 +104,16 @@ Reference::Reference( size_t numrefs, Name **names )
|
||||||
if ( numrefs > 0 ) {
|
if ( numrefs > 0 ) {
|
||||||
m_referencedName = new Name *[ numrefs ];
|
m_referencedName = new Name *[ numrefs ];
|
||||||
for ( size_t i = 0; i < numrefs; i++ ) {
|
for ( size_t i = 0; i < numrefs; i++ ) {
|
||||||
Name *name = new Name( names[ i ]->m_type, names[ i ]->m_id );
|
m_referencedName[ i ] = names[i];
|
||||||
m_referencedName[ i ] = name;
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Reference::Reference(const Reference &ref) {
|
||||||
|
m_numRefs=ref.m_numRefs;
|
||||||
|
if(m_numRefs!=0){
|
||||||
|
m_referencedName = new Name*[m_numRefs];
|
||||||
|
for ( size_t i = 0; i < m_numRefs; i++ ) {
|
||||||
|
m_referencedName[i] = new Name(*ref.m_referencedName[i]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -107,6 +123,7 @@ Reference::~Reference() {
|
||||||
delete m_referencedName[ i ];
|
delete m_referencedName[ i ];
|
||||||
}
|
}
|
||||||
m_numRefs = 0;
|
m_numRefs = 0;
|
||||||
|
delete [] m_referencedName;
|
||||||
m_referencedName = ddl_nullptr;
|
m_referencedName = ddl_nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -135,21 +152,30 @@ Property::Property( Text *id )
|
||||||
}
|
}
|
||||||
|
|
||||||
Property::~Property() {
|
Property::~Property() {
|
||||||
m_key = ddl_nullptr;
|
delete m_key;
|
||||||
m_value = ddl_nullptr;
|
if(m_value!=ddl_nullptr)
|
||||||
m_ref = ddl_nullptr;;
|
delete m_value;
|
||||||
m_next = ddl_nullptr;;
|
if(m_ref!=ddl_nullptr)
|
||||||
|
delete(m_ref);
|
||||||
|
if(m_next!=ddl_nullptr)
|
||||||
|
delete m_next;
|
||||||
}
|
}
|
||||||
|
|
||||||
DataArrayList::DataArrayList()
|
DataArrayList::DataArrayList()
|
||||||
: m_numItems( 0 )
|
: m_numItems( 0 )
|
||||||
, m_dataList( ddl_nullptr )
|
, m_dataList( ddl_nullptr )
|
||||||
, m_next( ddl_nullptr ) {
|
, m_next( ddl_nullptr )
|
||||||
|
, m_refs(ddl_nullptr)
|
||||||
|
, m_numRefs(0){
|
||||||
// empty
|
// empty
|
||||||
}
|
}
|
||||||
|
|
||||||
DataArrayList::~DataArrayList() {
|
DataArrayList::~DataArrayList() {
|
||||||
// empty
|
delete m_dataList;
|
||||||
|
if(m_next!=ddl_nullptr)
|
||||||
|
delete m_next;
|
||||||
|
if(m_refs!=ddl_nullptr)
|
||||||
|
delete m_refs;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t DataArrayList::size() {
|
size_t DataArrayList::size() {
|
||||||
|
|
|
@ -29,60 +29,6 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
BEGIN_ODDLPARSER_NS
|
BEGIN_ODDLPARSER_NS
|
||||||
|
|
||||||
StreamFormatterBase::StreamFormatterBase() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
StreamFormatterBase::~StreamFormatterBase() {
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
std::string StreamFormatterBase::format( const std::string &statement ) {
|
|
||||||
std::string tmp( statement );
|
|
||||||
return tmp;
|
|
||||||
}
|
|
||||||
|
|
||||||
IOStreamBase::IOStreamBase( StreamFormatterBase *formatter )
|
|
||||||
: m_formatter( formatter )
|
|
||||||
, m_file( ddl_nullptr ) {
|
|
||||||
if (ddl_nullptr == m_formatter) {
|
|
||||||
m_formatter = new StreamFormatterBase;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
IOStreamBase::~IOStreamBase() {
|
|
||||||
delete m_formatter;
|
|
||||||
m_formatter = ddl_nullptr;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IOStreamBase::open( const std::string &name ) {
|
|
||||||
m_file = ::fopen( name.c_str(), "a" );
|
|
||||||
if (m_file == ddl_nullptr) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool IOStreamBase::close() {
|
|
||||||
if (ddl_nullptr == m_file) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
::fclose( m_file );
|
|
||||||
m_file = ddl_nullptr;
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
size_t IOStreamBase::write( const std::string &statement ) {
|
|
||||||
if (ddl_nullptr == m_file) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
std::string formatStatement = m_formatter->format( statement );
|
|
||||||
return ::fwrite( formatStatement.c_str(), sizeof( char ), formatStatement.size(), m_file );
|
|
||||||
}
|
|
||||||
|
|
||||||
struct DDLNodeIterator {
|
struct DDLNodeIterator {
|
||||||
const DDLNode::DllNodeList &m_childs;
|
const DDLNode::DllNodeList &m_childs;
|
||||||
size_t m_idx;
|
size_t m_idx;
|
||||||
|
@ -280,7 +226,7 @@ bool OpenDDLExport::writeValueType( Value::ValueType type, size_t numItems, std:
|
||||||
statement += "[";
|
statement += "[";
|
||||||
char buffer[ 256 ];
|
char buffer[ 256 ];
|
||||||
::memset( buffer, '\0', 256 * sizeof( char ) );
|
::memset( buffer, '\0', 256 * sizeof( char ) );
|
||||||
sprintf( buffer, "%d", int(numItems) );
|
sprintf( buffer, "%d", static_cast<int>( numItems ) );
|
||||||
statement += buffer;
|
statement += buffer;
|
||||||
statement += "]";
|
statement += "]";
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,7 +36,7 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
BEGIN_ODDLPARSER_NS
|
BEGIN_ODDLPARSER_NS
|
||||||
|
|
||||||
static const char *Version = "0.3.0";
|
static const char *Version = "0.4.0";
|
||||||
|
|
||||||
namespace Grammar {
|
namespace Grammar {
|
||||||
static const char *OpenBracketToken = "{";
|
static const char *OpenBracketToken = "{";
|
||||||
|
@ -49,7 +49,7 @@ namespace Grammar {
|
||||||
static const char *BoolFalse = "false";
|
static const char *BoolFalse = "false";
|
||||||
static const char *CommaSeparator = ",";
|
static const char *CommaSeparator = ",";
|
||||||
|
|
||||||
static const char* PrimitiveTypeToken[ Value::ddl_types_max ] = {
|
static const char *PrimitiveTypeToken[ Value::ddl_types_max ] = {
|
||||||
"bool",
|
"bool",
|
||||||
"int8",
|
"int8",
|
||||||
"int16",
|
"int16",
|
||||||
|
@ -74,8 +74,8 @@ const char *getTypeToken( Value::ValueType type ) {
|
||||||
static void logInvalidTokenError( char *in, const std::string &exp, OpenDDLParser::logCallback callback ) {
|
static void logInvalidTokenError( char *in, const std::string &exp, OpenDDLParser::logCallback callback ) {
|
||||||
std::stringstream stream;
|
std::stringstream stream;
|
||||||
stream << "Invalid token \"" << *in << "\"" << " expected \"" << exp << "\"" << std::endl;
|
stream << "Invalid token \"" << *in << "\"" << " expected \"" << exp << "\"" << std::endl;
|
||||||
std::string full(in);
|
std::string full( in );
|
||||||
std::string part(full.substr(0,50));
|
std::string part( full.substr( 0, 50 ) );
|
||||||
stream << part;
|
stream << part;
|
||||||
callback( ddl_error_msg, stream.str() );
|
callback( ddl_error_msg, stream.str() );
|
||||||
}
|
}
|
||||||
|
@ -85,6 +85,7 @@ static bool isIntegerType( Value::ValueType integerType ) {
|
||||||
integerType != Value::ddl_int32 && integerType != Value::ddl_int64 ) {
|
integerType != Value::ddl_int32 && integerType != Value::ddl_int64 ) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -105,7 +106,7 @@ static DDLNode *createDDLNode( Text *id, OpenDDLParser *parser ) {
|
||||||
const std::string type( id->m_buffer );
|
const std::string type( id->m_buffer );
|
||||||
DDLNode *parent( parser->top() );
|
DDLNode *parent( parser->top() );
|
||||||
DDLNode *node = DDLNode::create( type, "", parent );
|
DDLNode *node = DDLNode::create( type, "", parent );
|
||||||
|
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -193,10 +194,11 @@ size_t OpenDDLParser::getBufferSize() const {
|
||||||
void OpenDDLParser::clear() {
|
void OpenDDLParser::clear() {
|
||||||
m_buffer.resize( 0 );
|
m_buffer.resize( 0 );
|
||||||
if( ddl_nullptr != m_context ) {
|
if( ddl_nullptr != m_context ) {
|
||||||
m_context->m_root = ddl_nullptr;
|
delete m_context;
|
||||||
|
m_context=ddl_nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
DDLNode::releaseNodes();
|
// DDLNode::releaseNodes();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool OpenDDLParser::parse() {
|
bool OpenDDLParser::parse() {
|
||||||
|
@ -212,11 +214,11 @@ bool OpenDDLParser::parse() {
|
||||||
|
|
||||||
// do the main parsing
|
// do the main parsing
|
||||||
char *current( &m_buffer[ 0 ] );
|
char *current( &m_buffer[ 0 ] );
|
||||||
char *end( &m_buffer[ m_buffer.size() - 1 ] + 1 );
|
char *end( &m_buffer[m_buffer.size() - 1 ] + 1 );
|
||||||
size_t pos( current - &m_buffer[ 0 ] );
|
size_t pos( current - &m_buffer[ 0 ] );
|
||||||
while( pos < m_buffer.size() ) {
|
while( pos < m_buffer.size() ) {
|
||||||
current = parseNextNode( current, end );
|
current = parseNextNode( current, end );
|
||||||
if(current==ddl_nullptr) {
|
if ( current == ddl_nullptr ) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
pos = current - &m_buffer[ 0 ];
|
pos = current - &m_buffer[ 0 ];
|
||||||
|
@ -245,7 +247,7 @@ static void dumpId( Identifier *id ) {
|
||||||
if( ddl_nullptr != id ) {
|
if( ddl_nullptr != id ) {
|
||||||
if ( ddl_nullptr != id->m_text.m_buffer ) {
|
if ( ddl_nullptr != id->m_text.m_buffer ) {
|
||||||
std::cout << id->m_text.m_buffer << std::endl;
|
std::cout << id->m_text.m_buffer << std::endl;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -271,14 +273,17 @@ char *OpenDDLParser::parseHeader( char *in, char *end ) {
|
||||||
} else {
|
} else {
|
||||||
std::cerr << "nullptr returned by creating DDLNode." << std::endl;
|
std::cerr << "nullptr returned by creating DDLNode." << std::endl;
|
||||||
}
|
}
|
||||||
|
delete id;
|
||||||
|
|
||||||
Name *name(ddl_nullptr);
|
Name *name(ddl_nullptr);
|
||||||
in = OpenDDLParser::parseName(in, end, &name);
|
in = OpenDDLParser::parseName(in, end, &name);
|
||||||
if( ddl_nullptr != name && ddl_nullptr != node ) {
|
if( ddl_nullptr != name && ddl_nullptr != node ) {
|
||||||
const std::string nodeName( name->m_id->m_buffer );
|
const std::string nodeName( name->m_id->m_buffer );
|
||||||
node->setName( nodeName );
|
node->setName( nodeName );
|
||||||
|
delete name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
Property *first(ddl_nullptr);
|
Property *first(ddl_nullptr);
|
||||||
in = lookForNextToken(in, end);
|
in = lookForNextToken(in, end);
|
||||||
if (*in == Grammar::OpenPropertyToken[0]) {
|
if (*in == Grammar::OpenPropertyToken[0]) {
|
||||||
|
@ -303,7 +308,7 @@ char *OpenDDLParser::parseHeader( char *in, char *end ) {
|
||||||
prev = prop;
|
prev = prop;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
in++;
|
++in;
|
||||||
}
|
}
|
||||||
|
|
||||||
// set the properties
|
// set the properties
|
||||||
|
@ -322,17 +327,17 @@ char *OpenDDLParser::parseStructure( char *in, char *end ) {
|
||||||
|
|
||||||
bool error( false );
|
bool error( false );
|
||||||
in = lookForNextToken( in, end );
|
in = lookForNextToken( in, end );
|
||||||
if( *in == '{' ) {
|
if( *in == *Grammar::OpenBracketToken) {
|
||||||
// loop over all children ( data and nodes )
|
// loop over all children ( data and nodes )
|
||||||
do {
|
do {
|
||||||
in = parseStructureBody( in, end, error );
|
in = parseStructureBody( in, end, error );
|
||||||
if(in == ddl_nullptr){
|
if(in == ddl_nullptr){
|
||||||
return ddl_nullptr;
|
return ddl_nullptr;
|
||||||
}
|
}
|
||||||
} while ( *in != '}' );
|
} while ( *in != *Grammar::CloseBracketToken);
|
||||||
in++;
|
++in;
|
||||||
} else {
|
} else {
|
||||||
in++;
|
++in;
|
||||||
logInvalidTokenError( in, std::string( Grammar::OpenBracketToken ), m_logCallback );
|
logInvalidTokenError( in, std::string( Grammar::OpenBracketToken ), m_logCallback );
|
||||||
error = true;
|
error = true;
|
||||||
return ddl_nullptr;
|
return ddl_nullptr;
|
||||||
|
@ -373,7 +378,7 @@ static void setNodeDataArrayList( DDLNode *currentNode, DataArrayList *dtArrayLi
|
||||||
|
|
||||||
char *OpenDDLParser::parseStructureBody( char *in, char *end, bool &error ) {
|
char *OpenDDLParser::parseStructureBody( char *in, char *end, bool &error ) {
|
||||||
if( !isNumeric( *in ) && !isCharacter( *in ) ) {
|
if( !isNumeric( *in ) && !isCharacter( *in ) ) {
|
||||||
in++;
|
++in;
|
||||||
}
|
}
|
||||||
|
|
||||||
in = lookForNextToken( in, end );
|
in = lookForNextToken( in, end );
|
||||||
|
@ -431,7 +436,6 @@ DDLNode *OpenDDLParser::popNode() {
|
||||||
|
|
||||||
DDLNode *topNode( top() );
|
DDLNode *topNode( top() );
|
||||||
m_stack.pop_back();
|
m_stack.pop_back();
|
||||||
|
|
||||||
return topNode;
|
return topNode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -467,7 +471,14 @@ void OpenDDLParser::normalizeBuffer( std::vector<char> &buffer) {
|
||||||
for( size_t readIdx = 0; readIdx<len; ++readIdx ) {
|
for( size_t readIdx = 0; readIdx<len; ++readIdx ) {
|
||||||
char *c( &buffer[readIdx] );
|
char *c( &buffer[readIdx] );
|
||||||
// check for a comment
|
// check for a comment
|
||||||
if( !isComment<char>( c, end ) && !isNewLine( *c ) ) {
|
if (isCommentOpenTag(c, end)) {
|
||||||
|
++readIdx;
|
||||||
|
while (!isCommentCloseTag(&buffer[readIdx], end)) {
|
||||||
|
++readIdx;
|
||||||
|
}
|
||||||
|
++readIdx;
|
||||||
|
++readIdx;
|
||||||
|
} else if( !isComment<char>( c, end ) && !isNewLine( *c ) ) {
|
||||||
newBuffer.push_back( buffer[ readIdx ] );
|
newBuffer.push_back( buffer[ readIdx ] );
|
||||||
} else {
|
} else {
|
||||||
if( isComment<char>( c, end ) ) {
|
if( isComment<char>( c, end ) ) {
|
||||||
|
@ -529,14 +540,17 @@ char *OpenDDLParser::parseIdentifier( char *in, char *end, Text **id ) {
|
||||||
// get size of id
|
// get size of id
|
||||||
size_t idLen( 0 );
|
size_t idLen( 0 );
|
||||||
char *start( in );
|
char *start( in );
|
||||||
while( !isSeparator( *in ) && !isNewLine( *in ) && ( in != end ) && *in != Grammar::OpenPropertyToken[ 0 ] && *in != Grammar::ClosePropertyToken[ 0 ] && *in != '$' ) {
|
while( !isSeparator( *in ) &&
|
||||||
|
!isNewLine( *in ) && ( in != end ) &&
|
||||||
|
*in != Grammar::OpenPropertyToken[ 0 ] &&
|
||||||
|
*in != Grammar::ClosePropertyToken[ 0 ] &&
|
||||||
|
*in != '$' ) {
|
||||||
++in;
|
++in;
|
||||||
++idLen;
|
++idLen;
|
||||||
}
|
}
|
||||||
|
|
||||||
const size_t len( idLen );
|
const size_t len( idLen );
|
||||||
Text *newId = new Text( start, len );
|
*id = new Text( start, len );
|
||||||
*id = newId;
|
|
||||||
|
|
||||||
return in;
|
return in;
|
||||||
}
|
}
|
||||||
|
@ -552,7 +566,7 @@ char *OpenDDLParser::parsePrimitiveDataType( char *in, char *end, Value::ValueTy
|
||||||
for( unsigned int i = 0; i < Value::ddl_types_max; i++ ) {
|
for( unsigned int i = 0; i < Value::ddl_types_max; i++ ) {
|
||||||
prim_len = strlen( Grammar::PrimitiveTypeToken[ i ] );
|
prim_len = strlen( Grammar::PrimitiveTypeToken[ i ] );
|
||||||
if( 0 == strncmp( in, Grammar::PrimitiveTypeToken[ i ], prim_len ) ) {
|
if( 0 == strncmp( in, Grammar::PrimitiveTypeToken[ i ], prim_len ) ) {
|
||||||
type = ( Value::ValueType ) i;
|
type = static_cast<Value::ValueType>( i );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -567,14 +581,14 @@ char *OpenDDLParser::parsePrimitiveDataType( char *in, char *end, Value::ValueTy
|
||||||
bool ok( true );
|
bool ok( true );
|
||||||
if( *in == Grammar::OpenArrayToken[ 0 ] ) {
|
if( *in == Grammar::OpenArrayToken[ 0 ] ) {
|
||||||
ok = false;
|
ok = false;
|
||||||
in++;
|
++in;
|
||||||
char *start( in );
|
char *start( in );
|
||||||
while ( in != end ) {
|
while ( in != end ) {
|
||||||
in++;
|
++in;
|
||||||
if( *in == Grammar::CloseArrayToken[ 0 ] ) {
|
if( *in == Grammar::CloseArrayToken[ 0 ] ) {
|
||||||
len = ::atoi( start );
|
len = ::atoi( start );
|
||||||
ok = true;
|
ok = true;
|
||||||
in++;
|
++in;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -623,10 +637,10 @@ char *OpenDDLParser::parseBooleanLiteral( char *in, char *end, Value **boolean )
|
||||||
char *start( in );
|
char *start( in );
|
||||||
size_t len( 0 );
|
size_t len( 0 );
|
||||||
while( !isSeparator( *in ) && in != end ) {
|
while( !isSeparator( *in ) && in != end ) {
|
||||||
in++;
|
++in;
|
||||||
len++;
|
++len;
|
||||||
}
|
}
|
||||||
len++;
|
++len;
|
||||||
int res = ::strncmp( Grammar::BoolTrue, start, strlen( Grammar::BoolTrue ) );
|
int res = ::strncmp( Grammar::BoolTrue, start, strlen( Grammar::BoolTrue ) );
|
||||||
if( 0 != res ) {
|
if( 0 != res ) {
|
||||||
res = ::strncmp( Grammar::BoolFalse, start, strlen( Grammar::BoolFalse ) );
|
res = ::strncmp( Grammar::BoolFalse, start, strlen( Grammar::BoolFalse ) );
|
||||||
|
@ -657,7 +671,7 @@ char *OpenDDLParser::parseIntegerLiteral( char *in, char *end, Value **integer,
|
||||||
in = lookForNextToken( in, end );
|
in = lookForNextToken( in, end );
|
||||||
char *start( in );
|
char *start( in );
|
||||||
while( !isSeparator( *in ) && in != end ) {
|
while( !isSeparator( *in ) && in != end ) {
|
||||||
in++;
|
++in;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( isNumeric( *start ) ) {
|
if( isNumeric( *start ) ) {
|
||||||
|
@ -671,29 +685,29 @@ char *OpenDDLParser::parseIntegerLiteral( char *in, char *end, Value **integer,
|
||||||
*integer = ValueAllocator::allocPrimData( integerType );
|
*integer = ValueAllocator::allocPrimData( integerType );
|
||||||
switch( integerType ) {
|
switch( integerType ) {
|
||||||
case Value::ddl_int8:
|
case Value::ddl_int8:
|
||||||
( *integer )->setInt8( (int8) value );
|
( *integer )->setInt8( (int8) value );
|
||||||
break;
|
break;
|
||||||
case Value::ddl_int16:
|
case Value::ddl_int16:
|
||||||
( *integer )->setInt16( ( int16 ) value );
|
( *integer )->setInt16( ( int16 ) value );
|
||||||
break;
|
break;
|
||||||
case Value::ddl_int32:
|
case Value::ddl_int32:
|
||||||
( *integer )->setInt32( ( int32 ) value );
|
( *integer )->setInt32( ( int32 ) value );
|
||||||
break;
|
break;
|
||||||
case Value::ddl_int64:
|
case Value::ddl_int64:
|
||||||
( *integer )->setInt64( ( int64 ) value );
|
( *integer )->setInt64( ( int64 ) value );
|
||||||
break;
|
break;
|
||||||
case Value::ddl_unsigned_int8:
|
case Value::ddl_unsigned_int8:
|
||||||
( *integer )->setUnsignedInt8( (uint8) uvalue );
|
( *integer )->setUnsignedInt8( (uint8) uvalue );
|
||||||
break;
|
break;
|
||||||
case Value::ddl_unsigned_int16:
|
case Value::ddl_unsigned_int16:
|
||||||
( *integer )->setUnsignedInt16( ( uint16 ) uvalue );
|
( *integer )->setUnsignedInt16( ( uint16 ) uvalue );
|
||||||
break;
|
break;
|
||||||
case Value::ddl_unsigned_int32:
|
case Value::ddl_unsigned_int32:
|
||||||
( *integer )->setUnsignedInt32( ( uint32 ) uvalue );
|
( *integer )->setUnsignedInt32( ( uint32 ) uvalue );
|
||||||
break;
|
break;
|
||||||
case Value::ddl_unsigned_int64:
|
case Value::ddl_unsigned_int64:
|
||||||
( *integer )->setUnsignedInt64( ( uint64 ) uvalue );
|
( *integer )->setUnsignedInt64( ( uint64 ) uvalue );
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -711,7 +725,7 @@ char *OpenDDLParser::parseFloatingLiteral( char *in, char *end, Value **floating
|
||||||
in = lookForNextToken( in, end );
|
in = lookForNextToken( in, end );
|
||||||
char *start( in );
|
char *start( in );
|
||||||
while( !isSeparator( *in ) && in != end ) {
|
while( !isSeparator( *in ) && in != end ) {
|
||||||
in++;
|
++in;
|
||||||
}
|
}
|
||||||
|
|
||||||
// parse the float value
|
// parse the float value
|
||||||
|
@ -732,8 +746,7 @@ char *OpenDDLParser::parseFloatingLiteral( char *in, char *end, Value **floating
|
||||||
}
|
}
|
||||||
|
|
||||||
if( ok ) {
|
if( ok ) {
|
||||||
if(floatType == Value::ddl_double)
|
if ( floatType == Value::ddl_double ) {
|
||||||
{
|
|
||||||
const double value( atof( start ) );
|
const double value( atof( start ) );
|
||||||
*floating = ValueAllocator::allocPrimData( Value::ddl_double );
|
*floating = ValueAllocator::allocPrimData( Value::ddl_double );
|
||||||
( *floating )->setDouble( value );
|
( *floating )->setDouble( value );
|
||||||
|
@ -757,17 +770,17 @@ char *OpenDDLParser::parseStringLiteral( char *in, char *end, Value **stringData
|
||||||
size_t len( 0 );
|
size_t len( 0 );
|
||||||
char *start( in );
|
char *start( in );
|
||||||
if( *start == '\"' ) {
|
if( *start == '\"' ) {
|
||||||
start++;
|
++start;
|
||||||
in++;
|
++in;
|
||||||
while( *in != '\"' && in != end ) {
|
while( *in != '\"' && in != end ) {
|
||||||
in++;
|
++in;
|
||||||
len++;
|
++len;
|
||||||
}
|
}
|
||||||
|
|
||||||
*stringData = ValueAllocator::allocPrimData( Value::ddl_string, len );
|
*stringData = ValueAllocator::allocPrimData( Value::ddl_string, len );
|
||||||
::strncpy( ( char* ) ( *stringData )->m_data, start, len );
|
::strncpy( ( char* ) ( *stringData )->m_data, start, len );
|
||||||
( *stringData )->m_data[len] = '\0';
|
( *stringData )->m_data[len] = '\0';
|
||||||
in++;
|
++in;
|
||||||
}
|
}
|
||||||
|
|
||||||
return in;
|
return in;
|
||||||
|
@ -791,12 +804,12 @@ char *OpenDDLParser::parseHexaLiteral( char *in, char *end, Value **data ) {
|
||||||
return in;
|
return in;
|
||||||
}
|
}
|
||||||
|
|
||||||
in++;
|
++in;
|
||||||
if( *in != 'x' && *in != 'X' ) {
|
if( *in != 'x' && *in != 'X' ) {
|
||||||
return in;
|
return in;
|
||||||
}
|
}
|
||||||
|
|
||||||
in++;
|
++in;
|
||||||
bool ok( true );
|
bool ok( true );
|
||||||
char *start( in );
|
char *start( in );
|
||||||
int pos( 0 );
|
int pos( 0 );
|
||||||
|
@ -805,8 +818,8 @@ char *OpenDDLParser::parseHexaLiteral( char *in, char *end, Value **data ) {
|
||||||
ok = false;
|
ok = false;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
pos++;
|
++pos;
|
||||||
in++;
|
++in;
|
||||||
}
|
}
|
||||||
|
|
||||||
if( !ok ) {
|
if( !ok ) {
|
||||||
|
@ -816,9 +829,9 @@ char *OpenDDLParser::parseHexaLiteral( char *in, char *end, Value **data ) {
|
||||||
int value( 0 );
|
int value( 0 );
|
||||||
while( pos > 0 ) {
|
while( pos > 0 ) {
|
||||||
int v = hex2Decimal( *start );
|
int v = hex2Decimal( *start );
|
||||||
pos--;
|
--pos;
|
||||||
value = ( value << 4 ) | v;
|
value = ( value << 4 ) | v;
|
||||||
start++;
|
++start;
|
||||||
}
|
}
|
||||||
|
|
||||||
*data = ValueAllocator::allocPrimData( Value::ddl_unsigned_int64 );
|
*data = ValueAllocator::allocPrimData( Value::ddl_unsigned_int64 );
|
||||||
|
@ -841,7 +854,7 @@ char *OpenDDLParser::parseProperty( char *in, char *end, Property **prop ) {
|
||||||
if( ddl_nullptr != id ) {
|
if( ddl_nullptr != id ) {
|
||||||
in = lookForNextToken( in, end );
|
in = lookForNextToken( in, end );
|
||||||
if( *in == '=' ) {
|
if( *in == '=' ) {
|
||||||
in++;
|
++in;
|
||||||
in = getNextToken( in, end );
|
in = getNextToken( in, end );
|
||||||
Value *primData( ddl_nullptr );
|
Value *primData( ddl_nullptr );
|
||||||
if( isInteger( in, end ) ) {
|
if( isInteger( in, end ) ) {
|
||||||
|
@ -862,6 +875,8 @@ char *OpenDDLParser::parseProperty( char *in, char *end, Property **prop ) {
|
||||||
( *prop )->m_ref = ref;
|
( *prop )->m_ref = ref;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
delete id;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -878,7 +893,7 @@ char *OpenDDLParser::parseDataList( char *in, char *end, Value::ValueType type,
|
||||||
|
|
||||||
in = lookForNextToken( in, end );
|
in = lookForNextToken( in, end );
|
||||||
if( *in == '{' ) {
|
if( *in == '{' ) {
|
||||||
in++;
|
++in;
|
||||||
Value *current( ddl_nullptr ), *prev( ddl_nullptr );
|
Value *current( ddl_nullptr ), *prev( ddl_nullptr );
|
||||||
while( '}' != *in ) {
|
while( '}' != *in ) {
|
||||||
current = ddl_nullptr;
|
current = ddl_nullptr;
|
||||||
|
@ -934,7 +949,7 @@ char *OpenDDLParser::parseDataList( char *in, char *end, Value::ValueType type,
|
||||||
prev->setNext( current );
|
prev->setNext( current );
|
||||||
prev = current;
|
prev = current;
|
||||||
}
|
}
|
||||||
numValues++;
|
++numValues;
|
||||||
}
|
}
|
||||||
|
|
||||||
in = getNextSeparator( in, end );
|
in = getNextSeparator( in, end );
|
||||||
|
@ -942,7 +957,7 @@ char *OpenDDLParser::parseDataList( char *in, char *end, Value::ValueType type,
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
in++;
|
++in;
|
||||||
}
|
}
|
||||||
|
|
||||||
return in;
|
return in;
|
||||||
|
@ -972,7 +987,7 @@ char *OpenDDLParser::parseDataArrayList( char *in, char *end,Value::ValueType ty
|
||||||
|
|
||||||
in = lookForNextToken( in, end );
|
in = lookForNextToken( in, end );
|
||||||
if( *in == Grammar::OpenBracketToken[ 0 ] ) {
|
if( *in == Grammar::OpenBracketToken[ 0 ] ) {
|
||||||
in++;
|
++in;
|
||||||
Value *currentValue( ddl_nullptr );
|
Value *currentValue( ddl_nullptr );
|
||||||
Reference *refs( ddl_nullptr );
|
Reference *refs( ddl_nullptr );
|
||||||
DataArrayList *prev( ddl_nullptr ), *currentDataList( ddl_nullptr );
|
DataArrayList *prev( ddl_nullptr ), *currentDataList( ddl_nullptr );
|
||||||
|
@ -995,7 +1010,7 @@ char *OpenDDLParser::parseDataArrayList( char *in, char *end,Value::ValueType ty
|
||||||
}
|
}
|
||||||
} while( Grammar::CommaSeparator[ 0 ] == *in && in != end );
|
} while( Grammar::CommaSeparator[ 0 ] == *in && in != end );
|
||||||
in = lookForNextToken( in, end );
|
in = lookForNextToken( in, end );
|
||||||
in++;
|
++in;
|
||||||
}
|
}
|
||||||
|
|
||||||
return in;
|
return in;
|
||||||
|
|
|
@ -0,0 +1,96 @@
|
||||||
|
/*-----------------------------------------------------------------------------------------------
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2014-2015 Kim Kulling
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
|
the Software without restriction, including without limitation the rights to
|
||||||
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||||
|
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
|
subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
|
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||||
|
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||||
|
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
-----------------------------------------------------------------------------------------------*/
|
||||||
|
#include <openddlparser/OpenDDLStream.h>
|
||||||
|
|
||||||
|
BEGIN_ODDLPARSER_NS
|
||||||
|
|
||||||
|
StreamFormatterBase::StreamFormatterBase() {
|
||||||
|
// empty
|
||||||
|
}
|
||||||
|
|
||||||
|
StreamFormatterBase::~StreamFormatterBase() {
|
||||||
|
// empty
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string StreamFormatterBase::format(const std::string &statement) {
|
||||||
|
std::string tmp(statement);
|
||||||
|
return tmp;
|
||||||
|
}
|
||||||
|
|
||||||
|
IOStreamBase::IOStreamBase(StreamFormatterBase *formatter)
|
||||||
|
: m_formatter(formatter)
|
||||||
|
, m_file(ddl_nullptr) {
|
||||||
|
if (ddl_nullptr == m_formatter) {
|
||||||
|
m_formatter = new StreamFormatterBase;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
IOStreamBase::~IOStreamBase() {
|
||||||
|
delete m_formatter;
|
||||||
|
m_formatter = ddl_nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IOStreamBase::open(const std::string &name) {
|
||||||
|
m_file = ::fopen(name.c_str(), "a");
|
||||||
|
if (m_file == ddl_nullptr) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IOStreamBase::close() {
|
||||||
|
if (ddl_nullptr == m_file) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
::fclose(m_file);
|
||||||
|
m_file = ddl_nullptr;
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool IOStreamBase::isOpen() const {
|
||||||
|
return ( ddl_nullptr != m_file );
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t IOStreamBase::read( size_t sizeToRead, std::string &statement ) {
|
||||||
|
if (ddl_nullptr == m_file) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
statement.resize(sizeToRead);
|
||||||
|
const size_t readBytes = ::fread( &statement[0], 1, sizeToRead, m_file );
|
||||||
|
|
||||||
|
return readBytes;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t IOStreamBase::write(const std::string &statement) {
|
||||||
|
if (ddl_nullptr == m_file) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
std::string formatStatement = m_formatter->format(statement);
|
||||||
|
return ::fwrite(formatStatement.c_str(), sizeof(char), formatStatement.size(), m_file);
|
||||||
|
}
|
||||||
|
|
||||||
|
END_ODDLPARSER_NS
|
|
@ -110,7 +110,17 @@ Value::Value( ValueType type )
|
||||||
}
|
}
|
||||||
|
|
||||||
Value::~Value() {
|
Value::~Value() {
|
||||||
// empty
|
if(m_data!=ddl_nullptr) {
|
||||||
|
if (m_type == ddl_ref ) {
|
||||||
|
Reference *tmp = (Reference *) m_data;
|
||||||
|
if (tmp != ddl_nullptr)
|
||||||
|
delete tmp;
|
||||||
|
}else
|
||||||
|
delete[] m_data;
|
||||||
|
|
||||||
|
}
|
||||||
|
if(m_next!=ddl_nullptr)
|
||||||
|
delete m_next;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Value::setBool( bool value ) {
|
void Value::setBool( bool value ) {
|
||||||
|
@ -273,13 +283,7 @@ void Value::setRef( Reference *ref ) {
|
||||||
delete [] m_data;
|
delete [] m_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
m_data = new unsigned char[ sizeof( Reference ) ];
|
m_data = (unsigned char*) new Reference(*ref);
|
||||||
Reference *myRef = ( Reference * ) m_data;
|
|
||||||
myRef->m_numRefs = ref->m_numRefs;
|
|
||||||
myRef->m_referencedName = new Name *[ myRef->m_numRefs ];
|
|
||||||
for ( size_t i = 0; i < myRef->m_numRefs; i++ ) {
|
|
||||||
myRef->m_referencedName[ i ] = new Name( ref->m_referencedName[ i ]->m_type, ref->m_referencedName[ i ]->m_id );
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -290,7 +294,7 @@ Reference *Value::getRef() const {
|
||||||
return (Reference*) m_data;
|
return (Reference*) m_data;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Value::dump() {
|
void Value::dump( IOStreamBase &stream ) {
|
||||||
switch( m_type ) {
|
switch( m_type ) {
|
||||||
case ddl_none:
|
case ddl_none:
|
||||||
std::cout << "None" << std::endl;
|
std::cout << "None" << std::endl;
|
||||||
|
@ -350,7 +354,7 @@ Value *Value::getNext() const {
|
||||||
return m_next;
|
return m_next;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t Value::size(){
|
size_t Value::size() const{
|
||||||
size_t result=1;
|
size_t result=1;
|
||||||
Value *n=m_next;
|
Value *n=m_next;
|
||||||
while( n!=ddl_nullptr) {
|
while( n!=ddl_nullptr) {
|
||||||
|
@ -366,7 +370,6 @@ Value *ValueAllocator::allocPrimData( Value::ValueType type, size_t len ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
Value *data = new Value( type );
|
Value *data = new Value( type );
|
||||||
data->m_type = type;
|
|
||||||
switch( type ) {
|
switch( type ) {
|
||||||
case Value::ddl_bool:
|
case Value::ddl_bool:
|
||||||
data->m_size = sizeof( bool );
|
data->m_size = sizeof( bool );
|
||||||
|
@ -405,10 +408,10 @@ Value *ValueAllocator::allocPrimData( Value::ValueType type, size_t len ) {
|
||||||
data->m_size = sizeof( double );
|
data->m_size = sizeof( double );
|
||||||
break;
|
break;
|
||||||
case Value::ddl_string:
|
case Value::ddl_string:
|
||||||
data->m_size = sizeof( char );
|
data->m_size = sizeof( char )*(len+1);
|
||||||
break;
|
break;
|
||||||
case Value::ddl_ref:
|
case Value::ddl_ref:
|
||||||
data->m_size = sizeof( char );
|
data->m_size = 0;
|
||||||
break;
|
break;
|
||||||
case Value::ddl_none:
|
case Value::ddl_none:
|
||||||
case Value::ddl_types_max:
|
case Value::ddl_types_max:
|
||||||
|
@ -417,12 +420,8 @@ Value *ValueAllocator::allocPrimData( Value::ValueType type, size_t len ) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if( data->m_size ) {
|
if( data->m_size ) {
|
||||||
size_t len1( len );
|
|
||||||
if( Value::ddl_string == type ) {
|
|
||||||
len1++;
|
|
||||||
}
|
|
||||||
data->m_size *= len1;
|
|
||||||
data->m_data = new unsigned char[ data->m_size ];
|
data->m_data = new unsigned char[ data->m_size ];
|
||||||
|
::memset(data->m_data,0,data->m_size);
|
||||||
}
|
}
|
||||||
|
|
||||||
return data;
|
return data;
|
||||||
|
|
|
@ -29,6 +29,8 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
BEGIN_ODDLPARSER_NS
|
BEGIN_ODDLPARSER_NS
|
||||||
|
|
||||||
|
// Forward declarations
|
||||||
|
class IOStreamBase;
|
||||||
class Value;
|
class Value;
|
||||||
class OpenDDLParser;
|
class OpenDDLParser;
|
||||||
|
|
||||||
|
@ -53,6 +55,9 @@ public:
|
||||||
/// @brief The child-node-list type.
|
/// @brief The child-node-list type.
|
||||||
typedef std::vector<DDLNode*> DllNodeList;
|
typedef std::vector<DDLNode*> DllNodeList;
|
||||||
|
|
||||||
|
/// @brief The child-node-list iterator.
|
||||||
|
typedef std::vector<DDLNode*>::iterator DDLNodeIt;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
/// @brief The class destructor.
|
/// @brief The class destructor.
|
||||||
~DDLNode();
|
~DDLNode();
|
||||||
|
@ -81,7 +86,7 @@ public:
|
||||||
const std::string &getType() const;
|
const std::string &getType() const;
|
||||||
|
|
||||||
/// Set the name of the DDLNode instance.
|
/// Set the name of the DDLNode instance.
|
||||||
/// @param type [in] The name.
|
/// @param name [in] The name.
|
||||||
void setName( const std::string &name );
|
void setName( const std::string &name );
|
||||||
|
|
||||||
/// @brief Returns the name of the DDLNode instance.
|
/// @brief Returns the name of the DDLNode instance.
|
||||||
|
@ -89,7 +94,7 @@ public:
|
||||||
const std::string &getName() const;
|
const std::string &getName() const;
|
||||||
|
|
||||||
/// @brief Set a new property set.
|
/// @brief Set a new property set.
|
||||||
/// @param prop [in] The first element of the property set.
|
/// @param prop [in] The first element of the property set.
|
||||||
void setProperties( Property *prop );
|
void setProperties( Property *prop );
|
||||||
|
|
||||||
/// @brief Returns the first element of the assigned property set.
|
/// @brief Returns the first element of the assigned property set.
|
||||||
|
@ -97,7 +102,7 @@ public:
|
||||||
Property *getProperties() const;
|
Property *getProperties() const;
|
||||||
|
|
||||||
/// @brief Looks for a given property.
|
/// @brief Looks for a given property.
|
||||||
/// @param name [in] The name for the property to look for.
|
/// @param name [in] The name for the property to look for.
|
||||||
/// @return true, if a corresponding property is assigned to the node, false if not.
|
/// @return true, if a corresponding property is assigned to the node, false if not.
|
||||||
bool hasProperty( const std::string &name );
|
bool hasProperty( const std::string &name );
|
||||||
|
|
||||||
|
@ -106,12 +111,12 @@ public:
|
||||||
bool hasProperties() const;
|
bool hasProperties() const;
|
||||||
|
|
||||||
/// @brief Search for a given property and returns it. Will return ddl_nullptr if no property was found.
|
/// @brief Search for a given property and returns it. Will return ddl_nullptr if no property was found.
|
||||||
/// @param name [in] The name for the property to look for.
|
/// @param name [in] The name for the property to look for.
|
||||||
/// @return The property or ddl_nullptr if no property was found.
|
/// @return The property or ddl_nullptr if no property was found.
|
||||||
Property *findPropertyByName( const std::string &name );
|
Property *findPropertyByName( const std::string &name );
|
||||||
|
|
||||||
/// @brief Set a new value set.
|
/// @brief Set a new value set.
|
||||||
/// @param val [in] The first value instance of the value set.
|
/// @param val [in] The first value instance of the value set.
|
||||||
void setValue( Value *val );
|
void setValue( Value *val );
|
||||||
|
|
||||||
/// @brief Returns the first element of the assigned value set.
|
/// @brief Returns the first element of the assigned value set.
|
||||||
|
@ -119,7 +124,7 @@ public:
|
||||||
Value *getValue() const;
|
Value *getValue() const;
|
||||||
|
|
||||||
/// @brief Set a new DataArrayList.
|
/// @brief Set a new DataArrayList.
|
||||||
/// @param val [in] The DataArrayList instance.
|
/// @param dtArrayList [in] The DataArrayList instance.
|
||||||
void setDataArrayList( DataArrayList *dtArrayList );
|
void setDataArrayList( DataArrayList *dtArrayList );
|
||||||
|
|
||||||
/// @brief Returns the DataArrayList.
|
/// @brief Returns the DataArrayList.
|
||||||
|
@ -127,17 +132,21 @@ public:
|
||||||
DataArrayList *getDataArrayList() const;
|
DataArrayList *getDataArrayList() const;
|
||||||
|
|
||||||
/// @brief Set a new Reference set.
|
/// @brief Set a new Reference set.
|
||||||
/// @param val [in] The first value instance of the Reference set.
|
/// @param refs [in] The first value instance of the Reference set.
|
||||||
void setReferences( Reference *refs );
|
void setReferences( Reference *refs );
|
||||||
|
|
||||||
/// @brief Returns the first element of the assigned Reference set.
|
/// @brief Returns the first element of the assigned Reference set.
|
||||||
/// @return The first property of the assigned Reference set.
|
/// @return The first property of the assigned Reference set.
|
||||||
Reference *getReferences() const;
|
Reference *getReferences() const;
|
||||||
|
|
||||||
|
/// @brief Will dump the node into the stream.
|
||||||
|
/// @param stream [in] The stream to write to.
|
||||||
|
void dump(IOStreamBase &stream);
|
||||||
|
|
||||||
/// @brief The creation method.
|
/// @brief The creation method.
|
||||||
/// @param type [in] The DDLNode type.
|
/// @param type [in] The DDLNode type.
|
||||||
/// @param name [in] The name for the new DDLNode instance.
|
/// @param name [in] The name for the new DDLNode instance.
|
||||||
/// @param parent [in] The parent node instance or ddl_nullptr if no parent node is there.
|
/// @param parent [in] The parent node instance or ddl_nullptr if no parent node is there.
|
||||||
/// @return The new created node instance.
|
/// @return The new created node instance.
|
||||||
static DDLNode *create( const std::string &type, const std::string &name, DDLNode *parent = ddl_nullptr );
|
static DDLNode *create( const std::string &type, const std::string &name, DDLNode *parent = ddl_nullptr );
|
||||||
|
|
||||||
|
|
|
@ -148,12 +148,12 @@ struct DLL_ODDLPARSER_EXPORT Name {
|
||||||
/// @param type [in] The name type.
|
/// @param type [in] The name type.
|
||||||
/// @param id [in] The id.
|
/// @param id [in] The id.
|
||||||
Name( NameType type, Text *id );
|
Name( NameType type, Text *id );
|
||||||
|
Name( const Name &name );
|
||||||
/// @brief The destructor.
|
/// @brief The destructor.
|
||||||
~Name();
|
~Name();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Name( const Name & ) ddl_no_copy;
|
|
||||||
Name &operator = ( const Name& ) ddl_no_copy;
|
Name &operator = ( const Name& ) ddl_no_copy;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -164,7 +164,7 @@ struct DLL_ODDLPARSER_EXPORT Reference {
|
||||||
|
|
||||||
/// @brief The default constructor.
|
/// @brief The default constructor.
|
||||||
Reference();
|
Reference();
|
||||||
|
Reference( const Reference &ref );
|
||||||
/// @brief The constructor with an array of ref names.
|
/// @brief The constructor with an array of ref names.
|
||||||
/// @param numrefs [in] The number of ref names.
|
/// @param numrefs [in] The number of ref names.
|
||||||
/// @param names [in] The ref names.
|
/// @param names [in] The ref names.
|
||||||
|
@ -178,7 +178,6 @@ struct DLL_ODDLPARSER_EXPORT Reference {
|
||||||
size_t sizeInBytes();
|
size_t sizeInBytes();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Reference( const Reference & ) ddl_no_copy;
|
|
||||||
Reference &operator = ( const Reference & ) ddl_no_copy;
|
Reference &operator = ( const Reference & ) ddl_no_copy;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -23,37 +23,13 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <openddlparser/OpenDDLCommon.h>
|
#include <openddlparser/OpenDDLCommon.h>
|
||||||
|
#include <openddlparser/OpenDDLStream.h>
|
||||||
#include <openddlparser/Value.h>
|
#include <openddlparser/Value.h>
|
||||||
|
|
||||||
BEGIN_ODDLPARSER_NS
|
BEGIN_ODDLPARSER_NS
|
||||||
|
|
||||||
//-------------------------------------------------------------------------------------------------
|
// Forward declarations
|
||||||
/// @ingroup IOStreamBase
|
class IOStreamBase;
|
||||||
/// @brief This class represents the stream to write out.
|
|
||||||
//-------------------------------------------------------------------------------------------------
|
|
||||||
class DLL_ODDLPARSER_EXPORT StreamFormatterBase {
|
|
||||||
public:
|
|
||||||
StreamFormatterBase();
|
|
||||||
virtual ~StreamFormatterBase();
|
|
||||||
virtual std::string format( const std::string &statement );
|
|
||||||
};
|
|
||||||
|
|
||||||
//-------------------------------------------------------------------------------------------------
|
|
||||||
/// @ingroup IOStreamBase
|
|
||||||
/// @brief This class represents the stream to write out.
|
|
||||||
//-------------------------------------------------------------------------------------------------
|
|
||||||
class DLL_ODDLPARSER_EXPORT IOStreamBase {
|
|
||||||
public:
|
|
||||||
IOStreamBase( StreamFormatterBase *formatter = ddl_nullptr );
|
|
||||||
virtual ~IOStreamBase();
|
|
||||||
virtual bool open( const std::string &anme );
|
|
||||||
virtual bool close();
|
|
||||||
virtual size_t write( const std::string &statement );
|
|
||||||
|
|
||||||
private:
|
|
||||||
StreamFormatterBase *m_formatter;
|
|
||||||
FILE *m_file;
|
|
||||||
};
|
|
||||||
|
|
||||||
//-------------------------------------------------------------------------------------------------
|
//-------------------------------------------------------------------------------------------------
|
||||||
///
|
///
|
||||||
|
|
|
@ -39,6 +39,16 @@ struct Identifier;
|
||||||
struct Reference;
|
struct Reference;
|
||||||
struct Property;
|
struct Property;
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
inline
|
||||||
|
bool isEmbeddedCommentOpenTag( T *in, T *end ) {
|
||||||
|
if ( in == '/' && in+1 == '*' ) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
/// @brief Utility function to search for the next token or the end of the buffer.
|
/// @brief Utility function to search for the next token or the end of the buffer.
|
||||||
/// @param in [in] The start position in the buffer.
|
/// @param in [in] The start position in the buffer.
|
||||||
/// @param end [in] The end position in the buffer.
|
/// @param end [in] The end position in the buffer.
|
||||||
|
@ -47,7 +57,7 @@ struct Property;
|
||||||
template<class T>
|
template<class T>
|
||||||
inline
|
inline
|
||||||
T *lookForNextToken( T *in, T *end ) {
|
T *lookForNextToken( T *in, T *end ) {
|
||||||
while( ( isSpace( *in ) || isNewLine( *in ) || ',' == *in ) && ( in != end ) ) {
|
while( ( in != end ) && ( isSpace( *in ) || isNewLine( *in ) || ',' == *in ) ) {
|
||||||
in++;
|
in++;
|
||||||
}
|
}
|
||||||
return in;
|
return in;
|
||||||
|
|
|
@ -84,7 +84,7 @@ static const unsigned char chartype_table[ 256 ] = {
|
||||||
template<class T>
|
template<class T>
|
||||||
inline
|
inline
|
||||||
bool isNumeric( const T in ) {
|
bool isNumeric( const T in ) {
|
||||||
return ( chartype_table[ static_cast<int>( in ) ] == 1 );
|
return ( chartype_table[ static_cast<size_t>( in ) ] == 1 );
|
||||||
}
|
}
|
||||||
|
|
||||||
template<class T>
|
template<class T>
|
||||||
|
@ -98,7 +98,7 @@ inline
|
||||||
bool isInteger( T *in, T *end ) {
|
bool isInteger( T *in, T *end ) {
|
||||||
if( in != end ) {
|
if( in != end ) {
|
||||||
if( *in == '-' ) {
|
if( *in == '-' ) {
|
||||||
in++;
|
++in;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -108,7 +108,7 @@ bool isInteger( T *in, T *end ) {
|
||||||
if( !result ) {
|
if( !result ) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
in++;
|
++in;
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -119,7 +119,7 @@ inline
|
||||||
bool isFloat( T *in, T *end ) {
|
bool isFloat( T *in, T *end ) {
|
||||||
if( in != end ) {
|
if( in != end ) {
|
||||||
if( *in == '-' ) {
|
if( *in == '-' ) {
|
||||||
in++;
|
++in;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -134,12 +134,12 @@ bool isFloat( T *in, T *end ) {
|
||||||
if( !result ) {
|
if( !result ) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
in++;
|
++in;
|
||||||
}
|
}
|
||||||
|
|
||||||
// check for 1<.>0f
|
// check for 1<.>0f
|
||||||
if( *in == '.' ) {
|
if( *in == '.' ) {
|
||||||
in++;
|
++in;
|
||||||
} else {
|
} else {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -150,7 +150,7 @@ bool isFloat( T *in, T *end ) {
|
||||||
if( !result ) {
|
if( !result ) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
in++;
|
++in;
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -208,7 +208,7 @@ template<class T>
|
||||||
inline
|
inline
|
||||||
static T *getNextSeparator( T *in, T *end ) {
|
static T *getNextSeparator( T *in, T *end ) {
|
||||||
while( !isSeparator( *in ) || in == end ) {
|
while( !isSeparator( *in ) || in == end ) {
|
||||||
in++;
|
++in;
|
||||||
}
|
}
|
||||||
return in;
|
return in;
|
||||||
}
|
}
|
||||||
|
@ -250,5 +250,33 @@ bool isComment( T *in, T *end ) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
inline
|
||||||
|
bool isCommentOpenTag(T *in, T *end ) {
|
||||||
|
if (*in == '/') {
|
||||||
|
if (in + 1 != end) {
|
||||||
|
if (*(in + 1) == '*') {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class T>
|
||||||
|
inline
|
||||||
|
bool isCommentCloseTag(T *in, T *end) {
|
||||||
|
if (*in == '*') {
|
||||||
|
if (in + 1 != end) {
|
||||||
|
if (*(in + 1) == '/') {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
END_ODDLPARSER_NS
|
END_ODDLPARSER_NS
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,89 @@
|
||||||
|
/*-----------------------------------------------------------------------------------------------
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2014-2015 Kim Kulling
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
||||||
|
this software and associated documentation files (the "Software"), to deal in
|
||||||
|
the Software without restriction, including without limitation the rights to
|
||||||
|
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
||||||
|
the Software, and to permit persons to whom the Software is furnished to do so,
|
||||||
|
subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
||||||
|
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
||||||
|
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
||||||
|
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
-----------------------------------------------------------------------------------------------*/
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <openddlparser/OpenDDLCommon.h>
|
||||||
|
|
||||||
|
BEGIN_ODDLPARSER_NS
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------------------
|
||||||
|
/// @ingroup IOStreamBase
|
||||||
|
/// @brief This class represents the stream to write out.
|
||||||
|
//-------------------------------------------------------------------------------------------------
|
||||||
|
class DLL_ODDLPARSER_EXPORT StreamFormatterBase {
|
||||||
|
public:
|
||||||
|
/// @brief The class constructor.
|
||||||
|
StreamFormatterBase();
|
||||||
|
|
||||||
|
/// @brief The class destructor, virtual.
|
||||||
|
virtual ~StreamFormatterBase();
|
||||||
|
|
||||||
|
/// @brief Will format the sring and return the new formatted result.
|
||||||
|
/// @param statement [in] The string to reformat.
|
||||||
|
/// @return The reformatted result.
|
||||||
|
virtual std::string format(const std::string &statement);
|
||||||
|
};
|
||||||
|
|
||||||
|
//-------------------------------------------------------------------------------------------------
|
||||||
|
/// @ingroup IOStreamBase
|
||||||
|
/// @brief This class represents the stream to write out.
|
||||||
|
//-------------------------------------------------------------------------------------------------
|
||||||
|
class DLL_ODDLPARSER_EXPORT IOStreamBase {
|
||||||
|
public:
|
||||||
|
/// @brief The class constructor with the formatter.
|
||||||
|
/// @param formatter [in] The formatter to use.
|
||||||
|
explicit IOStreamBase(StreamFormatterBase *formatter = ddl_nullptr);
|
||||||
|
|
||||||
|
/// @brief The class destructor, virtual.
|
||||||
|
virtual ~IOStreamBase();
|
||||||
|
|
||||||
|
/// @brief Will open the stream.
|
||||||
|
/// @param name [in] The name for the stream.
|
||||||
|
/// @return true, if the stream was opened successfully, false if not.
|
||||||
|
virtual bool open(const std::string &name);
|
||||||
|
|
||||||
|
/// @brief Will close the stream.
|
||||||
|
/// @return true, if the stream was closed successfully, false if not.
|
||||||
|
virtual bool close();
|
||||||
|
|
||||||
|
/// @brief Returns true, if the stream is open.
|
||||||
|
/// @return true, if the stream is open, false if not.
|
||||||
|
virtual bool isOpen() const;
|
||||||
|
|
||||||
|
/// @brief Will read a string from the stream.
|
||||||
|
/// @param sizeToRead [in] The size to read in bytes.
|
||||||
|
/// @param statement [out] The read statements.
|
||||||
|
/// @return The bytes read from the stream.
|
||||||
|
virtual size_t read( size_t sizeToRead, std::string &statement );
|
||||||
|
|
||||||
|
/// @brief Will write a string into the stream.
|
||||||
|
/// @param statement [in] The string to write.
|
||||||
|
/// @return The bytes written into the stream.
|
||||||
|
virtual size_t write(const std::string &statement);
|
||||||
|
|
||||||
|
private:
|
||||||
|
StreamFormatterBase *m_formatter;
|
||||||
|
FILE *m_file;
|
||||||
|
};
|
||||||
|
|
||||||
|
END_ODDLPARSER_NS
|
|
@ -28,8 +28,11 @@ CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
|
||||||
BEGIN_ODDLPARSER_NS
|
BEGIN_ODDLPARSER_NS
|
||||||
|
|
||||||
|
// Forward declarations
|
||||||
struct ValueAllocator;
|
struct ValueAllocator;
|
||||||
|
|
||||||
|
class IOStreamBase;
|
||||||
|
|
||||||
///------------------------------------------------------------------------------------------------
|
///------------------------------------------------------------------------------------------------
|
||||||
/// @brief This class implements a value.
|
/// @brief This class implements a value.
|
||||||
///
|
///
|
||||||
|
@ -213,7 +216,7 @@ public:
|
||||||
double getDouble() const;
|
double getDouble() const;
|
||||||
|
|
||||||
/// @brief Assigns a std::string to the value.
|
/// @brief Assigns a std::string to the value.
|
||||||
/// @param value [in] The value.
|
/// @param str [in] The value.
|
||||||
void setString( const std::string &str );
|
void setString( const std::string &str );
|
||||||
|
|
||||||
/// @brief Returns the std::string value.
|
/// @brief Returns the std::string value.
|
||||||
|
@ -229,7 +232,8 @@ public:
|
||||||
Reference *getRef() const;
|
Reference *getRef() const;
|
||||||
|
|
||||||
/// @brief Dumps the value.
|
/// @brief Dumps the value.
|
||||||
void dump();
|
/// @param stream [in] The stream to write in.
|
||||||
|
void dump( IOStreamBase &stream );
|
||||||
|
|
||||||
/// @brief Assigns the next value.
|
/// @brief Assigns the next value.
|
||||||
/// @param next [n] The next value.
|
/// @param next [n] The next value.
|
||||||
|
@ -241,7 +245,7 @@ public:
|
||||||
|
|
||||||
/// @brief Gets the length of the array.
|
/// @brief Gets the length of the array.
|
||||||
/// @return The number of items in the array.
|
/// @return The number of items in the array.
|
||||||
size_t size();
|
size_t size() const;
|
||||||
|
|
||||||
ValueType m_type;
|
ValueType m_type;
|
||||||
size_t m_size;
|
size_t m_size;
|
||||||
|
|
|
@ -143,7 +143,6 @@ struct NodeAttachmentInfo
|
||||||
*/
|
*/
|
||||||
#define AI_INT_MERGE_SCENE_GEN_UNIQUE_NAMES_IF_NECESSARY 0x10
|
#define AI_INT_MERGE_SCENE_GEN_UNIQUE_NAMES_IF_NECESSARY 0x10
|
||||||
|
|
||||||
|
|
||||||
typedef std::pair<aiBone*,unsigned int> BoneSrcIndex;
|
typedef std::pair<aiBone*,unsigned int> BoneSrcIndex;
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
@ -153,7 +152,6 @@ struct BoneWithHash : public std::pair<uint32_t,aiString*> {
|
||||||
std::vector<BoneSrcIndex> pSrcBones;
|
std::vector<BoneSrcIndex> pSrcBones;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
/** @brief Utility for SceneCombiner
|
/** @brief Utility for SceneCombiner
|
||||||
*/
|
*/
|
|
@ -3,7 +3,7 @@
|
||||||
Open Asset Import Library (assimp)
|
Open Asset Import Library (assimp)
|
||||||
---------------------------------------------------------------------------
|
---------------------------------------------------------------------------
|
||||||
|
|
||||||
Copyright (c) 2006-2016, assimp team
|
Copyright (c) 2006-2017, assimp team
|
||||||
|
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
|
@ -632,8 +632,15 @@ enum aiComponent
|
||||||
#define AI_CONFIG_IMPORT_FBX_OPTIMIZE_EMPTY_ANIMATION_CURVES \
|
#define AI_CONFIG_IMPORT_FBX_OPTIMIZE_EMPTY_ANIMATION_CURVES \
|
||||||
"IMPORT_FBX_OPTIMIZE_EMPTY_ANIMATION_CURVES"
|
"IMPORT_FBX_OPTIMIZE_EMPTY_ANIMATION_CURVES"
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
/** @brief Set whether the fbx importer will search for embedded loaded textures, where no embedded texture data is provided.
|
||||||
|
*
|
||||||
|
* The default value is false (0)
|
||||||
|
* Property type: bool
|
||||||
|
*/
|
||||||
|
#define AI_CONFIG_IMPORT_FBX_SEARCH_EMBEDDED_TEXTURES \
|
||||||
|
"IMPORT_FBX_SEARCH_EMBEDDED_TEXTURES"
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
/** @brief Set the vertex animation keyframe to be imported
|
/** @brief Set the vertex animation keyframe to be imported
|
||||||
*
|
*
|
||||||
|
|
|
@ -48,6 +48,18 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#ifndef AI_MATERIAL_INL_INC
|
#ifndef AI_MATERIAL_INL_INC
|
||||||
#define AI_MATERIAL_INL_INC
|
#define AI_MATERIAL_INL_INC
|
||||||
|
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
inline aiPropertyTypeInfo ai_real_to_property_type_info(float)
|
||||||
|
{
|
||||||
|
return aiPTI_Float;
|
||||||
|
}
|
||||||
|
|
||||||
|
inline aiPropertyTypeInfo ai_real_to_property_type_info(double)
|
||||||
|
{
|
||||||
|
return aiPTI_Double;
|
||||||
|
}
|
||||||
|
// ---------------------------------------------------------------------------
|
||||||
|
|
||||||
//! @cond never
|
//! @cond never
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
@ -223,7 +235,7 @@ inline aiReturn aiMaterial::AddProperty(const aiUVTransform* pInput,
|
||||||
{
|
{
|
||||||
return AddBinaryProperty((const void*)pInput,
|
return AddBinaryProperty((const void*)pInput,
|
||||||
pNumValues * sizeof(aiUVTransform),
|
pNumValues * sizeof(aiUVTransform),
|
||||||
pKey,type,index,aiPTI_Float); //TODO could be Double ...
|
pKey,type,index,ai_real_to_property_type_info(pInput->mRotation));
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
@ -235,7 +247,7 @@ inline aiReturn aiMaterial::AddProperty(const aiColor4D* pInput,
|
||||||
{
|
{
|
||||||
return AddBinaryProperty((const void*)pInput,
|
return AddBinaryProperty((const void*)pInput,
|
||||||
pNumValues * sizeof(aiColor4D),
|
pNumValues * sizeof(aiColor4D),
|
||||||
pKey,type,index,aiPTI_Float); //TODO could be Double ...
|
pKey,type,index,ai_real_to_property_type_info(pInput->a));
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
@ -247,7 +259,7 @@ inline aiReturn aiMaterial::AddProperty(const aiColor3D* pInput,
|
||||||
{
|
{
|
||||||
return AddBinaryProperty((const void*)pInput,
|
return AddBinaryProperty((const void*)pInput,
|
||||||
pNumValues * sizeof(aiColor3D),
|
pNumValues * sizeof(aiColor3D),
|
||||||
pKey,type,index,aiPTI_Float); //TODO could be Double ...
|
pKey,type,index,ai_real_to_property_type_info(pInput->b));
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
@ -259,7 +271,7 @@ inline aiReturn aiMaterial::AddProperty(const aiVector3D* pInput,
|
||||||
{
|
{
|
||||||
return AddBinaryProperty((const void*)pInput,
|
return AddBinaryProperty((const void*)pInput,
|
||||||
pNumValues * sizeof(aiVector3D),
|
pNumValues * sizeof(aiVector3D),
|
||||||
pKey,type,index,aiPTI_Float); //TODO could be Double ...
|
pKey,type,index,ai_real_to_property_type_info(pInput->x));
|
||||||
}
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
|
|
|
@ -1,94 +1,94 @@
|
||||||
PyAssimp Readme
|
PyAssimp Readme
|
||||||
===============
|
===============
|
||||||
|
|
||||||
A simple Python wrapper for Assimp using `ctypes` to access the library.
|
A simple Python wrapper for Assimp using `ctypes` to access the library.
|
||||||
Requires Python >= 2.6.
|
Requires Python >= 2.6.
|
||||||
|
|
||||||
Python 3 support is mostly here, but not well tested.
|
Python 3 support is mostly here, but not well tested.
|
||||||
|
|
||||||
Note that pyassimp is not complete. Many ASSIMP features are missing.
|
Note that pyassimp is not complete. Many ASSIMP features are missing.
|
||||||
|
|
||||||
USAGE
|
USAGE
|
||||||
-----
|
-----
|
||||||
|
|
||||||
### Complete example: 3D viewer
|
### Complete example: 3D viewer
|
||||||
|
|
||||||
`pyassimp` comes with a simple 3D viewer that shows how to load and display a 3D
|
`pyassimp` comes with a simple 3D viewer that shows how to load and display a 3D
|
||||||
model using a shader-based OpenGL pipeline.
|
model using a shader-based OpenGL pipeline.
|
||||||
|
|
||||||
![Screenshot](3d_viewer_screenshot.png)
|
![Screenshot](3d_viewer_screenshot.png)
|
||||||
|
|
||||||
To use it, from within `/port/PyAssimp`:
|
To use it, from within `/port/PyAssimp`:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ cd scripts
|
$ cd scripts
|
||||||
$ python ./3D-viewer <path to your model>
|
$ python ./3D-viewer <path to your model>
|
||||||
```
|
```
|
||||||
|
|
||||||
You can use this code as starting point in your applications.
|
You can use this code as starting point in your applications.
|
||||||
|
|
||||||
### Writing your own code
|
### Writing your own code
|
||||||
|
|
||||||
To get started with `pyassimp`, examine the simpler `sample.py` script in `scripts/`,
|
To get started with `pyassimp`, examine the simpler `sample.py` script in `scripts/`,
|
||||||
which illustrates the basic usage. All Assimp data structures are wrapped using
|
which illustrates the basic usage. All Assimp data structures are wrapped using
|
||||||
`ctypes`. All the data+length fields in Assimp's data structures (such as
|
`ctypes`. All the data+length fields in Assimp's data structures (such as
|
||||||
`aiMesh::mNumVertices`, `aiMesh::mVertices`) are replaced by simple python
|
`aiMesh::mNumVertices`, `aiMesh::mVertices`) are replaced by simple python
|
||||||
lists, so you can call `len()` on them to get their respective size and access
|
lists, so you can call `len()` on them to get their respective size and access
|
||||||
members using `[]`.
|
members using `[]`.
|
||||||
|
|
||||||
For example, to load a file named `hello.3ds` and print the first
|
For example, to load a file named `hello.3ds` and print the first
|
||||||
vertex of the first mesh, you would do (proper error handling
|
vertex of the first mesh, you would do (proper error handling
|
||||||
substituted by assertions ...):
|
substituted by assertions ...):
|
||||||
|
|
||||||
```python
|
```python
|
||||||
|
|
||||||
from pyassimp import *
|
from pyassimp import *
|
||||||
scene = load('hello.3ds')
|
scene = load('hello.3ds')
|
||||||
|
|
||||||
assert len(scene.meshes)
|
assert len(scene.meshes)
|
||||||
mesh = scene.meshes[0]
|
mesh = scene.meshes[0]
|
||||||
|
|
||||||
assert len(mesh.vertices)
|
assert len(mesh.vertices)
|
||||||
print(mesh.vertices[0])
|
print(mesh.vertices[0])
|
||||||
|
|
||||||
# don't forget this one, or you will leak!
|
# don't forget this one, or you will leak!
|
||||||
release(scene)
|
release(scene)
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
Another example to list the 'top nodes' in a
|
Another example to list the 'top nodes' in a
|
||||||
scene:
|
scene:
|
||||||
|
|
||||||
```python
|
```python
|
||||||
|
|
||||||
from pyassimp import *
|
from pyassimp import *
|
||||||
scene = load('hello.3ds')
|
scene = load('hello.3ds')
|
||||||
|
|
||||||
for c in scene.rootnode.children:
|
for c in scene.rootnode.children:
|
||||||
print(str(c))
|
print(str(c))
|
||||||
|
|
||||||
release(scene)
|
release(scene)
|
||||||
|
|
||||||
```
|
```
|
||||||
|
|
||||||
INSTALL
|
INSTALL
|
||||||
-------
|
-------
|
||||||
|
|
||||||
Install `pyassimp` by running:
|
Install `pyassimp` by running:
|
||||||
|
|
||||||
```
|
```
|
||||||
$ python setup.py install
|
$ python setup.py install
|
||||||
```
|
```
|
||||||
|
|
||||||
PyAssimp requires a assimp dynamic library (`DLL` on windows,
|
PyAssimp requires a assimp dynamic library (`DLL` on windows,
|
||||||
`.so` on linux, `.dynlib` on macOS) in order to work. The default search directories
|
`.so` on linux, `.dynlib` on macOS) in order to work. The default search directories
|
||||||
are:
|
are:
|
||||||
|
|
||||||
- the current directory
|
- the current directory
|
||||||
- on linux additionally: `/usr/lib`, `/usr/local/lib`,
|
- on linux additionally: `/usr/lib`, `/usr/local/lib`,
|
||||||
`/usr/lib/x86_64-linux-gnu`
|
`/usr/lib/x86_64-linux-gnu`
|
||||||
|
|
||||||
To build that library, refer to the Assimp master `INSTALL`
|
To build that library, refer to the Assimp master `INSTALL`
|
||||||
instructions. To look in more places, edit `./pyassimp/helper.py`.
|
instructions. To look in more places, edit `./pyassimp/helper.py`.
|
||||||
There's an `additional_dirs` list waiting for your entries.
|
There's an `additional_dirs` list waiting for your entries.
|
||||||
|
|
||||||
|
|
|
@ -679,7 +679,7 @@ class PyAssimp3DViewer:
|
||||||
logger.info("Loading model:" + path + "...")
|
logger.info("Loading model:" + path + "...")
|
||||||
|
|
||||||
if postprocess:
|
if postprocess:
|
||||||
self.scene = pyassimp.load(path, postprocess)
|
self.scene = pyassimp.load(path, processing=postprocess)
|
||||||
else:
|
else:
|
||||||
self.scene = pyassimp.load(path)
|
self.scene = pyassimp.load(path)
|
||||||
logger.info("Done.")
|
logger.info("Done.")
|
||||||
|
|
|
@ -98,7 +98,7 @@ class GLRenderer():
|
||||||
logger.info("Loading model:" + path + "...")
|
logger.info("Loading model:" + path + "...")
|
||||||
|
|
||||||
if postprocess:
|
if postprocess:
|
||||||
self.scene = pyassimp.load(path, postprocess)
|
self.scene = pyassimp.load(path, processing=postprocess)
|
||||||
else:
|
else:
|
||||||
self.scene = pyassimp.load(path)
|
self.scene = pyassimp.load(path)
|
||||||
logger.info("Done.")
|
logger.info("Done.")
|
||||||
|
|
|
@ -20,7 +20,7 @@ def recur_node(node,level = 0):
|
||||||
|
|
||||||
def main(filename=None):
|
def main(filename=None):
|
||||||
|
|
||||||
scene = pyassimp.load(filename, pyassimp.postprocess.aiProcess_Triangulate)
|
scene = pyassimp.load(filename, processing=pyassimp.postprocess.aiProcess_Triangulate)
|
||||||
|
|
||||||
#the model we load
|
#the model we load
|
||||||
print("MODEL:" + filename)
|
print("MODEL:" + filename)
|
||||||
|
|
|
@ -7,8 +7,8 @@ SET (CMAKE_SYSTEM_PROCESSOR "arm64")
|
||||||
SET (SDKVER "7.1")
|
SET (SDKVER "7.1")
|
||||||
SET (DEVROOT "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain")
|
SET (DEVROOT "/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain")
|
||||||
SET (SDKROOT "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS${SDKVER}.sdk")
|
SET (SDKROOT "/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS${SDKVER}.sdk")
|
||||||
SET (CC "${DEVROOT}/usr/bin/llvm-gcc")
|
SET (CC "${DEVROOT}/usr/bin/clang")
|
||||||
SET (CXX "${DEVROOT}/usr/bin/llvm-g++")
|
SET (CXX "${DEVROOT}/usr/bin/clang++")
|
||||||
|
|
||||||
CMAKE_FORCE_C_COMPILER (${CC} LLVM)
|
CMAKE_FORCE_C_COMPILER (${CC} LLVM)
|
||||||
CMAKE_FORCE_CXX_COMPILER (${CXX} LLVM)
|
CMAKE_FORCE_CXX_COMPILER (${CXX} LLVM)
|
||||||
|
|
|
@ -53,7 +53,11 @@ public:
|
||||||
virtual bool importerTest() {
|
virtual bool importerTest() {
|
||||||
Assimp::Importer importer;
|
Assimp::Importer importer;
|
||||||
const aiScene *scene = importer.ReadFile( ASSIMP_TEST_MODELS_DIR "/3DS/fels.3ds", 0 );
|
const aiScene *scene = importer.ReadFile( ASSIMP_TEST_MODELS_DIR "/3DS/fels.3ds", 0 );
|
||||||
|
#ifndef ASSIMP_BUILD_NO_3DS_IMPORTER
|
||||||
return nullptr != scene;
|
return nullptr != scene;
|
||||||
|
#else
|
||||||
|
return nullptr == scene;
|
||||||
|
#endif // ASSIMP_BUILD_NO_3DS_IMPORTER
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -53,7 +53,11 @@ public:
|
||||||
virtual bool importerTest() {
|
virtual bool importerTest() {
|
||||||
Assimp::Importer importer;
|
Assimp::Importer importer;
|
||||||
const aiScene *scene = importer.ReadFile( ASSIMP_TEST_MODELS_DIR "/ASE/ThreeCubesGreen.ASE", 0 );
|
const aiScene *scene = importer.ReadFile( ASSIMP_TEST_MODELS_DIR "/ASE/ThreeCubesGreen.ASE", 0 );
|
||||||
|
#ifndef ASSIMP_BUILD_NO_3DS_IMPORTER
|
||||||
return nullptr != scene;
|
return nullptr != scene;
|
||||||
|
#else
|
||||||
|
return nullptr == scene;
|
||||||
|
#endif // ASSIMP_BUILD_NO_3DS_IMPORTER
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -66,6 +66,7 @@ TEST_F( BatchLoaderTest, createTest ) {
|
||||||
} catch ( ... ) {
|
} catch ( ... ) {
|
||||||
ok = false;
|
ok = false;
|
||||||
}
|
}
|
||||||
|
EXPECT_TRUE( ok );
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F( BatchLoaderTest, validateAccessTest ) {
|
TEST_F( BatchLoaderTest, validateAccessTest ) {
|
||||||
|
|
|
@ -109,8 +109,8 @@ TEST_F( utObjTools, countComponents_TwoLines_Success ) {
|
||||||
buffer.resize( data.size() );
|
buffer.resize( data.size() );
|
||||||
::memcpy( &buffer[ 0 ], &data[ 0 ], data.size() );
|
::memcpy( &buffer[ 0 ], &data[ 0 ], data.size() );
|
||||||
test_parser.setBuffer( buffer );
|
test_parser.setBuffer( buffer );
|
||||||
static const size_t Size = 4096UL;
|
|
||||||
|
|
||||||
size_t numComps = test_parser.testGetNumComponentsInDataDefinition();
|
size_t numComps = test_parser.testGetNumComponentsInDataDefinition();
|
||||||
EXPECT_EQ( 3U, numComps );
|
EXPECT_EQ( 3U, numComps );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -50,10 +50,8 @@ class utglTFImportExport : public AbstractImportExportBase {
|
||||||
public:
|
public:
|
||||||
virtual bool importerTest() {
|
virtual bool importerTest() {
|
||||||
Assimp::Importer importer;
|
Assimp::Importer importer;
|
||||||
const aiScene *scene = importer.ReadFile( ASSIMP_TEST_MODELS_DIR "/glFT/TwoBoxes/TwoBoxes.gltf", 0 );
|
const aiScene *scene = importer.ReadFile( ASSIMP_TEST_MODELS_DIR "/glTF/TwoBoxes/TwoBoxes.gltf", 0 );
|
||||||
//return nullptr != scene;
|
return nullptr != scene;
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue