Android - First version of showing up avatars names upon touch. Brought back (transparent) overlays into render forward task.

This commit is contained in:
Cristian Luis Duarte 2018-05-09 17:15:57 -03:00
parent 0bab311b0d
commit 936a319e62
3 changed files with 179 additions and 1 deletions

View file

@ -21,6 +21,9 @@
#include <render/ShapePipeline.h>
#include <render/FilterTask.h>
#include "AntialiasingEffect.h"
#include "StencilMaskPass.h"
#include "ZoneRenderer.h"
#include "FadeEffect.h"
@ -54,12 +57,15 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend
// const auto& lights = items.get0()[RenderFetchCullSortTask::LIGHT];
const auto& metas = items.get0()[RenderFetchCullSortTask::META];
// const auto& overlayOpaques = items.get0()[RenderFetchCullSortTask::OVERLAY_OPAQUE_SHAPE];
// const auto& overlayTransparents = items.get0()[RenderFetchCullSortTask::OVERLAY_TRANSPARENT_SHAPE];
const auto& overlayTransparents = items.get0()[RenderFetchCullSortTask::OVERLAY_TRANSPARENT_SHAPE];
//const auto& background = items.get0()[RenderFetchCullSortTask::BACKGROUND];
// const auto& spatialSelection = items[1];
fadeEffect->build(task, opaques);
const auto jitter = task.addJob<JitterSample>("JitterCam");
// Prepare objects shared by several jobs
const auto deferredFrameTransform = task.addJob<GenerateDeferredFrameTransform>("DeferredFrameTransform");
const auto lightingModel = task.addJob<MakeLightingModel>("LightingModel");
@ -75,6 +81,17 @@ void RenderForwardTask::build(JobModel& task, const render::Varying& input, rend
// draw a stencil mask in hidden regions of the framebuffer.
task.addJob<PrepareStencil>("PrepareStencil", framebuffer);
// Layered Overlays
//const auto filteredOverlaysOpaque = task.addJob<FilterLayeredItems>("FilterOverlaysLayeredOpaque", overlayOpaques, Item::LAYER_3D_FRONT);
const auto filteredOverlaysTransparent = task.addJob<FilterLayeredItems>("FilterOverlaysLayeredTransparent", overlayTransparents, Item::LAYER_3D_FRONT);
//const auto overlaysInFrontOpaque = filteredOverlaysOpaque.getN<FilterLayeredItems::Outputs>(0);
const auto overlaysInFrontTransparent = filteredOverlaysTransparent.getN<FilterLayeredItems::Outputs>(0);
//const auto overlayInFrontOpaquesInputs = DrawOverlay3D::Inputs(overlaysInFrontOpaque, lightingModel, jitter).asVarying();
const auto overlayInFrontTransparentsInputs = DrawOverlay3D::Inputs(overlaysInFrontTransparent, lightingModel, jitter).asVarying();
//task.addJob<DrawOverlay3D>("DrawOverlayInFrontOpaque", overlayInFrontOpaquesInputs, true);
task.addJob<DrawOverlay3D>("DrawOverlayInFrontTransparent", overlayInFrontTransparentsInputs, false);
// Draw opaques forward
const auto opaqueInputs = DrawForward::Inputs(opaques, lightingModel).asVarying();
task.addJob<DrawForward>("DrawOpaques", opaqueInputs, shapePlumber);

View file

@ -0,0 +1,160 @@
"use strict";
//
// displayNames.js
// scripts/system/
//
// Created by Cristian Duarte & Gabriel Calero on May 3, 2018
// Copyright 2018 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
//
(function() { // BEGIN LOCAL_SCOPE
var MAX_DISTANCE_PX = 20; // Should we use dp instead?
var UNKNOWN_NAME = "Unknown";
var METERS_ABOVE_HEAD = 0.4;
var TEXT_LINE_HEIGHT = .1;
var TEXT_MARGIN = 0.025;
var currentTouchToAnalize = null;
var rayExclusionList = [];
var currentlyShownAvatar = {
avatarID: null,
avatar: null,
overlay: null
};
var logEnabled = false;
function printd(str) {
if (logEnabled) {
print("[displayNames.js] " + str);
}
}
function touchedAvatar(avatarID, avatarData) {
printd("[AVATARNAME] touchEnd FOUND " + JSON.stringify(avatarData));
// Case: touching an already selected avatar
if (currentlyShownAvatar.avatar && currentlyShownAvatar.avatarID == avatarID) {
currentlyShownAvatar.avatar = null;
if (currentlyShownAvatar.overlay) {
Overlays.editOverlay(currentlyShownAvatar.overlay, {visible: false});
}
return;
}
// Save currently selected avatar
currentlyShownAvatar.avatarID = avatarID;
currentlyShownAvatar.avatar = avatarData;
if (currentlyShownAvatar.overlay == null) {
var over = Overlays.addOverlay("text3d", {
lineHeight: TEXT_LINE_HEIGHT,
color: { red: 255, green: 255, blue: 255},
backgroundColor: {red: 0, green: 0, blue: 0},
leftMargin: TEXT_MARGIN,
topMargin: TEXT_MARGIN,
rightMargin: TEXT_MARGIN,
bottomMargin: TEXT_MARGIN,
alpha: 0.6,
solid: true,
isFacingAvatar: true,
visible: false
});
currentlyShownAvatar.overlay = over;
}
var nameToShow = avatarData.displayName ? avatarData.displayName :
(avatarData.sessionDisplayName ? avatarData.sessionDisplayName : UNKNOWN_NAME);
var textSize = Overlays.textSize(currentlyShownAvatar.overlay, nameToShow);
Overlays.editOverlay(currentlyShownAvatar.overlay, {
dimensions: {
x: textSize.width + 2 * TEXT_MARGIN,
y: TEXT_LINE_HEIGHT + 2 * TEXT_MARGIN
},
localPosition: {x: 0, y: METERS_ABOVE_HEAD, z:0 },
text: nameToShow,
parentID: avatarData.sessionUUID,
parentJointIndex: avatarData.getJointIndex("Head"),
visible: true
});
}
function touchBegin(event) {
var pickRay = Camera.computePickRay(event.x, event.y);
var avatarRay = AvatarManager.findRayIntersection(pickRay, [], rayExclusionList);
if (avatarRay.intersects) {
currentTouchToAnalize = {
touchBegin: event,
avatarRay: avatarRay
};
printd("[AVATARNAME] touchBegin intersection " + JSON.stringify(currentTouchToAnalize));
} else {
printd("[AVATARNAME] touchBegin no intersection");
}
}
function touchEnd(event) {
if (!currentTouchToAnalize) {
printd("[AVATARNAME] touchEnd no current touch");
currentTouchToAnalize = null;
return;
}
// manage touches only if begin an end do:
// - touch/release the same avatar
// - minimal distance (so no apparent movent was intended but a touch/click)
// - (hold or short click don't matter)
if (Vec3.distance({x: event.x, y: event.y }, {x: currentTouchToAnalize.touchBegin.x, y: currentTouchToAnalize.touchBegin.y}) > MAX_DISTANCE_PX) {
printd("[AVATARNAME] touchEnd moved too much");
currentTouchToAnalize = null;
return;
}
var pickRay = Camera.computePickRay(event.x, event.y);
var avatarRay = AvatarManager.findRayIntersection(pickRay, [], rayExclusionList);
if (avatarRay.intersects && avatarRay.avatarID == currentTouchToAnalize.avatarRay.avatarID) {
touchedAvatar(avatarRay.avatarID, AvatarManager.getAvatar(avatarRay.avatarID));
} else {
printd("[AVATARNAME] touchEnd released outside the avatar");
}
currentTouchToAnalize = null;
}
function ending() {
Controller.touchBeginEvent.disconnect(touchBegin);
Controller.touchEndEvent.disconnect(touchEnd);
Controller.mousePressEvent.disconnect(touchBegin);
Controller.mouseReleaseEvent.disconnect(touchEnd);
if (currentlyShownAvatar.overlay) {
Overlays.deleteOverlay(currentlyShownAvatar.overlay);
currentlyShownAvatar.overlay = null;
}
if (currentlyShownAvatar.avatar) {
currentlyShownAvatar.avatar = null;
}
}
function init() {
Controller.touchBeginEvent.connect(touchBegin);
Controller.touchEndEvent.connect(touchEnd);
Controller.mousePressEvent.connect(touchBegin);
Controller.mouseReleaseEvent.connect(touchEnd);
Script.scriptEnding.connect(function () {
ending();
});
}
init();
}()); // END LOCAL_SCOPE

View file

@ -28,6 +28,7 @@ modeLabel[MODE_MY_VIEW]="MY VIEW";
var logEnabled = false;
var radar = Script.require('./radar.js');
var uniqueColor = Script.require('./uniqueColor.js');
var displayNames = Script.require('./displayNames.js');
function printd(str) {
if (logEnabled) {