37 _fade_start_time = 0.0f;
38 _fade_color_scale = 1.0f;
40 _last_update_time = 0.0f;
42 _vertex_list.clear ( );
43 _frame_list.clear ( );
51 _calculate_relative_matrix =
false;
55 _resolution_distance = 0.5f;
62 _vertex_data =
nullptr;
65 _vertex_array =
nullptr;
81 _frame_list.clear ( );
89 _vertex_list.clear ( );
105 _geom_node = geom_node;
112 add_vertex (LVector4 *vertex, LVector4 *start_color, LVector4 *end_color, PN_stdfloat v) {
116 motion_trail_vertex._vertex = *vertex;
117 motion_trail_vertex._start_color = *start_color;
118 motion_trail_vertex._end_color = *end_color;
119 motion_trail_vertex._v = v;
123 _vertex_list.push_back (motion_trail_vertex);
146 set_parameters (PN_stdfloat sampling_time, PN_stdfloat time_window,
bool use_texture,
bool calculate_relative_matrix,
bool use_nurbs, PN_stdfloat resolution_distance) {
148 _sampling_time = sampling_time;
149 _time_window = time_window;
150 _use_texture = use_texture;
151 _calculate_relative_matrix = calculate_relative_matrix;
152 _use_nurbs = use_nurbs;
153 _resolution_distance = resolution_distance;
165 if ((current_time - _last_update_time) >= _sampling_time) {
171 state = state && _enable;
176 PN_stdfloat one_minus_x (PN_stdfloat x) {
204 _vertex_writer.
clear();
205 _color_writer.
clear();
206 _texture_writer.
clear();
208 _vertex_data =
new GeomVertexData (
"vertices", format, Geom::UH_static);
222 add_geometry_quad (LVector3 &v0, LVector3 &v1, LVector3 &v2, LVector3 &v3, LVector4 &c0, LVector4 &c1, LVector4 &c2, LVector4 &c3, LVector2 &t0, LVector2 &t1, LVector2 &t2, LVector2 &t3) {
242 vertex_index = _vertex_index;
247 _triangles -> close_primitive ( );
252 _triangles -> close_primitive ( );
261 add_geometry_quad (LVector4 &v0, LVector4 &v1, LVector4 &v2, LVector4 &v3, LVector4 &c0, LVector4 &c1, LVector4 &c2, LVector4 &c3, LVector2 &t0, LVector2 &t1, LVector2 &t2, LVector2 &t3) {
263 _vertex_writer.
add_data3 (v0 [0], v0 [1], v0 [2]);
264 _vertex_writer.
add_data3 (v1 [0], v1 [1], v1 [2]);
265 _vertex_writer.
add_data3 (v2 [0], v2 [1], v2 [2]);
266 _vertex_writer.
add_data3 (v3 [0], v3 [1], v3 [2]);
281 vertex_index = _vertex_index;
286 _triangles -> close_primitive ( );
291 _triangles -> close_primitive ( );
299 void CMotionTrail::end_geometry ( ) {
301 if (state ==
nullptr) {
302 state = RenderState::make(ColorAttrib::make_vertex());
307 geometry =
new Geom (_vertex_data);
308 geometry -> add_primitive (_triangles);
311 _geom_node -> remove_all_geoms ( );
312 _geom_node -> add_geom (geometry, state);
327 total_frames = _frame_list.size ( );
328 if (total_frames >= 1) {
329 FrameList::iterator frame_iterator;
332 frame_iterator = _frame_list.begin ( );
333 motion_trail_frame = *frame_iterator;
334 if (*transform == motion_trail_frame._transform) {
341 PN_stdfloat color_scale;
342 LMatrix4 start_transform;
343 LMatrix4 end_transform;
344 LMatrix4 inverse_matrix;
346 total_vertices = _vertex_list.size ( );
347 color_scale = _color_scale;
349 PN_stdfloat elapsed_time;
351 elapsed_time = current_time - _fade_start_time;
352 if (elapsed_time < 0.0) {
355 if (elapsed_time < _fade_time) {
356 color_scale = (1.0f - (elapsed_time / _fade_time)) * color_scale;
364 _last_update_time = current_time;
367 PN_stdfloat minimum_time;
369 minimum_time = current_time - _time_window;
373 while (!_frame_list.empty()) {
374 motion_trail_frame = _frame_list.back();
375 if (motion_trail_frame._time >= minimum_time) {
379 _frame_list.pop_back ( );
386 motion_trail_frame._time = current_time;
387 motion_trail_frame._transform = *transform;
389 _frame_list.push_front(motion_trail_frame);
393 total_frames = _frame_list.size ( );
396 printf (
"update_motion_trail, total_frames = %d, total_vertices = %d, nurbs = %d, _calculate_relative_matrix = %d \n", total_frames, total_vertices, _use_nurbs, _calculate_relative_matrix);
399 if ((total_frames >= 2) && (total_vertices >= 2)) {
401 PN_stdfloat minimum_time;
402 PN_stdfloat delta_time;
405 VertexList::iterator vertex_iterator;
410 for (vertex_iterator = _vertex_list.begin ( ); vertex_iterator != _vertex_list.end ( ); vertex_iterator++) {
411 _vertex_array [index] = *vertex_iterator;
416 this -> begin_geometry ( );
418 total_segments = total_frames - 1;
420 last_motion_trail_frame = _frame_list.back();
421 minimum_time = last_motion_trail_frame._time;
422 delta_time = current_time - minimum_time;
424 if (_calculate_relative_matrix) {
425 inverse_matrix = *transform;
426 inverse_matrix.invert_in_place ( );
429 if (_use_nurbs && (total_frames >= 5)) {
432 int total_vertex_segments;
433 PN_stdfloat total_distance;
441 total_vertex_segments = total_vertices - 1;
442 total_distance = 0.0f;
450 for (index = 0; index < total_vertices; index++) {
451 motion_trail_vertex = &_vertex_array [index];
452 nurbs_curve_evaluator = motion_trail_vertex -> _nurbs_curve_evaluator;
453 nurbs_curve_evaluator -> set_order (4);
454 nurbs_curve_evaluator ->
reset (total_segments);
465 FrameList::iterator frame_iterator;
466 frame_iterator = _frame_list.begin ( );
467 while (segment_index < total_segments) {
468 int vertex_segement_index;
470 motion_trail_frame_start = *frame_iterator;
472 motion_trail_frame_end = *frame_iterator;
474 if (_calculate_relative_matrix) {
475 start_transform.multiply (motion_trail_frame_start._transform, inverse_matrix);
476 end_transform.multiply (motion_trail_frame_end._transform, inverse_matrix);
479 start_transform = motion_trail_frame_start._transform;
480 end_transform = motion_trail_frame_end._transform;
487 motion_trail_vertex_start = &_vertex_array [0];
489 v0 = start_transform.xform (motion_trail_vertex_start -> _vertex);
490 v2 = end_transform.xform (motion_trail_vertex_start -> _vertex);
492 nurbs_curve_evaluator = motion_trail_vertex_start -> _nurbs_curve_evaluator;
493 nurbs_curve_evaluator -> set_vertex (segment_index, v0);
495 vertex_segement_index = 0;
496 while (vertex_segement_index < total_vertex_segments) {
497 motion_trail_vertex_start = &_vertex_array [vertex_segement_index];
498 motion_trail_vertex_end = &_vertex_array [vertex_segement_index + 1];
500 v1 = start_transform.xform (motion_trail_vertex_end -> _vertex);
501 v3 = end_transform.xform (motion_trail_vertex_end -> _vertex);
503 nurbs_curve_evaluator = motion_trail_vertex_end -> _nurbs_curve_evaluator;
505 nurbs_curve_evaluator -> set_vertex (segment_index, v1);
506 if (vertex_segement_index == (total_vertex_segments - 1)) {
507 PN_stdfloat distance;
510 vector.set (v[0], v[1], v[2]);
511 distance = vector.length();
512 total_distance += distance;
515 vertex_segement_index += 1;
525 for (index = 0; index < total_vertices; index++) {
531 motion_trail_vertex = &_vertex_array [index];
533 nurbs_curve_evaluator = motion_trail_vertex -> _nurbs_curve_evaluator;
534 nurbs_curve_result = nurbs_curve_evaluator -> evaluate ( );
535 nurbs_curve_result_array [index] = nurbs_curve_result;
538 PN_stdfloat nurbs_start_t;
539 PN_stdfloat nurbs_end_t;
541 nurbs_start_t = nurbs_curve_result -> get_start_t();
542 nurbs_end_t = nurbs_curve_result -> get_end_t();
544 printf (
"nurbs_start_t %f, nurbs_end_t %f \n", nurbs_start_t, nurbs_end_t);
549 PN_stdfloat total_curve_segments;
551 total_curve_segments = (total_distance / _resolution_distance);
552 if (total_curve_segments < total_segments) {
553 total_curve_segments = total_segments;
572 LVector4 vertex_start_color;
573 LVector4 vertex_end_color;
575 PN_stdfloat curve_segment_index;
577 curve_segment_index = 0.0;
578 while (curve_segment_index < total_curve_segments) {
584 PN_stdfloat color_start_t;
585 PN_stdfloat color_end_t;
587 int vertex_segement_index;
594 vertex_segement_index = 0;
596 st = curve_segment_index / total_curve_segments;
597 et = (curve_segment_index + 1.0) / total_curve_segments;
607 motion_trail_vertex_start = &_vertex_array [0];
609 vertex_start_color = motion_trail_vertex_start -> _end_color + (motion_trail_vertex_start -> _start_color - motion_trail_vertex_start -> _end_color);
611 color_start_t = color_scale * start_t;
612 color_end_t = color_scale * end_t;
614 c0 = vertex_start_color * one_minus_x (color_start_t);
615 c2 = vertex_start_color * one_minus_x (color_end_t);
617 t0.set (one_minus_x (st), motion_trail_vertex_start -> _v);
618 t2.set (one_minus_x (et), motion_trail_vertex_start -> _v);
620 while (vertex_segement_index < total_vertex_segments) {
622 PN_stdfloat start_nurbs_start_t;
623 PN_stdfloat start_nurbs_end_t;
624 PN_stdfloat end_nurbs_start_t;
625 PN_stdfloat end_nurbs_end_t;
627 motion_trail_vertex_start = &_vertex_array [vertex_segement_index];
628 motion_trail_vertex_end = &_vertex_array [vertex_segement_index + 1];
630 start_nurbs_curve_result = nurbs_curve_result_array [vertex_segement_index];
631 end_nurbs_curve_result = nurbs_curve_result_array [vertex_segement_index + 1];
633 start_nurbs_start_t = start_nurbs_curve_result -> get_start_t();
634 start_nurbs_end_t = start_nurbs_curve_result -> get_end_t();
635 end_nurbs_start_t = end_nurbs_curve_result -> get_start_t();
636 end_nurbs_end_t = end_nurbs_curve_result -> get_end_t();
638 PN_stdfloat start_delta_t;
639 PN_stdfloat end_delta_t;
641 start_delta_t = (start_nurbs_end_t - start_nurbs_start_t);
642 end_delta_t = (end_nurbs_end_t - end_nurbs_start_t);
644 start_nurbs_curve_result -> eval_point (start_nurbs_start_t + (start_delta_t * st), v0);
645 end_nurbs_curve_result -> eval_point (end_nurbs_start_t + (end_delta_t * st), v1);
647 start_nurbs_curve_result -> eval_point (start_nurbs_start_t + (start_delta_t * et), v2);
648 end_nurbs_curve_result -> eval_point (end_nurbs_start_t + (end_delta_t * et), v3);
651 vertex_end_color = motion_trail_vertex_end -> _end_color + (motion_trail_vertex_end -> _start_color - motion_trail_vertex_end -> _end_color);
653 c1 = vertex_end_color * one_minus_x (color_start_t);
654 c3 = vertex_end_color * one_minus_x (color_end_t);
657 t1.set (one_minus_x (st), motion_trail_vertex_end -> _v);
658 t3.set (one_minus_x (et), motion_trail_vertex_end -> _v);
660 this ->
add_geometry_quad (v0, v1, v2, v3, c0, c1, c2, c3, t0, t1, t2, t3);
669 vertex_segement_index += 1;
672 curve_segment_index += 1.0;
676 for (index = 0; index < total_vertices; index++) {
677 nurbs_curve_result_array [index] =
nullptr;
680 delete[] nurbs_curve_result_array;
686 int vertex_segment_index;
687 int total_vertex_segments;
693 PN_stdfloat color_start_t;
694 PN_stdfloat color_end_t;
711 LVector4 vertex_start_color;
712 LVector4 vertex_end_color;
718 FrameList::iterator frame_iterator;
719 frame_iterator = _frame_list.begin ( );
720 while (segment_index < total_segments) {
725 motion_trail_frame_start = *frame_iterator;
727 motion_trail_frame_end = *frame_iterator;
729 start_t = (motion_trail_frame_start._time - minimum_time) / delta_time;
730 end_t = (motion_trail_frame_end._time - minimum_time) / delta_time;
740 vertex_segment_index = 0;
741 total_vertex_segments = total_vertices - 1;
743 if (_calculate_relative_matrix) {
744 start_transform.multiply (motion_trail_frame_start._transform, inverse_matrix);
745 end_transform.multiply (motion_trail_frame_end._transform, inverse_matrix);
748 start_transform = motion_trail_frame_start._transform;
749 end_transform = motion_trail_frame_end._transform;
752 motion_trail_vertex_start = &_vertex_array [0];
754 v0 = start_transform.xform (motion_trail_vertex_start -> _vertex);
755 v2 = end_transform.xform (motion_trail_vertex_start -> _vertex);
757 vertex_start_color = motion_trail_vertex_start -> _end_color + (motion_trail_vertex_start -> _start_color - motion_trail_vertex_start -> _end_color);
758 color_start_t = color_scale * start_t;
759 color_end_t = color_scale * end_t;
760 c0 = vertex_start_color * color_start_t;
761 c2 = vertex_start_color * color_end_t;
763 t0.set (st, motion_trail_vertex_start -> _v);
764 t2.set (et, motion_trail_vertex_start -> _v);
766 while (vertex_segment_index < total_vertex_segments) {
768 motion_trail_vertex_start = &_vertex_array [vertex_segment_index];
769 motion_trail_vertex_end = &_vertex_array [vertex_segment_index + 1];
771 v1 = start_transform.xform (motion_trail_vertex_end -> _vertex);
772 v3 = end_transform.xform (motion_trail_vertex_end -> _vertex);
775 vertex_end_color = motion_trail_vertex_end -> _end_color + (motion_trail_vertex_end -> _start_color - motion_trail_vertex_end -> _end_color);
777 c1 = vertex_end_color * color_start_t;
778 c3 = vertex_end_color * color_end_t;
781 t1.set (st, motion_trail_vertex_end -> _v);
782 t3.set (et, motion_trail_vertex_end -> _v);
784 this ->
add_geometry_quad (v0, v1, v2, v3, c0, c1, c2, c3, t0, t1, t2, t3);
796 vertex_segment_index += 1;
804 this -> end_geometry ( );
806 delete[] _vertex_array;
807 _vertex_array =
nullptr;
void enable(bool enable)
Enable/disable the motion trail.
This object provides a high-level interface for quickly writing a sequence of numeric values from a v...
void reset_vertex_list()
Reset the vertex list.
void clear()
Resets the GeomVertexWriter to the initial state.
This class is an abstraction for evaluating NURBS curves.
void add_data2(PN_stdfloat x, PN_stdfloat y)
Sets the write row to a particular 2-component value, and advances the write row.
void add_data4(PN_stdfloat x, PN_stdfloat y, PN_stdfloat z, PN_stdfloat w)
Sets the write row to a particular 4-component value, and advances the write row.
void add_geometry_quad(LVector3 &v0, LVector3 &v1, LVector3 &v2, LVector3 &v3, LVector4 &c0, LVector4 &c1, LVector4 &c2, LVector4 &c3, LVector2 &t0, LVector2 &t1, LVector2 &t2, LVector2 &t3)
LVector3 vertex version.
void reset()
Reset the frame sample history.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
This defines the actual numeric vertex data stored in a Geom, in the structure defined by a particula...
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.
CMotionTrail()
Constructor.
A container for geometry primitives.
void add_data3(PN_stdfloat x, PN_stdfloat y, PN_stdfloat z)
Sets the write row to a particular 3-component value, and advances the write row.
~CMotionTrail()
Destructor.
This represents a unique collection of RenderAttrib objects that correspond to a particular renderabl...
void set_parameters(PN_stdfloat sampling_time, PN_stdfloat time_window, bool use_texture, bool calculate_relative_matrix, bool use_nurbs, PN_stdfloat resolution_distance)
Set motion trail parameters.
int check_for_update(PN_stdfloat current_time)
Check if a sample can be submitted.
Defines a series of disconnected triangles.
void add_vertex(LVector4 *vertex, LVector4 *start_color, LVector4 *end_color, PN_stdfloat v)
Add a vertex.
TypeHandle is the identifier used to differentiate C++ class types.
The result of a NurbsCurveEvaluator.
void update_motion_trail(PN_stdfloat current_time, LMatrix4 *transform)
See class header comments.
A node that holds Geom objects, renderable pieces of geometry.
void set_geom_node(GeomNode *geom_node)
Set the GeomNode.
PANDA 3D SOFTWARE Copyright (c) Carnegie Mellon University.