Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
2051 IgorA 1
use32
2
	org 0x0
3
	db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт
5930 IgorA 4
	dd 1, start, i_end, mem, stacktop, 0, sys_path
2051 IgorA 5
 
6
include '../../macros.inc'
7
include '../../proc32.inc'
8
include '../../develop/libraries/box_lib/load_lib.mac'
9
include '../../develop/libraries/box_lib/trunk/box_lib.mac'
5930 IgorA 10
include '../../develop/libraries/TinyGL/asm_fork/opengl_const.inc'
3014 dunkaist 11
include '../../dll.inc'
2051 IgorA 12
include 'lang.inc'
2165 IgorA 13
include 'info_fun_float.inc'
5935 IgorA 14
include 'info_menu.inc'
2051 IgorA 15
 
16
debug equ 0
17
 
18
@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load
19
 
20
struct FileInfoBlock
21
	Function dd ?
22
	Position dd ?
23
	Flags	 dd ?
24
	Count	 dd ?
25
	Buffer	 dd ?
26
		db ?
27
	FileName dd ?
28
ends
29
 
5938 IgorA 30
align 4
31
fl255 dd 255.0
5881 IgorA 32
image_data dd 0 ;указатель на временную память, нужен для преобразования изображения
5938 IgorA 33
open_file_data dd 0 ;указатель на память для открытия файлов 3ds
4332 IgorA 34
open_file_size dd 0 ;размер открытого файла
5938 IgorA 35
open_b rb 560
2051 IgorA 36
 
37
;
5930 IgorA 38
main_wnd_height equ 460 ;высота главного окна программы
2051 IgorA 39
fn_toolbar db 'toolbar.png',0
40
IMAGE_TOOLBAR_ICON_SIZE equ 16*16*3
41
IMAGE_TOOLBAR_SIZE equ IMAGE_TOOLBAR_ICON_SIZE*7
42
image_data_toolbar dd 0
43
;
44
TREE_ICON_SYS16_BMP_SIZE equ IMAGE_TOOLBAR_ICON_SIZE*11+54 ;размер bmp файла с системными иконками
45
icon_tl_sys dd 0 ;указатеель на память для хранения системных иконок
46
icon_toolbar dd 0 ;указатеель на память для хранения иконок объектов
4332 IgorA 47
TOOLBAR_ICON_BMP_SIZE equ IMAGE_TOOLBAR_ICON_SIZE*8+54 ;размер bmp файла с иконками объектов
2051 IgorA 48
;
2080 IgorA 49
IMAGE_FILE1_SIZE equ 128*144*3+54 ;размер файла с изображением
2051 IgorA 50
 
51
macro load_image_file path,buf,size { ;макрос для загрузки изображений
52
	;path - может быть переменной или строковым параметром
53
	if path eqtype '' ;проверяем задан ли строкой параметр path
54
		jmp @f
55
			local .path_str
56
			.path_str db path ;формируем локальную переменную
57
			db 0
58
		@@:
59
		;32 - стандартный адрес по которому должен быть буфер с системным путем
5881 IgorA 60
		copy_path .path_str,[32],file_name,0
2051 IgorA 61
	else
5881 IgorA 62
		copy_path path,[32],file_name,0 ;формируем полный путь к файлу изображения, подразумеваем что он в одной папке с программой
2051 IgorA 63
	end if
64
 
65
	stdcall mem.Alloc, dword size ;выделяем память для изображения
66
	mov [buf],eax
67
 
68
	mov [run_file_70.Function], 0
69
	mov [run_file_70.Position], 0
70
	mov [run_file_70.Flags], 0
71
	mov [run_file_70.Count], dword size
5930 IgorA 72
	mov [run_file_70.Buffer], eax
2051 IgorA 73
	mov byte[run_file_70+20], 0
74
	mov [run_file_70.FileName], file_name
5911 IgorA 75
	mcall 70,run_file_70 ;загружаем файл изображения
2051 IgorA 76
	cmp ebx,0xffffffff
77
	je @f
78
		;определяем вид изображения и переводим его во временный буфер image_data
79
		stdcall dword[img_decode], dword[buf],ebx,0
80
		mov dword[image_data],eax
81
		;преобразуем изображение к формату rgb
82
		stdcall dword[img_to_rgb2], dword[image_data],dword[buf]
83
		;удаляем временный буфер image_data
84
		stdcall dword[img_destroy], dword[image_data]
85
	@@:
86
}
87
 
88
;--------------------------------------
2107 IgorA 89
include 'data.inc'
2051 IgorA 90
 
91
level_stack dd 0
92
offs_last_timer dd 0 ;последний сдвиг показаный в функции таймера
93
 
2052 IgorA 94
ID_ICON_CHUNK_MAIN equ 0 ;иконка главного блока
95
ID_ICON_CHUNK_NOT_FOUND equ 1 ;иконка не известного блока
96
ID_ICON_DATA equ 2 ;иконка для данных блока, не определенной структуры
2051 IgorA 97
 
2052 IgorA 98
FILE_ERROR_CHUNK_SIZE equ -3 ;ошибка в размере блока
99
 
2051 IgorA 100
align 4
4332 IgorA 101
file_3ds: ;переменные используемые при открытии файла
2051 IgorA 102
.offs: dd 0 ;+0 указатель на начало блока
103
.size: dd 0 ;+4 размер блока (для 1-го параметра = размер файла 3ds)
2080 IgorA 104
rb 8*MAX_FILE_LEVEL
2051 IgorA 105
 
4332 IgorA 106
size_one_list equ 42
107
list_offs_chunk_del equ 8 ;может ли блок удалятся
108
list_offs_chunk_lev equ 9 ;уровень блока (прописан в данные узла)
109
list_offs_p_data equ 10 ;указатель на подпись блока
110
list_offs_text equ 14 ;сдвиг начала текста в листе
2051 IgorA 111
buffer rb size_one_list ;буфер для добавления структур в список tree1
112
 
113
txt_3ds_symb db 0,0
114
;--------------------------------------
115
 
2165 IgorA 116
include 'info_wnd_coords.inc'
2051 IgorA 117
 
118
align 4
119
start:
120
	load_libraries l_libs_start,l_libs_end
5881 IgorA 121
	;проверка на сколько удачно загузились библиотеки
5930 IgorA 122
	mov	ebp,lib_0
123
	.test_lib_open:
124
	cmp	dword [ebp+ll_struc_size-4],0
125
	jz	@f
126
		mcall -1 ;exit not correct
5911 IgorA 127
	@@:
5930 IgorA 128
	add ebp,ll_struc_size
129
	cmp ebp,l_libs_end
130
	jl .test_lib_open
5938 IgorA 131
	mcall 48,3,sc,sizeof.sys_colors_new
2051 IgorA 132
	mcall 40,0x27
133
	stdcall [OpenDialog_Init],OpenDialog_data ;подготовка диалога
134
 
5935 IgorA 135
	;kmenu initialisation
136
	stdcall [kmenu_init],sc
137
	stdcall [ksubmenu_new]
138
	mov [main_menu], eax
139
 
140
	stdcall [ksubmenu_new]
141
	mov [main_menu_view], eax
142
	stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Veiw_Vertexes, 5
143
	stdcall [ksubmenu_add], [main_menu_view], eax
144
	stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Veiw_Faces, 6
145
	stdcall [ksubmenu_add], [main_menu_view], eax
5938 IgorA 146
	stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Veiw_Faces_Fill, 7
147
	stdcall [ksubmenu_add], [main_menu_view], eax
148
	stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Veiw_Light, 8
149
	stdcall [ksubmenu_add], [main_menu_view], eax
5935 IgorA 150
	stdcall [kmenuitem_new], KMENUITEM_SEPARATOR, 0, 0
151
	stdcall [ksubmenu_add], [main_menu_view], eax
152
	stdcall [kmenuitem_new], KMENUITEM_SUBMENU, sz_main_menu_View, [main_menu_view]
153
	stdcall [ksubmenu_add], [main_menu], eax
5938 IgorA 154
	stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Veiw_Reset, 9
155
	stdcall [ksubmenu_add], [main_menu_view], eax
5935 IgorA 156
 
5911 IgorA 157
	mov dword[w_scr_t1.type],1
2051 IgorA 158
	stdcall dword[tl_data_init], tree1
159
	;системные иконки 16*16 для tree_list
160
	load_image_file 'tl_sys_16.png', icon_tl_sys,TREE_ICON_SYS16_BMP_SIZE
161
	;если изображение не открылось, то в icon_tl_sys будут
162
	;не инициализированные данные, но ошибки не будет, т. к. буфер нужного размера
163
	mov eax,dword[icon_tl_sys]
164
	mov dword[tree1.data_img_sys],eax
165
 
166
	load_image_file 'objects.png', icon_toolbar,TOOLBAR_ICON_BMP_SIZE
167
	mov eax,dword[icon_toolbar]
168
	mov dword[tree1.data_img],eax
169
 
170
	stdcall [buf2d_create], buf_0 ;создание буфера
171
 
172
	load_image_file 'font8x9.bmp', image_data_toolbar,IMAGE_FILE1_SIZE
173
	stdcall [buf2d_create_f_img], buf_1,[image_data_toolbar] ;создаем буфер
174
	stdcall mem.Free,[image_data_toolbar] ;освобождаем память
175
	stdcall [buf2d_conv_24_to_8], buf_1,1 ;делаем буфер прозрачности 8 бит
176
	stdcall [buf2d_convert_text_matrix], buf_1
177
 
178
	load_image_file fn_toolbar, image_data_toolbar,IMAGE_TOOLBAR_SIZE
179
 
5938 IgorA 180
	;работа с файлом настроек
181
	copy_path ini_name,sys_path,file_name,0
182
	mov dword[def_dr_mode],0
183
	stdcall dword[ini_get_int],file_name,ini_sec_w3d,key_dv,1
184
	or eax,eax
185
	jz @f
186
		or dword[def_dr_mode], 1 shl bit_vertexes
187
	@@:
188
	stdcall dword[ini_get_int],file_name,ini_sec_w3d,key_df,1
189
	or eax,eax
190
	jz @f
191
		or dword[def_dr_mode], 1 shl bit_faces
192
	@@:
193
	stdcall dword[ini_get_int],file_name,ini_sec_w3d,key_dff,1
194
	or eax,eax
195
	jz @f
196
		or dword[def_dr_mode], 1 shl bit_faces_fill
197
	@@:
198
	stdcall dword[ini_get_int],file_name,ini_sec_w3d,key_dl,1
199
	or eax,eax
200
	jz @f
201
		or dword[def_dr_mode], 1 shl bit_light
202
	@@:
203
	stdcall dword[ini_get_color],file_name,ini_sec_w3d,key_ox,0x0000ff
204
	mov [color_ox],eax
205
	stdcall dword[ini_get_color],file_name,ini_sec_w3d,key_oy,0xff0000
206
	mov [color_oy],eax
207
	stdcall dword[ini_get_color],file_name,ini_sec_w3d,key_oz,0x00ff00
208
	mov [color_oz],eax
209
	stdcall dword[ini_get_color],file_name,ini_sec_w3d,key_bk,0x000000
210
	mov [color_bk],eax
211
	shr eax,8
212
	mov [color_bk+4],eax
213
	shr eax,8
214
	mov [color_bk+8],eax
215
	stdcall dword[ini_get_color],file_name,ini_sec_w3d,key_vert,0xffffff
216
	mov [color_vert],eax
217
	stdcall dword[ini_get_color],file_name,ini_sec_w3d,key_face,0x808080
218
	mov [color_face],eax
219
	finit
220
	fild dword[color_bk+8]
221
	fdiv dword[fl255]
222
	fstp dword[color_bk+8]
223
	mov eax,[color_bk+4]
224
	and eax,0xff
225
	mov [color_bk+4],eax
226
	fild dword[color_bk+4]
227
	fdiv dword[fl255]
228
	fstp dword[color_bk+4]
229
	mov eax,[color_bk]
230
	and eax,0xff
231
	mov [color_bk],eax
232
	fild dword[color_bk]
233
	fdiv dword[fl255]
234
	fstp dword[color_bk]
2051 IgorA 235
 
236
	mcall 26,9
237
	mov [last_time],eax
238
 
5938 IgorA 239
	stdcall [kosglMakeCurrent], 3d_wnd_l,3d_wnd_t,3d_wnd_w,3d_wnd_h,ctx1
5930 IgorA 240
	stdcall [glEnable], GL_DEPTH_TEST
241
	stdcall [glEnable], GL_NORMALIZE ;делам нормали одинаковой величины во избежание артефактов
5938 IgorA 242
	stdcall [glClearColor], [color_bk+8],[color_bk+4],[color_bk],0.0
5930 IgorA 243
	stdcall [glShadeModel], GL_SMOOTH
244
	stdcall [gluNewQuadric]
245
	mov [qObj],eax
246
 
2051 IgorA 247
	call draw_window
248
 
249
align 4
250
still:
251
	mcall 26,9
252
	mov ebx,[last_time]
253
	add ebx,10 ;задержка
254
	cmp ebx,eax
255
	jge @f
256
		mov ebx,eax
257
	@@:
258
	sub ebx,eax
259
	mcall 23
260
	cmp eax,0
261
	je timer_funct
262
 
263
	cmp al,1
5930 IgorA 264
	jne @f
265
		call draw_window
266
		jmp still
267
	@@:
2051 IgorA 268
	cmp al,2
269
	jz key
270
	cmp al,3
271
	jz button
272
	cmp al,6
2125 IgorA 273
	jne @f
274
		mcall 9,procinfo,-1
275
		cmp ax,word[procinfo+4]
276
		jne @f ;окно не активно
2051 IgorA 277
		call mouse
278
	@@:
279
	jmp still
280
 
281
align 4
282
mouse:
283
	stdcall [tl_mouse], dword tree1
284
	ret
285
 
286
align 4
287
timer_funct:
288
	pushad
289
	mcall 26,9
290
	mov [last_time],eax
291
 
5935 IgorA 292
	;просматриваем выделенный блок данных
2051 IgorA 293
	stdcall [tl_node_get_data],tree1
5911 IgorA 294
	cmp eax,0
2051 IgorA 295
	je @f
5911 IgorA 296
		mov ebx,eax
2051 IgorA 297
		mov eax,dword[ebx] ;получаем значение сдвига выбранного блока относительно начала файла
2125 IgorA 298
		mov ecx,dword[ebx+4] ;размер блока
2051 IgorA 299
		stdcall hex_in_str, txt_3ds_offs.dig, eax,8
2125 IgorA 300
		stdcall hex_in_str, txt_3ds_offs.siz, ecx,8
2051 IgorA 301
 
5938 IgorA 302
		add eax,dword[open_file_data] ;получаем значение сдвига в памяти
2051 IgorA 303
		cmp dword[offs_last_timer],eax
304
		je @f
5935 IgorA 305
			;если выделенный блок данных не совпадает с последним запомненным
2051 IgorA 306
			mov dword[offs_last_timer],eax
307
			call buf_draw_beg
2080 IgorA 308
			stdcall [buf2d_draw_text], buf_0, buf_1,txt_3ds_offs,5,35,0xb000
4332 IgorA 309
			mov edx,dword[ebx+list_offs_p_data]
2080 IgorA 310
			cmp edx,0 ;смотрим есть ли описание блока
311
			je .no_info
312
				stdcall [buf2d_draw_text], buf_0, buf_1,edx,5,45,0xb000
313
			.no_info:
2051 IgorA 314
			add ecx,eax ;получаем размер блока
315
			stdcall buf_draw_hex_table,eax,ecx ;добавление 16-ричных данных
316
			stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране
317
	@@:
318
	popad
319
	jmp still
320
 
321
align 4
322
buf_draw_beg:
323
	stdcall [buf2d_clear], buf_0, [buf_0.color] ;чистим буфер
324
	stdcall [buf2d_draw_text], buf_0, buf_1,txt_open_3ds,5,5,0xff
325
	stdcall [buf2d_draw_text], buf_0, buf_1,openfile_path,5,15,0xff
2052 IgorA 326
	cmp dword[level_stack],FILE_ERROR_CHUNK_SIZE ;возможна ошибка файла
327
	jne @f
328
		stdcall [buf2d_draw_text], buf_0, buf_1,txt_3ds_err_sizes,5,25,0xff0000
329
	@@:
2051 IgorA 330
	ret
331
 
332
align 4
333
proc buf_draw_hex_table, offs:dword, size_line:dword
334
	pushad
335
	locals
2080 IgorA 336
		coord_y dd 55 ;координата y для начала вывода таблицы
2051 IgorA 337
	endl
338
		mov esi,dword[offs]
5938 IgorA 339
		mov edi,dword[open_file_data]
2080 IgorA 340
		add edi,dword[file_3ds.size] ;edi - указатель на конец файла в памяти
2051 IgorA 341
		mov dword[txt_3ds_offs.dig],0
342
		cld
343
		.cycle_rows:
344
			mov ebx,5 ;отступ слева для цифр
345
			mov edx,5+10*24 ;отступ слева для текста
346
			mov ecx,10
347
			@@:
348
				stdcall hex_in_str, txt_3ds_offs.dig, dword[esi],2
349
				stdcall [buf2d_draw_text], buf_0, buf_1,txt_3ds_offs.dig,ebx,[coord_y],0
350
 
351
				mov al,byte[esi]
352
				mov byte[txt_3ds_symb],al
353
				stdcall [buf2d_draw_text], buf_0, buf_1,txt_3ds_symb,edx,[coord_y],0x808080
354
				inc esi
355
				cmp esi,dword[size_line]
356
				jne .end_block
357
					stdcall draw_block_end_line, dword[coord_y]
358
				.end_block:
359
				cmp esi,edi
360
				jge @f ;jg ???
361
				add ebx,24
362
				add edx,9 ;ширина 1-го символа +1pix
363
				loop @b
364
			add dword[coord_y],10 ;высота 1-го символа (или интервал между строками)
365
			mov ebx,dword[buf_0.h]
366
			cmp dword[coord_y],ebx
367
			jl .cycle_rows
368
		@@:
369
	popad
370
	ret
371
endp
372
 
373
align 4
5930 IgorA 374
proc draw_block_end_line uses eax ebx ecx, coord_y:dword
375
	add ebx,20 ;20 = width 2.5 symbols
376
	mov eax,[coord_y]
377
	sub eax,2
378
	mov ecx,eax
379
	add ecx,10
380
	stdcall [buf2d_line], buf_0, 0,ecx,ebx,ecx ,0xff
381
	stdcall [buf2d_line], buf_0, ebx,ecx,ebx,eax ,0xff
382
	stdcall [buf2d_line], buf_0, ebx,eax,5+10*24-4,eax ,0xff
2051 IgorA 383
	ret
384
endp
385
 
386
align 4
387
draw_window:
388
pushad
389
	mcall 12,1
390
	xor eax,eax
391
	mov edx,[sc.work]
5930 IgorA 392
	or  edx,0x33000000
2051 IgorA 393
	mov edi,capt
5930 IgorA 394
	mcall , (20 shl 16)+560, (20 shl 16)+main_wnd_height
2051 IgorA 395
 
2125 IgorA 396
	mcall 9,procinfo,-1
397
	mov eax,dword[procinfo.box.height]
398
	cmp eax,250
399
	jge @f
400
		mov eax,250
401
	@@:
402
	sub eax,65
403
	mov dword[tree1.box_height],eax
404
	mov word[w_scr_t1+4],ax ;новые размеры скроллинга
2136 IgorA 405
	cmp eax,dword[buf_0.h] ;увеличиваем высоту буфера
406
	jle @f
407
		stdcall [buf2d_resize],buf_0,0,eax
408
		mov dword[offs_last_timer],0 ;для обновления буфера в таймере
409
	@@:
2125 IgorA 410
 
2136 IgorA 411
	mov eax,dword[procinfo.box.width]
412
	cmp eax,400
413
	jge @f
414
		mov eax,400
415
	@@:
416
	sub eax,[buf_0.w]
417
	sub eax,41
418
	mov dword[tree1.box_width],eax
419
	add ax,word[tree1.box_left]
5911 IgorA 420
	mov word[w_scr_t1+sb_offs_start_x],ax
2136 IgorA 421
	add ax,16+5
422
	mov word[buf_0.l],ax
423
 
2051 IgorA 424
	mov esi,[sc.work_button]
5911 IgorA 425
	mcall 8,(5 shl 16)+20,(5 shl 16)+20,3
2051 IgorA 426
 
427
	mov ebx,(30 shl 16)+20
428
	mov edx,4
429
	int 0x40
430
 
2173 IgorA 431
	cmp byte[can_save],0
432
	je @f
433
		mov ebx,(55 shl 16)+20
434
		mov edx,5
435
		int 0x40
436
	@@:
2051 IgorA 437
 
5911 IgorA 438
	mcall ,(85 shl 16)+20,,6 ;окно с координатами
439
	mcall ,(110 shl 16)+20,,7 ;удаление блока
2051 IgorA 440
 
5911 IgorA 441
	mcall 7,[image_data_toolbar],(16 shl 16)+16,(7 shl 16)+7 ;new
4332 IgorA 442
 
2051 IgorA 443
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
444
	mov edx,(32 shl 16)+7 ;open
445
	int 0x40
446
 
2173 IgorA 447
	cmp byte[can_save],0
448
	je @f
449
		add ebx,IMAGE_TOOLBAR_ICON_SIZE
450
		mov edx,(57 shl 16)+7 ;save
451
		int 0x40
4332 IgorA 452
		sub ebx,IMAGE_TOOLBAR_ICON_SIZE
2173 IgorA 453
	@@:
2051 IgorA 454
 
4332 IgorA 455
	add ebx,4*IMAGE_TOOLBAR_ICON_SIZE
456
	mov edx,(87 shl 16)+7
457
	int 0x40
458
 
459
	add ebx,IMAGE_TOOLBAR_ICON_SIZE
460
	mov edx,(112 shl 16)+7
461
	int 0x40
462
 
2051 IgorA 463
	mov dword[w_scr_t1.all_redraw],1
464
	stdcall [tl_draw],dword tree1
465
 
466
	stdcall [buf2d_draw], buf_0
467
 
468
	mcall 12,2
469
popad
470
	ret
471
 
472
align 4
473
key:
474
	mcall 2
475
	stdcall [tl_key], dword tree1
476
	jmp still
477
 
478
 
479
align 4
480
button:
481
	mcall 17
482
	cmp ah,3
483
	jne @f
484
		call but_new_file
5881 IgorA 485
		jmp still
2051 IgorA 486
	@@:
487
	cmp ah,4
488
	jne @f
489
		call but_open_file
5881 IgorA 490
		jmp still
2051 IgorA 491
	@@:
492
	cmp ah,5
493
	jne @f
494
		call but_save_file
5881 IgorA 495
		jmp still
2051 IgorA 496
	@@:
2165 IgorA 497
	cmp ah,6
498
	jne @f
499
		call but_wnd_coords
5881 IgorA 500
		jmp still
2165 IgorA 501
	@@:
4332 IgorA 502
	cmp ah,7
503
	jne @f
504
		call but_delete_chunk
5881 IgorA 505
		jmp still
4332 IgorA 506
	@@:
2051 IgorA 507
 
508
	cmp ah,1
509
	jne still
510
.exit:
511
	mov dword[tree1.data_img],0
512
	mov dword[tree1.data_img_sys],0
5911 IgorA 513
	stdcall [tl_data_clear], tree1
2051 IgorA 514
	stdcall [buf2d_delete],buf_0
515
	stdcall [buf2d_delete],buf_1 ;удаляем буфер
516
	stdcall mem.Free,[image_data_toolbar]
5938 IgorA 517
	stdcall mem.Free,[open_file_data]
5930 IgorA 518
	stdcall [gluDeleteQuadric], [qObj]
2051 IgorA 519
	mcall -1
520
 
521
 
522
align 4
523
but_new_file:
2173 IgorA 524
	mov byte[can_save],0
2051 IgorA 525
	stdcall [tl_info_clear], tree1 ;очистка списка объектов
526
	stdcall [buf2d_clear], buf_0, [buf_0.color] ;чистим буфер
527
	stdcall [tl_draw], tree1
528
	stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране
529
	ret
530
 
531
align 4
532
but_open_file:
5881 IgorA 533
	copy_path open_dialog_name,communication_area_default_path,file_name,0
2051 IgorA 534
	pushad
535
	mov [OpenDialog_data.type],0
536
	stdcall [OpenDialog_Start],OpenDialog_data
537
	cmp [OpenDialog_data.status],2
538
	je .end_open_file
539
	;код при удачном открытии диалога
540
 
5938 IgorA 541
    mov [run_file_70.Function], 5
542
    mov [run_file_70.Position], 0
543
    mov [run_file_70.Flags], 0
544
    mov dword[run_file_70.Count], 0
545
    mov dword[run_file_70.Buffer], open_b
546
    mov byte[run_file_70+20], 0
547
    mov dword[run_file_70.FileName], openfile_path
548
    mcall 70,run_file_70
2051 IgorA 549
 
5938 IgorA 550
    mov ecx,dword[open_b+32] ;+32 qword: размер файла в байтах
551
    stdcall mem.ReAlloc,[open_file_data],ecx
552
    mov [open_file_data],eax
553
 
554
    mov [run_file_70.Function], 0
555
    mov [run_file_70.Position], 0
556
    mov [run_file_70.Flags], 0
557
    mov dword[run_file_70.Count], ecx
558
    m2m dword[run_file_70.Buffer], dword[open_file_data]
559
    mov byte[run_file_70+20], 0
560
    mov dword[run_file_70.FileName], openfile_path
561
    mcall 70,run_file_70 ;загружаем файл 3ds
562
    cmp ebx,0xffffffff
563
    je .end_open_file
564
 
4332 IgorA 565
	mov [open_file_size],ebx
2051 IgorA 566
	;mcall 71,1,openfile_path
567
 
2173 IgorA 568
	mov byte[can_save],0
4332 IgorA 569
	call init_tree
570
	stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране
5935 IgorA 571
	call prop_wnd_clear_param ;чистим параметры окна с координатами
5930 IgorA 572
	cmp byte[prop_wnd_run],0
573
	je @f
574
		;чистим окно с координатами
575
		stdcall [tl_info_clear], tree3
576
	@@:
4332 IgorA 577
 
578
	.end_open_file:
579
	popad
580
	ret
581
 
582
align 4
583
init_tree:
2051 IgorA 584
	stdcall [tl_info_clear], tree1 ;очистка списка объектов
585
 
5938 IgorA 586
	mov esi,dword[open_file_data]
2051 IgorA 587
	cmp word[esi],CHUNK_MAIN
588
	je @f
589
		call buf_draw_beg
590
		stdcall [buf2d_draw_text], buf_0, buf_1,txt_no_3ds,5,25,0xff0000 ;рисуем строку с текстом
591
		jmp .end_open
592
	@@:
593
	;--- обработка открытого *.3ds файла
594
	mov eax,file_3ds
595
	mov dword[level_stack],0 ;обнуляем уровень стека
596
	mov dword[offs_last_timer],0
597
	;--- добавление главного блока в список
2080 IgorA 598
	stdcall add_3ds_object, ID_ICON_CHUNK_MAIN,0,dword[esi+2],0
2051 IgorA 599
	call block_children ;вход в дочерний блок
600
 
2052 IgorA 601
	mov edi,dword[file_3ds.offs]
602
	add edi,dword[file_3ds.size]
2051 IgorA 603
	.cycle_main:
604
		cmp dword[level_stack],0
2052 IgorA 605
		jle .end_cycle
606
 
607
		cmp esi,edi ;если конец файла
608
		jge .end_cycle
2051 IgorA 609
 
2080 IgorA 610
		mov edx,dword[esi+2] ;размер блока
2051 IgorA 611
		call block_analiz
2080 IgorA 612
		cmp dword[bl_found],0
2051 IgorA 613
		jne @f
614
			;объект не известного вида
2080 IgorA 615
			stdcall add_3ds_object, ID_ICON_CHUNK_NOT_FOUND,dword[level_stack],edx,0
2051 IgorA 616
			call block_next
617
			jmp .cycle_main
618
		@@:
619
			;объект известного вида
2080 IgorA 620
			mov ecx,dword[bl_found]
2051 IgorA 621
			mov bx,word[ecx+2] ;номер иконки для объекта
2080 IgorA 622
			stdcall add_3ds_object, ebx,dword[level_stack],edx,dword[ecx+5]
2051 IgorA 623
			cmp byte[ecx+4],1
624
			je .bl_data
625
				;блок содержит дочерние блоки
626
				call block_children ;вход в дочерний блок
627
				jmp .cycle_main
628
			.bl_data:
629
				;блок содержит данные
630
				call block_analiz_data
631
				jmp .cycle_main
632
	.end_cycle:
633
		stdcall [tl_cur_beg], tree1
634
		stdcall [tl_draw], tree1
635
	.end_open:
636
	ret
637
 
638
;анализ данных блока
639
;input:
640
; esi - memory pointer
2080 IgorA 641
;output:
642
; eax - new stack pointer
643
; esi - new memory pointer
2051 IgorA 644
align 4
645
block_analiz_data:
2080 IgorA 646
	push ebx ecx edx edi
647
		mov dx,word[esi]
2052 IgorA 648
		mov ecx,dword[esi+2]
649
		sub ecx,6 ;размер данных в блоке
2051 IgorA 650
		add esi,6
651
		mov ebx,dword[level_stack]
652
		inc ebx
2080 IgorA 653
		; *** анализ блоков с разными данными и выделением подблоков
654
		cmp dx,CHUNK_OBJBLOCK ;объект
655
		jne @f
2136 IgorA 656
			push ax
657
				cld
658
				xor al,al
659
				mov edi,esi
660
				repne scasb
661
			pop ax
662
			sub edi,esi ;edi - strlen
663
			stdcall add_3ds_object, ID_ICON_DATA,ebx,edi,0 ;название объекта
664
			add esi,edi
665
			;sub ecx,edi ;уже сделано в repne
2080 IgorA 666
			jmp .next_bl
667
		@@:
2125 IgorA 668
		cmp dx,CHUNK_VERTLIST ;список вершин
669
		je .vertexes
670
		cmp dx,0x4111 ;флаги вершин
671
		je .vertexes
2136 IgorA 672
		cmp dx,CHUNK_MAPLIST ;текстурные координаты
2125 IgorA 673
		je .vertexes
674
		jmp @f
675
		.vertexes: ;обработка блоков, содержащих данные вершин
2136 IgorA 676
			stdcall add_3ds_object, ID_ICON_DATA,ebx,2,txt_count ;число вершин
2125 IgorA 677
			add esi,2
678
			sub ecx,2
679
			stdcall add_3ds_object, ID_ICON_DATA,ebx,ecx,0 ;данные вершин
680
			sub esi,8 ;восстановление esi
681
			call block_next
682
			jmp .end_f
683
		@@:
2136 IgorA 684
		cmp dx,CHUNK_FACELIST ;список граней
685
		jne @f
686
			stdcall add_3ds_object, ID_ICON_DATA,ebx,2,txt_count ;число граней
687
			push eax
688
			xor eax,eax
689
			mov ax,[esi]
690
			shl eax,3
691
			add esi,2
692
			sub ecx,2
693
			stdcall add_3ds_object, ID_ICON_DATA,ebx,eax,0 ;данные вершин
694
 
695
			sub ecx,eax
696
			cmp ecx,1
697
			jl .data_3 ;проверяем есть ли блок описывающий материал, применяемый к объекту
698
				add esi,eax
699
				pop eax
700
				jmp .next_bl
701
				;stdcall add_3ds_object, ID_ICON_DATA,ebx,ecx,0 ;данные материала
702
				;sub esi,eax ;восстановление esi
703
			.data_3:
704
 
705
			sub esi,8 ;восстановление esi
706
			pop eax
707
			call block_next
708
			jmp .end_f
709
		@@:
710
		cmp dx,CHUNK_FACEMAT ;материалы граней
711
		jne @f
712
			push ax
713
				cld
714
				xor al,al
715
				mov edi,esi
716
				repne scasb
717
			pop ax
718
			sub edi,esi ;edi - strlen
719
			stdcall add_3ds_object, ID_ICON_DATA,ebx,edi,0 ;название объекта
720
			add esi,edi
721
			;sub ecx,edi ;уже сделано в repne
722
			stdcall add_3ds_object, ID_ICON_DATA,ebx,2,txt_count ;число граней
723
			add esi,2
724
			sub ecx,2
725
			stdcall add_3ds_object, ID_ICON_DATA,ebx,ecx,0 ;номера граней, к которым применен материал
726
			sub esi,edi ;восстановление esi (1)
727
			sub esi,8   ;восстановление esi (2)
728
			call block_next
729
			jmp .end_f
730
		@@:
2080 IgorA 731
		; *** анализ блока с данными по умолчанию (без выделения подблоков)
732
			stdcall add_3ds_object, ID_ICON_DATA,ebx,ecx,0
733
			sub esi,6 ;восстановление esi
734
			call block_next
735
			jmp .end_f
736
		.next_bl:
737
		; *** настройки для анализа оставшихся подблоков
738
			mov dword[eax],esi ;указатель на начало блока
739
			mov ebx,dword[esi+2]
740
			mov dword[eax+4],ebx ;размер блока
741
			inc dword[level_stack]
742
			add eax,8
2051 IgorA 743
		.end_f:
2080 IgorA 744
	pop edi edx ecx ebx
2051 IgorA 745
	ret
746
 
2052 IgorA 747
;вход в 1-й дочерний блок
748
;output:
749
; edx - destroy
2051 IgorA 750
align 4
751
block_children:
2052 IgorA 752
	push ecx
753
		;проверка правильности размеров дочернего блока
754
		mov ebx,esi ;смещение начала родительского блока
755
		add ebx,6 ;переход на начало дочернего блока
756
		add ebx,dword[ebx+2] ;добавляем размер дочернего блока
757
		mov ecx,esi ;смещение начала родительского блока
758
		add ecx,dword[esi+2] ;добавляем размер родительского блока
759
		cmp ebx,ecx ;учитывать заголовки не нужно, т. к. сравниваются только данные блоков
760
		jle @f
761
			;диагностировали ошибку файла, дочерний блок выходит за пределы родительского
762
			mov dword[level_stack],FILE_ERROR_CHUNK_SIZE
763
			jmp .end_f
764
		@@:
765
		mov dword[eax],esi ;указатель на начало блока
766
		mov ebx,dword[esi+2]
767
		mov dword[eax+4],ebx ;размер блока
768
		add esi,6 ;переходим к данным блока
769
		inc dword[level_stack]
770
		add eax,8
771
	.end_f:
772
	pop ecx
2051 IgorA 773
	ret
774
 
775
;переход к следущему блоку текущего уровня
4332 IgorA 776
;input:
777
; eax - адрес структуры с переменными
2051 IgorA 778
align 4
779
block_next:
780
push ebx
781
	add esi,dword[esi+2] ;пропускаем данные блока
782
 
783
	;проверка размеров родительского блока, для возможного выхода на верхний уровень если конец блока
2080 IgorA 784
	@@:
2051 IgorA 785
	mov ebx,dword[eax-8]
786
	add ebx,dword[eax-4]
787
	cmp esi,ebx
788
	jl @f
789
		dec dword[level_stack]
790
		sub eax,8
2080 IgorA 791
		cmp dword[level_stack],0
792
		jg @b
2051 IgorA 793
	@@:
794
pop ebx
795
	ret
796
 
2080 IgorA 797
;функция поиска структуры описывающей блок
2051 IgorA 798
;input:
799
;esi - memory pointer
800
;output:
2080 IgorA 801
;dword[bl_found] - pointer to chunk struct (= 0 if not found)
2051 IgorA 802
align 4
2080 IgorA 803
bl_found dd 0
2051 IgorA 804
block_analiz:
805
pushad
2080 IgorA 806
	mov dword[bl_found],0
2051 IgorA 807
	mov ecx,type_bloks
808
	@@:
809
		mov bx,word[ecx]
810
		cmp word[esi],bx
811
		je .found
812
		add ecx,sizeof.block_3ds
813
		cmp ecx,type_bloks.end
814
		jl @b
815
	jmp .no_found
816
	.found:
2080 IgorA 817
		mov dword[bl_found],ecx
2051 IgorA 818
	.no_found:
819
popad
820
	ret
821
 
822
;input:
823
; esi - указатель на анализируемые данные
4332 IgorA 824
; level - уровень вложенности узла
825
; size_bl - размер блока
2051 IgorA 826
align 4
2080 IgorA 827
proc add_3ds_object, icon:dword,level:dword,size_bl:dword,info_bl:dword
2051 IgorA 828
	pushad
829
		mov bx,word[icon]
830
		shl ebx,16
831
		mov bx,word[level]
832
 
833
		mov eax,esi
5938 IgorA 834
		sub eax,dword[open_file_data]
2051 IgorA 835
		mov dword[buffer],eax ;смещение блока
836
		mov ecx,dword[size_bl]
837
		mov dword[buffer+4],ecx ;размер блока (используется в функции buf_draw_hex_table для рисования линии)
4332 IgorA 838
		mov ecx,dword[bl_found]
839
		cmp ecx,0
840
		je @f
841
			;... здесь нужен другой алгоритм защиты от удаления
842
			mov cl,byte[ecx+4]
843
		@@:
844
		mov byte[buffer+list_offs_chunk_del],cl
845
		mov ecx,[level]
846
		mov byte[buffer+list_offs_chunk_lev],cl
2080 IgorA 847
		mov ecx,dword[info_bl]
4332 IgorA 848
		mov dword[buffer+list_offs_p_data],ecx
2080 IgorA 849
		stdcall hex_in_str, buffer+list_offs_text,dword[esi+1],2
850
		stdcall hex_in_str, buffer+list_offs_text+2,dword[esi],2 ;код 3ds блока
851
		cmp ecx,0
852
		jne @f
4332 IgorA 853
			mov byte[buffer+list_offs_text+4],0 ;0 - символ конца строки
2080 IgorA 854
			jmp .no_capt
855
		@@:
856
			mov byte[buffer+list_offs_text+4],' '
857
			mov esi,ecx
858
			mov edi,buffer+list_offs_text+5
859
			mov ecx,size_one_list-(list_offs_text+5)
860
			cld
861
			rep movsb
5935 IgorA 862
			mov byte[buffer+size_one_list-1],0 ;0 - символ конца строки
2080 IgorA 863
		.no_capt:
5911 IgorA 864
		stdcall [tl_node_add], tree1, ebx, buffer
2051 IgorA 865
		stdcall [tl_cur_next], tree1
866
		if debug
2080 IgorA 867
			stdcall print_err,sz_add_3ds_object,buffer+list_offs_text
2051 IgorA 868
		end if
869
	popad
870
	ret
871
endp
872
 
873
if debug
874
sz_add_3ds_object db 13,10,'3ds_object',0
875
 
876
align 4
877
proc print_err, fun:dword, mes:dword ;выводим сообщение об шибке на доску отладки
878
	pushad
879
	mov eax,63
880
	mov ebx,1
881
 
882
	mov esi,[fun]
883
	@@:
884
		mov cl,byte[esi]
885
		int 0x40
886
		inc esi
887
		cmp byte[esi],0
888
		jne @b
889
	mov cl,':'
890
	int 0x40
891
	mov cl,' '
892
	int 0x40
893
	mov esi,[mes]
894
	@@:
895
		mov cl,byte[esi]
896
		int 0x40
897
		inc esi
898
		cmp byte[esi],0
899
		jne @b
900
	popad
901
	ret
902
endp
5935 IgorA 903
 
5938 IgorA 904
end if
905
 
5935 IgorA 906
;input:
907
; eax - value
5938 IgorA 908
; buf - string buffer
5935 IgorA 909
; len - buffer len
910
;output:
911
align 4
5938 IgorA 912
proc convert_int_to_str, buf:dword, len:dword
5935 IgorA 913
pushad
5938 IgorA 914
	mov edi,[buf]
5935 IgorA 915
	mov esi,[len]
916
	add esi,edi
917
	dec esi
918
	call .str
919
popad
920
	ret
921
endp
922
 
923
align 4
924
.str:
925
	mov ecx,0x0a
926
	cmp eax,ecx
927
	jb @f
928
		xor edx,edx
929
		div ecx
930
		push edx
931
		call .str
932
		pop eax
933
	@@:
934
	cmp edi,esi
935
	jge @f
936
		or al,0x30
937
		stosb
938
		mov byte[edi],0
939
	@@:
940
	ret
941
 
2051 IgorA 942
align 4
943
proc hex_in_str, buf:dword,val:dword,zif:dword
944
	pushad
945
		mov edi,dword[buf]
946
		mov ecx,dword[zif]
947
		add edi,ecx
948
		dec edi
949
		mov ebx,dword[val]
950
 
951
		.cycle:
952
			mov al,bl
953
			and al,0xf
954
			cmp al,10
955
			jl @f
956
				add al,'a'-'0'-10
957
			@@:
958
			add al,'0'
959
			mov byte[edi],al
960
			dec edi
961
			shr ebx,4
962
		loop .cycle
963
 
964
	popad
965
	ret
966
endp
967
 
968
align 4
969
but_save_file:
2173 IgorA 970
	pushad
971
	copy_path open_dialog_name,communication_area_default_path,file_name,0
972
	mov [OpenDialog_data.type],1
973
	stdcall [OpenDialog_Start],OpenDialog_data
974
	cmp [OpenDialog_data.status],2
975
	je .end_save_file
976
	;код при удачном открытии диалога
977
 
978
	mov [run_file_70.Function], 2
979
	mov [run_file_70.Position], 0
980
	mov [run_file_70.Flags], 0
5938 IgorA 981
	mov ebx, dword[open_file_data]
2173 IgorA 982
	mov [run_file_70.Buffer], ebx
983
	mov ebx,dword[ebx+2]
984
	mov dword[run_file_70.Count], ebx ;размер файла
985
	mov byte[run_file_70+20], 0
986
	mov dword[run_file_70.FileName], openfile_path
5935 IgorA 987
	mcall 70,run_file_70
2173 IgorA 988
	cmp ebx,0xffffffff
989
	je .end_save_file
5935 IgorA 990
		;...сообщение...
2173 IgorA 991
	.end_save_file:
992
	popad
2051 IgorA 993
	ret
994
 
2165 IgorA 995
align 4
996
but_wnd_coords:
997
	cmp byte[prop_wnd_run],0
998
	jne @f
999
		pushad
1000
		mcall 51,1,prop_start,thread_coords
1001
		popad
1002
	@@:
1003
	ret
2051 IgorA 1004
 
4332 IgorA 1005
;description:
1006
; удаление выбранного блока из открытого файла
1007
align 4
1008
but_delete_chunk:
1009
	pushad
1010
	stdcall [tl_node_get_data],tree1
5911 IgorA 1011
	cmp eax,0
4332 IgorA 1012
	je .end_f
5911 IgorA 1013
	cmp byte[eax+list_offs_chunk_del],0 ;если блок защищен от удаления
4332 IgorA 1014
	jne .notify
2051 IgorA 1015
 
4332 IgorA 1016
	;(1) копирование нижней части файла
5911 IgorA 1017
	mov edx,dword[eax+4] ;размер блока
4332 IgorA 1018
	sub [open_file_size],edx ;изменение размеров файла
1019
	mov ecx,[open_file_size]
5911 IgorA 1020
	mov ebx,dword[eax] ;получаем значение сдвига выбранного блока относительно начала файла
1021
	sub ecx,ebx ;ecx - размер нижней сдвигаемой части файла
5938 IgorA 1022
	add ebx,dword[open_file_data] ;получаем значение сдвига в памяти
5911 IgorA 1023
	mov edi,ebx
1024
	mov esi,ebx
4332 IgorA 1025
	add esi,edx
5911 IgorA 1026
	mov bl,byte[eax+list_offs_chunk_lev] ;берем уровень текущего узла
4332 IgorA 1027
	rep movsb
1028
	mov byte[can_save],1
1029
 
1030
	;(2) изменение размеров родительских блоков
5911 IgorA 1031
	cmp bl,0
4332 IgorA 1032
	je .end_2
1033
	.cycle_2:
1034
	stdcall [tl_cur_perv], tree1
1035
	stdcall [tl_node_get_data],tree1
5911 IgorA 1036
	cmp eax,0
4332 IgorA 1037
	je .end_2
5911 IgorA 1038
		cmp byte[eax+list_offs_chunk_lev],bl
4332 IgorA 1039
		jge .cycle_2
5911 IgorA 1040
		mov bl,byte[eax+list_offs_chunk_lev]
1041
		mov ecx,[eax]
5938 IgorA 1042
		add ecx,[open_file_data]
4332 IgorA 1043
		sub dword[ecx+2],edx
5911 IgorA 1044
		cmp bl,0 ;если самый верхний узел, то bl=0
4332 IgorA 1045
		jne .cycle_2
1046
	.end_2:
1047
 
1048
	;(3) обновление списка tree1
1049
	call init_tree
1050
	call draw_window
1051
 
1052
	jmp .end_f
1053
	.notify:
1054
	notify_window_run txt_not_delete
1055
	.end_f:
1056
	popad
1057
	ret
1058
 
2051 IgorA 1059
;input:
1060
; buf - указатель на строку, число должно быть в 10 или 16 ричном виде
1061
;output:
1062
; eax - число
1063
align 4
5881 IgorA 1064
proc conv_str_to_int uses ebx ecx esi, buf:dword
2051 IgorA 1065
	xor eax,eax
1066
	xor ebx,ebx
1067
	mov esi,[buf]
1068
	;определение отрицательных чисел
1069
	xor ecx,ecx
1070
	inc ecx
1071
	cmp byte[esi],'-'
1072
	jne @f
1073
		dec ecx
1074
		inc esi
1075
	@@:
1076
 
1077
	cmp word[esi],'0x'
1078
	je .load_digit_16
1079
 
1080
	.load_digit_10: ;считывание 10-тичных цифр
1081
		mov bl,byte[esi]
1082
		cmp bl,'0'
1083
		jl @f
1084
		cmp bl,'9'
1085
		jg @f
1086
			sub bl,'0'
1087
			imul eax,10
1088
			add eax,ebx
1089
			inc esi
1090
			jmp .load_digit_10
1091
	jmp @f
1092
 
1093
	.load_digit_16: ;считывание 16-ричных цифр
1094
		add esi,2
1095
	.cycle_16:
1096
		mov bl,byte[esi]
1097
		cmp bl,'0'
1098
		jl @f
1099
		cmp bl,'f'
1100
		jg @f
1101
		cmp bl,'9'
1102
		jle .us1
1103
			cmp bl,'A'
1104
			jl @f ;отсеиваем символы >'9' и <'A'
1105
		.us1: ;составное условие
1106
		cmp bl,'F'
1107
		jle .us2
1108
			cmp bl,'a'
1109
			jl @f ;отсеиваем символы >'F' и <'a'
1110
			sub bl,32 ;переводим символы в верхний регистр, для упрощения их последущей обработки
1111
		.us2: ;составное условие
1112
			sub bl,'0'
1113
			cmp bl,9
1114
			jle .cor1
1115
				sub bl,7 ;convert 'A' to '10'
1116
			.cor1:
1117
			shl eax,4
1118
			add eax,ebx
1119
			inc esi
1120
			jmp .cycle_16
1121
	@@:
1122
	cmp ecx,0 ;если число отрицательное
1123
	jne @f
1124
		sub ecx,eax
1125
		mov eax,ecx
1126
	@@:
1127
	ret
1128
endp
1129
 
1130
;данные для диалога открытия файлов
1131
align 4
1132
OpenDialog_data:
1133
.type			dd 0 ;0 - открыть, 1 - сохранить, 2 - выбрать дтректорию
5930 IgorA 1134
.procinfo		dd procinfo ;+4
1135
.com_area_name	dd communication_area_name ;+8
1136
.com_area		dd 0 ;+12
1137
.opendir_path	dd plugin_path ;+16
2051 IgorA 1138
.dir_default_path	dd default_dir ;+20
1139
.start_path		dd file_name ;+24 путь к диалогу открытия файлов
5930 IgorA 1140
.draw_window	dd draw_window ;+28
1141
.status 		dd 0 ;+32
1142
.openfile_path	dd openfile_path ;+36 путь к открываемому файлу
1143
.filename_area	dd filename_area ;+40
1144
.filter_area	dd Filter
2051 IgorA 1145
.x:
1146
.x_size 		dw 420 ;+48 ; Window X size
1147
.x_start		dw 10 ;+50 ; Window X position
1148
.y:
1149
.y_size 		dw 320 ;+52 ; Window y size
1150
.y_start		dw 10 ;+54 ; Window Y position
1151
 
1152
default_dir db '/rd/1',0
1153
 
1154
communication_area_name:
1155
	db 'FFFFFFFF_open_dialog',0
1156
open_dialog_name:
1157
	db 'opendial',0
1158
communication_area_default_path:
1159
	db '/rd/1/File managers/',0
1160
 
1161
Filter:
1162
dd Filter.end - Filter.1
1163
.1:
1164
db '3DS',0
1165
db 'TXT',0
1166
.end:
1167
db 0
1168
 
1169
 
5930 IgorA 1170
align 4
2051 IgorA 1171
system_dir_0 db '/sys/lib/'
1172
lib_name_0 db 'proc_lib.obj',0
1173
system_dir_1 db '/sys/lib/'
1174
lib_name_1 db 'libimg.obj',0
1175
system_dir_2 db '/sys/lib/'
1176
lib_name_2 db 'box_lib.obj',0
5881 IgorA 1177
system_dir_3 db '/sys/lib/'
1178
lib_name_3 db 'buf2d.obj',0
5930 IgorA 1179
system_dir_4 db '/sys/lib/'
1180
lib_name_4 db 'kmenu.obj',0
1181
system_dir_5 db '/sys/lib/'
1182
lib_name_5 db 'tinygl.obj',0
5938 IgorA 1183
system_dir_6 db '/sys/lib/'
1184
lib_name_6 db 'libini.obj',0
2051 IgorA 1185
 
5930 IgorA 1186
if lang eq ru
1187
	head_f_i:
1188
	head_f_l db 'Системная ошибка',0
1189
	err_msg_found_lib_0 db 'Не найдена библиотека ',39,'proc_lib.obj',39,0
1190
	err_msg_import_0 db 'Ошибка при импорте библиотеки ',39,'proc_lib.obj',39,0
1191
	err_msg_found_lib_1 db 'Не найдена библиотека ',39,'libimg.obj',39,0
1192
	err_msg_import_1 db 'Ошибка при импорте библиотеки ',39,'libimg.obj',39,0
1193
	err_msg_found_lib_2 db 'Не найдена библиотека ',39,'box_lib.obj',39,0
1194
	err_msg_import_2 db 'Ошибка при импорте библиотеки ',39,'box_lib',39,0
1195
	err_msg_found_lib_3 db 'Не найдена библиотека ',39,'buf2d.obj',39,0
1196
	err_msg_import_3 db 'Ошибка при импорте библиотеки ',39,'buf2d',39,0
1197
	err_msg_found_lib_4 db 'Не найдена библиотека ',39,'kmenu.obj',39,0
1198
	err_msg_import_4 db 'Ошибка при импорте библиотеки ',39,'kmenu',39,0
1199
	err_msg_found_lib_5 db 'Не найдена библиотека ',39,'tinygl.obj',39,0
1200
	err_msg_import_5 db 'Ошибка при импорте библиотеки ',39,'tinygl',39,0
5938 IgorA 1201
	err_msg_found_lib_6 db 'Не найдена библиотека ',39,'libini.obj',39,0
1202
	err_msg_import_6 db 'Ошибка при импорте библиотеки ',39,'libini',39,0
5930 IgorA 1203
else
1204
	head_f_i:
1205
	head_f_l db 'System error',0
1206
	err_msg_found_lib_0 db 'Sorry I cannot found library ',39,'proc_lib.obj',39,0
1207
	err_msg_import_0 db 'Error on load import library ',39,'proc_lib.obj',39,0
1208
	err_msg_found_lib_1 db 'Sorry I cannot found library ',39,'libimg.obj',39,0
1209
	err_msg_import_1 db 'Error on load import library ',39,'libimg.obj',39,0
1210
	err_msg_found_lib_2 db 'Sorry I cannot found library ',39,'box_lib.obj',39,0
1211
	err_msg_import_2 db 'Error on load import library ',39,'box_lib.obj',39,0
1212
	err_msg_found_lib_3 db 'Sorry I cannot found library ',39,'buf2d.obj',39,0
1213
	err_msg_import_3 db 'Error on load import library ',39,'buf2d.obj',39,0
1214
	err_msg_found_lib_4 db 'Sorry I cannot found library ',39,'kmenu.obj',39,0
1215
	err_msg_import_4 db 'Error on load import library ',39,'kmenu.obj',39,0
1216
	err_msg_found_lib_5 db 'Sorry I cannot found library ',39,'tinygl.obj',39,0
1217
	err_msg_import_5 db 'Error on load import library ',39,'tinygl',39,0
5938 IgorA 1218
	err_msg_found_lib_6 db 'Sorry I cannot found library ',39,'libini.obj',39,0
1219
	err_msg_import_6 db 'Error on load import library ',39,'libini',39,0
5930 IgorA 1220
end if
1221
 
1222
align 4
2051 IgorA 1223
l_libs_start:
5881 IgorA 1224
	lib_0 l_libs lib_name_0, sys_path, file_name, system_dir_0,\
5930 IgorA 1225
		err_msg_found_lib_0, head_f_l, proclib_import,err_msg_import_0, head_f_i
5881 IgorA 1226
	lib_1 l_libs lib_name_1, sys_path, file_name, system_dir_1,\
5930 IgorA 1227
		err_msg_found_lib_1, head_f_l, import_libimg, err_msg_import_1, head_f_i
1228
	lib_2 l_libs lib_name_2, sys_path, library_path,  system_dir_2,\
1229
		err_msg_found_lib_2, head_f_l, import_box_lib,err_msg_import_2,head_f_i
1230
	lib_3 l_libs lib_name_3, sys_path, library_path,  system_dir_3,\
1231
		err_msg_found_lib_3, head_f_l, import_buf2d,  err_msg_import_3,head_f_i
1232
	lib_4 l_libs lib_name_4, sys_path, library_path,  system_dir_4,\
1233
		err_msg_found_lib_4, head_f_l, import_libkmenu,err_msg_import_4,head_f_i
1234
	lib_5 l_libs lib_name_5, sys_path, library_path,  system_dir_5,\
5938 IgorA 1235
		err_msg_found_lib_5, head_f_l, import_lib_tinygl,err_msg_import_5,head_f_i
1236
	lib_6 l_libs lib_name_6, sys_path, library_path,  system_dir_6,\
1237
		err_msg_found_lib_6, head_f_l, import_libini, err_msg_import_6,head_f_i
2051 IgorA 1238
l_libs_end:
1239
 
1240
align 4
1241
import_libimg:
1242
	dd alib_init1
1243
	img_is_img  dd aimg_is_img
1244
	img_info    dd aimg_info
1245
	img_from_file dd aimg_from_file
1246
	img_to_file dd aimg_to_file
1247
	img_from_rgb dd aimg_from_rgb
1248
	img_to_rgb  dd aimg_to_rgb
1249
	img_to_rgb2 dd aimg_to_rgb2
1250
	img_decode  dd aimg_decode
1251
	img_encode  dd aimg_encode
1252
	img_create  dd aimg_create
1253
	img_destroy dd aimg_destroy
1254
	img_destroy_layer dd aimg_destroy_layer
1255
	img_count   dd aimg_count
1256
	img_lock_bits dd aimg_lock_bits
1257
	img_unlock_bits dd aimg_unlock_bits
1258
	img_flip    dd aimg_flip
1259
	img_flip_layer dd aimg_flip_layer
1260
	img_rotate  dd aimg_rotate
1261
	img_rotate_layer dd aimg_rotate_layer
1262
	img_draw    dd aimg_draw
1263
 
1264
	dd 0,0
1265
	alib_init1   db 'lib_init',0
1266
	aimg_is_img  db 'img_is_img',0 ;определяет по данным, может ли библиотека сделать из них изображение
1267
	aimg_info    db 'img_info',0
1268
	aimg_from_file db 'img_from_file',0
1269
	aimg_to_file db 'img_to_file',0
1270
	aimg_from_rgb db 'img_from_rgb',0
1271
	aimg_to_rgb  db 'img_to_rgb',0 ;преобразование изображения в данные RGB
1272
	aimg_to_rgb2 db 'img_to_rgb2',0
1273
	aimg_decode  db 'img_decode',0 ;автоматически определяет формат графических данных
1274
	aimg_encode  db 'img_encode',0
1275
	aimg_create  db 'img_create',0
1276
	aimg_destroy db 'img_destroy',0
1277
	aimg_destroy_layer db 'img_destroy_layer',0
1278
	aimg_count   db 'img_count',0
1279
	aimg_lock_bits db 'img_lock_bits',0
1280
	aimg_unlock_bits db 'img_unlock_bits',0
1281
	aimg_flip    db 'img_flip',0
1282
	aimg_flip_layer db 'img_flip_layer',0
1283
	aimg_rotate  db 'img_rotate',0
1284
	aimg_rotate_layer db 'img_rotate_layer',0
1285
	aimg_draw    db 'img_draw',0
1286
 
1287
align 4
1288
proclib_import: ;описание экспортируемых функций
1289
	OpenDialog_Init dd aOpenDialog_Init
1290
	OpenDialog_Start dd aOpenDialog_Start
1291
dd 0,0
1292
	aOpenDialog_Init db 'OpenDialog_init',0
1293
	aOpenDialog_Start db 'OpenDialog_start',0
1294
 
1295
align 4
1296
import_buf2d:
1297
	dd sz_init0
1298
	buf2d_create dd sz_buf2d_create
1299
	buf2d_create_f_img dd sz_buf2d_create_f_img
1300
	buf2d_clear dd sz_buf2d_clear
1301
	buf2d_draw dd sz_buf2d_draw
1302
	buf2d_delete dd sz_buf2d_delete
2136 IgorA 1303
	buf2d_resize dd sz_buf2d_resize
2051 IgorA 1304
	buf2d_line dd sz_buf2d_line
1305
	buf2d_rect_by_size dd sz_buf2d_rect_by_size
1306
	buf2d_filled_rect_by_size dd sz_buf2d_filled_rect_by_size
1307
	buf2d_circle dd sz_buf2d_circle
1308
	buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2
1309
	buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2
1310
	buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8
1311
	buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32
1312
	buf2d_bit_blt dd sz_buf2d_bit_blt
1313
	buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp
1314
	buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha
1315
	buf2d_curve_bezier dd sz_buf2d_curve_bezier
1316
	buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix
1317
	buf2d_draw_text dd sz_buf2d_draw_text
1318
	buf2d_crop_color dd sz_buf2d_crop_color
1319
	buf2d_offset_h dd sz_buf2d_offset_h
1320
	buf2d_flood_fill dd sz_buf2d_flood_fill
1321
	buf2d_set_pixel dd sz_buf2d_set_pixel
1322
	dd 0,0
1323
	sz_init0 db 'lib_init',0
1324
	sz_buf2d_create db 'buf2d_create',0
1325
	sz_buf2d_create_f_img db 'buf2d_create_f_img',0
1326
	sz_buf2d_clear db 'buf2d_clear',0
1327
	sz_buf2d_draw db 'buf2d_draw',0
1328
	sz_buf2d_delete db 'buf2d_delete',0
2136 IgorA 1329
	sz_buf2d_resize db 'buf2d_resize',0
2051 IgorA 1330
	sz_buf2d_line db 'buf2d_line',0
1331
	sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0
1332
	sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0
1333
	sz_buf2d_circle db 'buf2d_circle',0
1334
	sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0
1335
	sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0
1336
	sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0
1337
	sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0
1338
	sz_buf2d_bit_blt db 'buf2d_bit_blt',0
1339
	sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0
1340
	sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0
1341
	sz_buf2d_curve_bezier db 'buf2d_curve_bezier',0
1342
	sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0
1343
	sz_buf2d_draw_text db 'buf2d_draw_text',0
1344
	sz_buf2d_crop_color db 'buf2d_crop_color',0
1345
	sz_buf2d_offset_h db 'buf2d_offset_h',0
1346
	sz_buf2d_flood_fill db 'buf2d_flood_fill',0
1347
	sz_buf2d_set_pixel db 'buf2d_set_pixel',0
1348
 
1349
align 4
1350
import_box_lib:
1351
	dd sz_init1
1352
	init_checkbox dd sz_init_checkbox
1353
	check_box_draw dd sz_check_box_draw
1354
	edit_box_draw dd sz_edit_box_draw
1355
	edit_box_key dd sz_edit_box_key
1356
	edit_box_mouse dd sz_edit_box_mouse
1357
	edit_box_set_text dd sz_edit_box_set_text
1358
	scrollbar_ver_draw dd sz_scrollbar_ver_draw
1359
	scrollbar_hor_draw dd sz_scrollbar_hor_draw
1360
 
1361
	tl_data_init dd sz_tl_data_init
1362
	tl_data_clear dd sz_tl_data_clear
1363
	tl_info_clear dd sz_tl_info_clear
1364
	tl_key dd sz_tl_key
1365
	tl_mouse dd sz_tl_mouse
1366
	tl_draw dd sz_tl_draw
1367
	tl_info_undo dd sz_tl_info_undo
1368
	tl_info_redo dd sz_tl_info_redo
1369
	tl_node_add dd sz_tl_node_add
1370
	tl_node_set_data dd sz_tl_node_set_data
1371
	tl_node_get_data dd sz_tl_node_get_data
1372
	tl_node_delete dd sz_tl_node_delete
1373
	tl_node_move_up dd sz_tl_node_move_up
1374
	tl_node_move_down dd sz_tl_node_move_down
1375
	tl_cur_beg dd sz_tl_cur_beg
1376
	tl_cur_next dd sz_tl_cur_next
1377
	tl_cur_perv dd sz_tl_cur_perv
1378
	tl_node_close_open dd sz_tl_node_close_open
1379
	tl_node_lev_inc dd sz_tl_node_lev_inc
1380
	tl_node_lev_dec dd sz_tl_node_lev_dec
1381
	tl_node_poi_get_info dd sz_tl_node_poi_get_info
1382
	tl_node_poi_get_next_info dd sz_tl_node_poi_get_next_info
1383
	tl_node_poi_get_data dd sz_tl_node_poi_get_data
1384
 
1385
	dd 0,0
1386
	sz_init1 db 'lib_init',0
1387
	sz_init_checkbox db 'init_checkbox2',0
1388
	sz_check_box_draw db 'check_box_draw2',0
1389
	sz_edit_box_draw db 'edit_box',0
1390
	sz_edit_box_key db 'edit_box_key',0
1391
	sz_edit_box_mouse db 'edit_box_mouse',0
1392
	sz_edit_box_set_text db 'edit_box_set_text',0
1393
	sz_scrollbar_ver_draw db 'scrollbar_v_draw',0
1394
	sz_scrollbar_hor_draw db 'scrollbar_h_draw',0
1395
 
1396
	sz_tl_data_init db 'tl_data_init',0
1397
	sz_tl_data_clear db 'tl_data_clear',0
1398
	sz_tl_info_clear db 'tl_info_clear',0
1399
	sz_tl_key db 'tl_key',0
1400
	sz_tl_mouse db 'tl_mouse',0
1401
	sz_tl_draw db 'tl_draw',0
1402
	sz_tl_info_undo db 'tl_info_undo',0
1403
	sz_tl_info_redo db 'tl_info_redo',0
1404
	sz_tl_node_add db 'tl_node_add',0
1405
	sz_tl_node_set_data db 'tl_node_set_data',0
1406
	sz_tl_node_get_data db 'tl_node_get_data',0
1407
	sz_tl_node_delete db 'tl_node_delete',0
1408
	sz_tl_node_move_up db 'tl_node_move_up',0
1409
	sz_tl_node_move_down db 'tl_node_move_down',0
1410
	sz_tl_cur_beg db 'tl_cur_beg',0
1411
	sz_tl_cur_next db 'tl_cur_next',0
1412
	sz_tl_cur_perv db 'tl_cur_perv',0
1413
	sz_tl_node_close_open db 'tl_node_close_open',0
1414
	sz_tl_node_lev_inc db 'tl_node_lev_inc',0
1415
	sz_tl_node_lev_dec db 'tl_node_lev_dec',0
1416
	sz_tl_node_poi_get_info db 'tl_node_poi_get_info',0
1417
	sz_tl_node_poi_get_next_info db 'tl_node_poi_get_next_info',0
1418
	sz_tl_node_poi_get_data db 'tl_node_poi_get_data',0
1419
 
5930 IgorA 1420
align 4
1421
import_libkmenu:
1422
	kmenu_init		       dd akmenu_init
1423
	kmainmenu_draw		       dd akmainmenu_draw
1424
	kmainmenu_dispatch_cursorevent dd akmainmenu_dispatch_cursorevent
1425
	ksubmenu_new		       dd aksubmenu_new
1426
	ksubmenu_delete 	       dd aksubmenu_delete
1427
	ksubmenu_draw		       dd aksubmenu_draw
1428
	ksubmenu_add		       dd aksubmenu_add
1429
	kmenuitem_new		       dd akmenuitem_new
1430
	kmenuitem_delete	       dd akmenuitem_delete
1431
	kmenuitem_draw		       dd akmenuitem_draw
1432
dd 0,0
1433
	akmenu_init			db 'kmenu_init',0
1434
	akmainmenu_draw 		db 'kmainmenu_draw',0
1435
	akmainmenu_dispatch_cursorevent db 'kmainmenu_dispatch_cursorevent',0
1436
	aksubmenu_new			db 'ksubmenu_new',0
1437
	aksubmenu_delete		db 'ksubmenu_delete',0
1438
	aksubmenu_draw			db 'ksubmenu_draw',0
1439
	aksubmenu_add			db 'ksubmenu_add',0
1440
	akmenuitem_new			db 'kmenuitem_new',0
1441
	akmenuitem_delete		db 'kmenuitem_delete',0
1442
	akmenuitem_draw 		db 'kmenuitem_draw',0
2051 IgorA 1443
 
5911 IgorA 1444
align 4
5930 IgorA 1445
import_lib_tinygl:
1446
macro E_LIB n
1447
{
1448
	n dd sz_#n
1449
}
1450
include '../../develop/libraries/TinyGL/asm_fork/export.inc'
1451
	dd 0,0
1452
macro E_LIB n
1453
{
1454
	sz_#n db `n,0
1455
}
1456
include '../../develop/libraries/TinyGL/asm_fork/export.inc'
1457
 
1458
align 4
5938 IgorA 1459
import_libini:
1460
	dd alib_init0
1461
	ini_get_str   dd aini_get_str
1462
	ini_get_int   dd aini_get_int
1463
	ini_get_color dd aini_get_color
1464
dd 0,0
1465
	alib_init0     db 'lib_init',0
1466
	aini_get_str   db 'ini_get_str',0
1467
	aini_get_int   db 'ini_get_int',0
1468
	aini_get_color db 'ini_get_color',0
1469
 
1470
align 4
2051 IgorA 1471
mouse_dd dd 0x0
1472
last_time dd 0
1473
 
1474
align 4
1475
buf_0: dd 0 ;указатель на буфер изображения
2136 IgorA 1476
.l: dw 205 ;+4 left
2173 IgorA 1477
.t: dw 35 ;+6 top
2051 IgorA 1478
.w: dd 340 ;+8 w
5930 IgorA 1479
.h: dd main_wnd_height-65 ;+12 h
2051 IgorA 1480
.color: dd 0xffffd0 ;+16 color
1481
	db 24 ;+20 bit in pixel
1482
 
1483
align 4
1484
buf_1:
1485
	dd 0 ;указатель на буфер изображения
5930 IgorA 1486
	dw 25,25 ;+4 left,top
1487
	dd 128,144 ;+8 w,h
1488
	dd 0,24 ;+16 color,bit in pixel
2051 IgorA 1489
 
5911 IgorA 1490
align 4
2051 IgorA 1491
el_focus dd tree1
4332 IgorA 1492
tree1 tree_list size_one_list,300+2, tl_key_no_edit+tl_draw_par_line,\
5930 IgorA 1493
	16,16, 0xffffff,0xb0d0ff,0x400040, 5,35,195-16,250, 16,list_offs_text,0, el_focus,\
2051 IgorA 1494
	w_scr_t1,0
1495
 
1496
align 4
5930 IgorA 1497
w_scr_t1 scrollbar 16,0, 3,0, 15, 100, 0,0, 0,0,0, 1
2051 IgorA 1498
 
5930 IgorA 1499
align 4
1500
ctx1 db 28 dup (0) ;TinyGLContext or KOSGLContext
1501
;sizeof.TinyGLContext = 28
1502
 
1503
qObj dd 0
1504
 
5935 IgorA 1505
light_position dd 0.0, 0.0, -2.0, 1.0 ; Расположение источника [0][1][2]
5930 IgorA 1506
	;[3] = (0.0 - бесконечно удаленный источник, 1.0 - источник света на определенном расстоянии)
1507
light_dir dd 0.0,0.0,0.0 ;направление лампы
1508
 
1509
mat_specular dd 0.3, 0.3, 0.3, 1.0 ; Цвет блика
1510
mat_shininess dd 3.0 ; Размер блика (обратная пропорция)
1511
white_light dd 0.8, 0.8, 0.8, 1.0 ; Цвет и интенсивность освещения, генерируемого источником
1512
lmodel_ambient dd 0.3, 0.3, 0.3, 1.0 ; Параметры фонового освещения
1513
 
5938 IgorA 1514
if lang eq ru
1515
capt db 'info 3ds версия 29.11.15',0 ;подпись окна
1516
else
1517
capt db 'info 3ds version 29.11.15',0 ;window caption
1518
end if
1519
 
5911 IgorA 1520
align 16
2051 IgorA 1521
i_end:
5911 IgorA 1522
	procinfo process_information
5938 IgorA 1523
	run_file_70 FileInfoBlock
5935 IgorA 1524
	sc system_colors
5938 IgorA 1525
		rb sizeof.sys_colors_new-sizeof.system_colors
1526
	angle_x rd 1 ;углы поворота сцены
1527
	angle_y rd 1
1528
	angle_z rd 1
1529
	color_ox rd 1
1530
	color_oy rd 1
1531
	color_oz rd 1
1532
	color_bk rd 3
1533
	color_vert rd 1
1534
	color_face rd 1
5930 IgorA 1535
	rb 2048
1536
align 16
2165 IgorA 1537
thread_coords:
5930 IgorA 1538
	rb 2048
2051 IgorA 1539
stacktop:
5930 IgorA 1540
	sys_path rb 2048
1541
	file_name rb 4096
1542
	library_path rb 2048
2051 IgorA 1543
	plugin_path rb 4096
1544
	openfile_path rb 4096
1545
	filename_area rb 256
1546
mem: