diff options
-rw-r--r-- | apps/plugins/sdl/progs/quake/FixedPointMath.h | 246 | ||||
-rw-r--r-- | apps/plugins/sdl/progs/quake/d_polyse.c | 99 | ||||
-rw-r--r-- | apps/plugins/sdl/progs/quake/mathlib.h | 13 | ||||
-rw-r--r-- | apps/plugins/sdl/progs/quake/model.h | 14 | ||||
-rw-r--r-- | apps/plugins/sdl/progs/quake/quakedef.h | 12 | ||||
-rw-r--r-- | apps/plugins/sdl/progs/quake/r_bsp.c | 109 | ||||
-rw-r--r-- | apps/plugins/sdl/progs/quake/r_draw.c | 313 | ||||
-rw-r--r-- | apps/plugins/sdl/progs/quake/r_local.h | 9 | ||||
-rw-r--r-- | apps/plugins/sdl/progs/quake/r_main.c | 50 | ||||
-rw-r--r-- | apps/plugins/sdl/progs/quake/render.h | 9 |
10 files changed, 867 insertions, 7 deletions
diff --git a/apps/plugins/sdl/progs/quake/FixedPointMath.h b/apps/plugins/sdl/progs/quake/FixedPointMath.h new file mode 100644 index 0000000000..112b1a103b --- /dev/null +++ b/apps/plugins/sdl/progs/quake/FixedPointMath.h | |||
@@ -0,0 +1,246 @@ | |||
1 | #ifndef _FIXEDPOINTMATH_H | ||
2 | #define _FIXEDPOINTMATH_H | ||
3 | //Fixed point math routines (16.16) | ||
4 | //Dan East | ||
5 | //01-24-2001 | ||
6 | |||
7 | #define FPM_PI 205887L | ||
8 | #define FPM_2PI 411775L | ||
9 | #define FPM_E 178144L | ||
10 | #define FPM_ROOT2 74804L | ||
11 | #define FPM_ROOT3 113512L | ||
12 | #define FPM_GOLDEN 106039L | ||
13 | #define FPM_MAX 0x7fff0000 | ||
14 | |||
15 | |||
16 | typedef long fixedpoint_t; | ||
17 | typedef long fixedpoint8_24_t; | ||
18 | |||
19 | |||
20 | fixedpoint_t fpm_FromFloat(double f); | ||
21 | float fpm_ToFloat(fixedpoint_t fxp); | ||
22 | |||
23 | fixedpoint_t fpm_FromLong(long l); | ||
24 | long fpm_ToLong(fixedpoint_t fxp); | ||
25 | |||
26 | fixedpoint_t fpm_Add(fixedpoint_t fxp1, fixedpoint_t fxp2); | ||
27 | fixedpoint_t fpm_Add3(fixedpoint_t fxp1, fixedpoint_t fxp2, fixedpoint_t fxp3); | ||
28 | |||
29 | fixedpoint_t fpm_Sub(fixedpoint_t fxp1, fixedpoint_t fxp2); | ||
30 | |||
31 | fixedpoint_t fpm_Mul(fixedpoint_t fxp1, fixedpoint_t fxp2); | ||
32 | |||
33 | fixedpoint_t fpm_Div(fixedpoint_t fxp1, fixedpoint_t fxp2); | ||
34 | fixedpoint_t fpm_DivInt(fixedpoint_t fxp1, long l); | ||
35 | fixedpoint_t fpm_Abs(fixedpoint_t fxp); | ||
36 | |||
37 | fixedpoint_t fpm_Ceil(fixedpoint_t fxp); | ||
38 | fixedpoint_t fpm_Floor(fixedpoint_t fxp); | ||
39 | |||
40 | fixedpoint_t fpm_Sqrt(fixedpoint_t fxp); | ||
41 | fixedpoint_t fpm_Sqr(fixedpoint_t fxp); | ||
42 | |||
43 | fixedpoint_t fpm_Inv(fixedpoint_t fxp); | ||
44 | |||
45 | fixedpoint_t fpm_Sin(fixedpoint_t fxp); | ||
46 | fixedpoint_t fpm_Cos(fixedpoint_t fxp); | ||
47 | fixedpoint_t fpm_Tan(fixedpoint_t fxp); | ||
48 | fixedpoint_t fpm_ATan(fixedpoint_t fxp); | ||
49 | //These take degrees | ||
50 | fixedpoint_t fpm_SinDeg(fixedpoint_t fxp); | ||
51 | fixedpoint_t fpm_CosDeg(fixedpoint_t fxp); | ||
52 | fixedpoint_t fpm_TanDeg(fixedpoint_t fxp); | ||
53 | fixedpoint_t fpm_ATanDeg(fixedpoint_t fxp); | ||
54 | |||
55 | |||
56 | #define FPM_FROMFLOAT(f) fpm_FromFloat(f) | ||
57 | #define FPM_FROMFLOATC(f) ((long)((f) * 65536.0 )) //Constant version | ||
58 | #define FPM_TOFLOAT(fxp) fpm_ToFloat(fxp) | ||
59 | |||
60 | #define FPM_FROMLONG(l) fpm_FromLong(l) | ||
61 | #define FPM_FROMLONGC(l) ((l)<<16) //Constant version | ||
62 | #define FPM_TOLONG(l) fpm_ToLong(l) | ||
63 | |||
64 | #define FPM_ADD(f1, f2) fpm_Add(f1, f2) | ||
65 | #define FPM_ADD3(f1, f2, f3) fpm_Add3(f1, f2, f3) | ||
66 | #define FPM_INC(f1) ((f1)=FPM_ADD(f1, FPM_FROMLONG(1))) | ||
67 | |||
68 | #define FPM_SUB(f1, f2) fpm_Sub(f1, f2) | ||
69 | #define FPM_DEC(f1) ((f1)=FPM_SUB(f1, FPM_FROMLONG(1))) | ||
70 | |||
71 | #define FPM_MUL(f1, f2) fpm_Mul(f1, f2) | ||
72 | |||
73 | #define FPM_DIV(n, d) fpm_Div(n, d) | ||
74 | #define FPM_DIVINT(n, d) fpm_DivInt(n, d) | ||
75 | |||
76 | #define FPM_ABS(fxp) fpm_Abs(fxp) | ||
77 | |||
78 | #define FPM_CEIL(fxp) fpm_Ceil(fxp) | ||
79 | #define FPM_FLOOR(fxp) fpm_Floor(fxp) | ||
80 | |||
81 | #define FPM_SQRT(fxp) fpm_Sqrt(fxp) | ||
82 | #define FPM_SQR(fxp) fpm_Sqr(fxp) | ||
83 | |||
84 | #define FPM_INV(fxp) fpm_Inv(fxp) | ||
85 | |||
86 | //These take radians | ||
87 | #define FPM_SIN(r) fpm_Sin(r) | ||
88 | #define FPM_COS(r) fpm_Cos(r) | ||
89 | #define FPM_TAN(r) fpm_Tan(r) | ||
90 | #define FPM_ATAN(r) fpm_ATan(r) | ||
91 | |||
92 | //These take degrees | ||
93 | #define FPM_SIN_DEG(d) fpm_SinDeg(d) | ||
94 | #define FPM_COS_DEG(d) fpm_CosDeg(d) | ||
95 | #define FPM_TAN_DEG(d) fpm_TanDeg(d) | ||
96 | #define FPM_ATAN_DEG(d) fpm_ATanDeg(d) | ||
97 | |||
98 | fixedpoint8_24_t fpm_FromFloat(double f); | ||
99 | float fpm_ToFloat8_24(fixedpoint8_24_t fxp); | ||
100 | |||
101 | fixedpoint8_24_t fpm_FromLong8_24(long l); | ||
102 | long fpm_ToLong8_24(fixedpoint8_24_t fxp); | ||
103 | |||
104 | fixedpoint8_24_t fpm_FromFixedPoint(fixedpoint_t fxp); | ||
105 | fixedpoint_t fpm_ToFixedPoint(fixedpoint8_24_t fxp); | ||
106 | |||
107 | fixedpoint8_24_t fpm_Add8_24(fixedpoint8_24_t fxp1, fixedpoint8_24_t fxp2); | ||
108 | fixedpoint8_24_t fpm_Add38_24(fixedpoint8_24_t fxp1, fixedpoint8_24_t fxp2, fixedpoint8_24_t fxp3); | ||
109 | |||
110 | fixedpoint8_24_t fpm_Sub8_24(fixedpoint8_24_t fxp1, fixedpoint8_24_t fxp2); | ||
111 | |||
112 | fixedpoint8_24_t fpm_Mul8_24(fixedpoint8_24_t fxp1, fixedpoint8_24_t fxp2); | ||
113 | fixedpoint_t fpm_MulMixed8_24(fixedpoint8_24_t fxp1, fixedpoint_t fxp2); | ||
114 | |||
115 | fixedpoint8_24_t fpm_Div8_24(fixedpoint8_24_t fxp1, fixedpoint8_24_t fxp2); | ||
116 | fixedpoint8_24_t fpm_DivInt8_24(fixedpoint8_24_t fxp1, long l); | ||
117 | fixedpoint8_24_t fpm_DivInt64_8_24(fixedpoint8_24_t fxp1, long long l); | ||
118 | |||
119 | fixedpoint8_24_t fpm_Abs8_24(fixedpoint8_24_t fxp); | ||
120 | |||
121 | fixedpoint8_24_t fpm_Ceil8_24(fixedpoint8_24_t fxp); | ||
122 | fixedpoint8_24_t fpm_Floor8_24(fixedpoint8_24_t fxp); | ||
123 | |||
124 | fixedpoint8_24_t fpm_Sqrt8_24(fixedpoint8_24_t fxp); | ||
125 | fixedpoint8_24_t fpm_Sqr8_24(fixedpoint8_24_t fxp); | ||
126 | |||
127 | fixedpoint8_24_t fpm_Inv8_24(fixedpoint8_24_t fxp); | ||
128 | |||
129 | |||
130 | #define FPM_FROMFLOAT8_24(f) fpm_FromFloat8_24(f) | ||
131 | #define FPM_FROMFLOATC8_24(f) ((long)((f) * 16777216.0 )) //Constant version | ||
132 | #define FPM_TOFLOAT8_24(fxp) fpm_ToFloat8_24(fxp) | ||
133 | |||
134 | #define FPM_FROMLONG8_24(l) fpm_FromLong8_24(l) | ||
135 | #define FPM_FROMLONGC8_24(l) ((l)<<24) //Constant version | ||
136 | #define FPM_TOLONG8_24(l) fpm_ToLong8_24(l) | ||
137 | |||
138 | |||
139 | /* | ||
140 | extern __int64 FPM_TMPVAR_INT64; | ||
141 | |||
142 | #define FPM_FROMFLOAT(f) ((long)((f) * 65536.0 )) //+0.5 | ||
143 | #define FPM_TOFLOAT(fxp) (((float)(fxp)) / 65536.0) | ||
144 | |||
145 | #define FPM_FROMLONG(l) ((l)<<16) | ||
146 | #define FPM_TOLONG(l) ((l)<0?(-(long)((l)^0xffffffff)>>16):(((l)>>16)&0x0000ffff)) | ||
147 | |||
148 | #define FPM_ADD(f1, f2) ((f1)+(f2)) | ||
149 | #define FPM_ADD3(f1, f2, f3) ((f1)+(f2)+(f3)) | ||
150 | #define FPM_INC(f1) ((f1)=FPM_ADD(f1, FPM_FROMLONG(1))) | ||
151 | |||
152 | #define FPM_SUB(f1, f2) ((f1)-(f2)) | ||
153 | #define FPM_DEC(f1) ((f1)=FPM_SUB(f1, FPM_FROMLONG(1))) | ||
154 | |||
155 | #define FPM_MUL(f1, f2) (((f1)>>8)*((f2)>>8)) | ||
156 | //#define FPM_MUL(f1, f2) ((fixedpoint_t)((FPM_TMPVAR_INT64=(f1))*(f2))>>16) | ||
157 | //#define FPM_MUL(f1, f2) (((f1)*(f2))>>16) | ||
158 | //TODO: This needs to be done without copying to another var | ||
159 | #define FPM_DIV(n, d) ((fixedpoint_t)(((FPM_TMPVAR_INT64=(n))<<16)/d)) | ||
160 | #define FPM_DIVINT(n, d) ((fixedpoint_t)((n)/(d))) | ||
161 | //#define FPM_DIV(n, d) ((long)(((__int64)n)<<16)/(d)) | ||
162 | |||
163 | #define FPM_ABS(fxp) (abs(fxp)) | ||
164 | |||
165 | //TODO: could be more effecient | ||
166 | #define FPM_CEIL(fxp) ((fxp)&0x0000ffff?((fxp)<=0?((fxp)&0xffff0000):(((fxp)&0xffff0000)+FPM_FROMLONG(1))):(fxp)) | ||
167 | #define FPM_FLOOR(fxp) ((fxp)&0x0000ffff?((fxp)<0?(((fxp)&0xffff0000)-FPM_FROMLONG(1)):((fxp)&0xffff0000)):(fxp)) | ||
168 | |||
169 | //TODO: Implement sqrt mathematically instead of converting to float and back | ||
170 | #define FPM_SQRT(fxp) (FPM_FROMFLOAT(sqrt(FPM_TOFLOAT(fxp)))) | ||
171 | #define FPM_SQR(fxp) (FPM_MUL(fxp,fxp)>>16) | ||
172 | |||
173 | #define FPM_INV(fxp) (FPM_DIV(0x10000, fxp)) | ||
174 | //TODO: Calc trig functions (or lookup) instead of converting to float and back | ||
175 | //These take radians | ||
176 | #define FPM_SIN(r) (FPM_FROMFLOAT(sin(FPM_TOFLOAT(r)))) | ||
177 | #define FPM_COS(r) (FPM_FROMFLOAT(cos(FPM_TOFLOAT(r)))) | ||
178 | #define FPM_TAN(r) (FPM_FROMFLOAT(tan(FPM_TOFLOAT(r)))) | ||
179 | #define FPM_ATAN(r) (FPM_FROMFLOAT(atan(FPM_TOFLOAT(r)))) | ||
180 | |||
181 | //These take degrees | ||
182 | #define FPM_SIN_DEG(d) (FPM_SIN(FPM_DIV(FPM_MUL(d,FPM_PI),0xB40000))) //0xB40000 = 180.0 | ||
183 | #define FPM_COS_DEG(d) (FPM_COS(FPM_DIV(FPM_MUL(d,FPM_PI),0xB40000))) | ||
184 | #define FPM_TAN_DEG(d) (FPM_TAN(FPM_DIV(FPM_MUL(d,FPM_PI),0xB40000))) | ||
185 | #define FPM_ATAN_DEG(d) (FPM_ATAN(FPM_DIV(FPM_MUL(d,FPM_PI),0xB40000))) | ||
186 | |||
187 | */ | ||
188 | /* | ||
189 | #define FPM_PI 3.14 | ||
190 | #define FPM_2PI (3.14*2) | ||
191 | #define FPM_E 178144L | ||
192 | #define FPM_ROOT2 74804L | ||
193 | #define FPM_ROOT3 113512L | ||
194 | #define FPM_GOLDEN 106039L | ||
195 | |||
196 | |||
197 | typedef float fixedpoint_t; | ||
198 | //This variable must be declared in one of the implementation files. | ||
199 | extern __int64 FPM_TMPVAR_INT64; | ||
200 | |||
201 | #define FPM_FROMFLOAT(f) (f) | ||
202 | #define FPM_TOFLOAT(fxp) (fxp) | ||
203 | |||
204 | #define FPM_FROMLONG(l) ((float)l) | ||
205 | #define FPM_TOLONG(fxp) ((long)fxp) | ||
206 | |||
207 | #define FPM_ADD(f1, f2) ((f1)+(f2)) | ||
208 | #define FPM_ADD3(f1, f2, f3) ((f1)+(f2)+(f3)) | ||
209 | #define FPM_INC(f1) ((f1)++) | ||
210 | |||
211 | #define FPM_SUB(f1, f2) ((f1)-(f2)) | ||
212 | #define FPM_DEC(f1) ((f1)--) | ||
213 | |||
214 | #define FPM_MUL(f1, f2) ((f1)*(f2)) | ||
215 | //#define FPM_MUL(f1, f2) ((fixedpoint_t)((FPM_TMPVAR_INT64=(f1))*(f2))>>16) | ||
216 | //#define FPM_MUL(f1, f2) (((f1)*(f2))>>16) | ||
217 | //TODO: This needs to be done without copying to another var | ||
218 | #define FPM_DIV(n, d) ((n)/(d)) | ||
219 | //#define FPM_DIV(n, d) ((long)(((__int64)n)<<16)/(d)) | ||
220 | |||
221 | #define FPM_ABS(fxp) (abs(fxp)) | ||
222 | |||
223 | //TODO: Implement ceil mathematically instead of converting to float and back | ||
224 | #define FPM_CEIL(fxp) (ceil(fxp)) | ||
225 | #define FPM_FLOOR(fxp) (floor(fxp)) | ||
226 | |||
227 | //TODO: Implement sqrt mathematically instead of converting to float and back | ||
228 | #define FPM_SQRT(fxp) (sqrt(fxp)) | ||
229 | #define FPM_SQR(fxp) ((fxp)*(fxp)) | ||
230 | |||
231 | #define FPM_INV(fxp) (1/(fxp)) | ||
232 | //TODO: Calc trig functions (or lookup) instead of converting to float and back | ||
233 | //These take radians | ||
234 | #define FPM_SIN(r) (sin(r)) | ||
235 | #define FPM_COS(r) (cos(r)) | ||
236 | #define FPM_TAN(r) (tan(r)) | ||
237 | #define FPM_ATAN(r) (atan(r)) | ||
238 | |||
239 | //These take degrees | ||
240 | #define FPM_SIN_DEG(d) FPM_SIN(((d)*FPM_PI)/180.0) //0xB40000 = 180.0 | ||
241 | #define FPM_COS_DEG(d) FPM_COS(((d)*FPM_PI)/180.0) | ||
242 | #define FPM_TAN_DEG(d) FPM_TAN(((d)*FPM_PI)/180.0) | ||
243 | #define FPM_ATAN_DEG(d) FPM_ATAN(((d)*FPM_PI)/180.0) | ||
244 | */ | ||
245 | |||
246 | #endif //_FIXEDPOINTMATH_H | ||
diff --git a/apps/plugins/sdl/progs/quake/d_polyse.c b/apps/plugins/sdl/progs/quake/d_polyse.c index 9acd34b102..f02f9a016e 100644 --- a/apps/plugins/sdl/progs/quake/d_polyse.c +++ b/apps/plugins/sdl/progs/quake/d_polyse.c | |||
@@ -122,6 +122,7 @@ void D_PolysetScanLeftEdge (int height); | |||
122 | D_PolysetDraw | 122 | D_PolysetDraw |
123 | ================ | 123 | ================ |
124 | */ | 124 | */ |
125 | #ifndef USE_PQ_OPT | ||
125 | void D_PolysetDraw (void) | 126 | void D_PolysetDraw (void) |
126 | { | 127 | { |
127 | spanpackage_t spans[DPS_MAXSPANS + 1 + | 128 | spanpackage_t spans[DPS_MAXSPANS + 1 + |
@@ -140,7 +141,21 @@ void D_PolysetDraw (void) | |||
140 | D_DrawNonSubdiv (); | 141 | D_DrawNonSubdiv (); |
141 | } | 142 | } |
142 | } | 143 | } |
144 | #else | ||
145 | //JB: Optimization | ||
146 | //Dan East: May result in image quality loss. Actual performance gain not verified. | ||
147 | void D_PolysetDraw (void) | ||
148 | { | ||
149 | spanpackage_t spans[DPS_MAXSPANS + 1 + | ||
150 | ((CACHE_SIZE - 1) / sizeof(spanpackage_t)) + 1]; | ||
151 | // one extra because of cache line pretouching | ||
143 | 152 | ||
153 | a_spans = (spanpackage_t *) | ||
154 | (((long)&spans[0] + CACHE_SIZE - 1) & ~(CACHE_SIZE - 1)); | ||
155 | |||
156 | D_DrawNonSubdiv (); | ||
157 | } | ||
158 | #endif | ||
144 | 159 | ||
145 | /* | 160 | /* |
146 | ================ | 161 | ================ |
@@ -528,6 +543,7 @@ void D_PolysetSetUpForLineScan(fixed8_t startvertu, fixed8_t startvertv, | |||
528 | D_PolysetCalcGradients | 543 | D_PolysetCalcGradients |
529 | ================ | 544 | ================ |
530 | */ | 545 | */ |
546 | #ifndef USE_PQ_OPT4 | ||
531 | void D_PolysetCalcGradients (int skinwidth) | 547 | void D_PolysetCalcGradients (int skinwidth) |
532 | { | 548 | { |
533 | float xstepdenominv, ystepdenominv, t0, t1; | 549 | float xstepdenominv, ystepdenominv, t0, t1; |
@@ -583,7 +599,88 @@ void D_PolysetCalcGradients (int skinwidth) | |||
583 | 599 | ||
584 | a_ststepxwhole = skinwidth * (r_tstepx >> 16) + (r_sstepx >> 16); | 600 | a_ststepxwhole = skinwidth * (r_tstepx >> 16) + (r_sstepx >> 16); |
585 | } | 601 | } |
586 | 602 | #else | |
603 | void D_PolysetCalcGradients (int skinwidth) | ||
604 | { | ||
605 | //Dan East: Fixed point conversion | ||
606 | int p01_minus_p21, p11_minus_p21, p00_minus_p20, p10_minus_p20, t0, t1; | ||
607 | int tmp, ydenom; | ||
608 | |||
609 | //float xstepdenominv = (float)(1.0 / (float)d_xdenom); | ||
610 | //float ystepdenominv = -xstepdenominv; | ||
611 | //int checkx, checky; | ||
612 | |||
613 | p00_minus_p20 = (r_p0[0] - r_p2[0]); | ||
614 | p01_minus_p21 = (r_p0[1] - r_p2[1]); | ||
615 | p10_minus_p20 = (r_p1[0] - r_p2[0]); | ||
616 | p11_minus_p21 = (r_p1[1] - r_p2[1]); | ||
617 | |||
618 | //xstepdenominv = d_xdenom; | ||
619 | ydenom=-d_xdenom; | ||
620 | //ystepdenominv = -xstepdenominv; | ||
621 | |||
622 | t0 = (r_p0[4] - r_p2[4]); | ||
623 | t1 = (r_p1[4] - r_p2[4]); | ||
624 | //TODO: Ceil has been removed | ||
625 | tmp=t1 * p01_minus_p21 - t0 * p11_minus_p21; | ||
626 | r_lstepx = tmp / d_xdenom; | ||
627 | if (tmp%d_xdenom) r_lstepx++; | ||
628 | |||
629 | tmp=t1 * p00_minus_p20 - t0 * p10_minus_p20; | ||
630 | r_lstepy = tmp / ydenom; | ||
631 | if (tmp%ydenom) r_lstepy++; | ||
632 | /* | ||
633 | checkx = (int)ceil((t1 * p01_minus_p21 - t0 * p11_minus_p21) * xstepdenominv); | ||
634 | checky = (int)ceil((t1 * p00_minus_p20 - t0 * p10_minus_p20) * ystepdenominv); | ||
635 | if (checkx-r_lstepx>1||checkx-r_lstepx<-1) | ||
636 | r_lstepx=r_lstepx; | ||
637 | if (checky-r_lstepy>1||checky-r_lstepy<-1) | ||
638 | r_lstepy=r_lstepy; | ||
639 | */ | ||
640 | t0 = (r_p0[2] - r_p2[2]); | ||
641 | t1 = (r_p1[2] - r_p2[2]); | ||
642 | r_sstepx = (t1 * p01_minus_p21 - t0 * p11_minus_p21) / d_xdenom; | ||
643 | r_sstepy = (t1 * p00_minus_p20 - t0* p10_minus_p20) / ydenom; | ||
644 | /* | ||
645 | checkx = (int)((t1 * p01_minus_p21 - t0 * p11_minus_p21) * xstepdenominv); | ||
646 | checky = (int)((t1 * p00_minus_p20 - t0* p10_minus_p20) * ystepdenominv); | ||
647 | if (checkx-r_sstepx>1||checkx-r_sstepx<-1) | ||
648 | r_lstepx=r_lstepx; | ||
649 | if (checky-r_sstepy>1||checky-r_sstepy<-1) | ||
650 | r_lstepy=r_lstepy; | ||
651 | */ | ||
652 | |||
653 | t0 = (r_p0[3] - r_p2[3]); | ||
654 | t1 = (r_p1[3] - r_p2[3]); | ||
655 | r_tstepx = (t1 * p01_minus_p21 - t0 * p11_minus_p21) / d_xdenom; | ||
656 | r_tstepy = (t1 * p00_minus_p20 - t0 * p10_minus_p20) / ydenom; | ||
657 | /* | ||
658 | checkx = (int)((t1 * p01_minus_p21 - t0 * p11_minus_p21) * xstepdenominv); | ||
659 | checky = (int)((t1 * p00_minus_p20 - t0 * p10_minus_p20) * ystepdenominv); | ||
660 | if (checkx-r_tstepx>1||checkx-r_tstepx<-1) | ||
661 | r_lstepx=r_lstepx; | ||
662 | if (checky-r_tstepy>1||checky-r_tstepy<-1) | ||
663 | r_lstepy=r_lstepy; | ||
664 | */ | ||
665 | |||
666 | t0 = (r_p0[5] - r_p2[5]); | ||
667 | t1 = (r_p1[5] - r_p2[5]); | ||
668 | r_zistepx = (t1 * p01_minus_p21 - t0 * p11_minus_p21) / d_xdenom; | ||
669 | r_zistepy = (t1 * p00_minus_p20 - t0 * p10_minus_p20) / ydenom; | ||
670 | /* | ||
671 | checkx = (int)((t1 * p01_minus_p21 - t0 * p11_minus_p21) * xstepdenominv); | ||
672 | checky = (int)((t1 * p00_minus_p20 - t0 * p10_minus_p20) * ystepdenominv); | ||
673 | if (checkx-r_zistepx>1||checkx-r_zistepx<-1) | ||
674 | r_lstepx=checkx; | ||
675 | if (checky-r_zistepy>1||checky-r_zistepy<-1) | ||
676 | r_lstepy=checky; | ||
677 | */ | ||
678 | |||
679 | a_sstepxfrac = r_sstepx & 0xFFFF; | ||
680 | a_tstepxfrac = r_tstepx & 0xFFFF; | ||
681 | a_ststepxwhole = skinwidth * (r_tstepx >> 16) + (r_sstepx >> 16); | ||
682 | } | ||
683 | #endif | ||
587 | #endif // !id386 | 684 | #endif // !id386 |
588 | 685 | ||
589 | 686 | ||
diff --git a/apps/plugins/sdl/progs/quake/mathlib.h b/apps/plugins/sdl/progs/quake/mathlib.h index b754966802..5f7ae430f1 100644 --- a/apps/plugins/sdl/progs/quake/mathlib.h +++ b/apps/plugins/sdl/progs/quake/mathlib.h | |||
@@ -19,6 +19,19 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
19 | */ | 19 | */ |
20 | // mathlib.h | 20 | // mathlib.h |
21 | 21 | ||
22 | //Dan East: | ||
23 | #include "FixedPointMath.h" | ||
24 | |||
25 | #ifdef USE_PQ_OPT | ||
26 | typedef int fpvec3[3]; | ||
27 | #endif | ||
28 | |||
29 | typedef fixedpoint_t vec3_FPM_t[3]; | ||
30 | typedef fixedpoint8_24_t vec3_8_24FPM_t[3]; | ||
31 | typedef fixedpoint_t vec5_FPM_t[5]; | ||
32 | |||
33 | //End Dan | ||
34 | |||
22 | typedef float vec_t; | 35 | typedef float vec_t; |
23 | typedef vec_t vec3_t[3]; | 36 | typedef vec_t vec3_t[3]; |
24 | typedef vec_t vec5_t[5]; | 37 | typedef vec_t vec5_t[5]; |
diff --git a/apps/plugins/sdl/progs/quake/model.h b/apps/plugins/sdl/progs/quake/model.h index 899010f0fb..aa034f958c 100644 --- a/apps/plugins/sdl/progs/quake/model.h +++ b/apps/plugins/sdl/progs/quake/model.h | |||
@@ -49,6 +49,16 @@ typedef struct | |||
49 | vec3_t position; | 49 | vec3_t position; |
50 | } mvertex_t; | 50 | } mvertex_t; |
51 | 51 | ||
52 | typedef struct | ||
53 | { | ||
54 | int position[3]; | ||
55 | } mvertex_fxp_t; | ||
56 | |||
57 | typedef struct | ||
58 | { | ||
59 | vec3_FPM_t position; | ||
60 | } mvertex_FPM_t; | ||
61 | |||
52 | #define SIDE_FRONT 0 | 62 | #define SIDE_FRONT 0 |
53 | #define SIDE_BACK 1 | 63 | #define SIDE_BACK 1 |
54 | #define SIDE_ON 2 | 64 | #define SIDE_ON 2 |
@@ -331,6 +341,10 @@ typedef struct model_s | |||
331 | 341 | ||
332 | int numvertexes; | 342 | int numvertexes; |
333 | mvertex_t *vertexes; | 343 | mvertex_t *vertexes; |
344 | |||
345 | #ifdef USE_PQ_OPT2 | ||
346 | mvertex_fxp_t *vertexes_fxp; | ||
347 | #endif | ||
334 | 348 | ||
335 | int numedges; | 349 | int numedges; |
336 | medge_t *edges; | 350 | medge_t *edges; |
diff --git a/apps/plugins/sdl/progs/quake/quakedef.h b/apps/plugins/sdl/progs/quake/quakedef.h index b16d9b72f3..8328154c0b 100644 --- a/apps/plugins/sdl/progs/quake/quakedef.h +++ b/apps/plugins/sdl/progs/quake/quakedef.h | |||
@@ -25,6 +25,18 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
25 | #include <stdarg.h> | 25 | #include <stdarg.h> |
26 | #include <setjmp.h> | 26 | #include <setjmp.h> |
27 | 27 | ||
28 | #define FIXEDPOINT_OPT // FW: enable fixed-point optimizations | ||
29 | |||
30 | /* Fixed-point optimizations, thanks to Pocket Quake and Dan East. */ | ||
31 | #ifdef FIXEDPOINT_OPT | ||
32 | #define USE_PQ_OPT | ||
33 | #define USE_PQ_OPT1 | ||
34 | //#define USE_PQ_OPT2 | ||
35 | //#define USE_PQ_OPT3 // don't use | ||
36 | #define USE_PQ_OPT4 | ||
37 | //#define USE_PQ_OPT5 | ||
38 | #endif | ||
39 | |||
28 | #define QUAKE_GAME // as opposed to utilities | 40 | #define QUAKE_GAME // as opposed to utilities |
29 | 41 | ||
30 | #undef VERSION | 42 | #undef VERSION |
diff --git a/apps/plugins/sdl/progs/quake/r_bsp.c b/apps/plugins/sdl/progs/quake/r_bsp.c index f8c38cf601..2940b1a509 100644 --- a/apps/plugins/sdl/progs/quake/r_bsp.c +++ b/apps/plugins/sdl/progs/quake/r_bsp.c | |||
@@ -27,6 +27,11 @@ Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. | |||
27 | // | 27 | // |
28 | qboolean insubmodel; | 28 | qboolean insubmodel; |
29 | entity_t *currententity; | 29 | entity_t *currententity; |
30 | |||
31 | #ifdef USE_PQ_OPT1 | ||
32 | int modelorg_fxp[3]; | ||
33 | #endif | ||
34 | |||
30 | vec3_t modelorg, base_modelorg; | 35 | vec3_t modelorg, base_modelorg; |
31 | // modelorg is the viewpoint reletive to | 36 | // modelorg is the viewpoint reletive to |
32 | // the currently rendering entity | 37 | // the currently rendering entity |
@@ -440,6 +445,10 @@ void R_DrawSubmodelPolygons (model_t *pmodel, int clipflags) | |||
440 | } | 445 | } |
441 | } | 446 | } |
442 | 447 | ||
448 | #ifdef USE_PQ_OPT1 | ||
449 | int clipplanes_fxp[4][3]; | ||
450 | int clipdist_fxp[4]; | ||
451 | #endif | ||
443 | 452 | ||
444 | /* | 453 | /* |
445 | ================ | 454 | ================ |
@@ -449,11 +458,16 @@ R_RecursiveWorldNode | |||
449 | void R_RecursiveWorldNode (mnode_t *node, int clipflags) | 458 | void R_RecursiveWorldNode (mnode_t *node, int clipflags) |
450 | { | 459 | { |
451 | int i, c, side, *pindex; | 460 | int i, c, side, *pindex; |
452 | vec3_t acceptpt, rejectpt; | ||
453 | mplane_t *plane; | 461 | mplane_t *plane; |
454 | msurface_t *surf, **mark; | 462 | msurface_t *surf, **mark; |
455 | mleaf_t *pleaf; | 463 | mleaf_t *pleaf; |
456 | double d, dot; | 464 | double dot; |
465 | #ifdef USE_PQ_OPT1 | ||
466 | int d_fxp; | ||
467 | #else | ||
468 | double d; | ||
469 | vec3_t acceptpt, rejectpt; | ||
470 | #endif | ||
457 | 471 | ||
458 | if (node->contents == CONTENTS_SOLID) | 472 | if (node->contents == CONTENTS_SOLID) |
459 | return; // solid | 473 | return; // solid |
@@ -477,16 +491,29 @@ void R_RecursiveWorldNode (mnode_t *node, int clipflags) | |||
477 | 491 | ||
478 | pindex = pfrustum_indexes[i]; | 492 | pindex = pfrustum_indexes[i]; |
479 | 493 | ||
494 | #ifdef USE_PQ_OPT1 | ||
495 | d_fxp=node->minmaxs[pindex[0]]*clipplanes_fxp[i][0]+node->minmaxs[pindex[1]]*clipplanes_fxp[i][1]+node->minmaxs[pindex[2]]*clipplanes_fxp[i][2]; | ||
496 | d_fxp-=clipdist_fxp[i]; | ||
497 | |||
498 | if (d_fxp <= 0) | ||
499 | return; | ||
500 | |||
501 | d_fxp=node->minmaxs[pindex[3]]*clipplanes_fxp[i][0]+node->minmaxs[pindex[4]]*clipplanes_fxp[i][1]+node->minmaxs[pindex[5]]*clipplanes_fxp[i][2]; | ||
502 | d_fxp-=clipdist_fxp[i]; | ||
503 | |||
504 | if (d_fxp >= 0) | ||
505 | clipflags &= ~(1<<i); // node is entirely on screen | ||
506 | #else | ||
480 | rejectpt[0] = (float)node->minmaxs[pindex[0]]; | 507 | rejectpt[0] = (float)node->minmaxs[pindex[0]]; |
481 | rejectpt[1] = (float)node->minmaxs[pindex[1]]; | 508 | rejectpt[1] = (float)node->minmaxs[pindex[1]]; |
482 | rejectpt[2] = (float)node->minmaxs[pindex[2]]; | 509 | rejectpt[2] = (float)node->minmaxs[pindex[2]]; |
483 | 510 | ||
484 | d = DotProduct (rejectpt, view_clipplanes[i].normal); | 511 | d = DotProduct (rejectpt, view_clipplanes[i].normal); |
485 | d -= view_clipplanes[i].dist; | 512 | d -= view_clipplanes[i].dist; |
486 | 513 | ||
487 | if (d <= 0) | 514 | if (d <= 0) |
488 | return; | 515 | return; |
489 | 516 | ||
490 | acceptpt[0] = (float)node->minmaxs[pindex[3+0]]; | 517 | acceptpt[0] = (float)node->minmaxs[pindex[3+0]]; |
491 | acceptpt[1] = (float)node->minmaxs[pindex[3+1]]; | 518 | acceptpt[1] = (float)node->minmaxs[pindex[3+1]]; |
492 | acceptpt[2] = (float)node->minmaxs[pindex[3+2]]; | 519 | acceptpt[2] = (float)node->minmaxs[pindex[3+2]]; |
@@ -496,6 +523,7 @@ void R_RecursiveWorldNode (mnode_t *node, int clipflags) | |||
496 | 523 | ||
497 | if (d >= 0) | 524 | if (d >= 0) |
498 | clipflags &= ~(1<<i); // node is entirely on screen | 525 | clipflags &= ~(1<<i); // node is entirely on screen |
526 | #endif | ||
499 | } | 527 | } |
500 | } | 528 | } |
501 | 529 | ||
@@ -656,10 +684,79 @@ void R_RenderWorld (void) | |||
656 | 684 | ||
657 | currententity = &cl_entities[0]; | 685 | currententity = &cl_entities[0]; |
658 | VectorCopy (r_origin, modelorg); | 686 | VectorCopy (r_origin, modelorg); |
687 | |||
688 | #ifdef USE_PQ_OPT1 | ||
689 | modelorg_fxp[0]=(int)(r_origin[0]*524288.0); | ||
690 | modelorg_fxp[1]=(int)(r_origin[1]*524288.0); | ||
691 | modelorg_fxp[2]=(int)(r_origin[2]*524288.0); | ||
692 | |||
693 | //modelorg_fxp[0]=(int)(r_origin[0]*65536.0); | ||
694 | //modelorg_fxp[1]=(int)(r_origin[1]*65536.0); | ||
695 | //modelorg_fxp[2]=(int)(r_origin[2]*65536.0); | ||
696 | |||
697 | vright_fxp[0]=(int)(256.0/vright[0]); | ||
698 | if (!vright_fxp[0]) vright_fxp[0]=0x7fffffff; | ||
699 | vright_fxp[1]=(int)(256.0/vright[1]); | ||
700 | if (!vright_fxp[1]) vright_fxp[1]=0x7fffffff; | ||
701 | vright_fxp[2]=(int)(256.0/vright[2]); | ||
702 | if (!vright_fxp[2]) vright_fxp[2]=0x7fffffff; | ||
703 | |||
704 | vpn_fxp[0]=(int)(256.0/vpn[0]); | ||
705 | if (!vpn_fxp[0]) vpn_fxp[0]=0x7fffffff; | ||
706 | vpn_fxp[1]=(int)(256.0/vpn[1]); | ||
707 | if (!vpn_fxp[1]) vpn_fxp[1]=0x7fffffff; | ||
708 | vpn_fxp[2]=(int)(256.0/vpn[2]); | ||
709 | if (!vpn_fxp[2]) vpn_fxp[2]=0x7fffffff; | ||
710 | |||
711 | vup_fxp[0]=(int)(256.0/vup[0]); | ||
712 | if (!vup_fxp[0]) vup_fxp[0]=0x7fffffff; | ||
713 | vup_fxp[1]=(int)(256.0/vup[1]); | ||
714 | if (!vup_fxp[1]) vup_fxp[1]=0x7fffffff; | ||
715 | vup_fxp[2]=(int)(256.0/vup[2]); | ||
716 | if (!vup_fxp[2]) vup_fxp[2]=0x7fffffff; | ||
717 | |||
718 | #endif | ||
719 | |||
720 | |||
659 | clmodel = currententity->model; | 721 | clmodel = currententity->model; |
660 | r_pcurrentvertbase = clmodel->vertexes; | 722 | r_pcurrentvertbase = clmodel->vertexes; |
661 | 723 | ||
662 | R_RecursiveWorldNode (clmodel->nodes, 15); | 724 | #ifdef USE_PQ_OPT2 |
725 | r_pcurrentvertbase_fxp = clmodel->vertexes_fxp; | ||
726 | #endif | ||
727 | #ifdef USE_PQ_OPT1 | ||
728 | //Dan Fixed point conversion stuff | ||
729 | for (i=0; i<4; i++) { | ||
730 | clipplanes_fxp[i][0]=(int)(view_clipplanes[i].normal[0]*65536.0); | ||
731 | clipplanes_fxp[i][1]=(int)(view_clipplanes[i].normal[1]*65536.0); | ||
732 | clipplanes_fxp[i][2]=(int)(view_clipplanes[i].normal[2]*65536.0); | ||
733 | clipdist_fxp[i] =(int)(view_clipplanes[i].dist*65536.0); | ||
734 | #ifdef USE_PQ_OPT2 | ||
735 | view_clipplanes_fxp[i].leftedge=view_clipplanes[i].leftedge; | ||
736 | view_clipplanes_fxp[i].rightedge=view_clipplanes[i].rightedge; | ||
737 | if (!view_clipplanes[i].normal[0]) view_clipplanes_fxp[i].normal[0]=2<<29; | ||
738 | else view_clipplanes_fxp[i].normal[0]=(int)(4096.0f/view_clipplanes[i].normal[0]); | ||
739 | if (!view_clipplanes[i].normal[0]) view_clipplanes_fxp[i].normal[0]=2<<29; | ||
740 | |||
741 | if (!view_clipplanes[i].normal[1]) view_clipplanes_fxp[i].normal[1]=2<<29; | ||
742 | else view_clipplanes_fxp[i].normal[1]=(int)(4096.0f/view_clipplanes[i].normal[1]); | ||
743 | if (!view_clipplanes[i].normal[1]) view_clipplanes_fxp[i].normal[1]=2<<29; | ||
744 | |||
745 | if (!view_clipplanes[i].normal[2]) view_clipplanes_fxp[i].normal[2]=2<<29; | ||
746 | else view_clipplanes_fxp[i].normal[2]=(int)(4096.0f/view_clipplanes[i].normal[2]); | ||
747 | if (!view_clipplanes[i].normal[2]) view_clipplanes_fxp[i].normal[2]=2<<29; | ||
748 | |||
749 | view_clipplanes_fxp[i].dist=(int)(view_clipplanes[i].dist*128.0f); | ||
750 | #endif | ||
751 | #if defined(_X86_)&&defined(DEBUG) | ||
752 | LogFloat(view_clipplanes[i].normal[0], "view_clipplanes[i].normal[0]", i, -1); | ||
753 | LogFloat(view_clipplanes[i].normal[1], "view_clipplanes[i].normal[1]", i, -1); | ||
754 | LogFloat(view_clipplanes[i].normal[2], "view_clipplanes[i].normal[2]", i, -1); | ||
755 | #endif | ||
756 | } | ||
757 | #endif | ||
758 | |||
759 | R_RecursiveWorldNode (clmodel->nodes, 15); | ||
663 | 760 | ||
664 | // if the driver wants the polygons back to front, play the visible ones back | 761 | // if the driver wants the polygons back to front, play the visible ones back |
665 | // in that order | 762 | // in that order |
diff --git a/apps/plugins/sdl/progs/quake/r_draw.c b/apps/plugins/sdl/progs/quake/r_draw.c index 8789cc015a..c4bf95f112 100644 --- a/apps/plugins/sdl/progs/quake/r_draw.c +++ b/apps/plugins/sdl/progs/quake/r_draw.c | |||
@@ -44,6 +44,10 @@ clipplane_t *entity_clipplanes; | |||
44 | clipplane_t view_clipplanes[4]; | 44 | clipplane_t view_clipplanes[4]; |
45 | clipplane_t world_clipplanes[16]; | 45 | clipplane_t world_clipplanes[16]; |
46 | 46 | ||
47 | #ifdef USE_PQ_OPT2 | ||
48 | clipplane_fxp_t view_clipplanes_fxp[4]; | ||
49 | #endif | ||
50 | |||
47 | medge_t *r_pedge; | 51 | medge_t *r_pedge; |
48 | 52 | ||
49 | qboolean r_leftclipped, r_rightclipped; | 53 | qboolean r_leftclipped, r_rightclipped; |
@@ -67,6 +71,11 @@ float r_nearzi; | |||
67 | float r_u1, r_v1, r_lzi1; | 71 | float r_u1, r_v1, r_lzi1; |
68 | int r_ceilv1; | 72 | int r_ceilv1; |
69 | 73 | ||
74 | #ifdef USE_PQ_OPT1 | ||
75 | int r_u1_fxp, r_v1_fxp, r_lzi1_fxp; | ||
76 | extern int modelorg_fxp[3]; | ||
77 | #endif | ||
78 | |||
70 | qboolean r_lastvertvalid; | 79 | qboolean r_lastvertvalid; |
71 | 80 | ||
72 | 81 | ||
@@ -250,6 +259,306 @@ void R_EmitEdge (mvertex_t *pv0, mvertex_t *pv1) | |||
250 | removeedges[v2] = edge; | 259 | removeedges[v2] = edge; |
251 | } | 260 | } |
252 | 261 | ||
262 | #ifdef USE_PQ_OPT1 | ||
263 | void R_EmitEdge_fxp (mvertex_t *pv0, mvertex_t *pv1) | ||
264 | { | ||
265 | edge_t *edge, *pcheck; | ||
266 | int u_check; | ||
267 | //float u, u_step; | ||
268 | int u_fxp, u_step_fxp; | ||
269 | //vec3_t local, transformed; | ||
270 | int local_fxp[3], transformed_fxp[3]; | ||
271 | float *world; | ||
272 | int v, v2, ceilv0; | ||
273 | //float scale, lzi0, u0, v0; | ||
274 | int scale_fxp, scale2_fxp, lzi0_fxp, u0_fxp, v0_fxp; | ||
275 | int side; | ||
276 | |||
277 | if (r_lastvertvalid) | ||
278 | { | ||
279 | u0_fxp = r_u1_fxp; | ||
280 | v0_fxp = r_v1_fxp; | ||
281 | lzi0_fxp = r_lzi1_fxp; | ||
282 | //lzi0 = r_lzi1; | ||
283 | ceilv0 = r_ceilv1; | ||
284 | } | ||
285 | else | ||
286 | { | ||
287 | //world_fxp=(int)(pv0->position[0]*(float)(2^16)); | ||
288 | world = &pv0->position[0]; | ||
289 | |||
290 | // transform and project | ||
291 | //VectorSubtract (world, modelorg, local); | ||
292 | //Vector Subtract (and convert) | ||
293 | local_fxp[0]=((int)(world[0]*(524288.0)))-modelorg_fxp[0]; | ||
294 | local_fxp[1]=((int)(world[1]*(524288.0)))-modelorg_fxp[1]; | ||
295 | local_fxp[2]=((int)(world[2]*(524288.0)))-modelorg_fxp[2]; | ||
296 | |||
297 | //TransformVector (local, transformed); | ||
298 | //transformed_fxp[0] = (int)(local_fxp[0]*vright[0])+(int)(local_fxp[1]*vright[1])+(int)(local_fxp[2]*vright[2]); | ||
299 | //transformed_fxp[1] = (int)(local_fxp[0]*vup[0])+(int)(local_fxp[1]*vup[1])+(int)(local_fxp[2]*vup[2]); | ||
300 | //transformed_fxp[2] = (int)(local_fxp[0]*vpn[0])+(int)(local_fxp[1]*vpn[1])+(int)(local_fxp[2]*vpn[2]); | ||
301 | |||
302 | transformed_fxp[0] = local_fxp[0]/vright_fxp[0]+local_fxp[1]/vright_fxp[1]+local_fxp[2]/vright_fxp[2]; | ||
303 | //transformed_fxp[0]*=256; | ||
304 | transformed_fxp[1] = local_fxp[0]/vup_fxp[0]+local_fxp[1]/vup_fxp[1]+local_fxp[2]/vup_fxp[2]; | ||
305 | //transformed_fxp[1]*=256; | ||
306 | transformed_fxp[2] = local_fxp[0]/vpn_fxp[0]+local_fxp[1]/vpn_fxp[1]+local_fxp[2]/vpn_fxp[2]; | ||
307 | transformed_fxp[2]*=256; | ||
308 | |||
309 | if (transformed_fxp[2] < (int)(NEAR_CLIP*1048576.0)) | ||
310 | transformed_fxp[2] = (int)(NEAR_CLIP*1048576.0); | ||
311 | |||
312 | transformed_fxp[0]/=16; | ||
313 | transformed_fxp[1]/=16; | ||
314 | transformed_fxp[2]/=2048; | ||
315 | |||
316 | lzi0_fxp=transformed_fxp[2]; | ||
317 | //lzi0 = (float)(1.0 / transformed[2]); | ||
318 | |||
319 | // FIXME: build x/yscale into transform? | ||
320 | //scale = xscale * lzi0; | ||
321 | //u0 = (xcenter + scale*transformed[0]); | ||
322 | |||
323 | scale_fxp=xscale_fxp/transformed_fxp[2]; //9.23 / 24.8 = 17.15 | ||
324 | scale2_fxp=transformed_fxp[0]*(scale_fxp); // 25.7 * 17.15 = 10.22 | ||
325 | |||
326 | if (transformed_fxp[0]<0) { | ||
327 | if (scale2_fxp>0) scale2_fxp=-511*4194304; | ||
328 | } else { | ||
329 | if (scale2_fxp<0) scale2_fxp=511*4194304; | ||
330 | } | ||
331 | |||
332 | u0_fxp=scale2_fxp+xcenter_fxp; | ||
333 | |||
334 | if (u0_fxp < r_refdef_fvrectx_adj_fxp) | ||
335 | u0_fxp = r_refdef_fvrectx_adj_fxp; | ||
336 | if (u0_fxp > r_refdef_fvrectright_adj_fxp) | ||
337 | u0_fxp = r_refdef_fvrectright_adj_fxp; | ||
338 | |||
339 | //scale = yscale * lzi0; | ||
340 | //v0 = (ycenter - scale*transformed[1]); | ||
341 | scale_fxp=yscale_fxp/transformed_fxp[2]; //9.23 / 24.8 = 17.15 | ||
342 | scale2_fxp=transformed_fxp[1]*(scale_fxp); // 25.7 * 17.15 = 10.22 | ||
343 | |||
344 | if (transformed_fxp[1]<0) { | ||
345 | if (scale2_fxp>0) scale2_fxp=-511*4194304; | ||
346 | } else { | ||
347 | if (scale2_fxp<0) scale2_fxp=511*4194304; //255*8388608; | ||
348 | } | ||
349 | |||
350 | v0_fxp = ycenter_fxp-scale2_fxp; | ||
351 | |||
352 | if (v0_fxp < r_refdef_fvrecty_adj_fxp) | ||
353 | v0_fxp = r_refdef_fvrecty_adj_fxp; | ||
354 | if (v0_fxp > r_refdef_fvrectbottom_adj_fxp) | ||
355 | v0_fxp = r_refdef_fvrectbottom_adj_fxp; | ||
356 | |||
357 | ceilv0 = v0_fxp/4194304; | ||
358 | if (v0_fxp&0x3FFFFF) ceilv0++; | ||
359 | } | ||
360 | |||
361 | //world(pv1->position[0]*(float)(2^16)); | ||
362 | world = &pv1->position[0]; | ||
363 | |||
364 | // transform and project | ||
365 | //VectorSubtract (world, modelorg, local); | ||
366 | //Vector Subtract (and convert) | ||
367 | local_fxp[0]=((int)(world[0]*(524288.0)))-modelorg_fxp[0]; | ||
368 | local_fxp[1]=((int)(world[1]*(524288.0)))-modelorg_fxp[1]; | ||
369 | local_fxp[2]=((int)(world[2]*(524288.0)))-modelorg_fxp[2]; | ||
370 | |||
371 | //TransformVector (local, transformed); | ||
372 | //transformed_fxp[0] = ((int)(local_fxp[0]*vright[0]))+((int)(local_fxp[1]*vright[1]))+((int)(local_fxp[2]*vright[2])); | ||
373 | //transformed_fxp[1] = ((int)(local_fxp[0]*vup[0]))+((int)(local_fxp[1]*vup[1]))+((int)(local_fxp[2]*vup[2])); | ||
374 | //transformed_fxp[2] = ((int)(local_fxp[0]*vpn[0]))+((int)(local_fxp[1]*vpn[1]))+((int)(local_fxp[2]*vpn[2])); | ||
375 | |||
376 | transformed_fxp[0] = local_fxp[0]/vright_fxp[0]+local_fxp[1]/vright_fxp[1]+local_fxp[2]/vright_fxp[2]; | ||
377 | //transformed_fxp[0]*=256; | ||
378 | transformed_fxp[1] = local_fxp[0]/vup_fxp[0]+local_fxp[1]/vup_fxp[1]+local_fxp[2]/vup_fxp[2]; | ||
379 | //transformed_fxp[1]*=256; | ||
380 | transformed_fxp[2] = local_fxp[0]/vpn_fxp[0]+local_fxp[1]/vpn_fxp[1]+local_fxp[2]/vpn_fxp[2]; | ||
381 | transformed_fxp[2]*=256; | ||
382 | |||
383 | //transformed_fxp[2]=-transformed_fxp[2]; | ||
384 | //if (transformed[2] < NEAR_CLIP) | ||
385 | // transformed[2] = (float)NEAR_CLIP; | ||
386 | if (transformed_fxp[2] < (int)(NEAR_CLIP*524288.0)) | ||
387 | transformed_fxp[2] = (int)(NEAR_CLIP*524288.0); | ||
388 | |||
389 | transformed_fxp[0]/=16; | ||
390 | transformed_fxp[1]/=16; | ||
391 | transformed_fxp[2]/=2048; | ||
392 | |||
393 | r_lzi1_fxp=transformed_fxp[2]; | ||
394 | //r_lzi1 = (float)(1.0 / transformed[2]); | ||
395 | //scale = xscale * r_lzi1; | ||
396 | |||
397 | scale_fxp=xscale_fxp/transformed_fxp[2]; //9.23 / 24.8 = 17.15 | ||
398 | scale2_fxp=transformed_fxp[0]*(scale_fxp); // 24.8 * 17.15 = 9.23 //21.11 | ||
399 | |||
400 | if (transformed_fxp[0]<0) { | ||
401 | if (scale2_fxp>0) scale2_fxp=-511*4194304; | ||
402 | } else { | ||
403 | if (scale2_fxp<0) scale2_fxp=511*4194304; | ||
404 | } | ||
405 | |||
406 | //r_u1 = (xcenter + scale*transformed[0]); | ||
407 | r_u1_fxp = xcenter_fxp + scale2_fxp; | ||
408 | if (r_u1_fxp < r_refdef_fvrectx_adj_fxp) | ||
409 | r_u1_fxp = r_refdef_fvrectx_adj_fxp; | ||
410 | if (r_u1_fxp > r_refdef_fvrectright_adj_fxp) | ||
411 | r_u1_fxp = r_refdef_fvrectright_adj_fxp; | ||
412 | |||
413 | //scale = yscale * r_lzi1; | ||
414 | //r_v1 = (ycenter - scale*transformed[1]); | ||
415 | |||
416 | scale_fxp=yscale_fxp/transformed_fxp[2]; //9.23 / 24.8 = 17.15 | ||
417 | scale2_fxp=transformed_fxp[1]*(scale_fxp); // 23.9 * 17.15 = 9.23 //21.11 | ||
418 | |||
419 | if (transformed_fxp[1]<0) { | ||
420 | if (scale2_fxp>0) scale2_fxp=-511*4194304; | ||
421 | } else { | ||
422 | if (scale2_fxp<0) scale2_fxp=511*4194304; | ||
423 | } | ||
424 | |||
425 | r_v1_fxp = ycenter_fxp - scale2_fxp; | ||
426 | if (r_v1_fxp < r_refdef_fvrecty_adj_fxp) | ||
427 | r_v1_fxp = r_refdef_fvrecty_adj_fxp; | ||
428 | if (r_v1_fxp > r_refdef_fvrectbottom_adj_fxp) | ||
429 | r_v1_fxp = r_refdef_fvrectbottom_adj_fxp; | ||
430 | |||
431 | //if (r_lzi1 > lzi0) | ||
432 | // lzi0 = r_lzi1; | ||
433 | if (r_lzi1_fxp < lzi0_fxp) | ||
434 | lzi0_fxp = r_lzi1_fxp; | ||
435 | |||
436 | //if (lzi0 > r_nearzi) // for mipmap finding | ||
437 | // r_nearzi = lzi0; | ||
438 | if (128.0/lzi0_fxp > r_nearzi) { // for mipmap finding | ||
439 | //if (!lzi0_fxp) r_nearzi=0; | ||
440 | //else | ||
441 | r_nearzi = (float)(128.0/lzi0_fxp); | ||
442 | } | ||
443 | |||
444 | // for right edges, all we want is the effect on 1/z | ||
445 | if (r_nearzionly) | ||
446 | return; | ||
447 | |||
448 | r_emitted = 1; | ||
449 | |||
450 | //r_ceilv1 = (int) ceil(r_v1); | ||
451 | r_ceilv1 = r_v1_fxp/4194304; | ||
452 | if (r_v1_fxp&0x3FFFFF) r_ceilv1++; | ||
453 | |||
454 | |||
455 | // create the edge | ||
456 | if (ceilv0 == r_ceilv1) | ||
457 | { | ||
458 | // we cache unclipped horizontal edges as fully clipped | ||
459 | if (cacheoffset != 0x7FFFFFFF) | ||
460 | { | ||
461 | cacheoffset = FULLY_CLIPPED_CACHED | | ||
462 | (r_framecount & FRAMECOUNT_MASK); | ||
463 | } | ||
464 | |||
465 | return; // horizontal edge | ||
466 | } | ||
467 | |||
468 | side = ceilv0 > r_ceilv1; | ||
469 | |||
470 | edge = edge_p++; | ||
471 | |||
472 | edge->owner = NULL; | ||
473 | |||
474 | edge->owner = r_pedge; | ||
475 | |||
476 | edge->nearzi = (float)(128.0/lzi0_fxp); | ||
477 | |||
478 | { | ||
479 | //float tmp; | ||
480 | if (side == 0) | ||
481 | { | ||
482 | //int tmp; | ||
483 | // trailing edge (go from p1 to p2) | ||
484 | v = ceilv0; | ||
485 | v2 = r_ceilv1 - 1; | ||
486 | |||
487 | edge->surfs[0] = surface_p - surfaces; | ||
488 | edge->surfs[1] = 0; | ||
489 | |||
490 | //u_step = ((r_u1 - u0) / (r_v1 - v0)); | ||
491 | //u = u0 + ((float)v - v0) * u_step; | ||
492 | |||
493 | u_step_fxp=(r_u1_fxp - u0_fxp) / ((r_v1_fxp - v0_fxp)>>10); //10.22 / 15.12 = 22.10 | ||
494 | u_fxp = u0_fxp + ((v*4194304 - v0_fxp)>>12 * u_step_fxp>>12); | ||
495 | |||
496 | //tmp=(((r_u1_fxp - u0_fxp)/8388608.0) / ((r_v1_fxp - v0_fxp)/8388608.0)); | ||
497 | //u_step_fxp=(int)(tmp*8388608.0); | ||
498 | //u_fxp = u0_fxp + (((float)v - v0_fxp/8388608.0) * tmp)*8388608.0; | ||
499 | } | ||
500 | else | ||
501 | { | ||
502 | //int tmp; | ||
503 | // leading edge (go from p2 to p1) | ||
504 | v2 = ceilv0 - 1; | ||
505 | v = r_ceilv1; | ||
506 | |||
507 | edge->surfs[0] = 0; | ||
508 | edge->surfs[1] = surface_p - surfaces; | ||
509 | |||
510 | //u_step = ((u0 - r_u1) / (v0 - r_v1)); | ||
511 | //u = r_u1 + ((float)v - r_v1) * u_step; | ||
512 | |||
513 | u_step_fxp = (u0_fxp - r_u1_fxp) / ((v0_fxp - r_v1_fxp)>>10); | ||
514 | u_fxp = r_u1_fxp + ((v*4194304 - r_v1_fxp)>>12 * u_step_fxp>>12); | ||
515 | |||
516 | //tmp=(((u0_fxp - r_u1_fxp)/8388608.0) / ((v0_fxp - r_v1_fxp)/8388608.0)); | ||
517 | //u_step_fxp = (int)(tmp*8388608.0); | ||
518 | //u_fxp = r_u1_fxp + (((float)v - r_v1_fxp/8388608.0) * tmp)*8388608.0; | ||
519 | } | ||
520 | //edge->u_step = tmp*0x100000; | ||
521 | //edge->u = (int)(/*(u_fxp/65536)*0x100000*/u_fxp/4 + 0xFFFFF); | ||
522 | |||
523 | edge->u_step = u_step_fxp*1024;///16; //tmp*0x100000; | ||
524 | edge->u = (int)(/*(u_fxp/65536)*0x100000*/u_fxp/4 + 0xFFFFF); | ||
525 | } | ||
526 | |||
527 | // we need to do this to avoid stepping off the edges if a very nearly | ||
528 | // horizontal edge is less than epsilon above a scan, and numeric error causes | ||
529 | // it to incorrectly extend to the scan, and the extension of the line goes off | ||
530 | // the edge of the screen | ||
531 | // FIXME: is this actually needed? | ||
532 | if (edge->u < r_refdef.vrect_x_adj_shift20) | ||
533 | edge->u = r_refdef.vrect_x_adj_shift20; | ||
534 | if (edge->u > r_refdef.vrectright_adj_shift20) | ||
535 | edge->u = r_refdef.vrectright_adj_shift20; | ||
536 | |||
537 | // | ||
538 | // sort the edge in normally | ||
539 | // | ||
540 | u_check = edge->u; | ||
541 | if (edge->surfs[0]) | ||
542 | u_check++; // sort trailers after leaders | ||
543 | |||
544 | if (!newedges[v] || newedges[v]->u >= u_check) | ||
545 | { | ||
546 | edge->next = newedges[v]; | ||
547 | newedges[v] = edge; | ||
548 | } | ||
549 | else | ||
550 | { | ||
551 | pcheck = newedges[v]; | ||
552 | while (pcheck->next && pcheck->next->u < u_check) | ||
553 | pcheck = pcheck->next; | ||
554 | edge->next = pcheck->next; | ||
555 | pcheck->next = edge; | ||
556 | } | ||
557 | |||
558 | edge->nextremove = removeedges[v2]; | ||
559 | removeedges[v2] = edge; | ||
560 | } | ||
561 | #endif | ||
253 | 562 | ||
254 | /* | 563 | /* |
255 | ================ | 564 | ================ |
@@ -349,7 +658,11 @@ static inline void R_ClipEdge (mvertex_t *pv0, mvertex_t *pv1, clipplane_t *clip | |||
349 | } | 658 | } |
350 | 659 | ||
351 | // add the edge | 660 | // add the edge |
661 | #ifndef USE_PQ_OPT1 | ||
352 | R_EmitEdge (pv0, pv1); | 662 | R_EmitEdge (pv0, pv1); |
663 | #else | ||
664 | R_EmitEdge_fxp (pv0, pv1); | ||
665 | #endif | ||
353 | } | 666 | } |
354 | 667 | ||
355 | #endif // !id386 | 668 | #endif // !id386 |
diff --git a/apps/plugins/sdl/progs/quake/r_local.h b/apps/plugins/sdl/progs/quake/r_local.h index 910bdbffc9..ae3416ba2f 100644 --- a/apps/plugins/sdl/progs/quake/r_local.h +++ b/apps/plugins/sdl/progs/quake/r_local.h | |||
@@ -96,6 +96,11 @@ typedef struct clipplane_s | |||
96 | 96 | ||
97 | extern clipplane_t view_clipplanes[4]; | 97 | extern clipplane_t view_clipplanes[4]; |
98 | 98 | ||
99 | #ifdef USE_PQ_OPT2 | ||
100 | extern clipplane_fxp_t view_clipplanes_fxp[4]; | ||
101 | #endif | ||
102 | |||
103 | |||
99 | //============================================================================= | 104 | //============================================================================= |
100 | 105 | ||
101 | void R_RenderWorld (void); | 106 | void R_RenderWorld (void); |
@@ -277,6 +282,10 @@ extern int r_outofsurfaces; | |||
277 | extern int r_outofedges; | 282 | extern int r_outofedges; |
278 | 283 | ||
279 | extern mvertex_t *r_pcurrentvertbase; | 284 | extern mvertex_t *r_pcurrentvertbase; |
285 | extern mvertex_FPM_t *r_pcurrentvertbaseFPM; | ||
286 | #ifdef USE_PQ_OPT2 | ||
287 | extern mvertex_fxp_t *r_pcurrentvertbase_fxp; | ||
288 | #endif | ||
280 | extern int r_maxvalidedgeoffset; | 289 | extern int r_maxvalidedgeoffset; |
281 | 290 | ||
282 | void R_AliasClipTriangle (mtriangle_t *ptri); | 291 | void R_AliasClipTriangle (mtriangle_t *ptri); |
diff --git a/apps/plugins/sdl/progs/quake/r_main.c b/apps/plugins/sdl/progs/quake/r_main.c index dc785a850d..7776b46bde 100644 --- a/apps/plugins/sdl/progs/quake/r_main.c +++ b/apps/plugins/sdl/progs/quake/r_main.c | |||
@@ -62,6 +62,18 @@ vec3_t vup, base_vup; | |||
62 | vec3_t vpn, base_vpn; | 62 | vec3_t vpn, base_vpn; |
63 | vec3_t vright, base_vright; | 63 | vec3_t vright, base_vright; |
64 | vec3_t r_origin; | 64 | vec3_t r_origin; |
65 | #ifdef USE_PQ_OPT1 | ||
66 | int vup_fxp[3]; | ||
67 | int vpn_fxp[3]; | ||
68 | int vright_fxp[3]; | ||
69 | int xscale_fxp, yscale_fxp; | ||
70 | int xcenter_fxp, ycenter_fxp; | ||
71 | int r_refdef_fvrectx_adj_fxp; | ||
72 | int r_refdef_fvrectright_adj_fxp; | ||
73 | int r_refdef_fvrecty_adj_fxp; | ||
74 | int r_refdef_fvrectbottom_adj_fxp; | ||
75 | extern int modelorg_fxp[3]; | ||
76 | #endif | ||
65 | 77 | ||
66 | // | 78 | // |
67 | // screen size info | 79 | // screen size info |
@@ -421,6 +433,17 @@ void R_ViewChanged (vrect_t *pvrect, int lineadj, float aspect) | |||
421 | yscaleinv = 1.0 / yscale; | 433 | yscaleinv = 1.0 / yscale; |
422 | xscaleshrink = (r_refdef.vrect.width-6)/r_refdef.horizontalFieldOfView; | 434 | xscaleshrink = (r_refdef.vrect.width-6)/r_refdef.horizontalFieldOfView; |
423 | yscaleshrink = xscaleshrink*pixelAspect; | 435 | yscaleshrink = xscaleshrink*pixelAspect; |
436 | |||
437 | #ifdef USE_PQ_OPT1 | ||
438 | xscale_fxp=(int)(xscale*8388608.0); //9.23 | ||
439 | yscale_fxp=(int)(yscale*8388608.0); //9.23 | ||
440 | xcenter_fxp=(int)(xcenter*4194304.0); //10.22 | ||
441 | ycenter_fxp=(int)(ycenter*4194304.0); //10.22 | ||
442 | r_refdef_fvrectx_adj_fxp=(int)(r_refdef.fvrectx_adj*4194304.0); | ||
443 | r_refdef_fvrectright_adj_fxp=(int)(r_refdef.fvrectright_adj*4194304.0); | ||
444 | r_refdef_fvrecty_adj_fxp=(int)(r_refdef.fvrecty_adj*4194304.0); | ||
445 | r_refdef_fvrectbottom_adj_fxp=(int)(r_refdef.fvrectbottom_adj*4194304.0); | ||
446 | #endif | ||
424 | 447 | ||
425 | // left side clip | 448 | // left side clip |
426 | screenedge[0].normal[0] = -1.0 / (xOrigin*r_refdef.horizontalFieldOfView); | 449 | screenedge[0].normal[0] = -1.0 / (xOrigin*r_refdef.horizontalFieldOfView); |
@@ -789,6 +812,33 @@ void R_DrawBEntitiesOnList (void) | |||
789 | // FIXME: stop transforming twice | 812 | // FIXME: stop transforming twice |
790 | R_RotateBmodel (); | 813 | R_RotateBmodel (); |
791 | 814 | ||
815 | #ifdef USE_PQ_OPT1 | ||
816 | modelorg_fxp[0]=(int)(modelorg[0]*524288.0); | ||
817 | modelorg_fxp[1]=(int)(modelorg[1]*524288.0); | ||
818 | modelorg_fxp[2]=(int)(modelorg[2]*524288.0); | ||
819 | |||
820 | vright_fxp[0]=(int)(256.0/vright[0]); | ||
821 | if (!vright_fxp[0]) vright_fxp[0]=0x7fffffff; | ||
822 | vright_fxp[1]=(int)(256.0/vright[1]); | ||
823 | if (!vright_fxp[1]) vright_fxp[1]=0x7fffffff; | ||
824 | vright_fxp[2]=(int)(256.0/vright[2]); | ||
825 | if (!vright_fxp[2]) vright_fxp[2]=0x7fffffff; | ||
826 | |||
827 | vpn_fxp[0]=(int)(256.0/vpn[0]); | ||
828 | if (!vpn_fxp[0]) vpn_fxp[0]=0x7fffffff; | ||
829 | vpn_fxp[1]=(int)(256.0/vpn[1]); | ||
830 | if (!vpn_fxp[1]) vpn_fxp[1]=0x7fffffff; | ||
831 | vpn_fxp[2]=(int)(256.0/vpn[2]); | ||
832 | if (!vpn_fxp[2]) vpn_fxp[2]=0x7fffffff; | ||
833 | |||
834 | vup_fxp[0]=(int)(256.0/vup[0]); | ||
835 | if (!vup_fxp[0]) vup_fxp[0]=0x7fffffff; | ||
836 | vup_fxp[1]=(int)(256.0/vup[1]); | ||
837 | if (!vup_fxp[1]) vup_fxp[1]=0x7fffffff; | ||
838 | vup_fxp[2]=(int)(256.0/vup[2]); | ||
839 | if (!vup_fxp[2]) vup_fxp[2]=0x7fffffff; | ||
840 | #endif | ||
841 | |||
792 | // calculate dynamic lighting for bmodel if it's not an | 842 | // calculate dynamic lighting for bmodel if it's not an |
793 | // instanced model | 843 | // instanced model |
794 | if (clmodel->firstmodelsurface != 0) | 844 | if (clmodel->firstmodelsurface != 0) |
diff --git a/apps/plugins/sdl/progs/quake/render.h b/apps/plugins/sdl/progs/quake/render.h index b5f8382c31..46cd4e326f 100644 --- a/apps/plugins/sdl/progs/quake/render.h +++ b/apps/plugins/sdl/progs/quake/render.h | |||
@@ -110,6 +110,15 @@ extern int reinit_surfcache; | |||
110 | extern refdef_t r_refdef; | 110 | extern refdef_t r_refdef; |
111 | extern vec3_t r_origin, vpn, vright, vup; | 111 | extern vec3_t r_origin, vpn, vright, vup; |
112 | 112 | ||
113 | #ifdef USE_PQ_OPT1 | ||
114 | extern int vpn_fxp[3], vright_fxp[3], vup_fxp[3]; | ||
115 | extern int xscale_fxp, yscale_fxp, xcenter_fxp, ycenter_fxp; | ||
116 | extern int r_refdef_fvrectx_adj_fxp; | ||
117 | extern int r_refdef_fvrectright_adj_fxp; | ||
118 | extern int r_refdef_fvrecty_adj_fxp; | ||
119 | extern int r_refdef_fvrectbottom_adj_fxp; | ||
120 | #endif | ||
121 | |||
113 | extern struct texture_s *r_notexture_mip; | 122 | extern struct texture_s *r_notexture_mip; |
114 | 123 | ||
115 | 124 | ||