summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--apps/plugins/sdl/progs/quake/FixedPointMath.h246
-rw-r--r--apps/plugins/sdl/progs/quake/d_polyse.c99
-rw-r--r--apps/plugins/sdl/progs/quake/mathlib.h13
-rw-r--r--apps/plugins/sdl/progs/quake/model.h14
-rw-r--r--apps/plugins/sdl/progs/quake/quakedef.h12
-rw-r--r--apps/plugins/sdl/progs/quake/r_bsp.c109
-rw-r--r--apps/plugins/sdl/progs/quake/r_draw.c313
-rw-r--r--apps/plugins/sdl/progs/quake/r_local.h9
-rw-r--r--apps/plugins/sdl/progs/quake/r_main.c50
-rw-r--r--apps/plugins/sdl/progs/quake/render.h9
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
16typedef long fixedpoint_t;
17typedef long fixedpoint8_24_t;
18
19
20fixedpoint_t fpm_FromFloat(double f);
21float fpm_ToFloat(fixedpoint_t fxp);
22
23fixedpoint_t fpm_FromLong(long l);
24long fpm_ToLong(fixedpoint_t fxp);
25
26fixedpoint_t fpm_Add(fixedpoint_t fxp1, fixedpoint_t fxp2);
27fixedpoint_t fpm_Add3(fixedpoint_t fxp1, fixedpoint_t fxp2, fixedpoint_t fxp3);
28
29fixedpoint_t fpm_Sub(fixedpoint_t fxp1, fixedpoint_t fxp2);
30
31fixedpoint_t fpm_Mul(fixedpoint_t fxp1, fixedpoint_t fxp2);
32
33fixedpoint_t fpm_Div(fixedpoint_t fxp1, fixedpoint_t fxp2);
34fixedpoint_t fpm_DivInt(fixedpoint_t fxp1, long l);
35fixedpoint_t fpm_Abs(fixedpoint_t fxp);
36
37fixedpoint_t fpm_Ceil(fixedpoint_t fxp);
38fixedpoint_t fpm_Floor(fixedpoint_t fxp);
39
40fixedpoint_t fpm_Sqrt(fixedpoint_t fxp);
41fixedpoint_t fpm_Sqr(fixedpoint_t fxp);
42
43fixedpoint_t fpm_Inv(fixedpoint_t fxp);
44
45fixedpoint_t fpm_Sin(fixedpoint_t fxp);
46fixedpoint_t fpm_Cos(fixedpoint_t fxp);
47fixedpoint_t fpm_Tan(fixedpoint_t fxp);
48fixedpoint_t fpm_ATan(fixedpoint_t fxp);
49//These take degrees
50fixedpoint_t fpm_SinDeg(fixedpoint_t fxp);
51fixedpoint_t fpm_CosDeg(fixedpoint_t fxp);
52fixedpoint_t fpm_TanDeg(fixedpoint_t fxp);
53fixedpoint_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
98fixedpoint8_24_t fpm_FromFloat(double f);
99float fpm_ToFloat8_24(fixedpoint8_24_t fxp);
100
101fixedpoint8_24_t fpm_FromLong8_24(long l);
102long fpm_ToLong8_24(fixedpoint8_24_t fxp);
103
104fixedpoint8_24_t fpm_FromFixedPoint(fixedpoint_t fxp);
105fixedpoint_t fpm_ToFixedPoint(fixedpoint8_24_t fxp);
106
107fixedpoint8_24_t fpm_Add8_24(fixedpoint8_24_t fxp1, fixedpoint8_24_t fxp2);
108fixedpoint8_24_t fpm_Add38_24(fixedpoint8_24_t fxp1, fixedpoint8_24_t fxp2, fixedpoint8_24_t fxp3);
109
110fixedpoint8_24_t fpm_Sub8_24(fixedpoint8_24_t fxp1, fixedpoint8_24_t fxp2);
111
112fixedpoint8_24_t fpm_Mul8_24(fixedpoint8_24_t fxp1, fixedpoint8_24_t fxp2);
113fixedpoint_t fpm_MulMixed8_24(fixedpoint8_24_t fxp1, fixedpoint_t fxp2);
114
115fixedpoint8_24_t fpm_Div8_24(fixedpoint8_24_t fxp1, fixedpoint8_24_t fxp2);
116fixedpoint8_24_t fpm_DivInt8_24(fixedpoint8_24_t fxp1, long l);
117fixedpoint8_24_t fpm_DivInt64_8_24(fixedpoint8_24_t fxp1, long long l);
118
119fixedpoint8_24_t fpm_Abs8_24(fixedpoint8_24_t fxp);
120
121fixedpoint8_24_t fpm_Ceil8_24(fixedpoint8_24_t fxp);
122fixedpoint8_24_t fpm_Floor8_24(fixedpoint8_24_t fxp);
123
124fixedpoint8_24_t fpm_Sqrt8_24(fixedpoint8_24_t fxp);
125fixedpoint8_24_t fpm_Sqr8_24(fixedpoint8_24_t fxp);
126
127fixedpoint8_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/*
140extern __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
197typedef float fixedpoint_t;
198//This variable must be declared in one of the implementation files.
199extern __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);
122D_PolysetDraw 122D_PolysetDraw
123================ 123================
124*/ 124*/
125#ifndef USE_PQ_OPT
125void D_PolysetDraw (void) 126void 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.
147void 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,
528D_PolysetCalcGradients 543D_PolysetCalcGradients
529================ 544================
530*/ 545*/
546#ifndef USE_PQ_OPT4
531void D_PolysetCalcGradients (int skinwidth) 547void 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
603void 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
26typedef int fpvec3[3];
27#endif
28
29typedef fixedpoint_t vec3_FPM_t[3];
30typedef fixedpoint8_24_t vec3_8_24FPM_t[3];
31typedef fixedpoint_t vec5_FPM_t[5];
32
33//End Dan
34
22typedef float vec_t; 35typedef float vec_t;
23typedef vec_t vec3_t[3]; 36typedef vec_t vec3_t[3];
24typedef vec_t vec5_t[5]; 37typedef 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
52typedef struct
53{
54 int position[3];
55} mvertex_fxp_t;
56
57typedef 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//
28qboolean insubmodel; 28qboolean insubmodel;
29entity_t *currententity; 29entity_t *currententity;
30
31#ifdef USE_PQ_OPT1
32int modelorg_fxp[3];
33#endif
34
30vec3_t modelorg, base_modelorg; 35vec3_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
449int clipplanes_fxp[4][3];
450int clipdist_fxp[4];
451#endif
443 452
444/* 453/*
445================ 454================
@@ -449,11 +458,16 @@ R_RecursiveWorldNode
449void R_RecursiveWorldNode (mnode_t *node, int clipflags) 458void 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;
44clipplane_t view_clipplanes[4]; 44clipplane_t view_clipplanes[4];
45clipplane_t world_clipplanes[16]; 45clipplane_t world_clipplanes[16];
46 46
47#ifdef USE_PQ_OPT2
48clipplane_fxp_t view_clipplanes_fxp[4];
49#endif
50
47medge_t *r_pedge; 51medge_t *r_pedge;
48 52
49qboolean r_leftclipped, r_rightclipped; 53qboolean r_leftclipped, r_rightclipped;
@@ -67,6 +71,11 @@ float r_nearzi;
67float r_u1, r_v1, r_lzi1; 71float r_u1, r_v1, r_lzi1;
68int r_ceilv1; 72int r_ceilv1;
69 73
74#ifdef USE_PQ_OPT1
75int r_u1_fxp, r_v1_fxp, r_lzi1_fxp;
76extern int modelorg_fxp[3];
77#endif
78
70qboolean r_lastvertvalid; 79qboolean 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
263void 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
97extern clipplane_t view_clipplanes[4]; 97extern clipplane_t view_clipplanes[4];
98 98
99#ifdef USE_PQ_OPT2
100extern clipplane_fxp_t view_clipplanes_fxp[4];
101#endif
102
103
99//============================================================================= 104//=============================================================================
100 105
101void R_RenderWorld (void); 106void R_RenderWorld (void);
@@ -277,6 +282,10 @@ extern int r_outofsurfaces;
277extern int r_outofedges; 282extern int r_outofedges;
278 283
279extern mvertex_t *r_pcurrentvertbase; 284extern mvertex_t *r_pcurrentvertbase;
285extern mvertex_FPM_t *r_pcurrentvertbaseFPM;
286#ifdef USE_PQ_OPT2
287extern mvertex_fxp_t *r_pcurrentvertbase_fxp;
288#endif
280extern int r_maxvalidedgeoffset; 289extern int r_maxvalidedgeoffset;
281 290
282void R_AliasClipTriangle (mtriangle_t *ptri); 291void 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;
62vec3_t vpn, base_vpn; 62vec3_t vpn, base_vpn;
63vec3_t vright, base_vright; 63vec3_t vright, base_vright;
64vec3_t r_origin; 64vec3_t r_origin;
65#ifdef USE_PQ_OPT1
66int vup_fxp[3];
67int vpn_fxp[3];
68int vright_fxp[3];
69int xscale_fxp, yscale_fxp;
70int xcenter_fxp, ycenter_fxp;
71int r_refdef_fvrectx_adj_fxp;
72int r_refdef_fvrectright_adj_fxp;
73int r_refdef_fvrecty_adj_fxp;
74int r_refdef_fvrectbottom_adj_fxp;
75extern 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;
110extern refdef_t r_refdef; 110extern refdef_t r_refdef;
111extern vec3_t r_origin, vpn, vright, vup; 111extern vec3_t r_origin, vpn, vright, vup;
112 112
113#ifdef USE_PQ_OPT1
114extern int vpn_fxp[3], vright_fxp[3], vup_fxp[3];
115extern int xscale_fxp, yscale_fxp, xcenter_fxp, ycenter_fxp;
116extern int r_refdef_fvrectx_adj_fxp;
117extern int r_refdef_fvrectright_adj_fxp;
118extern int r_refdef_fvrecty_adj_fxp;
119extern int r_refdef_fvrectbottom_adj_fxp;
120#endif
121
113extern struct texture_s *r_notexture_mip; 122extern struct texture_s *r_notexture_mip;
114 123
115 124