Skip to content

Commit c984779

Browse files
committed
LOD: Make methods more robuste.
1 parent 064df7c commit c984779

File tree

2 files changed

+59
-15
lines changed

2 files changed

+59
-15
lines changed

src/objects/LOD.js

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -81,27 +81,39 @@ LOD.prototype = Object.assign( Object.create( Object3D.prototype ), {
8181

8282
var levels = this.levels;
8383

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

86-
if ( distance < levels[ i ].distance ) {
86+
for ( var i = 1, l = levels.length; i < l; i ++ ) {
8787

88-
break;
88+
if ( distance < levels[ i ].distance ) {
89+
90+
break;
91+
92+
}
8993

9094
}
9195

96+
return levels[ i - 1 ].object;
97+
9298
}
9399

94-
return levels[ i - 1 ].object;
100+
return null;
95101

96102
},
97103

98104
raycast: function ( raycaster, intersects ) {
99105

100-
_v1.setFromMatrixPosition( this.matrixWorld );
106+
var levels = this.levels;
107+
108+
if ( levels.length > 0 ) {
101109

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

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

106118
},
107119

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

Lines changed: 40 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,20 @@
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

@@ -31,9 +35,11 @@ export default QUnit.module( 'Objects', () => {
3135
} );
3236

3337
// PUBLIC STUFF
34-
QUnit.todo( "isLOD", ( assert ) => {
38+
QUnit.test( "isLOD", ( assert ) => {
3539

36-
assert.ok( false, "everything's gonna be alright" );
40+
var lod = new LOD();
41+
42+
assert.strictEqual( lod.isLOD, true, ".isLOD property is defined." );
3743

3844
} );
3945
QUnit.todo( "copy", ( assert ) => {
@@ -46,14 +52,40 @@ export default QUnit.module( 'Objects', () => {
4652
assert.ok( false, "everything's gonna be alright" );
4753

4854
} );
49-
QUnit.todo( "getObjectForDistance", ( assert ) => {
55+
QUnit.test( "getObjectForDistance", ( assert ) => {
5056

51-
assert.ok( false, "everything's gonna be alright" );
57+
var lod = new LOD();
58+
59+
var high = new Object3D();
60+
var mid = new Object3D();
61+
var low = new Object3D();
62+
63+
assert.strictEqual( lod.getObjectForDistance( 5 ), null, "Returns null if no LOD levels are defined." );
64+
65+
lod.addLevel( high, 5 );
66+
67+
assert.strictEqual( lod.getObjectForDistance( 0 ), high, "Returns always the same object if only one LOD level is defined." );
68+
assert.strictEqual( lod.getObjectForDistance( 10 ), high, "Returns always the same object if only one LOD level is defined." );
69+
70+
lod.addLevel( mid, 25 );
71+
lod.addLevel( low, 50 );
72+
73+
assert.strictEqual( lod.getObjectForDistance( 0 ), high, "Returns the high resolution object." );
74+
assert.strictEqual( lod.getObjectForDistance( 10 ), high, "Returns the high resolution object." );
75+
assert.strictEqual( lod.getObjectForDistance( 25 ), mid, "Returns the mid resolution object." );
76+
assert.strictEqual( lod.getObjectForDistance( 50 ), low, "Returns the low resolution object." );
77+
assert.strictEqual( lod.getObjectForDistance( 60 ), low, "Returns the low resolution object." );
5278

5379
} );
54-
QUnit.todo( "raycast", ( assert ) => {
80+
QUnit.test( "raycast", ( assert ) => {
5581

56-
assert.ok( false, "everything's gonna be alright" );
82+
var lod = new LOD();
83+
var raycaster = new Raycaster();
84+
var intersections = [];
85+
86+
lod.raycast( raycaster, intersections );
87+
88+
assert.strictEqual( intersections.length, 0, "Does not fail if raycasting is used with a LOD object without levels." );
5789

5890
} );
5991
QUnit.todo( "update", ( assert ) => {

0 commit comments

Comments
 (0)