/programs/demos/3DS/A_PROCS.INC |
---|
12,7 → 12,9 |
mov edi,[Zbuffer_ptr] |
push edi |
; clear Zbuffer temporally used as image buffer |
mov ecx,SIZE_X*SIZE_Y |
movzx ecx,word[size_x_var] |
movzx eax,word[size_y_var] |
imul ecx,eax ;SIZE_X*SIZE_Y |
xor eax,eax |
cld |
rep stosd |
67,11 → 69,12 |
mov eax,.new_y |
or eax,eax |
jl .skip |
cmp eax,SIZE_Y |
movzx ebx,word[size_y_var] |
cmp eax,ebx ;SIZE_Y |
jg .skip |
; mov edx,SIZE_X |
; mul edx |
shl eax,9 |
movzx edx,word[size_x_var] |
mul edx |
; shl eax,9 |
add eax,dword .x |
lea ebx,[eax*3] |
mov eax,[esi] |
79,17 → 82,24 |
.skip: |
add esi,3 |
inc dword .x |
cmp dword .x,SIZE_X |
movzx edx,word[size_x_var] |
cmp dword .x,edx ;SIZE_X |
jl .again |
mov dword .x,0 |
inc dword .y |
cmp dword .y,SIZE_Y |
movzx edx,word[size_y_var] |
cmp dword .y,edx ;SIZE_Y |
jl .again |
; copy from temporary buffer -> Zbuffer to screen |
mov esi,[Zbuffer_ptr] |
mov edi,[screen_ptr] |
mov ecx,SIZE_X*SIZE_Y*3/4 |
movzx ecx,word[size_x_var] |
movzx eax,word[size_y_var] |
imul ecx,eax |
lea ecx,[ecx*3] |
shr ecx,2 |
; mov ecx,SIZE_X*SIZE_Y*3/4 |
cld |
rep movsd |
112,11 → 122,11 |
jl @f |
or bx,bx |
jl @f |
cmp ax,SIZE_Y |
cmp ax,[size_y_var] ;SIZE_Y |
jge @f |
cmp bx,SIZE_X |
cmp bx,[size_x_var] ;SIZE_X |
jge @f |
mov edx,SIZE_X ; SIZE_X not only power of 2 -> 256,512,... |
movzx edx,word[size_x_var] ;SIZE_X ; SIZE_X not only power of 2 -> 256,512,... |
mul edx |
add eax,ebx |
mov edi,[screen_ptr] |
130,7 → 140,100 |
ret |
do_emboss: |
do_emboss: ; sse2 version only |
if Ext >= SSE2 |
movzx ecx,[bumps_deep_flag] |
inc ecx |
call blur_screen ;blur n times |
mov eax,[size_y_var] ;load both x, y |
mov ebx,eax |
shr ebx,16 |
cwde |
mul ebx |
mov ecx,eax |
sub ecx,ebx |
sub ecx,ebx |
mov esi,[screen_ptr] |
mov edi,[Zbuffer_ptr] |
lea ebx,[ebx*3] |
mov edx,esi |
add esi,ebx |
lea ebx,[ebx+esi] |
pxor xmm0,xmm0 |
push eax |
@@: |
movlps xmm1,[esi+3] |
movhps xmm1,[esi+6] |
punpcklbw xmm1,xmm0 |
movlps xmm2,[esi-3] |
movhps xmm2,[esi] |
punpcklbw xmm2,xmm0 |
movlps xmm3,[ebx] |
movhps xmm3,[ebx+3] |
movlps xmm4,[edx] |
movhps xmm4,[edx+3] |
punpcklbw xmm3,xmm0 |
punpcklbw xmm4,xmm0 |
psubsw xmm1,xmm2 |
paddw xmm1,[.bias] |
psubsw xmm3,xmm4 |
paddw xmm3,[.bias] |
pmulhw xmm1,xmm3 |
movaps xmm7,xmm1 |
movaps xmm6,xmm1 |
psrlq xmm7,2*8 |
psrlq xmm6,4*8 |
pmaxsw xmm1,xmm7 |
pmaxsw xmm1,xmm6 |
if 0 |
movaps xmm7,xmm3 |
movaps xmm6,xmm3 |
psrlq xmm7,2*8 |
psrlq xmm6,4*8 |
pmaxsw xmm3,xmm7 |
pmaxsw xmm3,xmm6 |
end if |
pmaxsw xmm1,xmm3 |
movd eax,xmm1 |
movzx eax,al |
lea eax,[eax*3+envmap_cub] |
mov eax,[eax] |
mov [edi],eax ;xmm1 |
psrldq xmm1,8 |
movd eax,xmm1 |
movzx eax,al |
lea eax,[eax*3+envmap_cub] |
mov eax,[eax] |
mov [edi+4],eax |
add edi,8 |
add esi,6 |
add ebx,6 |
add edx,6 |
sub ecx,2 |
jnc @b |
pop ecx ;,eax |
mov edi,[screen_ptr] |
mov esi,[Zbuffer_ptr] |
@@: |
movsd |
dec edi |
loop @b |
end if |
ret |
align 16 |
.bias: |
dw 128, 128, 128, 128, 128, 128, 128, 128 |
if 0 ; old emb proc |
; emboss - after drawing all, |
; transfer screen buffer into bump map |
; and draw two bump triangles |
227,6 → 330,7 |
pop ebp |
ret |
end if |
;********************************EMBOSS DONE******************************* |
/programs/demos/3DS/BUMP3.INC |
---|
97,11 → 97,12 |
test edx,80000000h ; Check only X |
jne .loop23_done |
cmp .x1,SIZE_X ; { |
mov dx,[size_x_var] |
cmp .x1,dx ;SIZE_X ; { |
jg .loop23_done |
cmp .x2,SIZE_X ; This can be optimized with effort |
cmp .x2,dx ;SIZE_X ; This can be optimized with effort |
jg .loop23_done |
cmp .x3,SIZE_X |
cmp .x3,dx ;SIZE_X |
jg .loop23_done ; { |
462,7 → 463,8 |
mov ecx,.y |
or ecx,ecx |
jl .bl_end |
cmp ecx,SIZE_Y |
movzx edx,word[size_y_var] |
cmp ecx,edx ;SIZE_Y |
jge .bl_end |
cmp eax,ebx |
497,8 → 499,10 |
.bl_ok: |
push eax |
push ebx ;store x1, x2 |
movzx eax,word[size_x_var] |
lea eax,[eax*3] |
mov eax,SIZE_X*3 |
; mov eax,SIZE_X*3 |
mov ebx,.y |
mul ebx |
mov ecx,.x1 |
/programs/demos/3DS/BUMP_CAT.INC |
---|
780,7 → 780,9 |
mov ecx,.y |
or ecx,ecx |
jl .bl_end |
cmp ecx,SIZE_Y |
; mov dx,[size_x_var] |
; dec dx |
cmp cx,[size_y_var] ;SIZE_Y |
jge .bl_end |
cmp eax,ebx |
828,8 → 830,9 |
push eax |
push ebx ;store x1, x2 |
cmp .x1,SIZE_X |
movzx edx,word[size_x_var] |
dec edx |
cmp .x1,edx ;SIZE_X |
jge .bl_end |
cmp .x2,0 |
jle .bl_end |
919,11 → 922,13 |
imul ebx |
add .ey1,eax |
@@: |
cmp .x2,SIZE_X |
movzx edx,word[size_x_var] |
dec edx |
cmp .x2,edx ;SIZE_X |
jl @f |
mov .x2,SIZE_X |
mov .x2,edx ;SIZE_X |
@@: |
mov eax,SIZE_X ;calc memory begin in buffers |
movzx eax,word[size_x_var] ;SIZE_X ;calc memory begin in buffers |
mov ebx,.y |
mul ebx |
mov ebx,.x1 |
/programs/demos/3DS/BUMP_TEX.INC |
---|
1279,7 → 1279,8 |
mov ecx,.y |
or ecx,ecx |
jl .bl_end |
cmp ecx,SIZE_Y |
movzx edx,word[size_y_var] |
cmp ecx,edx ;SIZE_Y |
jge .bl_end |
cmp eax,ebx |
1380,7 → 1381,9 |
push eax |
push ebx ;store x1, x2 |
cmp dword .x1,SIZE_X |
movzx ebx,word[size_x_var] |
; mov eax,.x1 |
cmp dword .x1,ebx ;dword .x1,SIZE_X |
jge .bl_end |
cmp dword .x2,0 |
jle .bl_end |
1532,11 → 1535,14 |
add .ty1,eax |
@@: |
cmp dword .x2,SIZE_X |
; mov ebx,.x2 |
movzx eax,word[size_x_var] |
; cmp dword .x2,SIZE_X |
cmp dword .x2,eax ; eax,ebx |
jl @f |
mov dword .x2,SIZE_X |
mov dword .x2,eax ;SIZE_X |
@@: |
mov eax,SIZE_X ;calc memory begin in buffers |
movzx eax,word[size_x_var] ;SIZE_X ;calc memory begin in buffers |
mul .y |
add eax,.x1 |
lea esi,[4*eax] |
/programs/demos/3DS/B_PROCS.INC |
---|
747,16 → 747,29 |
shufps xmm5,xmm5,0 |
.again_blur: |
push ecx |
mov edi,screen |
mov ecx,SIZE_X*3/4 |
mov edi,[screen_ptr] |
movzx ecx,word[size_x_var] ;SIZE_X*3/4 |
lea ecx,[ecx*3] |
shr ecx,2 |
; mov ecx,SIZE_X*3/4 |
xor eax,eax |
rep stosd |
mov ecx,(SIZE_X*(SIZE_Y-3))*3/16 |
if 1 |
movzx ebx,word[size_x_var] |
movzx ecx,word[size_y_var] |
sub ecx,3 |
imul ecx,ebx |
lea ecx,[ecx*3] |
shr ecx,4 |
lea ebx,[ebx*3] |
; mov ecx,(SIZE_X*(SIZE_Y-3))*3/16 |
.blr: |
@@: |
movaps xmm0,[edi+SIZE_X*3] |
movaps xmm1,[edi-SIZE_X*3] |
push ecx |
movups xmm0,[edi+ebx] |
mov ecx,edi |
sub ecx,ebx |
movups xmm1,[ecx] |
movups xmm2,[edi-3] |
movups xmm3,[edi+3] |
766,14 → 779,17 |
psubusb xmm0,xmm5 ; importand if fire |
movaps [edi],xmm0 |
movups [edi],xmm0 |
add edi,16 |
add esi,16 |
pop ecx |
loop .blr |
end if |
xor eax,eax |
mov ecx,SIZE_X*3/4 |
movzx ecx,word[size_x_var] |
lea ecx,[ecx*3] |
shr ecx,2 |
; mov ecx,SIZE_X*3/4 |
rep stosd |
pop ecx |
loop .again_blur |
790,17 → 806,25 |
movq mm4,[esp] |
.again_blur: |
push ecx |
mov edi,screen |
mov ecx,SIZE_X*3/4 |
mov edi,[screen_ptr] |
movzx ecx,word[size_x_var] ;SIZE_X*3/4 |
lea ecx,[ecx*3] |
shr ecx,2 |
; pxor mm5,mm5 |
xor eax,eax |
rep stosd |
mov ecx,(SIZE_X*(SIZE_Y-3))*3/8 |
movzx ebx,word[size_x_var] |
movzx ecx,word[size_y_var] |
sub ecx,3 |
imul ecx,ebx |
lea ecx,[ecx*3] |
shr ecx,3 |
lea ebx,[ebx*3] |
; mov ecx,(SIZE_X*(SIZE_Y-3))*3/8 |
.blr: |
@@: |
movq mm0,[edi+SIZE_X*3] |
movq mm1,[edi-SIZE_X*3] |
movq mm0,[edi+ebx] |
movq mm1,[edi-ebx] |
movq mm2,[edi-3] |
movq mm3,[edi+3] |
817,7 → 841,10 |
loop .blr |
xor eax,eax |
mov ecx,SIZE_X*3/4 |
mov ecx,[size_x_var] |
lea ecx,[ecx*3] |
shr ecx,2 |
; SIZE_X*3/4 |
rep stosd |
pop ecx |
loop .again_blur |
833,7 → 860,7 |
push dword 0x01010101 |
.again_blur: |
push ecx |
mov edi,screen |
mov edi,[screen_ptr] |
mov ecx,SIZE_X*3/4 |
pxor mm5,mm5 |
xor eax,eax |
/programs/demos/3DS/DATA.INC |
---|
12,8 → 12,8 |
xobs dw 0 ;SIZE_X / 2 ;200 ;observer = camera |
yobs dw 0 ;SIZE_Y / 2 ;200 ;coordinates |
zobs dw -500 |
size_x dw SIZE_X |
size_y dw SIZE_Y |
; size_x dw SIZE_X |
; size_y dw SIZE_Y |
re_alloc_flag db 0 |
angle_counter dw 0 |
80,7 → 80,7 |
db 8 |
db 'culling ' |
db 2 |
culling_flag db 1 |
culling_flag db 0 |
dd onoff_f |
db 9 |
314,7 → 314,7 |
if Ext=SSE2 |
db ' (SSE2)' |
end if |
db ' 0.065',0 |
db ' 0.066',0 |
labellen: |
STRdata db '-1 ' |
436,6 → 436,10 |
screen_ptr dd ? |
Zbuffer_ptr dd ? |
; edges_ptr dd ? |
size_y_var: |
dw ? |
size_x_var: |
dw ? |
;=== |
/programs/demos/3DS/FLAT3.INC |
---|
47,11 → 47,12 |
test edx,80008000h ; Check both X&Y at once |
jne .end_triangle |
cmp word[.x1],SIZE_X ; { |
mov dx,[size_x_var] |
cmp word[.x1],dx ;SIZE_X ; { |
jg .end_triangle |
cmp word[.x2],SIZE_X ; This can be optimized with effort |
cmp word[.x2],dx ;SIZE_X ; This can be optimized with effort |
jg .end_triangle |
cmp word[.x3],SIZE_X |
cmp word[.x3],dx ;SIZE_X |
jg .end_triangle ; } |
shr eax,16 |
176,10 → 177,13 |
jcxz .end_hor_l |
; or edx,edx |
; jl .end_hor_l |
cmp edx,SIZE_Y |
movzx esi,word[size_y_var] |
cmp edx,esi ;SIZE_Y |
jg .end_hor_l |
push eax |
mov eax,SIZE_X*3 |
movzx eax,word[size_x_var] |
lea eax,[eax*3] |
; mov eax,SIZE_X*3 |
mul edx |
add edi,eax ; calculate line begin adress |
;add edi,ebx |
/programs/demos/3DS/FLAT_CAT.INC |
---|
291,10 → 291,10 |
mov ax,.y |
or ax,ax |
jl .fl_quit |
;; mov bx,[size_y] |
;; dec bx |
cmp ax,[size_y] |
cmp ax,SIZE_Y-1 |
mov bx,[size_y_var] |
dec bx |
cmp ax,bx ;[size_y_var] |
; cmp ax,SIZE_Y-1 |
jg .fl_quit |
; cmp .x1,0 |
318,9 → 318,9 |
xchg edx,.z2 |
mov .z1,edx |
.fl_ok: |
;; mov bx,[size_x] |
;; dec bx |
cmp .x1,SIZE_X-1 |
mov bx,[size_x_var] |
dec bx |
cmp .x1,bx ;SIZE_X-1 |
jg .fl_quit |
cmp .x2,0 |
jle .fl_quit |
343,11 → 343,12 |
add .z1,eax |
mov .x1,0 |
@@: |
cmp .x2,SIZE_X |
movzx edx,word[size_x_var] |
cmp .x2,dx ;[size_x_var] ;SIZE_X |
jl @f |
mov .x2,SIZE_X |
mov .x2,dx ;[size_x_var] ;SIZE_X |
@@: |
mov edx,SIZE_X |
; movzx edx,[size_x_var] ;SIZE_X |
movsx eax,.y |
mul edx ; edi = edi + (SIZE_X * y + x1)*3 |
movsx edx,.x1 |
/programs/demos/3DS/GRD3.INC |
---|
78,14 → 78,17 |
or edx,ecx |
test edx,80000000h |
jne .gt_loop2_end |
mov dx,[size_x_var] |
dec dx |
shr eax,16 |
cmp ax,SIZE_X-1 |
cmp ax,dx ;SIZE_X-1 |
jg .gt_loop2_end |
shr ebx,16 |
cmp bx,SIZE_X-1 |
cmp bx,dx ;SIZE_X-1 |
jg .gt_loop2_end |
shr ecx,16 |
cmp cx,SIZE_X-1 |
cmp cx,dx ;SIZE_X-1 |
jg .gt_loop2_end |
443,7 → 446,9 |
mov ax,.y |
or ax,ax |
jl .gl_quit |
cmp ax,SIZE_Y-1 |
mov dx,[size_y_var] |
dec dx |
cmp ax,dx ;SIZE_Y-1 |
jg .gl_quit |
mov ax,.x1 |
479,7 → 484,9 |
; jl .gl_quit |
movsx ecx,.y |
mov eax,SIZE_X*3 |
movzx eax,word[size_x_var] |
lea eax,[eax*3] |
; mov eax,SIZE_X*3 |
mul ecx |
movsx ebx,word .x1 |
lea ecx,[ebx*2+eax] |
/programs/demos/3DS/GRD_CAT.INC |
---|
514,7 → 514,9 |
mov ax,.y |
or ax,ax |
jl .gl_quit |
cmp ax,SIZE_Y |
mov bx,[size_y_var] |
dec bx |
cmp ax,bx ;SIZE_Y |
jge .gl_quit |
mov eax,dword[.x1] |
531,7 → 533,9 |
xchg eax,.z2 |
mov .z1,eax |
@@: |
cmp word[.x1],SIZE_X |
mov bx,[size_x_var] |
dec bx |
cmp word[.x1],bx ;SIZE_X |
jge .gl_quit |
cmp word[.x2],0 |
jle .gl_quit |
594,12 → 598,14 |
add word[.c1b],ax |
@@: |
cmp word[.x2],SIZE_X |
mov bx,[size_x_var] |
dec bx |
cmp word[.x2],bx ;SIZE_X |
jl @f |
mov word[.x2],SIZE_X |
mov word[.x2],bx ;SIZE_X |
@@: |
sub esp,16 ; calculate memory begin |
mov edx,SIZE_X ; in buffers |
movzx edx,word[size_x_var] ;SIZE_X ; in buffers |
movzx eax,.y |
mul edx |
movzx edx,word[.x1] |
/programs/demos/3DS/GRD_LINE.INC |
---|
41,7 → 41,15 |
.ccoord equ ebp-60 ;current coordinate |
.czbuf equ ebp-64 |
.cscr equ ebp-68 |
;.lasty equ ebp-72 |
.xres equ ebp-72 |
.yres equ ebp-76 |
.xresm1 equ ebp-80 |
.yresm1 equ ebp-84 |
.xresp1 equ ebp-88 |
.yresp1 equ ebp-92 |
.xres3 equ ebp-96 |
.xres4 equ ebp-100 |
macro .update_cur_var |
{ |
if Ext=NON |
126,15 → 134,35 |
or eax,ebx |
test eax,80008000h |
jne .end_line |
cmp word[.x1],SIZE_X |
movzx edx,word [size_x_var] |
mov [.xres],edx |
movzx ecx,word [size_y_var] |
mov [.yres],ecx |
cmp word[.x1],dx ;SIZE_X |
jg .end_line |
cmp word[.x2],SIZE_X |
cmp word[.x2],dx ;SIZE_X |
jg .end_line |
cmp word[.y1],SIZE_Y |
cmp word[.y1],cx ;SIZE_Y |
jg .end_line |
cmp word[.y2],SIZE_Y |
cmp word[.y2],cx ;SIZE_Y |
jg .end_line |
mov edx,[.xres] |
shl edx,2 |
mov [.xres4],edx |
shr edx,2 |
lea edx,[edx*3] |
mov [.xres3],edx |
mov edx,[.xres] |
mov ecx,[.yres] |
dec edx |
dec ecx |
mov [.xresm1],edx |
mov [.yresm1],ecx |
add edx,2 |
add ecx,2 |
mov [.xresp1],edx |
mov [.yresp1],ecx |
mov [.screen],edi |
mov cx,[.x1] |
181,7 → 209,7 |
call .calc_delta |
mov eax,SIZE_X |
movzx eax,word [size_x_var] ;SIZE_X |
movsx ebx,word[.y1] |
mul ebx |
add esi,eax |
247,7 → 275,7 |
call .calc_delta |
mov eax,SIZE_X |
movzx eax,word[size_x_var] ;SIZE_X |
movsx ebx,word[.y1] |
mul ebx |
add esi,eax |
290,8 → 318,8 |
.draw_pixel |
@@: |
add edi,SIZE_X*3 |
add esi,SIZE_X*4 |
add edi,[.xres3] |
add esi,[.xres4] |
.update_cur_var |
318,7 → 346,7 |
call .calc_delta |
mov eax,SIZE_X |
mov eax,[.xres] |
movsx ebx,word[.y1] ;calc begin values in screen and Z buffers |
mul ebx |
lea ebx,[3*eax] |
359,12 → 387,16 |
@@: |
cmp dword[.delta_y],0 |
jl @f |
add edi,SIZE_X*3+3 |
add esi,SIZE_X*4+4 |
add edi,[.xres3] ;SIZE_X*3+3 |
add edi,3 |
add esi,[.xres4] ;SIZE_X*4+4 |
add esi,4 |
jmp .d45_1 |
@@: |
sub edi,(SIZE_X*3)-3 |
sub esi,(SIZE_X*4)-4 |
sub edi,[.xres3] ;(SIZE_X*3)-3 |
sub edi,3 |
sub esi,[.xres4] ;(SIZE_X*4)-4 |
sub esi,4 |
.d45_1: |
.update_cur_var |
395,7 → 427,7 |
call .calc_delta |
mov eax,SIZE_X |
mov eax,[.xres] ;SIZE_X |
movsx ebx,word[.y1] ;calc begin values in screen and Z buffers |
mul ebx |
lea ebx,[3*eax] |
446,9 → 478,11 |
@@: |
mov eax,[.delta] |
mov ebx,[.xres3] |
add [.ccoord],eax |
add dword[.cscr],SIZE_X*3 ; |
add dword[.czbuf],SIZE_X*4 |
mov eax,[.xres4] |
add dword[.cscr],ebx ;SIZE_X*3 ; |
add dword[.czbuf],eax ;SIZE_X*4 |
.d_m_v1: |
.update_cur_var |
518,7 → 552,7 |
mov esi,[.czbuf] |
mov eax,[.ccoord] ; ccoord - cur y coordinate |
sar eax,ROUND |
mov ebx,SIZE_X |
mov ebx,[.xres] ;SIZE_X |
mul ebx |
add esi,eax |
lea eax,[eax*3] |
/programs/demos/3DS/GRD_TEX.INC |
---|
742,7 → 742,7 |
or cx,cx |
jl .quit_l |
cmp cx,SIZE_Y |
cmp cx,word[size_y_var] ;SIZE_Y |
jge .quit_l |
cmp ax,bx |
805,7 → 805,7 |
@@: |
or bx,bx |
jle .quit_l |
cmp ax,SIZE_X |
cmp ax,word[size_x_var] ;SIZE_X |
jge .quit_l |
push ax |
880,7 → 880,7 |
imul ebx |
add .tex_y1,eax |
@@: |
mov edx,SIZE_X |
movsx edx,word[size_x_var] ;SIZE_X |
cmp .x2,dx |
jl @f |
mov .x2,dx |
/programs/demos/3DS/History.txt |
---|
1,4 → 1,8 |
View3ds 0.065 - Feb 2015 |
1. Asc files support. |
----------------------------------------------------------------------------------- |
View3ds 0.064 - Nov 2012 |
1. Bug fixes. |
----------------------------------------------------------------------------------- |
/programs/demos/3DS/README.TXT |
---|
1,7 → 1,10 |
View3ds 0.065 - tiny viewer to .3ds and .asc files. |
View3ds 0.066 - tiny viewer to .3ds and .asc files with several graphics |
effects implementation. |
What's new? |
1. Asc files support. |
1. App window size according to current screen resolution; |
2, New emboss procedure. |
Buttons description: |
1. rotary: choosing rotary axle: x, y, x+y. |
13,14 → 16,13 |
mapping), grdl (Gouraud lines - edges only). |
3. speed: idle, full. |
4,5. zoom in, out: no comment. |
6. catmull: on( use z buffer ( z coordinate interpolation), off( depth sorting, painters |
6. catmull: on -> use z buffer ( z coordinate interpolation), off -> depth sorting, painters |
alghoritm).Txgrd, 2tex and bumptex models only with catmull = on. |
7. culling: backface culling on/ off. |
8. rand. light: Randomize 3 unlinear lights( so called Phong's illumination). |
9. Blur: blur N times; N=0,1,2,3,4,5 |
10.11,12,13. loseless operations (rotary 90, 180 degrees). |
12. emboss: Do emboss effect( flat bumps ), use blur to do edges more deep. |
carefull with emboss + fire - it looks annoying. |
12. emboss: Do emboss effect( flat bumps ), use 'bumps deep' button to do edges more deep. |
13. fire: do motion blur ( looks like fire ). |
14. move: changes meaning x,y,z +/- buttons -> obj: moving object, camr: moving camera, wave: x,y +/- increase, |
decrease wave effect frequency and amplitude. |
33,4 → 35,4 |
20. bright - -> decrease picture brightness. |
21. wav effect -> do effect based sine function. |
Maciej Guba Feb 2015 |
Maciej Guba X 2016 |
/programs/demos/3DS/TEX3.INC |
---|
82,37 → 82,37 |
or edx,ecx |
test edx,80008000h |
jne .tt_end |
mov dx,[size_x_var] |
; or ax,ax |
; jl .tt_end |
cmp ax,SIZE_Y |
jg .tt_end |
; cmp ax,SIZE_Y |
; jg .tt_end |
ror eax,16 |
; or ax,ax |
; jl .tt_end |
cmp ax,SIZE_X |
cmp ax,dx ;SIZE_X |
jg .tt_end |
rol eax,16 |
; or bx,bx |
; jl .tt_end |
cmp bx,SIZE_Y |
jg .tt_end |
; cmp bx,SIZE_Y |
; jg .tt_end |
ror ebx,16 |
; or bx,bx |
; jl .tt_end |
cmp bx,SIZE_X |
cmp bx,dx ;SIZE_X |
jg .tt_end |
rol ebx,16 |
; or cx,cx |
; jl .tt_end |
cmp cx,SIZE_Y |
jg .tt_end |
; cmp cx,SIZE_Y |
; jg .tt_end |
ror ecx,16 |
; or cx,cx |
; jl .tt_end |
cmp cx,SIZE_X |
cmp cx,dx ;SIZE_X |
jg .tt_end |
rol ecx,16 ; uff.. parameters was checked |
432,7 → 432,8 |
mov ax,.y |
or ax,ax |
jl .tl_quit |
cmp ax,SIZE_Y |
mov dx,[size_y_var] |
cmp ax,dx ;SIZE_Y |
jg .tl_quit |
mov ax,.x1 |
465,7 → 466,9 |
mov ebx,edi |
movsx edi,.y |
mov eax,SIZE_X*3 |
movzx eax,word[size_x_var] |
lea eax,[eax*3] |
; mov eax,SIZE_X*3 |
mul edi |
mov edi,eax |
movsx eax,.x1 |
/programs/demos/3DS/TEX_CAT.INC |
---|
95,22 → 95,22 |
and edx,eax |
test edx,80008000h ; Check both X&Y at once |
jne .tt_loop2_end |
cmp ax,SIZE_Y |
jl @f |
cmp bx,SIZE_Y |
jl @f |
cmp cx,SIZE_Y |
jl @f |
; cmp ax,SIZE_Y |
; jl @f |
; cmp bx,SIZE_Y |
; jl @f |
; cmp cx,SIZE_Y |
; jl @f |
ror eax,16 |
ror ebx,16 |
ror ecx,16 |
cmp ax,SIZE_X |
jl @f |
cmp bx,SIZE_X |
jl @f |
cmp cx,SIZE_X |
jl @f |
jmp .tt_loop2_end |
; cmp ax,SIZE_X |
; jl @f |
; cmp bx,SIZE_X |
; jl @f |
; cmp cx,SIZE_X |
; jl @f |
; jmp .tt_loop2_end |
@@: |
mov eax,dword[.tex_x1] ; texture coords must be in [0..TEX_X(Y)] |
mov ebx,dword[.tex_x2] |
440,7 → 440,9 |
mov ax,.y |
or ax,ax |
jl .tl_quit |
cmp ax,SIZE_Y |
mov bx,[size_y_var] |
dec bx |
cmp ax,bx ;SIZE_Y |
jge .tl_quit |
mov ax,.x1 |
472,7 → 474,9 |
mov .z1,eax |
.tl_ok: |
cmp .x1,SIZE_X |
mov cx,[size_x_var] |
dec cx |
cmp .x1,cx ;SIZE_X |
jge .tl_quit |
cmp .x2,0 |
jle .tl_quit |
517,13 → 521,13 |
add dword[.tex_x1],eax |
@@: |
cmp .x2,SIZE_X |
cmp .x2,cx ;SIZE_X |
jl @f |
mov .x2,SIZE_X |
mov .x2,cx ;SIZE_X |
@@: |
movsx ebx,.y ; calc mem begin in buffers |
mov eax,SIZE_X |
movzx eax,word[size_x_var] ;SIZE_X |
mul ebx |
movsx ebx,.x1 |
add eax,ebx |
/programs/demos/3DS/TWO_TEX.INC |
---|
788,7 → 788,7 |
mov ecx,.y |
or ecx,ecx |
jl .bl_end |
cmp ecx,SIZE_Y |
cmp cx,word[size_y_var] ;SIZE_Y |
jge .bl_end |
cmp eax,ebx |
824,11 → 824,12 |
xchg edx,.z2 |
mov .z1,edx |
@@: |
push eax ebx |
; push ebx ;store x1, x2 |
cmp .x1,SIZE_X |
jge .bl_end |
push eax ebx ;store x1, x2 |
mov ebx,.x1 |
movzx edx,word[size_x_var] |
cmp ebx,edx |
; cmp bx,word[size_x_var] ;SIZE_X |
jg .bl_end |
cmp .x2,0 |
jle .bl_end |
927,11 → 928,21 |
imul ebx |
add .ey1,eax |
@@: |
cmp .x2,SIZE_X |
jl @f |
mov .x2,SIZE_X |
movzx eax,word[size_x_var] ;SIZE_X ;word[size_x_var] |
mov ebx,.x2 |
cmp eax,ebx |
jg @f |
mov .x2,eax |
@@: |
mov eax,SIZE_X ;calc memory begin in buffers |
; movd mm0,eax |
; movd mm1,.x2 |
; pminsw mm0,mm1 |
; movd .x2,mm0 |
; cmp .x2,SIZE_X ;eax | |
; jl @f |> this dont work idk cause |
; mov .x2,SIZE_X ;eax | |
@@: |
; movzx eax,word[size_x_var] ;calc memory begin in buffers |
mov ebx,.y |
mul ebx |
mov ebx,.x1 |
/programs/demos/3DS/VIEW3DS.ASM |
---|
1,12 → 1,13 |
; application : View3ds ver. 0.065 - tiny .3ds and .asc files viewer. |
; application : View3ds ver. 0.066 - tiny .3ds and .asc files viewer |
; with a few graphics effects demonstration. |
; compiler : FASM |
; system : KolibriOS |
; author : Macgub aka Maciej Guba |
; email : macgub3@wp.pl |
; web : www.macgub.hekko.pl |
; Fell free to use this intro in your own distribution of KolibriOS/MenuetOS. |
; Special greetings to all MenuetOS maniax in the world. |
; Fell free to use this intro in your own distribution of KolibriOS. |
; Special greetings to KolibriOS team . |
; I hope because my intros Christian Belive will be near to each of You. |
16,8 → 17,8 |
; can be: |
; 1) Read from a file (*.3DS standard) |
; 2) Written in manually (at the end of the code) |
;include 'proc32.inc' |
SIZE_X equ 512 |
SIZE_Y equ 512 ; ///// I want definitely |
TIMEOUT equ 10 ; ------ say: |
53,6 → 54,27 |
START: ; start of execution |
cld |
mov eax,14 |
int 0x40 |
sub eax,150 shl 16 + 150 |
mov [size_y_var],ax |
shr ax,1 |
mov [vect_y],ax |
shr ax,1 |
movzx ebx,ax |
push ebx |
fninit |
fild dword[esp] |
fstp [rsscale] |
pop ebx |
shr eax,16 |
mov [size_x_var],ax |
shr ax,1 |
mov [vect_x],ax |
call alloc_buffer_mem |
call read_param |
call read_from_disk ; read, if all is ok eax = 0 |
493,8 → 515,11 |
je .no_inc_bright |
movzx ebx,[inc_bright_flag] |
shl ebx,4 |
mov esi,screen |
mov ecx,SIZE_X*SIZE_Y*3 |
mov esi,[screen_ptr] |
movzx ecx,word[size_y_var] |
movzx eax,word[size_x_var] |
mul ecx |
lea ecx,[eax*3] |
if (Ext = MMX)|(Ext = SSE) |
mov bh,bl |
push bx |
538,7 → 563,7 |
movaps [esi],xmm1 |
add esi,16 |
sub ecx,16 |
jnz .oop |
jnc .oop |
end if |
.no_inc_bright: |
548,8 → 573,11 |
je .no_dec_bright |
movzx ebx,[dec_bright_flag] |
shl ebx,4 |
mov esi,screen |
mov ecx,SIZE_X*SIZE_Y*3 |
mov esi,[screen_ptr] |
movzx eax,word[size_x_var] |
movzx ecx,word[size_y_var] |
mul ecx |
lea ecx,[eax*3] |
if (Ext = MMX)|(Ext = SSE) |
mov bh,bl |
push bx |
590,7 → 618,7 |
movaps [esi],xmm1 |
add esi,16 |
sub ecx,16 |
jnz .oop1 |
jnc .oop1 |
end if |
.no_dec_bright: |
;======================================commmented==================== |
680,18 → 708,29 |
mov eax,7 ; put image |
mov ebx,screen |
mov ecx,SIZE_X shl 16 + SIZE_Y |
mov ecx,[size_y_var] |
; mov ecx,SIZE_X shl 16 + SIZE_Y |
mov edx,5 shl 16 + 25 |
int 0x40 |
mov eax,13 |
mov ebx,530*65536+60 |
mov ecx,510*65536+9 |
mov bx,[size_x_var] |
add ebx,18 |
shl ebx,16 |
mov bx,60 |
mov cx,[size_y_var] |
sub cx,2 |
shl ecx,16 |
mov cx,9 |
xor edx,edx |
int 40h |
mov eax,4 ; function 4 : write text to window |
mov ebx,530*65536+510 ; [x start] *65536 + [y start] |
mov bx,[size_x_var] |
add ebx,18 |
shl ebx,16 |
mov bx,[size_y_var] |
sub bx,2 ; [x start] *65536 + [y start] |
mov ecx,0x00888888 |
mov edx,STRdata ; pointer to text beginning |
mov esi,10 ; text length |
726,10 → 765,12 |
alloc_buffer_mem: |
movzx ecx,[size_x] |
movzx eax,[size_y] |
movzx ecx,word[size_x_var] |
movzx eax,word[size_y_var] |
mul ecx |
lea ecx,[eax*3] |
add ecx,16 |
and ecx,0xfffffff0 |
push ecx |
shl eax,2 |
add ecx,eax |
778,7 → 819,9 |
add ecx,28 |
shl ecx,16 |
add ecx,14 ; ecx = [coord y]*65536 + [size y] |
mov ebx,(SIZE_X+12+70)*65536+25 ; [x start] *65536 + [size x] |
mov bx,[size_x_var] |
shl ebx,16 |
add ebx,(12+70)*65536+25 ; [x start] *65536 + [size x] |
mov edx,0x00000000 ; color 0x00RRGGBB |
int 0x40 |
787,7 → 830,10 |
sub bl,2 |
lea ebx,[ebx*3] |
lea ebx,[ebx*5] |
add ebx,(SIZE_X+12+70)*65536+28 ; [x start] *65536 + [y start] |
mov cx,[size_x_var] |
shl ecx,16 |
add ebx,ecx |
add ebx,(12+70)*65536+28 ; [x start] *65536 + [y start] |
mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB ) |
movzx edx,byte[edi+12] ; current flag |
shl edx,2 ; * 4 = text length |
1603,11 → 1649,15 |
clrscr: |
mov edi,screen |
mov ecx,SIZE_X*SIZE_Y*3/4 |
movzx ecx,word[size_x_var] |
movzx eax,word[size_y_var] |
imul ecx,eax |
lea ecx,[ecx*3] |
shr ecx,2 |
xor eax,eax |
if Ext=NON |
rep stosd |
else |
else if Ext = MMX |
pxor mm0,mm0 |
@@: |
movq [edi+00],mm0 |
1617,7 → 1667,24 |
add edi,32 |
sub ecx,8 |
jnc @b |
else |
push ecx |
mov ecx,edi |
and ecx,0x0000000f |
rep stosb |
pop ecx |
and ecx,0xfffffff0 |
xorps xmm0,xmm0 |
@@: |
movaps [edi],xmm0 |
movaps [edi+16],xmm0 |
movaps [edi+32],xmm0 |
movaps [edi+48],xmm0 |
add edi,64 |
sub ecx,16 |
jnz @b |
end if |
ret |
2044,7 → 2111,7 |
ror ebx,16 |
mov ecx,dword[xx3] |
ror ecx,16 |
mov edi,screen |
mov edi,[screen_ptr] |
mov esi,envmap_cub |
cmp [catmull_flag],0 |
je @f |
2572,10 → 2639,32 |
fill_Z_buffer: |
mov eax,0x70000000 |
; mov edi,Z_buffer |
mov edi,[Zbuffer_ptr] |
mov ecx,SIZE_X*SIZE_Y |
movzx ecx,word[size_x_var] |
movzx ebx,word[size_y_var] |
imul ecx,ebx |
if Ext>=SSE2 |
movd xmm0,eax |
shufps xmm0,xmm0,0 |
push ecx |
mov ecx,edi |
and edi,0xffffff00 |
and ecx,0x000000ff |
mov edx,ecx |
rep stosd |
pop ecx |
sub ecx,edx |
@@: |
movaps [edi],xmm0 |
movaps [edi+16],xmm0 |
movaps [edi+32],xmm0 |
movaps [edi+48],xmm0 |
add edi,64 |
sub ecx,16 |
jnc @b |
else |
rep stosd |
end if |
ret |
read_tp_variables: ; read [triangles_count_var] and [points_count_var] |
2959,7 → 3048,9 |
mov edi,menu |
.again: |
mov eax,8 ; function 8 : define and draw button |
mov ebx,(SIZE_X+10)*65536+62 ; [x start] *65536 + [x size] |
mov bx,[size_x_var] |
shl ebx,16 |
add ebx,(10)*65536+62 ; [x start] *65536 + [x size] |
movzx ecx,byte[edi] ; button id = position+2 |
sub cl,2 |
lea ecx,[ecx*5] |
2976,7 → 3067,10 |
sub bl,2 ; button id, according to position |
lea ebx,[ebx*3] |
lea ebx,[ebx*5] |
add ebx,(SIZE_X+12)*65536+28 ; [x start] *65536 + [y start] |
mov cx,[size_x_var] |
shl ecx,16 |
add ebx,ecx |
add ebx,(12)*65536+28 ; [x start] *65536 + [y start] |
mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB ) |
lea edx,[edi+1] ; pointer to text beginning |
mov esi,10 ; text length |
3013,11 → 3107,11 |
; DRAW WINDOW |
mov eax,0 ; function 0 : define and draw window |
mov ebx,100*65536;+SIZE_X;+80+30 ; [x start] *65536 + [x size] |
mov ecx,100*65536;+SIZE_Y;+30 ; [y start] *65536 + [y size] |
mov bx,[size_x] |
mov ebx,50*65536;+SIZE_X;+80+30 ; [x start] *65536 + [x size] |
mov ecx,50*65536;+SIZE_Y;+30 ; [y start] *65536 + [y size] |
mov bx,[size_x_var] |
add bx,115 |
mov cx,[size_y] |
mov cx,[size_y_var] |
add cx,30 |
mov edx,0x14000000 ; color of work area RRGGBB,8->color gl |
mov edi,labelt ; WINDOW LABEL |
3029,7 → 3123,9 |
; ADD VECTOR LABEL ; add vector buttons - 30 ++ |
mov eax,4 ; function 4 : write text to window |
mov ebx,(SIZE_X+12)*65536+(168+15*(13+.Y_ADD)) ; [x start] *65536 + [y start] |
movzx ebx,word[size_x_var] |
shl ebx,16 |
add ebx,(12)*65536+(168+15*(13+.Y_ADD)) ; [x start] *65536 + [y start] |
mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB ) |
mov edx,labelvector ; pointer to text beginning |
mov esi,labelvectorend-labelvector ; text length |
3040,7 → 3136,9 |
int 0x40 |
; VECTOR Y- BUTTON |
mov eax,8 ; function 8 : define and draw button |
mov ebx,(SIZE_X+30)*65536+20 ; [x start] *65536 + [x size] |
movzx ebx,word[size_x_var] |
shl ebx,16 |
add ebx,30*65536+20 ; [x start] *65536 + [x size] |
mov ecx,(165+15*(14+.Y_ADD))*65536+12 ; [y start] *65536 + [y size] |
mov edx,30 ; button id |
mov esi,0x6688dd ; button color RRGGBB |
3047,7 → 3145,9 |
int 0x40 |
;VECTOR Y- LABEL |
mov eax,4 ; function 4 : write text to window |
mov ebx,(SIZE_X+32)*65536+(168+15*(14+.Y_ADD)) ; [x start] *65536 + [y start] |
movzx ebx,word[size_x_var] |
shl ebx,16 |
add ebx,(32)*65536+(168+15*(14+.Y_ADD)) ; [x start] *65536 + [y start] |
mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB ) |
mov edx,labelyminus ; pointer to text beginning |
mov esi,labelyminusend-labelyminus ; text length |
3058,7 → 3158,9 |
int 0x40 |
; VECTOR Z+ BUTTON |
mov eax,8 ; function 8 : define and draw button |
mov ebx,(SIZE_X+51)*65536+21 ; [x start] *65536 + [x size] |
movzx ebx,word[size_x_var] |
shl ebx,16 |
add ebx,(51)*65536+21 ; [x start] *65536 + [x size] |
mov ecx,(165+15*(14+.Y_ADD))*65536+12 ; [y start] *65536 + [y size] |
mov edx,31 ; button id |
mov esi,0x6688dd ; button color RRGGBB |
3065,7 → 3167,9 |
int 0x40 |
;VECTOR Z+ LABEL |
mov eax,4 ; function 4 : write text to window |
mov ebx,(SIZE_X+53)*65536+(168+15*(14+.Y_ADD)) ; [x start] *65536 + [y start] |
movzx ebx,word[size_x_var] |
shl ebx,16 |
add ebx,(53)*65536+(168+15*(14+.Y_ADD)) ; [x start] *65536 + [y start] |
mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB ) |
mov edx,labelzplus ; pointer to text beginning |
mov esi,labelzplusend-labelzplus ; text length |
3077,7 → 3181,9 |
int 0x40 |
; VECTOR x- BUTTON |
mov eax,8 ; function 8 : define and draw button |
mov ebx,(SIZE_X+10)*65536+21 ; [x start] *65536 + [x size] |
movzx ebx,word[size_x_var] |
shl ebx,16 |
add ebx,(10)*65536+21 ; [x start] *65536 + [x size] |
mov ecx,(165+15*(15+.Y_ADD))*65536+12 ; [y start] *65536 + [y size] |
mov edx,32 ; button id |
mov esi,0x6688dd ; button color RRGGBB |
3084,7 → 3190,9 |
int 0x40 |
;VECTOR x- LABEL |
mov eax,4 ; function 4 : write text to window |
mov ebx,(SIZE_X+12)*65536+(168+15*(15+.Y_ADD)) ; [x start] *65536 + [y start] |
movzx ebx,word[size_x_var] |
shl ebx,16 |
add ebx,(12)*65536+(168+15*(15+.Y_ADD)) ; [x start] *65536 + [y start] |
mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB ) |
mov edx,labelxminus ; pointer to text beginning |
mov esi,labelxminusend-labelxminus ; text length |
3095,7 → 3203,9 |
int 0x40 |
; VECTOR x+ BUTTON |
mov eax,8 ; function 8 : define and draw button |
mov ebx,(SIZE_X+51)*65536+21 ; [x start] *65536 + [x size] |
movzx ebx,word[size_x_var] |
shl ebx,16 |
add ebx,(51)*65536+21 ; [x start] *65536 + [x size] |
mov ecx,(165+15*(15+.Y_ADD))*65536+12 ; [y start] *65536 + [y size] |
mov edx,33 ; button id |
mov esi,0x6688dd ; button color RRGGBB |
3102,7 → 3212,9 |
int 0x40 |
;VECTOR x+ LABEL |
mov eax,4 ; function 4 : write text to window |
mov ebx,(SIZE_X+53)*65536+(168+15*(15+.Y_ADD)) ; [x start] *65536 + [y start] |
movzx ebx,word[size_x_var] |
shl ebx,16 |
add ebx,(53)*65536+(168+15*(15+.Y_ADD)) ; [x start] *65536 + [y start] |
mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB ) |
mov edx,labelxplus ; pointer to text beginning |
mov esi,labelxplusend-labelxplus ; text length |
3113,7 → 3225,9 |
int 0x40 |
; VECTOR z- BUTTON |
mov eax,8 ; function 8 : define and draw button |
mov ebx,(SIZE_X+10)*65536+62-41 ; [x start] *65536 + [x size] |
movzx ebx,word[size_x_var] |
shl ebx,16 |
add ebx,(10)*65536+62-41 ; [x start] *65536 + [x size] |
mov ecx,(25+140+15*(16+.Y_ADD))*65536+12 ; [y start] *65536 + [y size] |
mov edx,34 ; button id |
mov esi,0x6688dd ; button color RRGGBB |
3120,7 → 3234,9 |
int 0x40 |
;VECTOR z- LABEL |
mov eax,4 ; function 4 : write text to window |
mov ebx,(SIZE_X+12)*65536+(168+15*(16+.Y_ADD)) ; [x start] *65536 + [y start] |
movzx ebx,word[size_x_var] |
shl ebx,16 |
add ebx,(12)*65536+(168+15*(16+.Y_ADD)) ; [x start] *65536 + [y start] |
mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB ) |
mov edx,labelzminus ; pointer to text beginning |
mov esi,labelzminusend-labelzminus ; text length |
3131,7 → 3247,9 |
int 0x40 |
;VECTOR Y+ BUTTON |
mov eax,8 ; function 8 : define and draw button |
mov ebx,(SIZE_X+10+20)*65536+20 ; [x start] *65536 + [x size] |
movzx ebx,word[size_x_var] |
shl ebx,16 |
add ebx,(10+20)*65536+20 ; [x start] *65536 + [x size] |
mov ecx,(165+15*(16+.Y_ADD))*65536+12 ; [y start] *65536 + [y size] |
mov edx,35 ; button id |
mov esi,0x6688dd ; button color RRGGBB |
3138,7 → 3256,9 |
int 0x40 |
;VECTOR Y+ LABEL |
mov eax,4 ; function 4 : write text to window |
mov ebx,(SIZE_X+32)*65536+(168+15*(16+.Y_ADD)) ; [x start] *65536 + [y start] |
movzx ebx,word[size_x_var] |
shl ebx,16 |
add ebx,(32)*65536+(168+15*(16+.Y_ADD)) ; [x start] *65536 + [y start] |
mov ecx,0x00ddeeff ; font 1 & color ( 0xF0RRGGBB ) |
mov edx,labelyplus ; pointer to text beginning |
mov esi,labelyplusend-labelyplus ; text length |
3157,5 → 3277,5 |
; DATA AREA ************************************ |
include 'DATA.INC' |
align 16 |
MEM_END: |