From 9b2415c6eaf65440173f3ac061f2c446c374a6a8 Mon Sep 17 00:00:00 2001 From: IgorA Date: Thu, 14 Mar 2019 11:41:53 +0000 Subject: [PATCH] 'info3ds' can open *.stl files git-svn-id: svn://kolibrios.org@7610 a494cfbc-eb01-0410-851d-a64ba20cac60 --- data/Tupfile.lua | 1 - programs/develop/info3ds/build_en.bat | 3 - programs/develop/info3ds/build_ru.bat | 3 - programs/develop/info3ds/convert_stl_3ds.inc | 459 +++++++++++++++++++ programs/develop/info3ds/data.inc | 12 +- programs/develop/info3ds/info3ds.asm | 120 ++--- programs/develop/info3ds/info3ds_u.asm | 186 ++++---- programs/develop/info3ds/info_o3d.inc | 24 +- 8 files changed, 654 insertions(+), 154 deletions(-) create mode 100644 programs/develop/info3ds/convert_stl_3ds.inc diff --git a/data/Tupfile.lua b/data/Tupfile.lua index 93aa5fbf48..3ac3e93803 100644 --- a/data/Tupfile.lua +++ b/data/Tupfile.lua @@ -147,7 +147,6 @@ extra_files = { {"HD_Load/USB_boot_old/", PROGS .. "/hd_load/usb_boot_old/usb_boot_1251.txt"}, {"kolibrios/3D/info3ds/INFO3DS.INI", PROGS .. "/develop/info3ds/info3ds.ini"}, {"kolibrios/3D/info3ds/OBJECTS.PNG", PROGS .. "/develop/info3ds/objects.png"}, - {"kolibrios/3D/info3ds/TL_SYS_16.PNG", PROGS .. "/develop/info3ds/tl_sys_16.png"}, {"kolibrios/3D/info3ds/TOOLBAR.PNG", PROGS .. "/develop/info3ds/toolbar.png"}, {"kolibrios/3D/info3ds/FONT8X9.BMP", PROGS .. "/fs/kfar/trunk/font8x9.bmp"}, {"kolibrios/3D/md2view/", "common/3d/md2view/*"}, diff --git a/programs/develop/info3ds/build_en.bat b/programs/develop/info3ds/build_en.bat index 8e5282954f..1ac1ad1e3e 100644 --- a/programs/develop/info3ds/build_en.bat +++ b/programs/develop/info3ds/build_en.bat @@ -3,11 +3,8 @@ if not exist bin mkdir bin @echo lang fix en >lang.inc @copy objects.png bin\objects.png if not exist bin\info3ds.ini @copy info3ds.ini bin\info3ds.ini -if not exist bin\tl_sys_16.png @copy tl_sys_16.png bin\tl_sys_16.png if not exist bin\toolbar.png @copy toolbar.png bin\toolbar.png if not exist bin\font8x9.bmp @copy ..\..\fs\kfar\trunk\font8x9.bmp bin\font8x9.bmp -@fasm.exe -m 16384 ..\libraries\TinyGL\asm_fork\tinygl.asm bin\tinygl.obj -@kpack bin\tinygl.obj @fasm.exe -m 16384 info3ds.asm bin\info3ds.kex @kpack bin\info3ds.kex @fasm.exe -m 16384 info3ds_u.asm bin\info3ds_u.kex diff --git a/programs/develop/info3ds/build_ru.bat b/programs/develop/info3ds/build_ru.bat index 5590eeabff..3aef31cc0c 100644 --- a/programs/develop/info3ds/build_ru.bat +++ b/programs/develop/info3ds/build_ru.bat @@ -3,11 +3,8 @@ if not exist bin mkdir bin @echo lang fix ru >lang.inc @copy objects.png bin\objects.png if not exist bin\info3ds.ini @copy info3ds.ini bin\info3ds.ini -if not exist bin\tl_sys_16.png @copy tl_sys_16.png bin\tl_sys_16.png if not exist bin\toolbar.png @copy toolbar.png bin\toolbar.png if not exist bin\font8x9.bmp @copy ..\..\fs\kfar\trunk\font8x9.bmp bin\font8x9.bmp -@fasm.exe -m 16384 ..\libraries\TinyGL\asm_fork\tinygl.asm bin\tinygl.obj -@kpack bin\tinygl.obj @fasm.exe -m 16384 info3ds.asm bin\info3ds.kex @kpack bin\info3ds.kex @fasm.exe -m 16384 info3ds_u.asm bin\info3ds_u.kex diff --git a/programs/develop/info3ds/convert_stl_3ds.inc b/programs/develop/info3ds/convert_stl_3ds.inc new file mode 100644 index 0000000000..f7f4fcb739 --- /dev/null +++ b/programs/develop/info3ds/convert_stl_3ds.inc @@ -0,0 +1,459 @@ +; +; Функции для преобразования файла *.stl в *.3ds +; +; Структура создаваемого файла *.3ds: +; CHUNK_MAIN (40+n+v+f) +; + CHUNK_OBJMESH (34+n+v+f) +; + CHUNK_OBJBLOCK (28+n+v+f) +; + CHUNK_TRIMESH (22+v+f) +; + CHUNK_VERTLIST (8+v) +; + CHUNK_FACELIST (8+f) +; +; в скобках указаны размеры блоков: +; n - память для имени объекта +; v - память для вершин +; f - память для граней + +; Формат бинарного *.stl: +; char[80] - заголовок +; uint32 - число граней +; для каждой грани: +; float[3] - вектор нормали +; float[9] - вершины 1,2,3 +; uint16 - атрибуты + + +if lang eq ru +txt_err_stl_open: + db '"STL',13,10 + db 'Файл *.stl очень большой." -tW',0 +txt_err_stl_null_v: + db '"STL',13,10 + db 'Вершины не найдены." -tE',0 +else +txt_err_stl_open: + db '"STL',13,10 + db 'File *.stl is very large." -tW',0 +txt_err_stl_null_v: + db '"STL',13,10 + db 'Vertexes not found." -tE',0 +end if + +;output: +; eax - указатель на сформированый файл 3ds (в случае неудачи 0) +; ecx - размер сформированого файла 3ds +align 4 +proc convert_stl_3ds uses ebx edx edi esi, f_data:dword, f_size:dword +locals + c_mem dd ? ;память для преобразования (convert memory) + c_size dd ? ;размер памяти для преобразований (convert memory size) + vert_c dd ? ;число вершин (vertex count) + face_c dd ? ;число граней (faces count) +endl + xor eax,eax + mov esi,[f_data] + cmp dword[esi],'soli' + jne .bin_stl + cmp word[esi+4],'d ' + jne .bin_stl + + jmp @f + .bin_stl: + ;проверяем файл на бинарный формат + mov ecx,[esi+80] + imul ecx,50 + add ecx,84 ;заголовок + cmp ecx,[f_size] + jne .no_stl + call convert_binary_stl + jmp .no_stl + @@: + + ;в начале найдено 'solid ' + stdcall txt_next_line, 80 + + mov eax,[f_data] + sub eax,esi + add eax,[f_size] + stdcall get_stl_vertex_count, esi,eax + or eax,eax + jnz @f + notify_window_run txt_err_stl_null_v + jmp .no_stl + @@: + cmp eax,0xffff + jle @f + notify_window_run txt_err_stl_open + mov eax,0xffff + @@: + + mov [vert_c],eax + mov ecx,3 + xor edx,edx + div ecx + mov [face_c],eax + shl eax,3 + mov ecx,[vert_c] + imul ecx,12 + lea ecx,[ecx+eax+40] + lea edx,[esi-6] + sub edx,[f_data] + cmp edx,2 + jge @f + mov edx,2 ;минимальный размер для имени объекта + @@: + add ecx,edx ;for object name + mov [c_size],ecx + stdcall mem.Alloc,ecx + mov [c_mem],eax + mov ebx,eax + + mov word[ebx],CHUNK_MAIN + mov dword[ebx+2],ecx + add ebx,6 + + ;3d3d + mov word[ebx],CHUNK_OBJMESH + sub ecx,6 + mov dword[ebx+2],ecx + add ebx,6 + + ;4000 + mov word[ebx],CHUNK_OBJBLOCK + sub ecx,6 + mov dword[ebx+2],ecx + add ebx,6 + + push ecx esi + mov ecx,edx + mov edi,ebx + mov esi,[f_data] + add esi,6 ;пропускаем 'solid ' + rep movsb ;копируем имя объекта + mov byte[edi-1],0 + add ebx,edx + pop esi ecx + + ;4100 + mov word[ebx],CHUNK_TRIMESH + sub ecx,6 + mov dword[ebx+2],ecx + add ebx,6 + + ;4110 + mov word[ebx],CHUNK_VERTLIST + mov dword[ebx+2],8 ;+ число вершин * 12 + add ebx,6 + + mov edx,ebx + mov word[edx],0 ;кол. вершин + add ebx,2 + finit + .cycle0: + call txt_ignore_space + cmp dword[esi],'face' + jne .end_v + stdcall txt_next_line, 80 + + call txt_ignore_space + cmp dword[esi],'oute' + jne .end_v + stdcall txt_next_line, 80 + + mov ecx,3 ;3 точки на 1 грань + @@: + stdcall stl_vertex_init, ebx + or eax,eax + jz .end_v + add ebx,12 + inc word[edx] + loop @b + + mov eax,[vert_c] + cmp word[edx],ax + jge .end_v + call txt_ignore_space + cmp dword[esi],'endl' + jne .end_v + stdcall txt_next_line, 80 + + call txt_ignore_space + cmp dword[esi],'endf' + jne .end_v + stdcall txt_next_line, 80 + jmp .cycle0 + .end_v: + + movzx eax,word[edx] + imul eax,12 + add [edx-4],eax ;исправляем размер блока 4110 + + ;4120 + mov word[ebx],CHUNK_FACELIST + mov ecx,[face_c] + mov edx,ecx + shl edx,3 ;кол. граней * 8 + add edx,8 + mov [ebx+2],edx + add ebx,6 + mov [ebx],cx ;кол. граней + add ebx,2 + xor eax,eax + @@: + mov [ebx],ax + inc eax + mov [ebx+2],ax + inc eax + mov [ebx+4],ax + inc eax + mov word[ebx+6],0 ;атрибуты + add ebx,8 + loop @b + + mov eax,[c_mem] + mov ecx,[c_size] + .no_stl: + ret +endp + +;input: +; esi - указатель на начало файла +; ecx - размер файла +align 4 +proc convert_binary_stl +locals + c_mem dd ? ;память для преобразования (convert memory) + c_size dd ? ;размер памяти для преобразований (convert memory size) + vert_c dd ? ;число вершин (vertex count) + face_c dd ? ;число граней (faces count) +endl + mov eax,[esi+80] + or eax,eax + jnz @f + notify_window_run txt_err_stl_null_v + jmp .no_stl + @@: + cmp eax,0xffff/3 + jle @f + notify_window_run txt_err_stl_open + mov eax,0xffff/3 + @@: + + mov [face_c],eax + mov ecx,eax + imul eax,3 + mov [vert_c],eax + shl ecx,3 + imul eax,12 + lea ecx,[ecx+eax+40+4] ;+4 размер для имени объекта + mov [c_size],ecx + stdcall mem.Alloc,ecx + mov [c_mem],eax + mov ebx,eax + + mov word[ebx],CHUNK_MAIN + mov dword[ebx+2],ecx + add ebx,6 + + ;3d3d + mov word[ebx],CHUNK_OBJMESH + sub ecx,6 + mov dword[ebx+2],ecx + add ebx,6 + + ;4000 + mov word[ebx],CHUNK_OBJBLOCK + sub ecx,6 + mov dword[ebx+2],ecx + add ebx,6 + mov dword[ebx],'Stl' ;имя объекта + add ebx,4 + + ;4100 + mov word[ebx],CHUNK_TRIMESH + sub ecx,6 + mov dword[ebx+2],ecx + add ebx,6 + + ;4110 + mov word[ebx],CHUNK_VERTLIST + mov dword[ebx+2],8 ;+ число вершин * 12 + add ebx,6 + + mov edx,ebx + mov ecx,[vert_c] + mov word[edx],cx ;кол. вершин + add ebx,2 + + add esi,80+4+12 ;пропуск заголовка, числа граней, 1-го вектора нормалей + mov edi,ebx + mov eax,[face_c] + @@: ;цикл по граням + mov ecx,9 + rep movsd ;копируем координаты 3-х вершин + add esi,14 ;пропуск вектора нормалей и атрибутов + dec eax + jnz @b + mov ebx,edi + + movzx eax,word[edx] + imul eax,12 + add [edx-4],eax ;исправляем размер блока 4110 + + ;4120 + mov word[ebx],CHUNK_FACELIST + mov ecx,[face_c] + mov edx,ecx + shl edx,3 ;кол. граней * 8 + add edx,8 + mov [ebx+2],edx + add ebx,6 + mov [ebx],cx ;кол. граней + add ebx,2 + xor eax,eax + @@: + mov [ebx],ax + inc eax + mov [ebx+2],ax + inc eax + mov [ebx+4],ax + inc eax + mov word[ebx+6],0 ;атрибуты + add ebx,8 + loop @b + + mov eax,[c_mem] + mov ecx,[c_size] + .no_stl: + ret +endp + +;output: +; eax - vertex count +align 4 +proc get_stl_vertex_count uses ebx ecx edi, f_data:dword, f_size:dword + mov al,'v' + xor ebx,ebx + mov ecx,[f_size] + mov edi,[f_data] + .cycle0: + repne scasb + cmp dword[edi],'erte' + jne @f + inc ebx + add edi,4 + sub ecx,4 + cmp ecx,4 + jg .cycle0 + @@: + mov eax,ebx + ret +endp + +;input: +; esi - input description text +; ppoi - pointer to vertex struct +;output: +; eax - 0 (if error init) or 1 +; esi - output description text +align 4 +proc stl_vertex_init uses ebx ecx edi, ppoi:dword + call txt_ignore_space + cmp dword[esi],'vert' + jne .err_init + cmp word[esi+4],'ex' + jne .err_init + add esi,6 + mov ebx,[ppoi] + + call txt_copy_data + call String_to_DoubleFloat + fld qword[Data_Double] + fstp dword[ebx] ;coord X + + call txt_copy_data + call String_to_DoubleFloat + fld qword[Data_Double] + fstp dword[ebx+4] ;coord X + + call txt_copy_data + call String_to_DoubleFloat + fld qword[Data_Double] + fstp dword[ebx+8] ;coord Z + + stdcall txt_next_line, 80 + jmp @f + .err_init: + xor eax,eax + jmp .end_f + @@: + xor eax,eax + inc eax + .end_f: + ret +endp + +;input: +; esi - указатель на начало строки с пробелами +;output: +; al - destroy +; ecx - destroy +; esi - указатель на первый непробельный символ +align 4 +txt_ignore_space: + mov ecx,64 ;защита от зацикливания + @@: + lodsb + cmp al,' ' + jne @f + loop @b + @@: + dec esi + ret + +;input: +; esi - указатель на строку с числом (пробелы в начале строки игнорируються) +;output: +; al - destroy +; ecx - destroy +; edi - destroy +; esi - указатель на конец копированного числа +; Data_String - строка с числом из esi +align 4 +txt_copy_data: + call txt_ignore_space + mov ecx,32 + mov edi,esi + @@: + lodsb + or al,al + jz @f + cmp al,' ' + je @f + cmp al,13 + je @f + loop @b + @@: + mov esi,edi + sub ecx,32 + neg ecx + mov edi,Data_String + rep movsb + mov byte[edi],0 + ret + +;input: +; esi - text pointer +align 4 +proc txt_next_line uses eax ecx edi, mlen:dword + mov al,13 + mov ecx,[mlen] + mov edi,esi + repne scasb + cmp byte[edi],10 + jne @f + inc edi + @@: + mov esi,edi + ret +endp \ No newline at end of file diff --git a/programs/develop/info3ds/data.inc b/programs/develop/info3ds/data.inc index ef7ff963e7..2beb70714d 100644 --- a/programs/develop/info3ds/data.inc +++ b/programs/develop/info3ds/data.inc @@ -291,7 +291,9 @@ end if if lang eq ru txt_open_3ds db 'Открыт файл:',0 -txt_no_3ds db 'Открытый файл не в формате *.3ds',0 +txt_no_3ds: db 'Открытый файл не в формате *.3ds ',39 + .zag: rb 8 + db 39,0 txt_3ds_err_sizes db 'Возможно файл поврежден',0 txt_count db 'Количество',0 txt_3ds_offs: @@ -300,10 +302,13 @@ txt_3ds_offs: db ' Размер: ' .siz: rb 8 db 0 +txt_mat_null db 'Материалы не найдены',0 else txt_open_3ds db 'Open file:',0 -txt_no_3ds db 'Открытый файл не в формате *.3ds',0 -txt_3ds_err_sizes db 'Возможно файл поврежден',0 +txt_no_3ds: db 'Open file not in format *.3ds ',39 + .zag: rb 8 + db 39,0 +txt_3ds_err_sizes db 'File may be corrupted',0 txt_count db 'Count',0 txt_3ds_offs: db 'Offset: ' @@ -311,4 +316,5 @@ txt_3ds_offs: db ' Size: ' .siz: rb 8 db 0 +txt_mat_null db 'No materials found',0 end if \ No newline at end of file diff --git a/programs/develop/info3ds/info3ds.asm b/programs/develop/info3ds/info3ds.asm index 46c1f0f43b..bf516b7c8d 100644 --- a/programs/develop/info3ds/info3ds.asm +++ b/programs/develop/info3ds/info3ds.asm @@ -1,5 +1,5 @@ use32 - org 0x0 + org 0 db 'MENUET01' ;идентиф. исполняемого файла всегда 8 байт dd 1, start, i_end, mem, stacktop, file_name, sys_path @@ -16,6 +16,7 @@ include 'lang.inc' include 'info_fun_float.inc' include 'info_menu.inc' include 'data.inc' +include 'convert_stl_3ds.inc' @use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load @@ -70,8 +71,8 @@ start: mov edi,openfile_path @@: lodsd - cmp eax,0 - je @f ;выход, если 0 + or eax,eax + jz @f ;выход, если 0 stosd jmp @b @@: @@ -137,9 +138,9 @@ start: stdcall [ksubmenu_add], [main_menu], eax mov dword[w_scr_t1.type],1 - stdcall dword[tl_data_init], tree1 + stdcall [tl_data_init], tree1 ;системные иконки 16*16 для tree_list - load_image_file 'tl_sys_16.png', icon_tl_sys + include_image_file 'tl_sys_16.png', icon_tl_sys ;если изображение не открылось, то в icon_tl_sys будут ;не инициализированные данные, но ошибки не будет, т. к. буфер нужного размера mov eax,dword[icon_tl_sys] @@ -256,8 +257,8 @@ still: @@: sub ebx,eax mcall SF_WAIT_EVENT_TIMEOUT - cmp eax,0 - je timer_funct + or eax,eax + jz timer_funct cmp al,1 jne @f @@ -443,7 +444,7 @@ pushad int 0x40 mov dword[w_scr_t1.all_redraw],1 - stdcall [tl_draw],dword tree1 + stdcall [tl_draw], tree1 stdcall [buf2d_draw], buf_0 @@ -568,7 +569,17 @@ align 4 init_tree: stdcall [tl_info_clear], tree1 ;очистка списка объектов - mov esi,dword[open_file_data] + mov esi,[open_file_data] + stdcall convert_stl_3ds, esi,[open_file_size] ;проверяем файл формата *.stl ? + or eax,eax + jz @f + ;если файл в формате *.stl + mov [open_file_size],ecx + mov esi,eax + stdcall mem.Free,[open_file_data] + mov [open_file_data],esi + mov byte[can_save],1 + @@: cmp word[esi],CHUNK_MAIN je @f stdcall buf_draw_beg, buf_0 @@ -583,8 +594,8 @@ init_tree: 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] + mov edi,[file_3ds.offs] + add edi,[file_3ds.size] .cycle_main: cmp dword[level_stack],0 jle .end_cycle @@ -592,7 +603,7 @@ init_tree: cmp esi,edi ;если конец файла jge .end_cycle - mov edx,dword[esi+2] ;размер блока + mov edx,[esi+2] ;размер блока call block_analiz cmp dword[bl_found],0 jne @f @@ -756,9 +767,9 @@ block_children: 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 ;размер блока + mov [eax],esi ;указатель на начало блока + mov ebx,[esi+2] + mov [eax+4],ebx ;размер блока add esi,6 ;переходим к данным блока inc dword[level_stack] add eax,8 @@ -815,10 +826,12 @@ popad ;input: ; esi - указатель на анализируемые данные +; icon - номер иконки ; level - уровень вложенности узла ; size_bl - размер блока +; info_bl - строка с описанием блока align 4 -proc add_3ds_object, icon:dword,level:dword,size_bl:dword,info_bl:dword +proc add_3ds_object, icon:dword, level:dword, size_bl:dword, info_bl:dword pushad mov bx,word[icon] shl ebx,16 @@ -830,8 +843,8 @@ proc add_3ds_object, icon:dword,level:dword,size_bl:dword,info_bl:dword mov ecx,dword[size_bl] mov dword[buffer+4],ecx ;размер блока (используется в функции buf_draw_hex_table для рисования линии) mov ecx,dword[bl_found] - cmp ecx,0 - je @f + or ecx,ecx + jz @f ;... здесь нужен другой алгоритм защиты от удаления mov cl,byte[ecx+4] @@: @@ -842,8 +855,8 @@ proc add_3ds_object, icon:dword,level:dword,size_bl:dword,info_bl:dword 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 + or ecx,ecx + jnz @f mov byte[buffer+list_offs_text+4],0 ;0 - символ конца строки jmp .no_capt @@: @@ -880,7 +893,7 @@ endp align 4 .str: - mov ecx,0x0a + mov ecx,10 cmp eax,ecx jb @f xor edx,edx @@ -1023,6 +1036,7 @@ Filter: dd Filter.end - Filter.1 .1: db '3DS',0 +db 'STL',0 db 'PNG',0 .end: db 0 @@ -1046,38 +1060,38 @@ 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 + head_f_l db '"Системная ошибка',0 + err_msg_found_lib_0 db 'Не найдена библиотека ',39,'proc_lib.obj',39,'" -tE',0 + err_msg_import_0 db 'Ошибка при импорте библиотеки ',39,'proc_lib.obj',39,'" -tW',0 + err_msg_found_lib_1 db 'Не найдена библиотека ',39,'libimg.obj',39,'" -tE',0 + err_msg_import_1 db 'Ошибка при импорте библиотеки ',39,'libimg.obj',39,'" -tW',0 + err_msg_found_lib_2 db 'Не найдена библиотека ',39,'box_lib.obj',39,'" -tE',0 + err_msg_import_2 db 'Ошибка при импорте библиотеки ',39,'box_lib',39,'" -tW',0 + err_msg_found_lib_3 db 'Не найдена библиотека ',39,'buf2d.obj',39,'" -tE',0 + err_msg_import_3 db 'Ошибка при импорте библиотеки ',39,'buf2d',39,'" -tW',0 + err_msg_found_lib_4 db 'Не найдена библиотека ',39,'kmenu.obj',39,'" -tE',0 + err_msg_import_4 db 'Ошибка при импорте библиотеки ',39,'kmenu',39,'" -tW',0 + err_msg_found_lib_5 db 'Не найдена библиотека ',39,'tinygl.obj',39,'" -tE',0 + err_msg_import_5 db 'Ошибка при импорте библиотеки ',39,'tinygl',39,'" -tW',0 + err_msg_found_lib_6 db 'Не найдена библиотека ',39,'libini.obj',39,'" -tE',0 + err_msg_import_6 db 'Ошибка при импорте библиотеки ',39,'libini',39,'" -tW',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 + head_f_l db '"System error',0 + err_msg_found_lib_0 db 'Sorry I cannot found library ',39,'proc_lib.obj',39,'" -tE',0 + err_msg_import_0 db 'Error on load import library ',39,'proc_lib.obj',39,'" -tW',0 + err_msg_found_lib_1 db 'Sorry I cannot found library ',39,'libimg.obj',39,'" -tE',0 + err_msg_import_1 db 'Error on load import library ',39,'libimg.obj',39,'" -tW',0 + err_msg_found_lib_2 db 'Sorry I cannot found library ',39,'box_lib.obj',39,'" -tE',0 + err_msg_import_2 db 'Error on load import library ',39,'box_lib.obj',39,'" -tW',0 + err_msg_found_lib_3 db 'Sorry I cannot found library ',39,'buf2d.obj',39,'" -tE',0 + err_msg_import_3 db 'Error on load import library ',39,'buf2d.obj',39,'" -tW',0 + err_msg_found_lib_4 db 'Sorry I cannot found library ',39,'kmenu.obj',39,'" -tE',0 + err_msg_import_4 db 'Error on load import library ',39,'kmenu.obj',39,'" -tW',0 + err_msg_found_lib_5 db 'Sorry I cannot found library ',39,'tinygl.obj',39,'" -tE',0 + err_msg_import_5 db 'Error on load import library ',39,'tinygl',39,'" -tW',0 + err_msg_found_lib_6 db 'Sorry I cannot found library ',39,'libini.obj',39,'" -tE',0 + err_msg_import_6 db 'Error on load import library ',39,'libini',39,'" -tW',0 end if align 4 @@ -1373,9 +1387,9 @@ 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 версия 10.12.17',0 ;подпись окна +capt db 'info 3ds версия 14.03.19',0 ;подпись окна else -capt db 'info 3ds version 10.12.17',0 ;window caption +capt db 'info 3ds version 14.03.19',0 ;window caption end if align 16 diff --git a/programs/develop/info3ds/info3ds_u.asm b/programs/develop/info3ds/info3ds_u.asm index ac3de39836..a72ba6f71c 100644 --- a/programs/develop/info3ds/info3ds_u.asm +++ b/programs/develop/info3ds/info3ds_u.asm @@ -16,6 +16,7 @@ include 'lang.inc' include 'info_fun_float.inc' include 'info_menu.inc' include 'data.inc' +include 'convert_stl_3ds.inc' 3d_wnd_l equ 205 ;отступ для tinygl буфера слева 3d_wnd_t equ 47 ;отступ для tinygl буфера сверху @@ -78,8 +79,8 @@ start: mov edi,openfile_path @@: lodsd - cmp eax,0 - je @f ;выход, если 0 + or eax,eax + jz @f ;выход, если 0 stosd jmp @b @@: @@ -130,9 +131,9 @@ start: stdcall [ksubmenu_add], [main_menu], eax mov dword[w_scr_t1.type],1 - stdcall dword[tl_data_init], tree1 + stdcall [tl_data_init], tree1 ;системные иконки 16*16 для tree_list - load_image_file 'tl_sys_16.png', icon_tl_sys + include_image_file 'tl_sys_16.png', icon_tl_sys ;если изображение не открылось, то в icon_tl_sys будут ;не инициализированные данные, но ошибки не будет, т. к. буфер нужного размера mov eax,dword[icon_tl_sys] @@ -252,8 +253,8 @@ still: @@: sub ebx,eax mcall SF_WAIT_EVENT_TIMEOUT - cmp eax,0 - je timer_funct + or eax,eax + jz timer_funct cmp al,1 jne @f @@ -284,8 +285,8 @@ mouse: jne .end_m stdcall [tl_node_get_data],tree1 - cmp eax,0 - je .end_d + or eax,eax + jz .end_d mov ebx,dword[eax] add ebx,dword[open_file_data] ;получаем значение сдвига в памяти cmp word[ebx],CHUNK_OBJBLOCK @@ -375,8 +376,8 @@ timer_funct: ;просматриваем выделенный блок данных stdcall [tl_node_get_data],tree1 - cmp eax,0 - je .end_f + or eax,eax + jz .end_f mov edi,eax add edi,list_offs_obj3d mov ebx,eax @@ -422,8 +423,8 @@ timer_funct: stdcall buf_draw_beg, buf_ogl stdcall [buf2d_draw_text], buf_ogl, buf_1,txt_3ds_offs,5,35,0xb000 mov edx,dword[ebx+list_offs_p_data] - cmp edx,0 ;смотрим есть ли описание блока - je .no_info + or edx,edx ;смотрим есть ли описание блока + jz .no_info stdcall [buf2d_draw_text], buf_ogl, buf_1,edx,5,45,0xb000 .no_info: stdcall [buf2d_draw], buf_ogl ;обновляем буфер на экране @@ -508,8 +509,8 @@ key: fadd dword[delt_size] fstp dword[angle_x] stdcall [tl_node_get_data],tree1 - cmp eax,0 - je .end + or eax,eax + jz .end add eax,list_offs_obj3d stdcall draw_3d, eax jmp .end @@ -520,8 +521,8 @@ key: fsub dword[delt_size] fstp dword[angle_x] stdcall [tl_node_get_data],tree1 - cmp eax,0 - je .end + or eax,eax + jz .end add eax,list_offs_obj3d stdcall draw_3d, eax jmp .end @@ -532,8 +533,8 @@ key: fadd dword[delt_size] fstp dword[angle_y] stdcall [tl_node_get_data],tree1 - cmp eax,0 - je .end + or eax,eax + jz .end add eax,list_offs_obj3d stdcall draw_3d, eax jmp .end @@ -544,8 +545,8 @@ key: fsub dword[delt_size] fstp dword[angle_y] stdcall [tl_node_get_data],tree1 - cmp eax,0 - je .end + or eax,eax + jz .end add eax,list_offs_obj3d stdcall draw_3d, eax ;jmp .end @@ -627,17 +628,17 @@ button: align 4 but_new_file: push eax ebx - stdcall dword[tl_node_poi_get_info], tree1,0 + stdcall [tl_node_poi_get_info], tree1,0 @@: - cmp eax,0 - je @f + or eax,eax + jz @f mov ebx,eax stdcall [tl_node_poi_get_data], tree1,ebx add eax,list_offs_obj3d stdcall obj_clear_param, eax - stdcall dword[tl_node_poi_get_next_info], tree1,ebx - cmp eax,0 - jne @b + stdcall [tl_node_poi_get_next_info], tree1,ebx + or eax,eax + jnz @b @@: pop ebx eax stdcall [tl_info_clear], tree1 ;очистка списка объектов @@ -694,25 +695,38 @@ but_open_file: align 4 init_tree: ;чистим память занятую объектами - stdcall dword[tl_node_poi_get_info], tree1,0 + stdcall [tl_node_poi_get_info], tree1,0 @@: - cmp eax,0 - je @f + or eax,eax + jz @f mov ebx,eax stdcall [tl_node_poi_get_data], tree1,ebx - cmp eax,0 - je @f + or eax,eax + jz @f add eax,list_offs_obj3d stdcall obj_clear_param, eax - stdcall dword[tl_node_poi_get_next_info], tree1,ebx - cmp eax,0 - jne @b + stdcall [tl_node_poi_get_next_info], tree1,ebx + or eax,eax + jnz @b @@: stdcall [tl_info_clear], tree1 ;очистка списка объектов - mov esi,dword[open_file_data] + mov esi,[open_file_data] + stdcall convert_stl_3ds, esi,[open_file_size] ;проверяем файл формата *.stl ? + or eax,eax + jz @f + ;если файл в формате *.stl + mov [open_file_size],ecx + mov esi,eax + stdcall mem.Free,[open_file_data] + mov [open_file_data],esi + mov byte[can_save],1 + @@: cmp word[esi],CHUNK_MAIN je @f + mov eax,[esi] + bswap eax + stdcall hex_in_str, txt_no_3ds.zag, eax,8 stdcall buf_draw_beg, buf_ogl stdcall [buf2d_draw_text], buf_ogl, buf_1,txt_no_3ds,5,25,0xff0000 ;рисуем строку с текстом jmp .end_open @@ -725,8 +739,8 @@ init_tree: 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] + mov edi,[file_3ds.offs] + add edi,[file_3ds.size] .cycle_main: cmp dword[level_stack],0 jle .end_cycle @@ -734,7 +748,7 @@ init_tree: cmp esi,edi ;если конец файла jge .end_cycle - mov edx,dword[esi+2] ;размер блока + mov edx,[esi+2] ;размер блока call block_analiz cmp word[esi],CHUNK_MATERIAL je @f @@ -796,8 +810,8 @@ init_tree: ; esi - new memory pointer align 4 proc block_analiz_data uses ebx ecx edx edi - mov dx,word[esi] - mov ecx,dword[esi+2] + mov dx,[esi] + mov ecx,[esi+2] sub ecx,6 ;размер данных в блоке add esi,6 mov ebx,dword[level_stack] @@ -902,20 +916,19 @@ align 4 block_children: push ecx ;проверка правильности размеров дочернего блока - mov ebx,esi - add ebx,6 ;переход на начало дочернего блока - add ebx,dword[ebx+2] ;добавляем размер дочернего блока + lea ebx,[esi+6] ;переход на начало дочернего блока + add ebx,[ebx+2] ;добавляем размер дочернего блока mov ecx,esi - add ecx,dword[esi+2] ;добавляем размер родительского блока + add ecx,[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 ;размер блока + mov [eax],esi ;указатель на начало блока + mov ebx,[esi+2] + mov [eax+4],ebx ;размер блока add esi,6 ;переходим к данным блока inc dword[level_stack] add eax,8 @@ -972,10 +985,12 @@ popad ;input: ; esi - указатель на анализируемые данные +; icon - номер иконки ; level - уровень вложенности узла ; size_bl - размер блока +; info_bl - строка с описанием блока align 4 -proc add_3ds_object, icon:dword,level:dword,size_bl:dword,info_bl:dword +proc add_3ds_object, icon:dword, level:dword, size_bl:dword, info_bl:dword pushad mov bx,word[icon] shl ebx,16 @@ -987,8 +1002,8 @@ proc add_3ds_object, icon:dword,level:dword,size_bl:dword,info_bl:dword mov ecx,dword[size_bl] mov dword[buffer+4],ecx ;размер блока (используется в функции buf_draw_hex_table для рисования линии) mov ecx,dword[bl_found] - cmp ecx,0 - je @f + or ecx,ecx + jz @f ;... здесь нужен другой алгоритм защиты от удаления mov cl,byte[ecx+4] @@: @@ -999,8 +1014,8 @@ proc add_3ds_object, icon:dword,level:dword,size_bl:dword,info_bl:dword 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 + or ecx,ecx + jnz @f mov byte[buffer+list_offs_text+4],0 ;0 - символ конца строки jmp .no_capt @@: @@ -1042,7 +1057,7 @@ endp align 4 .str: - mov ecx,0x0a + mov ecx,10 cmp eax,ecx jb @f xor edx,edx @@ -1094,6 +1109,7 @@ Filter: dd Filter.end - Filter.1 .1: db '3DS',0 +db 'STL',0 db 'PNG',0 .end: db 0 @@ -1117,38 +1133,38 @@ 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 + head_f_l db '"Системная ошибка',0 + err_msg_found_lib_0 db 'Не найдена библиотека ',39,'proc_lib.obj',39,'" -tE',0 + err_msg_import_0 db 'Ошибка при импорте библиотеки ',39,'proc_lib.obj',39,'" -tW',0 + err_msg_found_lib_1 db 'Не найдена библиотека ',39,'libimg.obj',39,'" -tE',0 + err_msg_import_1 db 'Ошибка при импорте библиотеки ',39,'libimg.obj',39,'" -tW',0 + err_msg_found_lib_2 db 'Не найдена библиотека ',39,'box_lib.obj',39,'" -tE',0 + err_msg_import_2 db 'Ошибка при импорте библиотеки ',39,'box_lib',39,'" -tW',0 + err_msg_found_lib_3 db 'Не найдена библиотека ',39,'buf2d.obj',39,'" -tE',0 + err_msg_import_3 db 'Ошибка при импорте библиотеки ',39,'buf2d',39,'" -tW',0 + err_msg_found_lib_4 db 'Не найдена библиотека ',39,'kmenu.obj',39,'" -tE',0 + err_msg_import_4 db 'Ошибка при импорте библиотеки ',39,'kmenu',39,'" -tW',0 + err_msg_found_lib_5 db 'Не найдена библиотека ',39,'tinygl.obj',39,'" -tE',0 + err_msg_import_5 db 'Ошибка при импорте библиотеки ',39,'tinygl',39,'" -tW',0 + err_msg_found_lib_6 db 'Не найдена библиотека ',39,'libini.obj',39,'" -tE',0 + err_msg_import_6 db 'Ошибка при импорте библиотеки ',39,'libini',39,'" -tW',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 + head_f_l db '"System error',0 + err_msg_found_lib_0 db 'Sorry I cannot found library ',39,'proc_lib.obj',39,'" -tE',0 + err_msg_import_0 db 'Error on load import library ',39,'proc_lib.obj',39,'" -tW',0 + err_msg_found_lib_1 db 'Sorry I cannot found library ',39,'libimg.obj',39,'" -tE',0 + err_msg_import_1 db 'Error on load import library ',39,'libimg.obj',39,'" -tW',0 + err_msg_found_lib_2 db 'Sorry I cannot found library ',39,'box_lib.obj',39,'" -tE',0 + err_msg_import_2 db 'Error on load import library ',39,'box_lib.obj',39,'" -tW',0 + err_msg_found_lib_3 db 'Sorry I cannot found library ',39,'buf2d.obj',39,'" -tE',0 + err_msg_import_3 db 'Error on load import library ',39,'buf2d.obj',39,'" -tW',0 + err_msg_found_lib_4 db 'Sorry I cannot found library ',39,'kmenu.obj',39,'" -tE',0 + err_msg_import_4 db 'Error on load import library ',39,'kmenu.obj',39,'" -tW',0 + err_msg_found_lib_5 db 'Sorry I cannot found library ',39,'tinygl.obj',39,'" -tE',0 + err_msg_import_5 db 'Error on load import library ',39,'tinygl',39,'" -tW',0 + err_msg_found_lib_6 db 'Sorry I cannot found library ',39,'libini.obj',39,'" -tE',0 + err_msg_import_6 db 'Error on load import library ',39,'libini',39,'" -tW',0 end if align 4 @@ -1439,9 +1455,9 @@ 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 [user] версия 18.04.17',0 ;подпись окна +capt db 'info 3ds [user] версия 14.03.19',0 ;подпись окна else -capt db 'info 3ds [user] version 18.04.17',0 ;window caption +capt db 'info 3ds [user] version 14.03.19',0 ;window caption end if align 16 diff --git a/programs/develop/info3ds/info_o3d.inc b/programs/develop/info3ds/info_o3d.inc index 300667b4d1..5ef6ef643d 100644 --- a/programs/develop/info3ds/info_o3d.inc +++ b/programs/develop/info3ds/info_o3d.inc @@ -348,7 +348,7 @@ pushad je .end finit imul eax,12 - stdcall mem.Alloc, eax + stdcall mem.Alloc,eax mov [ecx+obj_3d.normals_tri_data],eax mov edx,[ecx+obj_3d.tri_data] @@ -638,6 +638,8 @@ proc obj_init, o_data:dword ;поиск материалов граней shl edx,3 add esi,edx + cmp esi,ecx + jge .end_points ;если нет блока с материалом cmp word[esi],CHUNK_FACEMAT jne .end_points mov [edi+obj_3d.mat1_data],esi @@ -825,20 +827,26 @@ if version_edit eq 0 bt dword[draw_mode],bit_faces_mat jnc @f mov eax,[edi+obj_3d.mat1_data] + or eax,eax + jnz .b_found + stdcall [buf2d_draw_text], buf_ogl, buf_1,txt_mat_null,5,3,[color_select] + jmp .mat_null ;если нет материала, рисуем все грани одним цветом .b_found: - cmp eax,0 - je .end_points mov ebx,eax stdcall get_mat_color, eax stdcall draw_3d_faces_color, edi,ebx,eax stdcall found_mat_faces, ebx - jmp .b_found + or eax,eax + jnz .b_found + jmp .end_points + @@: end if ;рисование граней без цветов материалов bt dword[draw_mode],bit_faces jnc .end_triangles + .mat_null: cmp dword[edi+obj_3d.tri_count],0 je .end_triangles cmp dword[edi+obj_3d.poi_count],0 @@ -935,6 +943,8 @@ align 4 @@: bt dword[draw_mode],bit_light jnc .norm0 + or edx,edx + jz .norm0 ;если нормалей нет stdcall [glNormal3fv], edx add edx,12 .norm0: @@ -977,7 +987,7 @@ if version_edit eq 1 je .end_select mov ecx,dword[obj_poi_sel_c] stdcall [glColor3ub],[color_select+2],[color_select+1],[color_select] - stdcall dword[tl_node_poi_get_info], tree3,0 + stdcall [tl_node_poi_get_info], tree3,0 align 4 @@: cmp eax,0 @@ -994,7 +1004,7 @@ align 4 dec ecx jz .end_select .next_sel: - stdcall dword[tl_node_poi_get_next_info], tree3,ebx + stdcall [tl_node_poi_get_next_info], tree3,ebx jmp @b .end_select: end if @@ -1170,6 +1180,8 @@ pop ebx eax align 4 proc found_mat_faces uses ebx, p_mat:dword mov eax,[p_mat] + or eax,eax + jz @f add eax,[eax+2] cmp word[eax],CHUNK_FACEMAT je @f