162 lines · 4.4 KB · JavaScript
RawDownload
////  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 scriptfunction 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 scriptfunction 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, Picks.PICK_DOMAIN_ENTITIES | Picks.PICK_AVATAR_ENTITIES | Picks.PICK_LOCAL_ENTITIES);     closest = entity;    id = entity.entityID;     if (avatar.intersects && avatar.distance < closest.distance) {        closest = avatar;        id = avatar.avatarID;        type = "Avatar";    }     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};