Files
assimp/contrib/meshlab/patches/meshlab.patch
Steve M 69558d8889 Introduce VRML format (.wrl and .x3dv) 3D model support (#5857)
- Introduce VRML format (.wrl and .x3dv) 3D model support
- Add samples
---------

Co-authored-by: Steve M <praktique-tellypresence@yahoo.com>
Co-authored-by: Kim Kulling <kimkulling@users.noreply.github.com>
2024-12-30 11:56:18 +01:00

1192 lines
40 KiB
Diff
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
diff -rupN -x .git autoclone/meshlab_repo-src/CMakeLists.txt meshlab_repo_patch/CMakeLists.txt
--- autoclone/meshlab_repo-src/CMakeLists.txt 2024-12-06 18:01:10.831623800 -0800
+++ meshlab_repo_patch/CMakeLists.txt 2024-12-06 18:15:09.647799500 -0800
@@ -16,4 +16,6 @@ option(MESHLAB_USE_DEFAULT_BUILD_AND_INS
option(MESHLAB_IS_NIGHTLY_VERSION "Nightly version of meshlab will be used instead of ML_VERSION" OFF)
-add_subdirectory(src)
\ No newline at end of file
+# Disable meshlab project to avoid breaking assimp build (for converting VMRL (.wrl/.x3dv) files to
+# .xml format, just need to compile two source files)
+#add_subdirectory(src)
diff -rupN -x .git autoclone/meshlab_repo-src/src/meshlabplugins/io_x3d/vrml/Parser.cpp meshlab_repo_patch/src/meshlabplugins/io_x3d/vrml/Parser.cpp
--- autoclone/meshlab_repo-src/src/meshlabplugins/io_x3d/vrml/Parser.cpp 2024-12-06 18:01:12.268963700 -0800
+++ meshlab_repo_patch/src/meshlabplugins/io_x3d/vrml/Parser.cpp 2024-12-06 14:19:26.138842300 -0800
@@ -32,11 +32,11 @@
*****************************************************************************/
+#include <vector>
#include <wchar.h>
#include "Parser.h"
#include "Scanner.h"
-
namespace VrmlTranslator {
@@ -95,9 +95,11 @@ bool Parser::WeakSeparator(int n, int sy
}
void Parser::VrmlTranslator() {
- QDomElement root = doc->createElement("X3D");
- QDomElement scene = doc->createElement("Scene");
- root.appendChild(scene);
+// QDomElement root = doc->createElement("X3D");
+ pugi::xml_node root = doc->append_child("X3D");
+// QDomElement scene = doc->createElement("Scene");
+// root.appendChild(scene);
+ pugi::xml_node scene = root.append_child("Scene");
InitX3dNode();
if (la->kind == 7) {
HeaderStatement();
@@ -108,7 +110,7 @@ void Parser::VrmlTranslator() {
ComponentStatements();
MetaStatements();
Statements(scene);
- doc->appendChild(root);
+// doc->appendChild(root);
}
void Parser::HeaderStatement() {
@@ -147,7 +149,7 @@ void Parser::MetaStatements() {
}
}
-void Parser::Statements(QDomElement& parent) {
+void Parser::Statements(pugi::xml_node& parent) {
while (StartOf(1)) {
Statement(parent);
}
@@ -173,16 +175,16 @@ void Parser::ComponentSupportLevel() {
}
void Parser::ExportStatement() {
- QString str;
+ std::string str;
Expect(14);
NodeNameId(str);
Expect(15);
ExportedNodeNameId();
}
-void Parser::NodeNameId(QString& str) {
+void Parser::NodeNameId(std::string& str) {
Expect(1);
- str = QString(coco_string_create_char(t->val));
+ str = std::string(coco_string_create_char(t->val));
}
void Parser::ExportedNodeNameId() {
@@ -190,7 +192,7 @@ void Parser::ExportedNodeNameId() {
}
void Parser::ImportStatement() {
- QString str;
+ std::string str;
Expect(16);
InlineNodeNameId();
Expect(17);
@@ -217,7 +219,7 @@ void Parser::Metavalue() {
Expect(4);
}
-void Parser::Statement(QDomElement& parent) {
+void Parser::Statement(pugi::xml_node& parent) {
if (StartOf(2)) {
NodeStatement(parent);
} else if (la->kind == 16) {
@@ -231,8 +233,8 @@ void Parser::Statement(QDomElement& pare
} else SynErr(87);
}
-void Parser::NodeStatement(QDomElement& parent) {
- QString tagName, attrValue;
+void Parser::NodeStatement(pugi::xml_node& parent) {
+ std::string tagName, attrValue;
if (la->kind == 1 || la->kind == 38) {
Node(parent, tagName, "");
} else if (la->kind == 19) {
@@ -242,17 +244,19 @@ void Parser::NodeStatement(QDomElement&
} else if (la->kind == 20) {
Get();
NodeNameId(attrValue);
- std::map<QString, QString>::const_iterator iter = defNode.find(attrValue);
+ std::map<std::string, std::string>::const_iterator iter = defNode.find(attrValue);
if(iter != defNode.end())
{
- QDomElement node = doc->createElement(iter->second);
- node.setAttribute("USE", attrValue);
- parent.appendChild(node);
+// QDomElement node = doc->createElement(iter->second);
+ pugi::xml_node node = parent.append_child((iter->second).c_str());
+// node.setAttribute("USE", attrValue);
+ node.append_attribute("USE") = attrValue.c_str();
+// parent.appendChild(node);
}
} else SynErr(88);
}
-void Parser::ProtoStatement(QDomElement& parent) {
+void Parser::ProtoStatement(pugi::xml_node& parent) {
if (la->kind == 21) {
Proto(parent);
} else if (la->kind == 34) {
@@ -261,7 +265,7 @@ void Parser::ProtoStatement(QDomElement&
}
void Parser::RouteStatement() {
- QString str;
+ std::string str;
Expect(35);
NodeNameId(str);
Expect(17);
@@ -272,22 +276,27 @@ void Parser::RouteStatement() {
InputOnlyId(str);
}
-void Parser::Node(QDomElement& parent, QString& tagName, const QString defValue) {
- bool flag = false; QDomElement node;
+void Parser::Node(pugi::xml_node& parent, std::string& tagName, const std::string defValue) {
+ bool flag = false; pugi::xml_node node;
if (la->kind == 1) {
NodeTypeId(tagName);
- std::set<QString>::const_iterator iter = proto.find(tagName);
+ std::set<std::string>::const_iterator iter = proto.find(tagName);
if (iter != proto.end())
{
- node = doc->createElement("ProtoInstance");
- node.setAttribute("name", tagName);
+// node = doc->createElement("ProtoInstance");
+ node = parent.append_child("ProtoInstance");
+// node.setAttribute("name", tagName);
+ node.append_attribute("name") = tagName.c_str();
flag = true;
}
- else
- node = doc->createElement(tagName);
+ else {
+// node = doc->createElement(tagName);
+ node = parent.append_child(tagName.c_str());
+ }
if (defValue != "")
{
- node.setAttribute("DEF", defValue);
+// node.setAttribute("DEF", defValue);
+ node.append_attribute("DEF") = defValue.c_str();
defNode[defValue] = tagName;
}
Expect(24);
@@ -298,13 +307,14 @@ void Parser::Node(QDomElement& parent, Q
Expect(24);
ScriptBody();
Expect(25);
- node = doc->createElement("Script");
+// node = doc->createElement("Script");
+ node = parent.append_child("Script");
} else SynErr(90);
- parent.appendChild(node);
+// parent.appendChild(node);
}
-void Parser::RootNodeStatement(QDomElement& parent) {
- QString tagName, attrValue;
+void Parser::RootNodeStatement(pugi::xml_node& parent) {
+ std::string tagName, attrValue;
if (la->kind == 1 || la->kind == 38) {
Node(parent, tagName, "");
} else if (la->kind == 19) {
@@ -314,70 +324,82 @@ void Parser::RootNodeStatement(QDomEleme
} else SynErr(91);
}
-void Parser::Proto(QDomElement& parent) {
- QString name; QDomElement node;
+void Parser::Proto(pugi::xml_node& parent) {
+// QString name; QDomElement node;
+ std::string name; pugi::xml_node node;
Expect(21);
NodeTypeId(name);
- node = doc->createElement("ProtoDeclare");
- node.setAttribute("name", name);
+// node = doc->createElement("ProtoDeclare");
+ node = parent.append_child("ProtoDeclare");
+// node.setAttribute("name", name);
+ node.append_attribute("name") = name.c_str();
proto.insert(name);
Expect(22);
- QDomElement interf = doc->createElement("ProtoInterface");
+// QDomElement interf = doc->createElement("ProtoInterface");
+ pugi::xml_node interf = node.append_child("ProtoInterface");
InterfaceDeclarations(interf);
- node.appendChild(interf);
+// node.appendChild(interf);
Expect(23);
Expect(24);
- QDomElement body = doc->createElement("ProtoBody");
+// QDomElement body = doc->createElement("ProtoBody");
+ pugi::xml_node body = node.append_child("ProtoBody");
ProtoBody(body);
- node.appendChild(body);
+// node.appendChild(body);
Expect(25);
- parent.appendChild(node);
+// parent.appendChild(node);
}
-void Parser::Externproto(QDomElement& parent) {
- QString name, url;
- QDomElement node = doc->createElement("ExternProtoDeclare");
+void Parser::Externproto(pugi::xml_node& parent) {
+// QString name, url;
+ std::string name, url;
+// QDomElement node = doc->createElement("ExternProtoDeclare");
+ pugi::xml_node node = doc->append_child("ExternProtoDeclare");
Expect(34);
NodeTypeId(name);
Expect(22);
ExternInterfaceDeclarations(node);
Expect(23);
URLList(url);
- std::set<QString>::const_iterator iter = x3dNode.find(name);
+ std::set<std::string>::const_iterator iter = x3dNode.find(name);
if (iter == x3dNode.end())
{
- node.setAttribute("name", name);
- node.setAttribute("url", url);
- parent.appendChild(node);
+// node.setAttribute("name", name);
+ node.append_attribute("name") = name.c_str();
+// node.setAttribute("url", url);
+ node.append_attribute("url") = url.c_str();
+// parent.appendChild(node);
+ parent.append_copy(node);
proto.insert(name);
}
+ doc->remove_child(node);
}
-void Parser::ProtoStatements(QDomElement& parent) {
+void Parser::ProtoStatements(pugi::xml_node& parent) {
while (la->kind == 21 || la->kind == 34) {
ProtoStatement(parent);
}
}
-void Parser::NodeTypeId(QString& str) {
+void Parser::NodeTypeId(std::string& str) {
Expect(1);
- str = QString(coco_string_create_char(t->val));
+ str = std::string(coco_string_create_char(t->val));
}
-void Parser::InterfaceDeclarations(QDomElement& parent) {
+void Parser::InterfaceDeclarations(pugi::xml_node& parent) {
while (StartOf(3)) {
InterfaceDeclaration(parent);
}
}
-void Parser::ProtoBody(QDomElement& parent) {
+void Parser::ProtoBody(pugi::xml_node& parent) {
ProtoStatements(parent);
RootNodeStatement(parent);
Statements(parent);
}
-void Parser::InterfaceDeclaration(QDomElement& parent) {
- QString name, type, val; QDomElement node;
+void Parser::InterfaceDeclaration(pugi::xml_node& parent) {
+// QString name, type, val; QDomElement node;
+ std::string name, type, val; pugi::xml_node node;
if (StartOf(4)) {
RestrictedInterfaceDeclaration(parent);
} else if (la->kind == 32 || la->kind == 33) {
@@ -388,18 +410,23 @@ void Parser::InterfaceDeclaration(QDomEl
}
FieldType(type);
FieldId(name);
+ node = parent.append_child("field");
FieldValue(node, "value", false);
- node = doc->createElement("field");
- node.setAttribute("name", name);
- node.setAttribute("type", type);
- node.setAttribute("accessType", "inputOutput");
- parent.appendChild(node);
+// node = doc->createElement("field");
+// node.setAttribute("name", name);
+ node.append_attribute("name") = name.c_str();
+// node.setAttribute("type", type);
+ node.append_attribute("type") = type.c_str();
+// node.setAttribute("accessType", "inputOutput");
+ node.append_attribute("accessType") = "inputOutput";
+// parent.appendChild(node);
} else SynErr(92);
}
-void Parser::RestrictedInterfaceDeclaration(QDomElement& parent) {
- QString name; QString type; QString val;
- QDomElement node = doc->createElement("field");
+void Parser::RestrictedInterfaceDeclaration(pugi::xml_node& parent) {
+ std::string name; std::string type; std::string val;
+// QDomElement node = doc->createElement("field");
+ pugi::xml_node node = parent.append_child("field");
if (la->kind == 26 || la->kind == 27) {
if (la->kind == 26) {
Get();
@@ -408,7 +435,8 @@ void Parser::RestrictedInterfaceDeclarat
}
FieldType(type);
InputOnlyId(name);
- node.setAttribute("accessType", "inputOnly");
+// node.setAttribute("accessType", "inputOnly");
+ node.append_attribute("accessType") = "inputOnly";
} else if (la->kind == 28 || la->kind == 29) {
if (la->kind == 28) {
Get();
@@ -417,7 +445,8 @@ void Parser::RestrictedInterfaceDeclarat
}
FieldType(type);
OutputOnlyId(name);
- node.setAttribute("accessType", "outputOnly");
+// node.setAttribute("accessType", "outputOnly");
+ node.append_attribute("accessType") = "outputOnly";
} else if (la->kind == 30 || la->kind == 31) {
if (la->kind == 30) {
Get();
@@ -427,14 +456,17 @@ void Parser::RestrictedInterfaceDeclarat
FieldType(type);
InitializeOnlyId(name);
FieldValue(node, "value", false);
- node.setAttribute("accessType", "initializeOnly");
+// node.setAttribute("accessType", "initializeOnly");
+ node.append_attribute("accessType") = "initializeOnly";
} else SynErr(93);
- node.setAttribute("name", name);
- node.setAttribute("type", type);
- parent.appendChild(node);
+// node.setAttribute("name", name);
+ node.append_attribute("name") = name.c_str();
+// node.setAttribute("type", type);
+ node.append_attribute("type") = type.c_str();
+// parent.appendChild(node);
}
-void Parser::FieldType(QString& str) {
+void Parser::FieldType(std::string& str) {
switch (la->kind) {
case 40: {
Get();
@@ -606,25 +638,25 @@ void Parser::FieldType(QString& str) {
}
default: SynErr(94); break;
}
- str = QString(coco_string_create_char(t->val));
+ str = std::string(coco_string_create_char(t->val));
}
-void Parser::InputOnlyId(QString& str) {
+void Parser::InputOnlyId(std::string& str) {
Expect(1);
- str = QString(coco_string_create_char(t->val));
+ str = std::string(coco_string_create_char(t->val));
}
-void Parser::OutputOnlyId(QString& str) {
+void Parser::OutputOnlyId(std::string& str) {
Expect(1);
- str = QString(coco_string_create_char(t->val));
+ str = std::string(coco_string_create_char(t->val));
}
-void Parser::InitializeOnlyId(QString& str) {
+void Parser::InitializeOnlyId(std::string& str) {
Expect(1);
- str = QString(coco_string_create_char(t->val));
+ str = std::string(coco_string_create_char(t->val));
}
-void Parser::FieldValue(QDomElement& parent, QString fieldName, bool flag) {
+void Parser::FieldValue(pugi::xml_node& parent, std::string fieldName, bool flag) {
if (StartOf(5)) {
SingleValue(parent, fieldName, flag);
} else if (la->kind == 22) {
@@ -632,21 +664,21 @@ void Parser::FieldValue(QDomElement& par
} else SynErr(95);
}
-void Parser::FieldId(QString& str) {
+void Parser::FieldId(std::string& str) {
Expect(1);
- str = QString(coco_string_create_char(t->val));
+ str = std::string(coco_string_create_char(t->val));
}
-void Parser::ExternInterfaceDeclarations(QDomElement& parent) {
+void Parser::ExternInterfaceDeclarations(pugi::xml_node& parent) {
while (StartOf(3)) {
ExternInterfaceDeclaration(parent);
}
}
-void Parser::URLList(QString& url) {
+void Parser::URLList(std::string& url) {
if (la->kind == 4) {
Get();
- url = QString(coco_string_create_char(t->val));
+ url = std::string(coco_string_create_char(t->val));
} else if (la->kind == 22) {
Get();
while (la->kind == 4) {
@@ -660,9 +692,10 @@ void Parser::URLList(QString& url) {
} else SynErr(96);
}
-void Parser::ExternInterfaceDeclaration(QDomElement& parent) {
- QString type, name;
- QDomElement node = doc->createElement("field");
+void Parser::ExternInterfaceDeclaration(pugi::xml_node& parent) {
+ std::string type, name;
+// QDomElement node = doc->createElement("field");
+ pugi::xml_node node = parent.append_child("field");
if (la->kind == 26 || la->kind == 27) {
if (la->kind == 26) {
Get();
@@ -671,7 +704,8 @@ void Parser::ExternInterfaceDeclaration(
}
FieldType(type);
InputOnlyId(name);
- node.setAttribute("accessType", "inputOnly");
+// node.setAttribute("accessType", "inputOnly");
+ node.append_attribute("accessType") = "inputOnly";
} else if (la->kind == 28 || la->kind == 29) {
if (la->kind == 28) {
Get();
@@ -680,7 +714,8 @@ void Parser::ExternInterfaceDeclaration(
}
FieldType(type);
OutputOnlyId(name);
- node.setAttribute("accessType", "outputOnly");
+// node.setAttribute("accessType", "outputOnly");
+ node.append_attribute("accessType") = "outputOnly";
} else if (la->kind == 30 || la->kind == 31) {
if (la->kind == 30) {
Get();
@@ -689,7 +724,8 @@ void Parser::ExternInterfaceDeclaration(
}
FieldType(type);
InitializeOnlyId(name);
- node.setAttribute("accessType", "initializeOnly");
+// node.setAttribute("accessType", "initializeOnly");
+ node.append_attribute("accessType") = "initializeOnly";
} else if (la->kind == 32 || la->kind == 33) {
if (la->kind == 32) {
Get();
@@ -698,14 +734,17 @@ void Parser::ExternInterfaceDeclaration(
}
FieldType(type);
FieldId(name);
- node.setAttribute("accessType", "inputOutput");
+// node.setAttribute("accessType", "inputOutput");
+ node.append_attribute("accessType") = "inputOutput";
} else SynErr(97);
- node.setAttribute("name" , name);
- node.setAttribute("type", type);
- parent.appendChild(node);
+// node.setAttribute("name" , name);
+ node.append_attribute("name") = name.c_str();
+// node.setAttribute("type", type);
+ node.append_attribute("type") = type.c_str();
+// parent.appendChild(node);
}
-void Parser::NodeBody(QDomElement& parent, bool flag) {
+void Parser::NodeBody(pugi::xml_node& parent, bool flag) {
while (StartOf(6)) {
NodeBodyElement(parent, flag);
}
@@ -717,24 +756,29 @@ void Parser::ScriptBody() {
}
}
-void Parser::NodeBodyElement(QDomElement& parent, bool flag) {
- QString idName, idProto; QDomElement node;
+void Parser::NodeBodyElement(pugi::xml_node& parent, bool flag) {
+// QString idName, idProto; QDomElement node;
+ std::string idName, idProto; pugi::xml_node node;
if (la->kind == 1) {
Get();
- idName = QString(coco_string_create_char(t->val));
+ idName = std::string(coco_string_create_char(t->val));
if (StartOf(8)) {
FieldValue(parent, idName, flag);
} else if (la->kind == 39) {
Get();
Expect(1);
- idProto = QString(coco_string_create_char(t->val));
- node = doc->createElement("IS");
- QDomElement connect = doc->createElement("connect");
- connect.setAttribute("nodeField", idName);
- connect.setAttribute("protoField", idProto);
- node.appendChild(connect);
- parent.appendChild(node);
-
+ idProto = std::string(coco_string_create_char(t->val));
+// node = doc->createElement("IS");
+ node = parent.append_child("IS");
+// QDomElement connect = doc->createElement("connect");
+ pugi::xml_node connect = node.append_child("connect");
+// connect.setAttribute("nodeField", idName);
+ connect.append_attribute("nodeField") = idName.c_str();
+// connect.setAttribute("protoField", idProto);
+ connect.append_attribute("protoField") = idProto.c_str();
+// node.appendChild(connect);
+// parent.appendChild(node);
+
} else SynErr(98);
} else if (la->kind == 35) {
RouteStatement();
@@ -744,7 +788,7 @@ void Parser::NodeBodyElement(QDomElement
}
void Parser::ScriptBodyElement() {
- QString str; QDomElement elem;
+ std::string str; pugi::xml_node elem;
if (StartOf(6)) {
NodeBodyElement(elem, false);
} else if (la->kind == 26 || la->kind == 27) {
@@ -798,17 +842,21 @@ void Parser::ScriptBodyElement() {
} else SynErr(101);
}
-void Parser::InputOutputId(QString& str) {
+void Parser::InputOutputId(std::string& str) {
Expect(1);
- str = QString(coco_string_create_char(t->val));
+ str = std::string(coco_string_create_char(t->val));
}
-void Parser::SingleValue(QDomElement& parent, QString fieldName, bool flag) {
- QString value; QDomElement tmpParent = doc->createElement("tmp");
+void Parser::SingleValue(pugi::xml_node& parent, std::string fieldName, bool flag) {
+// QString value; QDomElement tmpParent = doc->createElement("tmp");
+ std::string value; pugi::xml_node tmpParent = doc->append_child("tmpParent");
if (StartOf(9)) {
if (la->kind == 4) {
Get();
- value.append(coco_string_create_char(t->val)); value.remove("\"");
+ value.append(coco_string_create_char(t->val)); //value.remove("\"");
+ // TODO: modify quotation removal; below violates const-correctness:
+ // error: cannot convert std::__cxx11::basic_string<char>::iterator to const char*
+// value.erase(std::remove(value.begin(), value.end(), '"'), value.end());
} else if (la->kind == 2 || la->kind == 3) {
if (la->kind == 2) {
Get();
@@ -839,29 +887,41 @@ void Parser::SingleValue(QDomElement& pa
}
if (flag)
{
- QDomElement node = doc->createElement("fieldValue");
- node.setAttribute("name", fieldName);
- node.setAttribute("value", value);
- parent.appendChild(node);
- }
- else
- parent.setAttribute(fieldName, value);
+// QDomElement node = doc->createElement("fieldValue");
+ pugi::xml_node node = parent.append_child("fieldValue");
+// node.setAttribute("name", fieldName);
+ node.append_attribute("name") = fieldName.c_str();
+// node.setAttribute("value", value);
+ node.append_attribute("value") = value.c_str();
+// parent.appendChild(node);
+ }
+ else {
+// parent.setAttribute(fieldName, value);
+ parent.append_attribute(fieldName.c_str()) = value.c_str();
+ }
} else if (StartOf(2)) {
NodeStatement(tmpParent);
if (flag)
{
- QDomElement tmp = doc->createElement("fieldValue");
- tmp.setAttribute("name", fieldName);
- tmp.appendChild(tmpParent.firstChildElement());
- parent.appendChild(tmp);
- }
- else
- parent.appendChild(tmpParent.firstChildElement());
+// QDomElement tmp = doc->createElement("fieldValue");
+ pugi::xml_node tmp = parent.append_child("fieldValue");
+// tmp.setAttribute("name", fieldName);
+ tmp.append_attribute("name") = fieldName.c_str();
+// tmp.appendChild(tmpParent.firstChildElement());
+ tmp.insert_child_before(pugi::node_element, tmpParent.first_child());
+// parent.appendChild(tmp);
+ }
+ else {
+// parent.appendChild(tmpParent.firstChildElement());
+ parent.append_copy(tmpParent.first_child());
+ }
} else SynErr(102);
+ doc->remove_child(tmpParent);
}
-void Parser::MultiValue(QDomElement& parent, QString fieldName, bool flag) {
- QString value; QDomElement tmpParent = doc->createElement("tmp");
+void Parser::MultiValue(pugi::xml_node& parent, std::string fieldName, bool flag) {
+// QString value; QDomElement tmpParent = doc->createElement("tmp");
+ std::string value; pugi::xml_node tmpParent = doc->append_child("tmpParent");
Expect(22);
if (StartOf(10)) {
if (la->kind == 2 || la->kind == 3) {
@@ -873,14 +933,19 @@ void Parser::MultiValue(QDomElement& par
}
if (flag)
{
- QDomElement tmp = doc->createElement("fieldValue");
- tmp.setAttribute("name", fieldName);
- tmp.setAttribute("value", value);
- parent.appendChild(tmp);
- }
- else
- parent.setAttribute(fieldName, value);
-
+// QDomElement tmp = doc->createElement("fieldValue");
+ pugi::xml_node tmp = parent.append_child("fieldValue");
+// tmp.setAttribute("name", fieldName);
+ tmp.append_attribute("name") = fieldName.c_str();
+// tmp.setAttribute("value", value);
+ tmp.append_attribute("value") = value.c_str();
+// parent.appendChild(tmp);
+ }
+ else {
+// parent.setAttribute(fieldName, value);
+ parent.append_attribute(fieldName.c_str()) = value.c_str();
+ }
+
} else if (StartOf(11)) {
while (StartOf(2)) {
NodeStatement(tmpParent);
@@ -888,28 +953,41 @@ void Parser::MultiValue(QDomElement& par
Get();
}
}
- QDomElement child;
- QDomNodeList list = tmpParent.childNodes();
- QDomElement field = doc->createElement("field");
- field.setAttribute("name", fieldName);
- int i = 0;
+// QDomElement child;
+ pugi::xml_node child;
+// QDomNodeList list = tmpParent.childNodes();
+ std::vector<pugi::xml_node> list;
+ for (auto item : tmpParent.children()) {
+ list.push_back(item);
+ }
+// QDomElement field = doc->createElement("field");
+ pugi::xml_node field = parent.append_child("field");
+// field.setAttribute("name", fieldName);
+ field.append_attribute("name") = fieldName.c_str();
+ unsigned int i = 0;
while(i < list.size())
{
- child = list.at(i).toElement();
- if (flag)
- field.appendChild(child.cloneNode());
- else
- parent.appendChild(child.cloneNode());
+ child = list.at(i);//.toElement();
+ if (flag) {
+// field.appendChild(child.cloneNode());
+ field.append_copy(child);
+ } else {
+// parent.appendChild(child.cloneNode());
+ parent.append_copy(child);
+ }
i++;
}
- if (flag)
- parent.appendChild(field);
-
+ if (flag) {
+// parent.appendChild(field);
+ } else {
+ parent.remove_child(field);
+ }
} else SynErr(103);
Expect(23);
+ doc->remove_child(tmpParent);
}
-void Parser::MultiNumber(QString& value) {
+void Parser::MultiNumber(std::string& value) {
if (la->kind == 2) {
Get();
} else if (la->kind == 3) {
@@ -932,7 +1010,7 @@ void Parser::MultiNumber(QString& value)
}
}
-void Parser::MultiString(QString& value) {
+void Parser::MultiString(std::string& value) {
Expect(4);
value.append(coco_string_create_char(t->val));
if (la->kind == 37) {
@@ -947,7 +1025,7 @@ void Parser::MultiString(QString& value)
}
}
-void Parser::MultiBool(QString& value) {
+void Parser::MultiBool(std::string& value) {
if (la->kind == 82) {
Get();
} else if (la->kind == 84) {
@@ -1173,7 +1251,7 @@ void Errors::Warning(const wchar_t *s) {
}
void Errors::Exception(const wchar_t* s) {
- wprintf(L"%ls", s);
+ wprintf(L"%ls", s);
exit(1);
}
*/
diff -rupN -x .git autoclone/meshlab_repo-src/src/meshlabplugins/io_x3d/vrml/Parser.h meshlab_repo_patch/src/meshlabplugins/io_x3d/vrml/Parser.h
--- autoclone/meshlab_repo-src/src/meshlabplugins/io_x3d/vrml/Parser.h 2024-12-06 18:01:12.268963700 -0800
+++ meshlab_repo_patch/src/meshlabplugins/io_x3d/vrml/Parser.h 2024-12-06 18:48:17.891284300 -0800
@@ -35,9 +35,10 @@
#if !defined(VRML_PARSER_H__)
#define VRML_PARSER_H__
-#include <QtXml>
+#include "contrib/pugixml/src/pugixml.hpp"
+#include <map>
#include <set>
-
+#include <string>
#include "Scanner.h"
@@ -48,7 +49,7 @@ class Errors {
public:
int count; // number of errors detected
wchar_t* stringError;
-
+
Errors();
~Errors();
void SynErr(int line, int col, int n);
@@ -90,14 +91,15 @@ public:
Token *t; // last recognized token
Token *la; // lookahead token
-QDomDocument *doc;
-
- std::map<QString, QString> defNode;
-
- std::set<QString> proto;
-
- std::set<QString> x3dNode;
-
+ pugi::xml_document doc_;
+ pugi::xml_document *doc = &doc_; // IrrXMLReader* createIrrXMLReader(const char* filename);
+
+ std::map<std::string, std::string> defNode;
+
+ std::set<std::string> proto;
+
+ std::set<std::string> x3dNode;
+
void InitX3dNode()
{
x3dNode.insert("Arc2D"); x3dNode.insert("ArcClose2D"); x3dNode.insert("BallJoint");
@@ -116,7 +118,7 @@ QDomDocument *doc;
x3dNode.insert("EspduTransform"); x3dNode.insert("ExplosionEmitter");
x3dNode.insert("FillProperties"); x3dNode.insert("FloatVertexAttribute");
x3dNode.insert("FogCoordinate"); x3dNode.insert(" GeneratedCubeMapTexture");
- x3dNode.insert("GeoCoordinate"); x3dNode.insert("GeoElevationGrid"); x3dNode.insert("GeoLocation");
+ x3dNode.insert("GeoCoordinate"); x3dNode.insert("GeoElevationGrid"); x3dNode.insert("GeoLocation");
x3dNode.insert("GeoLOD"); x3dNode.insert("GeoMetadata"); x3dNode.insert("GeoOrigin");
x3dNode.insert("GeoPositionInterpolator"); x3dNode.insert("GeoProximitySensor");
x3dNode.insert("GeoTouchSensor"); x3dNode.insert("GeoViewpoint"); x3dNode.insert("GravityPhysicsModel");
@@ -128,7 +130,7 @@ QDomDocument *doc;
x3dNode.insert("Layer"); x3dNode.insert("LayerSet"); x3dNode.insert("Layout");
x3dNode.insert("LayoutGroup"); x3dNode.insert("LayoutLayer"); x3dNode.insert("LinePicker");
x3dNode.insert("LineProperties"); x3dNode.insert("LineSet"); x3dNode.insert("LoadSensor");
- x3dNode.insert("LocalFog"); x3dNode.insert("Material"); x3dNode.insert("Matrix3VertexAttribute");
+ x3dNode.insert("LocalFog"); x3dNode.insert("Material"); x3dNode.insert("Matrix3VertexAttribute");
x3dNode.insert("Matrix4VertexAttribute"); x3dNode.insert("MetadataDouble");
x3dNode.insert("MetadataFloat"); x3dNode.insert("MetadataInteger"); x3dNode.insert("MetadataSet");
x3dNode.insert("MetadataString"); x3dNode.insert("MotorJoint"); x3dNode.insert("MultiTexture");
@@ -162,7 +164,7 @@ QDomDocument *doc;
x3dNode.insert(" Viewpoint"); x3dNode.insert("ViewpointGroup"); x3dNode.insert("VolumeEmitter");
x3dNode.insert("VolumePicker"); x3dNode.insert("WindPhysicsModel"); x3dNode.insert("Cylinder"); x3dNode.insert("Sphere");
}
-
+
Parser(Scanner *scanner);
@@ -174,52 +176,52 @@ QDomDocument *doc;
void ProfileStatement();
void ComponentStatements();
void MetaStatements();
- void Statements(QDomElement& parent);
+ void Statements(pugi::xml_node& parent);
void ProfileNameId();
void ComponentStatement();
void ComponentNameId();
void ComponentSupportLevel();
void ExportStatement();
- void NodeNameId(QString& str);
+ void NodeNameId(std::string& str);
void ExportedNodeNameId();
void ImportStatement();
void InlineNodeNameId();
void MetaStatement();
void Metakey();
void Metavalue();
- void Statement(QDomElement& parent);
- void NodeStatement(QDomElement& parent);
- void ProtoStatement(QDomElement& parent);
+ void Statement(pugi::xml_node& parent);
+ void NodeStatement(pugi::xml_node& parent);
+ void ProtoStatement(pugi::xml_node& parent);
void RouteStatement();
- void Node(QDomElement& parent, QString& tagName, const QString defValue);
- void RootNodeStatement(QDomElement& parent);
- void Proto(QDomElement& parent);
- void Externproto(QDomElement& parent);
- void ProtoStatements(QDomElement& parent);
- void NodeTypeId(QString& str);
- void InterfaceDeclarations(QDomElement& parent);
- void ProtoBody(QDomElement& parent);
- void InterfaceDeclaration(QDomElement& parent);
- void RestrictedInterfaceDeclaration(QDomElement& parent);
- void FieldType(QString& str);
- void InputOnlyId(QString& str);
- void OutputOnlyId(QString& str);
- void InitializeOnlyId(QString& str);
- void FieldValue(QDomElement& parent, QString fieldName, bool flag);
- void FieldId(QString& str);
- void ExternInterfaceDeclarations(QDomElement& parent);
- void URLList(QString& url);
- void ExternInterfaceDeclaration(QDomElement& parent);
- void NodeBody(QDomElement& parent, bool flag);
+ void Node(pugi::xml_node& parent, std::string& tagName, const std::string defValue);
+ void RootNodeStatement(pugi::xml_node& parent);
+ void Proto(pugi::xml_node& parent);
+ void Externproto(pugi::xml_node& parent);
+ void ProtoStatements(pugi::xml_node& parent);
+ void NodeTypeId(std::string& str);
+ void InterfaceDeclarations(pugi::xml_node& parent);
+ void ProtoBody(pugi::xml_node& parent);
+ void InterfaceDeclaration(pugi::xml_node& parent);
+ void RestrictedInterfaceDeclaration(pugi::xml_node& parent);
+ void FieldType(std::string& str);
+ void InputOnlyId(std::string& str);
+ void OutputOnlyId(std::string& str);
+ void InitializeOnlyId(std::string& str);
+ void FieldValue(pugi::xml_node& parent, std::string fieldName, bool flag);
+ void FieldId(std::string& str);
+ void ExternInterfaceDeclarations(pugi::xml_node& parent);
+ void URLList(std::string& url);
+ void ExternInterfaceDeclaration(pugi::xml_node& parent);
+ void NodeBody(pugi::xml_node& parent, bool flag);
void ScriptBody();
- void NodeBodyElement(QDomElement& parent, bool flag);
+ void NodeBodyElement(pugi::xml_node& parent, bool flag);
void ScriptBodyElement();
- void InputOutputId(QString& str);
- void SingleValue(QDomElement& parent, QString fieldName, bool flag);
- void MultiValue(QDomElement& parent, QString fieldName, bool flag);
- void MultiNumber(QString& value);
- void MultiString(QString& value);
- void MultiBool(QString& value);
+ void InputOutputId(std::string& str);
+ void SingleValue(pugi::xml_node& parent, std::string fieldName, bool flag);
+ void MultiValue(pugi::xml_node& parent, std::string fieldName, bool flag);
+ void MultiNumber(std::string& value);
+ void MultiString(std::string& value);
+ void MultiBool(std::string& value);
void Parse();
diff -rupN -x .git autoclone/meshlab_repo-src/src/meshlabplugins/io_x3d/vrml/Scanner.cpp meshlab_repo_patch/src/meshlabplugins/io_x3d/vrml/Scanner.cpp
--- autoclone/meshlab_repo-src/src/meshlabplugins/io_x3d/vrml/Scanner.cpp 2024-12-06 18:01:12.268963700 -0800
+++ meshlab_repo_patch/src/meshlabplugins/io_x3d/vrml/Scanner.cpp 2024-12-06 14:21:47.920443100 -0800
@@ -39,7 +39,7 @@
wchar_t* coco_string_create(const wchar_t* value) {
wchar_t* data;
- int len = 0;
+ size_t len = 0;
if (value) { len = wcslen(value); }
data = new wchar_t[len + 1];
wcsncpy(data, value, len);
@@ -63,7 +63,7 @@ wchar_t* coco_string_create_upper(const
if (!data) { return NULL; }
int dataLen = 0;
- if (data) { dataLen = wcslen(data); }
+ if (data) { dataLen = static_cast<int>(wcslen(data)); }
wchar_t *newData = new wchar_t[dataLen + 1];
@@ -80,7 +80,7 @@ wchar_t* coco_string_create_upper(const
wchar_t* coco_string_create_lower(const wchar_t* data) {
if (!data) { return NULL; }
- int dataLen = wcslen(data);
+ int dataLen = static_cast<int>(wcslen(data));
return coco_string_create_lower(data, 0, dataLen);
}
@@ -102,11 +102,11 @@ wchar_t* coco_string_create_lower(const
wchar_t* coco_string_create_append(const wchar_t* data1, const wchar_t* data2) {
wchar_t* data;
- int data1Len = 0;
- int data2Len = 0;
+ size_t data1Len = 0;
+ size_t data2Len = 0;
if (data1) { data1Len = wcslen(data1); }
- if (data2) {data2Len = wcslen(data2); }
+ if (data2) { data2Len = wcslen(data2); }
data = new wchar_t[data1Len + data2Len + 1];
@@ -133,13 +133,13 @@ void coco_string_delete(wchar_t* &data)
}
int coco_string_length(const wchar_t* data) {
- if (data) { return wcslen(data); }
+ if (data) { return static_cast<int>(wcslen(data)); }
return 0;
}
bool coco_string_endswith(const wchar_t* data, const wchar_t *end) {
- int dataLen = wcslen(data);
- int endLen = wcslen(end);
+ size_t dataLen = wcslen(data);
+ size_t endLen = wcslen(end);
return (endLen <= dataLen) && (wcscmp(data + dataLen - endLen, end) == 0);
}
@@ -186,8 +186,8 @@ int coco_string_hash(const wchar_t *data
// string handling, ascii character
wchar_t* coco_string_create(const char* value) {
- int len = 0;
- if (value) { len = strlen(value); }
+ int len = 0;
+ if (value) { len = static_cast<int>(strlen(value)); }
wchar_t* data = new wchar_t[len + 1];
for (int i = 0; i < len; ++i) { data[i] = (wchar_t) value[i]; }
data[len] = 0;
@@ -240,7 +240,7 @@ Buffer::Buffer(FILE* s, bool isUserStrea
fileLen = bufLen = bufStart = 0;
}
bufCapacity = (bufLen>0) ? bufLen : MIN_BUFFER_LENGTH;
- buf = new unsigned char[bufCapacity];
+ buf = new unsigned char[bufCapacity];
if (fileLen > 0) SetPos(0); // setup buffer to position 0 (start)
else bufPos = 0; // index 0 is already after the file, thus Pos = 0 is invalid
if (bufLen == fileLen && CanSeek()) Close();
@@ -270,7 +270,7 @@ Buffer::Buffer(const unsigned char* buf,
}
Buffer::~Buffer() {
- Close();
+ Close();
if (buf != NULL) {
delete [] buf;
buf = NULL;
@@ -306,12 +306,12 @@ int Buffer::Peek() {
wchar_t* Buffer::GetString(int beg, int end) {
int len = end - beg;
- wchar_t *buf = new wchar_t[len];
+ wchar_t *retBuf = new wchar_t[len];
int oldPos = GetPos();
SetPos(beg);
- for (int i = 0; i < len; ++i) buf[i] = (wchar_t) Read();
+ for (int i = 0; i < len; ++i) retBuf[i] = (wchar_t) Read();
SetPos(oldPos);
- return buf;
+ return retBuf;
}
int Buffer::GetPos() {
@@ -329,16 +329,16 @@ void Buffer::SetPos(int value) {
if ((value < 0) || (value > fileLen)) {
char msg[50];
- sprintf(msg, "Buffer out of bounds access, position: %d", value);
+ snprintf(msg, 50, "Buffer out of bounds access, position: %d", value);
throw msg;
-
+
}
if ((value >= bufStart) && (value < (bufStart + bufLen))) { // already in buffer
bufPos = value - bufStart;
} else if (stream != NULL) { // must be swapped in
fseek(stream, value, SEEK_SET);
- bufLen = fread(buf, sizeof(unsigned char), bufCapacity, stream);
+ bufLen = static_cast<int>(fread(buf, sizeof(unsigned char), bufCapacity, stream));
bufStart = value; bufPos = 0;
} else {
bufPos = fileLen - bufStart; // make Pos return fileLen
@@ -362,7 +362,7 @@ int Buffer::ReadNextStreamChunk() {
buf = newBuf;
free = bufLen;
}
- int read = fread(buf + bufLen, sizeof(unsigned char), free, stream);
+ int read = static_cast<int>(fread(buf + bufLen, sizeof(unsigned char), free, stream));
if (read > 0) {
fileLen = bufLen = (bufLen + read);
return read;
@@ -416,7 +416,7 @@ Scanner::Scanner(const wchar_t* fileName
char *chFileName = coco_string_create_char(fileName);
if ((stream = fopen(chFileName, "rb")) == NULL) {
char msg[50];
- sprintf(msg, "Can not open file: %s", chFileName);
+ snprintf(msg, 50, "Can not open file: %s", chFileName);
coco_string_delete(chFileName);
throw msg;
}
@@ -554,7 +554,7 @@ void Scanner::Init() {
heapEnd = (void**) (((char*) heap) + HEAP_BLOCK_SIZE);
*heapEnd = 0;
heapTop = heap;
- if (sizeof(Token) > HEAP_BLOCK_SIZE) {
+ if constexpr (sizeof(Token) > HEAP_BLOCK_SIZE) {
throw "Too small HEAP_BLOCK_SIZE";
}
@@ -637,18 +637,18 @@ void Scanner::CreateHeapBlock() {
}
Token* Scanner::CreateToken() {
- Token *t;
+ Token *tkn;
if (((char*) heapTop + (int) sizeof(Token)) >= (char*) heapEnd) {
CreateHeapBlock();
}
- t = (Token*) heapTop;
+ tkn = (Token*) heapTop;
heapTop = (void*) ((char*) heapTop + sizeof(Token));
- t->val = NULL;
- t->next = NULL;
- return t;
+ tkn->val = NULL;
+ tkn->next = NULL;
+ return tkn;
}
-void Scanner::AppendVal(Token *t) {
+void Scanner::AppendVal(Token *tkn) {
int reqMem = (tlen + 1) * sizeof(wchar_t);
if (((char*) heapTop + reqMem) >= (char*) heapEnd) {
if (reqMem > HEAP_BLOCK_SIZE) {
@@ -656,11 +656,11 @@ void Scanner::AppendVal(Token *t) {
}
CreateHeapBlock();
}
- t->val = (wchar_t*) heapTop;
+ tkn->val = (wchar_t*) heapTop;
heapTop = (void*) ((char*) heapTop + reqMem);
- wcsncpy(t->val, tval, tlen);
- t->val[tlen] = L'\0';
+ wcsncpy(tkn->val, tval, tlen);
+ tkn->val[tlen] = L'\0';
}
Token* Scanner::NextToken() {
diff -rupN -x .git autoclone/meshlab_repo-src/src/meshlabplugins/io_x3d/vrml/Scanner.h meshlab_repo_patch/src/meshlabplugins/io_x3d/vrml/Scanner.h
--- autoclone/meshlab_repo-src/src/meshlabplugins/io_x3d/vrml/Scanner.h 2024-12-06 18:01:12.268963700 -0800
+++ meshlab_repo_patch/src/meshlabplugins/io_x3d/vrml/Scanner.h 2024-12-06 14:21:59.453748300 -0800
@@ -52,9 +52,9 @@
//#define coco_swprintf _snwprintf
//#elif defined __GNUC__
//#define coco_swprintf swprintf
-//#else
+//#else
//#error unknown compiler!
-//#endif
+//#endif
#ifdef WIN32
#ifndef __MINGW32__
@@ -62,7 +62,7 @@
#define coco_swprintf swprintf_s
#elif _MSC_VER >= 1300
#define coco_swprintf _snwprintf
- #else
+ #else
#error unknown compiler!
#endif
#else
@@ -106,7 +106,7 @@ void coco_string_delete(char* &data);
namespace VrmlTranslator {
-class Token
+class Token
{
public:
int kind; // token kind
@@ -135,10 +135,10 @@ private:
int bufPos; // current position in buffer
FILE* stream; // input stream (seekable)
bool isUserStream; // was the stream opened by the user?
-
+
int ReadNextStreamChunk();
bool CanSeek(); // true if stream can seek otherwise false
-
+
public:
static const int EoF = COCO_WCHAR_MAX + 1;
@@ -146,7 +146,7 @@ public:
Buffer(const unsigned char* buf, int len);
Buffer(Buffer *b);
virtual ~Buffer();
-
+
virtual void Close();
virtual int Read();
virtual int Peek();
@@ -256,7 +256,7 @@ private:
int eofSym;
int noSym;
int maxT;
- int charSetSize;
+// int charSetSize; // unused
StartStates start;
KeywordMap keywords;
@@ -277,7 +277,7 @@ private:
void CreateHeapBlock();
Token* CreateToken();
- void AppendVal(Token *t);
+ void AppendVal(Token *tkn);
void Init();
void NextCh();
@@ -288,7 +288,7 @@ private:
public:
Buffer *buffer; // scanner buffer
-
+
Scanner(const unsigned char* buf, int len);
Scanner(const wchar_t* fileName);
Scanner(FILE* s);