motiontrail: Further cleanup of CMotionTrail code

This commit is contained in:
rdb 2022-12-16 18:18:12 +01:00
parent 8354e175cf
commit c366dab405
2 changed files with 103 additions and 245 deletions

View File

@ -28,60 +28,6 @@ static PN_stdfloat one_minus_x(PN_stdfloat x) {
TypeHandle CMotionTrail::_type_handle;
/**
* Constructor
*/
CMotionTrail::
CMotionTrail() {
_active = true;
_enable = true;
_pause = false;
_pause_time = 0.0f;
_fade = false;
_fade_end = false;
_fade_time = 0.0f;
_fade_start_time = 0.0f;
_fade_color_scale = 1.0f;
_last_update_time = 0.0f;
_vertex_list.clear();
_frame_list.clear();
// parameters
_color_scale = 1.0;
_sampling_time = 0.0;
_time_window = 1.0;
_square_t = true;
_use_texture = false;
_calculate_relative_matrix = false;
// nurbs parameters
_use_nurbs = false;
_resolution_distance = 0.5f;
// node path states
_geom_node = nullptr;
// real-time data
_vertex_index = 0;
_vertex_data = nullptr;
_triangles = nullptr;
_vertex_array = nullptr;
}
/**
* Destructor
*/
CMotionTrail::
~CMotionTrail() {
}
/**
* Reset the frame sample history.
*/
@ -118,18 +64,15 @@ set_geom_node(GeomNode *geom_node) {
* Add a vertex.
*/
void CMotionTrail::
add_vertex(LVector4 *vertex, LVector4 *start_color, LVector4 *end_color, PN_stdfloat v) {
add_vertex(const LVector4 &vertex, const LVector4 &start_color,
const LVector4 &end_color, PN_stdfloat v) {
CMotionTrailVertex motion_trail_vertex;
motion_trail_vertex._vertex = *vertex;
motion_trail_vertex._start_color = *start_color;
motion_trail_vertex._end_color = *end_color;
motion_trail_vertex._vertex = vertex;
motion_trail_vertex._start_color = start_color;
motion_trail_vertex._end_color = end_color;
motion_trail_vertex._v = v;
motion_trail_vertex._nurbs_curve_evaluator = new NurbsCurveEvaluator();
_vertex_list.push_back(motion_trail_vertex);
_vertex_list.push_back(std::move(motion_trail_vertex));
}
/**
@ -182,14 +125,6 @@ check_for_update(PN_stdfloat current_time) {
return state;
}
/**
*
*/
void CMotionTrail::
begin_geometry() {
begin_geometry(0);
}
/**
*
*/
@ -198,7 +133,6 @@ begin_geometry(int num_quads) {
const int num_vertices = num_quads * 4;
const GeomVertexFormat *format;
_vertex_index = 0;
if (_use_texture) {
format = GeomVertexFormat::get_v3c4t2();
}
@ -266,10 +200,14 @@ begin_geometry(int num_quads) {
}
/**
* LVector3 vertex version.
*
*/
void CMotionTrail::
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) {
add_geometry_quad(
const LPoint3 &v0, const LPoint3 &v1, const LPoint3 &v2, const LPoint3 &v3,
const LVector4 &c0, const LVector4 &c1, const LVector4 &c2, const LVector4 &c3,
const LVector2 &t0, const LVector2 &t1, const LVector2 &t2, const LVector2 &t3) {
_vertex_writer.set_data3(v0);
_vertex_writer.set_data3(v1);
_vertex_writer.set_data3(v2);
@ -288,29 +226,6 @@ add_geometry_quad(LVector3 &v0, LVector3 &v1, LVector3 &v2, LVector3 &v3, LVecto
}
}
/**
* LVector4 vertex version.
*/
void CMotionTrail::
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) {
_vertex_writer.set_data3(v0[0], v0[1], v0[2]);
_vertex_writer.set_data3(v1[0], v1[1], v1[2]);
_vertex_writer.set_data3(v2[0], v2[1], v2[2]);
_vertex_writer.set_data3(v3[0], v3[1], v3[2]);
_color_writer.set_data4(c0);
_color_writer.set_data4(c1);
_color_writer.set_data4(c2);
_color_writer.set_data4(c3);
if (_use_texture) {
_texture_writer.set_data2(t0);
_texture_writer.set_data2(t1);
_texture_writer.set_data2(t2);
_texture_writer.set_data2(t3);
}
}
/**
*
*/
@ -338,11 +253,11 @@ end_geometry() {
* See class header comments.
*/
void CMotionTrail::
update_motion_trail(PN_stdfloat current_time, LMatrix4 *transform) {
int debug = false;
update_motion_trail(PN_stdfloat current_time, const LMatrix4 &transform) {
bool debug = false;
if (!_frame_list.empty()) {
if (_frame_list.front()._transform == UnalignedLMatrix4(*transform)) {
if (_frame_list.front()._transform == transform) {
// duplicate transform
return;
}
@ -387,7 +302,7 @@ update_motion_trail(PN_stdfloat current_time, LMatrix4 *transform) {
{
CMotionTrailFrame motion_trail_frame;
motion_trail_frame._time = current_time;
motion_trail_frame._transform = *transform;
motion_trail_frame._transform = transform;
_frame_list.push_front(std::move(motion_trail_frame));
}
@ -422,45 +337,32 @@ update_motion_trail(PN_stdfloat current_time, LMatrix4 *transform) {
delta_time = current_time - minimum_time;
if (_calculate_relative_matrix) {
inverse_matrix = *transform;
inverse_matrix.invert_in_place();
inverse_matrix.invert_from(transform);
}
if (_use_nurbs && total_frames >= 5) {
// nurbs version
LVector3 vector;
LVector4 v;
LVector4 v0;
LVector4 v1;
LVector4 v2;
LVector4 v3;
LVector4 v0, v1, v2, v3;
PN_stdfloat total_distance = 0.0f;
// reset NurbsCurveEvaluators for each vertex (the starting point for
// the trail)
{
CMotionTrailVertex *motion_trail_vertex;
PT(NurbsCurveEvaluator) nurbs_curve_evaluator;
for (int index = 0; index < total_vertices; ++index) {
motion_trail_vertex = &vertex_array[index];
nurbs_curve_evaluator = motion_trail_vertex->_nurbs_curve_evaluator;
nurbs_curve_evaluator->set_order(4);
nurbs_curve_evaluator->reset(total_segments);
}
for (int index = 0; index < total_vertices; ++index) {
CMotionTrailVertex *motion_trail_vertex = &vertex_array[index];
NurbsCurveEvaluator *nurbs_curve_evaluator;
nurbs_curve_evaluator = motion_trail_vertex->_nurbs_curve_evaluator;
nurbs_curve_evaluator->set_order(4);
nurbs_curve_evaluator->reset(total_segments);
}
// add vertices to each NurbsCurveEvaluator
CMotionTrailFrame motion_trail_frame_start;
CMotionTrailFrame motion_trail_frame_end;
FrameList::iterator frame_iterator;
frame_iterator = _frame_list.begin();
for (int segment_index = 0; segment_index < total_segments; ++segment_index) {
motion_trail_frame_start = *frame_iterator;
const CMotionTrailFrame &motion_trail_frame_start = *frame_iterator;
frame_iterator++;
motion_trail_frame_end = *frame_iterator;
const CMotionTrailFrame &motion_trail_frame_end = *frame_iterator;
if (_calculate_relative_matrix) {
start_transform.multiply(motion_trail_frame_start._transform, inverse_matrix);
@ -471,15 +373,13 @@ update_motion_trail(PN_stdfloat current_time, LMatrix4 *transform) {
end_transform = motion_trail_frame_end._transform;
}
CMotionTrailVertex *motion_trail_vertex_start;
CMotionTrailVertex *motion_trail_vertex_start = &vertex_array[0];
CMotionTrailVertex *motion_trail_vertex_end;
PT(NurbsCurveEvaluator) nurbs_curve_evaluator;
motion_trail_vertex_start = &vertex_array[0];
v0 = start_transform.xform(motion_trail_vertex_start->_vertex);
v2 = end_transform.xform(motion_trail_vertex_start->_vertex);
NurbsCurveEvaluator *nurbs_curve_evaluator;
nurbs_curve_evaluator = motion_trail_vertex_start->_nurbs_curve_evaluator;
nurbs_curve_evaluator->set_vertex(segment_index, v0);
@ -493,15 +393,12 @@ update_motion_trail(PN_stdfloat current_time, LMatrix4 *transform) {
v3 = end_transform.xform(motion_trail_vertex_end->_vertex);
nurbs_curve_evaluator = motion_trail_vertex_end->_nurbs_curve_evaluator;
nurbs_curve_evaluator->set_vertex(segment_index, v1);
if (vertex_segment_index == (total_vertex_segments - 1)) {
PN_stdfloat distance;
v = v1 - v3;
vector.set (v[0], v[1], v[2]);
distance = vector.length();
total_distance += distance;
if (vertex_segment_index == total_vertex_segments - 1) {
LVector3 v = v1.get_xyz() - v3.get_xyz();
LVector3 vector(v[0], v[1], v[2]);
total_distance += vector.length();
}
}
}
@ -511,26 +408,19 @@ update_motion_trail(PN_stdfloat current_time, LMatrix4 *transform) {
nurbs_curve_result_array = new PT(NurbsCurveResult)[total_vertices];
for (int index = 0; index < total_vertices; ++index) {
CMotionTrailVertex *motion_trail_vertex = &vertex_array[index];
CMotionTrailVertex *motion_trail_vertex;
PT(NurbsCurveEvaluator) nurbs_curve_evaluator;
PT(NurbsCurveResult) nurbs_curve_result;
motion_trail_vertex = &vertex_array[index];
nurbs_curve_evaluator = motion_trail_vertex->_nurbs_curve_evaluator;
nurbs_curve_result = nurbs_curve_evaluator->evaluate();
nurbs_curve_result_array[index] = nurbs_curve_result;
PT(NurbsCurveResult) nurbs_curve_result =
motion_trail_vertex->_nurbs_curve_evaluator->evaluate();
if (debug) {
PN_stdfloat nurbs_start_t;
PN_stdfloat nurbs_end_t;
nurbs_start_t = nurbs_curve_result->get_start_t();
nurbs_end_t = nurbs_curve_result->get_end_t();
PN_stdfloat nurbs_start_t = nurbs_curve_result->get_start_t();
PN_stdfloat nurbs_end_t = nurbs_curve_result->get_end_t();
printf("nurbs_start_t %f, nurbs_end_t %f \n", nurbs_start_t, nurbs_end_t);
}
nurbs_curve_result_array[index] = std::move(nurbs_curve_result);
}
// create quads from NurbsCurveResult
@ -543,7 +433,7 @@ update_motion_trail(PN_stdfloat current_time, LMatrix4 *transform) {
begin_geometry(total_curve_segments_int * total_vertex_segments);
{
LVector3 v0, v1, v2, v3;
LPoint3 v0, v1, v2, v3;
LVector4 c0, c1, c2, c3;
LVector2 t0, t1, t2, t3;
@ -553,35 +443,25 @@ update_motion_trail(PN_stdfloat current_time, LMatrix4 *transform) {
for (int curve_segment_index = 0;
curve_segment_index < total_curve_segments_int;
++curve_segment_index) {
PN_stdfloat st;
PN_stdfloat et;
PN_stdfloat start_t;
PN_stdfloat end_t;
PN_stdfloat color_start_t;
PN_stdfloat color_end_t;
CMotionTrailVertex *motion_trail_vertex_start;
CMotionTrailVertex *motion_trail_vertex_end;
PT(NurbsCurveResult) start_nurbs_curve_result;
PT(NurbsCurveResult) end_nurbs_curve_result;
PN_stdfloat st = curve_segment_index / total_curve_segments;
PN_stdfloat et = (curve_segment_index + 1) / total_curve_segments;
st = curve_segment_index / total_curve_segments;
et = (curve_segment_index + 1) / total_curve_segments;
start_t = st;
end_t = et;
PN_stdfloat start_t = st;
PN_stdfloat end_t = et;
if (_square_t) {
start_t *= start_t;
end_t *= end_t;
}
motion_trail_vertex_start = &vertex_array[0];
CMotionTrailVertex *motion_trail_vertex_start = &vertex_array[0];
CMotionTrailVertex *motion_trail_vertex_end;
vertex_start_color = motion_trail_vertex_start->_end_color + (motion_trail_vertex_start->_start_color - motion_trail_vertex_start ->_end_color);
color_start_t = color_scale * start_t;
color_end_t = color_scale * end_t;
PN_stdfloat color_start_t = color_scale * start_t;
PN_stdfloat color_end_t = color_scale * end_t;
c0 = vertex_start_color * one_minus_x(color_start_t);
c2 = vertex_start_color * one_minus_x(color_end_t);
@ -593,27 +473,19 @@ update_motion_trail(PN_stdfloat current_time, LMatrix4 *transform) {
vertex_segment_index < total_vertex_segments;
++vertex_segment_index) {
PN_stdfloat start_nurbs_start_t;
PN_stdfloat start_nurbs_end_t;
PN_stdfloat end_nurbs_start_t;
PN_stdfloat end_nurbs_end_t;
motion_trail_vertex_start = &vertex_array[vertex_segment_index];
motion_trail_vertex_end = &vertex_array[vertex_segment_index + 1];
start_nurbs_curve_result = nurbs_curve_result_array[vertex_segment_index];
end_nurbs_curve_result = nurbs_curve_result_array[vertex_segment_index + 1];
NurbsCurveResult *start_nurbs_curve_result = nurbs_curve_result_array[vertex_segment_index];
NurbsCurveResult *end_nurbs_curve_result = nurbs_curve_result_array[vertex_segment_index + 1];
start_nurbs_start_t = start_nurbs_curve_result->get_start_t();
start_nurbs_end_t = start_nurbs_curve_result->get_end_t();
end_nurbs_start_t = end_nurbs_curve_result->get_start_t();
end_nurbs_end_t = end_nurbs_curve_result->get_end_t();
PN_stdfloat start_nurbs_start_t = start_nurbs_curve_result->get_start_t();
PN_stdfloat start_nurbs_end_t = start_nurbs_curve_result->get_end_t();
PN_stdfloat end_nurbs_start_t = end_nurbs_curve_result->get_start_t();
PN_stdfloat end_nurbs_end_t = end_nurbs_curve_result->get_end_t();
PN_stdfloat start_delta_t;
PN_stdfloat end_delta_t;
start_delta_t = (start_nurbs_end_t - start_nurbs_start_t);
end_delta_t = (end_nurbs_end_t - end_nurbs_start_t);
PN_stdfloat start_delta_t = (start_nurbs_end_t - start_nurbs_start_t);
PN_stdfloat end_delta_t = (end_nurbs_end_t - end_nurbs_start_t);
start_nurbs_curve_result->eval_point(start_nurbs_start_t + (start_delta_t * st), v0);
end_nurbs_curve_result->eval_point(end_nurbs_start_t + (end_delta_t * st), v1);
@ -655,13 +527,6 @@ update_motion_trail(PN_stdfloat current_time, LMatrix4 *transform) {
begin_geometry(total_segments * total_vertex_segments);
PN_stdfloat st;
PN_stdfloat et;
PN_stdfloat start_t;
PN_stdfloat end_t;
PN_stdfloat color_start_t;
PN_stdfloat color_end_t;
LVector4 v0, v1, v2, v3;
LVector4 c0, c1, c2, c3;
LVector2 t0, t1, t2, t3;
@ -669,23 +534,17 @@ update_motion_trail(PN_stdfloat current_time, LMatrix4 *transform) {
LVector4 vertex_start_color;
LVector4 vertex_end_color;
CMotionTrailFrame motion_trail_frame_start;
CMotionTrailFrame motion_trail_frame_end;
FrameList::iterator frame_iterator = _frame_list.begin();
for (int segment_index = 0; segment_index < total_segments; ++segment_index) {
CMotionTrailVertex *motion_trail_vertex_start;
CMotionTrailVertex *motion_trail_vertex_end;
motion_trail_frame_start = *frame_iterator;
const CMotionTrailFrame &motion_trail_frame_start = *frame_iterator;
frame_iterator++;
motion_trail_frame_end = *frame_iterator;
const CMotionTrailFrame &motion_trail_frame_end = *frame_iterator;
start_t = (motion_trail_frame_start._time - minimum_time) / delta_time;
end_t = (motion_trail_frame_end._time - minimum_time) / delta_time;
PN_stdfloat start_t = (motion_trail_frame_start._time - minimum_time) / delta_time;
PN_stdfloat end_t = (motion_trail_frame_end._time - minimum_time) / delta_time;
st = start_t;
et = end_t;
PN_stdfloat st = start_t;
PN_stdfloat et = end_t;
if (_square_t) {
start_t *= start_t;
@ -701,14 +560,15 @@ update_motion_trail(PN_stdfloat current_time, LMatrix4 *transform) {
end_transform = motion_trail_frame_end._transform;
}
motion_trail_vertex_start = &vertex_array[0];
CMotionTrailVertex *motion_trail_vertex_start = &vertex_array[0];
CMotionTrailVertex *motion_trail_vertex_end;
v0 = start_transform.xform(motion_trail_vertex_start->_vertex);
v2 = end_transform.xform(motion_trail_vertex_start->_vertex);
vertex_start_color = motion_trail_vertex_start->_end_color + (motion_trail_vertex_start->_start_color - motion_trail_vertex_start->_end_color);
color_start_t = color_scale * start_t;
color_end_t = color_scale * end_t;
PN_stdfloat color_start_t = color_scale * start_t;
PN_stdfloat color_end_t = color_scale * end_t;
c0 = vertex_start_color * color_start_t;
c2 = vertex_start_color * color_end_t;
@ -734,7 +594,9 @@ update_motion_trail(PN_stdfloat current_time, LMatrix4 *transform) {
t1.set(st, motion_trail_vertex_end->_v);
t3.set(et, motion_trail_vertex_end->_v);
add_geometry_quad(v0, v1, v2, v3, c0, c1, c2, c3, t0, t1, t2, t3);
add_geometry_quad((const LPoint3 &)v0, (const LPoint3 &)v1,
(const LPoint3 &)v2, (const LPoint3 &)v3,
c0, c1, c2, c3, t0, t1, t2, t3);
// reuse calculations
v0 = v1;

View File

@ -21,13 +21,11 @@
#include "geomVertexWriter.h"
#include "geomTriangles.h"
#include "luse.h"
#include "memoryBase.h"
#include "nurbsCurveEvaluator.h"
#include "plist.h"
#include "epvector.h"
class CMotionTrailVertex : public MemoryBase {
public:
struct CMotionTrailVertex : public MemoryBase {
LPoint4 _vertex;
LVecBase4 _start_color;
LVecBase4 _end_color;
@ -36,9 +34,8 @@ public:
PT(NurbsCurveEvaluator) _nurbs_curve_evaluator;
};
class CMotionTrailFrame {
public:
UnalignedLMatrix4 _transform;
struct CMotionTrailFrame : public MemoryBase {
LMatrix4 _transform;
PN_stdfloat _time;
};
@ -72,8 +69,8 @@ public:
*/
class EXPCL_DIRECT_MOTIONTRAIL CMotionTrail : public TypedReferenceCount {
PUBLISHED:
CMotionTrail();
~CMotionTrail();
CMotionTrail() = default;
~CMotionTrail() = default;
void reset();
void reset_vertex_list();
@ -81,65 +78,65 @@ PUBLISHED:
void enable(bool enable);
void set_geom_node(GeomNode *geom_node);
void add_vertex(LVector4 *vertex, LVector4 *start_color, LVector4 *end_color, PN_stdfloat v);
void add_vertex(const LVector4 &vertex, const LVector4 &start_color,
const LVector4 &end_color, PN_stdfloat v);
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);
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);
int check_for_update(PN_stdfloat current_time);
void update_motion_trail(PN_stdfloat current_time, LMatrix4 *transform);
void update_motion_trail(PN_stdfloat current_time, const LMatrix4 &transform);
public:
void begin_geometry();
void begin_geometry(int num_quads);
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);
void 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);
void add_geometry_quad(
const LPoint3 &v0, const LPoint3 &v1, const LPoint3 &v2, const LPoint3 &v3,
const LVector4 &c0, const LVector4 &c1, const LVector4 &c2, const LVector4 &c3,
const LVector2 &t0, const LVector2 &t1, const LVector2 &t2, const LVector2 &t3);
void end_geometry();
int _active;
int _enable;
bool _active = true;
bool _enable = true;
int _pause;
PN_stdfloat _pause_time;
bool _pause = false;
PN_stdfloat _pause_time = 0.0f;
int _fade;
int _fade_end;
PN_stdfloat _fade_time;
PN_stdfloat _fade_start_time;
PN_stdfloat _fade_color_scale;
bool _fade = false;
bool _fade_end = false;
PN_stdfloat _fade_time = 0.0f;
PN_stdfloat _fade_start_time = 0.0f;
PN_stdfloat _fade_color_scale = 1.0f;
PN_stdfloat _last_update_time;
PN_stdfloat _last_update_time = 0.0f;
typedef epvector<CMotionTrailVertex> VertexList;
VertexList _vertex_list;
typedef plist<CMotionTrailFrame> FrameList;
typedef pdeque<CMotionTrailFrame> FrameList;
FrameList _frame_list;
// parameters
PN_stdfloat _color_scale;
PN_stdfloat _sampling_time;
PN_stdfloat _time_window;
bool _square_t;
bool _use_texture;
int _calculate_relative_matrix;
PN_stdfloat _color_scale = 1.0f;
PN_stdfloat _sampling_time = 0.0f;
PN_stdfloat _time_window = 1.0f;
bool _square_t = true;
bool _use_texture = false;
bool _calculate_relative_matrix = false;
// nurbs parameters
bool _use_nurbs;
PN_stdfloat _resolution_distance;
bool _use_nurbs = false;
PN_stdfloat _resolution_distance = 0.5f;
// geom
PT(GeomNode) _geom_node;
// real-time data
int _vertex_index;
PT(GeomVertexData) _vertex_data;
GeomVertexWriter _vertex_writer;
GeomVertexWriter _color_writer;
GeomVertexWriter _texture_writer;
PT(GeomTriangles) _triangles;
CMotionTrailVertex *_vertex_array;
public:
static TypeHandle get_class_type() {
return _type_handle;
@ -156,7 +153,6 @@ public:
private:
static TypeHandle _type_handle;
};
#endif