diff --git a/programs/develop/info3ds/info3ds.asm b/programs/develop/info3ds/info3ds.asm index 70cf8a50bc..8f56765c84 100644 --- a/programs/develop/info3ds/info3ds.asm +++ b/programs/develop/info3ds/info3ds.asm @@ -13,6 +13,8 @@ include 'lang.inc' include 'info_fun_float.inc' include 'info_menu.inc' +offs_zbuf_pbuf equ 24 ;const. from 'zbuffer.inc' + debug equ 0 @use_library_mem mem.Alloc,mem.Free,mem.ReAlloc,dll.Load @@ -44,7 +46,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*8+54 ;размер bmp файла с иконками объектов +TOOLBAR_ICON_BMP_SIZE equ IMAGE_TOOLBAR_ICON_SIZE*10+54 ;размер bmp файла с иконками объектов ; IMAGE_FILE1_SIZE equ 128*144*3+54 ;размер файла с изображением @@ -94,6 +96,8 @@ offs_last_timer dd 0 ; 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 ;ошибка в размере блока @@ -149,10 +153,27 @@ start: 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_SUBMENU, sz_main_menu_View, [main_menu_view] - stdcall [ksubmenu_add], [main_menu], eax stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Veiw_Reset, 9 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, 10 + stdcall [ksubmenu_add], [main_menu_vertexes], eax + stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Vertexes_Deselect, 11 + 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, 12 + stdcall [ksubmenu_add], [main_menu_vertexes], eax + stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Average_y, 13 + stdcall [ksubmenu_add], [main_menu_vertexes], eax + stdcall [kmenuitem_new], KMENUITEM_NORMAL, sz_main_menu_Average_z, 14 + 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 @@ -216,6 +237,8 @@ start: 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] @@ -1480,6 +1503,13 @@ buf_0: dd 0 ;ука .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 ;указатель на буфер изображения @@ -1512,9 +1542,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 версия 29.11.15',0 ;подпись окна +capt db 'info 3ds версия 02.12.15',0 ;подпись окна else -capt db 'info 3ds version 29.11.15',0 ;window caption +capt db 'info 3ds version 02.12.15',0 ;window caption end if align 16 @@ -1532,6 +1562,7 @@ i_end: color_bk rd 3 color_vert rd 1 color_face rd 1 + color_select rd 1 rb 2048 align 16 thread_coords: diff --git a/programs/develop/info3ds/info3ds.ini b/programs/develop/info3ds/info3ds.ini index 19939bb370..5f2afe1614 100644 --- a/programs/develop/info3ds/info3ds.ini +++ b/programs/develop/info3ds/info3ds.ini @@ -1,11 +1,12 @@ [Window 3d] draw_vertices=1 draw_faces=1 -draw_faces_fill=0 -draw_light=0 +draw_faces_fill=0 ;заливка граней (0-выкл., 1-вкл.) +draw_light=0 ;освещение (0-выкл., 1-вкл.) col_ox=255,0,0 col_oy=0,0,255 col_oz=0,255,0 -col_bkgnd=0,32,64 -col_vertices=255,255,255 -col_faces=128,192,192 +col_bkgnd=0,32,64 ;цвет фона +col_vertices=255,255,255 ;цвет вершин +col_faces=128,192,192 ;цвет граней +col_select=255,255,0 ;цвет выделенных точек diff --git a/programs/develop/info3ds/info_menu.inc b/programs/develop/info3ds/info_menu.inc index b1b20448b3..7d339eaec6 100644 --- a/programs/develop/info3ds/info_menu.inc +++ b/programs/develop/info3ds/info_menu.inc @@ -1 +1 @@ - if lang eq ru sz_main_menu_View db 'Вид', 0 sz_main_menu_Veiw_Vertexes db 'Вершины вкл./выкл.', 0 sz_main_menu_Veiw_Faces db 'Грани вкл./выкл.', 0 sz_main_menu_Veiw_Faces_Fill db 'Заливка граней вкл./выкл.', 0 sz_main_menu_Veiw_Light db 'Свет вкл./выкл.', 0 sz_main_menu_Veiw_Reset db 'Сброс настроек', 0 else sz_main_menu_View db 'View', 0 sz_main_menu_Veiw_Vertexes db 'Vertexes on/off', 0 sz_main_menu_Veiw_Faces db 'Faces on/off', 0 sz_main_menu_Veiw_Faces_Fill db 'Faces fill on/off', 0 sz_main_menu_Veiw_Light db 'Light on/off', 0 sz_main_menu_Veiw_Reset db 'Reset settings', 0 end if main_menu dd 0 main_menu_file dd 0 main_menu_view dd 0 KMENUITEM_NORMAL equ 0 KMENUITEM_SUBMENU equ 1 KMENUITEM_SEPARATOR equ 2 \ No newline at end of file + if lang eq ru sz_main_menu_View db 'Вид', 0 sz_main_menu_Veiw_Vertexes db 'Вершины вкл./выкл.', 0 sz_main_menu_Veiw_Faces db 'Грани вкл./выкл.', 0 sz_main_menu_Veiw_Faces_Fill db 'Заливка граней вкл./выкл.', 0 sz_main_menu_Veiw_Light db 'Свет вкл./выкл.', 0 sz_main_menu_Veiw_Reset db 'Сброс настроек', 0 sz_main_menu_Vertexes db 'Вершины', 0 sz_main_menu_Vertexes_Select db 'Выделить вершину', 0 sz_main_menu_Vertexes_Deselect db 'Отменить всё выделение', 0 sz_main_menu_Average_x db 'Среднее x',0 sz_main_menu_Average_y db 'Среднее y',0 sz_main_menu_Average_z db 'Среднее z',0 else sz_main_menu_View db 'View', 0 sz_main_menu_Veiw_Vertexes db 'Vertexes on/off', 0 sz_main_menu_Veiw_Faces db 'Faces on/off', 0 sz_main_menu_Veiw_Faces_Fill db 'Faces fill on/off', 0 sz_main_menu_Veiw_Light db 'Light on/off', 0 sz_main_menu_Veiw_Reset db 'Reset settings', 0 sz_main_menu_Vertexes db 'Vertexes', 0 sz_main_menu_Vertexes_Select db 'Select vertex', 0 sz_main_menu_Vertexes_Deselect db 'Deselect all', 0 sz_main_menu_Average_x db 'Average x',0 sz_main_menu_Average_y db 'Average y',0 sz_main_menu_Average_z db 'Average z',0 end if main_menu dd 0 main_menu_file dd 0 main_menu_view dd 0 main_menu_vertexes dd 0 KMENUITEM_NORMAL equ 0 KMENUITEM_SUBMENU equ 1 KMENUITEM_SEPARATOR equ 2 \ No newline at end of file diff --git a/programs/develop/info3ds/info_wnd_coords.inc b/programs/develop/info3ds/info_wnd_coords.inc index 64c5de2a05..83d673db71 100644 --- a/programs/develop/info3ds/info_wnd_coords.inc +++ b/programs/develop/info3ds/info_wnd_coords.inc @@ -29,6 +29,7 @@ key_oz db 'col_oz',0 key_bk db 'col_bkgnd',0 key_vert db 'col_vertices',0 key_face db 'col_faces',0 +key_select db 'col_select',0 prop_wnd_run db 0 ;переменная следящая за тем что-бы не запускать больше 1-го окна со свойствами одновременно @@ -45,7 +46,13 @@ obj_point: ; .text: rb MAX_OBJECT_SIZE - +if lang eq ru +txt_select_vert: db 'Выбрано: ' +else +txt_select_vert: db 'Select: ' +end if +.count: +dq 0,0 ;даное окно (процесс) вызываеться функцией but_wnd_coords align 4 @@ -67,7 +74,7 @@ pushad cmp word[ebx],CHUNK_OBJBLOCK jne .end_oblo mov dword[capt_p],txt_4000 - call found_block_data + stdcall found_block_data, tree1 cmp eax,0 je .no_points mov esi,eax @@ -90,7 +97,7 @@ pushad cmp word[ebx],CHUNK_TRIMESH jne .end_trim mov dword[capt_p],txt_4100 - call found_block_data + stdcall found_block_data, tree1 cmp eax,0 je .no_points mov esi,eax @@ -117,7 +124,7 @@ pushad movzx edx,word[ebx+6] ;колличество точек add ebx,8 ;поиск данных для треугольков - call found_block_data + stdcall found_block_data, tree1 cmp eax,0 je .set_points mov esi,eax @@ -198,7 +205,7 @@ pushad stdcall str_cat, obj_point.text,esi stdcall str_cat, obj_point.text,Data_String loop @b - stdcall dword[tl_node_add], tree3,(ID_ICON_DATA shl 16),obj_point + stdcall dword[tl_node_add], tree3,(ID_ICON_POINT shl 16),obj_point stdcall dword[tl_cur_next], tree3 dec edx cmp edx,0 @@ -228,6 +235,11 @@ pushad and ebx,0x3f3f3f add eax,ebx mov [edit3.color],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 popad call prop_red_win @@ -318,6 +330,7 @@ prop_wnd_clear_param: ;обнуление указателей на данные объектов mov dword[obj_poi_data],0 mov dword[obj_poi_count],0 + mov dword[obj_poi_sel_c],0 mov dword[obj_tri_data],0 mov dword[obj_tri_count],0 ret @@ -328,24 +341,24 @@ prop_wnd_clear_param: ;output: ;eax - структура текущего узла (или 0 при неудаче) align 4 -found_block_data: -push ebx ecx +proc found_block_data uses ebx ecx edx, tlist:dword + mov edx,[tlist] mov ecx,eax - stdcall [tl_node_poi_get_info], tree1,0 + stdcall [tl_node_poi_get_info], edx,0 @@: mov ebx,eax - stdcall [tl_node_poi_get_data], tree1,ebx + stdcall [tl_node_poi_get_data], edx,ebx cmp eax,ecx je @f ;если попали на выбранный узел - stdcall [tl_node_poi_get_next_info], tree1,ebx + stdcall [tl_node_poi_get_next_info], edx,ebx cmp eax,0 jne @b jmp .end @@: mov eax,ebx .end: -pop ecx ebx ret +endp ;установка размеров объекта align 4 @@ -549,7 +562,7 @@ draw_3d: stdcall [glEnd] .end_points: - ;рисование выделенной точки + ;рисование активной точки stdcall [tl_node_get_data],tree3 cmp eax,0 je @f @@ -568,13 +581,38 @@ draw_3d: stdcall [glVertex3f], [eax],[eax+4],[obj_z_max] stdcall [glEnd] - stdcall [glColor3f], 1.0, 1.0, 0.0 + stdcall [glColor3ub],[color_select+2],[color_select+1],[color_select] stdcall [glPushMatrix] stdcall [glTranslatef], [eax],[eax+4],[eax+8] stdcall [gluSphere], [qObj], [sph_radius], 8,8 stdcall [glPopMatrix] @@: + ;рисование выделенных точек + cmp dword[obj_poi_sel_c],0 + 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 + @@: + cmp eax,0 + je .end_select + mov ebx,eax + cmp word[ebx],ID_ICON_POINT_SEL + jne .next_sel + stdcall [tl_node_poi_get_data], tree3,ebx + mov eax,[eax] + stdcall [glPushMatrix] + stdcall [glTranslatef], [eax],[eax+4],[eax+8] + stdcall [gluSphere], [qObj], [sph_radius], 4,4 + stdcall [glPopMatrix] + dec ecx + jz .end_select + .next_sel: + stdcall dword[tl_node_poi_get_next_info], tree3,ebx + jmp @b + .end_select: + ;рисование граней bt dword[draw_mode],bit_faces jnc .end_triangles @@ -614,6 +652,10 @@ draw_3d: .end_triangles: stdcall [glPopMatrix] + cmp dword[obj_poi_sel_c],0 + je @f + stdcall [buf2d_draw_text], buf_ogl, buf_1,txt_select_vert,5,3,[color_select] + @@: stdcall [kosglSwapBuffers] .end_f: ret @@ -849,6 +891,7 @@ prop_button: stdcall str_cat, obj_point.text,esi stdcall str_cat, obj_point.text,Data_String loop .coord + mov byte[obj_point.text],'*' ;отмечаем что вершина изменялась stdcall dword[tl_node_set_data], tree3,obj_point stdcall dword[tl_draw], tree3 mov byte[can_save],1 ;для показа кнопки 'Сохранить' @@ -883,6 +926,31 @@ prop_button: call mnu_reset_settings jmp prop_still.end @@: + cmp ah,10 + jne @f + call mnu_vertexes_select + jmp prop_still.end + @@: + cmp ah,11 + jne @f + call mnu_vertexes_deselect + jmp prop_still.end + @@: + cmp ah,12 + jne @f + call mnu_reset_average_x + jmp prop_still.end + @@: + cmp ah,13 + jne @f + call mnu_reset_average_y + jmp prop_still.end + @@: + cmp ah,14 + jne @f + call mnu_reset_average_z + jmp prop_still.end + @@: cmp ah,1 jne prop_still.end @@ -967,6 +1035,231 @@ mnu_reset_settings: m2m dword[draw_mode],dword[def_dr_mode] ret +align 4 +proc mnu_vertexes_select uses eax ebx + stdcall [tl_node_get_data],tree3 + cmp eax,0 + je .no_points + stdcall found_block_data,tree3 + cmp eax,0 + je .no_points + mov bx,word[eax] + cmp bx,ID_ICON_POINT_SEL + je @f + mov word[eax],ID_ICON_POINT_SEL + inc dword[obj_poi_sel_c] + jmp .change + @@: + mov word[eax],ID_ICON_POINT + dec dword[obj_poi_sel_c] + .change: + mov eax,[obj_poi_sel_c] + stdcall convert_int_to_str, txt_select_vert.count,16 + .no_points: + ret +endp + +align 4 +proc mnu_vertexes_deselect uses eax + cmp dword[obj_poi_sel_c],0 + je .no_points + mov dword[obj_poi_sel_c],0 + stdcall [tl_node_poi_get_info], tree3,0 + cmp eax,0 + je .no_points + @@: + mov word[eax],ID_ICON_POINT + stdcall [tl_node_poi_get_next_info], tree3,eax + cmp eax,0 + jne @b + .no_points: + ret +endp + +align 4 +proc mnu_reset_average_x uses eax ebx ecx edx edi + cmp dword[obj_poi_sel_c],2 + jl .end_select + finit + fldz + mov ecx,dword[obj_poi_sel_c] + stdcall dword[tl_node_poi_get_info], tree3,0 + @@: + cmp eax,0 + je .end_select + mov ebx,eax + cmp word[ebx],ID_ICON_POINT_SEL + jne .next_sel0 + stdcall [tl_node_poi_get_data], tree3,ebx + mov eax,[eax] + fadd dword[eax] + dec ecx + jz @f + .next_sel0: + stdcall dword[tl_node_poi_get_next_info], tree3,ebx + jmp @b + @@: + fidiv dword[obj_poi_sel_c] + fstp dword[eax] + mov edx,[eax] + mov ecx,dword[obj_poi_sel_c] + stdcall dword[tl_node_poi_get_info], tree3,0 + @@: + cmp eax,0 + je .end_select + mov ebx,eax + cmp word[ebx],ID_ICON_POINT_SEL + jne .next_sel1 + stdcall [tl_node_poi_get_data], tree3,ebx + mov edi,eax + mov eax,[eax] + mov [eax],edx + stdcall update_tree, edi + dec ecx + jz @f + .next_sel1: + stdcall dword[tl_node_poi_get_next_info], tree3,ebx + jmp @b + @@: + .end_select: + ret +endp + +align 4 +proc mnu_reset_average_y uses eax ebx ecx edx edi + cmp dword[obj_poi_sel_c],2 + jl .end_select + finit + fldz + mov ecx,dword[obj_poi_sel_c] + stdcall dword[tl_node_poi_get_info], tree3,0 + @@: + cmp eax,0 + je .end_select + mov ebx,eax + cmp word[ebx],ID_ICON_POINT_SEL + jne .next_sel0 + stdcall [tl_node_poi_get_data], tree3,ebx + mov eax,[eax] + fadd dword[eax+4] + dec ecx + jz @f + .next_sel0: + stdcall dword[tl_node_poi_get_next_info], tree3,ebx + jmp @b + @@: + fidiv dword[obj_poi_sel_c] + fstp dword[eax+4] + mov edx,[eax+4] + mov ecx,dword[obj_poi_sel_c] + stdcall dword[tl_node_poi_get_info], tree3,0 + @@: + cmp eax,0 + je .end_select + mov ebx,eax + cmp word[ebx],ID_ICON_POINT_SEL + jne .next_sel1 + stdcall [tl_node_poi_get_data], tree3,ebx + mov edi,eax + mov eax,[eax] + mov [eax+4],edx + stdcall update_tree, edi + dec ecx + jz @f + .next_sel1: + stdcall dword[tl_node_poi_get_next_info], tree3,ebx + jmp @b + @@: + .end_select: + ret +endp + +align 4 +proc mnu_reset_average_z uses eax ebx ecx edx edi + cmp dword[obj_poi_sel_c],2 + jl .end_select + finit + fldz + mov ecx,dword[obj_poi_sel_c] + stdcall dword[tl_node_poi_get_info], tree3,0 + @@: + cmp eax,0 + je .end_select + mov ebx,eax + cmp word[ebx],ID_ICON_POINT_SEL + jne .next_sel0 + stdcall [tl_node_poi_get_data], tree3,ebx + mov eax,[eax] + fadd dword[eax+8] + dec ecx + jz @f + .next_sel0: + stdcall dword[tl_node_poi_get_next_info], tree3,ebx + jmp @b + @@: + fidiv dword[obj_poi_sel_c] + fstp dword[eax+8] + mov edx,[eax+8] + mov ecx,dword[obj_poi_sel_c] + stdcall dword[tl_node_poi_get_info], tree3,0 + @@: + cmp eax,0 + je .end_select + mov ebx,eax + cmp word[ebx],ID_ICON_POINT_SEL + jne .next_sel1 + stdcall [tl_node_poi_get_data], tree3,ebx + mov edi,eax + mov eax,[eax] + mov [eax+8],edx + stdcall update_tree, edi + dec ecx + jz @f + .next_sel1: + stdcall dword[tl_node_poi_get_next_info], tree3,ebx + jmp @b + @@: + .end_select: + ret +endp + +align 4 +proc update_tree h_mem:dword +pushad + mov edi,[h_mem] + mov ebx,[edi] + finit + + ;обновление измененного узла в списке tree3 и главного окна (по таймеру) + mov word[NumberSymbolsAD],5 + mov dword[obj_point.text],0 + cld + mov ecx,3 + .coord: + fld dword[ebx] + fstp qword[Data_Double] + call DoubleFloat_to_String + add ebx,4 + stdcall str_len, Data_String + mov esi,txt_space + add esi,eax + cmp esi,txt_space.end + jl .normal_size + mov esi,txt_space.end-1 ;минимум 1 пробел нужно добавить, что-бы цифры не слипались + .normal_size: + stdcall str_cat, obj_point.text,esi + stdcall str_cat, obj_point.text,Data_String + loop .coord + mov esi,obj_point.text + mov byte[esi],'*' ;отмечаем что вершина изменялась + mov byte[can_save],1 ;для показа кнопки 'Сохранить' + add edi,4 + mov ecx,MAX_OBJECT_SIZE-4 + rep movsb +popad + ret +endp + align 4 def_dr_mode dd 0 ;режим рисования по умолчанию delt_size dd 3.0 ;изменение углов при поворотах с кливиатуры @@ -979,6 +1272,7 @@ angle_dym dd 1.3335 ;~ 3d_wnd_h/180 draw_mode dd 0 ;режим рисования объекта obj_poi_data dd 0 ;указатель на координаты вершин obj_poi_count dd 0 ;колличество вершин +obj_poi_sel_c dd 0 ;колличество выделенных вершин obj_tri_data dd 0 ;указатель на данные треугольников obj_tri_count dd 0 ;колличество треугольников cursor_last_draw dd 0 ;положение курсора при последней прорисовке 3d окна diff --git a/programs/develop/info3ds/objects.png b/programs/develop/info3ds/objects.png index ee77879da7..e35b9e8264 100644 Binary files a/programs/develop/info3ds/objects.png and b/programs/develop/info3ds/objects.png differ