Initial community commit

This commit is contained in:
Jef 2024-09-24 14:54:57 +02:00
parent 537bcbc862
commit fc06254474
16440 changed files with 4239995 additions and 2 deletions

52
Src/Winamp/plush/CAM.C Normal file
View file

@ -0,0 +1,52 @@
/******************************************************************************
Plush Version 1.2
cam.c
Camera Control
Copyright (c) 1996-2000, Justin Frankel
******************************************************************************/
#include "plush.h"
void plCamDelete(pl_Cam *c) {
if (c) free(c);
}
void plCamSetTarget(pl_Cam *c, pl_Float x, pl_Float y, pl_Float z) {
double dx, dy, dz;
dx = x - c->X;
dy = y - c->Y;
dz = z - c->Z;
c->Roll = 0;
if (dz > 0.0001f) {
c->Pan = (pl_Float) (-atan(dx/dz)*(180.0/PL_PI));
dz /= cos(c->Pan*(PL_PI/180.0));
c->Pitch = (pl_Float) (atan(dy/dz)*(180.0/PL_PI));
} else if (dz < -0.0001f) {
c->Pan = (pl_Float) (180.0-atan(dx/dz)*(180.0/PL_PI));
dz /= cos((c->Pan-180.0f)*(PL_PI/180.0));
c->Pitch = (pl_Float) (-atan(dy/dz)*(180.0/PL_PI));
} else {
c->Pan = 0.0f;
c->Pitch = -90.0f;
}
}
pl_Cam *plCamCreate(pl_uInt sw, pl_uInt sh, pl_Float ar, pl_Float fov,
pl_uChar *fb, pl_ZBuffer *zb) {
pl_Cam *c;
c = malloc(sizeof(pl_Cam));
if (!c) return 0;
memset(c,0,sizeof(pl_Cam));
c->Fov = fov;
c->AspectRatio = ar;
c->ClipRight = c->ScreenWidth = sw;
c->ClipBottom = c->ScreenHeight = sh;
c->CenterX = sw>>1;
c->CenterY = sh>>1;
c->ClipBack = 8.0e30f;
c->frameBuffer = fb;
c->zBuffer = zb;
c->Sort = 1;
if (zb) c->Sort = 0;
return (c);
}

255
Src/Winamp/plush/CLIP.C Normal file
View file

@ -0,0 +1,255 @@
/******************************************************************************
Plush Version 1.2
clip.c
3D Frustum Clipping
Copyright (c) 1996-2000, Justin Frankel
******************************************************************************/
#include "plush.h"
#define NUM_CLIP_PLANES 5
typedef struct
{
pl_Vertex newVertices[8];
double Shades[8];
double MappingU[8];
double MappingV[8];
double eMappingU[8];
double eMappingV[8];
} _clipInfo;
static _clipInfo m_cl[2];
static double m_clipPlanes[NUM_CLIP_PLANES][4];
static pl_Cam *m_cam;
static pl_sInt32 m_cx, m_cy;
static double m_fov;
static double m_adj_asp;
static void _FindNormal(double x2, double x3,
double y2, double y3,
double zv,
double *res);
/* Returns: 0 if nothing gets in, 1 or 2 if pout1 & pout2 get in */
static pl_uInt _ClipToPlane(pl_uInt numVerts, double *plane);
void plClipSetFrustum(pl_Cam *cam) {
m_adj_asp = 1.0 / cam->AspectRatio;
m_fov = plMin(plMax(cam->Fov,1.0),179.0);
m_fov = (1.0/tan(m_fov*(PL_PI/360.0)))*(double) (cam->ClipRight-cam->ClipLeft);
m_cx = cam->CenterX<<20;
m_cy = cam->CenterY<<20;
m_cam = cam;
memset(m_clipPlanes,0,sizeof(m_clipPlanes));
/* Back */
m_clipPlanes[0][2] = -1.0;
m_clipPlanes[0][3] = -cam->ClipBack;
/* Left */
m_clipPlanes[1][3] = 0.00000001;
if (cam->ClipLeft == cam->CenterX) {
m_clipPlanes[1][0] = 1.0;
}
else _FindNormal(-100,-100,
100, -100,
m_fov*-100.0/(cam->ClipLeft-cam->CenterX),
m_clipPlanes[1]);
if (cam->ClipLeft > cam->CenterX) {
m_clipPlanes[1][0] = -m_clipPlanes[1][0];
m_clipPlanes[1][1] = -m_clipPlanes[1][1];
m_clipPlanes[1][2] = -m_clipPlanes[1][2];
}
/* Right */
m_clipPlanes[2][3] = 0.00000001;
if (cam->ClipRight == cam->CenterX) {
m_clipPlanes[2][0] = -1.0;
}
else _FindNormal(100,100,
-100, 100,
m_fov*100.0/(cam->ClipRight-cam->CenterX),
m_clipPlanes[2]);
if (cam->ClipRight < cam->CenterX) {
m_clipPlanes[2][0] = -m_clipPlanes[2][0];
m_clipPlanes[2][1] = -m_clipPlanes[2][1];
m_clipPlanes[2][2] = -m_clipPlanes[2][2];
}
/* Top */
m_clipPlanes[3][3] = 0.00000001;
if (cam->ClipTop == cam->CenterY) {
m_clipPlanes[3][1] = -1.0;
} else _FindNormal(100, -100,
100, 100,
m_fov*m_adj_asp*100.0/(cam->CenterY-cam->ClipTop),
m_clipPlanes[3]);
if (cam->ClipTop > cam->CenterY) {
m_clipPlanes[3][0] = -m_clipPlanes[3][0];
m_clipPlanes[3][1] = -m_clipPlanes[3][1];
m_clipPlanes[3][2] = -m_clipPlanes[3][2];
}
/* Bottom */
m_clipPlanes[4][3] = 0.00000001;
if (cam->ClipBottom == cam->CenterY) {
m_clipPlanes[4][1] = 1.0;
} else _FindNormal(-100, 100,
-100, -100,
m_fov*m_adj_asp*-100.0/(cam->CenterY-cam->ClipBottom),
m_clipPlanes[4]);
if (cam->ClipBottom < cam->CenterY) {
m_clipPlanes[4][0] = -m_clipPlanes[4][0];
m_clipPlanes[4][1] = -m_clipPlanes[4][1];
m_clipPlanes[4][2] = -m_clipPlanes[4][2];
}
}
void plClipRenderFace(pl_Face *face) {
pl_uInt k, a, w, numVerts, q;
double tmp, tmp2;
pl_Face newface;
for (a = 0; a < 3; a ++) {
m_cl[0].newVertices[a] = *(face->Vertices[a]);
m_cl[0].Shades[a] = face->Shades[a];
m_cl[0].MappingU[a] = face->MappingU[a];
m_cl[0].MappingV[a] = face->MappingV[a];
m_cl[0].eMappingU[a] = face->eMappingU[a];
m_cl[0].eMappingV[a] = face->eMappingV[a];
}
numVerts = 3;
q = 0;
a = (m_clipPlanes[0][3] < 0.0 ? 0 : 1);
while (a < NUM_CLIP_PLANES && numVerts > 2)
{
numVerts = _ClipToPlane(numVerts, m_clipPlanes[a]);
memcpy(&m_cl[0],&m_cl[1],sizeof(m_cl)/2);
a++;
}
if (numVerts > 2) {
memcpy(&newface,face,sizeof(pl_Face));
for (k = 2; k < numVerts; k ++) {
newface.fShade = plMax(0,plMin(face->fShade,1));
for (a = 0; a < 3; a ++) {
if (a == 0) w = 0;
else w = a+(k-2);
newface.Vertices[a] = m_cl[0].newVertices+w;
newface.Shades[a] = (pl_Float) m_cl[0].Shades[w];
newface.MappingU[a] = (pl_sInt32)m_cl[0].MappingU[w];
newface.MappingV[a] = (pl_sInt32)m_cl[0].MappingV[w];
newface.eMappingU[a] = (pl_sInt32)m_cl[0].eMappingU[w];
newface.eMappingV[a] = (pl_sInt32)m_cl[0].eMappingV[w];
newface.Scrz[a] = 1.0f/newface.Vertices[a]->xformedz;
tmp2 = m_fov * newface.Scrz[a];
tmp = tmp2*newface.Vertices[a]->xformedx;
tmp2 *= newface.Vertices[a]->xformedy;
newface.Scrx[a] = m_cx + ((pl_sInt32)((tmp*(float) (1<<20))));
newface.Scry[a] = m_cy - ((pl_sInt32)((tmp2*m_adj_asp*(float) (1<<20))));
}
newface.Material->_PutFace(m_cam,&newface);
plRender_TriStats[3] ++;
}
plRender_TriStats[2] ++;
}
}
pl_sInt plClipNeeded(pl_Face *face) {
double dr,dl,db,dt;
double f;
dr = (m_cam->ClipRight-m_cam->CenterX);
dl = (m_cam->ClipLeft-m_cam->CenterX);
db = (m_cam->ClipBottom-m_cam->CenterY);
dt = (m_cam->ClipTop-m_cam->CenterY);
f = m_fov*m_adj_asp;
return ((m_cam->ClipBack <= 0.0 ||
face->Vertices[0]->xformedz <= m_cam->ClipBack ||
face->Vertices[1]->xformedz <= m_cam->ClipBack ||
face->Vertices[2]->xformedz <= m_cam->ClipBack) &&
(face->Vertices[0]->xformedz >= 0 ||
face->Vertices[1]->xformedz >= 0 ||
face->Vertices[2]->xformedz >= 0) &&
(face->Vertices[0]->xformedx*m_fov<=dr*face->Vertices[0]->xformedz ||
face->Vertices[1]->xformedx*m_fov<=dr*face->Vertices[1]->xformedz ||
face->Vertices[2]->xformedx*m_fov<=dr*face->Vertices[2]->xformedz) &&
(face->Vertices[0]->xformedx*m_fov>=dl*face->Vertices[0]->xformedz ||
face->Vertices[1]->xformedx*m_fov>=dl*face->Vertices[1]->xformedz ||
face->Vertices[2]->xformedx*m_fov>=dl*face->Vertices[2]->xformedz) &&
(face->Vertices[0]->xformedy*f<=db*face->Vertices[0]->xformedz ||
face->Vertices[1]->xformedy*f<=db*face->Vertices[1]->xformedz ||
face->Vertices[2]->xformedy*f<=db*face->Vertices[2]->xformedz) &&
(face->Vertices[0]->xformedy*f>=dt*face->Vertices[0]->xformedz ||
face->Vertices[1]->xformedy*f>=dt*face->Vertices[1]->xformedz ||
face->Vertices[2]->xformedy*f>=dt*face->Vertices[2]->xformedz));
}
static void _FindNormal(double x2, double x3,double y2, double y3,
double zv, double *res) {
res[0] = zv*(y2-y3);
res[1] = zv*(x3-x2);
res[2] = x2*y3 - y2*x3;
}
/* Returns: 0 if nothing gets in, 1 or 2 if pout1 & pout2 get in */
static pl_uInt _ClipToPlane(pl_uInt numVerts, double *plane)
{
pl_uInt i, nextvert, curin, nextin;
double curdot, nextdot, scale;
pl_uInt invert, outvert;
invert = 0;
outvert = 0;
curdot = m_cl[0].newVertices[0].xformedx*plane[0] +
m_cl[0].newVertices[0].xformedy*plane[1] +
m_cl[0].newVertices[0].xformedz*plane[2];
curin = (curdot >= plane[3]);
for (i=0 ; i < numVerts; i++) {
nextvert = (i + 1) % numVerts;
if (curin) {
m_cl[1].Shades[outvert] = m_cl[0].Shades[invert];
m_cl[1].MappingU[outvert] = m_cl[0].MappingU[invert];
m_cl[1].MappingV[outvert] = m_cl[0].MappingV[invert];
m_cl[1].eMappingU[outvert] = m_cl[0].eMappingU[invert];
m_cl[1].eMappingV[outvert] = m_cl[0].eMappingV[invert];
m_cl[1].newVertices[outvert++] = m_cl[0].newVertices[invert];
}
nextdot = m_cl[0].newVertices[nextvert].xformedx*plane[0] +
m_cl[0].newVertices[nextvert].xformedy*plane[1] +
m_cl[0].newVertices[nextvert].xformedz*plane[2];
nextin = (nextdot >= plane[3]);
if (curin != nextin) {
scale = (plane[3] - curdot) / (nextdot - curdot);
m_cl[1].newVertices[outvert].xformedx = (pl_Float) (m_cl[0].newVertices[invert].xformedx +
(m_cl[0].newVertices[nextvert].xformedx - m_cl[0].newVertices[invert].xformedx)
* scale);
m_cl[1].newVertices[outvert].xformedy = (pl_Float) (m_cl[0].newVertices[invert].xformedy +
(m_cl[0].newVertices[nextvert].xformedy - m_cl[0].newVertices[invert].xformedy)
* scale);
m_cl[1].newVertices[outvert].xformedz = (pl_Float) (m_cl[0].newVertices[invert].xformedz +
(m_cl[0].newVertices[nextvert].xformedz - m_cl[0].newVertices[invert].xformedz)
* scale);
m_cl[1].Shades[outvert] = m_cl[0].Shades[invert] +
(m_cl[0].Shades[nextvert] - m_cl[0].Shades[invert]) * scale;
m_cl[1].MappingU[outvert] = m_cl[0].MappingU[invert] +
(m_cl[0].MappingU[nextvert] - m_cl[0].MappingU[invert]) * scale;
m_cl[1].MappingV[outvert] = m_cl[0].MappingV[invert] +
(m_cl[0].MappingV[nextvert] - m_cl[0].MappingV[invert]) * scale;
m_cl[1].eMappingU[outvert] = m_cl[0].eMappingU[invert] +
(m_cl[0].eMappingU[nextvert] - m_cl[0].eMappingU[invert]) * scale;
m_cl[1].eMappingV[outvert] = m_cl[0].eMappingV[invert] +
(m_cl[0].eMappingV[nextvert] - m_cl[0].eMappingV[invert]) * scale;
outvert++;
}
curdot = nextdot;
curin = nextin;
invert++;
}
return outvert;
}

46
Src/Winamp/plush/LIGHT.C Normal file
View file

@ -0,0 +1,46 @@
/******************************************************************************
Plush Version 1.2
light.c
Light Control
Copyright (c) 1996-2000, Justin Frankel
******************************************************************************/
#include "plush.h"
pl_Light *plLightSet(pl_Light *light, pl_uChar mode, pl_Float x, pl_Float y,
pl_Float z, pl_Float intensity, pl_Float halfDist) {
pl_Float m[16], m2[16];
light->Type = mode;
light->Intensity = intensity;
light->HalfDistSquared = halfDist*halfDist;
switch (mode) {
case PL_LIGHT_VECTOR:
plMatrixRotate(m,1,x);
plMatrixRotate(m2,2,y);
plMatrixMultiply(m,m2);
plMatrixRotate(m2,3,z);
plMatrixMultiply(m,m2);
plMatrixApply(m,0.0,0.0,-1.0,&light->Xp, &light->Yp, &light->Zp);
break;
case PL_LIGHT_POINT_ANGLE:
case PL_LIGHT_POINT_DISTANCE:
case PL_LIGHT_POINT:
light->Xp = x;
light->Yp = y;
light->Zp = z;
break;
}
return light;
}
pl_Light *plLightCreate() {
pl_Light *l;
l = malloc(sizeof(pl_Light));
if (!l) return 0;
memset(l,0,sizeof(pl_Light));
return (l);
}
void plLightDelete(pl_Light *l) {
if (l) free(l);
}

480
Src/Winamp/plush/MAKE.C Normal file
View file

@ -0,0 +1,480 @@
/******************************************************************************
Plush Version 1.2
make.c
Object Primitives
Copyright (c) 1996-2000, Justin Frankel
*******************************************************************************
Notes:
Most of these routines are highly unoptimized.
They could all use some work, such as more capable divisions (Box is
most notable), etc... The mapping coordinates are all set up nicely,
though.
******************************************************************************/
#include "plush.h"
pl_Obj *plMakeTorus(pl_Float r1, pl_Float r2, pl_uInt divrot, pl_uInt divrad,
pl_Mat *m) {
pl_Obj *o;
pl_Vertex *v;
pl_Face *f;
pl_uInt x, y;
double ravg, rt, a, da, al, dal;
pl_sInt32 U,V,dU,dV;
if (divrot < 3) divrot = 3;
if (divrad < 3) divrad = 3;
ravg = (r1+r2)*0.5;
rt = (r2-r1)*0.5;
o = plObjCreate(divrad*divrot,divrad*divrot*2);
if (!o) return 0;
v = o->Vertices;
a = 0.0;
da = 2*PL_PI/divrot;
for (y = 0; y < divrot; y ++) {
al = 0.0;
dal = 2*PL_PI/divrad;
for (x = 0; x < divrad; x ++) {
v->x = (pl_Float) (cos((double) a)*(ravg + cos((double) al)*rt));
v->z = (pl_Float) (sin((double) a)*(ravg + cos((double) al)*rt));
v->y = (pl_Float) (sin((double) al)*rt);
v++;
al += dal;
}
a += da;
}
v = o->Vertices;
f = o->Faces;
dV = 65535/divrad;
dU = 65535/divrot;
U = 0;
for (y = 0; y < divrot; y ++) {
V = -32768;
for (x = 0; x < divrad; x ++) {
f->Vertices[0] = v+x+y*divrad;
f->MappingU[0] = U;
f->MappingV[0] = V;
f->Vertices[1] = v+(x+1==divrad?0:x+1)+y*divrad;
f->MappingU[1] = U;
f->MappingV[1] = V+dV;
f->Vertices[2] = v+x+(y+1==divrot?0:(y+1)*divrad);
f->MappingU[2] = U+dU;
f->MappingV[2] = V;
f->Material = m;
f++;
f->Vertices[0] = v+x+(y+1==divrot?0:(y+1)*divrad);
f->MappingU[0] = U+dU;
f->MappingV[0] = V;
f->Vertices[1] = v+(x+1==divrad?0:x+1)+y*divrad;
f->MappingU[1] = U;
f->MappingV[1] = V+dV;
f->Vertices[2] = v+(x+1==divrad?0:x+1)+(y+1==divrot?0:(y+1)*divrad);
f->MappingU[2] = U+dU;
f->MappingV[2] = V+dV;
f->Material = m;
f++;
V += dV;
}
U += dU;
}
plObjCalcNormals(o);
return (o);
}
pl_Obj *plMakeSphere(pl_Float r, pl_uInt divr, pl_uInt divh, pl_Mat *m) {
pl_Obj *o;
pl_Vertex *v;
pl_Face *f;
pl_uInt x, y;
double a, da, yp, ya, yda, yf;
pl_sInt32 U,V,dU,dV;
if (divh < 3) divh = 3;
if (divr < 3) divr = 3;
o = plObjCreate(2+(divh-2)*(divr),2*divr+(divh-3)*divr*2);
if (!o) return 0;
v = o->Vertices;
v->x = v->z = 0.0; v->y = r; v++;
v->x = v->z = 0.0; v->y = -r; v++;
ya = 0.0;
yda = PL_PI/(divh-1);
da = (PL_PI*2.0)/divr;
for (y = 0; y < divh - 2; y ++) {
ya += yda;
yp = cos((double) ya)*r;
yf = sin((double) ya)*r;
a = 0.0;
for (x = 0; x < divr; x ++) {
v->y = (pl_Float) yp;
v->x = (pl_Float) (cos((double) a)*yf);
v->z = (pl_Float) (sin((double) a)*yf);
v++;
a += da;
}
}
f = o->Faces;
v = o->Vertices + 2;
a = 0.0;
U = 0;
dU = 65535/divr;
dV = V = 65535/divh;
for (x = 0; x < divr; x ++) {
f->Vertices[0] = o->Vertices;
f->Vertices[1] = v + (x+1==divr ? 0 : x+1);
f->Vertices[2] = v + x;
f->MappingU[0] = U;
f->MappingV[0] = 0;
f->MappingU[1] = U+dU;
f->MappingV[1] = V;
f->MappingU[2] = U;
f->MappingV[2] = V;
f->Material = m;
f++;
U += dU;
}
da = 1.0/(divr+1);
v = o->Vertices + 2;
for (x = 0; x < (divh-3); x ++) {
U = 0;
for (y = 0; y < divr; y ++) {
f->Vertices[0] = v+y;
f->Vertices[1] = v+divr+(y+1==divr?0:y+1);
f->Vertices[2] = v+y+divr;
f->MappingU[0] = U;
f->MappingV[0] = V;
f->MappingU[1] = U+dU;
f->MappingV[1] = V+dV;
f->MappingU[2] = U;
f->MappingV[2] = V+dV;
f->Material = m; f++;
f->Vertices[0] = v+y;
f->Vertices[1] = v+(y+1==divr?0:y+1);
f->Vertices[2] = v+(y+1==divr?0:y+1)+divr;
f->MappingU[0] = U;
f->MappingV[0] = V;
f->MappingU[1] = U+dU;
f->MappingV[1] = V;
f->MappingU[2] = U+dU;
f->MappingV[2] = V+dV;
f->Material = m; f++;
U += dU;
}
V += dV;
v += divr;
}
v = o->Vertices + o->NumVertices - divr;
U = 0;
for (x = 0; x < divr; x ++) {
f->Vertices[0] = o->Vertices + 1;
f->Vertices[1] = v + x;
f->Vertices[2] = v + (x+1==divr ? 0 : x+1);
f->MappingU[0] = U;
f->MappingV[0] = 65535;
f->MappingU[1] = U;
f->MappingV[1] = V;
f->MappingU[2] = U+dU;
f->MappingV[2] = V;
f->Material = m;
f++;
U += dU;
}
plObjCalcNormals(o);
return (o);
}
pl_Obj *plMakeCylinder(pl_Float r, pl_Float h, pl_uInt divr, pl_Bool captop,
pl_Bool capbottom, pl_Mat *m) {
pl_Obj *o;
pl_Vertex *v, *topverts, *bottomverts, *topcapvert=0, *bottomcapvert=0;
pl_Face *f;
pl_uInt32 i;
double a, da;
if (divr < 3) divr = 3;
o = plObjCreate(divr*2+((divr==3)?0:(captop?1:0)+(capbottom?1:0)),
divr*2+(divr==3 ? (captop ? 1 : 0) + (capbottom ? 1 : 0) :
(captop ? divr : 0) + (capbottom ? divr : 0)));
if (!o) return 0;
a = 0.0;
da = (2.0*PL_PI)/divr;
v = o->Vertices;
topverts = v;
for (i = 0; i < divr; i ++) {
v->y = h/2.0f;
v->x = (pl_Float) (r*cos((double) a));
v->z = (pl_Float)(r*sin(a));
v->xformedx = (pl_Float) (32768.0 + (32768.0*cos((double) a))); // temp
v->xformedy = (pl_Float) (32768.0 + (32768.0*sin((double) a))); // use xf
v++;
a += da;
}
bottomverts = v;
a = 0.0;
for (i = 0; i < divr; i ++) {
v->y = -h/2.0f;
v->x = (pl_Float) (r*cos((double) a));
v->z = (pl_Float) (r*sin(a));
v->xformedx = (pl_Float) (32768.0 + (32768.0*cos((double) a)));
v->xformedy = (pl_Float) (32768.0 + (32768.0*sin((double) a)));
v++; a += da;
}
if (captop && divr != 3) {
topcapvert = v;
v->y = h / 2.0f;
v->x = v->z = 0.0f;
v++;
}
if (capbottom && divr != 3) {
bottomcapvert = v;
v->y = -h / 2.0f;
v->x = v->z = 0.0f;
v++;
}
f = o->Faces;
for (i = 0; i < divr; i ++) {
f->Vertices[0] = bottomverts + i;
f->Vertices[1] = topverts + i;
f->Vertices[2] = bottomverts + (i == divr-1 ? 0 : i+1);
f->MappingV[0] = f->MappingV[2] = 65535; f->MappingV[1] = 0;
f->MappingU[0] = f->MappingU[1] = (i<<16)/divr;
f->MappingU[2] = ((i+1)<<16)/divr;
f->Material = m; f++;
f->Vertices[0] = bottomverts + (i == divr-1 ? 0 : i+1);
f->Vertices[1] = topverts + i;
f->Vertices[2] = topverts + (i == divr-1 ? 0 : i+1);
f->MappingV[1] = f->MappingV[2] = 0; f->MappingV[0] = 65535;
f->MappingU[0] = f->MappingU[2] = ((i+1)<<16)/divr;
f->MappingU[1] = (i<<16)/divr;
f->Material = m; f++;
}
if (captop) {
if (divr == 3) {
f->Vertices[0] = topverts + 0;
f->Vertices[1] = topverts + 2;
f->Vertices[2] = topverts + 1;
f->MappingU[0] = (pl_sInt32) topverts[0].xformedx;
f->MappingV[0] = (pl_sInt32) topverts[0].xformedy;
f->MappingU[1] = (pl_sInt32) topverts[1].xformedx;
f->MappingV[1] = (pl_sInt32) topverts[1].xformedy;
f->MappingU[2] = (pl_sInt32) topverts[2].xformedx;
f->MappingV[2] = (pl_sInt32) topverts[2].xformedy;
f->Material = m; f++;
} else {
for (i = 0; i < divr; i ++) {
f->Vertices[0] = topverts + (i == divr-1 ? 0 : i + 1);
f->Vertices[1] = topverts + i;
f->Vertices[2] = topcapvert;
f->MappingU[0] = (pl_sInt32) topverts[(i==divr-1?0:i+1)].xformedx;
f->MappingV[0] = (pl_sInt32) topverts[(i==divr-1?0:i+1)].xformedy;
f->MappingU[1] = (pl_sInt32) topverts[i].xformedx;
f->MappingV[1] = (pl_sInt32) topverts[i].xformedy;
f->MappingU[2] = f->MappingV[2] = 32768;
f->Material = m; f++;
}
}
}
if (capbottom) {
if (divr == 3) {
f->Vertices[0] = bottomverts + 0;
f->Vertices[1] = bottomverts + 1;
f->Vertices[2] = bottomverts + 2;
f->MappingU[0] = (pl_sInt32) bottomverts[0].xformedx;
f->MappingV[0] = (pl_sInt32) bottomverts[0].xformedy;
f->MappingU[1] = (pl_sInt32) bottomverts[1].xformedx;
f->MappingV[1] = (pl_sInt32) bottomverts[1].xformedy;
f->MappingU[2] = (pl_sInt32) bottomverts[2].xformedx;
f->MappingV[2] = (pl_sInt32) bottomverts[2].xformedy;
f->Material = m; f++;
} else {
for (i = 0; i < divr; i ++) {
f->Vertices[0] = bottomverts + i;
f->Vertices[1] = bottomverts + (i == divr-1 ? 0 : i + 1);
f->Vertices[2] = bottomcapvert;
f->MappingU[0] = (pl_sInt32) bottomverts[i].xformedx;
f->MappingV[0] = (pl_sInt32) bottomverts[i].xformedy;
f->MappingU[1] = (pl_sInt32) bottomverts[(i==divr-1?0:i+1)].xformedx;
f->MappingV[1] = (pl_sInt32) bottomverts[(i==divr-1?0:i+1)].xformedy;
f->MappingU[2] = f->MappingV[2] = 32768;
f->Material = m; f++;
}
}
}
plObjCalcNormals(o);
return (o);
}
pl_Obj *plMakeCone(pl_Float r, pl_Float h, pl_uInt div,
pl_Bool cap, pl_Mat *m) {
pl_Obj *o;
pl_Vertex *v;
pl_Face *f;
pl_uInt32 i;
double a, da;
if (div < 3) div = 3;
o = plObjCreate(div + (div == 3 ? 1 : (cap ? 2 : 1)),
div + (div == 3 ? 1 : (cap ? div : 0)));
if (!o) return 0;
v = o->Vertices;
v->x = v->z = 0; v->y = h/2;
v->xformedx = 1<<15;
v->xformedy = 1<<15;
v++;
a = 0.0;
da = (2.0*PL_PI)/div;
for (i = 1; i <= div; i ++) {
v->y = h/-2.0f;
v->x = (pl_Float) (r*cos((double) a));
v->z = (pl_Float) (r*sin((double) a));
v->xformedx = (pl_Float) (32768.0 + (cos((double) a)*32768.0));
v->xformedy = (pl_Float) (32768.0 + (sin((double) a)*32768.0));
a += da;
v++;
}
if (cap && div != 3) {
v->y = h / -2.0f;
v->x = v->z = 0.0f;
v->xformedx = (pl_Float) (1<<15);
v->xformedy = (pl_Float) (1<<15);
v++;
}
f = o->Faces;
for (i = 1; i <= div; i ++) {
f->Vertices[0] = o->Vertices;
f->Vertices[1] = o->Vertices + (i == div ? 1 : i + 1);
f->Vertices[2] = o->Vertices + i;
f->MappingU[0] = (pl_sInt32) o->Vertices[0].xformedx;
f->MappingV[0] = (pl_sInt32) o->Vertices[0].xformedy;
f->MappingU[1] = (pl_sInt32) o->Vertices[(i==div?1:i+1)].xformedx;
f->MappingV[1] = (pl_sInt32) o->Vertices[(i==div?1:i+1)].xformedy;
f->MappingU[2] = (pl_sInt32) o->Vertices[i].xformedx;
f->MappingV[2] = (pl_sInt32) o->Vertices[i].xformedy;
f->Material = m;
f++;
}
if (cap) {
if (div == 3) {
f->Vertices[0] = o->Vertices + 1;
f->Vertices[1] = o->Vertices + 2;
f->Vertices[2] = o->Vertices + 3;
f->MappingU[0] = (pl_sInt32) o->Vertices[1].xformedx;
f->MappingV[0] = (pl_sInt32) o->Vertices[1].xformedy;
f->MappingU[1] = (pl_sInt32) o->Vertices[2].xformedx;
f->MappingV[1] = (pl_sInt32) o->Vertices[2].xformedy;
f->MappingU[2] = (pl_sInt32) o->Vertices[3].xformedx;
f->MappingV[2] = (pl_sInt32) o->Vertices[3].xformedy;
f->Material = m;
f++;
} else {
for (i = 1; i <= div; i ++) {
f->Vertices[0] = o->Vertices + div + 1;
f->Vertices[1] = o->Vertices + i;
f->Vertices[2] = o->Vertices + (i==div ? 1 : i+1);
f->MappingU[0] = (pl_sInt32) o->Vertices[div+1].xformedx;
f->MappingV[0] = (pl_sInt32) o->Vertices[div+1].xformedy;
f->MappingU[1] = (pl_sInt32) o->Vertices[i].xformedx;
f->MappingV[1] = (pl_sInt32) o->Vertices[i].xformedy;
f->MappingU[2] = (pl_sInt32) o->Vertices[i==div?1:i+1].xformedx;
f->MappingV[2] = (pl_sInt32) o->Vertices[i==div?1:i+1].xformedy;
f->Material = m;
f++;
}
}
}
plObjCalcNormals(o);
return (o);
}
static pl_uChar verts[6*6] = {
0,4,1, 1,4,5, 0,1,2, 3,2,1, 2,3,6, 3,7,6,
6,7,4, 4,7,5, 1,7,3, 7,1,5, 2,6,0, 4,0,6
};
static pl_uChar map[24*2*3] = {
1,0, 1,1, 0,0, 0,0, 1,1, 0,1,
0,0, 1,0, 0,1, 1,1, 0,1, 1,0,
0,0, 1,0, 0,1, 1,0, 1,1, 0,1,
0,0, 1,0, 0,1, 0,1, 1,0, 1,1,
1,0, 0,1, 0,0, 0,1, 1,0, 1,1,
1,0, 1,1, 0,0, 0,1, 0,0, 1,1
};
pl_Obj *plMakeBox(pl_Float w, pl_Float d, pl_Float h, pl_Mat *m) {
pl_uChar *mm = map;
pl_uChar *vv = verts;
pl_Obj *o;
pl_Vertex *v;
pl_Face *f;
pl_uInt x;
o = plObjCreate(8,12);
if (!o) return 0;
v = o->Vertices;
v->x = -w/2; v->y = h/2; v->z = d/2; v++;
v->x = w/2; v->y = h/2; v->z = d/2; v++;
v->x = -w/2; v->y = h/2; v->z = -d/2; v++;
v->x = w/2; v->y = h/2; v->z = -d/2; v++;
v->x = -w/2; v->y = -h/2; v->z = d/2; v++;
v->x = w/2; v->y = -h/2; v->z = d/2; v++;
v->x = -w/2; v->y = -h/2; v->z = -d/2; v++;
v->x = w/2; v->y = -h/2; v->z = -d/2; v++;
f = o->Faces;
for (x = 0; x < 12; x ++) {
f->Vertices[0] = o->Vertices + *vv++;
f->Vertices[1] = o->Vertices + *vv++;
f->Vertices[2] = o->Vertices + *vv++;
f->MappingU[0] = (pl_sInt32) ((double)*mm++ * 65535.0);
f->MappingV[0] = (pl_sInt32) ((double)*mm++ * 65535.0);
f->MappingU[1] = (pl_sInt32) ((double)*mm++ * 65535.0);
f->MappingV[1] = (pl_sInt32) ((double)*mm++ * 65535.0);
f->MappingU[2] = (pl_sInt32) ((double)*mm++ * 65535.0);
f->MappingV[2] = (pl_sInt32) ((double)*mm++ * 65535.0);
f->Material = m;
f++;
}
plObjCalcNormals(o);
return (o);
}
pl_Obj *plMakePlane(pl_Float w, pl_Float d, pl_uInt res, pl_Mat *m) {
pl_Obj *o;
pl_Vertex *v;
pl_Face *f;
pl_uInt x, y;
o = plObjCreate((res+1)*(res+1),res*res*2);
if (!o) return 0;
v = o->Vertices;
for (y = 0; y <= res; y ++) {
for (x = 0; x <= res; x ++) {
v->y = 0;
v->x = ((x*w)/res) - w/2;
v->z = ((y*d)/res) - d/2;
v++;
}
}
f = o->Faces;
for (y = 0; y < res; y ++) {
for (x = 0; x < res; x ++) {
f->Vertices[0] = o->Vertices + x+(y*(res+1));
f->MappingU[0] = (x<<16)/res;
f->MappingV[0] = (y<<16)/res;
f->Vertices[2] = o->Vertices + x+1+(y*(res+1));
f->MappingU[2] = ((x+1)<<16)/res;
f->MappingV[2] = (y<<16)/res;
f->Vertices[1] = o->Vertices + x+((y+1)*(res+1));
f->MappingU[1] = (x<<16)/res;
f->MappingV[1] = ((y+1)<<16)/res;
f->Material = m;
f++;
f->Vertices[0] = o->Vertices + x+((y+1)*(res+1));
f->MappingU[0] = (x<<16)/res;
f->MappingV[0] = ((y+1)<<16)/res;
f->Vertices[2] = o->Vertices + x+1+(y*(res+1));
f->MappingU[2] = ((x+1)<<16)/res;
f->MappingV[2] = (y<<16)/res;
f->Vertices[1] = o->Vertices + x+1+((y+1)*(res+1));
f->MappingU[1] = ((x+1)<<16)/res;
f->MappingV[1] = ((y+1)<<16)/res;
f->Material = m;
f++;
}
}
plObjCalcNormals(o);
return (o);
}

453
Src/Winamp/plush/MAT.C Normal file
View file

@ -0,0 +1,453 @@
/******************************************************************************
Plush Version 1.2
mat.c
Material Control
Copyright (c) 1996-2000, Justin Frankel
******************************************************************************/
#include "plush.h"
static void _plGenerateSinglePalette(pl_Mat *);
static void _plGeneratePhongPalette(pl_Mat *);
static void _plGenerateTextureEnvPalette(pl_Mat *);
static void _plGenerateTexturePalette(pl_Mat *, pl_Texture *);
static void _plGeneratePhongTexturePalette(pl_Mat *, pl_Texture *);
static void _plGeneratePhongTransparentPalette(pl_Mat *m);
static void _plGenerateTransparentPalette(pl_Mat *);
static void _plSetMaterialPutFace(pl_Mat *m);
static void _plMatSetupTransparent(pl_Mat *m, pl_uChar *pal);
pl_Mat *plMatCreate() {
pl_Mat *m;
m = (pl_Mat *) malloc(sizeof(pl_Mat));
if (!m) return 0;
memset(m,0,sizeof(pl_Mat));
m->EnvScaling = 1.0f;
m->TexScaling = 1.0f;
m->Ambient[0] = m->Ambient[1] = m->Ambient[2] = 0;
m->Diffuse[0] = m->Diffuse[1] = m->Diffuse[2] = 128;
m->Specular[0] = m->Specular[1] = m->Specular[2] = 128;
m->Shininess = 4;
m->NumGradients = 32;
m->FadeDist = 1000.0;
m->zBufferable = 1;
return m;
}
void plMatDelete(pl_Mat *m) {
if (m) {
if (m->_ReMapTable) free(m->_ReMapTable);
if (m->_RequestedColors) free(m->_RequestedColors);
if (m->_AddTable) free(m->_AddTable);
free(m);
}
}
void plMatInit(pl_Mat *m) {
if (m->Shininess < 1) m->Shininess = 1;
m->_ft = ((m->Environment ? PL_FILL_ENVIRONMENT : 0) |
(m->Texture ? PL_FILL_TEXTURE : 0));
m->_st = m->ShadeType;
if (m->Transparent) m->_ft = PL_FILL_TRANSPARENT;
if (m->_ft == (PL_FILL_TEXTURE|PL_FILL_ENVIRONMENT))
m->_st = PL_SHADE_NONE;
if (m->_ft == PL_FILL_SOLID) {
if (m->_st == PL_SHADE_NONE) _plGenerateSinglePalette(m);
else _plGeneratePhongPalette(m);
} else if (m->_ft == PL_FILL_TEXTURE) {
if (m->_st == PL_SHADE_NONE)
_plGenerateTexturePalette(m,m->Texture);
else _plGeneratePhongTexturePalette(m,m->Texture);
} else if (m->_ft == PL_FILL_ENVIRONMENT) {
if (m->_st == PL_SHADE_NONE)
_plGenerateTexturePalette(m,m->Environment);
else _plGeneratePhongTexturePalette(m,m->Environment);
} else if (m->_ft == (PL_FILL_ENVIRONMENT|PL_FILL_TEXTURE))
_plGenerateTextureEnvPalette(m);
else if (m->_ft == PL_FILL_TRANSPARENT) {
if (m->_st == PL_SHADE_NONE) _plGenerateTransparentPalette(m);
else _plGeneratePhongTransparentPalette(m);
}
_plSetMaterialPutFace(m);
}
static void _plMatSetupTransparent(pl_Mat *m, pl_uChar *pal) {
pl_uInt x, intensity;
if (m->Transparent)
{
if (m->_AddTable) free(m->_AddTable);
m->_AddTable = (pl_uInt16 *) malloc(256*sizeof(pl_uInt16));
for (x = 0; x < 256; x ++) {
intensity = *pal++;
intensity += *pal++;
intensity += *pal++;
m->_AddTable[x] = ((intensity*(m->_ColorsUsed-m->_tsfact))/768);
}
}
}
void plMatMapToPal(pl_Mat *m, pl_uChar *pal, pl_sInt pstart, pl_sInt pend) {
pl_sInt32 j, r, g, b, bestdiff, r2, g2, b2;
pl_sInt bestpos,k;
pl_uInt32 i;
pl_uChar *p;
if (!m->_RequestedColors) plMatInit(m);
if (!m->_RequestedColors) return;
if (m->_ReMapTable) free(m->_ReMapTable);
m->_ReMapTable = (pl_uChar *) malloc(m->_ColorsUsed);
for (i = 0; i < m->_ColorsUsed; i ++) {
bestdiff = 1000000000;
bestpos = pstart;
r = m->_RequestedColors[i*3];
g = m->_RequestedColors[i*3+1];
b = m->_RequestedColors[i*3+2];
p = pal + pstart*3;
for (k = pstart; k <= (pl_sInt)pend; k ++) {
r2 = p[0] - r;
g2 = p[1] - g;
b2 = p[2] - b;
p += 3;
j = r2*r2+g2*g2+b2*b2;
if (j < bestdiff) {
bestdiff = j;
bestpos = k;
}
}
m->_ReMapTable[i] = bestpos;
}
_plMatSetupTransparent(m,pal);
}
static void _plGenerateSinglePalette(pl_Mat *m) {
m->_ColorsUsed = 1;
if (m->_RequestedColors) free(m->_RequestedColors);
m->_RequestedColors = (pl_uChar *) malloc(3);
m->_RequestedColors[0] = plMin(plMax(m->Ambient[0],0),255);
m->_RequestedColors[1] = plMin(plMax(m->Ambient[1],0),255);
m->_RequestedColors[2] = plMin(plMax(m->Ambient[2],0),255);
}
static void _plGeneratePhongPalette(pl_Mat *m) {
pl_uInt i = m->NumGradients, x;
pl_sInt c;
pl_uChar *pal;
double a, da, ca, cb;
m->_ColorsUsed = m->NumGradients;
if (m->_RequestedColors) free(m->_RequestedColors);
pal = m->_RequestedColors = (pl_uChar *) malloc(m->_ColorsUsed*3);
a = PL_PI/2.0;
if (m->NumGradients > 1) da = -PL_PI/((m->NumGradients-1)<<1);
else da=0.0;
do {
if (m->NumGradients == 1) ca = 1;
else {
ca = cos((double) a);
a += da;
}
cb = pow((double) ca, (double) m->Shininess);
for (x = 0; x < 3; x ++) {
c = (pl_sInt) ((cb*m->Specular[x])+(ca*m->Diffuse[x])+m->Ambient[x]);
*(pal++) = plMax(0,plMin(c,255));
}
} while (--i);
}
static void _plGenerateTextureEnvPalette(pl_Mat *m) {
pl_sInt c;
pl_uInt whichlevel,whichindex;
pl_uChar *texpal, *envpal, *pal;
m->_ColorsUsed = m->Texture->NumColors*m->Environment->NumColors;
if (m->_RequestedColors) free(m->_RequestedColors);
pal = m->_RequestedColors = (pl_uChar *) malloc(m->_ColorsUsed*3);
envpal = m->Environment->PaletteData;
if (m->_AddTable) free(m->_AddTable);
m->_AddTable = (pl_uInt16 *) malloc(m->Environment->NumColors*sizeof(pl_uInt16));
for (whichlevel = 0; whichlevel < m->Environment->NumColors; whichlevel++) {
texpal = m->Texture->PaletteData;
switch (m->TexEnvMode)
{
case PL_TEXENV_MUL: // multiply
for (whichindex = 0; whichindex < m->Texture->NumColors; whichindex++) {
*pal++ = (pl_uChar) (((pl_sInt) (*texpal++) * (pl_sInt) envpal[0])>>8);
*pal++ = (pl_uChar) (((pl_sInt) (*texpal++) * (pl_sInt) envpal[1])>>8);
*pal++ = (pl_uChar) (((pl_sInt) (*texpal++) * (pl_sInt) envpal[2])>>8);
}
break;
case PL_TEXENV_AVG: // average
for (whichindex = 0; whichindex < m->Texture->NumColors; whichindex++) {
*pal++ = (pl_uChar) (((pl_sInt) (*texpal++) + (pl_sInt) envpal[0])>>1);
*pal++ = (pl_uChar) (((pl_sInt) (*texpal++) + (pl_sInt) envpal[1])>>1);
*pal++ = (pl_uChar) (((pl_sInt) (*texpal++) + (pl_sInt) envpal[2])>>1);
}
break;
case PL_TEXENV_TEXMINUSENV: // tex-env
for (whichindex = 0; whichindex < m->Texture->NumColors; whichindex++) {
c = (pl_sInt) (*texpal++) - (pl_sInt) envpal[0]; *pal++ = plMax(0,plMin(255,c));
c = (pl_sInt) (*texpal++) - (pl_sInt) envpal[1]; *pal++ = plMax(0,plMin(255,c));
c = (pl_sInt) (*texpal++) - (pl_sInt) envpal[2]; *pal++ = plMax(0,plMin(255,c));
}
break;
case PL_TEXENV_ENVMINUSTEX: // env-tex
for (whichindex = 0; whichindex < m->Texture->NumColors; whichindex++) {
c = -(pl_sInt) (*texpal++) - (pl_sInt) envpal[0]; *pal++ = plMax(0,plMin(255,c));
c = -(pl_sInt) (*texpal++) - (pl_sInt) envpal[1]; *pal++ = plMax(0,plMin(255,c));
c = -(pl_sInt) (*texpal++) - (pl_sInt) envpal[2]; *pal++ = plMax(0,plMin(255,c));
}
break;
case PL_TEXENV_MIN:
for (whichindex = 0; whichindex < m->Texture->NumColors; whichindex++) {
*pal++ = plMin(texpal[0],envpal[0]);
*pal++ = plMin(texpal[1],envpal[1]);
*pal++ = plMin(texpal[2],envpal[2]);
texpal+=3;
}
break;
case PL_TEXENV_MAX:
break;
for (whichindex = 0; whichindex < m->Texture->NumColors; whichindex++) {
*pal++ = plMax(texpal[0],envpal[0]);
*pal++ = plMax(texpal[1],envpal[1]);
*pal++ = plMax(texpal[2],envpal[2]);
texpal+=3;
}
default: // add
for (whichindex = 0; whichindex < m->Texture->NumColors; whichindex++) {
c = (pl_sInt) (*texpal++) + (pl_sInt) envpal[0]; *pal++ = plMax(0,plMin(255,c));
c = (pl_sInt) (*texpal++) + (pl_sInt) envpal[1]; *pal++ = plMax(0,plMin(255,c));
c = (pl_sInt) (*texpal++) + (pl_sInt) envpal[2]; *pal++ = plMax(0,plMin(255,c));
}
break;
}
envpal += 3;
m->_AddTable[whichlevel] = whichlevel*m->Texture->NumColors;
}
}
static void _plGenerateTexturePalette(pl_Mat *m, pl_Texture *t) {
pl_uChar *ppal, *pal;
pl_sInt c, i, x;
m->_ColorsUsed = t->NumColors;
if (m->_RequestedColors) free(m->_RequestedColors);
pal = m->_RequestedColors = (pl_uChar *) malloc(m->_ColorsUsed*3);
ppal = t->PaletteData;
i = t->NumColors;
do {
for (x = 0; x < 3; x ++) {
c = m->Ambient[x] + *ppal++;
*(pal++) = plMax(0,plMin(c,255));
}
} while (--i);
}
static void _plGeneratePhongTexturePalette(pl_Mat *m, pl_Texture *t) {
double a, ca, da, cb;
pl_uInt16 *addtable;
pl_uChar *ppal, *pal;
pl_sInt c, i, i2, x;
pl_uInt num_shades;
if (t->NumColors) num_shades = (m->NumGradients / t->NumColors);
else num_shades=1;
if (!num_shades) num_shades = 1;
m->_ColorsUsed = num_shades*t->NumColors;
if (m->_RequestedColors) free(m->_RequestedColors);
pal = m->_RequestedColors = (pl_uChar *) malloc(m->_ColorsUsed*3);
a = PL_PI/2.0;
if (num_shades>1) da = (-PL_PI/2.0)/(num_shades-1);
else da=0.0;
i2 = num_shades;
do {
ppal = t->PaletteData;
ca = cos((double) a);
a += da;
cb = pow(ca, (double) m->Shininess);
i = t->NumColors;
do {
for (x = 0; x < 3; x ++) {
c = (pl_sInt) ((cb*m->Specular[x])+(ca*m->Diffuse[x])+m->Ambient[x] + *ppal++);
*(pal++) = plMax(0,plMin(c,255));
}
} while (--i);
} while (--i2);
ca = 0;
if (m->_AddTable) free(m->_AddTable);
m->_AddTable = (pl_uInt16 *) malloc(256*sizeof(pl_uInt16));
addtable = m->_AddTable;
i = 256;
do {
a = sin(ca) * num_shades;
ca += PL_PI/512.0;
*addtable++ = ((pl_sInt) a)*t->NumColors;
} while (--i);
}
static void _plGeneratePhongTransparentPalette(pl_Mat *m) {
m->_tsfact = (pl_sInt) (m->NumGradients*(1.0/(1+m->Transparent)));
_plGeneratePhongPalette(m);
}
static void _plGenerateTransparentPalette(pl_Mat *m) {
m->_tsfact = 0;
_plGeneratePhongPalette(m);
}
static void _plSetMaterialPutFace(pl_Mat *m) {
m->_PutFace = 0;
switch (m->_ft) {
case PL_FILL_TRANSPARENT: switch(m->_st) {
case PL_SHADE_NONE: case PL_SHADE_FLAT:
case PL_SHADE_FLAT_DISTANCE: case PL_SHADE_FLAT_DISTANCE|PL_SHADE_FLAT:
m->_PutFace = plPF_TransF;
break;
case PL_SHADE_GOURAUD: case PL_SHADE_GOURAUD_DISTANCE:
case PL_SHADE_GOURAUD|PL_SHADE_GOURAUD_DISTANCE:
m->_PutFace = plPF_TransG;
break;
}
break;
case PL_FILL_SOLID: switch(m->_st) {
case PL_SHADE_NONE: case PL_SHADE_FLAT:
case PL_SHADE_FLAT_DISTANCE: case PL_SHADE_FLAT_DISTANCE|PL_SHADE_FLAT:
m->_PutFace = plPF_SolidF;
break;
case PL_SHADE_GOURAUD: case PL_SHADE_GOURAUD_DISTANCE:
case PL_SHADE_GOURAUD|PL_SHADE_GOURAUD_DISTANCE:
m->_PutFace = plPF_SolidG;
break;
}
break;
case PL_FILL_ENVIRONMENT:
case PL_FILL_TEXTURE:
if (m->PerspectiveCorrect) switch (m->_st) {
case PL_SHADE_NONE: case PL_SHADE_FLAT:
case PL_SHADE_FLAT_DISTANCE: case PL_SHADE_FLAT_DISTANCE|PL_SHADE_FLAT:
m->_PutFace = plPF_PTexF;
break;
case PL_SHADE_GOURAUD: case PL_SHADE_GOURAUD_DISTANCE:
case PL_SHADE_GOURAUD|PL_SHADE_GOURAUD_DISTANCE:
m->_PutFace = plPF_PTexG;
break;
}
else switch (m->_st) {
case PL_SHADE_NONE: case PL_SHADE_FLAT:
case PL_SHADE_FLAT_DISTANCE: case PL_SHADE_FLAT_DISTANCE|PL_SHADE_FLAT:
m->_PutFace = plPF_TexF;
break;
case PL_SHADE_GOURAUD: case PL_SHADE_GOURAUD_DISTANCE:
case PL_SHADE_GOURAUD|PL_SHADE_GOURAUD_DISTANCE:
m->_PutFace = plPF_TexG;
break;
}
break;
case PL_FILL_TEXTURE|PL_FILL_ENVIRONMENT:
m->_PutFace = plPF_TexEnv;
break;
}
}
typedef struct __ct {
pl_uChar r,g,b;
pl_Bool visited;
struct __ct *next;
} _ct;
static int mdist(_ct *a, _ct *b) {
return ((a->r-b->r)*(a->r-b->r)+(a->g-b->g)*(a->g-b->g)+(a->b-b->b)*(a->b-b->b));
}
void plMatMakeOptPal(pl_uChar *p, pl_sInt pstart,
pl_sInt pend, pl_Mat **materials, pl_sInt nmats) {
pl_uChar *allColors = 0;
pl_sInt numColors = 0, nc, x;
pl_sInt len = pend + 1 - pstart;
pl_sInt32 current, newnext, bestdist, thisdist;
_ct *colorBlock, *best, *cp;
for (x = 0; x < nmats; x ++) {
if (materials[x]) {
if (!materials[x]->_RequestedColors) plMatInit(materials[x]);
if (materials[x]->_RequestedColors) numColors+=materials[x]->_ColorsUsed;
}
}
if (!numColors) return;
allColors=(pl_uChar*)malloc(numColors*3);
numColors=0;
for (x = 0; x < nmats; x ++) {
if (materials[x]) {
if (materials[x]->_RequestedColors)
memcpy(allColors + (numColors*3), materials[x]->_RequestedColors,
materials[x]->_ColorsUsed*3);
numColors += materials[x]->_ColorsUsed;
}
}
if (numColors <= len) {
memcpy(p+pstart*3,allColors,numColors*3);
free(allColors);
return;
}
colorBlock = (_ct *) malloc(sizeof(_ct)*numColors);
for (x = 0; x < numColors; x++) {
colorBlock[x].r = allColors[x*3];
colorBlock[x].g = allColors[x*3+1];
colorBlock[x].b = allColors[x*3+2];
colorBlock[x].visited = 0;
colorBlock[x].next = 0;
}
free(allColors);
/* Build a list, starting at color 0 */
current = 0;
nc = numColors;
do {
newnext = -1;
bestdist = 300000000;
colorBlock[current].visited = 1;
for (x = 0; x < nc; x ++) {
if (!colorBlock[x].visited) {
thisdist = mdist(colorBlock + x, colorBlock + current);
if (thisdist < 5) { colorBlock[x].visited = 1; numColors--; }
else if (thisdist < bestdist) { bestdist = thisdist; newnext = x; }
}
}
if (newnext != -1) {
colorBlock[current].next = colorBlock + newnext;
current = newnext;
}
} while (newnext != -1);
colorBlock[current].next = 0; /* terminate the list */
/* we now have a linked list starting at colorBlock, which is each one and
it's closest neighbor */
while (numColors > len) {
bestdist = mdist(colorBlock,colorBlock->next);
for (best = cp = colorBlock; cp->next; cp = cp->next) {
if (bestdist > (thisdist = mdist(cp,cp->next))) {
best = cp;
bestdist = thisdist;
}
}
best->r = ((int) best->r + (int) best->next->r)>>1;
best->g = ((int) best->g + (int) best->next->g)>>1;
best->b = ((int) best->b + (int) best->next->b)>>1;
best->next = best->next->next;
numColors--;
}
x = pstart*3;
for (cp = colorBlock; cp; cp = cp->next) {
p[x++] = cp->r;
p[x++] = cp->g;
p[x++] = cp->b;
}
free(colorBlock);
}

67
Src/Winamp/plush/MATH.C Normal file
View file

@ -0,0 +1,67 @@
/******************************************************************************
Plush Version 1.2
math.c
Math and Matrix Control
Copyright (c) 1996-2000, Justin Frankel
******************************************************************************/
#include "plush.h"
void plMatrixRotate(pl_Float matrix[], pl_uChar m, pl_Float Deg) {
pl_uChar m1, m2;
double c,s;
double d= Deg * PL_PI / 180.0;
memset(matrix,0,sizeof(pl_Float)*16);
matrix[((m-1)<<2)+m-1] = matrix[15] = 1.0;
m1 = (m % 3);
m2 = ((m1+1) % 3);
c = cos(d); s = sin(d);
matrix[(m1<<2)+m1]=(pl_Float)c; matrix[(m1<<2)+m2]=(pl_Float)s;
matrix[(m2<<2)+m2]=(pl_Float)c; matrix[(m2<<2)+m1]=(pl_Float)-s;
}
void plMatrixTranslate(pl_Float m[], pl_Float x, pl_Float y, pl_Float z) {
memset(m,0,sizeof(pl_Float)*16);
m[0] = m[4+1] = m[8+2] = m[12+3] = 1.0;
m[0+3] = x; m[4+3] = y; m[8+3] = z;
}
void plMatrixMultiply(pl_Float *dest, pl_Float src[]) {
pl_Float temp[16];
pl_uInt i;
memcpy(temp,dest,sizeof(pl_Float)*16);
for (i = 0; i < 16; i += 4) {
*dest++ = src[i+0]*temp[(0<<2)+0]+src[i+1]*temp[(1<<2)+0]+
src[i+2]*temp[(2<<2)+0]+src[i+3]*temp[(3<<2)+0];
*dest++ = src[i+0]*temp[(0<<2)+1]+src[i+1]*temp[(1<<2)+1]+
src[i+2]*temp[(2<<2)+1]+src[i+3]*temp[(3<<2)+1];
*dest++ = src[i+0]*temp[(0<<2)+2]+src[i+1]*temp[(1<<2)+2]+
src[i+2]*temp[(2<<2)+2]+src[i+3]*temp[(3<<2)+2];
*dest++ = src[i+0]*temp[(0<<2)+3]+src[i+1]*temp[(1<<2)+3]+
src[i+2]*temp[(2<<2)+3]+src[i+3]*temp[(3<<2)+3];
}
}
void plMatrixApply(pl_Float *m, pl_Float x, pl_Float y, pl_Float z,
pl_Float *outx, pl_Float *outy, pl_Float *outz) {
*outx = x*m[0] + y*m[1] + z*m[2] + m[3];
*outy = x*m[4] + y*m[5] + z*m[6] + m[7];
*outz = x*m[8] + y*m[9] + z*m[10] + m[11];
}
pl_Float plDotProduct(pl_Float x1, pl_Float y1, pl_Float z1,
pl_Float x2, pl_Float y2, pl_Float z2) {
return ((x1*x2)+(y1*y2)+(z1*z2));
}
void plNormalizeVector(pl_Float *x, pl_Float *y, pl_Float *z) {
double length;
length = (*x)*(*x)+(*y)*(*y)+(*z)*(*z);
if (length > 0.0000000001) {
pl_Float t = (pl_Float)sqrt(length);
*x /= t;
*y /= t;
*z /= t;
} else *x = *y = *z = 0.0;
}

179
Src/Winamp/plush/OBJ.C Normal file
View file

@ -0,0 +1,179 @@
/******************************************************************************
Plush Version 1.2
obj.c
Object control
Copyright (c) 1996-2000, Justin Frankel
******************************************************************************/
#include "plush.h"
pl_Obj *plObjScale(pl_Obj *o, pl_Float s) {
pl_uInt32 i = o->NumVertices;
pl_Vertex *v = o->Vertices;
while (i--) {
v->x *= s; v->y *= s; v->z *= s; v++;
}
for (i = 0; i < PL_MAX_CHILDREN; i ++)
if (o->Children[i]) plObjScale(o->Children[i],s);
return o;
}
pl_Obj *plObjStretch(pl_Obj *o, pl_Float x, pl_Float y, pl_Float z) {
pl_uInt32 i = o->NumVertices;
pl_Vertex *v = o->Vertices;
while (i--) {
v->x *= x; v->y *= y; v->z *= z; v++;
}
for (i = 0; i < PL_MAX_CHILDREN; i ++)
if (o->Children[i]) plObjStretch(o->Children[i],x,y,z);
return o;
}
pl_Obj *plObjTranslate(pl_Obj *o, pl_Float x, pl_Float y, pl_Float z) {
pl_uInt32 i = o->NumVertices;
pl_Vertex *v = o->Vertices;
while (i--) {
v->x += x; v->y += y; v->z += z; v++;
}
return o;
}
pl_Obj *plObjFlipNormals(pl_Obj *o) {
pl_uInt32 i = o->NumVertices;
pl_Vertex *v = o->Vertices;
pl_Face *f = o->Faces;
while (i--) {
v->nx = - v->nx; v->ny = - v->ny; v->nz = - v->nz; v++;
}
i = o->NumFaces;
while (i--) {
f->nx = - f->nx; f->ny = - f->ny; f->nz = - f->nz;
f++;
}
for (i = 0; i < PL_MAX_CHILDREN; i ++)
if (o->Children[i]) plObjFlipNormals(o->Children[i]);
return o;
}
void plObjDelete(pl_Obj *o) {
pl_uInt i;
if (o) {
for (i = 0; i < PL_MAX_CHILDREN; i ++)
if (o->Children[i]) plObjDelete(o->Children[i]);
if (o->Vertices) free(o->Vertices);
if (o->Faces) free(o->Faces);
free(o);
}
}
pl_Obj *plObjCreate(pl_uInt32 nv, pl_uInt32 nf) {
pl_Obj *o;
if (!(o = (pl_Obj *) malloc(sizeof(pl_Obj)))) return 0;
memset(o,0,sizeof(pl_Obj));
o->GenMatrix = 1;
o->BackfaceCull = 1;
o->NumVertices = nv;
o->NumFaces = nf;
if (nv && !(o->Vertices=(pl_Vertex *) malloc(sizeof(pl_Vertex)*nv))) {
free(o);
return 0;
}
if (nf && !(o->Faces = (pl_Face *) malloc(sizeof(pl_Face)*nf))) {
free(o->Vertices);
free(o);
return 0;
}
memset(o->Vertices,0,sizeof(pl_Vertex)*nv);
memset(o->Faces,0,sizeof(pl_Face)*nf);
return o;
}
pl_Obj *plObjClone(pl_Obj *o) {
pl_Face *iff, *of;
pl_uInt32 i;
pl_Obj *out;
if (!(out = plObjCreate(o->NumVertices,o->NumFaces))) return 0;
for (i = 0; i < PL_MAX_CHILDREN; i ++)
if (o->Children[i]) out->Children[i] = plObjClone(o->Children[i]);
out->Xa = o->Xa; out->Ya = o->Ya; out->Za = o->Za;
out->Xp = o->Xp; out->Yp = o->Yp; out->Zp = o->Zp;
out->BackfaceCull = o->BackfaceCull;
out->BackfaceIllumination = o->BackfaceIllumination;
out->GenMatrix = o->GenMatrix;
memcpy(out->Vertices, o->Vertices, sizeof(pl_Vertex) * o->NumVertices);
iff = o->Faces;
of = out->Faces;
i = out->NumFaces;
while (i--) {
of->Vertices[0] = (pl_Vertex *)
out->Vertices + (iff->Vertices[0] - o->Vertices);
of->Vertices[1] = (pl_Vertex *)
out->Vertices + (iff->Vertices[1] - o->Vertices);
of->Vertices[2] = (pl_Vertex *)
out->Vertices + (iff->Vertices[2] - o->Vertices);
of->MappingU[0] = iff->MappingU[0];
of->MappingV[0] = iff->MappingV[0];
of->MappingU[1] = iff->MappingU[1];
of->MappingV[1] = iff->MappingV[1];
of->MappingU[2] = iff->MappingU[2];
of->MappingV[2] = iff->MappingV[2];
of->nx = iff->nx;
of->ny = iff->ny;
of->nz = iff->nz;
of->Material = iff->Material;
of++;
iff++;
}
return out;
}
void plObjSetMat(pl_Obj *o, pl_Mat *m, pl_Bool th) {
pl_sInt32 i = o->NumFaces;
pl_Face *f = o->Faces;
while (i--) (f++)->Material = m;
if (th) for (i = 0; i < PL_MAX_CHILDREN; i++)
if (o->Children[i]) plObjSetMat(o->Children[i],m,th);
}
void plObjCalcNormals(pl_Obj *obj) {
pl_uInt32 i;
pl_Vertex *v = obj->Vertices;
pl_Face *f = obj->Faces;
double x1, x2, y1, y2, z1, z2;
i = obj->NumVertices;
while (i--) {
v->nx = 0.0; v->ny = 0.0; v->nz = 0.0;
v++;
}
i = obj->NumFaces;
while (i--) {
x1 = f->Vertices[0]->x-f->Vertices[1]->x;
x2 = f->Vertices[0]->x-f->Vertices[2]->x;
y1 = f->Vertices[0]->y-f->Vertices[1]->y;
y2 = f->Vertices[0]->y-f->Vertices[2]->y;
z1 = f->Vertices[0]->z-f->Vertices[1]->z;
z2 = f->Vertices[0]->z-f->Vertices[2]->z;
f->nx = (pl_Float) (y1*z2 - z1*y2);
f->ny = (pl_Float) (z1*x2 - x1*z2);
f->nz = (pl_Float) (x1*y2 - y1*x2);
plNormalizeVector(&f->nx, &f->ny, &f->nz);
f->Vertices[0]->nx += f->nx;
f->Vertices[0]->ny += f->ny;
f->Vertices[0]->nz += f->nz;
f->Vertices[1]->nx += f->nx;
f->Vertices[1]->ny += f->ny;
f->Vertices[1]->nz += f->nz;
f->Vertices[2]->nx += f->nx;
f->Vertices[2]->ny += f->ny;
f->Vertices[2]->nz += f->nz;
f++;
}
v = obj->Vertices;
i = obj->NumVertices;
do {
plNormalizeVector(&v->nx, &v->ny, &v->nz);
v++;
} while (--i);
for (i = 0; i < PL_MAX_CHILDREN; i ++)
if (obj->Children[i]) plObjCalcNormals(obj->Children[i]);
}

459
Src/Winamp/plush/PF_PTEX.C Normal file
View file

@ -0,0 +1,459 @@
/******************************************************************************
Plush Version 1.2
pf_ptex.c
Perspective Correct Texture Mapping Rasterizers
Copyright (c) 1996-2000, Justin Frankel
******************************************************************************/
#include "plush.h"
#include "putface.h"
void plPF_PTexF(pl_Cam *cam, pl_Face *TriFace) {
pl_uChar i0, i1, i2;
pl_uChar *gmem = cam->frameBuffer;
pl_uChar *remap = TriFace->Material->_ReMapTable;
pl_ZBuffer *zbuf = cam->zBuffer;
pl_Float MappingU1, MappingU2, MappingU3;
pl_Float MappingV1, MappingV2, MappingV3;
pl_sInt32 MappingU_AND, MappingV_AND;
pl_uChar *texture;
pl_uChar vshift;
pl_uInt16 bc;
pl_Texture *Texture;
pl_sInt32 iShade;
pl_uChar nm, nmb;
pl_sInt n;
pl_Float U1,V1,U2,V2,dU1=0,dU2=0,dV1=0,dV2=0,dUL=0,dVL=0,UL,VL;
pl_sInt32 iUL, iVL, idUL=0, idVL=0, iULnext, iVLnext;
pl_sInt32 scrwidth = cam->ScreenWidth;
pl_sInt32 X1, X2, dX1=0, dX2=0, XL1, Xlen;
pl_ZBuffer Z1, dZ1=0, dZ2=0, Z2, dZL=0, ZL, pZL, pdZL;
pl_sInt32 Y1, Y2, Y0, dY;
pl_uChar stat;
pl_Bool zb = (zbuf&&TriFace->Material->zBufferable) ? 1 : 0;
if (TriFace->Material->Environment) Texture = TriFace->Material->Environment;
else Texture = TriFace->Material->Texture;
if (!Texture) return;
texture = Texture->Data;
iShade = (pl_sInt32)(TriFace->fShade*256.0);
if (iShade < 0) iShade=0;
if (iShade > 255) iShade=255;
if (!TriFace->Material->_AddTable) bc=0;
else bc = TriFace->Material->_AddTable[iShade];
nm = TriFace->Material->PerspectiveCorrect;
nmb = 0; while (nm) { nmb++; nm >>= 1; }
nmb = plMin(6,nmb);
nm = 1<<nmb;
MappingV_AND = ((1<<Texture->Height)-1)<<Texture->Width;
MappingU_AND = (1<<Texture->Width)-1;
vshift = 16 - Texture->Width;
if (TriFace->Material->Environment) {
PUTFACE_SORT_ENV();
} else {
PUTFACE_SORT_TEX();
}
MappingU1 *= TriFace->Scrz[i0]/65536.0f;
MappingV1 *= TriFace->Scrz[i0]/65536.0f;
MappingU2 *= TriFace->Scrz[i1]/65536.0f;
MappingV2 *= TriFace->Scrz[i1]/65536.0f;
MappingU3 *= TriFace->Scrz[i2]/65536.0f;
MappingV3 *= TriFace->Scrz[i2]/65536.0f;
U1 = U2 = MappingU1;
V1 = V2 = MappingV1;
X2 = X1 = TriFace->Scrx[i0];
Z2 = Z1 = TriFace->Scrz[i0];
Y0 = (TriFace->Scry[i0]+(1<<19))>>20;
Y1 = (TriFace->Scry[i1]+(1<<19))>>20;
Y2 = (TriFace->Scry[i2]+(1<<19))>>20;
dY = Y2-Y0;
if (dY) {
dX2 = (TriFace->Scrx[i2] - X1) / dY;
dZ2 = (TriFace->Scrz[i2] - Z1) / dY;
dU2 = (MappingU3 - U1) / dY;
dV2 = (MappingV3 - V1) / dY;
}
dY = Y1-Y0;
if (dY) {
dX1 = (TriFace->Scrx[i1] - X1) / dY;
dZ1 = (TriFace->Scrz[i1] - Z1) / dY;
dU1 = (MappingU2 - U1) / dY;
dV1 = (MappingV2 - V1) / dY;
if (dX2 < dX1) {
XL1 = dX2; dX2 = dX1; dX1 = XL1;
dUL = dU1; dU1 = dU2; dU2 = dUL;
dVL = dV1; dV1 = dV2; dV2 = dVL;
dZL = dZ1; dZ1 = dZ2; dZ2 = dZL;
stat = 2;
} else stat = 1;
} else {
if (TriFace->Scrx[i1] > X1) {
X2 = TriFace->Scrx[i1];
Z2 = TriFace->Scrz[i1];
U2 = MappingU2;
V2 = MappingV2;
stat = 2|4;
} else {
X1 = TriFace->Scrx[i1];
Z1 = TriFace->Scrz[i1];
U1 = MappingU2;
V1 = MappingV2;
stat = 1|8;
}
}
gmem += (Y0 * cam->ScreenWidth);
zbuf += (Y0 * cam->ScreenWidth);
XL1 = ((dX1-dX2)*dY+(1<<19))>>20;
if (XL1) {
dUL = ((dU1-dU2)*dY)/XL1;
dVL = ((dV1-dV2)*dY)/XL1;
dZL = ((dZ1-dZ2)*dY)/XL1;
} else {
XL1 = ((X2-X1+(1<<19))>>20);
if (XL1) {
dUL = (U2-U1)/XL1;
dVL = (V2-V1)/XL1;
dZL = (Z2-Z1)/XL1;
}
}
pdZL = dZL * nm;
dUL *= nm;
dVL *= nm;
while (Y0 < Y2) {
if (Y0 == Y1) {
dY = Y2-((TriFace->Scry[i1]+(1<<19))>>20);
if (dY) {
if (stat & 1) {
X1 = TriFace->Scrx[i1];
dX1 = (TriFace->Scrx[i2]-TriFace->Scrx[i1])/dY;
}
if (stat & 2) {
X2 = TriFace->Scrx[i1];
dX2 = (TriFace->Scrx[i2]-TriFace->Scrx[i1])/dY;
}
if (stat & 4) {
X1 = TriFace->Scrx[i0];
dX1 = (TriFace->Scrx[i2]-TriFace->Scrx[i0])/dY;
}
if (stat & 8) {
X2 = TriFace->Scrx[i0];
dX2 = (TriFace->Scrx[i2]-TriFace->Scrx[i0])/dY;
}
dZ1 = (TriFace->Scrz[i2]-Z1)/dY;
dV1 = (MappingV3 - V1) / dY;
dU1 = (MappingU3 - U1) / dY;
}
}
XL1 = (X1+(1<<19))>>20;
Xlen = ((X2+(1<<19))>>20) - XL1;
if (Xlen > 0) {
register pl_Float t;
pZL = ZL = Z1;
UL = U1;
VL = V1;
gmem += XL1;
zbuf += XL1;
XL1 += Xlen-scrwidth;
t = 65536.0f/ZL;
iUL = iULnext = ((pl_sInt32) (UL*t));
iVL = iVLnext = ((pl_sInt32) (VL*t));
do {
UL += dUL;
VL += dVL;
iUL = iULnext;
iVL = iVLnext;
pZL += pdZL;
t = 65536.0f/pZL;
iULnext = ((pl_sInt32) (UL*t));
iVLnext = ((pl_sInt32) (VL*t));
idUL = (iULnext - iUL)>>nmb;
idVL = (iVLnext - iVL)>>nmb;
n = nm;
Xlen -= n;
if (Xlen < 0) n += Xlen;
if (zb) do {
if (*zbuf < ZL) {
*zbuf = ZL;
*gmem = remap[bc + texture[((iUL>>16)&MappingU_AND) +
((iVL>>vshift)&MappingV_AND)]];
}
zbuf++;
gmem++;
ZL += dZL;
iUL += idUL;
iVL += idVL;
} while (--n);
else do {
*gmem++ = remap[bc + texture[((iUL>>16)&MappingU_AND) +
((iVL>>vshift)&MappingV_AND)]];
iUL += idUL;
iVL += idVL;
} while (--n);
} while (Xlen > 0);
gmem -= XL1;
zbuf -= XL1;
} else {
zbuf += cam->ScreenWidth;
gmem += cam->ScreenWidth;
}
Z1 += dZ1;
U1 += dU1;
V1 += dV1;
X1 += dX1;
X2 += dX2;
Y0++;
}
}
void plPF_PTexG(pl_Cam *cam, pl_Face *TriFace) {
pl_uChar i0, i1, i2;
pl_Float MappingU1, MappingU2, MappingU3;
pl_Float MappingV1, MappingV2, MappingV3;
pl_Texture *Texture;
pl_Bool zb = (cam->zBuffer&&TriFace->Material->zBufferable) ? 1 : 0;
pl_uChar nm, nmb;
pl_uInt n;
pl_sInt32 MappingU_AND, MappingV_AND;
pl_uChar vshift;
pl_uChar *texture;
pl_uInt16 *addtable;
pl_uChar *remap = TriFace->Material->_ReMapTable;
pl_sInt32 iUL, iVL, idUL, idVL, iULnext, iVLnext;
pl_Float U2,V2,dU2=0,dV2=0,dUL=0,dVL=0,UL,VL;
pl_sInt32 XL1, Xlen;
pl_sInt32 C2, dC2=0, CL, dCL=0;
pl_Float ZL, Z2, dZ2=0, dZL=0, pdZL, pZL;
pl_sInt32 Y2, dY;
pl_uChar stat;
/* Cache line */
pl_sInt32 Y0,Y1;
pl_sInt32 C1, dC1=0, X2, dX2=0, X1, dX1=0;
/* Cache line */
pl_Float dU1=0, U1, dZ1=0, Z1, V1, dV1=0;
pl_sInt32 scrwidth = cam->ScreenWidth;
pl_uChar *gmem = cam->frameBuffer;
pl_ZBuffer *zbuf = cam->zBuffer;
if (TriFace->Material->Environment) Texture = TriFace->Material->Environment;
else Texture = TriFace->Material->Texture;
if (!Texture) return;
texture = Texture->Data;
addtable = TriFace->Material->_AddTable;
if (!addtable) return;
nm = TriFace->Material->PerspectiveCorrect;
nmb = 0; while (nm) { nmb++; nm >>= 1; }
nmb = plMin(6,nmb);
nm = 1<<nmb;
MappingV_AND = ((1<<Texture->Height)-1)<<Texture->Width;
MappingU_AND = (1<<Texture->Width)-1;
vshift = 16 - Texture->Width;
if (TriFace->Material->Environment) {
PUTFACE_SORT_ENV();
} else {
PUTFACE_SORT_TEX();
}
MappingU1 *= TriFace->Scrz[i0]/65536.0f;
MappingV1 *= TriFace->Scrz[i0]/65536.0f;
MappingU2 *= TriFace->Scrz[i1]/65536.0f;
MappingV2 *= TriFace->Scrz[i1]/65536.0f;
MappingU3 *= TriFace->Scrz[i2]/65536.0f;
MappingV3 *= TriFace->Scrz[i2]/65536.0f;
TriFace->Shades[0] *= 65536.0f;
TriFace->Shades[1] *= 65536.0f;
TriFace->Shades[2] *= 65536.0f;
C1 = C2 = (pl_sInt32) TriFace->Shades[i0];
U1 = U2 = MappingU1;
V1 = V2 = MappingV1;
X2 = X1 = TriFace->Scrx[i0];
Z2 = Z1 = TriFace->Scrz[i0];
Y0 = (TriFace->Scry[i0]+(1<<19))>>20;
Y1 = (TriFace->Scry[i1]+(1<<19))>>20;
Y2 = (TriFace->Scry[i2]+(1<<19))>>20;
dY = Y2-Y0;
if (dY) {
dX2 = (TriFace->Scrx[i2] - X1) / dY;
dZ2 = (TriFace->Scrz[i2] - Z1) / dY;
dC2 = (pl_sInt32) ((TriFace->Shades[i2] - C1) / dY);
dU2 = (MappingU3 - U1) / dY;
dV2 = (MappingV3 - V1) / dY;
}
dY = Y1-Y0;
if (dY) {
dX1 = (TriFace->Scrx[i1] - X1) / dY;
dZ1 = (TriFace->Scrz[i1] - Z1) / dY;
dC1 = (pl_sInt32) ((TriFace->Shades[i1] - C1) / dY);
dU1 = (MappingU2 - U1) / dY;
dV1 = (MappingV2 - V1) / dY;
if (dX2 < dX1) {
dX2 ^= dX1; dX1 ^= dX2; dX2 ^= dX1;
dUL = dU1; dU1 = dU2; dU2 = dUL;
dVL = dV1; dV1 = dV2; dV2 = dVL;
dZL = dZ1; dZ1 = dZ2; dZ2 = dZL;
dCL = dC1; dC1 = dC2; dC2 = dCL;
stat = 2;
} else stat = 1;
} else {
if (TriFace->Scrx[i1] > X1) {
X2 = TriFace->Scrx[i1];
Z2 = TriFace->Scrz[i1];
C2 = (pl_sInt32)TriFace->Shades[i1];
U2 = MappingU2;
V2 = MappingV2;
stat = 2|4;
} else {
X1 = TriFace->Scrx[i1];
Z1 = TriFace->Scrz[i1];
C1 = (pl_sInt32)TriFace->Shades[i1];
U1 = MappingU2;
V1 = MappingV2;
stat = 1|8;
}
}
gmem += (Y0 * scrwidth);
zbuf += (Y0 * scrwidth);
XL1 = (((dX1-dX2)*dY+(1<<19))>>20);
if (XL1) {
dUL = ((dU1-dU2)*dY)/XL1;
dVL = ((dV1-dV2)*dY)/XL1;
dZL = ((dZ1-dZ2)*dY)/XL1;
dCL = ((dC1-dC2)*dY)/XL1;
} else {
XL1 = ((X2-X1+(1<<19))>>20);
if (XL1) {
dUL = (U2-U1)/XL1;
dVL = (V2-V1)/XL1;
dZL = (Z2-Z1)/XL1;
dCL = (C2-C1)/XL1;
}
}
pdZL = dZL * nm;
dUL *= nm;
dVL *= nm;
Y1 -= Y0;
Y0 = Y2-Y0;
while (Y0--) {
if (!Y1--) {
dY = Y2-((TriFace->Scry[i1]+(1<<19))>>20);
if (dY) {
if (stat & 1) {
X1 = TriFace->Scrx[i1];
dX1 = (TriFace->Scrx[i2]-TriFace->Scrx[i1])/dY;
}
if (stat & 2) {
X2 = TriFace->Scrx[i1];
dX2 = (TriFace->Scrx[i2]-TriFace->Scrx[i1])/dY;
}
if (stat & 4) {
X1 = TriFace->Scrx[i0];
dX1 = (TriFace->Scrx[i2]-TriFace->Scrx[i0])/dY;
}
if (stat & 8) {
X2 = TriFace->Scrx[i0];
dX2 = (TriFace->Scrx[i2]-TriFace->Scrx[i0])/dY;
}
dZ1 = (TriFace->Scrz[i2]-Z1)/dY;
dC1 = (pl_sInt32)((TriFace->Shades[i2]-C1)/dY);
dV1 = (MappingV3 - V1) / dY;
dU1 = (MappingU3 - U1) / dY;
}
}
XL1 = (X1+(1<<19))>>20;
Xlen = ((X2+(1<<19))>>20) - XL1;
if (Xlen > 0) {
register pl_Float t;
CL = C1;
pZL = ZL = Z1;
UL = U1;
VL = V1;
gmem += XL1;
zbuf += XL1;
XL1 += Xlen-scrwidth;
t = 65536.0f / ZL;
iUL = iULnext = ((pl_sInt32) (UL*t));
iVL = iVLnext = ((pl_sInt32) (VL*t));
do {
UL += dUL;
VL += dVL;
iUL = iULnext;
iVL = iVLnext;
pZL += pdZL;
t = 65536.0f/pZL;
iULnext = ((pl_sInt32) (UL*t));
iVLnext = ((pl_sInt32) (VL*t));
idUL = (iULnext - iUL)>>nmb;
idVL = (iVLnext - iVL)>>nmb;
n = nm;
Xlen -= n;
if (Xlen < 0) n += Xlen;
if (zb) do {
if (*zbuf < ZL) {
int av;
if (CL < 0) av=addtable[0];
else if (CL > (255<<8)) av=addtable[255];
else av=addtable[CL>>8];
*zbuf = ZL;
*gmem = remap[av +
texture[((iUL>>16)&MappingU_AND) +
((iVL>>vshift)&MappingV_AND)]];
}
zbuf++;
gmem++;
ZL += dZL;
CL += dCL;
iUL += idUL;
iVL += idVL;
} while (--n);
else do {
int av;
if (CL < 0) av=addtable[0];
else if (CL > (255<<8)) av=addtable[255];
else av=addtable[CL>>8];
*gmem++ = remap[av +
texture[((iUL>>16)&MappingU_AND) +
((iVL>>vshift)&MappingV_AND)]];
CL += dCL;
iUL += idUL;
iVL += idVL;
} while (--n);
} while (Xlen > 0);
gmem -= XL1;
zbuf -= XL1;
} else {
zbuf += scrwidth;
gmem += scrwidth;
}
Z1 += dZ1;
U1 += dU1;
V1 += dV1;
X1 += dX1;
X2 += dX2;
C1 += dC1;
}
}

271
Src/Winamp/plush/PF_SOLID.C Normal file
View file

@ -0,0 +1,271 @@
/******************************************************************************
Plush Version 1.2
pf_solid.c
Solid Rasterizers
Copyright (c) 1996-2000, Justin Frankel
******************************************************************************/
#include "plush.h"
#include "putface.h"
void plPF_SolidF(pl_Cam *cam, pl_Face *TriFace) {
pl_uChar i0, i1, i2;
pl_uChar *gmem = cam->frameBuffer;
pl_ZBuffer *zbuf = cam->zBuffer;
pl_sInt32 X1, X2, dX1=0, dX2=0, XL1, XL2;
pl_ZBuffer dZL=0, dZ1=0, dZ2=0, Z1, ZL, Z2, Z3;
pl_sInt32 Y1, Y2, Y0, dY;
pl_uChar stat;
pl_Bool zb = (zbuf&&TriFace->Material->zBufferable) ? 1 : 0;
pl_uChar bc;
pl_sInt32 shade;
PUTFACE_SORT();
shade=(pl_sInt32) (TriFace->fShade*(TriFace->Material->_ColorsUsed-1));
if (shade < 0) shade=0;
if (shade > (pl_sInt32) TriFace->Material->_ColorsUsed-1) shade=TriFace->Material->_ColorsUsed-1;
bc=TriFace->Material->_ReMapTable[shade];
X2 = X1 = TriFace->Scrx[i0];
Z1 = TriFace->Scrz[i0];
Z2 = TriFace->Scrz[i1];
Z3 = TriFace->Scrz[i2];
Y0 = (TriFace->Scry[i0]+(1<<19)) >> 20;
Y1 = (TriFace->Scry[i1]+(1<<19)) >> 20;
Y2 = (TriFace->Scry[i2]+(1<<19)) >> 20;
dY = Y2-Y0;
if (dY) {
dX2 = (TriFace->Scrx[i2] - X1) / dY;
dZ2 = (Z3 - Z1) / dY;
}
dY = Y1-Y0;
if (dY) {
dX1 = (TriFace->Scrx[i1] - X1) / dY;
dZ1 = (Z2 - Z1) / dY;
if (dX2 < dX1) {
dX2 ^= dX1; dX1 ^= dX2; dX2 ^= dX1;
dZL = dZ1; dZ1 = dZ2; dZ2 = dZL;
stat = 2;
} else stat = 1;
Z2 = Z1;
} else {
if (TriFace->Scrx[i1] > X1) {
X2 = TriFace->Scrx[i1];
stat = 2|4;
} else {
X1 = TriFace->Scrx[i1];
ZL = Z1; Z1 = Z2; Z2 = ZL;
stat = 1|8;
}
}
if (zb) {
XL1 = ((dX1-dX2)*dY+(1<<19))>>20;
if (XL1) dZL = ((dZ1-dZ2)*dY)/XL1;
else {
XL1 = (X2-X1+(1<<19))>>20;
if (zb && XL1) dZL = (Z2-Z1)/XL1;
else dZL = 0.0;
}
}
gmem += (Y0 * cam->ScreenWidth);
zbuf += (Y0 * cam->ScreenWidth);
while (Y0 < Y2) {
if (Y0 == Y1) {
dY = Y2 - ((TriFace->Scry[i1]+(1<<19))>>20);
if (dY) {
if (stat & 1) {
X1 = TriFace->Scrx[i1];
dX1 = (TriFace->Scrx[i2]-TriFace->Scrx[i1])/dY;
}
if (stat & 2) {
X2 = TriFace->Scrx[i1];
dX2 = (TriFace->Scrx[i2]-TriFace->Scrx[i1])/dY;
}
if (stat & 4) {
X1 = TriFace->Scrx[i0];
dX1 = (TriFace->Scrx[i2]-TriFace->Scrx[i0])/dY;
}
if (stat & 8) {
X2 = TriFace->Scrx[i0];
dX2 = (TriFace->Scrx[i2]-TriFace->Scrx[i0])/dY;
}
dZ1 = (Z3-Z1)/dY;
}
}
XL1 = (X1+(1<<19))>>20;
XL2 = (X2+(1<<19))>>20;
ZL = Z1;
XL2 -= XL1;
if (XL2 > 0) {
zbuf += XL1;
gmem += XL1;
XL1 += XL2;
if (zb) do {
if (*zbuf < ZL) {
*zbuf = ZL;
*gmem = bc;
}
gmem++;
zbuf++;
ZL += dZL;
} while (--XL2);
else do *gmem++ = bc; while (--XL2);
gmem -= XL1;
zbuf -= XL1;
}
gmem += cam->ScreenWidth;
zbuf += cam->ScreenWidth;
Z1 += dZ1;
X1 += dX1;
X2 += dX2;
Y0++;
}
}
void plPF_SolidG(pl_Cam *cam, pl_Face *TriFace) {
pl_uChar i0, i1, i2;
pl_uChar *gmem = cam->frameBuffer;
pl_uChar *remap = TriFace->Material->_ReMapTable;
pl_ZBuffer *zbuf = cam->zBuffer;
pl_ZBuffer dZL=0, dZ1=0, dZ2=0, Z1, Z2, ZL, Z3;
pl_sInt32 dX1=0, dX2=0, X1, X2, XL1, XL2;
pl_sInt32 C1, C2, dC1=0, dC2=0, dCL=0, CL, C3;
pl_sInt32 Y1, Y2, Y0, dY;
pl_uChar stat;
pl_Bool zb = (zbuf&&TriFace->Material->zBufferable) ? 1 : 0;
pl_Float nc = (TriFace->Material->_ColorsUsed-1)*65536.0f;
pl_sInt32 maxColor=((TriFace->Material->_ColorsUsed-1)<<16);
pl_sInt32 maxColorNonShift=TriFace->Material->_ColorsUsed-1;
PUTFACE_SORT();
C1 = (pl_sInt32) (TriFace->Shades[i0]*nc);
C2 = (pl_sInt32) (TriFace->Shades[i1]*nc);
C3 = (pl_sInt32) (TriFace->Shades[i2]*nc);
X2 = X1 = TriFace->Scrx[i0];
Z1 = TriFace->Scrz[i0];
Z2 = TriFace->Scrz[i1];
Z3 = TriFace->Scrz[i2];
Y0 = (TriFace->Scry[i0]+(1<<19))>>20;
Y1 = (TriFace->Scry[i1]+(1<<19))>>20;
Y2 = (TriFace->Scry[i2]+(1<<19))>>20;
dY = Y2 - Y0;
if (dY) {
dX2 = (TriFace->Scrx[i2] - X1) / dY;
dC2 = (C3 - C1) / dY;
dZ2 = (Z3 - Z1) / dY;
}
dY = Y1 - Y0;
if (dY) {
dX1 = (TriFace->Scrx[i1] - X1) / dY;
dC1 = (C2 - C1) / dY;
dZ1 = (Z2 - Z1) / dY;
if (dX2 < dX1) {
dX2 ^= dX1; dX1 ^= dX2; dX2 ^= dX1;
dC2 ^= dC1; dC1 ^= dC2; dC2 ^= dC1;
dZL = dZ1; dZ1 = dZ2; dZ2 = dZL;
stat = 2;
} else stat = 1;
Z2 = Z1;
C2 = C1;
} else {
if (TriFace->Scrx[i1] > X1) {
X2 = TriFace->Scrx[i1];
stat = 2|4;
} else {
X1 = C1; C1 = C2; C2 = X1;
ZL = Z1; Z1 = Z2; Z2 = ZL;
X1 = TriFace->Scrx[i1];
stat = 1|8;
}
}
gmem += (Y0 * cam->ScreenWidth);
zbuf += (Y0 * cam->ScreenWidth);
XL1 = (((dX1-dX2)*dY+(1<<19))>>20);
if (XL1) {
dCL = ((dC1-dC2)*dY)/XL1;
dZL = ((dZ1-dZ2)*dY)/XL1;
} else {
XL1 = ((X2-X1+(1<<19))>>20);
if (XL1) {
dCL = (C2-C1)/XL1;
dZL = (Z2-Z1)/XL1;
}
}
while (Y0 < Y2) {
if (Y0 == Y1) {
dY = Y2 - ((TriFace->Scry[i1]+(1<<19))>>20);
if (dY) {
dZ1 = (Z3-Z1)/dY;
dC1 = (C3-C1) / dY;
if (stat & 1) {
X1 = TriFace->Scrx[i1];
dX1 = (TriFace->Scrx[i2]-TriFace->Scrx[i1])/dY;
}
if (stat & 2) {
X2 = TriFace->Scrx[i1];
dX2 = (TriFace->Scrx[i2]-TriFace->Scrx[i1])/dY;
}
if (stat & 4) {
X1 = TriFace->Scrx[i0];
dX1 = (TriFace->Scrx[i2]-TriFace->Scrx[i0])/dY;
}
if (stat & 8) {
X2 = TriFace->Scrx[i0];
dX2 = (TriFace->Scrx[i2]-TriFace->Scrx[i0])/dY;
}
}
}
CL = C1;
XL1 = (X1+(1<<19))>>20;
XL2 = (X2+(1<<19))>>20;
ZL = Z1;
XL2 -= XL1;
if (XL2 > 0) {
gmem += XL1;
zbuf += XL1;
XL1 += XL2;
if (zb) do {
if (*zbuf < ZL) {
*zbuf = ZL;
if (CL >= maxColor) *gmem=remap[maxColorNonShift];
else if (CL > 0) *gmem = remap[CL>>16];
else *gmem = remap[0];
}
gmem++;
zbuf++;
ZL += dZL;
CL += dCL;
} while (--XL2);
else do {
if (CL >= maxColor) *gmem++=remap[maxColorNonShift];
else if (CL > 0) *gmem++ = remap[CL>>16];
else *gmem++ = remap[0];
CL += dCL;
} while (--XL2);
gmem -= XL1;
zbuf -= XL1;
}
gmem += cam->ScreenWidth;
zbuf += cam->ScreenWidth;
X1 += dX1;
X2 += dX2;
C1 += dC1;
Z1 += dZ1;
Y0++;
}
}

584
Src/Winamp/plush/PF_TEX.C Normal file
View file

@ -0,0 +1,584 @@
/******************************************************************************
Plush Version 1.2
pf_tex.c
Affine Texture Mapping Rasterizers
Copyright (c) 1996-2000, Justin Frankel
******************************************************************************/
#include "plush.h"
#include "putface.h"
void plPF_TexEnv(pl_Cam *cam, pl_Face *TriFace) {
pl_uChar i0, i1, i2;
pl_uChar *gmem = cam->frameBuffer;
pl_uChar *remap;
pl_ZBuffer *zbuf = cam->zBuffer;
pl_sInt32 MappingU1, MappingU2, MappingU3;
pl_sInt32 MappingV1, MappingV2, MappingV3;
pl_sInt32 MappingU_AND, MappingV_AND;
pl_sInt32 eMappingU1, eMappingU2, eMappingU3;
pl_sInt32 eMappingV1, eMappingV2, eMappingV3;
pl_sInt32 eMappingU_AND, eMappingV_AND;
pl_uChar *texture, *environment;
pl_uChar vshift;
pl_uChar evshift;
pl_uInt16 *addtable;
pl_Texture *Texture, *Environment;
pl_uChar stat;
pl_Bool zb = (zbuf&&TriFace->Material->zBufferable) ? 1 : 0;
pl_sInt32 U1, V1, U2, V2, dU1=0, dU2=0, dV1=0, dV2=0, dUL=0, dVL=0, UL, VL;
pl_sInt32 eU1, eV1, eU2, eV2, edU1=0, edU2=0, edV1=0,
edV2=0, edUL=0, edVL=0, eUL, eVL;
pl_sInt32 X1, X2, dX1=0, dX2=0, XL1, XL2;
pl_Float Z1, ZL, dZ1=0, dZ2=0, dZL=0, Z2;
pl_sInt32 Y1, Y2, Y0, dY;
Environment = TriFace->Material->Environment;
Texture = TriFace->Material->Texture;
if (!Texture || !Environment) return;
texture = Texture->Data;
environment = Environment->Data;
addtable = TriFace->Material->_AddTable;
remap = TriFace->Material->_ReMapTable;
MappingV_AND = ((1<<Texture->Height)-1)<<Texture->Width;
MappingU_AND = (1<<Texture->Width)-1;
vshift = 16 - Texture->Width;
eMappingV_AND = ((1<<Environment->Height)-1)<<Environment->Width;
eMappingU_AND = (1<<Environment->Width)-1;
evshift = 16 - Environment->Width;
PUTFACE_SORT_TEX();
eMappingU1=(pl_sInt32) (TriFace->eMappingU[i0]*Environment->uScale*TriFace->Material->EnvScaling);
eMappingV1=(pl_sInt32) (TriFace->eMappingV[i0]*Environment->vScale*TriFace->Material->EnvScaling);
eMappingU2=(pl_sInt32) (TriFace->eMappingU[i1]*Environment->uScale*TriFace->Material->EnvScaling);
eMappingV2=(pl_sInt32) (TriFace->eMappingV[i1]*Environment->vScale*TriFace->Material->EnvScaling);
eMappingU3=(pl_sInt32) (TriFace->eMappingU[i2]*Environment->uScale*TriFace->Material->EnvScaling);
eMappingV3=(pl_sInt32) (TriFace->eMappingV[i2]*Environment->vScale*TriFace->Material->EnvScaling);
U1 = U2 = MappingU1;
V1 = V2 = MappingV1;
eU1 = eU2 = eMappingU1;
eV1 = eV2 = eMappingV1;
X2 = X1 = TriFace->Scrx[i0];
Z2 = Z1 = TriFace->Scrz[i0];
Y0 = (TriFace->Scry[i0]+(1<<19))>>20;
Y1 = (TriFace->Scry[i1]+(1<<19))>>20;
Y2 = (TriFace->Scry[i2]+(1<<19))>>20;
dY = Y2 - Y0;
if (dY) {
dU2 = (MappingU3 - U1) / dY;
dV2 = (MappingV3 - V1) / dY;
edU2 = (eMappingU3 - eU1) / dY;
edV2 = (eMappingV3 - eV1) / dY;
dX2 = (TriFace->Scrx[i2] - X1) / dY;
dZ2 = (TriFace->Scrz[i2] - Z1) / dY;
}
dY = Y1-Y0;
if (dY) {
dX1 = (TriFace->Scrx[i1] - X1) / dY;
dU1 = (MappingU2 - U1) / dY;
dV1 = (MappingV2 - V1) / dY;
edU1 = (eMappingU2 - eU1) / dY;
edV1 = (eMappingV2 - eV1) / dY;
dZ1 = (TriFace->Scrz[i1] - Z1) / dY;
if (dX2 < dX1) {
dX2 ^= dX1; dX1 ^= dX2; dX2 ^= dX1;
dU2 ^= dU1; dU1 ^= dU2; dU2 ^= dU1;
dV2 ^= dV1; dV1 ^= dV2; dV2 ^= dV1;
edU2 ^= edU1; edU1 ^= edU2; edU2 ^= edU1;
edV2 ^= edV1; edV1 ^= edV2; edV2 ^= edV1;
dZL = dZ1; dZ1 = dZ2; dZ2 = dZL;
stat = 2;
} else stat = 1;
} else {
if (TriFace->Scrx[i1] > X1) {
X2 = TriFace->Scrx[i1];
Z2 = TriFace->Scrz[i1];
U2 = MappingU2;
V2 = MappingV2;
eU2 = eMappingU2;
eV2 = eMappingV2;
stat = 2|4;
} else {
X1 = TriFace->Scrx[i1];
Z1 = TriFace->Scrz[i1];
U1 = MappingU2;
V1 = MappingV2;
eU1 = eMappingU2;
eV1 = eMappingV2;
stat = 1|8;
}
}
gmem += (Y0 * cam->ScreenWidth);
zbuf += (Y0 * cam->ScreenWidth);
XL1 = (((dX1-dX2)*dY+(1<<19))>>20);
if (XL1) {
dUL = ((dU1-dU2)*dY)/XL1;
dVL = ((dV1-dV2)*dY)/XL1;
edUL = ((edU1-edU2)*dY)/XL1;
edVL = ((edV1-edV2)*dY)/XL1;
dZL = ((dZ1-dZ2)*dY)/XL1;
} else {
XL1 = ((X2-X1+(1<<19))>>20);
if (XL1) {
edUL = (eU2-eU1)/XL1;
edVL = (eV2-eV1)/XL1;
dUL = (U2-U1)/XL1;
dVL = (V2-V1)/XL1;
dZL = (Z2-Z1)/XL1;
}
}
while (Y0 < Y2) {
if (Y0 == Y1) {
dY = Y2 - ((TriFace->Scry[i1]+(1<<19))>>20);
if (dY) {
if (stat & 1) {
X1 = TriFace->Scrx[i1];
dX1 = (TriFace->Scrx[i2]-TriFace->Scrx[i1])/dY;
}
if (stat & 2) {
X2 = TriFace->Scrx[i1];
dX2 = (TriFace->Scrx[i2]-TriFace->Scrx[i1])/dY;
}
if (stat & 4) {
X1 = TriFace->Scrx[i0];
dX1 = (TriFace->Scrx[i2]-TriFace->Scrx[i0])/dY;
}
if (stat & 8) {
X2 = TriFace->Scrx[i0];
dX2 = (TriFace->Scrx[i2]-TriFace->Scrx[i0])/dY;
}
dZ1 = (TriFace->Scrz[i2]-Z1)/dY;
dV1 = (MappingV3 - V1) / dY;
dU1 = (MappingU3 - U1) / dY;
edV1 = (eMappingV3 - eV1) / dY;
edU1 = (eMappingU3 - eU1) / dY;
}
}
XL1 = (X1+(1<<19))>>20;
XL2 = (X2+(1<<19))>>20;
ZL = Z1;
UL = U1;
VL = V1;
eUL = eU1;
eVL = eV1;
if ((XL2-XL1) > 0) {
XL2 -= XL1;
gmem += XL1;
zbuf += XL1;
XL1 += XL2;
if (zb) do {
if (*zbuf < ZL) {
*zbuf = ZL;
*gmem = remap[addtable[environment[
((eUL>>16)&eMappingU_AND)+((eVL>>evshift)&eMappingV_AND)]] +
texture[((UL>>16)&MappingU_AND) +
((VL>>vshift)&MappingV_AND)]];
}
zbuf++;
gmem++;
ZL += dZL;
UL += dUL;
VL += dVL;
eUL += edUL;
eVL += edVL;
} while (--XL2);
else do {
*gmem++ = remap[addtable[environment[
((eUL>>16)&eMappingU_AND)+((eVL>>evshift)&eMappingV_AND)]] +
texture[((UL>>16)&MappingU_AND) +
((VL>>vshift)&MappingV_AND)]];
UL += dUL;
VL += dVL;
eUL += edUL;
eVL += edVL;
} while (--XL2);
gmem -= XL1;
zbuf -= XL1;
}
zbuf += cam->ScreenWidth;
gmem += cam->ScreenWidth;
Z1 += dZ1;
X1 += dX1;
X2 += dX2;
U1 += dU1;
V1 += dV1;
eU1 += edU1;
eV1 += edV1;
Y0++;
}
}
void plPF_TexF(pl_Cam *cam, pl_Face *TriFace) {
pl_uChar i0, i1, i2;
pl_uChar *gmem = cam->frameBuffer;
pl_ZBuffer *zbuf = cam->zBuffer;
pl_sInt32 MappingU1, MappingU2, MappingU3;
pl_sInt32 MappingV1, MappingV2, MappingV3;
pl_sInt32 MappingU_AND, MappingV_AND;
pl_uChar *texture;
pl_uChar vshift;
pl_uInt bc;
pl_uChar *remap;
pl_Texture *Texture;
pl_uChar stat;
pl_ZBuffer Z1, ZL, dZ1=0, dZL=0, Z2, dZ2=0;
pl_sInt32 dU1=0, dV1=0, dU2=0, dV2=0, U1, V1, U2, V2;
pl_sInt32 dUL=0, dVL=0, UL, VL;
pl_sInt32 X1, X2, dX1=0, dX2=0, XL1, XL2;
pl_sInt32 Y1, Y2, Y0, dY;
pl_Bool zb = (zbuf&&TriFace->Material->zBufferable) ? 1 : 0;
pl_sInt shade;
if (TriFace->Material->Environment) Texture = TriFace->Material->Environment;
else Texture = TriFace->Material->Texture;
if (!Texture) return;
remap = TriFace->Material->_ReMapTable;
if (TriFace->Material->_AddTable)
{
shade=(pl_sInt)(TriFace->fShade*255.0f);
if (shade < 0) shade=0;
if (shade > 255) shade=255;
bc = TriFace->Material->_AddTable[shade];
}
else bc=0;
texture = Texture->Data;
vshift = 16 - Texture->Width;
MappingV_AND = ((1<<Texture->Height)-1)<<Texture->Width;
MappingU_AND = (1<<Texture->Width)-1;
if (TriFace->Material->Environment) {
PUTFACE_SORT_ENV();
} else {
PUTFACE_SORT_TEX();
}
U1 = U2 = MappingU1;
V1 = V2 = MappingV1;
X2 = X1 = TriFace->Scrx[i0];
Z2 = Z1 = TriFace->Scrz[i0];
Y0 = (TriFace->Scry[i0]+(1<<19))>>20;
Y1 = (TriFace->Scry[i1]+(1<<19))>>20;
Y2 = (TriFace->Scry[i2]+(1<<19))>>20;
dY = Y2 - Y0;
if (dY) {
dX2 = (TriFace->Scrx[i2] - X1) / dY;
dV2 = (MappingV3 - V1) / dY;
dU2 = (MappingU3 - U1) / dY;
dZ2 = (TriFace->Scrz[i2] - Z1) / dY;
}
dY = Y1-Y0;
if (dY) {
dX1 = (TriFace->Scrx[i1] - X1) / dY;
dZ1 = (TriFace->Scrz[i1] - Z1) / dY;
dU1 = (MappingU2 - U1) / dY;
dV1 = (MappingV2 - V1) / dY;
if (dX2 < dX1) {
dX2 ^= dX1; dX1 ^= dX2; dX2 ^= dX1;
dU2 ^= dU1; dU1 ^= dU2; dU2 ^= dU1;
dV2 ^= dV1; dV1 ^= dV2; dV2 ^= dV1;
dZL = dZ1; dZ1 = dZ2; dZ2 = dZL;
stat = 2;
} else stat = 1;
} else {
if (TriFace->Scrx[i1] > X1) {
X2 = TriFace->Scrx[i1];
Z2 = TriFace->Scrz[i1];
U2 = MappingU2;
V2 = MappingV2;
stat = 2|4;
} else {
X1 = TriFace->Scrx[i1];
Z1 = TriFace->Scrz[i1];
U1 = MappingU2;
V1 = MappingV2;
stat = 1|8;
}
}
gmem += (Y0 * cam->ScreenWidth);
zbuf += (Y0 * cam->ScreenWidth);
XL1 = (((dX1-dX2)*dY+(1<<19))>>20);
if (XL1) {
dUL = ((dU1-dU2)*dY)/XL1;
dVL = ((dV1-dV2)*dY)/XL1;
dZL = ((dZ1-dZ2)*dY)/XL1;
} else {
XL1 = ((X2-X1+(1<<19))>>20);
if (XL1) {
dUL = (U2-U1)/XL1;
dVL = (V2-V1)/XL1;
dZL = (Z2-Z1)/XL1;
}
}
while (Y0 < Y2) {
if (Y0 == Y1) {
dY = Y2 - ((TriFace->Scry[i1]+(1<<19))>>20);
if (dY) {
if (stat & 1) {
X1 = TriFace->Scrx[i1];
dX1 = (TriFace->Scrx[i2]-TriFace->Scrx[i1])/dY;
}
if (stat & 2) {
X2 = TriFace->Scrx[i1];
dX2 = (TriFace->Scrx[i2]-TriFace->Scrx[i1])/dY;
}
if (stat & 4) {
X1 = TriFace->Scrx[i0];
dX1 = (TriFace->Scrx[i2]-TriFace->Scrx[i0])/dY;
}
if (stat & 8) {
X2 = TriFace->Scrx[i0];
dX2 = (TriFace->Scrx[i2]-TriFace->Scrx[i0])/dY;
}
dZ1 = (TriFace->Scrz[i2]-Z1) / dY;
dV1 = (MappingV3 - V1) / dY;
dU1 = (MappingU3 - U1) / dY;
}
}
XL1 = (X1+(1<<19))>>20;
XL2 = (X2+(1<<19))>>20;
ZL = Z1;
UL = U1;
VL = V1;
if ((XL2-XL1) > 0) {
XL2 -= XL1;
gmem += XL1;
zbuf += XL1;
XL1 += XL2;
if (zb) do {
if (*zbuf < ZL) {
*zbuf = ZL;
*gmem = remap[bc + texture[((UL >> 16)&MappingU_AND) +
((VL>>vshift)&MappingV_AND)]];
}
zbuf++;
gmem++;
ZL += dZL;
UL += dUL;
VL += dVL;
} while (--XL2);
else do {
*gmem++ = remap[bc + texture[((UL >> 16)&MappingU_AND) +
((VL>>vshift)&MappingV_AND)]];
UL += dUL;
VL += dVL;
} while (--XL2);
gmem -= XL1;
zbuf -= XL1;
}
zbuf += cam->ScreenWidth;
gmem += cam->ScreenWidth;
X1 += dX1;
X2 += dX2;
U1 += dU1;
V1 += dV1;
Z1 += dZ1;
Y0++;
}
}
void plPF_TexG(pl_Cam *cam, pl_Face *TriFace) {
pl_uChar i0, i1, i2;
pl_uChar *gmem = cam->frameBuffer;
pl_ZBuffer *zbuf = cam->zBuffer;
pl_sInt32 MappingU1, MappingU2, MappingU3;
pl_sInt32 MappingV1, MappingV2, MappingV3;
pl_sInt32 MappingU_AND, MappingV_AND;
pl_uChar *texture;
pl_uChar *remap;
pl_uChar vshift;
pl_uInt16 *addtable;
pl_Texture *Texture;
pl_sInt32 U1, V1, U2, V2, dU1=0, dU2=0, dV1=0, dV2=0, dUL=0, dVL=0, UL, VL;
pl_sInt32 X1, X2, dX1=0, dX2=0, XL1, XL2;
pl_sInt32 C1, C2, dC1=0, dC2=0, CL, dCL=0;
pl_ZBuffer Z1, ZL, dZ1=0, dZ2=0, dZL=0, Z2;
pl_sInt32 Y1, Y2, Y0, dY;
pl_uChar stat;
pl_Bool zb = (zbuf&&TriFace->Material->zBufferable) ? 1 : 0;
if (TriFace->Material->Environment) Texture = TriFace->Material->Environment;
else Texture = TriFace->Material->Texture;
if (!Texture) return;
remap = TriFace->Material->_ReMapTable;
texture = Texture->Data;
addtable = TriFace->Material->_AddTable;
vshift = 16 - Texture->Width;
MappingV_AND = ((1<<Texture->Height)-1)<<Texture->Width;
MappingU_AND = (1<<Texture->Width)-1;
if (TriFace->Material->Environment) {
PUTFACE_SORT_ENV();
} else {
PUTFACE_SORT_TEX();
}
C1 = C2 = TriFace->Shades[i0]*65535.0f;
U1 = U2 = MappingU1;
V1 = V2 = MappingV1;
X2 = X1 = TriFace->Scrx[i0];
Z2 = Z1 = TriFace->Scrz[i0];
Y0 = (TriFace->Scry[i0]+(1<<19))>>20;
Y1 = (TriFace->Scry[i1]+(1<<19))>>20;
Y2 = (TriFace->Scry[i2]+(1<<19))>>20;
dY = Y2 - Y0;
if (dY) {
dX2 = (TriFace->Scrx[i2] - X1) / dY;
dZ2 = (TriFace->Scrz[i2] - Z1) / dY;
dC2 = (TriFace->Shades[i2]*65535.0f - C1) / dY;
dU2 = (MappingU3 - U1) / dY;
dV2 = (MappingV3 - V1) / dY;
}
dY = Y1-Y0;
if (dY) {
dX1 = (TriFace->Scrx[i1] - X1) / dY;
dZ1 = (TriFace->Scrz[i1] - Z1) / dY;
dC1 = (TriFace->Shades[i1]*65535.0f - C1) / dY;
dU1 = (MappingU2 - U1) / dY;
dV1 = (MappingV2 - V1) / dY;
if (dX2 < dX1) {
dX2 ^= dX1; dX1 ^= dX2; dX2 ^= dX1;
dU2 ^= dU1; dU1 ^= dU2; dU2 ^= dU1;
dV2 ^= dV1; dV1 ^= dV2; dV2 ^= dV1;
dC2 ^= dC1; dC1 ^= dC2; dC2 ^= dC1;
dZL = dZ1; dZ1 = dZ2; dZ2 = dZL;
stat = 2;
} else stat = 1;
} else {
if (TriFace->Scrx[i1] > X1) {
X2 = TriFace->Scrx[i1];
Z2 = TriFace->Scrz[i1];
C2 = TriFace->Shades[i1]*65535.0f;
U2 = MappingU2;
V2 = MappingV2;
stat = 2|4;
} else {
X1 = TriFace->Scrx[i1];
Z1 = TriFace->Scrz[i1];
C1 = TriFace->Shades[i1]*65535.0f;
U1 = MappingU2;
V1 = MappingV2;
stat = 1|8;
}
}
gmem += (Y0 * cam->ScreenWidth);
zbuf += (Y0 * cam->ScreenWidth);
XL1 = (((dX1-dX2)*dY+(1<<19))>>20);
if (XL1) {
dUL = ((dU1-dU2)*dY)/XL1;
dVL = ((dV1-dV2)*dY)/XL1;
if (zb) dZL = ((dZ1-dZ2)*dY)/XL1;
dCL = ((dC1-dC2)*dY)/XL1;
} else {
XL1 = ((X2-X1+(1<<19))>>20);
if (XL1) {
dUL = (U2-U1)/XL1;
dVL = (V2-V1)/XL1;
if (zb) dZL = (Z2-Z1)/XL1;
dCL = (C2-C1)/(XL1);
}
}
while (Y0 < Y2) {
if (Y0 == Y1) {
dY = Y2 - ((TriFace->Scry[i1]+(1<<19))>>20);
if (dY) {
if (stat & 1) {
X1 = TriFace->Scrx[i1];
dX1 = (TriFace->Scrx[i2]-TriFace->Scrx[i1])/dY;
}
if (stat & 2) {
X2 = TriFace->Scrx[i1];
dX2 = (TriFace->Scrx[i2]-TriFace->Scrx[i1])/dY;
}
if (stat & 4) {
X1 = TriFace->Scrx[i0];
dX1 = (TriFace->Scrx[i2]-TriFace->Scrx[i0])/dY;
}
if (stat & 8) {
X2 = TriFace->Scrx[i0];
dX2 = (TriFace->Scrx[i2]-TriFace->Scrx[i0])/dY;
}
dZ1 = (TriFace->Scrz[i2]-Z1)/dY;
dV1 = (MappingV3 - V1) / dY;
dU1 = (MappingU3 - U1) / dY;
dC1 = (TriFace->Shades[i2]*65535.0f-C1)/dY;
}
}
XL1 = (X1+(1<<19))>>20;
XL2 = (X2+(1<<19))>>20;
CL = C1;
ZL = Z1;
UL = U1;
VL = V1;
if ((XL2-XL1) > 0) {
XL2 -= XL1;
gmem += XL1;
zbuf += XL1;
XL1 += XL2;
if (zb) do {
if (*zbuf < ZL) {
int av;
if (CL < 0) av=addtable[0];
else if (CL > (255<<8)) av=addtable[255];
else av=addtable[CL>>8];
*zbuf = ZL;
*gmem = remap[av +
texture[((UL>>16)&MappingU_AND) +
((VL>>vshift)&MappingV_AND)]];
}
zbuf++;
gmem++;
ZL += dZL;
CL += dCL;
UL += dUL;
VL += dVL;
} while (--XL2);
else do {
int av;
if (CL < 0) av=addtable[0];
else if (CL > (255<<8)) av=addtable[255];
else av=addtable[CL>>8];
*gmem++ = remap[av +
texture[((UL>>16)&MappingU_AND) +
((VL>>vshift)&MappingV_AND)]];
CL += dCL;
UL += dUL;
VL += dVL;
} while (--XL2);
gmem -= XL1;
zbuf -= XL1;
}
zbuf += cam->ScreenWidth;
gmem += cam->ScreenWidth;
Z1 += dZ1;
X1 += dX1;
X2 += dX2;
C1 += dC1;
U1 += dU1;
V1 += dV1;
Y0++;
}
}

263
Src/Winamp/plush/PF_TRANS.C Normal file
View file

@ -0,0 +1,263 @@
/******************************************************************************
Plush Version 1.2
pf_trans.c
Solid Translucent Rasterizers
Copyright (c) 1996-2000, Justin Frankel
******************************************************************************/
#include "plush.h"
#include "putface.h"
void plPF_TransF(pl_Cam *cam, pl_Face *TriFace) {
pl_uChar i0, i1, i2;
pl_uChar *gmem = cam->frameBuffer;
pl_uChar *remap = TriFace->Material->_ReMapTable;
pl_ZBuffer *zbuf = cam->zBuffer;
pl_sInt32 X1, X2, dX1=0, dX2=0, XL1, XL2;
pl_ZBuffer Z1, ZL, dZ1=0, dZL=0, dZ2=0, Z2;
pl_sInt32 Y1, Y2, Y0, dY;
pl_uInt16 *lookuptable = TriFace->Material->_AddTable;
pl_uChar stat;
pl_sInt32 bc = (pl_sInt32) TriFace->fShade*TriFace->Material->_tsfact;
pl_Bool zb = (zbuf&&TriFace->Material->zBufferable) ? 1 : 0;
PUTFACE_SORT();
if (bc < 0) bc=0;
if (bc > (pl_sInt32) TriFace->Material->_tsfact-1) bc=TriFace->Material->_tsfact-1;
remap+=bc;
X2 = X1 = TriFace->Scrx[i0];
Z2 = Z1 = TriFace->Scrz[i0];
Y0 = (TriFace->Scry[i0]+(1<<19))>>20;
Y1 = (TriFace->Scry[i1]+(1<<19))>>20;
Y2 = (TriFace->Scry[i2]+(1<<19))>>20;
dY = Y2 - Y0;
if (dY) {
dX2 = (TriFace->Scrx[i2] - X1) / dY;
dZ2 = (TriFace->Scrz[i2] - Z1) / dY;
}
dY = Y1-Y0;
if (dY) {
dX1 = (TriFace->Scrx[i1] - X1) / dY;
dZ1 = (TriFace->Scrz[i1] - Z1) / dY;
if (dX2 < dX1) {
dX2 ^= dX1; dX1 ^= dX2; dX2 ^= dX1;
dZL = dZ1; dZ1 = dZ2; dZ2 = dZL;
stat = 2;
} else stat = 1;
} else {
if (TriFace->Scrx[i1] > X1) {
X2 = TriFace->Scrx[i1];
Z2 = TriFace->Scrz[i1];
stat= 2|4;
} else {
X1 = TriFace->Scrx[i1];
Z1 = TriFace->Scrz[i1];
stat= 1|8;
}
}
gmem += (Y0 * cam->ScreenWidth);
zbuf += (Y0 * cam->ScreenWidth);
if (zb) {
XL1 = (((dX1-dX2)*dY+(1<<19))>>20);
if (XL1) dZL = ((dZ1-dZ2)*dY)/XL1;
else {
XL1 = ((X2-X1+(1<<19))>>20);
if (XL1) dZL = (Z2-Z1)/XL1;
}
}
while (Y0 < Y2) {
if (Y0 == Y1) {
dY = Y2 - ((TriFace->Scry[i1]+(1<<19))>>20);
if (dY) {
if (stat & 1) {
X1 = TriFace->Scrx[i1];
dX1 = (TriFace->Scrx[i2]-TriFace->Scrx[i1])/dY;
}
if (stat & 2) {
X2 = TriFace->Scrx[i1];
dX2 = (TriFace->Scrx[i2]-TriFace->Scrx[i1])/dY;
}
if (stat & 4) {
X1 = TriFace->Scrx[i0];
dX1 = (TriFace->Scrx[i2]-TriFace->Scrx[i0])/dY;
}
if (stat & 8) {
X2 = TriFace->Scrx[i0];
dX2 = (TriFace->Scrx[i2]-TriFace->Scrx[i0])/dY;
}
dZ1 = (TriFace->Scrz[i2]- Z1)/dY;
}
}
XL1 = (X1+(1<<19))>>20;
XL2 = (X2+(1<<19))>>20;
ZL = Z1;
if ((XL2-XL1) > 0) {
XL2 -= XL1;
zbuf += XL1;
gmem += XL1;
XL1 += XL2;
if (zb) do {
if (*zbuf < ZL) {
*zbuf = ZL;
*gmem = remap[lookuptable[*gmem]];
}
gmem++;
zbuf++;
ZL += dZL;
} while (--XL2);
else do *gmem++ = remap[lookuptable[*gmem]]; while (--XL2);
gmem -= XL1;
zbuf -= XL1;
}
gmem += cam->ScreenWidth;
zbuf += cam->ScreenWidth;
Z1 += dZ1;
X1 += dX1;
X2 += dX2;
Y0 ++;
}
}
void plPF_TransG(pl_Cam *cam, pl_Face *TriFace) {
pl_uChar i0, i1, i2;
pl_uChar *gmem = cam->frameBuffer;
pl_uChar *remap = TriFace->Material->_ReMapTable;
pl_ZBuffer *zbuf = cam->zBuffer;
pl_sInt32 X1, X2, dX1=0, dX2=0, XL1, XL2;
pl_ZBuffer Z1, ZL, dZ1=0, dZL=0, dZ2=0, Z2;
pl_sInt32 dC1=0, dCL=0, CL, C1, C2, dC2=0;
pl_sInt32 Y1, Y2, Y0, dY;
pl_Float nc = (TriFace->Material->_tsfact*65536.0f);
pl_uInt16 *lookuptable = TriFace->Material->_AddTable;
pl_Bool zb = (zbuf&&TriFace->Material->zBufferable) ? 1 : 0;
pl_uChar stat;
pl_sInt32 maxColor=((TriFace->Material->_tsfact-1)<<16);
pl_sInt32 maxColorNonShift=TriFace->Material->_tsfact-1;
PUTFACE_SORT();
C1 = C2 = (pl_sInt32) (TriFace->Shades[i0]*nc);
X2 = X1 = TriFace->Scrx[i0];
Z2 = Z1 = TriFace->Scrz[i0];
Y0 = (TriFace->Scry[i0]+(1<<19))>>20;
Y1 = (TriFace->Scry[i1]+(1<<19))>>20;
Y2 = (TriFace->Scry[i2]+(1<<19))>>20;
dY = Y2 - Y0;
if (dY) {
dX2 = (TriFace->Scrx[i2] - X1) / dY;
dC2 = (pl_sInt32) ((TriFace->Shades[i2]*nc - C1) / dY);
dZ2 = (TriFace->Scrz[i2] - Z1) / dY;
}
dY = Y1-Y0;
if (dY) {
dX1 = (TriFace->Scrx[i1] - X1) / dY;
dZ1 = (TriFace->Scrz[i1] - Z1) / dY;
dC1 = (pl_sInt32) ((TriFace->Shades[i1]*nc - C1) / dY);
if (dX2 < dX1) {
dX2 ^= dX1; dX1 ^= dX2; dX2 ^= dX1;
dC2 ^= dC1; dC1 ^= dC2; dC2 ^= dC1;
dZL = dZ1; dZ1 = dZ2; dZ2 = dZL;
stat = 2;
} else stat = 1;
} else {
if (TriFace->Scrx[i1] > X1) {
X2 = TriFace->Scrx[i1];
Z2 = TriFace->Scrz[i1];
C2 = (pl_sInt32) (TriFace->Shades[i1]*nc);
stat = 2|4;
} else {
X1 = TriFace->Scrx[i1];
Z1 = TriFace->Scrz[i1];
C1 = (pl_sInt32) (TriFace->Shades[i1]*nc);
stat = 1|8;
}
}
gmem += (Y0 * cam->ScreenWidth);
zbuf += (Y0 * cam->ScreenWidth);
XL1 = (((dX1-dX2)*dY+(1<<19))>>20);
if (XL1) {
dCL = ((dC1-dC2)*dY)/XL1;
dZL = ((dZ1-dZ2)*dY)/XL1;
} else {
XL1 = ((X2-X1+(1<<19))>>20);
if (XL1) {
dCL = (C2-C1)/XL1;
dZL = (Z2-Z1)/XL1;
}
}
while (Y0 < Y2) {
if (Y0 == Y1) {
dY = Y2 - ((TriFace->Scry[i1]+(1<<19))>>20);
if (dY) {
if (stat & 1) {
X1 = TriFace->Scrx[i1];
dX1 = (TriFace->Scrx[i2]-TriFace->Scrx[i1])/dY;
}
if (stat & 2) {
X2 = TriFace->Scrx[i1];
dX2 = (TriFace->Scrx[i2]-TriFace->Scrx[i1])/dY;
}
if (stat & 4) {
X1 = TriFace->Scrx[i0];
dX1 = (TriFace->Scrx[i2]-TriFace->Scrx[i0])/dY;
}
if (stat & 8) {
X2 = TriFace->Scrx[i0];
dX2 = (TriFace->Scrx[i2]-TriFace->Scrx[i0])/dY;
}
dZ1 = (TriFace->Scrz[i2]-Z1)/dY;
dC1 = (pl_sInt32) ((TriFace->Shades[i2]*nc - C1) / dY);
}
}
CL = C1;
XL1 = (X1+(1<<19))>>20;
XL2 = (X2+(1<<19))>>20;
ZL = Z1;
if ((XL2-XL1) > 0) {
XL2 -= XL1;
zbuf += XL1;
gmem += XL1;
XL1 += XL2;
if (zb) do {
if (*zbuf < ZL) {
int av;
if (CL >= maxColor) av=maxColorNonShift;
else if (CL > 0) av=CL>>16;
else av=0;
*zbuf = ZL;
*gmem = remap[av + lookuptable[*gmem]];
}
gmem++;
CL += dCL;
zbuf++;
ZL += dZL;
} while (--XL2);
else do {
int av;
if (CL >= maxColor) av=maxColorNonShift;
else if (CL > 0) av=CL>>16;
else av=0;
*gmem++ = remap[av + lookuptable[*gmem]];
CL += dCL;
} while (--XL2);
gmem -= XL1;
zbuf -= XL1;
}
gmem += cam->ScreenWidth;
zbuf += cam->ScreenWidth;
Z1 += dZ1;
X1 += dX1;
X2 += dX2;
C1 += dC1;
Y0++;
}
}

286
Src/Winamp/plush/PLUSH.C Normal file
View file

@ -0,0 +1,286 @@
/******************************************************************************
Plush Version 1.2
plush.c
Misc code and data
Copyright (c) 1996-2000, Justin Frankel
******************************************************************************/
#include "plush.h"
pl_uChar plText_DefaultFont[256*16] = {
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 60, 66, 129, 231, 165, 153, 129, 153, 66, 60, 0, 0, 0, 0,
0, 0, 60, 126, 255, 153, 219, 231, 255, 231, 126, 60, 0, 0, 0, 0,
0, 0, 0, 0, 102, 255, 255, 255, 255, 126, 60, 24, 0, 0, 0, 0,
0, 0, 0, 0, 24, 60, 126, 255, 126, 60, 24, 0, 0, 0, 0, 0,
0, 0, 0, 24, 60, 60, 90, 255, 255, 90, 24, 60, 0, 0, 0, 0,
0, 0, 0, 24, 60, 126, 255, 255, 255, 90, 24, 60, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 24, 60, 60, 24, 0, 0, 0, 0, 0, 0,
255,255,255, 255, 255, 255, 231, 195, 195, 231, 255, 255, 255, 255, 255, 255,
0, 0, 0, 0, 0, 60, 102, 66, 66, 102, 60, 0, 0, 0, 0, 0,
255,255,255, 255, 255, 195, 153, 189, 189, 153, 195, 255, 255, 255, 255, 255,
0, 0, 15, 7, 13, 24, 62, 99, 195, 195, 198, 124, 0, 0, 0, 0,
0, 0, 126, 195, 195, 195, 126, 24, 24, 30, 120, 24, 0, 0, 0, 0,
0, 0, 8, 12, 14, 11, 8, 8, 8, 120, 248, 112, 0, 0, 0, 0,
0, 16, 24, 28, 22, 26, 22, 18, 114, 242, 98, 14, 30, 12, 0, 0,
0, 0, 24, 24, 219, 126, 60, 255, 60, 126, 219, 24, 24, 0, 0, 0,
0, 0, 96, 112, 120, 124, 126, 126, 124, 120, 112, 96, 0, 0, 0, 0,
0, 0, 6, 14, 30, 62, 126, 126, 62, 30, 14, 6, 0, 0, 0, 0,
0, 0, 16, 56, 124, 254, 56, 56, 56, 56, 254, 124, 56, 16, 0, 0,
0, 0, 102, 102, 102, 102, 102, 102, 102, 0, 102, 102, 0, 0, 0, 0,
0, 0, 63, 123, 219, 219, 219, 127, 59, 27, 27, 27, 0, 0, 0, 0,
0, 31, 48, 120, 220, 206, 231, 115, 59, 30, 12, 24, 48, 224, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 126, 126, 126, 126, 0, 0, 0, 0,
0, 0, 16, 56, 124, 254, 56, 56, 56, 254, 124, 56, 16, 0, 254, 0,
0, 0, 16, 56, 124, 254, 56, 56, 56, 56, 56, 56, 56, 56, 0, 0,
0, 0, 56, 56, 56, 56, 56, 56, 56, 56, 254, 124, 56, 16, 0, 0,
0, 0, 0, 0, 0, 8, 12, 254, 255, 254, 12, 8, 0, 0, 0, 0,
0, 0, 0, 0, 0, 16, 48, 127, 255, 127, 48, 16, 0, 0, 0, 0,
0, 0, 204, 102, 51, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 36, 102, 255, 255, 102, 36, 0, 0, 0, 0, 0,
0, 0, 0, 0, 24, 60, 60, 126, 126, 255, 255, 0, 0, 0, 0, 0,
0, 0, 0, 0, 255, 255, 126, 126, 60, 60, 24, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 24, 24, 24, 24, 24, 24, 24, 0, 24, 24, 0, 0, 0, 0,
0, 0, 51, 102, 204, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 51, 51, 255, 102, 102, 102, 102, 255, 204, 204, 0, 0, 0, 0,
0, 24, 126, 219, 216, 120, 28, 30, 27, 219, 219, 126, 24, 0, 0, 0,
0, 0, 96, 209, 179, 102, 12, 24, 54, 109, 203, 6, 0, 0, 0, 0,
0, 0, 28, 54, 102, 60, 56, 108, 199, 198, 110, 59, 0, 0, 0, 0,
0, 0, 12, 24, 48, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 12, 24, 48, 48, 96, 96, 96, 96, 48, 48, 24, 12, 0, 0, 0,
0, 48, 24, 12, 12, 6, 6, 6, 6, 12, 12, 24, 48, 0, 0, 0,
0, 0, 102, 60, 255, 60, 102, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 24, 24, 126, 24, 24, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 24, 48, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 126, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0,
0, 0, 6, 4, 12, 8, 24, 16, 48, 32, 96, 64, 192, 0, 0, 0,
0, 0, 62, 99, 195, 195, 195, 207, 219, 243, 198, 124, 0, 0, 0, 0,
0, 0, 12, 28, 60, 108, 12, 12, 12, 12, 12, 12, 0, 0, 0, 0,
0, 0, 62, 99, 195, 3, 6, 12, 24, 48, 99, 255, 0, 0, 0, 0,
0, 0, 255, 198, 12, 24, 62, 3, 3, 195, 198, 124, 0, 0, 0, 0,
0, 0, 6, 14, 30, 54, 102, 199, 222, 246, 6, 6, 0, 0, 0, 0,
0, 0, 31, 240, 192, 220, 246, 3, 3, 195, 198, 124, 0, 0, 0, 0,
0, 0, 60, 102, 198, 192, 220, 246, 198, 198, 204, 120, 0, 0, 0, 0,
0, 0, 255, 195, 6, 12, 12, 24, 24, 48, 48, 48, 0, 0, 0, 0,
0, 0, 60, 102, 198, 108, 62, 99, 195, 195, 198, 124, 0, 0, 0, 0,
0, 0, 60, 102, 198, 198, 222, 118, 6, 198, 204, 120, 0, 0, 0, 0,
0, 0, 0, 0, 24, 24, 0, 0, 0, 24, 24, 0, 0, 0, 0, 0,
0, 0, 0, 0, 24, 24, 0, 0, 0, 24, 24, 48, 0, 0, 0, 0,
0, 0, 6, 12, 24, 48, 96, 96, 48, 24, 12, 6, 0, 0, 0, 0,
0, 0, 0, 0, 0, 255, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0,
0, 0, 96, 48, 24, 12, 6, 6, 12, 24, 48, 96, 0, 0, 0, 0,
0, 0, 62, 99, 198, 12, 24, 48, 48, 0, 48, 48, 0, 0, 0, 0,
0, 0, 30, 51, 111, 219, 219, 219, 222, 216, 198, 220, 112, 0, 0, 0,
0, 0, 24, 24, 60, 36, 102, 110, 122, 227, 195, 195, 0, 0, 0, 0,
0, 0, 30, 51, 227, 198, 220, 247, 195, 198, 220, 240, 0, 0, 0, 0,
0, 0, 30, 51, 96, 192, 192, 192, 192, 192, 99, 62, 0, 0, 0, 0,
0, 0, 252, 198, 195, 195, 195, 195, 195, 198, 220, 240, 0, 0, 0, 0,
0, 0, 30, 240, 192, 192, 220, 240, 192, 192, 222, 240, 0, 0, 0, 0,
0, 0, 30, 240, 192, 192, 220, 240, 192, 192, 192, 192, 0, 0, 0, 0,
0, 0, 62, 99, 192, 192, 192, 207, 195, 195, 102, 60, 0, 0, 0, 0,
0, 0, 195, 195, 195, 195, 207, 251, 195, 195, 195, 195, 0, 0, 0, 0,
0, 0, 28, 56, 24, 24, 24, 24, 24, 24, 28, 56, 0, 0, 0, 0,
0, 0, 3, 3, 3, 3, 3, 3, 195, 195, 99, 62, 0, 0, 0, 0,
0, 0, 195, 198, 220, 240, 224, 240, 216, 204, 198, 195, 0, 0, 0, 0,
0, 0, 192, 192, 192, 192, 192, 192, 192, 192, 222, 240, 0, 0, 0, 0,
0, 0, 195, 195, 231, 239, 251, 211, 195, 195, 195, 195, 0, 0, 0, 0,
0, 0, 195, 195, 227, 243, 211, 219, 207, 199, 195, 195, 0, 0, 0, 0,
0, 0, 62, 99, 195, 195, 195, 195, 195, 195, 198, 124, 0, 0, 0, 0,
0, 0, 30, 51, 227, 195, 198, 220, 240, 192, 192, 192, 0, 0, 0, 0,
0, 0, 62, 99, 195, 195, 195, 195, 243, 222, 204, 124, 6, 3, 0, 0,
0, 0, 30, 51, 227, 195, 198, 252, 216, 204, 198, 195, 0, 0, 0, 0,
0, 0, 126, 195, 192, 112, 28, 6, 3, 195, 195, 126, 0, 0, 0, 0,
0, 0, 15, 248, 24, 24, 24, 24, 24, 24, 24, 24, 0, 0, 0, 0,
0, 0, 195, 195, 195, 195, 195, 195, 198, 198, 204, 120, 0, 0, 0, 0,
0, 0, 195, 195, 195, 195, 102, 102, 124, 56, 48, 48, 0, 0, 0, 0,
0, 0, 195, 195, 195, 195, 219, 219, 219, 255, 231, 195, 0, 0, 0, 0,
0, 0, 195, 195, 102, 102, 60, 60, 102, 102, 195, 195, 0, 0, 0, 0,
0, 0, 195, 195, 102, 102, 60, 24, 24, 24, 24, 24, 0, 0, 0, 0,
0, 0, 31, 246, 4, 12, 24, 16, 48, 32, 111, 248, 0, 0, 0, 0,
0, 62, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 62, 0, 0, 0,
0, 0, 192, 64, 96, 32, 48, 16, 24, 8, 12, 4, 6, 0, 0, 0,
0, 124, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 124, 0, 0, 0,
0, 24, 60, 102, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0,
0, 0, 48, 24, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 62, 99, 31, 115, 195, 207, 123, 0, 0, 0, 0,
0, 0, 192, 192, 192, 220, 246, 195, 195, 198, 220, 240, 0, 0, 0, 0,
0, 0, 0, 0, 0, 30, 51, 96, 192, 192, 195, 126, 0, 0, 0, 0,
0, 0, 3, 3, 3, 31, 115, 195, 199, 207, 219, 115, 0, 0, 0, 0,
0, 0, 0, 0, 0, 62, 99, 206, 248, 192, 195, 126, 0, 0, 0, 0,
0, 0, 30, 51, 48, 48, 60, 240, 48, 48, 48, 48, 0, 0, 0, 0,
0, 0, 0, 0, 0, 63, 99, 195, 199, 207, 219, 115, 3, 195, 126, 0,
0, 0, 192, 192, 192, 206, 219, 243, 227, 195, 195, 195, 0, 0, 0, 0,
0, 0, 24, 24, 0, 24, 24, 24, 24, 24, 24, 24, 0, 0, 0, 0,
0, 0, 12, 12, 0, 12, 12, 12, 12, 12, 12, 12, 204, 204, 120, 0,
0, 0, 192, 192, 192, 198, 204, 216, 248, 236, 198, 195, 0, 0, 0, 0,
0, 0, 56, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 0, 0, 0,
0, 0, 0, 0, 0, 230, 219, 219, 219, 195, 195, 195, 0, 0, 0, 0,
0, 0, 0, 0, 0, 206, 219, 243, 227, 195, 195, 195, 0, 0, 0, 0,
0, 0, 0, 0, 0, 62, 99, 195, 195, 195, 198, 124, 0, 0, 0, 0,
0, 0, 0, 0, 0, 206, 219, 243, 227, 195, 198, 252, 192, 192, 192, 0,
0, 0, 0, 0, 0, 115, 219, 207, 199, 195, 99, 63, 3, 3, 3, 0,
0, 0, 0, 0, 0, 206, 219, 243, 224, 192, 192, 192, 0, 0, 0, 0,
0, 0, 0, 0, 0, 126, 195, 112, 30, 3, 195, 126, 0, 0, 0, 0,
0, 0, 16, 48, 48, 60, 240, 48, 48, 54, 60, 24, 0, 0, 0, 0,
0, 0, 0, 0, 0, 195, 195, 195, 199, 207, 219, 115, 0, 0, 0, 0,
0, 0, 0, 0, 0, 195, 195, 195, 102, 108, 56, 24, 0, 0, 0, 0,
0, 0, 0, 0, 0, 195, 195, 195, 219, 219, 255, 195, 0, 0, 0, 0,
0, 0, 0, 0, 0, 195, 102, 60, 24, 60, 102, 195, 0, 0, 0, 0,
0, 0, 0, 0, 0, 195, 195, 195, 195, 195, 102, 62, 12, 216, 112, 0,
0, 0, 0, 0, 0, 255, 6, 12, 24, 48, 96, 255, 0, 0, 0, 0,
0, 14, 24, 24, 24, 24, 112, 112, 24, 24, 24, 24, 14, 0, 0, 0,
0, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 0, 0, 0,
0, 112, 24, 24, 24, 24, 14, 14, 24, 24, 24, 24, 112, 0, 0, 0,
0, 0, 0, 0, 0, 0, 118, 220, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 16, 56, 108, 198, 198, 198, 254, 0, 0, 0, 0, 0,
0, 0, 30, 51, 96, 192, 192, 192, 192, 192, 99, 62, 12, 24, 240, 0,
0, 0, 102, 102, 0, 195, 195, 195, 199, 207, 219, 115, 0, 0, 0, 0,
0, 6, 12, 24, 0, 62, 99, 206, 248, 192, 195, 126, 0, 0, 0, 0,
12, 30, 51, 96, 0, 62, 99, 31, 115, 195, 207, 123, 0, 0, 0, 0,
0, 0, 54, 54, 0, 62, 99, 31, 115, 195, 207, 123, 0, 0, 0, 0,
0, 48, 24, 12, 0, 62, 99, 31, 115, 195, 207, 123, 0, 0, 0, 0,
28, 54, 54, 28, 0, 62, 99, 31, 115, 195, 207, 123, 0, 0, 0, 0,
0, 0, 0, 0, 0, 30, 51, 96, 192, 192, 195, 126, 12, 24, 240, 0,
24, 60, 102, 192, 0, 62, 99, 206, 248, 192, 195, 126, 0, 0, 0, 0,
0, 0, 102, 102, 0, 62, 99, 206, 248, 192, 195, 126, 0, 0, 0, 0,
0, 96, 48, 24, 0, 62, 99, 206, 248, 192, 195, 126, 0, 0, 0, 0,
0, 0, 102, 102, 0, 24, 24, 24, 24, 24, 24, 24, 0, 0, 0, 0,
24, 60, 102, 192, 0, 24, 24, 24, 24, 24, 24, 24, 0, 0, 0, 0,
0, 96, 48, 24, 0, 24, 24, 24, 24, 24, 24, 24, 0, 0, 0, 0,
102, 102, 24, 24, 60, 36, 102, 102, 126, 195, 195, 195, 0, 0, 0, 0,
24, 36, 36, 24, 60, 36, 102, 102, 126, 195, 195, 195, 0, 0, 0, 0,
24, 48, 96, 30, 240, 192, 222, 240, 192, 192, 222, 240, 0, 0, 0, 0,
0, 0, 0, 0, 0, 126, 219, 59, 126, 220, 219, 110, 0, 0, 0, 0,
0, 0, 63, 62, 60, 108, 111, 110, 124, 204, 207, 206, 0, 0, 0, 0,
24, 60, 102, 192, 0, 62, 99, 195, 195, 195, 198, 124, 0, 0, 0, 0,
0, 0, 102, 102, 0, 62, 99, 195, 195, 195, 198, 124, 0, 0, 0, 0,
0, 96, 48, 24, 0, 62, 99, 195, 195, 195, 198, 124, 0, 0, 0, 0,
24, 60, 102, 192, 0, 195, 195, 195, 199, 207, 219, 115, 0, 0, 0, 0,
0, 96, 48, 24, 0, 195, 195, 195, 199, 207, 219, 115, 0, 0, 0, 0,
0, 0, 102, 102, 0, 195, 195, 195, 195, 195, 102, 62, 12, 216, 112, 0,
102, 0, 62, 99, 195, 195, 195, 195, 195, 195, 198, 124, 0, 0, 0, 0,
102, 0, 195, 195, 195, 195, 195, 195, 198, 198, 204, 120, 0, 0, 0, 0,
0, 0, 0, 8, 8, 30, 59, 104, 200, 200, 203, 126, 8, 8, 0, 0,
0, 0, 60, 102, 96, 248, 96, 248, 96, 96, 99, 126, 0, 0, 0, 0,
0, 0, 195, 195, 102, 102, 60, 24, 126, 24, 126, 24, 24, 0, 0, 0,
0, 0, 30, 51, 227, 195, 198, 220, 248, 204, 222, 204, 15, 14, 4, 0,
0, 0, 30, 51, 48, 48, 60, 240, 48, 48, 48, 48, 224, 0, 0, 0,
0, 6, 12, 24, 0, 62, 99, 31, 115, 195, 207, 123, 0, 0, 0, 0,
0, 6, 12, 24, 0, 24, 24, 24, 24, 24, 24, 24, 0, 0, 0, 0,
0, 6, 12, 24, 0, 62, 99, 195, 195, 195, 198, 124, 0, 0, 0, 0,
0, 12, 24, 48, 0, 195, 195, 195, 199, 207, 219, 115, 0, 0, 0, 0,
0, 3, 118, 220, 0, 206, 219, 243, 227, 195, 195, 195, 0, 0, 0, 0,
3, 118, 220, 0, 195, 227, 243, 211, 219, 207, 199, 195, 0, 0, 0, 0,
0, 0, 62, 99, 31, 115, 195, 207, 123, 0, 0, 255, 0, 0, 0, 0,
0, 0, 62, 99, 195, 195, 195, 198, 124, 0, 0, 255, 0, 0, 0, 0,
0, 0, 12, 12, 0, 12, 12, 24, 48, 99, 198, 124, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 254, 192, 192, 192, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 254, 6, 6, 6, 0, 0, 0, 0, 0, 0,
0, 96, 225, 99, 102, 108, 24, 48, 96, 206, 155, 6, 13, 31, 0, 0,
0, 96, 225, 99, 102, 108, 24, 48, 102, 206, 151, 62, 6, 6, 0, 0,
0, 0, 24, 24, 0, 24, 24, 24, 24, 24, 24, 24, 0, 0, 0, 0,
0, 0, 0, 0, 3, 54, 108, 216, 216, 108, 54, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 108, 54, 27, 27, 54, 108, 192, 0, 0, 0, 0,
130, 16, 130, 16, 130, 16, 130, 16, 130, 16, 130, 16, 130, 16, 130, 16,
0, 149, 0, 169, 0, 149, 0, 169, 0, 149, 0, 169, 0, 149, 0, 169,
146, 73, 146, 73, 146, 73, 146, 73, 146, 73, 146, 73, 146, 73, 146, 73,
24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
24, 24, 24, 24, 24, 24, 24, 24, 248, 24, 24, 24, 24, 24, 24, 24,
24, 24, 24, 24, 24, 24, 248, 248, 248, 24, 24, 24, 24, 24, 24, 24,
60, 60, 60, 60, 60, 60, 60, 60, 252, 60, 60, 60, 60, 60, 60, 60,
0, 0, 0, 0, 0, 0, 0, 0, 252, 60, 60, 60, 60, 60, 60, 60,
0, 0, 0, 0, 0, 0, 248, 248, 248, 24, 24, 24, 24, 24, 24, 24,
60, 60, 60, 60, 60, 60, 252, 252, 252, 60, 60, 60, 60, 60, 60, 60,
60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60,
0, 0, 0, 0, 0, 0, 252, 252, 252, 60, 60, 60, 60, 60, 60, 60,
60, 60, 60, 60, 60, 60, 252, 252, 252, 0, 0, 0, 0, 0, 0, 0,
60, 60, 60, 60, 60, 60, 60, 60, 252, 0, 0, 0, 0, 0, 0, 0,
24, 24, 24, 24, 24, 24, 248, 248, 248, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 248, 24, 24, 24, 24, 24, 24, 24,
24, 24, 24, 24, 24, 24, 24, 24, 31, 0, 0, 0, 0, 0, 0, 0,
24, 24, 24, 24, 24, 24, 24, 24, 255, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 255, 24, 24, 24, 24, 24, 24, 24,
24, 24, 24, 24, 24, 24, 24, 24, 31, 24, 24, 24, 24, 24, 24, 24,
0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 0, 0, 0, 0, 0, 0,
24, 24, 24, 24, 24, 24, 24, 24, 255, 24, 24, 24, 24, 24, 24, 24,
24, 24, 24, 24, 24, 24, 31, 31, 31, 24, 24, 24, 24, 24, 24, 24,
60, 60, 60, 60, 60, 60, 60, 60, 63, 60, 60, 60, 60, 60, 60, 60,
60, 60, 60, 60, 60, 60, 63, 63, 63, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 63, 63, 63, 60, 60, 60, 60, 60, 60, 60,
60, 60, 60, 60, 60, 60, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 255, 255, 255, 60, 60, 60, 60, 60, 60, 60,
60, 60, 60, 60, 60, 60, 63, 63, 63, 60, 60, 60, 60, 60, 60, 60,
0, 0, 0, 0, 0, 0, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0,
60, 60, 60, 60, 60, 60, 255, 255, 255, 60, 60, 60, 60, 60, 60, 60,
24, 24, 24, 24, 24, 24, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0,
60, 60, 60, 60, 60, 60, 60, 60, 255, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 255, 255, 255, 24, 24, 24, 24, 24, 24, 24,
0, 0, 0, 0, 0, 0, 0, 0, 255, 60, 60, 60, 60, 60, 60, 60,
60, 60, 60, 60, 60, 60, 60, 60, 63, 0, 0, 0, 0, 0, 0, 0,
24, 24, 24, 24, 24, 24, 31, 31, 31, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 31, 31, 31, 24, 24, 24, 24, 24, 24, 24,
0, 0, 0, 0, 0, 0, 0, 0, 63, 60, 60, 60, 60, 60, 60, 60,
60, 60, 60, 60, 60, 60, 60, 60, 255, 60, 60, 60, 60, 60, 60, 60,
24, 24, 24, 24, 24, 24, 255, 255, 255, 24, 24, 24, 24, 24, 24, 24,
24, 24, 24, 24, 24, 24, 24, 24, 248, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 31, 24, 24, 24, 24, 24, 24, 24,
255, 255, 255,255,255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255,
0, 0, 0, 0, 0, 0, 0, 0, 255, 255, 255, 255, 255, 255, 255, 255,
240, 240, 240, 240,240,240, 240, 240, 240, 240, 240, 240, 240, 240, 240, 240,
15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
255, 255, 255, 255, 255, 255, 255, 255, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 3, 118, 204, 204, 204, 222, 115, 0, 0, 0, 0,
0, 0, 30, 51, 227, 194, 204, 194, 195, 195, 206, 216, 192, 192, 0, 0,
0, 0, 31, 243, 195, 192, 192, 192, 192, 192, 192, 192, 0, 0, 0, 0,
0, 0, 0, 0, 3, 126, 230, 102, 102, 102, 102, 68, 0, 0, 0, 0,
0, 0, 31, 240, 96, 48, 24, 48, 96, 192, 223, 240, 0, 0, 0, 0,
0, 0, 0, 0, 0, 127, 240, 216, 216, 216, 216, 112, 0, 0, 0, 0,
0, 0, 0, 0, 0, 99, 99, 99, 99, 103, 111, 123, 96, 96, 192, 0,
0, 0, 0, 0, 111, 184, 48, 48, 48, 48, 48, 48, 0, 0, 0, 0,
0, 0, 24, 24, 126, 219, 219, 219, 219, 126, 24, 24, 0, 0, 0, 0,
0, 0, 0, 60, 102, 195, 195, 255, 195, 195, 102, 60, 0, 0, 0, 0,
0, 0, 60, 102, 195, 195, 195, 195, 102, 36, 165, 231, 0, 0, 0, 0,
0, 7, 28, 48, 24, 12, 62, 102, 198, 198, 204, 120, 0, 0, 0, 0,
0, 0, 0, 0, 0, 110, 219, 219, 219, 118, 0, 0, 0, 0, 0, 0,
0, 0, 0, 2, 4, 124, 206, 214, 230, 124, 64, 128, 0, 0, 0, 0,
0, 0, 30, 48, 96, 96, 126, 96, 96, 96, 48, 30, 0, 0, 0, 0,
0, 0, 0, 126, 195, 195, 195, 195, 195, 195, 195, 195, 0, 0, 0, 0,
0, 0, 0, 0, 255, 0, 0, 255, 0, 0, 255, 0, 0, 0, 0, 0,
0, 0, 0, 0, 24, 24, 126, 24, 24, 0, 0, 126, 0, 0, 0, 0,
0, 0, 0, 48, 24, 12, 6, 12, 24, 48, 0, 126, 0, 0, 0, 0,
0, 0, 0, 12, 24, 48, 96, 48, 24, 12, 0, 126, 0, 0, 0, 0,
0, 0, 0, 14, 27, 27, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24,
24, 24, 24, 24, 24, 24, 24, 24, 24, 216, 216, 112, 0, 0, 0, 0,
0, 0, 0, 0, 24, 24, 0, 255, 0, 24, 24, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 118, 220, 0, 118, 220, 0, 0, 0, 0, 0, 0,
0, 0, 60, 102, 102, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 24, 24, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 24, 0, 0, 0, 0, 0, 0, 0,
0, 0, 3, 2, 6, 4, 12, 8, 216, 80, 112, 32, 0, 0, 0, 0,
0, 0, 220, 246, 230, 198, 198, 198, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 120, 204, 24, 48, 100, 252, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 126, 126, 126, 126, 126, 126, 126, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0
};
/* Can't find another place to put this... */
void plTexDelete(pl_Texture *t) {
if (t != NULL)
{
if (t->Data != NULL)
{
free(t->Data);
t->Data = NULL;
}
if (t->PaletteData != NULL)
{
free(t->PaletteData);
t->PaletteData = NULL;
}
free(t);
t = NULL;
}
}

720
Src/Winamp/plush/PLUSH.H Normal file
View file

@ -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_ */

View file

@ -0,0 +1,45 @@
/******************************************************************************
pl_conf.h
PLUSH 3D VERSION 1.2 CONFIGURATION HEADER
Copyright (c) 1996-2000, Justin Frankel
******************************************************************************/
#ifndef _PL_CONF_H_
#define _PL_CONF_H_
#ifdef __cplusplus
extern "C" {
#endif
/* Maximum children per object */
#define PL_MAX_CHILDREN (16)
/* Maximum lights per scene -- if you exceed this, they will be ignored */
#define PL_MAX_LIGHTS (32)
/* Maximum number of triangles per scene -- if you exceed this, entire
objects will be ignored. You can increase this if you need it. It takes
approximately 8*PL_MAX_TRIANGLES bytes of memory. i.e. the default of
16384 consumes 128kbytes of memory. not really a big deal,
*/
#define PL_MAX_TRIANGLES (16384)
typedef float pl_ZBuffer; /* z-buffer type (must be float) */
typedef float pl_Float; /* General floating point */
typedef float pl_IEEEFloat32; /* IEEE 32 bit floating point */
typedef signed long int pl_sInt32; /* signed 32 bit integer */
typedef unsigned long int pl_uInt32; /* unsigned 32 bit integer */
typedef signed short int pl_sInt16; /* signed 16 bit integer */
typedef unsigned short int pl_uInt16; /* unsigned 16 bit integer */
typedef signed int pl_sInt; /* signed optimal integer */
typedef unsigned int pl_uInt; /* unsigned optimal integer */
typedef int pl_Bool; /* boolean */
typedef unsigned char pl_uChar; /* unsigned 8 bit integer */
typedef signed char pl_sChar; /* signed 8 bit integer */
#ifdef __cplusplus
}
#endif
#endif /* !_PL_CONF_H_ */

View file

@ -0,0 +1,62 @@
/******************************************************************************
pl_defs.h
PLUSH 3D VERSION 1.2 CONSTANTS DEFINITION HEADER
Copyright (c) 1996-2000, Justin Frankel
******************************************************************************/
#ifndef _PL_DEFS_H_
#define _PL_DEFS_H_
#ifdef __cplusplus
extern "C" {
#endif
/* pi! */
#define PL_PI 3.14159265359
/* Utility min() and max() functions */
#define plMin(x,y) (( ( x ) > ( y ) ? ( y ) : ( x )))
#define plMax(x,y) (( ( x ) < ( y ) ? ( y ) : ( x )))
/*
** Shade modes. Used with plMat.ShadeType
** Note that (PL_SHADE_GOURAUD|PL_SHADE_GOURAUD_DISTANCE) and
** (PL_SHADE_FLAT|PL_SHADE_FLAT_DISTANCE) are valid shading modes.
*/
#define PL_SHADE_NONE (1)
#define PL_SHADE_FLAT (2)
#define PL_SHADE_FLAT_DISTANCE (4)
#define PL_SHADE_GOURAUD (8)
#define PL_SHADE_GOURAUD_DISTANCE (16)
/*
** Light modes. Used with plLight.Type or plLightSet().
** Note that PL_LIGHT_POINT_ANGLE assumes no falloff and uses the angle between
** the light and the point, PL_LIGHT_POINT_DISTANCE has falloff with proportion
** to distance**2 (see plLightSet() for setting it), PL_LIGHT_POINT does both.
*/
#define PL_LIGHT_NONE (0x0)
#define PL_LIGHT_VECTOR (0x1)
#define PL_LIGHT_POINT (0x2|0x4)
#define PL_LIGHT_POINT_DISTANCE (0x2)
#define PL_LIGHT_POINT_ANGLE (0x4)
/* Used internally; PL_FILL_* are stored in plMat._st. */
#define PL_FILL_SOLID (0x0)
#define PL_FILL_TEXTURE (0x1)
#define PL_FILL_ENVIRONMENT (0x2)
#define PL_FILL_TRANSPARENT (0x4)
#define PL_TEXENV_ADD (0)
#define PL_TEXENV_MUL (1)
#define PL_TEXENV_AVG (2)
#define PL_TEXENV_TEXMINUSENV (3)
#define PL_TEXENV_ENVMINUSTEX (4)
#define PL_TEXENV_MIN (5)
#define PL_TEXENV_MAX (6)
#ifdef __cplusplus
}
#endif
#endif /* !_PL_DEFS_H_ */

162
Src/Winamp/plush/PL_TYPES.H Normal file
View file

@ -0,0 +1,162 @@
/******************************************************************************
pl_types.h
PLUSH 3D VERSION 1.2 TYPES DEFINITION HEADER
Copyright (c) 1996-2000 Justin Frankel
******************************************************************************/
#ifndef _PL_TYPES_H_
#define _PL_TYPES_H_
#ifdef __cplusplus
extern "C" {
#endif
/*
** Texture type. Read textures with plReadPCXTex(), and assign them to
** plMat.Environment or plMat.Texture.
*/
typedef struct _pl_Texture {
pl_uChar *Data; /* Texture data */
pl_uChar *PaletteData; /* Palette data (NumColors bytes) */
pl_uChar Width, Height; /* Log2 of dimensions */
pl_uInt iWidth, iHeight; /* Integer dimensions */
pl_Float uScale, vScale; /* Scaling (usually 2**Width, 2**Height) */
pl_uInt NumColors; /* Number of colors used in texture */
} pl_Texture;
/*
** Material type. Create materials with plMatCreate().
*/
typedef struct _pl_Mat {
pl_sInt Ambient[3]; /* RGB of surface (0-255 is a good range) */
pl_sInt Diffuse[3]; /* RGB of diffuse (0-255 is a good range) */
pl_sInt Specular[3]; /* RGB of "specular" highlights (0-255) */
pl_uInt Shininess; /* Shininess of material. 1 is dullest */
pl_Float FadeDist; /* For distance fading, distance at
which intensity is 0 */
pl_uChar ShadeType; /* Shade type: PL_SHADE_* */
pl_uChar Transparent; /* Transparency index (0 = none), 4 = alot
Note: transparencies disable textures */
pl_uChar PerspectiveCorrect; /* Correct textures every n pixels */
pl_Texture *Texture; /* Texture map (see pl_Texture) above */
pl_Texture *Environment; /* Environment map (ditto) */
pl_Float TexScaling; /* Texture map scaling */
pl_Float EnvScaling; /* Environment map scaling */
pl_uChar TexEnvMode; /* TexEnv combining mode (PL_TEXENV_*) */
pl_Bool zBufferable; /* Can this material be zbuffered? */
pl_uInt NumGradients; /* Desired number of gradients to be used */
/* The following are used mostly internally */
pl_uInt _ColorsUsed; /* Number of colors actually used */
pl_uChar _st, _ft; /* The shadetype and filltype */
pl_uInt _tsfact; /* Translucent shading factor */
pl_uInt16 *_AddTable; /* Shading/Translucent/etc table */
pl_uChar *_ReMapTable; /* Table to remap colors to palette */
pl_uChar *_RequestedColors; /* _ColorsUsed colors, desired colors */
void (*_PutFace)(); /* Function that renders the triangle with this
material */
} pl_Mat;
/*
** Vertex, used within pl_Obj
*/
typedef struct _pl_Vertex {
pl_Float x, y, z; /* Vertex coordinate (objectspace) */
pl_Float xformedx, xformedy, xformedz;
/* Transformed vertex
coordinate (cameraspace) */
pl_Float nx, ny, nz; /* Unit vertex normal (objectspace) */
pl_Float xformednx, xformedny, xformednz;
/* Transformed unit vertex normal
(cameraspace) */
} pl_Vertex;
/*
** Face
*/
typedef struct _pl_Face {
pl_Vertex *Vertices[3]; /* Vertices of triangle */
pl_Float nx, ny, nz; /* Normal of triangle (object space) */
pl_Mat *Material; /* Material of triangle */
pl_sInt32 Scrx[3], Scry[3]; /* Projected screen coordinates
(12.20 fixed point) */
pl_Float Scrz[3]; /* Projected 1/Z coordinates */
pl_sInt32 MappingU[3], MappingV[3];
/* 16.16 Texture mapping coordinates */
pl_sInt32 eMappingU[3], eMappingV[3];
/* 16.16 Environment map coordinates */
pl_Float fShade; /* Flat intensity */
pl_Float sLighting; /* Face static lighting. Should usually be 0.0 */
pl_Float Shades[3]; /* Vertex intensity */
pl_Float vsLighting[3]; /* Vertex static lighting. Should be 0.0 */
} pl_Face;
/*
** Object
*/
typedef struct _pl_Obj {
pl_uInt32 NumVertices; /* Number of vertices */
pl_uInt32 NumFaces; /* Number of faces */
pl_Vertex *Vertices; /* Array of vertices */
pl_Face *Faces; /* Array of faces */
struct _pl_Obj *Children[PL_MAX_CHILDREN];
/* Children */
pl_Bool BackfaceCull; /* Are backfacing polys drawn? */
pl_Bool BackfaceIllumination; /* Illuminated by lights behind them? */
pl_Bool GenMatrix; /* Generate Matrix from the following
if set */
pl_Float Xp, Yp, Zp, Xa, Ya, Za; /* Position and rotation of object:
Note: rotations are around
X then Y then Z. Measured in degrees */
pl_Float Matrix[16]; /* Transformation matrix */
pl_Float RotMatrix[16]; /* Rotation only matrix (for normals) */
} pl_Obj;
/*
** Spline type. See plSpline*().
*/
typedef struct _pl_Spline {
pl_Float *keys; /* Key data, keyWidth*numKeys */
pl_sInt keyWidth; /* Number of floats per key */
pl_sInt numKeys; /* Number of keys */
pl_Float cont; /* Continuity. Should be -1.0 -> 1.0 */
pl_Float bias; /* Bias. -1.0 -> 1.0 */
pl_Float tens; /* Tension. -1.0 -> 1.0 */
} pl_Spline;
/*
** Light type. See plLight*().
*/
typedef struct _pl_Light {
pl_uChar Type; /* Type of light: PL_LIGHT_* */
pl_Float Xp, Yp, Zp; /* If Type=PL_LIGHT_POINT*,
this is Position (PL_LIGHT_POINT_*),
otherwise if PL_LIGHT_VECTOR,
Unit vector */
pl_Float Intensity; /* Intensity. 0.0 is off, 1.0 is full */
pl_Float HalfDistSquared; /* Distance squared at which
PL_LIGHT_POINT_DISTANCE is 50% */
} pl_Light;
/*
** Camera Type.
*/
typedef struct _pl_Cam {
pl_Float Fov; /* FOV in degrees valid range is 1-179 */
pl_Float AspectRatio; /* Aspect ratio (usually 1.0) */
pl_sChar Sort; /* Sort polygons, -1 f-t-b, 1 b-t-f, 0 no */
pl_Float ClipBack; /* Far clipping ( < 0.0 is none) */
pl_sInt ClipTop, ClipLeft; /* Screen Clipping */
pl_sInt ClipBottom, ClipRight;
pl_uInt ScreenWidth, ScreenHeight; /* Screen dimensions */
pl_sInt CenterX, CenterY; /* Center of screen */
pl_Float X, Y, Z; /* Camera position in worldspace */
pl_Float Pitch, Pan, Roll; /* Camera angle in degrees in worldspace */
pl_uChar *frameBuffer; /* Framebuffer (ScreenWidth*ScreenHeight) */
pl_ZBuffer *zBuffer; /* Z Buffer (NULL if none) */
} pl_Cam;
#ifdef __cplusplus
}
#endif
#endif /* !_PL_TYPES_H_ */

View file

@ -0,0 +1,54 @@
/******************************************************************************
Plush Version 1.2
putface.h
Triangle Vertex Sorting Code for pf_*.c
Copyright (c) 1996-2000, Justin Frankel
******************************************************************************/
#ifndef _PUTFACE_H_
#define _PUTFACE_H_
#define PUTFACE_SORT() \
i0 = 0; i1 = 1; i2 = 2; \
if (TriFace->Scry[0] > TriFace->Scry[1]) { \
i0 = 1; i1 = 0; \
} \
if (TriFace->Scry[i0] > TriFace->Scry[2]) { \
i2 ^= i0; i0 ^= i2; i2 ^= i0; \
} \
if (TriFace->Scry[i1] > TriFace->Scry[i2]) { \
i2 ^= i1; i1 ^= i2; i2 ^= i1; \
}
#define PUTFACE_SORT_ENV() \
PUTFACE_SORT(); \
MappingU1=TriFace->eMappingU[i0]*Texture->uScale*\
TriFace->Material->EnvScaling;\
MappingV1=TriFace->eMappingV[i0]*Texture->vScale*\
TriFace->Material->EnvScaling;\
MappingU2=TriFace->eMappingU[i1]*Texture->uScale*\
TriFace->Material->EnvScaling;\
MappingV2=TriFace->eMappingV[i1]*Texture->vScale*\
TriFace->Material->EnvScaling;\
MappingU3=TriFace->eMappingU[i2]*Texture->uScale*\
TriFace->Material->EnvScaling;\
MappingV3=TriFace->eMappingV[i2]*Texture->vScale*\
TriFace->Material->EnvScaling;
#define PUTFACE_SORT_TEX() \
PUTFACE_SORT(); \
MappingU1=TriFace->MappingU[i0]*Texture->uScale*\
TriFace->Material->TexScaling;\
MappingV1=TriFace->MappingV[i0]*Texture->vScale*\
TriFace->Material->TexScaling;\
MappingU2=TriFace->MappingU[i1]*Texture->uScale*\
TriFace->Material->TexScaling;\
MappingV2=TriFace->MappingV[i1]*Texture->vScale*\
TriFace->Material->TexScaling;\
MappingU3=TriFace->MappingU[i2]*Texture->uScale*\
TriFace->Material->TexScaling;\
MappingV3=TriFace->MappingV[i2]*Texture->vScale*\
TriFace->Material->TexScaling;
#endif /* !_PUTFACE_H_ */

244
Src/Winamp/plush/READ_3DS.C Normal file
View file

@ -0,0 +1,244 @@
/******************************************************************************
Plush Version 1.2
read_3ds.c
3DS Object Reader
Copyright (c) 1996-2000, Justin Frankel
******************************************************************************/
#include "plush.h"
typedef struct {
pl_uInt16 id;
void (*func)(FILE *f, pl_uInt32 p);
} _pl_3DSChunk;
static pl_Obj *obj;
static pl_Obj *bobj;
static pl_Obj *lobj;
static pl_sInt16 currentobj;
static pl_Mat *_m;
static pl_Float _pl3DSReadFloat(FILE *f);
static pl_uInt32 _pl3DSReadDWord(FILE *f);
static pl_uInt16 _pl3DSReadWord(FILE *f);
static void _pl3DSChunkReader(FILE *f, pl_uInt32 p);
static void _pl3DSRGBFReader(FILE *f, pl_uInt32 p);
static void _pl3DSRGBBReader(FILE *f, pl_uInt32 p);
static void _pl3DSASCIIZReader(FILE *f, pl_uInt32 p, char *as);
static void _pl3DSObjBlockReader(FILE *f, pl_uInt32 p);
static void _pl3DSTriMeshReader(FILE *f, pl_uInt32 p);
static void _pl3DSVertListReader(FILE *f, pl_uInt32 p);
static void _pl3DSFaceListReader(FILE *f, pl_uInt32 p);
static void _pl3DSFaceMatReader(FILE *f, pl_uInt32 p);
static void MapListReader(FILE *f, pl_uInt32 p);
static pl_sInt16 _pl3DSFindChunk(pl_uInt16 id);
static _pl_3DSChunk _pl3DSChunkNames[] = {
{0x4D4D,NULL}, /* Main */
{0x3D3D,NULL}, /* Object Mesh */
{0x4000,_pl3DSObjBlockReader},
{0x4100,_pl3DSTriMeshReader},
{0x4110,_pl3DSVertListReader},
{0x4120,_pl3DSFaceListReader},
{0x4130,_pl3DSFaceMatReader},
{0x4140,MapListReader},
{0xAFFF,NULL}, /* Material */
{0xA010,NULL}, /* Ambient */
{0xA020,NULL}, /* Diff */
{0xA030,NULL}, /* Specular */
{0xA200,NULL}, /* Texture */
{0x0010,_pl3DSRGBFReader},
{0x0011,_pl3DSRGBBReader},
};
pl_Obj *plRead3DSObj(char *fn, pl_Mat *m) {
FILE *f;
pl_uInt32 p;
_m = m;
obj = bobj = lobj = 0;
currentobj = 0;
f = fopen(fn, "rb");
if (!f) return 0;
fseek(f, 0, 2);
p = ftell(f);
rewind(f);
_pl3DSChunkReader(f, p);
fclose(f);
return bobj;
}
static pl_Float _pl3DSReadFloat(FILE *f) {
pl_uInt32 *i;
pl_IEEEFloat32 c;
i = (pl_uInt32 *) &c;
*i = _pl3DSReadDWord(f);
return ((pl_Float) c);
}
static pl_uInt32 _pl3DSReadDWord(FILE *f) {
pl_uInt32 r;
r = fgetc(f);
r |= fgetc(f)<<8;
r |= fgetc(f)<<16;
r |= fgetc(f)<<24;
return r;
}
static pl_uInt16 _pl3DSReadWord(FILE *f) {
pl_uInt16 r;
r = fgetc(f);
r |= fgetc(f)<<8;
return r;
}
static void _pl3DSRGBFReader(FILE *f, pl_uInt32 p) {
pl_Float c[3];
c[0] = _pl3DSReadFloat(f);
c[1] = _pl3DSReadFloat(f);
c[2] = _pl3DSReadFloat(f);
}
static void _pl3DSRGBBReader(FILE *f, pl_uInt32 p) {
unsigned char c[3];
if (fread(&c, sizeof(c), 1, f) != 1) return;
}
static void _pl3DSASCIIZReader(FILE *f, pl_uInt32 p, char *as) {
char c;
if (!as) while ((c = fgetc(f)) != EOF && c != '\0');
else {
while ((c = fgetc(f)) != EOF && c != '\0') *as++ = c;
*as = 0;
}
}
static void _pl3DSObjBlockReader(FILE *f, pl_uInt32 p) {
_pl3DSASCIIZReader(f,p,0);
_pl3DSChunkReader(f, p);
}
static void _pl3DSTriMeshReader(FILE *f, pl_uInt32 p) {
pl_uInt32 i;
pl_Face *face;
obj = plObjCreate(0,0);
_pl3DSChunkReader(f, p);
i = obj->NumFaces;
face = obj->Faces;
while (i--) {
face->Vertices[0] = obj->Vertices + (pl_uInt32) face->Vertices[0];
face->Vertices[1] = obj->Vertices + (pl_uInt32) face->Vertices[1];
face->Vertices[2] = obj->Vertices + (pl_uInt32) face->Vertices[2];
face->MappingU[0] = face->Vertices[0]->xformedx;
face->MappingV[0] = face->Vertices[0]->xformedy;
face->MappingU[1] = face->Vertices[1]->xformedx;
face->MappingV[1] = face->Vertices[1]->xformedy;
face->MappingU[2] = face->Vertices[2]->xformedx;
face->MappingV[2] = face->Vertices[2]->xformedy;
face++;
}
plObjCalcNormals(obj);
if (currentobj == 0) {
currentobj = 1;
lobj = bobj = obj;
} else {
lobj->Children[0] = obj;
lobj = obj;
}
}
static void _pl3DSVertListReader(FILE *f, pl_uInt32 p) {
pl_uInt16 nv;
pl_Vertex *v;
nv = _pl3DSReadWord(f);
obj->NumVertices = nv;
v = obj->Vertices = (pl_Vertex *) calloc(sizeof(pl_Vertex)*nv,1);
while (nv--) {
v->x = _pl3DSReadFloat(f);
v->y = _pl3DSReadFloat(f);
v->z = _pl3DSReadFloat(f);
if (feof(f)) return;
v++;
}
}
static void _pl3DSFaceListReader(FILE *f, pl_uInt32 p) {
pl_uInt16 nv;
pl_uInt16 c[3];
pl_uInt16 flags;
pl_Face *face;
nv = _pl3DSReadWord(f);
obj->NumFaces = nv;
face = obj->Faces = (pl_Face *) calloc(sizeof(pl_Face)*nv,1);
while (nv--) {
c[0] = _pl3DSReadWord(f);
c[1] = _pl3DSReadWord(f);
c[2] = _pl3DSReadWord(f);
flags = _pl3DSReadWord(f);
if (feof(f)) return;
face->Vertices[0] = (pl_Vertex *) (c[0]&0x0000FFFF);
face->Vertices[1] = (pl_Vertex *) (c[1]&0x0000FFFF);
face->Vertices[2] = (pl_Vertex *) (c[2]&0x0000FFFF);
face->Material = _m;
face++;
}
_pl3DSChunkReader(f, p);
}
static void _pl3DSFaceMatReader(FILE *f, pl_uInt32 p) {
pl_uInt16 n, nf;
_pl3DSASCIIZReader(f, p,0);
n = _pl3DSReadWord(f);
while (n--) {
nf = _pl3DSReadWord(f);
}
}
static void MapListReader(FILE *f, pl_uInt32 p) {
pl_uInt16 nv;
pl_Float c[2];
pl_Vertex *v;
nv = _pl3DSReadWord(f);
v = obj->Vertices;
if (nv == obj->NumVertices) while (nv--) {
c[0] = _pl3DSReadFloat(f);
c[1] = _pl3DSReadFloat(f);
if (feof(f)) return;
v->xformedx = (pl_sInt32) (c[0]*65536.0);
v->xformedy = (pl_sInt32) (c[1]*65536.0);
v++;
}
}
static pl_sInt16 _pl3DSFindChunk(pl_uInt16 id) {
pl_sInt16 i;
for (i = 0; i < sizeof(_pl3DSChunkNames)/sizeof(_pl3DSChunkNames[0]); i++)
if (id == _pl3DSChunkNames[i].id) return i;
return -1;
}
static void _pl3DSChunkReader(FILE *f, pl_uInt32 p) {
pl_uInt32 hlen;
pl_uInt16 hid;
pl_sInt16 n;
pl_uInt32 pc;
while (ftell(f) < (int)p) {
pc = ftell(f);
hid = _pl3DSReadWord(f); if (feof(f)) return;
hlen = _pl3DSReadDWord(f); if (feof(f)) return;
if (hlen == 0) return;
n = _pl3DSFindChunk(hid);
if (n < 0) fseek(f, pc + hlen, 0);
else {
pc += hlen;
if (_pl3DSChunkNames[n].func != NULL) _pl3DSChunkNames[n].func(f, pc);
else _pl3DSChunkReader(f, pc);
fseek(f, pc, 0);
}
if (ferror(f)) break;
}
}

182
Src/Winamp/plush/READ_COB.C Normal file
View file

@ -0,0 +1,182 @@
/******************************************************************************
Plush Version 1.2
read_cob.c
ASCII COB Object Reader
Copyright (c) 1996-2000, Justin Frankel
******************************************************************************/
#include "plush.h"
#define PL_COB_MAX_LINELENGTH 1024
pl_Obj *plReadCOBObj(char *fn, pl_Mat *mat) {
FILE *fp = fopen(fn,"rt");
long int p1,m1,p2,m2,p3,m3;
char temp_string[PL_COB_MAX_LINELENGTH];
float TransMatrix[4][4];
pl_Obj *obj;
pl_sInt32 x,i2;
long int numVertices, numMappingVertices, numFaces, i;
pl_sInt32 *MappingVertices = 0;
if (!fp) return 0;
fgets(temp_string,PL_COB_MAX_LINELENGTH,fp);
if (memcmp("Caligari",temp_string,8)) { fclose(fp); return 0; }
do {
fgets(temp_string,PL_COB_MAX_LINELENGTH,fp);
} while (!feof(fp) && memcmp("Transform",temp_string,9));
if (feof(fp)) { fclose(fp); return 0; }
fgets(temp_string,PL_COB_MAX_LINELENGTH,fp);
sscanf(temp_string,"%f %f %f %f",
&TransMatrix[0][0],&TransMatrix[0][1],&TransMatrix[0][2],&TransMatrix[0][3]);
fgets(temp_string,PL_COB_MAX_LINELENGTH,fp);
sscanf(temp_string,"%f %f %f %f",
&TransMatrix[1][0],&TransMatrix[1][1],&TransMatrix[1][2],&TransMatrix[1][3]);
fgets(temp_string,PL_COB_MAX_LINELENGTH,fp);
sscanf(temp_string,"%f %f %f %f",
&TransMatrix[2][0],&TransMatrix[2][1],&TransMatrix[2][2],&TransMatrix[2][3]);
fgets(temp_string,PL_COB_MAX_LINELENGTH,fp);
sscanf(temp_string,"%f %f %f %f",
&TransMatrix[3][0],&TransMatrix[3][1],&TransMatrix[3][2],&TransMatrix[3][3]);
do {
fgets(temp_string,PL_COB_MAX_LINELENGTH,fp);
} while (!feof(fp) && memcmp("World Vertices",temp_string,12));
if (feof(fp) || sscanf(temp_string,"World Vertices %ld",&numVertices) != 1)
{ fclose(fp); return 0; }
rewind(fp);
do {
fgets(temp_string,PL_COB_MAX_LINELENGTH,fp);
} while (!feof(fp) && memcmp("Texture Vertices",temp_string,16));
if (feof(fp) ||
sscanf(temp_string,"Texture Vertices %ld",&numMappingVertices) != 1) {
fclose(fp); return 0;
}
rewind(fp);
do {
fgets(temp_string,PL_COB_MAX_LINELENGTH,fp);
} while (!feof(fp) && memcmp("Faces",temp_string,5));
if (feof(fp) || sscanf(temp_string,"Faces %ld",&numFaces) != 1) {
fclose(fp); return 0;
}
for (x = numFaces; x; x--) {
fgets(temp_string,PL_COB_MAX_LINELENGTH,fp);
if (feof(fp) || sscanf(temp_string+4," verts %ld",&i) != 1 || i < 3) {
fclose(fp);
return 0;
}
numFaces += i-3;
fgets(temp_string,PL_COB_MAX_LINELENGTH,fp);
}
obj = plObjCreate(numVertices,numFaces);
if (!obj) { fclose(fp); return 0; }
rewind(fp);
do {
fgets(temp_string,PL_COB_MAX_LINELENGTH,fp);
} while (!feof(fp) && memcmp("World Vertices",temp_string,12));
if (feof(fp)) { plObjDelete(obj); fclose(fp); return 0; }
for (x = 0; x < numVertices; x ++) {
float xp, yp, zp;
fgets(temp_string,PL_COB_MAX_LINELENGTH,fp);
if (feof(fp) ||
sscanf(temp_string,"%f %f %f", &xp, &yp, &zp) != 3) {
plObjDelete(obj); fclose(fp); return 0;
}
obj->Vertices[x].x = (TransMatrix[0][0]*xp+TransMatrix[0][1]*yp+
TransMatrix[0][2]*zp+TransMatrix[0][3]);
obj->Vertices[x].y = (TransMatrix[1][0]*xp+TransMatrix[1][1]*yp+
TransMatrix[1][2]*zp+TransMatrix[1][3]);
obj->Vertices[x].z = (TransMatrix[2][0]*xp+TransMatrix[2][1]*yp+
TransMatrix[2][2]*zp+TransMatrix[2][3]);
}
rewind(fp);
do {
fgets(temp_string,PL_COB_MAX_LINELENGTH,fp);
} while (!feof(fp) && memcmp("Texture Vertices",temp_string,16));
if (!feof(fp)) {
MappingVertices = (pl_sInt32 *)
malloc(sizeof(pl_sInt32) * numMappingVertices * 2);
if (MappingVertices) {
for (x = 0; x < numMappingVertices; x ++) {
float p1, p2;
fgets(temp_string,PL_COB_MAX_LINELENGTH,fp);
if (feof(fp) || sscanf(temp_string,"%f %f", &p1, &p2) != 2) {
free(MappingVertices); plObjDelete(obj); fclose(fp); return 0;
}
MappingVertices[x*2] = (pl_sInt32) (p1*65536.0);
MappingVertices[x*2+1] = (pl_sInt32) (p2*65536.0);
}
}
}
rewind(fp);
do {
fgets(temp_string,PL_COB_MAX_LINELENGTH,fp);
} while (!feof(fp) && memcmp("Faces",temp_string,5));
if (feof(fp)) {
if (MappingVertices) free(MappingVertices);
plObjDelete(obj); fclose(fp); return 0;
}
for (x = 0; x < numFaces; x ++) {
fgets(temp_string,PL_COB_MAX_LINELENGTH,fp);
sscanf(temp_string+4," verts %ld",&i);
fgets(temp_string,PL_COB_MAX_LINELENGTH,fp);
if (i == 3) {
if (feof(fp) || sscanf(temp_string,"<%ld,%ld> <%ld,%ld> <%ld,%ld>",
&p3,&m3,&p2,&m2,&p1,&m1) != 6) {
if (MappingVertices) free(MappingVertices);
plObjDelete(obj); fclose(fp); return 0;
}
obj->Faces[x].Vertices[0] = obj->Vertices + p1;
obj->Faces[x].Vertices[1] = obj->Vertices + p2;
obj->Faces[x].Vertices[2] = obj->Vertices + p3;
if (MappingVertices) {
obj->Faces[x].MappingU[0] = MappingVertices[m1*2];
obj->Faces[x].MappingV[0] = MappingVertices[m1*2+1];
obj->Faces[x].MappingU[1] = MappingVertices[m2*2];
obj->Faces[x].MappingV[1] = MappingVertices[m2*2+1];
obj->Faces[x].MappingU[2] = MappingVertices[m3*2];
obj->Faces[x].MappingV[2] = MappingVertices[m3*2+1];
}
obj->Faces[x].Material = mat;
} else {
long int p[16],m[16];
if (feof(fp)) {
if (MappingVertices) free(MappingVertices);
plObjDelete(obj); fclose(fp); return 0;
}
sscanf(temp_string,
"<%ld,%ld> <%ld,%ld> <%ld,%ld> <%ld,%ld> "
"<%ld,%ld> <%ld,%ld> <%ld,%ld> <%ld,%ld> "
"<%ld,%ld> <%ld,%ld> <%ld,%ld> <%ld,%ld> "
"<%ld,%ld> <%ld,%ld> <%ld,%ld> <%ld,%ld> ",
p+0,m+0,p+1,m+1,p+2,m+2,p+3,m+3,
p+4,m+4,p+5,m+5,p+6,m+6,p+7,m+7,
p+8,m+8,p+9,m+9,p+10,m+10,p+11,m+11,
p+12,m+12,p+13,m+13,p+14,m+14,p+15,m+15);
for (i2 = 1; i2 < (i-1); i2 ++) {
obj->Faces[x].Vertices[0] = obj->Vertices + p[0];
obj->Faces[x].Vertices[1] = obj->Vertices + p[i2+1];
obj->Faces[x].Vertices[2] = obj->Vertices + p[i2];
if (MappingVertices) {
obj->Faces[x].MappingU[0] = MappingVertices[m[0]*2];
obj->Faces[x].MappingV[0] = MappingVertices[m[0]*2+1];
obj->Faces[x].MappingU[1] = MappingVertices[m[i2+1]*2];
obj->Faces[x].MappingV[1] = MappingVertices[m[i2+1]*2+1];
obj->Faces[x].MappingU[2] = MappingVertices[m[i2]*2];
obj->Faces[x].MappingV[2] = MappingVertices[m[i2]*2+1];
}
obj->Faces[x].Material = mat;
x++;
}
x--;
}
}
obj->BackfaceCull = 1;
if (MappingVertices) free(MappingVertices);
plObjCalcNormals(obj);
fclose(fp);
return obj;
}

View file

@ -0,0 +1,69 @@
/******************************************************************************
Plush Version 1.2
read_jaw.c
Jaw3D Object Reader
Copyright (c) 1996-2000, Justin Frankel
*******************************************************************************
Notes on .JAW files:
This is a file format created by Jawed Karim for Jaw3D
(http://jaw3d.home.ml.org).
-- updated 11/6/00 - www.jawed.com
It is very simple, and lets one easily create ones own models using only
a text editor. The format is pretty simple:
The first line must be "Light: (x,y,z)" where x,y, and z are the x y and
z components of the lightsource vector (I think ;)
A series of lines, numbered 0 to n, in the format of
"i: x y z", where i is the vertex number (which should be listed in
order, and x y and z are the coordinates of that vertex.
A series of lines, having the format "tri a, b, c" where a b and c are
the vertices that the face uses. It is unclear at this time which
way the vertices are listed (ccw or cw), so just make em consistent
and you can always use plFlipObjectNormals() on the loaded object.
That is it! (I told ya it was simple).
******************************************************************************/
#include "plush.h"
pl_Obj *plReadJAWObj(char *filename, pl_Mat *m) {
FILE *jawfile;
pl_Obj *obj;
pl_uInt32 i;
pl_sInt crap;
char line[256];
pl_uInt32 total_points = 0, total_polys = 0;
if ((jawfile = fopen(filename, "r")) == NULL) return 0;
fgets(line, 256, jawfile); /* Ignores lightsource info */
while (fgets(line, 256, jawfile) != NULL)
if (strstr(line, ":") != NULL) total_points++;
rewind(jawfile); fgets(line, 256, jawfile);
while (fgets(line, 256, jawfile) != NULL)
if (strstr(line, "tri") != NULL) total_polys++;
rewind(jawfile); fgets(line, 256, jawfile);
obj = plObjCreate(total_points,total_polys);
i = 0;
while (fgets(line, 256, jawfile) != NULL) if (strstr(line, ":") != NULL) {
float x, y, z;
sscanf(line, "%d: %f %f %f",&crap,&x,&y,&z);
obj->Vertices[i].x = (pl_Float) x;
obj->Vertices[i].y = (pl_Float) y;
obj->Vertices[i].z = (pl_Float) z;
i++;
}
rewind(jawfile); fgets(line, 256, jawfile);
i = 0;
while (fgets(line, 256, jawfile) != NULL) if (strstr(line, "tri") != NULL) {
pl_uInt32 a,b,c;
sscanf(line, "tri %ld, %ld, %ld", &a, &b, &c);
obj->Faces[i].Vertices[0] = obj->Vertices + a;
obj->Faces[i].Vertices[1] = obj->Vertices + c;
obj->Faces[i].Vertices[2] = obj->Vertices + b;
obj->Faces[i].Material = m;
i++;
}
fclose(jawfile);
plObjCalcNormals(obj);
return obj;
}

162
Src/Winamp/plush/READ_PCX.C Normal file
View file

@ -0,0 +1,162 @@
/******************************************************************************
Plush Version 1.2
read_pcx.c
PCX Texture Reader
Copyright (c) 1996-2000, Justin Frankel
******************************************************************************/
#include "plush.h"
static pl_uInt _plHiBit(pl_uInt16);
static pl_uInt _plOptimizeImage(pl_uChar *, pl_uChar *, pl_uInt32);
static pl_sInt _plReadPCX(char *filename, pl_uInt16 *width, pl_uInt16 *height,
pl_uChar **pal, pl_uChar **data);
static void _plRescaleImage(pl_uChar *in, pl_uChar *out, pl_uInt inx,
pl_uInt iny, pl_uInt outx, pl_uInt outy);
pl_Texture *plReadPCXTex(char *fn, pl_Bool rescale, pl_Bool optimize) {
pl_uChar *data, *pal;
pl_uInt16 x, y;
pl_Texture *t;
if (_plReadPCX(fn,&x,&y,&pal,&data) < 0) return 0;
t = (pl_Texture *) malloc(sizeof(pl_Texture));
if (!t) return 0;
t->Width = _plHiBit(x);
t->Height = _plHiBit(y);
if (rescale && (1 << t->Width != x || 1 << t->Height != y)) {
pl_uChar nx, ny, *newdata;
nx = t->Width;
if ((1 << t->Width) != x) nx++;
ny = t->Height;
if ((1 << t->Height) != y) ny++;
newdata = (pl_uChar *) malloc((1<<nx)*(1<<ny));
if (!newdata) {
free(t);
free(data);
free(pal);
return 0;
}
_plRescaleImage(data,newdata,x,y,1<<nx,1<<ny);
free(data);
data = newdata;
t->Width = nx;
t->Height = ny;
x = 1<<nx; y = 1<<ny;
}
t->iWidth = x;
t->iHeight = y;
t->uScale = (pl_Float) (1<<t->Width);
t->vScale = (pl_Float) (1<<t->Height);
if (optimize) t->NumColors = _plOptimizeImage(pal, data,x*y);
else t->NumColors = 256;
t->Data = data;
t->PaletteData = pal;
return t;
}
static pl_uInt _plHiBit(pl_uInt16 x) {
pl_uInt i = 16, mask = 1<<15;
while (mask) {
if (x & mask) return i;
mask >>= 1; i--;
}
return 0;
}
static pl_uInt _plOptimizeImage(pl_uChar *pal, pl_uChar *data, pl_uInt32 len) {
pl_uChar colors[256], *dd = data;
pl_uChar remap[256];
pl_sInt32 lastused, firstunused;
pl_uInt32 x;
memset(colors,0,256);
for (x = 0; x < len; x ++) colors[(pl_uInt) *dd++] = 1;
lastused = -1;
for (x = 0; x < 256; x ++) remap[x] = (pl_uChar)x;
lastused = 255;
firstunused = 0;
for (;;) {
while (firstunused < 256 && colors[firstunused]) firstunused++;
if (firstunused > 255) break;
while (lastused >= 0 && !colors[lastused]) lastused--;
if (lastused < 0) break;
if (lastused <= firstunused) break;
pal[firstunused*3] = pal[lastused*3];
pal[firstunused*3+1] = pal[lastused*3+1];
pal[firstunused*3+2] = pal[lastused*3+2];
colors[lastused] = 0;
colors[firstunused] = 1;
remap[lastused] = (pl_uChar) firstunused;
}
x = len;
while (x--) *data++ = remap[(pl_uInt) *data];
return (lastused+1);
}
static pl_sInt _plReadPCX(char *filename, pl_uInt16 *width, pl_uInt16 *height,
pl_uChar **pal, pl_uChar **data) {
pl_uInt16 sx, sy, ex, ey;
FILE *fp = fopen(filename,"rb");
pl_uChar *data2;
if (!fp) return -1;
fgetc(fp);
if (fgetc(fp) != 5) { fclose(fp); return -2; }
if (fgetc(fp) != 1) { fclose(fp); return -2; }
if (fgetc(fp) != 8) { fclose(fp); return -3; }
sx = fgetc(fp); sx |= fgetc(fp)<<8;
sy = fgetc(fp); sy |= fgetc(fp)<<8;
ex = fgetc(fp); ex |= fgetc(fp)<<8;
ey = fgetc(fp); ey |= fgetc(fp)<<8;
*width = ex - sx + 1;
*height = ey - sy + 1;
fseek(fp,128,SEEK_SET);
if (feof(fp)) { fclose(fp); return -4; }
*data = (pl_uChar *) malloc((*width) * (*height));
if (!*data) { fclose(fp); return -128; }
sx = *height;
data2 = *data;
do {
int xpos = 0;
do {
char c = fgetc(fp);
if ((c & 192) == 192) {
char oc = fgetc(fp);
c &= ~192;
do {
*(data2++) = oc;
xpos++;
} while (--c && xpos < *width);
} else {
*(data2++) = c;
xpos++;
}
} while (xpos < *width);
} while (--sx);
if (feof(fp)) { fclose(fp); free(*data); return -5; }
fseek(fp,-769,SEEK_END);
if (fgetc(fp) != 12) { fclose(fp); free(*data); return -6; }
*pal = (pl_uChar *) malloc(768);
if (!*pal) { fclose(fp); free(*data); return -7; }
fread(*pal,3,256,fp);
fclose(fp);
return 0;
}
static void _plRescaleImage(pl_uChar *in, pl_uChar *out, pl_uInt inx,
pl_uInt iny, pl_uInt outx, pl_uInt outy) {
pl_uInt x;
pl_uInt32 X, dX, dY, Y;
dX = (inx<<16) / outx;
dY = (iny<<16) / outy;
Y = 0;
do {
pl_uChar *ptr = in + inx*(Y>>16);
X = 0;
Y += dY;
x = outx;
do {
*out++ = ptr[X>>16];
X += dX;
} while (--x);
} while (--outy);
}

301
Src/Winamp/plush/RENDER.C Normal file
View file

@ -0,0 +1,301 @@
/******************************************************************************
Plush Version 1.2
render.c
Rendering code: this includes transformation, lighting, etc
Copyright (c) 1996-2000, Justin Frankel
******************************************************************************/
#include "plush.h"
typedef struct {
pl_Float zd;
pl_Face *face;
} _faceInfo;
typedef struct {
pl_Light *light;
pl_Float l[3];
} _lightInfo;
#define MACRO_plMatrixApply(m,x,y,z,outx,outy,outz) \
( outx ) = ( x )*( m )[0] + ( y )*( m )[1] + ( z )*( m )[2] + ( m )[3];\
( outy ) = ( x )*( m )[4] + ( y )*( m )[5] + ( z )*( m )[6] + ( m )[7];\
( outz ) = ( x )*( m )[8] + ( y )*( m )[9] + ( z )*( m )[10] + ( m )[11]
#define MACRO_plDotProduct(x1,y1,z1,x2,y2,z2) \
((( x1 )*( x2 ))+(( y1 )*( y2 ))+(( z1 )*( z2 )))
#define MACRO_plNormalizeVector(x,y,z) { \
register double length; \
length = ( x )*( x )+( y )*( y )+( z )*( z ); \
if (length > 0.0000000001) { \
pl_Float l = (pl_Float) sqrt(length); \
( x ) /= l; \
( y ) /= l; \
( z ) /= l; \
} \
}
pl_uInt32 plRender_TriStats[4];
static pl_uInt32 _numfaces;
static _faceInfo _faces[PL_MAX_TRIANGLES];
static pl_Float _cMatrix[16];
static pl_uInt32 _numlights;
static _lightInfo _lights[PL_MAX_LIGHTS];
static pl_Cam *_cam;
static void _RenderObj(pl_Obj *, pl_Float *, pl_Float *);
static void _sift_down(int L, int U, int dir);
static void _hsort(_faceInfo *base, int nel, int dir);
void plRenderBegin(pl_Cam *Camera) {
pl_Float tempMatrix[16];
memset(plRender_TriStats,0,sizeof(plRender_TriStats));
_cam = Camera;
_numlights = 0;
_numfaces = 0;
plMatrixRotate(_cMatrix,2,-Camera->Pan);
plMatrixRotate(tempMatrix,1,-Camera->Pitch);
plMatrixMultiply(_cMatrix,tempMatrix);
plMatrixRotate(tempMatrix,3,-Camera->Roll);
plMatrixMultiply(_cMatrix,tempMatrix);
plClipSetFrustum(_cam);
}
void plRenderLight(pl_Light *light) {
pl_Float *pl, xp, yp, zp;
if (light->Type == PL_LIGHT_NONE || _numlights >= PL_MAX_LIGHTS) return;
pl = _lights[_numlights].l;
if (light->Type == PL_LIGHT_VECTOR) {
xp = light->Xp;
yp = light->Yp;
zp = light->Zp;
MACRO_plMatrixApply(_cMatrix,xp,yp,zp,pl[0],pl[1],pl[2]);
} else if (light->Type & PL_LIGHT_POINT) {
xp = light->Xp-_cam->X;
yp = light->Yp-_cam->Y;
zp = light->Zp-_cam->Z;
MACRO_plMatrixApply(_cMatrix,xp,yp,zp,pl[0],pl[1],pl[2]);
}
_lights[_numlights++].light = light;
}
static void _RenderObj(pl_Obj *obj, pl_Float *bmatrix, pl_Float *bnmatrix) {
pl_uInt32 i, x, facepos;
pl_Float nx = 0.0, ny = 0.0, nz = 0.0;
double tmp, tmp2;
pl_Float oMatrix[16], nMatrix[16], tempMatrix[16];
pl_Vertex *vertex;
pl_Face *face;
pl_Light *light;
if (obj->GenMatrix) {
plMatrixRotate(nMatrix,1,obj->Xa);
plMatrixRotate(tempMatrix,2,obj->Ya);
plMatrixMultiply(nMatrix,tempMatrix);
plMatrixRotate(tempMatrix,3,obj->Za);
plMatrixMultiply(nMatrix,tempMatrix);
memcpy(oMatrix,nMatrix,sizeof(pl_Float)*16);
} else memcpy(nMatrix,obj->RotMatrix,sizeof(pl_Float)*16);
if (bnmatrix) plMatrixMultiply(nMatrix,bnmatrix);
if (obj->GenMatrix) {
plMatrixTranslate(tempMatrix, obj->Xp, obj->Yp, obj->Zp);
plMatrixMultiply(oMatrix,tempMatrix);
} else memcpy(oMatrix,obj->Matrix,sizeof(pl_Float)*16);
if (bmatrix) plMatrixMultiply(oMatrix,bmatrix);
for (i = 0; i < PL_MAX_CHILDREN; i ++)
if (obj->Children[i]) _RenderObj(obj->Children[i],oMatrix,nMatrix);
if (!obj->NumFaces || !obj->NumVertices) return;
plMatrixTranslate(tempMatrix, -_cam->X, -_cam->Y, -_cam->Z);
plMatrixMultiply(oMatrix,tempMatrix);
plMatrixMultiply(oMatrix,_cMatrix);
plMatrixMultiply(nMatrix,_cMatrix);
x = obj->NumVertices;
vertex = obj->Vertices;
do {
MACRO_plMatrixApply(oMatrix,vertex->x,vertex->y,vertex->z,
vertex->xformedx, vertex->xformedy, vertex->xformedz);
MACRO_plMatrixApply(nMatrix,vertex->nx,vertex->ny,vertex->nz,
vertex->xformednx,vertex->xformedny,vertex->xformednz);
vertex++;
} while (--x);
face = obj->Faces;
facepos = _numfaces;
if (_numfaces + obj->NumFaces >= PL_MAX_TRIANGLES) // exceeded maximum face coutn
{
return;
}
plRender_TriStats[0] += obj->NumFaces;
_numfaces += obj->NumFaces;
x = obj->NumFaces;
do {
if (obj->BackfaceCull || face->Material->_st & PL_SHADE_FLAT)
{
MACRO_plMatrixApply(nMatrix,face->nx,face->ny,face->nz,nx,ny,nz);
}
if (!obj->BackfaceCull || (MACRO_plDotProduct(nx,ny,nz,
face->Vertices[0]->xformedx, face->Vertices[0]->xformedy,
face->Vertices[0]->xformedz) < 0.0000001)) {
if (plClipNeeded(face)) {
if (face->Material->_st & (PL_SHADE_FLAT|PL_SHADE_FLAT_DISTANCE)) {
tmp = face->sLighting;
if (face->Material->_st & PL_SHADE_FLAT) {
for (i = 0; i < _numlights; i ++) {
tmp2 = 0.0;
light = _lights[i].light;
if (light->Type & PL_LIGHT_POINT_ANGLE) {
double nx2 = _lights[i].l[0] - face->Vertices[0]->xformedx;
double ny2 = _lights[i].l[1] - face->Vertices[0]->xformedy;
double nz2 = _lights[i].l[2] - face->Vertices[0]->xformedz;
MACRO_plNormalizeVector(nx2,ny2,nz2);
tmp2 = MACRO_plDotProduct(nx,ny,nz,nx2,ny2,nz2)*light->Intensity;
}
if (light->Type & PL_LIGHT_POINT_DISTANCE) {
double nx2 = _lights[i].l[0] - face->Vertices[0]->xformedx;
double ny2 = _lights[i].l[1] - face->Vertices[0]->xformedy;
double nz2 = _lights[i].l[2] - face->Vertices[0]->xformedz;
if (light->Type & PL_LIGHT_POINT_ANGLE) {
nx2 = (1.0 - 0.5*((nx2*nx2+ny2*ny2+nz2*nz2)/
light->HalfDistSquared));
tmp2 *= plMax(0,plMin(1.0,nx2))*light->Intensity;
} else {
tmp2 = (1.0 - 0.5*((nx2*nx2+ny2*ny2+nz2*nz2)/
light->HalfDistSquared));
tmp2 = plMax(0,plMin(1.0,tmp2))*light->Intensity;
}
}
if (light->Type == PL_LIGHT_VECTOR)
tmp2 = MACRO_plDotProduct(nx,ny,nz,_lights[i].l[0],_lights[i].l[1],_lights[i].l[2])
* light->Intensity;
if (tmp2 > 0.0) tmp += tmp2;
else if (obj->BackfaceIllumination) tmp -= tmp2;
} /* End of light loop */
} /* End of flat shading if */
if (face->Material->_st & PL_SHADE_FLAT_DISTANCE)
tmp += 1.0-(face->Vertices[0]->xformedz+face->Vertices[1]->xformedz+
face->Vertices[2]->xformedz) /
(face->Material->FadeDist*3.0);
face->fShade = (pl_Float) tmp;
} else face->fShade = 0.0; /* End of flatmask lighting if */
if (face->Material->_ft & PL_FILL_ENVIRONMENT) {
face->eMappingU[0] = 32768 + (pl_sInt32) (face->Vertices[0]->xformednx*32768.0);
face->eMappingV[0] = 32768 - (pl_sInt32) (face->Vertices[0]->xformedny*32768.0);
face->eMappingU[1] = 32768 + (pl_sInt32) (face->Vertices[1]->xformednx*32768.0);
face->eMappingV[1] = 32768 - (pl_sInt32) (face->Vertices[1]->xformedny*32768.0);
face->eMappingU[2] = 32768 + (pl_sInt32) (face->Vertices[2]->xformednx*32768.0);
face->eMappingV[2] = 32768 - (pl_sInt32) (face->Vertices[2]->xformedny*32768.0);
}
if (face->Material->_st &(PL_SHADE_GOURAUD|PL_SHADE_GOURAUD_DISTANCE)) {
register pl_uChar a;
for (a = 0; a < 3; a ++) {
tmp = face->vsLighting[a];
if (face->Material->_st & PL_SHADE_GOURAUD) {
for (i = 0; i < _numlights ; i++) {
tmp2 = 0.0;
light = _lights[i].light;
if (light->Type & PL_LIGHT_POINT_ANGLE) {
nx = _lights[i].l[0] - face->Vertices[a]->xformedx;
ny = _lights[i].l[1] - face->Vertices[a]->xformedy;
nz = _lights[i].l[2] - face->Vertices[a]->xformedz;
MACRO_plNormalizeVector(nx,ny,nz);
tmp2 = MACRO_plDotProduct(face->Vertices[a]->xformednx,
face->Vertices[a]->xformedny,
face->Vertices[a]->xformednz,
nx,ny,nz) * light->Intensity;
}
if (light->Type & PL_LIGHT_POINT_DISTANCE) {
double nx2 = _lights[i].l[0] - face->Vertices[a]->xformedx;
double ny2 = _lights[i].l[1] - face->Vertices[a]->xformedy;
double nz2 = _lights[i].l[2] - face->Vertices[a]->xformedz;
if (light->Type & PL_LIGHT_POINT_ANGLE) {
double t= (1.0 - 0.5*((nx2*nx2+ny2*ny2+nz2*nz2)/light->HalfDistSquared));
tmp2 *= plMax(0,plMin(1.0,t))*light->Intensity;
} else {
tmp2 = (1.0 - 0.5*((nx2*nx2+ny2*ny2+nz2*nz2)/light->HalfDistSquared));
tmp2 = plMax(0,plMin(1.0,tmp2))*light->Intensity;
}
}
if (light->Type == PL_LIGHT_VECTOR)
tmp2 = MACRO_plDotProduct(face->Vertices[a]->xformednx,
face->Vertices[a]->xformedny,
face->Vertices[a]->xformednz,
_lights[i].l[0],_lights[i].l[1],_lights[i].l[2])
* light->Intensity;
if (tmp2 > 0.0) tmp += tmp2;
else if (obj->BackfaceIllumination) tmp -= tmp2;
} /* End of light loop */
} /* End of gouraud shading if */
if (face->Material->_st & PL_SHADE_GOURAUD_DISTANCE)
tmp += 1.0-face->Vertices[a]->xformedz/face->Material->FadeDist;
face->Shades[a] = (pl_Float) tmp;
} /* End of vertex loop for */
} /* End of gouraud shading mask if */
_faces[facepos].zd = face->Vertices[0]->xformedz+
face->Vertices[1]->xformedz+face->Vertices[2]->xformedz;
_faces[facepos++].face = face;
plRender_TriStats[1] ++;
} /* Is it in our area Check */
} /* Backface Check */
_numfaces = facepos;
face++;
} while (--x); /* Face loop */
}
void plRenderObj(pl_Obj *obj) {
_RenderObj(obj,0,0);
}
void plRenderEnd() {
_faceInfo *f;
if (_cam->Sort > 0) _hsort(_faces,_numfaces,0);
else if (_cam->Sort < 0) _hsort(_faces,_numfaces,1);
f = _faces;
while (_numfaces--) {
if (f->face->Material && f->face->Material->_PutFace)
{
plClipRenderFace(f->face);
}
f++;
}
_numfaces=0;
_numlights = 0;
}
static _faceInfo *Base, tmp;
static void _hsort(_faceInfo *base, int nel, int dir) {
static int i;
Base=base-1;
for (i=nel/2; i>0; i--) _sift_down(i,nel,dir);
for (i=nel; i>1; ) {
tmp = base[0]; base[0] = Base[i]; Base[i] = tmp;
_sift_down(1,i-=1,dir);
}
}
#define Comp(x,y) (( x ).zd < ( y ).zd ? 1 : 0)
static void _sift_down(int L, int U, int dir) {
static int c;
while (1) {
c=L+L;
if (c>U) break;
if ( (c < U) && dir^Comp(Base[c+1],Base[c])) c++;
if (dir^Comp(Base[L],Base[c])) return;
tmp = Base[L]; Base[L] = Base[c]; Base[c] = tmp;
L=c;
}
}
#undef Comp

49
Src/Winamp/plush/SPLINE.C Normal file
View file

@ -0,0 +1,49 @@
/******************************************************************************
Plush Version 1.2
spline.c
n-th Dimensional Spline Interpolator
Copyright (c) 1996-2000, Justin Frankel
******************************************************************************/
#include "plush.h"
void plSplineGetPoint(pl_Spline *s, pl_Float frame, pl_Float *out) {
pl_sInt32 i, i_1, i0, i1, i2;
pl_Float time1,time2,time3;
pl_Float t1,t2,t3,t4,u1,u2,u3,u4,v1,v2,v3;
pl_Float a,b,c,d;
pl_Float *keys = s->keys;
a = (1-s->tens)*(1+s->cont)*(1+s->bias);
b = (1-s->tens)*(1-s->cont)*(1-s->bias);
c = (1-s->tens)*(1-s->cont)*(1+s->bias);
d = (1-s->tens)*(1+s->cont)*(1-s->bias);
v1 = t1 = -a / 2.0; u1 = a;
u2 = (-6-2*a+2*b+c)/2.0; v2 = (a-b)/2.0; t2 = (4+a-b-c) / 2.0;
t3 = (-4+b+c-d) / 2.0;
u3 = (6-2*b-c+d)/2.0;
v3 = b/2.0;
t4 = d/2.0; u4 = -t4;
i0 = (pl_uInt) frame;
i_1 = i0 - 1;
while (i_1 < 0) i_1 += s->numKeys;
i1 = i0 + 1;
while (i1 >= s->numKeys) i1 -= s->numKeys;
i2 = i0 + 2;
while (i2 >= s->numKeys) i2 -= s->numKeys;
time1 = frame - (pl_Float) ((pl_uInt) frame);
time2 = time1*time1;
time3 = time2*time1;
i0 *= s->keyWidth;
i1 *= s->keyWidth;
i2 *= s->keyWidth;
i_1 *= s->keyWidth;
for (i = 0; i < s->keyWidth; i ++) {
a = t1*keys[i+i_1]+t2*keys[i+i0]+t3*keys[i+i1]+t4*keys[i+i2];
b = u1*keys[i+i_1]+u2*keys[i+i0]+u3*keys[i+i1]+u4*keys[i+i2];
c = v1*keys[i+i_1]+v2*keys[i+i0]+v3*keys[i+i1];
*out++ = a*time3 + b*time2 + c*time1 + keys[i+i0];
}
}

123
Src/Winamp/plush/TEXT.C Normal file
View file

@ -0,0 +1,123 @@
/******************************************************************************
Plush Version 1.1
text.c
Text code and data (8xX bitmapped)
Copyright (c) 1996-2000, Justin Frankel
******************************************************************************/
#include "plush.h"
#include <stdarg.h>
static pl_uChar font_height = 16;
static pl_uChar *current_font = plText_DefaultFont;
void plTextSetFont(pl_uChar *font, pl_uChar height) {
current_font = font;
font_height = height;
}
void plTextPutChar(pl_Cam *cam, pl_sInt x, pl_sInt y, pl_Float z,
pl_uChar color, pl_uChar c) {
pl_uChar *font = current_font + (c*font_height);
pl_sInt offset = x+(y*cam->ScreenWidth);
pl_ZBuffer zz = (pl_ZBuffer) (1.0/z);
pl_sInt xx = x, a;
pl_uChar len = font_height;
pl_uChar ch;
pl_uChar *outmem;
pl_ZBuffer *zbuffer;
if (y+font_height < cam->ClipTop || y >= cam->ClipBottom) return;
if (y < cam->ClipTop) {
font += (cam->ClipTop-y);
offset += (cam->ClipTop-y)*cam->ScreenWidth;
len -= (cam->ClipTop-y);
y = cam->ClipTop;
}
if (y+font_height >= cam->ClipBottom) {
len = cam->ClipBottom-y;
}
if (len > 0) {
if (cam->zBuffer && z != 0.0) do {
outmem = cam->frameBuffer + offset;
zbuffer = cam->zBuffer + offset;
offset += cam->ScreenWidth;
xx = x;
ch = *font++;
a = 128;
while (a) {
if (xx >= cam->ClipRight) break;
if (xx++ >= cam->ClipLeft)
if (ch & a)
if (zz > *zbuffer) {
*zbuffer = zz;
*outmem = color;
}
zbuffer++;
outmem++;
a >>= 1;
}
if (a) break;
} while (--len);
else do {
outmem = cam->frameBuffer + offset;
offset += cam->ScreenWidth;
xx = x;
ch = *font++;
a = 128;
while (a) {
if (xx >= cam->ClipRight) break;
if (xx++ >= cam->ClipLeft) if (ch & a) *outmem = color;
outmem++;
a >>= 1;
}
if (a) break;
} while (--len);
}
}
void plTextPutStr(pl_Cam *cam, pl_sInt x, pl_sInt y, pl_Float z,
pl_uChar color, pl_sChar *string) {
pl_sInt xx = x;
while (*string) {
switch (*string) {
case '\n': y += font_height; xx = x; break;
case ' ': xx += 8; break;
case '\r': break;
case '\t': xx += 8*5; break;
default:
plTextPutChar(cam,xx,y,z,color,(pl_uChar) *string);
xx += 8;
break;
}
string++;
}
}
void plTextPutStrW(pl_Cam* cam, pl_sInt x, pl_sInt y, pl_Float z,
pl_uChar color, const wchar_t* string) {
pl_sInt xx = x;
while (*string) {
switch (*string) {
case L'\n': y += font_height; xx = x; break;
case L' ': xx += 8; break;
case L'\r': break;
case L'\t': xx += 8 * 5; break;
default:
plTextPutChar(cam, xx, y, z, color, (pl_uChar)*string);
xx += 8;
break;
}
string++;
}
}
void plTextPrintf(pl_Cam *cam, pl_sInt x, pl_sInt y, pl_Float z,
pl_uChar color, pl_sChar *format, ...) {
va_list arglist;
pl_sChar str[256];
va_start(arglist, format);
vsprintf((char *)str, (char *) format,arglist);
va_end(arglist);
plTextPutStr(cam,x,y,z,color,str);
}