Subversion Repositories Kolibri OS

Rev

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

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