Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
2897 IgorA 1
use32
2
	org 0x0
3
	db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт
6175 IgorA 4
	dd 1,start,i_end,mem,stacktop,0,sys_path
2897 IgorA 5
 
6
include '../../../../programs/macros.inc'
7
include '../../../../programs/proc32.inc'
6175 IgorA 8
include '../../../../programs/KOSfuncs.inc'
6259 IgorA 9
include '../../../../programs/load_img.inc'
5388 IgorA 10
include '../trunk/str.inc'
2897 IgorA 11
 
3969 IgorA 12
vox_offs_tree_table equ 4
13
vox_offs_data equ 12
14
txt_buf rb 8
15
include '../trunk/vox_rotate.inc'
16
 
2897 IgorA 17
@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load
6259 IgorA 18
caption db 'Voxel creator 19.02.16',0 ;подпись окна
2897 IgorA 19
 
20
BUF_STRUCT_SIZE equ 21
21
buf2d_data equ dword[edi] ;данные буфера изображения
22
buf2d_w equ dword[edi+8] ;ширина буфера
23
buf2d_h equ dword[edi+12] ;высота буфера
24
buf2d_l equ word[edi+4]
25
buf2d_t equ word[edi+6] ;отступ сверху
26
buf2d_size_lt equ dword[edi+4] ;отступ слева и справа для буфера
27
buf2d_color equ dword[edi+16] ;цвет фона буфера
28
buf2d_bits equ byte[edi+20] ;количество бит в 1-й точке изображения
29
 
30
vox_offs_tree_table equ 4
31
vox_offs_data equ 12
32
 
33
run_file_70 FileInfoBlock
34
vox_obj_size dd 0 ;размер воксельного объекта (для ускорения вставки)
2915 IgorA 35
txt_space db ' ',0
36
txt_pref db ' б ',0,' Кб',0,' Мб',0,' Гб',0 ;приставки: кило, мега, гига
37
txt_f_size: db 'Размер: '
38
.size: rb 16
2897 IgorA 39
 
40
fn_toolbar db 'toolbar.png',0
41
IMAGE_TOOLBAR_ICON_SIZE equ 16*16*3
42
image_data_toolbar dd 0
43
 
44
max_open_file_size equ 1024*1024 ;1 Mb
45
 
46
align 4
47
start:
48
	load_libraries l_libs_start,l_libs_end
49
	;проверка на сколько удачно загузилась библиотека
50
	mov	ebp,lib_0
51
	cmp	dword [ebp+ll_struc_size-4],0
52
	jz	@f
6175 IgorA 53
		mcall SF_TERMINATE_PROCESS
2897 IgorA 54
	@@:
6175 IgorA 55
	mcall SF_STYLE_SETTINGS,SSF_GET_COLORS,sc,sizeof.system_colors
56
	mcall SF_SET_EVENTS_MASK,0x27
2897 IgorA 57
	stdcall [OpenDialog_Init],OpenDialog_data ;подготовка диалога
58
 
59
	stdcall [buf2d_create], buf_0 ;создание буфера
60
	stdcall [buf2d_create], buf_0z
61
	stdcall [buf2d_vox_brush_create], buf_vox, vox_6_7_z
62
 
6259 IgorA 63
	load_image_file fn_toolbar, image_data_toolbar
2897 IgorA 64
 
65
	stdcall mem.Alloc,max_open_file_size
66
	mov dword[open_file_vox],eax
67
	stdcall mem.Alloc,max_open_file_size
68
	mov dword[open_file_img],eax
69
 
6175 IgorA 70
	mcall SF_SYSTEM_GET,SSF_TIME_COUNT
2897 IgorA 71
	mov [last_time],eax
72
 
73
align 4
74
red_win:
75
	call draw_window
76
 
77
align 4
78
still:
6175 IgorA 79
	mcall SF_SYSTEM_GET,SSF_TIME_COUNT
2897 IgorA 80
	mov ebx,[last_time]
81
	add ebx,10 ;задержка
82
	cmp ebx,eax
83
	jge @f
84
		mov ebx,eax
85
	@@:
86
	sub ebx,eax
6175 IgorA 87
	mcall SF_WAIT_EVENT_TIMEOUT
2897 IgorA 88
	cmp eax,0
89
	je timer_funct
90
 
91
	cmp al,1
92
	jz red_win
93
	cmp al,2
94
	jz key
95
	cmp al,3
96
	jz button
97
 
98
	jmp still
99
 
100
align 4
101
timer_funct:
102
	cmp byte[calc],0
103
	je still
104
 
105
	pushad
6175 IgorA 106
	mcall SF_SYSTEM_GET,SSF_TIME_COUNT
2897 IgorA 107
	mov [last_time],eax
108
 
109
	; скидываем указатели буферов buf_npl_p, buf_npl, buf_npl_n
110
	mov edi,buf_npl_p
111
	mov eax,buf2d_data
112
	mov edi,buf_npl
113
	mov ebx,buf2d_data
114
	mov edi,buf_npl_n
115
	mov ecx,buf2d_data
116
	; change buffer data pointers
117
	mov buf2d_data,eax
118
	mov edi,buf_npl_p
119
	mov buf2d_data,ebx
120
	mov edi,buf_npl
121
	mov buf2d_data,ecx
122
 
123
	mov eax,[n_plane]
124
	mov ebx,buf2d_w
125
	dec ebx
126
 
127
	cmp ebx,eax
128
	jg @f
129
		stdcall create_obj_from_plane,buf_npl,eax ;создаем завершающее сечение
130
		;вывод конечного результата
131
		call draw_object
132
		mov byte[calc],0
133
		jmp .end_f
134
	@@:
135
 
136
	inc eax
137
	stdcall create_plane, buf_npl_n,eax
138
 
139
	; создание воскельного сечения на основе буфера buf_npl
140
	mov edi,buf_npl
141
	mov edx,[bby_min] ;0
142
	.cycle_0:
143
	mov ecx,[btx_min] ;0
144
	.cycle_1:
145
		stdcall [buf2d_get_pixel], edi,ecx,edx
146
		cmp eax,buf2d_color
147
		je @f
148
			mov esi,eax
149
			call need_node
150
			cmp eax,buf2d_color
151
			jne @f ;отсеиваем внутренние воксели, для оптимизации модели
152
			mov eax,ebx
153
			sub eax,edx
154
			stdcall buf2d_vox_obj_create_node, [open_file_vox],ecx,[n_plane],\
155
				eax,[k_scale],esi
156
		@@:
157
		inc ecx
158
		cmp ecx,ebx
159
		jle .cycle_1
160
		inc edx
161
		cmp edx,ebx
162
		jle .cycle_0
163
 
164
	stdcall [buf2d_draw], buf_npl
165
	inc dword[n_plane] ;перемещаем плоскость сечения
2915 IgorA 166
	call draw_pok
2897 IgorA 167
	.end_f:
168
	popad
169
	jmp still
170
 
171
align 4
172
proc create_plane, buf_img:dword, n_plane:dword
173
	pushad
174
	; копируем лицевое изображение в буфер buf_img
175
	; bby_min - используем для оптимизации (если сверху изображение пустое)
176
	mov eax,[bby_min]
177
	mov esi,buf_i2
178
	mov esi,[esi] ;buf2d_data
179
	mov edi,[buf_img]
180
	mov ecx,buf2d_w
181
	imul eax,ecx
182
	mov ebx,ecx
183
	imul ecx,ebx
184
	sub ecx,eax
185
	lea ecx,[ecx+ecx*2]
186
	mov edi,buf2d_data
187
	lea eax,[eax+eax*2]
188
	add edi,eax
189
	add esi,eax
190
	cld
191
	rep movsb
192
 
193
	mov ecx,ebx
194
	dec ebx
195
	mov edi,buf_i0
196
	.cycle_0:
197
		mov eax,ebx
198
		sub eax,[n_plane] ;eax - перевернутая координата n_plane
199
		stdcall [buf2d_get_pixel], edi,ecx,eax ;[n_plane]
200
		cmp eax,buf2d_color
201
		jne @f
202
			;вычеркивание вертикальной линии из сечения buf_img
203
			stdcall [buf2d_line], [buf_img],ecx,[bby_min],ecx,ebx, buf2d_color
204
			jmp .end_1
205
		@@:
206
			mov edx,[bby_min] ;xor edx,edx
207
			mov esi,eax
208
			.cycle_1: ;цикл для наложения верхней текстуры
209
			stdcall [buf2d_get_pixel], [buf_img],ecx,edx
210
			cmp eax, buf2d_color
211
			je .end_0
212
				stdcall [buf2d_set_pixel], [buf_img],ecx,edx, esi ;наложение верхней текстуры
213
				jmp .end_1
214
			.end_0:
215
			inc edx
216
			cmp edx,ebx
217
			jle .cycle_1
218
		.end_1:
219
		loop .cycle_0
220
 
221
	;горизонтальные линии на основе боковой грани
222
	mov ecx,[bby_min]
223
	mov edi,buf_i1
224
	.cycle_2:
225
		stdcall [buf2d_get_pixel], edi,[n_plane],ecx
226
		cmp eax,buf2d_color
227
		jne @f
228
			;вычеркивание горизонтальной линии из сечения buf_img
229
			stdcall [buf2d_line], [buf_img],[btx_min],ecx,[btx_max],ecx, buf2d_color
230
			jmp .end_3
231
		@@:
232
			mov edx,[btx_max] ;ebx
233
			mov esi,eax
234
			.cycle_3: ;цикл для наложения боковой текстуры
235
			stdcall [buf2d_get_pixel], [buf_img],edx,ecx
236
			cmp eax, buf2d_color
237
			je .end_2
238
				stdcall [buf2d_set_pixel], [buf_img],edx,ecx, esi ;наложение боковой текстуры
239
				jmp .end_3
240
			.end_2:
241
			dec edx
242
			cmp edx,[btx_min]
243
			jge .cycle_3
244
		.end_3:
245
		inc ecx
246
		cmp ecx,ebx
247
		jle .cycle_2
248
	popad
249
	ret
250
endp
251
 
252
align 4
253
proc create_obj_from_plane, buf_img:dword, n_plane:dword
254
pushad
255
	; создание воскельного сечения на основе буфера buf_img
256
	mov edi,[buf_img]
257
	mov ebx,buf2d_w
258
	dec ebx
259
	mov edx,[bby_min] ;0
260
	.cycle_0:
261
	mov ecx,[btx_min] ;0
262
	.cycle_1:
263
		stdcall [buf2d_get_pixel], edi,ecx,edx
264
		cmp eax,buf2d_color
265
		je @f
266
			mov esi,eax
267
			;call need_node
268
			;cmp eax,buf2d_color
269
			;jne @f ;отсеиваем внутренние воксели, для оптимизации модели
270
			mov eax,ebx
271
			sub eax,edx
272
			stdcall buf2d_vox_obj_create_node, [open_file_vox],ecx,[n_plane],\
273
				eax,[k_scale],esi
274
		@@:
275
		inc ecx
276
		cmp ecx,ebx
277
		jle .cycle_1
278
		inc edx
279
		cmp edx,ebx
280
		jle .cycle_0
281
	ret
282
popad
283
endp
284
 
285
;description:
286
; функция проверяет нужно ли отсеивать воксель с координатами [n_plane],ecx,edx
287
;input:
288
; ebx = max size y - 1
289
;output:
290
; eax = buf2d_color if node need
291
align 4
292
need_node:
293
	mov eax,buf2d_color
294
	cmp ecx,[btx_min] ;0
295
	jle .end_f
296
	cmp ecx,[btx_max] ;0
297
	jge .end_f
298
	cmp edx,[bby_min] ;0
299
	jle .end_f
300
	cmp edx,ebx ;max-1
301
	jge .end_f
302
		push ecx edx
303
		stdcall [buf2d_get_pixel], buf_npl_p,ecx,edx ;проверка предыдущего сечения
304
		cmp eax,buf2d_color
305
		je @f
306
		stdcall [buf2d_get_pixel], buf_npl_n,ecx,edx ;проверка последующего сечения
307
		cmp eax,buf2d_color
308
		je @f
309
		dec ecx
310
		stdcall [buf2d_get_pixel], edi,ecx,edx
311
		cmp eax,buf2d_color
312
		je @f
313
		add ecx,2
314
		stdcall [buf2d_get_pixel], edi,ecx,edx
315
		cmp eax,buf2d_color
316
		je @f
317
		dec ecx
318
		dec edx
319
		stdcall [buf2d_get_pixel], edi,ecx,edx
320
		cmp eax,buf2d_color
321
		je @f
322
		add edx,2
323
		stdcall [buf2d_get_pixel], edi,ecx,edx
324
		;cmp eax,buf2d_color
325
		;je @f
326
		@@:
327
		pop edx ecx
328
	.end_f:
329
	ret
330
 
331
align 4
332
draw_window:
333
pushad
6175 IgorA 334
	mcall SF_REDRAW,SSF_BEGIN_DRAW
2897 IgorA 335
 
336
	; *** рисование главного окна (выполняется 1 раз при запуске) ***
337
	mov edx,[sc.work]
338
	or  edx,(3 shl 24)+0x30000000
6175 IgorA 339
	mcall SF_CREATE_WINDOW,(20 shl 16)+410,(20 shl 16)+520,,,caption
2897 IgorA 340
 
341
	; *** создание кнопок на панель ***
342
	mov esi,[sc.work_button]
6175 IgorA 343
	mcall SF_DEFINE_BUTTON,(5 shl 16)+20,(5 shl 16)+20,3
2897 IgorA 344
 
345
	mov ebx,(30 shl 16)+20
346
	mov edx,4
347
	int 0x40
348
 
349
	mov ebx,(55 shl 16)+20
350
	mov edx,5
351
	int 0x40
352
 
353
	mov ebx,(85 shl 16)+20
354
	mov edx,6
355
	int 0x40
356
 
357
	add ebx,25 shl 16
358
	mov edx,7
359
	int 0x40
360
 
361
	add ebx,25 shl 16
362
	mov edx,8
363
	int 0x40
364
 
365
	add ebx,25 shl 16
366
	mov edx,9
367
	int 0x40
368
 
369
	add ebx,25 shl 16
370
	mov edx,10
371
	int 0x40
372
 
373
	add ebx,25 shl 16
374
	mov edx,11
375
	int 0x40
376
 
377
	add ebx,25 shl 16
378
	mov edx,12
379
	int 0x40
380
 
381
	; *** рисование иконок на кнопках ***
382
	mov edx,(7 shl 16)+7 ;icon new
6175 IgorA 383
	mcall SF_PUT_IMAGE,[image_data_toolbar],(16 shl 16)+16
2897 IgorA 384
 
385
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
386
	add edx,(25 shl 16) ;icon open
387
	int 0x40
388
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
389
	add edx,(25 shl 16) ;icon save
390
	int 0x40
391
 
392
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
393
	add edx,(30 shl 16) ;
394
	int 0x40
395
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
396
	add edx,(25 shl 16) ;
397
	int 0x40
398
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
399
	add edx,(25 shl 16) ;
400
	int 0x40
401
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
402
	add edx,(25 shl 16) ;
403
	int 0x40
404
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
405
	add edx,(25 shl 16) ;
406
	int 0x40
407
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
408
	add edx,(25 shl 16) ;
409
	int 0x40
410
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
411
	add edx,(25 shl 16) ;
412
	int 0x40
413
 
414
	call draw_buffers
2915 IgorA 415
	call draw_pok
2897 IgorA 416
 
6175 IgorA 417
	mcall SF_REDRAW,SSF_END_DRAW
2897 IgorA 418
popad
419
	ret
420
 
421
align 4
422
draw_buffers:
423
	; *** рисование буфера ***
424
	stdcall [buf2d_draw], buf_0
425
	stdcall [buf2d_draw], buf_i0
426
	stdcall [buf2d_draw], buf_i1
427
	stdcall [buf2d_draw], buf_i2
428
	ret
429
 
430
align 4
2915 IgorA 431
draw_pok:
432
	;обновление подписи размера файла
433
	mov edi,txt_f_size.size
434
	mov eax,dword[vox_obj_size]
435
	mov ebx,txt_pref
436
	.cycle:
437
		cmp eax,1024
438
		jl @f
439
		shr eax,10
440
		add ebx,4
441
		jmp .cycle
442
	@@:
3969 IgorA 443
 
5388 IgorA 444
	stdcall convert_int_to_str, 16
2915 IgorA 445
	stdcall str_cat, edi,ebx
446
	stdcall str_cat, edi,txt_space ;завершающий пробел
447
 
5388 IgorA 448
	;рисование текста
2915 IgorA 449
	mov ecx,[sc.work_text]
450
	or  ecx,0x80000000 or (1 shl 30)
451
	mov edi,[sc.work] ;цвет фона окна
6175 IgorA 452
	mcall SF_DRAW_TEXT,(275 shl 16)+7,,txt_f_size
2915 IgorA 453
 
454
	ret
455
 
456
align 4
2897 IgorA 457
key:
6175 IgorA 458
	mcall SF_GET_KEY
2897 IgorA 459
	jmp still
460
 
461
 
462
align 4
463
button:
6175 IgorA 464
	mcall SF_GET_BUTTON
2897 IgorA 465
	cmp ah,3
466
	jne @f
467
		call but_new_file
468
	@@:
469
	cmp ah,4
470
	jne @f
471
		call but_open_file
472
	@@:
473
	cmp ah,5
474
	jne @f
475
		call but_save_file
476
	@@:
477
	cmp ah,6
478
	jne @f
479
		call but_1
480
	@@:
481
	cmp ah,7
482
	jne @f
483
		call but_2
484
	@@:
485
	cmp ah,8
486
	jne @f
487
		call but_3
488
	@@:
489
	cmp ah,9
490
	jne @f
491
		stdcall but_run, 0
492
	@@:
493
	cmp ah,10
494
	jne @f
495
		stdcall but_run, 1
496
	@@:
497
	cmp ah,11
498
	jne @f
499
		call but_5
500
	@@:
501
	cmp ah,12
502
	jne @f
503
		call but_rot_z
504
	@@:
505
	cmp ah,1
506
	jne still
507
.exit:
508
	stdcall [buf2d_delete],buf_0
509
	stdcall [buf2d_delete],buf_0z
510
	stdcall [buf2d_vox_brush_delete],buf_vox
511
	stdcall [buf2d_delete],buf_i0
512
	stdcall [buf2d_delete],buf_i1
513
	stdcall [buf2d_delete],buf_i2
514
	stdcall [buf2d_delete],buf_npl_p
515
	stdcall [buf2d_delete],buf_npl
516
	stdcall [buf2d_delete],buf_npl_n
517
	stdcall mem.Free,[image_data_toolbar]
518
	stdcall mem.Free,[open_file_vox]
519
	stdcall mem.Free,[open_file_img]
6175 IgorA 520
	mcall SF_TERMINATE_PROCESS
2897 IgorA 521
 
522
 
523
align 4
524
vox_new_data:
525
	db 2,0,0,0
526
	db 000b,001b,010b,011b, 100b,101b,110b,111b ;default table
527
	dd 0 ;null node
528
 
529
align 4
530
proc but_new_file uses ecx edi esi
531
	mov ecx,vox_offs_data+4
532
	mov [vox_obj_size],ecx
533
	mov esi,vox_new_data
534
	mov edi,[open_file_vox]
535
	cld
536
	rep movsb
537
	ret
538
endp
539
 
540
align 4
541
open_file_vox dd 0 ;указатель на память для открытия файлов
542
open_file_img dd 0 ;указатель на память для открытия текстур
543
 
544
align 4
545
but_open_file:
546
	pushad
547
	copy_path open_dialog_name,communication_area_default_path,file_name,0
548
	mov [OpenDialog_data.type],0
549
	stdcall [OpenDialog_Start],OpenDialog_data
550
	cmp [OpenDialog_data.status],2
551
	je .end_open_file
552
	;код при удачном открытии диалога
553
 
6259 IgorA 554
	mov [run_file_70.Function], SSF_READ_FILE
2897 IgorA 555
	mov [run_file_70.Position], 0
556
	mov [run_file_70.Flags], 0
557
	mov [run_file_70.Count], dword max_open_file_size
558
	m2m [run_file_70.Buffer],dword[open_file_vox]
559
	mov byte[run_file_70+20], 0
560
	mov dword[run_file_70.FileName], openfile_path
6259 IgorA 561
	mcall SF_FILE,run_file_70
2897 IgorA 562
	cmp ebx,0xffffffff
563
	je .end_open_file
564
		; проверка на правильность воксельного формата
565
		mov edi,[open_file_vox]
566
		add edi,vox_offs_tree_table
567
		xor bx,bx
568
		mov ecx,8
569
		cld
570
		@@:
571
			movzx ax,byte[edi]
572
			add bx,ax
573
			inc edi
574
			loop @b
575
		cmp bx,28 ;28=0+1+2+...+7
576
		jne .err_open
577
 
6175 IgorA 578
		mcall SF_SET_CAPTION,1,openfile_path
2897 IgorA 579
		stdcall buf2d_vox_obj_get_size,[open_file_vox]
580
		mov [vox_obj_size],eax
581
		call draw_object
582
 
583
		jmp .end_open_file
584
	.err_open:
585
		call but_new_file
586
		stdcall [mb_create],msgbox_4,thread
587
	.end_open_file:
588
	popad
589
	ret
590
 
591
align 4
592
but_save_file:
593
	pushad
594
		copy_path open_dialog_name,communication_area_default_path,file_name,0
595
		mov [OpenDialog_data.type],1
596
		stdcall [OpenDialog_Start],OpenDialog_data
597
		cmp [OpenDialog_data.status],2
598
		je .end_save_file
599
		;код при удачном открытии диалога
600
 
601
		mov eax,6 ;dword[v_zoom] ;задаем масштаб по умолчанию
602
		mov ebx,[open_file_vox]
603
		mov byte[ebx],al
604
 
605
		stdcall buf2d_vox_obj_get_size, ebx
606
		mov dword[run_file_70.Count], eax ;размер файла
6259 IgorA 607
		mov [run_file_70.Function], SSF_CREATE_FILE
2897 IgorA 608
		mov [run_file_70.Position], 0
609
		mov [run_file_70.Flags], 0
610
		mov ebx, dword[open_file_vox]
611
		mov [run_file_70.Buffer], ebx
612
		mov byte[run_file_70+20], 0
613
		mov dword[run_file_70.FileName], openfile_path
6259 IgorA 614
		mcall SF_FILE,run_file_70
2897 IgorA 615
		cmp ebx,0xffffffff
616
		je .end_save_file
617
 
618
		.end_save_file:
619
	popad
620
	ret
621
 
622
align 4
623
but_1:
624
	stdcall open_image_in_buf, buf_i0
625
	ret
626
 
627
align 4
628
but_2:
629
	stdcall open_image_in_buf, buf_i1
630
	call set_buf_tabs
631
	ret
632
 
633
align 4
634
but_3:
635
	stdcall open_image_in_buf, buf_i2
636
	call set_buf_tabs
637
	ret
638
 
639
;description:
640
; в зависимости от ширины 1-го буфера устанавливаем отступы для 2-го и 3-го буферов
641
align 4
642
set_buf_tabs:
643
push eax ebx edi
644
	mov edi,buf_i0
645
	cmp buf2d_data,0
646
	je @f
647
		movzx eax,buf2d_l
648
		mov ebx,buf2d_w
649
		cmp ebx,128
650
		jle .end_0
651
			mov ebx,128
652
		.end_0:
653
		mov edi,buf_i1
654
		mov buf2d_l,ax
655
		add buf2d_l,bx
656
		add buf2d_l,2
657
		shl ebx,1
658
		mov edi,buf_i2
659
		mov buf2d_l,ax
660
		add buf2d_l,bx
661
		add buf2d_l,4
662
	@@:
663
pop edi ebx eax
664
	ret
665
 
666
align 4
667
get_scale:
668
push eax edi
669
	mov edi,buf_i0
670
	mov eax,buf2d_w
671
 
672
	mov dword[k_scale],-1
673
	.cycle_s:
674
	cmp eax,0
675
	je @f
676
		shr eax,1
677
		inc dword[k_scale]
678
		jmp .cycle_s
679
	@@:
680
pop edi eax
681
	ret
682
 
683
align 4
684
proc set_borders uses eax ebx ecx edx edi
685
	mov ecx,dword[k_scale]
686
	mov edx,1
687
	shl edx,cl
688
 
689
	;определяем минимальную координату y на лицевой грани
690
	mov edi,buf_i2
691
	mov dword[bby_min],0
692
	xor ecx,ecx
693
	.cycle_0:
694
	xor ebx,ebx
695
	.cycle_1:
696
		stdcall [buf2d_get_pixel],edi,ebx,ecx
697
		cmp eax,buf2d_color
698
		jne @f
699
		inc ebx
700
		cmp ebx,edx
701
		jl .cycle_1
702
		inc dword[bby_min]
703
		inc ecx
704
		cmp ecx,edx
705
		jl .cycle_0
706
	@@:
707
 
708
	;определяем минимальную координату x на лицевой грани
709
	mov dword[btx_min],0
710
	xor ebx,ebx
711
	.cycle_2:
712
	mov ecx,[bby_min]
713
	.cycle_3:
714
		stdcall [buf2d_get_pixel],edi,ebx,ecx
715
		cmp eax,buf2d_color
716
		jne @f
717
		inc ecx
718
		cmp ecx,edx
719
		jl .cycle_3
720
		inc dword[btx_min]
721
		inc ebx
722
		cmp ebx,edx
723
		jl .cycle_2
724
	@@:
725
 
726
	;определяем максимальную координату x на лицевой грани
727
	mov [btx_max],edx
728
	dec dword[btx_max]
729
	mov ebx,[btx_max]
730
	.cycle_4:
731
	mov ecx,[bby_min]
732
	.cycle_5:
733
		stdcall [buf2d_get_pixel],edi,ebx,ecx
734
		cmp eax,buf2d_color
735
		jne @f
736
		inc ecx
737
		cmp ecx,edx
738
		jl .cycle_5
739
		dec dword[btx_max]
740
		dec ebx
741
		cmp ebx,[btx_min]
742
		jg .cycle_4
743
	@@:
744
 
745
	;stdcall [buf2d_line], edi, 0,[bby_min],50,[bby_min],255
746
	ret
747
endp
748
 
749
align 4
750
btx_min dd 0 ;буфер верхний мин. x
751
btx_max dd 0
752
bty_min dd 0 ;буфер верхний мин. y
753
bty_max dd 0
754
;bbx_min dd 0
755
;bbx_max dd 0
756
bby_min dd 0 ;буфер боковой мин. y
757
bby_max dd 0
758
k_scale dd 0
759
n_plane dd 0
760
 
761
calc db 0
762
 
763
; создание вокселя в 3 этапа:
764
; 1) ищем место в структуре дерева, куда надо вставить (если ветвь существует, 2-й этап пропускаем)
765
; 2) вставляем новую ветвь с вокселем (3-й этап уже не делаем)
766
; 3) меняем цвет вокселя
767
align 4
768
proc buf2d_vox_obj_create_node, v_obj:dword,coord_x:dword,coord_y:dword,\
769
coord_z:dword,k_scale:dword,color:dword
770
pushad
771
locals
772
	p_node dd 0 ;родительский узел
773
endl
774
 
775
	mov edi,[v_obj]
776
	add edi,vox_offs_data
777
	mov esi,[k_scale]
778
	cmp esi,1
779
	jl .change
780
	; *** (1) ***
781
	.found:
782
	stdcall vox_obj_get_node_position, [v_obj],[coord_x],[coord_y],[coord_z],esi
783
	movzx bx,byte[edi+3]
784
	mov [p_node],edi
785
	add edi,4
786
 
787
	cmp eax,0
788
	je .end_1
789
	mov ecx,eax
790
	cld
791
	@@: ;цикл для пропуска предыдущих поддеревьев в узле
792
		bt bx,0 ;проверяем есть ли дочерние узлы
793
		jnc .end_0
794
			xor eax,eax
795
			stdcall vox_obj_rec0 ;в eax вычисляется число дочерних узлов, в данной ветви
796
		.end_0:
797
		shr bx,1
798
		loop @b
799
	.end_1:
800
	bt bx,0
801
	jnc .creat ;если поддерева не существует, переходим к созданию
802
	dec esi
803
	cmp esi,0
804
	jg .found
805
	jmp .change
806
 
807
	; *** (2) ***
808
	.creat:
809
	mov edx,[color] ;меняем цвет
810
	and edx,0xffffff ;для профилактики
811
	mov ecx,esi
812
	stdcall vox_obj_add_nodes_mem, [v_obj],edi,ecx ;расширяем место занимаемое объектом, для добавления новых узлов
813
	mov ebx,[p_node]
814
	cld
815
	@@:
816
		mov dword[edi],edx
817
		stdcall vox_obj_get_node_bit_mask, [v_obj],[coord_x],[coord_y],[coord_z],esi
818
		or byte[ebx+3],al
819
 
820
		mov ebx,edi
821
		add edi,4
822
		dec esi
823
		loop @b
824
	jmp .end_2
825
 
826
	; *** (3) ***
827
	.change:
828
	mov eax,[color] ;меняем цвет
829
	mov word[edi],ax
830
	shr eax,16
831
	mov byte[edi+2],al
832
 
833
	.end_2:
834
popad
835
	ret
836
endp
837
 
838
; сдвигает узлы для добавления новых узлов
839
;input:
840
; p_insert - позиция для вставки
841
; count - колличество вставляемых узлов
842
align 4
843
proc vox_obj_add_nodes_mem uses eax ecx edi esi, v_obj:dword,p_insert:dword,count:dword
844
	mov esi,[v_obj]
845
	;stdcall buf2d_vox_obj_get_size,esi
846
	add esi,[vox_obj_size] ;esi - указатель на конец файла
847
	mov edi,[count]
848
	shl edi,2
849
	add [vox_obj_size],edi
850
	add edi,esi ;edi - указатель на будущий конец файла
851
	mov ecx,esi
852
	sub ecx,[p_insert]
853
	shr ecx,2 ;ecx - число циклов для копирования
854
	sub esi,4 ;esi - указатель на последний узел
855
	sub edi,4 ;edi - указатель на будущий последний узел
856
	std
857
	rep movsd ;сдвигаем память
858
	ret
859
endp
860
 
861
;???
862
; определение позиции узла в дереве (от 0 до 7)
863
align 4
864
proc vox_obj_get_node_position uses ebx ecx edi, v_obj:dword,\
865
coord_x:dword,coord_y:dword,coord_z:dword,k_scale:dword
866
	mov ecx,[k_scale]
867
	dec ecx
868
	mov eax,[coord_x]
869
	mov ebx,[coord_y]
870
	mov edi,[coord_z]
871
	cmp ecx,1
872
	jl .end_0
873
		shr eax,cl
874
		shr ebx,cl
875
		shr edi,cl
876
	.end_0:
877
	and eax,1
878
	bt ebx,0
879
	jnc @f
880
		bts eax,1
881
	@@:
882
	bt edi,0
883
	jnc @f
884
		bts eax,2
885
	@@:
886
 
887
	mov edi,[v_obj]
888
	add edi,vox_offs_tree_table
889
	@@:
890
		cmp al,byte[edi]
891
		je @f
892
		inc edi
893
		jmp @b
894
	@@:
895
	sub edi,[v_obj]
896
	sub edi,vox_offs_tree_table
897
	mov eax,edi
898
 
899
	ret
900
endp
901
 
902
;???
903
;input:
904
; edi - указатель на данные воксельного объекта
905
;output:
906
; eax - eax + число узлов в данных вокс. объекта
907
; edi - указатель на смещенные данные вокс. объекта
908
align 4
909
proc vox_obj_rec0
910
	inc eax
911
	cmp byte[edi+3],0 ;смотрим есть ли поддеревья
912
	je .sub_trees
913
 
914
		;рекурсивный перебор поддеревьев
915
		push ebx ecx
916
		mov bh,byte[edi+3]
917
		add edi,4
918
		mov bl,8
919
		.cycle:
920
			bt bx,8 ;тестируем только bh
921
			jnc .c_next
922
				stdcall vox_obj_rec0
923
			.c_next:
924
			shr bh,1
925
			dec bl
926
			jnz .cycle
927
		pop ecx ebx
928
 
929
		jmp .end_f
930
	.sub_trees:
931
		add edi,4
932
	.end_f:
933
	ret
934
endp
935
 
936
;output:
937
; eax - 1,2,4,8,16, ... ,128
938
align 4
939
proc vox_obj_get_node_bit_mask uses ebx ecx edi, v_obj:dword,\
940
coord_x:dword,coord_y:dword,coord_z:dword,k_scale:dword
941
	mov ecx,[k_scale]
942
	dec ecx
943
	mov eax,[coord_x]
944
	mov ebx,[coord_y]
945
	mov edi,[coord_z]
946
	cmp ecx,1
947
	jl .end_0
948
		shr eax,cl
949
		shr ebx,cl
950
		shr edi,cl
951
	.end_0:
952
	and eax,1
953
	bt ebx,0
954
	jnc @f
955
		bts eax,1
956
	@@:
957
	bt edi,0
958
	jnc @f
959
		bts eax,2
960
	@@:
961
 
962
	mov ecx,[v_obj]
963
	add ecx,vox_offs_tree_table
964
	@@:
965
		cmp al,byte[ecx]
966
		je @f
967
		inc ecx
968
		jmp @b
969
	@@:
970
	mov eax,1 ;устанавливаем первоначальное значение бита
971
	sub ecx,[v_obj]
972
	sub ecx,vox_offs_tree_table
973
	jz @f
974
		shl eax,cl ;сдвигаем бит
975
	@@:
976
 
977
	ret
978
endp
979
 
980
;
981
;output:
982
; eax - размер в байтах занимаемый объектом v_obj
983
align 4
984
proc buf2d_vox_obj_get_size uses edi, v_obj:dword
985
	mov edi,[v_obj]
986
	add edi,vox_offs_data
987
	xor eax,eax
988
	stdcall vox_obj_rec0 ;eax - число узлов в объекте v_obj
989
	shl eax,2
990
	add eax,vox_offs_data
991
	ret
992
endp
993
 
994
;input:
995
; mode_add - если не равно 0 тогда создание в режиме добавления вокселей
996
align 4
997
proc but_run uses eax ebx edi, mode_add:dword
998
	; проверка размеров изображений (текстур)
999
	mov edi,buf_i0
1000
	mov ebx,buf2d_h
1001
	cmp ebx,2
1002
	jle .err_size_t
1003
	cmp buf2d_w,ebx
1004
	jne .err_size_t
1005
	;
1006
	mov edi,buf_i1
1007
	cmp ebx,buf2d_h
1008
	jne .err_size_tb
1009
	mov ebx,buf2d_h
1010
	cmp ebx,2
1011
	jle .err_size_b
1012
	cmp buf2d_w,ebx
1013
	jne .err_size_b
1014
 
1015
		cmp dword[vox_obj_size],vox_offs_data
1016
		jl .n_file ;если раньше не было открытых файлов
1017
		cmp dword[mode_add],0
1018
		jne @f
1019
		.n_file:
1020
			call but_new_file
1021
		@@:
1022
 
1023
		mov edi,buf_i0
1024
		mov eax,buf2d_w
1025
		mov edi,buf_npl
1026
		cmp buf2d_data,0
1027
		jne @f
1028
			; *** создаем буфера
1029
			m2m buf2d_w,eax
1030
			m2m buf2d_h,eax
1031
			stdcall [buf2d_create],edi
1032
			mov edi,buf_npl_p
1033
			m2m buf2d_w,eax
1034
			m2m buf2d_h,eax
1035
			stdcall [buf2d_create],edi
1036
			mov edi,buf_npl_n
1037
			m2m buf2d_w,eax
1038
			m2m buf2d_h,eax
1039
			stdcall [buf2d_create],edi
1040
			jmp .end_0
1041
		@@:
1042
			; *** изменяем размеры буферов
6175 IgorA 1043
			stdcall [buf2d_resize], edi, eax,eax,1
2897 IgorA 1044
			mov edi,buf_npl_p
6175 IgorA 1045
			stdcall [buf2d_resize], edi, eax,eax,1
2897 IgorA 1046
			mov edi,buf_npl_n
6175 IgorA 1047
			stdcall [buf2d_resize], edi, eax,eax,1
2897 IgorA 1048
		.end_0:
1049
		mov dword[n_plane],1
1050
		mov byte[calc],1
1051
		call get_scale
1052
		call set_borders
1053
 
1054
		stdcall create_plane,buf_npl,0
1055
		stdcall create_plane,buf_npl_n,1
1056
		stdcall create_obj_from_plane,buf_npl,0 ;создаем начальное сечение
1057
 
1058
		jmp @f
1059
	.err_size_t:
1060
		stdcall [mb_create],msgbox_0,thread
1061
		jmp @f
1062
	.err_size_b:
1063
		stdcall [mb_create],msgbox_1,thread
1064
		jmp @f
1065
	.err_size_tb:
1066
		stdcall [mb_create],msgbox_3,thread
1067
		;jmp @f
1068
	@@:
1069
	ret
1070
endp
1071
 
1072
align 4
1073
but_5:
1074
	cmp byte[calc],0
1075
	je @f
1076
		call draw_object
1077
		mov byte[calc],0
1078
	@@:
1079
	ret
1080
 
1081
align 4
1082
but_rot_z:
1083
	stdcall vox_obj_rot_z, [open_file_vox]
1084
	call draw_object
1085
	ret
1086
 
1087
align 4
1088
draw_object:
1089
	;вывод результата на экран
1090
	stdcall [buf2d_clear], buf_0, [buf_0.color] ;чистим буфер
1091
	stdcall [buf2d_clear], buf_0z, 0 ;чистим буфер
1092
	stdcall [buf2d_vox_obj_draw_3g], buf_0, buf_0z, buf_vox,\
1093
		[open_file_vox], 0,0, 0, 6 ;[k_scale]
1094
	stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране
1095
	ret
1096
 
1097
align 4
1098
proc open_image_in_buf, buf:dword
1099
	pushad
1100
	copy_path open_dialog_name,communication_area_default_path,file_name,0
1101
	mov [OpenDialog_data.type],0
1102
	stdcall [OpenDialog_Start],OpenDialog_data
1103
	cmp [OpenDialog_data.status],2
1104
	je .end_open_file
1105
 
1106
	;stdcall mem.Alloc, dword size ;выделяем память для изображения
1107
	;mov [buf],eax
1108
 
6259 IgorA 1109
	mov [run_file_70.Function], SSF_READ_FILE
2897 IgorA 1110
	mov [run_file_70.Position], 0
1111
	mov [run_file_70.Flags], 0
1112
	mov [run_file_70.Count], dword max_open_file_size
1113
	m2m [run_file_70.Buffer],dword[open_file_img]
1114
	mov byte[run_file_70+20], 0
1115
	mov [run_file_70.FileName], openfile_path
6259 IgorA 1116
	mcall SF_FILE,run_file_70
2897 IgorA 1117
	cmp ebx,0xffffffff
1118
	je .end_0
6259 IgorA 1119
		;определяем вид изображения
2897 IgorA 1120
		stdcall dword[img_decode], dword[open_file_img],ebx,0
6259 IgorA 1121
		or eax,eax
1122
		jz .end_0 ;если нарушен формат файла
1123
		mov ebx,eax
2897 IgorA 1124
		;преобразуем изображение к формату rgb
6259 IgorA 1125
		stdcall dword[img_to_rgb2], ebx,dword[open_file_img]
2897 IgorA 1126
 
1127
		mov edi,[buf]
1128
		cmp buf2d_data,0
1129
		jne @f
6259 IgorA 1130
			m2m buf2d_w,dword[ebx+4] ;+4 = image width
1131
			m2m buf2d_h,dword[ebx+8] ;+8 = image heihht
2897 IgorA 1132
			stdcall [buf2d_create_f_img], edi,[open_file_img]
1133
			jmp .end_1
1134
		@@:
6259 IgorA 1135
			mov ecx,dword[ebx+8]
1136
			stdcall [buf2d_resize], edi, [ebx+4],ecx,1 ;изменяем размеры буфера
1137
			imul ecx,[ebx+4]
2897 IgorA 1138
			lea ecx,[ecx+ecx*2]
1139
			mov edi,buf2d_data
1140
			mov esi,[open_file_img]
1141
			cld
1142
			rep movsb ;copy image
1143
		.end_1:
1144
 
6259 IgorA 1145
		;удаляем временный буфер в ebx
1146
		stdcall dword[img_destroy], ebx
2897 IgorA 1147
	.end_0:
1148
 
1149
	call draw_buffers
1150
	.end_open_file:
1151
	popad
1152
	ret
1153
endp
1154
 
1155
msgbox_0:
1156
	db 1,0
1157
	db 'Внимание',0
1158
	db 'Размер верхнего изображения не коректный',0
1159
	db 'Закрыть',0
1160
	db 0
1161
 
1162
msgbox_1:
1163
	db 1,0
1164
	db 'Внимание',0
1165
	db 'Размер бокового изображения не коректный',0
1166
	db 'Закрыть',0
1167
	db 0
1168
 
1169
msgbox_2:
1170
	db 1,0
1171
	db 'Внимание',0
1172
	db 'Размер переднего изображения не коректный',0
1173
	db 'Закрыть',0
1174
	db 0
1175
 
1176
msgbox_3:
1177
	db 1,0
1178
	db 'Внимание',0
1179
	db 'Размеры верхнего и бокового изображений не совпадают',13,\
1180
		'Откройте изображения одинаковых размеров',0
1181
	db 'Закрыть',0
1182
	db 0
1183
 
1184
msgbox_4:
1185
	db 1,0
1186
	db 'Внимание',0
1187
	db 'Открываемый файл содержит не воксельный формат',0
1188
	db 'Закрыть',0
1189
	db 0
1190
 
1191
;данные для диалога открытия файлов
1192
align 4
1193
OpenDialog_data:
1194
.type			dd 0 ;0 - открыть, 1 - сохранить, 2 - выбрать дтректорию
1195
.procinfo		dd procinfo	;+4
1196
.com_area_name		dd communication_area_name	;+8
1197
.com_area		dd 0	;+12
1198
.opendir_path		dd plugin_path	;+16
1199
.dir_default_path	dd default_dir ;+20
1200
.start_path		dd file_name ;+24 путь к диалогу открытия файлов
1201
.draw_window		dd draw_window	;+28
1202
.status 		dd 0	;+32
1203
.openfile_path		dd openfile_path	;+36 путь к открываемому файлу
1204
.filename_area		dd filename_area	;+40
1205
.filter_area		dd Filter
1206
.x:
1207
.x_size 		dw 420 ;+48 ; Window X size
1208
.x_start		dw 10 ;+50 ; Window X position
1209
.y:
1210
.y_size 		dw 320 ;+52 ; Window y size
1211
.y_start		dw 10 ;+54 ; Window Y position
1212
 
1213
default_dir db '/rd/1',0
1214
 
1215
communication_area_name:
1216
	db 'FFFFFFFF_open_dialog',0
1217
open_dialog_name:
1218
	db 'opendial',0
1219
communication_area_default_path:
1220
	db '/rd/1/File managers/',0
1221
 
1222
Filter:
1223
dd Filter.end - Filter ;.1
1224
.1:
1225
db 'PNG',0
1226
db 'JPG',0
1227
db 'JPEG',0
1228
db 'BMP',0
1229
db 'GIF',0
1230
db 'VOX',0
1231
.end:
1232
db 0
1233
 
1234
 
1235
 
1236
head_f_i:
1237
head_f_l db 'Системная ошибка',0
1238
 
1239
system_dir_0 db '/sys/lib/'
1240
lib_name_0 db 'proc_lib.obj',0
1241
err_message_found_lib_0 db 'Не найдена библиотека ',39,'proc_lib.obj',39,0
1242
err_message_import_0 db 'Ошибка при импорте библиотеки ',39,'proc_lib.obj',39,0
1243
 
1244
system_dir_1 db '/sys/lib/'
1245
lib_name_1 db 'libimg.obj',0
1246
err_message_found_lib_1 db 'Не найдена библиотека ',39,'libimg.obj',39,0
1247
err_message_import_1 db 'Ошибка при импорте библиотеки ',39,'libimg.obj',39,0
1248
 
1249
system_dir_2 db '/sys/lib/'
1250
lib_name_2 db 'buf2d.obj',0
1251
err_msg_found_lib_2 db 'Не найдена библиотека ',39,'buf2d.obj',39,0
1252
err_msg_import_2 db 'Ошибка при импорте библиотеки ',39,'buf2d',39,0
1253
 
1254
system_dir_3 db '/sys/lib/'
1255
lib_name_3 db 'msgbox.obj',0
1256
err_msg_found_lib_3 db 'Не найдена библиотека ',39,'msgbox.obj',39,0
1257
err_msg_import_3 db 'Ошибка при импорте библиотеки ',39,'msgbox',39,0
1258
 
1259
l_libs_start:
1260
	lib_0 l_libs lib_name_0, sys_path, file_name, system_dir_0,\
1261
		err_message_found_lib_0, head_f_l, proclib_import,err_message_import_0, head_f_i
1262
	lib_1 l_libs lib_name_1, sys_path, file_name, system_dir_1,\
1263
		err_message_found_lib_1, head_f_l, import_libimg, err_message_import_1, head_f_i
1264
	lib_2 l_libs lib_name_2, sys_path, library_path, system_dir_2,\
1265
		err_msg_found_lib_2,head_f_l,import_buf2d,err_msg_import_2,head_f_i
1266
	lib_3 l_libs lib_name_3, sys_path, library_path, system_dir_3,\
1267
		err_msg_found_lib_3,head_f_l,import_msgbox_lib,err_msg_import_3,head_f_i
1268
l_libs_end:
1269
 
1270
align 4
1271
import_libimg:
1272
	dd alib_init1
1273
	img_is_img  dd aimg_is_img
1274
	img_info    dd aimg_info
1275
	img_from_file dd aimg_from_file
1276
	img_to_file dd aimg_to_file
1277
	img_from_rgb dd aimg_from_rgb
1278
	img_to_rgb  dd aimg_to_rgb
1279
	img_to_rgb2 dd aimg_to_rgb2
1280
	img_decode  dd aimg_decode
1281
	img_encode  dd aimg_encode
1282
	img_create  dd aimg_create
1283
	img_destroy dd aimg_destroy
1284
	img_destroy_layer dd aimg_destroy_layer
1285
	img_count   dd aimg_count
1286
	img_lock_bits dd aimg_lock_bits
1287
	img_unlock_bits dd aimg_unlock_bits
1288
	img_flip    dd aimg_flip
1289
	img_flip_layer dd aimg_flip_layer
1290
	img_rotate  dd aimg_rotate
1291
	img_rotate_layer dd aimg_rotate_layer
1292
	img_draw    dd aimg_draw
1293
 
1294
	dd 0,0
1295
	alib_init1   db 'lib_init',0
1296
	aimg_is_img  db 'img_is_img',0 ;определяет по данным, может ли библиотека сделать из них изображение
1297
	aimg_info    db 'img_info',0
1298
	aimg_from_file db 'img_from_file',0
1299
	aimg_to_file db 'img_to_file',0
1300
	aimg_from_rgb db 'img_from_rgb',0
1301
	aimg_to_rgb  db 'img_to_rgb',0 ;преобразование изображения в данные RGB
1302
	aimg_to_rgb2 db 'img_to_rgb2',0
1303
	aimg_decode  db 'img_decode',0 ;автоматически определяет формат графических данных
1304
	aimg_encode  db 'img_encode',0
1305
	aimg_create  db 'img_create',0
1306
	aimg_destroy db 'img_destroy',0
1307
	aimg_destroy_layer db 'img_destroy_layer',0
1308
	aimg_count   db 'img_count',0
1309
	aimg_lock_bits db 'img_lock_bits',0
1310
	aimg_unlock_bits db 'img_unlock_bits',0
1311
	aimg_flip    db 'img_flip',0
1312
	aimg_flip_layer db 'img_flip_layer',0
1313
	aimg_rotate  db 'img_rotate',0
1314
	aimg_rotate_layer db 'img_rotate_layer',0
1315
	aimg_draw    db 'img_draw',0
1316
 
1317
align 4
1318
proclib_import: ;описание экспортируемых функций
1319
	OpenDialog_Init dd aOpenDialog_Init
1320
	OpenDialog_Start dd aOpenDialog_Start
1321
dd 0,0
1322
	aOpenDialog_Init db 'OpenDialog_init',0
1323
	aOpenDialog_Start db 'OpenDialog_start',0
1324
 
1325
align 4
1326
import_buf2d:
1327
	init dd sz_init
1328
	buf2d_create dd sz_buf2d_create
1329
	buf2d_create_f_img dd sz_buf2d_create_f_img
1330
	buf2d_clear dd sz_buf2d_clear
1331
	buf2d_draw dd sz_buf2d_draw
1332
	buf2d_delete dd sz_buf2d_delete
1333
	buf2d_resize dd sz_buf2d_resize
1334
	buf2d_line dd sz_buf2d_line
1335
	buf2d_rect_by_size dd sz_buf2d_rect_by_size
1336
	buf2d_filled_rect_by_size dd sz_buf2d_filled_rect_by_size
1337
	buf2d_circle dd sz_buf2d_circle
1338
	buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2
1339
	buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2
1340
	buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8
1341
	buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32
1342
	buf2d_bit_blt dd sz_buf2d_bit_blt
1343
	buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp
1344
	buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha
1345
	buf2d_curve_bezier dd sz_buf2d_curve_bezier
1346
	buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix
1347
	buf2d_draw_text dd sz_buf2d_draw_text
1348
	buf2d_crop_color dd sz_buf2d_crop_color
1349
	buf2d_offset_h dd sz_buf2d_offset_h
1350
	buf2d_flood_fill dd sz_buf2d_flood_fill
1351
	buf2d_set_pixel dd sz_buf2d_set_pixel
1352
	buf2d_get_pixel dd sz_buf2d_get_pixel
1353
	buf2d_vox_brush_create dd sz_buf2d_vox_brush_create
1354
	buf2d_vox_brush_delete dd sz_buf2d_vox_brush_delete
1355
	buf2d_vox_obj_get_img_w_3g dd sz_buf2d_vox_obj_get_img_w_3g
1356
	buf2d_vox_obj_get_img_h_3g dd sz_buf2d_vox_obj_get_img_h_3g
1357
	buf2d_vox_obj_draw_1g dd sz_buf2d_vox_obj_draw_1g
1358
	buf2d_vox_obj_draw_3g dd sz_buf2d_vox_obj_draw_3g
1359
	buf2d_vox_obj_draw_3g_scaled dd sz_buf2d_vox_obj_draw_3g_scaled
1360
	buf2d_vox_obj_draw_3g_shadows dd sz_buf2d_vox_obj_draw_3g_shadows
1361
	buf2d_vox_obj_draw_pl dd sz_buf2d_vox_obj_draw_pl
1362
	buf2d_vox_obj_draw_pl_scaled dd sz_buf2d_vox_obj_draw_pl_scaled
1363
	dd 0,0
1364
	sz_init db 'lib_init',0
1365
	sz_buf2d_create db 'buf2d_create',0
1366
	sz_buf2d_create_f_img db 'buf2d_create_f_img',0
1367
	sz_buf2d_clear db 'buf2d_clear',0
1368
	sz_buf2d_draw db 'buf2d_draw',0
1369
	sz_buf2d_delete db 'buf2d_delete',0
1370
	sz_buf2d_resize db 'buf2d_resize',0
1371
	sz_buf2d_line db 'buf2d_line',0
1372
	sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0
1373
	sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0
1374
	sz_buf2d_circle db 'buf2d_circle',0
1375
	sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0
1376
	sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0
1377
	sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0
1378
	sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0
1379
	sz_buf2d_bit_blt db 'buf2d_bit_blt',0
1380
	sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0
1381
	sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0
1382
	sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0
1383
	sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0
1384
	sz_buf2d_draw_text db 'buf2d_draw_text',0
1385
	sz_buf2d_crop_color db 'buf2d_crop_color',0
1386
	sz_buf2d_offset_h db 'buf2d_offset_h',0
1387
	sz_buf2d_flood_fill db 'buf2d_flood_fill',0
1388
	sz_buf2d_set_pixel db 'buf2d_set_pixel',0
1389
	sz_buf2d_get_pixel db 'buf2d_get_pixel',0
1390
	sz_buf2d_vox_brush_create db 'buf2d_vox_brush_create',0
1391
	sz_buf2d_vox_brush_delete db 'buf2d_vox_brush_delete',0
1392
	sz_buf2d_vox_obj_get_img_w_3g db 'buf2d_vox_obj_get_img_w_3g',0
1393
	sz_buf2d_vox_obj_get_img_h_3g db 'buf2d_vox_obj_get_img_h_3g',0
1394
	sz_buf2d_vox_obj_draw_1g db 'buf2d_vox_obj_draw_1g',0
1395
	sz_buf2d_vox_obj_draw_3g db 'buf2d_vox_obj_draw_3g',0
1396
	sz_buf2d_vox_obj_draw_3g_scaled db 'buf2d_vox_obj_draw_3g_scaled',0
1397
	sz_buf2d_vox_obj_draw_3g_shadows db 'buf2d_vox_obj_draw_3g_shadows',0
1398
	sz_buf2d_vox_obj_draw_pl db 'buf2d_vox_obj_draw_pl',0
1399
	sz_buf2d_vox_obj_draw_pl_scaled db 'buf2d_vox_obj_draw_pl_scaled',0
1400
 
1401
align 4
1402
import_msgbox_lib:
1403
	mb_create dd amb_create
6259 IgorA 1404
;       mb_reinit dd amb_reinit
1405
;       mb_setfunctions dd amb_setfunctions
2897 IgorA 1406
dd 0,0
1407
	amb_create db 'mb_create',0
6259 IgorA 1408
;       amb_reinit db 'mb_reinit',0
1409
;       amb_setfunctions db 'mb_setfunctions',0
2897 IgorA 1410
 
1411
mouse_dd dd 0x0
1412
sc system_colors
1413
last_time dd 0
1414
 
1415
align 16
1416
procinfo process_information
1417
 
1418
align 4
1419
buf_0: dd 0
1420
	dw 5 ;+4 left
1421
	dw 35 ;+6 top
1422
.w: dd 6*64 ;+8 w
1423
.h: dd 7*64 ;+12 h
1424
.color: dd 0xffffff ;+16 color
1425
	db 24 ;+20 bit in pixel
1426
 
1427
align 4
1428
buf_0z: dd 0
1429
	dw 5 ;+4 left
1430
	dw 35 ;+6 top
1431
.w: dd 6*64 ;+8 w
1432
.h: dd 7*64 ;+12 h
1433
.color: dd 0 ;+16 color
1434
	db 32 ;+20 bit in pixel
1435
 
1436
align 4
1437
buf_i0: dd 0
1438
	dw 5 ;+4 left
1439
	dw 35 ;+6 top
1440
.w: dd 0 ;+8 w
1441
.h: dd 0 ;+12 h
1442
.color: dd 0 ;+16 color
1443
	db 24 ;+20 bit in pixel
1444
 
1445
align 4
1446
buf_i1: dd 0
1447
	dw 105 ;+4 left
1448
	dw 35 ;+6 top
1449
.w: dd 0 ;+8 w
1450
.h: dd 0 ;+12 h
1451
.color: dd 0 ;+16 color
1452
	db 24 ;+20 bit in pixel
1453
 
1454
align 4
1455
buf_i2: dd 0
1456
	dw 205 ;+4 left
1457
	dw 35 ;+6 top
1458
.w: dd 0 ;+8 w
1459
.h: dd 0 ;+12 h
1460
.color: dd 0 ;+16 color
1461
	db 24 ;+20 bit in pixel
1462
 
1463
align 4
1464
buf_npl_p: dd 0
1465
	dw 0 ;+4 left
1466
	dw 0 ;+6 top
1467
.w: dd 0 ;+8 w
1468
.h: dd 0 ;+12 h
1469
.color: dd 0 ;+16 color
1470
	db 24 ;+20 bit in pixel
1471
 
1472
align 4
1473
buf_npl: dd 0
1474
	dw 5 ;+4 left
1475
	dw 35 ;+6 top
1476
.w: dd 0 ;+8 w
1477
.h: dd 0 ;+12 h
1478
.color: dd 0 ;+16 color
1479
	db 24 ;+20 bit in pixel
1480
 
1481
align 4
1482
buf_npl_n: dd 0
1483
	dw 0 ;+4 left
1484
	dw 0 ;+6 top
1485
.w: dd 0 ;+8 w
1486
.h: dd 0 ;+12 h
1487
.color: dd 0 ;+16 color
1488
	db 24 ;+20 bit in pixel
1489
 
1490
;данные для создания минимального единичного вокселя
1491
align 4
1492
vox_6_7_z:
1493
dd 0,0,1,1,0,0,\
1494
   0,2,2,2,2,0,\
1495
   2,2,2,2,2,2,\
1496
   2,3,2,2,3,2,\
1497
   2,3,3,3,3,2,\
1498
   0,3,3,3,3,0,\
1499
   0,0,3,3,0,0
1500
 
1501
align 4
1502
buf_vox:
1503
	db 6,7,4,3 ;w,h,h_osn,n
1504
	rb BUF_STRUCT_SIZE*(2+1)
1505
 
1506
 
5388 IgorA 1507
align 16
2897 IgorA 1508
i_end:
2915 IgorA 1509
		rb 2048
2897 IgorA 1510
	thread:
2915 IgorA 1511
		rb 2048
2897 IgorA 1512
stacktop:
1513
	sys_path rb 1024
1514
	file_name:
1515
		rb 1024 ;4096
1516
	library_path rb 1024
1517
	plugin_path rb 4096
1518
	openfile_path rb 4096
1519
	filename_area rb 256
1520
mem: