00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020 #ifndef __OBJ_StickyShared__
00021 #define __OBJ_StickyShared__
00022
00023 #include "OBJ_API.h"
00024 #include <UT/UT_Vector2.h>
00025 #include <UT/UT_Vector3Array.h>
00026 #include <GU/GU_DetailHandle.h>
00027
00028 #include "OBJ_Null.h"
00029
00030 enum OBJ_StickySharedIndex
00031 {
00032 I_STICKYSHAREDATTRIB = I_N_NULL_INDICES,
00033 I_STICKYSHAREDORIENT,
00034 I_STICKYSHAREDFETCHWORLD,
00035 I_STICKYSHAREDWRAPU,
00036 I_STICKYSHAREDWRAPV,
00037 I_STICKYSHAREDURANGE,
00038 I_STICKYSHAREDVRANGE,
00039 I_STICKYSHAREDASSUMEUVCONSTANT,
00040 I_STICKYSHAREDCLEARUV,
00041
00042 I_N_STICKYSHARED_INDICES
00043 };
00044
00045 class OBJ_UVCache;
00046 class GEO_Vertex;
00047 class GEO_Hull;
00048
00049 class OBJ_API OBJ_StickyShared : public OBJ_Null
00050 {
00051 public:
00052 OBJ_StickyShared(OP_Network *net,
00053 const char *name,
00054 OP_Operator *op);
00055 virtual ~OBJ_StickyShared();
00056
00057 virtual OBJ_OBJECT_TYPE getObjectType() const;
00058
00059 static OP_Node *myConstructor(OP_Network *net,
00060 const char *name,
00061 OP_Operator *entry);
00062
00063 static int clearUVCacheStatic(void *, int, float,
00064 const PRM_Template *);
00065 void clearUVCache();
00066
00067
00068 virtual void get2DWorldTransform(UT_DMatrix4 &mat,
00069 OP_Context &context) {}
00070
00071
00072 virtual void STICKYGEOPATH(UT_String &str, float t) {}
00073 void STICKYATTRIB(UT_String &str, float t)
00074 {
00075 evalString(str, "stickyattrib", 0, t);
00076 }
00077 virtual void STICKYUV(UT_Vector2 &uv, float t) {}
00078 virtual float STICKYROT(float t) { return 0; }
00079 bool FETCHWORLD()
00080 {
00081 return evalInt("fetchworld", 0, 0.0f);
00082 }
00083 bool FETCHORIENT()
00084 {
00085 return evalInt("stickyorient", 0, 0.0f);
00086 }
00087
00088 bool ASSUMEUVCONSTANT(float t)
00089 {
00090 return evalInt("stickyuvconstant", 0, t);
00091 }
00092
00093 bool WRAPU(float t)
00094 {
00095 return evalInt("stickywrapu", 0, t);
00096 }
00097 bool WRAPV(float t)
00098 {
00099 return evalInt("stickywrapu", 0, t);
00100 }
00101
00102 void STICKYURANGE(UT_Vector2 &urange, float t)
00103 {
00104 urange.x() = evalFloat("stickyurange",0,t);
00105 urange.y() = evalFloat("stickyurange",1,t);
00106 }
00107 void STICKYVRANGE(UT_Vector2 &vrange, float t)
00108 {
00109 vrange.x() = evalFloat("stickyvrange",0,t);
00110 vrange.y() = evalFloat("stickyvrange",1,t);
00111 }
00112
00113
00114
00115
00116
00117 float getWorldToUVScaleFactor(float t);
00118
00119
00120
00121 bool isVAxisInverted() const
00122 { return myVAxisInvert; }
00123
00124 protected:
00125 void zeroPrimCacheValues(const GU_Detail *gdp,
00126 int primidx);
00127 void buildHullCacheValues(const GU_Detail *gdp,
00128 const char *uvname,
00129 const GEO_Hull *hull);
00130 void buildPrimCacheValues(const GU_Detail *gdp,
00131 const char *uvname,
00132 int primidx);
00133 void getVertexOrientation(UT_Vector3 &nml,
00134 UT_Vector3 &uaxis,
00135 UT_Vector3 &vaxis,
00136 const GU_Detail *gdp,
00137 const char *uvname,
00138 const GEO_Vertex *v1,
00139 const GEO_Vertex *v2,
00140 const GEO_Vertex *v3);
00141
00142 virtual int *getIndirect() const { return 0; }
00143
00144 virtual OP_ERROR cookMyObj(OP_Context &context);
00145
00146 virtual void getUV(UT_Vector2& uv, OP_Context& context) {}
00147
00148
00149 void rebuildUVCache(float t);
00150
00151 GU_DetailHandle getStuckGdp(float t);
00152
00153
00154 virtual void createInputDependencies(float t);
00155 virtual OP_ERROR lockStickyInputs(OP_Context& context);
00156 virtual void unlockStickyInputs(OP_Context &context);
00157
00158 private:
00159 OBJ_UVCache *myUVCache;
00160 UT_Vector3Array myNmlCache;
00161 UT_Vector3Array myUAxisCache;
00162 UT_Vector3Array myVAxisCache;
00163 UT_PtrArray<UT_IntArray *> myRingZero;
00164 float myLastScaleFactor;
00165 bool myVAxisInvert;
00166 };
00167
00168 #endif
00169