208 lines
4.9 KiB
C
208 lines
4.9 KiB
C
/*
|
|
* Copyright (c) 1993-1995 Argonaut Technologies Limited. All rights reserved.
|
|
*
|
|
* $Id: WORK.H 1.7 1997/05/20 17:07:52 JOHNG Exp $
|
|
* $Locker: $
|
|
*
|
|
* Private work area and parameters for primitives
|
|
*/
|
|
#ifndef _WORK_H_
|
|
#define _WORK_H_
|
|
|
|
#define SCREEN_FIXED 1
|
|
|
|
/*
|
|
* Scan convertion details for one edge of triangle
|
|
*/
|
|
struct scan_edge {
|
|
br_fixed_ls x; /* delta x along edge */
|
|
br_fixed_ls y; /* delta y along edge */
|
|
br_fixed_ls grad; /* gradient (x/y) */
|
|
br_int_32 f; /* Starting value (fraction) */
|
|
br_int_32 i; /* (integer) */
|
|
br_int_32 d_f; /* delta_x per scanline (fraction) */
|
|
br_int_32 d_i; /* (integer) */
|
|
br_int_32 start; /* starting scanline */
|
|
br_int_32 count; /* total scanlines */
|
|
};
|
|
|
|
/*
|
|
* Scan convertion details for one parameter
|
|
*/
|
|
struct scan_parameter {
|
|
br_fixed_ls currentpix; /* Parameter (16.16) value at pixel */
|
|
br_fixed_ls current; /* Parameter (16.16) value at start of scanline */
|
|
br_fixed_ls d_carry; /* Increment per scanline if carry from bit 15 */
|
|
br_fixed_ls d_nocarry; /* "" "" no carry "" */
|
|
br_fixed_ls grad_x; /* Gradient of parameter along X axis */
|
|
br_fixed_ls grad_y; /* Gradient of parameter along Y axis */
|
|
};
|
|
|
|
/*
|
|
* Arbitrary width scan line data
|
|
*/
|
|
struct arbitrary_width_scan {
|
|
struct scan_edge *edge;
|
|
char *start,*end;
|
|
char *zstart;
|
|
char *source_current;
|
|
short u_int_current;
|
|
short pad;
|
|
unsigned u_current,du,du_carry,du_nocarry;
|
|
int du_int,du_int_nocarry,du_int_carry;
|
|
unsigned v_current,dv,dv_carry,dv_nocarry;
|
|
int dsource,dsource_carry,dsource_nocarry;
|
|
};
|
|
|
|
/*
|
|
* Perspective texture mapper data
|
|
*/
|
|
struct perspective_scan {
|
|
char *start;
|
|
char *dest;
|
|
char *end;
|
|
char *zstart;
|
|
char *zdest;
|
|
int i;
|
|
int di;
|
|
int z;
|
|
int dz;
|
|
int source;
|
|
int direction;
|
|
int denominator;
|
|
int ddenominator;
|
|
int u_numerator;
|
|
int v_numerator;
|
|
int du_numerator;
|
|
int dv_numerator;
|
|
int du_numerator_nocarry;
|
|
int dv_numerator_nocarry;
|
|
int y; /***********/
|
|
};
|
|
|
|
/*
|
|
* A minimal description of a pixelmap (with all origins and
|
|
* bases factored out)
|
|
*/
|
|
struct render_buffer {
|
|
void * base; /* 0,0 pixel */
|
|
br_uint_16 sel; /* Optional segment */
|
|
br_uint_8 type; /* Original pixelmap type */
|
|
br_uint_8 bpp; /* Bytes per pixel */
|
|
br_uint_32 width_b; /* In bytes */
|
|
br_uint_32 width_p; /* In pixels */
|
|
br_uint_32 height; /* In scanlines */
|
|
br_int_32 stride_b; /* In bytes */
|
|
br_int_32 stride_p; /* In pixels */
|
|
br_uint_32 size; /* stride * width_bytes */
|
|
|
|
br_uint_32 *palette; /* Colour map, if valid */
|
|
br_int_32 palette_size; /* Number of entries in map */
|
|
|
|
br_uint_8 width_s; /* Power of 2 for width */
|
|
br_uint_8 height_s; /* Power of 2 for height */
|
|
br_uint_8 tile_s; /* Number of V bits to tile */
|
|
br_uint_8 _pad0;
|
|
};
|
|
|
|
/*
|
|
* Static work area for renderers
|
|
*/
|
|
typedef struct prim_work {
|
|
/*
|
|
* Buffers
|
|
*/
|
|
struct render_buffer colour;
|
|
struct render_buffer bump;
|
|
struct render_buffer depth;
|
|
struct render_buffer texture;
|
|
|
|
/*
|
|
* Lookup tables
|
|
*/
|
|
br_uint_8 *shade_table;
|
|
br_uint_8 *blend_table;
|
|
br_uint_32 *lighting_table;
|
|
br_uint_32 *screendoor_table;
|
|
br_uint_8 *fog_table;
|
|
|
|
br_uint_8 shade_type;
|
|
br_uint_8 blend_type;
|
|
br_uint_8 lighting_type;
|
|
br_uint_8 screendoor_type;
|
|
br_uint_8 fog_type;
|
|
|
|
/*
|
|
* Workspace for triangle scan converter
|
|
*/
|
|
struct scan_edge main; /* Long edge of triangle */
|
|
struct scan_edge top; /* Top short edge */
|
|
struct scan_edge bot; /* Bottom short edge */
|
|
|
|
struct scan_parameter pz; /* Depth */
|
|
|
|
struct scan_parameter pu; /* Mapping */
|
|
struct scan_parameter pv;
|
|
|
|
struct scan_parameter pi; /* Index */
|
|
|
|
struct scan_parameter pr; /* Red */
|
|
struct scan_parameter pg; /* Green */
|
|
struct scan_parameter pb; /* Blue */
|
|
|
|
struct scan_parameter pq; /* Perspective divisor */
|
|
|
|
struct scan_parameter source; /* Current texel */
|
|
|
|
/*
|
|
* Global arbitrary width scan line data
|
|
*/
|
|
struct arbitrary_width_scan awsl;
|
|
|
|
/*
|
|
* Perspective texture mapper globals
|
|
*/
|
|
struct perspective_scan tsl;
|
|
|
|
/*
|
|
* Base and range for decal
|
|
*/
|
|
br_int_32 decal_index_base;
|
|
br_int_32 decal_index_range;
|
|
br_int_32 decal_shade_height;
|
|
|
|
/*
|
|
* support for non textured materials that use the shade table
|
|
*/
|
|
|
|
br_int_32 index_base;
|
|
br_int_32 index_range;
|
|
|
|
/*
|
|
* Timestamps of input and output state that work buffers are based on
|
|
*/
|
|
br_uint_32 timestamp_prim;
|
|
br_uint_32 timestamp_out;
|
|
} _prim_work;
|
|
|
|
extern _prim_work BR_ASM_DATA work;
|
|
|
|
/*
|
|
* New line and point clamps
|
|
*/
|
|
#define CLAMP_LP(x,y) { \
|
|
if (x<0) x = 0; \
|
|
if (y<0) y = 0; \
|
|
if (x>=work.colour.width_p) \
|
|
x--; \
|
|
if (y>=work.colour.height) \
|
|
y--; \
|
|
}
|
|
|
|
typedef struct prim_work * BR_EXPORT br_work_fn(void);
|
|
|
|
#ifdef __cplusplus
|
|
};
|
|
#endif
|
|
#endif
|
|
|