overte/scripts/developer/utilities/render/materialInspector.js
pull[bot] 2f359cc15f
[pull] master from overte-org:master (#93)
* 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>
2024-10-24 06:32:53 +00:00

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
};