@combeenation/3d-viewer 4.0.0-alpha8 → 4.0.0-beta3

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.
Files changed (57) hide show
  1. package/README.md +1 -0
  2. package/dist/lib-cjs/api/classes/element.d.ts +9 -14
  3. package/dist/lib-cjs/api/classes/element.js +96 -143
  4. package/dist/lib-cjs/api/classes/element.js.map +1 -1
  5. package/dist/lib-cjs/api/classes/event.d.ts +1 -15
  6. package/dist/lib-cjs/api/classes/event.js +1 -15
  7. package/dist/lib-cjs/api/classes/event.js.map +1 -1
  8. package/dist/lib-cjs/api/classes/parameter.d.ts +7 -101
  9. package/dist/lib-cjs/api/classes/parameter.js +21 -141
  10. package/dist/lib-cjs/api/classes/parameter.js.map +1 -1
  11. package/dist/lib-cjs/api/classes/parameterObservable.js +36 -11
  12. package/dist/lib-cjs/api/classes/parameterObservable.js.map +1 -1
  13. package/dist/lib-cjs/api/classes/variant.d.ts +14 -48
  14. package/dist/lib-cjs/api/classes/variant.js +56 -315
  15. package/dist/lib-cjs/api/classes/variant.js.map +1 -1
  16. package/dist/lib-cjs/api/classes/variantInstance.d.ts +1 -5
  17. package/dist/lib-cjs/api/classes/variantInstance.js +0 -10
  18. package/dist/lib-cjs/api/classes/variantInstance.js.map +1 -1
  19. package/dist/lib-cjs/api/classes/viewer.d.ts +1 -0
  20. package/dist/lib-cjs/api/classes/viewer.js.map +1 -1
  21. package/dist/lib-cjs/api/classes/viewerLight.js +24 -16
  22. package/dist/lib-cjs/api/classes/viewerLight.js.map +1 -1
  23. package/dist/lib-cjs/api/internal/sceneSetup.d.ts +1 -5
  24. package/dist/lib-cjs/api/internal/sceneSetup.js +71 -75
  25. package/dist/lib-cjs/api/internal/sceneSetup.js.map +1 -1
  26. package/dist/lib-cjs/api/util/babylonHelper.d.ts +4 -51
  27. package/dist/lib-cjs/api/util/babylonHelper.js +8 -141
  28. package/dist/lib-cjs/api/util/babylonHelper.js.map +1 -1
  29. package/dist/lib-cjs/api/util/globalTypes.d.ts +11 -53
  30. package/dist/lib-cjs/api/util/resourceHelper.d.ts +26 -4
  31. package/dist/lib-cjs/api/util/resourceHelper.js +56 -53
  32. package/dist/lib-cjs/api/util/resourceHelper.js.map +1 -1
  33. package/dist/lib-cjs/index.d.ts +22 -24
  34. package/dist/lib-cjs/index.js +38 -42
  35. package/dist/lib-cjs/index.js.map +1 -1
  36. package/package.json +1 -1
  37. package/src/api/classes/element.ts +100 -110
  38. package/src/api/classes/{parameterizable.ts → elementParameterizable.ts} +1 -12
  39. package/src/api/classes/event.ts +1 -16
  40. package/src/api/classes/parameter.ts +22 -153
  41. package/src/api/classes/parameterObservable.ts +31 -9
  42. package/src/api/classes/variant.ts +51 -184
  43. package/src/api/classes/variantInstance.ts +1 -8
  44. package/src/api/classes/viewer.ts +1 -0
  45. package/src/api/internal/sceneSetup.ts +109 -99
  46. package/src/api/util/babylonHelper.ts +9 -153
  47. package/src/api/util/globalTypes.ts +13 -64
  48. package/src/api/util/resourceHelper.ts +53 -26
  49. package/src/dev.ts +7 -5
  50. package/src/index.ts +23 -27
  51. package/src/pagesconfig.json +13 -8
  52. package/dist/lib-cjs/api/emitter.d.ts +0 -35
  53. package/dist/lib-cjs/api/emitter.js +0 -61
  54. package/dist/lib-cjs/api/emitter.js.map +0 -1
  55. package/src/api/classes/variantParameterizable.ts +0 -73
  56. package/src/api/classes/viewerLight.ts +0 -326
  57. package/src/api/util/stringHelper.ts +0 -26
@@ -1,48 +1,46 @@
1
1
  /// <reference path="api/util/globalTypes.d.ts" />
2
- import { Animation as BabylonAnimation } from '@babylonjs/core/Animations/animation';
3
2
  import { ArcRotateCamera } from '@babylonjs/core/Cameras/arcRotateCamera';
4
3
  import { Engine } from '@babylonjs/core/Engines/engine';
5
- import { DirectionalLight } from '@babylonjs/core/Lights/directionalLight';
6
- import { HemisphericLight } from '@babylonjs/core/Lights/hemisphericLight';
7
4
  import { Material } from '@babylonjs/core/Materials/material';
8
5
  import { PBRMaterial } from '@babylonjs/core/Materials/PBR/pbrMaterial';
9
6
  import { StandardMaterial } from '@babylonjs/core/Materials/standardMaterial';
10
- import { CubeTexture } from '@babylonjs/core/Materials/Textures/cubeTexture';
11
7
  import { DynamicTexture } from '@babylonjs/core/Materials/Textures/dynamicTexture';
12
- import { Texture } from '@babylonjs/core/Materials/Textures/texture';
13
8
  import { Color3, Color4 } from '@babylonjs/core/Maths/math.color';
14
9
  import { Vector3 } from '@babylonjs/core/Maths/math.vector';
15
10
  import { AbstractMesh } from '@babylonjs/core/Meshes/abstractMesh';
16
11
  import { InstancedMesh } from '@babylonjs/core/Meshes/instancedMesh';
17
12
  import { Mesh } from '@babylonjs/core/Meshes/mesh';
18
- import { MeshBuilder } from '@babylonjs/core/Meshes/meshBuilder';
19
13
  import { TransformNode } from '@babylonjs/core/Meshes/transformNode';
20
14
  import { Node } from '@babylonjs/core/node';
21
- /**
22
- * Without explicitly importing the "BoundingBoxRenderer", we're getting "scene.getBoundingBoxRenderer is undefined"
23
- * errors when creating HighlightLayer instances. Not sure why but those errors only happen when using the built
24
- * version of the viewer (e.g. when pulling it from NPM etc.)...
25
- */
26
- import '@babylonjs/core/Rendering/boundingBoxRenderer';
27
15
  import { Scene } from '@babylonjs/core/scene';
28
- import { Parameterizable } from './api/classes/parameterizable';
29
- import { VariantParameterizable } from './api/classes/variantParameterizable';
16
+ import { VariantInstance } from './api/classes/variantInstance';
17
+ import { Viewer } from './api/classes/viewer';
18
+ import { Event, emitter } from './api/classes/event';
30
19
  import { EventEmitter } from 'eventemitter3';
31
- import { Element } from './api/classes/element';
32
- import { emitter, Event } from './api/classes/event';
33
- import { EventBroadcaster } from './api/classes/eventBroadcaster';
34
20
  import { Parameter } from './api/classes/parameter';
35
- import { ParameterObservable } from './api/classes/parameterObservable';
36
- import { PlacementAnimation } from './api/classes/placementAnimation';
21
+ import { CubeTexture } from '@babylonjs/core/Materials/Textures/cubeTexture';
22
+ import { Animation as BabylonAnimation } from '@babylonjs/core/Animations/animation';
23
+ import { MeshBuilder } from '@babylonjs/core/Meshes/meshBuilder';
24
+ import { Texture } from '@babylonjs/core/Materials/Textures/texture';
25
+ import { DirectionalLight } from '@babylonjs/core/Lights/directionalLight';
26
+ import { HemisphericLight } from '@babylonjs/core/Lights/hemisphericLight';
37
27
  import { Variant } from './api/classes/variant';
38
- import { VariantInstance } from './api/classes/variantInstance';
39
- import { Viewer } from './api/classes/viewer';
40
- import { ViewerLight } from './api/classes/viewerLight';
28
+ import { ParameterObservable } from './api/classes/parameterObservable';
29
+ import { ElementParameterizable } from './api/classes/elementParameterizable';
30
+ import { Element } from './api/classes/element';
31
+ import { VariantInstanceManager } from './api/manager/variantInstanceManager';
41
32
  import { AnimationManager } from './api/manager/animationManager';
33
+ import { EventBroadcaster } from './api/classes/eventBroadcaster';
42
34
  import { SceneManager } from './api/manager/sceneManager';
43
- import { VariantInstanceManager } from './api/manager/variantInstanceManager';
35
+ import { PlacementAnimation } from './api/classes/placementAnimation';
44
36
  import * as BabylonHelper from './api/util/babylonHelper';
37
+ /**
38
+ * Without explicitly importing the "BoundingBoxRenderer", we're getting "scene.getBoundingBoxRenderer is undefined"
39
+ * errors when creating HighlightLayer instances. Not sure why but those errors only happen when using the built
40
+ * version of the viewer (e.g. when pulling it from NPM etc.)...
41
+ */
42
+ import '@babylonjs/core/Rendering/boundingBoxRenderer';
45
43
  /**
46
44
  * Expose some frequently used babylon modules by our consumers.
47
45
  */
48
- export { AnimationManager, Variant, VariantInstanceManager, Viewer, ParameterObservable, Parameterizable, VariantParameterizable, ViewerLight, emitter as Emitter, EventEmitter, Event, Parameter, VariantInstance, Color3, Color4, Vector3, AbstractMesh, InstancedMesh, Mesh, TransformNode, Node, Material, PBRMaterial, StandardMaterial, Scene, Engine, ArcRotateCamera, DynamicTexture, CubeTexture, MeshBuilder, Texture, BabylonAnimation, HemisphericLight, DirectionalLight, Element, EventBroadcaster, SceneManager, PlacementAnimation, BabylonHelper, };
46
+ export { AnimationManager, Variant, VariantInstanceManager, Viewer, ParameterObservable, ElementParameterizable, emitter as Emitter, EventEmitter, Event, Parameter, VariantInstance, Color3, Color4, Vector3, AbstractMesh, InstancedMesh, Mesh, TransformNode, Node, Material, PBRMaterial, StandardMaterial, Scene, Engine, ArcRotateCamera, DynamicTexture, CubeTexture, MeshBuilder, Texture, BabylonAnimation, HemisphericLight, DirectionalLight, Element, EventBroadcaster, SceneManager, PlacementAnimation, BabylonHelper, };
@@ -1,29 +1,19 @@
1
1
  "use strict";
2
2
  /// <reference path="api/util/globalTypes.ts" />
3
3
  Object.defineProperty(exports, "__esModule", { value: true });
4
- exports.BabylonHelper = exports.PlacementAnimation = exports.SceneManager = exports.EventBroadcaster = exports.Element = exports.DirectionalLight = exports.HemisphericLight = exports.BabylonAnimation = exports.Texture = exports.MeshBuilder = exports.CubeTexture = exports.DynamicTexture = exports.ArcRotateCamera = exports.Engine = exports.Scene = exports.StandardMaterial = exports.PBRMaterial = exports.Material = exports.Node = exports.TransformNode = exports.Mesh = exports.InstancedMesh = exports.AbstractMesh = exports.Vector3 = exports.Color4 = exports.Color3 = exports.VariantInstance = exports.Parameter = exports.Event = exports.EventEmitter = exports.Emitter = exports.ViewerLight = exports.VariantParameterizable = exports.Parameterizable = exports.ParameterObservable = exports.Viewer = exports.VariantInstanceManager = exports.Variant = exports.AnimationManager = void 0;
5
- var animation_1 = require("@babylonjs/core/Animations/animation");
6
- Object.defineProperty(exports, "BabylonAnimation", { enumerable: true, get: function () { return animation_1.Animation; } });
4
+ exports.BabylonHelper = exports.PlacementAnimation = exports.SceneManager = exports.EventBroadcaster = exports.Element = exports.DirectionalLight = exports.HemisphericLight = exports.BabylonAnimation = exports.Texture = exports.MeshBuilder = exports.CubeTexture = exports.DynamicTexture = exports.ArcRotateCamera = exports.Engine = exports.Scene = exports.StandardMaterial = exports.PBRMaterial = exports.Material = exports.Node = exports.TransformNode = exports.Mesh = exports.InstancedMesh = exports.AbstractMesh = exports.Vector3 = exports.Color4 = exports.Color3 = exports.VariantInstance = exports.Parameter = exports.Event = exports.EventEmitter = exports.Emitter = exports.ElementParameterizable = exports.ParameterObservable = exports.Viewer = exports.VariantInstanceManager = exports.Variant = exports.AnimationManager = void 0;
7
5
  var arcRotateCamera_1 = require("@babylonjs/core/Cameras/arcRotateCamera");
8
6
  Object.defineProperty(exports, "ArcRotateCamera", { enumerable: true, get: function () { return arcRotateCamera_1.ArcRotateCamera; } });
9
7
  var engine_1 = require("@babylonjs/core/Engines/engine");
10
8
  Object.defineProperty(exports, "Engine", { enumerable: true, get: function () { return engine_1.Engine; } });
11
- var directionalLight_1 = require("@babylonjs/core/Lights/directionalLight");
12
- Object.defineProperty(exports, "DirectionalLight", { enumerable: true, get: function () { return directionalLight_1.DirectionalLight; } });
13
- var hemisphericLight_1 = require("@babylonjs/core/Lights/hemisphericLight");
14
- Object.defineProperty(exports, "HemisphericLight", { enumerable: true, get: function () { return hemisphericLight_1.HemisphericLight; } });
15
9
  var material_1 = require("@babylonjs/core/Materials/material");
16
10
  Object.defineProperty(exports, "Material", { enumerable: true, get: function () { return material_1.Material; } });
17
11
  var pbrMaterial_1 = require("@babylonjs/core/Materials/PBR/pbrMaterial");
18
12
  Object.defineProperty(exports, "PBRMaterial", { enumerable: true, get: function () { return pbrMaterial_1.PBRMaterial; } });
19
13
  var standardMaterial_1 = require("@babylonjs/core/Materials/standardMaterial");
20
14
  Object.defineProperty(exports, "StandardMaterial", { enumerable: true, get: function () { return standardMaterial_1.StandardMaterial; } });
21
- var cubeTexture_1 = require("@babylonjs/core/Materials/Textures/cubeTexture");
22
- Object.defineProperty(exports, "CubeTexture", { enumerable: true, get: function () { return cubeTexture_1.CubeTexture; } });
23
15
  var dynamicTexture_1 = require("@babylonjs/core/Materials/Textures/dynamicTexture");
24
16
  Object.defineProperty(exports, "DynamicTexture", { enumerable: true, get: function () { return dynamicTexture_1.DynamicTexture; } });
25
- var texture_1 = require("@babylonjs/core/Materials/Textures/texture");
26
- Object.defineProperty(exports, "Texture", { enumerable: true, get: function () { return texture_1.Texture; } });
27
17
  var math_color_1 = require("@babylonjs/core/Maths/math.color");
28
18
  Object.defineProperty(exports, "Color3", { enumerable: true, get: function () { return math_color_1.Color3; } });
29
19
  Object.defineProperty(exports, "Color4", { enumerable: true, get: function () { return math_color_1.Color4; } });
@@ -35,53 +25,59 @@ var instancedMesh_1 = require("@babylonjs/core/Meshes/instancedMesh");
35
25
  Object.defineProperty(exports, "InstancedMesh", { enumerable: true, get: function () { return instancedMesh_1.InstancedMesh; } });
36
26
  var mesh_1 = require("@babylonjs/core/Meshes/mesh");
37
27
  Object.defineProperty(exports, "Mesh", { enumerable: true, get: function () { return mesh_1.Mesh; } });
38
- var meshBuilder_1 = require("@babylonjs/core/Meshes/meshBuilder");
39
- Object.defineProperty(exports, "MeshBuilder", { enumerable: true, get: function () { return meshBuilder_1.MeshBuilder; } });
40
28
  var transformNode_1 = require("@babylonjs/core/Meshes/transformNode");
41
29
  Object.defineProperty(exports, "TransformNode", { enumerable: true, get: function () { return transformNode_1.TransformNode; } });
42
30
  var node_1 = require("@babylonjs/core/node");
43
31
  Object.defineProperty(exports, "Node", { enumerable: true, get: function () { return node_1.Node; } });
44
- /**
45
- * Without explicitly importing the "BoundingBoxRenderer", we're getting "scene.getBoundingBoxRenderer is undefined"
46
- * errors when creating HighlightLayer instances. Not sure why but those errors only happen when using the built
47
- * version of the viewer (e.g. when pulling it from NPM etc.)...
48
- */
49
- require("@babylonjs/core/Rendering/boundingBoxRenderer");
50
32
  var scene_1 = require("@babylonjs/core/scene");
51
33
  Object.defineProperty(exports, "Scene", { enumerable: true, get: function () { return scene_1.Scene; } });
52
- var parameterizable_1 = require("./api/classes/parameterizable");
53
- Object.defineProperty(exports, "Parameterizable", { enumerable: true, get: function () { return parameterizable_1.Parameterizable; } });
54
- var variantParameterizable_1 = require("./api/classes/variantParameterizable");
55
- Object.defineProperty(exports, "VariantParameterizable", { enumerable: true, get: function () { return variantParameterizable_1.VariantParameterizable; } });
56
- var eventemitter3_1 = require("eventemitter3");
57
- Object.defineProperty(exports, "EventEmitter", { enumerable: true, get: function () { return eventemitter3_1.EventEmitter; } });
58
- var element_1 = require("./api/classes/element");
59
- Object.defineProperty(exports, "Element", { enumerable: true, get: function () { return element_1.Element; } });
34
+ var variantInstance_1 = require("./api/classes/variantInstance");
35
+ Object.defineProperty(exports, "VariantInstance", { enumerable: true, get: function () { return variantInstance_1.VariantInstance; } });
36
+ var viewer_1 = require("./api/classes/viewer");
37
+ Object.defineProperty(exports, "Viewer", { enumerable: true, get: function () { return viewer_1.Viewer; } });
60
38
  var event_1 = require("./api/classes/event");
61
- Object.defineProperty(exports, "Emitter", { enumerable: true, get: function () { return event_1.emitter; } });
62
39
  Object.defineProperty(exports, "Event", { enumerable: true, get: function () { return event_1.Event; } });
63
- var eventBroadcaster_1 = require("./api/classes/eventBroadcaster");
64
- Object.defineProperty(exports, "EventBroadcaster", { enumerable: true, get: function () { return eventBroadcaster_1.EventBroadcaster; } });
40
+ Object.defineProperty(exports, "Emitter", { enumerable: true, get: function () { return event_1.emitter; } });
41
+ var eventemitter3_1 = require("eventemitter3");
42
+ Object.defineProperty(exports, "EventEmitter", { enumerable: true, get: function () { return eventemitter3_1.EventEmitter; } });
65
43
  var parameter_1 = require("./api/classes/parameter");
66
44
  Object.defineProperty(exports, "Parameter", { enumerable: true, get: function () { return parameter_1.Parameter; } });
67
- var parameterObservable_1 = require("./api/classes/parameterObservable");
68
- Object.defineProperty(exports, "ParameterObservable", { enumerable: true, get: function () { return parameterObservable_1.ParameterObservable; } });
69
- var placementAnimation_1 = require("./api/classes/placementAnimation");
70
- Object.defineProperty(exports, "PlacementAnimation", { enumerable: true, get: function () { return placementAnimation_1.PlacementAnimation; } });
45
+ var cubeTexture_1 = require("@babylonjs/core/Materials/Textures/cubeTexture");
46
+ Object.defineProperty(exports, "CubeTexture", { enumerable: true, get: function () { return cubeTexture_1.CubeTexture; } });
47
+ var animation_1 = require("@babylonjs/core/Animations/animation");
48
+ Object.defineProperty(exports, "BabylonAnimation", { enumerable: true, get: function () { return animation_1.Animation; } });
49
+ var meshBuilder_1 = require("@babylonjs/core/Meshes/meshBuilder");
50
+ Object.defineProperty(exports, "MeshBuilder", { enumerable: true, get: function () { return meshBuilder_1.MeshBuilder; } });
51
+ var texture_1 = require("@babylonjs/core/Materials/Textures/texture");
52
+ Object.defineProperty(exports, "Texture", { enumerable: true, get: function () { return texture_1.Texture; } });
53
+ var directionalLight_1 = require("@babylonjs/core/Lights/directionalLight");
54
+ Object.defineProperty(exports, "DirectionalLight", { enumerable: true, get: function () { return directionalLight_1.DirectionalLight; } });
55
+ var hemisphericLight_1 = require("@babylonjs/core/Lights/hemisphericLight");
56
+ Object.defineProperty(exports, "HemisphericLight", { enumerable: true, get: function () { return hemisphericLight_1.HemisphericLight; } });
71
57
  var variant_1 = require("./api/classes/variant");
72
58
  Object.defineProperty(exports, "Variant", { enumerable: true, get: function () { return variant_1.Variant; } });
73
- var variantInstance_1 = require("./api/classes/variantInstance");
74
- Object.defineProperty(exports, "VariantInstance", { enumerable: true, get: function () { return variantInstance_1.VariantInstance; } });
75
- var viewer_1 = require("./api/classes/viewer");
76
- Object.defineProperty(exports, "Viewer", { enumerable: true, get: function () { return viewer_1.Viewer; } });
77
- var viewerLight_1 = require("./api/classes/viewerLight");
78
- Object.defineProperty(exports, "ViewerLight", { enumerable: true, get: function () { return viewerLight_1.ViewerLight; } });
59
+ var parameterObservable_1 = require("./api/classes/parameterObservable");
60
+ Object.defineProperty(exports, "ParameterObservable", { enumerable: true, get: function () { return parameterObservable_1.ParameterObservable; } });
61
+ var elementParameterizable_1 = require("./api/classes/elementParameterizable");
62
+ Object.defineProperty(exports, "ElementParameterizable", { enumerable: true, get: function () { return elementParameterizable_1.ElementParameterizable; } });
63
+ var element_1 = require("./api/classes/element");
64
+ Object.defineProperty(exports, "Element", { enumerable: true, get: function () { return element_1.Element; } });
65
+ var variantInstanceManager_1 = require("./api/manager/variantInstanceManager");
66
+ Object.defineProperty(exports, "VariantInstanceManager", { enumerable: true, get: function () { return variantInstanceManager_1.VariantInstanceManager; } });
79
67
  var animationManager_1 = require("./api/manager/animationManager");
80
68
  Object.defineProperty(exports, "AnimationManager", { enumerable: true, get: function () { return animationManager_1.AnimationManager; } });
69
+ var eventBroadcaster_1 = require("./api/classes/eventBroadcaster");
70
+ Object.defineProperty(exports, "EventBroadcaster", { enumerable: true, get: function () { return eventBroadcaster_1.EventBroadcaster; } });
81
71
  var sceneManager_1 = require("./api/manager/sceneManager");
82
72
  Object.defineProperty(exports, "SceneManager", { enumerable: true, get: function () { return sceneManager_1.SceneManager; } });
83
- var variantInstanceManager_1 = require("./api/manager/variantInstanceManager");
84
- Object.defineProperty(exports, "VariantInstanceManager", { enumerable: true, get: function () { return variantInstanceManager_1.VariantInstanceManager; } });
73
+ var placementAnimation_1 = require("./api/classes/placementAnimation");
74
+ Object.defineProperty(exports, "PlacementAnimation", { enumerable: true, get: function () { return placementAnimation_1.PlacementAnimation; } });
85
75
  var BabylonHelper = require("./api/util/babylonHelper");
86
76
  exports.BabylonHelper = BabylonHelper;
77
+ /**
78
+ * Without explicitly importing the "BoundingBoxRenderer", we're getting "scene.getBoundingBoxRenderer is undefined"
79
+ * errors when creating HighlightLayer instances. Not sure why but those errors only happen when using the built
80
+ * version of the viewer (e.g. when pulling it from NPM etc.)...
81
+ */
82
+ require("@babylonjs/core/Rendering/boundingBoxRenderer");
87
83
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA,gDAAgD;;;AAEhD,kEAAqF;AAgFpF,iGAhFqB,qBAAgB,OAgFrB;AA/EjB,2EAA0E;AA0EzE,gGA1EQ,iCAAe,OA0ER;AAzEhB,yDAAwD;AAwEvD,uFAxEQ,eAAM,OAwER;AAvEP,4EAA2E;AA+E1E,iGA/EQ,mCAAgB,OA+ER;AA9EjB,4EAA2E;AA6E1E,iGA7EQ,mCAAgB,OA6ER;AA5EjB,+DAA8D;AAiE7D,yFAjEQ,mBAAQ,OAiER;AAhET,yEAAwE;AAiEvE,4FAjEQ,yBAAW,OAiER;AAhEZ,+EAA8E;AAiE7E,iGAjEQ,mCAAgB,OAiER;AAhEjB,8EAA6E;AAqE5E,4FArEQ,yBAAW,OAqER;AApEZ,oFAAmF;AAmElF,+FAnEQ,+BAAc,OAmER;AAlEf,sEAAqE;AAqEpE,wFArEQ,iBAAO,OAqER;AApER,+DAAkE;AAmDjE,uFAnDQ,mBAAM,OAmDR;AACN,uFApDgB,mBAAM,OAoDhB;AAnDP,iEAA4D;AAoD3D,wFApDQ,qBAAO,OAoDR;AAnDR,oEAAmE;AAoDlE,6FApDQ,2BAAY,OAoDR;AAnDb,sEAAqE;AAoDpE,8FApDQ,6BAAa,OAoDR;AAnDd,oDAAmD;AAoDlD,qFApDQ,WAAI,OAoDR;AAnDL,kEAAiE;AA8DhE,4FA9DQ,yBAAW,OA8DR;AA7DZ,sEAAqE;AAmDpE,8FAnDQ,6BAAa,OAmDR;AAlDd,6CAA4C;AAmD3C,qFAnDQ,WAAI,OAmDR;AAjDL;;;;GAIG;AACH,yDAAuD;AACvD,+CAA8C;AA+C7C,sFA/CQ,aAAK,OA+CR;AA9CN,iEAAgE;AA2B/D,gGA3BQ,iCAAe,OA2BR;AA1BhB,+EAA8E;AA2B7E,uGA3BQ,+CAAsB,OA2BR;AA1BvB,+CAA6C;AA6B5C,6FA7BQ,4BAAY,OA6BR;AA5Bb,iDAAgD;AAqD/C,wFArDQ,iBAAO,OAqDR;AApDR,6CAAqD;AA0BzC,wFA1BH,eAAO,OA0BG;AAElB,sFA5BiB,aAAK,OA4BjB;AA3BN,mEAAkE;AAoDjE,iGApDQ,mCAAgB,OAoDR;AAnDjB,qDAAoD;AA2BnD,0FA3BQ,qBAAS,OA2BR;AA1BV,yEAAwE;AAmBvE,oGAnBQ,yCAAmB,OAmBR;AAlBpB,uEAAsE;AAmDrE,mGAnDQ,uCAAkB,OAmDR;AAlDnB,iDAAgD;AAc/C,wFAdQ,iBAAO,OAcR;AAbR,iEAAgE;AAwB/D,gGAxBQ,iCAAe,OAwBR;AAvBhB,+CAA8C;AAc7C,uFAdQ,eAAM,OAcR;AAbP,yDAAwD;AAiBvD,4FAjBQ,yBAAW,OAiBR;AAhBZ,mEAAkE;AASjE,iGATQ,mCAAgB,OASR;AARjB,2DAA0D;AA4CzD,6FA5CQ,2BAAY,OA4CR;AA3Cb,+EAA8E;AAS7E,uGATQ,+CAAsB,OASR;AARvB,wDAA0D;AA4CzD,sCAAa"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":";AAAA,gDAAgD;;;AAEhD,2EAA0E;AAuEzE,gGAvEQ,iCAAe,OAuER;AAtEhB,yDAAwD;AAqEvD,uFArEQ,eAAM,OAqER;AApEP,+DAA8D;AAgE7D,yFAhEQ,mBAAQ,OAgER;AA/DT,yEAAwE;AAgEvE,4FAhEQ,yBAAW,OAgER;AA/DZ,+EAA8E;AAgE7E,iGAhEQ,mCAAgB,OAgER;AA/DjB,oFAAmF;AAmElF,+FAnEQ,+BAAc,OAmER;AAlEf,+DAAkE;AAoDjE,uFApDQ,mBAAM,OAoDR;AACN,uFArDgB,mBAAM,OAqDhB;AApDP,iEAA4D;AAqD3D,wFArDQ,qBAAO,OAqDR;AApDR,oEAAmE;AAqDlE,6FArDQ,2BAAY,OAqDR;AApDb,sEAAqE;AAqDpE,8FArDQ,6BAAa,OAqDR;AApDd,oDAAmD;AAqDlD,qFArDQ,WAAI,OAqDR;AApDL,sEAAqE;AAqDpE,8FArDQ,6BAAa,OAqDR;AApDd,6CAA4C;AAqD3C,qFArDQ,WAAI,OAqDR;AApDL,+CAA8C;AAwD7C,sFAxDQ,aAAK,OAwDR;AAvDN,iEAAgE;AA2C/D,gGA3CQ,iCAAe,OA2CR;AA1ChB,+CAA8C;AAmC7C,uFAnCQ,eAAM,OAmCR;AAlCP,6CAAqD;AAuCpD,sFAvCQ,aAAK,OAuCR;AAFM,wFArCI,eAAO,OAqCJ;AApCnB,+CAA6C;AAqC5C,6FArCQ,4BAAY,OAqCR;AApCb,qDAAoD;AAsCnD,0FAtCQ,qBAAS,OAsCR;AArCV,8EAA6E;AAsD5E,4FAtDQ,yBAAW,OAsDR;AArDZ,kEAAqF;AAwDpF,iGAxDqB,qBAAgB,OAwDrB;AAvDjB,kEAAiE;AAqDhE,4FArDQ,yBAAW,OAqDR;AApDZ,sEAAqE;AAqDpE,wFArDQ,iBAAO,OAqDR;AApDR,4EAA2E;AAuD1E,iGAvDQ,mCAAgB,OAuDR;AAtDjB,4EAA2E;AAqD1E,iGArDQ,mCAAgB,OAqDR;AApDjB,iDAAgD;AAuB/C,wFAvBQ,iBAAO,OAuBR;AAtBR,yEAAwE;AAyBvE,oGAzBQ,yCAAmB,OAyBR;AAxBpB,+EAA8E;AAyB7E,uGAzBQ,+CAAsB,OAyBR;AAxBvB,iDAAgD;AAmD/C,wFAnDQ,iBAAO,OAmDR;AAlDR,+EAA8E;AAoB7E,uGApBQ,+CAAsB,OAoBR;AAnBvB,mEAAkE;AAiBjE,iGAjBQ,mCAAgB,OAiBR;AAhBjB,mEAAkE;AAiDjE,iGAjDQ,mCAAgB,OAiDR;AAhDjB,2DAA0D;AAiDzD,6FAjDQ,2BAAY,OAiDR;AAhDb,uEAAsE;AAiDrE,mGAjDQ,uCAAkB,OAiDR;AAhDnB,wDAA0D;AAiDzD,sCAAa;AA/Cd;;;;GAIG;AACH,yDAAuD"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "@combeenation/3d-viewer",
3
3
  "description": "Combeenation 3D Viewer",
4
- "version": "4.0.0-alpha8",
4
+ "version": "4.0.0-beta3",
5
5
  "homepage": "https://github.com/Combeenation/3d-viewer#readme",
6
6
  "keywords": [],
7
7
  "author": "",
@@ -1,40 +1,35 @@
1
1
  import { HighlightLayer } from '@babylonjs/core/Layers/highlightLayer';
2
- import { Light } from '@babylonjs/core/Lights/light';
3
- import { ShadowGenerator } from '@babylonjs/core/Lights/Shadows/shadowGenerator';
4
2
  import { Material } from '@babylonjs/core/Materials/material';
5
3
  import { StandardMaterial } from '@babylonjs/core/Materials/standardMaterial';
6
4
  import { DynamicTexture } from '@babylonjs/core/Materials/Textures/dynamicTexture';
5
+ import { Axis, Space } from '@babylonjs/core/Maths/math.axis';
7
6
  import { Color3 } from '@babylonjs/core/Maths/math.color';
8
7
  import { AbstractMesh } from '@babylonjs/core/Meshes/abstractMesh';
9
8
  import { InstancedMesh } from '@babylonjs/core/Meshes/instancedMesh';
10
9
  import { Mesh } from '@babylonjs/core/Meshes/mesh';
11
10
  import { TransformNode } from '@babylonjs/core/Meshes/transformNode';
12
- import { get, isArray, isNumber, isPlainObject, merge, union } from 'lodash-es';
11
+ import { cloneDeep, concat, get, isArray, isNumber, isPlainObject, merge, union } from 'lodash-es';
13
12
  import {
14
13
  activateTransformNode as activate,
15
14
  addToHighlightLayer,
16
- addToShadowGenerator,
17
15
  assertTransformNode,
18
16
  cloneTransformNode,
19
17
  cloneTransformNodeMaterial,
20
18
  deactivateTransformNode as deactivate,
21
19
  getClientRectFromMesh,
22
- injectNodeMetadata,
20
+ injectTransformNodeMetadata,
23
21
  mapToDottedNodes,
24
- moveTransformNode,
25
22
  removeFromHighlightLayer,
26
- removeFromShadowGenerator,
27
- rotateTransformNode,
28
23
  setMaterial,
29
24
  setMaterialColor,
30
25
  setMaterialMetallness,
31
26
  setMaterialRoughness,
32
- setMaterialTexture,
33
- setReceiveShadows
27
+ setMaterialTexture
34
28
  } from '../util/babylonHelper';
35
- import { createImageBitmapFromImgSrc, createImageBitmapFromSvg } from '../util/resourceHelper';
36
- import { VariantParameterizable } from './../classes/variantParameterizable';
29
+ import { createImageFromSvg, createImageFromImgSrc, mergeMaps } from '../util/resourceHelper';
37
30
  import { DottedPath } from './dottedPath';
31
+ import { ElementParameterizable } from './elementParameterizable';
32
+ import { Event } from './event';
38
33
  import { Parameter } from './parameter';
39
34
  import { Variant } from './variant';
40
35
 
@@ -45,20 +40,22 @@ import { Variant } from './variant';
45
40
  * When used in typings, refer to via its alias {@link VariantElement} to prevent name clashes with the web APIs
46
41
  * [Element](https://developer.mozilla.org/en-US/docs/Web/API/Element) class
47
42
  */
48
- export class Element extends VariantParameterizable {
49
-
50
- public readonly nodes: TransformNode[] = [];
43
+ export class Element extends ElementParameterizable {
51
44
 
52
45
  protected readonly _dottedNodes: Map<DottedPath, TransformNode> = new Map();
53
46
 
47
+ protected readonly _parameterObservers: Map<string, ParameterObserver[]> = new Map();
48
+
54
49
  protected _highlightLayer?: HighlightLayer;
55
50
 
51
+ public readonly nodes: TransformNode[] = [];
52
+
56
53
  /**
57
54
  * Constructor.
58
55
  */
59
- protected constructor( public readonly variant: Variant,
56
+ public constructor( public readonly variant: Variant,
60
57
  public readonly name: string ) {
61
- super( variant, name );
58
+ super();
62
59
  if ( process.env.NODE_ENV?.toLowerCase().includes('dev')) {
63
60
  this.assertPathDefinitions();
64
61
  }
@@ -73,13 +70,6 @@ export class Element extends VariantParameterizable {
73
70
  this.addParameterObservers();
74
71
  }
75
72
 
76
- /**
77
- * Creates an {@link Element} with given name.
78
- */
79
- public static async create( variant: Variant, name: string ): Promise<Element> {
80
- return new Element( variant, name );
81
- }
82
-
83
73
  /**
84
74
  * The {@link DottedPath} in the built tree of {@link Element}s.
85
75
  * E.g. "_.top-1.sub-2.sub-sub-3.el-1"
@@ -166,9 +156,10 @@ export class Element extends VariantParameterizable {
166
156
  * Gets a node by its {@link DottedPath}.
167
157
  */
168
158
  public getNode( dottedPath: DottedPathArgument ): TransformNode {
169
- // TODO: fix, currently broken
170
159
  const _dottedPath = DottedPath.create( dottedPath );
171
- const node = this._dottedNodes.get( _dottedPath );
160
+ const keys = Array.from( this._dottedNodes.keys() ).map( dp => dp.path );
161
+ const values = Array.from( this._dottedNodes.values() );
162
+ const node = values[keys.indexOf( _dottedPath.path )];
172
163
  if( !node ) {
173
164
  throw new Error( `Node with path "${_dottedPath.path}" does not exist for element "${this.id}".` );
174
165
  }
@@ -221,11 +212,41 @@ export class Element extends VariantParameterizable {
221
212
  }
222
213
 
223
214
  /**
224
- * @see {@link VariantParameterizable.commitParameters}
215
+ * Places the given {@link ParameterBag} in the {@link Element}'s parameters, replaces all patterns in the
216
+ * {@link StructureJson} and broadcasts all {@link ParameterObserver}s.
217
+ *
225
218
  * @emit {@link Event.ELEMENT_PARAMETER_COMMITTED}
226
219
  */
227
- public async commitParameters( parameters?: ParameterBag ): Promise<VariantParameterizable> {
228
- return super.commitParameters( parameters );
220
+ public async commitParameters( parameters?: ParameterBag ): Promise<Element> {
221
+ if( !parameters ) {
222
+ parameters = {};
223
+ }
224
+ const oldParameters = cloneDeep( this.parameters );
225
+ merge( this.parameters, parameters );
226
+ // handle parameter observers
227
+ let observerPromises: Promise<void | ParameterObserver>[] = [];
228
+ for( const parameter in this.parameters ) {
229
+ const oldParameterValue = oldParameters[parameter];
230
+ const newParameterValue = this.parameters[parameter];
231
+ this.variant.assertParameter( this.variant.inheritedParameterDeclaration, parameter, newParameterValue );
232
+ if( oldParameterValue === newParameterValue ) {
233
+ continue;
234
+ }
235
+ // parameter changed
236
+ const parameterObservers = mergeMaps( this._parameterObservers, this.parameterObservers );
237
+ if( parameterObservers.has( parameter ) ) {
238
+ const observers = parameterObservers.get( parameter )!;
239
+ observerPromises = concat(observerPromises, observers.map( observer => {
240
+ const observerResult = observer( this, oldParameterValue, newParameterValue );
241
+ return Promise.resolve( observerResult ).then( () => {
242
+ this.broadcastEvent( Event.ELEMENT_PARAMETER_COMMITTED,
243
+ this, parameter, oldParameterValue, newParameterValue );
244
+ } );
245
+ } ) );
246
+ }
247
+ }
248
+ await Promise.all( observerPromises );
249
+ return this;
229
250
  }
230
251
 
231
252
  /**
@@ -260,7 +281,7 @@ export class Element extends VariantParameterizable {
260
281
  * Draws a `ImageBitmap` or `OffscreenCanvas` onto a `paintable` defined via {@link PaintableDefinition}.
261
282
  */
262
283
  public drawPaintable( paintable: string, imageSource: CanvasImageSource ): Element {
263
- const paintableDefinition = this.getPaintableDefinition( paintable );
284
+ // node and material checks and preperation
264
285
  const node = this.getPaintableNode( paintable );
265
286
  if( !(node instanceof AbstractMesh) ) {
266
287
  throw new Error( `The path must be an instance of "AbstractMesh" for paintable "${paintable}" ` +
@@ -275,12 +296,15 @@ export class Element extends VariantParameterizable {
275
296
  node.material.transparencyMode = Material.MATERIAL_ALPHATESTANDBLEND;
276
297
  if( !get( node.metadata, 'dirty.material.texture' ) ) {
277
298
  // inject initial value and mark as dirty
278
- injectNodeMetadata( node, { dirty: { material: { texture: true } } } );
299
+ injectTransformNodeMetadata( node, { dirty: { material: { texture: true } } } );
279
300
  }
301
+
302
+ // consider width and height of the paintable
280
303
  const widthAndHeight = {
281
304
  width: imageSource.width,
282
305
  height: imageSource.height
283
306
  };
307
+ const paintableDefinition = this.getPaintableDefinition( paintable );
284
308
  if( isNumber( paintableDefinition.textureOptions ) ) {
285
309
  widthAndHeight.width = paintableDefinition.textureOptions;
286
310
  widthAndHeight.height = paintableDefinition.textureOptions;
@@ -288,17 +312,23 @@ export class Element extends VariantParameterizable {
288
312
  widthAndHeight.width = paintableDefinition.textureOptions.width;
289
313
  widthAndHeight.height = paintableDefinition.textureOptions.height;
290
314
  }
315
+
316
+ // create dynamic texture on which the image can be drawn
291
317
  const texture = new DynamicTexture(
292
318
  `${this.id}.${paintable}.texture`,
293
319
  widthAndHeight,
294
320
  this.variant.viewer.scene,
295
321
  false
296
322
  );
297
- setMaterialTexture( node, texture, false );
323
+
324
+ // draw image on texture
298
325
  const ctx = texture.getContext();
299
- // flip texture context horizontal with translate and scale
300
326
  ctx.drawImage( imageSource, 0, 0);
301
327
  texture.update( false );
328
+
329
+ // finally apply the texture on the desired node material
330
+ setMaterialTexture( node, texture, false );
331
+
302
332
  return this;
303
333
  }
304
334
 
@@ -306,16 +336,16 @@ export class Element extends VariantParameterizable {
306
336
  * Draws a SVG string onto a `paintable` defined via {@link PaintableDefinition}.
307
337
  */
308
338
  public async drawPaintableFromSvg( paintable: string, svgSource: string ): Promise<Element> {
309
- const source = await createImageBitmapFromSvg( svgSource );
310
- return this.drawPaintable( paintable, source );
339
+ const image = await createImageFromSvg( svgSource );
340
+ return this.drawPaintable( paintable, image );
311
341
  }
312
342
 
313
343
  /**
314
344
  * Draws an Image from source (URL/URI) onto a `paintable` defined via {@link PaintableDefinition}.
315
345
  */
316
346
  public async drawPaintableFromImgSrc( paintable: string, imgSource: string ): Promise<Element> {
317
- const source = await createImageBitmapFromImgSrc( imgSource );
318
- return this.drawPaintable( paintable, source );
347
+ const image = await createImageFromImgSrc( imgSource );
348
+ return this.drawPaintable( paintable, image );
319
349
  }
320
350
 
321
351
  /**
@@ -332,12 +362,12 @@ export class Element extends VariantParameterizable {
332
362
  }
333
363
  if( visible === true ) {
334
364
  element.nodes.forEach( node => {
335
- injectNodeMetadata( node, { visibility: node.isEnabled() } );
365
+ injectTransformNodeMetadata( node, { visibility: node.isEnabled() } );
336
366
  activate( node );
337
367
  } );
338
368
  } else if( visible === false ) {
339
369
  element.nodes.forEach( node => {
340
- injectNodeMetadata( node, { visibility: node.isEnabled() } );
370
+ injectTransformNodeMetadata( node, { visibility: node.isEnabled() } );
341
371
  deactivate( node );
342
372
  } );
343
373
  }
@@ -353,7 +383,7 @@ export class Element extends VariantParameterizable {
353
383
  async ( element: Element, oldValue: ParameterValue, newValue: ParameterValue ) => {
354
384
  const material = element.variant.getMaterial( newValue.toString() );
355
385
  element.nodes.forEach( node => {
356
- assertTransformNode(node, (node: AbstractMesh) => {
386
+ assertTransformNode(node, (node: TransformNode) => {
357
387
  if( node instanceof InstancedMesh ) {
358
388
  throw new Error( `Changing parameter "${Parameter.MATERIAL}" ` +
359
389
  `of an InstancedMesh is not supported. ` +
@@ -368,7 +398,7 @@ export class Element extends VariantParameterizable {
368
398
  async ( element: Element, oldValue: ParameterValue, newValue: ParameterValue ) => {
369
399
  const color = Parameter.parseColor( newValue );
370
400
  element.nodes.forEach( node => {
371
- assertTransformNode(node, (node: AbstractMesh) => {
401
+ assertTransformNode(node, (node: TransformNode) => {
372
402
  if( node instanceof InstancedMesh ) {
373
403
  throw new Error( `Changing parameter "${Parameter.MATERIAL_COLOR}" ` +
374
404
  `of an InstancedMesh is not supported. ` +
@@ -380,7 +410,7 @@ export class Element extends VariantParameterizable {
380
410
  }
381
411
  if( !get( node.metadata, 'dirty.material.color' ) ) {
382
412
  // inject initial value and mark as dirty
383
- injectNodeMetadata( node, { dirty: { material: { color: oldValue } } } );
413
+ injectTransformNodeMetadata( node, { dirty: { material: { color: oldValue } } } );
384
414
  }
385
415
  setMaterialColor( node, color );
386
416
  } );
@@ -390,7 +420,7 @@ export class Element extends VariantParameterizable {
390
420
  async ( element: Element, oldValue: ParameterValue, newValue: ParameterValue ) => {
391
421
  const metallness = Parameter.parseNumber( newValue );
392
422
  element.nodes.forEach( node => {
393
- assertTransformNode(node, (node: AbstractMesh) => {
423
+ assertTransformNode(node, (node: TransformNode) => {
394
424
  if( node instanceof InstancedMesh ) {
395
425
  throw new Error( `Changing parameter "${Parameter.MATERIAL_METALLNESS}" ` +
396
426
  `of an InstancedMesh is not supported. ` +
@@ -402,7 +432,7 @@ export class Element extends VariantParameterizable {
402
432
  }
403
433
  if( !get( node.metadata, 'dirty.material.metallness' ) ) {
404
434
  // inject initial value and mark as dirty
405
- injectNodeMetadata( node, { dirty: { material: { metallness: oldValue } } } );
435
+ injectTransformNodeMetadata( node, { dirty: { material: { metallness: oldValue } } } );
406
436
  }
407
437
  setMaterialMetallness( node, metallness );
408
438
  } );
@@ -412,7 +442,7 @@ export class Element extends VariantParameterizable {
412
442
  async ( element: Element, oldValue: ParameterValue, newValue: ParameterValue ) => {
413
443
  const roughness = Parameter.parseNumber( newValue );
414
444
  element.nodes.forEach( node => {
415
- assertTransformNode(node, (node: AbstractMesh) => {
445
+ assertTransformNode(node, (node: TransformNode) => {
416
446
  if( node instanceof InstancedMesh ) {
417
447
  throw new Error( `Changing parameter "${Parameter.MATERIAL_ROUGHNESS}" ` +
418
448
  `of an InstancedMesh is not supported. ` +
@@ -424,7 +454,7 @@ export class Element extends VariantParameterizable {
424
454
  }
425
455
  if( !get( node.metadata, 'dirty.material.roughness' ) ) {
426
456
  // inject initial value and mark as dirty
427
- injectNodeMetadata( node, { dirty: { material: { roughness: oldValue } } } );
457
+ injectTransformNodeMetadata( node, { dirty: { material: { roughness: oldValue } } } );
428
458
  }
429
459
  setMaterialRoughness( node, roughness );
430
460
  } );
@@ -480,7 +510,7 @@ export class Element extends VariantParameterizable {
480
510
  // Add/Remove meshes to previously created highlight layers.
481
511
  if( highlighted === true ) {
482
512
  element.nodes.forEach( node => {
483
- assertTransformNode(node, (node: AbstractMesh) => {
513
+ assertTransformNode(node, (node: TransformNode) => {
484
514
  if( node instanceof InstancedMesh ) {
485
515
  throw new Error( `Changing parameter "${Parameter.HIGHLIGHTED}" ` +
486
516
  `of an InstancedMesh is not supported. ` +
@@ -507,54 +537,35 @@ export class Element extends VariantParameterizable {
507
537
  this._parameterObservers.set( Parameter.POSITION, [
508
538
  async ( element: Element, oldValue: ParameterValue, newValue: ParameterValue ) => {
509
539
  // we have to deal just with root nodes here due to relative impacts in a node tree
510
- element.nodes.forEach( node => moveTransformNode( node, Parameter.parseVector( newValue ) ) );
540
+ element.nodes.forEach( node => {
541
+ // remember absolute position and reset it before translating
542
+ if( !get( node.metadata, 'position' ) ) {
543
+ node.metadata.position = node.absolutePosition.clone();
544
+ }
545
+ node.setAbsolutePosition( node.metadata.position );
546
+ // move
547
+ const distance = Parameter.parseVector( newValue );
548
+ node.translate( Axis.X, distance.x, Space.WORLD );
549
+ node.translate( Axis.Y, distance.y, Space.WORLD );
550
+ node.translate( Axis.Z, distance.z, Space.WORLD );
551
+ } );
511
552
  }
512
553
  ] );
513
554
  this._parameterObservers.set( Parameter.ROTATION, [
514
555
  async ( element: Element, oldValue: ParameterValue, newValue: ParameterValue ) => {
515
556
  // we have to deal just with root nodes here due to relative impacts in a node tree
516
- element.nodes.forEach( node => rotateTransformNode( node, Parameter.parseRotation( newValue ) ) );
517
- }
518
- ] );
519
- this._parameterObservers.set( Parameter.CAST_SHADOW, [
520
- async ( element: Element, oldValue: ParameterValue, newValue: ParameterValue ) => {
521
- let castShadow;
522
- try {
523
- castShadow = Parameter.parseBoolean( newValue );
524
- } catch( e ) {
525
- return;
526
- }
527
- let lightCsl = element.inheritedParameters[Parameter.CAST_SHADOW_FROM_LIGHTS];
528
- if( ! lightCsl ) {
529
- lightCsl = element.variant.inheritedViewerLights.map( l => l.name ).join( ',' );
530
- }
531
- if( castShadow === true ) {
532
- await this.castShadowValueHandler( lightCsl, addToShadowGenerator );
533
- }
534
- if( castShadow === false ) {
535
- await this.castShadowValueHandler( lightCsl, removeFromShadowGenerator );
536
- }
537
- }
538
- ] );
539
- this._parameterObservers.set( Parameter.CAST_SHADOW_FROM_LIGHTS, [
540
- async ( element: Element, oldValue: ParameterValue, newValue: ParameterValue ) => {
541
- // TODO: Possible performance issue in combination with CAST_SHADOW, since both observers are initially called
542
- // when CAST_SHADOW and CAST_SHADOW_FROM_LIGHTS are defined in the spec.
543
- const lightCsl = element.variant.inheritedViewerLights.map( l => l.name ).join( ',' );
544
- // cleanup all shadow generators
545
- await this.castShadowValueHandler( lightCsl, removeFromShadowGenerator );
546
- if( element.castShadow === true ) {
547
- // if newValue is undefined or '' then set newValue to lightCsl (use all lights)
548
- if( !newValue ) {
549
- newValue = lightCsl;
557
+ element.nodes.forEach( node => {
558
+ // remember absolute rotation and reset it before translating
559
+ if(!get( node.metadata, 'rotation' ) ) {
560
+ node.metadata.rotation = node.rotation.clone();
550
561
  }
551
- await this.castShadowValueHandler( newValue, addToShadowGenerator );
552
- }
553
- }
554
- ] );
555
- this._parameterObservers.set( Parameter.RECEIVE_SHADOWS, [
556
- async ( element: Element, oldValue: ParameterValue, newValue: ParameterValue ) => {
557
- element.nodes.forEach( node => setReceiveShadows( node, Parameter.parseBoolean( newValue ) ) );
562
+ node.rotation = node.metadata.rotation;
563
+ // rotate
564
+ const rotation = Parameter.parseRotation( newValue );
565
+ node.rotate( Axis.X, rotation.x, Space.WORLD );
566
+ node.rotate( Axis.Y, rotation.y, Space.WORLD );
567
+ node.rotate( Axis.Z, rotation.z, Space.WORLD );
568
+ } );
558
569
  }
559
570
  ] );
560
571
  return this;
@@ -603,25 +614,4 @@ export class Element extends VariantParameterizable {
603
614
  } );
604
615
  }
605
616
 
606
- /**
607
- * Handles callback for given light parameter.
608
- */
609
- private async castShadowValueHandler( lightCsl: ParameterValue, mutator: CallableFunction ) {
610
- let lights: Light[] = [];
611
- for( const lightName of Parameter.parseCommaSeparatedList( lightCsl ) ) {
612
- const viewerLight = await this.variant.getViewerLight( lightName );
613
- if( viewerLight ) {
614
- lights.push( viewerLight.light );
615
- }
616
- }
617
- const shadowGenerators = lights
618
- .map( light => light?.getShadowGenerator() as ShadowGenerator )
619
- .filter( Boolean );
620
- shadowGenerators.forEach( generator => {
621
- this.nodes.forEach( node => {
622
- mutator( generator, node );
623
- } );
624
- } );
625
- }
626
-
627
617
  }