721 lines
21 KiB
C++
721 lines
21 KiB
C++
|
/******************************************************************************
|
||
|
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_ */
|