Skip to content

Commit 9f7bc7e

Browse files
authored
Merge pull request #17894 from Mugen87/dev33
LOD: Make methods more robust.
2 parents a1282ab + 83d339a commit 9f7bc7e

File tree

3 files changed

+107
-26
lines changed

3 files changed

+107
-26
lines changed

src/objects/LOD.d.ts

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,9 +10,10 @@ export class LOD extends Object3D {
1010
type: 'LOD';
1111

1212
levels: { distance: number; object: Object3D }[];
13+
autoUpdate: boolean;
1314

1415
addLevel( object: Object3D, distance?: number ): this;
15-
getObjectForDistance( distance: number ): Object3D;
16+
getObjectForDistance( distance: number ): Object3D | null;
1617
raycast( raycaster: Raycaster, intersects: Intersection[] ): void;
1718
update( camera: Camera ): void;
1819
toJSON( meta: any ): any;

src/objects/LOD.js

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@ LOD.prototype = Object.assign( Object.create( Object3D.prototype ), {
4747

4848
}
4949

50+
this.autoUpdate = source.autoUpdate;
51+
5052
return this;
5153

5254
},
@@ -81,27 +83,39 @@ LOD.prototype = Object.assign( Object.create( Object3D.prototype ), {
8183

8284
var levels = this.levels;
8385

84-
for ( var i = 1, l = levels.length; i < l; i ++ ) {
86+
if ( levels.length > 0 ) {
87+
88+
for ( var i = 1, l = levels.length; i < l; i ++ ) {
8589

86-
if ( distance < levels[ i ].distance ) {
90+
if ( distance < levels[ i ].distance ) {
8791

88-
break;
92+
break;
93+
94+
}
8995

9096
}
9197

98+
return levels[ i - 1 ].object;
99+
92100
}
93101

94-
return levels[ i - 1 ].object;
102+
return null;
95103

96104
},
97105

98106
raycast: function ( raycaster, intersects ) {
99107

100-
_v1.setFromMatrixPosition( this.matrixWorld );
108+
var levels = this.levels;
109+
110+
if ( levels.length > 0 ) {
101111

102-
var distance = raycaster.ray.origin.distanceTo( _v1 );
112+
_v1.setFromMatrixPosition( this.matrixWorld );
103113

104-
this.getObjectForDistance( distance ).raycast( raycaster, intersects );
114+
var distance = raycaster.ray.origin.distanceTo( _v1 );
115+
116+
this.getObjectForDistance( distance ).raycast( raycaster, intersects );
117+
118+
}
105119

106120
},
107121

test/unit/src/objects/LOD.tests.js

Lines changed: 84 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -3,57 +3,123 @@
33
*/
44
/* global QUnit */
55

6+
import { Object3D } from '../../../../src/core/Object3D';
7+
import { Raycaster } from '../../../../src/core/Raycaster';
68
import { LOD } from '../../../../src/objects/LOD';
79

810
export default QUnit.module( 'Objects', () => {
911

1012
QUnit.module( 'LOD', () => {
1113

1214
// INHERITANCE
13-
QUnit.todo( "Extending", ( assert ) => {
15+
QUnit.test( "Extending", ( assert ) => {
1416

15-
assert.ok( false, "everything's gonna be alright" );
17+
var lod = new LOD();
18+
19+
assert.strictEqual( ( lod instanceof Object3D ), true, "LOD extends from Object3D" );
1620

1721
} );
1822

19-
// INSTANCING
20-
QUnit.todo( "Instancing", ( assert ) => {
23+
// PROPERTIES
24+
QUnit.test( "levels", ( assert ) => {
2125

22-
assert.ok( false, "everything's gonna be alright" );
26+
var lod = new LOD();
27+
var levels = lod.levels;
28+
29+
assert.strictEqual( Array.isArray( levels ), true, "LOD.levels is of type array." );
30+
assert.strictEqual( levels.length, 0, "LOD.levels is empty by default." );
2331

2432
} );
2533

26-
// PROPERTIES
27-
QUnit.todo( "levels", ( assert ) => {
34+
QUnit.test( "autoUpdate", ( assert ) => {
2835

29-
assert.ok( false, "everything's gonna be alright" );
36+
var lod = new LOD();
37+
38+
assert.strictEqual( lod.autoUpdate, true, "LOD.autoUpdate is of type boolean and true by default." );
3039

3140
} );
3241

3342
// PUBLIC STUFF
34-
QUnit.todo( "isLOD", ( assert ) => {
43+
QUnit.test( "isLOD", ( assert ) => {
3544

36-
assert.ok( false, "everything's gonna be alright" );
45+
var lod = new LOD();
46+
47+
assert.strictEqual( lod.isLOD, true, ".isLOD property is defined." );
3748

3849
} );
39-
QUnit.todo( "copy", ( assert ) => {
50+
QUnit.test( "copy", ( assert ) => {
4051

41-
assert.ok( false, "everything's gonna be alright" );
52+
var lod1 = new LOD();
53+
var lod2 = new LOD();
54+
55+
var high = new Object3D();
56+
var mid = new Object3D();
57+
var low = new Object3D();
58+
59+
lod1.addLevel( high, 5 );
60+
lod1.addLevel( mid, 25 );
61+
lod1.addLevel( low, 50 );
62+
63+
lod1.autoUpdate = false;
64+
65+
lod2.copy( lod1 );
66+
67+
assert.strictEqual( lod2.autoUpdate, false, "LOD.autoUpdate is correctly copied." );
68+
assert.strictEqual( lod2.levels.length, 3, "LOD.levels has the correct length after the copy." );
4269

4370
} );
44-
QUnit.todo( "addLevel", ( assert ) => {
71+
QUnit.test( "addLevel", ( assert ) => {
4572

46-
assert.ok( false, "everything's gonna be alright" );
73+
var lod = new LOD();
74+
75+
var high = new Object3D();
76+
var mid = new Object3D();
77+
var low = new Object3D();
78+
79+
lod.addLevel( high, 5 );
80+
lod.addLevel( mid, 25 );
81+
lod.addLevel( low, 50 );
82+
83+
assert.strictEqual( lod.levels.length, 3, "LOD.levels has the correct length." );
84+
assert.deepEqual( lod.levels[ 0 ], { distance: 5, object: high }, "First entry correct." );
85+
assert.deepEqual( lod.levels[ 1 ], { distance: 25, object: mid }, "Second entry correct." );
86+
assert.deepEqual( lod.levels[ 2 ], { distance: 50, object: low }, "Third entry correct." );
4787

4888
} );
49-
QUnit.todo( "getObjectForDistance", ( assert ) => {
89+
QUnit.test( "getObjectForDistance", ( assert ) => {
5090

51-
assert.ok( false, "everything's gonna be alright" );
91+
var lod = new LOD();
92+
93+
var high = new Object3D();
94+
var mid = new Object3D();
95+
var low = new Object3D();
96+
97+
assert.strictEqual( lod.getObjectForDistance( 5 ), null, "Returns null if no LOD levels are defined." );
98+
99+
lod.addLevel( high, 5 );
100+
101+
assert.strictEqual( lod.getObjectForDistance( 0 ), high, "Returns always the same object if only one LOD level is defined." );
102+
assert.strictEqual( lod.getObjectForDistance( 10 ), high, "Returns always the same object if only one LOD level is defined." );
103+
104+
lod.addLevel( mid, 25 );
105+
lod.addLevel( low, 50 );
106+
107+
assert.strictEqual( lod.getObjectForDistance( 0 ), high, "Returns the high resolution object." );
108+
assert.strictEqual( lod.getObjectForDistance( 10 ), high, "Returns the high resolution object." );
109+
assert.strictEqual( lod.getObjectForDistance( 25 ), mid, "Returns the mid resolution object." );
110+
assert.strictEqual( lod.getObjectForDistance( 50 ), low, "Returns the low resolution object." );
111+
assert.strictEqual( lod.getObjectForDistance( 60 ), low, "Returns the low resolution object." );
52112

53113
} );
54-
QUnit.todo( "raycast", ( assert ) => {
114+
QUnit.test( "raycast", ( assert ) => {
55115

56-
assert.ok( false, "everything's gonna be alright" );
116+
var lod = new LOD();
117+
var raycaster = new Raycaster();
118+
var intersections = [];
119+
120+
lod.raycast( raycaster, intersections );
121+
122+
assert.strictEqual( intersections.length, 0, "Does not fail if raycasting is used with a LOD object without levels." );
57123

58124
} );
59125
QUnit.todo( "update", ( assert ) => {

0 commit comments

Comments
 (0)