/********************************************************************** *< FILE: IGeomImp.h DESCRIPTION: Declaration of the interface which a puppet must implement. A puppet is essentially a geometry machine with a series of set poses and operations. CREATED BY: John Hutchinson HISTORY: Dec 9, 1997 *> Copyright (c) 1997, All Rights Reserved. **********************************************************************/ #ifndef __IGEOMPUPPET_H #define __IGEOMPUPPET_H #include "export.h" #include #include "maxtypes.h" //FIX ME //THis should not depend on GE //but for now we use some of its classes class AcGePoint3d; class AcGeVector3d; class AcGePlane; class AcGePoint2d; class AcGeVector2d; #define OP_TIMING //FIX ME //This shouldn't depend on amodeler //but for now we use some of its classes //JH 3/9/99 Removing references to vertexdata //#include "../msdkamodeler/inc/vertdata.h" //need the mesh class for TriangulateMesh #include "max.h" class INode; class ViewExp; extern inline AcGePoint3d* MaxArToGeAr(const Point3* maxPt, int numverts); #define MAX_MESH_ID 0x00000001 #define AMODELER_BODY_ID 0x00000002 class OpTimer; class IGeomImp { protected: public: static DllExport OpTimer opstatistics; //exported from core, initialized in hostcomp.cpp //access to the actual internal geometry representation // virtual void SetInternalRepresentation(LONG RepID, void *rep); virtual void Init(void *prep = NULL, LONG RepID = -1) = 0; virtual void *GetInternalRepresentation(LONG RepID, bool* needsdelete)= 0;// access to the wrapped cache virtual LONG NativeRepresentationID() = 0; /////////////////////////////////////////////////////////////////////////// // // pseudoconstructors // //JH In the process of overloading these for ease of use in MAX 03/26/99 virtual bool createBox(const Point3& p) = 0; virtual bool createBox(const AcGePoint3d& p, const AcGeVector3d& vec) = 0; virtual bool createSphere(float radius, int sides, BOOL smooth = TRUE) = 0; virtual bool createSphere(const AcGePoint3d& p, double radius, int approx) = 0; virtual bool createCylinder(float height, float radius, int sides , BOOL smooth = TRUE) = 0; virtual bool createCylinder(const AcGePoint3d& axisStart, const AcGePoint3d& axisEnd, double radius, int approx) = 0; virtual bool createCone(float height, float radius1, float radius2, int sides , BOOL smooth = TRUE) = 0; virtual bool createCone(const AcGePoint3d& axisStart, const AcGePoint3d& axisEnd, const AcGeVector3d& baseNormal, double radius1, double radius2, int approx) = 0; virtual bool createPipe(float height, float radius1, float radius2, int sides , BOOL smooth = TRUE) = 0; virtual bool createPipe(const AcGePoint3d& axisStart, const AcGePoint3d& axisEnd, const AcGeVector3d& baseNormal, double dblOuterRadius, double dblInnerRadius, int approx) = 0; virtual void createPipeConic(const AcGePoint3d& axisStart, const AcGePoint3d& axisEnd, const AcGeVector3d& baseNormal, double outterRadius1, double innerRadius1, double outterRadius2, double innerRadius2, int approx) = 0; virtual void createTetrahedron(const AcGePoint3d& p1, const AcGePoint3d& p2, const AcGePoint3d& p3, const AcGePoint3d& p4) = 0; virtual bool createTorus(float majorRadius, float minorRadius, int sidesa, int segs, BOOL smooth = TRUE) = 0; virtual bool createTorus(const AcGePoint3d& axisStart, const AcGePoint3d& axisEnd, double majorRadius, double minorRadius, int majorApprox, int minorApprox) = 0; /* virtual void createReducingElbow(const AcGePoint3d& elbowCenter, const AcGePoint3d& endCenter1, const AcGePoint3d& endCenter2, double endRadius1, double endRadius2, int majorApprox, int minorApprox) = 0; virtual void createRectToCircleReducer( const AcGePoint3d& baseCorner, const AcGeVector2d& baseSizes, const AcGePoint3d& circleCenter, const AcGeVector3d& circleNormal, double circleRadius, int approx) = 0; */ virtual bool createConvexHull(const AcGePoint3d vertices[], int numVertices) = 0; virtual bool createConvexHull(const Point3 vertices[], int numVertices) = 0; // Create a body consisting of one face // /* virtual void createFace(const AcGePoint3d vertices[], AModeler::PolygonVertexData* vertexData[], int numVertices, const AcGeVector3d &normal) = 0; */ virtual void createFace(const AcGePoint3d vertices[], int numVertices, BOOL smooth = TRUE) = 0; //The boolean operators virtual void prepBoolean() = 0; virtual void operator +=(IGeomImp& b) = 0; virtual void operator -=(IGeomImp& b) = 0; virtual void operator *=(IGeomImp& b) = 0; virtual int interfere (IGeomImp& b) = 0; //combination virtual bool Combine(IGeomImp& b) = 0; //assignment virtual IGeomImp& operator =(IGeomImp& b) = 0; // The section method removes part of the body in the positive halfplane // virtual void section(const Matrix3& tm) = 0; virtual void section(const AcGePlane& p) = 0; // Sweeps // virtual bool createPyramid(float width, float depth, float height)=0; virtual bool createPyramid( const AcGePoint3d vertices[], // AModeler::PolygonVertexData* vertexData[], int numVertices, const AcGeVector3d &plgNormal, const AcGePoint3d &apex) = 0; // virtual bool createExtrusion(const Point3 vertices[], int numVertices, const float height )=0; virtual bool createExtrusion( PolyPt vertices[], int numVertices, const float height, const BOOL smooth, const BOOL genMatIDs, const BOOL useShapeIDs)=0; virtual bool createExtrusion( const AcGePoint3d vertices[], // AModeler::PolygonVertexData* vertexData[], int numVertices, const AcGeVector3d &plgNormal, const AcGeVector3d &extusionVector, const AcGePoint3d &fixedPt, double scaleFactor, double twistAngle) = 0; virtual void createAxisRevolution( const AcGePoint3d vertices[], // AModeler::PolygonVertexData* vertexData[], int numVertices, const AcGeVector3d &normal, const AcGePoint3d &axisStart, const AcGePoint3d &axisEnd, double revolutionAngle, int approx, const AcGePoint3d &fixedPt, double scaleFactor, double twistAngle) = 0; virtual void createEndpointRevolution( const AcGePoint3d vertices[], // AModeler::PolygonVertexData* vertexData[], int numVertices, const AcGeVector3d &normal, double revolutionAngle, int approx)=0; /* void createSkin( AsdkBody* profiles[], int numProfiles, bool isClosed, MorphingMap* morphingMaps[]); */ virtual void createExtrusionAlongPath( const AcGePoint3d vertices[], // AModeler::PolygonVertexData* vertexData[], int numVerticesm, bool pathIsClosed, bool bCheckValidity, const AcGePoint3d &scaleTwistFixedPt, double scaleFactor, double twistAngle, const AcGeVector3d &extusionVector) = 0; virtual void createWallCorner( const AcGePoint2d& pt1, // Start of wall 1 const AcGePoint2d& pt2, // End of wall 1, start of wall 2 const AcGePoint2d& pt3, // End of wall 2 bool materialToTheLeft, double width1, // Wall 1 width double width2, // Wall 2 width double height, // Wall height AcGePlane& matingPlane1, AcGePlane& matingPlane2, bool& wall1NeedsToBeSectioned, bool& wall2NeedsToBeSectioned) = 0; /////////////////////////////////////////////////////////////////////////// // // transforms // virtual void transform(Matrix3 & mat, bool override_locks = true) = 0; /////////////////////////////////////////////////////////////////////////// // // triangulation // // Saves the triangles directly to a Mesh // virtual void triangulateMesh(TimeValue t, Mesh& m, TesselationType type = kTriangles, bool cacheTriangles = true) = 0; /* TO DO // saves the triangle back to the callback object virtual void triangulate (TimeValue t, OutputTriangleCallback*, TriangulationType type = kGenerateTriangles, bool cacheTriangles = true) = 0; */ /////////////////////////////////////////////////////////////////////////// // // display // virtual void Display(TimeValue t, INode* inode, ViewExp *vpt, int flags) = 0; virtual void Invalidate() = 0; //Validity virtual bool isNull() = 0; ////////////////////////////////////////////////////////////////////////// // // Copy // virtual IGeomImp * Copy(void) = 0; ////////////////////////////////////////////////////////////////////////// // // BondingBox methods // virtual void GetDeformBBox(TimeValue t, Box3& box, Matrix3 *tm=NULL, BOOL useSel=FALSE ) = 0; ////////////////////////////////////////////////////////////////////////// // // Constraining transform // virtual bool GetTransformLock(int type, int axis) = 0; virtual void SetTransformLock(int type, int axis, BOOL onOff) = 0; }; //#ifdef IMPORTING //#error //#endif #define HIRES class OpTimer: public MeshOpProgress { private: #ifdef HIRES LARGE_INTEGER opstart; LARGE_INTEGER optime; LARGE_INTEGER cumtime; LARGE_INTEGER res; #else int opstart, optime, cumtime; #endif int m_errorcode; int m_errcount; int m_opcount; TSTR curopname; public: //From MeshOpProgress OpTimer():m_errorcode(0), m_opcount(0){curopname = "??";} void Init(int total) { ++m_opcount; m_errorcode = 0; #ifdef HIRES QueryPerformanceFrequency(&res); optime.QuadPart = 0; QueryPerformanceCounter(&opstart); #else opstart = GetTickCount(); #endif } BOOL Progress(int p) { #ifdef HIRES LARGE_INTEGER opnow; QueryPerformanceCounter(&opnow); cumtime.QuadPart += (opnow.QuadPart - (opstart.QuadPart + optime.QuadPart)); optime.QuadPart = opnow.QuadPart - opstart.QuadPart; #else integer opnow = GetTickCount(); cumtime += (opnow - (opstart + optime)); optime = opnow - opstart; #endif return true; } void OutputMetrics(HWND hDlg); void InitName(char *opname){curopname = opname;} void ExtendName(char *opname){curopname += opname;} void FlagError(int errcode = 999){m_errorcode = errcode;++m_errcount;} void Reset(){ m_errcount = 0; m_opcount=0; #ifdef HIRES cumtime.QuadPart = 0; #else optime = 0; #endif } }; extern "C" __declspec(dllexport) IGeomImp* CreateAmodelerBody(); extern "C" __declspec(dllexport) IGeomImp* CreateMeshAdapter(); #endif //__IGEOMPUPPET_H