00001
00006 #ifndef __SURFACEGENERATOR__H__
00007 #define __SURFACEGENERATOR__H__
00008
00009 #include <maya/MObject.h>
00010 #include <maya/MPoint.h>
00011 #include <maya/MTransformationMatrix.h>
00012 #include <maya/MString.h>
00013 #include <maya/MPxNode.h>
00014 #include <maya/MPlug.h>
00015 #include <maya/MTypeId.h>
00016 #include <maya/MFnMatrixAttribute.h>
00017 #include <maya/MFnNumericAttribute.h>
00018 #include <maya/MFnUnitAttribute.h>
00019 #include <maya/MFnCompoundAttribute.h>
00020 #include <maya/MDistance.h>
00021 #include <maya/MPointArray.h>
00022 #include <maya/MIntArray.h>
00023 #include <maya/MFnTypedAttribute.h>
00024 #include <maya/MFnMesh.h>
00025 #include <maya/MFnMeshData.h>
00026 #include <maya/MFnEnumAttribute.h>
00027 #include <maya/MGlobal.h>
00028 #include <maya/MDoubleArray.h>
00029 #include <maya/MDGModifier.h>
00030
00031 #include <map>
00032 #include <vector>
00033
00034
00035 #include "ImplicitFunction.h"
00036 #include "ImplicitSphere.h"
00037
00043 typedef enum SurfaceCase {
00045 Inside = 0,
00046
00048 Outside = 1,
00049
00051 OnSurface = 2
00052 };
00053
00055
00059 typedef struct CORNER {
00061 MPoint point;
00062
00064 double value;
00065
00067 SurfaceCase scase;
00068 };
00069
00071
00076 typedef struct CUBE {
00078 CORNER *corners[8];
00079
00081 SurfaceCase scase;
00082 } ;
00083
00085
00088 typedef struct IMPSPHERE {
00090 MDistance r;
00091
00093 float w;
00094
00096 MTransformationMatrix m;
00097 } ;
00098
00099
00101
00120 class SurfaceGenerator
00121 : public MPxNode
00122 {
00123 public:
00124
00126
00138 virtual MStatus compute(const MPlug& plug, MDataBlock& data);
00139
00141
00147 static void *creator();
00148
00150
00156 static MStatus initialize();
00157
00159
00171 static MPoint interpolate(double isolevel,CORNER *p1, CORNER *p2);
00172
00174
00197 static int polygoniseTri(CUBE cube, double iso, int v0, int v1, int v2, int v3);
00198
00200
00211 static int polygonise(CUBE cube, double iso);
00212
00214
00220 static int indexToVertex(MPoint p);
00221
00222 public:
00223
00225
00228 static const MTypeId typeId;
00229
00231
00234 static const MString typeName;
00235
00237
00241 static MObject ellipsoid_Radius;
00242
00244
00249 static MObject ellipsoid_TWorldMatrix;
00250
00252
00257 static MObject ellipsoid_Weight;
00258
00260
00265 static MObject ellipsoid_BBoxMin;
00266
00268
00273 static MObject ellipsoid_BBoxMax;
00274
00276
00280 static MObject algorithm;
00281
00283
00287 static MObject isolevel;
00288
00290
00295 static MObject tessellation;
00296
00297
00299
00304 static MObject out_mesh;
00305
00306 private:
00308
00312 static MPointArray vertexArray;
00313
00315
00319 static MIntArray polygonCount;
00320
00322
00325 static MIntArray polygonConnects;
00326
00327
00328
00330
00333 static std::vector<CORNER> allPoints;
00334
00336
00339 static std::vector<CUBE> cubes;
00340
00342
00345 static std::vector<int> activeIS;
00346
00348
00352 static std::map<int,ImplicitSphere*> implicit;
00353 };
00354
00355 #endif