mirror of
https://github.com/HifiExperiments/overte.git
synced 2025-08-05 21:22:52 +02:00
merge from master
This commit is contained in:
commit
134a026d8a
231 changed files with 2236 additions and 1241 deletions
|
@ -11,7 +11,7 @@ link_hifi_libraries(
|
||||||
physics
|
physics
|
||||||
audio audio-client
|
audio audio-client
|
||||||
ui midi controllers pointers
|
ui midi controllers pointers
|
||||||
model model-networking fbx animation
|
graphics model-networking fbx animation
|
||||||
entities entities-renderer
|
entities entities-renderer
|
||||||
avatars avatars-renderer
|
avatars avatars-renderer
|
||||||
ui-plugins input-plugins
|
ui-plugins input-plugins
|
||||||
|
|
|
@ -11,7 +11,7 @@ setup_memory_debugger()
|
||||||
|
|
||||||
# link in the shared libraries
|
# link in the shared libraries
|
||||||
link_hifi_libraries(
|
link_hifi_libraries(
|
||||||
audio avatars octree gpu model fbx entities
|
audio avatars octree gpu graphics fbx entities
|
||||||
networking animation recording shared script-engine embedded-webserver
|
networking animation recording shared script-engine embedded-webserver
|
||||||
controllers physics plugins midi image
|
controllers physics plugins midi image
|
||||||
)
|
)
|
||||||
|
|
|
@ -439,7 +439,7 @@ void Agent::executeScript() {
|
||||||
encodedBuffer = audio;
|
encodedBuffer = audio;
|
||||||
}
|
}
|
||||||
|
|
||||||
AbstractAudioInterface::emitAudioPacket(encodedBuffer.data(), encodedBuffer.size(), audioSequenceNumber,
|
AbstractAudioInterface::emitAudioPacket(encodedBuffer.data(), encodedBuffer.size(), audioSequenceNumber, false,
|
||||||
audioTransform, scriptedAvatar->getWorldPosition(), glm::vec3(0),
|
audioTransform, scriptedAvatar->getWorldPosition(), glm::vec3(0),
|
||||||
packetType, _selectedCodecName);
|
packetType, _selectedCodecName);
|
||||||
});
|
});
|
||||||
|
|
|
@ -275,17 +275,28 @@ int AudioMixerClientData::parseData(ReceivedMessage& message) {
|
||||||
if (micStreamIt == _audioStreams.end()) {
|
if (micStreamIt == _audioStreams.end()) {
|
||||||
// we don't have a mic stream yet, so add it
|
// we don't have a mic stream yet, so add it
|
||||||
|
|
||||||
// read the channel flag to see if our stream is stereo or not
|
// hop past the sequence number that leads the packet
|
||||||
message.seek(sizeof(quint16));
|
message.seek(sizeof(quint16));
|
||||||
|
|
||||||
quint8 channelFlag;
|
// pull the codec string from the packet
|
||||||
message.readPrimitive(&channelFlag);
|
auto codecString = message.readString();
|
||||||
|
|
||||||
bool isStereo = channelFlag == 1;
|
// determine if the stream is stereo or not
|
||||||
|
bool isStereo;
|
||||||
|
if (packetType == PacketType::SilentAudioFrame
|
||||||
|
|| packetType == PacketType::ReplicatedSilentAudioFrame) {
|
||||||
|
quint16 numSilentSamples;
|
||||||
|
message.readPrimitive(&numSilentSamples);
|
||||||
|
isStereo = numSilentSamples == AudioConstants::NETWORK_FRAME_SAMPLES_STEREO;
|
||||||
|
} else {
|
||||||
|
quint8 channelFlag;
|
||||||
|
message.readPrimitive(&channelFlag);
|
||||||
|
isStereo = channelFlag == 1;
|
||||||
|
}
|
||||||
|
|
||||||
auto avatarAudioStream = new AvatarAudioStream(isStereo, AudioMixer::getStaticJitterFrames());
|
auto avatarAudioStream = new AvatarAudioStream(isStereo, AudioMixer::getStaticJitterFrames());
|
||||||
avatarAudioStream->setupCodec(_codec, _selectedCodecName, AudioConstants::MONO);
|
avatarAudioStream->setupCodec(_codec, _selectedCodecName, isStereo ? AudioConstants::STEREO : AudioConstants::MONO);
|
||||||
qCDebug(audio) << "creating new AvatarAudioStream... codec:" << _selectedCodecName;
|
qCDebug(audio) << "creating new AvatarAudioStream... codec:" << _selectedCodecName << "isStereo:" << isStereo;
|
||||||
|
|
||||||
connect(avatarAudioStream, &InboundAudioStream::mismatchedAudioCodec,
|
connect(avatarAudioStream, &InboundAudioStream::mismatchedAudioCodec,
|
||||||
this, &AudioMixerClientData::handleMismatchAudioFormat);
|
this, &AudioMixerClientData::handleMismatchAudioFormat);
|
||||||
|
@ -324,7 +335,7 @@ int AudioMixerClientData::parseData(ReceivedMessage& message) {
|
||||||
|
|
||||||
#if INJECTORS_SUPPORT_CODECS
|
#if INJECTORS_SUPPORT_CODECS
|
||||||
injectorStream->setupCodec(_codec, _selectedCodecName, isStereo ? AudioConstants::STEREO : AudioConstants::MONO);
|
injectorStream->setupCodec(_codec, _selectedCodecName, isStereo ? AudioConstants::STEREO : AudioConstants::MONO);
|
||||||
qCDebug(audio) << "creating new injectorStream... codec:" << _selectedCodecName;
|
qCDebug(audio) << "creating new injectorStream... codec:" << _selectedCodecName << "isStereo:" << isStereo;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
auto emplaced = _audioStreams.emplace(
|
auto emplaced = _audioStreams.emplace(
|
||||||
|
@ -567,7 +578,8 @@ void AudioMixerClientData::setupCodec(CodecPluginPointer codec, const QString& c
|
||||||
|
|
||||||
auto avatarAudioStream = getAvatarAudioStream();
|
auto avatarAudioStream = getAvatarAudioStream();
|
||||||
if (avatarAudioStream) {
|
if (avatarAudioStream) {
|
||||||
avatarAudioStream->setupCodec(codec, codecName, AudioConstants::MONO);
|
avatarAudioStream->setupCodec(codec, codecName, avatarAudioStream->isStereo() ? AudioConstants::STEREO : AudioConstants::MONO);
|
||||||
|
qCDebug(audio) << "setting AvatarAudioStream... codec:" << _selectedCodecName << "isStereo:" << avatarAudioStream->isStereo();
|
||||||
}
|
}
|
||||||
|
|
||||||
#if INJECTORS_SUPPORT_CODECS
|
#if INJECTORS_SUPPORT_CODECS
|
||||||
|
|
|
@ -11,6 +11,7 @@
|
||||||
|
|
||||||
#include <udt/PacketHeaders.h>
|
#include <udt/PacketHeaders.h>
|
||||||
|
|
||||||
|
#include "AudioLogging.h"
|
||||||
#include "AvatarAudioStream.h"
|
#include "AvatarAudioStream.h"
|
||||||
|
|
||||||
AvatarAudioStream::AvatarAudioStream(bool isStereo, int numStaticJitterFrames) :
|
AvatarAudioStream::AvatarAudioStream(bool isStereo, int numStaticJitterFrames) :
|
||||||
|
@ -41,6 +42,15 @@ int AvatarAudioStream::parseStreamProperties(PacketType type, const QByteArray&
|
||||||
_ringBuffer.resizeForFrameSize(isStereo
|
_ringBuffer.resizeForFrameSize(isStereo
|
||||||
? AudioConstants::NETWORK_FRAME_SAMPLES_STEREO
|
? AudioConstants::NETWORK_FRAME_SAMPLES_STEREO
|
||||||
: AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL);
|
: AudioConstants::NETWORK_FRAME_SAMPLES_PER_CHANNEL);
|
||||||
|
// restart the codec
|
||||||
|
if (_codec) {
|
||||||
|
if (_decoder) {
|
||||||
|
_codec->releaseDecoder(_decoder);
|
||||||
|
}
|
||||||
|
_decoder = _codec->createDecoder(AudioConstants::SAMPLE_RATE, isStereo ? AudioConstants::STEREO : AudioConstants::MONO);
|
||||||
|
}
|
||||||
|
qCDebug(audio) << "resetting AvatarAudioStream... codec:" << _selectedCodecName << "isStereo:" << isStereo;
|
||||||
|
|
||||||
_isStereo = isStereo;
|
_isStereo = isStereo;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -116,8 +116,9 @@ public:
|
||||||
void setLastOtherAvatarEncodeTime(const QUuid& otherAvatar, const uint64_t& time);
|
void setLastOtherAvatarEncodeTime(const QUuid& otherAvatar, const uint64_t& time);
|
||||||
|
|
||||||
QVector<JointData>& getLastOtherAvatarSentJoints(QUuid otherAvatar) {
|
QVector<JointData>& getLastOtherAvatarSentJoints(QUuid otherAvatar) {
|
||||||
_lastOtherAvatarSentJoints[otherAvatar].resize(_avatar->getJointCount());
|
auto& lastOtherAvatarSentJoints = _lastOtherAvatarSentJoints[otherAvatar];
|
||||||
return _lastOtherAvatarSentJoints[otherAvatar];
|
lastOtherAvatarSentJoints.resize(_avatar->getJointCount());
|
||||||
|
return lastOtherAvatarSentJoints;
|
||||||
}
|
}
|
||||||
|
|
||||||
void queuePacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer node);
|
void queuePacket(QSharedPointer<ReceivedMessage> message, SharedNodePointer node);
|
||||||
|
|
|
@ -201,7 +201,7 @@ endif()
|
||||||
|
|
||||||
# link required hifi libraries
|
# link required hifi libraries
|
||||||
link_hifi_libraries(
|
link_hifi_libraries(
|
||||||
shared octree ktx gpu gl procedural model render
|
shared octree ktx gpu gl procedural graphics render
|
||||||
pointers
|
pointers
|
||||||
recording fbx networking model-networking entities avatars trackers
|
recording fbx networking model-networking entities avatars trackers
|
||||||
audio audio-client animation script-engine physics
|
audio audio-client animation script-engine physics
|
||||||
|
|
Binary file not shown.
|
@ -41,9 +41,9 @@ Item {
|
||||||
onNewViewRequestedCallback: {
|
onNewViewRequestedCallback: {
|
||||||
// desktop is not defined for web-entities or tablet
|
// desktop is not defined for web-entities or tablet
|
||||||
if (typeof desktop !== "undefined") {
|
if (typeof desktop !== "undefined") {
|
||||||
desktop.openBrowserWindow(request, profile);
|
desktop.openBrowserWindow(request, webViewCoreProfile);
|
||||||
} else {
|
} else {
|
||||||
tabletRoot.openBrowserWindow(request, profile);
|
tabletRoot.openBrowserWindow(request, webViewCoreProfile);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,85 +0,0 @@
|
||||||
//
|
|
||||||
// AvatarBrowser.qml
|
|
||||||
//
|
|
||||||
// Created by Bradley Austin Davis on 30 Aug 2015
|
|
||||||
// Copyright 2015 High Fidelity, Inc.
|
|
||||||
//
|
|
||||||
// Distributed under the Apache License, Version 2.0.
|
|
||||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
|
||||||
//
|
|
||||||
|
|
||||||
import QtQuick 2.5
|
|
||||||
import QtQuick.Controls 1.4
|
|
||||||
import QtWebChannel 1.0
|
|
||||||
import QtWebEngine 1.2
|
|
||||||
|
|
||||||
import "../../windows"
|
|
||||||
import "../../controls-uit"
|
|
||||||
import "../../styles-uit"
|
|
||||||
|
|
||||||
Window {
|
|
||||||
id: root
|
|
||||||
HifiConstants { id: hifi }
|
|
||||||
width: 900; height: 700
|
|
||||||
resizable: true
|
|
||||||
modality: Qt.ApplicationModal
|
|
||||||
|
|
||||||
Item {
|
|
||||||
anchors.fill: parent
|
|
||||||
|
|
||||||
property bool keyboardEnabled: false
|
|
||||||
property bool keyboardRaised: true
|
|
||||||
property bool punctuationMode: false
|
|
||||||
|
|
||||||
BaseWebView {
|
|
||||||
id: webview
|
|
||||||
url: Account.metaverseServerURL + "/marketplace?category=avatars"
|
|
||||||
focus: true
|
|
||||||
|
|
||||||
anchors {
|
|
||||||
top: parent.top
|
|
||||||
left: parent.left
|
|
||||||
right: parent.right
|
|
||||||
bottom: keyboard.top
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create a global EventBridge object for raiseAndLowerKeyboard.
|
|
||||||
WebEngineScript {
|
|
||||||
id: createGlobalEventBridge
|
|
||||||
sourceCode: eventBridgeJavaScriptToInject
|
|
||||||
injectionPoint: WebEngineScript.DocumentCreation
|
|
||||||
worldId: WebEngineScript.MainWorld
|
|
||||||
}
|
|
||||||
|
|
||||||
// Detect when may want to raise and lower keyboard.
|
|
||||||
WebEngineScript {
|
|
||||||
id: raiseAndLowerKeyboard
|
|
||||||
injectionPoint: WebEngineScript.Deferred
|
|
||||||
sourceUrl: resourceDirectoryUrl + "html/raiseAndLowerKeyboard.js"
|
|
||||||
worldId: WebEngineScript.MainWorld
|
|
||||||
}
|
|
||||||
|
|
||||||
userScripts: [ createGlobalEventBridge, raiseAndLowerKeyboard ]
|
|
||||||
|
|
||||||
Component.onCompleted: {
|
|
||||||
webChannel.registerObject("eventBridge", eventBridge);
|
|
||||||
webChannel.registerObject("eventBridgeWrapper", eventBridgeWrapper);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Keyboard {
|
|
||||||
id: keyboard
|
|
||||||
raised: parent.keyboardEnabled && parent.keyboardRaised
|
|
||||||
numeric: parent.punctuationMode
|
|
||||||
anchors {
|
|
||||||
left: parent.left
|
|
||||||
right: parent.right
|
|
||||||
bottom: parent.bottom
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Component.onCompleted: {
|
|
||||||
keyboardEnabled = HMD.active;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -99,25 +99,9 @@ Preference {
|
||||||
leftMargin: dataTextField.acceptableInput ? hifi.dimensions.contentSpacing.x : 0
|
leftMargin: dataTextField.acceptableInput ? hifi.dimensions.contentSpacing.x : 0
|
||||||
}
|
}
|
||||||
onClicked: {
|
onClicked: {
|
||||||
if (typeof desktop !== "undefined") {
|
ApplicationInterface.loadAvatarBrowser();
|
||||||
// Load dialog via OffscreenUi so that JavaScript EventBridge is available.
|
|
||||||
root.browser = OffscreenUi.load("dialogs/preferences/AvatarBrowser.qml");
|
|
||||||
root.browser.windowDestroyed.connect(function(){
|
|
||||||
root.browser = null;
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
root.browser = tabletAvatarBrowserBuilder.createObject(tabletRoot);
|
|
||||||
|
|
||||||
// Make dialog modal.
|
|
||||||
tabletRoot.openModal = root.browser;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Component {
|
|
||||||
id: tabletAvatarBrowserBuilder;
|
|
||||||
TabletAvatarBrowser { }
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -50,7 +50,7 @@ Item {
|
||||||
id: avatarImage
|
id: avatarImage
|
||||||
visible: profileUrl !== "" && userName !== "";
|
visible: profileUrl !== "" && userName !== "";
|
||||||
// Size
|
// Size
|
||||||
height: isMyCard ? 70 : 42;
|
height: isMyCard ? 84 : 42;
|
||||||
width: visible ? height : 0;
|
width: visible ? height : 0;
|
||||||
anchors.top: parent.top;
|
anchors.top: parent.top;
|
||||||
anchors.topMargin: isMyCard ? 0 : 8;
|
anchors.topMargin: isMyCard ? 0 : 8;
|
||||||
|
@ -520,7 +520,7 @@ Item {
|
||||||
Slider {
|
Slider {
|
||||||
id: gainSlider
|
id: gainSlider
|
||||||
// Size
|
// Size
|
||||||
width: thisNameCard.width;
|
width: isMyCard ? thisNameCard.width - 20 : thisNameCard.width;
|
||||||
height: 14
|
height: 14
|
||||||
// Anchors
|
// Anchors
|
||||||
anchors.verticalCenter: nameCardVUMeter.verticalCenter;
|
anchors.verticalCenter: nameCardVUMeter.verticalCenter;
|
||||||
|
|
|
@ -28,7 +28,7 @@ Rectangle {
|
||||||
// Properties
|
// Properties
|
||||||
property bool debug: false;
|
property bool debug: false;
|
||||||
property int myCardWidth: width - upperRightInfoContainer.width;
|
property int myCardWidth: width - upperRightInfoContainer.width;
|
||||||
property int myCardHeight: 80;
|
property int myCardHeight: 100;
|
||||||
property int rowHeight: 60;
|
property int rowHeight: 60;
|
||||||
property int actionButtonWidth: 55;
|
property int actionButtonWidth: 55;
|
||||||
property int locationColumnWidth: 170;
|
property int locationColumnWidth: 170;
|
||||||
|
|
|
@ -22,7 +22,6 @@ Item {
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
id: d
|
id: d
|
||||||
objectName: "stack"
|
objectName: "stack"
|
||||||
initialItem: topMenu
|
|
||||||
|
|
||||||
property var menuStack: []
|
property var menuStack: []
|
||||||
property var topMenu: null;
|
property var topMenu: null;
|
||||||
|
|
|
@ -1,111 +0,0 @@
|
||||||
//
|
|
||||||
// TabletAvatarBrowser.qml
|
|
||||||
//
|
|
||||||
// Created by David Rowe on 14 Mar 2017
|
|
||||||
// Copyright 2017 High Fidelity, Inc.
|
|
||||||
//
|
|
||||||
// Distributed under the Apache License, Version 2.0.
|
|
||||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
|
||||||
//
|
|
||||||
|
|
||||||
import QtQuick 2.5
|
|
||||||
import QtQuick.Controls 1.4
|
|
||||||
import QtWebChannel 1.0
|
|
||||||
import QtWebEngine 1.2
|
|
||||||
|
|
||||||
import "../../../../windows"
|
|
||||||
import "../../../../controls-uit"
|
|
||||||
import "../../../../styles-uit"
|
|
||||||
|
|
||||||
Item {
|
|
||||||
id: root
|
|
||||||
objectName: "ModelBrowserDialog"
|
|
||||||
|
|
||||||
property string title: "Attachment Model"
|
|
||||||
|
|
||||||
property bool keyboardEnabled: false
|
|
||||||
property bool keyboardRaised: false
|
|
||||||
property bool punctuationMode: false
|
|
||||||
|
|
||||||
anchors.fill: parent
|
|
||||||
|
|
||||||
BaseWebView {
|
|
||||||
id: webview
|
|
||||||
url: (Account.metaverseServerURL + "/marketplace?category=avatars")
|
|
||||||
focus: true
|
|
||||||
|
|
||||||
anchors {
|
|
||||||
top: parent.top
|
|
||||||
left: parent.left
|
|
||||||
right: parent.right
|
|
||||||
bottom: footer.top
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create a global EventBridge object for raiseAndLowerKeyboard.
|
|
||||||
WebEngineScript {
|
|
||||||
id: createGlobalEventBridge
|
|
||||||
sourceCode: eventBridgeJavaScriptToInject
|
|
||||||
injectionPoint: WebEngineScript.DocumentCreation
|
|
||||||
worldId: WebEngineScript.MainWorld
|
|
||||||
}
|
|
||||||
|
|
||||||
// Detect when may want to raise and lower keyboard.
|
|
||||||
WebEngineScript {
|
|
||||||
id: raiseAndLowerKeyboard
|
|
||||||
injectionPoint: WebEngineScript.Deferred
|
|
||||||
sourceUrl: resourceDirectoryUrl + "html/raiseAndLowerKeyboard.js"
|
|
||||||
worldId: WebEngineScript.MainWorld
|
|
||||||
}
|
|
||||||
|
|
||||||
userScripts: [ createGlobalEventBridge, raiseAndLowerKeyboard ]
|
|
||||||
|
|
||||||
Component.onCompleted: {
|
|
||||||
webChannel.registerObject("eventBridge", eventBridge);
|
|
||||||
webChannel.registerObject("eventBridgeWrapper", eventBridgeWrapper);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Rectangle {
|
|
||||||
id: footer
|
|
||||||
height: 40
|
|
||||||
|
|
||||||
anchors {
|
|
||||||
left: parent.left
|
|
||||||
right: parent.right
|
|
||||||
bottom: keyboard.top
|
|
||||||
}
|
|
||||||
|
|
||||||
color: hifi.colors.baseGray
|
|
||||||
|
|
||||||
Row {
|
|
||||||
anchors {
|
|
||||||
verticalCenter: parent.verticalCenter
|
|
||||||
right: parent.right
|
|
||||||
rightMargin: hifi.dimensions.contentMargin.x
|
|
||||||
}
|
|
||||||
|
|
||||||
Button {
|
|
||||||
text: "Cancel"
|
|
||||||
color: hifi.buttons.white
|
|
||||||
onClicked: root.destroy();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Keyboard {
|
|
||||||
id: keyboard
|
|
||||||
|
|
||||||
raised: parent.keyboardEnabled && parent.keyboardRaised
|
|
||||||
numeric: parent.punctuationMode
|
|
||||||
|
|
||||||
anchors {
|
|
||||||
left: parent.left
|
|
||||||
right: parent.right
|
|
||||||
bottom: parent.bottom
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
Component.onCompleted: {
|
|
||||||
keyboardEnabled = HMD.active;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -157,7 +157,7 @@
|
||||||
#include "scripting/AssetMappingsScriptingInterface.h"
|
#include "scripting/AssetMappingsScriptingInterface.h"
|
||||||
#include "scripting/ClipboardScriptingInterface.h"
|
#include "scripting/ClipboardScriptingInterface.h"
|
||||||
#include "scripting/DesktopScriptingInterface.h"
|
#include "scripting/DesktopScriptingInterface.h"
|
||||||
#include "scripting/GlobalServicesScriptingInterface.h"
|
#include "scripting/AccountServicesScriptingInterface.h"
|
||||||
#include "scripting/HMDScriptingInterface.h"
|
#include "scripting/HMDScriptingInterface.h"
|
||||||
#include "scripting/MenuScriptingInterface.h"
|
#include "scripting/MenuScriptingInterface.h"
|
||||||
#include "scripting/SettingsScriptingInterface.h"
|
#include "scripting/SettingsScriptingInterface.h"
|
||||||
|
@ -2376,9 +2376,11 @@ void Application::initializeUi() {
|
||||||
surfaceContext->setContextProperty("SoundCache", DependencyManager::get<SoundCache>().data());
|
surfaceContext->setContextProperty("SoundCache", DependencyManager::get<SoundCache>().data());
|
||||||
surfaceContext->setContextProperty("InputConfiguration", DependencyManager::get<InputConfiguration>().data());
|
surfaceContext->setContextProperty("InputConfiguration", DependencyManager::get<InputConfiguration>().data());
|
||||||
|
|
||||||
surfaceContext->setContextProperty("Account", GlobalServicesScriptingInterface::getInstance());
|
surfaceContext->setContextProperty("Account", AccountServicesScriptingInterface::getInstance()); // DEPRECATED - TO BE REMOVED
|
||||||
|
surfaceContext->setContextProperty("GlobalServices", AccountServicesScriptingInterface::getInstance()); // DEPRECATED - TO BE REMOVED
|
||||||
|
surfaceContext->setContextProperty("AccountServices", AccountServicesScriptingInterface::getInstance());
|
||||||
|
|
||||||
surfaceContext->setContextProperty("DialogsManager", _dialogsManagerScriptingInterface);
|
surfaceContext->setContextProperty("DialogsManager", _dialogsManagerScriptingInterface);
|
||||||
surfaceContext->setContextProperty("GlobalServices", GlobalServicesScriptingInterface::getInstance());
|
|
||||||
surfaceContext->setContextProperty("FaceTracker", DependencyManager::get<DdeFaceTracker>().data());
|
surfaceContext->setContextProperty("FaceTracker", DependencyManager::get<DdeFaceTracker>().data());
|
||||||
surfaceContext->setContextProperty("AvatarManager", DependencyManager::get<AvatarManager>().data());
|
surfaceContext->setContextProperty("AvatarManager", DependencyManager::get<AvatarManager>().data());
|
||||||
surfaceContext->setContextProperty("UndoStack", &_undoStackScriptingInterface);
|
surfaceContext->setContextProperty("UndoStack", &_undoStackScriptingInterface);
|
||||||
|
@ -5465,7 +5467,7 @@ void Application::clearDomainOctreeDetails() {
|
||||||
|
|
||||||
auto skyStage = DependencyManager::get<SceneScriptingInterface>()->getSkyStage();
|
auto skyStage = DependencyManager::get<SceneScriptingInterface>()->getSkyStage();
|
||||||
|
|
||||||
skyStage->setBackgroundMode(model::SunSkyStage::SKY_DEFAULT);
|
skyStage->setBackgroundMode(graphics::SunSkyStage::SKY_DEFAULT);
|
||||||
|
|
||||||
DependencyManager::get<AnimationCache>()->clearUnusedResources();
|
DependencyManager::get<AnimationCache>()->clearUnusedResources();
|
||||||
DependencyManager::get<ModelCache>()->clearUnusedResources();
|
DependencyManager::get<ModelCache>()->clearUnusedResources();
|
||||||
|
@ -5775,10 +5777,11 @@ void Application::registerScriptEngineWithApplicationServices(ScriptEnginePointe
|
||||||
scriptEngine->registerGlobalObject("ModelCache", DependencyManager::get<ModelCache>().data());
|
scriptEngine->registerGlobalObject("ModelCache", DependencyManager::get<ModelCache>().data());
|
||||||
scriptEngine->registerGlobalObject("SoundCache", DependencyManager::get<SoundCache>().data());
|
scriptEngine->registerGlobalObject("SoundCache", DependencyManager::get<SoundCache>().data());
|
||||||
|
|
||||||
scriptEngine->registerGlobalObject("Account", GlobalServicesScriptingInterface::getInstance());
|
|
||||||
scriptEngine->registerGlobalObject("DialogsManager", _dialogsManagerScriptingInterface);
|
scriptEngine->registerGlobalObject("DialogsManager", _dialogsManagerScriptingInterface);
|
||||||
|
|
||||||
scriptEngine->registerGlobalObject("GlobalServices", GlobalServicesScriptingInterface::getInstance());
|
scriptEngine->registerGlobalObject("Account", AccountServicesScriptingInterface::getInstance()); // DEPRECATED - TO BE REMOVED
|
||||||
|
scriptEngine->registerGlobalObject("GlobalServices", AccountServicesScriptingInterface::getInstance()); // DEPRECATED - TO BE REMOVED
|
||||||
|
scriptEngine->registerGlobalObject("AccountServices", AccountServicesScriptingInterface::getInstance());
|
||||||
qScriptRegisterMetaType(scriptEngine.data(), DownloadInfoResultToScriptValue, DownloadInfoResultFromScriptValue);
|
qScriptRegisterMetaType(scriptEngine.data(), DownloadInfoResultToScriptValue, DownloadInfoResultFromScriptValue);
|
||||||
|
|
||||||
scriptEngine->registerGlobalObject("FaceTracker", DependencyManager::get<DdeFaceTracker>().data());
|
scriptEngine->registerGlobalObject("FaceTracker", DependencyManager::get<DdeFaceTracker>().data());
|
||||||
|
@ -6178,7 +6181,7 @@ void Application::showAssetServerWidget(QString filePath) {
|
||||||
if (!hmd->getShouldShowTablet() && !isHMDMode()) {
|
if (!hmd->getShouldShowTablet() && !isHMDMode()) {
|
||||||
DependencyManager::get<OffscreenUi>()->show(url, "AssetServer", startUpload);
|
DependencyManager::get<OffscreenUi>()->show(url, "AssetServer", startUpload);
|
||||||
} else {
|
} else {
|
||||||
static const QUrl url("hifi/dialogs/TabletAssetServer.qml");
|
static const QUrl url("../dialogs/TabletAssetServer.qml");
|
||||||
tablet->pushOntoStack(url);
|
tablet->pushOntoStack(url);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -6807,6 +6810,15 @@ void Application::loadAddAvatarBookmarkDialog() const {
|
||||||
avatarBookmarks->addBookmark();
|
avatarBookmarks->addBookmark();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Application::loadAvatarBrowser() const {
|
||||||
|
auto tablet = dynamic_cast<TabletProxy*>(DependencyManager::get<TabletScriptingInterface>()->getTablet("com.highfidelity.interface.tablet.system"));
|
||||||
|
// construct the url to the marketplace item
|
||||||
|
QString url = NetworkingConstants::METAVERSE_SERVER_URL().toString() + "/marketplace?category=avatars";
|
||||||
|
QString MARKETPLACES_INJECT_SCRIPT_PATH = "file:///" + qApp->applicationDirPath() + "/scripts/system/html/js/marketplacesInject.js";
|
||||||
|
tablet->gotoWebScreen(url, MARKETPLACES_INJECT_SCRIPT_PATH);
|
||||||
|
DependencyManager::get<HMDScriptingInterface>()->openTablet();
|
||||||
|
}
|
||||||
|
|
||||||
void Application::takeSnapshot(bool notify, bool includeAnimated, float aspectRatio) {
|
void Application::takeSnapshot(bool notify, bool includeAnimated, float aspectRatio) {
|
||||||
postLambdaEvent([notify, includeAnimated, aspectRatio, this] {
|
postLambdaEvent([notify, includeAnimated, aspectRatio, this] {
|
||||||
// Get a screenshot and save it
|
// Get a screenshot and save it
|
||||||
|
@ -7389,11 +7401,13 @@ void Application::updateThreadPoolCount() const {
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::updateSystemTabletMode() {
|
void Application::updateSystemTabletMode() {
|
||||||
qApp->setProperty(hifi::properties::HMD, isHMDMode());
|
if (_settingsLoaded) {
|
||||||
if (isHMDMode()) {
|
qApp->setProperty(hifi::properties::HMD, isHMDMode());
|
||||||
DependencyManager::get<TabletScriptingInterface>()->setToolbarMode(getHmdTabletBecomesToolbarSetting());
|
if (isHMDMode()) {
|
||||||
} else {
|
DependencyManager::get<TabletScriptingInterface>()->setToolbarMode(getHmdTabletBecomesToolbarSetting());
|
||||||
DependencyManager::get<TabletScriptingInterface>()->setToolbarMode(getDesktopTabletBecomesToolbarSetting());
|
} else {
|
||||||
|
DependencyManager::get<TabletScriptingInterface>()->setToolbarMode(getDesktopTabletBecomesToolbarSetting());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -71,7 +71,7 @@
|
||||||
#include "UndoStackScriptingInterface.h"
|
#include "UndoStackScriptingInterface.h"
|
||||||
|
|
||||||
#include <procedural/ProceduralSkybox.h>
|
#include <procedural/ProceduralSkybox.h>
|
||||||
#include <model/Skybox.h>
|
#include <graphics/Skybox.h>
|
||||||
#include <ModelScriptingInterface.h>
|
#include <ModelScriptingInterface.h>
|
||||||
#include "FrameTimingsScriptingInterface.h"
|
#include "FrameTimingsScriptingInterface.h"
|
||||||
|
|
||||||
|
@ -270,7 +270,7 @@ public:
|
||||||
void takeSecondaryCameraSnapshot();
|
void takeSecondaryCameraSnapshot();
|
||||||
void shareSnapshot(const QString& filename, const QUrl& href = QUrl(""));
|
void shareSnapshot(const QString& filename, const QUrl& href = QUrl(""));
|
||||||
|
|
||||||
model::SkyboxPointer getDefaultSkybox() const { return _defaultSkybox; }
|
graphics::SkyboxPointer getDefaultSkybox() const { return _defaultSkybox; }
|
||||||
gpu::TexturePointer getDefaultSkyboxTexture() const { return _defaultSkyboxTexture; }
|
gpu::TexturePointer getDefaultSkyboxTexture() const { return _defaultSkyboxTexture; }
|
||||||
gpu::TexturePointer getDefaultSkyboxAmbientTexture() const { return _defaultSkyboxAmbientTexture; }
|
gpu::TexturePointer getDefaultSkyboxAmbientTexture() const { return _defaultSkyboxAmbientTexture; }
|
||||||
|
|
||||||
|
@ -309,6 +309,7 @@ public slots:
|
||||||
void toggleEntityScriptServerLogDialog();
|
void toggleEntityScriptServerLogDialog();
|
||||||
Q_INVOKABLE void showAssetServerWidget(QString filePath = "");
|
Q_INVOKABLE void showAssetServerWidget(QString filePath = "");
|
||||||
Q_INVOKABLE void loadAddAvatarBookmarkDialog() const;
|
Q_INVOKABLE void loadAddAvatarBookmarkDialog() const;
|
||||||
|
Q_INVOKABLE void loadAvatarBrowser() const;
|
||||||
Q_INVOKABLE SharedSoundPointer getSampleSound() const;
|
Q_INVOKABLE SharedSoundPointer getSampleSound() const;
|
||||||
|
|
||||||
void showDialog(const QUrl& widgetUrl, const QUrl& tabletUrl, const QString& name) const;
|
void showDialog(const QUrl& widgetUrl, const QUrl& tabletUrl, const QString& name) const;
|
||||||
|
@ -666,7 +667,7 @@ private:
|
||||||
|
|
||||||
ConnectionMonitor _connectionMonitor;
|
ConnectionMonitor _connectionMonitor;
|
||||||
|
|
||||||
model::SkyboxPointer _defaultSkybox { new ProceduralSkybox() } ;
|
graphics::SkyboxPointer _defaultSkybox { new ProceduralSkybox() } ;
|
||||||
gpu::TexturePointer _defaultSkyboxTexture;
|
gpu::TexturePointer _defaultSkyboxTexture;
|
||||||
gpu::TexturePointer _defaultSkyboxAmbientTexture;
|
gpu::TexturePointer _defaultSkyboxAmbientTexture;
|
||||||
|
|
||||||
|
|
|
@ -537,6 +537,7 @@ void MyAvatar::simulate(float deltaTime) {
|
||||||
// we've achived our final adjusted position and rotation for the avatar
|
// we've achived our final adjusted position and rotation for the avatar
|
||||||
// and all of its joints, now update our attachements.
|
// and all of its joints, now update our attachements.
|
||||||
Avatar::simulateAttachments(deltaTime);
|
Avatar::simulateAttachments(deltaTime);
|
||||||
|
relayJointDataToChildren();
|
||||||
|
|
||||||
if (!_skeletonModel->hasSkeleton()) {
|
if (!_skeletonModel->hasSkeleton()) {
|
||||||
// All the simulation that can be done has been done
|
// All the simulation that can be done has been done
|
||||||
|
|
|
@ -1,36 +0,0 @@
|
||||||
//
|
|
||||||
// AccountScriptingInterface.cpp
|
|
||||||
// interface/src/scripting
|
|
||||||
//
|
|
||||||
// Created by Stojce Slavkovski on 6/07/14.
|
|
||||||
// Copyright 2014 High Fidelity, Inc.
|
|
||||||
//
|
|
||||||
// Distributed under the Apache License, Version 2.0.
|
|
||||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
|
||||||
//
|
|
||||||
|
|
||||||
#include "AccountManager.h"
|
|
||||||
|
|
||||||
#include "AccountScriptingInterface.h"
|
|
||||||
#include "GlobalServicesScriptingInterface.h"
|
|
||||||
|
|
||||||
AccountScriptingInterface* AccountScriptingInterface::getInstance() {
|
|
||||||
static AccountScriptingInterface sharedInstance;
|
|
||||||
return &sharedInstance;
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AccountScriptingInterface::isLoggedIn() {
|
|
||||||
return GlobalServicesScriptingInterface::getInstance()->isLoggedIn();
|
|
||||||
}
|
|
||||||
|
|
||||||
void AccountScriptingInterface::logOut() {
|
|
||||||
GlobalServicesScriptingInterface::getInstance()->logOut();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool AccountScriptingInterface::loggedIn() const {
|
|
||||||
return GlobalServicesScriptingInterface::getInstance()->loggedIn();
|
|
||||||
}
|
|
||||||
|
|
||||||
QString AccountScriptingInterface::getUsername() {
|
|
||||||
return GlobalServicesScriptingInterface::getInstance()->getUsername();
|
|
||||||
}
|
|
|
@ -1,60 +0,0 @@
|
||||||
//
|
|
||||||
// AccountScriptingInterface.h
|
|
||||||
// interface/src/scripting
|
|
||||||
//
|
|
||||||
// Created by Stojce Slavkovski on 6/07/14.
|
|
||||||
// Copyright 2014 High Fidelity, Inc.
|
|
||||||
//
|
|
||||||
// Distributed under the Apache License, Version 2.0.
|
|
||||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
|
||||||
//
|
|
||||||
|
|
||||||
#ifndef hifi_AccountScriptingInterface_h
|
|
||||||
#define hifi_AccountScriptingInterface_h
|
|
||||||
|
|
||||||
#include <QObject>
|
|
||||||
|
|
||||||
class AccountScriptingInterface : public QObject {
|
|
||||||
Q_OBJECT
|
|
||||||
|
|
||||||
/**jsdoc
|
|
||||||
* @namespace Account
|
|
||||||
* @property username {String} username if user is logged in, otherwise it returns "Unknown user"
|
|
||||||
*/
|
|
||||||
Q_PROPERTY(QString username READ getUsername)
|
|
||||||
Q_PROPERTY(bool loggedIn READ loggedIn)
|
|
||||||
|
|
||||||
signals:
|
|
||||||
|
|
||||||
/**jsdoc
|
|
||||||
* Triggered when username has changed.
|
|
||||||
* @function Account.usernameChanged
|
|
||||||
* @return {Signal}
|
|
||||||
*/
|
|
||||||
void usernameChanged();
|
|
||||||
void loggedInChanged(bool loggedIn);
|
|
||||||
|
|
||||||
public slots:
|
|
||||||
static AccountScriptingInterface* getInstance();
|
|
||||||
|
|
||||||
/**jsdoc
|
|
||||||
* Returns the username for the currently logged in High Fidelity metaverse account.
|
|
||||||
* @function Account.getUsername
|
|
||||||
* @return {string} username if user is logged in, otherwise it returns "Unknown user"
|
|
||||||
*/
|
|
||||||
QString getUsername();
|
|
||||||
|
|
||||||
/**jsdoc
|
|
||||||
* Determine if the user is logged into the High Fidleity metaverse.
|
|
||||||
* @function Account.isLoggedIn
|
|
||||||
* @return {bool} true when user is logged into the High Fidelity metaverse.
|
|
||||||
*/
|
|
||||||
bool isLoggedIn();
|
|
||||||
void logOut();
|
|
||||||
|
|
||||||
public:
|
|
||||||
AccountScriptingInterface(QObject* parent = nullptr) {}
|
|
||||||
bool loggedIn() const;
|
|
||||||
};
|
|
||||||
|
|
||||||
#endif // hifi_AccountScriptingInterface_h
|
|
|
@ -1,5 +1,5 @@
|
||||||
//
|
//
|
||||||
// GlobalServicesScriptingInterface.cpp
|
// AccountServicesScriptingInterface.cpp
|
||||||
// interface/src/scripting
|
// interface/src/scripting
|
||||||
//
|
//
|
||||||
// Created by Thijs Wenker on 9/10/14.
|
// Created by Thijs Wenker on 9/10/14.
|
||||||
|
@ -14,41 +14,41 @@
|
||||||
#include "DiscoverabilityManager.h"
|
#include "DiscoverabilityManager.h"
|
||||||
#include "ResourceCache.h"
|
#include "ResourceCache.h"
|
||||||
|
|
||||||
#include "GlobalServicesScriptingInterface.h"
|
#include "AccountServicesScriptingInterface.h"
|
||||||
|
|
||||||
GlobalServicesScriptingInterface::GlobalServicesScriptingInterface() {
|
AccountServicesScriptingInterface::AccountServicesScriptingInterface() {
|
||||||
auto accountManager = DependencyManager::get<AccountManager>();
|
auto accountManager = DependencyManager::get<AccountManager>();
|
||||||
connect(accountManager.data(), &AccountManager::usernameChanged, this, &GlobalServicesScriptingInterface::onUsernameChanged);
|
connect(accountManager.data(), &AccountManager::usernameChanged, this, &AccountServicesScriptingInterface::onUsernameChanged);
|
||||||
connect(accountManager.data(), &AccountManager::logoutComplete, this, &GlobalServicesScriptingInterface::loggedOut);
|
connect(accountManager.data(), &AccountManager::logoutComplete, this, &AccountServicesScriptingInterface::loggedOut);
|
||||||
connect(accountManager.data(), &AccountManager::loginComplete, this, &GlobalServicesScriptingInterface::connected);
|
connect(accountManager.data(), &AccountManager::loginComplete, this, &AccountServicesScriptingInterface::connected);
|
||||||
|
|
||||||
_downloading = false;
|
_downloading = false;
|
||||||
QTimer* checkDownloadTimer = new QTimer(this);
|
QTimer* checkDownloadTimer = new QTimer(this);
|
||||||
connect(checkDownloadTimer, &QTimer::timeout, this, &GlobalServicesScriptingInterface::checkDownloadInfo);
|
connect(checkDownloadTimer, &QTimer::timeout, this, &AccountServicesScriptingInterface::checkDownloadInfo);
|
||||||
const int CHECK_DOWNLOAD_INTERVAL = MSECS_PER_SECOND / 2;
|
const int CHECK_DOWNLOAD_INTERVAL = MSECS_PER_SECOND / 2;
|
||||||
checkDownloadTimer->start(CHECK_DOWNLOAD_INTERVAL);
|
checkDownloadTimer->start(CHECK_DOWNLOAD_INTERVAL);
|
||||||
|
|
||||||
auto discoverabilityManager = DependencyManager::get<DiscoverabilityManager>();
|
auto discoverabilityManager = DependencyManager::get<DiscoverabilityManager>();
|
||||||
connect(discoverabilityManager.data(), &DiscoverabilityManager::discoverabilityModeChanged,
|
connect(discoverabilityManager.data(), &DiscoverabilityManager::discoverabilityModeChanged,
|
||||||
this, &GlobalServicesScriptingInterface::discoverabilityModeChanged);
|
this, &AccountServicesScriptingInterface::discoverabilityModeChanged);
|
||||||
|
|
||||||
_loggedIn = isLoggedIn();
|
_loggedIn = isLoggedIn();
|
||||||
emit loggedInChanged(_loggedIn);
|
emit loggedInChanged(_loggedIn);
|
||||||
}
|
}
|
||||||
|
|
||||||
GlobalServicesScriptingInterface::~GlobalServicesScriptingInterface() {
|
AccountServicesScriptingInterface::~AccountServicesScriptingInterface() {
|
||||||
auto accountManager = DependencyManager::get<AccountManager>();
|
auto accountManager = DependencyManager::get<AccountManager>();
|
||||||
disconnect(accountManager.data(), &AccountManager::usernameChanged, this, &GlobalServicesScriptingInterface::onUsernameChanged);
|
disconnect(accountManager.data(), &AccountManager::usernameChanged, this, &AccountServicesScriptingInterface::onUsernameChanged);
|
||||||
disconnect(accountManager.data(), &AccountManager::logoutComplete, this, &GlobalServicesScriptingInterface::loggedOut);
|
disconnect(accountManager.data(), &AccountManager::logoutComplete, this, &AccountServicesScriptingInterface::loggedOut);
|
||||||
disconnect(accountManager.data(), &AccountManager::loginComplete, this, &GlobalServicesScriptingInterface::connected);
|
disconnect(accountManager.data(), &AccountManager::loginComplete, this, &AccountServicesScriptingInterface::connected);
|
||||||
}
|
}
|
||||||
|
|
||||||
GlobalServicesScriptingInterface* GlobalServicesScriptingInterface::getInstance() {
|
AccountServicesScriptingInterface* AccountServicesScriptingInterface::getInstance() {
|
||||||
static GlobalServicesScriptingInterface sharedInstance;
|
static AccountServicesScriptingInterface sharedInstance;
|
||||||
return &sharedInstance;
|
return &sharedInstance;
|
||||||
}
|
}
|
||||||
|
|
||||||
const QString GlobalServicesScriptingInterface::getUsername() const {
|
const QString AccountServicesScriptingInterface::getUsername() const {
|
||||||
auto accountManager = DependencyManager::get<AccountManager>();
|
auto accountManager = DependencyManager::get<AccountManager>();
|
||||||
if (accountManager->isLoggedIn()) {
|
if (accountManager->isLoggedIn()) {
|
||||||
return accountManager->getAccountInfo().getUsername();
|
return accountManager->getAccountInfo().getUsername();
|
||||||
|
@ -57,31 +57,31 @@ const QString GlobalServicesScriptingInterface::getUsername() const {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GlobalServicesScriptingInterface::isLoggedIn() {
|
bool AccountServicesScriptingInterface::isLoggedIn() {
|
||||||
auto accountManager = DependencyManager::get<AccountManager>();
|
auto accountManager = DependencyManager::get<AccountManager>();
|
||||||
return accountManager->isLoggedIn();
|
return accountManager->isLoggedIn();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GlobalServicesScriptingInterface::checkAndSignalForAccessToken() {
|
bool AccountServicesScriptingInterface::checkAndSignalForAccessToken() {
|
||||||
auto accountManager = DependencyManager::get<AccountManager>();
|
auto accountManager = DependencyManager::get<AccountManager>();
|
||||||
return accountManager->checkAndSignalForAccessToken();
|
return accountManager->checkAndSignalForAccessToken();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GlobalServicesScriptingInterface::logOut() {
|
void AccountServicesScriptingInterface::logOut() {
|
||||||
auto accountManager = DependencyManager::get<AccountManager>();
|
auto accountManager = DependencyManager::get<AccountManager>();
|
||||||
return accountManager->logout();
|
return accountManager->logout();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GlobalServicesScriptingInterface::loggedOut() {
|
void AccountServicesScriptingInterface::loggedOut() {
|
||||||
emit GlobalServicesScriptingInterface::disconnected(QString("logout"));
|
emit AccountServicesScriptingInterface::disconnected(QString("logout"));
|
||||||
}
|
}
|
||||||
|
|
||||||
QString GlobalServicesScriptingInterface::getFindableBy() const {
|
QString AccountServicesScriptingInterface::getFindableBy() const {
|
||||||
auto discoverabilityManager = DependencyManager::get<DiscoverabilityManager>();
|
auto discoverabilityManager = DependencyManager::get<DiscoverabilityManager>();
|
||||||
return DiscoverabilityManager::findableByString(discoverabilityManager->getDiscoverabilityMode());
|
return DiscoverabilityManager::findableByString(discoverabilityManager->getDiscoverabilityMode());
|
||||||
}
|
}
|
||||||
|
|
||||||
void GlobalServicesScriptingInterface::setFindableBy(const QString& discoverabilityMode) {
|
void AccountServicesScriptingInterface::setFindableBy(const QString& discoverabilityMode) {
|
||||||
auto discoverabilityManager = DependencyManager::get<DiscoverabilityManager>();
|
auto discoverabilityManager = DependencyManager::get<DiscoverabilityManager>();
|
||||||
if (discoverabilityMode.toLower() == "none") {
|
if (discoverabilityMode.toLower() == "none") {
|
||||||
discoverabilityManager->setDiscoverabilityMode(Discoverability::None);
|
discoverabilityManager->setDiscoverabilityMode(Discoverability::None);
|
||||||
|
@ -96,11 +96,11 @@ void GlobalServicesScriptingInterface::setFindableBy(const QString& discoverabil
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GlobalServicesScriptingInterface::discoverabilityModeChanged(Discoverability::Mode discoverabilityMode) {
|
void AccountServicesScriptingInterface::discoverabilityModeChanged(Discoverability::Mode discoverabilityMode) {
|
||||||
emit findableByChanged(DiscoverabilityManager::findableByString(discoverabilityMode));
|
emit findableByChanged(DiscoverabilityManager::findableByString(discoverabilityMode));
|
||||||
}
|
}
|
||||||
|
|
||||||
void GlobalServicesScriptingInterface::onUsernameChanged(const QString& username) {
|
void AccountServicesScriptingInterface::onUsernameChanged(const QString& username) {
|
||||||
_loggedIn = (username != QString());
|
_loggedIn = (username != QString());
|
||||||
emit myUsernameChanged(username);
|
emit myUsernameChanged(username);
|
||||||
emit loggedInChanged(_loggedIn);
|
emit loggedInChanged(_loggedIn);
|
||||||
|
@ -135,7 +135,7 @@ void DownloadInfoResultFromScriptValue(const QScriptValue& object, DownloadInfoR
|
||||||
result.pending = object.property("pending").toVariant().toFloat();
|
result.pending = object.property("pending").toVariant().toFloat();
|
||||||
}
|
}
|
||||||
|
|
||||||
DownloadInfoResult GlobalServicesScriptingInterface::getDownloadInfo() {
|
DownloadInfoResult AccountServicesScriptingInterface::getDownloadInfo() {
|
||||||
DownloadInfoResult result;
|
DownloadInfoResult result;
|
||||||
foreach(const auto& resource, ResourceCache::getLoadingRequests()) {
|
foreach(const auto& resource, ResourceCache::getLoadingRequests()) {
|
||||||
result.downloading.append(resource->getProgress() * 100.0f);
|
result.downloading.append(resource->getProgress() * 100.0f);
|
||||||
|
@ -144,7 +144,7 @@ DownloadInfoResult GlobalServicesScriptingInterface::getDownloadInfo() {
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void GlobalServicesScriptingInterface::checkDownloadInfo() {
|
void AccountServicesScriptingInterface::checkDownloadInfo() {
|
||||||
DownloadInfoResult downloadInfo = getDownloadInfo();
|
DownloadInfoResult downloadInfo = getDownloadInfo();
|
||||||
bool downloading = downloadInfo.downloading.count() > 0 || downloadInfo.pending > 0;
|
bool downloading = downloadInfo.downloading.count() > 0 || downloadInfo.pending > 0;
|
||||||
|
|
||||||
|
@ -155,7 +155,7 @@ void GlobalServicesScriptingInterface::checkDownloadInfo() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void GlobalServicesScriptingInterface::updateDownloadInfo() {
|
void AccountServicesScriptingInterface::updateDownloadInfo() {
|
||||||
emit downloadInfoChanged(getDownloadInfo());
|
emit downloadInfoChanged(getDownloadInfo());
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
//
|
//
|
||||||
// GlobalServicesScriptingInterface.h
|
// AccountServicesScriptingInterface.h
|
||||||
// interface/src/scripting
|
// interface/src/scripting
|
||||||
//
|
//
|
||||||
// Created by Thijs Wenker on 9/10/14.
|
// Created by Thijs Wenker on 9/10/14.
|
||||||
|
@ -9,8 +9,8 @@
|
||||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
//
|
//
|
||||||
|
|
||||||
#ifndef hifi_GlobalServicesScriptingInterface_h
|
#ifndef hifi_AccountServicesScriptingInterface_h
|
||||||
#define hifi_GlobalServicesScriptingInterface_h
|
#define hifi_AccountServicesScriptingInterface_h
|
||||||
|
|
||||||
#include <QObject>
|
#include <QObject>
|
||||||
#include <QScriptContext>
|
#include <QScriptContext>
|
||||||
|
@ -32,7 +32,7 @@ Q_DECLARE_METATYPE(DownloadInfoResult)
|
||||||
QScriptValue DownloadInfoResultToScriptValue(QScriptEngine* engine, const DownloadInfoResult& result);
|
QScriptValue DownloadInfoResultToScriptValue(QScriptEngine* engine, const DownloadInfoResult& result);
|
||||||
void DownloadInfoResultFromScriptValue(const QScriptValue& object, DownloadInfoResult& result);
|
void DownloadInfoResultFromScriptValue(const QScriptValue& object, DownloadInfoResult& result);
|
||||||
|
|
||||||
class GlobalServicesScriptingInterface : public QObject {
|
class AccountServicesScriptingInterface : public QObject {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
|
||||||
Q_PROPERTY(QString username READ getUsername NOTIFY myUsernameChanged)
|
Q_PROPERTY(QString username READ getUsername NOTIFY myUsernameChanged)
|
||||||
|
@ -41,7 +41,7 @@ class GlobalServicesScriptingInterface : public QObject {
|
||||||
Q_PROPERTY(QUrl metaverseServerURL READ getMetaverseServerURL)
|
Q_PROPERTY(QUrl metaverseServerURL READ getMetaverseServerURL)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static GlobalServicesScriptingInterface* getInstance();
|
static AccountServicesScriptingInterface* getInstance();
|
||||||
|
|
||||||
const QString getUsername() const;
|
const QString getUsername() const;
|
||||||
bool loggedIn() const { return _loggedIn; }
|
bool loggedIn() const { return _loggedIn; }
|
||||||
|
@ -74,11 +74,11 @@ signals:
|
||||||
void loggedInChanged(bool loggedIn);
|
void loggedInChanged(bool loggedIn);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
GlobalServicesScriptingInterface();
|
AccountServicesScriptingInterface();
|
||||||
~GlobalServicesScriptingInterface();
|
~AccountServicesScriptingInterface();
|
||||||
|
|
||||||
bool _downloading;
|
bool _downloading;
|
||||||
bool _loggedIn{ false };
|
bool _loggedIn{ false };
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // hifi_GlobalServicesScriptingInterface_h
|
#endif // hifi_AccountServicesScriptingInterface_h
|
|
@ -42,7 +42,7 @@ void CustomPromptResultFromScriptValue(const QScriptValue& object, CustomPromptR
|
||||||
* @property {number} innerWidth - The width of the drawable area of the Interface window (i.e., without borders or other
|
* @property {number} innerWidth - The width of the drawable area of the Interface window (i.e., without borders or other
|
||||||
* chrome), in pixels. <em>Read-only.</em>
|
* chrome), in pixels. <em>Read-only.</em>
|
||||||
* @property {number} innerHeight - The height of the drawable area of the Interface window (i.e., without borders or other
|
* @property {number} innerHeight - The height of the drawable area of the Interface window (i.e., without borders or other
|
||||||
* chrome) plus the height of the menu bar, in pixels. <em>Read-only.</em>
|
* chrome), in pixels. <em>Read-only.</em>
|
||||||
* @property {object} location - Provides facilities for working with your current metaverse location. See {@link location}.
|
* @property {object} location - Provides facilities for working with your current metaverse location. See {@link location}.
|
||||||
* @property {number} x - The x coordinate of the top left corner of the Interface window on the display. <em>Read-only.</em>
|
* @property {number} x - The x coordinate of the top left corner of the Interface window on the display. <em>Read-only.</em>
|
||||||
* @property {number} y - The y coordinate of the top left corner of the Interface window on the display. <em>Read-only.</em>
|
* @property {number} y - The y coordinate of the top left corner of the Interface window on the display. <em>Read-only.</em>
|
||||||
|
@ -301,7 +301,7 @@ public slots:
|
||||||
/**jsdoc
|
/**jsdoc
|
||||||
* Get Interface's build number.
|
* Get Interface's build number.
|
||||||
* @function Window.checkVersion
|
* @function Window.checkVersion
|
||||||
* @returns {string} - Interface's build number.
|
* @returns {string} Interface's build number.
|
||||||
*/
|
*/
|
||||||
QString checkVersion();
|
QString checkVersion();
|
||||||
|
|
||||||
|
@ -327,7 +327,7 @@ public slots:
|
||||||
* full resolution is used (window dimensions in desktop mode; HMD display dimensions in HMD mode), otherwise one of the
|
* full resolution is used (window dimensions in desktop mode; HMD display dimensions in HMD mode), otherwise one of the
|
||||||
* dimensions is adjusted in order to match the aspect ratio.
|
* dimensions is adjusted in order to match the aspect ratio.
|
||||||
* @example <caption>Using the snapshot function and signals.</caption>
|
* @example <caption>Using the snapshot function and signals.</caption>
|
||||||
* function onStillSnapshottaken(path, notify) {
|
* function onStillSnapshotTaken(path, notify) {
|
||||||
* print("Still snapshot taken: " + path);
|
* print("Still snapshot taken: " + path);
|
||||||
* print("Notify: " + notify);
|
* print("Notify: " + notify);
|
||||||
* }
|
* }
|
||||||
|
@ -340,7 +340,7 @@ public slots:
|
||||||
* print("Animated snapshot taken: " + animatedPath);
|
* print("Animated snapshot taken: " + animatedPath);
|
||||||
* }
|
* }
|
||||||
*
|
*
|
||||||
* Window.stillSnapshotTaken.connect(onStillSnapshottaken);
|
* Window.stillSnapshotTaken.connect(onStillSnapshotTaken);
|
||||||
* Window.processingGifStarted.connect(onProcessingGifStarted);
|
* Window.processingGifStarted.connect(onProcessingGifStarted);
|
||||||
* Window.processingGifCompleted.connect(onProcessingGifCompleted);
|
* Window.processingGifCompleted.connect(onProcessingGifCompleted);
|
||||||
*
|
*
|
||||||
|
@ -555,7 +555,7 @@ signals:
|
||||||
|
|
||||||
/**jsdoc
|
/**jsdoc
|
||||||
* Triggered when a still snapshot has been taken by calling {@link Window.takeSnapshot|takeSnapshot} with
|
* Triggered when a still snapshot has been taken by calling {@link Window.takeSnapshot|takeSnapshot} with
|
||||||
* <code>includeAnimated = false</code>.
|
* <code>includeAnimated = false</code> or {@link Window.takeSecondaryCameraSnapshot|takeSecondaryCameraSnapshot}.
|
||||||
* @function Window.stillSnapshotTaken
|
* @function Window.stillSnapshotTaken
|
||||||
* @param {string} pathStillSnapshot - The path and name of the snapshot image file.
|
* @param {string} pathStillSnapshot - The path and name of the snapshot image file.
|
||||||
* @param {boolean} notify - The value of the <code>notify</code> parameter that {@link Window.takeSnapshot|takeSnapshot}
|
* @param {boolean} notify - The value of the <code>notify</code> parameter that {@link Window.takeSnapshot|takeSnapshot}
|
||||||
|
|
|
@ -50,7 +50,7 @@
|
||||||
#include "ui/DomainConnectionModel.h"
|
#include "ui/DomainConnectionModel.h"
|
||||||
#include "ui/AvatarInputs.h"
|
#include "ui/AvatarInputs.h"
|
||||||
#include "avatar/AvatarManager.h"
|
#include "avatar/AvatarManager.h"
|
||||||
#include "scripting/GlobalServicesScriptingInterface.h"
|
#include "scripting/AccountServicesScriptingInterface.h"
|
||||||
#include <plugins/InputConfiguration.h>
|
#include <plugins/InputConfiguration.h>
|
||||||
#include "ui/Snapshot.h"
|
#include "ui/Snapshot.h"
|
||||||
#include "SoundCache.h"
|
#include "SoundCache.h"
|
||||||
|
@ -192,7 +192,10 @@ void Web3DOverlay::setupQmlSurface() {
|
||||||
|
|
||||||
_webSurface->getSurfaceContext()->setContextProperty("offscreenFlags", flags);
|
_webSurface->getSurfaceContext()->setContextProperty("offscreenFlags", flags);
|
||||||
_webSurface->getSurfaceContext()->setContextProperty("AddressManager", DependencyManager::get<AddressManager>().data());
|
_webSurface->getSurfaceContext()->setContextProperty("AddressManager", DependencyManager::get<AddressManager>().data());
|
||||||
_webSurface->getSurfaceContext()->setContextProperty("Account", GlobalServicesScriptingInterface::getInstance());
|
|
||||||
|
_webSurface->getSurfaceContext()->setContextProperty("Account", AccountServicesScriptingInterface::getInstance()); // DEPRECATED - TO BE REMOVED
|
||||||
|
_webSurface->getSurfaceContext()->setContextProperty("GlobalServices", AccountServicesScriptingInterface::getInstance()); // DEPRECATED - TO BE REMOVED
|
||||||
|
_webSurface->getSurfaceContext()->setContextProperty("AccountServices", AccountServicesScriptingInterface::getInstance());
|
||||||
|
|
||||||
// in Qt 5.10.0 there is already an "Audio" object in the QML context
|
// in Qt 5.10.0 there is already an "Audio" object in the QML context
|
||||||
// though I failed to find it (from QtMultimedia??). So.. let it be "AudioScriptingInterface"
|
// though I failed to find it (from QtMultimedia??). So.. let it be "AudioScriptingInterface"
|
||||||
|
@ -208,7 +211,6 @@ void Web3DOverlay::setupQmlSurface() {
|
||||||
_webSurface->getSurfaceContext()->setContextProperty("OctreeStats", DependencyManager::get<OctreeStatsProvider>().data());
|
_webSurface->getSurfaceContext()->setContextProperty("OctreeStats", DependencyManager::get<OctreeStatsProvider>().data());
|
||||||
_webSurface->getSurfaceContext()->setContextProperty("DCModel", DependencyManager::get<DomainConnectionModel>().data());
|
_webSurface->getSurfaceContext()->setContextProperty("DCModel", DependencyManager::get<DomainConnectionModel>().data());
|
||||||
_webSurface->getSurfaceContext()->setContextProperty("AvatarInputs", AvatarInputs::getInstance());
|
_webSurface->getSurfaceContext()->setContextProperty("AvatarInputs", AvatarInputs::getInstance());
|
||||||
_webSurface->getSurfaceContext()->setContextProperty("GlobalServices", GlobalServicesScriptingInterface::getInstance());
|
|
||||||
_webSurface->getSurfaceContext()->setContextProperty("AvatarList", DependencyManager::get<AvatarManager>().data());
|
_webSurface->getSurfaceContext()->setContextProperty("AvatarList", DependencyManager::get<AvatarManager>().data());
|
||||||
_webSurface->getSurfaceContext()->setContextProperty("DialogsManager", DialogsManagerScriptingInterface::getInstance());
|
_webSurface->getSurfaceContext()->setContextProperty("DialogsManager", DialogsManagerScriptingInterface::getInstance());
|
||||||
_webSurface->getSurfaceContext()->setContextProperty("InputConfiguration", DependencyManager::get<InputConfiguration>().data());
|
_webSurface->getSurfaceContext()->setContextProperty("InputConfiguration", DependencyManager::get<InputConfiguration>().data());
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
set(TARGET_NAME animation)
|
set(TARGET_NAME animation)
|
||||||
setup_hifi_library(Network Script)
|
setup_hifi_library(Network Script)
|
||||||
link_hifi_libraries(shared model fbx)
|
link_hifi_libraries(shared graphics fbx)
|
||||||
include_hifi_library_headers(networking)
|
include_hifi_library_headers(networking)
|
||||||
include_hifi_library_headers(gpu)
|
include_hifi_library_headers(gpu)
|
||||||
|
|
||||||
|
|
|
@ -76,3 +76,5 @@ AnimPose::operator glm::mat4() const {
|
||||||
return glm::mat4(glm::vec4(xAxis, 0.0f), glm::vec4(yAxis, 0.0f),
|
return glm::mat4(glm::vec4(xAxis, 0.0f), glm::vec4(yAxis, 0.0f),
|
||||||
glm::vec4(zAxis, 0.0f), glm::vec4(_trans, 1.0f));
|
glm::vec4(zAxis, 0.0f), glm::vec4(_trans, 1.0f));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1732,6 +1732,14 @@ glm::mat4 Rig::getJointTransform(int jointIndex) const {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
AnimPose Rig::getJointPose(int jointIndex) const {
|
||||||
|
if (isIndexValid(jointIndex)) {
|
||||||
|
return _internalPoseSet._absolutePoses[jointIndex];
|
||||||
|
} else {
|
||||||
|
return AnimPose::identity;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void Rig::copyJointsIntoJointData(QVector<JointData>& jointDataVec) const {
|
void Rig::copyJointsIntoJointData(QVector<JointData>& jointDataVec) const {
|
||||||
|
|
||||||
const AnimPose geometryToRigPose(_geometryToRigTransform);
|
const AnimPose geometryToRigPose(_geometryToRigTransform);
|
||||||
|
|
|
@ -164,6 +164,7 @@ public:
|
||||||
|
|
||||||
// rig space
|
// rig space
|
||||||
glm::mat4 getJointTransform(int jointIndex) const;
|
glm::mat4 getJointTransform(int jointIndex) const;
|
||||||
|
AnimPose getJointPose(int jointIndex) const;
|
||||||
|
|
||||||
// Start or stop animations as needed.
|
// Start or stop animations as needed.
|
||||||
void computeMotionAnimationState(float deltaTime, const glm::vec3& worldPosition, const glm::vec3& worldVelocity, const glm::quat& worldRotation, CharacterControllerState ccState);
|
void computeMotionAnimationState(float deltaTime, const glm::vec3& worldPosition, const glm::vec3& worldVelocity, const glm::quat& worldRotation, CharacterControllerState ccState);
|
||||||
|
|
|
@ -782,7 +782,7 @@ void AudioClient::selectAudioFormat(const QString& selectedCodecName) {
|
||||||
|
|
||||||
_selectedCodecName = selectedCodecName;
|
_selectedCodecName = selectedCodecName;
|
||||||
|
|
||||||
qCDebug(audioclient) << "Selected Codec:" << _selectedCodecName;
|
qCDebug(audioclient) << "Selected Codec:" << _selectedCodecName << "isStereoInput:" << _isStereoInput;
|
||||||
|
|
||||||
// release any old codec encoder/decoder first...
|
// release any old codec encoder/decoder first...
|
||||||
if (_codec && _encoder) {
|
if (_codec && _encoder) {
|
||||||
|
@ -797,7 +797,7 @@ void AudioClient::selectAudioFormat(const QString& selectedCodecName) {
|
||||||
if (_selectedCodecName == plugin->getName()) {
|
if (_selectedCodecName == plugin->getName()) {
|
||||||
_codec = plugin;
|
_codec = plugin;
|
||||||
_receivedAudioStream.setupCodec(plugin, _selectedCodecName, AudioConstants::STEREO);
|
_receivedAudioStream.setupCodec(plugin, _selectedCodecName, AudioConstants::STEREO);
|
||||||
_encoder = plugin->createEncoder(AudioConstants::SAMPLE_RATE, AudioConstants::MONO);
|
_encoder = plugin->createEncoder(AudioConstants::SAMPLE_RATE, _isStereoInput ? AudioConstants::STEREO : AudioConstants::MONO);
|
||||||
qCDebug(audioclient) << "Selected Codec Plugin:" << _codec.get();
|
qCDebug(audioclient) << "Selected Codec Plugin:" << _codec.get();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -1079,7 +1079,7 @@ void AudioClient::handleAudioInput(QByteArray& audioBuffer) {
|
||||||
encodedBuffer = audioBuffer;
|
encodedBuffer = audioBuffer;
|
||||||
}
|
}
|
||||||
|
|
||||||
emitAudioPacket(encodedBuffer.data(), encodedBuffer.size(), _outgoingAvatarAudioSequenceNumber,
|
emitAudioPacket(encodedBuffer.data(), encodedBuffer.size(), _outgoingAvatarAudioSequenceNumber, _isStereoInput,
|
||||||
audioTransform, avatarBoundingBoxCorner, avatarBoundingBoxScale,
|
audioTransform, avatarBoundingBoxCorner, avatarBoundingBoxScale,
|
||||||
packetType, _selectedCodecName);
|
packetType, _selectedCodecName);
|
||||||
_stats.sentPacket();
|
_stats.sentPacket();
|
||||||
|
@ -1382,7 +1382,16 @@ void AudioClient::setIsStereoInput(bool isStereoInput) {
|
||||||
_desiredInputFormat.setChannelCount(1);
|
_desiredInputFormat.setChannelCount(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// change in channel count for desired input format, restart the input device
|
// restart the codec
|
||||||
|
if (_codec) {
|
||||||
|
if (_encoder) {
|
||||||
|
_codec->releaseEncoder(_encoder);
|
||||||
|
}
|
||||||
|
_encoder = _codec->createEncoder(AudioConstants::SAMPLE_RATE, _isStereoInput ? AudioConstants::STEREO : AudioConstants::MONO);
|
||||||
|
}
|
||||||
|
qCDebug(audioclient) << "Reset Codec:" << _selectedCodecName << "isStereoInput:" << _isStereoInput;
|
||||||
|
|
||||||
|
// restart the input device
|
||||||
switchInputToAudioDevice(_inputDeviceInfo);
|
switchInputToAudioDevice(_inputDeviceInfo);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1418,7 +1427,7 @@ void AudioClient::outputFormatChanged() {
|
||||||
_receivedAudioStream.outputFormatChanged(_outputFormat.sampleRate(), OUTPUT_CHANNEL_COUNT);
|
_receivedAudioStream.outputFormatChanged(_outputFormat.sampleRate(), OUTPUT_CHANNEL_COUNT);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AudioClient::switchInputToAudioDevice(const QAudioDeviceInfo& inputDeviceInfo, bool isShutdownRequest) {
|
bool AudioClient::switchInputToAudioDevice(const QAudioDeviceInfo inputDeviceInfo, bool isShutdownRequest) {
|
||||||
qCDebug(audioclient) << __FUNCTION__ << "inputDeviceInfo: [" << inputDeviceInfo.deviceName() << "]";
|
qCDebug(audioclient) << __FUNCTION__ << "inputDeviceInfo: [" << inputDeviceInfo.deviceName() << "]";
|
||||||
bool supportedFormat = false;
|
bool supportedFormat = false;
|
||||||
|
|
||||||
|
@ -1601,7 +1610,7 @@ void AudioClient::outputNotify() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bool AudioClient::switchOutputToAudioDevice(const QAudioDeviceInfo& outputDeviceInfo, bool isShutdownRequest) {
|
bool AudioClient::switchOutputToAudioDevice(const QAudioDeviceInfo outputDeviceInfo, bool isShutdownRequest) {
|
||||||
qCDebug(audioclient) << "AudioClient::switchOutputToAudioDevice() outputDeviceInfo: [" << outputDeviceInfo.deviceName() << "]";
|
qCDebug(audioclient) << "AudioClient::switchOutputToAudioDevice() outputDeviceInfo: [" << outputDeviceInfo.deviceName() << "]";
|
||||||
bool supportedFormat = false;
|
bool supportedFormat = false;
|
||||||
|
|
||||||
|
|
|
@ -378,8 +378,8 @@ private:
|
||||||
|
|
||||||
void handleLocalEchoAndReverb(QByteArray& inputByteArray);
|
void handleLocalEchoAndReverb(QByteArray& inputByteArray);
|
||||||
|
|
||||||
bool switchInputToAudioDevice(const QAudioDeviceInfo& inputDeviceInfo, bool isShutdownRequest = false);
|
bool switchInputToAudioDevice(const QAudioDeviceInfo inputDeviceInfo, bool isShutdownRequest = false);
|
||||||
bool switchOutputToAudioDevice(const QAudioDeviceInfo& outputDeviceInfo, bool isShutdownRequest = false);
|
bool switchOutputToAudioDevice(const QAudioDeviceInfo outputDeviceInfo, bool isShutdownRequest = false);
|
||||||
|
|
||||||
// Callback acceleration dependent calculations
|
// Callback acceleration dependent calculations
|
||||||
int calculateNumberOfInputCallbackBytes(const QAudioFormat& format) const;
|
int calculateNumberOfInputCallbackBytes(const QAudioFormat& format) const;
|
||||||
|
|
|
@ -19,7 +19,7 @@
|
||||||
|
|
||||||
#include "AudioConstants.h"
|
#include "AudioConstants.h"
|
||||||
|
|
||||||
void AbstractAudioInterface::emitAudioPacket(const void* audioData, size_t bytes, quint16& sequenceNumber,
|
void AbstractAudioInterface::emitAudioPacket(const void* audioData, size_t bytes, quint16& sequenceNumber, bool isStereo,
|
||||||
const Transform& transform, glm::vec3 avatarBoundingBoxCorner, glm::vec3 avatarBoundingBoxScale,
|
const Transform& transform, glm::vec3 avatarBoundingBoxCorner, glm::vec3 avatarBoundingBoxScale,
|
||||||
PacketType packetType, QString codecName) {
|
PacketType packetType, QString codecName) {
|
||||||
static std::mutex _mutex;
|
static std::mutex _mutex;
|
||||||
|
@ -30,9 +30,6 @@ void AbstractAudioInterface::emitAudioPacket(const void* audioData, size_t bytes
|
||||||
Locker lock(_mutex);
|
Locker lock(_mutex);
|
||||||
auto audioPacket = NLPacket::create(packetType);
|
auto audioPacket = NLPacket::create(packetType);
|
||||||
|
|
||||||
// FIXME - this is not a good way to determine stereoness with codecs....
|
|
||||||
quint8 isStereo = bytes == AudioConstants::NETWORK_FRAME_BYTES_STEREO ? 1 : 0;
|
|
||||||
|
|
||||||
// write sequence number
|
// write sequence number
|
||||||
auto sequence = sequenceNumber++;
|
auto sequence = sequenceNumber++;
|
||||||
audioPacket->writePrimitive(sequence);
|
audioPacket->writePrimitive(sequence);
|
||||||
|
@ -48,7 +45,8 @@ void AbstractAudioInterface::emitAudioPacket(const void* audioData, size_t bytes
|
||||||
audioPacket->writePrimitive(numSilentSamples);
|
audioPacket->writePrimitive(numSilentSamples);
|
||||||
} else {
|
} else {
|
||||||
// set the mono/stereo byte
|
// set the mono/stereo byte
|
||||||
audioPacket->writePrimitive(isStereo);
|
quint8 channelFlag = isStereo ? 1 : 0;
|
||||||
|
audioPacket->writePrimitive(channelFlag);
|
||||||
}
|
}
|
||||||
|
|
||||||
// pack the three float positions
|
// pack the three float positions
|
||||||
|
|
|
@ -29,7 +29,7 @@ class AbstractAudioInterface : public QObject {
|
||||||
public:
|
public:
|
||||||
AbstractAudioInterface(QObject* parent = 0) : QObject(parent) {};
|
AbstractAudioInterface(QObject* parent = 0) : QObject(parent) {};
|
||||||
|
|
||||||
static void emitAudioPacket(const void* audioData, size_t bytes, quint16& sequenceNumber,
|
static void emitAudioPacket(const void* audioData, size_t bytes, quint16& sequenceNumber, bool isStereo,
|
||||||
const Transform& transform, glm::vec3 avatarBoundingBoxCorner, glm::vec3 avatarBoundingBoxScale,
|
const Transform& transform, glm::vec3 avatarBoundingBoxCorner, glm::vec3 avatarBoundingBoxScale,
|
||||||
PacketType packetType, QString codecName = QString(""));
|
PacketType packetType, QString codecName = QString(""));
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
set(TARGET_NAME avatars-renderer)
|
set(TARGET_NAME avatars-renderer)
|
||||||
AUTOSCRIBE_SHADER_LIB(gpu model render render-utils)
|
AUTOSCRIBE_SHADER_LIB(gpu graphics render render-utils)
|
||||||
setup_hifi_library(Widgets Network Script)
|
setup_hifi_library(Widgets Network Script)
|
||||||
link_hifi_libraries(shared gpu model animation model-networking script-engine render render-utils image trackers entities-renderer)
|
link_hifi_libraries(shared gpu graphics animation model-networking script-engine render render-utils image trackers entities-renderer)
|
||||||
include_hifi_library_headers(avatars)
|
include_hifi_library_headers(avatars)
|
||||||
include_hifi_library_headers(networking)
|
include_hifi_library_headers(networking)
|
||||||
include_hifi_library_headers(fbx)
|
include_hifi_library_headers(fbx)
|
||||||
|
|
|
@ -32,6 +32,8 @@
|
||||||
#include <shared/Camera.h>
|
#include <shared/Camera.h>
|
||||||
#include <SoftAttachmentModel.h>
|
#include <SoftAttachmentModel.h>
|
||||||
#include <render/TransitionStage.h>
|
#include <render/TransitionStage.h>
|
||||||
|
#include "ModelEntityItem.h"
|
||||||
|
#include "RenderableModelEntityItem.h"
|
||||||
|
|
||||||
#include "Logging.h"
|
#include "Logging.h"
|
||||||
|
|
||||||
|
@ -347,6 +349,65 @@ void Avatar::updateAvatarEntities() {
|
||||||
setAvatarEntityDataChanged(false);
|
setAvatarEntityDataChanged(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Avatar::relayJointDataToChildren() {
|
||||||
|
forEachChild([&](SpatiallyNestablePointer child) {
|
||||||
|
if (child->getNestableType() == NestableType::Entity) {
|
||||||
|
auto modelEntity = std::dynamic_pointer_cast<RenderableModelEntityItem>(child);
|
||||||
|
if (modelEntity) {
|
||||||
|
if (modelEntity->getRelayParentJoints()) {
|
||||||
|
if (!modelEntity->getJointMapCompleted() || _reconstructSoftEntitiesJointMap) {
|
||||||
|
QStringList modelJointNames = modelEntity->getJointNames();
|
||||||
|
int numJoints = modelJointNames.count();
|
||||||
|
std::vector<int> map;
|
||||||
|
map.reserve(numJoints);
|
||||||
|
for (int jointIndex = 0; jointIndex < numJoints; jointIndex++) {
|
||||||
|
QString jointName = modelJointNames.at(jointIndex);
|
||||||
|
int avatarJointIndex = getJointIndex(jointName);
|
||||||
|
glm::quat jointRotation;
|
||||||
|
glm::vec3 jointTranslation;
|
||||||
|
if (avatarJointIndex < 0) {
|
||||||
|
jointRotation = modelEntity->getAbsoluteJointRotationInObjectFrame(jointIndex);
|
||||||
|
jointTranslation = modelEntity->getAbsoluteJointTranslationInObjectFrame(jointIndex);
|
||||||
|
map.push_back(-1);
|
||||||
|
} else {
|
||||||
|
int jointIndex = getJointIndex(jointName);
|
||||||
|
jointRotation = getJointRotation(jointIndex);
|
||||||
|
jointTranslation = getJointTranslation(jointIndex);
|
||||||
|
map.push_back(avatarJointIndex);
|
||||||
|
}
|
||||||
|
modelEntity->setLocalJointRotation(jointIndex, jointRotation);
|
||||||
|
modelEntity->setLocalJointTranslation(jointIndex, jointTranslation);
|
||||||
|
}
|
||||||
|
modelEntity->setJointMap(map);
|
||||||
|
} else {
|
||||||
|
QStringList modelJointNames = modelEntity->getJointNames();
|
||||||
|
int numJoints = modelJointNames.count();
|
||||||
|
for (int jointIndex = 0; jointIndex < numJoints; jointIndex++) {
|
||||||
|
int avatarJointIndex = modelEntity->avatarJointIndex(jointIndex);
|
||||||
|
glm::quat jointRotation;
|
||||||
|
glm::vec3 jointTranslation;
|
||||||
|
if (avatarJointIndex >=0) {
|
||||||
|
jointRotation = getJointRotation(avatarJointIndex);
|
||||||
|
jointTranslation = getJointTranslation(avatarJointIndex);
|
||||||
|
} else {
|
||||||
|
jointRotation = modelEntity->getAbsoluteJointRotationInObjectFrame(jointIndex);
|
||||||
|
jointTranslation = modelEntity->getAbsoluteJointTranslationInObjectFrame(jointIndex);
|
||||||
|
}
|
||||||
|
modelEntity->setLocalJointRotation(jointIndex, jointRotation);
|
||||||
|
modelEntity->setLocalJointTranslation(jointIndex, jointTranslation);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
Transform avatarTransform = _skeletonModel->getTransform();
|
||||||
|
avatarTransform.setScale(_skeletonModel->getScale());
|
||||||
|
modelEntity->setOverrideTransform(avatarTransform, _skeletonModel->getOffset());
|
||||||
|
modelEntity->simulateRelayedJoints();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
_reconstructSoftEntitiesJointMap = false;
|
||||||
|
}
|
||||||
|
|
||||||
void Avatar::simulate(float deltaTime, bool inView) {
|
void Avatar::simulate(float deltaTime, bool inView) {
|
||||||
PROFILE_RANGE(simulation, "simulate");
|
PROFILE_RANGE(simulation, "simulate");
|
||||||
|
|
||||||
|
@ -379,6 +440,7 @@ void Avatar::simulate(float deltaTime, bool inView) {
|
||||||
}
|
}
|
||||||
head->setScale(getModelScale());
|
head->setScale(getModelScale());
|
||||||
head->simulate(deltaTime);
|
head->simulate(deltaTime);
|
||||||
|
relayJointDataToChildren();
|
||||||
} else {
|
} else {
|
||||||
// a non-full update is still required so that the position, rotation, scale and bounds of the skeletonModel are updated.
|
// a non-full update is still required so that the position, rotation, scale and bounds of the skeletonModel are updated.
|
||||||
_skeletonModel->simulate(deltaTime, false);
|
_skeletonModel->simulate(deltaTime, false);
|
||||||
|
@ -1197,6 +1259,7 @@ void Avatar::setModelURLFinished(bool success) {
|
||||||
invalidateJointIndicesCache();
|
invalidateJointIndicesCache();
|
||||||
|
|
||||||
_isAnimatingScale = true;
|
_isAnimatingScale = true;
|
||||||
|
_reconstructSoftEntitiesJointMap = true;
|
||||||
|
|
||||||
if (!success && _skeletonModelURL != AvatarData::defaultFullAvatarModelUrl()) {
|
if (!success && _skeletonModelURL != AvatarData::defaultFullAvatarModelUrl()) {
|
||||||
const int MAX_SKELETON_DOWNLOAD_ATTEMPTS = 4; // NOTE: we don't want to be as generous as ResourceCache is, we only want 4 attempts
|
const int MAX_SKELETON_DOWNLOAD_ATTEMPTS = 4; // NOTE: we don't want to be as generous as ResourceCache is, we only want 4 attempts
|
||||||
|
|
|
@ -330,6 +330,7 @@ protected:
|
||||||
|
|
||||||
// protected methods...
|
// protected methods...
|
||||||
bool isLookingAtMe(AvatarSharedPointer avatar) const;
|
bool isLookingAtMe(AvatarSharedPointer avatar) const;
|
||||||
|
void relayJointDataToChildren();
|
||||||
|
|
||||||
void fade(render::Transaction& transaction, render::Transition::Type type);
|
void fade(render::Transaction& transaction, render::Transition::Type type);
|
||||||
|
|
||||||
|
@ -382,6 +383,7 @@ protected:
|
||||||
bool _isAnimatingScale { false };
|
bool _isAnimatingScale { false };
|
||||||
bool _mustFadeIn { false };
|
bool _mustFadeIn { false };
|
||||||
bool _isFading { false };
|
bool _isFading { false };
|
||||||
|
bool _reconstructSoftEntitiesJointMap { false };
|
||||||
float _modelScale { 1.0f };
|
float _modelScale { 1.0f };
|
||||||
|
|
||||||
static int _jointConesID;
|
static int _jointConesID;
|
||||||
|
|
|
@ -530,9 +530,13 @@ QByteArray AvatarData::toByteArray(AvatarDataDetail dataDetail, quint64 lastSent
|
||||||
|
|
||||||
destinationBuffer += numValidityBytes; // Move pointer past the validity bytes
|
destinationBuffer += numValidityBytes; // Move pointer past the validity bytes
|
||||||
|
|
||||||
|
// sentJointDataOut and lastSentJointData might be the same vector
|
||||||
|
// build sentJointDataOut locally and then swap it at the end.
|
||||||
|
QVector<JointData> localSentJointDataOut;
|
||||||
if (sentJointDataOut) {
|
if (sentJointDataOut) {
|
||||||
sentJointDataOut->resize(_jointData.size()); // Make sure the destination is resized before using it
|
localSentJointDataOut.resize(numJoints); // Make sure the destination is resized before using it
|
||||||
}
|
}
|
||||||
|
|
||||||
float minRotationDOT = !distanceAdjust ? AVATAR_MIN_ROTATION_DOT : getDistanceBasedMinRotationDOT(viewerPosition);
|
float minRotationDOT = !distanceAdjust ? AVATAR_MIN_ROTATION_DOT : getDistanceBasedMinRotationDOT(viewerPosition);
|
||||||
|
|
||||||
for (int i = 0; i < _jointData.size(); i++) {
|
for (int i = 0; i < _jointData.size(); i++) {
|
||||||
|
@ -552,8 +556,7 @@ QByteArray AvatarData::toByteArray(AvatarDataDetail dataDetail, quint64 lastSent
|
||||||
destinationBuffer += packOrientationQuatToSixBytes(destinationBuffer, data.rotation);
|
destinationBuffer += packOrientationQuatToSixBytes(destinationBuffer, data.rotation);
|
||||||
|
|
||||||
if (sentJointDataOut) {
|
if (sentJointDataOut) {
|
||||||
auto jointDataOut = *sentJointDataOut;
|
localSentJointDataOut[i].rotation = data.rotation;
|
||||||
jointDataOut[i].rotation = data.rotation;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -602,8 +605,7 @@ QByteArray AvatarData::toByteArray(AvatarDataDetail dataDetail, quint64 lastSent
|
||||||
packFloatVec3ToSignedTwoByteFixed(destinationBuffer, data.translation, TRANSLATION_COMPRESSION_RADIX);
|
packFloatVec3ToSignedTwoByteFixed(destinationBuffer, data.translation, TRANSLATION_COMPRESSION_RADIX);
|
||||||
|
|
||||||
if (sentJointDataOut) {
|
if (sentJointDataOut) {
|
||||||
auto jointDataOut = *sentJointDataOut;
|
localSentJointDataOut[i].translation = data.translation;
|
||||||
jointDataOut[i].translation = data.translation;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -646,6 +648,11 @@ QByteArray AvatarData::toByteArray(AvatarDataDetail dataDetail, quint64 lastSent
|
||||||
if (outboundDataRateOut) {
|
if (outboundDataRateOut) {
|
||||||
outboundDataRateOut->jointDataRate.increment(numBytes);
|
outboundDataRateOut->jointDataRate.increment(numBytes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (sentJointDataOut) {
|
||||||
|
// Push new sent joint data to sentJointDataOut
|
||||||
|
sentJointDataOut->swap(localSentJointDataOut);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
int avatarDataSize = destinationBuffer - startPosition;
|
int avatarDataSize = destinationBuffer - startPosition;
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
set(TARGET_NAME baking)
|
set(TARGET_NAME baking)
|
||||||
setup_hifi_library(Concurrent)
|
setup_hifi_library(Concurrent)
|
||||||
|
|
||||||
link_hifi_libraries(shared model networking ktx image fbx)
|
link_hifi_libraries(shared graphics networking ktx image fbx)
|
||||||
include_hifi_library_headers(gpu)
|
include_hifi_library_headers(gpu)
|
||||||
|
|
||||||
add_dependency_external_projects(draco)
|
add_dependency_external_projects(draco)
|
||||||
|
|
|
@ -5,7 +5,7 @@ link_hifi_libraries(shared plugins ui-plugins gl ui render-utils ${PLATFORM_GL_B
|
||||||
include_hifi_library_headers(gpu)
|
include_hifi_library_headers(gpu)
|
||||||
include_hifi_library_headers(model-networking)
|
include_hifi_library_headers(model-networking)
|
||||||
include_hifi_library_headers(networking)
|
include_hifi_library_headers(networking)
|
||||||
include_hifi_library_headers(model)
|
include_hifi_library_headers(graphics)
|
||||||
include_hifi_library_headers(fbx)
|
include_hifi_library_headers(fbx)
|
||||||
include_hifi_library_headers(image)
|
include_hifi_library_headers(image)
|
||||||
include_hifi_library_headers(ktx)
|
include_hifi_library_headers(ktx)
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
set(TARGET_NAME entities-renderer)
|
set(TARGET_NAME entities-renderer)
|
||||||
AUTOSCRIBE_SHADER_LIB(gpu model procedural render render-utils)
|
AUTOSCRIBE_SHADER_LIB(gpu graphics procedural render render-utils)
|
||||||
setup_hifi_library(Widgets Network Script)
|
setup_hifi_library(Widgets Network Script)
|
||||||
link_hifi_libraries(shared gpu procedural model model-networking script-engine render render-utils image ui pointers)
|
link_hifi_libraries(shared gpu procedural graphics model-networking script-engine render render-utils image ui pointers)
|
||||||
include_hifi_library_headers(networking)
|
include_hifi_library_headers(networking)
|
||||||
include_hifi_library_headers(gl)
|
include_hifi_library_headers(gl)
|
||||||
include_hifi_library_headers(ktx)
|
include_hifi_library_headers(ktx)
|
||||||
|
|
|
@ -52,9 +52,9 @@ void LightEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPoint
|
||||||
float exponent = entity->getExponent();
|
float exponent = entity->getExponent();
|
||||||
float cutoff = glm::radians(entity->getCutoff());
|
float cutoff = glm::radians(entity->getCutoff());
|
||||||
if (!entity->getIsSpotlight()) {
|
if (!entity->getIsSpotlight()) {
|
||||||
light->setType(model::Light::POINT);
|
light->setType(graphics::Light::POINT);
|
||||||
} else {
|
} else {
|
||||||
light->setType(model::Light::SPOT);
|
light->setType(graphics::Light::SPOT);
|
||||||
|
|
||||||
light->setSpotAngle(cutoff);
|
light->setSpotAngle(cutoff);
|
||||||
light->setSpotExponent(exponent);
|
light->setSpotExponent(exponent);
|
||||||
|
|
|
@ -558,10 +558,10 @@ void RenderableModelEntityItem::computeShapeInfo(ShapeInfo& shapeInfo) {
|
||||||
if (type == SHAPE_TYPE_STATIC_MESH) {
|
if (type == SHAPE_TYPE_STATIC_MESH) {
|
||||||
// copy into triangleIndices
|
// copy into triangleIndices
|
||||||
triangleIndices.reserve((int32_t)((gpu::Size)(triangleIndices.size()) + indices.getNumElements()));
|
triangleIndices.reserve((int32_t)((gpu::Size)(triangleIndices.size()) + indices.getNumElements()));
|
||||||
gpu::BufferView::Iterator<const model::Mesh::Part> partItr = parts.cbegin<const model::Mesh::Part>();
|
gpu::BufferView::Iterator<const graphics::Mesh::Part> partItr = parts.cbegin<const graphics::Mesh::Part>();
|
||||||
while (partItr != parts.cend<const model::Mesh::Part>()) {
|
while (partItr != parts.cend<const graphics::Mesh::Part>()) {
|
||||||
auto numIndices = partItr->_numIndices;
|
auto numIndices = partItr->_numIndices;
|
||||||
if (partItr->_topology == model::Mesh::TRIANGLES) {
|
if (partItr->_topology == graphics::Mesh::TRIANGLES) {
|
||||||
// TODO: assert rather than workaround after we start sanitizing FBXMesh higher up
|
// TODO: assert rather than workaround after we start sanitizing FBXMesh higher up
|
||||||
//assert(numIndices % TRIANGLE_STRIDE == 0);
|
//assert(numIndices % TRIANGLE_STRIDE == 0);
|
||||||
numIndices -= numIndices % TRIANGLE_STRIDE; // WORKAROUND lack of sanity checking in FBXReader
|
numIndices -= numIndices % TRIANGLE_STRIDE; // WORKAROUND lack of sanity checking in FBXReader
|
||||||
|
@ -572,7 +572,7 @@ void RenderableModelEntityItem::computeShapeInfo(ShapeInfo& shapeInfo) {
|
||||||
triangleIndices.push_back(*indexItr + meshIndexOffset);
|
triangleIndices.push_back(*indexItr + meshIndexOffset);
|
||||||
++indexItr;
|
++indexItr;
|
||||||
}
|
}
|
||||||
} else if (partItr->_topology == model::Mesh::TRIANGLE_STRIP) {
|
} else if (partItr->_topology == graphics::Mesh::TRIANGLE_STRIP) {
|
||||||
// TODO: resurrect assert after we start sanitizing FBXMesh higher up
|
// TODO: resurrect assert after we start sanitizing FBXMesh higher up
|
||||||
//assert(numIndices > 2);
|
//assert(numIndices > 2);
|
||||||
|
|
||||||
|
@ -593,7 +593,7 @@ void RenderableModelEntityItem::computeShapeInfo(ShapeInfo& shapeInfo) {
|
||||||
// the rest use previous and next index
|
// the rest use previous and next index
|
||||||
uint32_t triangleCount = 1;
|
uint32_t triangleCount = 1;
|
||||||
while (indexItr != indexEnd) {
|
while (indexItr != indexEnd) {
|
||||||
if ((*indexItr) != model::Mesh::PRIMITIVE_RESTART_INDEX) {
|
if ((*indexItr) != graphics::Mesh::PRIMITIVE_RESTART_INDEX) {
|
||||||
if (triangleCount % 2 == 0) {
|
if (triangleCount % 2 == 0) {
|
||||||
// even triangles use first two indices in order
|
// even triangles use first two indices in order
|
||||||
triangleIndices.push_back(*(indexItr - 2) + meshIndexOffset);
|
triangleIndices.push_back(*(indexItr - 2) + meshIndexOffset);
|
||||||
|
@ -613,12 +613,12 @@ void RenderableModelEntityItem::computeShapeInfo(ShapeInfo& shapeInfo) {
|
||||||
}
|
}
|
||||||
} else if (type == SHAPE_TYPE_SIMPLE_COMPOUND) {
|
} else if (type == SHAPE_TYPE_SIMPLE_COMPOUND) {
|
||||||
// for each mesh copy unique part indices, separated by special bogus (flag) index values
|
// for each mesh copy unique part indices, separated by special bogus (flag) index values
|
||||||
gpu::BufferView::Iterator<const model::Mesh::Part> partItr = parts.cbegin<const model::Mesh::Part>();
|
gpu::BufferView::Iterator<const graphics::Mesh::Part> partItr = parts.cbegin<const graphics::Mesh::Part>();
|
||||||
while (partItr != parts.cend<const model::Mesh::Part>()) {
|
while (partItr != parts.cend<const graphics::Mesh::Part>()) {
|
||||||
// collect unique list of indices for this part
|
// collect unique list of indices for this part
|
||||||
std::set<int32_t> uniqueIndices;
|
std::set<int32_t> uniqueIndices;
|
||||||
auto numIndices = partItr->_numIndices;
|
auto numIndices = partItr->_numIndices;
|
||||||
if (partItr->_topology == model::Mesh::TRIANGLES) {
|
if (partItr->_topology == graphics::Mesh::TRIANGLES) {
|
||||||
// TODO: assert rather than workaround after we start sanitizing FBXMesh higher up
|
// TODO: assert rather than workaround after we start sanitizing FBXMesh higher up
|
||||||
//assert(numIndices% TRIANGLE_STRIDE == 0);
|
//assert(numIndices% TRIANGLE_STRIDE == 0);
|
||||||
numIndices -= numIndices % TRIANGLE_STRIDE; // WORKAROUND lack of sanity checking in FBXReader
|
numIndices -= numIndices % TRIANGLE_STRIDE; // WORKAROUND lack of sanity checking in FBXReader
|
||||||
|
@ -629,7 +629,7 @@ void RenderableModelEntityItem::computeShapeInfo(ShapeInfo& shapeInfo) {
|
||||||
uniqueIndices.insert(*indexItr);
|
uniqueIndices.insert(*indexItr);
|
||||||
++indexItr;
|
++indexItr;
|
||||||
}
|
}
|
||||||
} else if (partItr->_topology == model::Mesh::TRIANGLE_STRIP) {
|
} else if (partItr->_topology == graphics::Mesh::TRIANGLE_STRIP) {
|
||||||
// TODO: resurrect assert after we start sanitizing FBXMesh higher up
|
// TODO: resurrect assert after we start sanitizing FBXMesh higher up
|
||||||
//assert(numIndices > TRIANGLE_STRIDE - 1);
|
//assert(numIndices > TRIANGLE_STRIDE - 1);
|
||||||
|
|
||||||
|
@ -644,7 +644,7 @@ void RenderableModelEntityItem::computeShapeInfo(ShapeInfo& shapeInfo) {
|
||||||
// the rest use previous and next index
|
// the rest use previous and next index
|
||||||
uint32_t triangleCount = 1;
|
uint32_t triangleCount = 1;
|
||||||
while (indexItr != indexEnd) {
|
while (indexItr != indexEnd) {
|
||||||
if ((*indexItr) != model::Mesh::PRIMITIVE_RESTART_INDEX) {
|
if ((*indexItr) != graphics::Mesh::PRIMITIVE_RESTART_INDEX) {
|
||||||
if (triangleCount % 2 == 0) {
|
if (triangleCount % 2 == 0) {
|
||||||
// EVEN triangles use first two indices in order
|
// EVEN triangles use first two indices in order
|
||||||
uniqueIndices.insert(*(indexItr - 2));
|
uniqueIndices.insert(*(indexItr - 2));
|
||||||
|
@ -708,6 +708,26 @@ void RenderableModelEntityItem::setCollisionShape(const btCollisionShape* shape)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RenderableModelEntityItem::setJointMap(std::vector<int> jointMap) {
|
||||||
|
if (jointMap.size() > 0) {
|
||||||
|
_jointMap = jointMap;
|
||||||
|
_jointMapCompleted = true;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
_jointMapCompleted = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
int RenderableModelEntityItem::avatarJointIndex(int modelJointIndex) {
|
||||||
|
int result = -1;
|
||||||
|
int mapSize = (int) _jointMap.size();
|
||||||
|
if (modelJointIndex >=0 && modelJointIndex < mapSize) {
|
||||||
|
result = _jointMap[modelJointIndex];
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
bool RenderableModelEntityItem::contains(const glm::vec3& point) const {
|
bool RenderableModelEntityItem::contains(const glm::vec3& point) const {
|
||||||
auto model = getModel();
|
auto model = getModel();
|
||||||
if (EntityItem::contains(point) && model && _compoundShapeResource && _compoundShapeResource->isLoaded()) {
|
if (EntityItem::contains(point) && model && _compoundShapeResource && _compoundShapeResource->isLoaded()) {
|
||||||
|
@ -813,6 +833,10 @@ bool RenderableModelEntityItem::setAbsoluteJointTranslationInObjectFrame(int ind
|
||||||
return setLocalJointTranslation(index, jointRelativePose.trans());
|
return setLocalJointTranslation(index, jointRelativePose.trans());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool RenderableModelEntityItem::getJointMapCompleted() {
|
||||||
|
return _jointMapCompleted;
|
||||||
|
}
|
||||||
|
|
||||||
glm::quat RenderableModelEntityItem::getLocalJointRotation(int index) const {
|
glm::quat RenderableModelEntityItem::getLocalJointRotation(int index) const {
|
||||||
auto model = getModel();
|
auto model = getModel();
|
||||||
if (model) {
|
if (model) {
|
||||||
|
@ -835,6 +859,13 @@ glm::vec3 RenderableModelEntityItem::getLocalJointTranslation(int index) const {
|
||||||
return glm::vec3();
|
return glm::vec3();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RenderableModelEntityItem::setOverrideTransform(const Transform& transform, const glm::vec3& offset) {
|
||||||
|
auto model = getModel();
|
||||||
|
if (model) {
|
||||||
|
model->overrideModelTransformAndOffset(transform, offset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
bool RenderableModelEntityItem::setLocalJointRotation(int index, const glm::quat& rotation) {
|
bool RenderableModelEntityItem::setLocalJointRotation(int index, const glm::quat& rotation) {
|
||||||
autoResizeJointArrays();
|
autoResizeJointArrays();
|
||||||
bool result = false;
|
bool result = false;
|
||||||
|
@ -929,6 +960,26 @@ bool RenderableModelEntityItem::getMeshes(MeshProxyList& result) {
|
||||||
return !result.isEmpty();
|
return !result.isEmpty();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void RenderableModelEntityItem::simulateRelayedJoints() {
|
||||||
|
ModelPointer model = getModel();
|
||||||
|
if (model && model->isLoaded()) {
|
||||||
|
copyAnimationJointDataToModel();
|
||||||
|
model->simulate(0.0f);
|
||||||
|
model->updateRenderItems();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void RenderableModelEntityItem::stopModelOverrideIfNoParent() {
|
||||||
|
auto model = getModel();
|
||||||
|
if (model) {
|
||||||
|
bool overriding = model->isOverridingModelTransformAndOffset();
|
||||||
|
QUuid parentID = getParentID();
|
||||||
|
if (overriding && (!_relayParentJoints || parentID.isNull())) {
|
||||||
|
model->stopTransformAndOffsetOverride();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void RenderableModelEntityItem::copyAnimationJointDataToModel() {
|
void RenderableModelEntityItem::copyAnimationJointDataToModel() {
|
||||||
auto model = getModel();
|
auto model = getModel();
|
||||||
if (!model || !model->isLoaded()) {
|
if (!model || !model->isLoaded()) {
|
||||||
|
@ -1280,6 +1331,7 @@ void ModelEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& sce
|
||||||
}
|
}
|
||||||
|
|
||||||
entity->updateModelBounds();
|
entity->updateModelBounds();
|
||||||
|
entity->stopModelOverrideIfNoParent();
|
||||||
|
|
||||||
if (model->isVisible() != _visible) {
|
if (model->isVisible() != _visible) {
|
||||||
// FIXME: this seems like it could be optimized if we tracked our last known visible state in
|
// FIXME: this seems like it could be optimized if we tracked our last known visible state in
|
||||||
|
@ -1295,7 +1347,7 @@ void ModelEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& sce
|
||||||
ShapeType type = entity->getShapeType();
|
ShapeType type = entity->getShapeType();
|
||||||
if (DependencyManager::get<EntityTreeRenderer>()->shouldRenderDebugHulls() && type != SHAPE_TYPE_STATIC_MESH && type != SHAPE_TYPE_NONE) {
|
if (DependencyManager::get<EntityTreeRenderer>()->shouldRenderDebugHulls() && type != SHAPE_TYPE_STATIC_MESH && type != SHAPE_TYPE_NONE) {
|
||||||
// NOTE: it is OK if _collisionMeshKey is nullptr
|
// NOTE: it is OK if _collisionMeshKey is nullptr
|
||||||
model::MeshPointer mesh = collisionMeshCache.getMesh(_collisionMeshKey);
|
graphics::MeshPointer mesh = collisionMeshCache.getMesh(_collisionMeshKey);
|
||||||
// NOTE: the model will render the collisionGeometry if it has one
|
// NOTE: the model will render the collisionGeometry if it has one
|
||||||
_model->setCollisionMesh(mesh);
|
_model->setCollisionMesh(mesh);
|
||||||
} else {
|
} else {
|
||||||
|
@ -1304,7 +1356,7 @@ void ModelEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& sce
|
||||||
collisionMeshCache.releaseMesh(_collisionMeshKey);
|
collisionMeshCache.releaseMesh(_collisionMeshKey);
|
||||||
}
|
}
|
||||||
// clear model's collision geometry
|
// clear model's collision geometry
|
||||||
model::MeshPointer mesh = nullptr;
|
graphics::MeshPointer mesh = nullptr;
|
||||||
_model->setCollisionMesh(mesh);
|
_model->setCollisionMesh(mesh);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -81,8 +81,14 @@ public:
|
||||||
void setCollisionShape(const btCollisionShape* shape) override;
|
void setCollisionShape(const btCollisionShape* shape) override;
|
||||||
|
|
||||||
virtual bool contains(const glm::vec3& point) const override;
|
virtual bool contains(const glm::vec3& point) const override;
|
||||||
|
void stopModelOverrideIfNoParent();
|
||||||
|
|
||||||
virtual bool shouldBePhysical() const override;
|
virtual bool shouldBePhysical() const override;
|
||||||
|
void simulateRelayedJoints();
|
||||||
|
bool getJointMapCompleted();
|
||||||
|
void setJointMap(std::vector<int> jointMap);
|
||||||
|
int avatarJointIndex(int modelJointIndex);
|
||||||
|
void setOverrideTransform(const Transform& transform, const glm::vec3& offset);
|
||||||
|
|
||||||
// these are in the frame of this object (model space)
|
// these are in the frame of this object (model space)
|
||||||
virtual glm::quat getAbsoluteJointRotationInObjectFrame(int index) const override;
|
virtual glm::quat getAbsoluteJointRotationInObjectFrame(int index) const override;
|
||||||
|
@ -90,7 +96,6 @@ public:
|
||||||
virtual bool setAbsoluteJointRotationInObjectFrame(int index, const glm::quat& rotation) override;
|
virtual bool setAbsoluteJointRotationInObjectFrame(int index, const glm::quat& rotation) override;
|
||||||
virtual bool setAbsoluteJointTranslationInObjectFrame(int index, const glm::vec3& translation) override;
|
virtual bool setAbsoluteJointTranslationInObjectFrame(int index, const glm::vec3& translation) override;
|
||||||
|
|
||||||
|
|
||||||
virtual glm::quat getLocalJointRotation(int index) const override;
|
virtual glm::quat getLocalJointRotation(int index) const override;
|
||||||
virtual glm::vec3 getLocalJointTranslation(int index) const override;
|
virtual glm::vec3 getLocalJointTranslation(int index) const override;
|
||||||
virtual bool setLocalJointRotation(int index, const glm::quat& rotation) override;
|
virtual bool setLocalJointRotation(int index, const glm::quat& rotation) override;
|
||||||
|
@ -119,7 +124,9 @@ private:
|
||||||
|
|
||||||
void getCollisionGeometryResource();
|
void getCollisionGeometryResource();
|
||||||
GeometryResource::Pointer _compoundShapeResource;
|
GeometryResource::Pointer _compoundShapeResource;
|
||||||
|
bool _jointMapCompleted { false };
|
||||||
bool _originalTexturesRead { false };
|
bool _originalTexturesRead { false };
|
||||||
|
std::vector<int> _jointMap;
|
||||||
QVariantMap _originalTextures;
|
QVariantMap _originalTextures;
|
||||||
bool _dimensionsInitialized { true };
|
bool _dimensionsInitialized { true };
|
||||||
bool _needsJointSimulation { false };
|
bool _needsJointSimulation { false };
|
||||||
|
|
|
@ -65,7 +65,7 @@
|
||||||
#pragma warning(pop)
|
#pragma warning(pop)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include "model/Geometry.h"
|
#include "graphics/Geometry.h"
|
||||||
|
|
||||||
#include "StencilMaskPass.h"
|
#include "StencilMaskPass.h"
|
||||||
|
|
||||||
|
@ -1060,7 +1060,7 @@ void RenderablePolyVoxEntityItem::recomputeMesh() {
|
||||||
auto entity = std::static_pointer_cast<RenderablePolyVoxEntityItem>(getThisPointer());
|
auto entity = std::static_pointer_cast<RenderablePolyVoxEntityItem>(getThisPointer());
|
||||||
|
|
||||||
QtConcurrent::run([entity, voxelSurfaceStyle] {
|
QtConcurrent::run([entity, voxelSurfaceStyle] {
|
||||||
model::MeshPointer mesh(new model::Mesh());
|
graphics::MeshPointer mesh(new graphics::Mesh());
|
||||||
|
|
||||||
// A mesh object to hold the result of surface extraction
|
// A mesh object to hold the result of surface extraction
|
||||||
PolyVox::SurfaceMesh<PolyVox::PositionMaterialNormal> polyVoxMesh;
|
PolyVox::SurfaceMesh<PolyVox::PositionMaterialNormal> polyVoxMesh;
|
||||||
|
@ -1122,18 +1122,18 @@ void RenderablePolyVoxEntityItem::recomputeMesh() {
|
||||||
sizeof(PolyVox::PositionMaterialNormal),
|
sizeof(PolyVox::PositionMaterialNormal),
|
||||||
gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ)));
|
gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ)));
|
||||||
|
|
||||||
std::vector<model::Mesh::Part> parts;
|
std::vector<graphics::Mesh::Part> parts;
|
||||||
parts.emplace_back(model::Mesh::Part((model::Index)0, // startIndex
|
parts.emplace_back(graphics::Mesh::Part((graphics::Index)0, // startIndex
|
||||||
(model::Index)vecIndices.size(), // numIndices
|
(graphics::Index)vecIndices.size(), // numIndices
|
||||||
(model::Index)0, // baseVertex
|
(graphics::Index)0, // baseVertex
|
||||||
model::Mesh::TRIANGLES)); // topology
|
graphics::Mesh::TRIANGLES)); // topology
|
||||||
mesh->setPartBuffer(gpu::BufferView(new gpu::Buffer(parts.size() * sizeof(model::Mesh::Part),
|
mesh->setPartBuffer(gpu::BufferView(new gpu::Buffer(parts.size() * sizeof(graphics::Mesh::Part),
|
||||||
(gpu::Byte*) parts.data()), gpu::Element::PART_DRAWCALL));
|
(gpu::Byte*) parts.data()), gpu::Element::PART_DRAWCALL));
|
||||||
entity->setMesh(mesh);
|
entity->setMesh(mesh);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
void RenderablePolyVoxEntityItem::setMesh(model::MeshPointer mesh) {
|
void RenderablePolyVoxEntityItem::setMesh(graphics::MeshPointer mesh) {
|
||||||
// this catches the payload from recomputeMesh
|
// this catches the payload from recomputeMesh
|
||||||
bool neighborsNeedUpdate;
|
bool neighborsNeedUpdate;
|
||||||
withWriteLock([&] {
|
withWriteLock([&] {
|
||||||
|
@ -1164,7 +1164,7 @@ void RenderablePolyVoxEntityItem::computeShapeInfoWorker() {
|
||||||
|
|
||||||
PolyVoxSurfaceStyle voxelSurfaceStyle;
|
PolyVoxSurfaceStyle voxelSurfaceStyle;
|
||||||
glm::vec3 voxelVolumeSize;
|
glm::vec3 voxelVolumeSize;
|
||||||
model::MeshPointer mesh;
|
graphics::MeshPointer mesh;
|
||||||
|
|
||||||
withReadLock([&] {
|
withReadLock([&] {
|
||||||
voxelSurfaceStyle = _voxelSurfaceStyle;
|
voxelSurfaceStyle = _voxelSurfaceStyle;
|
||||||
|
@ -1582,7 +1582,7 @@ void PolyVoxEntityRenderer::doRenderUpdateSynchronousTyped(const ScenePointer& s
|
||||||
|
|
||||||
void PolyVoxEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPointer& entity) {
|
void PolyVoxEntityRenderer::doRenderUpdateAsynchronousTyped(const TypedEntityPointer& entity) {
|
||||||
_lastVoxelToWorldMatrix = entity->voxelToWorldMatrix();
|
_lastVoxelToWorldMatrix = entity->voxelToWorldMatrix();
|
||||||
model::MeshPointer newMesh;
|
graphics::MeshPointer newMesh;
|
||||||
entity->withReadLock([&] {
|
entity->withReadLock([&] {
|
||||||
newMesh = entity->_mesh;
|
newMesh = entity->_mesh;
|
||||||
});
|
});
|
||||||
|
|
|
@ -21,8 +21,8 @@
|
||||||
|
|
||||||
#include <gpu/Forward.h>
|
#include <gpu/Forward.h>
|
||||||
#include <gpu/Context.h>
|
#include <gpu/Context.h>
|
||||||
#include <model/Forward.h>
|
#include <graphics/Forward.h>
|
||||||
#include <model/Geometry.h>
|
#include <graphics/Geometry.h>
|
||||||
#include <TextureCache.h>
|
#include <TextureCache.h>
|
||||||
#include <PolyVoxEntityItem.h>
|
#include <PolyVoxEntityItem.h>
|
||||||
|
|
||||||
|
@ -104,7 +104,7 @@ public:
|
||||||
void forEachVoxelValue(const ivec3& voxelSize, std::function<void(const ivec3&, uint8_t)> thunk);
|
void forEachVoxelValue(const ivec3& voxelSize, std::function<void(const ivec3&, uint8_t)> thunk);
|
||||||
QByteArray volDataToArray(quint16 voxelXSize, quint16 voxelYSize, quint16 voxelZSize) const;
|
QByteArray volDataToArray(quint16 voxelXSize, quint16 voxelYSize, quint16 voxelZSize) const;
|
||||||
|
|
||||||
void setMesh(model::MeshPointer mesh);
|
void setMesh(graphics::MeshPointer mesh);
|
||||||
void setCollisionPoints(ShapeInfo::PointCollection points, AABox box);
|
void setCollisionPoints(ShapeInfo::PointCollection points, AABox box);
|
||||||
PolyVox::SimpleVolume<uint8_t>* getVolData() { return _volData.get(); }
|
PolyVox::SimpleVolume<uint8_t>* getVolData() { return _volData.get(); }
|
||||||
|
|
||||||
|
@ -134,7 +134,7 @@ private:
|
||||||
// may not match _voxelVolumeSize.
|
// may not match _voxelVolumeSize.
|
||||||
bool _meshDirty { true }; // does collision-shape need to be recomputed?
|
bool _meshDirty { true }; // does collision-shape need to be recomputed?
|
||||||
bool _meshReady{ false };
|
bool _meshReady{ false };
|
||||||
model::MeshPointer _mesh;
|
graphics::MeshPointer _mesh;
|
||||||
|
|
||||||
ShapeInfo _shapeInfo;
|
ShapeInfo _shapeInfo;
|
||||||
|
|
||||||
|
@ -178,7 +178,7 @@ private:
|
||||||
bool _hasTransitioned{ false };
|
bool _hasTransitioned{ false };
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
model::MeshPointer _mesh;
|
graphics::MeshPointer _mesh;
|
||||||
std::array<NetworkTexturePointer, 3> _xyzTextures;
|
std::array<NetworkTexturePointer, 3> _xyzTextures;
|
||||||
glm::vec3 _lastVoxelVolumeSize;
|
glm::vec3 _lastVoxelVolumeSize;
|
||||||
glm::mat4 _lastVoxelToWorldMatrix;
|
glm::mat4 _lastVoxelToWorldMatrix;
|
||||||
|
|
|
@ -13,7 +13,7 @@
|
||||||
|
|
||||||
#include <gpu/Batch.h>
|
#include <gpu/Batch.h>
|
||||||
|
|
||||||
#include <model/Stage.h>
|
#include <graphics/Stage.h>
|
||||||
|
|
||||||
#include <DependencyManager.h>
|
#include <DependencyManager.h>
|
||||||
#include <GeometryCache.h>
|
#include <GeometryCache.h>
|
||||||
|
@ -162,28 +162,31 @@ void ZoneEntityRenderer::doRender(RenderArgs* args) {
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_visible) {
|
if (_visible) {
|
||||||
// Finally, push the light visible in the frame
|
// Finally, push the lights visible in the frame
|
||||||
|
//
|
||||||
|
// If component is disabled then push component off state
|
||||||
|
// else if component is enabled then push current state
|
||||||
|
// (else mode is inherit, the value from the parent zone will be used
|
||||||
|
//
|
||||||
if (_keyLightMode == COMPONENT_MODE_DISABLED) {
|
if (_keyLightMode == COMPONENT_MODE_DISABLED) {
|
||||||
_stage->_currentFrame.pushSunLight(_stage->getSunOffLight());
|
_stage->_currentFrame.pushSunLight(_stage->getSunOffLight());
|
||||||
} else if (_keyLightMode == COMPONENT_MODE_ENABLED) {
|
} else if (_keyLightMode == COMPONENT_MODE_ENABLED) {
|
||||||
_stage->_currentFrame.pushSunLight(_sunIndex);
|
_stage->_currentFrame.pushSunLight(_sunIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
// The background only if the mode is not inherit
|
|
||||||
if (_skyboxMode == COMPONENT_MODE_DISABLED) {
|
if (_skyboxMode == COMPONENT_MODE_DISABLED) {
|
||||||
_backgroundStage->_currentFrame.pushBackground(INVALID_INDEX);
|
_backgroundStage->_currentFrame.pushBackground(INVALID_INDEX);
|
||||||
} else if (_skyboxMode == COMPONENT_MODE_ENABLED) {
|
} else if (_skyboxMode == COMPONENT_MODE_ENABLED) {
|
||||||
_backgroundStage->_currentFrame.pushBackground(_backgroundIndex);
|
_backgroundStage->_currentFrame.pushBackground(_backgroundIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
// The ambient light only if it has a valid texture to render with
|
|
||||||
if (_ambientLightMode == COMPONENT_MODE_DISABLED) {
|
if (_ambientLightMode == COMPONENT_MODE_DISABLED) {
|
||||||
_stage->_currentFrame.pushAmbientLight(_stage->getAmbientOffLight());
|
_stage->_currentFrame.pushAmbientLight(_stage->getAmbientOffLight());
|
||||||
} else if (_ambientLightMode == COMPONENT_MODE_ENABLED) {
|
} else if (_ambientLightMode == COMPONENT_MODE_ENABLED) {
|
||||||
_stage->_currentFrame.pushAmbientLight(_ambientIndex);
|
_stage->_currentFrame.pushAmbientLight(_ambientIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Haze only if the mode is not inherit
|
// Haze only if the mode is not inherit, as the model deals with on/off
|
||||||
if (_hazeMode != COMPONENT_MODE_INHERIT) {
|
if (_hazeMode != COMPONENT_MODE_INHERIT) {
|
||||||
_hazeStage->_currentFrame.pushHaze(_hazeIndex);
|
_hazeStage->_currentFrame.pushHaze(_hazeIndex);
|
||||||
}
|
}
|
||||||
|
@ -319,7 +322,7 @@ void ZoneEntityRenderer::updateKeySunFromEntity(const TypedEntityPointer& entity
|
||||||
setKeyLightMode((ComponentMode)entity->getKeyLightMode());
|
setKeyLightMode((ComponentMode)entity->getKeyLightMode());
|
||||||
|
|
||||||
const auto& sunLight = editSunLight();
|
const auto& sunLight = editSunLight();
|
||||||
sunLight->setType(model::Light::SUN);
|
sunLight->setType(graphics::Light::SUN);
|
||||||
sunLight->setPosition(_lastPosition);
|
sunLight->setPosition(_lastPosition);
|
||||||
sunLight->setOrientation(_lastRotation);
|
sunLight->setOrientation(_lastRotation);
|
||||||
|
|
||||||
|
@ -333,7 +336,7 @@ void ZoneEntityRenderer::updateAmbientLightFromEntity(const TypedEntityPointer&
|
||||||
setAmbientLightMode((ComponentMode)entity->getAmbientLightMode());
|
setAmbientLightMode((ComponentMode)entity->getAmbientLightMode());
|
||||||
|
|
||||||
const auto& ambientLight = editAmbientLight();
|
const auto& ambientLight = editAmbientLight();
|
||||||
ambientLight->setType(model::Light::AMBIENT);
|
ambientLight->setType(graphics::Light::AMBIENT);
|
||||||
ambientLight->setPosition(_lastPosition);
|
ambientLight->setPosition(_lastPosition);
|
||||||
ambientLight->setOrientation(_lastRotation);
|
ambientLight->setOrientation(_lastRotation);
|
||||||
|
|
||||||
|
@ -357,23 +360,23 @@ void ZoneEntityRenderer::updateHazeFromEntity(const TypedEntityPointer& entity)
|
||||||
haze->setHazeActive(hazeMode == COMPONENT_MODE_ENABLED);
|
haze->setHazeActive(hazeMode == COMPONENT_MODE_ENABLED);
|
||||||
haze->setAltitudeBased(_hazeProperties.getHazeAltitudeEffect());
|
haze->setAltitudeBased(_hazeProperties.getHazeAltitudeEffect());
|
||||||
|
|
||||||
haze->setHazeRangeFactor(model::Haze::convertHazeRangeToHazeRangeFactor(_hazeProperties.getHazeRange()));
|
haze->setHazeRangeFactor(graphics::Haze::convertHazeRangeToHazeRangeFactor(_hazeProperties.getHazeRange()));
|
||||||
xColor hazeColor = _hazeProperties.getHazeColor();
|
xColor hazeColor = _hazeProperties.getHazeColor();
|
||||||
haze->setHazeColor(glm::vec3(hazeColor.red / 255.0, hazeColor.green / 255.0, hazeColor.blue / 255.0));
|
haze->setHazeColor(glm::vec3(hazeColor.red / 255.0, hazeColor.green / 255.0, hazeColor.blue / 255.0));
|
||||||
xColor hazeGlareColor = _hazeProperties.getHazeGlareColor();
|
xColor hazeGlareColor = _hazeProperties.getHazeGlareColor();
|
||||||
haze->setHazeGlareColor(glm::vec3(hazeGlareColor.red / 255.0, hazeGlareColor.green / 255.0, hazeGlareColor.blue / 255.0));
|
haze->setHazeGlareColor(glm::vec3(hazeGlareColor.red / 255.0, hazeGlareColor.green / 255.0, hazeGlareColor.blue / 255.0));
|
||||||
haze->setHazeEnableGlare(_hazeProperties.getHazeEnableGlare());
|
haze->setHazeEnableGlare(_hazeProperties.getHazeEnableGlare());
|
||||||
haze->setHazeGlareBlend(model::Haze::convertGlareAngleToPower(_hazeProperties.getHazeGlareAngle()));
|
haze->setHazeGlareBlend(graphics::Haze::convertGlareAngleToPower(_hazeProperties.getHazeGlareAngle()));
|
||||||
|
|
||||||
float hazeAltitude = _hazeProperties.getHazeCeiling() - _hazeProperties.getHazeBaseRef();
|
float hazeAltitude = _hazeProperties.getHazeCeiling() - _hazeProperties.getHazeBaseRef();
|
||||||
haze->setHazeAltitudeFactor(model::Haze::convertHazeAltitudeToHazeAltitudeFactor(hazeAltitude));
|
haze->setHazeAltitudeFactor(graphics::Haze::convertHazeAltitudeToHazeAltitudeFactor(hazeAltitude));
|
||||||
haze->setHazeBaseReference(_hazeProperties.getHazeBaseRef());
|
haze->setHazeBaseReference(_hazeProperties.getHazeBaseRef());
|
||||||
|
|
||||||
haze->setHazeBackgroundBlend(_hazeProperties.getHazeBackgroundBlend());
|
haze->setHazeBackgroundBlend(_hazeProperties.getHazeBackgroundBlend());
|
||||||
|
|
||||||
haze->setHazeAttenuateKeyLight(_hazeProperties.getHazeAttenuateKeyLight());
|
haze->setHazeAttenuateKeyLight(_hazeProperties.getHazeAttenuateKeyLight());
|
||||||
haze->setHazeKeyLightRangeFactor(model::Haze::convertHazeRangeToHazeRangeFactor(_hazeProperties.getHazeKeyLightRange()));
|
haze->setHazeKeyLightRangeFactor(graphics::Haze::convertHazeRangeToHazeRangeFactor(_hazeProperties.getHazeKeyLightRange()));
|
||||||
haze->setHazeKeyLightAltitudeFactor(model::Haze::convertHazeAltitudeToHazeAltitudeFactor(_hazeProperties.getHazeKeyLightAltitude()));
|
haze->setHazeKeyLightAltitudeFactor(graphics::Haze::convertHazeAltitudeToHazeAltitudeFactor(_hazeProperties.getHazeKeyLightAltitude()));
|
||||||
|
|
||||||
haze->setZoneTransform(entity->getTransform().getMatrix());
|
haze->setZoneTransform(entity->getTransform().getMatrix());
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,9 +13,9 @@
|
||||||
#define hifi_RenderableZoneEntityItem_h
|
#define hifi_RenderableZoneEntityItem_h
|
||||||
|
|
||||||
#include <ZoneEntityItem.h>
|
#include <ZoneEntityItem.h>
|
||||||
#include <model/Skybox.h>
|
#include <graphics/Skybox.h>
|
||||||
#include <model/Haze.h>
|
#include <graphics/Haze.h>
|
||||||
#include <model/Stage.h>
|
#include <graphics/Stage.h>
|
||||||
#include <LightStage.h>
|
#include <LightStage.h>
|
||||||
#include <BackgroundStage.h>
|
#include <BackgroundStage.h>
|
||||||
#include <HazeStage.h>
|
#include <HazeStage.h>
|
||||||
|
@ -63,11 +63,11 @@ private:
|
||||||
void setSkyboxColor(const glm::vec3& color);
|
void setSkyboxColor(const glm::vec3& color);
|
||||||
void setProceduralUserData(const QString& userData);
|
void setProceduralUserData(const QString& userData);
|
||||||
|
|
||||||
model::LightPointer editSunLight() { _needSunUpdate = true; return _sunLight; }
|
graphics::LightPointer editSunLight() { _needSunUpdate = true; return _sunLight; }
|
||||||
model::LightPointer editAmbientLight() { _needAmbientUpdate = true; return _ambientLight; }
|
graphics::LightPointer editAmbientLight() { _needAmbientUpdate = true; return _ambientLight; }
|
||||||
model::SunSkyStagePointer editBackground() { _needBackgroundUpdate = true; return _background; }
|
graphics::SunSkyStagePointer editBackground() { _needBackgroundUpdate = true; return _background; }
|
||||||
model::SkyboxPointer editSkybox() { return editBackground()->getSkybox(); }
|
graphics::SkyboxPointer editSkybox() { return editBackground()->getSkybox(); }
|
||||||
model::HazePointer editHaze() { _needHazeUpdate = true; return _haze; }
|
graphics::HazePointer editHaze() { _needHazeUpdate = true; return _haze; }
|
||||||
|
|
||||||
bool _needsInitialSimulation{ true };
|
bool _needsInitialSimulation{ true };
|
||||||
glm::vec3 _lastPosition;
|
glm::vec3 _lastPosition;
|
||||||
|
@ -83,10 +83,10 @@ private:
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
LightStagePointer _stage;
|
LightStagePointer _stage;
|
||||||
const model::LightPointer _sunLight{ std::make_shared<model::Light>() };
|
const graphics::LightPointer _sunLight{ std::make_shared<graphics::Light>() };
|
||||||
const model::LightPointer _ambientLight{ std::make_shared<model::Light>() };
|
const graphics::LightPointer _ambientLight{ std::make_shared<graphics::Light>() };
|
||||||
const model::SunSkyStagePointer _background{ std::make_shared<model::SunSkyStage>() };
|
const graphics::SunSkyStagePointer _background{ std::make_shared<graphics::SunSkyStage>() };
|
||||||
const model::HazePointer _haze{ std::make_shared<model::Haze>() };
|
const graphics::HazePointer _haze{ std::make_shared<graphics::Haze>() };
|
||||||
|
|
||||||
ComponentMode _keyLightMode { COMPONENT_MODE_INHERIT };
|
ComponentMode _keyLightMode { COMPONENT_MODE_INHERIT };
|
||||||
ComponentMode _ambientLightMode { COMPONENT_MODE_INHERIT };
|
ComponentMode _ambientLightMode { COMPONENT_MODE_INHERIT };
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
//
|
//
|
||||||
|
|
||||||
<@include model/Material.slh@>
|
<@include graphics/Material.slh@>
|
||||||
<@include DeferredBufferWrite.slh@>
|
<@include DeferredBufferWrite.slh@>
|
||||||
|
|
||||||
in vec3 _normal;
|
in vec3 _normal;
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
//
|
//
|
||||||
|
|
||||||
<@include model/Material.slh@>
|
<@include graphics/Material.slh@>
|
||||||
<@include DeferredBufferWrite.slh@>
|
<@include DeferredBufferWrite.slh@>
|
||||||
|
|
||||||
<@include Fade.slh@>
|
<@include Fade.slh@>
|
||||||
|
|
|
@ -5,4 +5,4 @@ include_hifi_library_headers(fbx)
|
||||||
include_hifi_library_headers(gpu)
|
include_hifi_library_headers(gpu)
|
||||||
include_hifi_library_headers(image)
|
include_hifi_library_headers(image)
|
||||||
include_hifi_library_headers(ktx)
|
include_hifi_library_headers(ktx)
|
||||||
link_hifi_libraries(shared networking octree avatars model model-networking)
|
link_hifi_libraries(shared networking octree avatars graphics model-networking)
|
|
@ -402,6 +402,7 @@ EntityPropertyFlags EntityItemProperties::getChangedProperties() const {
|
||||||
|
|
||||||
CHECK_PROPERTY_CHANGE(PROP_SHAPE, shape);
|
CHECK_PROPERTY_CHANGE(PROP_SHAPE, shape);
|
||||||
CHECK_PROPERTY_CHANGE(PROP_DPI, dpi);
|
CHECK_PROPERTY_CHANGE(PROP_DPI, dpi);
|
||||||
|
CHECK_PROPERTY_CHANGE(PROP_RELAY_PARENT_JOINTS, relayParentJoints);
|
||||||
|
|
||||||
changedProperties += _animation.getChangedProperties();
|
changedProperties += _animation.getChangedProperties();
|
||||||
changedProperties += _keyLight.getChangedProperties();
|
changedProperties += _keyLight.getChangedProperties();
|
||||||
|
@ -534,6 +535,7 @@ QScriptValue EntityItemProperties::copyToScriptValue(QScriptEngine* engine, bool
|
||||||
COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_JOINT_ROTATIONS, jointRotations);
|
COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_JOINT_ROTATIONS, jointRotations);
|
||||||
COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_JOINT_TRANSLATIONS_SET, jointTranslationsSet);
|
COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_JOINT_TRANSLATIONS_SET, jointTranslationsSet);
|
||||||
COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_JOINT_TRANSLATIONS, jointTranslations);
|
COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_JOINT_TRANSLATIONS, jointTranslations);
|
||||||
|
COPY_PROPERTY_TO_QSCRIPTVALUE(PROP_RELAY_PARENT_JOINTS, relayParentJoints);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_type == EntityTypes::Model || _type == EntityTypes::Zone || _type == EntityTypes::ParticleEffect) {
|
if (_type == EntityTypes::Model || _type == EntityTypes::Zone || _type == EntityTypes::ParticleEffect) {
|
||||||
|
@ -772,6 +774,7 @@ void EntityItemProperties::copyFromScriptValue(const QScriptValue& object, bool
|
||||||
COPY_PROPERTY_FROM_QSCRIPTVALUE(radiusSpread, float, setRadiusSpread);
|
COPY_PROPERTY_FROM_QSCRIPTVALUE(radiusSpread, float, setRadiusSpread);
|
||||||
COPY_PROPERTY_FROM_QSCRIPTVALUE(radiusStart, float, setRadiusStart);
|
COPY_PROPERTY_FROM_QSCRIPTVALUE(radiusStart, float, setRadiusStart);
|
||||||
COPY_PROPERTY_FROM_QSCRIPTVALUE(radiusFinish, float, setRadiusFinish);
|
COPY_PROPERTY_FROM_QSCRIPTVALUE(radiusFinish, float, setRadiusFinish);
|
||||||
|
COPY_PROPERTY_FROM_QSCRIPTVALUE(relayParentJoints, bool, setRelayParentJoints);
|
||||||
COPY_PROPERTY_FROM_QSCRIPTVALUE(materialURL, QString, setMaterialURL);
|
COPY_PROPERTY_FROM_QSCRIPTVALUE(materialURL, QString, setMaterialURL);
|
||||||
COPY_PROPERTY_FROM_QSCRIPTVALUE(materialMode, MaterialMode, setMaterialMode);
|
COPY_PROPERTY_FROM_QSCRIPTVALUE(materialMode, MaterialMode, setMaterialMode);
|
||||||
COPY_PROPERTY_FROM_QSCRIPTVALUE(blendFactor, float, setBlendFactor);
|
COPY_PROPERTY_FROM_QSCRIPTVALUE(blendFactor, float, setBlendFactor);
|
||||||
|
@ -1186,6 +1189,7 @@ void EntityItemProperties::entityPropertyFlagsFromScriptValue(const QScriptValue
|
||||||
ADD_PROPERTY_TO_MAP(PROP_JOINT_ROTATIONS, JointRotations, jointRotations, QVector<glm::quat>);
|
ADD_PROPERTY_TO_MAP(PROP_JOINT_ROTATIONS, JointRotations, jointRotations, QVector<glm::quat>);
|
||||||
ADD_PROPERTY_TO_MAP(PROP_JOINT_TRANSLATIONS_SET, JointTranslationsSet, jointTranslationsSet, QVector<bool>);
|
ADD_PROPERTY_TO_MAP(PROP_JOINT_TRANSLATIONS_SET, JointTranslationsSet, jointTranslationsSet, QVector<bool>);
|
||||||
ADD_PROPERTY_TO_MAP(PROP_JOINT_TRANSLATIONS, JointTranslations, jointTranslations, QVector<glm::vec3>);
|
ADD_PROPERTY_TO_MAP(PROP_JOINT_TRANSLATIONS, JointTranslations, jointTranslations, QVector<glm::vec3>);
|
||||||
|
ADD_PROPERTY_TO_MAP(PROP_RELAY_PARENT_JOINTS, RelayParentJoints, relayParentJoints, bool);
|
||||||
|
|
||||||
ADD_PROPERTY_TO_MAP(PROP_SHAPE, Shape, shape, QString);
|
ADD_PROPERTY_TO_MAP(PROP_SHAPE, Shape, shape, QString);
|
||||||
|
|
||||||
|
@ -1409,6 +1413,7 @@ OctreeElement::AppendState EntityItemProperties::encodeEntityEditPacket(PacketTy
|
||||||
APPEND_ENTITY_PROPERTY(PROP_JOINT_ROTATIONS, properties.getJointRotations());
|
APPEND_ENTITY_PROPERTY(PROP_JOINT_ROTATIONS, properties.getJointRotations());
|
||||||
APPEND_ENTITY_PROPERTY(PROP_JOINT_TRANSLATIONS_SET, properties.getJointTranslationsSet());
|
APPEND_ENTITY_PROPERTY(PROP_JOINT_TRANSLATIONS_SET, properties.getJointTranslationsSet());
|
||||||
APPEND_ENTITY_PROPERTY(PROP_JOINT_TRANSLATIONS, properties.getJointTranslations());
|
APPEND_ENTITY_PROPERTY(PROP_JOINT_TRANSLATIONS, properties.getJointTranslations());
|
||||||
|
APPEND_ENTITY_PROPERTY(PROP_RELAY_PARENT_JOINTS, properties.getRelayParentJoints());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (properties.getType() == EntityTypes::Light) {
|
if (properties.getType() == EntityTypes::Light) {
|
||||||
|
@ -1778,6 +1783,7 @@ bool EntityItemProperties::decodeEntityEditPacket(const unsigned char* data, int
|
||||||
READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_JOINT_ROTATIONS, QVector<glm::quat>, setJointRotations);
|
READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_JOINT_ROTATIONS, QVector<glm::quat>, setJointRotations);
|
||||||
READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_JOINT_TRANSLATIONS_SET, QVector<bool>, setJointTranslationsSet);
|
READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_JOINT_TRANSLATIONS_SET, QVector<bool>, setJointTranslationsSet);
|
||||||
READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_JOINT_TRANSLATIONS, QVector<glm::vec3>, setJointTranslations);
|
READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_JOINT_TRANSLATIONS, QVector<glm::vec3>, setJointTranslations);
|
||||||
|
READ_ENTITY_PROPERTY_TO_PROPERTIES(PROP_RELAY_PARENT_JOINTS, bool, setRelayParentJoints);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (properties.getType() == EntityTypes::Light) {
|
if (properties.getType() == EntityTypes::Light) {
|
||||||
|
@ -2132,6 +2138,7 @@ void EntityItemProperties::markAllChanged() {
|
||||||
_owningAvatarIDChanged = true;
|
_owningAvatarIDChanged = true;
|
||||||
|
|
||||||
_dpiChanged = true;
|
_dpiChanged = true;
|
||||||
|
_relayParentJointsChanged = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// The minimum bounding box for the entity.
|
// The minimum bounding box for the entity.
|
||||||
|
@ -2498,6 +2505,9 @@ QList<QString> EntityItemProperties::listChangedProperties() {
|
||||||
if (jointTranslationsChanged()) {
|
if (jointTranslationsChanged()) {
|
||||||
out += "jointTranslations";
|
out += "jointTranslations";
|
||||||
}
|
}
|
||||||
|
if (relayParentJointsChanged()) {
|
||||||
|
out += "relayParentJoints";
|
||||||
|
}
|
||||||
if (queryAACubeChanged()) {
|
if (queryAACubeChanged()) {
|
||||||
out += "queryAACube";
|
out += "queryAACube";
|
||||||
}
|
}
|
||||||
|
|
|
@ -266,6 +266,7 @@ public:
|
||||||
DEFINE_PROPERTY_REF(PROP_LAST_EDITED_BY, LastEditedBy, lastEditedBy, QUuid, ENTITY_ITEM_DEFAULT_LAST_EDITED_BY);
|
DEFINE_PROPERTY_REF(PROP_LAST_EDITED_BY, LastEditedBy, lastEditedBy, QUuid, ENTITY_ITEM_DEFAULT_LAST_EDITED_BY);
|
||||||
|
|
||||||
DEFINE_PROPERTY_REF(PROP_SERVER_SCRIPTS, ServerScripts, serverScripts, QString, ENTITY_ITEM_DEFAULT_SERVER_SCRIPTS);
|
DEFINE_PROPERTY_REF(PROP_SERVER_SCRIPTS, ServerScripts, serverScripts, QString, ENTITY_ITEM_DEFAULT_SERVER_SCRIPTS);
|
||||||
|
DEFINE_PROPERTY(PROP_RELAY_PARENT_JOINTS, RelayParentJoints, relayParentJoints, bool, ENTITY_ITEM_DEFAULT_RELAY_PARENT_JOINTS);
|
||||||
|
|
||||||
static QString getComponentModeString(uint32_t mode);
|
static QString getComponentModeString(uint32_t mode);
|
||||||
static QString getComponentModeAsString(uint32_t mode);
|
static QString getComponentModeAsString(uint32_t mode);
|
||||||
|
|
|
@ -92,4 +92,6 @@ const uint16_t ENTITY_ITEM_DEFAULT_DPI = 30;
|
||||||
|
|
||||||
const QUuid ENTITY_ITEM_DEFAULT_LAST_EDITED_BY = QUuid();
|
const QUuid ENTITY_ITEM_DEFAULT_LAST_EDITED_BY = QUuid();
|
||||||
|
|
||||||
|
const bool ENTITY_ITEM_DEFAULT_RELAY_PARENT_JOINTS = false;
|
||||||
|
|
||||||
#endif // hifi_EntityItemPropertiesDefaults_h
|
#endif // hifi_EntityItemPropertiesDefaults_h
|
||||||
|
|
|
@ -40,6 +40,7 @@ enum EntityPropertyList {
|
||||||
PROP_ANIMATION_FRAME_INDEX,
|
PROP_ANIMATION_FRAME_INDEX,
|
||||||
PROP_ANIMATION_PLAYING,
|
PROP_ANIMATION_PLAYING,
|
||||||
PROP_ANIMATION_ALLOW_TRANSLATION,
|
PROP_ANIMATION_ALLOW_TRANSLATION,
|
||||||
|
PROP_RELAY_PARENT_JOINTS,
|
||||||
|
|
||||||
// these properties are supported by the EntityItem base class
|
// these properties are supported by the EntityItem base class
|
||||||
PROP_REGISTRATION_POINT,
|
PROP_REGISTRATION_POINT,
|
||||||
|
|
|
@ -2283,30 +2283,35 @@ bool EntityTree::readFromMap(QVariantMap& map) {
|
||||||
properties.setOwningAvatarID(myNodeID);
|
properties.setOwningAvatarID(myNodeID);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fix for older content not containing these fields in the zones
|
// Fix for older content not containing mode fields in the zones
|
||||||
if (needsConversion && (properties.getType() == EntityTypes::EntityType::Zone)) {
|
if (needsConversion && (properties.getType() == EntityTypes::EntityType::Zone)) {
|
||||||
|
// The legacy version had no keylight mode - this is set to on
|
||||||
|
properties.setKeyLightMode(COMPONENT_MODE_ENABLED);
|
||||||
|
|
||||||
// The ambient URL has been moved from "keyLight" to "ambientLight"
|
// The ambient URL has been moved from "keyLight" to "ambientLight"
|
||||||
if (entityMap.contains("keyLight")) {
|
if (entityMap.contains("keyLight")) {
|
||||||
QVariantMap keyLightObject = entityMap["keyLight"].toMap();
|
QVariantMap keyLightObject = entityMap["keyLight"].toMap();
|
||||||
properties.getAmbientLight().setAmbientURL(keyLightObject["ambientURL"].toString());
|
properties.getAmbientLight().setAmbientURL(keyLightObject["ambientURL"].toString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Copy the skybox URL if the ambient URL is empty, as this is the legacy behaviour
|
||||||
|
// Use skybox value only if it is not empty, else set ambientMode to inherit (to use default URL)
|
||||||
|
properties.setAmbientLightMode(COMPONENT_MODE_ENABLED);
|
||||||
|
if (properties.getAmbientLight().getAmbientURL() == "") {
|
||||||
|
if (properties.getSkybox().getURL() != "") {
|
||||||
|
properties.getAmbientLight().setAmbientURL(properties.getSkybox().getURL());
|
||||||
|
} else {
|
||||||
|
properties.setAmbientLightMode(COMPONENT_MODE_INHERIT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// The background should be enabled if the mode is skybox
|
// The background should be enabled if the mode is skybox
|
||||||
// Note that if the values are default then they are not stored in the JSON file
|
// Note that if the values are default then they are not stored in the JSON file
|
||||||
if (entityMap.contains("backgroundMode") && (entityMap["backgroundMode"].toString() == "skybox")) {
|
if (entityMap.contains("backgroundMode") && (entityMap["backgroundMode"].toString() == "skybox")) {
|
||||||
properties.setSkyboxMode(COMPONENT_MODE_ENABLED);
|
properties.setSkyboxMode(COMPONENT_MODE_ENABLED);
|
||||||
|
} else {
|
||||||
// Copy the skybox URL if the ambient URL is empty, as this is the legacy behaviour
|
|
||||||
if (properties.getAmbientLight().getAmbientURL() == "") {
|
|
||||||
properties.getAmbientLight().setAmbientURL(properties.getSkybox().getURL());
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
properties.setSkyboxMode(COMPONENT_MODE_INHERIT);
|
properties.setSkyboxMode(COMPONENT_MODE_INHERIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
// The legacy version had no keylight/ambient modes - these are always on
|
|
||||||
properties.setKeyLightMode(COMPONENT_MODE_ENABLED);
|
|
||||||
properties.setAmbientLightMode(COMPONENT_MODE_ENABLED);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EntityItemPointer entity = addEntity(entityItemID, properties);
|
EntityItemPointer entity = addEntity(entityItemID, properties);
|
||||||
|
|
|
@ -62,7 +62,7 @@ EntityItemProperties ModelEntityItem::getProperties(EntityPropertyFlags desiredP
|
||||||
COPY_ENTITY_PROPERTY_TO_PROPERTIES(jointRotations, getJointRotations);
|
COPY_ENTITY_PROPERTY_TO_PROPERTIES(jointRotations, getJointRotations);
|
||||||
COPY_ENTITY_PROPERTY_TO_PROPERTIES(jointTranslationsSet, getJointTranslationsSet);
|
COPY_ENTITY_PROPERTY_TO_PROPERTIES(jointTranslationsSet, getJointTranslationsSet);
|
||||||
COPY_ENTITY_PROPERTY_TO_PROPERTIES(jointTranslations, getJointTranslations);
|
COPY_ENTITY_PROPERTY_TO_PROPERTIES(jointTranslations, getJointTranslations);
|
||||||
|
COPY_ENTITY_PROPERTY_TO_PROPERTIES(relayParentJoints, getRelayParentJoints);
|
||||||
_animationProperties.getProperties(properties);
|
_animationProperties.getProperties(properties);
|
||||||
return properties;
|
return properties;
|
||||||
}
|
}
|
||||||
|
@ -80,6 +80,7 @@ bool ModelEntityItem::setProperties(const EntityItemProperties& properties) {
|
||||||
SET_ENTITY_PROPERTY_FROM_PROPERTIES(jointRotations, setJointRotations);
|
SET_ENTITY_PROPERTY_FROM_PROPERTIES(jointRotations, setJointRotations);
|
||||||
SET_ENTITY_PROPERTY_FROM_PROPERTIES(jointTranslationsSet, setJointTranslationsSet);
|
SET_ENTITY_PROPERTY_FROM_PROPERTIES(jointTranslationsSet, setJointTranslationsSet);
|
||||||
SET_ENTITY_PROPERTY_FROM_PROPERTIES(jointTranslations, setJointTranslations);
|
SET_ENTITY_PROPERTY_FROM_PROPERTIES(jointTranslations, setJointTranslations);
|
||||||
|
SET_ENTITY_PROPERTY_FROM_PROPERTIES(relayParentJoints, setRelayParentJoints);
|
||||||
|
|
||||||
bool somethingChangedInAnimations = _animationProperties.setProperties(properties);
|
bool somethingChangedInAnimations = _animationProperties.setProperties(properties);
|
||||||
|
|
||||||
|
@ -115,6 +116,7 @@ int ModelEntityItem::readEntitySubclassDataFromBuffer(const unsigned char* data,
|
||||||
READ_ENTITY_PROPERTY(PROP_MODEL_URL, QString, setModelURL);
|
READ_ENTITY_PROPERTY(PROP_MODEL_URL, QString, setModelURL);
|
||||||
READ_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, QString, setCompoundShapeURL);
|
READ_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, QString, setCompoundShapeURL);
|
||||||
READ_ENTITY_PROPERTY(PROP_TEXTURES, QString, setTextures);
|
READ_ENTITY_PROPERTY(PROP_TEXTURES, QString, setTextures);
|
||||||
|
READ_ENTITY_PROPERTY(PROP_RELAY_PARENT_JOINTS, bool, setRelayParentJoints);
|
||||||
|
|
||||||
int bytesFromAnimation;
|
int bytesFromAnimation;
|
||||||
withWriteLock([&] {
|
withWriteLock([&] {
|
||||||
|
@ -155,6 +157,7 @@ EntityPropertyFlags ModelEntityItem::getEntityProperties(EncodeBitstreamParams&
|
||||||
requestedProperties += PROP_JOINT_ROTATIONS;
|
requestedProperties += PROP_JOINT_ROTATIONS;
|
||||||
requestedProperties += PROP_JOINT_TRANSLATIONS_SET;
|
requestedProperties += PROP_JOINT_TRANSLATIONS_SET;
|
||||||
requestedProperties += PROP_JOINT_TRANSLATIONS;
|
requestedProperties += PROP_JOINT_TRANSLATIONS;
|
||||||
|
requestedProperties += PROP_RELAY_PARENT_JOINTS;
|
||||||
|
|
||||||
return requestedProperties;
|
return requestedProperties;
|
||||||
}
|
}
|
||||||
|
@ -173,6 +176,7 @@ void ModelEntityItem::appendSubclassData(OctreePacketData* packetData, EncodeBit
|
||||||
APPEND_ENTITY_PROPERTY(PROP_MODEL_URL, getModelURL());
|
APPEND_ENTITY_PROPERTY(PROP_MODEL_URL, getModelURL());
|
||||||
APPEND_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, getCompoundShapeURL());
|
APPEND_ENTITY_PROPERTY(PROP_COMPOUND_SHAPE_URL, getCompoundShapeURL());
|
||||||
APPEND_ENTITY_PROPERTY(PROP_TEXTURES, getTextures());
|
APPEND_ENTITY_PROPERTY(PROP_TEXTURES, getTextures());
|
||||||
|
APPEND_ENTITY_PROPERTY(PROP_RELAY_PARENT_JOINTS, getRelayParentJoints());
|
||||||
|
|
||||||
withReadLock([&] {
|
withReadLock([&] {
|
||||||
_animationProperties.appendSubclassData(packetData, params, entityTreeElementExtraEncodeData, requestedProperties,
|
_animationProperties.appendSubclassData(packetData, params, entityTreeElementExtraEncodeData, requestedProperties,
|
||||||
|
@ -267,9 +271,9 @@ void ModelEntityItem::updateFrameCount() {
|
||||||
if (!getAnimationHold() && getAnimationIsPlaying()) {
|
if (!getAnimationHold() && getAnimationIsPlaying()) {
|
||||||
float deltaTime = (float)interval / (float)USECS_PER_SECOND;
|
float deltaTime = (float)interval / (float)USECS_PER_SECOND;
|
||||||
_currentFrame += (deltaTime * getAnimationFPS());
|
_currentFrame += (deltaTime * getAnimationFPS());
|
||||||
if (_currentFrame > getAnimationLastFrame()) {
|
if (_currentFrame > getAnimationLastFrame() + 1) {
|
||||||
if (getAnimationLoop()) {
|
if (getAnimationLoop() && getAnimationFirstFrame() != getAnimationLastFrame()) {
|
||||||
_currentFrame = getAnimationFirstFrame() + (int)(glm::floor(_currentFrame - getAnimationFirstFrame())) % (updatedFrameCount - 1);
|
_currentFrame = getAnimationFirstFrame() + (int)(_currentFrame - getAnimationFirstFrame()) % updatedFrameCount;
|
||||||
} else {
|
} else {
|
||||||
_currentFrame = getAnimationLastFrame();
|
_currentFrame = getAnimationLastFrame();
|
||||||
}
|
}
|
||||||
|
@ -586,6 +590,18 @@ QString ModelEntityItem::getModelURL() const {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void ModelEntityItem::setRelayParentJoints(bool relayJoints) {
|
||||||
|
withWriteLock([&] {
|
||||||
|
_relayParentJoints = relayJoints;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
bool ModelEntityItem::getRelayParentJoints() const {
|
||||||
|
return resultWithReadLock<bool>([&] {
|
||||||
|
return _relayParentJoints;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
QString ModelEntityItem::getCompoundShapeURL() const {
|
QString ModelEntityItem::getCompoundShapeURL() const {
|
||||||
return _compoundShapeURL.get();
|
return _compoundShapeURL.get();
|
||||||
}
|
}
|
||||||
|
|
|
@ -99,6 +99,9 @@ public:
|
||||||
void setAnimationHold(bool hold);
|
void setAnimationHold(bool hold);
|
||||||
bool getAnimationHold() const;
|
bool getAnimationHold() const;
|
||||||
|
|
||||||
|
void setRelayParentJoints(bool relayJoints);
|
||||||
|
bool getRelayParentJoints() const;
|
||||||
|
|
||||||
void setAnimationFirstFrame(float firstFrame);
|
void setAnimationFirstFrame(float firstFrame);
|
||||||
float getAnimationFirstFrame() const;
|
float getAnimationFirstFrame() const;
|
||||||
|
|
||||||
|
@ -157,6 +160,7 @@ protected:
|
||||||
|
|
||||||
rgbColor _color;
|
rgbColor _color;
|
||||||
QString _modelURL;
|
QString _modelURL;
|
||||||
|
bool _relayParentJoints;
|
||||||
|
|
||||||
ThreadSafeValueCache<QString> _compoundShapeURL;
|
ThreadSafeValueCache<QString> _compoundShapeURL;
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
set(TARGET_NAME fbx)
|
set(TARGET_NAME fbx)
|
||||||
setup_hifi_library()
|
setup_hifi_library()
|
||||||
|
|
||||||
link_hifi_libraries(shared model networking image)
|
link_hifi_libraries(shared graphics networking image)
|
||||||
include_hifi_library_headers(gpu image)
|
include_hifi_library_headers(gpu image)
|
||||||
|
|
||||||
target_draco()
|
target_draco()
|
||||||
|
|
|
@ -25,8 +25,8 @@
|
||||||
#include <Extents.h>
|
#include <Extents.h>
|
||||||
#include <Transform.h>
|
#include <Transform.h>
|
||||||
|
|
||||||
#include <model/Geometry.h>
|
#include <graphics/Geometry.h>
|
||||||
#include <model/Material.h>
|
#include <graphics/Material.h>
|
||||||
|
|
||||||
static const QByteArray FBX_BINARY_PROLOG = "Kaydara FBX Binary ";
|
static const QByteArray FBX_BINARY_PROLOG = "Kaydara FBX Binary ";
|
||||||
static const int FBX_HEADER_BYTES_BEFORE_VERSION = 23;
|
static const int FBX_HEADER_BYTES_BEFORE_VERSION = 23;
|
||||||
|
@ -116,6 +116,7 @@ public:
|
||||||
|
|
||||||
int jointIndex;
|
int jointIndex;
|
||||||
glm::mat4 inverseBindMatrix;
|
glm::mat4 inverseBindMatrix;
|
||||||
|
Transform inverseBindTransform;
|
||||||
};
|
};
|
||||||
|
|
||||||
const int MAX_NUM_PIXELS_FOR_FBX_TEXTURE = 2048 * 2048;
|
const int MAX_NUM_PIXELS_FOR_FBX_TEXTURE = 2048 * 2048;
|
||||||
|
@ -182,7 +183,7 @@ public:
|
||||||
QString materialID;
|
QString materialID;
|
||||||
QString name;
|
QString name;
|
||||||
QString shadingModel;
|
QString shadingModel;
|
||||||
model::MaterialPointer _material;
|
graphics::MaterialPointer _material;
|
||||||
|
|
||||||
FBXTexture normalTexture;
|
FBXTexture normalTexture;
|
||||||
FBXTexture albedoTexture;
|
FBXTexture albedoTexture;
|
||||||
|
@ -225,7 +226,7 @@ public:
|
||||||
QVector<glm::vec2> texCoords;
|
QVector<glm::vec2> texCoords;
|
||||||
QVector<glm::vec2> texCoords1;
|
QVector<glm::vec2> texCoords1;
|
||||||
QVector<uint16_t> clusterIndices;
|
QVector<uint16_t> clusterIndices;
|
||||||
QVector<uint8_t> clusterWeights;
|
QVector<uint16_t> clusterWeights;
|
||||||
QVector<int32_t> originalIndices;
|
QVector<int32_t> originalIndices;
|
||||||
|
|
||||||
QVector<FBXCluster> clusters;
|
QVector<FBXCluster> clusters;
|
||||||
|
@ -237,7 +238,7 @@ public:
|
||||||
|
|
||||||
unsigned int meshIndex; // the order the meshes appeared in the object file
|
unsigned int meshIndex; // the order the meshes appeared in the object file
|
||||||
|
|
||||||
model::MeshPointer _mesh;
|
graphics::MeshPointer _mesh;
|
||||||
bool wasCompressed { false };
|
bool wasCompressed { false };
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -72,7 +72,7 @@ Extents FBXGeometry::getUnscaledMeshExtents() const {
|
||||||
return scaledExtents;
|
return scaledExtents;
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Move to model::Mesh when Sam's ready
|
// TODO: Move to graphics::Mesh when Sam's ready
|
||||||
bool FBXGeometry::convexHullContains(const glm::vec3& point) const {
|
bool FBXGeometry::convexHullContains(const glm::vec3& point) const {
|
||||||
if (!getUnscaledMeshExtents().containsPoint(point)) {
|
if (!getUnscaledMeshExtents().containsPoint(point)) {
|
||||||
return false;
|
return false;
|
||||||
|
@ -148,6 +148,59 @@ glm::vec3 parseVec3(const QString& string) {
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum RotationOrder {
|
||||||
|
OrderXYZ = 0,
|
||||||
|
OrderXZY,
|
||||||
|
OrderYZX,
|
||||||
|
OrderYXZ,
|
||||||
|
OrderZXY,
|
||||||
|
OrderZYX,
|
||||||
|
OrderSphericXYZ
|
||||||
|
};
|
||||||
|
|
||||||
|
bool haveReportedUnhandledRotationOrder = false; // Report error only once per FBX file.
|
||||||
|
|
||||||
|
glm::vec3 convertRotationToXYZ(int rotationOrder, const glm::vec3& rotation) {
|
||||||
|
// Convert rotation with given rotation order to have order XYZ.
|
||||||
|
if (rotationOrder == OrderXYZ) {
|
||||||
|
return rotation;
|
||||||
|
}
|
||||||
|
|
||||||
|
glm::quat xyzRotation;
|
||||||
|
|
||||||
|
switch (rotationOrder) {
|
||||||
|
case OrderXZY:
|
||||||
|
xyzRotation = glm::quat(glm::radians(glm::vec3(0, rotation.y, 0)))
|
||||||
|
* (glm::quat(glm::radians(glm::vec3(0, 0, rotation.z))) * glm::quat(glm::radians(glm::vec3(rotation.x, 0, 0))));
|
||||||
|
break;
|
||||||
|
case OrderYZX:
|
||||||
|
xyzRotation = glm::quat(glm::radians(glm::vec3(rotation.x, 0, 0)))
|
||||||
|
* (glm::quat(glm::radians(glm::vec3(0, 0, rotation.z))) * glm::quat(glm::radians(glm::vec3(0, rotation.y, 0))));
|
||||||
|
break;
|
||||||
|
case OrderYXZ:
|
||||||
|
xyzRotation = glm::quat(glm::radians(glm::vec3(0, 0, rotation.z)))
|
||||||
|
* (glm::quat(glm::radians(glm::vec3(rotation.x, 0, 0))) * glm::quat(glm::radians(glm::vec3(0, rotation.y, 0))));
|
||||||
|
break;
|
||||||
|
case OrderZXY:
|
||||||
|
xyzRotation = glm::quat(glm::radians(glm::vec3(0, rotation.y, 0)))
|
||||||
|
* (glm::quat(glm::radians(glm::vec3(rotation.x, 0, 0))) * glm::quat(glm::radians(glm::vec3(0, 0, rotation.z))));
|
||||||
|
break;
|
||||||
|
case OrderZYX:
|
||||||
|
xyzRotation = glm::quat(glm::radians(glm::vec3(rotation.x, 0, 0)))
|
||||||
|
* (glm::quat(glm::radians(glm::vec3(0, rotation.y, 0))) * glm::quat(glm::radians(glm::vec3(0, 0, rotation.z))));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
// FIXME: Handle OrderSphericXYZ.
|
||||||
|
if (!haveReportedUnhandledRotationOrder) {
|
||||||
|
qCDebug(modelformat) << "ERROR: Unhandled rotation order in FBX file:" << rotationOrder;
|
||||||
|
haveReportedUnhandledRotationOrder = true;
|
||||||
|
}
|
||||||
|
return rotation;
|
||||||
|
}
|
||||||
|
|
||||||
|
return glm::degrees(safeEulerAngles(xyzRotation));
|
||||||
|
}
|
||||||
|
|
||||||
QString processID(const QString& id) {
|
QString processID(const QString& id) {
|
||||||
// Blender (at least) prepends a type to the ID, so strip it out
|
// Blender (at least) prepends a type to the ID, so strip it out
|
||||||
return id.mid(id.lastIndexOf(':') + 1);
|
return id.mid(id.lastIndexOf(':') + 1);
|
||||||
|
@ -630,6 +683,7 @@ FBXGeometry* FBXReader::extractFBXGeometry(const QVariantHash& mapping, const QS
|
||||||
glm::vec3 ambientColor;
|
glm::vec3 ambientColor;
|
||||||
QString hifiGlobalNodeID;
|
QString hifiGlobalNodeID;
|
||||||
unsigned int meshIndex = 0;
|
unsigned int meshIndex = 0;
|
||||||
|
haveReportedUnhandledRotationOrder = false;
|
||||||
foreach (const FBXNode& child, node.children) {
|
foreach (const FBXNode& child, node.children) {
|
||||||
|
|
||||||
if (child.name == "FBXHeaderExtension") {
|
if (child.name == "FBXHeaderExtension") {
|
||||||
|
@ -731,6 +785,7 @@ FBXGeometry* FBXReader::extractFBXGeometry(const QVariantHash& mapping, const QS
|
||||||
glm::vec3 translation;
|
glm::vec3 translation;
|
||||||
// NOTE: the euler angles as supplied by the FBX file are in degrees
|
// NOTE: the euler angles as supplied by the FBX file are in degrees
|
||||||
glm::vec3 rotationOffset;
|
glm::vec3 rotationOffset;
|
||||||
|
int rotationOrder = OrderXYZ; // Default rotation order set in "Definitions" node is assumed to be XYZ.
|
||||||
glm::vec3 preRotation, rotation, postRotation;
|
glm::vec3 preRotation, rotation, postRotation;
|
||||||
glm::vec3 scale = glm::vec3(1.0f, 1.0f, 1.0f);
|
glm::vec3 scale = glm::vec3(1.0f, 1.0f, 1.0f);
|
||||||
glm::vec3 scalePivot, rotationPivot, scaleOffset;
|
glm::vec3 scalePivot, rotationPivot, scaleOffset;
|
||||||
|
@ -764,6 +819,7 @@ FBXGeometry* FBXReader::extractFBXGeometry(const QVariantHash& mapping, const QS
|
||||||
index = 4;
|
index = 4;
|
||||||
}
|
}
|
||||||
if (properties) {
|
if (properties) {
|
||||||
|
static const QVariant ROTATION_ORDER = QByteArray("RotationOrder");
|
||||||
static const QVariant GEOMETRIC_TRANSLATION = QByteArray("GeometricTranslation");
|
static const QVariant GEOMETRIC_TRANSLATION = QByteArray("GeometricTranslation");
|
||||||
static const QVariant GEOMETRIC_ROTATION = QByteArray("GeometricRotation");
|
static const QVariant GEOMETRIC_ROTATION = QByteArray("GeometricRotation");
|
||||||
static const QVariant GEOMETRIC_SCALING = QByteArray("GeometricScaling");
|
static const QVariant GEOMETRIC_SCALING = QByteArray("GeometricScaling");
|
||||||
|
@ -790,6 +846,9 @@ FBXGeometry* FBXReader::extractFBXGeometry(const QVariantHash& mapping, const QS
|
||||||
if (childProperty == LCL_TRANSLATION) {
|
if (childProperty == LCL_TRANSLATION) {
|
||||||
translation = getVec3(property.properties, index);
|
translation = getVec3(property.properties, index);
|
||||||
|
|
||||||
|
} else if (childProperty == ROTATION_ORDER) {
|
||||||
|
rotationOrder = property.properties.at(index).toInt();
|
||||||
|
|
||||||
} else if (childProperty == ROTATION_OFFSET) {
|
} else if (childProperty == ROTATION_OFFSET) {
|
||||||
rotationOffset = getVec3(property.properties, index);
|
rotationOffset = getVec3(property.properties, index);
|
||||||
|
|
||||||
|
@ -797,13 +856,13 @@ FBXGeometry* FBXReader::extractFBXGeometry(const QVariantHash& mapping, const QS
|
||||||
rotationPivot = getVec3(property.properties, index);
|
rotationPivot = getVec3(property.properties, index);
|
||||||
|
|
||||||
} else if (childProperty == PRE_ROTATION) {
|
} else if (childProperty == PRE_ROTATION) {
|
||||||
preRotation = getVec3(property.properties, index);
|
preRotation = convertRotationToXYZ(rotationOrder, getVec3(property.properties, index));
|
||||||
|
|
||||||
} else if (childProperty == LCL_ROTATION) {
|
} else if (childProperty == LCL_ROTATION) {
|
||||||
rotation = getVec3(property.properties, index);
|
rotation = convertRotationToXYZ(rotationOrder, getVec3(property.properties, index));
|
||||||
|
|
||||||
} else if (childProperty == POST_ROTATION) {
|
} else if (childProperty == POST_ROTATION) {
|
||||||
postRotation = getVec3(property.properties, index);
|
postRotation = convertRotationToXYZ(rotationOrder, getVec3(property.properties, index));
|
||||||
|
|
||||||
} else if (childProperty == SCALING_PIVOT) {
|
} else if (childProperty == SCALING_PIVOT) {
|
||||||
scalePivot = getVec3(property.properties, index);
|
scalePivot = getVec3(property.properties, index);
|
||||||
|
@ -1675,6 +1734,7 @@ FBXGeometry* FBXReader::extractFBXGeometry(const QVariantHash& mapping, const QS
|
||||||
fbxCluster.jointIndex = 0;
|
fbxCluster.jointIndex = 0;
|
||||||
}
|
}
|
||||||
fbxCluster.inverseBindMatrix = glm::inverse(cluster.transformLink) * modelTransform;
|
fbxCluster.inverseBindMatrix = glm::inverse(cluster.transformLink) * modelTransform;
|
||||||
|
fbxCluster.inverseBindTransform = Transform(fbxCluster.inverseBindMatrix);
|
||||||
extracted.mesh.clusters.append(fbxCluster);
|
extracted.mesh.clusters.append(fbxCluster);
|
||||||
|
|
||||||
// override the bind rotation with the transform link
|
// override the bind rotation with the transform link
|
||||||
|
@ -1789,9 +1849,9 @@ FBXGeometry* FBXReader::extractFBXGeometry(const QVariantHash& mapping, const QS
|
||||||
}
|
}
|
||||||
if (totalWeight > 0.0f) {
|
if (totalWeight > 0.0f) {
|
||||||
const float ALMOST_HALF = 0.499f;
|
const float ALMOST_HALF = 0.499f;
|
||||||
float weightScalingFactor = (float)(UINT8_MAX) / totalWeight;
|
float weightScalingFactor = (float)(UINT16_MAX) / totalWeight;
|
||||||
for (int k = j; k < j + WEIGHTS_PER_VERTEX; ++k) {
|
for (int k = j; k < j + WEIGHTS_PER_VERTEX; ++k) {
|
||||||
extracted.mesh.clusterWeights[k] = (uint8_t)(weightScalingFactor * weightAccumulators[k] + ALMOST_HALF);
|
extracted.mesh.clusterWeights[k] = (uint16_t)(weightScalingFactor * weightAccumulators[k] + ALMOST_HALF);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,8 +27,8 @@
|
||||||
#include <Extents.h>
|
#include <Extents.h>
|
||||||
#include <Transform.h>
|
#include <Transform.h>
|
||||||
|
|
||||||
#include <model/Geometry.h>
|
#include <graphics/Geometry.h>
|
||||||
#include <model/Material.h>
|
#include <graphics/Material.h>
|
||||||
|
|
||||||
class QIODevice;
|
class QIODevice;
|
||||||
class FBXNode;
|
class FBXNode;
|
||||||
|
|
|
@ -279,7 +279,7 @@ void FBXReader::consolidateFBXMaterials(const QVariantHash& mapping) {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Finally create the true material representation
|
// Finally create the true material representation
|
||||||
material._material = std::make_shared<model::Material>();
|
material._material = std::make_shared<graphics::Material>();
|
||||||
|
|
||||||
// Emissive color is the mix of emissiveColor with emissiveFactor
|
// Emissive color is the mix of emissiveColor with emissiveFactor
|
||||||
auto emissive = material.emissiveColor * (isMaterialLambert ? 1.0f : material.emissiveFactor); // In lambert there is not emissiveFactor
|
auto emissive = material.emissiveColor * (isMaterialLambert ? 1.0f : material.emissiveFactor); // In lambert there is not emissiveFactor
|
||||||
|
@ -293,7 +293,7 @@ void FBXReader::consolidateFBXMaterials(const QVariantHash& mapping) {
|
||||||
material._material->setRoughness(material.roughness);
|
material._material->setRoughness(material.roughness);
|
||||||
material._material->setMetallic(material.metallic);
|
material._material->setMetallic(material.metallic);
|
||||||
} else {
|
} else {
|
||||||
material._material->setRoughness(model::Material::shininessToRoughness(material.shininess));
|
material._material->setRoughness(graphics::Material::shininessToRoughness(material.shininess));
|
||||||
float metallic = std::max(material.specularColor.x, std::max(material.specularColor.y, material.specularColor.z));
|
float metallic = std::max(material.specularColor.x, std::max(material.specularColor.y, material.specularColor.z));
|
||||||
material._material->setMetallic(metallic);
|
material._material->setMetallic(metallic);
|
||||||
|
|
||||||
|
|
|
@ -584,7 +584,7 @@ void FBXReader::buildModelMesh(FBXMesh& extractedMesh, const QString& url) {
|
||||||
}
|
}
|
||||||
|
|
||||||
FBXMesh& fbxMesh = extractedMesh;
|
FBXMesh& fbxMesh = extractedMesh;
|
||||||
model::MeshPointer mesh(new model::Mesh());
|
graphics::MeshPointer mesh(new graphics::Mesh());
|
||||||
|
|
||||||
// Grab the vertices in a buffer
|
// Grab the vertices in a buffer
|
||||||
auto vb = std::make_shared<gpu::Buffer>();
|
auto vb = std::make_shared<gpu::Buffer>();
|
||||||
|
@ -624,7 +624,8 @@ void FBXReader::buildModelMesh(FBXMesh& extractedMesh, const QString& url) {
|
||||||
// we need 16 bits instead of just 8 for clusterIndices
|
// we need 16 bits instead of just 8 for clusterIndices
|
||||||
clusterIndicesSize *= 2;
|
clusterIndicesSize *= 2;
|
||||||
}
|
}
|
||||||
const int clusterWeightsSize = fbxMesh.clusterWeights.size() * sizeof(uint8_t);
|
|
||||||
|
const int clusterWeightsSize = fbxMesh.clusterWeights.size() * sizeof(uint16_t);
|
||||||
|
|
||||||
// Normals and tangents are interleaved
|
// Normals and tangents are interleaved
|
||||||
const int normalsOffset = 0;
|
const int normalsOffset = 0;
|
||||||
|
@ -720,46 +721,46 @@ void FBXReader::buildModelMesh(FBXMesh& extractedMesh, const QString& url) {
|
||||||
|
|
||||||
if (normalsSize) {
|
if (normalsSize) {
|
||||||
mesh->addAttribute(gpu::Stream::NORMAL,
|
mesh->addAttribute(gpu::Stream::NORMAL,
|
||||||
model::BufferView(attribBuffer, normalsOffset, normalsAndTangentsSize,
|
graphics::BufferView(attribBuffer, normalsOffset, normalsAndTangentsSize,
|
||||||
normalsAndTangentsStride, FBX_NORMAL_ELEMENT));
|
normalsAndTangentsStride, FBX_NORMAL_ELEMENT));
|
||||||
mesh->addAttribute(gpu::Stream::TANGENT,
|
mesh->addAttribute(gpu::Stream::TANGENT,
|
||||||
model::BufferView(attribBuffer, tangentsOffset, normalsAndTangentsSize,
|
graphics::BufferView(attribBuffer, tangentsOffset, normalsAndTangentsSize,
|
||||||
normalsAndTangentsStride, FBX_NORMAL_ELEMENT));
|
normalsAndTangentsStride, FBX_NORMAL_ELEMENT));
|
||||||
}
|
}
|
||||||
if (colorsSize) {
|
if (colorsSize) {
|
||||||
mesh->addAttribute(gpu::Stream::COLOR,
|
mesh->addAttribute(gpu::Stream::COLOR,
|
||||||
model::BufferView(attribBuffer, colorsOffset, colorsSize, FBX_COLOR_ELEMENT));
|
graphics::BufferView(attribBuffer, colorsOffset, colorsSize, FBX_COLOR_ELEMENT));
|
||||||
}
|
}
|
||||||
if (texCoordsSize) {
|
if (texCoordsSize) {
|
||||||
mesh->addAttribute(gpu::Stream::TEXCOORD,
|
mesh->addAttribute(gpu::Stream::TEXCOORD,
|
||||||
model::BufferView( attribBuffer, texCoordsOffset, texCoordsSize,
|
graphics::BufferView( attribBuffer, texCoordsOffset, texCoordsSize,
|
||||||
gpu::Element(gpu::VEC2, gpu::HALF, gpu::UV)));
|
gpu::Element(gpu::VEC2, gpu::HALF, gpu::UV)));
|
||||||
}
|
}
|
||||||
if (texCoords1Size) {
|
if (texCoords1Size) {
|
||||||
mesh->addAttribute( gpu::Stream::TEXCOORD1,
|
mesh->addAttribute( gpu::Stream::TEXCOORD1,
|
||||||
model::BufferView(attribBuffer, texCoords1Offset, texCoords1Size,
|
graphics::BufferView(attribBuffer, texCoords1Offset, texCoords1Size,
|
||||||
gpu::Element(gpu::VEC2, gpu::HALF, gpu::UV)));
|
gpu::Element(gpu::VEC2, gpu::HALF, gpu::UV)));
|
||||||
} else if (texCoordsSize) {
|
} else if (texCoordsSize) {
|
||||||
mesh->addAttribute(gpu::Stream::TEXCOORD1,
|
mesh->addAttribute(gpu::Stream::TEXCOORD1,
|
||||||
model::BufferView(attribBuffer, texCoordsOffset, texCoordsSize,
|
graphics::BufferView(attribBuffer, texCoordsOffset, texCoordsSize,
|
||||||
gpu::Element(gpu::VEC2, gpu::HALF, gpu::UV)));
|
gpu::Element(gpu::VEC2, gpu::HALF, gpu::UV)));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (clusterIndicesSize) {
|
if (clusterIndicesSize) {
|
||||||
if (fbxMesh.clusters.size() < UINT8_MAX) {
|
if (fbxMesh.clusters.size() < UINT8_MAX) {
|
||||||
mesh->addAttribute(gpu::Stream::SKIN_CLUSTER_INDEX,
|
mesh->addAttribute(gpu::Stream::SKIN_CLUSTER_INDEX,
|
||||||
model::BufferView(attribBuffer, clusterIndicesOffset, clusterIndicesSize,
|
graphics::BufferView(attribBuffer, clusterIndicesOffset, clusterIndicesSize,
|
||||||
gpu::Element(gpu::VEC4, gpu::UINT8, gpu::XYZW)));
|
gpu::Element(gpu::VEC4, gpu::UINT8, gpu::XYZW)));
|
||||||
} else {
|
} else {
|
||||||
mesh->addAttribute(gpu::Stream::SKIN_CLUSTER_INDEX,
|
mesh->addAttribute(gpu::Stream::SKIN_CLUSTER_INDEX,
|
||||||
model::BufferView(attribBuffer, clusterIndicesOffset, clusterIndicesSize,
|
graphics::BufferView(attribBuffer, clusterIndicesOffset, clusterIndicesSize,
|
||||||
gpu::Element(gpu::VEC4, gpu::UINT16, gpu::XYZW)));
|
gpu::Element(gpu::VEC4, gpu::UINT16, gpu::XYZW)));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (clusterWeightsSize) {
|
if (clusterWeightsSize) {
|
||||||
mesh->addAttribute(gpu::Stream::SKIN_CLUSTER_WEIGHT,
|
mesh->addAttribute(gpu::Stream::SKIN_CLUSTER_WEIGHT,
|
||||||
model::BufferView(attribBuffer, clusterWeightsOffset, clusterWeightsSize,
|
graphics::BufferView(attribBuffer, clusterWeightsOffset, clusterWeightsSize,
|
||||||
gpu::Element(gpu::VEC4, gpu::NUINT8, gpu::XYZW)));
|
gpu::Element(gpu::VEC4, gpu::NUINT16, gpu::XYZW)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -779,12 +780,12 @@ void FBXReader::buildModelMesh(FBXMesh& extractedMesh, const QString& url) {
|
||||||
int indexNum = 0;
|
int indexNum = 0;
|
||||||
int offset = 0;
|
int offset = 0;
|
||||||
|
|
||||||
std::vector< model::Mesh::Part > parts;
|
std::vector< graphics::Mesh::Part > parts;
|
||||||
if (extractedMesh.parts.size() > 1) {
|
if (extractedMesh.parts.size() > 1) {
|
||||||
indexNum = 0;
|
indexNum = 0;
|
||||||
}
|
}
|
||||||
foreach(const FBXMeshPart& part, extractedMesh.parts) {
|
foreach(const FBXMeshPart& part, extractedMesh.parts) {
|
||||||
model::Mesh::Part modelPart(indexNum, 0, 0, model::Mesh::TRIANGLES);
|
graphics::Mesh::Part modelPart(indexNum, 0, 0, graphics::Mesh::TRIANGLES);
|
||||||
|
|
||||||
if (part.quadTrianglesIndices.size()) {
|
if (part.quadTrianglesIndices.size()) {
|
||||||
indexBuffer->setSubData(offset,
|
indexBuffer->setSubData(offset,
|
||||||
|
@ -812,7 +813,7 @@ void FBXReader::buildModelMesh(FBXMesh& extractedMesh, const QString& url) {
|
||||||
|
|
||||||
if (parts.size()) {
|
if (parts.size()) {
|
||||||
auto pb = std::make_shared<gpu::Buffer>();
|
auto pb = std::make_shared<gpu::Buffer>();
|
||||||
pb->setData(parts.size() * sizeof(model::Mesh::Part), (const gpu::Byte*) parts.data());
|
pb->setData(parts.size() * sizeof(graphics::Mesh::Part), (const gpu::Byte*) parts.data());
|
||||||
gpu::BufferView pbv(pb, gpu::Element(gpu::VEC4, gpu::UINT32, gpu::XYZW));
|
gpu::BufferView pbv(pb, gpu::Element(gpu::VEC4, gpu::UINT32, gpu::XYZW));
|
||||||
mesh->setPartBuffer(pbv);
|
mesh->setPartBuffer(pbv);
|
||||||
} else {
|
} else {
|
||||||
|
@ -820,7 +821,7 @@ void FBXReader::buildModelMesh(FBXMesh& extractedMesh, const QString& url) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// model::Box box =
|
// graphics::Box box =
|
||||||
mesh->evalPartBound(0);
|
mesh->evalPartBound(0);
|
||||||
|
|
||||||
extractedMesh._mesh = mesh;
|
extractedMesh._mesh = mesh;
|
||||||
|
|
|
@ -748,7 +748,7 @@ bool GLTFReader::buildGeometry(FBXGeometry& geometry, const QUrl& url) {
|
||||||
QString& matid = materialIDs[i];
|
QString& matid = materialIDs[i];
|
||||||
geometry.materials[matid] = FBXMaterial();
|
geometry.materials[matid] = FBXMaterial();
|
||||||
FBXMaterial& fbxMaterial = geometry.materials[matid];
|
FBXMaterial& fbxMaterial = geometry.materials[matid];
|
||||||
fbxMaterial._material = std::make_shared<model::Material>();
|
fbxMaterial._material = std::make_shared<graphics::Material>();
|
||||||
setFBXMaterial(fbxMaterial, _file.materials[i]);
|
setFBXMaterial(fbxMaterial, _file.materials[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -750,8 +750,8 @@ FBXGeometry* OBJReader::readOBJ(QByteArray& model, const QVariantHash& mapping,
|
||||||
objMaterial.opacity);
|
objMaterial.opacity);
|
||||||
FBXMaterial& fbxMaterial = geometry.materials[materialID];
|
FBXMaterial& fbxMaterial = geometry.materials[materialID];
|
||||||
fbxMaterial.materialID = materialID;
|
fbxMaterial.materialID = materialID;
|
||||||
fbxMaterial._material = std::make_shared<model::Material>();
|
fbxMaterial._material = std::make_shared<graphics::Material>();
|
||||||
model::MaterialPointer modelMaterial = fbxMaterial._material;
|
graphics::MaterialPointer modelMaterial = fbxMaterial._material;
|
||||||
|
|
||||||
if (!objMaterial.diffuseTextureFilename.isEmpty()) {
|
if (!objMaterial.diffuseTextureFilename.isEmpty()) {
|
||||||
fbxMaterial.albedoTexture.filename = objMaterial.diffuseTextureFilename;
|
fbxMaterial.albedoTexture.filename = objMaterial.diffuseTextureFilename;
|
||||||
|
@ -763,7 +763,7 @@ FBXGeometry* OBJReader::readOBJ(QByteArray& model, const QVariantHash& mapping,
|
||||||
modelMaterial->setEmissive(fbxMaterial.emissiveColor);
|
modelMaterial->setEmissive(fbxMaterial.emissiveColor);
|
||||||
modelMaterial->setAlbedo(fbxMaterial.diffuseColor);
|
modelMaterial->setAlbedo(fbxMaterial.diffuseColor);
|
||||||
modelMaterial->setMetallic(glm::length(fbxMaterial.specularColor));
|
modelMaterial->setMetallic(glm::length(fbxMaterial.specularColor));
|
||||||
modelMaterial->setRoughness(model::Material::shininessToRoughness(fbxMaterial.shininess));
|
modelMaterial->setRoughness(graphics::Material::shininessToRoughness(fbxMaterial.shininess));
|
||||||
|
|
||||||
if (fbxMaterial.opacity <= 0.0f) {
|
if (fbxMaterial.opacity <= 0.0f) {
|
||||||
modelMaterial->setOpacity(1.0f);
|
modelMaterial->setOpacity(1.0f);
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
|
|
||||||
#include <QFile>
|
#include <QFile>
|
||||||
#include <QFileInfo>
|
#include <QFileInfo>
|
||||||
#include "model/Geometry.h"
|
#include "graphics/Geometry.h"
|
||||||
#include "OBJWriter.h"
|
#include "OBJWriter.h"
|
||||||
#include "ModelFormatLogging.h"
|
#include "ModelFormatLogging.h"
|
||||||
|
|
||||||
|
@ -105,13 +105,13 @@ bool writeOBJToTextStream(QTextStream& out, QList<MeshPointer> meshes) {
|
||||||
const gpu::BufferView& partBuffer = mesh->getPartBuffer();
|
const gpu::BufferView& partBuffer = mesh->getPartBuffer();
|
||||||
const gpu::BufferView& indexBuffer = mesh->getIndexBuffer();
|
const gpu::BufferView& indexBuffer = mesh->getIndexBuffer();
|
||||||
|
|
||||||
model::Index partCount = (model::Index)mesh->getNumParts();
|
graphics::Index partCount = (graphics::Index)mesh->getNumParts();
|
||||||
for (int partIndex = 0; partIndex < partCount; partIndex++) {
|
for (int partIndex = 0; partIndex < partCount; partIndex++) {
|
||||||
const model::Mesh::Part& part = partBuffer.get<model::Mesh::Part>(partIndex);
|
const graphics::Mesh::Part& part = partBuffer.get<graphics::Mesh::Part>(partIndex);
|
||||||
|
|
||||||
out << "g part-" << nth++ << "\n";
|
out << "g part-" << nth++ << "\n";
|
||||||
|
|
||||||
// model::Mesh::TRIANGLES
|
// graphics::Mesh::TRIANGLES
|
||||||
// TODO -- handle other formats
|
// TODO -- handle other formats
|
||||||
gpu::BufferView::Iterator<const uint32_t> indexItr = indexBuffer.cbegin<uint32_t>();
|
gpu::BufferView::Iterator<const uint32_t> indexItr = indexBuffer.cbegin<uint32_t>();
|
||||||
indexItr += part._startIndex;
|
indexItr += part._startIndex;
|
||||||
|
|
|
@ -15,9 +15,9 @@
|
||||||
|
|
||||||
#include <QString>
|
#include <QString>
|
||||||
#include <QList>
|
#include <QList>
|
||||||
#include <model/Geometry.h>
|
#include <graphics/Geometry.h>
|
||||||
|
|
||||||
using MeshPointer = std::shared_ptr<model::Mesh>;
|
using MeshPointer = std::shared_ptr<graphics::Mesh>;
|
||||||
|
|
||||||
bool writeOBJToTextStream(QTextStream& out, QList<MeshPointer> meshes);
|
bool writeOBJToTextStream(QTextStream& out, QList<MeshPointer> meshes);
|
||||||
bool writeOBJToFile(QString path, QList<MeshPointer> meshes);
|
bool writeOBJToFile(QString path, QList<MeshPointer> meshes);
|
||||||
|
|
|
@ -63,12 +63,17 @@ namespace gl {
|
||||||
}
|
}
|
||||||
*/
|
*/
|
||||||
|
|
||||||
qCWarning(glLogging) << "GLShader::compileShader - failed to compile the gl shader object:";
|
qCCritical(glLogging) << "GLShader::compileShader - failed to compile the gl shader object:";
|
||||||
|
int lineNumber = 0;
|
||||||
for (auto s : srcstr) {
|
for (auto s : srcstr) {
|
||||||
qCWarning(glLogging) << s;
|
QString str(s);
|
||||||
|
QStringList lines = str.split("\n");
|
||||||
|
for (auto& line : lines) {
|
||||||
|
qCCritical(glLogging).noquote() << QString("%1: %2").arg(lineNumber++, 5, 10, QChar('0')).arg(line);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
qCWarning(glLogging) << "GLShader::compileShader - errors:";
|
qCCritical(glLogging) << "GLShader::compileShader - errors:";
|
||||||
qCWarning(glLogging) << temp;
|
qCCritical(glLogging) << temp;
|
||||||
|
|
||||||
error = std::string(temp);
|
error = std::string(temp);
|
||||||
delete[] temp;
|
delete[] temp;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
set(TARGET_NAME model)
|
set(TARGET_NAME graphics)
|
||||||
AUTOSCRIBE_SHADER_LIB(gpu model)
|
AUTOSCRIBE_SHADER_LIB(gpu graphics)
|
||||||
setup_hifi_library()
|
setup_hifi_library()
|
||||||
link_hifi_libraries(shared ktx gpu image)
|
link_hifi_libraries(shared ktx gpu image)
|
|
@ -1,6 +1,6 @@
|
||||||
//
|
//
|
||||||
// Asset.cpp
|
// Asset.cpp
|
||||||
// libraries/model/src/model
|
// libraries/graphics/src/graphics
|
||||||
//
|
//
|
||||||
// Created by Sam Gateau on 08/21/2015.
|
// Created by Sam Gateau on 08/21/2015.
|
||||||
// Copyright 2015 High Fidelity, Inc.
|
// Copyright 2015 High Fidelity, Inc.
|
||||||
|
@ -10,7 +10,7 @@
|
||||||
//
|
//
|
||||||
#include "Asset.h"
|
#include "Asset.h"
|
||||||
|
|
||||||
using namespace model;
|
using namespace graphics;
|
||||||
|
|
||||||
Asset::Asset() {
|
Asset::Asset() {
|
||||||
}
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
//
|
//
|
||||||
// Asset.h
|
// Asset.h
|
||||||
// libraries/model/src/model
|
// libraries/graphics/src/graphics
|
||||||
//
|
//
|
||||||
// Created by Sam Gateau on 08/21/2015.
|
// Created by Sam Gateau on 08/21/2015.
|
||||||
// Copyright 2015 High Fidelity, Inc.
|
// Copyright 2015 High Fidelity, Inc.
|
||||||
|
@ -17,7 +17,7 @@
|
||||||
#include "Material.h"
|
#include "Material.h"
|
||||||
#include "Geometry.h"
|
#include "Geometry.h"
|
||||||
|
|
||||||
namespace model {
|
namespace graphics {
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
class Table {
|
class Table {
|
|
@ -1,6 +1,6 @@
|
||||||
//
|
//
|
||||||
// Forward.h
|
// Forward.h
|
||||||
// libraries/model/src/model
|
// libraries/graphics/src/graphics
|
||||||
//
|
//
|
||||||
// Created by Bradley Austin Davis on 2017/06/21
|
// Created by Bradley Austin Davis on 2017/06/21
|
||||||
// Copyright 2013-2017 High Fidelity, Inc.
|
// Copyright 2013-2017 High Fidelity, Inc.
|
||||||
|
@ -11,7 +11,7 @@
|
||||||
#ifndef hifi_model_Forward_h
|
#ifndef hifi_model_Forward_h
|
||||||
#define hifi_model_Forward_h
|
#define hifi_model_Forward_h
|
||||||
|
|
||||||
namespace model {
|
namespace graphics {
|
||||||
class Mesh;
|
class Mesh;
|
||||||
using MeshPointer = std::shared_ptr<Mesh>;
|
using MeshPointer = std::shared_ptr<Mesh>;
|
||||||
}
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
//
|
//
|
||||||
// Geometry.cpp
|
// Geometry.cpp
|
||||||
// libraries/model/src/model
|
// libraries/graphics/src/graphics
|
||||||
//
|
//
|
||||||
// Created by Sam Gateau on 12/5/2014.
|
// Created by Sam Gateau on 12/5/2014.
|
||||||
// Copyright 2014 High Fidelity, Inc.
|
// Copyright 2014 High Fidelity, Inc.
|
||||||
|
@ -13,7 +13,7 @@
|
||||||
|
|
||||||
#include <glm/gtc/packing.hpp>
|
#include <glm/gtc/packing.hpp>
|
||||||
|
|
||||||
using namespace model;
|
using namespace graphics;
|
||||||
|
|
||||||
Mesh::Mesh() :
|
Mesh::Mesh() :
|
||||||
_vertexBuffer(gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ)),
|
_vertexBuffer(gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ)),
|
||||||
|
@ -137,7 +137,7 @@ Box Mesh::evalPartsBound(int partStart, int partEnd) const {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
model::MeshPointer Mesh::map(std::function<glm::vec3(glm::vec3)> vertexFunc,
|
graphics::MeshPointer Mesh::map(std::function<glm::vec3(glm::vec3)> vertexFunc,
|
||||||
std::function<glm::vec3(glm::vec3)> colorFunc,
|
std::function<glm::vec3(glm::vec3)> colorFunc,
|
||||||
std::function<glm::vec3(glm::vec3)> normalFunc,
|
std::function<glm::vec3(glm::vec3)> normalFunc,
|
||||||
std::function<uint32_t(uint32_t)> indexFunc) const {
|
std::function<uint32_t(uint32_t)> indexFunc) const {
|
||||||
|
@ -223,7 +223,7 @@ model::MeshPointer Mesh::map(std::function<glm::vec3(glm::vec3)> vertexFunc,
|
||||||
indexDataCursor += sizeof(index);
|
indexDataCursor += sizeof(index);
|
||||||
}
|
}
|
||||||
|
|
||||||
model::MeshPointer result(new model::Mesh());
|
graphics::MeshPointer result(new graphics::Mesh());
|
||||||
|
|
||||||
gpu::Element vertexElement = gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ);
|
gpu::Element vertexElement = gpu::Element(gpu::VEC3, gpu::FLOAT, gpu::XYZ);
|
||||||
gpu::Buffer* resultVertexBuffer = new gpu::Buffer(vertexSize, resultVertexData.get());
|
gpu::Buffer* resultVertexBuffer = new gpu::Buffer(vertexSize, resultVertexData.get());
|
||||||
|
@ -252,12 +252,12 @@ model::MeshPointer Mesh::map(std::function<glm::vec3(glm::vec3)> vertexFunc,
|
||||||
|
|
||||||
// TODO -- shouldn't assume just one part
|
// TODO -- shouldn't assume just one part
|
||||||
|
|
||||||
std::vector<model::Mesh::Part> parts;
|
std::vector<graphics::Mesh::Part> parts;
|
||||||
parts.emplace_back(model::Mesh::Part((model::Index)0, // startIndex
|
parts.emplace_back(graphics::Mesh::Part((graphics::Index)0, // startIndex
|
||||||
(model::Index)result->getNumIndices(), // numIndices
|
(graphics::Index)result->getNumIndices(), // numIndices
|
||||||
(model::Index)0, // baseVertex
|
(graphics::Index)0, // baseVertex
|
||||||
model::Mesh::TRIANGLES)); // topology
|
graphics::Mesh::TRIANGLES)); // topology
|
||||||
result->setPartBuffer(gpu::BufferView(new gpu::Buffer(parts.size() * sizeof(model::Mesh::Part),
|
result->setPartBuffer(gpu::BufferView(new gpu::Buffer(parts.size() * sizeof(graphics::Mesh::Part),
|
||||||
(gpu::Byte*) parts.data()), gpu::Element::PART_DRAWCALL));
|
(gpu::Byte*) parts.data()), gpu::Element::PART_DRAWCALL));
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
|
@ -350,9 +350,9 @@ MeshPointer Mesh::createIndexedTriangles_P3F(uint32_t numVertices, uint32_t numI
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
std::vector<model::Mesh::Part> parts;
|
std::vector<graphics::Mesh::Part> parts;
|
||||||
parts.push_back(model::Mesh::Part(0, numIndices, 0, model::Mesh::TRIANGLES));
|
parts.push_back(graphics::Mesh::Part(0, numIndices, 0, graphics::Mesh::TRIANGLES));
|
||||||
mesh->setPartBuffer(gpu::BufferView(new gpu::Buffer(parts.size() * sizeof(model::Mesh::Part), (gpu::Byte*) parts.data()), gpu::Element::PART_DRAWCALL));
|
mesh->setPartBuffer(gpu::BufferView(new gpu::Buffer(parts.size() * sizeof(graphics::Mesh::Part), (gpu::Byte*) parts.data()), gpu::Element::PART_DRAWCALL));
|
||||||
|
|
||||||
return mesh;
|
return mesh;
|
||||||
}
|
}
|
|
@ -1,6 +1,6 @@
|
||||||
//
|
//
|
||||||
// Geometry.h
|
// Geometry.h
|
||||||
// libraries/model/src/model
|
// libraries/graphics/src/graphics
|
||||||
//
|
//
|
||||||
// Created by Sam Gateau on 12/5/2014.
|
// Created by Sam Gateau on 12/5/2014.
|
||||||
// Copyright 2014 High Fidelity, Inc.
|
// Copyright 2014 High Fidelity, Inc.
|
||||||
|
@ -18,7 +18,7 @@
|
||||||
#include <gpu/Resource.h>
|
#include <gpu/Resource.h>
|
||||||
#include <gpu/Stream.h>
|
#include <gpu/Stream.h>
|
||||||
|
|
||||||
namespace model {
|
namespace graphics {
|
||||||
typedef gpu::BufferView::Index Index;
|
typedef gpu::BufferView::Index Index;
|
||||||
typedef gpu::BufferView BufferView;
|
typedef gpu::BufferView BufferView;
|
||||||
typedef AABox Box;
|
typedef AABox Box;
|
||||||
|
@ -40,7 +40,7 @@ public:
|
||||||
typedef gpu::Stream::Format VertexFormat;
|
typedef gpu::Stream::Format VertexFormat;
|
||||||
typedef std::map< Slot, BufferView > BufferViewMap;
|
typedef std::map< Slot, BufferView > BufferViewMap;
|
||||||
|
|
||||||
typedef model::Vec3 Vec3;
|
typedef graphics::Vec3 Vec3;
|
||||||
|
|
||||||
Mesh();
|
Mesh();
|
||||||
Mesh(const Mesh& mesh);
|
Mesh(const Mesh& mesh);
|
|
@ -6,6 +6,6 @@
|
||||||
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
// See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html
|
||||||
//
|
//
|
||||||
|
|
||||||
#include "ModelLogging.h"
|
#include "GraphicsLogging.h"
|
||||||
|
|
||||||
Q_LOGGING_CATEGORY(modelLog, "hifi.model")
|
Q_LOGGING_CATEGORY(graphicsLog, "hifi.graphics")
|
|
@ -1,5 +1,5 @@
|
||||||
//
|
//
|
||||||
// ModelLogging.h
|
// GraphicsLogging.h
|
||||||
// hifi
|
// hifi
|
||||||
//
|
//
|
||||||
// Created by Sam Gateau on 9/20/15.
|
// Created by Sam Gateau on 9/20/15.
|
||||||
|
@ -11,4 +11,4 @@
|
||||||
|
|
||||||
#include <QLoggingCategory>
|
#include <QLoggingCategory>
|
||||||
|
|
||||||
Q_DECLARE_LOGGING_CATEGORY(modelLog)
|
Q_DECLARE_LOGGING_CATEGORY(graphicsLog)
|
|
@ -1,6 +1,6 @@
|
||||||
//
|
//
|
||||||
// Haze.cpp
|
// Haze.cpp
|
||||||
// libraries/model/src/model
|
// libraries/graphics/src/graphics
|
||||||
//
|
//
|
||||||
// Created by Nissim Hadar on 9/13/2017.
|
// Created by Nissim Hadar on 9/13/2017.
|
||||||
// Copyright 2014 High Fidelity, Inc.
|
// Copyright 2014 High Fidelity, Inc.
|
||||||
|
@ -12,7 +12,7 @@
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include "Haze.h"
|
#include "Haze.h"
|
||||||
|
|
||||||
using namespace model;
|
using namespace graphics;
|
||||||
|
|
||||||
const float Haze::INITIAL_HAZE_RANGE{ 1000.0f };
|
const float Haze::INITIAL_HAZE_RANGE{ 1000.0f };
|
||||||
const float Haze::INITIAL_HAZE_HEIGHT{ 200.0f };
|
const float Haze::INITIAL_HAZE_HEIGHT{ 200.0f };
|
|
@ -1,6 +1,6 @@
|
||||||
//
|
//
|
||||||
// MakeHaze.h
|
// MakeHaze.h
|
||||||
// libraries/model/src/model
|
// libraries/graphics/src/graphics
|
||||||
//
|
//
|
||||||
// Created by Nissim Hadar on 9/13/2017.
|
// Created by Nissim Hadar on 9/13/2017.
|
||||||
// Copyright 2014 High Fidelity, Inc.
|
// Copyright 2014 High Fidelity, Inc.
|
||||||
|
@ -17,7 +17,7 @@
|
||||||
#include "Transform.h"
|
#include "Transform.h"
|
||||||
#include "NumericalConstants.h"
|
#include "NumericalConstants.h"
|
||||||
|
|
||||||
namespace model {
|
namespace graphics {
|
||||||
// Haze range is defined here as the range the visibility is reduced by 95%
|
// Haze range is defined here as the range the visibility is reduced by 95%
|
||||||
// Haze altitude is defined here as the altitude (above 0) that the haze is reduced by 95%
|
// Haze altitude is defined here as the altitude (above 0) that the haze is reduced by 95%
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
//
|
//
|
||||||
// Light.cpp
|
// Light.cpp
|
||||||
// libraries/model/src/model
|
// libraries/graphics/src/graphics
|
||||||
//
|
//
|
||||||
// Created by Sam Gateau on 1/26/2014.
|
// Created by Sam Gateau on 1/26/2014.
|
||||||
// Copyright 2014 High Fidelity, Inc.
|
// Copyright 2014 High Fidelity, Inc.
|
||||||
|
@ -10,7 +10,7 @@
|
||||||
//
|
//
|
||||||
#include "Light.h"
|
#include "Light.h"
|
||||||
|
|
||||||
using namespace model;
|
using namespace graphics;
|
||||||
|
|
||||||
Light::Light() {
|
Light::Light() {
|
||||||
updateLightRadius();
|
updateLightRadius();
|
|
@ -1,6 +1,6 @@
|
||||||
//
|
//
|
||||||
// Light.h
|
// Light.h
|
||||||
// libraries/model/src/model
|
// libraries/graphics/src/graphics
|
||||||
//
|
//
|
||||||
// Created by Sam Gateau on 12/10/2014.
|
// Created by Sam Gateau on 12/10/2014.
|
||||||
// Copyright 2014 High Fidelity, Inc.
|
// Copyright 2014 High Fidelity, Inc.
|
||||||
|
@ -19,7 +19,7 @@
|
||||||
#include "gpu/Resource.h"
|
#include "gpu/Resource.h"
|
||||||
#include "gpu/Texture.h"
|
#include "gpu/Texture.h"
|
||||||
|
|
||||||
namespace model {
|
namespace graphics {
|
||||||
typedef gpu::BufferView UniformBufferView;
|
typedef gpu::BufferView UniformBufferView;
|
||||||
typedef gpu::TextureView TextureView;
|
typedef gpu::TextureView TextureView;
|
||||||
typedef glm::vec3 Vec3;
|
typedef glm::vec3 Vec3;
|
|
@ -11,8 +11,8 @@
|
||||||
<@if not MODEL_LIGHT_SLH@>
|
<@if not MODEL_LIGHT_SLH@>
|
||||||
<@def MODEL_LIGHT_SLH@>
|
<@def MODEL_LIGHT_SLH@>
|
||||||
|
|
||||||
<@include model/LightVolume.shared.slh@>
|
<@include graphics/LightVolume.shared.slh@>
|
||||||
<@include model/LightIrradiance.shared.slh@>
|
<@include graphics/LightIrradiance.shared.slh@>
|
||||||
|
|
||||||
// NOw lets define Light
|
// NOw lets define Light
|
||||||
struct Light {
|
struct Light {
|
||||||
|
@ -30,7 +30,7 @@ float getLightIntensity(Light l) { return lightIrradiance_getIntensity(l.irradia
|
||||||
vec3 getLightIrradiance(Light l) { return lightIrradiance_getIrradiance(l.irradiance); }
|
vec3 getLightIrradiance(Light l) { return lightIrradiance_getIrradiance(l.irradiance); }
|
||||||
|
|
||||||
// AMbient lighting needs extra info provided from a different Buffer
|
// AMbient lighting needs extra info provided from a different Buffer
|
||||||
<@include model/SphericalHarmonics.shared.slh@>
|
<@include graphics/SphericalHarmonics.shared.slh@>
|
||||||
// Light Ambient
|
// Light Ambient
|
||||||
struct LightAmbient {
|
struct LightAmbient {
|
||||||
vec4 _ambient;
|
vec4 _ambient;
|
|
@ -3,7 +3,7 @@
|
||||||
#define LightVolume_Shared_slh
|
#define LightVolume_Shared_slh
|
||||||
|
|
||||||
// Light.shared.slh
|
// Light.shared.slh
|
||||||
// libraries/model/src/model
|
// libraries/graphics/src/graphics
|
||||||
//
|
//
|
||||||
// Created by Sam Gateau on 14/9/2016.
|
// Created by Sam Gateau on 14/9/2016.
|
||||||
// Copyright 2014 High Fidelity, Inc.
|
// Copyright 2014 High Fidelity, Inc.
|
|
@ -1,6 +1,6 @@
|
||||||
//
|
//
|
||||||
// Material.cpp
|
// Material.cpp
|
||||||
// libraries/model/src/model
|
// libraries/graphics/src/graphics
|
||||||
//
|
//
|
||||||
// Created by Sam Gateau on 12/10/2014.
|
// Created by Sam Gateau on 12/10/2014.
|
||||||
// Copyright 2014 High Fidelity, Inc.
|
// Copyright 2014 High Fidelity, Inc.
|
||||||
|
@ -12,7 +12,7 @@
|
||||||
|
|
||||||
#include "TextureMap.h"
|
#include "TextureMap.h"
|
||||||
|
|
||||||
using namespace model;
|
using namespace graphics;
|
||||||
using namespace gpu;
|
using namespace gpu;
|
||||||
|
|
||||||
Material::Material() :
|
Material::Material() :
|
|
@ -1,6 +1,6 @@
|
||||||
//
|
//
|
||||||
// Material.h
|
// Material.h
|
||||||
// libraries/model/src/model
|
// libraries/graphics/src/graphics
|
||||||
//
|
//
|
||||||
// Created by Sam Gateau on 12/10/2014.
|
// Created by Sam Gateau on 12/10/2014.
|
||||||
// Copyright 2014 High Fidelity, Inc.
|
// Copyright 2014 High Fidelity, Inc.
|
||||||
|
@ -20,7 +20,7 @@
|
||||||
|
|
||||||
#include <gpu/Resource.h>
|
#include <gpu/Resource.h>
|
||||||
|
|
||||||
namespace model {
|
namespace graphics {
|
||||||
|
|
||||||
class TextureMap;
|
class TextureMap;
|
||||||
typedef std::shared_ptr< TextureMap > TextureMapPointer;
|
typedef std::shared_ptr< TextureMap > TextureMapPointer;
|
|
@ -1,6 +1,6 @@
|
||||||
//
|
//
|
||||||
// Skybox.cpp
|
// Skybox.cpp
|
||||||
// libraries/model/src/model
|
// libraries/graphics/src/graphics
|
||||||
//
|
//
|
||||||
// Created by Sam Gateau on 5/4/2015.
|
// Created by Sam Gateau on 5/4/2015.
|
||||||
// Copyright 2015 High Fidelity, Inc.
|
// Copyright 2015 High Fidelity, Inc.
|
||||||
|
@ -18,7 +18,7 @@
|
||||||
#include "skybox_vert.h"
|
#include "skybox_vert.h"
|
||||||
#include "skybox_frag.h"
|
#include "skybox_frag.h"
|
||||||
|
|
||||||
using namespace model;
|
using namespace graphics;
|
||||||
|
|
||||||
Skybox::Skybox() {
|
Skybox::Skybox() {
|
||||||
Schema schema;
|
Schema schema;
|
|
@ -1,6 +1,6 @@
|
||||||
//
|
//
|
||||||
// Skybox.h
|
// Skybox.h
|
||||||
// libraries/model/src/model
|
// libraries/graphics/src/graphics
|
||||||
//
|
//
|
||||||
// Created by Sam Gateau on 5/4/2015.
|
// Created by Sam Gateau on 5/4/2015.
|
||||||
// Copyright 2015 High Fidelity, Inc.
|
// Copyright 2015 High Fidelity, Inc.
|
||||||
|
@ -19,7 +19,7 @@ class ViewFrustum;
|
||||||
|
|
||||||
namespace gpu { class Batch; }
|
namespace gpu { class Batch; }
|
||||||
|
|
||||||
namespace model {
|
namespace graphics {
|
||||||
|
|
||||||
typedef glm::vec3 Color;
|
typedef glm::vec3 Color;
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
#define SphericalHarmonics_Shared_slh
|
#define SphericalHarmonics_Shared_slh
|
||||||
|
|
||||||
// SphericalHarmonics.shared.slh
|
// SphericalHarmonics.shared.slh
|
||||||
// libraries/model/src/model
|
// libraries/graphics/src/graphics
|
||||||
//
|
//
|
||||||
// Created by Sam Gateau on 14/9/2016.
|
// Created by Sam Gateau on 14/9/2016.
|
||||||
// Copyright 2014 High Fidelity, Inc.
|
// Copyright 2014 High Fidelity, Inc.
|
|
@ -1,6 +1,6 @@
|
||||||
//
|
//
|
||||||
// Stage.cpp
|
// Stage.cpp
|
||||||
// libraries/model/src/model
|
// libraries/graphics/src/graphics
|
||||||
//
|
//
|
||||||
// Created by Sam Gateau on 2/24/2015.
|
// Created by Sam Gateau on 2/24/2015.
|
||||||
// Copyright 2014 High Fidelity, Inc.
|
// Copyright 2014 High Fidelity, Inc.
|
||||||
|
@ -15,7 +15,7 @@
|
||||||
#include <qcompilerdetection.h>
|
#include <qcompilerdetection.h>
|
||||||
#include <ComponentMode.h>
|
#include <ComponentMode.h>
|
||||||
|
|
||||||
using namespace model;
|
using namespace graphics;
|
||||||
|
|
||||||
|
|
||||||
void EarthSunModel::updateAll() const {
|
void EarthSunModel::updateAll() const {
|
|
@ -1,6 +1,6 @@
|
||||||
//
|
//
|
||||||
// Stage.h
|
// Stage.h
|
||||||
// libraries/model/src/model
|
// libraries/graphics/src/graphics
|
||||||
//
|
//
|
||||||
// Created by Sam Gateau on 2/24/2015.
|
// Created by Sam Gateau on 2/24/2015.
|
||||||
// Copyright 2014 High Fidelity, Inc.
|
// Copyright 2014 High Fidelity, Inc.
|
||||||
|
@ -16,7 +16,7 @@
|
||||||
#include "Light.h"
|
#include "Light.h"
|
||||||
#include "Skybox.h"
|
#include "Skybox.h"
|
||||||
|
|
||||||
namespace model {
|
namespace graphics {
|
||||||
|
|
||||||
typedef glm::dvec3 Vec3d;
|
typedef glm::dvec3 Vec3d;
|
||||||
typedef glm::dvec4 Vec4d;
|
typedef glm::dvec4 Vec4d;
|
|
@ -1,6 +1,6 @@
|
||||||
//
|
//
|
||||||
// TextureMap.cpp
|
// TextureMap.cpp
|
||||||
// libraries/model/src/model
|
// libraries/graphics/src/graphics
|
||||||
//
|
//
|
||||||
// Created by Sam Gateau on 5/6/2015.
|
// Created by Sam Gateau on 5/6/2015.
|
||||||
// Copyright 2014 High Fidelity, Inc.
|
// Copyright 2014 High Fidelity, Inc.
|
||||||
|
@ -10,7 +10,7 @@
|
||||||
//
|
//
|
||||||
#include "TextureMap.h"
|
#include "TextureMap.h"
|
||||||
|
|
||||||
using namespace model;
|
using namespace graphics;
|
||||||
using namespace gpu;
|
using namespace gpu;
|
||||||
|
|
||||||
void TextureMap::setTextureSource(TextureSourcePointer& textureSource) {
|
void TextureMap::setTextureSource(TextureSourcePointer& textureSource) {
|
|
@ -1,6 +1,6 @@
|
||||||
//
|
//
|
||||||
// TextureMap.h
|
// TextureMap.h
|
||||||
// libraries/model/src/model
|
// libraries/graphics/src/graphics
|
||||||
//
|
//
|
||||||
// Created by Sam Gateau on 5/6/2015.
|
// Created by Sam Gateau on 5/6/2015.
|
||||||
// Copyright 2014 High Fidelity, Inc.
|
// Copyright 2014 High Fidelity, Inc.
|
||||||
|
@ -15,7 +15,7 @@
|
||||||
|
|
||||||
#include "Transform.h"
|
#include "Transform.h"
|
||||||
|
|
||||||
namespace model {
|
namespace graphics {
|
||||||
|
|
||||||
class TextureMap {
|
class TextureMap {
|
||||||
public:
|
public:
|
|
@ -1,4 +1,4 @@
|
||||||
set(TARGET_NAME model-networking)
|
set(TARGET_NAME model-networking)
|
||||||
setup_hifi_library()
|
setup_hifi_library()
|
||||||
link_hifi_libraries(shared networking model fbx ktx image)
|
link_hifi_libraries(shared networking graphics fbx ktx image)
|
||||||
include_hifi_library_headers(gpu)
|
include_hifi_library_headers(gpu)
|
||||||
|
|
|
@ -516,13 +516,13 @@ QUrl NetworkMaterial::getTextureUrl(const QUrl& baseUrl, const FBXTexture& textu
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
model::TextureMapPointer NetworkMaterial::fetchTextureMap(const QUrl& baseUrl, const FBXTexture& fbxTexture,
|
graphics::TextureMapPointer NetworkMaterial::fetchTextureMap(const QUrl& baseUrl, const FBXTexture& fbxTexture,
|
||||||
image::TextureUsage::Type type, MapChannel channel) {
|
image::TextureUsage::Type type, MapChannel channel) {
|
||||||
const auto url = getTextureUrl(baseUrl, fbxTexture);
|
const auto url = getTextureUrl(baseUrl, fbxTexture);
|
||||||
const auto texture = DependencyManager::get<TextureCache>()->getTexture(url, type, fbxTexture.content, fbxTexture.maxNumPixels);
|
const auto texture = DependencyManager::get<TextureCache>()->getTexture(url, type, fbxTexture.content, fbxTexture.maxNumPixels);
|
||||||
_textures[channel] = Texture { fbxTexture.name, texture };
|
_textures[channel] = Texture { fbxTexture.name, texture };
|
||||||
|
|
||||||
auto map = std::make_shared<model::TextureMap>();
|
auto map = std::make_shared<graphics::TextureMap>();
|
||||||
if (texture) {
|
if (texture) {
|
||||||
map->setTextureSource(texture->_textureSource);
|
map->setTextureSource(texture->_textureSource);
|
||||||
}
|
}
|
||||||
|
@ -531,18 +531,18 @@ model::TextureMapPointer NetworkMaterial::fetchTextureMap(const QUrl& baseUrl, c
|
||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
|
||||||
model::TextureMapPointer NetworkMaterial::fetchTextureMap(const QUrl& url, image::TextureUsage::Type type, MapChannel channel) {
|
graphics::TextureMapPointer NetworkMaterial::fetchTextureMap(const QUrl& url, image::TextureUsage::Type type, MapChannel channel) {
|
||||||
const auto texture = DependencyManager::get<TextureCache>()->getTexture(url, type);
|
const auto texture = DependencyManager::get<TextureCache>()->getTexture(url, type);
|
||||||
_textures[channel].texture = texture;
|
_textures[channel].texture = texture;
|
||||||
|
|
||||||
auto map = std::make_shared<model::TextureMap>();
|
auto map = std::make_shared<graphics::TextureMap>();
|
||||||
map->setTextureSource(texture->_textureSource);
|
map->setTextureSource(texture->_textureSource);
|
||||||
|
|
||||||
return map;
|
return map;
|
||||||
}
|
}
|
||||||
|
|
||||||
NetworkMaterial::NetworkMaterial(const FBXMaterial& material, const QUrl& textureBaseUrl) :
|
NetworkMaterial::NetworkMaterial(const FBXMaterial& material, const QUrl& textureBaseUrl) :
|
||||||
model::Material(*material._material)
|
graphics::Material(*material._material)
|
||||||
{
|
{
|
||||||
_textures = Textures(MapChannel::NUM_MAP_CHANNELS);
|
_textures = Textures(MapChannel::NUM_MAP_CHANNELS);
|
||||||
if (!material.albedoTexture.filename.isEmpty()) {
|
if (!material.albedoTexture.filename.isEmpty()) {
|
||||||
|
|
|
@ -15,8 +15,8 @@
|
||||||
#include <DependencyManager.h>
|
#include <DependencyManager.h>
|
||||||
#include <ResourceCache.h>
|
#include <ResourceCache.h>
|
||||||
|
|
||||||
#include <model/Material.h>
|
#include <graphics/Material.h>
|
||||||
#include <model/Asset.h>
|
#include <graphics/Asset.h>
|
||||||
|
|
||||||
#include "FBXReader.h"
|
#include "FBXReader.h"
|
||||||
#include "TextureCache.h"
|
#include "TextureCache.h"
|
||||||
|
@ -38,7 +38,7 @@ public:
|
||||||
Geometry(const Geometry& geometry);
|
Geometry(const Geometry& geometry);
|
||||||
|
|
||||||
// Immutable over lifetime
|
// Immutable over lifetime
|
||||||
using GeometryMeshes = std::vector<std::shared_ptr<const model::Mesh>>;
|
using GeometryMeshes = std::vector<std::shared_ptr<const graphics::Mesh>>;
|
||||||
using GeometryMeshParts = std::vector<std::shared_ptr<const MeshPart>>;
|
using GeometryMeshParts = std::vector<std::shared_ptr<const MeshPart>>;
|
||||||
|
|
||||||
// Mutable, but must retain structure of vector
|
// Mutable, but must retain structure of vector
|
||||||
|
@ -157,9 +157,9 @@ private:
|
||||||
virtual ~ModelCache() = default;
|
virtual ~ModelCache() = default;
|
||||||
};
|
};
|
||||||
|
|
||||||
class NetworkMaterial : public model::Material {
|
class NetworkMaterial : public graphics::Material {
|
||||||
public:
|
public:
|
||||||
using MapChannel = model::Material::MapChannel;
|
using MapChannel = graphics::Material::MapChannel;
|
||||||
|
|
||||||
NetworkMaterial(const FBXMaterial& material, const QUrl& textureBaseUrl);
|
NetworkMaterial(const FBXMaterial& material, const QUrl& textureBaseUrl);
|
||||||
|
|
||||||
|
@ -185,9 +185,9 @@ protected:
|
||||||
private:
|
private:
|
||||||
// Helpers for the ctors
|
// Helpers for the ctors
|
||||||
QUrl getTextureUrl(const QUrl& baseUrl, const FBXTexture& fbxTexture);
|
QUrl getTextureUrl(const QUrl& baseUrl, const FBXTexture& fbxTexture);
|
||||||
model::TextureMapPointer fetchTextureMap(const QUrl& baseUrl, const FBXTexture& fbxTexture,
|
graphics::TextureMapPointer fetchTextureMap(const QUrl& baseUrl, const FBXTexture& fbxTexture,
|
||||||
image::TextureUsage::Type type, MapChannel channel);
|
image::TextureUsage::Type type, MapChannel channel);
|
||||||
model::TextureMapPointer fetchTextureMap(const QUrl& url, image::TextureUsage::Type type, MapChannel channel);
|
graphics::TextureMapPointer fetchTextureMap(const QUrl& url, image::TextureUsage::Type type, MapChannel channel);
|
||||||
|
|
||||||
Transform _albedoTransform;
|
Transform _albedoTransform;
|
||||||
Transform _lightmapTransform;
|
Transform _lightmapTransform;
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
|
|
||||||
#include "SimpleMeshProxy.h"
|
#include "SimpleMeshProxy.h"
|
||||||
|
|
||||||
#include <model/Geometry.h>
|
#include <graphics/Geometry.h>
|
||||||
|
|
||||||
MeshPointer SimpleMeshProxy::getMeshPointer() const {
|
MeshPointer SimpleMeshProxy::getMeshPointer() const {
|
||||||
return _mesh;
|
return _mesh;
|
||||||
|
|
|
@ -21,7 +21,7 @@
|
||||||
|
|
||||||
#include <DependencyManager.h>
|
#include <DependencyManager.h>
|
||||||
#include <ResourceCache.h>
|
#include <ResourceCache.h>
|
||||||
#include <model/TextureMap.h>
|
#include <graphics/TextureMap.h>
|
||||||
#include <image/Image.h>
|
#include <image/Image.h>
|
||||||
#include <ktx/KTX.h>
|
#include <ktx/KTX.h>
|
||||||
|
|
||||||
|
|
|
@ -31,6 +31,32 @@ const QString INDEX_PATH = "/";
|
||||||
|
|
||||||
const QString GET_PLACE = "/api/v1/places/%1";
|
const QString GET_PLACE = "/api/v1/places/%1";
|
||||||
|
|
||||||
|
/**jsdoc
|
||||||
|
* The location API provides facilities related to your current location in the metaverse.
|
||||||
|
*
|
||||||
|
* @namespace location
|
||||||
|
* @property {Uuid} domainId - A UUID uniquely identifying the domain you're visiting. Is {@link Uuid|Uuid.NULL} if you're not
|
||||||
|
* connected to the domain.
|
||||||
|
* <em>Read-only.</em>
|
||||||
|
* @property {string} hostname - The name of the domain for your current metaverse address (e.g., <code>"AvatarIsland"</code>,
|
||||||
|
* <code>localhost</code>, or an IP address).
|
||||||
|
* <em>Read-only.</em>
|
||||||
|
* @property {string} href - Your current metaverse address (e.g., <code>"hifi://avatarisland/15,-10,26/0,0,0,1"</code>)
|
||||||
|
* regardless of whether or not you're connected to the domain.
|
||||||
|
* <em>Read-only.</em>
|
||||||
|
* @property {boolean} isConnected - <code>true</code> if you're connected to the domain in your current <code>href</code>
|
||||||
|
* metaverse address, otherwise <code>false</code>.
|
||||||
|
* <em>Read-only.</em>
|
||||||
|
* @property {string} pathname - The location and orientation in your current <code>href</code> metaverse address
|
||||||
|
* (e.g., <code>"/15,-10,26/0,0,0,1"</code>).
|
||||||
|
* <em>Read-only.</em>
|
||||||
|
* @property {string} placename - The place name in your current <code>href</code> metaverse address
|
||||||
|
* (e.g., <code>"AvatarIsland"</code>). Is blank if your <code>hostname</code> is an IP address.
|
||||||
|
* <em>Read-only.</em>
|
||||||
|
* @property {string} protocol - The protocol of your current <code>href</code> metaverse address (e.g., <code>"hifi"</code>).
|
||||||
|
* <em>Read-only.</em>
|
||||||
|
*/
|
||||||
|
|
||||||
class AddressManager : public QObject, public Dependency {
|
class AddressManager : public QObject, public Dependency {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
SINGLETON_DEPENDENCY
|
SINGLETON_DEPENDENCY
|
||||||
|
@ -42,10 +68,77 @@ class AddressManager : public QObject, public Dependency {
|
||||||
Q_PROPERTY(QString placename READ getPlaceName)
|
Q_PROPERTY(QString placename READ getPlaceName)
|
||||||
Q_PROPERTY(QString domainId READ getDomainId)
|
Q_PROPERTY(QString domainId READ getDomainId)
|
||||||
public:
|
public:
|
||||||
|
|
||||||
|
/**jsdoc
|
||||||
|
* Get Interface's protocol version.
|
||||||
|
* @function location.protocolVersion
|
||||||
|
* @returns {string} A string uniquely identifying the version of the metaverse protocol that Interface is using.
|
||||||
|
*/
|
||||||
Q_INVOKABLE QString protocolVersion();
|
Q_INVOKABLE QString protocolVersion();
|
||||||
|
|
||||||
using PositionGetter = std::function<glm::vec3()>;
|
using PositionGetter = std::function<glm::vec3()>;
|
||||||
using OrientationGetter = std::function<glm::quat()>;
|
using OrientationGetter = std::function<glm::quat()>;
|
||||||
|
|
||||||
|
/**jsdoc
|
||||||
|
* <p>The reasons for an address lookup via the metaverse API are defined by numeric values:</p>
|
||||||
|
* <table>
|
||||||
|
* <thead>
|
||||||
|
* <tr>
|
||||||
|
* <th>Name</th>
|
||||||
|
* <th>Value</th>
|
||||||
|
* <th>Description</th>
|
||||||
|
* </tr>
|
||||||
|
* </thead>
|
||||||
|
* <tbody>
|
||||||
|
* <tr>
|
||||||
|
* <td><strong>UserInput</strong></td>
|
||||||
|
* <td><code>0</code></td>
|
||||||
|
* <td>User-typed input.</td>
|
||||||
|
* </tr>
|
||||||
|
* <tr>
|
||||||
|
* <td><strong>Back</strong></td>
|
||||||
|
* <td><code>1</code></td>
|
||||||
|
* <td>Address from a {@link location.goBack|goBack} call.</td>
|
||||||
|
* </tr>
|
||||||
|
* <tr>
|
||||||
|
* <td><strong>Forward</strong></td>
|
||||||
|
* <td><code>2</code></td>
|
||||||
|
* <td>Address from a {@link location.goForward|goForward} call.</td>
|
||||||
|
* </tr>
|
||||||
|
* <tr>
|
||||||
|
* <td><strong>StartupFromSettings</strong></td>
|
||||||
|
* <td><code>3</code></td>
|
||||||
|
* <td>Initial location at Interface start-up from settings.</td>
|
||||||
|
* </tr>
|
||||||
|
* <tr>
|
||||||
|
* <td><strong>DomainPathResponse</strong></td>
|
||||||
|
* <td><code>4</code></td>
|
||||||
|
* <td>A named path in the domain.</td>
|
||||||
|
* </tr>
|
||||||
|
* <tr>
|
||||||
|
* <td><strong>Internal</strong></td>
|
||||||
|
* <td><code>5</code></td>
|
||||||
|
* <td>An internal attempt to resolve an alternative path.</td>
|
||||||
|
* </tr>
|
||||||
|
* <tr>
|
||||||
|
* <td><strong>AttemptedRefresh</strong></td>
|
||||||
|
* <td><code>6</code></td>
|
||||||
|
* <td>A refresh after connecting to a domain.</td>
|
||||||
|
* </tr>
|
||||||
|
* <tr>
|
||||||
|
* <td><strong>Suggestions</strong></td>
|
||||||
|
* <td><code>7</code></td>
|
||||||
|
* <td>Address from the Goto dialog.</td>
|
||||||
|
* </tr>
|
||||||
|
* <tr>
|
||||||
|
* <td><strong>VisitUserFromPAL</strong></td>
|
||||||
|
* <td><code>8</code></td>
|
||||||
|
* <td>User from the People dialog.</td>
|
||||||
|
* </tr>
|
||||||
|
* </tbody>
|
||||||
|
* </table>
|
||||||
|
* @typedef location.LookupTrigger
|
||||||
|
*/
|
||||||
enum LookupTrigger {
|
enum LookupTrigger {
|
||||||
UserInput,
|
UserInput,
|
||||||
Back,
|
Back,
|
||||||
|
@ -83,43 +176,240 @@ public:
|
||||||
const QStack<QUrl>& getForwardStack() const { return _forwardStack; }
|
const QStack<QUrl>& getForwardStack() const { return _forwardStack; }
|
||||||
|
|
||||||
public slots:
|
public slots:
|
||||||
|
/**jsdoc
|
||||||
|
* Go to a specified metaverse address.
|
||||||
|
* @function location.handleLookupString
|
||||||
|
* @param {string} address - The address to go to: a <code>"hifi:/"<code> address, an IP address (e.g.,
|
||||||
|
* <code>"127.0.0.1"</code> or <code>"localhost"</code>), a domain name, a named path on a domain (starts with
|
||||||
|
* <code>"/"</code>), a position or position and orientation, or a user (starts with <code>"@"</code>).
|
||||||
|
* @param {boolean} fromSuggestions=false - Set to <code>true</code> if the address is obtained from the "Goto" dialog.
|
||||||
|
* Helps ensure that user's location history is correctly maintained.
|
||||||
|
*/
|
||||||
void handleLookupString(const QString& lookupString, bool fromSuggestions = false);
|
void handleLookupString(const QString& lookupString, bool fromSuggestions = false);
|
||||||
|
|
||||||
|
/**jsdoc
|
||||||
|
* Go to a position and orientation resulting from a lookup for a named path in the domain (set in the domain server's
|
||||||
|
* settings).
|
||||||
|
* @function location.goToViewpointForPath
|
||||||
|
* @param {string} path - The position and orientation corresponding to the named path.
|
||||||
|
* @param {string} namedPath - The named path that was looked up on the server.
|
||||||
|
* @deprecated This function is deprecated and will be removed.
|
||||||
|
*/
|
||||||
|
// This function is marked as deprecated in anticipation that it will not be included in the JavaScript API if and when the
|
||||||
|
// functions and signals that should be exposed are moved to a scripting interface class.
|
||||||
|
//
|
||||||
// we currently expect this to be called from NodeList once handleLookupString has been called with a path
|
// we currently expect this to be called from NodeList once handleLookupString has been called with a path
|
||||||
bool goToViewpointForPath(const QString& viewpointString, const QString& pathString)
|
bool goToViewpointForPath(const QString& viewpointString, const QString& pathString)
|
||||||
{ return handleViewpoint(viewpointString, false, DomainPathResponse, false, pathString); }
|
{ return handleViewpoint(viewpointString, false, DomainPathResponse, false, pathString); }
|
||||||
|
|
||||||
|
/**jsdoc
|
||||||
|
* Go back to the previous location in your navigation history, if there is one.
|
||||||
|
* @function location.goBack
|
||||||
|
*/
|
||||||
void goBack();
|
void goBack();
|
||||||
|
|
||||||
|
/**jsdoc
|
||||||
|
* Go forward to the next location in your navigation history, if there is one.
|
||||||
|
* @function location.goForward
|
||||||
|
*/
|
||||||
void goForward();
|
void goForward();
|
||||||
|
|
||||||
|
/**jsdoc
|
||||||
|
* Go to the local Sandbox server that's running on the same PC as Interface.
|
||||||
|
* @function location.goToLocalSandbox
|
||||||
|
* @param {string} path="" - The position and orientation to go to (e.g., <code>"/0,0,0"</code>).
|
||||||
|
* @param {location.LookupTrigger} trigger=StartupFromSettings - The reason for the function call. Helps ensure that user's
|
||||||
|
* location history is correctly maintained.
|
||||||
|
*/
|
||||||
void goToLocalSandbox(QString path = "", LookupTrigger trigger = LookupTrigger::StartupFromSettings) { handleUrl(SANDBOX_HIFI_ADDRESS + path, trigger); }
|
void goToLocalSandbox(QString path = "", LookupTrigger trigger = LookupTrigger::StartupFromSettings) { handleUrl(SANDBOX_HIFI_ADDRESS + path, trigger); }
|
||||||
|
|
||||||
|
/**jsdoc
|
||||||
|
* Go to the default "welcome" metaverse address.
|
||||||
|
* @function location.goToEntry
|
||||||
|
* @param {location.LookupTrigger} trigger=StartupFromSettings - The reason for the function call. Helps ensure that user's
|
||||||
|
* location history is correctly maintained.
|
||||||
|
*/
|
||||||
void goToEntry(LookupTrigger trigger = LookupTrigger::StartupFromSettings) { handleUrl(DEFAULT_HIFI_ADDRESS, trigger); }
|
void goToEntry(LookupTrigger trigger = LookupTrigger::StartupFromSettings) { handleUrl(DEFAULT_HIFI_ADDRESS, trigger); }
|
||||||
|
|
||||||
|
/**jsdoc
|
||||||
|
* Go to the specified user's location.
|
||||||
|
* @function location.goToUser
|
||||||
|
* @param {string} username - The user's username.
|
||||||
|
* @param {boolean} matchOrientation=true - If <code>true</code> then go to a location just in front of the user and turn to face
|
||||||
|
* them, otherwise go to the user's exact location and orientation.
|
||||||
|
*/
|
||||||
void goToUser(const QString& username, bool shouldMatchOrientation = true);
|
void goToUser(const QString& username, bool shouldMatchOrientation = true);
|
||||||
|
|
||||||
|
/**jsdoc
|
||||||
|
* Refresh the current address, e.g., after connecting to a domain in order to position the user to the desired location.
|
||||||
|
* @function location.refreshPreviousLookup
|
||||||
|
* @deprecated This function is deprecated and will be removed.
|
||||||
|
*/
|
||||||
|
// This function is marked as deprecated in anticipation that it will not be included in the JavaScript API if and when the
|
||||||
|
// functions and signals that should be exposed are moved to a scripting interface class.
|
||||||
void refreshPreviousLookup();
|
void refreshPreviousLookup();
|
||||||
|
|
||||||
|
/**jsdoc
|
||||||
|
* Update your current metaverse location in Interface's {@link Settings} file as your last-known address. This can be used
|
||||||
|
* to ensure that you start up at that address if you exit Interface without a later address automatically being saved.
|
||||||
|
* @function location.storeCurrentAddress
|
||||||
|
*/
|
||||||
void storeCurrentAddress();
|
void storeCurrentAddress();
|
||||||
|
|
||||||
|
/**jsdoc
|
||||||
|
* Copy your current metaverse address (i.e., <code>location.href</code> property value) to the OS clipboard.
|
||||||
|
* @function location.copyAddress
|
||||||
|
*/
|
||||||
void copyAddress();
|
void copyAddress();
|
||||||
|
|
||||||
|
/**jsdoc
|
||||||
|
* Copy your current metaverse location and orientation (i.e., <code>location.pathname</code> property value) to the OS
|
||||||
|
* clipboard.
|
||||||
|
* @function location.copyPath
|
||||||
|
*/
|
||||||
void copyPath();
|
void copyPath();
|
||||||
|
|
||||||
|
/**jsdoc
|
||||||
|
* Retrieve and remember the place name for the given domain ID if the place name is not already known.
|
||||||
|
* @function location.lookupShareableNameForDomainID
|
||||||
|
* @param {Uuid} domainID - The UUID of the domain.
|
||||||
|
* @deprecated This function is deprecated and will be removed.
|
||||||
|
*/
|
||||||
|
// This function is marked as deprecated in anticipation that it will not be included in the JavaScript API if and when the
|
||||||
|
// functions and signals that should be exposed are moved to a scripting interface class.
|
||||||
void lookupShareableNameForDomainID(const QUuid& domainID);
|
void lookupShareableNameForDomainID(const QUuid& domainID);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
|
/**jsdoc
|
||||||
|
* Triggered when looking up the details of a metaverse user or location to go to has completed (successfully or
|
||||||
|
* unsuccessfully).
|
||||||
|
* @function location.lookupResultsFinished
|
||||||
|
* @returns {Signal}
|
||||||
|
*/
|
||||||
void lookupResultsFinished();
|
void lookupResultsFinished();
|
||||||
|
|
||||||
|
/**jsdoc
|
||||||
|
* Triggered when looking up the details of a metaverse user or location to go to has completed and the domain or user is
|
||||||
|
* offline.
|
||||||
|
* @function location.lookupResultIsOffline
|
||||||
|
* @returns {Signal}
|
||||||
|
*/
|
||||||
void lookupResultIsOffline();
|
void lookupResultIsOffline();
|
||||||
|
|
||||||
|
/**jsdoc
|
||||||
|
* Triggered when looking up the details of a metaverse user or location to go to has completed and the domain or user could
|
||||||
|
* not be found.
|
||||||
|
* @function location.lookupResultIsNotFound
|
||||||
|
* @returns {Signal}
|
||||||
|
*/
|
||||||
void lookupResultIsNotFound();
|
void lookupResultIsNotFound();
|
||||||
|
|
||||||
|
/**jsdoc
|
||||||
|
* Triggered when a request is made to go to an IP address.
|
||||||
|
* @function location.possibleDomainChangeRequired
|
||||||
|
* @param {string} hostName - The name of the domain to go do.
|
||||||
|
* @param {number} port - The integer number of the network port to connect to.
|
||||||
|
* @param {Uuid} domainID - The UUID of the domain to go to.
|
||||||
|
* @returns {Signal}
|
||||||
|
*/
|
||||||
|
// No example because this function isn't typically used in scripts.
|
||||||
void possibleDomainChangeRequired(const QString& newHostname, quint16 newPort, const QUuid& domainID);
|
void possibleDomainChangeRequired(const QString& newHostname, quint16 newPort, const QUuid& domainID);
|
||||||
|
|
||||||
|
/**jsdoc
|
||||||
|
* Triggered when a request is made to go to a named domain or user.
|
||||||
|
* @function location.possibleDomainChangeRequiredViaICEForID
|
||||||
|
* @param {string} iceServerHostName - IP address of the ICE server.
|
||||||
|
* @param {Uuid} domainID - The UUID of the domain to go to.
|
||||||
|
* @returns {Signal}
|
||||||
|
*/
|
||||||
|
// No example because this function isn't typically used in scripts.
|
||||||
void possibleDomainChangeRequiredViaICEForID(const QString& iceServerHostname, const QUuid& domainID);
|
void possibleDomainChangeRequiredViaICEForID(const QString& iceServerHostname, const QUuid& domainID);
|
||||||
|
|
||||||
|
/**jsdoc
|
||||||
|
* Triggered when an attempt is made to send your avatar to a specified position on the current domain. For example, when
|
||||||
|
* you change domains or enter a position to go to in the "Goto" dialog.
|
||||||
|
* @function location.locationChangeRequired
|
||||||
|
* @param {Vec3} position - The position to go to.
|
||||||
|
* @param {boolean} hasOrientationChange - If <code>true</code> then a new <code>orientation</code> has been requested.
|
||||||
|
* @param {Quat} orientation - The orientation to change to. Is {@link Quat(0)|Quat.IDENTITY} if
|
||||||
|
* <code>hasOrientationChange</code> is <code>false</code>.
|
||||||
|
* @param {boolean} shouldFaceLocation - If <code>true</code> then the request is to go to a position near that specified
|
||||||
|
* and orient your avatar to face it. For example when you visit someone from the "People" dialog.
|
||||||
|
* @returns {Signal}
|
||||||
|
* @example <caption>Report location change requests.</caption>
|
||||||
|
* function onLocationChangeRequired(newPosition, hasOrientationChange, newOrientation, shouldFaceLocation) {
|
||||||
|
* print("Location change required:");
|
||||||
|
* print("- New position = " + JSON.stringify(newPosition));
|
||||||
|
* print("- Has orientation change = " + hasOrientationChange);
|
||||||
|
* print("- New orientation = " + JSON.stringify(newOrientation));
|
||||||
|
* print("- Should face location = " + shouldFaceLocation);
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* location.locationChangeRequired.connect(onLocationChangeRequired);
|
||||||
|
*/
|
||||||
void locationChangeRequired(const glm::vec3& newPosition,
|
void locationChangeRequired(const glm::vec3& newPosition,
|
||||||
bool hasOrientationChange, const glm::quat& newOrientation,
|
bool hasOrientationChange, const glm::quat& newOrientation,
|
||||||
bool shouldFaceLocation);
|
bool shouldFaceLocation);
|
||||||
|
|
||||||
|
/**jsdoc
|
||||||
|
* Triggered when an attempt is made to send your avatar to a new named path on the domain (set in the domain server's
|
||||||
|
* settings). For example, when you enter a "/" followed by the path's name in the "GOTO" dialog.
|
||||||
|
* @function location.pathChangeRequired
|
||||||
|
* @param {string} path - The name of the path to go to.
|
||||||
|
* @returns {Signal}
|
||||||
|
* @example <caption>Report path change requests.</caption>
|
||||||
|
* function onPathChangeRequired(newPath) {
|
||||||
|
* print("onPathChangeRequired: newPath = " + newPath);
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* location.pathChangeRequired.connect(onPathChangeRequired);
|
||||||
|
*/
|
||||||
void pathChangeRequired(const QString& newPath);
|
void pathChangeRequired(const QString& newPath);
|
||||||
|
|
||||||
|
/**jsdoc
|
||||||
|
* Triggered when you navigate to a new domain.
|
||||||
|
* @function location.hostChanged
|
||||||
|
* @param {string} hostname - The new domain's host name.
|
||||||
|
* @returns {Signal}
|
||||||
|
* @example <caption>Report when you navigate to a new domain.</caption>
|
||||||
|
* function onHostChanged(host) {
|
||||||
|
* print("Host changed to: " + host);
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* location.hostChanged.connect(onHostChanged);
|
||||||
|
*/
|
||||||
void hostChanged(const QString& newHost);
|
void hostChanged(const QString& newHost);
|
||||||
|
|
||||||
|
/**jsdoc
|
||||||
|
* Triggered when there's a change in whether or not there's a previous location that can be navigated to using
|
||||||
|
* {@link location.goBack|goBack}. (Reflects changes in the state of the "Goto" dialog's back arrow.)
|
||||||
|
* @function location.goBackPossible
|
||||||
|
* @param {boolean} isPossible - <code>true</code> if there's a previous location to navigate to, otherwise
|
||||||
|
* <code>false</code>.
|
||||||
|
* @returns {Signal}
|
||||||
|
* @example <caption>Report when ability to navigate back changes.</caption>
|
||||||
|
* function onGoBackPossible(isPossible) {
|
||||||
|
* print("Go back possible: " + isPossible);
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* location.goBackPossible.connect(onGoBackPossible);
|
||||||
|
*/
|
||||||
void goBackPossible(bool isPossible);
|
void goBackPossible(bool isPossible);
|
||||||
|
|
||||||
|
/**jsdoc
|
||||||
|
* Triggered when there's a change in whether or not there's a forward location that can be navigated to using
|
||||||
|
* {@link location.goForward|goForward}. (Reflects changes in the state of the "Goto" dialog's forward arrow.)
|
||||||
|
* @function location.goForwardPossible
|
||||||
|
* @param {boolean} isPossible - <code>true</code> if there's a forward location to navigate to, otherwise
|
||||||
|
* <code>false</code>.
|
||||||
|
* @returns {Signal}
|
||||||
|
* @example <caption>Report when ability to navigate forward changes.</caption>
|
||||||
|
* function onGoForwardPossible(isPossible) {
|
||||||
|
* print("Go forward possible: " + isPossible);
|
||||||
|
* }
|
||||||
|
*
|
||||||
|
* location.goForwardPossible.connect(onGoForwardPossible);
|
||||||
|
*/
|
||||||
void goForwardPossible(bool isPossible);
|
void goForwardPossible(bool isPossible);
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue