From 41b579f8ac937f5145b8211392e1aa349629c5fe Mon Sep 17 00:00:00 2001 From: IgorA Date: Fri, 6 Dec 2013 12:07:49 +0000 Subject: [PATCH] update 'info3ds' git-svn-id: svn://kolibrios.org@4332 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/develop/info3ds/data.inc | 38 ++++-- programs/develop/info3ds/info3ds.asm | 125 ++++++++++++++++--- programs/develop/info3ds/info_wnd_coords.inc | 37 ++++-- programs/develop/info3ds/objects.png | Bin 2163 -> 2412 bytes programs/develop/info3ds/toolbar.png | Bin 2167 -> 2125 bytes 5 files changed, 166 insertions(+), 34 deletions(-) diff --git a/programs/develop/info3ds/data.inc b/programs/develop/info3ds/data.inc index 25af76ca18..30d766c894 100644 --- a/programs/develop/info3ds/data.inc +++ b/programs/develop/info3ds/data.inc @@ -1,7 +1,7 @@ if lang eq ru -capt db 'info 3ds версия 12.09.11',0 ;подпись окна +capt db 'info 3ds версия 06.12.13',0 ;подпись окна else -capt db 'info 3ds version 12.09.11',0 ;window caption +capt db 'info 3ds version 06.12.13',0 ;window caption end if MAX_FILE_LEVEL equ 20 ;максимальный уровень вложенности блоков для анализа @@ -52,7 +52,8 @@ type_bloks: block_3ds 0x0002,5,1,txt_0002 block_3ds 0x3d3e,5,1 ; [+] mesh version block_3ds 0x0011,4,1,txt_0011 -block_3ds CHUNK_ambient_color,3,0 ; [-] ambient color +block_3ds 0x0100,3,1,txt_0100 +block_3ds CHUNK_ambient_color,3,0,txt_2100 ; [-] ambient color block_3ds CHUNK_OBJMESH, 3,0,txt_3d3d block_3ds CHUNK_OBJBLOCK,3,1,txt_4000 block_3ds CHUNK_TRIMESH, 3,0,txt_4100 @@ -70,16 +71,18 @@ block_3ds 0xa020,4,0,txt_a020 block_3ds 0xa030,4,0,txt_a030 block_3ds CHUNK_TEXTURE, 3,0,txt_a200 block_3ds CHUNK_MAPFILE, 6,1,txt_a300 -block_3ds CHUNK_KEYFRAMER, 3,0,txt_b000 +block_3ds CHUNK_KEYFRAMER, 7,0,txt_b000 block_3ds CHUNK_TRACKINFO, 3,0,txt_b002 block_3ds CHUNK_TRACKOBJNAME,3,1,txt_b010 +block_3ds 0xb011,3,1,txt_b011 block_3ds CHUNK_TRACKPIVOT, 3,1,txt_b013 +block_3ds 0xb014,3,1,txt_b014 block_3ds CHUNK_TRACKPOS, 3,1,txt_b020 block_3ds CHUNK_TRACKROTATE, 3,1,txt_b021 -block_3ds CHUNK_TRACKCAMERA, 3,0,txt_b003 -block_3ds CHUNK_TRACKFOV, 3,1,txt_b023 -block_3ds CHUNK_TRACKROLL, 3,1,txt_b024 -block_3ds CHUNK_TRACKCAMTGT, 3,0,txt_b004 +block_3ds CHUNK_TRACKCAMERA, 7,0,txt_b003 +block_3ds CHUNK_TRACKFOV, 7,1,txt_b023 +block_3ds CHUNK_TRACKROLL, 7,1,txt_b024 +block_3ds CHUNK_TRACKCAMTGT, 7,0,txt_b004 ;--- далее не во всех блоках смог найти описание на русском языке block_3ds 0x4111, 3,1,txt_4111 @@ -126,6 +129,11 @@ block_3ds 0xa08e, 3,1,txt_a08e if lang eq ru txt_0002 db '3ds версия',0 txt_0011 db 'Цвет rgb (байтовый формат)',0 +;txt_0012 db 'LIN_COLOR_24',0 +;txt_0030 db 'Percentage value (int)',0 +;txt_0031 db 'Percentage value (float)',0 +txt_0100 db 'Master scale',0 +txt_2100 db 'Цвет окружающей среды',0 txt_3d3d db 'Набор объектов',0 txt_4000 db 'Объект (с именем)',0 txt_4100 db 'Треугольные сетки',0 @@ -137,16 +145,22 @@ txt_4160 db ' txt_4600 db 'Свет',0 txt_4700 db 'Камера',0 txt_a000 db 'Название материала',0 +;txt_a100 db 'MAT_SHADING',0 txt_a010 db 'Окружающий цвет',0 txt_a020 db 'Диффузный цвет',0 txt_a030 db 'Зеркальный цвет',0 txt_a200 db 'Текстура материала 1',0 txt_a300 db 'Имя файла текстуры',0 +;txt_a353 db 'MAT_MAP_TEXBLUR',0 txt_afff db 'Материал',0 txt_b000 db 'Информация об анимации',0 txt_b002 db 'Поведение объекта',0 +;txt_b009 db 'KFCURTIME',0 +;txt_b00a db 'KFHDR',0 txt_b010 db 'Название объекта',0 +txt_b011 db 'Имя экземпляра',0 txt_b013 db 'Центр вращения объекта',0 +txt_b014 db 'Bound box',0 txt_b020 db 'Траектория движения',0 txt_b021 db 'Траектория вращения',0 txt_b003 db 'Поведение камеры',0 @@ -194,10 +208,14 @@ txt_a088 db 'Face map',0 txt_a08a db 'In tranc',0 txt_a08c db 'Soften',0 txt_a08e db 'Wire in units',0 + +txt_not_delete db 'Не могу удалить выбранный блок. Он защищен.',0 else txt_0002 db '3ds version',0 txt_0011 db 'Color rgb (byte format)',0 +txt_0100 db 'Master scale',0 +txt_2100 db 'Ambient color',0 txt_3d3d db 'Editor chunk',0 txt_4000 db 'Object (with name)',0 txt_4100 db 'Triangular mesh',0 @@ -218,7 +236,9 @@ txt_afff db 'Meterial',0 txt_b000 db 'Keyframer',0 txt_b002 db 'Mesh information',0 txt_b010 db 'Object name',0 +txt_b011 db 'Instance name',0 txt_b013 db 'Object pivot point',0 +txt_b014 db 'Bound box',0 txt_b020 db 'Position track',0 txt_b021 db 'Rotation track',0 txt_b003 db 'Camera information',0 @@ -266,6 +286,8 @@ txt_a088 db 'Face map',0 txt_a08a db 'In tranc',0 txt_a08c db 'Soften',0 txt_a08e db 'Wire in units',0 + +txt_not_delete db 'I can not delete the selected chunk. It is protected.',0 end if if lang eq ru diff --git a/programs/develop/info3ds/info3ds.asm b/programs/develop/info3ds/info3ds.asm index 40ebebccf6..b8e2b270e0 100644 --- a/programs/develop/info3ds/info3ds.asm +++ b/programs/develop/info3ds/info3ds.asm @@ -34,6 +34,7 @@ ends run_file_70 FileInfoBlock image_data dd 0 ;указатель на временную память. для нужен преобразования изображения open_file_lif dd 0 ;указатель на память для открытия файлов 3ds +open_file_size dd 0 ;размер открытого файла ; fn_toolbar db 'toolbar.png',0 @@ -44,7 +45,7 @@ image_data_toolbar dd 0 TREE_ICON_SYS16_BMP_SIZE equ IMAGE_TOOLBAR_ICON_SIZE*11+54 ;размер bmp файла с системными иконками icon_tl_sys dd 0 ;указатеель на память для хранения системных иконок icon_toolbar dd 0 ;указатеель на память для хранения иконок объектов -TOOLBAR_ICON_BMP_SIZE equ IMAGE_TOOLBAR_ICON_SIZE*7+54 ;размер bmp файла с иконками объектов +TOOLBAR_ICON_BMP_SIZE equ IMAGE_TOOLBAR_ICON_SIZE*8+54 ;размер bmp файла с иконками объектов ; IMAGE_FILE1_SIZE equ 128*144*3+54 ;размер файла с изображением @@ -100,13 +101,16 @@ ID_ICON_DATA equ 2 ; FILE_ERROR_CHUNK_SIZE equ -3 ;ошибка в размере блока align 4 -file_3ds: +file_3ds: ;переменные используемые при открытии файла .offs: dd 0 ;+0 указатель на начало блока .size: dd 0 ;+4 размер блока (для 1-го параметра = размер файла 3ds) rb 8*MAX_FILE_LEVEL -size_one_list equ 40 -list_offs_text equ 12 ;сдвиг начала текста в листе +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 @@ -226,7 +230,7 @@ end if mov dword[offs_last_timer],eax call buf_draw_beg stdcall [buf2d_draw_text], buf_0, buf_1,txt_3ds_offs,5,35,0xb000 - mov edx,dword[ebx+8] + 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 @@ -353,23 +357,24 @@ pushad int 0x40 mov ebx,(30 shl 16)+20 - mov ecx,(5 shl 16)+20 mov edx,4 int 0x40 cmp byte[can_save],0 je @f mov ebx,(55 shl 16)+20 - mov ecx,(5 shl 16)+20 mov edx,5 int 0x40 @@: mov ebx,(85 shl 16)+20 - mov ecx,(5 shl 16)+20 mov edx,6 ;окно с координатами int 0x40 + mov ebx,(110 shl 16)+20 + mov edx,7 ;удаление блока + int 0x40 + mov eax,7 mov ebx,[image_data_toolbar] mov ecx,(16 shl 16)+16 @@ -385,8 +390,17 @@ pushad add ebx,IMAGE_TOOLBAR_ICON_SIZE mov edx,(57 shl 16)+7 ;save int 0x40 + sub ebx,IMAGE_TOOLBAR_ICON_SIZE @@: + add ebx,4*IMAGE_TOOLBAR_ICON_SIZE + mov edx,(87 shl 16)+7 + int 0x40 + + add ebx,IMAGE_TOOLBAR_ICON_SIZE + mov edx,(112 shl 16)+7 + int 0x40 + mov dword[w_scr_t1.all_redraw],1 stdcall [tl_draw],dword tree1 @@ -422,6 +436,10 @@ button: jne @f call but_wnd_coords @@: + cmp ah,7 + jne @f + call but_delete_chunk + @@: cmp ah,1 jne still @@ -441,7 +459,6 @@ but_new_file: mov byte[can_save],0 stdcall [tl_info_clear], tree1 ;очистка списка объектов stdcall [buf2d_clear], buf_0, [buf_0.color] ;чистим буфер - ;;;call draw_window stdcall [tl_draw], tree1 stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране ret @@ -469,11 +486,19 @@ but_open_file: cmp ebx,0xffffffff je .end_open_file - ;add ebx,[open_file_lif] - ;mov byte[ebx],0 ;на случай если ранее был открыт файл большего размера чистим конец буфера с файлом + mov [open_file_size],ebx ;mcall 71,1,openfile_path mov byte[can_save],0 + call init_tree + stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране + + .end_open_file: + popad + ret + +align 4 +init_tree: stdcall [tl_info_clear], tree1 ;очистка списка объектов mov esi,dword[open_file_lif] @@ -532,10 +557,6 @@ but_open_file: stdcall [tl_cur_beg], tree1 stdcall [tl_draw], tree1 .end_open: - - stdcall [buf2d_draw], buf_0 ;обновляем буфер на экране - .end_open_file: - popad ret ;анализ данных блока @@ -676,6 +697,8 @@ block_children: ret ;переход к следущему блоку текущего уровня +;input: +; eax - адрес структуры с переменными align 4 block_next: push ebx @@ -722,6 +745,8 @@ popad ;input: ; esi - указатель на анализируемые данные +; level - уровень вложенности узла +; size_bl - размер блока align 4 proc add_3ds_object, icon:dword,level:dword,size_bl:dword,info_bl:dword pushad @@ -734,13 +759,22 @@ proc add_3ds_object, icon:dword,level:dword,size_bl:dword,info_bl:dword 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+8],ecx + 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 - символ конеца строки + mov byte[buffer+list_offs_text+4],0 ;0 - символ конца строки jmp .no_capt @@: mov byte[buffer+list_offs_text+4],' ' @@ -857,6 +891,61 @@ but_wnd_coords: @@: ret +;description: +; удаление выбранного блока из открытого файла +align 4 +but_delete_chunk: + pushad + stdcall [tl_node_get_data],tree1 + pop ebx + cmp ebx,0 + je .end_f + cmp byte[ebx+list_offs_chunk_del],0 ;если блок защищен от удаления + jne .notify + + ;(1) копирование нижней части файла + mov edx,dword[ebx+4] ;размер блока + sub [open_file_size],edx ;изменение размеров файла + mov ecx,[open_file_size] + mov eax,dword[ebx] ;получаем значение сдвига выбранного блока относительно начала файла + sub ecx,eax ;ecx - размер нижней сдвигаемой части файла + add eax,dword[open_file_lif] ;получаем значение сдвига в памяти + mov edi,eax + mov esi,eax + add esi,edx + mov al,byte[ebx+list_offs_chunk_lev] ;берем уровень текущего узла + rep movsb + mov byte[can_save],1 + + ;(2) изменение размеров родительских блоков + cmp al,0 + je .end_2 + .cycle_2: + stdcall [tl_cur_perv], tree1 + stdcall [tl_node_get_data],tree1 + pop ebx + cmp ebx,0 + je .end_2 + cmp byte[ebx+list_offs_chunk_lev],al + jge .cycle_2 + mov al,byte[ebx+list_offs_chunk_lev] + mov ecx,[ebx] + add ecx,[open_file_lif] + sub dword[ecx+2],edx + cmp al,0 ;если самый верхний узел, то al=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 ;input: ; buf - указатель на строку, число должно быть в 10 или 16 ричном виде @@ -1215,7 +1304,7 @@ buf_1: db 24 ;+20 bit in pixel el_focus dd tree1 -tree1 tree_list size_one_list,200+2, tl_key_no_edit+tl_draw_par_line,\ +tree1 tree_list size_one_list,300+2, tl_key_no_edit+tl_draw_par_line,\ 16,16, 0xffffff,0xb0d0ff,0xd000ff, 5,35,195-16,250, 16,list_offs_text,0, el_focus,\ w_scr_t1,0 diff --git a/programs/develop/info3ds/info_wnd_coords.inc b/programs/develop/info3ds/info_wnd_coords.inc index 2f2748653b..5f489fa574 100644 --- a/programs/develop/info3ds/info_wnd_coords.inc +++ b/programs/develop/info3ds/info_wnd_coords.inc @@ -32,12 +32,34 @@ pushad stdcall [tl_node_get_data],tree1 pop ebx xor edx,edx + mov dword[capt_p],txt_q cmp ebx,0 - je @f + je .no_points mov ebx,dword[ebx] ;получаем значение сдвига выбранного блока add ebx,dword[open_file_lif] - mov dx,word[ebx+6] ;колличество точек - @@: + + cmp word[ebx],CHUNK_VERTLIST + jne @f + movzx edx,word[ebx+6] ;колличество точек + add ebx,8 + mov dword[capt_p],txt_4110 + jmp .no_points + @@: + cmp word[ebx],0xb013 + jne @f + inc edx + add ebx,6 + mov dword[capt_p],txt_b013 + jmp .no_points + @@: + cmp word[ebx],0xb014 + jne @f + mov edx,2 + add ebx,6 + mov dword[capt_p],txt_b014 + ;jmp .no_points + @@: + .no_points: ;настройка списка объектов mov dword[tree3.info_max_count],2 @@ -48,11 +70,8 @@ pushad mov eax,dword[icon_toolbar] mov dword[tree3.data_img],eax - cmp ebx,0 + cmp edx,0 je .no_object - cmp word[ebx],CHUNK_VERTLIST - jne .no_object ;если не тот объект - add ebx,8 mov word[NumberSymbolsAD],5 finit .new_point: @@ -94,7 +113,7 @@ pushad mcall 12,1 xor eax,eax - mov edi,txt_4110 ;caption + mov edi,dword[capt_p] ;children window caption mov bx,word[procinfo.box.left] add bx,word[buf_0.l] shl ebx,16 @@ -289,6 +308,8 @@ prop_button: mov byte[prop_wnd_run],0 ;обнуляем счетчик окон mcall -1 ;выход из программы +capt_p dd 0 + ;дерево с объектами в пользовательском файле tree3 tree_list MAX_OBJECT_SIZE,3,\ tl_key_no_edit+tl_list_box_mode,\ diff --git a/programs/develop/info3ds/objects.png b/programs/develop/info3ds/objects.png index eeb5167656056c76326a14925ff3d1b959e08c09..ee77879da7c817c5b5fac52422455aa9c7dbf95a 100644 GIT binary patch literal 2412 zcmV-y36u7TP)nS!K~z{r z-I#k&(^nS9f7o%H*Q0wf`?vnTx0ybJ_7PG`2iIrE$Re)s#i z=iYPAz2`Tv0svw{7XlNy2vk=be9wf5-K=?Uc$LR!HCo`>zDc^~or$Vt=ACS3m;8AuqhM-M2#sVfR7}= zFLgrzAI%J@rzw>Lnr;N*kZSWblYp?=%XCO32i|Kd3F~e+Oak|=(lR3)sxm(%fv)l| zAOEnoIMN`jS+q%N-UZ2{lO(_?*@IE4&vhk%{%UtcvlnW}xNCwP%h`W39GK3bY*5!vGu?PO^CI?&X26%b)KRl3!@}yKi9>MYb*1AR=S;E z<%Lm_GIva3;nk=4{%Y%HO3Y#tz`q|Wg7SRQm;P7E+nTk!C< z`dtHNmt?GUnDCG+d$73JMyWA!fLpd-as$PVd711-O^%~}v|UPeW!S0*umPhjZE2Lue5ad~UoF$crZld@4g7|v&8_i1NhVGh4`4;IgGqp*&hf4WxfI#}%6 zH2HoGu=(J@(ag+#z*ql@jvi7fMZ?2FiG)8m$Q>By5R1`@SS)NZGo+1?kppsh_u$~G z{{9!;-JGtj7J=XqpPzT@7OJsT$7qY`=i%Xla(VC2kO^}pHPf`Vj9<)BQ4%z|?bo9?R7K1i=8hlf)_ff2AK zAV98CN#t^5<|UPWc=0jX+@w-+N*D$d7y(W+nnI;|nU+>>Z*LRDSVDh_Hb06%PDv=0 zqQD4P?&G6WtMAy`OIQ5!tZ&?xUdawAai68rLQ9q~T25oQQD6it_4HJ!)fE(q#D|8) z+29&c{xQAV7cH#VQ7o6EzzCph-KqxofkNr{z_I;(+q!vnLDxQtt8qf}&0B&?gaRXA z(WXuK%=GiSLZReSC^uYOd@njA)U86>ma$|=p&$kNY@Pqpx~SD^rAmbX@cG7dLxR0? zy#4-*z7mB(C(y3+pBx=^i;rW&`CtqX!&u|`46D^Tffo4P!iB%JwH?DyU^JxhZwaH% zetEx8R7Dq_IUv|W6VL*MQ78N8l?q|M`5iadQ7I_g)x$U>V_j4Km#MB~$>_IxqVom2 z3I;1*nx?l{Sk}qfHr!qS&AC92f%s4eje+QkaK2$U{ZXe!)j-*6{Tw6`!E=tgtS1+E z$DuA1ZpJ}&Dx_vW!gbhJ0|_r=NnOu3w#o!D?K-sZPPYmCls1Z1V4n7PRJjCI@K^w-6fGUf`9>!PeAQnsM@89wP9-k&syseRq`bW zx(O+FApa563E<7^erUZ1wG1de0rb6)?Wx*sU8@B=*lUx-{zoAABpk|t?@OSr0lL}! zP<{{c=y2vRB<_Zwbz3F5EGu~2qrhk#$ojzIv5=|aGAUQA4NK9e^$C)mk&M?cSc zd&}AE2VCy0+S*a;1D@M+&rcs#Dow^_raruV+#6#5Psjau_K@k{LKYcfjJ;;IiExjK zve>ImfMUWeA_8mX@>E!H3|60nb!TAZ32-_NuIWJi4!m<9_9hhEgUf79X+<&N5*CKF zHGmF#u0qUBIL(B}>kwb8`EiN~hi*Y(6STj9W9 zgMa4opbM+RF1y4OZ9Q7ypV<&m@Fe9n|J>caOB`7dPgU{;G%_lc!0#Ht;GhoJ5dEJ` zNoC%r?gV^$KkRZ_Oc5`stmg!4D6L+JG87YkS+nN#@NnnAfJH+YiizJZUOd&#Zk&eV zi6`Iq6X{)iFOA3BJDP*;KjF81n(;7q?pz(<=jUg_Xo1$&*2u`n;NW0qXJ?bYoT*f5 zbaZq`NC;~5Ujil~%oNg0-kS$dcdP<3?f~8mnJH7Im;p$2aSO0JG|d341{uzO=EiF#^KF!`@~{p!`L-QC@toSbk?@FnW(?d|a;YV;n) elXgEdz5fTWSNY)r$uAoK0000|gQbB?|vS?Kv0wI;9d-S6j~d(S=hp5Md{0Ek6h2rTL%P+fQO4GSiI_so0Kt2WM{F#r`u zml&JV_Y#taG09%DOl8y(O8~}i$@K=5_Z;B2r(GLY#0g$;I zWT)m|<+8p+58aGCFPmwX0_`-9L#zQ&QL5o@6i;)-4^kD+E<#k)M0-Skg@>fscbe^s zkCqIIzwH@OC7;90}?g!jD26SWg6QB7#4hG1>;g z|F49P6G2@~pk~&?qLc3@0SE%Okqw)j11V+BdyyJLSZ%7wuI2<@t){`^;|Zf<>i{Vw zb*A_8c`$alIKV<}!^7+9|21HBN#r$mv#`#ef5ukBI@s*nGWq@+VE4(BbD5R>fUo`$8#}GlN>nPLT+WxtxKmRjQYl&` zi-k>AhP3ne@hP=hB$GX#oO~t{amL1a1%e(vzv#{#RAZ}=F%;8JqoQPL_4xF(1#_XW zkhEoPZf2*(C*k1=tyZc~OvvSFP0yC*v@XqVjbn01S2#8lm;u|u!jxLAOsPa><)t>y z2YR%3b6Uya;gnEd2DpTTsC7EIT8+%IwCeY+^`X6!R!vR`!+-)aU^9)T(dmY>vs;~< zR>UyY(g)F&$1un#2^9(ym;oF8{k3}ieJ3ZyroUedNc`M4-8m!ilN?$^)mldHc?>rS z%z$-1K03X=jzW?9)6h8EJ)&zrpo;>~BJZx3s?{hk11MfzdVudKl#zGW552XjWtn4G z#rug(o6!P_*5VSOzzkUJ>50$Gz`z?6N(qH>%iTTTnsai?R{5ygfp-R4BH(r+CS$oKxtTqUf%fuL7-ND z1*XDb^b~aGLtQD9RYO51oEe5=liDQRfTw_S{<#4t=j<4q&g4O~1QN8`e2`SZlQv*; zpjM>&PAyFZegr%UoM!Cc7=SqTiY{Gt6CCP>j8Q0=f)<^MryrBc+d;s9zAR`y0u8~s z_!Vpe;L~hhrAxmKVYeaUK9ux8ivV7}n1ucgXlB6OETA8Od>`FD`(^{+&2~+b2AzUK zXCa{gzN>)P){}36 z8E#1LpTlwQ5gCbR37++@mk2B?c-*7FY#qq@z~ZrxY2Y#`H|$MI(VX>REq&>^ho|uu z{b0uoCbRzG!_s^A=Bp2mMSmpgkm=awtPe_!hO8+T%$)V1iN`{QHQKoH>RYDFob_RO z-fy$m>G+F&o{W#zve}Qg+&j(9bJhnux8J$)8gpbW*thJE`)3dOHK-SfMh)IU+bSQ8q#Au{%Fap|9BeC>1bYDhtObVcpOAA0XR zoW!DwV+R z8i7n^1h&Wi%QLOU@7(>6ZyrV#55!gS(rUz6tm*7lEy_?#yzS!hLZup=nzCsqLoxB@ pnl-<2bX=gJc=5@%@I)e&{{f-d3r{JlQ<(q&002ovPDHLkV1hdQA`Som diff --git a/programs/develop/info3ds/toolbar.png b/programs/develop/info3ds/toolbar.png index 6887aaaa04cbff8dc0ab323fef2ac4c683974b08..e815f353263ce837daa5fa85568cf4e8cf80ce46 100644 GIT binary patch delta 2089 zcmV+^2-f%a5X}&f85jlt000*U@H+qi00d`2O+f$vv5yPkLRP4lQkve0f2 ztt07@lI77rl9DtD?-mRM2-G%@P(w&UY+m8z+NMy00pl2hZNNOgy}zGxFV|0S+-O(& z>iC@d`+d&u{LZ=OT;G46EG{m>Y8_Mz4Gk-nyPke}l_D-~wZ9nwnwpwG<#K9hXn@(= z>u0Bs13VrN0yR213KH233|J5d2?CH|D2TjW4)Ft!QFToX>&A_8D3wZ9c6LtC@Wf#U z0RrtT+NOB6(gSMnGheJQ9B~FH{mJA|TRQ5S=3e zy1KeR5+f0#5zCk&kVh9biL_KnVkCj(o*VgZj=)s@$B@IAo3dfx?g2jywIsvdeiW`j z4f{v{qIw5U!DD|uhspk{nEGDn*E>f+(Fh{P{^}hvK+$>*k(^1c?iASX?e$6M&DoyJ z8f!hoqR7OkeGv!%YIJs{VXWmiY~LKjl&wh`yS#TX0`ifDV9Z%7grm2++ryw-D= zwxnR{yF-{X?uN(kH_W>`Ao_3wRAC3#JC!p|%sR?3W6KKewP!0kyV}-bqWJ~xh--LTF=ucGs~?l~Vo@R0!K z&o}XSJ-zwxn6B_lxDBUxHe4M^tcm*xm}uLFiPk;vj%xh@j;1VFOAo_zW<9=5eQ`w^ zQ6F21;QxRBFg=zC=mZk?M=rnXmqeS1xHpE}59m;-Y0$yqm}8Aj_~i1;U~0y<0Y%)A z=rqn&R^wLlx2V)qGmN&omiA6`^cWdN5lQPHFb4!UoAD*SuG1s8@CJ%1d`Et5ofh|+ z+c01o_Xjkz+Oa8d7+=)`nie4crVHuU9k^IFhVy@4S&(qnfL9M0ke=f^wSxfXGgWwU zqYlOOP7L%Ld3>Vmwm}}ws@FSk{AxQ7$uv0T9{~ZL+T0=mDC-2GaT4fCUKImA`J$QM zT-wdT49RnFAydtOvRe;)5y)h-ni%j*{Cx%#T`y%ox3O<2i3IrB8*Mn6HO%8YdG)TO zv|N83_I#|u>bLrQfYNf@>9hs|ezC0u>km5ctG`?DN}`j0zn0|FuXj7~y8~V%r{Ccj zscY)?Uk4Py>h1UO!mb{~zkd}yojTUBvviaXUM( zA#n!rdvnmNt7mOFsKa0O7h~stJ$QbP2YP=qg3b>HPy|n|EyK^>&|}?}(eFxsmHiL|5?14({p5^;wCxX4W5XI@ccyw&fDK19_+`a3 zeyW`0lIl?bUjC>8tJI5l;)YLDj|%WoLa_uO5Y?jsyqB(JCs9<73b4{gIqcyYGa%+6 z#GFL=G(M$zglUX{Q>3;dFZ{K4E>e85J+4fu1&?L_B5Qg z)8Nr(fb49omBD~My&BCKyP^Byea!ddqWZ)(F70*yLsxDBdW-)BtLhjY2z9bkjEs!< zKE72~v&ycWLe+^a@U~rH=kb5Wb6iq=xav5J1&Qb{Jpx010_soighH#;qP4XZCX)%b z%Pylfbvq{Sp2xNQYhkbX6onsdlJb9OY%E3Q{y%_9 zy1MI&k@4;t3|0JxAylVJ?xRqv)mT_q!2JAtNOgXrWC)dHL$>52UW&@fO3cpAVohNj zyk0L4N3YkTv$GRMqmkR>B3ts20OjT7n4X>v`jQ*!6EU@sE%``*l9Cd*-EPz;d;q7@ zi5lTwSz}|PB(W}*WJ`ZO5}=@<0ORB1u-ok`64{cE1jx(FgTo=b)@1-gLqn*otwm8$ z5ts7c^Z}0UlP&p3fXvKH{?u!+SXLymB_9cJ@!~}eeRz0yMIu}BkpS7**+@xAiAv-n z0ixMF!oF<#>{4$%h-vs?UH~?_H1GJMfYxvzX>zezUi??bo-EF<>iZOFR zTe#MlyMH&1tTm5owoGi5vn41w4V`frP`*2=;xeM@MpE|}y6oPqe-Ez%!s&Yve)A-q z_Zs~TH1|6QZ{$0s38w4$O&UX{v;sIf!Tf6vmkgj=mXEj=QEbcDZF{FeTM*hUq{unE z)-4nfmzZJY+i4Tn?+`xW44ZI>o^p>Ocs`+6L7BH=8P>6!+wpAcm>p08O%W-OX%e49 zFqP0^L@Os6+ zhnVxIp7AcF`h1y)f?UGLg{b4>fAs-i+Jr$V7h{)!|yyg4V&Lp6yel?5!b*!KU zb{LusZRI`bUU~Xc5RcoMh8t3{EGPx$ln>X)2s1L$gi>QcX}nH-e`~JYgNC`cRR4IL zpuru~i&F}-$EaBr9bq4LkY~zsI}o}4l#i{9LyaF6OaRh z)G#h7k~bPJoQ)RJ;`6fMsd>#Ah3M?U%7S9_+v1iF2=wRjA0@?Ksw=*fmLiZyWZBoI zQY5AZRbNxzSkv6r)YSN`71M%7W7^s>vpQdX8q6xdr59o|iu%%ui1~=_yfQ*c38SEj zo{wU`Ygqfw)yXgigq4+Vke8Tn=`ZbmM$(_l3+SDWBQ+68=oZCOvs` z0lu}EDWDZ?E#+=6e-zFmx0xk7t4Q8r>khk7#A)g7?(XRu93*t%@%Wy>>HfiyA>tTu z7(Y2i7#|-Wog`0?=cv?~?%@^O*is*nH9(aRsVwR&jk35#UXn2AlM6I5bBQ8k; z5wCxDV^p+3Sy-Ucm)I-JMHY*-z+9)ZMJ%pJBxLUGtnvAL9)DZ7E#4Dth{fXlQT&oQ zn+E_$0b>4ec9;Br3*f#fqp@F!9L&Kx8URql{%fh0oG|vkJ;m60#kfBTih1G}6$o(k z3yFx)bG8Gj#~SGw>zSIEC;9F_3f0lp3h3aJSs({H;h};<++`oK?F=2y^h|NMK6MvE z1R*_+Noj;4iz(Jvxcrg0Kh@#MRp~O{MnL5%ARX1CKvr?EF7WtDVwgJXn73W&iEq5s zysNdMUQYZp^j$b?OLJp(@f}ATWvcS}JxQexdp<7mWsdr?m0Q28lA>uT>_78*SV$ri zs_@Ki$G`Z5ftBgm8kvuv&~FfxKIt6Usid7GH+vWGNU$~d)Lw|OZvSJ*;hAuh zjE+VQ8=t+Nehi>>`#=Qdz+-poG>7$=dNXRJ$a%!~e#foi7bG$BG^AKlX*CGYBoGRr z8K&AxmwXkGjyK{U=#)9-jRpS*o` zV60Ku7}tH@XO z)pbl=bv3iF0cU)jYb0Z@ctcz>fAFBDA|_O@;$=T>p!w-XG{ffT=_BzhtY)OX&Krv* z{;%dd7Yx4)oU6vx#vM40D<`h2`-+sY*iq$(Am6_{zX=^B|7DVEK(1)N zHm-g)ygInOuJwTv`0e0{k2*R!CU>aeWl-JeD++=rM;#R6ahJ|$B{y5qmj$n+JzkI>8vnO2ddvUg~ZI48jZz_lgi|7zS4;b2e`Mt?5S1fE8GoCsf2-e8X z50pr*KeK@cILHaQO092ux0V=cNUL|;QK*tCcU6!E8mlD%E0nbj{bAZ)Q*R3JmQPLm zql!?livW~1J~w}wzrUB4oXkbB(-Ot{c%3IQ!}SLRpN()k{(8>4oca zHqE}osw&746s>2H82ricZ2AQwL)nny5R*o@QGxPLhJQGEm0(m^*LeuC3~zXqaMDxx q5|AdFzfgJ^d6|K1)-?}2Cy~ls