diff --git a/public/assets/models/server_racking_system.glb b/public/assets/models/server_racking_system.glb new file mode 100644 index 0000000..7a36902 Binary files /dev/null and b/public/assets/models/server_racking_system.glb differ diff --git a/public/assets/objects.json b/public/assets/objects.json new file mode 100644 index 0000000..6b8a636 --- /dev/null +++ b/public/assets/objects.json @@ -0,0 +1,10 @@ +{ + "objects": [ + { + "name": "Server", + "id": "server", + "type": "glb", + "path": "models/server_racking_system.glb" + } + ] +} \ No newline at end of file diff --git a/public/data.json b/public/data.json deleted file mode 100644 index bb42627..0000000 --- a/public/data.json +++ /dev/null @@ -1,668 +0,0 @@ -[ - { - "series": [ - { - "name": "Total Numeric(price)", - "series": [ - { - "id": "04c9457963f067213705689ff95a1aa1f01822239", - "name": "CTR", - "columns": [ - "begin_time", - "Total numeric(price)", - "end_time" - ], - "units": [ - "timestamp", - "count", - "timestamp" - ], - "data": [ - [ - 1700664033000, - 4676808.549999999, - 1700750433000 - ], - [ - 1700750433000, - 7723020.09, - 1700836833000 - ], - [ - 1700836833000, - 6262204.39, - 1700923233000 - ], - [ - 1700923233000, - 3772184.58, - 1701009633000 - ], - [ - 1701009633000, - 4903447.579999999, - 1701096033000 - ], - [ - 1701096033000, - 8205618.880000001, - 1701182433000 - ], - [ - 1701182433000, - 3702760.1500000004, - 1701268833000 - ], - [ - 1701268833000, - 4117192.0100000002, - 1701355233000 - ], - [ - 1701355233000, - 4081216.350000001, - 1701441633000 - ] - ], - "presentation": { - "y_axis": "Total numeric(price)", - "color": "#00b9d9", - "x_axis": "begin_time", - "display": "line", - "name": "CTR", - "tooltip_template": "{{Total numeric(price)}} from {{begin_time}} to {{end_time}}", - "x_display_order": [ - "begin_time" - ], - "y_display_order": [ - "Total numeric(price)" - ] - }, - "metadata": { - "unknown_group": false, - "total_result": false, - "function": "sum", - "alias": "", - "attribute": "numeric(price)", - "type": "Log_CCV2", - "facet": { - "label": "'CTR'", - "expression": "`regexcapture`(`message`, r'.*BannerId:(?P\\S+).*')" - } - } - }, - { - "id": "06c651696bed66d97625f2673be90695d04328b8d", - "name": "SC", - "columns": [ - "begin_time", - "Total numeric(price)", - "end_time" - ], - "units": [ - "timestamp", - "count", - "timestamp" - ], - "data": [ - [ - 1700664033000, - 2588610.670000001, - 1700750433000 - ], - [ - 1700750433000, - 3864433.64, - 1700836833000 - ], - [ - 1700836833000, - 4958889.069999999, - 1700923233000 - ], - [ - 1700923233000, - 3083910.9099999997, - 1701009633000 - ], - [ - 1701009633000, - 3698118.42, - 1701096033000 - ], - [ - 1701096033000, - 4800171.459999998, - 1701182433000 - ], - [ - 1701182433000, - 2453778.76, - 1701268833000 - ], - [ - 1701268833000, - 2477775.4499999993, - 1701355233000 - ], - [ - 1701355233000, - 998172.8500000003, - 1701441633000 - ] - ], - "presentation": { - "y_axis": "Total numeric(price)", - "color": "#f0ca4d", - "x_axis": "begin_time", - "display": "line", - "name": "SC", - "tooltip_template": "{{Total numeric(price)}} from {{begin_time}} to {{end_time}}", - "x_display_order": [ - "begin_time" - ], - "y_display_order": [ - "Total numeric(price)" - ] - }, - "metadata": { - "unknown_group": false, - "total_result": false, - "function": "sum", - "alias": "", - "attribute": "numeric(price)", - "type": "Log_CCV2", - "facet": { - "label": "'SC'", - "expression": "`regexcapture`(`message`, r'.*BannerId:(?P\\S+).*')" - } - } - }, - { - "id": "0043f2ddf69955ec2012fb9964380b4fb3696eaed", - "name": "MKS", - "columns": [ - "begin_time", - "Total numeric(price)", - "end_time" - ], - "units": [ - "timestamp", - "count", - "timestamp" - ], - "data": [ - [ - 1700664033000, - 1387502.0800000005, - 1700750433000 - ], - [ - 1700750433000, - 2033349.0000000005, - 1700836833000 - ], - [ - 1700836833000, - 2316991.13, - 1700923233000 - ], - [ - 1700923233000, - 1670253.9000000001, - 1701009633000 - ], - [ - 1701009633000, - 1811092.6699999997, - 1701096033000 - ], - [ - 1701096033000, - 2308590.9699999997, - 1701182433000 - ], - [ - 1701182433000, - 1335727.1400000006, - 1701268833000 - ], - [ - 1701268833000, - 1454412.4800000004, - 1701355233000 - ], - [ - 1701355233000, - 489153.62000000005, - 1701441633000 - ] - ], - "presentation": { - "y_axis": "Total numeric(price)", - "color": "#f06c53", - "x_axis": "begin_time", - "display": "line", - "name": "MKS", - "tooltip_template": "{{Total numeric(price)}} from {{begin_time}} to {{end_time}}", - "x_display_order": [ - "begin_time" - ], - "y_display_order": [ - "Total numeric(price)" - ] - }, - "metadata": { - "unknown_group": false, - "total_result": false, - "function": "sum", - "alias": "", - "attribute": "numeric(price)", - "type": "Log_CCV2", - "facet": { - "label": "'MKS'", - "expression": "`regexcapture`(`message`, r'.*BannerId:(?P\\S+).*')" - } - } - }, - { - "id": "0e55cb43fdad3bb592f03a06239b286b27f631e20", - "name": "LEQ", - "columns": [ - "begin_time", - "Total numeric(price)", - "end_time" - ], - "units": [ - "timestamp", - "count", - "timestamp" - ], - "data": [ - [ - 1700664033000, - 119854.05999999994, - 1700750433000 - ], - [ - 1700750433000, - 150485.83, - 1700836833000 - ], - [ - 1700836833000, - 167186.66999999998, - 1700923233000 - ], - [ - 1700923233000, - 132224.41999999998, - 1701009633000 - ], - [ - 1701009633000, - 163320.71, - 1701096033000 - ], - [ - 1701096033000, - 181005.11000000004, - 1701182433000 - ], - [ - 1701182433000, - 109123.26999999996, - 1701268833000 - ], - [ - 1701268833000, - 128689.60000000003, - 1701355233000 - ], - [ - 1701355233000, - 39533.739999999976, - 1701441633000 - ] - ], - "presentation": { - "y_axis": "Total numeric(price)", - "color": "#98cb65", - "x_axis": "begin_time", - "display": "line", - "name": "LEQ", - "tooltip_template": "{{Total numeric(price)}} from {{begin_time}} to {{end_time}}", - "x_display_order": [ - "begin_time" - ], - "y_display_order": [ - "Total numeric(price)" - ] - }, - "metadata": { - "unknown_group": false, - "total_result": false, - "function": "sum", - "alias": "", - "attribute": "numeric(price)", - "type": "Log_CCV2", - "facet": { - "label": "'LEQ'", - "expression": "`regexcapture`(`message`, r'.*BannerId:(?P\\S+).*')" - } - } - }, - { - "id": "07f9d06664925804a7c184e6c036e1e52315e8091", - "name": "ATM", - "columns": [ - "begin_time", - "Total numeric(price)", - "end_time" - ], - "units": [ - "timestamp", - "count", - "timestamp" - ], - "data": [ - [ - 1700664033000, - 64957.82999999999, - 1700750433000 - ], - [ - 1700750433000, - 99035.64999999998, - 1700836833000 - ], - [ - 1700836833000, - 123557.49999999996, - 1700923233000 - ], - [ - 1700923233000, - 90598.46999999996, - 1701009633000 - ], - [ - 1701009633000, - 106364.25999999998, - 1701096033000 - ], - [ - 1701096033000, - 141777.25999999995, - 1701182433000 - ], - [ - 1701182433000, - 74628.67999999998, - 1701268833000 - ], - [ - 1701268833000, - 71244.18, - 1701355233000 - ], - [ - 1701355233000, - 15901.249999999996, - 1701441633000 - ] - ], - "presentation": { - "y_axis": "Total numeric(price)", - "color": "#9b61a7", - "x_axis": "begin_time", - "display": "line", - "name": "ATM", - "tooltip_template": "{{Total numeric(price)}} from {{begin_time}} to {{end_time}}", - "x_display_order": [ - "begin_time" - ], - "y_display_order": [ - "Total numeric(price)" - ] - }, - "metadata": { - "unknown_group": false, - "total_result": false, - "function": "sum", - "alias": "", - "attribute": "numeric(price)", - "type": "Log_CCV2", - "facet": { - "label": "'ATM'", - "expression": "`regexcapture`(`message`, r'.*BannerId:(?P\\S+).*')" - } - } - }, - { - "id": "0d86544f75148d36eb06a18f69e878a2870ac0087", - "name": "PTY", - "columns": [ - "begin_time", - "Total numeric(price)", - "end_time" - ], - "units": [ - "timestamp", - "count", - "timestamp" - ], - "data": [ - [ - 1700664033000, - 14202.94, - 1700750433000 - ], - [ - 1700750433000, - 16589.829999999998, - 1700836833000 - ], - [ - 1700836833000, - 14595.310000000001, - 1700923233000 - ], - [ - 1700923233000, - 8760.19, - 1701009633000 - ], - [ - 1701009633000, - 9123.740000000002, - 1701096033000 - ], - [ - 1701096033000, - 14973.260000000002, - 1701182433000 - ], - [ - 1701182433000, - 14041.58, - 1701268833000 - ], - [ - 1701268833000, - 16656.37, - 1701355233000 - ], - [ - 1701355233000, - 16985.59, - 1701441633000 - ] - ], - "presentation": { - "y_axis": "Total numeric(price)", - "color": "#1e51ad", - "x_axis": "begin_time", - "display": "line", - "name": "PTY", - "tooltip_template": "{{Total numeric(price)}} from {{begin_time}} to {{end_time}}", - "x_display_order": [ - "begin_time" - ], - "y_display_order": [ - "Total numeric(price)" - ] - }, - "metadata": { - "unknown_group": false, - "total_result": false, - "function": "sum", - "alias": "", - "attribute": "numeric(price)", - "type": "Log_CCV2", - "facet": { - "label": "'PTY'", - "expression": "`regexcapture`(`message`, r'.*BannerId:(?P\\S+).*')" - } - } - }, - { - "id": "0728ad08286766d72dcedbdd0ceedbcc450ff1d12", - "name": "TRIANGLE", - "columns": [ - "begin_time", - "Total numeric(price)", - "end_time" - ], - "units": [ - "timestamp", - "count", - "timestamp" - ], - "data": [ - [ - 1700664033000, - 16020.0, - 1700750433000 - ], - [ - 1700750433000, - 18512.0, - 1700836833000 - ], - [ - 1700836833000, - 12816.0, - 1700923233000 - ], - [ - 1700923233000, - 8099.0, - 1701009633000 - ], - [ - 1701009633000, - 7921.0, - 1701096033000 - ], - [ - 1701096033000, - 7921.0, - 1701182433000 - ], - [ - 1701182433000, - 4895.0, - 1701268833000 - ], - [ - 1701268833000, - 7476.0, - 1701355233000 - ], - [ - 1701355233000, - 7387.0, - 1701441633000 - ] - ], - "presentation": { - "y_axis": "Total numeric(price)", - "color": "#562d1e", - "x_axis": "begin_time", - "display": "line", - "name": "TRIANGLE", - "tooltip_template": "{{Total numeric(price)}} from {{begin_time}} to {{end_time}}", - "x_display_order": [ - "begin_time" - ], - "y_display_order": [ - "Total numeric(price)" - ] - }, - "metadata": { - "unknown_group": false, - "total_result": false, - "function": "sum", - "alias": "", - "attribute": "numeric(price)", - "type": "Log_CCV2", - "facet": { - "label": "'TRIANGLE'", - "expression": "`regexcapture`(`message`, r'.*BannerId:(?P\\S+).*')" - } - } - } - ] - } - ], - "events": [], - "metadata": { - "version": 3, - "since": "Since 9 days ago", - "sinceTime": 1700664033333, - "beginTime": 1700664033333, - "endTime": 1701441633333, - "facets": [ - "banner" - ], - "performanceStats": { - "inspectedCount": 2172129338, - "responseTime": 22604, - "exceedsRetentionWindow": false - }, - "nrqlQuery": "SELECT sum(numeric(capture(message, r'.*TotalPriceExcludingTax:(?P\\S+).*'))) FROM Log_CCV2 WHERE message like '%CTFS Payment Response%' Since 9 days ago timeseries 1 day facet capture(message, r'.*BannerId:(?P\\S+).*')", - "refresh_interval": 86400000, - "time_zone_offsets": [ - { - "begin_time": 1700642433333, - "zone_id": "America/Chicago", - "offset": -21600000 - } - ], - "account_name": "", - "rawUntil": "NOW", - "rawSince": "9 DAYS AGO", - "offset": 0, - "rawBeginTime": "2023-11-22T14:40:33Z", - "openEnded": true, - "facetExpression": "`regexcapture`(`message`, r'.*BannerId:(?P\\S+).*')", - "eventType": "Log_CCV2", - "eventTypes": [ - "Log_CCV2" - ], - "routerGuid": "378e5d27-d02a-e980-a421-838bf14786aa", - "bucketSizeMillis": 86400000, - "rawCompareWith": "", - "limit": 10, - "guid": "378e5d27-d02a-e980-a421-838bf14786aa", - "rawEndTime": "2023-12-01T14:40:33Z", - "accounts": [ - 1679802 - ] - }, - "account_ids": [ - 1679802 - ] - } -] \ No newline at end of file diff --git a/src/controllers/functions/buildRig.ts b/src/controllers/functions/buildRig.ts index e9f45fa..04a334e 100644 --- a/src/controllers/functions/buildRig.ts +++ b/src/controllers/functions/buildRig.ts @@ -1,4 +1,5 @@ import { + AxesViewer, Mesh, MeshBuilder, PhysicsAggregate, @@ -29,6 +30,7 @@ export function buildRig(scene: Scene, appConfig: AppConfig): Mesh { }); rigMesh.material = buildStandardMaterial("rigMaterial", scene, "#2222ff"); rigMesh.setAbsolutePosition(new Vector3(0, .01, 3)); + const home = new AxesViewer(scene, .5); rigMesh.lookAt(new Vector3(0, 0.01, 0)); rigMesh.visibility = 0; const rigAggregate = diff --git a/src/controllers/webController.ts b/src/controllers/webController.ts index 54a88ed..300a320 100644 --- a/src/controllers/webController.ts +++ b/src/controllers/webController.ts @@ -1,12 +1,13 @@ -import {AbstractMesh, MeshBuilder, Scene, Vector3} from "@babylonjs/core"; +import {AbstractMesh, MeshBuilder, Scene} from "@babylonjs/core"; import {Rigplatform} from "./rigplatform"; import {ControllerEventType, Controllers} from "./controllers"; import {DiagramManager} from "../diagram/diagramManager"; import {GridMaterial} from "@babylonjs/materials"; -import {setMenuPosition} from "../util/functions/setMenuPosition"; import {wheelHandler} from "./functions/wheelHandler"; import log, {Logger} from "loglevel"; import {isDiagramEntity} from "../diagram/functions/isDiagramEntity"; +import {DiagramEventType} from "../diagram/types/diagramEntity"; +import {toDiagramEntity} from "../diagram/functions/toDiagramEntity"; export class WebController { private readonly scene: Scene; @@ -80,6 +81,7 @@ export class WebController { if (kbInfo.type == 1) { //this.referencePlane.setEnabled(true); } else { + this.referencePlane.setEnabled(false); if (this.pickedMesh) { this.pickedMesh.showBoundingBox = false; @@ -126,9 +128,13 @@ export class WebController { this.scene.onPointerDown = (evt, state) => { if (evt.pointerType == "mouse") { if (evt.shiftKey) { - setMenuPosition(this.referencePlane, this.scene, new Vector3(0, 0, 5)); + //setMenuPosition(this.referencePlane, this.scene, new Vector3(0, 0, 5)); //this.referencePlane.rotation = scene.activeCamera.absoluteRotation.toEulerAngles(); - this.pickedMesh = state.pickedMesh.clone('pickedMesh', null, true); + this.pickedMesh = state.pickedMesh; + if (this.pickedMesh) { + this.referencePlane.position = this.pickedMesh.position; + this.referencePlane.rotation = scene.activeCamera.absoluteRotation.toEulerAngles(); + } this.pickedMesh.rotation = scene.activeCamera.absoluteRotation.toEulerAngles(); this.referencePlane.setEnabled(true); } else { @@ -137,6 +143,9 @@ export class WebController { } }; this.scene.onPointerMove = (evt) => { + if (evt.pointerType != "mouse") { + return; + } if (this.mouseDown) { this.rig.turn(evt.movementX); } @@ -156,6 +165,12 @@ export class WebController { } } } else { + if (this.mesh) { + this.diagramManager.onDiagramEventObservable.notifyObservers({ + type: DiagramEventType.MODIFY, + entity: toDiagramEntity(this.mesh) + }, -1); + } this.mesh = null; } if (this.pickedMesh && planePickInfo.hit) { diff --git a/src/diagram/functions/fromDiagramEntity.ts b/src/diagram/functions/buildMeshFromDiagramEntity.ts similarity index 83% rename from src/diagram/functions/fromDiagramEntity.ts rename to src/diagram/functions/buildMeshFromDiagramEntity.ts index 8f21bf2..5c21421 100644 --- a/src/diagram/functions/fromDiagramEntity.ts +++ b/src/diagram/functions/buildMeshFromDiagramEntity.ts @@ -6,11 +6,11 @@ import log from "loglevel"; import {v4 as uuidv4} from 'uuid'; import {buildStandardMaterial} from "../../materials/functions/buildStandardMaterial"; -const logger = log.getLogger('fromDiagramEntity'); +const logger = log.getLogger('buildMeshFromDiagramEntity'); -export function fromDiagramEntity(entity: DiagramEntity, scene: Scene): AbstractMesh { +export function buildMeshFromDiagramEntity(entity: DiagramEntity, scene: Scene): AbstractMesh { if (!entity) { - logger.error("fromDiagramEntity: entity is null"); + logger.error("buildMeshFromDiagramEntity: entity is null"); return null; } if (!entity.id) { @@ -30,7 +30,7 @@ export function fromDiagramEntity(entity: DiagramEntity, scene: Scene): Abstract const toolMesh = scene.getMeshById("tool-" + entity.template + "-" + entity.color); if (toolMesh && !oldMesh) { newMesh = new InstancedMesh(entity.id, (toolMesh as Mesh)); - newMesh.metadata = {template: entity.template, exportable: true}; + newMesh.metadata = {template: entity.template, exportable: true, tool: false}; } else { logger.warn('no tool mesh found for ' + entity.template + "-" + entity.color); } @@ -54,8 +54,8 @@ export function fromDiagramEntity(entity: DiagramEntity, scene: Scene): Abstract if (entity.scale) { newMesh.scaling = xyztovec(entity.scale); } - if (!newMesh.material) { - this.logger.warn("new material created, this shouldn't happen"); + if (!newMesh.material && newMesh?.metadata?.template != "#object-template") { + logger.warn("new material created, this shouldn't happen"); newMesh.material = buildStandardMaterial("material-" + entity.id, scene, entity.color); } if (entity.text) { @@ -69,7 +69,7 @@ export function fromDiagramEntity(entity: DiagramEntity, scene: Scene): Abstract newMesh.metadata.to = entity.to; } } else { - logger.error("fromDiagramEntity: mesh is null after it should have been created"); + logger.error("buildMeshFromDiagramEntity: mesh is null after it should have been created"); } return newMesh; } diff --git a/src/diagram/functions/diagramEventHandler.ts b/src/diagram/functions/diagramEventHandler.ts index ccf3d0e..bf478e6 100644 --- a/src/diagram/functions/diagramEventHandler.ts +++ b/src/diagram/functions/diagramEventHandler.ts @@ -6,7 +6,7 @@ import {TextLabel} from "../../objects/textLabel"; import {Toolbox} from "../../toolbox/toolbox"; import {DiaSounds} from "../../util/diaSounds"; -import {fromDiagramEntity} from "./fromDiagramEntity"; +import {buildMeshFromDiagramEntity} from "./buildMeshFromDiagramEntity"; import {isDiagramEntity} from "./isDiagramEntity"; @@ -27,7 +27,7 @@ export function diagramEventHandler(event: DiagramEvent, log.debug('no mesh found for ' + event.entity.template + "-" + event.entity.color, 'adding it'); toolbox.updateToolbox(event.entity.color); } - mesh = fromDiagramEntity(event.entity, scene); + mesh = buildMeshFromDiagramEntity(event.entity, scene); if (mesh) { mesh.actionManager = actionManager; if (physicsEnabled) { diff --git a/src/diagram/functions/toDiagramEntity.ts b/src/diagram/functions/toDiagramEntity.ts index f14406e..ebb812b 100644 --- a/src/diagram/functions/toDiagramEntity.ts +++ b/src/diagram/functions/toDiagramEntity.ts @@ -27,7 +27,10 @@ export function toDiagramEntity(mesh: AbstractMesh): DiagramEntity { if (mesh.material) { entity.color = (mesh.material as any).diffuseColor.toHexString(); } else { - logger.error("toDiagramEntity: mesh.material is null"); + if (entity.template != "#object-template") { + logger.error("toDiagramEntity: mesh.material is null"); + } + } return entity; } diff --git a/src/objects/diagramObject.ts b/src/objects/diagramObject.ts new file mode 100644 index 0000000..2cc9c1f --- /dev/null +++ b/src/objects/diagramObject.ts @@ -0,0 +1,9 @@ +import {Scene} from "@babylonjs/core"; + +export class DiagramObject { + private scene: Scene; + + constructor(scene: Scene) { + this.scene = scene; + } +} \ No newline at end of file diff --git a/src/objects/textLabel.ts b/src/objects/textLabel.ts index 36074a1..e7a040c 100644 --- a/src/objects/textLabel.ts +++ b/src/objects/textLabel.ts @@ -49,16 +49,11 @@ export class TextLabel { mat.diffuseTexture = dynamicTexture; //mat.emissiveColor = Color3.White(); dynamicTexture.drawText(text, null, null, font, "#000000", "#ffffff", true); - //Create plane and set dynamic texture as material //const plane = MeshBuilder.CreatePlane("text" + text, {width: planeWidth, height: height}, mesh.getScene()); - - const plane1 = this.createPlane(mat, mesh, text, planeWidth, height); const plane2 = this.createPlane(mat, mesh, text, planeWidth, height); plane2.rotation.y = Math.PI; - - } private static createPlane(mat: Material, mesh: AbstractMesh, text: string, planeWidth: number, height: number): AbstractMesh { @@ -68,12 +63,12 @@ export class TextLabel { //plane.billboardMode = Mesh.BILLBOARDMODE_ALL; plane.metadata = {exportable: true, label: true}; - const yOffset = mesh.getBoundingInfo().boundingSphere.radius; + const yOffset = mesh.getBoundingInfo().boundingSphere.maximum.y; plane.parent = mesh; - plane.position.y = yOffset + height / 2; - plane.scaling.y = 1 / mesh.scaling.y; - plane.scaling.x = 1 / mesh.scaling.x; - plane.scaling.z = 1 / mesh.scaling.z; + plane.position.y = yOffset + height; + //plane.scaling.y = mesh.scaling.y; + //plane.scaling.x = mesh.scaling.x; + //plane.scaling.z = mesh.scaling.z; return plane; } } \ No newline at end of file diff --git a/src/toolbox/toolbox.ts b/src/toolbox/toolbox.ts index a2fb1d3..3bd25ae 100644 --- a/src/toolbox/toolbox.ts +++ b/src/toolbox/toolbox.ts @@ -1,4 +1,14 @@ -import {Color3, Mesh, Observable, Scene, TransformNode, Vector3} from "@babylonjs/core"; +import { + AssetContainer, + Color3, + Mesh, + MeshBuilder, + Observable, + Scene, + SceneLoader, + TransformNode, + Vector3 +} from "@babylonjs/core"; import {Button3D, GUI3DManager, StackPanel3D, TextBlock} from "@babylonjs/gui"; import {ControllerEventType, Controllers} from "../controllers/controllers"; @@ -59,6 +69,7 @@ export class Toolbox { } + private readonly objectObservable: Observable = new Observable(); private buildToolbox() { const color = "#7777FF"; @@ -69,7 +80,26 @@ export class Toolbox { this.addPanel.addControl(addButton); this.addPanel.node.scaling = new Vector3(.1, .1, .1); this.addPanel.position = new Vector3(-.25, 0, 0); + //@TODO: move this somewhere else, just to prototype loading objects. + //loadObject(this.scene, this.objectObservable); + this.objectObservable.add((container) => { + this.logger.debug("loaded object"); + const data = container.instantiateModelsToScene(undefined, false, {doNotInstantiate: true}); + const mesh = (data.rootNodes[0] as Mesh); + const bounds = data.rootNodes[0].getHierarchyBoundingVectors(true); + console.log(bounds); + const size = bounds.max.subtract(bounds.min); + const top = MeshBuilder.CreateBox("container", {width: size.x, height: size.y, depth: size.z}, this.scene); + top.position.y = 1.5; + top.metadata = {template: "#object-template", grabbable: true, tool: true}; + mesh.parent = top; + mesh.position.y = -size.y / 2; + top.position = new Vector3(-.6, .2, 0); + //top.scaling = new Vector3(.1, .1, .1); + top.visibility = 0; + console.log(data.rootNodes.length); + }); addButton.onPointerClickObservable.add(() => { buildColor(Color3.Random(), this.scene, this.node, this.index++, this.colorChangeObservable); }); @@ -77,10 +107,20 @@ export class Toolbox { this.node.parent.setEnabled(false); setMenuPosition(this.node.parent as Mesh, this.scene, Vector3.Zero()); - +// } } +function loadObject(scene: Scene, observable: Observable) { + SceneLoader.LoadAssetContainer("/assets/models/", + "server_racking_system.glb", + scene, + (container: AssetContainer) => { + observable.notifyObservers(container); + }); + + +} function createButton(): Button3D { const addButton = new Button3D("add-button"); const text = new TextBlock("add-button-text", "Add Color");