abstract-3d 4.0.0-beta.8 → 4.0.0

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 (96) hide show
  1. package/README.md +2 -0
  2. package/lib/abstract-3d.d.ts +6 -1
  3. package/lib/abstract-3d.d.ts.map +1 -1
  4. package/lib/abstract-3d.js +24 -2
  5. package/lib/abstract-3d.js.map +1 -1
  6. package/lib/renderers/react/react.d.ts.map +1 -1
  7. package/lib/renderers/react/react.js +9 -3
  8. package/lib/renderers/react/react.js.map +1 -1
  9. package/lib/renderers/svg/index.d.ts +1 -1
  10. package/lib/renderers/svg/index.d.ts.map +1 -1
  11. package/lib/renderers/svg/svg-geometries/shared.d.ts +14 -2
  12. package/lib/renderers/svg/svg-geometries/shared.d.ts.map +1 -1
  13. package/lib/renderers/svg/svg-geometries/shared.js +15 -1
  14. package/lib/renderers/svg/svg-geometries/shared.js.map +1 -1
  15. package/lib/renderers/svg/svg-geometries/svg-box.d.ts.map +1 -1
  16. package/lib/renderers/svg/svg-geometries/svg-box.js +41 -30
  17. package/lib/renderers/svg/svg-geometries/svg-box.js.map +1 -1
  18. package/lib/renderers/svg/svg-geometries/svg-cone.d.ts.map +1 -1
  19. package/lib/renderers/svg/svg-geometries/svg-cone.js +3 -3
  20. package/lib/renderers/svg/svg-geometries/svg-cone.js.map +1 -1
  21. package/lib/renderers/svg/svg-geometries/svg-cylinder.d.ts.map +1 -1
  22. package/lib/renderers/svg/svg-geometries/svg-cylinder.js +18 -6
  23. package/lib/renderers/svg/svg-geometries/svg-cylinder.js.map +1 -1
  24. package/lib/renderers/svg/svg-geometries/svg-image.d.ts.map +1 -1
  25. package/lib/renderers/svg/svg-geometries/svg-image.js +3 -2
  26. package/lib/renderers/svg/svg-geometries/svg-image.js.map +1 -1
  27. package/lib/renderers/svg/svg-geometries/svg-line.d.ts.map +1 -1
  28. package/lib/renderers/svg/svg-geometries/svg-line.js +3 -1
  29. package/lib/renderers/svg/svg-geometries/svg-line.js.map +1 -1
  30. package/lib/renderers/svg/svg-geometries/svg-plane.d.ts.map +1 -1
  31. package/lib/renderers/svg/svg-geometries/svg-plane.js +4 -2
  32. package/lib/renderers/svg/svg-geometries/svg-plane.js.map +1 -1
  33. package/lib/renderers/svg/svg-geometries/svg-polygon.d.ts.map +1 -1
  34. package/lib/renderers/svg/svg-geometries/svg-polygon.js +4 -2
  35. package/lib/renderers/svg/svg-geometries/svg-polygon.js.map +1 -1
  36. package/lib/renderers/svg/svg-geometries/svg-shape.d.ts.map +1 -1
  37. package/lib/renderers/svg/svg-geometries/svg-shape.js +4 -2
  38. package/lib/renderers/svg/svg-geometries/svg-shape.js.map +1 -1
  39. package/lib/renderers/svg/svg-geometries/svg-text.js +1 -1
  40. package/lib/renderers/svg/svg-geometries/svg-text.js.map +1 -1
  41. package/lib/renderers/svg/svg-order.d.ts +9 -0
  42. package/lib/renderers/svg/svg-order.d.ts.map +1 -0
  43. package/lib/renderers/svg/svg-order.js +148 -0
  44. package/lib/renderers/svg/svg-order.js.map +1 -0
  45. package/lib/renderers/svg/svg.d.ts.map +1 -1
  46. package/lib/renderers/svg/svg.js +13 -9
  47. package/lib/renderers/svg/svg.js.map +1 -1
  48. package/lib/renderers/three/build/build.d.ts +2 -0
  49. package/lib/renderers/three/build/build.d.ts.map +1 -1
  50. package/lib/renderers/three/build/build.js +1 -1
  51. package/lib/renderers/three/build/build.js.map +1 -1
  52. package/lib/renderers/three/build/materials.d.ts +5 -1
  53. package/lib/renderers/three/build/materials.d.ts.map +1 -1
  54. package/lib/renderers/three/build/materials.js +53 -17
  55. package/lib/renderers/three/build/materials.js.map +1 -1
  56. package/lib/renderers/three/environment/studio.d.ts +3 -2
  57. package/lib/renderers/three/environment/studio.d.ts.map +1 -1
  58. package/lib/renderers/three/environment/studio.js +4 -3
  59. package/lib/renderers/three/environment/studio.js.map +1 -1
  60. package/lib/renderers/three/geometry/geometry.d.ts.map +1 -1
  61. package/lib/renderers/three/geometry/geometry.js +11 -5
  62. package/lib/renderers/three/geometry/geometry.js.map +1 -1
  63. package/lib/renderers/three/shadow/key-light.js +1 -1
  64. package/lib/renderers/three/viewer/options.d.ts +7 -1
  65. package/lib/renderers/three/viewer/options.d.ts.map +1 -1
  66. package/lib/renderers/three/viewer/options.js +1 -0
  67. package/lib/renderers/three/viewer/options.js.map +1 -1
  68. package/lib/renderers/three/viewer/viewer.d.ts +5 -0
  69. package/lib/renderers/three/viewer/viewer.d.ts.map +1 -1
  70. package/lib/renderers/three/viewer/viewer.js +54 -11
  71. package/lib/renderers/three/viewer/viewer.js.map +1 -1
  72. package/package.json +1 -1
  73. package/src/abstract-3d.ts +30 -2
  74. package/src/renderers/react/react.tsx +14 -4
  75. package/src/renderers/svg/index.ts +1 -1
  76. package/src/renderers/svg/svg-geometries/shared.ts +26 -3
  77. package/src/renderers/svg/svg-geometries/svg-box.ts +42 -36
  78. package/src/renderers/svg/svg-geometries/svg-cone.ts +17 -3
  79. package/src/renderers/svg/svg-geometries/svg-cylinder.ts +25 -6
  80. package/src/renderers/svg/svg-geometries/svg-image.ts +3 -2
  81. package/src/renderers/svg/svg-geometries/svg-line.ts +3 -1
  82. package/src/renderers/svg/svg-geometries/svg-plane.ts +9 -2
  83. package/src/renderers/svg/svg-geometries/svg-polygon.ts +9 -2
  84. package/src/renderers/svg/svg-geometries/svg-shape.ts +9 -2
  85. package/src/renderers/svg/svg-geometries/svg-text.ts +1 -1
  86. package/src/renderers/svg/svg-order.test.ts +35 -0
  87. package/src/renderers/svg/svg-order.ts +172 -0
  88. package/src/renderers/svg/svg.ts +13 -9
  89. package/src/renderers/three/build/build.ts +3 -1
  90. package/src/renderers/three/build/materials.ts +57 -17
  91. package/src/renderers/three/environment/studio.ts +4 -3
  92. package/src/renderers/three/geometry/geometry.test.ts +17 -5
  93. package/src/renderers/three/geometry/geometry.ts +12 -5
  94. package/src/renderers/three/shadow/key-light.ts +1 -1
  95. package/src/renderers/three/viewer/options.ts +8 -1
  96. package/src/renderers/three/viewer/viewer.ts +57 -10
@@ -21,29 +21,38 @@ import { ERROR_IMG_KEY } from "../appearance/appearance.js";
21
21
 
22
22
  /** White materials, colored per instance, for each material class; images' materials and textures */
23
23
 
24
- export function createClassMaterial(c: MaterialClass): Material {
24
+ /**
25
+ * Without reflections, i.e. without the studio, metals keep at most a little metalness, satin from the lights' highlights, as they'd be black, having
26
+ * almost no diffuse light
27
+ */
28
+ export function createClassMaterial(c: MaterialClass, reflections: boolean): Material {
25
29
  const side = c.side === "front" ? FrontSide : c.side === "back" ? BackSide : DoubleSide;
26
30
  const common = { side, transparent: c.transparent, depthWrite: !c.transparent };
27
31
  if (!c.lit) {
28
32
  return new MeshBasicMaterial(common);
29
33
  }
34
+ const metalness = c.type ? (finishes[c.type].metalness ?? 0) : c.metalness;
30
35
  const material = c.type
31
- ? new MeshPhysicalMaterial({ ...common, ...finishes[c.type] })
32
- : new MeshStandardMaterial({ ...common, metalness: c.metalness, roughness: c.roughness });
36
+ ? new MeshPhysicalMaterial({ ...common, ...finishes[c.type], metalness: reflections ? metalness : Math.min(metalness, plainMetalness) })
37
+ : new MeshStandardMaterial({ ...common, metalness: reflections ? metalness : Math.min(metalness, plainMetalness), roughness: c.roughness });
33
38
  return Object.assign(material, { onBeforeCompile: roundEdges });
34
39
  }
35
40
 
41
+ /** The most metalness without reflections */
42
+ const plainMetalness = 0.4;
43
+
36
44
  /**
37
- * The physical finish of each type of surface, in the material's color: metals reflect their color, brighter than physical, as product renders light
38
- * metals, since the studio around them is dark; the others are dielectrics with a white reflection; painted sheet has a light clearcoat, fabric a
39
- * soft sheen. Glass is a thin, smooth, mostly see-through surface, not refracting, which would render the scene once more each frame
45
+ * The physical finish of each type of surface, in the material's color: metals reflect their color; galvanized and aluminum sheet keep some of their
46
+ * color diffuse, so faces that mirror the studio's dark surroundings aren't black; the others are dielectrics with a white reflection; painted sheet
47
+ * has a light clearcoat, fabric a soft sheen. Glass is a thin, smooth, mostly see-through surface, not refracting, which would render the scene once
48
+ * more each frame
40
49
  */
41
50
  const finishes: Record<MaterialType, MeshPhysicalMaterialParameters> = {
42
51
  painted: { metalness: 0, roughness: 0.45, clearcoat: 0.3, clearcoatRoughness: 0.25 },
43
- galvanized: { metalness: 0.85, roughness: 0.55, envMapIntensity: 1.2 },
44
- aluminum: { metalness: 0.9, roughness: 0.4, envMapIntensity: 1.2 },
45
- stainless: { metalness: 1, roughness: 0.25, envMapIntensity: 1.2 },
46
- copper: { metalness: 1, roughness: 0.3, envMapIntensity: 1.2 },
52
+ galvanized: { metalness: 0.6, roughness: 0.6 },
53
+ aluminum: { metalness: 0.7, roughness: 0.45 },
54
+ stainless: { metalness: 1, roughness: 0.3 },
55
+ copper: { metalness: 1, roughness: 0.35 },
47
56
  plastic: { metalness: 0, roughness: 0.55 },
48
57
  rubber: { metalness: 0, roughness: 0.9 },
49
58
  fabric: { metalness: 0, roughness: 1, sheen: 1, sheenRoughness: 0.8, sheenColor: 0x888888 },
@@ -53,15 +62,17 @@ const finishes: Record<MaterialType, MeshPhysicalMaterialParameters> = {
53
62
  /**
54
63
  * Shades the edges of boxes with a radius as rounded by it, so they catch light and reflections: the normal of a rounded box of the same size, from
55
64
  * the signed distance function of a rounded box (Inigo Quilez's sdRoundBox), is used at each point of the sharp one. No extra geometry, and the
56
- * radius stays the same along every edge, as boxes are one unit cube scaled to their size. Only the outline stays sharp
65
+ * radius stays the same along every edge, as boxes are one unit cube scaled to their size. Only the box's rounded edges bend; the outline stays
66
+ * sharp
57
67
  */
58
68
  function roundEdges(shader: { vertexShader: string; fragmentShader: string }): void {
59
69
  shader.vertexShader = shader.vertexShader
60
70
  .replace(
61
71
  "#include <common>",
62
72
  `#include <common>
63
- attribute float bevel;
73
+ attribute vec2 bevel;
64
74
  varying float vBevel;
75
+ flat varying int vEdges;
65
76
  varying vec3 vBoxPoint;
66
77
  varying vec3 vBoxHalf;
67
78
  varying mat3 vBoxRotation;`
@@ -78,7 +89,8 @@ varying mat3 vBoxRotation;`
78
89
  #endif
79
90
  // From the box's own axes to view space, where the fragment shader's normal is
80
91
  vBoxRotation = normalMatrix * boxRotation;
81
- vBevel = bevel;
92
+ vBevel = bevel.x;
93
+ vEdges = int( bevel.y );
82
94
  vBoxHalf = boxSize * 0.5;
83
95
  vBoxPoint = position * boxSize;`
84
96
  );
@@ -87,6 +99,7 @@ varying mat3 vBoxRotation;`
87
99
  "#include <common>",
88
100
  `#include <common>
89
101
  varying float vBevel;
102
+ flat varying int vEdges;
90
103
  varying vec3 vBoxPoint;
91
104
  varying vec3 vBoxHalf;
92
105
  varying mat3 vBoxRotation;`
@@ -94,15 +107,42 @@ varying mat3 vBoxRotation;`
94
107
  .replace(
95
108
  "#include <normal_fragment_maps>",
96
109
  `#include <normal_fragment_maps>
110
+ float edgeShade = 1.0;
97
111
  if ( vBevel > 0.0 ) {
98
- // At least 2 pixels wide, so a rounded edge far away is a soft line instead of a jagged sub-pixel highlight, and at most half the box
112
+ // At least 2 pixels wide, so a rounded edge far away is a soft line instead of a jagged sub-pixel highlight, and at most half the box; a radius
113
+ // smaller than that bends the normal only partly, so far edges don't catch more light than their size
99
114
  vec3 pixel = fwidth( vBoxPoint );
100
- float radius = min( max( vBevel, 2.0 * max( pixel.x, max( pixel.y, pixel.z ) ) ), min( vBoxHalf.x, min( vBoxHalf.y, vBoxHalf.z ) ) );
101
- vec3 rounded = sign( vBoxPoint ) * max( abs( vBoxPoint ) - ( vBoxHalf - radius ), 0.0 );
115
+ float minRadius = 2.0 * max( pixel.x, max( pixel.y, pixel.z ) );
116
+ float radius = min( max( vBevel, minRadius ), min( vBoxHalf.x, min( vBoxHalf.y, vBoxHalf.z ) ) );
117
+ float bend = min( vBevel / minRadius, 1.0 );
118
+ vec3 near = max( abs( vBoxPoint ) - ( vBoxHalf - radius ), 0.0 );
119
+ // Whether the edge along x, y and z here is rounded, its bit by which sides it's between, as boxEdges orders them
120
+ ivec3 high = ivec3( greaterThan( vBoxPoint, vec3( 0.0 ) ) );
121
+ bvec3 edge = notEqual( ( ivec3( vEdges ) >> ( ivec3( 0, 4, 8 ) + high.yxx + 2 * high.zzy ) ) & 1, ivec3( 0 ) );
122
+ // An axis bends where the edge between its side and another side near the point is rounded
123
+ vec3 bends = vec3(
124
+ ( edge.z && near.y > 0.0 ) || ( edge.y && near.z > 0.0 ),
125
+ ( edge.z && near.x > 0.0 ) || ( edge.x && near.z > 0.0 ),
126
+ ( edge.y && near.x > 0.0 ) || ( edge.x && near.y > 0.0 )
127
+ );
128
+ vec3 rounded = sign( vBoxPoint ) * near * bends;
102
129
  if ( dot( rounded, rounded ) > 0.0 ) {
103
- normal = normalize( vBoxRotation * normalize( rounded ) ) * faceDirection;
130
+ normal = normalize( mix( normal, normalize( vBoxRotation * normalize( rounded ) ) * faceDirection, bend ) );
104
131
  }
132
+ // Light doesn't reach into the groove where rounded edges meet, so parts show where they start and end, also far away: how far into the edge
133
+ // a point is, from the face to its outermost line, is the bend of the axes other than the face's, which is bent by the whole radius
134
+ vec3 bent = abs( rounded );
135
+ float depth = min( ( bent.x + bent.y + bent.z - max( bent.x, max( bent.y, bent.z ) ) ) / radius, 1.0 );
136
+ edgeShade = 1.0 - 0.4 * depth * depth;
105
137
  }`
138
+ )
139
+ .replace(
140
+ "#include <aomap_fragment>",
141
+ `#include <aomap_fragment>
142
+ reflectedLight.directDiffuse *= edgeShade;
143
+ reflectedLight.directSpecular *= edgeShade;
144
+ reflectedLight.indirectDiffuse *= edgeShade;
145
+ reflectedLight.indirectSpecular *= edgeShade;`
106
146
  )
107
147
  .replace(
108
148
  "#include <clearcoat_normal_fragment_maps>",