00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025 #ifndef _PHYSICS_CONE_
00026 #define _PHYSICS_CONE_
00027
00028 #include <physics/physics>
00029 #include <physics/ConvexShape>
00030 #include <base/Dimension3>
00031 #include <base/Point3>
00032
00033
00034 namespace physics {
00035
00036
00037 class Cone : virtual public ConvexShape
00038 {
00039 public:
00040 Cone();
00041 explicit Cone(Real height, Real radius=1.0);
00042 Cone(const Cone& c);
00043 virtual ~Cone();
00044
00045 virtual String className() const { return String("Cone"); }
00046
00047 Real height() const { return _height; }
00048 Real radius() const { return _radius; }
00049
00050
00051 virtual base::Object& clone() const { return *NewNamedObj(className()) Cone(*this); }
00052
00053 virtual BoundingBox getBoundingBox() const {
00054 return BoundingBox(gfx::Point3(-_radius,-_radius,_height/2.0),
00055 gfx::Point3(_radius,_radius,_height/2.0));
00056 }
00057
00058 virtual BoundingSphere getBoundingSphere() const
00059 { return BoundingSphere(gfx::Point3(),Math::maximum(_radius,_height/2.0)); }
00060
00061 virtual const MassProperties& getMassProperties(ref<const Material> material) const;
00062
00063 virtual gfx::Segment3 shortestSegmentBetween(const base::Transform& t, const Point3& p) const;
00064 virtual gfx::Segment3 shortestSegmentBetween(const base::Transform& t, const gfx::Segment3& s) const;
00065 virtual gfx::Segment3 shortestSegmentBetween(const base::Transform& t, const gfx::Triangle3& tri) const;
00066 virtual gfx::Segment3 shortestSegmentBetween(const base::Transform& t, const gfx::Quad3& q) const;
00067 virtual gfx::Segment3 shortestSegmentBetween(const base::Transform& t1, ref<const Shape> s, const base::Transform& t2) const;
00068
00069
00070
00071 virtual gfx::Point3 support(const gfx::Vector3& v) const
00072 { throw std::runtime_error(Exception("not implemented")); }
00073
00074
00075 virtual ref<CollisionModel> getCollisionModel(CollisionModel::CollisionModelType modelType) const;
00076
00077
00078 virtual bool visualTypeSupported(VisualType type) const { return (type==OSGVisual); }
00079 virtual osg::Node* createOSGVisual(Attributes visualAttributes=0) const;
00080
00081 virtual void serialize(base::Serializer& s);
00082
00083
00084 virtual bool formatSupported(String format, Real version = 1.0, ExternalizationType type = IO) const;
00085 virtual void externalize(base::Externalizer& e, String format = "", Real version = 1.0);
00086 virtual void externalize(base::Externalizer& e, String format = "", Real version = 1.0) const
00087 { Externalizable::externalize(e,format,version); }
00088
00089 protected:
00090 osg::Node* createOSGCone(Visual::Attributes visualAttributes,
00091 Int slices, Int stacks) const;
00092
00093 private:
00094 Real _height;
00095 Real _radius;
00096
00097 mutable bool massPropertiesCached;
00098 mutable Real density;
00099 mutable MassProperties massProperties;
00100
00101 mutable Visual::Attributes attributes;
00102 mutable ref_ptr<osg::Node> node;
00103
00104 mutable ref<CollisionModel> collisionModel;
00105 mutable CollisionModel::CollisionModelType modelType;
00106 };
00107
00108
00109 }
00110
00111 #endif