2007-03-31 21:25:21 +02:00
|
|
|
|
model tiny,stdcall
|
|
|
|
|
p586
|
|
|
|
|
locals
|
|
|
|
|
jumps
|
|
|
|
|
codeseg
|
|
|
|
|
option procalign:byte
|
|
|
|
|
|
|
|
|
|
include "..\include\mem.h"
|
|
|
|
|
include "..\include\graphic.h"
|
|
|
|
|
include "..\include\3d.h"
|
|
|
|
|
|
|
|
|
|
org 0h
|
|
|
|
|
|
|
|
|
|
header exe <"CE",1,0,0,offset exports,offset imports,,>
|
|
|
|
|
|
|
|
|
|
exporting
|
|
|
|
|
declare draw3d_point
|
|
|
|
|
declare draw3d_line
|
|
|
|
|
declare draw3d_hidden
|
|
|
|
|
declare draw3d_hidden_fill
|
2007-04-11 18:03:16 +02:00
|
|
|
|
declare load3ds
|
2007-03-31 21:25:21 +02:00
|
|
|
|
declare translate
|
|
|
|
|
declare translatex
|
|
|
|
|
declare translatey
|
|
|
|
|
declare translatez
|
|
|
|
|
declare scale
|
|
|
|
|
declare rescale
|
|
|
|
|
declare copy
|
|
|
|
|
declare fill
|
|
|
|
|
declare identity
|
|
|
|
|
declare rotationx
|
|
|
|
|
declare rotationy
|
|
|
|
|
declare rotationz
|
|
|
|
|
declare rotation
|
|
|
|
|
declare project
|
|
|
|
|
declare transform
|
|
|
|
|
declare multiply
|
|
|
|
|
ende
|
|
|
|
|
|
|
|
|
|
importing
|
|
|
|
|
use GRAPHIC.LIB,line
|
2007-04-11 18:03:16 +02:00
|
|
|
|
use GRAPHIC.LIB,polyfill
|
2007-03-31 21:25:21 +02:00
|
|
|
|
use VIDEO,showpixel
|
|
|
|
|
endi
|
|
|
|
|
|
|
|
|
|
;affiche liste vertex %0
|
|
|
|
|
PROC draw3d_point FAR
|
|
|
|
|
ARG @vertex3d:word,@vertex2d:word,@camera:word,@color:word
|
|
|
|
|
USES cx,si
|
|
|
|
|
mov si,[@vertex2d]
|
|
|
|
|
call project,si,[@vertex3d],[@camera]
|
|
|
|
|
mov cx,[si]
|
|
|
|
|
inc si
|
|
|
|
|
inc si
|
|
|
|
|
@@draw:
|
|
|
|
|
call [cs:showpixel],[(vertex2d si).px],[(vertex2d si).py],[@color]
|
|
|
|
|
add si,4
|
|
|
|
|
dec cx
|
|
|
|
|
jnz @@draw
|
|
|
|
|
ret
|
|
|
|
|
endp draw3d_point
|
|
|
|
|
|
|
|
|
|
;affiche liste vertex %0
|
|
|
|
|
PROC draw3d_line FAR
|
2007-04-11 18:03:16 +02:00
|
|
|
|
ARG @type:word,@faces:word,@vertex3d:word,@vertex2d:word,@camera:word,@color:word
|
2007-03-31 21:25:21 +02:00
|
|
|
|
USES ax,bx,cx,dx,si,di
|
|
|
|
|
mov di,[@faces]
|
|
|
|
|
mov si,[@vertex2d]
|
|
|
|
|
call project,si,[@vertex3d],[@camera]
|
|
|
|
|
mov cx,[di]
|
|
|
|
|
inc si
|
|
|
|
|
inc si
|
|
|
|
|
inc di
|
|
|
|
|
inc di
|
|
|
|
|
@@draw:
|
2007-04-11 18:03:16 +02:00
|
|
|
|
mov ax,[@type]
|
2007-03-31 21:25:21 +02:00
|
|
|
|
dec al
|
|
|
|
|
mov dx,di
|
|
|
|
|
@@drawset:
|
|
|
|
|
mov bx,[di]
|
|
|
|
|
shl bx,2
|
|
|
|
|
push [@color]
|
|
|
|
|
push [(vertex2d bx+si).py]
|
|
|
|
|
push [(vertex2d bx+si).px]
|
|
|
|
|
add di,2
|
|
|
|
|
mov bx,[di]
|
|
|
|
|
shl bx,2
|
|
|
|
|
push [(vertex2d bx+si).py]
|
|
|
|
|
push [(vertex2d bx+si).px]
|
|
|
|
|
call [cs:line]
|
|
|
|
|
dec al
|
|
|
|
|
jnz @@drawset
|
|
|
|
|
push di
|
|
|
|
|
mov di,dx
|
|
|
|
|
mov bx,[di]
|
|
|
|
|
pop di
|
|
|
|
|
shl bx,2
|
|
|
|
|
push [@color]
|
|
|
|
|
push [(vertex2d bx+si).py]
|
|
|
|
|
push [(vertex2d bx+si).px]
|
|
|
|
|
mov bx,[di]
|
|
|
|
|
shl bx,2
|
|
|
|
|
push [word ptr bx+si+2]
|
|
|
|
|
push [word ptr bx+si]
|
|
|
|
|
call [cs:line]
|
|
|
|
|
add di,2
|
|
|
|
|
dec cx
|
|
|
|
|
jnz @@draw
|
|
|
|
|
ret
|
|
|
|
|
endp draw3d_line
|
|
|
|
|
|
|
|
|
|
;affiche liste vertex %0
|
|
|
|
|
PROC draw3d_hidden FAR
|
2007-04-11 18:03:16 +02:00
|
|
|
|
ARG @type:word,@faces:word,@vertex3d:word,@vertex2d:word,@camera:word,@color:word
|
2007-03-31 21:25:21 +02:00
|
|
|
|
LOCAL @@a1:word,@@a2:word,@@b1:word
|
|
|
|
|
USES ax,bx,cx,dx,si,di
|
|
|
|
|
mov di,[@faces]
|
|
|
|
|
mov si,[@vertex2d]
|
|
|
|
|
call project,si,[@vertex3d],[@camera]
|
|
|
|
|
mov cx,[di]
|
|
|
|
|
inc si
|
|
|
|
|
inc si
|
|
|
|
|
inc di
|
|
|
|
|
inc di
|
|
|
|
|
@@draw:
|
|
|
|
|
push cx
|
|
|
|
|
mov si,[@vertex2d]
|
|
|
|
|
inc si
|
|
|
|
|
inc si
|
|
|
|
|
mov bx,[di+2]
|
|
|
|
|
shl bx,2
|
|
|
|
|
mov cx,[(vertex2d bx+si).px]
|
|
|
|
|
mov dx,[(vertex2d bx+si).py]
|
|
|
|
|
mov bx,[di]
|
|
|
|
|
shl bx,2
|
|
|
|
|
mov ax,[(vertex2d bx+si).px]
|
|
|
|
|
sub ax,cx
|
|
|
|
|
mov [@@a1],ax
|
|
|
|
|
mov ax,[(vertex2d bx+si).py]
|
|
|
|
|
sub ax,dx
|
|
|
|
|
mov [@@b1],ax
|
|
|
|
|
mov bx,[di+4]
|
|
|
|
|
shl bx,2
|
|
|
|
|
mov ax,[(vertex2d bx+si).px]
|
|
|
|
|
sub ax,cx
|
|
|
|
|
mov [@@a2],ax
|
|
|
|
|
mov ax,[(vertex2d bx+si).py]
|
|
|
|
|
sub ax,dx
|
|
|
|
|
xor edx,edx
|
|
|
|
|
imul [@@a1]
|
|
|
|
|
and eax,0FFFFh
|
|
|
|
|
rol eax,16
|
|
|
|
|
add eax,edx
|
|
|
|
|
rol eax,16
|
|
|
|
|
mov ecx,eax
|
|
|
|
|
mov ax,[@@b1]
|
|
|
|
|
imul [@@a2]
|
|
|
|
|
and eax,0FFFFh
|
|
|
|
|
rol eax,16
|
|
|
|
|
add eax,edx
|
|
|
|
|
rol eax,16
|
|
|
|
|
sub ecx,eax
|
|
|
|
|
pop cx
|
|
|
|
|
jge @@nohidden
|
2007-04-11 18:03:16 +02:00
|
|
|
|
mov ax,[@type]
|
2007-03-31 21:25:21 +02:00
|
|
|
|
shl ax,1
|
|
|
|
|
add di,ax
|
|
|
|
|
dec cx
|
|
|
|
|
jnz @@draw
|
|
|
|
|
jmp @@endof
|
|
|
|
|
@@nohidden:
|
2007-04-11 18:03:16 +02:00
|
|
|
|
mov ax,[@type]
|
2007-03-31 21:25:21 +02:00
|
|
|
|
dec al
|
|
|
|
|
mov dx,di
|
|
|
|
|
@@drawset:
|
|
|
|
|
mov bx,[di]
|
|
|
|
|
shl bx,2
|
|
|
|
|
push [@color]
|
|
|
|
|
push [(vertex2d bx+si).py]
|
|
|
|
|
push [(vertex2d bx+si).px]
|
|
|
|
|
add di,2
|
|
|
|
|
mov bx,[di]
|
|
|
|
|
shl bx,2
|
|
|
|
|
push [(vertex2d bx+si).py]
|
|
|
|
|
push [(vertex2d bx+si).px]
|
|
|
|
|
call [cs:line]
|
|
|
|
|
dec al
|
|
|
|
|
jnz @@drawset
|
|
|
|
|
push di
|
|
|
|
|
mov di,dx
|
|
|
|
|
mov bx,[di]
|
|
|
|
|
pop di
|
|
|
|
|
shl bx,2
|
|
|
|
|
push [@color]
|
|
|
|
|
push [(vertex2d bx+si).py]
|
|
|
|
|
push [(vertex2d bx+si).px]
|
|
|
|
|
mov bx,[di]
|
|
|
|
|
shl bx,2
|
|
|
|
|
push [word ptr bx+si+2]
|
|
|
|
|
push [word ptr bx+si]
|
|
|
|
|
call [cs:line]
|
|
|
|
|
add di,2
|
|
|
|
|
dec cx
|
|
|
|
|
jnz @@draw
|
|
|
|
|
@@endof:
|
|
|
|
|
ret
|
|
|
|
|
endp draw3d_hidden
|
|
|
|
|
|
|
|
|
|
;creer table pour face cach<63> %0
|
|
|
|
|
PROC draw3d_hidden_fill FAR
|
2007-04-11 18:03:16 +02:00
|
|
|
|
ARG @type:word,@faces:word,@vertex3d:word,@vertex2d:word,@camera:word,@color:word
|
2007-03-31 21:25:21 +02:00
|
|
|
|
USES eax,bx,ecx,edx,si,di
|
|
|
|
|
LOCAL @@a1:word,@@a2:word,@@b1:word
|
|
|
|
|
mov di,[@faces]
|
|
|
|
|
call project,[@vertex2d],[@vertex3d],[@camera]
|
|
|
|
|
mov cx,[di]
|
|
|
|
|
inc di
|
|
|
|
|
inc di
|
|
|
|
|
@@calculvect:
|
|
|
|
|
push cx
|
|
|
|
|
mov si,[@vertex2d]
|
|
|
|
|
inc si
|
|
|
|
|
inc si
|
|
|
|
|
mov bx,[di+2]
|
|
|
|
|
shl bx,2
|
|
|
|
|
mov cx,[(vertex2d bx+si).px]
|
|
|
|
|
mov dx,[(vertex2d bx+si).py]
|
|
|
|
|
mov bx,[di]
|
|
|
|
|
shl bx,2
|
|
|
|
|
mov ax,[(vertex2d bx+si).px]
|
|
|
|
|
sub ax,cx
|
|
|
|
|
mov [@@a1],ax
|
|
|
|
|
mov ax,[(vertex2d bx+si).py]
|
|
|
|
|
sub ax,dx
|
|
|
|
|
mov [@@b1],ax
|
|
|
|
|
mov bx,[di+4]
|
|
|
|
|
shl bx,2
|
|
|
|
|
mov ax,[(vertex2d bx+si).px]
|
|
|
|
|
sub ax,cx
|
|
|
|
|
mov [@@a2],ax
|
|
|
|
|
mov ax,[(vertex2d bx+si).py]
|
|
|
|
|
sub ax,dx
|
|
|
|
|
xor edx,edx
|
|
|
|
|
imul [@@a1]
|
|
|
|
|
rol eax,16
|
|
|
|
|
add eax,edx
|
|
|
|
|
rol eax,16
|
|
|
|
|
mov ecx,eax
|
|
|
|
|
mov ax,[@@b1]
|
|
|
|
|
imul [@@a2]
|
|
|
|
|
rol eax,16
|
|
|
|
|
add eax,edx
|
|
|
|
|
rol eax,16
|
|
|
|
|
sub ecx,eax
|
|
|
|
|
pop cx
|
|
|
|
|
jl @@hidden
|
2007-04-11 18:03:16 +02:00
|
|
|
|
mov ax,[@type]
|
2007-03-31 21:25:21 +02:00
|
|
|
|
mov si,[@vertex3d]
|
|
|
|
|
inc si
|
|
|
|
|
inc si
|
|
|
|
|
fld [cs:zero]
|
|
|
|
|
@@calcz:
|
|
|
|
|
mov bx,[di]
|
|
|
|
|
mov dx,bx
|
|
|
|
|
shl dx,2
|
|
|
|
|
shl bx,3
|
|
|
|
|
add bx,dx
|
|
|
|
|
fadd [(vertex3d bx+si).tz]
|
|
|
|
|
add di,2
|
|
|
|
|
dec al
|
|
|
|
|
jnz @@calcz
|
|
|
|
|
@@hidden:
|
2007-04-11 18:03:16 +02:00
|
|
|
|
mov ax,[@type]
|
2007-03-31 21:25:21 +02:00
|
|
|
|
shl ax,1
|
|
|
|
|
add di,ax
|
|
|
|
|
@@enofvalue:
|
|
|
|
|
dec cx
|
|
|
|
|
jnz @@calculvect
|
|
|
|
|
ret
|
|
|
|
|
endp draw3d_hidden_fill
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;charge un fichier 3ds log<6F> en %0 renvoie error
|
2007-04-11 18:03:16 +02:00
|
|
|
|
;sauvegarde en :
|
|
|
|
|
;- %1 le nom de l'objet
|
|
|
|
|
;- %2 les vertex 3D de l'objet
|
|
|
|
|
;- %3 la matrice de transformation de l'objet
|
|
|
|
|
;- %4 les faces de l'objet
|
|
|
|
|
;- %5 le type de face de l'objet
|
2007-03-31 21:25:21 +02:00
|
|
|
|
;1 non 3ds
|
|
|
|
|
;2 non 3 et >
|
2007-04-11 18:03:16 +02:00
|
|
|
|
PROC load3ds FAR
|
|
|
|
|
ARG @seg:word,@add:word,@objectname:word,@vertex:word,@matrix:word,@face:word
|
|
|
|
|
USES eax,bx,cx,si,di,ds,es,fs
|
|
|
|
|
push ds
|
|
|
|
|
pop fs
|
|
|
|
|
mov si,[@add]
|
|
|
|
|
mov ds,[@seg]
|
|
|
|
|
cmp [word ptr si],main
|
|
|
|
|
jne @@error1
|
|
|
|
|
cmp [word ptr si+28],3
|
|
|
|
|
jb @@error2
|
|
|
|
|
@@reading:
|
|
|
|
|
mov ax,[si]
|
|
|
|
|
mov bx,[si+2]
|
|
|
|
|
cmp ax,main
|
|
|
|
|
je @@enter
|
|
|
|
|
cmp ax,edit
|
|
|
|
|
je @@enter
|
|
|
|
|
cmp ax,mesh
|
|
|
|
|
je @@enter
|
|
|
|
|
cmp ax,object
|
|
|
|
|
je @@readobject
|
|
|
|
|
cmp ax,vertex
|
|
|
|
|
je @@readvertex
|
|
|
|
|
cmp ax,locale
|
|
|
|
|
je @@readmatrix
|
|
|
|
|
cmp ax,face
|
|
|
|
|
je @@readfaces
|
|
|
|
|
@@next:
|
|
|
|
|
add si,bx
|
|
|
|
|
jmp @@reading
|
|
|
|
|
@@enter:
|
|
|
|
|
add si,6
|
|
|
|
|
jmp @@reading
|
|
|
|
|
@@readobject:
|
|
|
|
|
add si,6
|
|
|
|
|
mov di,si
|
|
|
|
|
mov al,0
|
|
|
|
|
mov es,[@seg]
|
|
|
|
|
mov cx,12
|
|
|
|
|
cld
|
|
|
|
|
repne scasb
|
|
|
|
|
mov cx,di
|
|
|
|
|
sub cx,si
|
|
|
|
|
mov di,[@objectname]
|
|
|
|
|
push fs
|
|
|
|
|
pop es
|
|
|
|
|
cld
|
|
|
|
|
rep movsb
|
|
|
|
|
jmp @@reading
|
|
|
|
|
@@readvertex:
|
|
|
|
|
add si,6
|
|
|
|
|
mov ax,[si]
|
|
|
|
|
mov di,[@vertex]
|
|
|
|
|
mov [fs:di],ax
|
|
|
|
|
inc si
|
|
|
|
|
inc si
|
|
|
|
|
mov cx,ax
|
|
|
|
|
shl ax,1
|
|
|
|
|
add cx,ax
|
|
|
|
|
add di,2
|
|
|
|
|
cld
|
|
|
|
|
push fs
|
|
|
|
|
pop es
|
|
|
|
|
cld
|
|
|
|
|
rep movsd
|
|
|
|
|
jmp @@reading
|
|
|
|
|
@@readmatrix:
|
|
|
|
|
add si,6
|
|
|
|
|
mov di,[@matrix]
|
|
|
|
|
mov eax,[si]
|
|
|
|
|
mov [fs:(mat di).p1],eax
|
|
|
|
|
mov eax,[si+4*1]
|
|
|
|
|
mov [fs:(mat di).p5],eax
|
|
|
|
|
mov eax,[si+4*2]
|
|
|
|
|
mov [fs:(mat di).p9],eax
|
|
|
|
|
mov eax,[si+4*3]
|
|
|
|
|
mov [fs:(mat di).p2],eax
|
|
|
|
|
mov eax,[si+4*4]
|
|
|
|
|
mov [fs:(mat di).p6],eax
|
|
|
|
|
mov eax,[si+4*5]
|
|
|
|
|
mov [fs:(mat di).p10],eax
|
|
|
|
|
mov eax,[si+4*6]
|
|
|
|
|
mov [fs:(mat di).p3],eax
|
|
|
|
|
mov eax,[si+4*7]
|
|
|
|
|
mov [fs:(mat di).p7],eax
|
|
|
|
|
mov eax,[si+4*8]
|
|
|
|
|
mov [fs:(mat di).p11],eax
|
|
|
|
|
mov eax,[si+4*9]
|
|
|
|
|
mov [fs:(mat di).p4],eax
|
|
|
|
|
mov eax,[si+4*10]
|
|
|
|
|
mov [fs:(mat di).p8],eax
|
|
|
|
|
mov eax,[si+4*11]
|
|
|
|
|
mov [fs:(mat di).p12],eax
|
|
|
|
|
mov eax,[cs:un]
|
|
|
|
|
mov [fs:(mat di).p16],eax
|
|
|
|
|
mov eax,0
|
|
|
|
|
mov [fs:(mat di).p13],eax
|
|
|
|
|
mov [fs:(mat di).p14],eax
|
|
|
|
|
mov [fs:(mat di).p15],eax
|
|
|
|
|
add si,12*4
|
|
|
|
|
jmp @@reading
|
|
|
|
|
@@readfaces:
|
|
|
|
|
add si,6
|
|
|
|
|
mov ax,[si]
|
|
|
|
|
mov di,[@face]
|
|
|
|
|
mov [fs:di],ax
|
|
|
|
|
inc si
|
|
|
|
|
inc si
|
|
|
|
|
add di,2
|
|
|
|
|
push fs
|
|
|
|
|
pop es
|
|
|
|
|
cld
|
|
|
|
|
@@readall:
|
|
|
|
|
mov cx,3
|
|
|
|
|
rep movsw
|
|
|
|
|
inc si
|
|
|
|
|
inc si
|
|
|
|
|
dec ax
|
|
|
|
|
jnz @@readall
|
2007-03-31 21:25:21 +02:00
|
|
|
|
;;jmp @@reading
|
2007-04-11 18:03:16 +02:00
|
|
|
|
@@error1:
|
|
|
|
|
@@error2:
|
|
|
|
|
ret
|
|
|
|
|
endp load3ds
|
2007-03-31 21:25:21 +02:00
|
|
|
|
|
|
|
|
|
un dd 1.0
|
|
|
|
|
zero dd 0.0
|
|
|
|
|
|
|
|
|
|
;initialise une matrice de translation pour une translation TX,TY,TZ (%1,%2,%3) dans MATRICE %0
|
|
|
|
|
; mat[ 0] = 1.0
|
|
|
|
|
; mat[ 5] = 1.0
|
|
|
|
|
; mat[10] = 1.0
|
|
|
|
|
; mat[15] = 1.0
|
|
|
|
|
; mat[ 3] = vecteur->x
|
|
|
|
|
; mat[ 7] = vecteur->y
|
|
|
|
|
; mat[11] = vecteur->z
|
|
|
|
|
PROC translate FAR
|
|
|
|
|
ARG @mat:word,@x:dword,@y:dword,@z:dword
|
|
|
|
|
USES eax,ecx,di,es
|
|
|
|
|
mov di,[@mat]
|
|
|
|
|
mov ecx,16
|
|
|
|
|
mov eax,0
|
|
|
|
|
push ds
|
|
|
|
|
pop es
|
|
|
|
|
cld
|
|
|
|
|
rep stosd
|
|
|
|
|
mov di,[@mat]
|
|
|
|
|
mov eax,[cs:un]
|
|
|
|
|
mov [di+0*4],eax
|
|
|
|
|
mov [di+5*4],eax
|
|
|
|
|
mov [di+10*4],eax
|
|
|
|
|
mov [di+15*4],eax
|
|
|
|
|
mov eax,[@x]
|
|
|
|
|
mov [di+3*4],eax
|
|
|
|
|
mov eax,[@y]
|
|
|
|
|
mov [di+7*4],eax
|
|
|
|
|
mov eax,[@z]
|
|
|
|
|
mov [di+11*4],eax
|
|
|
|
|
ret
|
|
|
|
|
ENDP translate
|
|
|
|
|
|
|
|
|
|
;initialise une matrice de translation pour une translation TX %1 dans MATRICE %0
|
|
|
|
|
; mat[ 0] = 1.0
|
|
|
|
|
; mat[ 5] = 1.0
|
|
|
|
|
; mat[10] = 1.0
|
|
|
|
|
; mat[15] = 1.0
|
|
|
|
|
; mat[ 3] = value
|
|
|
|
|
; mat[ 7] = 1
|
|
|
|
|
; mat[11] = 1
|
|
|
|
|
PROC translatex FAR
|
|
|
|
|
ARG @mat:word,@value:dword
|
|
|
|
|
USES eax,ecx,di,es
|
|
|
|
|
mov di,[@mat]
|
|
|
|
|
mov ecx,16
|
|
|
|
|
mov eax,0
|
|
|
|
|
push ds
|
|
|
|
|
pop es
|
|
|
|
|
cld
|
|
|
|
|
rep stosd
|
|
|
|
|
mov di,[@mat]
|
|
|
|
|
mov eax,[cs:un]
|
|
|
|
|
mov [di+0*4],eax
|
|
|
|
|
mov [di+5*4],eax
|
|
|
|
|
mov [di+10*4],eax
|
|
|
|
|
mov [di+15*4],eax
|
|
|
|
|
mov [di+7*4],eax
|
|
|
|
|
mov [di+11*4],eax
|
|
|
|
|
mov eax,[@value]
|
|
|
|
|
mov [di+3*4],eax
|
|
|
|
|
ret
|
|
|
|
|
ENDP translatex
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;initialise une matrice de translation pour une translation TY %1 dans MATRICE %0
|
|
|
|
|
; mat[ 0] = 1.0
|
|
|
|
|
; mat[ 5] = 1.0
|
|
|
|
|
; mat[10] = 1.0
|
|
|
|
|
; mat[15] = 1.0
|
|
|
|
|
; mat[ 3] = 1
|
|
|
|
|
; mat[ 7] = value
|
|
|
|
|
; mat[11] = 1
|
|
|
|
|
PROC translatey FAR
|
|
|
|
|
ARG @mat:word,@value:dword
|
|
|
|
|
USES eax,ecx,di,es
|
|
|
|
|
mov di,[@mat]
|
|
|
|
|
mov ecx,16
|
|
|
|
|
mov eax,0
|
|
|
|
|
push ds
|
|
|
|
|
pop es
|
|
|
|
|
cld
|
|
|
|
|
rep stosd
|
|
|
|
|
mov di,[@mat]
|
|
|
|
|
mov eax,[cs:un]
|
|
|
|
|
mov [di+0*4],eax
|
|
|
|
|
mov [di+5*4],eax
|
|
|
|
|
mov [di+10*4],eax
|
|
|
|
|
mov [di+15*4],eax
|
|
|
|
|
mov [di+3*4],eax
|
|
|
|
|
mov [di+11*4],eax
|
|
|
|
|
mov eax,[@value]
|
|
|
|
|
mov [di+7*4],eax
|
|
|
|
|
ret
|
|
|
|
|
ENDP translatey
|
|
|
|
|
|
|
|
|
|
;initialise une matrice de translation pour une translation TZ %1 dans MATRICE %0
|
|
|
|
|
; mat[ 0] = 1.0
|
|
|
|
|
; mat[ 5] = 1.0
|
|
|
|
|
; mat[10] = 1.0
|
|
|
|
|
; mat[15] = 1.0
|
|
|
|
|
; mat[ 3] = 1
|
|
|
|
|
; mat[ 7] = 1
|
|
|
|
|
; mat[11] = value
|
|
|
|
|
PROC translatez FAR
|
|
|
|
|
ARG @mat:word,@value:dword
|
|
|
|
|
USES eax,ecx,di,es
|
|
|
|
|
mov di,[@mat]
|
|
|
|
|
mov ecx,16
|
|
|
|
|
mov eax,0
|
|
|
|
|
push ds
|
|
|
|
|
pop es
|
|
|
|
|
cld
|
|
|
|
|
rep stosd
|
|
|
|
|
mov di,[@mat]
|
|
|
|
|
mov eax,[cs:un]
|
|
|
|
|
mov [di+0*4],eax
|
|
|
|
|
mov [di+5*4],eax
|
|
|
|
|
mov [di+10*4],eax
|
|
|
|
|
mov [di+15*4],eax
|
|
|
|
|
mov [di+3*4],eax
|
|
|
|
|
mov [di+7*4],eax
|
|
|
|
|
mov eax,[@value]
|
|
|
|
|
mov [di+11*4],eax
|
|
|
|
|
ret
|
|
|
|
|
ENDP translatez
|
|
|
|
|
|
|
|
|
|
;initialise une matrice d'echelle %0 de facteur (x,y,z) %1-%3
|
|
|
|
|
; mat[ 0] = factorx
|
|
|
|
|
; mat[ 5] = factory
|
|
|
|
|
; mat[10] = factorz
|
|
|
|
|
; mat[15] = 1.0
|
|
|
|
|
; reste a 0
|
|
|
|
|
PROC scale FAR
|
|
|
|
|
ARG @mat:word,@x:dword,@y:dword,@z:dword
|
|
|
|
|
USES eax,ecx,di,es
|
|
|
|
|
mov di,[@mat]
|
|
|
|
|
mov ecx,16
|
|
|
|
|
mov eax,0
|
|
|
|
|
push ds
|
|
|
|
|
pop es
|
|
|
|
|
cld
|
|
|
|
|
rep stosd
|
|
|
|
|
mov di,[@mat]
|
|
|
|
|
mov eax,[@x]
|
|
|
|
|
mov [di+0*4],eax
|
|
|
|
|
mov eax,[@y]
|
|
|
|
|
mov [di+5*4],eax
|
|
|
|
|
mov eax,[@z]
|
|
|
|
|
mov [di+10*4],eax
|
|
|
|
|
mov eax,[cs:un]
|
|
|
|
|
mov [di+15*4],eax
|
|
|
|
|
ret
|
|
|
|
|
ENDP scale
|
|
|
|
|
|
|
|
|
|
;initialise une matrice d'echelle %0 de facteur value %1
|
|
|
|
|
; mat[ 0] = factor
|
|
|
|
|
; mat[ 5] = factor
|
|
|
|
|
; mat[10] = factor
|
|
|
|
|
; mat[15] = 1.0
|
|
|
|
|
; reste a 0
|
|
|
|
|
PROC rescale FAR
|
|
|
|
|
ARG @mat:word,@value:dword
|
|
|
|
|
USES eax,ecx,di,es
|
|
|
|
|
mov di,[@mat]
|
|
|
|
|
mov ecx,16
|
|
|
|
|
mov eax,0
|
|
|
|
|
push ds
|
|
|
|
|
pop es
|
|
|
|
|
cld
|
|
|
|
|
rep stosd
|
|
|
|
|
mov di,[@mat]
|
|
|
|
|
mov eax,[@value]
|
|
|
|
|
mov [di+0*4],eax
|
|
|
|
|
mov [di+5*4],eax
|
|
|
|
|
mov [di+10*4],eax
|
|
|
|
|
mov eax,[cs:un]
|
|
|
|
|
mov [di+15*4],eax
|
|
|
|
|
ret
|
|
|
|
|
ENDP rescale
|
|
|
|
|
|
|
|
|
|
;copy une matrice %0 en %1
|
|
|
|
|
;mat2=mat1
|
|
|
|
|
PROC copy FAR
|
|
|
|
|
ARG @mat1:word,@mat2:word
|
|
|
|
|
USES ecx,si,di,es
|
|
|
|
|
mov si,[@mat1]
|
|
|
|
|
mov di,[@mat2]
|
|
|
|
|
mov ecx,16
|
|
|
|
|
push ds
|
|
|
|
|
pop es
|
|
|
|
|
cld
|
|
|
|
|
rep stosd
|
|
|
|
|
ret
|
|
|
|
|
ENDP copy
|
|
|
|
|
|
|
|
|
|
;initialise une matrice %0 avec la valeur %1
|
|
|
|
|
;mat[i]=value
|
|
|
|
|
PROC fill FAR
|
|
|
|
|
ARG @mat:word,@value:dword
|
|
|
|
|
USES eax,ecx,di,es
|
|
|
|
|
mov di,[@mat]
|
|
|
|
|
mov eax,[@value]
|
|
|
|
|
mov ecx,16
|
|
|
|
|
push ds
|
|
|
|
|
pop es
|
|
|
|
|
cld
|
|
|
|
|
rep stosd
|
|
|
|
|
ret
|
|
|
|
|
ENDP fill
|
|
|
|
|
|
|
|
|
|
;initialise une matrice d'identit<69> %0
|
|
|
|
|
; mat[0] = 1.0
|
|
|
|
|
; mat[5] = 1.0
|
|
|
|
|
; mat[10] = 1.0
|
|
|
|
|
; mat[15] = 1.0
|
|
|
|
|
; reste a 0
|
|
|
|
|
PROC identity FAR
|
|
|
|
|
ARG @mat:word
|
|
|
|
|
USES eax,ecx,di,es
|
|
|
|
|
mov di,[@mat]
|
|
|
|
|
mov ecx,16
|
|
|
|
|
mov eax,0
|
|
|
|
|
push ds
|
|
|
|
|
pop es
|
|
|
|
|
cld
|
|
|
|
|
rep stosd
|
|
|
|
|
mov di,[@mat]
|
|
|
|
|
mov eax,[cs:un]
|
|
|
|
|
mov [di+0*4],eax
|
|
|
|
|
mov [di+5*4],eax
|
|
|
|
|
mov [di+10*4],eax
|
|
|
|
|
mov [di+15*4],eax
|
|
|
|
|
ret
|
|
|
|
|
ENDP identity
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;initialise une matrice de rotation %0 autour de X de %1 degrees
|
|
|
|
|
; mat[ 5] = cos(angle)
|
|
|
|
|
; mat[ 6] = -sin(angle)
|
|
|
|
|
; mat[ 9] = sin(angle)
|
|
|
|
|
; mat[10] = cos(angle)
|
|
|
|
|
; mat[ 0] = 1.0
|
|
|
|
|
; mat[15] = 1.0
|
|
|
|
|
; reste a 0
|
|
|
|
|
PROC rotationx FAR
|
|
|
|
|
ARG @mat:word,@value:dword
|
|
|
|
|
USES eax,ecx,di,es
|
|
|
|
|
mov di,[@mat]
|
|
|
|
|
mov ecx,16
|
|
|
|
|
mov eax,0
|
|
|
|
|
push ds
|
|
|
|
|
pop es
|
|
|
|
|
cld
|
|
|
|
|
rep stosd
|
|
|
|
|
mov di,[@mat]
|
|
|
|
|
fld [@value]
|
|
|
|
|
fsincos
|
|
|
|
|
;mat[ 5] = cos(angle);
|
|
|
|
|
fst [dword ptr di+5*4]
|
|
|
|
|
;mat[ 10] = cos(angle);
|
|
|
|
|
fstp [dword ptr di+10*4]
|
|
|
|
|
;mat[ 9] = sin(angle);
|
|
|
|
|
fst [dword ptr di+9*4]
|
|
|
|
|
;mat[ 6] = -sin(angle);
|
|
|
|
|
fchs
|
|
|
|
|
fstp [dword ptr di+6*4]
|
|
|
|
|
;mat[ 0] = 1.0
|
|
|
|
|
;mat[15] = 1.0
|
|
|
|
|
mov eax,[cs:un]
|
|
|
|
|
mov [di+0*4],eax
|
|
|
|
|
mov [di+15*4],eax
|
|
|
|
|
ret
|
|
|
|
|
endp rotationx
|
|
|
|
|
|
|
|
|
|
;initialise une matrice de rotation BX autour de Y de %0 degrees
|
|
|
|
|
; mat[ 0] = cos(angle)
|
|
|
|
|
; mat[ 8] = -sin(angle)
|
|
|
|
|
; mat[ 2] = sin(angle)
|
|
|
|
|
; mat[10] = cos(angle)
|
|
|
|
|
; mat[ 5] = 1.0
|
|
|
|
|
; mat[15] = 1.0
|
|
|
|
|
; reste a 0
|
|
|
|
|
PROC rotationy FAR
|
|
|
|
|
ARG @mat:word,@value:dword
|
|
|
|
|
USES eax,ecx,di,es
|
|
|
|
|
mov di,[@mat]
|
|
|
|
|
mov ecx,16
|
|
|
|
|
mov eax,0
|
|
|
|
|
push ds
|
|
|
|
|
pop es
|
|
|
|
|
cld
|
|
|
|
|
rep stosd
|
|
|
|
|
mov di,[@mat]
|
|
|
|
|
fld [@value]
|
|
|
|
|
fsincos
|
|
|
|
|
;mat[ 0] = cos(angle)
|
|
|
|
|
fst [dword ptr di+0*4]
|
|
|
|
|
;mat[ 10] = cos(angle)
|
|
|
|
|
fstp [dword ptr di+10*4]
|
|
|
|
|
;mat[ 2] = sin(angle)
|
|
|
|
|
fst [dword ptr di+2*4]
|
|
|
|
|
fchs
|
|
|
|
|
;mat[ 8] = -sin(angle)
|
|
|
|
|
fstp [dword ptr di+8*4]
|
|
|
|
|
;mat[ 5] = 1.0
|
|
|
|
|
;mat[15] = 1.0
|
|
|
|
|
mov eax,[cs:un]
|
|
|
|
|
mov [di+5*4],eax
|
|
|
|
|
mov [di+15*4],eax
|
|
|
|
|
ret
|
|
|
|
|
endp rotationy
|
|
|
|
|
|
|
|
|
|
;initialise une matrice de rotation %0 autour de Z de %1 degrees
|
|
|
|
|
; mat[ 0] = cos(angle)
|
|
|
|
|
; mat[ 1] = -sin(angle)
|
|
|
|
|
; mat[ 4] = sin(angle)
|
|
|
|
|
; mat[ 5] = cos(angle)
|
|
|
|
|
; mat[10] = 1.0
|
|
|
|
|
; mat[15] = 1.0
|
|
|
|
|
; reste a 0
|
|
|
|
|
PROC rotationz FAR
|
|
|
|
|
ARG @mat:word,@value:dword
|
|
|
|
|
USES eax,ecx,di,es
|
|
|
|
|
mov di,[@mat]
|
|
|
|
|
mov ecx,16
|
|
|
|
|
mov eax,0
|
|
|
|
|
push ds
|
|
|
|
|
pop es
|
|
|
|
|
cld
|
|
|
|
|
rep stosd
|
|
|
|
|
mov di,[@mat]
|
|
|
|
|
fld [@value]
|
|
|
|
|
fsincos
|
|
|
|
|
;mat[ 0] = cos(angle)
|
|
|
|
|
fst [dword ptr di+0*4]
|
|
|
|
|
;mat[ 5] = cos(angle)
|
|
|
|
|
fstp [dword ptr di+5*4]
|
|
|
|
|
;mat[ 4] = sin(angle)
|
|
|
|
|
fst [dword ptr di+4*4]
|
|
|
|
|
fchs
|
|
|
|
|
;mat[ 1] = -sin(angle)
|
|
|
|
|
fstp [dword ptr di+1*4]
|
|
|
|
|
;mat[10] = 1.0
|
|
|
|
|
;mat[15] = 1.0
|
|
|
|
|
mov eax,[cs:un]
|
|
|
|
|
mov [di+10*4],eax
|
|
|
|
|
mov [di+15*4],eax
|
|
|
|
|
ret
|
|
|
|
|
endp rotationz
|
|
|
|
|
|
|
|
|
|
;initialise une matrice de rotation %0 autour de X,Y,Z de %0-%3 degrees
|
|
|
|
|
; mat[ 0] = cos(angleY)*cos(angleZ)
|
|
|
|
|
; mat[ 1] = cos(angleY)*sin(angleZ)
|
|
|
|
|
; mat[ 2] = -sin(angleY)
|
|
|
|
|
; mat[ 4] = sin(angleX)*sin(angleY)*cos(angleZ)+cos(angleX)*-sin(angleZ)
|
|
|
|
|
; mat[ 5] = sin(angleX)*sin(angleY)*sin(angleZ)+cos(angleX)*cos(angleZ)
|
|
|
|
|
; mat[ 6] = sin(angleX)*cos(angleY)
|
|
|
|
|
; mat[ 8] = cos(angleX)*sin(angleY)*cos(angleZ)+sin(angleX)*sin(angleZ)
|
|
|
|
|
; mat[ 9] = cos(angleX)*sin(angleY)*sin(angleZ)-sin(angleX)*cos(angleZ)
|
|
|
|
|
; mat[ 10] = cos(angleX)*cos(angleY)
|
|
|
|
|
; mat[3] = 0.0
|
|
|
|
|
; mat[7] = 0.0
|
|
|
|
|
; mat[11] = 0.0
|
|
|
|
|
; mat[12] = 0.0
|
|
|
|
|
; mat[13] = 0.0
|
|
|
|
|
; mat[14] = 0.0
|
|
|
|
|
; mat[15] = 1.0
|
|
|
|
|
; reste a 0
|
|
|
|
|
PROC rotation FAR
|
|
|
|
|
ARG @mat:word,@anglex:dword,@angley:dword,@anglez:dword
|
|
|
|
|
USES eax,ecx,di,es
|
|
|
|
|
mov di,[@mat]
|
|
|
|
|
mov ecx,16
|
|
|
|
|
mov eax,0
|
|
|
|
|
push ds
|
|
|
|
|
pop es
|
|
|
|
|
cld
|
|
|
|
|
rep stosd
|
|
|
|
|
mov di,[@mat]
|
|
|
|
|
;st(1) sin(angleZ)
|
|
|
|
|
;st(2) cos(angleZ)
|
|
|
|
|
;st(3) sin(angleY)
|
|
|
|
|
;st(4) cos(angleY)
|
|
|
|
|
;st(5) sin(angleX)
|
|
|
|
|
;st(6) cos(angleX)
|
|
|
|
|
fld [@anglex]
|
|
|
|
|
fsincos
|
|
|
|
|
fld [@angley]
|
|
|
|
|
fsincos
|
|
|
|
|
fld [@anglez]
|
|
|
|
|
fsincos
|
|
|
|
|
;Cos(angleY)*Cos(angleZ)
|
|
|
|
|
fld st(3)
|
|
|
|
|
fmul st(0),st(2)
|
|
|
|
|
;mat[0]
|
|
|
|
|
fstp [dword ptr di+0*4]
|
|
|
|
|
;Cos(angleY)*Sin(angleZ)
|
|
|
|
|
fld st(3)
|
|
|
|
|
fmul st(0),st(1)
|
|
|
|
|
;mat[1]
|
|
|
|
|
fstp [dword ptr di+1*4]
|
|
|
|
|
;-Sin(angley)
|
|
|
|
|
fld st(2)
|
|
|
|
|
fchs
|
|
|
|
|
;mat[2]
|
|
|
|
|
fstp [dword ptr di+2*4]
|
|
|
|
|
mov eax,[cs:un]
|
|
|
|
|
mov [di+15*4],eax
|
|
|
|
|
ret
|
|
|
|
|
endp rotation
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
factor dd 128.0
|
|
|
|
|
|
|
|
|
|
;Transforme la liste de vertex 3D point<6E> par %0 en vertex 2D dans %1 en utilisant %2 comme origine pour %3 valeurs
|
|
|
|
|
; vertex2d[i].px=int((vertex3d[i].tx*factor)/(vertex3d[i].tz+origin.Z)+origin.X)
|
|
|
|
|
; vertex2d[i].py=int((vertex3d[i].ty*factor)/(vertex3d[i].tz+origin.Z)+origin.Y)
|
|
|
|
|
PROC project FAR
|
|
|
|
|
ARG @vertex2d:word,@vertex3d:word,@origin:word
|
|
|
|
|
USES cx,bx,si,di
|
|
|
|
|
mov si,[@vertex3d]
|
|
|
|
|
mov bx,[@vertex2d]
|
|
|
|
|
mov di,[@origin]
|
|
|
|
|
mov cx,[si]
|
|
|
|
|
mov [bx],cx
|
|
|
|
|
inc si
|
|
|
|
|
inc si
|
|
|
|
|
inc bx
|
|
|
|
|
inc bx
|
|
|
|
|
@@boucle:
|
|
|
|
|
;(vertex3d[i].z+origZ)
|
|
|
|
|
fld [(vertex3d si).tz]
|
|
|
|
|
fadd [(vertex3d di).tz]
|
|
|
|
|
;(vertex3d[i].tx*factor)
|
|
|
|
|
fld [(vertex3d si).tx]
|
|
|
|
|
fmul [cs:factor]
|
|
|
|
|
;(vertex3d[i].tx*factor)/(vertex3d[i].tz+origZ)
|
|
|
|
|
fdiv st,st(1)
|
|
|
|
|
;(vertex3d[i].tx*factor)/(vertex3d[i].tz+origZ)+origX
|
|
|
|
|
fadd [(vertex3d di).tx]
|
|
|
|
|
;vertex2d[i].tx=int((vertex3d[i].tx*factor)/(vertex3d[i].tz+origZ)+origX)
|
|
|
|
|
fistp [(vertex2d bx).px]
|
|
|
|
|
;(vertex3d[i].z+origZ)
|
|
|
|
|
;(vertex3d[i].ty*factor)
|
|
|
|
|
fld [(vertex3d si).ty]
|
|
|
|
|
fmul [cs:factor]
|
|
|
|
|
;(vertex3d[i].ty*factor)/(vertex3d[i].tz+origZ)
|
|
|
|
|
fdivrp st(1)
|
|
|
|
|
;(vertex3d[i].ty*factor)/(vertex3d[i].tz+origZ)+origY
|
|
|
|
|
fadd [(vertex3d di).ty]
|
|
|
|
|
;vertex2d[i].ty=int((vertex3d[i].ty*factor)/(vertex3d[i].tz+origZ)+origY)
|
|
|
|
|
fistp [(vertex2d bx).py]
|
|
|
|
|
add si,size vertex3d
|
|
|
|
|
add bx,size vertex2d
|
|
|
|
|
dec cx
|
|
|
|
|
jnz @@boucle
|
|
|
|
|
ret
|
|
|
|
|
endp project
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
;transforme les points %0 avec la matrice %1
|
|
|
|
|
|
|
|
|
|
; vertex3d_2 = mat * vertex3d
|
|
|
|
|
|
|
|
|
|
; w = mat[12]*vertex3d[i].tx + mat[13]*vertex3d[i].ty + mat[14]*vertex3d[i].tz + mat[15]
|
|
|
|
|
; vertex3d_2[i].tx = mat[ 0]*vertex3d[i].tx + mat[ 1]*vertex3d[i].ty + mat[ 2]*vertex3d[i].tz + mat[ 3]
|
|
|
|
|
; vertex3d_2[i].ty = mat[ 4]*vertex3d[i].tx + mat[ 5]*vertex3d[i].ty + mat[ 6]*vertex3d[i].tz + mat[ 7]
|
|
|
|
|
; vertex3d_2[i].tz = mat[ 8]*vertex3d[i].tx + mat[ 9]*vertex3d[i].ty + mat[10]*vertex3d[i].tz + mat[11]
|
|
|
|
|
PROC transform FAR
|
|
|
|
|
ARG @vertex3d:word,@mat:word
|
|
|
|
|
USES cx,si,di
|
|
|
|
|
mov si,[@vertex3d]
|
|
|
|
|
mov cx,[si]
|
|
|
|
|
inc si
|
|
|
|
|
inc si
|
|
|
|
|
mov di,[@mat]
|
|
|
|
|
@@boucle:
|
|
|
|
|
;Calcul du facteur echelle
|
|
|
|
|
;mat[12]*vertex3d[i].tx
|
|
|
|
|
fld [(vertex3d si).tx]
|
|
|
|
|
fmul [dword ptr di+12*4]
|
|
|
|
|
;mat[13]*vertex3d[i].ty
|
|
|
|
|
fld [(vertex3d si).ty]
|
|
|
|
|
fmul [dword ptr di+13*4]
|
|
|
|
|
;mat[12]*vertex3d[i].tx + mat[13]*vertex3d[i].ty
|
|
|
|
|
faddp st(1)
|
|
|
|
|
;mat[14]*vertex3d.tz
|
|
|
|
|
fld [(vertex3d si).tz]
|
|
|
|
|
fmul [dword ptr di+14*4]
|
|
|
|
|
;mat[12]*vertex3d[i].tx + mat[13]*vertex3d[i].ty + mat[14]*vertex3d[i].tz
|
|
|
|
|
faddp st(1)
|
|
|
|
|
;mat[12]*vertex3d[i].tx + mat[13]*vertex3d[i].ty + mat[14]*vertex3d[i].tz + mat[15]
|
|
|
|
|
fadd [dword ptr di+15*4]
|
|
|
|
|
;w=0.0 ??
|
|
|
|
|
ftst
|
|
|
|
|
;-> AX
|
|
|
|
|
fstsw ax
|
|
|
|
|
|
|
|
|
|
;vertex3d.tx vertex3d.ty et vertex3d.tz
|
|
|
|
|
fld [(vertex3d si).tx]
|
|
|
|
|
fmul [dword ptr di+0*4]
|
|
|
|
|
fld [(vertex3d si).ty]
|
|
|
|
|
fmul [dword ptr di+1*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fld [(vertex3d si).tz]
|
|
|
|
|
fmul [dword ptr di+2*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fadd [dword ptr di+3*4]
|
|
|
|
|
|
|
|
|
|
fld [(vertex3d si).tx]
|
|
|
|
|
fmul [dword ptr di+4*4]
|
|
|
|
|
fld [(vertex3d si).ty]
|
|
|
|
|
fmul [dword ptr di+5*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fld [(vertex3d si).tz]
|
|
|
|
|
fmul [dword ptr di+6*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fadd [dword ptr di+7*4]
|
|
|
|
|
|
|
|
|
|
fld [(vertex3d si).tx]
|
|
|
|
|
fmul [dword ptr di+8*4]
|
|
|
|
|
fld [(vertex3d si).ty]
|
|
|
|
|
fmul [dword ptr di+9*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fld [(vertex3d si).tz]
|
|
|
|
|
fmul [dword ptr di+10*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fadd [dword ptr di+11*4]
|
|
|
|
|
|
|
|
|
|
;w=0.0
|
|
|
|
|
sahf
|
|
|
|
|
jz @@divby0
|
|
|
|
|
;vertex3d.tx=vertex3d[i].tz/w
|
|
|
|
|
fdiv st,st(3)
|
|
|
|
|
fstp [(vertex3d si).tz]
|
|
|
|
|
;vertex3d.ty=vertex3d[i].ty/w
|
|
|
|
|
fdiv st,st(2)
|
|
|
|
|
fstp [(vertex3d si).ty]
|
|
|
|
|
;vertex3d.tz=vertex3d[i].tx/w
|
|
|
|
|
fdivrp st(1),st
|
|
|
|
|
fstp [(vertex3d si).tx]
|
|
|
|
|
;No div by 0
|
|
|
|
|
jmp @@nodiv
|
|
|
|
|
@@divby0:
|
|
|
|
|
fstp [(vertex3d si).tz]
|
|
|
|
|
fstp [(vertex3d si).ty]
|
|
|
|
|
fstp [(vertex3d si).tx]
|
|
|
|
|
ffree
|
|
|
|
|
@@nodiv:
|
|
|
|
|
add si,size vertex3d
|
|
|
|
|
dec cx
|
|
|
|
|
jnz @@boucle
|
|
|
|
|
ret
|
|
|
|
|
endp transform
|
|
|
|
|
|
|
|
|
|
;Multiplie la matrice de transformation %0 par celle en %1 et met les resultat en %2
|
|
|
|
|
|
|
|
|
|
; mat = p1 * p2
|
|
|
|
|
|
|
|
|
|
; mat[ 0] = (p1[ 0]*p2[ 0])+(p1[ 1]*p2[ 4])+(p1[ 2]*p2[ 8])+(p1[ 3]*p2[12]);
|
|
|
|
|
; mat[ 4] = (p1[ 4]*p2[ 0])+(p1[ 5]*p2[ 4])+(p1[ 6]*p2[ 8])+(p1[ 7]*p2[12]);
|
|
|
|
|
; mat[ 8] = (p1[ 8]*p2[ 0])+(p1[ 9]*p2[ 4])+(p1[10]*p2[ 8])+(p1[11]*p2[12]);
|
|
|
|
|
; mat[12] = (p1[12]*p2[ 0])+(p1[13]*p2[ 4])+(p1[14]*p2[ 8])+(p1[15]*p2[12]);
|
|
|
|
|
; mat[ 1] = (p1[ 0]*p2[ 1])+(p1[ 1]*p2[ 5])+(p1[ 2]*p2[ 9])+(p1[ 3]*p2[13]);
|
|
|
|
|
; mat[ 5] = (p1[ 4]*p2[ 1])+(p1[ 5]*p2[ 5])+(p1[ 6]*p2[ 9])+(p1[ 7]*p2[13]);
|
|
|
|
|
; mat[ 9] = (p1[ 8]*p2[ 1])+(p1[ 9]*p2[ 5])+(p1[10]*p2[ 9])+(p1[11]*p2[13]);
|
|
|
|
|
; mat[13] = (p1[12]*p2[ 1])+(p1[13]*p2[ 5])+(p1[14]*p2[ 9])+(p1[15]*p2[13]);
|
|
|
|
|
; mat[ 2] = (p1[ 0]*p2[ 2])+(p1[ 1]*p2[ 6])+(p1[ 2]*p2[10])+(p1[ 3]*p2[14]);
|
|
|
|
|
; mat[ 6] = (p1[ 4]*p2[ 2])+(p1[ 5]*p2[ 6])+(p1[ 6]*p2[10])+(p1[ 7]*p2[14]);
|
|
|
|
|
; mat[10] = (p1[ 8]*p2[ 2])+(p1[ 9]*p2[ 6])+(p1[10]*p2[10])+(p1[11]*p2[14]);
|
|
|
|
|
; mat[14] = (p1[12]*p2[ 2])+(p1[13]*p2[ 6])+(p1[14]*p2[10])+(p1[15]*p2[14]);
|
|
|
|
|
; mat[ 3] = (p1[ 0]*p2[ 3])+(p1[ 1]*p2[ 7])+(p1[ 2]*p2[11])+(p1[ 3]*p2[15]);
|
|
|
|
|
; mat[ 7] = (p1[ 4]*p2[ 3])+(p1[ 5]*p2[ 7])+(p1[ 6]*p2[11])+(p1[ 7]*p2[15]);
|
|
|
|
|
; mat[11] = (p1[ 8]*p2[ 3])+(p1[ 9]*p2[ 7])+(p1[10]*p2[11])+(p1[11]*p2[15]);
|
|
|
|
|
; mat[15] = (p1[12]*p2[ 3])+(p1[13]*p2[ 7])+(p1[14]*p2[11])+(p1[15]*p2[15]);
|
|
|
|
|
|
|
|
|
|
PROC multiply FAR
|
|
|
|
|
ARG @p1:word,@p2:word,@mat:word
|
|
|
|
|
USES bx,si,di
|
|
|
|
|
mov si,[@p1]
|
|
|
|
|
mov di,[@p2]
|
|
|
|
|
mov bx,[@mat]
|
|
|
|
|
;0,0
|
|
|
|
|
;p1[ 0]*p2[ 0]
|
|
|
|
|
fld [dword ptr si+0*4]
|
|
|
|
|
fmul [dword ptr di+0*4]
|
|
|
|
|
;p1[ 1]*p2[ 4]
|
|
|
|
|
fld [dword ptr si+1*4]
|
|
|
|
|
fmul [dword ptr di+4*4]
|
|
|
|
|
;(p1[ 0]*p2[ 0])+(p1[ 1]*p2[ 4])
|
|
|
|
|
faddp st(1)
|
|
|
|
|
;p1[ 2]*p2[ 8]
|
|
|
|
|
fld [dword ptr si+2*4]
|
|
|
|
|
fmul [dword ptr di+8*4]
|
|
|
|
|
;(p1[ 0]*p2[ 0])+(p1[ 1]*p2[ 4])+(p1[ 2]*p2[ 8])
|
|
|
|
|
faddp st(1)
|
|
|
|
|
;p1[ 3]*p2[12]
|
|
|
|
|
fld [dword ptr si+3*4]
|
|
|
|
|
fmul [dword ptr di+12*4]
|
|
|
|
|
;(p1[ 0]*p2[ 0])+(p1[ 1]*p2[ 4])+(p1[ 2]*p2[ 8])+(p1[ 3]*p2[12])
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fstp [dword ptr bx+0*4]
|
|
|
|
|
;mat[ 0]
|
|
|
|
|
|
|
|
|
|
;1,0
|
|
|
|
|
fld [dword ptr si+0*4]
|
|
|
|
|
fmul [dword ptr di+1*4]
|
|
|
|
|
fld [dword ptr si+1*4]
|
|
|
|
|
fmul [dword ptr di+5*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fld [dword ptr si+2*4]
|
|
|
|
|
fmul [dword ptr di+9*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fld [dword ptr si+3*4]
|
|
|
|
|
fmul [dword ptr di+13*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fstp [dword ptr bx+1*4]
|
|
|
|
|
;2,0
|
|
|
|
|
fld [dword ptr si+0*4]
|
|
|
|
|
fmul [dword ptr di+2*4]
|
|
|
|
|
fld [dword ptr si+1*4]
|
|
|
|
|
fmul [dword ptr di+6*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fld [dword ptr si+2*4]
|
|
|
|
|
fmul [dword ptr di+10*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fld [dword ptr si+3*4]
|
|
|
|
|
fmul [dword ptr di+14*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fstp [dword ptr bx+2*4]
|
|
|
|
|
;3,0
|
|
|
|
|
fld [dword ptr si+0*4]
|
|
|
|
|
fmul [dword ptr di+3*4]
|
|
|
|
|
fld [dword ptr si+1*4]
|
|
|
|
|
fmul [dword ptr di+7*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fld [dword ptr si+2*4]
|
|
|
|
|
fmul [dword ptr di+11*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fld [dword ptr si+3*4]
|
|
|
|
|
fmul [dword ptr di+15*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fstp [dword ptr bx+3*4]
|
|
|
|
|
;0,1
|
|
|
|
|
fld [dword ptr si+4*4]
|
|
|
|
|
fmul [dword ptr di+0*4]
|
|
|
|
|
fld [dword ptr si+5*4]
|
|
|
|
|
fmul [dword ptr di+4*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fld [dword ptr si+6*4]
|
|
|
|
|
fmul [dword ptr di+8*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fld [dword ptr si+7*4]
|
|
|
|
|
fmul [dword ptr di+12*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fstp [dword ptr bx+4*4]
|
|
|
|
|
;1,1
|
|
|
|
|
fld [dword ptr si+4*4]
|
|
|
|
|
fmul [dword ptr di+1*4]
|
|
|
|
|
fld [dword ptr si+5*4]
|
|
|
|
|
fmul [dword ptr di+5*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fld [dword ptr si+6*4]
|
|
|
|
|
fmul [dword ptr di+9*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fld [dword ptr si+7*4]
|
|
|
|
|
fmul [dword ptr di+13*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fstp [dword ptr bx+5*4]
|
|
|
|
|
;2,1
|
|
|
|
|
fld [dword ptr si+4*4]
|
|
|
|
|
fmul [dword ptr di+2*4]
|
|
|
|
|
fld [dword ptr si+5*4]
|
|
|
|
|
fmul [dword ptr di+6*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fld [dword ptr si+6*4]
|
|
|
|
|
fmul [dword ptr di+10*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fld [dword ptr si+7*4]
|
|
|
|
|
fmul [dword ptr di+14*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fstp [dword ptr bx+6*4]
|
|
|
|
|
;3,1
|
|
|
|
|
fld [dword ptr si+4*4]
|
|
|
|
|
fmul [dword ptr di+3*4]
|
|
|
|
|
fld [dword ptr si+5*4]
|
|
|
|
|
fmul [dword ptr di+7*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fld [dword ptr si+6*4]
|
|
|
|
|
fmul [dword ptr di+11*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fld [dword ptr si+7*4]
|
|
|
|
|
fmul [dword ptr di+15*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fstp [dword ptr bx+7*4]
|
|
|
|
|
;0,2
|
|
|
|
|
fld [dword ptr si+8*4]
|
|
|
|
|
fmul [dword ptr di+0*4]
|
|
|
|
|
fld [dword ptr si+9*4]
|
|
|
|
|
fmul [dword ptr di+4*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fld [dword ptr si+10*4]
|
|
|
|
|
fmul [dword ptr di+8*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fld [dword ptr si+11*4]
|
|
|
|
|
fmul [dword ptr di+12*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fstp [dword ptr bx+8*4]
|
|
|
|
|
;1,2
|
|
|
|
|
fld [dword ptr si+8*4]
|
|
|
|
|
fmul [dword ptr di+1*4]
|
|
|
|
|
fld [dword ptr si+9*4]
|
|
|
|
|
fmul [dword ptr di+5*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fld [dword ptr si+10*4]
|
|
|
|
|
fmul [dword ptr di+9*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fld [dword ptr si+11*4]
|
|
|
|
|
fmul [dword ptr di+13*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fstp [dword ptr bx+9*4]
|
|
|
|
|
;2,2
|
|
|
|
|
fld [dword ptr si+8*4]
|
|
|
|
|
fmul [dword ptr di+2*4]
|
|
|
|
|
fld [dword ptr si+9*4]
|
|
|
|
|
fmul [dword ptr di+6*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fld [dword ptr si+10*4]
|
|
|
|
|
fmul [dword ptr di+10*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fld [dword ptr si+11*4]
|
|
|
|
|
fmul [dword ptr di+14*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fstp [dword ptr bx+10*4]
|
|
|
|
|
;3,2
|
|
|
|
|
fld [dword ptr si+8*4]
|
|
|
|
|
fmul [dword ptr di+3*4]
|
|
|
|
|
fld [dword ptr si+9*4]
|
|
|
|
|
fmul [dword ptr di+7*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fld [dword ptr si+10*4]
|
|
|
|
|
fmul [dword ptr di+11*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fld [dword ptr si+11*4]
|
|
|
|
|
fmul [dword ptr di+15*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fstp [dword ptr bx+11*4]
|
|
|
|
|
;0,3
|
|
|
|
|
fld [dword ptr si+12*4]
|
|
|
|
|
fmul [dword ptr di+0*4]
|
|
|
|
|
fld [dword ptr si+13*4]
|
|
|
|
|
fmul [dword ptr di+4*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fld [dword ptr si+14*4]
|
|
|
|
|
fmul [dword ptr di+8*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fld [dword ptr si+15*4]
|
|
|
|
|
fmul [dword ptr di+12*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fstp [dword ptr bx+12*4]
|
|
|
|
|
;1,3
|
|
|
|
|
fld [dword ptr si+12*4]
|
|
|
|
|
fmul [dword ptr di+1*4]
|
|
|
|
|
fld [dword ptr si+13*4]
|
|
|
|
|
fmul [dword ptr di+5*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fld [dword ptr si+14*4]
|
|
|
|
|
fmul [dword ptr di+9*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fld [dword ptr si+15*4]
|
|
|
|
|
fmul [dword ptr di+13*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fstp [dword ptr bx+13*4]
|
|
|
|
|
;2,3
|
|
|
|
|
fld [dword ptr si+12*4]
|
|
|
|
|
fmul [dword ptr di+2*4]
|
|
|
|
|
fld [dword ptr si+13*4]
|
|
|
|
|
fmul [dword ptr di+6*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fld [dword ptr si+14*4]
|
|
|
|
|
fmul [dword ptr di+10*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fld [dword ptr si+15*4]
|
|
|
|
|
fmul [dword ptr di+14*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fstp [dword ptr bx+14*4]
|
|
|
|
|
;3,3
|
|
|
|
|
fld [dword ptr si+12*4]
|
|
|
|
|
fmul [dword ptr di+3*4]
|
|
|
|
|
fld [dword ptr si+13*4]
|
|
|
|
|
fmul [dword ptr di+7*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fld [dword ptr si+14*4]
|
|
|
|
|
fmul [dword ptr di+11*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fld [dword ptr si+15*4]
|
|
|
|
|
fmul [dword ptr di+15*4]
|
|
|
|
|
faddp st(1)
|
|
|
|
|
fstp [dword ptr bx+15*4]
|
|
|
|
|
ret
|
|
|
|
|
endp multiply
|