Merge pull request #6413 from samcake/controllers

Recording: Moving the Recording js interface to the Script engine
This commit is contained in:
Brad Davis 2015-11-18 10:22:55 -08:00
commit 2636e43fab
5 changed files with 65 additions and 25 deletions

View file

@ -25,10 +25,14 @@
#include <SoundCache.h> #include <SoundCache.h>
#include <UUID.h> #include <UUID.h>
#include <recording/Deck.h>
#include <recording/Recorder.h>
#include <WebSocketServerClass.h> #include <WebSocketServerClass.h>
#include <EntityScriptingInterface.h> // TODO: consider moving to scriptengine.h #include <EntityScriptingInterface.h> // TODO: consider moving to scriptengine.h
#include "avatars/ScriptableAvatar.h" #include "avatars/ScriptableAvatar.h"
#include "RecordingScriptingInterface.h"
#include "Agent.h" #include "Agent.h"
@ -46,6 +50,9 @@ Agent::Agent(NLPacket& packet) :
DependencyManager::set<ResourceCacheSharedItems>(); DependencyManager::set<ResourceCacheSharedItems>();
DependencyManager::set<SoundCache>(); DependencyManager::set<SoundCache>();
DependencyManager::set<recording::Deck>();
DependencyManager::set<recording::Recorder>();
DependencyManager::set<RecordingScriptingInterface>();
auto& packetReceiver = DependencyManager::get<NodeList>()->getPacketReceiver(); auto& packetReceiver = DependencyManager::get<NodeList>()->getPacketReceiver();
@ -177,7 +184,7 @@ void Agent::run() {
// give this AvatarData object to the script engine // give this AvatarData object to the script engine
setAvatarData(&scriptedAvatar, "Avatar"); setAvatarData(&scriptedAvatar, "Avatar");
auto avatarHashMap = DependencyManager::set<AvatarHashMap>(); auto avatarHashMap = DependencyManager::set<AvatarHashMap>();
_scriptEngine->registerGlobalObject("AvatarList", avatarHashMap.data()); _scriptEngine->registerGlobalObject("AvatarList", avatarHashMap.data());
@ -237,6 +244,8 @@ void Agent::setIsAvatar(bool isAvatar) {
} }
if (!_isAvatar) { if (!_isAvatar) {
DependencyManager::get<RecordingScriptingInterface>()->setControlledAvatar(nullptr);
if (_avatarIdentityTimer) { if (_avatarIdentityTimer) {
_avatarIdentityTimer->stop(); _avatarIdentityTimer->stop();
delete _avatarIdentityTimer; delete _avatarIdentityTimer;
@ -254,6 +263,7 @@ void Agent::setIsAvatar(bool isAvatar) {
void Agent::setAvatarData(AvatarData* avatarData, const QString& objectName) { void Agent::setAvatarData(AvatarData* avatarData, const QString& objectName) {
_avatarData = avatarData; _avatarData = avatarData;
_scriptEngine->registerGlobalObject(objectName, avatarData); _scriptEngine->registerGlobalObject(objectName, avatarData);
DependencyManager::get<RecordingScriptingInterface>()->setControlledAvatar(avatarData);
} }
void Agent::sendAvatarIdentityPacket() { void Agent::sendAvatarIdentityPacket() {

View file

@ -87,6 +87,7 @@
#include <RenderDeferredTask.h> #include <RenderDeferredTask.h>
#include <ResourceCache.h> #include <ResourceCache.h>
#include <SceneScriptingInterface.h> #include <SceneScriptingInterface.h>
#include <RecordingScriptingInterface.h>
#include <ScriptCache.h> #include <ScriptCache.h>
#include <SoundCache.h> #include <SoundCache.h>
#include <TextureCache.h> #include <TextureCache.h>
@ -127,7 +128,6 @@
#include "scripting/LocationScriptingInterface.h" #include "scripting/LocationScriptingInterface.h"
#include "scripting/MenuScriptingInterface.h" #include "scripting/MenuScriptingInterface.h"
#include "scripting/SettingsScriptingInterface.h" #include "scripting/SettingsScriptingInterface.h"
#include "scripting/RecordingScriptingInterface.h"
#include "scripting/WebWindowClass.h" #include "scripting/WebWindowClass.h"
#include "scripting/WindowScriptingInterface.h" #include "scripting/WindowScriptingInterface.h"
#include "scripting/ControllerScriptingInterface.h" #include "scripting/ControllerScriptingInterface.h"
@ -743,6 +743,10 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer) :
connect(applicationUpdater.data(), &AutoUpdater::newVersionIsAvailable, dialogsManager.data(), &DialogsManager::showUpdateDialog); connect(applicationUpdater.data(), &AutoUpdater::newVersionIsAvailable, dialogsManager.data(), &DialogsManager::showUpdateDialog);
applicationUpdater->checkForUpdate(); applicationUpdater->checkForUpdate();
// Assign MyAvatar to th eRecording Singleton
DependencyManager::get<RecordingScriptingInterface>()->setControlledAvatar(getMyAvatar());
// Now that menu is initalized we can sync myAvatar with it's state. // Now that menu is initalized we can sync myAvatar with it's state.
getMyAvatar()->updateMotionBehaviorFromMenu(); getMyAvatar()->updateMotionBehaviorFromMenu();
@ -837,6 +841,7 @@ void Application::cleanupBeforeQuit() {
#ifdef HAVE_IVIEWHMD #ifdef HAVE_IVIEWHMD
DependencyManager::get<EyeTracker>()->setEnabled(false, true); DependencyManager::get<EyeTracker>()->setEnabled(false, true);
#endif #endif
DependencyManager::get<RecordingScriptingInterface>()->setControlledAvatar(nullptr);
AnimDebugDraw::getInstance().shutdown(); AnimDebugDraw::getInstance().shutdown();
@ -4006,7 +4011,6 @@ void Application::registerScriptEngineWithApplicationServices(ScriptEngine* scri
RayToOverlayIntersectionResultFromScriptValue); RayToOverlayIntersectionResultFromScriptValue);
scriptEngine->registerGlobalObject("Desktop", DependencyManager::get<DesktopScriptingInterface>().data()); scriptEngine->registerGlobalObject("Desktop", DependencyManager::get<DesktopScriptingInterface>().data());
scriptEngine->registerGlobalObject("Recording", DependencyManager::get<RecordingScriptingInterface>().data());
scriptEngine->registerGlobalObject("Window", DependencyManager::get<WindowScriptingInterface>().data()); scriptEngine->registerGlobalObject("Window", DependencyManager::get<WindowScriptingInterface>().data());
scriptEngine->registerGetterSetter("location", LocationScriptingInterface::locationGetter, scriptEngine->registerGetterSetter("location", LocationScriptingInterface::locationGetter,

View file

@ -8,17 +8,19 @@
#include "RecordingScriptingInterface.h" #include "RecordingScriptingInterface.h"
#include <QThread>
#include <recording/Deck.h> #include <recording/Deck.h>
#include <recording/Recorder.h> #include <recording/Recorder.h>
#include <recording/Clip.h> #include <recording/Clip.h>
#include <recording/Frame.h> #include <recording/Frame.h>
#include <NumericalConstants.h> #include <NumericalConstants.h>
#include <AudioClient.h> // FiXME
//#include <AudioClient.h>
#include <AudioConstants.h> #include <AudioConstants.h>
#include <Transform.h>
#include "avatar/AvatarManager.h" #include "ScriptEngineLogging.h"
#include "Application.h"
#include "InterfaceLogging.h"
typedef int16_t AudioSample; typedef int16_t AudioSample;
@ -43,8 +45,13 @@ RecordingScriptingInterface::RecordingScriptingInterface() {
_player = DependencyManager::get<Deck>(); _player = DependencyManager::get<Deck>();
_recorder = DependencyManager::get<Recorder>(); _recorder = DependencyManager::get<Recorder>();
auto audioClient = DependencyManager::get<AudioClient>(); // FIXME : Disabling Sound
connect(audioClient.data(), &AudioClient::inputReceived, this, &RecordingScriptingInterface::processAudioInput); // auto audioClient = DependencyManager::get<AudioClient>();
// connect(audioClient.data(), &AudioClient::inputReceived, this, &RecordingScriptingInterface::processAudioInput);
}
void RecordingScriptingInterface::setControlledAvatar(AvatarData* avatar) {
_controlledAvatar = avatar;
} }
bool RecordingScriptingInterface::isPlaying() const { bool RecordingScriptingInterface::isPlaying() const {
@ -84,10 +91,10 @@ void RecordingScriptingInterface::startPlaying() {
QMetaObject::invokeMethod(this, "startPlaying", Qt::BlockingQueuedConnection); QMetaObject::invokeMethod(this, "startPlaying", Qt::BlockingQueuedConnection);
return; return;
} }
auto myAvatar = DependencyManager::get<AvatarManager>()->getMyAvatar();
// Playback from the current position // Playback from the current position
if (_playFromCurrentLocation) { if (_playFromCurrentLocation && _controlledAvatar) {
_dummyAvatar.setRecordingBasis(std::make_shared<Transform>(myAvatar->getTransform())); _dummyAvatar.setRecordingBasis(std::make_shared<Transform>(_controlledAvatar->getTransform()));
} else { } else {
_dummyAvatar.clearRecordingBasis(); _dummyAvatar.clearRecordingBasis();
} }
@ -160,7 +167,7 @@ float RecordingScriptingInterface::recorderElapsed() const {
void RecordingScriptingInterface::startRecording() { void RecordingScriptingInterface::startRecording() {
if (_recorder->isRecording()) { if (_recorder->isRecording()) {
qCWarning(interfaceapp) << "Recorder is already running"; qCWarning(scriptengine) << "Recorder is already running";
return; return;
} }
@ -170,7 +177,11 @@ void RecordingScriptingInterface::startRecording() {
} }
_recordingEpoch = Frame::epochForFrameTime(0); _recordingEpoch = Frame::epochForFrameTime(0);
DependencyManager::get<AvatarManager>()->getMyAvatar()->setRecordingBasis();
if (_controlledAvatar) {
_controlledAvatar->setRecordingBasis();
}
_recorder->start(); _recorder->start();
} }
@ -178,7 +189,10 @@ void RecordingScriptingInterface::stopRecording() {
_recorder->stop(); _recorder->stop();
_lastClip = _recorder->getClip(); _lastClip = _recorder->getClip();
_lastClip->seek(0); _lastClip->seek(0);
DependencyManager::get<AvatarManager>()->getMyAvatar()->clearRecordingBasis();
if (_controlledAvatar) {
_controlledAvatar->clearRecordingBasis();
}
} }
void RecordingScriptingInterface::saveRecording(const QString& filename) { void RecordingScriptingInterface::saveRecording(const QString& filename) {
@ -203,7 +217,7 @@ void RecordingScriptingInterface::loadLastRecording() {
} }
if (!_lastClip) { if (!_lastClip) {
qCDebug(interfaceapp) << "There is no recording to load"; qCDebug(scriptengine) << "There is no recording to load";
return; return;
} }
@ -214,27 +228,32 @@ void RecordingScriptingInterface::loadLastRecording() {
void RecordingScriptingInterface::processAvatarFrame(const Frame::ConstPointer& frame) { void RecordingScriptingInterface::processAvatarFrame(const Frame::ConstPointer& frame) {
Q_ASSERT(QThread::currentThread() == thread()); Q_ASSERT(QThread::currentThread() == thread());
if (!_controlledAvatar) {
return;
}
AvatarData::fromFrame(frame->data, _dummyAvatar); AvatarData::fromFrame(frame->data, _dummyAvatar);
auto myAvatar = DependencyManager::get<AvatarManager>()->getMyAvatar();
if (_useHeadModel && _dummyAvatar.getFaceModelURL().isValid() && if (_useHeadModel && _dummyAvatar.getFaceModelURL().isValid() &&
(_dummyAvatar.getFaceModelURL() != myAvatar->getFaceModelURL())) { (_dummyAvatar.getFaceModelURL() != _controlledAvatar->getFaceModelURL())) {
// FIXME // FIXME
//myAvatar->setFaceModelURL(_dummyAvatar.getFaceModelURL()); //myAvatar->setFaceModelURL(_dummyAvatar.getFaceModelURL());
} }
if (_useSkeletonModel && _dummyAvatar.getSkeletonModelURL().isValid() && if (_useSkeletonModel && _dummyAvatar.getSkeletonModelURL().isValid() &&
(_dummyAvatar.getSkeletonModelURL() != myAvatar->getSkeletonModelURL())) { (_dummyAvatar.getSkeletonModelURL() != _controlledAvatar->getSkeletonModelURL())) {
// FIXME // FIXME
//myAvatar->useFullAvatarURL() //myAvatar->useFullAvatarURL()
} }
if (_useDisplayName && _dummyAvatar.getDisplayName() != myAvatar->getDisplayName()) { if (_useDisplayName && _dummyAvatar.getDisplayName() != _controlledAvatar->getDisplayName()) {
myAvatar->setDisplayName(_dummyAvatar.getDisplayName()); _controlledAvatar->setDisplayName(_dummyAvatar.getDisplayName());
} }
myAvatar->setPosition(_dummyAvatar.getPosition()); _controlledAvatar->setPosition(_dummyAvatar.getPosition());
myAvatar->setOrientation(_dummyAvatar.getOrientation()); _controlledAvatar->setOrientation(_dummyAvatar.getOrientation());
// FIXME attachments // FIXME attachments
// FIXME joints // FIXME joints
@ -250,6 +269,6 @@ void RecordingScriptingInterface::processAudioInput(const QByteArray& audio) {
} }
void RecordingScriptingInterface::processAudioFrame(const recording::FrameConstPointer& frame) { void RecordingScriptingInterface::processAudioFrame(const recording::FrameConstPointer& frame) {
auto audioClient = DependencyManager::get<AudioClient>(); // auto audioClient = DependencyManager::get<AudioClient>();
audioClient->handleRecordedAudioInput(frame->data); // audioClient->handleRecordedAudioInput(frame->data);
} }

View file

@ -24,6 +24,8 @@ class RecordingScriptingInterface : public QObject, public Dependency {
public: public:
RecordingScriptingInterface(); RecordingScriptingInterface();
void setControlledAvatar(AvatarData* avatar);
public slots: public slots:
void loadRecording(const QString& filename); void loadRecording(const QString& filename);
@ -79,6 +81,7 @@ private:
Flag _useSkeletonModel { false }; Flag _useSkeletonModel { false };
recording::ClipPointer _lastClip; recording::ClipPointer _lastClip;
AvatarData _dummyAvatar; AvatarData _dummyAvatar;
AvatarData* _controlledAvatar;
}; };
#endif // hifi_RecordingScriptingInterface_h #endif // hifi_RecordingScriptingInterface_h

View file

@ -47,6 +47,7 @@
#include "WebSocketClass.h" #include "WebSocketClass.h"
#include "SceneScriptingInterface.h" #include "SceneScriptingInterface.h"
#include "RecordingScriptingInterface.h"
#include "MIDIEvent.h" #include "MIDIEvent.h"
@ -377,6 +378,9 @@ void ScriptEngine::init() {
auto scriptingInterface = DependencyManager::get<controller::ScriptingInterface>(); auto scriptingInterface = DependencyManager::get<controller::ScriptingInterface>();
registerGlobalObject("Controller", scriptingInterface.data()); registerGlobalObject("Controller", scriptingInterface.data());
UserInputMapper::registerControllerTypes(this); UserInputMapper::registerControllerTypes(this);
auto recordingInterface = DependencyManager::get<RecordingScriptingInterface>();
registerGlobalObject("Recording", recordingInterface.data());
} }
void ScriptEngine::registerValue(const QString& valueName, QScriptValue value) { void ScriptEngine::registerValue(const QString& valueName, QScriptValue value) {