fix compiler warning.

pull/3012/head
kimkulling 2020-03-19 15:25:34 +01:00
parent 4de4c34fb2
commit 9ba014739a
2 changed files with 502 additions and 557 deletions

View File

@ -16,74 +16,63 @@
using namespace std; using namespace std;
namespace Assimp namespace Assimp {
{
void ExportSceneX3D(const char* pFile, IOSystem* pIOSystem, const aiScene* pScene, const ExportProperties* pProperties) void ExportSceneX3D(const char *pFile, IOSystem *pIOSystem, const aiScene *pScene, const ExportProperties *pProperties) {
{
X3DExporter exporter(pFile, pIOSystem, pScene, pProperties); X3DExporter exporter(pFile, pIOSystem, pScene, pProperties);
} }
}// namespace Assimp } // namespace Assimp
namespace Assimp namespace Assimp {
{
void X3DExporter::IndentationStringSet(const size_t pNewLevel) void X3DExporter::IndentationStringSet(const size_t pNewLevel) {
{ if (pNewLevel > mIndentationString.size()) {
if(pNewLevel > mIndentationString.size()) if (pNewLevel > mIndentationString.capacity()) mIndentationString.reserve(pNewLevel + 1);
{
if(pNewLevel > mIndentationString.capacity()) mIndentationString.reserve(pNewLevel + 1);
for(size_t i = 0, i_e = pNewLevel - mIndentationString.size(); i < i_e; i++) mIndentationString.push_back('\t'); for (size_t i = 0, i_e = pNewLevel - mIndentationString.size(); i < i_e; i++)
} mIndentationString.push_back('\t');
else if(pNewLevel < mIndentationString.size()) } else if (pNewLevel < mIndentationString.size()) {
{
mIndentationString.resize(pNewLevel); mIndentationString.resize(pNewLevel);
} }
} }
void X3DExporter::XML_Write(const string& pData) void X3DExporter::XML_Write(const string &pData) {
{ if (pData.size() == 0) return;
if(pData.size() == 0) return; if (mOutFile->Write((void *)pData.data(), pData.length(), 1) != 1) throw DeadlyExportError("Failed to write scene data!");
if(mOutFile->Write((void*)pData.data(), pData.length(), 1) != 1) throw DeadlyExportError("Failed to write scene data!");
} }
aiMatrix4x4 X3DExporter::Matrix_GlobalToCurrent(const aiNode& pNode) const aiMatrix4x4 X3DExporter::Matrix_GlobalToCurrent(const aiNode &pNode) const {
{ aiNode *cur_node;
aiNode* cur_node; std::list<aiMatrix4x4> matr;
std::list<aiMatrix4x4> matr; aiMatrix4x4 out_matr;
aiMatrix4x4 out_matr;
// starting walk from current element to root // starting walk from current element to root
matr.push_back(pNode.mTransformation); matr.push_back(pNode.mTransformation);
cur_node = pNode.mParent; cur_node = pNode.mParent;
if(cur_node != nullptr) if (cur_node != nullptr) {
{ do {
do
{
matr.push_back(cur_node->mTransformation); matr.push_back(cur_node->mTransformation);
cur_node = cur_node->mParent; cur_node = cur_node->mParent;
} while(cur_node != nullptr); } while (cur_node != nullptr);
} }
// multiplicate all matrices in reverse order // multiplicate all matrices in reverse order
for(std::list<aiMatrix4x4>::reverse_iterator rit = matr.rbegin(); rit != matr.rend(); ++rit) out_matr = out_matr * (*rit); for (std::list<aiMatrix4x4>::reverse_iterator rit = matr.rbegin(); rit != matr.rend(); ++rit)
out_matr = out_matr * (*rit);
return out_matr; return out_matr;
} }
void X3DExporter::AttrHelper_FloatToString(const float pValue, std::string& pTargetString) void X3DExporter::AttrHelper_FloatToString(const float pValue, std::string &pTargetString) {
{
pTargetString = to_string(pValue); pTargetString = to_string(pValue);
AttrHelper_CommaToPoint(pTargetString); AttrHelper_CommaToPoint(pTargetString);
} }
void X3DExporter::AttrHelper_Vec3DArrToString(const aiVector3D* pArray, const size_t pArray_Size, string& pTargetString) void X3DExporter::AttrHelper_Vec3DArrToString(const aiVector3D *pArray, const size_t pArray_Size, string &pTargetString) {
{
pTargetString.clear(); pTargetString.clear();
pTargetString.reserve(pArray_Size * 6);// (Number + space) * 3. pTargetString.reserve(pArray_Size * 6); // (Number + space) * 3.
for(size_t idx = 0; idx < pArray_Size; idx++) for (size_t idx = 0; idx < pArray_Size; idx++)
pTargetString.append(to_string(pArray[idx].x) + " " + to_string(pArray[idx].y) + " " + to_string(pArray[idx].z) + " "); pTargetString.append(to_string(pArray[idx].x) + " " + to_string(pArray[idx].y) + " " + to_string(pArray[idx].z) + " ");
// remove last space symbol. // remove last space symbol.
@ -91,11 +80,10 @@ void X3DExporter::AttrHelper_Vec3DArrToString(const aiVector3D* pArray, const si
AttrHelper_CommaToPoint(pTargetString); AttrHelper_CommaToPoint(pTargetString);
} }
void X3DExporter::AttrHelper_Vec2DArrToString(const aiVector2D* pArray, const size_t pArray_Size, std::string& pTargetString) void X3DExporter::AttrHelper_Vec2DArrToString(const aiVector2D *pArray, const size_t pArray_Size, std::string &pTargetString) {
{
pTargetString.clear(); pTargetString.clear();
pTargetString.reserve(pArray_Size * 4);// (Number + space) * 2. pTargetString.reserve(pArray_Size * 4); // (Number + space) * 2.
for(size_t idx = 0; idx < pArray_Size; idx++) for (size_t idx = 0; idx < pArray_Size; idx++)
pTargetString.append(to_string(pArray[idx].x) + " " + to_string(pArray[idx].y) + " "); pTargetString.append(to_string(pArray[idx].x) + " " + to_string(pArray[idx].y) + " ");
// remove last space symbol. // remove last space symbol.
@ -103,11 +91,10 @@ void X3DExporter::AttrHelper_Vec2DArrToString(const aiVector2D* pArray, const si
AttrHelper_CommaToPoint(pTargetString); AttrHelper_CommaToPoint(pTargetString);
} }
void X3DExporter::AttrHelper_Vec3DAsVec2fArrToString(const aiVector3D* pArray, const size_t pArray_Size, string& pTargetString) void X3DExporter::AttrHelper_Vec3DAsVec2fArrToString(const aiVector3D *pArray, const size_t pArray_Size, string &pTargetString) {
{
pTargetString.clear(); pTargetString.clear();
pTargetString.reserve(pArray_Size * 4);// (Number + space) * 2. pTargetString.reserve(pArray_Size * 4); // (Number + space) * 2.
for(size_t idx = 0; idx < pArray_Size; idx++) for (size_t idx = 0; idx < pArray_Size; idx++)
pTargetString.append(to_string(pArray[idx].x) + " " + to_string(pArray[idx].y) + " "); pTargetString.append(to_string(pArray[idx].x) + " " + to_string(pArray[idx].y) + " ");
// remove last space symbol. // remove last space symbol.
@ -115,11 +102,10 @@ void X3DExporter::AttrHelper_Vec3DAsVec2fArrToString(const aiVector3D* pArray, c
AttrHelper_CommaToPoint(pTargetString); AttrHelper_CommaToPoint(pTargetString);
} }
void X3DExporter::AttrHelper_Col4DArrToString(const aiColor4D* pArray, const size_t pArray_Size, string& pTargetString) void X3DExporter::AttrHelper_Col4DArrToString(const aiColor4D *pArray, const size_t pArray_Size, string &pTargetString) {
{
pTargetString.clear(); pTargetString.clear();
pTargetString.reserve(pArray_Size * 8);// (Number + space) * 4. pTargetString.reserve(pArray_Size * 8); // (Number + space) * 4.
for(size_t idx = 0; idx < pArray_Size; idx++) for (size_t idx = 0; idx < pArray_Size; idx++)
pTargetString.append(to_string(pArray[idx].r) + " " + to_string(pArray[idx].g) + " " + to_string(pArray[idx].b) + " " + pTargetString.append(to_string(pArray[idx].r) + " " + to_string(pArray[idx].g) + " " + to_string(pArray[idx].b) + " " +
to_string(pArray[idx].a) + " "); to_string(pArray[idx].a) + " ");
@ -128,11 +114,10 @@ void X3DExporter::AttrHelper_Col4DArrToString(const aiColor4D* pArray, const siz
AttrHelper_CommaToPoint(pTargetString); AttrHelper_CommaToPoint(pTargetString);
} }
void X3DExporter::AttrHelper_Col3DArrToString(const aiColor3D* pArray, const size_t pArray_Size, std::string& pTargetString) void X3DExporter::AttrHelper_Col3DArrToString(const aiColor3D *pArray, const size_t pArray_Size, std::string &pTargetString) {
{
pTargetString.clear(); pTargetString.clear();
pTargetString.reserve(pArray_Size * 6);// (Number + space) * 3. pTargetString.reserve(pArray_Size * 6); // (Number + space) * 3.
for(size_t idx = 0; idx < pArray_Size; idx++) for (size_t idx = 0; idx < pArray_Size; idx++)
pTargetString.append(to_string(pArray[idx].r) + " " + to_string(pArray[idx].g) + " " + to_string(pArray[idx].b) + " "); pTargetString.append(to_string(pArray[idx].r) + " " + to_string(pArray[idx].g) + " " + to_string(pArray[idx].b) + " ");
// remove last space symbol. // remove last space symbol.
@ -140,56 +125,50 @@ 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;
if(pValue == pDefaultValue) return; if (pValue == pDefaultValue) return;
AttrHelper_Col3DArrToString(&pValue, 1, tstr); AttrHelper_Col3DArrToString(&pValue, 1, 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;
if(pValue == pDefaultValue) return; if (pValue == pDefaultValue) return;
AttrHelper_FloatToString(pValue, tstr); AttrHelper_FloatToString(pValue, tstr);
pList.push_back({pName, tstr}); pList.push_back({ pName, tstr });
} }
void X3DExporter::NodeHelper_OpenNode(const string& pNodeName, const size_t pTabLevel, const bool pEmptyElement, const list<SAttribute>& pAttrList) void X3DExporter::NodeHelper_OpenNode(const string &pNodeName, const size_t pTabLevel, const bool pEmptyElement, const list<SAttribute> &pAttrList) {
{
// Write indentation. // Write indentation.
IndentationStringSet(pTabLevel); IndentationStringSet(pTabLevel);
XML_Write(mIndentationString); XML_Write(mIndentationString);
// Begin of the element // Begin of the element
XML_Write("<" + pNodeName); XML_Write("<" + pNodeName);
// Write attributes // Write attributes
for(const SAttribute& attr: pAttrList) { XML_Write(" " + attr.Name + "='" + attr.Value + "'"); } for (const SAttribute &attr : pAttrList) {
XML_Write(" " + attr.Name + "='" + attr.Value + "'");
}
// End of the element // End of the element
if(pEmptyElement) if (pEmptyElement) {
{
XML_Write("/>\n"); XML_Write("/>\n");
} } else {
else
{
XML_Write(">\n"); XML_Write(">\n");
} }
} }
void X3DExporter::NodeHelper_OpenNode(const string& pNodeName, const size_t pTabLevel, const bool pEmptyElement) void X3DExporter::NodeHelper_OpenNode(const string &pNodeName, const size_t pTabLevel, const bool pEmptyElement) {
{ const list<SAttribute> attr_list;
const list<SAttribute> attr_list;
NodeHelper_OpenNode(pNodeName, pTabLevel, pEmptyElement, attr_list); NodeHelper_OpenNode(pNodeName, pTabLevel, pEmptyElement, attr_list);
} }
void X3DExporter::NodeHelper_CloseNode(const string& pNodeName, const size_t pTabLevel) void X3DExporter::NodeHelper_CloseNode(const string &pNodeName, const size_t pTabLevel) {
{
// Write indentation. // Write indentation.
IndentationStringSet(pTabLevel); IndentationStringSet(pTabLevel);
XML_Write(mIndentationString); XML_Write(mIndentationString);
@ -197,24 +176,21 @@ void X3DExporter::NodeHelper_CloseNode(const string& pNodeName, const size_t pTa
XML_Write("</" + pNodeName + ">\n"); XML_Write("</" + pNodeName + ">\n");
} }
void X3DExporter::Export_Node(const aiNode *pNode, const size_t pTabLevel) void X3DExporter::Export_Node(const aiNode *pNode, const size_t pTabLevel) {
{ bool transform = false;
bool transform = false; list<SAttribute> attr_list;
list<SAttribute> attr_list;
// In Assimp lights is stored in next way: light source store in mScene->mLights and in node tree must present aiNode with name same as // In Assimp lights is stored in next way: light source store in mScene->mLights and in node tree must present aiNode with name same as
// light source has. Considering it we must compare every aiNode name with light sources names. Why not to look where ligths is present // light source has. Considering it we must compare every aiNode name with light sources names. Why not to look where ligths is present
// and save them to fili? Because corresponding aiNode can be already written to file and we can only add information to file not to edit. // and save them to fili? Because corresponding aiNode can be already written to file and we can only add information to file not to edit.
if(CheckAndExport_Light(*pNode, pTabLevel)) return; if (CheckAndExport_Light(*pNode, pTabLevel)) return;
// Check if need DEF. // Check if need DEF.
if(pNode->mName.length) attr_list.push_back({"DEF", pNode->mName.C_Str()}); if (pNode->mName.length) attr_list.push_back({ "DEF", pNode->mName.C_Str() });
// Check if need <Transformation> node against <Group>. // Check if need <Transformation> node against <Group>.
if(!pNode->mTransformation.IsIdentity()) if (!pNode->mTransformation.IsIdentity()) {
{ auto Vector2String = [this](const aiVector3D pVector) -> string {
auto Vector2String = [this](const aiVector3D pVector) -> string
{
string tstr = to_string(pVector.x) + " " + to_string(pVector.y) + " " + to_string(pVector.z); string tstr = to_string(pVector.x) + " " + to_string(pVector.y) + " " + to_string(pVector.z);
AttrHelper_CommaToPoint(tstr); AttrHelper_CommaToPoint(tstr);
@ -222,8 +198,7 @@ list<SAttribute> attr_list;
return tstr; return tstr;
}; };
auto Rotation2String = [this](const aiVector3D pAxis, const ai_real pAngle) -> string auto Rotation2String = [this](const aiVector3D pAxis, const ai_real pAngle) -> string {
{
string tstr = to_string(pAxis.x) + " " + to_string(pAxis.y) + " " + to_string(pAxis.z) + " " + to_string(pAngle); string tstr = to_string(pAxis.x) + " " + to_string(pAxis.y) + " " + to_string(pAxis.z) + " " + to_string(pAngle);
AttrHelper_CommaToPoint(tstr); AttrHelper_CommaToPoint(tstr);
@ -237,92 +212,88 @@ list<SAttribute> attr_list;
transform = true; transform = true;
pNode->mTransformation.Decompose(scale, rotate_axis, rotate_angle, translate); pNode->mTransformation.Decompose(scale, rotate_axis, rotate_angle, translate);
// Check if values different from default // Check if values different from default
if((rotate_angle != 0) && (rotate_axis.Length() > 0)) if ((rotate_angle != 0) && (rotate_axis.Length() > 0))
attr_list.push_back({"rotation", Rotation2String(rotate_axis, rotate_angle)}); attr_list.push_back({ "rotation", Rotation2String(rotate_axis, rotate_angle) });
if(!scale.Equal({1.0,1.0,1.0})) { if (!scale.Equal({ 1.0, 1.0, 1.0 })) {
attr_list.push_back({"scale", Vector2String(scale)}); attr_list.push_back({ "scale", Vector2String(scale) });
} }
if(translate.Length() > 0) { if (translate.Length() > 0) {
attr_list.push_back({"translation", Vector2String(translate)}); attr_list.push_back({ "translation", Vector2String(translate) });
} }
} }
// Begin node if need. // Begin node if need.
if(transform) if (transform)
NodeHelper_OpenNode("Transform", pTabLevel, false, attr_list); NodeHelper_OpenNode("Transform", pTabLevel, false, attr_list);
else else
NodeHelper_OpenNode("Group", pTabLevel); NodeHelper_OpenNode("Group", pTabLevel);
// Export metadata // Export metadata
if(pNode->mMetaData != nullptr) if (pNode->mMetaData != nullptr) {
{ for (size_t idx_prop = 0; idx_prop < pNode->mMetaData->mNumProperties; idx_prop++) {
for(size_t idx_prop = 0; idx_prop < pNode->mMetaData->mNumProperties; idx_prop++) const aiString *key;
{ const aiMetadataEntry *entry;
const aiString* key;
const aiMetadataEntry* entry;
if(pNode->mMetaData->Get(idx_prop, key, entry)) if (pNode->mMetaData->Get(idx_prop, key, entry)) {
{ switch (entry->mType) {
switch(entry->mType)
{
case AI_BOOL: case AI_BOOL:
Export_MetadataBoolean(*key, *static_cast<bool*>(entry->mData), pTabLevel + 1); Export_MetadataBoolean(*key, *static_cast<bool *>(entry->mData), pTabLevel + 1);
break; break;
case AI_DOUBLE: case AI_DOUBLE:
Export_MetadataDouble(*key, *static_cast<double*>(entry->mData), pTabLevel + 1); Export_MetadataDouble(*key, *static_cast<double *>(entry->mData), pTabLevel + 1);
break; break;
case AI_FLOAT: case AI_FLOAT:
Export_MetadataFloat(*key, *static_cast<float*>(entry->mData), pTabLevel + 1); Export_MetadataFloat(*key, *static_cast<float *>(entry->mData), pTabLevel + 1);
break; break;
case AI_INT32: case AI_INT32:
Export_MetadataInteger(*key, *static_cast<int32_t*>(entry->mData), pTabLevel + 1); Export_MetadataInteger(*key, *static_cast<int32_t *>(entry->mData), pTabLevel + 1);
break; break;
case AI_AISTRING: case AI_AISTRING:
Export_MetadataString(*key, *static_cast<aiString*>(entry->mData), pTabLevel + 1); Export_MetadataString(*key, *static_cast<aiString *>(entry->mData), pTabLevel + 1);
break; break;
default: default:
LogError("Unsupported metadata type: " + to_string(entry->mType)); LogError("Unsupported metadata type: " + to_string(entry->mType));
break; break;
}// switch(entry->mType) } // switch(entry->mType)
} }
} }
}// if(pNode->mMetaData != nullptr) } // if(pNode->mMetaData != nullptr)
// Export meshes. // Export meshes.
for(size_t idx_mesh = 0; idx_mesh < pNode->mNumMeshes; idx_mesh++) Export_Mesh(pNode->mMeshes[idx_mesh], pTabLevel + 1); for (size_t idx_mesh = 0; idx_mesh < pNode->mNumMeshes; idx_mesh++)
Export_Mesh(pNode->mMeshes[idx_mesh], pTabLevel + 1);
// Export children. // Export children.
for(size_t idx_node = 0; idx_node < pNode->mNumChildren; idx_node++) Export_Node(pNode->mChildren[idx_node], pTabLevel + 1); for (size_t idx_node = 0; idx_node < pNode->mNumChildren; idx_node++)
Export_Node(pNode->mChildren[idx_node], pTabLevel + 1);
// End node if need. // End node if need.
if(transform) if (transform)
NodeHelper_CloseNode("Transform", pTabLevel); NodeHelper_CloseNode("Transform", pTabLevel);
else else
NodeHelper_CloseNode("Group", pTabLevel); NodeHelper_CloseNode("Group", pTabLevel);
} }
void X3DExporter::Export_Mesh(const size_t pIdxMesh, const size_t pTabLevel) void X3DExporter::Export_Mesh(const size_t pIdxMesh, const size_t pTabLevel) {
{ const char *NodeName_IFS = "IndexedFaceSet";
const char* NodeName_IFS = "IndexedFaceSet"; const char *NodeName_Shape = "Shape";
const char* NodeName_Shape = "Shape";
list<SAttribute> attr_list; list<SAttribute> attr_list;
aiMesh& mesh = *mScene->mMeshes[pIdxMesh];// create alias for conveniance. aiMesh &mesh = *mScene->mMeshes[pIdxMesh]; // create alias for conveniance.
// Check if mesh already defined early. // Check if mesh already defined early.
if(mDEF_Map_Mesh.find(pIdxMesh) != mDEF_Map_Mesh.end()) if (mDEF_Map_Mesh.find(pIdxMesh) != mDEF_Map_Mesh.end()) {
{
// Mesh already defined, just refer to it // Mesh already defined, just refer to it
attr_list.push_back({"USE", mDEF_Map_Mesh.at(pIdxMesh)}); attr_list.push_back({ "USE", mDEF_Map_Mesh.at(pIdxMesh) });
NodeHelper_OpenNode(NodeName_Shape, pTabLevel, true, attr_list); NodeHelper_OpenNode(NodeName_Shape, pTabLevel, true, attr_list);
return; return;
} }
string mesh_name(mesh.mName.C_Str() + string("_IDX_") + to_string(pIdxMesh));// Create mesh name string mesh_name(mesh.mName.C_Str() + string("_IDX_") + to_string(pIdxMesh)); // Create mesh name
// Define mesh name. // Define mesh name.
attr_list.push_back({"DEF", mesh_name}); attr_list.push_back({ "DEF", mesh_name });
mDEF_Map_Mesh[pIdxMesh] = mesh_name; mDEF_Map_Mesh[pIdxMesh] = mesh_name;
// //
@ -343,22 +314,20 @@ aiMesh& mesh = *mScene->mMeshes[pIdxMesh];// create alias for conveniance.
string coordIndex; string coordIndex;
// fill coordinates index. // fill coordinates index.
coordIndex.reserve(mesh.mNumVertices * 4);// Index + space + Face delimiter coordIndex.reserve(mesh.mNumVertices * 4); // Index + space + Face delimiter
for(size_t idx_face = 0; idx_face < mesh.mNumFaces; idx_face++) for (size_t idx_face = 0; idx_face < mesh.mNumFaces; idx_face++) {
{ const aiFace &face_cur = mesh.mFaces[idx_face];
const aiFace& face_cur = mesh.mFaces[idx_face];
for(size_t idx_vert = 0; idx_vert < face_cur.mNumIndices; idx_vert++) for (size_t idx_vert = 0; idx_vert < face_cur.mNumIndices; idx_vert++) {
{
coordIndex.append(to_string(face_cur.mIndices[idx_vert]) + " "); coordIndex.append(to_string(face_cur.mIndices[idx_vert]) + " ");
} }
coordIndex.append("-1 ");// face delimiter. coordIndex.append("-1 "); // face delimiter.
} }
// remove last space symbol. // remove last space symbol.
coordIndex.resize(coordIndex.length() - 1); coordIndex.resize(coordIndex.length() - 1);
attr_list.push_back({"coordIndex", coordIndex}); attr_list.push_back({ "coordIndex", coordIndex });
// create node // create node
NodeHelper_OpenNode(NodeName_IFS, pTabLevel + 1, false, attr_list); NodeHelper_OpenNode(NodeName_IFS, pTabLevel + 1, false, attr_list);
attr_list.clear(); attr_list.clear();
@ -367,33 +336,30 @@ aiMesh& mesh = *mScene->mMeshes[pIdxMesh];// create alias for conveniance.
// Export <Coordinate> // Export <Coordinate>
AttrHelper_Vec3DArrToString(mesh.mVertices, mesh.mNumVertices, attr_value); AttrHelper_Vec3DArrToString(mesh.mVertices, mesh.mNumVertices, attr_value);
attr_list.push_back({"point", attr_value}); attr_list.push_back({ "point", attr_value });
NodeHelper_OpenNode("Coordinate", pTabLevel + 2, true, attr_list); NodeHelper_OpenNode("Coordinate", pTabLevel + 2, true, attr_list);
attr_list.clear(); attr_list.clear();
// Export <ColorRGBA> // Export <ColorRGBA>
if(mesh.HasVertexColors(0)) if (mesh.HasVertexColors(0)) {
{
AttrHelper_Col4DArrToString(mesh.mColors[0], mesh.mNumVertices, attr_value); AttrHelper_Col4DArrToString(mesh.mColors[0], mesh.mNumVertices, attr_value);
attr_list.push_back({"color", attr_value}); attr_list.push_back({ "color", attr_value });
NodeHelper_OpenNode("ColorRGBA", pTabLevel + 2, true, attr_list); NodeHelper_OpenNode("ColorRGBA", pTabLevel + 2, true, attr_list);
attr_list.clear(); attr_list.clear();
} }
// Export <TextureCoordinate> // Export <TextureCoordinate>
if(mesh.HasTextureCoords(0)) if (mesh.HasTextureCoords(0)) {
{
AttrHelper_Vec3DAsVec2fArrToString(mesh.mTextureCoords[0], mesh.mNumVertices, attr_value); AttrHelper_Vec3DAsVec2fArrToString(mesh.mTextureCoords[0], mesh.mNumVertices, attr_value);
attr_list.push_back({"point", attr_value}); attr_list.push_back({ "point", attr_value });
NodeHelper_OpenNode("TextureCoordinate", pTabLevel + 2, true, attr_list); NodeHelper_OpenNode("TextureCoordinate", pTabLevel + 2, true, attr_list);
attr_list.clear(); attr_list.clear();
} }
// Export <Normal> // Export <Normal>
if(mesh.HasNormals()) if (mesh.HasNormals()) {
{
AttrHelper_Vec3DArrToString(mesh.mNormals, mesh.mNumVertices, attr_value); AttrHelper_Vec3DArrToString(mesh.mNormals, mesh.mNumVertices, attr_value);
attr_list.push_back({"vector", attr_value}); attr_list.push_back({ "vector", attr_value });
NodeHelper_OpenNode("Normal", pTabLevel + 2, true, attr_list); NodeHelper_OpenNode("Normal", pTabLevel + 2, true, attr_list);
attr_list.clear(); attr_list.clear();
} }
@ -405,30 +371,28 @@ aiMesh& mesh = *mScene->mMeshes[pIdxMesh];// create alias for conveniance.
NodeHelper_CloseNode(NodeName_Shape, pTabLevel); NodeHelper_CloseNode(NodeName_Shape, pTabLevel);
} }
void X3DExporter::Export_Material(const size_t pIdxMaterial, const size_t pTabLevel) void X3DExporter::Export_Material(const size_t pIdxMaterial, const size_t pTabLevel) {
{ const char *NodeName_A = "Appearance";
const char* NodeName_A = "Appearance";
list<SAttribute> attr_list; list<SAttribute> attr_list;
aiMaterial& material = *mScene->mMaterials[pIdxMaterial];// create alias for conveniance. aiMaterial &material = *mScene->mMaterials[pIdxMaterial]; // create alias for conveniance.
// Check if material already defined early. // Check if material already defined early.
if(mDEF_Map_Material.find(pIdxMaterial) != mDEF_Map_Material.end()) if (mDEF_Map_Material.find(pIdxMaterial) != mDEF_Map_Material.end()) {
{
// Material already defined, just refer to it // Material already defined, just refer to it
attr_list.push_back({"USE", mDEF_Map_Material.at(pIdxMaterial)}); attr_list.push_back({ "USE", mDEF_Map_Material.at(pIdxMaterial) });
NodeHelper_OpenNode(NodeName_A, pTabLevel, true, attr_list); NodeHelper_OpenNode(NodeName_A, pTabLevel, true, attr_list);
return; return;
} }
string material_name(string("_IDX_") + to_string(pIdxMaterial));// Create material name string material_name(string("_IDX_") + to_string(pIdxMaterial)); // Create material name
aiString ai_mat_name; aiString ai_mat_name;
if(material.Get(AI_MATKEY_NAME, ai_mat_name) == AI_SUCCESS) material_name.insert(0, ai_mat_name.C_Str()); if (material.Get(AI_MATKEY_NAME, ai_mat_name) == AI_SUCCESS) material_name.insert(0, ai_mat_name.C_Str());
// Define material name. // Define material name.
attr_list.push_back({"DEF", material_name}); attr_list.push_back({ "DEF", material_name });
mDEF_Map_Material[pIdxMaterial] = material_name; mDEF_Map_Material[pIdxMaterial] = material_name;
// //
@ -441,14 +405,12 @@ aiMaterial& material = *mScene->mMaterials[pIdxMaterial];// create alias for con
// "Material" node. // "Material" node.
// //
{ {
auto Color4ToAttrList = [&](const string& pAttrName, const aiColor4D& pAttrValue, const aiColor3D& pAttrDefaultValue) auto Color4ToAttrList = [&](const string &pAttrName, const aiColor4D &pAttrValue, const aiColor3D &pAttrDefaultValue) {
{
string tstr; string tstr;
if(aiColor3D(pAttrValue.r, pAttrValue.g, pAttrValue.b) != pAttrDefaultValue) if (aiColor3D(pAttrValue.r, pAttrValue.g, pAttrValue.b) != pAttrDefaultValue) {
{
AttrHelper_Col4DArrToString(&pAttrValue, 1, tstr); AttrHelper_Col4DArrToString(&pAttrValue, 1, tstr);
attr_list.push_back({pAttrName, tstr}); attr_list.push_back({ pAttrName, tstr });
} }
}; };
@ -457,36 +419,35 @@ aiMaterial& material = *mScene->mMaterials[pIdxMaterial];// create alias for con
aiColor4D color4; aiColor4D color4;
// ambientIntensity="0.2" SFFloat [inputOutput] // ambientIntensity="0.2" SFFloat [inputOutput]
if(material.Get(AI_MATKEY_COLOR_AMBIENT, color3) == AI_SUCCESS) if (material.Get(AI_MATKEY_COLOR_AMBIENT, color3) == AI_SUCCESS)
AttrHelper_FloatToAttrList(attr_list, "ambientIntensity", (color3.r + color3.g + color3.b) / 3.0f, 0.2f); AttrHelper_FloatToAttrList(attr_list, "ambientIntensity", (color3.r + color3.g + color3.b) / 3.0f, 0.2f);
else if(material.Get(AI_MATKEY_COLOR_AMBIENT, color4) == AI_SUCCESS) else if (material.Get(AI_MATKEY_COLOR_AMBIENT, color4) == AI_SUCCESS)
AttrHelper_FloatToAttrList(attr_list, "ambientIntensity", (color4.r + color4.g + color4.b) / 3.0f, 0.2f); AttrHelper_FloatToAttrList(attr_list, "ambientIntensity", (color4.r + color4.g + color4.b) / 3.0f, 0.2f);
// diffuseColor="0.8 0.8 0.8" SFColor [inputOutput] // diffuseColor="0.8 0.8 0.8" SFColor [inputOutput]
if(material.Get(AI_MATKEY_COLOR_DIFFUSE, color3) == AI_SUCCESS) if (material.Get(AI_MATKEY_COLOR_DIFFUSE, color3) == AI_SUCCESS)
AttrHelper_Color3ToAttrList(attr_list, "diffuseColor", color3, aiColor3D(0.8f, 0.8f, 0.8f)); AttrHelper_Color3ToAttrList(attr_list, "diffuseColor", color3, aiColor3D(0.8f, 0.8f, 0.8f));
else if(material.Get(AI_MATKEY_COLOR_DIFFUSE, color4) == AI_SUCCESS) else if (material.Get(AI_MATKEY_COLOR_DIFFUSE, color4) == AI_SUCCESS)
Color4ToAttrList("diffuseColor", color4, aiColor3D(0.8f, 0.8f, 0.8f)); Color4ToAttrList("diffuseColor", color4, aiColor3D(0.8f, 0.8f, 0.8f));
// emissiveColor="0 0 0" SFColor [inputOutput] // emissiveColor="0 0 0" SFColor [inputOutput]
if(material.Get(AI_MATKEY_COLOR_EMISSIVE, color3) == AI_SUCCESS) if (material.Get(AI_MATKEY_COLOR_EMISSIVE, color3) == AI_SUCCESS)
AttrHelper_Color3ToAttrList(attr_list, "emissiveColor", color3, aiColor3D(0, 0, 0)); AttrHelper_Color3ToAttrList(attr_list, "emissiveColor", color3, aiColor3D(0, 0, 0));
else if(material.Get(AI_MATKEY_COLOR_EMISSIVE, color4) == AI_SUCCESS) else if (material.Get(AI_MATKEY_COLOR_EMISSIVE, color4) == AI_SUCCESS)
Color4ToAttrList("emissiveColor", color4, aiColor3D(0, 0, 0)); Color4ToAttrList("emissiveColor", color4, aiColor3D(0, 0, 0));
// shininess="0.2" SFFloat [inputOutput] // shininess="0.2" SFFloat [inputOutput]
if(material.Get(AI_MATKEY_SHININESS, tvalf) == AI_SUCCESS) AttrHelper_FloatToAttrList(attr_list, "shininess", tvalf, 0.2f); if (material.Get(AI_MATKEY_SHININESS, tvalf) == AI_SUCCESS) AttrHelper_FloatToAttrList(attr_list, "shininess", tvalf, 0.2f);
// specularColor="0 0 0" SFColor [inputOutput] // specularColor="0 0 0" SFColor [inputOutput]
if(material.Get(AI_MATKEY_COLOR_SPECULAR, color3) == AI_SUCCESS) if (material.Get(AI_MATKEY_COLOR_SPECULAR, color3) == AI_SUCCESS)
AttrHelper_Color3ToAttrList(attr_list, "specularColor", color3, aiColor3D(0, 0, 0)); AttrHelper_Color3ToAttrList(attr_list, "specularColor", color3, aiColor3D(0, 0, 0));
else if(material.Get(AI_MATKEY_COLOR_SPECULAR, color4) == AI_SUCCESS) else if (material.Get(AI_MATKEY_COLOR_SPECULAR, color4) == AI_SUCCESS)
Color4ToAttrList("specularColor", color4, aiColor3D(0, 0, 0)); Color4ToAttrList("specularColor", color4, aiColor3D(0, 0, 0));
// transparency="0" SFFloat [inputOutput] // transparency="0" SFFloat [inputOutput]
if(material.Get(AI_MATKEY_OPACITY, tvalf) == AI_SUCCESS) if (material.Get(AI_MATKEY_OPACITY, tvalf) == AI_SUCCESS) {
{ if (tvalf > 1) tvalf = 1;
if(tvalf > 1) tvalf = 1;
tvalf = 1.0f - tvalf; tvalf = 1.0f - tvalf;
AttrHelper_FloatToAttrList(attr_list, "transparency", tvalf, 0); AttrHelper_FloatToAttrList(attr_list, "transparency", tvalf, 0);
@ -494,58 +455,53 @@ aiMaterial& material = *mScene->mMaterials[pIdxMaterial];// create alias for con
NodeHelper_OpenNode("Material", pTabLevel + 1, true, attr_list); NodeHelper_OpenNode("Material", pTabLevel + 1, true, attr_list);
attr_list.clear(); attr_list.clear();
}// "Material" node. END. } // "Material" node. END.
// //
// "ImageTexture" node. // "ImageTexture" node.
// //
{ {
auto RepeatToAttrList = [&](const string& pAttrName, const bool pAttrValue) auto RepeatToAttrList = [&](const string &pAttrName, const bool pAttrValue) {
{ if (!pAttrValue) attr_list.push_back({ pAttrName, "false" });
if(!pAttrValue) attr_list.push_back({pAttrName, "false"});
}; };
bool tvalb; bool tvalb;
aiString tstring; aiString tstring;
// url="" MFString // url="" MFString
if(material.Get(AI_MATKEY_TEXTURE_DIFFUSE(0), tstring) == AI_SUCCESS) if (material.Get(AI_MATKEY_TEXTURE_DIFFUSE(0), tstring) == AI_SUCCESS) {
{ if (strncmp(tstring.C_Str(), AI_EMBEDDED_TEXNAME_PREFIX, strlen(AI_EMBEDDED_TEXNAME_PREFIX)) == 0)
if(strncmp(tstring.C_Str(), AI_EMBEDDED_TEXNAME_PREFIX, strlen(AI_EMBEDDED_TEXNAME_PREFIX)) == 0)
LogError("Embedded texture is not supported"); LogError("Embedded texture is not supported");
else else
attr_list.push_back({"url", string("\"") + tstring.C_Str() + "\""}); attr_list.push_back({ "url", string("\"") + tstring.C_Str() + "\"" });
} }
// repeatS="true" SFBool // repeatS="true" SFBool
if(material.Get(AI_MATKEY_MAPPINGMODE_U_DIFFUSE(0), tvalb) == AI_SUCCESS) RepeatToAttrList("repeatS", tvalb); if (material.Get(AI_MATKEY_MAPPINGMODE_U_DIFFUSE(0), tvalb) == AI_SUCCESS) RepeatToAttrList("repeatS", tvalb);
// repeatT="true" SFBool // repeatT="true" SFBool
if(material.Get(AI_MATKEY_MAPPINGMODE_V_DIFFUSE(0), tvalb) == AI_SUCCESS) RepeatToAttrList("repeatT", tvalb); if (material.Get(AI_MATKEY_MAPPINGMODE_V_DIFFUSE(0), tvalb) == AI_SUCCESS) RepeatToAttrList("repeatT", tvalb);
NodeHelper_OpenNode("ImageTexture", pTabLevel + 1, true, attr_list); NodeHelper_OpenNode("ImageTexture", pTabLevel + 1, true, attr_list);
attr_list.clear(); attr_list.clear();
}// "ImageTexture" node. END. } // "ImageTexture" node. END.
// //
// "TextureTransform" node. // "TextureTransform" node.
// //
{ {
auto Vec2ToAttrList = [&](const string& pAttrName, const aiVector2D& pAttrValue, const aiVector2D& pAttrDefaultValue) auto Vec2ToAttrList = [&](const string &pAttrName, const aiVector2D &pAttrValue, const aiVector2D &pAttrDefaultValue) {
{
string tstr; string tstr;
if(pAttrValue != pAttrDefaultValue) if (pAttrValue != pAttrDefaultValue) {
{
AttrHelper_Vec2DArrToString(&pAttrValue, 1, tstr); AttrHelper_Vec2DArrToString(&pAttrValue, 1, tstr);
attr_list.push_back({pAttrName, tstr}); attr_list.push_back({ pAttrName, tstr });
} }
}; };
aiUVTransform transform; aiUVTransform transform;
if(material.Get(AI_MATKEY_UVTRANSFORM_DIFFUSE(0), transform) == AI_SUCCESS) if (material.Get(AI_MATKEY_UVTRANSFORM_DIFFUSE(0), transform) == AI_SUCCESS) {
{
Vec2ToAttrList("translation", transform.mTranslation, aiVector2D(0, 0)); Vec2ToAttrList("translation", transform.mTranslation, aiVector2D(0, 0));
AttrHelper_FloatToAttrList(attr_list, "rotation", transform.mRotation, 0); AttrHelper_FloatToAttrList(attr_list, "rotation", transform.mRotation, 0);
Vec2ToAttrList("scale", transform.mScaling, aiVector2D(1, 1)); Vec2ToAttrList("scale", transform.mScaling, aiVector2D(1, 1));
@ -553,109 +509,96 @@ aiMaterial& material = *mScene->mMaterials[pIdxMaterial];// create alias for con
NodeHelper_OpenNode("TextureTransform", pTabLevel + 1, true, attr_list); NodeHelper_OpenNode("TextureTransform", pTabLevel + 1, true, attr_list);
attr_list.clear(); attr_list.clear();
} }
}// "TextureTransform" node. END. } // "TextureTransform" node. END.
// //
// Close opened nodes. // Close opened nodes.
// //
NodeHelper_CloseNode(NodeName_A, pTabLevel); NodeHelper_CloseNode(NodeName_A, pTabLevel);
} }
void X3DExporter::Export_MetadataBoolean(const aiString& pKey, const bool pValue, const size_t pTabLevel) void X3DExporter::Export_MetadataBoolean(const aiString &pKey, const bool pValue, const size_t pTabLevel) {
{ list<SAttribute> attr_list;
list<SAttribute> attr_list;
attr_list.push_back({"name", pKey.C_Str()}); attr_list.push_back({ "name", pKey.C_Str() });
attr_list.push_back({"value", pValue ? "true" : "false"}); attr_list.push_back({ "value", pValue ? "true" : "false" });
NodeHelper_OpenNode("MetadataBoolean", pTabLevel, true, attr_list); NodeHelper_OpenNode("MetadataBoolean", pTabLevel, true, attr_list);
} }
void X3DExporter::Export_MetadataDouble(const aiString& pKey, const double pValue, const size_t pTabLevel) void X3DExporter::Export_MetadataDouble(const aiString &pKey, const double pValue, const size_t pTabLevel) {
{ list<SAttribute> attr_list;
list<SAttribute> attr_list;
attr_list.push_back({"name", pKey.C_Str()}); attr_list.push_back({ "name", pKey.C_Str() });
attr_list.push_back({"value", to_string(pValue)}); attr_list.push_back({ "value", to_string(pValue) });
NodeHelper_OpenNode("MetadataDouble", pTabLevel, true, attr_list); NodeHelper_OpenNode("MetadataDouble", pTabLevel, true, attr_list);
} }
void X3DExporter::Export_MetadataFloat(const aiString& pKey, const float pValue, const size_t pTabLevel) void X3DExporter::Export_MetadataFloat(const aiString &pKey, const float pValue, const size_t pTabLevel) {
{ list<SAttribute> attr_list;
list<SAttribute> attr_list;
attr_list.push_back({"name", pKey.C_Str()}); attr_list.push_back({ "name", pKey.C_Str() });
attr_list.push_back({"value", to_string(pValue)}); attr_list.push_back({ "value", to_string(pValue) });
NodeHelper_OpenNode("MetadataFloat", pTabLevel, true, attr_list); NodeHelper_OpenNode("MetadataFloat", pTabLevel, true, attr_list);
} }
void X3DExporter::Export_MetadataInteger(const aiString& pKey, const int32_t pValue, const size_t pTabLevel) void X3DExporter::Export_MetadataInteger(const aiString &pKey, const int32_t pValue, const size_t pTabLevel) {
{ list<SAttribute> attr_list;
list<SAttribute> attr_list;
attr_list.push_back({"name", pKey.C_Str()}); attr_list.push_back({ "name", pKey.C_Str() });
attr_list.push_back({"value", to_string(pValue)}); attr_list.push_back({ "value", to_string(pValue) });
NodeHelper_OpenNode("MetadataInteger", pTabLevel, true, attr_list); NodeHelper_OpenNode("MetadataInteger", pTabLevel, true, attr_list);
} }
void X3DExporter::Export_MetadataString(const aiString& pKey, const aiString& pValue, const size_t pTabLevel) void X3DExporter::Export_MetadataString(const aiString &pKey, const aiString &pValue, const size_t pTabLevel) {
{ list<SAttribute> attr_list;
list<SAttribute> attr_list;
attr_list.push_back({"name", pKey.C_Str()}); attr_list.push_back({ "name", pKey.C_Str() });
attr_list.push_back({"value", pValue.C_Str()}); attr_list.push_back({ "value", pValue.C_Str() });
NodeHelper_OpenNode("MetadataString", pTabLevel, true, attr_list); NodeHelper_OpenNode("MetadataString", pTabLevel, true, attr_list);
} }
bool X3DExporter::CheckAndExport_Light(const aiNode& pNode, const size_t pTabLevel) bool X3DExporter::CheckAndExport_Light(const aiNode &pNode, const size_t pTabLevel) {
{ list<SAttribute> attr_list;
list<SAttribute> attr_list;
auto Vec3ToAttrList = [&](const string& pAttrName, const aiVector3D& pAttrValue, const aiVector3D& pAttrDefaultValue) auto Vec3ToAttrList = [&](const string &pAttrName, const aiVector3D &pAttrValue, const aiVector3D &pAttrDefaultValue) {
{
string tstr; string tstr;
if(pAttrValue != pAttrDefaultValue) if (pAttrValue != pAttrDefaultValue) {
{
AttrHelper_Vec3DArrToString(&pAttrValue, 1, tstr); AttrHelper_Vec3DArrToString(&pAttrValue, 1, tstr);
attr_list.push_back({pAttrName, tstr}); attr_list.push_back({ pAttrName, tstr });
} }
}; };
size_t idx_light; size_t idx_light;
bool found = false; bool found = false;
// Name of the light source can not be empty. // Name of the light source can not be empty.
if(pNode.mName.length == 0) return false; if (pNode.mName.length == 0) return false;
// search for light with name like node has. // search for light with name like node has.
for(idx_light = 0; mScene->mNumLights; idx_light++) for (idx_light = 0; mScene->mNumLights; idx_light++) {
{ if (pNode.mName == mScene->mLights[idx_light]->mName) {
if(pNode.mName == mScene->mLights[idx_light]->mName)
{
found = true; found = true;
break; break;
} }
} }
if(!found) return false; if (!found) return false;
// Light source is found. // Light source is found.
const aiLight& light = *mScene->mLights[idx_light];// Alias for conveniance. const aiLight &light = *mScene->mLights[idx_light]; // Alias for conveniance.
aiMatrix4x4 trafo_mat = Matrix_GlobalToCurrent(pNode).Inverse(); aiMatrix4x4 trafo_mat = Matrix_GlobalToCurrent(pNode).Inverse();
attr_list.push_back({"DEF", light.mName.C_Str()}); attr_list.push_back({ "DEF", light.mName.C_Str() });
attr_list.push_back({"global", "true"});// "false" is not supported. attr_list.push_back({ "global", "true" }); // "false" is not supported.
// ambientIntensity="0" SFFloat [inputOutput] // ambientIntensity="0" SFFloat [inputOutput]
AttrHelper_FloatToAttrList(attr_list, "ambientIntensity", aiVector3D(light.mColorAmbient.r, light.mColorAmbient.g, light.mColorAmbient.b).Length(), 0); AttrHelper_FloatToAttrList(attr_list, "ambientIntensity", aiVector3D(light.mColorAmbient.r, light.mColorAmbient.g, light.mColorAmbient.b).Length(), 0);
// color="1 1 1" SFColor [inputOutput] // color="1 1 1" SFColor [inputOutput]
AttrHelper_Color3ToAttrList(attr_list, "color", light.mColorDiffuse, aiColor3D(1, 1, 1)); AttrHelper_Color3ToAttrList(attr_list, "color", light.mColorDiffuse, aiColor3D(1, 1, 1));
switch(light.mType) switch (light.mType) {
{ case aiLightSource_DIRECTIONAL: {
case aiLightSource_DIRECTIONAL:
{
aiVector3D direction = trafo_mat * light.mDirection; aiVector3D direction = trafo_mat * light.mDirection;
Vec3ToAttrList("direction", direction, aiVector3D(0, 0, -1)); Vec3ToAttrList("direction", direction, aiVector3D(0, 0, -1));
@ -663,8 +606,7 @@ bool found = false;
} }
break; break;
case aiLightSource_POINT: case aiLightSource_POINT: {
{
aiVector3D attenuation(light.mAttenuationConstant, light.mAttenuationLinear, light.mAttenuationQuadratic); aiVector3D attenuation(light.mAttenuationConstant, light.mAttenuationLinear, light.mAttenuationQuadratic);
aiVector3D location = trafo_mat * light.mPosition; aiVector3D location = trafo_mat * light.mPosition;
@ -674,8 +616,7 @@ bool found = false;
} }
break; break;
case aiLightSource_SPOT: case aiLightSource_SPOT: {
{
aiVector3D attenuation(light.mAttenuationConstant, light.mAttenuationLinear, light.mAttenuationQuadratic); aiVector3D attenuation(light.mAttenuationConstant, light.mAttenuationLinear, light.mAttenuationQuadratic);
aiVector3D location = trafo_mat * light.mPosition; aiVector3D location = trafo_mat * light.mPosition;
aiVector3D direction = trafo_mat * light.mDirection; aiVector3D direction = trafo_mat * light.mDirection;
@ -691,27 +632,26 @@ bool found = false;
break; break;
default: default:
throw DeadlyExportError("Unknown light type: " + to_string(light.mType)); throw DeadlyExportError("Unknown light type: " + to_string(light.mType));
}// switch(light.mType) } // switch(light.mType)
return true; return true;
} }
X3DExporter::X3DExporter(const char* pFileName, IOSystem* pIOSystem, const aiScene* pScene, const ExportProperties* /*pProperties*/) X3DExporter::X3DExporter(const char *pFileName, IOSystem *pIOSystem, const aiScene *pScene, const ExportProperties * /*pProperties*/) :
: mScene(pScene) mScene(pScene) {
{ list<SAttribute> attr_list;
list<SAttribute> attr_list;
mOutFile = pIOSystem->Open(pFileName, "wt"); mOutFile = pIOSystem->Open(pFileName, "wt");
if(mOutFile == nullptr) throw DeadlyExportError("Could not open output .x3d file: " + string(pFileName)); if (mOutFile == nullptr) throw DeadlyExportError("Could not open output .x3d file: " + string(pFileName));
// Begin document // Begin document
XML_Write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); XML_Write("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n");
XML_Write("<!DOCTYPE X3D PUBLIC \"ISO//Web3D//DTD X3D 3.3//EN\" \"http://www.web3d.org/specifications/x3d-3.3.dtd\">\n"); XML_Write("<!DOCTYPE X3D PUBLIC \"ISO//Web3D//DTD X3D 3.3//EN\" \"http://www.web3d.org/specifications/x3d-3.3.dtd\">\n");
// Root node // Root node
attr_list.push_back({"profile", "Interchange"}); attr_list.push_back({ "profile", "Interchange" });
attr_list.push_back({"version", "3.3"}); attr_list.push_back({ "version", "3.3" });
attr_list.push_back({"xmlns:xsd", "http://www.w3.org/2001/XMLSchema-instance"}); attr_list.push_back({ "xmlns:xsd", "http://www.w3.org/2001/XMLSchema-instance" });
attr_list.push_back({"xsd:noNamespaceSchemaLocation", "http://www.web3d.org/specifications/x3d-3.3.xsd"}); attr_list.push_back({ "xsd:noNamespaceSchemaLocation", "http://www.web3d.org/specifications/x3d-3.3.xsd" });
NodeHelper_OpenNode("X3D", 0, false, attr_list); NodeHelper_OpenNode("X3D", 0, false, attr_list);
attr_list.clear(); attr_list.clear();
// <head>: meta data. // <head>: meta data.
@ -729,7 +669,7 @@ list<SAttribute> attr_list;
mOutFile = nullptr; mOutFile = nullptr;
} }
}// namespace Assimp } // namespace Assimp
#endif // ASSIMP_BUILD_NO_X3D_EXPORTER #endif // ASSIMP_BUILD_NO_X3D_EXPORTER
#endif // ASSIMP_BUILD_NO_EXPORT #endif // ASSIMP_BUILD_NO_EXPORT

View File

@ -55,6 +55,11 @@ class X3DExporter
{ {
const std::string Name; const std::string Name;
const std::string Value; const std::string Value;
SAttribute() :
Name(),
Value() {
// empty
}
}; };
/***********************************************/ /***********************************************/