344 if (!_frame_list.empty()) {
345 if (_frame_list.front()._transform == UnalignedLMatrix4(*transform)) {
351 PN_stdfloat color_scale;
352 LMatrix4 start_transform;
353 LMatrix4 end_transform;
354 LMatrix4 inverse_matrix;
356 color_scale = _color_scale;
358 PN_stdfloat elapsed_time;
360 elapsed_time = current_time - _fade_start_time;
361 if (elapsed_time < 0.0) {
364 if (elapsed_time < _fade_time) {
365 color_scale = (1.0f - (elapsed_time / _fade_time)) * color_scale;
373 _last_update_time = current_time;
376 PN_stdfloat minimum_time = current_time - _time_window;
378 while (!_frame_list.empty()) {
379 if (_frame_list.back()._time >= minimum_time) {
383 _frame_list.pop_back();
389 motion_trail_frame._time = current_time;
390 motion_trail_frame._transform = *transform;
391 _frame_list.push_front(std::move(motion_trail_frame));
395 int total_frames = (int)_frame_list.size();
396 int total_vertices = (int)_vertex_list.size();
399 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);
402 if (total_frames >= 2 && total_vertices >= 2) {
403 PN_stdfloat minimum_time;
404 PN_stdfloat delta_time;
407 VertexList::iterator vertex_iterator;
412 for (vertex_iterator = _vertex_list.begin(); vertex_iterator != _vertex_list.end(); vertex_iterator++) {
413 vertex_array[index] = *vertex_iterator;
417 const int total_segments = total_frames - 1;
418 const int total_vertex_segments = total_vertices - 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) {
438 PN_stdfloat total_distance = 0.0f;
446 for (
int index = 0; index < total_vertices; ++index) {
447 motion_trail_vertex = &vertex_array[index];
448 nurbs_curve_evaluator = motion_trail_vertex->_nurbs_curve_evaluator;
449 nurbs_curve_evaluator->set_order(4);
450 nurbs_curve_evaluator->reset(total_segments);
458 FrameList::iterator frame_iterator;
459 frame_iterator = _frame_list.begin();
460 for (
int segment_index = 0; segment_index < total_segments; ++segment_index) {
461 motion_trail_frame_start = *frame_iterator;
463 motion_trail_frame_end = *frame_iterator;
465 if (_calculate_relative_matrix) {
466 start_transform.multiply(motion_trail_frame_start._transform, inverse_matrix);
467 end_transform.multiply(motion_trail_frame_end._transform, inverse_matrix);
470 start_transform = motion_trail_frame_start._transform;
471 end_transform = motion_trail_frame_end._transform;
478 motion_trail_vertex_start = &vertex_array[0];
480 v0 = start_transform.xform(motion_trail_vertex_start->_vertex);
481 v2 = end_transform.xform(motion_trail_vertex_start->_vertex);
483 nurbs_curve_evaluator = motion_trail_vertex_start->_nurbs_curve_evaluator;
484 nurbs_curve_evaluator->set_vertex(segment_index, v0);
486 for (
int vertex_segment_index = 0;
487 vertex_segment_index < total_vertex_segments;
488 ++vertex_segment_index) {
489 motion_trail_vertex_start = &vertex_array[vertex_segment_index];
490 motion_trail_vertex_end = &vertex_array[vertex_segment_index + 1];
492 v1 = start_transform.xform(motion_trail_vertex_end->_vertex);
493 v3 = end_transform.xform(motion_trail_vertex_end->_vertex);
495 nurbs_curve_evaluator = motion_trail_vertex_end->_nurbs_curve_evaluator;
497 nurbs_curve_evaluator->set_vertex(segment_index, v1);
498 if (vertex_segment_index == (total_vertex_segments - 1)) {
499 PN_stdfloat distance;
502 vector.set (v[0], v[1], v[2]);
503 distance = vector.length();
504 total_distance += distance;
513 for (
int index = 0; index < total_vertices; ++index) {
519 motion_trail_vertex = &vertex_array[index];
521 nurbs_curve_evaluator = motion_trail_vertex->_nurbs_curve_evaluator;
522 nurbs_curve_result = nurbs_curve_evaluator->evaluate();
523 nurbs_curve_result_array[index] = nurbs_curve_result;
526 PN_stdfloat nurbs_start_t;
527 PN_stdfloat nurbs_end_t;
529 nurbs_start_t = nurbs_curve_result->get_start_t();
530 nurbs_end_t = nurbs_curve_result->get_end_t();
532 printf(
"nurbs_start_t %f, nurbs_end_t %f \n", nurbs_start_t, nurbs_end_t);
537 PN_stdfloat total_curve_segments = total_distance / _resolution_distance;
538 if (total_curve_segments < total_segments) {
539 total_curve_segments = total_segments;
542 const int total_curve_segments_int = (int)cceil(total_curve_segments);
543 begin_geometry(total_curve_segments_int * total_vertex_segments);
546 LVector3 v0, v1, v2, v3;
547 LVector4 c0, c1, c2, c3;
548 LVector2 t0, t1, t2, t3;
550 LVector4 vertex_start_color;
551 LVector4 vertex_end_color;
553 for (
int curve_segment_index = 0;
554 curve_segment_index < total_curve_segments_int;
555 ++curve_segment_index) {
560 PN_stdfloat color_start_t;
561 PN_stdfloat color_end_t;
568 st = curve_segment_index / total_curve_segments;
569 et = (curve_segment_index + 1) / total_curve_segments;
579 motion_trail_vertex_start = &vertex_array[0];
581 vertex_start_color = motion_trail_vertex_start->_end_color + (motion_trail_vertex_start->_start_color - motion_trail_vertex_start ->_end_color);
583 color_start_t = color_scale * start_t;
584 color_end_t = color_scale * end_t;
586 c0 = vertex_start_color * one_minus_x(color_start_t);
587 c2 = vertex_start_color * one_minus_x(color_end_t);
589 t0.set(one_minus_x(st), motion_trail_vertex_start->_v);
590 t2.set(one_minus_x(et), motion_trail_vertex_start->_v);
592 for (
int vertex_segment_index = 0;
593 vertex_segment_index < total_vertex_segments;
594 ++vertex_segment_index) {
596 PN_stdfloat start_nurbs_start_t;
597 PN_stdfloat start_nurbs_end_t;
598 PN_stdfloat end_nurbs_start_t;
599 PN_stdfloat end_nurbs_end_t;
601 motion_trail_vertex_start = &vertex_array[vertex_segment_index];
602 motion_trail_vertex_end = &vertex_array[vertex_segment_index + 1];
604 start_nurbs_curve_result = nurbs_curve_result_array[vertex_segment_index];
605 end_nurbs_curve_result = nurbs_curve_result_array[vertex_segment_index + 1];
607 start_nurbs_start_t = start_nurbs_curve_result->get_start_t();
608 start_nurbs_end_t = start_nurbs_curve_result->get_end_t();
609 end_nurbs_start_t = end_nurbs_curve_result->get_start_t();
610 end_nurbs_end_t = end_nurbs_curve_result->get_end_t();
612 PN_stdfloat start_delta_t;
613 PN_stdfloat end_delta_t;
615 start_delta_t = (start_nurbs_end_t - start_nurbs_start_t);
616 end_delta_t = (end_nurbs_end_t - end_nurbs_start_t);
618 start_nurbs_curve_result->eval_point(start_nurbs_start_t + (start_delta_t * st), v0);
619 end_nurbs_curve_result->eval_point(end_nurbs_start_t + (end_delta_t * st), v1);
621 start_nurbs_curve_result->eval_point(start_nurbs_start_t + (start_delta_t * et), v2);
622 end_nurbs_curve_result->eval_point(end_nurbs_start_t + (end_delta_t * et), v3);
625 vertex_end_color = motion_trail_vertex_end->_end_color + (motion_trail_vertex_end->_start_color - motion_trail_vertex_end->_end_color);
627 c1 = vertex_end_color * one_minus_x(color_start_t);
628 c3 = vertex_end_color * one_minus_x(color_end_t);
631 t1.set(one_minus_x(st), motion_trail_vertex_end->_v);
632 t3.set(one_minus_x(et), motion_trail_vertex_end->_v);
634 add_geometry_quad(v0, v1, v2, v3, c0, c1, c2, c3, t0, t1, t2, t3);
646 for (
int index = 0; index < total_vertices; ++index) {
647 nurbs_curve_result_array[index] =
nullptr;
650 delete[] nurbs_curve_result_array;
654 const int total_vertex_segments = total_vertices - 1;
656 begin_geometry(total_segments * total_vertex_segments);
662 PN_stdfloat color_start_t;
663 PN_stdfloat color_end_t;
665 LVector4 v0, v1, v2, v3;
666 LVector4 c0, c1, c2, c3;
667 LVector2 t0, t1, t2, t3;
669 LVector4 vertex_start_color;
670 LVector4 vertex_end_color;
675 FrameList::iterator frame_iterator = _frame_list.begin();
676 for (
int segment_index = 0; segment_index < total_segments; ++segment_index) {
680 motion_trail_frame_start = *frame_iterator;
682 motion_trail_frame_end = *frame_iterator;
684 start_t = (motion_trail_frame_start._time - minimum_time) / delta_time;
685 end_t = (motion_trail_frame_end._time - minimum_time) / delta_time;
695 if (_calculate_relative_matrix) {
696 start_transform.multiply(motion_trail_frame_start._transform, inverse_matrix);
697 end_transform.multiply(motion_trail_frame_end._transform, inverse_matrix);
700 start_transform = motion_trail_frame_start._transform;
701 end_transform = motion_trail_frame_end._transform;
704 motion_trail_vertex_start = &vertex_array[0];
706 v0 = start_transform.xform(motion_trail_vertex_start->_vertex);
707 v2 = end_transform.xform(motion_trail_vertex_start->_vertex);
709 vertex_start_color = motion_trail_vertex_start->_end_color + (motion_trail_vertex_start->_start_color - motion_trail_vertex_start->_end_color);
710 color_start_t = color_scale * start_t;
711 color_end_t = color_scale * end_t;
712 c0 = vertex_start_color * color_start_t;
713 c2 = vertex_start_color * color_end_t;
715 t0.set(st, motion_trail_vertex_start->_v);
716 t2.set(et, motion_trail_vertex_start->_v);
718 for (
int vertex_segment_index = 0;
719 vertex_segment_index < total_vertex_segments;
720 ++vertex_segment_index) {
721 motion_trail_vertex_start = &vertex_array[vertex_segment_index];
722 motion_trail_vertex_end = &vertex_array[vertex_segment_index + 1];
724 v1 = start_transform.xform(motion_trail_vertex_end->_vertex);
725 v3 = end_transform.xform(motion_trail_vertex_end->_vertex);
728 vertex_end_color = motion_trail_vertex_end->_end_color + (motion_trail_vertex_end->_start_color - motion_trail_vertex_end->_end_color);
730 c1 = vertex_end_color * color_start_t;
731 c3 = vertex_end_color * color_end_t;
734 t1.set(st, motion_trail_vertex_end->_v);
735 t3.set(et, motion_trail_vertex_end->_v);
737 add_geometry_quad(v0, v1, v2, v3, c0, c1, c2, c3, t0, t1, t2, t3);
754 delete[] vertex_array;