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 __GEO_Quadric_H__
00026 #define __GEO_Quadric_H__
00027
00028 #include "GEO_API.h"
00029 #include <UT/UT_Matrix3.h>
00030 #include "GEO_Primitive.h"
00031 #include "GEO_Vertex.h"
00032
00033 class UT_Matrix4;
00034 class GEO_Point;
00035 class GEO_Detail;
00036
00037
00038
00039 class GEO_API GEO_Quadric : public GEO_Primitive
00040 {
00041 public:
00042 GEO_Quadric(GEO_Detail *d);
00043 virtual ~GEO_Quadric();
00044
00045
00046
00047 virtual unsigned getPrimitiveId() const = 0;
00048 virtual int getBBox(UT_BoundingBox *bbox) const = 0;
00049 virtual UT_Vector3 baryCenter() const;
00050 virtual UT_Vector3 computeNormal() const;
00051 virtual int save(ostream &os, int binary) const;
00052 virtual bool load(UT_IStream &is);
00053
00054
00055
00056
00057
00058 virtual void transform(const UT_Matrix4 &mat);
00059
00060 virtual void untransform(void);
00061 virtual GEO_Primitive *copy(int preserve_shared_pts = 0) const;
00062 virtual void copyPrimitive(const GEO_Primitive *src,
00063 GEO_Point **ptredirect);
00064 virtual void addPointRefToGroup(GB_PointGroup &grp) const;
00065
00066 void changePointRef(GB_Element *from, GB_Element *to);
00067 virtual int vertexApply(int (*a)(GB_Vertex &, void *), void *);
00068 virtual int vertexApply(int (*a)(const GB_Vertex &, void *),
00069 void *) const;
00070 virtual void reverse(void);
00071
00072 virtual unsigned getVertexCount() const;
00073 virtual const GEO_Vertex &getVertex(unsigned idx = 0) const;
00074 virtual GEO_Vertex &getVertex(unsigned idx = 0);
00075
00076
00077
00078
00079
00080
00081 virtual int detachPoints (GB_PointGroup &grp);
00082
00083 virtual int isDegenerate() const;
00084
00085 #if 0
00086 virtual bool evaluatePoint(GEO_Vertex &handle,
00087 GEO_AttributeHandleList &hlist,
00088 fpreal u, fpreal v, uint du, uint dv) const;
00089 virtual int evaluatePoint(UT_Vector4 &pos, float u, float v,
00090 uint du, uint dv) const;
00091 #endif
00092
00093
00094 void getAxes(UT_Vector3 &x, UT_Vector3 &y,
00095 UT_Vector3 &z) const;
00096 void getXAxis(UT_Vector3 &x) const;
00097 void getYAxis(UT_Vector3 &y) const;
00098 void getZAxis(UT_Vector3 &z) const;
00099
00100 void setAxes(const UT_Vector3 &x, const UT_Vector3 &y,
00101 const UT_Vector3 &z);
00102 void setXAxis(const UT_Vector3 &x);
00103 void setYAxis(const UT_Vector3 &y);
00104 void setZAxis(const UT_Vector3 &z);
00105
00106 const UT_Matrix3 &getTransform(void) const { return myXform; }
00107 void setTransform(const UT_Matrix3 &m) { myXform = m; }
00108
00109 void getTransform4( UT_Matrix4 &matx) const;
00110 void setTransform4(const UT_Matrix4 &matx);
00111
00112 void setVertex(GEO_Point *ppt)
00113 {
00114 myVertex.setPt(ppt);
00115 }
00116
00117
00118 virtual void stashed(int onoff);
00119
00120
00121
00122 virtual void unitLengthToUnitPair(float ulength, float vlength,
00123 float &uparm, float &vparm)const;
00124
00125 virtual void unitToUnitLengthPair(float uparm, float vparm,
00126 float &ulength, float &vlength)
00127 const;
00128
00129
00130 virtual bool isQuadric() const { return true; }
00131
00132 protected:
00133
00134 virtual void copyOffsetPrimitive(const GEO_Primitive *src,
00135 int basept);
00136 virtual int savePrivate(ostream &os, int binary) const;
00137 virtual bool loadPrivate(UT_IStream &is);
00138 virtual int pointCanDelete(GB_Element *) const;
00139 virtual void pointDeleted(GB_Element *pt);
00140 virtual int isPointUsed(GB_Element *pt) const;
00141 virtual int isPointGroupUsed(const GB_PointGroup &grp) const;
00142
00143 private:
00144 GEO_Vertex myVertex;
00145 UT_Matrix3 myXform;
00146
00147 friend ostream &operator<<(ostream &os, const GEO_Quadric &d)
00148 {
00149 d.save(os, 0);
00150 return os;
00151 }
00152 char myStashedState;
00153 };
00154
00155 #endif