tge/lib/maxsdk70/include/IProjectionRenderHandler.h
2017-04-17 06:17:10 -06:00

153 lines
5.1 KiB
C++
Executable File

/**********************************************************************
*<
FILE: ProjectionRenderHandler.h
DESCRIPTION: Render time functionality for projection mapping
CREATED BY: Michaelson Britt
HISTORY: 05-01-2004
*> Copyright (c) 2004, All Rights Reserved.
**********************************************************************/
#ifndef __PROJECTIONRENDERHANDLER_H__
#define __PROJECTIONRENDERHANDLER_H__
#include "Max.h"
#include "resource.h"
#include "istdplug.h"
#include "iparamb2.h"
#include "iparamm2.h"
//-----------------------------------------------------------------------------
// Types
class IMeshWrapper;
class IProjectionRenderMgr;
typedef struct {
int v0, v1, v2;
} GenTri;
typedef struct {
Point3 v0, v1, v2;
} GenTriPoints;
typedef struct {
Point3 uBasis, vBasis;
} TangentBasis;
//===========================================================================
//
// Class IProjectionRenderHandler
//
//===========================================================================
class IProjectionRenderHandler {
public:
typedef struct {
RenderInstance* inst;
IMeshWrapper* mesh; //CAMERA SPACE mesh wrapper for the inst
float dist;
int faceIndex;
Point3 faceBary;
BOOL isBackfacing;
int err; //used when Project() returns FALSE
} ProjectionResult;
enum { ERR_NONE=0,
ERR_RAYMISS, //ray did not hit a reference model
ERR_NONSELFACE, //the working model face is not in the active selection, skipped
};
virtual ~IProjectionRenderHandler() {}
virtual void DeleteThis() = 0;
virtual int RenderBegin(TimeValue t, ULONG flags=0) = 0;
virtual int RenderEnd(TimeValue t) = 0;
// NOTE: Init() may require several seconds to calculate sorting structures for the reference models
virtual BOOL Init( RenderInstance* workingModelInst, RenderGlobalContext* rgc ) = 0;
virtual BOOL Valid() = 0; //true if initialized, false otherwise
// Reference & working model info
virtual void GetReferenceModels( Tab<RenderInstance*>& refModels ) = 0;
virtual IMeshWrapper* GetWorkingModelMesh() = 0;
virtual RenderInstance* GetWorkingModelInst() = 0;
virtual void GetWorkingModelMask( BitArray& mask ) = 0;
// Do the projection from working model to reference model
virtual BOOL Project( int faceIndex, Point3& faceBary, Point3& faceNorm, ProjectionResult& result ) = 0;
};
// Manager class to create render handler instances
#define IPROJECTIONRENDERMGR_INTERFACE_ID Interface_ID(0x45390e61, 0x42de3b37)
inline IProjectionRenderMgr* GetIProjectionRenderMgr()
{return (IProjectionRenderMgr*)GetCOREInterface(IPROJECTIONRENDERMGR_INTERFACE_ID);}
class IProjectionRenderMgr : public FPStaticInterface {
public:
virtual IProjectionRenderHandler* CreateProjectionRenderHandler() = 0;
};
//===========================================================================
//
// Class IMeshWrapper
// An object defined as a set of triangles
//
//===========================================================================
//FIXME: hopefully this can become a subclass of ObjectWrapper
class IMeshWrapper {
public:
virtual void DeleteThis() = 0;
virtual int NumTriangles() = 0;
// For a given triangle, find the face number, and the index of the triangle within the face
virtual void Translate( int rawTriIndex, int& faceIndex, int& faceTriIndex ) = 0;
// Transform affects the geometry & geom normals, but not the mapping data
virtual Matrix3 GetTM() = 0;
virtual void SetTM( Matrix3 tm ) = 0;
// Geom triangles & verts
virtual GenTri GetTri( int triIndex ) = 0;
virtual void GetTriPoints( int triIndex, GenTriPoints& triPoints ) = 0;
virtual Point3 GetVert( int vertIndex ) = 0;
virtual int NumVerts() = 0;
// Map triangles & verts
virtual BOOL GetChannelSupport( int mapChannel ) = 0;
virtual GenTri GetMapTri( int triIndex, int mapChannel ) = 0;
virtual void GetMapTriPoints( int triIndex, int mapChannel, GenTriPoints& triPoints ) = 0;
virtual Point3 GetMapVert( int vertIndex, int mapChannel ) = 0;
virtual int NumMapVerts( int mapChannel ) = 0;
// Normals
virtual Point3 GetNormal( int triIndex ) = 0;
virtual TangentBasis GetTangentBasis( int triIndex, int mapChannel ) = 0;
virtual Point3 GetVertexNormal( int vertIndex, DWORD smGroup ) = 0;
virtual TangentBasis GetVertexTangentBasis( int vertIndex, DWORD smGroup, int mapChannel ) = 0;
virtual Point3 GetMapNormal( int triIndex, int mapChannel ) = 0; //UVW space
// Face properties
virtual MtlID GetMtlID( int triIndex ) = 0;
virtual DWORD GetSmoothingGroup( int triIndex ) = 0;
// Helpers
virtual void GetPoint( int triIndex, const Point3& triBary, Point3& point ) = 0;
virtual void GetMapPoint( int triIndex, const Point3& triBary, int mapChannel, Point3& uvw ) = 0;
virtual void GetNormal( int triIndex, const Point3& triBary, Point3& point ) = 0;
virtual void GetTangentBasis( int triIndex, const Point3& triBary, int mapChannel, TangentBasis& tangentBasis ) = 0;
};
#endif //__PROJECTIONRENDERHANDLER_H___