150 lines
3.7 KiB
C++
150 lines
3.7 KiB
C++
/**
|
|
** File : cpmesh.h
|
|
** Description: Interface implementations
|
|
**/
|
|
|
|
#ifndef _cpmesh_h_
|
|
#define _cpmesh_h_
|
|
|
|
#include "global.h"
|
|
#include "interface.h"
|
|
#include "aglmesh.h"
|
|
#include "excptn.h"
|
|
#include "vsplit.h"
|
|
#include "aglmesh.h"
|
|
|
|
/*************************************************************************
|
|
Defines
|
|
*************************************************************************/
|
|
|
|
#define DLLEXPORT __declspec(dllexport)
|
|
|
|
/*************************************************************************
|
|
Structs and Classes
|
|
*************************************************************************/
|
|
|
|
|
|
class CPMeshGL: public IPMesh, public IPMeshGL, public CAugGlMesh
|
|
{
|
|
private:
|
|
|
|
/*
|
|
* Enums used for compression
|
|
*/
|
|
enum
|
|
{
|
|
NORM_EXPLICIT, // All normal explicitly stored
|
|
NORM_NONE, // No normals stored. Generate from faces
|
|
NORM_PARTIAL,
|
|
NORM_MASK = 3
|
|
};
|
|
|
|
// Texture coordinates stored or not.
|
|
// This is or'ed with normal flags
|
|
enum
|
|
{
|
|
TEX_EXPLICIT = 4,
|
|
TEX_NONE,
|
|
TEX_MASK = 1<<2
|
|
};
|
|
|
|
enum
|
|
{
|
|
INTC_MAX, // Fixed integer size to fit the largest possible value
|
|
INTC_MUL8, // Integer size based on the range.
|
|
// Clamped to multiple of 8 bits
|
|
INTC_VAR // Integer size based on range: ceil(log(maxval)/log(2))
|
|
};
|
|
|
|
/*
|
|
* COM overhead
|
|
*/
|
|
DWORD m_cRef; // Reference count
|
|
|
|
/*
|
|
* BaseMesh data
|
|
*/
|
|
DWORD m_baseVertices; // # of vertices.
|
|
DWORD m_baseWedges; // # of wedges.
|
|
DWORD m_baseFaces; // # of faces.
|
|
|
|
/*
|
|
* Current position in the Vsplit array
|
|
*/
|
|
DWORD m_currPos;
|
|
|
|
/*
|
|
* Max data obtained from the PMesh header.
|
|
* Parameters for the fully detailed mesh.
|
|
*/
|
|
DWORD m_maxVertices; // # of vertices.
|
|
DWORD m_maxWedges; // # of wedges.
|
|
DWORD m_maxFaces; // # of faces.
|
|
DWORD m_maxMaterials; // # of materials.
|
|
DWORD m_maxTextures; // # of textures.
|
|
|
|
/*
|
|
* Array of Vsplit record, possibly shared
|
|
*/
|
|
VsplitArray* m_vsarr;
|
|
|
|
/*
|
|
* No idea what this is for
|
|
*/
|
|
HRESULT LoadStream(IStream* is, DWORD*, DWORD*);
|
|
|
|
public:
|
|
/*
|
|
* Constructor-Destructor
|
|
*/
|
|
CPMeshGL();
|
|
~CPMeshGL();
|
|
|
|
/*
|
|
* IUnknown Methods
|
|
*/
|
|
STDMETHODIMP_(ULONG) AddRef(void);
|
|
STDMETHODIMP_(ULONG) Release(void);
|
|
STDMETHODIMP QueryInterface(REFIID, LPVOID FAR*);
|
|
|
|
/*
|
|
* IPMesh Methods
|
|
*/
|
|
|
|
//Loads
|
|
STDMETHODIMP Load(const char* const, const char* const, DWORD* const,
|
|
DWORD* const, LPPMESHLOADCB);
|
|
STDMETHODIMP LoadStat(const char* const, const char* const, DWORD* const,
|
|
DWORD* const) { return E_NOTIMPL; };
|
|
|
|
// Gets
|
|
STDMETHODIMP GetNumFaces(DWORD* const);
|
|
STDMETHODIMP GetNumVertices(DWORD* const);
|
|
STDMETHODIMP GetMaxVertices(DWORD* const);
|
|
STDMETHODIMP GetMaxFaces(DWORD* const);
|
|
|
|
//Sets
|
|
STDMETHODIMP SetNumFaces(DWORD);
|
|
STDMETHODIMP SetNumVertices(DWORD);
|
|
|
|
//Geomorph stuff
|
|
STDMETHODIMP GeomorphToVertices(LPPMGEOMORPH, DWORD* const)
|
|
{ return E_NOTIMPL; };
|
|
STDMETHODIMP GeomorphToFaces(LPPMGEOMORPH, DWORD* const)
|
|
{ return E_NOTIMPL; };
|
|
STDMETHODIMP ClonePM(IPMesh* const) { return E_NOTIMPL; };
|
|
|
|
// IPMeshGL Methods
|
|
STDMETHODIMP Initialize (void);
|
|
STDMETHODIMP Render (void);
|
|
};
|
|
|
|
DLLEXPORT HRESULT CreatePMeshGL (REFIID,
|
|
LPVOID FAR *, //dunno what this is for
|
|
IUnknown *,
|
|
DWORD);
|
|
|
|
|
|
|
|
#endif //_cpmesh_h_
|