Subversion Repositories Kolibri OS

Rev

Rev 5948 | Rev 6046 | 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
6022 IgorA 216
	call obj_set_normals
2173 IgorA 217
	edit_boxes_set_sys_color edit1,editboxes_end,sc ;установка системных цветов
218
	stdcall [edit_box_set_text], edit1, txt_q
219
	stdcall [edit_box_set_text], edit2, txt_q
220
	stdcall [edit_box_set_text], edit3, txt_q
5938 IgorA 221
	mov eax,0xc0c0c0
222
	mov ebx,[color_ox]
223
	shr ebx,2
224
	and ebx,0x3f3f3f
225
	add eax,ebx
226
	mov [edit1.color],eax
227
	mov eax,0xc0c0c0
228
	mov ebx,[color_oy]
229
	shr ebx,2
230
	and ebx,0x3f3f3f
231
	add eax,ebx
232
	mov [edit2.color],eax
233
	mov eax,0xc0c0c0
234
	mov ebx,[color_oz]
235
	shr ebx,2
236
	and ebx,0x3f3f3f
237
	add eax,ebx
238
	mov [edit3.color],eax
5944 IgorA 239
 
240
	mov eax,dword[ctx1] ;eax -> TinyGLContext.GLContext
241
	mov eax,[eax] ;eax -> ZBuffer
242
	mov eax,[eax+offs_zbuf_pbuf] ;eax -> ZBuffer.pbuf
243
	mov dword[buf_ogl],eax
2165 IgorA 244
popad
245
 
5930 IgorA 246
	call prop_red_win
247
 
248
;не отрывать эту функцию от предыдущей
2165 IgorA 249
align 4
5930 IgorA 250
prop_still:
251
	pushad
252
 
5935 IgorA 253
	mcall 23,10
254
	or eax,eax
255
	jnz @f
256
		call prop_timer_funct
257
		jmp .end
258
	@@:
259
 
5930 IgorA 260
	cmp al,1 ;изм. положение окна
261
	jne @f
262
		call prop_red_win
263
		jmp .end
264
	@@:
265
	cmp al,2
266
	jne @f
267
		call prop_key
268
		jmp .end
269
	@@:
270
	cmp al,3
271
	jz prop_button
272
	cmp al,6
273
	jne @f
274
		call prop_mouse
275
	@@:
276
.end:
277
	popad
278
	jmp prop_still
279
 
280
align 4
2165 IgorA 281
prop_red_win:
282
pushad
283
	mcall 12,1
284
 
285
	xor eax,eax
4332 IgorA 286
	mov edi,dword[capt_p] ;children window caption
2165 IgorA 287
	mov bx,word[procinfo.box.left]
288
	add bx,word[buf_0.l]
5930 IgorA 289
	add bx,5 ;ширина боковой рамки
2165 IgorA 290
	shl ebx,16
291
	mov bx,prop_wnd_width
292
	mov cx,word[procinfo.box.top]
2173 IgorA 293
	add cx,word[buf_0.t]
2165 IgorA 294
	shl ecx,16
5930 IgorA 295
	mov cx,prop_wnd_height
5938 IgorA 296
	mov edx,[sc.work]
297
	or  edx,0x33000000
2165 IgorA 298
	int 0x40
299
 
2173 IgorA 300
	mov esi,[sc.work_button]
5935 IgorA 301
	mcall 8, (5 shl 16)+20, (266 shl 16)+20, 3
302
	mcall , (30 shl 16)+20, (266 shl 16)+20, 4
2173 IgorA 303
 
304
	mov ebx,[image_data_toolbar]
5938 IgorA 305
	add ebx,3*IMAGE_TOOLBAR_ICON_SIZE
5935 IgorA 306
	mcall 7, , (16 shl 16)+16, (7 shl 16)+268 ;load
2173 IgorA 307
 
308
	sub ebx,IMAGE_TOOLBAR_ICON_SIZE
5935 IgorA 309
	mov edx,(32 shl 16)+268 ;save
2173 IgorA 310
	int 0x40
311
 
2165 IgorA 312
	mov dword[w_scr_t3.all_redraw],1
313
	stdcall [scrollbar_ver_draw],dword w_scr_t3
314
	stdcall [tl_draw], tree3
2173 IgorA 315
	stdcall [edit_box_draw], edit1
316
	stdcall [edit_box_draw], edit2
317
	stdcall [edit_box_draw], edit3
5930 IgorA 318
 
5935 IgorA 319
	stdcall [kmainmenu_draw], [main_menu]
5930 IgorA 320
	call draw_3d
2165 IgorA 321
	mcall 12,2
322
popad
5930 IgorA 323
	ret
2165 IgorA 324
 
5935 IgorA 325
;установка всех основных переменных по умолчанию
2165 IgorA 326
align 4
5935 IgorA 327
prop_wnd_clear_param:
5938 IgorA 328
	;установка параметров отображения
329
	call mnu_reset_settings
330
 
331
	;обнуление указателей на данные объектов
5935 IgorA 332
	mov dword[obj_poi_data],0
333
	mov dword[obj_poi_count],0
5944 IgorA 334
	mov dword[obj_poi_sel_c],0
5935 IgorA 335
	mov dword[obj_tri_data],0
336
	mov dword[obj_tri_count],0
6022 IgorA 337
	mov dword[obj_normals_tri_count],0
338
	mov dword[obj_normals_poi_count],0
339
	stdcall mem.Free,[obj_normals_tri_data]
340
	stdcall mem.Free,[obj_normals_poi_data]
341
	mov dword[obj_normals_tri_data],0
342
	mov dword[obj_normals_poi_data],0
5935 IgorA 343
	ret
344
 
5938 IgorA 345
;поиск данных
346
;input:
347
;eax - текущий узел
348
;output:
349
;eax - структура текущего узла (или 0 при неудаче)
350
align 4
5944 IgorA 351
proc found_block_data uses ebx ecx edx, tlist:dword
352
	mov edx,[tlist]
5938 IgorA 353
	mov ecx,eax
5944 IgorA 354
	stdcall [tl_node_poi_get_info], edx,0
5938 IgorA 355
	@@:
356
		mov ebx,eax
5944 IgorA 357
		stdcall [tl_node_poi_get_data], edx,ebx
5938 IgorA 358
		cmp eax,ecx
359
		je @f ;если попали на выбранный узел
5944 IgorA 360
		stdcall [tl_node_poi_get_next_info], edx,ebx
5938 IgorA 361
		cmp eax,0
362
		jne @b
363
		jmp .end
364
	@@:
365
		mov eax,ebx
366
	.end:
367
	ret
5944 IgorA 368
endp
5938 IgorA 369
 
5935 IgorA 370
;установка размеров объекта
371
align 4
5930 IgorA 372
proc obj_set_sizes uses eax ebx esi
5935 IgorA 373
	cmp dword[obj_poi_count],0
5930 IgorA 374
	je .end
375
		finit
5935 IgorA 376
		mov eax,[obj_poi_data]
5930 IgorA 377
		mov ebx,dword[eax]
378
		mov [obj_x_min],ebx
379
		mov [obj_x_max],ebx
380
		mov ebx,dword[eax+4]
381
		mov [obj_y_min],ebx
382
		mov [obj_y_max],ebx
383
		mov ebx,dword[eax+8]
384
		mov [obj_z_min],ebx
385
		mov [obj_z_max],ebx
2165 IgorA 386
 
5935 IgorA 387
	mov ebx,[obj_poi_data]
388
	mov esi,[obj_poi_count]
5930 IgorA 389
align 4
390
	.cycle_0: ;работа с координатой x
391
		fld dword[ebx]
392
		fld dword[obj_x_min]
393
		fcomp
394
		fstsw ax
395
		sahf
396
		jb @f
397
			mov eax,[ebx]
398
			mov [obj_x_min],eax
399
			ffree st0
400
			fincstp
401
			jmp .next_x
402
		@@:
403
		fld dword[obj_x_max]
404
		fcompp
405
		fstsw ax
406
		sahf
407
		ja .next_x
408
			mov eax,[ebx]
409
			mov [obj_x_max],eax
410
		.next_x:
411
 
5935 IgorA 412
		add ebx,12
413
		dec esi
414
		jnz .cycle_0
5930 IgorA 415
 
416
		fld1
417
		fld dword[obj_x_max]
418
		fsub dword[obj_x_min]
419
		fst dword[obj_x_centr]
420
		fdivp ;1/size.x
421
		fstp dword[obj_x_scale]
422
 
423
		fld dword[obj_x_centr]
424
		fld1
425
		fld1
426
		faddp
427
		fdivp ;centr.x = size.x/2
428
		fadd dword[obj_x_min]
429
		fchs
430
		fstp dword[obj_x_centr]
431
 
5935 IgorA 432
	mov ebx,[obj_poi_data]
433
	mov esi,[obj_poi_count]
5930 IgorA 434
align 4
435
	.cycle_1: ;работа с координатой y
436
		fld dword[ebx+4]
437
		fld dword[obj_y_min]
438
		fcomp
439
		fstsw ax
440
		sahf
441
		jb @f
442
			mov eax,[ebx+4]
443
			mov [obj_y_min],eax
444
			ffree st0
445
			fincstp
446
			jmp .next_y
447
		@@:
448
		fld dword[obj_y_max]
449
		fcompp
450
		fstsw ax
451
		sahf
452
		ja .next_y
453
			mov eax,[ebx+4]
454
			mov [obj_y_max],eax
455
		.next_y:
456
 
5935 IgorA 457
		add ebx,12
458
		dec esi
459
		jnz .cycle_1
5930 IgorA 460
 
461
		fld1
462
		fld dword[obj_y_max]
463
		fsub dword[obj_y_min]
464
		fst dword[obj_y_centr]
465
		fdivp ;1/size.y
466
		fstp dword[obj_y_scale]
467
 
468
		fld dword[obj_y_centr]
469
		fld1
470
		fld1
471
		faddp
472
		fdivp ;centr.y = size.y/2
473
		fadd dword[obj_y_min]
474
		fchs
475
		fstp dword[obj_y_centr]
476
 
5935 IgorA 477
	mov ebx,[obj_poi_data]
478
	mov esi,[obj_poi_count]
5930 IgorA 479
align 4
480
	.cycle_2: ;работа с координатой z
481
		fld dword[ebx+8]
482
		fld dword[obj_z_min]
483
		fcomp
484
		fstsw ax
485
		sahf
486
		jb @f
487
			mov eax,[ebx+8]
488
			mov [obj_z_min],eax
489
			ffree st0
490
			fincstp
491
			jmp .next_z
492
		@@:
493
		fld dword[obj_z_max]
494
		fcompp
495
		fstsw ax
496
		sahf
497
		ja .next_z
498
			mov eax,[ebx+8]
499
			mov [obj_z_max],eax
500
		.next_z:
501
 
5935 IgorA 502
		add ebx,12
503
		dec esi
504
		jnz .cycle_2
5930 IgorA 505
 
506
		fld1
507
		fld dword[obj_z_max]
508
		fsub dword[obj_z_min]
509
		fst dword[obj_z_centr]
510
		fdivp ;1/size.z
511
		fstp dword[obj_z_scale]
512
 
513
		fld dword[obj_z_centr]
514
		fld1
515
		fld1
516
		faddp
517
		fdivp ;centr.z = size.z/2
518
		fadd dword[obj_z_min]
519
		fchs
520
		fstp dword[obj_z_centr]
521
 
522
		;находим радиус для сферы
523
		fld dword[obj_x_max]
524
		fsub dword[obj_x_min]
525
		fld dword[obj_y_max]
526
		fsub dword[obj_y_min]
527
		faddp
528
		fild dword[rad_c]
529
		fdivp ;radius=(size.x+size.y)/rad_c
530
		fstp dword[sph_radius]
5948 IgorA 531
 
532
	;делаем одинаковый масштаб по осям x и y, что-бы не нарушались пропорции изображения
533
	fld dword[obj_y_scale]
534
	fdiv dword[ratio] ;приведение масштаба по оси y учитывая что по высоте экран меньше
535
	fcomp dword[obj_x_scale]
536
	fstsw ax
537
	sahf
538
	jb @f
539
		;сжатие масштаба по y
540
		fld dword[obj_x_scale]
541
		fmul dword[ratio]
542
		fstp dword[obj_y_scale] ;масштаб по оси y = масштаб по оси x
543
		jmp .end
544
	@@:
545
		;сжатие масштаба по x >...<
546
		fld	dword[obj_x_scale]
547
		fdiv dword[ratio]
548
		fstp dword[obj_x_scale]
5930 IgorA 549
	.end:
550
	ret
551
endp
552
 
6022 IgorA 553
;установка нормалей для граней
554
align 4
555
proc obj_set_normals
556
locals
557
	tbl1 rd 9 ;ebp-72
558
	tbl2 rd 9 ;ebp-36
559
endl
560
pushad
561
	cmp dword[obj_poi_count],0
562
	je .end
563
		finit
564
		mov ecx,[obj_tri_count]
565
		mov [obj_normals_tri_count],ecx ;на каждый треугольник 1 нармаль
566
		cmp ecx,0
567
		je .end
568
		imul ecx,12
569
		stdcall mem.Alloc, ecx
570
		mov [obj_normals_tri_data],eax
571
 
572
		mov edx,[obj_tri_data]
573
		mov ebx,[obj_tri_count]
574
align 4
575
		@@:
576
			mov edi,ebp
577
			sub edi,36 ;tbl2
578
			movzx esi,word[edx] ;1-я вершина
579
			imul esi,12
580
			add esi,[obj_poi_data]
581
			mov ecx,3
582
			rep movsd
583
			movzx esi,word[edx+2] ;2-я вершина
584
			imul esi,12
585
			add esi,[obj_poi_data]
586
			mov ecx,3
587
			rep movsd
588
			movzx esi,word[edx+4] ;3-я вершина
589
			imul esi,12
590
			add esi,[obj_poi_data]
591
			mov ecx,3
592
			rep movsd
593
 
594
			mov esi,ebp
595
			sub esi,72 ;tbl1
596
			sub edi,36 ;tbl2
597
			;v1 <-> v2
598
			fld dword[edi+12]
599
			fsub dword[edi]
600
			fstp dword[esi] ;(x1-x2)
601
			fld dword[edi+16]
602
			fsub dword[edi+4]
603
			fstp dword[esi+4] ;(y1-y2)
604
			fld dword[edi+20]
605
			fsub dword[edi+8]
606
			fstp dword[esi+8] ;(z1-z2)
607
			;v2 <-> v3
608
			fld dword[edi+24]
609
			fsub dword[edi+12]
610
			fstp dword[esi+12] ;(x2-x3)
611
			fld dword[edi+28]
612
			fsub dword[edi+16]
613
			fstp dword[esi+16] ;(y2-y3)
614
			fld dword[edi+32]
615
			fsub dword[edi+20]
616
			fstp dword[esi+20] ;(z2-z3)
617
			;v3 <-> v1
618
			fld dword[edi]
619
			fsub dword[edi+24]
620
			fstp dword[esi+24] ;(x3-x1)
621
			fld dword[edi+4]
622
			fsub dword[edi+28]
623
			fstp dword[esi+28] ;(y3-y1)
624
			fld dword[edi+8]
625
			fsub dword[edi+32]
626
			fstp dword[esi+32] ;(z3-z1)
627
 
628
			;a1,a2,a3
629
			fld dword[esi+4]
630
			fmul dword[esi+8]
631
			fstp dword[edi] ;a1=(y1-y2)*(z1-z2)
632
			fld dword[esi+16]
633
			fmul dword[esi+20]
634
			fstp dword[edi+4] ;a2=(y2-y3)*(z2-z3)
635
			fld dword[esi+28]
636
			fmul dword[esi+32]
637
			fstp dword[edi+8] ;a3=(y3-y1)*(z3-z1)
638
			;b1,b2,b3
639
			fld dword[esi]
640
			fmul dword[esi+8]
641
			fstp dword[edi] ;b1=(x1-x2)*(z1-z2)
642
			fld dword[esi+12]
643
			fmul dword[esi+20]
644
			fstp dword[edi+4] ;b2=(x2-x3)*(z2-z3)
645
			fld dword[esi+24]
646
			fmul dword[esi+32]
647
			fstp dword[edi+8] ;b3=(x3-x1)*(z3-z1)
648
			;c1,с2,с3
649
			fld dword[esi]
650
			fmul dword[esi+4]
651
			fstp dword[edi] ;c1=(x1-x2)*(y1-y2)
652
			fld dword[esi+12]
653
			fmul dword[esi+16]
654
			fstp dword[edi+4] ;c2=(x2-x3)*(y2-y3)
655
			fld dword[esi+24]
656
			fmul dword[esi+28]
657
			fstp dword[edi+8] ;c3=(x3-x1)*(y3-y1)
658
 
659
			fld dword[edi]
660
			fadd dword[edi+4]
661
			fadd dword[edi+8]
662
			fstp dword[eax] ;set normal.a
663
			fld dword[edi+12]
664
			fadd dword[edi+16]
665
			fadd dword[edi+20]
666
			fstp dword[eax+4] ;set normal.b
667
			fld dword[edi+24]
668
			fadd dword[edi+28]
669
			fadd dword[edi+32]
670
			fstp dword[eax+8] ;set normal.c
671
 
672
			add edx,8 ;размер треугольника = (3 вершины (по 2б) + свойства (2б))
673
			add eax,12
674
			dec ebx
675
			jnz @b
676
	.end:
677
popad
678
	ret
679
endp
680
 
5930 IgorA 681
;рисование точек в 3d
682
align 4
683
draw_3d:
5935 IgorA 684
	cmp dword[obj_poi_count],2
685
	jl .end_f
5930 IgorA 686
	stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;очистим буфер цвета и глубины
687
	stdcall [glPushMatrix]
5935 IgorA 688
	bt dword[draw_mode],bit_light
689
	jnc @f
690
		call SetLight
691
		jmp .end_l
692
	@@:
693
		stdcall [glDisable],GL_LIGHTING
694
	.end_l:
5930 IgorA 695
	stdcall [glTranslatef], 0.0,0.0,0.5 ;correct for z
696
	stdcall [glScalef], [obj_x_scale],[obj_y_scale],[obj_z_scale]
697
	stdcall [glScalef], 1.0,1.0,0.7 ;correct for z
698
	stdcall [glRotatef], [angle_z],0.0,0.0,1.0
699
	stdcall [glRotatef], [angle_y],0.0,1.0,0.0
700
	stdcall [glRotatef], [angle_x],1.0,0.0,0.0
701
	stdcall [glTranslatef], [obj_x_centr],[obj_y_centr],[obj_z_centr]
702
 
5935 IgorA 703
	;рисование точек
704
	bt dword[draw_mode],bit_vertexes
705
	jnc .end_points
5938 IgorA 706
		stdcall [glColor3ub],[color_vert+2],[color_vert+1],[color_vert]
5935 IgorA 707
		stdcall [glBegin],GL_POINTS
708
		mov eax,[obj_poi_data]
709
		mov ebx,[obj_poi_count]
710
		@@:
711
			stdcall [glVertex3f], [eax],[eax+4],[eax+8]
712
			add eax,12
713
			dec ebx
714
			jnz @b
715
		stdcall [glEnd]
716
	.end_points:
5930 IgorA 717
 
5944 IgorA 718
	;рисование активной точки
5930 IgorA 719
	stdcall [tl_node_get_data],tree3
720
	cmp eax,0
721
	je @f
722
		;выделение активной точки
723
		mov eax,[eax]
724
 
725
		stdcall [glBegin],GL_LINES
5938 IgorA 726
		stdcall [glColor3ub],[color_ox+2],[color_ox+1],[color_ox]
5930 IgorA 727
		stdcall [glVertex3f], [obj_x_min],[eax+4],[eax+8]
728
		stdcall [glVertex3f], [obj_x_max],[eax+4],[eax+8]
5938 IgorA 729
		stdcall [glColor3ub],[color_oy+2],[color_oy+1],[color_oy]
5930 IgorA 730
		stdcall [glVertex3f], [eax],[obj_y_min],[eax+8]
731
		stdcall [glVertex3f], [eax],[obj_y_max],[eax+8]
5938 IgorA 732
		stdcall [glColor3ub],[color_oz+2],[color_oz+1],[color_oz]
5930 IgorA 733
		stdcall [glVertex3f], [eax],[eax+4],[obj_z_min]
734
		stdcall [glVertex3f], [eax],[eax+4],[obj_z_max]
735
		stdcall [glEnd]
736
 
5944 IgorA 737
		stdcall [glColor3ub],[color_select+2],[color_select+1],[color_select]
5935 IgorA 738
		stdcall [glPushMatrix]
739
			stdcall [glTranslatef], [eax],[eax+4],[eax+8]
740
			stdcall [gluSphere], [qObj], [sph_radius], 8,8
741
		stdcall [glPopMatrix]
5930 IgorA 742
	@@:
743
 
5944 IgorA 744
	;рисование выделенных точек
745
	cmp dword[obj_poi_sel_c],0
746
	je .end_select
747
		mov ecx,dword[obj_poi_sel_c]
748
		stdcall [glColor3ub],[color_select+2],[color_select+1],[color_select]
749
		stdcall dword[tl_node_poi_get_info], tree3,0
750
		@@:
751
			cmp eax,0
752
			je .end_select
753
			mov ebx,eax
754
			cmp word[ebx],ID_ICON_POINT_SEL
755
			jne .next_sel
756
			stdcall [tl_node_poi_get_data], tree3,ebx
757
			mov eax,[eax]
758
			stdcall [glPushMatrix]
759
				stdcall [glTranslatef], [eax],[eax+4],[eax+8]
760
				stdcall [gluSphere], [qObj], [sph_radius], 4,4
761
			stdcall [glPopMatrix]
762
			dec ecx
763
			jz .end_select
764
			.next_sel:
765
			stdcall dword[tl_node_poi_get_next_info], tree3,ebx
766
			jmp @b
767
    .end_select:
768
 
5935 IgorA 769
	;рисование граней
770
	bt dword[draw_mode],bit_faces
771
	jnc .end_triangles
772
	cmp dword[obj_tri_count],0
773
	je .end_triangles
774
	cmp dword[obj_poi_count],0
775
	je .end_triangles
5938 IgorA 776
		bt dword[draw_mode],bit_faces_fill
777
		jc @f
778
			push GL_LINE
779
			jmp .end_0
780
		@@:
781
			push GL_FILL
782
		.end_0:
783
		stdcall [glPolygonMode], GL_FRONT_AND_BACK ;mode - уже в стеке
784
		stdcall [glColor3ub],[color_face+2],[color_face+1],[color_face]
5935 IgorA 785
		stdcall [glBegin],GL_TRIANGLES
786
		mov eax,[obj_tri_data]
787
		mov ecx,[obj_tri_count]
6022 IgorA 788
		mov edx,[obj_normals_tri_data]
5935 IgorA 789
		@@:
6022 IgorA 790
			;
791
			bt dword[draw_mode],bit_light
792
			jnc .norm
793
				;[obj_normals_tri_count]
794
				stdcall [glNormal3fv], edx
795
				add edx,12
796
			.norm:
797
			;
5935 IgorA 798
			movzx ebx,word[eax] ;1-я вершина
799
			imul ebx,12
800
			add ebx,[obj_poi_data]
801
			stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
802
			movzx ebx,word[eax+2] ;2-я вершина
803
			imul ebx,12
804
			add ebx,[obj_poi_data]
805
			stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
806
			movzx ebx,word[eax+4] ;3-я вершина
807
			imul ebx,12
808
			add ebx,[obj_poi_data]
809
			stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
810
			add eax,8 ;размер треугольника = (3 вершины (по 2б) + свойства (2б))
811
			dec ecx
812
			jnz @b
813
		stdcall [glEnd]
814
	.end_triangles:
815
 
5930 IgorA 816
	stdcall [glPopMatrix]
5944 IgorA 817
	cmp dword[obj_poi_sel_c],0
818
	je @f
819
		stdcall [buf2d_draw_text], buf_ogl, buf_1,txt_select_vert,5,3,[color_select]
820
	@@:
5930 IgorA 821
	stdcall [kosglSwapBuffers]
5935 IgorA 822
	.end_f:
5930 IgorA 823
	ret
824
 
2165 IgorA 825
align 4
5935 IgorA 826
SetLight:
827
	stdcall [glLightfv], GL_LIGHT0, GL_POSITION, light_position
828
	stdcall [glLightfv], GL_LIGHT0, GL_SPOT_DIRECTION, light_dir
829
 
830
	stdcall [glLightfv], GL_LIGHT0, GL_DIFFUSE, white_light
831
	stdcall [glLightfv], GL_LIGHT0, GL_SPECULAR, white_light
832
 
833
	stdcall [glEnable], GL_COLOR_MATERIAL
834
	stdcall [glColorMaterial], GL_FRONT, GL_AMBIENT_AND_DIFFUSE
835
	stdcall [glMaterialfv], GL_FRONT, GL_SPECULAR, mat_specular
836
	stdcall [glMaterialf], GL_FRONT, GL_SHININESS, mat_shininess
837
	stdcall [glLightModelfv], GL_LIGHT_MODEL_AMBIENT, lmodel_ambient
838
 
839
	stdcall [glEnable],GL_LIGHTING
840
	stdcall [glEnable],GL_LIGHT0
841
	ret
842
 
843
align 4
844
proc prop_key uses eax ebx
2165 IgorA 845
	mcall 2
5930 IgorA 846
 
847
	test word [edit1.flags],10b ;ed_focus
848
	je @f
849
		stdcall [edit_box_key], edit1
850
		jmp .end
851
	@@:
852
	test word [edit2.flags],10b
853
	je @f
854
		stdcall [edit_box_key], edit2
855
		jmp .end
856
	@@:
857
	test word [edit3.flags],10b
858
	je @f
859
		stdcall [edit_box_key], edit3
860
		jmp .end
861
	@@:
5935 IgorA 862
	cmp dword[el_focus], tree3
863
	jne @f
864
		stdcall [tl_key], tree3
865
		jmp .end
866
	@@:
5930 IgorA 867
 
868
	cmp ah,178 ;Up
869
	jne @f
870
		fld dword[angle_x]
871
		fadd dword[delt_size]
872
		fstp dword[angle_x]
873
		call draw_3d
874
		jmp .end
875
	@@:
876
	cmp ah,177 ;Down
877
	jne @f
878
		fld dword[angle_x]
879
		fsub dword[delt_size]
880
		fstp dword[angle_x]
881
		call draw_3d
882
		jmp .end
883
	@@:
884
	cmp ah,176 ;Left
885
	jne @f
886
		fld dword[angle_y]
887
		fadd dword[delt_size]
888
		fstp dword[angle_y]
889
		call draw_3d
890
		jmp .end
891
	@@:
892
	cmp ah,179 ;Right
893
	jne @f
894
		fld dword[angle_y]
895
		fsub dword[delt_size]
896
		fstp dword[angle_y]
897
		call draw_3d
898
		;jmp .end
899
	@@:
900
	.end:
2165 IgorA 901
	ret
5935 IgorA 902
endp
2165 IgorA 903
 
904
align 4
905
prop_mouse:
5938 IgorA 906
	push eax ebx
907
	mcall 37,3
908
	bt eax,0
909
	jnc .end_m
910
		;mouse l. but. move
911
		cmp dword[mouse_drag],1
912
		jne .end_m
913
		mcall 37,1 ;get mouse coords
914
		mov ebx,eax
915
		shr ebx,16 ;mouse.x
916
		cmp ebx,3d_wnd_l
917
		jg @f
918
			mov ebx,3d_wnd_l
919
		@@:
920
		sub ebx,3d_wnd_l
921
		cmp ebx,3d_wnd_w
922
		jle @f
923
			mov ebx,3d_wnd_w
924
		@@:
925
		and eax,0xffff ;mouse.y
926
		cmp eax,3d_wnd_t
927
		jg @f
928
			mov eax,3d_wnd_t
929
		@@:
930
		sub eax,3d_wnd_t
931
		cmp eax,3d_wnd_h
932
		jle @f
933
			mov eax,3d_wnd_h
934
		@@:
935
		finit
936
		fild dword[mouse_y]
937
		mov [mouse_y],eax
938
		fisub dword[mouse_y]
939
		fdiv dword[angle_dxm] ;если курсор движется по оси y (вверх или вниз) то поворот делаем вокруг оси x
940
		fadd dword[angle_x]
941
		fstp dword[angle_x]
942
 
943
		fild dword[mouse_x]
944
		mov [mouse_x],ebx
945
		fisub dword[mouse_x]
946
		fdiv dword[angle_dym] ;если курсор движется по оси x (вверх или вниз) то поворот делаем вокруг оси y
947
		fadd dword[angle_y]
948
		fstp dword[angle_y]
949
 
950
		call draw_3d
951
		jmp .end_d
952
	.end_m:
953
	bt eax,16
954
	jnc @f
955
		;mouse l. but. up
956
		mov dword[mouse_drag],0
957
		jmp .end_d
958
	@@:
959
	bt eax,8
960
	jnc .end_d
961
		;mouse l. but. press
962
		mcall 37,1 ;get mouse coords
963
		mov ebx,eax
964
		shr ebx,16 ;mouse.x
965
		cmp ebx,3d_wnd_l
966
		jl .end_d
967
		sub ebx,3d_wnd_l
968
		cmp ebx,3d_wnd_w
969
		jg .end_d
970
		and eax,0xffff ;mouse.y
971
		cmp eax,3d_wnd_t
972
		jl .end_d
973
		sub eax,3d_wnd_t
974
		cmp eax,3d_wnd_h
975
		jg .end_d
976
		mov dword[mouse_drag],1
977
		mov dword[mouse_x],ebx
978
		mov dword[mouse_y],eax
979
	.end_d:
980
 
5935 IgorA 981
	stdcall [kmainmenu_dispatch_cursorevent], [main_menu]
2165 IgorA 982
	stdcall [tl_mouse], tree3
2173 IgorA 983
	stdcall [edit_box_mouse], edit1
984
	stdcall [edit_box_mouse], edit2
985
	stdcall [edit_box_mouse], edit3
5938 IgorA 986
	pop ebx eax
2165 IgorA 987
	ret
988
 
989
align 4
990
prop_button:
991
	mcall 17 ;получить код нажатой кнопки
992
 
2173 IgorA 993
	cmp ah,3
2165 IgorA 994
	jne @f
5930 IgorA 995
		call get_point_coords
996
		call draw_3d
997
		jmp prop_still.end
2165 IgorA 998
	@@:
2173 IgorA 999
	cmp ah,4
1000
	jne @f
5911 IgorA 1001
		push eax ebx ecx edi esi
2173 IgorA 1002
		stdcall [tl_node_get_data],tree3
5911 IgorA 1003
		cmp eax,0
2173 IgorA 1004
		je .no_select_1
5911 IgorA 1005
			mov ebx,[eax]
2173 IgorA 1006
			finit
2165 IgorA 1007
 
2173 IgorA 1008
			mov esi,string1
1009
			mov edi,Data_String
1010
			cld
5930 IgorA 1011
			mov ecx,8
1012
			rep movsd
2173 IgorA 1013
			call String_to_DoubleFloat
1014
			fld  qword[Data_Double] ;считываем как double
1015
			fstp dword[ebx] ;сохраняем как float
1016
 
1017
			mov esi,string2
1018
			mov edi,Data_String
1019
			cld
5930 IgorA 1020
			mov ecx,8
1021
			rep movsd
2173 IgorA 1022
			call String_to_DoubleFloat
1023
			fld  qword[Data_Double] ;считываем как double
1024
			fstp dword[ebx+4] ;сохраняем как float
1025
 
1026
			mov esi,string3
1027
			mov edi,Data_String
1028
			cld
5930 IgorA 1029
			mov ecx,8
1030
			rep movsd
2173 IgorA 1031
			call String_to_DoubleFloat
1032
			fld  qword[Data_Double] ;считываем как double
1033
			fstp dword[ebx+8] ;сохраняем как float
1034
 
1035
			;обновление измененного узла в списке tree3 и главного окна (по таймеру)
1036
			mov word[NumberSymbolsAD],5
1037
			mov dword[obj_point],ebx
1038
			mov dword[obj_point.text],0
1039
			cld
1040
			mov ecx,3
1041
			.coord:
1042
				fld dword[ebx]
1043
				fstp qword[Data_Double]
1044
				call DoubleFloat_to_String
1045
				add ebx,4
1046
				stdcall str_len, Data_String
1047
				mov esi,txt_space
1048
				add esi,eax
1049
				cmp esi,txt_space.end
1050
				jl .normal_size
1051
					mov esi,txt_space.end-1 ;минимум 1 пробел нужно добавить, что-бы цифры не слипались
1052
				.normal_size:
1053
				stdcall str_cat, obj_point.text,esi
1054
				stdcall str_cat, obj_point.text,Data_String
1055
				loop .coord
5944 IgorA 1056
			mov byte[obj_point.text],'*' ;отмечаем что вершина изменялась
5911 IgorA 1057
			stdcall dword[tl_node_set_data], tree3,obj_point
2173 IgorA 1058
			stdcall dword[tl_draw], tree3
1059
			mov byte[can_save],1 ;для показа кнопки 'Сохранить'
1060
			mov dword[offs_last_timer],0 ;для обновления блока в таймере
5930 IgorA 1061
			call draw_3d
2173 IgorA 1062
		.no_select_1:
5911 IgorA 1063
		pop esi edi ecx ebx eax
5930 IgorA 1064
		jmp prop_still.end
2173 IgorA 1065
	@@:
5935 IgorA 1066
	cmp ah,5
1067
	jne @f
1068
		call mnu_vertexes_on_off
1069
		jmp prop_still.end
1070
	@@:
1071
	cmp ah,6
1072
	jne @f
1073
		call mnu_faces_on_off
1074
		jmp prop_still.end
1075
	@@:
1076
	cmp ah,7
1077
	jne @f
5938 IgorA 1078
		call mnu_faces_fill_on_off
1079
		jmp prop_still.end
1080
	@@:
1081
	cmp ah,8
1082
	jne @f
5935 IgorA 1083
		call mnu_light_on_off
1084
		jmp prop_still.end
1085
	@@:
5938 IgorA 1086
	cmp ah,9
1087
	jne @f
1088
		call mnu_reset_settings
1089
		jmp prop_still.end
1090
	@@:
5944 IgorA 1091
	cmp ah,10
1092
	jne @f
1093
		call mnu_vertexes_select
1094
		jmp prop_still.end
1095
	@@:
1096
	cmp ah,11
1097
	jne @f
1098
		call mnu_vertexes_deselect
1099
		jmp prop_still.end
1100
	@@:
1101
	cmp ah,12
1102
	jne @f
1103
		call mnu_reset_average_x
1104
		jmp prop_still.end
1105
	@@:
1106
	cmp ah,13
1107
	jne @f
1108
		call mnu_reset_average_y
1109
		jmp prop_still.end
1110
	@@:
1111
	cmp ah,14
1112
	jne @f
1113
		call mnu_reset_average_z
1114
		jmp prop_still.end
1115
	@@:
2173 IgorA 1116
 
2165 IgorA 1117
	cmp ah,1
5930 IgorA 1118
	jne prop_still.end
2165 IgorA 1119
.exit:
1120
	mov dword[tree3.data_img],0 ;чистим указатели на иконки что-бы их не удалил деструктор
1121
	mov dword[tree3.data_img_sys],0 ;т. к. они еще используються в других элементах
1122
	stdcall dword[tl_data_clear], tree3
6022 IgorA 1123
	stdcall mem.Free,[obj_normals_tri_data]
1124
	stdcall mem.Free,[obj_normals_poi_data]
1125
	mov dword[obj_normals_tri_data],0
1126
	mov dword[obj_normals_poi_data],0
2165 IgorA 1127
	mov byte[prop_wnd_run],0 ;обнуляем счетчик окон
1128
	mcall -1 ;выход из программы
1129
 
5930 IgorA 1130
align 4
1131
get_point_coords:
1132
	;загрузка координат в editbox-ы
1133
	push eax ebx
1134
	stdcall [tl_node_get_data],tree3
1135
	cmp eax,0
1136
	je @f
1137
		mov ebx,[eax]
1138
		mov word[NumberSymbolsAD],8
1139
		finit
1140
		fld dword[ebx]
1141
		fstp qword[Data_Double]
1142
		call DoubleFloat_to_String
1143
		stdcall [edit_box_set_text], edit1, Data_String
1144
		fld dword[ebx+4]
1145
		fstp qword[Data_Double]
1146
		call DoubleFloat_to_String
1147
		stdcall [edit_box_set_text], edit2, Data_String
1148
		fld dword[ebx+8]
1149
		fstp qword[Data_Double]
1150
		call DoubleFloat_to_String
1151
		stdcall [edit_box_set_text], edit3, Data_String
1152
		stdcall [edit_box_draw], edit1
1153
		stdcall [edit_box_draw], edit2
1154
		stdcall [edit_box_draw], edit3
1155
	@@:
1156
	pop ebx eax
1157
	ret
1158
 
1159
align 4
5935 IgorA 1160
proc prop_timer_funct uses eax
1161
	;просматриваем выделенную координату
1162
	stdcall [tl_node_get_data],tree3
1163
	cmp [cursor_last_draw],eax
1164
	je @f
1165
		mov [cursor_last_draw],eax
1166
		call draw_3d
1167
	@@:
1168
	ret
1169
endp
1170
 
5938 IgorA 1171
;изменяем режим рисования вершин
5935 IgorA 1172
align 4
1173
mnu_vertexes_on_off:
1174
	xor dword[draw_mode], 1 shl bit_vertexes
1175
	ret
1176
 
5938 IgorA 1177
;изменяем режим рисования граней
5935 IgorA 1178
align 4
1179
mnu_faces_on_off:
1180
	xor dword[draw_mode], 1 shl bit_faces
1181
	ret
1182
 
5938 IgorA 1183
;изменяем каркасные или сплошные грани
5935 IgorA 1184
align 4
5938 IgorA 1185
mnu_faces_fill_on_off:
1186
	xor dword[draw_mode], 1 shl bit_faces_fill
1187
	or  dword[draw_mode], 1 shl bit_faces ;включаем режим рисования граней (если вдруг был отключен)
1188
	ret
1189
 
1190
;включаем или отключаем освещение
1191
align 4
5935 IgorA 1192
mnu_light_on_off:
1193
	xor dword[draw_mode], 1 shl bit_light
1194
	ret
1195
 
1196
align 4
5938 IgorA 1197
mnu_reset_settings:
1198
	mov dword[angle_x],0.0
1199
	mov dword[angle_y],0.0
1200
	mov dword[angle_z],0.0
1201
	m2m dword[draw_mode],dword[def_dr_mode]
1202
	ret
1203
 
1204
align 4
5944 IgorA 1205
proc mnu_vertexes_select uses eax ebx
1206
	stdcall [tl_node_get_data],tree3
1207
	cmp eax,0
1208
	je .no_points
1209
	stdcall found_block_data,tree3
1210
	cmp eax,0
1211
	je .no_points
1212
		mov bx,word[eax]
1213
		cmp bx,ID_ICON_POINT_SEL
1214
		je @f
1215
			mov word[eax],ID_ICON_POINT_SEL
1216
			inc dword[obj_poi_sel_c]
1217
			jmp .change
1218
		@@:
1219
			mov word[eax],ID_ICON_POINT
1220
			dec dword[obj_poi_sel_c]
1221
		.change:
1222
			mov eax,[obj_poi_sel_c]
1223
			stdcall convert_int_to_str, txt_select_vert.count,16
1224
	.no_points:
1225
	ret
1226
endp
1227
 
1228
align 4
1229
proc mnu_vertexes_deselect uses eax
1230
	cmp dword[obj_poi_sel_c],0
1231
	je .no_points
1232
	mov dword[obj_poi_sel_c],0
1233
	stdcall [tl_node_poi_get_info], tree3,0
1234
	cmp eax,0
1235
	je .no_points
1236
	@@:
1237
		mov word[eax],ID_ICON_POINT
1238
		stdcall [tl_node_poi_get_next_info], tree3,eax
1239
		cmp eax,0
1240
		jne @b
1241
	.no_points:
1242
	ret
1243
endp
1244
 
1245
align 4
1246
proc mnu_reset_average_x uses eax ebx ecx edx edi
1247
	cmp dword[obj_poi_sel_c],2
1248
	jl .end_select
1249
		finit
1250
		fldz
1251
		mov ecx,dword[obj_poi_sel_c]
1252
		stdcall dword[tl_node_poi_get_info], tree3,0
1253
		@@:
1254
			cmp eax,0
1255
			je .end_select
1256
			mov ebx,eax
1257
			cmp word[ebx],ID_ICON_POINT_SEL
1258
			jne .next_sel0
1259
				stdcall [tl_node_poi_get_data], tree3,ebx
1260
				mov eax,[eax]
1261
				fadd dword[eax]
1262
				dec ecx
1263
				jz @f
1264
			.next_sel0:
1265
			stdcall dword[tl_node_poi_get_next_info], tree3,ebx
1266
			jmp @b
1267
		@@:
1268
		fidiv dword[obj_poi_sel_c]
1269
		fstp dword[eax]
1270
		mov edx,[eax]
1271
		mov ecx,dword[obj_poi_sel_c]
1272
		stdcall dword[tl_node_poi_get_info], tree3,0
1273
		@@:
1274
			cmp eax,0
1275
			je .end_select
1276
			mov ebx,eax
1277
			cmp word[ebx],ID_ICON_POINT_SEL
1278
			jne .next_sel1
1279
				stdcall [tl_node_poi_get_data], tree3,ebx
1280
				mov edi,eax
1281
				mov eax,[eax]
1282
				mov [eax],edx
1283
				stdcall update_tree, edi
1284
				dec ecx
1285
				jz @f
1286
			.next_sel1:
1287
			stdcall dword[tl_node_poi_get_next_info], tree3,ebx
1288
			jmp @b
1289
		@@:
1290
    .end_select:
1291
	ret
1292
endp
1293
 
1294
align 4
1295
proc mnu_reset_average_y uses eax ebx ecx edx edi
1296
	cmp dword[obj_poi_sel_c],2
1297
	jl .end_select
1298
		finit
1299
		fldz
1300
		mov ecx,dword[obj_poi_sel_c]
1301
		stdcall dword[tl_node_poi_get_info], tree3,0
1302
		@@:
1303
			cmp eax,0
1304
			je .end_select
1305
			mov ebx,eax
1306
			cmp word[ebx],ID_ICON_POINT_SEL
1307
			jne .next_sel0
1308
				stdcall [tl_node_poi_get_data], tree3,ebx
1309
				mov eax,[eax]
1310
				fadd dword[eax+4]
1311
				dec ecx
1312
				jz @f
1313
			.next_sel0:
1314
			stdcall dword[tl_node_poi_get_next_info], tree3,ebx
1315
			jmp @b
1316
		@@:
1317
		fidiv dword[obj_poi_sel_c]
1318
		fstp dword[eax+4]
1319
		mov edx,[eax+4]
1320
		mov ecx,dword[obj_poi_sel_c]
1321
		stdcall dword[tl_node_poi_get_info], tree3,0
1322
		@@:
1323
			cmp eax,0
1324
			je .end_select
1325
			mov ebx,eax
1326
			cmp word[ebx],ID_ICON_POINT_SEL
1327
			jne .next_sel1
1328
				stdcall [tl_node_poi_get_data], tree3,ebx
1329
				mov edi,eax
1330
				mov eax,[eax]
1331
				mov [eax+4],edx
1332
				stdcall update_tree, edi
1333
				dec ecx
1334
				jz @f
1335
			.next_sel1:
1336
			stdcall dword[tl_node_poi_get_next_info], tree3,ebx
1337
			jmp @b
1338
		@@:
1339
    .end_select:
1340
	ret
1341
endp
1342
 
1343
align 4
1344
proc mnu_reset_average_z uses eax ebx ecx edx edi
1345
	cmp dword[obj_poi_sel_c],2
1346
	jl .end_select
1347
		finit
1348
		fldz
1349
		mov ecx,dword[obj_poi_sel_c]
1350
		stdcall dword[tl_node_poi_get_info], tree3,0
1351
		@@:
1352
			cmp eax,0
1353
			je .end_select
1354
			mov ebx,eax
1355
			cmp word[ebx],ID_ICON_POINT_SEL
1356
			jne .next_sel0
1357
				stdcall [tl_node_poi_get_data], tree3,ebx
1358
				mov eax,[eax]
1359
				fadd dword[eax+8]
1360
				dec ecx
1361
				jz @f
1362
			.next_sel0:
1363
			stdcall dword[tl_node_poi_get_next_info], tree3,ebx
1364
			jmp @b
1365
		@@:
1366
		fidiv dword[obj_poi_sel_c]
1367
		fstp dword[eax+8]
1368
		mov edx,[eax+8]
1369
		mov ecx,dword[obj_poi_sel_c]
1370
		stdcall dword[tl_node_poi_get_info], tree3,0
1371
		@@:
1372
			cmp eax,0
1373
			je .end_select
1374
			mov ebx,eax
1375
			cmp word[ebx],ID_ICON_POINT_SEL
1376
			jne .next_sel1
1377
				stdcall [tl_node_poi_get_data], tree3,ebx
1378
				mov edi,eax
1379
				mov eax,[eax]
1380
				mov [eax+8],edx
1381
				stdcall update_tree, edi
1382
				dec ecx
1383
				jz @f
1384
			.next_sel1:
1385
			stdcall dword[tl_node_poi_get_next_info], tree3,ebx
1386
			jmp @b
1387
		@@:
1388
    .end_select:
1389
	ret
1390
endp
1391
 
1392
align 4
1393
proc update_tree h_mem:dword
1394
pushad
1395
	mov edi,[h_mem]
1396
	mov ebx,[edi]
1397
	finit
1398
 
1399
	;обновление измененного узла в списке tree3 и главного окна (по таймеру)
1400
	mov word[NumberSymbolsAD],5
1401
	mov dword[obj_point.text],0
1402
	cld
1403
	mov ecx,3
1404
	.coord:
1405
		fld dword[ebx]
1406
		fstp qword[Data_Double]
1407
		call DoubleFloat_to_String
1408
		add ebx,4
1409
		stdcall str_len, Data_String
1410
		mov esi,txt_space
1411
		add esi,eax
1412
		cmp esi,txt_space.end
1413
		jl .normal_size
1414
			mov esi,txt_space.end-1 ;минимум 1 пробел нужно добавить, что-бы цифры не слипались
1415
		.normal_size:
1416
		stdcall str_cat, obj_point.text,esi
1417
		stdcall str_cat, obj_point.text,Data_String
1418
		loop .coord
1419
	mov esi,obj_point.text
1420
	mov byte[esi],'*' ;отмечаем что вершина изменялась
1421
	mov byte[can_save],1 ;для показа кнопки 'Сохранить'
1422
	add edi,4
1423
	mov ecx,MAX_OBJECT_SIZE-4
1424
	rep movsb
1425
popad
1426
	ret
1427
endp
1428
 
1429
align 4
5938 IgorA 1430
def_dr_mode dd 0 ;режим рисования по умолчанию
1431
delt_size dd 3.0 ;изменение углов при поворотах с кливиатуры
1432
mouse_drag dd 0 ;режим поворота сцены от перемещении курсора мыши
1433
mouse_x dd 0
1434
mouse_y dd 0
1435
angle_dxm dd 1.7775 ;~ 3d_wnd_w/180 - прибавление углов поворота сцены при вращении мышей
1436
angle_dym dd 1.3335 ;~ 3d_wnd_h/180
5948 IgorA 1437
ratio dd 1.3333 ;~ 3d_wnd_w/3d_wnd_h
5938 IgorA 1438
;angle_dzm dd ?
1439
draw_mode dd 0 ;режим рисования объекта
5935 IgorA 1440
obj_poi_data dd 0 ;указатель на координаты вершин
1441
obj_poi_count dd 0 ;колличество вершин
5944 IgorA 1442
obj_poi_sel_c dd 0 ;колличество выделенных вершин
5935 IgorA 1443
obj_tri_data dd 0 ;указатель на данные треугольников
1444
obj_tri_count dd 0 ;колличество треугольников
1445
cursor_last_draw dd 0 ;положение курсора при последней прорисовке 3d окна
5930 IgorA 1446
sph_radius dd 0 ;радиус сферы для выделения активной точки
6022 IgorA 1447
 
1448
obj_normals_poi_data dd 0
1449
obj_normals_poi_count dd 0
1450
obj_normals_tri_data dd 0
1451
obj_normals_tri_count dd 0
1452
 
5930 IgorA 1453
obj_x_max dd 0
1454
obj_x_min dd 0
1455
obj_x_centr dd 0
1456
obj_x_scale dd 1.0
1457
obj_y_max dd 0
1458
obj_y_min dd 0
1459
obj_y_centr dd 0
1460
obj_y_scale dd 1.0
1461
obj_z_max dd 0
1462
obj_z_min dd 0
1463
obj_z_centr dd 0
1464
obj_z_scale dd 1.0
1465
 
4332 IgorA 1466
capt_p dd 0
1467
 
2165 IgorA 1468
;дерево с объектами в пользовательском файле
5930 IgorA 1469
tree3 tree_list MAX_OBJECT_SIZE,3, tl_key_no_edit+tl_list_box_mode,\
5935 IgorA 1470
	16,16, 0xffffff,0xb0d0ff,0x400040, 5,290,303,140, 16, 4,0, el_focus,\
5930 IgorA 1471
	w_scr_t3,get_point_coords
2165 IgorA 1472
 
5935 IgorA 1473
edit1 edit_box 80,  76, 269, 0xffd0d0, 0xff, 0x80ff, 0, 0x8000, 34, string1, mouse_dd, 0
1474
edit2 edit_box 80, 160, 269, 0xd0d0ff, 0xff, 0x80ff, 0, 0x8000, 34, string2, mouse_dd, 0
1475
edit3 edit_box 80, 244, 269, 0xd0ffd0, 0xff, 0x80ff, 0, 0x8000, 34, string3, mouse_dd, 0
2173 IgorA 1476
editboxes_end:
1477
 
1478
string1 rb 34
1479
string2 rb 34
1480
string3 rb 34
1481
 
2165 IgorA 1482
align 4
5930 IgorA 1483
w_scr_t3 scrollbar 16, 0,0,0, 15, 100,0,0, 0,0,0, 1