# 
# Copyright (C) 1996-1997 Id Software, Inc. 
# 
# This program is free software; you can redistribute it and/or 
# modify it under the terms of the GNU General Public License 
# as published by the Free Software Foundation; either version 2 
# of the License, or (at your option) any later version. 
# 
# This program is distributed in the hope that it will be useful, 
# but WITHOUT ANY WARRANTY; without even the implied warranty of 
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.   
# 
# See the GNU General Public License for more details. 
# 
# You should have received a copy of the GNU General Public License 
# along with this program; if not, write to the Free Software 
# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA. 
# 

##
## Quake for AMIGA
##
## r_bspPPC.s
##
## Define WOS for PowerOpen ABI, otherwise SVR4-ABI is used.
##

.include        "macrosPPC.i"

#
# external references
#

	xrefv	r_visframecount
	xrefv	r_framecount
	xrefv	r_currentkey
	xrefv	r_drawpolys
	xrefv	r_worldpolysbacktofront
	xrefv	pbtofpolys
	xrefv	numbtofpolys
	xrefv	pfrustum_indexes
	xrefa	modelorg
	xrefa	vpn
	xrefa	vright
	xrefa	vup
	xrefa	view_clipplanes
	xrefv	currententity
	xrefa	screenedge
	xrefa	entity_rotation

.ifdef	__STORM__
	xrefv	sin__r
	xrefv	cos__r
.else
	xrefv	sin
	xrefv	cos
.endif

#
# defines
#

.set	PITCH                ,0
.set	YAW                  ,1
.set	ROLL                 ,2

.set	CLIP_NORMAL          ,0
.set	CLIP_DIST            ,12
.set	CLIP_NEXT            ,16
.set	CLIP_LEFTEDGE        ,20
.set	CLIP_RIGHTEDGE       ,21
.set	CLIP_RESERVED        ,22
.set	CLIP_SIZEOF          ,24

.set	MPLANE_NORMAL        ,0
.set	MPLANE_DIST          ,12
.set	MPLANE_TYPE          ,16
.set	MPLANE_SIGNBITS      ,17
.set	MPLANE_SIZEOF        ,20

.set	ENTITY_KEYNUM		,0
.set	ENTITY_ORIGIN		,4
.set	ENTITY_ANGLES		,16
.set	ENTITY_MODEL		,28
.set	ENTITY_FRAME		,32
.set	ENTITY_COLORMAP		,36
.set	ENTITY_SKINNUM		,40
.set	ENTITY_SCOREBOARD	,44
.set	ENTITY_SYNCBASE		,48
.set	ENTITY_EFRAG		,52
.set	ENTITY_VISFRAME		,56
.set	ENTITY_DLIGHTFRAME	,60
.set	ENTITY_DLIGHTBITS	,64
.set	ENTITY_TRIVIAL_ACCEPT	,68
.set	ENTITY_TOPNODE		,72
.set	ENTITY_SIZEOF           ,76





###########################################################################
#
#       void R_RotateBmodel (void)
#
###########################################################################

	funcdef	R_RotateBmodel

	init	0,0,1,18
	stw	r31,gb(r1)
	stfd	f14,fb+0*8(r1)
	stfd	f15,fb+1*8(r1)
	stfd	f16,fb+2*8(r1)
	stfd	f17,fb+3*8(r1)
	stfd	f18,fb+4*8(r1)
	stfd	f19,fb+5*8(r1)
	stfd	f20,fb+6*8(r1)
	stfd	f21,fb+7*8(r1)
	stfd	f22,fb+8*8(r1)
	stfd	f23,fb+9*8(r1)
	stfd	f24,fb+10*8(r1)
	stfd	f25,fb+11*8(r1)
	stfd	f26,fb+12*8(r1)
	stfd	f27,fb+13*8(r1)
	stfd	f28,fb+14*8(r1)
	stfd	f29,fb+15*8(r1)
	stfd	f30,fb+16*8(r1)
	stfd	f31,fb+17*8(r1)

	ls      f14,cPI
	lw      r31,currententity
	lfs     f1,ENTITY_ANGLES+YAW*4(r31)
	fmuls   f15,f1,f14
	fmr     f1,f15
	mcall	sin
	fmr     f16,f1                  #f16 = s [YAW]
	fmr     f1,f15
	mcall	cos
	fmr     f17,f1                  #f17 = c [YAW]
	lfs     f1,ENTITY_ANGLES+PITCH*4(r31)
	fmuls   f15,f1,f14
	fmr     f1,f15
	mcall	sin
	fmr     f18,f1                  #f18 = s [PITCH]
	fmr     f1,f15
	mcall	cos
	fmr     f19,f1                  #f19 = c [PITCH] = 32(a2)
	lfs     f1,ENTITY_ANGLES+ROLL*4(r31)
	fmuls   f15,f1,f14
	fmr     f1,f15
	mcall	sin
	fmr     f20,f1                  #f20 = s [ROLL]
	fmr     f1,f15
	mcall	cos
	fmuls   f0,f17,f19
	fmr     f15,f1                  #f15 = c [ROLL]
	lxa     r3,entity_rotation 	#r3 = entity_rotation
	stfs    f0,0(r3)                #f0 = entity_rotation [0,0]
	fmuls   f1,f16,f19              #f1 = 4(a2)
	fneg    f2,f18                  #f2 = 8(a2)
	fneg    f3,f16
	fmuls   f4,f17,f18
	stfs    f3,12(r3)               #f3 = entity_rotation[1,0]
	stfs    f4,24(r3)               #f4 = entity_rotation[2,0]
	fmuls   f5,f16,f18              #f5 = 28(a2)
	fmuls   f6,f20,f2
	fmsubs  f7,f15,f1,f6
	fmuls   f8,f20,f1
	stfs    f7,4(r3)                #f7 = entity_rotation[0,1]
	fmuls   f12,f20,f19
	fmadds  f9,f2,f15,f8
	fmuls   f10,f17,f15
	stfs    f9,8(r3)                #f9 = entity_rotation[0,2]
	stfs    f10,16(r3)              #f10 = entity_rotation[1,1]
	fmuls   f2,f19,f15
	fmuls   f11,f17,f20
	fmsubs  f13,f15,f5,f12
	stfs    f11,20(r3)              #f11 = entity_rotation[1,2]
	stfs    f13,28(r3)              #f13 = entity_rotation[2,1]
	fmadds  f1,f20,f5,f2
	stfs    f1,32(r3)               #f1 = entity_rotation[2,2]
	lxa     r7,modelorg
	lfs     f19,0(r7)               #f19 = modelorg[0]
	lfs     f20,4(r7)               #f20 = modelorg[1]
	lfs     f21,8(r7)               #f21 = modelorg[2]
	lxa     r4,vpn
	lfs     f2,0(r4)                #f2 = vpn[0]
	lfs     f6,4(r4)                #f6 = vpn[1]
	lfs     f8,8(r4)                #f8 = vpn[2]
	lxa     r5,vright
	lfs     f12,0(r5)               #f12 = vright[0]
	lfs     f14,4(r5)               #f14 = vright[1]
	lfs     f15,8(r5)               #f15 = vright[2]
	lxa     r6,vup
	lfs     f16,0(r6)               #f16 = vup[0]
	lfs     f17,4(r6)               #f17 = vup[1]
	lfs     f18,8(r6)               #f18 = vup[2]

	fmuls   f22,f19,f0
	fmuls   f25,f2,f0
	fmuls   f28,f12,f0
	fmuls   f31,f16,f0
	fmadds  f22,f20,f7,f22
	fmadds  f25,f6,f7,f25
	fmadds  f28,f14,f7,f28
	fmadds  f31,f17,f7,f31
	fmadds  f22,f21,f9,f22
	fmadds  f25,f8,f9,f25
	fmadds  f28,f15,f9,f28
	fmadds  f31,f18,f9,f31
	fmuls   f23,f19,f3
	fmuls   f26,f2,f3
	fmuls   f29,f12,f3
	fmuls   f0,f16,f3
	fmadds  f23,f20,f10,f23
	fmadds  f26,f6,f10,f26
	fmadds  f29,f14,f10,f29
	fmadds  f0,f17,f10,f0
	fmadds  f23,f21,f11,f23
	fmadds  f26,f8,f11,f26
	fmadds  f29,f15,f11,f29
	fmadds  f0,f18,f11,f0
	fmuls   f24,f19,f4
	fmuls   f27,f2,f4
	fmuls   f30,f12,f4
	fmuls   f7,f16,f4
	fmadds  f24,f20,f13,f24
	fmadds  f27,f6,f13,f27
	fmadds  f30,f14,f13,f30
	fmadds  f7,f17,f13,f7
	fmadds  f21,f21,f1,f24
	fmadds  f8,f8,f1,f27
	fmadds  f15,f15,f1,f30
	fmadds  f18,f18,f1,f7
	fmr     f19,f22
	fmr     f2,f25
	fmr     f12,f28
	fmr     f16,f31
	fmr     f20,f23
	fmr     f6,f26
	fmr     f14,f29
	fmr     f17,f0

	li      r0,4
	mtctr   r0
	lxa     r8,screenedge
	subi    r8,r8,4
	lxa     r9,view_clipplanes
	subi    r9,r9,4
.loop:
	lfsu    f0,4(r8)
	lfsu    f7,4(r8)
	lfsu    f9,4(r8)
	fmuls   f3,f16,f7
	fmuls   f10,f17,f7
	fmuls   f11,f18,f7
	fmadds  f3,f2,f9,f3
	fmadds  f10,f6,f9,f10
	fmadds  f11,f8,f9,f11
	fnmsubs f3,f12,f0,f3
	stfsu   f3,4(r9)
	fmuls   f3,f3,f19
	fnmsubs f10,f14,f0,f10
	stfsu   f10,4(r9)
	fmadds  f3,f10,f20,f3
	fnmsubs f11,f15,f0,f11
	stfsu   f11,4(r9)
	fmadds  f3,f11,f21,f3
	la      r8,MPLANE_SIZEOF-12(r8)
	stfsu   f3,4(r9)
	la      r9,CLIP_SIZEOF-16(r9)
	bdnz    .loop

	stfs    f19,0(r7)
	stfs    f20,4(r7)
	stfs    f21,8(r7)
	stfs    f2,0(r4)
	stfs    f6,4(r4)
	stfs    f8,8(r4)
	stfs    f12,0(r5)
	stfs    f14,4(r5)
	stfs    f15,8(r5)
	stfs    f16,0(r6)
	stfs    f17,4(r6)
	stfs    f18,8(r6)

	lfd	f14,fb+0*8(r1)
	lfd	f15,fb+1*8(r1)
	lfd	f16,fb+2*8(r1)
	lfd	f17,fb+3*8(r1)
	lfd	f18,fb+4*8(r1)
	lfd	f19,fb+5*8(r1)
	lfd	f20,fb+6*8(r1)
	lfd	f21,fb+7*8(r1)
	lfd	f22,fb+8*8(r1)
	lfd	f23,fb+9*8(r1)
	lfd	f24,fb+10*8(r1)
	lfd	f25,fb+11*8(r1)
	lfd	f26,fb+12*8(r1)
	lfd	f27,fb+13*8(r1)
	lfd	f28,fb+14*8(r1)
	lfd	f29,fb+15*8(r1)
	lfd	f30,fb+16*8(r1)
	lfd	f31,fb+17*8(r1)
	lwz	r31,gb(r1)
	exit

	funcend	R_RotateBmodel




.ifdef	WOS
	.tocd
.else
	.data
.endif

lab cPI
	.float	0.017453293		# => M_PI*2/360
