27 class ConstShapeVisitor;
35 #define META_Shape(library,name) \
36 virtual osg::Object* cloneType() const { return new name(); } \
37 virtual osg::Object* clone(const osg::CopyOp& copyop) const { return new name (*this,copyop); } \
38 virtual bool isSameKindAs(const osg::Object* obj) const { return dynamic_cast<const name *>(obj)!=NULL; } \
39 virtual const char* libraryName() const { return #library; } \
40 virtual const char* className() const { return #name; } \
41 virtual void accept(osg::ShapeVisitor& sv) { sv.apply(*this); } \
42 virtual void accept(osg::ConstShapeVisitor& csv) const { csv.apply(*this); }
73 virtual const char*
className()
const {
return "Shape"; }
100 class CompositeShape;
151 _center(0.0f,0.0f,0.0f),
159 Shape(sphere,copyop),
160 _center(sphere._center),
161 _radius(sphere._radius) {}
165 inline bool valid()
const {
return _radius>=0.0f; }
167 inline void set(
const Vec3& center,
float radius)
176 inline void setRadius(
float radius) { _radius = radius; }
193 _center(0.0f,0.0f,0.0f),
194 _halfLengths(0.5f,0.5f,0.5f) {}
198 _halfLengths(width*0.5f,width*0.5f,width*0.5f) {}
200 Box(
const osg::Vec3& center,
float lengthX,
float lengthY,
float lengthZ):
202 _halfLengths(lengthX*0.5f,lengthY*0.5f,lengthZ*0.5f) {}
206 _center(box._center),
207 _halfLengths(box._halfLengths),
208 _rotation(box._rotation) {}
212 inline bool valid()
const {
return _halfLengths.x()>=0.0f; }
217 _halfLengths = halfLengths;
248 _center(0.0f,0.0f,0.0f),
259 _center(cone._center),
260 _radius(cone._radius),
261 _height(cone._height),
262 _rotation(cone._rotation) {}
266 inline bool valid()
const {
return _radius>=0.0f; }
278 inline void setRadius(
float radius) { _radius = radius; }
290 inline float getBaseOffset()
const {
return -getBaseOffsetFactor()*getHeight(); }
308 _center(0.0f,0.0f,0.0f),
318 Shape(cylinder,copyop),
319 _center(cylinder._center),
320 _radius(cylinder._radius),
321 _height(cylinder._height),
322 _rotation(cylinder._rotation) {}
326 inline bool valid()
const {
return _radius>=0.0f; }
338 inline void setRadius(
float radius) { _radius = radius; }
364 _center(0.0f,0.0f,0.0f),
374 Shape(capsule,copyop),
375 _center(capsule._center),
376 _radius(capsule._radius),
377 _height(capsule._height),
378 _rotation(capsule._rotation) {}
382 inline bool valid()
const {
return _radius>=0.0f; }
394 inline void setRadius(
float radius) { _radius = radius; }
441 _vertices(mesh._vertices),
442 _indices(mesh._indices) {}
493 void allocate(
unsigned int numColumns,
unsigned int numRows);
539 inline void setHeight(
unsigned int c,
unsigned int r,
float value)
541 (*_heights)[c+r*_columns] = value;
547 return (*_heights)[c+r*_columns];
551 inline float getHeight(
unsigned int c,
unsigned int r)
const
553 return (*_heights)[c+r*_columns];
558 return Vec3(_origin.x()+getXInterval()*(float)c,
559 _origin.y()+getYInterval()*(float)r,
560 _origin.z()+(*_heights)[c+r*_columns]);
563 Vec3 getNormal(
unsigned int c,
unsigned int r)
const;
565 Vec2 getHeightDelta(
unsigned int c,
unsigned int r)
const;
600 _children(cs._children) {}
614 unsigned int getNumChildren()
const {
return static_cast<unsigned int>(_children.size()); }
626 void removeChild(
unsigned int i) { _children.erase(_children.begin()+i); }
632 for (
unsigned int childNo=0;childNo<_children.size();++childNo)
634 if (_children[childNo]==shape)
return childNo;
636 return static_cast<unsigned int>(_children.size());
unsigned int _borderWidth
Matrix computeRotationMatrix() const
const osg::FloatArray * getFloatArray() const
Cone(const Cone &cone, const CopyOp ©op=CopyOp::SHALLOW_COPY)
void setIndices(IndexArray *indices)
unsigned int findChildNo(Shape *shape) const
void setCenter(const Vec3 ¢er)
const osg::Vec3 & getOrigin() const
virtual void apply(const Sphere &)
bool zeroRotation() const
const Vec3 & getHalfLengths() const
void setCenter(const Vec3 ¢er)
std::vector< ref_ptr< Shape > > ChildList
void setRadius(float radius)
virtual void apply(Cylinder &)
virtual void apply(const Cylinder &)
void setRotation(const Quat &quat)
const Shape * getChild(unsigned int i) const
void removeChild(unsigned int i)
void setHeight(float height)
Capsule(const osg::Vec3 ¢er, float radius, float height)
virtual void apply(Box &)
Cylinder(const Cylinder &cylinder, const CopyOp ©op=CopyOp::SHALLOW_COPY)
Matrix computeRotationMatrix() const
float getYInterval() const
void setRadius(float radius)
virtual void apply(const ConvexHull &)
virtual void apply(InfinitePlane &)
Capsule(const Capsule &capsule, const CopyOp ©op=CopyOp::SHALLOW_COPY)
HeightList & getHeightList()
void set(const Vec3 ¢er, float radius, float height)
float getHeight(unsigned int c, unsigned int r) const
void setRotation(const Quat &quat)
void setHeight(unsigned int c, unsigned int r, float value)
Matrix computeRotationMatrix() const
float getSkirtHeight() const
const Quat & getRotation() const
std::vector< float > HeightList
void setHeight(float height)
void setRotation(const Quat &quat)
virtual void apply(Cone &)
Box(const osg::Vec3 ¢er, float width)
Sphere(const Sphere &sphere, const CopyOp ©op=CopyOp::SHALLOW_COPY)
T * clone(const T *t, const osg::CopyOp ©op=osg::CopyOp::SHALLOW_COPY)
unsigned int getBorderWidth() const
virtual void apply(CompositeShape &)
void set(const Vec3 ¢er, float radius, float height)
const Vec3 & getCenter() const
void set(const Vec3 ¢er, float radius)
void setYInterval(float dy)
unsigned int getNumChildren() const
bool zeroRotation() const
float & getHeight(unsigned int c, unsigned int r)
GLint GLenum GLsizei width
Matrix computeRotationMatrix() const
void set(const Vec3 ¢er, const Vec3 &halfLengths)
float getBaseOffsetFactor() const
Shape * getChild(unsigned int i)
void setRadius(float radius)
void setCenter(const Vec3 ¢er)
const IndexArray * getIndices() const
ConvexHull(const ConvexHull &hull, const CopyOp ©op=CopyOp::SHALLOW_COPY)
void addChild(Shape *shape)
T * cloneType(const T *t)
void setXInterval(float dx)
Cone(const osg::Vec3 ¢er, float radius, float height)
virtual void apply(const InfinitePlane &)
const HeightList & getHeightList() const
const Quat & getRotation() const
bool zeroRotation() const
const Vec3 & getCenter() const
virtual void apply(const Cone &)
osg::ref_ptr< osg::FloatArray > _heights
virtual void apply(const TriangleMesh &)
void setOrigin(const osg::Vec3 &origin)
virtual void apply(const Box &)
ref_ptr< IndexArray > _indices
Box(const Box &box, const CopyOp ©op=CopyOp::SHALLOW_COPY)
void setShape(Shape *shape)
osg::FloatArray * getFloatArray()
const Quat & getRotation() const
const Vec3Array * getVertices() const
GLint GLenum GLsizei GLsizei height
void setCenter(const Vec3 ¢er)
virtual void apply(ConvexHull &)
void setRotation(const Quat &quat)
Vec3 getVertex(unsigned int c, unsigned int r) const
A plane class. It can be used to represent an infinite plane.
Shape(const Shape &sa, const CopyOp ©op=CopyOp::SHALLOW_COPY)
virtual void apply(const HeightField &)
Cylinder(const osg::Vec3 ¢er, float radius, float height)
Box(const osg::Vec3 ¢er, float lengthX, float lengthY, float lengthZ)
Sphere(const osg::Vec3 ¢er, float radius)
const Quat & getRotation() const
IndexArray * getIndices()
#define META_Shape(library, name)
virtual void apply(const CompositeShape &)
void setCenter(const Vec3 ¢er)
float getBaseOffset() const
const Quat & getRotation() const
virtual const char * libraryName() const
void setHeight(float height)
virtual void apply(Capsule &)
float getXInterval() const
unsigned int getNumColumns() const
void setBorderWidth(unsigned int borderWidth)
virtual void apply(Shape &)
Matrix computeRotationMatrix() const
const Vec3 & getCenter() const
InfinitePlane(const InfinitePlane &plane, const CopyOp ©op=CopyOp::SHALLOW_COPY)
virtual const char * className() const
void setHalfLengths(const Vec3 &halfLengths)
void setRadius(float radius)
CompositeShape(const CompositeShape &cs, const CopyOp ©op=CopyOp::SHALLOW_COPY)
ref_ptr< Vec3Array > _vertices
void setRotation(const Quat &quat)
TriangleMesh(const TriangleMesh &mesh, const CopyOp ©op=CopyOp::SHALLOW_COPY)
Vec3Array * getVertices()
void set(const Vec3 ¢er, float radius, float height)
void setVertices(Vec3Array *vertices)
virtual bool isSameKindAs(const Object *obj) const
const Shape * getShape() const
virtual void apply(const Shape &)
virtual void apply(TriangleMesh &)
unsigned int getNumRows() const
bool zeroRotation() const
void setSkirtHeight(float skirtHeight)
const Vec3 & getCenter() const
const Vec3 & getCenter() const
bool zeroRotation() const
virtual void apply(HeightField &)
virtual void apply(Sphere &)
virtual void apply(const Capsule &)