Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
2165 IgorA 1
;
2
; в этом файле собраны функции нужные для создания и
3
; работы окна с координатами
4
;
5
 
5930 IgorA 6
prop_wnd_width equ 340 ;ширина окна со свойствами объекта
7
prop_wnd_height equ 460
2165 IgorA 8
SIZE_ONE_FLOAT equ 14
9
MAX_OBJECT_SIZE equ (4+SIZE_ONE_FLOAT*3+1)
10
 
11
prop_wnd_run db 0 ;переменная следящая за тем что-бы не запускать больше 1-го окна со свойствами одновременно
12
 
2173 IgorA 13
txt_q db '?',0
2165 IgorA 14
txt_space:
15
	db SIZE_ONE_FLOAT dup(' ')
16
.end:
17
	db 0
18
 
5930 IgorA 19
rad_c dd 150 ;для вычисления радиуса
20
 
2165 IgorA 21
obj_point: ;добавляемый объект
22
	dd 0   ;указатель
23
.text:
24
	rb MAX_OBJECT_SIZE
25
 
26
 
27
 
28
;даное окно (процесс) вызываеться функцией but_wnd_coords
29
align 4
30
prop_start:
31
pushad
32
	mcall 40,0x27 ;маска ожидаемых событий
33
	inc byte[prop_wnd_run]
5930 IgorA 34
	mov dword[w_scr_t3.type],1
2165 IgorA 35
 
36
	stdcall [tl_node_get_data],tree1
37
	xor edx,edx
4332 IgorA 38
	mov dword[capt_p],txt_q
5911 IgorA 39
	cmp eax,0
4332 IgorA 40
	je .no_points
5911 IgorA 41
		mov ebx,dword[eax] ;получаем значение сдвига выбранного блока
2165 IgorA 42
		add ebx,dword[open_file_lif]
43
 
4332 IgorA 44
		cmp word[ebx],CHUNK_VERTLIST
45
		jne @f
46
			movzx edx,word[ebx+6] ;колличество точек
47
			add ebx,8
48
			mov dword[capt_p],txt_4110
49
			jmp .no_points
50
		@@:
51
		cmp word[ebx],0xb013
52
		jne @f
53
			inc edx
54
			add ebx,6
55
			mov dword[capt_p],txt_b013
56
			jmp .no_points
57
		@@:
58
		cmp word[ebx],0xb014
59
		jne @f
60
			mov edx,2
61
			add ebx,6
62
			mov dword[capt_p],txt_b014
63
			;jmp .no_points
64
		@@:
65
	.no_points:
66
 
2165 IgorA 67
	;настройка списка объектов
68
	mov dword[tree3.info_max_count],2
69
	add dword[tree3.info_max_count],edx ;ставим число узлов, равное колличеству точек (+2 на начало и конец списка)
70
	stdcall dword[tl_data_init], tree3
71
	mov eax,dword[icon_tl_sys]
72
	mov dword[tree3.data_img_sys],eax
73
	mov eax,dword[icon_toolbar]
74
	mov dword[tree3.data_img],eax
75
 
4332 IgorA 76
	cmp edx,0
2165 IgorA 77
	je .no_object
2173 IgorA 78
		mov word[NumberSymbolsAD],5
2165 IgorA 79
		finit
80
		.new_point:
81
			mov dword[obj_point],ebx
82
			mov dword[obj_point.text],0
83
			cld
84
			mov ecx,3
85
			@@:
86
				fld dword[ebx]
87
				fstp qword[Data_Double]
88
				call DoubleFloat_to_String
89
				add ebx,4
90
				stdcall str_len, Data_String
91
				mov esi,txt_space
92
				add esi,eax
93
				cmp esi,txt_space.end
94
				jl .normal_size
95
					mov esi,txt_space.end-1 ;минимум 1 пробел нужно добавить, что-бы цифры не слипались
96
				.normal_size:
97
				stdcall str_cat, obj_point.text,esi
98
				stdcall str_cat, obj_point.text,Data_String
99
				loop @b
5911 IgorA 100
			stdcall dword[tl_node_add], tree3,(ID_ICON_DATA shl 16),obj_point
2165 IgorA 101
			stdcall dword[tl_cur_next], tree3
102
			dec edx
103
			cmp edx,0
104
			jg .new_point
105
			stdcall dword[tl_cur_beg], tree3
106
	.no_object:
5930 IgorA 107
	call obj_set_sizes
2173 IgorA 108
	edit_boxes_set_sys_color edit1,editboxes_end,sc ;установка системных цветов
109
	stdcall [edit_box_set_text], edit1, txt_q
110
	stdcall [edit_box_set_text], edit2, txt_q
111
	stdcall [edit_box_set_text], edit3, txt_q
2165 IgorA 112
popad
113
 
5930 IgorA 114
	call prop_red_win
115
 
116
;не отрывать эту функцию от предыдущей
2165 IgorA 117
align 4
5930 IgorA 118
prop_still:
119
	pushad
120
	mcall 10
121
 
122
	cmp al,1 ;изм. положение окна
123
	jne @f
124
		call prop_red_win
125
		jmp .end
126
	@@:
127
	cmp al,2
128
	jne @f
129
		call prop_key
130
		jmp .end
131
	@@:
132
	cmp al,3
133
	jz prop_button
134
	cmp al,6
135
	jne @f
136
		call prop_mouse
137
	@@:
138
.end:
139
	popad
140
	jmp prop_still
141
 
142
align 4
2165 IgorA 143
prop_red_win:
144
pushad
145
	mcall 12,1
146
 
147
	xor eax,eax
4332 IgorA 148
	mov edi,dword[capt_p] ;children window caption
2165 IgorA 149
	mov bx,word[procinfo.box.left]
150
	add bx,word[buf_0.l]
5930 IgorA 151
	add bx,5 ;ширина боковой рамки
2165 IgorA 152
	shl ebx,16
153
	mov bx,prop_wnd_width
154
	mov cx,word[procinfo.box.top]
2173 IgorA 155
	add cx,word[buf_0.t]
2165 IgorA 156
	shl ecx,16
5930 IgorA 157
	mov cx,prop_wnd_height
158
	mov edx,0xffffd0+0x33000000
2165 IgorA 159
	int 0x40
160
 
2173 IgorA 161
	mov esi,[sc.work_button]
5930 IgorA 162
	mcall 8, (5 shl 16)+20, (246 shl 16)+20, 3
163
	mcall , (30 shl 16)+20, (246 shl 16)+20, 4
2173 IgorA 164
 
165
	mov ebx,[image_data_toolbar]
166
	add ebx,4*IMAGE_TOOLBAR_ICON_SIZE
5930 IgorA 167
	mcall 7, , (16 shl 16)+16, (7 shl 16)+247 ;load
2173 IgorA 168
 
169
	sub ebx,IMAGE_TOOLBAR_ICON_SIZE
5930 IgorA 170
	mov edx,(32 shl 16)+247 ;save
2173 IgorA 171
	int 0x40
172
 
2165 IgorA 173
	mov dword[w_scr_t3.all_redraw],1
174
	stdcall [scrollbar_ver_draw],dword w_scr_t3
175
	stdcall [tl_draw], tree3
2173 IgorA 176
	stdcall [edit_box_draw], edit1
177
	stdcall [edit_box_draw], edit2
178
	stdcall [edit_box_draw], edit3
5930 IgorA 179
 
180
	call draw_3d
2165 IgorA 181
	mcall 12,2
182
popad
5930 IgorA 183
	ret
2165 IgorA 184
 
185
align 4
5930 IgorA 186
proc obj_set_sizes uses eax ebx esi
187
	stdcall dword[tl_node_poi_get_info], tree3,0
188
	cmp eax,0
189
	je .end
190
		stdcall [tl_node_poi_get_data], tree3,eax
191
		finit
192
		mov eax,[eax]
193
		mov ebx,dword[eax]
194
		mov [obj_x_min],ebx
195
		mov [obj_x_max],ebx
196
		mov ebx,dword[eax+4]
197
		mov [obj_y_min],ebx
198
		mov [obj_y_max],ebx
199
		mov ebx,dword[eax+8]
200
		mov [obj_z_min],ebx
201
		mov [obj_z_max],ebx
2165 IgorA 202
 
5930 IgorA 203
	stdcall dword[tl_node_poi_get_info], tree3,0
204
align 4
205
	.cycle_0: ;работа с координатой x
206
		mov esi,eax
207
		stdcall [tl_node_poi_get_data], tree3,esi
208
		mov ebx,[eax]
209
 
210
		fld dword[ebx]
211
		fld dword[obj_x_min]
212
		fcomp
213
		fstsw ax
214
		sahf
215
		jb @f
216
			mov eax,[ebx]
217
			mov [obj_x_min],eax
218
			ffree st0
219
			fincstp
220
			jmp .next_x
221
		@@:
222
		fld dword[obj_x_max]
223
		fcompp
224
		fstsw ax
225
		sahf
226
		ja .next_x
227
			mov eax,[ebx]
228
			mov [obj_x_max],eax
229
		.next_x:
230
 
231
		stdcall dword[tl_node_poi_get_next_info], tree3,esi
232
		cmp eax,0
233
		jne .cycle_0
234
 
235
		fld1
236
		fld dword[obj_x_max]
237
		fsub dword[obj_x_min]
238
		fst dword[obj_x_centr]
239
		fdivp ;1/size.x
240
		fstp dword[obj_x_scale]
241
 
242
		fld dword[obj_x_centr]
243
		fld1
244
		fld1
245
		faddp
246
		fdivp ;centr.x = size.x/2
247
		fadd dword[obj_x_min]
248
		fchs
249
		fstp dword[obj_x_centr]
250
 
251
	stdcall dword[tl_node_poi_get_info], tree3,0
252
align 4
253
	.cycle_1: ;работа с координатой y
254
		mov esi,eax
255
		stdcall [tl_node_poi_get_data], tree3,esi
256
		mov ebx,[eax]
257
 
258
		fld dword[ebx+4]
259
		fld dword[obj_y_min]
260
		fcomp
261
		fstsw ax
262
		sahf
263
		jb @f
264
			mov eax,[ebx+4]
265
			mov [obj_y_min],eax
266
			ffree st0
267
			fincstp
268
			jmp .next_y
269
		@@:
270
		fld dword[obj_y_max]
271
		fcompp
272
		fstsw ax
273
		sahf
274
		ja .next_y
275
			mov eax,[ebx+4]
276
			mov [obj_y_max],eax
277
		.next_y:
278
 
279
		stdcall dword[tl_node_poi_get_next_info], tree3,esi
280
		cmp eax,0
281
		jne .cycle_1
282
 
283
		fld1
284
		fld dword[obj_y_max]
285
		fsub dword[obj_y_min]
286
		fst dword[obj_y_centr]
287
		fdivp ;1/size.y
288
		fstp dword[obj_y_scale]
289
 
290
		fld dword[obj_y_centr]
291
		fld1
292
		fld1
293
		faddp
294
		fdivp ;centr.y = size.y/2
295
		fadd dword[obj_y_min]
296
		fchs
297
		fstp dword[obj_y_centr]
298
 
299
	stdcall dword[tl_node_poi_get_info], tree3,0
300
align 4
301
	.cycle_2: ;работа с координатой z
302
		mov esi,eax
303
		stdcall [tl_node_poi_get_data], tree3,esi
304
		mov ebx,[eax]
305
 
306
		fld dword[ebx+8]
307
		fld dword[obj_z_min]
308
		fcomp
309
		fstsw ax
310
		sahf
311
		jb @f
312
			mov eax,[ebx+8]
313
			mov [obj_z_min],eax
314
			ffree st0
315
			fincstp
316
			jmp .next_z
317
		@@:
318
		fld dword[obj_z_max]
319
		fcompp
320
		fstsw ax
321
		sahf
322
		ja .next_z
323
			mov eax,[ebx+8]
324
			mov [obj_z_max],eax
325
		.next_z:
326
 
327
		stdcall dword[tl_node_poi_get_next_info], tree3,esi
328
		cmp eax,0
329
		jne .cycle_2
330
 
331
		fld1
332
		fld dword[obj_z_max]
333
		fsub dword[obj_z_min]
334
		fst dword[obj_z_centr]
335
		fdivp ;1/size.z
336
		fstp dword[obj_z_scale]
337
 
338
		fld dword[obj_z_centr]
339
		fld1
340
		fld1
341
		faddp
342
		fdivp ;centr.z = size.z/2
343
		fadd dword[obj_z_min]
344
		fchs
345
		fstp dword[obj_z_centr]
346
 
347
		;находим радиус для сферы
348
		fld dword[obj_x_max]
349
		fsub dword[obj_x_min]
350
		fld dword[obj_y_max]
351
		fsub dword[obj_y_min]
352
		faddp
353
		fild dword[rad_c]
354
		fdivp ;radius=(size.x+size.y)/rad_c
355
		fstp dword[sph_radius]
356
	.end:
357
	ret
358
endp
359
 
360
;рисование точек в 3d
361
align 4
362
draw_3d:
363
	stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;очистим буфер цвета и глубины
364
	stdcall [glPushMatrix]
365
	stdcall [glTranslatef], 0.0,0.0,0.5 ;correct for z
366
	stdcall [glScalef], [obj_x_scale],[obj_y_scale],[obj_z_scale]
367
	stdcall [glScalef], 1.0,1.0,0.7 ;correct for z
368
	stdcall [glRotatef], [angle_z],0.0,0.0,1.0
369
	stdcall [glRotatef], [angle_y],0.0,1.0,0.0
370
	stdcall [glRotatef], [angle_x],1.0,0.0,0.0
371
	stdcall [glTranslatef], [obj_x_centr],[obj_y_centr],[obj_z_centr]
372
 
373
	stdcall [glColor3f], 1.0,1.0,1.0
374
	stdcall [glBegin],GL_POINTS
375
 
376
	stdcall dword[tl_node_poi_get_info], tree3,0
2165 IgorA 377
	@@:
5930 IgorA 378
		cmp eax,0
379
		je @f
380
		mov esi,eax
381
		stdcall [tl_node_poi_get_data], tree3,esi
382
		mov eax,[eax]
383
		stdcall [glVertex3f], [eax],[eax+4],[eax+8]
384
		stdcall dword[tl_node_poi_get_next_info], tree3,esi
385
		jmp @b
2165 IgorA 386
	@@:
5930 IgorA 387
	stdcall [glEnd]
2165 IgorA 388
 
5930 IgorA 389
	stdcall [tl_node_get_data],tree3
390
	cmp eax,0
391
	je @f
392
		;выделение активной точки
393
		mov eax,[eax]
394
 
395
		stdcall [glBegin],GL_LINES
396
		stdcall [glColor3f], 1.0, 0.0, 0.0
397
		stdcall [glVertex3f], [obj_x_min],[eax+4],[eax+8]
398
		stdcall [glVertex3f], [obj_x_max],[eax+4],[eax+8]
399
		stdcall [glColor3f], 0.0, 0.0, 1.0
400
		stdcall [glVertex3f], [eax],[obj_y_min],[eax+8]
401
		stdcall [glVertex3f], [eax],[obj_y_max],[eax+8]
402
		stdcall [glColor3f], 0.0, 1.0, 0.0
403
		stdcall [glVertex3f], [eax],[eax+4],[obj_z_min]
404
		stdcall [glVertex3f], [eax],[eax+4],[obj_z_max]
405
		stdcall [glEnd]
406
 
407
		stdcall [glColor3f], 1.0, 1.0, 0.0
408
		stdcall [glTranslatef], [eax],[eax+4],[eax+8]
409
		stdcall [gluSphere], [qObj], [sph_radius], 8,8
410
	@@:
411
 
412
	stdcall [glPopMatrix]
413
	stdcall [kosglSwapBuffers]
414
	ret
415
 
2165 IgorA 416
align 4
417
prop_key:
418
push eax
419
	mcall 2
5930 IgorA 420
 
421
	test word [edit1.flags],10b ;ed_focus
422
	je @f
423
		stdcall [edit_box_key], edit1
424
		jmp .end
425
	@@:
426
	test word [edit2.flags],10b
427
	je @f
428
		stdcall [edit_box_key], edit2
429
		jmp .end
430
	@@:
431
	test word [edit3.flags],10b
432
	je @f
433
		stdcall [edit_box_key], edit3
434
		jmp .end
435
	@@:
2165 IgorA 436
	stdcall [tl_key], tree3
5930 IgorA 437
 
438
	cmp ah,178 ;Up
439
	jne @f
440
		fld dword[angle_x]
441
		fadd dword[delt_size]
442
		fstp dword[angle_x]
443
		call draw_3d
444
		jmp .end
445
	@@:
446
	cmp ah,177 ;Down
447
	jne @f
448
		fld dword[angle_x]
449
		fsub dword[delt_size]
450
		fstp dword[angle_x]
451
		call draw_3d
452
		jmp .end
453
	@@:
454
	cmp ah,176 ;Left
455
	jne @f
456
		fld dword[angle_y]
457
		fadd dword[delt_size]
458
		fstp dword[angle_y]
459
		call draw_3d
460
		jmp .end
461
	@@:
462
	cmp ah,179 ;Right
463
	jne @f
464
		fld dword[angle_y]
465
		fsub dword[delt_size]
466
		fstp dword[angle_y]
467
		call draw_3d
468
		;jmp .end
469
	@@:
470
	.end:
2165 IgorA 471
pop eax
472
	ret
473
 
474
align 4
475
prop_mouse:
476
	;push ecx edi
477
	stdcall [tl_mouse], tree3
2173 IgorA 478
	stdcall [edit_box_mouse], edit1
479
	stdcall [edit_box_mouse], edit2
480
	stdcall [edit_box_mouse], edit3
2165 IgorA 481
	;pop edi ecx
482
	ret
483
 
484
align 4
485
prop_button:
486
	mcall 17 ;получить код нажатой кнопки
487
 
2173 IgorA 488
	cmp ah,3
2165 IgorA 489
	jne @f
5930 IgorA 490
		call get_point_coords
491
		call draw_3d
492
		jmp prop_still.end
2165 IgorA 493
	@@:
2173 IgorA 494
	cmp ah,4
495
	jne @f
5911 IgorA 496
		push eax ebx ecx edi esi
2173 IgorA 497
		stdcall [tl_node_get_data],tree3
5911 IgorA 498
		cmp eax,0
2173 IgorA 499
		je .no_select_1
5911 IgorA 500
			mov ebx,[eax]
2173 IgorA 501
			finit
2165 IgorA 502
 
2173 IgorA 503
			mov esi,string1
504
			mov edi,Data_String
505
			cld
5930 IgorA 506
			mov ecx,8
507
			rep movsd
2173 IgorA 508
			call String_to_DoubleFloat
509
			fld  qword[Data_Double] ;считываем как double
510
			fstp dword[ebx] ;сохраняем как float
511
 
512
			mov esi,string2
513
			mov edi,Data_String
514
			cld
5930 IgorA 515
			mov ecx,8
516
			rep movsd
2173 IgorA 517
			call String_to_DoubleFloat
518
			fld  qword[Data_Double] ;считываем как double
519
			fstp dword[ebx+4] ;сохраняем как float
520
 
521
			mov esi,string3
522
			mov edi,Data_String
523
			cld
5930 IgorA 524
			mov ecx,8
525
			rep movsd
2173 IgorA 526
			call String_to_DoubleFloat
527
			fld  qword[Data_Double] ;считываем как double
528
			fstp dword[ebx+8] ;сохраняем как float
529
 
530
			;обновление измененного узла в списке tree3 и главного окна (по таймеру)
531
			mov word[NumberSymbolsAD],5
532
			mov dword[obj_point],ebx
533
			mov dword[obj_point.text],0
534
			cld
535
			mov ecx,3
536
			.coord:
537
				fld dword[ebx]
538
				fstp qword[Data_Double]
539
				call DoubleFloat_to_String
540
				add ebx,4
541
				stdcall str_len, Data_String
542
				mov esi,txt_space
543
				add esi,eax
544
				cmp esi,txt_space.end
545
				jl .normal_size
546
					mov esi,txt_space.end-1 ;минимум 1 пробел нужно добавить, что-бы цифры не слипались
547
				.normal_size:
548
				stdcall str_cat, obj_point.text,esi
549
				stdcall str_cat, obj_point.text,Data_String
550
				loop .coord
5911 IgorA 551
			stdcall dword[tl_node_set_data], tree3,obj_point
2173 IgorA 552
			stdcall dword[tl_draw], tree3
553
			mov byte[can_save],1 ;для показа кнопки 'Сохранить'
554
			mov dword[offs_last_timer],0 ;для обновления блока в таймере
5930 IgorA 555
			call draw_3d
2173 IgorA 556
		.no_select_1:
5911 IgorA 557
		pop esi edi ecx ebx eax
5930 IgorA 558
		jmp prop_still.end
2173 IgorA 559
	@@:
560
 
2165 IgorA 561
	cmp ah,1
5930 IgorA 562
	jne prop_still.end
2165 IgorA 563
.exit:
564
	mov dword[tree3.data_img],0 ;чистим указатели на иконки что-бы их не удалил деструктор
565
	mov dword[tree3.data_img_sys],0 ;т. к. они еще используються в других элементах
566
	stdcall dword[tl_data_clear], tree3
567
	mov byte[prop_wnd_run],0 ;обнуляем счетчик окон
568
	mcall -1 ;выход из программы
569
 
5930 IgorA 570
align 4
571
get_point_coords:
572
	;загрузка координат в editbox-ы
573
	push eax ebx
574
	stdcall [tl_node_get_data],tree3
575
	cmp eax,0
576
	je @f
577
		mov ebx,[eax]
578
		mov word[NumberSymbolsAD],8
579
		finit
580
		fld dword[ebx]
581
		fstp qword[Data_Double]
582
		call DoubleFloat_to_String
583
		stdcall [edit_box_set_text], edit1, Data_String
584
		fld dword[ebx+4]
585
		fstp qword[Data_Double]
586
		call DoubleFloat_to_String
587
		stdcall [edit_box_set_text], edit2, Data_String
588
		fld dword[ebx+8]
589
		fstp qword[Data_Double]
590
		call DoubleFloat_to_String
591
		stdcall [edit_box_set_text], edit3, Data_String
592
		stdcall [edit_box_draw], edit1
593
		stdcall [edit_box_draw], edit2
594
		stdcall [edit_box_draw], edit3
595
	@@:
596
	pop ebx eax
597
	ret
598
 
599
align 4
600
sph_radius dd 0 ;радиус сферы для выделения активной точки
601
obj_x_max dd 0
602
obj_x_min dd 0
603
obj_x_centr dd 0
604
obj_x_scale dd 1.0
605
obj_y_max dd 0
606
obj_y_min dd 0
607
obj_y_centr dd 0
608
obj_y_scale dd 1.0
609
obj_z_max dd 0
610
obj_z_min dd 0
611
obj_z_centr dd 0
612
obj_z_scale dd 1.0
613
 
4332 IgorA 614
capt_p dd 0
615
 
2165 IgorA 616
;дерево с объектами в пользовательском файле
5930 IgorA 617
tree3 tree_list MAX_OBJECT_SIZE,3, tl_key_no_edit+tl_list_box_mode,\
618
	16,16, 0xffffff,0xb0d0ff,0x400040, 5,270,303,160, 16, 4,0, el_focus,\
619
	w_scr_t3,get_point_coords
2165 IgorA 620
 
5930 IgorA 621
edit1 edit_box 80,  76, 249, 0xffd0d0, 0xff, 0x80ff, 0, 0x8000, 34, string1, mouse_dd, 0
622
edit2 edit_box 80, 160, 249, 0xd0d0ff, 0xff, 0x80ff, 0, 0x8000, 34, string2, mouse_dd, 0
623
edit3 edit_box 80, 244, 249, 0xd0ffd0, 0xff, 0x80ff, 0, 0x8000, 34, string3, mouse_dd, 0
2173 IgorA 624
editboxes_end:
625
 
626
string1 rb 34
627
string2 rb 34
628
string3 rb 34
629
 
2165 IgorA 630
align 4
5930 IgorA 631
w_scr_t3 scrollbar 16, 0,0,0, 15, 100,0,0, 0,0,0, 1