tge/lib/maxsdk31/IGeomImp.h
2017-04-17 06:17:10 -06:00

341 lines
11 KiB
C++
Executable File

/**********************************************************************
*<
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 <windows.h>
#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