re3/rwsdk/include/d3d8/rwcore.h

4792 lines
168 KiB
C

/******************************************/
/* */
/* RenderWare(TM) Graphics Library */
/* */
/******************************************/
/*
* This file is a product of Criterion Software Ltd.
*
* This file is provided as is with no warranties of any kind and is
* provided without any obligation on Criterion Software Ltd.
* or Canon Inc. to assist in its use or modification.
*
* Criterion Software Ltd. and Canon Inc. will not, under any
* circumstances, be liable for any lost revenue or other damages
* arising from the use of this file.
*
* Copyright (c) 1999. Criterion Software Ltd.
* All Rights Reserved.
*/
/*************************************************************************
*
* Filename: <C:/daily/rwsdk/include/d3d8/rwcore.h>
* Automatically Generated on: Wed Jul 10 10:45:00 2002
*
************************************************************************/
#ifndef RWCORE_H
#define RWCORE_H
/*--- System Header Files ---*/
#include <rwplcore.h>
/*--- Automatically derived from: C:/daily/rwsdk/driver/common/barwasmm.h ---*/
/*--- Automatically derived from: C:/daily/rwsdk/src/pipe/p2/p2resort.h ---*/
/*--- Automatically derived from: C:/daily/rwsdk/src/pipe/p2/p2macros.h ---*/
#define RxClusterDecCursorByStride(_cluster, _stride) \
((_cluster)->currentData = \
(void *)(((RwUInt8 *)(_cluster)->currentData) - \
(_stride)))
#define RxClusterDecCursor(_cluster) \
RxClusterDecCursorByStride(_cluster, (_cluster)->stride)
#define RxClusterIncCursorByStride(_cluster, _stride) \
((_cluster)->currentData = \
(void *)(((RwUInt8 *)(_cluster)->currentData) + \
(_stride)))
#define RxClusterIncCursor(_cluster) \
RxClusterIncCursorByStride(_cluster, (_cluster)->stride)
#define RxClusterResetCursor(_cluster) \
((_cluster)->currentData = (_cluster)->data)
#define RxClusterGetCursorData(_cluster, _type) \
((_type *)(_cluster)->currentData)
#define RxClusterGetIndexedData(_cluster, _type, _index) \
((_type *)(((RwUInt8 *)(_cluster)->data) + (_cluster)->stride*(_index)))
#define RxClusterGetFreeIndex(_cluster) ( (_cluster)->numUsed++ )
#define RxPipelineClusterAssertAttributeSet(_cluster, _attributeSet) \
RWASSERT( (_cluster)->clusterRef->attributeSet != NULL && \
rwstrcmp((_cluster)->clusterRef->attributeSet, \
(_attributeSet)) == 0 )
#define RxPipelineNodeParamGetData(_param) \
( (_param)->dataParam )
#define RxPipelineNodeParamGetHeap(_param) \
( (_param)->heap )
/*--- Automatically derived from: C:/daily/rwsdk/src/pipe/p2/p2heap.h ---*/
#if (defined(RWDEBUG) && (defined(RWMEMDEBUG)))
#if (!defined(DISABLERWHEAP))
#define DISABLERWHEAP
#endif /* (!defined(DISABLERWHEAP)) */
#endif /* (defined(RWDEBUG) && (defined(RWMEMDEBUG))) */
typedef struct rxHeapFreeBlock rxHeapFreeBlock;
typedef struct rxHeapSuperBlockDescriptor rxHeapSuperBlockDescriptor;
typedef struct RxHeap RxHeap;
typedef struct rxHeapBlockHeader rxHeapBlockHeader;
struct rxHeapFreeBlock
{
RwUInt32 size;
rxHeapBlockHeader *ptr;
};
struct rxHeapSuperBlockDescriptor
{
void *start;
RwUInt32 size;
rxHeapSuperBlockDescriptor *next;
};
/**
* \ingroup rwcoregeneric
* \struct RxHeap
* structure describing a pipeline execution heap
*/
struct RxHeap
{
RwUInt32 superBlockSize; /**< Granularity of heap growth */
rxHeapSuperBlockDescriptor *head; /**< Internally used superblock pointer */
rxHeapBlockHeader *headBlock; /**< Internally used block pointer */
rxHeapFreeBlock *freeBlocks; /**< Internally used free blocks pointer */
RwUInt32 entriesAlloced; /**< Number of entries allocated */
RwUInt32 entriesUsed; /**< Number of entries used */
RwBool dirty; /**< Internally used boolean, flags whether
* the heap needs resetting or not. */
};
struct rxHeapBlockHeader
{
/* present in all blocks (used & unused) */
rxHeapBlockHeader *prev, *next;
RwUInt32 size;
rxHeapFreeBlock *freeEntry; /* (or null) */
RwUInt32 pad[4]; /* alignment padding to 32 bytes */
};
/* This wrapper cheaply early-outs when a heap doesn't *need* resetting */
#define RxHeapReset(heap) \
((FALSE == (heap)->dirty) ? (TRUE) : (_rxHeapReset(heap)))
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
extern RxHeap *RxHeapCreate(RwUInt32 size);
extern void RxHeapDestroy(RxHeap * heap);
extern RwBool _rxHeapReset(RxHeap * heap);
extern void *RxHeapAlloc(RxHeap * heap, RwUInt32 size);
extern void RxHeapFree(RxHeap * heap, void *block);
extern void *RxHeapRealloc(RxHeap * heap, void *block,
RwUInt32 newSize, RwBool allowCopy);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#if (defined(DISABLERWHEAP))
typedef struct rxHeapMallocTrace rxHeapMallocTrace;
struct rxHeapMallocTrace
{
rxHeapMallocTrace *next;
rxHeapBlockHeader *block;
};
#endif /* (defined(DISABLERWHEAP)) */
/*--- Automatically derived from: C:/daily/rwsdk/src/pipe/p2/p2dep.h ---*/
/*--- Automatically derived from: C:/daily/rwsdk/src/pipe/p2/p2core.h ---*/
extern RwInt32 _rxPipelineMaxNodes;
extern RwInt32 _rxHeapInitialSize;
/* LEGACY-SUPPORT MACRO */
#define _rwRxHeapInitialSize _rxHeapInitialSize
/* Beneficial padding of PowerPipe types is still being worked out... */
#define PADCLUSTERSx
/*************************************************************
* Global Defines
*/
#define RWBOOLTOGGLE(bVar) ((bVar == FALSE)?(bVar = TRUE):(bVar = FALSE))
/* Both these currently limited due to the use of RwUInt32 bit-fields */
#define RXNODEMAXCLUSTERSOFINTEREST 32
#define RXNODEMAXOUTPUTS 32
/* Useful (for memory alloc) to limit this during pipeline construction */
#define RXPIPELINEDEFAULTMAXNODES 64
/*
* Cluster flags
*/
#define rxCLFLAGS_NULL ((RwUInt16) 0x0000U)
#define rxCLFLAGS_CLUSTERVALID ((RwUInt16) 0x0001U)
#define rxCLFLAGS_EXTERNAL ((RwUInt16) 0x0002U)
#define rxCLFLAGS_EXTERNALMODIFIABLE ((RwUInt16) 0x0004U | 0x0002U)
#define rxCLFLAGS_MODIFIED ((RwUInt16) 0x0008U)
/*
* Packet flags
*/
#define rxPKFLAGS_NULL ((RwUInt16) 0x0000U)
/*
* used in input specification
*/
/**
* \ingroup rwcoregeneric
* \ref RxClusterValidityReq
* Flags specifying the state requirements for
* a \ref RxCluster on entry to a node */
enum RxClusterValidityReq
{
rxCLREQ_DONTWANT = 0, /**<The cluster is required but any data within it is
* not wanted and will be overwritten */
rxCLREQ_REQUIRED = 1, /**<The cluster is required and it must contain
* valid data */
rxCLREQ_OPTIONAL = 2, /**<The cluster will be used if it is present and
* contains valid data, otherwise the node will
* make do without it. */
rxCLUSTERVALIDITYREQFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
};
/**
* \ingroup rwcoregeneric
* \ref RxClusterValid
* Flags specifying the state requirements for
* a \ref RxCluster on exit from a node */
enum RxClusterValid
{
rxCLVALID_NOCHANGE = 0, /**<The cluster and its data will not change in
* validity on passing through this node */
rxCLVALID_VALID = 1, /**<The cluster and its data will be valid on
* exit from this node */
rxCLVALID_INVALID = 2, /**<The cluster's data will be invalid on
* exit from this node */
rxCLUSTERVALIDFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
};
/****************************************************************************
Global Types
*/
typedef struct RxClusterDefinition RxClusterDefinition;
typedef struct rxReq rxReq;
typedef enum RxClusterValidityReq RxClusterValidityReq;
typedef enum RxClusterValid RxClusterValid;
typedef struct RxOutputSpec RxOutputSpec;
typedef struct RxClusterRef RxClusterRef;
typedef struct RxIoSpec RxIoSpec;
typedef struct RxNodeMethods RxNodeMethods;
typedef struct RxNodeDefinition RxNodeDefinition;
typedef struct RxCluster RxCluster;
typedef struct RxPipelineCluster RxPipelineCluster;
typedef struct RxPacket RxPacket;
typedef struct RxPipelineNode RxPipelineNode;
typedef struct RxPipelineNodeTopSortData RxPipelineNodeTopSortData;
typedef struct RxPipelineNode RxPipelineNodeInstance;
typedef struct RxPipelineNodeParam RxPipelineNodeParam;
typedef struct RxExecutionContext RxExecutionContext;
typedef struct RxPipelineRequiresCluster RxPipelineRequiresCluster;
typedef struct RxPipeline RxPipeline;
/***************************************************************************
*
* C L U S T E R D E F I N I T I O N
*
***************************************************************************/
/**
* \ingroup rwcoregeneric
* \struct RxClusterDefinition
* Structure describing a cluster */
struct RxClusterDefinition
{
RwChar *name; /**< Name */
RwUInt32 defaultStride; /**< Default stride */
RwUInt32 defaultAttributes; /**< Default attributes */
const RwChar *attributeSet; /**< Attribute set */
};
/***************************************************************************
*
* N O D E D E F I N I T I O N S T R U C T S
*
***************************************************************************/
/**
* \ingroup rwcoregeneric
* \struct RxOutputSpec
* Structure describing an output specification of a node */
struct RxOutputSpec
{
RwChar *name; /**< Name */
RxClusterValid *outputClusters; /**< States of clusters of interest on output */
RxClusterValid allOtherClusters; /**< States of clusters not of interest on output */
};
/**
* \ingroup rwcoregeneric
* \ref RxClusterForcePresent
* Flags specifying whether an \ref RxCluster
* should be forced to be present in an \ref RxPipelineNode */
enum RxClusterForcePresent
{
rxCLALLOWABSENT = FALSE, /**<The cluster is allowed to be absent if no prior
* nodes create it and no subsequent nodes require it */
rxCLFORCEPRESENT = TRUE, /**<The cluster must be present even if no prior
* nodes create it and no subsequent nodes require it */
rxCLUSTERFORCEPRESENTFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
};
typedef enum RxClusterForcePresent RxClusterForcePresent;
/**
* \ingroup rwcoregeneric
* \struct RxClusterRef
* Structure describing a cluster reference */
struct RxClusterRef
{
RxClusterDefinition *clusterDef; /**< Cluster definition */
RxClusterForcePresent forcePresent; /**< Specifies whether the cluster should be forced present */
RwUInt32 reserved; /**< Omit or initialize to zero */
};
#define rxCLRESERVED ((RwUInt32)0)
/**
* \ingroup rwcoregeneric
* \struct RxIoSpec
* Structure describing an input/output specification of a node */
struct RxIoSpec
{
RwUInt32 numClustersOfInterest;/**< Number of Clusters of interest */
RxClusterRef *clustersOfInterest; /**< Clusters of interest array */
RxClusterValidityReq *inputRequirements; /**< Requirements of the clusters of interest on input to the node */
RwUInt32 numOutputs; /**< Number of outputs from the node */
RxOutputSpec *outputs; /**< Output specification array */
};
/**
* \ingroup rwcoregeneric
* \typedef RxNodeBodyFn
* is the callback to be
* called during pipeline execution -- and, typically, process
* \ref RxPacket's -- for the owning pipeline node.
*
* \param self A pointer to the pipeline node being executed
* \param params A pointer to a parameter structure
*
* \return TRUE on success, FALSE otherwise.
*
* \see RxNodeMethods
*/
typedef RwBool (*RxNodeBodyFn) (RxPipelineNode * self,
const RxPipelineNodeParam *params);
/**
* \ingroup rwcoregeneric
* \typedef RxNodeInitFn
* is the callback to be called,
* for the owning node definition, the first time an \ref RxPipeline
* referencing that node definition is unlocked.
*
* \param self A pointer to the node definition
*
* \return TRUE on success, FALSE otherwise.
*
* \see RxNodeMethods
*/
typedef RwBool (*RxNodeInitFn) (RxNodeDefinition * self);
/**
* \ingroup rwcoregeneric
* \typedef RxNodeTermFn
* is the callback to be called,
* for the owning node definition, the last time an \ref RxPipeline
* referencing that node definition is destroyed or locked.
*
* \param self A pointer to the node definition
*
* \return None
*
* \see RxNodeMethods
*/
typedef void (*RxNodeTermFn) (RxNodeDefinition * self);
/**
* \ingroup rwcoregeneric
* \typedef RxPipelineNodeInitFn
* is the callback to be called, for the owning pipeline node, whenever a
* \ref RxPipeline containing that that pipeline node is unlocked.
*
* \param self A pointer to the pipeline node
*
* \return TRUE on success, FALSE otherwise.
*
* \see RxNodeMethods
*/
typedef RwBool (*RxPipelineNodeInitFn) (RxPipelineNode * self);
/**
* \ingroup rwcoregeneric
* \typedef RxPipelineNodeTermFn
* is the callback to be called, for the owning pipeline node, whenever a
* \ref RxPipeline containing that that pipeline node is locked or
* destroyed.
*
* \param self A pointer to the pipeline node
*
* \return None
*
* \see RxNodeMethods
*/
typedef void (*RxPipelineNodeTermFn) (RxPipelineNode * self);
/**
* \ingroup rwcoregeneric
* \typedef RxPipelineNodeConfigFn
* is the callback to be called, for the owning pipeline node, whenever a
* \ref RxPipeline containing that that pipeline node is unlocked,
* *after* all \ref RxPipelineNodeInitFn's have been called for the
* pipeline in question. This func is to be used as described in
* RxPipelineNodeSendConfigMsg.
*
* \param self A pointer to the pipeline node
* \param pipeline A pointer to the containing pipeline
*
* \return TRUE on success, FALSE otherwise.
*
* \see RxNodeMethods
*/
typedef RwBool (*RxPipelineNodeConfigFn) (RxPipelineNode * self,
RxPipeline * pipeline);
/* - removed from the API Reference January 2002 -
typedef RxConfigMsgHandlerFn
is the callback to be called, for the owning pipeline node, whenever
a message is sent to it by the ref RxPipelineNodeConfigFn of another
pipeline node in the same pipeline. See ref RxPipelineNodeSendConfigMsg.
param self A pointer to the pipeline node
param msg Message ID
param intparam Meaning is message-specific
param ptrparam Meaning is message-specific
return A RwInt32 value, 0: unserviced; -ve: error; +ve: informative success
see RxNodeMethods
*/
typedef RwUInt32 (*RxConfigMsgHandlerFn) (RxPipelineNode * self,
RwUInt32 msg,
RwUInt32 intparam,
void *ptrparam);
/**
* \ingroup rwcoregeneric
* \struct RxNodeMethods
* A structure describing a set
* of node methods
*
* \see RxNodeBodyFn
* \see RxNodeInitFn
* \see RxNodeTermFn
* \see RxPipelineNodeInitFn
* \see RxPipelineNodeTermFn
* \see RxPipelineNodeConfigFn
* \see RxConfigMsgHandlerFn
*/
struct RxNodeMethods
{
RxNodeBodyFn nodeBody; /**< Node body function */
RxNodeInitFn nodeInit; /**< Node initialization function */
RxNodeTermFn nodeTerm; /**< Node termination function */
RxPipelineNodeInitFn pipelineNodeInit; /**< Pipeline node initialization function */
RxPipelineNodeTermFn pipelineNodeTerm; /**< Pipeline node termination function */
RxPipelineNodeConfigFn pipelineNodeConfig; /**< Pipleline node configuation function */
RxConfigMsgHandlerFn configMsgHandler; /**< Configuaraton message handler function */
};
/**
* \ingroup rwcoregeneric
* \ref RxNodeDefEditable
* Flags specifying whether an \ref RxNodeDefinition
* is editable or not (\ref RxPipelineNodeCloneDefinition,
* \ref RxPipelineNodeReplaceCluster and \ref RxPipelineNodeRequestCluster
* create editable copies of node definitions as the originals may be
* static definitions). */
enum RxNodeDefEditable
{
/**<This node definition should not be freed */
rxNODEDEFCONST = FALSE,
/**< This node definition is a temporary,
* modified copy of another and can be freed */
rxNODEDEFEDITABLE = TRUE,
rxNODEDEFEDITABLEFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
};
typedef enum RxNodeDefEditable RxNodeDefEditable;
/**
* \ingroup rwcoregeneric
* \struct RxNodeDefinition
* A structure describing a node definition */
struct RxNodeDefinition
{
RwChar *name; /**< Name */
RxNodeMethods nodeMethods; /**< Node methods */
RxIoSpec io; /**< Input/output specification */
RwUInt32 pipelineNodePrivateDataSize; /**< Size in bytes of node's private data */
RxNodeDefEditable editable; /**< Flags whether a node is editable */
RwInt32 InputPipesCnt; /**< Count of the unlocked pipelines containing this node */
};
/***************************************************************************
*
* P I P E L I N E - E X E C U T I O N - T I M E S T R U C T S
*
***************************************************************************/
/**
* \ingroup rwcoregeneric
* \struct RxPipelineCluster
* A structure describing a pipeline cluster;
* that is, an \ref RxClusterDefinition in the context of a specific \ref RxPipeline
* (in the same way as an \ref RxPipelineNode is an \ref RxNodeDefinition in the
* context of a specific \ref RxPipeline). The \ref RxCluster is the structure
* representing this and the \ref RxClusterDefinition within \ref RxPacket's at
* pipeline-execution-time */
struct RxPipelineCluster
{
RxClusterDefinition *clusterRef; /**< Cluster refererence */
RwUInt32 creationAttributes; /**< Creation Attributes */
};
/**
* \ingroup rwcoregeneric
* \struct RxCluster
* A structure describing a cluster; this is
* the representative of an \ref RxClusterDefinition and \ref RxPipelineCluster
* within \ref RxPacket's at pipeline-execution-time. */
struct RxCluster
{
RwUInt16 flags; /**< Bitfield of flags e.g. modification permissions */
RwUInt16 stride; /**< Stride in bytes of the cluster's data */
void *data; /**< The Cluster's data */
void *currentData; /**< A 'cursor', referencing the current element in the data */
RwUInt32 numAlloced; /**< Allocated count */
RwUInt32 numUsed; /**< Used count */
RxPipelineCluster *clusterRef; /**< Valid after a cluster has been locked for writing,
* otherwise NULL. Analog of \ref RxPipelineNode and
* its 'nodeDef' member. */
RwUInt32 attributes; /**< Attributes */
#ifdef PADCLUSTERS
RwUInt32 pad[1]; /**< Alignment padding */
#endif
};
/**
* \ingroup rwcoregeneric
* \struct RxPacket
* A structure describing a packet header */
struct RxPacket
{
RwUInt16 flags; /**< Flags to guide pipeline execution */
RwUInt16 numClusters; /**< Maximum number of clusters simultanesouly present in the current pipeline */
RxPipeline *pipeline; /**< The pipeline in which this packet is embedded (the current pipeline) */
RwUInt32 *inputToClusterSlot; /**< LUT to locate clusters of interest in the packet */
RwUInt32 *slotsContinue; /**< Bitfields specifying clusters persisting to output node */
RxPipelineCluster **slotClusterRefs; /**< Internal Use */
#ifdef PADCLUSTERS
RwUInt32 pad[3]; /**< Alignment padding */
#endif
RxCluster clusters[1]; /**< Cluster array large enough for widest part of the pipeline */
};
/**
* \ingroup rwcoregeneric
* \struct RxPipelineNode
* Structure describing a pipeline Node;
* that is an \ref RxNodeDefinition in the context
* of a specific \ref RxPipeline.
*/
struct RxPipelineNode
{
RxNodeDefinition *nodeDef; /**< Node definition reference */
RwUInt32 numOutputs; /**< Output count */
RwUInt32 *outputs; /**< Output array, indexing the pipeline's array of pipeline nodes */
RxPipelineCluster **slotClusterRefs; /**< For packets passing through this node, SlotClusterRefs[n]
* identifies the cluster to be found at index n in the packet's
* Clusters[] array. These assignments are determined at pipeline
* Unlock() time and are good for the life of the pipeline. */
RwUInt32 *slotsContinue; /**< Cluster persistence table for the node's outputs */
void *privateData; /**< Pointer to the pipeline Node's private data */
RwUInt32 *inputToClusterSlot; /**< LUT to locate clusters of interest in packets passing through this pipeline Node */
RxPipelineNodeTopSortData *topSortData; /**< Internal Use */
void *initializationData; /**< Used by the pipeline node initialisation
* function in setting up the Private data. */
RwUInt32 initializationDataSize; /**< Present so that if the node is cloned
* we can copy the initialisation data. */
};
/**
* \ingroup rwcoregeneric
* \struct RxPipelineNodeTopSortData
* Structure describing data used during topological sorting
* during \ref RxLockedPipeUnlock ;
* RenderWare users do not need to understand this */
struct RxPipelineNodeTopSortData
{
RwUInt32 numIns; /**< Input count */
RwUInt32 numInsVisited; /**< Count of inputs visited during dependencies
* propagation/cluster slot allocation */
rxReq *req; /**< Req used in dependencies propagation/cluster
* slot allocation */
};
/**
* \ingroup rwcoregeneric
* \struct RxPipelineNodeParam
* Structure holding parameters
* to pass to node body functions */
struct RxPipelineNodeParam
{
void *dataParam; /**< The data pointer passed in to \ref RxPipelineExecute */
RxHeap *heap; /**< The heap associated with the current pipeline exeuction */
};
enum rxEmbeddedPacketState
{
rxPKST_PACKETLESS = 0, /* Packet not created */
rxPKST_UNUSED = 1, /* Packet created and then destroyed */
rxPKST_INUSE = 2, /* Packet created but not yet destroyed and fetched but not yet dispatched */
rxPKST_PENDING = 3, /* Packet created but not destroyed and dispatched but not yet fetched */
rxEMBEDDEDPACKETSTATEFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
};
typedef enum rxEmbeddedPacketState rxEmbeddedPacketState;
/**
* \ingroup rwcoregeneric
* \struct RxExecutionContext
* Structure describing an execution context */
struct RxExecutionContext
{
RxPipeline *pipeline; /**< Currently executing pipeline */
RxPipelineNode *currentNode; /**< Currently executing node */
RwInt32 exitCode; /**< Used internally for nodes returning error codes on exit */
RwUInt32 pad; /**< Alignment padding */
RxPipelineNodeParam params; /**< The parameters passed to node bodies */
/*RwUInt32 pad[2];*/
};
/**
* \ingroup rwcoregeneric
* \struct RxPipelineRequiresCluster
* Structure describing a pipeline requirement of a cluster */
struct RxPipelineRequiresCluster
{
RxClusterDefinition *clusterDef; /**< Reference to a Cluster definition */
RxClusterValidityReq rqdOrOpt; /**< Cluster validity requirement (rxCLREQ_DONTWANT, rxCLREQ_REQUIRED or rxCLREQ_OPTIONAL) */
RwUInt32 slotIndex; /**< Index into the packet's cluster array within this pipeline */
};
/**
* \ingroup rwcoregeneric
* \struct RxPipeline
* Structure describing a pipeline */
struct RxPipeline
{
RwBool locked; /**< Flags whether the pipeline is locked for editing */
RwUInt32 numNodes; /**< Node count */
RxPipelineNode *nodes; /**< Topologically sorted array of pipeline nodes */
RwUInt32 packetNumClusterSlots; /**< Number of slots allocated for clusters */
rxEmbeddedPacketState embeddedPacketState; /**< The state of this pipeline's embedded packet */
RxPacket *embeddedPacket; /**< This pipeline's embedded packet */
RwUInt32 numInputRequirements; /**< Input requirements count */
RxPipelineRequiresCluster *inputRequirements; /**< Input requirements array */
void *superBlock; /**< Internally used block of memory */
RwUInt32 superBlockSize; /**< Internally used block of memory */
RwUInt32 entryPoint; /**< The index of the node which is the entry point of this pipeline */
RwUInt32 pluginId; /**< If required, the Id of the plugin owning this pipeline, or 0 */
RwUInt32 pluginData; /**< Rights callback extra data */
};
/****************************************************************************
* Global Prototypes
*/
/**
* \ingroup rwcoregeneric
* \typedef RxPipelineNodeOutputCallBack
* is the callback function supplied
* to \ref RxPipelineNodeForAllConnectedOutputs.
*
* The callback will be passed a pointer to the \ref RxPipelineNode whose
* outputs are being traversed and a pointer to the current output
* \ref RxPipelineNode, as well as a pointer to an optional user-defined
* data structure (callbackdata). If no such structure was specified, this
* will be NULL.
*
* \param node A pointer to the pipeline node whose outputs
* are being traversed
* \param outputnode A pointer to the current output
* pipeline node
* \param callbackdata A pointer to optional user-supplied data
*
* \return Returns a pointer to the \ref RxPipelineNode whose outputs are being
* traversed, or NULL to terminate traversal
*/
typedef RxPipelineNode * (*RxPipelineNodeOutputCallBack) (RxPipelineNode * node,
RxPipelineNode * outputnode,
void *callbackdata);
#ifdef RWDEBUG
#define RXCHECKFORUSERTRAMPLING(_pipeline) \
( _rwPipelineCheckForTramplingOfNodePrivateSpace(_pipeline) )
#endif /* RWDEBUG */
#if (!defined(RXCHECKFORUSERTRAMPLING))
#define RXCHECKFORUSERTRAMPLING(_pipeline) /* No op */
#endif /* (!defined(RXCHECKFORUSERTRAMPLING)) */
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
extern RwBool
_rxPipelineOpen(void);
extern RwBool
_rxPipelineClose(void);
extern RwBool
rxPipelinePluginsAttach(void);
extern RxPipeline *
RxPipelineCreate(void);
extern void
_rxPipelineDestroy(RxPipeline * Pipeline);
#define _RxPipelineDestroy(_ppln) _rxPipelineDestroy(_ppln)
#define RxPipelineDestroy(_ppln) (_rxPipelineDestroy(_ppln), TRUE)
extern RxHeap *
RxHeapGetGlobalHeap(void);
extern RxPipeline *
RxPipelineExecute(RxPipeline * pipeline,
void * data,
RwBool heapReset);
extern RxPacket *
RxPacketCreate(RxPipelineNode * node);
extern RxCluster *
RxClusterSetStride(RxCluster * cluster,
RwInt32 stride);
extern RxCluster *
RxClusterSetExternalData(RxCluster * cluster,
void *data,
RwInt32 stride,
RwInt32 numElements);
extern RxCluster *
RxClusterSetData(RxCluster * cluster,
void *data,
RwInt32 stride,
RwInt32 numElements);
/* underlying PacketDestroy function */
extern void
_rxPacketDestroy(RxPacket * Packet);
/* more convenient parameterization */
#define RxPacketDestroy(pk, self) \
( _rxPacketDestroy(pk) )
#if (defined(RWDEBUG))
extern RxPacket *RxPacketFetch(RxPipelineNode * Node);
extern void RxPacketDispatch(RxPacket * packet,
RwUInt32 output,
RxPipelineNode * self);
extern void RxPacketDispatchToPipeline(RxPacket * packet,
RxPipeline * dest,
RxPipelineNode * self);
#else /* (defined(RWDEBUG)) */
#define RxPacketFetch(_self) \
rxPacketFetchMacro(_self)
#define RxPacketDispatch( _packet, _output, _self) \
rxPacketDispatchMacro(_packet, _output, _self)
#define RxPacketDispatchToPipeline( _packet, _pipeline, _self) \
rxPacketDispatchToPipelineMacro(_packet, _pipeline, _self)
#endif /* (defined(RWDEBUG)) */
#define RxClusterInitialiseData(_clstr, _nmlmnts, _strd) \
( RxClusterInitializeData((_clstr), (_nmlmnts), (_strd)) )
extern RxCluster *
RxClusterInitializeData(RxCluster *cluster, RwUInt32 numElements, RwUInt16 stride);
extern RxCluster *
RxClusterResizeData(RxCluster *CurrentCluster, RwUInt32 NumElements);
extern RxCluster *
RxClusterDestroyData(RxCluster *CurrentCluster);
#if (defined(RWDEBUG))
extern RxCluster *RxClusterLockRead(RxPacket * packet, RwUInt32 clusterIndex);
#else /* !RWDEBUG */
#define RXCLSLOT(PKT, CLIND) \
((PKT)->inputToClusterSlot[(CLIND)])
#define RxClusterLockRead(PKT, CLIND) \
( (((RwInt32)RXCLSLOT(PKT, CLIND)) == -1) ? \
((RxCluster *)NULL) : \
(RxClusterResetCursor(&PKT->clusters[RXCLSLOT(PKT, CLIND)]), \
&PKT->clusters[RXCLSLOT(PKT, CLIND)]) )
#endif /* !RWDEBUG */
extern RxCluster *
RxClusterLockWrite(RxPacket * packet,
RwUInt32 clusterIndex,
RxPipelineNode * node);
extern void
RxClusterUnlock(RxCluster * cluster);
extern RwUInt32
RxPipelineNodeSendConfigMsg(RxPipelineNode * dest,
RwUInt32 msg,
RwUInt32 intparam,
void *ptrparam);
extern RxPipelineNode *
RxPipelineNodeForAllConnectedOutputs(RxPipelineNode * node,
RxPipeline * pipeline,
RxPipelineNodeOutputCallBack callbackfn,
void *callbackdata);
/* Cluster attributes api [pipeline construction time] */
extern RxPipelineCluster *
RxPipelineNodeGetPipelineCluster(RxPipelineNode *node,
RwUInt32 clustersOfInterestIndex);
extern RwUInt32
RxPipelineClusterGetCreationAttributes(RxPipelineCluster *cluster);
extern RxPipelineCluster *
RxPipelineClusterSetCreationAttributes(RxPipelineCluster *cluster,
RwUInt32 creationAttributes);
/* Cluster attributes api [pipeline execution time] */
extern RwUInt32
RxClusterGetAttributes(RxCluster *cluster);
extern RxCluster *
RxClusterSetAttributes(RxCluster *cluster, RwUInt32 attributes);
extern void
_rxEmbeddedPacketBetweenPipelines(RxPipeline * fromPipeline,
RxPipeline * toPipeline);
extern RxPipelineNode *
_rxEmbeddedPacketBetweenNodes(RxPipeline *pipeline,
RxPipelineNode *nodeFrom,
RwUInt32 whichOutput);
extern RxExecutionContext _rxExecCtxGlobal;
/* Summary of dispatch rules:
* o nodes that never fetch are safe to dispatch NULL, whether
* nodes above pass them a packet or not
* o if you destroy the packet you can dispatch(NULL,,)
* o if you fetch/create and dispatch(NULL), it doesn't really
* matter - the packet'll get passed on anyway */
/* TODO: there's currently no way to prematurely terminate the pipeline
* without doing so as an error condition. You should create an
* enum for the exit code, either RXNODEEXITCONTINUE, RXNODEEXITTERMINATE
* or RXNODEEXTTERMINATEERROR and then test for RXNODEEXITCONTINUE in
* the below macros rather than FALSE. */
/* TODO: _packet redundant here... create a new macro and legacy wrapper */
#define rxPacketDispatchMacro(_packet, _output, _self) \
MACRO_START \
{ \
RxPipeline *curPipeline = _rxExecCtxGlobal.pipeline; \
\
/* _packet is now an obsolete parameter */ \
\
if ( FALSE != _rxExecCtxGlobal.exitCode ) \
{ \
RxPipelineNode *nextNode = \
_rxEmbeddedPacketBetweenNodes(curPipeline, \
_self, \
(_output)); \
if ( nextNode != NULL ) \
{ \
RwUInt32 exitCode = \
nextNode->nodeDef->nodeMethods.nodeBody( \
nextNode, &(_rxExecCtxGlobal.params)); \
/* Don't overwrite 'error' with 'success' */ \
if (FALSE == exitCode) _rxExecCtxGlobal.exitCode = exitCode; \
} \
} \
if ( curPipeline->embeddedPacketState > rxPKST_UNUSED \
/* !UNUSED and !PACKETLESS */ ) \
{ \
curPipeline->embeddedPacketState = rxPKST_INUSE; \
_rxPacketDestroy(curPipeline->embeddedPacket); \
} \
} \
MACRO_STOP
/* TODO: _self redundant here... create a new macro and legacy wrapper */
#define rxPacketDispatchToPipelineMacro(_packet, _pipeline, _self) \
MACRO_START \
{ \
RxPipeline *toPipeline = (_pipeline); \
\
/* _packet is now an obsolete parameter */ \
\
if ( FALSE != _rxExecCtxGlobal.exitCode ) \
{ \
RwUInt32 exitCode; \
RxPipeline *fromPipeline = _rxExecCtxGlobal.pipeline; /* save */ \
_rxEmbeddedPacketBetweenPipelines(fromPipeline, \
toPipeline); \
_rxExecCtxGlobal.pipeline = toPipeline; /* modify */ \
exitCode = \
toPipeline->nodes[0].nodeDef->nodeMethods.nodeBody( \
&toPipeline->nodes[0], &(_rxExecCtxGlobal.params)); \
if ( FALSE == exitCode ) _rxExecCtxGlobal.exitCode = exitCode; \
_rxExecCtxGlobal.pipeline = fromPipeline; /* restore */ \
} \
if ( toPipeline->embeddedPacketState > rxPKST_UNUSED \
/* !UNUSED and !PACKETLESS */ ) \
{ \
toPipeline->embeddedPacketState = rxPKST_INUSE; \
_rxPacketDestroy(toPipeline->embeddedPacket); \
} \
} \
MACRO_STOP
#define rxPacketFetchMacro(_node) \
( ((_rxExecCtxGlobal.pipeline)->embeddedPacketState == rxPKST_PENDING) ?\
((_rxExecCtxGlobal.pipeline)->embeddedPacketState = rxPKST_INUSE, \
(_rxExecCtxGlobal.pipeline)->embeddedPacket) : \
(NULL) )
#ifdef __cplusplus
}
#endif /* __cplusplus */
/*--- Automatically derived from: C:/daily/rwsdk/src/pipe/p2/d3d8/nodeD3D8SubmitNoLight.h ---*/
/*--- Automatically derived from: C:/daily/rwsdk/src/pipe/p2/p2define.h ---*/
/**
* \ingroup rwcoregeneric
* \typedef RxNodeOutput
* typedef for a reference to an output of a pipeline node */
typedef RwUInt32 *RxNodeOutput;
/**
* \ingroup rwcoregeneric
* \typedef RxNodeInput
* typedef for a reference to the input of a pipeline node */
typedef RxPipelineNode *RxNodeInput;
/**
* \ingroup rwcoregeneric
* \typedef RxLockedPipe
* typedef for a reference to a locked pipeline
*/
typedef RxPipeline RxLockedPipe;
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
/* PIPELINENODE API */
extern RxNodeOutput
RxPipelineNodeFindOutputByName(RxPipelineNode *node,
const RwChar *outputname);
extern RxNodeOutput
RxPipelineNodeFindOutputByIndex(RxPipelineNode *node,
RwUInt32 outputindex);
extern RxNodeInput
RxPipelineNodeFindInput(RxPipelineNode *node);
extern RxNodeDefinition *
RxPipelineNodeCloneDefinition(RxPipelineNode *node,
RxClusterDefinition *cluster2add);
extern RxPipeline *
RxPipelineNodeRequestCluster(RxPipeline *pipeline,
RxPipelineNode *node,
RxClusterDefinition *clusterDef);
extern RxPipeline *
RxPipelineNodeReplaceCluster(RxPipeline *pipeline,
RxPipelineNode *node,
RxClusterDefinition *oldClusterDef,
RxClusterDefinition *newClusterDef);
extern void *
RxPipelineNodeGetInitData(RxPipelineNode *node);
extern void *
RxPipelineNodeCreateInitData(RxPipelineNode *node,
RwUInt32 size);
/* PIPELINE MANIPULATION API */
extern RxPipeline *
RxPipelineClone(RxPipeline *pipeline);
extern RxPipelineNode *
RxPipelineFindNodeByName(RxPipeline *pipeline,
const RwChar *name,
RxPipelineNode *start,
RwInt32 *nodeIndex);
extern RxPipelineNode *
RxPipelineFindNodeByIndex(RxPipeline *pipeline,
RwUInt32 nodeindex);
extern RxLockedPipe *
RxPipelineLock(RxPipeline *pipeline);
extern RxPipeline *
RxLockedPipeUnlock(RxLockedPipe *pipeline);
extern RxLockedPipe *
RxLockedPipeAddFragment(RxLockedPipe *pipeline,
RwUInt32 *firstIndex,
RxNodeDefinition *nodeDef0,
...);
extern RxPipeline *
RxLockedPipeReplaceNode(RxLockedPipe *pipeline,
RxPipelineNode *node,
RxNodeDefinition *nodeDef);
extern RxPipeline *
RxLockedPipeDeleteNode(RxLockedPipe *pipeline,
RxPipelineNode *node);
extern RxPipeline *
RxLockedPipeSetEntryPoint(RxLockedPipe *pipeline,
RxNodeInput in);
extern RxPipelineNode *
RxLockedPipeGetEntryPoint(RxLockedPipe *pipeline);
extern RxPipeline *
RxLockedPipeAddPath(RxLockedPipe *pipeline,
RxNodeOutput out,
RxNodeInput in);
extern RxPipeline *
RxLockedPipeDeletePath(RxLockedPipe *pipeline,
RxNodeOutput out,
RxNodeInput in);
extern RxPipeline *
RxPipelineInsertDebugNode(RxPipeline *pipeline,
RxPipelineNode *before,
RxPipelineNode *after,
RxNodeDefinition *debugNode);
#ifdef __cplusplus
}
#endif /* __cplusplus */
/*--- Automatically derived from: C:/daily/rwsdk/src/pipe/p2/p2altmdl.h ---*/
/*--- Automatically derived from: C:/daily/rwsdk/src/pipe/p2/nodeTransform.h ---*/
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
extern RxNodeDefinition *RxNodeDefinitionGetTransform(void);
#ifdef __cplusplus
}
#endif /* __cplusplus */
/*--- Automatically derived from: C:/daily/rwsdk/src/pipe/p2/nodeSubmitTriangle.h ---*/
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
extern RxNodeDefinition * RxNodeDefinitionGetSubmitTriangle(void);
#ifdef __cplusplus
}
#endif /* __cplusplus */
/*--- Automatically derived from: C:/daily/rwsdk/src/pipe/p2/nodeSubmitLine.h ---*/
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
extern RxNodeDefinition * RxNodeDefinitionGetSubmitLine(void);
#ifdef __cplusplus
}
#endif /* __cplusplus */
/*--- Automatically derived from: C:/daily/rwsdk/src/pipe/p2/nodeScatter.h ---*/
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
extern RxNodeDefinition * RxNodeDefinitionGetScatter(void);
#ifdef __cplusplus
}
#endif /* __cplusplus */
/*--- Automatically derived from: C:/daily/rwsdk/src/pipe/p2/nodeClone.h ---*/
typedef struct RxPacketCacheCluster RxPacketCacheCluster;
/**
* \ingroup rwcoregeneric
* \struct RxPacketCacheCluster
* structure containing a cache of an \ref RxCluster's
* within an \ref RxPacketCache
*/
struct RxPacketCacheCluster
{
RwUInt32 slot; /**< A \ref RwUInt32 index into the \ref RxPacketCache's
* array of RxPacketCacheCluster's */
RwUInt16 flags; /**< A cache of the original cluster's flags */
RwUInt16 stride; /**< A cache of the original cluster's stride */
void *data; /**< A cache of the original cluster's data */
RwUInt32 numAlloced; /**< A cache of the original cluster's numAlloced */
RwUInt32 numUsed; /**< A cache of the original cluster's numUsed */
RxPipelineCluster *clusterRef; /**< A cache of the original cluster's \ref RxPipelineCluster */
};
typedef struct RxPacketCache RxPacketCache;
/**
* \ingroup rwcoregeneric
* \struct RxPacketCache
* structure containing a cache of a \ref RxPacket */
struct RxPacketCache
{
RwUInt16 packetFlags; /**< A cache of the original packet's flags */
RwUInt16 pad[1]; /**< Alignment padding */
RwUInt32 numClusters; /**< The number of present clusters in the
* original packet when it was cloned */
RwBool lastCloneDone;/**< Once the cache has been cloned by \ref RxPacketCacheClone
* with (lastClone == TRUE), it should not be used again! */
RwUInt32 pad2[1]; /**< Alignment padding */
RxPacketCacheCluster clusters[1]; /**< An array of \ref RxPacketCacheCluster's,
* extending beyond 1 element */
};
typedef struct RxNodeCloneInitData RxNodeCloneInitData;
/**
* \ingroup rwcoregeneric
* \struct RxNodeCloneInitData
* structure with which to initialize
* clone a \ref RxNodeDefinition,
* through \ref RxNodeDefinitionCloneCreate and
* set up cloned \ref RxPipelineNode modes, through
* \ref RxPipelineNodeCloneDefineModes */
struct RxNodeCloneInitData
{
RwUInt32 numModes; /**< Specifies the number of modes in
which the node should operate */
RwUInt32 numOutputs; /**< Specifies the number of outputs of this
Clone node, which is also the maximum
number of outputs to which any one mode
may dispatch packets */
RwUInt32 *modeSizes; /**< Specifies the number of outputs to which
each mode dispatches packets */
RwUInt32 **modes; /**< An array of numModes pointers to arrays
(of length numOutputs) specifying the
outputs, in order, to which each mode
should dispatch packets (output zero is
the first output) */
};
/**
* \ingroup rwcoregeneric
* \struct RxNodeCloneData
* structure which is the private
* data of Clone nodes \ref RxPipelineNode */
typedef struct RxNodeCloneData RxNodeCloneData;
struct RxNodeCloneData
{
RwBool optimized; /**< \ref RwBool specifying whether \ref RxPipelineNodeCloneOptimize
* has been run on this \ref RxPipelineNode yet */
RwUInt32 currentMode; /**< \ref RwUInt32 The current mode of operation */
RxNodeCloneInitData *data;/**< A pointer to \ref RxNodeCloneInitData data
* specifying the modes of operation */
};
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
extern RxNodeDefinition *RxNodeDefinitionCloneCreate(RxNodeCloneInitData *data);
extern RwBool RxPipelineNodeCloneDefineModes(
RxPipeline *pipeline,
RxPipelineNode *node,
RxNodeCloneInitData *data);
extern RwBool RxNodeDefinitionCloneDestroy(RxNodeDefinition *def);
extern RwBool RxPipelineNodeCloneOptimize(RxPipeline *pipeline,
RxPipelineNode *node);
#ifdef __cplusplus
}
#endif /* __cplusplus */
/*--- Automatically derived from: C:/daily/rwsdk/src/pipe/p2/nodeImmStash.h ---*/
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
extern RxNodeDefinition *RxNodeDefinitionGetImmStash(void);
#ifdef __cplusplus
}
#endif /* __cplusplus */
/*--- Automatically derived from: C:/daily/rwsdk/src/pipe/p2/nodeImmRenderSetup.h ---*/
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
extern RxNodeDefinition * RxNodeDefinitionGetImmRenderSetup(void);
#ifdef __cplusplus
}
#endif /* __cplusplus */
/*--- Automatically derived from: C:/daily/rwsdk/src/pipe/p2/nodeImmMangleTriangleIndices.h ---*/
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
extern RxNodeDefinition *RxNodeDefinitionGetImmMangleTriangleIndices(void);
#ifdef __cplusplus
}
#endif /* __cplusplus */
/*--- Automatically derived from: C:/daily/rwsdk/src/pipe/p2/nodeImmMangleLineIndices.h ---*/
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
extern RxNodeDefinition * RxNodeDefinitionGetImmMangleLineIndices(void);
#ifdef __cplusplus
}
#endif /* __cplusplus */
/*--- Automatically derived from: C:/daily/rwsdk/src/pipe/p2/nodeImmInstance.h ---*/
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
extern RxNodeDefinition * RxNodeDefinitionGetImmInstance(void);
#ifdef __cplusplus
}
#endif /* __cplusplus */
/*--- Automatically derived from: C:/daily/rwsdk/src/pipe/p2/nodeCullTriangle.h ---*/
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
extern RxNodeDefinition * RxNodeDefinitionGetCullTriangle(void);
#ifdef __cplusplus
}
#endif /* __cplusplus */
/*--- Automatically derived from: C:/daily/rwsdk/src/pipe/p2/nodeClipTriangle.h ---*/
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
extern RxNodeDefinition *RxNodeDefinitionGetClipTriangle(void);
#ifdef __cplusplus
}
#endif /* __cplusplus */
/*--- Automatically derived from: C:/daily/rwsdk/src/pipe/p2/nodeClipLine.h ---*/
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
extern RxNodeDefinition *RxNodeDefinitionGetClipLine(void);
#ifdef __cplusplus
}
#endif /* __cplusplus */
/*--- Automatically derived from: C:/daily/rwsdk/driver/d3d8/d3d8texdic.h ---*/
/*--- Automatically derived from: C:/daily/rwsdk/driver/d3d8/d3d8rendst.h ---*/
/*--- Automatically derived from: C:/daily/rwsdk/driver/d3d8/d3d8raster.h ---*/
/*--- Automatically derived from: C:/daily/rwsdk/driver/d3d8/d3d8device.h ---*/
/*--- Automatically derived from: C:/daily/rwsdk/driver/d3d8/d3d8convrt.h ---*/
/*--- Automatically derived from: C:/daily/rwsdk/driver/d3d8/d3d82drend.h ---*/
/*--- Automatically derived from: C:/daily/rwsdk/driver/common/ssematml.h ---*/
/*--- Automatically derived from: C:/daily/rwsdk/driver/common/cpuext.h ---*/
/*--- Automatically derived from: C:/daily/rwsdk/driver/common/palquant.h ---*/
/*--- Automatically derived from: C:/daily/rwsdk/driver/common/datblkcb.h ---*/
/*--- Automatically derived from: C:/daily/rwsdk/src/baraster.h ---*/
/****************************************************************************
Defines
*/
/**
* \ingroup datatypes
* \ref RwRasterLockMode represents the options available for locking
* a raster so that it may be modified (see API function \ref RwRasterLock). An
* application may wish to write to the raster, read from the raster or
* simultaneously write and read a raster (rwRASTERLOCKWRITE | rwRASTERLOCKREAD).
*/
enum RwRasterLockMode
{
rwRASTERLOCKWRITE = 0x01, /**<Lock for writing */
rwRASTERLOCKREAD = 0x02, /**<Lock for reading */
rwRASTERLOCKNOFETCH = 0x04, /**<When used in combination with
* rwRASTERLOCKWRITE, asks the driver not to
* fetch the pixel data. This is only useful
* if it is known that ALL the raster data is
* going to be overwritten before the raster
* is unlocked, i.e. from an
* \ref RwRasterSetFromImage call. This flag
* is not supported by all drivers. */
rwRASTERLOCKRAW = 0x08, /**<When used in combination with
rwRASTERLOCKWRITE or rwRASTERLOCKREAD
allows access to the raw platform specific
pixel format */
rwRASTERLOCKMODEFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
};
#define rwRASTERLOCKREADWRITE (rwRASTERLOCKREAD|rwRASTERLOCKWRITE)
typedef enum RwRasterLockMode RwRasterLockMode;
/**
* \ingroup datatypes
* \ref RwRasterFlipMode represents
* raster flip modes */
enum RwRasterFlipMode
{
rwRASTERFLIPDONTWAIT = 0, /**<Don't wait for VSync */
rwRASTERFLIPWAITVSYNC = 1, /**<Flip on VSync */
rwRASTERFLIPMODEFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
};
typedef enum RwRasterFlipMode RwRasterFlipMode;
/**
* \ingroup datatypes
* RwRasterType
* This type represents the options available for creating a new
* raster (se API function \ref RwRasterCreate)*/
enum RwRasterType
{
rwRASTERTYPENORMAL = 0x00, /**<Normal */
rwRASTERTYPEZBUFFER = 0x01, /**<Z Buffer */
rwRASTERTYPECAMERA = 0x02, /**<Camera */
rwRASTERTYPETEXTURE = 0x04, /**<Texture */
rwRASTERTYPECAMERATEXTURE = 0x05, /**<Camera texture */
rwRASTERTYPEMASK = 0x07, /**<Mask for finding type */
rwRASTERDONTALLOCATE = 0x80, /**<If set the raster is not allocated */
rwRASTERTYPEFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
};
typedef enum RwRasterType RwRasterType;
/**
* \ingroup datatypes
* \ref RwRasterFormat is a set of values and flags which may be combined to
* specify a raster format. The format chosen for a particular raster depends
* on the hardware device and the raster type specified at creation time
* (see API function \ref RwRasterCreate). The format may be retrieved using
* API function \ref RwRasterGetFormat.
*
* The raster format is a packed set of bits which contains the following
* four pieces of information (these may be combined with bitwise OR):-
*
* <ol>
* <li> The pixel color format corresponding to one of the following values:-
* <ul>
* <li> rwRASTERFORMAT1555
* <li> rwRASTERFORMAT565
* <li> rwRASTERFORMAT4444
* <li> rwRASTERFORMATLUM8
* <li> rwRASTERFORMAT8888
* <li> rwRASTERFORMAT888
* <li> rwRASTERFORMAT16
* <li> rwRASTERFORMAT24
* <li> rwRASTERFORMAT32
* <li> rwRASTERFORMAT555
* </ul>
* This value may be masked out of the raster format using
* rwRASTERFORMATPIXELFORMATMASK.
* <li> The palette depth if the raster is palettized:-
* <ul>
* <li> rwRASTERFORMATPAL4
* <li> rwRASTERFORMATPAL8
* </ul>
* In these cases, the color format refers to that of the palette.
* <li> Flag rwRASTERFORMATMIPMAP. Set if the raster contains mipmap levels.
* <li> Flag rwRASTERFORMATAUTOMIPMAP. Set if the mipmap levels were generated
* automatically by RenderWare.
* </ol>
*/
enum RwRasterFormat
{
rwRASTERFORMATDEFAULT = 0x0000, /* Whatever the hardware likes best */
rwRASTERFORMAT1555 = 0x0100, /**<16 bits - 1 bit alpha, 5 bits red, green and blue */
rwRASTERFORMAT565 = 0x0200, /**<16 bits - 5 bits red and blue, 6 bits green */
rwRASTERFORMAT4444 = 0x0300, /**<16 bits - 4 bits per component */
rwRASTERFORMATLUM8 = 0x0400, /**<Gray scale */
rwRASTERFORMAT8888 = 0x0500, /**<32 bits - 8 bits per component */
rwRASTERFORMAT888 = 0x0600, /**<24 bits - 8 bits per component */
rwRASTERFORMAT16 = 0x0700, /**<16 bits - undefined: useful for things like Z buffers */
rwRASTERFORMAT24 = 0x0800, /**<24 bits - undefined: useful for things like Z buffers */
rwRASTERFORMAT32 = 0x0900, /**<32 bits - undefined: useful for things like Z buffers */
rwRASTERFORMAT555 = 0x0a00, /**<16 bits - 5 bits red, green and blue */
rwRASTERFORMATAUTOMIPMAP = 0x1000, /**<RenderWare generated the mip levels */
rwRASTERFORMATPAL8 = 0x2000, /**<8 bit palettised */
rwRASTERFORMATPAL4 = 0x4000, /**<4 bit palettised */
rwRASTERFORMATMIPMAP = 0x8000, /**<Mip mapping on */
rwRASTERFORMATPIXELFORMATMASK = 0x0f00, /**<The pixel color format
* (excluding palettised bits) */
rwRASTERFORMATMASK = 0xff00 /**<The whole format */ ,
rwRASTERFORMATFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
};
typedef enum RwRasterFormat RwRasterFormat;
enum RwRasterPrivateFlag
{
rwRASTERGAMMACORRECTED = 0x01,
rwRASTERPIXELLOCKEDREAD = 0x02, /* pixels are locked for reading */
rwRASTERPIXELLOCKEDWRITE = 0x04, /* pixels are locked for writing */
rwRASTERPALETTELOCKEDREAD = 0x08, /* palette is locked for reading */
rwRASTERPALETTELOCKEDWRITE = 0x10, /* palette is locked for writing */
rwRASTERPIXELLOCKEDRAW = 0x20, /* the pixels are in platform specific
format, used in combination with
rwRASTERPIXELLOCKEDREAD &
rwRASTERPIXELLOCKEDWRITE */
rwRASTERPRIVATEFLAGFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
};
typedef enum RwRasterPrivateFlag RwRasterPrivateFlag;
#define rwRASTERPIXELLOCKED (rwRASTERPIXELLOCKEDREAD | rwRASTERPIXELLOCKEDWRITE)
#define rwRASTERPALETTELOCKED (rwRASTERPALETTELOCKEDREAD | rwRASTERPALETTELOCKEDWRITE)
#define rwRASTERLOCKED (rwRASTERPIXELLOCKED|rwRASTERPALETTELOCKED)
/* How big is my stack!!! */
#define rwRASTERCONTEXTSTACKSIZE 10
/****************************************************************************
Global Types
*/
/**
* \ingroup datatypes
* \typedef RwRaster
* Raster containing device-dependent pixels.
* This should be considered an opaque type.
* Use the RwRaster API functions to access.
*/
typedef struct RwRaster RwRaster;
#if (!defined(DOXYGEN))
struct RwRaster
{
RwRaster *parent; /* Top level raster if a sub raster */
RwUInt8 *cpPixels; /* Pixel pointer when locked */
RwUInt8 *palette; /* Raster palette */
RwInt32 width, height, depth; /* Dimensions of raster */
RwInt32 stride; /* Lines bytes of raster */
RwInt16 nOffsetX, nOffsetY; /* Sub raster offset */
RwUInt8 cType; /* Type of raster */
RwUInt8 cFlags; /* Raster flags */
RwUInt8 privateFlags; /* Raster private flags */
RwUInt8 cFormat; /* Raster format */
RwUInt8 *originalPixels;
RwInt32 originalWidth;
RwInt32 originalHeight;
RwInt32 originalStride;
};
#endif /* (!defined(DOXYGEN)) */
/****************************************************************************
<macro/inline functionality
*/
#define RwRasterGetWidthMacro(_raster) \
((_raster)->width)
#define RwRasterGetHeightMacro(_raster) \
((_raster)->height)
#define RwRasterGetStrideMacro(_raster) \
((_raster)->stride)
#define RwRasterGetDepthMacro(_raster) \
((_raster)->depth)
#define RwRasterGetFormatMacro(_raster) \
((((_raster)->cFormat) & (rwRASTERFORMATMASK >> 8)) << 8)
#define RwRasterGetTypeMacro(_raster) \
(((_raster)->cType) & rwRASTERTYPEMASK)
#define RwRasterGetParentMacro(_raster) \
((_raster)->parent)
#if !(defined(RWDEBUG) || defined(RWSUPPRESSINLINE))
#define RwRasterGetWidth(_raster) \
RwRasterGetWidthMacro(_raster)
#define RwRasterGetHeight(_raster) \
RwRasterGetHeightMacro(_raster)
#define RwRasterGetStride(_raster) \
RwRasterGetStrideMacro(_raster)
#define RwRasterGetDepth(_raster) \
RwRasterGetDepthMacro(_raster)
#define RwRasterGetFormat(_raster) \
RwRasterGetFormatMacro(_raster)
#define RwRasterGetType(_raster) \
RwRasterGetTypeMacro(_raster)
#define RwRasterGetParent(_raster) \
RwRasterGetParentMacro(_raster)
#endif /* (defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) */
/****************************************************************************
Function prototypes
*/
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
/* Creating destroying rasters */
extern RwRaster *RwRasterCreate(RwInt32 width, RwInt32 height,
RwInt32 depth, RwInt32 flags);
extern RwBool RwRasterDestroy(RwRaster * raster);
/* Pulling info out of raster structure */
#if (defined(RWDEBUG) || defined(RWSUPPRESSINLINE))
extern RwInt32 RwRasterGetWidth(const RwRaster *raster);
extern RwInt32 RwRasterGetHeight(const RwRaster *raster);
extern RwInt32 RwRasterGetStride(const RwRaster *raster);
extern RwInt32 RwRasterGetDepth(const RwRaster *raster);
extern RwInt32 RwRasterGetFormat(const RwRaster *raster);
extern RwInt32 RwRasterGetType(const RwRaster *raster);
extern RwRaster *RwRasterGetParent(const RwRaster *raster);
#endif /* (defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) */
extern RwRaster *RwRasterGetOffset(RwRaster *raster,
RwInt16 *xOffset, RwInt16 *yOffset);
extern RwInt32 RwRasterGetNumLevels(RwRaster * raster);
extern RwRaster *RwRasterSubRaster(RwRaster * subRaster,
RwRaster * raster, RwRect * rect);
extern RwRaster *RwRasterRenderFast(RwRaster * raster, RwInt32 x,
RwInt32 y);
extern RwRaster *RwRasterRender(RwRaster * raster, RwInt32 x,
RwInt32 y);
extern RwRaster *RwRasterRenderScaled(RwRaster * raster,
RwRect * rect);
/* Raster rendering context */
extern RwRaster *RwRasterPushContext(RwRaster * raster);
extern RwRaster *RwRasterPopContext(void);
extern RwRaster *RwRasterGetCurrentContext(void);
/* Clearing rasters */
extern RwBool RwRasterClear(RwInt32 pixelValue);
extern RwBool RwRasterClearRect(RwRect * rpRect,
RwInt32 pixelValue);
/* Displaying rasters */
extern RwRaster *RwRasterShowRaster(RwRaster * raster, void *dev,
RwUInt32 flags);
/* Locking and releasing */
extern RwUInt8 *RwRasterLock(RwRaster * raster, RwUInt8 level,
RwInt32 lockMode);
extern RwRaster *RwRasterUnlock(RwRaster * raster);
extern RwUInt8 *RwRasterLockPalette(RwRaster * raster,
RwInt32 lockMode);
extern RwRaster *RwRasterUnlockPalette(RwRaster * raster);
/* Attaching toolkits */
extern RwInt32 RwRasterRegisterPlugin(RwInt32 size,
RwUInt32 pluginID,
RwPluginObjectConstructor
constructCB,
RwPluginObjectDestructor
destructCB,
RwPluginObjectCopy copyCB);
extern RwInt32 RwRasterGetPluginOffset(RwUInt32 pluginID);
extern RwBool RwRasterValidatePlugins(const RwRaster * raster);
#ifdef __cplusplus
}
#endif /* __cplusplus */
/*--- Automatically derived from: C:/daily/rwsdk/driver/d3d8/drvmodel.h ---*/
#ifndef D3D8_DRVMODEL_H
#define D3D8_DRVMODEL_H
#if (defined(__ICL))
/* Avoid voluminous
* 'warning #344: typedef name has already been declared (with same type)'
* warnings from MS include files
*/
#pragma warning( disable : 344 )
#endif /* (defined(__ICL)) */
#include <windows.h>
#if (defined(RWDEBUG))
#if (defined(RWMEMDEBUG) && !defined(_CRTDBG_MAP_ALLOC))
#define _CRTDBG_MAP_ALLOC
#endif /* defined(RWMEMDEBUG) && !defined(_CRTDBG_MAP_ALLOC)) */
#include <crtdbg.h>
#define ERR_WRAP(A) (_rwRePrintErrorDDD3D((A), __FILE__, __LINE__))
#endif /* (defined(RWDEBUG)) */
#if (!defined(ERR_WRAP))
#define ERR_WRAP(A) (A)
#endif /* (!defined(ERR_WRAP)) */
/****************************************************************************
Defines
*/
/* Set true depth information (for fogging, eg) */
#define RwIm2DVertexSetCameraX(vert, camx) /* Nothing */
#define RwIm2DVertexSetCameraY(vert, camy) /* Nothing */
#define RwIm2DVertexSetCameraZ(vert, camz) /* Nothing */
#define RwIm2DVertexSetRecipCameraZ(vert, recipz) ((vert)->rhw = recipz)
#define RwIm2DVertexGetCameraX(vert) (cause an error)
#define RwIm2DVertexGetCameraY(vert) (cause an error)
#define RwIm2DVertexGetCameraZ(vert) (cause an error)
#define RwIm2DVertexGetRecipCameraZ(vert) ((vert)->rhw)
/* Set screen space coordinates in a device vertex */
#define RwIm2DVertexSetScreenX(vert, scrnx) ((vert)->x = (scrnx))
#define RwIm2DVertexSetScreenY(vert, scrny) ((vert)->y = (scrny))
#define RwIm2DVertexSetScreenZ(vert, scrnz) ((vert)->z = (scrnz))
#define RwIm2DVertexGetScreenX(vert) ((vert)->x)
#define RwIm2DVertexGetScreenY(vert) ((vert)->y)
#define RwIm2DVertexGetScreenZ(vert) ((vert)->z)
/* Set texture coordinates in a device vertex */
#define RwIm2DVertexSetU(vert, texU, recipz) ((vert)->u = (texU))
#define RwIm2DVertexSetV(vert, texV, recipz) ((vert)->v = (texV))
#define RwIm2DVertexGetU(vert) ((vert)->u)
#define RwIm2DVertexGetV(vert) ((vert)->v)
/* Modify the luminance stuff */
#define RwIm2DVertexSetRealRGBA(vert, red, green, blue, alpha) \
((vert)->emissiveColor = \
(((RwFastRealToUInt32(alpha)) << 24) | \
((RwFastRealToUInt32(red)) << 16) | \
((RwFastRealToUInt32(green)) << 8) | \
((RwFastRealToUInt32(blue)))))
#define RwIm2DVertexSetIntRGBA(vert, red, green, blue, alpha) \
((vert)->emissiveColor = \
((((RwUInt32)(alpha)) << 24) | \
(((RwUInt32)(red)) << 16) | \
(((RwUInt32)(green)) << 8) | \
(((RwUInt32)(blue)))))
#define RwIm2DVertexGetRed(vert) \
(((vert)->emissiveColor >> 16) & 0xFF)
#define RwIm2DVertexGetGreen(vert) \
(((vert)->emissiveColor >> 8) & 0xFF)
#define RwIm2DVertexGetBlue(vert) \
((vert)->emissiveColor & 0xFF)
#define RwIm2DVertexGetAlpha(vert) \
(((vert)->emissiveColor >> 24) & 0xFF)
#define RwIm2DVertexCopyRGBA(dst, src) \
((dst)->emissiveColor = (src)->emissiveColor)
/* Clipper stuff */
#define RwIm2DVertexClipRGBA(o, i, n, f) \
MACRO_START \
{ \
const RwInt32 _factor = \
(RwFastRealToUInt32(i * (RwReal)(255))) & 255; \
\
(o)->emissiveColor = \
(((((RwIm2DVertexGetAlpha(f) - RwIm2DVertexGetAlpha(n)) * \
_factor) >> 8) + RwIm2DVertexGetAlpha(n)) << 24) | \
(((((RwIm2DVertexGetRed(f) - RwIm2DVertexGetRed(n)) * \
_factor) >> 8) + RwIm2DVertexGetRed(n)) << 16) | \
(((((RwIm2DVertexGetGreen(f) - RwIm2DVertexGetGreen(n)) * \
_factor) >> 8) + RwIm2DVertexGetGreen(n)) << 8) | \
(((((RwIm2DVertexGetBlue(f) - RwIm2DVertexGetBlue(n)) * \
_factor) >> 8) + RwIm2DVertexGetBlue(n))); \
} \
MACRO_STOP
/* LEGACY-SUPPORT macros */
#define RWIM2DVERTEXSetCameraX(vert, camx) RwIm2DVertexSetCameraX(vert, camx)
#define RWIM2DVERTEXSetCameraY(vert, camy) RwIm2DVertexSetCameraY(vert, camy)
#define RWIM2DVERTEXSetCameraZ(vert, camz) RwIm2DVertexSetCameraZ(vert, camz)
#define RWIM2DVERTEXSetRecipCameraZ(vert, recipz) \
RwIm2DVertexSetRecipCameraZ(vert, recipz)
#define RWIM2DVERTEXGetCameraX(vert) RwIm2DVertexGetCameraX(vert)
#define RWIM2DVERTEXGetCameraY(vert) RwIm2DVertexGetCameraY(vert)
#define RWIM2DVERTEXGetCameraZ(vert) RwIm2DVertexGetCameraZ(vert)
#define RWIM2DVERTEXGetRecipCameraZ(vert) RwIm2DVertexGetRecipCameraZ(vert)
#define RWIM2DVERTEXSetScreenX(vert, scrnx) RwIm2DVertexSetScreenX(vert, scrnx)
#define RWIM2DVERTEXSetScreenY(vert, scrny) RwIm2DVertexSetScreenY(vert, scrny)
#define RWIM2DVERTEXSetScreenZ(vert, scrnz) RwIm2DVertexSetScreenZ(vert, scrnz)
#define RWIM2DVERTEXGetScreenX(vert) RwIm2DVertexGetScreenX(vert)
#define RWIM2DVERTEXGetScreenY(vert) RwIm2DVertexGetScreenY(vert)
#define RWIM2DVERTEXGetScreenZ(vert) RwIm2DVertexGetScreenZ(vert)
#define RWIM2DVERTEXSetU(vert, u, recipz) RwIm2DVertexSetU(vert, u, recipz)
#define RWIM2DVERTEXSetV(vert, v, recipz) RwIm2DVertexSetV(vert, v, recipz)
#define RWIM2DVERTEXGetU(vert) RwIm2DVertexGetU(vert)
#define RWIM2DVERTEXGetV(vert) RwIm2DVertexGetV(vert)
#define RWIM2DVERTEXSetRealRGBA(vert, red, green, blue, alpha) \
RwIm2DVertexSetRealRGBA(vert, red, green, blue, alpha)
#define RWIM2DVERTEXSetIntRGBA(vert, red, green, blue, alpha) \
RwIm2DVertexSetIntRGBA(vert, red, green, blue, alpha)
#define RWIM2DVERTEXGetRed(vert) RwIm2DVertexGetRed(vert)
#define RWIM2DVERTEXGetGreen(vert) RwIm2DVertexGetGreen(vert)
#define RWIM2DVERTEXGetBlue(vert) RwIm2DVertexGetBlue(vert)
#define RWIM2DVERTEXGetAlpha(vert) RwIm2DVertexGetAlpha(vert)
#define RWIM2DVERTEXCopyRGBA(dst, src) RwIm2DVertexCopyRGBA(dst, src)
#define RWIM2DVERTEXClipRGBA(o, i, n, f) RwIm2DVertexClipRGBA(o, i, n, f)
/****************************************************************************
Global Types
*/
/* We use RwD3D8Vertex to drive the hardware in 2D mode */
/**
* \ingroup rwcoredriverd3d8
* \typedef RwD3D8Vertex
* D3D8 vertex structure definition for 2D geometry
*/
typedef struct RwD3D8Vertex RwD3D8Vertex;
/**
* \ingroup rwcoredriverd3d8
* \struct RwD3D8Vertex
* D3D8 vertex structure definition for 2D geometry
*/
struct RwD3D8Vertex
{
RwReal x; /**< Screen X */
RwReal y; /**< Screen Y */
RwReal z; /**< Screen Z */
RwReal rhw; /**< Reciprocal of homogeneous W */
RwUInt32 emissiveColor; /**< Vertex color */
RwReal u; /**< Texture coordinate U */
RwReal v; /**< Texture coordinate V */
};
/* Define types used */
/**
* \ingroup rwcoredriverd3d8
* \typedef RwIm2DVertex
* Typedef for a RenderWare Graphics Immediate Mode 2D Vertex
*/
typedef RwD3D8Vertex RwIm2DVertex;
/* LEGACY-SUPPORT macro */
/**
* \ingroup rwcoredriverd3d8
* \def RWIM2DVERTEX
* RWIM2DVERTEX is a legacy macro for RwIm2DVertex
*/
#define RWIM2DVERTEX RwIm2DVertex
/**
* \ingroup rwcoredriverd3d8
* \typedef RxVertexIndex
*
* Typedef for a RenderWare Graphics PowerPipe Immediate
* Mode Vertex
*/
typedef RwUInt16 RxVertexIndex;
/**
* \ingroup rwcoredriverd3d8
* \typedef RwImVertexIndex
* Typedef for a RenderWare Graphics Immediate Mode Vertex.
*/
typedef RxVertexIndex RwImVertexIndex;
/* LEGACY-SUPPORT macro */
/**
* \ingroup rwcoredriverd3d8
* \def RWIMVERTEXINDEX
* RWIMVERTEXINDEX is a legacy macro for RwImVertexIndex
*/
#define RWIMVERTEXINDEX RwImVertexIndex
/**
* \ingroup rwcoredriverd3d8
* \struct RwD3D8Metrics
* Structure containing metrics counters
*/
typedef struct
{
RwUInt32 numRenderStateChanges; /**< Number of Render States changed */
RwUInt32 numTextureStageStateChanges; /**< Number of Texture Stage States changed */
RwUInt32 numMaterialChanges; /**< Number of Material changes */
RwUInt32 numLightsChanged; /**< Number of Lights changed */
}
RwD3D8Metrics;
#endif /* D3D8_DRVMODEL_H */
/*--- Automatically derived from: C:/daily/rwsdk/src/pipe/p2/d3d8/pip2model.h ---*/
/****************************************************************************
Global Defines
*/
#define RXHEAPPLATFORMDEFAULTSIZE (1 << 12) /* 4k */
/****************************************************************************
Global Types
*/
/* We use D3D8 formats for the instanced versions, to allow hardware T&L */
/**
* \ingroup corep2d3d8
* \typedef RxObjSpace3DVertex
* Typedef for an RxObjSpace3DVertex.
*/
typedef struct RxObjSpace3DVertex RxObjSpace3DVertex;
/**
* \ingroup corep2d3d8
* \struct RxObjSpace3DVertex
* Structure representing object space vertex.
*/
struct RxObjSpace3DVertex
{
RwV3d objVertex; /**< position */
RwV3d objNormal; /**< normal */
RwUInt32 color; /**< emissive color*/
RwReal u; /**< u */
RwReal v; /**< v */
};
/* This vertex is non truncatable */
#define RxObjSpace3DVertexNoUVsNoNormalsSize (sizeof(RxObjSpace3DVertex))
#define RxObjSpace3DVertexNoUVsSize (sizeof(RxObjSpace3DVertex))
#define RxObjSpace3DVertexFullSize (sizeof(RxObjSpace3DVertex))
/**
* \ingroup corep2d3d8
* \typedef RxObjSpace3DLitVertex
* Typedef for an RxObjSpace3DLitVertex.
*/
typedef RxObjSpace3DVertex RxObjSpace3DLitVertex;
/**
* \ingroup corep2d3d8
* \typedef RwIm3DVertex
* Typedef for an RwIm3DVertex.
*/
typedef RxObjSpace3DLitVertex RwIm3DVertex;
/* LEGACY-SUPPORT macro */
#define RWIM3DVERTEX RwIm3DVertex
typedef RwIm2DVertex RxScrSpace2DVertex;
/****************************************************************************
Object-space 3D unlit vertex macros
*/
/* Vertex positions */
#define RxObjSpace3DVertexGetPos(_vert, _pos) \
(*(_pos) = (_vert)->objVertex)
#define RxObjSpace3DVertexSetPos(_vert, _pos) \
((_vert)->objVertex = *(_pos))
/* Pre-lighting colours */
#define RxObjSpace3DVertexGetPreLitColor(_vert, _col) \
MACRO_START \
{ \
(_col)->alpha = (RwUInt8)((_vert)->color >> 24) & 0xFF; \
(_col)->red = (RwUInt8)((_vert)->color >> 16) & 0xFF; \
(_col)->green = (RwUInt8)((_vert)->color >> 8) & 0xFF; \
(_col)->blue = (RwUInt8)((_vert)->color ) & 0xFF; \
} \
MACRO_STOP
#define RxObjSpace3DVertexSetPreLitColor(_vert, _col) \
((_vert)->color = (((RwUInt32)(_col)->alpha) << 24) | \
(((RwUInt32)(_col)->red) << 16) | \
(((RwUInt32)(_col)->green) << 8) | \
(((RwUInt32)(_col)->blue) ))
/* This uses the same slot as color (they are mutually exclusive) */
#define RxObjSpace3DVertexGetColor RxObjSpace3DVertexGetPreLitColor
/* Normals */
#define RxObjSpace3DVertexGetNormal(_vert, _normal) \
(*(_normal) = (_vert)->objNormal)
#define RxObjSpace3DVertexSetNormal(_vert, _normal) \
((_vert)->objNormal = *(_normal))
/* Us and Vs */
#define RxObjSpace3DVertexGetU(_vert) \
((_vert)->u)
#define RxObjSpace3DVertexGetV(_vert) \
((_vert)->v)
#define RxObjSpace3DVertexSetU(_vert, _imu) \
((_vert)->u = (_imu))
#define RxObjSpace3DVertexSetV(_vert, _imv) \
((_vert)->v = (_imv))
/****************************************************************************
Object-space 3D lit vertex macros
*/
/* Vertex positions */
#define RxObjSpace3DLitVertexGetPos(_vert, _pos) \
(*(_pos) = (_vert)->objVertex)
#define RxObjSpace3DLitVertexSetPos(_vert, _pos) \
((_vert)->objVertex = *(_pos))
/* Vertex colours */
#define RxObjSpace3DLitVertexGetColor(_vert, _col) \
MACRO_START \
{ \
(_col)->red = ((_vert)->color >> 16) & 0xFF; \
(_col)->green = ((_vert)->color >> 8) & 0xFF; \
(_col)->blue = ((_vert)->color ) & 0xFF; \
(_col)->alpha = ((_vert)->color >> 24) & 0xFF; \
} \
MACRO_STOP
#define RxObjSpace3DLitVertexSetColor(_vert, _col) \
((_vert)->color = (((RwUInt32)(_col)->alpha) << 24) | \
(((RwUInt32)(_col)->red) << 16) | \
(((RwUInt32)(_col)->green) << 8) | \
(((RwUInt32)(_col)->blue) ))
/* Us and Vs */
#define RxObjSpace3DLitVertexGetU(_vert) \
((_vert)->u)
#define RxObjSpace3DLitVertexGetV(_vert) \
((_vert)->v)
#define RxObjSpace3DLitVertexSetU(_vert, _imu) \
((_vert)->u = (_imu))
#define RxObjSpace3DLitVertexSetV(_vert, _imv) \
((_vert)->v = (_imv))
/* LEGACY-SUPPORT for old objvert names - NB does NOT guarantee the
* app will work, because the old IM3DVERTEX macros are NOT correctly
* abstracted - 'Get' will return pointers to RwV3ds inside the
* ObjVert, but you can't assume there are any RwV3ds inside an
* opaque vertex type */
#define RwIm3DVertexSetU RxObjSpace3DLitVertexSetU
#define RwIm3DVertexSetV RxObjSpace3DLitVertexSetV
#define RwIm3DVertexGetNext(_vert) ((_vert) + 1)
#define RwIm2DCameraVertexSetU(_devvert, _camvert, _u, _recipz) \
MACRO_START \
{ \
RwReal _uTmp = _u; \
_camvert->u = _uTmp; \
RwIm2DVertexSetU(_devvert, _uTmp, _recipz); \
} \
MACRO_STOP
#define RwIm2DCameraVertexSetV(_devvert, _camvert, _v, _recipz) \
MACRO_START \
{ \
RwReal _vTmp = _v; \
_camvert->v = _vTmp; \
RwIm2DVertexSetV(_devvert, _vTmp, _recipz); \
} \
MACRO_STOP
#define RwIm3DVertexSetPos(_vert, _imx, _imy, _imz) \
MACRO_START \
{ \
(_vert)->objVertex.x = _imx; \
(_vert)->objVertex.y = _imy; \
(_vert)->objVertex.z = _imz; \
} \
MACRO_STOP
#define RwIm3DVertexSetNormal(vert, imx, imy, imz) \
MACRO_START \
{ \
RwV3d packed; \
packed.x = imx; \
packed.y = imy; \
packed.z = imz; \
RxObjSpace3DVertexSetNormal(vert, &packed); \
} \
MACRO_STOP
#define RwIm3DVertexSetRGBA(_vert, _r, _g, _b, _a) \
MACRO_START \
{ \
((_vert)->color = ((_a) << 24) | \
((_r) << 16) | \
((_g) << 8) | \
((_b))); \
} \
MACRO_STOP
#define RwIm3DVertexGetPos(_vert) (&((_vert)->objVertex))
#define RwIm3DVertexGetNormal(vert) (&((vert)->objNormal))
#define RwIm3DVertexCopyRGBA(_dst, _src) (((_dst)->color) = ((_src)->color))
/* LEGACY-SUPPORT macros */
#define RWIM2DCAMERAVERTEXSetU(_devvert, _camvert, _u, _recipz) \
RwIm2DCameraVertexSetU(_devvert, _camvert, _u, _recipz)
#define RWIM2DCAMERAVERTEXSetV(_devvert, _camvert, _v, _recipz) \
RwIm2DCameraVertexSetV(_devvert, _camvert, _v, _recipz)
#define RWIM3DVERTEXGetNext(vert) RwIm3DVertexGetNext(vert)
#define RWIM3DVERTEXSetPos(vert, imx, imy, imz) RwIm3DVertexSetPos(vert, imx, imy, imz)
#define RWIM3DVERTEXGetPos(vert) RwIm3DVertexGetPos(vert)
#define RWIM3DVERTEXSetU(vert, imu) RwIm3DVertexSetU(vert, imu)
#define RWIM3DVERTEXSetV(vert, imv) RwIm3DVertexSetV(vert, imv)
#define RWIM3DVERTEXSetRGBA(vert, r, g, b, a) RwIm3DVertexSetRGBA(vert, r, g, b, a)
#define RWIM3DVERTEXSetNormal(vert, imx, imy, imz) RwIm3DVertexSetNormal(vert, imx, imy, imz)
#define RWIM3DVERTEXCopyRGBA(dst,src) RwIm3DVertexCopyRGBA(dst,src)
#define RXOBJSPACE3DVERTEXGetPos(_vert, _pos) \
RxObjSpace3DVertexGetPos(_vert, _pos)
#define RXOBJSPACE3DVERTEXSetPos(_vert, _pos) \
RxObjSpace3DVertexSetPos(_vert, _pos)
#define RXOBJSPACE3DVERTEXGetPreLitColor(_vert, _col) \
RxObjSpace3DVertexGetPreLitColor(_vert, _col)
#define RXOBJSPACE3DVERTEXSetPreLitColor(_vert, _col) \
RxObjSpace3DVertexSetPreLitColor(_vert, _col)
#define RXOBJSPACE3DVERTEXGetColor RxObjSpace3DVertexGetColor
#define RXOBJSPACE3DVERTEXGetNormal(_vert, _normal) \
RxObjSpace3DVertexGetNormal(_vert, _normal)
#define RXOBJSPACE3DVERTEXSetNormal(_vert, _normal) \
RxObjSpace3DVertexSetNormal(_vert, _normal)
#define RXOBJSPACE3DVERTEXGetU(_vert) RxObjSpace3DVertexGetU(_vert)
#define RXOBJSPACE3DVERTEXGetV(_vert) RxObjSpace3DVertexGetV(_vert)
#define RXOBJSPACE3DVERTEXSetU(_vert, _imu) \
RxObjSpace3DVertexSetU(_vert, _imu)
#define RXOBJSPACE3DVERTEXSetV(_vert, _imv) \
RxObjSpace3DVertexSetV(_vert, _imv)
#define RXOBJSPACE3DLITVERTEXGetPos(vert, pos) \
RxObjSpace3DLitVertexGetPos(vert, pos)
#define RXOBJSPACE3DLITVERTEXSetPos(vert, pos) \
RxObjSpace3DLitVertexSetPos(vert, pos)
#define RXOBJSPACE3DLITVERTEXGetColor(vert, col) \
RxObjSpace3DLitVertexGetColor(vert, col)
#define RXOBJSPACE3DLITVERTEXSetColor(vert, col) \
RxObjSpace3DLitVertexSetColor(vert, col)
#define RXOBJSPACE3DLITVERTEXGetU(vert) \
RxObjSpace3DLitVertexGetU(vert)
#define RXOBJSPACE3DLITVERTEXGetV(vert) \
RxObjSpace3DLitVertexGetV(vert)
#define RXOBJSPACE3DLITVERTEXSetU(vert, imu) \
RxObjSpace3DLitVertexSetU(vert, imu)
#define RXOBJSPACE3DLITVERTEXSetV(vert, imv) \
RxObjSpace3DLitVertexSetV(vert, imv)
/*--- Automatically derived from: C:/daily/rwsdk/src/pipe/p2/p2renderstate.h ---*/
/**
* \ingroup rwcoregeneric
* RxRenderStateFlag
* Flags used in the \ref RxRenderStateVector structure */
enum RxRenderStateFlag
{
rxRENDERSTATEFLAG_TEXTUREPERSPECTIVE = 0x00000001, /**<Perspective texturing is to be enabled */
rxRENDERSTATEFLAG_ZTESTENABLE = 0x00000002, /**<Z-Buffer testing is to be performed */
rxRENDERSTATEFLAG_ZWRITEENABLE = 0x00000004, /**<Z-Buffer writing is to be enabled */
rxRENDERSTATEFLAG_VERTEXALPHAENABLE = 0x00000008, /**<Vertex alpha is to be enabled */
rxRENDERSTATEFLAG_FOGENABLE = 0x00000010, /**<Fog is to be enabled */
rxRENDERSTATEFLAG_ALPHAPRIMITIVEBUFFER = 0x00000020, /**<Alpha primitive buffering is to be enabled */
rxRENDERSTATEFLAGFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
};
typedef enum RxRenderStateFlag RxRenderStateFlag;
typedef struct RxRenderStateVector RxRenderStateVector;
/**
* \ingroup rwcoregeneric
* \struct RxRenderStateVector
* Structure describing a render-state vector,
* used by the RxClRenderState cluster */
struct RxRenderStateVector
{
RwUInt32 Flags; /**< A load of the boolean renderstate options */
RwShadeMode ShadeMode; /**< Flat or Gouraud currently */
RwBlendFunction SrcBlend; /**< Src alpha, 1-src alpha, etc */
RwBlendFunction DestBlend; /**< Dest alpha, 1-dest alpha, etc */
RwRaster *TextureRaster; /**< texture raster */
RwTextureAddressMode AddressModeU; /**< U addressing mode - WRAP, MIRROR, CLAMP, BORDER */
RwTextureAddressMode AddressModeV; /**< V addressing mode - WRAP, MIRROR, CLAMP, BORDER */
RwTextureFilterMode FilterMode; /**< filtering mode - combos of NEAREST LINEAR MIP */
RwRGBA BorderColor; /**< Border color for texturing address mode border */
RwFogType FogType; /**< Select the type of fogging to use */
RwRGBA FogColor; /**< Color used for fogging */
RwUInt8 *FogTable; /**< A 256 entry fog table */
};
#if (!defined(RxRenderStateVectorAssign))
#define RxRenderStateVectorAssign(_target, _source) \
( *(_target) = *(_source) )
#endif /* (!defined(RxRenderStateVectorAssign)) */
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
extern RxRenderStateVector *RxRenderStateVectorSetDefaultRenderStateVector(RxRenderStateVector *rsvp);
extern const RxRenderStateVector *RxRenderStateVectorGetDefaultRenderStateVector(void);
extern RxRenderStateVector *RxRenderStateVectorCreate(RwBool current);
extern void RxRenderStateVectorDestroy(RxRenderStateVector *rsvp);
extern RxRenderStateVector *RxRenderStateVectorLoadDriverState(RxRenderStateVector *rsvp);
#ifdef __cplusplus
}
#endif /* __cplusplus */
/*--- Automatically derived from: C:/daily/rwsdk/src/pipe/p2/p2clpcom.h ---*/
/*--- Automatically derived from: C:/daily/rwsdk/src/pipe/p2/nodeRGBAInterp.h ---*/
struct NodeRGBAInterpData
{
RwBool rgbaInterpOn;
RxRenderStateVector state;
};
typedef struct NodeRGBAInterpData NodeRGBAInterpData;
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
extern RxNodeDefinition *RxNodeDefinitionGetRGBAInterp(void);
#ifdef __cplusplus
}
#endif /* __cplusplus */
/*--- Automatically derived from: C:/daily/rwsdk/src/pipe/p2/nodeUVInterp.h ---*/
typedef struct RxNodeUVInterpSettings RxNodeUVInterpSettings;
struct RxNodeUVInterpSettings
{
RwBool uvInterpOn;
RxRenderStateVector state;
};
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
extern RxNodeDefinition * RxNodeDefinitionGetUVInterp(void);
#ifdef __cplusplus
}
#endif /* __cplusplus */
/*--- Automatically derived from: C:/daily/rwsdk/src/baimage.h ---*/
/****************************************************************************
Defines
*/
/* If this bit is set then the image has been allocated by the user */
enum RwImageFlag
{
rwNAIMAGEFLAG = 0x00,
rwIMAGEALLOCATED = 0x1,
rwIMAGEGAMMACORRECTED = 0x2,
rwIMAGEFLAGFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
};
typedef enum RwImageFlag RwImageFlag;
/****************************************************************************
Global Types
*/
/**
* \ingroup datatypes
* \typedef RwImage
* Image containing device-independent pixels.
* This should be considered an opaque type.
* Use the RwImage API functions to access.
*/
typedef struct RwImage RwImage;
#if (!defined(DOXYGEN))
struct RwImage
{
RwInt32 flags;
RwInt32 width; /* Device may have different ideas */
RwInt32 height; /* internally !! */
RwInt32 depth; /* Of referenced image */
RwInt32 stride;
RwUInt8 *cpPixels;
RwRGBA *palette;
};
#endif /* (!defined(DOXYGEN)) */
/**
* \ingroup datatypes
* \ref RwImageCallBackRead
* is the function registered with \ref RwImageRegisterImageFormat that is used,
* for example by \ref RwImageRead and \ref RwImageReadMaskedImage,
* to read images of a specific format from a disk file.
*
* \param imageName Pointer to a string containing the file name of the image.
*
* \see RwImageRegisterImageFormat
*
*/
typedef RwImage *(*RwImageCallBackRead)(const RwChar * imageName);
/**
* \ingroup datatypes
* \ref RwImageCallBackWrite
* is the function registered with \ref RwImageRegisterImageFormat that is used,
* for example by \ref RwImageWrite,
* to write images of a specific format to a disk file.
*
* \param image Pointer to the image.
*
* \param imageName Pointer to a string containing the file name
* of the image.
*
*
* \return Pointer to the written image.
*
* \see RwImageRegisterImageFormat
*
*/
typedef RwImage *(*RwImageCallBackWrite)(RwImage *image, const RwChar *imageName);
/****************************************************************************
<macro/inline functionality
*/
#define RwImageSetStrideMacro(_image, _stride) \
(((_image)->stride = (_stride)), (_image))
#define RwImageSetPixelsMacro(_image, _pixels) \
(((_image)->cpPixels = (_pixels)), (_image))
#define RwImageSetPaletteMacro(_image, _palette) \
(((_image)->palette = (_palette)), (_image))
#define RwImageGetWidthMacro(_image) \
((_image)->width)
#define RwImageGetHeightMacro(_image) \
((_image)->height)
#define RwImageGetDepthMacro(_image) \
((_image)->depth)
#define RwImageGetStrideMacro(_image) \
((_image)->stride)
#define RwImageGetPixelsMacro(_image) \
((_image)->cpPixels)
#define RwImageGetPaletteMacro(_image) \
((_image)->palette)
#if !(defined(RWDEBUG) || defined(RWSUPPRESSINLINE))
#define RwImageSetStride(_image, _stride) \
RwImageSetStrideMacro(_image, _stride)
#define RwImageSetPixels(_image, _pixels) \
RwImageSetPixelsMacro(_image, _pixels)
#define RwImageSetPalette(_image, _palette) \
RwImageSetPaletteMacro(_image, _palette)
#define RwImageGetWidth(_image) \
RwImageGetWidthMacro(_image)
#define RwImageGetHeight(_image) \
RwImageGetHeightMacro(_image)
#define RwImageGetDepth(_image) \
RwImageGetDepthMacro(_image)
#define RwImageGetStride(_image) \
RwImageGetStrideMacro(_image)
#define RwImageGetPixels(_image) \
RwImageGetPixelsMacro(_image)
#define RwImageGetPalette(_image) \
RwImageGetPaletteMacro(_image)
#endif /* !(defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) */
/****************************************************************************
Function prototypes
*/
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
/* Creating and destroying */
extern RwImage *RwImageCreate(RwInt32 width, RwInt32 height,
RwInt32 depth);
extern RwBool RwImageDestroy(RwImage * image);
/* Allocating */
extern RwImage *RwImageAllocatePixels(RwImage * image);
extern RwImage *RwImageFreePixels(RwImage * image);
/* Converting images */
extern RwImage *RwImageCopy(RwImage * destImage,
const RwImage * sourceImage);
/* Resizing images */
extern RwImage *RwImageResize(RwImage * image, RwInt32 width,
RwInt32 height);
/* Producing masks ! */
extern RwImage *RwImageApplyMask(RwImage * image,
const RwImage * mask);
extern RwImage *RwImageMakeMask(RwImage * image);
/* Helper functions */
extern RwImage *RwImageReadMaskedImage(const RwChar * imageName,
const RwChar * maskname);
extern RwImage *RwImageRead(const RwChar * imageName);
extern RwImage *RwImageWrite(RwImage * image,
const RwChar * imageName);
/* Setting and getting the default path for images */
extern RwChar *RwImageGetPath(void);
extern const RwChar *RwImageSetPath(const RwChar * path);
/* Setting */
#if (defined(RWDEBUG) || defined(RWSUPPRESSINLINE))
extern RwImage *RwImageSetStride(RwImage * image, RwInt32 stride);
extern RwImage *RwImageSetPixels(RwImage * image, RwUInt8 * pixels);
extern RwImage *RwImageSetPalette(RwImage * image, RwRGBA * palette);
/* Getting */
extern RwInt32 RwImageGetWidth(const RwImage * image);
extern RwInt32 RwImageGetHeight(const RwImage * image);
extern RwInt32 RwImageGetDepth(const RwImage * image);
extern RwInt32 RwImageGetStride(const RwImage * image);
extern RwUInt8 *RwImageGetPixels(const RwImage * image);
extern RwRGBA *RwImageGetPalette(const RwImage * image);
#endif /* (defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) */
/* Get device dependent pixel value */
extern RwUInt32 RwRGBAToPixel(RwRGBA * rgbIn, RwInt32 rasterFormat);
extern RwRGBA *RwRGBASetFromPixel(RwRGBA * rgbOut,
RwUInt32 pixelValue,
RwInt32 rasterFormat);
/* Gamma correction */
extern RwBool RwImageSetGamma(RwReal gammaValue);
extern RwReal RwImageGetGamma(void);
extern RwImage *RwImageGammaCorrect(RwImage * image);
/* Adding and removing gamma correction */
extern RwRGBA *RwRGBAGammaCorrect(RwRGBA * rgb);
/* Attaching toolkits */
extern RwInt32 RwImageRegisterPlugin(RwInt32 size, RwUInt32 pluginID,
RwPluginObjectConstructor
constructCB,
RwPluginObjectDestructor
destructCB,
RwPluginObjectCopy copyCB);
extern RwInt32 RwImageGetPluginOffset(RwUInt32 pluginID);
extern RwBool RwImageValidatePlugins(const RwImage * image);
extern RwBool RwImageRegisterImageFormat(const RwChar * extension,
RwImageCallBackRead
imageRead,
RwImageCallBackWrite
imageWrite);
/* Finding an extension for an image to load */
extern const RwChar *RwImageFindFileType(const RwChar * imageName);
/* Reading and writing images to streams */
extern RwInt32 RwImageStreamGetSize(const RwImage * image);
extern RwImage *RwImageStreamRead(RwStream * stream);
extern const RwImage *RwImageStreamWrite(const RwImage * image,
RwStream * stream);
#ifdef __cplusplus
}
#endif /* __cplusplus */
/*--- Automatically derived from: C:/daily/rwsdk/src/batextur.h ---*/
/****************************************************************************
Defines
*/
/* Type ID */
#define rwTEXDICTIONARY 6
/* Mipmap Name generation - maximum number of RwChar characters which can
* be appended to the root name.
*/
#define rwTEXTUREMIPMAPNAMECHARS 16
/* We define texture names to be a maximum of 16 ISO chars */
#define rwTEXTUREBASENAMELENGTH 32
#define rwTEXTUREFILTERMODEMASK 0x000000FF
#define rwTEXTUREADDRESSINGUMASK 0x00000F00
#define rwTEXTUREADDRESSINGVMASK 0x0000F000
#define rwTEXTUREADDRESSINGMASK (rwTEXTUREADDRESSINGUMASK | \
rwTEXTUREADDRESSINGVMASK)
/****************************************************************************
Global Types
*/
/**
* \ingroup datatypes
* \typedef RwTexDictionary
* is a texture dictionary containing textures.
* This should be considered an opaque type.
* Use the RwTexDictionary API functions to access.
*/
typedef struct RwTexDictionary RwTexDictionary;
#if (!defined(DOXYGEN))
struct RwTexDictionary
{
RwObject object; /* Homogeneous type */
RwLinkList texturesInDict; /* List of textures in dictionary */
RwLLLink lInInstance; /* Link list of all dicts in system */
};
/* Information is entirely device dependent */
#endif /* (!defined(DOXYGEN)) */
/* Parent is the dictionary */
/**
* \ingroup datatypes
* \typedef RwTexture
* is a texture object.
* This should be considered an opaque type.
* Use the RwTexture API functions to access.
*/
typedef struct RwTexture RwTexture;
#if (!defined(DOXYGEN))
struct RwTexture
{
RwRaster *raster; /** pointer to RwRaster with data */
RwTexDictionary *dict; /* Dictionary this texture is in */
RwLLLink lInDictionary; /* List of textures in this dictionary */
RwChar name[rwTEXTUREBASENAMELENGTH]; /* Name of the texture */
RwChar mask[rwTEXTUREBASENAMELENGTH]; /* Name of the textures mask */
/* 31 [xxxxxxxx xxxxxxxx vvvvuuuu ffffffff] 0 */
RwUInt32 filterAddressing; /* Filtering & addressing mode flags */
RwInt32 refCount; /* Reference count, surprisingly enough */
};
#endif /* (!defined(DOXYGEN)) */
/**
* \ingroup datatypes
* \ref RwTextureCallBackRead
* represents the function used by \ref RwTextureRead to read the specified
* texture from a disk file. This function should return a pointer to the
* texture to indicate success.
*
* \param name Pointer to a string containing the name of
* the texture to read.
*
* \param maskName Pointer to a string containing the name
* of the mask to read and apply to the texture.
*
* \return Pointer to the texture
*
* \see RwTextureSetReadCallBack
* \see RwTextureGetReadCallBack
*/
typedef RwTexture *(*RwTextureCallBackRead)(const RwChar *name,
const RwChar *maskName);
/**
* \ingroup datatypes
* \ref RwTextureCallBack
* represents the function called from \ref RwTexDictionaryForAllTextures
* for all textures in a given texture dictionary. This function should
* return the current texture to indicate success. The callback may return
* NULL to terminate further callbacks on the texture dictionary.
*
* \param texture Pointer to the current texture.
*
* \param pData User-defined data pointer.
*
* \return Pointer to the current texture
*
* \see RwTexDictionaryForAllTextures
*/
typedef RwTexture *(*RwTextureCallBack)(RwTexture *texture, void *pData);
/**
* \ingroup datatypes
* \ref RwTexDictionaryCallBack
* represents the function called from \ref RwTexDictionaryForAllTexDictionaries
* for all texture dictionaries that currently exist. This function should
* return the current texture dictionary to indicate success. The callback may
* return NULL to terminate further callbacks on the texture dictionary. It may
* safely destroy the current texture dictionary without adversely affecting
* the iteration process.
*
* \param dict Pointer to the current texture dictionary.
*
* \param pData User-defined data pointer.
*
* \return Pointer to the current texture dictionary
*
* \see RwTexDictionaryForAllTexdictionaries
*/
typedef RwTexDictionary *(*RwTexDictionaryCallBack)(RwTexDictionary *dict, void *data);
/**
* \ingroup datatypes
* \ref RwTextureCallBackMipmapGeneration
* is the callback function supplied to \ref RwTextureSetMipmapGenerationCallBack
* and returned from \ref RwTextureGetMipmapGenerationCallBack.
*
* The supplied function will be passed a pointer to a raster and an image.
* The raster is the target for the generated mipmap levels and the image
* provides the base for their generation.
*
* \param raster Pointer to raster, the target for generated mipmap levels
* \param image Pointer to image, used to generate mipmap levels.
*
* \return
* Returns a pointer to the raster if successful or NULL if an error occurred.
*
* \see RwTextureSetMipmapGenerationCallBack
* \see RwTextureGetMipmapGenerationCallBack
* \see RwTextureSetAutoMipmapping
* \see RwTextureGetAutoMipmapping
*/
typedef RwRaster *(*RwTextureCallBackMipmapGeneration)(RwRaster * raster,
RwImage * image);
/**
* \ingroup datatypes
* \ref RwTextureCallBackMipmapName
* is the callback function supplied to \ref RwTextureSetMipmapNameCallBack and
* returned from \ref RwTextureGetMipmapNameCallBack.
*
* The supplied function will be passed a pointer to a root name, a maskName, a mipmap
* level and a format. The function returns TRUE if successful and the root name will have been
* modified to equal the mipmap name.
*
* \param name Pointer to a string containing the root name of the texture. The
* mipmap level name is put here.
* \param maskName Pointer to a string containing the root mask name of the texture or
* NULL if no mask name is required.
* \param mipLevel A value equal to the mipmap level for which the name is required.
* \param format A value describing the mipmapping mode. A combination of the bit
* flags rwRASTERFORMATMIPMAP and rwRASTERFORMATAUTOMIPMAP.
*
* \return
* Returns TRUE if the name is generated successfully or FALSE if an error occurred.
*
* \see RwTextureGenerateMipmapName
* \see RwTextureSetMipmapNameCallBack
* \see RwTextureGetMipmapNameCallBack
* \see RwTextureSetAutoMipmapping
* \see RwTextureGetAutoMipmapping
*/
typedef RwBool (*RwTextureCallBackMipmapName)(RwChar *name,
RwChar *maskName,
RwUInt8 mipLevel,
RwInt32 format);
/****************************************************************************
<macro/inline functionality
*/
#define RwTextureGetRasterMacro(_tex) \
((_tex)->raster)
#define RwTextureAddRefMacro(_tex) \
(((_tex)->refCount++), (_tex))
#define RwTextureAddRefVoidMacro(_tex) \
MACRO_START \
{ \
(_tex)->refCount++; \
} \
MACRO_STOP
#define RwTextureGetNameMacro(_tex) \
((_tex)->name)
#define RwTextureGetMaskNameMacro(_tex) \
((_tex)->mask)
#define RwTextureGetDictionaryMacro(_tex) \
((_tex)->dict)
#define RwTextureSetFilterModeMacro(_tex, _filtering) \
(((_tex)->filterAddressing = \
((_tex)->filterAddressing & ~rwTEXTUREFILTERMODEMASK) | \
(((RwUInt32)(_filtering)) & rwTEXTUREFILTERMODEMASK)), \
(_tex))
#define RwTextureGetFilterModeMacro(_tex) \
((RwTextureFilterMode)((_tex)->filterAddressing & \
rwTEXTUREFILTERMODEMASK))
#define RwTextureSetAddressingMacro(_tex, _addressing) \
(((_tex)->filterAddressing = \
((_tex)->filterAddressing & ~rwTEXTUREADDRESSINGMASK) | \
(((((RwUInt32)(_addressing)) << 8) & rwTEXTUREADDRESSINGUMASK) | \
((((RwUInt32)(_addressing)) << 12) & rwTEXTUREADDRESSINGVMASK))), \
(_tex))
#define RwTextureSetAddressingUMacro(_tex, _addressing) \
(((_tex)->filterAddressing = \
((_tex)->filterAddressing & ~rwTEXTUREADDRESSINGUMASK) | \
(((RwUInt32)(_addressing) << 8) & rwTEXTUREADDRESSINGUMASK)), \
(_tex))
#define RwTextureSetAddressingVMacro(_tex, _addressing) \
(((_tex)->filterAddressing = \
((_tex)->filterAddressing & ~rwTEXTUREADDRESSINGVMASK) | \
(((RwUInt32)(_addressing) << 12) & rwTEXTUREADDRESSINGVMASK)), \
(_tex))
#define RwTextureGetAddressingMacro(_tex) \
(((((_tex)->filterAddressing & rwTEXTUREADDRESSINGUMASK) >> 8) == \
(((_tex)->filterAddressing & rwTEXTUREADDRESSINGVMASK) >> 12)) ? \
((RwTextureAddressMode)(((_tex)->filterAddressing & \
rwTEXTUREADDRESSINGVMASK) >> 12)) : \
rwTEXTUREADDRESSNATEXTUREADDRESS)
#define RwTextureGetAddressingUMacro(_tex) \
((RwTextureAddressMode)(((_tex)->filterAddressing & \
rwTEXTUREADDRESSINGUMASK) >> 8))
#define RwTextureGetAddressingVMacro(_tex) \
((RwTextureAddressMode)(((_tex)->filterAddressing & \
rwTEXTUREADDRESSINGVMASK) >> 12))
#if !(defined(RWDEBUG) || defined(RWSUPPRESSINLINE))
#define RwTextureGetRaster(_tex) \
RwTextureGetRasterMacro(_tex)
#define RwTextureAddRef(_tex) \
RwTextureAddRefMacro(_tex)
#define RwTextureGetName(_tex) \
RwTextureGetNameMacro(_tex)
#define RwTextureGetMaskName(_tex) \
RwTextureGetMaskNameMacro(_tex)
#define RwTextureGetDictionary(_tex) \
RwTextureGetDictionaryMacro(_tex)
#define RwTextureSetFilterMode(_tex, _filtering) \
RwTextureSetFilterModeMacro(_tex, _filtering)
#define RwTextureGetFilterMode(_tex) \
RwTextureGetFilterModeMacro(_tex)
#define RwTextureSetAddressing(_tex, _addressing) \
RwTextureSetAddressingMacro(_tex, _addressing)
#define RwTextureSetAddressingU(_tex, _addressing) \
RwTextureSetAddressingUMacro(_tex, _addressing)
#define RwTextureSetAddressingV(_tex, _addressing) \
RwTextureSetAddressingVMacro(_tex, _addressing)
#define RwTextureGetAddressing(_tex) \
RwTextureGetAddressingMacro(_tex)
#define RwTextureGetAddressingU(_tex) \
RwTextureGetAddressingUMacro(_tex)
#define RwTextureGetAddressingV(_tex) \
RwTextureGetAddressingVMacro(_tex)
#endif /* !(defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) */
/****************************************************************************
Function prototypes
*/
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
/* Reading mip maps */
/* Setting mip mapping states */
extern RwBool RwTextureSetMipmapping(RwBool enable);
extern RwBool RwTextureGetMipmapping(void);
extern RwBool RwTextureSetAutoMipmapping(RwBool enable);
extern RwBool RwTextureGetAutoMipmapping(void);
/* Setting and getting the mipmap generation function */
extern RwBool
RwTextureSetMipmapGenerationCallBack(RwTextureCallBackMipmapGeneration
callback);
extern RwTextureCallBackMipmapGeneration
RwTextureGetMipmapGenerationCallBack(void);
/* Setting and getting the mipmap file name generation function */
extern RwBool
RwTextureSetMipmapNameCallBack(RwTextureCallBackMipmapName callback);
extern RwTextureCallBackMipmapName RwTextureGetMipmapNameCallBack(void);
/* Generating mipmaps for a raster */
extern RwBool RwTextureGenerateMipmapName(RwChar * name,
RwChar * maskName,
RwUInt8 mipLevel,
RwInt32 format);
extern RwBool RwTextureRasterGenerateMipmaps(RwRaster * raster,
RwImage * image);
/* LEGACY-SUPPORT mip mapping */
extern RwBool _rwTextureSetAutoMipMapState(RwBool enable);
extern RwBool _rwTextureGetAutoMipMapState(void);
/* Setting and getting the callback function */
extern RwTextureCallBackRead RwTextureGetReadCallBack(void);
extern RwBool RwTextureSetReadCallBack(RwTextureCallBackRead
fpCallBack);
/* Texture and mask names */
extern RwTexture *RwTextureSetName(RwTexture * texture,
const RwChar * name);
extern RwTexture *RwTextureSetMaskName(RwTexture * texture,
const RwChar * maskName);
/* Creating/destroying dictionaries */
extern RwTexDictionary *RwTexDictionaryCreate(void);
extern RwBool RwTexDictionaryDestroy(RwTexDictionary * dict);
/* Textures */
extern RwTexture *RwTextureCreate(RwRaster * raster);
extern RwBool RwTextureDestroy(RwTexture * texture);
/* Setting and getting texture map rasters */
extern RwTexture *RwTextureSetRaster(RwTexture * texture,
RwRaster * raster);
/* Dictionary access */
extern RwTexture *RwTexDictionaryAddTexture(RwTexDictionary * dict,
RwTexture * texture);
extern RwTexture *RwTexDictionaryRemoveTexture(RwTexture * texture);
extern RwTexture *RwTexDictionaryFindNamedTexture(RwTexDictionary *
dict,
const RwChar * name);
/* Reading a texture */
extern RwTexture *RwTextureRead(const RwChar * name,
const RwChar * maskName);
/* Setting the current dictionary */
extern RwTexDictionary *RwTexDictionaryGetCurrent(void);
extern RwTexDictionary *RwTexDictionarySetCurrent(RwTexDictionary * dict);
/* Enumerating textures */
extern const RwTexDictionary *RwTexDictionaryForAllTextures(const
RwTexDictionary
* dict,
RwTextureCallBack
fpCallBack,
void *pData);
/* Enumerating the texture dictionaries currently in the system */
extern RwBool RwTexDictionaryForAllTexDictionaries(
RwTexDictionaryCallBack fpCallBack, void *pData);
/* Attaching toolkits */
extern RwInt32 RwTextureRegisterPlugin(RwInt32 size,
RwUInt32 pluginID,
RwPluginObjectConstructor
constructCB,
RwPluginObjectDestructor
destructCB,
RwPluginObjectCopy copyCB);
extern RwInt32 RwTexDictionaryRegisterPlugin(RwInt32 size,
RwUInt32 pluginID,
RwPluginObjectConstructor
constructCB,
RwPluginObjectDestructor
destructCB,
RwPluginObjectCopy
copyCB);
extern RwInt32 RwTextureGetPluginOffset(RwUInt32 pluginID);
extern RwInt32 RwTexDictionaryGetPluginOffset(RwUInt32 pluginID);
extern RwBool RwTextureValidatePlugins(const RwTexture * texture);
extern RwBool RwTexDictionaryValidatePlugins(const RwTexDictionary *
dict);
#if (defined(RWDEBUG) || defined(RWSUPPRESSINLINE))
/* Textures */
extern RwRaster *RwTextureGetRaster(const RwTexture *texture);
extern RwTexture *RwTextureAddRef(RwTexture *texture);
/* Texture and mask names */
extern RwChar *RwTextureGetName(RwTexture *texture);
extern RwChar *RwTextureGetMaskName(RwTexture *texture);
/* Get owner dictionary */
extern RwTexDictionary *RwTextureGetDictionary(RwTexture *texture);
/* Filtering */
extern RwTexture *RwTextureSetFilterMode(RwTexture *texture,
RwTextureFilterMode filtering);
extern RwTextureFilterMode RwTextureGetFilterMode(const RwTexture *texture);
/* Addressing */
extern RwTexture *RwTextureSetAddressing(RwTexture *texture,
RwTextureAddressMode addressing);
extern RwTexture *RwTextureSetAddressingU(RwTexture *texture,
RwTextureAddressMode addressing);
extern RwTexture *RwTextureSetAddressingV(RwTexture *texture,
RwTextureAddressMode addressing);
extern RwTextureAddressMode RwTextureGetAddressing(const RwTexture *texture);
extern RwTextureAddressMode RwTextureGetAddressingU(const RwTexture *texture);
extern RwTextureAddressMode RwTextureGetAddressingV(const RwTexture *texture);
#endif /* (defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) */
#ifdef __cplusplus
}
#endif /* __cplusplus */
#define RwTextureSetAutoMipMapState(_enable) \
_rwTextureSetAutoMipMapState(_enable)
#define RwTextureGetAutoMipMapState() \
_rwTextureGetAutoMipMapState()
/*--- Automatically derived from: C:/daily/rwsdk/src/pipe/p2/p2stdcls.h ---*/
/*
* Current:
*
* wait on Simon for instructions to do cluster renaming thing,
* or go thru and change all cluster type names and cluster
* names (add CSL?)
*
*/
/* CamVerts.csl */
/* clip flags */
/**
* \ingroup rwcoregeneric
* \ref RwClipFlag
* Flags specifying the clipping status of a vertex
*/
enum RwClipFlag
{
rwXLOCLIP = 0x01, /**<The vertex is outside the low X clip-plane */
rwXHICLIP = 0x02, /**<The vertex is outside the high X clip-plane */
rwXCLIP = 0x03, /**<The vertex is outside an X clip-plane */
rwYLOCLIP = 0x04, /**<The vertex is outside the low Y clip-plane */
rwYHICLIP = 0x08, /**<The vertex is outside the high Z clip-plane */
rwYCLIP = 0x0C, /**<The vertex is outside a Y clip-plane */
rwZLOCLIP = 0x10, /**<The vertex is outside the low Z clip-plane */
rwZHICLIP = 0x20, /**<The vertex is outside the high Z clip-plane */
rwZCLIP = 0x30, /**<The vertex is outside a Z clip-plane */
rwCLIPMASK = 0x3F, /**<Mask covering all used bits in the clip flags
* in case a plugin wants free ones to use (e.g RpGloss) */
rwCLIPFLAGFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
};
typedef enum RwClipFlag RwClipFlag;
/**
* \ingroup rwcoregeneric
* \typedef RwClipFlag
* Typedef for RwClipFlag enumeration specifying the clipping status of a vertex
*/
typedef struct RxCamSpace3DVertex RxCamSpace3DVertex;
/**
* \ingroup rwcoregeneric
* \struct RxCamSpace3DVertex
* Structure describing a camera-space 3D vertex.
*/
struct RxCamSpace3DVertex
{
/* Position in sheared camera-space (pre-projection) */
RwV3d cameraVertex; /**< \ref RwV3d camera-space position of the vertex */
/* Clip flags on this vertex */
RwUInt8 clipFlags; /**< Clip flags for the vertex generated during transformation into camera-space, see \ref RwClipFlag */
RwUInt8 pad[3]; /**< Alignment padding */
/* Lit colour */
RwRGBAReal col; /**< Accumulated \ref RwReal light values (initialized to zero or prelight colours) */
/* Only used by the clipper */
RwReal u; /**< Texture U coordinate */
RwReal v; /**< Texture V coordinate */
};
/* Supports pipeline1 apps: */
/**
* \ingroup datatypes
* \typedef RwCameraVertex
* typedef for a structure describing a camera-space 3D vertex.
*/
typedef RxCamSpace3DVertex RwCameraVertex;
/* (used during lighting) Doesn't use alpha yet, but it will */
#define RxCamSpace3DVertexSetRGBA(camvert, r, g, b, a) \
MACRO_START \
{ \
((camvert)->col.red = (r)); \
((camvert)->col.green = (g)); \
((camvert)->col.blue = (b)); \
((camvert)->col.alpha = (a)); \
} \
MACRO_STOP
#define RxCamSpace3DVertexAddRGBA(camvert, r, g, b, a) \
MACRO_START \
{ \
((camvert)->col.red += (r)); \
((camvert)->col.green += (g)); \
((camvert)->col.blue += (b)); \
((camvert)->col.alpha += (a)); \
} \
MACRO_STOP
/* LEGACY-SUPPORT macros */
#define RXCAMSPACE3DVERTEXSetRGBA(camvert, r, g, b, a) \
RxCamSpace3DVertexSetRGBA(camvert, r, g, b, a)
#define RXCAMSPACE3DVERTEXAddRGBA(camvert, r, g, b, a) \
RxCamSpace3DVertexAddRGBA(camvert, r, g, b, a)
/* MeshState.csl */
/**
* \ingroup rwcoregeneric
* \ref RxGeometryFlag
* Flags describing geometry properties
*/
enum RxGeometryFlag
{
rxGEOMETRY_TRISTRIP = 0x01, /**<This geometry's meshes can be rendered as tri-strips */
rxGEOMETRY_POSITIONS = 0x02, /**<This geometry has positions */
rxGEOMETRY_TEXTURED = 0x04, /**<This geometry has textures applied */
rxGEOMETRY_PRELIT = 0x08, /**<This geometry has luminance values */
rxGEOMETRY_NORMALS = 0x10, /**<This geometry has normals */
rxGEOMETRY_LIGHT = 0x20, /**<This geometry will be lit */
rxGEOMETRY_MODULATE = 0x40, /**<This geometry will modulate the material color with the vertex colors (prelit + lit) */
rxGEOMETRY_TEXTURED2 = 0x80, /**<This geometry has 2 set of texture coordinates */
rxGEOMETRY_COLORED = 0x100, /**<This mesh specifies per-vertex colors. NB: ONLY USED IN IM3D */
rxGEOMETRYFLAGFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
};
/**
* \ingroup rwcoregeneric
* \typedef RxGeometryFlag
* Typedef for RxGeometryFlag enumeration describing geometry properties
*/
typedef enum RxGeometryFlag RxGeometryFlag;
typedef struct RxMeshStateVector RxMeshStateVector;
/**
* \ingroup rwcoregeneric
* \struct RxMeshStateVector
* Structure describing a mesh-state vector,
* used by the RxClMeshState cluster
*/
struct RxMeshStateVector
{
RwInt32 Flags; /**< \ref RxGeometryFlag Flags from the source geometry */
void *SourceObject; /**< A void pointer. In immediate mode it points to an
* internal structure and in atomic/world-sector object
* or material pipelines it points to an \ref RpMaterial. */
RwMatrix Obj2World; /**< \ref RwMatrix to transform from object-space to world-space */
RwMatrix Obj2Cam; /**< \ref RwMatrix to transform from object-space to camera-space */
RwSurfaceProperties SurfaceProperties; /**< \ref RwSurfaceProperties */
/* We can't necessarily reference an RpMaterial in here (i.e with Im3D),
* because RpMaterials are defined in RpWorld not RwCore */
RwTexture *Texture; /**< A pointer to a \ref RwTexture */
RwRGBA MatCol; /**< \ref RwRGBA material colour */
RxPipeline *Pipeline; /**< A pointer to the material pipeline where appropriate */
/* rwPRIMTYPETRILIST/TRIFAN/TRISTRIP/LINELIST/POLYLINE */
RwPrimitiveType PrimType; /**< \ref RwPrimitiveType primitive type */
/* Interpretation based on PrimType */
RwUInt32 NumElements; /**< \ref RwUInt32 number of elements (triangles, lines...) */
RwUInt32 NumVertices; /**< \ref RwUInt32 number of vertices */
RwInt32 ClipFlagsOr; /**< Boolean OR of the \ref RwClipFlag clip flags of all vertices in the mesh */
RwInt32 ClipFlagsAnd; /**< Boolean AND of the \ref RwClipFlag clip flags of all vertices in the mesh */
void *SourceMesh; /**< A void pointer to the source \ref RpMesh */
void *DataObject; /**< Mirrors the void data pointer of \ref RxPipelineExecute */
};
/* RxScatter.csl */
typedef struct RxScatter RxScatter;
/**
* \ingroup rwcoregeneric
* \struct RxScatter
* Structure used by the RxClScatter cluster
*/
struct RxScatter
{
RxPipeline *pipeline; /**< \ref RxPipeline pointer, causes Scatter.csl
* to spit the packet out to the specified pipeline */
RxPipelineNode *node; /**< \ref RxPipelineNode pointer, causes Scatter.csl
* to send the packet to the specified PipelineNode
* (as long as it is actually one of its outputs!) */
};
/* RxInterpolants.csl */
typedef struct RxInterp RxInterp;
/**
* \ingroup rwcoregeneric
* \struct RxInterp
* Structure used by the RxClInterp cluster
*/
struct RxInterp
{
RxVertexIndex originalVert; /**< \ref RxVertexIndex index to the new vertex generated on the clipped edge */
RxVertexIndex parentVert1; /**< \ref RxVertexIndex index to the first vertex of the clipped edge */
RxVertexIndex parentVert2; /**< \ref RxVertexIndex index to the second vertex of the clipped edge */
RwReal interp; /**< \ref RwReal interpolant along the clipped edge */
};
/* RxUVs.csl */
typedef struct RxUV RxUV;
/**
* \ingroup rwcoregeneric
* \struct RxUV
* Structure used by the RxClUV cluster
*/
struct RxUV
{
RwReal u; /**< \ref RwReal U texture coordinate */
RwReal v; /**< \ref RwReal V texture coordinate */
};
/* RxTriPlanes.csl */
typedef struct RxTriPlane RxTriPlane;
/**
* \ingroup rwcoregeneric
* \struct RxTriPlane
* for the packed plane structure used in RpWorlds and by the RxClTriPlane cluster
* NOTE: this is currently not used in any nodes that ship with the SDK
*/
struct RxTriPlane
{
/* Packed plane format used in RpWorlds */
RwUInt32 N; /**< \ref RwUInt32 Packed normal */
RwReal w; /**< \ref RwReal distance from origin */
};
/* RxVSteps.csl */
#if (defined(_MSC_VER))
# if (_MSC_VER>=1000)
# pragma pack(push, 1)
# endif /* (_MSC_VER>=1000) */
#endif /* (defined(_MSC_VER)) */
typedef struct RxVStep RxVStep;
/**
* \ingroup rwcoregeneric
* \struct RxVStep
* Structure used by the RxClVStep cluster.
* To use the step values in the RxClVStep cluster, start at the beginning
* of the RxVStep and vertex arrays and proceed as follows: (a) Process one
* vertex, (b) Skip 'step' vertices, (c) Increment the cursor of the RxClVStep
* cluster. Repeat (a)-(c) until the entire vertex array has been processed.
* If the RxVStep array contains valid data, you should not have to bounds-check
* its cursor.
*/
struct RxVStep
{
RwUInt8 step; /**< \ref RwUInt8 The number of vertices after the current one
* which can be skipped in lighting and other calculations because,
* for example, they belong only to back-facing triangles */
};
#if (defined(_MSC_VER))
# if (_MSC_VER>=1000)
# pragma pack(pop)
# endif /* (_MSC_VER>=1000) */
#endif /* (defined(_MSC_VER)) */
/* CamNorms.csl */
/**
* \ingroup rwcoregeneric
* \typedef RxCamNorm
* typedef for \ref RwV3d used by the RxClVStep cluster */
typedef RwV3d RxCamNorm;
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
/* Uses the RxObjSpace3DVertex type (see pipmodel.h) */
extern RxClusterDefinition RxClObjSpace3DVertices;
/* Uses the RxCamSpace3DVertex type */
extern RxClusterDefinition RxClCamSpace3DVertices;
/* Uses the RxScrSpace2DVertex type (see pipmodel.h) */
extern RxClusterDefinition RxClScrSpace2DVertices;
/* Uses the RxInterp type */
extern RxClusterDefinition RxClInterpolants;
/* Uses the RxMeshStateVector type */
extern RxClusterDefinition RxClMeshState;
/* Uses the RxRenderStateVector type (p2renderstate.c/h) */
extern RxClusterDefinition RxClRenderState;
/* Uses the RxVertexIndex type */
extern RxClusterDefinition RxClIndices;
/* Uses the RxScatter type */
extern RxClusterDefinition RxClScatter;
/* Uses the RxUV type */
extern RxClusterDefinition RxClUVs;
/* Uses the RxVStep type */
extern RxClusterDefinition RxClVSteps;
/* Uses the RwRGBAReal type */
extern RxClusterDefinition RxClRGBAs;
/* Uses the RxCamNorm type */
extern RxClusterDefinition RxClCamNorms;
/* Uses the RxTriPlane type.
* NOTE: this is currently not used in any nodes that ship with the SDK */
extern RxClusterDefinition RxClTriPlanes;
#ifdef __cplusplus
}
#endif /* __cplusplus */
/*--- Automatically derived from: C:/daily/rwsdk/src/pipe/p2/baim3d.h ---*/
/**
* \ingroup datatypes
* RwIm3DTransformFlags
* The bit-field type RwIm3DTransformFlags
* specifies options available for controlling execution of the 3D immediate
* mode pipeline (see API function \ref RwIm3DTransform):*/
enum RwIm3DTransformFlags
{
rwIM3D_VERTEXUV = 1, /**<Texture coordinates in source vertices should be used */
rwIM3D_ALLOPAQUE = 2, /**<All source vertices are opaque (alpha is 255) */
rwIM3D_NOCLIP = 4, /**<No clipping should be performed on the geometry (the
* app may know it is all onscreen or within the guard band clipping
* region for the current hardware, so clipping can be skipped) */
rwIM3D_VERTEXXYZ = 8, /**<Vertex positions */
rwIM3D_VERTEXRGBA = 16, /**<Vertex color */
rwIM3DTRANSFORMFLAGSFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
};
typedef enum RwIm3DTransformFlags RwIm3DTransformFlags;
typedef struct rwIm3DPool rwIm3DPool;
typedef struct rwImmediGlobals rwImmediGlobals;
typedef struct rwIm3DRenderPipelines rwIm3DRenderPipelines;
typedef struct _rwIm3DPoolStash _rwIm3DPoolStash;
#if (0 && defined(SKY2))
typedef struct rwIm3DVertexCache RwIm3DVertexCache;
#endif /* (0&& defined(SKY2)) */
/* complete information to reconstruct post-transform Im3D "mesh" packet */
struct _rwIm3DPoolStash
{
RwUInt32 flags; /* rwIM3D_VERTEXUV, rwIM3D_ALLOPAQUE, rwIM3D_NOCLIP etc */
RwMatrix *ltm; /* world-space frame of the vertices, if they have one */
RwUInt32 numVerts;
RxObjSpace3DVertex *objVerts;
RxCamSpace3DVertex *camVerts;
RxScrSpace2DVertex *devVerts;
RxMeshStateVector *meshState;
RxRenderStateVector *renderState;
RxPipeline *pipeline;
RwPrimitiveType primType;
RxVertexIndex *indices;
RwUInt32 numIndices;
};
/* Used as a cache of transformed vertices */
struct rwIm3DPool
{
RwUInt16 numElements; /* could become RwUInt32 nowadays */
RwUInt16 pad; /* alignment padding */
void *elements; /* the original array of verts (or whatever...) - referenced not copied */
RwInt32 stride; /* the stride of the element */
_rwIm3DPoolStash stash;
};
struct rwIm3DRenderPipelines
{
/* One Im3D render pipeline pointer per rwPRIMTYPE
* (several pointers may point to the same pipeline though) */
RxPipeline *triList;
RxPipeline *triFan;
RxPipeline *triStrip;
RxPipeline *lineList;
RxPipeline *polyLine;
RxPipeline *pointList;
};
struct rwImmediGlobals
{
RxPipeline *genericIm3DTransformPipeline;
rwIm3DRenderPipelines genericIm3DRenderPipelines;
RxPipeline *im3DTransformPipeline;
rwIm3DRenderPipelines im3DRenderPipelines;
/* Platforms that have their own non-generic pipelines
* (OPENGL, D3D7, SKY2, KAMUI2, DOLPHIN) put them here: */
RxPipeline *platformIm3DTransformPipeline;
rwIm3DRenderPipelines platformIm3DRenderPipelines;
#if (defined(SKY2_DRVMODEL_H))
/* The triangle PS2All render pipe automatically
* calls this PS2AllMat pipeline: */
RxPipeline *ps2AllMatIm3DTrianglePipeline;
/* The line PS2All render pipe automatically
* calls this PS2AllMat pipeline: */
RxPipeline *ps2AllMatIm3DLinePipeline;
/* PS2Manager pipelines */
RxPipeline *ps2ManagerIm3DRenderPipeline;
#endif /* (defined(SKY2_DRVMODEL_H)) */
rwIm3DPool curPool; /* The current cache of transformed vertices */
};
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
extern rwIm3DPool *_rwIm3DGetPool( void );
extern void *RwIm3DTransform(RwIm3DVertex *pVerts, RwUInt32 numVerts,
RwMatrix *ltm, RwUInt32 flags);
extern RwBool RwIm3DEnd(void);
extern RwBool RwIm3DRenderLine(RwInt32 vert1, RwInt32 vert2);
extern RwBool RwIm3DRenderTriangle(RwInt32 vert1, RwInt32 vert2,
RwInt32 vert3);
extern RwBool RwIm3DRenderIndexedPrimitive(RwPrimitiveType primType,
RwImVertexIndex *indices,
RwInt32 numIndices);
extern RwBool RwIm3DRenderPrimitive(RwPrimitiveType primType);
extern RxPipeline *RwIm3DGetGenericTransformPipeline(void);
extern RxPipeline *RwIm3DGetGenericRenderPipeline(RwPrimitiveType primType);
extern RxPipeline *RwIm3DGetTransformPipeline(void);
extern RxPipeline *RwIm3DGetRenderPipeline( RwPrimitiveType primType);
extern RxPipeline *RwIm3DSetTransformPipeline(RxPipeline *pipeline);
extern RxPipeline *RwIm3DSetRenderPipeline( RxPipeline *pipeline,
RwPrimitiveType primType);
#ifdef __cplusplus
}
#endif /* __cplusplus */
/*--- Automatically derived from: C:/daily/rwsdk/src/pipe/p2/d3d8/im3dpipe.h ---*/
/*--- Automatically derived from: C:/daily/rwsdk/driver/d3d8/d3d8dxttex.h ---*/
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
extern RwTexture *RwD3D8DDSTextureRead(const RwChar *name, const RwChar *maskname);
extern RwBool RwD3D8RasterIsCompressed(const RwRaster *raster);
#ifdef __cplusplus
}
#endif /* __cplusplus */
/*--- Automatically derived from: C:/daily/rwsdk/driver/d3d8/drvfns.h ---*/
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
/****************************************************************************
Function prototypes
*/
/*******/
/* API */
/*******/
/* Reports on whether D3D8 can render S3TC textures */
extern RwBool
RwD3D8DeviceSupportsDXTTexture(void);
/* Get handle to D3D8 device - useful for setting D3D8 renderstate*/
extern void *
RwD3D8GetCurrentD3DDevice(void);
/* Get maximun number of multisampling levels */
extern RwUInt32
RwD3D8EngineGetMaxMultiSamplingLevels(void);
/* Set number of multisampling levels */
extern void
RwD3D8EngineSetMultiSamplingLevels(RwUInt32 numLevels);
/* Set maximun full screen refresh rate */
extern void
RwD3D8EngineSetRefreshRate(RwUInt32 refreshRate);
/* Get handle to D3D8 rendering surface - useful for advanced blit ops */
extern void *
RwD3D8GetCurrentD3DRenderTarget(void);
/* Atach a window to a camera */
extern RwBool
RwD3D8CameraAttachWindow(void *camera, void *hwnd);
/* Immediate mode rendering */
extern RwBool RwD3D8SetVertexShader(RwUInt32 handle);
extern RwBool RwD3D8SetPixelShader(RwUInt32 handle);
extern RwBool RwD3D8SetStreamSource(RwUInt32 streamNumber, void *streamData, RwUInt32 stride);
extern RwBool RwD3D8SetIndices(void *indexData, RwUInt32 baseVertexIndex);
extern RwBool RwD3D8DrawIndexedPrimitiveUP(RwUInt32 primitiveType,
RwUInt32 minIndex,
RwUInt32 numVertices,
RwUInt32 numIndices,
const void* indexData,
const void* vertexStreamZeroData,
RwUInt32 VertexStreamZeroStride);
extern RwBool RwD3D8DrawPrimitiveUP(RwUInt32 primitiveType,
RwUInt32 numVertices,
const void* vertexStreamZeroData,
RwUInt32 VertexStreamZeroStride);
extern RwBool RwD3D8DrawIndexedPrimitive(RwUInt32 primitiveType,
RwUInt32 minIndex,
RwUInt32 numVertices,
RwUInt32 startIndex,
RwUInt32 numIndices);
extern RwBool RwD3D8DrawPrimitive(RwUInt32 primitiveType,
RwUInt32 startVertex,
RwUInt32 numVertices);
extern RwBool RwD3D8SetTexture(RwTexture *texture, RwUInt32 stage);
extern RwBool RwD3D8SetRenderState(RwUInt32 state, RwUInt32 value);
extern RwBool RwD3D8SetTextureStageState(RwUInt32 stage, RwUInt32 type, RwUInt32 value);
extern RwBool RwD3D8SetTransform(RwUInt32 state, const void *matrix);
extern RwBool RwD3D8SetMaterial(const void *material);
extern void RwD3D8SetStencilClear(RwUInt32 stencilClear);
extern void RwD3D8GetRenderState(RwUInt32 state, void *value);
extern void RwD3D8GetTextureStageState(RwUInt32 stage, RwUInt32 type, void *value);
extern void RwD3D8GetTransform(RwUInt32 state, void *matrix);
extern RwUInt32 RwD3D8GetStencilClear(void);
/*
* To convert between RwMatrix to D3DMATRIX when setting the
* world matrix
*/
extern RwBool RwD3D8SetTransformWorld(const RwMatrix *matrix);
/*
* To convert between RpMaterial to D3DMATERIAL8
*/
extern RwBool RwD3D8SetSurfaceProperties(const RwRGBA *color,
const RwSurfaceProperties *surfaceProps,
RwBool modulate);
/*
* To set on that index the light from the descriptor
*/
extern RwBool RwD3D8SetLight(RwInt32 index, const void *light);
extern void RwD3D8GetLight(RwInt32 index, void *light);
extern RwBool RwD3D8EnableLight(RwInt32 index, RwBool enable);
/*
* To get a pointer to a Dynamic vertex buffer
* Use both functions, Create and Destroy, not only Create
*/
extern RwBool RwD3D8DynamicVertexBufferCreate(RwUInt32 fvf, RwUInt32 size,
void **vertexBuffer);
extern void RwD3D8DynamicVertexBufferDestroy(void *vertexBuffer);
/*
* To get a temporary pointer to a Dynamic vertex buffer memory
* Don't use with the previous functions because
* it mantains an internal list of dinamic vertex buffers
*/
extern RwBool RwD3D8DynamicVertexBufferLock(RwUInt32 vertexSize,
RwUInt32 numVertex,
void **vertexBufferOut,
void **vertexDataOut,
RwUInt32 *baseIndexOut);
extern RwBool RwD3D8DynamicVertexBufferUnlock(void *vertexBuffer);
/*
* To get a pointer to an Index vertex buffer
* It's created as WRITEONLY, MANAGED and D3DFMT_INDEX16
*/
extern RwBool RwD3D8IndexBufferCreate(RwUInt32 numIndices,
void **indexBuffer);
/*
* To create a vertex shader from the declaration, also the function
* for deleting it.
*/
extern RwBool RwD3D8CreateVertexShader(const RwUInt32 *declaration,
const RwUInt32 *function,
RwUInt32 *handle,
RwUInt32 usage);
extern void RwD3D8DeleteVertexShader(RwUInt32 handle);
extern RwBool RwD3D8SetVertexShaderConstant(RwUInt32 registerAddress,
const void *constantData,
RwUInt32 constantCount);
/*
* To create a pixel shader from the function, also the function
* for deleting it.
*/
extern RwBool RwD3D8CreatePixelShader(const RwUInt32 *function, RwUInt32 *handle);
extern void RwD3D8DeletePixelShader(RwUInt32 handle);
extern RwBool RwD3D8SetPixelShaderConstant(RwUInt32 registerAddress,
const void *constantData,
RwUInt32 constantCount);
/*
* Get a const pointer to the D3DCAPS8 struct, (you need to do the cast)
*/
extern const void *RwD3D8GetCaps(void);
/*
* Check if the sphere is fully inside of the frustum
*/
extern RwBool RwD3D8CameraIsSphereFullyInsideFrustum(const void *camera, const void *sphere);
/*
* Check if the Bounding Box is fully inside of the frustum
*/
extern RwBool RwD3D8CameraIsBBoxFullyInsideFrustum(const void *camera, const void *boundingBox);
/*
* Cheking the CPU capabilities
*/
extern RwBool _rwIntelSSEsupported(void);
extern RwBool _rwIntelMMXsupported(void);
/*
* Enabling texture format conversions when loading textures from a texture
* dictionary. FALSE by default.
*/
extern void
_rwD3D8TexDictionaryEnableRasterFormatConversion(RwBool enable);
#ifdef __cplusplus
}
#endif /* __cplusplus */
/* LEGACY-MACRO */
/**
* \ingroup rwcoredriverd3d8
* \ref RwD3DLoadNativeTexture is a legacy macro for compatability with
* RWD3D7 applications that can be used to read a compressed texture from
* the specified DDS file on disk.
*
* It is recommended that applications for RWD3D8 should use the RWD3D8
* function \ref RwD3D8DDSTextureRead instead.
*
* \param name Pointer to a string containing the name of the texture to be read.
* \param maskname Pointer to a string containing the name of the mask or
* NULL if not required.
*
* \return Returns pointer to the new texture if successful or NULL if there
* is an error.
*
* \see RwD3D8DDSTextureRead
* \see RwD3D8DeviceSupportsDXTTexture
* \see RwImageSetPath
* \see RwTextureSetReadCallBack
* \see RwTextureSetMipmapping
* \see RwTextureSetAutoMipmapping
* \see RwTextureDestroy
*
*/
#define RwD3DLoadNativeTexture RwD3D8DDSTextureRead
/*--- Automatically derived from: C:/daily/rwsdk/src/baresamp.h ---*/
/****************************************************************************
Function prototypes
*/
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
extern RwImage *RwImageResample(RwImage *dstImage, const RwImage *srcImage);
extern RwImage *RwImageCreateResample(const RwImage *srcImage, RwInt32 width,
RwInt32 height);
#ifdef __cplusplus
}
#endif /* __cplusplus */
/*--- Automatically derived from: C:/daily/rwsdk/src/baimras.h ---*/
/****************************************************************************
Function prototypes
*/
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
/* Images from rasters */
extern RwImage *RwImageSetFromRaster(RwImage *image, RwRaster *raster);
/* Rasters from images */
extern RwRaster *RwRasterSetFromImage(RwRaster *raster, RwImage *image);
/* Finding raster formats */
extern RwRGBA *RwRGBAGetRasterPixel(RwRGBA *rgbOut, RwRaster *raster,
RwInt32 x, RwInt32 y);
/* Read a raster */
extern RwRaster *RwRasterRead(const RwChar *filename);
extern RwRaster *RwRasterReadMaskedRaster(const RwChar *filename, const RwChar *maskname);
/* Finding appropriate raster formats */
extern RwImage *RwImageFindRasterFormat(RwImage *ipImage,RwInt32 nRasterType,
RwInt32 *npWidth,RwInt32 *npHeight,
RwInt32 *npDepth,RwInt32 *npFormat);
#ifdef __cplusplus
}
#endif /* __cplusplus */
/*--- Automatically derived from: C:/daily/rwsdk/src/baframe.h ---*/
/****************************************************************************
Defines
*/
#if (!defined(RWFRAMESTATICPLUGINSSIZE))
#define RWFRAMESTATICPLUGINSSIZE 0
#endif
#define RWFRAMEALIGNMENT(_frame) \
(! (((rwFRAMEALIGNMENT)-1) & ((RwUInt32)(_frame))))
/* Type ID */
#define rwFRAME 0
/* dirty flag bits */
#define rwFRAMEPRIVATEHIERARCHYSYNCLTM 0x01
#define rwFRAMEPRIVATEHIERARCHYSYNCOBJ 0x02
#define rwFRAMEPRIVATESUBTREESYNCLTM 0x04
#define rwFRAMEPRIVATESUBTREESYNCOBJ 0x08
#define rwFRAMEPRIVATESTATIC 0x10
/****************************************************************************
Global Types
*/
#if (!defined(DOXYGEN))
struct RwFrame
{
RwObject object;
RwLLLink inDirtyListLink;
/* Put embedded matrices here to ensure they remain 16-byte aligned */
RwMatrix modelling;
RwMatrix ltm;
RwLinkList objectList; /* List of objects connected to a frame */
struct RwFrame *child;
struct RwFrame *next;
struct RwFrame *root; /* Root of the tree */
#if (RWFRAMESTATICPLUGINSSIZE)
RWALIGN(RwUInt8 pluginData[RWFRAMESTATICPLUGINSSIZE], rwFRAMEALIGNMENT);
#endif /* defined(RWFRAMESTATICPLUGINSIZE)) */
};
#endif /* (!defined(DOXYGEN)) */
/**
* \ingroup datatypes
* \typedef RwFrame
Frame for defining object position and orientation.
* This should be considered an opaque type.
* Use the RwFrame API functions to access.
*/
typedef struct RwFrame RWALIGN(RwFrame, rwFRAMEALIGNMENT);
/**
* \ingroup datatypes
* \typedef RwFrameCallBack
* \ref RwFrameCallBack type represents the function
* called from \ref RwFrameForAllChildren for all child frames linked to a given frame.
* This function should return a pointer to the current frame to indicate success.
* The callback may return NULL to terminate further callbacks on the child frames.
*
* \param frame Pointer to the current frame, supplied by
* iterator.
* \param data Pointer to developer-defined data structure.
*
* \see RwFrameForAllChildren
*
*/
typedef RwFrame *(*RwFrameCallBack)(RwFrame *frame, void *data);
#define RwFrameGetParentMacro(_f) ((RwFrame *)rwObjectGetParent(_f))
#if (! ( defined(RWDEBUG) || defined(RWSUPPRESSINLINE) ))
#define RwFrameGetParent(_f) RwFrameGetParentMacro(_f)
#endif
#define RwFrameGetMatrixMacro(_f) (&(_f)->modelling)
#if (! ( defined(RWDEBUG) || defined(RWSUPPRESSINLINE) ))
#define RwFrameGetMatrix(_f) RwFrameGetMatrixMacro(_f)
#endif
/****************************************************************************
Function prototypes
*/
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
/* Finding what is attached to a frame */
extern RwFrame *
RwFrameForAllObjects(RwFrame * frame,
RwObjectCallBack callBack,
void *data);
/* Matrix operations */
extern RwFrame *
RwFrameTranslate(RwFrame * frame,
const RwV3d * v,
RwOpCombineType combine);
extern RwFrame *
RwFrameRotate(RwFrame * frame,
const RwV3d * axis,
RwReal angle,
RwOpCombineType combine);
extern RwFrame *
RwFrameScale(RwFrame * frame,
const RwV3d * v,
RwOpCombineType combine);
extern RwFrame *
RwFrameTransform(RwFrame * frame,
const RwMatrix * m,
RwOpCombineType combine);
extern RwFrame *
RwFrameOrthoNormalize(RwFrame * frame);
extern RwFrame *
RwFrameSetIdentity(RwFrame * frame);
/* Cloning */
extern RwFrame *
RwFrameCloneHierarchy(RwFrame * root);
/* Destruction */
extern RwBool
RwFrameDestroyHierarchy(RwFrame * frame);
/* Building a frame */
extern RwFrame *
RwFrameForAllChildren(RwFrame * frame,
RwFrameCallBack callBack,
void *data);
extern RwFrame *
RwFrameRemoveChild(RwFrame * child);
extern RwFrame *
RwFrameAddChild(RwFrame * parent,
RwFrame * child);
#if ( defined(RWDEBUG) || defined(RWSUPPRESSINLINE) )
extern RwFrame *
RwFrameGetParent(const RwFrame * frame);
#endif
/* Getting the root */
extern RwFrame *
RwFrameGetRoot(const RwFrame * frame);
/* Getting Matrices */
extern RwMatrix *
RwFrameGetLTM(RwFrame * frame);
#if ( defined(RWDEBUG) || defined(RWSUPPRESSINLINE) )
extern RwMatrix *
RwFrameGetMatrix(RwFrame * frame);
#endif
/* Elements */
extern RwFrame *
RwFrameUpdateObjects(RwFrame * frame);
/* Creating destroying frames */
extern RwFrame *
RwFrameCreate(void);
extern RwBool
RwFrameInit(RwFrame *frame);
extern RwBool
RwFrameDeInit(RwFrame *frame);
extern RwBool
RwFrameDestroy(RwFrame * frame);
/* internal function used by Create and Init */
extern void
_rwFrameInit(RwFrame *frame);
/* internal function used by Destroy and DeInit */
extern void
_rwFrameDeInit(RwFrame *frame);
/* Finding a frames state */
extern RwBool
RwFrameDirty(const RwFrame * frame);
/* Find the amount of frames in a hierarchy */
extern RwInt32
RwFrameCount(RwFrame * frame);
/* Plugins */
extern RwBool
RwFrameSetStaticPluginsSize(RwInt32 size);
extern RwInt32
RwFrameRegisterPlugin(RwInt32 size,
RwUInt32 pluginID,
RwPluginObjectConstructor constructCB,
RwPluginObjectDestructor destructCB,
RwPluginObjectCopy copyCB);
extern RwInt32
RwFrameGetPluginOffset(RwUInt32 pluginID);
extern RwBool
RwFrameValidatePlugins(const RwFrame * frame);
/* Cloning */
extern RwFrame *
_rwFrameCloneAndLinkClones(RwFrame * root);
extern
RwFrame *
_rwFramePurgeClone(RwFrame *root);
#ifdef __cplusplus
}
#endif /* __cplusplus */
/* Compatibility macros */
#define rwFrameGetParent(frame) \
_rwFrameGetParent(frame)
#define rwFrameInit(frame) \
_rwFrameInit(frame)
#define rwFrameDeInit(frame) \
_rwFrameDeInit(frame)
#define rwFrameCloneAndLinkClones(root) \
_rwFrameCloneAndLinkClones(root)
#define rwFramePurgeClone(root) \
_rwFramePurgeClone(root)
#define rwFrameClose(instance, offset, size) \
_rwFrameClose(instance, offset, size)
#define rwFrameOpen(instance, offset, size) \
_rwFrameOpen(instance, offset, size)
/*--- Automatically derived from: C:/daily/rwsdk/src/batypehf.h ---*/
typedef struct RwObjectHasFrame RwObjectHasFrame;
typedef RwObjectHasFrame * (*RwObjectHasFrameSyncFunction)(RwObjectHasFrame *object);
struct RwObjectHasFrame
{
RwObject object;
RwLLLink lFrame;
RwObjectHasFrameSyncFunction sync;
};
/****************************************************************************
Function prototypes
*/
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
/* Frames */
extern void _rwObjectHasFrameSetFrame(void *object, RwFrame *frame);
extern void _rwObjectHasFrameReleaseFrame(void *object);
/* ObjectHASFRAME METHODS */
#define rwObjectHasFrameInitialize(o, type, subtype, syncFunc) \
MACRO_START \
{ \
rwObjectInitialize(o, type, subtype); \
((RwObjectHasFrame *)o)->sync = syncFunc; \
} \
MACRO_STOP
#define rwObjectHasFrameSync(o) \
((RwObjectHasFrame *)(o))->sync(o)
#ifdef __cplusplus
}
#endif /* __cplusplus */
/* Compatibility macros */
#define rwObjectHasFrameSetFrame(object, frame) \
_rwObjectHasFrameSetFrame(object, frame)
#define rwObjectHasFrameReleaseFrame(object) \
_rwObjectHasFrameReleaseFrame(object)
/*--- Automatically derived from: C:/daily/rwsdk/src/basync.h ---*/
/*--- Automatically derived from: C:/daily/rwsdk/src/babintex.h ---*/
/****************************************************************************
Global types
*/
typedef struct rpTextureChunkInfo RwTextureChunkInfo;
struct rpTextureChunkInfo
{
RwTextureFilterMode filtering;
RwTextureAddressMode addressingU;
RwTextureAddressMode addressingV;
};
/* Bit flags defining properties of textures when stream */
enum RwTextureStreamFlags
{
rwNATEXTURESTREAMFLAG = 0x00,
rwTEXTURESTREAMFLAGSUSERMIPMAPS = 0x01,
rwTEXTURESTREAMFLAGSFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
};
typedef enum RwTextureStreamFlags RwTextureStreamFlags;
/****************************************************************************
Function prototypes
*/
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
/* Texture binary format */
extern RwInt32
RwTextureRegisterPluginStream(RwUInt32 pluginID,
RwPluginDataChunkReadCallBack readCB,
RwPluginDataChunkWriteCallBack writeCB,
RwPluginDataChunkGetSizeCallBack getSizeCB);
extern RwInt32
RwTextureSetStreamAlwaysCallBack(RwUInt32 pluginID,
RwPluginDataChunkAlwaysCallBack alwaysCB);
extern RwUInt32
RwTextureStreamGetSize(const RwTexture *texture);
extern RwTexture *
RwTextureStreamRead(RwStream *stream);
extern const RwTexture *
RwTextureStreamWrite(const RwTexture *texture,
RwStream *stream);
/* Texture dictionary binary format */
extern RwInt32
RwTexDictionaryRegisterPluginStream(RwUInt32 pluginID,
RwPluginDataChunkReadCallBack readCB,
RwPluginDataChunkWriteCallBack writeCB,
RwPluginDataChunkGetSizeCallBack getSizeCB);
extern RwInt32
RwTexDictionarySetStreamAlwaysCallBack(RwUInt32 pluginID,
RwPluginDataChunkAlwaysCallBack alwaysCB);
extern RwUInt32
RwTexDictionaryStreamGetSize(const RwTexDictionary *texDict);
extern RwTexDictionary
*RwTexDictionaryStreamRead(RwStream *stream);
extern const RwTexDictionary *
RwTexDictionaryStreamWrite(const RwTexDictionary *texDict,
RwStream *stream);
extern RwTextureChunkInfo *
_rwTextureChunkInfoRead(RwStream *stream,
RwTextureChunkInfo *textureChunkInfo,
RwInt32 *bytesRead);
/* Compatibility macro */
#define RwTextureChunkInfoRead(_stream, _textureChunkInfo, _bytesRead) \
_rwTextureChunkInfoRead(_stream, _textureChunkInfo, _bytesRead)
#ifdef __cplusplus
}
#endif /* __cplusplus */
/*--- Automatically derived from: C:/daily/rwsdk/src/babinfrm.h ---*/
/****************************************************************************
Global types
*/
typedef struct rwFrameList rwFrameList;
struct rwFrameList
{
RwFrame **frames;
RwInt32 numFrames;
};
/****************************************************************************
Global Variables
*/
/****************************************************************************
Function prototypes
*/
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
/* Frame binary format */
extern RwInt32
RwFrameRegisterPluginStream(RwUInt32 pluginID,
RwPluginDataChunkReadCallBack readCB,
RwPluginDataChunkWriteCallBack writeCB,
RwPluginDataChunkGetSizeCallBack getSizeCB);
extern RwInt32
RwFrameSetStreamAlwaysCallBack(RwUInt32 pluginID,
RwPluginDataChunkAlwaysCallBack alwaysCB);
extern rwFrameList *
_rwFrameListInitialize(rwFrameList *frameList,
RwFrame *frame);
extern RwBool
_rwFrameListFindFrame(const rwFrameList *frameList,
const RwFrame *frame,
RwInt32 *npIndex);
extern rwFrameList *
_rwFrameListDeinitialize(rwFrameList *frameList);
extern RwUInt32
_rwFrameListStreamGetSize(const rwFrameList *frameList);
extern rwFrameList *
_rwFrameListStreamRead(RwStream *stream,
rwFrameList *fl);
extern const rwFrameList *
_rwFrameListStreamWrite(const rwFrameList *frameList,
RwStream *stream);
#ifdef __cplusplus
}
#endif /* __cplusplus */
/* Comparibility macros */
#define rwFrameListInitialize(frameList,frame) \
_rwFrameListInitialize(frameList,frame)
#define rwFrameListFindFrame(frameList, frame, index) \
_rwFrameListFindFrame(frameList, frame, index)
#define rwFrameListDeinitialize(frameList) \
_rwFrameListDeinitialize(frameList)
#define rwFrameListStreamGetSize(frameList) \
_rwFrameListStreamGetSize(frameList)
#define rwFrameListStreamRead(stream, fl) \
_rwFrameListStreamRead(stream, fl)
#define rwFrameListStreamWrite(frameList, stream) \
_rwFrameListStreamWrite(frameList, stream)
/*--- Automatically derived from: C:/daily/rwsdk/src/babbox.h ---*/
/****************************************************************************
Global types
*/
typedef struct RwBBox RwBBox;
/**
* \ingroup datatypes
* \struct RwBBox
* This type represents a 3D axis-aligned bounding-box
* specified by the positions of two corners which lie on a diagonal.
* Typically used to specify a world bounding-box when the world is created
*
* \param sup Supremum vertex (contains largest values)
* \param inf Infimum vertex (contains smallest values)
*
* \see RpWorldCreate
*/
struct RwBBox
{
/* Must be in this order */
RwV3d sup; /**< Supremum vertex. */
RwV3d inf; /**< Infimum vertex. */
};
#if (!defined(RwBBoxAssign))
#define RwBBoxAssign(_target, _source) \
( *(_target) = *(_source) )
#endif /* (!defined(RwBBoxAssign)) */
/****************************************************************************
Function prototypes
*/
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
extern RwBBox *RwBBoxCalculate(RwBBox *boundBox,
const RwV3d *verts,
RwInt32 numVerts);
extern RwBBox *RwBBoxInitialize(RwBBox *boundBox,
const RwV3d *vertex);
extern RwBBox *RwBBoxAddPoint(RwBBox *boundBox,
const RwV3d *vertex);
extern RwBool RwBBoxContainsPoint(const RwBBox *boundBox,
const RwV3d *vertex);
#ifdef __cplusplus
}
#endif /* __cplusplus */
/*--- Automatically derived from: C:/daily/rwsdk/src/bacamera.h ---*/
/****************************************************************************
Defines
*/
/* Type ID */
#define rwCAMERA 4
/****************************************************************************
<macro/inline functionality
*/
#define RwCameraGetViewOffsetMacro(_camera) \
(&((_camera)->viewOffset))
#define RwCameraSetRasterMacro(_camera, _raster) \
(((_camera)->frameBuffer = (_raster)), (_camera))
#define RwCameraSetRasterVoidMacro(_camera, _raster) \
MACRO_START \
{ \
(_camera)->frameBuffer = (_raster); \
} \
MACRO_STOP
#define RwCameraGetRasterMacro(_camera) \
((_camera)->frameBuffer)
#define RwCameraSetZRasterMacro(_camera, _raster) \
(((_camera)->zBuffer = (_raster)), (_camera))
#define RwCameraSetZRasterVoidMacro(_camera, _raster) \
MACRO_START \
{ \
(_camera)->zBuffer = (_raster); \
} \
MACRO_STOP
#define RwCameraGetZRasterMacro(_camera) \
((_camera)->zBuffer)
#define RwCameraGetNearClipPlaneMacro(_camera) \
((_camera)->nearPlane)
#define RwCameraGetFarClipPlaneMacro(_camera) \
((_camera)->farPlane)
#define RwCameraSetFogDistanceMacro(_camera, _distance) \
(((_camera)->fogPlane = (_distance)), (_camera))
#define RwCameraGetFogDistanceMacro(_camera) \
((_camera)->fogPlane)
#define RwCameraGetCurrentCameraMacro() \
((RwCamera *)RWSRCGLOBAL(curCamera))
#define RwCameraGetProjectionMacro(_camera) \
((_camera)->projectionType)
#define RwCameraGetViewWindowMacro(_camera) \
(&((_camera)->viewWindow))
#define RwCameraGetViewMatrixMacro(_camera) \
(&((_camera)->viewMatrix))
#define RwCameraSetFrameMacro(_camera, _frame) \
(_rwObjectHasFrameSetFrame((_camera), (_frame)), (_camera))
#define RwCameraSetFrameVoidMacro(_camera, _frame) \
MACRO_START \
{ \
_rwObjectHasFrameSetFrame((_camera), (_frame)); \
} \
MACRO_STOP
#define RwCameraGetFrameMacro(_camera) \
((RwFrame *)rwObjectGetParent((_camera)))
#if !(defined(RWDEBUG) || defined(RWSUPPRESSINLINE))
#define RwCameraGetViewOffset(_camera) \
RwCameraGetViewOffsetMacro(_camera)
#define RwCameraSetRaster(_camera, _raster) \
RwCameraSetRasterMacro(_camera, _raster)
#define RwCameraGetRaster(_camera) \
RwCameraGetRasterMacro(_camera)
#define RwCameraSetZRaster(_camera, _raster) \
RwCameraSetZRasterMacro(_camera, _raster)
#define RwCameraGetZRaster(_camera) \
RwCameraGetZRasterMacro(_camera)
#define RwCameraGetNearClipPlane(_camera) \
RwCameraGetNearClipPlaneMacro(_camera)
#define RwCameraGetFarClipPlane(_camera) \
RwCameraGetFarClipPlaneMacro(_camera)
#define RwCameraSetFogDistance(_camera, _distance) \
RwCameraSetFogDistanceMacro(_camera, _distance)
#define RwCameraGetFogDistance(_camera) \
RwCameraGetFogDistanceMacro(_camera)
#define RwCameraGetCurrentCamera() \
RwCameraGetCurrentCameraMacro()
#define RwCameraGetProjection(_camera) \
RwCameraGetProjectionMacro(_camera)
#define RwCameraGetViewWindow(_camera) \
RwCameraGetViewWindowMacro(_camera)
#define RwCameraGetViewMatrix(_camera) \
RwCameraGetViewMatrixMacro(_camera)
#define RwCameraSetFrame(_camera, _frame) \
RwCameraSetFrameMacro(_camera, _frame)
#define RwCameraGetFrame(_camera) \
RwCameraGetFrameMacro(_camera)
#endif /* !(defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) */
/****************************************************************************
Global Types
*/
/**
* \ingroup datatypes
* RwCameraClearMode
* Camera clear flags */
enum RwCameraClearMode
{
rwCAMERACLEARIMAGE = 0x1, /**<Clear the frame buffer */
rwCAMERACLEARZ = 0x2, /**<Clear the Z buffer */
rwCAMERACLEARSTENCIL = 0x4, /**<\if xbox Clear the stencil buffer \endif
* \if d3d8 Clear the stencil buffer \endif
* \if opengl Clear the stencil buffer \endif
*/
rwCAMERACLEARMODEFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
};
typedef enum RwCameraClearMode RwCameraClearMode;
/**
* \ingroup datatypes
* RwCameraProjection
* This type represents the options available for
* setting the camera projection model, either perspective projection or
* parallel projection (see API function \ref RwCameraSetProjection)*/
enum RwCameraProjection
{
rwNACAMERAPROJECTION = 0, /**<Invalid projection */
rwPERSPECTIVE = 1, /**<Perspective projection */
rwPARALLEL = 2, /**<Parallel projection */
rwCAMERAPROJECTIONFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
};
typedef enum RwCameraProjection RwCameraProjection;
/**
* \ingroup datatypes
* RwFrustumTestResult
* This type represents the results from a
* camera frustum test on a given sphere (see API function
* \ref RwCameraFrustumTestSphere)*/
enum RwFrustumTestResult
{
rwSPHEREOUTSIDE = 0, /**<Outside the frustum */
rwSPHEREBOUNDARY = 1, /**<On the boundary of the frustum */
rwSPHEREINSIDE = 2, /**<Inside the frustum */
rwFRUSTUMTESTRESULTFORCEENUMSIZEINT = RWFORCEENUMSIZEINT
};
typedef enum RwFrustumTestResult RwFrustumTestResult;
/**
* \ingroup datatypes
* \typedef RwCamera
* Camera object for rendering a view.
* This should be considered an opaque type.
* Use the RwCamera API functions to access.
*/
typedef struct RwCamera RWALIGN(RwCamera, rwMATRIXALIGNMENT);
/* This allows a world to overload functionality */
typedef RwCamera *(*RwCameraBeginUpdateFunc) (RwCamera * camera);
typedef RwCamera *(*RwCameraEndUpdateFunc) (RwCamera * camera);
typedef struct RwFrustumPlane RwFrustumPlane;
/*
* Structure describing a frustrum plane.
*/
struct RwFrustumPlane
{
RwPlane plane;
RwUInt8 closestX;
RwUInt8 closestY;
RwUInt8 closestZ;
RwUInt8 pad;
};
#if (!defined(DOXYGEN))
struct RwCamera
{
RwObjectHasFrame object;
/* Parallel or perspective projection */
RwCameraProjection projectionType;
/* Start/end update functions */
RwCameraBeginUpdateFunc beginUpdate;
RwCameraEndUpdateFunc endUpdate;
/* The view matrix */
RwMatrix viewMatrix;
/* The cameras image buffer */
RwRaster *frameBuffer;
/* The Z buffer */
RwRaster *zBuffer;
/* Cameras mathmatical characteristics */
RwV2d viewWindow;
RwV2d recipViewWindow;
RwV2d viewOffset;
RwReal nearPlane;
RwReal farPlane;
RwReal fogPlane;
/* Transformation to turn camera z or 1/z into a Z buffer z */
RwReal zScale, zShift;
/* Render frame counter -> used for the frustum callback stuff */
RwUInt16 renderFrame;
RwUInt16 pad;
/* The clip-planes making up the viewing frustum */
RwFrustumPlane frustumPlanes[6];
RwBBox frustumBoundBox;
/* Points on the tips of the view frustum */
RwV3d frustumCorners[8];
};
#endif /* (!defined(DOXYGEN)) */
/**
* \ingroup datatypes
* \typedef RwCameraCallBack
* \ref RwCameraCallBack type represents a function called from any camera
* iterator that may be implemented in plugins. This function should return a
* pointer to the current camera to indicate success. The callback may return
* NULL to terminate further callbacks on other cameras.
*
* \param camera Pointer to the current camera, supplied by iterator.
* \param data Pointer to developer-defined data structure.
*/
typedef RwCamera *(*RwCameraCallBack)(RwCamera *camera, void *data);
/****************************************************************************
Function prototypes
*/
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
/* Rendering */
extern RwCamera *RwCameraBeginUpdate(RwCamera * camera);
extern RwCamera *RwCameraEndUpdate(RwCamera * camera);
extern RwCamera *RwCameraClear(RwCamera * camera, RwRGBA * colour,
RwInt32 clearMode);
/* Displaying results */
extern RwCamera *RwCameraShowRaster(RwCamera * camera, void *pDev,
RwUInt32 flags);
/* Creation and destruction */
extern RwBool RwCameraDestroy(RwCamera * camera);
extern RwCamera *RwCameraCreate(void);
extern RwCamera *RwCameraClone(RwCamera * camera);
/* Offset */
extern RwCamera *RwCameraSetViewOffset(RwCamera *camera,
const RwV2d *offset);
/* View window */
extern RwCamera *RwCameraSetViewWindow(RwCamera *camera,
const RwV2d *viewWindow);
/* Projection */
extern RwCamera *RwCameraSetProjection(RwCamera *camera,
RwCameraProjection projection);
/* Clip planes */
extern RwCamera *RwCameraSetNearClipPlane(RwCamera *camera, RwReal nearClip);
extern RwCamera *RwCameraSetFarClipPlane(RwCamera *camera, RwReal farClip);
/* Attaching toolkits */
extern RwInt32 RwCameraRegisterPlugin(RwInt32 size,
RwUInt32 pluginID,
RwPluginObjectConstructor
constructCB,
RwPluginObjectDestructor
destructCB,
RwPluginObjectCopy copyCB);
extern RwInt32 RwCameraGetPluginOffset(RwUInt32 pluginID);
extern RwBool RwCameraValidatePlugins(const RwCamera * camera);
/* Frustum testing */
extern RwFrustumTestResult RwCameraFrustumTestSphere(const RwCamera *
camera,
const RwSphere *
sphere);
#if (defined(RWDEBUG) || defined(RWSUPPRESSINLINE))
/* Offset */
extern const RwV2d *RwCameraGetViewOffset(const RwCamera *camera);
/* Rasters */
extern RwCamera *RwCameraSetRaster(RwCamera *camera, RwRaster *raster);
extern RwRaster *RwCameraGetRaster(const RwCamera *camera);
extern RwCamera *RwCameraSetZRaster(RwCamera *camera, RwRaster *zRaster);
extern RwRaster *RwCameraGetZRaster(const RwCamera *camera);
/* Clip planes */
extern RwReal RwCameraGetNearClipPlane(const RwCamera *camera);
extern RwReal RwCameraGetFarClipPlane(const RwCamera *camera);
extern RwCamera *RwCameraSetFogDistance(RwCamera *camera, RwReal fogDistance);
extern RwReal RwCameraGetFogDistance(const RwCamera *camera);
extern RwCamera *RwCameraGetCurrentCamera(void);
/* Projection */
extern RwCameraProjection RwCameraGetProjection(const RwCamera *camera);
/* View window */
extern const RwV2d *RwCameraGetViewWindow(const RwCamera *camera);
extern RwMatrix *RwCameraGetViewMatrix(RwCamera *camera);
/* Frames */
extern RwCamera *RwCameraSetFrame(RwCamera *camera, RwFrame *frame);
extern RwFrame *RwCameraGetFrame(const RwCamera *camera);
#endif /* (defined(RWDEBUG) || defined(RWSUPPRESSINLINE)) */
#ifdef __cplusplus
}
#endif /* __cplusplus */
/*--- Automatically derived from: C:/daily/rwsdk/driver/common/barwtyp.h ---*/
/*--- Automatically derived from: C:/daily/rwsdk/src/bacamval.h ---*/
/*--- Automatically derived from: C:/daily/rwsdk/src/pipe/p2/bapipe.h ---*/
struct rwPipeGlobals
{
RwFreeList *pipesFreeList; /* Save mallocs, use a freelist */
RxRenderStateVector defaultRenderState;
RwLinkList allPipelines; /* Unused as of yet, meant to be used to keep track of all
* created pipelines (for CBs and maybe cleanup) */
RwUInt32 maxNodesPerPipe; /* Initialised from _rxPipelineMaxNodes at startup. Used to
* allow conservative, single allocations during pipelock */
/* NOTE: Rw and RpWorld PowerPipe globals kept together for simplicity */
/* The current default pipelines (used if pipe == NULL for an object) */
RxPipeline *currentAtomicPipeline;
RxPipeline *currentWorldSectorPipeline;
RxPipeline *currentMaterialPipeline;
/* Generic C-based pipes that run on all platforms
* - these are set as the current pipes at startup unless
* platform-specific pipes (below) are created */
RxPipeline *genericAtomicPipeline;
RxPipeline *genericWorldSectorPipeline;
RxPipeline *genericMaterialPipeline;
/* Platforms that have their own non-generic pipelines
* (OPENGL, D3D7, SKY2, KAMUI2, DOLPHIN) put them here: */
RxPipeline *platformAtomicPipeline;
RxPipeline *platformWorldSectorPipeline;
RxPipeline *platformMaterialPipeline;
#if (defined(SKY2_DRVMODEL_H))
/* We have extra flavours of pipe under SKY2.
* PS2All and PS2AllMat are the defaults.
* - see RpWorldSectorSkyGetPS2AllPipeline, etc */
RxPipeline *ps2ManagerAtomicPipeline;
RxPipeline *allInOneAtomicPipeline;
RxPipeline *vanillaAtomicPipeline;
RxPipeline *ps2ManagerWorldSectorPipeline;
RxPipeline *allInOneWorldSectorPipeline;
RxPipeline *vanillaWorldSectorPipeline;
RxPipeline *vanillaMaterialPipeline;
#endif /* (SKY2_DRVMODEL_H) */
};
typedef struct rwPipeGlobals rwPipeGlobals;
#define RXPIPELINEGLOBAL(var) (RWPLUGINOFFSET(rwPipeGlobals, RwEngineInstance, _rxPipelineGlobalsOffset)->var)
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
extern RwInt32 _rxPipelineGlobalsOffset;
#ifdef __cplusplus
}
#endif /* __cplusplus */
/*--- Automatically derived from: C:/daily/rwsdk/driver/common/imrascnv.h ---*/
/*--- Automatically derived from: C:/daily/rwsdk/src/babincam.h ---*/
/****************************************************************************
Global types
*/
/* Camera stream format */
/**
* \ingroup datatypes
* \typedef RwCameraChunkInfo
*
* \ref RwCameraChunkInfo is typedef'd to a structure that holds camera
* data. This should be considered an opaque type. Use the RwCamera
* API functions to access it.
*/
typedef struct rwStreamCamera RwCameraChunkInfo;
typedef struct rwStreamCamera rwStreamCamera;
struct rwStreamCamera
{
RwV2d viewWindow;
RwV2d viewOffset;
RwReal nearPlane, farPlane;
RwReal fogPlane;
RwUInt32 projection;
};
/****************************************************************************
Function prototypes
*/
#ifdef __cplusplus
extern "C"
{
#endif /* __cplusplus */
/* Camera binary format */
extern RwInt32 RwCameraRegisterPluginStream(RwUInt32 pluginID,
RwPluginDataChunkReadCallBack readCB,
RwPluginDataChunkWriteCallBack writeCB,
RwPluginDataChunkGetSizeCallBack getSizeCB);
extern RwInt32 RwCameraSetStreamAlwaysCallBack(
RwUInt32 pluginID,
RwPluginDataChunkAlwaysCallBack alwaysCB);
extern RwUInt32 RwCameraStreamGetSize(const RwCamera *camera);
extern RwCamera *RwCameraStreamRead(RwStream *stream);
extern const RwCamera *RwCameraStreamWrite(const RwCamera *camera,
RwStream *stream);
extern RwCameraChunkInfo * RwCameraChunkInfoRead(RwStream *stream,
RwCameraChunkInfo *cameraChunkInfo,
RwInt32 *bytesRead);
#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* RWCORE_H */