;*************************
;* LR by BTG on 17.03.91 *
;*************************
; bsr Viewer_Sphere to get in orbit around object
; bsr D3_View to plot calculated object in 3D-Wire
; See Obj_Data how an object is structered

;*** Macro definition : equals asr.l #14,Dx
TD_Shift: MACRO
	swap	d?1
	rol.l	#2,d?1
	ext.l	d?1
	ENDM

;*** Viewer on orbit by degr,degn,degk
Viewer_Sphere:
	move.w	degr(pc),d0
	add.w	d0,d0
	move.w	degn(pc),d1
	add.w	d1,d1
	lea	cos(pc),a0	; costab -> a0
	lea	256(a0),a1	; sintab -> a1
	lea	xvie(pc),a2
	move.w	(a1,d0.w),d3	; Sin degr
	move.w	(a1,d1.w),d5	; Sin Degn
	move.w	(a0,d0.w),d2	; Cos degr
	move.w	(a0,d1.w),d4	; Cos degn

	move.w	d3,d6
	muls	d4,d6
	td_shift 6
	asr.w	#8,d6
	neg.w	d6
	move.w	d6,(a2)

	move.w	d5,d6
	asr.w	#8,d6
	move.w	d6,2(a2)

	move.w	d2,d6
	ext.l	d6
	muls	d4,d6
	td_shift 6
	asr.w	#8,d6
	neg.w	d6
	move.w	d6,4(a2)
	rts
D3_Zoom:dc.l	200

D3_VIEW:
	bsr	TD_Transform	; init Matrix
	move.l	D3_ObjData(pc),a5
	move.l	(a5),a5		; Pnt to PointData
	lea	D3_TransData(pc),a4
	lea	xpos(pc),a3
	move.l	#[4*52],d7
	move.l	#287/2,d6
D3_CalcZero:
	clr.w	(a3)
	clr.w	2(a3)
	clr.w	4(a3)
	bsr.l	td_make3dpoint
	neg.w	x3d
	neg.w	y3d
	move.w	x3d(pc),D3_Centre
	move.w	y3d(pc),D3_Centre+2
D3_LOOP:
	cmp.w	#$ffff,(a5)
	beq.s	D3_GENEND
	move.w	(a5)+,(a3)
	move.w	(a5)+,2(a3)
	move.w	(a5)+,4(a3)
	bsr.l	td_make3dpoint

	move.w	x3d(pc),d0
	add.w	d7,d0
	move.w	d0,(a4)+
	move.w	y3d(pc),d0
	add.w	d6,d0
	move.w	d0,(a4)+

	bra.s	D3_LOOP

D3_GENEND:
	lea	D3_ObjData(pc),a5
	move.l	4(a5),a5
	lea	D3_TransData(pc),a4
	lea	D3_Centre(pc),a3
D3_PLOTLOOP:
	move.w	#52,a1
	tst.w	Switch
	bne.s	D3_Scr2nd
	lea	Double1(pc),a0
	bra.s	D3_Scr1st
D3_Scr2nd:
	lea	Double2(pc),a0
D3_Scr1st:
	move.w	#$ffff,a2
	move.w	(a5)+,d4
	cmp.w	#$ffff,d4
	beq.s	D3_END
	add.w	d4,d4
	add.w	d4,d4
	move.w	(a4,d4.w),d0
	move.w	2(a4,d4.w),d1
	add.w	(a3),d0
	add.w	2(a3),d1
	move.w	(a5)+,d4
	add.w	d4,d4
	add.w	d4,d4
	move.w	(a4,d4.w),d2
	move.w	2(a4,d4.w),d3
	add.w	(a3),d2
	add.w	2(a3),d3
	bsr	Drawline
	bra.s	D3_PLOTLOOP
D3_END:
	rts
D3_Centre:	dc.w	0,0
D3_ObjData:	dc.l	OBJ_DATA
D3_TransData:
	blk.l	3*200,0

;*** Object Data
OBJ_DATA:
	dc.l	POINTTAB
	dc.l	LINETAB
POINTTAB:	
	blk.l	6,-1
LINETAB:
	dc.l	-1

;*************************
;* LR by BTG on 04.11.89 *
;* MO by BTG on 04.02.90 *
;* OP by BTG on 01.03.90 *
;* OP by BTG on 07.07.90 *
;*************************
; needs includefile "maths/sin256"
; 1. td_transform     |  result in x3d,y3d,z3d
; 2. td_make3dpoint   |  viewer in xvie,yvie,zvie
;    td_turnpoint     |  viedeg in degn,degr,degk 
;    td_perspective   |  point  in xpos,ypos,zpos
;    td_movepoint

>extern "DF1:MATHS/SIN16384|512",COS,1280

TD_Transform:
	move.w	degn(pc),d0
	move.w	degr(pc),d1
	move.w	degk(pc),d2
	add.w	d0,d0
	add.w	d1,d1
	add.w	d2,d2
	lea	cos(pc),a1 	
	lea	256(a1),a0	; sin=cos+90
	move.w	(a0,d0.w),a2
	move.w	(a0,d1.w),a3
	move.w	(a0,d2.w),a4
	lea	sinn(pc),a5
	move.w	a2,(a5)		; sinn
	move.w	a3,2(a5)	; sinr
	move.w	a4,4(a5)	; sink
	move.w	(a1,d0.w),a2
	move.w	(a1,d1.w),a3
	move.w	(a1,d2.w),a4
	move.w	a2,6(a5)	; cosn
	move.w	a3,8(a5)	; cosr
	move.w	a4,10(a5)	; cosk
	lea	TM+00(pc),a5	; base for transformation
	moveq	#0,d0
	moveq	#0,d1
	move.w	sinn(pc),d0		; TM (0,0)
	muls	sinr(pc),d0
	td_shift 0
	muls	sink(pc),d0
	td_shift 0
	move.w	cosk(pc),d1
	muls	cosr(pc),d1
	td_shift 1
	add.w	d1,d0
	move.w	d0,(a5)
	moveq	#0,d0
	moveq	#0,d1
	move.w	sinn(pc),d0		; TM (0,1)
	muls	cosk(pc),d0
	td_shift 0
	muls	sinr(pc),d0
	td_shift 0
	move.w	sink(pc),d1
	muls	cosr(pc),d1
	td_shift 1
	sub.w	d1,d0
	move.w	d0,2(a5)
	moveq	#0,d0
	move.w	sinr(pc),d0		;TM (0,2)
	muls	cosn(pc),d0
	td_shift 0
	move.w	d0,4(a5)
	moveq	#0,d0
	move.w	sink(pc),d0		;TM (1,0)
	muls	cosn(pc),d0
	td_shift 0
	move.w	d0,6(a5)
	moveq	#0,d0
	move.w	cosk(pc),d0		;TM (1,1)
	muls	cosn(pc),d0
	td_shift 0
	move.w	d0,8(a5)
	moveq	#0,d0
	move.w	sinn(pc),d0		;TM (1,2)
	neg.w	d0
	move.w	d0,10(a5)
	moveq	#0,d0
	moveq	#0,d1
	move.w	sinn(pc),d0		;TM (2,0)
	muls	sink(pc),d0
	td_shift 0
	muls	cosr(pc),d0
	td_shift 0
	move.w	sinr(pc),d1
	muls	cosk(pc),d1
	td_shift 1
	sub.w	d1,d0
	move.w	d0,12(a5)
	moveq	#0,d0
	moveq	#0,d1
	move.w	sinn(pc),d0		;TM (2,1)
	muls	cosk(pc),d0
	td_shift 0
	muls	cosr(pc),d0
	td_shift 0
	move.w	sink(pc),d1
	muls	sinr(pc),d1
	td_shift 1
	add.w	d1,d0
	move.w	d0,14(a5)
	moveq	#0,d0
	move.w	cosn(pc),d0		;TM (2,2)
	muls	cosr(pc),d0
	td_shift 0
	move.w	d0,16(a5)
	rts
td_make3dpoint:				; move point
	lea	x3d(pc),a0
	lea	y3d(pc),a1
	lea	z3d(pc),a2
	lea	xpos(pc),a3
	move.w	xvie(pc),d0
	sub.w	d0,(a3)			; xpos
	move.w	yvie(pc),d0
	sub.w	d0,2(a3)		; ypos
	move.w	zvie(pc),d0
	sub.w	d0,4(a3)		; zpos
td_turnpoint:				; turn point
	move.w	xpos(pc),d0
	move.w	TM+00(pc),d1
	muls	d0,d1
	td_shift 1
	move.w	d1,(a0)
	move.w	ypos(pc),d2
	move.w	TM+06(pc),d1
	muls	d2,d1
	td_shift 1
	add.w	d1,(a0)
	move.w	zpos(pc),d3
	move.w	TM+12(pc),d1
	muls	d3,d1
	td_shift 1
	add.w	d1,(a0)
	move.w	TM+02(pc),d1
	muls	d0,d1
	td_shift 1
	move.w	d1,(a1)
	move.w	TM+08(pc),d1
	muls	d2,d1
	td_shift 1
	add.w	d1,(a1)
	move.w	TM+14(pc),d1
	muls	d3,d1
	td_shift 1
	add.w	d1,(a1)
	move.w	TM+04(pc),d1
	muls	d0,d1
	td_shift 1
	move.w	d1,(a2)
	move.w	TM+10(pc),d1
	muls	d2,d1
	td_shift 1
	add.w	d1,(a2)
	move.w	TM+16(pc),d1
	muls	d3,d1
	td_shift 1
	add.w	d1,(a2)
td_perspective:				; put in perspective
	move.w	z3d(pc),d1
	ext.l	d1
	add.l	D3_Zoom(pc),d1
	bne.s	td_nozero
	moveq	#1,d1
td_nozero:
	move.w	x3d(pc),d0
	ext.l	d0
	asl.l	#8,d0
	divs	d1,d0
	move.w	d0,(a0)
	move.w	y3d(pc),d0
	ext.l	d0
	asl.l	#8,d0
	divs	d1,d0
	move.w	d0,2(a0)	
	move.w	d1,4(a0)
	rts
x3d:	dc.w	0	; projection points
y3d:	dc.w	0
z3d:	dc.w	0
xvie:	dc.w	0	; position of viewer
yvie:	dc.w	0
zvie:	dc.w	0
xpos:	dc.w	0	; data of point
ypos:	dc.w	0
zpos:	dc.w	0
degn:	dc.w	0	; viewing degrees
degr:	dc.w	0
degk:	dc.w	0
sinn:	dc.w	0	; used by prog
sinr:	dc.w	0
sink:	dc.w	0
cosn:	dc.w	0
cosr:	dc.w	0
cosk:	dc.w	0
TM:	blk.w	9,0
COS:	blk.b 1280,0
