diff --git a/libraries/fbx/src/OBJWriter.cpp b/libraries/fbx/src/OBJWriter.cpp index d33d767e5d..b2d391fea3 100644 --- a/libraries/fbx/src/OBJWriter.cpp +++ b/libraries/fbx/src/OBJWriter.cpp @@ -14,8 +14,6 @@ #include "model/Geometry.h" #include "OBJWriter.h" - - static QString formatFloat(double n) { // limit precision to 6, but don't output trailing zeros. QString s = QString::number(n, 'f', 6); @@ -28,9 +26,7 @@ static QString formatFloat(double n) { return s; } - - -bool writeOBJToTextStream(QTextStream& out, std::vector meshes) { +bool writeOBJToTextStream(QTextStream& out, QList meshes) { qDebug() << "writeOBJToTextStream mesh count is" << meshes.size(); // each mesh's vertices are numbered from zero. We're combining all their vertices into one list here, @@ -110,8 +106,7 @@ bool writeOBJToTextStream(QTextStream& out, std::vector meshes) { return true; } - -bool writeOBJToFile(QString path, MeshPointer mesh) { +bool writeOBJToFile(QString path, QList meshes) { if (QFileInfo(path).exists() && !QFile::remove(path)) { qDebug() << "OBJ writer failed, file exists:" << path; // XXX qCDebug return false; @@ -126,7 +121,6 @@ bool writeOBJToFile(QString path, MeshPointer mesh) { QTextStream outStream(&file); bool success; - std::vector meshes { mesh }; success = writeOBJToTextStream(outStream, meshes); file.close(); diff --git a/libraries/fbx/src/OBJWriter.h b/libraries/fbx/src/OBJWriter.h index 58dc93b84a..dcf5a3ee39 100644 --- a/libraries/fbx/src/OBJWriter.h +++ b/libraries/fbx/src/OBJWriter.h @@ -14,13 +14,13 @@ #include -#include +#include #include using MeshPointer = std::shared_ptr; -bool writeOBJToTextStream(QTextStream& out, std::vector meshes); -bool writeOBJToFile(QString path, MeshPointer mesh); +bool writeOBJToTextStream(QTextStream& out, QList meshes); +bool writeOBJToFile(QString path, QList meshes); #endif // hifi_objwriter_h diff --git a/libraries/script-engine/src/MeshProxy.h b/libraries/script-engine/src/MeshProxy.h index 3226e0f467..93c5ce5918 100644 --- a/libraries/script-engine/src/MeshProxy.h +++ b/libraries/script-engine/src/MeshProxy.h @@ -33,7 +33,9 @@ protected: MeshPointer _mesh; }; - Q_DECLARE_METATYPE(MeshProxy*); +class MeshProxyList : public QList {}; // typedef and using fight with the Qt macros/templates, do this instead +Q_DECLARE_METATYPE(MeshProxyList); + #endif // hifi_MeshProxy_h diff --git a/libraries/script-engine/src/ModelScriptingInterface.cpp b/libraries/script-engine/src/ModelScriptingInterface.cpp index 1fb8e8f193..922dee2e8f 100644 --- a/libraries/script-engine/src/ModelScriptingInterface.cpp +++ b/libraries/script-engine/src/ModelScriptingInterface.cpp @@ -10,6 +10,7 @@ // #include +#include #include #include "ModelScriptingInterface.h" #include "OBJWriter.h" @@ -27,10 +28,31 @@ void meshFromScriptValue(const QScriptValue& value, MeshProxy* &out) { out = qobject_cast(value.toQObject()); } -QString ModelScriptingInterface::meshToOBJ(MeshProxy* const &in) { +QScriptValue meshesToScriptValue(QScriptEngine* engine, const MeshProxyList &in) { + return engine->toScriptValue(in); +} + +void meshesFromScriptValue(const QScriptValue& value, MeshProxyList &out) { + QScriptValueIterator itr(value); + while(itr.hasNext()) { + itr.next(); + MeshProxy* meshProxy = qscriptvalue_cast(itr.value()); + if (meshProxy) { + out.append(meshProxy); + } + } +} + +QString ModelScriptingInterface::meshToOBJ(MeshProxyList in) { bool success; QString filename = "/tmp/okokok.obj"; - success = writeOBJToFile(filename, in->getMeshPointer()); + + QList meshes; + foreach (const MeshProxy* meshProxy, in) { + meshes.append(meshProxy->getMeshPointer()); + } + + success = writeOBJToFile(filename, meshes); if (!success) { return ""; } diff --git a/libraries/script-engine/src/ModelScriptingInterface.h b/libraries/script-engine/src/ModelScriptingInterface.h index 4d8f7ad999..94b7338ae2 100644 --- a/libraries/script-engine/src/ModelScriptingInterface.h +++ b/libraries/script-engine/src/ModelScriptingInterface.h @@ -27,11 +27,13 @@ class ModelScriptingInterface : public QObject { public: ModelScriptingInterface(QObject* parent); - Q_INVOKABLE QString meshToOBJ(MeshProxy* const &in); + Q_INVOKABLE QString meshToOBJ(MeshProxyList in); }; QScriptValue meshToScriptValue(QScriptEngine* engine, MeshProxy* const &in); void meshFromScriptValue(const QScriptValue& value, MeshProxy* &out); +QScriptValue meshesToScriptValue(QScriptEngine* engine, const MeshProxyList &in); +void meshesFromScriptValue(const QScriptValue& value, MeshProxyList &out); #endif // hifi_ModelScriptingInterface_h diff --git a/libraries/script-engine/src/ScriptEngine.cpp b/libraries/script-engine/src/ScriptEngine.cpp index b687da7e23..31dc30d2c5 100644 --- a/libraries/script-engine/src/ScriptEngine.cpp +++ b/libraries/script-engine/src/ScriptEngine.cpp @@ -591,6 +591,7 @@ void ScriptEngine::init() { registerGlobalObject("Model", new ModelScriptingInterface(this)); qScriptRegisterMetaType(this, meshToScriptValue, meshFromScriptValue); + qScriptRegisterMetaType(this, meshesToScriptValue, meshesFromScriptValue); } void ScriptEngine::registerValue(const QString& valueName, QScriptValue value) {