mirror of
https://github.com/overte-org/overte.git
synced 2025-06-17 00:00:09 +02:00
* mirrors wip * fix view + projection, texture flipping, billboarding * wip portals * wip * fix cpu frustum culling (hacky?) * fix mirrors in deferred * mirrors on models + text * portals use exit as ignoreItem * cleanup * entity tags * wild guess to handle view correction, hide portalExitID in create when mirrorMode != portal * let's try this?? * plz * promising * fix paramsOffset and view flipping * portals shouldn't flip * break when tag found * fix portal view calculation * Revert "Mirrors + Portals" * Revert "Revert "Mirrors + Portals"" * web entity wantsKeyboardFocus property * fix typo * move audio zones to zone entity properties * fix audio zones in create * set dynamic factory * new procecural particle entity type * fix particle intersection * shorten create labels * fix 0 update props case * Ability to smooth model animations * sound entities * fix layered simulate items * fix stereo sound speed * support non-localOnly sound avatar entities * add sound url prompt * support registration point, improve locking * remove keyboardRasied * locking attempt #2 * fix keyboardRasied typo * add default particle props * add unlit property for shapes * Merge branch master into protocol_changes * add ambient light color * fix create issue * fix create issue * add tonemapping props to zones, wip ambient occlusion * wip ambient occlusion * it's working! * remove attachments * fix non-localOnly positional sounds not updating * change AO default to HBAO, remove from create * more graphics options * fix AO setting + effects in mirrors * fix AA in mirrors * alezia's fixes * fix haze in mirrors * add comment for SKYBOX_DISTANCE * new line * model loading priority updates over time, takes into account out of bounds, avatar entities have higher priority, and fsts can specify to wait for wearables to load before rendering * add loadPriority to model entities, working on other avatars waitForWearables * fix build error * try to fix isServer assert * fix stats + waitForWearables * Listen for click instead of release. * Reverted initial commit. Implemented hack to listen for menu click events. * Missed some reverts. * Missed another one. * Prevent duplicate actions. * Added extra needed checks. * Fix without formatting? (#91) * Hopefully fixed formatting. * Things can't be too easy. * Remove google poly * automated entity property serialization * cleanup + automate EntityPropertyFlags * text vertical alignment, use uint8_t for entity property enums, fix text recalculating too often * fix text size * Update interface/resources/controllers/keyboardMouse.json Co-authored-by: HifiExperiments <53453710+HifiExperiments@users.noreply.github.com> * fix component mode serialization * Fixed mouse look in selfie mode. * fix text debug assert on invalid or unloaded font * missed some enums * fix ADD_GROUP_PROPERTY_TO_MAP * fix PROP_GRAB_EQUIPPABLE_INDICATOR_URL missing urlPermission * fix KeyLightPropertyGroup legacy properties * fix PolyLineEntityItem::getEntityProperties * comment cmake script * fix copyright * Replaced key value with key text. Added additional comment about the specific delete key used. * weekly promoted place Highlight the first place in the list as the weekly promoted place * Fixed lingering references to `avatarIcon`. Signed-off-by: armored-dragon <publicmail@armoreddragon.com> * Adding icon for "Grab And Equip" section Adding icon for "Grab And Equip" section * Add "Grab And Equip" section Add "Grab And Equip" section for the grabbale and Equipable groups of properties. * Add files via upload * Add tooltips for the "Grab and Equip" properties Add the tooltips for the "Grab and Equip" properties * Text adjustments for grab.equippable Text adjustments for grab.equippable * Make Maturity Filter persisted Make Maturity Filter persisted and with a default value (Teen & Everyone) * Adjust the default value for maturity Adjust the default value for maturity * move "triggerable" under GRAB & EQUIP move "triggerable" under GRAB & EQUIP * Remove hifi-screenshare Cherry picked and updated from Tivoli dd5b6ea6ee5597a06603e16509640e7ed18106bb Co-authored-by: Julian Groß <julian.g@posteo.de> * Insert placeholder to not break protocol yet. * Fix incorrectly resolved merge conflict, left too much code. * Fixes based on review comments on previous PR * Remove code accidentally re-added during a conflict fix * bump protocol * rebuild fonts with full charset (NOT -allglyphs) * Attempt at fixing Windows master branch builds * Change minimum angular velocity to a lower one * Fix Uuid.NULL behavior --------- Signed-off-by: armored-dragon <publicmail@armoreddragon.com> Co-authored-by: HifiExperiments <thingsandstuffblog@gmail.com> Co-authored-by: ksuprynowicz <ksuprynowicz@post.pl> Co-authored-by: Dale Glass <51060919+daleglass@users.noreply.github.com> Co-authored-by: HifiExperiments <53453710+HifiExperiments@users.noreply.github.com> Co-authored-by: Julian Groß <julian.g@posteo.de> Co-authored-by: armored-dragon <publicmail@armoreddragon.com> Co-authored-by: Armored-Dragon <github56254@armoreddragon.com> Co-authored-by: Alezia Kurdis <60075796+AleziaKurdis@users.noreply.github.com> Co-authored-by: Maki <mxmcube@gmail.com> Co-authored-by: Dale Glass <dale@daleglass.net>
167 lines
4.6 KiB
JavaScript
167 lines
4.6 KiB
JavaScript
//
|
|
// materialInspector.js
|
|
//
|
|
// Created by Sabrina Shanman on 2019-01-17
|
|
// Copyright 2019 High Fidelity, Inc.
|
|
//
|
|
// Distributed under the Apache License, Version 2.0.
|
|
// See the accompanying file LICENSE or https://www.apache.org/licenses/LICENSE-2.0.html
|
|
//
|
|
"use strict";
|
|
|
|
var activeWindow;
|
|
|
|
// Adapted from Samuel G's material painting script
|
|
function getTopMaterial(multiMaterial) {
|
|
// For non-models: multiMaterial[0] will be the top material
|
|
// For models, multiMaterial[0] is the base material, and multiMaterial[1] is the highest priority applied material
|
|
if (multiMaterial.length > 1) {
|
|
if (multiMaterial[1].priority > multiMaterial[0].priority) {
|
|
return multiMaterial[1];
|
|
}
|
|
}
|
|
|
|
return multiMaterial[0];
|
|
}
|
|
|
|
function updateMaterial(type, id, meshPart) {
|
|
var mesh = Graphics.getModel(id);
|
|
var meshPartString = meshPart.toString();
|
|
if (!mesh) {
|
|
return;
|
|
}
|
|
var materials = mesh.materialLayers;
|
|
if (!materials[meshPartString] || materials[meshPartString].length <= 0) {
|
|
return;
|
|
}
|
|
|
|
var topMaterial = getTopMaterial(materials[meshPartString]);
|
|
var materialJSONText = JSON.stringify({
|
|
materialVersion: 1,
|
|
materials: topMaterial.material
|
|
}, null, 2);
|
|
|
|
toQml({method: "setObjectInfo", params: {id: id, type: type, meshPart: meshPart}});
|
|
toQml({method: "setMaterialJSON", params: {materialJSONText: materialJSONText}});
|
|
}
|
|
|
|
// Adapted from Samuel G's material painting script
|
|
function getHoveredMaterialLocation(event) {
|
|
var pickRay = Camera.computePickRay(event.x, event.y);
|
|
var closest;
|
|
var id;
|
|
var type = "Entity";
|
|
var avatar = AvatarManager.findRayIntersection(pickRay);
|
|
var entity = Entities.findRayIntersection(pickRay, true);
|
|
var overlay = Overlays.findRayIntersection(pickRay, true);
|
|
|
|
closest = entity;
|
|
id = entity.entityID;
|
|
|
|
if (avatar.intersects && avatar.distance < closest.distance) {
|
|
closest = avatar;
|
|
id = avatar.avatarID;
|
|
type = "Avatar";
|
|
} else if (overlay.intersects && overlay.distance < closest.distance) {
|
|
closest = overlay;
|
|
id = overlay.overlayID;
|
|
type = "Overlay";
|
|
}
|
|
|
|
if (closest.intersects) {
|
|
return {
|
|
type: type,
|
|
id: id,
|
|
meshPart: (closest.extraInfo.shapeID ? closest.extraInfo.shapeID : 0)
|
|
};
|
|
} else {
|
|
return undefined;
|
|
}
|
|
}
|
|
|
|
var pressedID;
|
|
var pressedMeshPart;
|
|
|
|
function mousePressEvent(event) {
|
|
if (!event.isLeftButton) {
|
|
return;
|
|
}
|
|
|
|
var result = getHoveredMaterialLocation(event);
|
|
|
|
if (result !== undefined) {
|
|
pressedID = result.id;
|
|
pressedMeshPart = result.meshPart;
|
|
}
|
|
}
|
|
|
|
function mouseReleaseEvent(event) {
|
|
if (!event.isLeftButton) {
|
|
return;
|
|
}
|
|
|
|
var result = getHoveredMaterialLocation(event);
|
|
|
|
if (result !== undefined && result.id === pressedID && result.meshPart === pressedMeshPart) {
|
|
updateMaterial(result.type, result.id, result.meshPart);
|
|
setSelectedObject(result.id, result.type);
|
|
}
|
|
}
|
|
|
|
function killWindow() {
|
|
activeWindow = undefined;
|
|
|
|
// setWindow(undefined);
|
|
}
|
|
|
|
function toQml(message) {
|
|
if (activeWindow === undefined) {
|
|
return; // Shouldn't happen
|
|
}
|
|
|
|
activeWindow.sendToQml(message);
|
|
}
|
|
|
|
function fromQml(message) {
|
|
// No cases currently
|
|
}
|
|
|
|
var SELECT_LIST = "luci_materialInspector_SelectionList";
|
|
Selection.enableListHighlight(SELECT_LIST, {
|
|
outlineUnoccludedColor: { red: 125, green: 255, blue: 225 }
|
|
});
|
|
function setSelectedObject(id, type) {
|
|
Selection.clearSelectedItemsList(SELECT_LIST);
|
|
if (id !== undefined && !Uuid.isNull(id)) {
|
|
Selection.addToSelectedItemsList(SELECT_LIST, type.toLowerCase(), id);
|
|
}
|
|
}
|
|
|
|
function setWindow(window) {
|
|
if (activeWindow !== undefined) {
|
|
setSelectedObject(Uuid.NONE, "");
|
|
// activeWindow.closed.disconnect(killWindow);
|
|
activeWindow.fromQml.disconnect(fromQml);
|
|
Controller.mousePressEvent.disconnect(mousePressEvent);
|
|
Controller.mouseReleaseEvent.disconnect(mouseReleaseEvent);
|
|
activeWindow.close();
|
|
}
|
|
if (window !== undefined) {
|
|
// window.closed.connect(killWindow);
|
|
window.fromQml.connect(fromQml);
|
|
Controller.mousePressEvent.connect(mousePressEvent);
|
|
Controller.mouseReleaseEvent.connect(mouseReleaseEvent);
|
|
}
|
|
activeWindow = window;
|
|
}
|
|
|
|
function cleanup() {
|
|
setWindow(undefined);
|
|
Selection.disableListHighlight(SELECT_LIST);
|
|
}
|
|
|
|
Script.scriptEnding.connect(cleanup);
|
|
|
|
module.exports = {
|
|
setWindow: setWindow
|
|
};
|