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

tmapbrim=1

_=$
;	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
        dw $+2
szpoly=$-_;14;13
	endm

	macro POLY4 v1,v2,v3,v4,color
_=$
	dw vertbase+(v1*szvert)
        dw vertbase+(v2*szvert)
        dw vertbase+(v3*szvert)
       dw #c080+(tmapbrim*256)+tmapbrim
       dw #c0bf+(tmapbrim*256)-tmapbrim
       dw #ffbf-(tmapbrim*256)-tmapbrim
	; db color
	;db #ff;0 ;visible
        dw $+2
szpoly=$-_
        if 0==0
	dw vertbase+(v1*szvert)
        dw vertbase+(v3*szvert)
        dw vertbase+(v4*szvert)
       dw #c080+(tmapbrim*256)+tmapbrim
       dw #ffbf-(tmapbrim*256)-tmapbrim
       dw #ff80-(tmapbrim*256)+tmapbrim
        dw $+2
        endif
	endm

        macro POLYEND
        org $-2
        dw 0
        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


;========================= куб быстрый
NVERT=8
;NPOLY=6*2
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!)
        POLYEND

	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

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

	display "model size=",$-modelbegin
