148
142
return bbox .set (this .bboxSize_ .getValue (), this .bboxCenter_ .getValue ());
150
getLevel: function (browser, modelViewMatrix)
144
getLevel: (function ()
152
if (this .range_ .length === 0)
147
FRAMES = 180, // Number of frames after wich a level change takes in affect.
148
FRAME_RATE_MIN = 20, // Lowest level of detail.
149
FRAME_RATE_MAX = 55; // Highest level of detail.
151
return function (browser, modelViewMatrix)
154
var size = this .children_ .length;
159
this .frameRate = ((FRAMES - 1) * this .frameRate + browser .currentFrameRate) / FRAMES;
162
return Number (this .frameRate > FRAME_RATE_MAX);
166
fraction = Math .max ((this .frameRate - FRAME_RATE_MIN) / (FRAME_RATE_MAX - FRAME_RATE_MIN), 0);
168
return Math .min (Math .ceil (fraction * (n - 1)), n);
171
var distance = this .getDistance (modelViewMatrix);
173
return Algorithm .upperBound (this .range_, 0, this .range_ .length, distance, Algorithm .less);
153
if (this .range_ .length === 0)
155
var size = this .children_ .length;
160
this .frameRate = ((FRAMES - 1) * this .frameRate + browser .currentFrameRate) / FRAMES;
163
return Number (this .frameRate > FRAME_RATE_MAX);
165
var fraction = 1 - Algorithm .clamp ((this .frameRate - FRAME_RATE_MIN) / (FRAME_RATE_MAX - FRAME_RATE_MIN), 0, 1);
167
return Math .min (Math .floor (fraction * size), size - 1);
170
var distance = this .getDistance (modelViewMatrix);
172
return Algorithm .upperBound (this .range_, 0, this .range_ .length, distance, Algorithm .less);
175
175
getDistance: function (modelViewMatrix)
177
177
modelViewMatrix .translate (this .center_ .getValue ());
179
179
return modelViewMatrix .origin .abs ();
181
traverse: function (type, renderObject)
181
traverse: (function ()
183
if (! this .keepCurrentLevel)
183
var modelViewMatrix = new Matrix4 ();
185
return function (type, renderObject)
185
if (type === TraverseType .DISPLAY)
187
if (! this .keepCurrentLevel)
188
level = this .getLevel (renderObject .getBrowser (), this .modelViewMatrix .assign (renderObject .getModelViewMatrix () .get ())),
189
currentLevel = this .level_changed_ .getValue ();
191
if (this .forceTransitions_ .getValue ())
193
if (level > currentLevel)
194
level = currentLevel + 1;
196
else if (level < currentLevel)
197
level = currentLevel - 1;
200
if (level !== currentLevel)
202
this .level_changed_ = level;
204
this .child = this .getChild (Math .min (level, this .children_ .length - 1));
206
this .set_cameraObjects__ ();
189
if (type === TraverseType .DISPLAY)
192
level = this .getLevel (renderObject .getBrowser (), modelViewMatrix .assign (renderObject .getModelViewMatrix () .get ())),
193
currentLevel = this .level_changed_ .getValue ();
195
if (this .forceTransitions_ .getValue ())
197
if (level > currentLevel)
198
level = currentLevel + 1;
200
else if (level < currentLevel)
201
level = currentLevel - 1;
204
if (level !== currentLevel)
206
this .level_changed_ = level;
208
this .child = this .getChild (Math .min (level, this .children_ .length - 1));
210
this .set_cameraObjects__ ();
212
this .child .traverse (type, renderObject);
216
this .child .traverse (type, renderObject);