163 lines
6.7 KiB
C++
Executable File
163 lines
6.7 KiB
C++
Executable File
/**********************************************************************
|
|
*<
|
|
FILE: gbuf.h : GBuffer manager.
|
|
|
|
DESCRIPTION:
|
|
|
|
CREATED BY: Dan Silva
|
|
|
|
HISTORY:
|
|
|
|
*> Copyright (c) 1998, All Rights Reserved.
|
|
**********************************************************************/
|
|
|
|
#ifndef __GBUF__H
|
|
#define __GBUF__H
|
|
|
|
#define NUMGBCHAN 13
|
|
|
|
// GBuffer channels (number of bytes in parenthesis)
|
|
#define GB_Z 0 // (4) Z-Buffer depth, float
|
|
#define GB_MTL_ID 1 // (1) ID assigned to mtl via mtl editor
|
|
#define GB_NODE_ID 2 // (2) ID assigned to node via properties
|
|
#define GB_UV 3 // (8) UV coordinates - Point2
|
|
#define GB_NORMAL 4 // (4) Normal vector in view space, compressed
|
|
#define GB_REALPIX 5 // (4) Non clamped colors in "RealPixel" format
|
|
#define GB_COVERAGE 6 // (1) Pixel coverage
|
|
#define GB_BG 7 // (3) RGB color of what's behind layer
|
|
#define GB_NODE_RENDER_ID 8 // (2) Node render index, word
|
|
#define GB_COLOR 9 // (3) Color (RGB)
|
|
#define GB_TRANSP 10 // (3) Transparency (RGB)
|
|
#define GB_VELOC 11 // (8) Velocity (Point2)
|
|
#define GB_WEIGHT 12 // (3) Weight of layers contribution to pixel color
|
|
|
|
CoreExport int GBDataSize(int i);
|
|
|
|
CoreExport TCHAR *GBChannelName(int i);
|
|
|
|
// Recognized channel bits
|
|
|
|
#define BMM_CHAN_NONE 0
|
|
#define BMM_CHAN_Z (1<<GB_Z) // Z-buffer depth, float
|
|
#define BMM_CHAN_MTL_ID (1<<GB_MTL_ID) // ID assigned to mtl via mtl editor
|
|
#define BMM_CHAN_NODE_ID (1<<GB_NODE_ID) // ID assigned to node via properties
|
|
#define BMM_CHAN_UV (1<<GB_UV) // UV coordinates - Point2
|
|
#define BMM_CHAN_NORMAL (1<<GB_NORMAL) // Normal vector in view space, compressed
|
|
#define BMM_CHAN_REALPIX (1<<GB_REALPIX) // Non clamped colors in "RealPixel" format
|
|
#define BMM_CHAN_COVERAGE (1<<GB_COVERAGE) // Pixel coverage of front surface
|
|
#define BMM_CHAN_BG (1<<GB_BG) // RGB color of what's behind front object
|
|
#define BMM_CHAN_NODE_RENDER_ID (1<<GB_NODE_RENDER_ID) // node render index
|
|
#define BMM_CHAN_COLOR (1<<GB_COLOR) // Color (Color24)
|
|
#define BMM_CHAN_TRANSP (1<<GB_TRANSP) // Transparency (Color24)
|
|
#define BMM_CHAN_VELOC (1<<GB_VELOC) // Velocity ( Point2 )
|
|
#define BMM_CHAN_WEIGHT (1<<GB_WEIGHT) // Weight ( Color24 )
|
|
|
|
// Recognized types of channels
|
|
#define BMM_CHAN_TYPE_UNKNOWN 0
|
|
#define BMM_CHAN_TYPE_8 2 // 1 byte per pixel
|
|
#define BMM_CHAN_TYPE_16 3 // 1 word per pixel
|
|
#define BMM_CHAN_TYPE_24 8 // 3 bytes per pixel
|
|
#define BMM_CHAN_TYPE_32 4 // 2 words per pixel
|
|
#define BMM_CHAN_TYPE_48 5 // 3 words per pixel
|
|
#define BMM_CHAN_TYPE_64 6 // 4 words per pixel
|
|
#define BMM_CHAN_TYPE_96 7 // 6 words per pixel
|
|
|
|
struct GBufData {
|
|
float z;
|
|
UBYTE mtl_id;
|
|
UWORD node_id;
|
|
Point2 uv;
|
|
DWORD normal;
|
|
RealPixel realpix;
|
|
UBYTE coverage;
|
|
UWORD rend_id;
|
|
Color24 color;
|
|
Color24 transp;
|
|
Color24 weight;
|
|
Point2 veloc;
|
|
};
|
|
|
|
|
|
//------------------------------------gbuf.h ----------------------------------------------
|
|
|
|
class GBufReader {
|
|
public:
|
|
virtual int StartLine(int y)=0; // -1 = no data for line, or x of first non-empty pixel
|
|
virtual BOOL StartPixel(int x)=0; // -1 = eol,; 0 = empty; 1= has data ( Automatically starts first layer)
|
|
virtual BOOL StartPixel(int x,int y)=0; // -1 = eol,; 0 = empty; 1= has data ( includes StartLine)
|
|
virtual BOOL StartNextLayer()=0; // 0 = no more layers ( Do not call before first layer )
|
|
virtual int NextPixel()=0; // -1 = eol,; 0 = empty; 1 = has data
|
|
// Read a data element: chan is one of { GB_Z, GB_MTL_ID, GB_NODE_ID, ... etc }
|
|
virtual BOOL ReadChannelData(int chan, void *data)=0; // 1= has data; 0= didnt have data
|
|
virtual BOOL ReadAllData(GBufData *data)=0; // 1= has data; 0= didnt have data
|
|
virtual void DeleteThis()=0;
|
|
// Generic expansion function
|
|
virtual int Execute(int cmd, ULONG arg1=0, ULONG arg2=0, ULONG arg3=0) { return 0; }
|
|
};
|
|
|
|
|
|
// This assumes pixels are created in increasing order of x.
|
|
class GBufWriter {
|
|
public:
|
|
virtual void StartLine(int y)=0; // 1 = success 0 = fail ( Must call before every line)
|
|
virtual void StartPixel(int x)=0; // 1 = success 0 = fail ( Must call to start each pixel )
|
|
virtual void StartNextLayer()=0; // 1 = success 0 = fail ( Must call before first layer)
|
|
// Write a data element: chan is one of { GB_Z, GB_MTL_ID, GB_NODE_ID, ... etc }
|
|
virtual BOOL WriteChannelData(int chan, void *data)=0; // 1=success 0=fail
|
|
virtual BOOL WriteAllData(GBufData *data)=0; // 1= success; 0= fail
|
|
virtual BOOL EndLine()=0; // 1=success 0=fail ( Just call after every line)
|
|
virtual void DeleteThis()=0;
|
|
// Generic expansion function
|
|
virtual int Execute(int cmd, ULONG arg1=0, ULONG arg2=0, ULONG arg3=0) { return 0; }
|
|
};
|
|
|
|
class GBuffer {
|
|
public:
|
|
virtual void SetRasterSize(int ww, int hh)=0; // when create bitmap or size changes.
|
|
virtual int Width()=0;
|
|
virtual int Height()=0;
|
|
virtual int InitBuffer()=0; // call before writing buffer.
|
|
virtual ULONG CreateChannels(ULONG channelMask)=0; // create specified channels
|
|
virtual void DeleteChannels(ULONG channelMask)=0; // delete specified channels
|
|
virtual ULONG ChannelsPresent()=0;
|
|
virtual void *GetChannel( ULONG channelID, ULONG& chanType)=0;
|
|
virtual GBufReader *CreateReader()=0;
|
|
virtual void DestroyReader(GBufReader *pRdr)=0;
|
|
virtual GBufWriter *CreateWriter()=0;
|
|
virtual void DestroyWriter(GBufWriter *pRdr)=0;
|
|
virtual BOOL IsDefaultGBuffer() { return FALSE; }
|
|
virtual void DeleteThis()=0;
|
|
virtual void Copy(GBuffer *gbfrom)=0;
|
|
virtual void CopyScale(GBuffer *gbfrom, int cw=-1, int ch=-1)=0;
|
|
virtual void Position(int srcy, int trgy, int srcx, int trgx, int trgw, int trgh )=0;
|
|
|
|
// for file writing
|
|
virtual int NumberLayerRecords(int y)=0;
|
|
virtual int GetLayerChannel(int y, int ichan, char *data)=0; // ichan = -1 creates array of x values
|
|
|
|
// for file reading
|
|
virtual int CreateLayerRecords(int y, int num)=0;
|
|
virtual int SetLayerChannel(int y, int ichan, char *data)=0; // ichan = -1 gets array of x values
|
|
|
|
// This scans the entire image and updates the minimum and maximum values
|
|
virtual void UpdateChannelMinMax()=0;
|
|
|
|
// Get Channel limits ( currently only valid for z,uv,veloc)
|
|
virtual BOOL GetChannelMin(int chan, void *data)=0;
|
|
virtual BOOL GetChannelMax(int chan, void *data)=0;
|
|
|
|
// names indexed by NodeRenderId
|
|
virtual NameTab &NodeRenderIDNameTab()=0;
|
|
|
|
// Generic expansion function
|
|
virtual int Execute(int cmd, ULONG arg1=0, ULONG arg2=0, ULONG arg3=0) { return 0; }
|
|
|
|
};
|
|
|
|
CoreExport void SetMaximumGBufferLayerDepth(int m);
|
|
CoreExport int GetMaximumGBufferLayerDepth();
|
|
|
|
CoreExport GBuffer *NewDefaultGBuffer();
|
|
|
|
#endif// __GBUF__H
|