00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __SOP_Curve_h__
00021 #define __SOP_Curve_h__
00022
00023 #include "SOP_API.h"
00024 #include <math.h>
00025 #include <PRM/PRM_Parm.h>
00026 #include "SOP_Node.h"
00027
00028
00029 #define SC_CVS 0
00030 #define SC_BREAKPOINTS 1
00031 #define SC_FREEHANDDRAW 2
00032
00033 #define SC_POLYGON 0
00034 #define SC_NURBS 1
00035 #define SC_BEZIER 2
00036
00037 #define SC_STR_POINT "%.6g,%.6g,%.6g " // x,y,z
00038 #define SC_STR_WEIGHTED_POINT "%.6g,%.6g,%.6g,%.6g " // x,y,z,w
00039 #define SC_STR_RELATIVE_POINT "@%.6g,%.6g,%.6g " // @x,y,z
00040 #define SC_STR_REL_WEIGHTED_POINT "@%.6g,%.6g,%.6g,%.6g " // @x,y,z,w
00041 #define SC_STR_REF_POINT "p%d " // pn
00042 #define SC_STR_COPY_POINT "P%d " // Pn
00043 #define SC_STR_BREAKPOINT_U "%db[%d] " // xb[u]
00044 #define SC_STR_BREAKPOINT_UV "%db[%d,%d] " // xb[u,v]
00045
00046
00047 class MSS_FaceState;
00048
00049 class SOP_API SOP_Curve : public SOP_Node
00050 {
00051
00052 public:
00053 virtual unsigned disableParms();
00054 virtual const char *inputLabel(unsigned idx) const;
00055 virtual int isRefInput(unsigned int i) const;
00056
00057 static OP_Node *myConstructor(OP_Network*, const char *, OP_Operator*);
00058 static PRM_Template myTemplateList[];
00059
00060 virtual int getTranslateParmIndex();
00061
00062
00063
00064
00065 int calcCVsNeeded(int numverts);
00066
00067 void COORDS(UT_String &str, float t)
00068 { evalString(str, 2, 0, t); }
00069
00070 void SET_COORDS(UT_String &str, CH_StringMeaning meaning,
00071 float t)
00072 { setString(str, meaning, 2, 0, t); }
00073
00074
00075 int TYPE(void) { return evalInt(0, 0, 0); }
00076 void SET_TYPE(int i, bool dflt = false)
00077 {
00078 setInt(0, 0, 0, i);
00079 if (dflt)
00080 getParm(0).overwriteDefaults(0);
00081 }
00082
00083 int METHOD(void) { return evalInt(1, 0, 0); }
00084 void SET_METHOD(int i, bool dflt = false)
00085 {
00086 setInt(1, 0, 0, i);
00087 if (dflt)
00088 getParm(1).overwriteDefaults(0);
00089 }
00090
00091 int CLOSED(void) { return evalInt(4, 0, 0); }
00092 void SET_CLOSED(int i, bool dflt = false)
00093 {
00094 setInt(4, 0, 0, i);
00095 if (dflt)
00096 getParm(4).overwriteDefaults(0);
00097 }
00098
00099
00100 int NORMBASIS(void) { return evalInt(5, 0, 0); }
00101
00102 int ORDER(void) { return evalInt(6, 0, 0); }
00103 void SET_ORDER(int i) { setInt(6, 0, 0, i); }
00104
00105 int PARMTYPE(void) { return evalInt(7, 0, 0); }
00106
00107
00108
00109 float TOLERANCE(float t) { return evalFloat(8, 0, t); }
00110 float SMOOTH(float t) { return evalFloat(9, 0, t); }
00111 int SHARP(void) { return evalInt(10, 0, 0); }
00112
00113 int KEEPINGEO(void) { return evalInt(11, 0, 0); }
00114
00115 protected:
00116 SOP_Curve(OP_Network *net, const char *name, OP_Operator *entry);
00117 virtual ~SOP_Curve();
00118
00119 virtual OP_ERROR cookMySop(OP_Context &context);
00120
00121 private:
00122
00123 int parsePointList(const GU_Detail *ref_gdp,
00124 UT_String &str, OP_Context &context);
00125
00126
00127
00128 int calcCVsNeeded(int create_with_cvs, int face_type, int is_open,
00129 int order, int numverts);
00130
00131 UT_PtrArray<GEO_Point*> myVertexList;
00132 UT_Vector4Array myPointList;
00133
00134 friend class sop_PointParser;
00135 friend class MSS_FaceState;
00136 };
00137
00138 #endif