modelbegin=$

_coltab=32*2+3;coltab&#ff
br0=_coltab;#00
br1=_coltab+1;#41
br2=_coltab+2;#5a
br3=_coltab+3;#d7
br1a=_coltab+4;#50
br3a=_coltab+5;#c3
br4=_coltab+6;#ff

_=$
;	db x,y,z ;x,y,z
	;db 0,0,0 ;xrot,yrot,zrot
_vertscr=$-_
	db 0,0 ;xscr,yscr
;	db 0 ;l
;	ds MAXEDGES*3
szvert=-($-_);6+(MAXEDGES*3)
	org _

;  TVertex = record
;    x,y,z: real;
;    //temporary:
;    //xrot,yrot,zrot: real; //дробные нужны только в rotate
;    xscr,yscr: integer;
;    l: real;
;   + все рёбра (модуль уклона, адрес)
;  end;
	macro VERT x,y,z
;_=$
	db x,y,z ;x,y,z
	;db 0,0,0 ;xrot,yrot,zrot
	;db 0,0 ;xscr,yscr
	;db 0 ;l
	;ds MAXEDGES*3
;szvert=$-_;6+(MAXEDGES*3)
	endm

;  TPoly = record
;    v1,v2,v3: integer; //^TVertex //нужно для checkvisibility //для скорости лучше указывать прямо на xscr,yscr
; l:byte;
;    visible: boolean; //temporary
;    e1,e2,e3: integer; //^TEdge //нужно для drawintersects //для скорости лучше указывать прямо на intersect
;  end;
	macro POLY v1,v2,v3,e1,e2,e3,color
_=$
	dw vertbase+(v1*szvert)
	dw vertbase+(v1*szvert),vertbase+(v2*szvert),vertbase+(v3*szvert) ;v1,v2,v3
	 db color
	db #ff;0 ;visible
	;dw edgebase+(e1*szedge)
	;dw edgebase+(e1*szedge),edgebase+(e2*szedge),edgebase+(e3*szedge) ;e1,e2,e3
	;dw 0,0,0 ;e1,e2,e3
szpoly=$-_;14;13
	endm

	macro POLY4 v1,v2,v3,v4,color
_=$
	dw vertbase+(v1*szvert),vertbase+(v2*szvert),vertbase+(v3*szvert),vertbase+(v4*szvert) ;v1,v2,v3,v4
	 db color
	db #ff;0 ;visible
szpoly=$-_
	endm

;  TEdge = record
;    p1,p2: integer; //^TPoly //для скорости лучше указывать прямо на visible
;    v1,v2: integer; //^TVertex (counted once from poly) //для скорости лучше указывать прямо на xscr,yscr,l
;    //temporary:
;    intersect: array[0..MAXLIGHT-1] of TIntersect; //нумеруются по нижнему цвету, поэтому intersect[MAXLIGHT] не существует
;  end;
	macro EDGE p1,p2,v1,v2
_=$
	dw polybase+(p1*szpoly),polybase+(p2*szpoly) ;p1,p2
	dw vertbase+(v1*szvert),vertbase+(v2*szvert) ;v1,v2
	;dw 0,0 ;v1,v2
	;ds MAXLIGHT*2 ;intersect[j]: scrx,scry
szedge=$-1;8;+(MAXLIGHT*2)
	endm

	ds 2 ;для стека INT (можно увеличить для стека вызовов)
;vertbuf
	ds 2*128 ;max 128 vertices
vertbufend
vertbase=$-2
	
	if 1==1
;============ куб со срезом
NVERT=8
NPOLY=6;12
NEDGE=12;18-4
csz=sz
;	dw 0 ;для стека
;vert
;	ds NVERT*(-szvert) ;лежат в обратном порядке
vertwas
	;ld hl,poly ;poly==end of vert
	ld hl,vert
	ld de,edge
	ld b,NVERT
	jp ROTVB
vertwasshift=$-vertwas
vert
             ;(X    Z    Y)
        VERT +csz,+csz,+csz
        VERT +csz,+csz,-000
        VERT +csz,-csz,-000
        VERT +csz,-csz,+csz ;right (left!)
        VERT -csz,+csz,+csz
        VERT -csz,+csz,-000
        VERT -csz,-000,-000
        VERT -csz,-000,+csz ;left (right!)

;vertbase=vertwas-2;конец vert ;vert+_vertscr;+3;+3 ;xscr,yscr
poly
	db NPOLY
;POLY v1,v2,v3,v4,color
;clockwise
	POLY4  0, 1, 2, 3,br2 ;0 ;right (left!)
	POLY4  0, 3, 7, 4,br1 ;1 ;top (back!)
	POLY4  2, 6, 7, 3,br3 ;2 ;front (top!)
	POLY4  0, 4, 5, 1,br1 ;3 ;back (bottom!)
	POLY4  4, 7, 6, 5,br2 ;4 ;left (right!)
	POLY4  1, 5, 6, 2,br1 ;5 ;bottom (front!)

polybase=poly+1+8+1 ;visible
edge
	db NEDGE
;EDGE p1,p2,v1,v2 ;(p1 левее v1-v2 при взгляде снаружи, p2 правее - не проверено)
;top (back)
	EDGE  1, 0, 0, 3
	EDGE  1, 2, 3, 7
	EDGE  1, 4, 7, 4
	EDGE  1, 3, 4, 0
;bottom (front)
	EDGE  5, 3, 1, 5
	EDGE  5, 4, 5, 6
	EDGE  5, 2, 6, 2
	EDGE  5, 0, 2, 1
;sides
	EDGE  3, 4, 5, 4
	EDGE  4, 2, 6, 7
	EDGE  2, 0, 2, 3
	EDGE  0, 3, 1, 0
	endif

;========================= куб быстрый
NVERT=8
NPOLY=5;6
NEDGE=12
csz=sz
;	dw 0 ;для стека
;vertcube
;	ds NVERT*(-szvert) ;лежат в обратном порядке
vertwascube
	jp ROTCUBE
	;dw polycube
	;dw edgecube
	;db NVERT
             ;(X    Z    Y)
        ;VERT +csz,+csz,+csz
        ;VERT +csz,+csz,-csz
        ;VERT +csz,-csz,-csz
        ;VERT +csz,-csz,+csz
        ;VERT -csz,+csz,+csz
        ;VERT -csz,+csz,-csz
        ;VERT -csz,-csz,-csz
        ;VERT -csz,-csz,+csz

;vertbase=vertwascube-2;конец vert ;vert+_vertscr;+3;+3 ;xscr,yscr
polycube
	db NPOLY
;POLY v1,v2,v3,v4,color
;clockwise
	POLY4  0, 1, 2, 3,br3;2 ;0 ;right (left!)
	POLY4  0, 3, 7, 4,br2;1 ;1 ;top (back!)
	POLY4  2, 6, 7, 3,br3 ;2 ;front (top!)
	;POLY4  0, 4, 5, 1,br1 ;3 ;back (bottom!)
	POLY4  4, 7, 6, 5,br3;2 ;4 ;left (right!)
	POLY4  1, 5, 6, 2,br2;1 ;5 ;bottom (front!)

	if 1==0
polybase=polycube+1+8+1 ;visible
edgecube
	db NEDGE
;EDGE p1,p2,v1,v2 ;(p1 левее v1-v2 при взгляде снаружи, p2 правее - не проверено)
;top (back)
	EDGE  1, 0, 0, 3
	EDGE  1, 2, 3, 7
	EDGE  1, 4, 7, 4
	EDGE  1, 3, 4, 0
;bottom (front)
	EDGE  5, 3, 1, 5
	EDGE  5, 4, 5, 6
	EDGE  5, 2, 6, 2
	EDGE  5, 0, 2, 1
;sides
	EDGE  3, 4, 5, 4
	EDGE  4, 2, 6, 7
	EDGE  2, 0, 2, 3
	EDGE  0, 3, 1, 0
	endif

	if 1==0
;========================= куб сплющенный
NVERT=8
NPOLY=6
NEDGE=12
csz=sz
;	dw 0 ;для стека
;verthalfcube
;	ds NVERT*(-szvert) ;лежат в обратном порядке
vertwashalfcube
	jp ROTHALFCUBE
	;dw polyhalfcube
	;dw edgehalfcube
	;db NVERT
             ;(X    Z    Y)
        ;VERT +csz,+csz,+csz
        ;VERT +csz,+csz,-csz
        ;VERT +csz,-csz,-csz
        ;VERT +csz,-csz,+csz
        ;VERT -csz,+csz,+csz
        ;VERT -csz,+csz,-csz
        ;VERT -csz,-csz,-csz
        ;VERT -csz,-csz,+csz

;vertbase=vertwashalfcube-2;конец vert ;vert+_vertscr;+3;+3 ;xscr,yscr
polyhalfcube
	db NPOLY
;POLY v1,v2,v3,v4,color
;clockwise
	POLY4  0, 1, 2, 3,br2 ;0 ;right (left!)
	POLY4  0, 3, 7, 4,br1 ;1 ;top (back!)
	POLY4  2, 6, 7, 3,br3 ;2 ;front (top!)
	POLY4  0, 4, 5, 1,br1 ;3 ;back (bottom!)
	POLY4  4, 7, 6, 5,br2 ;4 ;left (right!)
	POLY4  1, 5, 6, 2,br1 ;5 ;bottom (front!)
                        
	if 1==0
polybase=polyhalfcube+1+8+1 ;visible
edgehalfcube
	db NEDGE
;EDGE p1,p2,v1,v2 ;(p1 левее v1-v2 при взгляде снаружи, p2 правее - не проверено)
;top (back)
	EDGE  1, 0, 0, 3
	EDGE  1, 2, 3, 7
	EDGE  1, 4, 7, 4
	EDGE  1, 3, 4, 0
;bottom (front)
	EDGE  5, 3, 1, 5
	EDGE  5, 4, 5, 6
	EDGE  5, 2, 6, 2
	EDGE  5, 0, 2, 1
;sides
	EDGE  3, 4, 5, 4
	EDGE  4, 2, 6, 7
	EDGE  2, 0, 2, 3
	EDGE  0, 3, 1, 0
	endif
	endif

;========================= пирамида
NVERT=5
NPOLY=5
NEDGE=8
csz=sz
;	dw 0 ;для стека
;vertpyramid
;	ds NVERT*(-szvert) ;лежат в обратном порядке
vertwaspyramid
	jp ROTPYRAMID
	;dw polypyramid
	;dw edgepyramid
	;db NVERT
             ;(X    Z    Y)
        ;VERT +000,-csz,-000        ;0
        ;VERT +csz,+csz,-csz        ;1
        ;VERT +csz,+csz,+csz ;left  ;2
        ;VERT -csz,+csz,+csz        ;3
        ;VERT -csz,+csz,-csz ;right ;4

;vertbase=vertwaspyramid-2;конец vert ;vert+_vertscr;+3;+3 ;xscr,yscr
polypyramid
	db NPOLY
;POLY v1,v2,v3,v4,color
;clockwise
	POLY4  1, 2, 3, 4,br4 ;0 ;(bottom!)
	POLY4  0, 0, 2, 1,br2 ;1 ;(left!)
	POLY4  0, 0, 3, 2,br1;3 ;2 ;(back!)
	POLY4  0, 0, 4, 3,br2 ;3 ;(right!)
	POLY4  0, 0, 1, 4,br0;1 ;4 ;(front!)

	if 1==0
polybase=polypyramid+1+8+1 ;visible
edgepyramid
	db NEDGE
;EDGE p1,p2,v1,v2 ;(p1 левее v1-v2 при взгляде снаружи, p2 правее - не проверено)
;bottom
	EDGE  0, 1, 1, 2
	EDGE  0, 2, 2, 3
	EDGE  0, 3, 3, 4
	EDGE  0, 4, 4, 1
;sides
	EDGE  4, 1, 0, 1
	EDGE  1, 2, 0, 2
	EDGE  2, 3, 0, 3
	EDGE  3, 4, 0, 4
	endif

;========================= стена
NVERT=9
NPOLY=4
NEDGE=12
csz=sz
;	dw 0 ;для стека
;vertwall
;	ds NVERT*(-szvert) ;лежат в обратном порядке
vertwaswall
	jp ROTWALL
	;dw polywall
	;dw edgewall
	;db NVERT
             ;(X    Z    Y)
        ;VERT +csz,-csz,+000        ;0
        ;VERT +000,-csz,+000        ;1
        ;VERT -csz,-csz,+000        ;2
        ;VERT +csz,+000,+000        ;3
        ;VERT +000,+000,+000        ;4
        ;VERT -csz,+000,+000        ;5
        ;VERT +csz,+csz,+000        ;6
        ;VERT +000,+csz,+000        ;7
        ;VERT -csz,+csz,+000        ;8

;vertbase=vertwaswall-2;конец vert ;vert+_vertscr;+3;+3 ;xscr,yscr
polywall
	db NPOLY
;POLY v1,v2,v3,v4,color
;clockwise
	POLY4  3,4,1,0,br1 ;0
	POLY4  4,5,2,1,br2 ;1
	POLY4  6,7,4,3,br3 ;2
	POLY4  7,8,5,4,br4 ;3

	if 1==0
polybase=polywall+1+8+1 ;visible
edgewall
	db NEDGE
;EDGE p1,p2,v1,v2 ;(p1 левее v1-v2 при взгляде снаружи, p2 правее - не проверено)
;horizontal
	EDGE  0, 0, 0, 1
	EDGE  1, 1, 1, 2
	EDGE  0, 2, 3, 4
	EDGE  1, 3, 4, 5
	EDGE  2, 2, 6, 7
	EDGE  3, 3, 7, 8
;vertical
	EDGE  0, 0, 0, 3
	EDGE  2, 2, 3, 6
	EDGE  0, 1, 1, 4
	EDGE  2, 3, 4, 7
	EDGE  1, 1, 2, 5
	EDGE  3, 3, 5, 8
	endif

;========================= клетка
NVERT=4;7
NPOLY=1;2
NEDGE=4;8
csz=sz
vertwascell
	jp ROTCELL

;vertbase=vertwaswall-2;конец vert ;vert+_vertscr;+3;+3 ;xscr,yscr
polycell
	db NPOLY
;POLY v1,v2,v3,v4,color
;clockwise
	POLY4  0,1,2,3,br1;a ;0
	;POLY4  0,4,5,6,br1 ;0

	if 1==0
polybase=polycell+1+8+1 ;visible
edgecell
	db NEDGE
;EDGE p1,p2,v1,v2 ;(p1 левее v1-v2 при взгляде снаружи, p2 правее - не проверено)
;sq1
	EDGE  0, 0, 0, 1
	EDGE  0, 0, 1, 2
	EDGE  0, 0, 2, 3
	EDGE  0, 0, 3, 0
;sq2
	;EDGE  1, 1, 0, 4
	;EDGE  1, 1, 4, 5
	;EDGE  1, 1, 5, 6
	;EDGE  1, 1, 6, 0
	endif

;========================= невыпуклое
NVERT=8
NPOLY=13;14;10
NEDGE=16;12
csz=sz
vertwascurve
	jp ROTCURVE
             ;(X    Z    Y)
        ;ROTVERTEX +sz,+sz,+sz         ;0
        ;ROTVERTEX -sz,+sz,+sz         ;1
        ;ROTVERTEX -sz,+sz,-sz         ;2
        ;ROTVERTEX +sz,+sz,-sz ;bottom ;3
        ;ROTVERTEX +sz,-00,+sz         ;4
        ;ROTVERTEX -sz,-00,+sz         ;5
        ;ROTVERTEX -sz,-00,-sz         ;6
        ;ROTVERTEX +sz,-00,-sz ;middle ;7
        ;ROTVERTEX +sz,-sz,+sz         ;8
        ;ROTVERTEX -sz,-sz,+sz         ;9
        ;ROTVERTEX -sz,-sz,-sz         ;10
        ;ROTVERTEX +sz,-sz,-sz ;mid2   ;11
        ;ROTVERTEX +sz,-2*sz,+sz         ;12
        ;ROTVERTEX -sz,-2*sz,+sz         ;13
        ;ROTVERTEX -sz,-2*sz,-sz         ;14
        ;ROTVERTEX +sz,-2*sz,-sz ;top    ;15
                  
polycurve
	db NPOLY
;POLY v1,v2,v3,v4,color
;clockwise
	;POLY4  0, 1, 2, 3,br1 ;0 ;bottom
	
	POLY4  0, 3, 7, 4,br3;2 ;1 ;left low
	POLY4  2, 6, 7, 3,br4 ;2 ;front low
	POLY4  0, 4, 5, 1,br4 ;3 ;back low
	POLY4  1, 5, 6, 2,br3 ;4 ;right low
	
	POLY4  4, 7,11, 8,br2;1 ;5 ;left mid
	POLY4  6,10,11, 7,br3 ;6 ;front mid
	POLY4  4, 8, 9, 5,br3 ;7 ;back mid
	POLY4  5, 9,10, 6,br2 ;8 ;right mid
	
	POLY4  8,11,15,12,br0;1 ;9 ;left high
	POLY4 10,14,15,11,br1;2 ;10 ;front high
	POLY4  8,12,13, 9,br1;2 ;11 ;back high
	POLY4  9,13,14,10,br0;1 ;12 ;right high
	
	POLY4 12,15,14,13,br4 ;13 ;top

	if 1==0
polybase=polycurve+1+8+1 ;visible
edgecurve
	db NEDGE
;EDGE p1,p2,v1,v2 ;(p1 левее v1-v2 при взгляде снаружи, p2 правее - не проверено)
;(back) left
	EDGE  1, 0, 0, 3
	EDGE  1, 2, 3, 7
	EDGE  1, 5, 7, 4
	EDGE  1, 3, 4, 0
;(front) right
	EDGE  4, 3, 1, 5
	EDGE  4, 5, 5, 6
	EDGE  4, 2, 6, 2
	EDGE  4, 0, 2, 1
;sides
	EDGE  3, 5, 5, 4
	EDGE  5, 2, 6, 7
	EDGE  2, 0, 2, 3
	EDGE  0, 3, 1, 0
	endif

;======

edgebase=0;edge+1+8 ;intersect (NU)

	display "model size=",$-modelbegin
