Gehirnknoten



  • .data
    
    puffer      dd 0
    p_deltax    dd 0
    p_deltay    dd 0
    p_minx      dd 0
    p_miny      dd 0
    p_maxx      dd 0
    p_maxy      dd 0
    p_mittex    dd 0
    p_mittey    dd 0
    
    extrn p3d         :dword
    extrn p3d_o       :dword
    extrn poly        :dword
    extrn mittel      :dword
    extrn zclip       :dword
    extrn lq          :dword
    
    extrn polyp       :dword
    extrn polyf       :dword
    extrn polyz       :dword
    extrn polyt       :dword
    
    extrn zpuffer     :dword
    
    extrn sincost     :dword
    extrn matrix      :dword
    extrn hmatrix     :dword
    
    extrn perspektive :dword
    extrn max_punkte  :dword
    extrn max_polys   :dword
    extrn max_lq      :dword
    extrn max_sr      :dword
    
    extrn tx          :dword
    extrn ty          :dword
    extrn tz          :dword
    extrn rx          :dword
    extrn ry          :dword
    extrn rz          :dword
    extrn sx          :dword
    extrn sy          :dword
    extrn sz          :dword
    
    extrn texture1    :dword
    extrn texture2    :dword
    extrn texture3    :dword
    extrn texture4    :dword
    
    texture      dd 0
    
    puffermax    dd 0
    pufferm1     dd 0
    puffercpx    dd 0
    puffercpr    dd 0
    offsetinc    dd 0
    
    lplx         dd 0
    livar        dq 0
    
    rgxmin       dd 0
    rgymin       dd 0
    rgzmin       dd 0
    rgxmax       dd 0
    rgymax       dd 0
    rgzmax       dd 0
    f32          dd 0
    
    l            dd 0
    r            dd 0
    
    llyto        dd 0
    llicx        dd 0
    llkoz        dd 0
    llicz        dd 0
    llfwr        dd 0
    llfwg        dd 0
    llfwb        dd 0
    llicr        dd 0
    llicg        dd 0
    llicb        dd 0
    lltex        dd 0
    lltey        dd 0
    llitx        dd 0
    llity        dd 0
    
    rlyto        dd 0
    rlicx        dd 0
    rlkoz        dd 0
    rlicz        dd 0
    rlfwr        dd 0
    rlfwg        dd 0
    rlfwb        dd 0
    rlicr        dd 0
    rlicg        dd 0
    rlicb        dd 0
    rltex        dd 0
    rltey        dd 0
    rlitx        dd 0
    rlity        dd 0
    
    hldex        dd 0
    hlkoz        dd 0
    hlicz        dd 0
    hlfwr        dd 0
    hlfwg        dd 0
    hlfwb        dd 0
    hlicr        dd 0
    hlicg        dd 0
    hlicb        dd 0
    hltex        dd 0
    hltey        dd 0
    hlitx        dd 0
    hlity        dd 0
    
    zcsichtbar   dd 0
    zcnsichtbar  dd 0
    zcsichta     dd 4 dup (0)
    zcnsichta    dd 4 dup (0)
    zcs1_        dd 3 dup (0)
    zcs2_        dd 3 dup (0)
    zca_         dd 3 dup (0)
    zcb_         dd 3 dup (0)
    zcc_         dd 3 dup (0)
    zcd_         dd 3 dup (0)
    zcfaktor1_   dd 0
    zcfaktor2_   dd 0
    
    .code
    
    public init_3dpuffer
    init_3dpuffer proc near
      push ebp
      mov ebp,esp
    
      mov eax,[ebp+8]      ;p_zeiger
      mov ebx,[ebp+12]     ;p_breite
      mov ecx,[ebp+16]     ;p_höhe
    
      mov puffer,eax
      mov p_deltax,ebx
      mov p_deltay,ecx  
      mov p_minx,0
      mov p_miny,0
      mov p_maxx,ebx
      dec p_maxx
      mov p_maxy,ecx
      dec p_maxy
      mov p_mittex,ebx
      shr p_mittex,1
      mov p_mittey,ecx
      shr p_mittey,1
    
      mov esp,ebp
      pop ebp
      ret
    init_3dpuffer endp
    
    public berechne_matrix
    berechne_matrix proc near
      push ebp
    
      mov edi,rx
      shl edi,2
      add edi,offset sincost
      mov esi,ry
      shl esi,2
      add esi,offset sincost
      mov ebx,rz
      shl ebx,2
      add ebx,offset sincost
    
      mov ecx,[edi+16384]                   ;lade c1 ( cos(a) )
    
      mov eax,[esi]
      neg eax
      imul ecx
      shrd eax,edx,16
      mov dword ptr matrix[24],eax          ;x3
    
      mov eax,[esi+16384]
      imul ecx
      shrd eax,edx,16
      mov dword ptr matrix[32],eax          ;z3
    
      mov eax,[ebx+16384]
      imul ecx
      shrd eax,edx,16
      mov dword ptr matrix[16],eax          ;y2
    
      mov eax,[ebx]
      neg eax
      imul ecx
      shrd eax,edx,16
      mov dword ptr matrix[4],eax           ;y1
    
    ;---------------------hmatrix berechnung---------------
    
      mov eax,[esi+16384]
      mov ecx,[ebx+16384]
      imul ecx
      shrd eax,edx,16
      mov dword ptr hmatrix[0],eax          ;(1.)
    
      mov eax,[esi]
      imul ecx
      shrd eax,edx,16
      mov dword ptr hmatrix[4],eax          ;(2.)
    
      mov eax,[esi+16384]
      mov ecx,[ebx]
      imul ecx
      shrd eax,edx,16
      mov dword ptr hmatrix[8],eax          ;(3.)
    
      mov eax,[esi]
      imul ecx
      shrd eax,edx,16
      mov dword ptr hmatrix[12],eax         ;(4.)
    
    ;-----------ende-------------------------------------
    
      mov ecx,[edi]                         ;lade s1 ( sin(a) )
      mov dword ptr matrix[28],ecx         ;y3
    
      mov eax,dword ptr hmatrix[12]
      imul ecx
      shrd eax,edx,16
      mov ebp,eax
      mov eax,dword ptr hmatrix[0]
      sub eax,ebp
      mov dword ptr matrix[0],eax          ;x1
    
      mov eax,dword ptr hmatrix[4]
      imul ecx
      shrd eax,edx,16
      mov ebp,eax
      mov eax,dword ptr hmatrix[8]
      add eax,ebp
      mov dword ptr matrix[12],eax          ;x2
    
      mov eax,dword ptr hmatrix[8]
      imul ecx
      shrd eax,edx,16
      mov ebp,eax
      mov eax,dword ptr hmatrix[4]
      add eax,ebp
      mov dword ptr matrix[8],eax          ;z1
    
      mov eax,dword ptr hmatrix[0]
      imul ecx
      shrd eax,edx,16
      mov ebp,eax
      mov eax,dword ptr hmatrix[12]
      sub eax,ebp
      mov dword ptr matrix[20],eax          ;z2
    
      pop ebp
      ret
    berechne_matrix endp
    
    public ermittle_p
    ermittle_p proc near
      push ebp
    
      mov ebp,max_punkte
      mov lplx,ebp
      mov edi,p3d
      mov ebp,edi
      sub ebp,64
      mov esi,p3d_o
    
      mov ecx,max_sr
    
      mov edx,tx
      sub edx,ecx
      mov rgxmin,edx
      mov edx,tx
      add edx,ecx
      mov rgxmax,edx
    
      mov edx,ty
      sub edx,ecx
      mov rgymin,edx
      mov edx,ty
      add edx,ecx
      mov rgymax,edx
    
      mov edx,tz
      sub edx,ecx
      mov rgzmin,edx
      mov edx,tz
      add edx,ecx
      mov rgzmax,edx
    
    @@ep_mlp:
      mov eax,[esi]                   ;x
      cmp eax,rgxmax
      jg @@ep_nsb
      cmp eax,rgxmin
      jl @@ep_nsb
    
      mov eax,[esi+4]                 ;y
      cmp eax,rgymax
      jg @@ep_nsb
      cmp eax,rgymin
      jl @@ep_nsb
    
      mov eax,[esi+8]                 ;z
      cmp eax,rgzmax
      jg @@ep_nsb
      cmp eax,rgzmin
      jl @@ep_nsb
    
      mov eax,[esi]                     ;punkt ist sichtbar
      mov [edi],eax
      mov eax,[esi+4]
      mov [edi+4],eax
      mov eax,[esi+8]
      mov [edi+8],eax
    
      mov dword ptr [edi+16],0         ;helligkeit des punktes
      mov dword ptr [edi+20],0          ;st=0  ->  sichtbar
      mov [ebp+60],edi                  ;initialisiere nachfolger
      mov ebp,edi                       ;speichere neuen vorgänger
    
      add edi,64
      add esi,64
      dec lplx
      jnz @@ep_mlp
      jmp @@ep_ende
    
    @@ep_nsb:
      mov dword ptr [edi+20],1         ;punkt nicht sichtbar -> st=1
      add edi,64
      add esi,64
      dec lplx
      jnz @@ep_mlp
    
    @@ep_ende:
      mov eax,p3d
      sub eax,64
      cmp ebp,eax
      jne @@ep_aok
      mov [ebp+60],edi
      mov ebp,edi
    @@ep_aok:
      mov dword ptr [ebp+60],0
    
      pop ebp
      ret
    ermittle_p endp
    
    public transliere_v
    transliere_v proc near
      push ebp
    
      mov edi,p3d
      mov edi,[edi-4]
      or edi,edi
      jz @@tv_ende
    
      mov ebx,tx
      mov ecx,ty
      mov edx,tz
    
    @@tv_mlp:
      mov eax,[edi]                     ;punkt ist sichtbar
      sub eax,ebx
      mov [edi],eax
      mov eax,[edi+4]
      sub eax,ecx
      mov [edi+4],eax
      mov eax,[edi+8]
      sub eax,edx
      mov [edi+8],eax
    
      mov edi,[edi+60]
      or edi,edi
      jnz @@tv_mlp
    
    @@tv_ende:
      pop ebp
      ret
    transliere_v endp
    
    public rotiere_v
    rotiere_v proc near
      push ebp
    
      mov edi,p3d
      mov edi,[edi-4]
      or edi,edi
      jz @@rv_ende
    
    @@tm_lp1:
      mov eax,[edi+8]                  ;z-koordinate
      imul dword ptr matrix[32]
      shrd eax,edx,16
      mov ebx,eax
    
      mov eax,[edi+4]
      imul dword ptr matrix[28]
      shrd eax,edx,16
      add ebx,eax
    
      mov eax,[edi]
      imul dword ptr matrix[24]
      shrd eax,edx,16
      add ebx,eax
    
      cmp ebx,perspektive              ;vergleiche z
      jg @@tm_weiter
      mov dword ptr [edi+20],2         ;eventuell punkt für zclip -> st=2
    @@tm_weiter:
    
      mov eax,[edi+8]                  ;y-koordinate
      imul dword ptr matrix[20]
      shrd eax,edx,16
      mov ecx,eax
    
      mov eax,[edi+4]
      imul dword ptr matrix[16]
      shrd eax,edx,16
      add ecx,eax
    
      mov eax,[edi]
      imul dword ptr matrix[12]
      shrd eax,edx,16
      add ecx,eax
    
      mov eax,[edi+8]                  ;x-koordinate
      mov [edi+8],ebx
      imul dword ptr matrix[8]
      shrd eax,edx,16
      mov ebx,eax
    
      mov eax,[edi+4]
      mov [edi+4],ecx
      imul dword ptr matrix[4]
      shrd eax,edx,16
      add ebx,eax
    
      mov eax,[edi]
      imul dword ptr matrix[0]
      shrd eax,edx,16
      add ebx,eax
      mov [edi],ebx
    
    @@tm_ende:
      mov edi,[edi+60]
      or edi,edi
      jnz @@tm_lp1
    
    @@rv_ende:
      pop ebp
      ret
    rotiere_v endp
    
    public berechne_2d
    berechne_2d proc near
      push ebp
    
      mov edi,p3d
      mov edi,[edi-4]
      or edi,edi
      jz @@b2d_ende
    
      mov ebx,p_mittex
      mov ecx,p_mittey
      mov esi,perspektive
      mov ebp,esi
      neg ebp
    
    @@b2d_lp:
      cmp dword ptr [edi+20],0
      jne @@b2d_weiter
    
      mov eax,esi                   ;perspektive
      imul dword ptr [edi]          ;*x
      idiv dword ptr [edi+8]        ;/z
      add eax,ebx                   ;+p_xmitte
      mov [edi+24],eax              ;speichere x2d
    
      mov eax,ebp                   ;perspektive*(-1)
      imul dword ptr [edi+4]        ;*y
      idiv dword ptr [edi+8]        ;/z
      add eax,ecx                   ;+p_ymitte
      mov [edi+28],eax              ;speichere y2d
    
    @@b2d_weiter:
      mov edi,[edi+60]
      or edi,edi
      jnz @@b2d_lp
    
    @@b2d_ende:
      pop ebp
      ret
    berechne_2d endp
    
    public entferne_punkte_1
    entferne_punkte_1 proc near
      push ebp
    
      mov edi,p3d                  ;markiere alle punkte aller sichtbaren polygone als sichtbar
      mov edi,[edi-4]
      or edi,edi
      jz @@ep1_ende
    
    @@ep1_mlp1:
      mov dword ptr [edi+20],1     ;lösche st-attribut alle punkte (st=1)
      mov edi,[edi+60]
      or edi,edi
      jnz @@ep1_mlp1
    
    ;;;;lichtquellen müssen sichtbar gemacht werden!!!!
    
      mov ebx,poly
      mov ebx,[ebx-4]
      or ebx,ebx
      jz @@ep1_ende
    
      mov esi,p3d
      add esi,20
    
    @@ep1_mlp2:
      cmp dword ptr [ebx+28],0
      jne @@ep1_weiter
    
      mov ebp,[ebx]
      shl ebp,6
      mov dword ptr [esi+ebp],0
    
      mov ebp,[ebx+4]
      shl ebp,6
      mov dword ptr [esi+ebp],0
    
      mov ebp,[ebx+8]
      shl ebp,6
      mov dword ptr [esi+ebp],0
    
      mov ebp,[ebx+12]
      shl ebp,6
      mov dword ptr [esi+ebp],0
    
    @@ep1_weiter:
      mov ebx,[ebx+60]
      or ebx,ebx
      jnz @@ep1_mlp2
    
      mov edi,p3d 
      mov ebp,edi
      sub ebp,64
      mov edi,[edi-4]
      or edi,edi
      jz @@ep1_ende
    
    @@ep1_mlp3:
      cmp dword ptr [edi+20],0
      je @@ep1_ok
    
      mov eax,[edi+60]
      mov [ebp+60],eax
    
    @@ep1_ok:
      mov ebp,edi
      mov edi,[edi+60]
      or edi,edi
      jnz @@ep1_mlp3
    
    @@ep1_ende:
      pop ebp
      ret
    entferne_punkte_1 endp
    
    public entferne_polygone_1
    entferne_polygone_1 proc near
      push ebp
    
      mov ecx,max_polys
    
      mov esi,poly
      mov ebx,esi
      sub ebx,64
    
      mov ebp,p3d
      add ebp,20
    
    @@epo1_lp:
      mov edi,[esi]                   ;entferne_poly1...
      shl edi,6                       ;dieser abschnitt entfernt alle polys mit mindestens
      cmp dword ptr [edi+ebp],1       ;einem punkt ausserhalb des 1.raumes
      je @@epo1_nsb2                  ;1. punkt nicht sichtbar
    
      mov edi,[esi+4]
      shl edi,6
      cmp dword ptr [edi+ebp],1
      je @@epo1_nsb2                  ;2. punkt nicht sichtbar
    
      mov edi,[esi+8]
      shl edi,6
      cmp dword ptr [edi+ebp],1
      je @@epo1_nsb2                  ;3. punkt nicht sichtbar
    
      mov edi,[esi+12]
      shl edi,6
      cmp dword ptr [edi+ebp],1
      je @@epo1_nsb2                  ;4. punkt nicht sichtbar  ...entferne_poly1
                                      ;wenn poly sichtbar -> entf_poly2
    
      mov edi,[esi]                   ;entferne_poly2...
      shl edi,6                       ;fallunterscheidung ob 1.punkt sichtbar oder nicht
      cmp dword ptr [ebp+edi],0
      jz @@epo1_sichtbar
    
      mov edi,[esi+4]                 ;1. punkt ist nicht sichtbar
      shl edi,6                       ;suche nun so lange bis ein sichtbarer
      cmp dword ptr [ebp+edi],0       ;punkt gefunden ist ... dann zclippoly
      jz @@epo1_sb                    ;ansonsten poly nicht sichtbar
    
      mov edi,[esi+8]                 ; -> 2. 3. 4. punkt 
      shl edi,6
      cmp dword ptr [ebp+edi],0
      jz @@epo1_sb
    
      mov edi,[esi+12]
      shl edi,6
      cmp dword ptr [ebp+edi],0
      jz @@epo1_sb
      mov dword ptr [esi+28],1        ;poly entfällt da nicht sichtbar -> st=1
      jmp @@epo1_weiter
    @@epo1_sb:
      mov dword ptr [esi+28],2        ;zclippoly -> st=2
      mov [ebx+60],esi                  ;initialisiere nachfolger
      mov ebx,esi                       ;speichere neuen vörgänger
      jmp @@epo1_weiter
    
    @@epo1_sichtbar:                  ;1. punkt ist sichtbar...
      mov edi,[esi+4]                 ;suche nun bis ein punkt nicht sichtbar ist
      shl edi,6                       ;dann zlippoly ansonsten poly sichtbar
      cmp dword ptr [ebp+edi],0       ; -> 2.-4. punkt
      jnz @@epo1_nsb
    
      mov edi,[esi+8]
      shl edi,6
      cmp dword ptr [ebp+edi],0
      jnz @@epo1_nsb
    
      mov edi,[esi+12]
      shl edi,6
      cmp dword ptr [ebp+edi],0
      jnz @@epo1_nsb
    
      mov dword ptr [esi+28],0        ;poly ist sichtbar -> st=0
      mov [ebx+60],esi                ;initialisiere nachfolger
      mov ebx,esi                     ;speichere neuen vörgänger
      jmp @@epo1_weiter               ;...entferne_poly
    @@epo1_nsb:
      mov dword ptr [esi+28],2        ;zclippoly -> st=2
      mov [ebx+60],esi                ;initialisiere nachfolger
      mov ebx,esi                     ;speichere neuen vörgänger
      jmp @@epo1_weiter               ;...entferne_poly2
    
    @@epo1_nsb2:
      mov dword ptr [esi+28],1        ;nicht sichtbar -> st=1
    
    @@epo1_weiter:
      add esi,64
      dec ecx
      jnz @@epo1_lp
    
      mov eax,poly
      sub eax,64
      cmp ebx,eax
      jne @@epo1_aok
      mov [ebx+60],esi
      mov ebx,esi
    @@epo1_aok:
      mov dword ptr [ebx+60],0
    
      pop ebp
      ret
    entferne_polygone_1 endp
    
    public entferne_polygone_3
    entferne_polygone_3 proc near
      push ebp
    
      mov edi,poly
      mov ebx,edi
      sub ebx,64
      mov edi,[edi-4]
      or edi,edi
      jz @@epo3_schluss
    
      mov ebp,p3d
      add ebp,24
    
    @@epo3_lp:
      cmp dword ptr [edi+28],0
      jne @@epo3_ende
    
      mov esi,[edi]
      shl esi,6
      cmp dword ptr [esi+ebp],0
      jnl @@epo3_w1
    
      mov esi,[edi+4]
      shl esi,6
      cmp dword ptr [esi+ebp],0
      jnl @@epo3_w1
    
      mov esi,[edi+8]
      shl esi,6
      cmp dword ptr [esi+ebp],0
      jnl @@epo3_w1
    
      mov esi,[edi+12]
      shl esi,6
      cmp dword ptr [esi+ebp],0
      jnl @@epo3_w1
    
      mov dword ptr [edi+28],1
      mov eax,[edi+60]
      mov [ebx+60],eax
      jmp @@epo3_ende
    
    @@epo3_w1:
      mov esi,[edi]
      shl esi,6
      mov eax,[esi+ebp]
      cmp eax,p_deltax
      jnge @@epo3_w2
    
      mov esi,[edi+4]
      shl esi,6
      mov eax,[esi+ebp]
      cmp eax,p_deltax
      jnge @@epo3_w2
    
      mov esi,[edi+8]
      shl esi,6
      mov eax,[esi+ebp]
      cmp eax,p_deltax
      jnge @@epo3_w2
    
      mov esi,[edi+12]
      shl esi,6
      mov eax,[esi+ebp]
      cmp eax,p_deltax
      jnge @@epo3_w2
    
      mov dword ptr [edi+28],1
      mov eax,[edi+60]
      mov [ebx+60],eax
      jmp @@epo3_ende
    
    @@epo3_w2:
      mov esi,[edi]
      shl esi,6
      cmp dword ptr [esi+ebp+4],0
      jnl @@epo3_w3
    
      mov esi,[edi+4]
      shl esi,6
      cmp dword ptr [esi+ebp+4],0
      jnl @@epo3_w3
    
      mov esi,[edi+8]
      shl esi,6
      cmp dword ptr [esi+ebp+4],0
      jnl @@epo3_w3
    
      mov esi,[edi+12]
      shl esi,6
      cmp dword ptr [esi+ebp+4],0
      jnl @@epo3_w3
    
      mov dword ptr [edi+28],1
      mov eax,[edi+60]
      mov [ebx+60],eax
      jmp @@epo3_ende
    
    @@epo3_w3:
      mov esi,[edi]
      shl esi,6
      mov eax,[esi+ebp+4]
      cmp eax,p_maxy
      jnge @@epo3_w4
    
      mov esi,[edi+4]
      shl esi,6
      mov eax,[esi+ebp+4]
      cmp eax,p_deltay
      jnge @@epo3_w4
    
      mov esi,[edi+8]
      shl esi,6
      mov eax,[esi+ebp+4]
      cmp eax,p_deltay
      jnge @@epo3_w4
    
      mov esi,[edi+12]
      shl esi,6
      mov eax,[esi+ebp+4]
      cmp eax,p_deltay
      jnge @@epo3_w4
    
      mov dword ptr [edi+28],1
      mov eax,[edi+60]
      mov [ebx+60],eax
      jmp @@epo3_ende
    
    @@epo3_w4:                      ;rückseitenentfernung...
      mov esi,[edi+4]               ;berechne: (y1-y0)*(x2-x0)-(y2-y0)*(x1-x0)
      shl esi,6
      mov eax,[esi+ebp+4]
      mov esi,[edi+8]
      shl esi,6
      mov edx,[esi+ebp]
      mov esi,[edi]
      shl esi,6
      sub eax,[esi+ebp+4]
      sub edx,[esi+ebp]
      imul edx
      push eax                      ;1.operand speichern
    
      mov esi,[edi+8]
      shl esi,6
      mov eax,[esi+ebp+4]
      mov esi,[edi+4]
      shl esi,6
      mov edx,[esi+ebp]
      mov esi,[edi]
      shl esi,6
      sub eax,[esi+ebp+4]
      sub edx,[esi+ebp]
      imul edx
      pop edx                       ;1.operand zurückholen
      sub edx,eax
    
      cmp edx,0                     ;wenn edx>=0 -> st=1
      jle @@epo3_ende
      mov dword ptr [edi+28],1
      mov eax,[edi+60]
      mov [ebx+60],eax
    
    @@epo3_ende:
      mov ebx,edi
      mov edi,[edi+60]
      or edi,edi
      jnz @@epo3_lp
    
    @@epo3_schluss:
      pop ebp
      ret
    entferne_polygone_3 endp
    
    public berechne_beleuchtung
    berechne_beleuchtung proc near
      push ebp
    
      mov esi,p3d
      mov esi,[esi-4]
      or esi,esi
      jz @@bebl_ende
    
    @@bbl_lp:
      cmp dword ptr [esi+20],0
      jne @@bbl_ende
    
      push edi
    
      mov edi,max_lq
      mov eax,lq
      mov r,eax
    
    @@bbl_lp2:
      mov ebp,r
      mov ebx,[ebp]
      shl ebx,6
      add ebx,p3d
    ;;  cmp dword ptr [ebx+20],1
    ;;  je @@bbl_weiter
    
      mov edx,[esi]
      mov eax,[ebx]
      sub eax,[ebp+4]
      cmp edx,eax
      jl @@bbl_weiter
      mov eax,[ebx]
      add eax,[ebp+4]
      cmp edx,eax
      jg @@bbl_weiter
    
      mov edx,[esi+4]
      mov eax,[ebx+4]
      sub eax,[ebp+4]
      cmp edx,eax
      jl @@bbl_weiter
      mov eax,[ebx+4]
      add eax,[ebp+4]
      cmp edx,eax
      jg @@bbl_weiter
    
      mov edx,[esi+8]
      mov eax,[ebx+8]
      sub eax,[ebp+4]
      cmp edx,eax
      jl @@bbl_weiter
      mov eax,[ebx+8]
      add eax,[ebp+4]
      cmp edx,eax
      jg @@bbl_weiter
    
      mov eax,[ebx]
      sub eax,[esi]
      imul eax
      mov ebp,eax
      mov ecx,edx
    
      mov eax,[ebx+4]
      sub eax,[esi+4]
      imul eax
      add ebp,eax
      adc ecx,edx
    
      mov eax,[ebx+8]
      sub eax,[esi+8]
      imul eax
      add ebp,eax
      adc ecx,edx
    
      mov dword ptr livar,ebp
      mov dword ptr livar+4,ecx
      fild livar
      fsqrt
      fistp livar
    
      mov ebp,r
      mov eax,dword ptr [ebp+4]
      sub eax,dword ptr livar
      jl @@bbl_weiter                ;wenn betrag(pu) > maxradius(lq) -> @@weiter
    
      mul dword ptr [ebp+8]    ;berechne die beleuchtung
      div dword ptr [ebp+4]    ;eines punktes
    
      mov ebp,[esi+16]
      add ebp,eax
      cmp ebp,255
      jle @@bbl_kv
      mov ebp,255
    @@bbl_kv:
      mov [esi+16],ebp
    
    @@bbl_weiter:
      add r,16
      dec edi
      jnz @@bbl_lp2
    
      pop edi
    
    @@bbl_ende:
      mov esi,[esi+60]
      or esi,esi
      jnz @@bbl_lp
    
    @@bebl_ende:
      pop ebp
      ret
    berechne_beleuchtung endp
    
    public zclipping
    zclipping proc near
      push ebp
    
      mov esi,max_polys
      mov lplx,esi
    
      mov ecx,zclip
      mov esi,poly
      mov ebp,p3d
      add ebp,20
    
    @@zc_lp:
      mov eax,[esi+28]
      cmp eax,1                    ;polygon ist nicht sichtbar
      je @@zc_s04
    
      cmp eax,2
      je @@zc_zclippoly
    
      mov dword ptr [ecx],0        ;polygon ist voll sichtbar  -> kein zclip
      jmp @@zc_s04
    @@zc_zclippoly:  
    
      mov dword ptr zcsichtbar,0
      mov dword ptr zcnsichtbar,0
    
      mov edi,[esi]
      shl edi,6
      mov eax,[ebp+edi]
      cmp eax,2
      jne @@zc_1s
    
      mov edi,zcnsichtbar
      shl edi,2
      mov dword ptr zcnsichta+edi,0
      inc zcnsichtbar
      jmp @@zc_1w
    @@zc_1s:
      mov edi,zcsichtbar
      shl edi,2
      mov dword ptr zcsichta+edi,0
      inc zcsichtbar
    @@zc_1w:
    
      mov edi,[esi+4]
      shl edi,6
      mov eax,[ebp+edi]
      cmp eax,2
      jne @@zc_2s
    
      mov edi,zcnsichtbar
      shl edi,2
      mov dword ptr zcnsichta+edi,1
      inc zcnsichtbar
      jmp @@zc_2w
    @@zc_2s:
      mov edi,zcsichtbar
      shl edi,2
      mov dword ptr zcsichta+edi,1
      inc zcsichtbar
    @@zc_2w:
    
      mov edi,[esi+8]
      shl edi,6
      mov eax,[ebp+edi]
      cmp eax,2
      jne @@zc_3s
    
      mov edi,zcnsichtbar
      shl edi,2
      mov dword ptr zcnsichta+edi,2
      inc zcnsichtbar
      jmp @@zc_3w
    @@zc_3s:
      mov edi,zcsichtbar
      shl edi,2
      mov dword ptr zcsichta+edi,2
      inc zcsichtbar
    @@zc_3w:
    
      mov edi,[esi+12]
      shl edi,6
      mov eax,[ebp+edi]
      cmp eax,2
      jne @@zc_4s
    
      mov edi,zcnsichtbar
      shl edi,2
      mov dword ptr zcnsichta+edi,3
      inc zcnsichtbar
      jmp @@zc_4w
    @@zc_4s:
      mov edi,zcsichtbar
      shl edi,2
      mov dword ptr zcsichta+edi,3
      inc zcsichtbar
    @@zc_4w:
    
      cmp zcsichtbar,1
      jne @@zc_s01
    
      mov dword ptr [esi+28],1
      jmp @@zc_s04
    @@zc_s01:
    
      cmp zcsichtbar,2
      jne @@zc_s02
    
      mov dword ptr [esi+28],1
      jmp @@zc_s04
    @@zc_s02:
    
      cmp zcsichtbar,3
      jne @@zc_s04
    
      mov dword ptr [esi+28],1
    
    @@zc_s04:
      add ecx,16
      add esi,64
      dec lplx
      jnz @@zc_lp
    
      pop ebp
      ret
    zclipping endp
    
    public zeichne_polys
    zeichne_polys proc near
      push ebp
    
      mov ecx,p_deltax         ;lösche zpuffer
      imul ecx,p_deltay
      mov edi,zpuffer          ;lade offset
      mov eax,07fffffffh    ;lade z (=max)
      rep stosd                ;lösche zpuffer
    
      mov edi,poly
      mov edi,[edi-4]
    
    @@lp:
      mov esi,[edi+28]
      cmp esi,0
      jne @@zp_weiter
    
      mov ebp,p3d
      add ebp,24
    
      mov esi,[edi]
      shl esi,6
      mov eax,[esi+ebp]
      mov dword ptr polyp[0],eax
      mov eax,[esi+ebp+4]
      mov dword ptr polyp[4],eax
    
      mov esi,[edi+4]
      shl esi,6
      mov eax,[esi+ebp]
      mov dword ptr polyp[8],eax
      mov eax,[esi+ebp+4]
      mov dword ptr polyp[12],eax
    
      mov esi,[edi+8]
      shl esi,6
      mov eax,[esi+ebp]
      mov dword ptr polyp[16],eax
      mov eax,[esi+ebp+4]
      mov dword ptr polyp[20],eax
    
      mov esi,[edi+12]
      shl esi,6
      mov eax,[esi+ebp]
      mov dword ptr polyp[24],eax
      mov eax,[esi+ebp+4]
      mov dword ptr polyp[28],eax
    
      mov esi,[edi+16]
      cmp esi,3
      jne @@zp_kein_shadepoly
    
      pushad
    
      mov esi,[edi+20]
      cmp esi,0
      jne @@lll1
      mov eax,texture2
      mov texture,eax
    @@lll1:
    
      cmp esi,1
      jne @@lll2
      mov eax,texture1
      mov texture,eax
    @@lll2:
    
      cmp esi,2
      jne @@lll3
      mov eax,texture3
      mov texture,eax
    @@lll3:
    
      cmp esi,3
      jne @@lll4
      mov eax,texture4
      mov texture,eax
    @@lll4:
    
      mov esi,[edi]           ;lade 1.punkt des poly
      shl esi,6
      add esi,p3d
      mov eax,[esi+16]
    
      mov dword ptr polyf[0],eax
      mov dword ptr polyf[4],eax
      mov dword ptr polyf[8],eax
    
      mov eax,[esi+8]           ;lade z-wert
      mov dword ptr polyz[0],eax
    
      mov esi,[edi+4]           ;lade 2.punkt des poly
      shl esi,6
      add esi,p3d
      mov eax,[esi+16]
    
      mov dword ptr polyf[16],eax
      mov dword ptr polyf[20],eax
      mov dword ptr polyf[24],eax
    
      mov eax,[esi+8]           ;lade z-wert
      mov dword ptr polyz[4],eax
    
      mov esi,[edi+8]           ;lade 3.punkt des poly
      shl esi,6
      add esi,p3d
      mov eax,[edi+24]
      mov eax,[esi+16]
    
      mov dword ptr polyf[32],eax
      mov dword ptr polyf[36],eax
      mov dword ptr polyf[40],eax
    
      mov eax,[esi+8]           ;lade z-wert
      mov dword ptr polyz[8],eax
    
      mov esi,[edi+12]           ;lade 4.punkt des poly
      shl esi,6
      add esi,p3d
      mov eax,[edi+24]
      mov eax,[esi+16]
    
      mov dword ptr polyf[48],eax
      mov dword ptr polyf[52],eax
      mov dword ptr polyf[56],eax
    
      mov eax,[esi+8]           ;lade z-wert
      mov dword ptr polyz[12],eax
    
      call texturpoly
    
      popad
      jmp @@zp_weiter
    
    @@zp_kein_shadepoly:
    
    @@zp_weiter:
      mov edi,[edi+60]
      or edi,edi
      jnz @@lp
    
    @@zp_ende:
      pop ebp
      ret
    zeichne_polys endp
    
    public fillpoly
    fillpoly proc near
      push ebp
    
      mov esi,polyp[4]              ;lade ymin und ymax
      mov edi,esi
      mov ebp,0                 ;lade xoffset
    
      mov ecx,polyp[12]             ;ermittle ymin und ymax
      cmp edi,ecx
      jge @@fp_000
      mov edi,ecx               ;speichere ymax
      jmp @@fp_001
    @@fp_000:
      cmp esi,ecx
      jle @@fp_001
      mov esi,ecx               ;speichere ymin
      mov ebp,8                 ;speichere xoffset
    @@fp_001:
    
      mov ecx,polyp[20]             ;...
      cmp edi,ecx
      jge @@fp_010
      mov edi,ecx
      jmp @@fp_011
    @@fp_010:
      cmp esi,ecx
      jle @@fp_011
      mov esi,ecx
      mov ebp,16
    @@fp_011:
    
      mov ecx,polyp[28]             ;...
      cmp edi,ecx
      jge @@fp_020
      mov edi,ecx
      jmp @@fp_021
    @@fp_020:
      cmp esi,ecx
      jle @@fp_021
      mov esi,ecx
      mov ebp,24
    @@fp_021:
    
      cmp edi,p_maxy            ;wenn ymax>p_ymax ---> clipping
      jle @@fp_nclymax
      mov edi,p_maxy
    @@fp_nclymax:
      sub edi,esi               ;berechne höhe des polygons
      inc edi
      mov lplx,edi
      mov ebx,polyp[ebp]            ;lade x-links -> y in esi
      shl ebx,16                ;16 bit fix
      mov ecx,ebx               ;lade x-rechts
    
      mov edx,ebp               ;links
      sub edx,8
      and edx,31
      mov l,edx
    
      mov edi,polyp[edx+4]
      mov llyto,edi
      sub edi,esi
      inc edi
      mov eax,polyp[edx]
      shl eax,16
      sub eax,ebx
      cdq
      idiv edi
      mov llicx,eax
    
      mov edx,ebp               ;rechts
      add edx,8
      and edx,31
      mov r,edx
    
      mov edi,polyp[edx+4]
      mov rlyto,edi
      sub edi,esi
      inc edi
      mov eax,polyp[edx]
      shl eax,16
      sub eax,ecx
      cdq
      idiv edi
    
      mov edx,eax               ;lade x-rechts-increment
      mov eax,llicx             ;lade x-links-increment
      mov ebp,lplx              ;lade höhe des polygons
      mov edi,p_deltax          ;berechne offset-increment
      shl edi,2
      mov offsetinc,edi
      mov edi,esi               ;berechne offset ohne x-anteil
      imul edi,p_deltax
      shl edi,2
      add edi,puffer
    
    @@fp_loop:
      push eax
      push ebx
      push ecx
      push edi
    
      sar ebx,16
      sar ecx,16
    
      cmp esi,p_miny
      jl @@fp_lende
      cmp ebx,ecx
      jge @@fp_lende
      cmp ebx,p_maxx
      jg @@fp_lende
      cmp ecx,p_minx
      jl @@fp_lende
    
      cmp ebx,p_minx
      jge @@fp_kxk
      mov ebx,p_minx
    @@fp_kxk:
      cmp ecx,p_maxx
      jle @@fp_kxg
      mov ecx,p_maxx
    @@fp_kxg:
    
      mov eax,f32         ;lade farbe
      sub ecx,ebx             ;berechne deltax
      inc ecx
      shl ebx,2               ;berechne startposition
      add edi,ebx
      rep stosd               ;und zeichne linie
    
    @@fp_lende:
      pop edi
      pop ecx
      pop ebx
      pop eax
    
      cmp llyto,esi
      jg @@fp_61
    
      push edi
      push edx
    
      add ebx,eax               ;x-links weiter
    
      mov edx,l                 ;berechne nächsten punkt
      sub edx,8
      and edx,31
      mov l,edx
    
      mov edi,polyp[edx+4]
      mov llyto,edi
      sub edi,esi
      inc edi
      jnz @@fp_nn06
      mov edi,1
    @@fp_nn06:
      mov eax,polyp[edx]
      shl eax,16
      sub eax,ebx
      cdq
      idiv edi
    
      pop edx
      pop edi
    
    @@fp_61:
      cmp rlyto,esi
      jg @@fp_62
    
      push edi
      push eax
    
      add ecx,edx               ;x-rechts weiter
    
      mov edx,r
      add edx,8
      and edx,31
      mov r,edx
    
      mov edi,polyp[edx+4]          ;berechne nächsten punkt
      mov rlyto,edi
      sub edi,esi
      inc edi
      jnz @@fp_nn07
      mov edi,1
    @@fp_nn07:
      mov eax,polyp[edx]
      inc eax
      shl eax,16
      sub eax,ecx
      cdq
      idiv edi
      mov edx,eax
    
      pop eax
      pop edi
    
    @@fp_62:
      add ebx,eax                 ;x-links weiter
      add ecx,edx                 ;x-rechts weiter
    
      add edi,offsetinc           ;offset weiter
      inc esi                     ;y weiter
      dec ebp                     ;schleife weiter
      jnz @@fp_loop
    
    @@fp_ende:
      pop ebp
      ret
    fillpoly endp
    
    public texturpoly
    texturpoly proc near
      push ebp
    
      mov esi,polyp[4]              ;lade ymin und ymax
      mov edi,esi
      mov ebp,0                 ;lade xoffset
    
      mov ecx,polyp[12]             ;ermittle ymin und ymax
      cmp edi,ecx
      jge @@sp_000
      mov edi,ecx               ;speichere ymax
      jmp @@sp_001
    @@sp_000:
      cmp esi,ecx
      jle @@sp_001
      mov esi,ecx               ;speichere ymin
      mov ebp,8                 ;speichere xoffset
    @@sp_001:
    
      mov ecx,polyp[20]             ;...
      cmp edi,ecx
      jge @@sp_010
      mov edi,ecx
      jmp @@sp_011
    @@sp_010:
      cmp esi,ecx
      jle @@sp_011
      mov esi,ecx
      mov ebp,16
    @@sp_011:
    
      mov ecx,polyp[28]             ;...
      cmp edi,ecx
      jge @@sp_020
      mov edi,ecx
      jmp @@sp_021
    @@sp_020:
      cmp esi,ecx
      jle @@sp_021
      mov esi,ecx
      mov ebp,24
    @@sp_021:
    
      cmp edi,p_maxy            ;wenn ymax>p_ymax ---> clipping
      jle @@sp_nclymax
      mov edi,p_maxy
    @@sp_nclymax:
      sub edi,esi               ;berechne höhe des polygons
      inc edi
      mov lplx,edi
    
      mov ebx,polyp[ebp]            ;lade x-links -> y in esi
      shl ebx,16                ;16 bit fix
      mov ecx,ebx               ;lade x-rechts
    
      mov edi,ebp               ;lade rgb-links und rgb-rechts
      shl edi,1
      mov eax,polyf[edi]
      shl eax,16
      mov llfwr,eax
      mov rlfwr,eax
      mov eax,polyf[edi+4]
      shl eax,16
      mov llfwg,eax
      mov rlfwg,eax
      mov eax,polyf[edi+8]
      shl eax,16
      mov llfwb,eax
      mov rlfwb,eax
    
      mov edi,ebp               ;lade z-links und z-rechts
      shr edi,1
      mov eax,polyz[edi]
      mov llkoz,eax
      mov rlkoz,eax
    
      mov edi,ebp               ;lade tx/ty-links und tx/ty-rechts
      mov eax,polyt[edi]
      shl eax,16
      mov lltex,eax
      mov rltex,eax
    
      mov eax,polyt[edi+4]
      shl eax,16
      mov lltey,eax
      mov rltey,eax
    
      mov edx,ebp               ;links
      sub edx,8
      and edx,31
      mov l,edx
    
      mov edi,polyp[edx+4]
      mov llyto,edi
      sub edi,esi
      inc edi
      mov eax,polyp[edx]
      shl eax,16
      sub eax,ebx
      cdq
      idiv edi
      mov llicx,eax
    
      mov edx,l
      shl edx,1
      mov eax,polyf[edx]
      shl eax,16
      sub eax,llfwr
      cdq
      idiv edi
      mov llicr,eax
    
      mov edx,l
      shl edx,1
      mov eax,polyf[edx+4]
      shl eax,16
      sub eax,llfwg
      cdq
      idiv edi
      mov llicg,eax
    
      mov edx,l
      shl edx,1
      mov eax,polyf[edx+8]
      shl eax,16
      sub eax,llfwb
      cdq
      idiv edi
      mov llicb,eax
    
      mov edx,l
      shr edx,1
      mov eax,polyz[edx]
      sub eax,llkoz
      cdq
      idiv edi
      mov llicz,eax
    
      mov edx,l
      mov eax,polyt[edx]
      shl eax,16
      sub eax,lltex
      cdq
      idiv edi
      mov llitx,eax
    
      mov edx,l
      mov eax,polyt[edx+4]
      shl eax,16
      sub eax,lltey
      cdq
      idiv edi
      mov llity,eax
    
      mov edx,ebp               ;rechts
      add edx,8
      and edx,31
      mov r,edx
    
      mov edi,polyp[edx+4]
      mov rlyto,edi
      sub edi,esi
      inc edi
      mov eax,polyp[edx]
      shl eax,16
      sub eax,ecx
      cdq
      idiv edi
      mov rlicx,eax
    
      mov edx,r
      shl edx,1
      mov eax,polyf[edx]
      shl eax,16
      sub eax,rlfwr
      cdq
      idiv edi
      mov rlicr,eax
    
      mov edx,r
      shl edx,1
      mov eax,polyf[edx+4]
      shl eax,16
      sub eax,rlfwg
      cdq
      idiv edi
      mov rlicg,eax
    
      mov edx,r
      shl edx,1
      mov eax,polyf[edx+8]
      shl eax,16
      sub eax,rlfwb
      cdq
      idiv edi
      mov rlicb,eax
    
      mov edx,r
      shr edx,1
      mov eax,polyz[edx]
      sub eax,rlkoz
      cdq
      idiv edi
      mov rlicz,eax
    
      mov edx,r
      mov eax,polyt[edx]
      shl eax,16
      sub eax,rltex
      cdq
      idiv edi
      mov rlitx,eax
    
      mov edx,r
      mov eax,polyt[edx+4]
      shl eax,16
      sub eax,rltey
      cdq
      idiv edi
      mov rlity,eax
    
      mov ebp,lplx              ;lade höhe des polygons
      mov edi,p_deltax          ;berechne offset-increment
      shl edi,2
      mov offsetinc,edi
      mov edi,esi               ;berechne offset ohne x-anteil
      imul edi,p_deltax
      shl edi,2
      add edi,puffer
      mov eax,llicx             ;lade x-links-increment
      mov edx,rlicx             ;lade x-rechts-increment
    
    @@sp_loop:
      pushad
    
      sar ebx,16
      sar ecx,16
    
      cmp esi,p_miny
      jl @@sp_lende
      cmp ebx,ecx
      jge @@sp_lende
      cmp ebx,p_maxx
      jg @@sp_lende
      cmp ecx,p_minx
      jl @@sp_lende
    
      mov hldex,ecx            ;berechne absolutes deltax
      sub hldex,ebx
      inc hldex
    
      mov eax,llfwr            ;lade farbstartwerte
      mov hlfwr,eax
      mov eax,llfwg
      mov hlfwg,eax
      mov eax,llfwb
      mov hlfwb,eax
    
      mov eax,llkoz            ;lade linken z-wert (anfangswert)
      mov hlkoz,eax
    
      mov eax,lltex            ;lade linken tx/ty-wert (anfangswert)
      mov hltex,eax
      mov eax,lltey
      mov hltey,eax
    
      mov eax,rlfwr            ;berechne rgb-incremente
      sub eax,llfwr
      cdq
      idiv hldex
      mov hlicr,eax
    
      mov eax,rlfwg            ;g
      sub eax,llfwg
      cdq
      idiv hldex
      mov hlicg,eax
    
      mov eax,rlfwb            ;b
      sub eax,llfwb
      cdq
      idiv hldex
      mov hlicb,eax
    
      mov eax,rlkoz            ;berechne z-increment
      sub eax,llkoz
      cdq
      idiv hldex
      mov hlicz,eax
    
      mov eax,rltex            ;berechne tx/ty-increment
      sub eax,lltex
      cdq
      idiv hldex
      mov hlitx,eax
    
      mov eax,rltey
      sub eax,lltey
      cdq
      idiv hldex
      mov hlity,eax
    
      cmp ebx,p_minx
      jge @@sp_kxk
    
      push ebx
      sub ebx,p_minx
      neg ebx
      imul ebx,hlicr
      add hlfwr,ebx
      pop ebx
    
      push ebx
      sub ebx,p_minx
      neg ebx
      imul ebx,hlicg
      add hlfwg,ebx
      pop ebx
    
      push ebx
      sub ebx,p_minx
      neg ebx
      imul ebx,hlicb
      add hlfwb,ebx
      pop ebx
    
      push ebx
      sub ebx,p_minx
      neg ebx
      imul ebx,hlicz
      add hlkoz,ebx
      pop ebx
    
      push ebx
      sub ebx,p_minx
      neg ebx
      imul ebx,hlitx
      add hltex,ebx
      pop ebx
    
      push ebx
      sub ebx,p_minx
      neg ebx
      imul ebx,hlity
      add hltey,ebx
      pop ebx
    
      mov ebx,p_minx
    @@sp_kxk:
    
      cmp ecx,p_maxx
      jle @@sp_kxg
      mov ecx,p_maxx
    @@sp_kxg:
    
      sub ecx,ebx             ;berechne deltax
      inc ecx
      shl ebx,2               ;berechne startposition
      add edi,ebx
    
      mov esi,hlfwr
      mov ebp,hlfwg
      mov edx,hlfwb
    
    @@sp_lplp:
      mov ebx,edi
      sub ebx,puffer
      add ebx,zpuffer
    
      mov eax,hlkoz
      cmp eax,dword ptr [ebx]
      jge @@sp_lplpweiter
    
      push ecx
      mov dword ptr [ebx],eax    ;schreibe neuen z-wert
    
      mov ebx,hltey
      shr ebx,16
      cmp ebx,127
      jle @@sp_kkk1
      mov ebx,127
    @@sp_kkk1:
      cmp ebx,0
      jge @@sp_kkk2
      mov ebx,0
    @@sp_kkk2:
      mov eax,hltex
      shr eax,16
      cmp eax,127
      jle @@sp_kkk3
      mov eax,127
    @@sp_kkk3:
      cmp eax,0
      jge @@sp_kkk4
      mov eax,0
    @@sp_kkk4:
    
      shl ebx,7
      add ebx,eax
      shl ebx,2
      add ebx,texture
    
      mov ecx,dword ptr [ebx]
    
      mov eax,0
      mov al,cl
      mov ebx,edx
      shr ebx,16
      imul eax,ebx
      shr eax,8
      mov cl,al
    
      mov eax,0
      mov al,ch
      mov ebx,ebp
      shr ebx,16
      imul eax,ebx
      shr eax,8
      mov ch,al
    
      rol ecx,16
      mov eax,0
      mov al,cl
      mov ebx,esi
      shr ebx,16
      imul eax,ebx
      shr eax,8
      mov cl,al
      rol ecx,16  
    
      mov dword ptr [edi],ecx
      pop ecx
    
    @@sp_lplpweiter:
      add esi,hlicr
      add ebp,hlicg
      add edx,hlicb
    
      mov eax,hlicz
      add hlkoz,eax
    
      mov eax,hlitx
      add hltex,eax
      mov eax,hlity
      add hltey,eax
    
      add edi,4
      dec ecx
      jnz @@sp_lplp
    
    @@sp_lende:
      popad
    
      cmp llyto,esi
      jg @@sp_61
    
      push edi
      push edx
    
      push eax
      mov eax,llicr               ;rgb-links weiter
      add llfwr,eax
      mov eax,llicg
      add llfwg,eax
      mov eax,llicb
      add llfwb,eax
    
      mov eax,llicz               ;z-links weiter
      add llkoz,eax
    
      mov eax,llitx               ;tx/ty-links weiter
      add lltex,eax
      mov eax,llity
      add lltey,eax
      pop eax
    
      add ebx,eax               ;x-links weiter
    
      mov edx,l                 ;berechne nächsten punkt
      sub edx,8
      and edx,31
      mov l,edx
    
      mov edi,polyp[edx+4]
      mov llyto,edi
      sub edi,esi
      inc edi
      jnz @@sp_nn06
      mov edi,1
    @@sp_nn06:
      mov eax,polyp[edx]
      shl eax,16
      sub eax,ebx
      cdq
      idiv edi
      mov llicx,eax
    
      mov edx,l
      shl edx,1
      mov eax,polyf[edx]
      shl eax,16
      sub eax,llfwr
      cdq
      idiv edi
      mov llicr,eax
    
      mov edx,l
      shl edx,1
      mov eax,polyf[edx+4]
      shl eax,16
      sub eax,llfwg
      cdq
      idiv edi
      mov llicg,eax
    
      mov edx,l
      shl edx,1
      mov eax,polyf[edx+8]
      shl eax,16
      sub eax,llfwb
      cdq
      idiv edi
      mov llicb,eax
    
      mov edx,l
      shr edx,1
      mov eax,polyz[edx]
      sub eax,llkoz
      cdq
      idiv edi
      mov llicz,eax
    
      mov edx,l
      mov eax,polyt[edx]
      shl eax,16
      sub eax,lltex
      cdq
      idiv edi
      mov llitx,eax
    
      mov edx,l
      mov eax,polyt[edx+4]
      shl eax,16
      sub eax,lltey
      cdq
      idiv edi
      mov llity,eax
    
      mov eax,llicx
    
      pop edx
      pop edi
    
    @@sp_61:
      cmp rlyto,esi
      jg @@sp_62
    
      push edi
      push eax
    
      push edx
      mov edx,rlicr               ;rgb-rechts weiter
      add rlfwr,edx
      mov edx,rlicg
      add rlfwg,edx
      mov edx,rlicb
      add rlfwb,edx
    
      mov edx,rlicz               ;z-rechts weiter
      add rlkoz,edx
    
      mov edx,rlitx               ;tx/ty-rechts weiter
      add rltex,edx
      mov edx,rlity
      add rltey,edx
      pop edx
    
      add ecx,edx               ;x-rechts weiter
    
      mov edx,r
      add edx,8
      and edx,31
      mov r,edx
    
      mov edi,polyp[edx+4]          ;berechne nächsten punkt
      mov rlyto,edi
      sub edi,esi
      inc edi
      jnz @@sp_nn07
      mov edi,1
    @@sp_nn07:
      mov eax,polyp[edx]
      inc eax
      shl eax,16
      sub eax,ecx
      cdq
      idiv edi
      mov rlicx,eax
    
      mov edx,r
      shl edx,1
      mov eax,polyf[edx]
      shl eax,16
      sub eax,rlfwr
      cdq
      idiv edi
      mov rlicr,eax
    
      mov edx,r
      shl edx,1
      mov eax,polyf[edx+4]
      shl eax,16
      sub eax,rlfwg
      cdq
      idiv edi
      mov rlicg,eax
    
      mov edx,r
      shl edx,1
      mov eax,polyf[edx+8]
      shl eax,16
      sub eax,rlfwb
      cdq
      idiv edi
      mov rlicb,eax
    
      mov edx,r
      shr edx,1
      mov eax,polyz[edx]
      sub eax,rlkoz
      cdq
      idiv edi
      mov rlicz,eax
    
      mov edx,r
      mov eax,polyt[edx]
      shl eax,16
      sub eax,rltex
      cdq
      idiv edi
      mov rlitx,eax
    
      mov edx,r
      mov eax,polyt[edx+4]
      shl eax,16
      sub eax,rltey
      cdq
      idiv edi
      mov rlity,eax
    
      mov edx,rlicx
    
      pop eax
      pop edi
    
    @@sp_62:
      push eax
      mov eax,llicr               ;rgb-links weiter
      add llfwr,eax
      mov eax,llicg
      add llfwg,eax
      mov eax,llicb
      add llfwb,eax
    
      mov eax,rlicr               ;rgb-rechts weiter
      add rlfwr,eax
      mov eax,rlicg
      add rlfwg,eax
      mov eax,rlicb
      add rlfwb,eax
    
      mov eax,llicz               ;z-links weiter
      add llkoz,eax
      mov eax,rlicz               ;z-rechts weiter
      add rlkoz,eax
    
      mov eax,llitx               ;tx/ty-links weiter
      add lltex,eax
      mov eax,llity
      add lltey,eax
    
      mov eax,rlitx               ;tx/ty-rechts weiter
      add rltex,eax
      mov eax,rlity
      add rltey,eax
    
      pop eax
    
      add ebx,eax                 ;x-links weiter
      add ecx,edx                 ;x-rechts weiter
    
      add edi,offsetinc           ;offset weiter
      inc esi                     ;y weiter
      dec ebp                     ;schleife weiter
      jnz @@sp_loop
    
    @@sp_ende:
      pop ebp
      ret
    texturpoly endp
    
    end
    


  • Original erstellt von <Schidd>:
    **```
    .data

    puffer dd 0
    p_deltax dd 0
    p_deltay dd 0
    p_minx dd 0
    p_miny dd 0
    p_maxx dd 0
    p_maxy dd 0
    p_mittex dd 0
    p_mittey dd 0

    extrn p3d :dword
    extrn p3d_o :dword
    extrn poly :dword
    extrn mittel :dword
    extrn zclip :dword
    extrn lq :dword

    extrn polyp :dword
    extrn polyf :dword
    extrn polyz :dword
    extrn polyt :dword

    extrn zpuffer :dword

    extrn sincost :dword
    extrn matrix :dword
    extrn hmatrix :dword

    extrn perspektive :dword
    extrn max_punkte :dword
    extrn max_polys :dword
    extrn max_lq :dword
    extrn max_sr :dword

    extrn tx :dword
    extrn ty :dword
    extrn tz :dword
    extrn rx :dword
    extrn ry :dword
    extrn rz :dword
    extrn sx :dword
    extrn sy :dword
    extrn sz :dword

    extrn texture1 :dword
    extrn texture2 :dword
    extrn texture3 :dword
    extrn texture4 :dword

    texture dd 0

    puffermax dd 0
    pufferm1 dd 0
    puffercpx dd 0
    puffercpr dd 0
    offsetinc dd 0

    lplx dd 0
    livar dq 0

    rgxmin dd 0
    rgymin dd 0
    rgzmin dd 0
    rgxmax dd 0
    rgymax dd 0
    rgzmax dd 0
    f32 dd 0

    l dd 0
    r dd 0

    llyto dd 0
    llicx dd 0
    llkoz dd 0
    llicz dd 0
    llfwr dd 0
    llfwg dd 0
    llfwb dd 0
    llicr dd 0
    llicg dd 0
    llicb dd 0
    lltex dd 0
    lltey dd 0
    llitx dd 0
    llity dd 0

    rlyto dd 0
    rlicx dd 0
    rlkoz dd 0
    rlicz dd 0
    rlfwr dd 0
    rlfwg dd 0
    rlfwb dd 0
    rlicr dd 0
    rlicg dd 0
    rlicb dd 0
    rltex dd 0
    rltey dd 0
    rlitx dd 0
    rlity dd 0

    hldex dd 0
    hlkoz dd 0
    hlicz dd 0
    hlfwr dd 0
    hlfwg dd 0
    hlfwb dd 0
    hlicr dd 0
    hlicg dd 0
    hlicb dd 0
    hltex dd 0
    hltey dd 0
    hlitx dd 0
    hlity dd 0

    zcsichtbar dd 0
    zcnsichtbar dd 0
    zcsichta dd 4 dup (0)
    zcnsichta dd 4 dup (0)
    zcs1_ dd 3 dup (0)
    zcs2_ dd 3 dup (0)
    zca_ dd 3 dup (0)
    zcb_ dd 3 dup (0)
    zcc_ dd 3 dup (0)
    zcd_ dd 3 dup (0)
    zcfaktor1_ dd 0
    zcfaktor2_ dd 0

    .code

    public init_3dpuffer
    init_3dpuffer proc near
    push ebp
    mov ebp,esp

    mov eax,[ebp+8] ;p_zeiger
    mov ebx,[ebp+12] ;p_breite
    mov ecx,[ebp+16] ;p_höhe

    mov puffer,eax
    mov p_deltax,ebx
    mov p_deltay,ecx
    mov p_minx,0
    mov p_miny,0
    mov p_maxx,ebx
    dec p_maxx
    mov p_maxy,ecx
    dec p_maxy
    mov p_mittex,ebx
    shr p_mittex,1
    mov p_mittey,ecx
    shr p_mittey,1

    mov esp,ebp
    pop ebp
    ret
    init_3dpuffer endp

    public berechne_matrix
    berechne_matrix proc near
    push ebp

    mov edi,rx
    shl edi,2
    add edi,offset sincost
    mov esi,ry
    shl esi,2
    add esi,offset sincost
    mov ebx,rz
    shl ebx,2
    add ebx,offset sincost

    mov ecx,[edi+16384] ;lade c1 ( cos(a) )

    mov eax,[esi]
    neg eax
    imul ecx
    shrd eax,edx,16
    mov dword ptr matrix[24],eax ;x3

    mov eax,[esi+16384]
    imul ecx
    shrd eax,edx,16
    mov dword ptr matrix[32],eax ;z3

    mov eax,[ebx+16384]
    imul ecx
    shrd eax,edx,16
    mov dword ptr matrix[16],eax ;y2

    mov eax,[ebx]
    neg eax
    imul ecx
    shrd eax,edx,16
    mov dword ptr matrix[4],eax ;y1

    ;---------------------hmatrix berechnung---------------

    mov eax,[esi+16384]
    mov ecx,[ebx+16384]
    imul ecx
    shrd eax,edx,16
    mov dword ptr hmatrix[0],eax ;(1.)

    mov eax,[esi]
    imul ecx
    shrd eax,edx,16
    mov dword ptr hmatrix[4],eax ;(2.)

    mov eax,[esi+16384]
    mov ecx,[ebx]
    imul ecx
    shrd eax,edx,16
    mov dword ptr hmatrix[8],eax ;(3.)

    mov eax,[esi]
    imul ecx
    shrd eax,edx,16
    mov dword ptr hmatrix[12],eax ;(4.)

    ;-----------ende-------------------------------------

    mov ecx,[edi] ;lade s1 ( sin(a) )
    mov dword ptr matrix[28],ecx ;y3

    mov eax,dword ptr hmatrix[12]
    imul ecx
    shrd eax,edx,16
    mov ebp,eax
    mov eax,dword ptr hmatrix[0]
    sub eax,ebp
    mov dword ptr matrix[0],eax ;x1

    mov eax,dword ptr hmatrix[4]
    imul ecx
    shrd eax,edx,16
    mov ebp,eax
    mov eax,dword ptr hmatrix[8]
    add eax,ebp
    mov dword ptr matrix[12],eax ;x2

    mov eax,dword ptr hmatrix[8]
    imul ecx
    shrd eax,edx,16
    mov ebp,eax
    mov eax,dword ptr hmatrix[4]
    add eax,ebp
    mov dword ptr matrix[8],eax ;z1

    mov eax,dword ptr hmatrix[0]
    imul ecx
    shrd eax,edx,16
    mov ebp,eax
    mov eax,dword ptr hmatrix[12]
    sub eax,ebp
    mov dword ptr matrix[20],eax ;z2

    pop ebp
    ret
    berechne_matrix endp

    public ermittle_p
    ermittle_p proc near
    push ebp

    mov ebp,max_punkte
    mov lplx,ebp
    mov edi,p3d
    mov ebp,edi
    sub ebp,64
    mov esi,p3d_o

    mov ecx,max_sr

    mov edx,tx
    sub edx,ecx
    mov rgxmin,edx
    mov edx,tx
    add edx,ecx
    mov rgxmax,edx

    mov edx,ty
    sub edx,ecx
    mov rgymin,edx
    mov edx,ty
    add edx,ecx
    mov rgymax,edx

    mov edx,tz
    sub edx,ecx
    mov rgzmin,edx
    mov edx,tz
    add edx,ecx
    mov rgzmax,edx

    @@ep_mlp:
    mov eax,[esi] ;x
    cmp eax,rgxmax
    jg @@ep_nsb
    cmp eax,rgxmin
    jl @@ep_nsb

    mov eax,[esi+4] ;y
    cmp eax,rgymax
    jg @@ep_nsb
    cmp eax,rgymin
    jl @@ep_nsb

    mov eax,[esi+8] ;z
    cmp eax,rgzmax
    jg @@ep_nsb
    cmp eax,rgzmin
    jl @@ep_nsb

    mov eax,[esi] ;punkt ist sichtbar
    mov [edi],eax
    mov eax,[esi+4]
    mov [edi+4],eax
    mov eax,[esi+8]
    mov [edi+8],eax

    mov dword ptr [edi+16],0 ;helligkeit des punktes
    mov dword ptr [edi+20],0 ;st=0 -> sichtbar
    mov [ebp+60],edi ;initialisiere nachfolger
    mov ebp,edi ;speichere neuen vorgänger

    add edi,64
    add esi,64
    dec lplx
    jnz @@ep_mlp
    jmp @@ep_ende

    @@ep_nsb:
    mov dword ptr [edi+20],1 ;punkt nicht sichtbar -> st=1
    add edi,64
    add esi,64
    dec lplx
    jnz @@ep_mlp

    @@ep_ende:
    mov eax,p3d
    sub eax,64
    cmp ebp,eax
    jne @@ep_aok
    mov [ebp+60],edi
    mov ebp,edi
    @@ep_aok:
    mov dword ptr [ebp+60],0

    pop ebp
    ret
    ermittle_p endp

    public transliere_v
    transliere_v proc near
    push ebp

    mov edi,p3d
    mov edi,[edi-4]
    or edi,edi
    jz @@tv_ende

    mov ebx,tx
    mov ecx,ty
    mov edx,tz

    @@tv_mlp:
    mov eax,[edi] ;punkt ist sichtbar
    sub eax,ebx
    mov [edi],eax
    mov eax,[edi+4]
    sub eax,ecx
    mov [edi+4],eax
    mov eax,[edi+8]
    sub eax,edx
    mov [edi+8],eax

    mov edi,[edi+60]
    or edi,edi
    jnz @@tv_mlp

    @@tv_ende:
    pop ebp
    ret
    transliere_v endp

    public rotiere_v
    rotiere_v proc near
    push ebp

    mov edi,p3d
    mov edi,[edi-4]
    or edi,edi
    jz @@rv_ende

    @@tm_lp1:
    mov eax,[edi+8] ;z-koordinate
    imul dword ptr matrix[32]
    shrd eax,edx,16
    mov ebx,eax

    mov eax,[edi+4]
    imul dword ptr matrix[28]
    shrd eax,edx,16
    add ebx,eax

    mov eax,[edi]
    imul dword ptr matrix[24]
    shrd eax,edx,16
    add ebx,eax

    cmp ebx,perspektive ;vergleiche z
    jg @@tm_weiter
    mov dword ptr [edi+20],2 ;eventuell punkt für zclip -> st=2
    @@tm_weiter:

    mov eax,[edi+8] ;y-koordinate
    imul dword ptr matrix[20]
    shrd eax,edx,16
    mov ecx,eax

    mov eax,[edi+4]
    imul dword ptr matrix[16]
    shrd eax,edx,16
    add ecx,eax

    mov eax,[edi]
    imul dword ptr matrix[12]
    shrd eax,edx,16
    add ecx,eax

    mov eax,[edi+8] ;x-koordinate
    mov [edi+8],ebx
    imul dword ptr matrix[8]
    shrd eax,edx,16
    mov ebx,eax

    mov eax,[edi+4]
    mov [edi+4],ecx
    imul dword ptr matrix[4]
    shrd eax,edx,16
    add ebx,eax

    mov eax,[edi]
    imul dword ptr matrix[0]
    shrd eax,edx,16
    add ebx,eax
    mov [edi],ebx

    @@tm_ende:
    mov edi,[edi+60]
    or edi,edi
    jnz @@tm_lp1

    @@rv_ende:
    pop ebp
    ret
    rotiere_v endp

    public berechne_2d
    berechne_2d proc near
    push ebp

    mov edi,p3d
    mov edi,[edi-4]
    or edi,edi
    jz @@b2d_ende

    mov ebx,p_mittex
    mov ecx,p_mittey
    mov esi,perspektive
    mov ebp,esi
    neg ebp

    @@b2d_lp:
    cmp dword ptr [edi+20],0
    jne @@b2d_weiter

    mov eax,esi ;perspektive
    imul dword ptr [edi] ;*x
    idiv dword ptr [edi+8] ;/z
    add eax,ebx ;+p_xmitte
    mov [edi+24],eax ;speichere x2d

    mov eax,ebp ;perspektive*(-1)
    imul dword ptr [edi+4] ;*y
    idiv dword ptr [edi+8] ;/z
    add eax,ecx ;+p_ymitte
    mov [edi+28],eax ;speichere y2d

    @@b2d_weiter:
    mov edi,[edi+60]
    or edi,edi
    jnz @@b2d_lp

    @@b2d_ende:
    pop ebp
    ret
    berechne_2d endp

    public entferne_punkte_1
    entferne_punkte_1 proc near
    push ebp

    mov edi,p3d ;markiere alle punkte aller sichtbaren polygone als sichtbar
    mov edi,[edi-4]
    or edi,edi
    jz @@ep1_ende

    @@ep1_mlp1:
    mov dword ptr [edi+20],1 ;lösche st-attribut alle punkte (st=1)
    mov edi,[edi+60]
    or edi,edi
    jnz @@ep1_mlp1

    ;;;;lichtquellen müssen sichtbar gemacht werden!!!!

    mov ebx,poly
    mov ebx,[ebx-4]
    or ebx,ebx
    jz @@ep1_ende

    mov esi,p3d
    add esi,20

    @@ep1_mlp2:
    cmp dword ptr [ebx+28],0
    jne @@ep1_weiter

    mov ebp,[ebx]
    shl ebp,6
    mov dword ptr [esi+ebp],0

    mov ebp,[ebx+4]
    shl ebp,6
    mov dword ptr [esi+ebp],0

    mov ebp,[ebx+8]
    shl ebp,6
    mov dword ptr [esi+ebp],0

    mov ebp,[ebx+12]
    shl ebp,6
    mov dword ptr [esi+ebp],0

    @@ep1_weiter:
    mov ebx,[ebx+60]
    or ebx,ebx
    jnz @@ep1_mlp2

    mov edi,p3d
    mov ebp,edi
    sub ebp,64
    mov edi,[edi-4]
    or edi,edi
    jz @@ep1_ende

    @@ep1_mlp3:
    cmp dword ptr [edi+20],0
    je @@ep1_ok

    mov eax,[edi+60]
    mov [ebp+60],eax

    @@ep1_ok:
    mov ebp,edi
    mov edi,[edi+60]
    or edi,edi
    jnz @@ep1_mlp3

    @@ep1_ende:
    pop ebp
    ret
    entferne_punkte_1 endp

    public entferne_polygone_1
    entferne_polygone_1 proc near
    push ebp

    mov ecx,max_polys

    mov esi,poly
    mov ebx,esi
    sub ebx,64

    mov ebp,p3d
    add ebp,20

    @@epo1_lp:
    mov edi,[esi] ;entferne_poly1...
    shl edi,6 ;dieser abschnitt entfernt alle polys mit mindestens
    cmp dword ptr [edi+ebp],1 ;einem punkt ausserhalb des 1.raumes
    je @@epo1_nsb2 ;1. punkt nicht sichtbar

    mov edi,[esi+4]
    shl edi,6
    cmp dword ptr [edi+ebp],1
    je @@epo1_nsb2 ;2. punkt nicht sichtbar

    mov edi,[esi+8]
    shl edi,6
    cmp dword ptr [edi+ebp],1
    je @@epo1_nsb2 ;3. punkt nicht sichtbar

    mov edi,[esi+12]
    shl edi,6
    cmp dword ptr [edi+ebp],1
    je @@epo1_nsb2 ;4. punkt nicht sichtbar ...entferne_poly1
    ;wenn poly sichtbar -> entf_poly2

    mov edi,[esi] ;entferne_poly2...
    shl edi,6 ;fallunterscheidung ob 1.punkt sichtbar oder nicht
    cmp dword ptr [ebp+edi],0
    jz @@epo1_sichtbar

    mov edi,[esi+4] ;1. punkt ist nicht sichtbar
    shl edi,6 ;suche nun so lange bis ein sichtbarer
    cmp dword ptr [ebp+edi],0 ;punkt gefunden ist ... dann zclippoly
    jz @@epo1_sb ;ansonsten poly nicht sichtbar

    mov edi,[esi+8] ; -> 2. 3. 4. punkt
    shl edi,6
    cmp dword ptr [ebp+edi],0
    jz @@epo1_sb

    mov edi,[esi+12]
    shl edi,6
    cmp dword ptr [ebp+edi],0
    jz @@epo1_sb
    mov dword ptr [esi+28],1 ;poly entfällt da nicht sichtbar -> st=1
    jmp @@epo1_weiter
    @@epo1_sb:
    mov dword ptr [esi+28],2 ;zclippoly -> st=2
    mov [ebx+60],esi ;initialisiere nachfolger
    mov ebx,esi ;speichere neuen vörgänger
    jmp @@epo1_weiter

    @@epo1_sichtbar: ;1. punkt ist sichtbar...
    mov edi,[esi+4] ;suche nun bis ein punkt nicht sichtbar ist
    shl edi,6 ;dann zlippoly ansonsten poly sichtbar
    cmp dword ptr [ebp+edi],0 ; -> 2.-4. punkt
    jnz @@epo1_nsb

    mov edi,[esi+8]
    shl edi,6
    cmp dword ptr [ebp+edi],0
    jnz @@epo1_nsb

    mov edi,[esi+12]
    shl edi,6
    cmp dword ptr [ebp+edi],0
    jnz @@epo1_nsb

    mov dword ptr [esi+28],0 ;poly ist sichtbar -> st=0
    mov [ebx+60],esi ;initialisiere nachfolger
    mov ebx,esi ;speichere neuen vörgänger
    jmp @@epo1_weiter ;...entferne_poly
    @@epo1_nsb:
    mov dword ptr [esi+28],2 ;zclippoly -> st=2
    mov [ebx+60],esi ;initialisiere nachfolger
    mov ebx,esi ;speichere neuen vörgänger
    jmp @@epo1_weiter ;...entferne_poly2

    @@epo1_nsb2:
    mov dword ptr [esi+28],1 ;nicht sichtbar -> st=1

    @@epo1_weiter:
    add esi,64
    dec ecx
    jnz @@epo1_lp

    mov eax,poly
    sub eax,64
    cmp ebx,eax
    jne @@epo1_aok
    mov [ebx+60],esi
    mov ebx,esi
    @@epo1_aok:
    mov dword ptr [ebx+60],0

    pop ebp
    ret
    entferne_polygone_1 endp

    public entferne_polygone_3
    entferne_polygone_3 proc near
    push ebp

    mov edi,poly
    mov ebx,edi
    sub ebx,64
    mov edi,[edi-4]
    or edi,edi
    jz @@epo3_schluss

    mov ebp,p3d
    add ebp,24

    @@epo3_lp:
    cmp dword ptr [edi+28],0
    jne @@epo3_ende

    mov esi,[edi]
    shl esi,6
    cmp dword ptr [esi+ebp],0
    jnl @@epo3_w1

    mov esi,[edi+4]
    shl esi,6
    cmp dword ptr [esi+ebp],0
    jnl @@epo3_w1

    mov esi,[edi+8]
    shl esi,6
    cmp dword ptr [esi+ebp],0
    jnl @@epo3_w1

    mov esi,[edi+12]
    shl esi,6
    cmp dword ptr [esi+ebp],0
    jnl @@epo3_w1

    mov dword ptr [edi+28],1
    mov eax,[edi+60]
    mov [ebx+60],eax
    jmp @@epo3_ende

    @@epo3_w1:
    mov esi,[edi]
    shl esi,6
    mov eax,[esi+ebp]
    cmp eax,p_deltax
    jnge @@epo3_w2

    mov esi,[edi+4]
    shl esi,6
    mov eax,[esi+ebp]
    cmp eax,p_deltax
    jnge @@epo3_w2

    mov esi,[edi+8]
    shl esi,6
    mov eax,[esi+ebp]
    cmp eax,p_deltax
    jnge @@epo3_w2

    mov esi,[edi+12]
    shl esi,6
    mov eax,[esi+ebp]
    cmp eax,p_deltax
    jnge @@epo3_w2

    mov dword ptr [edi+28],1
    mov eax,[edi+60]
    mov [ebx+60],eax
    jmp @@epo3_ende

    @@epo3_w2:
    mov esi,[edi]
    shl esi,6
    cmp dword ptr [esi+ebp+4],0
    jnl @@epo3_w3

    mov esi,[edi+4]
    shl esi,6
    cmp dword ptr [esi+ebp+4],0
    jnl @@epo3_w3

    mov esi,[edi+8]
    shl esi,6
    cmp dword ptr [esi+ebp+4],0
    jnl @@epo3_w3

    mov esi,[edi+12]
    shl esi,6
    cmp dword ptr [esi+ebp+4],0
    jnl @@epo3_w3

    mov dword ptr [edi+28],1
    mov eax,[edi+60]
    mov [ebx+60],eax
    jmp @@epo3_ende

    @@epo3_w3:
    mov esi,[edi]
    shl esi,6
    mov eax,[esi+ebp+4]
    cmp eax,p_maxy
    jnge @@epo3_w4

    mov esi,[edi+4]
    shl esi,6
    mov eax,[esi+ebp+4]
    cmp eax,p_deltay
    jnge @@epo3_w4

    mov esi,[edi+8]
    shl esi,6
    mov eax,[esi+ebp+4]
    cmp eax,p_deltay
    jnge @@epo3_w4

    mov esi,[edi+12]
    shl esi,6
    mov eax,[esi+ebp+4]
    cmp eax,p_deltay
    jnge @@epo3_w4

    mov dword ptr [edi+28],1
    mov eax,[edi+60]
    mov [ebx+60],eax
    jmp @@epo3_ende

    @@epo3_w4: ;rückseitenentfernung...
    mov esi,[edi+4] ;berechne: (y1-y0)(x2-x0)-(y2-y0)(x1-x0)
    shl esi,6
    mov eax,[esi+ebp+4]
    mov esi,[edi+8]
    shl esi,6
    mov edx,[esi+ebp]
    mov esi,[edi]
    shl esi,6
    sub eax,[esi+ebp+4]
    sub edx,[esi+ebp]
    imul edx
    push eax ;1.operand speichern

    mov esi,[edi+8]
    shl esi,6
    mov eax,[esi+ebp+4]
    mov esi,[edi+4]
    shl esi,6
    mov edx,[esi+ebp]
    mov esi,[edi]
    shl esi,6
    sub eax,[esi+ebp+4]
    sub edx,[esi+ebp]
    imul edx
    pop edx ;1.operand zurückholen
    sub edx,eax

    cmp edx,0 ;wenn edx>=0 -> st=1
    jle @@epo3_ende
    mov dword ptr [edi+28],1
    mov eax,[edi+60]
    mov [ebx+60],eax

    @@epo3_ende:
    mov ebx,edi
    mov edi,[edi+60]
    or edi,edi
    jnz @@epo3_lp

    @@epo3_schluss:
    pop ebp
    ret
    entferne_polygone_3 endp

    public berechne_beleuchtung
    berechne_beleuchtung proc near
    push ebp

    mov esi,p3d
    mov esi,[esi-4]
    or esi,esi
    jz @@bebl_ende

    @@bbl_lp:
    cmp dword ptr [esi+20],0
    jne @@bbl_ende

    push edi

    mov edi,max_lq
    mov eax,lq
    mov r,eax

    @@bbl_lp2:
    mov ebp,r
    mov ebx,[ebp]
    shl ebx,6
    add ebx,p3d
    ;; cmp dword ptr [ebx+20],1
    ;; je @@bbl_weiter

    mov edx,[esi]
    mov eax,[ebx]
    sub eax,[ebp+4]
    cmp edx,eax
    jl @@bbl_weiter
    mov eax,[ebx]
    add eax,[ebp+4]
    cmp edx,eax
    jg @@bbl_weiter

    mov edx,[esi+4]
    mov eax,[ebx+4]
    sub eax,[ebp+4]
    cmp edx,eax
    jl @@bbl_weiter
    mov eax,[ebx+4]
    add eax,[ebp+4]
    cmp edx,eax
    jg @@bbl_weiter

    mov edx,[esi+8]
    mov eax,[ebx+8]
    sub eax,[ebp+4]
    cmp edx,eax
    jl @@bbl_weiter
    mov eax,[ebx+8]
    add eax,[ebp+4]
    cmp edx,eax
    jg @@bbl_weiter

    mov eax,[ebx]
    sub eax,[esi]
    imul eax
    mov ebp,eax
    mov ecx,edx

    mov eax,[ebx+4]
    sub eax,[esi+4]
    imul eax
    add ebp,eax
    adc ecx,edx

    mov eax,[ebx+8]
    sub eax,[esi+8]
    imul eax
    add ebp,eax
    adc ecx,edx

    mov dword ptr livar,ebp
    mov dword ptr livar+4,ecx
    fild livar
    fsqrt
    fistp livar

    mov ebp,r
    mov eax,dword ptr [ebp+4]
    sub eax,dword ptr livar
    jl @@bbl_weiter ;wenn betrag(pu) > maxradius(lq) -> @@weiter

    mul dword ptr [ebp+8] ;berechne die beleuchtung
    div dword ptr [ebp+4] ;eines punktes

    mov ebp,[esi+16]
    add ebp,eax
    cmp ebp,255
    jle @@bbl_kv
    mov ebp,255
    @@bbl_kv:
    mov [esi+16],ebp

    @@bbl_weiter:
    add r,16
    dec edi
    jnz @@bbl_lp2

    pop edi

    @@bbl_ende:
    mov esi,[esi+60]
    or esi,esi
    jnz @@bbl_lp

    @@bebl_ende:
    pop ebp
    ret
    berechne_beleuchtung endp

    public zclipping
    zclipping proc near
    push ebp

    mov esi,max_polys
    mov lplx,esi

    mov ecx,zclip
    mov esi,poly
    mov ebp,p3d
    add ebp,20

    @@zc_lp:
    mov eax,[esi+28]
    cmp eax,1 ;polygon ist nicht sichtbar
    je @@zc_s04

    cmp eax,2
    je @@zc_zclippoly

    mov dword ptr [ecx],0 ;polygon ist voll sichtbar -> kein zclip
    jmp @@zc_s04
    @@zc_zclippoly:

    mov dword ptr zcsichtbar,0
    mov dword ptr zcnsichtbar,0

    mov edi,[esi]
    shl edi,6
    mov eax,[ebp+edi]
    cmp eax,2
    jne @@zc_1s

    mov edi,zcnsichtbar
    shl edi,2
    mov dword ptr zcnsichta+edi,0
    inc zcnsichtbar
    jmp @@zc_1w
    @@zc_1s:
    mov edi,zcsichtbar
    shl edi,2
    mov dword ptr zcsichta+edi,0
    inc zcsichtbar
    @@zc_1w:

    mov edi,[esi+4]
    shl edi,6
    mov eax,[ebp+edi]
    cmp eax,2
    jne @@zc_2s

    mov edi,zcnsichtbar
    shl edi,2
    mov dword ptr zcnsichta+edi,1
    inc zcnsichtbar
    jmp @@zc_2w
    @@zc_2s:
    mov edi,zcsichtbar
    shl edi,2
    mov dword ptr zcsichta+edi,1
    inc zcsichtbar
    @@zc_2w:

    mov edi,[esi+8]
    shl edi,6
    mov eax,[ebp+edi]
    cmp eax,2
    jne @@zc_3s

    mov edi,zcnsichtbar
    shl edi,2
    mov dword ptr zcnsichta+edi,2
    inc zcnsichtbar
    jmp @@zc_3w
    @@zc_3s:
    mov edi,zcsichtbar
    shl edi,2
    mov dword ptr zcsichta+edi,2
    inc zcsichtbar
    @@zc_3w:

    mov edi,[esi+12]
    shl edi,6
    mov eax,[ebp+edi]
    cmp eax,2
    jne @@zc_4s

    mov edi,zcnsichtbar
    shl edi,2
    mov dword ptr zcnsichta+edi,3
    inc zcnsichtbar
    jmp @@zc_4w
    @@zc_4s:
    mov edi,zcsichtbar
    shl edi,2
    mov dword ptr zcsichta+edi,3
    inc zcsichtbar
    @@zc_4w:

    cmp zcsichtbar,1
    jne @@zc_s01

    mov dword ptr [esi+28],1
    jmp @@zc_s04
    @@zc_s01:

    cmp zcsichtbar,2
    jne @@zc_s02

    mov dword ptr [esi+28],1
    jmp @@zc_s04
    @@zc_s02:

    cmp zcsichtbar,3
    jne @@zc_s04

    mov dword ptr [esi+28],1

    @@zc_s04:
    add ecx,16
    add esi,64
    dec lplx
    jnz @@zc_lp

    pop ebp
    ret
    zclipping endp

    public zeichne_polys
    zeichne_polys proc near
    push ebp

    mov ecx,p_deltax ;lösche zpuffer
    imul ecx,p_deltay
    mov edi,zpuffer ;lade offset
    mov eax,07fffffffh ;lade z (=max)
    rep stosd ;lösche zpuffer

    mov edi,poly
    mov edi,[edi-4]

    @@lp:
    mov esi,[edi+28]
    cmp esi,0
    jne @@zp_weiter

    mov ebp,p3d
    add ebp,24

    mov esi,[edi]
    shl esi,6
    mov eax,[esi+ebp]
    mov dword ptr polyp[0],eax
    mov eax,[esi+ebp+4]
    mov dword ptr polyp[4],eax

    mov esi,[edi+4]
    shl esi,6
    mov eax,[esi+ebp]
    mov dword ptr polyp[8],eax
    mov eax,[esi+ebp+4]
    mov dword ptr polyp[12],eax

    mov esi,[edi+8]
    shl esi,6
    mov eax,[esi+ebp]
    mov dword ptr polyp[16],eax
    mov eax,[esi+ebp+4]
    mov dword ptr polyp[20],eax

    mov esi,[edi+12]
    shl esi,6
    mov eax,[esi+ebp]
    mov dword ptr polyp[24],eax
    mov eax,[esi+ebp+4]
    mov dword ptr polyp[28],eax

    mov esi,[edi+16]
    cmp esi,3
    jne @@zp_kein_shadepoly

    pushad

    mov esi,[edi+20]
    cmp esi,0
    jne @@lll1
    mov eax,texture2
    mov texture,eax
    @@lll1:

    cmp esi,1
    jne @@lll2
    mov eax,texture1
    mov texture,eax
    @@lll2:

    cmp esi,2
    jne @@lll3
    mov eax,texture3
    mov texture,eax
    @@lll3:

    cmp esi,3
    jne @@lll4
    mov eax,texture4
    mov texture,eax
    @@lll4:

    mov esi,[edi] ;lade 1.punkt des poly
    shl esi,6
    add esi,p3d
    mov eax,[esi+16]

    mov dword ptr polyf[0],eax
    mov dword ptr polyf[4],eax
    mov dword ptr polyf[8],eax

    mov eax,[esi+8] ;lade z-wert
    mov dword ptr polyz[0],eax

    mov esi,[edi+4] ;lade 2.punkt des poly
    shl esi,6
    add esi,p3d
    mov eax,[esi+16]

    mov dword ptr polyf[16],eax
    mov dword ptr polyf[20],eax
    mov dword ptr polyf[24],eax

    mov eax,[esi+8] ;lade z-wert
    mov dword ptr polyz[4],eax

    mov esi,[edi+8] ;lade 3.punkt des poly
    shl esi,6
    add esi,p3d
    mov eax,[edi+24]
    mov eax,[esi+16]

    mov dword ptr polyf[32],eax
    mov dword ptr polyf[36],eax
    mov dword ptr polyf[40],eax

    mov eax,[esi+8] ;lade z-wert
    mov dword ptr polyz[8],eax

    mov esi,[edi+12] ;lade 4.punkt des poly
    shl esi,6
    add esi,p3d
    mov eax,[edi+24]
    mov eax,[esi+16]

    mov dword ptr polyf[48],eax
    mov dword ptr polyf[52],eax
    mov dword ptr polyf[56],eax

    mov eax,[esi+8] ;lade z-wert
    mov dword ptr polyz[12],eax

    call texturpoly

    popad
    jmp @@zp_weiter

    @@zp_kein_shadepoly:

    @@zp_weiter:
    mov edi,[edi+60]
    or edi,edi
    jnz @@lp

    @@zp_ende:
    pop ebp
    ret
    zeichne_polys endp

    public fillpoly
    fillpoly proc near
    push ebp

    mov esi,polyp[4] ;lade ymin und ymax
    mov edi,esi
    mov ebp,0 ;lade xoffset

    mov ecx,polyp[12] ;ermittle ymin und ymax
    cmp edi,ecx
    jge @@fp_000
    mov edi,ecx ;speichere ymax
    jmp @@fp_001
    @@fp_000:
    cmp esi,ecx
    jle @@fp_001
    mov esi,ecx ;speichere ymin
    mov ebp,8 ;speichere xoffset
    @@fp_001:

    mov ecx,polyp[20] ;...
    cmp edi,ecx
    jge @@fp_010
    mov edi,ecx
    jmp @@fp_011
    @@fp_010:
    cmp esi,ecx
    jle @@fp_011
    mov esi,ecx
    mov ebp,16
    @@fp_011:

    mov ecx,polyp[28] ;...
    cmp edi,ecx
    jge @@fp_020
    mov edi,ecx
    jmp @@fp_021
    @@fp_020:
    cmp esi,ecx
    jle @@fp_021
    mov esi,ecx
    mov ebp,24
    @@fp_021:

    cmp edi,p_maxy ;wenn ymax>p_ymax ---> clipping
    jle @@fp_nclymax
    mov edi,p_maxy
    @@fp_nclymax:
    sub edi,esi ;berechne höhe des polygons
    inc edi
    mov lplx,edi
    mov ebx,polyp[ebp] ;lade x-links -> y in esi
    shl ebx,16 ;16 bit fix
    mov ecx,ebx ;lade x-rechts

    mov edx,ebp ;links
    sub edx,8
    and edx,31
    mov l,edx

    mov edi,polyp[edx+4]
    mov llyto,edi
    sub edi,esi
    inc edi
    mov eax,polyp[edx]
    shl eax,16
    sub eax,ebx
    cdq
    idiv edi
    mov llicx,eax

    mov edx,ebp ;rechts
    add edx,8
    and edx,31
    mov r,edx

    mov edi,polyp[edx+4]
    mov rlyto,edi
    sub edi,esi
    inc edi
    mov eax,polyp[edx]
    shl eax,16
    sub eax,ecx
    cdq
    idiv edi

    mov edx,eax ;lade x-rechts-increment
    mov eax,llicx ;lade x-links-increment
    mov ebp,lplx ;lade höhe des polygons
    mov edi,p_deltax ;berechne offset-increment
    shl edi,2
    mov offsetinc,edi
    mov edi,esi ;berechne offset ohne x-anteil
    imul edi,p_deltax
    shl edi,2
    add edi,puffer

    @@fp_loop:
    push eax
    push ebx
    push ecx
    push edi

    sar ebx,16
    sar ecx,16

    cmp esi,p_miny
    jl @@fp_lende
    cmp ebx,ecx
    jge @@fp_lende
    cmp ebx,p_maxx
    jg @@fp_lende
    cmp ecx,p_minx
    jl @@fp_lende

    cmp ebx,p_minx
    jge @@fp_kxk
    mov ebx,p_minx
    @@fp_kxk:
    cmp ecx,p_maxx
    jle @@fp_kxg
    mov ecx,p_maxx
    @@fp_kxg:

    mov eax,f32 ;lade farbe
    sub ecx,ebx ;berechne deltax
    inc ecx
    shl ebx,2 ;berechne startposition
    add edi,ebx
    rep stosd ;und zeichne linie

    @@fp_lende:
    pop edi
    pop ecx
    pop ebx
    pop eax

    cmp llyto,esi
    jg @@fp_61

    push edi
    push edx

    add ebx,eax ;x-links weiter

    mov edx,l ;berechne nächsten punkt
    sub edx,8
    and edx,31
    mov l,edx

    mov edi,polyp[edx+4]
    mov llyto,edi
    sub edi,esi
    inc edi
    jnz @@fp_nn06
    mov edi,1
    @@fp_nn06:
    mov eax,polyp[edx]
    shl eax,16
    sub eax,ebx
    cdq
    idiv edi

    pop edx
    pop edi

    @@fp_61:
    cmp rlyto,esi
    jg @@fp_62

    push edi
    push eax

    add ecx,edx ;x-rechts weiter

    mov edx,r
    add edx,8
    and edx,31
    mov r,edx

    mov edi,polyp[edx+4] ;berechne nächsten punkt
    mov rlyto,edi
    sub edi,esi
    inc edi
    jnz @@fp_nn07
    mov edi,1
    @@fp_nn07:
    mov eax,polyp[edx]
    inc eax
    shl eax,16
    sub eax,ecx
    cdq
    idiv edi
    mov edx,eax

    pop eax
    pop edi

    @@fp_62:
    add ebx,eax ;x-links weiter
    add ecx,edx ;x-rechts weiter

    add edi,offsetinc ;offset weiter
    inc esi ;y weiter
    dec ebp ;schleife weiter
    jnz @@fp_loop

    @@fp_ende:
    pop ebp
    ret
    fillpoly endp

    public texturpoly
    texturpoly proc near
    push ebp

    mov esi,polyp[4] ;lade ymin und ymax
    mov edi,esi
    mov ebp,0 ;lade xoffset

    mov ecx,polyp[12] ;ermittle ymin und ymax
    cmp edi,ecx
    jge @@sp_000
    mov edi,ecx ;speichere ymax
    jmp @@sp_001
    @@sp_000:
    cmp esi,ecx
    jle @@sp_001
    mov esi,ecx ;speichere ymin
    mov ebp,8 ;speichere xoffset
    @@sp_001:

    mov ecx,polyp[20] ;...
    cmp edi,ecx
    jge @@sp_010
    mov edi,ecx
    jmp @@sp_011
    @@sp_010:
    cmp esi,ecx
    jle @@sp_011
    mov esi,ecx
    mov ebp,16
    @@sp_011:

    mov ecx,polyp[28] ;...
    cmp edi,ecx
    jge @@sp_020
    mov edi,ecx
    jmp @@sp_021
    @@sp_020:
    cmp esi,ecx
    jle @@sp_021
    mov esi,ecx
    mov ebp,24
    @@sp_021:

    cmp edi,p_maxy ;wenn ymax>p_ymax ---> clipping
    jle @@sp_nclymax
    mov edi,p_maxy
    @@sp_nclymax:
    sub edi,esi ;berechne höhe des polygons
    inc edi
    mov lplx,edi

    mov ebx,polyp[ebp] ;lade x-links -> y in esi
    shl ebx,16 ;16 bit fix
    mov ecx,ebx ;lade x-rechts

    mov edi,ebp ;lade rgb-links und rgb-rechts
    shl edi,1
    mov eax,polyf[edi]
    shl eax,16
    mov llfwr,eax
    mov rlfwr,eax
    mov eax,polyf[edi+4]
    shl eax,16
    mov llfwg,eax
    mov rlfwg,eax
    mov eax,polyf[edi+8]
    shl eax,16
    mov llfwb,eax
    mov rlfwb,eax

    mov edi,ebp ;lade z-links und z-rechts
    shr edi,1
    mov eax,polyz[edi]
    mov llkoz,eax
    mov rlkoz,eax

    mov edi,ebp ;lade tx/ty-links und tx/ty-rechts
    mov eax,polyt[edi]
    shl eax,16
    mov lltex,eax
    mov rltex,eax

    mov eax,polyt[edi+4]
    shl eax,16
    mov lltey,eax
    mov rltey,eax

    mov edx,ebp ;links
    sub edx,8
    and edx,31
    mov l,edx

    mov edi,polyp[edx+4]
    mov llyto,edi
    sub edi,esi
    inc edi
    mov eax,polyp[edx]
    shl eax,16
    sub eax,ebx
    cdq
    idiv edi
    mov llicx,eax

    mov edx,l
    shl edx,1
    mov eax,polyf[edx]
    shl eax,16
    sub eax,llfwr
    cdq
    idiv edi
    mov llicr,eax

    mov edx,l
    shl edx,1
    mov eax,polyf[edx+4]
    shl eax,16
    sub eax,llfwg
    cdq
    idiv edi
    mov llicg,eax

    mov edx,l
    shl edx,1
    mov eax,polyf[edx+8]
    shl eax,16
    sub eax,llfwb
    cdq
    idiv edi
    mov llicb,eax

    mov edx,l
    shr edx,1
    mov eax,polyz[edx]
    sub eax,llkoz
    cdq
    idiv edi
    mov llicz,eax

    mov edx,l
    mov eax,polyt[edx]
    shl eax,16
    sub eax,lltex
    cdq
    idiv edi
    mov llitx,eax

    mov edx,l
    mov eax,polyt[edx+4]
    shl eax,16
    sub eax,lltey
    cdq
    idiv edi
    mov llity,eax

    mov edx,ebp ;rechts
    add edx,8
    and edx,31
    mov r,edx

    mov edi,polyp[edx+4]
    mov rlyto,edi
    sub edi,esi
    inc edi
    mov eax,polyp[edx]
    shl eax,16
    sub eax,ecx
    cdq
    idiv edi
    mov rlicx,eax

    mov edx,r
    shl edx,1
    mov eax,polyf[edx]
    shl eax,16
    sub eax,rlfwr
    cdq
    idiv edi
    mov rlicr,eax

    mov edx,r
    shl edx,1
    mov eax,polyf[edx+4]
    shl eax,16
    sub eax,rlfwg
    cdq
    idiv edi
    mov rlicg,eax

    mov edx,r
    shl edx,1
    mov eax,polyf[edx+8]
    shl eax,16
    sub eax,rlfwb
    cdq
    idiv edi
    mov rlicb,eax

    mov edx,r
    shr edx,1
    mov eax,polyz[edx]
    sub eax,rlkoz
    cdq
    idiv edi
    mov rlicz,eax

    mov edx,r
    mov eax,polyt[edx]
    shl eax,16
    sub eax,rltex
    cdq
    idiv edi
    mov rlitx,eax

    mov edx,r
    mov eax,polyt[edx+4]
    shl eax,16
    sub eax,rltey
    cdq
    idiv edi
    mov rlity,eax

    mov ebp,lplx ;lade höhe des polygons
    mov edi,p_deltax ;berechne offset-increment
    shl edi,2
    mov offsetinc,edi
    mov edi,esi ;berechne offset ohne x-anteil
    imul edi,p_deltax
    shl edi,2
    add edi,puffer
    mov eax,llicx ;lade x-links-increment
    mov edx,rlicx ;lade x-rechts-increment

    @@sp_loop:
    pushad

    sar ebx,16
    sar ecx,16

    cmp esi,p_miny
    jl @@sp_lende
    cmp ebx,ecx
    jge @@sp_lende
    cmp ebx,p_maxx
    jg @@sp_lende
    cmp ecx,p_minx
    jl @@sp_lende

    mov hldex,ecx ;berechne absolutes deltax
    sub hldex,ebx
    inc hldex

    mov eax,llfwr ;lade farbstartwerte
    mov hlfwr,eax
    mov eax,llfwg
    mov hlfwg,eax
    mov eax,llfwb
    mov hlfwb,eax

    mov eax,llkoz ;lade linken z-wert (anfangswert)
    mov hlkoz,eax

    mov eax,lltex ;lade linken tx/ty-wert (anfangswert)
    mov hltex,eax
    mov eax,lltey
    mov hltey,eax

    mov eax,rlfwr ;berechne rgb-incremente
    sub eax,llfwr
    cdq
    idiv hldex
    mov hlicr,eax

    mov eax,rlfwg ;g
    sub eax,llfwg
    cdq
    idiv hldex
    mov hlicg,eax

    mov eax,rlfwb ;b
    sub eax,llfwb
    cdq
    idiv hldex
    mov hlicb,eax

    mov eax,rlkoz ;berechne z-increment
    sub eax,llkoz
    cdq
    idiv hldex
    mov hlicz,eax

    mov eax,rltex ;berechne tx/ty-increment
    sub eax,lltex
    cdq
    idiv hldex
    mov hlitx,eax

    mov eax,rltey
    sub eax,lltey
    cdq
    idiv hldex
    mov hlity,eax

    cmp ebx,p_minx
    jge @@sp_kxk

    push ebx
    sub ebx,p_minx
    neg ebx
    imul ebx,hlicr
    add hlfwr,ebx
    pop ebx

    push ebx
    sub ebx,p_minx
    neg ebx
    imul ebx,hlicg
    add hlfwg,ebx
    pop ebx

    push ebx
    sub ebx,p_minx
    neg ebx
    imul ebx,hlicb
    add hlfwb,ebx
    pop ebx

    push ebx
    sub ebx,p_minx
    neg ebx
    imul ebx,hlicz
    add hlkoz,ebx
    pop ebx

    push ebx
    sub ebx,p_minx
    neg ebx
    imul ebx,hlitx
    add hltex,ebx
    pop ebx

    push ebx
    sub ebx,p_minx
    neg ebx
    imul ebx,hlity
    add hltey,ebx
    pop ebx

    mov ebx,p_minx
    @@sp_kxk:

    cmp ecx,p_maxx
    jle @@sp_kxg
    mov ecx,p_maxx
    @@sp_kxg:

    sub ecx,ebx ;berechne deltax
    inc ecx
    shl ebx,2 ;berechne startposition
    add edi,ebx

    mov esi,hlfwr
    mov ebp,hlfwg
    mov edx,hlfwb

    @@sp_lplp:
    mov ebx,edi
    sub ebx,puffer
    add ebx,zpuffer

    mov eax,hlkoz
    cmp eax,dword ptr [ebx]
    jge @@sp_lplpweiter

    push ecx
    mov dword ptr [ebx],eax ;schreibe neuen z-wert

    mov ebx,hltey
    shr ebx,16
    cmp ebx,127
    jle @@sp_kkk1
    mov ebx,127
    @@sp_kkk1:
    cmp ebx,0
    jge @@sp_kkk2
    mov ebx,0
    @@sp_kkk2:
    mov eax,hltex
    shr eax,16
    cmp eax,127
    jle @@sp_kkk3
    mov eax,127
    @@sp_kkk3:
    cmp eax,0
    jge @@sp_kkk4
    mov eax,0
    @@sp_kkk4:

    shl ebx,7
    add ebx,eax
    shl ebx,2
    add ebx,texture

    mov ecx,dword ptr [ebx]

    mov eax,0
    mov al,cl
    mov ebx,edx
    shr ebx,16
    imul eax,ebx
    shr eax,8
    mov cl,al

    mov eax,0
    mov al,ch
    mov ebx,ebp
    shr ebx,16
    imul eax,ebx
    shr eax,8
    mov ch,al

    rol ecx,16
    mov eax,0
    mov al,cl
    mov ebx,esi
    shr ebx,16
    imul eax,ebx
    shr eax,8
    mov cl,al
    rol ecx,16

    mov dword ptr [edi],ecx
    pop ecx

    @@sp_lplpweiter:
    add esi,hlicr
    add ebp,hlicg
    add edx,hlicb

    mov eax,hlicz
    add hlkoz,eax

    mov eax,hlitx
    add hltex,eax
    mov eax,hlity
    add hltey,eax

    add edi,4
    dec ecx
    jnz @@sp_lplp

    @@sp_lende:
    popad

    cmp llyto,esi
    jg @@sp_61

    push edi
    push edx

    push eax
    mov eax,llicr ;rgb-links weiter
    add llfwr,eax
    mov eax,llicg
    add llfwg,eax
    mov eax,llicb
    add llfwb,eax

    mov eax,llicz ;z-links weiter
    add llkoz,eax

    mov eax,llitx ;tx/ty-links weiter
    add lltex,eax
    mov eax,llity
    add lltey,eax
    pop eax

    add ebx,eax ;x-links weiter

    mov edx,l ;berechne nächsten punkt
    sub edx,8
    and edx,31
    mov l,edx

    mov edi,polyp[edx+4]
    mov llyto,edi
    sub edi,esi
    inc edi
    jnz @@sp_nn06
    mov edi,1
    @@sp_nn06:
    mov eax,polyp[edx]
    shl eax,16
    sub eax,ebx
    cdq
    idiv edi
    mov llicx,eax

    mov edx,l
    shl edx,1
    mov eax,polyf[edx]
    shl eax,16
    sub eax,llfwr
    cdq
    idiv edi
    mov llicr,eax

    mov edx,l
    shl edx,1
    mov eax,polyf[edx+4]
    shl eax,16
    sub eax,llfwg
    cdq
    idiv edi
    mov llicg,eax

    mov edx,l
    shl edx,1
    mov eax,polyf[edx+8]
    shl eax,16
    sub eax,llfwb
    cdq
    idiv edi
    mov llicb,eax

    mov edx,l
    shr edx,1
    mov eax,polyz[edx]
    sub eax,llkoz
    cdq
    idiv edi
    mov llicz,eax

    mov edx,l
    mov eax,polyt[edx]
    shl eax,16
    sub eax,lltex
    cdq
    idiv edi
    mov llitx,eax

    mov edx,l
    mov eax,polyt[edx+4]
    shl eax,16
    sub eax,lltey
    cdq
    idiv edi
    mov llity,eax

    mov eax,llicx

    pop edx
    pop edi

    @@sp_61:
    cmp rlyto,esi
    jg @@sp_62

    push edi
    push eax

    push edx
    mov edx,rlicr ;rgb-rechts weiter
    add rlfwr,edx
    mov edx,rlicg
    add rlfwg,edx
    mov edx,rlicb
    add rlfwb,edx

    mov edx,rlicz ;z-rechts weiter
    add rlkoz,edx

    mov edx,rlitx ;tx/ty-rechts weiter
    add rltex,edx
    mov edx,rlity
    add rltey,edx
    pop edx

    add ecx,edx ;x-rechts weiter

    mov edx,r
    add edx,8
    and edx,31
    mov r,edx

    mov edi,polyp[edx+4] ;berechne nächsten punkt
    mov rlyto,edi
    sub edi,esi
    inc edi
    jnz @@sp_nn07
    mov edi,1
    @@sp_nn07:
    mov eax,polyp[edx]
    inc eax
    shl eax,16
    sub eax,ecx
    cdq
    idiv edi
    mov rlicx,eax

    mov edx,r
    shl edx,1
    mov eax,polyf[edx]
    shl eax,16
    sub eax,rlfwr
    cdq
    idiv edi
    mov rlicr,eax

    mov edx,r
    shl edx,1
    mov eax,polyf[edx+4]
    shl eax,16
    sub eax,rlfwg
    cdq
    idiv edi
    mov rlicg,eax

    mov edx,r
    shl edx,1
    mov eax,polyf[edx+8]
    shl eax,16
    sub eax,rlfwb
    cdq
    idiv edi
    mov rlicb,eax

    mov edx,r
    shr edx,1
    mov eax,polyz[edx]
    sub eax,rlkoz
    cdq
    idiv edi
    mov rlicz,eax

    mov edx,r
    mov eax,polyt[edx]
    shl eax,16
    sub eax,rltex
    cdq
    idiv edi
    mov rlitx,eax

    mov edx,r
    mov eax,polyt[edx+4]
    shl eax,16
    sub eax,rltey
    cdq
    idiv edi
    mov rlity,eax

    mov edx,rlicx

    pop eax
    pop edi

    @@sp_62:
    push eax
    mov eax,llicr ;rgb-links weiter
    add llfwr,eax
    mov eax,llicg
    add llfwg,eax
    mov eax,llicb
    add llfwb,eax

    mov eax,rlicr ;rgb-rechts weiter
    add rlfwr,eax
    mov eax,rlicg
    add rlfwg,eax
    mov eax,rlicb
    add rlfwb,eax

    mov eax,llicz ;z-links weiter
    add llkoz,eax
    mov eax,rlicz ;z-rechts weiter
    add rlkoz,eax

    mov eax,llitx ;tx/ty-links weiter
    add lltex,eax
    mov eax,llity
    add lltey,eax

    mov eax,rlitx ;tx/ty-rechts weiter
    add rltex,eax
    mov eax,rlity
    add rltey,eax

    pop eax

    add ebx,eax ;x-links weiter
    add ecx,edx ;x-rechts weiter

    add edi,offsetinc ;offset weiter
    inc esi ;y weiter
    dec ebp ;schleife weiter
    jnz @@sp_loop

    @@sp_ende:
    pop ebp
    ret
    texturpoly endp

    end

    Und wo ist Dein Problem?? Der Kot tut'et doch!! 😕



  • Original erstellt von Sgt. Nukem:
    Und wo ist Dein Problem?? Der Kot tut'et doch!! 😕

    War der full-quote notwendig?! 😡



  • Original erstellt von <Schidd>:
    **```
    .data

    puffer dd 0
    p_deltax dd 0
    p_deltay dd 0
    p_minx dd 0
    p_miny dd 0
    p_maxx dd 0
    p_maxy dd 0
    p_mittex dd 0
    p_mittey dd 0

    extrn p3d :dword
    extrn p3d_o :dword
    extrn poly :dword
    extrn mittel :dword
    extrn zclip :dword
    extrn lq :dword

    extrn polyp :dword
    extrn polyf :dword
    extrn polyz :dword
    extrn polyt :dword

    extrn zpuffer :dword

    extrn sincost :dword
    extrn matrix :dword
    extrn hmatrix :dword

    extrn perspektive :dword
    extrn max_punkte :dword
    extrn max_polys :dword
    extrn max_lq :dword
    extrn max_sr :dword

    extrn tx :dword
    extrn ty :dword
    extrn tz :dword
    extrn rx :dword
    extrn ry :dword
    extrn rz :dword
    extrn sx :dword
    extrn sy :dword
    extrn sz :dword

    extrn texture1 :dword
    extrn texture2 :dword
    extrn texture3 :dword
    extrn texture4 :dword

    texture dd 0

    puffermax dd 0
    pufferm1 dd 0
    puffercpx dd 0
    puffercpr dd 0
    offsetinc dd 0

    lplx dd 0
    livar dq 0

    rgxmin dd 0
    rgymin dd 0
    rgzmin dd 0
    rgxmax dd 0
    rgymax dd 0
    rgzmax dd 0
    f32 dd 0

    l dd 0
    r dd 0

    llyto dd 0
    llicx dd 0
    llkoz dd 0
    llicz dd 0
    llfwr dd 0
    llfwg dd 0
    llfwb dd 0
    llicr dd 0
    llicg dd 0
    llicb dd 0
    lltex dd 0
    lltey dd 0
    llitx dd 0
    llity dd 0

    rlyto dd 0
    rlicx dd 0
    rlkoz dd 0
    rlicz dd 0
    rlfwr dd 0
    rlfwg dd 0
    rlfwb dd 0
    rlicr dd 0
    rlicg dd 0
    rlicb dd 0
    rltex dd 0
    rltey dd 0
    rlitx dd 0
    rlity dd 0

    hldex dd 0
    hlkoz dd 0
    hlicz dd 0
    hlfwr dd 0
    hlfwg dd 0
    hlfwb dd 0
    hlicr dd 0
    hlicg dd 0
    hlicb dd 0
    hltex dd 0
    hltey dd 0
    hlitx dd 0
    hlity dd 0

    zcsichtbar dd 0
    zcnsichtbar dd 0
    zcsichta dd 4 dup (0)
    zcnsichta dd 4 dup (0)
    zcs1_ dd 3 dup (0)
    zcs2_ dd 3 dup (0)
    zca_ dd 3 dup (0)
    zcb_ dd 3 dup (0)
    zcc_ dd 3 dup (0)
    zcd_ dd 3 dup (0)
    zcfaktor1_ dd 0
    zcfaktor2_ dd 0

    .code

    public init_3dpuffer
    init_3dpuffer proc near
    push ebp
    mov ebp,esp

    mov eax,[ebp+8] ;p_zeiger
    mov ebx,[ebp+12] ;p_breite
    mov ecx,[ebp+16] ;p_höhe

    mov puffer,eax
    mov p_deltax,ebx
    mov p_deltay,ecx
    mov p_minx,0
    mov p_miny,0
    mov p_maxx,ebx
    dec p_maxx
    mov p_maxy,ecx
    dec p_maxy
    mov p_mittex,ebx
    shr p_mittex,1
    mov p_mittey,ecx
    shr p_mittey,1

    mov esp,ebp
    pop ebp
    ret
    init_3dpuffer endp

    public berechne_matrix
    berechne_matrix proc near
    push ebp

    mov edi,rx
    shl edi,2
    add edi,offset sincost
    mov esi,ry
    shl esi,2
    add esi,offset sincost
    mov ebx,rz
    shl ebx,2
    add ebx,offset sincost

    mov ecx,[edi+16384] ;lade c1 ( cos(a) )

    mov eax,[esi]
    neg eax
    imul ecx
    shrd eax,edx,16
    mov dword ptr matrix[24],eax ;x3

    mov eax,[esi+16384]
    imul ecx
    shrd eax,edx,16
    mov dword ptr matrix[32],eax ;z3

    mov eax,[ebx+16384]
    imul ecx
    shrd eax,edx,16
    mov dword ptr matrix[16],eax ;y2

    mov eax,[ebx]
    neg eax
    imul ecx
    shrd eax,edx,16
    mov dword ptr matrix[4],eax ;y1

    ;---------------------hmatrix berechnung---------------

    mov eax,[esi+16384]
    mov ecx,[ebx+16384]
    imul ecx
    shrd eax,edx,16
    mov dword ptr hmatrix[0],eax ;(1.)

    mov eax,[esi]
    imul ecx
    shrd eax,edx,16
    mov dword ptr hmatrix[4],eax ;(2.)

    mov eax,[esi+16384]
    mov ecx,[ebx]
    imul ecx
    shrd eax,edx,16
    mov dword ptr hmatrix[8],eax ;(3.)

    mov eax,[esi]
    imul ecx
    shrd eax,edx,16
    mov dword ptr hmatrix[12],eax ;(4.)

    ;-----------ende-------------------------------------

    mov ecx,[edi] ;lade s1 ( sin(a) )
    mov dword ptr matrix[28],ecx ;y3

    mov eax,dword ptr hmatrix[12]
    imul ecx
    shrd eax,edx,16
    mov ebp,eax
    mov eax,dword ptr hmatrix[0]
    sub eax,ebp
    mov dword ptr matrix[0],eax ;x1

    mov eax,dword ptr hmatrix[4]
    imul ecx
    shrd eax,edx,16
    mov ebp,eax
    mov eax,dword ptr hmatrix[8]
    add eax,ebp
    mov dword ptr matrix[12],eax ;x2

    mov eax,dword ptr hmatrix[8]
    imul ecx
    shrd eax,edx,16
    mov ebp,eax
    mov eax,dword ptr hmatrix[4]
    add eax,ebp
    mov dword ptr matrix[8],eax ;z1

    mov eax,dword ptr hmatrix[0]
    imul ecx
    shrd eax,edx,16
    mov ebp,eax
    mov eax,dword ptr hmatrix[12]
    sub eax,ebp
    mov dword ptr matrix[20],eax ;z2

    pop ebp
    ret
    berechne_matrix endp

    public ermittle_p
    ermittle_p proc near
    push ebp

    mov ebp,max_punkte
    mov lplx,ebp
    mov edi,p3d
    mov ebp,edi
    sub ebp,64
    mov esi,p3d_o

    mov ecx,max_sr

    mov edx,tx
    sub edx,ecx
    mov rgxmin,edx
    mov edx,tx
    add edx,ecx
    mov rgxmax,edx

    mov edx,ty
    sub edx,ecx
    mov rgymin,edx
    mov edx,ty
    add edx,ecx
    mov rgymax,edx

    mov edx,tz
    sub edx,ecx
    mov rgzmin,edx
    mov edx,tz
    add edx,ecx
    mov rgzmax,edx

    @@ep_mlp:
    mov eax,[esi] ;x
    cmp eax,rgxmax
    jg @@ep_nsb
    cmp eax,rgxmin
    jl @@ep_nsb

    mov eax,[esi+4] ;y
    cmp eax,rgymax
    jg @@ep_nsb
    cmp eax,rgymin
    jl @@ep_nsb

    mov eax,[esi+8] ;z
    cmp eax,rgzmax
    jg @@ep_nsb
    cmp eax,rgzmin
    jl @@ep_nsb

    mov eax,[esi] ;punkt ist sichtbar
    mov [edi],eax
    mov eax,[esi+4]
    mov [edi+4],eax
    mov eax,[esi+8]
    mov [edi+8],eax

    mov dword ptr [edi+16],0 ;helligkeit des punktes
    mov dword ptr [edi+20],0 ;st=0 -> sichtbar
    mov [ebp+60],edi ;initialisiere nachfolger
    mov ebp,edi ;speichere neuen vorgänger

    add edi,64
    add esi,64
    dec lplx
    jnz @@ep_mlp
    jmp @@ep_ende

    @@ep_nsb:
    mov dword ptr [edi+20],1 ;punkt nicht sichtbar -> st=1
    add edi,64
    add esi,64
    dec lplx
    jnz @@ep_mlp

    @@ep_ende:
    mov eax,p3d
    sub eax,64
    cmp ebp,eax
    jne @@ep_aok
    mov [ebp+60],edi
    mov ebp,edi
    @@ep_aok:
    mov dword ptr [ebp+60],0

    pop ebp
    ret
    ermittle_p endp

    public transliere_v
    transliere_v proc near
    push ebp

    mov edi,p3d
    mov edi,[edi-4]
    or edi,edi
    jz @@tv_ende

    mov ebx,tx
    mov ecx,ty
    mov edx,tz

    @@tv_mlp:
    mov eax,[edi] ;punkt ist sichtbar
    sub eax,ebx
    mov [edi],eax
    mov eax,[edi+4]
    sub eax,ecx
    mov [edi+4],eax
    mov eax,[edi+8]
    sub eax,edx
    mov [edi+8],eax

    mov edi,[edi+60]
    or edi,edi
    jnz @@tv_mlp

    @@tv_ende:
    pop ebp
    ret
    transliere_v endp

    public rotiere_v
    rotiere_v proc near
    push ebp

    mov edi,p3d
    mov edi,[edi-4]
    or edi,edi
    jz @@rv_ende

    @@tm_lp1:
    mov eax,[edi+8] ;z-koordinate
    imul dword ptr matrix[32]
    shrd eax,edx,16
    mov ebx,eax

    mov eax,[edi+4]
    imul dword ptr matrix[28]
    shrd eax,edx,16
    add ebx,eax

    mov eax,[edi]
    imul dword ptr matrix[24]
    shrd eax,edx,16
    add ebx,eax

    cmp ebx,perspektive ;vergleiche z
    jg @@tm_weiter
    mov dword ptr [edi+20],2 ;eventuell punkt für zclip -> st=2
    @@tm_weiter:

    mov eax,[edi+8] ;y-koordinate
    imul dword ptr matrix[20]
    shrd eax,edx,16
    mov ecx,eax

    mov eax,[edi+4]
    imul dword ptr matrix[16]
    shrd eax,edx,16
    add ecx,eax

    mov eax,[edi]
    imul dword ptr matrix[12]
    shrd eax,edx,16
    add ecx,eax

    mov eax,[edi+8] ;x-koordinate
    mov [edi+8],ebx
    imul dword ptr matrix[8]
    shrd eax,edx,16
    mov ebx,eax

    mov eax,[edi+4]
    mov [edi+4],ecx
    imul dword ptr matrix[4]
    shrd eax,edx,16
    add ebx,eax

    mov eax,[edi]
    imul dword ptr matrix[0]
    shrd eax,edx,16
    add ebx,eax
    mov [edi],ebx

    @@tm_ende:
    mov edi,[edi+60]
    or edi,edi
    jnz @@tm_lp1

    @@rv_ende:
    pop ebp
    ret
    rotiere_v endp

    public berechne_2d
    berechne_2d proc near
    push ebp

    mov edi,p3d
    mov edi,[edi-4]
    or edi,edi
    jz @@b2d_ende

    mov ebx,p_mittex
    mov ecx,p_mittey
    mov esi,perspektive
    mov ebp,esi
    neg ebp

    @@b2d_lp:
    cmp dword ptr [edi+20],0
    jne @@b2d_weiter

    mov eax,esi ;perspektive
    imul dword ptr [edi] ;*x
    idiv dword ptr [edi+8] ;/z
    add eax,ebx ;+p_xmitte
    mov [edi+24],eax ;speichere x2d

    mov eax,ebp ;perspektive*(-1)
    imul dword ptr [edi+4] ;*y
    idiv dword ptr [edi+8] ;/z
    add eax,ecx ;+p_ymitte
    mov [edi+28],eax ;speichere y2d

    @@b2d_weiter:
    mov edi,[edi+60]
    or edi,edi
    jnz @@b2d_lp

    @@b2d_ende:
    pop ebp
    ret
    berechne_2d endp

    public entferne_punkte_1
    entferne_punkte_1 proc near
    push ebp

    mov edi,p3d ;markiere alle punkte aller sichtbaren polygone als sichtbar
    mov edi,[edi-4]
    or edi,edi
    jz @@ep1_ende

    @@ep1_mlp1:
    mov dword ptr [edi+20],1 ;lösche st-attribut alle punkte (st=1)
    mov edi,[edi+60]
    or edi,edi
    jnz @@ep1_mlp1

    ;;;;lichtquellen müssen sichtbar gemacht werden!!!!

    mov ebx,poly
    mov ebx,[ebx-4]
    or ebx,ebx
    jz @@ep1_ende

    mov esi,p3d
    add esi,20

    @@ep1_mlp2:
    cmp dword ptr [ebx+28],0
    jne @@ep1_weiter

    mov ebp,[ebx]
    shl ebp,6
    mov dword ptr [esi+ebp],0

    mov ebp,[ebx+4]
    shl ebp,6
    mov dword ptr [esi+ebp],0

    mov ebp,[ebx+8]
    shl ebp,6
    mov dword ptr [esi+ebp],0

    mov ebp,[ebx+12]
    shl ebp,6
    mov dword ptr [esi+ebp],0

    @@ep1_weiter:
    mov ebx,[ebx+60]
    or ebx,ebx
    jnz @@ep1_mlp2

    mov edi,p3d
    mov ebp,edi
    sub ebp,64
    mov edi,[edi-4]
    or edi,edi
    jz @@ep1_ende

    @@ep1_mlp3:
    cmp dword ptr [edi+20],0
    je @@ep1_ok

    mov eax,[edi+60]
    mov [ebp+60],eax

    @@ep1_ok:
    mov ebp,edi
    mov edi,[edi+60]
    or edi,edi
    jnz @@ep1_mlp3

    @@ep1_ende:
    pop ebp
    ret
    entferne_punkte_1 endp

    public entferne_polygone_1
    entferne_polygone_1 proc near
    push ebp

    mov ecx,max_polys

    mov esi,poly
    mov ebx,esi
    sub ebx,64

    mov ebp,p3d
    add ebp,20

    @@epo1_lp:
    mov edi,[esi] ;entferne_poly1...
    shl edi,6 ;dieser abschnitt entfernt alle polys mit mindestens
    cmp dword ptr [edi+ebp],1 ;einem punkt ausserhalb des 1.raumes
    je @@epo1_nsb2 ;1. punkt nicht sichtbar

    mov edi,[esi+4]
    shl edi,6
    cmp dword ptr [edi+ebp],1
    je @@epo1_nsb2 ;2. punkt nicht sichtbar

    mov edi,[esi+8]
    shl edi,6
    cmp dword ptr [edi+ebp],1
    je @@epo1_nsb2 ;3. punkt nicht sichtbar

    mov edi,[esi+12]
    shl edi,6
    cmp dword ptr [edi+ebp],1
    je @@epo1_nsb2 ;4. punkt nicht sichtbar ...entferne_poly1
    ;wenn poly sichtbar -> entf_poly2

    mov edi,[esi] ;entferne_poly2...
    shl edi,6 ;fallunterscheidung ob 1.punkt sichtbar oder nicht
    cmp dword ptr [ebp+edi],0
    jz @@epo1_sichtbar

    mov edi,[esi+4] ;1. punkt ist nicht sichtbar
    shl edi,6 ;suche nun so lange bis ein sichtbarer
    cmp dword ptr [ebp+edi],0 ;punkt gefunden ist ... dann zclippoly
    jz @@epo1_sb ;ansonsten poly nicht sichtbar

    mov edi,[esi+8] ; -> 2. 3. 4. punkt
    shl edi,6
    cmp dword ptr [ebp+edi],0
    jz @@epo1_sb

    mov edi,[esi+12]
    shl edi,6
    cmp dword ptr [ebp+edi],0
    jz @@epo1_sb
    mov dword ptr [esi+28],1 ;poly entfällt da nicht sichtbar -> st=1
    jmp @@epo1_weiter
    @@epo1_sb:
    mov dword ptr [esi+28],2 ;zclippoly -> st=2
    mov [ebx+60],esi ;initialisiere nachfolger
    mov ebx,esi ;speichere neuen vörgänger
    jmp @@epo1_weiter

    @@epo1_sichtbar: ;1. punkt ist sichtbar...
    mov edi,[esi+4] ;suche nun bis ein punkt nicht sichtbar ist
    shl edi,6 ;dann zlippoly ansonsten poly sichtbar
    cmp dword ptr [ebp+edi],0 ; -> 2.-4. punkt
    jnz @@epo1_nsb

    mov edi,[esi+8]
    shl edi,6
    cmp dword ptr [ebp+edi],0
    jnz @@epo1_nsb

    mov edi,[esi+12]
    shl edi,6
    cmp dword ptr [ebp+edi],0
    jnz @@epo1_nsb

    mov dword ptr [esi+28],0 ;poly ist sichtbar -> st=0
    mov [ebx+60],esi ;initialisiere nachfolger
    mov ebx,esi ;speichere neuen vörgänger
    jmp @@epo1_weiter ;...entferne_poly
    @@epo1_nsb:
    mov dword ptr [esi+28],2 ;zclippoly -> st=2
    mov [ebx+60],esi ;initialisiere nachfolger
    mov ebx,esi ;speichere neuen vörgänger
    jmp @@epo1_weiter ;...entferne_poly2

    @@epo1_nsb2:
    mov dword ptr [esi+28],1 ;nicht sichtbar -> st=1

    @@epo1_weiter:
    add esi,64
    dec ecx
    jnz @@epo1_lp

    mov eax,poly
    sub eax,64
    cmp ebx,eax
    jne @@epo1_aok
    mov [ebx+60],esi
    mov ebx,esi
    @@epo1_aok:
    mov dword ptr [ebx+60],0

    pop ebp
    ret
    entferne_polygone_1 endp

    public entferne_polygone_3
    entferne_polygone_3 proc near
    push ebp

    mov edi,poly
    mov ebx,edi
    sub ebx,64
    mov edi,[edi-4]
    or edi,edi
    jz @@epo3_schluss

    mov ebp,p3d
    add ebp,24

    @@epo3_lp:
    cmp dword ptr [edi+28],0
    jne @@epo3_ende

    mov esi,[edi]
    shl esi,6
    cmp dword ptr [esi+ebp],0
    jnl @@epo3_w1

    mov esi,[edi+4]
    shl esi,6
    cmp dword ptr [esi+ebp],0
    jnl @@epo3_w1

    mov esi,[edi+8]
    shl esi,6
    cmp dword ptr [esi+ebp],0
    jnl @@epo3_w1

    mov esi,[edi+12]
    shl esi,6
    cmp dword ptr [esi+ebp],0
    jnl @@epo3_w1

    mov dword ptr [edi+28],1
    mov eax,[edi+60]
    mov [ebx+60],eax
    jmp @@epo3_ende

    @@epo3_w1:
    mov esi,[edi]
    shl esi,6
    mov eax,[esi+ebp]
    cmp eax,p_deltax
    jnge @@epo3_w2

    mov esi,[edi+4]
    shl esi,6
    mov eax,[esi+ebp]
    cmp eax,p_deltax
    jnge @@epo3_w2

    mov esi,[edi+8]
    shl esi,6
    mov eax,[esi+ebp]
    cmp eax,p_deltax
    jnge @@epo3_w2

    mov esi,[edi+12]
    shl esi,6
    mov eax,[esi+ebp]
    cmp eax,p_deltax
    jnge @@epo3_w2

    mov dword ptr [edi+28],1
    mov eax,[edi+60]
    mov [ebx+60],eax
    jmp @@epo3_ende

    @@epo3_w2:
    mov esi,[edi]
    shl esi,6
    cmp dword ptr [esi+ebp+4],0
    jnl @@epo3_w3

    mov esi,[edi+4]
    shl esi,6
    cmp dword ptr [esi+ebp+4],0
    jnl @@epo3_w3

    mov esi,[edi+8]
    shl esi,6
    cmp dword ptr [esi+ebp+4],0
    jnl @@epo3_w3

    mov esi,[edi+12]
    shl esi,6
    cmp dword ptr [esi+ebp+4],0
    jnl @@epo3_w3

    mov dword ptr [edi+28],1
    mov eax,[edi+60]
    mov [ebx+60],eax
    jmp @@epo3_ende

    @@epo3_w3:
    mov esi,[edi]
    shl esi,6
    mov eax,[esi+ebp+4]
    cmp eax,p_maxy
    jnge @@epo3_w4

    mov esi,[edi+4]
    shl esi,6
    mov eax,[esi+ebp+4]
    cmp eax,p_deltay
    jnge @@epo3_w4

    mov esi,[edi+8]
    shl esi,6
    mov eax,[esi+ebp+4]
    cmp eax,p_deltay
    jnge @@epo3_w4

    mov esi,[edi+12]
    shl esi,6
    mov eax,[esi+ebp+4]
    cmp eax,p_deltay
    jnge @@epo3_w4

    mov dword ptr [edi+28],1
    mov eax,[edi+60]
    mov [ebx+60],eax
    jmp @@epo3_ende

    @@epo3_w4: ;rückseitenentfernung...
    mov esi,[edi+4] ;berechne: (y1-y0)(x2-x0)-(y2-y0)(x1-x0)
    shl esi,6
    mov eax,[esi+ebp+4]
    mov esi,[edi+8]
    shl esi,6
    mov edx,[esi+ebp]
    mov esi,[edi]
    shl esi,6
    sub eax,[esi+ebp+4]
    sub edx,[esi+ebp]
    imul edx
    push eax ;1.operand speichern

    mov esi,[edi+8]
    shl esi,6
    mov eax,[esi+ebp+4]
    mov esi,[edi+4]
    shl esi,6
    mov edx,[esi+ebp]
    mov esi,[edi]
    shl esi,6
    sub eax,[esi+ebp+4]
    sub edx,[esi+ebp]
    imul edx
    pop edx ;1.operand zurückholen
    sub edx,eax

    cmp edx,0 ;wenn edx>=0 -> st=1
    jle @@epo3_ende
    mov dword ptr [edi+28],1
    mov eax,[edi+60]
    mov [ebx+60],eax

    @@epo3_ende:
    mov ebx,edi
    mov edi,[edi+60]
    or edi,edi
    jnz @@epo3_lp

    @@epo3_schluss:
    pop ebp
    ret
    entferne_polygone_3 endp

    public berechne_beleuchtung
    berechne_beleuchtung proc near
    push ebp

    mov esi,p3d
    mov esi,[esi-4]
    or esi,esi
    jz @@bebl_ende

    @@bbl_lp:
    cmp dword ptr [esi+20],0
    jne @@bbl_ende

    push edi

    mov edi,max_lq
    mov eax,lq
    mov r,eax

    @@bbl_lp2:
    mov ebp,r
    mov ebx,[ebp]
    shl ebx,6
    add ebx,p3d
    ;; cmp dword ptr [ebx+20],1
    ;; je @@bbl_weiter

    mov edx,[esi]
    mov eax,[ebx]
    sub eax,[ebp+4]
    cmp edx,eax
    jl @@bbl_weiter
    mov eax,[ebx]
    add eax,[ebp+4]
    cmp edx,eax
    jg @@bbl_weiter

    mov edx,[esi+4]
    mov eax,[ebx+4]
    sub eax,[ebp+4]
    cmp edx,eax
    jl @@bbl_weiter
    mov eax,[ebx+4]
    add eax,[ebp+4]
    cmp edx,eax
    jg @@bbl_weiter

    mov edx,[esi+8]
    mov eax,[ebx+8]
    sub eax,[ebp+4]
    cmp edx,eax
    jl @@bbl_weiter
    mov eax,[ebx+8]
    add eax,[ebp+4]
    cmp edx,eax
    jg @@bbl_weiter

    mov eax,[ebx]
    sub eax,[esi]
    imul eax
    mov ebp,eax
    mov ecx,edx

    mov eax,[ebx+4]
    sub eax,[esi+4]
    imul eax
    add ebp,eax
    adc ecx,edx

    mov eax,[ebx+8]
    sub eax,[esi+8]
    imul eax
    add ebp,eax
    adc ecx,edx

    mov dword ptr livar,ebp
    mov dword ptr livar+4,ecx
    fild livar
    fsqrt
    fistp livar

    mov ebp,r
    mov eax,dword ptr [ebp+4]
    sub eax,dword ptr livar
    jl @@bbl_weiter ;wenn betrag(pu) > maxradius(lq) -> @@weiter

    mul dword ptr [ebp+8] ;berechne die beleuchtung
    div dword ptr [ebp+4] ;eines punktes

    mov ebp,[esi+16]
    add ebp,eax
    cmp ebp,255
    jle @@bbl_kv
    mov ebp,255
    @@bbl_kv:
    mov [esi+16],ebp

    @@bbl_weiter:
    add r,16
    dec edi
    jnz @@bbl_lp2

    pop edi

    @@bbl_ende:
    mov esi,[esi+60]
    or esi,esi
    jnz @@bbl_lp

    @@bebl_ende:
    pop ebp
    ret
    berechne_beleuchtung endp

    public zclipping
    zclipping proc near
    push ebp

    mov esi,max_polys
    mov lplx,esi

    mov ecx,zclip
    mov esi,poly
    mov ebp,p3d
    add ebp,20

    @@zc_lp:
    mov eax,[esi+28]
    cmp eax,1 ;polygon ist nicht sichtbar
    je @@zc_s04

    cmp eax,2
    je @@zc_zclippoly

    mov dword ptr [ecx],0 ;polygon ist voll sichtbar -> kein zclip
    jmp @@zc_s04
    @@zc_zclippoly:

    mov dword ptr zcsichtbar,0
    mov dword ptr zcnsichtbar,0

    mov edi,[esi]
    shl edi,6
    mov eax,[ebp+edi]
    cmp eax,2
    jne @@zc_1s

    mov edi,zcnsichtbar
    shl edi,2
    mov dword ptr zcnsichta+edi,0
    inc zcnsichtbar
    jmp @@zc_1w
    @@zc_1s:
    mov edi,zcsichtbar
    shl edi,2
    mov dword ptr zcsichta+edi,0
    inc zcsichtbar
    @@zc_1w:

    mov edi,[esi+4]
    shl edi,6
    mov eax,[ebp+edi]
    cmp eax,2
    jne @@zc_2s

    mov edi,zcnsichtbar
    shl edi,2
    mov dword ptr zcnsichta+edi,1
    inc zcnsichtbar
    jmp @@zc_2w
    @@zc_2s:
    mov edi,zcsichtbar
    shl edi,2
    mov dword ptr zcsichta+edi,1
    inc zcsichtbar
    @@zc_2w:

    mov edi,[esi+8]
    shl edi,6
    mov eax,[ebp+edi]
    cmp eax,2
    jne @@zc_3s

    mov edi,zcnsichtbar
    shl edi,2
    mov dword ptr zcnsichta+edi,2
    inc zcnsichtbar
    jmp @@zc_3w
    @@zc_3s:
    mov edi,zcsichtbar
    shl edi,2
    mov dword ptr zcsichta+edi,2
    inc zcsichtbar
    @@zc_3w:

    mov edi,[esi+12]
    shl edi,6
    mov eax,[ebp+edi]
    cmp eax,2
    jne @@zc_4s

    mov edi,zcnsichtbar
    shl edi,2
    mov dword ptr zcnsichta+edi,3
    inc zcnsichtbar
    jmp @@zc_4w
    @@zc_4s:
    mov edi,zcsichtbar
    shl edi,2
    mov dword ptr zcsichta+edi,3
    inc zcsichtbar
    @@zc_4w:

    cmp zcsichtbar,1
    jne @@zc_s01

    mov dword ptr [esi+28],1
    jmp @@zc_s04
    @@zc_s01:

    cmp zcsichtbar,2
    jne @@zc_s02

    mov dword ptr [esi+28],1
    jmp @@zc_s04
    @@zc_s02:

    cmp zcsichtbar,3
    jne @@zc_s04

    mov dword ptr [esi+28],1

    @@zc_s04:
    add ecx,16
    add esi,64
    dec lplx
    jnz @@zc_lp

    pop ebp
    ret
    zclipping endp

    public zeichne_polys
    zeichne_polys proc near
    push ebp

    mov ecx,p_deltax ;lösche zpuffer
    imul ecx,p_deltay
    mov edi,zpuffer ;lade offset
    mov eax,07fffffffh ;lade z (=max)
    rep stosd ;lösche zpuffer

    mov edi,poly
    mov edi,[edi-4]

    @@lp:
    mov esi,[edi+28]
    cmp esi,0
    jne @@zp_weiter

    mov ebp,p3d
    add ebp,24

    mov esi,[edi]
    shl esi,6
    mov eax,[esi+ebp]
    mov dword ptr polyp[0],eax
    mov eax,[esi+ebp+4]
    mov dword ptr polyp[4],eax

    mov esi,[edi+4]
    shl esi,6
    mov eax,[esi+ebp]
    mov dword ptr polyp[8],eax
    mov eax,[esi+ebp+4]
    mov dword ptr polyp[12],eax

    mov esi,[edi+8]
    shl esi,6
    mov eax,[esi+ebp]
    mov dword ptr polyp[16],eax
    mov eax,[esi+ebp+4]
    mov dword ptr polyp[20],eax

    mov esi,[edi+12]
    shl esi,6
    mov eax,[esi+ebp]
    mov dword ptr polyp[24],eax
    mov eax,[esi+ebp+4]
    mov dword ptr polyp[28],eax

    mov esi,[edi+16]
    cmp esi,3
    jne @@zp_kein_shadepoly

    pushad

    mov esi,[edi+20]
    cmp esi,0
    jne @@lll1
    mov eax,texture2
    mov texture,eax
    @@lll1:

    cmp esi,1
    jne @@lll2
    mov eax,texture1
    mov texture,eax
    @@lll2:

    cmp esi,2
    jne @@lll3
    mov eax,texture3
    mov texture,eax
    @@lll3:

    cmp esi,3
    jne @@lll4
    mov eax,texture4
    mov texture,eax
    @@lll4:

    mov esi,[edi] ;lade 1.punkt des poly
    shl esi,6
    add esi,p3d
    mov eax,[esi+16]

    mov dword ptr polyf[0],eax
    mov dword ptr polyf[4],eax
    mov dword ptr polyf[8],eax

    mov eax,[esi+8] ;lade z-wert
    mov dword ptr polyz[0],eax

    mov esi,[edi+4] ;lade 2.punkt des poly
    shl esi,6
    add esi,p3d
    mov eax,[esi+16]

    mov dword ptr polyf[16],eax
    mov dword ptr polyf[20],eax
    mov dword ptr polyf[24],eax

    mov eax,[esi+8] ;lade z-wert
    mov dword ptr polyz[4],eax

    mov esi,[edi+8] ;lade 3.punkt des poly
    shl esi,6
    add esi,p3d
    mov eax,[edi+24]
    mov eax,[esi+16]

    mov dword ptr polyf[32],eax
    mov dword ptr polyf[36],eax
    mov dword ptr polyf[40],eax

    mov eax,[esi+8] ;lade z-wert
    mov dword ptr polyz[8],eax

    mov esi,[edi+12] ;lade 4.punkt des poly
    shl esi,6
    add esi,p3d
    mov eax,[edi+24]
    mov eax,[esi+16]

    mov dword ptr polyf[48],eax
    mov dword ptr polyf[52],eax
    mov dword ptr polyf[56],eax

    mov eax,[esi+8] ;lade z-wert
    mov dword ptr polyz[12],eax

    call texturpoly

    popad
    jmp @@zp_weiter

    @@zp_kein_shadepoly:

    @@zp_weiter:
    mov edi,[edi+60]
    or edi,edi
    jnz @@lp

    @@zp_ende:
    pop ebp
    ret
    zeichne_polys endp

    public fillpoly
    fillpoly proc near
    push ebp

    mov esi,polyp[4] ;lade ymin und ymax
    mov edi,esi
    mov ebp,0 ;lade xoffset

    mov ecx,polyp[12] ;ermittle ymin und ymax
    cmp edi,ecx
    jge @@fp_000
    mov edi,ecx ;speichere ymax
    jmp @@fp_001
    @@fp_000:
    cmp esi,ecx
    jle @@fp_001
    mov esi,ecx ;speichere ymin
    mov ebp,8 ;speichere xoffset
    @@fp_001:

    mov ecx,polyp[20] ;...
    cmp edi,ecx
    jge @@fp_010
    mov edi,ecx
    jmp @@fp_011
    @@fp_010:
    cmp esi,ecx
    jle @@fp_011
    mov esi,ecx
    mov ebp,16
    @@fp_011:

    mov ecx,polyp[28] ;...
    cmp edi,ecx
    jge @@fp_020
    mov edi,ecx
    jmp @@fp_021
    @@fp_020:
    cmp esi,ecx
    jle @@fp_021
    mov esi,ecx
    mov ebp,24
    @@fp_021:

    cmp edi,p_maxy ;wenn ymax>p_ymax ---> clipping
    jle @@fp_nclymax
    mov edi,p_maxy
    @@fp_nclymax:
    sub edi,esi ;berechne höhe des polygons
    inc edi
    mov lplx,edi
    mov ebx,polyp[ebp] ;lade x-links -> y in esi
    shl ebx,16 ;16 bit fix
    mov ecx,ebx ;lade x-rechts

    mov edx,ebp ;links
    sub edx,8
    and edx,31
    mov l,edx

    mov edi,polyp[edx+4]
    mov llyto,edi
    sub edi,esi
    inc edi
    mov eax,polyp[edx]
    shl eax,16
    sub eax,ebx
    cdq
    idiv edi
    mov llicx,eax

    mov edx,ebp ;rechts
    add edx,8
    and edx,31
    mov r,edx

    mov edi,polyp[edx+4]
    mov rlyto,edi
    sub edi,esi
    inc edi
    mov eax,polyp[edx]
    shl eax,16
    sub eax,ecx
    cdq
    idiv edi

    mov edx,eax ;lade x-rechts-increment
    mov eax,llicx ;lade x-links-increment
    mov ebp,lplx ;lade höhe des polygons
    mov edi,p_deltax ;berechne offset-increment
    shl edi,2
    mov offsetinc,edi
    mov edi,esi ;berechne offset ohne x-anteil
    imul edi,p_deltax
    shl edi,2
    add edi,puffer

    @@fp_loop:
    push eax
    push ebx
    push ecx
    push edi

    sar ebx,16
    sar ecx,16

    cmp esi,p_miny
    jl @@fp_lende
    cmp ebx,ecx
    jge @@fp_lende
    cmp ebx,p_maxx
    jg @@fp_lende
    cmp ecx,p_minx
    jl @@fp_lende

    cmp ebx,p_minx
    jge @@fp_kxk
    mov ebx,p_minx
    @@fp_kxk:
    cmp ecx,p_maxx
    jle @@fp_kxg
    mov ecx,p_maxx
    @@fp_kxg:

    mov eax,f32 ;lade farbe
    sub ecx,ebx ;berechne deltax
    inc ecx
    shl ebx,2 ;berechne startposition
    add edi,ebx
    rep stosd ;und zeichne linie

    @@fp_lende:
    pop edi
    pop ecx
    pop ebx
    pop eax

    cmp llyto,esi
    jg @@fp_61

    push edi
    push edx

    add ebx,eax ;x-links weiter

    mov edx,l ;berechne nächsten punkt
    sub edx,8
    and edx,31
    mov l,edx

    mov edi,polyp[edx+4]
    mov llyto,edi
    sub edi,esi
    inc edi
    jnz @@fp_nn06
    mov edi,1
    @@fp_nn06:
    mov eax,polyp[edx]
    shl eax,16
    sub eax,ebx
    cdq
    idiv edi

    pop edx
    pop edi

    @@fp_61:
    cmp rlyto,esi
    jg @@fp_62

    push edi
    push eax

    add ecx,edx ;x-rechts weiter

    mov edx,r
    add edx,8
    and edx,31
    mov r,edx

    mov edi,polyp[edx+4] ;berechne nächsten punkt
    mov rlyto,edi
    sub edi,esi
    inc edi
    jnz @@fp_nn07
    mov edi,1
    @@fp_nn07:
    mov eax,polyp[edx]
    inc eax
    shl eax,16
    sub eax,ecx
    cdq
    idiv edi
    mov edx,eax

    pop eax
    pop edi

    @@fp_62:
    add ebx,eax ;x-links weiter
    add ecx,edx ;x-rechts weiter

    add edi,offsetinc ;offset weiter
    inc esi ;y weiter
    dec ebp ;schleife weiter
    jnz @@fp_loop

    @@fp_ende:
    pop ebp
    ret
    fillpoly endp

    public texturpoly
    texturpoly proc near
    push ebp

    mov esi,polyp[4] ;lade ymin und ymax
    mov edi,esi
    mov ebp,0 ;lade xoffset

    mov ecx,polyp[12] ;ermittle ymin und ymax
    cmp edi,ecx
    jge @@sp_000
    mov edi,ecx ;speichere ymax
    jmp @@sp_001
    @@sp_000:
    cmp esi,ecx
    jle @@sp_001
    mov esi,ecx ;speichere ymin
    mov ebp,8 ;speichere xoffset
    @@sp_001:

    mov ecx,polyp[20] ;...
    cmp edi,ecx
    jge @@sp_010
    mov edi,ecx
    jmp @@sp_011
    @@sp_010:
    cmp esi,ecx
    jle @@sp_011
    mov esi,ecx
    mov ebp,16
    @@sp_011:

    mov ecx,polyp[28] ;...
    cmp edi,ecx
    jge @@sp_020
    mov edi,ecx
    jmp @@sp_021
    @@sp_020:
    cmp esi,ecx
    jle @@sp_021
    mov esi,ecx
    mov ebp,24
    @@sp_021:

    cmp edi,p_maxy ;wenn ymax>p_ymax ---> clipping
    jle @@sp_nclymax
    mov edi,p_maxy
    @@sp_nclymax:
    sub edi,esi ;berechne höhe des polygons
    inc edi
    mov lplx,edi

    mov ebx,polyp[ebp] ;lade x-links -> y in esi
    shl ebx,16 ;16 bit fix
    mov ecx,ebx ;lade x-rechts

    mov edi,ebp ;lade rgb-links und rgb-rechts
    shl edi,1
    mov eax,polyf[edi]
    shl eax,16
    mov llfwr,eax
    mov rlfwr,eax
    mov eax,polyf[edi+4]
    shl eax,16
    mov llfwg,eax
    mov rlfwg,eax
    mov eax,polyf[edi+8]
    shl eax,16
    mov llfwb,eax
    mov rlfwb,eax

    mov edi,ebp ;lade z-links und z-rechts
    shr edi,1
    mov eax,polyz[edi]
    mov llkoz,eax
    mov rlkoz,eax

    mov edi,ebp ;lade tx/ty-links und tx/ty-rechts
    mov eax,polyt[edi]
    shl eax,16
    mov lltex,eax
    mov rltex,eax

    mov eax,polyt[edi+4]
    shl eax,16
    mov lltey,eax
    mov rltey,eax

    mov edx,ebp ;links
    sub edx,8
    and edx,31
    mov l,edx

    mov edi,polyp[edx+4]
    mov llyto,edi
    sub edi,esi
    inc edi
    mov eax,polyp[edx]
    shl eax,16
    sub eax,ebx
    cdq
    idiv edi
    mov llicx,eax

    mov edx,l
    shl edx,1
    mov eax,polyf[edx]
    shl eax,16
    sub eax,llfwr
    cdq
    idiv edi
    mov llicr,eax

    mov edx,l
    shl edx,1
    mov eax,polyf[edx+4]
    shl eax,16
    sub eax,llfwg
    cdq
    idiv edi
    mov llicg,eax

    mov edx,l
    shl edx,1
    mov eax,polyf[edx+8]
    shl eax,16
    sub eax,llfwb
    cdq
    idiv edi
    mov llicb,eax

    mov edx,l
    shr edx,1
    mov eax,polyz[edx]
    sub eax,llkoz
    cdq
    idiv edi
    mov llicz,eax

    mov edx,l
    mov eax,polyt[edx]
    shl eax,16
    sub eax,lltex
    cdq
    idiv edi
    mov llitx,eax

    mov edx,l
    mov eax,polyt[edx+4]
    shl eax,16
    sub eax,lltey
    cdq
    idiv edi
    mov llity,eax

    mov edx,ebp ;rechts
    add edx,8
    and edx,31
    mov r,edx

    mov edi,polyp[edx+4]
    mov rlyto,edi
    sub edi,esi
    inc edi
    mov eax,polyp[edx]
    shl eax,16
    sub eax,ecx
    cdq
    idiv edi
    mov rlicx,eax

    mov edx,r
    shl edx,1
    mov eax,polyf[edx]
    shl eax,16
    sub eax,rlfwr
    cdq
    idiv edi
    mov rlicr,eax

    mov edx,r
    shl edx,1
    mov eax,polyf[edx+4]
    shl eax,16
    sub eax,rlfwg
    cdq
    idiv edi
    mov rlicg,eax

    mov edx,r
    shl edx,1
    mov eax,polyf[edx+8]
    shl eax,16
    sub eax,rlfwb
    cdq
    idiv edi
    mov rlicb,eax

    mov edx,r
    shr edx,1
    mov eax,polyz[edx]
    sub eax,rlkoz
    cdq
    idiv edi
    mov rlicz,eax

    mov edx,r
    mov eax,polyt[edx]
    shl eax,16
    sub eax,rltex
    cdq
    idiv edi
    mov rlitx,eax

    mov edx,r
    mov eax,polyt[edx+4]
    shl eax,16
    sub eax,rltey
    cdq
    idiv edi
    mov rlity,eax

    mov ebp,lplx ;lade höhe des polygons
    mov edi,p_deltax ;berechne offset-increment
    shl edi,2
    mov offsetinc,edi
    mov edi,esi ;berechne offset ohne x-anteil
    imul edi,p_deltax
    shl edi,2
    add edi,puffer
    mov eax,llicx ;lade x-links-increment
    mov edx,rlicx ;lade x-rechts-increment

    @@sp_loop:
    pushad

    sar ebx,16
    sar ecx,16

    cmp esi,p_miny
    jl @@sp_lende
    cmp ebx,ecx
    jge @@sp_lende
    cmp ebx,p_maxx
    jg @@sp_lende
    cmp ecx,p_minx
    jl @@sp_lende

    mov hldex,ecx ;berechne absolutes deltax
    sub hldex,ebx
    inc hldex

    mov eax,llfwr ;lade farbstartwerte
    mov hlfwr,eax
    mov eax,llfwg
    mov hlfwg,eax
    mov eax,llfwb
    mov hlfwb,eax

    mov eax,llkoz ;lade linken z-wert (anfangswert)
    mov hlkoz,eax

    mov eax,lltex ;lade linken tx/ty-wert (anfangswert)
    mov hltex,eax
    mov eax,lltey
    mov hltey,eax

    mov eax,rlfwr ;berechne rgb-incremente
    sub eax,llfwr
    cdq
    idiv hldex
    mov hlicr,eax

    mov eax,rlfwg ;g
    sub eax,llfwg
    cdq
    idiv hldex
    mov hlicg,eax

    mov eax,rlfwb ;b
    sub eax,llfwb
    cdq
    idiv hldex
    mov hlicb,eax

    mov eax,rlkoz ;berechne z-increment
    sub eax,llkoz
    cdq
    idiv hldex
    mov hlicz,eax

    mov eax,rltex ;berechne tx/ty-increment
    sub eax,lltex
    cdq
    idiv hldex
    mov hlitx,eax

    mov eax,rltey
    sub eax,lltey
    cdq
    idiv hldex
    mov hlity,eax

    cmp ebx,p_minx
    jge @@sp_kxk

    push ebx
    sub ebx,p_minx
    neg ebx
    imul ebx,hlicr
    add hlfwr,ebx
    pop ebx

    push ebx
    sub ebx,p_minx
    neg ebx
    imul ebx,hlicg
    add hlfwg,ebx
    pop ebx

    push ebx
    sub ebx,p_minx
    neg ebx
    imul ebx,hlicb
    add hlfwb,ebx
    pop ebx

    push ebx
    sub ebx,p_minx
    neg ebx
    imul ebx,hlicz
    add hlkoz,ebx
    pop ebx

    push ebx
    sub ebx,p_minx
    neg ebx
    imul ebx,hlitx
    add hltex,ebx
    pop ebx

    push ebx
    sub ebx,p_minx
    neg ebx
    imul ebx,hlity
    add hltey,ebx
    pop ebx

    mov ebx,p_minx
    @@sp_kxk:

    cmp ecx,p_maxx
    jle @@sp_kxg
    mov ecx,p_maxx
    @@sp_kxg:

    sub ecx,ebx ;berechne deltax
    inc ecx
    shl ebx,2 ;berechne startposition
    add edi,ebx

    mov esi,hlfwr
    mov ebp,hlfwg
    mov edx,hlfwb

    @@sp_lplp:
    mov ebx,edi
    sub ebx,puffer
    add ebx,zpuffer

    mov eax,hlkoz
    cmp eax,dword ptr [ebx]
    jge @@sp_lplpweiter

    push ecx
    mov dword ptr [ebx],eax ;schreibe neuen z-wert

    mov ebx,hltey
    shr ebx,16
    cmp ebx,127
    jle @@sp_kkk1
    mov ebx,127
    @@sp_kkk1:
    cmp ebx,0
    jge @@sp_kkk2
    mov ebx,0
    @@sp_kkk2:
    mov eax,hltex
    shr eax,16
    cmp eax,127
    jle @@sp_kkk3
    mov eax,127
    @@sp_kkk3:
    cmp eax,0
    jge @@sp_kkk4
    mov eax,0
    @@sp_kkk4:

    shl ebx,7
    add ebx,eax
    shl ebx,2
    add ebx,texture

    mov ecx,dword ptr [ebx]

    mov eax,0
    mov al,cl
    mov ebx,edx
    shr ebx,16
    imul eax,ebx
    shr eax,8
    mov cl,al

    mov eax,0
    mov al,ch
    mov ebx,ebp
    shr ebx,16
    imul eax,ebx
    shr eax,8
    mov ch,al

    rol ecx,16
    mov eax,0
    mov al,cl
    mov ebx,esi
    shr ebx,16
    imul eax,ebx
    shr eax,8
    mov cl,al
    rol ecx,16

    mov dword ptr [edi],ecx
    pop ecx

    @@sp_lplpweiter:
    add esi,hlicr
    add ebp,hlicg
    add edx,hlicb

    mov eax,hlicz
    add hlkoz,eax

    mov eax,hlitx
    add hltex,eax
    mov eax,hlity
    add hltey,eax

    add edi,4
    dec ecx
    jnz @@sp_lplp

    @@sp_lende:
    popad

    cmp llyto,esi
    jg @@sp_61

    push edi
    push edx

    push eax
    mov eax,llicr ;rgb-links weiter
    add llfwr,eax
    mov eax,llicg
    add llfwg,eax
    mov eax,llicb
    add llfwb,eax

    mov eax,llicz ;z-links weiter
    add llkoz,eax

    mov eax,llitx ;tx/ty-links weiter
    add lltex,eax
    mov eax,llity
    add lltey,eax
    pop eax

    add ebx,eax ;x-links weiter

    mov edx,l ;berechne nächsten punkt
    sub edx,8
    and edx,31
    mov l,edx

    mov edi,polyp[edx+4]
    mov llyto,edi
    sub edi,esi
    inc edi
    jnz @@sp_nn06
    mov edi,1
    @@sp_nn06:
    mov eax,polyp[edx]
    shl eax,16
    sub eax,ebx
    cdq
    idiv edi
    mov llicx,eax

    mov edx,l
    shl edx,1
    mov eax,polyf[edx]
    shl eax,16
    sub eax,llfwr
    cdq
    idiv edi
    mov llicr,eax

    mov edx,l
    shl edx,1
    mov eax,polyf[edx+4]
    shl eax,16
    sub eax,llfwg
    cdq
    idiv edi
    mov llicg,eax

    mov edx,l
    shl edx,1
    mov eax,polyf[edx+8]
    shl eax,16
    sub eax,llfwb
    cdq
    idiv edi
    mov llicb,eax

    mov edx,l
    shr edx,1
    mov eax,polyz[edx]
    sub eax,llkoz
    cdq
    idiv edi
    mov llicz,eax

    mov edx,l
    mov eax,polyt[edx]
    shl eax,16
    sub eax,lltex
    cdq
    idiv edi
    mov llitx,eax

    mov edx,l
    mov eax,polyt[edx+4]
    shl eax,16
    sub eax,lltey
    cdq
    idiv edi
    mov llity,eax

    mov eax,llicx

    pop edx
    pop edi

    @@sp_61:
    cmp rlyto,esi
    jg @@sp_62

    push edi
    push eax

    push edx
    mov edx,rlicr ;rgb-rechts weiter
    add rlfwr,edx
    mov edx,rlicg
    add rlfwg,edx
    mov edx,rlicb
    add rlfwb,edx

    mov edx,rlicz ;z-rechts weiter
    add rlkoz,edx

    mov edx,rlitx ;tx/ty-rechts weiter
    add rltex,edx
    mov edx,rlity
    add rltey,edx
    pop edx

    add ecx,edx ;x-rechts weiter

    mov edx,r
    add edx,8
    and edx,31
    mov r,edx

    mov edi,polyp[edx+4] ;berechne nächsten punkt
    mov rlyto,edi
    sub edi,esi
    inc edi
    jnz @@sp_nn07
    mov edi,1
    @@sp_nn07:
    mov eax,polyp[edx]
    inc eax
    shl eax,16
    sub eax,ecx
    cdq
    idiv edi
    mov rlicx,eax

    mov edx,r
    shl edx,1
    mov eax,polyf[edx]
    shl eax,16
    sub eax,rlfwr
    cdq
    idiv edi
    mov rlicr,eax

    mov edx,r
    shl edx,1
    mov eax,polyf[edx+4]
    shl eax,16
    sub eax,rlfwg
    cdq
    idiv edi
    mov rlicg,eax

    mov edx,r
    shl edx,1
    mov eax,polyf[edx+8]
    shl eax,16
    sub eax,rlfwb
    cdq
    idiv edi
    mov rlicb,eax

    mov edx,r
    shr edx,1
    mov eax,polyz[edx]
    sub eax,rlkoz
    cdq
    idiv edi
    mov rlicz,eax

    mov edx,r
    mov eax,polyt[edx]
    shl eax,16
    sub eax,rltex
    cdq
    idiv edi
    mov rlitx,eax

    mov edx,r
    mov eax,polyt[edx+4]
    shl eax,16
    sub eax,rltey
    cdq
    idiv edi
    mov rlity,eax

    mov edx,rlicx

    pop eax
    pop edi

    @@sp_62:
    push eax
    mov eax,llicr ;rgb-links weiter
    add llfwr,eax
    mov eax,llicg
    add llfwg,eax
    mov eax,llicb
    add llfwb,eax

    mov eax,rlicr ;rgb-rechts weiter
    add rlfwr,eax
    mov eax,rlicg
    add rlfwg,eax
    mov eax,rlicb
    add rlfwb,eax

    mov eax,llicz ;z-links weiter
    add llkoz,eax
    mov eax,rlicz ;z-rechts weiter
    add rlkoz,eax

    mov eax,llitx ;tx/ty-links weiter
    add lltex,eax
    mov eax,llity
    add lltey,eax

    mov eax,rlitx ;tx/ty-rechts weiter
    add rltex,eax
    mov eax,rlity
    add rltey,eax

    pop eax

    add ebx,eax ;x-links weiter
    add ecx,edx ;x-rechts weiter

    add edi,offsetinc ;offset weiter
    inc esi ;y weiter
    dec ebp ;schleife weiter
    jnz @@sp_loop

    @@sp_ende:
    pop ebp
    ret
    texturpoly endp

    end

    Ja, und wo ist dein Problem bzw. deine Frage?



  • So, ihr hattet euren Spass, doch nun ist Schluss mit dem Unfug.

    Ich denke, ich muss hier Niemanden der Beteiligten belehren, dass Fullquotes so wie extrem lange und mehr oder minder inhaltslose Beitraege hier unerwuenscht sind.


Anmelden zum Antworten