Don't like ads? PRO users don't see any ads ;-)
Guest

Untitled

By: a guest on May 9th, 2012  |  syntax: None  |  size: 9.42 KB  |  hits: 29  |  expires: Never
download  |  raw  |  embed  |  report abuse  |  print
Text below is selected. Please press Ctrl+C to copy to your clipboard. (⌘+C on Mac)
  1. QtScript instanceof with custom class throws prototype-related error
  2. Wrapper_Drawable* wrapper_drawable = new Wrapper_Drawable();
  3. QScriptValue wrapper_drawable_obj = m_scriptEngine->newQObject(wrapper_drawable);
  4. m_scriptEngine->setDefaultPrototype(qMetaTypeId<Wrapper_Drawable*>(),
  5.                                     wrapper_drawable_obj);
  6.  
  7. Wrapper_MeshDrawable* wrapper_meshDrawable = new Wrapper_MeshDrawable();
  8. QScriptValue wrapper_meshDrawable_obj = m_scriptEngine->newQObject(wrapper_meshDrawable);
  9. m_scriptEngine->setDefaultPrototype(qMetaTypeId<Wrapper_MeshDrawable*>(),
  10.                                     wrapper_meshDrawable_obj);
  11.        
  12. m_scriptEngine->globalObject().setProperty("Drawable", wrapper_drawable_obj);
  13.        
  14. curChildren = myDrawable.drawables()[0];
  15. print(curChildren instanceof Drawable);
  16.        
  17. TypeError: instanceof called on an object with an invalid prototype property.
  18.        
  19. #ifndef WRAPPER_DRAWABLE_H
  20. #define WRAPPER_DRAWABLE_H
  21.  
  22. #include <QObject>
  23. #include <QScriptable>
  24.  
  25. #include "../drawable.h"
  26.  
  27. class Wrapper_Drawable : public QObject, public QScriptable
  28. {
  29.     Q_OBJECT
  30. public:
  31.     explicit Wrapper_Drawable(Drawable* drawable = 0, QObject *parent = 0);
  32.  
  33.     virtual Drawable* drawable() const;
  34. signals:
  35.  
  36. public slots:
  37.     QScriptValue visible() const;
  38.  
  39.     virtual QScriptValue loadData();
  40.  
  41.     QScriptValue rotate();
  42.     QScriptValue translate();
  43.     QScriptValue scale();
  44.  
  45.     QScriptValue modelMatrix() const;
  46.     QScriptValue completeModelMatrix() const;
  47.  
  48.     QScriptValue name() const;
  49.     QScriptValue setName();
  50.  
  51.     QScriptValue shaderProgramName() const;
  52.     QScriptValue setShaderProgramName();
  53.  
  54.     QScriptValue row() const;
  55.  
  56.         QScriptValue childCount() const;
  57.  
  58.     QScriptValue child() const;
  59.     QScriptValue appendChild();
  60.     QScriptValue insertChildren();
  61.     QScriptValue insertChild();
  62.     QScriptValue removeChildren();
  63.  
  64.     QScriptValue children() const;
  65.     QScriptValue visibleChildren() const;
  66.  
  67.     QScriptValue parent() const;
  68.     QScriptValue setParent();
  69.  
  70. protected:
  71.     Drawable* m_drawable;
  72. };
  73.  
  74. Q_DECLARE_METATYPE(QList<Wrapper_Drawable*>)
  75. Q_DECLARE_METATYPE(Wrapper_Drawable*)
  76.  
  77. #endif // WRAPPER_DRAWABLE_H
  78.        
  79. #include "wrapper_drawable.h"
  80.  
  81. Wrapper_Drawable::Wrapper_Drawable(Drawable *drawable, QObject *parent) :
  82.     QObject(parent), m_drawable(drawable)
  83. {
  84. }
  85.  
  86. Drawable* Wrapper_Drawable::drawable() const {
  87.     return m_drawable;
  88. }
  89.  
  90. QScriptValue Wrapper_Drawable::removeChildren() {
  91.     Wrapper_Drawable* wrapper_drawable = qscriptvalue_cast<Wrapper_Drawable*>(context()->thisObject());
  92.  
  93.     if(!wrapper_drawable)
  94.         return context()->throwError(QScriptContext::TypeError, "Drawable.insertChildren: this object is not a Drawable");
  95.  
  96.     Drawable* drawable = wrapper_drawable->drawable();
  97.  
  98.     if(!drawable)
  99.         return context()->throwError(QScriptContext::TypeError, "Drawable.insertChildren: no Drawable wrapped");
  100.  
  101.     if(argumentCount() != 1)
  102.         return context()->throwError(QScriptContext::SyntaxError, "Drawable.insertChildren takes exactly 1 argument");
  103.  
  104.     // TODO: maybe allow multiple arguments
  105.  
  106.     if(!argument(0).isNumber())
  107.         return context()->throwError(QScriptContext::TypeError, "Drawable.insertChildren: argument 0 should be a number");
  108.  
  109.     unsigned int position = argument(0).toNumber();
  110.  
  111.     if(!argument(1).isNumber())
  112.         return context()->throwError(QScriptContext::TypeError, "Drawable.insertChildren: argument 1 should be a number");
  113.  
  114.     unsigned int count = argument(1).toNumber();
  115.  
  116.     return engine()->toScriptValue(drawable->removeChildren(position, count));
  117. }
  118.  
  119. QScriptValue Wrapper_Drawable::visibleChildren() const {
  120.     Wrapper_Drawable* wrapper_drawable = qscriptvalue_cast<Wrapper_Drawable*>(context()->thisObject());
  121.  
  122.     if(!wrapper_drawable)
  123.         return context()->throwError(QScriptContext::TypeError, "Drawable.children: this object is not a Drawable");
  124.  
  125.     Drawable* drawable = wrapper_drawable->drawable();
  126.  
  127.     if(!drawable)
  128.         return context()->throwError(QScriptContext::TypeError, "Drawable.children: no Drawable wrapped");
  129.  
  130.     if(argumentCount() > 0)
  131.         return context()->throwError(QScriptContext::SyntaxError, "Drawable.children does not take any argument");
  132.  
  133.     QList<Drawable*> drawables = drawable->visibleChildren();
  134.     QList<Wrapper_Drawable*> wrapper_drawables;
  135.     for(QList<Drawable*>::const_iterator it = drawables.constBegin(), end = drawables.constEnd();
  136.         it != end; ++it)
  137.     {
  138.         wrapper_drawables.append(new Wrapper_Drawable(*it));
  139.     }
  140.  
  141.     return engine()->toScriptValue(wrapper_drawables);
  142. }
  143.        
  144. #ifndef WRAPPER_MESHDRAWABLE_H
  145. #define WRAPPER_MESHDRAWABLE_H
  146.  
  147. #include "wrapper_drawable.h"
  148.  
  149. #include "../meshdrawable.h"
  150.  
  151. class Wrapper_MeshDrawable : public Wrapper_Drawable
  152. {
  153.     Q_OBJECT
  154. public:
  155.     Wrapper_MeshDrawable(MeshDrawable* meshDrawable = 0, QObject *parent = 0);
  156.  
  157.     virtual MeshDrawable* drawable() const;
  158.  
  159. public slots:
  160.     QScriptValue addTri();
  161.     QScriptValue addQuad();
  162.     QScriptValue setSmoothing();
  163. };
  164.  
  165. Q_DECLARE_METATYPE(Wrapper_MeshDrawable*)
  166.  
  167. #endif // WRAPPER_MESHDRAWABLE_H
  168.        
  169. #include "wrapper_meshdrawable.h"
  170.  
  171. Wrapper_MeshDrawable::Wrapper_MeshDrawable(MeshDrawable *meshDrawable, QObject *parent) :
  172.     Wrapper_Drawable(meshDrawable, parent)
  173. {
  174. }
  175.  
  176. MeshDrawable* Wrapper_MeshDrawable::drawable() const {
  177.     return static_cast<MeshDrawable*>(Wrapper_Drawable::drawable());
  178. }
  179.  
  180. QScriptValue Wrapper_MeshDrawable::addTri() {
  181.  
  182. }
  183.  
  184. QScriptValue Wrapper_MeshDrawable::addQuad() {
  185.  
  186. }
  187.  
  188. QScriptValue Wrapper_MeshDrawable::setSmoothing() {
  189.  
  190. }
  191.        
  192. #ifndef SCRIPTMANAGER_H
  193. #define SCRIPTMANAGER_H
  194.  
  195. #include <QtScript/QScriptEngine>
  196. #include <QtScriptTools/QScriptEngineDebugger>
  197. #include <QtScriptTools/QtScriptTools>
  198. #include <QStringList>
  199. #include <QObject>
  200.  
  201. #include "utility.h"
  202.  
  203. class ScriptManager : public QObject {
  204.     Q_OBJECT
  205. public:
  206.     ScriptManager();
  207.  
  208. public slots:
  209.     QString interprete(QString command);
  210.  
  211. private:
  212.     void initializeFunctions();
  213.  
  214.     QScriptEngine* m_scriptEngine;
  215.  
  216.     QScriptEngineDebugger* m_scriptEngineDebugger;
  217. };
  218.  
  219. #endif // SCRIPTMANAGER_H
  220.        
  221. #include "scriptmanager.h"
  222. #include "scenegraph.h"
  223.  
  224. #include "meshdrawable.h"
  225. #include "objdrawable.h"
  226.  
  227. #include <QScriptValueIterator>
  228.  
  229. #include "wrappers/wrapper_camera.h"
  230. #include "wrappers/wrapper_cameramanager.h"
  231. #include "wrappers/wrapper_drawable.h"
  232. #include "wrappers/wrapper_meshdrawable.h"
  233. #include "wrappers/wrapper_drawablemanager.h"
  234. #include "wrappers/wrapper_scenegraph.h"
  235. #include "wrappers/wrapper_shadermanager.h"
  236.  
  237. QString ScriptManager::returnString = QString();
  238.  
  239. ScriptManager::ScriptManager() : m_scriptEngine(new QScriptEngine())
  240. {
  241.     initializeFunctions();
  242. }
  243.  
  244. void ScriptManager::initializeFunctions() {
  245.     qScriptRegisterQObjectMetaType<QGLShaderProgram*>(m_scriptEngine);
  246.  
  247.     qScriptRegisterSequenceMetaType<QList<Wrapper_Drawable*> >(m_scriptEngine);
  248.  
  249.     QScriptValue function_ls = m_scriptEngine->newFunction(scriptFunction_ls);
  250.     m_scriptEngine->globalObject().setProperty("ls", function_ls);
  251.  
  252.     QScriptValue function_print = m_scriptEngine->newFunction(scriptFunction_print);
  253.     m_scriptEngine->globalObject().setProperty("print", function_print);
  254.  
  255. //    m_scriptEngine->setDefaultPrototype(qMetaTypeId<Observer*>(),
  256. //                                        Observer::getDefaultPrototype(m_scriptEngine));
  257.  
  258.     Wrapper_Drawable* wrapper_drawable = new Wrapper_Drawable();
  259.     QScriptValue wrapper_drawable_obj = m_scriptEngine->newQObject(wrapper_drawable);
  260.     m_scriptEngine->setDefaultPrototype(qMetaTypeId<Wrapper_Drawable*>(),
  261.                                         wrapper_drawable_obj);
  262.     m_scriptEngine->globalObject().setProperty("Drawable", wrapper_drawable_obj);
  263.  
  264.     Wrapper_MeshDrawable* wrapper_meshDrawable = new Wrapper_MeshDrawable();
  265.     QScriptValue wrapper_meshDrawable_obj = m_scriptEngine->newQObject(wrapper_meshDrawable);
  266.     m_scriptEngine->setDefaultPrototype(qMetaTypeId<Wrapper_MeshDrawable*>(),
  267.                                         wrapper_meshDrawable_obj);
  268.     m_scriptEngine->globalObject().setProperty("MeshDrawable", wrapper_meshDrawable_obj);
  269.  
  270.     Wrapper_Camera* wrapper_camera = new Wrapper_Camera();
  271.     m_scriptEngine->setDefaultPrototype(qMetaTypeId<Wrapper_Camera*>(),
  272.                                         m_scriptEngine->newQObject(wrapper_camera));
  273.  
  274.     Wrapper_CameraManager* wrapper_cameraManager = new Wrapper_CameraManager();
  275.     m_scriptEngine->setDefaultPrototype(qMetaTypeId<Wrapper_CameraManager*>(),
  276.                                         m_scriptEngine->newQObject(wrapper_cameraManager));
  277.  
  278.     Wrapper_DrawableManager* wrapper_drawableManager = new Wrapper_DrawableManager();
  279.     m_scriptEngine->setDefaultPrototype(qMetaTypeId<Wrapper_DrawableManager*>(),
  280.                                         m_scriptEngine->newQObject(wrapper_drawableManager));
  281.  
  282.     Wrapper_SceneGraph* wrapper_sceneGraph = new Wrapper_SceneGraph(SceneGraph::instance());
  283.     m_scriptEngine->setDefaultPrototype(qMetaTypeId<Wrapper_SceneGraph*>(),
  284.                                         m_scriptEngine->newQObject(wrapper_sceneGraph));
  285.  
  286.     QScriptValue object_sceneGraph = m_scriptEngine->newQObject("sceneGraph", wrapper_sceneGraph);
  287.     m_scriptEngine->globalObject().setProperty("sceneGraph", object_sceneGraph);
  288.  
  289.     Wrapper_ShaderManager* wrapper_shaderManager = new Wrapper_ShaderManager();
  290.     m_scriptEngine->setDefaultPrototype(qMetaTypeId<Wrapper_ShaderManager*>(),
  291.                                         m_scriptEngine->newQObject(wrapper_shaderManager));
  292.  
  293.     m_scriptEngineDebugger = new QScriptEngineDebugger();
  294.     m_scriptEngineDebugger->attachTo(m_scriptEngine);
  295. }