first cut, not working yet

This commit is contained in:
ZappoMan 2013-12-17 10:58:36 -08:00
parent a159e08850
commit 95639c7ce7
7 changed files with 53 additions and 70 deletions

View file

@ -8,12 +8,25 @@ set(MACRO_DIR ${ROOT_DIR}/cmake/macros)
# setup for find modules
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_CURRENT_SOURCE_DIR}/../cmake/modules/")
set(CMAKE_PREFIX_PATH ${CMAKE_PREFIX_PATH} $ENV{QT_CMAKE_PREFIX_PATH})
find_package(Qt5Core REQUIRED)
find_package(Qt5Gui REQUIRED)
find_package(Qt5Network REQUIRED)
#find_package(Qt5Multimedia REQUIRED)
#find_package(Qt5Network REQUIRED)
#find_package(Qt5OpenGL REQUIRED)
#find_package(Qt5Svg REQUIRED)
#find_package(Qt5WebKit REQUIRED)
#find_package(Qt5WebKitWidgets REQUIRED)
include(${MACRO_DIR}/SetupHifiProject.cmake)
setup_hifi_project(${TARGET_NAME} TRUE)
qt5_use_modules(${TARGET_NAME} Network)
qt5_use_modules(${TARGET_NAME} Gui)
# include glm
include(${MACRO_DIR}/IncludeGLM.cmake)
@ -30,6 +43,7 @@ link_hifi_library(particles ${TARGET_NAME} ${ROOT_DIR})
link_hifi_library(octree-server ${TARGET_NAME} ${ROOT_DIR})
link_hifi_library(particle-server ${TARGET_NAME} ${ROOT_DIR})
link_hifi_library(voxel-server ${TARGET_NAME} ${ROOT_DIR})
link_hifi_library(scriptengine ${TARGET_NAME} ${ROOT_DIR})
#testing
include_directories(${ROOT_DIR}/externals/civetweb/include)

View file

@ -76,28 +76,6 @@ void Agent::run() {
loop.exec();
QString scriptContents(reply->readAll());
QScriptEngine engine;
// register meta-type for glm::vec3 conversions
registerMetaTypes(&engine);
QScriptValue agentValue = engine.newQObject(this);
engine.globalObject().setProperty("Agent", agentValue);
QScriptValue voxelScripterValue = engine.newQObject(&_voxelScriptingInterface);
engine.globalObject().setProperty("Voxels", voxelScripterValue);
QScriptValue particleScripterValue = engine.newQObject(&_particleScriptingInterface);
engine.globalObject().setProperty("Particles", particleScripterValue);
QScriptValue treeScaleValue = engine.newVariant(QVariant(TREE_SCALE));
engine.globalObject().setProperty("TREE_SCALE", treeScaleValue);
const unsigned int VISUAL_DATA_CALLBACK_USECS = (1.0 / 60.0) * 1000 * 1000;
// let the VoxelPacketSender know how frequently we plan to call it
_voxelScriptingInterface.getVoxelPacketSender()->setProcessCallIntervalHint(VISUAL_DATA_CALLBACK_USECS);
_particleScriptingInterface.getParticlePacketSender()->setProcessCallIntervalHint(VISUAL_DATA_CALLBACK_USECS);
qDebug() << "Downloaded script:" << scriptContents << "\n";
QScriptValue result = engine.evaluate(scriptContents);
@ -124,50 +102,13 @@ void Agent::run() {
QTimer* pingNodesTimer = new QTimer(this);
connect(pingNodesTimer, SIGNAL(timeout()), nodeList, SLOT(pingInactiveNodes()));
pingNodesTimer->start(PING_INACTIVE_NODE_INTERVAL_USECS / 1000);
const unsigned int VISUAL_DATA_CALLBACK_USECS = (1.0 / 60.0) * 1000 * 1000;
// let the VoxelPacketSender know how frequently we plan to call it
_voxelScriptingInterface.getVoxelPacketSender()->setProcessCallIntervalHint(VISUAL_DATA_CALLBACK_USECS);
_particleScriptingInterface.getParticlePacketSender()->setProcessCallIntervalHint(VISUAL_DATA_CALLBACK_USECS);
while (!_isFinished) {
int usecToSleep = usecTimestamp(&startTime) + (thisFrame++ * VISUAL_DATA_CALLBACK_USECS) - usecTimestampNow();
if (usecToSleep > 0) {
usleep(usecToSleep);
}
QCoreApplication::processEvents();
bool willSendVisualDataCallBack = false;
if (_voxelScriptingInterface.getVoxelPacketSender()->voxelServersExist()) {
// allow the scripter's call back to setup visual data
willSendVisualDataCallBack = true;
// release the queue of edit voxel messages.
_voxelScriptingInterface.getVoxelPacketSender()->releaseQueuedMessages();
// since we're in non-threaded mode, call process so that the packets are sent
_voxelScriptingInterface.getVoxelPacketSender()->process();
}
_scriptEngine.setScriptContents(scriptContents);
if (_particleScriptingInterface.getParticlePacketSender()->serversExist()) {
// allow the scripter's call back to setup visual data
willSendVisualDataCallBack = true;
// release the queue of edit voxel messages.
_particleScriptingInterface.getParticlePacketSender()->releaseQueuedMessages();
// since we're in non-threaded mode, call process so that the packets are sent
_particleScriptingInterface.getParticlePacketSender()->process();
}
if (willSendVisualDataCallBack) {
emit willSendVisualDataCallback();
}
if (engine.hasUncaughtException()) {
int line = engine.uncaughtExceptionLineNumber();
qDebug() << "Uncaught exception at line" << line << ":" << engine.uncaughtException().toString() << "\n";
}
}
_scriptEngine.run();
}

View file

@ -15,6 +15,7 @@
#include <QtCore/QObject>
#include <QtCore/QUrl>
#include <ScriptEngine.h>
#include <ThreadedAssignment.h>
#include <VoxelScriptingInterface.h>
@ -35,6 +36,7 @@ signals:
private:
VoxelScriptingInterface _voxelScriptingInterface;
ParticleScriptingInterface _particleScriptingInterface;
ScriptEngine _scriptEngine;
};
#endif /* defined(__hifi__Agent__) */

View file

@ -28,6 +28,9 @@ ScriptEngine::ScriptEngine(QString scriptContents, bool wantMenuItems,
const char* scriptMenuName, AbstractMenuInterface* menu) {
_scriptContents = scriptContents;
_isFinished = false;
_isRunning = false;
// some clients will use these menu features
_wantMenuItems = wantMenuItems;
if (scriptMenuName) {
_scriptMenuName = "Stop ";
@ -57,10 +60,16 @@ void ScriptEngine::cleanMenuItems() {
}
}
void ScriptEngine::run() {
bool ScriptEngine::setScriptContents(QString scriptContents) {
if (_isRunning) {
return false;
}
_scriptContents = scriptContents;
return true;
}
//setupMenuItems();
void ScriptEngine::run() {
_isRunning = true;
QScriptEngine engine;
_voxelScriptingInterface.init();
@ -161,6 +170,7 @@ void ScriptEngine::run() {
}
emit finished();
_isRunning = false;
}
void ScriptEngine::stop() {

View file

@ -19,10 +19,12 @@
#include <ParticleScriptingInterface.h>
#include <VoxelScriptingInterface.h>
const QString NO_SCRIPT("");
class ScriptEngine : public QObject {
Q_OBJECT
public:
ScriptEngine(QString scriptContents, bool wantMenuItems = false,
ScriptEngine(QString scriptContents = NO_SCRIPT, bool wantMenuItems = false,
const char* scriptMenuName = NULL, AbstractMenuInterface* menu = NULL);
~ScriptEngine();
@ -33,6 +35,9 @@ public:
/// Access the ParticleScriptingInterface in order to initialize it with a custom packet sender and jurisdiction listener
ParticleScriptingInterface* getParticleScriptingInterface() { return &_particleScriptingInterface; }
/// sets the script contents, will return false if failed, will fail if script is already running
bool setScriptContents(QString scriptContents);
void setupMenuItems();
void cleanMenuItems();
@ -47,6 +52,7 @@ signals:
protected:
QString _scriptContents;
bool _isFinished;
bool _isRunning;
private:

View file

@ -6,12 +6,15 @@ set(MACRO_DIR ${ROOT_DIR}/cmake/macros)
set(TARGET_NAME shared)
project(${TARGET_NAME})
find_package(Qt5Core REQUIRED)
find_package(Qt5Gui REQUIRED)
find_package(Qt5Network REQUIRED)
include(${MACRO_DIR}/SetupHifiLibrary.cmake)
setup_hifi_library(${TARGET_NAME})
qt5_use_modules(${TARGET_NAME} Network)
qt5_use_modules(${TARGET_NAME} Gui)
# include GLM
include(${MACRO_DIR}/IncludeGLM.cmake)

View file

@ -14,6 +14,13 @@
//#include <QHash>
//#include <QKeySequence>
//class QMenu;
//class QString;
//class QObject;
//class QKeySequence;
//class QAction;
//extern enum QAction::MenuRole;
class AbstractMenuInterface {
public:
virtual QMenu* getActiveScriptsMenu() = 0;