@archvisioninc/canvas 3.2.8 → 3.3.1
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/enums/exclusions.js +1 -1
- package/dist/helpers/canvasUpdateHelpers.js +12 -1
- package/dist/helpers/gizmoHelpers.js +1 -0
- package/dist/helpers/initHelpers.js +17 -2
- package/package.json +6 -6
- package/src/package/enums/exclusions.js +2 -0
- package/src/package/helpers/canvasUpdateHelpers.js +13 -0
- package/src/package/helpers/gizmoHelpers.js +1 -0
- package/src/package/helpers/initHelpers.js +22 -1
- package/src/package/helpers/utilityHelpers.js +4 -2
- package/src/scenes/App/App.js +26 -8
package/dist/enums/exclusions.js
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export const exclusionMaterials = ['colorShader', 'default material', 'gridMat', 'ground', 'skyBox', 'boundingMaterial'];
|
|
1
|
+
export const exclusionMaterials = ['colorShader', 'default material', 'gridMat', 'ground', 'skyBox', 'boundingMaterial', 'voxelization', 'voxelSlabDebug'];
|
|
2
2
|
export const exclusionMeshes = ['xAxisMesh', 'yAxisMesh', 'zAxisMesh', 'mirrorGround', 'ground', 'hdrSkyBox', 'boundingMesh', 'lengthContainer', 'widthContainer', 'heightContainer'];
|
|
3
3
|
export const exclusionGUIs = ['guiDragSelectBox', 'lengthRectangle', 'lengthLabel', 'lengthContainer', 'widthRectangle', 'widthLabel', 'widthContainer', 'heightRectangle', 'heightLabel', 'heightContainer'];
|
|
4
4
|
export const exclusionTNodes = ['xAxis', 'yAxis', 'zAxis', 'multiMeshTransforms', 'singleMeshTransforms'];
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/* eslint-disable */
|
|
2
|
-
import { getUserMeshes, resetSelectedMeshes, addNewMesh, scene, mirrorGround, ground, newVector, newColor, newScreenshot, serializeScene, newMetaDataEntry, selectedMeshes, singleMeshTNode, toRadians, toDegrees, multiMeshTNode, handleMousePointerTap, prepareCamera, buildMaterialsArray, buildMeshPositionsArray, createBoundingMesh, attachToSelectMeshesNode, newTexture, getUserMaterials, buildSelectedMaterialArray, buildMeshIdArray, refreshHighlight, guiTexture, getBoundingMeshData, getScaleFactor, gizmoManager, buildLightsArray } from '../helpers';
|
|
2
|
+
import { getUserMeshes, resetSelectedMeshes, addNewMesh, scene, mirrorGround, ground, newVector, newColor, newScreenshot, serializeScene, newMetaDataEntry, selectedMeshes, singleMeshTNode, toRadians, toDegrees, multiMeshTNode, handleMousePointerTap, prepareCamera, buildMaterialsArray, buildMeshPositionsArray, createBoundingMesh, attachToSelectMeshesNode, newTexture, getUserMaterials, buildSelectedMaterialArray, buildMeshIdArray, refreshHighlight, guiTexture, getBoundingMeshData, getScaleFactor, gizmoManager, iblShadowPipeline, buildLightsArray } from '../helpers';
|
|
3
3
|
import { toggleSafeFrame, toggleOrthographicViews, toggleBoundingBoxWidget, resetManagerGizmos, modelToOrigin, focusCamera } from '../actions';
|
|
4
4
|
import { GLTF2 } from 'babylonjs-loaders';
|
|
5
5
|
import { GIZMOS, TRANSPARENCY_MODES, GUI } from '../constants';
|
|
@@ -314,6 +314,10 @@ export const updateMaterial = inboundData => {
|
|
|
314
314
|
if (newId) {
|
|
315
315
|
material.id = newId;
|
|
316
316
|
material.name = newId;
|
|
317
|
+
if (Array.isArray(scene.metadata.selectedMaterials) && scene.metadata.selectedMaterials.length > 0) {
|
|
318
|
+
// We currently only support one selectedMaterial at a time so we should set the changed material to selected
|
|
319
|
+
scene.metadata.selectedMaterials = [material];
|
|
320
|
+
}
|
|
317
321
|
}
|
|
318
322
|
|
|
319
323
|
// Select all meshes with current material.
|
|
@@ -1051,6 +1055,7 @@ export const updateViewport = inboundData => {
|
|
|
1051
1055
|
const {
|
|
1052
1056
|
envVisible,
|
|
1053
1057
|
shadows,
|
|
1058
|
+
iblPipeline,
|
|
1054
1059
|
axes,
|
|
1055
1060
|
grid,
|
|
1056
1061
|
hideSelected,
|
|
@@ -1115,6 +1120,12 @@ export const updateViewport = inboundData => {
|
|
|
1115
1120
|
zAxisMesh.setEnabled(axes);
|
|
1116
1121
|
newMetaDataEntry('viewportAxes', axes);
|
|
1117
1122
|
}
|
|
1123
|
+
|
|
1124
|
+
// IBL Shadow Rendering Pipeline
|
|
1125
|
+
if (iblPipeline !== undefined) {
|
|
1126
|
+
iblShadowPipeline.toggleShadow(iblPipeline);
|
|
1127
|
+
newMetaDataEntry('iblShadowPipelineEnabled', iblPipeline);
|
|
1128
|
+
}
|
|
1118
1129
|
};
|
|
1119
1130
|
export const updatePublish = inboundData => {
|
|
1120
1131
|
const {
|
|
@@ -110,6 +110,7 @@ export const createBoundingMesh = () => {
|
|
|
110
110
|
boundingMesh.material = boundingRectMaterial;
|
|
111
111
|
boundingMesh.position = nodeLocation || newVector(1, 1, 1);
|
|
112
112
|
boundingMesh.isPickable = false;
|
|
113
|
+
boundingMesh.visibility = 0;
|
|
113
114
|
addHighlightExclusion(boundingMesh);
|
|
114
115
|
return boundingMesh;
|
|
115
116
|
};
|
|
@@ -2,8 +2,8 @@ import * as BABYLON from 'babylonjs';
|
|
|
2
2
|
import * as MATERIALS from 'babylonjs-materials';
|
|
3
3
|
import * as BABYLONGUI from 'babylonjs-gui';
|
|
4
4
|
import { LISTENERS, LIGHTS, CAMERAS, VIEWPORT } from '../constants';
|
|
5
|
-
import { shortcuts, ratios, downscaling } from '../enums';
|
|
6
|
-
import { newScene, newEngine, newCamera, newLight, newVector, newHighlightManager, handleMouseListeners, handleShortcutListeners, prepareCamera, newGround, newGridMaterial, newColor, setDefaultGridProperties, prepareAxes, getBoundingDistance, newGizmoManager, getUserMeshes, newPBRMaterial, createSafeFrame, createDragSelectBox, addInitialGizmoBehaviors, loadFromBlob, loadFromGuidURL, prepareMaterialCamera, loadFromDragDrop, addHighlightExclusion, warningChecks, toRadians, toDegrees, getStatisticsMetadata, newMetaDataEntry, serializeScene, buildMeshPositionsArray, buildMaterialsArray, updatePublish, buildSelectedMaterialArray, buildMaterialVariantsArray, removeAutoRotation, getUserNodes, buildLightsArray } from '../helpers';
|
|
5
|
+
import { shortcuts, ratios, downscaling, exclusionMeshes, exclusionMaterials } from '../enums';
|
|
6
|
+
import { newScene, newEngine, newCamera, newLight, newVector, newHighlightManager, handleMouseListeners, handleShortcutListeners, prepareCamera, newGround, newGridMaterial, newColor, setDefaultGridProperties, prepareAxes, getBoundingDistance, newGizmoManager, getUserMeshes, getUserMaterials, newPBRMaterial, createSafeFrame, createDragSelectBox, addInitialGizmoBehaviors, loadFromBlob, loadFromGuidURL, prepareMaterialCamera, loadFromDragDrop, addHighlightExclusion, warningChecks, toRadians, toDegrees, getStatisticsMetadata, newMetaDataEntry, serializeScene, buildMeshPositionsArray, buildMaterialsArray, updatePublish, buildSelectedMaterialArray, buildMaterialVariantsArray, removeAutoRotation, getUserNodes, buildLightsArray } from '../helpers';
|
|
7
7
|
import { modelToOrigin, focusCamera } from '../actions';
|
|
8
8
|
import { reactProps as props } from '../Canvas';
|
|
9
9
|
import _ from 'lodash';
|
|
@@ -26,6 +26,7 @@ export let guiTexture;
|
|
|
26
26
|
export let multiMeshTNode;
|
|
27
27
|
export let singleMeshTNode;
|
|
28
28
|
export let dragDropFileInput;
|
|
29
|
+
export let iblShadowPipeline;
|
|
29
30
|
export let shortcutArray = [];
|
|
30
31
|
export const groundOptions = () => {
|
|
31
32
|
const meshSize = getBoundingDistance() || 10;
|
|
@@ -176,6 +177,19 @@ const initLights = () => {
|
|
|
176
177
|
shadowGenerator.contactHardeningLightSizeUVRatio = 0.2;
|
|
177
178
|
shadowGenerator.bias = 0.00001;
|
|
178
179
|
shadowGenerator.normalBias = 0.01;
|
|
180
|
+
iblShadowPipeline = new BABYLON.IblShadowsRenderPipeline('archvision_ibl_shadows', scene);
|
|
181
|
+
meshes.forEach(mesh => iblShadowPipeline.addShadowCastingMesh(mesh));
|
|
182
|
+
const materials = getUserMaterials();
|
|
183
|
+
materials.forEach(mat => iblShadowPipeline.addShadowReceivingMaterial(mat));
|
|
184
|
+
exclusionMeshes.forEach(name => {
|
|
185
|
+
const mesh = scene.getMeshByName(name);
|
|
186
|
+
iblShadowPipeline.removeShadowCastingMesh(mesh);
|
|
187
|
+
});
|
|
188
|
+
exclusionMaterials.forEach(name => {
|
|
189
|
+
const mat = scene.getMaterialByName(name);
|
|
190
|
+
iblShadowPipeline.removeShadowReceivingMaterial(mat);
|
|
191
|
+
});
|
|
192
|
+
iblShadowPipeline.toggleShadow(false);
|
|
179
193
|
};
|
|
180
194
|
const initGridGround = () => {
|
|
181
195
|
const gridMaterial = newGridMaterial('gridMat');
|
|
@@ -326,6 +340,7 @@ const initMetadataKeyDefaults = () => {
|
|
|
326
340
|
newMetaDataEntry('viewportGround', true);
|
|
327
341
|
newMetaDataEntry('viewportAxes', true);
|
|
328
342
|
newMetaDataEntry('viewportShadows', mirrorGround.receiveShadows);
|
|
343
|
+
newMetaDataEntry('iblShadowPipelineEnabled', false);
|
|
329
344
|
newMetaDataEntry('fileName', null);
|
|
330
345
|
newMetaDataEntry('uvScaleLock', false);
|
|
331
346
|
newMetaDataEntry('lights', []);
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@archvisioninc/canvas",
|
|
3
|
-
"version": "3.
|
|
3
|
+
"version": "3.3.1",
|
|
4
4
|
"private": false,
|
|
5
5
|
"main": "dist/Canvas.js",
|
|
6
6
|
"module": "dist/Canvas.js",
|
|
@@ -42,11 +42,11 @@
|
|
|
42
42
|
"@testing-library/user-event": "^13.5.0",
|
|
43
43
|
"@typescript-eslint/eslint-plugin": "^5.48.0",
|
|
44
44
|
"axios": "^1.2.0",
|
|
45
|
-
"babylonjs": "^
|
|
46
|
-
"babylonjs-gui": "^
|
|
47
|
-
"babylonjs-loaders": "^
|
|
48
|
-
"babylonjs-materials": "^
|
|
49
|
-
"babylonjs-serializers": "^
|
|
45
|
+
"babylonjs": "^7.41.0",
|
|
46
|
+
"babylonjs-gui": "^7.41.0",
|
|
47
|
+
"babylonjs-loaders": "^7.41.0",
|
|
48
|
+
"babylonjs-materials": "^7.41.0",
|
|
49
|
+
"babylonjs-serializers": "^7.41.0",
|
|
50
50
|
"eslint-plugin-destructuring": "^2.2.1",
|
|
51
51
|
"eslint-plugin-etc": "^2.0.2",
|
|
52
52
|
"eslint-plugin-no-inline-styles": "^1.0.5",
|
|
@@ -31,6 +31,7 @@ import {
|
|
|
31
31
|
getBoundingMeshData,
|
|
32
32
|
getScaleFactor,
|
|
33
33
|
gizmoManager,
|
|
34
|
+
iblShadowPipeline,
|
|
34
35
|
buildLightsArray,
|
|
35
36
|
} from '../helpers';
|
|
36
37
|
import {
|
|
@@ -373,6 +374,11 @@ export const updateMaterial = inboundData => {
|
|
|
373
374
|
if (newId) {
|
|
374
375
|
material.id = newId;
|
|
375
376
|
material.name = newId;
|
|
377
|
+
|
|
378
|
+
if (Array.isArray(scene.metadata.selectedMaterials) && scene.metadata.selectedMaterials.length > 0) {
|
|
379
|
+
// We currently only support one selectedMaterial at a time so we should set the changed material to selected
|
|
380
|
+
scene.metadata.selectedMaterials = [ material ];
|
|
381
|
+
}
|
|
376
382
|
}
|
|
377
383
|
|
|
378
384
|
// Select all meshes with current material.
|
|
@@ -1058,6 +1064,7 @@ export const updateViewport = inboundData => {
|
|
|
1058
1064
|
const {
|
|
1059
1065
|
envVisible,
|
|
1060
1066
|
shadows,
|
|
1067
|
+
iblPipeline,
|
|
1061
1068
|
axes,
|
|
1062
1069
|
grid,
|
|
1063
1070
|
hideSelected,
|
|
@@ -1124,6 +1131,12 @@ export const updateViewport = inboundData => {
|
|
|
1124
1131
|
zAxisMesh.setEnabled(axes);
|
|
1125
1132
|
newMetaDataEntry('viewportAxes', axes);
|
|
1126
1133
|
}
|
|
1134
|
+
|
|
1135
|
+
// IBL Shadow Rendering Pipeline
|
|
1136
|
+
if (iblPipeline !== undefined) {
|
|
1137
|
+
iblShadowPipeline.toggleShadow(iblPipeline);
|
|
1138
|
+
newMetaDataEntry('iblShadowPipelineEnabled', iblPipeline);
|
|
1139
|
+
}
|
|
1127
1140
|
};
|
|
1128
1141
|
|
|
1129
1142
|
export const updatePublish = inboundData => {
|
|
@@ -139,6 +139,7 @@ export const createBoundingMesh = () => {
|
|
|
139
139
|
boundingMesh.material = boundingRectMaterial;
|
|
140
140
|
boundingMesh.position = nodeLocation || newVector(1, 1, 1);
|
|
141
141
|
boundingMesh.isPickable = false;
|
|
142
|
+
boundingMesh.visibility = 0;
|
|
142
143
|
|
|
143
144
|
|
|
144
145
|
addHighlightExclusion(boundingMesh);
|
|
@@ -2,7 +2,7 @@ import * as BABYLON from 'babylonjs';
|
|
|
2
2
|
import * as MATERIALS from 'babylonjs-materials';
|
|
3
3
|
import * as BABYLONGUI from 'babylonjs-gui';
|
|
4
4
|
import { LISTENERS, LIGHTS, CAMERAS, VIEWPORT } from '../constants';
|
|
5
|
-
import { shortcuts, ratios, downscaling } from '../enums';
|
|
5
|
+
import { shortcuts, ratios, downscaling, exclusionMeshes, exclusionMaterials } from '../enums';
|
|
6
6
|
import {
|
|
7
7
|
newScene,
|
|
8
8
|
newEngine,
|
|
@@ -21,6 +21,7 @@ import {
|
|
|
21
21
|
getBoundingDistance,
|
|
22
22
|
newGizmoManager,
|
|
23
23
|
getUserMeshes,
|
|
24
|
+
getUserMaterials,
|
|
24
25
|
newPBRMaterial,
|
|
25
26
|
createSafeFrame,
|
|
26
27
|
createDragSelectBox,
|
|
@@ -69,6 +70,7 @@ export let guiTexture;
|
|
|
69
70
|
export let multiMeshTNode;
|
|
70
71
|
export let singleMeshTNode;
|
|
71
72
|
export let dragDropFileInput;
|
|
73
|
+
export let iblShadowPipeline;
|
|
72
74
|
export let shortcutArray = [];
|
|
73
75
|
|
|
74
76
|
export const groundOptions = () => {
|
|
@@ -223,6 +225,24 @@ const initLights = () => {
|
|
|
223
225
|
shadowGenerator.contactHardeningLightSizeUVRatio = 0.2;
|
|
224
226
|
shadowGenerator.bias = 0.00001;
|
|
225
227
|
shadowGenerator.normalBias = 0.01;
|
|
228
|
+
|
|
229
|
+
iblShadowPipeline = new BABYLON.IblShadowsRenderPipeline(
|
|
230
|
+
'archvision_ibl_shadows',
|
|
231
|
+
scene,
|
|
232
|
+
);
|
|
233
|
+
|
|
234
|
+
meshes.forEach(mesh => iblShadowPipeline.addShadowCastingMesh(mesh));
|
|
235
|
+
const materials = getUserMaterials();
|
|
236
|
+
materials.forEach(mat => iblShadowPipeline.addShadowReceivingMaterial(mat));
|
|
237
|
+
exclusionMeshes.forEach(name => {
|
|
238
|
+
const mesh = scene.getMeshByName(name);
|
|
239
|
+
iblShadowPipeline.removeShadowCastingMesh(mesh);
|
|
240
|
+
});
|
|
241
|
+
exclusionMaterials.forEach(name => {
|
|
242
|
+
const mat = scene.getMaterialByName(name);
|
|
243
|
+
iblShadowPipeline.removeShadowReceivingMaterial(mat);
|
|
244
|
+
});
|
|
245
|
+
iblShadowPipeline.toggleShadow(false);
|
|
226
246
|
};
|
|
227
247
|
|
|
228
248
|
const initGridGround = () => {
|
|
@@ -364,6 +384,7 @@ const initMetadataKeyDefaults = () => {
|
|
|
364
384
|
newMetaDataEntry('viewportGround', true);
|
|
365
385
|
newMetaDataEntry('viewportAxes', true);
|
|
366
386
|
newMetaDataEntry('viewportShadows', mirrorGround.receiveShadows);
|
|
387
|
+
newMetaDataEntry('iblShadowPipelineEnabled', false);
|
|
367
388
|
newMetaDataEntry('fileName', null);
|
|
368
389
|
newMetaDataEntry('uvScaleLock', false);
|
|
369
390
|
newMetaDataEntry('lights', []);
|
|
@@ -670,11 +670,13 @@ export const buildLightsArray = () => {
|
|
|
670
670
|
const lights = scene.lights;
|
|
671
671
|
return lights.map(light => {
|
|
672
672
|
const { position } = light;
|
|
673
|
-
const { x, y, z} = position;
|
|
673
|
+
const { x, y, z } = position;
|
|
674
674
|
return {
|
|
675
675
|
...light.serialize(),
|
|
676
676
|
rotation: light?.rotation ?? 0,
|
|
677
|
-
distance:
|
|
677
|
+
distance:
|
|
678
|
+
light?.distance ??
|
|
679
|
+
Math.sqrt(Math.pow(Math.abs(x), 2) + Math.pow(Math.abs(y), 2) + Math.pow(Math.abs(z), 2)),
|
|
678
680
|
};
|
|
679
681
|
});
|
|
680
682
|
};
|
package/src/scenes/App/App.js
CHANGED
|
@@ -1,13 +1,13 @@
|
|
|
1
|
-
/* eslint-disable
|
|
1
|
+
/* eslint-disable */
|
|
2
2
|
import { useEffect, useState, useCallback } from 'react';
|
|
3
3
|
import { Notifications } from 'components';
|
|
4
4
|
import { AppContainer, DebugButtons, Button } from './styles';
|
|
5
5
|
import { theme } from 'static/theme';
|
|
6
6
|
import { fetchDownloadURL } from 'helpers/fetchHelpers';
|
|
7
7
|
import { ENVIRONMENTS } from 'constants';
|
|
8
|
-
import { updateLighting } from 'package/helpers';
|
|
8
|
+
import { updateViewport, scene, updateLighting, updateMaterial } from 'package/helpers';
|
|
9
9
|
import Canvas from 'package/Canvas';
|
|
10
|
-
import _ from 'lodash';
|
|
10
|
+
import _, { update } from 'lodash';
|
|
11
11
|
|
|
12
12
|
const materialMode = false;
|
|
13
13
|
const previewMode = false;
|
|
@@ -76,7 +76,7 @@ const App = () => {
|
|
|
76
76
|
materialMode={materialMode}
|
|
77
77
|
previewMode={previewMode}
|
|
78
78
|
demoScene={demoScene}
|
|
79
|
-
integration={{}}
|
|
79
|
+
integration={{ shadows: true }}
|
|
80
80
|
file={null}
|
|
81
81
|
guidURL={previewURL}
|
|
82
82
|
updateData={null}
|
|
@@ -111,6 +111,23 @@ const App = () => {
|
|
|
111
111
|
Take screenshot
|
|
112
112
|
</Button>
|
|
113
113
|
|
|
114
|
+
<Button
|
|
115
|
+
theme={theme}
|
|
116
|
+
$selectedTheme={selectedTheme}
|
|
117
|
+
onClick={() => {
|
|
118
|
+
const inboundData = {
|
|
119
|
+
payload: {
|
|
120
|
+
iblPipeline: !scene.metadata.iblShadowPipelineEnabled,
|
|
121
|
+
}
|
|
122
|
+
};
|
|
123
|
+
|
|
124
|
+
updateViewport(inboundData);
|
|
125
|
+
//console.log({ metadata: scene.metadata });
|
|
126
|
+
}}
|
|
127
|
+
>
|
|
128
|
+
Toggle IBL
|
|
129
|
+
</Button>
|
|
130
|
+
|
|
114
131
|
<Button
|
|
115
132
|
theme={theme}
|
|
116
133
|
$selectedTheme={selectedTheme}
|
|
@@ -125,14 +142,15 @@ const App = () => {
|
|
|
125
142
|
onClick={() => {
|
|
126
143
|
const inboundData = {
|
|
127
144
|
payload: {
|
|
128
|
-
id: '
|
|
129
|
-
|
|
145
|
+
id: 'Body',
|
|
146
|
+
newId: 'test',
|
|
130
147
|
},
|
|
131
148
|
};
|
|
132
|
-
|
|
149
|
+
updateMaterial(inboundData);
|
|
150
|
+
console.log({ metadata: scene.metadata });
|
|
133
151
|
}}
|
|
134
152
|
>
|
|
135
|
-
Update
|
|
153
|
+
Update Body Material
|
|
136
154
|
</Button>
|
|
137
155
|
</DebugButtons>
|
|
138
156
|
</AppContainer>
|