123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720 |
- /******************************************************************************
- plush.h
- PLUSH 3D VERSION 1.2 MAIN HEADER
- Copyright (c) 1996-2000 Justin Frankel
- Copyright (c) 1998-2000 Nullsoft, Inc.
- For more information on Plush and the latest updates, please visit
- http://www.nullsoft.com
- This software is provided 'as-is', without any express or implied
- warranty. In no event will the authors be held liable for any damages
- arising from the use of this software.
- Permission is granted to anyone to use this software for any purpose,
- including commercial applications, and to alter it and redistribute it
- freely, subject to the following restrictions:
- 1. The origin of this software must not be misrepresented; you must not
- claim that you wrote the original software. If you use this software
- in a product, an acknowledgment in the product documentation would be
- appreciated but is not required.
- 2. Altered source versions must be plainly marked as such, and must not be
- misrepresented as being the original software.
- 3. This notice may not be removed or altered from any source distribution.
- Justin Frankel
- [email protected]
- ******************************************************************************/
- #ifndef _PLUSH_H_
- #define _PLUSH_H_
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <math.h>
- #include "pl_conf.h"
- #include "pl_defs.h"
- #include "pl_types.h"
- #ifdef __cplusplus
- extern "C" {
- #endif
- extern pl_uChar plText_DefaultFont[256*16]; /* Default 8x16 font for plText* */
- extern pl_uInt32 plRender_TriStats[4]; /* Three different triangle counts from
- the last plRender() block:
- 0: initial tris
- 1: tris after culling
- 2: final polys after real clipping
- 3: final tris after tesselation
- */
- /******************************************************************************
- ** Material Functions (mat.c)
- ******************************************************************************/
- /*
- plMatCreate() creates a material.
- Parameters:
- none
- Returns:
- a pointer to the material on success, 0 on failure
- */
- pl_Mat *plMatCreate();
- /*
- plMatDelete() deletes a material that was created with plMatCreate().
- Parameters:
- m: a pointer to the material to be deleted
- Returns:
- nothing
- */
- void plMatDelete(pl_Mat *m);
- /*
- plMatInit() initializes a material that was created with plMatCreate().
- Parameters:
- m: a pointer to the material to be intialized
- Returns:
- nothing
- Notes:
- you *must* do this before calling plMatMapToPal() or plMatMakeOptPal().
- */
- void plMatInit(pl_Mat *m);
- /*
- plMatMapToPal() maps a material that was created with plMatCreate() and
- initialized with plMatInit() to a palette.
- Parameters:
- mat: material to map
- pal: a 768 byte array of unsigned chars, each 3 being a rgb triplet
- (0-255, *not* the cheesy vga 0-63)
- pstart: starting offset to use colors of, usually 0
- pend: ending offset to use colors of, usually 255
- Returns:
- nothing
- Notes:
- Mapping a material with > 2000 colors can take up to a second or two.
- Be careful, and go easy on plMat.NumGradients ;)
- */
- void plMatMapToPal(pl_Mat *m, pl_uChar *pal, pl_sInt pstart, pl_sInt pend);
- /*
- plMatMakeOptPal() makes an almost optimal palette from materials
- created with plMatCreate() and initialized with plMatInit().
- Paramters:
- p: palette to create
- pstart: first color entry to use
- pend: last color entry to use
- materials: an array of pointers to materials to generate the palette from
- nmats: number of materials
- Returns:
- nothing
- */
- void plMatMakeOptPal(pl_uChar *p, pl_sInt pstart,
- pl_sInt pend, pl_Mat **materials, pl_sInt nmats);
- /******************************************************************************
- ** Object Functions (obj.c)
- ******************************************************************************/
- /*
- plObjCreate() allocates an object
- Paramters:
- np: Number of vertices in object
- nf: Number of faces in object
- Returns:
- a pointer to the object on success, 0 on failure
- */
- pl_Obj *plObjCreate(pl_uInt32 np, pl_uInt32 nf);
- /*
- plObjDelete() frees an object and all of it's subobjects
- that was allocated with plObjCreate();
- Paramters:
- o: object to delete
- Returns:
- nothing
- */
- void plObjDelete(pl_Obj *o);
- /*
- plObjClone() creates an exact but independent duplicate of an object and
- all of it's subobjects
- Paramters:
- o: the object to clone
- Returns:
- a pointer to the new object on success, 0 on failure
- */
- pl_Obj *plObjClone(pl_Obj *o);
- /*
- plObjScale() scales an object, and all of it's subobjects.
- Paramters:
- o: a pointer to the object to scale
- s: the scaling factor
- Returns:
- a pointer to o.
- Notes: This scales it slowly, by going through each vertex and scaling it's
- position. Avoid doing this in realtime.
- */
- pl_Obj *plObjScale(pl_Obj *o, pl_Float s);
- /*
- plObjStretch() stretches an object, and all of it's subobjects
- Parameters:
- o: a pointer to the object to stretch
- x,y,z: the x y and z stretch factors
- Returns:
- a pointer to o.
- Notes: same as plObjScale(). Note that the normals are preserved.
- */
- pl_Obj *plObjStretch(pl_Obj *o, pl_Float x, pl_Float y, pl_Float z);
- /*
- plObjTranslate() translates an object
- Parameters:
- o: a pointer to the object to translate
- x,y,z: translation in object space
- Returns:
- a pointer to o
- Notes: same has plObjScale().
- */
- pl_Obj *plObjTranslate(pl_Obj *o, pl_Float x, pl_Float y, pl_Float z);
- /*
- plObjFlipNormals() flips all vertex and face normals of and object
- and allo of it's subobjects.
- Parameters:
- o: a pointer to the object to flip normals of
- Returns:
- a pointer to o
- Notes:
- Not especially fast.
- A call to plObjFlipNormals() or plObjCalcNormals() will restore the normals
- */
- pl_Obj *plObjFlipNormals(pl_Obj *o);
- /*
- plObjSetMat() sets the material of all faces in an object.
- Paramters:
- o: the object to set the material of
- m: the material to set it to
- th: "transcend hierarchy". If set, it will set the
- material of all subobjects too.
- Returns:
- nothing
- */
- void plObjSetMat(pl_Obj *o, pl_Mat *m, pl_Bool th);
- /*
- plObjCalcNormals() calculates all face and vertex normals for an object
- and all subobjects.
- Paramters:
- obj: the object
- Returns:
- nothing
- */
- void plObjCalcNormals(pl_Obj *obj);
- /******************************************************************************
- ** Frustum Clipping Functions (clip.c)
- ******************************************************************************/
- /*
- plClipSetFrustum() sets up the clipping frustum.
- Parameters:
- cam: a camera allocated with plCamCreate().
- Returns:
- nothing
- Notes:
- Sets up the internal structures.
- DO NOT CALL THIS ROUTINE FROM WITHIN A plRender*() block.
- */
- void plClipSetFrustum(pl_Cam *cam);
- /*
- plClipRenderFace() renders a face and clips it to the frustum initialized
- with plClipSetFrustum().
- Parameters:
- face: the face to render
- Returns:
- nothing
- Notes: this is used internally by plRender*(), so be careful. Kinda slow too.
- */
- void plClipRenderFace(pl_Face *face);
- /*
- plClipNeeded() decides whether the face is in the frustum, intersecting
- the frustum, or completely out of the frustum craeted with
- plClipSetFrustum().
- Parameters:
- face: the face to check
- Returns:
- 0: the face is out of the frustum, no drawing necessary
- 1: the face is intersecting the frustum, splitting and drawing necessary
- Notes: this is used internally by plRender*(), so be careful. Kinda slow too.
- */
- pl_sInt plClipNeeded(pl_Face *face);
- /******************************************************************************
- ** Light Handling Routines (light.c)
- ******************************************************************************/
- /*
- plLightCreate() creates a new light
- Parameters:
- none
- Returns:
- a pointer to the light
- */
- pl_Light *plLightCreate();
- /*
- plLightSet() sets up a light allocated with plLightCreate()
- Parameters:
- light: the light to set up
- mode: the mode of the light (PL_LIGHT_*)
- x,y,z: either the position of the light (PL_LIGHT_POINT*) or the angle
- in degrees of the light (PL_LIGHT_VECTOR)
- intensity: the intensity of the light (0.0-1.0)
- halfDist: the distance at which PL_LIGHT_POINT_DISTANCE is 1/2 intensity
- Returns:
- a pointer to light.
- */
- pl_Light *plLightSet(pl_Light *light, pl_uChar mode, pl_Float x, pl_Float y,
- pl_Float z, pl_Float intensity, pl_Float halfDist);
- /*
- plLightDelete() frees a light allocated with plLightCreate().
- Paramters:
- l: light to delete
- Returns:
- nothing
- */
- void plLightDelete(pl_Light *l);
- /* PUT ME SOMEWHERE */
- /*
- ** plTexDelete() frees all memory associated with "t"
- */
- void plTexDelete(pl_Texture *t);
- /******************************************************************************
- ** Camera Handling Routines (cam.c)
- ******************************************************************************/
- /*
- plCamCreate() allocates a new camera
- Parameters:
- sw: screen width
- sh: screen height
- ar: aspect ratio (usually 1.0)
- fov: field of view (usually 45-120)
- fb: pointer to framebuffer
- zb: pointer to Z buffer (or NULL)
- Returns:
- a pointer to the newly allocated camera
- */
- pl_Cam *plCamCreate(pl_uInt sw, pl_uInt sh, pl_Float ar, pl_Float fov,
- pl_uChar *fb, pl_ZBuffer *zb);
- /*
- plCamSetTarget() sets the target of a camera allocated with plCamCreate().
- Parameters:
- c: the camera to set the target of
- x,y,z: the worldspace coordinate of the target
- Returns:
- nothing
- Notes:
- Sets the pitch and pan of the camera. Does not touch the roll.
- */
- void plCamSetTarget(pl_Cam *c, pl_Float x, pl_Float y, pl_Float z);
- /*
- plCamDelete() frees all memory associated with a camera excluding
- framebuffers and Z buffers
- Paramters:
- c: camera to free
- Returns:
- nothing
- */
- void plCamDelete(pl_Cam *c);
- /******************************************************************************
- ** Easy Rendering Interface (render.c)
- ******************************************************************************/
- /*
- plRenderBegin() begins the rendering process.
- Parameters:
- Camera: camera to use for rendering
- Returns:
- nothing
- Notes:
- Only one rendering process can occur at a time.
- Uses plClip*(), so don't use them within or around a plRender() block.
- */
- void plRenderBegin(pl_Cam *Camera);
- /*
- plRenderLight() adds a light to the scene.
- Parameters:
- light: light to add to scene
- Returns:
- nothing
- Notes: Any objects rendered before will be unaffected by this.
- */
- void plRenderLight(pl_Light *light);
- /*
- plRenderObj() adds an object and all of it's subobjects to the scene.
- Parameters:
- obj: object to render
- Returns:
- nothing
- Notes: if Camera->Sort is zero, objects are rendered in the order that
- they are added to the scene.
- */
- void plRenderObj(pl_Obj *obj);
- /*
- plRenderEnd() actually does the rendering, and closes the rendering process
- Paramters:
- none
- Returns:
- nothing
- */
- void plRenderEnd();
- /******************************************************************************
- ** Object Primitives Code (make.c)
- ******************************************************************************/
- /*
- plMakePlane() makes a plane centered at the origin facing up the y axis.
- Parameters:
- w: width of the plane (along the x axis)
- d: depth of the plane (along the z axis)
- res: resolution of plane, i.e. subdivisions
- m: material to use
- Returns:
- pointer to object created.
- */
- pl_Obj *plMakePlane(pl_Float w, pl_Float d, pl_uInt res, pl_Mat *m);
- /*
- plMakeBox() makes a box centered at the origin
- Parameters:
- w: width of the box (x axis)
- d: depth of the box (z axis)
- h: height of the box (y axis)
- Returns:
- pointer to object created.
- */
- pl_Obj *plMakeBox(pl_Float w, pl_Float d, pl_Float h, pl_Mat *m);
- /*
- plMakeCone() makes a cone centered at the origin
- Parameters:
- r: radius of the cone (x-z axis)
- h: height of the cone (y axis)
- div: division of cone (>=3)
- cap: close the big end?
- m: material to use
- Returns:
- pointer to object created.
- */
- pl_Obj *plMakeCone(pl_Float r, pl_Float h, pl_uInt div, pl_Bool cap, pl_Mat *m);
- /*
- plMakeCylinder() makes a cylinder centered at the origin
- Parameters:
- r: radius of the cylinder (x-z axis)
- h: height of the cylinder (y axis)
- divr: division of of cylinder (around the circle) (>=3)
- captop: close the top
- capbottom: close the bottom
- m: material to use
- Returns:
- pointer to object created.
- */
- pl_Obj *plMakeCylinder(pl_Float r, pl_Float h, pl_uInt divr, pl_Bool captop,
- pl_Bool capbottom, pl_Mat *m);
- /*
- plMakeSphere() makes a sphere centered at the origin.
- Parameters:
- r: radius of the sphere
- divr: division of the sphere (around the y axis) (>=3)
- divh: division of the sphere (around the x,z axis) (>=3)
- m: material to use
- Returns:
- pointer to object created.
- */
- pl_Obj *plMakeSphere(pl_Float r, pl_uInt divr, pl_uInt divh, pl_Mat *m);
- /*
- plMakeTorus() makes a torus centered at the origin
- Parameters:
- r1: inner radius of the torus
- r2: outer radius of the torus
- divrot: division of the torus (around the y axis) (>=3)
- divrad: division of the radius of the torus (x>=3)
- m: material to use
- Returns:
- pointer to object created.
- */
- pl_Obj *plMakeTorus(pl_Float r1, pl_Float r2, pl_uInt divrot,
- pl_uInt divrad, pl_Mat *m);
- /******************************************************************************
- ** File Readers (read_*.c)
- ******************************************************************************/
- /*
- plRead3DSObj() reads a 3DS object
- Parameters:
- fn: filename of object to read
- m: material to assign it
- Returns:
- pointer to object
- Notes:
- This reader organizes multiple objects like so:
- 1) the first object is returned
- 2) the second object is the first's first child
- 3) the third object is the second's first child
- 4) etc
- */
- pl_Obj *plRead3DSObj(char *fn, pl_Mat *m);
- /*
- plReadCOBObj() reads an ascii .COB object
- Parameters:
- fn: filename of object to read
- mat: material to assign it
- Returns:
- pointer to object
- Notes:
- This is Caligari's ASCII object format.
- This reader doesn't handle multiple objects. It just reads the first one.
- Polygons with lots of sides are not always tesselated correctly. Just
- use the "Tesselate" button from within truespace to improve the results.
- */
- pl_Obj *plReadCOBObj(char *fn, pl_Mat *mat);
- /*
- plReadJAWObj() reads a .JAW object.
- Parameters:
- fn: filename of object to read
- m: material to assign it
- Returns:
- pointer to object
- Notes:
- For information on the .JAW format, please see the jaw3D homepage,
- http://www.tc.umn.edu/nlhome/g346/kari0022/jaw3d/
- */
- pl_Obj *plReadJAWObj(char *fn, pl_Mat *m);
- /*
- plReadPCXTex() reads a 8bpp PCX texture
- Parameters:
- fn: filename of texture to read
- rescale: will rescale image if not whole log2 dimensions (USE THIS)
- optimize: will optimize colors (USE THIS TOO)
- Returns:
- pointer to texture
- Notes:
- The PCX must be a 8bpp zSoft version 5 PCX. The texture's palette will
- be optimized, and the texture might be scaled up so that it's dimensions
- will be a nice power of two.
- */
- pl_Texture *plReadPCXTex(char *fn, pl_Bool rescale, pl_Bool optimize);
- /******************************************************************************
- ** Math Code (math.c)
- ******************************************************************************/
- /*
- plMatrixRotate() generates a rotation matrix
- Parameters:
- matrix: an array of 16 pl_Floats that is a 4x4 matrix
- m: the axis to rotate around, 1=X, 2=Y, 3=Z.
- Deg: the angle in degrees to rotate
- Returns:
- nothing
- */
- void plMatrixRotate(pl_Float matrix[], pl_uChar m, pl_Float Deg);
- /*
- plMatrixTranslate() generates a translation matrix
- Parameters:
- m: the matrix (see plMatrixRotate for more info)
- x,y,z: the translation coordinates
- Returns:
- nothing
- */
- void plMatrixTranslate(pl_Float m[], pl_Float x, pl_Float y, pl_Float z);
- /*
- plMatrixMultiply() multiplies two matrices
- Parameters:
- dest: destination matrix will be multipled by src
- src: source matrix
- Returns:
- nothing
- Notes:
- this is the same as dest = dest*src (since the order *does* matter);
- */
- void plMatrixMultiply(pl_Float *dest, pl_Float src[]);
- /*
- plMatrixApply() applies a matrix.
- Parameters:
- m: matrix to apply
- x,y,z: input coordinate
- outx,outy,outz: pointers to output coords.
- Returns:
- nothing
- Notes:
- applies the matrix to the 3d point to produce the transformed 3d point
- */
- void plMatrixApply(pl_Float *m, pl_Float x, pl_Float y, pl_Float z,
- pl_Float *outx, pl_Float *outy, pl_Float *outz);
- /*
- plNormalizeVector() makes a vector a unit vector
- Parameters:
- x,y,z: pointers to the vector
- Returns:
- nothing
- */
- void plNormalizeVector(pl_Float *x, pl_Float *y, pl_Float *z);
- /*
- plDotProduct() returns the dot product of two vectors
- Parameters:
- x1,y1,z1: the first vector
- x2,y2,z2: the second vector
- Returns:
- the dot product of the two vectors
- */
- pl_Float plDotProduct(pl_Float x1, pl_Float y1, pl_Float z1,
- pl_Float x2, pl_Float y2, pl_Float z2);
- /******************************************************************************
- ** Spline Interpolation (spline.c)
- ******************************************************************************/
- /*
- plSplineInit() initializes a spline
- Parameters:
- s: the spline
- Returns:
- nothing
- Notes:
- Intializes the spline. Do this once, or when you change any of the settings
- */
- void plSplineInit(pl_Spline *s);
- /*
- plSplineGetPoint() gets a point on the spline
- Parameters:
- s: spline
- frame: time into spline. 0.0 is start, 1.0 is second key point, etc.
- out: a pointer to an array of s->keyWidth floats that will be filled in.
- Returns:
- nothing
- */
- void plSplineGetPoint(pl_Spline *s, pl_Float frame, pl_Float *out);
- /******************************************************************************
- ** 8xX Bitmapped Text
- ******************************************************************************/
- /*
- plTextSetFont() sets the font to be used by the plText*() functions.
- Parameters:
- font: a pointer to a 8xX bitmapped font
- height: the height of the font (X)
- Returns:
- nothing
- */
- void plTextSetFont(pl_uChar *font, pl_uChar height);
- /*
- plTextPutChar() puts a character to a camera
- Parameters:
- cam: The camera. If the camera has a zBuffer, it will be used.
- x: the x screen position of the left of the text
- y: the y screen position of the top of the text
- z: the depth of the text (used when cam->zBuffer is set)
- color: the color to make the text
- c: the character to put. Special characters such as '\n' aren't handled.
- Returns:
- nothing
- */
- void plTextPutChar(pl_Cam *cam, pl_sInt x, pl_sInt y, pl_Float z,
- pl_uChar color, pl_uChar c);
- /*
- plTextPutString() puts an array of characters to a camera
- Parameters:
- cam: The camera. If the camera has a zBuffer, it will be used.
- x: the x screen position of the left of the text
- y: the y screen position of the top of the text
- z: the depth of the text (used when cam->zBuffer is set)
- color: the color to make the text
- string:
- the characters to put. '\n' and '\t' are handled as one would expect
- Returns:
- nothing
- */
- void plTextPutStr(pl_Cam *cam, pl_sInt x, pl_sInt y, pl_Float z,
- pl_uChar color, pl_sChar *string);
- /*
- plTextPrintf() is printf() for graphics
- Parameters:
- cam: The camera. If the camera has a zBuffer, it will be used.
- x: the x screen position of the left of the text
- y: the y screen position of the top of the text
- z: the depth of the text (used when cam->zBuffer is set)
- color: the color to make the text
- format:
- the characters to put, with printf() formatting codes.
- '\n' and '\t' are handled as one would expect
- ...: any additional parameters specified by format
- Returns:
- nothing
- */
- void plTextPrintf(pl_Cam *cam, pl_sInt x, pl_sInt y, pl_Float z,
- pl_uChar color, pl_sChar *format, ...);
- /******************************************************************************
- ** Built-in Rasterizers
- ******************************************************************************/
- void plPF_SolidF(pl_Cam *, pl_Face *);
- void plPF_SolidG(pl_Cam *, pl_Face *);
- void plPF_TexF(pl_Cam *, pl_Face *);
- void plPF_TexG(pl_Cam *, pl_Face *);
- void plPF_TexEnv(pl_Cam *, pl_Face *);
- void plPF_PTexF(pl_Cam *, pl_Face *);
- void plPF_PTexG(pl_Cam *, pl_Face *);
- void plPF_TransF(pl_Cam *, pl_Face *);
- void plPF_TransG(pl_Cam *, pl_Face *);
- #ifdef __cplusplus
- }
- #endif
- #endif /* !_PLUSH_H_ */
|