Subversion Repositories Kolibri OS

Rev

Rev 2758 | 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
 
2883 IgorA 324
; взять цвет вокселя в 2 этапа:
325
; 1) ищем место в структуре дерева, где есть узел (если ветвь не существует, выходим из функции)
326
; 2) берем цвет вокселя
327
;output:
328
; eax - цвет вокселя
329
align 4
330
proc buf2d_vox_obj_node_get_color, v_obj:dword,coord_x:dword,coord_y:dword,\
331
coord_z:dword,k_scale:dword
332
push ebx ecx edi esi
333
locals
334
	p_node dd 0 ;родительский узел
335
endl
336
	mov edi,[v_obj]
337
	add edi,vox_offs_data
338
	mov esi,[k_scale]
339
	cmp esi,1
340
	jl .end_2
341
	; *** (1) ***
342
	.found:
343
	stdcall vox_obj_get_node_position, [v_obj],[coord_x],[coord_y],[coord_z],esi
344
	movzx bx,byte[edi+3]
345
	mov [p_node],edi
346
	add edi,4
347
	cmp eax,0
348
	je .end_1
349
	mov ecx,eax
350
	cld
351
	@@: ;цикл для пропуска предыдущих поддеревьев в узле
352
		bt bx,0 ;проверяем есть ли дочерние узлы
353
		jnc .end_0
354
			xor eax,eax
355
			stdcall vox_obj_rec0 ;в eax вычисляется число дочерних узлов, в данной ветви
356
		.end_0:
357
		shr bx,1
358
		loop @b
359
	.end_1:
360
	bt bx,0
361
	jnc .end_2 ;если поддерева не существует
362
	dec esi
363
	cmp esi,0
364
	jg .found
365
 
366
	; *** (2) ***
367
	;get
368
		mov eax,dword[edi]
369
		and eax,0xffffff
370
		jmp .end_3
371
	.end_2:
372
		mov eax,1 shl 31
373
	.end_3:
374
pop esi edi ecx ebx
375
	ret
376
endp
377
 
2748 IgorA 378
; сдвигает узлы для добавления новых узлов
379
;input:
380
; p_insert - позиция для вставки
381
; count - колличество вставляемых узлов
382
align 4
383
proc vox_obj_add_nodes_mem uses eax ecx edi esi, v_obj:dword,p_insert:dword,count:dword
384
	stdcall buf2d_vox_obj_get_size,[v_obj]
385
	mov esi,[v_obj]
386
	add esi,eax ;esi - указатель на конец файла
387
	mov edi,[count]
388
	shl edi,2
389
	add edi,esi ;edi - указатель на будущий конец файла
390
	mov ecx,esi
391
	sub ecx,[p_insert]
392
	shr ecx,2 ;ecx - число циклов для копирования
393
	sub esi,4 ;esi - указатель на последний узел
394
	sub edi,4 ;edi - указатель на будущий последний узел
395
	std
396
	rep movsd ;сдвигаем память
397
	ret
398
endp
399
 
400
;input:
401
; p_insert - позиция для ...
402
align 4
403
proc vox_obj_del_nodes_mem uses eax ecx edi esi, v_obj:dword,p_insert:dword
404
	stdcall buf2d_vox_obj_get_size,[v_obj]
405
	mov ecx,eax
406
	mov edi,[p_insert]
407
	add ecx,[v_obj]
408
	sub ecx,edi
409
	xor eax,eax
410
	stdcall vox_obj_rec0
411
	shr ecx,2
412
	sub ecx,eax ;ecx - число циклов для копирования
413
	shl eax,2
414
	add eax,[p_insert]
415
	mov esi,eax
416
	mov edi,[p_insert]
417
	cld
418
	rep movsd ;сдвигаем память
419
	ret
420
endp
421
 
2758 IgorA 422
;???
2748 IgorA 423
; определение позиции узла в дереве (от 0 до 7)
424
align 4
425
proc vox_obj_get_node_position uses ebx ecx edi, v_obj:dword,\
426
coord_x:dword,coord_y:dword,coord_z:dword,k_scale:dword
427
	mov ecx,[k_scale]
428
	dec ecx
429
	mov eax,[coord_x]
430
	mov ebx,[coord_y]
431
	mov edi,[coord_z]
432
	cmp ecx,1
433
	jl .end_0
434
		shr eax,cl
435
		shr ebx,cl
436
		shr edi,cl
437
	.end_0:
438
	and eax,1
439
	bt ebx,0
440
	jnc @f
441
		bts eax,1
442
	@@:
443
	bt edi,0
444
	jnc @f
445
		bts eax,2
446
	@@:
447
 
448
	mov edi,[v_obj]
449
	add edi,vox_offs_tree_table
450
	@@:
451
		cmp al,byte[edi]
452
		je @f
453
		inc edi
454
		jmp @b
455
	@@:
456
	sub edi,[v_obj]
457
	sub edi,vox_offs_tree_table
458
	mov eax,edi
459
 
460
	ret
461
endp
462
 
463
;output:
464
; eax - 1,2,4,8,16, ... ,128
465
align 4
466
proc vox_obj_get_node_bit_mask uses ebx ecx edi, v_obj:dword,\
467
coord_x:dword,coord_y:dword,coord_z:dword,k_scale:dword
468
	mov ecx,[k_scale]
469
	dec ecx
470
	mov eax,[coord_x]
471
	mov ebx,[coord_y]
472
	mov edi,[coord_z]
473
	cmp ecx,1
474
	jl .end_0
475
		shr eax,cl
476
		shr ebx,cl
477
		shr edi,cl
478
	.end_0:
479
	and eax,1
480
	bt ebx,0
481
	jnc @f
482
		bts eax,1
483
	@@:
484
	bt edi,0
485
	jnc @f
486
		bts eax,2
487
	@@:
488
 
489
	mov ecx,[v_obj]
490
	add ecx,vox_offs_tree_table
491
	@@:
492
		cmp al,byte[ecx]
493
		je @f
494
		inc ecx
495
		jmp @b
496
	@@:
497
	mov eax,1 ;устанавливаем первоначальное значение бита
498
	sub ecx,[v_obj]
499
	sub ecx,vox_offs_tree_table
500
	jz @f
501
		shl eax,cl ;сдвигаем бит
502
	@@:
503
 
504
	ret
505
endp
506
 
507
;функция для рисования палитры
508
align 4
509
proc buf2d_draw_palete, buf:dword, coord_x:dword, coord_y:dword,\
510
cell_w:dword, cell_h:dword, colors_w:dword, colors:dword
511
pushad
512
	mov ebx,[coord_x]
513
	mov edx,[coord_y]
514
	mov ecx,[colors]
515
	xor edi,edi
516
	mov esi,[cell_h]
517
	cld
518
	.cycle_0:
519
		stdcall get_palete_color, ecx,3
520
		stdcall [buf2d_filled_rect_by_size], [buf], ebx,edx, [cell_w],esi,eax
521
		inc edi
522
		cmp edi,[colors_w]
523
		jl @f
524
			mov ebx,[coord_x]
525
			sub ebx,[cell_w]
526
			dec ebx
527
			add edx,esi ;высота ячейки
528
			inc edx ;отступ между ячейками
529
			xor edi,edi
530
		@@:
531
		add ebx,[cell_w]
532
		inc ebx
533
		loop .cycle_0
534
popad
535
	ret
536
endp
537
 
538
;input:
539
; если r = 1 то функция возвращает 8 цветов, 2 - 64, 3 - 512
540
;output:
541
; eax - color
542
align 4
543
proc get_palete_color uses ebx ecx edx edi, ind:dword, r:dword
544
	mov ecx,[r]
545
	xor edi,edi
546
	inc edi
547
 
548
	mov ebx,[ind]
549
	;b = b xor (b shr 1)
550
	;преобразуем индекс в кодировку Грея для получения более плавных цветовых переходов
551
	mov eax,ebx
552
	shr eax,1
553
	xor ebx,eax
554
 
555
	mov edx,ebx
556
	shr edx,cl
557
	mov eax,edx
558
	shr eax,cl
559
 
560
	mov ch,8
561
	sub ch,cl
562
	shr ecx,8
563
	shl ebx,cl
564
	shl edx,cl
565
	shl eax,cl
566
 
567
	shl edi,cl
568
	dec edi ;edi - 1...1b
569
 
570
	or ebx,edi
571
	or edx,edi
572
	or eax,edi
573
 
574
	shl eax,8
575
	mov al,dl
576
	shl eax,8
577
	mov al,bl
578
	and eax,0xffffff
579
	ret
580
endp
581