mirror of
https://github.com/JulianGro/overte.git
synced 2025-04-29 19:02:55 +02:00
Merge branch 'master' of https://github.com/highfidelity/hifi into hdr
This commit is contained in:
commit
cab699464e
29 changed files with 288 additions and 95 deletions
|
@ -175,9 +175,6 @@ AssignmentClient::~AssignmentClient() {
|
||||||
|
|
||||||
void AssignmentClient::aboutToQuit() {
|
void AssignmentClient::aboutToQuit() {
|
||||||
stopAssignmentClient();
|
stopAssignmentClient();
|
||||||
|
|
||||||
// clear the log handler so that Qt doesn't call the destructor on LogHandler
|
|
||||||
qInstallMessageHandler(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AssignmentClient::setUpStatusToMonitor() {
|
void AssignmentClient::setUpStatusToMonitor() {
|
||||||
|
|
|
@ -45,9 +45,6 @@ AssignmentClientApp::AssignmentClientApp(int argc, char* argv[]) :
|
||||||
setApplicationName("assignment-client");
|
setApplicationName("assignment-client");
|
||||||
setApplicationVersion(BuildInfo::VERSION);
|
setApplicationVersion(BuildInfo::VERSION);
|
||||||
|
|
||||||
// use the verbose message handler in Logging
|
|
||||||
qInstallMessageHandler(LogHandler::verboseMessageHandler);
|
|
||||||
|
|
||||||
// parse command-line
|
// parse command-line
|
||||||
QCommandLineParser parser;
|
QCommandLineParser parser;
|
||||||
parser.setApplicationDescription("High Fidelity Assignment Client");
|
parser.setApplicationDescription("High Fidelity Assignment Client");
|
||||||
|
|
|
@ -126,9 +126,6 @@ void AssignmentClientMonitor::stopChildProcesses() {
|
||||||
|
|
||||||
void AssignmentClientMonitor::aboutToQuit() {
|
void AssignmentClientMonitor::aboutToQuit() {
|
||||||
stopChildProcesses();
|
stopChildProcesses();
|
||||||
|
|
||||||
// clear the log handler so that Qt doesn't call the destructor on LogHandler
|
|
||||||
qInstallMessageHandler(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AssignmentClientMonitor::spawnChildClient() {
|
void AssignmentClientMonitor::spawnChildClient() {
|
||||||
|
|
|
@ -9,8 +9,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 <QtCore/QDebug>
|
#include <LogHandler.h>
|
||||||
|
|
||||||
#include <SharedUtil.h>
|
#include <SharedUtil.h>
|
||||||
|
|
||||||
#include "AssignmentClientApp.h"
|
#include "AssignmentClientApp.h"
|
||||||
|
@ -18,10 +17,14 @@
|
||||||
int main(int argc, char* argv[]) {
|
int main(int argc, char* argv[]) {
|
||||||
disableQtBearerPoll(); // Fixes wifi ping spikes
|
disableQtBearerPoll(); // Fixes wifi ping spikes
|
||||||
|
|
||||||
|
qInstallMessageHandler(LogHandler::verboseMessageHandler);
|
||||||
|
qInfo() << "Starting.";
|
||||||
|
|
||||||
AssignmentClientApp app(argc, argv);
|
AssignmentClientApp app(argc, argv);
|
||||||
|
|
||||||
int acReturn = app.exec();
|
int acReturn = app.exec();
|
||||||
qDebug() << "assignment-client process" << app.applicationPid() << "exiting with status code" << acReturn;
|
qDebug() << "assignment-client process" << app.applicationPid() << "exiting with status code" << acReturn;
|
||||||
|
|
||||||
|
qInfo() << "Quitting.";
|
||||||
return acReturn;
|
return acReturn;
|
||||||
}
|
}
|
||||||
|
|
|
@ -72,13 +72,10 @@ DomainServer::DomainServer(int argc, char* argv[]) :
|
||||||
_iceServerPort(ICE_SERVER_DEFAULT_PORT)
|
_iceServerPort(ICE_SERVER_DEFAULT_PORT)
|
||||||
{
|
{
|
||||||
parseCommandLine();
|
parseCommandLine();
|
||||||
qInstallMessageHandler(LogHandler::verboseMessageHandler);
|
|
||||||
|
|
||||||
LogUtils::init();
|
LogUtils::init();
|
||||||
Setting::init();
|
Setting::init();
|
||||||
|
|
||||||
connect(this, &QCoreApplication::aboutToQuit, this, &DomainServer::aboutToQuit);
|
|
||||||
|
|
||||||
setOrganizationName(BuildInfo::MODIFIED_ORGANIZATION);
|
setOrganizationName(BuildInfo::MODIFIED_ORGANIZATION);
|
||||||
setOrganizationDomain("highfidelity.io");
|
setOrganizationDomain("highfidelity.io");
|
||||||
setApplicationName("domain-server");
|
setApplicationName("domain-server");
|
||||||
|
@ -211,6 +208,7 @@ void DomainServer::parseCommandLine() {
|
||||||
}
|
}
|
||||||
|
|
||||||
DomainServer::~DomainServer() {
|
DomainServer::~DomainServer() {
|
||||||
|
qInfo() << "Domain Server is shutting down.";
|
||||||
// destroy the LimitedNodeList before the DomainServer QCoreApplication is down
|
// destroy the LimitedNodeList before the DomainServer QCoreApplication is down
|
||||||
DependencyManager::destroy<LimitedNodeList>();
|
DependencyManager::destroy<LimitedNodeList>();
|
||||||
}
|
}
|
||||||
|
@ -223,12 +221,6 @@ void DomainServer::queuedQuit(QString quitMessage, int exitCode) {
|
||||||
QCoreApplication::exit(exitCode);
|
QCoreApplication::exit(exitCode);
|
||||||
}
|
}
|
||||||
|
|
||||||
void DomainServer::aboutToQuit() {
|
|
||||||
|
|
||||||
// clear the log handler so that Qt doesn't call the destructor on LogHandler
|
|
||||||
qInstallMessageHandler(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
void DomainServer::restart() {
|
void DomainServer::restart() {
|
||||||
qDebug() << "domain-server is restarting.";
|
qDebug() << "domain-server is restarting.";
|
||||||
|
|
||||||
|
|
|
@ -72,8 +72,6 @@ public slots:
|
||||||
void processICEServerHeartbeatACK(QSharedPointer<ReceivedMessage> message);
|
void processICEServerHeartbeatACK(QSharedPointer<ReceivedMessage> message);
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
void aboutToQuit();
|
|
||||||
|
|
||||||
void setupPendingAssignmentCredits();
|
void setupPendingAssignmentCredits();
|
||||||
void sendPendingTransactionsToServer();
|
void sendPendingTransactionsToServer();
|
||||||
|
|
||||||
|
@ -150,13 +148,9 @@ private:
|
||||||
|
|
||||||
bool isAuthenticatedRequest(HTTPConnection* connection, const QUrl& url);
|
bool isAuthenticatedRequest(HTTPConnection* connection, const QUrl& url);
|
||||||
|
|
||||||
void handleTokenRequestFinished();
|
|
||||||
QNetworkReply* profileRequestGivenTokenReply(QNetworkReply* tokenReply);
|
QNetworkReply* profileRequestGivenTokenReply(QNetworkReply* tokenReply);
|
||||||
void handleProfileRequestFinished();
|
|
||||||
Headers setupCookieHeadersFromProfileReply(QNetworkReply* profileReply);
|
Headers setupCookieHeadersFromProfileReply(QNetworkReply* profileReply);
|
||||||
|
|
||||||
void loadExistingSessionsFromSettings();
|
|
||||||
|
|
||||||
QJsonObject jsonForSocket(const HifiSockAddr& socket);
|
QJsonObject jsonForSocket(const HifiSockAddr& socket);
|
||||||
QJsonObject jsonObjectForNode(const SharedNodePointer& node);
|
QJsonObject jsonObjectForNode(const SharedNodePointer& node);
|
||||||
|
|
||||||
|
|
|
@ -15,8 +15,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 <QtCore/QCoreApplication>
|
|
||||||
|
|
||||||
#include <LogHandler.h>
|
#include <LogHandler.h>
|
||||||
#include <SharedUtil.h>
|
#include <SharedUtil.h>
|
||||||
|
|
||||||
|
@ -29,6 +27,9 @@ int main(int argc, char* argv[]) {
|
||||||
setvbuf(stdout, NULL, _IOLBF, 0);
|
setvbuf(stdout, NULL, _IOLBF, 0);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
qInstallMessageHandler(LogHandler::verboseMessageHandler);
|
||||||
|
qInfo() << "Starting.";
|
||||||
|
|
||||||
int currentExitCode = 0;
|
int currentExitCode = 0;
|
||||||
|
|
||||||
// use a do-while to handle domain-server restart
|
// use a do-while to handle domain-server restart
|
||||||
|
@ -37,7 +38,7 @@ int main(int argc, char* argv[]) {
|
||||||
currentExitCode = domainServer.exec();
|
currentExitCode = domainServer.exec();
|
||||||
} while (currentExitCode == DomainServer::EXIT_CODE_REBOOT);
|
} while (currentExitCode == DomainServer::EXIT_CODE_REBOOT);
|
||||||
|
|
||||||
|
qInfo() << "Quitting.";
|
||||||
return currentExitCode;
|
return currentExitCode;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -21,6 +21,7 @@ int main(int argc, char* argv[]) {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
qInstallMessageHandler(LogHandler::verboseMessageHandler);
|
qInstallMessageHandler(LogHandler::verboseMessageHandler);
|
||||||
|
qInfo() << "Starting.";
|
||||||
|
|
||||||
IceServer iceServer(argc, argv);
|
IceServer iceServer(argc, argv);
|
||||||
return iceServer.exec();
|
return iceServer.exec();
|
||||||
|
|
|
@ -189,6 +189,15 @@ Item {
|
||||||
Column {
|
Column {
|
||||||
id: octreeCol
|
id: octreeCol
|
||||||
spacing: 4; x: 4; y: 4;
|
spacing: 4; x: 4; y: 4;
|
||||||
|
StatText {
|
||||||
|
text: " Frame timing:"
|
||||||
|
}
|
||||||
|
StatText {
|
||||||
|
text: " Batch: " + root.batchFrameTime.toFixed(1) + " ms"
|
||||||
|
}
|
||||||
|
StatText {
|
||||||
|
text: " GPU: " + root.gpuFrameTime.toFixed(1) + " ms"
|
||||||
|
}
|
||||||
StatText {
|
StatText {
|
||||||
text: "Triangles: " + root.triangles +
|
text: "Triangles: " + root.triangles +
|
||||||
" / Material Switches: " + root.materialSwitches
|
" / Material Switches: " + root.materialSwitches
|
||||||
|
|
|
@ -1238,7 +1238,10 @@ Application::Application(int& argc, char** argv, QElapsedTimer& startupTimer, bo
|
||||||
|
|
||||||
auto glInfo = getGLContextData();
|
auto glInfo = getGLContextData();
|
||||||
properties["gl_info"] = glInfo;
|
properties["gl_info"] = glInfo;
|
||||||
|
properties["gpu_used_memory"] = (int)BYTES_TO_MB(gpu::Context::getUsedGPUMemory());
|
||||||
properties["gpu_free_memory"] = (int)BYTES_TO_MB(gpu::Context::getFreeGPUMemory());
|
properties["gpu_free_memory"] = (int)BYTES_TO_MB(gpu::Context::getFreeGPUMemory());
|
||||||
|
properties["gpu_frame_time"] = (float)(qApp->getGPUContext()->getFrameTimerGPUAverage());
|
||||||
|
properties["batch_frame_time"] = (float)(qApp->getGPUContext()->getFrameTimerBatchAverage());
|
||||||
properties["ideal_thread_count"] = QThread::idealThreadCount();
|
properties["ideal_thread_count"] = QThread::idealThreadCount();
|
||||||
|
|
||||||
auto hmdHeadPose = getHMDSensorPose();
|
auto hmdHeadPose = getHMDSensorPose();
|
||||||
|
@ -1654,7 +1657,8 @@ Application::~Application() {
|
||||||
|
|
||||||
_window->deleteLater();
|
_window->deleteLater();
|
||||||
|
|
||||||
qInstallMessageHandler(nullptr); // NOTE: Do this as late as possible so we continue to get our log messages
|
// Can't log to file passed this point, FileLogger about to be deleted
|
||||||
|
qInstallMessageHandler(LogHandler::verboseMessageHandler);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Application::initializeGL() {
|
void Application::initializeGL() {
|
||||||
|
@ -3378,8 +3382,9 @@ void Application::loadSettings() {
|
||||||
// If there is a preferred plugin, we probably messed it up with the menu settings, so fix it.
|
// If there is a preferred plugin, we probably messed it up with the menu settings, so fix it.
|
||||||
auto pluginManager = PluginManager::getInstance();
|
auto pluginManager = PluginManager::getInstance();
|
||||||
auto plugins = pluginManager->getPreferredDisplayPlugins();
|
auto plugins = pluginManager->getPreferredDisplayPlugins();
|
||||||
for (auto plugin : plugins) {
|
|
||||||
auto menu = Menu::getInstance();
|
auto menu = Menu::getInstance();
|
||||||
|
if (plugins.size() > 0) {
|
||||||
|
for (auto plugin : plugins) {
|
||||||
if (auto action = menu->getActionForOption(plugin->getName())) {
|
if (auto action = menu->getActionForOption(plugin->getName())) {
|
||||||
action->setChecked(true);
|
action->setChecked(true);
|
||||||
action->trigger();
|
action->trigger();
|
||||||
|
@ -3387,6 +3392,23 @@ void Application::loadSettings() {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
// If this is our first run, and no preferred devices were set, default to
|
||||||
|
// an HMD device if available.
|
||||||
|
Setting::Handle<bool> firstRun { Settings::firstRun, true };
|
||||||
|
if (firstRun.get()) {
|
||||||
|
auto displayPlugins = pluginManager->getDisplayPlugins();
|
||||||
|
for (auto& plugin : displayPlugins) {
|
||||||
|
if (plugin->isHmd()) {
|
||||||
|
if (auto action = menu->getActionForOption(plugin->getName())) {
|
||||||
|
action->setChecked(true);
|
||||||
|
action->trigger();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
auto inputs = pluginManager->getInputPlugins();
|
auto inputs = pluginManager->getInputPlugins();
|
||||||
for (auto plugin : inputs) {
|
for (auto plugin : inputs) {
|
||||||
|
|
|
@ -290,6 +290,12 @@ void Stats::updateStats(bool force) {
|
||||||
STAT_UPDATE(sendingMode, sendingModeResult);
|
STAT_UPDATE(sendingMode, sendingModeResult);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
auto gpuContext = qApp->getGPUContext();
|
||||||
|
|
||||||
|
// Update Frame timing (in ms)
|
||||||
|
STAT_UPDATE(gpuFrameTime, (float)gpuContext->getFrameTimerGPUAverage());
|
||||||
|
STAT_UPDATE(batchFrameTime, (float)gpuContext->getFrameTimerBatchAverage());
|
||||||
|
|
||||||
STAT_UPDATE(gpuBuffers, (int)gpu::Context::getBufferGPUCount());
|
STAT_UPDATE(gpuBuffers, (int)gpu::Context::getBufferGPUCount());
|
||||||
STAT_UPDATE(gpuBufferMemory, (int)BYTES_TO_MB(gpu::Context::getBufferGPUMemoryUsage()));
|
STAT_UPDATE(gpuBufferMemory, (int)BYTES_TO_MB(gpu::Context::getBufferGPUMemoryUsage()));
|
||||||
STAT_UPDATE(gpuTextures, (int)gpu::Context::getTextureGPUCount());
|
STAT_UPDATE(gpuTextures, (int)gpu::Context::getTextureGPUCount());
|
||||||
|
@ -302,7 +308,7 @@ void Stats::updateStats(bool force) {
|
||||||
STAT_UPDATE(gpuTextureVirtualMemory, (int)BYTES_TO_MB(gpu::Texture::getTextureGPUVirtualMemoryUsage()));
|
STAT_UPDATE(gpuTextureVirtualMemory, (int)BYTES_TO_MB(gpu::Texture::getTextureGPUVirtualMemoryUsage()));
|
||||||
STAT_UPDATE(gpuTextureFramebufferMemory, (int)BYTES_TO_MB(gpu::Texture::getTextureGPUFramebufferMemoryUsage()));
|
STAT_UPDATE(gpuTextureFramebufferMemory, (int)BYTES_TO_MB(gpu::Texture::getTextureGPUFramebufferMemoryUsage()));
|
||||||
STAT_UPDATE(gpuTextureSparseMemory, (int)BYTES_TO_MB(gpu::Texture::getTextureGPUSparseMemoryUsage()));
|
STAT_UPDATE(gpuTextureSparseMemory, (int)BYTES_TO_MB(gpu::Texture::getTextureGPUSparseMemoryUsage()));
|
||||||
STAT_UPDATE(gpuSparseTextureEnabled, qApp->getGPUContext()->getBackend()->isTextureManagementSparseEnabled() ? 1 : 0);
|
STAT_UPDATE(gpuSparseTextureEnabled, gpuContext->getBackend()->isTextureManagementSparseEnabled() ? 1 : 0);
|
||||||
STAT_UPDATE(gpuFreeMemory, (int)BYTES_TO_MB(gpu::Context::getFreeGPUMemory()));
|
STAT_UPDATE(gpuFreeMemory, (int)BYTES_TO_MB(gpu::Context::getFreeGPUMemory()));
|
||||||
STAT_UPDATE(rectifiedTextureCount, (int)RECTIFIED_TEXTURE_COUNT.load());
|
STAT_UPDATE(rectifiedTextureCount, (int)RECTIFIED_TEXTURE_COUNT.load());
|
||||||
STAT_UPDATE(decimatedTextureCount, (int)DECIMATED_TEXTURE_COUNT.load());
|
STAT_UPDATE(decimatedTextureCount, (int)DECIMATED_TEXTURE_COUNT.load());
|
||||||
|
|
|
@ -101,6 +101,8 @@ class Stats : public QQuickItem {
|
||||||
STATS_PROPERTY(int, gpuTextureSparseMemory, 0)
|
STATS_PROPERTY(int, gpuTextureSparseMemory, 0)
|
||||||
STATS_PROPERTY(int, gpuSparseTextureEnabled, 0)
|
STATS_PROPERTY(int, gpuSparseTextureEnabled, 0)
|
||||||
STATS_PROPERTY(int, gpuFreeMemory, 0)
|
STATS_PROPERTY(int, gpuFreeMemory, 0)
|
||||||
|
STATS_PROPERTY(float, gpuFrameTime, 0)
|
||||||
|
STATS_PROPERTY(float, batchFrameTime, 0)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
static Stats* getInstance();
|
static Stats* getInstance();
|
||||||
|
@ -198,6 +200,8 @@ signals:
|
||||||
void gpuTextureSparseMemoryChanged();
|
void gpuTextureSparseMemoryChanged();
|
||||||
void gpuSparseTextureEnabledChanged();
|
void gpuSparseTextureEnabledChanged();
|
||||||
void gpuFreeMemoryChanged();
|
void gpuFreeMemoryChanged();
|
||||||
|
void gpuFrameTimeChanged();
|
||||||
|
void batchFrameTimeChanged();
|
||||||
void rectifiedTextureCountChanged();
|
void rectifiedTextureCountChanged();
|
||||||
void decimatedTextureCountChanged();
|
void decimatedTextureCountChanged();
|
||||||
|
|
||||||
|
|
|
@ -228,9 +228,7 @@ void AnimSkeleton::buildSkeletonFromJoints(const std::vector<FBXJoint>& joints)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifndef NDEBUG
|
void AnimSkeleton::dump(bool verbose) const {
|
||||||
#define DUMP_FBX_JOINTS
|
|
||||||
void AnimSkeleton::dump() const {
|
|
||||||
qCDebug(animation) << "[";
|
qCDebug(animation) << "[";
|
||||||
for (int i = 0; i < getNumJoints(); i++) {
|
for (int i = 0; i < getNumJoints(); i++) {
|
||||||
qCDebug(animation) << " {";
|
qCDebug(animation) << " {";
|
||||||
|
@ -240,7 +238,7 @@ void AnimSkeleton::dump() const {
|
||||||
qCDebug(animation) << " relBindPose =" << getRelativeBindPose(i);
|
qCDebug(animation) << " relBindPose =" << getRelativeBindPose(i);
|
||||||
qCDebug(animation) << " absDefaultPose =" << getAbsoluteDefaultPose(i);
|
qCDebug(animation) << " absDefaultPose =" << getAbsoluteDefaultPose(i);
|
||||||
qCDebug(animation) << " relDefaultPose =" << getRelativeDefaultPose(i);
|
qCDebug(animation) << " relDefaultPose =" << getRelativeDefaultPose(i);
|
||||||
#ifdef DUMP_FBX_JOINTS
|
if (verbose) {
|
||||||
qCDebug(animation) << " fbxJoint =";
|
qCDebug(animation) << " fbxJoint =";
|
||||||
qCDebug(animation) << " isFree =" << _joints[i].isFree;
|
qCDebug(animation) << " isFree =" << _joints[i].isFree;
|
||||||
qCDebug(animation) << " freeLineage =" << _joints[i].freeLineage;
|
qCDebug(animation) << " freeLineage =" << _joints[i].freeLineage;
|
||||||
|
@ -257,7 +255,7 @@ void AnimSkeleton::dump() const {
|
||||||
qCDebug(animation) << " inverseBindRotation" << _joints[i].inverseBindRotation;
|
qCDebug(animation) << " inverseBindRotation" << _joints[i].inverseBindRotation;
|
||||||
qCDebug(animation) << " bindTransform" << _joints[i].bindTransform;
|
qCDebug(animation) << " bindTransform" << _joints[i].bindTransform;
|
||||||
qCDebug(animation) << " isSkeletonJoint" << _joints[i].isSkeletonJoint;
|
qCDebug(animation) << " isSkeletonJoint" << _joints[i].isSkeletonJoint;
|
||||||
#endif
|
}
|
||||||
if (getParentIndex(i) >= 0) {
|
if (getParentIndex(i) >= 0) {
|
||||||
qCDebug(animation) << " parent =" << getJointName(getParentIndex(i));
|
qCDebug(animation) << " parent =" << getJointName(getParentIndex(i));
|
||||||
}
|
}
|
||||||
|
@ -284,4 +282,4 @@ void AnimSkeleton::dump(const AnimPoseVec& poses) const {
|
||||||
}
|
}
|
||||||
qCDebug(animation) << "]";
|
qCDebug(animation) << "]";
|
||||||
}
|
}
|
||||||
#endif
|
|
||||||
|
|
|
@ -63,10 +63,8 @@ public:
|
||||||
void mirrorRelativePoses(AnimPoseVec& poses) const;
|
void mirrorRelativePoses(AnimPoseVec& poses) const;
|
||||||
void mirrorAbsolutePoses(AnimPoseVec& poses) const;
|
void mirrorAbsolutePoses(AnimPoseVec& poses) const;
|
||||||
|
|
||||||
#ifndef NDEBUG
|
void dump(bool verbose) const;
|
||||||
void dump() const;
|
|
||||||
void dump(const AnimPoseVec& poses) const;
|
void dump(const AnimPoseVec& poses) const;
|
||||||
#endif
|
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
void buildSkeletonFromJoints(const std::vector<FBXJoint>& joints);
|
void buildSkeletonFromJoints(const std::vector<FBXJoint>& joints);
|
||||||
|
|
|
@ -34,6 +34,10 @@ void Context::beginFrame(const glm::mat4& renderPose) {
|
||||||
_frameActive = true;
|
_frameActive = true;
|
||||||
_currentFrame = std::make_shared<Frame>();
|
_currentFrame = std::make_shared<Frame>();
|
||||||
_currentFrame->pose = renderPose;
|
_currentFrame->pose = renderPose;
|
||||||
|
|
||||||
|
if (!_frameRangeTimer) {
|
||||||
|
_frameRangeTimer = std::make_shared<RangeTimer>();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void Context::appendFrameBatch(Batch& batch) {
|
void Context::appendFrameBatch(Batch& batch) {
|
||||||
|
@ -73,10 +77,18 @@ void Context::executeFrame(const FramePointer& frame) const {
|
||||||
consumeFrameUpdates(frame);
|
consumeFrameUpdates(frame);
|
||||||
_backend->setStereoState(frame->stereoState);
|
_backend->setStereoState(frame->stereoState);
|
||||||
{
|
{
|
||||||
|
Batch beginBatch;
|
||||||
|
_frameRangeTimer->begin(beginBatch);
|
||||||
|
_backend->render(beginBatch);
|
||||||
|
|
||||||
// Execute the frame rendering commands
|
// Execute the frame rendering commands
|
||||||
for (auto& batch : frame->batches) {
|
for (auto& batch : frame->batches) {
|
||||||
_backend->render(batch);
|
_backend->render(batch);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Batch endBatch;
|
||||||
|
_frameRangeTimer->end(endBatch);
|
||||||
|
_backend->render(endBatch);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -127,6 +139,20 @@ void Context::getStats(ContextStats& stats) const {
|
||||||
_backend->getStats(stats);
|
_backend->getStats(stats);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
double Context::getFrameTimerGPUAverage() const {
|
||||||
|
if (_frameRangeTimer) {
|
||||||
|
return _frameRangeTimer->getGPUAverage();
|
||||||
|
}
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
double Context::getFrameTimerBatchAverage() const {
|
||||||
|
if (_frameRangeTimer) {
|
||||||
|
return _frameRangeTimer->getBatchAverage();
|
||||||
|
}
|
||||||
|
return 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
const Backend::TransformCamera& Backend::TransformCamera::recomputeDerived(const Transform& xformView) const {
|
const Backend::TransformCamera& Backend::TransformCamera::recomputeDerived(const Transform& xformView) const {
|
||||||
_projectionInverse = glm::inverse(_projection);
|
_projectionInverse = glm::inverse(_projection);
|
||||||
|
|
||||||
|
@ -183,6 +209,10 @@ Size Context::getFreeGPUMemory() {
|
||||||
return _freeGPUMemory.load();
|
return _freeGPUMemory.load();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Size Context::getUsedGPUMemory() {
|
||||||
|
return getTextureGPUMemoryUsage() + getBufferGPUMemoryUsage();
|
||||||
|
};
|
||||||
|
|
||||||
void Context::incrementBufferGPUCount() {
|
void Context::incrementBufferGPUCount() {
|
||||||
static std::atomic<uint32_t> max { 0 };
|
static std::atomic<uint32_t> max { 0 };
|
||||||
auto total = ++_bufferGPUCount;
|
auto total = ++_bufferGPUCount;
|
||||||
|
@ -349,3 +379,5 @@ void Backend::updateTextureGPUFramebufferMemoryUsage(Resource::Size prevObjectSi
|
||||||
void Backend::updateTextureGPUSparseMemoryUsage(Resource::Size prevObjectSize, Resource::Size newObjectSize) { Context::updateTextureGPUSparseMemoryUsage(prevObjectSize, newObjectSize); }
|
void Backend::updateTextureGPUSparseMemoryUsage(Resource::Size prevObjectSize, Resource::Size newObjectSize) { Context::updateTextureGPUSparseMemoryUsage(prevObjectSize, newObjectSize); }
|
||||||
void Backend::incrementTextureGPUTransferCount() { Context::incrementTextureGPUTransferCount(); }
|
void Backend::incrementTextureGPUTransferCount() { Context::incrementTextureGPUTransferCount(); }
|
||||||
void Backend::decrementTextureGPUTransferCount() { Context::decrementTextureGPUTransferCount(); }
|
void Backend::decrementTextureGPUTransferCount() { Context::decrementTextureGPUTransferCount(); }
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -205,12 +205,16 @@ public:
|
||||||
void getStats(ContextStats& stats) const;
|
void getStats(ContextStats& stats) const;
|
||||||
|
|
||||||
|
|
||||||
|
double getFrameTimerGPUAverage() const;
|
||||||
|
double getFrameTimerBatchAverage() const;
|
||||||
|
|
||||||
static uint32_t getBufferGPUCount();
|
static uint32_t getBufferGPUCount();
|
||||||
static Size getBufferGPUMemoryUsage();
|
static Size getBufferGPUMemoryUsage();
|
||||||
|
|
||||||
static uint32_t getTextureGPUCount();
|
static uint32_t getTextureGPUCount();
|
||||||
static uint32_t getTextureGPUSparseCount();
|
static uint32_t getTextureGPUSparseCount();
|
||||||
static Size getFreeGPUMemory();
|
static Size getFreeGPUMemory();
|
||||||
|
static Size getUsedGPUMemory();
|
||||||
static Size getTextureGPUMemoryUsage();
|
static Size getTextureGPUMemoryUsage();
|
||||||
static Size getTextureGPUVirtualMemoryUsage();
|
static Size getTextureGPUVirtualMemoryUsage();
|
||||||
static Size getTextureGPUFramebufferMemoryUsage();
|
static Size getTextureGPUFramebufferMemoryUsage();
|
||||||
|
@ -223,8 +227,12 @@ protected:
|
||||||
std::shared_ptr<Backend> _backend;
|
std::shared_ptr<Backend> _backend;
|
||||||
bool _frameActive { false };
|
bool _frameActive { false };
|
||||||
FramePointer _currentFrame;
|
FramePointer _currentFrame;
|
||||||
|
RangeTimerPointer _frameRangeTimer;
|
||||||
StereoState _stereo;
|
StereoState _stereo;
|
||||||
|
|
||||||
|
double getGPUAverage() const;
|
||||||
|
double getBatchAverage() const;
|
||||||
|
|
||||||
// This function can only be called by "static Shader::makeProgram()"
|
// This function can only be called by "static Shader::makeProgram()"
|
||||||
// makeProgramShader(...) make a program shader ready to be used in a Batch.
|
// makeProgramShader(...) make a program shader ready to be used in a Batch.
|
||||||
// It compiles the sub shaders, link them and defines the Slots and their bindings.
|
// It compiles the sub shaders, link them and defines the Slots and their bindings.
|
||||||
|
|
|
@ -10,17 +10,18 @@
|
||||||
// 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 <qcoreapplication.h>
|
|
||||||
|
|
||||||
#include <QDateTime>
|
|
||||||
#include <QDebug>
|
|
||||||
#include <QTimer>
|
|
||||||
#include <QThread>
|
|
||||||
#include <QMutexLocker>
|
|
||||||
#include <QRegExp>
|
|
||||||
|
|
||||||
#include "LogHandler.h"
|
#include "LogHandler.h"
|
||||||
|
|
||||||
|
#include <mutex>
|
||||||
|
|
||||||
|
#include <QtCore/QCoreApplication>
|
||||||
|
#include <QtCore/QDateTime>
|
||||||
|
#include <QtCore/QDebug>
|
||||||
|
#include <QtCore/QMutexLocker>
|
||||||
|
#include <QtCore/QRegExp>
|
||||||
|
#include <QtCore/QThread>
|
||||||
|
#include <QtCore/QTimer>
|
||||||
|
|
||||||
QMutex LogHandler::_mutex;
|
QMutex LogHandler::_mutex;
|
||||||
|
|
||||||
LogHandler& LogHandler::getInstance() {
|
LogHandler& LogHandler::getInstance() {
|
||||||
|
@ -28,16 +29,15 @@ LogHandler& LogHandler::getInstance() {
|
||||||
return staticInstance;
|
return staticInstance;
|
||||||
}
|
}
|
||||||
|
|
||||||
LogHandler::LogHandler()
|
LogHandler::LogHandler() {
|
||||||
{
|
|
||||||
// setup our timer to flush the verbose logs every 5 seconds
|
|
||||||
QTimer* logFlushTimer = new QTimer(this);
|
|
||||||
connect(logFlushTimer, &QTimer::timeout, this, &LogHandler::flushRepeatedMessages);
|
|
||||||
logFlushTimer->start(VERBOSE_LOG_INTERVAL_SECONDS * 1000);
|
|
||||||
|
|
||||||
// when the log handler is first setup we should print our timezone
|
// when the log handler is first setup we should print our timezone
|
||||||
QString timezoneString = "Time zone: " + QDateTime::currentDateTime().toString("t");
|
QString timezoneString = "Time zone: " + QDateTime::currentDateTime().toString("t");
|
||||||
printf("%s\n", qPrintable(timezoneString));
|
printMessage(LogMsgType::LogInfo, QMessageLogContext(), timezoneString);
|
||||||
|
}
|
||||||
|
|
||||||
|
LogHandler::~LogHandler() {
|
||||||
|
flushRepeatedMessages();
|
||||||
|
printMessage(LogMsgType::LogDebug, QMessageLogContext(), "LogHandler shutdown.");
|
||||||
}
|
}
|
||||||
|
|
||||||
const char* stringForLogType(LogMsgType msgType) {
|
const char* stringForLogType(LogMsgType msgType) {
|
||||||
|
@ -165,7 +165,7 @@ QString LogHandler::printMessage(LogMsgType type, const QMessageLogContext& cont
|
||||||
stringForLogType(type), context.category);
|
stringForLogType(type), context.category);
|
||||||
|
|
||||||
if (_shouldOutputProcessID) {
|
if (_shouldOutputProcessID) {
|
||||||
prefixString.append(QString(" [%1]").arg(QCoreApplication::instance()->applicationPid()));
|
prefixString.append(QString(" [%1]").arg(QCoreApplication::applicationPid()));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (_shouldOutputThreadID) {
|
if (_shouldOutputThreadID) {
|
||||||
|
@ -187,6 +187,14 @@ void LogHandler::verboseMessageHandler(QtMsgType type, const QMessageLogContext&
|
||||||
}
|
}
|
||||||
|
|
||||||
const QString& LogHandler::addRepeatedMessageRegex(const QString& regexString) {
|
const QString& LogHandler::addRepeatedMessageRegex(const QString& regexString) {
|
||||||
|
static std::once_flag once;
|
||||||
|
std::call_once(once, [&] {
|
||||||
|
// setup our timer to flush the verbose logs every 5 seconds
|
||||||
|
QTimer* logFlushTimer = new QTimer(this);
|
||||||
|
connect(logFlushTimer, &QTimer::timeout, this, &LogHandler::flushRepeatedMessages);
|
||||||
|
logFlushTimer->start(VERBOSE_LOG_INTERVAL_SECONDS * 1000);
|
||||||
|
});
|
||||||
|
|
||||||
QMutexLocker lock(&_mutex);
|
QMutexLocker lock(&_mutex);
|
||||||
return *_repeatedMessageRegexes.insert(regexString);
|
return *_repeatedMessageRegexes.insert(regexString);
|
||||||
}
|
}
|
||||||
|
|
|
@ -52,8 +52,10 @@ public:
|
||||||
|
|
||||||
const QString& addRepeatedMessageRegex(const QString& regexString);
|
const QString& addRepeatedMessageRegex(const QString& regexString);
|
||||||
const QString& addOnlyOnceMessageRegex(const QString& regexString);
|
const QString& addOnlyOnceMessageRegex(const QString& regexString);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
LogHandler();
|
LogHandler();
|
||||||
|
~LogHandler();
|
||||||
|
|
||||||
void flushRepeatedMessages();
|
void flushRepeatedMessages();
|
||||||
|
|
||||||
|
|
|
@ -9,8 +9,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 <QCoreApplication>
|
|
||||||
|
|
||||||
#include "ShutdownEventListener.h"
|
#include "ShutdownEventListener.h"
|
||||||
|
|
||||||
#ifdef Q_OS_WIN
|
#ifdef Q_OS_WIN
|
||||||
|
@ -19,6 +17,9 @@
|
||||||
#include <csignal>
|
#include <csignal>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <QtCore/QCoreApplication>
|
||||||
|
#include <QtCore/QDebug>
|
||||||
|
|
||||||
ShutdownEventListener& ShutdownEventListener::getInstance() {
|
ShutdownEventListener& ShutdownEventListener::getInstance() {
|
||||||
static ShutdownEventListener staticInstance;
|
static ShutdownEventListener staticInstance;
|
||||||
return staticInstance;
|
return staticInstance;
|
||||||
|
@ -29,9 +30,7 @@ void signalHandler(int param) {
|
||||||
QMetaObject::invokeMethod(qApp, "quit");
|
QMetaObject::invokeMethod(qApp, "quit");
|
||||||
}
|
}
|
||||||
|
|
||||||
ShutdownEventListener::ShutdownEventListener(QObject* parent) :
|
ShutdownEventListener::ShutdownEventListener(QObject* parent) : QObject(parent) {
|
||||||
QObject(parent)
|
|
||||||
{
|
|
||||||
#ifndef Q_OS_WIN
|
#ifndef Q_OS_WIN
|
||||||
// be a signal handler for SIGTERM so we can stop our children when we get it
|
// be a signal handler for SIGTERM so we can stop our children when we get it
|
||||||
signal(SIGTERM, signalHandler);
|
signal(SIGTERM, signalHandler);
|
||||||
|
|
|
@ -109,7 +109,8 @@ bool FilePersistThread::processQueueItems(const Queue& messages) {
|
||||||
}
|
}
|
||||||
|
|
||||||
FileLogger::FileLogger(QObject* parent) :
|
FileLogger::FileLogger(QObject* parent) :
|
||||||
AbstractLoggerInterface(parent), _fileName(getLogFilename())
|
AbstractLoggerInterface(parent),
|
||||||
|
_fileName(getLogFilename())
|
||||||
{
|
{
|
||||||
_persistThreadInstance = new FilePersistThread(*this);
|
_persistThreadInstance = new FilePersistThread(*this);
|
||||||
_persistThreadInstance->initialize(true, QThread::LowestPriority);
|
_persistThreadInstance->initialize(true, QThread::LowestPriority);
|
||||||
|
|
|
@ -24,7 +24,7 @@ public:
|
||||||
FileLogger(QObject* parent = NULL);
|
FileLogger(QObject* parent = NULL);
|
||||||
virtual ~FileLogger();
|
virtual ~FileLogger();
|
||||||
|
|
||||||
QString getFilename() { return _fileName; }
|
QString getFilename() const { return _fileName; }
|
||||||
virtual void addMessage(const QString&) override;
|
virtual void addMessage(const QString&) override;
|
||||||
virtual QString getLogData() override;
|
virtual QString getLogData() override;
|
||||||
virtual void locateLog() override;
|
virtual void locateLog() override;
|
||||||
|
|
|
@ -445,13 +445,11 @@ function hideUserDataTextArea() {
|
||||||
};
|
};
|
||||||
|
|
||||||
function showStaticUserData() {
|
function showStaticUserData() {
|
||||||
|
if (editor !== null) {
|
||||||
$('#static-userdata').show();
|
$('#static-userdata').show();
|
||||||
$('#static-userdata').css('height', $('#userdata-editor').height())
|
$('#static-userdata').css('height', $('#userdata-editor').height())
|
||||||
if (editor !== null) {
|
|
||||||
$('#static-userdata').text(editor.getText());
|
$('#static-userdata').text(editor.getText());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
function removeStaticUserData() {
|
function removeStaticUserData() {
|
||||||
|
|
|
@ -623,6 +623,7 @@ function checkNewContent() {
|
||||||
} else {
|
} else {
|
||||||
// They don't want to update, mark content set as current
|
// They don't want to update, mark content set as current
|
||||||
userConfig.set('homeContentLastModified', new Date());
|
userConfig.set('homeContentLastModified', new Date());
|
||||||
|
userConfig.save(configPath);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
@ -676,6 +677,7 @@ function maybeInstallDefaultContentSet(onComplete) {
|
||||||
}
|
}
|
||||||
log.debug('Copied home content over to: ' + getRootHifiDataDirectory());
|
log.debug('Copied home content over to: ' + getRootHifiDataDirectory());
|
||||||
userConfig.set('homeContentLastModified', new Date());
|
userConfig.set('homeContentLastModified', new Date());
|
||||||
|
userConfig.save(configPath);
|
||||||
onComplete();
|
onComplete();
|
||||||
});
|
});
|
||||||
return;
|
return;
|
||||||
|
@ -756,6 +758,7 @@ function maybeInstallDefaultContentSet(onComplete) {
|
||||||
// response and decompression complete, return
|
// response and decompression complete, return
|
||||||
log.debug("Finished unarchiving home content set");
|
log.debug("Finished unarchiving home content set");
|
||||||
userConfig.set('homeContentLastModified', new Date());
|
userConfig.set('homeContentLastModified', new Date());
|
||||||
|
userConfig.save(configPath);
|
||||||
sendStateUpdate('complete');
|
sendStateUpdate('complete');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -766,6 +769,7 @@ function maybeInstallDefaultContentSet(onComplete) {
|
||||||
});
|
});
|
||||||
|
|
||||||
userConfig.set('hasRun', true);
|
userConfig.set('hasRun', true);
|
||||||
|
userConfig.save(configPath);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -13,3 +13,7 @@ set_target_properties(ice-client PROPERTIES FOLDER "Tools")
|
||||||
|
|
||||||
add_subdirectory(ac-client)
|
add_subdirectory(ac-client)
|
||||||
set_target_properties(ac-client PROPERTIES FOLDER "Tools")
|
set_target_properties(ac-client PROPERTIES FOLDER "Tools")
|
||||||
|
|
||||||
|
add_subdirectory(skeleton-dump)
|
||||||
|
set_target_properties(skeleton-dump PROPERTIES FOLDER "Tools")
|
||||||
|
|
||||||
|
|
4
tools/skeleton-dump/CMakeLists.txt
Normal file
4
tools/skeleton-dump/CMakeLists.txt
Normal file
|
@ -0,0 +1,4 @@
|
||||||
|
set(TARGET_NAME skeleton-dump)
|
||||||
|
setup_hifi_project(Core Widgets)
|
||||||
|
link_hifi_libraries(shared fbx model gpu gl animation)
|
||||||
|
|
63
tools/skeleton-dump/src/SkeletonDumpApp.cpp
Normal file
63
tools/skeleton-dump/src/SkeletonDumpApp.cpp
Normal file
|
@ -0,0 +1,63 @@
|
||||||
|
//
|
||||||
|
// SkeletonDumpApp.cpp
|
||||||
|
// tools/skeleton-dump/src
|
||||||
|
//
|
||||||
|
// Created by Anthony Thibault on 11/4/16.
|
||||||
|
// Copyright 2016 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 "SkeletonDumpApp.h"
|
||||||
|
#include <QCommandLineParser>
|
||||||
|
#include <QFile>
|
||||||
|
#include <FBXReader.h>
|
||||||
|
#include <AnimSkeleton.h>
|
||||||
|
|
||||||
|
SkeletonDumpApp::SkeletonDumpApp(int argc, char* argv[]) : QCoreApplication(argc, argv) {
|
||||||
|
|
||||||
|
// parse command-line
|
||||||
|
QCommandLineParser parser;
|
||||||
|
parser.setApplicationDescription("High Fidelity FBX Skeleton Analyzer");
|
||||||
|
const QCommandLineOption helpOption = parser.addHelpOption();
|
||||||
|
|
||||||
|
const QCommandLineOption verboseOutput("v", "verbose output");
|
||||||
|
parser.addOption(verboseOutput);
|
||||||
|
|
||||||
|
const QCommandLineOption inputFilenameOption("i", "input file", "filename.fbx");
|
||||||
|
parser.addOption(inputFilenameOption);
|
||||||
|
|
||||||
|
if (!parser.parse(QCoreApplication::arguments())) {
|
||||||
|
qCritical() << parser.errorText() << endl;
|
||||||
|
parser.showHelp();
|
||||||
|
_returnCode = 1;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (parser.isSet(helpOption)) {
|
||||||
|
parser.showHelp();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool verbose = parser.isSet(verboseOutput);
|
||||||
|
|
||||||
|
QString inputFilename;
|
||||||
|
if (parser.isSet(inputFilenameOption)) {
|
||||||
|
inputFilename = parser.value(inputFilenameOption);
|
||||||
|
}
|
||||||
|
|
||||||
|
QFile file(inputFilename);
|
||||||
|
if (!file.open(QIODevice::ReadOnly)) {
|
||||||
|
qCritical() << "Failed to open file " << inputFilename;
|
||||||
|
_returnCode = 2;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
QByteArray blob = file.readAll();
|
||||||
|
std::unique_ptr<FBXGeometry> fbxGeometry(readFBX(blob, QVariantHash()));
|
||||||
|
std::unique_ptr<AnimSkeleton> skeleton(new AnimSkeleton(*fbxGeometry));
|
||||||
|
skeleton->dump(verbose);
|
||||||
|
}
|
||||||
|
|
||||||
|
SkeletonDumpApp::~SkeletonDumpApp() {
|
||||||
|
}
|
29
tools/skeleton-dump/src/SkeletonDumpApp.h
Normal file
29
tools/skeleton-dump/src/SkeletonDumpApp.h
Normal file
|
@ -0,0 +1,29 @@
|
||||||
|
//
|
||||||
|
// SkeletonDumpApp.h
|
||||||
|
// tools/skeleton-dump/src
|
||||||
|
//
|
||||||
|
// Created by Anthony Thibault on 11/4/16.
|
||||||
|
// Copyright 2016 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_SkeletonDumpApp_h
|
||||||
|
#define hifi_SkeletonDumpApp_h
|
||||||
|
|
||||||
|
#include <QApplication>
|
||||||
|
|
||||||
|
class SkeletonDumpApp : public QCoreApplication {
|
||||||
|
Q_OBJECT
|
||||||
|
public:
|
||||||
|
SkeletonDumpApp(int argc, char* argv[]);
|
||||||
|
~SkeletonDumpApp();
|
||||||
|
|
||||||
|
int getReturnCode() const { return _returnCode; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
int _returnCode { 0 };
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif //hifi_SkeletonDumpApp_h
|
22
tools/skeleton-dump/src/main.cpp
Normal file
22
tools/skeleton-dump/src/main.cpp
Normal file
|
@ -0,0 +1,22 @@
|
||||||
|
//
|
||||||
|
// main.cpp
|
||||||
|
// tools/skeleton-dump/src
|
||||||
|
//
|
||||||
|
// Created by Anthony Thibault on 11/4/16.
|
||||||
|
// Copyright 2016 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 <iostream>
|
||||||
|
#include <iomanip>
|
||||||
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
#include <QDebug>
|
||||||
|
|
||||||
|
#include "SkeletonDumpApp.h"
|
||||||
|
|
||||||
|
int main(int argc, char * argv[]) {
|
||||||
|
SkeletonDumpApp app(argc, argv);
|
||||||
|
return app.getReturnCode();
|
||||||
|
}
|
|
@ -233,7 +233,7 @@ function playSuccessSound() {
|
||||||
function playFirecrackerSound(position) {
|
function playFirecrackerSound(position) {
|
||||||
Audio.playSound(firecrackerSound, {
|
Audio.playSound(firecrackerSound, {
|
||||||
position: position,
|
position: position,
|
||||||
volume: 0.7,
|
volume: 0.5,
|
||||||
loop: false
|
loop: false
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue