draw_dots:
   mov	   esi,[points_translated_ptr]
   movzx   ecx,[points_count_var]
 .drw:
 @@:
   lodsd
   add	   esi,2	   ; skip z
   movzx   ebx,ax
   shr	   eax,16	   ; bx = x , ax = y
   or	   ax,ax
   jl	   @f
   or	   bx,bx
   jl	   @f
   cmp	   ax,SIZE_Y
   jge	   @f
   cmp	   bx,SIZE_X
   jge	   @f
   mov	   edx,SIZE_X	   ; SIZE_X not only power of 2   -> 256,512,...
   mul	   edx
   add	   eax,ebx
   mov	   edi,[screen_ptr]
   lea	   eax,[eax*3]
   add	   edi,eax
   xor	   eax,eax
   not	   eax
   stosd
 @@:
   loop    .drw

ret

do_emboss:
 ;  emboss -  after drawing all,
 ;  transfer screen buffer into bump map
 ;  and draw two bump triangles
 ; *************************************
	mov	esi,screen
	mov	edi,bumpmap2
	mov	ecx,TEXTURE_SIZE/3
	cld
if  Ext=NON
	xor	eax,eax
	xor	bh,bh
	xor	dh,dh
      @@:
	lodsb
	movzx	bx,al
	lodsb
	movzx	dx,al
	lodsb
	add	ax,bx
	add	ax,dx
      ;  cwd
      ;  div     [i3]
 ;;       push    ax
 ;;       pop     bx
 ;;       shr     bx,3
 ;;       shr     ax,2
 ;;       add     ax,bx

	lea	 eax,[eax*5]
	shr	 ax,4

	stosb
	loop	@b
else
	emms
	pxor	      mm1,mm1
	mov	      ebx,0x0000ffff
      @@:
	movd	      mm0,[esi]
	punpcklbw     mm0,mm1
	movq	      mm2,mm0
	psrlq	      mm2,16
	movq	      mm3,mm0
	psrlq	      mm3,32
	paddw	      mm0,mm2
	paddw	      mm0,mm3


	movd	      eax,mm0
	and	      eax,ebx
	lea	      eax,[eax*5]
	shr	      ax,4
	stosb
	add	      esi,3
	loop	      @b

end if
	push	ebp

	push	dword 0 	 ; env coords
	push	word 0
	push	word SIZE_X
	push	word SIZE_Y
	push	dword 0
	push	dword 0 	 ; bump coords
	push	word SIZE_X
	push	word SIZE_Y
	push	word 0
	mov	eax,SIZE_Y
	mov	ebx,SIZE_X*65536+0
	xor	ecx,ecx
	mov	edx,bumpmap2
	mov	esi,envmap
	mov	edi,screen
	call	bump_triangle

	push	dword SIZE_X shl 16 + SIZE_Y	   ; env coords
	push	word 0
	push	word SIZE_X
	push	word SIZE_Y
	push	word 0
	push	dword SIZE_X shl 16 + SIZE_Y	    ; bump coords
	push	word 0
	push	word SIZE_X
	push	word SIZE_Y
	push	word 0
	mov	eax,SIZE_Y
	mov	ebx,SIZE_X * 65536+0
	mov	ecx,SIZE_X shl 16 + SIZE_Y
	mov	edx,bumpmap2
	mov	esi,envmap
	mov	edi,screen
	call	bump_triangle

	pop	ebp
ret
;********************************EMBOSS DONE*******************************


generate_object2:  ; torus
;in  ax - figure number       2=torus, 3=loop, 4=loop
;locals
;   counter dw ?
;   sin     dd ?
;   cos     dd ?
;endl
.counter equ  word[ebp-2]
.sin	 equ  dword[ebp-6]
.cos	 equ  dword[ebp-10]
.sin2	 equ  dword[ebp-14]
.cos2	 equ  dword[ebp-18]
.piD180m3 equ dword[ebp-22]
.cD2	  equ word[ebp-24]
	push  ebp
	mov   ebp,esp
	sub   esp,24

	push  ax

	fninit
	mov	edi,[points_ptr]
	xor	eax,eax
				    ; init seed -> 4   3d points
	mov	dword[edi],-1.0     ; x
	add	edi,4
	stosd			    ; y
	stosd			    ; z
	mov	dword[edi],-0.9     ; x1
	mov	dword[edi+4],0.1    ; y1
	add	edi,8
	stosd			    ; z1
	mov	dword[edi],-0.8
	add	edi,4
	stosd
	stosd
	mov	dword[edi],-0.9     ; x3
	mov	dword[edi+4],-0.1   ; y3
	add	edi,8
	stosd			    ; z3
	mov	[points_count_var],4

	fld	[piD180]
	fidiv	[i3]
	fstp	.piD180m3
	mov	.cD2,5

	pop	ax
	mov	ecx,1
	mov	edx,9
      .next:			  ; calc angle and rotate seed 4 points
	mov	.counter,cx
	mov	ebx,[points_ptr]
	fld	.piD180m3
	fimul	.counter
	fld	st
	fsincos
	fstp	.sin
	fstp	.cos
	fadd	st,st0
	fsincos
	fstp	.sin2
	fstp	.cos2

      .rotor:			       ; next 4
	; rotary y
	fld	dword[ebx]	   ; x
	fld	.sin
	fmul	dword[ebx+8]	   ; z * sinbeta
	fchs
	fld	.cos
	fmul	dword[ebx]	   ; x * cosbeta
	faddp
	fstp	dword[edi]	   ; new x
	fmul	.sin		 ; old x * sinbeta
	fld	.cos
	fmul	dword[ebx+8]	   ; z * cosbeta
	faddp
	dec	dx
	or	dx,dx
	jnz	@f
;        mov     .counter,dx
	fld	st
	fidiv	[i3]
	faddp
    @@:
	fstp	dword[edi+8]	   ; new z
	fld	dword[ebx+4]
	or	dx,dx
	jnz	@f
  ;      fld1
  ;      faddp
;        fld     st
	fadd	st,st0
	fadd	st,st0
;        fxch
;        fimul   [i3]
;        fsin
;        faddp
	mov	dx,9
    @@:
	fstp	dword[edi+4]
	; rotary x
	cmp	al,3
	jl	.end_rot
	fld	dword[edi+4]	;y
	fld	.sin2
	fmul	dword[edi+8]	;z
	fld	.cos2
	fmul	dword[edi+4]	;y
	faddp
	fstp	dword[edi+4]	; new y
	fmul	.sin2	    ; sinbeta * old y
	fchs
	fld	.cos2
	fmul	dword[edi+8]
	faddp
	fstp	dword[edi+8]
	; rotary z
	cmp	al,4
	jl	.end_rot
	fld	dword[edi]	;x
	fld	.sin
	fmul	dword[edi+4]	;y
	fld	.cos
	fmul	dword[edi]	;x
	faddp
	fstp	dword[edi]	;new x
	fmul	.sin	   ; sinbeta * old x
	fchs
	fld	.cos
	fmul	dword[edi+4]	     ; cosbeta * y
	faddp
	fstp	dword[edi+4]	; new y



      .end_rot:

	add	edi,12
	add	ebx,12
	mov	esi,[points_ptr]
	add	esi,12*4
	cmp	ebx,esi
	jl	.rotor

	add	[points_count_var],4
	add	cx,18
	cmp	cx,(18*21*3)+1
	jle	.next

	mov	edi,[triangles_ptr]
	mov	ax,4
	mov	bx,4+4
	mov	[triangles_count_var],164*3   ;140

	mov	cx,80*3  ;68
      @@:
	stosw		      ;----
	mov	[edi],bx      ;    |
	add	edi,2	      ;    |
	inc	ax	      ;    |
	stosw		      ;    |repeat 4 times

	mov	[edi],bx      ;    |
	inc	bx
	add	edi,2
	stosw		      ;    |
	mov	[edi],bx      ;    |
	add	edi,2	      ;----
	loop	 @b


	mov	dword[edi],-1  ; < - end mark
	mov	  [culling_flag],0

	mov	esp,ebp
	pop	ebp

ret


generate_object3:  ; heart
;locals
;   counter dw ?
;   sin     dd ?
;   cos     dd ?
;endl
.counter equ  word[ebp-2]
.sin	 equ  dword[ebp-6]
.cos	 equ  dword[ebp-10]
.sin2	 equ  dword[ebp-14]
.cos2	 equ  dword[ebp-18]
.piD180m3 equ dword[ebp-22]
.cD2	  equ word[ebp-24]
	push  ebp
	mov   ebp,esp
	sub   esp,24

	fninit
	mov	edi,[points_ptr]
	xor	eax,eax
			       ; init seed -> eight   3d points
	mov	dword[edi],2.0
	add	edi,4
	stosd
	stosd

	mov	dword[edi],2.0
	mov	dword[edi+4],-0.5
	add	edi,8
	stosd

	mov	dword[edi],1.5
	mov	dword[edi+4],-1.5
	add	edi,8
	stosd
	mov	dword[edi],1.0
	mov	dword[edi+4],-2.0
	add	edi,8
	stosd

	stosd
	mov	dword[edi],-2.5
	add	edi,4
	stosd

	mov	[points_count_var],5

	mov	ecx,1
      .next:			  ; calc angle and rotate seed 4 points
	mov	.counter,cx
	mov	ebx,[points_ptr]
	fld	[piD180]
	fimul	.counter
	fsincos
	fstp	.sin
	fstp	.cos

      .rotor:			       ; next 4
	; rotary y
	fld	dword[ebx]	   ; x
	fld	.sin
	fmul	dword[ebx+8]	   ; z * sinbeta
	fchs
	fld	.cos
	fmul	dword[ebx]	   ; x * cosbeta
	faddp
	fidiv	[i3]
	fstp	dword[edi]	   ; new x
	fmul	.sin		   ; old x * sinbeta
	fld	.cos
	fmul	dword[ebx+8]	   ; z * cosbeta
	faddp
	fstp	dword[edi+8]	   ; new z

	fld	dword[ebx+4]   ;y
	fstp	dword[edi+4]


      .end_rot:

	add	edi,12
	add	ebx,12
	mov	esi,[points_ptr]
	add	esi,12*5
	cmp	ebx,esi  ;real_points + (12*5)
	jl	.rotor

	add	[points_count_var],5
	add	cx,18
	cmp	cx,(18*21)+1
	jle	.next
;last points

	xor	eax,eax

	mov	dword[edi],0.22
	mov	dword[edi+4],0.77
	mov	dword[edi+8],1.25
	add	edi,12

	mov	dword[edi],0.22
	mov	dword[edi+4],0.77
	mov	dword[edi+8],-1.25
	add	edi,12
	stosd

	add	[points_count_var],2

; init triangles list

	mov	edi,[triangles_ptr]
	mov	ax,5
	mov	bx,5+5
	mov	[triangles_count_var],204

	mov	cx,100
      @@:
	stosw		      ;----
	mov	[edi],bx      ;    |
	add	edi,2	      ;    |
	inc	ax	      ;    |
	stosw		      ;    |repeat

	mov	[edi],bx      ;    |
	inc	bx
	add	edi,2
	stosw		      ;    |
	mov	[edi],bx      ;    |
	add	edi,2	      ;----
	loop	 @b

	mov	ax,5
	mov	bx,[points_count_var]
	sub	bx,2
	mov	dl,2
    .nx:
	mov	cx,5
	add	[triangles_count_var],cx
    @@:
	stosw
	add	ax,5
	stosw
	mov	word[edi],bx
	add	edi,2
	loop	@b

	cmp	dl,1
	je	@f

	inc	bx
	jmp	.lab
     @@:
	dec	bx
     .lab:
	mov	cx,5
	add	[triangles_count_var],cx
     @@:
	stosw
	add	ax,5
	stosw
	mov	word[edi],bx
	add	edi,2
	loop	@b

	dec	dl
	or	dl,dl
	jnz	.nx

	sub	ax,25
	stosw
	sub	ax,50
	stosw
	mov	word[edi],bx
	add	edi,2

	stosw
	add	ax,50
	stosw
	inc	bx
	mov	word[edi],bx
	add	edi,2
	add	[triangles_count_var],2

	mov	dword[edi],-1  ; < - end mark
	mov	[culling_flag],0

	mov	esp,ebp
	pop	ebp

ret