Panda3D
|
The result of a NurbsCurveEvaluator. More...
#include "nurbsCurveResult.h"
Classes | |
class | AdaptiveSample |
Public Member Functions | |
NurbsCurveResult (const NurbsBasisVector &basis, const LVecBase4f vecs[], const NurbsVertex *verts, int num_vertices) | |
The constructor automatically builds up the result as the product of the indicated set of basis matrices and the indicated table of control vertex positions. | |
void | adaptive_sample (float tolerance) |
Determines the set of subdivisions necessary to approximate the curve with a set of linear segments, no point of which is farther than tolerance units from the actual curve. | |
float | eval_extended_point (float t, int d) |
Evaluates the curve in n-dimensional space according to the extended vertices associated with the curve in the indicated dimension. | |
bool | eval_extended_points (float t, int d, float result[], int num_values) |
Simultaneously performs eval_extended_point on a contiguous sequence of dimensions. | |
bool | eval_point (float t, LVecBase3f &point) |
Computes the point on the curve corresponding to the indicated value in parametric time. | |
float | eval_segment_extended_point (int segment, float t, int d) const |
Evaluates the curve in n-dimensional space according to the extended vertices associated with the curve in the indicated dimension. | |
void | eval_segment_extended_points (int segment, float t, int d, float result[], int num_values) const |
Simultaneously performs eval_extended_point on a contiguous sequence of dimensions. | |
void | eval_segment_point (int segment, float t, LVecBase3f &point) const |
Evaluates the point on the curve corresponding to the indicated value in parametric time within the indicated curve segment. | |
void | eval_segment_tangent (int segment, float t, LVecBase3f &tangent) const |
As eval_segment_point, but computes the tangent to the curve at the indicated point. | |
bool | eval_tangent (float t, LVecBase3f &tangent) |
Computes the tangent to the curve at the indicated point in parametric time. | |
float | get_end_t () const |
Returns the last legal value of t on the curve. | |
int | get_num_samples () const |
Returns the number of sample points generated by the previous call to adaptive_sample(). | |
int | get_num_segments () const |
Returns the number of piecewise continuous segments within the curve. | |
int | get_ref_count () const |
Returns the current reference count. | |
const LPoint3f & | get_sample_point (int n) const |
Returns the point on the curve of the nth sample point generated by the previous call to adaptive_sample(). | |
float | get_sample_t (int n) const |
Returns the t value of the nth sample point generated by the previous call to adaptive_sample(). | |
float | get_segment_t (int segment, float t) const |
Accepts a t value in the range [0, 1], and assumed to be relative to the indicated segment (as in eval_segment_point()), and returns the corresponding t value in the entire curve (as in eval_point()). | |
float | get_start_t () const |
Returns the first legal value of t on the curve. | |
WeakReferenceList * | get_weak_list () const |
Returns the WeakReferenceList associated with this ReferenceCount object. | |
bool | has_weak_list () const |
Returns true if this particular ReferenceCount object has a WeakReferenceList created, false otherwise. | |
void | local_object () |
This function should be called, once, immediately after creating a new instance of some ReferenceCount-derived object on the stack. | |
MAKE_SEQ (get_sample_ts, get_num_samples, get_sample_t) | |
MAKE_SEQ (get_sample_points, get_num_samples, get_sample_points) | |
void | operator delete (void *ptr) |
void | operator delete (void *ptr, void *) |
void | operator delete[] (void *, void *) |
void | operator delete[] (void *ptr) |
void * | operator new (size_t size, void *ptr) |
void * | operator new (size_t size) |
void * | operator new[] (size_t size, void *ptr) |
void * | operator new[] (size_t size) |
void | ref () const |
Explicitly increments the reference count. | |
bool | test_ref_count_integrity () const |
Does some easy checks to make sure that the reference count isn't completely bogus. | |
bool | test_ref_count_nonzero () const |
Does some easy checks to make sure that the reference count isn't zero, or completely bogus. | |
virtual bool | unref () const |
Explicitly decrements the reference count. | |
void | weak_ref (WeakPointerToVoid *ptv) |
Adds the indicated PointerToVoid as a weak reference to this object. | |
void | weak_unref (WeakPointerToVoid *ptv) |
Removes the indicated PointerToVoid as a weak reference to this object. | |
Static Public Member Functions | |
static TypeHandle | get_class_type () |
static void | init_type () |
Protected Member Functions | |
bool | do_test_ref_count_integrity () const |
Does some easy checks to make sure that the reference count isn't completely bogus. | |
bool | do_test_ref_count_nonzero () const |
Returns true if the reference count is nonzero, false otherwise. |
The result of a NurbsCurveEvaluator.
This object represents a curve in a particular coordinate space. It can return the point and/or tangent to the curve at any point.
This is not related to NurbsCurve, CubicCurveseg or any of the ParametricCurve-derived objects in this module. It is a completely parallel implementation of NURBS curves, and will probably eventually replace the whole ParametricCurve class hierarchy.
Definition at line 38 of file nurbsCurveResult.h.
NurbsCurveResult::NurbsCurveResult | ( | const NurbsBasisVector & | basis, |
const LVecBase4f | vecs[], | ||
const NurbsVertex * | verts, | ||
int | num_vertices | ||
) |
The constructor automatically builds up the result as the product of the indicated set of basis matrices and the indicated table of control vertex positions.
Definition at line 27 of file nurbsCurveResult.cxx.
References NurbsBasisVector::get_basis(), NurbsBasisVector::get_num_segments(), NurbsBasisVector::get_order(), NurbsBasisVector::get_vertex_index(), LMatrix4f::set_row(), and LVecBase4f::zero().
void NurbsCurveResult::adaptive_sample | ( | float | tolerance | ) |
Determines the set of subdivisions necessary to approximate the curve with a set of linear segments, no point of which is farther than tolerance units from the actual curve.
After this call, you may walk through the resulting set of samples with get_num_samples(), get_sample_t(), and get_sample_point().
Definition at line 211 of file nurbsCurveResult.cxx.
References LVecBase3f::almost_equal(), eval_segment_point(), NurbsBasisVector::get_from(), and NurbsBasisVector::get_num_segments().
bool ReferenceCount::do_test_ref_count_integrity | ( | ) | const [protected, inherited] |
Does some easy checks to make sure that the reference count isn't completely bogus.
Returns true if ok, false otherwise.
Reimplemented in NodeReferenceCount, CachedTypedWritableReferenceCount, and NodeCachedReferenceCount.
Definition at line 29 of file referenceCount.cxx.
Referenced by ReferenceCount::do_test_ref_count_nonzero(), and ReferenceCount::test_ref_count_integrity().
bool ReferenceCount::do_test_ref_count_nonzero | ( | ) | const [protected, inherited] |
Returns true if the reference count is nonzero, false otherwise.
Definition at line 56 of file referenceCount.cxx.
References ReferenceCount::do_test_ref_count_integrity().
Referenced by ReferenceCount::test_ref_count_nonzero().
float NurbsCurveResult::eval_extended_point | ( | float | t, |
int | d | ||
) | [inline] |
Evaluates the curve in n-dimensional space according to the extended vertices associated with the curve in the indicated dimension.
Definition at line 91 of file nurbsCurveResult.I.
References eval_segment_extended_point(), and NurbsBasisVector::scale_t().
bool NurbsCurveResult::eval_extended_points | ( | float | t, |
int | d, | ||
float | result[], | ||
int | num_values | ||
) | [inline] |
Simultaneously performs eval_extended_point on a contiguous sequence of dimensions.
The dimensions evaluated are d through (d + num_values - 1); the results are filled into the num_values elements in the indicated result array.
Definition at line 110 of file nurbsCurveResult.I.
References eval_segment_extended_points(), and NurbsBasisVector::scale_t().
bool NurbsCurveResult::eval_point | ( | float | t, |
LVecBase3f & | point | ||
) | [inline] |
Computes the point on the curve corresponding to the indicated value in parametric time.
Returns true if the t value is valid, false otherwise.
Definition at line 54 of file nurbsCurveResult.I.
References eval_segment_point(), and NurbsBasisVector::scale_t().
float NurbsCurveResult::eval_segment_extended_point | ( | int | segment, |
float | t, | ||
int | d | ||
) | const |
Evaluates the curve in n-dimensional space according to the extended vertices associated with the curve in the indicated dimension.
Definition at line 118 of file nurbsCurveResult.cxx.
References NurbsBasisVector::get_basis(), NurbsVertex::get_extended_vertex(), NurbsBasisVector::get_num_segments(), NurbsBasisVector::get_order(), LMatrix4f::get_row(), and NurbsBasisVector::get_vertex_index().
Referenced by eval_extended_point().
void NurbsCurveResult::eval_segment_extended_points | ( | int | segment, |
float | t, | ||
int | d, | ||
float | result[], | ||
int | num_values | ||
) | const |
Simultaneously performs eval_extended_point on a contiguous sequence of dimensions.
The dimensions evaluated are d through (d + num_values - 1); the results are filled into the num_values elements in the indicated result array.
Definition at line 162 of file nurbsCurveResult.cxx.
References NurbsBasisVector::get_basis(), NurbsVertex::get_extended_vertex(), NurbsBasisVector::get_num_segments(), NurbsBasisVector::get_order(), LMatrix4f::get_row(), and NurbsBasisVector::get_vertex_index().
Referenced by eval_extended_points().
void NurbsCurveResult::eval_segment_point | ( | int | segment, |
float | t, | ||
LVecBase3f & | point | ||
) | const |
Evaluates the point on the curve corresponding to the indicated value in parametric time within the indicated curve segment.
t should be in the range [0, 1].
The curve is internally represented as a number of connected (or possibly unconnected) piecewise continuous segments. The exact number of segments for a particular curve depends on the knot vector, and is returned by get_num_segments(). Normally, eval_point() is used to evaluate a point along the continuous curve, but when you care more about local continuity, you can use eval_segment_point() to evaluate the points along each segment.
Definition at line 81 of file nurbsCurveResult.cxx.
Referenced by adaptive_sample(), and eval_point().
void NurbsCurveResult::eval_segment_tangent | ( | int | segment, |
float | t, | ||
LVecBase3f & | tangent | ||
) | const |
As eval_segment_point, but computes the tangent to the curve at the indicated point.
The tangent vector will not necessarily be normalized, and could be zero, particularly at the endpoints.
Definition at line 101 of file nurbsCurveResult.cxx.
Referenced by eval_tangent().
bool NurbsCurveResult::eval_tangent | ( | float | t, |
LVecBase3f & | tangent | ||
) | [inline] |
Computes the tangent to the curve at the indicated point in parametric time.
This tangent vector will not necessarily be normalized, and could be zero. See also eval_point().
Definition at line 73 of file nurbsCurveResult.I.
References eval_segment_tangent(), and NurbsBasisVector::scale_t().
float NurbsCurveResult::get_end_t | ( | ) | const [inline] |
Returns the last legal value of t on the curve.
Definition at line 42 of file nurbsCurveResult.I.
References NurbsBasisVector::get_end_t().
int NurbsCurveResult::get_num_samples | ( | ) | const [inline] |
Returns the number of sample points generated by the previous call to adaptive_sample().
Definition at line 154 of file nurbsCurveResult.I.
int NurbsCurveResult::get_num_segments | ( | ) | const [inline] |
Returns the number of piecewise continuous segments within the curve.
This number is usually not important unless you plan to call eval_segment_point().
Definition at line 130 of file nurbsCurveResult.I.
References NurbsBasisVector::get_num_segments().
int ReferenceCount::get_ref_count | ( | ) | const [inline, inherited] |
Returns the current reference count.
Definition at line 155 of file referenceCount.I.
References ReferenceCount::test_ref_count_integrity().
Referenced by TransformState::clear_cache(), RenderState::clear_cache(), RenderState::finalize(), RenderEffects::finalize(), RenderEffect::finalize(), RenderAttrib::finalize(), InternalName::finalize(), TransformState::get_num_unused_states(), RenderState::get_num_unused_states(), TransformState::list_cycles(), RenderState::list_cycles(), GeomVertexFormat::remove_column(), TransformState::unref(), RenderState::unref(), RenderState::~RenderState(), and TransformState::~TransformState().
const LPoint3f & NurbsCurveResult::get_sample_point | ( | int | n | ) | const [inline] |
Returns the point on the curve of the nth sample point generated by the previous call to adaptive_sample().
For tangents, or extended points, you should use get_sample_t() and pass it into eval_tangent() or eval_extended_point().
Definition at line 182 of file nurbsCurveResult.I.
References LPoint3f::zero().
float NurbsCurveResult::get_sample_t | ( | int | n | ) | const [inline] |
Returns the t value of the nth sample point generated by the previous call to adaptive_sample().
Definition at line 165 of file nurbsCurveResult.I.
float NurbsCurveResult::get_segment_t | ( | int | segment, |
float | t | ||
) | const [inline] |
Accepts a t value in the range [0, 1], and assumed to be relative to the indicated segment (as in eval_segment_point()), and returns the corresponding t value in the entire curve (as in eval_point()).
Definition at line 143 of file nurbsCurveResult.I.
References NurbsBasisVector::get_from(), and NurbsBasisVector::get_to().
float NurbsCurveResult::get_start_t | ( | ) | const [inline] |
Returns the first legal value of t on the curve.
Usually this is 0.0.
Definition at line 32 of file nurbsCurveResult.I.
References NurbsBasisVector::get_start_t().
WeakReferenceList * ReferenceCount::get_weak_list | ( | ) | const [inline, inherited] |
Returns the WeakReferenceList associated with this ReferenceCount object.
If there has never been a WeakReferenceList associated with this object, creates one now.
Definition at line 307 of file referenceCount.I.
Referenced by ReferenceCount::weak_ref().
bool ReferenceCount::has_weak_list | ( | ) | const [inline, inherited] |
Returns true if this particular ReferenceCount object has a WeakReferenceList created, false otherwise.
In general, this will be true if there was ever a WeakPointerTo created for this object (even if there is not any for it now).
Definition at line 294 of file referenceCount.I.
Referenced by ReferenceCount::weak_unref().
void ReferenceCount::local_object | ( | ) | [inline, inherited] |
This function should be called, once, immediately after creating a new instance of some ReferenceCount-derived object on the stack.
This allows the object to be passed to functions that will increment and decrement the object's reference count temporarily, and it will prevent the object from being deleted (inappropriately), when the reference count returns to zero. It actually achieves this by setting a large positive value in the reference count field.
Definition at line 276 of file referenceCount.I.
Referenced by PGTop::cull_callback(), BoundingSphere::extend_by_hexahedron(), AsyncTaskManager::find_task(), AsyncTaskManager::find_tasks(), and AsyncTaskManager::find_tasks_matching().
void ReferenceCount::ref | ( | ) | const [inline, inherited] |
Explicitly increments the reference count.
User code should avoid using ref() and unref() directly, which can result in missed reference counts. Instead, let a PointerTo object manage the reference counting automatically.
This function is const, even though it changes the object, because generally fiddling with an object's reference count isn't considered part of fiddling with the object. An object might be const in other ways, but we still need to accurately count the number of references to it.
Definition at line 179 of file referenceCount.I.
References ReferenceCount::test_ref_count_integrity().
Referenced by CachedTypedWritableReferenceCount::cache_ref(), TypedWritable::decode_raw_from_bam_stream(), NodeCachedReferenceCount::node_ref(), NodeReferenceCount::node_ref(), BamCacheRecord::set_data(), CullableObject::set_draw_callback(), and ModelRoot::set_reference().
bool ReferenceCount::test_ref_count_integrity | ( | ) | const [inline, inherited] |
Does some easy checks to make sure that the reference count isn't completely bogus.
Returns true if ok, false otherwise.
Reimplemented in NodeReferenceCount, CachedTypedWritableReferenceCount, and NodeCachedReferenceCount.
Definition at line 236 of file referenceCount.I.
References ReferenceCount::do_test_ref_count_integrity().
Referenced by EggGroupNode::add_child(), InternalName::find_ancestor(), InternalName::get_ancestor(), ReferenceCount::get_ref_count(), InternalName::get_top(), ReferenceCount::ref(), EggVertex::test_gref_integrity(), EggVertex::test_pref_integrity(), EggNode::test_under_integrity(), EggPrimitive::test_vref_integrity(), EggGroup::test_vref_integrity(), MouseWatcher::throw_event_pattern(), ReferenceCount::unref(), and EggNode::update_under().
bool ReferenceCount::test_ref_count_nonzero | ( | ) | const [inline, inherited] |
Does some easy checks to make sure that the reference count isn't zero, or completely bogus.
Returns true if ok, false otherwise.
Definition at line 252 of file referenceCount.I.
References ReferenceCount::do_test_ref_count_nonzero().
Referenced by CopyOnWritePointer::test_ref_count_nonzero().
bool ReferenceCount::unref | ( | ) | const [inline, virtual, inherited] |
Explicitly decrements the reference count.
Note that the object will not be implicitly deleted by unref() simply because the reference count drops to zero. (Having a member function delete itself is problematic.) However, see the helper function unref_delete().
User code should avoid using ref() and unref() directly, which can result in missed reference counts. Instead, let a PointerTo object manage the reference counting automatically.
This function is const, even though it changes the object, because generally fiddling with an object's reference count isn't considered part of fiddling with the object. An object might be const in other ways, but we still need to accurately count the number of references to it.
The return value is true if the new reference count is nonzero, false if it is zero.
Reimplemented in GeomVertexArrayFormat, GeomVertexFormat, InternalName, RenderAttrib, RenderEffects, RenderState, and TransformState.
Definition at line 214 of file referenceCount.I.
References ReferenceCount::test_ref_count_integrity().
Referenced by CachedTypedWritableReferenceCount::cache_unref(), TypedWritable::decode_raw_from_bam_stream(), RenderEffect::finalize(), NodeCachedReferenceCount::node_unref(), NodeReferenceCount::node_unref(), TransformState::unref(), RenderState::unref(), RenderEffects::unref(), RenderAttrib::unref(), InternalName::unref(), GeomVertexFormat::unref(), and GeomVertexArrayFormat::unref().
void ReferenceCount::weak_ref | ( | WeakPointerToVoid * | ptv | ) | [inline, inherited] |
Adds the indicated PointerToVoid as a weak reference to this object.
Definition at line 321 of file referenceCount.I.
References WeakReferenceList::add_reference(), and ReferenceCount::get_weak_list().
void ReferenceCount::weak_unref | ( | WeakPointerToVoid * | ptv | ) | [inline, inherited] |
Removes the indicated PointerToVoid as a weak reference to this object.
It must have previously been added via a call to weak_ref().
Definition at line 334 of file referenceCount.I.
References WeakReferenceList::clear_reference(), and ReferenceCount::has_weak_list().