Skip to content

Commit b9440bb

Browse files
authored
QuantizedMeshPlugin: Add "generateNormals" option (#1401)
* Generate normals if not present * README
1 parent 925a853 commit b9440bb

File tree

3 files changed

+40
-4
lines changed

3 files changed

+40
-4
lines changed

src/three/plugins/QuantizedMeshPlugin.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ export class QuantizedMeshPlugin {
8484
useRecommendedSettings = true,
8585
skirtLength = null,
8686
smoothSkirtNormals = true,
87+
generateNormals = true,
8788
solid = false,
8889
} = options;
8990

@@ -98,6 +99,7 @@ export class QuantizedMeshPlugin {
9899
this.skirtLength = skirtLength;
99100
this.smoothSkirtNormals = smoothSkirtNormals;
100101
this.solid = solid;
102+
this.generateNormals = generateNormals;
101103
this.attribution = null;
102104

103105
this.tiling = new TilingScheme();
@@ -222,6 +224,7 @@ export class QuantizedMeshPlugin {
222224
skirtLength,
223225
solid,
224226
smoothSkirtNormals,
227+
generateNormals,
225228
tiles,
226229
} = this;
227230

@@ -258,6 +261,7 @@ export class QuantizedMeshPlugin {
258261
loader.ellipsoid.copy( ellipsoid );
259262
loader.solid = solid;
260263
loader.smoothSkirtNormals = smoothSkirtNormals;
264+
loader.generateNormals = generateNormals;
261265
loader.skirtLength = skirtLength === null ? tile.geometricError : skirtLength;
262266

263267
const [ west, south, east, north ] = tile.boundingVolume.region;

src/three/plugins/README.md

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -717,6 +717,9 @@ Available options are as follows:
717717

718718
// Whether to generate the tiles as a solid form with bottom faces.
719719
solid: false,
720+
721+
// Whether to generate smooth normals for terrain tiles when the quantized mesh data does not include embedded normals.
722+
generateNormals: true,
720723
}
721724
```
722725

src/three/plugins/loaders/QuantizedMeshLoader.js

Lines changed: 33 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ export class QuantizedMeshLoader extends QuantizedMeshLoaderBase {
2929
this.ellipsoid = new Ellipsoid();
3030
this.skirtLength = 1000;
3131
this.smoothSkirtNormals = true;
32+
this.generateNormals = true;
3233
this.solid = false;
3334

3435
// set the range of the tile
@@ -46,6 +47,7 @@ export class QuantizedMeshLoader extends QuantizedMeshLoaderBase {
4647
solid,
4748
skirtLength,
4849
smoothSkirtNormals,
50+
generateNormals,
4951

5052
minLat,
5153
maxLat,
@@ -66,7 +68,8 @@ export class QuantizedMeshLoader extends QuantizedMeshLoaderBase {
6668
const mesh = new Mesh( geometry, material );
6769
mesh.position.set( ...header.center );
6870

69-
const includeNormals = 'octvertexnormals' in extensions;
71+
const hasNormalExtension = 'octvertexnormals' in extensions;
72+
const includeNormals = hasNormalExtension || generateNormals;
7073
const vertexCount = vertexData.u.length;
7174
const positions = [];
7275
const uvs = [];
@@ -94,10 +97,36 @@ export class QuantizedMeshLoader extends QuantizedMeshLoaderBase {
9497

9598
if ( includeNormals ) {
9699

97-
const extNormals = extensions[ 'octvertexnormals' ].normals;
98-
for ( let i = 0, l = extNormals.length; i < l; i ++ ) {
100+
if ( hasNormalExtension ) {
99101

100-
normals.push( extNormals[ i ] );
102+
const extNormals = extensions[ 'octvertexnormals' ].normals;
103+
for ( let i = 0, l = extNormals.length; i < l; i ++ ) {
104+
105+
normals.push( extNormals[ i ] );
106+
107+
}
108+
109+
} else {
110+
111+
// generate normals using the positions we just created
112+
const tempGeometry = new BufferGeometry();
113+
const tempIndexBuffer = indices.length > 21845 ? new Uint32Array( indices ) : new Uint16Array( indices );
114+
tempGeometry.setIndex( new BufferAttribute( tempIndexBuffer, 1, false ) );
115+
tempGeometry.setAttribute( 'position', new BufferAttribute( new Float32Array( positions ), 3, false ) );
116+
tempGeometry.computeVertexNormals();
117+
118+
const normalAttr = tempGeometry.getAttribute( 'normal' );
119+
const generatedNormals = normalAttr.array;
120+
121+
// store in extensions format for consistency
122+
extensions[ 'octvertexnormals' ] = { normals: generatedNormals };
123+
124+
// copy to normals array
125+
for ( let i = 0, l = generatedNormals.length; i < l; i ++ ) {
126+
127+
normals.push( generatedNormals[ i ] );
128+
129+
}
101130

102131
}
103132

0 commit comments

Comments
 (0)