Subversion Repositories Kolibri OS

Rev

Rev 5930 | Rev 5938 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
2165 IgorA 1
;
2
; в этом файле собраны функции нужные для создания и
5935 IgorA 3
; работы окна с координатами вершин
2165 IgorA 4
;
5
 
5930 IgorA 6
prop_wnd_width equ 340 ;ширина окна со свойствами объекта
7
prop_wnd_height equ 460
2165 IgorA 8
SIZE_ONE_FLOAT equ 14
9
MAX_OBJECT_SIZE equ (4+SIZE_ONE_FLOAT*3+1)
10
 
5935 IgorA 11
bit_vertexes equ 0
12
bit_faces equ 1
13
bit_faces_fill equ 2
14
bit_light equ 3
15
def_dr_mode equ 0x1111b
16
 
2165 IgorA 17
prop_wnd_run db 0 ;переменная следящая за тем что-бы не запускать больше 1-го окна со свойствами одновременно
18
 
2173 IgorA 19
txt_q db '?',0
2165 IgorA 20
txt_space:
21
	db SIZE_ONE_FLOAT dup(' ')
22
.end:
23
	db 0
24
 
5930 IgorA 25
rad_c dd 150 ;для вычисления радиуса
26
 
2165 IgorA 27
obj_point: ;добавляемый объект
28
	dd 0   ;указатель
29
.text:
30
	rb MAX_OBJECT_SIZE
31
 
32
 
33
 
34
;даное окно (процесс) вызываеться функцией but_wnd_coords
35
align 4
36
prop_start:
37
pushad
38
	mcall 40,0x27 ;маска ожидаемых событий
39
	inc byte[prop_wnd_run]
5930 IgorA 40
	mov dword[w_scr_t3.type],1
5935 IgorA 41
	call prop_wnd_clear_param
2165 IgorA 42
 
43
	stdcall [tl_node_get_data],tree1
44
	xor edx,edx
4332 IgorA 45
	mov dword[capt_p],txt_q
5911 IgorA 46
	cmp eax,0
4332 IgorA 47
	je .no_points
5935 IgorA 48
		mov ebx,[eax] ;получаем значение сдвига выбранного блока
49
		add ebx,[open_file_lif]
2165 IgorA 50
 
4332 IgorA 51
		cmp word[ebx],CHUNK_VERTLIST
5935 IgorA 52
		jne .end_vlist
4332 IgorA 53
			movzx edx,word[ebx+6] ;колличество точек
54
			add ebx,8
55
			mov dword[capt_p],txt_4110
5935 IgorA 56
			;поиск данных для треугольков
57
			mov ecx,eax
58
			stdcall [tl_node_poi_get_info], tree1,0
59
			@@:
60
				mov esi,eax
61
				stdcall [tl_node_poi_get_data], tree1,esi
62
				cmp eax,ecx
63
				je @f ;если попали на выбранный узел
64
				stdcall [tl_node_poi_get_next_info], tree1,esi
65
				cmp eax,0
66
				jne @b
67
				jmp .set_points
68
			@@:
69
			;если нашли выбранный узел, то далее пытаемся найти узел с треугольниками
70
			movzx ecx,byte[esi+2] ;cl - уровень выбранного узла
71
			.cycle_0:
72
				stdcall [tl_node_poi_get_next_info], tree1,esi
73
				cmp eax,0
74
				je .set_points
75
				mov esi,eax
76
				stdcall [tl_node_poi_get_data], tree1,esi
77
				cmp byte[esi+2],cl
78
				jl .set_points
79
				je .found
80
				jmp .cycle_0
81
			.found: ;если нашли узел тогоже уровня что и выбранный узел
82
				cmp eax,0
83
				je .set_points
84
				mov eax,[eax]
85
				add eax,[open_file_lif]
86
				cmp word[eax],CHUNK_FACELIST
87
				jne .cycle_0
88
				movzx ecx,word[eax+6]
89
				mov [obj_tri_count],ecx
90
				add eax,8 ;2+4+2 (chunk+size+count)
91
				mov [obj_tri_data],eax
92
			jmp .set_points
93
		.end_vlist:
94
		cmp word[ebx],CHUNK_TRACKPIVOT
4332 IgorA 95
		jne @f
96
			inc edx
97
			add ebx,6
98
			mov dword[capt_p],txt_b013
5935 IgorA 99
			jmp .set_points
4332 IgorA 100
		@@:
101
		cmp word[ebx],0xb014
102
		jne @f
103
			mov edx,2
104
			add ebx,6
105
			mov dword[capt_p],txt_b014
5935 IgorA 106
			;jmp .set_points
4332 IgorA 107
		@@:
5935 IgorA 108
		.set_points:
109
		mov [obj_poi_data],ebx
110
		mov [obj_poi_count],edx
4332 IgorA 111
	.no_points:
112
 
2165 IgorA 113
	;настройка списка объектов
114
	mov dword[tree3.info_max_count],2
115
	add dword[tree3.info_max_count],edx ;ставим число узлов, равное колличеству точек (+2 на начало и конец списка)
116
	stdcall dword[tl_data_init], tree3
117
	mov eax,dword[icon_tl_sys]
118
	mov dword[tree3.data_img_sys],eax
119
	mov eax,dword[icon_toolbar]
120
	mov dword[tree3.data_img],eax
121
 
4332 IgorA 122
	cmp edx,0
2165 IgorA 123
	je .no_object
2173 IgorA 124
		mov word[NumberSymbolsAD],5
2165 IgorA 125
		finit
126
		.new_point:
127
			mov dword[obj_point],ebx
128
			mov dword[obj_point.text],0
129
			cld
130
			mov ecx,3
131
			@@:
132
				fld dword[ebx]
133
				fstp qword[Data_Double]
134
				call DoubleFloat_to_String
135
				add ebx,4
136
				stdcall str_len, Data_String
137
				mov esi,txt_space
138
				add esi,eax
139
				cmp esi,txt_space.end
140
				jl .normal_size
141
					mov esi,txt_space.end-1 ;минимум 1 пробел нужно добавить, что-бы цифры не слипались
142
				.normal_size:
143
				stdcall str_cat, obj_point.text,esi
144
				stdcall str_cat, obj_point.text,Data_String
145
				loop @b
5911 IgorA 146
			stdcall dword[tl_node_add], tree3,(ID_ICON_DATA shl 16),obj_point
2165 IgorA 147
			stdcall dword[tl_cur_next], tree3
148
			dec edx
149
			cmp edx,0
150
			jg .new_point
151
			stdcall dword[tl_cur_beg], tree3
152
	.no_object:
5930 IgorA 153
	call obj_set_sizes
2173 IgorA 154
	edit_boxes_set_sys_color edit1,editboxes_end,sc ;установка системных цветов
155
	stdcall [edit_box_set_text], edit1, txt_q
156
	stdcall [edit_box_set_text], edit2, txt_q
157
	stdcall [edit_box_set_text], edit3, txt_q
2165 IgorA 158
popad
159
 
5930 IgorA 160
	call prop_red_win
161
 
162
;не отрывать эту функцию от предыдущей
2165 IgorA 163
align 4
5930 IgorA 164
prop_still:
165
	pushad
166
 
5935 IgorA 167
	mcall 23,10
168
	or eax,eax
169
	jnz @f
170
		call prop_timer_funct
171
		jmp .end
172
	@@:
173
 
5930 IgorA 174
	cmp al,1 ;изм. положение окна
175
	jne @f
176
		call prop_red_win
177
		jmp .end
178
	@@:
179
	cmp al,2
180
	jne @f
181
		call prop_key
182
		jmp .end
183
	@@:
184
	cmp al,3
185
	jz prop_button
186
	cmp al,6
187
	jne @f
188
		call prop_mouse
189
	@@:
190
.end:
191
	popad
192
	jmp prop_still
193
 
194
align 4
2165 IgorA 195
prop_red_win:
196
pushad
197
	mcall 12,1
198
 
199
	xor eax,eax
4332 IgorA 200
	mov edi,dword[capt_p] ;children window caption
2165 IgorA 201
	mov bx,word[procinfo.box.left]
202
	add bx,word[buf_0.l]
5930 IgorA 203
	add bx,5 ;ширина боковой рамки
2165 IgorA 204
	shl ebx,16
205
	mov bx,prop_wnd_width
206
	mov cx,word[procinfo.box.top]
2173 IgorA 207
	add cx,word[buf_0.t]
2165 IgorA 208
	shl ecx,16
5930 IgorA 209
	mov cx,prop_wnd_height
210
	mov edx,0xffffd0+0x33000000
2165 IgorA 211
	int 0x40
212
 
2173 IgorA 213
	mov esi,[sc.work_button]
5935 IgorA 214
	mcall 8, (5 shl 16)+20, (266 shl 16)+20, 3
215
	mcall , (30 shl 16)+20, (266 shl 16)+20, 4
2173 IgorA 216
 
217
	mov ebx,[image_data_toolbar]
218
	add ebx,4*IMAGE_TOOLBAR_ICON_SIZE
5935 IgorA 219
	mcall 7, , (16 shl 16)+16, (7 shl 16)+268 ;load
2173 IgorA 220
 
221
	sub ebx,IMAGE_TOOLBAR_ICON_SIZE
5935 IgorA 222
	mov edx,(32 shl 16)+268 ;save
2173 IgorA 223
	int 0x40
224
 
2165 IgorA 225
	mov dword[w_scr_t3.all_redraw],1
226
	stdcall [scrollbar_ver_draw],dword w_scr_t3
227
	stdcall [tl_draw], tree3
2173 IgorA 228
	stdcall [edit_box_draw], edit1
229
	stdcall [edit_box_draw], edit2
230
	stdcall [edit_box_draw], edit3
5930 IgorA 231
 
5935 IgorA 232
	stdcall [kmainmenu_draw], [main_menu]
5930 IgorA 233
	call draw_3d
2165 IgorA 234
	mcall 12,2
235
popad
5930 IgorA 236
	ret
2165 IgorA 237
 
5935 IgorA 238
;установка всех основных переменных по умолчанию
2165 IgorA 239
align 4
5935 IgorA 240
prop_wnd_clear_param:
241
	mov dword[angle_x],0.0
242
	mov dword[angle_y],0.0
243
	mov dword[angle_z],0.0
244
	mov dword[obj_poi_data],0
245
	mov dword[obj_poi_count],0
246
	mov dword[obj_tri_data],0
247
	mov dword[obj_tri_count],0
248
	mov dword[draw_mode],def_dr_mode
249
	ret
250
 
251
;установка размеров объекта
252
align 4
5930 IgorA 253
proc obj_set_sizes uses eax ebx esi
5935 IgorA 254
	cmp dword[obj_poi_count],0
5930 IgorA 255
	je .end
256
		finit
5935 IgorA 257
		mov eax,[obj_poi_data]
5930 IgorA 258
		mov ebx,dword[eax]
259
		mov [obj_x_min],ebx
260
		mov [obj_x_max],ebx
261
		mov ebx,dword[eax+4]
262
		mov [obj_y_min],ebx
263
		mov [obj_y_max],ebx
264
		mov ebx,dword[eax+8]
265
		mov [obj_z_min],ebx
266
		mov [obj_z_max],ebx
2165 IgorA 267
 
5935 IgorA 268
	mov ebx,[obj_poi_data]
269
	mov esi,[obj_poi_count]
5930 IgorA 270
align 4
271
	.cycle_0: ;работа с координатой x
272
		fld dword[ebx]
273
		fld dword[obj_x_min]
274
		fcomp
275
		fstsw ax
276
		sahf
277
		jb @f
278
			mov eax,[ebx]
279
			mov [obj_x_min],eax
280
			ffree st0
281
			fincstp
282
			jmp .next_x
283
		@@:
284
		fld dword[obj_x_max]
285
		fcompp
286
		fstsw ax
287
		sahf
288
		ja .next_x
289
			mov eax,[ebx]
290
			mov [obj_x_max],eax
291
		.next_x:
292
 
5935 IgorA 293
		add ebx,12
294
		dec esi
295
		jnz .cycle_0
5930 IgorA 296
 
297
		fld1
298
		fld dword[obj_x_max]
299
		fsub dword[obj_x_min]
300
		fst dword[obj_x_centr]
301
		fdivp ;1/size.x
302
		fstp dword[obj_x_scale]
303
 
304
		fld dword[obj_x_centr]
305
		fld1
306
		fld1
307
		faddp
308
		fdivp ;centr.x = size.x/2
309
		fadd dword[obj_x_min]
310
		fchs
311
		fstp dword[obj_x_centr]
312
 
5935 IgorA 313
	mov ebx,[obj_poi_data]
314
	mov esi,[obj_poi_count]
5930 IgorA 315
align 4
316
	.cycle_1: ;работа с координатой y
317
		fld dword[ebx+4]
318
		fld dword[obj_y_min]
319
		fcomp
320
		fstsw ax
321
		sahf
322
		jb @f
323
			mov eax,[ebx+4]
324
			mov [obj_y_min],eax
325
			ffree st0
326
			fincstp
327
			jmp .next_y
328
		@@:
329
		fld dword[obj_y_max]
330
		fcompp
331
		fstsw ax
332
		sahf
333
		ja .next_y
334
			mov eax,[ebx+4]
335
			mov [obj_y_max],eax
336
		.next_y:
337
 
5935 IgorA 338
		add ebx,12
339
		dec esi
340
		jnz .cycle_1
5930 IgorA 341
 
342
		fld1
343
		fld dword[obj_y_max]
344
		fsub dword[obj_y_min]
345
		fst dword[obj_y_centr]
346
		fdivp ;1/size.y
347
		fstp dword[obj_y_scale]
348
 
349
		fld dword[obj_y_centr]
350
		fld1
351
		fld1
352
		faddp
353
		fdivp ;centr.y = size.y/2
354
		fadd dword[obj_y_min]
355
		fchs
356
		fstp dword[obj_y_centr]
357
 
5935 IgorA 358
	mov ebx,[obj_poi_data]
359
	mov esi,[obj_poi_count]
5930 IgorA 360
align 4
361
	.cycle_2: ;работа с координатой z
362
		fld dword[ebx+8]
363
		fld dword[obj_z_min]
364
		fcomp
365
		fstsw ax
366
		sahf
367
		jb @f
368
			mov eax,[ebx+8]
369
			mov [obj_z_min],eax
370
			ffree st0
371
			fincstp
372
			jmp .next_z
373
		@@:
374
		fld dword[obj_z_max]
375
		fcompp
376
		fstsw ax
377
		sahf
378
		ja .next_z
379
			mov eax,[ebx+8]
380
			mov [obj_z_max],eax
381
		.next_z:
382
 
5935 IgorA 383
		add ebx,12
384
		dec esi
385
		jnz .cycle_2
5930 IgorA 386
 
387
		fld1
388
		fld dword[obj_z_max]
389
		fsub dword[obj_z_min]
390
		fst dword[obj_z_centr]
391
		fdivp ;1/size.z
392
		fstp dword[obj_z_scale]
393
 
394
		fld dword[obj_z_centr]
395
		fld1
396
		fld1
397
		faddp
398
		fdivp ;centr.z = size.z/2
399
		fadd dword[obj_z_min]
400
		fchs
401
		fstp dword[obj_z_centr]
402
 
403
		;находим радиус для сферы
404
		fld dword[obj_x_max]
405
		fsub dword[obj_x_min]
406
		fld dword[obj_y_max]
407
		fsub dword[obj_y_min]
408
		faddp
409
		fild dword[rad_c]
410
		fdivp ;radius=(size.x+size.y)/rad_c
411
		fstp dword[sph_radius]
412
	.end:
413
	ret
414
endp
415
 
416
;рисование точек в 3d
417
align 4
418
draw_3d:
5935 IgorA 419
	cmp dword[obj_poi_count],2
420
	jl .end_f
421
 
5930 IgorA 422
	stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;очистим буфер цвета и глубины
423
	stdcall [glPushMatrix]
5935 IgorA 424
	bt dword[draw_mode],bit_light
425
	jnc @f
426
		call SetLight
427
		jmp .end_l
428
	@@:
429
		stdcall [glDisable],GL_LIGHTING
430
	.end_l:
5930 IgorA 431
	stdcall [glTranslatef], 0.0,0.0,0.5 ;correct for z
432
	stdcall [glScalef], [obj_x_scale],[obj_y_scale],[obj_z_scale]
433
	stdcall [glScalef], 1.0,1.0,0.7 ;correct for z
434
	stdcall [glRotatef], [angle_z],0.0,0.0,1.0
435
	stdcall [glRotatef], [angle_y],0.0,1.0,0.0
436
	stdcall [glRotatef], [angle_x],1.0,0.0,0.0
437
	stdcall [glTranslatef], [obj_x_centr],[obj_y_centr],[obj_z_centr]
438
 
5935 IgorA 439
	;рисование точек
440
	bt dword[draw_mode],bit_vertexes
441
	jnc .end_points
442
		stdcall [glColor3f], 1.0,1.0,1.0
443
		stdcall [glBegin],GL_POINTS
444
		mov eax,[obj_poi_data]
445
		mov ebx,[obj_poi_count]
446
		@@:
447
			stdcall [glVertex3f], [eax],[eax+4],[eax+8]
448
			add eax,12
449
			dec ebx
450
			jnz @b
451
		stdcall [glEnd]
452
	.end_points:
5930 IgorA 453
 
5935 IgorA 454
	;рисование выделенной точки
5930 IgorA 455
	stdcall [tl_node_get_data],tree3
456
	cmp eax,0
457
	je @f
458
		;выделение активной точки
459
		mov eax,[eax]
460
 
461
		stdcall [glBegin],GL_LINES
462
		stdcall [glColor3f], 1.0, 0.0, 0.0
463
		stdcall [glVertex3f], [obj_x_min],[eax+4],[eax+8]
464
		stdcall [glVertex3f], [obj_x_max],[eax+4],[eax+8]
465
		stdcall [glColor3f], 0.0, 0.0, 1.0
466
		stdcall [glVertex3f], [eax],[obj_y_min],[eax+8]
467
		stdcall [glVertex3f], [eax],[obj_y_max],[eax+8]
468
		stdcall [glColor3f], 0.0, 1.0, 0.0
469
		stdcall [glVertex3f], [eax],[eax+4],[obj_z_min]
470
		stdcall [glVertex3f], [eax],[eax+4],[obj_z_max]
471
		stdcall [glEnd]
472
 
473
		stdcall [glColor3f], 1.0, 1.0, 0.0
5935 IgorA 474
		stdcall [glPushMatrix]
475
			stdcall [glTranslatef], [eax],[eax+4],[eax+8]
476
			stdcall [gluSphere], [qObj], [sph_radius], 8,8
477
		stdcall [glPopMatrix]
5930 IgorA 478
	@@:
479
 
5935 IgorA 480
	;рисование граней
481
	bt dword[draw_mode],bit_faces
482
	jnc .end_triangles
483
	cmp dword[obj_tri_count],0
484
	je .end_triangles
485
	cmp dword[obj_poi_count],0
486
	je .end_triangles
487
		stdcall [glColor3f], 0.5,0.5,0.5
488
		;bt dword[draw_mode],bit_faces_fill
489
		;jnc @f
490
		;@@:
491
		stdcall [glBegin],GL_TRIANGLES
492
		mov eax,[obj_tri_data]
493
		mov ecx,[obj_tri_count]
494
		@@:
495
			movzx ebx,word[eax] ;1-я вершина
496
			imul ebx,12
497
			add ebx,[obj_poi_data]
498
			stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
499
			movzx ebx,word[eax+2] ;2-я вершина
500
			imul ebx,12
501
			add ebx,[obj_poi_data]
502
			stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
503
			movzx ebx,word[eax+4] ;3-я вершина
504
			imul ebx,12
505
			add ebx,[obj_poi_data]
506
			stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
507
			add eax,8 ;размер треугольника = (3 вершины (по 2б) + свойства (2б))
508
			dec ecx
509
			jnz @b
510
		stdcall [glEnd]
511
	.end_triangles:
512
 
5930 IgorA 513
	stdcall [glPopMatrix]
514
	stdcall [kosglSwapBuffers]
5935 IgorA 515
	.end_f:
5930 IgorA 516
	ret
517
 
2165 IgorA 518
align 4
5935 IgorA 519
SetLight:
520
	stdcall [glLightfv], GL_LIGHT0, GL_POSITION, light_position
521
	stdcall [glLightfv], GL_LIGHT0, GL_SPOT_DIRECTION, light_dir
522
 
523
	stdcall [glLightfv], GL_LIGHT0, GL_DIFFUSE, white_light
524
	stdcall [glLightfv], GL_LIGHT0, GL_SPECULAR, white_light
525
 
526
	stdcall [glEnable], GL_COLOR_MATERIAL
527
	stdcall [glColorMaterial], GL_FRONT, GL_AMBIENT_AND_DIFFUSE
528
	stdcall [glMaterialfv], GL_FRONT, GL_SPECULAR, mat_specular
529
	stdcall [glMaterialf], GL_FRONT, GL_SHININESS, mat_shininess
530
	stdcall [glLightModelfv], GL_LIGHT_MODEL_AMBIENT, lmodel_ambient
531
 
532
	stdcall [glEnable],GL_LIGHTING
533
	stdcall [glEnable],GL_LIGHT0
534
	ret
535
 
536
align 4
537
proc prop_key uses eax ebx
2165 IgorA 538
	mcall 2
5930 IgorA 539
 
540
	test word [edit1.flags],10b ;ed_focus
541
	je @f
542
		stdcall [edit_box_key], edit1
543
		jmp .end
544
	@@:
545
	test word [edit2.flags],10b
546
	je @f
547
		stdcall [edit_box_key], edit2
548
		jmp .end
549
	@@:
550
	test word [edit3.flags],10b
551
	je @f
552
		stdcall [edit_box_key], edit3
553
		jmp .end
554
	@@:
5935 IgorA 555
	cmp dword[el_focus], tree3
556
	jne @f
557
		stdcall [tl_key], tree3
558
		jmp .end
559
	@@:
5930 IgorA 560
 
561
	cmp ah,178 ;Up
562
	jne @f
563
		fld dword[angle_x]
564
		fadd dword[delt_size]
565
		fstp dword[angle_x]
566
		call draw_3d
567
		jmp .end
568
	@@:
569
	cmp ah,177 ;Down
570
	jne @f
571
		fld dword[angle_x]
572
		fsub dword[delt_size]
573
		fstp dword[angle_x]
574
		call draw_3d
575
		jmp .end
576
	@@:
577
	cmp ah,176 ;Left
578
	jne @f
579
		fld dword[angle_y]
580
		fadd dword[delt_size]
581
		fstp dword[angle_y]
582
		call draw_3d
583
		jmp .end
584
	@@:
585
	cmp ah,179 ;Right
586
	jne @f
587
		fld dword[angle_y]
588
		fsub dword[delt_size]
589
		fstp dword[angle_y]
590
		call draw_3d
591
		;jmp .end
592
	@@:
593
	.end:
2165 IgorA 594
	ret
5935 IgorA 595
endp
2165 IgorA 596
 
597
align 4
598
prop_mouse:
599
	;push ecx edi
5935 IgorA 600
	stdcall [kmainmenu_dispatch_cursorevent], [main_menu]
2165 IgorA 601
	stdcall [tl_mouse], tree3
2173 IgorA 602
	stdcall [edit_box_mouse], edit1
603
	stdcall [edit_box_mouse], edit2
604
	stdcall [edit_box_mouse], edit3
2165 IgorA 605
	;pop edi ecx
606
	ret
607
 
608
align 4
609
prop_button:
610
	mcall 17 ;получить код нажатой кнопки
611
 
2173 IgorA 612
	cmp ah,3
2165 IgorA 613
	jne @f
5930 IgorA 614
		call get_point_coords
615
		call draw_3d
616
		jmp prop_still.end
2165 IgorA 617
	@@:
2173 IgorA 618
	cmp ah,4
619
	jne @f
5911 IgorA 620
		push eax ebx ecx edi esi
2173 IgorA 621
		stdcall [tl_node_get_data],tree3
5911 IgorA 622
		cmp eax,0
2173 IgorA 623
		je .no_select_1
5911 IgorA 624
			mov ebx,[eax]
2173 IgorA 625
			finit
2165 IgorA 626
 
2173 IgorA 627
			mov esi,string1
628
			mov edi,Data_String
629
			cld
5930 IgorA 630
			mov ecx,8
631
			rep movsd
2173 IgorA 632
			call String_to_DoubleFloat
633
			fld  qword[Data_Double] ;считываем как double
634
			fstp dword[ebx] ;сохраняем как float
635
 
636
			mov esi,string2
637
			mov edi,Data_String
638
			cld
5930 IgorA 639
			mov ecx,8
640
			rep movsd
2173 IgorA 641
			call String_to_DoubleFloat
642
			fld  qword[Data_Double] ;считываем как double
643
			fstp dword[ebx+4] ;сохраняем как float
644
 
645
			mov esi,string3
646
			mov edi,Data_String
647
			cld
5930 IgorA 648
			mov ecx,8
649
			rep movsd
2173 IgorA 650
			call String_to_DoubleFloat
651
			fld  qword[Data_Double] ;считываем как double
652
			fstp dword[ebx+8] ;сохраняем как float
653
 
654
			;обновление измененного узла в списке tree3 и главного окна (по таймеру)
655
			mov word[NumberSymbolsAD],5
656
			mov dword[obj_point],ebx
657
			mov dword[obj_point.text],0
658
			cld
659
			mov ecx,3
660
			.coord:
661
				fld dword[ebx]
662
				fstp qword[Data_Double]
663
				call DoubleFloat_to_String
664
				add ebx,4
665
				stdcall str_len, Data_String
666
				mov esi,txt_space
667
				add esi,eax
668
				cmp esi,txt_space.end
669
				jl .normal_size
670
					mov esi,txt_space.end-1 ;минимум 1 пробел нужно добавить, что-бы цифры не слипались
671
				.normal_size:
672
				stdcall str_cat, obj_point.text,esi
673
				stdcall str_cat, obj_point.text,Data_String
674
				loop .coord
5911 IgorA 675
			stdcall dword[tl_node_set_data], tree3,obj_point
2173 IgorA 676
			stdcall dword[tl_draw], tree3
677
			mov byte[can_save],1 ;для показа кнопки 'Сохранить'
678
			mov dword[offs_last_timer],0 ;для обновления блока в таймере
5930 IgorA 679
			call draw_3d
2173 IgorA 680
		.no_select_1:
5911 IgorA 681
		pop esi edi ecx ebx eax
5930 IgorA 682
		jmp prop_still.end
2173 IgorA 683
	@@:
5935 IgorA 684
	cmp ah,5
685
	jne @f
686
		call mnu_vertexes_on_off
687
		jmp prop_still.end
688
	@@:
689
	cmp ah,6
690
	jne @f
691
		call mnu_faces_on_off
692
		jmp prop_still.end
693
	@@:
694
	cmp ah,7
695
	jne @f
696
		call mnu_light_on_off
697
		jmp prop_still.end
698
	@@:
2173 IgorA 699
 
2165 IgorA 700
	cmp ah,1
5930 IgorA 701
	jne prop_still.end
2165 IgorA 702
.exit:
703
	mov dword[tree3.data_img],0 ;чистим указатели на иконки что-бы их не удалил деструктор
704
	mov dword[tree3.data_img_sys],0 ;т. к. они еще используються в других элементах
705
	stdcall dword[tl_data_clear], tree3
706
	mov byte[prop_wnd_run],0 ;обнуляем счетчик окон
707
	mcall -1 ;выход из программы
708
 
5930 IgorA 709
align 4
710
get_point_coords:
711
	;загрузка координат в editbox-ы
712
	push eax ebx
713
	stdcall [tl_node_get_data],tree3
714
	cmp eax,0
715
	je @f
716
		mov ebx,[eax]
717
		mov word[NumberSymbolsAD],8
718
		finit
719
		fld dword[ebx]
720
		fstp qword[Data_Double]
721
		call DoubleFloat_to_String
722
		stdcall [edit_box_set_text], edit1, Data_String
723
		fld dword[ebx+4]
724
		fstp qword[Data_Double]
725
		call DoubleFloat_to_String
726
		stdcall [edit_box_set_text], edit2, Data_String
727
		fld dword[ebx+8]
728
		fstp qword[Data_Double]
729
		call DoubleFloat_to_String
730
		stdcall [edit_box_set_text], edit3, Data_String
731
		stdcall [edit_box_draw], edit1
732
		stdcall [edit_box_draw], edit2
733
		stdcall [edit_box_draw], edit3
734
	@@:
735
	pop ebx eax
736
	ret
737
 
738
align 4
5935 IgorA 739
proc prop_timer_funct uses eax
740
	;просматриваем выделенную координату
741
	stdcall [tl_node_get_data],tree3
742
	cmp [cursor_last_draw],eax
743
	je @f
744
		mov [cursor_last_draw],eax
745
		call draw_3d
746
	@@:
747
	ret
748
endp
749
 
750
align 4
751
mnu_vertexes_on_off:
752
	xor dword[draw_mode], 1 shl bit_vertexes
753
	ret
754
 
755
align 4
756
mnu_faces_on_off:
757
	xor dword[draw_mode], 1 shl bit_faces
758
	ret
759
 
760
align 4
761
mnu_light_on_off:
762
	xor dword[draw_mode], 1 shl bit_light
763
	ret
764
 
765
align 4
766
draw_mode dd 0
767
obj_poi_data dd 0 ;указатель на координаты вершин
768
obj_poi_count dd 0 ;колличество вершин
769
obj_tri_data dd 0 ;указатель на данные треугольников
770
obj_tri_count dd 0 ;колличество треугольников
771
cursor_last_draw dd 0 ;положение курсора при последней прорисовке 3d окна
5930 IgorA 772
sph_radius dd 0 ;радиус сферы для выделения активной точки
773
obj_x_max dd 0
774
obj_x_min dd 0
775
obj_x_centr dd 0
776
obj_x_scale dd 1.0
777
obj_y_max dd 0
778
obj_y_min dd 0
779
obj_y_centr dd 0
780
obj_y_scale dd 1.0
781
obj_z_max dd 0
782
obj_z_min dd 0
783
obj_z_centr dd 0
784
obj_z_scale dd 1.0
785
 
4332 IgorA 786
capt_p dd 0
787
 
2165 IgorA 788
;дерево с объектами в пользовательском файле
5930 IgorA 789
tree3 tree_list MAX_OBJECT_SIZE,3, tl_key_no_edit+tl_list_box_mode,\
5935 IgorA 790
	16,16, 0xffffff,0xb0d0ff,0x400040, 5,290,303,140, 16, 4,0, el_focus,\
5930 IgorA 791
	w_scr_t3,get_point_coords
2165 IgorA 792
 
5935 IgorA 793
edit1 edit_box 80,  76, 269, 0xffd0d0, 0xff, 0x80ff, 0, 0x8000, 34, string1, mouse_dd, 0
794
edit2 edit_box 80, 160, 269, 0xd0d0ff, 0xff, 0x80ff, 0, 0x8000, 34, string2, mouse_dd, 0
795
edit3 edit_box 80, 244, 269, 0xd0ffd0, 0xff, 0x80ff, 0, 0x8000, 34, string3, mouse_dd, 0
2173 IgorA 796
editboxes_end:
797
 
798
string1 rb 34
799
string2 rb 34
800
string3 rb 34
801
 
2165 IgorA 802
align 4
5930 IgorA 803
w_scr_t3 scrollbar 16, 0,0,0, 15, 100,0,0, 0,0,0, 1