@pacem/pacem-3d 1.0.0-abel
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/LICENSE +191 -0
- package/NOTICE +4 -0
- package/dist/browser/pacem-3d.js +7718 -0
- package/dist/browser/pacem-3d.js.map +1 -0
- package/dist/browser/pacem-3d.min.js +2 -0
- package/dist/browser/pacem-3d.min.js.map +1 -0
- package/dist/bundle/pacem-3d.min.mjs +345 -0
- package/dist/bundle/pacem-3d.mjs +7737 -0
- package/dist/bundle/pacem-3d.mjs.map +7 -0
- package/dist/esm/constants.js +2 -0
- package/dist/esm/converters.js +40 -0
- package/dist/esm/decorators.js +29 -0
- package/dist/esm/detector.js +73 -0
- package/dist/esm/geometry.js +102 -0
- package/dist/esm/index-components-drawing3d.js +22 -0
- package/dist/esm/index-components.js +1 -0
- package/dist/esm/index-drawing3d.js +6 -0
- package/dist/esm/index-iife.js +3 -0
- package/dist/esm/index-root.js +1 -0
- package/dist/esm/index.js +2 -0
- package/dist/esm/stage.js +280 -0
- package/dist/esm/types.js +482 -0
- package/package.json +39 -0
- package/typings/index.d.ts +1084 -0
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
import { Utils } from '@pacem/pacem-core';
|
|
2
|
+
import { parseAsNumericalArray } from '@pacem/pacem-foundation';
|
|
3
|
+
import { Geometry } from '@pacem/pacem-numerical';
|
|
4
|
+
//namespace Pacem.Drawing3D {
|
|
5
|
+
export const Point3DConverter = {
|
|
6
|
+
convert: (attr) => Geometry.LinearAlgebra.Vector3D.parse(attr),
|
|
7
|
+
convertBack: (prop) => `${prop.x || 0} ${prop.y || 0} ${prop.z || 0}`
|
|
8
|
+
};
|
|
9
|
+
export const Point3DOrNumberConverter = {
|
|
10
|
+
convert: (attr) => {
|
|
11
|
+
const arr = parseAsNumericalArray(attr);
|
|
12
|
+
const throwErr = () => { throw new Error(`Cannot parse "${attr}" as a valid Vector3D.`); };
|
|
13
|
+
if (Utils.isNullOrEmpty(arr)) {
|
|
14
|
+
throwErr();
|
|
15
|
+
}
|
|
16
|
+
if (arr.length === 3) {
|
|
17
|
+
return Geometry.LinearAlgebra.Vector3D.from(...arr);
|
|
18
|
+
}
|
|
19
|
+
if (arr.length === 1) {
|
|
20
|
+
const v = arr[0];
|
|
21
|
+
return Geometry.LinearAlgebra.Vector3D.from(v, v, v);
|
|
22
|
+
}
|
|
23
|
+
throwErr();
|
|
24
|
+
},
|
|
25
|
+
convertBack: (prop) => `${prop.x || 0} ${prop.y || 0} ${prop.z || 0}`
|
|
26
|
+
};
|
|
27
|
+
export const QuaternionConverter = {
|
|
28
|
+
convert: (attr) => Geometry.LinearAlgebra.Quaternion.parse(attr),
|
|
29
|
+
convertBack: (prop) => `${prop.x || 0} ${prop.y || 0} ${prop.z || 0} ${prop.w || 0}`
|
|
30
|
+
};
|
|
31
|
+
export const BooleanOrNumberConverter = {
|
|
32
|
+
convert: (attr) => {
|
|
33
|
+
if (attr === 'true')
|
|
34
|
+
return true;
|
|
35
|
+
if (attr === 'false')
|
|
36
|
+
return false;
|
|
37
|
+
return parseAsNumericalArray(attr)[0];
|
|
38
|
+
},
|
|
39
|
+
convertBack: (prop) => prop.toString()
|
|
40
|
+
};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { Utils } from '@pacem/pacem-core';
|
|
2
|
+
//namespace Pacem.Drawing3D {
|
|
3
|
+
export function NotifyChange(callback) {
|
|
4
|
+
return (target, prop, descriptor) => {
|
|
5
|
+
const backingField = `_${prop}_${Utils.uniqueCode()}_backingField`;
|
|
6
|
+
function getter() {
|
|
7
|
+
return this[backingField];
|
|
8
|
+
}
|
|
9
|
+
function setter(val) {
|
|
10
|
+
if (val !== this[backingField]) {
|
|
11
|
+
const old = this[backingField];
|
|
12
|
+
this[backingField] = val;
|
|
13
|
+
callback.call(this, prop, old, val);
|
|
14
|
+
}
|
|
15
|
+
}
|
|
16
|
+
//if (delete target[prop]) {
|
|
17
|
+
Object.defineProperty(target, prop, {
|
|
18
|
+
get: function () {
|
|
19
|
+
return getter.call(this);
|
|
20
|
+
},
|
|
21
|
+
set: function (val) {
|
|
22
|
+
setter.call(this, val);
|
|
23
|
+
},
|
|
24
|
+
enumerable: true,
|
|
25
|
+
configurable: false
|
|
26
|
+
});
|
|
27
|
+
//}
|
|
28
|
+
};
|
|
29
|
+
}
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
//namespace Pacem.Components.Drawing3D {
|
|
2
|
+
/** @deprecated*/
|
|
3
|
+
export class Pacem3DDetector {
|
|
4
|
+
constructor() {
|
|
5
|
+
this._detected = {
|
|
6
|
+
supported: false, info: {}
|
|
7
|
+
};
|
|
8
|
+
let cvs = document.createElement('canvas');
|
|
9
|
+
let contextNames = ['webgl', 'experimental-webgl', 'moz-webgl', 'webkit-3d'];
|
|
10
|
+
let ctx;
|
|
11
|
+
let getParam = function (str) {
|
|
12
|
+
if (!str)
|
|
13
|
+
return undefined;
|
|
14
|
+
return ctx.getParameter(str);
|
|
15
|
+
};
|
|
16
|
+
// addLine
|
|
17
|
+
let addLine = (section, name, value) => {
|
|
18
|
+
let detected = this._detected;
|
|
19
|
+
var info = detected.info[section] = detected.info[section] || {};
|
|
20
|
+
name = name.replace(/[^\w]+/g, '');
|
|
21
|
+
name = name.substring(0, 1).toLowerCase() + name.substring(1);
|
|
22
|
+
info[name] = value;
|
|
23
|
+
};
|
|
24
|
+
if (navigator.userAgent.indexOf('MSIE') >= 0) {
|
|
25
|
+
try {
|
|
26
|
+
ctx = window['WebGLHelper'].CreateGLContext(cvs, 'canvas');
|
|
27
|
+
}
|
|
28
|
+
catch (e) { }
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
for (var i = 0; i < contextNames.length; i++) {
|
|
32
|
+
try {
|
|
33
|
+
ctx = cvs.getContext(contextNames[i]);
|
|
34
|
+
if (ctx) {
|
|
35
|
+
addLine('main', 'Context Name', contextNames[i]);
|
|
36
|
+
break;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
catch (e) { }
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
this._detected.supported = !!ctx;
|
|
43
|
+
addLine('main', 'Platform', navigator.platform);
|
|
44
|
+
addLine('main', 'Agent', navigator.userAgent);
|
|
45
|
+
if (ctx) {
|
|
46
|
+
addLine('main', 'Vendor', getParam(ctx.VENDOR));
|
|
47
|
+
addLine('main', 'Version', getParam(ctx.VERSION));
|
|
48
|
+
addLine('main', 'Renderer', getParam(ctx.RENDERER));
|
|
49
|
+
addLine('main', 'Shading Language Version', getParam(ctx.SHADING_LANGUAGE_VERSION));
|
|
50
|
+
addLine('bits', 'Rgba Bits', getParam(ctx.RED_BITS) + ', ' + getParam(ctx.GREEN_BITS) + ', ' + getParam(ctx.BLUE_BITS) + ', ' + getParam(ctx.ALPHA_BITS));
|
|
51
|
+
addLine('bits', 'Depth Bits', getParam(ctx.DEPTH_BITS));
|
|
52
|
+
addLine('shader', 'Max Vertex Attribs', getParam(ctx.MAX_VERTEX_ATTRIBS));
|
|
53
|
+
addLine('shader', 'Max Vertex Texture Image Units', getParam(ctx.MAX_VERTEX_TEXTURE_IMAGE_UNITS));
|
|
54
|
+
addLine('shader', 'Max Varying Vectors', getParam(ctx.MAX_VARYING_VECTORS));
|
|
55
|
+
addLine('shader', 'Max Uniform Vectors', getParam(ctx.MAX_VERTEX_UNIFORM_VECTORS));
|
|
56
|
+
addLine('tex', 'Max Combined Texture Image Units', getParam(ctx.MAX_COMBINED_TEXTURE_IMAGE_UNITS));
|
|
57
|
+
addLine('tex', 'Max Texture Size', getParam(ctx.MAX_TEXTURE_SIZE));
|
|
58
|
+
addLine('tex', 'Max Cube Map Texture Size', getParam(ctx.MAX_CUBE_MAP_TEXTURE_SIZE));
|
|
59
|
+
addLine('tex', 'Num. Compressed Texture Formats', getParam(ctx.COMPRESSED_TEXTURE_FORMATS));
|
|
60
|
+
addLine('misc', 'Max Render Buffer Size', getParam(ctx.MAX_RENDERBUFFER_SIZE));
|
|
61
|
+
addLine('misc', 'Max Viewport Dimensions', getParam(ctx.MAX_VIEWPORT_DIMS));
|
|
62
|
+
addLine('misc', 'Aliased Line Width Range', getParam(ctx.ALIASED_LINE_WIDTH_RANGE));
|
|
63
|
+
addLine('misc', 'Aliased Point Size Range', getParam(ctx.ALIASED_POINT_SIZE_RANGE));
|
|
64
|
+
addLine('misc', 'Supported Extensions', ctx.getSupportedExtensions() || []);
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
get info() {
|
|
68
|
+
return this._detected.info;
|
|
69
|
+
}
|
|
70
|
+
get supported() {
|
|
71
|
+
return this._detected.supported;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
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;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { Utils } from '@pacem/pacem-core';
|
|
8
|
+
import { StalePropertyFlag } from './types';
|
|
9
|
+
import { NotifyChange } from './decorators';
|
|
10
|
+
export class NodeGeometry {
|
|
11
|
+
constructor(positions = []) {
|
|
12
|
+
this.positions = positions;
|
|
13
|
+
}
|
|
14
|
+
static barycenter(positions) {
|
|
15
|
+
var bary = { x: 0, y: 0, z: 0 };
|
|
16
|
+
if (!Utils.isNullOrEmpty(positions)) {
|
|
17
|
+
var count = positions.length;
|
|
18
|
+
for (var i = 0; i < positions.length; i++) {
|
|
19
|
+
var pt = positions[i];
|
|
20
|
+
bary.x += pt.x;
|
|
21
|
+
bary.y += pt.y;
|
|
22
|
+
bary.z += pt.z;
|
|
23
|
+
}
|
|
24
|
+
var countDbl = 1.0 * count;
|
|
25
|
+
bary.x /= countDbl;
|
|
26
|
+
bary.y /= countDbl;
|
|
27
|
+
bary.z /= countDbl;
|
|
28
|
+
}
|
|
29
|
+
return bary;
|
|
30
|
+
}
|
|
31
|
+
static boundingBox(positions) {
|
|
32
|
+
const output = {
|
|
33
|
+
minX: +Infinity, minY: +Infinity, minZ: +Infinity,
|
|
34
|
+
maxX: -Infinity, maxY: -Infinity, maxZ: -Infinity
|
|
35
|
+
};
|
|
36
|
+
if (!Utils.isNullOrEmpty(positions)) {
|
|
37
|
+
for (var i = 0; i < positions.length; i++) {
|
|
38
|
+
var pt = positions[i];
|
|
39
|
+
output.minX = Math.min(output.minX, pt.x);
|
|
40
|
+
output.minY = Math.min(output.minY, pt.y);
|
|
41
|
+
output.minZ = Math.min(output.minZ, pt.z);
|
|
42
|
+
output.maxX = Math.max(output.maxX, pt.x);
|
|
43
|
+
output.maxY = Math.max(output.maxY, pt.y);
|
|
44
|
+
output.maxZ = Math.max(output.maxZ, pt.z);
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
return output;
|
|
48
|
+
}
|
|
49
|
+
setAsDirty() {
|
|
50
|
+
setSelfAsDirty.call(this);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
function setSelfAsDirty() {
|
|
54
|
+
const me = this;
|
|
55
|
+
me.flags = [/* no further specifications, other than 'geometry' */ StalePropertyFlag.Geometry];
|
|
56
|
+
}
|
|
57
|
+
export class LineGeometry extends NodeGeometry {
|
|
58
|
+
}
|
|
59
|
+
__decorate([
|
|
60
|
+
NotifyChange(setSelfAsDirty)
|
|
61
|
+
], LineGeometry.prototype, "positions", void 0);
|
|
62
|
+
export class MeshGeometry extends NodeGeometry {
|
|
63
|
+
#boundingBox;
|
|
64
|
+
#boundingSphere;
|
|
65
|
+
#barycenter;
|
|
66
|
+
get barycenter() {
|
|
67
|
+
return this.#barycenter ??= NodeGeometry.barycenter(this.positions);
|
|
68
|
+
}
|
|
69
|
+
set barycenter(point) {
|
|
70
|
+
this.#barycenter = point;
|
|
71
|
+
}
|
|
72
|
+
get boundingBox() {
|
|
73
|
+
return this.#boundingBox ??= NodeGeometry.boundingBox(this.positions);
|
|
74
|
+
}
|
|
75
|
+
set boundingBox(bbox) {
|
|
76
|
+
this.#boundingBox = bbox;
|
|
77
|
+
}
|
|
78
|
+
get boundingSphere() {
|
|
79
|
+
return this.#boundingSphere;
|
|
80
|
+
}
|
|
81
|
+
set boundingSphere(sphere) {
|
|
82
|
+
this.#boundingSphere = sphere;
|
|
83
|
+
}
|
|
84
|
+
constructor(positions, triangleIndices, textureCoordinates = [], normals = []) {
|
|
85
|
+
super(positions);
|
|
86
|
+
this.triangleIndices = triangleIndices;
|
|
87
|
+
this.textureCoordinates = textureCoordinates;
|
|
88
|
+
this.normals = normals;
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
__decorate([
|
|
92
|
+
NotifyChange(setSelfAsDirty)
|
|
93
|
+
], MeshGeometry.prototype, "positions", void 0);
|
|
94
|
+
__decorate([
|
|
95
|
+
NotifyChange(setSelfAsDirty)
|
|
96
|
+
], MeshGeometry.prototype, "triangleIndices", void 0);
|
|
97
|
+
__decorate([
|
|
98
|
+
NotifyChange(setSelfAsDirty)
|
|
99
|
+
], MeshGeometry.prototype, "textureCoordinates", void 0);
|
|
100
|
+
__decorate([
|
|
101
|
+
NotifyChange(setSelfAsDirty)
|
|
102
|
+
], MeshGeometry.prototype, "normals", void 0);
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
export * from './types';
|
|
2
|
+
export * from './detector';
|
|
3
|
+
export * from './materials/material';
|
|
4
|
+
export * from './materials/basic';
|
|
5
|
+
export * from './materials/lambert';
|
|
6
|
+
export * from './materials/line';
|
|
7
|
+
export * from './materials/phong';
|
|
8
|
+
export * from './materials/standard';
|
|
9
|
+
export * from './primitives/primitive';
|
|
10
|
+
export * from './primitives/box';
|
|
11
|
+
export * from './primitives/cone';
|
|
12
|
+
export * from './primitives/cylinder';
|
|
13
|
+
export * from './primitives/line';
|
|
14
|
+
export * from './primitives/plane';
|
|
15
|
+
export * from './primitives/polyhedra';
|
|
16
|
+
export * from './primitives/sphere';
|
|
17
|
+
export * from './primitives/torus';
|
|
18
|
+
export * from './adapters/shared';
|
|
19
|
+
export * from './adapters/threejsadapter';
|
|
20
|
+
export * from './adapters/webgpu/webgpuadapter';
|
|
21
|
+
export * from './adapters/webgpu/behaviors/orbit-camera';
|
|
22
|
+
export * from './stage';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * as Drawing3D from './index-components-drawing3d';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * as Drawing3D from './index-drawing3d';
|
|
@@ -0,0 +1,280 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
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;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { CustomElement, P, PCSS, Defaults, ViewChild, Watch, PropertyConverters, Utils, Components, PropertyChangeEventName, Logging, Animations, UI } from '@pacem/pacem-core';
|
|
8
|
+
import { RenderableEvent, DragEvent, RenderableElement } from './types';
|
|
9
|
+
import { TAG_MIDDLE_NAME } from './constants';
|
|
10
|
+
//namespace Pacem.Components.Drawing3D {
|
|
11
|
+
let Pacem3DElement = class Pacem3DElement extends Components.PacemItemsContainerElement {
|
|
12
|
+
constructor() {
|
|
13
|
+
super(...arguments);
|
|
14
|
+
this._itemPropertyChangeHandler = (evt) => {
|
|
15
|
+
const renderable = evt.target;
|
|
16
|
+
// clear flags
|
|
17
|
+
// TODO: be more precise
|
|
18
|
+
this.adapter &&
|
|
19
|
+
this.adapter.updateItem(this, renderable);
|
|
20
|
+
renderable.flags.splice(0);
|
|
21
|
+
};
|
|
22
|
+
this._clickHandler = (evt) => {
|
|
23
|
+
let me = this;
|
|
24
|
+
if (!me.interactive || Utils.isNull(me._lastHitResult)) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const type = evt.type.replace(/^mouse/, '');
|
|
28
|
+
const hit = me._lastHitResult, object = hit.object, point = hit.point;
|
|
29
|
+
this._itemDispatch(object, point, type, evt);
|
|
30
|
+
};
|
|
31
|
+
this._hitTestCallback = (result, evt) => {
|
|
32
|
+
const me = this;
|
|
33
|
+
// TODO: handle dragging
|
|
34
|
+
if (result != me._lastHitResult) {
|
|
35
|
+
if (result?.object != me._lastHitResult?.object) {
|
|
36
|
+
const obj = result?.object, last = me._lastHitResult?.object, pt = result?.point;
|
|
37
|
+
if (!Utils.isNull(last)) {
|
|
38
|
+
this._itemDispatch(last, pt, 'out', evt);
|
|
39
|
+
}
|
|
40
|
+
if (!Utils.isNull(obj)) {
|
|
41
|
+
this._itemDispatch(obj, pt, 'over', evt);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
me._lastHitResult = result;
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
this._moveHandler = (evt) => {
|
|
48
|
+
let me = this;
|
|
49
|
+
if (!me.adapter || !me.interactive) {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const rect = me._resizer.currentSize;
|
|
53
|
+
const callback = (r) => me._hitTestCallback(r, evt);
|
|
54
|
+
const pixel = evt.type === 'mousemove' ? { x: evt.pageX - rect.left, y: evt.pageY - rect.top } : { x: -1, y: -1 };
|
|
55
|
+
me.adapter.raycast(this, pixel, rect, callback);
|
|
56
|
+
};
|
|
57
|
+
this._resizeHandler = (evt) => {
|
|
58
|
+
const oldSize = this.#size;
|
|
59
|
+
const size = evt.detail;
|
|
60
|
+
if (!Utils.isNull(oldSize) && oldSize.height === size.height && oldSize.width === size.width) {
|
|
61
|
+
return;
|
|
62
|
+
}
|
|
63
|
+
this.#size = size;
|
|
64
|
+
const adapter = this.adapter;
|
|
65
|
+
if (!Utils.isNull(adapter)) {
|
|
66
|
+
this.adapter.invalidateSize(this, size);
|
|
67
|
+
this.dispatchEvent(new Components.ResizeEvent(size));
|
|
68
|
+
}
|
|
69
|
+
};
|
|
70
|
+
//#endregion
|
|
71
|
+
}
|
|
72
|
+
validate(item) {
|
|
73
|
+
return item instanceof RenderableElement;
|
|
74
|
+
}
|
|
75
|
+
get stage() {
|
|
76
|
+
return this._container;
|
|
77
|
+
}
|
|
78
|
+
get scene() {
|
|
79
|
+
return this.adapter && this.adapter.getScene(this);
|
|
80
|
+
}
|
|
81
|
+
register(item) {
|
|
82
|
+
const retval = super.register(item);
|
|
83
|
+
if (retval) {
|
|
84
|
+
this._add(item);
|
|
85
|
+
item.addEventListener(PropertyChangeEventName, this._itemPropertyChangeHandler, false);
|
|
86
|
+
}
|
|
87
|
+
return retval;
|
|
88
|
+
}
|
|
89
|
+
unregister(item) {
|
|
90
|
+
const retval = super.unregister(item);
|
|
91
|
+
if (retval) {
|
|
92
|
+
item.removeEventListener(PropertyChangeEventName, this._itemPropertyChangeHandler, false);
|
|
93
|
+
this._erase(item);
|
|
94
|
+
}
|
|
95
|
+
return retval;
|
|
96
|
+
}
|
|
97
|
+
_refreshDatasource(val = this.datasource) {
|
|
98
|
+
this.adapter?.updateItem(this, undefined);
|
|
99
|
+
}
|
|
100
|
+
_buildUpDatasourceFromDOM(val = this.items) {
|
|
101
|
+
if (!Utils.isNullOrEmpty(val)) {
|
|
102
|
+
this.datasource = val.slice();
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
_add(item) {
|
|
106
|
+
this.adapter &&
|
|
107
|
+
this.adapter.addItem(this, item);
|
|
108
|
+
}
|
|
109
|
+
_erase(item) {
|
|
110
|
+
this.adapter &&
|
|
111
|
+
this.adapter.removeItem(this, item);
|
|
112
|
+
}
|
|
113
|
+
_initializeAdapter(old, val) {
|
|
114
|
+
return new Promise((resolve, reject) => {
|
|
115
|
+
const items = this.datasource || [];
|
|
116
|
+
if (!Utils.isNull(old)) {
|
|
117
|
+
items.forEach(i => old.removeItem(this, i));
|
|
118
|
+
}
|
|
119
|
+
if (!Utils.isNull(this._container) && !Utils.isNull(val)) {
|
|
120
|
+
val.initialize(this).then(_ => {
|
|
121
|
+
(items || []).forEach(i => this._add(i));
|
|
122
|
+
resolve();
|
|
123
|
+
}, e => {
|
|
124
|
+
this.log(Logging.LogLevel.Error, e?.toString());
|
|
125
|
+
reject(e);
|
|
126
|
+
});
|
|
127
|
+
}
|
|
128
|
+
else {
|
|
129
|
+
resolve();
|
|
130
|
+
}
|
|
131
|
+
});
|
|
132
|
+
}
|
|
133
|
+
//#region lifecycle
|
|
134
|
+
propertyChangedCallback(name, old, val, first) {
|
|
135
|
+
super.propertyChangedCallback(name, old, val, first);
|
|
136
|
+
if (first) {
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
switch (name) {
|
|
140
|
+
case 'adapter':
|
|
141
|
+
this._initializeAdapter(old, val);
|
|
142
|
+
break;
|
|
143
|
+
case 'items':
|
|
144
|
+
this._buildUpDatasourceFromDOM(val);
|
|
145
|
+
break;
|
|
146
|
+
case 'transparent':
|
|
147
|
+
this.adapter?.invalidateSize(this, this.size);
|
|
148
|
+
break;
|
|
149
|
+
case 'datasource':
|
|
150
|
+
this._refreshDatasource(val);
|
|
151
|
+
case 'disabled':
|
|
152
|
+
case 'background':
|
|
153
|
+
this.render();
|
|
154
|
+
break;
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
viewActivatedCallback() {
|
|
158
|
+
super.viewActivatedCallback();
|
|
159
|
+
// stage
|
|
160
|
+
const container = this._container;
|
|
161
|
+
// resizer
|
|
162
|
+
const resizer = this._resizer;
|
|
163
|
+
resizer.addEventListener('resize', this._resizeHandler, false);
|
|
164
|
+
resizer.target = container;
|
|
165
|
+
// adapter
|
|
166
|
+
this._initializeAdapter(null, this.adapter).then(_ => {
|
|
167
|
+
container.addEventListener('mousemove', this._moveHandler, false);
|
|
168
|
+
container.addEventListener('click', this._clickHandler, false);
|
|
169
|
+
container.addEventListener('mouseup', this._clickHandler, false);
|
|
170
|
+
container.addEventListener('mousedown', this._clickHandler, false);
|
|
171
|
+
container.addEventListener('mouseout', this._moveHandler, false);
|
|
172
|
+
this._buildUpDatasourceFromDOM();
|
|
173
|
+
this.render();
|
|
174
|
+
});
|
|
175
|
+
}
|
|
176
|
+
_itemDispatch(target, point, type, offset) {
|
|
177
|
+
if (!Utils.isNull(target)) {
|
|
178
|
+
var dragArgs, originalEvent, evtType;
|
|
179
|
+
if (offset instanceof Event) {
|
|
180
|
+
originalEvent = offset;
|
|
181
|
+
}
|
|
182
|
+
else {
|
|
183
|
+
dragArgs = { item: target, offset: offset };
|
|
184
|
+
}
|
|
185
|
+
if (typeof type === 'string') {
|
|
186
|
+
evtType = type;
|
|
187
|
+
}
|
|
188
|
+
else {
|
|
189
|
+
evtType = type.type;
|
|
190
|
+
originalEvent = type.originalEvent;
|
|
191
|
+
}
|
|
192
|
+
const m = point;
|
|
193
|
+
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);
|
|
194
|
+
var prevent = false;
|
|
195
|
+
if (target instanceof EventTarget) {
|
|
196
|
+
const evnt = evt();
|
|
197
|
+
target.dispatchEvent(evnt);
|
|
198
|
+
prevent = evnt.defaultPrevented;
|
|
199
|
+
}
|
|
200
|
+
target.stage.dispatchEvent(itemevt);
|
|
201
|
+
// was the event (in one of its forms) rejected?
|
|
202
|
+
return prevent || itemevt.defaultPrevented;
|
|
203
|
+
}
|
|
204
|
+
return false;
|
|
205
|
+
}
|
|
206
|
+
disconnectedCallback() {
|
|
207
|
+
this.#handle?.stop();
|
|
208
|
+
const resizer = this._resizer, container = this._container;
|
|
209
|
+
if (!Utils.isNull(container)) {
|
|
210
|
+
container.removeEventListener('click', this._clickHandler, false);
|
|
211
|
+
container.removeEventListener('mouseup', this._clickHandler, false);
|
|
212
|
+
container.removeEventListener('mousedown', this._clickHandler, false);
|
|
213
|
+
container.removeEventListener('mousemove', this._moveHandler, false);
|
|
214
|
+
container.removeEventListener('mouseout', this._moveHandler, false);
|
|
215
|
+
}
|
|
216
|
+
if (!Utils.isNull(resizer)) {
|
|
217
|
+
resizer.removeEventListener('resize', this._resizeHandler, false);
|
|
218
|
+
}
|
|
219
|
+
super.disconnectedCallback();
|
|
220
|
+
}
|
|
221
|
+
#size;
|
|
222
|
+
get size() {
|
|
223
|
+
return this.#size;
|
|
224
|
+
}
|
|
225
|
+
render(item, deepUpdate, now = performance.now()) {
|
|
226
|
+
if (!Utils.isNull(item)) {
|
|
227
|
+
const adapter = this.adapter;
|
|
228
|
+
if (!Utils.isNull(adapter)) {
|
|
229
|
+
adapter.updateItem(this, item);
|
|
230
|
+
}
|
|
231
|
+
}
|
|
232
|
+
else {
|
|
233
|
+
this.#handle?.stop();
|
|
234
|
+
this.#handle = Animations.Timer.run(_ => this._doRender());
|
|
235
|
+
//this._doRender();
|
|
236
|
+
}
|
|
237
|
+
}
|
|
238
|
+
#handle;
|
|
239
|
+
_doRender() {
|
|
240
|
+
if (!this.disabled && !Utils.isNull(this.adapter)) {
|
|
241
|
+
const scene = this.adapter.getScene(this);
|
|
242
|
+
let cancelable = new CustomEvent('prerender', { detail: { scene }, cancelable: true });
|
|
243
|
+
this.dispatchEvent(cancelable);
|
|
244
|
+
if (!cancelable.defaultPrevented) {
|
|
245
|
+
this.adapter.render(this);
|
|
246
|
+
this.dispatchEvent(new CustomEvent('render', { detail: { scene } }));
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
}
|
|
250
|
+
};
|
|
251
|
+
__decorate([
|
|
252
|
+
ViewChild(`.${PCSS}-3d`)
|
|
253
|
+
], Pacem3DElement.prototype, "_container", void 0);
|
|
254
|
+
__decorate([
|
|
255
|
+
ViewChild(P + '-resize')
|
|
256
|
+
], Pacem3DElement.prototype, "_resizer", void 0);
|
|
257
|
+
__decorate([
|
|
258
|
+
Watch({ emit: false, converter: PropertyConverters.Boolean })
|
|
259
|
+
], Pacem3DElement.prototype, "interactive", void 0);
|
|
260
|
+
__decorate([
|
|
261
|
+
Watch({ emit: false, converter: PropertyConverters.Boolean })
|
|
262
|
+
], Pacem3DElement.prototype, "transparent", void 0);
|
|
263
|
+
__decorate([
|
|
264
|
+
Watch({ emit: false, converter: PropertyConverters.String })
|
|
265
|
+
], Pacem3DElement.prototype, "background", void 0);
|
|
266
|
+
__decorate([
|
|
267
|
+
Watch({ emit: false, converter: PropertyConverters.Element })
|
|
268
|
+
], Pacem3DElement.prototype, "adapter", void 0);
|
|
269
|
+
__decorate([
|
|
270
|
+
Watch({ emit: false, converter: PropertyConverters.Json })
|
|
271
|
+
], Pacem3DElement.prototype, "datasource", void 0);
|
|
272
|
+
__decorate([
|
|
273
|
+
Watch({ emit: false, converter: PropertyConverters.Boolean })
|
|
274
|
+
], Pacem3DElement.prototype, "orbit", void 0);
|
|
275
|
+
Pacem3DElement = __decorate([
|
|
276
|
+
CustomElement({
|
|
277
|
+
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>`
|
|
278
|
+
})
|
|
279
|
+
], Pacem3DElement);
|
|
280
|
+
export { Pacem3DElement };
|