1
#include "JavaScriptParser.h"
3
#include <QScriptEngine>
5
#include "SyntopiaCore/Logging/Logging.h"
6
#include "SyntopiaCore/GLEngine/Sphere.h"
10
using namespace SyntopiaCore::Logging;
12
//Q_DECLARE_METATYPE(StructureSynth::JavaScriptSupport::Vector3)
15
namespace StructureSynth {
16
namespace JavaScriptSupport {
19
QScriptValue constructVector3(QScriptContext * context, QScriptEngine *engine)
21
//INFO("constructVector3");
22
StructureSynth::JavaScriptSupport::Vector3* bar = new StructureSynth::JavaScriptSupport::Vector3();
23
// initialize from arguments in context, if desired
24
//QScriptValue v = engine->toScriptValue(bar);
25
QScriptValue v = engine->newQObject(bar, QScriptEngine::ScriptOwnership);
26
//INFO("Old X: " + v.property("x").toString());
27
if (context->argumentCount() == 3) {
28
v.setProperty("x", QScriptValue(engine,context->argument(0).toNumber()));
29
v.setProperty("y", QScriptValue(engine,context->argument(1).toNumber()));
30
v.setProperty("z", QScriptValue(engine,context->argument(2).toNumber()));
32
//INFO("constructVector3 - end");
37
QScriptValue vector3ToScriptValue(QScriptEngine *engine, const StructureSynth::JavaScriptSupport::Vector3 &s)
39
//INFO("<-toScriptValue: From " + s.toString());
40
QScriptValue obj = engine->newObject();
46
obj.setPrototype(engine->newQObject(&v));
49
obj.setProperty("x", QScriptValue(engine, s.readX()));
50
obj.setProperty("y", QScriptValue(engine, s.readY()));
51
obj.setProperty("z", QScriptValue(engine, s.readZ()));
55
void vector3FromScriptValue(const QScriptValue &obj, StructureSynth::JavaScriptSupport::Vector3 &s)
57
//INFO("<-fromScriptValue");
58
s.writeX( obj.property("x").toNumber() );
59
s.writeY( obj.property("y").toNumber() );
60
s.writeZ( obj.property("z").toNumber() );
63
QScriptValue addSphereStatic(QScriptContext* context, QScriptEngine* /*engine*/)
65
QScriptValue thisObject = context->thisObject();
66
QObject* w = thisObject.toQObject();
68
if (context->argumentCount() == 2) {
69
Vector3 v = qScriptValueToValue<Vector3>(context->argument(0));
70
double radius = context->argument(1).toNumber();
71
//INFO("Got: " + v.toString() + " and " + QString::number(radius));
72
SyntopiaCore::GLEngine::Object3D* o = new SyntopiaCore::GLEngine::Sphere( v.getObj(), radius);
73
o->setColor(((World*)w)->getRgb(), ((World*)w)->getAlpha());
74
((World*)w)->getEngine()->addObject(o);
76
WARNING("addSphere expected two arguments..");
78
return QScriptValue();
81
QScriptValue setColorStatic(QScriptContext* context, QScriptEngine* /*engine*/)
83
QScriptValue thisObject = context->thisObject();
84
QObject* w = thisObject.toQObject();
86
if (context->argumentCount() == 2) {
87
Vector3 v = qScriptValueToValue<Vector3>(context->argument(0));
88
double alpha = context->argument(1).toNumber();
89
((World*)w)->setColor2(v, alpha);
91
WARNING("setColor expected two arguments..");
93
return QScriptValue();
99
JavaScriptParser::JavaScriptParser(SyntopiaCore::GLEngine::EngineWidget* engine3D) : engine3D(engine3D) {
102
JavaScriptParser::~JavaScriptParser() {
105
void JavaScriptParser::parse(QString input) {
107
INFO("Initializing JavaScript environment.");
108
QScriptEngine engine;
110
// Setup the global objects...
112
engine.globalObject().setProperty("Debug", engine.newQObject(&debugObject));
114
World world(engine3D);
115
QScriptValue w = engine.newQObject(&world);
116
w.setProperty("addSphere", engine.newFunction(addSphereStatic));
117
w.setProperty("setColor", engine.newFunction(setColorStatic));
118
engine.globalObject().setProperty("World", w);
121
Vector3 *v3PrototypeObject = new Vector3();
122
QScriptValue vProto = engine.newQObject(v3PrototypeObject);
123
int id = qMetaTypeId<StructureSynth::JavaScriptSupport::Vector3>();
124
engine.setDefaultPrototype(id, vProto);
125
QScriptValue vectorCtor = engine.newFunction(constructVector3, vProto);
126
engine.globalObject().setProperty("Vector3", vectorCtor);
128
qScriptRegisterMetaType(&engine, vector3ToScriptValue, vector3FromScriptValue, vProto);
129
//qScriptRegisterMetaType(&engine, vector3ToScriptValue, vector3FromScriptValue);
131
// Execute and catch exceptions.
132
QScriptValue result = engine.evaluate(input);
133
if (engine.hasUncaughtException()) {
134
int line = engine.uncaughtExceptionLineNumber();
135
QString error = QString("Uncaught exception at line %1:%2").arg(line).arg(result.toString());
138
INFO(result.toString());