mirror of
https://github.com/overte-org/overte.git
synced 2025-08-10 04:12:46 +02:00
Merging with upstream after resolving some conflicts
This commit is contained in:
commit
5f9c713d44
29 changed files with 218 additions and 100 deletions
|
@ -95,6 +95,11 @@ namespace controller {
|
||||||
return getValue(Input(device, source, ChannelType::BUTTON).getID());
|
return getValue(Input(device, source, ChannelType::BUTTON).getID());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
float ScriptingInterface::getAxisValue(int source) const {
|
||||||
|
auto userInputMapper = DependencyManager::get<UserInputMapper>();
|
||||||
|
return userInputMapper->getValue(Input((uint32_t)source));
|
||||||
|
}
|
||||||
|
|
||||||
float ScriptingInterface::getAxisValue(StandardAxisChannel source, uint16_t device) const {
|
float ScriptingInterface::getAxisValue(StandardAxisChannel source, uint16_t device) const {
|
||||||
return getValue(Input(device, source, ChannelType::AXIS).getID());
|
return getValue(Input(device, source, ChannelType::AXIS).getID());
|
||||||
}
|
}
|
||||||
|
|
|
@ -81,6 +81,7 @@ namespace controller {
|
||||||
Q_INVOKABLE float getValue(const int& source) const;
|
Q_INVOKABLE float getValue(const int& source) const;
|
||||||
Q_INVOKABLE float getButtonValue(StandardButtonChannel source, uint16_t device = 0) const;
|
Q_INVOKABLE float getButtonValue(StandardButtonChannel source, uint16_t device = 0) const;
|
||||||
Q_INVOKABLE float getAxisValue(StandardAxisChannel source, uint16_t device = 0) const;
|
Q_INVOKABLE float getAxisValue(StandardAxisChannel source, uint16_t device = 0) const;
|
||||||
|
Q_INVOKABLE float getAxisValue(int source) const;
|
||||||
Q_INVOKABLE Pose getPoseValue(const int& source) const;
|
Q_INVOKABLE Pose getPoseValue(const int& source) const;
|
||||||
Q_INVOKABLE Pose getPoseValue(StandardPoseChannel source, uint16_t device = 0) const;
|
Q_INVOKABLE Pose getPoseValue(StandardPoseChannel source, uint16_t device = 0) const;
|
||||||
|
|
||||||
|
|
|
@ -27,19 +27,27 @@ AnyEndpoint::AnyEndpoint(Endpoint::List children) : Endpoint(Input::INVALID_INPU
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The value of an any-point is considered to be the maxiumum absolute value,
|
||||||
|
// this handles any's of multiple axis values as well as single values as well
|
||||||
float AnyEndpoint::peek() const {
|
float AnyEndpoint::peek() const {
|
||||||
float result = 0;
|
float result = 0.0f;
|
||||||
for (auto& child : _children) {
|
for (auto& child : _children) {
|
||||||
result = std::max(result, child->peek());
|
auto childValue = child->peek();
|
||||||
|
if (std::abs(childValue) > std::abs(result)) {
|
||||||
|
result = childValue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Fetching the value must trigger any necessary side effects of value() on ALL the children.
|
// Fetching the value must trigger any necessary side effects of value() on ALL the children.
|
||||||
float AnyEndpoint::value() {
|
float AnyEndpoint::value() {
|
||||||
float result = 0;
|
float result = 0.0f;
|
||||||
for (auto& child : _children) {
|
for (auto& child : _children) {
|
||||||
result = std::max(result, child->value());
|
auto childValue = child->value();
|
||||||
|
if (std::abs(childValue) > std::abs(result)) {
|
||||||
|
result = childValue;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
|
@ -374,7 +374,8 @@ void HmdDisplayPlugin::updateFrameData() {
|
||||||
}
|
}
|
||||||
|
|
||||||
// this offset needs to match GRAB_POINT_SPHERE_OFFSET in scripts/system/libraries/controllers.js
|
// this offset needs to match GRAB_POINT_SPHERE_OFFSET in scripts/system/libraries/controllers.js
|
||||||
static const vec3 GRAB_POINT_SPHERE_OFFSET = vec3(0.1f, 0.04f, -0.32f);
|
//static const vec3 GRAB_POINT_SPHERE_OFFSET = vec3(0.1f, 0.04f, -0.32f);
|
||||||
|
static const vec3 GRAB_POINT_SPHERE_OFFSET = vec3(0.0f, 0.0f, -0.175f);
|
||||||
vec3 grabPointOffset = GRAB_POINT_SPHERE_OFFSET;
|
vec3 grabPointOffset = GRAB_POINT_SPHERE_OFFSET;
|
||||||
if (i == 0) {
|
if (i == 0) {
|
||||||
grabPointOffset.x *= -1.0f; // this changes between left and right hands
|
grabPointOffset.x *= -1.0f; // this changes between left and right hands
|
||||||
|
|
|
@ -666,7 +666,6 @@ void GLBackend::recycle() const {
|
||||||
for (auto pair : externalTexturesTrash) {
|
for (auto pair : externalTexturesTrash) {
|
||||||
auto fence = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
|
auto fence = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0);
|
||||||
pair.second(pair.first, fence);
|
pair.second(pair.first, fence);
|
||||||
decrementTextureGPUCount();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -20,9 +20,20 @@ std::shared_ptr<GLTextureTransferHelper> GLTexture::_textureTransferHelper;
|
||||||
|
|
||||||
// FIXME placeholder for texture memory over-use
|
// FIXME placeholder for texture memory over-use
|
||||||
#define DEFAULT_MAX_MEMORY_MB 256
|
#define DEFAULT_MAX_MEMORY_MB 256
|
||||||
#define MIN_FREE_GPU_MEMORY_PERCENTAGE 0.25f
|
|
||||||
#define OVER_MEMORY_PRESSURE 2.0f
|
#define OVER_MEMORY_PRESSURE 2.0f
|
||||||
|
|
||||||
|
// FIXME other apps show things like Oculus home consuming large amounts of GPU memory
|
||||||
|
// which causes us to blur textures needlessly (since other app GPU memory usage will likely
|
||||||
|
// be swapped out and not cause any actual impact
|
||||||
|
//#define CHECK_MIN_FREE_GPU_MEMORY
|
||||||
|
#ifdef CHECK_MIN_FREE_GPU_MEMORY
|
||||||
|
#define MIN_FREE_GPU_MEMORY_PERCENTAGE 0.25f
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// Allow 65% of all available GPU memory to be consumed by textures
|
||||||
|
// FIXME overly conservative?
|
||||||
|
#define MAX_CONSUMED_TEXTURE_MEMORY_PERCENTAGE 0.65f
|
||||||
|
|
||||||
const GLenum GLTexture::CUBE_FACE_LAYOUT[6] = {
|
const GLenum GLTexture::CUBE_FACE_LAYOUT[6] = {
|
||||||
GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
|
GL_TEXTURE_CUBE_MAP_POSITIVE_X, GL_TEXTURE_CUBE_MAP_NEGATIVE_X,
|
||||||
GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
|
GL_TEXTURE_CUBE_MAP_POSITIVE_Y, GL_TEXTURE_CUBE_MAP_NEGATIVE_Y,
|
||||||
|
@ -107,6 +118,7 @@ float GLTexture::getMemoryPressure() {
|
||||||
// If we can't query the dedicated memory just use a fallback fixed value of 256 MB
|
// If we can't query the dedicated memory just use a fallback fixed value of 256 MB
|
||||||
totalGpuMemory = MB_TO_BYTES(DEFAULT_MAX_MEMORY_MB);
|
totalGpuMemory = MB_TO_BYTES(DEFAULT_MAX_MEMORY_MB);
|
||||||
} else {
|
} else {
|
||||||
|
#ifdef CHECK_MIN_FREE_GPU_MEMORY
|
||||||
// Check the global free GPU memory
|
// Check the global free GPU memory
|
||||||
auto freeGpuMemory = getFreeDedicatedMemory();
|
auto freeGpuMemory = getFreeDedicatedMemory();
|
||||||
if (freeGpuMemory) {
|
if (freeGpuMemory) {
|
||||||
|
@ -115,21 +127,26 @@ float GLTexture::getMemoryPressure() {
|
||||||
if (freeGpuMemory != lastFreeGpuMemory) {
|
if (freeGpuMemory != lastFreeGpuMemory) {
|
||||||
lastFreeGpuMemory = freeGpuMemory;
|
lastFreeGpuMemory = freeGpuMemory;
|
||||||
if (freePercentage < MIN_FREE_GPU_MEMORY_PERCENTAGE) {
|
if (freePercentage < MIN_FREE_GPU_MEMORY_PERCENTAGE) {
|
||||||
qDebug() << "Exceeded max GPU memory";
|
qCDebug(gpugllogging) << "Exceeded min free GPU memory " << freePercentage;
|
||||||
return OVER_MEMORY_PRESSURE;
|
return OVER_MEMORY_PRESSURE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
// Allow 50% of all available GPU memory to be consumed by textures
|
availableTextureMemory = static_cast<gpu::Size>(totalGpuMemory * MAX_CONSUMED_TEXTURE_MEMORY_PERCENTAGE);
|
||||||
// FIXME overly conservative?
|
|
||||||
availableTextureMemory = (totalGpuMemory >> 1);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Return the consumed texture memory divided by the available texture memory.
|
// Return the consumed texture memory divided by the available texture memory.
|
||||||
auto consumedGpuMemory = Context::getTextureGPUMemoryUsage();
|
auto consumedGpuMemory = Context::getTextureGPUMemoryUsage();
|
||||||
return (float)consumedGpuMemory / (float)availableTextureMemory;
|
float memoryPressure = (float)consumedGpuMemory / (float)availableTextureMemory;
|
||||||
|
static Context::Size lastConsumedGpuMemory = 0;
|
||||||
|
if (memoryPressure > 1.0f && lastConsumedGpuMemory != consumedGpuMemory) {
|
||||||
|
lastConsumedGpuMemory = consumedGpuMemory;
|
||||||
|
qCDebug(gpugllogging) << "Exceeded max allowed texture memory: " << consumedGpuMemory << " / " << availableTextureMemory;
|
||||||
|
}
|
||||||
|
return memoryPressure;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@ vec2 float32x3_to_oct(in vec3 v) {
|
||||||
|
|
||||||
vec3 oct_to_float32x3(in vec2 e) {
|
vec3 oct_to_float32x3(in vec2 e) {
|
||||||
vec3 v = vec3(e.xy, 1.0 - abs(e.x) - abs(e.y));
|
vec3 v = vec3(e.xy, 1.0 - abs(e.x) - abs(e.y));
|
||||||
if (v.z < 0) {
|
if (v.z < 0.0) {
|
||||||
v.xy = (1.0 - abs(v.yx)) * signNotZero(v.xy);
|
v.xy = (1.0 - abs(v.yx)) * signNotZero(v.xy);
|
||||||
}
|
}
|
||||||
return normalize(v);
|
return normalize(v);
|
||||||
|
|
|
@ -39,17 +39,18 @@ struct LightAmbient {
|
||||||
|
|
||||||
SphericalHarmonics getLightAmbientSphere(LightAmbient l) { return l._ambientSphere; }
|
SphericalHarmonics getLightAmbientSphere(LightAmbient l) { return l._ambientSphere; }
|
||||||
|
|
||||||
|
|
||||||
float getLightAmbientIntensity(LightAmbient l) { return l._ambient.x; }
|
float getLightAmbientIntensity(LightAmbient l) { return l._ambient.x; }
|
||||||
bool getLightHasAmbientMap(LightAmbient l) { return l._ambient.y > 0; }
|
bool getLightHasAmbientMap(LightAmbient l) { return l._ambient.y > 0; }
|
||||||
float getLightAmbientMapNumMips(LightAmbient l) { return l._ambient.y; }
|
float getLightAmbientMapNumMips(LightAmbient l) { return l._ambient.y; }
|
||||||
|
|
||||||
<@func declareLightBuffer(N)@>
|
<@func declareLightBuffer(N)@>
|
||||||
|
|
||||||
|
|
||||||
<@if N@>
|
<@if N@>
|
||||||
uniform lightBuffer {
|
uniform lightBuffer {
|
||||||
Light lightArray[<$N$>];
|
Light lightArray[<$N$>];
|
||||||
};
|
};
|
||||||
|
|
||||||
Light getLight(int index) {
|
Light getLight(int index) {
|
||||||
return lightArray[index];
|
return lightArray[index];
|
||||||
}
|
}
|
||||||
|
|
|
@ -141,7 +141,11 @@ bool haveAssetServer() {
|
||||||
}
|
}
|
||||||
|
|
||||||
GetMappingRequest* AssetClient::createGetMappingRequest(const AssetPath& path) {
|
GetMappingRequest* AssetClient::createGetMappingRequest(const AssetPath& path) {
|
||||||
return new GetMappingRequest(path);
|
auto request = new GetMappingRequest(path);
|
||||||
|
|
||||||
|
request->moveToThread(thread());
|
||||||
|
|
||||||
|
return request;
|
||||||
}
|
}
|
||||||
|
|
||||||
GetAllMappingsRequest* AssetClient::createGetAllMappingsRequest() {
|
GetAllMappingsRequest* AssetClient::createGetAllMappingsRequest() {
|
||||||
|
@ -305,7 +309,7 @@ void AssetClient::handleAssetGetInfoReply(QSharedPointer<ReceivedMessage> messag
|
||||||
void AssetClient::handleAssetGetReply(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode) {
|
void AssetClient::handleAssetGetReply(QSharedPointer<ReceivedMessage> message, SharedNodePointer senderNode) {
|
||||||
Q_ASSERT(QThread::currentThread() == thread());
|
Q_ASSERT(QThread::currentThread() == thread());
|
||||||
|
|
||||||
auto assetHash = message->read(SHA256_HASH_LENGTH);
|
auto assetHash = message->readHead(SHA256_HASH_LENGTH);
|
||||||
qCDebug(asset_client) << "Got reply for asset: " << assetHash.toHex();
|
qCDebug(asset_client) << "Got reply for asset: " << assetHash.toHex();
|
||||||
|
|
||||||
MessageID messageID;
|
MessageID messageID;
|
||||||
|
@ -349,8 +353,8 @@ void AssetClient::handleAssetGetReply(QSharedPointer<ReceivedMessage> message, S
|
||||||
} else {
|
} else {
|
||||||
auto weakNode = senderNode.toWeakRef();
|
auto weakNode = senderNode.toWeakRef();
|
||||||
|
|
||||||
connect(message.data(), &ReceivedMessage::progress, this, [this, weakNode, messageID, length]() {
|
connect(message.data(), &ReceivedMessage::progress, this, [this, weakNode, messageID, length](qint64 size) {
|
||||||
handleProgressCallback(weakNode, messageID, length);
|
handleProgressCallback(weakNode, messageID, size, length);
|
||||||
});
|
});
|
||||||
connect(message.data(), &ReceivedMessage::completed, this, [this, weakNode, messageID]() {
|
connect(message.data(), &ReceivedMessage::completed, this, [this, weakNode, messageID]() {
|
||||||
handleCompleteCallback(weakNode, messageID);
|
handleCompleteCallback(weakNode, messageID);
|
||||||
|
@ -358,7 +362,8 @@ void AssetClient::handleAssetGetReply(QSharedPointer<ReceivedMessage> message, S
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void AssetClient::handleProgressCallback(const QWeakPointer<Node>& node, MessageID messageID, DataOffset length) {
|
void AssetClient::handleProgressCallback(const QWeakPointer<Node>& node, MessageID messageID,
|
||||||
|
qint64 size, DataOffset length) {
|
||||||
auto senderNode = node.toStrongRef();
|
auto senderNode = node.toStrongRef();
|
||||||
|
|
||||||
if (!senderNode) {
|
if (!senderNode) {
|
||||||
|
@ -381,13 +386,7 @@ void AssetClient::handleProgressCallback(const QWeakPointer<Node>& node, Message
|
||||||
}
|
}
|
||||||
|
|
||||||
auto& callbacks = requestIt->second;
|
auto& callbacks = requestIt->second;
|
||||||
auto& message = callbacks.message;
|
callbacks.progressCallback(size, length);
|
||||||
|
|
||||||
if (!message) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
callbacks.progressCallback(message->getSize(), length);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void AssetClient::handleCompleteCallback(const QWeakPointer<Node>& node, MessageID messageID) {
|
void AssetClient::handleCompleteCallback(const QWeakPointer<Node>& node, MessageID messageID) {
|
||||||
|
|
|
@ -93,7 +93,7 @@ private:
|
||||||
bool cancelGetAssetRequest(MessageID id);
|
bool cancelGetAssetRequest(MessageID id);
|
||||||
bool cancelUploadAssetRequest(MessageID id);
|
bool cancelUploadAssetRequest(MessageID id);
|
||||||
|
|
||||||
void handleProgressCallback(const QWeakPointer<Node>& node, MessageID messageID, DataOffset length);
|
void handleProgressCallback(const QWeakPointer<Node>& node, MessageID messageID, qint64 size, DataOffset length);
|
||||||
void handleCompleteCallback(const QWeakPointer<Node>& node, MessageID messageID);
|
void handleCompleteCallback(const QWeakPointer<Node>& node, MessageID messageID);
|
||||||
|
|
||||||
struct GetAssetRequestData {
|
struct GetAssetRequestData {
|
||||||
|
|
|
@ -61,7 +61,7 @@ void ReceivedMessage::appendPacket(NLPacket& packet) {
|
||||||
_data.append(packet.getPayload(), packet.getPayloadSize());
|
_data.append(packet.getPayload(), packet.getPayloadSize());
|
||||||
|
|
||||||
if (_numPackets % EMIT_PROGRESS_EVERY_X_PACKETS == 0) {
|
if (_numPackets % EMIT_PROGRESS_EVERY_X_PACKETS == 0) {
|
||||||
emit progress();
|
emit progress(getSize());
|
||||||
}
|
}
|
||||||
|
|
||||||
if (packet.getPacketPosition() == NLPacket::PacketPosition::LAST) {
|
if (packet.getPacketPosition() == NLPacket::PacketPosition::LAST) {
|
||||||
|
|
|
@ -78,7 +78,7 @@ public:
|
||||||
template<typename T> qint64 readHeadPrimitive(T* data);
|
template<typename T> qint64 readHeadPrimitive(T* data);
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void progress();
|
void progress(qint64 size);
|
||||||
void completed();
|
void completed();
|
||||||
|
|
||||||
private slots:
|
private slots:
|
||||||
|
|
|
@ -52,7 +52,7 @@ DeferredFragment unpackDeferredFragmentNoPosition(vec2 texcoord) {
|
||||||
vec4 specularVal;
|
vec4 specularVal;
|
||||||
|
|
||||||
DeferredFragment frag;
|
DeferredFragment frag;
|
||||||
frag.depthVal = -1;
|
frag.depthVal = -1.0;
|
||||||
normalVal = texture(normalMap, texcoord);
|
normalVal = texture(normalMap, texcoord);
|
||||||
diffuseVal = texture(albedoMap, texcoord);
|
diffuseVal = texture(albedoMap, texcoord);
|
||||||
specularVal = texture(specularMap, texcoord);
|
specularVal = texture(specularMap, texcoord);
|
||||||
|
@ -186,8 +186,8 @@ void unpackMidLowNormalCurvature(vec2 texcoord, out vec4 midNormalCurvature, out
|
||||||
lowNormalCurvature = fetchDiffusedCurvature(texcoord);
|
lowNormalCurvature = fetchDiffusedCurvature(texcoord);
|
||||||
midNormalCurvature.xyz = normalize((midNormalCurvature.xyz - 0.5f) * 2.0f);
|
midNormalCurvature.xyz = normalize((midNormalCurvature.xyz - 0.5f) * 2.0f);
|
||||||
lowNormalCurvature.xyz = normalize((lowNormalCurvature.xyz - 0.5f) * 2.0f);
|
lowNormalCurvature.xyz = normalize((lowNormalCurvature.xyz - 0.5f) * 2.0f);
|
||||||
midNormalCurvature.w = (midNormalCurvature.w * 2 - 1);
|
midNormalCurvature.w = (midNormalCurvature.w * 2.0 - 1.0);
|
||||||
lowNormalCurvature.w = (lowNormalCurvature.w * 2 - 1);
|
lowNormalCurvature.w = (lowNormalCurvature.w * 2.0 - 1.0);
|
||||||
}
|
}
|
||||||
<@endfunc@>
|
<@endfunc@>
|
||||||
|
|
||||||
|
|
|
@ -27,8 +27,8 @@ float evalOpaqueFinalAlpha(float alpha, float mapAlpha) {
|
||||||
}
|
}
|
||||||
|
|
||||||
const float DEFAULT_ROUGHNESS = 0.9;
|
const float DEFAULT_ROUGHNESS = 0.9;
|
||||||
const float DEFAULT_SHININESS = 10;
|
const float DEFAULT_SHININESS = 10.0;
|
||||||
const float DEFAULT_METALLIC = 0;
|
const float DEFAULT_METALLIC = 0.0;
|
||||||
const vec3 DEFAULT_SPECULAR = vec3(0.1);
|
const vec3 DEFAULT_SPECULAR = vec3(0.1);
|
||||||
const vec3 DEFAULT_EMISSIVE = vec3(0.0);
|
const vec3 DEFAULT_EMISSIVE = vec3(0.0);
|
||||||
const float DEFAULT_OCCLUSION = 1.0;
|
const float DEFAULT_OCCLUSION = 1.0;
|
||||||
|
|
|
@ -25,7 +25,7 @@
|
||||||
// prepareGlobalLight
|
// prepareGlobalLight
|
||||||
// Transform directions to worldspace
|
// Transform directions to worldspace
|
||||||
vec3 fragNormal = vec3((normal));
|
vec3 fragNormal = vec3((normal));
|
||||||
vec3 fragEyeVector = vec3(invViewMat * vec4(-position, 0.0));
|
vec3 fragEyeVector = vec3(invViewMat * vec4(-1.0*position, 0.0));
|
||||||
vec3 fragEyeDir = normalize(fragEyeVector);
|
vec3 fragEyeDir = normalize(fragEyeVector);
|
||||||
|
|
||||||
// Get light
|
// Get light
|
||||||
|
@ -150,13 +150,13 @@ vec3 evalLightmappedColor(mat4 invViewMat, float shadowAttenuation, float obscur
|
||||||
float facingLight = step(PERPENDICULAR_THRESHOLD, diffuseDot);
|
float facingLight = step(PERPENDICULAR_THRESHOLD, diffuseDot);
|
||||||
|
|
||||||
// Reevaluate the shadow attenuation for light facing fragments
|
// Reevaluate the shadow attenuation for light facing fragments
|
||||||
float lightAttenuation = (1 - facingLight) + facingLight * shadowAttenuation;
|
float lightAttenuation = (1.0 - facingLight) + facingLight * shadowAttenuation;
|
||||||
|
|
||||||
// Diffuse light is the lightmap dimmed by shadow
|
// Diffuse light is the lightmap dimmed by shadow
|
||||||
vec3 diffuseLight = lightAttenuation * lightmap;
|
vec3 diffuseLight = lightAttenuation * lightmap;
|
||||||
|
|
||||||
// Ambient light is the lightmap when in shadow
|
// Ambient light is the lightmap when in shadow
|
||||||
vec3 ambientLight = (1 - lightAttenuation) * lightmap * getLightAmbientIntensity(ambient);
|
vec3 ambientLight = (1.0 - lightAttenuation) * lightmap * getLightAmbientIntensity(light);
|
||||||
|
|
||||||
return isLightmapEnabled() * obscurance * albedo * (diffuseLight + ambientLight);
|
return isLightmapEnabled() * obscurance * albedo * (diffuseLight + ambientLight);
|
||||||
}
|
}
|
||||||
|
|
|
@ -23,7 +23,7 @@ vec4 evalSkyboxLight(vec3 direction, float lod) {
|
||||||
<@func declareEvalAmbientSpecularIrradiance(supportAmbientSphere, supportAmbientMap, supportIfAmbientMapElseAmbientSphere)@>
|
<@func declareEvalAmbientSpecularIrradiance(supportAmbientSphere, supportAmbientMap, supportIfAmbientMapElseAmbientSphere)@>
|
||||||
|
|
||||||
vec3 fresnelSchlickAmbient(vec3 fresnelColor, vec3 lightDir, vec3 halfDir, float gloss) {
|
vec3 fresnelSchlickAmbient(vec3 fresnelColor, vec3 lightDir, vec3 halfDir, float gloss) {
|
||||||
return fresnelColor + (max(vec3(gloss), fresnelColor) - fresnelColor) * pow(1.0 - clamp(dot(lightDir, halfDir), 0.0, 1.0), 5);
|
return fresnelColor + (max(vec3(gloss), fresnelColor) - fresnelColor) * pow(1.0 - clamp(dot(lightDir, halfDir), 0.0, 1.0), 5.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
<@if supportAmbientMap@>
|
<@if supportAmbientMap@>
|
||||||
|
@ -32,7 +32,7 @@ vec3 fresnelSchlickAmbient(vec3 fresnelColor, vec3 lightDir, vec3 halfDir, float
|
||||||
|
|
||||||
vec3 evalAmbientSpecularIrradiance(LightAmbient ambient, vec3 fragEyeDir, vec3 fragNormal, float roughness, vec3 fresnel) {
|
vec3 evalAmbientSpecularIrradiance(LightAmbient ambient, vec3 fragEyeDir, vec3 fragNormal, float roughness, vec3 fresnel) {
|
||||||
vec3 direction = -reflect(fragEyeDir, fragNormal);
|
vec3 direction = -reflect(fragEyeDir, fragNormal);
|
||||||
vec3 ambientFresnel = fresnelSchlickAmbient(fresnel, fragEyeDir, fragNormal, 1 - roughness);
|
vec3 ambientFresnel = fresnelSchlickAmbient(fresnel, fragEyeDir, fragNormal, 1.0 - roughness);
|
||||||
vec3 specularLight;
|
vec3 specularLight;
|
||||||
<@if supportIfAmbientMapElseAmbientSphere@>
|
<@if supportIfAmbientMapElseAmbientSphere@>
|
||||||
if (getLightHasAmbientMap(ambient))
|
if (getLightHasAmbientMap(ambient))
|
||||||
|
@ -75,7 +75,7 @@ void evalLightingAmbient(out vec3 diffuse, out vec3 specular, LightAmbient ambie
|
||||||
) {
|
) {
|
||||||
|
|
||||||
// Diffuse from ambient
|
// Diffuse from ambient
|
||||||
diffuse = (1 - metallic) * sphericalHarmonics_evalSphericalLight(getLightAmbientSphere(ambient), normal).xyz;
|
diffuse = (1.0 - metallic) * sphericalHarmonics_evalSphericalLight(getLightAmbientSphere(ambient), normal).xyz;
|
||||||
|
|
||||||
// Specular highlight from ambient
|
// Specular highlight from ambient
|
||||||
specular = evalAmbientSpecularIrradiance(ambient, eyeDir, normal, roughness, fresnel) * obscurance * getLightAmbientIntensity(ambient);
|
specular = evalAmbientSpecularIrradiance(ambient, eyeDir, normal, roughness, fresnel) * obscurance * getLightAmbientIntensity(ambient);
|
||||||
|
|
|
@ -40,7 +40,7 @@ void evalLightingPoint(out vec3 diffuse, out vec3 specular, Light light,
|
||||||
if (isShowLightContour() > 0.0) {
|
if (isShowLightContour() > 0.0) {
|
||||||
// Show edge
|
// Show edge
|
||||||
float edge = abs(2.0 * ((lightVolume_getRadius(light.volume) - fragLightDistance) / (0.1)) - 1.0);
|
float edge = abs(2.0 * ((lightVolume_getRadius(light.volume) - fragLightDistance) / (0.1)) - 1.0);
|
||||||
if (edge < 1) {
|
if (edge < 1.0) {
|
||||||
float edgeCoord = exp2(-8.0*edge*edge);
|
float edgeCoord = exp2(-8.0*edge*edge);
|
||||||
diffuse = vec3(edgeCoord * edgeCoord * getLightColor(light));
|
diffuse = vec3(edgeCoord * edgeCoord * getLightColor(light));
|
||||||
}
|
}
|
||||||
|
|
|
@ -45,7 +45,7 @@ void evalLightingSpot(out vec3 diffuse, out vec3 specular, Light light,
|
||||||
float edgeDistS = dot(fragLightDistance * vec2(cosSpotAngle, sqrt(1.0 - cosSpotAngle * cosSpotAngle)), -lightVolume_getSpotOutsideNormal2(light.volume));
|
float edgeDistS = dot(fragLightDistance * vec2(cosSpotAngle, sqrt(1.0 - cosSpotAngle * cosSpotAngle)), -lightVolume_getSpotOutsideNormal2(light.volume));
|
||||||
float edgeDist = min(edgeDistR, edgeDistS);
|
float edgeDist = min(edgeDistR, edgeDistS);
|
||||||
float edge = abs(2.0 * (edgeDist / (0.1)) - 1.0);
|
float edge = abs(2.0 * (edgeDist / (0.1)) - 1.0);
|
||||||
if (edge < 1) {
|
if (edge < 1.0) {
|
||||||
float edgeCoord = exp2(-8.0*edge*edge);
|
float edgeCoord = exp2(-8.0*edge*edge);
|
||||||
diffuse = vec3(edgeCoord * edgeCoord * getLightColor(light));
|
diffuse = vec3(edgeCoord * edgeCoord * getLightColor(light));
|
||||||
}
|
}
|
||||||
|
|
|
@ -124,14 +124,14 @@ float specularDistribution(float roughness, vec3 normal, vec3 halfDir) {
|
||||||
float gloss2 = (0.001 + roughness);
|
float gloss2 = (0.001 + roughness);
|
||||||
gloss2 *= gloss2; // pow 2
|
gloss2 *= gloss2; // pow 2
|
||||||
gloss2 *= gloss2; // pow 4
|
gloss2 *= gloss2; // pow 4
|
||||||
float denom = (ndoth * ndoth*(gloss2 - 1) + 1);
|
float denom = (ndoth * ndoth*(gloss2 - 1.0) + 1.0);
|
||||||
float power = gloss2 / (3.14159 * denom * denom);
|
float power = gloss2 / (3.14159 * denom * denom);
|
||||||
return power;
|
return power;
|
||||||
}
|
}
|
||||||
float specularDistributionGloss(float gloss2, vec3 normal, vec3 halfDir) {
|
float specularDistributionGloss(float gloss2, vec3 normal, vec3 halfDir) {
|
||||||
float ndoth = clamp(dot(halfDir, normal), 0.0, 1.0);
|
float ndoth = clamp(dot(halfDir, normal), 0.0, 1.0);
|
||||||
// float gloss2 = pow(0.001 + roughness, 4);
|
// float gloss2 = pow(0.001 + roughness, 4);
|
||||||
float denom = (ndoth * ndoth*(gloss2 - 1) + 1);
|
float denom = (ndoth * ndoth*(gloss2 - 1.0) + 1.0);
|
||||||
float power = gloss2 / (3.14159 * denom * denom);
|
float power = gloss2 / (3.14159 * denom * denom);
|
||||||
return power;
|
return power;
|
||||||
}
|
}
|
||||||
|
@ -195,7 +195,7 @@ vec4 evalPBRShadingGloss(vec3 fragNormal, vec3 fragLightDir, vec3 fragEyeDir, fl
|
||||||
float power = specularDistributionGloss(gloss2, fragNormal, halfDir);
|
float power = specularDistributionGloss(gloss2, fragNormal, halfDir);
|
||||||
vec3 specular = fresnelColor * power * diffuse;
|
vec3 specular = fresnelColor * power * diffuse;
|
||||||
|
|
||||||
return vec4(specular, (1.0 - metallic) * diffuse * (1 - fresnelColor.x));
|
return vec4(specular, (1.0 - metallic) * diffuse * (1.0 - fresnelColor.x));
|
||||||
}
|
}
|
||||||
|
|
||||||
<@endfunc@>
|
<@endfunc@>
|
||||||
|
|
|
@ -137,7 +137,7 @@ vec3 integrate(float cosTheta, float skinRadius) {
|
||||||
uniform sampler2D scatteringLUT;
|
uniform sampler2D scatteringLUT;
|
||||||
|
|
||||||
vec3 fetchBRDF(float LdotN, float curvature) {
|
vec3 fetchBRDF(float LdotN, float curvature) {
|
||||||
return texture(scatteringLUT, vec2( clamp(LdotN * 0.5 + 0.5, 0.0, 1.0), clamp(2 * curvature, 0.0, 1.0))).xyz;
|
return texture(scatteringLUT, vec2( clamp(LdotN * 0.5 + 0.5, 0.0, 1.0), clamp(2.0 * curvature, 0.0, 1.0))).xyz;
|
||||||
}
|
}
|
||||||
|
|
||||||
vec3 fetchBRDFSpectrum(vec3 LdotNSpectrum, float curvature) {
|
vec3 fetchBRDFSpectrum(vec3 LdotNSpectrum, float curvature) {
|
||||||
|
@ -183,7 +183,7 @@ float tuneCurvatureUnsigned(float curvature) {
|
||||||
}
|
}
|
||||||
|
|
||||||
float unpackCurvature(float packedCurvature) {
|
float unpackCurvature(float packedCurvature) {
|
||||||
return (packedCurvature * 2 - 1);
|
return (packedCurvature * 2.0 - 1.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
vec3 evalScatteringBentNdotL(vec3 normal, vec3 midNormal, vec3 lowNormal, vec3 lightDir) {
|
vec3 evalScatteringBentNdotL(vec3 normal, vec3 midNormal, vec3 lowNormal, vec3 lightDir) {
|
||||||
|
@ -210,7 +210,7 @@ vec3 evalSkinBRDF(vec3 lightDir, vec3 normal, vec3 midNormal, vec3 lowNormal, fl
|
||||||
return lowNormal * 0.5 + vec3(0.5);
|
return lowNormal * 0.5 + vec3(0.5);
|
||||||
}
|
}
|
||||||
if (showCurvature()) {
|
if (showCurvature()) {
|
||||||
return (curvature > 0 ? vec3(curvature, 0.0, 0.0) : vec3(0.0, 0.0, -curvature));
|
return (curvature > 0.0 ? vec3(curvature, 0.0, 0.0) : vec3(0.0, 0.0, -curvature));
|
||||||
}
|
}
|
||||||
|
|
||||||
vec3 bentNdotL = evalScatteringBentNdotL(normal, midNormal, lowNormal, lightDir);
|
vec3 bentNdotL = evalScatteringBentNdotL(normal, midNormal, lowNormal, lightDir);
|
||||||
|
|
|
@ -26,7 +26,7 @@ void main(void) {
|
||||||
);
|
);
|
||||||
vec4 pos = UNIT_QUAD[gl_VertexID];
|
vec4 pos = UNIT_QUAD[gl_VertexID];
|
||||||
|
|
||||||
_texCoord0 = (pos.xy + 1) * 0.5;
|
_texCoord0 = (pos.xy + 1.0) * 0.5;
|
||||||
|
|
||||||
_texCoord0 *= texcoordFrameTransform.zw;
|
_texCoord0 *= texcoordFrameTransform.zw;
|
||||||
_texCoord0 += texcoordFrameTransform.xy;
|
_texCoord0 += texcoordFrameTransform.xy;
|
||||||
|
|
57
libraries/render-utils/src/deferred_light_limited.slv
Normal file
57
libraries/render-utils/src/deferred_light_limited.slv
Normal file
|
@ -0,0 +1,57 @@
|
||||||
|
<@include gpu/Config.slh@>
|
||||||
|
<$VERSION_HEADER$>
|
||||||
|
// Generated on <$_SCRIBE_DATE$>
|
||||||
|
//
|
||||||
|
// deferred_light_limited.vert
|
||||||
|
// vertex shader
|
||||||
|
//
|
||||||
|
// Created by Sam Gateau on 6/16/16.
|
||||||
|
// 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 gpu/Transform.slh@>
|
||||||
|
|
||||||
|
<@include gpu/Inputs.slh@>
|
||||||
|
|
||||||
|
<$declareStandardTransform()$>
|
||||||
|
|
||||||
|
uniform vec4 sphereParam;
|
||||||
|
|
||||||
|
out vec4 _texCoord0;
|
||||||
|
|
||||||
|
void main(void) {
|
||||||
|
if (sphereParam.w != 0.0) {
|
||||||
|
|
||||||
|
// standard transform
|
||||||
|
TransformCamera cam = getTransformCamera();
|
||||||
|
TransformObject obj = getTransformObject();
|
||||||
|
<$transformModelToClipPos(cam, obj, inPosition, gl_Position)$>;
|
||||||
|
|
||||||
|
vec4 projected = gl_Position / gl_Position.w;
|
||||||
|
projected.xy = (projected.xy + 1.0) * 0.5;
|
||||||
|
|
||||||
|
if (cam_isStereo()) {
|
||||||
|
projected.x = 0.5 * (projected.x + cam_getStereoSide());
|
||||||
|
}
|
||||||
|
_texCoord0 = vec4(projected.xy, 0.0, 1.0) * gl_Position.w;
|
||||||
|
} else {
|
||||||
|
const float depth = -1.0; //Draw at near plane
|
||||||
|
const vec4 UNIT_QUAD[4] = vec4[4](
|
||||||
|
vec4(-1.0, -1.0, depth, 1.0),
|
||||||
|
vec4(1.0, -1.0, depth, 1.0),
|
||||||
|
vec4(-1.0, 1.0, depth, 1.0),
|
||||||
|
vec4(1.0, 1.0, depth, 1.0)
|
||||||
|
);
|
||||||
|
vec4 pos = UNIT_QUAD[gl_VertexID];
|
||||||
|
|
||||||
|
_texCoord0 = vec4((pos.xy + 1.0) * 0.5, 0.0, 1.0);
|
||||||
|
|
||||||
|
if (cam_isStereo()) {
|
||||||
|
_texCoord0.x = 0.5 * (_texCoord0.x + cam_getStereoSide());
|
||||||
|
}
|
||||||
|
gl_Position = pos;
|
||||||
|
}
|
||||||
|
}
|
|
@ -2,7 +2,7 @@
|
||||||
<$VERSION_HEADER$>
|
<$VERSION_HEADER$>
|
||||||
// Generated on <$_SCRIBE_DATE$>
|
// Generated on <$_SCRIBE_DATE$>
|
||||||
//
|
//
|
||||||
// directional_light.frag
|
// directional_ambient_light.frag
|
||||||
// fragment shader
|
// fragment shader
|
||||||
//
|
//
|
||||||
// Created by Andrzej Kapolka on 9/3/14.
|
// Created by Andrzej Kapolka on 9/3/14.
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
<$VERSION_HEADER$>
|
<$VERSION_HEADER$>
|
||||||
// Generated on <$_SCRIBE_DATE$>
|
// Generated on <$_SCRIBE_DATE$>
|
||||||
//
|
//
|
||||||
// directional_light.frag
|
// directional_skybox_light.frag
|
||||||
// fragment shader
|
// fragment shader
|
||||||
//
|
//
|
||||||
// Created by Sam Gateau on 5/8/2015.
|
// Created by Sam Gateau on 5/8/2015.
|
||||||
|
|
|
@ -635,7 +635,11 @@ void OpenVrDisplayPlugin::postPreview() {
|
||||||
_nextSimPoseData = nextSim;
|
_nextSimPoseData = nextSim;
|
||||||
});
|
});
|
||||||
_nextRenderPoseData = nextRender;
|
_nextRenderPoseData = nextRender;
|
||||||
|
|
||||||
|
// FIXME - this looks wrong!
|
||||||
_hmdActivityLevel = vr::k_EDeviceActivityLevel_UserInteraction; // _system->GetTrackedDeviceActivityLevel(vr::k_unTrackedDeviceIndex_Hmd);
|
_hmdActivityLevel = vr::k_EDeviceActivityLevel_UserInteraction; // _system->GetTrackedDeviceActivityLevel(vr::k_unTrackedDeviceIndex_Hmd);
|
||||||
|
#else
|
||||||
|
_hmdActivityLevel = _system->GetTrackedDeviceActivityLevel(vr::k_unTrackedDeviceIndex_Hmd);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,6 +16,7 @@
|
||||||
|
|
||||||
(function() { // BEGIN LOCAL_SCOPE
|
(function() { // BEGIN LOCAL_SCOPE
|
||||||
|
|
||||||
|
var BASIC_TIMER_INTERVAL = 50; // 50ms = 20hz
|
||||||
var OVERLAY_WIDTH = 1920;
|
var OVERLAY_WIDTH = 1920;
|
||||||
var OVERLAY_HEIGHT = 1080;
|
var OVERLAY_HEIGHT = 1080;
|
||||||
var OVERLAY_DATA = {
|
var OVERLAY_DATA = {
|
||||||
|
@ -49,6 +50,21 @@ var AWAY_INTRO = {
|
||||||
endFrame: 83.0
|
endFrame: 83.0
|
||||||
};
|
};
|
||||||
|
|
||||||
|
// MAIN CONTROL
|
||||||
|
var isEnabled = true;
|
||||||
|
var wasMuted; // unknonwn?
|
||||||
|
var isAway = false; // we start in the un-away state
|
||||||
|
var wasOverlaysVisible = Menu.isOptionChecked("Overlays");
|
||||||
|
var eventMappingName = "io.highfidelity.away"; // goActive on hand controller button events, too.
|
||||||
|
var eventMapping = Controller.newMapping(eventMappingName);
|
||||||
|
var avatarPosition = MyAvatar.position;
|
||||||
|
var wasHmdMounted = HMD.mounted;
|
||||||
|
|
||||||
|
|
||||||
|
// some intervals we may create/delete
|
||||||
|
var avatarMovedInterval;
|
||||||
|
|
||||||
|
|
||||||
// prefetch the kneel animation and hold a ref so it's always resident in memory when we need it.
|
// prefetch the kneel animation and hold a ref so it's always resident in memory when we need it.
|
||||||
var _animation = AnimationCache.prefetch(AWAY_INTRO.url);
|
var _animation = AnimationCache.prefetch(AWAY_INTRO.url);
|
||||||
|
|
||||||
|
@ -125,41 +141,28 @@ function maybeMoveOverlay() {
|
||||||
var halfWayBetweenOldAndLookAt = Vec3.multiply(lookAtChange, EASE_BY_RATIO);
|
var halfWayBetweenOldAndLookAt = Vec3.multiply(lookAtChange, EASE_BY_RATIO);
|
||||||
var newOverlayPosition = Vec3.sum(lastOverlayPosition, halfWayBetweenOldAndLookAt);
|
var newOverlayPosition = Vec3.sum(lastOverlayPosition, halfWayBetweenOldAndLookAt);
|
||||||
lastOverlayPosition = newOverlayPosition;
|
lastOverlayPosition = newOverlayPosition;
|
||||||
|
|
||||||
var actualOverlayPositon = moveCloserToCamera(lastOverlayPosition);
|
var actualOverlayPositon = moveCloserToCamera(lastOverlayPosition);
|
||||||
Overlays.editOverlay(overlayHMD, { visible: true, position: actualOverlayPositon });
|
Overlays.editOverlay(overlayHMD, { visible: true, position: actualOverlayPositon });
|
||||||
|
|
||||||
// make sure desktop version is hidden
|
// make sure desktop version is hidden
|
||||||
Overlays.editOverlay(overlay, { visible: false });
|
Overlays.editOverlay(overlay, { visible: false });
|
||||||
|
|
||||||
|
// also remember avatar position
|
||||||
|
avatarPosition = MyAvatar.position;
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function ifAvatarMovedGoActive() {
|
function ifAvatarMovedGoActive() {
|
||||||
if (Vec3.distance(MyAvatar.position, avatarPosition) > AVATAR_MOVE_FOR_ACTIVE_DISTANCE) {
|
var newAvatarPosition = MyAvatar.position;
|
||||||
|
if (Vec3.distance(newAvatarPosition, avatarPosition) > AVATAR_MOVE_FOR_ACTIVE_DISTANCE) {
|
||||||
goActive();
|
goActive();
|
||||||
}
|
}
|
||||||
|
avatarPosition = newAvatarPosition;
|
||||||
}
|
}
|
||||||
|
|
||||||
// MAIN CONTROL
|
function goAway(fromStartup) {
|
||||||
var isEnabled = true;
|
|
||||||
var wasMuted, isAway;
|
|
||||||
var wasOverlaysVisible = Menu.isOptionChecked("Overlays");
|
|
||||||
var eventMappingName = "io.highfidelity.away"; // goActive on hand controller button events, too.
|
|
||||||
var eventMapping = Controller.newMapping(eventMappingName);
|
|
||||||
var avatarPosition = MyAvatar.position;
|
|
||||||
|
|
||||||
// backward compatible version of getting HMD.mounted, so it works in old clients
|
|
||||||
function safeGetHMDMounted() {
|
|
||||||
if (HMD.mounted === undefined) {
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
return HMD.mounted;
|
|
||||||
}
|
|
||||||
|
|
||||||
var wasHmdMounted = safeGetHMDMounted();
|
|
||||||
|
|
||||||
function goAway() {
|
|
||||||
if (!isEnabled || isAway) {
|
if (!isEnabled || isAway) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
@ -167,7 +170,6 @@ function goAway() {
|
||||||
UserActivityLogger.toggledAway(true);
|
UserActivityLogger.toggledAway(true);
|
||||||
|
|
||||||
isAway = true;
|
isAway = true;
|
||||||
print('going "away"');
|
|
||||||
wasMuted = AudioDevice.getMuted();
|
wasMuted = AudioDevice.getMuted();
|
||||||
if (!wasMuted) {
|
if (!wasMuted) {
|
||||||
AudioDevice.toggleMute();
|
AudioDevice.toggleMute();
|
||||||
|
@ -189,10 +191,21 @@ function goAway() {
|
||||||
// For HMD, the hmd preview will show the system mouse because of allowMouseCapture,
|
// For HMD, the hmd preview will show the system mouse because of allowMouseCapture,
|
||||||
// but we want to turn off our Reticle so that we don't get two in preview and a stuck one in headset.
|
// but we want to turn off our Reticle so that we don't get two in preview and a stuck one in headset.
|
||||||
Reticle.visible = !HMD.active;
|
Reticle.visible = !HMD.active;
|
||||||
wasHmdMounted = safeGetHMDMounted(); // always remember the correct state
|
wasHmdMounted = HMD.mounted; // always remember the correct state
|
||||||
|
|
||||||
avatarPosition = MyAvatar.position;
|
avatarPosition = MyAvatar.position;
|
||||||
Script.update.connect(ifAvatarMovedGoActive);
|
|
||||||
|
// If we're entering away mode from some other state than startup, then we create our move timer immediately.
|
||||||
|
// However if we're just stating up, we need to delay this process so that we don't think the initial teleport
|
||||||
|
// is actually a move.
|
||||||
|
if (fromStartup === undefined || fromStartup === false) {
|
||||||
|
avatarMovedInterval = Script.setInterval(ifAvatarMovedGoActive, BASIC_TIMER_INTERVAL);
|
||||||
|
} else {
|
||||||
|
var WAIT_FOR_MOVE_ON_STARTUP = 3000; // 3 seconds
|
||||||
|
Script.setTimeout(function() {
|
||||||
|
avatarMovedInterval = Script.setInterval(ifAvatarMovedGoActive, BASIC_TIMER_INTERVAL);
|
||||||
|
}, WAIT_FOR_MOVE_ON_STARTUP);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function goActive() {
|
function goActive() {
|
||||||
|
@ -203,7 +216,6 @@ function goActive() {
|
||||||
UserActivityLogger.toggledAway(false);
|
UserActivityLogger.toggledAway(false);
|
||||||
|
|
||||||
isAway = false;
|
isAway = false;
|
||||||
print('going "active"');
|
|
||||||
if (!wasMuted) {
|
if (!wasMuted) {
|
||||||
AudioDevice.toggleMute();
|
AudioDevice.toggleMute();
|
||||||
}
|
}
|
||||||
|
@ -230,9 +242,9 @@ function goActive() {
|
||||||
if (HMD.active) {
|
if (HMD.active) {
|
||||||
Reticle.position = HMD.getHUDLookAtPosition2D();
|
Reticle.position = HMD.getHUDLookAtPosition2D();
|
||||||
}
|
}
|
||||||
wasHmdMounted = safeGetHMDMounted(); // always remember the correct state
|
wasHmdMounted = HMD.mounted; // always remember the correct state
|
||||||
|
|
||||||
Script.update.disconnect(ifAvatarMovedGoActive);
|
Script.clearInterval(avatarMovedInterval);
|
||||||
}
|
}
|
||||||
|
|
||||||
function maybeGoActive(event) {
|
function maybeGoActive(event) {
|
||||||
|
@ -250,10 +262,12 @@ var wasHmdActive = HMD.active;
|
||||||
var wasMouseCaptured = Reticle.mouseCaptured;
|
var wasMouseCaptured = Reticle.mouseCaptured;
|
||||||
|
|
||||||
function maybeGoAway() {
|
function maybeGoAway() {
|
||||||
|
// If our active state change (went to or from HMD mode), and we are now in the HMD, go into away
|
||||||
if (HMD.active !== wasHmdActive) {
|
if (HMD.active !== wasHmdActive) {
|
||||||
wasHmdActive = !wasHmdActive;
|
wasHmdActive = !wasHmdActive;
|
||||||
if (wasHmdActive) {
|
if (wasHmdActive) {
|
||||||
goAway();
|
goAway();
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -264,19 +278,30 @@ function maybeGoAway() {
|
||||||
wasMouseCaptured = !wasMouseCaptured;
|
wasMouseCaptured = !wasMouseCaptured;
|
||||||
if (!wasMouseCaptured) {
|
if (!wasMouseCaptured) {
|
||||||
goAway();
|
goAway();
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If you've removed your HMD from your head, and we can detect it, we will also go away...
|
// If you've removed your HMD from your head, and we can detect it, we will also go away...
|
||||||
var hmdMounted = safeGetHMDMounted();
|
if (HMD.mounted != wasHmdMounted) {
|
||||||
if (HMD.active && !hmdMounted && wasHmdMounted) {
|
wasHmdMounted = HMD.mounted;
|
||||||
wasHmdMounted = hmdMounted;
|
print("HMD mounted changed...");
|
||||||
goAway();
|
|
||||||
|
// We're putting the HMD on... switch to those devices
|
||||||
|
if (HMD.mounted) {
|
||||||
|
print("NOW mounted...");
|
||||||
|
} else {
|
||||||
|
print("HMD NOW un-mounted...");
|
||||||
|
|
||||||
|
if (HMD.active) {
|
||||||
|
goAway();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function setEnabled(value) {
|
function setEnabled(value) {
|
||||||
print("setting away enabled: ", value);
|
|
||||||
if (!value) {
|
if (!value) {
|
||||||
goActive();
|
goActive();
|
||||||
}
|
}
|
||||||
|
@ -293,9 +318,12 @@ var handleMessage = function(channel, message, sender) {
|
||||||
Messages.subscribe(CHANNEL_AWAY_ENABLE);
|
Messages.subscribe(CHANNEL_AWAY_ENABLE);
|
||||||
Messages.messageReceived.connect(handleMessage);
|
Messages.messageReceived.connect(handleMessage);
|
||||||
|
|
||||||
Script.update.connect(maybeMoveOverlay);
|
var maybeIntervalTimer = Script.setInterval(function(){
|
||||||
|
maybeMoveOverlay();
|
||||||
|
maybeGoAway();
|
||||||
|
}, BASIC_TIMER_INTERVAL);
|
||||||
|
|
||||||
|
|
||||||
Script.update.connect(maybeGoAway);
|
|
||||||
Controller.mousePressEvent.connect(goActive);
|
Controller.mousePressEvent.connect(goActive);
|
||||||
Controller.keyPressEvent.connect(maybeGoActive);
|
Controller.keyPressEvent.connect(maybeGoActive);
|
||||||
// Note peek() so as to not interfere with other mappings.
|
// Note peek() so as to not interfere with other mappings.
|
||||||
|
@ -316,11 +344,17 @@ eventMapping.from(Controller.Standard.Start).peek().to(goActive);
|
||||||
Controller.enableMapping(eventMappingName);
|
Controller.enableMapping(eventMappingName);
|
||||||
|
|
||||||
Script.scriptEnding.connect(function () {
|
Script.scriptEnding.connect(function () {
|
||||||
Script.update.disconnect(maybeGoAway);
|
Script.clearInterval(maybeIntervalTimer);
|
||||||
goActive();
|
goActive();
|
||||||
Controller.disableMapping(eventMappingName);
|
Controller.disableMapping(eventMappingName);
|
||||||
Controller.mousePressEvent.disconnect(goActive);
|
Controller.mousePressEvent.disconnect(goActive);
|
||||||
Controller.keyPressEvent.disconnect(maybeGoActive);
|
Controller.keyPressEvent.disconnect(maybeGoActive);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
if (HMD.active && !HMD.mounted) {
|
||||||
|
print("Starting script, while HMD is active and not mounted...");
|
||||||
|
goAway(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
}()); // END LOCAL_SCOPE
|
}()); // END LOCAL_SCOPE
|
||||||
|
|
|
@ -112,7 +112,7 @@ var CHECK_TOO_FAR_UNEQUIP_TIME = 0.3; // seconds, duration between checks
|
||||||
|
|
||||||
|
|
||||||
var GRAB_POINT_SPHERE_RADIUS = NEAR_GRAB_RADIUS;
|
var GRAB_POINT_SPHERE_RADIUS = NEAR_GRAB_RADIUS;
|
||||||
var GRAB_POINT_SPHERE_COLOR = { red: 20, green: 90, blue: 238 };
|
var GRAB_POINT_SPHERE_COLOR = { red: 240, green: 240, blue: 240 };
|
||||||
var GRAB_POINT_SPHERE_ALPHA = 0.85;
|
var GRAB_POINT_SPHERE_ALPHA = 0.85;
|
||||||
|
|
||||||
|
|
||||||
|
@ -1075,12 +1075,6 @@ function MyController(hand) {
|
||||||
var controllerLocation = getControllerWorldLocation(this.handToController(), true);
|
var controllerLocation = getControllerWorldLocation(this.handToController(), true);
|
||||||
var worldHandPosition = controllerLocation.position;
|
var worldHandPosition = controllerLocation.position;
|
||||||
|
|
||||||
if (controllerLocation.valid) {
|
|
||||||
this.grabPointSphereOn();
|
|
||||||
} else {
|
|
||||||
this.grabPointSphereOff();
|
|
||||||
}
|
|
||||||
|
|
||||||
var candidateEntities = Entities.findEntities(worldHandPosition, MAX_EQUIP_HOTSPOT_RADIUS);
|
var candidateEntities = Entities.findEntities(worldHandPosition, MAX_EQUIP_HOTSPOT_RADIUS);
|
||||||
entityPropertiesCache.addEntities(candidateEntities);
|
entityPropertiesCache.addEntities(candidateEntities);
|
||||||
var potentialEquipHotspot = this.chooseBestEquipHotspot(candidateEntities);
|
var potentialEquipHotspot = this.chooseBestEquipHotspot(candidateEntities);
|
||||||
|
@ -1103,9 +1097,11 @@ function MyController(hand) {
|
||||||
if (!this.grabPointIntersectsEntity) {
|
if (!this.grabPointIntersectsEntity) {
|
||||||
Controller.triggerHapticPulse(1, 20, this.hand);
|
Controller.triggerHapticPulse(1, 20, this.hand);
|
||||||
this.grabPointIntersectsEntity = true;
|
this.grabPointIntersectsEntity = true;
|
||||||
|
this.grabPointSphereOn();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
this.grabPointIntersectsEntity = false;
|
this.grabPointIntersectsEntity = false;
|
||||||
|
this.grabPointSphereOff();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1427,12 +1423,6 @@ function MyController(hand) {
|
||||||
var controllerLocation = getControllerWorldLocation(this.handToController(), true);
|
var controllerLocation = getControllerWorldLocation(this.handToController(), true);
|
||||||
var handPosition = controllerLocation.position;
|
var handPosition = controllerLocation.position;
|
||||||
|
|
||||||
if (controllerLocation.valid) {
|
|
||||||
this.grabPointSphereOn();
|
|
||||||
} else {
|
|
||||||
this.grabPointSphereOff();
|
|
||||||
}
|
|
||||||
|
|
||||||
var rayPickInfo = this.calcRayPickInfo(this.hand);
|
var rayPickInfo = this.calcRayPickInfo(this.hand);
|
||||||
|
|
||||||
if (rayPickInfo.entityID) {
|
if (rayPickInfo.entityID) {
|
||||||
|
|
|
@ -10,9 +10,10 @@
|
||||||
|
|
||||||
// var GRAB_POINT_SPHERE_OFFSET = { x: 0, y: 0.2, z: 0 };
|
// var GRAB_POINT_SPHERE_OFFSET = { x: 0, y: 0.2, z: 0 };
|
||||||
// var GRAB_POINT_SPHERE_OFFSET = { x: 0.1, y: 0.175, z: 0.04 };
|
// var GRAB_POINT_SPHERE_OFFSET = { x: 0.1, y: 0.175, z: 0.04 };
|
||||||
|
// var GRAB_POINT_SPHERE_OFFSET = { x: 0.1, y: 0.32, z: 0.04 };
|
||||||
|
|
||||||
// this offset needs to match the one in libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp
|
// this offset needs to match the one in libraries/display-plugins/src/display-plugins/hmd/HmdDisplayPlugin.cpp
|
||||||
var GRAB_POINT_SPHERE_OFFSET = { x: 0.1, y: 0.32, z: 0.04 };
|
var GRAB_POINT_SPHERE_OFFSET = { x: 0.0, y: 0.175, z: 0.0 };
|
||||||
|
|
||||||
getGrabPointSphereOffset = function(handController) {
|
getGrabPointSphereOffset = function(handController) {
|
||||||
if (handController === Controller.Standard.RightHand) {
|
if (handController === Controller.Standard.RightHand) {
|
||||||
|
|
|
@ -1133,6 +1133,7 @@ var usersWindow = (function () {
|
||||||
if (VISIBILITY_VALUES.indexOf(myVisibility) === -1) {
|
if (VISIBILITY_VALUES.indexOf(myVisibility) === -1) {
|
||||||
myVisibility = VISIBILITY_FRIENDS;
|
myVisibility = VISIBILITY_FRIENDS;
|
||||||
}
|
}
|
||||||
|
GlobalServices.findableBy = myVisibility;
|
||||||
|
|
||||||
visibilityControl = new PopUpMenu({
|
visibilityControl = new PopUpMenu({
|
||||||
prompt: VISIBILITY_PROMPT,
|
prompt: VISIBILITY_PROMPT,
|
||||||
|
|
Loading…
Reference in a new issue