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>:
**```
.datapuffer 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 0extrn p3d :dword
extrn p3d_o :dword
extrn poly :dword
extrn mittel :dword
extrn zclip :dword
extrn lq :dwordextrn polyp :dword
extrn polyf :dword
extrn polyz :dword
extrn polyt :dwordextrn zpuffer :dword
extrn sincost :dword
extrn matrix :dword
extrn hmatrix :dwordextrn perspektive :dword
extrn max_punkte :dword
extrn max_polys :dword
extrn max_lq :dword
extrn max_sr :dwordextrn 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 :dwordextrn texture1 :dword
extrn texture2 :dword
extrn texture3 :dword
extrn texture4 :dwordtexture dd 0
puffermax dd 0
pufferm1 dd 0
puffercpx dd 0
puffercpr dd 0
offsetinc dd 0lplx dd 0
livar dq 0rgxmin dd 0
rgymin dd 0
rgzmin dd 0
rgxmax dd 0
rgymax dd 0
rgzmax dd 0
f32 dd 0l dd 0
r dd 0llyto 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 0rlyto 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 0hldex 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 0zcsichtbar 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,espmov eax,[ebp+8] ;p_zeiger
mov ebx,[ebp+12] ;p_breite
mov ecx,[ebp+16] ;p_höhemov 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,1mov esp,ebp
pop ebp
ret
init_3dpuffer endppublic berechne_matrix
berechne_matrix proc near
push ebpmov 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 sincostmov ecx,[edi+16384] ;lade c1 ( cos(a) )
mov eax,[esi]
neg eax
imul ecx
shrd eax,edx,16
mov dword ptr matrix[24],eax ;x3mov eax,[esi+16384]
imul ecx
shrd eax,edx,16
mov dword ptr matrix[32],eax ;z3mov eax,[ebx+16384]
imul ecx
shrd eax,edx,16
mov dword ptr matrix[16],eax ;y2mov 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 ;y3mov 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 ;x1mov 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 ;x2mov 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 ;z1mov 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 ;z2pop ebp
ret
berechne_matrix endppublic ermittle_p
ermittle_p proc near
push ebpmov ebp,max_punkte
mov lplx,ebp
mov edi,p3d
mov ebp,edi
sub ebp,64
mov esi,p3d_omov ecx,max_sr
mov edx,tx
sub edx,ecx
mov rgxmin,edx
mov edx,tx
add edx,ecx
mov rgxmax,edxmov edx,ty
sub edx,ecx
mov rgymin,edx
mov edx,ty
add edx,ecx
mov rgymax,edxmov 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_nsbmov eax,[esi+4] ;y
cmp eax,rgymax
jg @@ep_nsb
cmp eax,rgymin
jl @@ep_nsbmov eax,[esi+8] ;z
cmp eax,rgzmax
jg @@ep_nsb
cmp eax,rgzmin
jl @@ep_nsbmov eax,[esi] ;punkt ist sichtbar
mov [edi],eax
mov eax,[esi+4]
mov [edi+4],eax
mov eax,[esi+8]
mov [edi+8],eaxmov 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ängeradd 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],0pop ebp
ret
ermittle_p endppublic transliere_v
transliere_v proc near
push ebpmov edi,p3d
mov edi,[edi-4]
or edi,edi
jz @@tv_endemov 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],eaxmov edi,[edi+60]
or edi,edi
jnz @@tv_mlp@@tv_ende:
pop ebp
ret
transliere_v endppublic rotiere_v
rotiere_v proc near
push ebpmov 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,eaxmov eax,[edi+4]
imul dword ptr matrix[28]
shrd eax,edx,16
add ebx,eaxmov eax,[edi]
imul dword ptr matrix[24]
shrd eax,edx,16
add ebx,eaxcmp 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,eaxmov eax,[edi+4]
imul dword ptr matrix[16]
shrd eax,edx,16
add ecx,eaxmov eax,[edi]
imul dword ptr matrix[12]
shrd eax,edx,16
add ecx,eaxmov eax,[edi+8] ;x-koordinate
mov [edi+8],ebx
imul dword ptr matrix[8]
shrd eax,edx,16
mov ebx,eaxmov eax,[edi+4]
mov [edi+4],ecx
imul dword ptr matrix[4]
shrd eax,edx,16
add ebx,eaxmov 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 endppublic berechne_2d
berechne_2d proc near
push ebpmov edi,p3d
mov edi,[edi-4]
or edi,edi
jz @@b2d_endemov 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_weitermov eax,esi ;perspektive
imul dword ptr [edi] ;*x
idiv dword ptr [edi+8] ;/z
add eax,ebx ;+p_xmitte
mov [edi+24],eax ;speichere x2dmov 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 endppublic entferne_punkte_1
entferne_punkte_1 proc near
push ebpmov 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_endemov esi,p3d
add esi,20@@ep1_mlp2:
cmp dword ptr [ebx+28],0
jne @@ep1_weitermov ebp,[ebx]
shl ebp,6
mov dword ptr [esi+ebp],0mov ebp,[ebx+4]
shl ebp,6
mov dword ptr [esi+ebp],0mov ebp,[ebx+8]
shl ebp,6
mov dword ptr [esi+ebp],0mov ebp,[ebx+12]
shl ebp,6
mov dword ptr [esi+ebp],0@@ep1_weiter:
mov ebx,[ebx+60]
or ebx,ebx
jnz @@ep1_mlp2mov 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_okmov 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 endppublic entferne_polygone_1
entferne_polygone_1 proc near
push ebpmov ecx,max_polys
mov esi,poly
mov ebx,esi
sub ebx,64mov 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 sichtbarmov edi,[esi+4]
shl edi,6
cmp dword ptr [edi+ebp],1
je @@epo1_nsb2 ;2. punkt nicht sichtbarmov edi,[esi+8]
shl edi,6
cmp dword ptr [edi+ebp],1
je @@epo1_nsb2 ;3. punkt nicht sichtbarmov 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_poly2mov edi,[esi] ;entferne_poly2...
shl edi,6 ;fallunterscheidung ob 1.punkt sichtbar oder nicht
cmp dword ptr [ebp+edi],0
jz @@epo1_sichtbarmov 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 sichtbarmov edi,[esi+8] ; -> 2. 3. 4. punkt
shl edi,6
cmp dword ptr [ebp+edi],0
jz @@epo1_sbmov 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_nsbmov edi,[esi+8]
shl edi,6
cmp dword ptr [ebp+edi],0
jnz @@epo1_nsbmov edi,[esi+12]
shl edi,6
cmp dword ptr [ebp+edi],0
jnz @@epo1_nsbmov 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_lpmov 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],0pop ebp
ret
entferne_polygone_1 endppublic entferne_polygone_3
entferne_polygone_3 proc near
push ebpmov edi,poly
mov ebx,edi
sub ebx,64
mov edi,[edi-4]
or edi,edi
jz @@epo3_schlussmov ebp,p3d
add ebp,24@@epo3_lp:
cmp dword ptr [edi+28],0
jne @@epo3_endemov esi,[edi]
shl esi,6
cmp dword ptr [esi+ebp],0
jnl @@epo3_w1mov esi,[edi+4]
shl esi,6
cmp dword ptr [esi+ebp],0
jnl @@epo3_w1mov esi,[edi+8]
shl esi,6
cmp dword ptr [esi+ebp],0
jnl @@epo3_w1mov esi,[edi+12]
shl esi,6
cmp dword ptr [esi+ebp],0
jnl @@epo3_w1mov 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_w2mov esi,[edi+4]
shl esi,6
mov eax,[esi+ebp]
cmp eax,p_deltax
jnge @@epo3_w2mov esi,[edi+8]
shl esi,6
mov eax,[esi+ebp]
cmp eax,p_deltax
jnge @@epo3_w2mov esi,[edi+12]
shl esi,6
mov eax,[esi+ebp]
cmp eax,p_deltax
jnge @@epo3_w2mov 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_w3mov esi,[edi+4]
shl esi,6
cmp dword ptr [esi+ebp+4],0
jnl @@epo3_w3mov esi,[edi+8]
shl esi,6
cmp dword ptr [esi+ebp+4],0
jnl @@epo3_w3mov esi,[edi+12]
shl esi,6
cmp dword ptr [esi+ebp+4],0
jnl @@epo3_w3mov 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_w4mov esi,[edi+4]
shl esi,6
mov eax,[esi+ebp+4]
cmp eax,p_deltay
jnge @@epo3_w4mov esi,[edi+8]
shl esi,6
mov eax,[esi+ebp+4]
cmp eax,p_deltay
jnge @@epo3_w4mov esi,[edi+12]
shl esi,6
mov eax,[esi+ebp+4]
cmp eax,p_deltay
jnge @@epo3_w4mov 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 speichernmov 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,eaxcmp 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 endppublic berechne_beleuchtung
berechne_beleuchtung proc near
push ebpmov esi,p3d
mov esi,[esi-4]
or esi,esi
jz @@bebl_ende@@bbl_lp:
cmp dword ptr [esi+20],0
jne @@bbl_endepush 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_weitermov 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_weitermov 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_weitermov 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_weitermov eax,[ebx]
sub eax,[esi]
imul eax
mov ebp,eax
mov ecx,edxmov eax,[ebx+4]
sub eax,[esi+4]
imul eax
add ebp,eax
adc ecx,edxmov eax,[ebx+8]
sub eax,[esi+8]
imul eax
add ebp,eax
adc ecx,edxmov dword ptr livar,ebp
mov dword ptr livar+4,ecx
fild livar
fsqrt
fistp livarmov ebp,r
mov eax,dword ptr [ebp+4]
sub eax,dword ptr livar
jl @@bbl_weiter ;wenn betrag(pu) > maxradius(lq) -> @@weitermul dword ptr [ebp+8] ;berechne die beleuchtung
div dword ptr [ebp+4] ;eines punktesmov 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_lp2pop edi
@@bbl_ende:
mov esi,[esi+60]
or esi,esi
jnz @@bbl_lp@@bebl_ende:
pop ebp
ret
berechne_beleuchtung endppublic zclipping
zclipping proc near
push ebpmov esi,max_polys
mov lplx,esimov 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_s04cmp eax,2
je @@zc_zclippolymov dword ptr [ecx],0 ;polygon ist voll sichtbar -> kein zclip
jmp @@zc_s04
@@zc_zclippoly:mov dword ptr zcsichtbar,0
mov dword ptr zcnsichtbar,0mov edi,[esi]
shl edi,6
mov eax,[ebp+edi]
cmp eax,2
jne @@zc_1smov 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_2smov 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_3smov 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_4smov 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_s01mov dword ptr [esi+28],1
jmp @@zc_s04
@@zc_s01:cmp zcsichtbar,2
jne @@zc_s02mov dword ptr [esi+28],1
jmp @@zc_s04
@@zc_s02:cmp zcsichtbar,3
jne @@zc_s04mov dword ptr [esi+28],1
@@zc_s04:
add ecx,16
add esi,64
dec lplx
jnz @@zc_lppop ebp
ret
zclipping endppublic zeichne_polys
zeichne_polys proc near
push ebpmov 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 zpuffermov edi,poly
mov edi,[edi-4]@@lp:
mov esi,[edi+28]
cmp esi,0
jne @@zp_weitermov ebp,p3d
add ebp,24mov 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],eaxmov 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],eaxmov 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],eaxmov 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],eaxmov esi,[edi+16]
cmp esi,3
jne @@zp_kein_shadepolypushad
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],eaxmov eax,[esi+8] ;lade z-wert
mov dword ptr polyz[0],eaxmov 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],eaxmov eax,[esi+8] ;lade z-wert
mov dword ptr polyz[4],eaxmov 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],eaxmov eax,[esi+8] ;lade z-wert
mov dword ptr polyz[8],eaxmov 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],eaxmov eax,[esi+8] ;lade z-wert
mov dword ptr polyz[12],eaxcall 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 endppublic fillpoly
fillpoly proc near
push ebpmov esi,polyp[4] ;lade ymin und ymax
mov edi,esi
mov ebp,0 ;lade xoffsetmov 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-rechtsmov edx,ebp ;links
sub edx,8
and edx,31
mov l,edxmov 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,eaxmov edx,ebp ;rechts
add edx,8
and edx,31
mov r,edxmov edi,polyp[edx+4]
mov rlyto,edi
sub edi,esi
inc edi
mov eax,polyp[edx]
shl eax,16
sub eax,ecx
cdq
idiv edimov 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 edisar ebx,16
sar ecx,16cmp 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_lendecmp 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 eaxcmp llyto,esi
jg @@fp_61push edi
push edxadd ebx,eax ;x-links weiter
mov edx,l ;berechne nächsten punkt
sub edx,8
and edx,31
mov l,edxmov 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 edipop edx
pop edi@@fp_61:
cmp rlyto,esi
jg @@fp_62push edi
push eaxadd ecx,edx ;x-rechts weiter
mov edx,r
add edx,8
and edx,31
mov r,edxmov 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,eaxpop eax
pop edi@@fp_62:
add ebx,eax ;x-links weiter
add ecx,edx ;x-rechts weiteradd edi,offsetinc ;offset weiter
inc esi ;y weiter
dec ebp ;schleife weiter
jnz @@fp_loop@@fp_ende:
pop ebp
ret
fillpoly endppublic texturpoly
texturpoly proc near
push ebpmov esi,polyp[4] ;lade ymin und ymax
mov edi,esi
mov ebp,0 ;lade xoffsetmov 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,edimov ebx,polyp[ebp] ;lade x-links -> y in esi
shl ebx,16 ;16 bit fix
mov ecx,ebx ;lade x-rechtsmov 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,eaxmov edi,ebp ;lade z-links und z-rechts
shr edi,1
mov eax,polyz[edi]
mov llkoz,eax
mov rlkoz,eaxmov edi,ebp ;lade tx/ty-links und tx/ty-rechts
mov eax,polyt[edi]
shl eax,16
mov lltex,eax
mov rltex,eaxmov eax,polyt[edi+4]
shl eax,16
mov lltey,eax
mov rltey,eaxmov edx,ebp ;links
sub edx,8
and edx,31
mov l,edxmov 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,eaxmov edx,l
shl edx,1
mov eax,polyf[edx]
shl eax,16
sub eax,llfwr
cdq
idiv edi
mov llicr,eaxmov edx,l
shl edx,1
mov eax,polyf[edx+4]
shl eax,16
sub eax,llfwg
cdq
idiv edi
mov llicg,eaxmov edx,l
shl edx,1
mov eax,polyf[edx+8]
shl eax,16
sub eax,llfwb
cdq
idiv edi
mov llicb,eaxmov edx,l
shr edx,1
mov eax,polyz[edx]
sub eax,llkoz
cdq
idiv edi
mov llicz,eaxmov edx,l
mov eax,polyt[edx]
shl eax,16
sub eax,lltex
cdq
idiv edi
mov llitx,eaxmov edx,l
mov eax,polyt[edx+4]
shl eax,16
sub eax,lltey
cdq
idiv edi
mov llity,eaxmov edx,ebp ;rechts
add edx,8
and edx,31
mov r,edxmov 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,eaxmov edx,r
shl edx,1
mov eax,polyf[edx]
shl eax,16
sub eax,rlfwr
cdq
idiv edi
mov rlicr,eaxmov edx,r
shl edx,1
mov eax,polyf[edx+4]
shl eax,16
sub eax,rlfwg
cdq
idiv edi
mov rlicg,eaxmov edx,r
shl edx,1
mov eax,polyf[edx+8]
shl eax,16
sub eax,rlfwb
cdq
idiv edi
mov rlicb,eaxmov edx,r
shr edx,1
mov eax,polyz[edx]
sub eax,rlkoz
cdq
idiv edi
mov rlicz,eaxmov edx,r
mov eax,polyt[edx]
shl eax,16
sub eax,rltex
cdq
idiv edi
mov rlitx,eaxmov edx,r
mov eax,polyt[edx+4]
shl eax,16
sub eax,rltey
cdq
idiv edi
mov rlity,eaxmov 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:
pushadsar ebx,16
sar ecx,16cmp 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_lendemov hldex,ecx ;berechne absolutes deltax
sub hldex,ebx
inc hldexmov eax,llfwr ;lade farbstartwerte
mov hlfwr,eax
mov eax,llfwg
mov hlfwg,eax
mov eax,llfwb
mov hlfwb,eaxmov eax,llkoz ;lade linken z-wert (anfangswert)
mov hlkoz,eaxmov eax,lltex ;lade linken tx/ty-wert (anfangswert)
mov hltex,eax
mov eax,lltey
mov hltey,eaxmov eax,rlfwr ;berechne rgb-incremente
sub eax,llfwr
cdq
idiv hldex
mov hlicr,eaxmov eax,rlfwg ;g
sub eax,llfwg
cdq
idiv hldex
mov hlicg,eaxmov eax,rlfwb ;b
sub eax,llfwb
cdq
idiv hldex
mov hlicb,eaxmov eax,rlkoz ;berechne z-increment
sub eax,llkoz
cdq
idiv hldex
mov hlicz,eaxmov eax,rltex ;berechne tx/ty-increment
sub eax,lltex
cdq
idiv hldex
mov hlitx,eaxmov eax,rltey
sub eax,lltey
cdq
idiv hldex
mov hlity,eaxcmp ebx,p_minx
jge @@sp_kxkpush ebx
sub ebx,p_minx
neg ebx
imul ebx,hlicr
add hlfwr,ebx
pop ebxpush ebx
sub ebx,p_minx
neg ebx
imul ebx,hlicg
add hlfwg,ebx
pop ebxpush ebx
sub ebx,p_minx
neg ebx
imul ebx,hlicb
add hlfwb,ebx
pop ebxpush ebx
sub ebx,p_minx
neg ebx
imul ebx,hlicz
add hlkoz,ebx
pop ebxpush ebx
sub ebx,p_minx
neg ebx
imul ebx,hlitx
add hltex,ebx
pop ebxpush ebx
sub ebx,p_minx
neg ebx
imul ebx,hlity
add hltey,ebx
pop ebxmov 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,ebxmov esi,hlfwr
mov ebp,hlfwg
mov edx,hlfwb@@sp_lplp:
mov ebx,edi
sub ebx,puffer
add ebx,zpuffermov eax,hlkoz
cmp eax,dword ptr [ebx]
jge @@sp_lplpweiterpush ecx
mov dword ptr [ebx],eax ;schreibe neuen z-wertmov 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,texturemov ecx,dword ptr [ebx]
mov eax,0
mov al,cl
mov ebx,edx
shr ebx,16
imul eax,ebx
shr eax,8
mov cl,almov eax,0
mov al,ch
mov ebx,ebp
shr ebx,16
imul eax,ebx
shr eax,8
mov ch,alrol 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,16mov dword ptr [edi],ecx
pop ecx@@sp_lplpweiter:
add esi,hlicr
add ebp,hlicg
add edx,hlicbmov eax,hlicz
add hlkoz,eaxmov eax,hlitx
add hltex,eax
mov eax,hlity
add hltey,eaxadd edi,4
dec ecx
jnz @@sp_lplp@@sp_lende:
popadcmp llyto,esi
jg @@sp_61push edi
push edxpush eax
mov eax,llicr ;rgb-links weiter
add llfwr,eax
mov eax,llicg
add llfwg,eax
mov eax,llicb
add llfwb,eaxmov eax,llicz ;z-links weiter
add llkoz,eaxmov eax,llitx ;tx/ty-links weiter
add lltex,eax
mov eax,llity
add lltey,eax
pop eaxadd ebx,eax ;x-links weiter
mov edx,l ;berechne nächsten punkt
sub edx,8
and edx,31
mov l,edxmov 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,eaxmov edx,l
shl edx,1
mov eax,polyf[edx]
shl eax,16
sub eax,llfwr
cdq
idiv edi
mov llicr,eaxmov edx,l
shl edx,1
mov eax,polyf[edx+4]
shl eax,16
sub eax,llfwg
cdq
idiv edi
mov llicg,eaxmov edx,l
shl edx,1
mov eax,polyf[edx+8]
shl eax,16
sub eax,llfwb
cdq
idiv edi
mov llicb,eaxmov edx,l
shr edx,1
mov eax,polyz[edx]
sub eax,llkoz
cdq
idiv edi
mov llicz,eaxmov edx,l
mov eax,polyt[edx]
shl eax,16
sub eax,lltex
cdq
idiv edi
mov llitx,eaxmov edx,l
mov eax,polyt[edx+4]
shl eax,16
sub eax,lltey
cdq
idiv edi
mov llity,eaxmov eax,llicx
pop edx
pop edi@@sp_61:
cmp rlyto,esi
jg @@sp_62push edi
push eaxpush edx
mov edx,rlicr ;rgb-rechts weiter
add rlfwr,edx
mov edx,rlicg
add rlfwg,edx
mov edx,rlicb
add rlfwb,edxmov edx,rlicz ;z-rechts weiter
add rlkoz,edxmov edx,rlitx ;tx/ty-rechts weiter
add rltex,edx
mov edx,rlity
add rltey,edx
pop edxadd ecx,edx ;x-rechts weiter
mov edx,r
add edx,8
and edx,31
mov r,edxmov 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,eaxmov edx,r
shl edx,1
mov eax,polyf[edx]
shl eax,16
sub eax,rlfwr
cdq
idiv edi
mov rlicr,eaxmov edx,r
shl edx,1
mov eax,polyf[edx+4]
shl eax,16
sub eax,rlfwg
cdq
idiv edi
mov rlicg,eaxmov edx,r
shl edx,1
mov eax,polyf[edx+8]
shl eax,16
sub eax,rlfwb
cdq
idiv edi
mov rlicb,eaxmov edx,r
shr edx,1
mov eax,polyz[edx]
sub eax,rlkoz
cdq
idiv edi
mov rlicz,eaxmov edx,r
mov eax,polyt[edx]
shl eax,16
sub eax,rltex
cdq
idiv edi
mov rlitx,eaxmov edx,r
mov eax,polyt[edx+4]
shl eax,16
sub eax,rltey
cdq
idiv edi
mov rlity,eaxmov 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,eaxmov eax,rlicr ;rgb-rechts weiter
add rlfwr,eax
mov eax,rlicg
add rlfwg,eax
mov eax,rlicb
add rlfwb,eaxmov eax,llicz ;z-links weiter
add llkoz,eax
mov eax,rlicz ;z-rechts weiter
add rlkoz,eaxmov eax,llitx ;tx/ty-links weiter
add lltex,eax
mov eax,llity
add lltey,eaxmov eax,rlitx ;tx/ty-rechts weiter
add rltex,eax
mov eax,rlity
add rltey,eaxpop eax
add ebx,eax ;x-links weiter
add ecx,edx ;x-rechts weiteradd edi,offsetinc ;offset weiter
inc esi ;y weiter
dec ebp ;schleife weiter
jnz @@sp_loop@@sp_ende:
pop ebp
ret
texturpoly endpend
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>:
**```
.datapuffer 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 0extrn p3d :dword
extrn p3d_o :dword
extrn poly :dword
extrn mittel :dword
extrn zclip :dword
extrn lq :dwordextrn polyp :dword
extrn polyf :dword
extrn polyz :dword
extrn polyt :dwordextrn zpuffer :dword
extrn sincost :dword
extrn matrix :dword
extrn hmatrix :dwordextrn perspektive :dword
extrn max_punkte :dword
extrn max_polys :dword
extrn max_lq :dword
extrn max_sr :dwordextrn 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 :dwordextrn texture1 :dword
extrn texture2 :dword
extrn texture3 :dword
extrn texture4 :dwordtexture dd 0
puffermax dd 0
pufferm1 dd 0
puffercpx dd 0
puffercpr dd 0
offsetinc dd 0lplx dd 0
livar dq 0rgxmin dd 0
rgymin dd 0
rgzmin dd 0
rgxmax dd 0
rgymax dd 0
rgzmax dd 0
f32 dd 0l dd 0
r dd 0llyto 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 0rlyto 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 0hldex 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 0zcsichtbar 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,espmov eax,[ebp+8] ;p_zeiger
mov ebx,[ebp+12] ;p_breite
mov ecx,[ebp+16] ;p_höhemov 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,1mov esp,ebp
pop ebp
ret
init_3dpuffer endppublic berechne_matrix
berechne_matrix proc near
push ebpmov 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 sincostmov ecx,[edi+16384] ;lade c1 ( cos(a) )
mov eax,[esi]
neg eax
imul ecx
shrd eax,edx,16
mov dword ptr matrix[24],eax ;x3mov eax,[esi+16384]
imul ecx
shrd eax,edx,16
mov dword ptr matrix[32],eax ;z3mov eax,[ebx+16384]
imul ecx
shrd eax,edx,16
mov dword ptr matrix[16],eax ;y2mov 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 ;y3mov 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 ;x1mov 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 ;x2mov 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 ;z1mov 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 ;z2pop ebp
ret
berechne_matrix endppublic ermittle_p
ermittle_p proc near
push ebpmov ebp,max_punkte
mov lplx,ebp
mov edi,p3d
mov ebp,edi
sub ebp,64
mov esi,p3d_omov ecx,max_sr
mov edx,tx
sub edx,ecx
mov rgxmin,edx
mov edx,tx
add edx,ecx
mov rgxmax,edxmov edx,ty
sub edx,ecx
mov rgymin,edx
mov edx,ty
add edx,ecx
mov rgymax,edxmov 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_nsbmov eax,[esi+4] ;y
cmp eax,rgymax
jg @@ep_nsb
cmp eax,rgymin
jl @@ep_nsbmov eax,[esi+8] ;z
cmp eax,rgzmax
jg @@ep_nsb
cmp eax,rgzmin
jl @@ep_nsbmov eax,[esi] ;punkt ist sichtbar
mov [edi],eax
mov eax,[esi+4]
mov [edi+4],eax
mov eax,[esi+8]
mov [edi+8],eaxmov 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ängeradd 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],0pop ebp
ret
ermittle_p endppublic transliere_v
transliere_v proc near
push ebpmov edi,p3d
mov edi,[edi-4]
or edi,edi
jz @@tv_endemov 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],eaxmov edi,[edi+60]
or edi,edi
jnz @@tv_mlp@@tv_ende:
pop ebp
ret
transliere_v endppublic rotiere_v
rotiere_v proc near
push ebpmov 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,eaxmov eax,[edi+4]
imul dword ptr matrix[28]
shrd eax,edx,16
add ebx,eaxmov eax,[edi]
imul dword ptr matrix[24]
shrd eax,edx,16
add ebx,eaxcmp 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,eaxmov eax,[edi+4]
imul dword ptr matrix[16]
shrd eax,edx,16
add ecx,eaxmov eax,[edi]
imul dword ptr matrix[12]
shrd eax,edx,16
add ecx,eaxmov eax,[edi+8] ;x-koordinate
mov [edi+8],ebx
imul dword ptr matrix[8]
shrd eax,edx,16
mov ebx,eaxmov eax,[edi+4]
mov [edi+4],ecx
imul dword ptr matrix[4]
shrd eax,edx,16
add ebx,eaxmov 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 endppublic berechne_2d
berechne_2d proc near
push ebpmov edi,p3d
mov edi,[edi-4]
or edi,edi
jz @@b2d_endemov 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_weitermov eax,esi ;perspektive
imul dword ptr [edi] ;*x
idiv dword ptr [edi+8] ;/z
add eax,ebx ;+p_xmitte
mov [edi+24],eax ;speichere x2dmov 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 endppublic entferne_punkte_1
entferne_punkte_1 proc near
push ebpmov 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_endemov esi,p3d
add esi,20@@ep1_mlp2:
cmp dword ptr [ebx+28],0
jne @@ep1_weitermov ebp,[ebx]
shl ebp,6
mov dword ptr [esi+ebp],0mov ebp,[ebx+4]
shl ebp,6
mov dword ptr [esi+ebp],0mov ebp,[ebx+8]
shl ebp,6
mov dword ptr [esi+ebp],0mov ebp,[ebx+12]
shl ebp,6
mov dword ptr [esi+ebp],0@@ep1_weiter:
mov ebx,[ebx+60]
or ebx,ebx
jnz @@ep1_mlp2mov 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_okmov 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 endppublic entferne_polygone_1
entferne_polygone_1 proc near
push ebpmov ecx,max_polys
mov esi,poly
mov ebx,esi
sub ebx,64mov 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 sichtbarmov edi,[esi+4]
shl edi,6
cmp dword ptr [edi+ebp],1
je @@epo1_nsb2 ;2. punkt nicht sichtbarmov edi,[esi+8]
shl edi,6
cmp dword ptr [edi+ebp],1
je @@epo1_nsb2 ;3. punkt nicht sichtbarmov 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_poly2mov edi,[esi] ;entferne_poly2...
shl edi,6 ;fallunterscheidung ob 1.punkt sichtbar oder nicht
cmp dword ptr [ebp+edi],0
jz @@epo1_sichtbarmov 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 sichtbarmov edi,[esi+8] ; -> 2. 3. 4. punkt
shl edi,6
cmp dword ptr [ebp+edi],0
jz @@epo1_sbmov 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_nsbmov edi,[esi+8]
shl edi,6
cmp dword ptr [ebp+edi],0
jnz @@epo1_nsbmov edi,[esi+12]
shl edi,6
cmp dword ptr [ebp+edi],0
jnz @@epo1_nsbmov 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_lpmov 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],0pop ebp
ret
entferne_polygone_1 endppublic entferne_polygone_3
entferne_polygone_3 proc near
push ebpmov edi,poly
mov ebx,edi
sub ebx,64
mov edi,[edi-4]
or edi,edi
jz @@epo3_schlussmov ebp,p3d
add ebp,24@@epo3_lp:
cmp dword ptr [edi+28],0
jne @@epo3_endemov esi,[edi]
shl esi,6
cmp dword ptr [esi+ebp],0
jnl @@epo3_w1mov esi,[edi+4]
shl esi,6
cmp dword ptr [esi+ebp],0
jnl @@epo3_w1mov esi,[edi+8]
shl esi,6
cmp dword ptr [esi+ebp],0
jnl @@epo3_w1mov esi,[edi+12]
shl esi,6
cmp dword ptr [esi+ebp],0
jnl @@epo3_w1mov 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_w2mov esi,[edi+4]
shl esi,6
mov eax,[esi+ebp]
cmp eax,p_deltax
jnge @@epo3_w2mov esi,[edi+8]
shl esi,6
mov eax,[esi+ebp]
cmp eax,p_deltax
jnge @@epo3_w2mov esi,[edi+12]
shl esi,6
mov eax,[esi+ebp]
cmp eax,p_deltax
jnge @@epo3_w2mov 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_w3mov esi,[edi+4]
shl esi,6
cmp dword ptr [esi+ebp+4],0
jnl @@epo3_w3mov esi,[edi+8]
shl esi,6
cmp dword ptr [esi+ebp+4],0
jnl @@epo3_w3mov esi,[edi+12]
shl esi,6
cmp dword ptr [esi+ebp+4],0
jnl @@epo3_w3mov 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_w4mov esi,[edi+4]
shl esi,6
mov eax,[esi+ebp+4]
cmp eax,p_deltay
jnge @@epo3_w4mov esi,[edi+8]
shl esi,6
mov eax,[esi+ebp+4]
cmp eax,p_deltay
jnge @@epo3_w4mov esi,[edi+12]
shl esi,6
mov eax,[esi+ebp+4]
cmp eax,p_deltay
jnge @@epo3_w4mov 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 speichernmov 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,eaxcmp 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 endppublic berechne_beleuchtung
berechne_beleuchtung proc near
push ebpmov esi,p3d
mov esi,[esi-4]
or esi,esi
jz @@bebl_ende@@bbl_lp:
cmp dword ptr [esi+20],0
jne @@bbl_endepush 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_weitermov 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_weitermov 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_weitermov 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_weitermov eax,[ebx]
sub eax,[esi]
imul eax
mov ebp,eax
mov ecx,edxmov eax,[ebx+4]
sub eax,[esi+4]
imul eax
add ebp,eax
adc ecx,edxmov eax,[ebx+8]
sub eax,[esi+8]
imul eax
add ebp,eax
adc ecx,edxmov dword ptr livar,ebp
mov dword ptr livar+4,ecx
fild livar
fsqrt
fistp livarmov ebp,r
mov eax,dword ptr [ebp+4]
sub eax,dword ptr livar
jl @@bbl_weiter ;wenn betrag(pu) > maxradius(lq) -> @@weitermul dword ptr [ebp+8] ;berechne die beleuchtung
div dword ptr [ebp+4] ;eines punktesmov 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_lp2pop edi
@@bbl_ende:
mov esi,[esi+60]
or esi,esi
jnz @@bbl_lp@@bebl_ende:
pop ebp
ret
berechne_beleuchtung endppublic zclipping
zclipping proc near
push ebpmov esi,max_polys
mov lplx,esimov 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_s04cmp eax,2
je @@zc_zclippolymov dword ptr [ecx],0 ;polygon ist voll sichtbar -> kein zclip
jmp @@zc_s04
@@zc_zclippoly:mov dword ptr zcsichtbar,0
mov dword ptr zcnsichtbar,0mov edi,[esi]
shl edi,6
mov eax,[ebp+edi]
cmp eax,2
jne @@zc_1smov 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_2smov 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_3smov 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_4smov 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_s01mov dword ptr [esi+28],1
jmp @@zc_s04
@@zc_s01:cmp zcsichtbar,2
jne @@zc_s02mov dword ptr [esi+28],1
jmp @@zc_s04
@@zc_s02:cmp zcsichtbar,3
jne @@zc_s04mov dword ptr [esi+28],1
@@zc_s04:
add ecx,16
add esi,64
dec lplx
jnz @@zc_lppop ebp
ret
zclipping endppublic zeichne_polys
zeichne_polys proc near
push ebpmov 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 zpuffermov edi,poly
mov edi,[edi-4]@@lp:
mov esi,[edi+28]
cmp esi,0
jne @@zp_weitermov ebp,p3d
add ebp,24mov 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],eaxmov 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],eaxmov 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],eaxmov 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],eaxmov esi,[edi+16]
cmp esi,3
jne @@zp_kein_shadepolypushad
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],eaxmov eax,[esi+8] ;lade z-wert
mov dword ptr polyz[0],eaxmov 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],eaxmov eax,[esi+8] ;lade z-wert
mov dword ptr polyz[4],eaxmov 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],eaxmov eax,[esi+8] ;lade z-wert
mov dword ptr polyz[8],eaxmov 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],eaxmov eax,[esi+8] ;lade z-wert
mov dword ptr polyz[12],eaxcall 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 endppublic fillpoly
fillpoly proc near
push ebpmov esi,polyp[4] ;lade ymin und ymax
mov edi,esi
mov ebp,0 ;lade xoffsetmov 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-rechtsmov edx,ebp ;links
sub edx,8
and edx,31
mov l,edxmov 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,eaxmov edx,ebp ;rechts
add edx,8
and edx,31
mov r,edxmov edi,polyp[edx+4]
mov rlyto,edi
sub edi,esi
inc edi
mov eax,polyp[edx]
shl eax,16
sub eax,ecx
cdq
idiv edimov 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 edisar ebx,16
sar ecx,16cmp 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_lendecmp 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 eaxcmp llyto,esi
jg @@fp_61push edi
push edxadd ebx,eax ;x-links weiter
mov edx,l ;berechne nächsten punkt
sub edx,8
and edx,31
mov l,edxmov 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 edipop edx
pop edi@@fp_61:
cmp rlyto,esi
jg @@fp_62push edi
push eaxadd ecx,edx ;x-rechts weiter
mov edx,r
add edx,8
and edx,31
mov r,edxmov 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,eaxpop eax
pop edi@@fp_62:
add ebx,eax ;x-links weiter
add ecx,edx ;x-rechts weiteradd edi,offsetinc ;offset weiter
inc esi ;y weiter
dec ebp ;schleife weiter
jnz @@fp_loop@@fp_ende:
pop ebp
ret
fillpoly endppublic texturpoly
texturpoly proc near
push ebpmov esi,polyp[4] ;lade ymin und ymax
mov edi,esi
mov ebp,0 ;lade xoffsetmov 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,edimov ebx,polyp[ebp] ;lade x-links -> y in esi
shl ebx,16 ;16 bit fix
mov ecx,ebx ;lade x-rechtsmov 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,eaxmov edi,ebp ;lade z-links und z-rechts
shr edi,1
mov eax,polyz[edi]
mov llkoz,eax
mov rlkoz,eaxmov edi,ebp ;lade tx/ty-links und tx/ty-rechts
mov eax,polyt[edi]
shl eax,16
mov lltex,eax
mov rltex,eaxmov eax,polyt[edi+4]
shl eax,16
mov lltey,eax
mov rltey,eaxmov edx,ebp ;links
sub edx,8
and edx,31
mov l,edxmov 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,eaxmov edx,l
shl edx,1
mov eax,polyf[edx]
shl eax,16
sub eax,llfwr
cdq
idiv edi
mov llicr,eaxmov edx,l
shl edx,1
mov eax,polyf[edx+4]
shl eax,16
sub eax,llfwg
cdq
idiv edi
mov llicg,eaxmov edx,l
shl edx,1
mov eax,polyf[edx+8]
shl eax,16
sub eax,llfwb
cdq
idiv edi
mov llicb,eaxmov edx,l
shr edx,1
mov eax,polyz[edx]
sub eax,llkoz
cdq
idiv edi
mov llicz,eaxmov edx,l
mov eax,polyt[edx]
shl eax,16
sub eax,lltex
cdq
idiv edi
mov llitx,eaxmov edx,l
mov eax,polyt[edx+4]
shl eax,16
sub eax,lltey
cdq
idiv edi
mov llity,eaxmov edx,ebp ;rechts
add edx,8
and edx,31
mov r,edxmov 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,eaxmov edx,r
shl edx,1
mov eax,polyf[edx]
shl eax,16
sub eax,rlfwr
cdq
idiv edi
mov rlicr,eaxmov edx,r
shl edx,1
mov eax,polyf[edx+4]
shl eax,16
sub eax,rlfwg
cdq
idiv edi
mov rlicg,eaxmov edx,r
shl edx,1
mov eax,polyf[edx+8]
shl eax,16
sub eax,rlfwb
cdq
idiv edi
mov rlicb,eaxmov edx,r
shr edx,1
mov eax,polyz[edx]
sub eax,rlkoz
cdq
idiv edi
mov rlicz,eaxmov edx,r
mov eax,polyt[edx]
shl eax,16
sub eax,rltex
cdq
idiv edi
mov rlitx,eaxmov edx,r
mov eax,polyt[edx+4]
shl eax,16
sub eax,rltey
cdq
idiv edi
mov rlity,eaxmov 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:
pushadsar ebx,16
sar ecx,16cmp 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_lendemov hldex,ecx ;berechne absolutes deltax
sub hldex,ebx
inc hldexmov eax,llfwr ;lade farbstartwerte
mov hlfwr,eax
mov eax,llfwg
mov hlfwg,eax
mov eax,llfwb
mov hlfwb,eaxmov eax,llkoz ;lade linken z-wert (anfangswert)
mov hlkoz,eaxmov eax,lltex ;lade linken tx/ty-wert (anfangswert)
mov hltex,eax
mov eax,lltey
mov hltey,eaxmov eax,rlfwr ;berechne rgb-incremente
sub eax,llfwr
cdq
idiv hldex
mov hlicr,eaxmov eax,rlfwg ;g
sub eax,llfwg
cdq
idiv hldex
mov hlicg,eaxmov eax,rlfwb ;b
sub eax,llfwb
cdq
idiv hldex
mov hlicb,eaxmov eax,rlkoz ;berechne z-increment
sub eax,llkoz
cdq
idiv hldex
mov hlicz,eaxmov eax,rltex ;berechne tx/ty-increment
sub eax,lltex
cdq
idiv hldex
mov hlitx,eaxmov eax,rltey
sub eax,lltey
cdq
idiv hldex
mov hlity,eaxcmp ebx,p_minx
jge @@sp_kxkpush ebx
sub ebx,p_minx
neg ebx
imul ebx,hlicr
add hlfwr,ebx
pop ebxpush ebx
sub ebx,p_minx
neg ebx
imul ebx,hlicg
add hlfwg,ebx
pop ebxpush ebx
sub ebx,p_minx
neg ebx
imul ebx,hlicb
add hlfwb,ebx
pop ebxpush ebx
sub ebx,p_minx
neg ebx
imul ebx,hlicz
add hlkoz,ebx
pop ebxpush ebx
sub ebx,p_minx
neg ebx
imul ebx,hlitx
add hltex,ebx
pop ebxpush ebx
sub ebx,p_minx
neg ebx
imul ebx,hlity
add hltey,ebx
pop ebxmov 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,ebxmov esi,hlfwr
mov ebp,hlfwg
mov edx,hlfwb@@sp_lplp:
mov ebx,edi
sub ebx,puffer
add ebx,zpuffermov eax,hlkoz
cmp eax,dword ptr [ebx]
jge @@sp_lplpweiterpush ecx
mov dword ptr [ebx],eax ;schreibe neuen z-wertmov 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,texturemov ecx,dword ptr [ebx]
mov eax,0
mov al,cl
mov ebx,edx
shr ebx,16
imul eax,ebx
shr eax,8
mov cl,almov eax,0
mov al,ch
mov ebx,ebp
shr ebx,16
imul eax,ebx
shr eax,8
mov ch,alrol 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,16mov dword ptr [edi],ecx
pop ecx@@sp_lplpweiter:
add esi,hlicr
add ebp,hlicg
add edx,hlicbmov eax,hlicz
add hlkoz,eaxmov eax,hlitx
add hltex,eax
mov eax,hlity
add hltey,eaxadd edi,4
dec ecx
jnz @@sp_lplp@@sp_lende:
popadcmp llyto,esi
jg @@sp_61push edi
push edxpush eax
mov eax,llicr ;rgb-links weiter
add llfwr,eax
mov eax,llicg
add llfwg,eax
mov eax,llicb
add llfwb,eaxmov eax,llicz ;z-links weiter
add llkoz,eaxmov eax,llitx ;tx/ty-links weiter
add lltex,eax
mov eax,llity
add lltey,eax
pop eaxadd ebx,eax ;x-links weiter
mov edx,l ;berechne nächsten punkt
sub edx,8
and edx,31
mov l,edxmov 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,eaxmov edx,l
shl edx,1
mov eax,polyf[edx]
shl eax,16
sub eax,llfwr
cdq
idiv edi
mov llicr,eaxmov edx,l
shl edx,1
mov eax,polyf[edx+4]
shl eax,16
sub eax,llfwg
cdq
idiv edi
mov llicg,eaxmov edx,l
shl edx,1
mov eax,polyf[edx+8]
shl eax,16
sub eax,llfwb
cdq
idiv edi
mov llicb,eaxmov edx,l
shr edx,1
mov eax,polyz[edx]
sub eax,llkoz
cdq
idiv edi
mov llicz,eaxmov edx,l
mov eax,polyt[edx]
shl eax,16
sub eax,lltex
cdq
idiv edi
mov llitx,eaxmov edx,l
mov eax,polyt[edx+4]
shl eax,16
sub eax,lltey
cdq
idiv edi
mov llity,eaxmov eax,llicx
pop edx
pop edi@@sp_61:
cmp rlyto,esi
jg @@sp_62push edi
push eaxpush edx
mov edx,rlicr ;rgb-rechts weiter
add rlfwr,edx
mov edx,rlicg
add rlfwg,edx
mov edx,rlicb
add rlfwb,edxmov edx,rlicz ;z-rechts weiter
add rlkoz,edxmov edx,rlitx ;tx/ty-rechts weiter
add rltex,edx
mov edx,rlity
add rltey,edx
pop edxadd ecx,edx ;x-rechts weiter
mov edx,r
add edx,8
and edx,31
mov r,edxmov 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,eaxmov edx,r
shl edx,1
mov eax,polyf[edx]
shl eax,16
sub eax,rlfwr
cdq
idiv edi
mov rlicr,eaxmov edx,r
shl edx,1
mov eax,polyf[edx+4]
shl eax,16
sub eax,rlfwg
cdq
idiv edi
mov rlicg,eaxmov edx,r
shl edx,1
mov eax,polyf[edx+8]
shl eax,16
sub eax,rlfwb
cdq
idiv edi
mov rlicb,eaxmov edx,r
shr edx,1
mov eax,polyz[edx]
sub eax,rlkoz
cdq
idiv edi
mov rlicz,eaxmov edx,r
mov eax,polyt[edx]
shl eax,16
sub eax,rltex
cdq
idiv edi
mov rlitx,eaxmov edx,r
mov eax,polyt[edx+4]
shl eax,16
sub eax,rltey
cdq
idiv edi
mov rlity,eaxmov 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,eaxmov eax,rlicr ;rgb-rechts weiter
add rlfwr,eax
mov eax,rlicg
add rlfwg,eax
mov eax,rlicb
add rlfwb,eaxmov eax,llicz ;z-links weiter
add llkoz,eax
mov eax,rlicz ;z-rechts weiter
add rlkoz,eaxmov eax,llitx ;tx/ty-links weiter
add lltex,eax
mov eax,llity
add lltey,eaxmov eax,rlitx ;tx/ty-rechts weiter
add rltex,eax
mov eax,rlity
add rltey,eaxpop eax
add ebx,eax ;x-links weiter
add ecx,edx ;x-rechts weiteradd edi,offsetinc ;offset weiter
inc esi ;y weiter
dec ebp ;schleife weiter
jnz @@sp_loop@@sp_ende:
pop ebp
ret
texturpoly endpend
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.