;
; ¢ í⮬ ä ©«¥ ᮡà ë äãªæ¨¨ ã¦ë¥ ¤«ï ᮧ¤ ¨ï ¨
; à ¡®âë ®ª á ª®®à¤¨ â ¬¨
;
prop_wnd_width equ 340 ;è¨à¨ ®ª ᮠ᢮©á⢠¬¨ ®¡ê¥ªâ
prop_wnd_height equ 460
SIZE_ONE_FLOAT equ 14
MAX_OBJECT_SIZE equ (4+SIZE_ONE_FLOAT*3+1)
prop_wnd_run db 0 ;¯¥à¥¬¥ ï á«¥¤ïé ï § ⥬ çâ®-¡ë ¥ § ¯ã᪠âì ¡®«ìè¥ 1-£® ®ª ᮠ᢮©á⢠¬¨ ®¤®¢à¥¬¥®
txt_q db '?',0
txt_space:
db SIZE_ONE_FLOAT dup(' ')
.end:
db 0
rad_c dd 150 ;¤«ï ¢ëç¨á«¥¨ï à ¤¨ãá
obj_point: ;¤®¡ ¢«ï¥¬ë© ®¡ê¥ªâ
dd 0 ;㪠§ ⥫ì
.text:
rb MAX_OBJECT_SIZE
;¤ ®¥ ®ª® (¯à®æ¥áá) ¢ë§ë¢ ¥âìáï äãªæ¨¥© but_wnd_coords
align 4
prop_start:
pushad
mcall 40,0x27 ;¬ ᪠®¦¨¤ ¥¬ëå ᮡë⨩
inc byte[prop_wnd_run]
mov dword[w_scr_t3.type],1
stdcall [tl_node_get_data],tree1
xor edx,edx
mov dword[capt_p],txt_q
cmp eax,0
je .no_points
mov ebx,dword[eax] ;¯®«ãç ¥¬ § 票¥ ᤢ¨£ ¢ë¡à ®£® ¡«®ª
add ebx,dword[open_file_lif]
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
add dword[tree3.info_max_count],edx ;áâ ¢¨¬ ç¨á«® 㧫®¢, à ¢®¥ ª®««¨ç¥áâ¢ã â®ç¥ª (+2 ç «® ¨ ª®¥æ ᯨ᪠)
stdcall dword[tl_data_init], tree3
mov eax,dword[icon_tl_sys]
mov dword[tree3.data_img_sys],eax
mov eax,dword[icon_toolbar]
mov dword[tree3.data_img],eax
cmp edx,0
je .no_object
mov word[NumberSymbolsAD],5
finit
.new_point:
mov dword[obj_point],ebx
mov dword[obj_point.text],0
cld
mov ecx,3
@@:
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 @b
stdcall dword[tl_node_add], tree3,(ID_ICON_DATA shl 16),obj_point
stdcall dword[tl_cur_next], tree3
dec edx
cmp edx,0
jg .new_point
stdcall dword[tl_cur_beg], tree3
.no_object:
call obj_set_sizes
edit_boxes_set_sys_color edit1,editboxes_end,sc ;ãáâ ®¢ª á¨á⥬ëå 梥⮢
stdcall [edit_box_set_text], edit1, txt_q
stdcall [edit_box_set_text], edit2, txt_q
stdcall [edit_box_set_text], edit3, txt_q
popad
call prop_red_win
;¥ ®âàë¢ âì íâã äãªæ¨î ®â ¯à¥¤ë¤ã饩
align 4
prop_still:
pushad
mcall 10
cmp al,1 ;¨§¬. ¯®«®¦¥¨¥ ®ª
jne @f
call prop_red_win
jmp .end
@@:
cmp al,2
jne @f
call prop_key
jmp .end
@@:
cmp al,3
jz prop_button
cmp al,6
jne @f
call prop_mouse
@@:
.end:
popad
jmp prop_still
align 4
prop_red_win:
pushad
mcall 12,1
xor eax,eax
mov edi,dword[capt_p] ;children window caption
mov bx,word[procinfo.box.left]
add bx,word[buf_0.l]
add bx,5 ;è¨à¨ ¡®ª®¢®© à ¬ª¨
shl ebx,16
mov bx,prop_wnd_width
mov cx,word[procinfo.box.top]
add cx,word[buf_0.t]
shl ecx,16
mov cx,prop_wnd_height
mov edx,0xffffd0+0x33000000
int 0x40
mov esi,[sc.work_button]
mcall 8, (5 shl 16)+20, (246 shl 16)+20, 3
mcall , (30 shl 16)+20, (246 shl 16)+20, 4
mov ebx,[image_data_toolbar]
add ebx,4*IMAGE_TOOLBAR_ICON_SIZE
mcall 7, , (16 shl 16)+16, (7 shl 16)+247 ;load
sub ebx,IMAGE_TOOLBAR_ICON_SIZE
mov edx,(32 shl 16)+247 ;save
int 0x40
mov dword[w_scr_t3.all_redraw],1
stdcall [scrollbar_ver_draw],dword w_scr_t3
stdcall [tl_draw], tree3
stdcall [edit_box_draw], edit1
stdcall [edit_box_draw], edit2
stdcall [edit_box_draw], edit3
call draw_3d
mcall 12,2
popad
ret
align 4
proc obj_set_sizes uses eax ebx esi
stdcall dword[tl_node_poi_get_info], tree3,0
cmp eax,0
je .end
stdcall [tl_node_poi_get_data], tree3,eax
finit
mov eax,[eax]
mov ebx,dword[eax]
mov [obj_x_min],ebx
mov [obj_x_max],ebx
mov ebx,dword[eax+4]
mov [obj_y_min],ebx
mov [obj_y_max],ebx
mov ebx,dword[eax+8]
mov [obj_z_min],ebx
mov [obj_z_max],ebx
stdcall dword[tl_node_poi_get_info], tree3,0
align 4
.cycle_0: ;à ¡®â á ª®®à¤¨ ⮩ x
mov esi,eax
stdcall [tl_node_poi_get_data], tree3,esi
mov ebx,[eax]
fld dword[ebx]
fld dword[obj_x_min]
fcomp
fstsw ax
sahf
jb @f
mov eax,[ebx]
mov [obj_x_min],eax
ffree st0
fincstp
jmp .next_x
@@:
fld dword[obj_x_max]
fcompp
fstsw ax
sahf
ja .next_x
mov eax,[ebx]
mov [obj_x_max],eax
.next_x:
stdcall dword[tl_node_poi_get_next_info], tree3,esi
cmp eax,0
jne .cycle_0
fld1
fld dword[obj_x_max]
fsub dword[obj_x_min]
fst dword[obj_x_centr]
fdivp ;1/size.x
fstp dword[obj_x_scale]
fld dword[obj_x_centr]
fld1
fld1
faddp
fdivp ;centr.x = size.x/2
fadd dword[obj_x_min]
fchs
fstp dword[obj_x_centr]
stdcall dword[tl_node_poi_get_info], tree3,0
align 4
.cycle_1: ;à ¡®â á ª®®à¤¨ ⮩ y
mov esi,eax
stdcall [tl_node_poi_get_data], tree3,esi
mov ebx,[eax]
fld dword[ebx+4]
fld dword[obj_y_min]
fcomp
fstsw ax
sahf
jb @f
mov eax,[ebx+4]
mov [obj_y_min],eax
ffree st0
fincstp
jmp .next_y
@@:
fld dword[obj_y_max]
fcompp
fstsw ax
sahf
ja .next_y
mov eax,[ebx+4]
mov [obj_y_max],eax
.next_y:
stdcall dword[tl_node_poi_get_next_info], tree3,esi
cmp eax,0
jne .cycle_1
fld1
fld dword[obj_y_max]
fsub dword[obj_y_min]
fst dword[obj_y_centr]
fdivp ;1/size.y
fstp dword[obj_y_scale]
fld dword[obj_y_centr]
fld1
fld1
faddp
fdivp ;centr.y = size.y/2
fadd dword[obj_y_min]
fchs
fstp dword[obj_y_centr]
stdcall dword[tl_node_poi_get_info], tree3,0
align 4
.cycle_2: ;à ¡®â á ª®®à¤¨ ⮩ z
mov esi,eax
stdcall [tl_node_poi_get_data], tree3,esi
mov ebx,[eax]
fld dword[ebx+8]
fld dword[obj_z_min]
fcomp
fstsw ax
sahf
jb @f
mov eax,[ebx+8]
mov [obj_z_min],eax
ffree st0
fincstp
jmp .next_z
@@:
fld dword[obj_z_max]
fcompp
fstsw ax
sahf
ja .next_z
mov eax,[ebx+8]
mov [obj_z_max],eax
.next_z:
stdcall dword[tl_node_poi_get_next_info], tree3,esi
cmp eax,0
jne .cycle_2
fld1
fld dword[obj_z_max]
fsub dword[obj_z_min]
fst dword[obj_z_centr]
fdivp ;1/size.z
fstp dword[obj_z_scale]
fld dword[obj_z_centr]
fld1
fld1
faddp
fdivp ;centr.z = size.z/2
fadd dword[obj_z_min]
fchs
fstp dword[obj_z_centr]
; 室¨¬ à ¤¨ãá ¤«ï áä¥àë
fld dword[obj_x_max]
fsub dword[obj_x_min]
fld dword[obj_y_max]
fsub dword[obj_y_min]
faddp
fild dword[rad_c]
fdivp ;radius=(size.x+size.y)/rad_c
fstp dword[sph_radius]
.end:
ret
endp
;à¨á®¢ ¨¥ â®ç¥ª ¢ 3d
align 4
draw_3d:
stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;®ç¨á⨬ ¡ãä¥à 梥⠨ £«ã¡¨ë
stdcall [glPushMatrix]
stdcall [glTranslatef], 0.0,0.0,0.5 ;correct for z
stdcall [glScalef], [obj_x_scale],[obj_y_scale],[obj_z_scale]
stdcall [glScalef], 1.0,1.0,0.7 ;correct for z
stdcall [glRotatef], [angle_z],0.0,0.0,1.0
stdcall [glRotatef], [angle_y],0.0,1.0,0.0
stdcall [glRotatef], [angle_x],1.0,0.0,0.0
stdcall [glTranslatef], [obj_x_centr],[obj_y_centr],[obj_z_centr]
stdcall [glColor3f], 1.0,1.0,1.0
stdcall [glBegin],GL_POINTS
stdcall dword[tl_node_poi_get_info], tree3,0
@@:
cmp eax,0
je @f
mov esi,eax
stdcall [tl_node_poi_get_data], tree3,esi
mov eax,[eax]
stdcall [glVertex3f], [eax],[eax+4],[eax+8]
stdcall dword[tl_node_poi_get_next_info], tree3,esi
jmp @b
@@:
stdcall [glEnd]
stdcall [tl_node_get_data],tree3
cmp eax,0
je @f
;¢ë¤¥«¥¨¥ ªâ¨¢®© â®çª¨
mov eax,[eax]
stdcall [glBegin],GL_LINES
stdcall [glColor3f], 1.0, 0.0, 0.0
stdcall [glVertex3f], [obj_x_min],[eax+4],[eax+8]
stdcall [glVertex3f], [obj_x_max],[eax+4],[eax+8]
stdcall [glColor3f], 0.0, 0.0, 1.0
stdcall [glVertex3f], [eax],[obj_y_min],[eax+8]
stdcall [glVertex3f], [eax],[obj_y_max],[eax+8]
stdcall [glColor3f], 0.0, 1.0, 0.0
stdcall [glVertex3f], [eax],[eax+4],[obj_z_min]
stdcall [glVertex3f], [eax],[eax+4],[obj_z_max]
stdcall [glEnd]
stdcall [glColor3f], 1.0, 1.0, 0.0
stdcall [glTranslatef], [eax],[eax+4],[eax+8]
stdcall [gluSphere], [qObj], [sph_radius], 8,8
@@:
stdcall [glPopMatrix]
stdcall [kosglSwapBuffers]
ret
align 4
prop_key:
push eax
mcall 2
test word [edit1.flags],10b ;ed_focus
je @f
stdcall [edit_box_key], edit1
jmp .end
@@:
test word [edit2.flags],10b
je @f
stdcall [edit_box_key], edit2
jmp .end
@@:
test word [edit3.flags],10b
je @f
stdcall [edit_box_key], edit3
jmp .end
@@:
stdcall [tl_key], tree3
cmp ah,178 ;Up
jne @f
fld dword[angle_x]
fadd dword[delt_size]
fstp dword[angle_x]
call draw_3d
jmp .end
@@:
cmp ah,177 ;Down
jne @f
fld dword[angle_x]
fsub dword[delt_size]
fstp dword[angle_x]
call draw_3d
jmp .end
@@:
cmp ah,176 ;Left
jne @f
fld dword[angle_y]
fadd dword[delt_size]
fstp dword[angle_y]
call draw_3d
jmp .end
@@:
cmp ah,179 ;Right
jne @f
fld dword[angle_y]
fsub dword[delt_size]
fstp dword[angle_y]
call draw_3d
;jmp .end
@@:
.end:
pop eax
ret
align 4
prop_mouse:
;push ecx edi
stdcall [tl_mouse], tree3
stdcall [edit_box_mouse], edit1
stdcall [edit_box_mouse], edit2
stdcall [edit_box_mouse], edit3
;pop edi ecx
ret
align 4
prop_button:
mcall 17 ;¯®«ãç¨âì ª®¤ ¦ ⮩ ª®¯ª¨
cmp ah,3
jne @f
call get_point_coords
call draw_3d
jmp prop_still.end
@@:
cmp ah,4
jne @f
push eax ebx ecx edi esi
stdcall [tl_node_get_data],tree3
cmp eax,0
je .no_select_1
mov ebx,[eax]
finit
mov esi,string1
mov edi,Data_String
cld
mov ecx,8
rep movsd
call String_to_DoubleFloat
fld qword[Data_Double] ;áç¨âë¢ ¥¬ ª ª double
fstp dword[ebx] ;á®åà 塞 ª ª float
mov esi,string2
mov edi,Data_String
cld
mov ecx,8
rep movsd
call String_to_DoubleFloat
fld qword[Data_Double] ;áç¨âë¢ ¥¬ ª ª double
fstp dword[ebx+4] ;á®åà 塞 ª ª float
mov esi,string3
mov edi,Data_String
cld
mov ecx,8
rep movsd
call String_to_DoubleFloat
fld qword[Data_Double] ;áç¨âë¢ ¥¬ ª ª double
fstp dword[ebx+8] ;á®åà 塞 ª ª float
;®¡®¢«¥¨¥ ¨§¬¥¥®£® 㧫 ¢ ᯨ᪥ tree3 ¨ £« ¢®£® ®ª (¯® â ©¬¥àã)
mov word[NumberSymbolsAD],5
mov dword[obj_point],ebx
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
stdcall dword[tl_node_set_data], tree3,obj_point
stdcall dword[tl_draw], tree3
mov byte[can_save],1 ;¤«ï ¯®ª § ª®¯ª¨ '®åà ¨âì'
mov dword[offs_last_timer],0 ;¤«ï ®¡®¢«¥¨ï ¡«®ª ¢ â ©¬¥à¥
call draw_3d
.no_select_1:
pop esi edi ecx ebx eax
jmp prop_still.end
@@:
cmp ah,1
jne prop_still.end
.exit:
mov dword[tree3.data_img],0 ;ç¨á⨬ 㪠§ ⥫¨ ¨ª®ª¨ çâ®-¡ë ¨å ¥ 㤠«¨« ¤¥áâàãªâ®à
mov dword[tree3.data_img_sys],0 ;â. ª. ®¨ ¥é¥ ¨á¯®«ì§ãîâìáï ¢ ¤à㣨å í«¥¬¥â å
stdcall dword[tl_data_clear], tree3
mov byte[prop_wnd_run],0 ;®¡ã«ï¥¬ áç¥â稪 ®ª®
mcall -1 ;¢ë室 ¨§ ¯à®£à ¬¬ë
align 4
get_point_coords:
;§ £à㧪 ª®®à¤¨ â ¢ editbox-ë
push eax ebx
stdcall [tl_node_get_data],tree3
cmp eax,0
je @f
mov ebx,[eax]
mov word[NumberSymbolsAD],8
finit
fld dword[ebx]
fstp qword[Data_Double]
call DoubleFloat_to_String
stdcall [edit_box_set_text], edit1, Data_String
fld dword[ebx+4]
fstp qword[Data_Double]
call DoubleFloat_to_String
stdcall [edit_box_set_text], edit2, Data_String
fld dword[ebx+8]
fstp qword[Data_Double]
call DoubleFloat_to_String
stdcall [edit_box_set_text], edit3, Data_String
stdcall [edit_box_draw], edit1
stdcall [edit_box_draw], edit2
stdcall [edit_box_draw], edit3
@@:
pop ebx eax
ret
align 4
sph_radius dd 0 ;à ¤¨ãá áä¥àë ¤«ï ¢ë¤¥«¥¨ï ªâ¨¢®© â®çª¨
obj_x_max dd 0
obj_x_min dd 0
obj_x_centr dd 0
obj_x_scale dd 1.0
obj_y_max dd 0
obj_y_min dd 0
obj_y_centr dd 0
obj_y_scale dd 1.0
obj_z_max dd 0
obj_z_min dd 0
obj_z_centr dd 0
obj_z_scale dd 1.0
capt_p dd 0
;¤¥à¥¢® á ®¡ê¥ªâ ¬¨ ¢ ¯®«ì§®¢ ⥫ì᪮¬ ä ©«¥
tree3 tree_list MAX_OBJECT_SIZE,3, tl_key_no_edit+tl_list_box_mode,\
16,16, 0xffffff,0xb0d0ff,0x400040, 5,270,303,160, 16, 4,0, el_focus,\
w_scr_t3,get_point_coords
edit1 edit_box 80, 76, 249, 0xffd0d0, 0xff, 0x80ff, 0, 0x8000, 34, string1, mouse_dd, 0
edit2 edit_box 80, 160, 249, 0xd0d0ff, 0xff, 0x80ff, 0, 0x8000, 34, string2, mouse_dd, 0
edit3 edit_box 80, 244, 249, 0xd0ffd0, 0xff, 0x80ff, 0, 0x8000, 34, string3, mouse_dd, 0
editboxes_end:
string1 rb 34
string2 rb 34
string3 rb 34
align 4
w_scr_t3 scrollbar 16, 0,0,0, 15, 100,0,0, 0,0,0, 1