5 #include "3dgfx/3dgfx.h"
15 static int outcode(int x, int y, int xmin, int ymin, int xmax, int ymax)
32 #define FIXMUL(a, b) (((a) * (b)) >> 8)
33 #define FIXDIV(a, b) (((a) << 8) / (b))
35 #define LERP(a, b, t) ((a) + FIXMUL((b) - (a), (t)))
37 int clip_line(int *x0, int *y0, int *x1, int *y1, int xmin, int ymin, int xmax, int ymax)
41 int oc0 = outcode(*x0, *y0, xmin, ymin, xmax, ymax);
42 int oc1 = outcode(*x1, *y1, xmin, ymin, xmax, ymax);
44 long fx0, fy0, fx1, fy1, fxmin, fymin, fxmax, fymax;
46 if(!(oc0 | oc1)) return 1; /* both points are inside */
60 if(oc0 & oc1) return 0; /* both have points with the same outbit, not visible */
61 if(!(oc0 | oc1)) break; /* both points are inside */
63 oc_out = oc0 ? oc0 : oc1;
66 t = FIXDIV(fymin - fy0, fy1 - fy0);
67 x = LERP(fx0, fx1, t);
69 } else if(oc_out & BOTTOM) {
70 t = FIXDIV(fymax - fy0, fy1 - fy0);
71 x = LERP(fx0, fx1, t);
73 } else if(oc_out & LEFT) {
74 t = FIXDIV(fxmin - fx0, fx1 - fx0);
76 y = LERP(fy0, fy1, t);
77 } else /*if(oc_out & RIGHT)*/ {
78 t = FIXDIV(fxmax - fx0, fx1 - fx0);
80 y = LERP(fy0, fy1, t);
86 oc0 = outcode(fx0 >> 8, fy0 >> 8, xmin, ymin, xmax, ymax);
90 oc1 = outcode(fx1 >> 8, fy1 >> 8, xmin, ymin, xmax, ymax);
101 void draw_line(int x0, int y0, int x1, int y1, unsigned char color)
103 int i, dx, dy, x_inc, y_inc, error;
104 unsigned char *fb = framebuf;
106 fb += y0 * FB_WIDTH + x0;
126 for(i=0; i<=dx; i++) {
137 for(i=0; i<=dy; i++) {
149 void draw_billboard(float x, float y, float z, float size, int lum, int a)
154 g3d_matrix_mode(G3D_MODELVIEW);
157 g3d_translate(x, y, z);
159 g3d_get_matrix(G3D_MODELVIEW, m);
160 /* make the upper 3x3 part of the matrix identity */
161 m[0] = m[5] = m[10] = 1.0f;
162 m[1] = m[2] = m[3] = m[4] = m[6] = m[7] = m[8] = m[9] = 0.0f;
165 g3d_begin(G3D_QUADS);
168 g3d_vertex(-size, -size, 0);
170 g3d_vertex(size, -size, 0);
172 g3d_vertex(size, size, 0);
174 g3d_vertex(-size, size, 0);