Subversion Repositories Kolibri OS

Rev

Rev 5944 | Rev 6022 | 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
 
5938 IgorA 6
prop_wnd_width  equ 340 ;ширина окна со свойствами объекта
7
prop_wnd_height equ 460 ;высота окна со свойствами объекта
8
3d_wnd_l equ   5 ;отступ для tinygl буфера слева
9
3d_wnd_t equ  23 ;отступ для tinygl буфера сверху
10
3d_wnd_w equ 320
11
3d_wnd_h equ 240
2165 IgorA 12
SIZE_ONE_FLOAT equ 14
13
MAX_OBJECT_SIZE equ (4+SIZE_ONE_FLOAT*3+1)
14
 
5935 IgorA 15
bit_vertexes equ 0
16
bit_faces equ 1
17
bit_faces_fill equ 2
18
bit_light equ 3
19
 
5938 IgorA 20
ini_name db 'info3ds.ini',0
21
ini_sec_w3d db 'Window 3d',0
22
key_dv  db 'draw_vertices',0
23
key_df  db 'draw_faces',0
24
key_dff db 'draw_faces_fill',0
25
key_dl  db 'draw_light',0
26
key_ox  db 'col_ox',0
27
key_oy  db 'col_oy',0
28
key_oz  db 'col_oz',0
29
key_bk  db 'col_bkgnd',0
30
key_vert db 'col_vertices',0
31
key_face db 'col_faces',0
5944 IgorA 32
key_select db 'col_select',0
5938 IgorA 33
 
2165 IgorA 34
prop_wnd_run db 0 ;переменная следящая за тем что-бы не запускать больше 1-го окна со свойствами одновременно
35
 
2173 IgorA 36
txt_q db '?',0
2165 IgorA 37
txt_space:
38
	db SIZE_ONE_FLOAT dup(' ')
39
.end:
40
	db 0
41
 
5930 IgorA 42
rad_c dd 150 ;для вычисления радиуса
43
 
2165 IgorA 44
obj_point: ;добавляемый объект
45
	dd 0   ;указатель
46
.text:
47
	rb MAX_OBJECT_SIZE
48
 
5944 IgorA 49
if lang eq ru
50
txt_select_vert: db 'Выбрано: '
51
else
52
txt_select_vert: db 'Select: '
53
end if
54
.count:
55
dq 0,0
2165 IgorA 56
 
57
;даное окно (процесс) вызываеться функцией but_wnd_coords
58
align 4
59
prop_start:
60
pushad
61
	mcall 40,0x27 ;маска ожидаемых событий
62
	inc byte[prop_wnd_run]
5930 IgorA 63
	mov dword[w_scr_t3.type],1
5935 IgorA 64
	call prop_wnd_clear_param
2165 IgorA 65
 
66
	stdcall [tl_node_get_data],tree1
67
	xor edx,edx
4332 IgorA 68
	mov dword[capt_p],txt_q
5911 IgorA 69
	cmp eax,0
4332 IgorA 70
	je .no_points
5935 IgorA 71
		mov ebx,[eax] ;получаем значение сдвига выбранного блока
5938 IgorA 72
		add ebx,[open_file_data]
2165 IgorA 73
 
5938 IgorA 74
		cmp word[ebx],CHUNK_OBJBLOCK
75
		jne .end_oblo
76
			mov dword[capt_p],txt_4000
5944 IgorA 77
			stdcall found_block_data, tree1
5938 IgorA 78
			cmp eax,0
79
			je .no_points
80
			mov esi,eax
81
			movzx ecx,byte[esi+2] ;cl - уровень выбранного узла
82
			.cycle_0:
83
				stdcall [tl_node_poi_get_next_info], tree1,esi
84
				cmp eax,0
85
				je .no_points
86
				cmp byte[eax+2],cl
87
				jle .no_points
88
				mov esi,eax
89
				stdcall [tl_node_poi_get_data], tree1,esi
90
				mov ebx,[eax]
91
				add ebx,[open_file_data]
92
				cmp word[ebx],CHUNK_VERTLIST
93
				je .ini_vlist
94
				jmp .cycle_0
95
			jmp .no_points
96
		.end_oblo:
97
		cmp word[ebx],CHUNK_TRIMESH
98
		jne .end_trim
99
			mov dword[capt_p],txt_4100
5944 IgorA 100
			stdcall found_block_data, tree1
5938 IgorA 101
			cmp eax,0
102
			je .no_points
103
			mov esi,eax
104
			movzx ecx,byte[esi+2] ;cl - уровень выбранного узла
105
			.cycle_1:
106
				stdcall [tl_node_poi_get_next_info], tree1,esi
107
				cmp eax,0
108
				je .no_points
109
				cmp byte[eax+2],cl
110
				jle .no_points
111
				mov esi,eax
112
				stdcall [tl_node_poi_get_data], tree1,esi
113
				mov ebx,[eax]
114
				add ebx,[open_file_data]
115
				cmp word[ebx],CHUNK_VERTLIST
116
				je .ini_vlist
117
				jmp .cycle_1
118
			jmp .no_points
119
		.end_trim:
4332 IgorA 120
		cmp word[ebx],CHUNK_VERTLIST
5935 IgorA 121
		jne .end_vlist
5938 IgorA 122
			mov dword[capt_p],txt_4110
123
			.ini_vlist:
4332 IgorA 124
			movzx edx,word[ebx+6] ;колличество точек
125
			add ebx,8
5935 IgorA 126
			;поиск данных для треугольков
5944 IgorA 127
			stdcall found_block_data, tree1
5938 IgorA 128
			cmp eax,0
129
			je .set_points
130
			mov esi,eax
5935 IgorA 131
			;если нашли выбранный узел, то далее пытаемся найти узел с треугольниками
132
			movzx ecx,byte[esi+2] ;cl - уровень выбранного узла
5938 IgorA 133
			.cycle_2:
5935 IgorA 134
				stdcall [tl_node_poi_get_next_info], tree1,esi
135
				cmp eax,0
136
				je .set_points
137
				mov esi,eax
138
				stdcall [tl_node_poi_get_data], tree1,esi
139
				cmp byte[esi+2],cl
140
				jl .set_points
141
				je .found
5938 IgorA 142
				jmp .cycle_2
5935 IgorA 143
			.found: ;если нашли узел тогоже уровня что и выбранный узел
144
				cmp eax,0
145
				je .set_points
146
				mov eax,[eax]
5938 IgorA 147
				add eax,[open_file_data]
5935 IgorA 148
				cmp word[eax],CHUNK_FACELIST
5938 IgorA 149
				jne .cycle_2
5935 IgorA 150
				movzx ecx,word[eax+6]
151
				mov [obj_tri_count],ecx
152
				add eax,8 ;2+4+2 (chunk+size+count)
153
				mov [obj_tri_data],eax
154
			jmp .set_points
155
		.end_vlist:
156
		cmp word[ebx],CHUNK_TRACKPIVOT
4332 IgorA 157
		jne @f
158
			inc edx
159
			add ebx,6
160
			mov dword[capt_p],txt_b013
5935 IgorA 161
			jmp .set_points
4332 IgorA 162
		@@:
163
		cmp word[ebx],0xb014
164
		jne @f
165
			mov edx,2
166
			add ebx,6
167
			mov dword[capt_p],txt_b014
5935 IgorA 168
			;jmp .set_points
4332 IgorA 169
		@@:
5935 IgorA 170
		.set_points:
171
		mov [obj_poi_data],ebx
172
		mov [obj_poi_count],edx
4332 IgorA 173
	.no_points:
174
 
2165 IgorA 175
	;настройка списка объектов
176
	mov dword[tree3.info_max_count],2
177
	add dword[tree3.info_max_count],edx ;ставим число узлов, равное колличеству точек (+2 на начало и конец списка)
178
	stdcall dword[tl_data_init], tree3
179
	mov eax,dword[icon_tl_sys]
180
	mov dword[tree3.data_img_sys],eax
181
	mov eax,dword[icon_toolbar]
182
	mov dword[tree3.data_img],eax
183
 
4332 IgorA 184
	cmp edx,0
2165 IgorA 185
	je .no_object
2173 IgorA 186
		mov word[NumberSymbolsAD],5
2165 IgorA 187
		finit
188
		.new_point:
189
			mov dword[obj_point],ebx
190
			mov dword[obj_point.text],0
191
			cld
192
			mov ecx,3
193
			@@:
194
				fld dword[ebx]
195
				fstp qword[Data_Double]
196
				call DoubleFloat_to_String
197
				add ebx,4
198
				stdcall str_len, Data_String
199
				mov esi,txt_space
200
				add esi,eax
201
				cmp esi,txt_space.end
202
				jl .normal_size
203
					mov esi,txt_space.end-1 ;минимум 1 пробел нужно добавить, что-бы цифры не слипались
204
				.normal_size:
205
				stdcall str_cat, obj_point.text,esi
206
				stdcall str_cat, obj_point.text,Data_String
207
				loop @b
5944 IgorA 208
			stdcall dword[tl_node_add], tree3,(ID_ICON_POINT shl 16),obj_point
2165 IgorA 209
			stdcall dword[tl_cur_next], tree3
210
			dec edx
211
			cmp edx,0
212
			jg .new_point
213
			stdcall dword[tl_cur_beg], tree3
214
	.no_object:
5930 IgorA 215
	call obj_set_sizes
2173 IgorA 216
	edit_boxes_set_sys_color edit1,editboxes_end,sc ;установка системных цветов
217
	stdcall [edit_box_set_text], edit1, txt_q
218
	stdcall [edit_box_set_text], edit2, txt_q
219
	stdcall [edit_box_set_text], edit3, txt_q
5938 IgorA 220
	mov eax,0xc0c0c0
221
	mov ebx,[color_ox]
222
	shr ebx,2
223
	and ebx,0x3f3f3f
224
	add eax,ebx
225
	mov [edit1.color],eax
226
	mov eax,0xc0c0c0
227
	mov ebx,[color_oy]
228
	shr ebx,2
229
	and ebx,0x3f3f3f
230
	add eax,ebx
231
	mov [edit2.color],eax
232
	mov eax,0xc0c0c0
233
	mov ebx,[color_oz]
234
	shr ebx,2
235
	and ebx,0x3f3f3f
236
	add eax,ebx
237
	mov [edit3.color],eax
5944 IgorA 238
 
239
	mov eax,dword[ctx1] ;eax -> TinyGLContext.GLContext
240
	mov eax,[eax] ;eax -> ZBuffer
241
	mov eax,[eax+offs_zbuf_pbuf] ;eax -> ZBuffer.pbuf
242
	mov dword[buf_ogl],eax
2165 IgorA 243
popad
244
 
5930 IgorA 245
	call prop_red_win
246
 
247
;не отрывать эту функцию от предыдущей
2165 IgorA 248
align 4
5930 IgorA 249
prop_still:
250
	pushad
251
 
5935 IgorA 252
	mcall 23,10
253
	or eax,eax
254
	jnz @f
255
		call prop_timer_funct
256
		jmp .end
257
	@@:
258
 
5930 IgorA 259
	cmp al,1 ;изм. положение окна
260
	jne @f
261
		call prop_red_win
262
		jmp .end
263
	@@:
264
	cmp al,2
265
	jne @f
266
		call prop_key
267
		jmp .end
268
	@@:
269
	cmp al,3
270
	jz prop_button
271
	cmp al,6
272
	jne @f
273
		call prop_mouse
274
	@@:
275
.end:
276
	popad
277
	jmp prop_still
278
 
279
align 4
2165 IgorA 280
prop_red_win:
281
pushad
282
	mcall 12,1
283
 
284
	xor eax,eax
4332 IgorA 285
	mov edi,dword[capt_p] ;children window caption
2165 IgorA 286
	mov bx,word[procinfo.box.left]
287
	add bx,word[buf_0.l]
5930 IgorA 288
	add bx,5 ;ширина боковой рамки
2165 IgorA 289
	shl ebx,16
290
	mov bx,prop_wnd_width
291
	mov cx,word[procinfo.box.top]
2173 IgorA 292
	add cx,word[buf_0.t]
2165 IgorA 293
	shl ecx,16
5930 IgorA 294
	mov cx,prop_wnd_height
5938 IgorA 295
	mov edx,[sc.work]
296
	or  edx,0x33000000
2165 IgorA 297
	int 0x40
298
 
2173 IgorA 299
	mov esi,[sc.work_button]
5935 IgorA 300
	mcall 8, (5 shl 16)+20, (266 shl 16)+20, 3
301
	mcall , (30 shl 16)+20, (266 shl 16)+20, 4
2173 IgorA 302
 
303
	mov ebx,[image_data_toolbar]
5938 IgorA 304
	add ebx,3*IMAGE_TOOLBAR_ICON_SIZE
5935 IgorA 305
	mcall 7, , (16 shl 16)+16, (7 shl 16)+268 ;load
2173 IgorA 306
 
307
	sub ebx,IMAGE_TOOLBAR_ICON_SIZE
5935 IgorA 308
	mov edx,(32 shl 16)+268 ;save
2173 IgorA 309
	int 0x40
310
 
2165 IgorA 311
	mov dword[w_scr_t3.all_redraw],1
312
	stdcall [scrollbar_ver_draw],dword w_scr_t3
313
	stdcall [tl_draw], tree3
2173 IgorA 314
	stdcall [edit_box_draw], edit1
315
	stdcall [edit_box_draw], edit2
316
	stdcall [edit_box_draw], edit3
5930 IgorA 317
 
5935 IgorA 318
	stdcall [kmainmenu_draw], [main_menu]
5930 IgorA 319
	call draw_3d
2165 IgorA 320
	mcall 12,2
321
popad
5930 IgorA 322
	ret
2165 IgorA 323
 
5935 IgorA 324
;установка всех основных переменных по умолчанию
2165 IgorA 325
align 4
5935 IgorA 326
prop_wnd_clear_param:
5938 IgorA 327
	;установка параметров отображения
328
	call mnu_reset_settings
329
 
330
	;обнуление указателей на данные объектов
5935 IgorA 331
	mov dword[obj_poi_data],0
332
	mov dword[obj_poi_count],0
5944 IgorA 333
	mov dword[obj_poi_sel_c],0
5935 IgorA 334
	mov dword[obj_tri_data],0
335
	mov dword[obj_tri_count],0
336
	ret
337
 
5938 IgorA 338
;поиск данных
339
;input:
340
;eax - текущий узел
341
;output:
342
;eax - структура текущего узла (или 0 при неудаче)
343
align 4
5944 IgorA 344
proc found_block_data uses ebx ecx edx, tlist:dword
345
	mov edx,[tlist]
5938 IgorA 346
	mov ecx,eax
5944 IgorA 347
	stdcall [tl_node_poi_get_info], edx,0
5938 IgorA 348
	@@:
349
		mov ebx,eax
5944 IgorA 350
		stdcall [tl_node_poi_get_data], edx,ebx
5938 IgorA 351
		cmp eax,ecx
352
		je @f ;если попали на выбранный узел
5944 IgorA 353
		stdcall [tl_node_poi_get_next_info], edx,ebx
5938 IgorA 354
		cmp eax,0
355
		jne @b
356
		jmp .end
357
	@@:
358
		mov eax,ebx
359
	.end:
360
	ret
5944 IgorA 361
endp
5938 IgorA 362
 
5935 IgorA 363
;установка размеров объекта
364
align 4
5930 IgorA 365
proc obj_set_sizes uses eax ebx esi
5935 IgorA 366
	cmp dword[obj_poi_count],0
5930 IgorA 367
	je .end
368
		finit
5935 IgorA 369
		mov eax,[obj_poi_data]
5930 IgorA 370
		mov ebx,dword[eax]
371
		mov [obj_x_min],ebx
372
		mov [obj_x_max],ebx
373
		mov ebx,dword[eax+4]
374
		mov [obj_y_min],ebx
375
		mov [obj_y_max],ebx
376
		mov ebx,dword[eax+8]
377
		mov [obj_z_min],ebx
378
		mov [obj_z_max],ebx
2165 IgorA 379
 
5935 IgorA 380
	mov ebx,[obj_poi_data]
381
	mov esi,[obj_poi_count]
5930 IgorA 382
align 4
383
	.cycle_0: ;работа с координатой x
384
		fld dword[ebx]
385
		fld dword[obj_x_min]
386
		fcomp
387
		fstsw ax
388
		sahf
389
		jb @f
390
			mov eax,[ebx]
391
			mov [obj_x_min],eax
392
			ffree st0
393
			fincstp
394
			jmp .next_x
395
		@@:
396
		fld dword[obj_x_max]
397
		fcompp
398
		fstsw ax
399
		sahf
400
		ja .next_x
401
			mov eax,[ebx]
402
			mov [obj_x_max],eax
403
		.next_x:
404
 
5935 IgorA 405
		add ebx,12
406
		dec esi
407
		jnz .cycle_0
5930 IgorA 408
 
409
		fld1
410
		fld dword[obj_x_max]
411
		fsub dword[obj_x_min]
412
		fst dword[obj_x_centr]
413
		fdivp ;1/size.x
414
		fstp dword[obj_x_scale]
415
 
416
		fld dword[obj_x_centr]
417
		fld1
418
		fld1
419
		faddp
420
		fdivp ;centr.x = size.x/2
421
		fadd dword[obj_x_min]
422
		fchs
423
		fstp dword[obj_x_centr]
424
 
5935 IgorA 425
	mov ebx,[obj_poi_data]
426
	mov esi,[obj_poi_count]
5930 IgorA 427
align 4
428
	.cycle_1: ;работа с координатой y
429
		fld dword[ebx+4]
430
		fld dword[obj_y_min]
431
		fcomp
432
		fstsw ax
433
		sahf
434
		jb @f
435
			mov eax,[ebx+4]
436
			mov [obj_y_min],eax
437
			ffree st0
438
			fincstp
439
			jmp .next_y
440
		@@:
441
		fld dword[obj_y_max]
442
		fcompp
443
		fstsw ax
444
		sahf
445
		ja .next_y
446
			mov eax,[ebx+4]
447
			mov [obj_y_max],eax
448
		.next_y:
449
 
5935 IgorA 450
		add ebx,12
451
		dec esi
452
		jnz .cycle_1
5930 IgorA 453
 
454
		fld1
455
		fld dword[obj_y_max]
456
		fsub dword[obj_y_min]
457
		fst dword[obj_y_centr]
458
		fdivp ;1/size.y
459
		fstp dword[obj_y_scale]
460
 
461
		fld dword[obj_y_centr]
462
		fld1
463
		fld1
464
		faddp
465
		fdivp ;centr.y = size.y/2
466
		fadd dword[obj_y_min]
467
		fchs
468
		fstp dword[obj_y_centr]
469
 
5935 IgorA 470
	mov ebx,[obj_poi_data]
471
	mov esi,[obj_poi_count]
5930 IgorA 472
align 4
473
	.cycle_2: ;работа с координатой z
474
		fld dword[ebx+8]
475
		fld dword[obj_z_min]
476
		fcomp
477
		fstsw ax
478
		sahf
479
		jb @f
480
			mov eax,[ebx+8]
481
			mov [obj_z_min],eax
482
			ffree st0
483
			fincstp
484
			jmp .next_z
485
		@@:
486
		fld dword[obj_z_max]
487
		fcompp
488
		fstsw ax
489
		sahf
490
		ja .next_z
491
			mov eax,[ebx+8]
492
			mov [obj_z_max],eax
493
		.next_z:
494
 
5935 IgorA 495
		add ebx,12
496
		dec esi
497
		jnz .cycle_2
5930 IgorA 498
 
499
		fld1
500
		fld dword[obj_z_max]
501
		fsub dword[obj_z_min]
502
		fst dword[obj_z_centr]
503
		fdivp ;1/size.z
504
		fstp dword[obj_z_scale]
505
 
506
		fld dword[obj_z_centr]
507
		fld1
508
		fld1
509
		faddp
510
		fdivp ;centr.z = size.z/2
511
		fadd dword[obj_z_min]
512
		fchs
513
		fstp dword[obj_z_centr]
514
 
515
		;находим радиус для сферы
516
		fld dword[obj_x_max]
517
		fsub dword[obj_x_min]
518
		fld dword[obj_y_max]
519
		fsub dword[obj_y_min]
520
		faddp
521
		fild dword[rad_c]
522
		fdivp ;radius=(size.x+size.y)/rad_c
523
		fstp dword[sph_radius]
5948 IgorA 524
 
525
	;делаем одинаковый масштаб по осям x и y, что-бы не нарушались пропорции изображения
526
	fld dword[obj_y_scale]
527
	fdiv dword[ratio] ;приведение масштаба по оси y учитывая что по высоте экран меньше
528
	fcomp dword[obj_x_scale]
529
	fstsw ax
530
	sahf
531
	jb @f
532
		;сжатие масштаба по y
533
		fld dword[obj_x_scale]
534
		fmul dword[ratio]
535
		fstp dword[obj_y_scale] ;масштаб по оси y = масштаб по оси x
536
		jmp .end
537
	@@:
538
		;сжатие масштаба по x >...<
539
		fld	dword[obj_x_scale]
540
		fdiv dword[ratio]
541
		fstp dword[obj_x_scale]
5930 IgorA 542
	.end:
543
	ret
544
endp
545
 
546
;рисование точек в 3d
547
align 4
548
draw_3d:
5935 IgorA 549
	cmp dword[obj_poi_count],2
550
	jl .end_f
5930 IgorA 551
	stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;очистим буфер цвета и глубины
552
	stdcall [glPushMatrix]
5935 IgorA 553
	bt dword[draw_mode],bit_light
554
	jnc @f
555
		call SetLight
556
		jmp .end_l
557
	@@:
558
		stdcall [glDisable],GL_LIGHTING
559
	.end_l:
5930 IgorA 560
	stdcall [glTranslatef], 0.0,0.0,0.5 ;correct for z
561
	stdcall [glScalef], [obj_x_scale],[obj_y_scale],[obj_z_scale]
562
	stdcall [glScalef], 1.0,1.0,0.7 ;correct for z
563
	stdcall [glRotatef], [angle_z],0.0,0.0,1.0
564
	stdcall [glRotatef], [angle_y],0.0,1.0,0.0
565
	stdcall [glRotatef], [angle_x],1.0,0.0,0.0
566
	stdcall [glTranslatef], [obj_x_centr],[obj_y_centr],[obj_z_centr]
567
 
5935 IgorA 568
	;рисование точек
569
	bt dword[draw_mode],bit_vertexes
570
	jnc .end_points
5938 IgorA 571
		stdcall [glColor3ub],[color_vert+2],[color_vert+1],[color_vert]
5935 IgorA 572
		stdcall [glBegin],GL_POINTS
573
		mov eax,[obj_poi_data]
574
		mov ebx,[obj_poi_count]
575
		@@:
576
			stdcall [glVertex3f], [eax],[eax+4],[eax+8]
577
			add eax,12
578
			dec ebx
579
			jnz @b
580
		stdcall [glEnd]
581
	.end_points:
5930 IgorA 582
 
5944 IgorA 583
	;рисование активной точки
5930 IgorA 584
	stdcall [tl_node_get_data],tree3
585
	cmp eax,0
586
	je @f
587
		;выделение активной точки
588
		mov eax,[eax]
589
 
590
		stdcall [glBegin],GL_LINES
5938 IgorA 591
		stdcall [glColor3ub],[color_ox+2],[color_ox+1],[color_ox]
5930 IgorA 592
		stdcall [glVertex3f], [obj_x_min],[eax+4],[eax+8]
593
		stdcall [glVertex3f], [obj_x_max],[eax+4],[eax+8]
5938 IgorA 594
		stdcall [glColor3ub],[color_oy+2],[color_oy+1],[color_oy]
5930 IgorA 595
		stdcall [glVertex3f], [eax],[obj_y_min],[eax+8]
596
		stdcall [glVertex3f], [eax],[obj_y_max],[eax+8]
5938 IgorA 597
		stdcall [glColor3ub],[color_oz+2],[color_oz+1],[color_oz]
5930 IgorA 598
		stdcall [glVertex3f], [eax],[eax+4],[obj_z_min]
599
		stdcall [glVertex3f], [eax],[eax+4],[obj_z_max]
600
		stdcall [glEnd]
601
 
5944 IgorA 602
		stdcall [glColor3ub],[color_select+2],[color_select+1],[color_select]
5935 IgorA 603
		stdcall [glPushMatrix]
604
			stdcall [glTranslatef], [eax],[eax+4],[eax+8]
605
			stdcall [gluSphere], [qObj], [sph_radius], 8,8
606
		stdcall [glPopMatrix]
5930 IgorA 607
	@@:
608
 
5944 IgorA 609
	;рисование выделенных точек
610
	cmp dword[obj_poi_sel_c],0
611
	je .end_select
612
		mov ecx,dword[obj_poi_sel_c]
613
		stdcall [glColor3ub],[color_select+2],[color_select+1],[color_select]
614
		stdcall dword[tl_node_poi_get_info], tree3,0
615
		@@:
616
			cmp eax,0
617
			je .end_select
618
			mov ebx,eax
619
			cmp word[ebx],ID_ICON_POINT_SEL
620
			jne .next_sel
621
			stdcall [tl_node_poi_get_data], tree3,ebx
622
			mov eax,[eax]
623
			stdcall [glPushMatrix]
624
				stdcall [glTranslatef], [eax],[eax+4],[eax+8]
625
				stdcall [gluSphere], [qObj], [sph_radius], 4,4
626
			stdcall [glPopMatrix]
627
			dec ecx
628
			jz .end_select
629
			.next_sel:
630
			stdcall dword[tl_node_poi_get_next_info], tree3,ebx
631
			jmp @b
632
    .end_select:
633
 
5935 IgorA 634
	;рисование граней
635
	bt dword[draw_mode],bit_faces
636
	jnc .end_triangles
637
	cmp dword[obj_tri_count],0
638
	je .end_triangles
639
	cmp dword[obj_poi_count],0
640
	je .end_triangles
5938 IgorA 641
		bt dword[draw_mode],bit_faces_fill
642
		jc @f
643
			push GL_LINE
644
			jmp .end_0
645
		@@:
646
			push GL_FILL
647
		.end_0:
648
		stdcall [glPolygonMode], GL_FRONT_AND_BACK ;mode - уже в стеке
649
		stdcall [glColor3ub],[color_face+2],[color_face+1],[color_face]
5935 IgorA 650
		stdcall [glBegin],GL_TRIANGLES
651
		mov eax,[obj_tri_data]
652
		mov ecx,[obj_tri_count]
653
		@@:
654
			movzx ebx,word[eax] ;1-я вершина
655
			imul ebx,12
656
			add ebx,[obj_poi_data]
657
			stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
658
			movzx ebx,word[eax+2] ;2-я вершина
659
			imul ebx,12
660
			add ebx,[obj_poi_data]
661
			stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
662
			movzx ebx,word[eax+4] ;3-я вершина
663
			imul ebx,12
664
			add ebx,[obj_poi_data]
665
			stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
666
			add eax,8 ;размер треугольника = (3 вершины (по 2б) + свойства (2б))
667
			dec ecx
668
			jnz @b
669
		stdcall [glEnd]
670
	.end_triangles:
671
 
5930 IgorA 672
	stdcall [glPopMatrix]
5944 IgorA 673
	cmp dword[obj_poi_sel_c],0
674
	je @f
675
		stdcall [buf2d_draw_text], buf_ogl, buf_1,txt_select_vert,5,3,[color_select]
676
	@@:
5930 IgorA 677
	stdcall [kosglSwapBuffers]
5935 IgorA 678
	.end_f:
5930 IgorA 679
	ret
680
 
2165 IgorA 681
align 4
5935 IgorA 682
SetLight:
683
	stdcall [glLightfv], GL_LIGHT0, GL_POSITION, light_position
684
	stdcall [glLightfv], GL_LIGHT0, GL_SPOT_DIRECTION, light_dir
685
 
686
	stdcall [glLightfv], GL_LIGHT0, GL_DIFFUSE, white_light
687
	stdcall [glLightfv], GL_LIGHT0, GL_SPECULAR, white_light
688
 
689
	stdcall [glEnable], GL_COLOR_MATERIAL
690
	stdcall [glColorMaterial], GL_FRONT, GL_AMBIENT_AND_DIFFUSE
691
	stdcall [glMaterialfv], GL_FRONT, GL_SPECULAR, mat_specular
692
	stdcall [glMaterialf], GL_FRONT, GL_SHININESS, mat_shininess
693
	stdcall [glLightModelfv], GL_LIGHT_MODEL_AMBIENT, lmodel_ambient
694
 
695
	stdcall [glEnable],GL_LIGHTING
696
	stdcall [glEnable],GL_LIGHT0
697
	ret
698
 
699
align 4
700
proc prop_key uses eax ebx
2165 IgorA 701
	mcall 2
5930 IgorA 702
 
703
	test word [edit1.flags],10b ;ed_focus
704
	je @f
705
		stdcall [edit_box_key], edit1
706
		jmp .end
707
	@@:
708
	test word [edit2.flags],10b
709
	je @f
710
		stdcall [edit_box_key], edit2
711
		jmp .end
712
	@@:
713
	test word [edit3.flags],10b
714
	je @f
715
		stdcall [edit_box_key], edit3
716
		jmp .end
717
	@@:
5935 IgorA 718
	cmp dword[el_focus], tree3
719
	jne @f
720
		stdcall [tl_key], tree3
721
		jmp .end
722
	@@:
5930 IgorA 723
 
724
	cmp ah,178 ;Up
725
	jne @f
726
		fld dword[angle_x]
727
		fadd dword[delt_size]
728
		fstp dword[angle_x]
729
		call draw_3d
730
		jmp .end
731
	@@:
732
	cmp ah,177 ;Down
733
	jne @f
734
		fld dword[angle_x]
735
		fsub dword[delt_size]
736
		fstp dword[angle_x]
737
		call draw_3d
738
		jmp .end
739
	@@:
740
	cmp ah,176 ;Left
741
	jne @f
742
		fld dword[angle_y]
743
		fadd dword[delt_size]
744
		fstp dword[angle_y]
745
		call draw_3d
746
		jmp .end
747
	@@:
748
	cmp ah,179 ;Right
749
	jne @f
750
		fld dword[angle_y]
751
		fsub dword[delt_size]
752
		fstp dword[angle_y]
753
		call draw_3d
754
		;jmp .end
755
	@@:
756
	.end:
2165 IgorA 757
	ret
5935 IgorA 758
endp
2165 IgorA 759
 
760
align 4
761
prop_mouse:
5938 IgorA 762
	push eax ebx
763
	mcall 37,3
764
	bt eax,0
765
	jnc .end_m
766
		;mouse l. but. move
767
		cmp dword[mouse_drag],1
768
		jne .end_m
769
		mcall 37,1 ;get mouse coords
770
		mov ebx,eax
771
		shr ebx,16 ;mouse.x
772
		cmp ebx,3d_wnd_l
773
		jg @f
774
			mov ebx,3d_wnd_l
775
		@@:
776
		sub ebx,3d_wnd_l
777
		cmp ebx,3d_wnd_w
778
		jle @f
779
			mov ebx,3d_wnd_w
780
		@@:
781
		and eax,0xffff ;mouse.y
782
		cmp eax,3d_wnd_t
783
		jg @f
784
			mov eax,3d_wnd_t
785
		@@:
786
		sub eax,3d_wnd_t
787
		cmp eax,3d_wnd_h
788
		jle @f
789
			mov eax,3d_wnd_h
790
		@@:
791
		finit
792
		fild dword[mouse_y]
793
		mov [mouse_y],eax
794
		fisub dword[mouse_y]
795
		fdiv dword[angle_dxm] ;если курсор движется по оси y (вверх или вниз) то поворот делаем вокруг оси x
796
		fadd dword[angle_x]
797
		fstp dword[angle_x]
798
 
799
		fild dword[mouse_x]
800
		mov [mouse_x],ebx
801
		fisub dword[mouse_x]
802
		fdiv dword[angle_dym] ;если курсор движется по оси x (вверх или вниз) то поворот делаем вокруг оси y
803
		fadd dword[angle_y]
804
		fstp dword[angle_y]
805
 
806
		call draw_3d
807
		jmp .end_d
808
	.end_m:
809
	bt eax,16
810
	jnc @f
811
		;mouse l. but. up
812
		mov dword[mouse_drag],0
813
		jmp .end_d
814
	@@:
815
	bt eax,8
816
	jnc .end_d
817
		;mouse l. but. press
818
		mcall 37,1 ;get mouse coords
819
		mov ebx,eax
820
		shr ebx,16 ;mouse.x
821
		cmp ebx,3d_wnd_l
822
		jl .end_d
823
		sub ebx,3d_wnd_l
824
		cmp ebx,3d_wnd_w
825
		jg .end_d
826
		and eax,0xffff ;mouse.y
827
		cmp eax,3d_wnd_t
828
		jl .end_d
829
		sub eax,3d_wnd_t
830
		cmp eax,3d_wnd_h
831
		jg .end_d
832
		mov dword[mouse_drag],1
833
		mov dword[mouse_x],ebx
834
		mov dword[mouse_y],eax
835
	.end_d:
836
 
5935 IgorA 837
	stdcall [kmainmenu_dispatch_cursorevent], [main_menu]
2165 IgorA 838
	stdcall [tl_mouse], tree3
2173 IgorA 839
	stdcall [edit_box_mouse], edit1
840
	stdcall [edit_box_mouse], edit2
841
	stdcall [edit_box_mouse], edit3
5938 IgorA 842
	pop ebx eax
2165 IgorA 843
	ret
844
 
845
align 4
846
prop_button:
847
	mcall 17 ;получить код нажатой кнопки
848
 
2173 IgorA 849
	cmp ah,3
2165 IgorA 850
	jne @f
5930 IgorA 851
		call get_point_coords
852
		call draw_3d
853
		jmp prop_still.end
2165 IgorA 854
	@@:
2173 IgorA 855
	cmp ah,4
856
	jne @f
5911 IgorA 857
		push eax ebx ecx edi esi
2173 IgorA 858
		stdcall [tl_node_get_data],tree3
5911 IgorA 859
		cmp eax,0
2173 IgorA 860
		je .no_select_1
5911 IgorA 861
			mov ebx,[eax]
2173 IgorA 862
			finit
2165 IgorA 863
 
2173 IgorA 864
			mov esi,string1
865
			mov edi,Data_String
866
			cld
5930 IgorA 867
			mov ecx,8
868
			rep movsd
2173 IgorA 869
			call String_to_DoubleFloat
870
			fld  qword[Data_Double] ;считываем как double
871
			fstp dword[ebx] ;сохраняем как float
872
 
873
			mov esi,string2
874
			mov edi,Data_String
875
			cld
5930 IgorA 876
			mov ecx,8
877
			rep movsd
2173 IgorA 878
			call String_to_DoubleFloat
879
			fld  qword[Data_Double] ;считываем как double
880
			fstp dword[ebx+4] ;сохраняем как float
881
 
882
			mov esi,string3
883
			mov edi,Data_String
884
			cld
5930 IgorA 885
			mov ecx,8
886
			rep movsd
2173 IgorA 887
			call String_to_DoubleFloat
888
			fld  qword[Data_Double] ;считываем как double
889
			fstp dword[ebx+8] ;сохраняем как float
890
 
891
			;обновление измененного узла в списке tree3 и главного окна (по таймеру)
892
			mov word[NumberSymbolsAD],5
893
			mov dword[obj_point],ebx
894
			mov dword[obj_point.text],0
895
			cld
896
			mov ecx,3
897
			.coord:
898
				fld dword[ebx]
899
				fstp qword[Data_Double]
900
				call DoubleFloat_to_String
901
				add ebx,4
902
				stdcall str_len, Data_String
903
				mov esi,txt_space
904
				add esi,eax
905
				cmp esi,txt_space.end
906
				jl .normal_size
907
					mov esi,txt_space.end-1 ;минимум 1 пробел нужно добавить, что-бы цифры не слипались
908
				.normal_size:
909
				stdcall str_cat, obj_point.text,esi
910
				stdcall str_cat, obj_point.text,Data_String
911
				loop .coord
5944 IgorA 912
			mov byte[obj_point.text],'*' ;отмечаем что вершина изменялась
5911 IgorA 913
			stdcall dword[tl_node_set_data], tree3,obj_point
2173 IgorA 914
			stdcall dword[tl_draw], tree3
915
			mov byte[can_save],1 ;для показа кнопки 'Сохранить'
916
			mov dword[offs_last_timer],0 ;для обновления блока в таймере
5930 IgorA 917
			call draw_3d
2173 IgorA 918
		.no_select_1:
5911 IgorA 919
		pop esi edi ecx ebx eax
5930 IgorA 920
		jmp prop_still.end
2173 IgorA 921
	@@:
5935 IgorA 922
	cmp ah,5
923
	jne @f
924
		call mnu_vertexes_on_off
925
		jmp prop_still.end
926
	@@:
927
	cmp ah,6
928
	jne @f
929
		call mnu_faces_on_off
930
		jmp prop_still.end
931
	@@:
932
	cmp ah,7
933
	jne @f
5938 IgorA 934
		call mnu_faces_fill_on_off
935
		jmp prop_still.end
936
	@@:
937
	cmp ah,8
938
	jne @f
5935 IgorA 939
		call mnu_light_on_off
940
		jmp prop_still.end
941
	@@:
5938 IgorA 942
	cmp ah,9
943
	jne @f
944
		call mnu_reset_settings
945
		jmp prop_still.end
946
	@@:
5944 IgorA 947
	cmp ah,10
948
	jne @f
949
		call mnu_vertexes_select
950
		jmp prop_still.end
951
	@@:
952
	cmp ah,11
953
	jne @f
954
		call mnu_vertexes_deselect
955
		jmp prop_still.end
956
	@@:
957
	cmp ah,12
958
	jne @f
959
		call mnu_reset_average_x
960
		jmp prop_still.end
961
	@@:
962
	cmp ah,13
963
	jne @f
964
		call mnu_reset_average_y
965
		jmp prop_still.end
966
	@@:
967
	cmp ah,14
968
	jne @f
969
		call mnu_reset_average_z
970
		jmp prop_still.end
971
	@@:
2173 IgorA 972
 
2165 IgorA 973
	cmp ah,1
5930 IgorA 974
	jne prop_still.end
2165 IgorA 975
.exit:
976
	mov dword[tree3.data_img],0 ;чистим указатели на иконки что-бы их не удалил деструктор
977
	mov dword[tree3.data_img_sys],0 ;т. к. они еще используються в других элементах
978
	stdcall dword[tl_data_clear], tree3
979
	mov byte[prop_wnd_run],0 ;обнуляем счетчик окон
980
	mcall -1 ;выход из программы
981
 
5930 IgorA 982
align 4
983
get_point_coords:
984
	;загрузка координат в editbox-ы
985
	push eax ebx
986
	stdcall [tl_node_get_data],tree3
987
	cmp eax,0
988
	je @f
989
		mov ebx,[eax]
990
		mov word[NumberSymbolsAD],8
991
		finit
992
		fld dword[ebx]
993
		fstp qword[Data_Double]
994
		call DoubleFloat_to_String
995
		stdcall [edit_box_set_text], edit1, Data_String
996
		fld dword[ebx+4]
997
		fstp qword[Data_Double]
998
		call DoubleFloat_to_String
999
		stdcall [edit_box_set_text], edit2, Data_String
1000
		fld dword[ebx+8]
1001
		fstp qword[Data_Double]
1002
		call DoubleFloat_to_String
1003
		stdcall [edit_box_set_text], edit3, Data_String
1004
		stdcall [edit_box_draw], edit1
1005
		stdcall [edit_box_draw], edit2
1006
		stdcall [edit_box_draw], edit3
1007
	@@:
1008
	pop ebx eax
1009
	ret
1010
 
1011
align 4
5935 IgorA 1012
proc prop_timer_funct uses eax
1013
	;просматриваем выделенную координату
1014
	stdcall [tl_node_get_data],tree3
1015
	cmp [cursor_last_draw],eax
1016
	je @f
1017
		mov [cursor_last_draw],eax
1018
		call draw_3d
1019
	@@:
1020
	ret
1021
endp
1022
 
5938 IgorA 1023
;изменяем режим рисования вершин
5935 IgorA 1024
align 4
1025
mnu_vertexes_on_off:
1026
	xor dword[draw_mode], 1 shl bit_vertexes
1027
	ret
1028
 
5938 IgorA 1029
;изменяем режим рисования граней
5935 IgorA 1030
align 4
1031
mnu_faces_on_off:
1032
	xor dword[draw_mode], 1 shl bit_faces
1033
	ret
1034
 
5938 IgorA 1035
;изменяем каркасные или сплошные грани
5935 IgorA 1036
align 4
5938 IgorA 1037
mnu_faces_fill_on_off:
1038
	xor dword[draw_mode], 1 shl bit_faces_fill
1039
	or  dword[draw_mode], 1 shl bit_faces ;включаем режим рисования граней (если вдруг был отключен)
1040
	ret
1041
 
1042
;включаем или отключаем освещение
1043
align 4
5935 IgorA 1044
mnu_light_on_off:
1045
	xor dword[draw_mode], 1 shl bit_light
1046
	ret
1047
 
1048
align 4
5938 IgorA 1049
mnu_reset_settings:
1050
	mov dword[angle_x],0.0
1051
	mov dword[angle_y],0.0
1052
	mov dword[angle_z],0.0
1053
	m2m dword[draw_mode],dword[def_dr_mode]
1054
	ret
1055
 
1056
align 4
5944 IgorA 1057
proc mnu_vertexes_select uses eax ebx
1058
	stdcall [tl_node_get_data],tree3
1059
	cmp eax,0
1060
	je .no_points
1061
	stdcall found_block_data,tree3
1062
	cmp eax,0
1063
	je .no_points
1064
		mov bx,word[eax]
1065
		cmp bx,ID_ICON_POINT_SEL
1066
		je @f
1067
			mov word[eax],ID_ICON_POINT_SEL
1068
			inc dword[obj_poi_sel_c]
1069
			jmp .change
1070
		@@:
1071
			mov word[eax],ID_ICON_POINT
1072
			dec dword[obj_poi_sel_c]
1073
		.change:
1074
			mov eax,[obj_poi_sel_c]
1075
			stdcall convert_int_to_str, txt_select_vert.count,16
1076
	.no_points:
1077
	ret
1078
endp
1079
 
1080
align 4
1081
proc mnu_vertexes_deselect uses eax
1082
	cmp dword[obj_poi_sel_c],0
1083
	je .no_points
1084
	mov dword[obj_poi_sel_c],0
1085
	stdcall [tl_node_poi_get_info], tree3,0
1086
	cmp eax,0
1087
	je .no_points
1088
	@@:
1089
		mov word[eax],ID_ICON_POINT
1090
		stdcall [tl_node_poi_get_next_info], tree3,eax
1091
		cmp eax,0
1092
		jne @b
1093
	.no_points:
1094
	ret
1095
endp
1096
 
1097
align 4
1098
proc mnu_reset_average_x uses eax ebx ecx edx edi
1099
	cmp dword[obj_poi_sel_c],2
1100
	jl .end_select
1101
		finit
1102
		fldz
1103
		mov ecx,dword[obj_poi_sel_c]
1104
		stdcall dword[tl_node_poi_get_info], tree3,0
1105
		@@:
1106
			cmp eax,0
1107
			je .end_select
1108
			mov ebx,eax
1109
			cmp word[ebx],ID_ICON_POINT_SEL
1110
			jne .next_sel0
1111
				stdcall [tl_node_poi_get_data], tree3,ebx
1112
				mov eax,[eax]
1113
				fadd dword[eax]
1114
				dec ecx
1115
				jz @f
1116
			.next_sel0:
1117
			stdcall dword[tl_node_poi_get_next_info], tree3,ebx
1118
			jmp @b
1119
		@@:
1120
		fidiv dword[obj_poi_sel_c]
1121
		fstp dword[eax]
1122
		mov edx,[eax]
1123
		mov ecx,dword[obj_poi_sel_c]
1124
		stdcall dword[tl_node_poi_get_info], tree3,0
1125
		@@:
1126
			cmp eax,0
1127
			je .end_select
1128
			mov ebx,eax
1129
			cmp word[ebx],ID_ICON_POINT_SEL
1130
			jne .next_sel1
1131
				stdcall [tl_node_poi_get_data], tree3,ebx
1132
				mov edi,eax
1133
				mov eax,[eax]
1134
				mov [eax],edx
1135
				stdcall update_tree, edi
1136
				dec ecx
1137
				jz @f
1138
			.next_sel1:
1139
			stdcall dword[tl_node_poi_get_next_info], tree3,ebx
1140
			jmp @b
1141
		@@:
1142
    .end_select:
1143
	ret
1144
endp
1145
 
1146
align 4
1147
proc mnu_reset_average_y uses eax ebx ecx edx edi
1148
	cmp dword[obj_poi_sel_c],2
1149
	jl .end_select
1150
		finit
1151
		fldz
1152
		mov ecx,dword[obj_poi_sel_c]
1153
		stdcall dword[tl_node_poi_get_info], tree3,0
1154
		@@:
1155
			cmp eax,0
1156
			je .end_select
1157
			mov ebx,eax
1158
			cmp word[ebx],ID_ICON_POINT_SEL
1159
			jne .next_sel0
1160
				stdcall [tl_node_poi_get_data], tree3,ebx
1161
				mov eax,[eax]
1162
				fadd dword[eax+4]
1163
				dec ecx
1164
				jz @f
1165
			.next_sel0:
1166
			stdcall dword[tl_node_poi_get_next_info], tree3,ebx
1167
			jmp @b
1168
		@@:
1169
		fidiv dword[obj_poi_sel_c]
1170
		fstp dword[eax+4]
1171
		mov edx,[eax+4]
1172
		mov ecx,dword[obj_poi_sel_c]
1173
		stdcall dword[tl_node_poi_get_info], tree3,0
1174
		@@:
1175
			cmp eax,0
1176
			je .end_select
1177
			mov ebx,eax
1178
			cmp word[ebx],ID_ICON_POINT_SEL
1179
			jne .next_sel1
1180
				stdcall [tl_node_poi_get_data], tree3,ebx
1181
				mov edi,eax
1182
				mov eax,[eax]
1183
				mov [eax+4],edx
1184
				stdcall update_tree, edi
1185
				dec ecx
1186
				jz @f
1187
			.next_sel1:
1188
			stdcall dword[tl_node_poi_get_next_info], tree3,ebx
1189
			jmp @b
1190
		@@:
1191
    .end_select:
1192
	ret
1193
endp
1194
 
1195
align 4
1196
proc mnu_reset_average_z uses eax ebx ecx edx edi
1197
	cmp dword[obj_poi_sel_c],2
1198
	jl .end_select
1199
		finit
1200
		fldz
1201
		mov ecx,dword[obj_poi_sel_c]
1202
		stdcall dword[tl_node_poi_get_info], tree3,0
1203
		@@:
1204
			cmp eax,0
1205
			je .end_select
1206
			mov ebx,eax
1207
			cmp word[ebx],ID_ICON_POINT_SEL
1208
			jne .next_sel0
1209
				stdcall [tl_node_poi_get_data], tree3,ebx
1210
				mov eax,[eax]
1211
				fadd dword[eax+8]
1212
				dec ecx
1213
				jz @f
1214
			.next_sel0:
1215
			stdcall dword[tl_node_poi_get_next_info], tree3,ebx
1216
			jmp @b
1217
		@@:
1218
		fidiv dword[obj_poi_sel_c]
1219
		fstp dword[eax+8]
1220
		mov edx,[eax+8]
1221
		mov ecx,dword[obj_poi_sel_c]
1222
		stdcall dword[tl_node_poi_get_info], tree3,0
1223
		@@:
1224
			cmp eax,0
1225
			je .end_select
1226
			mov ebx,eax
1227
			cmp word[ebx],ID_ICON_POINT_SEL
1228
			jne .next_sel1
1229
				stdcall [tl_node_poi_get_data], tree3,ebx
1230
				mov edi,eax
1231
				mov eax,[eax]
1232
				mov [eax+8],edx
1233
				stdcall update_tree, edi
1234
				dec ecx
1235
				jz @f
1236
			.next_sel1:
1237
			stdcall dword[tl_node_poi_get_next_info], tree3,ebx
1238
			jmp @b
1239
		@@:
1240
    .end_select:
1241
	ret
1242
endp
1243
 
1244
align 4
1245
proc update_tree h_mem:dword
1246
pushad
1247
	mov edi,[h_mem]
1248
	mov ebx,[edi]
1249
	finit
1250
 
1251
	;обновление измененного узла в списке tree3 и главного окна (по таймеру)
1252
	mov word[NumberSymbolsAD],5
1253
	mov dword[obj_point.text],0
1254
	cld
1255
	mov ecx,3
1256
	.coord:
1257
		fld dword[ebx]
1258
		fstp qword[Data_Double]
1259
		call DoubleFloat_to_String
1260
		add ebx,4
1261
		stdcall str_len, Data_String
1262
		mov esi,txt_space
1263
		add esi,eax
1264
		cmp esi,txt_space.end
1265
		jl .normal_size
1266
			mov esi,txt_space.end-1 ;минимум 1 пробел нужно добавить, что-бы цифры не слипались
1267
		.normal_size:
1268
		stdcall str_cat, obj_point.text,esi
1269
		stdcall str_cat, obj_point.text,Data_String
1270
		loop .coord
1271
	mov esi,obj_point.text
1272
	mov byte[esi],'*' ;отмечаем что вершина изменялась
1273
	mov byte[can_save],1 ;для показа кнопки 'Сохранить'
1274
	add edi,4
1275
	mov ecx,MAX_OBJECT_SIZE-4
1276
	rep movsb
1277
popad
1278
	ret
1279
endp
1280
 
1281
align 4
5938 IgorA 1282
def_dr_mode dd 0 ;режим рисования по умолчанию
1283
delt_size dd 3.0 ;изменение углов при поворотах с кливиатуры
1284
mouse_drag dd 0 ;режим поворота сцены от перемещении курсора мыши
1285
mouse_x dd 0
1286
mouse_y dd 0
1287
angle_dxm dd 1.7775 ;~ 3d_wnd_w/180 - прибавление углов поворота сцены при вращении мышей
1288
angle_dym dd 1.3335 ;~ 3d_wnd_h/180
5948 IgorA 1289
ratio dd 1.3333 ;~ 3d_wnd_w/3d_wnd_h
5938 IgorA 1290
;angle_dzm dd ?
1291
draw_mode dd 0 ;режим рисования объекта
5935 IgorA 1292
obj_poi_data dd 0 ;указатель на координаты вершин
1293
obj_poi_count dd 0 ;колличество вершин
5944 IgorA 1294
obj_poi_sel_c dd 0 ;колличество выделенных вершин
5935 IgorA 1295
obj_tri_data dd 0 ;указатель на данные треугольников
1296
obj_tri_count dd 0 ;колличество треугольников
1297
cursor_last_draw dd 0 ;положение курсора при последней прорисовке 3d окна
5930 IgorA 1298
sph_radius dd 0 ;радиус сферы для выделения активной точки
1299
obj_x_max dd 0
1300
obj_x_min dd 0
1301
obj_x_centr dd 0
1302
obj_x_scale dd 1.0
1303
obj_y_max dd 0
1304
obj_y_min dd 0
1305
obj_y_centr dd 0
1306
obj_y_scale dd 1.0
1307
obj_z_max dd 0
1308
obj_z_min dd 0
1309
obj_z_centr dd 0
1310
obj_z_scale dd 1.0
1311
 
4332 IgorA 1312
capt_p dd 0
1313
 
2165 IgorA 1314
;дерево с объектами в пользовательском файле
5930 IgorA 1315
tree3 tree_list MAX_OBJECT_SIZE,3, tl_key_no_edit+tl_list_box_mode,\
5935 IgorA 1316
	16,16, 0xffffff,0xb0d0ff,0x400040, 5,290,303,140, 16, 4,0, el_focus,\
5930 IgorA 1317
	w_scr_t3,get_point_coords
2165 IgorA 1318
 
5935 IgorA 1319
edit1 edit_box 80,  76, 269, 0xffd0d0, 0xff, 0x80ff, 0, 0x8000, 34, string1, mouse_dd, 0
1320
edit2 edit_box 80, 160, 269, 0xd0d0ff, 0xff, 0x80ff, 0, 0x8000, 34, string2, mouse_dd, 0
1321
edit3 edit_box 80, 244, 269, 0xd0ffd0, 0xff, 0x80ff, 0, 0x8000, 34, string3, mouse_dd, 0
2173 IgorA 1322
editboxes_end:
1323
 
1324
string1 rb 34
1325
string2 rb 34
1326
string3 rb 34
1327
 
2165 IgorA 1328
align 4
5930 IgorA 1329
w_scr_t3 scrollbar 16, 0,0,0, 15, 100,0,0, 0,0,0, 1