@pacem/pacem 1.0.0-babbage → 1.0.0-bernoulli
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/pacem-2d.js +1 -1
- package/dist/browser/pacem-2d.min.js +2 -2
- package/dist/browser/pacem-2d.min.js.map +1 -1
- package/dist/browser/pacem-3d.js +1 -1
- package/dist/browser/pacem-3d.min.js +2 -2
- package/dist/browser/pacem-3d.min.js.map +1 -1
- package/dist/browser/pacem-charts.js +1 -1
- package/dist/browser/pacem-charts.min.js +2 -2
- package/dist/browser/pacem-charts.min.js.map +1 -1
- package/dist/browser/pacem-cms.js +1 -1
- package/dist/browser/pacem-cms.min.js +2 -2
- package/dist/browser/pacem-cms.min.js.map +1 -1
- package/dist/browser/pacem-core.js +1 -1
- package/dist/browser/pacem-core.min.js +2 -2
- package/dist/browser/pacem-core.min.js.map +1 -1
- package/dist/browser/pacem-foundation.js +1 -1
- package/dist/browser/pacem-foundation.min.js +2 -2
- package/dist/browser/pacem-foundation.min.js.map +1 -1
- package/dist/browser/pacem-fx.js +1 -1
- package/dist/browser/pacem-fx.min.js +2 -2
- package/dist/browser/pacem-fx.min.js.map +1 -1
- package/dist/browser/pacem-logging.js +1 -1
- package/dist/browser/pacem-logging.min.js +2 -2
- package/dist/browser/pacem-logging.min.js.map +1 -1
- package/dist/browser/pacem-maps.js +1 -1
- package/dist/browser/pacem-maps.min.js +2 -2
- package/dist/browser/pacem-maps.min.js.map +1 -1
- package/dist/browser/pacem-media.js +1 -1
- package/dist/browser/pacem-media.min.js +2 -2
- package/dist/browser/pacem-media.min.js.map +1 -1
- package/dist/browser/pacem-networking.js +1 -1
- package/dist/browser/pacem-networking.min.js +2 -2
- package/dist/browser/pacem-networking.min.js.map +1 -1
- package/dist/browser/pacem-numerical.js +1 -1
- package/dist/browser/pacem-numerical.min.js +2 -2
- package/dist/browser/pacem-numerical.min.js.map +1 -1
- package/dist/browser/pacem-plus.js +1 -1
- package/dist/browser/pacem-plus.min.js +2 -2
- package/dist/browser/pacem-plus.min.js.map +1 -1
- package/dist/browser/pacem-scaffolding.js +1 -1
- package/dist/browser/pacem-scaffolding.min.js +2 -2
- package/dist/browser/pacem-scaffolding.min.js.map +1 -1
- package/dist/browser/pacem-ui.js +1 -1
- package/dist/browser/pacem-ui.min.js +2 -2
- package/dist/browser/pacem-ui.min.js.map +1 -1
- package/dist/bundle/pacem.min.mjs +1 -1
- package/dist/bundle/pacem.mjs +1 -1
- package/dist/typings/index.d.ts +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pacem-3d.min.js","sources":["../esm/converters.js","../esm/constants.js","../esm/stage.js","../esm/types.js","../esm/materials/material.js","../esm/materials/basic.js","../esm/materials/lambert.js","../esm/materials/line.js","../esm/materials/phong.js","../esm/materials/standard.js","../esm/primitives/primitive.js","../esm/decorators.js","../esm/geometry.js","../esm/primitives/box.js","../esm/primitives/cone.js","../esm/primitives/cylinder.js","../esm/primitives/line.js","../esm/primitives/plane.js","../esm/primitives/polyhedra.js","../esm/primitives/sphere.js","../esm/primitives/torus.js","../esm/adapters/shared.js","../esm/adapters/threejsadapter.js","../esm/adapters/webgpu/constants.js","../esm/adapters/webgpu/abstractions.js","../esm/adapters/webgpu/buffers.js","../esm/adapters/webgpu/wgsl/basic-material-fragment.js","../esm/adapters/webgpu/wgsl/line-material-fragment.js","../esm/adapters/webgpu/materials.js","../esm/adapters/webgpu/wgsl/shared.js","../esm/adapters/webgpu/wgsl/mesh-vertex.js","../esm/adapters/webgpu/wgsl/line-vertex.js","../esm/adapters/webgpu/wgsl/object-picking-fragment.js","../esm/adapters/webgpu/wgsl/texture-fragment.js","../esm/adapters/webgpu/wgsl/directional-light-fragment.js","../esm/adapters/webgpu/wgsl/omni-light-fragment.js","../esm/adapters/webgpu/wgsl/ambient-light-fragment.js","../esm/adapters/webgpu/cameras.js","../esm/adapters/webgpu/renderablebuffer.js","../esm/adapters/webgpu/pipelinefactory.js","../esm/adapters/webgpu/raycaster.js","../esm/adapters/webgpu/renderer.js","../esm/adapters/webgpu/webgpuadapter.js","../esm/adapters/webgpu/behaviors/orbit-camera.js","../esm/detector.js","../esm/parsers/parser.js","../esm/index-iife.js"],"sourcesContent":["import { Utils } from '@pacem/pacem-core';\nimport { parseAsNumericalArray } from '@pacem/pacem-foundation';\nimport { Geometry } from '@pacem/pacem-numerical';\n//namespace Pacem.Drawing3D {\nexport const Point3DConverter = {\n convert: (attr) => Geometry.LinearAlgebra.Vector3D.parse(attr),\n convertBack: (prop) => `${prop.x || 0} ${prop.y || 0} ${prop.z || 0}`\n};\nexport const Point3DOrNumberConverter = {\n convert: (attr) => {\n const arr = parseAsNumericalArray(attr);\n const throwErr = () => { throw new Error(`Cannot parse \"${attr}\" as a valid Vector3D.`); };\n if (Utils.isNullOrEmpty(arr)) {\n throwErr();\n }\n if (arr.length === 3) {\n return Geometry.LinearAlgebra.Vector3D.from(...arr);\n }\n if (arr.length === 1) {\n const v = arr[0];\n return Geometry.LinearAlgebra.Vector3D.from(v, v, v);\n }\n throwErr();\n },\n convertBack: (prop) => `${prop.x || 0} ${prop.y || 0} ${prop.z || 0}`\n};\nexport const QuaternionConverter = {\n convert: (attr) => Geometry.LinearAlgebra.Quaternion.parse(attr),\n convertBack: (prop) => `${prop.x || 0} ${prop.y || 0} ${prop.z || 0} ${prop.w || 0}`\n};\nexport const BooleanOrNumberConverter = {\n convert: (attr) => {\n if (attr === 'true')\n return true;\n if (attr === 'false')\n return false;\n return parseAsNumericalArray(attr)[0];\n },\n convertBack: (prop) => prop.toString()\n};\n","export const TAG_MIDDLE_NAME = \"3d\";\nexport const DEG2RAD = Math.PI / 180;\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, P, PCSS, Defaults, ViewChild, Watch, PropertyConverters, Utils, Components, PropertyChangeEventName, Logging, Animations, UI } from '@pacem/pacem-core';\nimport { RenderableEvent, DragEvent, RenderableElement } from './types';\nimport { TAG_MIDDLE_NAME } from './constants';\n//namespace Pacem.Components.Drawing3D {\nlet Pacem3DElement = class Pacem3DElement extends Components.PacemItemsContainerElement {\n constructor() {\n super(...arguments);\n this._itemPropertyChangeHandler = (evt) => {\n const renderable = evt.target;\n // clear flags\n // TODO: be more precise\n this.adapter &&\n this.adapter.updateItem(this, renderable);\n renderable.flags.splice(0);\n };\n this._clickHandler = (evt) => {\n let me = this;\n if (!me.interactive || Utils.isNull(me._lastHitResult)) {\n return;\n }\n const type = evt.type.replace(/^mouse/, '');\n const hit = me._lastHitResult, object = hit.object, point = hit.point;\n this._itemDispatch(object, point, type, evt);\n };\n this._hitTestCallback = (result, evt) => {\n const me = this;\n // TODO: handle dragging\n if (result != me._lastHitResult) {\n if (result?.object != me._lastHitResult?.object) {\n const obj = result?.object, last = me._lastHitResult?.object, pt = result?.point;\n if (!Utils.isNull(last)) {\n this._itemDispatch(last, pt, 'out', evt);\n }\n if (!Utils.isNull(obj)) {\n this._itemDispatch(obj, pt, 'over', evt);\n }\n }\n me._lastHitResult = result;\n }\n };\n this._moveHandler = (evt) => {\n let me = this;\n if (!me.adapter || !me.interactive) {\n return;\n }\n const rect = me._resizer.currentSize;\n const callback = (r) => me._hitTestCallback(r, evt);\n const pixel = evt.type === 'mousemove' ? { x: evt.pageX - rect.left, y: evt.pageY - rect.top } : { x: -1, y: -1 };\n me.adapter.raycast(this, pixel, rect, callback);\n };\n this._resizeHandler = (evt) => {\n const oldSize = this.#size;\n const size = evt.detail;\n if (!Utils.isNull(oldSize) && oldSize.height === size.height && oldSize.width === size.width) {\n return;\n }\n this.#size = size;\n const adapter = this.adapter;\n if (!Utils.isNull(adapter)) {\n this.adapter.invalidateSize(this, size);\n this.dispatchEvent(new Components.ResizeEvent(size));\n }\n };\n //#endregion\n }\n validate(item) {\n return item instanceof RenderableElement;\n }\n get stage() {\n return this._container;\n }\n get scene() {\n return this.adapter && this.adapter.getScene(this);\n }\n register(item) {\n const retval = super.register(item);\n if (retval) {\n this._add(item);\n item.addEventListener(PropertyChangeEventName, this._itemPropertyChangeHandler, false);\n }\n return retval;\n }\n unregister(item) {\n const retval = super.unregister(item);\n if (retval) {\n item.removeEventListener(PropertyChangeEventName, this._itemPropertyChangeHandler, false);\n this._erase(item);\n }\n return retval;\n }\n _refreshDatasource(val = this.datasource) {\n this.adapter?.updateItem(this, undefined);\n }\n _buildUpDatasourceFromDOM(val = this.items) {\n if (!Utils.isNullOrEmpty(val)) {\n this.datasource = val.slice();\n }\n }\n _add(item) {\n this.adapter &&\n this.adapter.addItem(this, item);\n }\n _erase(item) {\n this.adapter &&\n this.adapter.removeItem(this, item);\n }\n _initializeAdapter(old, val) {\n return new Promise((resolve, reject) => {\n const items = this.datasource || [];\n if (!Utils.isNull(old)) {\n items.forEach(i => old.removeItem(this, i));\n }\n if (!Utils.isNull(this._container) && !Utils.isNull(val)) {\n val.initialize(this).then(_ => {\n (items || []).forEach(i => this._add(i));\n resolve();\n }, e => {\n this.log(Logging.LogLevel.Error, e?.toString());\n reject(e);\n });\n }\n else {\n resolve();\n }\n });\n }\n //#region lifecycle\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (first) {\n return;\n }\n switch (name) {\n case 'adapter':\n this._initializeAdapter(old, val);\n break;\n case 'items':\n this._buildUpDatasourceFromDOM(val);\n break;\n case 'transparent':\n this.adapter?.invalidateSize(this, this.size);\n break;\n case 'datasource':\n this._refreshDatasource(val);\n case 'disabled':\n case 'background':\n this.render();\n break;\n }\n }\n viewActivatedCallback() {\n super.viewActivatedCallback();\n // stage\n const container = this._container;\n // resizer\n const resizer = this._resizer;\n resizer.addEventListener('resize', this._resizeHandler, false);\n resizer.target = container;\n // adapter\n this._initializeAdapter(null, this.adapter).then(_ => {\n container.addEventListener('mousemove', this._moveHandler, false);\n container.addEventListener('click', this._clickHandler, false);\n container.addEventListener('mouseup', this._clickHandler, false);\n container.addEventListener('mousedown', this._clickHandler, false);\n container.addEventListener('mouseout', this._moveHandler, false);\n this._buildUpDatasourceFromDOM();\n this.render();\n });\n }\n _itemDispatch(target, point, type, offset) {\n if (!Utils.isNull(target)) {\n var dragArgs, originalEvent, evtType;\n if (offset instanceof Event) {\n originalEvent = offset;\n }\n else {\n dragArgs = { item: target, offset: offset };\n }\n if (typeof type === 'string') {\n evtType = type;\n }\n else {\n evtType = type.type;\n originalEvent = type.originalEvent;\n }\n const m = point;\n const evt = () => offset instanceof Event ? new RenderableEvent(evtType, target, originalEvent, m) : new DragEvent(evtType, { detail: dragArgs, cancelable: evtType === UI.DragDropEventType.Init || evtType === UI.DragDropEventType.Drag }, originalEvent, m), itemevt = offset instanceof Event ? new RenderableEvent('item' + evtType, target, originalEvent, m) : new DragEvent('item' + evtType, { detail: dragArgs, cancelable: evtType === UI.DragDropEventType.Init || evtType === UI.DragDropEventType.Drag }, originalEvent, m);\n var prevent = false;\n if (target instanceof EventTarget) {\n const evnt = evt();\n target.dispatchEvent(evnt);\n prevent = evnt.defaultPrevented;\n }\n target.stage.dispatchEvent(itemevt);\n // was the event (in one of its forms) rejected?\n return prevent || itemevt.defaultPrevented;\n }\n return false;\n }\n disconnectedCallback() {\n this.#handle?.stop();\n const resizer = this._resizer, container = this._container;\n if (!Utils.isNull(container)) {\n container.removeEventListener('click', this._clickHandler, false);\n container.removeEventListener('mouseup', this._clickHandler, false);\n container.removeEventListener('mousedown', this._clickHandler, false);\n container.removeEventListener('mousemove', this._moveHandler, false);\n container.removeEventListener('mouseout', this._moveHandler, false);\n }\n if (!Utils.isNull(resizer)) {\n resizer.removeEventListener('resize', this._resizeHandler, false);\n }\n super.disconnectedCallback();\n }\n #size;\n get size() {\n return this.#size;\n }\n render(item, deepUpdate, now = performance.now()) {\n if (!Utils.isNull(item)) {\n const adapter = this.adapter;\n if (!Utils.isNull(adapter)) {\n adapter.updateItem(this, item);\n }\n }\n else {\n this.#handle?.stop();\n this.#handle = Animations.Timer.run(_ => this._doRender());\n //this._doRender();\n }\n }\n #handle;\n _doRender() {\n if (!this.disabled && !Utils.isNull(this.adapter)) {\n const scene = this.adapter.getScene(this);\n let cancelable = new CustomEvent('prerender', { detail: { scene }, cancelable: true });\n this.dispatchEvent(cancelable);\n if (!cancelable.defaultPrevented) {\n this.adapter.render(this);\n this.dispatchEvent(new CustomEvent('render', { detail: { scene } }));\n }\n }\n }\n};\n__decorate([\n ViewChild(`.${PCSS}-3d`)\n], Pacem3DElement.prototype, \"_container\", void 0);\n__decorate([\n ViewChild(P + '-resize')\n], Pacem3DElement.prototype, \"_resizer\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Boolean })\n], Pacem3DElement.prototype, \"interactive\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Boolean })\n], Pacem3DElement.prototype, \"transparent\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], Pacem3DElement.prototype, \"background\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Element })\n], Pacem3DElement.prototype, \"adapter\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Json })\n], Pacem3DElement.prototype, \"datasource\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Boolean })\n], Pacem3DElement.prototype, \"orbit\", void 0);\nPacem3DElement = __decorate([\n CustomElement({\n tagName: P + '-' + TAG_MIDDLE_NAME, shadow: Defaults.USE_SHADOW_ROOT, template: `<${P}-resize watch-position=\"true\"></${P}-resize><div class=\"${PCSS}-3d\"></div><${P}-content></${P}-content>`\n })\n], Pacem3DElement);\nexport { Pacem3DElement };\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { Watch, PropertyConverters, CustomElement, PacemEventTarget, PropertyChangeEvent, CustomElementUtils, CustomUIEvent, P, Utils, Components } from '@pacem/pacem-core';\nimport { Geometry } from '@pacem/pacem-numerical';\nimport { Point3DConverter, Point3DOrNumberConverter, QuaternionConverter } from './converters';\nimport { Pacem3DElement } from './stage';\nimport { TAG_MIDDLE_NAME } from './constants';\nexport function isStage(object) {\n return !Utils.isNull(object) && 'render' in object && typeof object['render'] === 'function';\n}\nexport function isRenderable(object) {\n return isStage(object?.stage);\n}\nexport function isUi3DObject(object) {\n return 'transformMatrix' in object && isRenderable(object);\n}\nexport function isCamera(object) {\n return 'type' in object && 'up' in object && 'lookAt' in object && isRenderable(object);\n}\nexport function isPerspectiveCamera(object) {\n return isCamera(object) && 'type' in object && object.type === 'perspective';\n}\nexport function isOrthographicCamera(object) {\n return isCamera(object) && 'type' in object && object.type === 'orthographic';\n}\nexport function isLight(object) {\n return 'type' in object && (object.type === 'ambient' || object.type === 'omni' || object.type === 'direction' || object.type == 'spot') && isRenderable(object);\n}\nexport function isMesh(object) {\n return 'geometry' in object && isUi3DObject(object);\n}\nexport function isGeometry(object) {\n return 'positions' in object && Utils.isArray(object.positions);\n}\nexport function isMeshGeometry(object) {\n return ('triangleIndices' in object && Utils.isArray(object.triangleIndices)\n || 'normals' in object && Utils.isArray(object.normals)\n || 'textureCoordinates' in object && Utils.isArray(object.textureCoordinates)) && isGeometry(object);\n}\nexport function isGroup(object) {\n return 'childRenderables' in object && Utils.isArray(object['childRenderables']) && isUi3DObject(object);\n}\n/**\n * Sets the normals to a mesh geometry by computing each face's unit orthogonal vector.\n * @param geometry\n */\nexport function computeSharpVertexNormals(geometry) {\n const normals = [];\n if (!Utils.isNullOrEmpty(geometry)) {\n const indices = geometry.triangleIndices;\n if (indices.length % 3 !== 0) {\n throw new RangeError(`Invalid mesh geometry: ${indices.length} is not multiple of 3.`);\n }\n for (let j = 2; j < indices.length; j += 3) {\n const u = indices[j - 2], v = indices[j - 1], w = indices[j];\n const a = geometry.positions[u], b = geometry.positions[v], c = geometry.positions[w];\n const normal = computePlaneNormal(a, b, c);\n normals.push(normal, normal, normal);\n }\n }\n geometry.normals = normals;\n}\n/**\n * Computes the unit vector orthogonal to the plane identified by 3 points.\n * @param a\n * @param b\n * @param c\n */\nexport function computePlaneNormal(a, b, c) {\n // TODO: check input correctness (distinct points)\n const vAB = Geometry.LinearAlgebra.Vector3D.subtract(a, b), vAC = Geometry.LinearAlgebra.Vector3D.subtract(a, c);\n const orthogonal = Geometry.LinearAlgebra.Vector3D.cross(vAB, vAC);\n return Geometry.LinearAlgebra.Vector3D.unit(orthogonal);\n}\nexport class UI3DEvent extends CustomUIEvent {\n constructor(type, eventInit, originalEvent, point) {\n super(type, eventInit, originalEvent);\n this.#point = point;\n }\n #point;\n /** Gets the event's source position in 3d coordinates. */\n get point() {\n return this.#point;\n }\n}\nexport class DragEvent extends UI3DEvent {\n}\nexport class RenderableEvent extends UI3DEvent {\n constructor(type, args, originalEvent, p) {\n super(type, { detail: args, bubbles: true, cancelable: true }, originalEvent, p);\n }\n}\nexport var StalePropertyFlag;\n(function (StalePropertyFlag) {\n StalePropertyFlag[\"Position\"] = \"position\";\n StalePropertyFlag[\"Transform\"] = \"transform\";\n StalePropertyFlag[\"Geometry\"] = \"geometry\";\n StalePropertyFlag[\"Children\"] = \"children\";\n StalePropertyFlag[\"Material\"] = \"material\";\n StalePropertyFlag[\"Light\"] = \"light\";\n StalePropertyFlag[\"Camera\"] = \"camera\";\n StalePropertyFlag[\"Visibility\"] = \"visibility\";\n})(StalePropertyFlag || (StalePropertyFlag = {}));\nexport function isInteraction(object) {\n return typeof object === 'object' && 'time' in object && typeof object['time'] === 'number';\n}\n//namespace Pacem.Components.Drawing3D {\nconst Constants = {\n OBJECT_SELECTOR: P + '-' + TAG_MIDDLE_NAME + '-object',\n LIGHT_SELECTOR: P + '-' + TAG_MIDDLE_NAME + '-light',\n PERSPECTIVE_CAMERA_SELECTOR: P + '-' + TAG_MIDDLE_NAME + '-perspective-camera',\n ORTHO_CAMERA_SELECTOR: P + '-' + TAG_MIDDLE_NAME + '-orthographic-camera',\n LINE_SELECTOR: P + '-' + TAG_MIDDLE_NAME + '-line',\n MESH_SELECTOR: P + '-' + TAG_MIDDLE_NAME + '-mesh',\n GROUP_SELECTOR: P + '-' + TAG_MIDDLE_NAME + '-group',\n DEFAULT_COORDS: { x: 0, y: 0, z: 0 }\n};\nexport class RenderableElement extends Components.PacemCrossItemsContainerElement {\n constructor() {\n super(...arguments);\n this.position = Constants.DEFAULT_COORDS;\n this.#staleFlags = [];\n }\n validate(_) {\n // by default no children allowed (Group will except)\n return false;\n }\n findContainer() {\n // override\n return this.parent || this.stage;\n }\n get stage() {\n return this['_scene'] = this['_scene'] || CustomElementUtils.findAncestorOfType(this, Pacem3DElement);\n }\n get parent() {\n return this['_drawableParent'] = this['_drawableParent'] || CustomElementUtils.findAncestor(this, i => i instanceof RenderableElement);\n }\n disconnectedCallback() {\n delete this['_scene'];\n delete this['_drawableParent'];\n super.disconnectedCallback();\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'hide':\n this.setAsDirty(StalePropertyFlag.Visibility);\n break;\n case 'items':\n this.setAsDirty(StalePropertyFlag.Children);\n break;\n case 'position':\n this.setAsDirty(StalePropertyFlag.Position);\n break;\n }\n }\n #staleFlags;\n get flags() {\n return this.#staleFlags;\n }\n /** Calls for a redraw of the current element in the next rendering process. */\n setAsDirty(...flags) {\n // set the flags that identify the stale part of the object to be updated.\n for (let flag of flags) {\n if (!this.flags.includes(flag)) {\n this.flags.push(flag);\n }\n }\n this.stage?.render(this);\n }\n}\n__decorate([\n Watch({ emit: false, converter: Point3DConverter })\n], RenderableElement.prototype, \"position\", void 0);\n__decorate([\n Watch({ emit: false, reflectBack: true, converter: PropertyConverters.String })\n], RenderableElement.prototype, \"tag\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Boolean })\n], RenderableElement.prototype, \"inert\", void 0);\nexport class Ui3DElement extends RenderableElement {\n // #endregion\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'transformMatrix':\n this.setAsDirty(StalePropertyFlag.Transform);\n break;\n case 'translateZ':\n case 'translateX':\n case 'translateY':\n this.offset = { x: this.translateX, y: this.translateY, z: this.translateZ };\n break;\n case 'scaleX':\n case 'scaleY':\n case 'scaleZ':\n this.scale = { x: this.scaleX, y: this.scaleY, z: this.scaleZ };\n break;\n case 'scale':\n case 'offset':\n case 'rotate':\n this._computeTransformMatrix();\n break;\n }\n }\n _computeTransformMatrix() {\n const MAT3D = Geometry.LinearAlgebra.Matrix3D, VEC3D = Geometry.LinearAlgebra.Vector3D, QUAT = Geometry.LinearAlgebra.Quaternion;\n // scale\n const scale = this.scale ?? VEC3D.from(1, 1, 1);\n let m = MAT3D.scale(MAT3D.identity(), scale);\n // rotate\n if (!Utils.isNull(this.rotate)) {\n const rot = QUAT.toRotationMatrix(this.rotate);\n m = MAT3D.multiply(m, rot);\n }\n // translate\n const offset = this.offset ?? VEC3D.from(0, 0, 0);\n m = MAT3D.translate(m, offset);\n this.transformMatrix = m;\n }\n}\n__decorate([\n Watch({ emit: false, converter: QuaternionConverter })\n], Ui3DElement.prototype, \"rotate\", void 0);\n__decorate([\n Watch({ emit: false, converter: Point3DOrNumberConverter })\n], Ui3DElement.prototype, \"scale\", void 0);\n__decorate([\n Watch({ emit: false, converter: Point3DOrNumberConverter })\n], Ui3DElement.prototype, \"offset\", void 0);\n__decorate([\n Watch({ emit: false })\n], Ui3DElement.prototype, \"transformMatrix\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Ui3DElement.prototype, \"scaleX\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Ui3DElement.prototype, \"scaleY\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Ui3DElement.prototype, \"scaleZ\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Ui3DElement.prototype, \"translateX\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Ui3DElement.prototype, \"translateY\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Ui3DElement.prototype, \"translateZ\", void 0);\nlet Pacem3DGroupElement = class Pacem3DGroupElement extends Ui3DElement {\n validate(child) {\n // overrides default denial\n return child instanceof RenderableElement;\n }\n #children = [];\n get childRenderables() {\n return this.#children;\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'items':\n case 'datasource':\n this.#children = (val || []);\n this.setAsDirty(StalePropertyFlag.Children);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false })\n], Pacem3DGroupElement.prototype, \"datasource\", void 0);\nPacem3DGroupElement = __decorate([\n CustomElement({ tagName: Constants.GROUP_SELECTOR })\n], Pacem3DGroupElement);\nexport { Pacem3DGroupElement };\nlet Pacem3DMeshElement = class Pacem3DMeshElement extends Ui3DElement {\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'geometry':\n this.setAsDirty(StalePropertyFlag.Geometry);\n break;\n case 'material':\n case 'backMaterial':\n this.setAsDirty(StalePropertyFlag.Material);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Json })\n], Pacem3DMeshElement.prototype, \"geometry\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Json })\n], Pacem3DMeshElement.prototype, \"material\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Json })\n], Pacem3DMeshElement.prototype, \"backMaterial\", void 0);\nPacem3DMeshElement = __decorate([\n CustomElement({ tagName: Constants.MESH_SELECTOR })\n], Pacem3DMeshElement);\nexport { Pacem3DMeshElement };\nlet Pacem3DObjectElement = class Pacem3DObjectElement extends Ui3DElement {\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (name === 'content' || name === 'type') {\n this.setAsDirty(StalePropertyFlag.Geometry, StalePropertyFlag.Material);\n }\n }\n};\n__decorate([\n Watch({ emit: false })\n], Pacem3DObjectElement.prototype, \"content\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], Pacem3DObjectElement.prototype, \"type\", void 0);\nPacem3DObjectElement = __decorate([\n CustomElement({ tagName: Constants.OBJECT_SELECTOR })\n], Pacem3DObjectElement);\nexport { Pacem3DObjectElement };\nlet Pacem3DLightElement = class Pacem3DLightElement extends RenderableElement {\n constructor() {\n super(...arguments);\n this.intensity = .85;\n this.target = Constants.DEFAULT_COORDS;\n this.color = '#fff';\n this.type = 'omni';\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'type':\n case 'color':\n case 'intensity':\n case 'target':\n this.setAsDirty(StalePropertyFlag.Light);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Pacem3DLightElement.prototype, \"intensity\", void 0);\n__decorate([\n Watch({ emit: false, converter: Point3DConverter })\n], Pacem3DLightElement.prototype, \"target\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], Pacem3DLightElement.prototype, \"color\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], Pacem3DLightElement.prototype, \"type\", void 0);\nPacem3DLightElement = __decorate([\n CustomElement({ tagName: Constants.LIGHT_SELECTOR })\n], Pacem3DLightElement);\nexport { Pacem3DLightElement };\nexport class Pacem3DCameraElement extends RenderableElement {\n constructor() {\n super(...arguments);\n this.near = 0.1;\n this.far = 1000.0;\n this.up = Geometry.LinearAlgebra.Vector3D.j();\n this.lookAt = Constants.DEFAULT_COORDS;\n }\n #sphere;\n _resetBoundingSphere() {\n const oldValue = this.#sphere;\n const eye = this.position, center = this.lookAt;\n const radius = Utils.isNullOrEmpty(eye) || Utils.isNullOrEmpty(center) ? 0\n : Geometry.LinearAlgebra.Vector3D.mag(Geometry.LinearAlgebra.Vector3D.subtract(eye, center));\n const currentValue = this.#sphere = { center, radius };\n this.dispatchEvent(new PropertyChangeEvent({ currentValue, propertyName: 'boundingSphere', oldValue }));\n }\n get boundingSphere() {\n return this.#sphere;\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'lookAt':\n case 'position':\n this._resetBoundingSphere();\n case 'near':\n case 'far':\n case 'up':\n this.setAsDirty(StalePropertyFlag.Camera);\n break;\n }\n }\n}\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Pacem3DCameraElement.prototype, \"near\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Pacem3DCameraElement.prototype, \"far\", void 0);\n__decorate([\n Watch({ emit: false, converter: Point3DConverter })\n], Pacem3DCameraElement.prototype, \"up\", void 0);\n__decorate([\n Watch({ emit: false, converter: Point3DConverter })\n], Pacem3DCameraElement.prototype, \"lookAt\", void 0);\nlet Pacem3DPerspectiveCameraElement = class Pacem3DPerspectiveCameraElement extends Pacem3DCameraElement {\n constructor() {\n super(...arguments);\n this.fov = 45;\n this.aspect = 1;\n }\n get type() {\n return \"perspective\";\n }\n get aspectRatio() {\n return this.aspect;\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'fov':\n case 'aspect':\n this.setAsDirty(StalePropertyFlag.Camera);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Pacem3DPerspectiveCameraElement.prototype, \"fov\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Pacem3DPerspectiveCameraElement.prototype, \"aspect\", void 0);\nPacem3DPerspectiveCameraElement = __decorate([\n CustomElement({ tagName: Constants.PERSPECTIVE_CAMERA_SELECTOR })\n], Pacem3DPerspectiveCameraElement);\nexport { Pacem3DPerspectiveCameraElement };\nlet Pacem3DOrthographicCameraElement = class Pacem3DOrthographicCameraElement extends Pacem3DCameraElement {\n constructor() {\n super(...arguments);\n this.top = 1;\n this.left = -1;\n this.bottom = -1;\n this.right = 1;\n }\n get type() {\n return \"orthographic\";\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'top':\n case 'left':\n case 'bottom':\n case 'right':\n this.setAsDirty(StalePropertyFlag.Camera);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Pacem3DOrthographicCameraElement.prototype, \"top\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Pacem3DOrthographicCameraElement.prototype, \"left\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Pacem3DOrthographicCameraElement.prototype, \"bottom\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Pacem3DOrthographicCameraElement.prototype, \"right\", void 0);\nPacem3DOrthographicCameraElement = __decorate([\n CustomElement({ tagName: Constants.ORTHO_CAMERA_SELECTOR })\n], Pacem3DOrthographicCameraElement);\nexport { Pacem3DOrthographicCameraElement };\nexport class Pacem3DAdapterElement extends PacemEventTarget {\n}\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { PacemEventTarget, Utils, Watch, PropertyConverters, PCSS } from '@pacem/pacem-core';\nimport { Imaging } from '@pacem/pacem-foundation';\nimport { StalePropertyFlag } from '../types';\n//namespace Pacem.Drawing3D {\nexport var KnownShader;\n(function (KnownShader) {\n KnownShader[\"Basic\"] = \"basic\";\n KnownShader[\"Lambert\"] = \"lambert\";\n KnownShader[\"Phong\"] = \"phong\";\n KnownShader[\"Standard\"] = \"standard\";\n KnownShader[\"Line\"] = \"line\";\n KnownShader[\"Custom\"] = \"custom\";\n})(KnownShader || (KnownShader = {}));\nexport function isMaterial(obj) {\n return /*'color' in obj &&*/ 'shader' in obj;\n}\nexport function isBasicMaterial(obj) {\n return isMaterial(obj) && obj.shader === KnownShader.Basic;\n}\nexport function isLineMaterial(obj) {\n return isMaterial(obj) && obj.shader === KnownShader.Line;\n}\nexport function isLambertMaterial(obj) {\n return isMaterial(obj) && obj.shader === KnownShader.Lambert;\n}\nexport function isPhongMaterial(obj) {\n return isMaterial(obj) && obj.shader === KnownShader.Phong;\n}\nexport function isStandardMaterial(obj) {\n return isMaterial(obj) && obj.shader === KnownShader.Standard;\n}\nexport function isShaderMaterial(obj) {\n return isMaterial(obj) && obj.shader === KnownShader.Custom;\n}\n//namespace Pacem.Components.Drawing3D {\nexport class MaterialElement extends PacemEventTarget {\n constructor(shader) {\n super();\n this.#shader = shader;\n }\n #shader;\n get shader() {\n return this.#shader;\n }\n async _loadMap(url, old = this.material?.texture) {\n if (!Utils.isNull(old)) {\n old.close();\n }\n if (Utils.isNullOrEmpty(url)) {\n return null;\n }\n const blob = await Imaging.loadImage(url);\n if (Utils.isNull(blob)) {\n return null;\n }\n return await createImageBitmap(blob);\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (!first) {\n switch (name) {\n case 'map':\n case 'opacity':\n case 'wireframe':\n case 'color':\n case 'hide':\n this.updateMaterial();\n break;\n }\n }\n }\n viewActivatedCallback() {\n super.viewActivatedCallback();\n this.updateMaterial();\n }\n updateMaterial() {\n this.createMaterial().then(m => {\n this.material = Utils.extend(m, { flags: [StalePropertyFlag.Material] });\n });\n }\n async createMaterial() {\n return {\n opacity: this.opacity ?? 1.0,\n wireframe: this.wireframe ?? false,\n color: this.color || Utils.Css.getVariableValue(`--${PCSS}-color-primary`),\n visible: !(this.hide ?? false),\n map: this.map,\n texture: await this._loadMap(this.map),\n shader: this.shader,\n flags: [],\n };\n }\n}\n__decorate([\n Watch()\n], MaterialElement.prototype, \"material\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], MaterialElement.prototype, \"opacity\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Boolean })\n], MaterialElement.prototype, \"wireframe\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], MaterialElement.prototype, \"color\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Boolean })\n], MaterialElement.prototype, \"hide\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], MaterialElement.prototype, \"map\", void 0);\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, P } from '@pacem/pacem-core';\nimport { KnownShader, MaterialElement } from './material';\nimport { TAG_MIDDLE_NAME } from '../constants';\n//namespace Pacem.Components.Drawing3D {\nlet BasicMaterialElement = class BasicMaterialElement extends MaterialElement {\n constructor() {\n super(KnownShader.Basic);\n }\n};\nBasicMaterialElement = __decorate([\n CustomElement({ tagName: `${P}-${TAG_MIDDLE_NAME}-material-basic` })\n], BasicMaterialElement);\nexport { BasicMaterialElement };\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, P, Watch, PropertyConverters, Utils } from '@pacem/pacem-core';\nimport { TAG_MIDDLE_NAME } from '../constants';\nimport { KnownShader, MaterialElement } from './material';\n//namespace Pacem.Components.Drawing3D {\nlet LambertMaterialElement = class LambertMaterialElement extends MaterialElement {\n constructor() {\n super(KnownShader.Lambert);\n }\n async createMaterial() {\n return Utils.extend({\n emissiveColor: this.emissiveColor || '#000',\n reflectivity: this.reflectivity ?? 0,\n refractionRatio: this.refractionRatio ?? 0\n }, await super.createMaterial());\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (!first) {\n switch (name) {\n case 'emissiveColor':\n case 'reflectivity':\n case 'refractionRatio':\n this.updateMaterial();\n break;\n }\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], LambertMaterialElement.prototype, \"emissiveColor\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], LambertMaterialElement.prototype, \"reflectivity\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], LambertMaterialElement.prototype, \"refractionRatio\", void 0);\nLambertMaterialElement = __decorate([\n CustomElement({ tagName: `${P}-${TAG_MIDDLE_NAME}-material-lambert` })\n], LambertMaterialElement);\nexport { LambertMaterialElement };\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, P, Watch, PropertyConverters, Utils } from '@pacem/pacem-core';\nimport { TAG_MIDDLE_NAME } from '../constants';\nimport { KnownShader, MaterialElement } from './material';\n//namespace Pacem.Components.Drawing3D {\nlet LineMaterialElement = class LineMaterialElement extends MaterialElement {\n constructor() {\n super(KnownShader.Line);\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (!first) {\n switch (name) {\n case 'lineWidth':\n case 'lineJoin':\n case 'lineCap':\n case 'dashArray':\n this.updateMaterial();\n break;\n }\n }\n }\n async createMaterial() {\n return Utils.extend({\n lineWidth: this.lineWidth ?? 1,\n lineJoin: this.lineJoin ?? 'round',\n lineCap: this.lineCap ?? 'round',\n dashArray: this.dashArray,\n }, await super.createMaterial());\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], LineMaterialElement.prototype, \"lineWidth\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], LineMaterialElement.prototype, \"lineJoin\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], LineMaterialElement.prototype, \"lineCap\", void 0);\n__decorate([\n Watch({\n emit: false, converter: {\n convert: (attr) => attr?.split(',').map(i => parseInt(i)).filter(i => !Number.isNaN(i)),\n convertBack: (prop) => prop?.join(',')\n }\n })\n], LineMaterialElement.prototype, \"dashArray\", void 0);\nLineMaterialElement = __decorate([\n CustomElement({ tagName: `${P}-${TAG_MIDDLE_NAME}-material-line` })\n], LineMaterialElement);\nexport { LineMaterialElement };\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, P, Watch, PropertyConverters, Utils } from '@pacem/pacem-core';\nimport { TAG_MIDDLE_NAME } from '../constants';\nimport { KnownShader, MaterialElement } from './material';\n//namespace Pacem.Components.Drawing3D {\nlet PhongMaterialElement = class PhongMaterialElement extends MaterialElement {\n constructor() {\n super(KnownShader.Phong);\n }\n async createMaterial() {\n return Utils.extend({\n emissiveColor: this.emissiveColor || '#000',\n reflectivity: this.reflectivity ?? 0,\n refractionRatio: this.refractionRatio ?? 0,\n specularColor: this.specularColor || '#000',\n shininess: this.shininess ?? 0,\n flatShading: this.flatShading ?? true\n }, await super.createMaterial());\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (!first) {\n switch (name) {\n case 'emissiveColor':\n case 'reflectivity':\n case 'refractionRatio':\n case 'specularColor':\n case 'shininess':\n case 'flatShading':\n this.updateMaterial();\n break;\n }\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], PhongMaterialElement.prototype, \"emissiveColor\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PhongMaterialElement.prototype, \"reflectivity\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PhongMaterialElement.prototype, \"refractionRatio\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], PhongMaterialElement.prototype, \"specularColor\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PhongMaterialElement.prototype, \"shininess\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Boolean })\n], PhongMaterialElement.prototype, \"flatShading\", void 0);\nPhongMaterialElement = __decorate([\n CustomElement({ tagName: `${P}-${TAG_MIDDLE_NAME}-material-phong` })\n], PhongMaterialElement);\nexport { PhongMaterialElement };\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, P, Watch, PropertyConverters, Utils } from '@pacem/pacem-core';\nimport { TAG_MIDDLE_NAME } from '../constants';\nimport { KnownShader, MaterialElement } from './material';\n//namespace Pacem.Components.Drawing3D {\nlet StandardMaterialElement = class StandardMaterialElement extends MaterialElement {\n constructor() {\n super(KnownShader.Standard);\n }\n async createMaterial() {\n return Utils.extend({\n emissiveColor: this.emissiveColor || '#000',\n refractionRatio: this.refractionRatio ?? 0,\n metalness: this.metalness ?? 0,\n roughness: this.roughness ?? 0,\n flatShading: this.flatShading ?? false\n }, await super.createMaterial());\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (!first) {\n switch (name) {\n case 'emissiveColor':\n case 'roughness':\n case 'metalness':\n case 'refractionRatio':\n case 'flatShading':\n this.updateMaterial();\n break;\n }\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], StandardMaterialElement.prototype, \"emissiveColor\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], StandardMaterialElement.prototype, \"refractionRatio\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], StandardMaterialElement.prototype, \"roughness\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], StandardMaterialElement.prototype, \"metalness\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Boolean })\n], StandardMaterialElement.prototype, \"flatShading\", void 0);\nStandardMaterialElement = __decorate([\n CustomElement({ tagName: `${P}-${TAG_MIDDLE_NAME}-material-standard` })\n], StandardMaterialElement);\nexport { StandardMaterialElement };\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { PacemEventTarget, Watch, PropertyConverters, Utils } from '@pacem/pacem-core';\n//namespace Pacem.Components.Drawing3D {\nexport class Pacem3DPrimitiveElement extends PacemEventTarget {\n viewActivatedCallback() {\n super.viewActivatedCallback();\n if (Utils.isNull(this.geometry)) {\n this.geometry = this.createDefaultGeometry();\n }\n }\n}\n__decorate([\n Watch({ converter: PropertyConverters.Json })\n], Pacem3DPrimitiveElement.prototype, \"geometry\", void 0);\n","import { Utils } from '@pacem/pacem-core';\n//namespace Pacem.Drawing3D {\nexport function NotifyChange(callback) {\n return (target, prop, descriptor) => {\n const backingField = `_${prop}_${Utils.uniqueCode()}_backingField`;\n function getter() {\n return this[backingField];\n }\n function setter(val) {\n if (val !== this[backingField]) {\n const old = this[backingField];\n this[backingField] = val;\n callback.call(this, prop, old, val);\n }\n }\n //if (delete target[prop]) {\n Object.defineProperty(target, prop, {\n get: function () {\n return getter.call(this);\n },\n set: function (val) {\n setter.call(this, val);\n },\n enumerable: true,\n configurable: false\n });\n //}\n };\n}\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { Utils } from '@pacem/pacem-core';\nimport { StalePropertyFlag } from './types';\nimport { NotifyChange } from './decorators';\nexport class NodeGeometry {\n constructor(positions = []) {\n this.positions = positions;\n }\n static barycenter(positions) {\n var bary = { x: 0, y: 0, z: 0 };\n if (!Utils.isNullOrEmpty(positions)) {\n var count = positions.length;\n for (var i = 0; i < positions.length; i++) {\n var pt = positions[i];\n bary.x += pt.x;\n bary.y += pt.y;\n bary.z += pt.z;\n }\n var countDbl = 1.0 * count;\n bary.x /= countDbl;\n bary.y /= countDbl;\n bary.z /= countDbl;\n }\n return bary;\n }\n static boundingBox(positions) {\n const output = {\n minX: +Infinity, minY: +Infinity, minZ: +Infinity,\n maxX: -Infinity, maxY: -Infinity, maxZ: -Infinity\n };\n if (!Utils.isNullOrEmpty(positions)) {\n for (var i = 0; i < positions.length; i++) {\n var pt = positions[i];\n output.minX = Math.min(output.minX, pt.x);\n output.minY = Math.min(output.minY, pt.y);\n output.minZ = Math.min(output.minZ, pt.z);\n output.maxX = Math.max(output.maxX, pt.x);\n output.maxY = Math.max(output.maxY, pt.y);\n output.maxZ = Math.max(output.maxZ, pt.z);\n }\n }\n return output;\n }\n setAsDirty() {\n setSelfAsDirty.call(this);\n }\n}\nfunction setSelfAsDirty() {\n const me = this;\n me.flags = [/* no further specifications, other than 'geometry' */ StalePropertyFlag.Geometry];\n}\nexport class LineGeometry extends NodeGeometry {\n}\n__decorate([\n NotifyChange(setSelfAsDirty)\n], LineGeometry.prototype, \"positions\", void 0);\nexport class MeshGeometry extends NodeGeometry {\n #boundingBox;\n #boundingSphere;\n #barycenter;\n get barycenter() {\n return this.#barycenter ??= NodeGeometry.barycenter(this.positions);\n }\n set barycenter(point) {\n this.#barycenter = point;\n }\n get boundingBox() {\n return this.#boundingBox ??= NodeGeometry.boundingBox(this.positions);\n }\n set boundingBox(bbox) {\n this.#boundingBox = bbox;\n }\n get boundingSphere() {\n return this.#boundingSphere;\n }\n set boundingSphere(sphere) {\n this.#boundingSphere = sphere;\n }\n constructor(positions, triangleIndices, textureCoordinates = [], normals = []) {\n super(positions);\n this.triangleIndices = triangleIndices;\n this.textureCoordinates = textureCoordinates;\n this.normals = normals;\n }\n}\n__decorate([\n NotifyChange(setSelfAsDirty)\n], MeshGeometry.prototype, \"positions\", void 0);\n__decorate([\n NotifyChange(setSelfAsDirty)\n], MeshGeometry.prototype, \"triangleIndices\", void 0);\n__decorate([\n NotifyChange(setSelfAsDirty)\n], MeshGeometry.prototype, \"textureCoordinates\", void 0);\n__decorate([\n NotifyChange(setSelfAsDirty)\n], MeshGeometry.prototype, \"normals\", void 0);\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar PacemBoxElement_1;\nimport { CustomElement, P, Watch, PropertyConverters } from '@pacem/pacem-core';\nimport { computeSharpVertexNormals } from '../types';\nimport { MeshGeometry } from '../geometry';\nimport { Pacem3DPrimitiveElement } from './primitive';\nimport { TAG_MIDDLE_NAME } from '../constants';\n//namespace Pacem.Components.Drawing3D {\nlet PacemBoxElement = PacemBoxElement_1 = class PacemBoxElement extends Pacem3DPrimitiveElement {\n static createMeshGeometry(width, height, depth, widthSegments, heightSegments, depthSegments) {\n const w = width || 1, h = height || 1, d = depth || 1, sw = widthSegments || 1, sh = heightSegments || 1, sd = depthSegments || 1;\n const positions = [];\n const uv = [];\n const indices = [];\n // populationg positions\n for (var j = 0; j <= sh; j++) {\n var y = h / 2.0 - h * (1.0 * j) / (1.0 * sh); // ??\n for (var k = 0; k <= sd; k++) {\n var z = -d / 2.0 + d * (1.0 * k) / (1.0 * sd);\n for (var i = 0; i <= sw; i++) {\n var x = -w / 2.0 + w * (1.0 * i) / (1.0 * sw);\n // add only surface nodes\n if (i == 0 || i == sw || k == 0 || k == sd || j == 0 || j == sh)\n positions.push({ x, y, z });\n }\n }\n }\n var getPosIndex = function (x, y, z) {\n var epsilon = .00001;\n for (var i = 0; i < positions.length; i++) {\n var pt = positions[i];\n if (Math.abs(pt.x - x) < epsilon && Math.abs(pt.y - y) < epsilon && Math.abs(pt.z - z) < epsilon)\n return i;\n }\n return -1;\n };\n var appendFace = function (c_1, c_2, c_3, c_4, u, v, u_next, v_next) {\n indices.push(c_1);\n indices.push(c_2);\n indices.push(c_3);\n indices.push(c_1);\n indices.push(c_3);\n indices.push(c_4);\n uv.push({ x: u, y: v_next });\n uv.push({ x: u_next, y: v_next });\n uv.push({ x: u_next, y: v });\n uv.push({ x: u, y: v_next });\n uv.push({ x: u_next, y: v });\n uv.push({ x: u, y: v });\n };\n // top face (1)\n for (var k = 0; k < sd; k++) {\n var y = h / 2.0;\n var z = -d / 2.0 + d * (1.0 * k) / (1.0 * sd);\n var z_next = -d / 2.0 + d * (1.0 * (k + 1)) / (1.0 * sd);\n for (var i = 0; i < sw; i++) {\n var x = -w / 2.0 + (1.0 * i) * w / (1.0 * sw);\n var x_next = -w / 2.0 + (1.0 * (i + 1)) * w / (1.0 * sw);\n // coord-indices + tex-coords\n var c_1 = getPosIndex(x, y, z_next);\n var c_2 = getPosIndex(x_next, y, z_next);\n var c_3 = getPosIndex(x_next, y, z);\n var c_4 = getPosIndex(x, y, z);\n var u_next = (1.0 * (i + 1)) / (1.0 * sw);\n var u = (1.0 * i) / (1.0 * sw);\n var v_next = 1.0 - (1.0 * (k + 1)) / (1.0 * sd);\n var v = 1.0 - (1.0 * k) / (1.0 * sd);\n appendFace(c_1, c_2, c_3, c_4, u, v, u_next, v_next);\n }\n }\n // back face (2)\n for (var j = 0; j < sh; j++) {\n var y = h / 2.0 - (1.0 * j) * h / (1.0 * sh);\n var y_next = h / 2.0 - (j + 1.0) * h / (1.0 * sh);\n var z = -d / 2.0;\n for (var i = 0; i < sw; i++) {\n var x = w / 2.0 - 1.0 * i * w / (1.0 * sw);\n var x_next = w / 2.0 - (i + 1.0) * w / (1.0 * sw);\n // coord-indices + tex-coords\n var c_1 = getPosIndex(x, y_next, z);\n var c_2 = getPosIndex(x_next, y_next, z);\n var c_3 = getPosIndex(x_next, y, z);\n var c_4 = getPosIndex(x, y, z);\n var u_next = (i + 1.0) / (1.0 * sw);\n var u = (1.0 * i) / (1.0 * sw);\n var v_next = 1.0 - (j + 1.0) / (1.0 * sh);\n var v = 1.0 - 1.0 * j / (1.0 * sh);\n appendFace(c_1, c_2, c_3, c_4, u, v, u_next, v_next);\n }\n }\n // left face (3)\n for (var j = 0; j < sh; j++) {\n var y = h / 2.0 - (1.0 * j) * h / (1.0 * sh);\n var y_next = h / 2.0 - (j + 1.0) * h / (1.0 * sh);\n var x = -w / 2.0;\n for (var k = 0; k < sd; k++) {\n var z = -d / 2.0 + k * d / (1.0 * sd);\n var z_next = -d / 2.0 + (k + 1.0) * d / (1.0 * sd);\n // coord-indices + tex-coords\n var c_1 = getPosIndex(x, y_next, z);\n var c_2 = getPosIndex(x, y_next, z_next);\n var c_3 = getPosIndex(x, y, z_next);\n var c_4 = getPosIndex(x, y, z);\n var u_next = (k + 1.0) / (1.0 * sd);\n var u = (1.0 * k) / (1.0 * sd);\n var v_next = 1.0 - (j + 1.0) / (1.0 * sh);\n var v = 1.0 - j / (1.0 * sh);\n appendFace(c_1, c_2, c_3, c_4, u, v, u_next, v_next);\n }\n }\n // front face (4)\n for (var j = 0; j < sh; j++) {\n var y = h / 2.0 - j * h / (1.0 * sh);\n var y_next = h / 2.0 - (j + 1.0) * h / (1.0 * sh);\n var z = d / 2.0;\n for (var i = 0; i < sw; i++) {\n var x = -w / 2.0 + i * w / (1.0 * sw);\n var x_next = -w / 2.0 + (i + 1.0) * w / (1.0 * sw);\n // coord-indices + tex-coords\n var c_1 = getPosIndex(x, y_next, z);\n var c_2 = getPosIndex(x_next, y_next, z);\n var c_3 = getPosIndex(x_next, y, z);\n var c_4 = getPosIndex(x, y, z);\n var u_next = (i + 1.0) / (1.0 * sw);\n var u = (1.0 * i) / (1.0 * sw);\n var v_next = 1.0 - (j + 1.0) / (1.0 * sh);\n var v = 1.0 - (1.0 * j) / (1.0 * sh);\n appendFace(c_1, c_2, c_3, c_4, u, v, u_next, v_next);\n }\n }\n // right face (5)\n for (var j = 0; j < sh; j++) {\n var y = h / 2.0 - j * h / (1.0 * sh);\n var y_next = h / 2.0 - (j + 1.0) * h / (1.0 * sh);\n var x = w / 2.0;\n for (var k = 0; k < sd; k++) {\n var z = d / 2.0 - k * d / (1.0 * sd);\n var z_next = d / 2.0 - (k + 1.0) * d / (1.0 * sd);\n // coord-indices + tex-coords\n var c_1 = getPosIndex(x, y_next, z);\n var c_2 = getPosIndex(x, y_next, z_next);\n var c_3 = getPosIndex(x, y, z_next);\n var c_4 = getPosIndex(x, y, z);\n var u_next = (k + 1.0) / (1.0 * sd);\n var u = (1.0 * k) / (1.0 * sd);\n var v_next = 1.0 - (j + 1.0) / (1.0 * sh);\n var v = 1.0 - (1.0 * j) / (1.0 * sh);\n appendFace(c_1, c_2, c_3, c_4, u, v, u_next, v_next);\n }\n }\n // bottom face (6)\n for (var k = 0; k < sd; k++) {\n var y = -h / 2.0;\n var z = d / 2.0 - d * k / (1.0 * sd);\n var z_next = d / 2.0 - d * (k + 1.0) / (1.0 * sd);\n for (var i = 0; i < sw; i++) {\n var x = -w / 2.0 + i * w / (1.0 * sw);\n var x_next = -w / 2.0 + (i + 1.0) * w / (1.0 * sw);\n // coord-indices + tex-coords\n var c_1 = getPosIndex(x, y, z_next);\n var c_2 = getPosIndex(x_next, y, z_next);\n var c_3 = getPosIndex(x_next, y, z);\n var c_4 = getPosIndex(x, y, z);\n var u_next = (i + 1.0) / (1.0 * sw);\n var u = (1.0 * i) / (1.0 * sw);\n var v_next = 1.0 - (k + 1.0) / (1.0 * sd);\n var v = 1.0 - (1.0 * k) / (1.0 * sd);\n appendFace(c_1, c_2, c_3, c_4, u, v, u_next, v_next);\n }\n }\n const geom = new MeshGeometry(positions, indices, uv);\n geom.key = `box_${width}x${height}x${depth}_w${widthSegments}_h${heightSegments}_d${depthSegments}`;\n computeSharpVertexNormals(geom);\n const center = { x: 0, y: 0, z: 0 };\n const w2 = width / 2, h2 = height / 2, d2 = depth / 2;\n //\n geom.barycenter = center;\n geom.boundingBox = { maxX: w2, maxY: h2, maxZ: d2, minX: -w2, minY: -h2, minZ: -d2 };\n geom.boundingSphere = { center, radius: Math.sqrt(Math.pow(w2, 2) + Math.pow(h2, 2) + Math.pow(d2, 2)) };\n //\n return geom;\n }\n createDefaultGeometry() {\n return PacemBoxElement_1.createMeshGeometry();\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'width':\n case 'height':\n case 'depth':\n case 'widthSegments':\n case 'heightSegments':\n case 'depthSegments':\n this.geometry = PacemBoxElement_1.createMeshGeometry(this.width, this.height, this.depth, this.widthSegments, this.heightSegments, this.depthSegments);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemBoxElement.prototype, \"width\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemBoxElement.prototype, \"height\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemBoxElement.prototype, \"depth\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemBoxElement.prototype, \"widthSegments\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemBoxElement.prototype, \"heightSegments\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemBoxElement.prototype, \"depthSegments\", void 0);\nPacemBoxElement = PacemBoxElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-box' })\n], PacemBoxElement);\nexport { PacemBoxElement };\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar PacemConeElement_1;\nimport { CustomElement, P, Watch, PropertyConverters } from '@pacem/pacem-core';\nimport { computeSharpVertexNormals } from '../types';\nimport { MeshGeometry } from '../geometry';\nimport { Pacem3DPrimitiveElement } from './primitive';\nimport { TAG_MIDDLE_NAME, DEG2RAD } from '../constants';\n//namespace Pacem.Components.Drawing3D {\nlet PacemConeElement = PacemConeElement_1 = class PacemConeElement extends Pacem3DPrimitiveElement {\n static createMeshGeometry(radius = 1, height = 1, sides = 18, heightSegments = 5, capSegments = 1) {\n const r = radius;\n const nodes = [], uv = [], indices = [];\n const theta = DEG2RAD * (360.0 / sides);\n const slope = r / height;\n const fY = height / heightSegments;\n const fU = 1.0 / sides;\n // top vertex\n nodes.push({ x: .0, y: height, z: .0 });\n // ======================================\n // side loops\n for (let j = 1; j <= heightSegments; j++) {\n const y = height - fY * j;\n const v = y / height;\n const rj = (height - y) * slope;\n // for loops other than tip loop\n const y_prev = y + fY;\n const v_prev = y_prev / height;\n for (let i = 0; i < sides; i++) {\n const angle = theta * i;\n const x = Math.cos(angle) * rj, z = -Math.sin(angle) * rj;\n nodes.push({ x, y, z });\n const index = 1 + sides * (j - 1) + i;\n const index_prev = i == 0 ? index + sides - 1 : index - 1;\n const u = i * fU;\n const u_prev = i == 0 ? (1 - fU) : fU * (i - 1);\n if (j == 1) {\n // tip loop\n // 1 triangle\n indices.push(0, index_prev, index);\n uv.push({ x: u, y: 1 }, { x: u_prev, y: v }, { x: u, y: v });\n continue;\n }\n const prevLoopIndex = 1 + sides * (j - 2) + i;\n const prevLoopIndex_prev = i == 0 ? prevLoopIndex + sides - 1 : prevLoopIndex - 1;\n // quad\n const A = prevLoopIndex_prev;\n const B = index_prev;\n const C = index;\n const D = prevLoopIndex;\n indices.push(C, A, B);\n indices.push(C, D, A);\n const uvA = { x: u_prev, y: v_prev };\n const uvB = { x: u_prev, y: v };\n const uvC = { x: u, y: v };\n const uvD = { x: u, y: v_prev };\n uv.push(uvC, uvA, uvB);\n uv.push(uvC, uvD, uvA);\n }\n }\n // bottom cap\n const startCapIndex = 1 + (heightSegments - 1) * sides;\n // bottom vertex (pivot)\n nodes.push({ x: .0, y: 0, z: .0 });\n const bottomIndex = startCapIndex + sides;\n // ======================================\n for (let j = 1; j <= capSegments; j++) {\n const rj_norm = j / capSegments;\n const rj = radius * rj_norm;\n // for loops other than bottom vertex loop\n const rj_norm_prev = (j - 1) / capSegments;\n for (let i = 0; i < sides; i++) {\n const angle = theta * i, cos = Math.cos(angle), sin = Math.sin(angle);\n const angle_prev = angle - theta, cos_prev = Math.cos(angle_prev), sin_prev = Math.sin(angle_prev);\n const u = .5 * (1 + cos * rj_norm), v = .5 * (1 + sin * rj_norm);\n const u_prev = .5 * (1 + cos_prev * rj_norm), v_prev = .5 * (1 + sin_prev * rj_norm);\n let index, index_prev;\n if (j != capSegments) {\n const x = Math.cos(angle) * rj, z = -Math.sin(angle) * rj;\n nodes.push({ x, y: 0, z });\n index = bottomIndex + 1 + (j - 1) * sides + i;\n index_prev = i == 0 ? index + sides - 1 : index - 1;\n }\n else {\n index = startCapIndex + i;\n index_prev = i == 0 ? startCapIndex + sides - 1 : index - 1;\n }\n if (j == 1) {\n // bottom vertex loop\n // 1 triangle\n indices.push(bottomIndex, index, index_prev);\n uv.push({ x: .5, y: .5 }, { x: u, y: v }, { x: u_prev, y: v_prev });\n continue;\n }\n const prevLoopU = .5 * (1 + cos * rj_norm_prev), prevLoopV = .5 * (1 + sin * rj_norm_prev);\n const prevLoopU_prev = .5 * (1 + cos_prev * rj_norm_prev), prevLoopV_prev = .5 * (1 + sin_prev * rj_norm_prev);\n const prevLoopIndex = bottomIndex + 1 + (j - 2) * sides + i;\n const prevLoopIndex_prev = i == 0 ? prevLoopIndex + sides - 1 : prevLoopIndex - 1;\n // quad\n const A = prevLoopIndex_prev;\n const B = index_prev;\n const C = index;\n const D = prevLoopIndex;\n indices.push(A, D, B);\n indices.push(B, D, C);\n const uvA = { x: prevLoopU_prev, y: prevLoopV_prev };\n const uvB = { x: u_prev, y: v_prev };\n const uvC = { x: u, y: v };\n const uvD = { x: prevLoopU, y: prevLoopV };\n uv.push(uvA, uvD, uvB);\n uv.push(uvB, uvD, uvC);\n }\n }\n // put the whole thing together\n const geom = new MeshGeometry(nodes, indices, uv);\n geom.key = `cone_${radius}x${height}_s${sides}_h${heightSegments}_c${capSegments}`;\n computeSharpVertexNormals(geom);\n // TODO: barycenter, boundingBox, boundingSphere\n return geom;\n }\n createDefaultGeometry() {\n return PacemConeElement_1.createMeshGeometry();\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'radius':\n case 'height':\n case 'sides':\n case 'heightSegments':\n case 'capSegments':\n this.geometry = PacemConeElement_1.createMeshGeometry(this.radius, this.height, this.sides, this.heightSegments, this.capSegments);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemConeElement.prototype, \"radius\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemConeElement.prototype, \"height\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemConeElement.prototype, \"sides\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemConeElement.prototype, \"heightSegments\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemConeElement.prototype, \"capSegments\", void 0);\nPacemConeElement = PacemConeElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-cone' })\n], PacemConeElement);\nexport { PacemConeElement };\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar PacemCylinderElement_1;\nimport { CustomElement, P, Watch, PropertyConverters } from '@pacem/pacem-core';\nimport { computeSharpVertexNormals } from '../types';\nimport { MeshGeometry } from '../geometry';\nimport { Pacem3DPrimitiveElement } from './primitive';\nimport { TAG_MIDDLE_NAME, DEG2RAD } from '../constants';\n//namespace Pacem.Components.Drawing3D {\nlet PacemCylinderElement = PacemCylinderElement_1 = class PacemCylinderElement extends Pacem3DPrimitiveElement {\n static createMeshGeometry(radius = 1, height = 1, sides = 18, heightSegments = 5, capSegments = 1) {\n const r = radius;\n const nodes = [], uv = [], indices = [];\n const theta = DEG2RAD * (360.0 / sides);\n // top & bottom vertices (pivot @(0,0,0))\n nodes.push({ x: .0, y: height, z: .0 });\n nodes.push({ x: .0, y: .0, z: .0 });\n // ======================================\n // cap loops\n const capRadius = r / capSegments;\n for (let j = 1; j <= capSegments; j++) {\n //int j_prev = j - 1;\n var rho = capRadius * j;\n for (var i = 0; i < sides; i++) {\n const startIndex = 2 + 2 * sides * (j - 1);\n const A = i == 0 ? startIndex + 2 * (sides - 1) : startIndex + 2 * (i - 1);\n const B = startIndex + 2 * i;\n const u = Math.cos(theta * i);\n const v = -Math.sin(theta * i);\n const u_prev = Math.cos(theta * (i - 1.0));\n const v_prev = -Math.sin(theta * (i - 1.0));\n const x = rho * u;\n const z = rho * v;\n const topPoint = { x, y: height, z };\n const bottomPoint = { x, y: .0, z };\n //\n nodes.push(topPoint);\n nodes.push(bottomPoint);\n // coordinates & texture\n const factor = .5 * rho / r;\n const uB = u * factor;\n const vB = v * factor;\n const uA = u_prev * factor;\n const vA = v_prev * factor;\n if (j == 1) {\n const faceIndicesTop = [0 /* top vertex*/, A, B];\n const faceIndicesBottom = [1 /* bottom vertex*/, B + 1, A + 1];\n // texture\n const uvTop = [\n { x: .5, y: .5 },\n { x: .5 + uA, y: .5 - vA },\n { x: 0.5 + uB, y: .5 - vB }\n ];\n const uvBottom = [\n { x: .5, y: .5 },\n { x: 0.5 + uB, y: .5 + vB },\n { x: .5 + uA, y: .5 + vA }\n ];\n // faces\n indices.push(...faceIndicesTop);\n indices.push(...faceIndicesBottom);\n // texture\n for (let i = 0; i < uvTop.length; i++)\n uv.push(uvTop[i]);\n for (let i = 0; i < uvBottom.length; i++)\n uv.push(uvBottom[i]);\n }\n else {\n const startIndexPrevLoop = 2 + 2 * sides * (j - 2);\n const D = i == 0 ? startIndexPrevLoop + 2 * (sides - 1) : startIndexPrevLoop + 2 * (i - 1);\n const C = startIndexPrevLoop + 2 * i;\n // coordinates & texture\n const factor0 = .5 * ((j - 1.0) / capSegments);\n const uC = u * factor0;\n const vC = v * factor0;\n const uD = u_prev * factor0;\n const vD = v_prev * factor0;\n const uvA = { x: .5 + uA, y: .5 - vA };\n const uvB = { x: .5 + uB, y: .5 - vB };\n const uvC = { x: .5 + uC, y: .5 - vC };\n const uvD = { x: .5 + uD, y: .5 - vD };\n const uvA2 = { x: .5 + uA, y: .5 + vA };\n const uvB2 = { x: .5 + uB, y: .5 + vB };\n const uvC2 = { x: .5 + uC, y: .5 + vC };\n const uvD2 = { x: .5 + uD, y: .5 + vD };\n // top\n indices.push(A);\n indices.push(B);\n indices.push(D);\n indices.push(D);\n indices.push(B);\n indices.push(C);\n // bottom\n indices.push(C + 1);\n indices.push(B + 1);\n indices.push(A + 1);\n indices.push(C + 1);\n indices.push(A + 1);\n indices.push(D + 1);\n // textures top\n uv.push(uvA);\n uv.push(uvB);\n uv.push(uvD);\n uv.push(uvD);\n uv.push(uvB);\n uv.push(uvC);\n // texture bottom\n uv.push(uvC2);\n uv.push(uvB2);\n uv.push(uvA2);\n uv.push(uvC2);\n uv.push(uvA2);\n uv.push(uvD2);\n }\n }\n }\n // ======================================\n // side loops\n const sideStartIndex = 2 + 2 * sides * (capSegments);\n const capLastIndex = 2 + 2 * sides * (capSegments - 1);\n const fU = 1.0 / sides;\n const fV = 1.0 / heightSegments;\n for (let j = 1; j <= heightSegments; j++) {\n for (let i = 0; i < sides; i++) {\n if (j != heightSegments) {\n var x = r * Math.cos(theta * i);\n var z = -r * Math.sin(theta * i);\n var y = (height * j) / heightSegments;\n //\n nodes.push({ x, y, z });\n }\n const i_prev = i == 0 ? sides - 1 : i - 1;\n const A = j == 1 ? capLastIndex + 2 * i_prev + 1 : sideStartIndex + sides * (j - 2) + i_prev;\n const B = j == 1 ? capLastIndex + 2 * i + 1 : sideStartIndex + sides * (j - 2) + i;\n const C = j == heightSegments ? capLastIndex + 2 * i : sideStartIndex + sides * (j - 1) + i;\n const D = j == heightSegments ? capLastIndex + 2 * i_prev : sideStartIndex + sides * (j - 1) + i_prev;\n const u_prev = i_prev * fU;\n const v_prev = (j - 1) * fV;\n const u = i == 0 ? 1.0 : i * fU;\n const v = j * fV;\n const uvA = { x: u_prev, y: v_prev };\n const uvB = { x: u, y: v_prev };\n const uvC = { x: u, y: v };\n const uvD = { x: u_prev, y: v };\n indices.push(A);\n indices.push(B);\n indices.push(C);\n indices.push(A);\n indices.push(C);\n indices.push(D);\n //\n uv.push(uvA);\n uv.push(uvB);\n uv.push(uvC);\n uv.push(uvA);\n uv.push(uvC);\n uv.push(uvD);\n }\n }\n // put the whole thing together\n const geom = new MeshGeometry(nodes, indices, uv);\n geom.key = `cylinder_${radius}x${height}_s${sides}_h${heightSegments}_c${capSegments}`;\n computeSharpVertexNormals(geom);\n // TODO: barycenter, boundingBox, boundingSphere\n return geom;\n }\n createDefaultGeometry() {\n return PacemCylinderElement_1.createMeshGeometry();\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'radius':\n case 'height':\n case 'sides':\n case 'heightSegments':\n case 'capSegments':\n this.geometry = PacemCylinderElement_1.createMeshGeometry(this.radius, this.height, this.sides, this.heightSegments, this.capSegments);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemCylinderElement.prototype, \"radius\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemCylinderElement.prototype, \"height\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemCylinderElement.prototype, \"sides\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemCylinderElement.prototype, \"heightSegments\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemCylinderElement.prototype, \"capSegments\", void 0);\nPacemCylinderElement = PacemCylinderElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-cylinder' })\n], PacemCylinderElement);\nexport { PacemCylinderElement };\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar PacemLineElement_1;\nimport { CustomElement, P, Watch, PropertyConverters } from '@pacem/pacem-core';\nimport { LineGeometry } from '../geometry';\nimport { Pacem3DPrimitiveElement } from './primitive';\nimport { TAG_MIDDLE_NAME } from '../constants';\n//namespace Pacem.Components.Drawing3D {\nconst DEFAULT_LINE = [{ x: 0, y: 0, z: 0 }, { x: 0, y: 1, z: 0 }];\nlet PacemLineElement = PacemLineElement_1 = class PacemLineElement extends Pacem3DPrimitiveElement {\n static createLineGeometry(positions) {\n return new LineGeometry(positions || DEFAULT_LINE);\n }\n createDefaultGeometry() {\n return PacemLineElement_1.createLineGeometry();\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'positions':\n this.geometry = PacemLineElement_1.createLineGeometry(val);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Json })\n], PacemLineElement.prototype, \"positions\", void 0);\nPacemLineElement = PacemLineElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-line' })\n], PacemLineElement);\nexport { PacemLineElement };\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar PacemPlaneElement_1;\nimport { CustomElement, P, Watch, PropertyConverters } from '@pacem/pacem-core';\nimport { Geometry } from '@pacem/pacem-numerical';\nimport { MeshGeometry } from '../geometry';\nimport { Pacem3DPrimitiveElement } from './primitive';\nimport { TAG_MIDDLE_NAME } from '../constants';\n//namespace Pacem.Components.Drawing3D {\nlet PacemPlaneElement = PacemPlaneElement_1 = class PacemPlaneElement extends Pacem3DPrimitiveElement {\n static createMeshGeometry(width, length, widthSegments, lengthSegments) {\n width ||= 1.0;\n length ||= 1.0;\n widthSegments ||= 4;\n lengthSegments ||= 4;\n const halfWidth = width * .5, halfLength = length * .5;\n const nodes = [];\n const uv = [];\n const indices = [];\n const normals = [], normal = Geometry.LinearAlgebra.Vector3D.from(0, 0, 1);\n for (let j = 0; j <= lengthSegments; j++) {\n for (let i = 0; i <= widthSegments; i++) {\n const x = -halfWidth + i * width / (1.0 * widthSegments);\n const y = .0;\n const z = -halfLength + j * length / (1.0 * lengthSegments);\n nodes.push({ x, y, z });\n if (j < lengthSegments && i < widthSegments) {\n const rowPoints = widthSegments + 1;\n // const colPoints = lengthSegments + 1;\n const u_next = (i + 1.0) / (1.0 * widthSegments);\n const u = (1.0 * i) / (1.0 * widthSegments);\n const v_next = 1.0 - (j + 1.0) / (1.0 * lengthSegments);\n const v = 1.0 - (1.0 * j) / (1.0 * lengthSegments);\n indices.push((j + 1) * rowPoints + i);\n indices.push((j + 1) * rowPoints + i + 1);\n indices.push(j * rowPoints + i + 1);\n indices.push((j + 1) * rowPoints + i);\n indices.push(j * rowPoints + i + 1);\n indices.push(j * rowPoints + i);\n uv.push({ x: u, y: v_next });\n uv.push({ x: u_next, y: v_next });\n uv.push({ x: u_next, y: v });\n uv.push({ x: u, y: v_next });\n uv.push({ x: u_next, y: v });\n uv.push({ x: u, y: v });\n normals.push(normal, normal, normal, normal, normal, normal);\n }\n }\n }\n const geom = new MeshGeometry(nodes, indices, uv, normals);\n geom.key = `plane_${width}x${length}_w${widthSegments}_l${lengthSegments}`;\n // TODO: barycenter, boundingBox, boundingSphere\n return geom;\n }\n createDefaultGeometry() {\n return PacemPlaneElement_1.createMeshGeometry();\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'width':\n case 'length':\n case 'widthSegments':\n case 'lengthSegments':\n this.geometry = PacemPlaneElement_1.createMeshGeometry(this.width, this.length, this.widthSegments, this.lengthSegments);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemPlaneElement.prototype, \"width\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemPlaneElement.prototype, \"length\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemPlaneElement.prototype, \"widthSegments\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemPlaneElement.prototype, \"lengthSegments\", void 0);\nPacemPlaneElement = PacemPlaneElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-plane' })\n], PacemPlaneElement);\nexport { PacemPlaneElement };\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar PacemTetrahedronElement_1, PacemOctahedronElement_1, PacemHexahedronElement_1, PacemIcosahedronElement_1, PacemDodecahedronElement_1;\nimport { CustomElement, P, Watch, PropertyConverters } from '@pacem/pacem-core';\nimport { computeSharpVertexNormals } from '../types';\nimport { Geometry } from '@pacem/pacem-numerical';\nimport { MeshGeometry } from '../geometry';\nimport { Pacem3DPrimitiveElement } from './primitive';\nimport { PacemBoxElement } from './box';\nimport { TAG_MIDDLE_NAME } from '../constants';\n//namespace Pacem.Components.Drawing3D {\nconst _utils = {\n parseFloats: function (input) {\n const pattern = /([\\d.-]+)/i;\n var match = pattern.exec(input);\n const ret = [];\n while (match != null) {\n const g = match[0];\n const j = parseFloat(g);\n ret.push(j);\n input = input.replace(g, '');\n match = pattern.exec(input);\n }\n return ret;\n }\n};\nconst Point3D = Geometry.LinearAlgebra.Vector3D;\nexport class PolyhedronElement extends Pacem3DPrimitiveElement {\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (name === 'radius') {\n this._assignMeshGeometry(val);\n }\n }\n _assignMeshGeometry(radius) {\n this.geometry = this.createMeshGeometry(radius > .0 ? radius : 1.0);\n }\n createDefaultGeometry() {\n return this.createMeshGeometry(1.0);\n }\n}\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PolyhedronElement.prototype, \"radius\", void 0);\n// #region Tetrahedron\nlet PacemTetrahedronElement = PacemTetrahedronElement_1 = class PacemTetrahedronElement extends PolyhedronElement {\n static createMeshGeometry(radius) {\n radius ||= 1.0;\n const nodesCoordsString = \"0 0.5774 -0.8165, 0 0.5774 0.8165, 0.8165 -0.5774 0, -0.8165 -0.5774 0\";\n const nodesToParse = nodesCoordsString.split(',');\n const nodes = [];\n for (let i = 0; i < nodesToParse.length; i++) {\n const nodeToParse = nodesToParse[i];\n const pt3D = _utils.parseFloats(nodeToParse);\n nodes.push({ x: pt3D[0] * radius, y: pt3D[1] * radius, z: pt3D[2] * radius });\n }\n const indices = [1, 2, 0, 2, 3, 0, 3, 1, 0, 3, 2, 1];\n const textureCoordsString = \"0.5 0.9995, 0.5 0.0004995, 0.0004995 0.5, 0.9995 0.5, 0.5 0.0004995, 0.9995 0.5, 0.5 0.9995, 0.0004995 0.5, 0.9995 0.5, 0.5 0.9995, 0.0004995 0.5, 0.5 0.0004995\";\n const pointsToParse = textureCoordsString.split(',');\n const texIndices = [4, 5, 6, 7, 8, 9, 10, 11, 0, 3, 2, 1];\n const uv = [];\n for (let i = 0; i < texIndices.length; i++) {\n const ndx = texIndices[i];\n const uvCoords = _utils.parseFloats(pointsToParse[ndx]);\n uv.push({ x: uvCoords[0], y: uvCoords[1] });\n }\n const geom = new MeshGeometry(nodes, indices, uv);\n geom.key = `tetrahedron_${radius}`;\n computeSharpVertexNormals(geom);\n // TODO: barycenter, boundingBox, boundingSphere\n geom.boundingSphere = { center: Point3D.zero(), radius };\n return geom;\n }\n createMeshGeometry(radius = this.radius) {\n return PacemTetrahedronElement_1.createMeshGeometry(radius);\n }\n};\nPacemTetrahedronElement = PacemTetrahedronElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-tetrahedron' })\n], PacemTetrahedronElement);\nexport { PacemTetrahedronElement };\n// #endregion\n// #region Octahedron\nlet PacemOctahedronElement = PacemOctahedronElement_1 = class PacemOctahedronElement extends PolyhedronElement {\n static createMeshGeometry(radius) {\n radius ||= 1.0;\n // -------------------------------------------------------------------------------------------------\n const nodesCoordsString = \"0 0.7071 -0.7071, 0 0.7071 0.7071, 1 0 0, 0 -0.7071 -0.7071, -1 0 0, 0 -0.7071 0.7071\";\n const indices = [1, 2, 0, 2, 3, 0, 3, 4, 0, 4, 1, 0, 4, 5, 1, 5, 2, 1, 2, 5, 3, 4, 3, 5];\n const textureCoordsString = \"0.5 0.9995, 0.5 0.9995, 0.0004995 0.5, 0.5 0.9995, 0.9995 0.5, 0.5 0.0004995, 0.5 0.0004995, 0.9995 0.5, 0.5 0.9995, 0.0004995 0.5, 0.5 0.0004995, 0.5 0.9995, 0.5 0.0004995, 0.9995 0.5, 0.5 0.9995, 0.0004995 0.5, 0.5 0.0004995, 0.0004995 0.5, 0.5 0.0004995, 0.5 0.9995, 0.5 0.0004995, 0.9995 0.5, 0.5 0.0004995, 0.5 0.9995\";\n const texIndices = [6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 17, 18, 19, 20, 21, 1, 2, 22, 23, 4, 3, 5];\n // -------------------------------------------------------------------------------------------------\n const nodesToParse = nodesCoordsString.split(',');\n const nodes = [];\n for (let i = 0; i < nodesToParse.length; i++) {\n const nodeToParse = nodesToParse[i];\n const pt3D = _utils.parseFloats(nodeToParse);\n nodes.push({ x: pt3D[0] * radius, y: pt3D[1] * radius, z: pt3D[2] * radius });\n }\n const pointsToParse = textureCoordsString.split(',');\n const uv = [];\n for (let i = 0; i < texIndices.length; i++) {\n const ndx = texIndices[i];\n const uvCoords = _utils.parseFloats(pointsToParse[ndx]);\n uv.push({ x: uvCoords[0], y: uvCoords[1] });\n }\n const geom = new MeshGeometry(nodes, indices, uv);\n geom.key = `octahedron_${radius}`;\n computeSharpVertexNormals(geom);\n // TODO: barycenter, boundingBox, boundingSphere\n geom.boundingSphere = { center: Point3D.zero(), radius };\n return geom;\n }\n createMeshGeometry(radius = this.radius) {\n return PacemOctahedronElement_1.createMeshGeometry(radius);\n }\n};\nPacemOctahedronElement = PacemOctahedronElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-octahedron' })\n], PacemOctahedronElement);\nexport { PacemOctahedronElement };\n// #endregion\n// #region Hexahedron\nlet PacemHexahedronElement = PacemHexahedronElement_1 = class PacemHexahedronElement extends PolyhedronElement {\n static createMeshGeometry(radius) {\n radius ||= 1.0;\n const inv_sqrt3 = 1.0 / Math.sqrt(3.0);\n const w = 2.0 * radius * inv_sqrt3;\n const geom = PacemBoxElement.createMeshGeometry(w, w, w);\n geom.key = `hexahedron_${radius}`;\n return geom;\n }\n createMeshGeometry(radius = this.radius) {\n return PacemHexahedronElement_1.createMeshGeometry(radius);\n }\n};\nPacemHexahedronElement = PacemHexahedronElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-hexahedron' })\n], PacemHexahedronElement);\nexport { PacemHexahedronElement };\n// #endregion\n// #region Icosahedron\nlet PacemIcosahedronElement = PacemIcosahedronElement_1 = class PacemIcosahedronElement extends PolyhedronElement {\n static createMeshGeometry(radius) {\n radius ||= 1.0;\n const nodesCoordsString = \"0 0.850651 -0.525731, 0 0.850651 0.525731, 0.850651 0.525731 0, 0.525731 0 -0.850651, -0.525731 0 -0.850651, -0.850651 0.525731 0, -0.525731 0 0.850651, 0.525731 0 0.850651, 0.850651 -0.525731 0, 0 -0.850651 0.525731, 0 -0.850651 -0.525731, -0.850651 -0.525731 0\";\n const indices = [1, 2, 0, 2, 3, 0, 3, 4, 0, 4, 5, 0, 5, 1, 0,\n 5, 6, 1, 6, 7, 1, 7, 2, 1, 2, 8, 3,\n 2, 7, 8, 6, 9, 7, 9, 8, 7, 8, 10, 3,\n 8, 9, 10, 6, 11, 9, 11, 10, 9, 10, 4, 3,\n 10, 11, 4, 6, 5, 11, 5, 4, 11];\n const textureCoordsString = \"0.5 0.808708, 0.5 0.999501, 0.5 0.808708, 0.191292 0.5, \" +\n \"0.000499547 0.5, 0.5 0.808708, 0.9995 0.5, 0.808708 0.5,\" +\n \"0.000499487 0.5, 0.5 0.191292, 0.5 0.000499487, 0.5 0.191292,\" +\n \"0.5 0.191292, 0.999501 0.5, 0.5 0.808708, 0.5 0.808708,\" +\n \"0.9995 0.5, 0.808708 0.999501, 0.191292 0.5, 0.808708 0.5,\" +\n \"0.5 0.999501, 0.808708 0.5, 0.999501 0.808708, 0.5 0.999501,\" +\n \"0.000499487 0.5, 0.5 0.191292, 0.5 0.808708, 0.9995 0.5,\" +\n \"0.808708 0.999501, 0.191292 0.5, 0.808708 0.5, 0.5 0.999501,\" +\n \"0.808708 0.5, 0.999501 0.808708, 0.5 0.808708, 0.5 0.191292,\" +\n \"0.9995 0.5, 0.000499547 0.5, 0.5 0.191292, 0.191292 0.5,\" +\n \"0.5 0.000499487, 0.808708 0.5, 0.5 0.000499487, 0.999501 0.191292,\" +\n \"0.5 0.191292, 0.808708 0.000499487, 0.9995 0.5, 0.5 0.191292,\" +\n \"0.5 0.808708, 0.9995 0.5, 0.5 0.191292, 0.808708 0.000499487,\" +\n \"0.999501 0.5, 0.5 0.808708, 0.5 0.000499487, 0.808708 0.5,\" +\n \"0.999501 0.191292, 0.808708 0.5, 0.5 0.808708, 0.5 0.191292\";\n const texIndices = [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,\n 24, 25, 0, 26, 27, 28, 29, 30, 31, 32, 33, 1,\n 34, 35, 36, 2, 37, 38, 39, 40, 41, 42, 43, 7,\n 44, 45, 46, 8, 47, 48, 49, 50, 51, 52, 53, 9,\n 54, 55, 3, 10, 56, 57, 6, 58, 59, 5, 4, 11];\n // -------------------------------------------------------------------------------------------------\n const nodesToParse = nodesCoordsString.split(',');\n const nodes = [];\n for (let i = 0; i < nodesToParse.length; i++) {\n const nodeToParse = nodesToParse[i];\n const pt3D = _utils.parseFloats(nodeToParse);\n nodes.push({ x: pt3D[0] * radius, y: pt3D[1] * radius, z: pt3D[2] * radius });\n }\n const pointsToParse = textureCoordsString.split(',');\n const uv = [];\n for (let i = 0; i < texIndices.length; i++) {\n const ndx = texIndices[i];\n const uvCoords = _utils.parseFloats(pointsToParse[ndx]);\n uv.push({ x: uvCoords[0], y: uvCoords[1] });\n }\n const geom = new MeshGeometry(nodes, indices, uv);\n geom.key = `icosahedron_${radius}`;\n computeSharpVertexNormals(geom);\n // TODO: barycenter, boundingBox, boundingSphere\n geom.boundingSphere = { center: Point3D.zero(), radius };\n return geom;\n }\n createMeshGeometry(radius = this.radius) {\n return PacemIcosahedronElement_1.createMeshGeometry(radius);\n }\n};\nPacemIcosahedronElement = PacemIcosahedronElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-icosahedron' })\n], PacemIcosahedronElement);\nexport { PacemIcosahedronElement };\n// #endregion\n// #region Dodecahedron\nlet PacemDodecahedronElement = PacemDodecahedronElement_1 = class PacemDodecahedronElement extends PolyhedronElement {\n static createMeshGeometry(radius) {\n radius ||= 1.0;\n const n1 = Point3D.from(0.356822 * radius, 0.934172 * radius, 0 * radius);\n const n2 = Point3D.from(-0.356822 * radius, 0.934172 * radius, 0 * radius);\n const n3 = Point3D.from(0.57735 * radius, 0.57735 * radius, -0.57735 * radius);\n const n4 = Point3D.from(0 * radius, 0.356822 * radius, -0.934172 * radius);\n const n5 = Point3D.from(-0.57735 * radius, 0.57735 * radius, -0.57735 * radius);\n const n6 = Point3D.from(-0.57735 * radius, 0.57735 * radius, 0.57735 * radius);\n const n7 = Point3D.from(0 * radius, 0.356822 * radius, 0.934172 * radius);\n const n8 = Point3D.from(0.57735 * radius, 0.57735 * radius, 0.57735 * radius);\n const n9 = Point3D.from(0.934172 * radius, 0 * radius, -0.356822 * radius);\n const n10 = Point3D.from(0.934172 * radius, 0 * radius, 0.356822 * radius);\n const n11 = Point3D.from(0 * radius, -0.356822 * radius, 0.934172 * radius);\n const n12 = Point3D.from(0.57735 * radius, -0.57735 * radius, 0.57735 * radius);\n const n13 = Point3D.from(0.57735 * radius, -0.57735 * radius, -0.57735 * radius);\n const n14 = Point3D.from(0.356822 * radius, -0.934172 * radius, 0 * radius);\n const n15 = Point3D.from(-0.57735 * radius, -0.57735 * radius, 0.57735 * radius);\n const n16 = Point3D.from(-0.356822 * radius, -0.934172 * radius, 0 * radius);\n const n17 = Point3D.from(0 * radius, -0.356822 * radius, -0.934172 * radius);\n const n18 = Point3D.from(-0.57735 * radius, -0.57735 * radius, -0.57735 * radius);\n const n19 = Point3D.from(-0.934172 * radius, 0 * radius, 0.356822 * radius);\n const n20 = Point3D.from(-0.934172 * radius, 0 * radius, -0.356822 * radius);\n const positions = [\n n1,\n n2,\n n3,\n n4,\n n5,\n n6,\n n7,\n n8,\n n9,\n n10,\n n11,\n n12,\n n13,\n n14,\n n15,\n n16,\n n17,\n n18,\n n19,\n n20\n ];\n const indices = [0, 2, 3, 0, 3, 4, 0, 4, 1, 1, 5, 6, 1, 6, 7,\n 1, 7, 0, 7, 9, 8, 7, 8, 2, 7, 2, 0,\n 7, 6, 10, 7, 10, 11, 7, 11, 9, 11, 13, 12,\n 11, 12, 8, 11, 8, 9, 11, 10, 14, 11, 14, 15,\n 11, 15, 13, 15, 17, 16, 15, 16, 12, 15, 12, 13,\n 15, 14, 18, 15, 18, 19, 15, 19, 17, 19, 4, 3,\n 19, 3, 16, 19, 16, 17, 19, 18, 5, 19, 5, 1,\n 19, 1, 4, 18, 14, 10, 18, 10, 6, 18, 6, 5,\n 3, 2, 8, 3, 8, 12, 3, 12, 16];\n const textureCoordsString = `0.5 0.999501, 0.5 0.999501, 0.191292 0.808708, 0.5 0.690792,\r\n 0.191292 0.808708, 0.191292 0.808708, 0.5 0.690792,\r\n 0.808708 0.808708, 0.000499517 0.5, 0.309208 0.5, 0.5 0.309208,\r\n 0.191292 0.191292, 0.191292 0.191292, 0.309208 0.5,\r\n 0.191292 0.191292, 0.5 0.000499517, 0.5 0.309208, 0.808708 0.191292,\r\n 0.000499517 0.5, 0.309208 0.5, 0.690792 0.5, 0.808708 0.808708,\r\n 0.5 0.999501, 0.690792 0.5, 0.5 0.999501, 0.191292 0.808708,\r\n 0.690792 0.5, 0.191292 0.808708, 0.309208 0.5, 0.309208 0.5,\r\n 0.191292 0.191292, 0.5 0.000499517, 0.309208 0.5, 0.5 0.000499517,\r\n 0.808708 0.191292, 0.309208 0.5, 0.808708 0.191292,\r\n 0.690792 0.5, 0.191292 0.808708, 0.309208 0.5, 0.690792 0.5,\r\n 0.191292 0.808708, 0.690792 0.5, 0.808708 0.808708,\r\n 0.191292 0.808708, 0.808708 0.808708, 0.808708 0.808708,\r\n 0.5 0.690792, 0.5 0.309208, 0.808708 0.808708, 0.5 0.309208,\r\n 0.808708 0.191292, 0.808708 0.191292, 0.9995 0.5, 0.191292 0.191292,\r\n 0.5 0.000499517, 0.808708 0.191292, 0.191292 0.191292,\r\n 0.808708 0.191292, 0.690792 0.5, 0.191292 0.191292,\r\n 0.690792 0.5, 0.191292 0.191292, 0.5 0.000499517, 0.808708 0.191292,\r\n 0.191292 0.191292, 0.808708 0.191292, 0.690792 0.5,\r\n 0.690792 0.5, 0.309208 0.5, 0.690792 0.5, 0.808708 0.808708,\r\n 0.5 0.999501, 0.690792 0.5, 0.5 0.999501, 0.191292 0.808708,\r\n 0.690792 0.5, 0.191292 0.808708, 0.5 0.000499517, 0.808708 0.191292,\r\n 0.690792 0.5, 0.5 0.000499517, 0.690792 0.5, 0.309208 0.5,\r\n 0.309208 0.5, 0.191292 0.191292, 0.9995 0.5, 0.808708 0.808708,\r\n 0.5 0.690792, 0.9995 0.5, 0.5 0.690792, 0.5 0.309208,\r\n 0.9995 0.5, 0.5 0.309208, 0.309208 0.5, 0.690792 0.5,\r\n 0.808708 0.808708, 0.309208 0.5, 0.808708 0.808708,\r\n 0.5 0.999501, 0.000499517 0.5, 0.5 0.309208, 0.000499517 0.5,\r\n 0.5 0.690792, 0.5 0.690792, 0.000499517 0.5, 0.5 0.690792,\r\n 0.191292 0.191292`;\n const texIndices = [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,\n 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43,\n 44, 45, 0, 46, 47, 48, 49, 50, 51, 7, 52, 53,\n 54, 55, 56, 57, 58, 59, 60, 61, 9, 62, 63, 64,\n 65, 66, 67, 11, 68, 69, 70, 71, 72, 73, 74, 75,\n 76, 77, 13, 78, 79, 80, 81, 82, 83, 15, 84, 85,\n 86, 87, 88, 89, 90, 91, 92, 93, 17, 94, 95, 96,\n 97, 98, 99, 19, 1, 4, 100, 14, 101, 102, 10, 103,\n 18, 6, 5, 104, 2, 105, 106, 8, 107, 3, 12, 16];\n // -------------------------------------------------------------------------------------------------\n const pointsToParse = textureCoordsString.split(',');\n const uv = [];\n for (let i = 0; i < texIndices.length; i++) {\n const ndx = texIndices[i];\n const uvCoords = _utils.parseFloats(pointsToParse[ndx]);\n uv.push({ x: uvCoords[0], y: uvCoords[1] });\n }\n const geom = new MeshGeometry(positions, indices, uv);\n geom.key = `dodecahedron_${radius}`;\n computeSharpVertexNormals(geom);\n // TODO: barycenter, boundingBox, boundingSphere\n geom.boundingSphere = { center: Point3D.zero(), radius };\n return geom;\n }\n createMeshGeometry(radius = this.radius) {\n return PacemDodecahedronElement_1.createMeshGeometry(radius);\n }\n};\nPacemDodecahedronElement = PacemDodecahedronElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-dodecahedron' })\n], PacemDodecahedronElement);\nexport { PacemDodecahedronElement };\n// #endregion\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar PacemSphereElement_1;\nimport { CustomElement, P, Watch, PropertyConverters } from '@pacem/pacem-core';\nimport { computeSharpVertexNormals } from '../types';\nimport { MeshGeometry } from '../geometry';\nimport { Pacem3DPrimitiveElement } from './primitive';\nimport { TAG_MIDDLE_NAME, DEG2RAD } from '../constants';\n//namespace Pacem.Components.Drawing3D {\nlet PacemSphereElement = PacemSphereElement_1 = class PacemSphereElement extends Pacem3DPrimitiveElement {\n static createMeshGeometry(radius = 1, segs = 8) {\n //\n const nodes = [];\n const uv = [];\n const indices = [];\n //\n const r = radius, tessellation = segs;\n const theta = DEG2RAD * (360.0 / tessellation);\n const segments = tessellation % 2 == 0 ? tessellation / 2 : (tessellation - 1) / 2;\n // top vertex\n nodes.push({ x: .0, y: r, z: .0 });\n for (let j = 1; j < segments; j++) {\n // loop \"latitude\"\n const angle1 = theta * j;\n const cos_angle1 = Math.cos(angle1);\n const sin_angle1 = Math.sin(angle1);\n const v = 1.0 - 1.0 * j / segments;\n for (let i = 0; i < tessellation; i++) {\n // loop \"longitude\"\n const angle2 = theta * i - Math.PI / 2.0;\n const cos_angle2 = Math.cos(angle2);\n const sin_angle2 = Math.sin(angle2);\n const x = r * sin_angle1 * cos_angle2;\n const y = r * cos_angle1;\n const z = r * sin_angle1 * sin_angle2;\n nodes.push({ x, y, z });\n // coordinates & texture\n const i_prev = i == 0 ? tessellation - 1 : i - 1;\n const u = i == 0 ? .0 : 1.0 - 1.0 * i / tessellation;\n const u_prev = 1.0 - 1.0 * i_prev / tessellation;\n // triangles\n if (j == 1) {\n indices.push(1 + i);\n indices.push(1 + i_prev);\n indices.push(0);\n //\n uv.push({ x: u, y: v });\n uv.push({ x: u_prev, y: v });\n uv.push({ x: .5, y: 1.0 });\n }\n else {\n indices.push((j - 1) * tessellation + i + 1);\n indices.push((j - 1) * tessellation + i_prev + 1);\n indices.push((j - 2) * tessellation + i_prev + 1);\n indices.push((j - 1) * tessellation + i + 1);\n indices.push((j - 2) * tessellation + i_prev + 1);\n indices.push((j - 2) * tessellation + i + 1);\n //\n const v_prev = 1.0 - (j - 1.0) / segments;\n //var faceUV = [];\n uv.push({ x: u, y: v });\n uv.push({ x: u_prev, y: v });\n uv.push({ x: u_prev, y: v_prev });\n uv.push({ x: u, y: v });\n uv.push({ x: u_prev, y: v_prev });\n uv.push({ x: u, y: v_prev });\n }\n }\n }\n // bottom vertex\n nodes.push({ x: .0, y: -r, z: .0 });\n const last = nodes.length - 1;\n for (let i = 0; i < tessellation; i++) {\n const j = segments - 2;\n const i_prev = i == 0 ? tessellation - 1 : i - 1;\n const u = i == 0 ? .0 : 1.0 - 1.0 * i / tessellation;\n const u_prev = 1.0 - 1.0 * i_prev / tessellation;\n const v = 1.0 - (j + 1.0) / segments;\n // triangles\n indices.push(last);\n indices.push(j * tessellation + 1 + i_prev);\n indices.push(j * tessellation + 1 + i);\n uv.push({ x: .5, y: 0 });\n uv.push({ x: u_prev, y: v });\n uv.push({ x: u, y: v });\n }\n const geom = new MeshGeometry(nodes, indices, uv);\n geom.key = `sphere_${radius}_s${segs}`;\n computeSharpVertexNormals(geom);\n return geom;\n }\n createDefaultGeometry() {\n return PacemSphereElement_1.createMeshGeometry();\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'radius':\n case 'segments':\n this.geometry = PacemSphereElement_1.createMeshGeometry(this.radius, this.segments);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemSphereElement.prototype, \"radius\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemSphereElement.prototype, \"segments\", void 0);\nPacemSphereElement = PacemSphereElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-sphere' })\n], PacemSphereElement);\nexport { PacemSphereElement };\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar PacemTorusElement_1;\nimport { CustomElement, P, Watch, PropertyConverters } from '@pacem/pacem-core';\nimport { computeSharpVertexNormals } from '../types';\nimport { MeshGeometry } from '../geometry';\nimport { Pacem3DPrimitiveElement } from './primitive';\nimport { TAG_MIDDLE_NAME, DEG2RAD } from '../constants';\n//namespace Pacem.Components.Drawing3D {\nlet PacemTorusElement = PacemTorusElement_1 = class PacemTorusElement extends Pacem3DPrimitiveElement {\n static createMeshGeometry(radius = 1, innerRadius = .25, segments = 24, sides = 12) {\n //\n const nodes = [];\n const uv = [];\n const coords = [];\n const theta = DEG2RAD * (360.0 / segments);\n const phi = DEG2RAD * (360.0 / sides);\n const r1 = radius;\n const r2 = innerRadius;\n for (let j = 0; j < segments; j++) {\n // Math.PI/2 adjustement (useful for UV mapping)\n const angle1 = theta * j - Math.PI / 2.0;\n const sin_angle1 = Math.sin(angle1);\n const cos_angle1 = Math.cos(angle1);\n for (let i = 0; i < sides; i++) {\n // Math.PI adjustement (useful for UV mapping)\n const angle2 = phi * i + Math.PI;\n const cos_angle2 = Math.cos(angle2);\n const x = r1 * cos_angle1 + r2 * cos_angle2 * cos_angle1;\n const y = r2 * Math.sin(angle2);\n const z = r1 * sin_angle1 + r2 * cos_angle2 * sin_angle1;\n nodes.push({ x, y, z });\n const prev_j = j > 0 ? j - 1 : segments - 1;\n const prev_i = i > 0 ? i - 1 : sides - 1;\n const u = j == 0 ? .0 : 1.0 - 1.0 * j / segments;\n const v = i > 0 ? 1.0 * i / sides : 1.0;\n const u_prev = j > 0 ? 1.0 - (j - 1.0) / segments : 1.0 / segments;\n const v_prev = i > 0 ? (i - 1.0) / sides : 1.0 - 1.0 / sides;\n // triangles <=> Int32Collection\n // <=> PointCollection\n coords.push(j * sides + prev_i);\n coords.push(prev_j * sides + prev_i);\n coords.push(prev_j * sides + i);\n coords.push(j * sides + prev_i);\n coords.push(prev_j * sides + i);\n coords.push(j * sides + i);\n //\n uv.push({ x: u, y: v_prev });\n uv.push({ x: u_prev, y: v_prev });\n uv.push({ x: u_prev, y: v });\n uv.push({ x: u, y: v_prev });\n uv.push({ x: u_prev, y: v });\n uv.push({ x: u, y: v });\n }\n }\n const geom = new MeshGeometry(nodes, coords, uv);\n geom.key = `torus_${radius}x${innerRadius}_t${segments}_s${sides}`;\n computeSharpVertexNormals(geom);\n return geom;\n }\n createDefaultGeometry() {\n return PacemTorusElement_1.createMeshGeometry();\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'radius':\n case 'innerRadius':\n case 'segments':\n case 'sides':\n this.geometry = PacemTorusElement_1.createMeshGeometry(this.radius, this.innerRadius, this.segments, this.sides);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemTorusElement.prototype, \"radius\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemTorusElement.prototype, \"innerRadius\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemTorusElement.prototype, \"segments\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemTorusElement.prototype, \"sides\", void 0);\nPacemTorusElement = PacemTorusElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-torus' })\n], PacemTorusElement);\nexport { PacemTorusElement };\n","import { CustomEventUtils, Utils } from '@pacem/pacem-core';\nimport { Point } from '@pacem/pacem-foundation';\nimport { isCamera } from '../types';\nfunction _clipPoint(evt, rect) {\n let x, y;\n if (Point.isPoint(evt)) {\n x = evt.x;\n y = evt.y;\n }\n else {\n const { page } = CustomEventUtils.getEventCoordinates(evt);\n const p = { x: page.x - rect.x, y: page.y - rect.y };\n x = p.x;\n y = p.y;\n }\n const clipX = x / rect.width * 2 - 1;\n const clipY = y / rect.height * -2 + 1;\n return { x: clipX, y: clipY };\n}\nexport class AdapterUtils {\n static isMeshGeometry(obj) {\n return 'positions' in obj && Utils.isArray(obj.positions)\n && 'triangleIndices' in obj && Utils.isArray(obj.triangleIndices);\n }\n static isVector3D(obj) {\n return 'x' in obj && typeof obj.x === 'number'\n && 'y' in obj && typeof obj.y === 'number'\n && 'z' in obj && typeof obj.z === 'number';\n }\n static isRgba(obj) {\n return 'r' in obj && typeof obj.r === 'number'\n && 'g' in obj && typeof obj.g === 'number'\n && 'b' in obj && typeof obj.b === 'number';\n }\n static flattenVectorArray(array) {\n const retval = [];\n for (let v of array) {\n if (AdapterUtils.isVector3D(v)) {\n retval.push(v.x, v.y, v.z);\n }\n else if (AdapterUtils.isRgba(v)) {\n retval.push(v.r, v.g, v.b, v.a ?? 1);\n }\n else {\n retval.push(v.x, v.y);\n }\n }\n return retval;\n }\n static findCamera(items) {\n return (items || []).find(r => isCamera(r) && !r.hide);\n }\n clipPixel(evt, viewport) {\n if (viewport instanceof HTMLElement) {\n viewport = Utils.offsetRect(viewport);\n }\n return _clipPoint(evt, viewport);\n }\n}\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, P, Watch, PropertyConverters, Utils, CustomElementUtils } from '@pacem/pacem-core';\nimport { Colors } from '@pacem/pacem-foundation';\nimport { Geometry } from '@pacem/pacem-numerical';\nimport { StalePropertyFlag, isMesh, isUi3DObject, Pacem3DAdapterElement, Pacem3DObjectElement, Pacem3DGroupElement, Pacem3DLightElement, Pacem3DCameraElement, Pacem3DPerspectiveCameraElement, Pacem3DOrthographicCameraElement, Pacem3DMeshElement } from '../types';\nimport { MeshGeometry, LineGeometry } from '../geometry';\nimport { AdapterUtils } from './shared';\nimport { isStandardMaterial, isPhongMaterial, isLambertMaterial, isLineMaterial, isMaterial } from '../materials/material';\n//namespace Pacem.Components.Drawing3D {\nfunction isMeshGeometry(obj) {\n return AdapterUtils.isMeshGeometry(obj);\n}\nfunction isVector3D(obj) {\n return AdapterUtils.isVector3D(obj);\n}\nfunction flattenVectorArray(array) {\n return AdapterUtils.flattenVectorArray(array);\n}\nconst threeJsVersion = '0.152.2', lastOrbitCtrlJsVersion = '0.147.0';\n;\nconst consts = {\n VERSION: threeJsVersion,\n API_URI: `https://unpkg.com/three@${threeJsVersion}/build/three.min.js`,\n ORBIT_URI: `https://unpkg.com/three@${lastOrbitCtrlJsVersion}/examples/js/controls/OrbitControls.js`,\n LOADERS: [\n //`https://unpkg.com/three@${threeJsVersion}/examples/js/loaders/OBJLoader.js`,\n //`https://unpkg.com/three@${threeJsVersion}/examples/js/loaders/MTLLoader.js`,\n ],\n DEFAULT_MATERIAL: function () {\n return new THREE.MeshStandardMaterial({ color: '#069', flatShading: true });\n }\n};\nfunction matrix3DToMatrix4(m) {\n const matrix = new THREE.Matrix4();\n matrix.set(m.m11, m.m12, m.m13, m.m14, m.m21, m.m22, m.m23, m.m24, m.m31, m.m32, m.m33, m.m34, m.offsetX, m.offsetY, m.offsetZ, m.m44);\n return matrix;\n}\n// as of https://codepen.io/discoverthreejs/full/vwVeZB\nfunction fitCameraToSelection(camera, controls /* OrbitControls */, selection, fitOffset = 1.333) {\n const box = new THREE.Box3();\n for (const object of selection) {\n box.expandByObject(object);\n }\n const size = box.getSize(new THREE.Vector3());\n const center = box.getCenter(new THREE.Vector3());\n const maxSize = Math.max(size.x, size.y, size.z);\n const fitHeightDistance = maxSize / (2 * Math.atan(Math.PI * camera.fov / 360));\n const fitWidthDistance = fitHeightDistance / camera.aspect;\n const distance = fitOffset * Math.max(fitHeightDistance, fitWidthDistance);\n const hasControls = !Utils.isNull(controls);\n var direction;\n if (hasControls) {\n direction = controls.target.clone()\n .sub(camera.position)\n .normalize()\n .multiplyScalar(distance);\n controls.maxDistance = distance * 10;\n controls.target.copy(center);\n }\n camera.near = distance / 100;\n camera.far = distance * 100;\n camera.updateProjectionMatrix();\n if (hasControls) {\n camera.position.copy(controls.target).sub(direction);\n controls.update();\n }\n}\nfunction flattenMatrix3D(m) {\n return [\n // right way to translate the matrix3D to matrix4\n m.m11, m.m21, m.m31, m.offsetX,\n m.m12, m.m22, m.m32, m.offsetY,\n m.m13, m.m23, m.m33, m.offsetZ,\n m.m14, m.m24, m.m34, m.m44,\n ];\n}\nfunction nodeGeometryToBufferGeometry(mesh) {\n const geometry = new THREE.BufferGeometry();\n const vertices = flattenVectorArray(mesh.positions);\n geometry.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3));\n if (mesh instanceof MeshGeometry) {\n if (!Utils.isNullOrEmpty(mesh.triangleIndices)) {\n geometry.setIndex(mesh.triangleIndices);\n }\n const vertices = flattenVectorArray(mesh.positions);\n geometry.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3));\n const uvs = flattenVectorArray(mesh.textureCoordinates);\n geometry.setAttribute('uv', new THREE.Float32BufferAttribute(uvs, 2));\n if (Utils.isNullOrEmpty(mesh.normals)) {\n geometry.computeVertexNormals();\n }\n else {\n const normals = flattenVectorArray(mesh.normals);\n geometry.setAttribute('normal', new THREE.Float32BufferAttribute(normals, 3));\n }\n }\n return geometry;\n}\nfunction lightToLight(item) {\n var light;\n switch (item.type) {\n case 'spot':\n const spotLight = new THREE.SpotLight();\n spotLight.target.position.set(item.target.x, item.target.y, item.target.z);\n light = spotLight;\n break;\n default:\n light = new THREE.PointLight();\n break;\n }\n return light;\n}\nfunction materialToMaterial(material) {\n if (Utils.isNull(material)) {\n return null;\n }\n const lineBase = {\n color: typeof material.color === 'string' ? material.color : Colors.stringify(material.color),\n opacity: material.opacity ?? 1,\n transparent: true,\n wireframe: material.wireframe ?? false,\n visible: material.visible ?? true\n };\n const base = Utils.extend({}, lineBase, { wireframe: material.wireframe ?? false });\n const mipMapMaterial = (m) => {\n if (material.map) {\n m['map'] = new THREE.TextureLoader().load(material.map, _ => {\n // console.log('texture loaded!');\n m.needsUpdate = true;\n });\n }\n return m;\n };\n if (isStandardMaterial(material)) {\n const std = mipMapMaterial(new THREE.MeshStandardMaterial(Utils.extend(base, {\n roughness: material.roughness,\n metalness: material.metalness,\n emissive: material.emissiveColor,\n flatShading: material.flatShading,\n refractionRatio: material.refractionRatio,\n })));\n return std;\n }\n else if (isPhongMaterial(material)) {\n const phong = mipMapMaterial(new THREE.MeshPhongMaterial(Utils.extend(base, {\n shininess: material.shininess,\n emissive: material.emissiveColor,\n flatShading: material.flatShading,\n specular: material.specularColor,\n reflectivity: material.reflectivity,\n refractionRatio: material.refractionRatio,\n })));\n return phong;\n }\n else if (isLambertMaterial(material)) {\n const lambert = mipMapMaterial(new THREE.MeshLambertMaterial(Utils.extend(base, {\n emissive: material.emissiveColor,\n reflectivity: material.reflectivity,\n refractionRatio: material.refractionRatio,\n })));\n return lambert;\n }\n else if (isLineMaterial(material)) {\n const dash = material.dashArray && material.dashArray[0] || null, gap = material.dashArray && material.dashArray.length > 1 && material.dashArray[1] || dash;\n const lineMatOptions = Utils.extend(lineBase, {\n linecap: material.lineCap ?? 'round',\n linejoin: material.lineJoin ?? 'round',\n linewidth: material.lineWidth ?? 1\n });\n return Utils.isNullOrEmpty(material.dashArray) ?\n new THREE.LineBasicMaterial(lineMatOptions)\n : new THREE.LineDashedMaterial(Utils.extend({ dashSize: dash, gapSize: gap }, lineMatOptions));\n }\n else if (isMaterial(material)) {\n const basic = mipMapMaterial(new THREE.MeshBasicMaterial(base));\n return basic;\n }\n else {\n return null;\n }\n}\nfunction materialToMaterials(frontMaterial, backMaterial, multiAllowed) {\n // material\n const multi = multiAllowed;\n // composite\n const materials = [];\n // front mat\n const material = materialToMaterial(frontMaterial);\n if (!Utils.isNull(material)) {\n material.side = THREE.FrontSide;\n materials.push(material);\n }\n // back mat\n if (!Utils.isNull(backMaterial)) {\n if (backMaterial == frontMaterial) {\n material.side = THREE.DoubleSide;\n }\n else {\n // multi-material\n const backsideMaterial = materialToMaterial(backMaterial);\n if (!Utils.isNull(backsideMaterial)) {\n backsideMaterial.side = THREE.BackSide;\n materials.push(backsideMaterial);\n }\n }\n }\n return multi && materials.length > 1 ? materials : material;\n}\nfunction load(item) {\n if (!Utils.isNullOrEmpty(item.content)) {\n const type = item.type?.toLowerCase();\n switch (type) {\n case 'obj':\n const obj = new THREE['OBJLoader']();\n return obj.parse(item.content);\n default:\n const loader = new THREE.ObjectLoader();\n return loader.parse(item.content);\n }\n }\n else {\n throw new Error('Missing content.');\n }\n}\nfunction meshType(geometry) {\n return geometry instanceof LineGeometry ? THREE.Line : THREE.Mesh;\n}\nfunction build(mesh) {\n if (Utils.isNullOrEmpty(mesh.geometry)) {\n return null;\n }\n const ctor = meshType(mesh.geometry);\n return new ctor();\n}\nfunction isTHREEAvailable() {\n return 'THREE' in window;\n}\nasync function whenTHREEAvailable(...args) {\n const start = Date.now();\n var initialized = false;\n do {\n initialized = isTHREEAvailable();\n for (let pred of args) {\n initialized &&= pred();\n }\n if (!initialized) {\n await new Promise(resolve => setTimeout(resolve, 500));\n }\n } while (!initialized && (Date.now() - start) < 30000);\n if (!initialized) {\n throw new Error('The wait for THREE adapter initialization timed out.');\n }\n}\nlet Pacem3DThreeAdapterElement = class Pacem3DThreeAdapterElement extends Pacem3DAdapterElement {\n constructor() {\n super(...arguments);\n this._renderer = null;\n this._camera = null;\n this._scene = null;\n this._orbitCtrls = null;\n this._objects = new WeakMap();\n this._dict = {};\n this._orbitControlsDelegate = (_) => {\n };\n this._ensureAndRefresh = (item, object3D, parent) => {\n object3D.matrixAutoUpdate = false;\n // choose whether to render the object or not\n if (object3D.visible = !item.hide) {\n // the modeling part\n // 1. pacem 3d mesh\n if (isMesh(item)) {\n let mesh3D = object3D;\n if (item.flags.indexOf(StalePropertyFlag.Geometry) >= 0) {\n mesh3D.geometry.dispose();\n // swap Line <-> Mesh according to the geometry\n const mesh3D2 = build(item);\n if (mesh3D2.constructor.name !== mesh3D.constructor.name) {\n parent.remove(object3D);\n delete this._dict[object3D.id];\n object3D = mesh3D = mesh3D2;\n }\n // /swap\n mesh3D.geometry = nodeGeometryToBufferGeometry(item.geometry);\n }\n if (item.flags.indexOf(StalePropertyFlag.Material) >= 0) {\n if (Utils.isArray(mesh3D.material)) {\n for (let m of mesh3D.material) {\n m.dispose();\n }\n }\n else {\n mesh3D.material.dispose();\n }\n mesh3D.material = materialToMaterials(item.material) || consts.DEFAULT_MATERIAL();\n }\n }\n // 2. 3d 'native' object\n else if (item instanceof Pacem3DObjectElement\n && (item.flags.indexOf(StalePropertyFlag.Material) >= 0 || item.flags.indexOf(StalePropertyFlag.Geometry) >= 0)) {\n // swap reference\n object3D.parent && object3D.parent.remove(object3D);\n object3D = load(item);\n }\n // 3. grouping object\n else if (item instanceof Pacem3DGroupElement) {\n if (item.flags.indexOf(StalePropertyFlag.Children) >= 0) {\n // remove all children\n for (let j = object3D.children.length - 1; j >= 0; j--) {\n const child = object3D.children[j];\n object3D.remove(child);\n }\n // re-create\n for (let child of item.items) {\n this._addOrUpdateItem(child, object3D);\n }\n }\n }\n // 4. light\n else if (item instanceof Pacem3DLightElement) {\n const light = object3D;\n if (item.flags.indexOf(StalePropertyFlag.Light) >= 0) {\n light.color = new THREE.Color(item.color);\n light.intensity = item.intensity;\n }\n }\n // the configuring part\n let posv = item.position; // || new THREE.Vector3(0, 0, 0);\n if (isUi3DObject(item)\n && !Utils.isNull(item.transformMatrix)\n && (item.flags.indexOf(StalePropertyFlag.Position) >= 0 || item.flags.indexOf(StalePropertyFlag.Transform) >= 0)) {\n const positionMatrix = Geometry.LinearAlgebra.Matrix3D.from(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, posv.x, posv.y, posv.z, 1);\n // item.transformMatrix is a local matrix thus\n // prepend in the multiplication (i.e. FIRST apply transform THEN apply positioning)\n const transformMatrix = Geometry.LinearAlgebra.Matrix3D.multiply(item.transformMatrix, positionMatrix);\n THREE.Matrix4.prototype.set.apply(object3D.matrix, flattenMatrix3D(transformMatrix));\n //object3D.updateMatrix();\n }\n else if (item.flags.indexOf(StalePropertyFlag.Position) >= 0) {\n object3D.position.set(posv.x, posv.y, posv.z);\n object3D.updateMatrix();\n }\n }\n object3D.userData = item.tag;\n if (Utils.isNull(parent.getObjectById(object3D.id))) {\n parent.add(object3D);\n this._dict[object3D.id] = item;\n }\n // clear flags\n item.flags.splice(0);\n return object3D;\n };\n //#endregion\n }\n _assertMonoStage(scene) {\n if (scene != this._3d && !Utils.isNull(this._3d)) {\n throw new Error('Stage mismatch.');\n }\n }\n dispose(scene) {\n // do nothing\n }\n snapshot(scene, background, type, quality) {\n if (scene != this._3d) {\n return Promise.resolve(null);\n }\n const jpeg = !Utils.isNullOrEmpty(background), mime = type ?? (jpeg ? 'image/jpeg' : null), compression = quality ?? (jpeg ? .9 : null);\n return new Promise((resolve, _) => {\n this.render();\n Utils.snapshotElement(this._stage, background, mime, compression).then(resolve);\n });\n }\n project(scene, point3D) {\n this._assertMonoStage(scene);\n // check feasibility\n if (Utils.isNull(this._camera) || Utils.isNull(this._stage))\n return null;\n //\n const stage = this._stage;\n const vector = new THREE.Vector3(point3D.x, point3D.y, point3D.z);\n const width = stage.width, height = stage.height;\n const widthHalf = width / 2, heightHalf = height / 2;\n const point = vector.project(this._camera);\n const x = (point.x * widthHalf) + widthHalf;\n const y = -(point.y * heightHalf) + heightHalf;\n return { x: x, y: y };\n }\n zoomFit(scene, ...items) {\n this._assertMonoStage(scene);\n return new Promise((resolve, reject) => {\n const camera = this._camera;\n const map = this._objects;\n const targets = items.filter(o => map.has(o)).map(o => map.get(o));\n if (Utils.isNull(camera) || Utils.isNullOrEmpty(targets)) {\n resolve();\n }\n fitCameraToSelection(camera, this._orbitCtrls, targets);\n resolve();\n });\n }\n getScene(scene) {\n this._assertMonoStage(scene);\n return this._scene;\n }\n raycast(scene, point, size, callback) {\n this._assertMonoStage(scene);\n if (isTHREEAvailable() && !Utils.isNull(this._camera)) {\n const camera = this._camera;\n const vector = new THREE.Vector2((point.x / size.width) * 2 - 1, -(point.y / size.height) * 2 + 1);\n const raycaster = new THREE.Raycaster();\n raycaster.setFromCamera(vector, camera);\n const intersects = raycaster.intersectObjects(this._scene.children, true);\n let obj;\n let intersection;\n let j = 0;\n while (intersects.length > j && (intersection = intersects[j++]) && (obj = intersection.object)) {\n const item = this._dict[obj.id];\n if (item.inert) {\n continue;\n }\n const v = intersection.point, x = v.x, y = v.y, z = v.z, point = { x, y, z };\n callback({ object: this._dict[obj.id], point });\n return;\n }\n }\n callback(null);\n }\n // #region ABSTRACT IMPLEMENTATION\n async initialize(container) {\n if (!Utils.isNull(this._stage)) {\n return this._stage;\n }\n this._3d = container;\n const wrapper = container.stage;\n const stage = this._stage = document.createElement('canvas');\n wrapper.innerHTML = '';\n wrapper.appendChild(stage);\n if (!isTHREEAvailable()) {\n await CustomElementUtils.importjs(consts.API_URI);\n await whenTHREEAvailable();\n await Promise.all([CustomElementUtils.importjs(consts.ORBIT_URI)]\n .concat(consts.LOADERS.map(js => CustomElementUtils.importjs(js))));\n }\n // here comes THREE.js\n this._scene = new THREE.Scene();\n // this._scene.add(new THREE.Mesh(new THREE.PlaneGeometry(1, 1, 1, 1), consts.DEFAULT_MATERIAL()));\n this.invalidateSize(container);\n let w = this._stage.width, h = this._stage.height;\n //if (!ctrl.renderer)\n let parameters = {\n canvas: stage, antialias: true, stencil: false, alpha: container.transparent ?? true //, clearAlpha: 1\n };\n this._renderer = new THREE.WebGLRenderer(parameters);\n this._renderer.setSize(w, h);\n if (container.background && !container.transparent) {\n let clr = container.background;\n if (typeof clr === 'string') {\n clr = Colors.parse(clr);\n }\n const theejsClr = new THREE.Color(clr.r, clr.g, clr.b);\n this._renderer.setClearColor(theejsClr, clr.a);\n }\n this.orbit = container.orbit;\n return stage;\n }\n _setCamera(cam) {\n this._camera = cam;\n this.invalidateSize(this._3d);\n this._disposeOrbitControls();\n // re-init\n if (this.orbit) {\n this._initOrbitControls();\n }\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (name === 'orbit') {\n if (val === true)\n this._initOrbitControls();\n else\n this._disposeOrbitControls();\n }\n }\n _initOrbitControls() {\n const cam = this._camera;\n if (Utils.isNull(this._3d) || Utils.isNull(cam)) {\n return;\n }\n const controls = this._orbitCtrls = new THREE['OrbitControls'](cam, this._3d.stage);\n controls.addEventListener('change', this._orbitControlsDelegate);\n }\n _disposeOrbitControls() {\n const controls = this._orbitCtrls;\n if (Utils.isNull(controls)) {\n return;\n }\n controls.removeEventListener('change', this._orbitControlsDelegate);\n controls.dispose();\n }\n _updateRenderer(container, renderer = this._renderer) {\n if (!container.transparent) {\n if (container.background) {\n let clr = container.background;\n if (typeof clr === 'string') {\n clr = Colors.parse(clr);\n }\n const theejsClr = new THREE.Color(clr.r, clr.g, clr.b);\n renderer.setClearColor(theejsClr, clr.a);\n }\n else {\n renderer.setClearColor(null);\n }\n }\n else {\n renderer.setClearAlpha(0);\n }\n }\n invalidateSize(scene, size = scene.size) {\n this._assertMonoStage(scene);\n if (!isTHREEAvailable() || Utils.isNull(size)) {\n return;\n }\n let w = size.width;\n let h = size.height;\n this._stage.width = w;\n this._stage.height = h;\n let camera = this._camera;\n if (camera instanceof THREE.PerspectiveCamera) {\n camera.aspect = w / h;\n camera.updateProjectionMatrix();\n }\n if (this._renderer) {\n this._renderer.setSize(w, h);\n this._updateRenderer(scene);\n }\n }\n removeItem(scene, item) {\n this._assertMonoStage(scene);\n const bag = this._objects;\n const obj3d = bag.get(item);\n if (!Utils.isNull(obj3d)) {\n this._scene.remove(obj3d);\n delete this._dict[obj3d.id];\n bag.delete(item);\n }\n }\n updateItem(scene, item) {\n this._assertMonoStage(scene);\n const bag = this._objects;\n if (!Utils.isNull(item.parent) && bag.has(item.parent)) {\n const parent3d = bag.get(item.parent);\n this._addOrUpdateItem(item, parent3d);\n }\n else {\n this._addOrUpdateItem(item);\n }\n }\n addItem(scene, item) {\n this._assertMonoStage(scene);\n this._addOrUpdateItem(item);\n }\n _addOrUpdateItem(item, parent = this._scene) {\n if (!isTHREEAvailable() || Utils.isNull(parent)) {\n return;\n }\n if (item instanceof Pacem3DCameraElement) {\n if (item instanceof Pacem3DPerspectiveCameraElement) {\n var pcam;\n if (this._camera instanceof THREE.PerspectiveCamera) {\n var pcam = this._camera;\n }\n else {\n pcam = new THREE.PerspectiveCamera();\n }\n const lookAtVector = new THREE.Vector3(item.lookAt.x, item.lookAt.y, item.lookAt.z);\n pcam.lookAt(lookAtVector);\n pcam.position.set(item.position.x, item.position.y, item.position.z);\n pcam.fov = item.fov;\n pcam.aspect = item.aspect;\n pcam.near = item.near;\n pcam.far = item.far;\n //\n this._setCamera(pcam);\n //\n const orbit = this._orbitCtrls;\n if (!Utils.isNull(orbit) && orbit.object === pcam) {\n orbit.target = lookAtVector;\n orbit.update();\n }\n }\n else if (item instanceof Pacem3DOrthographicCameraElement) {\n // bunch of duplicated code\n // no need to refactor since it's a deprecating branch of development\n var ocam;\n if (this._camera instanceof THREE.OrthographicCamera) {\n var ocam = this._camera;\n }\n else {\n ocam = new THREE.OrthographicCamera();\n }\n const lookAtVector = new THREE.Vector3(item.lookAt.x, item.lookAt.y, item.lookAt.z);\n ocam.lookAt(lookAtVector);\n ocam.position.set(item.position.x, item.position.y, item.position.z);\n ocam.left = item.left;\n ocam.right = item.right;\n ocam.top = item.top;\n ocam.bottom = item.bottom;\n ocam.near = item.near;\n ocam.far = item.far;\n //\n this._setCamera(ocam);\n //\n const orbit = this._orbitCtrls;\n if (!Utils.isNull(orbit) && orbit.object === ocam) {\n orbit.target = lookAtVector;\n orbit.update();\n }\n }\n else {\n // cam not supported\n throw new Error(`Camera ${item} not supported.`);\n }\n }\n else {\n if (!this._objects.has(item)) {\n // adding\n const then = (object3D) => {\n // clear flags\n // item.flags.splice(0);\n if (object3D) {\n object3D = this._ensureAndRefresh(item, object3D, parent);\n this._objects.set(item, object3D);\n }\n else {\n // object not built\n // throw?\n }\n };\n // TODO: switch to interface matching\n if (item instanceof Pacem3DObjectElement) {\n const mesh = load(item);\n then(mesh);\n }\n else if (item instanceof Pacem3DMeshElement) {\n // beware! a change in the geometry could cause a change in the object3D type\n const mesh = build(item);\n then(mesh);\n }\n else if (item instanceof Pacem3DLightElement) {\n const light = lightToLight(item);\n then(light);\n }\n else if (item instanceof Pacem3DGroupElement) {\n const group = new THREE.Group();\n then(group);\n }\n }\n else {\n // updating\n const obj = this._objects.get(item);\n const objOut = this._ensureAndRefresh(item, obj, parent);\n if (objOut != obj) {\n this._objects.set(item, objOut);\n }\n }\n }\n }\n render() {\n if (this._camera) {\n this._renderer.render(this._scene, this._camera);\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Boolean })\n], Pacem3DThreeAdapterElement.prototype, \"orbit\", void 0);\nPacem3DThreeAdapterElement = __decorate([\n CustomElement({ tagName: P + '-3d-three-adapter' })\n], Pacem3DThreeAdapterElement);\nexport { Pacem3DThreeAdapterElement };\n","//namespace Pacem.Drawing3D.WebGPU {\nexport const LABEL_PREFIX = 'pacem-3d-';\nexport const U32_MAX = 4_294_967_295;\n// #region vertex state\nexport const VERTEX_BUFFER_INDEX_MESH_POSITION = 0;\nexport const VERTEX_BUFFER_INDEX_MESH_NORMAL = 1;\nexport const VERTEX_BUFFER_INDEX_MESH_UV = 2;\nexport const VERTEX_OUTPUT_LOCATION_NORMAL = 0;\nexport const VERTEX_OUTPUT_LOCATION_VERTEX = 1;\nexport const VERTEX_OUTPUT_LOCATION_UV = 2;\nexport const VERTEX_OUTPUT_LOCATION_INDEX = 3;\nexport const VERTEX_OUTPUT_LOCATION_RAY = 4;\nexport const VERTEX_OUTPUT_LOCATION_INSTANCE = 5;\nexport const UNIFORM_GROUP_INDEX_TRANSFORM = 1;\nexport const UNIFORM_GROUP_INDEX_CAMERA = 0;\nexport const UNIFORM_GROUP_INDEX_INTERACTION = UNIFORM_GROUP_INDEX_CAMERA; // put it in camera same binding group\nexport const STORAGE_GROUP_INDEX_LINE = 2;\nexport const UNIFORM_GROUP_INDEX_COLORPICKING = 2;\nexport const UNIFORM_BINDING_INDEX_TRANSFORM = 0;\nexport const UNIFORM_BINDING_INDEX_CAMERA = 0;\nexport const UNIFORM_BINDING_INDEX_INTERACTION = 1;\n// #endregion\n// #region fragment state\nexport const MATERIAL_GROUP_INDEX = 2;\nexport const UNIFORM_GROUP_INDEX_LIGHTING = MATERIAL_GROUP_INDEX + 1;\nexport const STORAGE_MATERIAL_INDEX = 0;\nexport const SAMPLER_BINDING_INDEX = 1;\nexport const TEXTURE_BINDING_INDEX = 2;\nexport const MATERIAL_REFERENCE = 'material';\nexport const VERTEX_COLOR_REFERENCE = 'color';\nexport const AMBIENT_COLOR_REFERENCE = 'ambient';\nexport const LIGHTING_COLOR_REFERENCE = 'lighting';\n// #endregion\n// #region WGSL\nexport const WGSL_VERTEXINPUT_STRUCT_NAME = 'VertexInput';\nexport const WGSL_VERTEXOUTPUT_STRUCT_NAME = 'VertexOutput';\nexport const WGSL_INTERACTIONDATA_STRUCT_NAME = 'InteractionData';\n// #endregion\n// Kinda polyfill for WebGPU constants, as TypeScript 6.0 does include WebGPU types but does NOT include these constants for magic numbers:\nexport var GPUBufferUsage;\n(function (GPUBufferUsage) {\n GPUBufferUsage[GPUBufferUsage[\"COPY_SRC\"] = 4] = \"COPY_SRC\";\n GPUBufferUsage[GPUBufferUsage[\"COPY_DST\"] = 8] = \"COPY_DST\";\n GPUBufferUsage[GPUBufferUsage[\"INDEX\"] = 16] = \"INDEX\";\n GPUBufferUsage[GPUBufferUsage[\"INDIRECT\"] = 256] = \"INDIRECT\";\n GPUBufferUsage[GPUBufferUsage[\"MAP_READ\"] = 1] = \"MAP_READ\";\n GPUBufferUsage[GPUBufferUsage[\"MAP_WRITE\"] = 2] = \"MAP_WRITE\";\n GPUBufferUsage[GPUBufferUsage[\"QUERY_RESOLVE\"] = 512] = \"QUERY_RESOLVE\";\n GPUBufferUsage[GPUBufferUsage[\"STORAGE\"] = 128] = \"STORAGE\";\n GPUBufferUsage[GPUBufferUsage[\"UNIFORM\"] = 64] = \"UNIFORM\";\n GPUBufferUsage[GPUBufferUsage[\"VERTEX\"] = 32] = \"VERTEX\";\n})(GPUBufferUsage || (GPUBufferUsage = {}));\nexport var GPUTextureUsage;\n(function (GPUTextureUsage) {\n GPUTextureUsage[GPUTextureUsage[\"COPY_SRC\"] = 1] = \"COPY_SRC\";\n GPUTextureUsage[GPUTextureUsage[\"COPY_DST\"] = 2] = \"COPY_DST\";\n GPUTextureUsage[GPUTextureUsage[\"RENDER_ATTACHMENT\"] = 16] = \"RENDER_ATTACHMENT\";\n GPUTextureUsage[GPUTextureUsage[\"STORAGE_BINDING\"] = 8] = \"STORAGE_BINDING\";\n GPUTextureUsage[GPUTextureUsage[\"TEXTURE_BINDING\"] = 4] = \"TEXTURE_BINDING\";\n})(GPUTextureUsage || (GPUTextureUsage = {}));\nexport var GPUShaderStage;\n(function (GPUShaderStage) {\n GPUShaderStage[GPUShaderStage[\"VERTEX\"] = 1] = \"VERTEX\";\n GPUShaderStage[GPUShaderStage[\"FRAGMENT\"] = 2] = \"FRAGMENT\";\n GPUShaderStage[GPUShaderStage[\"COMPUTE\"] = 4] = \"COMPUTE\";\n})(GPUShaderStage || (GPUShaderStage = {}));\nexport var GPUMapMode;\n(function (GPUMapMode) {\n GPUMapMode[GPUMapMode[\"READ\"] = 1] = \"READ\";\n GPUMapMode[GPUMapMode[\"WRITE\"] = 2] = \"WRITE\";\n})(GPUMapMode || (GPUMapMode = {}));\n","export var WGSLBindingType;\n(function (WGSLBindingType) {\n WGSLBindingType[\"Mesh\"] = \"mesh\";\n WGSLBindingType[\"Camera\"] = \"camera\";\n WGSLBindingType[\"Texture\"] = \"texture\";\n WGSLBindingType[\"Light\"] = \"light\";\n WGSLBindingType[\"Interaction\"] = \"interaction\";\n})(WGSLBindingType || (WGSLBindingType = {}));\n","import { GPUBufferUsage } from './constants';\n//namespace Pacem.Drawing3D.WebGPU {\nexport class Buffers {\n static create(device, data, label = '') {\n const buffer = device.createBuffer({\n size: data.byteLength, label,\n usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,\n mappedAtCreation: true\n });\n new Float32Array(buffer.getMappedRange()).set(data);\n buffer.unmap();\n return buffer;\n }\n static createUniform(device, data, label = '') {\n return device.createBuffer({\n size: data.byteLength, label,\n usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n });\n }\n static createStorage(device, data, label = '') {\n return device.createBuffer({\n size: data.byteLength, label,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n });\n }\n static createIndexed(device, data, label = '') {\n const buffer = device.createBuffer({\n size: data.byteLength, label,\n usage: GPUBufferUsage.INDEX | GPUBufferUsage.COPY_DST,\n mappedAtCreation: true\n });\n new Uint16Array(buffer.getMappedRange()).set(data);\n buffer.unmap();\n return buffer;\n }\n}\nexport class BufferLayouts {\n static createVertex(shaderLocationStart = 0, size = 3, ...sizes) {\n const attributes = [];\n let fullSize = 0, index = 0;\n for (let sz of [size].concat(sizes)) {\n attributes.push({\n shaderLocation: shaderLocationStart + index,\n offset: fullSize * Float32Array.BYTES_PER_ELEMENT,\n format: `float32x${sz}`,\n });\n fullSize += sz;\n index++;\n }\n return {\n arrayStride: fullSize /* x, y, z */ * Float32Array.BYTES_PER_ELEMENT,\n attributes,\n stepMode: 'vertex'\n };\n }\n}\n","import { Utils } from '@pacem/pacem-core';\nimport { VERTEX_OUTPUT_LOCATION_NORMAL, VERTEX_OUTPUT_LOCATION_VERTEX, VERTEX_OUTPUT_LOCATION_UV, VERTEX_OUTPUT_LOCATION_INDEX, VERTEX_OUTPUT_LOCATION_RAY, VERTEX_OUTPUT_LOCATION_INSTANCE, MATERIAL_GROUP_INDEX, STORAGE_MATERIAL_INDEX, VERTEX_COLOR_REFERENCE, LIGHTING_COLOR_REFERENCE, AMBIENT_COLOR_REFERENCE } from '../constants';\nconst DefaultBasicMaterialFragmentOptions = {\n outputNormalLocation: VERTEX_OUTPUT_LOCATION_NORMAL,\n outputVertexLocation: VERTEX_OUTPUT_LOCATION_VERTEX,\n outputUvLocation: VERTEX_OUTPUT_LOCATION_UV,\n outputVertexIndexLocation: VERTEX_OUTPUT_LOCATION_INDEX,\n outputRayIndexLocation: VERTEX_OUTPUT_LOCATION_RAY,\n outputInstanceIndexLocation: VERTEX_OUTPUT_LOCATION_INSTANCE,\n storageMaterialGroupIndex: MATERIAL_GROUP_INDEX,\n storageMaterialBindingIndex: STORAGE_MATERIAL_INDEX,\n};\nfunction adaptWGSLStringArray(array = []) {\n return array.join('\\r\\n');\n}\nfunction adaptWGSLModifierStringArray(array = []) {\n let output = '';\n for (let modifier of array) {\n const trimmed = modifier.trim();\n if (trimmed.endsWith(';')) {\n output += (trimmed + '\\r\\n\\t');\n }\n else {\n output += `${VERTEX_COLOR_REFERENCE} = ${trimmed};\\r\\n\\t`;\n }\n }\n return output;\n}\nexport function getBasicMaterialFragmentWgsl(extensions = {}, options = DefaultBasicMaterialFragmentOptions) {\n const opts = Utils.extend({}, DefaultBasicMaterialFragmentOptions, options);\n const definitions = adaptWGSLStringArray(extensions.definitions), bindings = adaptWGSLStringArray(extensions.bindings), modifiers = adaptWGSLModifierStringArray(extensions.modifiers);\n const color = VERTEX_COLOR_REFERENCE, lighting = LIGHTING_COLOR_REFERENCE, ambient = AMBIENT_COLOR_REFERENCE;\n return `// definitions\r\n\r\n${definitions}\r\n\r\n// bindings\r\n@group(${opts.storageMaterialGroupIndex}) @binding(${opts.storageMaterialBindingIndex}) var<storage, read> diffuseColor: vec4f;\r\n${bindings}\r\n\r\nconst empty = vec4f(0,0,0,0);\r\nconst white = vec4f(1,1,1,1);\r\n\r\n@fragment fn main (\r\n @builtin(position) position: vec4f, // clip-space position\r\n @location(${opts.outputNormalLocation}) normal: vec3f, // world-space normal\r\n @location(${opts.outputVertexLocation}) vertex: vec3f, // world-space position\r\n @location(${opts.outputUvLocation}) uv: vec2f,\r\n @location(${opts.outputVertexIndexLocation}) @interpolate(flat) index: u32, // vertex index,\r\n @location(${opts.outputRayIndexLocation}) ray: vec3f, // ray (eye-to-vertex) vector\r\n @location(${opts.outputInstanceIndexLocation}) @interpolate(flat) instance : u32, // instance index\r\n) -> @location(0) vec4f {\r\n var ${color} = diffuseColor;\r\n var ${ambient}: vec4f = empty;\r\n var ${lighting}: vec4f = empty;\r\n\r\n // modifiers\r\n ${modifiers}\r\n\r\n ${lighting} = select(white, ${lighting}, ${lighting}.a > 0);\r\n return ${color} * ${lighting} + ${ambient};\r\n}`;\n}\n","import { Utils } from '@pacem/pacem-core';\nimport { STORAGE_GROUP_INDEX_LINE, STORAGE_MATERIAL_INDEX } from '../constants';\nconst DefaultLineMaterialFragmentOptions = {\n outputInstanceIndexLocation: 0,\n outputVertexIndexLocation: 1,\n storageMaterialGroupIndex: STORAGE_GROUP_INDEX_LINE + 1,\n storageMaterialBindingIndex: STORAGE_MATERIAL_INDEX,\n};\nfunction adaptWGSLStringArray(array = []) {\n return array.join('\\r\\n');\n}\nfunction adaptWGSLModifierStringArray(array = []) {\n let output = '';\n for (let modifier of array) {\n const trimmed = modifier.trim();\n if (trimmed.endsWith(';')) {\n output += (trimmed + '\\r\\n');\n }\n else {\n output += `output = ${trimmed};\\r\\n`;\n }\n }\n return output;\n}\nexport function getLineMaterialFragmentWgsl(extensions = {}, options = DefaultLineMaterialFragmentOptions) {\n const opts = Utils.extend({}, DefaultLineMaterialFragmentOptions, options);\n const definitions = adaptWGSLStringArray(extensions.definitions), bindings = adaptWGSLStringArray(extensions.bindings), modifiers = adaptWGSLModifierStringArray(extensions.modifiers);\n return `// definitions\r\n${definitions}\r\n\r\n// bindings\r\n@group(${options.storageMaterialGroupIndex}) @binding(${options.storageMaterialBindingIndex}) var<storage, read> vertexColors: array<vec4f>;\r\n${bindings}\r\n\r\nfn getVertexColor(index: u32) -> vec4f {\r\n let numColors = arrayLength(&vertexColors);\r\n let vertexColorIndex = index % numColors;\r\n return vertexColors[vertexColorIndex];\r\n}\r\n\r\n@fragment fn main (\r\n @builtin(position) position: vec4f, // clip-space position\r\n @location(${opts.outputInstanceIndexLocation}) @interpolate(flat) instance: u32, // instance index\r\n @location(${opts.outputVertexIndexLocation}) @interpolate(flat) index: u32 // vertex index\r\n) -> @location(0) vec4f {\r\n var output = getVertexColor(index);\r\n\r\n // modifiers\r\n ${modifiers}\r\n\r\n return output;\r\n}`;\n}\n","import { Utils } from '@pacem/pacem-core';\nimport { Colors } from '@pacem/pacem-foundation';\nimport { isBasicMaterial, isLineMaterial, KnownShader } from '../../materials/material';\nimport { Buffers } from './buffers';\nimport { GPUTextureUsage } from './constants';\nimport { getBasicMaterialFragmentWgsl } from './wgsl/basic-material-fragment';\nimport { getLineMaterialFragmentWgsl } from './wgsl/line-material-fragment';\nimport { LABEL_PREFIX } from './constants';\n//namespace Pacem.Drawing3D.WebGPU {\nexport class Materials {\n static create(material) {\n if (isBasicMaterial(material)) {\n return new BasicMaterial(material);\n }\n if (isLineMaterial(material)) {\n return new LineMaterial(material);\n }\n throw new TypeError(`Material type '${material.shader}' not supported.`);\n }\n}\nconst EmptyMaterialWGSLDelegates = {\n// empty delegates\n};\nclass MaterialBase {\n constructor(material) {\n if (Utils.isNull(this.#material = material)) {\n throw new ReferenceError(\"Null material provided.\");\n }\n }\n #material;\n get material() { return this.#material; }\n get wgsl() {\n return EmptyMaterialWGSLDelegates;\n }\n buffer({ device }, label = LABEL_PREFIX + 'material-' + this.shader + '-buffer') {\n const { r, g, b, a } = this._diffuseColor();\n const materialValue = new Float32Array([r, g, b, a]);\n return { buffer: Buffers.createStorage(device, materialValue, label), value: materialValue, version: performance.now() };\n }\n _diffuseColor() {\n const { visible, opacity, color } = this.material;\n if (!(visible ?? true)) {\n return { r: 0, g: 0, b: 0, a: 0 };\n }\n const retval = typeof color === 'string' ? Colors.parse(color) : (color ?? { r: 1, g: 1, b: 1, a: 1 });\n if (opacity >= 0 && opacity <= 1) {\n return Utils.extend(retval, { a: retval.a * opacity });\n }\n return retval;\n }\n}\nexport class BasicMaterial extends MaterialBase {\n get shader() {\n return KnownShader.Basic;\n }\n constructor(material) {\n super(material);\n if (material.shader != this.shader) {\n throw new TypeError(\"Basic material expected.\");\n }\n }\n texture({ device }, key = 'texture') {\n const material = this.material;\n if (key === 'texture' && !Utils.isNull(material.texture)) {\n const texBmp = material.texture;\n const texture = device.createTexture({\n format: 'rgba8unorm',\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_DST,\n size: [texBmp.width, texBmp.height],\n });\n return { texture, source: texBmp };\n }\n return null;\n }\n // TODO: put it in the material instance/interface\n static { this.fragment = getBasicMaterialFragmentWgsl; }\n}\nexport class LineMaterial extends MaterialBase {\n get shader() {\n return KnownShader.Line;\n }\n constructor(material) {\n super(material);\n if (material.shader != this.shader) {\n throw new TypeError(\"Line material expected.\");\n }\n }\n buffer(ctx, key) {\n switch (key) {\n case 'line':\n const { device, canvas } = ctx;\n const lineMaterial = this.material;\n const lineValue = new Float32Array([canvas.clientWidth, canvas.clientHeight, lineMaterial.lineWidth / 2]);\n return { buffer: Buffers.createUniform(device, lineValue, LABEL_PREFIX + 'line-' + this.shader + '-buffer'), value: lineValue, version: performance.now() };\n default:\n return super.buffer(ctx);\n }\n }\n texture(_) {\n return null;\n }\n static { this.fragment = getLineMaterialFragmentWgsl; }\n}\n","import { WGSL_VERTEXINPUT_STRUCT_NAME, WGSL_VERTEXOUTPUT_STRUCT_NAME, WGSL_INTERACTIONDATA_STRUCT_NAME } from '../constants';\n//namespace Pacem.Drawing3D.WebGPU {\nconst defaultVertexGeometryModifierArgs = ['input', 'data'];\n//const defaultVertexGeometryModifier: VertexInputModifierDelegate = (...defaultVertexGeometryModifierArgs) => {\n// const [inputRef, dataRef] = defaultVertexGeometryModifierArgs;\n// return `fn echo(${inputRef}: ${WGSL_VERTEXINPUT_STRUCT_NAME}, ${dataRef}: ${WGSL_INTERACTIONDATA_STRUCT_NAME}) -> ${WGSL_VERTEXINPUT_STRUCT_NAME} { return ${inputRef}; }`;\n//};\nexport function extractMeshVertexModifierFunctionComponents(wgsl) {\n if (typeof wgsl !== 'string') {\n wgsl = wgsl(...defaultVertexGeometryModifierArgs);\n }\n // regex that remove all the wgsl comments and extract the function name, arguments and body\n const regex = new RegExp(`fn\\\\s+(\\\\w+)\\\\s*\\\\(([^)]*)\\\\)\\\\s*->\\\\s*(${WGSL_VERTEXINPUT_STRUCT_NAME}|${WGSL_VERTEXOUTPUT_STRUCT_NAME})\\\\s*{((.|\\\\n)+)}\\\\s*$`);\n const match = wgsl.match(regex);\n if (match) {\n const name = match[1];\n const args = match[2].split(',').map(arg => {\n const kvp = arg.split(':');\n return { name: kvp[0].trim(), type: kvp[1].trim() };\n });\n if (args.length !== 2\n || args[0].type !== match[3] // the first argument type must match the function return type\n || args[1].type !== WGSL_INTERACTIONDATA_STRUCT_NAME) {\n throw new Error(`Invalid modifier function. Invalid signature types (arg1: ${args[0]?.type}, arg2: ${args[1]?.type})`);\n }\n const body = match[4].trim();\n return { name, args: args.map(i => i.name), body };\n }\n else {\n throw new Error(`Invalid modifier function. Must be a valid WGSL function with the signature: fn name(arg1: ${WGSL_VERTEXINPUT_STRUCT_NAME}|${WGSL_VERTEXOUTPUT_STRUCT_NAME}, arg2: ${WGSL_INTERACTIONDATA_STRUCT_NAME}) -> ${WGSL_VERTEXINPUT_STRUCT_NAME}|${WGSL_VERTEXOUTPUT_STRUCT_NAME}`);\n }\n}\n","import { Utils } from '@pacem/pacem-core';\nimport { VERTEX_OUTPUT_LOCATION_NORMAL, VERTEX_OUTPUT_LOCATION_VERTEX, VERTEX_OUTPUT_LOCATION_UV, VERTEX_OUTPUT_LOCATION_INDEX, VERTEX_OUTPUT_LOCATION_RAY, VERTEX_OUTPUT_LOCATION_INSTANCE, VERTEX_BUFFER_INDEX_MESH_POSITION, VERTEX_BUFFER_INDEX_MESH_NORMAL, VERTEX_BUFFER_INDEX_MESH_UV, UNIFORM_BINDING_INDEX_CAMERA, UNIFORM_GROUP_INDEX_CAMERA, UNIFORM_BINDING_INDEX_TRANSFORM, UNIFORM_GROUP_INDEX_TRANSFORM, UNIFORM_BINDING_INDEX_INTERACTION, UNIFORM_GROUP_INDEX_INTERACTION, WGSL_VERTEXINPUT_STRUCT_NAME, WGSL_VERTEXOUTPUT_STRUCT_NAME, WGSL_INTERACTIONDATA_STRUCT_NAME } from '../constants';\nimport { extractMeshVertexModifierFunctionComponents } from './shared';\nconst DefaultMeshVertexOptions = {\n outputNormalLocation: VERTEX_OUTPUT_LOCATION_NORMAL,\n outputVertexLocation: VERTEX_OUTPUT_LOCATION_VERTEX,\n outputUvLocation: VERTEX_OUTPUT_LOCATION_UV,\n outputVertexIndexLocation: VERTEX_OUTPUT_LOCATION_INDEX,\n outputInstanceIndexLocation: VERTEX_OUTPUT_LOCATION_INSTANCE,\n outputRayLocation: VERTEX_OUTPUT_LOCATION_RAY,\n inputPositionLocation: VERTEX_BUFFER_INDEX_MESH_POSITION,\n inputNormalLocation: VERTEX_BUFFER_INDEX_MESH_NORMAL,\n inputUvLocation: VERTEX_BUFFER_INDEX_MESH_UV,\n uniformViewBindingIndex: UNIFORM_BINDING_INDEX_CAMERA,\n uniformViewGroupIndex: UNIFORM_GROUP_INDEX_CAMERA,\n uniformWorldBindingIndex: UNIFORM_BINDING_INDEX_TRANSFORM,\n uniformWorldGroupIndex: UNIFORM_GROUP_INDEX_TRANSFORM,\n uniformInteractionBindingIndex: UNIFORM_BINDING_INDEX_INTERACTION,\n uniformInteractionGroupIndex: UNIFORM_GROUP_INDEX_INTERACTION,\n};\nexport function getMeshVertexWgsl(options = DefaultMeshVertexOptions) {\n if (options != DefaultMeshVertexOptions) {\n options = Utils.extend({}, DefaultMeshVertexOptions, options);\n }\n // vertex input modifier?\n const modifierInput = options.inputModifier;\n let modifyInstructionInput = 'vertexInput', modifierFnInput = '';\n if (!Utils.isNullOrEmpty(modifierInput)) {\n const { name: modifierName, args: [arg0, arg1], body: modifierBody } = extractMeshVertexModifierFunctionComponents(modifierInput);\n modifyInstructionInput = `${modifierName}(vertexInput, interaction)`;\n modifierFnInput = `fn ${modifierName} (${arg0}: ${WGSL_VERTEXINPUT_STRUCT_NAME}, ${arg1}: ${WGSL_INTERACTIONDATA_STRUCT_NAME}) -> ${WGSL_VERTEXINPUT_STRUCT_NAME} {\r\n ${modifierBody}\r\n}`;\n }\n // vertex output modifier?\n const modifierOutput = options.outputModifier;\n let modifyInstructionOutput = 'output', modifierFnOutput = '';\n if (!Utils.isNullOrEmpty(modifierOutput)) {\n const { name: modifierName, args: [arg0, arg1], body: modifierBody } = extractMeshVertexModifierFunctionComponents(modifierOutput);\n modifyInstructionOutput = `${modifierName}(output, interaction)`;\n modifierFnOutput = `fn ${modifierName} (${arg0}: ${WGSL_VERTEXINPUT_STRUCT_NAME}, ${arg1}: ${WGSL_INTERACTIONDATA_STRUCT_NAME}) -> ${WGSL_VERTEXOUTPUT_STRUCT_NAME} {\r\n ${modifierBody}\r\n}`;\n }\n const opts = Utils.extend({}, DefaultMeshVertexOptions, options);\n return `struct ${WGSL_VERTEXOUTPUT_STRUCT_NAME} {\r\n @builtin(position) position : vec4f, // clip space position\r\n @location(${opts.outputNormalLocation}) normal: vec3f, // world space normal\r\n @location(${opts.outputVertexLocation}) vertex : vec3f, // world space position\r\n @location(${opts.outputUvLocation}) uv : vec2f, // texture coordinates\r\n @location(${opts.outputVertexIndexLocation}) @interpolate(flat) index : u32, // vertex index\r\n @location(${opts.outputRayLocation}) ray : vec3f, // eye-to-point vector in world space\r\n @location(${opts.outputInstanceIndexLocation}) @interpolate(flat) instance : u32, // instance index\r\n}\r\n\r\nstruct ${WGSL_VERTEXINPUT_STRUCT_NAME} {\r\n @location(${opts.inputPositionLocation}) position: vec3f,\r\n @location(${opts.inputNormalLocation}) normal: vec3f,\r\n @location(${opts.inputUvLocation}) uv: vec2f,\r\n @builtin(vertex_index) index: u32,\r\n @builtin(instance_index) instance: u32,\r\n}\r\n\r\nstruct Transforms {\r\n world: mat4x4f,\r\n normal: mat3x3f,\r\n}\r\n\r\nstruct Camera {\r\n view: mat4x4f,\r\n projection: mat4x4f,\r\n position: vec3f,\r\n}\r\n\r\nstruct ${WGSL_INTERACTIONDATA_STRUCT_NAME} {\r\n // mouse coordinatges in NDC space ([-1,1], [-1,1])\r\n cursor: vec2f,\r\n // canvas size in pixels\r\n resolution: vec2f,\r\n // some phase timer (e.g. time since mouse down, or time since last click, etc.)\r\n time: f32,\r\n}\r\n\r\n${modifierFnInput}\r\n\r\n${modifierFnOutput}\r\n\r\n@group(${opts.uniformWorldGroupIndex}) @binding(${opts.uniformWorldBindingIndex}) var<uniform> transforms: Transforms;\r\n@group(${opts.uniformViewGroupIndex}) @binding(${opts.uniformViewBindingIndex}) var<uniform> camera: Camera;\r\n@group(${opts.uniformInteractionGroupIndex}) @binding(${opts.uniformInteractionBindingIndex}) var<uniform> interaction: ${WGSL_INTERACTIONDATA_STRUCT_NAME};\r\n\r\n@vertex fn main(vertexInput: ${WGSL_VERTEXINPUT_STRUCT_NAME}) -> ${WGSL_VERTEXOUTPUT_STRUCT_NAME} {\r\n let input = ${modifyInstructionInput};\r\n let position4 = vec4f(input.position, 1.0);\r\n let worldTransform = transforms.world;\r\n let viewProjectionTransform = camera.projection;\r\n let worldViewProjectionTransform = viewProjectionTransform * worldTransform;\r\n let worldPosition = (worldTransform * position4).xyz;\r\n let output = ${WGSL_VERTEXOUTPUT_STRUCT_NAME}(\r\n worldViewProjectionTransform * position4,\r\n transforms.normal * input.normal,\r\n worldPosition,\r\n input.uv,\r\n input.index,\r\n normalize(worldPosition - camera.position),\r\n input.instance\r\n );\r\n return ${modifyInstructionOutput};\r\n}`;\n}\n","import { Utils } from '@pacem/pacem-core';\nimport { VERTEX_BUFFER_INDEX_MESH_POSITION, UNIFORM_GROUP_INDEX_CAMERA, UNIFORM_BINDING_INDEX_CAMERA, UNIFORM_GROUP_INDEX_TRANSFORM, UNIFORM_BINDING_INDEX_TRANSFORM, STORAGE_GROUP_INDEX_LINE, WGSL_VERTEXOUTPUT_STRUCT_NAME } from '../constants';\nconst DefaultLineVertexOptions = {\n inputPositionLocation: VERTEX_BUFFER_INDEX_MESH_POSITION,\n outputInstanceIndexLocation: 0,\n outputVertexIndexLocation: 1,\n storagePositionsGroupIndex: STORAGE_GROUP_INDEX_LINE,\n storagePositionsBindingIndex: 0,\n uniformDimensionsGroupIndex: STORAGE_GROUP_INDEX_LINE,\n uniformDimensionsBindingIndex: 1,\n uniformViewGroupIndex: UNIFORM_GROUP_INDEX_CAMERA,\n uniformViewBindingIndex: UNIFORM_BINDING_INDEX_CAMERA,\n uniformWorldGroupIndex: UNIFORM_GROUP_INDEX_TRANSFORM,\n uniformWorldBindingIndex: UNIFORM_BINDING_INDEX_TRANSFORM,\n};\nfunction getVertexOutputStructDefinition(opts) {\n return `struct ${WGSL_VERTEXOUTPUT_STRUCT_NAME} {\r\n @builtin(position) position : vec4f, // clip space position\r\n @location(${opts.outputInstanceIndexLocation}) @interpolate(flat) instance : u32, // instance index\r\n @location(${opts.outputVertexIndexLocation}) @interpolate(flat) index : u32, // vertex index\r\n}`;\n}\nexport function getDefaultLineVertexWgsl(options = DefaultLineVertexOptions) {\n const opts = Utils.extend({}, DefaultLineVertexOptions, options);\n return `${getVertexOutputStructDefinition(opts)}\r\n\r\nstruct Transforms {\r\n world: mat4x4f,\r\n normal: mat3x3f,\r\n}\r\n\r\nstruct Camera {\r\n view: mat4x4f,\r\n projection: mat4x4f,\r\n position: vec3f\r\n}\r\n\r\n@group(${opts.uniformWorldGroupIndex}) @binding(${opts.uniformWorldBindingIndex}) var<uniform> transforms: Transforms;\r\n@group(${opts.uniformViewGroupIndex}) @binding(${opts.uniformViewBindingIndex}) var<uniform> camera: Camera;\r\n@group(${opts.storagePositionsGroupIndex}) @binding(${opts.storagePositionsBindingIndex}) var<storage, read> positions: array<f32>;\r\n\r\n@vertex fn main(@builtin(instance_index) instance: u32,\r\n @builtin(vertex_index) index: u32) -> ${WGSL_VERTEXOUTPUT_STRUCT_NAME} {\r\n\r\n let x = positions[3u * index + 0u];\r\n let y = positions[3u * index + 1u];\r\n let z = positions[3u * index + 2u];\r\n let position4 = vec4f(x, y, z, 1.0);\r\n let worldTransform = transforms.world;\r\n let viewProjectionTransform = camera.projection;\r\n let worldViewProjectionTransform = viewProjectionTransform * worldTransform;\r\n let worldPosition = (worldTransform * position4).xyz;\r\n return ${WGSL_VERTEXOUTPUT_STRUCT_NAME}(\r\n worldViewProjectionTransform * position4,\r\n instance,\r\n index);\r\n}`;\n}\nexport function getFatLineVertexWgsl(options = DefaultLineVertexOptions) {\n const opts = Utils.extend({}, DefaultLineVertexOptions, options);\n return `${getVertexOutputStructDefinition(opts)}\r\n\r\nstruct Transforms {\r\n world: mat4x4f,\r\n normal: mat3x3f,\r\n}\r\n\r\nstruct Camera {\r\n view: mat4x4f,\r\n projection: mat4x4f,\r\n position: vec3f\r\n}\r\n\r\nstruct Pixels {\r\n viewportWidth: f32,\r\n viewportHeight: f32,\r\n halfLineWidth: f32\r\n}\r\n\r\n@group(${opts.uniformWorldGroupIndex}) @binding(${opts.uniformWorldBindingIndex}) var<uniform> transforms: Transforms;\r\n@group(${opts.uniformViewGroupIndex}) @binding(${opts.uniformViewBindingIndex}) var<uniform> camera: Camera;\r\n@group(${opts.storagePositionsGroupIndex}) @binding(${opts.storagePositionsBindingIndex}) var<storage, read> positions: array<f32>;\r\n@group(${opts.uniformDimensionsGroupIndex}) @binding(${opts.uniformDimensionsBindingIndex}) var<uniform> dimensions: Pixels;\r\n\r\nfn computeClipPosition(index: u32) -> vec4f {\r\n let x = positions[3u * index + 0u];\r\n let y = positions[3u * index + 1u];\r\n let z = positions[3u * index + 2u];\r\n let position4 = vec4f(x, y, z, 1.0);\r\n let worldTransform = transforms.world;\r\n let viewProjectionTransform = camera.projection;\r\n let worldViewProjectionTransform = viewProjectionTransform * worldTransform;\r\n return worldViewProjectionTransform * position4;\r\n}\r\n\r\nfn computeOffsetPosition(p0: vec4f, p1: vec4f, index: u32) -> vec4f {\r\n\r\n let viewportSize = vec2f(dimensions.viewportWidth, dimensions.viewportHeight);\r\n let normalizedSize = normalize(viewportSize);\r\n let halfThickness = dimensions.halfLineWidth / dimensions.viewportWidth;\r\n let p0ndc = p0.xyz / p0.w;\r\n let p1ndc = p1.xyz / p1.w;\r\n let dir = normalize((p1ndc - p0ndc).xy);\r\n let offsetX = halfThickness * 2.0 / normalizedSize.x;\r\n let offsetY = halfThickness * 2.0 / normalizedSize.y;\r\n\r\n // perp\r\n let perp0 = vec2f(-dir.y * offsetX, dir.x * offsetY);\r\n let perp1 = perp0;\r\n\r\n /*\r\n\r\n position0-0 -----*----- position0-1\r\n |\\\\ |\r\n | \\\\ |\r\n | \\\\ |\r\n | \\\\ |\r\n | \\\\ |\r\n | \\\\ |\r\n | \\\\ |\r\n | \\\\|\r\n position1-0 -----*----- position1-1\r\n\r\n indexes:\r\n ------------\r\n p0-0 -> 0, 3\r\n p0-1 -> 5\r\n p1-0 -> 1\r\n p1-1 -> 2, 4\r\n */\r\n\r\n var outPos: vec2f;\r\n var w = p0.w;\r\n var z = p0.z;\r\n if (index == 0 || index == 3){\r\n outPos = p0ndc.xy - perp0;\r\n }\r\n else if (index == 1){\r\n outPos = p1ndc.xy - perp1;\r\n w = p1.w;\r\n z = p1.z;\r\n }\r\n else if (index == 5){\r\n outPos = p0ndc.xy + perp0;\r\n }\r\n else { //if (index == 2 || index == 4)\r\n outPos = p1ndc.xy + perp1;\r\n w = p1.w;\r\n z = p1.z;\r\n }\r\n\r\n // return vec4f(outPos , 0, 1.0);\r\n return vec4f(outPos * w, z, w);\r\n}\r\n\r\n@vertex fn main(@builtin(instance_index) instance: u32,\r\n @builtin(vertex_index) index: u32) -> ${WGSL_VERTEXOUTPUT_STRUCT_NAME} {\r\n\r\n // vertex index starting at 1\r\n let position0 = computeClipPosition(instance);\r\n let position1 = computeClipPosition(instance + 1);\r\n\r\n // apply offset\r\n let position = computeOffsetPosition(position0, position1, index);\r\n\r\n return ${WGSL_VERTEXOUTPUT_STRUCT_NAME}(\r\n position,\r\n instance,\r\n index\r\n );\r\n}`;\n}\n","import { UNIFORM_GROUP_INDEX_COLORPICKING } from '../constants';\n//namespace Pacem.Drawing3D.WebGPU {\n/**\n * Generate a WGSL piece of code that eases 3D picking using color strategy.\n */\nexport function getColorPickingFragmentWgsl(groupIndex = UNIFORM_GROUP_INDEX_COLORPICKING) {\n return `struct ColorPicker {\r\n id: u32,\r\n };\r\n\r\n @group(${groupIndex}) @binding(0) var<uniform> colorPicker: ColorPicker;\r\n\r\n @fragment\r\n fn main(@builtin(position) position: vec4f) -> @location(0) u32 {\r\n return colorPicker.id;\r\n }\r\n `;\n}\n","import { Utils } from '@pacem/pacem-core';\nimport { SAMPLER_BINDING_INDEX } from '../constants';\nconst DefaultTextureMapReferences = {\n uv: 'uv',\n};\nexport function textureMap(references = DefaultTextureMapReferences, group, binding = SAMPLER_BINDING_INDEX) {\n const key = Utils.uniqueCode();\n const samplerReference = `sampler_${key}`;\n const texReference = `tex_${key}`;\n const ref = Utils.extend({}, DefaultTextureMapReferences, references);\n const inputColor = ref.inputColor, outputColors = ref.outputColors;\n if (Utils.isNullOrEmpty(inputColor)) {\n throw new Error('Must provide either input and output vertex color parameter names.');\n }\n const modifiers = outputColors ?\n outputColors.map((name, index) => index === 0 ? `${name} = textureSample(${texReference}, ${samplerReference}, ${ref.uv}) * ${inputColor};` : `${name} = ${outputColors[0]};`)\n : [`textureSample(${texReference}, ${samplerReference}, ${ref.uv}) * ${inputColor}`];\n return {\n // type definitions\n //definition: '',\n // bindings\n bindings: [`@group(${group}) @binding(${binding}) var ${samplerReference}: sampler;`,\n `@group(${group}) @binding(${binding + 1}) var ${texReference}: texture_2d<f32>;`],\n // modifiers\n modifiers\n };\n}\n","import { Utils } from '@pacem/pacem-core';\nconst DefaultDirectionalLightReferences = {\n normal: 'normal', inputColor: 'white'\n};\nexport function directionalLight(references, group, binding) {\n const key = Utils.uniqueCode();\n const lightReference = `directional_${key}`;\n const ref = Utils.extend({}, DefaultDirectionalLightReferences, references);\n const inputColor = ref.inputColor, outputColor = ref.outputColor, normal = ref.normal ?? 'normal';\n if (Utils.isNullOrEmpty(inputColor)) {\n throw new Error('Must provide input vertex color parameter name.');\n }\n return {\n // type definitions\n definitions: [`struct DirectionalLight {\r\n color: vec4f,\r\n direction: vec3f,\r\n intensity: f32\r\n}`, `fn computeDirectional(normal: vec3f, color: vec4f, light: DirectionalLight) -> vec4f {\r\n let n = normalize(normal);\r\n let d = normalize(light.direction);\r\n let factor = light.intensity * .5 * (1.0 + dot(n, -d));\r\n let output = color.rgb * light.color.rgb * factor;\r\n return vec4f(output, color.a);\r\n}`],\n // bindings\n bindings: [`@group(${group}) @binding(${binding}) var<uniform> ${lightReference}: DirectionalLight;`],\n // modifiers\n modifiers: outputColor ? [`${outputColor} += computeDirectional(${normal}, ${inputColor}, ${lightReference});`] : [`computeDirectional(${normal}, ${inputColor}, ${lightReference})`]\n };\n}\n","import { Utils } from '@pacem/pacem-core';\nconst DefaultOmniLightReferences = {\n normal: 'normal', position: 'vertex', ray: 'ray', inputColor: 'white', specularColor: 'empty', shininess: '0'\n};\nexport function omniLight(references, group, binding) {\n const key = Utils.uniqueCode();\n const lightReference = `omni_${key}`;\n const ref = Utils.extend({}, DefaultOmniLightReferences, references);\n const inputColor = ref.inputColor, outputColor = ref.outputColor, normal = ref.normal, ray = ref.ray, vertex = ref.position, shininess = ref.shininess, specularColor = ref.specularColor;\n if (Utils.isNullOrEmpty(inputColor)) {\n throw new Error('Must provide input vertex color parameter name.');\n }\n return {\n // type definitions\n definitions: [`struct OmniLight {\r\n color: vec4f,\r\n position: vec3f,\r\n intensity: f32\r\n}`, `fn computeOmni(position: vec3f, normal: vec3f, ray: vec3f, color: vec4f, specularColor: vec4f, shininess: f32, light: OmniLight) -> vec4f {\r\n\r\n // color\r\n let n = normalize(normal);\r\n let d = normalize(position - light.position);\r\n let factor = light.intensity * .5 * (1.0 + dot(n, -d));\r\n\r\n // specular\r\n let r = normalize(ray);\r\n let halfVector = normalize(d + r);\r\n let specular = specularColor.rgb * shininess * dot(n, -halfVector);\r\n\r\n let output = color.rgb * light.color.rgb * factor + specular;\r\n return vec4f(output, color.a);\r\n}`],\n // bindings\n bindings: [`@group(${group}) @binding(${binding}) var<uniform> ${lightReference}: OmniLight;`],\n // modifiers\n modifiers: outputColor ? [`${outputColor} += computeOmni(${vertex}, ${normal}, ${ray}, ${inputColor}, ${specularColor}, ${shininess}, ${lightReference});`] : [`computeOmni(${vertex}, ${normal}, ${ray}, ${inputColor}, ${specularColor}, ${shininess}, ${lightReference})`]\n };\n}\n","import { Utils } from '@pacem/pacem-core';\nexport function ambientLight(references, group, binding) {\n const key = Utils.uniqueCode();\n const lightReference = `ambient_${key}`;\n const inputColor = references.inputColor, outputColor = references.outputColor;\n if (Utils.isNullOrEmpty(inputColor) || Utils.isNullOrEmpty(outputColor)) {\n throw new Error('Must provide either input and output vertex color parameter names.');\n }\n return {\n // type definitions\n definitions: [`struct AmbientLight {\r\n color: vec4f,\r\n intensity: f32\r\n}`, `fn computeAmbient(color: vec4f, light: AmbientLight) -> vec4f {\r\n return vec4f(light.intensity * color.rgb * light.color.rgb, color.a);\r\n}`],\n // bindings\n bindings: [`@group(${group}) @binding(${binding}) var<uniform> ${lightReference}: AmbientLight;`],\n // modifiers\n modifiers: [`${outputColor} = computeAmbient(${inputColor}, ${lightReference});`]\n };\n}\n","import { Geometry } from '@pacem/pacem-numerical';\nimport { isPerspectiveCamera, isOrthographicCamera } from '../../types';\n//namespace Pacem.Drawing3D.WebGPU {\nconst Vector3D = Geometry.LinearAlgebra.Vector3D;\nconst Matrix3D = Geometry.LinearAlgebra.Matrix3D;\nconst DEFAULT_SIZE = { width: 1, height: 1 };\nexport class Cameras {\n /**\n * Creates a new webgpu {@link Camera} given a canonic one.\n * @param camera\n * @returns\n */\n static create(camera) {\n if (isPerspectiveCamera(camera)) {\n return new PerspectiveCamera(camera);\n }\n if (isOrthographicCamera(camera)) {\n return new OrthographicCamera(camera);\n }\n throw new TypeError(`Camera type '${camera['type']}' not supported.`);\n }\n}\n/**\n * Camera orientation 4x4 matrix.\n * @param eye\n * @param target\n * @param up\n * @returns\n */\nfunction view(eye, target, up) {\n const z = /* inverse forward is eye -> target */ Vector3D.subtract(target, eye);\n const x = Vector3D.cross(up, z);\n const y = Vector3D.cross(z, x);\n Vector3D.normalize(x);\n Vector3D.normalize(z);\n Vector3D.normalize(y);\n const offsetX = -Vector3D.dot(x, eye);\n const offsetY = -Vector3D.dot(y, eye);\n const offsetZ = -Vector3D.dot(z, eye);\n return Matrix3D.from(x.x, y.x, z.x, 0, x.y, y.y, z.y, 0, x.z, y.z, z.z, 0, offsetX, offsetY, offsetZ, 1);\n}\nfunction assertNearFarCorrectness(near, far) {\n if (near <= 0) {\n throw new RangeError(\"Near plane distance must be positive.\");\n }\n if (far <= near) {\n throw new RangeError(\"Far plane distance must be greater than near plane distance.\");\n }\n}\n/**\n * Perspective transformation 4x4 matrix.\n * @param fovY Vertical field of view (in radians)\n * @param aspectRatio Frustum aspect ratio\n * @param near Clipping plane near distance (not z coordinate)\n * @param far Clipping plane far distance (not z coordinate)\n * @returns\n */\nfunction perspective(fovY = 120, aspectRatio = 1, near = 0.1, far = 1000) {\n assertNearFarCorrectness(near, far);\n const scale = Math.tan(.5 * Math.PI * (1 - fovY / 180));\n const m11 = scale / aspectRatio;\n const finitelyFar = Number.isFinite(far);\n const m33 = finitelyFar ? (far / (near - far)) : -1;\n const offsetZ = finitelyFar ? (far * near / (near - far)) : -near;\n return Matrix3D.from(m11, 0, 0, 0, 0, scale, 0, 0, 0, 0, m33, -1, 0, 0, offsetZ, 0);\n}\n/**\n * Othographic transformation 4x4 matrix.\n * @param left Viewport's left side\n * @param right Viewport's right side\n * @param top Viewport's top side\n * @param bottom Viewport's bottom side\n * @param near Clipping plane near distance\n * @param far Clipping plane far distance\n */\nfunction orthographic(left, right, top, bottom, near = .1, far = 1000) {\n assertNearFarCorrectness(near, far);\n return Matrix3D.from(2 / (right - left), 0, 0, 0, 0, 2 / (top - bottom), 0, 0, 0, 0, 1 / (near - far), 0, (left + right) / (left - right), (top + bottom) / (bottom - top), near / (near - far), 1);\n}\nexport class OrthographicCamera {\n constructor(_camera) {\n this._camera = _camera;\n }\n static view(camera) {\n return view(camera.position, camera.lookAt, camera.up);\n }\n static projection(camera, size = DEFAULT_SIZE) {\n const eye = camera.position, target = camera.lookAt;\n const z = Vector3D.subtract(target, eye);\n Vector3D.normalize(z);\n const zoom = Vector3D.dot(z, eye);\n const { height, width } = size;\n const ratio = width / height;\n const factor = .5 * zoom;\n const w = factor * ratio, h = factor;\n const top = camera.top * h, bottom = camera.bottom * h;\n const right = camera.right * w, left = camera.left * w;\n return orthographic(left, right, top, bottom, camera.near, camera.far);\n }\n view() {\n return OrthographicCamera.view(this._camera);\n }\n projection(size) {\n return OrthographicCamera.projection(this._camera, size);\n }\n}\nexport class PerspectiveCamera {\n constructor(_camera) {\n this._camera = _camera;\n }\n static view(camera) {\n return view(camera.position, camera.lookAt, camera.up);\n }\n static projection(camera, size = DEFAULT_SIZE) {\n const aspectRatio = (size.width / size.height) / camera.aspectRatio;\n return perspective(camera.fov, aspectRatio, camera.near, camera.far);\n }\n view() {\n return PerspectiveCamera.view(this._camera);\n }\n projection(size) {\n return PerspectiveCamera.projection(this._camera, size);\n }\n}\n","import { Utils } from '@pacem/pacem-core';\nimport { Colors } from '@pacem/pacem-foundation';\nimport { Geometry } from '@pacem/pacem-numerical';\nimport { StalePropertyFlag, isGroup, isMesh, isCamera, isLight, isGeometry, isInteraction, isMeshGeometry } from '../../types';\nimport { KnownShader, isMaterial } from '../../materials/material';\nimport { AdapterUtils } from '../shared';\nimport { U32_MAX, LABEL_PREFIX } from './constants';\nimport { Buffers } from './buffers';\nimport { Cameras } from './cameras';\nimport { Materials } from './materials';\n//namespace Pacem.Drawing3D.WebGPU {\nconst Vector3D = Geometry.LinearAlgebra.Vector3D;\nconst Matrix3D = Geometry.LinearAlgebra.Matrix3D;\nfunction throwBufferRequestError(key, type) {\n if (typeof type === 'function') {\n type = type.name;\n }\n throw new RangeError(`Buffer '${key}' not available for ${type}.`);\n}\nfunction createRenderableBuffer(item, parent, ...args) {\n item.stage ??= parent?.item.stage;\n if (isGroup(item)) {\n item.key ??= 'group_' + Utils.uniqueCode();\n return new RenderableGroupBuffer(item, parent, ...args);\n }\n if (isMesh(item)) {\n item.key ??= 'mesh_' + Utils.uniqueCode();\n return new RenderableMeshBuffer(item, parent, ...args);\n }\n if (isCamera(item)) {\n item.key ??= 'camera_' + Utils.uniqueCode();\n return new RenderableCameraBuffer(item /*, parent*/);\n }\n if (isLight(item)) {\n item.key ??= 'light_' + item.type + '_' + Utils.uniqueCode();\n return new RenderableLightBuffer(item /*, parent*/);\n }\n throw new Error(`Renderable is not supported.`);\n}\nexport class RenderLooper {\n constructor(_set) {\n this._set = _set;\n }\n /** @internal */\n get items() {\n return this._set;\n }\n loop(render) {\n const { meshes, cameras, groups, lights } = this._set;\n const camera = cameras[0];\n let cameraDone = false, lightsDone = false;\n for (let mesh of meshes) {\n if (mesh.disposed) {\n continue;\n }\n // execute\n const rendered = render(mesh, camera, lights);\n if (!rendered) {\n continue;\n }\n // seal buffers\n RenderableBuffers.clearFlags(mesh);\n if (!cameraDone) {\n RenderableBuffers.clearFlags(camera);\n cameraDone = true;\n }\n if (!lightsDone) {\n lights.forEach(light => RenderableBuffers.clearFlags(light));\n lightsDone = true;\n }\n }\n for (let group of groups) {\n // seal group buffers\n RenderableBuffers.clearFlags(group);\n }\n }\n}\nexport class ManagedBuffers {\n static create(item) {\n if (isGeometry(item)) {\n item.key ??= 'geometry_' + Utils.uniqueCode();\n return new GeometryBuffer(item);\n }\n if (isMaterial(item)) {\n return new MaterialBuffer(item);\n }\n if (isInteraction(item)) {\n return new InteractionBuffer(item);\n }\n throw new Error(`Object is not supported.`);\n }\n}\nexport class RenderableBuffers {\n static create(item, ...args) {\n return createRenderableBuffer(item, null, ...args);\n }\n static clearFlags(buffer, includeParent = false) {\n buffer.item.flags.splice(0);\n if (includeParent) {\n const bufferBase = buffer;\n if (!Utils.isNull(bufferBase.parent)) {\n RenderableBuffers.clearFlags(bufferBase.parent, true);\n }\n }\n }\n static allFlags(buffer) {\n const bufferBase = buffer;\n const parentBufferBase = bufferBase.parent;\n const parentFlags = Utils.isNull(parentBufferBase) ? [] : RenderableBuffers.allFlags(parentBufferBase);\n return bufferBase.item.flags.union(parentFlags);\n }\n}\nclass ManagedBufferBase {\n #item;\n constructor(item) {\n this.#item = item;\n }\n get item() {\n return this.#item;\n }\n #lock = false;\n lock() {\n this.#lock = true;\n }\n unlock() {\n this.#lock = false;\n const garbage = this.#garbage;\n while (garbage.length > 0) {\n const obj = garbage.shift();\n this._destroyUnsafe(obj);\n }\n }\n #garbage = [];\n _destroyUnsafe(obj) {\n if ('texture' in obj) {\n obj.texture.destroy();\n }\n else if ('buffer' in obj) {\n obj.buffer.destroy();\n }\n }\n destroySafely(...objects) {\n for (let obj of Array.from(objects).concat(...this.#garbage.splice(0))) {\n if (!obj) {\n continue;\n }\n if (this.#lock) {\n this.#garbage.push(obj);\n }\n else {\n this._destroyUnsafe(obj);\n }\n }\n }\n #disposed = false;\n destroy() {\n this.dispose();\n this.#disposed = true;\n }\n get disposed() {\n return this.#disposed;\n }\n}\nclass RenderableBufferBase extends ManagedBufferBase {\n constructor(item, parentBuffer) {\n super(item);\n this.#parent = parentBuffer;\n this.#u32id = Utils.uniqueId() % U32_MAX;\n }\n #u32id;\n #parent;\n #u32idBuffer = new Map();\n get parent() {\n return this.#parent;\n }\n get id() {\n return this.#u32id;\n }\n allFlags() {\n const parent = this.parent;\n // TODO: this one line is a perf hog!\n return this.item.flags.union(parent?.allFlags() ?? []);\n }\n buildParentWorldTransform() {\n let worldMatrix = Matrix3D.identity();\n let step = this;\n while (!Utils.isNull(step.parent)) {\n const parentItem = step.parent.item;\n const parentItemMatrix = Matrix3D.translate(parentItem.transformMatrix ?? Matrix3D.identity(), parentItem.position ?? Vector3D.zero());\n worldMatrix = Matrix3D.multiply(worldMatrix, parentItemMatrix);\n step = step.parent;\n }\n return worldMatrix;\n }\n buildWorldTransform() {\n const itemMatrix = Matrix3D.translate(this.item.transformMatrix ?? Matrix3D.identity(), this.item.position ?? Vector3D.zero());\n const parentWorldMatrix = this.buildParentWorldTransform();\n return Matrix3D.multiply(itemMatrix, parentWorldMatrix);\n }\n #versions = new Map();\n version(key) {\n return this.#versions.get(key) ?? 0;\n }\n buffer(context, key) {\n if (key === 'u32id') {\n const u32idBuffer = this.#u32idBuffer;\n const { pipeline, device } = context;\n if (u32idBuffer.has(pipeline)) {\n return Utils.extend({ fresh: false }, u32idBuffer.get(pipeline));\n }\n const u32idBufferValue = new Uint32Array([this.id]);\n const u32idBufferBuffer = Buffers.createUniform(device, u32idBufferValue, LABEL_PREFIX + 'u32id-buffer');\n const retval = Utils.extend({ buffer: u32idBufferBuffer, value: u32idBufferValue, version: performance.now() }, { fresh: true });\n this.#u32idBuffer.set(pipeline, retval);\n return retval;\n }\n const retval = this.specificBuffer(context, key);\n this.#versions.set(key, retval.version);\n return retval;\n }\n}\nconst DefaultMaterial = { shader: KnownShader.Basic, color: '#c0c0c0', flags: [] };\n// #region GROUP\nclass RenderableGroupBuffer extends RenderableBufferBase {\n #children;\n constructor(group, parent, ...args) {\n super(group, parent);\n this.#children = group.childRenderables.map(i => createRenderableBuffer(i, this, ...args));\n }\n get children() {\n return this.#children;\n }\n specificBuffer(ctx, key) {\n return null;\n }\n texture(_) {\n throw new Error(\"Method not implemented.\");\n }\n dispose() {\n this.#children.forEach(i => i.destroy());\n //this.#children = null;\n }\n}\n// #endregion\n// #region CAMERA\nclass RenderableCameraBuffer extends RenderableBufferBase {\n #viewBag = new Map();\n #view;\n constructor(camera) {\n super(camera);\n }\n texture(_) {\n throw new Error(\"Method not implemented.\");\n }\n specificBuffer(context, key) {\n //const camera = this.item;\n let fresh = false;\n if (this.allFlags().length > 0 || Utils.isNull(this.#view)) {\n fresh = true;\n this.#viewBag.clear();\n this._rebuildMatrices(context);\n }\n const { pipeline } = context;\n if (!this.#viewBag.has(pipeline)) {\n fresh = true;\n this.#viewBag.set(pipeline, this.#view);\n }\n RenderableBuffers.clearFlags(this);\n switch (key) {\n case 'cameraViewTransform':\n return Utils.extend(this.#view, { fresh });\n default:\n throwBufferRequestError(key, RenderableCameraBuffer);\n }\n }\n _rebuildMatrices({ device, canvas }) {\n // this._destroyView();\n const cam = this.item;\n const camera = Cameras.create(cam);\n const { x, y, z } = cam.position;\n const view = camera.view();\n const projection = camera.projection(canvas);\n const viewProjection = Matrix3D.multiply(view, projection);\n const viewValue = new Float32Array(16 + 16 + 4);\n viewValue.set(Matrix3D.toArray(view), 0);\n viewValue.set(Matrix3D.toArray(viewProjection), 16);\n viewValue.set([x, y, z], 32);\n // reuse GPUBuffer (always same size)\n if (Utils.isNull(this.#view)) {\n const viewBuffer = Buffers.createUniform(device, viewValue, LABEL_PREFIX + 'view-buffer');\n this.#view = { buffer: viewBuffer, value: viewValue, version: performance.now().roundoff() };\n }\n else {\n this.#view.value = viewValue;\n this.#view.version = performance.now().roundoff();\n }\n }\n _destroyView() {\n this.#viewBag.clear();\n const view = this.#view;\n this.#view = null;\n this.destroySafely(view);\n }\n dispose() {\n this._destroyView();\n }\n}\n// #endregion\n// #region GEOMETRY\nclass GeometryBuffer extends ManagedBufferBase {\n #bufferBag = {};\n #freshness = { positions: true, normals: true, uv: true, packed: true };\n #geometryBuffers;\n constructor(geometry) {\n super(geometry);\n geometry.flags ??= [];\n }\n buffer(context, key) {\n const flags = this.item.flags ?? [];\n if (Utils.isNull(this.#geometryBuffers) || flags.includes(StalePropertyFlag.Geometry)) {\n flags.splice(0);\n this.#bufferBag = /* reset */ {};\n this._rebuildGeometryBuffers(context);\n }\n const freshness = this.#freshness;\n const geom = this.#geometryBuffers;\n const { pipeline } = context;\n const bag = (this.#bufferBag[key] ??= new Map());\n const newInPipeline = !bag.has(pipeline);\n const ensureInBag = (buffer) => {\n if (newInPipeline) {\n bag.set(pipeline, buffer);\n }\n return buffer;\n };\n switch (key) {\n case 'geometryPositions':\n const { positions } = geom, posFresh = freshness.positions;\n freshness.positions = false;\n return Utils.extend(ensureInBag(positions), { fresh: posFresh || newInPipeline });\n case 'geometryNormals':\n const { normals } = geom, normFresh = freshness.normals;\n freshness.normals = false;\n return Utils.extend(ensureInBag(normals), { fresh: normFresh || newInPipeline });\n case 'geometryTexCoords':\n const { uv } = geom, uvFresh = freshness.uv;\n freshness.uv = false;\n return Utils.extend({ fresh: uvFresh || newInPipeline }, ensureInBag(uv));\n case 'geometry':\n // alltogether\n const { packed } = geom, geomFresh = freshness.packed;\n freshness.packed = false;\n return Utils.extend(ensureInBag(packed), { fresh: geomFresh || newInPipeline });\n default:\n throwBufferRequestError(key, GeometryBuffer);\n }\n }\n texture(_) {\n throw new Error(\"Method not implemented.\");\n }\n _rebuildGeometryBuffers({ device }) {\n this._destroyBuffers();\n const version = performance.now();\n const geometry = this.item, key = geometry.key;\n if (isMeshGeometry(geometry)) {\n const meshGeometry = geometry;\n // flatten positions...\n const hasTriangleIndices = !Utils.isNullOrEmpty(meshGeometry.triangleIndices);\n const flatPositions = hasTriangleIndices ?\n meshGeometry.triangleIndices.map(index => meshGeometry.positions[index])\n : meshGeometry.positions;\n const length2 = flatPositions.length * 2, length3 = length2 + flatPositions.length;\n const positionsValue = new Float32Array(length3);\n const normalsValue = new Float32Array(length3);\n const uvValue = new Float32Array(length2);\n const geomValue = new Float32Array(2 * length3 + length2);\n for (let j = 0; j < flatPositions.length; j++) {\n const offset2 = 2 * j;\n const offset3 = 3 * j;\n const { x, y, z } = flatPositions[j];\n const { x: nx, y: ny, z: nz } = meshGeometry.normals[j];\n const { x: u, y: v } = meshGeometry.textureCoordinates[j];\n positionsValue.set([x, y, z], offset3);\n normalsValue.set([nx, ny, nz], offset3);\n uvValue.set([u, v], offset2);\n geomValue.set([x, y, z, nx, ny, nz, u, v], offset3 * 2 + offset2);\n }\n const positions = Buffers.create(device, positionsValue, LABEL_PREFIX + 'meshgeometry-' + key + '-positions-buffer');\n const normals = Buffers.create(device, normalsValue, LABEL_PREFIX + 'meshgeometry-' + key + '-normals-buffer');\n const uv = Buffers.create(device, uvValue, LABEL_PREFIX + 'meshgeometry-' + key + '-uvmap-buffer');\n const geom = Buffers.create(device, geomValue, LABEL_PREFIX + 'meshgeometry-' + key + '-buffer');\n this.#geometryBuffers = {\n packed: { buffer: geom, value: geomValue, version },\n positions: { buffer: positions, value: positionsValue, version },\n normals: { buffer: normals, value: normalsValue, version },\n uv: { buffer: uv, value: uvValue, version },\n };\n this.#freshness = { positions: true, normals: true, uv: true, packed: true };\n }\n else {\n const positionsValue = new Float32Array(AdapterUtils.flattenVectorArray(geometry.positions));\n const positions = Buffers.createStorage(device, positionsValue, LABEL_PREFIX + 'nodegeometry-' + key + '-positions-buffer');\n this.#geometryBuffers = {\n positions: { buffer: positions, value: positionsValue, version },\n packed: { buffer: positions, value: positionsValue, version }\n };\n this.#freshness = { positions: true, packed: true };\n }\n }\n _destroyBuffers() {\n this.#bufferBag = {};\n const obsolete = this.#geometryBuffers;\n if (!Utils.isNull(obsolete)) {\n this.destroySafely(obsolete.positions, obsolete.normals, obsolete.uv);\n }\n }\n dispose() {\n this._destroyBuffers();\n }\n}\n// #endregion\n// #region MATERIAL\nclass MaterialBuffer extends ManagedBufferBase {\n #bufferBag = {};\n #textureBag = {};\n #wgpuMaterial;\n #buffers = new Map();\n #textures = new Map();\n constructor(material) {\n super(material);\n material.flags ??= [];\n if (material.flags.indexOf(StalePropertyFlag.Material) === -1) {\n material.flags.push(StalePropertyFlag.Material);\n }\n }\n buffer(context, key) {\n const flags = this.item.flags ?? [];\n let fresh = Utils.isNull(this.#wgpuMaterial);\n if (flags.includes(StalePropertyFlag.Material)) {\n this.#bufferBag = /* reset */ {};\n flags.splice(0);\n fresh = true;\n this.#textures.clear();\n this._resetMaterialBuffers();\n }\n const { pipeline } = context;\n const bag = (this.#bufferBag[key] ??= new Map());\n switch (key) {\n case 'material':\n case 'line':\n const buffer = this._ensureMaterialBuffer(context, key);\n if (buffer) {\n if (!bag.has(pipeline)) {\n fresh = true;\n bag.set(pipeline, buffer);\n }\n return Utils.extend(buffer, { fresh });\n }\n return null;\n default:\n throwBufferRequestError(key, MaterialBuffer);\n }\n }\n _ensureMaterialBuffer(ctx, key = 'material') {\n const set = this.#buffers;\n let retval = set.get(key);\n if (retval) {\n return retval;\n }\n if (set.has(key)) {\n return null;\n }\n retval = this.#wgpuMaterial?.buffer(ctx, key);\n if (retval) {\n set.set(key, retval);\n }\n return retval;\n }\n _resetMaterialBuffers() {\n this.#wgpuMaterial = Materials.create(this.item);\n this._destroyBuffers();\n }\n texture(ctx, key = 'texture') {\n const set = this.#textures;\n let retval = set.get(key), fresh = false;\n if (!retval) {\n retval = this.#wgpuMaterial?.texture(ctx, key);\n if (!retval) {\n return null;\n }\n set.set(key, retval);\n fresh = true;\n //\n this.#textureBag = /* reset */ {};\n }\n const { pipeline } = ctx;\n const bag = (this.#textureBag[key] ??= new Map());\n if (!bag.has(pipeline)) {\n fresh = true;\n bag.set(pipeline, retval);\n }\n return Utils.extend(retval, { fresh });\n }\n dispose() {\n this._destroyBuffers();\n }\n _destroyBuffers() {\n // memoizers\n this.#bufferBag = {};\n this.#textureBag = {};\n // buffers\n const buffers = this.#buffers.values();\n this.#buffers.clear(); // clear before destroying\n this.destroySafely(...buffers);\n // textures\n const textures = this.#textures.values();\n this.#textures.clear(); // clear before destroying\n textures.forEach(t => t.texture.destroy());\n }\n}\n// #endregion\n// #region INTERACTION\nclass InteractionBuffer extends ManagedBufferBase {\n #fields = {\n time: 0, cursor: { x: 0, y: 0 }, resolution: { width: 0, height: 0 }\n };\n #buffer;\n #bufferBag = new Map();\n constructor(data) {\n super(data);\n Utils.extend(this.#fields, data);\n }\n buffer(context, key) {\n switch (key) {\n // altogether\n case 'interaction':\n return this._ensureInteractionBuffer(context);\n default:\n throwBufferRequestError(key, InteractionBuffer);\n }\n }\n texture(_) {\n throw new Error(\"Method not implemented.\");\n }\n _ensureInteractionBuffer(ctx, key = 'interaction') {\n const fields = this.#fields, item = this.item;\n let fresh = (!this.#buffer\n || item.time !== fields.time\n || item.resolution?.width !== fields.resolution.width\n || item.resolution?.height !== fields.resolution.height);\n if (!fresh && !Utils.isNull(item.cursor)) {\n fresh = item.cursor.x !== fields.cursor.x\n || item.cursor.y !== fields.cursor.y;\n }\n if (fresh) {\n // [4bytes cursor.x, 4bytes cursor.y, 4bytes resolution.width, 4bytes resolution.height, 4bytes time] = 20 bytes total]\n const value = new Float32Array([item.cursor?.x ?? 0, item.cursor?.y ?? 0, item.resolution.width, item.resolution.height, item.time, /* padding */ .0]);\n const buffer = Buffers.createUniform(ctx.device, value, LABEL_PREFIX + 'interaction-buffer');\n this.#buffer = { buffer, value, version: performance.now() };\n this.#bufferBag.clear();\n }\n const { pipeline } = ctx;\n const bag = this.#bufferBag;\n if (!bag.has(pipeline)) {\n fresh = true;\n bag.set(pipeline, this.#buffer);\n }\n return Utils.extend(this.#buffer, { fresh });\n }\n _destroyBuffers() {\n // memoizer\n this.#bufferBag.clear();\n // buffer itself\n const obsolete = this.#buffer;\n if (!Utils.isNull(obsolete)) {\n this.destroySafely(obsolete);\n }\n }\n dispose() {\n this._destroyBuffers();\n }\n}\n// #endregion\n// #region MESH\nclass RenderableMeshBuffer extends RenderableBufferBase {\n #geometryBuffers;\n #geometryBuffer;\n #materialBuffers;\n #materialBuffer;\n #worldTransform;\n #freshness = {\n geometry: true, material: true, transform: true\n };\n #worldTransformBufferBag = new Map();\n constructor(mesh, parent, geometries, materials) {\n super(mesh, parent);\n mesh.flags ??= [];\n if (mesh.flags.indexOf(StalePropertyFlag.Geometry) === -1) {\n mesh.flags.push(StalePropertyFlag.Geometry);\n }\n if (mesh.flags.indexOf(StalePropertyFlag.Material) === -1) {\n mesh.flags.push(StalePropertyFlag.Material);\n }\n if (mesh.flags.indexOf(StalePropertyFlag.Position) === -1 && mesh.flags.indexOf(StalePropertyFlag.Transform) === -1) {\n mesh.flags.push(StalePropertyFlag.Transform);\n }\n this.#geometryBuffers = geometries;\n this.#materialBuffers = materials;\n }\n texture(ctx, key) {\n const material = this.#materialBuffer;\n return material?.texture(ctx, key);\n }\n specificBuffer(context, key) {\n const freshness = this.#freshness;\n const flags = this.allFlags();\n if (Utils.isNull(this.#worldTransform) || flags.includes(StalePropertyFlag.Position) || flags.includes(StalePropertyFlag.Transform)) {\n this.#worldTransformBufferBag.clear();\n // world transform bind group buffer\n freshness.transform = true;\n this._rebuildWorldMatrices(context);\n }\n if (Utils.isNull(this.#geometryBuffer) || flags.includes(StalePropertyFlag.Geometry)) {\n // vertex buffers\n freshness.geometry = true;\n this._ensureGeometryBuffer();\n }\n if (Utils.isNull(this.#materialBuffer) || flags.includes(StalePropertyFlag.Material)) {\n freshness.material = true;\n this._ensureMaterialBuffer();\n }\n RenderableBuffers.clearFlags(this);\n const geom = this.#geometryBuffer;\n const mater = this.#materialBuffer;\n switch (key) {\n case 'geometryPositions':\n case 'geometryNormals':\n case 'geometryTexCoords':\n case 'geometry':\n return geom.buffer(context, key);\n case 'material':\n case 'line':\n return mater.buffer(context, key);\n case 'objectWorldTransform':\n const mat = this.#worldTransform, wFresh = freshness.transform;\n freshness.transform = false;\n const bag = this.#worldTransformBufferBag, { pipeline } = context;\n const newInPipeline = !bag.has(pipeline);\n if (newInPipeline) {\n bag.set(pipeline, mat);\n }\n return Utils.extend(mat, { fresh: wFresh || newInPipeline });\n default:\n throwBufferRequestError(key, RenderableMeshBuffer);\n }\n }\n _ensureGeometryBuffer() {\n const current = this.#geometryBuffer;\n const cache = this.#geometryBuffers;\n const mesh = this.item;\n const geom = mesh.geometry;\n // no cache provided? destroy and rebuild\n if (Utils.isNull(cache)) {\n current?.destroy();\n this.#geometryBuffer = new GeometryBuffer(geom);\n }\n else {\n let buffer = cache?.get(geom);\n if (buffer?.disposed !== false) {\n buffer = new GeometryBuffer(geom);\n cache.set(geom, buffer);\n }\n this.#geometryBuffer = buffer;\n }\n }\n _ensureMaterialBuffer() {\n const current = this.#materialBuffer;\n const cache = this.#materialBuffers;\n const mesh = this.item;\n const material = mesh.material ?? DefaultMaterial;\n // no cache provided? destroy and rebuild\n if (Utils.isNull(cache)) {\n current?.destroy();\n this.#materialBuffer = new MaterialBuffer(material);\n }\n else {\n let buffer = cache?.get(material);\n if (buffer?.disposed !== false) {\n buffer = new MaterialBuffer(material);\n cache.set(material, buffer);\n }\n this.#materialBuffer = buffer;\n }\n }\n _rebuildWorldMatrices({ device }) {\n //this.destroySafely(this.#worldTransform);\n const item = this.item;\n const matrix = this.buildWorldTransform();\n const normal = Matrix3D.transpose(Matrix3D.invert(matrix));\n const value = new Float32Array(28);\n value.set(Matrix3D.toArray(matrix), 0);\n value.set([normal.m11, normal.m12, normal.m13, 0, normal.m21, normal.m22, normal.m23, 0, normal.m31, normal.m32, normal.m33, 0], 16);\n //const current = this.#worldTransform;\n // reuse GPUBuffer (always same size)\n if (Utils.isNull(this.#worldTransform)) {\n const buffer = Buffers.createUniform(device, value, LABEL_PREFIX + 'mesh-' + item.key + '-worldmatrix-buffer');\n this.#worldTransform = { buffer, value, version: performance.now().roundoff() };\n }\n else {\n this.#worldTransform.value = value;\n this.#worldTransform.version = performance.now().roundoff();\n }\n //if (!Utils.isNull(current)) {\n // this.destroySafely(current);\n //}\n }\n dispose() {\n // memoizer\n this.#worldTransformBufferBag.clear();\n const world = this.#worldTransform;\n this.#worldTransform = null;\n this.destroySafely(world);\n const material = this.#materialBuffer;\n this.#materialBuffer = null;\n material?.destroy();\n const geometry = this.#geometryBuffer;\n this.#geometryBuffer = null;\n geometry?.destroy();\n }\n}\n// #endregion\n// #region LIGHTS\nclass RenderableLightBuffer extends RenderableBufferBase {\n #buffer;\n #bufferBag = new Map();\n constructor(light) {\n super(light);\n light.flags.push(StalePropertyFlag.Light);\n }\n /**\n * Ambient light buffer building\n * @param param0\n */\n _rebuildAmbientLightBuffer({ device }) {\n const light = this.item;\n // sizes/offsets\n const szColor = 4, szIntensity = 1, offsetColor = 0, offsetIntensity = 4;\n const szTotal = 24; // offsetIntensity + szIntensity;\n const values = new Float32Array(szTotal);\n // color\n const { r, g, b, a } = Colors.parse(light.color ?? '#fff');\n values.set([r, g, b, a], offsetColor);\n // intensity\n values.set([light.intensity], offsetIntensity);\n this.#buffer = { value: values, buffer: Buffers.createUniform(device, values, LABEL_PREFIX + 'ambient-light-buffer'), version: performance.now() };\n }\n /**\n * Directional light buffer building\n * @param param0\n */\n _rebuildDirectionalLightBuffer({ device }) {\n const light = this.item;\n // sizes/offsets\n const szIntensity = 1, szColor = 4, szDirection = 3, offsetColor = 0, offsetDirection = 4, // see: https://www.w3.org/TR/WGSL/#memory-layouts\n offsetIntensity = 7;\n const szTotal = offsetIntensity + szIntensity;\n const values = new Float32Array(szTotal);\n // color\n const { r, g, b, a } = Colors.parse(light.color ?? '#fff');\n values.set([r, g, b, a], offsetColor);\n // intensity\n values.set([light.intensity], offsetIntensity);\n // direction\n const direction = Vector3D.subtract(light.position, light.target);\n values.set([direction.x, direction.y, direction.z], offsetDirection);\n this.#buffer = { value: values, buffer: Buffers.createUniform(device, values, LABEL_PREFIX + 'directional-light-buffer'), version: performance.now() };\n }\n /**\n * Omni light buffer building\n * @param param0\n */\n _rebuildOmniLightBuffer({ device }) {\n const light = this.item;\n // sizes/offsets\n const szIntensity = 1, szColor = 4, szPosition = 3, offsetColor = 0, offsetPosition = 4, // see: https://www.w3.org/TR/WGSL/#memory-layouts\n offsetIntensity = 7;\n const szTotal = offsetIntensity + szIntensity;\n const values = new Float32Array(szTotal);\n // color\n const { r, g, b, a } = Colors.parse(light.color ?? '#fff');\n values.set([r, g, b, a], offsetColor);\n // intensity\n values.set([light.intensity], offsetIntensity);\n // position\n values.set([light.position.x, light.position.y, light.position.z], offsetPosition);\n this.#buffer = { value: values, buffer: Buffers.createUniform(device, values, LABEL_PREFIX + 'omni-light-buffer'), version: performance.now() };\n }\n _rebuildLight(context) {\n this.destroySafely(this.#buffer);\n const light = this.item;\n switch (light.type) {\n case 'direction':\n this._rebuildDirectionalLightBuffer(context);\n break;\n case 'omni':\n this._rebuildOmniLightBuffer(context);\n break;\n case 'ambient':\n this._rebuildAmbientLightBuffer(context);\n break;\n default:\n throw new Error(`Light '${light.type}' is not supported.`);\n }\n }\n texture(_) {\n throw new Error(\"Method not implemented.\");\n }\n specificBuffer(context, key) {\n const bag = this.#bufferBag;\n let fresh = Utils.isNull(this.#buffer) || this.allFlags().length > 0;\n if (fresh) {\n bag.clear();\n this._rebuildLight(context);\n }\n RenderableBuffers.clearFlags(this);\n const { pipeline } = context;\n if (!bag.has(pipeline)) {\n fresh = true;\n bag.set(pipeline, this.#buffer);\n }\n if (key === 'light') {\n return Utils.extend(this.#buffer, { fresh });\n }\n throwBufferRequestError(key, RenderableLightBuffer);\n }\n dispose() {\n this.#bufferBag.clear();\n const buffer = this.#buffer;\n this.#buffer = null;\n this.destroySafely(buffer);\n }\n}\n// #endregion\n","import { Utils } from '@pacem/pacem-core';\nimport { isMesh, isCamera, isLight, isMeshGeometry } from '../../types';\nimport { KnownShader, isLineMaterial } from '../../materials/material';\nimport { WGSLBindingType } from './abstractions';\nimport { LABEL_PREFIX, MATERIAL_GROUP_INDEX, UNIFORM_GROUP_INDEX_LIGHTING, UNIFORM_GROUP_INDEX_CAMERA, UNIFORM_BINDING_INDEX_CAMERA, UNIFORM_GROUP_INDEX_TRANSFORM, UNIFORM_BINDING_INDEX_TRANSFORM, UNIFORM_GROUP_INDEX_INTERACTION, UNIFORM_BINDING_INDEX_INTERACTION, STORAGE_MATERIAL_INDEX, STORAGE_GROUP_INDEX_LINE, SAMPLER_BINDING_INDEX, TEXTURE_BINDING_INDEX, VERTEX_BUFFER_INDEX_MESH_POSITION, VERTEX_BUFFER_INDEX_MESH_NORMAL, VERTEX_BUFFER_INDEX_MESH_UV, VERTEX_COLOR_REFERENCE, LIGHTING_COLOR_REFERENCE, AMBIENT_COLOR_REFERENCE, UNIFORM_GROUP_INDEX_COLORPICKING, GPUShaderStage } from './constants';\nimport { BufferLayouts } from './buffers';\nimport { BasicMaterial, LineMaterial } from './materials';\nimport { getMeshVertexWgsl } from './wgsl/mesh-vertex';\nimport { getDefaultLineVertexWgsl, getFatLineVertexWgsl } from './wgsl/line-vertex';\nimport { getColorPickingFragmentWgsl } from './wgsl/object-picking-fragment';\nimport { textureMap } from './wgsl/texture-fragment';\nimport { directionalLight } from './wgsl/directional-light-fragment';\nimport { omniLight } from './wgsl/omni-light-fragment';\nimport { ambientLight } from './wgsl/ambient-light-fragment';\nimport { RenderableBuffers } from './renderablebuffer';\n//namespace Pacem.Drawing3D.WebGPU {\n// #region constants\nconst labelPrefix = LABEL_PREFIX;\nconst DefaultPipelineOptions = {\n multisample: true,\n packedVertices: true,\n primitive: {\n topology: 'triangle-list',\n frontFace: 'ccw',\n cullMode: 'back'\n }\n};\nconst EMPTY_BIND_DELEGATE = (_) => { };\nexport class RenderPipelines {\n static { this._memoizer = new WeakMap(); }\n static dispose(ctx) {\n const memoizer = this._memoizer;\n const cache = memoizer.get(ctx);\n if (!Utils.isNull(cache)) {\n cache.clear();\n memoizer.delete(ctx);\n }\n }\n static createColorPicking(ctx, items) {\n const renderPipeline = RenderPipelines.create(ctx, items);\n if (renderPipeline instanceof MeshRenderPipelineClass\n || renderPipeline instanceof LineRenderPipelineClass) {\n return {\n frame: renderPipeline.raycast\n };\n }\n return null;\n }\n static create(ctx, [mesh, camera, ...lights], pipelineOptions) {\n const memoizer = RenderPipelines._memoizer;\n let cache = memoizer.get(ctx);\n if (Utils.isNull(cache)) {\n memoizer.set(ctx, cache = new Map());\n }\n //const camera = items.find(i => isCamera(i.item));\n //const lights = items.filter(i => isLight(i.item));\n //// find main object\n //const mesh = items.find(i => isMesh(i.item));\n if (!Utils.isNull(mesh)) {\n if (isMesh(mesh.item)) {\n const isMesh = isMeshGeometry(mesh.item.geometry);\n const isLine = !isMesh && isLineMaterial(mesh.item.material);\n if (!isMesh && !isLine) {\n throw new Error('Pipeline not implemented, given the provided mesh argument.');\n }\n const builder = isMesh ? new MeshWGSLBuilder(mesh, camera, ...lights)\n : new LineWGSLBuilder(mesh, camera);\n // cache peek for sudden return\n const key = builder.key + (pipelineOptions?.modifiers?.version ?? '');\n const found = cache.get(key);\n if (found) {\n return found;\n }\n const pipeline = isMesh ? new MeshRenderPipelineClass(ctx, builder)\n : new LineRenderPipelineClass(ctx, builder);\n // no cache -> build it\n pipeline.build(pipelineOptions);\n const retval = pipeline;\n Utils.extend(retval, {\n id: key + '-' + ctx.canvas.width + 'x' + ctx.canvas.height + '-' + Utils.Dates.now().toISOString()\n });\n cache.set(key, retval);\n return retval;\n }\n else {\n throw new ReferenceError('Pipeline not implemented, given thst the first argument is not a mesh.');\n }\n }\n else {\n throw new Error('Pipeline not implemented, given the provided arguments.');\n }\n }\n}\nclass RenderPipelineCache {\n constructor() {\n this.#cache = new Map();\n }\n #cache;\n ensureBindGroup({ device }, item, buffers, refresh, layout, label, callback = () => { }) {\n const cache = this.#cache;\n const key = typeof item === 'string' ? item : item.key;\n let set = cache.get(key);\n if (Utils.isNull(set)) {\n cache.set(key, set = new Map());\n }\n if (refresh || !set.has(label)) {\n const entries = buffers.map((item, index) => {\n const entry = {\n binding: index,\n resource: {\n buffer: item\n }\n };\n return entry;\n });\n const descriptor = {\n label,\n layout,\n entries\n };\n // custom config happens here\n callback(descriptor);\n const retval = device.createBindGroup(descriptor);\n set.set(label, retval);\n return retval;\n }\n else {\n return set.get(label);\n }\n }\n}\nclass MeshWGSLBuilder {\n #lights = [];\n #mesh;\n #camera;\n #bindgroups = new Map();\n #key = { shader: 'basic', lights: '' };\n constructor(...objects) {\n this.add(...objects);\n }\n reset() {\n this.#lights.splice(0);\n this.#mesh = null;\n this.#bindgroups.clear();\n this.#key = { shader: 'basic', lights: '' };\n }\n add(...objects) {\n for (let obj of objects ?? []) {\n if (isMesh(obj.item)) {\n if (Utils.isNull(this.#mesh)) {\n this.#mesh = obj;\n const material = obj.item.material ?? { shader: KnownShader.Basic };\n this.#key.shader = material.shader + '-' + (material.map ? 'map' : 'nomap');\n }\n else {\n throw new Error('Mesh already added.');\n }\n }\n else if (isLight(obj.item)) {\n const lights = this.#lights;\n lights.push(obj);\n this.#key.lights += ('-' + obj.item.type);\n }\n else if (isCamera(obj.item)) {\n this.#camera ??= obj;\n }\n else {\n throw new Error('Unknown object type.');\n }\n }\n // add interaction\n }\n build(modifiers) {\n const data = this._computeBasicData();\n const key = this.key, vertex = this.vertex({ inputModifier: modifiers?.vertexInput, outputModifier: modifiers?.vertexOutput }), fragment = this.fragment(data, { modifier: modifiers?.fragment }), bindings = (...args) => MeshWGSLBuilder.prototype.bindgroup.apply(this, args);\n const metadata = {\n lightCount: this.#lights.length,\n mapCount: this.#mesh.item.material?.map ? 1 : 0\n };\n return {\n vertex,\n fragment,\n key,\n bindings,\n metadata\n };\n }\n get key() {\n const { shader, lights } = this.#key;\n // TODO: consider backMap\n return `mesh-` + shader + lights;\n //return `mesh-${shader}${(hasTexture ? '-map' : '-nomap')}`;\n }\n bindgroup(type, key, index) {\n const set = this.#bindgroups;\n const arr = set.get(type);\n if (Utils.isNull(arr)) {\n return null;\n }\n if (Utils.isNullOrEmpty(key)) {\n return arr;\n }\n const filteredArr = arr.filter(i => i.key === key);\n if (isNaN(index)) {\n return filteredArr;\n }\n if (index >= 0 && index < arr.length) {\n return filteredArr[index];\n }\n return filteredArr;\n }\n vertex(options) {\n return getMeshVertexWgsl(options);\n }\n _computeBasicData() {\n const mesh = this.#mesh.item, lights = this.#lights, material = mesh.material, hasTexture = !Utils.isNull(material?.texture), hasLighting = !Utils.isNullOrEmpty(lights);\n const shader = Utils.isNull(mesh) ? KnownShader.Basic : (mesh.material?.shader ?? KnownShader.Basic);\n const materialBindGroupIndex = MATERIAL_GROUP_INDEX, lightingBindGroupIndex = UNIFORM_GROUP_INDEX_LIGHTING;\n return {\n hasTexture, hasLighting, shader,\n materialBindGroupIndex,\n lightingBindGroupIndex,\n };\n }\n _computeBindGroupsAndReferences(data = this._computeBasicData()) {\n const { hasTexture, materialBindGroupIndex, lightingBindGroupIndex } = data;\n const bindgroups = this.#bindgroups, lights = this.#lights;\n // build bindings\n // mesh + material\n const worldTransform = { key: 'objectWorldTransform', group: UNIFORM_GROUP_INDEX_TRANSFORM, binding: UNIFORM_BINDING_INDEX_TRANSFORM, type: 'buffer' };\n const material = { key: 'material', group: materialBindGroupIndex, binding: STORAGE_MATERIAL_INDEX, type: 'buffer' };\n if (hasTexture) {\n bindgroups.set(WGSLBindingType.Mesh, [worldTransform, material, { key: 'texture', group: materialBindGroupIndex, type: 'texture' }]);\n }\n else {\n bindgroups.set(WGSLBindingType.Mesh, [worldTransform, material]);\n }\n // camera\n bindgroups.set(WGSLBindingType.Camera, [\n { key: 'cameraViewTransform', group: UNIFORM_GROUP_INDEX_CAMERA, binding: UNIFORM_BINDING_INDEX_CAMERA, type: 'buffer' }\n ]);\n // lights\n const lArr = lights.map((_, ndx) => {\n return { key: 'light', group: lightingBindGroupIndex, binding: ndx, type: 'buffer' };\n });\n lArr.push(...lArr);\n // interaction\n bindgroups.set(WGSLBindingType.Interaction, [{ key: 'interaction', group: UNIFORM_GROUP_INDEX_INTERACTION, type: 'buffer', binding: UNIFORM_BINDING_INDEX_INTERACTION }]);\n }\n fragment(data = this._computeBasicData(), options) {\n this._computeBindGroupsAndReferences(data);\n const extra = {\n definitions: [], bindings: [], modifiers: []\n };\n const merge = (x) => {\n for (let definition of x.definitions ?? []) {\n if (extra.definitions.indexOf(definition) === -1) {\n extra.definitions.push(definition);\n }\n }\n if (!Utils.isNullOrEmpty(x.bindings)) {\n extra.bindings.push(...x.bindings);\n }\n if (!Utils.isNullOrEmpty(x.modifiers)) {\n extra.modifiers.push(...x.modifiers);\n }\n };\n /* TODO: consider injecting customizations (options.modifier) into `WGSLFragmentExtra`*/\n switch (data.shader) {\n case KnownShader.Basic:\n // texture\n if (data.hasTexture) {\n const materialGroupIndex = data.materialBindGroupIndex;\n const wgslTex = textureMap({ inputColor: VERTEX_COLOR_REFERENCE, outputColors: [VERTEX_COLOR_REFERENCE], uv: 'uv' }, materialGroupIndex);\n merge(wgslTex);\n }\n // lights\n let lightIndex = 0;\n const lights = this.#lights;\n for (let lightBuffer of lights) {\n const light = lightBuffer.item; // TODO: consider implementing Pacem.Drawing3D.WebGPU.Light interface (as of Materials)\n switch (light.type) {\n case 'direction':\n const dirLightExtra = directionalLight({ outputColor: LIGHTING_COLOR_REFERENCE, normal: 'normal' }, data.lightingBindGroupIndex, lightIndex);\n merge(dirLightExtra);\n break;\n case 'omni':\n const omniLightExtra = omniLight({ outputColor: LIGHTING_COLOR_REFERENCE, normal: 'normal', position: 'vertex', /*specularColor: MATERIAL_REFERENCE + '.specularColor', shininess: MATERIAL_REFERENCE + '.shininess'*/ }, data.lightingBindGroupIndex, lightIndex);\n merge(omniLightExtra);\n break;\n case 'ambient':\n const ambLightExtra = ambientLight({ inputColor: VERTEX_COLOR_REFERENCE, outputColor: AMBIENT_COLOR_REFERENCE }, data.lightingBindGroupIndex, lightIndex);\n merge(ambLightExtra);\n break;\n }\n lightIndex++;\n }\n return BasicMaterial.fragment(extra, options);\n }\n }\n}\nconst PipelineUtils = {\n writeBufferConditionally: (device, buffer) => {\n if (!buffer.fresh) {\n return;\n }\n device.queue.writeBuffer(buffer.buffer, 0, buffer.value);\n }\n};\nclass MeshRenderPipelineClass {\n constructor(_context, _builder, _cache = new RenderPipelineCache()) {\n this._context = _context;\n this._builder = _builder;\n this._cache = _cache;\n // #region fields and utils\n this._ensureU32idBindGroup = (item, buffer, refresh) => {\n return this._cache.ensureBindGroup(this._context, item, [buffer], refresh, this._pickBindGroupLayout, labelPrefix + 'mesh-colorpick-bind-group');\n };\n this._ensureMaterialBindGroup = (item, buffer, texture, refresh, layoutIndex = MATERIAL_GROUP_INDEX) => {\n const layout = this._bindGroupLayouts[layoutIndex], label = labelPrefix + 'material-bind-group';\n if (layout.label !== (labelPrefix + 'material-bind-group-layout')) {\n throw new Error('BindGroupLayout mismatch!');\n }\n return this._cache.ensureBindGroup(this._context, item, [buffer], refresh, layout, label, (descriptor) => {\n const { device } = this.context;\n const entries = descriptor.entries /* entries are build as array in the method */;\n if (texture) {\n entries.push({\n binding: SAMPLER_BINDING_INDEX, resource: device.createSampler({\n addressModeU: 'repeat',\n addressModeV: 'repeat',\n magFilter: 'linear',\n minFilter: 'linear',\n })\n }, {\n binding: TEXTURE_BINDING_INDEX, resource: texture.createView()\n });\n }\n });\n };\n this._ensureWorldTransformBindGroup = (item, buffer, refresh, layoutIndex = UNIFORM_GROUP_INDEX_TRANSFORM, raycasting = false) => {\n const layout = this._bindGroupLayouts[layoutIndex];\n if (layout.label !== (labelPrefix + 'mesh-transforms-bind-group-layout')) {\n throw new Error('BindGroupLayout mismatch!');\n }\n const key = item.key + '-' + (raycasting ? 1 : 0);\n const label = `${labelPrefix}${raycasting ? 'colorpick' : 'mesh'}-transforms-bind-group`;\n return this._cache.ensureBindGroup(this._context, key, [buffer], refresh, layout, label);\n };\n this._ensureCameraProjectionAndInteractionDataBindGroup = (item, viewBuffer, interactionBuffer, refresh, layoutIndex = UNIFORM_GROUP_INDEX_CAMERA, raycasting = false) => {\n const layout = this._bindGroupLayouts[layoutIndex];\n const key = item.key + '-' + (raycasting ? 1 : 0);\n const label = `${labelPrefix}${raycasting ? 'colorpick' : 'mesh'}-view-bind-group`;\n return this._cache.ensureBindGroup(this._context, key, [viewBuffer, interactionBuffer], refresh, layout, label);\n };\n this._ensureLightingBindGroup = (lights, refresh, layoutIndex = UNIFORM_GROUP_INDEX_LIGHTING) => {\n const layout = this._bindGroupLayouts[layoutIndex];\n const key = lights.map(l => l.id).join(':');\n const buffers = lights.map(l => l.buffer.buffer);\n return this._cache.ensureBindGroup(this._context, key, buffers, refresh, layout, labelPrefix + 'mesh-lighting-bind-group');\n };\n this._bindGroupLayouts = [];\n this._bindVertex = EMPTY_BIND_DELEGATE;\n this._bindPicker = EMPTY_BIND_DELEGATE;\n this._bindWorldTransform = EMPTY_BIND_DELEGATE;\n this._bindRaycastWorldTransform = EMPTY_BIND_DELEGATE;\n this._bindCameraProjectionAndInteractionData = EMPTY_BIND_DELEGATE;\n this._bindRaycastCameraProjectionAndInteractionData = EMPTY_BIND_DELEGATE;\n this._bindLighting = EMPTY_BIND_DELEGATE;\n this._bindMaterial = EMPTY_BIND_DELEGATE;\n // #endregion\n // #region implementation\n this.set = (pass) => {\n throw new Error('Deprecated.');\n };\n this.bind = (pass, ...buffers) => {\n throw new Error('Deprecated.');\n };\n this.draw = (pass, ...buffers) => {\n throw new Error('Deprecated.');\n };\n this.frame = (pass, interactionBuffer, meshBuffer, cameraBuffer, ...lightBuffers) => {\n // set\n pass.setPipeline(this._pipeline);\n try {\n // bind\n this._bindVertex(pass, meshBuffer);\n this._bindWorldTransform(pass, meshBuffer);\n this._bindMaterial(pass, meshBuffer);\n this._bindCameraProjectionAndInteractionData(pass, cameraBuffer, interactionBuffer);\n this._bindLighting(pass, ...lightBuffers);\n // draw\n const mesh = meshBuffer.item, geometry = mesh.geometry;\n pass.draw(geometry.triangleIndices?.length || geometry.positions.length);\n }\n catch (e) {\n console.error('Pacem.Drawing3D.FrameException', e);\n }\n };\n this.raycast = (pass, interactionBuffer, meshBuffer, cameraBuffer) => {\n // set\n pass.setPipeline(this._pickPipeline);\n try {\n // bind\n this._bindVertex(pass, meshBuffer);\n this._bindRaycastWorldTransform(pass, meshBuffer);\n this._bindRaycastCameraProjectionAndInteractionData(pass, cameraBuffer, interactionBuffer);\n this._bindPicker(pass, meshBuffer);\n // draw\n const mesh = meshBuffer.item, geometry = mesh.geometry;\n pass.draw(geometry.triangleIndices.length);\n }\n catch (e) { }\n };\n this._key = _builder.key;\n }\n get context() {\n return this._context;\n }\n get key() {\n return this._key;\n }\n build(pipelineOptions) {\n const options = Utils.extend({}, DefaultPipelineOptions, pipelineOptions ?? {});\n const builder = this._builder, wgsl = builder.build(options.modifiers);\n const ctx = Utils.extend({ pipeline: this }, this._context);\n const device = ctx.device;\n // #region VERTEX\n // build vertex state\n const vertex = {\n module: device.createShaderModule({ code: wgsl.vertex }),\n buffers: options.packedVertices ?\n [\n // packed\n BufferLayouts.createVertex(VERTEX_BUFFER_INDEX_MESH_POSITION, 3, 3, 2),\n ]\n : [\n // position\n BufferLayouts.createVertex(VERTEX_BUFFER_INDEX_MESH_POSITION, 3),\n // normal\n BufferLayouts.createVertex(VERTEX_BUFFER_INDEX_MESH_NORMAL, 3),\n // uv\n BufferLayouts.createVertex(VERTEX_BUFFER_INDEX_MESH_UV, 2)\n ]\n };\n // bind group layouts\n const viewBindGroupLayout = device.createBindGroupLayout({\n entries: [\n // camera matrices\n {\n binding: UNIFORM_BINDING_INDEX_CAMERA,\n visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n buffer: {\n type: 'uniform'\n }\n },\n // interaction\n {\n binding: UNIFORM_BINDING_INDEX_INTERACTION,\n visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n buffer: {\n type: 'uniform'\n }\n }\n ], label: labelPrefix + 'mesh-view-bind-group-layout'\n });\n const worldBindGroupLayout = device.createBindGroupLayout({\n entries: [\n {\n // world- and normalMatrix entry\n binding: UNIFORM_BINDING_INDEX_TRANSFORM,\n visibility: GPUShaderStage.VERTEX,\n buffer: {\n type: 'uniform'\n }\n }\n ], label: labelPrefix + 'mesh-transforms-bind-group-layout'\n });\n const bindGroupLayouts = [viewBindGroupLayout, worldBindGroupLayout];\n // #endregion\n // #region FRAGMENT\n // TODO: https://stackoverflow.com/questions/50720534/implementing-depth-testing-for-semi-transparent-objects\n // Weighted Blended Order-Independent Transparency https://jcgt.org/published/0002/02/09/\n // a-buffer: https://webgpu.github.io/webgpu-samples/?sample=a-buffer#composite.wgsl\n const fragment = {\n module: device.createShaderModule({\n code: wgsl.fragment\n }), targets: [\n {\n format: ctx.format,\n blend: {\n color: {\n srcFactor: 'src-alpha',\n dstFactor: 'one-minus-src-alpha'\n },\n alpha: {},\n }\n }\n ]\n };\n // material\n // material / material\n const materialGroupIndex = bindGroupLayouts.length;\n const materialBindGroupLayoutDescriptorEntries = [{\n // vertex colors entry\n binding: STORAGE_MATERIAL_INDEX,\n visibility: GPUShaderStage.FRAGMENT,\n buffer: {\n type: 'read-only-storage'\n }\n }];\n // material / texture\n const { mapCount } = wgsl.metadata, hasTex = mapCount > 0;\n if (hasTex) {\n materialBindGroupLayoutDescriptorEntries.push({ visibility: GPUShaderStage.FRAGMENT, binding: SAMPLER_BINDING_INDEX, sampler: {} }, ...Array(mapCount).keys().map(index => { return { visibility: GPUShaderStage.FRAGMENT, binding: SAMPLER_BINDING_INDEX + 1 + index, texture: {} }; }));\n }\n else {\n }\n const materialBindGroupLayoutDescriptor = {\n label: labelPrefix + 'material-bind-group-layout',\n entries: materialBindGroupLayoutDescriptorEntries\n };\n const materialBindGroupLayout = device.createBindGroupLayout(materialBindGroupLayoutDescriptor);\n bindGroupLayouts.push(materialBindGroupLayout);\n // lighting\n const lightingGroupIndex = bindGroupLayouts.length;\n const { lightCount } = wgsl.metadata, hasLighting = lightCount > 0;\n if (hasLighting) {\n const lightingBindGroupLayout = device.createBindGroupLayout({\n entries: [...Array(lightCount).keys()].map((_, index) => {\n return {\n visibility: GPUShaderStage.FRAGMENT, binding: index, buffer: {\n type: 'uniform'\n }\n };\n }),\n label: labelPrefix + 'lighting-bind-group-layout'\n });\n bindGroupLayouts.push(lightingBindGroupLayout);\n }\n // #endregion\n // #region PIPELINE\n // full pipeline descriptor\n const descriptor = {\n label: labelPrefix + 'mesh-render-pipeline',\n vertex,\n fragment,\n // pipeline-layout\n layout: device.createPipelineLayout({\n label: labelPrefix + 'mesh-render-pipeline-layout',\n bindGroupLayouts: (this._bindGroupLayouts = bindGroupLayouts)\n }),\n primitive: options.primitive\n };\n if (options.multisample) {\n descriptor.multisample = { count: 4 };\n descriptor.depthStencil = {\n depthCompare: 'less',\n format: 'depth24plus',\n depthWriteEnabled: true\n };\n }\n this._pipeline = device.createRenderPipeline(descriptor);\n // raycast pipeline descriptor\n const pickFragGroupLayout = this._pickBindGroupLayout = device.createBindGroupLayout({\n label: labelPrefix + 'mesh-colorpick-bind-group-layout',\n entries: [\n {\n visibility: GPUShaderStage.FRAGMENT,\n binding: 0,\n buffer: { type: 'uniform' }\n }\n ]\n });\n const pickDescriptor = {\n label: labelPrefix + 'mesh-colorpick-pipeline',\n vertex,\n fragment: {\n module: device.createShaderModule({\n code: getColorPickingFragmentWgsl(UNIFORM_GROUP_INDEX_COLORPICKING)\n }), targets: [\n { format: 'r32uint' }\n ]\n },\n layout: device.createPipelineLayout({\n label: labelPrefix + 'mesh-colorpick-pipeline-layout',\n bindGroupLayouts: [viewBindGroupLayout, worldBindGroupLayout, pickFragGroupLayout]\n }),\n primitive: options.primitive,\n depthStencil: {\n depthWriteEnabled: true,\n depthCompare: 'less',\n format: 'depth24plus',\n },\n };\n this._pickPipeline = device.createRenderPipeline(pickDescriptor);\n // #endregion\n // vertex buffers\n const bindVertexSplit = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n if (Utils.isNull(meshBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing vertex buffers was provided.`);\n }\n const { buffer: positions } = meshBuffer.buffer(ctx, 'geometryPositions');\n const { buffer: normals } = meshBuffer.buffer(ctx, 'geometryNormals');\n const { buffer: uv } = meshBuffer.buffer(ctx, 'geometryTexCoords');\n pass.setVertexBuffer(VERTEX_BUFFER_INDEX_MESH_POSITION, positions);\n pass.setVertexBuffer(VERTEX_BUFFER_INDEX_MESH_NORMAL, normals);\n pass.setVertexBuffer(VERTEX_BUFFER_INDEX_MESH_UV, uv);\n };\n const bindVertexPacked = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n if (Utils.isNull(meshBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing vertex buffers was provided.`);\n }\n const { buffer } = meshBuffer.buffer(ctx, 'geometry');\n pass.setVertexBuffer(VERTEX_BUFFER_INDEX_MESH_POSITION, buffer);\n };\n this._bindVertex = options.packedVertices ? bindVertexPacked : bindVertexSplit;\n // world transform\n const bindWorldTransform = (pass, meshBuffer, raycasting) => {\n if (Utils.isNull(meshBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing world transform buffer was provided.`);\n }\n const worldTransform = meshBuffer.buffer(ctx, 'objectWorldTransform'), worldTransformBuffer = worldTransform.buffer;\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, worldTransform);\n const { group } = wgsl.bindings(WGSLBindingType.Mesh, 'objectWorldTransform', 0);\n const bindGroup = this._ensureWorldTransformBindGroup(meshBuffer.item, worldTransformBuffer, worldTransform.fresh /*false*/ /* persist the same bindGroup, given the constant size */, group, raycasting);\n pass.setBindGroup(group, bindGroup);\n };\n this._bindWorldTransform = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n bindWorldTransform(pass, meshBuffer, false);\n };\n this._bindRaycastWorldTransform = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n bindWorldTransform(pass, meshBuffer, true);\n };\n // camera matrices and interaction data\n const bindCameraProjectionAndInteractionData = (pass, cameraBuffer, interactionBuffer, raycasting) => {\n if (Utils.isNull(cameraBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing view projection buffers was provided.`);\n }\n // camera view\n const viewTransformBuffer = cameraBuffer.buffer(ctx, 'cameraViewTransform'), viewTransformBufferBuffer = viewTransformBuffer.buffer;\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, viewTransformBuffer);\n // interaction\n if (Utils.isNull(interactionBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing interaction buffers was provided.`);\n }\n const interactionDataBuffer = interactionBuffer.buffer(ctx, 'interaction'), interactionDataBufferBuffer = interactionDataBuffer.buffer;\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, interactionDataBuffer);\n const { group } = wgsl.bindings(WGSLBindingType.Camera, 'cameraViewTransform', 0);\n const { group: interactionGroup } = wgsl.bindings(WGSLBindingType.Interaction, 'interaction', 0);\n if (group !== interactionGroup) {\n throw new ReferenceError(`Layout bind group mismatch: ${group} vs ${interactionGroup}.`);\n }\n const bindGroup = this._ensureCameraProjectionAndInteractionDataBindGroup(cameraBuffer.item, viewTransformBufferBuffer, interactionDataBufferBuffer, \n // since fresh could mean also \"camera switched\" (e.g. from ortho to perspective and then back to ortho) there's risk\n // to target destroyed buffers, this refresh the bind group if either buffer is fresh.\n // Possibilities for fine-tuning in future.\n viewTransformBuffer.fresh || interactionDataBuffer.fresh, group, raycasting);\n pass.setBindGroup(group, bindGroup);\n };\n this._bindCameraProjectionAndInteractionData = (pass, ...buffers) => {\n const cameraBuffer = buffers.at(0);\n const interactionBuffer = buffers.at(1);\n bindCameraProjectionAndInteractionData(pass, cameraBuffer, interactionBuffer, false);\n };\n this._bindRaycastCameraProjectionAndInteractionData = (pass, ...buffers) => {\n const cameraBuffer = buffers.at(0);\n const interactionBuffer = buffers.at(1);\n bindCameraProjectionAndInteractionData(pass, cameraBuffer, interactionBuffer, true);\n };\n // vertexColors and textures\n this._bindMaterial = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n if (Utils.isNull(meshBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing vertex colors was provided.`);\n }\n const vertexColorsBuffer = meshBuffer.buffer(ctx, 'material'), vertexColorsBufferBuffer = vertexColorsBuffer.buffer;\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, vertexColorsBuffer);\n let tex = meshBuffer.texture(ctx);\n const texBmp = tex?.texture;\n const bindGroup = this._ensureMaterialBindGroup(meshBuffer.item, vertexColorsBufferBuffer, texBmp, vertexColorsBuffer.fresh, materialGroupIndex);\n pass.setBindGroup(materialGroupIndex, bindGroup);\n if (hasTex) {\n device.queue.copyExternalImageToTexture({ source: tex.source, flipY: true }, { texture: texBmp }, { width: texBmp.width, height: texBmp.height });\n }\n };\n // lights\n this._bindLighting = (pass, ...buffers) => {\n if (hasLighting) {\n const lightArray = Array.from(buffers);\n const lightBuffers = lightArray.map(l => { return { buffer: l.buffer(ctx, 'light'), id: l.item.key }; });\n const refresh = lightBuffers.some(b => b.buffer.fresh);\n const bindGroup = this._ensureLightingBindGroup(lightBuffers, refresh, lightingGroupIndex);\n for (let lightBuffer of lightBuffers) {\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, lightBuffer.buffer);\n }\n pass.setBindGroup(lightingGroupIndex, bindGroup);\n }\n };\n // picker\n this._bindPicker = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n if (Utils.isNull(meshBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing world transform buffer was provided.`);\n }\n const u32id = meshBuffer.buffer(ctx, 'u32id'), u32idBuffer = u32id.buffer;\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, u32id);\n const group = UNIFORM_GROUP_INDEX_COLORPICKING;\n const refresh = u32id.fresh;\n const bindGroup = this._ensureU32idBindGroup(meshBuffer.item, u32idBuffer, refresh /* reuse u32id.fresh*/);\n pass.setBindGroup(group, bindGroup);\n };\n }\n}\nclass LineWGSLBuilder {\n #line;\n #camera;\n #bindgroups = new Map();\n constructor(...objects) {\n this.add(...objects);\n }\n reset() {\n this.#line = null;\n this.#bindgroups.clear();\n }\n add(...objects) {\n for (let obj of objects ?? []) {\n if (isMesh(obj.item)) {\n if (Utils.isNull(this.#line)) {\n this.#line = obj;\n }\n else {\n throw new Error('Line already added.');\n }\n }\n else if (isCamera(obj.item)) {\n this.#camera ??= obj;\n }\n else if (isLight(obj.item)) {\n // ignore\n }\n else {\n throw new Error('Unknown object type.');\n }\n }\n }\n build() {\n const data = this._computeBasicData();\n const key = this.key, vertex = this.vertex(data), fragment = this.fragment(data), bindings = (...args) => LineWGSLBuilder.prototype.bindgroup.apply(this, args);\n return {\n vertex,\n fragment,\n key,\n bindings,\n metadata: { thickness: data.thickness, dashPattern: data.dashPattern }\n };\n }\n get key() {\n const fat = (this.#line?.item).material?.lineWidth > 1;\n return KnownShader.Line + (fat ? '-fat' : '');\n }\n bindgroup(type, key, index) {\n const set = this.#bindgroups;\n const arr = set.get(type);\n if (Utils.isNull(arr)) {\n return null;\n }\n if (Utils.isNullOrEmpty(key)) {\n return arr;\n }\n const filteredArr = arr.filter(i => i.key === key);\n if (isNaN(index)) {\n return filteredArr;\n }\n if (index >= 0 && index < arr.length) {\n return filteredArr[index];\n }\n return filteredArr;\n }\n vertex(data = this._computeBasicData()) {\n return data.thickness > 1 ? getFatLineVertexWgsl() : getDefaultLineVertexWgsl();\n }\n _computeBasicData() {\n const mesh = this.#line.item;\n const shader = Utils.isNull(mesh) ? KnownShader.Line : (mesh.material?.shader ?? KnownShader.Line);\n const material = mesh.material;\n const thickness = material?.lineWidth ?? 1;\n const dashPattern = material?.dashArray;\n return {\n shader,\n thickness, dashPattern,\n };\n }\n _computeBindGroupsAndReferences(data = this._computeBasicData()) {\n const bindgroups = this.#bindgroups;\n // build bindings\n // mesh + material\n const worldTransform = { key: 'objectWorldTransform', group: UNIFORM_GROUP_INDEX_TRANSFORM, binding: UNIFORM_BINDING_INDEX_TRANSFORM, type: 'buffer' };\n const material = { key: 'material', group: STORAGE_GROUP_INDEX_LINE + 1, binding: STORAGE_MATERIAL_INDEX, type: 'buffer' };\n const geometryPositions = { key: 'geometryPositions', group: STORAGE_GROUP_INDEX_LINE, binding: 0, type: 'buffer' };\n const line = { key: 'line', group: STORAGE_GROUP_INDEX_LINE, binding: 1, type: 'buffer' };\n bindgroups.set(WGSLBindingType.Mesh, [worldTransform, material, geometryPositions, line]);\n // camera\n bindgroups.set(WGSLBindingType.Camera, [\n { key: 'cameraViewTransform', group: UNIFORM_GROUP_INDEX_CAMERA, binding: UNIFORM_BINDING_INDEX_CAMERA, type: 'buffer' }\n ]);\n }\n fragment(data = this._computeBasicData()) {\n this._computeBindGroupsAndReferences(data);\n const extra = {\n definitions: [], bindings: [], modifiers: []\n };\n switch (data.shader) {\n case KnownShader.Line:\n return LineMaterial.fragment(extra);\n }\n }\n}\nclass LineRenderPipelineClass {\n #context;\n constructor(context, _lineBuilder, _cache = new RenderPipelineCache()) {\n this._lineBuilder = _lineBuilder;\n this._cache = _cache;\n // #region fields and utils\n this._ensureLineU32idBindGroup = (item, buffer, refresh) => {\n const ctx = this.context;\n return this._cache.ensureBindGroup(ctx, item, [buffer], refresh, this._pickLineBindGroupLayout, labelPrefix + 'line-colorpick-bind-group');\n };\n this._ensureLineMaterialBindGroup = (item, buffer, refresh, layoutIndex = MATERIAL_GROUP_INDEX) => {\n const layout = this._bindLineGroupLayouts[layoutIndex];\n if (layout.label !== (labelPrefix + 'line-material-bind-group-layout')) {\n throw new Error('BindGroupLayout mismatch!');\n }\n const ctx = this.context;\n return this._cache.ensureBindGroup(ctx, item, [buffer], refresh, layout, labelPrefix + 'line-material-bind-group');\n };\n this._ensureLinePositionsBindGroup = (item, buffers, refresh, layoutIndex) => {\n const layout = this._bindLineGroupLayouts[layoutIndex];\n if (layout.label !== (labelPrefix + 'line-positions-bind-group-layout')) {\n throw new Error('BindGroupLayout mismatch!');\n }\n const ctx = this.context;\n return this._cache.ensureBindGroup(ctx, item, buffers, refresh, layout, labelPrefix + 'line-positions-bind-group');\n };\n this._ensureLineWorldTransformBindGroup = (item, buffer, refresh, layoutIndex = UNIFORM_GROUP_INDEX_TRANSFORM, raycasting = false) => {\n const layout = this._bindLineGroupLayouts[layoutIndex];\n if (layout.label !== (labelPrefix + 'line-transforms-bind-group-layout')) {\n throw new Error('BindGroupLayout mismatch!');\n }\n const key = item.key + '-line-' + (raycasting ? 1 : 0);\n const label = `${labelPrefix}${raycasting ? 'colorpick' : ''}-line-transforms-bind-group`;\n const ctx = this.context;\n return this._cache.ensureBindGroup(ctx, key, [buffer], refresh, layout, label);\n };\n this._ensureLineCameraProjectionBindGroup = (item, viewBuffer, refresh, layoutIndex = UNIFORM_GROUP_INDEX_CAMERA, raycasting = false) => {\n const layout = this._bindLineGroupLayouts[layoutIndex];\n const key = item.key + '-line-' + (raycasting ? 1 : 0);\n const label = `${labelPrefix}${raycasting ? 'colorpick' : ''}-line-view-bind-group`;\n const ctx = this.context;\n return this._cache.ensureBindGroup(ctx, key, [viewBuffer], refresh, layout, label);\n };\n this._bindLineGroupLayouts = [];\n this._bindLinePositions = EMPTY_BIND_DELEGATE;\n this._bindLinePicker = EMPTY_BIND_DELEGATE;\n this._bindLineWorldTransform = EMPTY_BIND_DELEGATE;\n this._bindLineRaycastWorldTransform = EMPTY_BIND_DELEGATE;\n this._bindLineCameraProjection = EMPTY_BIND_DELEGATE;\n this._bindLineRaycastCameraProjection = EMPTY_BIND_DELEGATE;\n this._bindLineMaterial = EMPTY_BIND_DELEGATE;\n this._drawLine = EMPTY_BIND_DELEGATE;\n // #endregion\n // #region implementation\n this.set = (pass) => {\n throw new Error('Deprecated.');\n };\n this.bind = (pass, ...buffers) => {\n throw new Error('Deprecated.');\n };\n this.draw = (pass, ...buffers) => {\n throw new Error('Deprecated.');\n };\n this.frame = (pass, meshBuffer, cameraBuffer) => {\n // set\n pass.setPipeline(this._linePipeline);\n try {\n // bind\n this._bindLineWorldTransform(pass, meshBuffer);\n this._bindLineCameraProjection(pass, cameraBuffer);\n this._bindLinePositions(pass, meshBuffer);\n this._bindLineMaterial(pass, meshBuffer);\n // draw\n this._drawLine(pass, meshBuffer);\n }\n catch (e) {\n console.error('Pacem.Drawing3D.FrameException', e);\n }\n };\n this.raycast = (pass, meshBuffer, cameraBuffer) => {\n // set\n pass.setPipeline(this._pickLinePipeline);\n try {\n // bind\n this._bindLineRaycastWorldTransform(pass, meshBuffer);\n this._bindLineRaycastCameraProjection(pass, cameraBuffer);\n this._bindLinePositions(pass, meshBuffer);\n this._bindLinePicker(pass, meshBuffer);\n // draw\n this._drawLine(pass, meshBuffer);\n }\n catch (e) { }\n };\n this.#context = context;\n this._lineKey = _lineBuilder.key;\n }\n get context() {\n return this.#context;\n }\n get key() {\n return this._lineKey;\n }\n build(pipelineOptions) {\n const options = Utils.extend({}, DefaultPipelineOptions, pipelineOptions ?? {});\n const builder = this._lineBuilder, wgsl = builder.build();\n const ctx = Utils.extend({ pipeline: this }, this.#context);\n const device = ctx.device;\n // TODO: switch topology based on this flag\n const fatLines = wgsl.metadata.thickness > 1;\n // #region VERTEX\n // build vertex state\n const vertex = {\n module: device.createShaderModule({ code: wgsl.vertex }),\n buffers: []\n };\n // bind group layouts\n const worldBindGroupLayout = device.createBindGroupLayout({\n entries: [\n {\n // world- and normalMatrix entry\n binding: UNIFORM_BINDING_INDEX_TRANSFORM,\n visibility: GPUShaderStage.VERTEX,\n buffer: {\n type: 'uniform'\n }\n }\n ], label: labelPrefix + 'line-transforms-bind-group-layout'\n });\n const viewBindGroupLayout = device.createBindGroupLayout({\n entries: [\n // camera matrices\n {\n binding: UNIFORM_BINDING_INDEX_CAMERA,\n visibility: GPUShaderStage.VERTEX,\n buffer: {\n type: 'uniform'\n }\n }\n ], label: labelPrefix + 'line-view-bind-group-layout'\n });\n const lineEntries = [\n // positions array\n {\n binding: 0,\n visibility: GPUShaderStage.VERTEX,\n buffer: {\n type: 'read-only-storage'\n }\n }\n ];\n if (fatLines) {\n lineEntries.push(\n // line properties (width, dash-array, lineCap, ...)\n {\n binding: 1,\n visibility: GPUShaderStage.VERTEX,\n buffer: {\n type: 'uniform'\n }\n });\n }\n const lineBindGroupLayout = device.createBindGroupLayout({\n entries: lineEntries, label: labelPrefix + 'line-positions-bind-group-layout'\n });\n const vertexBindGroupLayouts = [worldBindGroupLayout, viewBindGroupLayout, lineBindGroupLayout];\n const raycastLayoutIndex = vertexBindGroupLayouts.length;\n const bindGroupLayouts = vertexBindGroupLayouts.slice();\n // #endregion\n // #region FRAGMENT\n const fragment = {\n module: device.createShaderModule({\n code: wgsl.fragment\n }), targets: [\n {\n format: ctx.format,\n blend: {\n color: {\n srcFactor: 'src-alpha',\n dstFactor: 'one-minus-src-alpha'\n },\n alpha: {},\n }\n }\n ]\n };\n // material\n // material / material\n const materialGroupIndex = bindGroupLayouts.length;\n const materialBindGroupLayoutDescriptorEntries = [{\n // vertex colors entry\n binding: STORAGE_MATERIAL_INDEX,\n visibility: GPUShaderStage.FRAGMENT,\n buffer: {\n type: 'read-only-storage'\n }\n }];\n const materialBindGroupLayoutDescriptor = {\n label: labelPrefix + 'line-material-bind-group-layout',\n entries: materialBindGroupLayoutDescriptorEntries\n };\n const materialBindGroupLayout = device.createBindGroupLayout(materialBindGroupLayoutDescriptor);\n bindGroupLayouts.push(materialBindGroupLayout);\n // #endregion\n // #region PIPELINE\n const topology = fatLines ? options.primitive.topology : 'line-list';\n // full pipeline descriptor\n const descriptor = {\n label: labelPrefix + 'line-render-pipeline',\n vertex,\n fragment,\n // pipeline-layout\n layout: device.createPipelineLayout({\n label: labelPrefix + 'line-render-pipeline-layout',\n bindGroupLayouts: (this._bindLineGroupLayouts = bindGroupLayouts)\n }),\n primitive: Utils.extend({}, options.primitive, { topology }),\n };\n if (options.multisample) {\n descriptor.multisample = { count: 4 };\n descriptor.depthStencil = {\n depthCompare: 'less',\n format: 'depth24plus',\n depthWriteEnabled: true\n };\n }\n this._linePipeline = device.createRenderPipeline(descriptor);\n // raycast pipeline descriptor\n const pickFragGroupLayout = this._pickLineBindGroupLayout = device.createBindGroupLayout({\n label: labelPrefix + 'line-colorpick-bind-group-layout',\n entries: [\n {\n visibility: GPUShaderStage.FRAGMENT,\n binding: 0,\n buffer: { type: 'uniform' }\n }\n ]\n });\n const pickDescriptor = {\n label: labelPrefix + 'line-colorpick-pipeline',\n vertex,\n fragment: {\n module: device.createShaderModule({\n code: getColorPickingFragmentWgsl(raycastLayoutIndex)\n }), targets: [\n { format: 'r32uint' }\n ]\n },\n layout: device.createPipelineLayout({\n label: labelPrefix + 'line-colorpick-pipeline-layout',\n bindGroupLayouts: vertexBindGroupLayouts.concat(pickFragGroupLayout)\n }),\n primitive: Utils.extend({}, options.primitive, { topology }),\n depthStencil: {\n depthWriteEnabled: true,\n depthCompare: 'less',\n format: 'depth24plus',\n },\n };\n this._pickLinePipeline = device.createRenderPipeline(pickDescriptor);\n // #endregion\n // world transform\n const bindLineWorldTransform = (pass, meshBuffer, raycasting) => {\n if (Utils.isNull(meshBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing world transform buffer was provided.`);\n }\n const worldTransform = meshBuffer.buffer(ctx, 'objectWorldTransform'), worldTransformBuffer = worldTransform.buffer;\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, worldTransform);\n const { group } = wgsl.bindings(WGSLBindingType.Mesh, 'objectWorldTransform', 0);\n const bindGroup = this._ensureLineWorldTransformBindGroup(meshBuffer.item, worldTransformBuffer, \n /*worldTransform.fresh*/ false /* persist the same bindGroup, given the constant size */, group, raycasting);\n pass.setBindGroup(group, bindGroup);\n };\n this._bindLineWorldTransform = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n bindLineWorldTransform(pass, meshBuffer, false);\n };\n this._bindLineRaycastWorldTransform = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n bindLineWorldTransform(pass, meshBuffer, true);\n };\n // camera matrices\n const bindLineCameraProjection = (pass, cameraBuffer, raycasting) => {\n if (Utils.isNull(cameraBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing view projection buffers was provided.`);\n }\n const viewTransformBuffer = cameraBuffer.buffer(ctx, 'cameraViewTransform'), viewTransformBufferBuffer = viewTransformBuffer.buffer;\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, viewTransformBuffer);\n const { group } = wgsl.bindings(WGSLBindingType.Camera, 'cameraViewTransform', 0);\n const bindGroup = this._ensureLineCameraProjectionBindGroup(cameraBuffer.item, viewTransformBufferBuffer, \n /*viewTransformBuffer.fresh*/ false, group, raycasting);\n pass.setBindGroup(group, bindGroup);\n };\n this._bindLineCameraProjection = (pass, ...buffers) => {\n const cameraBuffer = buffers.at(0);\n bindLineCameraProjection(pass, cameraBuffer, false);\n };\n this._bindLineRaycastCameraProjection = (pass, ...buffers) => {\n const cameraBuffer = buffers.at(0);\n bindLineCameraProjection(pass, cameraBuffer, true);\n };\n // positions storage\n this._bindLinePositions = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n if (Utils.isNull(meshBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing vertex buffers was provided as index 0.`);\n }\n // storage buffer\n const positionsBuffer = /* should have a storage buffer here */ meshBuffer.buffer(ctx, 'geometryPositions'), positionsBufferBuffer = positionsBuffer.buffer;\n let refresh = positionsBuffer.fresh;\n const buffersInput = [positionsBufferBuffer];\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, positionsBuffer);\n if (fatLines) {\n const lineBuffer = meshBuffer.buffer(ctx, 'line'), lineBufferBuffer = lineBuffer.buffer;\n refresh ||= lineBuffer.fresh;\n buffersInput.push(lineBufferBuffer);\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, lineBuffer);\n }\n const { group: groupIndex } = wgsl.bindings(WGSLBindingType.Mesh, 'line' /* or 'geometryPositions' */, 0);\n const bindGroup = this._ensureLinePositionsBindGroup(meshBuffer.item, buffersInput, refresh, groupIndex);\n pass.setBindGroup(groupIndex, bindGroup);\n };\n // vertexColors\n this._bindLineMaterial = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n if (Utils.isNull(meshBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing vertex colors was provided.`);\n }\n const vertexColorsBuffer = meshBuffer.buffer(ctx, 'material'), vertexColorsBufferBuffer = vertexColorsBuffer.buffer;\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, vertexColorsBuffer);\n const bindGroup = this._ensureLineMaterialBindGroup(meshBuffer.item, vertexColorsBufferBuffer, vertexColorsBuffer.fresh, materialGroupIndex);\n pass.setBindGroup(materialGroupIndex, bindGroup);\n };\n // picker\n this._bindLinePicker = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n if (Utils.isNull(meshBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing world transform buffer was provided.`);\n }\n const u32id = meshBuffer.buffer(ctx, 'u32id'), u32idBuffer = u32id.buffer, u32idArray = u32id.value;\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, u32id);\n const bindGroup = this._ensureLineU32idBindGroup(meshBuffer.item, u32idBuffer, /* reuse */ false /*u32id.fresh*/);\n pass.setBindGroup(raycastLayoutIndex, bindGroup);\n };\n this._drawLine = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n const mesh = meshBuffer.item, geometry = mesh.geometry /* as NodeGeometry*/;\n if (fatLines) {\n pass.draw(6, geometry.positions.length - 1, 0, 0);\n }\n else {\n pass.draw(geometry.positions.length);\n }\n };\n }\n}\n// #endregion\n","import { Utils } from '@pacem/pacem-core';\nimport { LABEL_PREFIX, GPUTextureUsage, GPUBufferUsage, GPUMapMode } from './constants';\nimport { RenderPipelines } from './pipelinefactory';\n//namespace Pacem.Drawing3D.WebGPU {\nexport class Raycasters {\n // learn from:\n // https://webglfundamentals.org/webgl/lessons/webgl-qna-how-to-get-the-3d-coordinates-of-a-mouse-click.html\n // https://github.com/mrdoob/three.js/blob/master/src/core/Raycaster.js\n // https://shi-yan.github.io/webgpuunleashed/Control/object_picking.html\n // https://gist.github.com/greggman/57c3c0d3cf1db14f1baad2d9b0094397 (color picking)\n static { this._memoizer = new WeakMap(); }\n static dispose(ctx) {\n const memoizer = this._memoizer;\n if (memoizer.has(ctx)) {\n const cache = memoizer.get(ctx);\n for (let raycaster of cache.values()) {\n raycaster.destroy();\n }\n cache.clear();\n memoizer.delete(ctx);\n }\n }\n /** Creates a raycaster that uses color picking as a strategy to hit-test objects. */\n static createColorPicking(ctx) {\n const memoizer = this._memoizer;\n if (!memoizer.has(ctx)) {\n memoizer.set(ctx, new Map());\n }\n const cache = memoizer.get(ctx);\n const key = 'colorpick';\n if (cache.has(key)) {\n return cache.get(key);\n }\n const retval = new ColorPickingRaycaster(ctx);\n cache.set(key, retval);\n return retval;\n }\n}\nconst NUM_PIXELS = 1;\nclass ColorPickingRaycaster {\n constructor(_context) {\n this._context = _context;\n this._objects = new Map();\n this.frame = (interaction, ...buffers) => {\n if (Utils.isNull(this._encoder)) {\n throw new Error('Null encoder. Maybe you missed to call the \\'begin\\' method first.');\n }\n const objects = Array.from(buffers);\n const pipeline = RenderPipelines.createColorPicking(this._context, objects);\n pipeline?.frame(this._pass, interaction, ...buffers);\n for (let buffer of objects) {\n const item = buffer.item;\n if (item.inert) {\n continue;\n }\n //buffer.lock();\n this._objects.set(buffer.id, buffer);\n }\n };\n this.end = (pixel) => {\n if (!Utils.isNull(this._handle)) {\n return this._handle;\n }\n const pass = this._pass;\n const commandEncoder = this._encoder;\n const { device } = this._context;\n const { render } = this._textures;\n const pickTexture = render.texture;\n const pickBuffer = this._ensureBuffer();\n pass.end();\n commandEncoder.copyTextureToBuffer({\n texture: pickTexture,\n // mipLevel: 0,\n origin: {\n x: pixel.x,\n y: pixel.y,\n }\n }, {\n buffer: pickBuffer,\n bytesPerRow: ((NUM_PIXELS * 4 + 255) | 0) * 256,\n rowsPerImage: 1,\n }, {\n width: NUM_PIXELS,\n // height: 1,\n // depth: 1,\n });\n device.queue.submit([commandEncoder.finish()]);\n // remove\n this._encoder = null;\n const _this = this;\n const objects = _this._objects;\n const resetHandle = () => {\n _this._handle = null;\n };\n return this._handle = new Promise((resolve, _) => {\n pickBuffer.mapAsync(GPUMapMode.READ, 0, 4 * NUM_PIXELS).then(_ => {\n const ids = new Uint32Array(pickBuffer.getMappedRange(0, 4 * NUM_PIXELS));\n const id = ids[0];\n pickBuffer.unmap();\n // remove promise reference\n resetHandle();\n const buffer = objects.get(id);\n if (!buffer) {\n resolve([]);\n }\n else {\n resolve([buffer.item]);\n }\n // cleanup\n //pickBuffer.destroy();\n //pickTexture.destroy();\n //objects.values().forEach(b => b.unlock());\n });\n });\n };\n }\n _createTexture(format) {\n const { device, canvas } = this._context;\n const width = Math.min(device.limits.maxTextureDimension2D, canvas.clientWidth), height = Math.min(device.limits.maxTextureDimension2D, canvas.clientHeight);\n return device.createTexture({\n size: [width, height, 1],\n format,\n usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT\n });\n }\n _ensureBuffer() {\n const buffer = this._buffer;\n if (!Utils.isNull(buffer)) {\n return buffer;\n }\n const { device } = this._context;\n return this._buffer = device.createBuffer({\n label: LABEL_PREFIX + 'colorpick-output-buffer',\n size: NUM_PIXELS * 4,\n usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,\n });\n }\n _ensureTextures() {\n const textures = this._textures;\n if (!Utils.isNull(textures)) {\n return textures;\n }\n const renderTex = this._createTexture('r32uint'), depthTex = this._createTexture('depth24plus');\n const render = { texture: renderTex, view: renderTex.createView() };\n const depth = { texture: depthTex, view: depthTex.createView() };\n return this._textures = { render, depth };\n }\n ;\n _destroyTexture(texture) {\n if (Utils.isNull(texture)) {\n return;\n }\n texture.texture?.destroy();\n }\n destroy() {\n const textures = this._textures, buffer = this._buffer;\n if (!Utils.isNullOrEmpty(textures)) {\n const { render, depth } = textures;\n this._destroyTexture(render);\n this._destroyTexture(depth);\n this._textures = null;\n }\n if (!Utils.isNull(buffer)) {\n buffer.destroy();\n this._buffer = null;\n }\n }\n begin() {\n const { device } = this._context;\n this._encoder = device.createCommandEncoder({ label: LABEL_PREFIX + 'colorpick-raycaster' });\n const { render, depth } = this._ensureTextures();\n const passDescriptor = {\n label: LABEL_PREFIX + 'colorpick-raycaster-pass',\n colorAttachments: [\n {\n view: render.view,\n clearValue: { r: 0, g: 0, b: 0, a: 0 },\n loadOp: 'clear',\n storeOp: 'store',\n },\n ],\n depthStencilAttachment: {\n view: depth.view, // Assigned later\n depthClearValue: 1,\n depthLoadOp: 'clear',\n depthStoreOp: 'store',\n },\n };\n this._pass = this._encoder.beginRenderPass(passDescriptor);\n this._objects.clear();\n }\n}\n","import { Utils, P, Logging } from '@pacem/pacem-core';\nimport { Colors } from '@pacem/pacem-foundation';\nimport { Geometry } from '@pacem/pacem-numerical';\nimport { StalePropertyFlag, isMesh, isCamera, isLight, isGroup } from '../../types';\nimport { AdapterUtils } from '../shared';\nimport { LABEL_PREFIX, GPUTextureUsage } from './constants';\nimport { RenderPipelines } from './pipelinefactory';\nimport { Raycasters } from './raycaster';\nimport { RenderableBuffers, RenderLooper, ManagedBuffers } from './renderablebuffer';\n//namespace Pacem.Drawing3D.WebGPU {\nconst Vector3D = Geometry.LinearAlgebra.Vector3D;\nexport var WebGPUIssueCause;\n(function (WebGPUIssueCause) {\n WebGPUIssueCause[WebGPUIssueCause[\"NotSupported\"] = 0] = \"NotSupported\";\n WebGPUIssueCause[WebGPUIssueCause[\"Disabled\"] = 1] = \"Disabled\";\n})(WebGPUIssueCause || (WebGPUIssueCause = {}));\nexport class Renderers {\n static create(stage, config) {\n return new Promise((resolve, reject) => {\n if (!navigator.gpu) {\n const message = \"WebGPU not supported.\";\n const issue = { message, cause: WebGPUIssueCause.NotSupported };\n reject(issue);\n }\n else {\n const retval = new RendererClass(stage);\n retval.init(config).then(_ => resolve(retval), error => {\n const message = typeof error === 'string' ? error : error.message;\n const issue = { message, cause: WebGPUIssueCause.Disabled };\n reject(issue);\n });\n }\n });\n }\n}\nfunction getDefaultCamera(stage) {\n return {\n bottom: -1, top: 1, left: -1, right: 1, near: .1, far: 200, lookAt: Vector3D.from(0, 0, 0), up: Vector3D.j(), position: Vector3D.from(0, 0, 1), type: \"orthographic\",\n flags: [], stage\n };\n}\nfunction destroyTextures(...textures) {\n for (let tex of textures || []) {\n tex?.destroy();\n }\n}\nclass RendererClass {\n #stage;\n #canvas;\n #context;\n #renderables;\n #geometries;\n #materials;\n #looper;\n #textures;\n #config;\n #disabled;\n // interaction buffer\n #interactionBuffer;\n // interaction buffer underlying data\n #interaction;\n constructor(stage) {\n this.#renderables = new WeakMap();\n this.#geometries = new WeakMap();\n this.#materials = new WeakMap();\n this.#config = { enableValidation: false };\n this.#disabled = false;\n this._logError = (evt) => {\n const stage = this.#stage, logger = stage.logger;\n if (!Utils.isNull(logger)) {\n const error = 'error' in evt ? evt.error : evt;\n logger.log(Logging.LogLevel.Error, error.message, 'WebGPU');\n }\n };\n this.#rebuildingContext = true;\n /** Whether the renderer is affected by vertex or fragment modifiers.\n * When true, the renderer must provide updated time, cursor position and canvas size to the pipeline's bind groups.\n */\n this.#hasModifiers = false;\n const wrapper = (this.#stage = stage).stage;\n const canvas = document.createElement('canvas');\n canvas.id = P + '_3d_stage_' + Utils.uniqueCode();\n // cleanup\n wrapper.innerHTML = '';\n wrapper.appendChild(this.#canvas = canvas);\n // interaction stuff\n this.#interactionBuffer = ManagedBuffers.create(this.#interaction = {\n time: performance.now(), cursor: { x: 0, y: 0 }, resolution: { width: 0, height: 0 }\n });\n }\n _buildPassDescriptor({ multisample, format }) {\n const { context, device } = this.#context;\n const canvasTexture = context.getCurrentTexture();\n let textures = this.#textures;\n if (Utils.isNull(textures)) {\n textures = {};\n if (multisample) {\n const renderTex = device.createTexture({\n label: LABEL_PREFIX + 'render-texture',\n format: format ?? canvasTexture.format,\n usage: GPUTextureUsage.RENDER_ATTACHMENT,\n size: [canvasTexture.width, canvasTexture.height],\n sampleCount: 4,\n });\n textures.render = {\n texture: renderTex, view: renderTex.createView({ label: LABEL_PREFIX + 'render-texture-view' })\n };\n const depthTex = device.createTexture({\n label: LABEL_PREFIX + 'depth-texture',\n format: 'depth24plus',\n usage: GPUTextureUsage.RENDER_ATTACHMENT,\n size: [canvasTexture.width, canvasTexture.height],\n sampleCount: 4,\n });\n textures.depth = {\n texture: depthTex, view: depthTex.createView({ label: LABEL_PREFIX + 'depth-texture-view' })\n };\n }\n this.#textures = textures;\n }\n const { transparent, background } = this.#stage;\n const backColor = transparent ? { r: 0, g: 0, b: 0, a: 0 } : background ? (typeof background === 'string' ? Colors.parse(background) : background) : { r: 0, g: 0, b: 0, a: 1 };\n const bgColor = AdapterUtils.flattenVectorArray([backColor]);\n const canvasTexView = canvasTexture.createView({ label: LABEL_PREFIX + 'canvas-texture-view' });\n const colorAttachment = {\n view: canvasTexView,\n clearValue: bgColor,\n loadOp: 'clear',\n storeOp: 'store',\n };\n const passDescriptor = {\n colorAttachments: [colorAttachment]\n };\n if (multisample) {\n const renderTexView = textures.render.view;\n const depthTexView = textures.depth.view;\n passDescriptor.depthStencilAttachment = {\n view: depthTexView,\n depthClearValue: 1,\n depthLoadOp: 'clear',\n depthStoreOp: 'store',\n stencilClearValue: 0,\n stencilReadOnly: true,\n };\n // override\n colorAttachment.view = renderTexView;\n colorAttachment.resolveTarget = canvasTexView;\n }\n return passDescriptor;\n }\n ;\n _buildContext(canvas = this.#canvas, size = this.#stage.size) {\n size ??= canvas;\n let w = size.width;\n let h = size.height;\n const devicePixelRatio = 1; // window.devicePixelRatio;\n canvas.width = w * devicePixelRatio;\n canvas.height = h * devicePixelRatio;\n const context = canvas.getContext('webgpu');\n const textureFormat = navigator.gpu.getPreferredCanvasFormat();\n return { context, textureFormat };\n }\n _buildUpContext(device, adapter, context, format) {\n const { transparent } = this.#stage;\n context.configure({\n alphaMode: transparent ? 'premultiplied' : 'opaque',\n device,\n format,\n });\n this.#context = { device, adapter, canvas: this.#canvas, context, format };\n this.#rebuildingContext = false;\n }\n async init(config) {\n this.#config = config;\n const adapter = await navigator.gpu.requestAdapter();\n if (Utils.isNull(adapter)) {\n throw new Error('WebGPU adapter unavalable or disabled.');\n }\n const device = await adapter.requestDevice();\n if (Utils.isNull(adapter)) {\n throw new Error('WebGPU device unavalable or disabled.');\n }\n device.addEventListener('uncapturederror', this._logError);\n // set flag for shader modifiers presence, this will be used to determine whether to update the interaction buffer on each render call\n this.#hasModifiers = !Utils.isNull(config.modifiers?.version) && !Utils.isNull(config.modifiers)\n && (!Utils.isNull(config.modifiers.vertexInput) || !Utils.isNull(config.modifiers.vertexOutput) || !Utils.isNull(config.modifiers.fragment));\n const { context, textureFormat: format } = this._buildContext();\n this._buildUpContext(device, adapter, context, format);\n }\n #rebuildingContext;\n /** Whether the renderer is affected by vertex or fragment modifiers.\n * When true, the renderer must provide updated time, cursor position and canvas size to the pipeline's bind groups.\n */\n #hasModifiers;\n /**\n * Render procedure.\n */\n render(interaction) {\n if (this.#rebuildingContext || Utils.isNull(this.#looper) || !(this.#canvas.width > 0) || !(this.#canvas.height > 0)) {\n return;\n }\n const context = this.#context, device = context.device, \n // looper\n looper = this.#looper;\n // enable validation scope? (perf hog)\n const validationScope = this.#config?.enableValidation ?? false;\n if (this.#hasModifiers) {\n // update underlying interaction data, this will trigger buffer update\n Utils.extend(this.#interaction, interaction);\n }\n const multisample = true;\n const passDescriptor = this._buildPassDescriptor({ multisample });\n // rendering zone\n const commandEncoder = device.createCommandEncoder({ label: LABEL_PREFIX + 'renderer' });\n const pass = commandEncoder.beginRenderPass(passDescriptor);\n // loop\n looper.loop((mesh, camera, lights) => {\n if (mesh.item.hide) {\n // this code branching is NOT NEEDED ANYMORE,\n // remove it safely\n return false;\n }\n if (validationScope) {\n device.pushErrorScope('validation');\n }\n const renderables = [mesh, camera, ...lights];\n // inject here (pipeline options) any global rendering data (time, cursor, etc.) that may be needed by the shader modifiers\n const pipeline = RenderPipelines.create(context, renderables, { multisample: true, modifiers: this.#config.modifiers });\n // render\n pipeline.frame(pass, this.#interactionBuffer, ...renderables);\n if (validationScope) {\n device.popErrorScope().then(error => {\n if (error) {\n this._logError(error);\n }\n });\n }\n return true;\n });\n pass.end();\n device.queue.submit([commandEncoder.finish()]);\n }\n set disabled(v) {\n this.#disabled = v;\n }\n get disabled() {\n return this.#disabled;\n }\n raycast(pixel) {\n if (this.#rebuildingContext || Utils.isNull(this.#looper)) {\n return Promise.resolve([]);\n }\n const context = this.#context, device = context.device, looper = this.#looper;\n // enable validation scope? (perf hog)\n const validationScope = this.#config?.enableValidation ?? false;\n // rendering zone\n const raycaster = Raycasters.createColorPicking(context);\n raycaster.begin();\n // loop\n looper.loop((mesh, camera) => {\n if (mesh.item.hide) {\n // TODO: remove unwraps and move to nested loops\n // in order to centralize hidden renderable skip logic\n return false;\n }\n if (validationScope) {\n device.pushErrorScope('validation');\n }\n raycaster.frame(this.#interactionBuffer, mesh, camera);\n if (validationScope) {\n device.popErrorScope().then(error => {\n if (error) {\n this._logError(error);\n }\n });\n }\n return true;\n });\n return raycaster.end(pixel);\n }\n _disposeRenderableJustInCase(item) {\n const store = this.#renderables;\n if (store.has(item)) {\n store.get(item)?.destroy();\n store.delete(item);\n }\n }\n _createOrYieldRenderable(item, geometries = this.#geometries, materials = this.#materials) {\n item.stage ??= this.#stage;\n const store = this.#renderables;\n let found = store.get(item);\n if (Utils.isNull(found)) {\n store.set(item, found = RenderableBuffers.create(item, geometries));\n }\n return found;\n }\n _createOrYieldGeometry(item) {\n const store = this.#geometries;\n let found = store.get(item);\n if (Utils.isNull(found)) {\n store.set(item, found = ManagedBuffers.create(item));\n }\n return found;\n }\n _createOrYieldMaterial(item) {\n const store = this.#materials;\n let found = store.get(item);\n if (Utils.isNull(found)) {\n store.set(item, found = ManagedBuffers.create(item));\n }\n return found;\n }\n _unwrapBuffers(grp, accumulator) {\n accumulator ??= { meshes: [], lights: [], cameras: [], groups: [] };\n for (let itemBuffer of grp.children) {\n itemBuffer.item.stage ??= this.#stage;\n if (isMesh(itemBuffer.item)) {\n accumulator.meshes.push(itemBuffer);\n }\n if (isCamera(itemBuffer.item)) {\n accumulator.cameras.push(itemBuffer);\n }\n if (isLight(itemBuffer.item)) {\n accumulator.lights.push(itemBuffer);\n }\n if (isGroup(itemBuffer.item)) {\n accumulator.groups.push(itemBuffer);\n this._unwrapBuffers(itemBuffer, accumulator);\n }\n }\n return accumulator;\n }\n ;\n _update(array) {\n const groupBuffers = [];\n const meshBuffers = [];\n const lightBuffers = [];\n const factory = i => this._createOrYieldRenderable(i);\n let camera;\n for (let item of array) {\n if (item.hide) {\n // remove stored renderable just in case\n this._disposeRenderableJustInCase(item);\n continue;\n }\n // ensure stage\n item.stage ??= this.#stage;\n // groups\n if (isGroup(item)) {\n const g = item;\n if (g.flags.includes(StalePropertyFlag.Children)) {\n this.#renderables.delete(g);\n }\n groupBuffers.push(factory(g));\n }\n // meshes\n if (isMesh(item) && item.geometry) {\n // build pipelines based on provided element wrappers (cached buffers)\n this._createOrYieldGeometry(item.geometry);\n if (!Utils.isNull(item.material)) {\n this._createOrYieldMaterial(item.material);\n }\n meshBuffers.push(factory(item));\n }\n // lights\n if (isLight(item)) {\n lightBuffers.push(factory(item));\n }\n if (isCamera(item)) {\n // pick the first only\n camera ??= item;\n }\n }\n // find first active camera\n camera ??= getDefaultCamera(this.#stage);\n const cameraBuffer = factory(camera);\n let accumulator = {\n meshes: meshBuffers, lights: lightBuffers, cameras: [cameraBuffer], groups: groupBuffers\n };\n for (let groupBuffer of groupBuffers) {\n accumulator = this._unwrapBuffers(groupBuffer, accumulator);\n }\n // destroy leftovers\n this.#looper?.items.meshes.forEach(buffer => {\n if (!meshBuffers.includes(buffer)) {\n buffer.destroy();\n }\n });\n this.#looper = new RenderLooper(accumulator);\n }\n update(...items) {\n this._update(Array.from(items));\n }\n dispose() {\n this.#looper = null;\n if (this._disposeContext()) {\n const { device } = this.#context;\n device.removeEventListener('uncapturederror', this._logError);\n device.destroy;\n }\n }\n _disposeContext() {\n const ctx = this.#context;\n if (Utils.isNull(ctx)) {\n return false;\n }\n // dispose associated raycasters, if any\n Raycasters.dispose(ctx);\n // dispose associated pipelines, if any\n RenderPipelines.dispose(ctx);\n // dispose textures\n const textures = this.#textures;\n this.#textures = null;\n if (!Utils.isNull(textures)) {\n const { render, depth } = textures;\n destroyTextures(render?.texture, depth?.texture);\n }\n // dispose context\n ctx.context.unconfigure();\n return true;\n }\n resize(size) {\n this.#rebuildingContext = true;\n if (this._disposeContext()) {\n const { device, adapter } = this.#context;\n const { context, textureFormat: format } = this._buildContext(this.canvas, size);\n this._buildUpContext(device, adapter, context, format);\n // interaction\n if (this.#hasModifiers) {\n Utils.extend(this.#interaction, { resolution: size });\n }\n }\n }\n get canvas() {\n return this.#canvas;\n }\n}\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElementUtils, CustomElement, P, Watch, PropertyConverters, PropertyChangeEvent, PropertyChangeEventName, Debounce, Utils, Logging, Components } from '@pacem/pacem-core';\nimport { Strings } from '@pacem/pacem-foundation';\nimport { Pacem3DAdapterElement, StalePropertyFlag } from '../../types';\nimport { Renderers, WebGPUIssueCause } from './renderer';\n//namespace Pacem.Components.Drawing3D {\nconst WEBGPU_RAYCAST_CALLBACK_PROP = 'WebGPURaycastCallback';\nconst WEBGPU_RAYCAST_PIXEL_PROP = 'WebGPURaycastPixel';\nconst GETVAL = CustomElementUtils.getAttachedPropertyValue, SETVAL = CustomElementUtils.setAttachedPropertyValue, DELVAL = CustomElementUtils.deleteAttachedPropertyValue;\nlet Pacem3DWgslScriptElement = class Pacem3DWgslScriptElement extends Components.PacemItemElement {\n findContainer() {\n return CustomElementUtils.findAncestor(this, n => n instanceof Pacem3DWebgpuAdapterElement);\n }\n #version = '';\n get version() {\n return this.#version;\n }\n #observer = new MutationObserver(() => {\n this.wgsl = this.textContent;\n });\n viewActivatedCallback() {\n super.viewActivatedCallback();\n this.wgsl = this.textContent;\n this.#observer.observe(this, { characterData: true });\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (name === 'wgsl') {\n this._computeVersion(val);\n }\n }\n _computeVersion(wgsl = this.wgsl) {\n Strings.hash(wgsl).then(v => {\n if (v !== this.#version) {\n const old = this.#version;\n const val = v;\n this.#version = val;\n const evt = new PropertyChangeEvent({ propertyName: 'version', oldValue: old, currentValue: val, firstChange: Utils.isNullOrEmpty(old) });\n this.dispatchEvent(evt);\n }\n });\n }\n disconnectedCallback() {\n this.#observer.disconnect();\n super.disconnectedCallback();\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], Pacem3DWgslScriptElement.prototype, \"type\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], Pacem3DWgslScriptElement.prototype, \"wgsl\", void 0);\nPacem3DWgslScriptElement = __decorate([\n CustomElement({ tagName: P + '-3d-wgsl-script' })\n], Pacem3DWgslScriptElement);\nexport { Pacem3DWgslScriptElement };\nlet Pacem3DWebgpuAdapterElement = class Pacem3DWebgpuAdapterElement extends Pacem3DAdapterElement {\n constructor() {\n super(...arguments);\n this.#items = [];\n this._scriptVersionChangeHandler = (evt) => {\n const { propertyName: name } = evt.detail;\n if (name === 'version') {\n this._parseWgslModifiers(evt.detail.currentValue);\n }\n };\n this.#scenes = new Set();\n this.#renderers = new Map();\n this.#supported = true;\n this.#active = true;\n this.#sceneToUpdate = new WeakMap();\n }\n invalidateSize(stage, size = stage.size) {\n const renderer = this._ensureRenderer(stage);\n renderer?.resize(size);\n }\n #items;\n get items() {\n return this.#items;\n }\n register(item) {\n const items = this.#items;\n if (item instanceof Pacem3DWgslScriptElement && !items.includes(item)) {\n item.addEventListener(PropertyChangeEventName, this._scriptVersionChangeHandler, false);\n items.push(item);\n this._parseWgslModifiers(this.modifiers?.version);\n return true;\n }\n return false;\n }\n unregister(item) {\n const items = this.#items;\n const ndx = items.indexOf(item);\n if (ndx >= 0) {\n item.removeEventListener(PropertyChangeEventName, this._scriptVersionChangeHandler, false);\n items.splice(ndx, 1);\n this._parseWgslModifiers(this.modifiers?.version);\n return true;\n }\n return false;\n }\n #scenes;\n #renderers;\n #supported;\n #active;\n get supported() {\n return this.#supported;\n }\n get active() {\n return this.#active;\n }\n _webGPUNotSupported(issue) {\n if (this.#supported && issue.cause === WebGPUIssueCause.NotSupported) {\n this.#supported = false;\n this.dispatchEvent(new PropertyChangeEvent({ propertyName: 'supported', oldValue: null, currentValue: false }));\n }\n if (this.#active) {\n this.#active = false;\n this.dispatchEvent(new PropertyChangeEvent({ propertyName: 'active', oldValue: null, currentValue: false }));\n }\n }\n initialize(scene) {\n const set = this.#renderers;\n const scenes = this.#scenes;\n if (!scenes.has(scene)) {\n scenes.add(scene);\n }\n return Renderers.create(scene, { enableValidation: this.enableValidation ?? false, modifiers: this.modifiers })\n .then(renderer => {\n set.get(scene)?.update( /* empty */);\n // update dictionary with the actual renderer\n set.set(scene, renderer);\n // assign datasource immediately\n this._updatePipeline(scene);\n return renderer.canvas;\n }, (issue) => {\n this.log(Logging.LogLevel.Error, issue.message);\n this._webGPUNotSupported(issue);\n return null;\n });\n }\n _parseWgslModifiers(val) {\n const scripts = this.#items, vertexGeometryScript = scripts.find(a => a.type == 'vertex-input'), vertexOutputScript = scripts.find(a => a.type == 'vertex-output'), fragmentScript = scripts.find(a => a.type == 'fragment');\n const vertexInput = vertexGeometryScript?.wgsl, vertexOutput = vertexOutputScript?.wgsl, fragment = fragmentScript?.wgsl;\n this.modifiers = { vertexInput, vertexOutput, fragment, version: val };\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (first) {\n return;\n }\n switch (name) {\n case 'modifiers':\n case 'enableValidation':\n // reinitialize\n this._reinitialize();\n break;\n }\n }\n disconnectedCallback() {\n const set = this.#renderers;\n for (let [_, renderer] of set) {\n renderer?.dispose();\n }\n set.clear();\n this.#scenes.clear();\n super.disconnectedCallback();\n }\n dispose(scene) {\n const renderers = this.#renderers, scenes = this.#scenes;\n ;\n if (renderers.has(scene)) {\n renderers.get(scene)?.dispose();\n renderers.delete(scene);\n }\n if (scenes.has(scene)) {\n scenes.delete(scene);\n }\n }\n _reinitialize() {\n for (let scene of this.#scenes.values()) {\n // rebuild renderer with new config in association to scene\n this.initialize(scene);\n }\n }\n _ensureRenderer(scene) {\n const set = this.#renderers;\n return set.get(scene);\n }\n _updatePipeline(scene) {\n const renderer = this._ensureRenderer(scene);\n renderer?.update(...scene.datasource);\n }\n #sceneToUpdate;\n /**\n * Called when scene datasource changes.\n * @param scene\n */\n render(scene) {\n // do not render hidden stages\n const width = scene.size?.width, height = scene.size?.height;\n if (!(width > 0) || !(height > 0)) {\n return;\n }\n // retrieve stage renderer\n const renderer = this._ensureRenderer(scene);\n if (Utils.isNull(renderer)) {\n return;\n }\n if (this.#sceneToUpdate.has(scene)) {\n this.#sceneToUpdate.delete(scene);\n this._itemsChangedExec(scene);\n }\n // draw\n const pixel = GETVAL(scene, WEBGPU_RAYCAST_PIXEL_PROP);\n renderer.render({ cursor: pixel, time: performance.now(), resolution: { width, height } });\n // raycast, just in case\n if (!scene.interactive) {\n return;\n }\n const callback = GETVAL(scene, WEBGPU_RAYCAST_CALLBACK_PROP);\n if (Utils.isNullOrEmpty(callback)) {\n return;\n }\n if (Utils.isNullOrEmpty(pixel)) {\n callback(null);\n return;\n }\n // draw again\n renderer.raycast(pixel).then(array => {\n if (Utils.isNullOrEmpty(array)) {\n callback(null);\n }\n else {\n const retval = {\n object: array[0], point: null\n };\n callback(retval);\n }\n });\n }\n snapshot(scene, background, type, quality) {\n const renderers = this.#renderers;\n if (!renderers.has(scene)) {\n return Promise.resolve(null);\n }\n const { canvas } = renderers.get(scene);\n const jpeg = !Utils.isNullOrEmpty(background), mime = type ?? (jpeg ? 'image/jpeg' : null), compression = quality ?? (jpeg ? .9 : null);\n return new Promise((resolve, _) => {\n this.render(scene);\n Utils.snapshotElement(canvas, background, mime, compression).then(resolve);\n });\n }\n raycast(stage, point, size, callback) {\n SETVAL(stage, WEBGPU_RAYCAST_CALLBACK_PROP, callback);\n if (point.x < 0 || point.y < 0 || point.x >= size.width || point.y >= size.height) {\n DELVAL(stage, WEBGPU_RAYCAST_PIXEL_PROP);\n }\n else {\n SETVAL(stage, WEBGPU_RAYCAST_PIXEL_PROP, point);\n }\n }\n _itemsChangedExec(stage) {\n this._updatePipeline(stage);\n }\n _itemsChanged(stage, _) {\n this.#sceneToUpdate.set(stage, true);\n }\n addItem(stage, item) {\n this._itemsChanged(stage, item);\n }\n removeItem(stage, item) {\n this._itemsChanged(stage, item);\n }\n updateItem(stage, item) {\n // if 'hide' property has changed or 'children' property (for groups)\n // then there's need to regenerate the tree view (camera switch, more/less meshes, ...)\n if (Utils.isNull(item)\n || item.flags.indexOf(StalePropertyFlag.Visibility) >= 0\n || item.flags.indexOf(StalePropertyFlag.Children) >= 0) {\n this._itemsChanged(stage, item);\n }\n }\n zoomFit(stage, ...items) {\n // TODO: implement on the renderer side\n return Promise.resolve();\n }\n project(stage, point3D) {\n // TODO: implement on the renderer side\n return { x: 0, y: 0 };\n }\n getScene(stage) {\n // no 3rd-party/proprietary scene objects to provide.\n return stage;\n }\n};\n__decorate([\n Debounce(100)\n], Pacem3DWebgpuAdapterElement.prototype, \"_parseWgslModifiers\", null);\n__decorate([\n Watch({ emit: false })\n], Pacem3DWebgpuAdapterElement.prototype, \"modifiers\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Boolean })\n], Pacem3DWebgpuAdapterElement.prototype, \"enableValidation\", void 0);\nPacem3DWebgpuAdapterElement = __decorate([\n CustomElement({ tagName: P + '-3d-webgpu-adapter' })\n], Pacem3DWebgpuAdapterElement);\nexport { Pacem3DWebgpuAdapterElement };\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, P, Watch, PropertyConverters, Utils, CustomEventUtils, avoidHandler, Behaviors, PropertyChangeEventName } from '@pacem/pacem-core';\nimport { Geometry } from '@pacem/pacem-numerical';\nimport { isCamera, StalePropertyFlag } from '../../../types';\nimport { TAG_MIDDLE_NAME } from '../../../constants';\nimport { BooleanOrNumberConverter } from '../../../converters';\n//namespace Pacem.Components.Drawing3D {\nconst Vector3D = Geometry.LinearAlgebra.Vector3D;\nconst Matrix3D = Geometry.LinearAlgebra.Matrix3D;\nconst Quaternion = Geometry.LinearAlgebra.Quaternion;\nconst Spherical = Geometry.LinearAlgebra.Spherical;\nfunction findCameraStage(element) {\n if (isCamera(element)) {\n return element.stage;\n }\n return null;\n}\nconst ROTATION_FACTOR = 1, ZOOM_FACTOR = 1, FRICTION_FACTOR = .05, EPSILON = 0.001;\nconst DEFAULT_CONFIGURATION = {\n maxAzimuth: 180, minAzimuth: -180, inertia: false, maxPolar: Infinity, minPolar: -Infinity,\n zoom: { enabled: true }, pan: { enabled: true, button: 2 }, rotation: { enabled: true, button: 0 }\n};\nexport class OrbitCameraBehavior {\n constructor(item, _config) {\n this._config = _config;\n /** State of the current configuration, obtained from the interaction inputs. */\n this._input = {\n /** Zoom/scale */\n rho: 0,\n /** Azimuth (rotation around x axis in webgpu) */\n theta: 0,\n /** Polar (rotation around y axis in webgpu) */\n phi: 0,\n /** pan/offset x*/\n x: 0,\n /** pan/offset y*/\n y: 0,\n };\n /** Sibling state of {@link _input} that comes helpful when inertia is involved. */\n this._progress = {\n rho: 0,\n theta: 0,\n phi: 0,\n x: 0,\n y: 0,\n };\n this._startHandler = (evt) => {\n const { rotation, pan } = this._config;\n const isMouse = evt.pointerType === 'mouse';\n const rotating = rotation.enabled && isMouse && evt.button === rotation.button && CustomEventUtils.matchModifiers(evt, rotation.modifiers);\n const panning = pan.enabled && isMouse && evt.button === pan.button && CustomEventUtils.matchModifiers(evt, pan.modifiers);\n if (!rotating && !panning) {\n return;\n }\n this.#rotating = rotating;\n if (this.#panning = panning) {\n // build current state from the current camera configuration\n this._currentState = OrbitCameraBehavior._buildState(this._camera);\n // reset pan offsets\n Utils.extend(this._input, Vector3D.zero());\n this._progress.x = this._progress.y = 0;\n }\n avoidHandler(evt);\n window.addEventListener('pointerup', this._endHandler, false);\n window.addEventListener('pointermove', this._moveHandler, false);\n window.addEventListener('contextmenu', this._avoidHandler, false);\n };\n this._avoidHandler = (evt) => avoidHandler(evt);\n this._endHandler = (evt) => {\n avoidHandler(evt);\n // delay the listener removals a bit (~frame)\n window.setTimeout(() => {\n window.removeEventListener('pointerup', this._endHandler);\n window.removeEventListener('pointermove', this._moveHandler);\n window.removeEventListener('contextmenu', this._avoidHandler);\n }, 20);\n };\n this._zoomHandler = (evt) => {\n const { zoom } = this._config;\n const zooming = zoom.enabled && CustomEventUtils.matchModifiers(evt, zoom.modifiers);\n if (!zooming) {\n return;\n }\n avoidHandler(evt);\n const coords = this._input;\n coords.rho -= Math.sign(evt.deltaY);\n };\n this._moveHandler = (evt) => {\n avoidHandler(evt);\n const { height, width } = this._scene.size;\n const coords = this._input;\n const size = Math.min(height, width);\n if (this.#rotating) {\n // rotation\n const f0 = -ROTATION_FACTOR * 360 / size;\n const { phi, theta } = coords;\n const { maxPolar, minPolar, maxAzimuth, minAzimuth } = this._config;\n coords.phi = (phi + evt.movementX * f0).clamp(minPolar, maxPolar);\n coords.theta = (theta + evt.movementY * f0).clamp(minAzimuth, maxAzimuth);\n }\n else if (this.#panning) {\n // pan\n const f0 = this._currentState.radius / size;\n coords.x += -evt.movementX * f0;\n coords.y += evt.movementY * f0;\n }\n };\n this._renderHandler = (_) => {\n this._update();\n };\n const scene = this._scene = (this._camera = item).stage;\n this._initialState = this._currentState = OrbitCameraBehavior._buildState(item);\n const canvas = this._canvas = scene.stage;\n canvas.addEventListener('pointerdown', this._startHandler, false);\n canvas.addEventListener('wheel', this._zoomHandler, { passive: false });\n scene.addEventListener('render', this._renderHandler, false);\n }\n static _buildState(camera) {\n const vector = Vector3D.subtract(camera.position, camera.lookAt);\n const radius = Vector3D.mag(vector);\n return { target: camera.lookAt, versor: Vector3D.unit(vector), up: camera.up, radius, position: camera.position };\n }\n /**\n * Tries to attach a new {@link OrbitCameraBehavior} to the provided element, if the element is a proper renderable and it is ready.\n * @param element\n * @returns\n */\n static tryAttach(element, config) {\n config ??= DEFAULT_CONFIGURATION;\n const canvas = findCameraStage(element)?.stage;\n if (!Utils.isNull(canvas)) {\n const { position, lookAt } = element;\n if (Utils.isNull(position) || Utils.isNull(lookAt) || Vector3D.areClose(position, lookAt)) {\n return null;\n }\n return new OrbitCameraBehavior(element, config);\n }\n else {\n return null;\n }\n }\n get configuration() {\n return this._config;\n }\n set configuration(v) {\n this._config = v;\n }\n #panning;\n #rotating;\n _getSafeAzimuth({ theta }) {\n return OrbitCameraBehavior._modAngle(theta);\n }\n _getSafePolar({ phi }) {\n return OrbitCameraBehavior._modAngle(phi);\n }\n static _modAngle(deg) {\n while (deg < 0) {\n deg += 360;\n }\n return deg % 360;\n }\n static _getViewXYZ(state) {\n const { versor, up: initUp } = state;\n const right = Vector3D.cross(versor, initUp);\n const up = Vector3D.cross(right, versor);\n Vector3D.normalize(right);\n Vector3D.normalize(up);\n return { right, up, versor };\n }\n #updating;\n _update() {\n if (this.#updating) {\n return;\n }\n this.#updating = true;\n const camera = this._camera;\n const { radius, versor, target: initTarget, up: initUp } = this._initialState;\n const { target: trackedLookAt } = this._currentState;\n const { theta, phi, rho, x, y } = this._input;\n const progress = this._progress;\n const { theta: theta_, phi: phi_, rho: rho_, x: x_, y: y_ } = progress;\n const rotated = Math.abs(phi_ - phi) > EPSILON || Math.abs(theta_ - theta) > EPSILON, zoomed = Math.abs(rho_ - rho) > EPSILON, panned = Math.abs(x - x_) > EPSILON || Math.abs(y - y_) > EPSILON;\n if (zoomed || rotated || panned) {\n const inertia = typeof this._config.inertia === 'boolean' ? (this._config.inertia ? FRICTION_FACTOR : 0) : this._config.inertia;\n const inertiaSpecified = inertia > 0 && inertia < 1;\n const { right, up } = OrbitCameraBehavior._getViewXYZ(this._initialState);\n // setup position\n let newPosition = initTarget;\n let newUp = initUp;\n let newLookAt = trackedLookAt;\n //if (zoomed) { 2\n let rho0 = rho_;\n if (inertiaSpecified) {\n rho0 += (rho - rho_) * inertia;\n }\n else {\n rho0 = rho;\n }\n progress.rho = rho0;\n const scale = Math.pow(.95, rho0 * ZOOM_FACTOR);\n const zoom = Vector3D.scale(versor, -scale * radius);\n newPosition = Vector3D.add(newPosition, zoom);\n //}\n //if (rotated) { 3\n let phi0 = phi_;\n let theta0 = theta_;\n if (inertiaSpecified) {\n phi0 += (phi - phi_) * inertia;\n theta0 += (theta - theta_) * inertia;\n }\n else {\n phi0 = phi;\n theta0 = theta;\n }\n const PHI = this._getSafePolar({ phi: progress.phi = phi0 });\n const THETA = this._getSafeAzimuth({ theta: progress.theta = theta0 });\n // pivot of the rotation matrix should be the center of the bounding sphere\n const pivot = Vector3D.negate(initTarget);\n let m = Matrix3D.translate(Matrix3D.identity(), pivot);\n const qy = Quaternion.fromAxisAngle(up, PHI);\n const qx = Quaternion.fromAxisAngle(right, THETA);\n const rot = Matrix3D.multiply(Quaternion.toRotationMatrix(qx), Quaternion.toRotationMatrix(qy));\n m = Matrix3D.multiply(m, rot);\n m = Matrix3D.translate(m, Vector3D.negate(pivot));\n newPosition = Matrix3D.transform(newPosition, m);\n newUp = Matrix3D.transform(newUp, Matrix3D.clone(m, m0 => { m0.offsetX = m0.offsetY = m0.offsetZ = 0; }));\n //}\n //if (panned){ 1\n const x1 = x_, y1 = y_;\n let x0 = x1, y0 = y1;\n if (inertiaSpecified) {\n x0 += (x - x1) * inertia;\n y0 += (y - y1) * inertia;\n }\n else {\n x0 = x;\n y0 = y;\n }\n progress.x = x0;\n progress.y = y0;\n const { right: currentRight, up: currentUp } = OrbitCameraBehavior._getViewXYZ(this._currentState);\n const r = Vector3D.scale(currentRight, x0), u = Vector3D.scale(currentUp, y0);\n const offset = Vector3D.add(r, u);\n newLookAt = Vector3D.add(trackedLookAt, offset);\n camera.lookAt = newLookAt;\n camera.position = newPosition; // Vector3D.add(newPosition, Vector3D.subtract(initTarget, newLookAt));\n camera.up = newUp;\n // notify something has changed about the target renderable\n camera.flags.push(StalePropertyFlag.Camera);\n }\n this.#updating = false;\n }\n /** Detaches and removes handlers and resources. */\n dispose() {\n const canvas = this._canvas, scene = this._scene;\n if (!Utils.isNull(canvas)) {\n canvas.removeEventListener('pointerdown', this._startHandler);\n canvas.removeEventListener('wheel', this._zoomHandler);\n }\n scene.removeEventListener('render', this._renderHandler, false);\n }\n}\nlet PacemOrbitCameraBehaviorElement = class PacemOrbitCameraBehaviorElement extends Behaviors.PacemBehavior {\n constructor() {\n super(...arguments);\n this.#map = new Map();\n this._readyHandler = (evt) => {\n if (evt.detail.propertyName === 'isReady' && evt.detail.currentValue === true) {\n const element = evt.currentTarget;\n element.removeEventListener(PropertyChangeEventName, this._readyHandler);\n this._decorateCore(element);\n }\n };\n }\n #map;\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'maxAzimuth':\n case 'minAzimuth':\n case 'inertia':\n case 'zoomControl':\n case 'panControl':\n case 'rotationControl':\n const config = this._buildConfig();\n const items = this.#map;\n for (let tr of items.values()) {\n tr.configuration = config;\n }\n break;\n }\n }\n disconnectedCallback() {\n const items = this.#map;\n for (let tr of items.values()) {\n tr.dispose();\n }\n items.clear();\n super.disconnectedCallback();\n }\n _buildConfig() {\n return Utils.extend({}, DEFAULT_CONFIGURATION, {\n maxAzimuth: this.maxAzimuth ?? Infinity,\n minAzimuth: this.minAzimuth ?? -Infinity,\n minPolar: this.minPolar ?? -Infinity,\n maxPolar: this.maxPolar ?? Infinity,\n inertia: this.inertia ?? false,\n zoom: this.zoomControl ?? DEFAULT_CONFIGURATION.zoom,\n pan: this.panControl ?? DEFAULT_CONFIGURATION.pan,\n rotation: this.rotationControl ?? DEFAULT_CONFIGURATION.rotation,\n });\n }\n _decorateCore(element) {\n const behavior = OrbitCameraBehavior.tryAttach(element, this._buildConfig());\n if (!Utils.isNull(behavior)) {\n this.#map.set(element, behavior);\n }\n }\n decorate(element) {\n if (element.isConnected) {\n this._decorateCore(element);\n }\n else {\n element.addEventListener(PropertyChangeEventName, this._readyHandler, false);\n }\n }\n undecorate(element) {\n const map = this.#map;\n if (map.has(element)) {\n map.get(element).dispose();\n map.delete(element);\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemOrbitCameraBehaviorElement.prototype, \"maxAzimuth\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemOrbitCameraBehaviorElement.prototype, \"maxPolar\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemOrbitCameraBehaviorElement.prototype, \"minAzimuth\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemOrbitCameraBehaviorElement.prototype, \"minPolar\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemOrbitCameraBehaviorElement.prototype, \"zoomControl\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemOrbitCameraBehaviorElement.prototype, \"rotationControl\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemOrbitCameraBehaviorElement.prototype, \"panControl\", void 0);\n__decorate([\n Watch({ emit: false, converter: BooleanOrNumberConverter })\n], PacemOrbitCameraBehaviorElement.prototype, \"inertia\", void 0);\nPacemOrbitCameraBehaviorElement = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-orbit-camera' })\n], PacemOrbitCameraBehaviorElement);\nexport { PacemOrbitCameraBehaviorElement };\n","//namespace Pacem.Components.Drawing3D {\n/** @deprecated*/\nexport class Pacem3DDetector {\n constructor() {\n this._detected = {\n supported: false, info: {}\n };\n let cvs = document.createElement('canvas');\n let contextNames = ['webgl', 'experimental-webgl', 'moz-webgl', 'webkit-3d'];\n let ctx;\n let getParam = function (str) {\n if (!str)\n return undefined;\n return ctx.getParameter(str);\n };\n // addLine\n let addLine = (section, name, value) => {\n let detected = this._detected;\n var info = detected.info[section] = detected.info[section] || {};\n name = name.replace(/[^\\w]+/g, '');\n name = name.substring(0, 1).toLowerCase() + name.substring(1);\n info[name] = value;\n };\n if (navigator.userAgent.indexOf('MSIE') >= 0) {\n try {\n ctx = window['WebGLHelper'].CreateGLContext(cvs, 'canvas');\n }\n catch (e) { }\n }\n else {\n for (var i = 0; i < contextNames.length; i++) {\n try {\n ctx = cvs.getContext(contextNames[i]);\n if (ctx) {\n addLine('main', 'Context Name', contextNames[i]);\n break;\n }\n }\n catch (e) { }\n }\n }\n this._detected.supported = !!ctx;\n addLine('main', 'Platform', navigator.platform);\n addLine('main', 'Agent', navigator.userAgent);\n if (ctx) {\n addLine('main', 'Vendor', getParam(ctx.VENDOR));\n addLine('main', 'Version', getParam(ctx.VERSION));\n addLine('main', 'Renderer', getParam(ctx.RENDERER));\n addLine('main', 'Shading Language Version', getParam(ctx.SHADING_LANGUAGE_VERSION));\n addLine('bits', 'Rgba Bits', getParam(ctx.RED_BITS) + ', ' + getParam(ctx.GREEN_BITS) + ', ' + getParam(ctx.BLUE_BITS) + ', ' + getParam(ctx.ALPHA_BITS));\n addLine('bits', 'Depth Bits', getParam(ctx.DEPTH_BITS));\n addLine('shader', 'Max Vertex Attribs', getParam(ctx.MAX_VERTEX_ATTRIBS));\n addLine('shader', 'Max Vertex Texture Image Units', getParam(ctx.MAX_VERTEX_TEXTURE_IMAGE_UNITS));\n addLine('shader', 'Max Varying Vectors', getParam(ctx.MAX_VARYING_VECTORS));\n addLine('shader', 'Max Uniform Vectors', getParam(ctx.MAX_VERTEX_UNIFORM_VECTORS));\n addLine('tex', 'Max Combined Texture Image Units', getParam(ctx.MAX_COMBINED_TEXTURE_IMAGE_UNITS));\n addLine('tex', 'Max Texture Size', getParam(ctx.MAX_TEXTURE_SIZE));\n addLine('tex', 'Max Cube Map Texture Size', getParam(ctx.MAX_CUBE_MAP_TEXTURE_SIZE));\n addLine('tex', 'Num. Compressed Texture Formats', getParam(ctx.COMPRESSED_TEXTURE_FORMATS));\n addLine('misc', 'Max Render Buffer Size', getParam(ctx.MAX_RENDERBUFFER_SIZE));\n addLine('misc', 'Max Viewport Dimensions', getParam(ctx.MAX_VIEWPORT_DIMS));\n addLine('misc', 'Aliased Line Width Range', getParam(ctx.ALIASED_LINE_WIDTH_RANGE));\n addLine('misc', 'Aliased Point Size Range', getParam(ctx.ALIASED_POINT_SIZE_RANGE));\n addLine('misc', 'Supported Extensions', ctx.getSupportedExtensions() || []);\n }\n }\n get info() {\n return this._detected.info;\n }\n get supported() {\n return this._detected.supported;\n }\n}\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { Transformer } from '@pacem/pacem-core';\nimport { Point } from '@pacem/pacem-foundation';\nimport { MeshGeometry } from '../geometry';\nimport { Point3DConverter } from '../converters';\n//namespace Pacem.Drawing3D {\nclass OBJParser {\n static parse(content) {\n // vertices\n const vertices = [];\n const vParser = /^v((\\s+-?[\\d\\.]+){3})/gm;\n let arr = vParser.exec(content);\n while (arr && arr.length) {\n vertices.push(Point3DConverter.convert(arr[1]));\n arr = vParser.exec(content);\n }\n // uvmap\n const vt = [];\n const tParser = /^vt((\\s+-?[\\d\\.]+){2})/gm;\n arr = tParser.exec(content);\n while (arr && arr.length) {\n vt.push(Point.parse(arr[1]));\n arr = tParser.exec(content);\n }\n // normals\n const vn = [];\n const nParser = /^vn((\\s+-?[\\d\\.]+){3})/gm;\n arr = nParser.exec(content);\n while (arr && arr.length) {\n vn.push(Point3DConverter.convert(arr[1]));\n arr = nParser.exec(content);\n }\n const normals = [];\n const uv = [];\n const positions = [];\n const fParser = /^f((\\s+([\\d]+\\/[\\d]+\\/[\\d]+)){3,})/gm;\n arr = fParser.exec(content);\n while (arr && arr.length) {\n const fjParser = /([\\d]+)\\/([\\d]+)\\/([\\d]+)/g;\n const face = arr[1];\n let jArr = fjParser.exec(face);\n let jIndex = 0;\n var vIndex0, tIndex0, nIndex0;\n var vIndex, tIndex, nIndex;\n while (jArr && jArr.length) {\n if (jIndex > 2) {\n // 4+ vertex-face\n // but mesh only allows triangluar faces\n // re-add(0)\n positions.push(vIndex0);\n uv.push(vt[tIndex0]);\n normals.push(vn[nIndex0]);\n // re-add(last)\n positions.push(vIndex);\n uv.push(vt[tIndex]);\n normals.push(vn[nIndex]);\n }\n // OBJ indexes are 1-based\n vIndex = parseInt(jArr[1]) - 1;\n tIndex = parseInt(jArr[2]) - 1;\n nIndex = parseInt(jArr[3]) - 1;\n positions.push(vIndex);\n uv.push(vt[tIndex]);\n normals.push(vn[nIndex]);\n if (jIndex === 0) {\n vIndex0 = vIndex;\n tIndex0 = tIndex;\n nIndex0 = nIndex;\n }\n jIndex++;\n jArr = fjParser.exec(face);\n }\n // loop\n arr = fParser.exec(content);\n }\n // faces\n return new MeshGeometry(vertices, positions, uv, normals);\n }\n}\nclass Parser3D {\n static parseGeometry(content, type) {\n switch (type.toLowerCase()) {\n case 'obj':\n return OBJParser.parse(content);\n default:\n throw new Error(`Type '${type}' is not supported.`);\n }\n }\n}\n__decorate([\n Transformer('parse3D')\n], Parser3D, \"parseGeometry\", null);\n","import { DeepMerger } from '@pacem/pacem-foundation';\nimport * as Output from './index';\nDeepMerger.merge(Output);\n"],"names":["Point3DConverter","convert","attr","Geometry","LinearAlgebra","Vector3D","parse","convertBack","prop","x","y","z","Point3DOrNumberConverter","arr","parseAsNumericalArray","throwErr","Error","Utils","isNullOrEmpty","length","from","v","QuaternionConverter","Quaternion","w","BooleanOrNumberConverter","toString","TAG_MIDDLE_NAME","DEG2RAD","Math","PI","__decorate","decorators","target","key","desc","d","c","arguments","r","Object","getOwnPropertyDescriptor","Reflect","decorate","i","defineProperty","Pacem3DElement","Components","PacemItemsContainerElement","constructor","super","this","_itemPropertyChangeHandler","evt","renderable","adapter","updateItem","flags","splice","_clickHandler","me","interactive","isNull","_lastHitResult","type","replace","hit","object","point","_itemDispatch","_hitTestCallback","result","obj","last","pt","_moveHandler","rect","_resizer","currentSize","pixel","pageX","left","pageY","top","raycast","_resizeHandler","oldSize","size","detail","height","width","invalidateSize","dispatchEvent","ResizeEvent","validate","item","RenderableElement","stage","_container","scene","getScene","register","retval","_add","addEventListener","PropertyChangeEventName","unregister","removeEventListener","_erase","_refreshDatasource","val","datasource","undefined","_buildUpDatasourceFromDOM","items","slice","addItem","removeItem","_initializeAdapter","old","Promise","resolve","reject","forEach","initialize","then","_","e","log","Logging","LogLevel","propertyChangedCallback","name","first","render","viewActivatedCallback","container","resizer","offset","dragArgs","originalEvent","evtType","Event","m","RenderableEvent","DragEvent","cancelable","UI","DragDropEventType","Init","Drag","itemevt","prevent","EventTarget","evnt","defaultPrevented","disconnectedCallback","handle","stop","deepUpdate","now","performance","Animations","Timer","run","_doRender","disabled","CustomEvent","ViewChild","PCSS","prototype","P","Watch","emit","converter","PropertyConverters","Boolean","String","Element","Json","CustomElement","tagName","shadow","Defaults","USE_SHADOW_ROOT","template","StalePropertyFlag","isStage","isRenderable","isUi3DObject","isCamera","isPerspectiveCamera","isOrthographicCamera","isLight","isMesh","isGeometry","isArray","positions","isMeshGeometry","triangleIndices","normals","textureCoordinates","isGroup","computeSharpVertexNormals","geometry","indices","RangeError","j","u","normal","computePlaneNormal","push","a","b","vAB","subtract","vAC","orthogonal","cross","unit","UI3DEvent","CustomUIEvent","eventInit","args","p","bubbles","isInteraction","Constants","OBJECT_SELECTOR","LIGHT_SELECTOR","PERSPECTIVE_CAMERA_SELECTOR","ORTHO_CAMERA_SELECTOR","MESH_SELECTOR","GROUP_SELECTOR","DEFAULT_COORDS","PacemCrossItemsContainerElement","position","staleFlags","findContainer","parent","CustomElementUtils","findAncestorOfType","findAncestor","setAsDirty","Visibility","Children","Position","flag","includes","reflectBack","Ui3DElement","Transform","translateX","translateY","translateZ","scale","scaleX","scaleY","scaleZ","_computeTransformMatrix","MAT3D","Matrix3D","VEC3D","QUAT","identity","rotate","rot","toRotationMatrix","multiply","translate","transformMatrix","Number","Pacem3DGroupElement","child","children","childRenderables","Pacem3DMeshElement","Material","Pacem3DObjectElement","Pacem3DLightElement","intensity","color","Light","Pacem3DCameraElement","near","far","up","lookAt","sphere","_resetBoundingSphere","oldValue","eye","center","radius","mag","currentValue","PropertyChangeEvent","propertyName","boundingSphere","Camera","Pacem3DPerspectiveCameraElement","fov","aspect","aspectRatio","Pacem3DOrthographicCameraElement","bottom","right","Pacem3DAdapterElement","PacemEventTarget","KnownShader","isMaterial","isBasicMaterial","shader","Basic","isLineMaterial","Line","isLambertMaterial","Lambert","isPhongMaterial","Phong","isStandardMaterial","Standard","isShaderMaterial","Custom","MaterialElement","_loadMap","url","material","texture","close","blob","Imaging","loadImage","createImageBitmap","updateMaterial","createMaterial","extend","opacity","wireframe","Css","getVariableValue","visible","hide","map","BasicMaterialElement","LambertMaterialElement","emissiveColor","reflectivity","refractionRatio","LineMaterialElement","lineWidth","lineJoin","lineCap","dashArray","split","parseInt","filter","isNaN","join","PhongMaterialElement","specularColor","shininess","flatShading","StandardMaterialElement","metalness","roughness","Pacem3DPrimitiveElement","createDefaultGeometry","NotifyChange","callback","descriptor","backingField","uniqueCode","getter","setter","call","get","set","enumerable","configurable","NodeGeometry","barycenter","bary","count","countDbl","boundingBox","output","minX","Infinity","minY","minZ","maxX","maxY","maxZ","min","max","setSelfAsDirty","LineGeometry","MeshGeometry","bbox","PacemBoxElement_1","PacemBoxElement","createMeshGeometry","depth","widthSegments","heightSegments","depthSegments","h","sw","sh","sd","uv","k","getPosIndex","epsilon","abs","appendFace","c_1","c_2","c_3","c_4","u_next","v_next","z_next","x_next","y_next","geom","w2","h2","d2","sqrt","pow","PacemConeElement_1","PacemConeElement","sides","capSegments","nodes","theta","slope","fY","fU","rj","v_prev","angle","cos","sin","index","index_prev","u_prev","prevLoopIndex","A","B","C","D","uvA","uvB","uvC","uvD","startCapIndex","bottomIndex","rj_norm","rj_norm_prev","angle_prev","cos_prev","sin_prev","prevLoopU","prevLoopV","prevLoopU_prev","prevLoopV_prev","PacemCylinderElement_1","PacemCylinderElement","capRadius","rho","startIndex","topPoint","bottomPoint","factor","uB","vB","uA","vA","faceIndicesTop","faceIndicesBottom","uvTop","uvBottom","startIndexPrevLoop","factor0","uC","vC","uD","vD","uvA2","uvB2","uvC2","uvD2","sideStartIndex","capLastIndex","fV","i_prev","PacemLineElement_1","DEFAULT_LINE","PacemLineElement","createLineGeometry","PacemPlaneElement_1","PacemPlaneElement","lengthSegments","halfWidth","halfLength","rowPoints","PacemTetrahedronElement_1","PacemOctahedronElement_1","PacemHexahedronElement_1","PacemIcosahedronElement_1","PacemDodecahedronElement_1","_utils","input","pattern","match","exec","ret","g","parseFloat","Point3D","PolyhedronElement","_assignMeshGeometry","PacemTetrahedronElement","nodesToParse","nodeToParse","pt3D","pointsToParse","texIndices","uvCoords","zero","PacemOctahedronElement","PacemHexahedronElement","PacemIcosahedronElement","PacemDodecahedronElement","PacemSphereElement_1","PacemSphereElement","segs","tessellation","segments","angle1","cos_angle1","sin_angle1","angle2","PacemTorusElement_1","PacemTorusElement","innerRadius","coords","phi","r1","r2","cos_angle2","prev_j","prev_i","AdapterUtils","isVector3D","isRgba","flattenVectorArray","array","findCamera","find","clipPixel","viewport","HTMLElement","offsetRect","Point","isPoint","page","CustomEventUtils","getEventCoordinates","_clipPoint","threeJsVersion","consts","VERSION","API_URI","ORBIT_URI","LOADERS","DEFAULT_MATERIAL","THREE","MeshStandardMaterial","materialToMaterial","lineBase","Colors","stringify","transparent","base","mipMapMaterial","TextureLoader","load","needsUpdate","emissive","MeshPhongMaterial","specular","MeshLambertMaterial","dash","gap","lineMatOptions","linecap","linejoin","linewidth","LineBasicMaterial","LineDashedMaterial","dashSize","gapSize","MeshBasicMaterial","content","toLowerCase","ObjectLoader","build","mesh","Mesh","isTHREEAvailable","window","Pacem3DThreeAdapterElement","_renderer","_camera","_scene","_orbitCtrls","_objects","WeakMap","_dict","_orbitControlsDelegate","_ensureAndRefresh","object3D","matrixAutoUpdate","mesh3D","indexOf","dispose","mesh3D2","remove","id","BufferGeometry","vertices","setAttribute","Float32BufferAttribute","setIndex","uvs","computeVertexNormals","nodeGeometryToBufferGeometry","frontMaterial","backMaterial","multiAllowed","multi","materials","side","FrontSide","DoubleSide","backsideMaterial","BackSide","materialToMaterials","_addOrUpdateItem","light","Color","posv","positionMatrix","Matrix4","apply","matrix","m11","m21","m31","offsetX","m12","m22","m32","offsetY","m13","m23","m33","offsetZ","m14","m24","m34","m44","updateMatrix","userData","tag","getObjectById","add","_assertMonoStage","_3d","snapshot","background","quality","jpeg","mime","compression","snapshotElement","_stage","project","point3D","vector","Vector3","widthHalf","heightHalf","zoomFit","camera","targets","o","has","controls","selection","fitOffset","box","Box3","expandByObject","getSize","getCenter","fitHeightDistance","atan","fitWidthDistance","distance","hasControls","direction","clone","sub","normalize","multiplyScalar","maxDistance","copy","updateProjectionMatrix","update","fitCameraToSelection","Vector2","raycaster","Raycaster","setFromCamera","intersects","intersectObjects","intersection","inert","wrapper","document","createElement","innerHTML","appendChild","importjs","async","start","Date","initialized","pred","setTimeout","whenTHREEAvailable","all","concat","js","Scene","parameters","canvas","antialias","stencil","alpha","WebGLRenderer","setSize","clr","theejsClr","setClearColor","orbit","_setCamera","cam","_disposeOrbitControls","_initOrbitControls","_updateRenderer","renderer","setClearAlpha","PerspectiveCamera","bag","obj3d","delete","parent3d","pcam","lookAtVector","OrthographicCamera","ocam","objOut","spotLight","SpotLight","PointLight","lightToLight","Group","LABEL_PREFIX","VERTEX_COLOR_REFERENCE","AMBIENT_COLOR_REFERENCE","LIGHTING_COLOR_REFERENCE","WGSL_VERTEXINPUT_STRUCT_NAME","WGSL_VERTEXOUTPUT_STRUCT_NAME","WGSL_INTERACTIONDATA_STRUCT_NAME","GPUBufferUsage","GPUTextureUsage","GPUShaderStage","GPUMapMode","WGSLBindingType","Buffers","create","device","data","label","buffer","createBuffer","byteLength","usage","VERTEX","COPY_DST","mappedAtCreation","Float32Array","getMappedRange","unmap","createUniform","UNIFORM","createStorage","STORAGE","createIndexed","INDEX","Uint16Array","BufferLayouts","createVertex","shaderLocationStart","sizes","attributes","fullSize","sz","shaderLocation","BYTES_PER_ELEMENT","format","arrayStride","stepMode","DefaultBasicMaterialFragmentOptions","outputNormalLocation","outputVertexLocation","outputUvLocation","outputVertexIndexLocation","outputRayIndexLocation","outputInstanceIndexLocation","storageMaterialGroupIndex","storageMaterialBindingIndex","adaptWGSLStringArray","getBasicMaterialFragmentWgsl","extensions","options","opts","definitions","bindings","modifiers","modifier","trimmed","trim","endsWith","adaptWGSLModifierStringArray","lighting","ambient","DefaultLineMaterialFragmentOptions","STORAGE_GROUP_INDEX_LINE","getLineMaterialFragmentWgsl","Materials","BasicMaterial","LineMaterial","TypeError","EmptyMaterialWGSLDelegates","MaterialBase","ReferenceError","wgsl","_diffuseColor","materialValue","value","version","texBmp","createTexture","TEXTURE_BINDING","RENDER_ATTACHMENT","source","fragment","ctx","lineMaterial","lineValue","clientWidth","clientHeight","defaultVertexGeometryModifierArgs","extractMeshVertexModifierFunctionComponents","regex","RegExp","arg","kvp","body","DefaultMeshVertexOptions","outputRayLocation","inputPositionLocation","inputNormalLocation","inputUvLocation","uniformViewBindingIndex","uniformViewGroupIndex","uniformWorldBindingIndex","uniformWorldGroupIndex","uniformInteractionBindingIndex","uniformInteractionGroupIndex","DefaultLineVertexOptions","storagePositionsGroupIndex","storagePositionsBindingIndex","uniformDimensionsGroupIndex","uniformDimensionsBindingIndex","getVertexOutputStructDefinition","getColorPickingFragmentWgsl","groupIndex","DefaultTextureMapReferences","DefaultDirectionalLightReferences","inputColor","directionalLight","references","group","binding","lightReference","ref","outputColor","DefaultOmniLightReferences","ray","omniLight","vertex","ambientLight","DEFAULT_SIZE","Cameras","view","dot","assertNearFarCorrectness","projection","zoom","orthographic","fovY","tan","finitelyFar","isFinite","perspective","throwBufferRequestError","createRenderableBuffer","RenderableGroupBuffer","RenderableMeshBuffer","RenderableCameraBuffer","RenderableLightBuffer","RenderLooper","_set","loop","meshes","cameras","groups","lights","cameraDone","lightsDone","disposed","RenderableBuffers","clearFlags","ManagedBuffers","GeometryBuffer","MaterialBuffer","InteractionBuffer","includeParent","bufferBase","allFlags","parentBufferBase","parentFlags","union","ManagedBufferBase","lock","unlock","garbage","shift","_destroyUnsafe","destroy","destroySafely","objects","Array","RenderableBufferBase","parentBuffer","u32id","uniqueId","u32idBuffer","Map","buildParentWorldTransform","worldMatrix","step","parentItem","parentItemMatrix","buildWorldTransform","itemMatrix","parentWorldMatrix","versions","context","pipeline","fresh","u32idBufferValue","Uint32Array","u32idBufferBuffer","specificBuffer","DefaultMaterial","viewBag","clear","_rebuildMatrices","viewProjection","viewValue","toArray","viewBuffer","roundoff","_destroyView","bufferBag","freshness","packed","geometryBuffers","_rebuildGeometryBuffers","newInPipeline","ensureInBag","posFresh","normFresh","uvFresh","geomFresh","_destroyBuffers","meshGeometry","flatPositions","length2","length3","positionsValue","normalsValue","uvValue","geomValue","offset2","offset3","nx","ny","nz","obsolete","textureBag","wgpuMaterial","buffers","textures","_resetMaterialBuffers","_ensureMaterialBuffer","values","t","fields","time","cursor","resolution","_ensureInteractionBuffer","geometryBuffer","materialBuffers","materialBuffer","worldTransform","transform","worldTransformBufferBag","geometries","_rebuildWorldMatrices","_ensureGeometryBuffer","mater","mat","wFresh","current","cache","transpose","invert","world","_rebuildAmbientLightBuffer","_rebuildDirectionalLightBuffer","offsetIntensity","_rebuildOmniLightBuffer","_rebuildLight","labelPrefix","DefaultPipelineOptions","multisample","packedVertices","primitive","topology","frontFace","cullMode","EMPTY_BIND_DELEGATE","RenderPipelines","_memoizer","memoizer","createColorPicking","renderPipeline","MeshRenderPipelineClass","LineRenderPipelineClass","frame","pipelineOptions","isLine","builder","MeshWGSLBuilder","LineWGSLBuilder","found","Dates","toISOString","RenderPipelineCache","ensureBindGroup","refresh","layout","entries","resource","createBindGroup","bindgroups","reset","_computeBasicData","inputModifier","vertexInput","outputModifier","vertexOutput","bindgroup","metadata","lightCount","mapCount","filteredArr","modifierInput","modifyInstructionInput","modifierFnInput","modifierName","arg0","arg1","modifierBody","modifierOutput","modifyInstructionOutput","modifierFnOutput","getMeshVertexWgsl","hasTexture","hasLighting","materialBindGroupIndex","lightingBindGroupIndex","MATERIAL_GROUP_INDEX","_computeBindGroupsAndReferences","lArr","ndx","Interaction","extra","merge","definition","materialGroupIndex","samplerReference","texReference","outputColors","textureMap","lightIndex","lightBuffer","PipelineUtils","queue","writeBuffer","_context","_builder","_cache","_ensureU32idBindGroup","_pickBindGroupLayout","_ensureMaterialBindGroup","layoutIndex","_bindGroupLayouts","createSampler","addressModeU","addressModeV","magFilter","minFilter","createView","_ensureWorldTransformBindGroup","raycasting","_ensureCameraProjectionAndInteractionDataBindGroup","interactionBuffer","_ensureLightingBindGroup","l","_bindVertex","_bindPicker","_bindWorldTransform","_bindRaycastWorldTransform","_bindCameraProjectionAndInteractionData","_bindRaycastCameraProjectionAndInteractionData","_bindLighting","_bindMaterial","pass","bind","draw","meshBuffer","cameraBuffer","lightBuffers","setPipeline","_pipeline","console","error","_pickPipeline","_key","module","createShaderModule","code","viewBindGroupLayout","createBindGroupLayout","visibility","FRAGMENT","worldBindGroupLayout","bindGroupLayouts","blend","srcFactor","dstFactor","materialBindGroupLayoutDescriptorEntries","hasTex","sampler","keys","SAMPLER_BINDING_INDEX","materialBindGroupLayoutDescriptor","materialBindGroupLayout","lightingGroupIndex","lightingBindGroupLayout","createPipelineLayout","depthStencil","depthCompare","depthWriteEnabled","createRenderPipeline","pickFragGroupLayout","pickDescriptor","at","setVertexBuffer","bindWorldTransform","worldTransformBuffer","bindGroup","setBindGroup","bindCameraProjectionAndInteractionData","viewTransformBuffer","viewTransformBufferBuffer","interactionDataBuffer","interactionDataBufferBuffer","interactionGroup","vertexColorsBuffer","vertexColorsBufferBuffer","tex","copyExternalImageToTexture","flipY","some","line","thickness","dashPattern","fat","getFatLineVertexWgsl","getDefaultLineVertexWgsl","geometryPositions","_lineBuilder","_ensureLineU32idBindGroup","_pickLineBindGroupLayout","_ensureLineMaterialBindGroup","_bindLineGroupLayouts","_ensureLinePositionsBindGroup","_ensureLineWorldTransformBindGroup","_ensureLineCameraProjectionBindGroup","_bindLinePositions","_bindLinePicker","_bindLineWorldTransform","_bindLineRaycastWorldTransform","_bindLineCameraProjection","_bindLineRaycastCameraProjection","_bindLineMaterial","_drawLine","_linePipeline","_pickLinePipeline","_lineKey","fatLines","lineEntries","vertexBindGroupLayouts","raycastLayoutIndex","bindLineWorldTransform","bindLineCameraProjection","positionsBuffer","positionsBufferBuffer","buffersInput","lineBuffer","lineBufferBuffer","Raycasters","ColorPickingRaycaster","interaction","_encoder","_pass","end","_handle","commandEncoder","_textures","pickTexture","pickBuffer","_ensureBuffer","copyTextureToBuffer","origin","bytesPerRow","rowsPerImage","submit","finish","_this","mapAsync","READ","_createTexture","limits","maxTextureDimension2D","COPY_SRC","_buffer","NUM_PIXELS","MAP_READ","_ensureTextures","renderTex","depthTex","_destroyTexture","begin","createCommandEncoder","passDescriptor","colorAttachments","clearValue","loadOp","storeOp","depthStencilAttachment","depthClearValue","depthLoadOp","depthStoreOp","beginRenderPass","WebGPUIssueCause","Renderers","config","navigator","gpu","RendererClass","init","issue","message","cause","Disabled","NotSupported","renderables","looper","enableValidation","_logError","logger","rebuildingContext","hasModifiers","_buildPassDescriptor","canvasTexture","getCurrentTexture","sampleCount","backColor","bgColor","canvasTexView","colorAttachment","renderTexView","depthTexView","stencilClearValue","stencilReadOnly","resolveTarget","_buildContext","getContext","textureFormat","getPreferredCanvasFormat","_buildUpContext","configure","alphaMode","requestAdapter","requestDevice","validationScope","pushErrorScope","popErrorScope","_disposeRenderableJustInCase","store","_createOrYieldRenderable","_createOrYieldGeometry","_createOrYieldMaterial","_unwrapBuffers","grp","accumulator","itemBuffer","_update","groupBuffers","meshBuffers","factory","groupBuffer","_disposeContext","destroyTextures","unconfigure","resize","WEBGPU_RAYCAST_CALLBACK_PROP","WEBGPU_RAYCAST_PIXEL_PROP","GETVAL","getAttachedPropertyValue","SETVAL","setAttachedPropertyValue","DELVAL","deleteAttachedPropertyValue","Pacem3DWgslScriptElement","PacemItemElement","n","Pacem3DWebgpuAdapterElement","observer","MutationObserver","textContent","observe","characterData","_computeVersion","Strings","hash","firstChange","disconnect","_scriptVersionChangeHandler","_parseWgslModifiers","scenes","Set","renderers","supported","active","sceneToUpdate","_ensureRenderer","_webGPUNotSupported","_updatePipeline","scripts","vertexGeometryScript","vertexOutputScript","fragmentScript","_reinitialize","_itemsChangedExec","_itemsChanged","Debounce","Spherical","EPSILON","DEFAULT_CONFIGURATION","maxAzimuth","minAzimuth","inertia","maxPolar","minPolar","enabled","pan","button","rotation","OrbitCameraBehavior","_config","_input","_progress","_startHandler","isMouse","pointerType","rotating","matchModifiers","panning","_currentState","_buildState","avoidHandler","_endHandler","_avoidHandler","_zoomHandler","sign","deltaY","f0","movementX","clamp","movementY","_renderHandler","_initialState","_canvas","passive","versor","tryAttach","element","findCameraStage","areClose","configuration","_getSafeAzimuth","_modAngle","_getSafePolar","deg","_getViewXYZ","state","initUp","updating","initTarget","trackedLookAt","progress","theta_","phi_","rho_","x_","y_","rotated","zoomed","panned","inertiaSpecified","newPosition","newUp","newLookAt","rho0","phi0","theta0","PHI","THETA","pivot","negate","qy","fromAxisAngle","qx","m0","x0","y0","currentRight","currentUp","PacemOrbitCameraBehaviorElement","Behaviors","PacemBehavior","_readyHandler","currentTarget","_decorateCore","_buildConfig","tr","zoomControl","panControl","rotationControl","behavior","isConnected","undecorate","_detected","info","cvs","contextNames","getParam","str","getParameter","addLine","section","detected","substring","userAgent","CreateGLContext","platform","VENDOR","RENDERER","SHADING_LANGUAGE_VERSION","RED_BITS","GREEN_BITS","BLUE_BITS","ALPHA_BITS","DEPTH_BITS","MAX_VERTEX_ATTRIBS","MAX_VERTEX_TEXTURE_IMAGE_UNITS","MAX_VARYING_VECTORS","MAX_VERTEX_UNIFORM_VECTORS","MAX_COMBINED_TEXTURE_IMAGE_UNITS","MAX_TEXTURE_SIZE","MAX_CUBE_MAP_TEXTURE_SIZE","COMPRESSED_TEXTURE_FORMATS","MAX_RENDERBUFFER_SIZE","MAX_VIEWPORT_DIMS","ALIASED_LINE_WIDTH_RANGE","ALIASED_POINT_SIZE_RANGE","getSupportedExtensions","OBJParser","vParser","vt","tParser","vn","nParser","fParser","fjParser","face","jArr","jIndex","vIndex0","tIndex0","nIndex0","vIndex","tIndex","nIndex","Transformer","parseGeometry","DeepMerger","Output"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"pacem-3d.min.js","sources":["../esm/converters.js","../esm/constants.js","../esm/stage.js","../esm/types.js","../esm/materials/material.js","../esm/materials/basic.js","../esm/materials/lambert.js","../esm/materials/line.js","../esm/materials/phong.js","../esm/materials/standard.js","../esm/primitives/primitive.js","../esm/decorators.js","../esm/geometry.js","../esm/primitives/box.js","../esm/primitives/cone.js","../esm/primitives/cylinder.js","../esm/primitives/line.js","../esm/primitives/plane.js","../esm/primitives/polyhedra.js","../esm/primitives/sphere.js","../esm/primitives/torus.js","../esm/adapters/shared.js","../esm/adapters/threejsadapter.js","../esm/adapters/webgpu/constants.js","../esm/adapters/webgpu/abstractions.js","../esm/adapters/webgpu/buffers.js","../esm/adapters/webgpu/wgsl/basic-material-fragment.js","../esm/adapters/webgpu/wgsl/line-material-fragment.js","../esm/adapters/webgpu/materials.js","../esm/adapters/webgpu/wgsl/shared.js","../esm/adapters/webgpu/wgsl/mesh-vertex.js","../esm/adapters/webgpu/wgsl/line-vertex.js","../esm/adapters/webgpu/wgsl/object-picking-fragment.js","../esm/adapters/webgpu/wgsl/texture-fragment.js","../esm/adapters/webgpu/wgsl/directional-light-fragment.js","../esm/adapters/webgpu/wgsl/omni-light-fragment.js","../esm/adapters/webgpu/wgsl/ambient-light-fragment.js","../esm/adapters/webgpu/cameras.js","../esm/adapters/webgpu/renderablebuffer.js","../esm/adapters/webgpu/pipelinefactory.js","../esm/adapters/webgpu/raycaster.js","../esm/adapters/webgpu/renderer.js","../esm/adapters/webgpu/webgpuadapter.js","../esm/adapters/webgpu/behaviors/orbit-camera.js","../esm/detector.js","../esm/parsers/parser.js","../esm/index-iife.js"],"sourcesContent":["import { Utils } from '@pacem/pacem-core';\nimport { parseAsNumericalArray } from '@pacem/pacem-foundation';\nimport { Geometry } from '@pacem/pacem-numerical';\n//namespace Pacem.Drawing3D {\nexport const Point3DConverter = {\n convert: (attr) => Geometry.LinearAlgebra.Vector3D.parse(attr),\n convertBack: (prop) => `${prop.x || 0} ${prop.y || 0} ${prop.z || 0}`\n};\nexport const Point3DOrNumberConverter = {\n convert: (attr) => {\n const arr = parseAsNumericalArray(attr);\n const throwErr = () => { throw new Error(`Cannot parse \"${attr}\" as a valid Vector3D.`); };\n if (Utils.isNullOrEmpty(arr)) {\n throwErr();\n }\n if (arr.length === 3) {\n return Geometry.LinearAlgebra.Vector3D.from(...arr);\n }\n if (arr.length === 1) {\n const v = arr[0];\n return Geometry.LinearAlgebra.Vector3D.from(v, v, v);\n }\n throwErr();\n },\n convertBack: (prop) => `${prop.x || 0} ${prop.y || 0} ${prop.z || 0}`\n};\nexport const QuaternionConverter = {\n convert: (attr) => Geometry.LinearAlgebra.Quaternion.parse(attr),\n convertBack: (prop) => `${prop.x || 0} ${prop.y || 0} ${prop.z || 0} ${prop.w || 0}`\n};\nexport const BooleanOrNumberConverter = {\n convert: (attr) => {\n if (attr === 'true')\n return true;\n if (attr === 'false')\n return false;\n return parseAsNumericalArray(attr)[0];\n },\n convertBack: (prop) => prop.toString()\n};\n","export const TAG_MIDDLE_NAME = \"3d\";\nexport const DEG2RAD = Math.PI / 180;\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, P, PCSS, Defaults, ViewChild, Watch, PropertyConverters, Utils, Components, PropertyChangeEventName, Logging, Animations, UI } from '@pacem/pacem-core';\nimport { RenderableEvent, DragEvent, RenderableElement } from './types';\nimport { TAG_MIDDLE_NAME } from './constants';\n//namespace Pacem.Components.Drawing3D {\nlet Pacem3DElement = class Pacem3DElement extends Components.PacemItemsContainerElement {\n constructor() {\n super(...arguments);\n this._itemPropertyChangeHandler = (evt) => {\n const renderable = evt.target;\n // clear flags\n // TODO: be more precise\n this.adapter &&\n this.adapter.updateItem(this, renderable);\n renderable.flags.splice(0);\n };\n this._clickHandler = (evt) => {\n let me = this;\n if (!me.interactive || Utils.isNull(me._lastHitResult)) {\n return;\n }\n const type = evt.type.replace(/^mouse/, '');\n const hit = me._lastHitResult, object = hit.object, point = hit.point;\n this._itemDispatch(object, point, type, evt);\n };\n this._hitTestCallback = (result, evt) => {\n const me = this;\n // TODO: handle dragging\n if (result != me._lastHitResult) {\n if (result?.object != me._lastHitResult?.object) {\n const obj = result?.object, last = me._lastHitResult?.object, pt = result?.point;\n if (!Utils.isNull(last)) {\n this._itemDispatch(last, pt, 'out', evt);\n }\n if (!Utils.isNull(obj)) {\n this._itemDispatch(obj, pt, 'over', evt);\n }\n }\n me._lastHitResult = result;\n }\n };\n this._moveHandler = (evt) => {\n let me = this;\n if (!me.adapter || !me.interactive) {\n return;\n }\n const rect = me._resizer.currentSize;\n const callback = (r) => me._hitTestCallback(r, evt);\n const pixel = evt.type === 'mousemove' ? { x: evt.pageX - rect.left, y: evt.pageY - rect.top } : { x: -1, y: -1 };\n me.adapter.raycast(this, pixel, rect, callback);\n };\n this._resizeHandler = (evt) => {\n const oldSize = this.#size;\n const size = evt.detail;\n if (!Utils.isNull(oldSize) && oldSize.height === size.height && oldSize.width === size.width) {\n return;\n }\n this.#size = size;\n const adapter = this.adapter;\n if (!Utils.isNull(adapter)) {\n this.adapter.invalidateSize(this, size);\n this.dispatchEvent(new Components.ResizeEvent(size));\n }\n };\n //#endregion\n }\n validate(item) {\n return item instanceof RenderableElement;\n }\n get stage() {\n return this._container;\n }\n get scene() {\n return this.adapter && this.adapter.getScene(this);\n }\n register(item) {\n const retval = super.register(item);\n if (retval) {\n this._add(item);\n item.addEventListener(PropertyChangeEventName, this._itemPropertyChangeHandler, false);\n }\n return retval;\n }\n unregister(item) {\n const retval = super.unregister(item);\n if (retval) {\n item.removeEventListener(PropertyChangeEventName, this._itemPropertyChangeHandler, false);\n this._erase(item);\n }\n return retval;\n }\n _refreshDatasource(val = this.datasource) {\n this.adapter?.updateItem(this, undefined);\n }\n _buildUpDatasourceFromDOM(val = this.items) {\n if (!Utils.isNullOrEmpty(val)) {\n this.datasource = val.slice();\n }\n }\n _add(item) {\n this.adapter &&\n this.adapter.addItem(this, item);\n }\n _erase(item) {\n this.adapter &&\n this.adapter.removeItem(this, item);\n }\n _initializeAdapter(old, val) {\n return new Promise((resolve, reject) => {\n const items = this.datasource || [];\n if (!Utils.isNull(old)) {\n items.forEach(i => old.removeItem(this, i));\n }\n if (!Utils.isNull(this._container) && !Utils.isNull(val)) {\n val.initialize(this).then(_ => {\n (items || []).forEach(i => this._add(i));\n resolve();\n }, e => {\n this.log(Logging.LogLevel.Error, e?.toString());\n reject(e);\n });\n }\n else {\n resolve();\n }\n });\n }\n //#region lifecycle\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (first) {\n return;\n }\n switch (name) {\n case 'adapter':\n this._initializeAdapter(old, val);\n break;\n case 'items':\n this._buildUpDatasourceFromDOM(val);\n break;\n case 'transparent':\n this.adapter?.invalidateSize(this, this.size);\n break;\n case 'datasource':\n this._refreshDatasource(val);\n case 'disabled':\n case 'background':\n this.render();\n break;\n }\n }\n viewActivatedCallback() {\n super.viewActivatedCallback();\n // stage\n const container = this._container;\n // resizer\n const resizer = this._resizer;\n resizer.addEventListener('resize', this._resizeHandler, false);\n resizer.target = container;\n // adapter\n this._initializeAdapter(null, this.adapter).then(_ => {\n container.addEventListener('mousemove', this._moveHandler, false);\n container.addEventListener('click', this._clickHandler, false);\n container.addEventListener('mouseup', this._clickHandler, false);\n container.addEventListener('mousedown', this._clickHandler, false);\n container.addEventListener('mouseout', this._moveHandler, false);\n this._buildUpDatasourceFromDOM();\n this.render();\n });\n }\n _itemDispatch(target, point, type, offset) {\n if (!Utils.isNull(target)) {\n var dragArgs, originalEvent, evtType;\n if (offset instanceof Event) {\n originalEvent = offset;\n }\n else {\n dragArgs = { item: target, offset: offset };\n }\n if (typeof type === 'string') {\n evtType = type;\n }\n else {\n evtType = type.type;\n originalEvent = type.originalEvent;\n }\n const m = point;\n const evt = () => offset instanceof Event ? new RenderableEvent(evtType, target, originalEvent, m) : new DragEvent(evtType, { detail: dragArgs, cancelable: evtType === UI.DragDropEventType.Init || evtType === UI.DragDropEventType.Drag }, originalEvent, m), itemevt = offset instanceof Event ? new RenderableEvent('item' + evtType, target, originalEvent, m) : new DragEvent('item' + evtType, { detail: dragArgs, cancelable: evtType === UI.DragDropEventType.Init || evtType === UI.DragDropEventType.Drag }, originalEvent, m);\n var prevent = false;\n if (target instanceof EventTarget) {\n const evnt = evt();\n target.dispatchEvent(evnt);\n prevent = evnt.defaultPrevented;\n }\n target.stage.dispatchEvent(itemevt);\n // was the event (in one of its forms) rejected?\n return prevent || itemevt.defaultPrevented;\n }\n return false;\n }\n disconnectedCallback() {\n this.#handle?.stop();\n const resizer = this._resizer, container = this._container;\n if (!Utils.isNull(container)) {\n container.removeEventListener('click', this._clickHandler, false);\n container.removeEventListener('mouseup', this._clickHandler, false);\n container.removeEventListener('mousedown', this._clickHandler, false);\n container.removeEventListener('mousemove', this._moveHandler, false);\n container.removeEventListener('mouseout', this._moveHandler, false);\n }\n if (!Utils.isNull(resizer)) {\n resizer.removeEventListener('resize', this._resizeHandler, false);\n }\n super.disconnectedCallback();\n }\n #size;\n get size() {\n return this.#size;\n }\n render(item, deepUpdate, now = performance.now()) {\n if (!Utils.isNull(item)) {\n const adapter = this.adapter;\n if (!Utils.isNull(adapter)) {\n adapter.updateItem(this, item);\n }\n }\n else {\n this.#handle?.stop();\n this.#handle = Animations.Timer.run(_ => this._doRender());\n //this._doRender();\n }\n }\n #handle;\n _doRender() {\n if (!this.disabled && !Utils.isNull(this.adapter)) {\n const scene = this.adapter.getScene(this);\n let cancelable = new CustomEvent('prerender', { detail: { scene }, cancelable: true });\n this.dispatchEvent(cancelable);\n if (!cancelable.defaultPrevented) {\n this.adapter.render(this);\n this.dispatchEvent(new CustomEvent('render', { detail: { scene } }));\n }\n }\n }\n};\n__decorate([\n ViewChild(`.${PCSS}-3d`)\n], Pacem3DElement.prototype, \"_container\", void 0);\n__decorate([\n ViewChild(P + '-resize')\n], Pacem3DElement.prototype, \"_resizer\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Boolean })\n], Pacem3DElement.prototype, \"interactive\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Boolean })\n], Pacem3DElement.prototype, \"transparent\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], Pacem3DElement.prototype, \"background\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Element })\n], Pacem3DElement.prototype, \"adapter\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Json })\n], Pacem3DElement.prototype, \"datasource\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Boolean })\n], Pacem3DElement.prototype, \"orbit\", void 0);\nPacem3DElement = __decorate([\n CustomElement({\n tagName: P + '-' + TAG_MIDDLE_NAME, shadow: Defaults.USE_SHADOW_ROOT, template: `<${P}-resize watch-position=\"true\"></${P}-resize><div class=\"${PCSS}-3d\"></div><${P}-content></${P}-content>`\n })\n], Pacem3DElement);\nexport { Pacem3DElement };\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { Watch, PropertyConverters, CustomElement, PacemEventTarget, PropertyChangeEvent, CustomElementUtils, CustomUIEvent, P, Utils, Components } from '@pacem/pacem-core';\nimport { Geometry } from '@pacem/pacem-numerical';\nimport { Point3DConverter, Point3DOrNumberConverter, QuaternionConverter } from './converters';\nimport { Pacem3DElement } from './stage';\nimport { TAG_MIDDLE_NAME } from './constants';\nexport function isStage(object) {\n return !Utils.isNull(object) && 'render' in object && typeof object['render'] === 'function';\n}\nexport function isRenderable(object) {\n return isStage(object?.stage);\n}\nexport function isUi3DObject(object) {\n return 'transformMatrix' in object && isRenderable(object);\n}\nexport function isCamera(object) {\n return 'type' in object && 'up' in object && 'lookAt' in object && isRenderable(object);\n}\nexport function isPerspectiveCamera(object) {\n return isCamera(object) && 'type' in object && object.type === 'perspective';\n}\nexport function isOrthographicCamera(object) {\n return isCamera(object) && 'type' in object && object.type === 'orthographic';\n}\nexport function isLight(object) {\n return 'type' in object && (object.type === 'ambient' || object.type === 'omni' || object.type === 'direction' || object.type == 'spot') && isRenderable(object);\n}\nexport function isMesh(object) {\n return 'geometry' in object && isUi3DObject(object);\n}\nexport function isGeometry(object) {\n return 'positions' in object && Utils.isArray(object.positions);\n}\nexport function isMeshGeometry(object) {\n return ('triangleIndices' in object && Utils.isArray(object.triangleIndices)\n || 'normals' in object && Utils.isArray(object.normals)\n || 'textureCoordinates' in object && Utils.isArray(object.textureCoordinates)) && isGeometry(object);\n}\nexport function isGroup(object) {\n return 'childRenderables' in object && Utils.isArray(object['childRenderables']) && isUi3DObject(object);\n}\n/**\n * Sets the normals to a mesh geometry by computing each face's unit orthogonal vector.\n * @param geometry\n */\nexport function computeSharpVertexNormals(geometry) {\n const normals = [];\n if (!Utils.isNullOrEmpty(geometry)) {\n const indices = geometry.triangleIndices;\n if (indices.length % 3 !== 0) {\n throw new RangeError(`Invalid mesh geometry: ${indices.length} is not multiple of 3.`);\n }\n for (let j = 2; j < indices.length; j += 3) {\n const u = indices[j - 2], v = indices[j - 1], w = indices[j];\n const a = geometry.positions[u], b = geometry.positions[v], c = geometry.positions[w];\n const normal = computePlaneNormal(a, b, c);\n normals.push(normal, normal, normal);\n }\n }\n geometry.normals = normals;\n}\n/**\n * Computes the unit vector orthogonal to the plane identified by 3 points.\n * @param a\n * @param b\n * @param c\n */\nexport function computePlaneNormal(a, b, c) {\n // TODO: check input correctness (distinct points)\n const vAB = Geometry.LinearAlgebra.Vector3D.subtract(a, b), vAC = Geometry.LinearAlgebra.Vector3D.subtract(a, c);\n const orthogonal = Geometry.LinearAlgebra.Vector3D.cross(vAB, vAC);\n return Geometry.LinearAlgebra.Vector3D.unit(orthogonal);\n}\nexport class UI3DEvent extends CustomUIEvent {\n constructor(type, eventInit, originalEvent, point) {\n super(type, eventInit, originalEvent);\n this.#point = point;\n }\n #point;\n /** Gets the event's source position in 3d coordinates. */\n get point() {\n return this.#point;\n }\n}\nexport class DragEvent extends UI3DEvent {\n}\nexport class RenderableEvent extends UI3DEvent {\n constructor(type, args, originalEvent, p) {\n super(type, { detail: args, bubbles: true, cancelable: true }, originalEvent, p);\n }\n}\nexport var StalePropertyFlag;\n(function (StalePropertyFlag) {\n StalePropertyFlag[\"Position\"] = \"position\";\n StalePropertyFlag[\"Transform\"] = \"transform\";\n StalePropertyFlag[\"Geometry\"] = \"geometry\";\n StalePropertyFlag[\"Children\"] = \"children\";\n StalePropertyFlag[\"Material\"] = \"material\";\n StalePropertyFlag[\"Light\"] = \"light\";\n StalePropertyFlag[\"Camera\"] = \"camera\";\n StalePropertyFlag[\"Visibility\"] = \"visibility\";\n})(StalePropertyFlag || (StalePropertyFlag = {}));\nexport function isInteraction(object) {\n return typeof object === 'object' && 'time' in object && typeof object['time'] === 'number';\n}\n//namespace Pacem.Components.Drawing3D {\nconst Constants = {\n OBJECT_SELECTOR: P + '-' + TAG_MIDDLE_NAME + '-object',\n LIGHT_SELECTOR: P + '-' + TAG_MIDDLE_NAME + '-light',\n PERSPECTIVE_CAMERA_SELECTOR: P + '-' + TAG_MIDDLE_NAME + '-perspective-camera',\n ORTHO_CAMERA_SELECTOR: P + '-' + TAG_MIDDLE_NAME + '-orthographic-camera',\n LINE_SELECTOR: P + '-' + TAG_MIDDLE_NAME + '-line',\n MESH_SELECTOR: P + '-' + TAG_MIDDLE_NAME + '-mesh',\n GROUP_SELECTOR: P + '-' + TAG_MIDDLE_NAME + '-group',\n DEFAULT_COORDS: { x: 0, y: 0, z: 0 }\n};\nexport class RenderableElement extends Components.PacemCrossItemsContainerElement {\n constructor() {\n super(...arguments);\n this.position = Constants.DEFAULT_COORDS;\n this.#staleFlags = [];\n }\n validate(_) {\n // by default no children allowed (Group will except)\n return false;\n }\n findContainer() {\n // override\n return this.parent || this.stage;\n }\n get stage() {\n return this['_scene'] = this['_scene'] || CustomElementUtils.findAncestorOfType(this, Pacem3DElement);\n }\n get parent() {\n return this['_drawableParent'] = this['_drawableParent'] || CustomElementUtils.findAncestor(this, i => i instanceof RenderableElement);\n }\n disconnectedCallback() {\n delete this['_scene'];\n delete this['_drawableParent'];\n super.disconnectedCallback();\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'hide':\n this.setAsDirty(StalePropertyFlag.Visibility);\n break;\n case 'items':\n this.setAsDirty(StalePropertyFlag.Children);\n break;\n case 'position':\n this.setAsDirty(StalePropertyFlag.Position);\n break;\n }\n }\n #staleFlags;\n get flags() {\n return this.#staleFlags;\n }\n /** Calls for a redraw of the current element in the next rendering process. */\n setAsDirty(...flags) {\n // set the flags that identify the stale part of the object to be updated.\n for (let flag of flags) {\n if (!this.flags.includes(flag)) {\n this.flags.push(flag);\n }\n }\n this.stage?.render(this);\n }\n}\n__decorate([\n Watch({ emit: false, converter: Point3DConverter })\n], RenderableElement.prototype, \"position\", void 0);\n__decorate([\n Watch({ emit: false, reflectBack: true, converter: PropertyConverters.String })\n], RenderableElement.prototype, \"tag\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Boolean })\n], RenderableElement.prototype, \"inert\", void 0);\nexport class Ui3DElement extends RenderableElement {\n // #endregion\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'transformMatrix':\n this.setAsDirty(StalePropertyFlag.Transform);\n break;\n case 'translateZ':\n case 'translateX':\n case 'translateY':\n this.offset = { x: this.translateX, y: this.translateY, z: this.translateZ };\n break;\n case 'scaleX':\n case 'scaleY':\n case 'scaleZ':\n this.scale = { x: this.scaleX, y: this.scaleY, z: this.scaleZ };\n break;\n case 'scale':\n case 'offset':\n case 'rotate':\n this._computeTransformMatrix();\n break;\n }\n }\n _computeTransformMatrix() {\n const MAT3D = Geometry.LinearAlgebra.Matrix3D, VEC3D = Geometry.LinearAlgebra.Vector3D, QUAT = Geometry.LinearAlgebra.Quaternion;\n // scale\n const scale = this.scale ?? VEC3D.from(1, 1, 1);\n let m = MAT3D.scale(MAT3D.identity(), scale);\n // rotate\n if (!Utils.isNull(this.rotate)) {\n const rot = QUAT.toRotationMatrix(this.rotate);\n m = MAT3D.multiply(m, rot);\n }\n // translate\n const offset = this.offset ?? VEC3D.from(0, 0, 0);\n m = MAT3D.translate(m, offset);\n this.transformMatrix = m;\n }\n}\n__decorate([\n Watch({ emit: false, converter: QuaternionConverter })\n], Ui3DElement.prototype, \"rotate\", void 0);\n__decorate([\n Watch({ emit: false, converter: Point3DOrNumberConverter })\n], Ui3DElement.prototype, \"scale\", void 0);\n__decorate([\n Watch({ emit: false, converter: Point3DOrNumberConverter })\n], Ui3DElement.prototype, \"offset\", void 0);\n__decorate([\n Watch({ emit: false })\n], Ui3DElement.prototype, \"transformMatrix\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Ui3DElement.prototype, \"scaleX\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Ui3DElement.prototype, \"scaleY\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Ui3DElement.prototype, \"scaleZ\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Ui3DElement.prototype, \"translateX\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Ui3DElement.prototype, \"translateY\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Ui3DElement.prototype, \"translateZ\", void 0);\nlet Pacem3DGroupElement = class Pacem3DGroupElement extends Ui3DElement {\n validate(child) {\n // overrides default denial\n return child instanceof RenderableElement;\n }\n #children = [];\n get childRenderables() {\n return this.#children;\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'items':\n case 'datasource':\n this.#children = (val || []);\n this.setAsDirty(StalePropertyFlag.Children);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false })\n], Pacem3DGroupElement.prototype, \"datasource\", void 0);\nPacem3DGroupElement = __decorate([\n CustomElement({ tagName: Constants.GROUP_SELECTOR })\n], Pacem3DGroupElement);\nexport { Pacem3DGroupElement };\nlet Pacem3DMeshElement = class Pacem3DMeshElement extends Ui3DElement {\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'geometry':\n this.setAsDirty(StalePropertyFlag.Geometry);\n break;\n case 'material':\n case 'backMaterial':\n this.setAsDirty(StalePropertyFlag.Material);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Json })\n], Pacem3DMeshElement.prototype, \"geometry\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Json })\n], Pacem3DMeshElement.prototype, \"material\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Json })\n], Pacem3DMeshElement.prototype, \"backMaterial\", void 0);\nPacem3DMeshElement = __decorate([\n CustomElement({ tagName: Constants.MESH_SELECTOR })\n], Pacem3DMeshElement);\nexport { Pacem3DMeshElement };\nlet Pacem3DObjectElement = class Pacem3DObjectElement extends Ui3DElement {\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (name === 'content' || name === 'type') {\n this.setAsDirty(StalePropertyFlag.Geometry, StalePropertyFlag.Material);\n }\n }\n};\n__decorate([\n Watch({ emit: false })\n], Pacem3DObjectElement.prototype, \"content\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], Pacem3DObjectElement.prototype, \"type\", void 0);\nPacem3DObjectElement = __decorate([\n CustomElement({ tagName: Constants.OBJECT_SELECTOR })\n], Pacem3DObjectElement);\nexport { Pacem3DObjectElement };\nlet Pacem3DLightElement = class Pacem3DLightElement extends RenderableElement {\n constructor() {\n super(...arguments);\n this.intensity = .85;\n this.target = Constants.DEFAULT_COORDS;\n this.color = '#fff';\n this.type = 'omni';\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'type':\n case 'color':\n case 'intensity':\n case 'target':\n this.setAsDirty(StalePropertyFlag.Light);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Pacem3DLightElement.prototype, \"intensity\", void 0);\n__decorate([\n Watch({ emit: false, converter: Point3DConverter })\n], Pacem3DLightElement.prototype, \"target\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], Pacem3DLightElement.prototype, \"color\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], Pacem3DLightElement.prototype, \"type\", void 0);\nPacem3DLightElement = __decorate([\n CustomElement({ tagName: Constants.LIGHT_SELECTOR })\n], Pacem3DLightElement);\nexport { Pacem3DLightElement };\nexport class Pacem3DCameraElement extends RenderableElement {\n constructor() {\n super(...arguments);\n this.near = 0.1;\n this.far = 1000.0;\n this.up = Geometry.LinearAlgebra.Vector3D.j();\n this.lookAt = Constants.DEFAULT_COORDS;\n }\n #sphere;\n _resetBoundingSphere() {\n const oldValue = this.#sphere;\n const eye = this.position, center = this.lookAt;\n const radius = Utils.isNullOrEmpty(eye) || Utils.isNullOrEmpty(center) ? 0\n : Geometry.LinearAlgebra.Vector3D.mag(Geometry.LinearAlgebra.Vector3D.subtract(eye, center));\n const currentValue = this.#sphere = { center, radius };\n this.dispatchEvent(new PropertyChangeEvent({ currentValue, propertyName: 'boundingSphere', oldValue }));\n }\n get boundingSphere() {\n return this.#sphere;\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'lookAt':\n case 'position':\n this._resetBoundingSphere();\n case 'near':\n case 'far':\n case 'up':\n this.setAsDirty(StalePropertyFlag.Camera);\n break;\n }\n }\n}\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Pacem3DCameraElement.prototype, \"near\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Pacem3DCameraElement.prototype, \"far\", void 0);\n__decorate([\n Watch({ emit: false, converter: Point3DConverter })\n], Pacem3DCameraElement.prototype, \"up\", void 0);\n__decorate([\n Watch({ emit: false, converter: Point3DConverter })\n], Pacem3DCameraElement.prototype, \"lookAt\", void 0);\nlet Pacem3DPerspectiveCameraElement = class Pacem3DPerspectiveCameraElement extends Pacem3DCameraElement {\n constructor() {\n super(...arguments);\n this.fov = 45;\n this.aspect = 1;\n }\n get type() {\n return \"perspective\";\n }\n get aspectRatio() {\n return this.aspect;\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'fov':\n case 'aspect':\n this.setAsDirty(StalePropertyFlag.Camera);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Pacem3DPerspectiveCameraElement.prototype, \"fov\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Pacem3DPerspectiveCameraElement.prototype, \"aspect\", void 0);\nPacem3DPerspectiveCameraElement = __decorate([\n CustomElement({ tagName: Constants.PERSPECTIVE_CAMERA_SELECTOR })\n], Pacem3DPerspectiveCameraElement);\nexport { Pacem3DPerspectiveCameraElement };\nlet Pacem3DOrthographicCameraElement = class Pacem3DOrthographicCameraElement extends Pacem3DCameraElement {\n constructor() {\n super(...arguments);\n this.top = 1;\n this.left = -1;\n this.bottom = -1;\n this.right = 1;\n }\n get type() {\n return \"orthographic\";\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'top':\n case 'left':\n case 'bottom':\n case 'right':\n this.setAsDirty(StalePropertyFlag.Camera);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Pacem3DOrthographicCameraElement.prototype, \"top\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Pacem3DOrthographicCameraElement.prototype, \"left\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Pacem3DOrthographicCameraElement.prototype, \"bottom\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], Pacem3DOrthographicCameraElement.prototype, \"right\", void 0);\nPacem3DOrthographicCameraElement = __decorate([\n CustomElement({ tagName: Constants.ORTHO_CAMERA_SELECTOR })\n], Pacem3DOrthographicCameraElement);\nexport { Pacem3DOrthographicCameraElement };\nexport class Pacem3DAdapterElement extends PacemEventTarget {\n}\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { PacemEventTarget, Utils, Watch, PropertyConverters, PCSS } from '@pacem/pacem-core';\nimport { Imaging } from '@pacem/pacem-foundation';\nimport { StalePropertyFlag } from '../types';\n//namespace Pacem.Drawing3D {\nexport var KnownShader;\n(function (KnownShader) {\n KnownShader[\"Basic\"] = \"basic\";\n KnownShader[\"Lambert\"] = \"lambert\";\n KnownShader[\"Phong\"] = \"phong\";\n KnownShader[\"Standard\"] = \"standard\";\n KnownShader[\"Line\"] = \"line\";\n KnownShader[\"Custom\"] = \"custom\";\n})(KnownShader || (KnownShader = {}));\nexport function isMaterial(obj) {\n return /*'color' in obj &&*/ 'shader' in obj;\n}\nexport function isBasicMaterial(obj) {\n return isMaterial(obj) && obj.shader === KnownShader.Basic;\n}\nexport function isLineMaterial(obj) {\n return isMaterial(obj) && obj.shader === KnownShader.Line;\n}\nexport function isLambertMaterial(obj) {\n return isMaterial(obj) && obj.shader === KnownShader.Lambert;\n}\nexport function isPhongMaterial(obj) {\n return isMaterial(obj) && obj.shader === KnownShader.Phong;\n}\nexport function isStandardMaterial(obj) {\n return isMaterial(obj) && obj.shader === KnownShader.Standard;\n}\nexport function isShaderMaterial(obj) {\n return isMaterial(obj) && obj.shader === KnownShader.Custom;\n}\n//namespace Pacem.Components.Drawing3D {\nexport class MaterialElement extends PacemEventTarget {\n constructor(shader) {\n super();\n this.#shader = shader;\n }\n #shader;\n get shader() {\n return this.#shader;\n }\n async _loadMap(url, old = this.material?.texture) {\n if (!Utils.isNull(old)) {\n old.close();\n }\n if (Utils.isNullOrEmpty(url)) {\n return null;\n }\n const blob = await Imaging.loadImage(url);\n if (Utils.isNull(blob)) {\n return null;\n }\n return await createImageBitmap(blob);\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (!first) {\n switch (name) {\n case 'map':\n case 'opacity':\n case 'wireframe':\n case 'color':\n case 'hide':\n this.updateMaterial();\n break;\n }\n }\n }\n viewActivatedCallback() {\n super.viewActivatedCallback();\n this.updateMaterial();\n }\n updateMaterial() {\n this.createMaterial().then(m => {\n this.material = Utils.extend(m, { flags: [StalePropertyFlag.Material] });\n });\n }\n async createMaterial() {\n return {\n opacity: this.opacity ?? 1.0,\n wireframe: this.wireframe ?? false,\n color: this.color || Utils.Css.getVariableValue(`--${PCSS}-color-primary`),\n visible: !(this.hide ?? false),\n map: this.map,\n texture: await this._loadMap(this.map),\n shader: this.shader,\n flags: [],\n };\n }\n}\n__decorate([\n Watch()\n], MaterialElement.prototype, \"material\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], MaterialElement.prototype, \"opacity\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Boolean })\n], MaterialElement.prototype, \"wireframe\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], MaterialElement.prototype, \"color\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Boolean })\n], MaterialElement.prototype, \"hide\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], MaterialElement.prototype, \"map\", void 0);\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, P } from '@pacem/pacem-core';\nimport { KnownShader, MaterialElement } from './material';\nimport { TAG_MIDDLE_NAME } from '../constants';\n//namespace Pacem.Components.Drawing3D {\nlet BasicMaterialElement = class BasicMaterialElement extends MaterialElement {\n constructor() {\n super(KnownShader.Basic);\n }\n};\nBasicMaterialElement = __decorate([\n CustomElement({ tagName: `${P}-${TAG_MIDDLE_NAME}-material-basic` })\n], BasicMaterialElement);\nexport { BasicMaterialElement };\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, P, Watch, PropertyConverters, Utils } from '@pacem/pacem-core';\nimport { TAG_MIDDLE_NAME } from '../constants';\nimport { KnownShader, MaterialElement } from './material';\n//namespace Pacem.Components.Drawing3D {\nlet LambertMaterialElement = class LambertMaterialElement extends MaterialElement {\n constructor() {\n super(KnownShader.Lambert);\n }\n async createMaterial() {\n return Utils.extend({\n emissiveColor: this.emissiveColor || '#000',\n reflectivity: this.reflectivity ?? 0,\n refractionRatio: this.refractionRatio ?? 0\n }, await super.createMaterial());\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (!first) {\n switch (name) {\n case 'emissiveColor':\n case 'reflectivity':\n case 'refractionRatio':\n this.updateMaterial();\n break;\n }\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], LambertMaterialElement.prototype, \"emissiveColor\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], LambertMaterialElement.prototype, \"reflectivity\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], LambertMaterialElement.prototype, \"refractionRatio\", void 0);\nLambertMaterialElement = __decorate([\n CustomElement({ tagName: `${P}-${TAG_MIDDLE_NAME}-material-lambert` })\n], LambertMaterialElement);\nexport { LambertMaterialElement };\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, P, Watch, PropertyConverters, Utils } from '@pacem/pacem-core';\nimport { TAG_MIDDLE_NAME } from '../constants';\nimport { KnownShader, MaterialElement } from './material';\n//namespace Pacem.Components.Drawing3D {\nlet LineMaterialElement = class LineMaterialElement extends MaterialElement {\n constructor() {\n super(KnownShader.Line);\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (!first) {\n switch (name) {\n case 'lineWidth':\n case 'lineJoin':\n case 'lineCap':\n case 'dashArray':\n this.updateMaterial();\n break;\n }\n }\n }\n async createMaterial() {\n return Utils.extend({\n lineWidth: this.lineWidth ?? 1,\n lineJoin: this.lineJoin ?? 'round',\n lineCap: this.lineCap ?? 'round',\n dashArray: this.dashArray,\n }, await super.createMaterial());\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], LineMaterialElement.prototype, \"lineWidth\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], LineMaterialElement.prototype, \"lineJoin\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], LineMaterialElement.prototype, \"lineCap\", void 0);\n__decorate([\n Watch({\n emit: false, converter: {\n convert: (attr) => attr?.split(',').map(i => parseInt(i)).filter(i => !Number.isNaN(i)),\n convertBack: (prop) => prop?.join(',')\n }\n })\n], LineMaterialElement.prototype, \"dashArray\", void 0);\nLineMaterialElement = __decorate([\n CustomElement({ tagName: `${P}-${TAG_MIDDLE_NAME}-material-line` })\n], LineMaterialElement);\nexport { LineMaterialElement };\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, P, Watch, PropertyConverters, Utils } from '@pacem/pacem-core';\nimport { TAG_MIDDLE_NAME } from '../constants';\nimport { KnownShader, MaterialElement } from './material';\n//namespace Pacem.Components.Drawing3D {\nlet PhongMaterialElement = class PhongMaterialElement extends MaterialElement {\n constructor() {\n super(KnownShader.Phong);\n }\n async createMaterial() {\n return Utils.extend({\n emissiveColor: this.emissiveColor || '#000',\n reflectivity: this.reflectivity ?? 0,\n refractionRatio: this.refractionRatio ?? 0,\n specularColor: this.specularColor || '#000',\n shininess: this.shininess ?? 0,\n flatShading: this.flatShading ?? true\n }, await super.createMaterial());\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (!first) {\n switch (name) {\n case 'emissiveColor':\n case 'reflectivity':\n case 'refractionRatio':\n case 'specularColor':\n case 'shininess':\n case 'flatShading':\n this.updateMaterial();\n break;\n }\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], PhongMaterialElement.prototype, \"emissiveColor\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PhongMaterialElement.prototype, \"reflectivity\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PhongMaterialElement.prototype, \"refractionRatio\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], PhongMaterialElement.prototype, \"specularColor\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PhongMaterialElement.prototype, \"shininess\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Boolean })\n], PhongMaterialElement.prototype, \"flatShading\", void 0);\nPhongMaterialElement = __decorate([\n CustomElement({ tagName: `${P}-${TAG_MIDDLE_NAME}-material-phong` })\n], PhongMaterialElement);\nexport { PhongMaterialElement };\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, P, Watch, PropertyConverters, Utils } from '@pacem/pacem-core';\nimport { TAG_MIDDLE_NAME } from '../constants';\nimport { KnownShader, MaterialElement } from './material';\n//namespace Pacem.Components.Drawing3D {\nlet StandardMaterialElement = class StandardMaterialElement extends MaterialElement {\n constructor() {\n super(KnownShader.Standard);\n }\n async createMaterial() {\n return Utils.extend({\n emissiveColor: this.emissiveColor || '#000',\n refractionRatio: this.refractionRatio ?? 0,\n metalness: this.metalness ?? 0,\n roughness: this.roughness ?? 0,\n flatShading: this.flatShading ?? false\n }, await super.createMaterial());\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (!first) {\n switch (name) {\n case 'emissiveColor':\n case 'roughness':\n case 'metalness':\n case 'refractionRatio':\n case 'flatShading':\n this.updateMaterial();\n break;\n }\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], StandardMaterialElement.prototype, \"emissiveColor\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], StandardMaterialElement.prototype, \"refractionRatio\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], StandardMaterialElement.prototype, \"roughness\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], StandardMaterialElement.prototype, \"metalness\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Boolean })\n], StandardMaterialElement.prototype, \"flatShading\", void 0);\nStandardMaterialElement = __decorate([\n CustomElement({ tagName: `${P}-${TAG_MIDDLE_NAME}-material-standard` })\n], StandardMaterialElement);\nexport { StandardMaterialElement };\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { PacemEventTarget, Watch, PropertyConverters, Utils } from '@pacem/pacem-core';\n//namespace Pacem.Components.Drawing3D {\nexport class Pacem3DPrimitiveElement extends PacemEventTarget {\n viewActivatedCallback() {\n super.viewActivatedCallback();\n if (Utils.isNull(this.geometry)) {\n this.geometry = this.createDefaultGeometry();\n }\n }\n}\n__decorate([\n Watch({ converter: PropertyConverters.Json })\n], Pacem3DPrimitiveElement.prototype, \"geometry\", void 0);\n","import { Utils } from '@pacem/pacem-core';\n//namespace Pacem.Drawing3D {\nexport function NotifyChange(callback) {\n return (target, prop, descriptor) => {\n const backingField = `_${prop}_${Utils.uniqueCode()}_backingField`;\n function getter() {\n return this[backingField];\n }\n function setter(val) {\n if (val !== this[backingField]) {\n const old = this[backingField];\n this[backingField] = val;\n callback.call(this, prop, old, val);\n }\n }\n //if (delete target[prop]) {\n Object.defineProperty(target, prop, {\n get: function () {\n return getter.call(this);\n },\n set: function (val) {\n setter.call(this, val);\n },\n enumerable: true,\n configurable: false\n });\n //}\n };\n}\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { Utils } from '@pacem/pacem-core';\nimport { StalePropertyFlag } from './types';\nimport { NotifyChange } from './decorators';\nexport class NodeGeometry {\n constructor(positions = []) {\n this.positions = positions;\n }\n static barycenter(positions) {\n var bary = { x: 0, y: 0, z: 0 };\n if (!Utils.isNullOrEmpty(positions)) {\n var count = positions.length;\n for (var i = 0; i < positions.length; i++) {\n var pt = positions[i];\n bary.x += pt.x;\n bary.y += pt.y;\n bary.z += pt.z;\n }\n var countDbl = 1.0 * count;\n bary.x /= countDbl;\n bary.y /= countDbl;\n bary.z /= countDbl;\n }\n return bary;\n }\n static boundingBox(positions) {\n const output = {\n minX: +Infinity, minY: +Infinity, minZ: +Infinity,\n maxX: -Infinity, maxY: -Infinity, maxZ: -Infinity\n };\n if (!Utils.isNullOrEmpty(positions)) {\n for (var i = 0; i < positions.length; i++) {\n var pt = positions[i];\n output.minX = Math.min(output.minX, pt.x);\n output.minY = Math.min(output.minY, pt.y);\n output.minZ = Math.min(output.minZ, pt.z);\n output.maxX = Math.max(output.maxX, pt.x);\n output.maxY = Math.max(output.maxY, pt.y);\n output.maxZ = Math.max(output.maxZ, pt.z);\n }\n }\n return output;\n }\n setAsDirty() {\n setSelfAsDirty.call(this);\n }\n}\nfunction setSelfAsDirty() {\n const me = this;\n me.flags = [/* no further specifications, other than 'geometry' */ StalePropertyFlag.Geometry];\n}\nexport class LineGeometry extends NodeGeometry {\n}\n__decorate([\n NotifyChange(setSelfAsDirty)\n], LineGeometry.prototype, \"positions\", void 0);\nexport class MeshGeometry extends NodeGeometry {\n #boundingBox;\n #boundingSphere;\n #barycenter;\n get barycenter() {\n return this.#barycenter ??= NodeGeometry.barycenter(this.positions);\n }\n set barycenter(point) {\n this.#barycenter = point;\n }\n get boundingBox() {\n return this.#boundingBox ??= NodeGeometry.boundingBox(this.positions);\n }\n set boundingBox(bbox) {\n this.#boundingBox = bbox;\n }\n get boundingSphere() {\n return this.#boundingSphere;\n }\n set boundingSphere(sphere) {\n this.#boundingSphere = sphere;\n }\n constructor(positions, triangleIndices, textureCoordinates = [], normals = []) {\n super(positions);\n this.triangleIndices = triangleIndices;\n this.textureCoordinates = textureCoordinates;\n this.normals = normals;\n }\n}\n__decorate([\n NotifyChange(setSelfAsDirty)\n], MeshGeometry.prototype, \"positions\", void 0);\n__decorate([\n NotifyChange(setSelfAsDirty)\n], MeshGeometry.prototype, \"triangleIndices\", void 0);\n__decorate([\n NotifyChange(setSelfAsDirty)\n], MeshGeometry.prototype, \"textureCoordinates\", void 0);\n__decorate([\n NotifyChange(setSelfAsDirty)\n], MeshGeometry.prototype, \"normals\", void 0);\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar PacemBoxElement_1;\nimport { CustomElement, P, Watch, PropertyConverters } from '@pacem/pacem-core';\nimport { computeSharpVertexNormals } from '../types';\nimport { MeshGeometry } from '../geometry';\nimport { Pacem3DPrimitiveElement } from './primitive';\nimport { TAG_MIDDLE_NAME } from '../constants';\n//namespace Pacem.Components.Drawing3D {\nlet PacemBoxElement = PacemBoxElement_1 = class PacemBoxElement extends Pacem3DPrimitiveElement {\n static createMeshGeometry(width, height, depth, widthSegments, heightSegments, depthSegments) {\n const w = width || 1, h = height || 1, d = depth || 1, sw = widthSegments || 1, sh = heightSegments || 1, sd = depthSegments || 1;\n const positions = [];\n const uv = [];\n const indices = [];\n // populationg positions\n for (var j = 0; j <= sh; j++) {\n var y = h / 2.0 - h * (1.0 * j) / (1.0 * sh); // ??\n for (var k = 0; k <= sd; k++) {\n var z = -d / 2.0 + d * (1.0 * k) / (1.0 * sd);\n for (var i = 0; i <= sw; i++) {\n var x = -w / 2.0 + w * (1.0 * i) / (1.0 * sw);\n // add only surface nodes\n if (i == 0 || i == sw || k == 0 || k == sd || j == 0 || j == sh)\n positions.push({ x, y, z });\n }\n }\n }\n var getPosIndex = function (x, y, z) {\n var epsilon = .00001;\n for (var i = 0; i < positions.length; i++) {\n var pt = positions[i];\n if (Math.abs(pt.x - x) < epsilon && Math.abs(pt.y - y) < epsilon && Math.abs(pt.z - z) < epsilon)\n return i;\n }\n return -1;\n };\n var appendFace = function (c_1, c_2, c_3, c_4, u, v, u_next, v_next) {\n indices.push(c_1);\n indices.push(c_2);\n indices.push(c_3);\n indices.push(c_1);\n indices.push(c_3);\n indices.push(c_4);\n uv.push({ x: u, y: v_next });\n uv.push({ x: u_next, y: v_next });\n uv.push({ x: u_next, y: v });\n uv.push({ x: u, y: v_next });\n uv.push({ x: u_next, y: v });\n uv.push({ x: u, y: v });\n };\n // top face (1)\n for (var k = 0; k < sd; k++) {\n var y = h / 2.0;\n var z = -d / 2.0 + d * (1.0 * k) / (1.0 * sd);\n var z_next = -d / 2.0 + d * (1.0 * (k + 1)) / (1.0 * sd);\n for (var i = 0; i < sw; i++) {\n var x = -w / 2.0 + (1.0 * i) * w / (1.0 * sw);\n var x_next = -w / 2.0 + (1.0 * (i + 1)) * w / (1.0 * sw);\n // coord-indices + tex-coords\n var c_1 = getPosIndex(x, y, z_next);\n var c_2 = getPosIndex(x_next, y, z_next);\n var c_3 = getPosIndex(x_next, y, z);\n var c_4 = getPosIndex(x, y, z);\n var u_next = (1.0 * (i + 1)) / (1.0 * sw);\n var u = (1.0 * i) / (1.0 * sw);\n var v_next = 1.0 - (1.0 * (k + 1)) / (1.0 * sd);\n var v = 1.0 - (1.0 * k) / (1.0 * sd);\n appendFace(c_1, c_2, c_3, c_4, u, v, u_next, v_next);\n }\n }\n // back face (2)\n for (var j = 0; j < sh; j++) {\n var y = h / 2.0 - (1.0 * j) * h / (1.0 * sh);\n var y_next = h / 2.0 - (j + 1.0) * h / (1.0 * sh);\n var z = -d / 2.0;\n for (var i = 0; i < sw; i++) {\n var x = w / 2.0 - 1.0 * i * w / (1.0 * sw);\n var x_next = w / 2.0 - (i + 1.0) * w / (1.0 * sw);\n // coord-indices + tex-coords\n var c_1 = getPosIndex(x, y_next, z);\n var c_2 = getPosIndex(x_next, y_next, z);\n var c_3 = getPosIndex(x_next, y, z);\n var c_4 = getPosIndex(x, y, z);\n var u_next = (i + 1.0) / (1.0 * sw);\n var u = (1.0 * i) / (1.0 * sw);\n var v_next = 1.0 - (j + 1.0) / (1.0 * sh);\n var v = 1.0 - 1.0 * j / (1.0 * sh);\n appendFace(c_1, c_2, c_3, c_4, u, v, u_next, v_next);\n }\n }\n // left face (3)\n for (var j = 0; j < sh; j++) {\n var y = h / 2.0 - (1.0 * j) * h / (1.0 * sh);\n var y_next = h / 2.0 - (j + 1.0) * h / (1.0 * sh);\n var x = -w / 2.0;\n for (var k = 0; k < sd; k++) {\n var z = -d / 2.0 + k * d / (1.0 * sd);\n var z_next = -d / 2.0 + (k + 1.0) * d / (1.0 * sd);\n // coord-indices + tex-coords\n var c_1 = getPosIndex(x, y_next, z);\n var c_2 = getPosIndex(x, y_next, z_next);\n var c_3 = getPosIndex(x, y, z_next);\n var c_4 = getPosIndex(x, y, z);\n var u_next = (k + 1.0) / (1.0 * sd);\n var u = (1.0 * k) / (1.0 * sd);\n var v_next = 1.0 - (j + 1.0) / (1.0 * sh);\n var v = 1.0 - j / (1.0 * sh);\n appendFace(c_1, c_2, c_3, c_4, u, v, u_next, v_next);\n }\n }\n // front face (4)\n for (var j = 0; j < sh; j++) {\n var y = h / 2.0 - j * h / (1.0 * sh);\n var y_next = h / 2.0 - (j + 1.0) * h / (1.0 * sh);\n var z = d / 2.0;\n for (var i = 0; i < sw; i++) {\n var x = -w / 2.0 + i * w / (1.0 * sw);\n var x_next = -w / 2.0 + (i + 1.0) * w / (1.0 * sw);\n // coord-indices + tex-coords\n var c_1 = getPosIndex(x, y_next, z);\n var c_2 = getPosIndex(x_next, y_next, z);\n var c_3 = getPosIndex(x_next, y, z);\n var c_4 = getPosIndex(x, y, z);\n var u_next = (i + 1.0) / (1.0 * sw);\n var u = (1.0 * i) / (1.0 * sw);\n var v_next = 1.0 - (j + 1.0) / (1.0 * sh);\n var v = 1.0 - (1.0 * j) / (1.0 * sh);\n appendFace(c_1, c_2, c_3, c_4, u, v, u_next, v_next);\n }\n }\n // right face (5)\n for (var j = 0; j < sh; j++) {\n var y = h / 2.0 - j * h / (1.0 * sh);\n var y_next = h / 2.0 - (j + 1.0) * h / (1.0 * sh);\n var x = w / 2.0;\n for (var k = 0; k < sd; k++) {\n var z = d / 2.0 - k * d / (1.0 * sd);\n var z_next = d / 2.0 - (k + 1.0) * d / (1.0 * sd);\n // coord-indices + tex-coords\n var c_1 = getPosIndex(x, y_next, z);\n var c_2 = getPosIndex(x, y_next, z_next);\n var c_3 = getPosIndex(x, y, z_next);\n var c_4 = getPosIndex(x, y, z);\n var u_next = (k + 1.0) / (1.0 * sd);\n var u = (1.0 * k) / (1.0 * sd);\n var v_next = 1.0 - (j + 1.0) / (1.0 * sh);\n var v = 1.0 - (1.0 * j) / (1.0 * sh);\n appendFace(c_1, c_2, c_3, c_4, u, v, u_next, v_next);\n }\n }\n // bottom face (6)\n for (var k = 0; k < sd; k++) {\n var y = -h / 2.0;\n var z = d / 2.0 - d * k / (1.0 * sd);\n var z_next = d / 2.0 - d * (k + 1.0) / (1.0 * sd);\n for (var i = 0; i < sw; i++) {\n var x = -w / 2.0 + i * w / (1.0 * sw);\n var x_next = -w / 2.0 + (i + 1.0) * w / (1.0 * sw);\n // coord-indices + tex-coords\n var c_1 = getPosIndex(x, y, z_next);\n var c_2 = getPosIndex(x_next, y, z_next);\n var c_3 = getPosIndex(x_next, y, z);\n var c_4 = getPosIndex(x, y, z);\n var u_next = (i + 1.0) / (1.0 * sw);\n var u = (1.0 * i) / (1.0 * sw);\n var v_next = 1.0 - (k + 1.0) / (1.0 * sd);\n var v = 1.0 - (1.0 * k) / (1.0 * sd);\n appendFace(c_1, c_2, c_3, c_4, u, v, u_next, v_next);\n }\n }\n const geom = new MeshGeometry(positions, indices, uv);\n geom.key = `box_${width}x${height}x${depth}_w${widthSegments}_h${heightSegments}_d${depthSegments}`;\n computeSharpVertexNormals(geom);\n const center = { x: 0, y: 0, z: 0 };\n const w2 = width / 2, h2 = height / 2, d2 = depth / 2;\n //\n geom.barycenter = center;\n geom.boundingBox = { maxX: w2, maxY: h2, maxZ: d2, minX: -w2, minY: -h2, minZ: -d2 };\n geom.boundingSphere = { center, radius: Math.sqrt(Math.pow(w2, 2) + Math.pow(h2, 2) + Math.pow(d2, 2)) };\n //\n return geom;\n }\n createDefaultGeometry() {\n return PacemBoxElement_1.createMeshGeometry();\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'width':\n case 'height':\n case 'depth':\n case 'widthSegments':\n case 'heightSegments':\n case 'depthSegments':\n this.geometry = PacemBoxElement_1.createMeshGeometry(this.width, this.height, this.depth, this.widthSegments, this.heightSegments, this.depthSegments);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemBoxElement.prototype, \"width\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemBoxElement.prototype, \"height\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemBoxElement.prototype, \"depth\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemBoxElement.prototype, \"widthSegments\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemBoxElement.prototype, \"heightSegments\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemBoxElement.prototype, \"depthSegments\", void 0);\nPacemBoxElement = PacemBoxElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-box' })\n], PacemBoxElement);\nexport { PacemBoxElement };\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar PacemConeElement_1;\nimport { CustomElement, P, Watch, PropertyConverters } from '@pacem/pacem-core';\nimport { computeSharpVertexNormals } from '../types';\nimport { MeshGeometry } from '../geometry';\nimport { Pacem3DPrimitiveElement } from './primitive';\nimport { TAG_MIDDLE_NAME, DEG2RAD } from '../constants';\n//namespace Pacem.Components.Drawing3D {\nlet PacemConeElement = PacemConeElement_1 = class PacemConeElement extends Pacem3DPrimitiveElement {\n static createMeshGeometry(radius = 1, height = 1, sides = 18, heightSegments = 5, capSegments = 1) {\n const r = radius;\n const nodes = [], uv = [], indices = [];\n const theta = DEG2RAD * (360.0 / sides);\n const slope = r / height;\n const fY = height / heightSegments;\n const fU = 1.0 / sides;\n // top vertex\n nodes.push({ x: .0, y: height, z: .0 });\n // ======================================\n // side loops\n for (let j = 1; j <= heightSegments; j++) {\n const y = height - fY * j;\n const v = y / height;\n const rj = (height - y) * slope;\n // for loops other than tip loop\n const y_prev = y + fY;\n const v_prev = y_prev / height;\n for (let i = 0; i < sides; i++) {\n const angle = theta * i;\n const x = Math.cos(angle) * rj, z = -Math.sin(angle) * rj;\n nodes.push({ x, y, z });\n const index = 1 + sides * (j - 1) + i;\n const index_prev = i == 0 ? index + sides - 1 : index - 1;\n const u = i * fU;\n const u_prev = i == 0 ? (1 - fU) : fU * (i - 1);\n if (j == 1) {\n // tip loop\n // 1 triangle\n indices.push(0, index_prev, index);\n uv.push({ x: u, y: 1 }, { x: u_prev, y: v }, { x: u, y: v });\n continue;\n }\n const prevLoopIndex = 1 + sides * (j - 2) + i;\n const prevLoopIndex_prev = i == 0 ? prevLoopIndex + sides - 1 : prevLoopIndex - 1;\n // quad\n const A = prevLoopIndex_prev;\n const B = index_prev;\n const C = index;\n const D = prevLoopIndex;\n indices.push(C, A, B);\n indices.push(C, D, A);\n const uvA = { x: u_prev, y: v_prev };\n const uvB = { x: u_prev, y: v };\n const uvC = { x: u, y: v };\n const uvD = { x: u, y: v_prev };\n uv.push(uvC, uvA, uvB);\n uv.push(uvC, uvD, uvA);\n }\n }\n // bottom cap\n const startCapIndex = 1 + (heightSegments - 1) * sides;\n // bottom vertex (pivot)\n nodes.push({ x: .0, y: 0, z: .0 });\n const bottomIndex = startCapIndex + sides;\n // ======================================\n for (let j = 1; j <= capSegments; j++) {\n const rj_norm = j / capSegments;\n const rj = radius * rj_norm;\n // for loops other than bottom vertex loop\n const rj_norm_prev = (j - 1) / capSegments;\n for (let i = 0; i < sides; i++) {\n const angle = theta * i, cos = Math.cos(angle), sin = Math.sin(angle);\n const angle_prev = angle - theta, cos_prev = Math.cos(angle_prev), sin_prev = Math.sin(angle_prev);\n const u = .5 * (1 + cos * rj_norm), v = .5 * (1 + sin * rj_norm);\n const u_prev = .5 * (1 + cos_prev * rj_norm), v_prev = .5 * (1 + sin_prev * rj_norm);\n let index, index_prev;\n if (j != capSegments) {\n const x = Math.cos(angle) * rj, z = -Math.sin(angle) * rj;\n nodes.push({ x, y: 0, z });\n index = bottomIndex + 1 + (j - 1) * sides + i;\n index_prev = i == 0 ? index + sides - 1 : index - 1;\n }\n else {\n index = startCapIndex + i;\n index_prev = i == 0 ? startCapIndex + sides - 1 : index - 1;\n }\n if (j == 1) {\n // bottom vertex loop\n // 1 triangle\n indices.push(bottomIndex, index, index_prev);\n uv.push({ x: .5, y: .5 }, { x: u, y: v }, { x: u_prev, y: v_prev });\n continue;\n }\n const prevLoopU = .5 * (1 + cos * rj_norm_prev), prevLoopV = .5 * (1 + sin * rj_norm_prev);\n const prevLoopU_prev = .5 * (1 + cos_prev * rj_norm_prev), prevLoopV_prev = .5 * (1 + sin_prev * rj_norm_prev);\n const prevLoopIndex = bottomIndex + 1 + (j - 2) * sides + i;\n const prevLoopIndex_prev = i == 0 ? prevLoopIndex + sides - 1 : prevLoopIndex - 1;\n // quad\n const A = prevLoopIndex_prev;\n const B = index_prev;\n const C = index;\n const D = prevLoopIndex;\n indices.push(A, D, B);\n indices.push(B, D, C);\n const uvA = { x: prevLoopU_prev, y: prevLoopV_prev };\n const uvB = { x: u_prev, y: v_prev };\n const uvC = { x: u, y: v };\n const uvD = { x: prevLoopU, y: prevLoopV };\n uv.push(uvA, uvD, uvB);\n uv.push(uvB, uvD, uvC);\n }\n }\n // put the whole thing together\n const geom = new MeshGeometry(nodes, indices, uv);\n geom.key = `cone_${radius}x${height}_s${sides}_h${heightSegments}_c${capSegments}`;\n computeSharpVertexNormals(geom);\n // TODO: barycenter, boundingBox, boundingSphere\n return geom;\n }\n createDefaultGeometry() {\n return PacemConeElement_1.createMeshGeometry();\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'radius':\n case 'height':\n case 'sides':\n case 'heightSegments':\n case 'capSegments':\n this.geometry = PacemConeElement_1.createMeshGeometry(this.radius, this.height, this.sides, this.heightSegments, this.capSegments);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemConeElement.prototype, \"radius\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemConeElement.prototype, \"height\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemConeElement.prototype, \"sides\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemConeElement.prototype, \"heightSegments\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemConeElement.prototype, \"capSegments\", void 0);\nPacemConeElement = PacemConeElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-cone' })\n], PacemConeElement);\nexport { PacemConeElement };\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar PacemCylinderElement_1;\nimport { CustomElement, P, Watch, PropertyConverters } from '@pacem/pacem-core';\nimport { computeSharpVertexNormals } from '../types';\nimport { MeshGeometry } from '../geometry';\nimport { Pacem3DPrimitiveElement } from './primitive';\nimport { TAG_MIDDLE_NAME, DEG2RAD } from '../constants';\n//namespace Pacem.Components.Drawing3D {\nlet PacemCylinderElement = PacemCylinderElement_1 = class PacemCylinderElement extends Pacem3DPrimitiveElement {\n static createMeshGeometry(radius = 1, height = 1, sides = 18, heightSegments = 5, capSegments = 1) {\n const r = radius;\n const nodes = [], uv = [], indices = [];\n const theta = DEG2RAD * (360.0 / sides);\n // top & bottom vertices (pivot @(0,0,0))\n nodes.push({ x: .0, y: height, z: .0 });\n nodes.push({ x: .0, y: .0, z: .0 });\n // ======================================\n // cap loops\n const capRadius = r / capSegments;\n for (let j = 1; j <= capSegments; j++) {\n //int j_prev = j - 1;\n var rho = capRadius * j;\n for (var i = 0; i < sides; i++) {\n const startIndex = 2 + 2 * sides * (j - 1);\n const A = i == 0 ? startIndex + 2 * (sides - 1) : startIndex + 2 * (i - 1);\n const B = startIndex + 2 * i;\n const u = Math.cos(theta * i);\n const v = -Math.sin(theta * i);\n const u_prev = Math.cos(theta * (i - 1.0));\n const v_prev = -Math.sin(theta * (i - 1.0));\n const x = rho * u;\n const z = rho * v;\n const topPoint = { x, y: height, z };\n const bottomPoint = { x, y: .0, z };\n //\n nodes.push(topPoint);\n nodes.push(bottomPoint);\n // coordinates & texture\n const factor = .5 * rho / r;\n const uB = u * factor;\n const vB = v * factor;\n const uA = u_prev * factor;\n const vA = v_prev * factor;\n if (j == 1) {\n const faceIndicesTop = [0 /* top vertex*/, A, B];\n const faceIndicesBottom = [1 /* bottom vertex*/, B + 1, A + 1];\n // texture\n const uvTop = [\n { x: .5, y: .5 },\n { x: .5 + uA, y: .5 - vA },\n { x: 0.5 + uB, y: .5 - vB }\n ];\n const uvBottom = [\n { x: .5, y: .5 },\n { x: 0.5 + uB, y: .5 + vB },\n { x: .5 + uA, y: .5 + vA }\n ];\n // faces\n indices.push(...faceIndicesTop);\n indices.push(...faceIndicesBottom);\n // texture\n for (let i = 0; i < uvTop.length; i++)\n uv.push(uvTop[i]);\n for (let i = 0; i < uvBottom.length; i++)\n uv.push(uvBottom[i]);\n }\n else {\n const startIndexPrevLoop = 2 + 2 * sides * (j - 2);\n const D = i == 0 ? startIndexPrevLoop + 2 * (sides - 1) : startIndexPrevLoop + 2 * (i - 1);\n const C = startIndexPrevLoop + 2 * i;\n // coordinates & texture\n const factor0 = .5 * ((j - 1.0) / capSegments);\n const uC = u * factor0;\n const vC = v * factor0;\n const uD = u_prev * factor0;\n const vD = v_prev * factor0;\n const uvA = { x: .5 + uA, y: .5 - vA };\n const uvB = { x: .5 + uB, y: .5 - vB };\n const uvC = { x: .5 + uC, y: .5 - vC };\n const uvD = { x: .5 + uD, y: .5 - vD };\n const uvA2 = { x: .5 + uA, y: .5 + vA };\n const uvB2 = { x: .5 + uB, y: .5 + vB };\n const uvC2 = { x: .5 + uC, y: .5 + vC };\n const uvD2 = { x: .5 + uD, y: .5 + vD };\n // top\n indices.push(A);\n indices.push(B);\n indices.push(D);\n indices.push(D);\n indices.push(B);\n indices.push(C);\n // bottom\n indices.push(C + 1);\n indices.push(B + 1);\n indices.push(A + 1);\n indices.push(C + 1);\n indices.push(A + 1);\n indices.push(D + 1);\n // textures top\n uv.push(uvA);\n uv.push(uvB);\n uv.push(uvD);\n uv.push(uvD);\n uv.push(uvB);\n uv.push(uvC);\n // texture bottom\n uv.push(uvC2);\n uv.push(uvB2);\n uv.push(uvA2);\n uv.push(uvC2);\n uv.push(uvA2);\n uv.push(uvD2);\n }\n }\n }\n // ======================================\n // side loops\n const sideStartIndex = 2 + 2 * sides * (capSegments);\n const capLastIndex = 2 + 2 * sides * (capSegments - 1);\n const fU = 1.0 / sides;\n const fV = 1.0 / heightSegments;\n for (let j = 1; j <= heightSegments; j++) {\n for (let i = 0; i < sides; i++) {\n if (j != heightSegments) {\n var x = r * Math.cos(theta * i);\n var z = -r * Math.sin(theta * i);\n var y = (height * j) / heightSegments;\n //\n nodes.push({ x, y, z });\n }\n const i_prev = i == 0 ? sides - 1 : i - 1;\n const A = j == 1 ? capLastIndex + 2 * i_prev + 1 : sideStartIndex + sides * (j - 2) + i_prev;\n const B = j == 1 ? capLastIndex + 2 * i + 1 : sideStartIndex + sides * (j - 2) + i;\n const C = j == heightSegments ? capLastIndex + 2 * i : sideStartIndex + sides * (j - 1) + i;\n const D = j == heightSegments ? capLastIndex + 2 * i_prev : sideStartIndex + sides * (j - 1) + i_prev;\n const u_prev = i_prev * fU;\n const v_prev = (j - 1) * fV;\n const u = i == 0 ? 1.0 : i * fU;\n const v = j * fV;\n const uvA = { x: u_prev, y: v_prev };\n const uvB = { x: u, y: v_prev };\n const uvC = { x: u, y: v };\n const uvD = { x: u_prev, y: v };\n indices.push(A);\n indices.push(B);\n indices.push(C);\n indices.push(A);\n indices.push(C);\n indices.push(D);\n //\n uv.push(uvA);\n uv.push(uvB);\n uv.push(uvC);\n uv.push(uvA);\n uv.push(uvC);\n uv.push(uvD);\n }\n }\n // put the whole thing together\n const geom = new MeshGeometry(nodes, indices, uv);\n geom.key = `cylinder_${radius}x${height}_s${sides}_h${heightSegments}_c${capSegments}`;\n computeSharpVertexNormals(geom);\n // TODO: barycenter, boundingBox, boundingSphere\n return geom;\n }\n createDefaultGeometry() {\n return PacemCylinderElement_1.createMeshGeometry();\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'radius':\n case 'height':\n case 'sides':\n case 'heightSegments':\n case 'capSegments':\n this.geometry = PacemCylinderElement_1.createMeshGeometry(this.radius, this.height, this.sides, this.heightSegments, this.capSegments);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemCylinderElement.prototype, \"radius\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemCylinderElement.prototype, \"height\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemCylinderElement.prototype, \"sides\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemCylinderElement.prototype, \"heightSegments\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemCylinderElement.prototype, \"capSegments\", void 0);\nPacemCylinderElement = PacemCylinderElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-cylinder' })\n], PacemCylinderElement);\nexport { PacemCylinderElement };\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar PacemLineElement_1;\nimport { CustomElement, P, Watch, PropertyConverters } from '@pacem/pacem-core';\nimport { LineGeometry } from '../geometry';\nimport { Pacem3DPrimitiveElement } from './primitive';\nimport { TAG_MIDDLE_NAME } from '../constants';\n//namespace Pacem.Components.Drawing3D {\nconst DEFAULT_LINE = [{ x: 0, y: 0, z: 0 }, { x: 0, y: 1, z: 0 }];\nlet PacemLineElement = PacemLineElement_1 = class PacemLineElement extends Pacem3DPrimitiveElement {\n static createLineGeometry(positions) {\n return new LineGeometry(positions || DEFAULT_LINE);\n }\n createDefaultGeometry() {\n return PacemLineElement_1.createLineGeometry();\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'positions':\n this.geometry = PacemLineElement_1.createLineGeometry(val);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Json })\n], PacemLineElement.prototype, \"positions\", void 0);\nPacemLineElement = PacemLineElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-line' })\n], PacemLineElement);\nexport { PacemLineElement };\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar PacemPlaneElement_1;\nimport { CustomElement, P, Watch, PropertyConverters } from '@pacem/pacem-core';\nimport { Geometry } from '@pacem/pacem-numerical';\nimport { MeshGeometry } from '../geometry';\nimport { Pacem3DPrimitiveElement } from './primitive';\nimport { TAG_MIDDLE_NAME } from '../constants';\n//namespace Pacem.Components.Drawing3D {\nlet PacemPlaneElement = PacemPlaneElement_1 = class PacemPlaneElement extends Pacem3DPrimitiveElement {\n static createMeshGeometry(width, length, widthSegments, lengthSegments) {\n width ||= 1.0;\n length ||= 1.0;\n widthSegments ||= 4;\n lengthSegments ||= 4;\n const halfWidth = width * .5, halfLength = length * .5;\n const nodes = [];\n const uv = [];\n const indices = [];\n const normals = [], normal = Geometry.LinearAlgebra.Vector3D.from(0, 0, 1);\n for (let j = 0; j <= lengthSegments; j++) {\n for (let i = 0; i <= widthSegments; i++) {\n const x = -halfWidth + i * width / (1.0 * widthSegments);\n const y = .0;\n const z = -halfLength + j * length / (1.0 * lengthSegments);\n nodes.push({ x, y, z });\n if (j < lengthSegments && i < widthSegments) {\n const rowPoints = widthSegments + 1;\n // const colPoints = lengthSegments + 1;\n const u_next = (i + 1.0) / (1.0 * widthSegments);\n const u = (1.0 * i) / (1.0 * widthSegments);\n const v_next = 1.0 - (j + 1.0) / (1.0 * lengthSegments);\n const v = 1.0 - (1.0 * j) / (1.0 * lengthSegments);\n indices.push((j + 1) * rowPoints + i);\n indices.push((j + 1) * rowPoints + i + 1);\n indices.push(j * rowPoints + i + 1);\n indices.push((j + 1) * rowPoints + i);\n indices.push(j * rowPoints + i + 1);\n indices.push(j * rowPoints + i);\n uv.push({ x: u, y: v_next });\n uv.push({ x: u_next, y: v_next });\n uv.push({ x: u_next, y: v });\n uv.push({ x: u, y: v_next });\n uv.push({ x: u_next, y: v });\n uv.push({ x: u, y: v });\n normals.push(normal, normal, normal, normal, normal, normal);\n }\n }\n }\n const geom = new MeshGeometry(nodes, indices, uv, normals);\n geom.key = `plane_${width}x${length}_w${widthSegments}_l${lengthSegments}`;\n // TODO: barycenter, boundingBox, boundingSphere\n return geom;\n }\n createDefaultGeometry() {\n return PacemPlaneElement_1.createMeshGeometry();\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'width':\n case 'length':\n case 'widthSegments':\n case 'lengthSegments':\n this.geometry = PacemPlaneElement_1.createMeshGeometry(this.width, this.length, this.widthSegments, this.lengthSegments);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemPlaneElement.prototype, \"width\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemPlaneElement.prototype, \"length\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemPlaneElement.prototype, \"widthSegments\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemPlaneElement.prototype, \"lengthSegments\", void 0);\nPacemPlaneElement = PacemPlaneElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-plane' })\n], PacemPlaneElement);\nexport { PacemPlaneElement };\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar PacemTetrahedronElement_1, PacemOctahedronElement_1, PacemHexahedronElement_1, PacemIcosahedronElement_1, PacemDodecahedronElement_1;\nimport { CustomElement, P, Watch, PropertyConverters } from '@pacem/pacem-core';\nimport { computeSharpVertexNormals } from '../types';\nimport { Geometry } from '@pacem/pacem-numerical';\nimport { MeshGeometry } from '../geometry';\nimport { Pacem3DPrimitiveElement } from './primitive';\nimport { PacemBoxElement } from './box';\nimport { TAG_MIDDLE_NAME } from '../constants';\n//namespace Pacem.Components.Drawing3D {\nconst _utils = {\n parseFloats: function (input) {\n const pattern = /([\\d.-]+)/i;\n var match = pattern.exec(input);\n const ret = [];\n while (match != null) {\n const g = match[0];\n const j = parseFloat(g);\n ret.push(j);\n input = input.replace(g, '');\n match = pattern.exec(input);\n }\n return ret;\n }\n};\nconst Point3D = Geometry.LinearAlgebra.Vector3D;\nexport class PolyhedronElement extends Pacem3DPrimitiveElement {\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (name === 'radius') {\n this._assignMeshGeometry(val);\n }\n }\n _assignMeshGeometry(radius) {\n this.geometry = this.createMeshGeometry(radius > .0 ? radius : 1.0);\n }\n createDefaultGeometry() {\n return this.createMeshGeometry(1.0);\n }\n}\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PolyhedronElement.prototype, \"radius\", void 0);\n// #region Tetrahedron\nlet PacemTetrahedronElement = PacemTetrahedronElement_1 = class PacemTetrahedronElement extends PolyhedronElement {\n static createMeshGeometry(radius) {\n radius ||= 1.0;\n const nodesCoordsString = \"0 0.5774 -0.8165, 0 0.5774 0.8165, 0.8165 -0.5774 0, -0.8165 -0.5774 0\";\n const nodesToParse = nodesCoordsString.split(',');\n const nodes = [];\n for (let i = 0; i < nodesToParse.length; i++) {\n const nodeToParse = nodesToParse[i];\n const pt3D = _utils.parseFloats(nodeToParse);\n nodes.push({ x: pt3D[0] * radius, y: pt3D[1] * radius, z: pt3D[2] * radius });\n }\n const indices = [1, 2, 0, 2, 3, 0, 3, 1, 0, 3, 2, 1];\n const textureCoordsString = \"0.5 0.9995, 0.5 0.0004995, 0.0004995 0.5, 0.9995 0.5, 0.5 0.0004995, 0.9995 0.5, 0.5 0.9995, 0.0004995 0.5, 0.9995 0.5, 0.5 0.9995, 0.0004995 0.5, 0.5 0.0004995\";\n const pointsToParse = textureCoordsString.split(',');\n const texIndices = [4, 5, 6, 7, 8, 9, 10, 11, 0, 3, 2, 1];\n const uv = [];\n for (let i = 0; i < texIndices.length; i++) {\n const ndx = texIndices[i];\n const uvCoords = _utils.parseFloats(pointsToParse[ndx]);\n uv.push({ x: uvCoords[0], y: uvCoords[1] });\n }\n const geom = new MeshGeometry(nodes, indices, uv);\n geom.key = `tetrahedron_${radius}`;\n computeSharpVertexNormals(geom);\n // TODO: barycenter, boundingBox, boundingSphere\n geom.boundingSphere = { center: Point3D.zero(), radius };\n return geom;\n }\n createMeshGeometry(radius = this.radius) {\n return PacemTetrahedronElement_1.createMeshGeometry(radius);\n }\n};\nPacemTetrahedronElement = PacemTetrahedronElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-tetrahedron' })\n], PacemTetrahedronElement);\nexport { PacemTetrahedronElement };\n// #endregion\n// #region Octahedron\nlet PacemOctahedronElement = PacemOctahedronElement_1 = class PacemOctahedronElement extends PolyhedronElement {\n static createMeshGeometry(radius) {\n radius ||= 1.0;\n // -------------------------------------------------------------------------------------------------\n const nodesCoordsString = \"0 0.7071 -0.7071, 0 0.7071 0.7071, 1 0 0, 0 -0.7071 -0.7071, -1 0 0, 0 -0.7071 0.7071\";\n const indices = [1, 2, 0, 2, 3, 0, 3, 4, 0, 4, 1, 0, 4, 5, 1, 5, 2, 1, 2, 5, 3, 4, 3, 5];\n const textureCoordsString = \"0.5 0.9995, 0.5 0.9995, 0.0004995 0.5, 0.5 0.9995, 0.9995 0.5, 0.5 0.0004995, 0.5 0.0004995, 0.9995 0.5, 0.5 0.9995, 0.0004995 0.5, 0.5 0.0004995, 0.5 0.9995, 0.5 0.0004995, 0.9995 0.5, 0.5 0.9995, 0.0004995 0.5, 0.5 0.0004995, 0.0004995 0.5, 0.5 0.0004995, 0.5 0.9995, 0.5 0.0004995, 0.9995 0.5, 0.5 0.0004995, 0.5 0.9995\";\n const texIndices = [6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 0, 17, 18, 19, 20, 21, 1, 2, 22, 23, 4, 3, 5];\n // -------------------------------------------------------------------------------------------------\n const nodesToParse = nodesCoordsString.split(',');\n const nodes = [];\n for (let i = 0; i < nodesToParse.length; i++) {\n const nodeToParse = nodesToParse[i];\n const pt3D = _utils.parseFloats(nodeToParse);\n nodes.push({ x: pt3D[0] * radius, y: pt3D[1] * radius, z: pt3D[2] * radius });\n }\n const pointsToParse = textureCoordsString.split(',');\n const uv = [];\n for (let i = 0; i < texIndices.length; i++) {\n const ndx = texIndices[i];\n const uvCoords = _utils.parseFloats(pointsToParse[ndx]);\n uv.push({ x: uvCoords[0], y: uvCoords[1] });\n }\n const geom = new MeshGeometry(nodes, indices, uv);\n geom.key = `octahedron_${radius}`;\n computeSharpVertexNormals(geom);\n // TODO: barycenter, boundingBox, boundingSphere\n geom.boundingSphere = { center: Point3D.zero(), radius };\n return geom;\n }\n createMeshGeometry(radius = this.radius) {\n return PacemOctahedronElement_1.createMeshGeometry(radius);\n }\n};\nPacemOctahedronElement = PacemOctahedronElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-octahedron' })\n], PacemOctahedronElement);\nexport { PacemOctahedronElement };\n// #endregion\n// #region Hexahedron\nlet PacemHexahedronElement = PacemHexahedronElement_1 = class PacemHexahedronElement extends PolyhedronElement {\n static createMeshGeometry(radius) {\n radius ||= 1.0;\n const inv_sqrt3 = 1.0 / Math.sqrt(3.0);\n const w = 2.0 * radius * inv_sqrt3;\n const geom = PacemBoxElement.createMeshGeometry(w, w, w);\n geom.key = `hexahedron_${radius}`;\n return geom;\n }\n createMeshGeometry(radius = this.radius) {\n return PacemHexahedronElement_1.createMeshGeometry(radius);\n }\n};\nPacemHexahedronElement = PacemHexahedronElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-hexahedron' })\n], PacemHexahedronElement);\nexport { PacemHexahedronElement };\n// #endregion\n// #region Icosahedron\nlet PacemIcosahedronElement = PacemIcosahedronElement_1 = class PacemIcosahedronElement extends PolyhedronElement {\n static createMeshGeometry(radius) {\n radius ||= 1.0;\n const nodesCoordsString = \"0 0.850651 -0.525731, 0 0.850651 0.525731, 0.850651 0.525731 0, 0.525731 0 -0.850651, -0.525731 0 -0.850651, -0.850651 0.525731 0, -0.525731 0 0.850651, 0.525731 0 0.850651, 0.850651 -0.525731 0, 0 -0.850651 0.525731, 0 -0.850651 -0.525731, -0.850651 -0.525731 0\";\n const indices = [1, 2, 0, 2, 3, 0, 3, 4, 0, 4, 5, 0, 5, 1, 0,\n 5, 6, 1, 6, 7, 1, 7, 2, 1, 2, 8, 3,\n 2, 7, 8, 6, 9, 7, 9, 8, 7, 8, 10, 3,\n 8, 9, 10, 6, 11, 9, 11, 10, 9, 10, 4, 3,\n 10, 11, 4, 6, 5, 11, 5, 4, 11];\n const textureCoordsString = \"0.5 0.808708, 0.5 0.999501, 0.5 0.808708, 0.191292 0.5, \" +\n \"0.000499547 0.5, 0.5 0.808708, 0.9995 0.5, 0.808708 0.5,\" +\n \"0.000499487 0.5, 0.5 0.191292, 0.5 0.000499487, 0.5 0.191292,\" +\n \"0.5 0.191292, 0.999501 0.5, 0.5 0.808708, 0.5 0.808708,\" +\n \"0.9995 0.5, 0.808708 0.999501, 0.191292 0.5, 0.808708 0.5,\" +\n \"0.5 0.999501, 0.808708 0.5, 0.999501 0.808708, 0.5 0.999501,\" +\n \"0.000499487 0.5, 0.5 0.191292, 0.5 0.808708, 0.9995 0.5,\" +\n \"0.808708 0.999501, 0.191292 0.5, 0.808708 0.5, 0.5 0.999501,\" +\n \"0.808708 0.5, 0.999501 0.808708, 0.5 0.808708, 0.5 0.191292,\" +\n \"0.9995 0.5, 0.000499547 0.5, 0.5 0.191292, 0.191292 0.5,\" +\n \"0.5 0.000499487, 0.808708 0.5, 0.5 0.000499487, 0.999501 0.191292,\" +\n \"0.5 0.191292, 0.808708 0.000499487, 0.9995 0.5, 0.5 0.191292,\" +\n \"0.5 0.808708, 0.9995 0.5, 0.5 0.191292, 0.808708 0.000499487,\" +\n \"0.999501 0.5, 0.5 0.808708, 0.5 0.000499487, 0.808708 0.5,\" +\n \"0.999501 0.191292, 0.808708 0.5, 0.5 0.808708, 0.5 0.191292\";\n const texIndices = [12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23,\n 24, 25, 0, 26, 27, 28, 29, 30, 31, 32, 33, 1,\n 34, 35, 36, 2, 37, 38, 39, 40, 41, 42, 43, 7,\n 44, 45, 46, 8, 47, 48, 49, 50, 51, 52, 53, 9,\n 54, 55, 3, 10, 56, 57, 6, 58, 59, 5, 4, 11];\n // -------------------------------------------------------------------------------------------------\n const nodesToParse = nodesCoordsString.split(',');\n const nodes = [];\n for (let i = 0; i < nodesToParse.length; i++) {\n const nodeToParse = nodesToParse[i];\n const pt3D = _utils.parseFloats(nodeToParse);\n nodes.push({ x: pt3D[0] * radius, y: pt3D[1] * radius, z: pt3D[2] * radius });\n }\n const pointsToParse = textureCoordsString.split(',');\n const uv = [];\n for (let i = 0; i < texIndices.length; i++) {\n const ndx = texIndices[i];\n const uvCoords = _utils.parseFloats(pointsToParse[ndx]);\n uv.push({ x: uvCoords[0], y: uvCoords[1] });\n }\n const geom = new MeshGeometry(nodes, indices, uv);\n geom.key = `icosahedron_${radius}`;\n computeSharpVertexNormals(geom);\n // TODO: barycenter, boundingBox, boundingSphere\n geom.boundingSphere = { center: Point3D.zero(), radius };\n return geom;\n }\n createMeshGeometry(radius = this.radius) {\n return PacemIcosahedronElement_1.createMeshGeometry(radius);\n }\n};\nPacemIcosahedronElement = PacemIcosahedronElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-icosahedron' })\n], PacemIcosahedronElement);\nexport { PacemIcosahedronElement };\n// #endregion\n// #region Dodecahedron\nlet PacemDodecahedronElement = PacemDodecahedronElement_1 = class PacemDodecahedronElement extends PolyhedronElement {\n static createMeshGeometry(radius) {\n radius ||= 1.0;\n const n1 = Point3D.from(0.356822 * radius, 0.934172 * radius, 0 * radius);\n const n2 = Point3D.from(-0.356822 * radius, 0.934172 * radius, 0 * radius);\n const n3 = Point3D.from(0.57735 * radius, 0.57735 * radius, -0.57735 * radius);\n const n4 = Point3D.from(0 * radius, 0.356822 * radius, -0.934172 * radius);\n const n5 = Point3D.from(-0.57735 * radius, 0.57735 * radius, -0.57735 * radius);\n const n6 = Point3D.from(-0.57735 * radius, 0.57735 * radius, 0.57735 * radius);\n const n7 = Point3D.from(0 * radius, 0.356822 * radius, 0.934172 * radius);\n const n8 = Point3D.from(0.57735 * radius, 0.57735 * radius, 0.57735 * radius);\n const n9 = Point3D.from(0.934172 * radius, 0 * radius, -0.356822 * radius);\n const n10 = Point3D.from(0.934172 * radius, 0 * radius, 0.356822 * radius);\n const n11 = Point3D.from(0 * radius, -0.356822 * radius, 0.934172 * radius);\n const n12 = Point3D.from(0.57735 * radius, -0.57735 * radius, 0.57735 * radius);\n const n13 = Point3D.from(0.57735 * radius, -0.57735 * radius, -0.57735 * radius);\n const n14 = Point3D.from(0.356822 * radius, -0.934172 * radius, 0 * radius);\n const n15 = Point3D.from(-0.57735 * radius, -0.57735 * radius, 0.57735 * radius);\n const n16 = Point3D.from(-0.356822 * radius, -0.934172 * radius, 0 * radius);\n const n17 = Point3D.from(0 * radius, -0.356822 * radius, -0.934172 * radius);\n const n18 = Point3D.from(-0.57735 * radius, -0.57735 * radius, -0.57735 * radius);\n const n19 = Point3D.from(-0.934172 * radius, 0 * radius, 0.356822 * radius);\n const n20 = Point3D.from(-0.934172 * radius, 0 * radius, -0.356822 * radius);\n const positions = [\n n1,\n n2,\n n3,\n n4,\n n5,\n n6,\n n7,\n n8,\n n9,\n n10,\n n11,\n n12,\n n13,\n n14,\n n15,\n n16,\n n17,\n n18,\n n19,\n n20\n ];\n const indices = [0, 2, 3, 0, 3, 4, 0, 4, 1, 1, 5, 6, 1, 6, 7,\n 1, 7, 0, 7, 9, 8, 7, 8, 2, 7, 2, 0,\n 7, 6, 10, 7, 10, 11, 7, 11, 9, 11, 13, 12,\n 11, 12, 8, 11, 8, 9, 11, 10, 14, 11, 14, 15,\n 11, 15, 13, 15, 17, 16, 15, 16, 12, 15, 12, 13,\n 15, 14, 18, 15, 18, 19, 15, 19, 17, 19, 4, 3,\n 19, 3, 16, 19, 16, 17, 19, 18, 5, 19, 5, 1,\n 19, 1, 4, 18, 14, 10, 18, 10, 6, 18, 6, 5,\n 3, 2, 8, 3, 8, 12, 3, 12, 16];\n const textureCoordsString = `0.5 0.999501, 0.5 0.999501, 0.191292 0.808708, 0.5 0.690792,\r\n 0.191292 0.808708, 0.191292 0.808708, 0.5 0.690792,\r\n 0.808708 0.808708, 0.000499517 0.5, 0.309208 0.5, 0.5 0.309208,\r\n 0.191292 0.191292, 0.191292 0.191292, 0.309208 0.5,\r\n 0.191292 0.191292, 0.5 0.000499517, 0.5 0.309208, 0.808708 0.191292,\r\n 0.000499517 0.5, 0.309208 0.5, 0.690792 0.5, 0.808708 0.808708,\r\n 0.5 0.999501, 0.690792 0.5, 0.5 0.999501, 0.191292 0.808708,\r\n 0.690792 0.5, 0.191292 0.808708, 0.309208 0.5, 0.309208 0.5,\r\n 0.191292 0.191292, 0.5 0.000499517, 0.309208 0.5, 0.5 0.000499517,\r\n 0.808708 0.191292, 0.309208 0.5, 0.808708 0.191292,\r\n 0.690792 0.5, 0.191292 0.808708, 0.309208 0.5, 0.690792 0.5,\r\n 0.191292 0.808708, 0.690792 0.5, 0.808708 0.808708,\r\n 0.191292 0.808708, 0.808708 0.808708, 0.808708 0.808708,\r\n 0.5 0.690792, 0.5 0.309208, 0.808708 0.808708, 0.5 0.309208,\r\n 0.808708 0.191292, 0.808708 0.191292, 0.9995 0.5, 0.191292 0.191292,\r\n 0.5 0.000499517, 0.808708 0.191292, 0.191292 0.191292,\r\n 0.808708 0.191292, 0.690792 0.5, 0.191292 0.191292,\r\n 0.690792 0.5, 0.191292 0.191292, 0.5 0.000499517, 0.808708 0.191292,\r\n 0.191292 0.191292, 0.808708 0.191292, 0.690792 0.5,\r\n 0.690792 0.5, 0.309208 0.5, 0.690792 0.5, 0.808708 0.808708,\r\n 0.5 0.999501, 0.690792 0.5, 0.5 0.999501, 0.191292 0.808708,\r\n 0.690792 0.5, 0.191292 0.808708, 0.5 0.000499517, 0.808708 0.191292,\r\n 0.690792 0.5, 0.5 0.000499517, 0.690792 0.5, 0.309208 0.5,\r\n 0.309208 0.5, 0.191292 0.191292, 0.9995 0.5, 0.808708 0.808708,\r\n 0.5 0.690792, 0.9995 0.5, 0.5 0.690792, 0.5 0.309208,\r\n 0.9995 0.5, 0.5 0.309208, 0.309208 0.5, 0.690792 0.5,\r\n 0.808708 0.808708, 0.309208 0.5, 0.808708 0.808708,\r\n 0.5 0.999501, 0.000499517 0.5, 0.5 0.309208, 0.000499517 0.5,\r\n 0.5 0.690792, 0.5 0.690792, 0.000499517 0.5, 0.5 0.690792,\r\n 0.191292 0.191292`;\n const texIndices = [20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31,\n 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43,\n 44, 45, 0, 46, 47, 48, 49, 50, 51, 7, 52, 53,\n 54, 55, 56, 57, 58, 59, 60, 61, 9, 62, 63, 64,\n 65, 66, 67, 11, 68, 69, 70, 71, 72, 73, 74, 75,\n 76, 77, 13, 78, 79, 80, 81, 82, 83, 15, 84, 85,\n 86, 87, 88, 89, 90, 91, 92, 93, 17, 94, 95, 96,\n 97, 98, 99, 19, 1, 4, 100, 14, 101, 102, 10, 103,\n 18, 6, 5, 104, 2, 105, 106, 8, 107, 3, 12, 16];\n // -------------------------------------------------------------------------------------------------\n const pointsToParse = textureCoordsString.split(',');\n const uv = [];\n for (let i = 0; i < texIndices.length; i++) {\n const ndx = texIndices[i];\n const uvCoords = _utils.parseFloats(pointsToParse[ndx]);\n uv.push({ x: uvCoords[0], y: uvCoords[1] });\n }\n const geom = new MeshGeometry(positions, indices, uv);\n geom.key = `dodecahedron_${radius}`;\n computeSharpVertexNormals(geom);\n // TODO: barycenter, boundingBox, boundingSphere\n geom.boundingSphere = { center: Point3D.zero(), radius };\n return geom;\n }\n createMeshGeometry(radius = this.radius) {\n return PacemDodecahedronElement_1.createMeshGeometry(radius);\n }\n};\nPacemDodecahedronElement = PacemDodecahedronElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-dodecahedron' })\n], PacemDodecahedronElement);\nexport { PacemDodecahedronElement };\n// #endregion\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar PacemSphereElement_1;\nimport { CustomElement, P, Watch, PropertyConverters } from '@pacem/pacem-core';\nimport { computeSharpVertexNormals } from '../types';\nimport { MeshGeometry } from '../geometry';\nimport { Pacem3DPrimitiveElement } from './primitive';\nimport { TAG_MIDDLE_NAME, DEG2RAD } from '../constants';\n//namespace Pacem.Components.Drawing3D {\nlet PacemSphereElement = PacemSphereElement_1 = class PacemSphereElement extends Pacem3DPrimitiveElement {\n static createMeshGeometry(radius = 1, segs = 8) {\n //\n const nodes = [];\n const uv = [];\n const indices = [];\n //\n const r = radius, tessellation = segs;\n const theta = DEG2RAD * (360.0 / tessellation);\n const segments = tessellation % 2 == 0 ? tessellation / 2 : (tessellation - 1) / 2;\n // top vertex\n nodes.push({ x: .0, y: r, z: .0 });\n for (let j = 1; j < segments; j++) {\n // loop \"latitude\"\n const angle1 = theta * j;\n const cos_angle1 = Math.cos(angle1);\n const sin_angle1 = Math.sin(angle1);\n const v = 1.0 - 1.0 * j / segments;\n for (let i = 0; i < tessellation; i++) {\n // loop \"longitude\"\n const angle2 = theta * i - Math.PI / 2.0;\n const cos_angle2 = Math.cos(angle2);\n const sin_angle2 = Math.sin(angle2);\n const x = r * sin_angle1 * cos_angle2;\n const y = r * cos_angle1;\n const z = r * sin_angle1 * sin_angle2;\n nodes.push({ x, y, z });\n // coordinates & texture\n const i_prev = i == 0 ? tessellation - 1 : i - 1;\n const u = i == 0 ? .0 : 1.0 - 1.0 * i / tessellation;\n const u_prev = 1.0 - 1.0 * i_prev / tessellation;\n // triangles\n if (j == 1) {\n indices.push(1 + i);\n indices.push(1 + i_prev);\n indices.push(0);\n //\n uv.push({ x: u, y: v });\n uv.push({ x: u_prev, y: v });\n uv.push({ x: .5, y: 1.0 });\n }\n else {\n indices.push((j - 1) * tessellation + i + 1);\n indices.push((j - 1) * tessellation + i_prev + 1);\n indices.push((j - 2) * tessellation + i_prev + 1);\n indices.push((j - 1) * tessellation + i + 1);\n indices.push((j - 2) * tessellation + i_prev + 1);\n indices.push((j - 2) * tessellation + i + 1);\n //\n const v_prev = 1.0 - (j - 1.0) / segments;\n //var faceUV = [];\n uv.push({ x: u, y: v });\n uv.push({ x: u_prev, y: v });\n uv.push({ x: u_prev, y: v_prev });\n uv.push({ x: u, y: v });\n uv.push({ x: u_prev, y: v_prev });\n uv.push({ x: u, y: v_prev });\n }\n }\n }\n // bottom vertex\n nodes.push({ x: .0, y: -r, z: .0 });\n const last = nodes.length - 1;\n for (let i = 0; i < tessellation; i++) {\n const j = segments - 2;\n const i_prev = i == 0 ? tessellation - 1 : i - 1;\n const u = i == 0 ? .0 : 1.0 - 1.0 * i / tessellation;\n const u_prev = 1.0 - 1.0 * i_prev / tessellation;\n const v = 1.0 - (j + 1.0) / segments;\n // triangles\n indices.push(last);\n indices.push(j * tessellation + 1 + i_prev);\n indices.push(j * tessellation + 1 + i);\n uv.push({ x: .5, y: 0 });\n uv.push({ x: u_prev, y: v });\n uv.push({ x: u, y: v });\n }\n const geom = new MeshGeometry(nodes, indices, uv);\n geom.key = `sphere_${radius}_s${segs}`;\n computeSharpVertexNormals(geom);\n return geom;\n }\n createDefaultGeometry() {\n return PacemSphereElement_1.createMeshGeometry();\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'radius':\n case 'segments':\n this.geometry = PacemSphereElement_1.createMeshGeometry(this.radius, this.segments);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemSphereElement.prototype, \"radius\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemSphereElement.prototype, \"segments\", void 0);\nPacemSphereElement = PacemSphereElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-sphere' })\n], PacemSphereElement);\nexport { PacemSphereElement };\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nvar PacemTorusElement_1;\nimport { CustomElement, P, Watch, PropertyConverters } from '@pacem/pacem-core';\nimport { computeSharpVertexNormals } from '../types';\nimport { MeshGeometry } from '../geometry';\nimport { Pacem3DPrimitiveElement } from './primitive';\nimport { TAG_MIDDLE_NAME, DEG2RAD } from '../constants';\n//namespace Pacem.Components.Drawing3D {\nlet PacemTorusElement = PacemTorusElement_1 = class PacemTorusElement extends Pacem3DPrimitiveElement {\n static createMeshGeometry(radius = 1, innerRadius = .25, segments = 24, sides = 12) {\n //\n const nodes = [];\n const uv = [];\n const coords = [];\n const theta = DEG2RAD * (360.0 / segments);\n const phi = DEG2RAD * (360.0 / sides);\n const r1 = radius;\n const r2 = innerRadius;\n for (let j = 0; j < segments; j++) {\n // Math.PI/2 adjustement (useful for UV mapping)\n const angle1 = theta * j - Math.PI / 2.0;\n const sin_angle1 = Math.sin(angle1);\n const cos_angle1 = Math.cos(angle1);\n for (let i = 0; i < sides; i++) {\n // Math.PI adjustement (useful for UV mapping)\n const angle2 = phi * i + Math.PI;\n const cos_angle2 = Math.cos(angle2);\n const x = r1 * cos_angle1 + r2 * cos_angle2 * cos_angle1;\n const y = r2 * Math.sin(angle2);\n const z = r1 * sin_angle1 + r2 * cos_angle2 * sin_angle1;\n nodes.push({ x, y, z });\n const prev_j = j > 0 ? j - 1 : segments - 1;\n const prev_i = i > 0 ? i - 1 : sides - 1;\n const u = j == 0 ? .0 : 1.0 - 1.0 * j / segments;\n const v = i > 0 ? 1.0 * i / sides : 1.0;\n const u_prev = j > 0 ? 1.0 - (j - 1.0) / segments : 1.0 / segments;\n const v_prev = i > 0 ? (i - 1.0) / sides : 1.0 - 1.0 / sides;\n // triangles <=> Int32Collection\n // <=> PointCollection\n coords.push(j * sides + prev_i);\n coords.push(prev_j * sides + prev_i);\n coords.push(prev_j * sides + i);\n coords.push(j * sides + prev_i);\n coords.push(prev_j * sides + i);\n coords.push(j * sides + i);\n //\n uv.push({ x: u, y: v_prev });\n uv.push({ x: u_prev, y: v_prev });\n uv.push({ x: u_prev, y: v });\n uv.push({ x: u, y: v_prev });\n uv.push({ x: u_prev, y: v });\n uv.push({ x: u, y: v });\n }\n }\n const geom = new MeshGeometry(nodes, coords, uv);\n geom.key = `torus_${radius}x${innerRadius}_t${segments}_s${sides}`;\n computeSharpVertexNormals(geom);\n return geom;\n }\n createDefaultGeometry() {\n return PacemTorusElement_1.createMeshGeometry();\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'radius':\n case 'innerRadius':\n case 'segments':\n case 'sides':\n this.geometry = PacemTorusElement_1.createMeshGeometry(this.radius, this.innerRadius, this.segments, this.sides);\n break;\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemTorusElement.prototype, \"radius\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemTorusElement.prototype, \"innerRadius\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemTorusElement.prototype, \"segments\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemTorusElement.prototype, \"sides\", void 0);\nPacemTorusElement = PacemTorusElement_1 = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-primitive-torus' })\n], PacemTorusElement);\nexport { PacemTorusElement };\n","import { CustomEventUtils, Utils } from '@pacem/pacem-core';\nimport { Point } from '@pacem/pacem-foundation';\nimport { isCamera } from '../types';\nfunction _clipPoint(evt, rect) {\n let x, y;\n if (Point.isPoint(evt)) {\n x = evt.x;\n y = evt.y;\n }\n else {\n const { page } = CustomEventUtils.getEventCoordinates(evt);\n const p = { x: page.x - rect.x, y: page.y - rect.y };\n x = p.x;\n y = p.y;\n }\n const clipX = x / rect.width * 2 - 1;\n const clipY = y / rect.height * -2 + 1;\n return { x: clipX, y: clipY };\n}\nexport class AdapterUtils {\n static isMeshGeometry(obj) {\n return 'positions' in obj && Utils.isArray(obj.positions)\n && 'triangleIndices' in obj && Utils.isArray(obj.triangleIndices);\n }\n static isVector3D(obj) {\n return 'x' in obj && typeof obj.x === 'number'\n && 'y' in obj && typeof obj.y === 'number'\n && 'z' in obj && typeof obj.z === 'number';\n }\n static isRgba(obj) {\n return 'r' in obj && typeof obj.r === 'number'\n && 'g' in obj && typeof obj.g === 'number'\n && 'b' in obj && typeof obj.b === 'number';\n }\n static flattenVectorArray(array) {\n const retval = [];\n for (let v of array) {\n if (AdapterUtils.isVector3D(v)) {\n retval.push(v.x, v.y, v.z);\n }\n else if (AdapterUtils.isRgba(v)) {\n retval.push(v.r, v.g, v.b, v.a ?? 1);\n }\n else {\n retval.push(v.x, v.y);\n }\n }\n return retval;\n }\n static findCamera(items) {\n return (items || []).find(r => isCamera(r) && !r.hide);\n }\n clipPixel(evt, viewport) {\n if (viewport instanceof HTMLElement) {\n viewport = Utils.offsetRect(viewport);\n }\n return _clipPoint(evt, viewport);\n }\n}\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, P, Watch, PropertyConverters, Utils, CustomElementUtils } from '@pacem/pacem-core';\nimport { Colors } from '@pacem/pacem-foundation';\nimport { Geometry } from '@pacem/pacem-numerical';\nimport { StalePropertyFlag, isMesh, isUi3DObject, Pacem3DAdapterElement, Pacem3DObjectElement, Pacem3DGroupElement, Pacem3DLightElement, Pacem3DCameraElement, Pacem3DPerspectiveCameraElement, Pacem3DOrthographicCameraElement, Pacem3DMeshElement } from '../types';\nimport { MeshGeometry, LineGeometry } from '../geometry';\nimport { AdapterUtils } from './shared';\nimport { isStandardMaterial, isPhongMaterial, isLambertMaterial, isLineMaterial, isMaterial } from '../materials/material';\n//namespace Pacem.Components.Drawing3D {\nfunction isMeshGeometry(obj) {\n return AdapterUtils.isMeshGeometry(obj);\n}\nfunction isVector3D(obj) {\n return AdapterUtils.isVector3D(obj);\n}\nfunction flattenVectorArray(array) {\n return AdapterUtils.flattenVectorArray(array);\n}\nconst threeJsVersion = '0.152.2', lastOrbitCtrlJsVersion = '0.147.0';\n;\nconst consts = {\n VERSION: threeJsVersion,\n API_URI: `https://unpkg.com/three@${threeJsVersion}/build/three.min.js`,\n ORBIT_URI: `https://unpkg.com/three@${lastOrbitCtrlJsVersion}/examples/js/controls/OrbitControls.js`,\n LOADERS: [\n //`https://unpkg.com/three@${threeJsVersion}/examples/js/loaders/OBJLoader.js`,\n //`https://unpkg.com/three@${threeJsVersion}/examples/js/loaders/MTLLoader.js`,\n ],\n DEFAULT_MATERIAL: function () {\n return new THREE.MeshStandardMaterial({ color: '#069', flatShading: true });\n }\n};\nfunction matrix3DToMatrix4(m) {\n const matrix = new THREE.Matrix4();\n matrix.set(m.m11, m.m12, m.m13, m.m14, m.m21, m.m22, m.m23, m.m24, m.m31, m.m32, m.m33, m.m34, m.offsetX, m.offsetY, m.offsetZ, m.m44);\n return matrix;\n}\n// as of https://codepen.io/discoverthreejs/full/vwVeZB\nfunction fitCameraToSelection(camera, controls /* OrbitControls */, selection, fitOffset = 1.333) {\n const box = new THREE.Box3();\n for (const object of selection) {\n box.expandByObject(object);\n }\n const size = box.getSize(new THREE.Vector3());\n const center = box.getCenter(new THREE.Vector3());\n const maxSize = Math.max(size.x, size.y, size.z);\n const fitHeightDistance = maxSize / (2 * Math.atan(Math.PI * camera.fov / 360));\n const fitWidthDistance = fitHeightDistance / camera.aspect;\n const distance = fitOffset * Math.max(fitHeightDistance, fitWidthDistance);\n const hasControls = !Utils.isNull(controls);\n var direction;\n if (hasControls) {\n direction = controls.target.clone()\n .sub(camera.position)\n .normalize()\n .multiplyScalar(distance);\n controls.maxDistance = distance * 10;\n controls.target.copy(center);\n }\n camera.near = distance / 100;\n camera.far = distance * 100;\n camera.updateProjectionMatrix();\n if (hasControls) {\n camera.position.copy(controls.target).sub(direction);\n controls.update();\n }\n}\nfunction flattenMatrix3D(m) {\n return [\n // right way to translate the matrix3D to matrix4\n m.m11, m.m21, m.m31, m.offsetX,\n m.m12, m.m22, m.m32, m.offsetY,\n m.m13, m.m23, m.m33, m.offsetZ,\n m.m14, m.m24, m.m34, m.m44,\n ];\n}\nfunction nodeGeometryToBufferGeometry(mesh) {\n const geometry = new THREE.BufferGeometry();\n const vertices = flattenVectorArray(mesh.positions);\n geometry.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3));\n if (mesh instanceof MeshGeometry) {\n if (!Utils.isNullOrEmpty(mesh.triangleIndices)) {\n geometry.setIndex(mesh.triangleIndices);\n }\n const vertices = flattenVectorArray(mesh.positions);\n geometry.setAttribute('position', new THREE.Float32BufferAttribute(vertices, 3));\n const uvs = flattenVectorArray(mesh.textureCoordinates);\n geometry.setAttribute('uv', new THREE.Float32BufferAttribute(uvs, 2));\n if (Utils.isNullOrEmpty(mesh.normals)) {\n geometry.computeVertexNormals();\n }\n else {\n const normals = flattenVectorArray(mesh.normals);\n geometry.setAttribute('normal', new THREE.Float32BufferAttribute(normals, 3));\n }\n }\n return geometry;\n}\nfunction lightToLight(item) {\n var light;\n switch (item.type) {\n case 'spot':\n const spotLight = new THREE.SpotLight();\n spotLight.target.position.set(item.target.x, item.target.y, item.target.z);\n light = spotLight;\n break;\n default:\n light = new THREE.PointLight();\n break;\n }\n return light;\n}\nfunction materialToMaterial(material) {\n if (Utils.isNull(material)) {\n return null;\n }\n const lineBase = {\n color: typeof material.color === 'string' ? material.color : Colors.stringify(material.color),\n opacity: material.opacity ?? 1,\n transparent: true,\n wireframe: material.wireframe ?? false,\n visible: material.visible ?? true\n };\n const base = Utils.extend({}, lineBase, { wireframe: material.wireframe ?? false });\n const mipMapMaterial = (m) => {\n if (material.map) {\n m['map'] = new THREE.TextureLoader().load(material.map, _ => {\n // console.log('texture loaded!');\n m.needsUpdate = true;\n });\n }\n return m;\n };\n if (isStandardMaterial(material)) {\n const std = mipMapMaterial(new THREE.MeshStandardMaterial(Utils.extend(base, {\n roughness: material.roughness,\n metalness: material.metalness,\n emissive: material.emissiveColor,\n flatShading: material.flatShading,\n refractionRatio: material.refractionRatio,\n })));\n return std;\n }\n else if (isPhongMaterial(material)) {\n const phong = mipMapMaterial(new THREE.MeshPhongMaterial(Utils.extend(base, {\n shininess: material.shininess,\n emissive: material.emissiveColor,\n flatShading: material.flatShading,\n specular: material.specularColor,\n reflectivity: material.reflectivity,\n refractionRatio: material.refractionRatio,\n })));\n return phong;\n }\n else if (isLambertMaterial(material)) {\n const lambert = mipMapMaterial(new THREE.MeshLambertMaterial(Utils.extend(base, {\n emissive: material.emissiveColor,\n reflectivity: material.reflectivity,\n refractionRatio: material.refractionRatio,\n })));\n return lambert;\n }\n else if (isLineMaterial(material)) {\n const dash = material.dashArray && material.dashArray[0] || null, gap = material.dashArray && material.dashArray.length > 1 && material.dashArray[1] || dash;\n const lineMatOptions = Utils.extend(lineBase, {\n linecap: material.lineCap ?? 'round',\n linejoin: material.lineJoin ?? 'round',\n linewidth: material.lineWidth ?? 1\n });\n return Utils.isNullOrEmpty(material.dashArray) ?\n new THREE.LineBasicMaterial(lineMatOptions)\n : new THREE.LineDashedMaterial(Utils.extend({ dashSize: dash, gapSize: gap }, lineMatOptions));\n }\n else if (isMaterial(material)) {\n const basic = mipMapMaterial(new THREE.MeshBasicMaterial(base));\n return basic;\n }\n else {\n return null;\n }\n}\nfunction materialToMaterials(frontMaterial, backMaterial, multiAllowed) {\n // material\n const multi = multiAllowed;\n // composite\n const materials = [];\n // front mat\n const material = materialToMaterial(frontMaterial);\n if (!Utils.isNull(material)) {\n material.side = THREE.FrontSide;\n materials.push(material);\n }\n // back mat\n if (!Utils.isNull(backMaterial)) {\n if (backMaterial == frontMaterial) {\n material.side = THREE.DoubleSide;\n }\n else {\n // multi-material\n const backsideMaterial = materialToMaterial(backMaterial);\n if (!Utils.isNull(backsideMaterial)) {\n backsideMaterial.side = THREE.BackSide;\n materials.push(backsideMaterial);\n }\n }\n }\n return multi && materials.length > 1 ? materials : material;\n}\nfunction load(item) {\n if (!Utils.isNullOrEmpty(item.content)) {\n const type = item.type?.toLowerCase();\n switch (type) {\n case 'obj':\n const obj = new THREE['OBJLoader']();\n return obj.parse(item.content);\n default:\n const loader = new THREE.ObjectLoader();\n return loader.parse(item.content);\n }\n }\n else {\n throw new Error('Missing content.');\n }\n}\nfunction meshType(geometry) {\n return geometry instanceof LineGeometry ? THREE.Line : THREE.Mesh;\n}\nfunction build(mesh) {\n if (Utils.isNullOrEmpty(mesh.geometry)) {\n return null;\n }\n const ctor = meshType(mesh.geometry);\n return new ctor();\n}\nfunction isTHREEAvailable() {\n return 'THREE' in window;\n}\nasync function whenTHREEAvailable(...args) {\n const start = Date.now();\n var initialized = false;\n do {\n initialized = isTHREEAvailable();\n for (let pred of args) {\n initialized &&= pred();\n }\n if (!initialized) {\n await new Promise(resolve => setTimeout(resolve, 500));\n }\n } while (!initialized && (Date.now() - start) < 30000);\n if (!initialized) {\n throw new Error('The wait for THREE adapter initialization timed out.');\n }\n}\nlet Pacem3DThreeAdapterElement = class Pacem3DThreeAdapterElement extends Pacem3DAdapterElement {\n constructor() {\n super(...arguments);\n this._renderer = null;\n this._camera = null;\n this._scene = null;\n this._orbitCtrls = null;\n this._objects = new WeakMap();\n this._dict = {};\n this._orbitControlsDelegate = (_) => {\n };\n this._ensureAndRefresh = (item, object3D, parent) => {\n object3D.matrixAutoUpdate = false;\n // choose whether to render the object or not\n if (object3D.visible = !item.hide) {\n // the modeling part\n // 1. pacem 3d mesh\n if (isMesh(item)) {\n let mesh3D = object3D;\n if (item.flags.indexOf(StalePropertyFlag.Geometry) >= 0) {\n mesh3D.geometry.dispose();\n // swap Line <-> Mesh according to the geometry\n const mesh3D2 = build(item);\n if (mesh3D2.constructor.name !== mesh3D.constructor.name) {\n parent.remove(object3D);\n delete this._dict[object3D.id];\n object3D = mesh3D = mesh3D2;\n }\n // /swap\n mesh3D.geometry = nodeGeometryToBufferGeometry(item.geometry);\n }\n if (item.flags.indexOf(StalePropertyFlag.Material) >= 0) {\n if (Utils.isArray(mesh3D.material)) {\n for (let m of mesh3D.material) {\n m.dispose();\n }\n }\n else {\n mesh3D.material.dispose();\n }\n mesh3D.material = materialToMaterials(item.material) || consts.DEFAULT_MATERIAL();\n }\n }\n // 2. 3d 'native' object\n else if (item instanceof Pacem3DObjectElement\n && (item.flags.indexOf(StalePropertyFlag.Material) >= 0 || item.flags.indexOf(StalePropertyFlag.Geometry) >= 0)) {\n // swap reference\n object3D.parent && object3D.parent.remove(object3D);\n object3D = load(item);\n }\n // 3. grouping object\n else if (item instanceof Pacem3DGroupElement) {\n if (item.flags.indexOf(StalePropertyFlag.Children) >= 0) {\n // remove all children\n for (let j = object3D.children.length - 1; j >= 0; j--) {\n const child = object3D.children[j];\n object3D.remove(child);\n }\n // re-create\n for (let child of item.items) {\n this._addOrUpdateItem(child, object3D);\n }\n }\n }\n // 4. light\n else if (item instanceof Pacem3DLightElement) {\n const light = object3D;\n if (item.flags.indexOf(StalePropertyFlag.Light) >= 0) {\n light.color = new THREE.Color(item.color);\n light.intensity = item.intensity;\n }\n }\n // the configuring part\n let posv = item.position; // || new THREE.Vector3(0, 0, 0);\n if (isUi3DObject(item)\n && !Utils.isNull(item.transformMatrix)\n && (item.flags.indexOf(StalePropertyFlag.Position) >= 0 || item.flags.indexOf(StalePropertyFlag.Transform) >= 0)) {\n const positionMatrix = Geometry.LinearAlgebra.Matrix3D.from(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, posv.x, posv.y, posv.z, 1);\n // item.transformMatrix is a local matrix thus\n // prepend in the multiplication (i.e. FIRST apply transform THEN apply positioning)\n const transformMatrix = Geometry.LinearAlgebra.Matrix3D.multiply(item.transformMatrix, positionMatrix);\n THREE.Matrix4.prototype.set.apply(object3D.matrix, flattenMatrix3D(transformMatrix));\n //object3D.updateMatrix();\n }\n else if (item.flags.indexOf(StalePropertyFlag.Position) >= 0) {\n object3D.position.set(posv.x, posv.y, posv.z);\n object3D.updateMatrix();\n }\n }\n object3D.userData = item.tag;\n if (Utils.isNull(parent.getObjectById(object3D.id))) {\n parent.add(object3D);\n this._dict[object3D.id] = item;\n }\n // clear flags\n item.flags.splice(0);\n return object3D;\n };\n //#endregion\n }\n _assertMonoStage(scene) {\n if (scene != this._3d && !Utils.isNull(this._3d)) {\n throw new Error('Stage mismatch.');\n }\n }\n dispose(scene) {\n // do nothing\n }\n snapshot(scene, background, type, quality) {\n if (scene != this._3d) {\n return Promise.resolve(null);\n }\n const jpeg = !Utils.isNullOrEmpty(background), mime = type ?? (jpeg ? 'image/jpeg' : null), compression = quality ?? (jpeg ? .9 : null);\n return new Promise((resolve, _) => {\n this.render();\n Utils.snapshotElement(this._stage, background, mime, compression).then(resolve);\n });\n }\n project(scene, point3D) {\n this._assertMonoStage(scene);\n // check feasibility\n if (Utils.isNull(this._camera) || Utils.isNull(this._stage))\n return null;\n //\n const stage = this._stage;\n const vector = new THREE.Vector3(point3D.x, point3D.y, point3D.z);\n const width = stage.width, height = stage.height;\n const widthHalf = width / 2, heightHalf = height / 2;\n const point = vector.project(this._camera);\n const x = (point.x * widthHalf) + widthHalf;\n const y = -(point.y * heightHalf) + heightHalf;\n return { x: x, y: y };\n }\n zoomFit(scene, ...items) {\n this._assertMonoStage(scene);\n return new Promise((resolve, reject) => {\n const camera = this._camera;\n const map = this._objects;\n const targets = items.filter(o => map.has(o)).map(o => map.get(o));\n if (Utils.isNull(camera) || Utils.isNullOrEmpty(targets)) {\n resolve();\n }\n fitCameraToSelection(camera, this._orbitCtrls, targets);\n resolve();\n });\n }\n getScene(scene) {\n this._assertMonoStage(scene);\n return this._scene;\n }\n raycast(scene, point, size, callback) {\n this._assertMonoStage(scene);\n if (isTHREEAvailable() && !Utils.isNull(this._camera)) {\n const camera = this._camera;\n const vector = new THREE.Vector2((point.x / size.width) * 2 - 1, -(point.y / size.height) * 2 + 1);\n const raycaster = new THREE.Raycaster();\n raycaster.setFromCamera(vector, camera);\n const intersects = raycaster.intersectObjects(this._scene.children, true);\n let obj;\n let intersection;\n let j = 0;\n while (intersects.length > j && (intersection = intersects[j++]) && (obj = intersection.object)) {\n const item = this._dict[obj.id];\n if (item.inert) {\n continue;\n }\n const v = intersection.point, x = v.x, y = v.y, z = v.z, point = { x, y, z };\n callback({ object: this._dict[obj.id], point });\n return;\n }\n }\n callback(null);\n }\n // #region ABSTRACT IMPLEMENTATION\n async initialize(container) {\n if (!Utils.isNull(this._stage)) {\n return this._stage;\n }\n this._3d = container;\n const wrapper = container.stage;\n const stage = this._stage = document.createElement('canvas');\n wrapper.innerHTML = '';\n wrapper.appendChild(stage);\n if (!isTHREEAvailable()) {\n await CustomElementUtils.importjs(consts.API_URI);\n await whenTHREEAvailable();\n await Promise.all([CustomElementUtils.importjs(consts.ORBIT_URI)]\n .concat(consts.LOADERS.map(js => CustomElementUtils.importjs(js))));\n }\n // here comes THREE.js\n this._scene = new THREE.Scene();\n // this._scene.add(new THREE.Mesh(new THREE.PlaneGeometry(1, 1, 1, 1), consts.DEFAULT_MATERIAL()));\n this.invalidateSize(container);\n let w = this._stage.width, h = this._stage.height;\n //if (!ctrl.renderer)\n let parameters = {\n canvas: stage, antialias: true, stencil: false, alpha: container.transparent ?? true //, clearAlpha: 1\n };\n this._renderer = new THREE.WebGLRenderer(parameters);\n this._renderer.setSize(w, h);\n if (container.background && !container.transparent) {\n let clr = container.background;\n if (typeof clr === 'string') {\n clr = Colors.parse(clr);\n }\n const theejsClr = new THREE.Color(clr.r, clr.g, clr.b);\n this._renderer.setClearColor(theejsClr, clr.a);\n }\n this.orbit = container.orbit;\n return stage;\n }\n _setCamera(cam) {\n this._camera = cam;\n this.invalidateSize(this._3d);\n this._disposeOrbitControls();\n // re-init\n if (this.orbit) {\n this._initOrbitControls();\n }\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (name === 'orbit') {\n if (val === true)\n this._initOrbitControls();\n else\n this._disposeOrbitControls();\n }\n }\n _initOrbitControls() {\n const cam = this._camera;\n if (Utils.isNull(this._3d) || Utils.isNull(cam)) {\n return;\n }\n const controls = this._orbitCtrls = new THREE['OrbitControls'](cam, this._3d.stage);\n controls.addEventListener('change', this._orbitControlsDelegate);\n }\n _disposeOrbitControls() {\n const controls = this._orbitCtrls;\n if (Utils.isNull(controls)) {\n return;\n }\n controls.removeEventListener('change', this._orbitControlsDelegate);\n controls.dispose();\n }\n _updateRenderer(container, renderer = this._renderer) {\n if (!container.transparent) {\n if (container.background) {\n let clr = container.background;\n if (typeof clr === 'string') {\n clr = Colors.parse(clr);\n }\n const theejsClr = new THREE.Color(clr.r, clr.g, clr.b);\n renderer.setClearColor(theejsClr, clr.a);\n }\n else {\n renderer.setClearColor(null);\n }\n }\n else {\n renderer.setClearAlpha(0);\n }\n }\n invalidateSize(scene, size = scene.size) {\n this._assertMonoStage(scene);\n if (!isTHREEAvailable() || Utils.isNull(size)) {\n return;\n }\n let w = size.width;\n let h = size.height;\n this._stage.width = w;\n this._stage.height = h;\n let camera = this._camera;\n if (camera instanceof THREE.PerspectiveCamera) {\n camera.aspect = w / h;\n camera.updateProjectionMatrix();\n }\n if (this._renderer) {\n this._renderer.setSize(w, h);\n this._updateRenderer(scene);\n }\n }\n removeItem(scene, item) {\n this._assertMonoStage(scene);\n const bag = this._objects;\n const obj3d = bag.get(item);\n if (!Utils.isNull(obj3d)) {\n this._scene.remove(obj3d);\n delete this._dict[obj3d.id];\n bag.delete(item);\n }\n }\n updateItem(scene, item) {\n this._assertMonoStage(scene);\n const bag = this._objects;\n if (!Utils.isNull(item.parent) && bag.has(item.parent)) {\n const parent3d = bag.get(item.parent);\n this._addOrUpdateItem(item, parent3d);\n }\n else {\n this._addOrUpdateItem(item);\n }\n }\n addItem(scene, item) {\n this._assertMonoStage(scene);\n this._addOrUpdateItem(item);\n }\n _addOrUpdateItem(item, parent = this._scene) {\n if (!isTHREEAvailable() || Utils.isNull(parent)) {\n return;\n }\n if (item instanceof Pacem3DCameraElement) {\n if (item instanceof Pacem3DPerspectiveCameraElement) {\n var pcam;\n if (this._camera instanceof THREE.PerspectiveCamera) {\n var pcam = this._camera;\n }\n else {\n pcam = new THREE.PerspectiveCamera();\n }\n const lookAtVector = new THREE.Vector3(item.lookAt.x, item.lookAt.y, item.lookAt.z);\n pcam.lookAt(lookAtVector);\n pcam.position.set(item.position.x, item.position.y, item.position.z);\n pcam.fov = item.fov;\n pcam.aspect = item.aspect;\n pcam.near = item.near;\n pcam.far = item.far;\n //\n this._setCamera(pcam);\n //\n const orbit = this._orbitCtrls;\n if (!Utils.isNull(orbit) && orbit.object === pcam) {\n orbit.target = lookAtVector;\n orbit.update();\n }\n }\n else if (item instanceof Pacem3DOrthographicCameraElement) {\n // bunch of duplicated code\n // no need to refactor since it's a deprecating branch of development\n var ocam;\n if (this._camera instanceof THREE.OrthographicCamera) {\n var ocam = this._camera;\n }\n else {\n ocam = new THREE.OrthographicCamera();\n }\n const lookAtVector = new THREE.Vector3(item.lookAt.x, item.lookAt.y, item.lookAt.z);\n ocam.lookAt(lookAtVector);\n ocam.position.set(item.position.x, item.position.y, item.position.z);\n ocam.left = item.left;\n ocam.right = item.right;\n ocam.top = item.top;\n ocam.bottom = item.bottom;\n ocam.near = item.near;\n ocam.far = item.far;\n //\n this._setCamera(ocam);\n //\n const orbit = this._orbitCtrls;\n if (!Utils.isNull(orbit) && orbit.object === ocam) {\n orbit.target = lookAtVector;\n orbit.update();\n }\n }\n else {\n // cam not supported\n throw new Error(`Camera ${item} not supported.`);\n }\n }\n else {\n if (!this._objects.has(item)) {\n // adding\n const then = (object3D) => {\n // clear flags\n // item.flags.splice(0);\n if (object3D) {\n object3D = this._ensureAndRefresh(item, object3D, parent);\n this._objects.set(item, object3D);\n }\n else {\n // object not built\n // throw?\n }\n };\n // TODO: switch to interface matching\n if (item instanceof Pacem3DObjectElement) {\n const mesh = load(item);\n then(mesh);\n }\n else if (item instanceof Pacem3DMeshElement) {\n // beware! a change in the geometry could cause a change in the object3D type\n const mesh = build(item);\n then(mesh);\n }\n else if (item instanceof Pacem3DLightElement) {\n const light = lightToLight(item);\n then(light);\n }\n else if (item instanceof Pacem3DGroupElement) {\n const group = new THREE.Group();\n then(group);\n }\n }\n else {\n // updating\n const obj = this._objects.get(item);\n const objOut = this._ensureAndRefresh(item, obj, parent);\n if (objOut != obj) {\n this._objects.set(item, objOut);\n }\n }\n }\n }\n render() {\n if (this._camera) {\n this._renderer.render(this._scene, this._camera);\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Boolean })\n], Pacem3DThreeAdapterElement.prototype, \"orbit\", void 0);\nPacem3DThreeAdapterElement = __decorate([\n CustomElement({ tagName: P + '-3d-three-adapter' })\n], Pacem3DThreeAdapterElement);\nexport { Pacem3DThreeAdapterElement };\n","//namespace Pacem.Drawing3D.WebGPU {\nexport const LABEL_PREFIX = 'pacem-3d-';\nexport const U32_MAX = 4_294_967_295;\n// #region vertex state\nexport const VERTEX_BUFFER_INDEX_MESH_POSITION = 0;\nexport const VERTEX_BUFFER_INDEX_MESH_NORMAL = 1;\nexport const VERTEX_BUFFER_INDEX_MESH_UV = 2;\nexport const VERTEX_OUTPUT_LOCATION_NORMAL = 0;\nexport const VERTEX_OUTPUT_LOCATION_VERTEX = 1;\nexport const VERTEX_OUTPUT_LOCATION_UV = 2;\nexport const VERTEX_OUTPUT_LOCATION_INDEX = 3;\nexport const VERTEX_OUTPUT_LOCATION_RAY = 4;\nexport const VERTEX_OUTPUT_LOCATION_INSTANCE = 5;\nexport const UNIFORM_GROUP_INDEX_TRANSFORM = 1;\nexport const UNIFORM_GROUP_INDEX_CAMERA = 0;\nexport const UNIFORM_GROUP_INDEX_INTERACTION = UNIFORM_GROUP_INDEX_CAMERA; // put it in camera same binding group\nexport const STORAGE_GROUP_INDEX_LINE = 2;\nexport const UNIFORM_GROUP_INDEX_COLORPICKING = 2;\nexport const UNIFORM_BINDING_INDEX_TRANSFORM = 0;\nexport const UNIFORM_BINDING_INDEX_CAMERA = 0;\nexport const UNIFORM_BINDING_INDEX_INTERACTION = 1;\n// #endregion\n// #region fragment state\nexport const MATERIAL_GROUP_INDEX = 2;\nexport const UNIFORM_GROUP_INDEX_LIGHTING = MATERIAL_GROUP_INDEX + 1;\nexport const STORAGE_MATERIAL_INDEX = 0;\nexport const SAMPLER_BINDING_INDEX = 1;\nexport const TEXTURE_BINDING_INDEX = 2;\nexport const MATERIAL_REFERENCE = 'material';\nexport const VERTEX_COLOR_REFERENCE = 'color';\nexport const AMBIENT_COLOR_REFERENCE = 'ambient';\nexport const LIGHTING_COLOR_REFERENCE = 'lighting';\n// #endregion\n// #region WGSL\nexport const WGSL_VERTEXINPUT_STRUCT_NAME = 'VertexInput';\nexport const WGSL_VERTEXOUTPUT_STRUCT_NAME = 'VertexOutput';\nexport const WGSL_INTERACTIONDATA_STRUCT_NAME = 'InteractionData';\n// #endregion\n// Kinda polyfill for WebGPU constants, as TypeScript 6.0 does include WebGPU types but does NOT include these constants for magic numbers:\nexport var GPUBufferUsage;\n(function (GPUBufferUsage) {\n GPUBufferUsage[GPUBufferUsage[\"COPY_SRC\"] = 4] = \"COPY_SRC\";\n GPUBufferUsage[GPUBufferUsage[\"COPY_DST\"] = 8] = \"COPY_DST\";\n GPUBufferUsage[GPUBufferUsage[\"INDEX\"] = 16] = \"INDEX\";\n GPUBufferUsage[GPUBufferUsage[\"INDIRECT\"] = 256] = \"INDIRECT\";\n GPUBufferUsage[GPUBufferUsage[\"MAP_READ\"] = 1] = \"MAP_READ\";\n GPUBufferUsage[GPUBufferUsage[\"MAP_WRITE\"] = 2] = \"MAP_WRITE\";\n GPUBufferUsage[GPUBufferUsage[\"QUERY_RESOLVE\"] = 512] = \"QUERY_RESOLVE\";\n GPUBufferUsage[GPUBufferUsage[\"STORAGE\"] = 128] = \"STORAGE\";\n GPUBufferUsage[GPUBufferUsage[\"UNIFORM\"] = 64] = \"UNIFORM\";\n GPUBufferUsage[GPUBufferUsage[\"VERTEX\"] = 32] = \"VERTEX\";\n})(GPUBufferUsage || (GPUBufferUsage = {}));\nexport var GPUTextureUsage;\n(function (GPUTextureUsage) {\n GPUTextureUsage[GPUTextureUsage[\"COPY_SRC\"] = 1] = \"COPY_SRC\";\n GPUTextureUsage[GPUTextureUsage[\"COPY_DST\"] = 2] = \"COPY_DST\";\n GPUTextureUsage[GPUTextureUsage[\"RENDER_ATTACHMENT\"] = 16] = \"RENDER_ATTACHMENT\";\n GPUTextureUsage[GPUTextureUsage[\"STORAGE_BINDING\"] = 8] = \"STORAGE_BINDING\";\n GPUTextureUsage[GPUTextureUsage[\"TEXTURE_BINDING\"] = 4] = \"TEXTURE_BINDING\";\n})(GPUTextureUsage || (GPUTextureUsage = {}));\nexport var GPUShaderStage;\n(function (GPUShaderStage) {\n GPUShaderStage[GPUShaderStage[\"VERTEX\"] = 1] = \"VERTEX\";\n GPUShaderStage[GPUShaderStage[\"FRAGMENT\"] = 2] = \"FRAGMENT\";\n GPUShaderStage[GPUShaderStage[\"COMPUTE\"] = 4] = \"COMPUTE\";\n})(GPUShaderStage || (GPUShaderStage = {}));\nexport var GPUMapMode;\n(function (GPUMapMode) {\n GPUMapMode[GPUMapMode[\"READ\"] = 1] = \"READ\";\n GPUMapMode[GPUMapMode[\"WRITE\"] = 2] = \"WRITE\";\n})(GPUMapMode || (GPUMapMode = {}));\n","export var WGSLBindingType;\n(function (WGSLBindingType) {\n WGSLBindingType[\"Mesh\"] = \"mesh\";\n WGSLBindingType[\"Camera\"] = \"camera\";\n WGSLBindingType[\"Texture\"] = \"texture\";\n WGSLBindingType[\"Light\"] = \"light\";\n WGSLBindingType[\"Interaction\"] = \"interaction\";\n})(WGSLBindingType || (WGSLBindingType = {}));\n","import { GPUBufferUsage } from './constants';\n//namespace Pacem.Drawing3D.WebGPU {\nexport class Buffers {\n static create(device, data, label = '') {\n const buffer = device.createBuffer({\n size: data.byteLength, label,\n usage: GPUBufferUsage.VERTEX | GPUBufferUsage.COPY_DST,\n mappedAtCreation: true\n });\n new Float32Array(buffer.getMappedRange()).set(data);\n buffer.unmap();\n return buffer;\n }\n static createUniform(device, data, label = '') {\n return device.createBuffer({\n size: data.byteLength, label,\n usage: GPUBufferUsage.UNIFORM | GPUBufferUsage.COPY_DST,\n });\n }\n static createStorage(device, data, label = '') {\n return device.createBuffer({\n size: data.byteLength, label,\n usage: GPUBufferUsage.STORAGE | GPUBufferUsage.COPY_DST,\n });\n }\n static createIndexed(device, data, label = '') {\n const buffer = device.createBuffer({\n size: data.byteLength, label,\n usage: GPUBufferUsage.INDEX | GPUBufferUsage.COPY_DST,\n mappedAtCreation: true\n });\n new Uint16Array(buffer.getMappedRange()).set(data);\n buffer.unmap();\n return buffer;\n }\n}\nexport class BufferLayouts {\n static createVertex(shaderLocationStart = 0, size = 3, ...sizes) {\n const attributes = [];\n let fullSize = 0, index = 0;\n for (let sz of [size].concat(sizes)) {\n attributes.push({\n shaderLocation: shaderLocationStart + index,\n offset: fullSize * Float32Array.BYTES_PER_ELEMENT,\n format: `float32x${sz}`,\n });\n fullSize += sz;\n index++;\n }\n return {\n arrayStride: fullSize /* x, y, z */ * Float32Array.BYTES_PER_ELEMENT,\n attributes,\n stepMode: 'vertex'\n };\n }\n}\n","import { Utils } from '@pacem/pacem-core';\nimport { VERTEX_OUTPUT_LOCATION_NORMAL, VERTEX_OUTPUT_LOCATION_VERTEX, VERTEX_OUTPUT_LOCATION_UV, VERTEX_OUTPUT_LOCATION_INDEX, VERTEX_OUTPUT_LOCATION_RAY, VERTEX_OUTPUT_LOCATION_INSTANCE, MATERIAL_GROUP_INDEX, STORAGE_MATERIAL_INDEX, VERTEX_COLOR_REFERENCE, LIGHTING_COLOR_REFERENCE, AMBIENT_COLOR_REFERENCE } from '../constants';\nconst DefaultBasicMaterialFragmentOptions = {\n outputNormalLocation: VERTEX_OUTPUT_LOCATION_NORMAL,\n outputVertexLocation: VERTEX_OUTPUT_LOCATION_VERTEX,\n outputUvLocation: VERTEX_OUTPUT_LOCATION_UV,\n outputVertexIndexLocation: VERTEX_OUTPUT_LOCATION_INDEX,\n outputRayIndexLocation: VERTEX_OUTPUT_LOCATION_RAY,\n outputInstanceIndexLocation: VERTEX_OUTPUT_LOCATION_INSTANCE,\n storageMaterialGroupIndex: MATERIAL_GROUP_INDEX,\n storageMaterialBindingIndex: STORAGE_MATERIAL_INDEX,\n};\nfunction adaptWGSLStringArray(array = []) {\n return array.join('\\r\\n');\n}\nfunction adaptWGSLModifierStringArray(array = []) {\n let output = '';\n for (let modifier of array) {\n const trimmed = modifier.trim();\n if (trimmed.endsWith(';')) {\n output += (trimmed + '\\r\\n\\t');\n }\n else {\n output += `${VERTEX_COLOR_REFERENCE} = ${trimmed};\\r\\n\\t`;\n }\n }\n return output;\n}\nexport function getBasicMaterialFragmentWgsl(extensions = {}, options = DefaultBasicMaterialFragmentOptions) {\n const opts = Utils.extend({}, DefaultBasicMaterialFragmentOptions, options);\n const definitions = adaptWGSLStringArray(extensions.definitions), bindings = adaptWGSLStringArray(extensions.bindings), modifiers = adaptWGSLModifierStringArray(extensions.modifiers);\n const color = VERTEX_COLOR_REFERENCE, lighting = LIGHTING_COLOR_REFERENCE, ambient = AMBIENT_COLOR_REFERENCE;\n return `// definitions\r\n\r\n${definitions}\r\n\r\n// bindings\r\n@group(${opts.storageMaterialGroupIndex}) @binding(${opts.storageMaterialBindingIndex}) var<storage, read> diffuseColor: vec4f;\r\n${bindings}\r\n\r\nconst empty = vec4f(0,0,0,0);\r\nconst white = vec4f(1,1,1,1);\r\n\r\n@fragment fn main (\r\n @builtin(position) position: vec4f, // clip-space position\r\n @location(${opts.outputNormalLocation}) normal: vec3f, // world-space normal\r\n @location(${opts.outputVertexLocation}) vertex: vec3f, // world-space position\r\n @location(${opts.outputUvLocation}) uv: vec2f,\r\n @location(${opts.outputVertexIndexLocation}) @interpolate(flat) index: u32, // vertex index,\r\n @location(${opts.outputRayIndexLocation}) ray: vec3f, // ray (eye-to-vertex) vector\r\n @location(${opts.outputInstanceIndexLocation}) @interpolate(flat) instance : u32, // instance index\r\n) -> @location(0) vec4f {\r\n var ${color} = diffuseColor;\r\n var ${ambient}: vec4f = empty;\r\n var ${lighting}: vec4f = empty;\r\n\r\n // modifiers\r\n ${modifiers}\r\n\r\n ${lighting} = select(white, ${lighting}, ${lighting}.a > 0);\r\n return ${color} * ${lighting} + ${ambient};\r\n}`;\n}\n","import { Utils } from '@pacem/pacem-core';\nimport { STORAGE_GROUP_INDEX_LINE, STORAGE_MATERIAL_INDEX } from '../constants';\nconst DefaultLineMaterialFragmentOptions = {\n outputInstanceIndexLocation: 0,\n outputVertexIndexLocation: 1,\n storageMaterialGroupIndex: STORAGE_GROUP_INDEX_LINE + 1,\n storageMaterialBindingIndex: STORAGE_MATERIAL_INDEX,\n};\nfunction adaptWGSLStringArray(array = []) {\n return array.join('\\r\\n');\n}\nfunction adaptWGSLModifierStringArray(array = []) {\n let output = '';\n for (let modifier of array) {\n const trimmed = modifier.trim();\n if (trimmed.endsWith(';')) {\n output += (trimmed + '\\r\\n');\n }\n else {\n output += `output = ${trimmed};\\r\\n`;\n }\n }\n return output;\n}\nexport function getLineMaterialFragmentWgsl(extensions = {}, options = DefaultLineMaterialFragmentOptions) {\n const opts = Utils.extend({}, DefaultLineMaterialFragmentOptions, options);\n const definitions = adaptWGSLStringArray(extensions.definitions), bindings = adaptWGSLStringArray(extensions.bindings), modifiers = adaptWGSLModifierStringArray(extensions.modifiers);\n return `// definitions\r\n${definitions}\r\n\r\n// bindings\r\n@group(${options.storageMaterialGroupIndex}) @binding(${options.storageMaterialBindingIndex}) var<storage, read> vertexColors: array<vec4f>;\r\n${bindings}\r\n\r\nfn getVertexColor(index: u32) -> vec4f {\r\n let numColors = arrayLength(&vertexColors);\r\n let vertexColorIndex = index % numColors;\r\n return vertexColors[vertexColorIndex];\r\n}\r\n\r\n@fragment fn main (\r\n @builtin(position) position: vec4f, // clip-space position\r\n @location(${opts.outputInstanceIndexLocation}) @interpolate(flat) instance: u32, // instance index\r\n @location(${opts.outputVertexIndexLocation}) @interpolate(flat) index: u32 // vertex index\r\n) -> @location(0) vec4f {\r\n var output = getVertexColor(index);\r\n\r\n // modifiers\r\n ${modifiers}\r\n\r\n return output;\r\n}`;\n}\n","import { Utils } from '@pacem/pacem-core';\nimport { Colors } from '@pacem/pacem-foundation';\nimport { isBasicMaterial, isLineMaterial, KnownShader } from '../../materials/material';\nimport { Buffers } from './buffers';\nimport { GPUTextureUsage } from './constants';\nimport { getBasicMaterialFragmentWgsl } from './wgsl/basic-material-fragment';\nimport { getLineMaterialFragmentWgsl } from './wgsl/line-material-fragment';\nimport { LABEL_PREFIX } from './constants';\n//namespace Pacem.Drawing3D.WebGPU {\nexport class Materials {\n static create(material) {\n if (isBasicMaterial(material)) {\n return new BasicMaterial(material);\n }\n if (isLineMaterial(material)) {\n return new LineMaterial(material);\n }\n throw new TypeError(`Material type '${material.shader}' not supported.`);\n }\n}\nconst EmptyMaterialWGSLDelegates = {\n// empty delegates\n};\nclass MaterialBase {\n constructor(material) {\n if (Utils.isNull(this.#material = material)) {\n throw new ReferenceError(\"Null material provided.\");\n }\n }\n #material;\n get material() { return this.#material; }\n get wgsl() {\n return EmptyMaterialWGSLDelegates;\n }\n buffer({ device }, label = LABEL_PREFIX + 'material-' + this.shader + '-buffer') {\n const { r, g, b, a } = this._diffuseColor();\n const materialValue = new Float32Array([r, g, b, a]);\n return { buffer: Buffers.createStorage(device, materialValue, label), value: materialValue, version: performance.now() };\n }\n _diffuseColor() {\n const { visible, opacity, color } = this.material;\n if (!(visible ?? true)) {\n return { r: 0, g: 0, b: 0, a: 0 };\n }\n const retval = typeof color === 'string' ? Colors.parse(color) : (color ?? { r: 1, g: 1, b: 1, a: 1 });\n if (opacity >= 0 && opacity <= 1) {\n return Utils.extend(retval, { a: retval.a * opacity });\n }\n return retval;\n }\n}\nexport class BasicMaterial extends MaterialBase {\n get shader() {\n return KnownShader.Basic;\n }\n constructor(material) {\n super(material);\n if (material.shader != this.shader) {\n throw new TypeError(\"Basic material expected.\");\n }\n }\n texture({ device }, key = 'texture') {\n const material = this.material;\n if (key === 'texture' && !Utils.isNull(material.texture)) {\n const texBmp = material.texture;\n const texture = device.createTexture({\n format: 'rgba8unorm',\n usage: GPUTextureUsage.TEXTURE_BINDING | GPUTextureUsage.RENDER_ATTACHMENT | GPUTextureUsage.COPY_DST,\n size: [texBmp.width, texBmp.height],\n });\n return { texture, source: texBmp };\n }\n return null;\n }\n // TODO: put it in the material instance/interface\n static { this.fragment = getBasicMaterialFragmentWgsl; }\n}\nexport class LineMaterial extends MaterialBase {\n get shader() {\n return KnownShader.Line;\n }\n constructor(material) {\n super(material);\n if (material.shader != this.shader) {\n throw new TypeError(\"Line material expected.\");\n }\n }\n buffer(ctx, key) {\n switch (key) {\n case 'line':\n const { device, canvas } = ctx;\n const lineMaterial = this.material;\n const lineValue = new Float32Array([canvas.clientWidth, canvas.clientHeight, lineMaterial.lineWidth / 2]);\n return { buffer: Buffers.createUniform(device, lineValue, LABEL_PREFIX + 'line-' + this.shader + '-buffer'), value: lineValue, version: performance.now() };\n default:\n return super.buffer(ctx);\n }\n }\n texture(_) {\n return null;\n }\n static { this.fragment = getLineMaterialFragmentWgsl; }\n}\n","import { WGSL_VERTEXINPUT_STRUCT_NAME, WGSL_VERTEXOUTPUT_STRUCT_NAME, WGSL_INTERACTIONDATA_STRUCT_NAME } from '../constants';\n//namespace Pacem.Drawing3D.WebGPU {\nconst defaultVertexGeometryModifierArgs = ['input', 'data'];\n//const defaultVertexGeometryModifier: VertexInputModifierDelegate = (...defaultVertexGeometryModifierArgs) => {\n// const [inputRef, dataRef] = defaultVertexGeometryModifierArgs;\n// return `fn echo(${inputRef}: ${WGSL_VERTEXINPUT_STRUCT_NAME}, ${dataRef}: ${WGSL_INTERACTIONDATA_STRUCT_NAME}) -> ${WGSL_VERTEXINPUT_STRUCT_NAME} { return ${inputRef}; }`;\n//};\nexport function extractMeshVertexModifierFunctionComponents(wgsl) {\n if (typeof wgsl !== 'string') {\n wgsl = wgsl(...defaultVertexGeometryModifierArgs);\n }\n // regex that remove all the wgsl comments and extract the function name, arguments and body\n const regex = new RegExp(`fn\\\\s+(\\\\w+)\\\\s*\\\\(([^)]*)\\\\)\\\\s*->\\\\s*(${WGSL_VERTEXINPUT_STRUCT_NAME}|${WGSL_VERTEXOUTPUT_STRUCT_NAME})\\\\s*{((.|\\\\n)+)}\\\\s*$`);\n const match = wgsl.match(regex);\n if (match) {\n const name = match[1];\n const args = match[2].split(',').map(arg => {\n const kvp = arg.split(':');\n return { name: kvp[0].trim(), type: kvp[1].trim() };\n });\n if (args.length !== 2\n || args[0].type !== match[3] // the first argument type must match the function return type\n || args[1].type !== WGSL_INTERACTIONDATA_STRUCT_NAME) {\n throw new Error(`Invalid modifier function. Invalid signature types (arg1: ${args[0]?.type}, arg2: ${args[1]?.type})`);\n }\n const body = match[4].trim();\n return { name, args: args.map(i => i.name), body };\n }\n else {\n throw new Error(`Invalid modifier function. Must be a valid WGSL function with the signature: fn name(arg1: ${WGSL_VERTEXINPUT_STRUCT_NAME}|${WGSL_VERTEXOUTPUT_STRUCT_NAME}, arg2: ${WGSL_INTERACTIONDATA_STRUCT_NAME}) -> ${WGSL_VERTEXINPUT_STRUCT_NAME}|${WGSL_VERTEXOUTPUT_STRUCT_NAME}`);\n }\n}\n","import { Utils } from '@pacem/pacem-core';\nimport { VERTEX_OUTPUT_LOCATION_NORMAL, VERTEX_OUTPUT_LOCATION_VERTEX, VERTEX_OUTPUT_LOCATION_UV, VERTEX_OUTPUT_LOCATION_INDEX, VERTEX_OUTPUT_LOCATION_RAY, VERTEX_OUTPUT_LOCATION_INSTANCE, VERTEX_BUFFER_INDEX_MESH_POSITION, VERTEX_BUFFER_INDEX_MESH_NORMAL, VERTEX_BUFFER_INDEX_MESH_UV, UNIFORM_BINDING_INDEX_CAMERA, UNIFORM_GROUP_INDEX_CAMERA, UNIFORM_BINDING_INDEX_TRANSFORM, UNIFORM_GROUP_INDEX_TRANSFORM, UNIFORM_BINDING_INDEX_INTERACTION, UNIFORM_GROUP_INDEX_INTERACTION, WGSL_VERTEXINPUT_STRUCT_NAME, WGSL_VERTEXOUTPUT_STRUCT_NAME, WGSL_INTERACTIONDATA_STRUCT_NAME } from '../constants';\nimport { extractMeshVertexModifierFunctionComponents } from './shared';\nconst DefaultMeshVertexOptions = {\n outputNormalLocation: VERTEX_OUTPUT_LOCATION_NORMAL,\n outputVertexLocation: VERTEX_OUTPUT_LOCATION_VERTEX,\n outputUvLocation: VERTEX_OUTPUT_LOCATION_UV,\n outputVertexIndexLocation: VERTEX_OUTPUT_LOCATION_INDEX,\n outputInstanceIndexLocation: VERTEX_OUTPUT_LOCATION_INSTANCE,\n outputRayLocation: VERTEX_OUTPUT_LOCATION_RAY,\n inputPositionLocation: VERTEX_BUFFER_INDEX_MESH_POSITION,\n inputNormalLocation: VERTEX_BUFFER_INDEX_MESH_NORMAL,\n inputUvLocation: VERTEX_BUFFER_INDEX_MESH_UV,\n uniformViewBindingIndex: UNIFORM_BINDING_INDEX_CAMERA,\n uniformViewGroupIndex: UNIFORM_GROUP_INDEX_CAMERA,\n uniformWorldBindingIndex: UNIFORM_BINDING_INDEX_TRANSFORM,\n uniformWorldGroupIndex: UNIFORM_GROUP_INDEX_TRANSFORM,\n uniformInteractionBindingIndex: UNIFORM_BINDING_INDEX_INTERACTION,\n uniformInteractionGroupIndex: UNIFORM_GROUP_INDEX_INTERACTION,\n};\nexport function getMeshVertexWgsl(options = DefaultMeshVertexOptions) {\n if (options != DefaultMeshVertexOptions) {\n options = Utils.extend({}, DefaultMeshVertexOptions, options);\n }\n // vertex input modifier?\n const modifierInput = options.inputModifier;\n let modifyInstructionInput = 'vertexInput', modifierFnInput = '';\n if (!Utils.isNullOrEmpty(modifierInput)) {\n const { name: modifierName, args: [arg0, arg1], body: modifierBody } = extractMeshVertexModifierFunctionComponents(modifierInput);\n modifyInstructionInput = `${modifierName}(vertexInput, interaction)`;\n modifierFnInput = `fn ${modifierName} (${arg0}: ${WGSL_VERTEXINPUT_STRUCT_NAME}, ${arg1}: ${WGSL_INTERACTIONDATA_STRUCT_NAME}) -> ${WGSL_VERTEXINPUT_STRUCT_NAME} {\r\n ${modifierBody}\r\n}`;\n }\n // vertex output modifier?\n const modifierOutput = options.outputModifier;\n let modifyInstructionOutput = 'output', modifierFnOutput = '';\n if (!Utils.isNullOrEmpty(modifierOutput)) {\n const { name: modifierName, args: [arg0, arg1], body: modifierBody } = extractMeshVertexModifierFunctionComponents(modifierOutput);\n modifyInstructionOutput = `${modifierName}(output, interaction)`;\n modifierFnOutput = `fn ${modifierName} (${arg0}: ${WGSL_VERTEXINPUT_STRUCT_NAME}, ${arg1}: ${WGSL_INTERACTIONDATA_STRUCT_NAME}) -> ${WGSL_VERTEXOUTPUT_STRUCT_NAME} {\r\n ${modifierBody}\r\n}`;\n }\n const opts = Utils.extend({}, DefaultMeshVertexOptions, options);\n return `struct ${WGSL_VERTEXOUTPUT_STRUCT_NAME} {\r\n @builtin(position) position : vec4f, // clip space position\r\n @location(${opts.outputNormalLocation}) normal: vec3f, // world space normal\r\n @location(${opts.outputVertexLocation}) vertex : vec3f, // world space position\r\n @location(${opts.outputUvLocation}) uv : vec2f, // texture coordinates\r\n @location(${opts.outputVertexIndexLocation}) @interpolate(flat) index : u32, // vertex index\r\n @location(${opts.outputRayLocation}) ray : vec3f, // eye-to-point vector in world space\r\n @location(${opts.outputInstanceIndexLocation}) @interpolate(flat) instance : u32, // instance index\r\n}\r\n\r\nstruct ${WGSL_VERTEXINPUT_STRUCT_NAME} {\r\n @location(${opts.inputPositionLocation}) position: vec3f,\r\n @location(${opts.inputNormalLocation}) normal: vec3f,\r\n @location(${opts.inputUvLocation}) uv: vec2f,\r\n @builtin(vertex_index) index: u32,\r\n @builtin(instance_index) instance: u32,\r\n}\r\n\r\nstruct Transforms {\r\n world: mat4x4f,\r\n normal: mat3x3f,\r\n}\r\n\r\nstruct Camera {\r\n view: mat4x4f,\r\n projection: mat4x4f,\r\n position: vec3f,\r\n}\r\n\r\nstruct ${WGSL_INTERACTIONDATA_STRUCT_NAME} {\r\n // mouse coordinatges in NDC space ([-1,1], [-1,1])\r\n cursor: vec2f,\r\n // canvas size in pixels\r\n resolution: vec2f,\r\n // some phase timer (e.g. time since mouse down, or time since last click, etc.)\r\n time: f32,\r\n}\r\n\r\n${modifierFnInput}\r\n\r\n${modifierFnOutput}\r\n\r\n@group(${opts.uniformWorldGroupIndex}) @binding(${opts.uniformWorldBindingIndex}) var<uniform> transforms: Transforms;\r\n@group(${opts.uniformViewGroupIndex}) @binding(${opts.uniformViewBindingIndex}) var<uniform> camera: Camera;\r\n@group(${opts.uniformInteractionGroupIndex}) @binding(${opts.uniformInteractionBindingIndex}) var<uniform> interaction: ${WGSL_INTERACTIONDATA_STRUCT_NAME};\r\n\r\n@vertex fn main(vertexInput: ${WGSL_VERTEXINPUT_STRUCT_NAME}) -> ${WGSL_VERTEXOUTPUT_STRUCT_NAME} {\r\n let input = ${modifyInstructionInput};\r\n let position4 = vec4f(input.position, 1.0);\r\n let worldTransform = transforms.world;\r\n let viewProjectionTransform = camera.projection;\r\n let worldViewProjectionTransform = viewProjectionTransform * worldTransform;\r\n let worldPosition = (worldTransform * position4).xyz;\r\n let output = ${WGSL_VERTEXOUTPUT_STRUCT_NAME}(\r\n worldViewProjectionTransform * position4,\r\n transforms.normal * input.normal,\r\n worldPosition,\r\n input.uv,\r\n input.index,\r\n normalize(worldPosition - camera.position),\r\n input.instance\r\n );\r\n return ${modifyInstructionOutput};\r\n}`;\n}\n","import { Utils } from '@pacem/pacem-core';\nimport { VERTEX_BUFFER_INDEX_MESH_POSITION, UNIFORM_GROUP_INDEX_CAMERA, UNIFORM_BINDING_INDEX_CAMERA, UNIFORM_GROUP_INDEX_TRANSFORM, UNIFORM_BINDING_INDEX_TRANSFORM, STORAGE_GROUP_INDEX_LINE, WGSL_VERTEXOUTPUT_STRUCT_NAME } from '../constants';\nconst DefaultLineVertexOptions = {\n inputPositionLocation: VERTEX_BUFFER_INDEX_MESH_POSITION,\n outputInstanceIndexLocation: 0,\n outputVertexIndexLocation: 1,\n storagePositionsGroupIndex: STORAGE_GROUP_INDEX_LINE,\n storagePositionsBindingIndex: 0,\n uniformDimensionsGroupIndex: STORAGE_GROUP_INDEX_LINE,\n uniformDimensionsBindingIndex: 1,\n uniformViewGroupIndex: UNIFORM_GROUP_INDEX_CAMERA,\n uniformViewBindingIndex: UNIFORM_BINDING_INDEX_CAMERA,\n uniformWorldGroupIndex: UNIFORM_GROUP_INDEX_TRANSFORM,\n uniformWorldBindingIndex: UNIFORM_BINDING_INDEX_TRANSFORM,\n};\nfunction getVertexOutputStructDefinition(opts) {\n return `struct ${WGSL_VERTEXOUTPUT_STRUCT_NAME} {\r\n @builtin(position) position : vec4f, // clip space position\r\n @location(${opts.outputInstanceIndexLocation}) @interpolate(flat) instance : u32, // instance index\r\n @location(${opts.outputVertexIndexLocation}) @interpolate(flat) index : u32, // vertex index\r\n}`;\n}\nexport function getDefaultLineVertexWgsl(options = DefaultLineVertexOptions) {\n const opts = Utils.extend({}, DefaultLineVertexOptions, options);\n return `${getVertexOutputStructDefinition(opts)}\r\n\r\nstruct Transforms {\r\n world: mat4x4f,\r\n normal: mat3x3f,\r\n}\r\n\r\nstruct Camera {\r\n view: mat4x4f,\r\n projection: mat4x4f,\r\n position: vec3f\r\n}\r\n\r\n@group(${opts.uniformWorldGroupIndex}) @binding(${opts.uniformWorldBindingIndex}) var<uniform> transforms: Transforms;\r\n@group(${opts.uniformViewGroupIndex}) @binding(${opts.uniformViewBindingIndex}) var<uniform> camera: Camera;\r\n@group(${opts.storagePositionsGroupIndex}) @binding(${opts.storagePositionsBindingIndex}) var<storage, read> positions: array<f32>;\r\n\r\n@vertex fn main(@builtin(instance_index) instance: u32,\r\n @builtin(vertex_index) index: u32) -> ${WGSL_VERTEXOUTPUT_STRUCT_NAME} {\r\n\r\n let x = positions[3u * index + 0u];\r\n let y = positions[3u * index + 1u];\r\n let z = positions[3u * index + 2u];\r\n let position4 = vec4f(x, y, z, 1.0);\r\n let worldTransform = transforms.world;\r\n let viewProjectionTransform = camera.projection;\r\n let worldViewProjectionTransform = viewProjectionTransform * worldTransform;\r\n let worldPosition = (worldTransform * position4).xyz;\r\n return ${WGSL_VERTEXOUTPUT_STRUCT_NAME}(\r\n worldViewProjectionTransform * position4,\r\n instance,\r\n index);\r\n}`;\n}\nexport function getFatLineVertexWgsl(options = DefaultLineVertexOptions) {\n const opts = Utils.extend({}, DefaultLineVertexOptions, options);\n return `${getVertexOutputStructDefinition(opts)}\r\n\r\nstruct Transforms {\r\n world: mat4x4f,\r\n normal: mat3x3f,\r\n}\r\n\r\nstruct Camera {\r\n view: mat4x4f,\r\n projection: mat4x4f,\r\n position: vec3f\r\n}\r\n\r\nstruct Pixels {\r\n viewportWidth: f32,\r\n viewportHeight: f32,\r\n halfLineWidth: f32\r\n}\r\n\r\n@group(${opts.uniformWorldGroupIndex}) @binding(${opts.uniformWorldBindingIndex}) var<uniform> transforms: Transforms;\r\n@group(${opts.uniformViewGroupIndex}) @binding(${opts.uniformViewBindingIndex}) var<uniform> camera: Camera;\r\n@group(${opts.storagePositionsGroupIndex}) @binding(${opts.storagePositionsBindingIndex}) var<storage, read> positions: array<f32>;\r\n@group(${opts.uniformDimensionsGroupIndex}) @binding(${opts.uniformDimensionsBindingIndex}) var<uniform> dimensions: Pixels;\r\n\r\nfn computeClipPosition(index: u32) -> vec4f {\r\n let x = positions[3u * index + 0u];\r\n let y = positions[3u * index + 1u];\r\n let z = positions[3u * index + 2u];\r\n let position4 = vec4f(x, y, z, 1.0);\r\n let worldTransform = transforms.world;\r\n let viewProjectionTransform = camera.projection;\r\n let worldViewProjectionTransform = viewProjectionTransform * worldTransform;\r\n return worldViewProjectionTransform * position4;\r\n}\r\n\r\nfn computeOffsetPosition(p0: vec4f, p1: vec4f, index: u32) -> vec4f {\r\n\r\n let viewportSize = vec2f(dimensions.viewportWidth, dimensions.viewportHeight);\r\n let normalizedSize = normalize(viewportSize);\r\n let halfThickness = dimensions.halfLineWidth / dimensions.viewportWidth;\r\n let p0ndc = p0.xyz / p0.w;\r\n let p1ndc = p1.xyz / p1.w;\r\n let dir = normalize((p1ndc - p0ndc).xy);\r\n let offsetX = halfThickness * 2.0 / normalizedSize.x;\r\n let offsetY = halfThickness * 2.0 / normalizedSize.y;\r\n\r\n // perp\r\n let perp0 = vec2f(-dir.y * offsetX, dir.x * offsetY);\r\n let perp1 = perp0;\r\n\r\n /*\r\n\r\n position0-0 -----*----- position0-1\r\n |\\\\ |\r\n | \\\\ |\r\n | \\\\ |\r\n | \\\\ |\r\n | \\\\ |\r\n | \\\\ |\r\n | \\\\ |\r\n | \\\\|\r\n position1-0 -----*----- position1-1\r\n\r\n indexes:\r\n ------------\r\n p0-0 -> 0, 3\r\n p0-1 -> 5\r\n p1-0 -> 1\r\n p1-1 -> 2, 4\r\n */\r\n\r\n var outPos: vec2f;\r\n var w = p0.w;\r\n var z = p0.z;\r\n if (index == 0 || index == 3){\r\n outPos = p0ndc.xy - perp0;\r\n }\r\n else if (index == 1){\r\n outPos = p1ndc.xy - perp1;\r\n w = p1.w;\r\n z = p1.z;\r\n }\r\n else if (index == 5){\r\n outPos = p0ndc.xy + perp0;\r\n }\r\n else { //if (index == 2 || index == 4)\r\n outPos = p1ndc.xy + perp1;\r\n w = p1.w;\r\n z = p1.z;\r\n }\r\n\r\n // return vec4f(outPos , 0, 1.0);\r\n return vec4f(outPos * w, z, w);\r\n}\r\n\r\n@vertex fn main(@builtin(instance_index) instance: u32,\r\n @builtin(vertex_index) index: u32) -> ${WGSL_VERTEXOUTPUT_STRUCT_NAME} {\r\n\r\n // vertex index starting at 1\r\n let position0 = computeClipPosition(instance);\r\n let position1 = computeClipPosition(instance + 1);\r\n\r\n // apply offset\r\n let position = computeOffsetPosition(position0, position1, index);\r\n\r\n return ${WGSL_VERTEXOUTPUT_STRUCT_NAME}(\r\n position,\r\n instance,\r\n index\r\n );\r\n}`;\n}\n","import { UNIFORM_GROUP_INDEX_COLORPICKING } from '../constants';\n//namespace Pacem.Drawing3D.WebGPU {\n/**\n * Generate a WGSL piece of code that eases 3D picking using color strategy.\n */\nexport function getColorPickingFragmentWgsl(groupIndex = UNIFORM_GROUP_INDEX_COLORPICKING) {\n return `struct ColorPicker {\r\n id: u32,\r\n };\r\n\r\n @group(${groupIndex}) @binding(0) var<uniform> colorPicker: ColorPicker;\r\n\r\n @fragment\r\n fn main(@builtin(position) position: vec4f) -> @location(0) u32 {\r\n return colorPicker.id;\r\n }\r\n `;\n}\n","import { Utils } from '@pacem/pacem-core';\nimport { SAMPLER_BINDING_INDEX } from '../constants';\nconst DefaultTextureMapReferences = {\n uv: 'uv',\n};\nexport function textureMap(references = DefaultTextureMapReferences, group, binding = SAMPLER_BINDING_INDEX) {\n const key = Utils.uniqueCode();\n const samplerReference = `sampler_${key}`;\n const texReference = `tex_${key}`;\n const ref = Utils.extend({}, DefaultTextureMapReferences, references);\n const inputColor = ref.inputColor, outputColors = ref.outputColors;\n if (Utils.isNullOrEmpty(inputColor)) {\n throw new Error('Must provide either input and output vertex color parameter names.');\n }\n const modifiers = outputColors ?\n outputColors.map((name, index) => index === 0 ? `${name} = textureSample(${texReference}, ${samplerReference}, ${ref.uv}) * ${inputColor};` : `${name} = ${outputColors[0]};`)\n : [`textureSample(${texReference}, ${samplerReference}, ${ref.uv}) * ${inputColor}`];\n return {\n // type definitions\n //definition: '',\n // bindings\n bindings: [`@group(${group}) @binding(${binding}) var ${samplerReference}: sampler;`,\n `@group(${group}) @binding(${binding + 1}) var ${texReference}: texture_2d<f32>;`],\n // modifiers\n modifiers\n };\n}\n","import { Utils } from '@pacem/pacem-core';\nconst DefaultDirectionalLightReferences = {\n normal: 'normal', inputColor: 'white'\n};\nexport function directionalLight(references, group, binding) {\n const key = Utils.uniqueCode();\n const lightReference = `directional_${key}`;\n const ref = Utils.extend({}, DefaultDirectionalLightReferences, references);\n const inputColor = ref.inputColor, outputColor = ref.outputColor, normal = ref.normal ?? 'normal';\n if (Utils.isNullOrEmpty(inputColor)) {\n throw new Error('Must provide input vertex color parameter name.');\n }\n return {\n // type definitions\n definitions: [`struct DirectionalLight {\r\n color: vec4f,\r\n direction: vec3f,\r\n intensity: f32\r\n}`, `fn computeDirectional(normal: vec3f, color: vec4f, light: DirectionalLight) -> vec4f {\r\n let n = normalize(normal);\r\n let d = normalize(light.direction);\r\n let factor = light.intensity * .5 * (1.0 + dot(n, -d));\r\n let output = color.rgb * light.color.rgb * factor;\r\n return vec4f(output, color.a);\r\n}`],\n // bindings\n bindings: [`@group(${group}) @binding(${binding}) var<uniform> ${lightReference}: DirectionalLight;`],\n // modifiers\n modifiers: outputColor ? [`${outputColor} += computeDirectional(${normal}, ${inputColor}, ${lightReference});`] : [`computeDirectional(${normal}, ${inputColor}, ${lightReference})`]\n };\n}\n","import { Utils } from '@pacem/pacem-core';\nconst DefaultOmniLightReferences = {\n normal: 'normal', position: 'vertex', ray: 'ray', inputColor: 'white', specularColor: 'empty', shininess: '0'\n};\nexport function omniLight(references, group, binding) {\n const key = Utils.uniqueCode();\n const lightReference = `omni_${key}`;\n const ref = Utils.extend({}, DefaultOmniLightReferences, references);\n const inputColor = ref.inputColor, outputColor = ref.outputColor, normal = ref.normal, ray = ref.ray, vertex = ref.position, shininess = ref.shininess, specularColor = ref.specularColor;\n if (Utils.isNullOrEmpty(inputColor)) {\n throw new Error('Must provide input vertex color parameter name.');\n }\n return {\n // type definitions\n definitions: [`struct OmniLight {\r\n color: vec4f,\r\n position: vec3f,\r\n intensity: f32\r\n}`, `fn computeOmni(position: vec3f, normal: vec3f, ray: vec3f, color: vec4f, specularColor: vec4f, shininess: f32, light: OmniLight) -> vec4f {\r\n\r\n // color\r\n let n = normalize(normal);\r\n let d = normalize(position - light.position);\r\n let factor = light.intensity * .5 * (1.0 + dot(n, -d));\r\n\r\n // specular\r\n let r = normalize(ray);\r\n let halfVector = normalize(d + r);\r\n let specular = specularColor.rgb * shininess * dot(n, -halfVector);\r\n\r\n let output = color.rgb * light.color.rgb * factor + specular;\r\n return vec4f(output, color.a);\r\n}`],\n // bindings\n bindings: [`@group(${group}) @binding(${binding}) var<uniform> ${lightReference}: OmniLight;`],\n // modifiers\n modifiers: outputColor ? [`${outputColor} += computeOmni(${vertex}, ${normal}, ${ray}, ${inputColor}, ${specularColor}, ${shininess}, ${lightReference});`] : [`computeOmni(${vertex}, ${normal}, ${ray}, ${inputColor}, ${specularColor}, ${shininess}, ${lightReference})`]\n };\n}\n","import { Utils } from '@pacem/pacem-core';\nexport function ambientLight(references, group, binding) {\n const key = Utils.uniqueCode();\n const lightReference = `ambient_${key}`;\n const inputColor = references.inputColor, outputColor = references.outputColor;\n if (Utils.isNullOrEmpty(inputColor) || Utils.isNullOrEmpty(outputColor)) {\n throw new Error('Must provide either input and output vertex color parameter names.');\n }\n return {\n // type definitions\n definitions: [`struct AmbientLight {\r\n color: vec4f,\r\n intensity: f32\r\n}`, `fn computeAmbient(color: vec4f, light: AmbientLight) -> vec4f {\r\n return vec4f(light.intensity * color.rgb * light.color.rgb, color.a);\r\n}`],\n // bindings\n bindings: [`@group(${group}) @binding(${binding}) var<uniform> ${lightReference}: AmbientLight;`],\n // modifiers\n modifiers: [`${outputColor} = computeAmbient(${inputColor}, ${lightReference});`]\n };\n}\n","import { Geometry } from '@pacem/pacem-numerical';\nimport { isPerspectiveCamera, isOrthographicCamera } from '../../types';\n//namespace Pacem.Drawing3D.WebGPU {\nconst Vector3D = Geometry.LinearAlgebra.Vector3D;\nconst Matrix3D = Geometry.LinearAlgebra.Matrix3D;\nconst DEFAULT_SIZE = { width: 1, height: 1 };\nexport class Cameras {\n /**\n * Creates a new webgpu {@link Camera} given a canonic one.\n * @param camera\n * @returns\n */\n static create(camera) {\n if (isPerspectiveCamera(camera)) {\n return new PerspectiveCamera(camera);\n }\n if (isOrthographicCamera(camera)) {\n return new OrthographicCamera(camera);\n }\n throw new TypeError(`Camera type '${camera['type']}' not supported.`);\n }\n}\n/**\n * Camera orientation 4x4 matrix.\n * @param eye\n * @param target\n * @param up\n * @returns\n */\nfunction view(eye, target, up) {\n const z = /* inverse forward is eye -> target */ Vector3D.subtract(target, eye);\n const x = Vector3D.cross(up, z);\n const y = Vector3D.cross(z, x);\n Vector3D.normalize(x);\n Vector3D.normalize(z);\n Vector3D.normalize(y);\n const offsetX = -Vector3D.dot(x, eye);\n const offsetY = -Vector3D.dot(y, eye);\n const offsetZ = -Vector3D.dot(z, eye);\n return Matrix3D.from(x.x, y.x, z.x, 0, x.y, y.y, z.y, 0, x.z, y.z, z.z, 0, offsetX, offsetY, offsetZ, 1);\n}\nfunction assertNearFarCorrectness(near, far) {\n if (near <= 0) {\n throw new RangeError(\"Near plane distance must be positive.\");\n }\n if (far <= near) {\n throw new RangeError(\"Far plane distance must be greater than near plane distance.\");\n }\n}\n/**\n * Perspective transformation 4x4 matrix.\n * @param fovY Vertical field of view (in radians)\n * @param aspectRatio Frustum aspect ratio\n * @param near Clipping plane near distance (not z coordinate)\n * @param far Clipping plane far distance (not z coordinate)\n * @returns\n */\nfunction perspective(fovY = 120, aspectRatio = 1, near = 0.1, far = 1000) {\n assertNearFarCorrectness(near, far);\n const scale = Math.tan(.5 * Math.PI * (1 - fovY / 180));\n const m11 = scale / aspectRatio;\n const finitelyFar = Number.isFinite(far);\n const m33 = finitelyFar ? (far / (near - far)) : -1;\n const offsetZ = finitelyFar ? (far * near / (near - far)) : -near;\n return Matrix3D.from(m11, 0, 0, 0, 0, scale, 0, 0, 0, 0, m33, -1, 0, 0, offsetZ, 0);\n}\n/**\n * Othographic transformation 4x4 matrix.\n * @param left Viewport's left side\n * @param right Viewport's right side\n * @param top Viewport's top side\n * @param bottom Viewport's bottom side\n * @param near Clipping plane near distance\n * @param far Clipping plane far distance\n */\nfunction orthographic(left, right, top, bottom, near = .1, far = 1000) {\n assertNearFarCorrectness(near, far);\n return Matrix3D.from(2 / (right - left), 0, 0, 0, 0, 2 / (top - bottom), 0, 0, 0, 0, 1 / (near - far), 0, (left + right) / (left - right), (top + bottom) / (bottom - top), near / (near - far), 1);\n}\nexport class OrthographicCamera {\n constructor(_camera) {\n this._camera = _camera;\n }\n static view(camera) {\n return view(camera.position, camera.lookAt, camera.up);\n }\n static projection(camera, size = DEFAULT_SIZE) {\n const eye = camera.position, target = camera.lookAt;\n const z = Vector3D.subtract(target, eye);\n Vector3D.normalize(z);\n const zoom = Vector3D.dot(z, eye);\n const { height, width } = size;\n const ratio = width / height;\n const factor = .5 * zoom;\n const w = factor * ratio, h = factor;\n const top = camera.top * h, bottom = camera.bottom * h;\n const right = camera.right * w, left = camera.left * w;\n return orthographic(left, right, top, bottom, camera.near, camera.far);\n }\n view() {\n return OrthographicCamera.view(this._camera);\n }\n projection(size) {\n return OrthographicCamera.projection(this._camera, size);\n }\n}\nexport class PerspectiveCamera {\n constructor(_camera) {\n this._camera = _camera;\n }\n static view(camera) {\n return view(camera.position, camera.lookAt, camera.up);\n }\n static projection(camera, size = DEFAULT_SIZE) {\n const aspectRatio = (size.width / size.height) / camera.aspectRatio;\n return perspective(camera.fov, aspectRatio, camera.near, camera.far);\n }\n view() {\n return PerspectiveCamera.view(this._camera);\n }\n projection(size) {\n return PerspectiveCamera.projection(this._camera, size);\n }\n}\n","import { Utils } from '@pacem/pacem-core';\nimport { Colors } from '@pacem/pacem-foundation';\nimport { Geometry } from '@pacem/pacem-numerical';\nimport { StalePropertyFlag, isGroup, isMesh, isCamera, isLight, isGeometry, isInteraction, isMeshGeometry } from '../../types';\nimport { KnownShader, isMaterial } from '../../materials/material';\nimport { AdapterUtils } from '../shared';\nimport { U32_MAX, LABEL_PREFIX } from './constants';\nimport { Buffers } from './buffers';\nimport { Cameras } from './cameras';\nimport { Materials } from './materials';\n//namespace Pacem.Drawing3D.WebGPU {\nconst Vector3D = Geometry.LinearAlgebra.Vector3D;\nconst Matrix3D = Geometry.LinearAlgebra.Matrix3D;\nfunction throwBufferRequestError(key, type) {\n if (typeof type === 'function') {\n type = type.name;\n }\n throw new RangeError(`Buffer '${key}' not available for ${type}.`);\n}\nfunction createRenderableBuffer(item, parent, ...args) {\n item.stage ??= parent?.item.stage;\n if (isGroup(item)) {\n item.key ??= 'group_' + Utils.uniqueCode();\n return new RenderableGroupBuffer(item, parent, ...args);\n }\n if (isMesh(item)) {\n item.key ??= 'mesh_' + Utils.uniqueCode();\n return new RenderableMeshBuffer(item, parent, ...args);\n }\n if (isCamera(item)) {\n item.key ??= 'camera_' + Utils.uniqueCode();\n return new RenderableCameraBuffer(item /*, parent*/);\n }\n if (isLight(item)) {\n item.key ??= 'light_' + item.type + '_' + Utils.uniqueCode();\n return new RenderableLightBuffer(item /*, parent*/);\n }\n throw new Error(`Renderable is not supported.`);\n}\nexport class RenderLooper {\n constructor(_set) {\n this._set = _set;\n }\n /** @internal */\n get items() {\n return this._set;\n }\n loop(render) {\n const { meshes, cameras, groups, lights } = this._set;\n const camera = cameras[0];\n let cameraDone = false, lightsDone = false;\n for (let mesh of meshes) {\n if (mesh.disposed) {\n continue;\n }\n // execute\n const rendered = render(mesh, camera, lights);\n if (!rendered) {\n continue;\n }\n // seal buffers\n RenderableBuffers.clearFlags(mesh);\n if (!cameraDone) {\n RenderableBuffers.clearFlags(camera);\n cameraDone = true;\n }\n if (!lightsDone) {\n lights.forEach(light => RenderableBuffers.clearFlags(light));\n lightsDone = true;\n }\n }\n for (let group of groups) {\n // seal group buffers\n RenderableBuffers.clearFlags(group);\n }\n }\n}\nexport class ManagedBuffers {\n static create(item) {\n if (isGeometry(item)) {\n item.key ??= 'geometry_' + Utils.uniqueCode();\n return new GeometryBuffer(item);\n }\n if (isMaterial(item)) {\n return new MaterialBuffer(item);\n }\n if (isInteraction(item)) {\n return new InteractionBuffer(item);\n }\n throw new Error(`Object is not supported.`);\n }\n}\nexport class RenderableBuffers {\n static create(item, ...args) {\n return createRenderableBuffer(item, null, ...args);\n }\n static clearFlags(buffer, includeParent = false) {\n buffer.item.flags.splice(0);\n if (includeParent) {\n const bufferBase = buffer;\n if (!Utils.isNull(bufferBase.parent)) {\n RenderableBuffers.clearFlags(bufferBase.parent, true);\n }\n }\n }\n static allFlags(buffer) {\n const bufferBase = buffer;\n const parentBufferBase = bufferBase.parent;\n const parentFlags = Utils.isNull(parentBufferBase) ? [] : RenderableBuffers.allFlags(parentBufferBase);\n return bufferBase.item.flags.union(parentFlags);\n }\n}\nclass ManagedBufferBase {\n #item;\n constructor(item) {\n this.#item = item;\n }\n get item() {\n return this.#item;\n }\n #lock = false;\n lock() {\n this.#lock = true;\n }\n unlock() {\n this.#lock = false;\n const garbage = this.#garbage;\n while (garbage.length > 0) {\n const obj = garbage.shift();\n this._destroyUnsafe(obj);\n }\n }\n #garbage = [];\n _destroyUnsafe(obj) {\n if ('texture' in obj) {\n obj.texture.destroy();\n }\n else if ('buffer' in obj) {\n obj.buffer.destroy();\n }\n }\n destroySafely(...objects) {\n for (let obj of Array.from(objects).concat(...this.#garbage.splice(0))) {\n if (!obj) {\n continue;\n }\n if (this.#lock) {\n this.#garbage.push(obj);\n }\n else {\n this._destroyUnsafe(obj);\n }\n }\n }\n #disposed = false;\n destroy() {\n this.dispose();\n this.#disposed = true;\n }\n get disposed() {\n return this.#disposed;\n }\n}\nclass RenderableBufferBase extends ManagedBufferBase {\n constructor(item, parentBuffer) {\n super(item);\n this.#parent = parentBuffer;\n this.#u32id = Utils.uniqueId() % U32_MAX;\n }\n #u32id;\n #parent;\n #u32idBuffer = new Map();\n get parent() {\n return this.#parent;\n }\n get id() {\n return this.#u32id;\n }\n allFlags() {\n const parent = this.parent;\n // TODO: this one line is a perf hog!\n return this.item.flags.union(parent?.allFlags() ?? []);\n }\n buildParentWorldTransform() {\n let worldMatrix = Matrix3D.identity();\n let step = this;\n while (!Utils.isNull(step.parent)) {\n const parentItem = step.parent.item;\n const parentItemMatrix = Matrix3D.translate(parentItem.transformMatrix ?? Matrix3D.identity(), parentItem.position ?? Vector3D.zero());\n worldMatrix = Matrix3D.multiply(worldMatrix, parentItemMatrix);\n step = step.parent;\n }\n return worldMatrix;\n }\n buildWorldTransform() {\n const itemMatrix = Matrix3D.translate(this.item.transformMatrix ?? Matrix3D.identity(), this.item.position ?? Vector3D.zero());\n const parentWorldMatrix = this.buildParentWorldTransform();\n return Matrix3D.multiply(itemMatrix, parentWorldMatrix);\n }\n #versions = new Map();\n version(key) {\n return this.#versions.get(key) ?? 0;\n }\n buffer(context, key) {\n if (key === 'u32id') {\n const u32idBuffer = this.#u32idBuffer;\n const { pipeline, device } = context;\n if (u32idBuffer.has(pipeline)) {\n return Utils.extend({ fresh: false }, u32idBuffer.get(pipeline));\n }\n const u32idBufferValue = new Uint32Array([this.id]);\n const u32idBufferBuffer = Buffers.createUniform(device, u32idBufferValue, LABEL_PREFIX + 'u32id-buffer');\n const retval = Utils.extend({ buffer: u32idBufferBuffer, value: u32idBufferValue, version: performance.now() }, { fresh: true });\n this.#u32idBuffer.set(pipeline, retval);\n return retval;\n }\n const retval = this.specificBuffer(context, key);\n this.#versions.set(key, retval.version);\n return retval;\n }\n}\nconst DefaultMaterial = { shader: KnownShader.Basic, color: '#c0c0c0', flags: [] };\n// #region GROUP\nclass RenderableGroupBuffer extends RenderableBufferBase {\n #children;\n constructor(group, parent, ...args) {\n super(group, parent);\n this.#children = group.childRenderables.map(i => createRenderableBuffer(i, this, ...args));\n }\n get children() {\n return this.#children;\n }\n specificBuffer(ctx, key) {\n return null;\n }\n texture(_) {\n throw new Error(\"Method not implemented.\");\n }\n dispose() {\n this.#children.forEach(i => i.destroy());\n //this.#children = null;\n }\n}\n// #endregion\n// #region CAMERA\nclass RenderableCameraBuffer extends RenderableBufferBase {\n #viewBag = new Map();\n #view;\n constructor(camera) {\n super(camera);\n }\n texture(_) {\n throw new Error(\"Method not implemented.\");\n }\n specificBuffer(context, key) {\n //const camera = this.item;\n let fresh = false;\n if (this.allFlags().length > 0 || Utils.isNull(this.#view)) {\n fresh = true;\n this.#viewBag.clear();\n this._rebuildMatrices(context);\n }\n const { pipeline } = context;\n if (!this.#viewBag.has(pipeline)) {\n fresh = true;\n this.#viewBag.set(pipeline, this.#view);\n }\n RenderableBuffers.clearFlags(this);\n switch (key) {\n case 'cameraViewTransform':\n return Utils.extend(this.#view, { fresh });\n default:\n throwBufferRequestError(key, RenderableCameraBuffer);\n }\n }\n _rebuildMatrices({ device, canvas }) {\n // this._destroyView();\n const cam = this.item;\n const camera = Cameras.create(cam);\n const { x, y, z } = cam.position;\n const view = camera.view();\n const projection = camera.projection(canvas);\n const viewProjection = Matrix3D.multiply(view, projection);\n const viewValue = new Float32Array(16 + 16 + 4);\n viewValue.set(Matrix3D.toArray(view), 0);\n viewValue.set(Matrix3D.toArray(viewProjection), 16);\n viewValue.set([x, y, z], 32);\n // reuse GPUBuffer (always same size)\n if (Utils.isNull(this.#view)) {\n const viewBuffer = Buffers.createUniform(device, viewValue, LABEL_PREFIX + 'view-buffer');\n this.#view = { buffer: viewBuffer, value: viewValue, version: performance.now().roundoff() };\n }\n else {\n this.#view.value = viewValue;\n this.#view.version = performance.now().roundoff();\n }\n }\n _destroyView() {\n this.#viewBag.clear();\n const view = this.#view;\n this.#view = null;\n this.destroySafely(view);\n }\n dispose() {\n this._destroyView();\n }\n}\n// #endregion\n// #region GEOMETRY\nclass GeometryBuffer extends ManagedBufferBase {\n #bufferBag = {};\n #freshness = { positions: true, normals: true, uv: true, packed: true };\n #geometryBuffers;\n constructor(geometry) {\n super(geometry);\n geometry.flags ??= [];\n }\n buffer(context, key) {\n const flags = this.item.flags ?? [];\n if (Utils.isNull(this.#geometryBuffers) || flags.includes(StalePropertyFlag.Geometry)) {\n flags.splice(0);\n this.#bufferBag = /* reset */ {};\n this._rebuildGeometryBuffers(context);\n }\n const freshness = this.#freshness;\n const geom = this.#geometryBuffers;\n const { pipeline } = context;\n const bag = (this.#bufferBag[key] ??= new Map());\n const newInPipeline = !bag.has(pipeline);\n const ensureInBag = (buffer) => {\n if (newInPipeline) {\n bag.set(pipeline, buffer);\n }\n return buffer;\n };\n switch (key) {\n case 'geometryPositions':\n const { positions } = geom, posFresh = freshness.positions;\n freshness.positions = false;\n return Utils.extend(ensureInBag(positions), { fresh: posFresh || newInPipeline });\n case 'geometryNormals':\n const { normals } = geom, normFresh = freshness.normals;\n freshness.normals = false;\n return Utils.extend(ensureInBag(normals), { fresh: normFresh || newInPipeline });\n case 'geometryTexCoords':\n const { uv } = geom, uvFresh = freshness.uv;\n freshness.uv = false;\n return Utils.extend({ fresh: uvFresh || newInPipeline }, ensureInBag(uv));\n case 'geometry':\n // alltogether\n const { packed } = geom, geomFresh = freshness.packed;\n freshness.packed = false;\n return Utils.extend(ensureInBag(packed), { fresh: geomFresh || newInPipeline });\n default:\n throwBufferRequestError(key, GeometryBuffer);\n }\n }\n texture(_) {\n throw new Error(\"Method not implemented.\");\n }\n _rebuildGeometryBuffers({ device }) {\n this._destroyBuffers();\n const version = performance.now();\n const geometry = this.item, key = geometry.key;\n if (isMeshGeometry(geometry)) {\n const meshGeometry = geometry;\n // flatten positions...\n const hasTriangleIndices = !Utils.isNullOrEmpty(meshGeometry.triangleIndices);\n const flatPositions = hasTriangleIndices ?\n meshGeometry.triangleIndices.map(index => meshGeometry.positions[index])\n : meshGeometry.positions;\n const length2 = flatPositions.length * 2, length3 = length2 + flatPositions.length;\n const positionsValue = new Float32Array(length3);\n const normalsValue = new Float32Array(length3);\n const uvValue = new Float32Array(length2);\n const geomValue = new Float32Array(2 * length3 + length2);\n for (let j = 0; j < flatPositions.length; j++) {\n const offset2 = 2 * j;\n const offset3 = 3 * j;\n const { x, y, z } = flatPositions[j];\n const { x: nx, y: ny, z: nz } = meshGeometry.normals[j];\n const { x: u, y: v } = meshGeometry.textureCoordinates[j];\n positionsValue.set([x, y, z], offset3);\n normalsValue.set([nx, ny, nz], offset3);\n uvValue.set([u, v], offset2);\n geomValue.set([x, y, z, nx, ny, nz, u, v], offset3 * 2 + offset2);\n }\n const positions = Buffers.create(device, positionsValue, LABEL_PREFIX + 'meshgeometry-' + key + '-positions-buffer');\n const normals = Buffers.create(device, normalsValue, LABEL_PREFIX + 'meshgeometry-' + key + '-normals-buffer');\n const uv = Buffers.create(device, uvValue, LABEL_PREFIX + 'meshgeometry-' + key + '-uvmap-buffer');\n const geom = Buffers.create(device, geomValue, LABEL_PREFIX + 'meshgeometry-' + key + '-buffer');\n this.#geometryBuffers = {\n packed: { buffer: geom, value: geomValue, version },\n positions: { buffer: positions, value: positionsValue, version },\n normals: { buffer: normals, value: normalsValue, version },\n uv: { buffer: uv, value: uvValue, version },\n };\n this.#freshness = { positions: true, normals: true, uv: true, packed: true };\n }\n else {\n const positionsValue = new Float32Array(AdapterUtils.flattenVectorArray(geometry.positions));\n const positions = Buffers.createStorage(device, positionsValue, LABEL_PREFIX + 'nodegeometry-' + key + '-positions-buffer');\n this.#geometryBuffers = {\n positions: { buffer: positions, value: positionsValue, version },\n packed: { buffer: positions, value: positionsValue, version }\n };\n this.#freshness = { positions: true, packed: true };\n }\n }\n _destroyBuffers() {\n this.#bufferBag = {};\n const obsolete = this.#geometryBuffers;\n if (!Utils.isNull(obsolete)) {\n this.destroySafely(obsolete.positions, obsolete.normals, obsolete.uv);\n }\n }\n dispose() {\n this._destroyBuffers();\n }\n}\n// #endregion\n// #region MATERIAL\nclass MaterialBuffer extends ManagedBufferBase {\n #bufferBag = {};\n #textureBag = {};\n #wgpuMaterial;\n #buffers = new Map();\n #textures = new Map();\n constructor(material) {\n super(material);\n material.flags ??= [];\n if (material.flags.indexOf(StalePropertyFlag.Material) === -1) {\n material.flags.push(StalePropertyFlag.Material);\n }\n }\n buffer(context, key) {\n const flags = this.item.flags ?? [];\n let fresh = Utils.isNull(this.#wgpuMaterial);\n if (flags.includes(StalePropertyFlag.Material)) {\n this.#bufferBag = /* reset */ {};\n flags.splice(0);\n fresh = true;\n this.#textures.clear();\n this._resetMaterialBuffers();\n }\n const { pipeline } = context;\n const bag = (this.#bufferBag[key] ??= new Map());\n switch (key) {\n case 'material':\n case 'line':\n const buffer = this._ensureMaterialBuffer(context, key);\n if (buffer) {\n if (!bag.has(pipeline)) {\n fresh = true;\n bag.set(pipeline, buffer);\n }\n return Utils.extend(buffer, { fresh });\n }\n return null;\n default:\n throwBufferRequestError(key, MaterialBuffer);\n }\n }\n _ensureMaterialBuffer(ctx, key = 'material') {\n const set = this.#buffers;\n let retval = set.get(key);\n if (retval) {\n return retval;\n }\n if (set.has(key)) {\n return null;\n }\n retval = this.#wgpuMaterial?.buffer(ctx, key);\n if (retval) {\n set.set(key, retval);\n }\n return retval;\n }\n _resetMaterialBuffers() {\n this.#wgpuMaterial = Materials.create(this.item);\n this._destroyBuffers();\n }\n texture(ctx, key = 'texture') {\n const set = this.#textures;\n let retval = set.get(key), fresh = false;\n if (!retval) {\n retval = this.#wgpuMaterial?.texture(ctx, key);\n if (!retval) {\n return null;\n }\n set.set(key, retval);\n fresh = true;\n //\n this.#textureBag = /* reset */ {};\n }\n const { pipeline } = ctx;\n const bag = (this.#textureBag[key] ??= new Map());\n if (!bag.has(pipeline)) {\n fresh = true;\n bag.set(pipeline, retval);\n }\n return Utils.extend(retval, { fresh });\n }\n dispose() {\n this._destroyBuffers();\n }\n _destroyBuffers() {\n // memoizers\n this.#bufferBag = {};\n this.#textureBag = {};\n // buffers\n const buffers = this.#buffers.values();\n this.#buffers.clear(); // clear before destroying\n this.destroySafely(...buffers);\n // textures\n const textures = this.#textures.values();\n this.#textures.clear(); // clear before destroying\n textures.forEach(t => t.texture.destroy());\n }\n}\n// #endregion\n// #region INTERACTION\nclass InteractionBuffer extends ManagedBufferBase {\n #fields = {\n time: 0, cursor: { x: 0, y: 0 }, resolution: { width: 0, height: 0 }\n };\n #buffer;\n #bufferBag = new Map();\n constructor(data) {\n super(data);\n Utils.extend(this.#fields, data);\n }\n buffer(context, key) {\n switch (key) {\n // altogether\n case 'interaction':\n return this._ensureInteractionBuffer(context);\n default:\n throwBufferRequestError(key, InteractionBuffer);\n }\n }\n texture(_) {\n throw new Error(\"Method not implemented.\");\n }\n _ensureInteractionBuffer(ctx, key = 'interaction') {\n const fields = this.#fields, item = this.item;\n let fresh = (!this.#buffer\n || item.time !== fields.time\n || item.resolution?.width !== fields.resolution.width\n || item.resolution?.height !== fields.resolution.height);\n if (!fresh && !Utils.isNull(item.cursor)) {\n fresh = item.cursor.x !== fields.cursor.x\n || item.cursor.y !== fields.cursor.y;\n }\n if (fresh) {\n // [4bytes cursor.x, 4bytes cursor.y, 4bytes resolution.width, 4bytes resolution.height, 4bytes time] = 20 bytes total]\n const value = new Float32Array([item.cursor?.x ?? 0, item.cursor?.y ?? 0, item.resolution.width, item.resolution.height, item.time, /* padding */ .0]);\n const buffer = Buffers.createUniform(ctx.device, value, LABEL_PREFIX + 'interaction-buffer');\n this.#buffer = { buffer, value, version: performance.now() };\n this.#bufferBag.clear();\n }\n const { pipeline } = ctx;\n const bag = this.#bufferBag;\n if (!bag.has(pipeline)) {\n fresh = true;\n bag.set(pipeline, this.#buffer);\n }\n return Utils.extend(this.#buffer, { fresh });\n }\n _destroyBuffers() {\n // memoizer\n this.#bufferBag.clear();\n // buffer itself\n const obsolete = this.#buffer;\n if (!Utils.isNull(obsolete)) {\n this.destroySafely(obsolete);\n }\n }\n dispose() {\n this._destroyBuffers();\n }\n}\n// #endregion\n// #region MESH\nclass RenderableMeshBuffer extends RenderableBufferBase {\n #geometryBuffers;\n #geometryBuffer;\n #materialBuffers;\n #materialBuffer;\n #worldTransform;\n #freshness = {\n geometry: true, material: true, transform: true\n };\n #worldTransformBufferBag = new Map();\n constructor(mesh, parent, geometries, materials) {\n super(mesh, parent);\n mesh.flags ??= [];\n if (mesh.flags.indexOf(StalePropertyFlag.Geometry) === -1) {\n mesh.flags.push(StalePropertyFlag.Geometry);\n }\n if (mesh.flags.indexOf(StalePropertyFlag.Material) === -1) {\n mesh.flags.push(StalePropertyFlag.Material);\n }\n if (mesh.flags.indexOf(StalePropertyFlag.Position) === -1 && mesh.flags.indexOf(StalePropertyFlag.Transform) === -1) {\n mesh.flags.push(StalePropertyFlag.Transform);\n }\n this.#geometryBuffers = geometries;\n this.#materialBuffers = materials;\n }\n texture(ctx, key) {\n const material = this.#materialBuffer;\n return material?.texture(ctx, key);\n }\n specificBuffer(context, key) {\n const freshness = this.#freshness;\n const flags = this.allFlags();\n if (Utils.isNull(this.#worldTransform) || flags.includes(StalePropertyFlag.Position) || flags.includes(StalePropertyFlag.Transform)) {\n this.#worldTransformBufferBag.clear();\n // world transform bind group buffer\n freshness.transform = true;\n this._rebuildWorldMatrices(context);\n }\n if (Utils.isNull(this.#geometryBuffer) || flags.includes(StalePropertyFlag.Geometry)) {\n // vertex buffers\n freshness.geometry = true;\n this._ensureGeometryBuffer();\n }\n if (Utils.isNull(this.#materialBuffer) || flags.includes(StalePropertyFlag.Material)) {\n freshness.material = true;\n this._ensureMaterialBuffer();\n }\n RenderableBuffers.clearFlags(this);\n const geom = this.#geometryBuffer;\n const mater = this.#materialBuffer;\n switch (key) {\n case 'geometryPositions':\n case 'geometryNormals':\n case 'geometryTexCoords':\n case 'geometry':\n return geom.buffer(context, key);\n case 'material':\n case 'line':\n return mater.buffer(context, key);\n case 'objectWorldTransform':\n const mat = this.#worldTransform, wFresh = freshness.transform;\n freshness.transform = false;\n const bag = this.#worldTransformBufferBag, { pipeline } = context;\n const newInPipeline = !bag.has(pipeline);\n if (newInPipeline) {\n bag.set(pipeline, mat);\n }\n return Utils.extend(mat, { fresh: wFresh || newInPipeline });\n default:\n throwBufferRequestError(key, RenderableMeshBuffer);\n }\n }\n _ensureGeometryBuffer() {\n const current = this.#geometryBuffer;\n const cache = this.#geometryBuffers;\n const mesh = this.item;\n const geom = mesh.geometry;\n // no cache provided? destroy and rebuild\n if (Utils.isNull(cache)) {\n current?.destroy();\n this.#geometryBuffer = new GeometryBuffer(geom);\n }\n else {\n let buffer = cache?.get(geom);\n if (buffer?.disposed !== false) {\n buffer = new GeometryBuffer(geom);\n cache.set(geom, buffer);\n }\n this.#geometryBuffer = buffer;\n }\n }\n _ensureMaterialBuffer() {\n const current = this.#materialBuffer;\n const cache = this.#materialBuffers;\n const mesh = this.item;\n const material = mesh.material ?? DefaultMaterial;\n // no cache provided? destroy and rebuild\n if (Utils.isNull(cache)) {\n current?.destroy();\n this.#materialBuffer = new MaterialBuffer(material);\n }\n else {\n let buffer = cache?.get(material);\n if (buffer?.disposed !== false) {\n buffer = new MaterialBuffer(material);\n cache.set(material, buffer);\n }\n this.#materialBuffer = buffer;\n }\n }\n _rebuildWorldMatrices({ device }) {\n //this.destroySafely(this.#worldTransform);\n const item = this.item;\n const matrix = this.buildWorldTransform();\n const normal = Matrix3D.transpose(Matrix3D.invert(matrix));\n const value = new Float32Array(28);\n value.set(Matrix3D.toArray(matrix), 0);\n value.set([normal.m11, normal.m12, normal.m13, 0, normal.m21, normal.m22, normal.m23, 0, normal.m31, normal.m32, normal.m33, 0], 16);\n //const current = this.#worldTransform;\n // reuse GPUBuffer (always same size)\n if (Utils.isNull(this.#worldTransform)) {\n const buffer = Buffers.createUniform(device, value, LABEL_PREFIX + 'mesh-' + item.key + '-worldmatrix-buffer');\n this.#worldTransform = { buffer, value, version: performance.now().roundoff() };\n }\n else {\n this.#worldTransform.value = value;\n this.#worldTransform.version = performance.now().roundoff();\n }\n //if (!Utils.isNull(current)) {\n // this.destroySafely(current);\n //}\n }\n dispose() {\n // memoizer\n this.#worldTransformBufferBag.clear();\n const world = this.#worldTransform;\n this.#worldTransform = null;\n this.destroySafely(world);\n const material = this.#materialBuffer;\n this.#materialBuffer = null;\n material?.destroy();\n const geometry = this.#geometryBuffer;\n this.#geometryBuffer = null;\n geometry?.destroy();\n }\n}\n// #endregion\n// #region LIGHTS\nclass RenderableLightBuffer extends RenderableBufferBase {\n #buffer;\n #bufferBag = new Map();\n constructor(light) {\n super(light);\n light.flags.push(StalePropertyFlag.Light);\n }\n /**\n * Ambient light buffer building\n * @param param0\n */\n _rebuildAmbientLightBuffer({ device }) {\n const light = this.item;\n // sizes/offsets\n const szColor = 4, szIntensity = 1, offsetColor = 0, offsetIntensity = 4;\n const szTotal = 24; // offsetIntensity + szIntensity;\n const values = new Float32Array(szTotal);\n // color\n const { r, g, b, a } = Colors.parse(light.color ?? '#fff');\n values.set([r, g, b, a], offsetColor);\n // intensity\n values.set([light.intensity], offsetIntensity);\n this.#buffer = { value: values, buffer: Buffers.createUniform(device, values, LABEL_PREFIX + 'ambient-light-buffer'), version: performance.now() };\n }\n /**\n * Directional light buffer building\n * @param param0\n */\n _rebuildDirectionalLightBuffer({ device }) {\n const light = this.item;\n // sizes/offsets\n const szIntensity = 1, szColor = 4, szDirection = 3, offsetColor = 0, offsetDirection = 4, // see: https://www.w3.org/TR/WGSL/#memory-layouts\n offsetIntensity = 7;\n const szTotal = offsetIntensity + szIntensity;\n const values = new Float32Array(szTotal);\n // color\n const { r, g, b, a } = Colors.parse(light.color ?? '#fff');\n values.set([r, g, b, a], offsetColor);\n // intensity\n values.set([light.intensity], offsetIntensity);\n // direction\n const direction = Vector3D.subtract(light.position, light.target);\n values.set([direction.x, direction.y, direction.z], offsetDirection);\n this.#buffer = { value: values, buffer: Buffers.createUniform(device, values, LABEL_PREFIX + 'directional-light-buffer'), version: performance.now() };\n }\n /**\n * Omni light buffer building\n * @param param0\n */\n _rebuildOmniLightBuffer({ device }) {\n const light = this.item;\n // sizes/offsets\n const szIntensity = 1, szColor = 4, szPosition = 3, offsetColor = 0, offsetPosition = 4, // see: https://www.w3.org/TR/WGSL/#memory-layouts\n offsetIntensity = 7;\n const szTotal = offsetIntensity + szIntensity;\n const values = new Float32Array(szTotal);\n // color\n const { r, g, b, a } = Colors.parse(light.color ?? '#fff');\n values.set([r, g, b, a], offsetColor);\n // intensity\n values.set([light.intensity], offsetIntensity);\n // position\n values.set([light.position.x, light.position.y, light.position.z], offsetPosition);\n this.#buffer = { value: values, buffer: Buffers.createUniform(device, values, LABEL_PREFIX + 'omni-light-buffer'), version: performance.now() };\n }\n _rebuildLight(context) {\n this.destroySafely(this.#buffer);\n const light = this.item;\n switch (light.type) {\n case 'direction':\n this._rebuildDirectionalLightBuffer(context);\n break;\n case 'omni':\n this._rebuildOmniLightBuffer(context);\n break;\n case 'ambient':\n this._rebuildAmbientLightBuffer(context);\n break;\n default:\n throw new Error(`Light '${light.type}' is not supported.`);\n }\n }\n texture(_) {\n throw new Error(\"Method not implemented.\");\n }\n specificBuffer(context, key) {\n const bag = this.#bufferBag;\n let fresh = Utils.isNull(this.#buffer) || this.allFlags().length > 0;\n if (fresh) {\n bag.clear();\n this._rebuildLight(context);\n }\n RenderableBuffers.clearFlags(this);\n const { pipeline } = context;\n if (!bag.has(pipeline)) {\n fresh = true;\n bag.set(pipeline, this.#buffer);\n }\n if (key === 'light') {\n return Utils.extend(this.#buffer, { fresh });\n }\n throwBufferRequestError(key, RenderableLightBuffer);\n }\n dispose() {\n this.#bufferBag.clear();\n const buffer = this.#buffer;\n this.#buffer = null;\n this.destroySafely(buffer);\n }\n}\n// #endregion\n","import { Utils } from '@pacem/pacem-core';\nimport { isMesh, isCamera, isLight, isMeshGeometry } from '../../types';\nimport { KnownShader, isLineMaterial } from '../../materials/material';\nimport { WGSLBindingType } from './abstractions';\nimport { LABEL_PREFIX, MATERIAL_GROUP_INDEX, UNIFORM_GROUP_INDEX_LIGHTING, UNIFORM_GROUP_INDEX_CAMERA, UNIFORM_BINDING_INDEX_CAMERA, UNIFORM_GROUP_INDEX_TRANSFORM, UNIFORM_BINDING_INDEX_TRANSFORM, UNIFORM_GROUP_INDEX_INTERACTION, UNIFORM_BINDING_INDEX_INTERACTION, STORAGE_MATERIAL_INDEX, STORAGE_GROUP_INDEX_LINE, SAMPLER_BINDING_INDEX, TEXTURE_BINDING_INDEX, VERTEX_BUFFER_INDEX_MESH_POSITION, VERTEX_BUFFER_INDEX_MESH_NORMAL, VERTEX_BUFFER_INDEX_MESH_UV, VERTEX_COLOR_REFERENCE, LIGHTING_COLOR_REFERENCE, AMBIENT_COLOR_REFERENCE, UNIFORM_GROUP_INDEX_COLORPICKING, GPUShaderStage } from './constants';\nimport { BufferLayouts } from './buffers';\nimport { BasicMaterial, LineMaterial } from './materials';\nimport { getMeshVertexWgsl } from './wgsl/mesh-vertex';\nimport { getDefaultLineVertexWgsl, getFatLineVertexWgsl } from './wgsl/line-vertex';\nimport { getColorPickingFragmentWgsl } from './wgsl/object-picking-fragment';\nimport { textureMap } from './wgsl/texture-fragment';\nimport { directionalLight } from './wgsl/directional-light-fragment';\nimport { omniLight } from './wgsl/omni-light-fragment';\nimport { ambientLight } from './wgsl/ambient-light-fragment';\nimport { RenderableBuffers } from './renderablebuffer';\n//namespace Pacem.Drawing3D.WebGPU {\n// #region constants\nconst labelPrefix = LABEL_PREFIX;\nconst DefaultPipelineOptions = {\n multisample: true,\n packedVertices: true,\n primitive: {\n topology: 'triangle-list',\n frontFace: 'ccw',\n cullMode: 'back'\n }\n};\nconst EMPTY_BIND_DELEGATE = (_) => { };\nexport class RenderPipelines {\n static { this._memoizer = new WeakMap(); }\n static dispose(ctx) {\n const memoizer = this._memoizer;\n const cache = memoizer.get(ctx);\n if (!Utils.isNull(cache)) {\n cache.clear();\n memoizer.delete(ctx);\n }\n }\n static createColorPicking(ctx, items) {\n const renderPipeline = RenderPipelines.create(ctx, items);\n if (renderPipeline instanceof MeshRenderPipelineClass\n || renderPipeline instanceof LineRenderPipelineClass) {\n return {\n frame: renderPipeline.raycast\n };\n }\n return null;\n }\n static create(ctx, [mesh, camera, ...lights], pipelineOptions) {\n const memoizer = RenderPipelines._memoizer;\n let cache = memoizer.get(ctx);\n if (Utils.isNull(cache)) {\n memoizer.set(ctx, cache = new Map());\n }\n //const camera = items.find(i => isCamera(i.item));\n //const lights = items.filter(i => isLight(i.item));\n //// find main object\n //const mesh = items.find(i => isMesh(i.item));\n if (!Utils.isNull(mesh)) {\n if (isMesh(mesh.item)) {\n const isMesh = isMeshGeometry(mesh.item.geometry);\n const isLine = !isMesh && isLineMaterial(mesh.item.material);\n if (!isMesh && !isLine) {\n throw new Error('Pipeline not implemented, given the provided mesh argument.');\n }\n const builder = isMesh ? new MeshWGSLBuilder(mesh, camera, ...lights)\n : new LineWGSLBuilder(mesh, camera);\n // cache peek for sudden return\n const key = builder.key + (pipelineOptions?.modifiers?.version ?? '');\n const found = cache.get(key);\n if (found) {\n return found;\n }\n const pipeline = isMesh ? new MeshRenderPipelineClass(ctx, builder)\n : new LineRenderPipelineClass(ctx, builder);\n // no cache -> build it\n pipeline.build(pipelineOptions);\n const retval = pipeline;\n Utils.extend(retval, {\n id: key + '-' + ctx.canvas.width + 'x' + ctx.canvas.height + '-' + Utils.Dates.now().toISOString()\n });\n cache.set(key, retval);\n return retval;\n }\n else {\n throw new ReferenceError('Pipeline not implemented, given thst the first argument is not a mesh.');\n }\n }\n else {\n throw new Error('Pipeline not implemented, given the provided arguments.');\n }\n }\n}\nclass RenderPipelineCache {\n constructor() {\n this.#cache = new Map();\n }\n #cache;\n ensureBindGroup({ device }, item, buffers, refresh, layout, label, callback = () => { }) {\n const cache = this.#cache;\n const key = typeof item === 'string' ? item : item.key;\n let set = cache.get(key);\n if (Utils.isNull(set)) {\n cache.set(key, set = new Map());\n }\n if (refresh || !set.has(label)) {\n const entries = buffers.map((item, index) => {\n const entry = {\n binding: index,\n resource: {\n buffer: item\n }\n };\n return entry;\n });\n const descriptor = {\n label,\n layout,\n entries\n };\n // custom config happens here\n callback(descriptor);\n const retval = device.createBindGroup(descriptor);\n set.set(label, retval);\n return retval;\n }\n else {\n return set.get(label);\n }\n }\n}\nclass MeshWGSLBuilder {\n #lights = [];\n #mesh;\n #camera;\n #bindgroups = new Map();\n #key = { shader: 'basic', lights: '' };\n constructor(...objects) {\n this.add(...objects);\n }\n reset() {\n this.#lights.splice(0);\n this.#mesh = null;\n this.#bindgroups.clear();\n this.#key = { shader: 'basic', lights: '' };\n }\n add(...objects) {\n for (let obj of objects ?? []) {\n if (isMesh(obj.item)) {\n if (Utils.isNull(this.#mesh)) {\n this.#mesh = obj;\n const material = obj.item.material ?? { shader: KnownShader.Basic };\n this.#key.shader = material.shader + '-' + (material.map ? 'map' : 'nomap');\n }\n else {\n throw new Error('Mesh already added.');\n }\n }\n else if (isLight(obj.item)) {\n const lights = this.#lights;\n lights.push(obj);\n this.#key.lights += ('-' + obj.item.type);\n }\n else if (isCamera(obj.item)) {\n this.#camera ??= obj;\n }\n else {\n throw new Error('Unknown object type.');\n }\n }\n // add interaction\n }\n build(modifiers) {\n const data = this._computeBasicData();\n const key = this.key, vertex = this.vertex({ inputModifier: modifiers?.vertexInput, outputModifier: modifiers?.vertexOutput }), fragment = this.fragment(data, { modifier: modifiers?.fragment }), bindings = (...args) => MeshWGSLBuilder.prototype.bindgroup.apply(this, args);\n const metadata = {\n lightCount: this.#lights.length,\n mapCount: this.#mesh.item.material?.map ? 1 : 0\n };\n return {\n vertex,\n fragment,\n key,\n bindings,\n metadata\n };\n }\n get key() {\n const { shader, lights } = this.#key;\n // TODO: consider backMap\n return `mesh-` + shader + lights;\n //return `mesh-${shader}${(hasTexture ? '-map' : '-nomap')}`;\n }\n bindgroup(type, key, index) {\n const set = this.#bindgroups;\n const arr = set.get(type);\n if (Utils.isNull(arr)) {\n return null;\n }\n if (Utils.isNullOrEmpty(key)) {\n return arr;\n }\n const filteredArr = arr.filter(i => i.key === key);\n if (isNaN(index)) {\n return filteredArr;\n }\n if (index >= 0 && index < arr.length) {\n return filteredArr[index];\n }\n return filteredArr;\n }\n vertex(options) {\n return getMeshVertexWgsl(options);\n }\n _computeBasicData() {\n const mesh = this.#mesh.item, lights = this.#lights, material = mesh.material, hasTexture = !Utils.isNull(material?.texture), hasLighting = !Utils.isNullOrEmpty(lights);\n const shader = Utils.isNull(mesh) ? KnownShader.Basic : (mesh.material?.shader ?? KnownShader.Basic);\n const materialBindGroupIndex = MATERIAL_GROUP_INDEX, lightingBindGroupIndex = UNIFORM_GROUP_INDEX_LIGHTING;\n return {\n hasTexture, hasLighting, shader,\n materialBindGroupIndex,\n lightingBindGroupIndex,\n };\n }\n _computeBindGroupsAndReferences(data = this._computeBasicData()) {\n const { hasTexture, materialBindGroupIndex, lightingBindGroupIndex } = data;\n const bindgroups = this.#bindgroups, lights = this.#lights;\n // build bindings\n // mesh + material\n const worldTransform = { key: 'objectWorldTransform', group: UNIFORM_GROUP_INDEX_TRANSFORM, binding: UNIFORM_BINDING_INDEX_TRANSFORM, type: 'buffer' };\n const material = { key: 'material', group: materialBindGroupIndex, binding: STORAGE_MATERIAL_INDEX, type: 'buffer' };\n if (hasTexture) {\n bindgroups.set(WGSLBindingType.Mesh, [worldTransform, material, { key: 'texture', group: materialBindGroupIndex, type: 'texture' }]);\n }\n else {\n bindgroups.set(WGSLBindingType.Mesh, [worldTransform, material]);\n }\n // camera\n bindgroups.set(WGSLBindingType.Camera, [\n { key: 'cameraViewTransform', group: UNIFORM_GROUP_INDEX_CAMERA, binding: UNIFORM_BINDING_INDEX_CAMERA, type: 'buffer' }\n ]);\n // lights\n const lArr = lights.map((_, ndx) => {\n return { key: 'light', group: lightingBindGroupIndex, binding: ndx, type: 'buffer' };\n });\n lArr.push(...lArr);\n // interaction\n bindgroups.set(WGSLBindingType.Interaction, [{ key: 'interaction', group: UNIFORM_GROUP_INDEX_INTERACTION, type: 'buffer', binding: UNIFORM_BINDING_INDEX_INTERACTION }]);\n }\n fragment(data = this._computeBasicData(), options) {\n this._computeBindGroupsAndReferences(data);\n const extra = {\n definitions: [], bindings: [], modifiers: []\n };\n const merge = (x) => {\n for (let definition of x.definitions ?? []) {\n if (extra.definitions.indexOf(definition) === -1) {\n extra.definitions.push(definition);\n }\n }\n if (!Utils.isNullOrEmpty(x.bindings)) {\n extra.bindings.push(...x.bindings);\n }\n if (!Utils.isNullOrEmpty(x.modifiers)) {\n extra.modifiers.push(...x.modifiers);\n }\n };\n /* TODO: consider injecting customizations (options.modifier) into `WGSLFragmentExtra`*/\n switch (data.shader) {\n case KnownShader.Basic:\n // texture\n if (data.hasTexture) {\n const materialGroupIndex = data.materialBindGroupIndex;\n const wgslTex = textureMap({ inputColor: VERTEX_COLOR_REFERENCE, outputColors: [VERTEX_COLOR_REFERENCE], uv: 'uv' }, materialGroupIndex);\n merge(wgslTex);\n }\n // lights\n let lightIndex = 0;\n const lights = this.#lights;\n for (let lightBuffer of lights) {\n const light = lightBuffer.item; // TODO: consider implementing Pacem.Drawing3D.WebGPU.Light interface (as of Materials)\n switch (light.type) {\n case 'direction':\n const dirLightExtra = directionalLight({ outputColor: LIGHTING_COLOR_REFERENCE, normal: 'normal' }, data.lightingBindGroupIndex, lightIndex);\n merge(dirLightExtra);\n break;\n case 'omni':\n const omniLightExtra = omniLight({ outputColor: LIGHTING_COLOR_REFERENCE, normal: 'normal', position: 'vertex', /*specularColor: MATERIAL_REFERENCE + '.specularColor', shininess: MATERIAL_REFERENCE + '.shininess'*/ }, data.lightingBindGroupIndex, lightIndex);\n merge(omniLightExtra);\n break;\n case 'ambient':\n const ambLightExtra = ambientLight({ inputColor: VERTEX_COLOR_REFERENCE, outputColor: AMBIENT_COLOR_REFERENCE }, data.lightingBindGroupIndex, lightIndex);\n merge(ambLightExtra);\n break;\n }\n lightIndex++;\n }\n return BasicMaterial.fragment(extra, options);\n }\n }\n}\nconst PipelineUtils = {\n writeBufferConditionally: (device, buffer) => {\n if (!buffer.fresh) {\n return;\n }\n device.queue.writeBuffer(buffer.buffer, 0, buffer.value);\n }\n};\nclass MeshRenderPipelineClass {\n constructor(_context, _builder, _cache = new RenderPipelineCache()) {\n this._context = _context;\n this._builder = _builder;\n this._cache = _cache;\n // #region fields and utils\n this._ensureU32idBindGroup = (item, buffer, refresh) => {\n return this._cache.ensureBindGroup(this._context, item, [buffer], refresh, this._pickBindGroupLayout, labelPrefix + 'mesh-colorpick-bind-group');\n };\n this._ensureMaterialBindGroup = (item, buffer, texture, refresh, layoutIndex = MATERIAL_GROUP_INDEX) => {\n const layout = this._bindGroupLayouts[layoutIndex], label = labelPrefix + 'material-bind-group';\n if (layout.label !== (labelPrefix + 'material-bind-group-layout')) {\n throw new Error('BindGroupLayout mismatch!');\n }\n return this._cache.ensureBindGroup(this._context, item, [buffer], refresh, layout, label, (descriptor) => {\n const { device } = this.context;\n const entries = descriptor.entries /* entries are build as array in the method */;\n if (texture) {\n entries.push({\n binding: SAMPLER_BINDING_INDEX, resource: device.createSampler({\n addressModeU: 'repeat',\n addressModeV: 'repeat',\n magFilter: 'linear',\n minFilter: 'linear',\n })\n }, {\n binding: TEXTURE_BINDING_INDEX, resource: texture.createView()\n });\n }\n });\n };\n this._ensureWorldTransformBindGroup = (item, buffer, refresh, layoutIndex = UNIFORM_GROUP_INDEX_TRANSFORM, raycasting = false) => {\n const layout = this._bindGroupLayouts[layoutIndex];\n if (layout.label !== (labelPrefix + 'mesh-transforms-bind-group-layout')) {\n throw new Error('BindGroupLayout mismatch!');\n }\n const key = item.key + '-' + (raycasting ? 1 : 0);\n const label = `${labelPrefix}${raycasting ? 'colorpick' : 'mesh'}-transforms-bind-group`;\n return this._cache.ensureBindGroup(this._context, key, [buffer], refresh, layout, label);\n };\n this._ensureCameraProjectionAndInteractionDataBindGroup = (item, viewBuffer, interactionBuffer, refresh, layoutIndex = UNIFORM_GROUP_INDEX_CAMERA, raycasting = false) => {\n const layout = this._bindGroupLayouts[layoutIndex];\n const key = item.key + '-' + (raycasting ? 1 : 0);\n const label = `${labelPrefix}${raycasting ? 'colorpick' : 'mesh'}-view-bind-group`;\n return this._cache.ensureBindGroup(this._context, key, [viewBuffer, interactionBuffer], refresh, layout, label);\n };\n this._ensureLightingBindGroup = (lights, refresh, layoutIndex = UNIFORM_GROUP_INDEX_LIGHTING) => {\n const layout = this._bindGroupLayouts[layoutIndex];\n const key = lights.map(l => l.id).join(':');\n const buffers = lights.map(l => l.buffer.buffer);\n return this._cache.ensureBindGroup(this._context, key, buffers, refresh, layout, labelPrefix + 'mesh-lighting-bind-group');\n };\n this._bindGroupLayouts = [];\n this._bindVertex = EMPTY_BIND_DELEGATE;\n this._bindPicker = EMPTY_BIND_DELEGATE;\n this._bindWorldTransform = EMPTY_BIND_DELEGATE;\n this._bindRaycastWorldTransform = EMPTY_BIND_DELEGATE;\n this._bindCameraProjectionAndInteractionData = EMPTY_BIND_DELEGATE;\n this._bindRaycastCameraProjectionAndInteractionData = EMPTY_BIND_DELEGATE;\n this._bindLighting = EMPTY_BIND_DELEGATE;\n this._bindMaterial = EMPTY_BIND_DELEGATE;\n // #endregion\n // #region implementation\n this.set = (pass) => {\n throw new Error('Deprecated.');\n };\n this.bind = (pass, ...buffers) => {\n throw new Error('Deprecated.');\n };\n this.draw = (pass, ...buffers) => {\n throw new Error('Deprecated.');\n };\n this.frame = (pass, interactionBuffer, meshBuffer, cameraBuffer, ...lightBuffers) => {\n // set\n pass.setPipeline(this._pipeline);\n try {\n // bind\n this._bindVertex(pass, meshBuffer);\n this._bindWorldTransform(pass, meshBuffer);\n this._bindMaterial(pass, meshBuffer);\n this._bindCameraProjectionAndInteractionData(pass, cameraBuffer, interactionBuffer);\n this._bindLighting(pass, ...lightBuffers);\n // draw\n const mesh = meshBuffer.item, geometry = mesh.geometry;\n pass.draw(geometry.triangleIndices?.length || geometry.positions.length);\n }\n catch (e) {\n console.error('Pacem.Drawing3D.FrameException', e);\n }\n };\n this.raycast = (pass, interactionBuffer, meshBuffer, cameraBuffer) => {\n // set\n pass.setPipeline(this._pickPipeline);\n try {\n // bind\n this._bindVertex(pass, meshBuffer);\n this._bindRaycastWorldTransform(pass, meshBuffer);\n this._bindRaycastCameraProjectionAndInteractionData(pass, cameraBuffer, interactionBuffer);\n this._bindPicker(pass, meshBuffer);\n // draw\n const mesh = meshBuffer.item, geometry = mesh.geometry;\n pass.draw(geometry.triangleIndices.length);\n }\n catch (e) { }\n };\n this._key = _builder.key;\n }\n get context() {\n return this._context;\n }\n get key() {\n return this._key;\n }\n build(pipelineOptions) {\n const options = Utils.extend({}, DefaultPipelineOptions, pipelineOptions ?? {});\n const builder = this._builder, wgsl = builder.build(options.modifiers);\n const ctx = Utils.extend({ pipeline: this }, this._context);\n const device = ctx.device;\n // #region VERTEX\n // build vertex state\n const vertex = {\n module: device.createShaderModule({ code: wgsl.vertex }),\n buffers: options.packedVertices ?\n [\n // packed\n BufferLayouts.createVertex(VERTEX_BUFFER_INDEX_MESH_POSITION, 3, 3, 2),\n ]\n : [\n // position\n BufferLayouts.createVertex(VERTEX_BUFFER_INDEX_MESH_POSITION, 3),\n // normal\n BufferLayouts.createVertex(VERTEX_BUFFER_INDEX_MESH_NORMAL, 3),\n // uv\n BufferLayouts.createVertex(VERTEX_BUFFER_INDEX_MESH_UV, 2)\n ]\n };\n // bind group layouts\n const viewBindGroupLayout = device.createBindGroupLayout({\n entries: [\n // camera matrices\n {\n binding: UNIFORM_BINDING_INDEX_CAMERA,\n visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n buffer: {\n type: 'uniform'\n }\n },\n // interaction\n {\n binding: UNIFORM_BINDING_INDEX_INTERACTION,\n visibility: GPUShaderStage.VERTEX | GPUShaderStage.FRAGMENT,\n buffer: {\n type: 'uniform'\n }\n }\n ], label: labelPrefix + 'mesh-view-bind-group-layout'\n });\n const worldBindGroupLayout = device.createBindGroupLayout({\n entries: [\n {\n // world- and normalMatrix entry\n binding: UNIFORM_BINDING_INDEX_TRANSFORM,\n visibility: GPUShaderStage.VERTEX,\n buffer: {\n type: 'uniform'\n }\n }\n ], label: labelPrefix + 'mesh-transforms-bind-group-layout'\n });\n const bindGroupLayouts = [viewBindGroupLayout, worldBindGroupLayout];\n // #endregion\n // #region FRAGMENT\n // TODO: https://stackoverflow.com/questions/50720534/implementing-depth-testing-for-semi-transparent-objects\n // Weighted Blended Order-Independent Transparency https://jcgt.org/published/0002/02/09/\n // a-buffer: https://webgpu.github.io/webgpu-samples/?sample=a-buffer#composite.wgsl\n const fragment = {\n module: device.createShaderModule({\n code: wgsl.fragment\n }), targets: [\n {\n format: ctx.format,\n blend: {\n color: {\n srcFactor: 'src-alpha',\n dstFactor: 'one-minus-src-alpha'\n },\n alpha: {},\n }\n }\n ]\n };\n // material\n // material / material\n const materialGroupIndex = bindGroupLayouts.length;\n const materialBindGroupLayoutDescriptorEntries = [{\n // vertex colors entry\n binding: STORAGE_MATERIAL_INDEX,\n visibility: GPUShaderStage.FRAGMENT,\n buffer: {\n type: 'read-only-storage'\n }\n }];\n // material / texture\n const { mapCount } = wgsl.metadata, hasTex = mapCount > 0;\n if (hasTex) {\n materialBindGroupLayoutDescriptorEntries.push({ visibility: GPUShaderStage.FRAGMENT, binding: SAMPLER_BINDING_INDEX, sampler: {} }, ...Array(mapCount).keys().map(index => { return { visibility: GPUShaderStage.FRAGMENT, binding: SAMPLER_BINDING_INDEX + 1 + index, texture: {} }; }));\n }\n else {\n }\n const materialBindGroupLayoutDescriptor = {\n label: labelPrefix + 'material-bind-group-layout',\n entries: materialBindGroupLayoutDescriptorEntries\n };\n const materialBindGroupLayout = device.createBindGroupLayout(materialBindGroupLayoutDescriptor);\n bindGroupLayouts.push(materialBindGroupLayout);\n // lighting\n const lightingGroupIndex = bindGroupLayouts.length;\n const { lightCount } = wgsl.metadata, hasLighting = lightCount > 0;\n if (hasLighting) {\n const lightingBindGroupLayout = device.createBindGroupLayout({\n entries: [...Array(lightCount).keys()].map((_, index) => {\n return {\n visibility: GPUShaderStage.FRAGMENT, binding: index, buffer: {\n type: 'uniform'\n }\n };\n }),\n label: labelPrefix + 'lighting-bind-group-layout'\n });\n bindGroupLayouts.push(lightingBindGroupLayout);\n }\n // #endregion\n // #region PIPELINE\n // full pipeline descriptor\n const descriptor = {\n label: labelPrefix + 'mesh-render-pipeline',\n vertex,\n fragment,\n // pipeline-layout\n layout: device.createPipelineLayout({\n label: labelPrefix + 'mesh-render-pipeline-layout',\n bindGroupLayouts: (this._bindGroupLayouts = bindGroupLayouts)\n }),\n primitive: options.primitive\n };\n if (options.multisample) {\n descriptor.multisample = { count: 4 };\n descriptor.depthStencil = {\n depthCompare: 'less',\n format: 'depth24plus',\n depthWriteEnabled: true\n };\n }\n this._pipeline = device.createRenderPipeline(descriptor);\n // raycast pipeline descriptor\n const pickFragGroupLayout = this._pickBindGroupLayout = device.createBindGroupLayout({\n label: labelPrefix + 'mesh-colorpick-bind-group-layout',\n entries: [\n {\n visibility: GPUShaderStage.FRAGMENT,\n binding: 0,\n buffer: { type: 'uniform' }\n }\n ]\n });\n const pickDescriptor = {\n label: labelPrefix + 'mesh-colorpick-pipeline',\n vertex,\n fragment: {\n module: device.createShaderModule({\n code: getColorPickingFragmentWgsl(UNIFORM_GROUP_INDEX_COLORPICKING)\n }), targets: [\n { format: 'r32uint' }\n ]\n },\n layout: device.createPipelineLayout({\n label: labelPrefix + 'mesh-colorpick-pipeline-layout',\n bindGroupLayouts: [viewBindGroupLayout, worldBindGroupLayout, pickFragGroupLayout]\n }),\n primitive: options.primitive,\n depthStencil: {\n depthWriteEnabled: true,\n depthCompare: 'less',\n format: 'depth24plus',\n },\n };\n this._pickPipeline = device.createRenderPipeline(pickDescriptor);\n // #endregion\n // vertex buffers\n const bindVertexSplit = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n if (Utils.isNull(meshBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing vertex buffers was provided.`);\n }\n const { buffer: positions } = meshBuffer.buffer(ctx, 'geometryPositions');\n const { buffer: normals } = meshBuffer.buffer(ctx, 'geometryNormals');\n const { buffer: uv } = meshBuffer.buffer(ctx, 'geometryTexCoords');\n pass.setVertexBuffer(VERTEX_BUFFER_INDEX_MESH_POSITION, positions);\n pass.setVertexBuffer(VERTEX_BUFFER_INDEX_MESH_NORMAL, normals);\n pass.setVertexBuffer(VERTEX_BUFFER_INDEX_MESH_UV, uv);\n };\n const bindVertexPacked = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n if (Utils.isNull(meshBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing vertex buffers was provided.`);\n }\n const { buffer } = meshBuffer.buffer(ctx, 'geometry');\n pass.setVertexBuffer(VERTEX_BUFFER_INDEX_MESH_POSITION, buffer);\n };\n this._bindVertex = options.packedVertices ? bindVertexPacked : bindVertexSplit;\n // world transform\n const bindWorldTransform = (pass, meshBuffer, raycasting) => {\n if (Utils.isNull(meshBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing world transform buffer was provided.`);\n }\n const worldTransform = meshBuffer.buffer(ctx, 'objectWorldTransform'), worldTransformBuffer = worldTransform.buffer;\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, worldTransform);\n const { group } = wgsl.bindings(WGSLBindingType.Mesh, 'objectWorldTransform', 0);\n const bindGroup = this._ensureWorldTransformBindGroup(meshBuffer.item, worldTransformBuffer, worldTransform.fresh /*false*/ /* persist the same bindGroup, given the constant size */, group, raycasting);\n pass.setBindGroup(group, bindGroup);\n };\n this._bindWorldTransform = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n bindWorldTransform(pass, meshBuffer, false);\n };\n this._bindRaycastWorldTransform = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n bindWorldTransform(pass, meshBuffer, true);\n };\n // camera matrices and interaction data\n const bindCameraProjectionAndInteractionData = (pass, cameraBuffer, interactionBuffer, raycasting) => {\n if (Utils.isNull(cameraBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing view projection buffers was provided.`);\n }\n // camera view\n const viewTransformBuffer = cameraBuffer.buffer(ctx, 'cameraViewTransform'), viewTransformBufferBuffer = viewTransformBuffer.buffer;\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, viewTransformBuffer);\n // interaction\n if (Utils.isNull(interactionBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing interaction buffers was provided.`);\n }\n const interactionDataBuffer = interactionBuffer.buffer(ctx, 'interaction'), interactionDataBufferBuffer = interactionDataBuffer.buffer;\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, interactionDataBuffer);\n const { group } = wgsl.bindings(WGSLBindingType.Camera, 'cameraViewTransform', 0);\n const { group: interactionGroup } = wgsl.bindings(WGSLBindingType.Interaction, 'interaction', 0);\n if (group !== interactionGroup) {\n throw new ReferenceError(`Layout bind group mismatch: ${group} vs ${interactionGroup}.`);\n }\n const bindGroup = this._ensureCameraProjectionAndInteractionDataBindGroup(cameraBuffer.item, viewTransformBufferBuffer, interactionDataBufferBuffer, \n // since fresh could mean also \"camera switched\" (e.g. from ortho to perspective and then back to ortho) there's risk\n // to target destroyed buffers, this refresh the bind group if either buffer is fresh.\n // Possibilities for fine-tuning in future.\n viewTransformBuffer.fresh || interactionDataBuffer.fresh, group, raycasting);\n pass.setBindGroup(group, bindGroup);\n };\n this._bindCameraProjectionAndInteractionData = (pass, ...buffers) => {\n const cameraBuffer = buffers.at(0);\n const interactionBuffer = buffers.at(1);\n bindCameraProjectionAndInteractionData(pass, cameraBuffer, interactionBuffer, false);\n };\n this._bindRaycastCameraProjectionAndInteractionData = (pass, ...buffers) => {\n const cameraBuffer = buffers.at(0);\n const interactionBuffer = buffers.at(1);\n bindCameraProjectionAndInteractionData(pass, cameraBuffer, interactionBuffer, true);\n };\n // vertexColors and textures\n this._bindMaterial = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n if (Utils.isNull(meshBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing vertex colors was provided.`);\n }\n const vertexColorsBuffer = meshBuffer.buffer(ctx, 'material'), vertexColorsBufferBuffer = vertexColorsBuffer.buffer;\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, vertexColorsBuffer);\n let tex = meshBuffer.texture(ctx);\n const texBmp = tex?.texture;\n const bindGroup = this._ensureMaterialBindGroup(meshBuffer.item, vertexColorsBufferBuffer, texBmp, vertexColorsBuffer.fresh, materialGroupIndex);\n pass.setBindGroup(materialGroupIndex, bindGroup);\n if (hasTex) {\n device.queue.copyExternalImageToTexture({ source: tex.source, flipY: true }, { texture: texBmp }, { width: texBmp.width, height: texBmp.height });\n }\n };\n // lights\n this._bindLighting = (pass, ...buffers) => {\n if (hasLighting) {\n const lightArray = Array.from(buffers);\n const lightBuffers = lightArray.map(l => { return { buffer: l.buffer(ctx, 'light'), id: l.item.key }; });\n const refresh = lightBuffers.some(b => b.buffer.fresh);\n const bindGroup = this._ensureLightingBindGroup(lightBuffers, refresh, lightingGroupIndex);\n for (let lightBuffer of lightBuffers) {\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, lightBuffer.buffer);\n }\n pass.setBindGroup(lightingGroupIndex, bindGroup);\n }\n };\n // picker\n this._bindPicker = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n if (Utils.isNull(meshBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing world transform buffer was provided.`);\n }\n const u32id = meshBuffer.buffer(ctx, 'u32id'), u32idBuffer = u32id.buffer;\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, u32id);\n const group = UNIFORM_GROUP_INDEX_COLORPICKING;\n const refresh = u32id.fresh;\n const bindGroup = this._ensureU32idBindGroup(meshBuffer.item, u32idBuffer, refresh /* reuse u32id.fresh*/);\n pass.setBindGroup(group, bindGroup);\n };\n }\n}\nclass LineWGSLBuilder {\n #line;\n #camera;\n #bindgroups = new Map();\n constructor(...objects) {\n this.add(...objects);\n }\n reset() {\n this.#line = null;\n this.#bindgroups.clear();\n }\n add(...objects) {\n for (let obj of objects ?? []) {\n if (isMesh(obj.item)) {\n if (Utils.isNull(this.#line)) {\n this.#line = obj;\n }\n else {\n throw new Error('Line already added.');\n }\n }\n else if (isCamera(obj.item)) {\n this.#camera ??= obj;\n }\n else if (isLight(obj.item)) {\n // ignore\n }\n else {\n throw new Error('Unknown object type.');\n }\n }\n }\n build() {\n const data = this._computeBasicData();\n const key = this.key, vertex = this.vertex(data), fragment = this.fragment(data), bindings = (...args) => LineWGSLBuilder.prototype.bindgroup.apply(this, args);\n return {\n vertex,\n fragment,\n key,\n bindings,\n metadata: { thickness: data.thickness, dashPattern: data.dashPattern }\n };\n }\n get key() {\n const fat = (this.#line?.item).material?.lineWidth > 1;\n return KnownShader.Line + (fat ? '-fat' : '');\n }\n bindgroup(type, key, index) {\n const set = this.#bindgroups;\n const arr = set.get(type);\n if (Utils.isNull(arr)) {\n return null;\n }\n if (Utils.isNullOrEmpty(key)) {\n return arr;\n }\n const filteredArr = arr.filter(i => i.key === key);\n if (isNaN(index)) {\n return filteredArr;\n }\n if (index >= 0 && index < arr.length) {\n return filteredArr[index];\n }\n return filteredArr;\n }\n vertex(data = this._computeBasicData()) {\n return data.thickness > 1 ? getFatLineVertexWgsl() : getDefaultLineVertexWgsl();\n }\n _computeBasicData() {\n const mesh = this.#line.item;\n const shader = Utils.isNull(mesh) ? KnownShader.Line : (mesh.material?.shader ?? KnownShader.Line);\n const material = mesh.material;\n const thickness = material?.lineWidth ?? 1;\n const dashPattern = material?.dashArray;\n return {\n shader,\n thickness, dashPattern,\n };\n }\n _computeBindGroupsAndReferences(data = this._computeBasicData()) {\n const bindgroups = this.#bindgroups;\n // build bindings\n // mesh + material\n const worldTransform = { key: 'objectWorldTransform', group: UNIFORM_GROUP_INDEX_TRANSFORM, binding: UNIFORM_BINDING_INDEX_TRANSFORM, type: 'buffer' };\n const material = { key: 'material', group: STORAGE_GROUP_INDEX_LINE + 1, binding: STORAGE_MATERIAL_INDEX, type: 'buffer' };\n const geometryPositions = { key: 'geometryPositions', group: STORAGE_GROUP_INDEX_LINE, binding: 0, type: 'buffer' };\n const line = { key: 'line', group: STORAGE_GROUP_INDEX_LINE, binding: 1, type: 'buffer' };\n bindgroups.set(WGSLBindingType.Mesh, [worldTransform, material, geometryPositions, line]);\n // camera\n bindgroups.set(WGSLBindingType.Camera, [\n { key: 'cameraViewTransform', group: UNIFORM_GROUP_INDEX_CAMERA, binding: UNIFORM_BINDING_INDEX_CAMERA, type: 'buffer' }\n ]);\n }\n fragment(data = this._computeBasicData()) {\n this._computeBindGroupsAndReferences(data);\n const extra = {\n definitions: [], bindings: [], modifiers: []\n };\n switch (data.shader) {\n case KnownShader.Line:\n return LineMaterial.fragment(extra);\n }\n }\n}\nclass LineRenderPipelineClass {\n #context;\n constructor(context, _lineBuilder, _cache = new RenderPipelineCache()) {\n this._lineBuilder = _lineBuilder;\n this._cache = _cache;\n // #region fields and utils\n this._ensureLineU32idBindGroup = (item, buffer, refresh) => {\n const ctx = this.context;\n return this._cache.ensureBindGroup(ctx, item, [buffer], refresh, this._pickLineBindGroupLayout, labelPrefix + 'line-colorpick-bind-group');\n };\n this._ensureLineMaterialBindGroup = (item, buffer, refresh, layoutIndex = MATERIAL_GROUP_INDEX) => {\n const layout = this._bindLineGroupLayouts[layoutIndex];\n if (layout.label !== (labelPrefix + 'line-material-bind-group-layout')) {\n throw new Error('BindGroupLayout mismatch!');\n }\n const ctx = this.context;\n return this._cache.ensureBindGroup(ctx, item, [buffer], refresh, layout, labelPrefix + 'line-material-bind-group');\n };\n this._ensureLinePositionsBindGroup = (item, buffers, refresh, layoutIndex) => {\n const layout = this._bindLineGroupLayouts[layoutIndex];\n if (layout.label !== (labelPrefix + 'line-positions-bind-group-layout')) {\n throw new Error('BindGroupLayout mismatch!');\n }\n const ctx = this.context;\n return this._cache.ensureBindGroup(ctx, item, buffers, refresh, layout, labelPrefix + 'line-positions-bind-group');\n };\n this._ensureLineWorldTransformBindGroup = (item, buffer, refresh, layoutIndex = UNIFORM_GROUP_INDEX_TRANSFORM, raycasting = false) => {\n const layout = this._bindLineGroupLayouts[layoutIndex];\n if (layout.label !== (labelPrefix + 'line-transforms-bind-group-layout')) {\n throw new Error('BindGroupLayout mismatch!');\n }\n const key = item.key + '-line-' + (raycasting ? 1 : 0);\n const label = `${labelPrefix}${raycasting ? 'colorpick' : ''}-line-transforms-bind-group`;\n const ctx = this.context;\n return this._cache.ensureBindGroup(ctx, key, [buffer], refresh, layout, label);\n };\n this._ensureLineCameraProjectionBindGroup = (item, viewBuffer, refresh, layoutIndex = UNIFORM_GROUP_INDEX_CAMERA, raycasting = false) => {\n const layout = this._bindLineGroupLayouts[layoutIndex];\n const key = item.key + '-line-' + (raycasting ? 1 : 0);\n const label = `${labelPrefix}${raycasting ? 'colorpick' : ''}-line-view-bind-group`;\n const ctx = this.context;\n return this._cache.ensureBindGroup(ctx, key, [viewBuffer], refresh, layout, label);\n };\n this._bindLineGroupLayouts = [];\n this._bindLinePositions = EMPTY_BIND_DELEGATE;\n this._bindLinePicker = EMPTY_BIND_DELEGATE;\n this._bindLineWorldTransform = EMPTY_BIND_DELEGATE;\n this._bindLineRaycastWorldTransform = EMPTY_BIND_DELEGATE;\n this._bindLineCameraProjection = EMPTY_BIND_DELEGATE;\n this._bindLineRaycastCameraProjection = EMPTY_BIND_DELEGATE;\n this._bindLineMaterial = EMPTY_BIND_DELEGATE;\n this._drawLine = EMPTY_BIND_DELEGATE;\n // #endregion\n // #region implementation\n this.set = (pass) => {\n throw new Error('Deprecated.');\n };\n this.bind = (pass, ...buffers) => {\n throw new Error('Deprecated.');\n };\n this.draw = (pass, ...buffers) => {\n throw new Error('Deprecated.');\n };\n this.frame = (pass, meshBuffer, cameraBuffer) => {\n // set\n pass.setPipeline(this._linePipeline);\n try {\n // bind\n this._bindLineWorldTransform(pass, meshBuffer);\n this._bindLineCameraProjection(pass, cameraBuffer);\n this._bindLinePositions(pass, meshBuffer);\n this._bindLineMaterial(pass, meshBuffer);\n // draw\n this._drawLine(pass, meshBuffer);\n }\n catch (e) {\n console.error('Pacem.Drawing3D.FrameException', e);\n }\n };\n this.raycast = (pass, meshBuffer, cameraBuffer) => {\n // set\n pass.setPipeline(this._pickLinePipeline);\n try {\n // bind\n this._bindLineRaycastWorldTransform(pass, meshBuffer);\n this._bindLineRaycastCameraProjection(pass, cameraBuffer);\n this._bindLinePositions(pass, meshBuffer);\n this._bindLinePicker(pass, meshBuffer);\n // draw\n this._drawLine(pass, meshBuffer);\n }\n catch (e) { }\n };\n this.#context = context;\n this._lineKey = _lineBuilder.key;\n }\n get context() {\n return this.#context;\n }\n get key() {\n return this._lineKey;\n }\n build(pipelineOptions) {\n const options = Utils.extend({}, DefaultPipelineOptions, pipelineOptions ?? {});\n const builder = this._lineBuilder, wgsl = builder.build();\n const ctx = Utils.extend({ pipeline: this }, this.#context);\n const device = ctx.device;\n // TODO: switch topology based on this flag\n const fatLines = wgsl.metadata.thickness > 1;\n // #region VERTEX\n // build vertex state\n const vertex = {\n module: device.createShaderModule({ code: wgsl.vertex }),\n buffers: []\n };\n // bind group layouts\n const worldBindGroupLayout = device.createBindGroupLayout({\n entries: [\n {\n // world- and normalMatrix entry\n binding: UNIFORM_BINDING_INDEX_TRANSFORM,\n visibility: GPUShaderStage.VERTEX,\n buffer: {\n type: 'uniform'\n }\n }\n ], label: labelPrefix + 'line-transforms-bind-group-layout'\n });\n const viewBindGroupLayout = device.createBindGroupLayout({\n entries: [\n // camera matrices\n {\n binding: UNIFORM_BINDING_INDEX_CAMERA,\n visibility: GPUShaderStage.VERTEX,\n buffer: {\n type: 'uniform'\n }\n }\n ], label: labelPrefix + 'line-view-bind-group-layout'\n });\n const lineEntries = [\n // positions array\n {\n binding: 0,\n visibility: GPUShaderStage.VERTEX,\n buffer: {\n type: 'read-only-storage'\n }\n }\n ];\n if (fatLines) {\n lineEntries.push(\n // line properties (width, dash-array, lineCap, ...)\n {\n binding: 1,\n visibility: GPUShaderStage.VERTEX,\n buffer: {\n type: 'uniform'\n }\n });\n }\n const lineBindGroupLayout = device.createBindGroupLayout({\n entries: lineEntries, label: labelPrefix + 'line-positions-bind-group-layout'\n });\n const vertexBindGroupLayouts = [worldBindGroupLayout, viewBindGroupLayout, lineBindGroupLayout];\n const raycastLayoutIndex = vertexBindGroupLayouts.length;\n const bindGroupLayouts = vertexBindGroupLayouts.slice();\n // #endregion\n // #region FRAGMENT\n const fragment = {\n module: device.createShaderModule({\n code: wgsl.fragment\n }), targets: [\n {\n format: ctx.format,\n blend: {\n color: {\n srcFactor: 'src-alpha',\n dstFactor: 'one-minus-src-alpha'\n },\n alpha: {},\n }\n }\n ]\n };\n // material\n // material / material\n const materialGroupIndex = bindGroupLayouts.length;\n const materialBindGroupLayoutDescriptorEntries = [{\n // vertex colors entry\n binding: STORAGE_MATERIAL_INDEX,\n visibility: GPUShaderStage.FRAGMENT,\n buffer: {\n type: 'read-only-storage'\n }\n }];\n const materialBindGroupLayoutDescriptor = {\n label: labelPrefix + 'line-material-bind-group-layout',\n entries: materialBindGroupLayoutDescriptorEntries\n };\n const materialBindGroupLayout = device.createBindGroupLayout(materialBindGroupLayoutDescriptor);\n bindGroupLayouts.push(materialBindGroupLayout);\n // #endregion\n // #region PIPELINE\n const topology = fatLines ? options.primitive.topology : 'line-list';\n // full pipeline descriptor\n const descriptor = {\n label: labelPrefix + 'line-render-pipeline',\n vertex,\n fragment,\n // pipeline-layout\n layout: device.createPipelineLayout({\n label: labelPrefix + 'line-render-pipeline-layout',\n bindGroupLayouts: (this._bindLineGroupLayouts = bindGroupLayouts)\n }),\n primitive: Utils.extend({}, options.primitive, { topology }),\n };\n if (options.multisample) {\n descriptor.multisample = { count: 4 };\n descriptor.depthStencil = {\n depthCompare: 'less',\n format: 'depth24plus',\n depthWriteEnabled: true\n };\n }\n this._linePipeline = device.createRenderPipeline(descriptor);\n // raycast pipeline descriptor\n const pickFragGroupLayout = this._pickLineBindGroupLayout = device.createBindGroupLayout({\n label: labelPrefix + 'line-colorpick-bind-group-layout',\n entries: [\n {\n visibility: GPUShaderStage.FRAGMENT,\n binding: 0,\n buffer: { type: 'uniform' }\n }\n ]\n });\n const pickDescriptor = {\n label: labelPrefix + 'line-colorpick-pipeline',\n vertex,\n fragment: {\n module: device.createShaderModule({\n code: getColorPickingFragmentWgsl(raycastLayoutIndex)\n }), targets: [\n { format: 'r32uint' }\n ]\n },\n layout: device.createPipelineLayout({\n label: labelPrefix + 'line-colorpick-pipeline-layout',\n bindGroupLayouts: vertexBindGroupLayouts.concat(pickFragGroupLayout)\n }),\n primitive: Utils.extend({}, options.primitive, { topology }),\n depthStencil: {\n depthWriteEnabled: true,\n depthCompare: 'less',\n format: 'depth24plus',\n },\n };\n this._pickLinePipeline = device.createRenderPipeline(pickDescriptor);\n // #endregion\n // world transform\n const bindLineWorldTransform = (pass, meshBuffer, raycasting) => {\n if (Utils.isNull(meshBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing world transform buffer was provided.`);\n }\n const worldTransform = meshBuffer.buffer(ctx, 'objectWorldTransform'), worldTransformBuffer = worldTransform.buffer;\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, worldTransform);\n const { group } = wgsl.bindings(WGSLBindingType.Mesh, 'objectWorldTransform', 0);\n const bindGroup = this._ensureLineWorldTransformBindGroup(meshBuffer.item, worldTransformBuffer, \n /*worldTransform.fresh*/ false /* persist the same bindGroup, given the constant size */, group, raycasting);\n pass.setBindGroup(group, bindGroup);\n };\n this._bindLineWorldTransform = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n bindLineWorldTransform(pass, meshBuffer, false);\n };\n this._bindLineRaycastWorldTransform = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n bindLineWorldTransform(pass, meshBuffer, true);\n };\n // camera matrices\n const bindLineCameraProjection = (pass, cameraBuffer, raycasting) => {\n if (Utils.isNull(cameraBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing view projection buffers was provided.`);\n }\n const viewTransformBuffer = cameraBuffer.buffer(ctx, 'cameraViewTransform'), viewTransformBufferBuffer = viewTransformBuffer.buffer;\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, viewTransformBuffer);\n const { group } = wgsl.bindings(WGSLBindingType.Camera, 'cameraViewTransform', 0);\n const bindGroup = this._ensureLineCameraProjectionBindGroup(cameraBuffer.item, viewTransformBufferBuffer, \n /*viewTransformBuffer.fresh*/ false, group, raycasting);\n pass.setBindGroup(group, bindGroup);\n };\n this._bindLineCameraProjection = (pass, ...buffers) => {\n const cameraBuffer = buffers.at(0);\n bindLineCameraProjection(pass, cameraBuffer, false);\n };\n this._bindLineRaycastCameraProjection = (pass, ...buffers) => {\n const cameraBuffer = buffers.at(0);\n bindLineCameraProjection(pass, cameraBuffer, true);\n };\n // positions storage\n this._bindLinePositions = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n if (Utils.isNull(meshBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing vertex buffers was provided as index 0.`);\n }\n // storage buffer\n const positionsBuffer = /* should have a storage buffer here */ meshBuffer.buffer(ctx, 'geometryPositions'), positionsBufferBuffer = positionsBuffer.buffer;\n let refresh = positionsBuffer.fresh;\n const buffersInput = [positionsBufferBuffer];\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, positionsBuffer);\n if (fatLines) {\n const lineBuffer = meshBuffer.buffer(ctx, 'line'), lineBufferBuffer = lineBuffer.buffer;\n refresh ||= lineBuffer.fresh;\n buffersInput.push(lineBufferBuffer);\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, lineBuffer);\n }\n const { group: groupIndex } = wgsl.bindings(WGSLBindingType.Mesh, 'line' /* or 'geometryPositions' */, 0);\n const bindGroup = this._ensureLinePositionsBindGroup(meshBuffer.item, buffersInput, refresh, groupIndex);\n pass.setBindGroup(groupIndex, bindGroup);\n };\n // vertexColors\n this._bindLineMaterial = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n if (Utils.isNull(meshBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing vertex colors was provided.`);\n }\n const vertexColorsBuffer = meshBuffer.buffer(ctx, 'material'), vertexColorsBufferBuffer = vertexColorsBuffer.buffer;\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, vertexColorsBuffer);\n const bindGroup = this._ensureLineMaterialBindGroup(meshBuffer.item, vertexColorsBufferBuffer, vertexColorsBuffer.fresh, materialGroupIndex);\n pass.setBindGroup(materialGroupIndex, bindGroup);\n };\n // picker\n this._bindLinePicker = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n if (Utils.isNull(meshBuffer)) {\n throw new ReferenceError(`Null ${RenderableBuffers.name} bringing world transform buffer was provided.`);\n }\n const u32id = meshBuffer.buffer(ctx, 'u32id'), u32idBuffer = u32id.buffer, u32idArray = u32id.value;\n // writes only if buffer is fresh\n PipelineUtils.writeBufferConditionally(device, u32id);\n const bindGroup = this._ensureLineU32idBindGroup(meshBuffer.item, u32idBuffer, /* reuse */ false /*u32id.fresh*/);\n pass.setBindGroup(raycastLayoutIndex, bindGroup);\n };\n this._drawLine = (pass, ...buffers) => {\n const meshBuffer = buffers.at(0);\n const mesh = meshBuffer.item, geometry = mesh.geometry /* as NodeGeometry*/;\n if (fatLines) {\n pass.draw(6, geometry.positions.length - 1, 0, 0);\n }\n else {\n pass.draw(geometry.positions.length);\n }\n };\n }\n}\n// #endregion\n","import { Utils } from '@pacem/pacem-core';\nimport { LABEL_PREFIX, GPUTextureUsage, GPUBufferUsage, GPUMapMode } from './constants';\nimport { RenderPipelines } from './pipelinefactory';\n//namespace Pacem.Drawing3D.WebGPU {\nexport class Raycasters {\n // learn from:\n // https://webglfundamentals.org/webgl/lessons/webgl-qna-how-to-get-the-3d-coordinates-of-a-mouse-click.html\n // https://github.com/mrdoob/three.js/blob/master/src/core/Raycaster.js\n // https://shi-yan.github.io/webgpuunleashed/Control/object_picking.html\n // https://gist.github.com/greggman/57c3c0d3cf1db14f1baad2d9b0094397 (color picking)\n static { this._memoizer = new WeakMap(); }\n static dispose(ctx) {\n const memoizer = this._memoizer;\n if (memoizer.has(ctx)) {\n const cache = memoizer.get(ctx);\n for (let raycaster of cache.values()) {\n raycaster.destroy();\n }\n cache.clear();\n memoizer.delete(ctx);\n }\n }\n /** Creates a raycaster that uses color picking as a strategy to hit-test objects. */\n static createColorPicking(ctx) {\n const memoizer = this._memoizer;\n if (!memoizer.has(ctx)) {\n memoizer.set(ctx, new Map());\n }\n const cache = memoizer.get(ctx);\n const key = 'colorpick';\n if (cache.has(key)) {\n return cache.get(key);\n }\n const retval = new ColorPickingRaycaster(ctx);\n cache.set(key, retval);\n return retval;\n }\n}\nconst NUM_PIXELS = 1;\nclass ColorPickingRaycaster {\n constructor(_context) {\n this._context = _context;\n this._objects = new Map();\n this.frame = (interaction, ...buffers) => {\n if (Utils.isNull(this._encoder)) {\n throw new Error('Null encoder. Maybe you missed to call the \\'begin\\' method first.');\n }\n const objects = Array.from(buffers);\n const pipeline = RenderPipelines.createColorPicking(this._context, objects);\n pipeline?.frame(this._pass, interaction, ...buffers);\n for (let buffer of objects) {\n const item = buffer.item;\n if (item.inert) {\n continue;\n }\n //buffer.lock();\n this._objects.set(buffer.id, buffer);\n }\n };\n this.end = (pixel) => {\n if (!Utils.isNull(this._handle)) {\n return this._handle;\n }\n const pass = this._pass;\n const commandEncoder = this._encoder;\n const { device } = this._context;\n const { render } = this._textures;\n const pickTexture = render.texture;\n const pickBuffer = this._ensureBuffer();\n pass.end();\n commandEncoder.copyTextureToBuffer({\n texture: pickTexture,\n // mipLevel: 0,\n origin: {\n x: pixel.x,\n y: pixel.y,\n }\n }, {\n buffer: pickBuffer,\n bytesPerRow: ((NUM_PIXELS * 4 + 255) | 0) * 256,\n rowsPerImage: 1,\n }, {\n width: NUM_PIXELS,\n // height: 1,\n // depth: 1,\n });\n device.queue.submit([commandEncoder.finish()]);\n // remove\n this._encoder = null;\n const _this = this;\n const objects = _this._objects;\n const resetHandle = () => {\n _this._handle = null;\n };\n return this._handle = new Promise((resolve, _) => {\n pickBuffer.mapAsync(GPUMapMode.READ, 0, 4 * NUM_PIXELS).then(_ => {\n const ids = new Uint32Array(pickBuffer.getMappedRange(0, 4 * NUM_PIXELS));\n const id = ids[0];\n pickBuffer.unmap();\n // remove promise reference\n resetHandle();\n const buffer = objects.get(id);\n if (!buffer) {\n resolve([]);\n }\n else {\n resolve([buffer.item]);\n }\n // cleanup\n //pickBuffer.destroy();\n //pickTexture.destroy();\n //objects.values().forEach(b => b.unlock());\n });\n });\n };\n }\n _createTexture(format) {\n const { device, canvas } = this._context;\n const width = Math.min(device.limits.maxTextureDimension2D, canvas.clientWidth), height = Math.min(device.limits.maxTextureDimension2D, canvas.clientHeight);\n return device.createTexture({\n size: [width, height, 1],\n format,\n usage: GPUTextureUsage.COPY_SRC | GPUTextureUsage.RENDER_ATTACHMENT\n });\n }\n _ensureBuffer() {\n const buffer = this._buffer;\n if (!Utils.isNull(buffer)) {\n return buffer;\n }\n const { device } = this._context;\n return this._buffer = device.createBuffer({\n label: LABEL_PREFIX + 'colorpick-output-buffer',\n size: NUM_PIXELS * 4,\n usage: GPUBufferUsage.MAP_READ | GPUBufferUsage.COPY_DST,\n });\n }\n _ensureTextures() {\n const textures = this._textures;\n if (!Utils.isNull(textures)) {\n return textures;\n }\n const renderTex = this._createTexture('r32uint'), depthTex = this._createTexture('depth24plus');\n const render = { texture: renderTex, view: renderTex.createView() };\n const depth = { texture: depthTex, view: depthTex.createView() };\n return this._textures = { render, depth };\n }\n ;\n _destroyTexture(texture) {\n if (Utils.isNull(texture)) {\n return;\n }\n texture.texture?.destroy();\n }\n destroy() {\n const textures = this._textures, buffer = this._buffer;\n if (!Utils.isNullOrEmpty(textures)) {\n const { render, depth } = textures;\n this._destroyTexture(render);\n this._destroyTexture(depth);\n this._textures = null;\n }\n if (!Utils.isNull(buffer)) {\n buffer.destroy();\n this._buffer = null;\n }\n }\n begin() {\n const { device } = this._context;\n this._encoder = device.createCommandEncoder({ label: LABEL_PREFIX + 'colorpick-raycaster' });\n const { render, depth } = this._ensureTextures();\n const passDescriptor = {\n label: LABEL_PREFIX + 'colorpick-raycaster-pass',\n colorAttachments: [\n {\n view: render.view,\n clearValue: { r: 0, g: 0, b: 0, a: 0 },\n loadOp: 'clear',\n storeOp: 'store',\n },\n ],\n depthStencilAttachment: {\n view: depth.view, // Assigned later\n depthClearValue: 1,\n depthLoadOp: 'clear',\n depthStoreOp: 'store',\n },\n };\n this._pass = this._encoder.beginRenderPass(passDescriptor);\n this._objects.clear();\n }\n}\n","import { Utils, P, Logging } from '@pacem/pacem-core';\nimport { Colors } from '@pacem/pacem-foundation';\nimport { Geometry } from '@pacem/pacem-numerical';\nimport { StalePropertyFlag, isMesh, isCamera, isLight, isGroup } from '../../types';\nimport { AdapterUtils } from '../shared';\nimport { LABEL_PREFIX, GPUTextureUsage } from './constants';\nimport { RenderPipelines } from './pipelinefactory';\nimport { Raycasters } from './raycaster';\nimport { RenderableBuffers, RenderLooper, ManagedBuffers } from './renderablebuffer';\n//namespace Pacem.Drawing3D.WebGPU {\nconst Vector3D = Geometry.LinearAlgebra.Vector3D;\nexport var WebGPUIssueCause;\n(function (WebGPUIssueCause) {\n WebGPUIssueCause[WebGPUIssueCause[\"NotSupported\"] = 0] = \"NotSupported\";\n WebGPUIssueCause[WebGPUIssueCause[\"Disabled\"] = 1] = \"Disabled\";\n})(WebGPUIssueCause || (WebGPUIssueCause = {}));\nexport class Renderers {\n static create(stage, config) {\n return new Promise((resolve, reject) => {\n if (!navigator.gpu) {\n const message = \"WebGPU not supported.\";\n const issue = { message, cause: WebGPUIssueCause.NotSupported };\n reject(issue);\n }\n else {\n const retval = new RendererClass(stage);\n retval.init(config).then(_ => resolve(retval), error => {\n const message = typeof error === 'string' ? error : error.message;\n const issue = { message, cause: WebGPUIssueCause.Disabled };\n reject(issue);\n });\n }\n });\n }\n}\nfunction getDefaultCamera(stage) {\n return {\n bottom: -1, top: 1, left: -1, right: 1, near: .1, far: 200, lookAt: Vector3D.from(0, 0, 0), up: Vector3D.j(), position: Vector3D.from(0, 0, 1), type: \"orthographic\",\n flags: [], stage\n };\n}\nfunction destroyTextures(...textures) {\n for (let tex of textures || []) {\n tex?.destroy();\n }\n}\nclass RendererClass {\n #stage;\n #canvas;\n #context;\n #renderables;\n #geometries;\n #materials;\n #looper;\n #textures;\n #config;\n #disabled;\n // interaction buffer\n #interactionBuffer;\n // interaction buffer underlying data\n #interaction;\n constructor(stage) {\n this.#renderables = new WeakMap();\n this.#geometries = new WeakMap();\n this.#materials = new WeakMap();\n this.#config = { enableValidation: false };\n this.#disabled = false;\n this._logError = (evt) => {\n const stage = this.#stage, logger = stage.logger;\n if (!Utils.isNull(logger)) {\n const error = 'error' in evt ? evt.error : evt;\n logger.log(Logging.LogLevel.Error, error.message, 'WebGPU');\n }\n };\n this.#rebuildingContext = true;\n /** Whether the renderer is affected by vertex or fragment modifiers.\n * When true, the renderer must provide updated time, cursor position and canvas size to the pipeline's bind groups.\n */\n this.#hasModifiers = false;\n const wrapper = (this.#stage = stage).stage;\n const canvas = document.createElement('canvas');\n canvas.id = P + '_3d_stage_' + Utils.uniqueCode();\n // cleanup\n wrapper.innerHTML = '';\n wrapper.appendChild(this.#canvas = canvas);\n // interaction stuff\n this.#interactionBuffer = ManagedBuffers.create(this.#interaction = {\n time: performance.now(), cursor: { x: 0, y: 0 }, resolution: { width: 0, height: 0 }\n });\n }\n _buildPassDescriptor({ multisample, format }) {\n const { context, device } = this.#context;\n const canvasTexture = context.getCurrentTexture();\n let textures = this.#textures;\n if (Utils.isNull(textures)) {\n textures = {};\n if (multisample) {\n const renderTex = device.createTexture({\n label: LABEL_PREFIX + 'render-texture',\n format: format ?? canvasTexture.format,\n usage: GPUTextureUsage.RENDER_ATTACHMENT,\n size: [canvasTexture.width, canvasTexture.height],\n sampleCount: 4,\n });\n textures.render = {\n texture: renderTex, view: renderTex.createView({ label: LABEL_PREFIX + 'render-texture-view' })\n };\n const depthTex = device.createTexture({\n label: LABEL_PREFIX + 'depth-texture',\n format: 'depth24plus',\n usage: GPUTextureUsage.RENDER_ATTACHMENT,\n size: [canvasTexture.width, canvasTexture.height],\n sampleCount: 4,\n });\n textures.depth = {\n texture: depthTex, view: depthTex.createView({ label: LABEL_PREFIX + 'depth-texture-view' })\n };\n }\n this.#textures = textures;\n }\n const { transparent, background } = this.#stage;\n const backColor = transparent ? { r: 0, g: 0, b: 0, a: 0 } : background ? (typeof background === 'string' ? Colors.parse(background) : background) : { r: 0, g: 0, b: 0, a: 1 };\n const bgColor = AdapterUtils.flattenVectorArray([backColor]);\n const canvasTexView = canvasTexture.createView({ label: LABEL_PREFIX + 'canvas-texture-view' });\n const colorAttachment = {\n view: canvasTexView,\n clearValue: bgColor,\n loadOp: 'clear',\n storeOp: 'store',\n };\n const passDescriptor = {\n colorAttachments: [colorAttachment]\n };\n if (multisample) {\n const renderTexView = textures.render.view;\n const depthTexView = textures.depth.view;\n passDescriptor.depthStencilAttachment = {\n view: depthTexView,\n depthClearValue: 1,\n depthLoadOp: 'clear',\n depthStoreOp: 'store',\n stencilClearValue: 0,\n stencilReadOnly: true,\n };\n // override\n colorAttachment.view = renderTexView;\n colorAttachment.resolveTarget = canvasTexView;\n }\n return passDescriptor;\n }\n ;\n _buildContext(canvas = this.#canvas, size = this.#stage.size) {\n size ??= canvas;\n let w = size.width;\n let h = size.height;\n const devicePixelRatio = 1; // window.devicePixelRatio;\n canvas.width = w * devicePixelRatio;\n canvas.height = h * devicePixelRatio;\n const context = canvas.getContext('webgpu');\n const textureFormat = navigator.gpu.getPreferredCanvasFormat();\n return { context, textureFormat };\n }\n _buildUpContext(device, adapter, context, format) {\n const { transparent } = this.#stage;\n context.configure({\n alphaMode: transparent ? 'premultiplied' : 'opaque',\n device,\n format,\n });\n this.#context = { device, adapter, canvas: this.#canvas, context, format };\n this.#rebuildingContext = false;\n }\n async init(config) {\n this.#config = config;\n const adapter = await navigator.gpu.requestAdapter();\n if (Utils.isNull(adapter)) {\n throw new Error('WebGPU adapter unavalable or disabled.');\n }\n const device = await adapter.requestDevice();\n if (Utils.isNull(adapter)) {\n throw new Error('WebGPU device unavalable or disabled.');\n }\n device.addEventListener('uncapturederror', this._logError);\n // set flag for shader modifiers presence, this will be used to determine whether to update the interaction buffer on each render call\n this.#hasModifiers = !Utils.isNull(config.modifiers?.version) && !Utils.isNull(config.modifiers)\n && (!Utils.isNull(config.modifiers.vertexInput) || !Utils.isNull(config.modifiers.vertexOutput) || !Utils.isNull(config.modifiers.fragment));\n const { context, textureFormat: format } = this._buildContext();\n this._buildUpContext(device, adapter, context, format);\n }\n #rebuildingContext;\n /** Whether the renderer is affected by vertex or fragment modifiers.\n * When true, the renderer must provide updated time, cursor position and canvas size to the pipeline's bind groups.\n */\n #hasModifiers;\n /**\n * Render procedure.\n */\n render(interaction) {\n if (this.#rebuildingContext || Utils.isNull(this.#looper) || !(this.#canvas.width > 0) || !(this.#canvas.height > 0)) {\n return;\n }\n const context = this.#context, device = context.device, \n // looper\n looper = this.#looper;\n // enable validation scope? (perf hog)\n const validationScope = this.#config?.enableValidation ?? false;\n if (this.#hasModifiers) {\n // update underlying interaction data, this will trigger buffer update\n Utils.extend(this.#interaction, interaction);\n }\n const multisample = true;\n const passDescriptor = this._buildPassDescriptor({ multisample });\n // rendering zone\n const commandEncoder = device.createCommandEncoder({ label: LABEL_PREFIX + 'renderer' });\n const pass = commandEncoder.beginRenderPass(passDescriptor);\n // loop\n looper.loop((mesh, camera, lights) => {\n if (mesh.item.hide) {\n // this code branching is NOT NEEDED ANYMORE,\n // remove it safely\n return false;\n }\n if (validationScope) {\n device.pushErrorScope('validation');\n }\n const renderables = [mesh, camera, ...lights];\n // inject here (pipeline options) any global rendering data (time, cursor, etc.) that may be needed by the shader modifiers\n const pipeline = RenderPipelines.create(context, renderables, { multisample: true, modifiers: this.#config.modifiers });\n // render\n pipeline.frame(pass, this.#interactionBuffer, ...renderables);\n if (validationScope) {\n device.popErrorScope().then(error => {\n if (error) {\n this._logError(error);\n }\n });\n }\n return true;\n });\n pass.end();\n device.queue.submit([commandEncoder.finish()]);\n }\n set disabled(v) {\n this.#disabled = v;\n }\n get disabled() {\n return this.#disabled;\n }\n raycast(pixel) {\n if (this.#rebuildingContext || Utils.isNull(this.#looper)) {\n return Promise.resolve([]);\n }\n const context = this.#context, device = context.device, looper = this.#looper;\n // enable validation scope? (perf hog)\n const validationScope = this.#config?.enableValidation ?? false;\n // rendering zone\n const raycaster = Raycasters.createColorPicking(context);\n raycaster.begin();\n // loop\n looper.loop((mesh, camera) => {\n if (mesh.item.hide) {\n // TODO: remove unwraps and move to nested loops\n // in order to centralize hidden renderable skip logic\n return false;\n }\n if (validationScope) {\n device.pushErrorScope('validation');\n }\n raycaster.frame(this.#interactionBuffer, mesh, camera);\n if (validationScope) {\n device.popErrorScope().then(error => {\n if (error) {\n this._logError(error);\n }\n });\n }\n return true;\n });\n return raycaster.end(pixel);\n }\n _disposeRenderableJustInCase(item) {\n const store = this.#renderables;\n if (store.has(item)) {\n store.get(item)?.destroy();\n store.delete(item);\n }\n }\n _createOrYieldRenderable(item, geometries = this.#geometries, materials = this.#materials) {\n item.stage ??= this.#stage;\n const store = this.#renderables;\n let found = store.get(item);\n if (Utils.isNull(found)) {\n store.set(item, found = RenderableBuffers.create(item, geometries));\n }\n return found;\n }\n _createOrYieldGeometry(item) {\n const store = this.#geometries;\n let found = store.get(item);\n if (Utils.isNull(found)) {\n store.set(item, found = ManagedBuffers.create(item));\n }\n return found;\n }\n _createOrYieldMaterial(item) {\n const store = this.#materials;\n let found = store.get(item);\n if (Utils.isNull(found)) {\n store.set(item, found = ManagedBuffers.create(item));\n }\n return found;\n }\n _unwrapBuffers(grp, accumulator) {\n accumulator ??= { meshes: [], lights: [], cameras: [], groups: [] };\n for (let itemBuffer of grp.children) {\n itemBuffer.item.stage ??= this.#stage;\n if (isMesh(itemBuffer.item)) {\n accumulator.meshes.push(itemBuffer);\n }\n if (isCamera(itemBuffer.item)) {\n accumulator.cameras.push(itemBuffer);\n }\n if (isLight(itemBuffer.item)) {\n accumulator.lights.push(itemBuffer);\n }\n if (isGroup(itemBuffer.item)) {\n accumulator.groups.push(itemBuffer);\n this._unwrapBuffers(itemBuffer, accumulator);\n }\n }\n return accumulator;\n }\n ;\n _update(array) {\n const groupBuffers = [];\n const meshBuffers = [];\n const lightBuffers = [];\n const factory = i => this._createOrYieldRenderable(i);\n let camera;\n for (let item of array) {\n if (item.hide) {\n // remove stored renderable just in case\n this._disposeRenderableJustInCase(item);\n continue;\n }\n // ensure stage\n item.stage ??= this.#stage;\n // groups\n if (isGroup(item)) {\n const g = item;\n if (g.flags.includes(StalePropertyFlag.Children)) {\n this.#renderables.delete(g);\n }\n groupBuffers.push(factory(g));\n }\n // meshes\n if (isMesh(item) && item.geometry) {\n // build pipelines based on provided element wrappers (cached buffers)\n this._createOrYieldGeometry(item.geometry);\n if (!Utils.isNull(item.material)) {\n this._createOrYieldMaterial(item.material);\n }\n meshBuffers.push(factory(item));\n }\n // lights\n if (isLight(item)) {\n lightBuffers.push(factory(item));\n }\n if (isCamera(item)) {\n // pick the first only\n camera ??= item;\n }\n }\n // find first active camera\n camera ??= getDefaultCamera(this.#stage);\n const cameraBuffer = factory(camera);\n let accumulator = {\n meshes: meshBuffers, lights: lightBuffers, cameras: [cameraBuffer], groups: groupBuffers\n };\n for (let groupBuffer of groupBuffers) {\n accumulator = this._unwrapBuffers(groupBuffer, accumulator);\n }\n // destroy leftovers\n this.#looper?.items.meshes.forEach(buffer => {\n if (!meshBuffers.includes(buffer)) {\n buffer.destroy();\n }\n });\n this.#looper = new RenderLooper(accumulator);\n }\n update(...items) {\n this._update(Array.from(items));\n }\n dispose() {\n this.#looper = null;\n if (this._disposeContext()) {\n const { device } = this.#context;\n device.removeEventListener('uncapturederror', this._logError);\n device.destroy;\n }\n }\n _disposeContext() {\n const ctx = this.#context;\n if (Utils.isNull(ctx)) {\n return false;\n }\n // dispose associated raycasters, if any\n Raycasters.dispose(ctx);\n // dispose associated pipelines, if any\n RenderPipelines.dispose(ctx);\n // dispose textures\n const textures = this.#textures;\n this.#textures = null;\n if (!Utils.isNull(textures)) {\n const { render, depth } = textures;\n destroyTextures(render?.texture, depth?.texture);\n }\n // dispose context\n ctx.context.unconfigure();\n return true;\n }\n resize(size) {\n this.#rebuildingContext = true;\n if (this._disposeContext()) {\n const { device, adapter } = this.#context;\n const { context, textureFormat: format } = this._buildContext(this.canvas, size);\n this._buildUpContext(device, adapter, context, format);\n // interaction\n if (this.#hasModifiers) {\n Utils.extend(this.#interaction, { resolution: size });\n }\n }\n }\n get canvas() {\n return this.#canvas;\n }\n}\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElementUtils, CustomElement, P, Watch, PropertyConverters, PropertyChangeEvent, PropertyChangeEventName, Debounce, Utils, Logging, Components } from '@pacem/pacem-core';\nimport { Strings } from '@pacem/pacem-foundation';\nimport { Pacem3DAdapterElement, StalePropertyFlag } from '../../types';\nimport { Renderers, WebGPUIssueCause } from './renderer';\n//namespace Pacem.Components.Drawing3D {\nconst WEBGPU_RAYCAST_CALLBACK_PROP = 'WebGPURaycastCallback';\nconst WEBGPU_RAYCAST_PIXEL_PROP = 'WebGPURaycastPixel';\nconst GETVAL = CustomElementUtils.getAttachedPropertyValue, SETVAL = CustomElementUtils.setAttachedPropertyValue, DELVAL = CustomElementUtils.deleteAttachedPropertyValue;\nlet Pacem3DWgslScriptElement = class Pacem3DWgslScriptElement extends Components.PacemItemElement {\n findContainer() {\n return CustomElementUtils.findAncestor(this, n => n instanceof Pacem3DWebgpuAdapterElement);\n }\n #version = '';\n get version() {\n return this.#version;\n }\n #observer = new MutationObserver(() => {\n this.wgsl = this.textContent;\n });\n viewActivatedCallback() {\n super.viewActivatedCallback();\n this.wgsl = this.textContent;\n this.#observer.observe(this, { characterData: true });\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (name === 'wgsl') {\n this._computeVersion(val);\n }\n }\n _computeVersion(wgsl = this.wgsl) {\n Strings.hash(wgsl).then(v => {\n if (v !== this.#version) {\n const old = this.#version;\n const val = v;\n this.#version = val;\n const evt = new PropertyChangeEvent({ propertyName: 'version', oldValue: old, currentValue: val, firstChange: Utils.isNullOrEmpty(old) });\n this.dispatchEvent(evt);\n }\n });\n }\n disconnectedCallback() {\n this.#observer.disconnect();\n super.disconnectedCallback();\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], Pacem3DWgslScriptElement.prototype, \"type\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.String })\n], Pacem3DWgslScriptElement.prototype, \"wgsl\", void 0);\nPacem3DWgslScriptElement = __decorate([\n CustomElement({ tagName: P + '-3d-wgsl-script' })\n], Pacem3DWgslScriptElement);\nexport { Pacem3DWgslScriptElement };\nlet Pacem3DWebgpuAdapterElement = class Pacem3DWebgpuAdapterElement extends Pacem3DAdapterElement {\n constructor() {\n super(...arguments);\n this.#items = [];\n this._scriptVersionChangeHandler = (evt) => {\n const { propertyName: name } = evt.detail;\n if (name === 'version') {\n this._parseWgslModifiers(evt.detail.currentValue);\n }\n };\n this.#scenes = new Set();\n this.#renderers = new Map();\n this.#supported = true;\n this.#active = true;\n this.#sceneToUpdate = new WeakMap();\n }\n invalidateSize(stage, size = stage.size) {\n const renderer = this._ensureRenderer(stage);\n renderer?.resize(size);\n }\n #items;\n get items() {\n return this.#items;\n }\n register(item) {\n const items = this.#items;\n if (item instanceof Pacem3DWgslScriptElement && !items.includes(item)) {\n item.addEventListener(PropertyChangeEventName, this._scriptVersionChangeHandler, false);\n items.push(item);\n this._parseWgslModifiers(this.modifiers?.version);\n return true;\n }\n return false;\n }\n unregister(item) {\n const items = this.#items;\n const ndx = items.indexOf(item);\n if (ndx >= 0) {\n item.removeEventListener(PropertyChangeEventName, this._scriptVersionChangeHandler, false);\n items.splice(ndx, 1);\n this._parseWgslModifiers(this.modifiers?.version);\n return true;\n }\n return false;\n }\n #scenes;\n #renderers;\n #supported;\n #active;\n get supported() {\n return this.#supported;\n }\n get active() {\n return this.#active;\n }\n _webGPUNotSupported(issue) {\n if (this.#supported && issue.cause === WebGPUIssueCause.NotSupported) {\n this.#supported = false;\n this.dispatchEvent(new PropertyChangeEvent({ propertyName: 'supported', oldValue: null, currentValue: false }));\n }\n if (this.#active) {\n this.#active = false;\n this.dispatchEvent(new PropertyChangeEvent({ propertyName: 'active', oldValue: null, currentValue: false }));\n }\n }\n initialize(scene) {\n const set = this.#renderers;\n const scenes = this.#scenes;\n if (!scenes.has(scene)) {\n scenes.add(scene);\n }\n return Renderers.create(scene, { enableValidation: this.enableValidation ?? false, modifiers: this.modifiers })\n .then(renderer => {\n set.get(scene)?.update( /* empty */);\n // update dictionary with the actual renderer\n set.set(scene, renderer);\n // assign datasource immediately\n this._updatePipeline(scene);\n return renderer.canvas;\n }, (issue) => {\n this.log(Logging.LogLevel.Error, issue.message);\n this._webGPUNotSupported(issue);\n return null;\n });\n }\n _parseWgslModifiers(val) {\n const scripts = this.#items, vertexGeometryScript = scripts.find(a => a.type == 'vertex-input'), vertexOutputScript = scripts.find(a => a.type == 'vertex-output'), fragmentScript = scripts.find(a => a.type == 'fragment');\n const vertexInput = vertexGeometryScript?.wgsl, vertexOutput = vertexOutputScript?.wgsl, fragment = fragmentScript?.wgsl;\n this.modifiers = { vertexInput, vertexOutput, fragment, version: val };\n }\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n if (first) {\n return;\n }\n switch (name) {\n case 'modifiers':\n case 'enableValidation':\n // reinitialize\n this._reinitialize();\n break;\n }\n }\n disconnectedCallback() {\n const set = this.#renderers;\n for (let [_, renderer] of set) {\n renderer?.dispose();\n }\n set.clear();\n this.#scenes.clear();\n super.disconnectedCallback();\n }\n dispose(scene) {\n const renderers = this.#renderers, scenes = this.#scenes;\n ;\n if (renderers.has(scene)) {\n renderers.get(scene)?.dispose();\n renderers.delete(scene);\n }\n if (scenes.has(scene)) {\n scenes.delete(scene);\n }\n }\n _reinitialize() {\n for (let scene of this.#scenes.values()) {\n // rebuild renderer with new config in association to scene\n this.initialize(scene);\n }\n }\n _ensureRenderer(scene) {\n const set = this.#renderers;\n return set.get(scene);\n }\n _updatePipeline(scene) {\n const renderer = this._ensureRenderer(scene);\n renderer?.update(...scene.datasource);\n }\n #sceneToUpdate;\n /**\n * Called when scene datasource changes.\n * @param scene\n */\n render(scene) {\n // do not render hidden stages\n const width = scene.size?.width, height = scene.size?.height;\n if (!(width > 0) || !(height > 0)) {\n return;\n }\n // retrieve stage renderer\n const renderer = this._ensureRenderer(scene);\n if (Utils.isNull(renderer)) {\n return;\n }\n if (this.#sceneToUpdate.has(scene)) {\n this.#sceneToUpdate.delete(scene);\n this._itemsChangedExec(scene);\n }\n // draw\n const pixel = GETVAL(scene, WEBGPU_RAYCAST_PIXEL_PROP);\n renderer.render({ cursor: pixel, time: performance.now(), resolution: { width, height } });\n // raycast, just in case\n if (!scene.interactive) {\n return;\n }\n const callback = GETVAL(scene, WEBGPU_RAYCAST_CALLBACK_PROP);\n if (Utils.isNullOrEmpty(callback)) {\n return;\n }\n if (Utils.isNullOrEmpty(pixel)) {\n callback(null);\n return;\n }\n // draw again\n renderer.raycast(pixel).then(array => {\n if (Utils.isNullOrEmpty(array)) {\n callback(null);\n }\n else {\n const retval = {\n object: array[0], point: null\n };\n callback(retval);\n }\n });\n }\n snapshot(scene, background, type, quality) {\n const renderers = this.#renderers;\n if (!renderers.has(scene)) {\n return Promise.resolve(null);\n }\n const { canvas } = renderers.get(scene);\n const jpeg = !Utils.isNullOrEmpty(background), mime = type ?? (jpeg ? 'image/jpeg' : null), compression = quality ?? (jpeg ? .9 : null);\n return new Promise((resolve, _) => {\n this.render(scene);\n Utils.snapshotElement(canvas, background, mime, compression).then(resolve);\n });\n }\n raycast(stage, point, size, callback) {\n SETVAL(stage, WEBGPU_RAYCAST_CALLBACK_PROP, callback);\n if (point.x < 0 || point.y < 0 || point.x >= size.width || point.y >= size.height) {\n DELVAL(stage, WEBGPU_RAYCAST_PIXEL_PROP);\n }\n else {\n SETVAL(stage, WEBGPU_RAYCAST_PIXEL_PROP, point);\n }\n }\n _itemsChangedExec(stage) {\n this._updatePipeline(stage);\n }\n _itemsChanged(stage, _) {\n this.#sceneToUpdate.set(stage, true);\n }\n addItem(stage, item) {\n this._itemsChanged(stage, item);\n }\n removeItem(stage, item) {\n this._itemsChanged(stage, item);\n }\n updateItem(stage, item) {\n // if 'hide' property has changed or 'children' property (for groups)\n // then there's need to regenerate the tree view (camera switch, more/less meshes, ...)\n if (Utils.isNull(item)\n || item.flags.indexOf(StalePropertyFlag.Visibility) >= 0\n || item.flags.indexOf(StalePropertyFlag.Children) >= 0) {\n this._itemsChanged(stage, item);\n }\n }\n zoomFit(stage, ...items) {\n // TODO: implement on the renderer side\n return Promise.resolve();\n }\n project(stage, point3D) {\n // TODO: implement on the renderer side\n return { x: 0, y: 0 };\n }\n getScene(stage) {\n // no 3rd-party/proprietary scene objects to provide.\n return stage;\n }\n};\n__decorate([\n Debounce(100)\n], Pacem3DWebgpuAdapterElement.prototype, \"_parseWgslModifiers\", null);\n__decorate([\n Watch({ emit: false })\n], Pacem3DWebgpuAdapterElement.prototype, \"modifiers\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Boolean })\n], Pacem3DWebgpuAdapterElement.prototype, \"enableValidation\", void 0);\nPacem3DWebgpuAdapterElement = __decorate([\n CustomElement({ tagName: P + '-3d-webgpu-adapter' })\n], Pacem3DWebgpuAdapterElement);\nexport { Pacem3DWebgpuAdapterElement };\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { CustomElement, P, Watch, PropertyConverters, Utils, CustomEventUtils, avoidHandler, Behaviors, PropertyChangeEventName } from '@pacem/pacem-core';\nimport { Geometry } from '@pacem/pacem-numerical';\nimport { isCamera, StalePropertyFlag } from '../../../types';\nimport { TAG_MIDDLE_NAME } from '../../../constants';\nimport { BooleanOrNumberConverter } from '../../../converters';\n//namespace Pacem.Components.Drawing3D {\nconst Vector3D = Geometry.LinearAlgebra.Vector3D;\nconst Matrix3D = Geometry.LinearAlgebra.Matrix3D;\nconst Quaternion = Geometry.LinearAlgebra.Quaternion;\nconst Spherical = Geometry.LinearAlgebra.Spherical;\nfunction findCameraStage(element) {\n if (isCamera(element)) {\n return element.stage;\n }\n return null;\n}\nconst ROTATION_FACTOR = 1, ZOOM_FACTOR = 1, FRICTION_FACTOR = .05, EPSILON = 0.001;\nconst DEFAULT_CONFIGURATION = {\n maxAzimuth: 180, minAzimuth: -180, inertia: false, maxPolar: Infinity, minPolar: -Infinity,\n zoom: { enabled: true }, pan: { enabled: true, button: 2 }, rotation: { enabled: true, button: 0 }\n};\nexport class OrbitCameraBehavior {\n constructor(item, _config) {\n this._config = _config;\n /** State of the current configuration, obtained from the interaction inputs. */\n this._input = {\n /** Zoom/scale */\n rho: 0,\n /** Azimuth (rotation around x axis in webgpu) */\n theta: 0,\n /** Polar (rotation around y axis in webgpu) */\n phi: 0,\n /** pan/offset x*/\n x: 0,\n /** pan/offset y*/\n y: 0,\n };\n /** Sibling state of {@link _input} that comes helpful when inertia is involved. */\n this._progress = {\n rho: 0,\n theta: 0,\n phi: 0,\n x: 0,\n y: 0,\n };\n this._startHandler = (evt) => {\n const { rotation, pan } = this._config;\n const isMouse = evt.pointerType === 'mouse';\n const rotating = rotation.enabled && isMouse && evt.button === rotation.button && CustomEventUtils.matchModifiers(evt, rotation.modifiers);\n const panning = pan.enabled && isMouse && evt.button === pan.button && CustomEventUtils.matchModifiers(evt, pan.modifiers);\n if (!rotating && !panning) {\n return;\n }\n this.#rotating = rotating;\n if (this.#panning = panning) {\n // build current state from the current camera configuration\n this._currentState = OrbitCameraBehavior._buildState(this._camera);\n // reset pan offsets\n Utils.extend(this._input, Vector3D.zero());\n this._progress.x = this._progress.y = 0;\n }\n avoidHandler(evt);\n window.addEventListener('pointerup', this._endHandler, false);\n window.addEventListener('pointermove', this._moveHandler, false);\n window.addEventListener('contextmenu', this._avoidHandler, false);\n };\n this._avoidHandler = (evt) => avoidHandler(evt);\n this._endHandler = (evt) => {\n avoidHandler(evt);\n // delay the listener removals a bit (~frame)\n window.setTimeout(() => {\n window.removeEventListener('pointerup', this._endHandler);\n window.removeEventListener('pointermove', this._moveHandler);\n window.removeEventListener('contextmenu', this._avoidHandler);\n }, 20);\n };\n this._zoomHandler = (evt) => {\n const { zoom } = this._config;\n const zooming = zoom.enabled && CustomEventUtils.matchModifiers(evt, zoom.modifiers);\n if (!zooming) {\n return;\n }\n avoidHandler(evt);\n const coords = this._input;\n coords.rho -= Math.sign(evt.deltaY);\n };\n this._moveHandler = (evt) => {\n avoidHandler(evt);\n const { height, width } = this._scene.size;\n const coords = this._input;\n const size = Math.min(height, width);\n if (this.#rotating) {\n // rotation\n const f0 = -ROTATION_FACTOR * 360 / size;\n const { phi, theta } = coords;\n const { maxPolar, minPolar, maxAzimuth, minAzimuth } = this._config;\n coords.phi = (phi + evt.movementX * f0).clamp(minPolar, maxPolar);\n coords.theta = (theta + evt.movementY * f0).clamp(minAzimuth, maxAzimuth);\n }\n else if (this.#panning) {\n // pan\n const f0 = this._currentState.radius / size;\n coords.x += -evt.movementX * f0;\n coords.y += evt.movementY * f0;\n }\n };\n this._renderHandler = (_) => {\n this._update();\n };\n const scene = this._scene = (this._camera = item).stage;\n this._initialState = this._currentState = OrbitCameraBehavior._buildState(item);\n const canvas = this._canvas = scene.stage;\n canvas.addEventListener('pointerdown', this._startHandler, false);\n canvas.addEventListener('wheel', this._zoomHandler, { passive: false });\n scene.addEventListener('render', this._renderHandler, false);\n }\n static _buildState(camera) {\n const vector = Vector3D.subtract(camera.position, camera.lookAt);\n const radius = Vector3D.mag(vector);\n return { target: camera.lookAt, versor: Vector3D.unit(vector), up: camera.up, radius, position: camera.position };\n }\n /**\n * Tries to attach a new {@link OrbitCameraBehavior} to the provided element, if the element is a proper renderable and it is ready.\n * @param element\n * @returns\n */\n static tryAttach(element, config) {\n config ??= DEFAULT_CONFIGURATION;\n const canvas = findCameraStage(element)?.stage;\n if (!Utils.isNull(canvas)) {\n const { position, lookAt } = element;\n if (Utils.isNull(position) || Utils.isNull(lookAt) || Vector3D.areClose(position, lookAt)) {\n return null;\n }\n return new OrbitCameraBehavior(element, config);\n }\n else {\n return null;\n }\n }\n get configuration() {\n return this._config;\n }\n set configuration(v) {\n this._config = v;\n }\n #panning;\n #rotating;\n _getSafeAzimuth({ theta }) {\n return OrbitCameraBehavior._modAngle(theta);\n }\n _getSafePolar({ phi }) {\n return OrbitCameraBehavior._modAngle(phi);\n }\n static _modAngle(deg) {\n while (deg < 0) {\n deg += 360;\n }\n return deg % 360;\n }\n static _getViewXYZ(state) {\n const { versor, up: initUp } = state;\n const right = Vector3D.cross(versor, initUp);\n const up = Vector3D.cross(right, versor);\n Vector3D.normalize(right);\n Vector3D.normalize(up);\n return { right, up, versor };\n }\n #updating;\n _update() {\n if (this.#updating) {\n return;\n }\n this.#updating = true;\n const camera = this._camera;\n const { radius, versor, target: initTarget, up: initUp } = this._initialState;\n const { target: trackedLookAt } = this._currentState;\n const { theta, phi, rho, x, y } = this._input;\n const progress = this._progress;\n const { theta: theta_, phi: phi_, rho: rho_, x: x_, y: y_ } = progress;\n const rotated = Math.abs(phi_ - phi) > EPSILON || Math.abs(theta_ - theta) > EPSILON, zoomed = Math.abs(rho_ - rho) > EPSILON, panned = Math.abs(x - x_) > EPSILON || Math.abs(y - y_) > EPSILON;\n if (zoomed || rotated || panned) {\n const inertia = typeof this._config.inertia === 'boolean' ? (this._config.inertia ? FRICTION_FACTOR : 0) : this._config.inertia;\n const inertiaSpecified = inertia > 0 && inertia < 1;\n const { right, up } = OrbitCameraBehavior._getViewXYZ(this._initialState);\n // setup position\n let newPosition = initTarget;\n let newUp = initUp;\n let newLookAt = trackedLookAt;\n //if (zoomed) { 2\n let rho0 = rho_;\n if (inertiaSpecified) {\n rho0 += (rho - rho_) * inertia;\n }\n else {\n rho0 = rho;\n }\n progress.rho = rho0;\n const scale = Math.pow(.95, rho0 * ZOOM_FACTOR);\n const zoom = Vector3D.scale(versor, -scale * radius);\n newPosition = Vector3D.add(newPosition, zoom);\n //}\n //if (rotated) { 3\n let phi0 = phi_;\n let theta0 = theta_;\n if (inertiaSpecified) {\n phi0 += (phi - phi_) * inertia;\n theta0 += (theta - theta_) * inertia;\n }\n else {\n phi0 = phi;\n theta0 = theta;\n }\n const PHI = this._getSafePolar({ phi: progress.phi = phi0 });\n const THETA = this._getSafeAzimuth({ theta: progress.theta = theta0 });\n // pivot of the rotation matrix should be the center of the bounding sphere\n const pivot = Vector3D.negate(initTarget);\n let m = Matrix3D.translate(Matrix3D.identity(), pivot);\n const qy = Quaternion.fromAxisAngle(up, PHI);\n const qx = Quaternion.fromAxisAngle(right, THETA);\n const rot = Matrix3D.multiply(Quaternion.toRotationMatrix(qx), Quaternion.toRotationMatrix(qy));\n m = Matrix3D.multiply(m, rot);\n m = Matrix3D.translate(m, Vector3D.negate(pivot));\n newPosition = Matrix3D.transform(newPosition, m);\n newUp = Matrix3D.transform(newUp, Matrix3D.clone(m, m0 => { m0.offsetX = m0.offsetY = m0.offsetZ = 0; }));\n //}\n //if (panned){ 1\n const x1 = x_, y1 = y_;\n let x0 = x1, y0 = y1;\n if (inertiaSpecified) {\n x0 += (x - x1) * inertia;\n y0 += (y - y1) * inertia;\n }\n else {\n x0 = x;\n y0 = y;\n }\n progress.x = x0;\n progress.y = y0;\n const { right: currentRight, up: currentUp } = OrbitCameraBehavior._getViewXYZ(this._currentState);\n const r = Vector3D.scale(currentRight, x0), u = Vector3D.scale(currentUp, y0);\n const offset = Vector3D.add(r, u);\n newLookAt = Vector3D.add(trackedLookAt, offset);\n camera.lookAt = newLookAt;\n camera.position = newPosition; // Vector3D.add(newPosition, Vector3D.subtract(initTarget, newLookAt));\n camera.up = newUp;\n // notify something has changed about the target renderable\n camera.flags.push(StalePropertyFlag.Camera);\n }\n this.#updating = false;\n }\n /** Detaches and removes handlers and resources. */\n dispose() {\n const canvas = this._canvas, scene = this._scene;\n if (!Utils.isNull(canvas)) {\n canvas.removeEventListener('pointerdown', this._startHandler);\n canvas.removeEventListener('wheel', this._zoomHandler);\n }\n scene.removeEventListener('render', this._renderHandler, false);\n }\n}\nlet PacemOrbitCameraBehaviorElement = class PacemOrbitCameraBehaviorElement extends Behaviors.PacemBehavior {\n constructor() {\n super(...arguments);\n this.#map = new Map();\n this._readyHandler = (evt) => {\n if (evt.detail.propertyName === 'isReady' && evt.detail.currentValue === true) {\n const element = evt.currentTarget;\n element.removeEventListener(PropertyChangeEventName, this._readyHandler);\n this._decorateCore(element);\n }\n };\n }\n #map;\n propertyChangedCallback(name, old, val, first) {\n super.propertyChangedCallback(name, old, val, first);\n switch (name) {\n case 'maxAzimuth':\n case 'minAzimuth':\n case 'inertia':\n case 'zoomControl':\n case 'panControl':\n case 'rotationControl':\n const config = this._buildConfig();\n const items = this.#map;\n for (let tr of items.values()) {\n tr.configuration = config;\n }\n break;\n }\n }\n disconnectedCallback() {\n const items = this.#map;\n for (let tr of items.values()) {\n tr.dispose();\n }\n items.clear();\n super.disconnectedCallback();\n }\n _buildConfig() {\n return Utils.extend({}, DEFAULT_CONFIGURATION, {\n maxAzimuth: this.maxAzimuth ?? Infinity,\n minAzimuth: this.minAzimuth ?? -Infinity,\n minPolar: this.minPolar ?? -Infinity,\n maxPolar: this.maxPolar ?? Infinity,\n inertia: this.inertia ?? false,\n zoom: this.zoomControl ?? DEFAULT_CONFIGURATION.zoom,\n pan: this.panControl ?? DEFAULT_CONFIGURATION.pan,\n rotation: this.rotationControl ?? DEFAULT_CONFIGURATION.rotation,\n });\n }\n _decorateCore(element) {\n const behavior = OrbitCameraBehavior.tryAttach(element, this._buildConfig());\n if (!Utils.isNull(behavior)) {\n this.#map.set(element, behavior);\n }\n }\n decorate(element) {\n if (element.isConnected) {\n this._decorateCore(element);\n }\n else {\n element.addEventListener(PropertyChangeEventName, this._readyHandler, false);\n }\n }\n undecorate(element) {\n const map = this.#map;\n if (map.has(element)) {\n map.get(element).dispose();\n map.delete(element);\n }\n }\n};\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemOrbitCameraBehaviorElement.prototype, \"maxAzimuth\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemOrbitCameraBehaviorElement.prototype, \"maxPolar\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemOrbitCameraBehaviorElement.prototype, \"minAzimuth\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemOrbitCameraBehaviorElement.prototype, \"minPolar\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemOrbitCameraBehaviorElement.prototype, \"zoomControl\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemOrbitCameraBehaviorElement.prototype, \"rotationControl\", void 0);\n__decorate([\n Watch({ emit: false, converter: PropertyConverters.Number })\n], PacemOrbitCameraBehaviorElement.prototype, \"panControl\", void 0);\n__decorate([\n Watch({ emit: false, converter: BooleanOrNumberConverter })\n], PacemOrbitCameraBehaviorElement.prototype, \"inertia\", void 0);\nPacemOrbitCameraBehaviorElement = __decorate([\n CustomElement({ tagName: P + '-' + TAG_MIDDLE_NAME + '-orbit-camera' })\n], PacemOrbitCameraBehaviorElement);\nexport { PacemOrbitCameraBehaviorElement };\n","//namespace Pacem.Components.Drawing3D {\n/** @deprecated*/\nexport class Pacem3DDetector {\n constructor() {\n this._detected = {\n supported: false, info: {}\n };\n let cvs = document.createElement('canvas');\n let contextNames = ['webgl', 'experimental-webgl', 'moz-webgl', 'webkit-3d'];\n let ctx;\n let getParam = function (str) {\n if (!str)\n return undefined;\n return ctx.getParameter(str);\n };\n // addLine\n let addLine = (section, name, value) => {\n let detected = this._detected;\n var info = detected.info[section] = detected.info[section] || {};\n name = name.replace(/[^\\w]+/g, '');\n name = name.substring(0, 1).toLowerCase() + name.substring(1);\n info[name] = value;\n };\n if (navigator.userAgent.indexOf('MSIE') >= 0) {\n try {\n ctx = window['WebGLHelper'].CreateGLContext(cvs, 'canvas');\n }\n catch (e) { }\n }\n else {\n for (var i = 0; i < contextNames.length; i++) {\n try {\n ctx = cvs.getContext(contextNames[i]);\n if (ctx) {\n addLine('main', 'Context Name', contextNames[i]);\n break;\n }\n }\n catch (e) { }\n }\n }\n this._detected.supported = !!ctx;\n addLine('main', 'Platform', navigator.platform);\n addLine('main', 'Agent', navigator.userAgent);\n if (ctx) {\n addLine('main', 'Vendor', getParam(ctx.VENDOR));\n addLine('main', 'Version', getParam(ctx.VERSION));\n addLine('main', 'Renderer', getParam(ctx.RENDERER));\n addLine('main', 'Shading Language Version', getParam(ctx.SHADING_LANGUAGE_VERSION));\n addLine('bits', 'Rgba Bits', getParam(ctx.RED_BITS) + ', ' + getParam(ctx.GREEN_BITS) + ', ' + getParam(ctx.BLUE_BITS) + ', ' + getParam(ctx.ALPHA_BITS));\n addLine('bits', 'Depth Bits', getParam(ctx.DEPTH_BITS));\n addLine('shader', 'Max Vertex Attribs', getParam(ctx.MAX_VERTEX_ATTRIBS));\n addLine('shader', 'Max Vertex Texture Image Units', getParam(ctx.MAX_VERTEX_TEXTURE_IMAGE_UNITS));\n addLine('shader', 'Max Varying Vectors', getParam(ctx.MAX_VARYING_VECTORS));\n addLine('shader', 'Max Uniform Vectors', getParam(ctx.MAX_VERTEX_UNIFORM_VECTORS));\n addLine('tex', 'Max Combined Texture Image Units', getParam(ctx.MAX_COMBINED_TEXTURE_IMAGE_UNITS));\n addLine('tex', 'Max Texture Size', getParam(ctx.MAX_TEXTURE_SIZE));\n addLine('tex', 'Max Cube Map Texture Size', getParam(ctx.MAX_CUBE_MAP_TEXTURE_SIZE));\n addLine('tex', 'Num. Compressed Texture Formats', getParam(ctx.COMPRESSED_TEXTURE_FORMATS));\n addLine('misc', 'Max Render Buffer Size', getParam(ctx.MAX_RENDERBUFFER_SIZE));\n addLine('misc', 'Max Viewport Dimensions', getParam(ctx.MAX_VIEWPORT_DIMS));\n addLine('misc', 'Aliased Line Width Range', getParam(ctx.ALIASED_LINE_WIDTH_RANGE));\n addLine('misc', 'Aliased Point Size Range', getParam(ctx.ALIASED_POINT_SIZE_RANGE));\n addLine('misc', 'Supported Extensions', ctx.getSupportedExtensions() || []);\n }\n }\n get info() {\n return this._detected.info;\n }\n get supported() {\n return this._detected.supported;\n }\n}\n","var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n};\nimport { Transformer } from '@pacem/pacem-core';\nimport { Point } from '@pacem/pacem-foundation';\nimport { MeshGeometry } from '../geometry';\nimport { Point3DConverter } from '../converters';\n//namespace Pacem.Drawing3D {\nclass OBJParser {\n static parse(content) {\n // vertices\n const vertices = [];\n const vParser = /^v((\\s+-?[\\d\\.]+){3})/gm;\n let arr = vParser.exec(content);\n while (arr && arr.length) {\n vertices.push(Point3DConverter.convert(arr[1]));\n arr = vParser.exec(content);\n }\n // uvmap\n const vt = [];\n const tParser = /^vt((\\s+-?[\\d\\.]+){2})/gm;\n arr = tParser.exec(content);\n while (arr && arr.length) {\n vt.push(Point.parse(arr[1]));\n arr = tParser.exec(content);\n }\n // normals\n const vn = [];\n const nParser = /^vn((\\s+-?[\\d\\.]+){3})/gm;\n arr = nParser.exec(content);\n while (arr && arr.length) {\n vn.push(Point3DConverter.convert(arr[1]));\n arr = nParser.exec(content);\n }\n const normals = [];\n const uv = [];\n const positions = [];\n const fParser = /^f((\\s+([\\d]+\\/[\\d]+\\/[\\d]+)){3,})/gm;\n arr = fParser.exec(content);\n while (arr && arr.length) {\n const fjParser = /([\\d]+)\\/([\\d]+)\\/([\\d]+)/g;\n const face = arr[1];\n let jArr = fjParser.exec(face);\n let jIndex = 0;\n var vIndex0, tIndex0, nIndex0;\n var vIndex, tIndex, nIndex;\n while (jArr && jArr.length) {\n if (jIndex > 2) {\n // 4+ vertex-face\n // but mesh only allows triangluar faces\n // re-add(0)\n positions.push(vIndex0);\n uv.push(vt[tIndex0]);\n normals.push(vn[nIndex0]);\n // re-add(last)\n positions.push(vIndex);\n uv.push(vt[tIndex]);\n normals.push(vn[nIndex]);\n }\n // OBJ indexes are 1-based\n vIndex = parseInt(jArr[1]) - 1;\n tIndex = parseInt(jArr[2]) - 1;\n nIndex = parseInt(jArr[3]) - 1;\n positions.push(vIndex);\n uv.push(vt[tIndex]);\n normals.push(vn[nIndex]);\n if (jIndex === 0) {\n vIndex0 = vIndex;\n tIndex0 = tIndex;\n nIndex0 = nIndex;\n }\n jIndex++;\n jArr = fjParser.exec(face);\n }\n // loop\n arr = fParser.exec(content);\n }\n // faces\n return new MeshGeometry(vertices, positions, uv, normals);\n }\n}\nclass Parser3D {\n static parseGeometry(content, type) {\n switch (type.toLowerCase()) {\n case 'obj':\n return OBJParser.parse(content);\n default:\n throw new Error(`Type '${type}' is not supported.`);\n }\n }\n}\n__decorate([\n Transformer('parse3D')\n], Parser3D, \"parseGeometry\", null);\n","import { DeepMerger } from '@pacem/pacem-foundation';\nimport * as Output from './index';\nDeepMerger.merge(Output);\n"],"names":["Point3DConverter","convert","attr","Geometry","LinearAlgebra","Vector3D","parse","convertBack","prop","x","y","z","Point3DOrNumberConverter","arr","parseAsNumericalArray","throwErr","Error","Utils","isNullOrEmpty","length","from","v","QuaternionConverter","Quaternion","w","BooleanOrNumberConverter","toString","TAG_MIDDLE_NAME","DEG2RAD","Math","PI","__decorate","decorators","target","key","desc","d","c","arguments","r","Object","getOwnPropertyDescriptor","Reflect","decorate","i","defineProperty","Pacem3DElement","Components","PacemItemsContainerElement","constructor","super","this","_itemPropertyChangeHandler","evt","renderable","adapter","updateItem","flags","splice","_clickHandler","me","interactive","isNull","_lastHitResult","type","replace","hit","object","point","_itemDispatch","_hitTestCallback","result","obj","last","pt","_moveHandler","rect","_resizer","currentSize","pixel","pageX","left","pageY","top","raycast","_resizeHandler","oldSize","size","detail","height","width","invalidateSize","dispatchEvent","ResizeEvent","validate","item","RenderableElement","stage","_container","scene","getScene","register","retval","_add","addEventListener","PropertyChangeEventName","unregister","removeEventListener","_erase","_refreshDatasource","val","datasource","undefined","_buildUpDatasourceFromDOM","items","slice","addItem","removeItem","_initializeAdapter","old","Promise","resolve","reject","forEach","initialize","then","_","e","log","Logging","LogLevel","propertyChangedCallback","name","first","render","viewActivatedCallback","container","resizer","offset","dragArgs","originalEvent","evtType","Event","m","RenderableEvent","DragEvent","cancelable","UI","DragDropEventType","Init","Drag","itemevt","prevent","EventTarget","evnt","defaultPrevented","disconnectedCallback","handle","stop","deepUpdate","now","performance","Animations","Timer","run","_doRender","disabled","CustomEvent","ViewChild","PCSS","prototype","P","Watch","emit","converter","PropertyConverters","Boolean","String","Element","Json","CustomElement","tagName","shadow","Defaults","USE_SHADOW_ROOT","template","StalePropertyFlag","isStage","isRenderable","isUi3DObject","isCamera","isPerspectiveCamera","isOrthographicCamera","isLight","isMesh","isGeometry","isArray","positions","isMeshGeometry","triangleIndices","normals","textureCoordinates","isGroup","computeSharpVertexNormals","geometry","indices","RangeError","j","u","normal","computePlaneNormal","push","a","b","vAB","subtract","vAC","orthogonal","cross","unit","UI3DEvent","CustomUIEvent","eventInit","args","p","bubbles","isInteraction","Constants","OBJECT_SELECTOR","LIGHT_SELECTOR","PERSPECTIVE_CAMERA_SELECTOR","ORTHO_CAMERA_SELECTOR","MESH_SELECTOR","GROUP_SELECTOR","DEFAULT_COORDS","PacemCrossItemsContainerElement","position","staleFlags","findContainer","parent","CustomElementUtils","findAncestorOfType","findAncestor","setAsDirty","Visibility","Children","Position","flag","includes","reflectBack","Ui3DElement","Transform","translateX","translateY","translateZ","scale","scaleX","scaleY","scaleZ","_computeTransformMatrix","MAT3D","Matrix3D","VEC3D","QUAT","identity","rotate","rot","toRotationMatrix","multiply","translate","transformMatrix","Number","Pacem3DGroupElement","child","children","childRenderables","Pacem3DMeshElement","Material","Pacem3DObjectElement","Pacem3DLightElement","intensity","color","Light","Pacem3DCameraElement","near","far","up","lookAt","sphere","_resetBoundingSphere","oldValue","eye","center","radius","mag","currentValue","PropertyChangeEvent","propertyName","boundingSphere","Camera","Pacem3DPerspectiveCameraElement","fov","aspect","aspectRatio","Pacem3DOrthographicCameraElement","bottom","right","Pacem3DAdapterElement","PacemEventTarget","KnownShader","isMaterial","isBasicMaterial","shader","Basic","isLineMaterial","Line","isLambertMaterial","Lambert","isPhongMaterial","Phong","isStandardMaterial","Standard","isShaderMaterial","Custom","MaterialElement","_loadMap","url","material","texture","close","blob","Imaging","loadImage","createImageBitmap","updateMaterial","createMaterial","extend","opacity","wireframe","Css","getVariableValue","visible","hide","map","BasicMaterialElement","LambertMaterialElement","emissiveColor","reflectivity","refractionRatio","LineMaterialElement","lineWidth","lineJoin","lineCap","dashArray","split","parseInt","filter","isNaN","join","PhongMaterialElement","specularColor","shininess","flatShading","StandardMaterialElement","metalness","roughness","Pacem3DPrimitiveElement","createDefaultGeometry","NotifyChange","callback","descriptor","backingField","uniqueCode","getter","setter","call","get","set","enumerable","configurable","NodeGeometry","barycenter","bary","count","countDbl","boundingBox","output","minX","Infinity","minY","minZ","maxX","maxY","maxZ","min","max","setSelfAsDirty","LineGeometry","MeshGeometry","bbox","PacemBoxElement_1","PacemBoxElement","createMeshGeometry","depth","widthSegments","heightSegments","depthSegments","h","sw","sh","sd","uv","k","getPosIndex","epsilon","abs","appendFace","c_1","c_2","c_3","c_4","u_next","v_next","z_next","x_next","y_next","geom","w2","h2","d2","sqrt","pow","PacemConeElement_1","PacemConeElement","sides","capSegments","nodes","theta","slope","fY","fU","rj","v_prev","angle","cos","sin","index","index_prev","u_prev","prevLoopIndex","A","B","C","D","uvA","uvB","uvC","uvD","startCapIndex","bottomIndex","rj_norm","rj_norm_prev","angle_prev","cos_prev","sin_prev","prevLoopU","prevLoopV","prevLoopU_prev","prevLoopV_prev","PacemCylinderElement_1","PacemCylinderElement","capRadius","rho","startIndex","topPoint","bottomPoint","factor","uB","vB","uA","vA","faceIndicesTop","faceIndicesBottom","uvTop","uvBottom","startIndexPrevLoop","factor0","uC","vC","uD","vD","uvA2","uvB2","uvC2","uvD2","sideStartIndex","capLastIndex","fV","i_prev","PacemLineElement_1","DEFAULT_LINE","PacemLineElement","createLineGeometry","PacemPlaneElement_1","PacemPlaneElement","lengthSegments","halfWidth","halfLength","rowPoints","PacemTetrahedronElement_1","PacemOctahedronElement_1","PacemHexahedronElement_1","PacemIcosahedronElement_1","PacemDodecahedronElement_1","_utils","input","pattern","match","exec","ret","g","parseFloat","Point3D","PolyhedronElement","_assignMeshGeometry","PacemTetrahedronElement","nodesToParse","nodeToParse","pt3D","pointsToParse","texIndices","uvCoords","zero","PacemOctahedronElement","PacemHexahedronElement","PacemIcosahedronElement","PacemDodecahedronElement","PacemSphereElement_1","PacemSphereElement","segs","tessellation","segments","angle1","cos_angle1","sin_angle1","angle2","PacemTorusElement_1","PacemTorusElement","innerRadius","coords","phi","r1","r2","cos_angle2","prev_j","prev_i","AdapterUtils","isVector3D","isRgba","flattenVectorArray","array","findCamera","find","clipPixel","viewport","HTMLElement","offsetRect","Point","isPoint","page","CustomEventUtils","getEventCoordinates","_clipPoint","threeJsVersion","consts","VERSION","API_URI","ORBIT_URI","LOADERS","DEFAULT_MATERIAL","THREE","MeshStandardMaterial","materialToMaterial","lineBase","Colors","stringify","transparent","base","mipMapMaterial","TextureLoader","load","needsUpdate","emissive","MeshPhongMaterial","specular","MeshLambertMaterial","dash","gap","lineMatOptions","linecap","linejoin","linewidth","LineBasicMaterial","LineDashedMaterial","dashSize","gapSize","MeshBasicMaterial","content","toLowerCase","ObjectLoader","build","mesh","Mesh","isTHREEAvailable","window","Pacem3DThreeAdapterElement","_renderer","_camera","_scene","_orbitCtrls","_objects","WeakMap","_dict","_orbitControlsDelegate","_ensureAndRefresh","object3D","matrixAutoUpdate","mesh3D","indexOf","dispose","mesh3D2","remove","id","BufferGeometry","vertices","setAttribute","Float32BufferAttribute","setIndex","uvs","computeVertexNormals","nodeGeometryToBufferGeometry","frontMaterial","backMaterial","multiAllowed","multi","materials","side","FrontSide","DoubleSide","backsideMaterial","BackSide","materialToMaterials","_addOrUpdateItem","light","Color","posv","positionMatrix","Matrix4","apply","matrix","m11","m21","m31","offsetX","m12","m22","m32","offsetY","m13","m23","m33","offsetZ","m14","m24","m34","m44","updateMatrix","userData","tag","getObjectById","add","_assertMonoStage","_3d","snapshot","background","quality","jpeg","mime","compression","snapshotElement","_stage","project","point3D","vector","Vector3","widthHalf","heightHalf","zoomFit","camera","targets","o","has","controls","selection","fitOffset","box","Box3","expandByObject","getSize","getCenter","fitHeightDistance","atan","fitWidthDistance","distance","hasControls","direction","clone","sub","normalize","multiplyScalar","maxDistance","copy","updateProjectionMatrix","update","fitCameraToSelection","Vector2","raycaster","Raycaster","setFromCamera","intersects","intersectObjects","intersection","inert","wrapper","document","createElement","innerHTML","appendChild","importjs","async","start","Date","initialized","pred","setTimeout","whenTHREEAvailable","all","concat","js","Scene","parameters","canvas","antialias","stencil","alpha","WebGLRenderer","setSize","clr","theejsClr","setClearColor","orbit","_setCamera","cam","_disposeOrbitControls","_initOrbitControls","_updateRenderer","renderer","setClearAlpha","PerspectiveCamera","bag","obj3d","delete","parent3d","pcam","lookAtVector","OrthographicCamera","ocam","objOut","spotLight","SpotLight","PointLight","lightToLight","Group","LABEL_PREFIX","VERTEX_COLOR_REFERENCE","AMBIENT_COLOR_REFERENCE","LIGHTING_COLOR_REFERENCE","WGSL_VERTEXINPUT_STRUCT_NAME","WGSL_VERTEXOUTPUT_STRUCT_NAME","WGSL_INTERACTIONDATA_STRUCT_NAME","GPUBufferUsage","GPUTextureUsage","GPUShaderStage","GPUMapMode","WGSLBindingType","Buffers","create","device","data","label","buffer","createBuffer","byteLength","usage","VERTEX","COPY_DST","mappedAtCreation","Float32Array","getMappedRange","unmap","createUniform","UNIFORM","createStorage","STORAGE","createIndexed","INDEX","Uint16Array","BufferLayouts","createVertex","shaderLocationStart","sizes","attributes","fullSize","sz","shaderLocation","BYTES_PER_ELEMENT","format","arrayStride","stepMode","DefaultBasicMaterialFragmentOptions","outputNormalLocation","outputVertexLocation","outputUvLocation","outputVertexIndexLocation","outputRayIndexLocation","outputInstanceIndexLocation","storageMaterialGroupIndex","storageMaterialBindingIndex","adaptWGSLStringArray","getBasicMaterialFragmentWgsl","extensions","options","opts","definitions","bindings","modifiers","modifier","trimmed","trim","endsWith","adaptWGSLModifierStringArray","lighting","ambient","DefaultLineMaterialFragmentOptions","STORAGE_GROUP_INDEX_LINE","getLineMaterialFragmentWgsl","Materials","BasicMaterial","LineMaterial","TypeError","EmptyMaterialWGSLDelegates","MaterialBase","ReferenceError","wgsl","_diffuseColor","materialValue","value","version","texBmp","createTexture","TEXTURE_BINDING","RENDER_ATTACHMENT","source","fragment","ctx","lineMaterial","lineValue","clientWidth","clientHeight","defaultVertexGeometryModifierArgs","extractMeshVertexModifierFunctionComponents","regex","RegExp","arg","kvp","body","DefaultMeshVertexOptions","outputRayLocation","inputPositionLocation","inputNormalLocation","inputUvLocation","uniformViewBindingIndex","uniformViewGroupIndex","uniformWorldBindingIndex","uniformWorldGroupIndex","uniformInteractionBindingIndex","uniformInteractionGroupIndex","DefaultLineVertexOptions","storagePositionsGroupIndex","storagePositionsBindingIndex","uniformDimensionsGroupIndex","uniformDimensionsBindingIndex","getVertexOutputStructDefinition","getColorPickingFragmentWgsl","groupIndex","DefaultTextureMapReferences","DefaultDirectionalLightReferences","inputColor","directionalLight","references","group","binding","lightReference","ref","outputColor","DefaultOmniLightReferences","ray","omniLight","vertex","ambientLight","DEFAULT_SIZE","Cameras","view","dot","assertNearFarCorrectness","projection","zoom","orthographic","fovY","tan","finitelyFar","isFinite","perspective","throwBufferRequestError","createRenderableBuffer","RenderableGroupBuffer","RenderableMeshBuffer","RenderableCameraBuffer","RenderableLightBuffer","RenderLooper","_set","loop","meshes","cameras","groups","lights","cameraDone","lightsDone","disposed","RenderableBuffers","clearFlags","ManagedBuffers","GeometryBuffer","MaterialBuffer","InteractionBuffer","includeParent","bufferBase","allFlags","parentBufferBase","parentFlags","union","ManagedBufferBase","lock","unlock","garbage","shift","_destroyUnsafe","destroy","destroySafely","objects","Array","RenderableBufferBase","parentBuffer","u32id","uniqueId","u32idBuffer","Map","buildParentWorldTransform","worldMatrix","step","parentItem","parentItemMatrix","buildWorldTransform","itemMatrix","parentWorldMatrix","versions","context","pipeline","fresh","u32idBufferValue","Uint32Array","u32idBufferBuffer","specificBuffer","DefaultMaterial","viewBag","clear","_rebuildMatrices","viewProjection","viewValue","toArray","viewBuffer","roundoff","_destroyView","bufferBag","freshness","packed","geometryBuffers","_rebuildGeometryBuffers","newInPipeline","ensureInBag","posFresh","normFresh","uvFresh","geomFresh","_destroyBuffers","meshGeometry","flatPositions","length2","length3","positionsValue","normalsValue","uvValue","geomValue","offset2","offset3","nx","ny","nz","obsolete","textureBag","wgpuMaterial","buffers","textures","_resetMaterialBuffers","_ensureMaterialBuffer","values","t","fields","time","cursor","resolution","_ensureInteractionBuffer","geometryBuffer","materialBuffers","materialBuffer","worldTransform","transform","worldTransformBufferBag","geometries","_rebuildWorldMatrices","_ensureGeometryBuffer","mater","mat","wFresh","current","cache","transpose","invert","world","_rebuildAmbientLightBuffer","_rebuildDirectionalLightBuffer","offsetIntensity","_rebuildOmniLightBuffer","_rebuildLight","labelPrefix","DefaultPipelineOptions","multisample","packedVertices","primitive","topology","frontFace","cullMode","EMPTY_BIND_DELEGATE","RenderPipelines","_memoizer","memoizer","createColorPicking","renderPipeline","MeshRenderPipelineClass","LineRenderPipelineClass","frame","pipelineOptions","isLine","builder","MeshWGSLBuilder","LineWGSLBuilder","found","Dates","toISOString","RenderPipelineCache","ensureBindGroup","refresh","layout","entries","resource","createBindGroup","bindgroups","reset","_computeBasicData","inputModifier","vertexInput","outputModifier","vertexOutput","bindgroup","metadata","lightCount","mapCount","filteredArr","modifierInput","modifyInstructionInput","modifierFnInput","modifierName","arg0","arg1","modifierBody","modifierOutput","modifyInstructionOutput","modifierFnOutput","getMeshVertexWgsl","hasTexture","hasLighting","materialBindGroupIndex","lightingBindGroupIndex","MATERIAL_GROUP_INDEX","_computeBindGroupsAndReferences","lArr","ndx","Interaction","extra","merge","definition","materialGroupIndex","samplerReference","texReference","outputColors","textureMap","lightIndex","lightBuffer","PipelineUtils","queue","writeBuffer","_context","_builder","_cache","_ensureU32idBindGroup","_pickBindGroupLayout","_ensureMaterialBindGroup","layoutIndex","_bindGroupLayouts","createSampler","addressModeU","addressModeV","magFilter","minFilter","createView","_ensureWorldTransformBindGroup","raycasting","_ensureCameraProjectionAndInteractionDataBindGroup","interactionBuffer","_ensureLightingBindGroup","l","_bindVertex","_bindPicker","_bindWorldTransform","_bindRaycastWorldTransform","_bindCameraProjectionAndInteractionData","_bindRaycastCameraProjectionAndInteractionData","_bindLighting","_bindMaterial","pass","bind","draw","meshBuffer","cameraBuffer","lightBuffers","setPipeline","_pipeline","console","error","_pickPipeline","_key","module","createShaderModule","code","viewBindGroupLayout","createBindGroupLayout","visibility","FRAGMENT","worldBindGroupLayout","bindGroupLayouts","blend","srcFactor","dstFactor","materialBindGroupLayoutDescriptorEntries","hasTex","sampler","keys","SAMPLER_BINDING_INDEX","materialBindGroupLayoutDescriptor","materialBindGroupLayout","lightingGroupIndex","lightingBindGroupLayout","createPipelineLayout","depthStencil","depthCompare","depthWriteEnabled","createRenderPipeline","pickFragGroupLayout","pickDescriptor","at","setVertexBuffer","bindWorldTransform","worldTransformBuffer","bindGroup","setBindGroup","bindCameraProjectionAndInteractionData","viewTransformBuffer","viewTransformBufferBuffer","interactionDataBuffer","interactionDataBufferBuffer","interactionGroup","vertexColorsBuffer","vertexColorsBufferBuffer","tex","copyExternalImageToTexture","flipY","some","line","thickness","dashPattern","fat","getFatLineVertexWgsl","getDefaultLineVertexWgsl","geometryPositions","_lineBuilder","_ensureLineU32idBindGroup","_pickLineBindGroupLayout","_ensureLineMaterialBindGroup","_bindLineGroupLayouts","_ensureLinePositionsBindGroup","_ensureLineWorldTransformBindGroup","_ensureLineCameraProjectionBindGroup","_bindLinePositions","_bindLinePicker","_bindLineWorldTransform","_bindLineRaycastWorldTransform","_bindLineCameraProjection","_bindLineRaycastCameraProjection","_bindLineMaterial","_drawLine","_linePipeline","_pickLinePipeline","_lineKey","fatLines","lineEntries","vertexBindGroupLayouts","raycastLayoutIndex","bindLineWorldTransform","bindLineCameraProjection","positionsBuffer","positionsBufferBuffer","buffersInput","lineBuffer","lineBufferBuffer","Raycasters","ColorPickingRaycaster","interaction","_encoder","_pass","end","_handle","commandEncoder","_textures","pickTexture","pickBuffer","_ensureBuffer","copyTextureToBuffer","origin","bytesPerRow","rowsPerImage","submit","finish","_this","mapAsync","READ","_createTexture","limits","maxTextureDimension2D","COPY_SRC","_buffer","NUM_PIXELS","MAP_READ","_ensureTextures","renderTex","depthTex","_destroyTexture","begin","createCommandEncoder","passDescriptor","colorAttachments","clearValue","loadOp","storeOp","depthStencilAttachment","depthClearValue","depthLoadOp","depthStoreOp","beginRenderPass","WebGPUIssueCause","Renderers","config","navigator","gpu","RendererClass","init","issue","message","cause","Disabled","NotSupported","renderables","looper","enableValidation","_logError","logger","rebuildingContext","hasModifiers","_buildPassDescriptor","canvasTexture","getCurrentTexture","sampleCount","backColor","bgColor","canvasTexView","colorAttachment","renderTexView","depthTexView","stencilClearValue","stencilReadOnly","resolveTarget","_buildContext","getContext","textureFormat","getPreferredCanvasFormat","_buildUpContext","configure","alphaMode","requestAdapter","requestDevice","validationScope","pushErrorScope","popErrorScope","_disposeRenderableJustInCase","store","_createOrYieldRenderable","_createOrYieldGeometry","_createOrYieldMaterial","_unwrapBuffers","grp","accumulator","itemBuffer","_update","groupBuffers","meshBuffers","factory","groupBuffer","_disposeContext","destroyTextures","unconfigure","resize","WEBGPU_RAYCAST_CALLBACK_PROP","WEBGPU_RAYCAST_PIXEL_PROP","GETVAL","getAttachedPropertyValue","SETVAL","setAttachedPropertyValue","DELVAL","deleteAttachedPropertyValue","Pacem3DWgslScriptElement","PacemItemElement","n","Pacem3DWebgpuAdapterElement","observer","MutationObserver","textContent","observe","characterData","_computeVersion","Strings","hash","firstChange","disconnect","_scriptVersionChangeHandler","_parseWgslModifiers","scenes","Set","renderers","supported","active","sceneToUpdate","_ensureRenderer","_webGPUNotSupported","_updatePipeline","scripts","vertexGeometryScript","vertexOutputScript","fragmentScript","_reinitialize","_itemsChangedExec","_itemsChanged","Debounce","Spherical","EPSILON","DEFAULT_CONFIGURATION","maxAzimuth","minAzimuth","inertia","maxPolar","minPolar","enabled","pan","button","rotation","OrbitCameraBehavior","_config","_input","_progress","_startHandler","isMouse","pointerType","rotating","matchModifiers","panning","_currentState","_buildState","avoidHandler","_endHandler","_avoidHandler","_zoomHandler","sign","deltaY","f0","movementX","clamp","movementY","_renderHandler","_initialState","_canvas","passive","versor","tryAttach","element","findCameraStage","areClose","configuration","_getSafeAzimuth","_modAngle","_getSafePolar","deg","_getViewXYZ","state","initUp","updating","initTarget","trackedLookAt","progress","theta_","phi_","rho_","x_","y_","rotated","zoomed","panned","inertiaSpecified","newPosition","newUp","newLookAt","rho0","phi0","theta0","PHI","THETA","pivot","negate","qy","fromAxisAngle","qx","m0","x0","y0","currentRight","currentUp","PacemOrbitCameraBehaviorElement","Behaviors","PacemBehavior","_readyHandler","currentTarget","_decorateCore","_buildConfig","tr","zoomControl","panControl","rotationControl","behavior","isConnected","undecorate","Pacem3DDetector","_detected","info","cvs","contextNames","getParam","str","getParameter","addLine","section","detected","substring","userAgent","CreateGLContext","platform","VENDOR","RENDERER","SHADING_LANGUAGE_VERSION","RED_BITS","GREEN_BITS","BLUE_BITS","ALPHA_BITS","DEPTH_BITS","MAX_VERTEX_ATTRIBS","MAX_VERTEX_TEXTURE_IMAGE_UNITS","MAX_VARYING_VECTORS","MAX_VERTEX_UNIFORM_VECTORS","MAX_COMBINED_TEXTURE_IMAGE_UNITS","MAX_TEXTURE_SIZE","MAX_CUBE_MAP_TEXTURE_SIZE","COMPRESSED_TEXTURE_FORMATS","MAX_RENDERBUFFER_SIZE","MAX_VIEWPORT_DIMS","ALIASED_LINE_WIDTH_RANGE","ALIASED_POINT_SIZE_RANGE","getSupportedExtensions","OBJParser","vParser","vt","tParser","vn","nParser","fParser","fjParser","face","jArr","jIndex","vIndex0","tIndex0","nIndex0","vIndex","tIndex","nIndex","Transformer","Parser3D","parseGeometry","DeepMerger","Output"],"mappings":"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"}
|