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 eeb5167656..ee77879da7 100644 Binary files a/programs/develop/info3ds/objects.png and b/programs/develop/info3ds/objects.png differ diff --git a/programs/develop/info3ds/toolbar.png b/programs/develop/info3ds/toolbar.png index 6887aaaa04..e815f35326 100644 Binary files a/programs/develop/info3ds/toolbar.png and b/programs/develop/info3ds/toolbar.png differ