Subversion Repositories Kolibri OS

Rev

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