aboutsummaryrefslogtreecommitdiff
path: root/Src/Winamp/plush/PLUSH.H
diff options
context:
space:
mode:
Diffstat (limited to 'Src/Winamp/plush/PLUSH.H')
-rw-r--r--Src/Winamp/plush/PLUSH.H720
1 files changed, 720 insertions, 0 deletions
diff --git a/Src/Winamp/plush/PLUSH.H b/Src/Winamp/plush/PLUSH.H
new file mode 100644
index 00000000..6d68e8c0
--- /dev/null
+++ b/Src/Winamp/plush/PLUSH.H
@@ -0,0 +1,720 @@
+/******************************************************************************
+ 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
+ justin@nullsoft.com
+
+******************************************************************************/
+
+#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_ */