00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef __GEO_PrimNURBSurf_h__
00023 #define __GEO_PrimNURBSurf_h__
00024
00025 #include "GEO_API.h"
00026 #include "GEO_TPSurf.h"
00027 #include "GEO_PrimType.h"
00028
00029 class UT_Vector4;
00030 class GB_NUBBasis;
00031 class UT_Vector3Array;
00032
00033 class GEO_API GEO_PrimNURBSurf : public GEO_TPSurf {
00034 public:
00035
00036 GEO_PrimNURBSurf(GEO_Detail *d, unsigned int m=0, unsigned int n=0)
00037 : GEO_TPSurf(d, (int)m, (int)n) {}
00038
00039
00040
00041 ~GEO_PrimNURBSurf();
00042
00043
00044
00045
00046
00047
00048 virtual int evaluateBasisDerivs(float u, float v,
00049 float ubmatx[][GB_MAXORDER],
00050 float vbmatx[][GB_MAXORDER],
00051 int &rowoffset, int &coloffset,
00052 unsigned du=0, unsigned dv=0,
00053 int uoffset=-1, int voffset=-1) const;
00054
00055
00056
00057
00058
00059 virtual int evaluateBasis(float u, float v, float *ubvals,
00060 float *vbvals, int &rowoffset,
00061 int &coloffset,
00062 unsigned du=0, unsigned dv=0,
00063 int uoffset=-1, int voffset=-1) const;
00064 virtual int evaluateUBasis(float u, float *ubvals, int &coloffset,
00065 unsigned du=0, int uoffset=-1) const;
00066 virtual int evaluateVBasis(float v, float *vbvals, int &rowoffset,
00067 unsigned dv=0, int voffset=-1) const;
00068
00069
00070
00071
00072
00073
00074
00075 virtual int evaluateMesh(float *uArr, unsigned uArrLen,
00076 float *vArr, unsigned vArrLen,
00077 UT_Vector4 *pos,
00078 unsigned du=0, unsigned dv=0) const;
00079 virtual int evaluateMesh(float uStart, float uStop, unsigned nu,
00080 float vStart, float vStop, unsigned nv,
00081 UT_Vector4 *pos,
00082 unsigned du=0, unsigned dv=0) const;
00083 virtual int evaluateMeshWAttrib(float uStart, float uStop,
00084 unsigned nu, float vStart, float vStop,
00085 unsigned nv, UT_Vector4 *pos,
00086 GB_AttributeData *adata,
00087 const GB_FloatOffsets &foffsets,
00088 unsigned du=0, unsigned dv=0) const;
00089
00090
00091 virtual int evaluateBreakpoint(int uidx, int vidx,
00092 UT_Vector4 &pos,
00093 int du=0, int dv=0) const;
00094
00095
00096
00097
00098 virtual int fillMesh(int nu, int nv, UT_Vector4 *pos) const;
00099
00100
00101
00102
00103
00104
00105 virtual int fillBreakMesh(int ustartidx, int ustopidx,
00106 int vstartidx, int vstopidx,
00107 int ulod, int vlod,
00108 GEO_Vertex **results,
00109 GEO_AttributeHandleList &hlist,
00110 int &vspans , int vbreakidx = -1,
00111 unsigned du = 0, unsigned dv = 0) const;
00112 virtual int fillBreakMesh(int ustartidx, int ustopidx,
00113 int vstartidx, int vstopidx,
00114 int ulod, int vlod,
00115 UT_Vector4 *pos, int &vspans ,
00116 int vbreakidx = -1,
00117 unsigned du = 0, unsigned dv = 0,
00118 UT_FloatArray *uval = 0,
00119 UT_FloatArray *vval = 0) const;
00120 virtual int fillBreakMeshWAttrib(int ustartidx, int ustopidx,
00121 int vstartidx, int vstopidx,
00122 int ulod, int vlod,
00123 UT_Vector4 *pos, GB_AttributeData *adata,
00124 const GB_FloatOffsets &foffsets,
00125 int &vspans , int vbreakidx = -1,
00126 unsigned du = 0, unsigned dv = 0) const;
00127
00128
00129
00130
00131
00132
00133
00134
00135 virtual int fillUCurves(int ustartidx, int ustopidx,
00136 int vstartidx, int vstopidx, int lod,
00137 UT_Vector4 *pos, int &uspans ,
00138 int ubreakidx = -1,
00139 unsigned du = 0, unsigned dv = 0) const;
00140 virtual int fillVCurves(int ustartidx, int ustopidx,
00141 int vstartidx, int vstopidx, int lod,
00142 UT_Vector4 *pos, int &vspans ,
00143 int vbreakidx = -1,
00144 unsigned du = 0, unsigned dv = 0) const;
00145 virtual int fillUCurves(int ustartidx, int ustopidx,
00146 int vstartidx, int vstopidx, int lod,
00147 GEO_Vertex **results,
00148 GEO_AttributeHandleList &hlist,
00149 int &uspans , int ubreakidx = -1,
00150 unsigned du = 0, unsigned dv = 0) const;
00151 virtual int fillVCurves(int ustartidx, int ustopidx,
00152 int vstartidx, int vstopidx, int lod,
00153 GEO_Vertex **results,
00154 GEO_AttributeHandleList &hlist,
00155 int &vspans , int vbreakidx = -1,
00156 unsigned du = 0, unsigned dv = 0) const;
00157 virtual int fillUCurvesWAttrib(int ustartidx, int ustopidx,
00158 int vstartidx, int vstopidx, int lod,
00159 UT_Vector4 *pos, GB_AttributeData *adata,
00160 const GB_FloatOffsets &foffsets,
00161 int &uspans , int ubreakidx = -1,
00162 unsigned du = 0, unsigned dv = 0) const;
00163 virtual int fillVCurvesWAttrib(int ustartidx, int ustopidx,
00164 int vstartidx, int vstopidx, int lod,
00165 UT_Vector4 *pos, GB_AttributeData *adata,
00166 const GB_FloatOffsets &foffsets,
00167 int &vspans , int vbreakidx = -1,
00168 unsigned du = 0, unsigned dv = 0) const;
00169
00170
00171
00172
00173 virtual int domainRangeOfCV(int i, int j, int &minuk,int &maxuk,
00174 int &minvk,int &maxvk) const;
00175
00176
00177
00178
00179
00180
00181 virtual int breakpointRangeOfCV(int i, int j, int &minbkpu,
00182 int &maxbkpu, int &minbkpv,
00183 int &maxbkpv) const;
00184
00185
00186
00187
00188 virtual void reparameterizeU(GB_ParmType ptype);
00189 virtual void reparameterizeV(GB_ParmType ptype);
00190
00191
00192
00193
00194
00195
00196
00197 virtual int refineU(float k, GEO_AttributeHandleList &hl, int r=1);
00198 virtual int refineU (float k, int r=1);
00199 virtual int refineUWAttrib(float k,
00200 const GB_FloatOffsets &foffsets,
00201 int r=1);
00202 virtual int refineUWAttrib(float k,
00203 const GB_FloatOffsets *ptoffsets,
00204 const GB_FloatOffsets *vtxoffsets,
00205 int r=1);
00206
00207 virtual int refineV(float k, GEO_AttributeHandleList &hl, int r=1);
00208 virtual int refineV (float k, int r=1);
00209 virtual int refineVWAttrib(float k,
00210 const GB_FloatOffsets &foffsets,
00211 int r=1);
00212 virtual int refineVWAttrib(float k,
00213 const GB_FloatOffsets *ptoffsets,
00214 const GB_FloatOffsets *vtxoffsets,
00215 int r=1);
00216
00217
00218
00219
00220
00221 virtual int subdivideU(float u, GEO_AttributeHandleList &hlist);
00222 virtual int subdivideU (float u);
00223 virtual int subdivideUWAttrib(float u,
00224 const GB_FloatOffsets &foffsets);
00225
00226 virtual int subdivideV(float u, GEO_AttributeHandleList &hlist);
00227 virtual int subdivideV (float u);
00228 virtual int subdivideVWAttrib(float u,
00229 const GB_FloatOffsets &foffsets);
00230
00231
00232
00233
00234
00235
00236 virtual int warpU(float u, const UT_Vector3 &delta,
00237 GEO_AttributeHandleList &hlist,
00238 float sharpness = 0.0f, float bias = -1.0f);
00239 virtual int warpV(float v, const UT_Vector3 &delta,
00240 GEO_AttributeHandleList &hlist,
00241 float sharpness = 0.0f, float bias = -1.0f);
00242 virtual int warp (float u, float v, const UT_Vector3 &delta,
00243 GEO_AttributeHandleList &hlist,
00244 float usharpness = 0.f, float vsharpness = 0.f,
00245 float ubias = -1.0f, float vbias = -1.0f);
00246
00247 virtual int warpU(float u, const UT_Vector3 &delta,
00248 GB_FloatOffsets *foffsets = 0,
00249 float sharpness = 0.0f, float bias = -1.0f);
00250 virtual int warpV(float v, const UT_Vector3 &delta,
00251 GB_FloatOffsets *foffsets = 0,
00252 float sharpness = 0.0f, float bias = -1.0f);
00253 virtual int warp (float u, float v, const UT_Vector3 &delta,
00254 GB_FloatOffsets *foffsets = 0,
00255 float usharpness = 0.f, float vsharpness = 0.f,
00256 float ubias = -1.0f, float vbias = -1.0f);
00257
00258
00259
00260 virtual int recordChange(unsigned r, unsigned c);
00261
00262
00263
00264 virtual void wrapU(int rounded = 1, int preserveShape = 0);
00265 virtual void openU(int preserveShape = 0, int = 0);
00266 virtual void wrapV(int rounded = 1, int preserveShape = 0);
00267 virtual void openV(int preserveShape = 0, int = 0);
00268
00269 virtual int unrollU(int append_pts = 1);
00270 virtual int unrollV(int append_pts = 1);
00271
00272
00273 short interpolatesEndsU(void) const;
00274 void toggleEndConditionU(void);
00275 short interpolatesEndsV(void) const;
00276 void toggleEndConditionV(void);
00277
00278
00279
00280 virtual int insertRow(unsigned int beforeWhich, int appendPts=1);
00281 virtual int insertCol(unsigned int beforeWhich, int appendPts=1);
00282 virtual int deleteRow(unsigned int which);
00283 virtual int deleteCol(unsigned int which);
00284
00285
00286
00287
00288 virtual void fixSeamsU(void);
00289 virtual void fixSeamsV(void);
00290
00291
00292 virtual int uMinValidIndex(void) const;
00293 virtual int uMaxValidIndex(void) const;
00294 virtual int vMinValidIndex(void) const;
00295 virtual int vMaxValidIndex(void) const;
00296
00297
00298 virtual unsigned getPrimitiveId(void) const;
00299
00300
00301
00302
00303
00304
00305 virtual int loftU(int newcount, int start=-1, int stop=-1);
00306 virtual int loftV(int newcount, int start=-1, int stop=-1);
00307
00308
00309
00310
00311 static int mergeGroupU(GEO_Detail *gdp, GB_PrimitiveGroup *nurbs);
00312 static int mergeGroupV(GEO_Detail *gdp, GB_PrimitiveGroup *nurbs);
00313
00314
00315
00316
00317
00318 virtual int cycleU(int amount, int keepSpan = 1);
00319 virtual int cycleV(int amount, int keepSpan = 1);
00320
00321
00322
00323 virtual void getRangeBBox(const UT_Interval &u,
00324 const UT_Interval &v,
00325 UT_BoundingBox &bbox) const;
00326
00327
00328
00329
00330
00331
00332
00333
00334
00335
00336
00337 int unrefine(int udir, int kidx,
00338 GEO_AttributeHandleList &hlist,
00339 int mult=0, float tol=1e-4F,
00340 GB_PointGroup *delgroup=0);
00341 int unrefine (int udir, int kidx, int mult=0,
00342 float tol=1e-4F,GB_PointGroup *delgroup=0);
00343 int unrefineWAttrib(int udir, int kidx,
00344 const GB_FloatOffsets &foffsets,
00345 int mult=0, float tol=1e-4F,
00346 GB_PointGroup *delgroup=0);
00347
00348 virtual int unrefineU(int kidx,
00349 GEO_AttributeHandleList &hlist,
00350 int mult=0, float tol=1e-4F,
00351 GB_PointGroup *delgroup=0);
00352 virtual int unrefineU(int kidx, int mult=0, float tol=1e-4F,
00353 GB_PointGroup *delgroup=0);
00354 virtual int unrefineUWAttrib(int kidx,
00355 const GB_FloatOffsets &foffsets,
00356 int mult=0, float tol=1e-4F,
00357 GB_PointGroup *delgroup=0);
00358
00359 virtual int unrefineV(int kidx,
00360 GEO_AttributeHandleList &hlist,
00361 int mult=0, float tol=1e-4F,
00362 GB_PointGroup *delgroup=0);
00363 virtual int unrefineV(int kidx, int mult=0, float tol=1e-4F,
00364 GB_PointGroup *delgroup=0);
00365 virtual int unrefineVWAttrib(int kidx,
00366 const GB_FloatOffsets &foffsets,
00367 int mult=0, float tol=1e-4F,
00368 GB_PointGroup *delgroup=0);
00369
00370
00371 float getKnotRemovalBound(int uDir, int curveIdx,
00372 int knotIdx, int mult=0) const;
00373
00374
00375
00376
00377
00378
00379 int clampU(GB_PointGroup *delPoints = 0);
00380 int clampV(GB_PointGroup *delPoints = 0);
00381 void unclampU(void);
00382 void unclampV(void);
00383
00384 virtual short isClampedU(void) const;
00385 virtual short isClampedV(void) const;
00386
00387
00388
00389 virtual int raiseOrderU(int neworder, GEO_AttributeHandleList &h);
00390 virtual int raiseOrderU (int neworder);
00391 virtual int raiseOrderUWAttrib(int neworder,
00392 const GB_FloatOffsets &foffsets);
00393 virtual int raiseOrderV(int neworder, GEO_AttributeHandleList &h);
00394 virtual int raiseOrderV (int neworder);
00395 virtual int raiseOrderVWAttrib(int neworder,
00396 const GB_FloatOffsets &foffsets);
00397
00398
00399
00400
00401
00402
00403 virtual int translateBreakpoints(const UT_IntArray &uindices,
00404 const UT_IntArray &vindices,
00405 const UT_Vector3 &delta,
00406 int fixbkpts = 1,
00407 GB_PointGroup *ptgroup=NULL,
00408 GEO_Delta *geodelta = 0);
00409
00410 virtual int transformBreakpoints(const UT_IntArray &uindices,
00411 const UT_IntArray &vindices,
00412 const UT_Matrix4 &matx,
00413 int fixbkpts = 1,
00414 GB_PointGroup *ptgroup=NULL,
00415 GEO_Delta *geodelta = 0);
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427 virtual int attachU(const GEO_Hull &hull, int blend = 1,
00428 float bias = 0.5f, float tolerance = 1.0f,
00429 int unrefine = 1,GB_PointGroup *ptgroup=0);
00430 virtual int attachV(const GEO_Hull &hull, int blend = 1,
00431 float bias = 0.5f, float tolerance = 1.0f,
00432 int unrefine = 1,GB_PointGroup *ptgroup=0);
00433
00434
00435
00436
00437 virtual GEO_TPSurf *extract(float ustart, float ustop,
00438 float vstart, float vstop) const;
00439
00440
00441 virtual void transpose();
00442
00443
00444 protected:
00445
00446 virtual GB_Basis *newBasis(void) const;
00447
00448
00449
00450
00451
00452
00453
00454 int fillUCurve(float v,int vidx, int ustartidx,int ustopidx,
00455 int density, UT_Vector4 *pos, int puoffset,
00456 int rbound, unsigned du, unsigned dv) const;
00457 int fillVCurve(float u,int uidx, int vstartidx,int vstopidx,
00458 int density, UT_Vector4 *pos, int pvoffset,
00459 int rbound, unsigned du, unsigned dv) const;
00460 int fillUCurve(float v, int vidx, int ustartidx,
00461 int ustopidx, int density,
00462 GEO_Vertex **results,
00463 GEO_AttributeHandleList &list,
00464 int puoffset, int rbound,
00465 unsigned du, unsigned dv) const;
00466 int fillVCurve(float u, int uidx, int vstartidx,
00467 int vstopidx, int density,
00468 GEO_Vertex **results,
00469 GEO_AttributeHandleList &list,
00470 int pvoffset, int rbound,
00471 unsigned du, unsigned dv) const;
00472 int fillUCurveWAttrib(float v, int vidx, int ustartidx,
00473 int ustopidx, int density, UT_Vector4 *pos,
00474 GB_AttributeData *adata,
00475 const GB_FloatOffsets &foffsets,
00476 int asize, int puoffset, int rbound,
00477 unsigned du, unsigned dv) const;
00478 int fillVCurveWAttrib(float u, int uidx, int vstartidx,
00479 int vstopidx, int density, UT_Vector4 *pos,
00480 GB_AttributeData *adata,
00481 const GB_FloatOffsets &foffsets,
00482 int asize, int pvoffset, int rbound,
00483 unsigned du, unsigned dv) const;
00484
00485
00486
00487 virtual void reverseU(void);
00488 virtual void reverseV(void);
00489
00490
00491
00492 void correctParam(const UT_Vector4 &p,
00493 float &u, float &v,
00494 float distTol=1e-10F, float angTol=1e-2F,
00495 int maxIter=50) const;
00496
00497
00498
00499 virtual int translateBkptsFixed(const UT_IntArray &uindices,
00500 const UT_IntArray &vindices,
00501 const UT_Vector3 &delta,
00502 GB_PointGroup *ptgroup=NULL,
00503 GEO_Delta *geodelta = 0);
00504 virtual int transformBkptsFixed(const UT_IntArray &uindices,
00505 const UT_IntArray &vindices,
00506 const UT_Matrix4 &matx,
00507 GB_PointGroup *ptgroup=NULL,
00508 GEO_Delta *geodelta = 0);
00509
00510
00511
00512 virtual int translateBkptsNonFixed(const UT_IntArray &uindices,
00513 const UT_IntArray &vindices,
00514 const UT_Vector3 &delta,
00515 GB_PointGroup *ptgroup=NULL,
00516 GEO_Delta *geodelta = 0);
00517 virtual int transformBkptsNonFixed(const UT_IntArray &uindices,
00518 const UT_IntArray &vindices,
00519 const UT_Matrix4 &matx,
00520 GB_PointGroup *ptgroup=NULL,
00521 GEO_Delta *geodelta = 0);
00522
00523 private:
00524 int xformBreakpoints(const UT_IntArray &uindices,
00525 const UT_IntArray &vindices,
00526 const UT_Vector3Array &trans,
00527 GB_PointGroup *ptgroup=NULL,
00528 GEO_Delta *geodelta = 0);
00529
00530
00531
00532
00533
00534
00535
00536
00537
00538 int mergeU(const GB_NUBBasis &basis);
00539 int mergeV(const GB_NUBBasis &basis);
00540
00541
00542
00543
00544 int alignKnotU(float k, int &kidx,
00545 int &cycFix, int &interpFix);
00546 int alignKnotV(float k, int &kidx,
00547 int &cycFix, int &interpFix);
00548
00549 void unAlignKnotU(int &kidx, int cycFix, int interpFix);
00550 void unAlignKnotV(int &kidx, int cycFix, int interpFix);
00551
00552 };
00553
00554 #endif