113 lines
2.8 KiB
Text
113 lines
2.8 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 eggMesherEdge.I
|
|
* @author drose
|
|
* @date 2005-03-13
|
|
*/
|
|
|
|
/**
|
|
* Defines an edge as a pair of vertices. The _opposite pointer should be
|
|
* filled in explicitly by the caller.
|
|
*/
|
|
INLINE EggMesherEdge::
|
|
EggMesherEdge(int vi_a, int vi_b) : _vi_a(vi_a), _vi_b(vi_b) {
|
|
_opposite = nullptr;
|
|
}
|
|
|
|
/**
|
|
*
|
|
*/
|
|
INLINE EggMesherEdge::
|
|
EggMesherEdge(const EggMesherEdge ©) :
|
|
_vi_a(copy._vi_a),
|
|
_vi_b(copy._vi_b),
|
|
_strips(copy._strips),
|
|
_opposite(copy._opposite)
|
|
{
|
|
}
|
|
|
|
/**
|
|
* Returns true if the edge contains the indicated vertex index, false
|
|
* otherwise.
|
|
*/
|
|
INLINE bool EggMesherEdge::
|
|
contains_vertex(int vi) const {
|
|
return (_vi_a == vi || _vi_b == vi);
|
|
}
|
|
|
|
/**
|
|
* Returns true if this edge represents the same line segment as the other
|
|
* edge, in either direction.
|
|
*/
|
|
INLINE bool EggMesherEdge::
|
|
matches(const EggMesherEdge &other) const {
|
|
return ((_vi_a == other._vi_a && _vi_b == other._vi_b) ||
|
|
(_vi_b == other._vi_a && _vi_a == other._vi_b));
|
|
}
|
|
|
|
/**
|
|
* Returns an arbitrary pointer that is used to represent both this edge and
|
|
* its opposite. this->common_ptr() is guaranteed to be the same as
|
|
* this->_opposite->common_ptr().
|
|
*/
|
|
INLINE EggMesherEdge *EggMesherEdge::
|
|
common_ptr() {
|
|
return std::min(this, _opposite);
|
|
}
|
|
|
|
/**
|
|
*
|
|
*/
|
|
INLINE bool EggMesherEdge::
|
|
operator == (const EggMesherEdge &other) const {
|
|
return _vi_a == other._vi_a && _vi_b == other._vi_b;
|
|
}
|
|
|
|
/**
|
|
*
|
|
*/
|
|
INLINE bool EggMesherEdge::
|
|
operator != (const EggMesherEdge &other) const {
|
|
return !operator == (other);
|
|
}
|
|
|
|
/**
|
|
* Defines an arbitrary ordering for edges, used for putting edges in a sorted
|
|
* container.
|
|
*/
|
|
INLINE bool EggMesherEdge::
|
|
operator < (const EggMesherEdge &other) const {
|
|
if (_vi_a != other._vi_a) {
|
|
return _vi_a < other._vi_a;
|
|
}
|
|
return _vi_b < other._vi_b;
|
|
}
|
|
|
|
/**
|
|
* Returns the length of the edge in model units.
|
|
*/
|
|
INLINE double EggMesherEdge::
|
|
compute_length(const EggVertexPool *vertex_pool) const {
|
|
LPoint3d a = vertex_pool->get_vertex(_vi_a)->get_pos3();
|
|
LPoint3d b = vertex_pool->get_vertex(_vi_b)->get_pos3();
|
|
return (a - b).length();
|
|
}
|
|
|
|
/**
|
|
* Returns a 3-component vector that represents the lengths of the sides of
|
|
* the smalled axis-aligned box that contains the edge. That is, the
|
|
* projection the edge onto each axis.
|
|
*/
|
|
INLINE LVecBase3d EggMesherEdge::
|
|
compute_box(const EggVertexPool *vertex_pool) const {
|
|
LPoint3d a = vertex_pool->get_vertex(_vi_a)->get_pos3();
|
|
LPoint3d b = vertex_pool->get_vertex(_vi_b)->get_pos3();
|
|
LVector3d v = (a - b);
|
|
return LVecBase3d(fabs(v[0]), fabs(v[1]), fabs(v[2]));
|
|
}
|