Merge branch 'master' of https://github.com/highfidelity/hifi into StandaloneTags

This commit is contained in:
Roxanne Skelly 2019-02-14 10:22:07 -08:00
commit ab1a691dc9
114 changed files with 442 additions and 120 deletions

View file

@ -111,7 +111,7 @@ bool EntityTreeSendThread::traverseTreeAndSendContents(SharedNodePointer node, O
int32_t lodLevelOffset = nodeData->getBoundaryLevelAdjust() + (viewFrustumChanged ? LOW_RES_MOVING_ADJUST : NO_BOUNDARY_ADJUST);
newView.lodScaleFactor = powf(2.0f, lodLevelOffset);
startNewTraversal(newView, root);
startNewTraversal(newView, root, isFullScene);
// When the viewFrustum changed the sort order may be incorrect, so we re-sort
// and also use the opportunity to cull anything no longer in view
@ -220,9 +220,10 @@ bool EntityTreeSendThread::addDescendantsToExtraFlaggedEntities(const QUuid& fil
return hasNewChild || hasNewDescendants;
}
void EntityTreeSendThread::startNewTraversal(const DiffTraversal::View& view, EntityTreeElementPointer root) {
void EntityTreeSendThread::startNewTraversal(const DiffTraversal::View& view, EntityTreeElementPointer root,
bool forceFirstPass) {
DiffTraversal::Type type = _traversal.prepareNewTraversal(view, root);
DiffTraversal::Type type = _traversal.prepareNewTraversal(view, root, forceFirstPass);
// there are three types of traversal:
//
// (1) FirstTime = at login --> find everything in view

View file

@ -42,7 +42,7 @@ private:
bool addAncestorsToExtraFlaggedEntities(const QUuid& filteredEntityID, EntityItem& entityItem, EntityNodeData& nodeData);
bool addDescendantsToExtraFlaggedEntities(const QUuid& filteredEntityID, EntityItem& entityItem, EntityNodeData& nodeData);
void startNewTraversal(const DiffTraversal::View& viewFrustum, EntityTreeElementPointer root);
void startNewTraversal(const DiffTraversal::View& viewFrustum, EntityTreeElementPointer root, bool forceFirstPass = false);
bool traverseTreeAndBuildNextPacketPayload(EncodeBitstreamParams& params, const QJsonObject& jsonFilters) override;
void preDistributionProcessing() override;

View file

@ -20,7 +20,8 @@
*
* @hifi-interface
* @hifi-client-entity
*
* @hifi-avatar
*
* @property {string} buildDate
* @property {string} buildVersion
* @property {string} qtVersion

View file

@ -21,6 +21,7 @@
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*
*/

View file

@ -36,6 +36,7 @@ class AABox;
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*
* @property {number} presentTime <em>Read-only.</em>
* @property {number} engineRunTime <em>Read-only.</em>

View file

@ -21,6 +21,7 @@
*
* @hifi-client-entity
* @hifi-interface
* @hifi-avatar
*/
class LocationBookmarks : public Bookmarks, public Dependency {

View file

@ -27,6 +27,7 @@
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*/
class SpeechRecognizer : public QObject, public Dependency {
Q_OBJECT

View file

@ -31,6 +31,7 @@ class AudioScope : public QObject, public Dependency {
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*
* @property {number} scopeInput <em>Read-only.</em>
* @property {number} scopeOutputLeft <em>Read-only.</em>

View file

@ -46,6 +46,7 @@ using SortedAvatar = std::pair<float, std::shared_ptr<Avatar>>;
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*
* @borrows AvatarList.getAvatarIdentifiers as getAvatarIdentifiers
* @borrows AvatarList.getAvatarsInRange as getAvatarsInRange

View file

@ -66,6 +66,7 @@ class MyAvatar : public Avatar {
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*
* @property {Vec3} qmlPosition - A synonym for <code>position</code> for use by QML.
* @property {boolean} shouldRenderLocally=true - If <code>true</code> then your avatar is rendered for you in Interface,

View file

@ -32,6 +32,7 @@
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*/
class DdeFaceTracker : public FaceTracker, public Dependency {

View file

@ -27,6 +27,7 @@ class LaserPointerScriptingInterface : public QObject, public Dependency {
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*/
public:

View file

@ -23,6 +23,7 @@
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*
* @property {number} PICK_ENTITIES A filter flag. Include domain and avatar entities when intersecting. <em>Read-only.</em>. Deprecated.
* @property {number} PICK_OVERLAYS A filter flag. Include local entities when intersecting. <em>Read-only.</em>. Deprecated.

View file

@ -22,6 +22,7 @@
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*/
class PointerScriptingInterface : public QObject, public Dependency {

View file

@ -25,6 +25,7 @@
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*
* @property {number} PICK_ENTITIES <em>Read-only.</em>
* @property {number} PICK_OVERLAYS <em>Read-only.</em>

View file

@ -42,6 +42,7 @@ class AccountServicesScriptingInterface : public QObject {
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*
* @namespace AccountServices
* @property {string} username <em>Read-only.</em>

View file

@ -32,6 +32,7 @@ class Audio : public AudioScriptingInterface, protected ReadWriteLockable {
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
* @hifi-server-entity
* @hifi-assignment-client
*

View file

@ -24,6 +24,7 @@
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*/
class ClipboardScriptingInterface : public QObject {
Q_OBJECT

View file

@ -199,6 +199,7 @@ class ScriptEngine;
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*
* @property {Controller.Actions} Actions - Predefined actions on Interface and the user's avatar. These can be used as end
* points in a {@link RouteObject} mapping. A synonym for <code>Controller.Hardware.Actions</code>.

View file

@ -24,7 +24,8 @@
*
* @hifi-interface
* @hifi-client-entity
*
* @hifi-avatar
*
* @property {number} width
* @property {number} height
* @property {number} ALWAYS_ON_TOP - InteractiveWindow flag for always showing a window on top

View file

@ -21,6 +21,7 @@
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*/
class GooglePolyScriptingInterface : public QObject, public Dependency {

View file

@ -31,6 +31,7 @@ class QScriptEngine;
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*
* @property {Vec3} position - The position of the HMD if currently in VR display mode, otherwise
* {@link Vec3(0)|Vec3.ZERO}. <em>Read-only.</em>

View file

@ -24,6 +24,7 @@
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*
* @property {bool} raised - <code>true</code> If the keyboard is visible <code>false</code> otherwise
* @property {bool} password - <code>true</code> Will show * instead of characters in the text display <code>false</code> otherwise

View file

@ -35,6 +35,7 @@ class MenuItemProperties;
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*/
/**

View file

@ -88,6 +88,7 @@ protected:
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*
* @example <caption>Outline an entity when it is grabbed by a controller.</caption>
* // Create a box and copy the following text into the entity's "Script URL" field.

View file

@ -21,6 +21,7 @@
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*/
class SettingsScriptingInterface : public QObject {

View file

@ -34,6 +34,7 @@ public:
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*
* @property {number} walletStatus
* @property {bool} limitedCommerce

View file

@ -31,6 +31,7 @@
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*
* @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>

View file

@ -29,6 +29,7 @@ class AvatarInputs : public QObject {
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*
* @property {boolean} cameraEnabled <em>Read-only.</em>
* @property {boolean} cameraMuted <em>Read-only.</em>

View file

@ -42,6 +42,7 @@ private:
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*/
class Snapshot : public QObject, public Dependency {

View file

@ -27,6 +27,7 @@ private: \
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
* @hifi-server-entity
* @hifi-assignment-client
*

View file

@ -87,6 +87,7 @@ public:
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*
* @property {Uuid} keyboardFocusOverlay - Get or set the {@link Overlays.OverlayType|web3d} overlay that has keyboard focus.
* If no overlay has keyboard focus, get returns <code>null</code>; set to <code>null</code> or {@link Uuid|Uuid.NULL} to

View file

@ -4,5 +4,6 @@ link_hifi_libraries(shared graphics fbx)
include_hifi_library_headers(networking)
include_hifi_library_headers(gpu)
include_hifi_library_headers(hfm)
include_hifi_library_headers(image)
target_nsight()

View file

@ -50,6 +50,7 @@ Q_DECLARE_METATYPE(AnimationPointer)
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
* @hifi-server-entity
* @hifi-assignment-client
*

View file

@ -30,6 +30,7 @@ class AnimationCacheScriptingInterface : public ScriptableResourceCache, public
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
* @hifi-assignment-client
*
* @property {number} numTotal - Total number of total resources. <em>Read-only.</em>

View file

@ -44,6 +44,7 @@ class AudioStreamStatsInterface : public QObject {
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*
* @property {number} lossRate <em>Read-only.</em>
* @property {number} lossCount <em>Read-only.</em>
@ -192,6 +193,7 @@ class AudioStatsInterface : public QObject {
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*
* @property {number} pingMs <em>Read-only.</em>
* @property {number} inputReadMsMax <em>Read-only.</em>

View file

@ -25,6 +25,7 @@
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
* @hifi-server-entity
* @hifi-assignment-client
*

View file

@ -61,7 +61,8 @@ class Sound : public Resource {
public:
Sound(const QUrl& url, bool isStereo = false, bool isAmbisonic = false);
Sound(const Sound& other) : Resource(other), _audioData(other._audioData), _numChannels(other._numChannels) {}
bool isReady() const { return (bool)_audioData; }
bool isStereo() const { return _audioData ? _audioData->isStereo() : false; }
@ -132,6 +133,7 @@ typedef QSharedPointer<Sound> SharedSoundPointer;
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
* @hifi-server-entity
* @hifi-assignment-client
*

View file

@ -30,6 +30,7 @@ class SoundCacheScriptingInterface : public ScriptableResourceCache, public Depe
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
* @hifi-server-entity
* @hifi-assignment-client
*

View file

@ -154,7 +154,7 @@ void TextureBaker::processTexture() {
gpu::BackendTarget::GLES32
}};
for (auto target : BACKEND_TARGETS) {
auto processedTexture = image::processImage(buffer, _textureURL.toString().toStdString(),
auto processedTexture = image::processImage(buffer, _textureURL.toString().toStdString(), image::ColorChannel::NONE,
ABSOLUTE_MAX_TEXTURE_NUM_PIXELS, _textureType, true,
target, _abortProcessing);
if (!processedTexture) {
@ -197,7 +197,7 @@ void TextureBaker::processTexture() {
// Uncompressed KTX
if (_textureType == image::TextureUsage::Type::CUBE_TEXTURE) {
buffer->reset();
auto processedTexture = image::processImage(std::move(buffer), _textureURL.toString().toStdString(),
auto processedTexture = image::processImage(std::move(buffer), _textureURL.toString().toStdString(), image::ColorChannel::NONE,
ABSOLUTE_MAX_TEXTURE_NUM_PIXELS, _textureType, false, gpu::BackendTarget::GL45, _abortProcessing);
if (!processedTexture) {
handleError("Could not process texture " + _textureURL.toString());

View file

@ -57,6 +57,7 @@ class UserInputMapper;
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*/
/**jsdoc

View file

@ -39,6 +39,7 @@ class ScriptingInterface;
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*/
// TODO migrate functionality to a RouteBuilder class and make the proxy defer to that

View file

@ -178,6 +178,7 @@ private:
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*
* @property {boolean} allowMouseCapture
* @property {number} depth

View file

@ -193,7 +193,8 @@ DiffTraversal::DiffTraversal() {
_path.reserve(MIN_PATH_DEPTH);
}
DiffTraversal::Type DiffTraversal::prepareNewTraversal(const DiffTraversal::View& view, EntityTreeElementPointer root) {
DiffTraversal::Type DiffTraversal::prepareNewTraversal(const DiffTraversal::View& view, EntityTreeElementPointer root,
bool forceFirstPass) {
assert(root);
// there are three types of traversal:
//
@ -212,7 +213,7 @@ DiffTraversal::Type DiffTraversal::prepareNewTraversal(const DiffTraversal::View
Type type;
// If usesViewFrustum changes, treat it as a First traversal
if (_completedView.startTime == 0 || _currentView.usesViewFrustums() != _completedView.usesViewFrustums()) {
if (forceFirstPass || _completedView.startTime == 0 || _currentView.usesViewFrustums() != _completedView.usesViewFrustums()) {
type = Type::First;
_currentView.viewFrustums = view.viewFrustums;
_currentView.lodScaleFactor = view.lodScaleFactor;

View file

@ -61,7 +61,7 @@ public:
DiffTraversal();
Type prepareNewTraversal(const DiffTraversal::View& view, EntityTreeElementPointer root);
Type prepareNewTraversal(const DiffTraversal::View& view, EntityTreeElementPointer root, bool forceFirstPass = false);
const View& getCurrentView() const { return _currentView; }

View file

@ -2640,15 +2640,8 @@ bool EntityItem::matchesJSONFilters(const QJsonObject& jsonFilters) const {
static const QString SERVER_SCRIPTS_PROPERTY = "serverScripts";
foreach(const auto& property, jsonFilters.keys()) {
if (property == SERVER_SCRIPTS_PROPERTY && jsonFilters[property] == EntityQueryFilterSymbol::NonDefault) {
// check if this entity has a non-default value for serverScripts
if (_serverScripts != ENTITY_ITEM_DEFAULT_SERVER_SCRIPTS) {
return true;
} else {
return false;
}
}
if (jsonFilters[SERVER_SCRIPTS_PROPERTY] == EntityQueryFilterSymbol::NonDefault) {
return _serverScripts != ENTITY_ITEM_DEFAULT_SERVER_SCRIPTS;
}
// the json filter syntax did not match what we expected, return a match

View file

@ -109,6 +109,7 @@ public:
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
* @hifi-server-entity
* @hifi-assignment-client
*

View file

@ -32,6 +32,7 @@
#include <NetworkAccessManager.h>
#include <ResourceManager.h>
#include <PathUtils.h>
#include <image/ColorChannel.h>
#include "FBXSerializer.h"
@ -1146,8 +1147,10 @@ void GLTFSerializer::setHFMMaterial(HFMMaterial& fbxmat, const GLTFMaterial& mat
}
if (material.pbrMetallicRoughness.defined["metallicRoughnessTexture"]) {
fbxmat.roughnessTexture = getHFMTexture(_file.textures[material.pbrMetallicRoughness.metallicRoughnessTexture]);
fbxmat.roughnessTexture.sourceChannel = image::ColorChannel::GREEN;
fbxmat.useRoughnessMap = true;
fbxmat.metallicTexture = getHFMTexture(_file.textures[material.pbrMetallicRoughness.metallicRoughnessTexture]);
fbxmat.metallicTexture.sourceChannel = image::ColorChannel::BLUE;
fbxmat.useMetallicMap = true;
}
if (material.pbrMetallicRoughness.defined["roughnessFactor"]) {

View file

@ -397,8 +397,6 @@ public:
bool isDefined() const { return _defined; }
Texture(TextureUsageType usageType);
Texture(const Texture& buf); // deep copy of the sysmem texture
Texture& operator=(const Texture& buf); // deep copy of the sysmem texture
~Texture();
Stamp getStamp() const { return _stamp; }
@ -693,8 +691,10 @@ class TextureSource {
public:
TextureSource(const QUrl& url, int type = 0) : _imageUrl(url), _type(type) {}
void setUrl(const QUrl& url) { _imageUrl = url; }
const QUrl& getUrl() const { return _imageUrl; }
const gpu::TexturePointer getGPUTexture() const { return _gpuTexture; }
void setType(int type) { _type = type; }
int getType() const { return _type; }
void resetTexture(gpu::TexturePointer texture);

View file

@ -27,6 +27,7 @@
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*/
class GraphicsScriptingInterface : public QObject, public QScriptable, public Dependency {

View file

@ -5,3 +5,4 @@ link_hifi_libraries(shared)
include_hifi_library_headers(gpu)
include_hifi_library_headers(graphics)
include_hifi_library_headers(image)

View file

@ -25,6 +25,8 @@
#include <graphics/Geometry.h>
#include <graphics/Material.h>
#include <image/ColorChannel.h>
#if defined(Q_OS_ANDROID)
#define HFM_PACK_NORMALS 0
#else
@ -119,10 +121,12 @@ public:
/// A texture map.
class Texture {
public:
QString id;
QString name;
QByteArray filename;
QByteArray content;
image::ColorChannel sourceChannel { image::ColorChannel::NONE };
Transform transform;
int maxNumPixels { MAX_NUM_PIXELS_FOR_FBX_TEXTURE };

View file

@ -0,0 +1,26 @@
//
// ColorChannel.h
// libraries/image/src/image
//
// Created by Sabrina Shanman on 2019/02/12.
// Copyright 2019 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_image_ColorChannel_h
#define hifi_image_ColorChannel_h
namespace image {
enum class ColorChannel {
NONE,
RED,
GREEN,
BLUE,
ALPHA,
COUNT
};
};
#endif // hifi_image_ColorChannel_h

View file

@ -16,6 +16,7 @@
#include <QtCore/QtGlobal>
#include <QUrl>
#include <QImage>
#include <QRgb>
#include <QBuffer>
#include <QImageReader>
@ -221,7 +222,45 @@ QImage processRawImageData(QIODevice& content, const std::string& filename) {
return QImage();
}
gpu::TexturePointer processImage(std::shared_ptr<QIODevice> content, const std::string& filename,
void mapToRedChannel(QImage& image, ColorChannel sourceChannel) {
// Change format of image so we know exactly how to process it
if (image.format() != QImage::Format_ARGB32) {
image = image.convertToFormat(QImage::Format_ARGB32);
}
for (int i = 0; i < image.height(); i++) {
QRgb* pixel = reinterpret_cast<QRgb*>(image.scanLine(i));
// Past end pointer
QRgb* lineEnd = pixel + image.width();
// Transfer channel data from source to target
for (; pixel < lineEnd; pixel++) {
int colorValue;
switch (sourceChannel) {
case ColorChannel::RED:
colorValue = qRed(*pixel);
break;
case ColorChannel::GREEN:
colorValue = qGreen(*pixel);
break;
case ColorChannel::BLUE:
colorValue = qBlue(*pixel);
break;
case ColorChannel::ALPHA:
colorValue = qAlpha(*pixel);
break;
default:
colorValue = qRed(*pixel);
break;
}
// Dump the color in the red channel, ignore the rest
*pixel = qRgba(colorValue, 0, 0, 255);
}
}
}
gpu::TexturePointer processImage(std::shared_ptr<QIODevice> content, const std::string& filename, ColorChannel sourceChannel,
int maxNumPixels, TextureUsage::Type textureType,
bool compress, BackendTarget target, const std::atomic<bool>& abortProcessing) {
@ -252,6 +291,11 @@ gpu::TexturePointer processImage(std::shared_ptr<QIODevice> content, const std::
QSize(originalWidth, originalHeight) << " to " <<
QSize(imageWidth, imageHeight) << ")";
}
// Re-map to image with single red channel texture if requested
if (sourceChannel != ColorChannel::NONE) {
mapToRedChannel(image, sourceChannel);
}
auto loader = TextureUsage::getTextureLoaderForType(textureType);
auto texture = loader(std::move(image), filename, compress, target, abortProcessing);

View file

@ -16,6 +16,8 @@
#include <gpu/Texture.h>
#include "ColorChannel.h"
class QByteArray;
class QImage;
@ -81,7 +83,7 @@ gpu::TexturePointer processCubeTextureColorFromImage(QImage&& srcImage, const st
const QStringList getSupportedFormats();
gpu::TexturePointer processImage(std::shared_ptr<QIODevice> content, const std::string& url,
gpu::TexturePointer processImage(std::shared_ptr<QIODevice> content, const std::string& url, ColorChannel sourceChannel,
int maxNumPixels, TextureUsage::Type textureType,
bool compress, gpu::BackendTarget target, const std::atomic<bool>& abortProcessing = false);

View file

@ -25,6 +25,7 @@
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*/
class Midi : public QObject, public Dependency {

View file

@ -2,3 +2,5 @@ set(TARGET_NAME model-baker)
setup_hifi_library()
link_hifi_libraries(shared task gpu graphics hfm)
include_hifi_library_headers(image)

View file

@ -322,7 +322,7 @@ private:
void GeometryDefinitionResource::setExtra(void* extra) {
const GeometryExtra* geometryExtra = static_cast<const GeometryExtra*>(extra);
_mapping = geometryExtra ? geometryExtra->mapping : QVariantHash();
_textureBaseUrl = resolveTextureBaseUrl(_url, geometryExtra ? geometryExtra->textureBaseUrl : QUrl());
_textureBaseUrl = geometryExtra ? resolveTextureBaseUrl(_url, geometryExtra->textureBaseUrl) : QUrl();
_combineParts = geometryExtra ? geometryExtra->combineParts : true;
}
@ -599,7 +599,7 @@ graphics::TextureMapPointer NetworkMaterial::fetchTextureMap(const QUrl& baseUrl
}
const auto url = getTextureUrl(baseUrl, hfmTexture);
const auto texture = DependencyManager::get<TextureCache>()->getTexture(url, type, hfmTexture.content, hfmTexture.maxNumPixels);
const auto texture = DependencyManager::get<TextureCache>()->getTexture(url, type, hfmTexture.content, hfmTexture.maxNumPixels, hfmTexture.sourceChannel);
_textures[channel] = Texture { hfmTexture.name, texture };
auto map = std::make_shared<graphics::TextureMap>();

View file

@ -30,6 +30,7 @@ class ModelCacheScriptingInterface : public ScriptableResourceCache, public Depe
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*
* @property {number} numTotal - Total number of total resources. <em>Read-only.</em>
* @property {number} numCached - Total number of cached resource. <em>Read-only.</em>

View file

@ -192,6 +192,7 @@ public:
image::TextureUsage::Type type;
const QByteArray& content;
int maxNumPixels;
image::ColorChannel sourceChannel;
};
namespace std {
@ -206,19 +207,19 @@ namespace std {
struct hash<TextureExtra> {
size_t operator()(const TextureExtra& a) const {
size_t result = 0;
hash_combine(result, (int)a.type, a.content, a.maxNumPixels);
hash_combine(result, (int)a.type, a.content, a.maxNumPixels, (int)a.sourceChannel);
return result;
}
};
}
ScriptableResource* TextureCache::prefetch(const QUrl& url, int type, int maxNumPixels) {
ScriptableResource* TextureCache::prefetch(const QUrl& url, int type, int maxNumPixels, image::ColorChannel sourceChannel) {
auto byteArray = QByteArray();
TextureExtra extra = { (image::TextureUsage::Type)type, byteArray, maxNumPixels };
TextureExtra extra = { (image::TextureUsage::Type)type, byteArray, maxNumPixels, sourceChannel };
return ResourceCache::prefetch(url, &extra, std::hash<TextureExtra>()(extra));
}
NetworkTexturePointer TextureCache::getTexture(const QUrl& url, image::TextureUsage::Type type, const QByteArray& content, int maxNumPixels) {
NetworkTexturePointer TextureCache::getTexture(const QUrl& url, image::TextureUsage::Type type, const QByteArray& content, int maxNumPixels, image::ColorChannel sourceChannel) {
if (url.scheme() == RESOURCE_SCHEME) {
return getResourceTexture(url);
}
@ -228,7 +229,7 @@ NetworkTexturePointer TextureCache::getTexture(const QUrl& url, image::TextureUs
query.addQueryItem("skybox", "");
modifiedUrl.setQuery(query.toString());
}
TextureExtra extra = { type, content, maxNumPixels };
TextureExtra extra = { type, content, maxNumPixels, sourceChannel };
return ResourceCache::getResource(modifiedUrl, QUrl(), &extra, std::hash<TextureExtra>()(extra)).staticCast<NetworkTexture>();
}
@ -335,6 +336,7 @@ int networkTexturePointerMetaTypeId = qRegisterMetaType<QWeakPointer<NetworkText
NetworkTexture::NetworkTexture(const QUrl& url, bool resourceTexture) :
Resource(url),
Texture(),
_maxNumPixels(100)
{
if (resourceTexture) {
@ -345,7 +347,9 @@ NetworkTexture::NetworkTexture(const QUrl& url, bool resourceTexture) :
NetworkTexture::NetworkTexture(const NetworkTexture& other) :
Resource(other),
Texture(other),
_type(other._type),
_sourceChannel(other._sourceChannel),
_currentlyLoadingResourceType(other._currentlyLoadingResourceType),
_originalWidth(other._originalWidth),
_originalHeight(other._originalHeight),
@ -353,6 +357,11 @@ NetworkTexture::NetworkTexture(const NetworkTexture& other) :
_height(other._height),
_maxNumPixels(other._maxNumPixels)
{
if (_width == 0 || _height == 0 ||
other._currentlyLoadingResourceType == ResourceType::META ||
(other._currentlyLoadingResourceType == ResourceType::KTX && other._ktxResourceState != KTXResourceState::WAITING_FOR_MIP_REQUEST)) {
_startedLoading = false;
}
}
static bool isLocalUrl(const QUrl& url) {
@ -364,8 +373,14 @@ void NetworkTexture::setExtra(void* extra) {
const TextureExtra* textureExtra = static_cast<const TextureExtra*>(extra);
_type = textureExtra ? textureExtra->type : image::TextureUsage::DEFAULT_TEXTURE;
_maxNumPixels = textureExtra ? textureExtra->maxNumPixels : ABSOLUTE_MAX_TEXTURE_NUM_PIXELS;
_sourceChannel = textureExtra ? textureExtra->sourceChannel : image::ColorChannel::NONE;
_textureSource = std::make_shared<gpu::TextureSource>(_url, (int)_type);
if (_textureSource) {
_textureSource->setUrl(_url);
_textureSource->setType((int)_type);
} else {
_textureSource = std::make_shared<gpu::TextureSource>(_url, (int)_type);
}
_lowestRequestedMipLevel = 0;
auto fileNameLowercase = _url.fileName().toLower();
@ -425,7 +440,8 @@ gpu::TexturePointer NetworkTexture::getFallbackTexture() const {
class ImageReader : public QRunnable {
public:
ImageReader(const QWeakPointer<Resource>& resource, const QUrl& url,
const QByteArray& data, size_t extraHash, int maxNumPixels);
const QByteArray& data, size_t extraHash, int maxNumPixels,
image::ColorChannel sourceChannel);
void run() override final;
void read();
@ -437,6 +453,7 @@ private:
QByteArray _content;
size_t _extraHash;
int _maxNumPixels;
image::ColorChannel _sourceChannel;
};
NetworkTexture::~NetworkTexture() {
@ -523,7 +540,6 @@ void NetworkTexture::makeRequest() {
} else {
qWarning(networking) << "NetworkTexture::makeRequest() called while not in a valid state: " << _ktxResourceState;
}
}
void NetworkTexture::handleLocalRequestCompleted() {
@ -1069,7 +1085,7 @@ void NetworkTexture::loadTextureContent(const QByteArray& content) {
return;
}
QThreadPool::globalInstance()->start(new ImageReader(_self, _url, content, _extraHash, _maxNumPixels));
QThreadPool::globalInstance()->start(new ImageReader(_self, _url, content, _extraHash, _maxNumPixels, _sourceChannel));
}
void NetworkTexture::refresh() {
@ -1094,12 +1110,13 @@ void NetworkTexture::refresh() {
Resource::refresh();
}
ImageReader::ImageReader(const QWeakPointer<Resource>& resource, const QUrl& url, const QByteArray& data, size_t extraHash, int maxNumPixels) :
ImageReader::ImageReader(const QWeakPointer<Resource>& resource, const QUrl& url, const QByteArray& data, size_t extraHash, int maxNumPixels, image::ColorChannel sourceChannel) :
_resource(resource),
_url(url),
_content(data),
_extraHash(extraHash),
_maxNumPixels(maxNumPixels)
_maxNumPixels(maxNumPixels),
_sourceChannel(sourceChannel)
{
DependencyManager::get<StatTracker>()->incrementStat("PendingProcessing");
listSupportedImageFormats();
@ -1207,7 +1224,7 @@ void ImageReader::read() {
constexpr bool shouldCompress = false;
#endif
auto target = getBackendTarget();
texture = image::processImage(std::move(buffer), _url.toString().toStdString(), _maxNumPixels, networkTexture->getTextureType(), shouldCompress, target);
texture = image::processImage(std::move(buffer), _url.toString().toStdString(), _sourceChannel, _maxNumPixels, networkTexture->getTextureType(), shouldCompress, target);
if (!texture) {
QMetaObject::invokeMethod(resource.data(), "setImage",

View file

@ -22,6 +22,7 @@
#include <DependencyManager.h>
#include <ResourceCache.h>
#include <graphics/TextureMap.h>
#include <image/ColorChannel.h>
#include <image/Image.h>
#include <ktx/KTX.h>
#include <TextureMeta.h>
@ -96,6 +97,7 @@ private:
friend class ImageReader;
image::TextureUsage::Type _type;
image::ColorChannel _sourceChannel;
enum class ResourceType {
META,
@ -178,7 +180,8 @@ public:
/// Loads a texture from the specified URL.
NetworkTexturePointer getTexture(const QUrl& url, image::TextureUsage::Type type = image::TextureUsage::DEFAULT_TEXTURE,
const QByteArray& content = QByteArray(), int maxNumPixels = ABSOLUTE_MAX_TEXTURE_NUM_PIXELS);
const QByteArray& content = QByteArray(), int maxNumPixels = ABSOLUTE_MAX_TEXTURE_NUM_PIXELS,
image::ColorChannel sourceChannel = image::ColorChannel::NONE);
gpu::TexturePointer getTextureByHash(const std::string& hash);
gpu::TexturePointer cacheTextureByHash(const std::string& hash, const gpu::TexturePointer& texture);
@ -201,7 +204,7 @@ signals:
protected:
// Overload ResourceCache::prefetch to allow specifying texture type for loads
Q_INVOKABLE ScriptableResource* prefetch(const QUrl& url, int type, int maxNumPixels = ABSOLUTE_MAX_TEXTURE_NUM_PIXELS);
Q_INVOKABLE ScriptableResource* prefetch(const QUrl& url, int type, int maxNumPixels = ABSOLUTE_MAX_TEXTURE_NUM_PIXELS, image::ColorChannel sourceChannel = image::ColorChannel::NONE);
virtual QSharedPointer<Resource> createResource(const QUrl& url) override;
QSharedPointer<Resource> createResourceCopy(const QSharedPointer<Resource>& resource) override;

View file

@ -30,6 +30,7 @@ class TextureCacheScriptingInterface : public ScriptableResourceCache, public De
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*
* @property {number} numTotal - Total number of total resources. <em>Read-only.</em>
* @property {number} numCached - Total number of cached resource. <em>Read-only.</em>

View file

@ -43,6 +43,7 @@ const QString GET_PLACE = "/api/v1/places/%1";
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
* @hifi-assignment-client
*
* @property {Uuid} domainID - A UUID uniquely identifying the domain you're visiting. Is {@link Uuid|Uuid.NULL} if you're not

View file

@ -40,6 +40,7 @@
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
* @hifi-server-entity
* @hifi-assignment-client
*/

View file

@ -362,7 +362,6 @@ QSharedPointer<Resource> ResourceCache::getResource(const QUrl& url, const QUrl&
resource->moveToThread(qApp->thread());
connect(resource.data(), &Resource::updateSize, this, &ResourceCache::updateTotalSize);
resourcesWithExtraHash.insert(extraHash, resource);
removeUnusedResource(resource);
resource->ensureLoading();
}
}
@ -404,7 +403,7 @@ void ResourceCache::addUnusedResource(const QSharedPointer<Resource>& resource)
// If it doesn't fit or its size is unknown, remove it from the cache.
if (resource->getBytes() == 0 || resource->getBytes() > _unusedResourcesMaxSize) {
resource->setCache(nullptr);
removeResource(resource->getURL(), resource->getBytes());
removeResource(resource->getURL(), resource->getExtraHash(), resource->getBytes());
resetTotalResourceCounter();
return;
}
@ -443,7 +442,7 @@ void ResourceCache::reserveUnusedResource(qint64 resourceSize) {
auto size = it.value()->getBytes();
locker.unlock();
removeResource(it.value()->getURL(), size);
removeResource(it.value()->getURL(), it.value()->getExtraHash(), size);
locker.relock();
_unusedResourcesSize -= size;
@ -489,9 +488,13 @@ void ResourceCache::resetResourceCounters() {
emit dirty();
}
void ResourceCache::removeResource(const QUrl& url, qint64 size) {
void ResourceCache::removeResource(const QUrl& url, size_t extraHash, qint64 size) {
QWriteLocker locker(&_resourcesLock);
_resources.remove(url);
auto& resources = _resources[url];
resources.remove(extraHash);
if (resources.size() == 0) {
_resources.remove(url);
}
_totalResourcesSize -= size;
}
@ -664,7 +667,7 @@ void Resource::allReferencesCleared() {
} else {
if (_cache) {
// remove from the cache
_cache->removeResource(getURL(), getBytes());
_cache->removeResource(getURL(), getExtraHash(), getBytes());
_cache->resetTotalResourceCounter();
}

View file

@ -95,6 +95,7 @@ class ScriptableResource : public QObject {
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
* @hifi-server-entity
* @hifi-assignment-client
*
@ -271,7 +272,7 @@ private:
friend class ScriptableResourceCache;
void reserveUnusedResource(qint64 resourceSize);
void removeResource(const QUrl& url, qint64 size = 0);
void removeResource(const QUrl& url, size_t extraHash, qint64 size = 0);
void resetTotalResourceCounter();
void resetUnusedResourceCounter();
@ -418,6 +419,7 @@ public:
virtual void setExtra(void* extra) {};
void setExtraHash(size_t extraHash) { _extraHash = extraHash; }
size_t getExtraHash() const { return _extraHash; }
signals:
/// Fired when the resource begins downloading.

View file

@ -22,6 +22,7 @@
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
* @hifi-server-entity
* @hifi-assignment-client
*/

View file

@ -45,6 +45,7 @@ public:
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*
* @property {boolean} running - <em>Read-only.</em>
*/

View file

@ -68,6 +68,7 @@ public:
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*
* @property {number} Ray Ray picks intersect a ray with the nearest object in front of them, along a given direction.
* @property {number} Stylus Stylus picks provide "tapping" functionality on/into flat surfaces.

View file

@ -1,4 +1,3 @@
set(TARGET_NAME procedural)
setup_hifi_library()
link_hifi_libraries(shared gpu shaders networking graphics model-networking ktx image)

View file

@ -30,6 +30,7 @@
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
* @hifi-server-entity
* @hifi-assignment-client
*/

View file

@ -21,6 +21,7 @@
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
* @hifi-server-entity
* @hifi-assignment-client
*/

View file

@ -26,6 +26,7 @@
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
* @hifi-server-entity
* @hifi-assignment-client
*/

View file

@ -40,6 +40,7 @@
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
* @hifi-server-entity
* @hifi-assignment-client
*

View file

@ -28,6 +28,7 @@ class QScriptValue;
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
* @hifi-assignment-client
*/
class RecordingScriptingInterface : public QObject, public Dependency {

View file

@ -115,6 +115,7 @@ namespace SceneScripting {
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*
* @property {string} backgroundMode
* @property {Scene.Stage.KeyLight} keyLight
@ -178,6 +179,7 @@ namespace SceneScripting {
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*
* @property {boolean} shouldRenderAvatars
* @property {boolean} shouldRenderEntities

View file

@ -23,6 +23,7 @@
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
* @hifi-server-entity
* @hifi-assignment-client
*

View file

@ -588,6 +588,7 @@ static void scriptableResourceFromScriptValue(const QScriptValue& value, Scripta
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
* @hifi-server-entity
* @hifi-assignment-client
*

View file

@ -104,6 +104,7 @@ public:
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
* @hifi-server-entity
* @hifi-assignment-client
*

View file

@ -32,6 +32,7 @@ class ScriptEngine;
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*
* @property {string} debugScriptUrl
* @property {string} defaultScriptsPath

View file

@ -27,6 +27,7 @@
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
* @hifi-server-entity
* @hifi-assignment-client
*

View file

@ -71,6 +71,7 @@ public:
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*/
class ScriptsModel : public QAbstractItemModel {
Q_OBJECT

View file

@ -23,6 +23,7 @@
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*/
class ScriptsModelFilter : public QSortFilterProxyModel {
Q_OBJECT

View file

@ -21,6 +21,7 @@
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
* @hifi-assignment-client
*
* @property {boolean} canKick - <code>true</code> if the domain server allows the node or avatar to kick (ban) avatars,

View file

@ -31,6 +31,7 @@
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
* @hifi-server-entity
* @hifi-assignment-client
*

View file

@ -28,6 +28,7 @@
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
* @hifi-server-entity
* @hifi-assignment-client
*/

View file

@ -25,6 +25,7 @@
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*
* @deprecated The Paths API is deprecated. Use {@link Script.resolvePath} and {@link Script.resourcesPath} instead.
* @readonly

View file

@ -645,6 +645,7 @@ using MeshPointer = std::shared_ptr<graphics::Mesh>;
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
* @hifi-server-entity
* @hifi-assignment-client
*

View file

@ -43,6 +43,7 @@ class Camera : public QObject {
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*
* @property {Vec3} position - The position of the camera. You can set this value only when the camera is in independent
* mode.

View file

@ -196,6 +196,7 @@ public:
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*
* @property {number} cpuRunTime - <em>Read-only.</em>
* @property {boolean} enabled

View file

@ -44,7 +44,8 @@ using namespace InteractiveWindowEnums;
* @class InteractiveWindow
*
* @hifi-interface
* @hifi-client-en
* @hifi-client-entity
* @hifi-avatar
*
* @property {string} title
* @property {Vec2} position

View file

@ -36,6 +36,7 @@
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
* @property {boolean} navigationFocused
* @property {boolean} navigationFocusDisabled
*/

View file

@ -17,6 +17,7 @@
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*
* @property {string} url - <em>Read-only.</em>
* @property {Vec2} position

View file

@ -24,7 +24,8 @@ class QScriptContext;
* @param {OverlayWindow.Properties} [properties=null]
*
* @hifi-interface
* @hifi-client-en
* @hifi-client-entity
* @hifi-avatar
*
* @property {Vec2} position
* @property {Vec2} size

View file

@ -43,12 +43,14 @@ class OffscreenQmlSurface;
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*/
/**jsdoc
* @namespace tabletInterface
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*
* @deprecated This API is deprecated and will be removed. Use {@link Tablet} instead.
*/
@ -208,6 +210,7 @@ Q_DECLARE_METATYPE(TabletButtonsProxyModel*);
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*
* @property {string} name - Name of this tablet. <em>Read-only.</em>
* @property {boolean} toolbarMode - Used to transition this tablet into and out of toolbar mode.
@ -456,6 +459,7 @@ Q_DECLARE_METATYPE(TabletProxy*);
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*
* @property {Uuid} uuid - Uniquely identifies this button. <em>Read-only.</em>
* @property {TabletButtonProxy.ButtonProperties} properties

View file

@ -24,6 +24,7 @@ class QQuickItem;
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*/
class ToolbarButtonProxy : public QmlWrapper {
Q_OBJECT
@ -83,6 +84,7 @@ Q_DECLARE_METATYPE(ToolbarButtonProxy*);
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*/
class ToolbarProxy : public QmlWrapper {
Q_OBJECT
@ -136,6 +138,7 @@ Q_DECLARE_METATYPE(ToolbarProxy*);
*
* @hifi-interface
* @hifi-client-entity
* @hifi-avatar
*/
class ToolbarScriptingInterface : public QObject, public Dependency {
Q_OBJECT

View file

@ -107,6 +107,9 @@ exports.handlers = {
if (e.doclet.hifiClientEntity) {
rows.push("Client Entity Scripts");
}
if (e.doclet.hifiAvatar) {
rows.push("Avatar Scripts");
}
if (e.doclet.hifiServerEntity) {
rows.push("Server Entity Scripts");
}
@ -140,6 +143,14 @@ exports.defineTags = function (dictionary) {
}
});
// @hifi-avatar-script
dictionary.defineTag("hifi-avatar", {
onTagged: function (doclet, tag) {
doclet.hifiAvatar = true;
}
});
// @hifi-client-entity
dictionary.defineTag("hifi-client-entity", {
onTagged: function (doclet, tag) {

View file

@ -18,7 +18,7 @@ Nitpick has 5 functions, separated into separate tabs:
### Windows
1. (First time) download and install Python 3 from https://hifi-qa.s3.amazonaws.com/nitpick/Windows/python-3.7.0-amd64.exe (also located at https://www.python.org/downloads/)
1. Click the "add python to path" checkbox on the python installer
1. After installation - create an environment variable called PYTHON_PATH and set it to the folder containing the Python executable.
1. After installation - add the path to python.exe to the Windows PATH environment variable.
1. (First time) download and install AWS CLI from https://hifi-qa.s3.amazonaws.com/nitpick/Windows/AWSCLI64PY3.msi (also available at https://aws.amazon.com/cli/
1. Open a new command prompt and run
`aws configure`
@ -31,7 +31,7 @@ Nitpick has 5 functions, separated into separate tabs:
1. (First time) Download adb (Android Debug Bridge) from *https://dl.google.com/android/repository/platform-tools-latest-windows.zip*
1. Copy the downloaded file to (for example) **C:\adb** and extract in place.
Verify you see *adb.exe* in **C:\adb\platform-tools\\**.
1. Create an environment variable named ADB_PATH and set its value to the installation location (e.g. **C:\adb**)
1. After installation - add the path to adb.exe to the Windows PATH environment variable (note that it is in *adb\platform-tools*).
### Mac
1. (first time) Install brew
In a terminal:

View file

@ -0,0 +1,38 @@
//
// AdbInterface.cpp
//
// Created by Nissim Hadar on Feb 11, 2019.
// Copyright 2013 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 "AdbInterface.h"
#include <PathUtils.h>
#include <QFile>
#include <QMessageBox>
QString AdbInterface::getAdbCommand() {
#ifdef Q_OS_WIN
if (_adbCommand.isNull()) {
QString adbPath = PathUtils::getPathToExecutable("adb.exe");
if (!adbPath.isNull()) {
_adbCommand = adbPath + _adbExe;
} else {
QMessageBox::critical(0, "python.exe not found",
"Please verify that pyton.exe is in the PATH");
exit(-1);
}
}
#elif defined Q_OS_MAC
_adbCommand = "/usr/local/bin/adb";
if (!QFile::exists(_adbCommand)) {
QMessageBox::critical(0, "adb not found",
"adb not found at " + _adbCommand);
exit(-1);
}
#endif
return _adbCommand;
}

View file

@ -0,0 +1,30 @@
//
// AdbInterface.h
//
// Created by Nissim Hadar on Feb 11, 2019.
// Copyright 2013 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_AdbInterface_h
#define hifi_AdbInterface_h
#include <QString>
class AdbInterface {
public:
QString getAdbCommand();
private:
#ifdef Q_OS_WIN
const QString _adbExe{ "adb.exe" };
#else
// Both Mac and Linux use "python"
const QString _adbExe{ "adb" };
#endif
QString _adbCommand;
};
#endif // hifi_AdbInterface_h

Some files were not shown because too many files have changed in this diff Show more