librw/src/rwobjects.h

877 lines
21 KiB
C
Raw Normal View History

2016-01-26 12:53:08 +00:00
#include <stddef.h>
namespace rw {
2014-12-23 14:59:14 +00:00
struct Object
{
uint8 type;
uint8 subType;
uint8 flags;
2016-01-11 10:23:26 +00:00
uint8 privateFlags;
2014-12-23 14:59:14 +00:00
void *parent;
2016-01-11 10:23:26 +00:00
void init(uint8 type, uint8 subType){
this->type = type;
this->subType = subType;
this->flags = 0;
this->privateFlags = 0;
this->parent = nil;
2016-01-11 10:23:26 +00:00
}
void copy(Object *o){
this->type = o->type;
this->subType = o->subType;
this->flags = o->flags;
this->privateFlags = o->privateFlags;
this->parent = nil;
}
2014-12-23 14:59:14 +00:00
};
struct Frame
2015-01-09 19:17:32 +00:00
{
PLUGINBASE
2015-01-09 19:17:32 +00:00
typedef Frame *(*Callback)(Frame *f, void *data);
2016-01-13 07:58:15 +00:00
enum { ID = 0 };
enum { // private flags
// The hierarchy has unsynched frames
HIERARCHYSYNCLTM = 0x01, // LTM not synched
HIERARCHYSYNCOBJ = 0x02, // attached objects not synched
HIERARCHYSYNC = HIERARCHYSYNCLTM | HIERARCHYSYNCOBJ,
// This frame is not synched
SUBTREESYNCLTM = 0x04,
SUBTREESYNCOBJ = 0x08,
SUBTREESYNC = SUBTREESYNCLTM | SUBTREESYNCOBJ,
SYNCLTM = HIERARCHYSYNCLTM | SUBTREESYNCLTM,
SYNCOBJ = HIERARCHYSYNCOBJ | SUBTREESYNCOBJ
// STATIC = 0x10
};
2016-01-11 10:23:26 +00:00
Object object;
LLLink inDirtyList;
2016-01-11 10:23:26 +00:00
LinkList objectList;
2016-02-14 19:56:05 +00:00
Matrix matrix;
Matrix ltm;
2015-01-09 19:17:32 +00:00
Frame *child;
Frame *next;
Frame *root;
static int32 numAllocated;
static Frame *create(void);
Frame *cloneHierarchy(void);
void destroy(void);
void destroyHierarchy(void);
2016-01-24 00:42:51 +00:00
Frame *addChild(Frame *f, bool32 append = 0);
2015-01-09 19:17:32 +00:00
Frame *removeChild(void);
Frame *forAllChildren(Callback cb, void *data);
Frame *getParent(void) const {
2016-01-13 07:58:15 +00:00
return (Frame*)this->object.parent; }
2015-01-09 19:17:32 +00:00
int32 count(void);
bool32 dirty(void) const {
2016-02-18 13:56:10 +00:00
return !!(this->root->object.privateFlags & HIERARCHYSYNC); }
2016-02-14 19:56:05 +00:00
Matrix *getLTM(void);
void rotate(const V3d *axis, float32 angle, CombineOp op);
void translate(const V3d *trans, CombineOp op);
void scale(const V3d *scale, CombineOp op);
void transform(const Matrix *mat, CombineOp op);
void updateObjects(void);
void syncHierarchyLTM(void);
void setHierarchyRoot(Frame *root);
2020-04-16 08:10:11 +01:00
Frame *cloneAndLink(void);
void purgeClone(void);
#ifndef RWPUBLIC
static void registerModule(void);
#endif
static void syncDirty(void);
2015-01-09 19:17:32 +00:00
};
2016-06-17 12:29:49 +01:00
struct FrameList_
{
int32 numFrames;
Frame **frames;
FrameList_ *streamRead(Stream *stream);
void streamWrite(Stream *stream);
static uint32 streamGetSize(Frame *f);
};
2015-12-18 00:10:42 +00:00
Frame **makeFrameList(Frame *frame, Frame **flist);
2016-06-16 13:08:09 +01:00
struct ObjectWithFrame
2016-01-11 10:23:26 +00:00
{
2016-06-23 15:39:34 +01:00
typedef void (*Sync)(ObjectWithFrame*);
2016-06-16 13:08:09 +01:00
Object object;
2016-01-11 10:23:26 +00:00
LLLink inFrame;
2016-06-23 15:39:34 +01:00
Sync syncCB;
2016-01-11 10:23:26 +00:00
void setFrame(Frame *f){
2016-06-16 13:08:09 +01:00
if(this->object.parent)
2016-01-11 10:23:26 +00:00
this->inFrame.remove();
2016-06-16 13:08:09 +01:00
this->object.parent = f;
2016-08-05 00:13:41 +01:00
if(f){
2016-01-11 10:23:26 +00:00
f->objectList.add(&this->inFrame);
2016-08-05 00:13:41 +01:00
f->updateObjects();
}
2016-01-11 10:23:26 +00:00
}
void sync(void){ this->syncCB(this); }
2016-01-13 07:58:15 +00:00
static ObjectWithFrame *fromFrame(LLLink *lnk){
return LLLinkGetData(lnk, ObjectWithFrame, inFrame);
}
2016-01-11 10:23:26 +00:00
};
2014-12-25 15:02:57 +00:00
struct Image
{
int32 flags;
int32 width, height;
int32 depth;
int32 bpp; // bytes per pixel
2014-12-25 15:02:57 +00:00
int32 stride;
uint8 *pixels;
uint8 *palette;
static int32 numAllocated;
static Image *create(int32 width, int32 height, int32 depth);
void destroy(void);
2014-12-25 15:02:57 +00:00
void allocate(void);
void free(void);
void setPixels(uint8 *pixels);
2016-07-19 22:37:37 +01:00
void setPixelsDXT(int32 type, uint8 *pixels);
2014-12-25 15:02:57 +00:00
void setPalette(uint8 *palette);
2020-07-23 21:35:58 +01:00
void compressPalette(void); // turn 8 bit into 4 bit if possible
bool32 hasAlpha(void);
2020-07-22 12:56:03 +01:00
void convertTo32(void);
void palettize(int32 depth);
void unpalettize(bool forceAlpha = false);
void makeMask(void);
void applyMask(Image *mask);
void removeMask(void);
Image *extractMask(void);
static void setSearchPath(const char*);
static void printSearchPath(void);
static char *getFilename(const char*);
2020-05-01 20:02:37 +01:00
static Image *read(const char *imageName);
2020-07-22 12:56:03 +01:00
static Image *readMasked(const char *imageName, const char *maskName);
2020-05-01 20:02:37 +01:00
typedef Image *(*fileRead)(const char *afilename);
typedef void (*fileWrite)(Image *image, const char *filename);
static bool32 registerFileFormat(const char *ext, fileRead read, fileWrite write);
#ifndef RWPUBLIC
static void registerModule(void);
#endif
2014-12-25 15:02:57 +00:00
};
2014-12-25 18:37:36 +00:00
Image *readTGA(const char *filename);
void writeTGA(Image *image, const char *filename);
2020-04-15 13:00:34 +01:00
Image *readBMP(const char *filename);
void writeBMP(Image *image, const char *filename);
2020-07-23 14:06:03 +01:00
Image *readPNG(const char *filename);
void writePNG(Image *image, const char *filename);
2014-12-25 15:02:57 +00:00
2020-07-22 12:56:03 +01:00
enum { QUANTDEPTH = 8 };
struct ColorQuant
{
struct Node {
uint32 r, g, b, a;
int32 numPixels;
Node *parent;
Node *children[16];
LLLink link;
void destroy(void);
void addColor(RGBA color);
bool isLeaf(void) { for(int32 i = 0; i < 16; i++) if(this->children[i]) return false; return true; }
};
Node *root;
LinkList leaves;
void init(void);
void destroy(void);
Node *createNode(int32 level);
Node *getNode(Node *root, uint32 addr, int32 level);
Node *findNode(Node *root, uint32 addr, int32 level);
void reduceNode(Node *node);
void addColor(RGBA color);
uint8 findColor(RGBA color);
void addImage(Image *img);
void makePalette(int32 numColors, RGBA *colors);
void matchImage(uint8 *dstPixels, uint32 dstStride, Image *src);
};
// used to emulate d3d and xbox textures
struct RasterLevels
{
int32 numlevels;
uint32 format;
struct Level {
int32 width, height, size;
uint8 *data;
} levels[1]; // 0 is illegal :/
};
struct Raster
{
2020-05-02 09:08:19 +01:00
enum { FLIPWAITVSYNCH = 1 };
PLUGINBASE
int32 platform;
2017-08-18 18:28:01 +01:00
// TODO: use bytes
int32 type;
int32 flags;
2019-08-07 21:37:43 +01:00
int32 privateFlags;
int32 format;
int32 width, height, depth;
int32 stride;
2017-08-19 22:09:45 +01:00
uint8 *pixels;
uint8 *palette;
2019-08-07 21:37:43 +01:00
// remember for locked rasters
2017-08-19 22:09:45 +01:00
uint8 *originalPixels;
int32 originalWidth;
int32 originalHeight;
int32 originalStride;
2017-12-31 09:50:49 +00:00
// subraster
Raster *parent;
int32 offsetX, offsetY;
static int32 numAllocated;
2016-07-15 10:55:52 +01:00
static Raster *create(int32 width, int32 height, int32 depth,
int32 format, int32 platform = 0);
2017-12-31 09:50:49 +00:00
void subRaster(Raster *parent, Rect *r);
void destroy(void);
static bool32 imageFindRasterFormat(Image *image, int32 type,
int32 *pWidth, int32 *pHeight, int32 *pDepth, int32 *pFormat, int32 platform = 0);
2020-04-24 16:41:48 +01:00
Raster *setFromImage(Image *image, int32 platform = 0);
2016-07-15 10:55:52 +01:00
static Raster *createFromImage(Image *image, int32 platform = 0);
Image *toImage(void);
2019-08-07 21:37:43 +01:00
uint8 *lock(int32 level, int32 lockMode);
void unlock(int32 level);
2019-08-07 21:37:43 +01:00
uint8 *lockPalette(int32 lockMode);
void unlockPalette(void);
int32 getNumLevels(void);
static int32 calculateNumLevels(int32 width, int32 height);
2017-11-15 18:23:50 +00:00
static bool formatHasAlpha(int32 format);
2020-05-02 09:08:19 +01:00
void show(uint32 flags);
2020-04-16 08:10:11 +01:00
static Raster *pushContext(Raster *raster);
static Raster *popContext(void);
static Raster *getCurrentContext(void);
bool32 renderFast(int32 x, int32 y);
#ifndef RWPUBLIC
static void registerModule(void);
#endif
enum Format {
DEFAULT = 0,
C1555 = 0x0100,
C565 = 0x0200,
C4444 = 0x0300,
LUM8 = 0x0400,
C8888 = 0x0500,
C888 = 0x0600,
D16 = 0x0700,
D24 = 0x0800,
D32 = 0x0900,
C555 = 0x0A00,
AUTOMIPMAP = 0x1000,
PAL8 = 0x2000,
PAL4 = 0x4000,
MIPMAP = 0x8000
};
2016-06-23 15:39:34 +01:00
enum Type {
NORMAL = 0x00,
ZBUFFER = 0x01,
CAMERA = 0x02,
TEXTURE = 0x04,
CAMERATEXTURE = 0x05,
DONTALLOCATE = 0x80
2016-06-23 15:39:34 +01:00
};
2019-08-07 21:37:43 +01:00
enum LockMode {
LOCKWRITE = 1,
LOCKREAD = 2,
LOCKNOFETCH = 4, // don't fetch pixel data
LOCKRAW = 8,
};
};
2020-07-22 12:56:03 +01:00
void conv_RGBA8888_from_RGBA8888(uint8 *out, uint8 *in);
void conv_RGBA8888_from_RGB888(uint8 *out, uint8 *in);
void conv_RGB888_from_RGB888(uint8 *out, uint8 *in);
void conv_RGBA5551_from_ARGB1555(uint8 *out, uint8 *in);
void conv_RGBA8888_from_ARGB1555(uint8 *out, uint8 *in);
void conv_ABGR1555_from_ARGB1555(uint8 *out, uint8 *in);
inline void conv_ARGB1555_from_ABGR1555(uint8 *out, uint8 *in) { conv_ABGR1555_from_ARGB1555(out, in); }
2020-04-27 19:51:35 +01:00
2020-07-23 14:06:03 +01:00
void expandPal4(uint8 *dst, uint32 dststride, uint8 *src, uint32 srcstride, int32 w, int32 h);
void compressPal4(uint8 *dst, uint32 dststride, uint8 *src, uint32 srcstride, int32 w, int32 h);
void expandPal4_BE(uint8 *dst, uint32 dststride, uint8 *src, uint32 srcstride, int32 w, int32 h);
void compressPal4_BE(uint8 *dst, uint32 dststride, uint8 *src, uint32 srcstride, int32 w, int32 h);
void copyPal8(uint8 *dst, uint32 dststride, uint8 *src, uint32 srcstride, int32 w, int32 h);
2020-04-16 08:10:11 +01:00
2016-02-06 17:11:31 +00:00
#define IGNORERASTERIMP 0
2015-12-14 17:52:50 +00:00
struct TexDictionary;
struct Texture
2014-12-23 14:59:14 +00:00
{
enum FilterMode {
NEAREST = 1,
LINEAR,
MIPNEAREST,
MIPLINEAR,
LINEARMIPNEAREST,
LINEARMIPLINEAR
};
enum Addressing {
WRAP = 1,
MIRROR,
CLAMP,
BORDER
};
PLUGINBASE
2016-01-11 10:23:26 +00:00
Raster *raster;
TexDictionary *dict;
LLLink inDict;
2014-12-23 14:59:14 +00:00
char name[32];
char mask[32];
uint32 filterAddressing; // VVVVUUUU FFFFFFFF
2014-12-23 14:59:14 +00:00
int32 refCount;
2020-04-24 21:00:23 +01:00
LLLink inGlobalList; // actually not in RW
static int32 numAllocated;
static Texture *create(Raster *raster);
2020-04-24 21:00:23 +01:00
void addRef(void) { this->refCount++; }
void destroy(void);
static Texture *fromDict(LLLink *lnk){
2016-01-13 07:58:15 +00:00
return LLLinkGetData(lnk, Texture, inDict); }
FilterMode getFilter(void) { return (FilterMode)(filterAddressing & 0xFF); }
void setFilter(FilterMode f) { filterAddressing = (filterAddressing & ~0xFF) | f; }
Addressing getAddressU(void) { return (Addressing)((filterAddressing >> 8) & 0xF); }
Addressing getAddressV(void) { return (Addressing)((filterAddressing >> 12) & 0xF); }
void setAddressU(Addressing u) { filterAddressing = (filterAddressing & ~0xF00) | u<<8; }
void setAddressV(Addressing v) { filterAddressing = (filterAddressing & ~0xF000) | v<<12; }
static Texture *streamRead(Stream *stream);
bool streamWrite(Stream *stream);
2014-12-23 14:59:14 +00:00
uint32 streamGetSize(void);
2015-01-20 18:22:57 +00:00
static Texture *read(const char *name, const char *mask);
static Texture *streamReadNative(Stream *stream);
void streamWriteNative(Stream *stream);
uint32 streamGetSizeNative(void);
2014-12-23 14:59:14 +00:00
static Texture *(*findCB)(const char *name);
static Texture *(*readCB)(const char *name, const char *mask);
2017-11-15 18:23:50 +00:00
static void setLoadTextures(bool32); // default: true
static void setCreateDummies(bool32); // default: false
static void setMipmapping(bool32); // default: false
static void setAutoMipmapping(bool32); // default: false
static bool32 getMipmapping(void);
static bool32 getAutoMipmapping(void);
#ifndef RWPUBLIC
static void registerModule(void);
#endif
2014-12-23 14:59:14 +00:00
};
2016-06-16 13:08:09 +01:00
2016-01-09 21:01:21 +00:00
struct SurfaceProperties
{
float32 ambient;
float32 specular;
float32 diffuse;
};
struct Material
2014-12-23 14:59:14 +00:00
{
PLUGINBASE
2014-12-23 14:59:14 +00:00
Texture *texture;
2016-01-13 07:58:15 +00:00
RGBA color;
2016-01-09 21:01:21 +00:00
SurfaceProperties surfaceProps;
2015-01-10 21:13:27 +00:00
Pipeline *pipeline;
2014-12-23 14:59:14 +00:00
int32 refCount;
static int32 numAllocated;
static Material *create(void);
2020-04-24 21:00:23 +01:00
void addRef(void) { this->refCount++; }
Material *clone(void);
void destroy(void);
2016-06-17 12:29:49 +01:00
void setTexture(Texture *tex);
static Material *streamRead(Stream *stream);
bool streamWrite(Stream *stream);
2014-12-23 14:59:14 +00:00
uint32 streamGetSize(void);
};
void registerMaterialRightsPlugin(void);
2015-01-10 21:13:27 +00:00
2014-12-23 14:59:14 +00:00
struct Mesh
{
uint16 *indices;
uint32 numIndices;
Material *material;
};
struct MeshHeader
{
2016-01-24 00:42:51 +00:00
enum {
TRISTRIP = 1
};
2014-12-23 14:59:14 +00:00
uint32 flags;
uint16 numMeshes;
2020-04-16 11:53:25 +01:00
uint16 serialNum;
2014-12-23 14:59:14 +00:00
uint32 totalIndices;
2017-08-25 13:06:53 +01:00
uint32 pad; // needed for alignment of Meshes
// after this the meshes
2015-09-07 22:00:28 +01:00
2017-08-25 13:06:53 +01:00
Mesh *getMeshes(void) { return (Mesh*)(this+1); }
void setupIndices(void);
uint32 guessNumTriangles(void);
2014-12-23 14:59:14 +00:00
};
2017-08-25 13:06:53 +01:00
struct Geometry;
2014-12-23 14:59:14 +00:00
struct MorphTarget
{
2017-08-25 13:06:53 +01:00
Geometry *parent;
Sphere boundingSphere;
2017-08-05 00:44:37 +01:00
V3d *vertices;
V3d *normals;
Sphere calculateBoundingSphere(void) const;
2014-12-23 14:59:14 +00:00
};
struct InstanceDataHeader
{
uint32 platform;
};
2016-01-24 00:42:51 +00:00
struct Triangle
{
uint16 v[3];
uint16 matId;
};
2017-03-16 10:42:59 +00:00
struct MaterialList
{
Material **materials;
int32 numMaterials;
int32 space;
void init(void);
void deinit(void);
int32 appendMaterial(Material *mat);
int32 findIndex(Material *mat);
static MaterialList *streamRead(Stream *stream, MaterialList *matlist);
bool streamWrite(Stream *stream);
uint32 streamGetSize(void);
};
struct Geometry
2014-12-23 14:59:14 +00:00
{
PLUGINBASE
2016-01-13 07:58:15 +00:00
enum { ID = 8 };
2016-01-11 10:23:26 +00:00
Object object;
2017-03-16 10:42:59 +00:00
uint32 flags;
2020-04-16 11:53:25 +01:00
uint16 lockedSinceInst;
2014-12-23 14:59:14 +00:00
int32 numTriangles;
int32 numVertices;
int32 numMorphTargets;
int32 numTexCoordSets;
2016-01-24 00:42:51 +00:00
Triangle *triangles;
2017-08-05 00:44:37 +01:00
RGBA *colors;
TexCoords *texCoords[8];
2014-12-23 14:59:14 +00:00
MorphTarget *morphTargets;
2017-03-16 10:42:59 +00:00
MaterialList matList;
2014-12-23 14:59:14 +00:00
MeshHeader *meshHeader;
InstanceDataHeader *instData;
int32 refCount;
static int32 numAllocated;
static Geometry *create(int32 numVerts, int32 numTris, uint32 flags);
2020-04-24 21:00:23 +01:00
void addRef(void) { this->refCount++; }
void destroy(void);
2020-04-16 11:53:25 +01:00
void lock(int32 lockFlags);
void unlock(void);
2014-12-23 14:59:14 +00:00
void addMorphTargets(int32 n);
2015-12-19 16:05:39 +00:00
void calculateBoundingSphere(void);
bool32 hasColoredMaterial(void);
2015-08-11 19:57:43 +01:00
void allocateData(void);
2017-08-25 13:06:53 +01:00
MeshHeader *allocateMeshes(int32 numMeshes, uint32 numIndices, bool32 noIndices);
void generateTriangles(int8 *adc = nil);
2016-01-24 00:42:51 +00:00
void buildMeshes(void);
2019-01-10 09:17:53 +00:00
void buildTristrips(void); // private, used by buildMeshes
void correctTristripWinding(void);
void removeUnusedMaterials(void);
2017-03-16 10:42:59 +00:00
static Geometry *streamRead(Stream *stream);
bool streamWrite(Stream *stream);
uint32 streamGetSize(void);
2014-12-23 14:59:14 +00:00
enum Flags
{
TRISTRIP = 0x01,
POSITIONS = 0x02,
TEXTURED = 0x04,
PRELIT = 0x08,
NORMALS = 0x10,
LIGHT = 0x20,
MODULATE = 0x40,
TEXTURED2 = 0x80,
2017-08-21 22:15:31 +01:00
// When this flag is set the geometry has
// native geometry. When streamed out this geometry
// is written out instead of the platform independent data.
// When streamed in with this flag, the geometry is mostly empty.
2014-12-23 14:59:14 +00:00
NATIVE = 0x01000000,
2016-06-23 15:39:34 +01:00
// Just for documentation: RW sets this flag
// to prevent rendering when executing a pipeline,
// so only instancing will occur.
// librw's pipelines are different so it's unused here.
2014-12-23 14:59:14 +00:00
NATIVEINSTANCE = 0x02000000
};
2017-08-25 13:06:53 +01:00
2020-04-16 11:53:25 +01:00
enum LockFlags
{
LOCKPOLYGONS = 0x0001,
LOCKVERTICES = 0x0002,
LOCKNORMALS = 0x0004,
LOCKPRELIGHT = 0x0008,
LOCKTEXCOORDS = 0x0010,
LOCKTEXCOORDS1 = 0x0010,
LOCKTEXCOORDS2 = 0x0020,
LOCKTEXCOORDS3 = 0x0040,
LOCKTEXCOORDS4 = 0x0080,
LOCKTEXCOORDS5 = 0x0100,
LOCKTEXCOORDS6 = 0x0200,
LOCKTEXCOORDS7 = 0x0400,
LOCKTEXCOORDS8 = 0x0800,
LOCKTEXCOORDSALL = 0x0ff0,
LOCKALL = 0x0fff
};
2014-12-23 14:59:14 +00:00
};
void registerMeshPlugin(void);
void registerNativeDataPlugin(void);
2015-01-10 21:13:27 +00:00
2014-12-23 14:59:14 +00:00
struct Clump;
2016-06-23 15:39:34 +01:00
struct World;
2014-12-23 14:59:14 +00:00
struct Atomic
2016-01-13 07:58:15 +00:00
{
PLUGINBASE
typedef void (*RenderCB)(Atomic *atomic);
2016-01-13 07:58:15 +00:00
enum { ID = 1 };
2016-02-14 19:56:05 +00:00
enum {
2017-03-16 10:42:59 +00:00
// flags
2016-02-14 19:56:05 +00:00
COLLISIONTEST = 0x01, // unused here
2016-02-18 13:56:10 +00:00
RENDER = 0x04,
2017-03-16 10:42:59 +00:00
// private flags
WORLDBOUNDDIRTY = 0x01,
// for setGeometry
SAMEBOUNDINGSPHERE = 0x01
};
2016-01-13 07:58:15 +00:00
ObjectWithFrame object;
Geometry *geometry;
Sphere boundingSphere;
2016-02-18 13:56:10 +00:00
Sphere worldBoundingSphere;
2016-01-13 07:58:15 +00:00
Clump *clump;
LLLink inClump;
ObjPipeline *pipeline;
RenderCB renderCB;
2016-01-13 07:58:15 +00:00
2016-06-23 15:39:34 +01:00
World *world;
ObjectWithFrame::Sync originalSync;
static int32 numAllocated;
2016-01-13 07:58:15 +00:00
static Atomic *create(void);
Atomic *clone(void);
void destroy(void);
2016-02-18 13:56:10 +00:00
void setFrame(Frame *f) {
this->object.setFrame(f);
2016-06-16 13:08:09 +01:00
this->object.object.privateFlags |= WORLDBOUNDDIRTY;
2016-02-18 13:56:10 +00:00
}
Frame *getFrame(void) const { return (Frame*)this->object.object.parent; }
2016-01-13 07:58:15 +00:00
static Atomic *fromClump(LLLink *lnk){
return LLLinkGetData(lnk, Atomic, inClump); }
void setGeometry(Geometry *geo, uint32 flags);
2016-02-18 13:56:10 +00:00
Sphere *getWorldBoundingSphere(void);
2016-06-14 22:07:16 +01:00
ObjPipeline *getPipeline(void);
2017-08-21 22:15:31 +01:00
void instance(void);
void uninstance(void);
2016-06-14 22:07:16 +01:00
void render(void) { this->renderCB(this); }
2016-07-21 16:06:56 +01:00
void setRenderCB(RenderCB renderCB){
this->renderCB = renderCB;
if(this->renderCB == nil)
this->renderCB = defaultRenderCB;
};
2018-05-26 09:07:19 +01:00
void setFlags(uint32 flags) { this->object.object.flags = flags; }
uint32 getFlags(void) const { return this->object.object.flags; }
2016-01-13 07:58:15 +00:00
static Atomic *streamReadClump(Stream *stream,
2016-06-17 12:29:49 +01:00
FrameList_ *frameList, Geometry **geometryList);
bool streamWriteClump(Stream *stream, FrameList_ *frmlst);
2016-01-13 07:58:15 +00:00
uint32 streamGetSize(void);
static void defaultRenderCB(Atomic *atomic);
2016-01-13 07:58:15 +00:00
};
void registerAtomicRightsPlugin(void);
struct Light
2014-12-23 14:59:14 +00:00
{
PLUGINBASE
2016-01-13 07:58:15 +00:00
enum { ID = 3 };
2016-01-11 10:23:26 +00:00
ObjectWithFrame object;
2014-12-23 14:59:14 +00:00
float32 radius;
2016-01-14 22:49:00 +00:00
RGBAf color;
2014-12-23 14:59:14 +00:00
float32 minusCosAngle;
2016-06-23 15:39:34 +01:00
LLLink inWorld;
2016-01-11 10:23:26 +00:00
2016-06-23 15:39:34 +01:00
// clump extension
2014-12-23 14:59:14 +00:00
Clump *clump;
LLLink inClump;
2014-12-23 14:59:14 +00:00
2016-06-23 15:39:34 +01:00
// world extension
World *world;
ObjectWithFrame::Sync originalSync;
static int32 numAllocated;
static Light *create(int32 type);
void destroy(void);
2016-01-11 10:23:26 +00:00
void setFrame(Frame *f) { this->object.setFrame(f); }
Frame *getFrame(void) const { return (Frame*)this->object.object.parent; }
static Light *fromClump(LLLink *lnk){
2016-01-13 07:58:15 +00:00
return LLLinkGetData(lnk, Light, inClump); }
2016-06-23 15:39:34 +01:00
static Light *fromWorld(LLLink *lnk){
return LLLinkGetData(lnk, Light, inWorld); }
2016-01-13 07:58:15 +00:00
void setAngle(float32 angle);
float32 getAngle(void);
void setColor(float32 r, float32 g, float32 b);
2016-06-16 13:08:09 +01:00
int32 getType(void){ return this->object.object.subType; }
void setFlags(uint32 flags) { this->object.object.flags = flags; }
uint32 getFlags(void) { return this->object.object.flags; }
static Light *streamRead(Stream *stream);
bool streamWrite(Stream *stream);
2014-12-23 14:59:14 +00:00
uint32 streamGetSize(void);
2016-01-13 07:58:15 +00:00
enum Type {
DIRECTIONAL = 1,
AMBIENT,
POINT = 0x80, // positioned
SPOT,
SOFTSPOT
2016-01-13 07:58:15 +00:00
};
enum Flags {
LIGHTATOMICS = 1,
LIGHTWORLD = 2
};
2014-12-23 14:59:14 +00:00
};
struct FrustumPlane
{
Plane plane;
/* Used for BBox tests:
* 0 = inf is closer to normal direction
* 1 = sup is closer to normal direction */
uint8 closestX;
uint8 closestY;
uint8 closestZ;
};
struct Camera
2014-12-23 14:59:14 +00:00
{
PLUGINBASE
2016-01-13 07:58:15 +00:00
enum { ID = 4 };
2016-02-14 19:56:05 +00:00
enum { PERSPECTIVE = 1, PARALLEL };
2016-07-05 17:22:22 +01:00
enum { CLEARIMAGE = 0x1, CLEARZ = 0x2};
2017-07-11 07:18:15 +01:00
// return value of frustumTestSphere
enum { SPHEREOUTSIDE, SPHEREBOUNDARY, SPHEREINSIDE };
2016-02-14 19:56:05 +00:00
2016-01-11 10:23:26 +00:00
ObjectWithFrame object;
2016-06-23 15:39:34 +01:00
void (*beginUpdateCB)(Camera*);
void (*endUpdateCB)(Camera*);
2016-01-13 07:58:15 +00:00
V2d viewWindow;
V2d viewOffset;
2016-01-14 22:49:00 +00:00
float32 nearPlane, farPlane;
2016-01-13 07:58:15 +00:00
float32 fogPlane;
int32 projection;
2016-07-06 10:44:59 +01:00
Matrix viewMatrix;
float32 zScale, zShift;
FrustumPlane frustumPlanes[6];
V3d frustumCorners[8];
BBox frustumBoundBox;
Raster *frameBuffer;
Raster *zBuffer;
2017-12-31 09:50:49 +00:00
// Device dependant view and projection matrices
// optional
RawMatrix devView;
RawMatrix devProj;
2016-06-23 15:39:34 +01:00
// clump link handled by plugin in RW
2014-12-23 14:59:14 +00:00
Clump *clump;
LLLink inClump;
2014-12-23 14:59:14 +00:00
2016-06-23 15:39:34 +01:00
// world extension
/* RW: frustum sectors, space, position */
2016-06-23 15:39:34 +01:00
World *world;
ObjectWithFrame::Sync originalSync;
void (*originalBeginUpdate)(Camera*);
void (*originalEndUpdate)(Camera*);
static int32 numAllocated;
2016-01-13 07:58:15 +00:00
static Camera *create(void);
Camera *clone(void);
void destroy(void);
2016-01-11 10:23:26 +00:00
void setFrame(Frame *f) { this->object.setFrame(f); }
Frame *getFrame(void)const { return (Frame*)this->object.object.parent; }
2016-01-13 07:58:15 +00:00
static Camera *fromClump(LLLink *lnk){
return LLLinkGetData(lnk, Camera, inClump); }
void beginUpdate(void) { this->beginUpdateCB(this); }
void endUpdate(void) { this->endUpdateCB(this); }
2016-07-05 17:22:22 +01:00
void clear(RGBA *col, uint32 mode);
2020-05-02 09:08:19 +01:00
void showRaster(uint32 flags);
2016-07-06 10:44:59 +01:00
void setNearPlane(float32);
void setFarPlane(float32);
2017-08-12 09:25:25 +01:00
void setViewWindow(const V2d *window);
void setViewOffset(const V2d *offset);
void setProjection(int32 proj);
int32 frustumTestSphere(const Sphere *s) const;
2016-01-13 07:58:15 +00:00
static Camera *streamRead(Stream *stream);
bool streamWrite(Stream *stream);
2014-12-23 14:59:14 +00:00
uint32 streamGetSize(void);
2016-02-14 19:56:05 +00:00
// fov in degrees
void setFOV(float32 fov, float32 ratio);
2014-12-23 14:59:14 +00:00
};
struct Clump
2014-12-23 14:59:14 +00:00
{
PLUGINBASE
2016-01-13 07:58:15 +00:00
enum { ID = 2 };
2016-01-14 22:49:00 +00:00
Object object;
LinkList atomics;
LinkList lights;
2016-01-13 07:58:15 +00:00
LinkList cameras;
2014-12-23 14:59:14 +00:00
2016-06-23 15:39:34 +01:00
World *world;
2020-04-18 19:30:22 +01:00
LLLink inWorld;
2016-06-23 15:39:34 +01:00
static int32 numAllocated;
static Clump *create(void);
Clump *clone(void);
void destroy(void);
2020-04-18 19:30:22 +01:00
static Clump *fromWorld(LLLink *lnk){
return LLLinkGetData(lnk, Clump, inWorld); }
2016-01-14 22:49:00 +00:00
int32 countAtomics(void) { return this->atomics.count(); }
2020-04-18 19:30:22 +01:00
void addAtomic(Atomic *a);
void removeAtomic(Atomic *a);
2016-01-14 22:49:00 +00:00
int32 countLights(void) { return this->lights.count(); }
2020-04-18 19:30:22 +01:00
void addLight(Light *l);
void removeLight(Light *l);
2016-01-14 22:49:00 +00:00
int32 countCameras(void) { return this->cameras.count(); }
2020-04-18 19:30:22 +01:00
void addCamera(Camera *c);
void removeCamera(Camera *c);
2016-01-13 07:58:15 +00:00
void setFrame(Frame *f){
this->object.parent = f; }
Frame *getFrame(void) const {
2016-01-13 07:58:15 +00:00
return (Frame*)this->object.parent; }
static Clump *streamRead(Stream *stream);
bool streamWrite(Stream *stream);
2014-12-23 14:59:14 +00:00
uint32 streamGetSize(void);
2016-02-14 19:56:05 +00:00
void render(void);
2014-12-23 14:59:14 +00:00
};
2020-04-19 12:00:35 +01:00
// used by enumerateLights for lighting callback
struct WorldLights
{
int32 numAmbients;
2020-04-19 12:00:35 +01:00
RGBAf ambient; // all ambients added
int32 numDirectionals;
Light **directionals; // only directionals
int32 numLocals;
Light **locals; // points, (soft)spots
};
2016-06-23 15:39:34 +01:00
// A bit of a stub right now
struct World
2016-06-23 15:39:34 +01:00
{
PLUGINBASE
2016-06-23 15:39:34 +01:00
enum { ID = 7 };
Object object;
2020-04-19 12:00:35 +01:00
LinkList localLights; // these have positions (type >= 0x80)
LinkList globalLights; // these do not (type < 0x80)
2020-04-18 19:30:22 +01:00
LinkList clumps;
2016-06-23 15:39:34 +01:00
static int32 numAllocated;
2016-06-23 15:39:34 +01:00
static World *create(void);
void destroy(void);
2016-06-23 15:39:34 +01:00
void addLight(Light *light);
void removeLight(Light *light);
2016-06-23 15:39:34 +01:00
void addCamera(Camera *cam);
void removeCamera(Camera *cam);
2020-04-18 19:30:22 +01:00
void addAtomic(Atomic *atomic);
void removeAtomic(Atomic *atomic);
void addClump(Clump *clump);
void removeClump(Clump *clump);
void render(void);
2020-04-19 12:00:35 +01:00
void enumerateLights(Atomic *atomic, WorldLights *lightData);
2016-06-23 15:39:34 +01:00
};
struct TexDictionary
2015-01-20 18:22:57 +00:00
{
PLUGINBASE
2016-01-13 07:58:15 +00:00
enum { ID = 6 };
2016-01-11 10:23:26 +00:00
Object object;
LinkList textures;
2020-04-24 18:06:11 +01:00
LLLink inGlobalList;
2015-01-20 18:22:57 +00:00
static int32 numAllocated;
static TexDictionary *create(void);
2020-04-24 18:06:11 +01:00
static TexDictionary *fromLink(LLLink *lnk){
return LLLinkGetData(lnk, TexDictionary, inGlobalList); }
void destroy(void);
2016-01-14 22:49:00 +00:00
int32 count(void) { return this->textures.count(); }
2016-07-21 07:59:06 +01:00
void add(Texture *t);
2017-12-30 10:43:17 +00:00
void addFront(Texture *t);
2020-04-24 21:00:23 +01:00
void remove(Texture *t);
2015-01-20 18:22:57 +00:00
Texture *find(const char *name);
static TexDictionary *streamRead(Stream *stream);
void streamWrite(Stream *stream);
uint32 streamGetSize(void);
2015-01-20 18:22:57 +00:00
2016-07-21 07:59:06 +01:00
static void setCurrent(TexDictionary *txd);
static TexDictionary *getCurrent(void);
};
2016-01-13 07:58:15 +00:00
}