brender-1997/softrend/zsrmacro.h
2022-05-03 14:31:40 -07:00

102 lines
2.4 KiB
C

/*
* Copyright (c) 1993-1995 Argonaut Technologies Limited. All rights reserved.
*
* $Id: zsrmacro.h 2.2 1996/02/17 17:53:25 sam Exp $
* $Locker: $
*
*/
#ifndef _ZSRMACRO_H_
#define _ZSRMACRO_H_
#ifdef __cplusplus
extern "C" {
#endif
#define VIEW_Z(v) ((v)->comp[C_W])
/*
* Calculate the sort value for a triangle
*/
#define SORT_VALUE_TRIANGLE(type,v0,v1,v2) do { \
zprim=VIEW_Z(v0); \
switch(type) { \
case BR_SORT_MIN: \
if(VIEW_Z(v1) < zprim) zprim = VIEW_Z(v1); \
if(VIEW_Z(v2) < zprim) zprim = VIEW_Z(v2); \
break; \
case BR_SORT_MAX: \
if(VIEW_Z(v1)>zprim) zprim=VIEW_Z(v1); \
if(VIEW_Z(v2)>zprim) zprim=VIEW_Z(v2); \
break; \
case BR_SORT_AVERAGE: \
zprim=BR_ADD(zprim,BR_ADD(VIEW_Z(v1),VIEW_Z(v2))); \
zprim=BR_MUL(zprim,BR_SCALAR(1.0/3.0)); \
break; \
case BR_SORT_FIRST_VERTEX: \
break; \
} \
} while(0)
/*
* Calculate the sort value for an edge
*/
#define SORT_VALUE_EDGE(type,z0,z1) do { \
zprim=VIEW_Z(v0); \
switch(type) { \
case BR_SORT_MIN: \
if(VIEW_Z(v1)<zprim) zprim=VIEW_Z(v1); \
break; \
case BR_SORT_MAX: \
if(VIEW_Z(v1)>zprim) zprim=VIEW_Z(v1); \
break; \
case BR_SORT_AVERAGE: \
zprim=BR_ADD(zprim,VIEW_Z(v1)); \
zprim=BR_MUL(zprim,BR_SCALAR(1.0/2.0)); \
break; \
case BR_SORT_FIRST_VERTEX: \
break; \
} \
} while(0)
#define SORT_VALUE_POINT(type,z0) zprim = VIEW_Z(v0)
/*
* Insert a primitive at the head of the first bucket
*/
#define INSERT_PRIMITIVE_FIRST_BUCKET(ot,prim,depth) do { \
(prim)->next=(ot)->table[0]; \
(ot)->table[0]=(prim); \
} while(0)
/*
* Insert a primitive at the head of the correct bucket
*/
#define INSERT_PRIMITIVE_HEAD(ot,prim,depth) do { \
int bucket; \
(depth)=BR_SUB((depth),(ot)->min_z); \
if((depth)<BR_SCALAR(0.0)) { \
bucket = 0; \
} else { \
bucket = BrScalarToInt(BR_MUL((ot)->scale,(depth))); \
if(bucket >= (ot)->size) \
bucket = (ot)->size-1; \
} \
(prim)->next=(ot)->table[bucket]; \
(ot)->table[bucket]=(prim); \
} while(0)
/*
* Insert a primitive into the current order table
*/
#define INSERT_PRIMITIVE(ot, prim, depth) do { \
if((ot)->flags & BR_ORDER_TABLE_CONVEX) \
INSERT_PRIMITIVE_FIRST_BUCKET(ot,prim,depth); \
else \
INSERT_PRIMITIVE_HEAD(ot,prim,depth); \
} while(0)
#ifdef __cplusplus
};
#endif
#endif