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 bool get2DWorldTransform(UT_DMatrix4 &mat,
00069 OP_Context &context)
00070 { mat.identity(); return true; }
00071
00072
00073 virtual void STICKYGEOPATH(UT_String &str, float t) {}
00074 void STICKYATTRIB(UT_String &str, float t)
00075 {
00076 evalString(str, "stickyattrib", 0, t);
00077 }
00078 virtual void STICKYUV(UT_Vector2 &uv, float t) {}
00079 virtual float STICKYROT(float t) { return 0; }
00080 bool FETCHWORLD()
00081 {
00082 return evalInt("fetchworld", 0, 0.0f);
00083 }
00084 bool FETCHORIENT()
00085 {
00086 return evalInt("stickyorient", 0, 0.0f);
00087 }
00088
00089 bool ASSUMEUVCONSTANT(float t)
00090 {
00091 return evalInt("stickyuvconstant", 0, t);
00092 }
00093
00094 bool WRAPU(float t)
00095 {
00096 return evalInt("stickywrapu", 0, t);
00097 }
00098 bool WRAPV(float t)
00099 {
00100 return evalInt("stickywrapu", 0, t);
00101 }
00102
00103 void STICKYURANGE(UT_Vector2 &urange, float t)
00104 {
00105 urange.x() = evalFloat("stickyurange",0,t);
00106 urange.y() = evalFloat("stickyurange",1,t);
00107 }
00108 void STICKYVRANGE(UT_Vector2 &vrange, float t)
00109 {
00110 vrange.x() = evalFloat("stickyvrange",0,t);
00111 vrange.y() = evalFloat("stickyvrange",1,t);
00112 }
00113
00114
00115
00116
00117
00118 float getWorldToUVScaleFactor(float t);
00119
00120
00121
00122 bool isVAxisInverted() const
00123 { return myVAxisInvert; }
00124
00125 protected:
00126 void zeroPrimCacheValues(const GU_Detail *gdp,
00127 int primidx);
00128 void buildHullCacheValues(const GU_Detail *gdp,
00129 const char *uvname,
00130 const GEO_Hull *hull);
00131 void buildPrimCacheValues(const GU_Detail *gdp,
00132 const char *uvname,
00133 int primidx);
00134 void getVertexOrientation(UT_Vector3 &nml,
00135 UT_Vector3 &uaxis,
00136 UT_Vector3 &vaxis,
00137 const GU_Detail *gdp,
00138 const char *uvname,
00139 const GEO_Vertex *v1,
00140 const GEO_Vertex *v2,
00141 const GEO_Vertex *v3);
00142
00143 virtual int *getIndirect() const { return 0; }
00144
00145 virtual OP_ERROR cookMyObj(OP_Context &context);
00146
00147 virtual void getUV(UT_Vector2& uv, OP_Context& context) {}
00148
00149
00150 void rebuildUVCache(float t);
00151
00152 GU_DetailHandle getStuckGdp(float t);
00153
00154
00155 virtual void createInputDependencies(float t);
00156 virtual OP_ERROR lockStickyInputs(OP_Context& context);
00157 virtual void unlockStickyInputs(OP_Context &context);
00158
00159 private:
00160 OBJ_UVCache *myUVCache;
00161 UT_Vector3Array myNmlCache;
00162 UT_Vector3Array myUAxisCache;
00163 UT_Vector3Array myVAxisCache;
00164 UT_PtrArray<UT_IntArray *> myRingZero;
00165 float myLastScaleFactor;
00166 bool myVAxisInvert;
00167 };
00168
00169 #endif
00170