00001 #ifndef RixSubdEval_h
00002 #define RixSubdEval_h
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029 #include "RixInterfaces.h"
00030
00031 class RixSubdivisionMesh;
00032 class RixSubdivisionFace;
00033 class RixSudivisionVertex;
00034
00036 class RixSubdivisionSurfaceEvaluation : public RixInterface
00037 {
00038 public:
00041 virtual RixSubdivisionMesh *GetSubdivisionMesh(const char *handle) = 0;
00042
00044 virtual RixSubdivisionMesh *CreateSubdivisionMesh(const RtToken mask,
00045 int nfaces, const int *nverts, const int *verts, int ntags,
00046 RtToken const *tags, int *ntagargs, int *intargs, float *floatargs,
00047 char * const *stringargs, int nparms, RtToken const *tokens,
00048 void **data) = 0;
00049
00051 virtual void DestroySubdivisionMesh(RixSubdivisionMesh *mesh) = 0;
00052
00053 protected:
00055 RixSubdivisionSurfaceEvaluation() : RixInterface(2) { }
00056 };
00057
00059 class RixSubdivisionVertex
00060 {
00061 protected:
00062 virtual ~RixSubdivisionVertex() { }
00063
00064 public:
00067 virtual int GetID() = 0;
00068
00073 virtual int GetDataIndex() = 0;
00074
00083 virtual bool GetValue(const RtToken name, int width, float *data) = 0;
00084
00093 virtual bool GetValue(const RtToken name, int width, const RtToken space, float *data) = 0;
00094 };
00095
00097 class RixSubdivisionFace {
00098 protected:
00100 virtual ~RixSubdivisionFace() { }
00101
00102 public:
00105 virtual int GetID() = 0;
00106
00108 virtual int GetNumVertices() = 0;
00109
00113 virtual RixSubdivisionVertex *GetVertex(int vertex) = 0;
00114
00116 virtual void GetBound(RtBound bound) = 0;
00117
00119 virtual void GetBound(const RtToken space, RtBound bound) = 0;
00120
00132 virtual RixSubdivisionFace *GetNeighboringFace(int edge,
00133 int *reverseEdge = 0) = 0;
00134
00137 virtual void Subdivide() = 0;
00138
00151 virtual RixSubdivisionFace *GetChildFace(int vertex,
00152 int *childVertex = 0) = 0;
00153
00156 virtual RixSubdivisionFace *GetParentFace() = 0;
00157
00167 virtual bool GetVertexValue(int vertex, const RtToken name, int width,
00168 float *data) = 0;
00169
00179 virtual bool GetVertexValue(int vertex, const RtToken name,
00180 int width, const RtToken space, float *data) = 0;
00181
00182
00186 virtual bool GetStringValue(const RtToken name, std::string& data) = 0;
00187
00192 virtual bool HasLimitSurface() = 0;
00193
00204 virtual bool EvaluateAtLimit(float u, float v, const RtToken name,
00205 int width, float *data) = 0;
00206
00217 virtual bool EvaluateAtLimitMultiple(int nevals, float *u, float *v, const RtToken name,
00218 int width, const RtToken space, float *data) = 0;
00219
00220
00231 virtual void SetLimitEvaluationAccuracy(const RtToken space, float distance) = 0;
00232
00233 };
00234
00235
00237 class RixSubdivisionMesh {
00238 protected:
00240 virtual ~RixSubdivisionMesh() { }
00241
00242 public:
00244 virtual RtToken GetMask() = 0;
00245
00248 virtual int GetNumFaces() = 0;
00249
00251 virtual int GetNumCoarseFaces() = 0;
00252
00254 virtual int GetNumVertices() = 0;
00255
00258 virtual RixSubdivisionFace *GetFace(int id) = 0;
00259
00262 virtual RixSubdivisionVertex *GetVertex(int id) = 0;
00263
00265 virtual void Subdivide(int depth) = 0;
00266
00270 virtual void GetPackedVertexDataIndices(int depth,
00271 std::vector<int> &vertexcounts,
00272 std::vector<int> &vertices) = 0;
00273
00280 virtual bool GetPackedVertexValues(const RtToken name, int width,
00281 const RtToken space,
00282 std::vector<float> &data) = 0;
00283 };
00284
00285
00286
00287 #endif