339 lines
7.2 KiB
C
339 lines
7.2 KiB
C
/*
|
|
* Copyright (c) 1993-1995 Argonaut Technologies Limited. All rights reserved.
|
|
*
|
|
* $Id: P_PIZ.C 1.3 1996/12/10 16:18:54 jon Exp $
|
|
* $Locker: $
|
|
*
|
|
* Mesh rendering to produce points
|
|
*/
|
|
#include "drv.h"
|
|
#include "shortcut.h"
|
|
#include "blockops.h"
|
|
|
|
static char rscid[] = "$Id: P_PIZ.C 1.3 1996/12/10 16:18:54 jon Exp $";
|
|
|
|
#define ScalarsToRGB15(r,g,b) \
|
|
(((b) >> 19) & 0x1f | ((g) >> 14) & 0x3e0 | ((r) >> 9) & 0x7c00)
|
|
|
|
#define ScalarsToRGB16(r,g,b) \
|
|
(((b) >> 19) & 0x1f | ((g) >> 13) & 0x7c0 | ((r) >> 8) & 0xf800)
|
|
|
|
#define ScalarsToRGB24(r,g,b) \
|
|
(((b) >> 16) & 0xff | ((g) >> 8) & 0xff00 | ((r) >> 8) & 0xff0000)
|
|
|
|
#define SETUP_POINT \
|
|
x0 = BrFixedToInt(tvp->comp_x[C_SX]); \
|
|
y0 = BrFixedToInt(tvp->comp_x[C_SY]); \
|
|
CLAMP_LP(x0,y0);
|
|
|
|
#define SETUP_TEXTURE \
|
|
width = work.texture.width_p; \
|
|
height = work.texture.height; \
|
|
stride = work.texture.stride_b;
|
|
|
|
/*
|
|
* Setup arbitrary width u and v
|
|
*/
|
|
#define SETUP_UV \
|
|
pu = tvp->comp_x[C_U] % BrIntToFixed(width); \
|
|
if (pu<0) \
|
|
pu += BrIntToFixed(width); \
|
|
pv = tvp->comp_x[C_V] % BrIntToFixed(height); \
|
|
if (pv<0) \
|
|
pv += BrIntToFixed(height);
|
|
|
|
/*
|
|
* Set up RGB
|
|
*/
|
|
#define SETUP_RGB \
|
|
pr = tvp->comp_x[C_R]; \
|
|
pg = tvp->comp_x[C_G]; \
|
|
pb = tvp->comp_x[C_B];
|
|
|
|
#if PARTS & PART_8Z
|
|
/*
|
|
* 8 bit z-buffered points
|
|
*/
|
|
void BR_ASM_CALL PointRenderPIZ2(struct brp_block *block, union brp_vertex *tvp)
|
|
{
|
|
int o;
|
|
int x0,y0;
|
|
unsigned short pz;
|
|
|
|
SETUP_POINT;
|
|
|
|
pz = (unsigned short)(tvp->comp_x[C_SZ] >> 16) ^ 0x8000;
|
|
|
|
o = y0*work.colour.stride_b+x0;
|
|
|
|
if(((unsigned short *)work.depth.base)[o] > pz) {
|
|
((unsigned short *)work.depth.base)[o] = pz;
|
|
((char *)work.colour.base)[o] = BrFixedToInt(tvp->comp_x[C_I]);
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#if PARTS & PART_8Z
|
|
void BR_ASM_CALL PointRenderPIZ2TI(struct brp_block *block, union brp_vertex *tvp)
|
|
{
|
|
int o;
|
|
int x0,y0;
|
|
br_fixed_ls width,height,stride,pi,pu,pv;
|
|
unsigned short pz;
|
|
char texel;
|
|
|
|
SETUP_POINT;
|
|
SETUP_TEXTURE;
|
|
SETUP_UV;
|
|
|
|
pi = tvp->comp_x[C_I];
|
|
pz = (unsigned short)(tvp->comp_x[C_SZ] >> 16) ^ 0x8000;
|
|
|
|
o = y0*work.colour.stride_b+x0;
|
|
|
|
if(((unsigned short *)work.depth.base)[o] > pz) {
|
|
texel = ((char *)work.texture.base)[(pv>>16)*width+(pu>>16)];
|
|
if (texel) {
|
|
((unsigned short *)work.depth.base)[o] = pz;
|
|
((char *)work.colour.base)[o] = work.shade_table[256*(pi>>16)+texel];
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#if PARTS & PART_8Z
|
|
/*
|
|
* 8 bit textured points
|
|
*/
|
|
void BR_ASM_CALL PointRenderPIZ2T(struct brp_block *block, union brp_vertex *tvp)
|
|
{
|
|
int o;
|
|
int x0,y0;
|
|
br_fixed_ls width,height,stride,pu,pv;
|
|
unsigned short pz;
|
|
char texel;
|
|
|
|
SETUP_POINT;
|
|
SETUP_TEXTURE;
|
|
SETUP_UV;
|
|
|
|
pz = (unsigned short)(tvp->comp_x[C_SZ] >> 16) ^ 0x8000;
|
|
|
|
o = y0*work.colour.stride_b+x0;
|
|
|
|
if(((unsigned short *)work.depth.base)[o] > pz) {
|
|
texel = ((char *)work.texture.base)[(pv>>16)*stride+(pu>>16)];
|
|
if (texel) {
|
|
((unsigned short *)work.depth.base)[o] = pz;
|
|
((char *)work.colour.base)[o] = texel;
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
typedef enum {
|
|
LINE_RGB,LINE_TEXTURE
|
|
} point_type;
|
|
|
|
#if PARTS & PART_24Z
|
|
/*
|
|
* 24 bit point renderer
|
|
*/
|
|
void BR_ASM_CALL PointRenderPIZ2_Generic_RGB_888(point_type mode,union brp_vertex *tvp)
|
|
{
|
|
int oc,oz;
|
|
int x0,y0;
|
|
br_fixed_ls width,height,stride,pi,pu,pv,pr,pg,pb;
|
|
unsigned short pz;
|
|
char *texel;
|
|
|
|
SETUP_POINT;
|
|
|
|
if (mode==LINE_RGB) {
|
|
SETUP_RGB;
|
|
}
|
|
|
|
if (mode==LINE_TEXTURE) {
|
|
|
|
/* Textured */
|
|
|
|
SETUP_TEXTURE;
|
|
SETUP_UV;
|
|
|
|
}
|
|
|
|
pz = (unsigned short)(tvp->comp_x[C_SZ] >> 16) ^ 0x8000;
|
|
|
|
oc = y0*work.colour.stride_b+3*x0;
|
|
oz = y0*work.depth.stride_b+x0+x0;
|
|
|
|
if(*(unsigned short *)((char *)work.depth.base+oz) > pz) {
|
|
if (mode==LINE_TEXTURE) {
|
|
texel = ((char *)work.texture.base)+(pv>>16)*stride+3*(pu>>16);
|
|
if (texel[0] || texel[1] || texel[2]) {
|
|
*(unsigned short *)((char *)work.depth.base+oz) = pz;
|
|
((char *)work.colour.base)[oc] = texel[0];
|
|
((char *)work.colour.base)[oc+1] = texel[1];
|
|
((char *)work.colour.base)[oc+2] = texel[2];
|
|
}
|
|
} else {
|
|
*(unsigned short *)((char *)work.depth.base+oz) = pz;
|
|
((char *)work.colour.base)[oc] = pb>>16;
|
|
((char *)work.colour.base)[oc+1] = pg>>16;
|
|
((char *)work.colour.base)[oc+2] = pr>>16;
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#if PARTS & PART_24Z
|
|
/*
|
|
* 24 bit coloured points
|
|
*/
|
|
void BR_ASM_CALL PointRenderPIZ2_RGB_888(struct brp_block *block, union brp_vertex *tvp) {
|
|
PointRenderPIZ2_Generic_RGB_888(LINE_RGB,tvp);
|
|
}
|
|
#endif
|
|
|
|
#if PARTS & PART_24Z
|
|
/*
|
|
* 24 bit textured points
|
|
*/
|
|
void BR_ASM_CALL PointRenderPIZ2T_RGB_888(struct brp_block *block, union brp_vertex *tvp) {
|
|
PointRenderPIZ2_Generic_RGB_888(LINE_TEXTURE,tvp);
|
|
}
|
|
#endif
|
|
|
|
#if PARTS & PART_15Z
|
|
/*
|
|
* 24 bit points
|
|
*/
|
|
void BR_ASM_CALL PointRenderPIZ2_Generic_RGB_555(point_type mode,union brp_vertex *tvp)
|
|
{
|
|
int oc,oz;
|
|
int x0,y0;
|
|
br_fixed_ls width,height,stride,pi,pu,pv,pr,pg,pb;
|
|
unsigned short pz;
|
|
unsigned short texel;
|
|
|
|
SETUP_POINT;
|
|
|
|
if (mode==LINE_RGB) {
|
|
SETUP_RGB;
|
|
}
|
|
|
|
if (mode==LINE_TEXTURE) {
|
|
|
|
/* Textured */
|
|
|
|
SETUP_TEXTURE;
|
|
SETUP_UV;
|
|
|
|
}
|
|
|
|
pz = (unsigned short)(tvp->comp_x[C_SZ] >> 16) ^ 0x8000;
|
|
|
|
oc = y0*work.colour.stride_b+2*x0;
|
|
oz = y0*work.depth.stride_b+x0+x0;
|
|
|
|
if(*(unsigned short *)((char *)work.depth.base+oz) > pz) {
|
|
if (mode==LINE_TEXTURE) {
|
|
|
|
texel = *(unsigned short *)(((char *)work.texture.base)+(pv>>16)*stride+2*(pu>>16));
|
|
|
|
if (texel) {
|
|
*(unsigned short *)((char *)work.depth.base+oz) = pz;
|
|
*(unsigned short *)(((char *)work.colour.base)+oc) = texel;
|
|
}
|
|
} else {
|
|
*(unsigned short *)((char *)work.depth.base+oz) = pz;
|
|
*(unsigned short *)(((char *)work.colour.base)+oc) = ScalarsToRGB15(pr,pg,pb);
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#if PARTS & PART_15Z
|
|
/*
|
|
* 24 bit coloured points
|
|
*/
|
|
void BR_ASM_CALL PointRenderPIZ2_RGB_555(struct brp_block *block, union brp_vertex *tvp) {
|
|
PointRenderPIZ2_Generic_RGB_555(LINE_RGB,tvp);
|
|
}
|
|
#endif
|
|
|
|
#if PARTS & PART_15Z
|
|
/*
|
|
* 24 bit textured points
|
|
*/
|
|
void BR_ASM_CALL PointRenderPIZ2T_RGB_555(struct brp_block *block, union brp_vertex *tvp) {
|
|
PointRenderPIZ2_Generic_RGB_555(LINE_TEXTURE,tvp);
|
|
}
|
|
#endif
|
|
|
|
#if PARTS & PART_16Z
|
|
/*
|
|
* 24 bit points
|
|
*/
|
|
void BR_ASM_CALL PointRenderPIZ2_Generic_RGB_565(point_type mode,union brp_vertex *tvp)
|
|
{
|
|
int oc,oz;
|
|
int x0,y0;
|
|
br_fixed_ls width,height,stride,pi,pu,pv,pr,pg,pb;
|
|
unsigned short pz;
|
|
unsigned short texel;
|
|
|
|
SETUP_POINT;
|
|
|
|
if (mode==LINE_RGB) {
|
|
SETUP_RGB;
|
|
}
|
|
|
|
if (mode==LINE_TEXTURE) {
|
|
|
|
/* Textured */
|
|
|
|
SETUP_TEXTURE;
|
|
SETUP_UV;
|
|
|
|
}
|
|
|
|
pz = (unsigned short)(tvp->comp_x[C_SZ] >> 16) ^ 0x8000;
|
|
|
|
oc = y0*work.colour.stride_b+2*x0;
|
|
oz = y0*work.depth.stride_b+x0+x0;
|
|
|
|
if(*(unsigned short *)((char *)work.depth.base+oz) > pz) {
|
|
if (mode==LINE_TEXTURE) {
|
|
|
|
texel = *(unsigned short *)(((char *)work.texture.base)+(pv>>16)*stride+2*(pu>>16));
|
|
|
|
if (texel) {
|
|
*(unsigned short *)((char *)work.depth.base+oz) = pz;
|
|
*(unsigned short *)(((char *)work.colour.base)+oc) = texel;
|
|
}
|
|
} else {
|
|
*(unsigned short *)((char *)work.depth.base+oz) = pz;
|
|
*(unsigned short *)(((char *)work.colour.base)+oc) = ScalarsToRGB16(pr,pg,pb);
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
#if PARTS & PART_16Z
|
|
/*
|
|
* 24 bit coloured points
|
|
*/
|
|
void BR_ASM_CALL PointRenderPIZ2_RGB_565(struct brp_block *block, union brp_vertex *tvp) {
|
|
PointRenderPIZ2_Generic_RGB_565(LINE_RGB,tvp);
|
|
}
|
|
#endif
|
|
|
|
#if PARTS & PART_16Z
|
|
/*
|
|
* 24 bit textured points
|
|
*/
|
|
void BR_ASM_CALL PointRenderPIZ2T_RGB_565(struct brp_block *block, union brp_vertex *tvp) {
|
|
PointRenderPIZ2_Generic_RGB_565(LINE_TEXTURE,tvp);
|
|
}
|
|
#endif
|