mirror of
https://github.com/overte-org/overte.git
synced 2025-04-13 22:09:06 +02:00
Merge pull request #6413 from samcake/controllers
Recording: Moving the Recording js interface to the Script engine
This commit is contained in:
commit
2636e43fab
5 changed files with 65 additions and 25 deletions
|
@ -25,10 +25,14 @@
|
|||
#include <SoundCache.h>
|
||||
#include <UUID.h>
|
||||
|
||||
#include <recording/Deck.h>
|
||||
#include <recording/Recorder.h>
|
||||
|
||||
#include <WebSocketServerClass.h>
|
||||
#include <EntityScriptingInterface.h> // TODO: consider moving to scriptengine.h
|
||||
|
||||
#include "avatars/ScriptableAvatar.h"
|
||||
#include "RecordingScriptingInterface.h"
|
||||
|
||||
#include "Agent.h"
|
||||
|
||||
|
@ -46,6 +50,9 @@ Agent::Agent(NLPacket& packet) :
|
|||
|
||||
DependencyManager::set<ResourceCacheSharedItems>();
|
||||
DependencyManager::set<SoundCache>();
|
||||
DependencyManager::set<recording::Deck>();
|
||||
DependencyManager::set<recording::Recorder>();
|
||||
DependencyManager::set<RecordingScriptingInterface>();
|
||||
|
||||
auto& packetReceiver = DependencyManager::get<NodeList>()->getPacketReceiver();
|
||||
|
||||
|
@ -177,7 +184,7 @@ void Agent::run() {
|
|||
|
||||
// give this AvatarData object to the script engine
|
||||
setAvatarData(&scriptedAvatar, "Avatar");
|
||||
|
||||
|
||||
auto avatarHashMap = DependencyManager::set<AvatarHashMap>();
|
||||
_scriptEngine->registerGlobalObject("AvatarList", avatarHashMap.data());
|
||||
|
||||
|
@ -237,6 +244,8 @@ void Agent::setIsAvatar(bool isAvatar) {
|
|||
}
|
||||
|
||||
if (!_isAvatar) {
|
||||
DependencyManager::get<RecordingScriptingInterface>()->setControlledAvatar(nullptr);
|
||||
|
||||
if (_avatarIdentityTimer) {
|
||||
_avatarIdentityTimer->stop();
|
||||
delete _avatarIdentityTimer;
|
||||
|
@ -254,6 +263,7 @@ void Agent::setIsAvatar(bool isAvatar) {
|
|||
void Agent::setAvatarData(AvatarData* avatarData, const QString& objectName) {
|
||||
_avatarData = avatarData;
|
||||
_scriptEngine->registerGlobalObject(objectName, avatarData);
|
||||
DependencyManager::get<RecordingScriptingInterface>()->setControlledAvatar(avatarData);
|
||||
}
|
||||
|
||||
void Agent::sendAvatarIdentityPacket() {
|
||||
|
|
|
@ -87,6 +87,7 @@
|
|||
#include <RenderDeferredTask.h>
|
||||
#include <ResourceCache.h>
|
||||
#include <SceneScriptingInterface.h>
|
||||
#include <RecordingScriptingInterface.h>
|
||||
#include <ScriptCache.h>
|
||||
#include <SoundCache.h>
|
||||
#include <TextureCache.h>
|
||||
|
@ -127,7 +128,6 @@
|
|||
#include "scripting/LocationScriptingInterface.h"
|
||||
#include "scripting/MenuScriptingInterface.h"
|
||||
#include "scripting/SettingsScriptingInterface.h"
|
||||
#include "scripting/RecordingScriptingInterface.h"
|
||||
#include "scripting/WebWindowClass.h"
|
||||
#include "scripting/WindowScriptingInterface.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);
|
||||
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.
|
||||
getMyAvatar()->updateMotionBehaviorFromMenu();
|
||||
|
||||
|
@ -837,6 +841,7 @@ void Application::cleanupBeforeQuit() {
|
|||
#ifdef HAVE_IVIEWHMD
|
||||
DependencyManager::get<EyeTracker>()->setEnabled(false, true);
|
||||
#endif
|
||||
DependencyManager::get<RecordingScriptingInterface>()->setControlledAvatar(nullptr);
|
||||
|
||||
AnimDebugDraw::getInstance().shutdown();
|
||||
|
||||
|
@ -4006,7 +4011,6 @@ void Application::registerScriptEngineWithApplicationServices(ScriptEngine* scri
|
|||
RayToOverlayIntersectionResultFromScriptValue);
|
||||
|
||||
scriptEngine->registerGlobalObject("Desktop", DependencyManager::get<DesktopScriptingInterface>().data());
|
||||
scriptEngine->registerGlobalObject("Recording", DependencyManager::get<RecordingScriptingInterface>().data());
|
||||
|
||||
scriptEngine->registerGlobalObject("Window", DependencyManager::get<WindowScriptingInterface>().data());
|
||||
scriptEngine->registerGetterSetter("location", LocationScriptingInterface::locationGetter,
|
||||
|
|
|
@ -8,17 +8,19 @@
|
|||
|
||||
#include "RecordingScriptingInterface.h"
|
||||
|
||||
#include <QThread>
|
||||
|
||||
#include <recording/Deck.h>
|
||||
#include <recording/Recorder.h>
|
||||
#include <recording/Clip.h>
|
||||
#include <recording/Frame.h>
|
||||
#include <NumericalConstants.h>
|
||||
#include <AudioClient.h>
|
||||
// FiXME
|
||||
//#include <AudioClient.h>
|
||||
#include <AudioConstants.h>
|
||||
#include <Transform.h>
|
||||
|
||||
#include "avatar/AvatarManager.h"
|
||||
#include "Application.h"
|
||||
#include "InterfaceLogging.h"
|
||||
#include "ScriptEngineLogging.h"
|
||||
|
||||
typedef int16_t AudioSample;
|
||||
|
||||
|
@ -43,8 +45,13 @@ RecordingScriptingInterface::RecordingScriptingInterface() {
|
|||
_player = DependencyManager::get<Deck>();
|
||||
_recorder = DependencyManager::get<Recorder>();
|
||||
|
||||
auto audioClient = DependencyManager::get<AudioClient>();
|
||||
connect(audioClient.data(), &AudioClient::inputReceived, this, &RecordingScriptingInterface::processAudioInput);
|
||||
// FIXME : Disabling Sound
|
||||
// auto audioClient = DependencyManager::get<AudioClient>();
|
||||
// connect(audioClient.data(), &AudioClient::inputReceived, this, &RecordingScriptingInterface::processAudioInput);
|
||||
}
|
||||
|
||||
void RecordingScriptingInterface::setControlledAvatar(AvatarData* avatar) {
|
||||
_controlledAvatar = avatar;
|
||||
}
|
||||
|
||||
bool RecordingScriptingInterface::isPlaying() const {
|
||||
|
@ -84,10 +91,10 @@ void RecordingScriptingInterface::startPlaying() {
|
|||
QMetaObject::invokeMethod(this, "startPlaying", Qt::BlockingQueuedConnection);
|
||||
return;
|
||||
}
|
||||
auto myAvatar = DependencyManager::get<AvatarManager>()->getMyAvatar();
|
||||
|
||||
// Playback from the current position
|
||||
if (_playFromCurrentLocation) {
|
||||
_dummyAvatar.setRecordingBasis(std::make_shared<Transform>(myAvatar->getTransform()));
|
||||
if (_playFromCurrentLocation && _controlledAvatar) {
|
||||
_dummyAvatar.setRecordingBasis(std::make_shared<Transform>(_controlledAvatar->getTransform()));
|
||||
} else {
|
||||
_dummyAvatar.clearRecordingBasis();
|
||||
}
|
||||
|
@ -160,7 +167,7 @@ float RecordingScriptingInterface::recorderElapsed() const {
|
|||
|
||||
void RecordingScriptingInterface::startRecording() {
|
||||
if (_recorder->isRecording()) {
|
||||
qCWarning(interfaceapp) << "Recorder is already running";
|
||||
qCWarning(scriptengine) << "Recorder is already running";
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -170,7 +177,11 @@ void RecordingScriptingInterface::startRecording() {
|
|||
}
|
||||
|
||||
_recordingEpoch = Frame::epochForFrameTime(0);
|
||||
DependencyManager::get<AvatarManager>()->getMyAvatar()->setRecordingBasis();
|
||||
|
||||
if (_controlledAvatar) {
|
||||
_controlledAvatar->setRecordingBasis();
|
||||
}
|
||||
|
||||
_recorder->start();
|
||||
}
|
||||
|
||||
|
@ -178,7 +189,10 @@ void RecordingScriptingInterface::stopRecording() {
|
|||
_recorder->stop();
|
||||
_lastClip = _recorder->getClip();
|
||||
_lastClip->seek(0);
|
||||
DependencyManager::get<AvatarManager>()->getMyAvatar()->clearRecordingBasis();
|
||||
|
||||
if (_controlledAvatar) {
|
||||
_controlledAvatar->clearRecordingBasis();
|
||||
}
|
||||
}
|
||||
|
||||
void RecordingScriptingInterface::saveRecording(const QString& filename) {
|
||||
|
@ -203,7 +217,7 @@ void RecordingScriptingInterface::loadLastRecording() {
|
|||
}
|
||||
|
||||
if (!_lastClip) {
|
||||
qCDebug(interfaceapp) << "There is no recording to load";
|
||||
qCDebug(scriptengine) << "There is no recording to load";
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -214,27 +228,32 @@ void RecordingScriptingInterface::loadLastRecording() {
|
|||
void RecordingScriptingInterface::processAvatarFrame(const Frame::ConstPointer& frame) {
|
||||
Q_ASSERT(QThread::currentThread() == thread());
|
||||
|
||||
if (!_controlledAvatar) {
|
||||
return;
|
||||
}
|
||||
|
||||
AvatarData::fromFrame(frame->data, _dummyAvatar);
|
||||
|
||||
auto myAvatar = DependencyManager::get<AvatarManager>()->getMyAvatar();
|
||||
|
||||
|
||||
if (_useHeadModel && _dummyAvatar.getFaceModelURL().isValid() &&
|
||||
(_dummyAvatar.getFaceModelURL() != myAvatar->getFaceModelURL())) {
|
||||
(_dummyAvatar.getFaceModelURL() != _controlledAvatar->getFaceModelURL())) {
|
||||
// FIXME
|
||||
//myAvatar->setFaceModelURL(_dummyAvatar.getFaceModelURL());
|
||||
}
|
||||
|
||||
if (_useSkeletonModel && _dummyAvatar.getSkeletonModelURL().isValid() &&
|
||||
(_dummyAvatar.getSkeletonModelURL() != myAvatar->getSkeletonModelURL())) {
|
||||
(_dummyAvatar.getSkeletonModelURL() != _controlledAvatar->getSkeletonModelURL())) {
|
||||
// FIXME
|
||||
//myAvatar->useFullAvatarURL()
|
||||
}
|
||||
|
||||
if (_useDisplayName && _dummyAvatar.getDisplayName() != myAvatar->getDisplayName()) {
|
||||
myAvatar->setDisplayName(_dummyAvatar.getDisplayName());
|
||||
if (_useDisplayName && _dummyAvatar.getDisplayName() != _controlledAvatar->getDisplayName()) {
|
||||
_controlledAvatar->setDisplayName(_dummyAvatar.getDisplayName());
|
||||
}
|
||||
|
||||
myAvatar->setPosition(_dummyAvatar.getPosition());
|
||||
myAvatar->setOrientation(_dummyAvatar.getOrientation());
|
||||
_controlledAvatar->setPosition(_dummyAvatar.getPosition());
|
||||
_controlledAvatar->setOrientation(_dummyAvatar.getOrientation());
|
||||
|
||||
// FIXME attachments
|
||||
// FIXME joints
|
||||
|
@ -250,6 +269,6 @@ void RecordingScriptingInterface::processAudioInput(const QByteArray& audio) {
|
|||
}
|
||||
|
||||
void RecordingScriptingInterface::processAudioFrame(const recording::FrameConstPointer& frame) {
|
||||
auto audioClient = DependencyManager::get<AudioClient>();
|
||||
audioClient->handleRecordedAudioInput(frame->data);
|
||||
// auto audioClient = DependencyManager::get<AudioClient>();
|
||||
// audioClient->handleRecordedAudioInput(frame->data);
|
||||
}
|
|
@ -24,6 +24,8 @@ class RecordingScriptingInterface : public QObject, public Dependency {
|
|||
public:
|
||||
RecordingScriptingInterface();
|
||||
|
||||
void setControlledAvatar(AvatarData* avatar);
|
||||
|
||||
public slots:
|
||||
void loadRecording(const QString& filename);
|
||||
|
||||
|
@ -79,6 +81,7 @@ private:
|
|||
Flag _useSkeletonModel { false };
|
||||
recording::ClipPointer _lastClip;
|
||||
AvatarData _dummyAvatar;
|
||||
AvatarData* _controlledAvatar;
|
||||
};
|
||||
|
||||
#endif // hifi_RecordingScriptingInterface_h
|
|
@ -47,6 +47,7 @@
|
|||
#include "WebSocketClass.h"
|
||||
|
||||
#include "SceneScriptingInterface.h"
|
||||
#include "RecordingScriptingInterface.h"
|
||||
|
||||
#include "MIDIEvent.h"
|
||||
|
||||
|
@ -377,6 +378,9 @@ void ScriptEngine::init() {
|
|||
auto scriptingInterface = DependencyManager::get<controller::ScriptingInterface>();
|
||||
registerGlobalObject("Controller", scriptingInterface.data());
|
||||
UserInputMapper::registerControllerTypes(this);
|
||||
|
||||
auto recordingInterface = DependencyManager::get<RecordingScriptingInterface>();
|
||||
registerGlobalObject("Recording", recordingInterface.data());
|
||||
}
|
||||
|
||||
void ScriptEngine::registerValue(const QString& valueName, QScriptValue value) {
|
||||
|
|
Loading…
Reference in a new issue