31 FadeLODNode(
const std::string &name) :
36 _fade_time = lod_fade_time;
37 _fade_bin_name = lod_fade_bin_name;
38 _fade_bin_draw_order = lod_fade_bin_draw_order;
39 _fade_state_override = lod_fade_state_override;
49 _fade_time = copy._fade_time;
50 _fade_bin_name = copy._fade_bin_name;
51 _fade_bin_draw_order = copy._fade_bin_draw_order;
52 _fade_state_override = copy._fade_state_override;
85 if (!support_fade_lod) {
90 return show_switches_cull_callback(trav, data);
93 consider_verify_lods(trav, data);
96 NodePath this_np = data.get_node_path();
106 ldata->_fade_mode = FadeLODNodeData::FM_solid;
107 ldata->_fade_out = -1;
108 ldata->_fade_in = compute_child(trav, data);
109 camera->set_aux_scene_data(this_np, ldata);
115 if (ldata->_fade_mode == FadeLODNodeData::FM_solid) {
118 int index = compute_child(trav, data);
119 if (index != ldata->_fade_in) {
121 if (index >= 0 && ldata->_fade_in >= 0 &&
125 ldata->_fade_mode = FadeLODNodeData::FM_less_detail;
129 ldata->_fade_mode = FadeLODNodeData::FM_more_detail;
136 ldata->_fade_out = ldata->_fade_in;
137 ldata->_fade_in = index;
141 if (ldata->_fade_mode != FadeLODNodeData::FM_solid) {
144 PN_stdfloat elapsed = now - ldata->_fade_start;
146 if (elapsed >= _fade_time) {
148 ldata->_fade_mode = FadeLODNodeData::FM_solid;
151 PN_stdfloat half_fade_time = _fade_time * 0.5f;
153 int in_child = ldata->_fade_in;
154 int out_child = ldata->_fade_out;
156 if (ldata->_fade_mode == FadeLODNodeData::FM_less_detail) {
159 elapsed = _fade_time - elapsed;
161 in_child = out_child;
165 nassertr(elapsed >= 0.0f && elapsed <= _fade_time,
false);
167 if (elapsed < half_fade_time) {
172 if (child !=
nullptr) {
174 next_data_out._state =
175 next_data_out._state->compose(get_fade_1_old_state());
182 if (child !=
nullptr) {
185 PN_stdfloat in_alpha = elapsed / half_fade_time;
186 next_data_in._state =
187 next_data_in._state->compose(get_fade_1_new_state(in_alpha));
197 if (child !=
nullptr) {
199 next_data_in._state =
200 next_data_in._state->compose(get_fade_2_new_state());
207 if (child !=
nullptr) {
210 PN_stdfloat out_alpha = 1.0f - (elapsed - half_fade_time) / half_fade_time;
211 next_data_out._state =
212 next_data_out._state->compose(get_fade_2_old_state(out_alpha));
221 if (ldata->_fade_mode == FadeLODNodeData::FM_solid) {
224 int index = ldata->_fade_in;
227 if (child !=
nullptr) {
244 output(std::ostream &out)
const {
245 LODNode::output(out);
246 out <<
" fade time: " << _fade_time;
255 _fade_bin_name = name;
256 _fade_bin_draw_order = draw_order;
257 _fade_1_new_state.clear();
258 _fade_2_old_state.clear();
268 _fade_state_override =
override;
269 _fade_1_old_state.clear();
270 _fade_1_new_state.clear();
271 _fade_2_old_state.clear();
272 _fade_2_new_state.clear();
280 get_fade_1_old_state() {
281 if (_fade_1_old_state ==
nullptr) {
282 _fade_1_old_state = RenderState::make_empty();
285 return _fade_1_old_state;
293 get_fade_1_new_state(PN_stdfloat in_alpha) {
294 if (_fade_1_new_state ==
nullptr) {
295 _fade_1_new_state = RenderState::make
296 (TransparencyAttrib::make(TransparencyAttrib::M_alpha),
297 CullBinAttrib::make(_fade_bin_name, _fade_bin_draw_order),
298 DepthOffsetAttrib::make(),
299 _fade_state_override);
302 LVecBase4 alpha_scale(1.0f, 1.0f, 1.0f, in_alpha);
303 return _fade_1_new_state->compose
304 (RenderState::make(ColorScaleAttrib::make(alpha_scale)));
312 get_fade_2_old_state(PN_stdfloat out_alpha) {
313 if (_fade_2_old_state ==
nullptr) {
314 _fade_2_old_state = RenderState::make
315 (TransparencyAttrib::make(TransparencyAttrib::M_alpha),
316 DepthWriteAttrib::make(DepthWriteAttrib::M_off),
317 CullBinAttrib::make(_fade_bin_name, _fade_bin_draw_order),
318 _fade_state_override);
321 LVecBase4 alpha_scale(1.0f, 1.0f, 1.0f, out_alpha);
322 return _fade_2_old_state->compose
323 (RenderState::make(ColorScaleAttrib::make(alpha_scale)));
331 get_fade_2_new_state() {
332 if (_fade_2_new_state ==
nullptr) {
333 _fade_2_new_state = RenderState::make
334 (DepthOffsetAttrib::make(),
335 _fade_state_override);
338 return _fade_2_new_state;
370 node->fillin(scan, manager);
381 LODNode::fillin(scan, manager);