162 lines
4.4 KiB
Text
162 lines
4.4 KiB
Text
/**
|
|
* PANDA 3D SOFTWARE
|
|
* Copyright (c) Carnegie Mellon University. All rights reserved.
|
|
*
|
|
* All use of this software is subject to the terms of the revised BSD
|
|
* license. You should have received a copy of this license along
|
|
* with this source code in a file named "LICENSE."
|
|
*
|
|
* @file nurbsCurveResult.I
|
|
* @author drose
|
|
* @date 2002-12-04
|
|
*/
|
|
|
|
/**
|
|
*
|
|
*/
|
|
INLINE NurbsCurveResult::
|
|
~NurbsCurveResult() {
|
|
}
|
|
|
|
/**
|
|
* Returns the first legal value of t on the curve. Usually this is 0.0.
|
|
*/
|
|
INLINE PN_stdfloat NurbsCurveResult::
|
|
get_start_t() const {
|
|
return _basis.get_start_t();
|
|
}
|
|
|
|
/**
|
|
* Returns the last legal value of t on the curve.
|
|
*/
|
|
INLINE PN_stdfloat NurbsCurveResult::
|
|
get_end_t() const {
|
|
return _basis.get_end_t();
|
|
}
|
|
|
|
/**
|
|
* Computes the point on the curve corresponding to the indicated value in
|
|
* parametric time. Returns true if the t value is valid, false otherwise.
|
|
*/
|
|
INLINE bool NurbsCurveResult::
|
|
eval_point(PN_stdfloat t, LVecBase3 &point) {
|
|
int segment = find_segment(t);
|
|
if (segment == -1) {
|
|
return false;
|
|
}
|
|
|
|
eval_segment_point(segment, _basis.scale_t(segment, t), point);
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* 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().
|
|
*/
|
|
INLINE bool NurbsCurveResult::
|
|
eval_tangent(PN_stdfloat t, LVecBase3 &tangent) {
|
|
int segment = find_segment(t);
|
|
if (segment == -1) {
|
|
return false;
|
|
}
|
|
|
|
eval_segment_tangent(segment, _basis.scale_t(segment, t), tangent);
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Evaluates the curve in n-dimensional space according to the extended
|
|
* vertices associated with the curve in the indicated dimension.
|
|
*/
|
|
INLINE PN_stdfloat NurbsCurveResult::
|
|
eval_extended_point(PN_stdfloat t, int d) {
|
|
int segment = find_segment(t);
|
|
if (segment == -1) {
|
|
return 0.0f;
|
|
}
|
|
|
|
return eval_segment_extended_point(segment, _basis.scale_t(segment, t), d);
|
|
}
|
|
|
|
/**
|
|
* 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.
|
|
*/
|
|
INLINE bool NurbsCurveResult::
|
|
eval_extended_points(PN_stdfloat t, int d, PN_stdfloat result[], int num_values) {
|
|
int segment = find_segment(t);
|
|
if (segment == -1) {
|
|
return false;
|
|
}
|
|
|
|
eval_segment_extended_points(segment, _basis.scale_t(segment, t), d,
|
|
result, num_values);
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* Returns the number of piecewise continuous segments within the curve. This
|
|
* number is usually not important unless you plan to call
|
|
* eval_segment_point().
|
|
*/
|
|
INLINE int NurbsCurveResult::
|
|
get_num_segments() const {
|
|
return _basis.get_num_segments();
|
|
}
|
|
|
|
/**
|
|
* 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()).
|
|
*/
|
|
INLINE PN_stdfloat NurbsCurveResult::
|
|
get_segment_t(int segment, PN_stdfloat t) const {
|
|
return t * (_basis.get_to(segment) - _basis.get_from(segment)) + _basis.get_from(segment);
|
|
}
|
|
|
|
/**
|
|
* Returns the number of sample points generated by the previous call to
|
|
* adaptive_sample().
|
|
*/
|
|
INLINE int NurbsCurveResult::
|
|
get_num_samples() const {
|
|
return (int)_adaptive_result.size();
|
|
}
|
|
|
|
/**
|
|
* Returns the t value of the nth sample point generated by the previous call
|
|
* to adaptive_sample().
|
|
*/
|
|
INLINE PN_stdfloat NurbsCurveResult::
|
|
get_sample_t(int n) const {
|
|
nassertr(n >= 0 && n < (int)_adaptive_result.size(), 0.0f);
|
|
return _adaptive_result[n]._t;
|
|
}
|
|
|
|
/**
|
|
* 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().
|
|
*/
|
|
INLINE const LPoint3 &NurbsCurveResult::
|
|
get_sample_point(int n) const {
|
|
nassertr(n >= 0 && n < (int)_adaptive_result.size(), LPoint3::zero());
|
|
return _adaptive_result[n]._point;
|
|
}
|
|
|
|
/**
|
|
* 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()).
|
|
*/
|
|
INLINE NurbsCurveResult::AdaptiveSample::
|
|
AdaptiveSample(PN_stdfloat t, const LPoint3 &point) :
|
|
_t(t),
|
|
_point(point)
|
|
{
|
|
}
|