Subversion Repositories Kolibri OS

Rev

Rev 8442 | Details | Compare with Previous | Last modification | View Log | RSS feed

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