mirror of
https://github.com/UberGames/lilium-voyager.git
synced 2025-01-07 09:20:46 +00:00
* (bug #3639) BoxOnPlaneSide rewrite (Diego de Estrada/Patrick Bagget/Daniel
Gibson)
This commit is contained in:
parent
15ec986478
commit
a7d33b1c54
3 changed files with 15 additions and 694 deletions
370
code/asm/matha.s
370
code/asm/matha.s
|
@ -28,12 +28,6 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
|
||||||
#if id386
|
#if id386
|
||||||
|
|
||||||
.data
|
|
||||||
|
|
||||||
.align 4
|
|
||||||
Ljmptab: .long Lcase0, Lcase1, Lcase2, Lcase3
|
|
||||||
.long Lcase4, Lcase5, Lcase6, Lcase7
|
|
||||||
|
|
||||||
.text
|
.text
|
||||||
|
|
||||||
// TODO: rounding needed?
|
// TODO: rounding needed?
|
||||||
|
@ -57,368 +51,4 @@ LOutOfRange:
|
||||||
movl $0xFFFFFFFF,%eax
|
movl $0xFFFFFFFF,%eax
|
||||||
ret
|
ret
|
||||||
|
|
||||||
#if 0
|
|
||||||
|
|
||||||
#define in 4
|
|
||||||
#define out 8
|
|
||||||
|
|
||||||
.align 2
|
|
||||||
.globl C(TransformVector)
|
|
||||||
C(TransformVector):
|
|
||||||
movl in(%esp),%eax
|
|
||||||
movl out(%esp),%edx
|
|
||||||
|
|
||||||
flds (%eax) // in[0]
|
|
||||||
fmuls C(vright) // in[0]*vright[0]
|
|
||||||
flds (%eax) // in[0] | in[0]*vright[0]
|
|
||||||
fmuls C(vup) // in[0]*vup[0] | in[0]*vright[0]
|
|
||||||
flds (%eax) // in[0] | in[0]*vup[0] | in[0]*vright[0]
|
|
||||||
fmuls C(vpn) // in[0]*vpn[0] | in[0]*vup[0] | in[0]*vright[0]
|
|
||||||
|
|
||||||
flds 4(%eax) // in[1] | ...
|
|
||||||
fmuls C(vright)+4 // in[1]*vright[1] | ...
|
|
||||||
flds 4(%eax) // in[1] | in[1]*vright[1] | ...
|
|
||||||
fmuls C(vup)+4 // in[1]*vup[1] | in[1]*vright[1] | ...
|
|
||||||
flds 4(%eax) // in[1] | in[1]*vup[1] | in[1]*vright[1] | ...
|
|
||||||
fmuls C(vpn)+4 // in[1]*vpn[1] | in[1]*vup[1] | in[1]*vright[1] | ...
|
|
||||||
fxch %st(2) // in[1]*vright[1] | in[1]*vup[1] | in[1]*vpn[1] | ...
|
|
||||||
|
|
||||||
faddp %st(0),%st(5) // in[1]*vup[1] | in[1]*vpn[1] | ...
|
|
||||||
faddp %st(0),%st(3) // in[1]*vpn[1] | ...
|
|
||||||
faddp %st(0),%st(1) // vpn_accum | vup_accum | vright_accum
|
|
||||||
|
|
||||||
flds 8(%eax) // in[2] | ...
|
|
||||||
fmuls C(vright)+8 // in[2]*vright[2] | ...
|
|
||||||
flds 8(%eax) // in[2] | in[2]*vright[2] | ...
|
|
||||||
fmuls C(vup)+8 // in[2]*vup[2] | in[2]*vright[2] | ...
|
|
||||||
flds 8(%eax) // in[2] | in[2]*vup[2] | in[2]*vright[2] | ...
|
|
||||||
fmuls C(vpn)+8 // in[2]*vpn[2] | in[2]*vup[2] | in[2]*vright[2] | ...
|
|
||||||
fxch %st(2) // in[2]*vright[2] | in[2]*vup[2] | in[2]*vpn[2] | ...
|
|
||||||
|
|
||||||
faddp %st(0),%st(5) // in[2]*vup[2] | in[2]*vpn[2] | ...
|
|
||||||
faddp %st(0),%st(3) // in[2]*vpn[2] | ...
|
|
||||||
faddp %st(0),%st(1) // vpn_accum | vup_accum | vright_accum
|
|
||||||
|
|
||||||
fstps 8(%edx) // out[2]
|
|
||||||
fstps 4(%edx) // out[1]
|
|
||||||
fstps (%edx) // out[0]
|
|
||||||
|
|
||||||
ret
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#define EMINS 4+4
|
|
||||||
#define EMAXS 4+8
|
|
||||||
#define P 4+12
|
|
||||||
|
|
||||||
.align 2
|
|
||||||
.globl C(BoxOnPlaneSide)
|
|
||||||
C(BoxOnPlaneSide):
|
|
||||||
pushl %ebx
|
|
||||||
|
|
||||||
movl P(%esp),%edx
|
|
||||||
movl EMINS(%esp),%ecx
|
|
||||||
xorl %eax,%eax
|
|
||||||
movl EMAXS(%esp),%ebx
|
|
||||||
movb pl_signbits(%edx),%al
|
|
||||||
cmpb $8,%al
|
|
||||||
jge Lerror
|
|
||||||
flds pl_normal(%edx) // p->normal[0]
|
|
||||||
fld %st(0) // p->normal[0] | p->normal[0]
|
|
||||||
// bk000422 - warning: missing prefix `*' in absolute indirect address, maybe misassembled!
|
|
||||||
// bk001129 - fix from Andrew Henderson, was: Ljmptab(,%eax,4)
|
|
||||||
jmp *Ljmptab(,%eax,4)
|
|
||||||
|
|
||||||
|
|
||||||
//dist1= p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
|
|
||||||
//dist2= p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
|
|
||||||
Lcase0:
|
|
||||||
fmuls (%ebx) // p->normal[0]*emaxs[0] | p->normal[0]
|
|
||||||
flds pl_normal+4(%edx) // p->normal[1] | p->normal[0]*emaxs[0] |
|
|
||||||
// p->normal[0]
|
|
||||||
fxch %st(2) // p->normal[0] | p->normal[0]*emaxs[0] |
|
|
||||||
// p->normal[1]
|
|
||||||
fmuls (%ecx) // p->normal[0]*emins[0] |
|
|
||||||
// p->normal[0]*emaxs[0] | p->normal[1]
|
|
||||||
fxch %st(2) // p->normal[1] | p->normal[0]*emaxs[0] |
|
|
||||||
// p->normal[0]*emins[0]
|
|
||||||
fld %st(0) // p->normal[1] | p->normal[1] |
|
|
||||||
// p->normal[0]*emaxs[0] |
|
|
||||||
// p->normal[0]*emins[0]
|
|
||||||
fmuls 4(%ebx) // p->normal[1]*emaxs[1] | p->normal[1] |
|
|
||||||
// p->normal[0]*emaxs[0] |
|
|
||||||
// p->normal[0]*emins[0]
|
|
||||||
flds pl_normal+8(%edx) // p->normal[2] | p->normal[1]*emaxs[1] |
|
|
||||||
// p->normal[1] | p->normal[0]*emaxs[0] |
|
|
||||||
// p->normal[0]*emins[0]
|
|
||||||
fxch %st(2) // p->normal[1] | p->normal[1]*emaxs[1] |
|
|
||||||
// p->normal[2] | p->normal[0]*emaxs[0] |
|
|
||||||
// p->normal[0]*emins[0]
|
|
||||||
fmuls 4(%ecx) // p->normal[1]*emins[1] |
|
|
||||||
// p->normal[1]*emaxs[1] |
|
|
||||||
// p->normal[2] | p->normal[0]*emaxs[0] |
|
|
||||||
// p->normal[0]*emins[0]
|
|
||||||
fxch %st(2) // p->normal[2] | p->normal[1]*emaxs[1] |
|
|
||||||
// p->normal[1]*emins[1] |
|
|
||||||
// p->normal[0]*emaxs[0] |
|
|
||||||
// p->normal[0]*emins[0]
|
|
||||||
fld %st(0) // p->normal[2] | p->normal[2] |
|
|
||||||
// p->normal[1]*emaxs[1] |
|
|
||||||
// p->normal[1]*emins[1] |
|
|
||||||
// p->normal[0]*emaxs[0] |
|
|
||||||
// p->normal[0]*emins[0]
|
|
||||||
fmuls 8(%ebx) // p->normal[2]*emaxs[2] |
|
|
||||||
// p->normal[2] |
|
|
||||||
// p->normal[1]*emaxs[1] |
|
|
||||||
// p->normal[1]*emins[1] |
|
|
||||||
// p->normal[0]*emaxs[0] |
|
|
||||||
// p->normal[0]*emins[0]
|
|
||||||
fxch %st(5) // p->normal[0]*emins[0] |
|
|
||||||
// p->normal[2] |
|
|
||||||
// p->normal[1]*emaxs[1] |
|
|
||||||
// p->normal[1]*emins[1] |
|
|
||||||
// p->normal[0]*emaxs[0] |
|
|
||||||
// p->normal[2]*emaxs[2]
|
|
||||||
faddp %st(0),%st(3) //p->normal[2] |
|
|
||||||
// p->normal[1]*emaxs[1] |
|
|
||||||
// p->normal[1]*emins[1]+p->normal[0]*emins[0]|
|
|
||||||
// p->normal[0]*emaxs[0] |
|
|
||||||
// p->normal[2]*emaxs[2]
|
|
||||||
fmuls 8(%ecx) //p->normal[2]*emins[2] |
|
|
||||||
// p->normal[1]*emaxs[1] |
|
|
||||||
// p->normal[1]*emins[1]+p->normal[0]*emins[0]|
|
|
||||||
// p->normal[0]*emaxs[0] |
|
|
||||||
// p->normal[2]*emaxs[2]
|
|
||||||
fxch %st(1) //p->normal[1]*emaxs[1] |
|
|
||||||
// p->normal[2]*emins[2] |
|
|
||||||
// p->normal[1]*emins[1]+p->normal[0]*emins[0]|
|
|
||||||
// p->normal[0]*emaxs[0] |
|
|
||||||
// p->normal[2]*emaxs[2]
|
|
||||||
faddp %st(0),%st(3) //p->normal[2]*emins[2] |
|
|
||||||
// p->normal[1]*emins[1]+p->normal[0]*emins[0]|
|
|
||||||
// p->normal[0]*emaxs[0]+p->normal[1]*emaxs[1]|
|
|
||||||
// p->normal[2]*emaxs[2]
|
|
||||||
fxch %st(3) //p->normal[2]*emaxs[2] +
|
|
||||||
// p->normal[1]*emins[1]+p->normal[0]*emins[0]|
|
|
||||||
// p->normal[0]*emaxs[0]+p->normal[1]*emaxs[1]|
|
|
||||||
// p->normal[2]*emins[2]
|
|
||||||
faddp %st(0),%st(2) //p->normal[1]*emins[1]+p->normal[0]*emins[0]|
|
|
||||||
// dist1 | p->normal[2]*emins[2]
|
|
||||||
|
|
||||||
jmp LSetSides
|
|
||||||
|
|
||||||
//dist1= p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
|
|
||||||
//dist2= p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
|
|
||||||
Lcase1:
|
|
||||||
fmuls (%ecx) // emins[0]
|
|
||||||
flds pl_normal+4(%edx)
|
|
||||||
fxch %st(2)
|
|
||||||
fmuls (%ebx) // emaxs[0]
|
|
||||||
fxch %st(2)
|
|
||||||
fld %st(0)
|
|
||||||
fmuls 4(%ebx) // emaxs[1]
|
|
||||||
flds pl_normal+8(%edx)
|
|
||||||
fxch %st(2)
|
|
||||||
fmuls 4(%ecx) // emins[1]
|
|
||||||
fxch %st(2)
|
|
||||||
fld %st(0)
|
|
||||||
fmuls 8(%ebx) // emaxs[2]
|
|
||||||
fxch %st(5)
|
|
||||||
faddp %st(0),%st(3)
|
|
||||||
fmuls 8(%ecx) // emins[2]
|
|
||||||
fxch %st(1)
|
|
||||||
faddp %st(0),%st(3)
|
|
||||||
fxch %st(3)
|
|
||||||
faddp %st(0),%st(2)
|
|
||||||
|
|
||||||
jmp LSetSides
|
|
||||||
|
|
||||||
//dist1= p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
|
|
||||||
//dist2= p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
|
|
||||||
Lcase2:
|
|
||||||
fmuls (%ebx) // emaxs[0]
|
|
||||||
flds pl_normal+4(%edx)
|
|
||||||
fxch %st(2)
|
|
||||||
fmuls (%ecx) // emins[0]
|
|
||||||
fxch %st(2)
|
|
||||||
fld %st(0)
|
|
||||||
fmuls 4(%ecx) // emins[1]
|
|
||||||
flds pl_normal+8(%edx)
|
|
||||||
fxch %st(2)
|
|
||||||
fmuls 4(%ebx) // emaxs[1]
|
|
||||||
fxch %st(2)
|
|
||||||
fld %st(0)
|
|
||||||
fmuls 8(%ebx) // emaxs[2]
|
|
||||||
fxch %st(5)
|
|
||||||
faddp %st(0),%st(3)
|
|
||||||
fmuls 8(%ecx) // emins[2]
|
|
||||||
fxch %st(1)
|
|
||||||
faddp %st(0),%st(3)
|
|
||||||
fxch %st(3)
|
|
||||||
faddp %st(0),%st(2)
|
|
||||||
|
|
||||||
jmp LSetSides
|
|
||||||
|
|
||||||
//dist1= p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
|
|
||||||
//dist2= p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
|
|
||||||
Lcase3:
|
|
||||||
fmuls (%ecx) // emins[0]
|
|
||||||
flds pl_normal+4(%edx)
|
|
||||||
fxch %st(2)
|
|
||||||
fmuls (%ebx) // emaxs[0]
|
|
||||||
fxch %st(2)
|
|
||||||
fld %st(0)
|
|
||||||
fmuls 4(%ecx) // emins[1]
|
|
||||||
flds pl_normal+8(%edx)
|
|
||||||
fxch %st(2)
|
|
||||||
fmuls 4(%ebx) // emaxs[1]
|
|
||||||
fxch %st(2)
|
|
||||||
fld %st(0)
|
|
||||||
fmuls 8(%ebx) // emaxs[2]
|
|
||||||
fxch %st(5)
|
|
||||||
faddp %st(0),%st(3)
|
|
||||||
fmuls 8(%ecx) // emins[2]
|
|
||||||
fxch %st(1)
|
|
||||||
faddp %st(0),%st(3)
|
|
||||||
fxch %st(3)
|
|
||||||
faddp %st(0),%st(2)
|
|
||||||
|
|
||||||
jmp LSetSides
|
|
||||||
|
|
||||||
//dist1= p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
|
|
||||||
//dist2= p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
|
|
||||||
Lcase4:
|
|
||||||
fmuls (%ebx) // emaxs[0]
|
|
||||||
flds pl_normal+4(%edx)
|
|
||||||
fxch %st(2)
|
|
||||||
fmuls (%ecx) // emins[0]
|
|
||||||
fxch %st(2)
|
|
||||||
fld %st(0)
|
|
||||||
fmuls 4(%ebx) // emaxs[1]
|
|
||||||
flds pl_normal+8(%edx)
|
|
||||||
fxch %st(2)
|
|
||||||
fmuls 4(%ecx) // emins[1]
|
|
||||||
fxch %st(2)
|
|
||||||
fld %st(0)
|
|
||||||
fmuls 8(%ecx) // emins[2]
|
|
||||||
fxch %st(5)
|
|
||||||
faddp %st(0),%st(3)
|
|
||||||
fmuls 8(%ebx) // emaxs[2]
|
|
||||||
fxch %st(1)
|
|
||||||
faddp %st(0),%st(3)
|
|
||||||
fxch %st(3)
|
|
||||||
faddp %st(0),%st(2)
|
|
||||||
|
|
||||||
jmp LSetSides
|
|
||||||
|
|
||||||
//dist1= p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
|
|
||||||
//dist2= p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
|
|
||||||
Lcase5:
|
|
||||||
fmuls (%ecx) // emins[0]
|
|
||||||
flds pl_normal+4(%edx)
|
|
||||||
fxch %st(2)
|
|
||||||
fmuls (%ebx) // emaxs[0]
|
|
||||||
fxch %st(2)
|
|
||||||
fld %st(0)
|
|
||||||
fmuls 4(%ebx) // emaxs[1]
|
|
||||||
flds pl_normal+8(%edx)
|
|
||||||
fxch %st(2)
|
|
||||||
fmuls 4(%ecx) // emins[1]
|
|
||||||
fxch %st(2)
|
|
||||||
fld %st(0)
|
|
||||||
fmuls 8(%ecx) // emins[2]
|
|
||||||
fxch %st(5)
|
|
||||||
faddp %st(0),%st(3)
|
|
||||||
fmuls 8(%ebx) // emaxs[2]
|
|
||||||
fxch %st(1)
|
|
||||||
faddp %st(0),%st(3)
|
|
||||||
fxch %st(3)
|
|
||||||
faddp %st(0),%st(2)
|
|
||||||
|
|
||||||
jmp LSetSides
|
|
||||||
|
|
||||||
//dist1= p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
|
|
||||||
//dist2= p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
|
|
||||||
Lcase6:
|
|
||||||
fmuls (%ebx) // emaxs[0]
|
|
||||||
flds pl_normal+4(%edx)
|
|
||||||
fxch %st(2)
|
|
||||||
fmuls (%ecx) // emins[0]
|
|
||||||
fxch %st(2)
|
|
||||||
fld %st(0)
|
|
||||||
fmuls 4(%ecx) // emins[1]
|
|
||||||
flds pl_normal+8(%edx)
|
|
||||||
fxch %st(2)
|
|
||||||
fmuls 4(%ebx) // emaxs[1]
|
|
||||||
fxch %st(2)
|
|
||||||
fld %st(0)
|
|
||||||
fmuls 8(%ecx) // emins[2]
|
|
||||||
fxch %st(5)
|
|
||||||
faddp %st(0),%st(3)
|
|
||||||
fmuls 8(%ebx) // emaxs[2]
|
|
||||||
fxch %st(1)
|
|
||||||
faddp %st(0),%st(3)
|
|
||||||
fxch %st(3)
|
|
||||||
faddp %st(0),%st(2)
|
|
||||||
|
|
||||||
jmp LSetSides
|
|
||||||
|
|
||||||
//dist1= p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
|
|
||||||
//dist2= p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
|
|
||||||
Lcase7:
|
|
||||||
fmuls (%ecx) // emins[0]
|
|
||||||
flds pl_normal+4(%edx)
|
|
||||||
fxch %st(2)
|
|
||||||
fmuls (%ebx) // emaxs[0]
|
|
||||||
fxch %st(2)
|
|
||||||
fld %st(0)
|
|
||||||
fmuls 4(%ecx) // emins[1]
|
|
||||||
flds pl_normal+8(%edx)
|
|
||||||
fxch %st(2)
|
|
||||||
fmuls 4(%ebx) // emaxs[1]
|
|
||||||
fxch %st(2)
|
|
||||||
fld %st(0)
|
|
||||||
fmuls 8(%ecx) // emins[2]
|
|
||||||
fxch %st(5)
|
|
||||||
faddp %st(0),%st(3)
|
|
||||||
fmuls 8(%ebx) // emaxs[2]
|
|
||||||
fxch %st(1)
|
|
||||||
faddp %st(0),%st(3)
|
|
||||||
fxch %st(3)
|
|
||||||
faddp %st(0),%st(2)
|
|
||||||
|
|
||||||
LSetSides:
|
|
||||||
|
|
||||||
// sides = 0;
|
|
||||||
// if (dist1 >= p->dist)
|
|
||||||
// sides = 1;
|
|
||||||
// if (dist2 < p->dist)
|
|
||||||
// sides |= 2;
|
|
||||||
|
|
||||||
faddp %st(0),%st(2) // dist1 | dist2
|
|
||||||
fcomps pl_dist(%edx)
|
|
||||||
xorl %ecx,%ecx
|
|
||||||
fnstsw %ax
|
|
||||||
fcomps pl_dist(%edx)
|
|
||||||
andb $1,%ah
|
|
||||||
xorb $1,%ah
|
|
||||||
addb %ah,%cl
|
|
||||||
|
|
||||||
fnstsw %ax
|
|
||||||
andb $1,%ah
|
|
||||||
addb %ah,%ah
|
|
||||||
addb %ah,%cl
|
|
||||||
|
|
||||||
// return sides;
|
|
||||||
|
|
||||||
popl %ebx
|
|
||||||
movl %ecx,%eax // return status
|
|
||||||
|
|
||||||
ret
|
|
||||||
|
|
||||||
|
|
||||||
Lerror:
|
|
||||||
movl 1, %eax
|
|
||||||
ret
|
|
||||||
|
|
||||||
#endif // id386
|
#endif // id386
|
||||||
|
|
|
@ -34,13 +34,4 @@ Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
#define C(label) _##label
|
#define C(label) _##label
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// plane_t structure
|
|
||||||
// !!! if this is changed, it must be changed in q_shared.h too !!!
|
|
||||||
#define pl_normal 0
|
|
||||||
#define pl_dist 12
|
|
||||||
#define pl_type 16
|
|
||||||
#define pl_signbits 17
|
|
||||||
#define pl_pad 18
|
|
||||||
#define pl_size 20
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -647,48 +647,12 @@ void SetPlaneSignbits (cplane_t *out) {
|
||||||
BoxOnPlaneSide
|
BoxOnPlaneSide
|
||||||
|
|
||||||
Returns 1, 2, or 1 + 2
|
Returns 1, 2, or 1 + 2
|
||||||
|
|
||||||
// this is the slow, general version
|
|
||||||
int BoxOnPlaneSide2 (vec3_t emins, vec3_t emaxs, struct cplane_s *p)
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
float dist1, dist2;
|
|
||||||
int sides;
|
|
||||||
vec3_t corners[2];
|
|
||||||
|
|
||||||
for (i=0 ; i<3 ; i++)
|
|
||||||
{
|
|
||||||
if (p->normal[i] < 0)
|
|
||||||
{
|
|
||||||
corners[0][i] = emins[i];
|
|
||||||
corners[1][i] = emaxs[i];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
corners[1][i] = emins[i];
|
|
||||||
corners[0][i] = emaxs[i];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
dist1 = DotProduct (p->normal, corners[0]) - p->dist;
|
|
||||||
dist2 = DotProduct (p->normal, corners[1]) - p->dist;
|
|
||||||
sides = 0;
|
|
||||||
if (dist1 >= 0)
|
|
||||||
sides = 1;
|
|
||||||
if (dist2 < 0)
|
|
||||||
sides |= 2;
|
|
||||||
|
|
||||||
return sides;
|
|
||||||
}
|
|
||||||
|
|
||||||
==================
|
==================
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#if !id386
|
|
||||||
|
|
||||||
int BoxOnPlaneSide(vec3_t emins, vec3_t emaxs, struct cplane_s *p)
|
int BoxOnPlaneSide(vec3_t emins, vec3_t emaxs, struct cplane_s *p)
|
||||||
{
|
{
|
||||||
float dist1, dist2;
|
float dist[2];
|
||||||
int sides;
|
int sides, b, i;
|
||||||
|
|
||||||
// fast axial cases
|
// fast axial cases
|
||||||
if (p->type < 3)
|
if (p->type < 3)
|
||||||
|
@ -701,290 +665,26 @@ int BoxOnPlaneSide (vec3_t emins, vec3_t emaxs, struct cplane_s *p)
|
||||||
}
|
}
|
||||||
|
|
||||||
// general case
|
// general case
|
||||||
switch (p->signbits)
|
dist[0] = dist[1] = 0;
|
||||||
|
if (p->signbits < 8) // >= 8: default case is original code (dist[0]=dist[1]=0)
|
||||||
{
|
{
|
||||||
case 0:
|
for (i=0 ; i<3 ; i++)
|
||||||
dist1 = p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
|
{
|
||||||
dist2 = p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
|
b = (p->signbits >> i) & 1;
|
||||||
break;
|
dist[ b] += p->normal[i]*emaxs[i];
|
||||||
case 1:
|
dist[!b] += p->normal[i]*emins[i];
|
||||||
dist1 = p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
|
}
|
||||||
dist2 = p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
dist1 = p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
|
|
||||||
dist2 = p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
|
|
||||||
break;
|
|
||||||
case 3:
|
|
||||||
dist1 = p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
|
|
||||||
dist2 = p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
|
|
||||||
break;
|
|
||||||
case 4:
|
|
||||||
dist1 = p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
|
|
||||||
dist2 = p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
|
|
||||||
break;
|
|
||||||
case 5:
|
|
||||||
dist1 = p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emins[2];
|
|
||||||
dist2 = p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emaxs[2];
|
|
||||||
break;
|
|
||||||
case 6:
|
|
||||||
dist1 = p->normal[0]*emaxs[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
|
|
||||||
dist2 = p->normal[0]*emins[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
|
|
||||||
break;
|
|
||||||
case 7:
|
|
||||||
dist1 = p->normal[0]*emins[0] + p->normal[1]*emins[1] + p->normal[2]*emins[2];
|
|
||||||
dist2 = p->normal[0]*emaxs[0] + p->normal[1]*emaxs[1] + p->normal[2]*emaxs[2];
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
dist1 = dist2 = 0; // shut up compiler
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
sides = 0;
|
sides = 0;
|
||||||
if (dist1 >= p->dist)
|
if (dist[0] >= p->dist)
|
||||||
sides = 1;
|
sides = 1;
|
||||||
if (dist2 < p->dist)
|
if (dist[1] < p->dist)
|
||||||
sides |= 2;
|
sides |= 2;
|
||||||
|
|
||||||
return sides;
|
return sides;
|
||||||
}
|
}
|
||||||
#elif __GNUC__
|
|
||||||
// use matha.s
|
|
||||||
#else
|
|
||||||
#pragma warning( disable: 4035 )
|
|
||||||
|
|
||||||
__declspec( naked ) int BoxOnPlaneSide (vec3_t emins, vec3_t emaxs, struct cplane_s *p)
|
|
||||||
{
|
|
||||||
static int bops_initialized;
|
|
||||||
static int Ljmptab[8];
|
|
||||||
|
|
||||||
__asm {
|
|
||||||
|
|
||||||
push ebx
|
|
||||||
|
|
||||||
cmp bops_initialized, 1
|
|
||||||
je initialized
|
|
||||||
mov bops_initialized, 1
|
|
||||||
|
|
||||||
mov Ljmptab[0*4], offset Lcase0
|
|
||||||
mov Ljmptab[1*4], offset Lcase1
|
|
||||||
mov Ljmptab[2*4], offset Lcase2
|
|
||||||
mov Ljmptab[3*4], offset Lcase3
|
|
||||||
mov Ljmptab[4*4], offset Lcase4
|
|
||||||
mov Ljmptab[5*4], offset Lcase5
|
|
||||||
mov Ljmptab[6*4], offset Lcase6
|
|
||||||
mov Ljmptab[7*4], offset Lcase7
|
|
||||||
|
|
||||||
initialized:
|
|
||||||
|
|
||||||
mov edx,dword ptr[4+12+esp]
|
|
||||||
mov ecx,dword ptr[4+4+esp]
|
|
||||||
xor eax,eax
|
|
||||||
mov ebx,dword ptr[4+8+esp]
|
|
||||||
mov al,byte ptr[17+edx]
|
|
||||||
cmp al,8
|
|
||||||
jge Lerror
|
|
||||||
fld dword ptr[0+edx]
|
|
||||||
fld st(0)
|
|
||||||
jmp dword ptr[Ljmptab+eax*4]
|
|
||||||
Lcase0:
|
|
||||||
fmul dword ptr[ebx]
|
|
||||||
fld dword ptr[0+4+edx]
|
|
||||||
fxch st(2)
|
|
||||||
fmul dword ptr[ecx]
|
|
||||||
fxch st(2)
|
|
||||||
fld st(0)
|
|
||||||
fmul dword ptr[4+ebx]
|
|
||||||
fld dword ptr[0+8+edx]
|
|
||||||
fxch st(2)
|
|
||||||
fmul dword ptr[4+ecx]
|
|
||||||
fxch st(2)
|
|
||||||
fld st(0)
|
|
||||||
fmul dword ptr[8+ebx]
|
|
||||||
fxch st(5)
|
|
||||||
faddp st(3),st(0)
|
|
||||||
fmul dword ptr[8+ecx]
|
|
||||||
fxch st(1)
|
|
||||||
faddp st(3),st(0)
|
|
||||||
fxch st(3)
|
|
||||||
faddp st(2),st(0)
|
|
||||||
jmp LSetSides
|
|
||||||
Lcase1:
|
|
||||||
fmul dword ptr[ecx]
|
|
||||||
fld dword ptr[0+4+edx]
|
|
||||||
fxch st(2)
|
|
||||||
fmul dword ptr[ebx]
|
|
||||||
fxch st(2)
|
|
||||||
fld st(0)
|
|
||||||
fmul dword ptr[4+ebx]
|
|
||||||
fld dword ptr[0+8+edx]
|
|
||||||
fxch st(2)
|
|
||||||
fmul dword ptr[4+ecx]
|
|
||||||
fxch st(2)
|
|
||||||
fld st(0)
|
|
||||||
fmul dword ptr[8+ebx]
|
|
||||||
fxch st(5)
|
|
||||||
faddp st(3),st(0)
|
|
||||||
fmul dword ptr[8+ecx]
|
|
||||||
fxch st(1)
|
|
||||||
faddp st(3),st(0)
|
|
||||||
fxch st(3)
|
|
||||||
faddp st(2),st(0)
|
|
||||||
jmp LSetSides
|
|
||||||
Lcase2:
|
|
||||||
fmul dword ptr[ebx]
|
|
||||||
fld dword ptr[0+4+edx]
|
|
||||||
fxch st(2)
|
|
||||||
fmul dword ptr[ecx]
|
|
||||||
fxch st(2)
|
|
||||||
fld st(0)
|
|
||||||
fmul dword ptr[4+ecx]
|
|
||||||
fld dword ptr[0+8+edx]
|
|
||||||
fxch st(2)
|
|
||||||
fmul dword ptr[4+ebx]
|
|
||||||
fxch st(2)
|
|
||||||
fld st(0)
|
|
||||||
fmul dword ptr[8+ebx]
|
|
||||||
fxch st(5)
|
|
||||||
faddp st(3),st(0)
|
|
||||||
fmul dword ptr[8+ecx]
|
|
||||||
fxch st(1)
|
|
||||||
faddp st(3),st(0)
|
|
||||||
fxch st(3)
|
|
||||||
faddp st(2),st(0)
|
|
||||||
jmp LSetSides
|
|
||||||
Lcase3:
|
|
||||||
fmul dword ptr[ecx]
|
|
||||||
fld dword ptr[0+4+edx]
|
|
||||||
fxch st(2)
|
|
||||||
fmul dword ptr[ebx]
|
|
||||||
fxch st(2)
|
|
||||||
fld st(0)
|
|
||||||
fmul dword ptr[4+ecx]
|
|
||||||
fld dword ptr[0+8+edx]
|
|
||||||
fxch st(2)
|
|
||||||
fmul dword ptr[4+ebx]
|
|
||||||
fxch st(2)
|
|
||||||
fld st(0)
|
|
||||||
fmul dword ptr[8+ebx]
|
|
||||||
fxch st(5)
|
|
||||||
faddp st(3),st(0)
|
|
||||||
fmul dword ptr[8+ecx]
|
|
||||||
fxch st(1)
|
|
||||||
faddp st(3),st(0)
|
|
||||||
fxch st(3)
|
|
||||||
faddp st(2),st(0)
|
|
||||||
jmp LSetSides
|
|
||||||
Lcase4:
|
|
||||||
fmul dword ptr[ebx]
|
|
||||||
fld dword ptr[0+4+edx]
|
|
||||||
fxch st(2)
|
|
||||||
fmul dword ptr[ecx]
|
|
||||||
fxch st(2)
|
|
||||||
fld st(0)
|
|
||||||
fmul dword ptr[4+ebx]
|
|
||||||
fld dword ptr[0+8+edx]
|
|
||||||
fxch st(2)
|
|
||||||
fmul dword ptr[4+ecx]
|
|
||||||
fxch st(2)
|
|
||||||
fld st(0)
|
|
||||||
fmul dword ptr[8+ecx]
|
|
||||||
fxch st(5)
|
|
||||||
faddp st(3),st(0)
|
|
||||||
fmul dword ptr[8+ebx]
|
|
||||||
fxch st(1)
|
|
||||||
faddp st(3),st(0)
|
|
||||||
fxch st(3)
|
|
||||||
faddp st(2),st(0)
|
|
||||||
jmp LSetSides
|
|
||||||
Lcase5:
|
|
||||||
fmul dword ptr[ecx]
|
|
||||||
fld dword ptr[0+4+edx]
|
|
||||||
fxch st(2)
|
|
||||||
fmul dword ptr[ebx]
|
|
||||||
fxch st(2)
|
|
||||||
fld st(0)
|
|
||||||
fmul dword ptr[4+ebx]
|
|
||||||
fld dword ptr[0+8+edx]
|
|
||||||
fxch st(2)
|
|
||||||
fmul dword ptr[4+ecx]
|
|
||||||
fxch st(2)
|
|
||||||
fld st(0)
|
|
||||||
fmul dword ptr[8+ecx]
|
|
||||||
fxch st(5)
|
|
||||||
faddp st(3),st(0)
|
|
||||||
fmul dword ptr[8+ebx]
|
|
||||||
fxch st(1)
|
|
||||||
faddp st(3),st(0)
|
|
||||||
fxch st(3)
|
|
||||||
faddp st(2),st(0)
|
|
||||||
jmp LSetSides
|
|
||||||
Lcase6:
|
|
||||||
fmul dword ptr[ebx]
|
|
||||||
fld dword ptr[0+4+edx]
|
|
||||||
fxch st(2)
|
|
||||||
fmul dword ptr[ecx]
|
|
||||||
fxch st(2)
|
|
||||||
fld st(0)
|
|
||||||
fmul dword ptr[4+ecx]
|
|
||||||
fld dword ptr[0+8+edx]
|
|
||||||
fxch st(2)
|
|
||||||
fmul dword ptr[4+ebx]
|
|
||||||
fxch st(2)
|
|
||||||
fld st(0)
|
|
||||||
fmul dword ptr[8+ecx]
|
|
||||||
fxch st(5)
|
|
||||||
faddp st(3),st(0)
|
|
||||||
fmul dword ptr[8+ebx]
|
|
||||||
fxch st(1)
|
|
||||||
faddp st(3),st(0)
|
|
||||||
fxch st(3)
|
|
||||||
faddp st(2),st(0)
|
|
||||||
jmp LSetSides
|
|
||||||
Lcase7:
|
|
||||||
fmul dword ptr[ecx]
|
|
||||||
fld dword ptr[0+4+edx]
|
|
||||||
fxch st(2)
|
|
||||||
fmul dword ptr[ebx]
|
|
||||||
fxch st(2)
|
|
||||||
fld st(0)
|
|
||||||
fmul dword ptr[4+ecx]
|
|
||||||
fld dword ptr[0+8+edx]
|
|
||||||
fxch st(2)
|
|
||||||
fmul dword ptr[4+ebx]
|
|
||||||
fxch st(2)
|
|
||||||
fld st(0)
|
|
||||||
fmul dword ptr[8+ecx]
|
|
||||||
fxch st(5)
|
|
||||||
faddp st(3),st(0)
|
|
||||||
fmul dword ptr[8+ebx]
|
|
||||||
fxch st(1)
|
|
||||||
faddp st(3),st(0)
|
|
||||||
fxch st(3)
|
|
||||||
faddp st(2),st(0)
|
|
||||||
LSetSides:
|
|
||||||
faddp st(2),st(0)
|
|
||||||
fcomp dword ptr[12+edx]
|
|
||||||
xor ecx,ecx
|
|
||||||
fnstsw ax
|
|
||||||
fcomp dword ptr[12+edx]
|
|
||||||
and ah,1
|
|
||||||
xor ah,1
|
|
||||||
add cl,ah
|
|
||||||
fnstsw ax
|
|
||||||
and ah,1
|
|
||||||
add ah,ah
|
|
||||||
add cl,ah
|
|
||||||
pop ebx
|
|
||||||
mov eax,ecx
|
|
||||||
ret
|
|
||||||
Lerror:
|
|
||||||
int 3
|
|
||||||
}
|
|
||||||
}
|
|
||||||
#pragma warning( default: 4035 )
|
|
||||||
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
=================
|
=================
|
||||||
|
|
Loading…
Reference in a new issue