Subversion Repositories Kolibri OS

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
3969 IgorA 1
;
2
; Функции для изменения воксельной таблицы.
3
; В воксельной таблице содержатся 8 цифр,
4
; которые задают направление для расположения
5
; дочерних вокселей. Изменяя цифры в этой таблице
6
; можно получить повороты и зеркальные отображения
7
; воксельного изображения.
8
;
9
; Схема нумерации углов в таблице:
10
;     4
11
; 5       6
12
; |   7   |
13
; |   0   |
14
; 1       2
15
;     3
16
; где:
17
; 0-1 ось x
18
; 0-2 ось y
19
; 0-4 ось z
20
 
21
; поворот вокруг оси z
22
align 4
23
proc vox_obj_rot_z uses eax ebx ecx, v_obj:dword
24
	mov ebx,[v_obj]
25
	add ebx,vox_offs_tree_table
26
 
27
    ;(1)
28
    call vox_tbl_copy
29
 
30
    ;(2)
31
    ;0 -> 1   4 -> 5
32
    ;^    |   ^    |
33
    ;2 <- 3   6 <- 7
34
 
35
    mov edx,dword[eax]
36
    mov byte[eax+1],dl ;0->1
37
    mov byte[eax+3],dh ;1->3
38
    shr edx,16
39
    mov byte[eax],dl   ;2->0
40
    mov byte[eax+2],dh ;3->2
41
 
42
    mov edx,dword[eax+4]
43
    mov byte[eax+5],dl ;4->5
44
    mov byte[eax+7],dh ;5->7
45
    shr edx,16
46
    mov byte[eax+4],dl ;6->4
47
    mov byte[eax+6],dh ;7->6
48
 
49
    ;(3)
50
    call vox_tbl_paste
51
 
52
	ret
53
endp
54
 
55
; поворот вокруг оси y
56
align 4
57
proc vox_obj_rot_y uses eax ebx ecx, v_obj:dword
58
	mov ebx,[v_obj]
59
	add ebx,vox_offs_tree_table
60
 
61
    ;(1)
62
    call vox_tbl_copy
63
 
64
    ;(2)
65
    ;0 -> 4   1 -> 5
66
    ;^    |   ^    |
67
    ;2 <- 6   3 <- 7
68
 
69
	mov edx,dword[eax]
70
	mov ecx,dword[eax+4]
71
 
72
	mov byte[eax+4],dl ;0->4
73
	mov byte[eax+5],dh ;1->5
74
	shr edx,16
75
	mov byte[eax+0],dl ;2->0
76
	mov byte[eax+1],dh ;3->1
77
 
78
	mov byte[eax+6],cl ;4->6
79
	mov byte[eax+7],ch ;5->7
80
	shr ecx,16
81
	mov byte[eax+2],cl ;6->2
82
	mov byte[eax+3],ch ;7->3
83
 
84
    ;(3)
85
    call vox_tbl_paste
86
	ret
87
endp
88
 
89
; поворот вокруг оси x
90
align 4
91
proc vox_obj_rot_x uses eax ebx ecx, v_obj:dword
92
	mov ebx,[v_obj]
93
	add ebx,vox_offs_tree_table
94
 
95
    ;(1)
96
    call vox_tbl_copy
97
 
98
    ;(2)
99
    ;0 -> 4   2 -> 6
100
    ;^    |   ^    |
101
    ;1 <- 5   3 <- 7
102
 
103
	mov edx,dword[eax]
104
	mov ecx,dword[eax+4]
105
 
106
	mov byte[eax+4],dl ;0->4
107
	mov byte[eax+0],dh ;1->0
108
	shr edx,16
109
	mov byte[eax+6],dl ;2->6
110
	mov byte[eax+2],dh ;3->2
111
 
112
	mov byte[eax+5],cl ;4->5
113
	mov byte[eax+1],ch ;5->1
114
	shr ecx,16
115
	mov byte[eax+7],cl ;6->7
116
	mov byte[eax+3],ch ;7->3
117
 
118
    ;(3)
119
    call vox_tbl_paste
120
	ret
121
endp
122
 
123
 
124
;input:
125
; ebx = vox_offs_tree_table
126
align 4
127
vox_tbl_copy:
128
    ;(1)
129
    mov eax,txt_buf
130
 
131
    movzx ecx,byte[ebx]
132
    add ecx,eax
133
    mov byte[ecx],0
134
 
135
    movzx ecx,byte[ebx+1]
136
    add ecx,eax
137
    mov byte[ecx],1
138
 
139
    movzx ecx,byte[ebx+2]
140
    add ecx,eax
141
    mov byte[ecx],2
142
 
143
    movzx ecx,byte[ebx+3]
144
    add ecx,eax
145
    mov byte[ecx],3
146
 
147
    movzx ecx,byte[ebx+4]
148
    add ecx,eax
149
    mov byte[ecx],4
150
 
151
    movzx ecx,byte[ebx+5]
152
    add ecx,eax
153
    mov byte[ecx],5
154
 
155
    movzx ecx,byte[ebx+6]
156
    add ecx,eax
157
    mov byte[ecx],6
158
 
159
    movzx ecx,byte[ebx+7]
160
    add ecx,eax
161
    mov byte[ecx],7
162
    ret
163
 
164
;input:
165
; ebx = vox_offs_tree_table
166
align 4
167
vox_tbl_paste:
168
    movzx ecx,byte[eax]
169
    add ecx,ebx
170
    mov byte[ecx],0
171
 
172
    movzx ecx,byte[eax+1]
173
    add ecx,ebx
174
    mov byte[ecx],1
175
 
176
    movzx ecx,byte[eax+2]
177
    add ecx,ebx
178
    mov byte[ecx],2
179
 
180
    movzx ecx,byte[eax+3]
181
    add ecx,ebx
182
    mov byte[ecx],3
183
 
184
    movzx ecx,byte[eax+4]
185
    add ecx,ebx
186
    mov byte[ecx],4
187
 
188
    movzx ecx,byte[eax+5]
189
    add ecx,ebx
190
    mov byte[ecx],5
191
 
192
    movzx ecx,byte[eax+6]
193
    add ecx,ebx
194
    mov byte[ecx],6
195
 
196
    movzx ecx,byte[eax+7]
197
    add ecx,ebx
198
    mov byte[ecx],7
199
    ret