Merge branch 'master' into patch-3
commit
f5a31b70f5
|
@ -102,13 +102,14 @@ private:
|
||||||
// preserves the mesh's given name if it has one. |index| is the index
|
// preserves the mesh's given name if it has one. |index| is the index
|
||||||
// of the mesh in |aiScene::mMeshes|.
|
// of the mesh in |aiScene::mMeshes|.
|
||||||
std::string GetMeshName(const aiMesh &mesh, unsigned int index, const aiNode &node) {
|
std::string GetMeshName(const aiMesh &mesh, unsigned int index, const aiNode &node) {
|
||||||
static const std::string underscore = "_";
|
static const char underscore = '_';
|
||||||
char postfix[10] = { 0 };
|
char postfix[10] = { 0 };
|
||||||
ASSIMP_itoa10(postfix, index);
|
ASSIMP_itoa10(postfix, index);
|
||||||
|
|
||||||
std::string result = node.mName.C_Str();
|
std::string result = node.mName.C_Str();
|
||||||
if (mesh.mName.length > 0) {
|
if (mesh.mName.length > 0) {
|
||||||
result += underscore + mesh.mName.C_Str();
|
result += underscore;
|
||||||
|
result += mesh.mName.C_Str();
|
||||||
}
|
}
|
||||||
return result + underscore + postfix;
|
return result + underscore + postfix;
|
||||||
}
|
}
|
||||||
|
|
|
@ -61,20 +61,10 @@ namespace D3DS {
|
||||||
#include <assimp/Compiler/pushpack1.h>
|
#include <assimp/Compiler/pushpack1.h>
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
/** Discreet3DS class: Helper class for loading 3ds files. Defines chunks
|
/** Defines chunks and data structures.
|
||||||
* and data structures.
|
|
||||||
*/
|
*/
|
||||||
class Discreet3DS {
|
namespace Discreet3DS {
|
||||||
private:
|
|
||||||
Discreet3DS() AI_NO_EXCEPT {
|
|
||||||
// empty
|
|
||||||
}
|
|
||||||
|
|
||||||
~Discreet3DS() {
|
|
||||||
// empty
|
|
||||||
}
|
|
||||||
|
|
||||||
public:
|
|
||||||
//! data structure for a single chunk in a .3ds file
|
//! data structure for a single chunk in a .3ds file
|
||||||
struct Chunk {
|
struct Chunk {
|
||||||
uint16_t Flag;
|
uint16_t Flag;
|
||||||
|
@ -314,7 +304,7 @@ public:
|
||||||
// camera sub-chunks
|
// camera sub-chunks
|
||||||
CHUNK_CAM_RANGES = 0x4720
|
CHUNK_CAM_RANGES = 0x4720
|
||||||
};
|
};
|
||||||
};
|
}
|
||||||
|
|
||||||
// ---------------------------------------------------------------------------
|
// ---------------------------------------------------------------------------
|
||||||
/** Helper structure representing a 3ds mesh face */
|
/** Helper structure representing a 3ds mesh face */
|
||||||
|
|
|
@ -44,63 +44,66 @@ namespace Assimp {
|
||||||
namespace D3MF {
|
namespace D3MF {
|
||||||
|
|
||||||
namespace XmlTag {
|
namespace XmlTag {
|
||||||
|
// Root tag
|
||||||
|
const char* const RootTag = "3MF";
|
||||||
|
|
||||||
// Meta-data
|
// Meta-data
|
||||||
static const std::string meta = "metadata";
|
const char* const meta = "metadata";
|
||||||
static const std::string meta_name = "name";
|
const char* const meta_name = "name";
|
||||||
|
|
||||||
// Model-data specific tags
|
// Model-data specific tags
|
||||||
static const std::string model = "model";
|
const char* const model = "model";
|
||||||
static const std::string model_unit = "unit";
|
const char* const model_unit = "unit";
|
||||||
static const std::string metadata = "metadata";
|
const char* const metadata = "metadata";
|
||||||
static const std::string resources = "resources";
|
const char* const resources = "resources";
|
||||||
static const std::string object = "object";
|
const char* const object = "object";
|
||||||
static const std::string mesh = "mesh";
|
const char* const mesh = "mesh";
|
||||||
static const std::string components = "components";
|
const char* const components = "components";
|
||||||
static const std::string component = "component";
|
const char* const component = "component";
|
||||||
static const std::string vertices = "vertices";
|
const char* const vertices = "vertices";
|
||||||
static const std::string vertex = "vertex";
|
const char* const vertex = "vertex";
|
||||||
static const std::string triangles = "triangles";
|
const char* const triangles = "triangles";
|
||||||
static const std::string triangle = "triangle";
|
const char* const triangle = "triangle";
|
||||||
static const std::string x = "x";
|
const char* const x = "x";
|
||||||
static const std::string y = "y";
|
const char* const y = "y";
|
||||||
static const std::string z = "z";
|
const char* const z = "z";
|
||||||
static const std::string v1 = "v1";
|
const char* const v1 = "v1";
|
||||||
static const std::string v2 = "v2";
|
const char* const v2 = "v2";
|
||||||
static const std::string v3 = "v3";
|
const char* const v3 = "v3";
|
||||||
static const std::string id = "id";
|
const char* const id = "id";
|
||||||
static const std::string pid = "pid";
|
const char* const pid = "pid";
|
||||||
static const std::string pindex = "pindex";
|
const char* const pindex = "pindex";
|
||||||
static const std::string p1 = "p1";
|
const char* const p1 = "p1";
|
||||||
static const std::string name = "name";
|
const char* const name = "name";
|
||||||
static const std::string type = "type";
|
const char* const type = "type";
|
||||||
static const std::string build = "build";
|
const char* const build = "build";
|
||||||
static const std::string item = "item";
|
const char* const item = "item";
|
||||||
static const std::string objectid = "objectid";
|
const char* const objectid = "objectid";
|
||||||
static const std::string transform = "transform";
|
const char* const transform = "transform";
|
||||||
|
|
||||||
// Material definitions
|
// Material definitions
|
||||||
static const std::string basematerials = "basematerials";
|
const char* const basematerials = "basematerials";
|
||||||
static const std::string basematerials_id = "id";
|
const char* const basematerials_id = "id";
|
||||||
static const std::string basematerials_base = "base";
|
const char* const basematerials_base = "base";
|
||||||
static const std::string basematerials_name = "name";
|
const char* const basematerials_name = "name";
|
||||||
static const std::string basematerials_displaycolor = "displaycolor";
|
const char* const basematerials_displaycolor = "displaycolor";
|
||||||
|
|
||||||
// Meta info tags
|
// Meta info tags
|
||||||
static const std::string CONTENT_TYPES_ARCHIVE = "[Content_Types].xml";
|
const char* const CONTENT_TYPES_ARCHIVE = "[Content_Types].xml";
|
||||||
static const std::string ROOT_RELATIONSHIPS_ARCHIVE = "_rels/.rels";
|
const char* const ROOT_RELATIONSHIPS_ARCHIVE = "_rels/.rels";
|
||||||
static const std::string SCHEMA_CONTENTTYPES = "http://schemas.openxmlformats.org/package/2006/content-types";
|
const char* const SCHEMA_CONTENTTYPES = "http://schemas.openxmlformats.org/package/2006/content-types";
|
||||||
static const std::string SCHEMA_RELATIONSHIPS = "http://schemas.openxmlformats.org/package/2006/relationships";
|
const char* const SCHEMA_RELATIONSHIPS = "http://schemas.openxmlformats.org/package/2006/relationships";
|
||||||
static const std::string RELS_RELATIONSHIP_CONTAINER = "Relationships";
|
const char* const RELS_RELATIONSHIP_CONTAINER = "Relationships";
|
||||||
static const std::string RELS_RELATIONSHIP_NODE = "Relationship";
|
const char* const RELS_RELATIONSHIP_NODE = "Relationship";
|
||||||
static const std::string RELS_ATTRIB_TARGET = "Target";
|
const char* const RELS_ATTRIB_TARGET = "Target";
|
||||||
static const std::string RELS_ATTRIB_TYPE = "Type";
|
const char* const RELS_ATTRIB_TYPE = "Type";
|
||||||
static const std::string RELS_ATTRIB_ID = "Id";
|
const char* const RELS_ATTRIB_ID = "Id";
|
||||||
static const std::string PACKAGE_START_PART_RELATIONSHIP_TYPE = "http://schemas.microsoft.com/3dmanufacturing/2013/01/3dmodel";
|
const char* const PACKAGE_START_PART_RELATIONSHIP_TYPE = "http://schemas.microsoft.com/3dmanufacturing/2013/01/3dmodel";
|
||||||
static const std::string PACKAGE_PRINT_TICKET_RELATIONSHIP_TYPE = "http://schemas.microsoft.com/3dmanufacturing/2013/01/printticket";
|
const char* const PACKAGE_PRINT_TICKET_RELATIONSHIP_TYPE = "http://schemas.microsoft.com/3dmanufacturing/2013/01/printticket";
|
||||||
static const std::string PACKAGE_TEXTURE_RELATIONSHIP_TYPE = "http://schemas.microsoft.com/3dmanufacturing/2013/01/3dtexture";
|
const char* const PACKAGE_TEXTURE_RELATIONSHIP_TYPE = "http://schemas.microsoft.com/3dmanufacturing/2013/01/3dtexture";
|
||||||
static const std::string PACKAGE_CORE_PROPERTIES_RELATIONSHIP_TYPE = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties";
|
const char* const PACKAGE_CORE_PROPERTIES_RELATIONSHIP_TYPE = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties";
|
||||||
static const std::string PACKAGE_THUMBNAIL_RELATIONSHIP_TYPE = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail";
|
const char* const PACKAGE_THUMBNAIL_RELATIONSHIP_TYPE = "http://schemas.openxmlformats.org/package/2006/relationships/metadata/thumbnail";
|
||||||
}
|
}
|
||||||
|
|
||||||
} // Namespace D3MF
|
} // Namespace D3MF
|
||||||
} // Namespace Assimp
|
} // Namespace Assimp
|
||||||
|
|
|
@ -307,18 +307,26 @@ void D3MFExporter::writeMesh(aiMesh *mesh) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
mModelOutput << "<" << XmlTag::mesh << ">" << std::endl;
|
mModelOutput << "<"
|
||||||
mModelOutput << "<" << XmlTag::vertices << ">" << std::endl;
|
<< XmlTag::mesh
|
||||||
|
<< ">" << "\n";
|
||||||
|
mModelOutput << "<"
|
||||||
|
<< XmlTag::vertices
|
||||||
|
<< ">" << "\n";
|
||||||
for (unsigned int i = 0; i < mesh->mNumVertices; ++i) {
|
for (unsigned int i = 0; i < mesh->mNumVertices; ++i) {
|
||||||
writeVertex(mesh->mVertices[i]);
|
writeVertex(mesh->mVertices[i]);
|
||||||
}
|
}
|
||||||
mModelOutput << "</" << XmlTag::vertices << ">" << std::endl;
|
mModelOutput << "</"
|
||||||
|
<< XmlTag::vertices << ">"
|
||||||
|
<< "\n";
|
||||||
|
|
||||||
const unsigned int matIdx(mesh->mMaterialIndex);
|
const unsigned int matIdx(mesh->mMaterialIndex);
|
||||||
|
|
||||||
writeFaces(mesh, matIdx);
|
writeFaces(mesh, matIdx);
|
||||||
|
|
||||||
mModelOutput << "</" << XmlTag::mesh << ">" << std::endl;
|
mModelOutput << "</"
|
||||||
|
<< XmlTag::mesh << ">"
|
||||||
|
<< "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
void D3MFExporter::writeVertex(const aiVector3D &pos) {
|
void D3MFExporter::writeVertex(const aiVector3D &pos) {
|
||||||
|
@ -334,27 +342,34 @@ void D3MFExporter::writeFaces(aiMesh *mesh, unsigned int matIdx) {
|
||||||
if (!mesh->HasFaces()) {
|
if (!mesh->HasFaces()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
mModelOutput << "<" << XmlTag::triangles << ">" << std::endl;
|
mModelOutput << "<"
|
||||||
|
<< XmlTag::triangles << ">"
|
||||||
|
<< "\n";
|
||||||
for (unsigned int i = 0; i < mesh->mNumFaces; ++i) {
|
for (unsigned int i = 0; i < mesh->mNumFaces; ++i) {
|
||||||
aiFace ¤tFace = mesh->mFaces[i];
|
aiFace ¤tFace = mesh->mFaces[i];
|
||||||
mModelOutput << "<" << XmlTag::triangle << " v1=\"" << currentFace.mIndices[0] << "\" v2=\""
|
mModelOutput << "<" << XmlTag::triangle << " v1=\"" << currentFace.mIndices[0] << "\" v2=\""
|
||||||
<< currentFace.mIndices[1] << "\" v3=\"" << currentFace.mIndices[2]
|
<< currentFace.mIndices[1] << "\" v3=\"" << currentFace.mIndices[2]
|
||||||
<< "\" pid=\"1\" p1=\"" + ai_to_string(matIdx) + "\" />";
|
<< "\" pid=\"1\" p1=\"" + ai_to_string(matIdx) + "\" />";
|
||||||
mModelOutput << std::endl;
|
mModelOutput << "\n";
|
||||||
}
|
}
|
||||||
mModelOutput << "</" << XmlTag::triangles << ">";
|
mModelOutput << "</"
|
||||||
mModelOutput << std::endl;
|
<< XmlTag::triangles
|
||||||
|
<< ">";
|
||||||
|
mModelOutput << "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
void D3MFExporter::writeBuild() {
|
void D3MFExporter::writeBuild() {
|
||||||
mModelOutput << "<" << XmlTag::build << ">" << std::endl;
|
mModelOutput << "<"
|
||||||
|
<< XmlTag::build
|
||||||
|
<< ">"
|
||||||
|
<< "\n";
|
||||||
|
|
||||||
for (size_t i = 0; i < mBuildItems.size(); ++i) {
|
for (size_t i = 0; i < mBuildItems.size(); ++i) {
|
||||||
mModelOutput << "<" << XmlTag::item << " objectid=\"" << i + 2 << "\"/>";
|
mModelOutput << "<" << XmlTag::item << " objectid=\"" << i + 2 << "\"/>";
|
||||||
mModelOutput << std::endl;
|
mModelOutput << "\n";
|
||||||
}
|
}
|
||||||
mModelOutput << "</" << XmlTag::build << ">";
|
mModelOutput << "</" << XmlTag::build << ">";
|
||||||
mModelOutput << std::endl;
|
mModelOutput << "\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
void D3MFExporter::zipContentType(const std::string &filename) {
|
void D3MFExporter::zipContentType(const std::string &filename) {
|
||||||
|
|
|
@ -42,6 +42,8 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#ifndef ASSIMP_BUILD_NO_3MF_IMPORTER
|
#ifndef ASSIMP_BUILD_NO_3MF_IMPORTER
|
||||||
|
|
||||||
#include "D3MFImporter.h"
|
#include "D3MFImporter.h"
|
||||||
|
#include "3MFXmlTags.h"
|
||||||
|
#include "D3MFOpcPackage.h"
|
||||||
|
|
||||||
#include <assimp/StringComparison.h>
|
#include <assimp/StringComparison.h>
|
||||||
#include <assimp/StringUtils.h>
|
#include <assimp/StringUtils.h>
|
||||||
|
@ -51,17 +53,15 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include <assimp/scene.h>
|
#include <assimp/scene.h>
|
||||||
#include <assimp/DefaultLogger.hpp>
|
#include <assimp/DefaultLogger.hpp>
|
||||||
#include <assimp/IOSystem.hpp>
|
#include <assimp/IOSystem.hpp>
|
||||||
|
#include <assimp/fast_atof.h>
|
||||||
|
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <map>
|
#include <map>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
|
||||||
#include "3MFXmlTags.h"
|
|
||||||
#include "D3MFOpcPackage.h"
|
|
||||||
#include <assimp/fast_atof.h>
|
|
||||||
|
|
||||||
#include <iomanip>
|
#include <iomanip>
|
||||||
|
#include <string.h>
|
||||||
|
|
||||||
namespace Assimp {
|
namespace Assimp {
|
||||||
namespace D3MF {
|
namespace D3MF {
|
||||||
|
@ -72,32 +72,39 @@ enum class ResourceType {
|
||||||
RT_Unknown
|
RT_Unknown
|
||||||
}; // To be extended with other resource types (eg. material extension resources like Texture2d, Texture2dGroup...)
|
}; // To be extended with other resource types (eg. material extension resources like Texture2d, Texture2dGroup...)
|
||||||
|
|
||||||
class Resource
|
class Resource {
|
||||||
{
|
|
||||||
public:
|
public:
|
||||||
Resource(int id) :
|
|
||||||
mId(id) {}
|
|
||||||
|
|
||||||
virtual ~Resource() {}
|
|
||||||
|
|
||||||
int mId;
|
int mId;
|
||||||
|
|
||||||
virtual ResourceType getType() {
|
Resource(int id) :
|
||||||
|
mId(id) {
|
||||||
|
// empty
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual ~Resource() {
|
||||||
|
// empty
|
||||||
|
}
|
||||||
|
|
||||||
|
virtual ResourceType getType() const {
|
||||||
return ResourceType::RT_Unknown;
|
return ResourceType::RT_Unknown;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
class BaseMaterials : public Resource {
|
class BaseMaterials : public Resource {
|
||||||
public:
|
public:
|
||||||
BaseMaterials(int id) :
|
|
||||||
Resource(id),
|
|
||||||
mMaterials(),
|
|
||||||
mMaterialIndex() {}
|
|
||||||
|
|
||||||
std::vector<aiMaterial *> mMaterials;
|
std::vector<aiMaterial *> mMaterials;
|
||||||
std::vector<unsigned int> mMaterialIndex;
|
std::vector<unsigned int> mMaterialIndex;
|
||||||
|
|
||||||
virtual ResourceType getType() {
|
BaseMaterials(int id) :
|
||||||
|
Resource(id),
|
||||||
|
mMaterials(),
|
||||||
|
mMaterialIndex() {
|
||||||
|
// empty
|
||||||
|
}
|
||||||
|
|
||||||
|
~BaseMaterials() = default;
|
||||||
|
|
||||||
|
ResourceType getType() const override {
|
||||||
return ResourceType::RT_BaseMaterials;
|
return ResourceType::RT_BaseMaterials;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
@ -109,24 +116,26 @@ struct Component {
|
||||||
|
|
||||||
class Object : public Resource {
|
class Object : public Resource {
|
||||||
public:
|
public:
|
||||||
std::vector<aiMesh*> mMeshes;
|
std::vector<aiMesh *> mMeshes;
|
||||||
std::vector<unsigned int> mMeshIndex;
|
std::vector<unsigned int> mMeshIndex;
|
||||||
std::vector<Component> mComponents;
|
std::vector<Component> mComponents;
|
||||||
std::string mName;
|
std::string mName;
|
||||||
|
|
||||||
Object(int id) :
|
Object(int id) :
|
||||||
Resource(id),
|
Resource(id),
|
||||||
mName(std::string("Object_") + ai_to_string(id)) {}
|
mName(std::string("Object_") + ai_to_string(id)) {
|
||||||
|
// empty
|
||||||
|
}
|
||||||
|
|
||||||
virtual ResourceType getType() {
|
~Object() = default;
|
||||||
|
|
||||||
|
ResourceType getType() const override {
|
||||||
return ResourceType::RT_Object;
|
return ResourceType::RT_Object;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
class XmlSerializer {
|
class XmlSerializer {
|
||||||
public:
|
public:
|
||||||
|
|
||||||
XmlSerializer(XmlParser *xmlParser) :
|
XmlSerializer(XmlParser *xmlParser) :
|
||||||
mResourcesDictionnary(),
|
mResourcesDictionnary(),
|
||||||
mMaterialCount(0),
|
mMaterialCount(0),
|
||||||
|
@ -136,7 +145,7 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
~XmlSerializer() {
|
~XmlSerializer() {
|
||||||
for (auto it = mResourcesDictionnary.begin(); it != mResourcesDictionnary.end(); it++) {
|
for (auto it = mResourcesDictionnary.begin(); it != mResourcesDictionnary.end(); ++it ) {
|
||||||
delete it->second;
|
delete it->second;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -146,28 +155,28 @@ public:
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
scene->mRootNode = new aiNode("3MF");
|
scene->mRootNode = new aiNode(XmlTag::RootTag);
|
||||||
|
|
||||||
XmlNode node = mXmlParser->getRootNode().child("model");
|
XmlNode node = mXmlParser->getRootNode().child(XmlTag::model);
|
||||||
if (node.empty()) {
|
if (node.empty()) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
XmlNode resNode = node.child("resources");
|
XmlNode resNode = node.child(XmlTag::resources);
|
||||||
for (XmlNode currentNode = resNode.first_child(); currentNode; currentNode = currentNode.next_sibling()) {
|
for (auto ¤tNode : resNode.children()) {
|
||||||
const std::string ¤tNodeName = currentNode.name();
|
const std::string currentNodeName = currentNode.name();
|
||||||
if (currentNodeName == D3MF::XmlTag::object) {
|
if (currentNodeName == XmlTag::object) {
|
||||||
ReadObject(currentNode);;
|
ReadObject(currentNode);
|
||||||
} else if (currentNodeName == D3MF::XmlTag::basematerials) {
|
} else if (currentNodeName == XmlTag::basematerials) {
|
||||||
ReadBaseMaterials(currentNode);
|
ReadBaseMaterials(currentNode);
|
||||||
} else if (currentNodeName == D3MF::XmlTag::meta) {
|
} else if (currentNodeName == XmlTag::meta) {
|
||||||
ReadMetadata(currentNode);
|
ReadMetadata(currentNode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
XmlNode buildNode = node.child("build");
|
XmlNode buildNode = node.child(XmlTag::build);
|
||||||
for (XmlNode currentNode = buildNode.first_child(); currentNode; currentNode = currentNode.next_sibling()) {
|
for (auto ¤tNode : buildNode.children()) {
|
||||||
const std::string ¤tNodeName = currentNode.name();
|
const std::string currentNodeName = currentNode.name();
|
||||||
if (currentNodeName == D3MF::XmlTag::item) {
|
if (currentNodeName == XmlTag::item) {
|
||||||
int objectId = -1;
|
int objectId = -1;
|
||||||
std::string transformationMatrixStr;
|
std::string transformationMatrixStr;
|
||||||
aiMatrix4x4 transformationMatrix;
|
aiMatrix4x4 transformationMatrix;
|
||||||
|
@ -186,10 +195,9 @@ public:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// import the metadata
|
// import the metadata
|
||||||
if (!mMetaData.empty()) {
|
if (!mMetaData.empty()) {
|
||||||
const size_t numMeta(mMetaData.size());
|
const size_t numMeta = mMetaData.size();
|
||||||
scene->mMetaData = aiMetadata::Alloc(static_cast<unsigned int>(numMeta));
|
scene->mMetaData = aiMetadata::Alloc(static_cast<unsigned int>(numMeta));
|
||||||
for (size_t i = 0; i < numMeta; ++i) {
|
for (size_t i = 0; i < numMeta; ++i) {
|
||||||
aiString val(mMetaData[i].value);
|
aiString val(mMetaData[i].value);
|
||||||
|
@ -201,9 +209,10 @@ public:
|
||||||
scene->mNumMeshes = static_cast<unsigned int>(mMeshCount);
|
scene->mNumMeshes = static_cast<unsigned int>(mMeshCount);
|
||||||
if (scene->mNumMeshes != 0) {
|
if (scene->mNumMeshes != 0) {
|
||||||
scene->mMeshes = new aiMesh *[scene->mNumMeshes]();
|
scene->mMeshes = new aiMesh *[scene->mNumMeshes]();
|
||||||
for (auto it = mResourcesDictionnary.begin(); it != mResourcesDictionnary.end(); it++) {
|
for (auto it = mResourcesDictionnary.begin(); it != mResourcesDictionnary.end(); ++it) {
|
||||||
if (it->second->getType() == ResourceType::RT_Object) {
|
if (it->second->getType() == ResourceType::RT_Object) {
|
||||||
Object *obj = static_cast<Object*>(it->second);
|
Object *obj = static_cast<Object *>(it->second);
|
||||||
|
ai_assert(nullptr != obj);
|
||||||
for (unsigned int i = 0; i < obj->mMeshes.size(); ++i) {
|
for (unsigned int i = 0; i < obj->mMeshes.size(); ++i) {
|
||||||
scene->mMeshes[obj->mMeshIndex[i]] = obj->mMeshes[i];
|
scene->mMeshes[obj->mMeshIndex[i]] = obj->mMeshes[i];
|
||||||
}
|
}
|
||||||
|
@ -211,12 +220,11 @@ public:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// import the materials
|
// import the materials
|
||||||
scene->mNumMaterials = static_cast<unsigned int>(mMaterialCount);
|
scene->mNumMaterials = mMaterialCount;
|
||||||
if (scene->mNumMaterials != 0) {
|
if (scene->mNumMaterials != 0) {
|
||||||
scene->mMaterials = new aiMaterial *[scene->mNumMaterials];
|
scene->mMaterials = new aiMaterial *[scene->mNumMaterials];
|
||||||
for (auto it = mResourcesDictionnary.begin(); it != mResourcesDictionnary.end(); it++) {
|
for (auto it = mResourcesDictionnary.begin(); it != mResourcesDictionnary.end(); ++it) {
|
||||||
if (it->second->getType() == ResourceType::RT_BaseMaterials) {
|
if (it->second->getType() == ResourceType::RT_BaseMaterials) {
|
||||||
BaseMaterials *baseMaterials = static_cast<BaseMaterials *>(it->second);
|
BaseMaterials *baseMaterials = static_cast<BaseMaterials *>(it->second);
|
||||||
for (unsigned int i = 0; i < baseMaterials->mMaterials.size(); ++i) {
|
for (unsigned int i = 0; i < baseMaterials->mMaterials.size(); ++i) {
|
||||||
|
@ -228,35 +236,36 @@ public:
|
||||||
}
|
}
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
void addObjectToNode(aiNode *parent, Object *obj, aiMatrix4x4 nodeTransform) {
|
||||||
|
ai_assert(nullptr != obj);
|
||||||
|
|
||||||
void addObjectToNode(aiNode* parent, Object* obj, aiMatrix4x4 nodeTransform) {
|
|
||||||
aiNode *sceneNode = new aiNode(obj->mName);
|
aiNode *sceneNode = new aiNode(obj->mName);
|
||||||
sceneNode->mNumMeshes = static_cast<unsigned int>(obj->mMeshes.size());
|
sceneNode->mNumMeshes = static_cast<unsigned int>(obj->mMeshes.size());
|
||||||
sceneNode->mMeshes = new unsigned int[sceneNode->mNumMeshes];
|
sceneNode->mMeshes = new unsigned int[sceneNode->mNumMeshes];
|
||||||
std::copy(obj->mMeshIndex.begin(), obj->mMeshIndex.end(), sceneNode->mMeshes);
|
std::copy(obj->mMeshIndex.begin(), obj->mMeshIndex.end(), sceneNode->mMeshes);
|
||||||
|
|
||||||
sceneNode->mTransformation = nodeTransform;
|
sceneNode->mTransformation = nodeTransform;
|
||||||
|
if (nullptr != parent) {
|
||||||
parent->addChildren(1, &sceneNode);
|
parent->addChildren(1, &sceneNode);
|
||||||
|
}
|
||||||
|
|
||||||
for (size_t i = 0; i < obj->mComponents.size(); ++i) {
|
for (size_t i = 0; i < obj->mComponents.size(); ++i) {
|
||||||
Component c = obj->mComponents[i];
|
Component c = obj->mComponents[i];
|
||||||
auto it = mResourcesDictionnary.find(c.mObjectId);
|
auto it = mResourcesDictionnary.find(c.mObjectId);
|
||||||
if (it != mResourcesDictionnary.end() && it->second->getType() == ResourceType::RT_Object) {
|
if (it != mResourcesDictionnary.end() && it->second->getType() == ResourceType::RT_Object) {
|
||||||
addObjectToNode(sceneNode, static_cast<Object*>(it->second), c.mTransformation);
|
addObjectToNode(sceneNode, static_cast<Object *>(it->second), c.mTransformation);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool getNodeAttribute(const XmlNode& node, const std::string& attribute, std::string& value) {
|
bool getNodeAttribute(const XmlNode &node, const std::string &attribute, std::string &value) {
|
||||||
pugi::xml_attribute objectAttribute = node.attribute(attribute.c_str());
|
pugi::xml_attribute objectAttribute = node.attribute(attribute.c_str());
|
||||||
if (!objectAttribute.empty()) {
|
if (!objectAttribute.empty()) {
|
||||||
value = objectAttribute.as_string();
|
value = objectAttribute.as_string();
|
||||||
return true;
|
return true;
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool getNodeAttribute(const XmlNode &node, const std::string &attribute, int &value) {
|
bool getNodeAttribute(const XmlNode &node, const std::string &attribute, int &value) {
|
||||||
|
@ -265,9 +274,9 @@ private:
|
||||||
if (ret) {
|
if (ret) {
|
||||||
value = std::atoi(strValue.c_str());
|
value = std::atoi(strValue.c_str());
|
||||||
return true;
|
return true;
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
aiMatrix4x4 parseTransformMatrix(std::string matrixStr) {
|
aiMatrix4x4 parseTransformMatrix(std::string matrixStr) {
|
||||||
|
@ -287,7 +296,7 @@ private:
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (currentNumber.size() > 0) {
|
if (currentNumber.size() > 0) {
|
||||||
float f = std::stof(currentNumber);
|
const float f = std::stof(currentNumber);
|
||||||
numbers.push_back(f);
|
numbers.push_back(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -311,29 +320,26 @@ private:
|
||||||
transformMatrix.b4 = numbers[10];
|
transformMatrix.b4 = numbers[10];
|
||||||
transformMatrix.c4 = numbers[11];
|
transformMatrix.c4 = numbers[11];
|
||||||
transformMatrix.d4 = 1;
|
transformMatrix.d4 = 1;
|
||||||
|
|
||||||
return transformMatrix;
|
return transformMatrix;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ReadObject(XmlNode &node) {
|
void ReadObject(XmlNode &node) {
|
||||||
int id = -1, pid = -1, pindex = -1;
|
int id = -1, pid = -1, pindex = -1;
|
||||||
bool hasId = getNodeAttribute(node, D3MF::XmlTag::id, id);
|
bool hasId = getNodeAttribute(node, XmlTag::id, id);
|
||||||
//bool hasType = getNodeAttribute(node, D3MF::XmlTag::type, type); not used currently
|
bool hasPid = getNodeAttribute(node, XmlTag::pid, pid);
|
||||||
bool hasPid = getNodeAttribute(node, D3MF::XmlTag::pid, pid);
|
bool hasPindex = getNodeAttribute(node, XmlTag::pindex, pindex);
|
||||||
bool hasPindex = getNodeAttribute(node, D3MF::XmlTag::pindex, pindex);
|
|
||||||
|
|
||||||
std::string idStr = ai_to_string(id);
|
|
||||||
|
|
||||||
if (!hasId) {
|
if (!hasId) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Object *obj = new Object(id);
|
Object *obj = new Object(id);
|
||||||
|
|
||||||
for (XmlNode currentNode = node.first_child(); currentNode; currentNode = currentNode.next_sibling()) {
|
for (XmlNode ¤tNode : node.children()) {
|
||||||
const std::string ¤tName = currentNode.name();
|
const std::string ¤tName = currentNode.name();
|
||||||
if (currentName == D3MF::XmlTag::mesh) {
|
if (currentName == D3MF::XmlTag::mesh) {
|
||||||
auto mesh = ReadMesh(currentNode);
|
auto mesh = ReadMesh(currentNode);
|
||||||
mesh->mName.Set(idStr);
|
mesh->mName.Set(ai_to_string(id));
|
||||||
|
|
||||||
if (hasPid) {
|
if (hasPid) {
|
||||||
auto it = mResourcesDictionnary.find(pid);
|
auto it = mResourcesDictionnary.find(pid);
|
||||||
|
@ -347,8 +353,9 @@ private:
|
||||||
obj->mMeshIndex.push_back(mMeshCount);
|
obj->mMeshIndex.push_back(mMeshCount);
|
||||||
mMeshCount++;
|
mMeshCount++;
|
||||||
} else if (currentName == D3MF::XmlTag::components) {
|
} else if (currentName == D3MF::XmlTag::components) {
|
||||||
for (XmlNode currentSubNode = currentNode.first_child(); currentSubNode; currentSubNode = currentSubNode.next_sibling()) {
|
for (XmlNode ¤tSubNode : currentNode.children()) {
|
||||||
if (currentSubNode.name() == D3MF::XmlTag::component) {
|
const std::string subNodeName = currentSubNode.name();
|
||||||
|
if (subNodeName == D3MF::XmlTag::component) {
|
||||||
int objectId = -1;
|
int objectId = -1;
|
||||||
std::string componentTransformStr;
|
std::string componentTransformStr;
|
||||||
aiMatrix4x4 componentTransform;
|
aiMatrix4x4 componentTransform;
|
||||||
|
@ -356,12 +363,13 @@ private:
|
||||||
componentTransform = parseTransformMatrix(componentTransformStr);
|
componentTransform = parseTransformMatrix(componentTransformStr);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (getNodeAttribute(currentSubNode, D3MF::XmlTag::objectid, objectId))
|
if (getNodeAttribute(currentSubNode, D3MF::XmlTag::objectid, objectId)) {
|
||||||
obj->mComponents.push_back({ objectId, componentTransform });
|
obj->mComponents.push_back({ objectId, componentTransform });
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
mResourcesDictionnary.insert(std::make_pair(id, obj));
|
mResourcesDictionnary.insert(std::make_pair(id, obj));
|
||||||
}
|
}
|
||||||
|
@ -369,21 +377,20 @@ private:
|
||||||
aiMesh *ReadMesh(XmlNode &node) {
|
aiMesh *ReadMesh(XmlNode &node) {
|
||||||
aiMesh *mesh = new aiMesh();
|
aiMesh *mesh = new aiMesh();
|
||||||
|
|
||||||
for (XmlNode currentNode = node.first_child(); currentNode; currentNode = currentNode.next_sibling()) {
|
for (XmlNode ¤tNode : node.children()) {
|
||||||
const std::string ¤tName = currentNode.name();
|
const std::string currentName = currentNode.name();
|
||||||
if (currentName == D3MF::XmlTag::vertices) {
|
if (currentName == XmlTag::vertices) {
|
||||||
ImportVertices(currentNode, mesh);
|
ImportVertices(currentNode, mesh);
|
||||||
} else if (currentName == D3MF::XmlTag::triangles) {
|
} else if (currentName == XmlTag::triangles) {
|
||||||
ImportTriangles(currentNode, mesh);
|
ImportTriangles(currentNode, mesh);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return mesh;
|
return mesh;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ReadMetadata(XmlNode &node) {
|
void ReadMetadata(XmlNode &node) {
|
||||||
pugi::xml_attribute attribute = node.attribute(D3MF::XmlTag::meta_name.c_str());
|
pugi::xml_attribute attribute = node.attribute(D3MF::XmlTag::meta_name);
|
||||||
const std::string name = attribute.as_string();
|
const std::string name = attribute.as_string();
|
||||||
const std::string value = node.value();
|
const std::string value = node.value();
|
||||||
if (name.empty()) {
|
if (name.empty()) {
|
||||||
|
@ -398,9 +405,9 @@ private:
|
||||||
|
|
||||||
void ImportVertices(XmlNode &node, aiMesh *mesh) {
|
void ImportVertices(XmlNode &node, aiMesh *mesh) {
|
||||||
std::vector<aiVector3D> vertices;
|
std::vector<aiVector3D> vertices;
|
||||||
for (XmlNode currentNode = node.first_child(); currentNode; currentNode = currentNode.next_sibling()) {
|
for (XmlNode ¤tNode : node.children()) {
|
||||||
const std::string ¤tName = currentNode.name();
|
const std::string currentName = currentNode.name();
|
||||||
if (currentName == D3MF::XmlTag::vertex) {
|
if (currentName == XmlTag::vertex) {
|
||||||
vertices.push_back(ReadVertex(currentNode));
|
vertices.push_back(ReadVertex(currentNode));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -412,29 +419,28 @@ private:
|
||||||
|
|
||||||
aiVector3D ReadVertex(XmlNode &node) {
|
aiVector3D ReadVertex(XmlNode &node) {
|
||||||
aiVector3D vertex;
|
aiVector3D vertex;
|
||||||
vertex.x = ai_strtof(node.attribute(D3MF::XmlTag::x.c_str()).as_string(), nullptr);
|
vertex.x = ai_strtof(node.attribute(XmlTag::x).as_string(), nullptr);
|
||||||
vertex.y = ai_strtof(node.attribute(D3MF::XmlTag::y.c_str()).as_string(), nullptr);
|
vertex.y = ai_strtof(node.attribute(XmlTag::y).as_string(), nullptr);
|
||||||
vertex.z = ai_strtof(node.attribute(D3MF::XmlTag::z.c_str()).as_string(), nullptr);
|
vertex.z = ai_strtof(node.attribute(XmlTag::z).as_string(), nullptr);
|
||||||
|
|
||||||
return vertex;
|
return vertex;
|
||||||
}
|
}
|
||||||
|
|
||||||
void ImportTriangles(XmlNode &node, aiMesh *mesh) {
|
void ImportTriangles(XmlNode &node, aiMesh *mesh) {
|
||||||
std::vector<aiFace> faces;
|
std::vector<aiFace> faces;
|
||||||
for (XmlNode currentNode = node.first_child(); currentNode; currentNode = currentNode.next_sibling()) {
|
for (XmlNode ¤tNode : node.children()) {
|
||||||
const std::string ¤tName = currentNode.name();
|
const std::string currentName = currentNode.name();
|
||||||
if (currentName == D3MF::XmlTag::triangle) {
|
if (currentName == XmlTag::triangle) {
|
||||||
aiFace face = ReadTriangle(currentNode);
|
aiFace face = ReadTriangle(currentNode);
|
||||||
faces.push_back(face);
|
faces.push_back(face);
|
||||||
|
|
||||||
int pid = 0, p1;
|
int pid = 0, p1 = 0;
|
||||||
bool hasPid = getNodeAttribute(currentNode, D3MF::XmlTag::pid, pid);
|
bool hasPid = getNodeAttribute(currentNode, D3MF::XmlTag::pid, pid);
|
||||||
bool hasP1 = getNodeAttribute(currentNode, D3MF::XmlTag::p1, p1);
|
bool hasP1 = getNodeAttribute(currentNode, D3MF::XmlTag::p1, p1);
|
||||||
|
|
||||||
if (hasPid && hasP1) {
|
if (hasPid && hasP1) {
|
||||||
auto it = mResourcesDictionnary.find(pid);
|
auto it = mResourcesDictionnary.find(pid);
|
||||||
if (it != mResourcesDictionnary.end())
|
if (it != mResourcesDictionnary.end()) {
|
||||||
{
|
|
||||||
if (it->second->getType() == ResourceType::RT_BaseMaterials) {
|
if (it->second->getType() == ResourceType::RT_BaseMaterials) {
|
||||||
BaseMaterials *baseMaterials = static_cast<BaseMaterials *>(it->second);
|
BaseMaterials *baseMaterials = static_cast<BaseMaterials *>(it->second);
|
||||||
mesh->mMaterialIndex = baseMaterials->mMaterialIndex[p1];
|
mesh->mMaterialIndex = baseMaterials->mMaterialIndex[p1];
|
||||||
|
@ -457,9 +463,9 @@ private:
|
||||||
|
|
||||||
face.mNumIndices = 3;
|
face.mNumIndices = 3;
|
||||||
face.mIndices = new unsigned int[face.mNumIndices];
|
face.mIndices = new unsigned int[face.mNumIndices];
|
||||||
face.mIndices[0] = static_cast<unsigned int>(std::atoi(node.attribute(D3MF::XmlTag::v1.c_str()).as_string()));
|
face.mIndices[0] = static_cast<unsigned int>(std::atoi(node.attribute(XmlTag::v1).as_string()));
|
||||||
face.mIndices[1] = static_cast<unsigned int>(std::atoi(node.attribute(D3MF::XmlTag::v2.c_str()).as_string()));
|
face.mIndices[1] = static_cast<unsigned int>(std::atoi(node.attribute(XmlTag::v2).as_string()));
|
||||||
face.mIndices[2] = static_cast<unsigned int>(std::atoi(node.attribute(D3MF::XmlTag::v3.c_str()).as_string()));
|
face.mIndices[2] = static_cast<unsigned int>(std::atoi(node.attribute(XmlTag::v3).as_string()));
|
||||||
|
|
||||||
return face;
|
return face;
|
||||||
}
|
}
|
||||||
|
@ -467,14 +473,14 @@ private:
|
||||||
void ReadBaseMaterials(XmlNode &node) {
|
void ReadBaseMaterials(XmlNode &node) {
|
||||||
int id = -1;
|
int id = -1;
|
||||||
if (getNodeAttribute(node, D3MF::XmlTag::basematerials_id, id)) {
|
if (getNodeAttribute(node, D3MF::XmlTag::basematerials_id, id)) {
|
||||||
BaseMaterials* baseMaterials = new BaseMaterials(id);
|
BaseMaterials *baseMaterials = new BaseMaterials(id);
|
||||||
|
|
||||||
for (XmlNode currentNode = node.first_child(); currentNode; currentNode = currentNode.next_sibling())
|
for (XmlNode ¤tNode : node.children()) {
|
||||||
{
|
const std::string currentName = currentNode.name();
|
||||||
if (currentNode.name() == D3MF::XmlTag::basematerials_base) {
|
if (currentName == XmlTag::basematerials_base) {
|
||||||
baseMaterials->mMaterialIndex.push_back(mMaterialCount);
|
baseMaterials->mMaterialIndex.push_back(mMaterialCount);
|
||||||
baseMaterials->mMaterials.push_back(readMaterialDef(currentNode, id));
|
baseMaterials->mMaterials.push_back(readMaterialDef(currentNode, id));
|
||||||
mMaterialCount++;
|
++mMaterialCount;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -488,7 +494,7 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
//format of the color string: #RRGGBBAA or #RRGGBB (3MF Core chapter 5.1.1)
|
//format of the color string: #RRGGBBAA or #RRGGBB (3MF Core chapter 5.1.1)
|
||||||
const size_t len(strlen(color));
|
const size_t len = strlen(color);
|
||||||
if (9 != len && 7 != len) {
|
if (9 != len && 7 != len) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -517,7 +523,7 @@ private:
|
||||||
}
|
}
|
||||||
|
|
||||||
void assignDiffuseColor(XmlNode &node, aiMaterial *mat) {
|
void assignDiffuseColor(XmlNode &node, aiMaterial *mat) {
|
||||||
const char *color = node.attribute(D3MF::XmlTag::basematerials_displaycolor.c_str()).as_string();
|
const char *color = node.attribute(XmlTag::basematerials_displaycolor).as_string();
|
||||||
aiColor4D diffuse;
|
aiColor4D diffuse;
|
||||||
if (parseColor(color, diffuse)) {
|
if (parseColor(color, diffuse)) {
|
||||||
mat->AddProperty<aiColor4D>(&diffuse, 1, AI_MATKEY_COLOR_DIFFUSE);
|
mat->AddProperty<aiColor4D>(&diffuse, 1, AI_MATKEY_COLOR_DIFFUSE);
|
||||||
|
@ -531,7 +537,7 @@ private:
|
||||||
bool hasName = getNodeAttribute(node, D3MF::XmlTag::basematerials_name, name);
|
bool hasName = getNodeAttribute(node, D3MF::XmlTag::basematerials_name, name);
|
||||||
|
|
||||||
std::string stdMaterialName;
|
std::string stdMaterialName;
|
||||||
std::string strId(ai_to_string(basematerialsId));
|
const std::string strId(ai_to_string(basematerialsId));
|
||||||
stdMaterialName += "id";
|
stdMaterialName += "id";
|
||||||
stdMaterialName += strId;
|
stdMaterialName += strId;
|
||||||
stdMaterialName += "_";
|
stdMaterialName += "_";
|
||||||
|
@ -556,13 +562,15 @@ private:
|
||||||
std::string value;
|
std::string value;
|
||||||
};
|
};
|
||||||
std::vector<MetaEntry> mMetaData;
|
std::vector<MetaEntry> mMetaData;
|
||||||
std::map<unsigned int, Resource*> mResourcesDictionnary;
|
std::map<unsigned int, Resource *> mResourcesDictionnary;
|
||||||
unsigned int mMaterialCount, mMeshCount;
|
unsigned int mMaterialCount, mMeshCount;
|
||||||
XmlParser *mXmlParser;
|
XmlParser *mXmlParser;
|
||||||
};
|
};
|
||||||
|
|
||||||
} //namespace D3MF
|
} //namespace D3MF
|
||||||
|
|
||||||
|
using namespace D3MF;
|
||||||
|
|
||||||
static const aiImporterDesc desc = {
|
static const aiImporterDesc desc = {
|
||||||
"3mf Importer",
|
"3mf Importer",
|
||||||
"",
|
"",
|
||||||
|
@ -596,7 +604,7 @@ bool D3MFImporter::CanRead(const std::string &filename, IOSystem *pIOHandler, bo
|
||||||
if (!ZipArchiveIOSystem::isZipArchive(pIOHandler, filename)) {
|
if (!ZipArchiveIOSystem::isZipArchive(pIOHandler, filename)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
D3MF::D3MFOpcPackage opcPackage(pIOHandler, filename);
|
D3MFOpcPackage opcPackage(pIOHandler, filename);
|
||||||
return opcPackage.validate();
|
return opcPackage.validate();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -612,11 +620,11 @@ const aiImporterDesc *D3MFImporter::GetInfo() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
void D3MFImporter::InternReadFile(const std::string &filename, aiScene *pScene, IOSystem *pIOHandler) {
|
void D3MFImporter::InternReadFile(const std::string &filename, aiScene *pScene, IOSystem *pIOHandler) {
|
||||||
D3MF::D3MFOpcPackage opcPackage(pIOHandler, filename);
|
D3MFOpcPackage opcPackage(pIOHandler, filename);
|
||||||
|
|
||||||
XmlParser xmlParser;
|
XmlParser xmlParser;
|
||||||
if (xmlParser.parse(opcPackage.RootStream())) {
|
if (xmlParser.parse(opcPackage.RootStream())) {
|
||||||
D3MF::XmlSerializer xmlSerializer(&xmlParser);
|
XmlSerializer xmlSerializer(&xmlParser);
|
||||||
xmlSerializer.ImportXml(pScene);
|
xmlSerializer.ImportXml(pScene);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -47,9 +47,9 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
namespace Assimp {
|
namespace Assimp {
|
||||||
|
|
||||||
|
/// @brief The 3MF-importer class.
|
||||||
class D3MFImporter : public BaseImporter {
|
class D3MFImporter : public BaseImporter {
|
||||||
public:
|
public:
|
||||||
// BaseImporter interface
|
|
||||||
D3MFImporter();
|
D3MFImporter();
|
||||||
~D3MFImporter();
|
~D3MFImporter();
|
||||||
bool CanRead(const std::string &pFile, IOSystem *pIOHandler, bool checkSig) const;
|
bool CanRead(const std::string &pFile, IOSystem *pIOHandler, bool checkSig) const;
|
||||||
|
|
|
@ -103,9 +103,9 @@ public:
|
||||||
std::string name = currentNode.name();
|
std::string name = currentNode.name();
|
||||||
if (name == "Relationship") {
|
if (name == "Relationship") {
|
||||||
OpcPackageRelationshipPtr relPtr(new OpcPackageRelationship());
|
OpcPackageRelationshipPtr relPtr(new OpcPackageRelationship());
|
||||||
relPtr->id = currentNode.attribute(XmlTag::RELS_ATTRIB_ID.c_str()).as_string();
|
relPtr->id = currentNode.attribute(XmlTag::RELS_ATTRIB_ID).as_string();
|
||||||
relPtr->type = currentNode.attribute(XmlTag::RELS_ATTRIB_TYPE.c_str()).as_string();
|
relPtr->type = currentNode.attribute(XmlTag::RELS_ATTRIB_TYPE).as_string();
|
||||||
relPtr->target = currentNode.attribute(XmlTag::RELS_ATTRIB_TARGET.c_str()).as_string();
|
relPtr->target = currentNode.attribute(XmlTag::RELS_ATTRIB_TARGET).as_string();
|
||||||
if (validateRels(relPtr)) {
|
if (validateRels(relPtr)) {
|
||||||
m_relationShips.push_back(relPtr);
|
m_relationShips.push_back(relPtr);
|
||||||
}
|
}
|
||||||
|
|
|
@ -517,10 +517,6 @@ bool AMFImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bool p
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void AMFImporter::GetExtensionList(std::set<std::string> &pExtensionList) {
|
|
||||||
pExtensionList.insert("amf");
|
|
||||||
}
|
|
||||||
|
|
||||||
const aiImporterDesc *AMFImporter::GetInfo() const {
|
const aiImporterDesc *AMFImporter::GetInfo() const {
|
||||||
return &Description;
|
return &Description;
|
||||||
}
|
}
|
||||||
|
|
|
@ -277,7 +277,6 @@ public:
|
||||||
void ParseHelper_Node_Enter(AMFNodeElementBase *child);
|
void ParseHelper_Node_Enter(AMFNodeElementBase *child);
|
||||||
void ParseHelper_Node_Exit();
|
void ParseHelper_Node_Exit();
|
||||||
bool CanRead(const std::string &pFile, IOSystem *pIOHandler, bool pCheckSig) const;
|
bool CanRead(const std::string &pFile, IOSystem *pIOHandler, bool pCheckSig) const;
|
||||||
void GetExtensionList(std::set<std::string> &pExtensionList);
|
|
||||||
void InternReadFile(const std::string &pFile, aiScene *pScene, IOSystem *pIOHandler);
|
void InternReadFile(const std::string &pFile, aiScene *pScene, IOSystem *pIOHandler);
|
||||||
const aiImporterDesc *GetInfo() const;
|
const aiImporterDesc *GetInfo() const;
|
||||||
bool Find_NodeElement(const std::string &pID, const AMFNodeElementBase::EType pType, AMFNodeElementBase **pNodeElement) const;
|
bool Find_NodeElement(const std::string &pID, const AMFNodeElementBase::EType pType, AMFNodeElementBase **pNodeElement) const;
|
||||||
|
|
|
@ -428,10 +428,10 @@ void AMFImporter::Postprocess_BuildMeshSet(const AMFMesh &pNodeElement, const st
|
||||||
|
|
||||||
if (pBiggerThan != nullptr) {
|
if (pBiggerThan != nullptr) {
|
||||||
bool found = false;
|
bool found = false;
|
||||||
|
const size_t biggerThan = *pBiggerThan;
|
||||||
for (const SComplexFace &face : pFaceList) {
|
for (const SComplexFace &face : pFaceList) {
|
||||||
for (size_t idx_vert = 0; idx_vert < face.Face.mNumIndices; idx_vert++) {
|
for (size_t idx_vert = 0; idx_vert < face.Face.mNumIndices; idx_vert++) {
|
||||||
if (face.Face.mIndices[idx_vert] > *pBiggerThan) {
|
if (face.Face.mIndices[idx_vert] > biggerThan) {
|
||||||
rv = face.Face.mIndices[idx_vert];
|
rv = face.Face.mIndices[idx_vert];
|
||||||
found = true;
|
found = true;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -132,12 +132,6 @@ bool BlenderImporter::CanRead(const std::string &pFile, IOSystem *pIOHandler, bo
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
|
||||||
// List all extensions handled by this loader
|
|
||||||
void BlenderImporter::GetExtensionList(std::set<std::string> &app) {
|
|
||||||
app.insert("blend");
|
|
||||||
}
|
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
// Loader registry entry
|
// Loader registry entry
|
||||||
const aiImporterDesc *BlenderImporter::GetInfo() const {
|
const aiImporterDesc *BlenderImporter::GetInfo() const {
|
||||||
|
|
|
@ -110,7 +110,6 @@ public:
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
const aiImporterDesc* GetInfo () const;
|
const aiImporterDesc* GetInfo () const;
|
||||||
void GetExtensionList(std::set<std::string>& app);
|
|
||||||
void SetupProperties(const Importer* pImp);
|
void SetupProperties(const Importer* pImp);
|
||||||
void InternReadFile( const std::string& pFile, aiScene* pScene, IOSystem* pIOHandler);
|
void InternReadFile( const std::string& pFile, aiScene* pScene, IOSystem* pIOHandler);
|
||||||
void ParseBlendFile(Blender::FileDatabase& out, std::shared_ptr<IOStream> stream);
|
void ParseBlendFile(Blender::FileDatabase& out, std::shared_ptr<IOStream> stream);
|
||||||
|
|
|
@ -75,7 +75,7 @@ static const aiImporterDesc desc = {
|
||||||
3,
|
3,
|
||||||
1,
|
1,
|
||||||
5,
|
5,
|
||||||
"dae zae"
|
"dae xml zae"
|
||||||
};
|
};
|
||||||
|
|
||||||
static const float kMillisecondsFromSeconds = 1000.f;
|
static const float kMillisecondsFromSeconds = 1000.f;
|
||||||
|
|
|
@ -1789,13 +1789,13 @@ void FBXExporter::WriteObjects ()
|
||||||
blendchannel_uid, blendshape_name + FBX::SEPARATOR + "SubDeformer", "BlendShapeChannel"
|
blendchannel_uid, blendshape_name + FBX::SEPARATOR + "SubDeformer", "BlendShapeChannel"
|
||||||
);
|
);
|
||||||
sdnode.AddChild("Version", int32_t(100));
|
sdnode.AddChild("Version", int32_t(100));
|
||||||
sdnode.AddChild("DeformPercent", int32_t(100));
|
sdnode.AddChild("DeformPercent", float_t(0.0));
|
||||||
FBX::Node p("Properties70");
|
FBX::Node p("Properties70");
|
||||||
p.AddP70numberA("DeformPercent", 100.);
|
p.AddP70numberA("DeformPercent", 0.0);
|
||||||
sdnode.AddChild(p);
|
sdnode.AddChild(p);
|
||||||
// TODO: Normally just one weight per channel, adding stub for later development
|
// TODO: Normally just one weight per channel, adding stub for later development
|
||||||
std::vector<float>fFullWeights;
|
std::vector<float>fFullWeights;
|
||||||
fFullWeights.push_back(0.);
|
fFullWeights.push_back(100.);
|
||||||
sdnode.AddChild("FullWeights", fFullWeights);
|
sdnode.AddChild("FullWeights", fFullWeights);
|
||||||
sdnode.Dump(outstream, binary, indent);
|
sdnode.Dump(outstream, binary, indent);
|
||||||
|
|
||||||
|
|
|
@ -95,10 +95,9 @@ static const aiImporterDesc desc = {
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
#ifdef M3D_ASCII
|
|
||||||
"m3d a3d"
|
|
||||||
#else
|
|
||||||
"m3d"
|
"m3d"
|
||||||
|
#ifdef M3D_ASCII
|
||||||
|
" a3d"
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -75,7 +75,7 @@ static const aiImporterDesc desc = {
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
"pk3"
|
"bsp pk3"
|
||||||
};
|
};
|
||||||
|
|
||||||
namespace Assimp {
|
namespace Assimp {
|
||||||
|
|
|
@ -167,10 +167,6 @@ bool X3DImporter::CanRead( const std::string &pFile, IOSystem * /*pIOHandler*/,
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void X3DImporter::GetExtensionList( std::set<std::string> &extensionList ) {
|
|
||||||
extensionList.insert("x3d");
|
|
||||||
}
|
|
||||||
|
|
||||||
void X3DImporter::InternReadFile( const std::string &pFile, aiScene *pScene, IOSystem *pIOHandler ) {
|
void X3DImporter::InternReadFile( const std::string &pFile, aiScene *pScene, IOSystem *pIOHandler ) {
|
||||||
std::shared_ptr<IOStream> stream(pIOHandler->Open(pFile, "rb"));
|
std::shared_ptr<IOStream> stream(pIOHandler->Open(pFile, "rb"));
|
||||||
if (!stream) {
|
if (!stream) {
|
||||||
|
|
|
@ -307,7 +307,6 @@ public:
|
||||||
/// \param [in] pIOHandler - pointer to IO helper object.
|
/// \param [in] pIOHandler - pointer to IO helper object.
|
||||||
void ParseFile(const std::string &pFile, IOSystem *pIOHandler);
|
void ParseFile(const std::string &pFile, IOSystem *pIOHandler);
|
||||||
bool CanRead(const std::string &pFile, IOSystem *pIOHandler, bool pCheckSig) const;
|
bool CanRead(const std::string &pFile, IOSystem *pIOHandler, bool pCheckSig) const;
|
||||||
void GetExtensionList(std::set<std::string> &pExtensionList);
|
|
||||||
void InternReadFile(const std::string &pFile, aiScene *pScene, IOSystem *pIOHandler);
|
void InternReadFile(const std::string &pFile, aiScene *pScene, IOSystem *pIOHandler);
|
||||||
const aiImporterDesc *GetInfo() const;
|
const aiImporterDesc *GetInfo() const;
|
||||||
void Clear();
|
void Clear();
|
||||||
|
|
|
@ -47,7 +47,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
namespace Assimp {
|
namespace Assimp {
|
||||||
|
|
||||||
CIOStreamWrapper::~CIOStreamWrapper(void) {
|
CIOStreamWrapper::~CIOStreamWrapper() {
|
||||||
/* Various places depend on this destructor to close the file */
|
/* Various places depend on this destructor to close the file */
|
||||||
if (mFile) {
|
if (mFile) {
|
||||||
mIO->mFileSystem->CloseProc(mIO->mFileSystem, mFile);
|
mIO->mFileSystem->CloseProc(mIO->mFileSystem, mFile);
|
||||||
|
@ -78,7 +78,7 @@ aiReturn CIOStreamWrapper::Seek(size_t pOffset,
|
||||||
}
|
}
|
||||||
|
|
||||||
// ...................................................................
|
// ...................................................................
|
||||||
size_t CIOStreamWrapper::Tell(void) const {
|
size_t CIOStreamWrapper::Tell() const {
|
||||||
return mFile->TellProc(mFile);
|
return mFile->TellProc(mFile);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -97,7 +97,7 @@ void BaseImporter::UpdateImporterScale(Importer *pImp) {
|
||||||
// Set active scaling
|
// Set active scaling
|
||||||
pImp->SetPropertyFloat(AI_CONFIG_APP_SCALE_KEY, static_cast<float>(activeScale));
|
pImp->SetPropertyFloat(AI_CONFIG_APP_SCALE_KEY, static_cast<float>(activeScale));
|
||||||
|
|
||||||
ASSIMP_LOG_DEBUG_F("UpdateImporterScale scale set: %f", activeScale);
|
ASSIMP_LOG_DEBUG_F("UpdateImporterScale scale set: ", activeScale);
|
||||||
}
|
}
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
|
|
|
@ -48,6 +48,7 @@ corresponding preprocessor flag to selectively disable formats.
|
||||||
|
|
||||||
#include <assimp/BaseImporter.h>
|
#include <assimp/BaseImporter.h>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <cstdlib>
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
// Importers
|
// Importers
|
||||||
|
@ -205,6 +206,16 @@ namespace Assimp {
|
||||||
|
|
||||||
// ------------------------------------------------------------------------------------------------
|
// ------------------------------------------------------------------------------------------------
|
||||||
void GetImporterInstanceList(std::vector<BaseImporter *> &out) {
|
void GetImporterInstanceList(std::vector<BaseImporter *> &out) {
|
||||||
|
|
||||||
|
// Some importers may be unimplemented or otherwise unsuitable for general use
|
||||||
|
// in their current state. Devs can set ASSIMP_ENABLE_DEV_IMPORTERS in their
|
||||||
|
// local environment to enable them, otherwise they're left out of the registry.
|
||||||
|
const char *envStr = std::getenv("ASSIMP_ENABLE_DEV_IMPORTERS");
|
||||||
|
bool devImportersEnabled = envStr && strcmp(envStr, "0");
|
||||||
|
|
||||||
|
// Ensure no unused var warnings if all uses are #ifndef'd away below:
|
||||||
|
(void)devImportersEnabled;
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
// Add an instance of each worker class here
|
// Add an instance of each worker class here
|
||||||
// (register_new_importers_here)
|
// (register_new_importers_here)
|
||||||
|
@ -354,7 +365,9 @@ void GetImporterInstanceList(std::vector<BaseImporter *> &out) {
|
||||||
out.push_back(new D3MFImporter());
|
out.push_back(new D3MFImporter());
|
||||||
#endif
|
#endif
|
||||||
#ifndef ASSIMP_BUILD_NO_X3D_IMPORTER
|
#ifndef ASSIMP_BUILD_NO_X3D_IMPORTER
|
||||||
|
if (devImportersEnabled) { // https://github.com/assimp/assimp/issues/3647
|
||||||
out.push_back(new X3DImporter());
|
out.push_back(new X3DImporter());
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
#ifndef ASSIMP_BUILD_NO_MMD_IMPORTER
|
#ifndef ASSIMP_BUILD_NO_MMD_IMPORTER
|
||||||
out.push_back(new MMDImporter());
|
out.push_back(new MMDImporter());
|
||||||
|
|
|
@ -44,7 +44,7 @@
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
#include <io.h>
|
#include <io.h>
|
||||||
#pragma warning(disable : 4706)
|
#pragma warning(disable : 4706 4244 4028)
|
||||||
|
|
||||||
#define ftruncate(fd, sz) (-(_chsize_s((fd), (sz)) != 0))
|
#define ftruncate(fd, sz) (-(_chsize_s((fd), (sz)) != 0))
|
||||||
#define fileno _fileno
|
#define fileno _fileno
|
||||||
|
|
|
@ -4,7 +4,6 @@ Open Asset Import Library (assimp)
|
||||||
|
|
||||||
Copyright (c) 2006-2021, assimp team
|
Copyright (c) 2006-2021, assimp team
|
||||||
|
|
||||||
|
|
||||||
All rights reserved.
|
All rights reserved.
|
||||||
|
|
||||||
Redistribution and use of this software in source and binary forms,
|
Redistribution and use of this software in source and binary forms,
|
||||||
|
@ -55,6 +54,7 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include <cstdlib>
|
#include <cstdlib>
|
||||||
#include <locale>
|
#include <locale>
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
#include <iomanip>
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
#define AI_SIZEFMT "%Iu"
|
#define AI_SIZEFMT "%Iu"
|
||||||
|
@ -177,7 +177,7 @@ AI_FORCE_INLINE std::string ai_rgba2hex(int r, int g, int b, int a, bool with_he
|
||||||
if (with_head) {
|
if (with_head) {
|
||||||
ss << "#";
|
ss << "#";
|
||||||
}
|
}
|
||||||
ss << std::hex << (r << 24 | g << 16 | b << 8 | a);
|
ss << std::hex << std::setfill('0') << std::setw(8) << (r << 24 | g << 16 | b << 8 | a);
|
||||||
|
|
||||||
return ss.str();
|
return ss.str();
|
||||||
}
|
}
|
||||||
|
@ -249,4 +249,4 @@ AI_FORCE_INLINE std::string ai_str_toupper(const std::string &in) {
|
||||||
return out;
|
return out;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif
|
#endif // INCLUDED_AI_STRINGUTILS_H
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#-*- coding: utf-8 -*-
|
#-*- coding: utf-8 -*-
|
||||||
|
|
||||||
from ctypes import POINTER, c_void_p, c_uint, c_char, c_float, Structure, c_char_p, c_double, c_ubyte, c_size_t, c_uint32
|
from ctypes import POINTER, c_void_p, c_uint, c_char, c_float, Structure, c_double, c_ubyte, c_size_t, c_uint32
|
||||||
|
|
||||||
|
|
||||||
class Vector2D(Structure):
|
class Vector2D(Structure):
|
||||||
|
@ -1121,7 +1121,7 @@ class Scene(Structure):
|
||||||
("mMetadata", POINTER(Metadata)),
|
("mMetadata", POINTER(Metadata)),
|
||||||
|
|
||||||
# Internal data, do not touch
|
# Internal data, do not touch
|
||||||
("mPrivate", c_char_p),
|
("mPrivate", POINTER(c_char)),
|
||||||
]
|
]
|
||||||
|
|
||||||
assimp_structs_as_tuple = (Matrix4x4,
|
assimp_structs_as_tuple = (Matrix4x4,
|
||||||
|
|
Binary file not shown.
|
@ -42,9 +42,10 @@ OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
#include <assimp/StringUtils.h>
|
#include <assimp/StringUtils.h>
|
||||||
|
|
||||||
class utStringUtils : public ::testing::Test {
|
class utStringUtils : public ::testing::Test {
|
||||||
|
// empty
|
||||||
};
|
};
|
||||||
|
|
||||||
TEST_F( utStringUtils, to_string_Test ) {
|
TEST_F(utStringUtils, to_string_Test ) {
|
||||||
std::string res = ai_to_string( 1 );
|
std::string res = ai_to_string( 1 );
|
||||||
EXPECT_EQ( res, "1" );
|
EXPECT_EQ( res, "1" );
|
||||||
|
|
||||||
|
@ -52,7 +53,7 @@ TEST_F( utStringUtils, to_string_Test ) {
|
||||||
EXPECT_EQ( res, "1" );
|
EXPECT_EQ( res, "1" );
|
||||||
}
|
}
|
||||||
|
|
||||||
TEST_F( utStringUtils, ai_strtofTest ) {
|
TEST_F(utStringUtils, ai_strtofTest ) {
|
||||||
float res = ai_strtof( nullptr, nullptr );
|
float res = ai_strtof( nullptr, nullptr );
|
||||||
EXPECT_FLOAT_EQ( res, 0.0f );
|
EXPECT_FLOAT_EQ( res, 0.0f );
|
||||||
|
|
||||||
|
@ -66,3 +67,11 @@ TEST_F( utStringUtils, ai_strtofTest ) {
|
||||||
res = ai_strtof( begin, end );
|
res = ai_strtof( begin, end );
|
||||||
EXPECT_FLOAT_EQ( res, 200.0f );
|
EXPECT_FLOAT_EQ( res, 200.0f );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST_F(utStringUtils, ai_rgba2hexTest) {
|
||||||
|
std::string result;
|
||||||
|
result = ai_rgba2hex(255, 255, 255, 255, true);
|
||||||
|
EXPECT_EQ(result, "#ffffffff");
|
||||||
|
result = ai_rgba2hex(0, 0, 0, 0, false);
|
||||||
|
EXPECT_EQ(result, "00000000");
|
||||||
|
}
|
||||||
|
|
|
@ -130,10 +130,11 @@ int SaveAsBMP(FILE *file, const aiTexel *data, unsigned int width, unsigned int
|
||||||
s[0] = t->b;
|
s[0] = t->b;
|
||||||
s[1] = t->g;
|
s[1] = t->g;
|
||||||
s[2] = t->r;
|
s[2] = t->r;
|
||||||
if (4 == numc)
|
if (4 == numc) {
|
||||||
s[3] = t->a;
|
s[3] = t->a;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
BITMAPFILEHEADER header;
|
BITMAPFILEHEADER header;
|
||||||
header.bfType = 'B' | (int('M') << 8u);
|
header.bfType = 'B' | (int('M') << 8u);
|
||||||
|
@ -296,7 +297,7 @@ int Assimp_Extract(const char *const *params, unsigned int num) {
|
||||||
|
|
||||||
// check whether the requested texture is existing
|
// check whether the requested texture is existing
|
||||||
if (texIdx >= scene->mNumTextures) {
|
if (texIdx >= scene->mNumTextures) {
|
||||||
::printf("assimp extract: Texture %i requested, but there are just %i textures\n",
|
::printf("assimp extract: Texture %u requested, but there are just %i textures\n",
|
||||||
texIdx, scene->mNumTextures);
|
texIdx, scene->mNumTextures);
|
||||||
return AssimpCmdExtractError::TextureIndexIsOutOfRange;
|
return AssimpCmdExtractError::TextureIndexIsOutOfRange;
|
||||||
}
|
}
|
||||||
|
@ -325,7 +326,7 @@ int Assimp_Extract(const char *const *params, unsigned int num) {
|
||||||
// if the texture is a compressed one, we'll export
|
// if the texture is a compressed one, we'll export
|
||||||
// it to its native file format
|
// it to its native file format
|
||||||
if (!tex->mHeight) {
|
if (!tex->mHeight) {
|
||||||
printf("assimp extract: Texture %i is compressed (%s). Writing native file format.\n",
|
printf("assimp extract: Texture %u is compressed (%s). Writing native file format.\n",
|
||||||
i, tex->achFormatHint);
|
i, tex->achFormatHint);
|
||||||
|
|
||||||
// modify file extension
|
// modify file extension
|
||||||
|
@ -350,7 +351,7 @@ int Assimp_Extract(const char *const *params, unsigned int num) {
|
||||||
}
|
}
|
||||||
::fclose(p);
|
::fclose(p);
|
||||||
|
|
||||||
printf("assimp extract: Wrote texture %i to %s\n", i, out_cpy.c_str());
|
printf("assimp extract: Wrote texture %u to %s\n", i, out_cpy.c_str());
|
||||||
if (texIdx != 0xffffffff) {
|
if (texIdx != 0xffffffff) {
|
||||||
return m;
|
return m;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue