use32
	org 0x0
	db 'MENUET01' ;¨¤¥­â¨ä. ¨á¯®«­ï¥¬®£® ä ©«  ¢á¥£¤  8 ¡ ©â
	dd 1, start, i_end, mem, stacktop, file_name, sys_path

version_edit equ 1

include '../../macros.inc'
include '../../proc32.inc'
include '../../KOSfuncs.inc'
include '../../load_img.inc'
include '../../develop/libraries/box_lib/trunk/box_lib.mac'
include '../../develop/libraries/TinyGL/asm_fork/opengl_const.inc'
include 'lang.inc'
include 'info_fun_float.inc'
include 'info_menu.inc'
include 'data.inc'

@use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load

ID_ICON_CHUNK_MAIN equ 0 ;¨ª®­ª  £« ¢­®£® ¡«®ª 
ID_ICON_CHUNK_NOT_FOUND equ 1 ;¨ª®­ª  ­¥ ¨§¢¥áâ­®£® ¡«®ª 
ID_ICON_DATA equ 2 ;¨ª®­ª  ¤«ï ¤ ­­ëå ¡«®ª , ­¥ ®¯à¥¤¥«¥­­®© áâàãªâãàë
ID_ICON_POINT equ 8
ID_ICON_POINT_SEL equ 9

FILE_ERROR_CHUNK_SIZE equ -3 ;®è¨¡ª  ¢ à §¬¥à¥ ¡«®ª 

include 'info_o3d.inc'

main_wnd_height equ 460 ;¢ëá®â  £« ¢­®£® ®ª­  ¯à®£à ¬¬ë
IMAGE_TOOLBAR_ICON_SIZE equ 21*21*3

align 4
fl255 dd 255.0
open_file_data dd 0 ;㪠§ â¥«ì ­  ¯ ¬ïâì ¤«ï ®âªàëâ¨ï ä ©«®¢ 3ds
open_file_size dd 0 ;à §¬¥à ®âªàë⮣® ä ©« 
image_data_toolbar dd 0
icon_tl_sys dd 0 ;㪠§ â¥¥«ì ­  ¯ ¬ïâì ¤«ï åà ­¥­¨ï á¨á⥬­ëå ¨ª®­®ª
icon_toolbar dd 0 ;㪠§ â¥¥«ì ­  ¯ ¬ïâì ¤«ï åà ­¥­¨ï ¨ª®­®ª ®¡ê¥ªâ®¢
fn_toolbar db 'toolbar.png',0

align 4
level_stack dd 0
offs_last_timer dd 0 ;¯®á«¥¤­¨© ᤢ¨£ ¯®ª § ­ë© ¢ ä㭪樨 â ©¬¥à 

align 4
file_3ds: ;¯¥à¥¬¥­­ë¥ ¨á¯®«ì§ã¥¬ë¥ ¯à¨ ®âªàë⨨ ä ©« 
.offs: dd 0 ;+0 㪠§ â¥«ì ­  ­ ç «® ¡«®ª 
.size: dd 0 ;+4 à §¬¥à ¡«®ª  (¤«ï 1-£® ¯ à ¬¥âà  = à §¬¥à ä ©«  3ds)
rb 8*MAX_FILE_LEVEL

size_one_list equ 42
list_offs_chunk_del equ 8 ;¬®¦¥â «¨ ¡«®ª 㤠«ïâáï
list_offs_chunk_lev equ 9 ;ã஢¥­ì ¡«®ª  (¯à®¯¨á ­ ¢ ¤ ­­ë¥ 㧫 )
list_offs_p_data equ 10 ;㪠§ â¥«ì ­  ¯®¤¯¨áì ¡«®ª 
list_offs_text equ 14 ;ᤢ¨£ ­ ç «  ⥪áâ  ¢ «¨áâ¥
buffer rb size_one_list ;¡ãä¥à ¤«ï ¤®¡ ¢«¥­¨ï áâàãªâãà ¢ ᯨ᮪ tree1

txt_3ds_symb db 0,0
;--------------------------------------

include 'info_wnd_coords.inc'

align 4
start:
	;--- copy cmd line ---
	mov esi,file_name
	mov edi,openfile_path
@@:
	lodsd
	cmp eax,0
	je @f ;¢ë室, ¥á«¨ 0
	stosd
	jmp @b
@@:
	stosd

	load_libraries l_libs_start,l_libs_end
	;¯à®¢¥àª  ­  ᪮«ìª® 㤠筮 § £ã§¨«¨áì ¡¨¡«¨®â¥ª¨
	mov	ebp,lib_0
	.test_lib_open:
	cmp	dword [ebp+ll_struc_size-4],0
	jz	@f
		mcall SF_TERMINATE_PROCESS ;exit not correct
	@@:
	add ebp,ll_struc_size
	cmp ebp,l_libs_end
	jl .test_lib_open
	mcall SF_STYLE_SETTINGS,SSF_GET_COLORS,sc,sizeof.system_colors
	mcall SF_SET_EVENTS_MASK,0xC0000027

	stdcall [OpenDialog_Init],OpenDialog_data ;¯®¤£®â®¢ª  ¤¨ «®£ 

	;kmenu initialisation
	stdcall [kmenu_init],sc
	stdcall [ksubmenu_new]
	mov [main_menu], eax

	stdcall [ksubmenu_new]
	mov [main_menu_view], eax
	stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Veiw_Vertexes, 5
	stdcall [ksubmenu_add], [main_menu_view], eax
	stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Veiw_Faces, 6
	stdcall [ksubmenu_add], [main_menu_view], eax
	stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Veiw_Faces_Fill, 7
	stdcall [ksubmenu_add], [main_menu_view], eax
	stdcall [kmenuitem_new], KMENUITEM_SEPARATOR, 0, 0
	stdcall [ksubmenu_add], [main_menu_view], eax
	stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Veiw_Light, 8
	stdcall [ksubmenu_add], [main_menu_view], eax
	stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Veiw_Smooth, 9
	stdcall [ksubmenu_add], [main_menu_view], eax
	stdcall [kmenuitem_new], KMENUITEM_SEPARATOR, 0, 0
	stdcall [ksubmenu_add], [main_menu_view], eax
	stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Veiw_Reset, 10
	stdcall [ksubmenu_add], [main_menu_view], eax
	stdcall [kmenuitem_new], KMENUITEM_SUBMENU, sz_main_menu_View, [main_menu_view]
	stdcall [ksubmenu_add], [main_menu], eax

	stdcall [ksubmenu_new]
	mov [main_menu_vertexes], eax
	stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Vertexes_Select, 11
	stdcall [ksubmenu_add], [main_menu_vertexes], eax
	stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Vertexes_Deselect, 12
	stdcall [ksubmenu_add], [main_menu_vertexes], eax
	stdcall [kmenuitem_new], KMENUITEM_SEPARATOR, 0, 0
	stdcall [ksubmenu_add], [main_menu_vertexes], eax
	stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Average_x, 13
	stdcall [ksubmenu_add], [main_menu_vertexes], eax
	stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Average_y, 14
	stdcall [ksubmenu_add], [main_menu_vertexes], eax
	stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Average_z, 15
	stdcall [ksubmenu_add], [main_menu_vertexes], eax
	stdcall [kmenuitem_new], KMENUITEM_SUBMENU, sz_main_menu_Vertexes, [main_menu_vertexes]
	stdcall [ksubmenu_add], [main_menu], eax

	mov dword[w_scr_t1.type],1
	stdcall dword[tl_data_init], tree1
	;á¨á⥬­ë¥ ¨ª®­ª¨ 16*16 ¤«ï tree_list
	load_image_file 'tl_sys_16.png', icon_tl_sys
	;¥á«¨ ¨§®¡à ¦¥­¨¥ ­¥ ®âªàë«®áì, â® ¢ icon_tl_sys ¡ã¤ãâ
	;­¥ ¨­¨æ¨ «¨§¨à®¢ ­­ë¥ ¤ ­­ë¥, ­® ®è¨¡ª¨ ­¥ ¡ã¤¥â, â. ª. ¡ãä¥à ­ã¦­®£® à §¬¥à 
	mov eax,dword[icon_tl_sys]
	mov dword[tree1.data_img_sys],eax

	load_image_file 'objects.png', icon_toolbar
	mov eax,dword[icon_toolbar]
	mov dword[tree1.data_img],eax

	stdcall [buf2d_create], buf_0 ;ᮧ¤ ­¨¥ ¡ãä¥à 

	load_image_file 'font8x9.bmp', image_data_toolbar
	stdcall [buf2d_create_f_img], buf_1,[image_data_toolbar] ;ᮧ¤ ¥¬ ¡ãä¥à
	stdcall mem.Free,[image_data_toolbar] ;®á¢®¡®¦¤ ¥¬ ¯ ¬ïâì
	stdcall [buf2d_conv_24_to_8], buf_1,1 ;¤¥« ¥¬ ¡ãä¥à ¯à®§à ç­®á⨠8 ¡¨â
	stdcall [buf2d_convert_text_matrix], buf_1

	load_image_file fn_toolbar, image_data_toolbar

	;à ¡®â  á ä ©«®¬ ­ áâ஥ª
	copy_path ini_name,sys_path,file_name,0
	mov dword[def_dr_mode],0
	stdcall dword[ini_get_int],file_name,ini_sec_w3d,key_dv,1
	or eax,eax
	jz @f
		or dword[def_dr_mode], 1 shl bit_vertexes
	@@:
	stdcall dword[ini_get_int],file_name,ini_sec_w3d,key_df,1
	or eax,eax
	jz @f
		or dword[def_dr_mode], 1 shl bit_faces
	@@:
	stdcall dword[ini_get_int],file_name,ini_sec_w3d,key_dff,1
	or eax,eax
	jz @f
		or dword[def_dr_mode], 1 shl bit_faces_fill
	@@:
	stdcall dword[ini_get_int],file_name,ini_sec_w3d,key_dl,1
	or eax,eax
	jz @f
		or dword[def_dr_mode], 1 shl bit_light
	@@:
	stdcall dword[ini_get_int],file_name,ini_sec_w3d,key_ds,1
	or eax,eax
	jz @f
		or dword[def_dr_mode], 1 shl bit_smooth
	@@:
	stdcall dword[ini_get_color],file_name,ini_sec_w3d,key_ox,0x0000ff
	mov [color_ox],eax
	stdcall dword[ini_get_color],file_name,ini_sec_w3d,key_oy,0xff0000
	mov [color_oy],eax
	stdcall dword[ini_get_color],file_name,ini_sec_w3d,key_oz,0x00ff00
	mov [color_oz],eax
	stdcall dword[ini_get_color],file_name,ini_sec_w3d,key_bk,0x000000
	mov [color_bk],eax
	shr eax,8
	mov [color_bk+4],eax
	shr eax,8
	mov [color_bk+8],eax
	stdcall dword[ini_get_color],file_name,ini_sec_w3d,key_vert,0xffffff
	mov [color_vert],eax
	stdcall dword[ini_get_color],file_name,ini_sec_w3d,key_face,0x808080
	mov [color_face],eax
	stdcall dword[ini_get_color],file_name,ini_sec_w3d,key_select,0xffff00
	mov [color_select],eax
	finit
	fild dword[color_bk+8]
	fdiv dword[fl255]
	fstp dword[color_bk+8]
	mov eax,[color_bk+4]
	and eax,0xff
	mov [color_bk+4],eax
	fild dword[color_bk+4]
	fdiv dword[fl255]
	fstp dword[color_bk+4]
	mov eax,[color_bk]
	and eax,0xff
	mov [color_bk],eax
	fild dword[color_bk]
	fdiv dword[fl255]
	fstp dword[color_bk]

	mcall SF_SYSTEM_GET,SSF_TIME_COUNT
	mov [last_time],eax

	stdcall [kosglMakeCurrent], 3d_wnd_l,3d_wnd_t,3d_wnd_w,3d_wnd_h,ctx1
	stdcall [glEnable], GL_DEPTH_TEST
	stdcall [glEnable], GL_NORMALIZE ;¤¥« ¬ ­®à¬ «¨ ®¤¨­ ª®¢®© ¢¥«¨ç¨­ë ¢® ¨§¡¥¦ ­¨¥  àâ¥ä ªâ®¢
	stdcall [glClearColor], [color_bk+8],[color_bk+4],[color_bk],0.0
	stdcall [glShadeModel], GL_SMOOTH
	stdcall [gluNewQuadric]
	mov [qObj],eax

	mov eax,dword[ctx1] ;eax -> TinyGLContext.GLContext
	mov eax,[eax] ;eax -> ZBuffer
	mov eax,[eax+offs_zbuf_pbuf] ;eax -> ZBuffer.pbuf
	mov dword[buf_ogl],eax

	;open file from cmd line
	cmp dword[openfile_path],0
	je @f
		call but_open_file.no_dlg
	@@:
	call draw_window

align 4
still:
	mcall SF_SYSTEM_GET,SSF_TIME_COUNT
	mov ebx,[last_time]
	add ebx,10 ;§ ¤¥à¦ª 
	cmp ebx,eax
	jge @f
		mov ebx,eax
	@@:
	sub ebx,eax
	mcall SF_WAIT_EVENT_TIMEOUT
	cmp eax,0
	je timer_funct

	cmp al,1
	jne @f
		call draw_window
		jmp still
	@@:
	cmp al,2
	jz key
	cmp al,3
	jz button
	cmp al,6
	jne @f
		mcall SF_THREAD_INFO,procinfo,-1
		cmp ax,word[procinfo+4]
		jne @f ;®ª­® ­¥  ªâ¨¢­®
		call mouse
	@@:
	jmp still

align 4
mouse:
	stdcall [tl_mouse], dword tree1
	ret

align 4
timer_funct:
	pushad
	mcall SF_SYSTEM_GET,SSF_TIME_COUNT
	mov [last_time],eax

	;¯à®á¬ âਢ ¥¬ ¢ë¤¥«¥­­ë© ¡«®ª ¤ ­­ëå
	stdcall [tl_node_get_data],tree1
	cmp eax,0
	je @f
		mov ebx,eax
		mov eax,dword[ebx]
		mov ecx,dword[ebx+4] ;à §¬¥à ¡«®ª 
		stdcall hex_in_str, txt_3ds_offs.dig, eax,8
		stdcall hex_in_str, txt_3ds_offs.siz, ecx,8

		add eax,dword[open_file_data] ;¯®«ãç ¥¬ §­ ç¥­¨¥ ᤢ¨£  ¢ ¯ ¬ïâ¨
		cmp dword[offs_last_timer],eax
		je @f
			;¥á«¨ ¢ë¤¥«¥­­ë© ¡«®ª ¤ ­­ëå ­¥ ᮢ¯ ¤ ¥â á ¯®á«¥¤­¨¬ § ¯®¬­¥­­ë¬
			mov dword[offs_last_timer],eax
			stdcall buf_draw_beg, buf_0
			stdcall [buf2d_draw_text], buf_0, buf_1,txt_3ds_offs,5,35,0xb000
			mov edx,dword[ebx+list_offs_p_data]
			cmp edx,0 ;ᬮâਬ ¥áâì «¨ ®¯¨á ­¨¥ ¡«®ª 
			je .no_info
				stdcall [buf2d_draw_text], buf_0, buf_1,edx,5,45,0xb000
			.no_info:
			add ecx,eax ;¯®«ãç ¥¬ à §¬¥à ¡«®ª 
			stdcall buf_draw_hex_table,eax,ecx ;¤®¡ ¢«¥­¨¥ 16-à¨ç­ëå ¤ ­­ëå
			stdcall [buf2d_draw], buf_0 ;®¡­®¢«ï¥¬ ¡ãä¥à ­  íªà ­¥
	@@:
	popad
	jmp still

align 4
proc buf_draw_hex_table, offs:dword, size_line:dword
	pushad
	locals
		coord_y dd 55 ;ª®®à¤¨­ â  y ¤«ï ­ ç «  ¢ë¢®¤  â ¡«¨æë
	endl
		mov esi,dword[offs]
		mov edi,dword[open_file_data]
		add edi,dword[file_3ds.size] ;edi - 㪠§ â¥«ì ­  ª®­¥æ ä ©«  ¢ ¯ ¬ïâ¨
		mov dword[txt_3ds_offs.dig],0
		cld
		.cycle_rows:
			mov ebx,5 ;®âáâ㯠᫥¢  ¤«ï æ¨äà
			mov edx,5+10*24 ;®âáâ㯠᫥¢  ¤«ï ⥪áâ 
			mov ecx,10
			@@:
				stdcall hex_in_str, txt_3ds_offs.dig, dword[esi],2
				stdcall [buf2d_draw_text], buf_0, buf_1,txt_3ds_offs.dig,ebx,[coord_y],0

				mov al,byte[esi]
				mov byte[txt_3ds_symb],al
				stdcall [buf2d_draw_text], buf_0, buf_1,txt_3ds_symb,edx,[coord_y],0x808080
				inc esi
				cmp esi,dword[size_line]
				jne .end_block
					stdcall draw_block_end_line, dword[coord_y]
				.end_block:
				cmp esi,edi
				jge @f ;jg ???
				add ebx,24
				add edx,9 ;è¨à¨­  1-£® ᨬ¢®«  +1pix
				loop @b
			add dword[coord_y],10 ;¢ëá®â  1-£® ᨬ¢®«  (¨«¨ ¨­â¥à¢ « ¬¥¦¤ã áâப ¬¨)
			mov ebx,dword[buf_0.h]
			cmp dword[coord_y],ebx
			jl .cycle_rows
		@@:
	popad
	ret
endp

align 4
proc draw_block_end_line uses eax ebx ecx, coord_y:dword
	add ebx,20 ;20 = width 2.5 symbols
	mov eax,[coord_y]
	sub eax,2
	mov ecx,eax
	add ecx,10
	stdcall [buf2d_line], buf_0, 0,ecx,ebx,ecx ,0xff
	stdcall [buf2d_line], buf_0, ebx,ecx,ebx,eax ,0xff
	stdcall [buf2d_line], buf_0, ebx,eax,5+10*24-4,eax ,0xff
	ret
endp

align 4
draw_window:
pushad
	mcall SF_REDRAW,SSF_BEGIN_DRAW
	xor eax,eax
	mov edx,[sc.work]
	or  edx,0x33000000
	mov edi,capt
	mcall , (20 shl 16)+560, (20 shl 16)+main_wnd_height

	mcall SF_THREAD_INFO,procinfo,-1
	mov eax,dword[procinfo.box.height]
	cmp eax,250
	jge @f
		mov eax,250
	@@:
	sub eax,65
	mov dword[tree1.box_height],eax
	mov word[w_scr_t1.y_size],ax ;­®¢ë¥ à §¬¥àë áªà®««¨­£ 
	cmp eax,dword[buf_0.h] ;㢥«¨ç¨¢ ¥¬ ¢ëá®âã ¡ãä¥à 
	jle @f
		stdcall [buf2d_resize],buf_0,0,eax,1
		mov dword[offs_last_timer],0 ;¤«ï ®¡­®¢«¥­¨ï ¡ãä¥à  ¢ â ©¬¥à¥
	@@:

	mov eax,dword[procinfo.box.width]
	cmp eax,400
	jge @f
		mov eax,400
	@@:
	sub eax,[buf_0.w]
	sub eax,41
	mov dword[tree1.box_width],eax
	add ax,word[tree1.box_left]
	mov word[w_scr_t1.x_pos],ax
	add ax,16+5
	mov word[buf_0.l],ax

	mov esi,[sc.work_button]
	mcall SF_DEFINE_BUTTON,(5 shl 16)+20,(5 shl 16)+20,0x40000003
	mcall ,(30 shl 16)+20,,0x40000004

	cmp byte[can_save],0
	je @f
		mcall ,(55 shl 16)+20,,0x40000005
	@@:
	mcall ,(85 shl 16)+20,,0x40000006 ;®ª­® á ª®®à¤¨­ â ¬¨
	mcall ,(110 shl 16)+20,,0x40000007 ;㤠«¥­¨¥ ¡«®ª 

	mcall SF_PUT_IMAGE,[image_data_toolbar],(21 shl 16)+21,(5 shl 16)+5 ;new

	add ebx,IMAGE_TOOLBAR_ICON_SIZE
	mov edx,(30 shl 16)+5 ;open
	int 0x40

	cmp byte[can_save],0
	je @f
		add ebx,IMAGE_TOOLBAR_ICON_SIZE
		mov edx,(55 shl 16)+5 ;save
		int 0x40
		sub ebx,IMAGE_TOOLBAR_ICON_SIZE
	@@:

	add ebx,4*IMAGE_TOOLBAR_ICON_SIZE
	mov edx,(85 shl 16)+5
	int 0x40

	add ebx,IMAGE_TOOLBAR_ICON_SIZE
	mov edx,(110 shl 16)+5
	int 0x40

	mov dword[w_scr_t1.all_redraw],1
	stdcall [tl_draw],dword tree1

	stdcall [buf2d_draw], buf_0

	mcall SF_REDRAW,SSF_END_DRAW
popad
	ret

align 4
key:
	mcall SF_GET_KEY
	stdcall [tl_key], dword tree1
	jmp still


align 4
button:
	mcall SF_GET_BUTTON
	cmp ah,3
	jne @f
		call but_new_file
		jmp still
	@@:
	cmp ah,4
	jne @f
		call but_open_file
		jmp still
	@@:
	cmp ah,5
	jne @f
		call but_save_file
		jmp still
	@@:
	cmp ah,6
	jne @f
		call but_wnd_coords
		jmp still
	@@:
	cmp ah,7
	jne @f
		call but_delete_chunk
		jmp still
	@@:

	cmp ah,1
	jne still
.exit:
	mov dword[tree1.data_img],0
	mov dword[tree1.data_img_sys],0
	stdcall [tl_data_clear], tree1
	stdcall [buf2d_delete],buf_0
	stdcall [buf2d_delete],buf_1 ;㤠«ï¥¬ ¡ãä¥à
	stdcall mem.Free,[image_data_toolbar]
	stdcall mem.Free,[open_file_data]
	stdcall [gluDeleteQuadric], [qObj]
	mcall SF_TERMINATE_PROCESS


align 4
but_new_file:
	mov byte[can_save],0
	stdcall [tl_info_clear], tree1 ;®ç¨á⪠ ᯨ᪠ ®¡ê¥ªâ®¢
	stdcall [buf2d_clear], buf_0, [buf_0.color] ;ç¨á⨬ ¡ãä¥à
	stdcall [tl_draw], tree1
	stdcall [buf2d_draw], buf_0 ;®¡­®¢«ï¥¬ ¡ãä¥à ­  íªà ­¥
	ret

align 4
but_open_file:
	copy_path open_dialog_name,communication_area_default_path,file_name,0
	pushad
	mov [OpenDialog_data.type],0
	stdcall [OpenDialog_Start],OpenDialog_data
	cmp [OpenDialog_data.status],2
	je .end_open_file
	;ª®¤ ¯à¨ 㤠筮¬ ®âªàë⨨ ¤¨ «®£ 
	jmp @f
.no_dlg: ;¥á«¨ ¬¨­ã¥¬ ¤¨ «®£ ®âªàëâ¨ï ä ©« 
		pushad
	@@:
    mov [run_file_70.Function], SSF_GET_INFO
    mov [run_file_70.Position], 0
    mov [run_file_70.Flags], 0
    mov dword[run_file_70.Count], 0
    mov dword[run_file_70.Buffer], open_b
    mov byte[run_file_70+20], 0
    mov dword[run_file_70.FileName], openfile_path
    mcall SF_FILE,run_file_70

    mov ecx,dword[open_b+32] ;+32 qword: à §¬¥à ä ©«  ¢ ¡ ©â å
    stdcall mem.ReAlloc,[open_file_data],ecx
    mov [open_file_data],eax
    
    mov [run_file_70.Function], SSF_READ_FILE
    mov [run_file_70.Position], 0
    mov [run_file_70.Flags], 0
    mov dword[run_file_70.Count], ecx
    m2m dword[run_file_70.Buffer], dword[open_file_data]
    mov byte[run_file_70+20], 0
    mov dword[run_file_70.FileName], openfile_path
    mcall SF_FILE,run_file_70 ;§ £à㦠¥¬ ä ©« 3ds
    cmp ebx,0xffffffff
    je .end_open_file

	mov [open_file_size],ebx
		;mcall SF_SET_CAPTION,1,openfile_path

	mov byte[can_save],0
	call init_tree
	stdcall [buf2d_draw], buf_0 ;®¡­®¢«ï¥¬ ¡ãä¥à ­  íªà ­¥
	stdcall obj_clear_param, o3d ;ç¨á⨬ ¯ à ¬¥âàë ®ª­  á ª®®à¤¨­ â ¬¨
	cmp byte[prop_wnd_run],0
	je @f
		;ç¨á⨬ ®ª­® á ª®®à¤¨­ â ¬¨
		stdcall [tl_info_clear], tree3
	@@:

	.end_open_file:
	popad
	ret

align 4
init_tree:
	stdcall [tl_info_clear], tree1 ;®ç¨á⪠ ᯨ᪠ ®¡ê¥ªâ®¢

	mov esi,dword[open_file_data]
	cmp word[esi],CHUNK_MAIN
	je @f
		stdcall buf_draw_beg, buf_0
		stdcall [buf2d_draw_text], buf_0, buf_1,txt_no_3ds,5,25,0xff0000 ;à¨á㥬 áâபã á ⥪á⮬
		jmp .end_open
	@@:
	;--- ®¡à ¡®âª  ®âªàë⮣® *.3ds ä ©« 
	mov eax,file_3ds
	mov dword[level_stack],0 ;®¡­ã«ï¥¬ ã஢¥­ì á⥪ 
	mov dword[offs_last_timer],0
	;--- ¤®¡ ¢«¥­¨¥ £« ¢­®£® ¡«®ª  ¢ ᯨ᮪
	stdcall add_3ds_object, ID_ICON_CHUNK_MAIN,0,dword[esi+2],0
	call block_children ;¢å®¤ ¢ ¤®ç¥à­¨© ¡«®ª

	mov edi,dword[file_3ds.offs]
	add edi,dword[file_3ds.size]
	.cycle_main:
		cmp dword[level_stack],0
		jle .end_cycle
		
		cmp esi,edi ;¥á«¨ ª®­¥æ ä ©« 
		jge .end_cycle

		mov edx,dword[esi+2] ;à §¬¥à ¡«®ª 
		call block_analiz
		cmp dword[bl_found],0
		jne @f
			;®¡ê¥ªâ ­¥ ¨§¢¥áâ­®£® ¢¨¤ 
			stdcall add_3ds_object, ID_ICON_CHUNK_NOT_FOUND,dword[level_stack],edx,0
			call block_next
			jmp .cycle_main
		@@:
			;®¡ê¥ªâ ¨§¢¥áâ­®£® ¢¨¤ 
			mov ecx,dword[bl_found]
			mov bx,word[ecx+2] ;­®¬¥à ¨ª®­ª¨ ¤«ï ®¡ê¥ªâ 
			stdcall add_3ds_object, ebx,dword[level_stack],edx,dword[ecx+5]
			cmp byte[ecx+4],1
			je .bl_data
				;¡«®ª ᮤ¥à¦¨â ¤®ç¥à­¨¥ ¡«®ª¨
				call block_children ;¢å®¤ ¢ ¤®ç¥à­¨© ¡«®ª
				jmp .cycle_main
			.bl_data:
				;¡«®ª ᮤ¥à¦¨â ¤ ­­ë¥
				call block_analiz_data
				jmp .cycle_main
	.end_cycle:
		stdcall [tl_cur_beg], tree1
		stdcall [tl_draw], tree1
	.end_open:
	ret

; ­ «¨§ ¤ ­­ëå ¡«®ª 
;input:
; eax - stack pointer
; esi - memory pointer
;output:
; eax - new stack pointer
; esi - new memory pointer
align 4
block_analiz_data:
	push ebx ecx edx edi
		mov dx,word[esi]
		mov ecx,dword[esi+2]
		sub ecx,6 ;à §¬¥à ¤ ­­ëå ¢ ¡«®ª¥
		add esi,6
		mov ebx,dword[level_stack]
		inc ebx
		; ***  ­ «¨§ ¡«®ª®¢ á à §­ë¬¨ ¤ ­­ë¬¨ ¨ ¢ë¤¥«¥­¨¥¬ ¯®¤¡«®ª®¢
		cmp dx,CHUNK_OBJBLOCK ;®¡ê¥ªâ
		jne @f
			push ax
				cld
				xor al,al
				mov edi,esi
				repne scasb
			pop ax
			sub edi,esi ;edi - strlen
			stdcall add_3ds_object, ID_ICON_DATA,ebx,edi,0 ;­ §¢ ­¨¥ ®¡ê¥ªâ 
			add esi,edi
			;sub ecx,edi ;㦥 ᤥ« ­® ¢ repne
			jmp .next_bl
		@@:
		cmp dx,CHUNK_VERTLIST ;ᯨ᮪ ¢¥à設
		je .vertexes
		cmp dx,0x4111 ;ä« £¨ ¢¥à設
		je .vertexes
		cmp dx,CHUNK_MAPLIST ;⥪áâãà­ë¥ ª®®à¤¨­ âë
		je .vertexes
		jmp @f
		.vertexes: ;®¡à ¡®âª  ¡«®ª®¢, ᮤ¥à¦ é¨å ¤ ­­ë¥ ¢¥à設
			stdcall add_3ds_object, ID_ICON_DATA,ebx,2,txt_count ;ç¨á«® ¢¥à設
			add esi,2
			sub ecx,2
			stdcall add_3ds_object, ID_ICON_DATA,ebx,ecx,0 ;¤ ­­ë¥ ¢¥à設
			sub esi,8 ;¢®ááâ ­®¢«¥­¨¥ esi
			call block_next
			jmp .end_f		
		@@:
		cmp dx,CHUNK_FACELIST ;ᯨ᮪ £à ­¥©
		jne @f
			stdcall add_3ds_object, ID_ICON_DATA,ebx,2,txt_count ;ç¨á«® £à ­¥©
			push eax
			movzx eax,word[esi]
			shl eax,3
			add esi,2
			sub ecx,2
			stdcall add_3ds_object, ID_ICON_DATA,ebx,eax,0 ;¤ ­­ë¥ £à ­¥©

			sub ecx,eax
			cmp ecx,1
			jl .data_3 ;¯à®¢¥à塞 ¥áâì «¨ ¡«®ª ®¯¨á뢠î騩 ¬ â¥à¨ «, ¯à¨¬¥­ï¥¬ë© ª ®¡ê¥ªâã
if 0
				add esi,eax
				mov ecx,dword[esi+2]
				stdcall add_3ds_object, 10,ebx,ecx,0 ;¤ ­­ë¥ ¬ â¥à¨ « 
				sub esi,eax
else
				add esi,eax
				pop eax
				jmp .next_bl
end if
			.data_3:

			sub esi,8 ;¢®ááâ ­®¢«¥­¨¥ esi
			pop eax
			call block_next
			jmp .end_f		
		@@:
		cmp dx,CHUNK_FACEMAT ;¬ â¥à¨ «ë £à ­¥©
		jne @f
			push ax
				cld
				xor al,al
				mov edi,esi
				repne scasb
			pop ax
			sub edi,esi ;edi - strlen
			stdcall add_3ds_object, ID_ICON_DATA,ebx,edi,0 ;­ §¢ ­¨¥ ®¡ê¥ªâ 
			add esi,edi
			;sub ecx,edi ;㦥 ᤥ« ­® ¢ repne
			stdcall add_3ds_object, ID_ICON_DATA,ebx,2,txt_count ;ç¨á«® £à ­¥©
			add esi,2
			sub ecx,2
			stdcall add_3ds_object, ID_ICON_DATA,ebx,ecx,0 ;­®¬¥à  £à ­¥©, ª ª®â®àë¬ ¯à¨¬¥­¥­ ¬ â¥à¨ «
			sub esi,edi ;¢®ááâ ­®¢«¥­¨¥ esi (1)
			sub esi,8   ;¢®ááâ ­®¢«¥­¨¥ esi (2)
			call block_next
			jmp .end_f
		@@:
		; ***  ­ «¨§ ¡«®ª  á ¤ ­­ë¬¨ ¯® 㬮«ç ­¨î (¡¥§ ¢ë¤¥«¥­¨ï ¯®¤¡«®ª®¢)
			stdcall add_3ds_object, ID_ICON_DATA,ebx,ecx,0
			sub esi,6 ;¢®ááâ ­®¢«¥­¨¥ esi
			call block_next
			jmp .end_f
		.next_bl:
		; *** ­ áâனª¨ ¤«ï  ­ «¨§  ®áâ ¢è¨åáï ¯®¤¡«®ª®¢
			mov dword[eax],esi ;㪠§ â¥«ì ­  ­ ç «® ¡«®ª 
			mov ebx,dword[esi+2]
			mov dword[eax+4],ebx ;à §¬¥à ¡«®ª 
			inc dword[level_stack]
			add eax,8
		.end_f:
	pop edi edx ecx ebx
	ret

;¢å®¤ ¢ 1-© ¤®ç¥à­¨© ¡«®ª
;input:
; eax - 㪠§ â¥«ì ­  ¢à¥¬¥­­ë© á⥪ ä ©«  file_3ds
; esi - ­ ç «® த¨â¥«ì᪮£® ¡«®ª 
;output:
; ebx - destroy
; esi - ­ ç «® ¤ ­­ëå த¨â¥«ì᪮£® ¡«®ª 
align 4
block_children:
	push ecx
		;¯à®¢¥àª  ¯à ¢¨«ì­®á⨠ࠧ¬¥à®¢ ¤®ç¥à­¥£® ¡«®ª 
		mov ebx,esi
		add ebx,6 ;¯¥à¥å®¤ ­  ­ ç «® ¤®ç¥à­¥£® ¡«®ª 
		add ebx,dword[ebx+2] ;¤®¡ ¢«ï¥¬ à §¬¥à ¤®ç¥à­¥£® ¡«®ª 
		mov ecx,esi
		add ecx,dword[esi+2] ;¤®¡ ¢«ï¥¬ à §¬¥à த¨â¥«ì᪮£® ¡«®ª 
		cmp ebx,ecx ;ãç¨â뢠âì § £®«®¢ª¨ ­¥ ­ã¦­®, â. ª. áà ¢­¨¢ îâáï ⮫쪮 ¤ ­­ë¥ ¡«®ª®¢
		jle @f
			;¤¨ £­®áâ¨à®¢ «¨ ®è¨¡ªã ä ©« , ¤®ç¥à­¨© ¡«®ª ¢ë室¨â §  ¯à¥¤¥«ë த¨â¥«ì᪮£®
			mov dword[level_stack],FILE_ERROR_CHUNK_SIZE
			jmp .end_f
		@@:
		mov dword[eax],esi ;㪠§ â¥«ì ­  ­ ç «® ¡«®ª 
		mov ebx,dword[esi+2]
		mov dword[eax+4],ebx ;à §¬¥à ¡«®ª 
		add esi,6 ;¯¥à¥å®¤¨¬ ª ¤ ­­ë¬ ¡«®ª 
		inc dword[level_stack]
		add eax,8
	.end_f:
	pop ecx
	ret

;¯¥à¥å®¤ ª á«¥¤ã饬㠡«®ªã ⥪ã饣® ã஢­ï
;input:
; eax -  ¤à¥á áâàãªâãàë á ¯¥à¥¬¥­­ë¬¨
align 4
block_next:
push ebx
	add esi,dword[esi+2] ;¯à®¯ã᪠¥¬ ¤ ­­ë¥ ¡«®ª 

	;¯à®¢¥àª  à §¬¥à®¢ த¨â¥«ì᪮£® ¡«®ª , ¤«ï ¢®§¬®¦­®£® ¢ë室  ­  ¢¥àå­¨© ã஢¥­ì ¥á«¨ ª®­¥æ ¡«®ª 
	@@:
	mov ebx,dword[eax-8]
	add ebx,dword[eax-4]
	cmp esi,ebx
	jl @f
		dec dword[level_stack]
		sub eax,8
		cmp dword[level_stack],0
		jg @b
	@@:
pop ebx
	ret

;äã­ªæ¨ï ¯®¨áª  áâàãªâãàë ®¯¨á뢠î饩 ¡«®ª
;input:
;esi - memory pointer
;output:
;dword[bl_found] - pointer to chunk struct (= 0 if not found)
align 4
bl_found dd 0
block_analiz:
pushad
	mov dword[bl_found],0
	mov ecx,type_bloks
	@@:
		mov bx,word[ecx]
		cmp word[esi],bx
		je .found
		add ecx,sizeof.block_3ds
		cmp ecx,type_bloks.end
		jl @b
	jmp .no_found
	.found:
		mov dword[bl_found],ecx
	.no_found:
popad
	ret

;input:
; esi - 㪠§ â¥«ì ­   ­ «¨§¨àã¥¬ë¥ ¤ ­­ë¥
; level - ã஢¥­ì ¢«®¦¥­­®á⨠㧫 
; size_bl - à §¬¥à ¡«®ª 
align 4
proc add_3ds_object, icon:dword,level:dword,size_bl:dword,info_bl:dword
	pushad
		mov bx,word[icon]
		shl ebx,16
		mov bx,word[level]

		mov eax,esi
		sub eax,dword[open_file_data]
		mov dword[buffer],eax ;ᬥ饭¨¥ ¡«®ª 
		mov ecx,dword[size_bl]
		mov dword[buffer+4],ecx ;à §¬¥à ¡«®ª  (¨á¯®«ì§ã¥âáï ¢ ä㭪樨 buf_draw_hex_table ¤«ï à¨á®¢ ­¨ï «¨­¨¨)
		mov ecx,dword[bl_found]
		cmp ecx,0
		je @f
			;... §¤¥áì ­ã¦¥­ ¤à㣮©  «£®à¨â¬ § é¨âë ®â 㤠«¥­¨ï
			mov cl,byte[ecx+4]
		@@:
		mov byte[buffer+list_offs_chunk_del],cl
		mov ecx,[level]
		mov byte[buffer+list_offs_chunk_lev],cl
		mov ecx,dword[info_bl]
		mov dword[buffer+list_offs_p_data],ecx
		stdcall hex_in_str, buffer+list_offs_text,dword[esi+1],2
		stdcall hex_in_str, buffer+list_offs_text+2,dword[esi],2 ;ª®¤ 3ds ¡«®ª 
		cmp ecx,0
		jne @f
			mov byte[buffer+list_offs_text+4],0 ;0 - ᨬ¢®« ª®­æ  áâப¨
			jmp .no_capt
		@@:
			mov byte[buffer+list_offs_text+4],' '
			mov esi,ecx
			mov edi,buffer+list_offs_text+5
			mov ecx,size_one_list-(list_offs_text+5)
			cld
			rep movsb
			mov byte[buffer+size_one_list-1],0 ;0 - ᨬ¢®« ª®­æ  áâப¨
		.no_capt:
		stdcall [tl_node_add], tree1, ebx, buffer
		stdcall [tl_cur_next], tree1
	popad
	ret
endp

;input:
; eax - value
; buf - string buffer
; len - buffer len
;output:
align 4
proc convert_int_to_str, buf:dword, len:dword
pushad
	mov edi,[buf]
	mov esi,[len]
	add esi,edi
	dec esi
	call .str
popad
	ret
endp

align 4
.str:
	mov ecx,0x0a
	cmp eax,ecx
	jb @f
		xor edx,edx
		div ecx
		push edx
		call .str
		pop eax
	@@:
	cmp edi,esi
	jge @f
		or al,0x30
		stosb
		mov byte[edi],0
	@@:
	ret

align 4
but_save_file:
	pushad
	copy_path open_dialog_name,communication_area_default_path,file_name,0
	mov [OpenDialog_data.type],1
	stdcall [OpenDialog_Start],OpenDialog_data
	cmp [OpenDialog_data.status],2
	je .end_save_file
	;ª®¤ ¯à¨ 㤠筮¬ ®âªàë⨨ ¤¨ «®£ 

	mov [run_file_70.Function], SSF_CREATE_FILE
	mov [run_file_70.Position], 0
	mov [run_file_70.Flags], 0
	mov ebx, dword[open_file_data]
	mov [run_file_70.Buffer], ebx
	mov ebx,dword[ebx+2]
	mov dword[run_file_70.Count], ebx ;à §¬¥à ä ©« 
	mov byte[run_file_70+20], 0
	mov dword[run_file_70.FileName], openfile_path
	mcall SF_FILE,run_file_70
	cmp ebx,0xffffffff
	je .end_save_file
		;...á®®¡é¥­¨¥...
	.end_save_file:
	popad
	ret

align 4
but_wnd_coords:
	cmp byte[prop_wnd_run],0
	jne @f
		pushad
		mcall SF_CREATE_THREAD,1,prop_start,thread_coords
		popad
	@@:
	ret

;description:
; 㤠«¥­¨¥ ¢ë¡à ­­®£® ¡«®ª  ¨§ ®âªàë⮣® ä ©« 
align 4
but_delete_chunk:
	pushad
	stdcall [tl_node_get_data],tree1
	cmp eax,0
	je .end_f
	cmp byte[eax+list_offs_chunk_del],0 ;¥á«¨ ¡«®ª § é¨é¥­ ®â 㤠«¥­¨ï
	jne .notify

	;(1) ª®¯¨à®¢ ­¨¥ ­¨¦­¥© ç á⨠䠩« 
	mov edx,dword[eax+4] ;à §¬¥à ¡«®ª 
	sub [open_file_size],edx ;¨§¬¥­¥­¨¥ à §¬¥à®¢ ä ©« 
	mov ecx,[open_file_size]
	mov ebx,dword[eax]
	sub ecx,ebx ;ecx - à §¬¥à ­¨¦­¥© ᤢ¨£ ¥¬®© ç á⨠䠩« 
	add ebx,dword[open_file_data] ;¯®«ãç ¥¬ §­ ç¥­¨¥ ᤢ¨£  ¢ ¯ ¬ïâ¨
	mov edi,ebx
	mov esi,ebx
	add esi,edx
	mov bl,byte[eax+list_offs_chunk_lev] ;¡¥à¥¬ ã஢¥­ì ⥪ã饣® 㧫 
	rep movsb
	mov byte[can_save],1

	;(2) ¨§¬¥­¥­¨¥ à §¬¥à®¢ த¨â¥«ìáª¨å ¡«®ª®¢
	cmp bl,0
	je .end_2
	.cycle_2:
	stdcall [tl_cur_perv], tree1
	stdcall [tl_node_get_data],tree1
	cmp eax,0
	je .end_2
		cmp byte[eax+list_offs_chunk_lev],bl
		jge .cycle_2
		mov bl,byte[eax+list_offs_chunk_lev]
		mov ecx,[eax]
		add ecx,[open_file_data]
		sub dword[ecx+2],edx
		cmp bl,0 ;¥á«¨ á ¬ë© ¢¥àå­¨© 㧥«, â® bl=0
		jne .cycle_2
	.end_2:
	
	;(3) ®¡­®¢«¥­¨¥ ᯨ᪠ tree1
	call init_tree
	call draw_window

	jmp .end_f
	.notify:
	notify_window_run txt_not_delete
	.end_f:
	popad
	ret

;¤ ­­ë¥ ¤«ï ¤¨ «®£  ®âªàëâ¨ï ä ©«®¢
align 4
OpenDialog_data:
.type			dd 0 ;0 - ®âªàëâì, 1 - á®åà ­¨âì, 2 - ¢ë¡à âì ¤â४â®à¨î
.procinfo		dd procinfo ;+4
.com_area_name	dd communication_area_name ;+8
.com_area		dd 0 ;+12
.opendir_path	dd plugin_path ;+16
.dir_default_path	dd default_dir ;+20
.start_path		dd file_name ;+24 ¯ãâì ª ¤¨ «®£ã ®âªàëâ¨ï ä ©«®¢
.draw_window	dd draw_window ;+28
.status 		dd 0 ;+32
.openfile_path	dd openfile_path ;+36 ¯ãâì ª ®âªà뢠¥¬®¬ã ä ©«ã
.filename_area	dd filename_area ;+40
.filter_area	dd Filter
.x:
.x_size 		dw 420 ;+48 ; Window X size
.x_start		dw 10 ;+50 ; Window X position
.y:
.y_size 		dw 320 ;+52 ; Window y size
.y_start		dw 10 ;+54 ; Window Y position

default_dir db '/rd/1',0

communication_area_name:
	db 'FFFFFFFF_open_dialog',0
open_dialog_name:
	db 'opendial',0
communication_area_default_path:
	db '/rd/1/File managers/',0

Filter:
dd Filter.end - Filter.1
.1:
db '3DS',0
db 'TXT',0
.end:
db 0


align 4
system_dir_0 db '/sys/lib/'
lib_name_0 db 'proc_lib.obj',0
system_dir_1 db '/sys/lib/'
lib_name_1 db 'libimg.obj',0
system_dir_2 db '/sys/lib/'
lib_name_2 db 'box_lib.obj',0
system_dir_3 db '/sys/lib/'
lib_name_3 db 'buf2d.obj',0
system_dir_4 db '/sys/lib/'
lib_name_4 db 'kmenu.obj',0
system_dir_5 db '/kolibrios/lib/'
lib_name_5 db 'tinygl.obj',0
system_dir_6 db '/sys/lib/'
lib_name_6 db 'libini.obj',0

if lang eq ru
	head_f_i:
	head_f_l db '‘¨á⥬­ ï ®è¨¡ª ',0
	err_msg_found_lib_0 db '¥ ­ ©¤¥­  ¡¨¡«¨®â¥ª  ',39,'proc_lib.obj',39,0
	err_msg_import_0 db 'Žè¨¡ª  ¯à¨ ¨¬¯®à⥠¡¨¡«¨®â¥ª¨ ',39,'proc_lib.obj',39,0
	err_msg_found_lib_1 db '¥ ­ ©¤¥­  ¡¨¡«¨®â¥ª  ',39,'libimg.obj',39,0
	err_msg_import_1 db 'Žè¨¡ª  ¯à¨ ¨¬¯®à⥠¡¨¡«¨®â¥ª¨ ',39,'libimg.obj',39,0
	err_msg_found_lib_2 db '¥ ­ ©¤¥­  ¡¨¡«¨®â¥ª  ',39,'box_lib.obj',39,0
	err_msg_import_2 db 'Žè¨¡ª  ¯à¨ ¨¬¯®à⥠¡¨¡«¨®â¥ª¨ ',39,'box_lib',39,0
	err_msg_found_lib_3 db '¥ ­ ©¤¥­  ¡¨¡«¨®â¥ª  ',39,'buf2d.obj',39,0
	err_msg_import_3 db 'Žè¨¡ª  ¯à¨ ¨¬¯®à⥠¡¨¡«¨®â¥ª¨ ',39,'buf2d',39,0
	err_msg_found_lib_4 db '¥ ­ ©¤¥­  ¡¨¡«¨®â¥ª  ',39,'kmenu.obj',39,0
	err_msg_import_4 db 'Žè¨¡ª  ¯à¨ ¨¬¯®à⥠¡¨¡«¨®â¥ª¨ ',39,'kmenu',39,0
	err_msg_found_lib_5 db '¥ ­ ©¤¥­  ¡¨¡«¨®â¥ª  ',39,'tinygl.obj',39,0
	err_msg_import_5 db 'Žè¨¡ª  ¯à¨ ¨¬¯®à⥠¡¨¡«¨®â¥ª¨ ',39,'tinygl',39,0
	err_msg_found_lib_6 db '¥ ­ ©¤¥­  ¡¨¡«¨®â¥ª  ',39,'libini.obj',39,0
	err_msg_import_6 db 'Žè¨¡ª  ¯à¨ ¨¬¯®à⥠¡¨¡«¨®â¥ª¨ ',39,'libini',39,0
else
	head_f_i:
	head_f_l db 'System error',0
	err_msg_found_lib_0 db 'Sorry I cannot found library ',39,'proc_lib.obj',39,0
	err_msg_import_0 db 'Error on load import library ',39,'proc_lib.obj',39,0
	err_msg_found_lib_1 db 'Sorry I cannot found library ',39,'libimg.obj',39,0
	err_msg_import_1 db 'Error on load import library ',39,'libimg.obj',39,0
	err_msg_found_lib_2 db 'Sorry I cannot found library ',39,'box_lib.obj',39,0
	err_msg_import_2 db 'Error on load import library ',39,'box_lib.obj',39,0
	err_msg_found_lib_3 db 'Sorry I cannot found library ',39,'buf2d.obj',39,0
	err_msg_import_3 db 'Error on load import library ',39,'buf2d.obj',39,0
	err_msg_found_lib_4 db 'Sorry I cannot found library ',39,'kmenu.obj',39,0
	err_msg_import_4 db 'Error on load import library ',39,'kmenu.obj',39,0
	err_msg_found_lib_5 db 'Sorry I cannot found library ',39,'tinygl.obj',39,0
	err_msg_import_5 db 'Error on load import library ',39,'tinygl',39,0
	err_msg_found_lib_6 db 'Sorry I cannot found library ',39,'libini.obj',39,0
	err_msg_import_6 db 'Error on load import library ',39,'libini',39,0
end if

align 4
l_libs_start:
	lib_0 l_libs lib_name_0, sys_path, file_name, system_dir_0,\
		err_msg_found_lib_0, head_f_l, proclib_import,err_msg_import_0,head_f_i
	lib_1 l_libs lib_name_1, sys_path, file_name, system_dir_1,\
		err_msg_found_lib_1, head_f_l, import_libimg, err_msg_import_1,head_f_i
	lib_2 l_libs lib_name_2, sys_path, file_name,  system_dir_2,\
		err_msg_found_lib_2, head_f_l, import_box_lib,err_msg_import_2,head_f_i
	lib_3 l_libs lib_name_3, sys_path, file_name,  system_dir_3,\
		err_msg_found_lib_3, head_f_l, import_buf2d,  err_msg_import_3,head_f_i
	lib_4 l_libs lib_name_4, sys_path, file_name,  system_dir_4,\
		err_msg_found_lib_4, head_f_l, import_libkmenu,err_msg_import_4,head_f_i
	lib_5 l_libs lib_name_5, sys_path, file_name,  system_dir_5,\
		err_msg_found_lib_5, head_f_l, import_lib_tinygl,err_msg_import_5,head_f_i
	lib_6 l_libs lib_name_6, sys_path, file_name,  system_dir_6,\
		err_msg_found_lib_6, head_f_l, import_libini, err_msg_import_6,head_f_i		
l_libs_end:

align 4
import_libimg:
	dd alib_init1
	img_is_img  dd aimg_is_img
	img_info    dd aimg_info
	img_from_file dd aimg_from_file
	img_to_file dd aimg_to_file
	img_from_rgb dd aimg_from_rgb
	img_to_rgb  dd aimg_to_rgb
	img_to_rgb2 dd aimg_to_rgb2
	img_decode  dd aimg_decode
	img_encode  dd aimg_encode
	img_create  dd aimg_create
	img_destroy dd aimg_destroy
	img_destroy_layer dd aimg_destroy_layer
	img_count   dd aimg_count
	img_lock_bits dd aimg_lock_bits
	img_unlock_bits dd aimg_unlock_bits
	img_flip    dd aimg_flip
	img_flip_layer dd aimg_flip_layer
	img_rotate  dd aimg_rotate
	img_rotate_layer dd aimg_rotate_layer
	img_draw    dd aimg_draw

	dd 0,0
	alib_init1   db 'lib_init',0
	aimg_is_img  db 'img_is_img',0 ;®¯à¥¤¥«ï¥â ¯® ¤ ­­ë¬, ¬®¦¥â «¨ ¡¨¡«¨®â¥ª  ᤥ« âì ¨§ ­¨å ¨§®¡à ¦¥­¨¥
	aimg_info    db 'img_info',0
	aimg_from_file db 'img_from_file',0
	aimg_to_file db 'img_to_file',0
	aimg_from_rgb db 'img_from_rgb',0
	aimg_to_rgb  db 'img_to_rgb',0 ;¯à¥®¡à §®¢ ­¨¥ ¨§®¡à ¦¥­¨ï ¢ ¤ ­­ë¥ RGB
	aimg_to_rgb2 db 'img_to_rgb2',0
	aimg_decode  db 'img_decode',0 ; ¢â®¬ â¨ç¥áª¨ ®¯à¥¤¥«ï¥â ä®à¬ â £à ä¨ç¥áª¨å ¤ ­­ëå
	aimg_encode  db 'img_encode',0
	aimg_create  db 'img_create',0
	aimg_destroy db 'img_destroy',0
	aimg_destroy_layer db 'img_destroy_layer',0
	aimg_count   db 'img_count',0
	aimg_lock_bits db 'img_lock_bits',0
	aimg_unlock_bits db 'img_unlock_bits',0
	aimg_flip    db 'img_flip',0
	aimg_flip_layer db 'img_flip_layer',0
	aimg_rotate  db 'img_rotate',0
	aimg_rotate_layer db 'img_rotate_layer',0
	aimg_draw    db 'img_draw',0

align 4
proclib_import: ;®¯¨á ­¨¥ íªá¯®àâ¨à㥬ëå ä㭪権
	OpenDialog_Init dd aOpenDialog_Init
	OpenDialog_Start dd aOpenDialog_Start
dd 0,0
	aOpenDialog_Init db 'OpenDialog_init',0
	aOpenDialog_Start db 'OpenDialog_start',0

align 4
import_buf2d:
	dd sz_init0
	buf2d_create dd sz_buf2d_create
	buf2d_create_f_img dd sz_buf2d_create_f_img
	buf2d_clear dd sz_buf2d_clear
	buf2d_draw dd sz_buf2d_draw
	buf2d_delete dd sz_buf2d_delete
	buf2d_resize dd sz_buf2d_resize
	buf2d_line dd sz_buf2d_line
	buf2d_rect_by_size dd sz_buf2d_rect_by_size
	buf2d_filled_rect_by_size dd sz_buf2d_filled_rect_by_size
	buf2d_circle dd sz_buf2d_circle
	buf2d_img_hdiv2 dd sz_buf2d_img_hdiv2
	buf2d_img_wdiv2 dd sz_buf2d_img_wdiv2
	buf2d_conv_24_to_8 dd sz_buf2d_conv_24_to_8
	buf2d_conv_24_to_32 dd sz_buf2d_conv_24_to_32
	buf2d_bit_blt dd sz_buf2d_bit_blt
	buf2d_bit_blt_transp dd sz_buf2d_bit_blt_transp
	buf2d_bit_blt_alpha dd sz_buf2d_bit_blt_alpha
	buf2d_convert_text_matrix dd sz_buf2d_convert_text_matrix
	buf2d_draw_text dd sz_buf2d_draw_text
	buf2d_crop_color dd sz_buf2d_crop_color
	buf2d_offset_h dd sz_buf2d_offset_h
	buf2d_set_pixel dd sz_buf2d_set_pixel
	dd 0,0
	sz_init0 db 'lib_init',0
	sz_buf2d_create db 'buf2d_create',0
	sz_buf2d_create_f_img db 'buf2d_create_f_img',0
	sz_buf2d_clear db 'buf2d_clear',0
	sz_buf2d_draw db 'buf2d_draw',0
	sz_buf2d_delete db 'buf2d_delete',0
	sz_buf2d_resize db 'buf2d_resize',0
	sz_buf2d_line db 'buf2d_line',0
	sz_buf2d_rect_by_size db 'buf2d_rect_by_size',0
	sz_buf2d_filled_rect_by_size db 'buf2d_filled_rect_by_size',0
	sz_buf2d_circle db 'buf2d_circle',0
	sz_buf2d_img_hdiv2 db 'buf2d_img_hdiv2',0
	sz_buf2d_img_wdiv2 db 'buf2d_img_wdiv2',0
	sz_buf2d_conv_24_to_8 db 'buf2d_conv_24_to_8',0
	sz_buf2d_conv_24_to_32 db 'buf2d_conv_24_to_32',0
	sz_buf2d_bit_blt db 'buf2d_bit_blt',0
	sz_buf2d_bit_blt_transp db 'buf2d_bit_blt_transp',0
	sz_buf2d_bit_blt_alpha db 'buf2d_bit_blt_alpha',0
	sz_buf2d_convert_text_matrix db 'buf2d_convert_text_matrix',0
	sz_buf2d_draw_text db 'buf2d_draw_text',0
	sz_buf2d_crop_color db 'buf2d_crop_color',0
	sz_buf2d_offset_h db 'buf2d_offset_h',0
	sz_buf2d_set_pixel db 'buf2d_set_pixel',0

align 4
import_box_lib:
	dd sz_init1
	edit_box_draw dd sz_edit_box_draw
	edit_box_key dd sz_edit_box_key
	edit_box_mouse dd sz_edit_box_mouse
	edit_box_set_text dd sz_edit_box_set_text
	scrollbar_ver_draw dd sz_scrollbar_ver_draw
	scrollbar_hor_draw dd sz_scrollbar_hor_draw

	tl_data_init dd sz_tl_data_init
	tl_data_clear dd sz_tl_data_clear
	tl_info_clear dd sz_tl_info_clear
	tl_key dd sz_tl_key
	tl_mouse dd sz_tl_mouse
	tl_draw dd sz_tl_draw
	tl_info_undo dd sz_tl_info_undo
	tl_info_redo dd sz_tl_info_redo
	tl_node_add dd sz_tl_node_add
	tl_node_set_data dd sz_tl_node_set_data
	tl_node_get_data dd sz_tl_node_get_data
	tl_node_delete dd sz_tl_node_delete
	tl_node_move_up dd sz_tl_node_move_up
	tl_node_move_down dd sz_tl_node_move_down
	tl_cur_beg dd sz_tl_cur_beg
	tl_cur_next dd sz_tl_cur_next
	tl_cur_perv dd sz_tl_cur_perv
	tl_node_close_open dd sz_tl_node_close_open
	tl_node_lev_inc dd sz_tl_node_lev_inc
	tl_node_lev_dec dd sz_tl_node_lev_dec
	tl_node_poi_get_info dd sz_tl_node_poi_get_info
	tl_node_poi_get_next_info dd sz_tl_node_poi_get_next_info
	tl_node_poi_get_data dd sz_tl_node_poi_get_data

	dd 0,0
	sz_init1 db 'lib_init',0
	sz_edit_box_draw db 'edit_box',0
	sz_edit_box_key db 'edit_box_key',0
	sz_edit_box_mouse db 'edit_box_mouse',0
	sz_edit_box_set_text db 'edit_box_set_text',0
	sz_scrollbar_ver_draw db 'scrollbar_v_draw',0
	sz_scrollbar_hor_draw db 'scrollbar_h_draw',0

	sz_tl_data_init db 'tl_data_init',0
	sz_tl_data_clear db 'tl_data_clear',0
	sz_tl_info_clear db 'tl_info_clear',0
	sz_tl_key db 'tl_key',0
	sz_tl_mouse db 'tl_mouse',0
	sz_tl_draw db 'tl_draw',0
	sz_tl_info_undo db 'tl_info_undo',0
	sz_tl_info_redo db 'tl_info_redo',0
	sz_tl_node_add db 'tl_node_add',0
	sz_tl_node_set_data db 'tl_node_set_data',0
	sz_tl_node_get_data db 'tl_node_get_data',0
	sz_tl_node_delete db 'tl_node_delete',0
	sz_tl_node_move_up db 'tl_node_move_up',0
	sz_tl_node_move_down db 'tl_node_move_down',0
	sz_tl_cur_beg db 'tl_cur_beg',0
	sz_tl_cur_next db 'tl_cur_next',0
	sz_tl_cur_perv db 'tl_cur_perv',0
	sz_tl_node_close_open db 'tl_node_close_open',0
	sz_tl_node_lev_inc db 'tl_node_lev_inc',0
	sz_tl_node_lev_dec db 'tl_node_lev_dec',0
	sz_tl_node_poi_get_info db 'tl_node_poi_get_info',0
	sz_tl_node_poi_get_next_info db 'tl_node_poi_get_next_info',0
	sz_tl_node_poi_get_data db 'tl_node_poi_get_data',0

align 4
import_libkmenu:
	kmenu_init		       dd akmenu_init
	kmainmenu_draw		       dd akmainmenu_draw
	kmainmenu_dispatch_cursorevent dd akmainmenu_dispatch_cursorevent
	ksubmenu_new		       dd aksubmenu_new
	ksubmenu_delete 	       dd aksubmenu_delete
	ksubmenu_draw		       dd aksubmenu_draw
	ksubmenu_add		       dd aksubmenu_add
	kmenuitem_new		       dd akmenuitem_new
	kmenuitem_delete	       dd akmenuitem_delete
	kmenuitem_draw		       dd akmenuitem_draw
dd 0,0
	akmenu_init			db 'kmenu_init',0
	akmainmenu_draw 		db 'kmainmenu_draw',0
	akmainmenu_dispatch_cursorevent db 'kmainmenu_dispatch_cursorevent',0
	aksubmenu_new			db 'ksubmenu_new',0
	aksubmenu_delete		db 'ksubmenu_delete',0
	aksubmenu_draw			db 'ksubmenu_draw',0
	aksubmenu_add			db 'ksubmenu_add',0
	akmenuitem_new			db 'kmenuitem_new',0
	akmenuitem_delete		db 'kmenuitem_delete',0
	akmenuitem_draw 		db 'kmenuitem_draw',0

align 4
import_lib_tinygl:
macro E_LIB n
{
	n dd sz_#n
}
include '../../develop/libraries/TinyGL/asm_fork/export.inc'
	dd 0,0
macro E_LIB n
{
	sz_#n db `n,0
}
include '../../develop/libraries/TinyGL/asm_fork/export.inc'

align 4
import_libini:
	dd alib_init0
	ini_get_str   dd aini_get_str
	ini_get_int   dd aini_get_int
	ini_get_color dd aini_get_color
dd 0,0
	alib_init0     db 'lib_init',0
	aini_get_str   db 'ini_get_str',0
	aini_get_int   db 'ini_get_int',0
	aini_get_color db 'ini_get_color',0

align 4
mouse_dd dd 0
last_time dd 0

align 4
buf_0: dd 0 ;㪠§ â¥«ì ­  ¡ãä¥à ¨§®¡à ¦¥­¨ï
.l: dw 205 ;+4 left
.t: dw 35 ;+6 top
.w: dd 340 ;+8 w
.h: dd main_wnd_height-65 ;+12 h
.color: dd 0xffffd0 ;+16 color
	db 24 ;+20 bit in pixel

align 4
buf_ogl:
	dd 0 ;㪠§ â¥«ì ­  ¡ãä¥à ¨§®¡à ¦¥­¨ï
	dw 3d_wnd_l,3d_wnd_t ;+4 left,top
	dd 3d_wnd_w,3d_wnd_h ;+8 w,h
	dd 0,24 ;+16 color,bit in pixel

align 4
buf_1:
	dd 0 ;㪠§ â¥«ì ­  ¡ãä¥à ¨§®¡à ¦¥­¨ï
	dw 0,0 ;+4 left,top
	dd 128,144 ;+8 w,h
	dd 0,24 ;+16 color,bit in pixel

align 4
el_focus dd tree1
tree1 tree_list size_one_list,300+2, tl_key_no_edit+tl_draw_par_line,\
	16,16, 0xffffff,0xb0d0ff,0x400040, 5,35,195-16,250, 16,list_offs_text,0,\
	el_focus,w_scr_t1,0

align 4
w_scr_t1 scrollbar 16,0, 3,0, 15, 100, 0,0, 0,0,0, 1

align 4
ctx1 db 28 dup (0) ;TinyGLContext or KOSGLContext
;sizeof.TinyGLContext = 28

qObj dd 0

light_position dd 0.0, 0.0, -2.0, 1.0 ;  á¯®«®¦¥­¨¥ ¨áâ®ç­¨ª  [0][1][2]
	;[3] = (0.0 - ¡¥áª®­¥ç­® 㤠«¥­­ë© ¨áâ®ç­¨ª, 1.0 - ¨áâ®ç­¨ª á¢¥â  ­  ®¯à¥¤¥«¥­­®¬ à ááâ®ï­¨¨)
light_dir dd 0.0,0.0,0.0 ;­ ¯à ¢«¥­¨¥ « ¬¯ë

mat_specular dd 0.3, 0.3, 0.3, 1.0 ; –¢¥â ¡«¨ª 
mat_shininess dd 3.0 ;  §¬¥à ¡«¨ª  (®¡à â­ ï ¯à®¯®àæ¨ï)
white_light dd 0.8, 0.8, 0.8, 1.0 ; –¢¥â ¨ ¨­â¥­á¨¢­®áâì ®á¢¥é¥­¨ï, £¥­¥à¨à㥬®£® ¨áâ®ç­¨ª®¬
lmodel_ambient dd 0.3, 0.3, 0.3, 1.0 ;  à ¬¥âàë ä®­®¢®£® ®á¢¥é¥­¨ï

if lang eq ru
capt db 'info 3ds ¢¥àá¨ï 05.09.16',0 ;¯®¤¯¨áì ®ª­ 
else
capt db 'info 3ds version 05.09.16',0 ;window caption
end if

align 16
i_end:
	procinfo process_information
	run_file_70 FileInfoBlock
	sc system_colors
	angle_x rd 1 ;ã£«ë ¯®¢®à®â  á業ë
	angle_y rd 1
	angle_z rd 1
	color_ox rd 1
	color_oy rd 1
	color_oz rd 1
	color_bk rd 3
	color_vert rd 1
	color_face rd 1
	color_select rd 1
	obj_poi_sel_c rd 1
	o3d obj_3d
	rb 2048
align 16
thread_coords:
	rb 2048
align 16
stacktop:
	sys_path rb 2048
	file_name rb 4096
	plugin_path rb 4096
	openfile_path rb 4096
	filename_area rb 256
mem: