Subversion Repositories Kolibri OS

Rev

Rev 5935 | Rev 5944 | 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
32
 
2165 IgorA 33
prop_wnd_run db 0 ;переменная следящая за тем что-бы не запускать больше 1-го окна со свойствами одновременно
34
 
2173 IgorA 35
txt_q db '?',0
2165 IgorA 36
txt_space:
37
	db SIZE_ONE_FLOAT dup(' ')
38
.end:
39
	db 0
40
 
5930 IgorA 41
rad_c dd 150 ;для вычисления радиуса
42
 
2165 IgorA 43
obj_point: ;добавляемый объект
44
	dd 0   ;указатель
45
.text:
46
	rb MAX_OBJECT_SIZE
47
 
48
 
49
 
50
;даное окно (процесс) вызываеться функцией but_wnd_coords
51
align 4
52
prop_start:
53
pushad
54
	mcall 40,0x27 ;маска ожидаемых событий
55
	inc byte[prop_wnd_run]
5930 IgorA 56
	mov dword[w_scr_t3.type],1
5935 IgorA 57
	call prop_wnd_clear_param
2165 IgorA 58
 
59
	stdcall [tl_node_get_data],tree1
60
	xor edx,edx
4332 IgorA 61
	mov dword[capt_p],txt_q
5911 IgorA 62
	cmp eax,0
4332 IgorA 63
	je .no_points
5935 IgorA 64
		mov ebx,[eax] ;получаем значение сдвига выбранного блока
5938 IgorA 65
		add ebx,[open_file_data]
2165 IgorA 66
 
5938 IgorA 67
		cmp word[ebx],CHUNK_OBJBLOCK
68
		jne .end_oblo
69
			mov dword[capt_p],txt_4000
70
			call found_block_data
71
			cmp eax,0
72
			je .no_points
73
			mov esi,eax
74
			movzx ecx,byte[esi+2] ;cl - уровень выбранного узла
75
			.cycle_0:
76
				stdcall [tl_node_poi_get_next_info], tree1,esi
77
				cmp eax,0
78
				je .no_points
79
				cmp byte[eax+2],cl
80
				jle .no_points
81
				mov esi,eax
82
				stdcall [tl_node_poi_get_data], tree1,esi
83
				mov ebx,[eax]
84
				add ebx,[open_file_data]
85
				cmp word[ebx],CHUNK_VERTLIST
86
				je .ini_vlist
87
				jmp .cycle_0
88
			jmp .no_points
89
		.end_oblo:
90
		cmp word[ebx],CHUNK_TRIMESH
91
		jne .end_trim
92
			mov dword[capt_p],txt_4100
93
			call found_block_data
94
			cmp eax,0
95
			je .no_points
96
			mov esi,eax
97
			movzx ecx,byte[esi+2] ;cl - уровень выбранного узла
98
			.cycle_1:
99
				stdcall [tl_node_poi_get_next_info], tree1,esi
100
				cmp eax,0
101
				je .no_points
102
				cmp byte[eax+2],cl
103
				jle .no_points
104
				mov esi,eax
105
				stdcall [tl_node_poi_get_data], tree1,esi
106
				mov ebx,[eax]
107
				add ebx,[open_file_data]
108
				cmp word[ebx],CHUNK_VERTLIST
109
				je .ini_vlist
110
				jmp .cycle_1
111
			jmp .no_points
112
		.end_trim:
4332 IgorA 113
		cmp word[ebx],CHUNK_VERTLIST
5935 IgorA 114
		jne .end_vlist
5938 IgorA 115
			mov dword[capt_p],txt_4110
116
			.ini_vlist:
4332 IgorA 117
			movzx edx,word[ebx+6] ;колличество точек
118
			add ebx,8
5935 IgorA 119
			;поиск данных для треугольков
5938 IgorA 120
			call found_block_data
121
			cmp eax,0
122
			je .set_points
123
			mov esi,eax
5935 IgorA 124
			;если нашли выбранный узел, то далее пытаемся найти узел с треугольниками
125
			movzx ecx,byte[esi+2] ;cl - уровень выбранного узла
5938 IgorA 126
			.cycle_2:
5935 IgorA 127
				stdcall [tl_node_poi_get_next_info], tree1,esi
128
				cmp eax,0
129
				je .set_points
130
				mov esi,eax
131
				stdcall [tl_node_poi_get_data], tree1,esi
132
				cmp byte[esi+2],cl
133
				jl .set_points
134
				je .found
5938 IgorA 135
				jmp .cycle_2
5935 IgorA 136
			.found: ;если нашли узел тогоже уровня что и выбранный узел
137
				cmp eax,0
138
				je .set_points
139
				mov eax,[eax]
5938 IgorA 140
				add eax,[open_file_data]
5935 IgorA 141
				cmp word[eax],CHUNK_FACELIST
5938 IgorA 142
				jne .cycle_2
5935 IgorA 143
				movzx ecx,word[eax+6]
144
				mov [obj_tri_count],ecx
145
				add eax,8 ;2+4+2 (chunk+size+count)
146
				mov [obj_tri_data],eax
147
			jmp .set_points
148
		.end_vlist:
149
		cmp word[ebx],CHUNK_TRACKPIVOT
4332 IgorA 150
		jne @f
151
			inc edx
152
			add ebx,6
153
			mov dword[capt_p],txt_b013
5935 IgorA 154
			jmp .set_points
4332 IgorA 155
		@@:
156
		cmp word[ebx],0xb014
157
		jne @f
158
			mov edx,2
159
			add ebx,6
160
			mov dword[capt_p],txt_b014
5935 IgorA 161
			;jmp .set_points
4332 IgorA 162
		@@:
5935 IgorA 163
		.set_points:
164
		mov [obj_poi_data],ebx
165
		mov [obj_poi_count],edx
4332 IgorA 166
	.no_points:
167
 
2165 IgorA 168
	;настройка списка объектов
169
	mov dword[tree3.info_max_count],2
170
	add dword[tree3.info_max_count],edx ;ставим число узлов, равное колличеству точек (+2 на начало и конец списка)
171
	stdcall dword[tl_data_init], tree3
172
	mov eax,dword[icon_tl_sys]
173
	mov dword[tree3.data_img_sys],eax
174
	mov eax,dword[icon_toolbar]
175
	mov dword[tree3.data_img],eax
176
 
4332 IgorA 177
	cmp edx,0
2165 IgorA 178
	je .no_object
2173 IgorA 179
		mov word[NumberSymbolsAD],5
2165 IgorA 180
		finit
181
		.new_point:
182
			mov dword[obj_point],ebx
183
			mov dword[obj_point.text],0
184
			cld
185
			mov ecx,3
186
			@@:
187
				fld dword[ebx]
188
				fstp qword[Data_Double]
189
				call DoubleFloat_to_String
190
				add ebx,4
191
				stdcall str_len, Data_String
192
				mov esi,txt_space
193
				add esi,eax
194
				cmp esi,txt_space.end
195
				jl .normal_size
196
					mov esi,txt_space.end-1 ;минимум 1 пробел нужно добавить, что-бы цифры не слипались
197
				.normal_size:
198
				stdcall str_cat, obj_point.text,esi
199
				stdcall str_cat, obj_point.text,Data_String
200
				loop @b
5911 IgorA 201
			stdcall dword[tl_node_add], tree3,(ID_ICON_DATA shl 16),obj_point
2165 IgorA 202
			stdcall dword[tl_cur_next], tree3
203
			dec edx
204
			cmp edx,0
205
			jg .new_point
206
			stdcall dword[tl_cur_beg], tree3
207
	.no_object:
5930 IgorA 208
	call obj_set_sizes
2173 IgorA 209
	edit_boxes_set_sys_color edit1,editboxes_end,sc ;установка системных цветов
210
	stdcall [edit_box_set_text], edit1, txt_q
211
	stdcall [edit_box_set_text], edit2, txt_q
212
	stdcall [edit_box_set_text], edit3, txt_q
5938 IgorA 213
	mov eax,0xc0c0c0
214
	mov ebx,[color_ox]
215
	shr ebx,2
216
	and ebx,0x3f3f3f
217
	add eax,ebx
218
	mov [edit1.color],eax
219
	mov eax,0xc0c0c0
220
	mov ebx,[color_oy]
221
	shr ebx,2
222
	and ebx,0x3f3f3f
223
	add eax,ebx
224
	mov [edit2.color],eax
225
	mov eax,0xc0c0c0
226
	mov ebx,[color_oz]
227
	shr ebx,2
228
	and ebx,0x3f3f3f
229
	add eax,ebx
230
	mov [edit3.color],eax
2165 IgorA 231
popad
232
 
5930 IgorA 233
	call prop_red_win
234
 
235
;не отрывать эту функцию от предыдущей
2165 IgorA 236
align 4
5930 IgorA 237
prop_still:
238
	pushad
239
 
5935 IgorA 240
	mcall 23,10
241
	or eax,eax
242
	jnz @f
243
		call prop_timer_funct
244
		jmp .end
245
	@@:
246
 
5930 IgorA 247
	cmp al,1 ;изм. положение окна
248
	jne @f
249
		call prop_red_win
250
		jmp .end
251
	@@:
252
	cmp al,2
253
	jne @f
254
		call prop_key
255
		jmp .end
256
	@@:
257
	cmp al,3
258
	jz prop_button
259
	cmp al,6
260
	jne @f
261
		call prop_mouse
262
	@@:
263
.end:
264
	popad
265
	jmp prop_still
266
 
267
align 4
2165 IgorA 268
prop_red_win:
269
pushad
270
	mcall 12,1
271
 
272
	xor eax,eax
4332 IgorA 273
	mov edi,dword[capt_p] ;children window caption
2165 IgorA 274
	mov bx,word[procinfo.box.left]
275
	add bx,word[buf_0.l]
5930 IgorA 276
	add bx,5 ;ширина боковой рамки
2165 IgorA 277
	shl ebx,16
278
	mov bx,prop_wnd_width
279
	mov cx,word[procinfo.box.top]
2173 IgorA 280
	add cx,word[buf_0.t]
2165 IgorA 281
	shl ecx,16
5930 IgorA 282
	mov cx,prop_wnd_height
5938 IgorA 283
	mov edx,[sc.work]
284
	or  edx,0x33000000
2165 IgorA 285
	int 0x40
286
 
2173 IgorA 287
	mov esi,[sc.work_button]
5935 IgorA 288
	mcall 8, (5 shl 16)+20, (266 shl 16)+20, 3
289
	mcall , (30 shl 16)+20, (266 shl 16)+20, 4
2173 IgorA 290
 
291
	mov ebx,[image_data_toolbar]
5938 IgorA 292
	add ebx,3*IMAGE_TOOLBAR_ICON_SIZE
5935 IgorA 293
	mcall 7, , (16 shl 16)+16, (7 shl 16)+268 ;load
2173 IgorA 294
 
295
	sub ebx,IMAGE_TOOLBAR_ICON_SIZE
5935 IgorA 296
	mov edx,(32 shl 16)+268 ;save
2173 IgorA 297
	int 0x40
298
 
2165 IgorA 299
	mov dword[w_scr_t3.all_redraw],1
300
	stdcall [scrollbar_ver_draw],dword w_scr_t3
301
	stdcall [tl_draw], tree3
2173 IgorA 302
	stdcall [edit_box_draw], edit1
303
	stdcall [edit_box_draw], edit2
304
	stdcall [edit_box_draw], edit3
5930 IgorA 305
 
5935 IgorA 306
	stdcall [kmainmenu_draw], [main_menu]
5930 IgorA 307
	call draw_3d
2165 IgorA 308
	mcall 12,2
309
popad
5930 IgorA 310
	ret
2165 IgorA 311
 
5935 IgorA 312
;установка всех основных переменных по умолчанию
2165 IgorA 313
align 4
5935 IgorA 314
prop_wnd_clear_param:
5938 IgorA 315
	;установка параметров отображения
316
	call mnu_reset_settings
317
 
318
	;обнуление указателей на данные объектов
5935 IgorA 319
	mov dword[obj_poi_data],0
320
	mov dword[obj_poi_count],0
321
	mov dword[obj_tri_data],0
322
	mov dword[obj_tri_count],0
323
	ret
324
 
5938 IgorA 325
;поиск данных
326
;input:
327
;eax - текущий узел
328
;output:
329
;eax - структура текущего узла (или 0 при неудаче)
330
align 4
331
found_block_data:
332
push ebx ecx
333
	mov ecx,eax
334
	stdcall [tl_node_poi_get_info], tree1,0
335
	@@:
336
		mov ebx,eax
337
		stdcall [tl_node_poi_get_data], tree1,ebx
338
		cmp eax,ecx
339
		je @f ;если попали на выбранный узел
340
		stdcall [tl_node_poi_get_next_info], tree1,ebx
341
		cmp eax,0
342
		jne @b
343
		jmp .end
344
	@@:
345
		mov eax,ebx
346
	.end:
347
pop ecx ebx
348
	ret
349
 
5935 IgorA 350
;установка размеров объекта
351
align 4
5930 IgorA 352
proc obj_set_sizes uses eax ebx esi
5935 IgorA 353
	cmp dword[obj_poi_count],0
5930 IgorA 354
	je .end
355
		finit
5935 IgorA 356
		mov eax,[obj_poi_data]
5930 IgorA 357
		mov ebx,dword[eax]
358
		mov [obj_x_min],ebx
359
		mov [obj_x_max],ebx
360
		mov ebx,dword[eax+4]
361
		mov [obj_y_min],ebx
362
		mov [obj_y_max],ebx
363
		mov ebx,dword[eax+8]
364
		mov [obj_z_min],ebx
365
		mov [obj_z_max],ebx
2165 IgorA 366
 
5935 IgorA 367
	mov ebx,[obj_poi_data]
368
	mov esi,[obj_poi_count]
5930 IgorA 369
align 4
370
	.cycle_0: ;работа с координатой x
371
		fld dword[ebx]
372
		fld dword[obj_x_min]
373
		fcomp
374
		fstsw ax
375
		sahf
376
		jb @f
377
			mov eax,[ebx]
378
			mov [obj_x_min],eax
379
			ffree st0
380
			fincstp
381
			jmp .next_x
382
		@@:
383
		fld dword[obj_x_max]
384
		fcompp
385
		fstsw ax
386
		sahf
387
		ja .next_x
388
			mov eax,[ebx]
389
			mov [obj_x_max],eax
390
		.next_x:
391
 
5935 IgorA 392
		add ebx,12
393
		dec esi
394
		jnz .cycle_0
5930 IgorA 395
 
396
		fld1
397
		fld dword[obj_x_max]
398
		fsub dword[obj_x_min]
399
		fst dword[obj_x_centr]
400
		fdivp ;1/size.x
401
		fstp dword[obj_x_scale]
402
 
403
		fld dword[obj_x_centr]
404
		fld1
405
		fld1
406
		faddp
407
		fdivp ;centr.x = size.x/2
408
		fadd dword[obj_x_min]
409
		fchs
410
		fstp dword[obj_x_centr]
411
 
5935 IgorA 412
	mov ebx,[obj_poi_data]
413
	mov esi,[obj_poi_count]
5930 IgorA 414
align 4
415
	.cycle_1: ;работа с координатой y
416
		fld dword[ebx+4]
417
		fld dword[obj_y_min]
418
		fcomp
419
		fstsw ax
420
		sahf
421
		jb @f
422
			mov eax,[ebx+4]
423
			mov [obj_y_min],eax
424
			ffree st0
425
			fincstp
426
			jmp .next_y
427
		@@:
428
		fld dword[obj_y_max]
429
		fcompp
430
		fstsw ax
431
		sahf
432
		ja .next_y
433
			mov eax,[ebx+4]
434
			mov [obj_y_max],eax
435
		.next_y:
436
 
5935 IgorA 437
		add ebx,12
438
		dec esi
439
		jnz .cycle_1
5930 IgorA 440
 
441
		fld1
442
		fld dword[obj_y_max]
443
		fsub dword[obj_y_min]
444
		fst dword[obj_y_centr]
445
		fdivp ;1/size.y
446
		fstp dword[obj_y_scale]
447
 
448
		fld dword[obj_y_centr]
449
		fld1
450
		fld1
451
		faddp
452
		fdivp ;centr.y = size.y/2
453
		fadd dword[obj_y_min]
454
		fchs
455
		fstp dword[obj_y_centr]
456
 
5935 IgorA 457
	mov ebx,[obj_poi_data]
458
	mov esi,[obj_poi_count]
5930 IgorA 459
align 4
460
	.cycle_2: ;работа с координатой z
461
		fld dword[ebx+8]
462
		fld dword[obj_z_min]
463
		fcomp
464
		fstsw ax
465
		sahf
466
		jb @f
467
			mov eax,[ebx+8]
468
			mov [obj_z_min],eax
469
			ffree st0
470
			fincstp
471
			jmp .next_z
472
		@@:
473
		fld dword[obj_z_max]
474
		fcompp
475
		fstsw ax
476
		sahf
477
		ja .next_z
478
			mov eax,[ebx+8]
479
			mov [obj_z_max],eax
480
		.next_z:
481
 
5935 IgorA 482
		add ebx,12
483
		dec esi
484
		jnz .cycle_2
5930 IgorA 485
 
486
		fld1
487
		fld dword[obj_z_max]
488
		fsub dword[obj_z_min]
489
		fst dword[obj_z_centr]
490
		fdivp ;1/size.z
491
		fstp dword[obj_z_scale]
492
 
493
		fld dword[obj_z_centr]
494
		fld1
495
		fld1
496
		faddp
497
		fdivp ;centr.z = size.z/2
498
		fadd dword[obj_z_min]
499
		fchs
500
		fstp dword[obj_z_centr]
501
 
502
		;находим радиус для сферы
503
		fld dword[obj_x_max]
504
		fsub dword[obj_x_min]
505
		fld dword[obj_y_max]
506
		fsub dword[obj_y_min]
507
		faddp
508
		fild dword[rad_c]
509
		fdivp ;radius=(size.x+size.y)/rad_c
510
		fstp dword[sph_radius]
511
	.end:
512
	ret
513
endp
514
 
515
;рисование точек в 3d
516
align 4
517
draw_3d:
5935 IgorA 518
	cmp dword[obj_poi_count],2
519
	jl .end_f
5930 IgorA 520
	stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;очистим буфер цвета и глубины
521
	stdcall [glPushMatrix]
5935 IgorA 522
	bt dword[draw_mode],bit_light
523
	jnc @f
524
		call SetLight
525
		jmp .end_l
526
	@@:
527
		stdcall [glDisable],GL_LIGHTING
528
	.end_l:
5930 IgorA 529
	stdcall [glTranslatef], 0.0,0.0,0.5 ;correct for z
530
	stdcall [glScalef], [obj_x_scale],[obj_y_scale],[obj_z_scale]
531
	stdcall [glScalef], 1.0,1.0,0.7 ;correct for z
532
	stdcall [glRotatef], [angle_z],0.0,0.0,1.0
533
	stdcall [glRotatef], [angle_y],0.0,1.0,0.0
534
	stdcall [glRotatef], [angle_x],1.0,0.0,0.0
535
	stdcall [glTranslatef], [obj_x_centr],[obj_y_centr],[obj_z_centr]
536
 
5935 IgorA 537
	;рисование точек
538
	bt dword[draw_mode],bit_vertexes
539
	jnc .end_points
5938 IgorA 540
		stdcall [glColor3ub],[color_vert+2],[color_vert+1],[color_vert]
5935 IgorA 541
		stdcall [glBegin],GL_POINTS
542
		mov eax,[obj_poi_data]
543
		mov ebx,[obj_poi_count]
544
		@@:
545
			stdcall [glVertex3f], [eax],[eax+4],[eax+8]
546
			add eax,12
547
			dec ebx
548
			jnz @b
549
		stdcall [glEnd]
550
	.end_points:
5930 IgorA 551
 
5935 IgorA 552
	;рисование выделенной точки
5930 IgorA 553
	stdcall [tl_node_get_data],tree3
554
	cmp eax,0
555
	je @f
556
		;выделение активной точки
557
		mov eax,[eax]
558
 
559
		stdcall [glBegin],GL_LINES
5938 IgorA 560
		stdcall [glColor3ub],[color_ox+2],[color_ox+1],[color_ox]
5930 IgorA 561
		stdcall [glVertex3f], [obj_x_min],[eax+4],[eax+8]
562
		stdcall [glVertex3f], [obj_x_max],[eax+4],[eax+8]
5938 IgorA 563
		stdcall [glColor3ub],[color_oy+2],[color_oy+1],[color_oy]
5930 IgorA 564
		stdcall [glVertex3f], [eax],[obj_y_min],[eax+8]
565
		stdcall [glVertex3f], [eax],[obj_y_max],[eax+8]
5938 IgorA 566
		stdcall [glColor3ub],[color_oz+2],[color_oz+1],[color_oz]
5930 IgorA 567
		stdcall [glVertex3f], [eax],[eax+4],[obj_z_min]
568
		stdcall [glVertex3f], [eax],[eax+4],[obj_z_max]
569
		stdcall [glEnd]
570
 
571
		stdcall [glColor3f], 1.0, 1.0, 0.0
5935 IgorA 572
		stdcall [glPushMatrix]
573
			stdcall [glTranslatef], [eax],[eax+4],[eax+8]
574
			stdcall [gluSphere], [qObj], [sph_radius], 8,8
575
		stdcall [glPopMatrix]
5930 IgorA 576
	@@:
577
 
5935 IgorA 578
	;рисование граней
579
	bt dword[draw_mode],bit_faces
580
	jnc .end_triangles
581
	cmp dword[obj_tri_count],0
582
	je .end_triangles
583
	cmp dword[obj_poi_count],0
584
	je .end_triangles
5938 IgorA 585
		bt dword[draw_mode],bit_faces_fill
586
		jc @f
587
			push GL_LINE
588
			jmp .end_0
589
		@@:
590
			push GL_FILL
591
		.end_0:
592
		stdcall [glPolygonMode], GL_FRONT_AND_BACK ;mode - уже в стеке
593
		stdcall [glColor3ub],[color_face+2],[color_face+1],[color_face]
5935 IgorA 594
		stdcall [glBegin],GL_TRIANGLES
595
		mov eax,[obj_tri_data]
596
		mov ecx,[obj_tri_count]
597
		@@:
598
			movzx ebx,word[eax] ;1-я вершина
599
			imul ebx,12
600
			add ebx,[obj_poi_data]
601
			stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
602
			movzx ebx,word[eax+2] ;2-я вершина
603
			imul ebx,12
604
			add ebx,[obj_poi_data]
605
			stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
606
			movzx ebx,word[eax+4] ;3-я вершина
607
			imul ebx,12
608
			add ebx,[obj_poi_data]
609
			stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
610
			add eax,8 ;размер треугольника = (3 вершины (по 2б) + свойства (2б))
611
			dec ecx
612
			jnz @b
613
		stdcall [glEnd]
614
	.end_triangles:
615
 
5930 IgorA 616
	stdcall [glPopMatrix]
617
	stdcall [kosglSwapBuffers]
5935 IgorA 618
	.end_f:
5930 IgorA 619
	ret
620
 
2165 IgorA 621
align 4
5935 IgorA 622
SetLight:
623
	stdcall [glLightfv], GL_LIGHT0, GL_POSITION, light_position
624
	stdcall [glLightfv], GL_LIGHT0, GL_SPOT_DIRECTION, light_dir
625
 
626
	stdcall [glLightfv], GL_LIGHT0, GL_DIFFUSE, white_light
627
	stdcall [glLightfv], GL_LIGHT0, GL_SPECULAR, white_light
628
 
629
	stdcall [glEnable], GL_COLOR_MATERIAL
630
	stdcall [glColorMaterial], GL_FRONT, GL_AMBIENT_AND_DIFFUSE
631
	stdcall [glMaterialfv], GL_FRONT, GL_SPECULAR, mat_specular
632
	stdcall [glMaterialf], GL_FRONT, GL_SHININESS, mat_shininess
633
	stdcall [glLightModelfv], GL_LIGHT_MODEL_AMBIENT, lmodel_ambient
634
 
635
	stdcall [glEnable],GL_LIGHTING
636
	stdcall [glEnable],GL_LIGHT0
637
	ret
638
 
639
align 4
640
proc prop_key uses eax ebx
2165 IgorA 641
	mcall 2
5930 IgorA 642
 
643
	test word [edit1.flags],10b ;ed_focus
644
	je @f
645
		stdcall [edit_box_key], edit1
646
		jmp .end
647
	@@:
648
	test word [edit2.flags],10b
649
	je @f
650
		stdcall [edit_box_key], edit2
651
		jmp .end
652
	@@:
653
	test word [edit3.flags],10b
654
	je @f
655
		stdcall [edit_box_key], edit3
656
		jmp .end
657
	@@:
5935 IgorA 658
	cmp dword[el_focus], tree3
659
	jne @f
660
		stdcall [tl_key], tree3
661
		jmp .end
662
	@@:
5930 IgorA 663
 
664
	cmp ah,178 ;Up
665
	jne @f
666
		fld dword[angle_x]
667
		fadd dword[delt_size]
668
		fstp dword[angle_x]
669
		call draw_3d
670
		jmp .end
671
	@@:
672
	cmp ah,177 ;Down
673
	jne @f
674
		fld dword[angle_x]
675
		fsub dword[delt_size]
676
		fstp dword[angle_x]
677
		call draw_3d
678
		jmp .end
679
	@@:
680
	cmp ah,176 ;Left
681
	jne @f
682
		fld dword[angle_y]
683
		fadd dword[delt_size]
684
		fstp dword[angle_y]
685
		call draw_3d
686
		jmp .end
687
	@@:
688
	cmp ah,179 ;Right
689
	jne @f
690
		fld dword[angle_y]
691
		fsub dword[delt_size]
692
		fstp dword[angle_y]
693
		call draw_3d
694
		;jmp .end
695
	@@:
696
	.end:
2165 IgorA 697
	ret
5935 IgorA 698
endp
2165 IgorA 699
 
700
align 4
701
prop_mouse:
5938 IgorA 702
	push eax ebx
703
	mcall 37,3
704
	bt eax,0
705
	jnc .end_m
706
		;mouse l. but. move
707
		cmp dword[mouse_drag],1
708
		jne .end_m
709
		mcall 37,1 ;get mouse coords
710
		mov ebx,eax
711
		shr ebx,16 ;mouse.x
712
		cmp ebx,3d_wnd_l
713
		jg @f
714
			mov ebx,3d_wnd_l
715
		@@:
716
		sub ebx,3d_wnd_l
717
		cmp ebx,3d_wnd_w
718
		jle @f
719
			mov ebx,3d_wnd_w
720
		@@:
721
		and eax,0xffff ;mouse.y
722
		cmp eax,3d_wnd_t
723
		jg @f
724
			mov eax,3d_wnd_t
725
		@@:
726
		sub eax,3d_wnd_t
727
		cmp eax,3d_wnd_h
728
		jle @f
729
			mov eax,3d_wnd_h
730
		@@:
731
		finit
732
		fild dword[mouse_y]
733
		mov [mouse_y],eax
734
		fisub dword[mouse_y]
735
		fdiv dword[angle_dxm] ;если курсор движется по оси y (вверх или вниз) то поворот делаем вокруг оси x
736
		fadd dword[angle_x]
737
		fstp dword[angle_x]
738
 
739
		fild dword[mouse_x]
740
		mov [mouse_x],ebx
741
		fisub dword[mouse_x]
742
		fdiv dword[angle_dym] ;если курсор движется по оси x (вверх или вниз) то поворот делаем вокруг оси y
743
		fadd dword[angle_y]
744
		fstp dword[angle_y]
745
 
746
		call draw_3d
747
		jmp .end_d
748
	.end_m:
749
	bt eax,16
750
	jnc @f
751
		;mouse l. but. up
752
		mov dword[mouse_drag],0
753
		jmp .end_d
754
	@@:
755
	bt eax,8
756
	jnc .end_d
757
		;mouse l. but. press
758
		mcall 37,1 ;get mouse coords
759
		mov ebx,eax
760
		shr ebx,16 ;mouse.x
761
		cmp ebx,3d_wnd_l
762
		jl .end_d
763
		sub ebx,3d_wnd_l
764
		cmp ebx,3d_wnd_w
765
		jg .end_d
766
		and eax,0xffff ;mouse.y
767
		cmp eax,3d_wnd_t
768
		jl .end_d
769
		sub eax,3d_wnd_t
770
		cmp eax,3d_wnd_h
771
		jg .end_d
772
		mov dword[mouse_drag],1
773
		mov dword[mouse_x],ebx
774
		mov dword[mouse_y],eax
775
	.end_d:
776
 
5935 IgorA 777
	stdcall [kmainmenu_dispatch_cursorevent], [main_menu]
2165 IgorA 778
	stdcall [tl_mouse], tree3
2173 IgorA 779
	stdcall [edit_box_mouse], edit1
780
	stdcall [edit_box_mouse], edit2
781
	stdcall [edit_box_mouse], edit3
5938 IgorA 782
	pop ebx eax
2165 IgorA 783
	ret
784
 
785
align 4
786
prop_button:
787
	mcall 17 ;получить код нажатой кнопки
788
 
2173 IgorA 789
	cmp ah,3
2165 IgorA 790
	jne @f
5930 IgorA 791
		call get_point_coords
792
		call draw_3d
793
		jmp prop_still.end
2165 IgorA 794
	@@:
2173 IgorA 795
	cmp ah,4
796
	jne @f
5911 IgorA 797
		push eax ebx ecx edi esi
2173 IgorA 798
		stdcall [tl_node_get_data],tree3
5911 IgorA 799
		cmp eax,0
2173 IgorA 800
		je .no_select_1
5911 IgorA 801
			mov ebx,[eax]
2173 IgorA 802
			finit
2165 IgorA 803
 
2173 IgorA 804
			mov esi,string1
805
			mov edi,Data_String
806
			cld
5930 IgorA 807
			mov ecx,8
808
			rep movsd
2173 IgorA 809
			call String_to_DoubleFloat
810
			fld  qword[Data_Double] ;считываем как double
811
			fstp dword[ebx] ;сохраняем как float
812
 
813
			mov esi,string2
814
			mov edi,Data_String
815
			cld
5930 IgorA 816
			mov ecx,8
817
			rep movsd
2173 IgorA 818
			call String_to_DoubleFloat
819
			fld  qword[Data_Double] ;считываем как double
820
			fstp dword[ebx+4] ;сохраняем как float
821
 
822
			mov esi,string3
823
			mov edi,Data_String
824
			cld
5930 IgorA 825
			mov ecx,8
826
			rep movsd
2173 IgorA 827
			call String_to_DoubleFloat
828
			fld  qword[Data_Double] ;считываем как double
829
			fstp dword[ebx+8] ;сохраняем как float
830
 
831
			;обновление измененного узла в списке tree3 и главного окна (по таймеру)
832
			mov word[NumberSymbolsAD],5
833
			mov dword[obj_point],ebx
834
			mov dword[obj_point.text],0
835
			cld
836
			mov ecx,3
837
			.coord:
838
				fld dword[ebx]
839
				fstp qword[Data_Double]
840
				call DoubleFloat_to_String
841
				add ebx,4
842
				stdcall str_len, Data_String
843
				mov esi,txt_space
844
				add esi,eax
845
				cmp esi,txt_space.end
846
				jl .normal_size
847
					mov esi,txt_space.end-1 ;минимум 1 пробел нужно добавить, что-бы цифры не слипались
848
				.normal_size:
849
				stdcall str_cat, obj_point.text,esi
850
				stdcall str_cat, obj_point.text,Data_String
851
				loop .coord
5911 IgorA 852
			stdcall dword[tl_node_set_data], tree3,obj_point
2173 IgorA 853
			stdcall dword[tl_draw], tree3
854
			mov byte[can_save],1 ;для показа кнопки 'Сохранить'
855
			mov dword[offs_last_timer],0 ;для обновления блока в таймере
5930 IgorA 856
			call draw_3d
2173 IgorA 857
		.no_select_1:
5911 IgorA 858
		pop esi edi ecx ebx eax
5930 IgorA 859
		jmp prop_still.end
2173 IgorA 860
	@@:
5935 IgorA 861
	cmp ah,5
862
	jne @f
863
		call mnu_vertexes_on_off
864
		jmp prop_still.end
865
	@@:
866
	cmp ah,6
867
	jne @f
868
		call mnu_faces_on_off
869
		jmp prop_still.end
870
	@@:
871
	cmp ah,7
872
	jne @f
5938 IgorA 873
		call mnu_faces_fill_on_off
874
		jmp prop_still.end
875
	@@:
876
	cmp ah,8
877
	jne @f
5935 IgorA 878
		call mnu_light_on_off
879
		jmp prop_still.end
880
	@@:
5938 IgorA 881
	cmp ah,9
882
	jne @f
883
		call mnu_reset_settings
884
		jmp prop_still.end
885
	@@:
2173 IgorA 886
 
2165 IgorA 887
	cmp ah,1
5930 IgorA 888
	jne prop_still.end
2165 IgorA 889
.exit:
890
	mov dword[tree3.data_img],0 ;чистим указатели на иконки что-бы их не удалил деструктор
891
	mov dword[tree3.data_img_sys],0 ;т. к. они еще используються в других элементах
892
	stdcall dword[tl_data_clear], tree3
893
	mov byte[prop_wnd_run],0 ;обнуляем счетчик окон
894
	mcall -1 ;выход из программы
895
 
5930 IgorA 896
align 4
897
get_point_coords:
898
	;загрузка координат в editbox-ы
899
	push eax ebx
900
	stdcall [tl_node_get_data],tree3
901
	cmp eax,0
902
	je @f
903
		mov ebx,[eax]
904
		mov word[NumberSymbolsAD],8
905
		finit
906
		fld dword[ebx]
907
		fstp qword[Data_Double]
908
		call DoubleFloat_to_String
909
		stdcall [edit_box_set_text], edit1, Data_String
910
		fld dword[ebx+4]
911
		fstp qword[Data_Double]
912
		call DoubleFloat_to_String
913
		stdcall [edit_box_set_text], edit2, Data_String
914
		fld dword[ebx+8]
915
		fstp qword[Data_Double]
916
		call DoubleFloat_to_String
917
		stdcall [edit_box_set_text], edit3, Data_String
918
		stdcall [edit_box_draw], edit1
919
		stdcall [edit_box_draw], edit2
920
		stdcall [edit_box_draw], edit3
921
	@@:
922
	pop ebx eax
923
	ret
924
 
925
align 4
5935 IgorA 926
proc prop_timer_funct uses eax
927
	;просматриваем выделенную координату
928
	stdcall [tl_node_get_data],tree3
929
	cmp [cursor_last_draw],eax
930
	je @f
931
		mov [cursor_last_draw],eax
932
		call draw_3d
933
	@@:
934
	ret
935
endp
936
 
5938 IgorA 937
;изменяем режим рисования вершин
5935 IgorA 938
align 4
939
mnu_vertexes_on_off:
940
	xor dword[draw_mode], 1 shl bit_vertexes
941
	ret
942
 
5938 IgorA 943
;изменяем режим рисования граней
5935 IgorA 944
align 4
945
mnu_faces_on_off:
946
	xor dword[draw_mode], 1 shl bit_faces
947
	ret
948
 
5938 IgorA 949
;изменяем каркасные или сплошные грани
5935 IgorA 950
align 4
5938 IgorA 951
mnu_faces_fill_on_off:
952
	xor dword[draw_mode], 1 shl bit_faces_fill
953
	or  dword[draw_mode], 1 shl bit_faces ;включаем режим рисования граней (если вдруг был отключен)
954
	ret
955
 
956
;включаем или отключаем освещение
957
align 4
5935 IgorA 958
mnu_light_on_off:
959
	xor dword[draw_mode], 1 shl bit_light
960
	ret
961
 
962
align 4
5938 IgorA 963
mnu_reset_settings:
964
	mov dword[angle_x],0.0
965
	mov dword[angle_y],0.0
966
	mov dword[angle_z],0.0
967
	m2m dword[draw_mode],dword[def_dr_mode]
968
	ret
969
 
970
align 4
971
def_dr_mode dd 0 ;режим рисования по умолчанию
972
delt_size dd 3.0 ;изменение углов при поворотах с кливиатуры
973
mouse_drag dd 0 ;режим поворота сцены от перемещении курсора мыши
974
mouse_x dd 0
975
mouse_y dd 0
976
angle_dxm dd 1.7775 ;~ 3d_wnd_w/180 - прибавление углов поворота сцены при вращении мышей
977
angle_dym dd 1.3335 ;~ 3d_wnd_h/180
978
;angle_dzm dd ?
979
draw_mode dd 0 ;режим рисования объекта
5935 IgorA 980
obj_poi_data dd 0 ;указатель на координаты вершин
981
obj_poi_count dd 0 ;колличество вершин
982
obj_tri_data dd 0 ;указатель на данные треугольников
983
obj_tri_count dd 0 ;колличество треугольников
984
cursor_last_draw dd 0 ;положение курсора при последней прорисовке 3d окна
5930 IgorA 985
sph_radius dd 0 ;радиус сферы для выделения активной точки
986
obj_x_max dd 0
987
obj_x_min dd 0
988
obj_x_centr dd 0
989
obj_x_scale dd 1.0
990
obj_y_max dd 0
991
obj_y_min dd 0
992
obj_y_centr dd 0
993
obj_y_scale dd 1.0
994
obj_z_max dd 0
995
obj_z_min dd 0
996
obj_z_centr dd 0
997
obj_z_scale dd 1.0
998
 
4332 IgorA 999
capt_p dd 0
1000
 
2165 IgorA 1001
;дерево с объектами в пользовательском файле
5930 IgorA 1002
tree3 tree_list MAX_OBJECT_SIZE,3, tl_key_no_edit+tl_list_box_mode,\
5935 IgorA 1003
	16,16, 0xffffff,0xb0d0ff,0x400040, 5,290,303,140, 16, 4,0, el_focus,\
5930 IgorA 1004
	w_scr_t3,get_point_coords
2165 IgorA 1005
 
5935 IgorA 1006
edit1 edit_box 80,  76, 269, 0xffd0d0, 0xff, 0x80ff, 0, 0x8000, 34, string1, mouse_dd, 0
1007
edit2 edit_box 80, 160, 269, 0xd0d0ff, 0xff, 0x80ff, 0, 0x8000, 34, string2, mouse_dd, 0
1008
edit3 edit_box 80, 244, 269, 0xd0ffd0, 0xff, 0x80ff, 0, 0x8000, 34, string3, mouse_dd, 0
2173 IgorA 1009
editboxes_end:
1010
 
1011
string1 rb 34
1012
string2 rb 34
1013
string3 rb 34
1014
 
2165 IgorA 1015
align 4
5930 IgorA 1016
w_scr_t3 scrollbar 16, 0,0,0, 15, 100,0,0, 0,0,0, 1