FS2_Open
Open source remastering of the Freespace 2 engine
line.h
Go to the documentation of this file.
1 /*
2  * Copyright (C) Volition, Inc. 1999. All rights reserved.
3  *
4  * All source code herein is the property of Volition, Inc. You may not sell
5  * or otherwise commercially exploit the source or things you created based on the
6  * source.
7  *
8 */
9 
10 
11 
12 #ifndef _LINE_H
13 #define _LINE_H
14 
15 //void gr8_line(int x1,int y1,int x2,int y2, bool b);
16 //void gr8_aaline(vertex *v1, vertex *v2);
17 
18 
19 #define INT_EXCHG(a,b) do { \
20  int __temp__ = (a); \
21  (a) = (b); \
22  (b) = __temp__; \
23 } while(0)
24 
25 //#define INT_SCALE(var,arg,num,den) ((var) = ((arg) * (num)) / (den))
26 #define INT_SCALE(var,arg,num,den) ((var) = MulDiv(arg, num, den))
27 
28 #define INT_CLIPLINE(x1,y1,x2,y2,XMIN,YMIN,XMAX,YMAX,WHEN_OUTSIDE,WHEN_CLIPPED,WHEN_SWAPPED) do { \
29  int temp; \
30  \
31  if(y1 > y2) \
32  { INT_EXCHG(y1,y2); INT_EXCHG(x1,x2); WHEN_SWAPPED; } \
33  if((y2 < YMIN) || (y1 > YMAX)) \
34  { WHEN_OUTSIDE; } \
35  if(x1 < x2) { \
36  if((x2 < XMIN) || (x1 > XMAX)) { \
37  WHEN_OUTSIDE; \
38  } \
39  if(x1 < XMIN) { \
40  INT_SCALE(temp,(y2 - y1),(XMIN - x1),(x2 - x1)); \
41  if((y1 += temp) > YMAX) { WHEN_OUTSIDE; } \
42  x1 = XMIN; \
43  WHEN_CLIPPED; \
44  } \
45  if(x2 > XMAX) { \
46  INT_SCALE(temp,(y2 - y1),(x2 - XMAX),(x2 - x1)); \
47  if((y2 -= temp) < YMIN) { WHEN_OUTSIDE; } \
48  x2 = XMAX; \
49  WHEN_CLIPPED; \
50  } \
51  if(y1 < YMIN) { \
52  INT_SCALE(temp,(x2 - x1),(YMIN - y1),(y2 - y1)); \
53  x1 += temp; \
54  y1 = YMIN; \
55  WHEN_CLIPPED; \
56  } \
57  if(y2 > YMAX) { \
58  INT_SCALE(temp,(x2 - x1),(y2 - YMAX),(y2 - y1)); \
59  x2 -= temp; \
60  y2 = YMAX; \
61  WHEN_CLIPPED; \
62  } \
63  } \
64  else { \
65  if((x1 < XMIN) || (x2 > XMAX)) { \
66  WHEN_OUTSIDE; \
67  } \
68  if(x1 > XMAX) { \
69  INT_SCALE(temp,(y2 - y1),(x1 - XMAX),(x1 - x2)); \
70  if((y1 += temp) > YMAX) { WHEN_OUTSIDE; } \
71  x1 = XMAX; \
72  WHEN_CLIPPED; \
73  } \
74  if(x2 < XMIN) { \
75  INT_SCALE(temp,(y2 - y1),(XMIN - x2),(x1 - x2)); \
76  if((y2 -= temp) < YMIN) { WHEN_OUTSIDE; } \
77  x2 = XMIN; \
78  WHEN_CLIPPED; \
79  } \
80  if(y1 < YMIN) { \
81  INT_SCALE(temp,(x1 - x2),(YMIN - y1),(y2 - y1)); \
82  x1 -= temp; \
83  y1 = YMIN; \
84  WHEN_CLIPPED; \
85  } \
86  if(y2 > YMAX) { \
87  INT_SCALE(temp,(x1 - x2),(y2 - YMAX),(y2 - y1)); \
88  x2 += temp; \
89  y2 = YMAX; \
90  WHEN_CLIPPED; \
91  } \
92  } \
93 } while(0)
94 
95 #define FL_EXCHG(a,b) do { \
96  float __temp__ = (a); \
97  (a) = (b); \
98  (b) = __temp__; \
99 } while(0)
100 
101 #define FL_SCALE(var,arg,num,den) ((var) = ((arg) * (num)) / (den))
102 
103 #define FL_CLIPLINE(x1,y1,x2,y2,XMIN,YMIN,XMAX,YMAX,WHEN_OUTSIDE,WHEN_CLIPPED,WHEN_SWAPPED) do { \
104  float temp; \
105  \
106  if(y1 > y2) \
107  { FL_EXCHG(y1,y2); FL_EXCHG(x1,x2); WHEN_SWAPPED; } \
108  if((y2 < YMIN) || (y1 > YMAX)) \
109  { WHEN_OUTSIDE; } \
110  if(x1 < x2) { \
111  if((x2 < XMIN) || (x1 > XMAX)) { \
112  WHEN_OUTSIDE; \
113  } \
114  if(x1 < XMIN) { \
115  FL_SCALE(temp,(y2 - y1),(XMIN - x1),(x2 - x1)); \
116  if((y1 += temp) > YMAX) { WHEN_OUTSIDE; } \
117  x1 = XMIN; \
118  WHEN_CLIPPED; \
119  } \
120  if(x2 > XMAX) { \
121  FL_SCALE(temp,(y2 - y1),(x2 - XMAX),(x2 - x1)); \
122  if((y2 -= temp) < YMIN) { WHEN_OUTSIDE; } \
123  x2 = XMAX; \
124  WHEN_CLIPPED; \
125  } \
126  if(y1 < YMIN) { \
127  FL_SCALE(temp,(x2 - x1),(YMIN - y1),(y2 - y1)); \
128  x1 += temp; \
129  y1 = YMIN; \
130  WHEN_CLIPPED; \
131  } \
132  if(y2 > YMAX) { \
133  FL_SCALE(temp,(x2 - x1),(y2 - YMAX),(y2 - y1)); \
134  x2 -= temp; \
135  y2 = YMAX; \
136  WHEN_CLIPPED; \
137  } \
138  } \
139  else { \
140  if((x1 < XMIN) || (x2 > XMAX)) { \
141  WHEN_OUTSIDE; \
142  } \
143  if(x1 > XMAX) { \
144  FL_SCALE(temp,(y2 - y1),(x1 - XMAX),(x1 - x2)); \
145  if((y1 += temp) > YMAX) { WHEN_OUTSIDE; } \
146  x1 = XMAX; \
147  WHEN_CLIPPED; \
148  } \
149  if(x2 < XMIN) { \
150  FL_SCALE(temp,(y2 - y1),(XMIN - x2),(x1 - x2)); \
151  if((y2 -= temp) < YMIN) { WHEN_OUTSIDE; } \
152  x2 = XMIN; \
153  WHEN_CLIPPED; \
154  } \
155  if(y1 < YMIN) { \
156  FL_SCALE(temp,(x1 - x2),(YMIN - y1),(y2 - y1)); \
157  x1 -= temp; \
158  y1 = YMIN; \
159  WHEN_CLIPPED; \
160  } \
161  if(y2 > YMAX) { \
162  FL_SCALE(temp,(x1 - x2),(y2 - YMAX),(y2 - y1)); \
163  x2 += temp; \
164  y2 = YMAX; \
165  WHEN_CLIPPED; \
166  } \
167  } \
168 } while(0)
169 
170 #endif