Subversion Repositories Kolibri OS

Rev

Rev 2748 | Rev 2883 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2748 IgorA 1
;
2
 
3
BUF_STRUCT_SIZE equ 21
4
buf2d_data equ dword[edi] ;данные буфера изображения
5
buf2d_w equ dword[edi+8] ;ширина буфера
6
buf2d_h equ dword[edi+12] ;высота буфера
7
buf2d_l equ word[edi+4]
8
buf2d_t equ word[edi+6] ;отступ сверху
9
buf2d_size_lt equ dword[edi+4] ;отступ слева и справа для буфера
10
buf2d_color equ dword[edi+16] ;цвет фона буфера
11
buf2d_bits equ byte[edi+20] ;количество бит в 1-й точке изображения
12
 
13
vox_offs_tree_table equ 4
14
vox_offs_data equ 12
15
 
16
;output:
2758 IgorA 17
; eax - (event shl 30) + position
2748 IgorA 18
align 4
2758 IgorA 19
proc get_mouse_ev_scale uses ebx ecx edx, h_br:dword, coord_x:dword, coord_y:dword, scale_obj:dword, scale_img:dword
20
	mov ecx,[scale_obj]
21
	stdcall [buf2d_vox_obj_get_img_h_3g], [h_br],ecx
22
	cmp eax,[coord_y]
23
	jle .test_x
24
	stdcall [buf2d_vox_obj_get_img_w_3g], [h_br],ecx
25
	cmp eax,[coord_x]
26
	jle .test_z
2748 IgorA 27
 
2758 IgorA 28
	.no_change:
29
	xor eax,eax
30
	jmp .end_f
2748 IgorA 31
 
2758 IgorA 32
	.test_x:
33
	mov ebx,[h_br]
34
	movzx ebx,byte[ebx+1]
35
	add eax,ebx
36
	cmp eax,[coord_y]
37
	jl .no_change
38
	stdcall [buf2d_vox_obj_get_img_w_3g], [h_br],ecx
39
	cmp eax,[coord_x]
40
	jl .no_change
41
	mov ebx,eax
42
	mov ecx,[scale_img]
43
	inc ecx
44
	shr ebx,cl
45
	xor edx,edx
46
	mov eax,[coord_x]
47
	div ebx
48
	dec ecx
49
	xor ebx,ebx
50
	inc ebx
51
	shl ebx,cl
52
	cmp eax,ebx
53
	jge @f
54
		or eax,1 shl 30
2748 IgorA 55
		jmp .end_f
56
	@@:
2758 IgorA 57
	sub eax,ebx
58
	or eax,2 shl 30
59
	jmp .end_f
2748 IgorA 60
 
2758 IgorA 61
	.test_z:
62
	mov ebx,[h_br]
63
	movzx ebx,byte[ebx]
64
	add eax,ebx
65
	cmp eax,[coord_x]
66
	jl .no_change
67
	mov ebx,[h_br]
68
	movzx ebx,byte[ebx+1]
69
	mov ecx,[scale_obj]
70
	shl ebx,cl
71
	mov ecx,[scale_img]
72
	shr ebx,cl
73
	mov eax,[coord_y]
74
	xor edx,edx
75
	div ebx
76
	;инверсия координаты y
77
	xor edx,edx
78
	inc edx
79
	shl edx,cl
80
	dec edx
81
	sub edx,eax
82
	mov eax,edx
83
	or eax,3 shl 30
2748 IgorA 84
 
85
	.end_f:
86
	ret
87
endp
88
 
89
;
90
;x0y0 - x1y0
91
;x1y0 - x1y1
92
;x0y1 - x0y0
93
;x1y1 - x0y1
94
align 4
95
proc vox_obj_rot_z uses eax ebx ecx, v_obj:dword
96
	mov ebx,[v_obj]
97
	add ebx,vox_offs_tree_table
98
	mov ecx,2
99
	cld
100
	@@:
101
		mov eax,dword[ebx]
102
		mov byte[ebx+1],al
103
		mov byte[ebx+3],ah
104
		shr eax,16
105
		mov byte[ebx],al
106
		mov byte[ebx+2],ah
107
		add ebx,4
108
		loop @b
109
	ret
110
endp
111
 
112
;
113
;y0z0 - y0z1
114
;y0z1 - y1z1
115
;y1z1 - y1z0
116
;y1z0 - y0z0
117
align 4
118
proc vox_obj_rot_x uses eax ebx ecx, v_obj:dword
119
	mov ebx,[v_obj]
120
	add ebx,vox_offs_tree_table
121
	mov eax,dword[ebx]
122
	mov ecx,dword[ebx+4]
123
 
124
	mov byte[ebx+4],al
125
	mov byte[ebx+5],ah
126
	shr eax,16
127
	mov byte[ebx+0],al
128
	mov byte[ebx+1],ah
129
 
130
	mov byte[ebx+6],cl
131
	mov byte[ebx+7],ch
132
	shr ecx,16
133
	mov byte[ebx+2],cl
134
	mov byte[ebx+3],ch
135
 
136
	ret
137
endp
138
 
139
;
140
;output:
141
; eax - число узлов в объекте v_obj
142
align 4
143
proc vox_obj_get_nodes uses edi, v_obj:dword
144
	mov edi,[v_obj]
145
	add edi,vox_offs_data
146
	xor eax,eax
147
	stdcall vox_obj_rec0
148
	ret
149
endp
150
 
2758 IgorA 151
;???
2748 IgorA 152
;input:
153
; edi - указатель на данные воксельного объекта
154
;output:
155
; eax - eax + число узлов в данных вокс. объекта
156
; edi - указатель на смещенные данные вокс. объекта
157
align 4
158
proc vox_obj_rec0
159
	inc eax
160
	cmp byte[edi+3],0 ;смотрим есть ли поддеревья
161
	je .sub_trees
162
 
163
		;рекурсивный перебор поддеревьев
164
		push ebx ecx
165
		mov bh,byte[edi+3]
166
		add edi,4
167
		mov bl,8
168
		.cycle:
169
			bt bx,8 ;тестируем только bh
170
			jnc .c_next
171
				stdcall vox_obj_rec0
172
			.c_next:
173
			shr bh,1
174
			dec bl
175
			jnz .cycle
176
		pop ecx ebx
177
 
178
		jmp .end_f
179
	.sub_trees:
180
		add edi,4
181
	.end_f:
182
	ret
183
endp
184
 
185
;
186
;output:
187
; eax - размер в байтах занимаемый объектом v_obj
188
align 4
189
proc buf2d_vox_obj_get_size, v_obj:dword
190
	stdcall vox_obj_get_nodes,[v_obj]
191
	shl eax,2
192
	add eax,vox_offs_data
193
	ret
194
endp
195
 
196
; создание вокселя в 3 этапа:
197
; 1) ищем место в структуре дерева, куда надо вставить (если ветвь существует, 2-й этап пропускаем)
198
; 2) вставляем новую ветвь с вокселем (3-й этап уже не делаем)
199
; 3) меняем цвет вокселя
200
align 4
201
proc buf2d_vox_obj_create_node, v_obj:dword,coord_x:dword,coord_y:dword,\
2758 IgorA 202
coord_z:dword,k_scale:dword,color:dword
2748 IgorA 203
pushad
204
locals
205
	p_node dd 0 ;родительский узел
206
endl
207
 
208
	mov edi,[v_obj]
209
	add edi,vox_offs_data
210
	mov esi,[k_scale]
211
	cmp esi,1
212
	jl .change
213
	; *** (1) ***
214
	.found:
215
	stdcall vox_obj_get_node_position, [v_obj],[coord_x],[coord_y],[coord_z],esi
216
	movzx bx,byte[edi+3]
217
	mov [p_node],edi
218
	add edi,4
2758 IgorA 219
 
2748 IgorA 220
	cmp eax,0
221
	je .end_1
222
	mov ecx,eax
223
	cld
2758 IgorA 224
	@@: ;цикл для пропуска предыдущих поддеревьев в узле
2748 IgorA 225
		bt bx,0 ;проверяем есть ли дочерние узлы
226
		jnc .end_0
227
			xor eax,eax
228
			stdcall vox_obj_rec0 ;в eax вычисляется число дочерних узлов, в данной ветви
229
		.end_0:
230
		shr bx,1
231
		loop @b
232
	.end_1:
233
	bt bx,0
234
	jnc .creat ;если поддерева не существует, переходим к созданию
235
	dec esi
236
	cmp esi,0
237
	jg .found
238
	jmp .change
239
 
240
	; *** (2) ***
241
	.creat:
242
	mov edx,[color] ;меняем цвет
243
	and edx,0xffffff ;для профилактики
244
	mov ecx,esi
245
	stdcall vox_obj_add_nodes_mem, [v_obj],edi,ecx ;расширяем место занимаемое объектом, для добавления новых узлов
246
	mov ebx,[p_node]
247
	cld
248
	@@:
249
		mov dword[edi],edx
250
		stdcall vox_obj_get_node_bit_mask, [v_obj],[coord_x],[coord_y],[coord_z],esi
251
		or byte[ebx+3],al
252
 
253
		mov ebx,edi
254
		add edi,4
255
		dec esi
256
		loop @b
257
	jmp .end_2
258
 
259
	; *** (3) ***
260
	.change:
261
	mov eax,[color] ;меняем цвет
262
	mov word[edi],ax
263
	shr eax,16
264
	mov byte[edi+2],al
265
 
266
	.end_2:
267
popad
268
	ret
269
endp
270
 
2758 IgorA 271
; удаление вокселя в 2 этапа:
2748 IgorA 272
; 1) ищем место в структуре дерева, где есть удаляемый узел (если ветвь не существует, выходим из функции)
2758 IgorA 273
; 2) удаляем ветвь с вокселем
2748 IgorA 274
align 4
275
proc buf2d_vox_obj_delete_node, v_obj:dword,coord_x:dword,coord_y:dword,\
276
coord_z:dword,k_scale:dword
277
pushad
278
locals
279
	p_node dd 0 ;родительский узел
280
endl
281
	mov edi,[v_obj]
282
	add edi,vox_offs_data
283
	mov esi,[k_scale]
284
	cmp esi,1
285
	jl .end_2
286
	; *** (1) ***
287
	.found:
288
	stdcall vox_obj_get_node_position, [v_obj],[coord_x],[coord_y],[coord_z],esi
289
	movzx bx,byte[edi+3]
290
	mov [p_node],edi
291
	add edi,4
292
	cmp eax,0
293
	je .end_1
294
	mov ecx,eax
295
	cld
2758 IgorA 296
	@@: ;цикл для пропуска предыдущих поддеревьев в узле
2748 IgorA 297
		bt bx,0 ;проверяем есть ли дочерние узлы
298
		jnc .end_0
299
			xor eax,eax
300
			stdcall vox_obj_rec0 ;в eax вычисляется число дочерних узлов, в данной ветви
301
		.end_0:
302
		shr bx,1
303
		loop @b
304
	.end_1:
305
	bt bx,0
306
	jnc .end_2 ;если поддерева не существует
307
	dec esi
308
	cmp esi,0
309
	jg .found
310
 
311
	; *** (2) ***
312
	;delete
313
	stdcall vox_obj_del_nodes_mem, [v_obj],edi ;сужаем место занимаемое объектом, при удалении узла
314
	mov ebx,[p_node]
315
 
316
	stdcall vox_obj_get_node_bit_mask, [v_obj],[coord_x],[coord_y],[coord_z],esi
317
	xor byte[ebx+3],al
318
 
319
	.end_2:
320
popad
321
	ret
322
endp
323
 
324
; сдвигает узлы для добавления новых узлов
325
;input:
326
; p_insert - позиция для вставки
327
; count - колличество вставляемых узлов
328
align 4
329
proc vox_obj_add_nodes_mem uses eax ecx edi esi, v_obj:dword,p_insert:dword,count:dword
330
	stdcall buf2d_vox_obj_get_size,[v_obj]
331
	mov esi,[v_obj]
332
	add esi,eax ;esi - указатель на конец файла
333
	mov edi,[count]
334
	shl edi,2
335
	add edi,esi ;edi - указатель на будущий конец файла
336
	mov ecx,esi
337
	sub ecx,[p_insert]
338
	shr ecx,2 ;ecx - число циклов для копирования
339
	sub esi,4 ;esi - указатель на последний узел
340
	sub edi,4 ;edi - указатель на будущий последний узел
341
	std
342
	rep movsd ;сдвигаем память
343
	ret
344
endp
345
 
346
;input:
347
; p_insert - позиция для ...
348
align 4
349
proc vox_obj_del_nodes_mem uses eax ecx edi esi, v_obj:dword,p_insert:dword
350
	stdcall buf2d_vox_obj_get_size,[v_obj]
351
	mov ecx,eax
352
	mov edi,[p_insert]
353
	add ecx,[v_obj]
354
	sub ecx,edi
355
	xor eax,eax
356
	stdcall vox_obj_rec0
357
	shr ecx,2
358
	sub ecx,eax ;ecx - число циклов для копирования
359
	shl eax,2
360
	add eax,[p_insert]
361
	mov esi,eax
362
	mov edi,[p_insert]
363
	cld
364
	rep movsd ;сдвигаем память
365
	ret
366
endp
367
 
2758 IgorA 368
;???
2748 IgorA 369
; определение позиции узла в дереве (от 0 до 7)
370
align 4
371
proc vox_obj_get_node_position uses ebx ecx edi, v_obj:dword,\
372
coord_x:dword,coord_y:dword,coord_z:dword,k_scale:dword
373
	mov ecx,[k_scale]
374
	dec ecx
375
	mov eax,[coord_x]
376
	mov ebx,[coord_y]
377
	mov edi,[coord_z]
378
	cmp ecx,1
379
	jl .end_0
380
		shr eax,cl
381
		shr ebx,cl
382
		shr edi,cl
383
	.end_0:
384
	and eax,1
385
	bt ebx,0
386
	jnc @f
387
		bts eax,1
388
	@@:
389
	bt edi,0
390
	jnc @f
391
		bts eax,2
392
	@@:
393
 
394
	mov edi,[v_obj]
395
	add edi,vox_offs_tree_table
396
	@@:
397
		cmp al,byte[edi]
398
		je @f
399
		inc edi
400
		jmp @b
401
	@@:
402
	sub edi,[v_obj]
403
	sub edi,vox_offs_tree_table
404
	mov eax,edi
405
 
406
	ret
407
endp
408
 
409
;output:
410
; eax - 1,2,4,8,16, ... ,128
411
align 4
412
proc vox_obj_get_node_bit_mask uses ebx ecx edi, v_obj:dword,\
413
coord_x:dword,coord_y:dword,coord_z:dword,k_scale:dword
414
	mov ecx,[k_scale]
415
	dec ecx
416
	mov eax,[coord_x]
417
	mov ebx,[coord_y]
418
	mov edi,[coord_z]
419
	cmp ecx,1
420
	jl .end_0
421
		shr eax,cl
422
		shr ebx,cl
423
		shr edi,cl
424
	.end_0:
425
	and eax,1
426
	bt ebx,0
427
	jnc @f
428
		bts eax,1
429
	@@:
430
	bt edi,0
431
	jnc @f
432
		bts eax,2
433
	@@:
434
 
435
	mov ecx,[v_obj]
436
	add ecx,vox_offs_tree_table
437
	@@:
438
		cmp al,byte[ecx]
439
		je @f
440
		inc ecx
441
		jmp @b
442
	@@:
443
	mov eax,1 ;устанавливаем первоначальное значение бита
444
	sub ecx,[v_obj]
445
	sub ecx,vox_offs_tree_table
446
	jz @f
447
		shl eax,cl ;сдвигаем бит
448
	@@:
449
 
450
	ret
451
endp
452
 
453
;функция для рисования палитры
454
align 4
455
proc buf2d_draw_palete, buf:dword, coord_x:dword, coord_y:dword,\
456
cell_w:dword, cell_h:dword, colors_w:dword, colors:dword
457
pushad
458
	mov ebx,[coord_x]
459
	mov edx,[coord_y]
460
	mov ecx,[colors]
461
	xor edi,edi
462
	mov esi,[cell_h]
463
	cld
464
	.cycle_0:
465
		stdcall get_palete_color, ecx,3
466
		stdcall [buf2d_filled_rect_by_size], [buf], ebx,edx, [cell_w],esi,eax
467
		inc edi
468
		cmp edi,[colors_w]
469
		jl @f
470
			mov ebx,[coord_x]
471
			sub ebx,[cell_w]
472
			dec ebx
473
			add edx,esi ;высота ячейки
474
			inc edx ;отступ между ячейками
475
			xor edi,edi
476
		@@:
477
		add ebx,[cell_w]
478
		inc ebx
479
		loop .cycle_0
480
popad
481
	ret
482
endp
483
 
484
;input:
485
; если r = 1 то функция возвращает 8 цветов, 2 - 64, 3 - 512
486
;output:
487
; eax - color
488
align 4
489
proc get_palete_color uses ebx ecx edx edi, ind:dword, r:dword
490
	mov ecx,[r]
491
	xor edi,edi
492
	inc edi
493
 
494
	mov ebx,[ind]
495
	;b = b xor (b shr 1)
496
	;преобразуем индекс в кодировку Грея для получения более плавных цветовых переходов
497
	mov eax,ebx
498
	shr eax,1
499
	xor ebx,eax
500
 
501
	mov edx,ebx
502
	shr edx,cl
503
	mov eax,edx
504
	shr eax,cl
505
 
506
	mov ch,8
507
	sub ch,cl
508
	shr ecx,8
509
	shl ebx,cl
510
	shl edx,cl
511
	shl eax,cl
512
 
513
	shl edi,cl
514
	dec edi ;edi - 1...1b
515
 
516
	or ebx,edi
517
	or edx,edi
518
	or eax,edi
519
 
520
	shl eax,8
521
	mov al,dl
522
	shl eax,8
523
	mov al,bl
524
	and eax,0xffffff
525
	ret
526
endp
527