
; Storm C Compiler
; Work2:Mesa3/Mesa-3.0/src-glu/tess.c
	mc68030
	mc68881
	XREF	_tess_tesselate_with_edge_flag
	XREF	_tess_tesselate
	XREF	_tess_handle_holes
	XREF	_tess_find_contour_hierarchies
	XREF	_tess_test_polygon
	XREF	_malloc
	XREF	_free
	XREF	_fabs__r

	SECTION "_init_callbacks:0",CODE


;void init_callbacks(tess_callbacks *callbacks)
	XDEF	_init_callbacks
_init_callbacks
	move.l	4(a7),a0
L46
;   callbacks->begin = ( void (_CALLBACK*)(GLenum) ) 0;
	clr.l	(a0)
;   callbacks->edgeFlag = ( void (_CALLBACK*)(GLboolean) ) 0;
	clr.l	4(a0)
;   callbacks->vertex = ( void (_CALLBACK*)(void*) ) 0;
	clr.l	$8(a0)
;   callbacks->end = ( void (_CALLBACK*)(void) ) 0;
	clr.l	$C(a0)
;   callbacks->error = ( void (_CALLBACK*)(GLenum) ) 0;
	clr.l	$10(a0)
	rts

	SECTION "_tess_call_user_error:0",CODE

	rts

;void tess_call_user_error(GLUtriangulatorObj *tobj,
	XDEF	_tess_call_user_error
_tess_call_user_error
	move.l	$8(a7),d0
	move.l	4(a7),a0
L47
;	if(tobj->error==GLU_NO_ERROR)
	tst.l	$24(a0)
	bne.b	L49
L48
;		tobj->error=gluerr;
	move.l	d0,$24(a0)
L49
;	if(tobj->callbacks.error!=NULL)
	move.l	$1C(a0),a1
	cmp.w	#0,a1
	beq.b	L51
L50
;		(tobj->callbacks.error)(gluerr);
	move.l	d0,-(a7)
	move.l	$1C(a0),a0
	jsr	(a0)
	addq.w	#4,a7
L51
	rts

	SECTION "_gluNewTess:0",CODE


;GLUtriangulatorObj* APIENTRY gluNewTess( void )
	XDEF	_gluNewTess
_gluNewTess
	move.l	a2,-(a7)
L52
;	if((tobj=(GLUtriangulatorObj *)
	pea	$4C.w
	jsr	_malloc
	addq.w	#4,a7
	move.l	d0,a2
	cmp.w	#0,a2
	bne.b	L54
L53
	moveq	#0,d0
	move.l	(a7)+,a2
	rts
L54
;	tobj->contours=tobj->last_contour=NULL;
	clr.l	4(a2)
	clr.l	(a2)
;	init_callbacks(&tobj->callbacks);
	pea	$C(a2)
	jsr	_init_callbacks
	addq.w	#4,a7
;	tobj->error=GLU_NO_ERROR;
	clr.l	$24(a2)
;	tobj->current_polygon=NULL;
	clr.l	$20(a2)
;	tobj->contour_cnt=0;
	clr.l	$8(a2)
	move.l	a2,d0
	move.l	(a7)+,a2
	rts

	SECTION "_gluTessCallback:0",CODE


;void APIENTRY gluTessCallback( GLUtriangulatorObj *tobj, GLenum whic
	XDEF	_gluTessCallback
_gluTessCallback
	move.l	a2,-(a7)
	movem.l	$C(a7),d0/a1
	move.l	$8(a7),a0
L55
;	switch(which)
	cmp.l	#$18706,d0
	beq.b	L59
	bgt.b	L63
	cmp.l	#$18704,d0
	beq.b	L56
	cmp.l	#$18705,d0
	beq.b	L58
	bra.b	L61
L63
	cmp.l	#$18707,d0
	beq.b	L60
	cmp.l	#$18708,d0
	beq.b	L57
	bra.b	L61
;		
L56
;			tobj->callbacks.begin = (void (_CALLBACK*)(GLenum)) fn;
	move.l	a1,$C(a0)
;			
	bra.b	L62
L57
;			tobj->callbacks.edgeFlag = (void (_CALLBACK*)(GLboolean)) fn;
	move.l	a1,$10(a0)
;			
	bra.b	L62
L58
;			tobj->callbacks.vertex = (void (_CALLBACK*)(void *)) fn;
	move.l	a1,$14(a0)
;			
	bra.b	L62
L59
;			tobj->callbacks.end = (void (_CALLBACK*)(void)) fn;
	move.l	a1,$18(a0)
;			
	bra.b	L62
L60
;			tobj->callbacks.error = (void (_CALLBACK*)(GLenum)) fn;
	move.l	a1,$1C(a0)
;			
	bra.b	L62
L61
;			tobj->error=GLU_INVALID_ENUM;
	move.l	#$18A24,$24(a0)
;			
L62
	move.l	(a7)+,a2
	rts

	SECTION "_gluDeleteTess:0",CODE


;void APIENTRY gluDeleteTess( GLUtriangulatorObj *tobj )
	XDEF	_gluDeleteTess
_gluDeleteTess
	move.l	a2,-(a7)
	move.l	$8(a7),a2
L64
;	if(tobj->error==GLU_NO_ERROR && tobj->contour_cnt)
	tst.l	$24(a2)
	bne.b	L67
L65
	tst.l	$8(a2)
	beq.b	L67
L66
;		tess_call_user_error(tobj,GLU_TESS_ERROR1);
	move.l	#$18737,-(a7)
	move.l	a2,-(a7)
	jsr	_tess_call_user_error
	addq.w	#$8,a7
L67
;	delete_contours(tobj);
	move.l	a2,-(a7)
	jsr	_delete_contours
	addq.w	#4,a7
;	free(tobj);
	move.l	a2,-(a7)
	jsr	_free
	addq.w	#4,a7
	move.l	(a7)+,a2
	rts

	SECTION "_gluBeginPolygon:0",CODE


;void APIENTRY gluBeginPolygon( GLUtriangulatorObj *tobj )
	XDEF	_gluBeginPolygon
_gluBeginPolygon
	move.l	a2,-(a7)
	move.l	$8(a7),a2
L68
;	tobj->error = GLU_NO_ERROR;
	clr.l	$24(a2)
;	if(tobj->current_polygon!=NULL)
	move.l	$20(a2),a0
	cmp.w	#0,a0
	beq.b	L70
L69
;		tess_call_user_error(tobj,GLU_TESS_ERROR1);
	move.l	#$18737,-(a7)
	move.l	a2,-(a7)
	jsr	_tess_call_user_error
	addq.w	#$8,a7
;		delete_contours(tobj);
	move.l	a2,-(a7)
	jsr	_delete_contours
	addq.w	#4,a7
	bra.b	L73
L70
;		if((tobj->current_polygon=
	pea	$38.w
	jsr	_malloc
	addq.w	#4,a7
	move.l	d0,$20(a2)
	move.l	d0,a0
	cmp.w	#0,a0
	bne.b	L72
L71
;			tess_call_user_error(tobj,GLU_OUT_OF_MEMORY);
	move.l	#$18A26,-(a7)
	move.l	a2,-(a7)
	jsr	_tess_call_user_error
	addq.w	#$8,a7
	move.l	(a7)+,a2
	rts
L72
;		tobj->current_polygon->vertex_cnt=0;
	move.l	$20(a2),a0
	clr.l	(a0)
;		tobj->current_polygon->vertices=
	move.l	$20(a2),a0
	clr.l	$34(a0)
	move.l	$20(a2),a0
	clr.l	$30(a0)
L73
	move.l	(a7)+,a2
	rts

	SECTION "_gluEndPolygon:0",CODE


;void APIENTRY gluEndPolygon( GLUtriangulatorObj *tobj )
	XDEF	_gluEndPolygon
_gluEndPolygon
	move.l	a2,-(a7)
	move.l	$8(a7),a2
L74
;	if(tobj->error!=GLU_NO_ERROR) 
	tst.l	$24(a2)
	beq.b	L76
L75
;	if(tobj->error!=GLU_NO_ERROR) goto 
	bra	L92
L76
;	if(tobj->current_polygon==NULL)
	move.l	$20(a2),a0
	cmp.w	#0,a0
	bne.b	L78
L77
;		tess_call_user_error(tobj,GLU_TESS_ERROR2);
	move.l	#$18738,-(a7)
	move.l	a2,-(a7)
	jsr	_tess_call_user_error
	addq.w	#$8,a7
	move.l	(a7)+,a2
	rts
L78
;	tess_test_polygon(tobj);
	move.l	a2,-(a7)
	jsr	_tess_test_polygon
	addq.w	#4,a7
;	if(tobj->error!=GLU_NO_ERROR) 
	tst.l	$24(a2)
	beq.b	L80
L79
;	if(tobj->error!=GLU_NO_ERROR) goto 
	bra.b	L92
L80
;	if(tobj->contour_cnt==0)
	tst.l	$8(a2)
	bne.b	L82
L81
;		delete_contours(tobj);
	move.l	a2,-(a7)
	jsr	_delete_contours
	addq.w	#4,a7
	move.l	(a7)+,a2
	rts
L82
;	tess_find_contour_hierarchies(tobj);
	move.l	a2,-(a7)
	jsr	_tess_find_contour_hierarchies
	addq.w	#4,a7
;	if(tobj->error!=GLU_NO_ERROR) 
	tst.l	$24(a2)
	beq.b	L84
L83
;	if(tobj->error!=GLU_NO_ERROR) goto 
	bra.b	L92
L84
;	tess_handle_holes(tobj);
	move.l	a2,-(a7)
	jsr	_tess_handle_holes
	addq.w	#4,a7
;	if(tobj->error!=GLU_NO_ERROR) 
	tst.l	$24(a2)
	beq.b	L86
L85
;	if(tobj->error!=GLU_NO_ERROR) goto 
	bra.b	L92
L86
;	if(tobj->callbacks.begin!=NULL && tobj->callbacks.vertex!=NULL &&
	move.l	$C(a2),a0
	cmp.w	#0,a0
	beq.b	L92
L87
	move.l	$14(a2),a0
	cmp.w	#0,a0
	beq.b	L92
L88
	move.l	$18(a2),a0
	cmp.w	#0,a0
	beq.b	L92
L89
;		if(tobj->callbacks.edgeFlag==NULL)
	move.l	$10(a2),a0
	cmp.w	#0,a0
	bne.b	L91
L90
;			tess_tesselate(tobj);
	move.l	a2,-(a7)
	jsr	_tess_tesselate
	addq.w	#4,a7
	bra.b	L92
L91
;			tess_tesselate_with_edge_flag(tobj);
	move.l	a2,-(a7)
	jsr	_tess_tesselate_with_edge_flag
	addq.w	#4,a7
L92
;	delete_contours(tobj);
	move.l	a2,-(a7)
	jsr	_delete_contours
	addq.w	#4,a7
	move.l	(a7)+,a2
	rts

	SECTION "_gluNextContour:0",CODE


;void APIENTRY gluNextContour( GLUtriangulatorObj *tobj, GLenum type )
	XDEF	_gluNextContour
_gluNextContour
	move.l	4(a7),a0
L93
;	if(tobj->error!=GLU_NO_ERROR)
	tst.l	$24(a0)
	beq.b	L95
L94
	rts
L95
;	if(tobj->current_polygon==NULL)
	move.l	$20(a0),a1
	cmp.w	#0,a1
	bne.b	L97
L96
;		tess_call_user_error(tobj,GLU_TESS_ERROR2);
	move.l	#$18738,-(a7)
	move.l	a0,-(a7)
	jsr	_tess_call_user_error
	addq.w	#$8,a7
	rts
L97
;	if(tobj->current_polygon->vertex_cnt)
	move.l	$20(a0),a1
	tst.l	(a1)
	beq.b	L99
L98
;		tess_test_polygon(tobj);
	move.l	a0,-(a7)
	jsr	_tess_test_polygon
	addq.w	#4,a7
L99
	rts

	SECTION "_gluTessVertex:0",CODE


;void APIENTRY gluTessVertex( GLUtriangulatorObj *tobj, GLdouble v[3]
	XDEF	_gluTessVertex
_gluTessVertex
L116	EQU	-$C
	link	a5,#L116
	movem.l	a2-a4,-(a7)
	move.l	$8(a5),a3
L100
;	tess_polygon *polygon=tobj->current_polygon;
	move.l	a3,a0
	move.l	$20(a0),a4
;	if(tobj->error!=GLU_NO_ERROR)
	move.l	a3,a0
	tst.l	$24(a0)
	beq.b	L102
L101
	movem.l	(a7)+,a2-a4
	unlk	a5
	rts
L102
;	if(polygon==NULL)
	move.l	a4,a0
	cmp.w	#0,a0
	bne.b	L104
L103
;		tess_call_user_error(tobj,GLU_TESS_ERROR2);
	move.l	#$18738,-(a7)
	move.l	a3,-(a7)
	jsr	_tess_call_user_error
	addq.w	#$8,a7
	movem.l	(a7)+,a2-a4
	unlk	a5
	rts
L104
;	last_vertex_ptr=polygon->last_vertex;
	move.l	a4,a0
	move.l	$34(a0),a2
;	if(last_vertex_ptr==NULL)
	cmp.w	#0,a2
	bne	L108
L105
;		if((last_vertex_ptr=(tess_vertex *)
	pea	$3A.w
	jsr	_malloc
	addq.w	#4,a7
	move.l	d0,a2
	cmp.w	#0,a2
	bne.b	L107
L106
;			tess_call_user_error(tobj,GLU_OUT_OF_MEMORY);
	move.l	#$18A26,-(a7)
	move.l	a3,-(a7)
	jsr	_tess_call_user_error
	addq.w	#$8,a7
	movem.l	(a7)+,a2-a4
	unlk	a5
	rts
L107
;		polygon->vertices=last_vertex_ptr;
	move.l	a4,a0
	move.l	a2,$30(a0)
;		polygon->last_vertex=last_vertex_ptr;
	move.l	a4,a0
	move.l	a2,$34(a0)
;		last_vertex_ptr->data=data;
	move.l	$10(a5),(a2)
;		last_vertex_ptr->location[0]=v[0];
	move.l	$C(a5),a0
	fmove.d	(a0),fp0
	fmove.d	fp0,4(a2)
;		last_vertex_ptr->location[1]=v[1];
	move.l	$C(a5),a1
	lea	4(a2),a0
	move.l	$8(a1),$8(a0)
	move.l	$C(a1),$C(a0)
;		last_vertex_ptr->location[2]=v[2];
	move.l	$C(a5),a1
	lea	4(a2),a0
	move.l	$10(a1),$10(a0)
	move.l	$14(a1),$14(a0)
;		last_vertex_ptr->next=NULL;
	clr.l	$32(a2)
;		last_vertex_ptr->previous=NULL;
	clr.l	$36(a2)
;		++(polygon->vertex_cnt);
	move.l	a4,a0
	move.l	(a0),d0
	addq.l	#1,d0
	move.l	a4,a0
	move.l	d0,(a0)
	bra	L115
L108
;		if(fabs(last_vertex_ptr->location[0]-v[0]) < EPSILON &&
	move.l	$C(a5),a0
	fmove.d	4(a2),fp0
	fsub.d	(a0),fp0
	fmove.d	fp0,-(a7)
	jsr	_fabs__r
	addq.w	#$8,a7
	fcmp.d	#$.3EB0C6F7.A0B5ED8D,fp0
	fboge.b	L112
L109
	lea	4(a2),a0
	fmove.d	$8(a0),fp0
	move.l	$C(a5),a1
	fsub.d	$8(a1),fp0
	fmove.d	fp0,-(a7)
	jsr	_fabs__r
	addq.w	#$8,a7
	fcmp.d	#$.3EB0C6F7.A0B5ED8D,fp0
	fboge.b	L112
L110
	lea	4(a2),a0
	fmove.d	$10(a0),fp0
	move.l	$C(a5),a1
	fsub.d	$10(a1),fp0
	fmove.d	fp0,-(a7)
	jsr	_fabs__r
	addq.w	#$8,a7
	fcmp.d	#$.3EB0C6F7.A0B5ED8D,fp0
	fboge.b	L112
L111
;			tess_call_user_error(tobj,GLU_TESS_ERROR6);
	move.l	#$1873C,-(a7)
	move.l	a3,-(a7)
	jsr	_tess_call_user_error
	addq.w	#$8,a7
	movem.l	(a7)+,a2-a4
	unlk	a5
	rts
L112
;		if((vertex_ptr=(tess_vertex *)
	pea	$3A.w
	jsr	_malloc
	addq.w	#4,a7
	move.l	d0,a0
	cmp.w	#0,a0
	bne.b	L114
L113
;			tess_call_user_error(tobj,GLU_OUT_OF_MEMORY);
	move.l	#$18A26,-(a7)
	move.l	a3,-(a7)
	jsr	_tess_call_user_error
	addq.w	#$8,a7
	movem.l	(a7)+,a2-a4
	unlk	a5
	rts
L114
;		vertex_ptr->data=data;
	move.l	$10(a5),(a0)
;		vertex_ptr->location[0]=v[0];
	move.l	$C(a5),a1
	fmove.d	(a1),fp0
	fmove.d	fp0,4(a0)
;		vertex_ptr->location[1]=v[1];
	move.l	$C(a5),a3
	lea	4(a0),a1
	move.l	$8(a3),$8(a1)
	move.l	$C(a3),$C(a1)
;		vertex_ptr->location[2]=v[2];
	move.l	$C(a5),a3
	lea	4(a0),a1
	move.l	$10(a3),$10(a1)
	move.l	$14(a3),$14(a1)
;		vertex_ptr->next=NULL;
	clr.l	$32(a0)
;		vertex_ptr->previous=last_vertex_ptr;
	move.l	a2,$36(a0)
;		++(polygon->vertex_cnt);
	move.l	a4,a1
	move.l	(a1),d0
	addq.l	#1,d0
	move.l	a4,a1
	move.l	d0,(a1)
;		last_vertex_ptr->next=vertex_ptr;
	move.l	a0,$32(a2)
;		polygon->last_vertex=vertex_ptr;
	move.l	a4,a1
	move.l	a0,$34(a1)
L115
	movem.l	(a7)+,a2-a4
	unlk	a5
	rts

	SECTION "_delete_contours:0",CODE


;static void delete_contours(GLUtriangulatorObj *tobj)
_delete_contours
	movem.l	a2-a4,-(a7)
	move.l	$10(a7),a4
L117
;	tess_polygon *polygon=tobj->current_polygon;
	move.l	a4,a0
	move.l	$20(a0),a3
;	if(polygon!=NULL)
	move.l	a3,a0
	cmp.w	#0,a0
	beq.b	L124
L118
;		if (polygon->vertices)
	move.l	a3,a1
	tst.l	$30(a1)
	beq.b	L123
L119
;			for(vertex=polygon->vertices;
	move.l	a3,a1
	move.l	$30(a1),a0
	bra.b	L121
L120
;				vertex_tmp=vertex->next;
	move.l	$32(a0),a2
;				free(vertex);
	move.l	a0,-(a7)
	jsr	_free
	addq.w	#4,a7
;				vertex=vertex_tmp;
	move.l	a2,a0
L121
	move.l	a3,a2
	cmp.l	$34(a2),a0
	bne.b	L120
L122
;			free(vertex);
	move.l	a0,-(a7)
	jsr	_free
	addq.w	#4,a7
L123
;		free(polygon);
	move.l	a3,-(a7)
	jsr	_free
	addq.w	#4,a7
;		tobj->current_polygon=NULL;
	move.l	a4,a1
	clr.l	$20(a1)
L124
;	for(contour=tobj->contours;
	move.l	a4,a0
	move.l	(a0),a3
	bra.b	L129
L125
;		for(vertex=contour->vertices;
	move.l	a3,a1
	move.l	$14(a1),a0
	bra.b	L127
L126
;			vertex_tmp=vertex->next;
	move.l	$32(a0),a2
;			free(vertex);
	move.l	a0,-(a7)
	jsr	_free
	addq.w	#4,a7
;			vertex=vertex_tmp;
	move.l	a2,a0
L127
	move.l	a3,a2
	cmp.l	$18(a2),a0
	bne.b	L126
L128
;		free(vertex);
	move.l	a0,-(a7)
	jsr	_free
	addq.w	#4,a7
;		contour_tmp=contour->next;
	move.l	a3,a0
	move.l	$1C(a0),a2
;		free(contour);
	move.l	a3,-(a7)
	jsr	_free
	addq.w	#4,a7
;		contour=contour_tmp;
	move.l	a2,a3
L129
	move.l	a3,a0
	cmp.w	#0,a0
	bne.b	L125
L130
;	tobj->contours=tobj->last_contour=NULL;
	move.l	a4,a1
	clr.l	4(a1)
	move.l	a4,a1
	clr.l	(a1)
;	tobj->contour_cnt=0;
	move.l	a4,a0
	clr.l	$8(a0)
	movem.l	(a7)+,a2-a4
	rts

	END
