babylonjs-editor-tools 0.0.3 → 0.0.5

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/build/index.js CHANGED
@@ -15,7 +15,6 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  __exportStar(require("./loader"), exports);
18
- __exportStar(require("./texture"), exports);
19
18
  __exportStar(require("./rendering/ssao"), exports);
20
19
  __exportStar(require("./rendering/ssr"), exports);
21
20
  __exportStar(require("./rendering/motion-blur"), exports);
package/build/light.js ADDED
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.configureShadowMapRefreshRate = exports.configureShadowMapRenderListPredicate = void 0;
4
+ const math_vector_1 = require("@babylonjs/core/Maths/math.vector");
5
+ const renderTargetTexture_1 = require("@babylonjs/core/Materials/Textures/renderTargetTexture");
6
+ function configureShadowMapRenderListPredicate(scene) {
7
+ scene.lights.forEach((light) => {
8
+ const shadowMap = light.getShadowGenerator()?.getShadowMap();
9
+ if (!shadowMap) {
10
+ return;
11
+ }
12
+ shadowMap.renderListPredicate = (mesh) => {
13
+ const distance = math_vector_1.Vector3.Distance(mesh.getAbsolutePosition(), light.getAbsolutePosition());
14
+ return distance <= light.range;
15
+ };
16
+ });
17
+ }
18
+ exports.configureShadowMapRenderListPredicate = configureShadowMapRenderListPredicate;
19
+ async function configureShadowMapRefreshRate(scene) {
20
+ scene.executeWhenReady(() => {
21
+ scene.lights.forEach((light) => {
22
+ const shadowMap = light.getShadowGenerator()?.getShadowMap();
23
+ if (shadowMap) {
24
+ shadowMap.refreshRate = light.metadata?.refreshRate ?? renderTargetTexture_1.RenderTargetTexture.REFRESHRATE_RENDER_ONEVERYFRAME;
25
+ }
26
+ });
27
+ });
28
+ }
29
+ exports.configureShadowMapRefreshRate = configureShadowMapRefreshRate;
30
+ //# sourceMappingURL=light.js.map
package/build/loader.js CHANGED
@@ -6,8 +6,13 @@ const ssr_1 = require("./rendering/ssr");
6
6
  const ssao_1 = require("./rendering/ssao");
7
7
  const motion_blur_1 = require("./rendering/motion-blur");
8
8
  const default_pipeline_1 = require("./rendering/default-pipeline");
9
- async function loadScene(rootUrl, sceneFilename, scene, scriptsMap) {
9
+ const light_1 = require("./light");
10
+ require("./texture");
11
+ async function loadScene(rootUrl, sceneFilename, scene, scriptsMap, quality = "high") {
12
+ scene.loadingQuality = quality;
10
13
  await sceneLoader_1.SceneLoader.AppendAsync(rootUrl, sceneFilename, scene);
14
+ (0, light_1.configureShadowMapRenderListPredicate)(scene);
15
+ (0, light_1.configureShadowMapRefreshRate)(scene);
11
16
  if (scene.metadata?.rendering) {
12
17
  const camera = scene.activeCamera ?? scene.cameras[0];
13
18
  if (scene.metadata.rendering.ssao2RenderingPipeline) {
@@ -51,6 +56,14 @@ function loadScriptsFor(scene, object, scriptsMap) {
51
56
  scene.onBeforeRenderObservable.add(() => instance.onUpdate());
52
57
  }
53
58
  }
59
+ else {
60
+ if (exports.onStart) {
61
+ scene.onBeforeRenderObservable.addOnce(() => exports.onStart(object));
62
+ }
63
+ if (exports.onUpdate) {
64
+ scene.onBeforeRenderObservable.add(() => exports.onUpdate(object));
65
+ }
66
+ }
54
67
  });
55
68
  object.metadata.scripts = undefined;
56
69
  }
package/build/texture.js CHANGED
@@ -1,81 +1,44 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.startTextureOptimizer = void 0;
4
- const guards_1 = require("./guards");
5
- const sceneMap = new Map();
6
- function startTextureOptimizer(scene) {
7
- const engine = scene.getEngine();
8
- const existingRenderLoop = sceneMap.get(scene);
9
- if (existingRenderLoop) {
10
- engine.stopRenderLoop(existingRenderLoop);
3
+ const decorators_serialization_1 = require("@babylonjs/core/Misc/decorators.serialization");
4
+ const scalar_1 = require("./tools/scalar");
5
+ /**
6
+ * Defines the reference to the original texture parser function.
7
+ */
8
+ const textureParser = decorators_serialization_1.SerializationHelper._TextureParser;
9
+ decorators_serialization_1.SerializationHelper._TextureParser = (sourceProperty, scene, rootUrl) => {
10
+ if (scene.loadingQuality === "high" || !sourceProperty.metadata?.baseSize) {
11
+ return textureParser(sourceProperty, scene, rootUrl);
11
12
  }
12
- let time = 0;
13
- const renderLoop = () => {
14
- const camera = scene.activeCamera;
15
- time += engine.getDeltaTime();
16
- if (!camera || time < 1000) {
17
- return;
18
- }
19
- scene.meshes.forEach((mesh) => {
20
- if (!(0, guards_1.isMesh)(mesh) || !mesh.material) {
21
- return;
22
- }
23
- handleMesh(camera, mesh);
24
- });
25
- time = 0;
26
- };
27
- sceneMap.set(scene, renderLoop);
28
- engine.runRenderLoop(renderLoop);
29
- }
30
- exports.startTextureOptimizer = startTextureOptimizer;
31
- function handleMesh(camera, mesh) {
32
- const material = mesh.material;
33
- const textures = material.getActiveTextures();
34
- if (!textures.length) {
35
- return;
13
+ const width = sourceProperty.metadata.baseSize.width;
14
+ const height = sourceProperty.metadata.baseSize.height;
15
+ let suffix = "";
16
+ switch (scene.loadingQuality) {
17
+ case "medium":
18
+ const midWidth = (0, scalar_1.getPowerOfTwoUntil)(width * 0.66);
19
+ const midHeight = (0, scalar_1.getPowerOfTwoUntil)(height * 0.66);
20
+ suffix = `_${midWidth}_${midHeight}`;
21
+ break;
22
+ case "low":
23
+ const lowWidth = (0, scalar_1.getPowerOfTwoUntil)(width * 0.33);
24
+ const lowHeight = (0, scalar_1.getPowerOfTwoUntil)(height * 0.33);
25
+ suffix = `_${lowWidth}_${lowHeight}`;
26
+ break;
36
27
  }
37
- let isInFrustrum = false;
38
- if (mesh.instances.length) {
39
- isInFrustrum = [mesh, ...mesh.instances].find((instance) => camera.isInFrustum(instance)) ? true : false;
28
+ const name = sourceProperty.name;
29
+ if (!name || !suffix) {
30
+ return textureParser(sourceProperty, scene, rootUrl);
40
31
  }
41
- else {
42
- isInFrustrum = camera.isInFrustum(mesh);
32
+ const finalUrl = name.split("/");
33
+ const filename = finalUrl.pop();
34
+ if (!filename) {
35
+ return textureParser(sourceProperty, scene, rootUrl);
43
36
  }
44
- textures.forEach((texture) => {
45
- if (!(0, guards_1.isTexture)(texture) || !texture.getInternalTexture() || !texture.isReady()) {
46
- return;
47
- }
48
- texture.metadata ??= {};
49
- texture.metadata.editor ??= {
50
- ratio: 1,
51
- url: texture.getInternalTexture()?.url,
52
- };
53
- const url = texture.metadata.editor.url;
54
- if (!url) {
55
- return;
56
- }
57
- let ratio = texture.metadata.editor.ratio;
58
- if (isInFrustrum && ratio === 1) {
59
- return;
60
- }
61
- let split = url.split("/");
62
- const dirname = split.slice(0, -1).join("/");
63
- const basename = split[split.length - 1];
64
- split = basename.split(".");
65
- ratio *= (isInFrustrum ? 2 : 0.5);
66
- const width = texture.getBaseSize().width * ratio;
67
- const height = texture.getBaseSize().height * ratio;
68
- if (!isInFrustrum && (width <= 8 || height <= 8)) {
69
- return;
70
- }
71
- if (ratio === 1 && texture.getInternalTexture().url !== url) {
72
- texture.updateURL(url);
73
- }
74
- else if (ratio < 1) {
75
- const newUrl = `${dirname}/${split[0]}_${width}_${height}.${split[1]}`;
76
- texture.updateURL(newUrl);
77
- }
78
- texture.metadata.editor.ratio = ratio;
79
- });
80
- }
37
+ const extension = filename.split(".").pop();
38
+ const baseFilename = filename.replace(`.${extension}`, "");
39
+ const newFilename = `${baseFilename}${suffix}.${extension}`;
40
+ finalUrl.push(newFilename);
41
+ sourceProperty.name = finalUrl.join("/");
42
+ return textureParser(sourceProperty, scene, rootUrl);
43
+ };
81
44
  //# sourceMappingURL=texture.js.map
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.getPowerOfTwoUntil = void 0;
4
+ function getPowerOfTwoUntil(limit) {
5
+ let size = 1;
6
+ while (size <= limit) {
7
+ size <<= 1;
8
+ }
9
+ return size >> 1;
10
+ }
11
+ exports.getPowerOfTwoUntil = getPowerOfTwoUntil;
12
+ //# sourceMappingURL=scalar.js.map
@@ -1,5 +1,4 @@
1
1
  export * from "./loader";
2
- export * from "./texture";
3
2
  export * from "./rendering/ssao";
4
3
  export * from "./rendering/ssr";
5
4
  export * from "./rendering/motion-blur";
@@ -0,0 +1,3 @@
1
+ import { Scene } from "@babylonjs/core/scene";
2
+ export declare function configureShadowMapRenderListPredicate(scene: Scene): void;
3
+ export declare function configureShadowMapRefreshRate(scene: Scene): Promise<void>;
@@ -1,9 +1,31 @@
1
1
  import { Scene } from "@babylonjs/core/scene";
2
+ import "./texture";
3
+ /**
4
+ * Defines the possible output type of a script.
5
+ * `default` is a class that will be instantiated with the object as parameter.
6
+ * `onStart` is a function that will be called once before the first render passing the reference to the object the script is attached to.
7
+ * `onUpdate` is a function that will be called every frame passing the reference to the object the script is attached to
8
+ */
2
9
  export type ScriptMap = Record<string, {
3
10
  default?: new (object: any) => {
4
11
  onStart?(): void;
5
12
  onUpdate?(): void;
6
13
  };
14
+ onStart?: (object: any) => void;
15
+ onUpdate?: (object: any) => void;
7
16
  }>;
8
- export declare function loadScene(rootUrl: string, sceneFilename: string, scene: Scene, scriptsMap: ScriptMap): Promise<void>;
17
+ /**
18
+ * Defines the overall desired quality of the scene.
19
+ * In other words, defines the quality of textures that will be loaded in terms of dimensions.
20
+ * The editor computes automatic "hight (untouched)", "medium (half)", and "low (quarter)" quality levels for textures.
21
+ * Using "medium" or "low" quality levels will reduce the memory usage and improve the performance of the scene
22
+ * especially on mobiles where memory is limited.
23
+ */
24
+ export type SceneLoaderQualitySelector = "low" | "medium" | "high";
25
+ declare module "@babylonjs/core/scene" {
26
+ interface Scene {
27
+ loadingQuality: SceneLoaderQualitySelector;
28
+ }
29
+ }
30
+ export declare function loadScene(rootUrl: string, sceneFilename: string, scene: Scene, scriptsMap: ScriptMap, quality?: SceneLoaderQualitySelector): Promise<void>;
9
31
  export declare function loadScriptsFor(scene: Scene, object: any, scriptsMap: ScriptMap): void;
@@ -1,2 +1 @@
1
- import { Scene } from "@babylonjs/core/scene";
2
- export declare function startTextureOptimizer(scene: Scene): void;
1
+ export {};
@@ -0,0 +1 @@
1
+ export declare function getPowerOfTwoUntil(limit: number): number;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "babylonjs-editor-tools",
3
- "version": "0.0.3",
3
+ "version": "0.0.5",
4
4
  "description": "Babylon.js Editor Tools is a set of tools to help you create, edit and manage your Babylon.js scenes made using the Babylon.JS Editor",
5
5
  "productName": "Babylon.js Editor Tools",
6
6
  "scripts": {
@@ -1,98 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseDefaultRenderingPipeline = exports.serializeDefaultRenderingPipeline = exports.createDefaultRenderingPipeline = exports.disposeDefaultRenderingPipeline = exports.getDefaultRenderingPipeline = void 0;
4
- const defaultRenderingPipeline_1 = require("@babylonjs/core/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline");
5
- let defaultRenderingPipeline = null;
6
- /**
7
- * Returns the reference to the default rendering pipeline if exists.
8
- */
9
- function getDefaultRenderingPipeline() {
10
- return defaultRenderingPipeline;
11
- }
12
- exports.getDefaultRenderingPipeline = getDefaultRenderingPipeline;
13
- function disposeDefaultRenderingPipeline() {
14
- if (defaultRenderingPipeline) {
15
- defaultRenderingPipeline.dispose();
16
- defaultRenderingPipeline = null;
17
- }
18
- }
19
- exports.disposeDefaultRenderingPipeline = disposeDefaultRenderingPipeline;
20
- function createDefaultRenderingPipeline(scene, camera) {
21
- defaultRenderingPipeline = new defaultRenderingPipeline_1.DefaultRenderingPipeline("DefaultRenderingPipeline", true, scene, [camera]);
22
- defaultRenderingPipeline.samples = 4;
23
- defaultRenderingPipeline.depthOfField.lensSize = 512;
24
- defaultRenderingPipeline.depthOfField.fStop = 0.25;
25
- defaultRenderingPipeline.depthOfField.focusDistance = 55_000;
26
- return defaultRenderingPipeline;
27
- }
28
- exports.createDefaultRenderingPipeline = createDefaultRenderingPipeline;
29
- function serializeDefaultRenderingPipeline() {
30
- if (!defaultRenderingPipeline) {
31
- return null;
32
- }
33
- return {
34
- samples: defaultRenderingPipeline.samples,
35
- fxaaEnabled: defaultRenderingPipeline.fxaaEnabled,
36
- imageProcessingEnabled: defaultRenderingPipeline.imageProcessingEnabled,
37
- exposure: defaultRenderingPipeline.imageProcessing?.exposure,
38
- contrast: defaultRenderingPipeline.imageProcessing?.contrast,
39
- fromLinearSpace: defaultRenderingPipeline.imageProcessing?.fromLinearSpace,
40
- toneMappingEnabled: defaultRenderingPipeline.imageProcessing?.toneMappingEnabled,
41
- toneMappingType: defaultRenderingPipeline.imageProcessing?.toneMappingType,
42
- ditheringEnabled: defaultRenderingPipeline.imageProcessing?.ditheringEnabled,
43
- ditheringIntensity: defaultRenderingPipeline.imageProcessing?.ditheringIntensity,
44
- bloomEnabled: defaultRenderingPipeline.bloomEnabled,
45
- bloomThreshold: defaultRenderingPipeline.bloomThreshold,
46
- bloomWeight: defaultRenderingPipeline.bloomWeight,
47
- bloomScale: defaultRenderingPipeline.bloomScale,
48
- bloomKernel: defaultRenderingPipeline.bloomKernel,
49
- sharpenEnabled: defaultRenderingPipeline.sharpenEnabled,
50
- sharpenEdgeAmount: defaultRenderingPipeline.sharpen.edgeAmount,
51
- sharpenColorAmount: defaultRenderingPipeline.sharpen.colorAmount,
52
- grainEnabled: defaultRenderingPipeline.grainEnabled,
53
- grainIntensity: defaultRenderingPipeline.grain.intensity,
54
- grainAnimated: defaultRenderingPipeline.grain.animated,
55
- depthOfFieldEnabled: defaultRenderingPipeline.depthOfFieldEnabled,
56
- depthOfFieldBlurLevel: defaultRenderingPipeline.depthOfFieldBlurLevel,
57
- lensSize: defaultRenderingPipeline.depthOfField.lensSize,
58
- fStop: defaultRenderingPipeline.depthOfField.fStop,
59
- focusDistance: defaultRenderingPipeline.depthOfField.focusDistance,
60
- focalLength: defaultRenderingPipeline.depthOfField.focalLength,
61
- };
62
- }
63
- exports.serializeDefaultRenderingPipeline = serializeDefaultRenderingPipeline;
64
- function parseDefaultRenderingPipeline(scene, camera, data) {
65
- const defaultRenderingPipeline = createDefaultRenderingPipeline(scene, camera);
66
- defaultRenderingPipeline.samples = data.samples;
67
- defaultRenderingPipeline.fxaaEnabled = data.fxaaEnabled;
68
- defaultRenderingPipeline.imageProcessingEnabled = data.imageProcessingEnabled;
69
- if (defaultRenderingPipeline.imageProcessing) {
70
- defaultRenderingPipeline.imageProcessing.exposure = data.exposure;
71
- defaultRenderingPipeline.imageProcessing.contrast = data.contrast;
72
- defaultRenderingPipeline.imageProcessing.fromLinearSpace = data.fromLinearSpace;
73
- defaultRenderingPipeline.imageProcessing.toneMappingEnabled = data.toneMappingEnabled;
74
- defaultRenderingPipeline.imageProcessing.toneMappingType = data.toneMappingType;
75
- defaultRenderingPipeline.imageProcessing.ditheringEnabled = data.ditheringEnabled;
76
- defaultRenderingPipeline.imageProcessing.ditheringIntensity = data.ditheringIntensity;
77
- }
78
- defaultRenderingPipeline.bloomEnabled = data.bloomEnabled;
79
- defaultRenderingPipeline.bloomThreshold = data.bloomThreshold;
80
- defaultRenderingPipeline.bloomWeight = data.bloomWeight;
81
- defaultRenderingPipeline.bloomScale = data.bloomScale;
82
- defaultRenderingPipeline.bloomKernel = data.bloomKernel;
83
- defaultRenderingPipeline.sharpenEnabled = data.sharpenEnabled;
84
- defaultRenderingPipeline.sharpen.edgeAmount = data.sharpenEdgeAmount;
85
- defaultRenderingPipeline.sharpen.colorAmount = data.sharpenColorAmount;
86
- defaultRenderingPipeline.grainEnabled = data.grainEnabled;
87
- defaultRenderingPipeline.grain.intensity = data.grainIntensity;
88
- defaultRenderingPipeline.grain.animated = data.grainAnimated;
89
- defaultRenderingPipeline.depthOfFieldEnabled = data.depthOfFieldEnabled;
90
- defaultRenderingPipeline.depthOfFieldBlurLevel = data.depthOfFieldBlurLevel;
91
- defaultRenderingPipeline.depthOfField.lensSize = data.lensSize;
92
- defaultRenderingPipeline.depthOfField.fStop = data.fStop;
93
- defaultRenderingPipeline.depthOfField.focusDistance = data.focusDistance;
94
- defaultRenderingPipeline.depthOfField.focalLength = data.focalLength;
95
- return defaultRenderingPipeline;
96
- }
97
- exports.parseDefaultRenderingPipeline = parseDefaultRenderingPipeline;
98
- //# sourceMappingURL=default.js.map
@@ -1,11 +0,0 @@
1
- import { Scene } from "@babylonjs/core/scene";
2
- import { Camera } from "@babylonjs/core/Cameras/camera";
3
- import { DefaultRenderingPipeline } from "@babylonjs/core/PostProcesses/RenderPipeline/Pipelines/defaultRenderingPipeline";
4
- /**
5
- * Returns the reference to the default rendering pipeline if exists.
6
- */
7
- export declare function getDefaultRenderingPipeline(): DefaultRenderingPipeline | null;
8
- export declare function disposeDefaultRenderingPipeline(): void;
9
- export declare function createDefaultRenderingPipeline(scene: Scene, camera: Camera): DefaultRenderingPipeline;
10
- export declare function serializeDefaultRenderingPipeline(): any;
11
- export declare function parseDefaultRenderingPipeline(scene: Scene, camera: Camera, data: any): DefaultRenderingPipeline;