Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
6046 IgorA 1
;
2
; структуры и функции для рисования 3d объектов
3
;
4
 
5
offs_zbuf_pbuf equ 24 ;const. from 'zbuffer.inc'
6
 
7
struct obj_3d
8
	poi_data dd ? ;указатель на координаты вершин
9
	poi_count dd ? ;колличество вершин
10
	tri_data dd ? ;указатель на данные треугольников
11
	tri_count dd ? ;колличество треугольников
12
	normals_poi_data dd ? ;данные нормалей к точкам
13
	normals_poi_count dd ? ;колличество нормалей к точкам
14
	normals_tri_data dd ? ;данные нормалей к граням
15
	normals_tri_count dd ? ;колличество нормалей к граням
16
	x_max dd ?
17
	x_min dd ?
18
	x_centr dd ?
19
	x_scale dd ?
20
	y_max dd ?
21
	y_min dd ?
22
	y_centr dd ?
23
	y_scale dd ?
24
	z_max dd ?
25
	z_min dd ?
26
	z_centr dd ?
27
	z_scale dd ?
28
ends
29
 
30
offs_obj_poi_data equ 0 ;указатель на координаты вершин
31
offs_obj_poi_count equ 4 ;колличество вершин
32
offs_obj_tri_data equ 8 ;указатель на данные треугольников
33
offs_obj_tri_count equ 12 ;колличество треугольников
34
offs_obj_normals_poi_data equ 16
35
offs_obj_normals_poi_count equ 20
36
offs_obj_normals_tri_data equ 24
37
offs_obj_normals_tri_count equ 28
38
offs_obj_x_max equ 32
39
offs_obj_x_min equ 36
40
offs_obj_x_centr equ 40
41
offs_obj_x_scale equ 44
42
offs_obj_y_max equ 48
43
offs_obj_y_min equ 52
44
offs_obj_y_centr equ 56
45
offs_obj_y_scale equ 60
46
offs_obj_z_max equ 64
47
offs_obj_z_min equ 68
48
offs_obj_z_centr equ 72
49
offs_obj_z_scale equ 76
50
 
51
 
52
bit_vertexes equ 0
53
bit_faces equ 1
54
bit_faces_fill equ 2
55
bit_light equ 3
56
 
57
ini_name db 'info3ds.ini',0
58
ini_sec_w3d db 'Window 3d',0
59
key_dv  db 'draw_vertices',0
60
key_df  db 'draw_faces',0
61
key_dff db 'draw_faces_fill',0
62
key_dl  db 'draw_light',0
63
key_ox  db 'col_ox',0
64
key_oy  db 'col_oy',0
65
key_oz  db 'col_oz',0
66
key_bk  db 'col_bkgnd',0
67
key_vert db 'col_vertices',0
68
key_face db 'col_faces',0
69
key_select db 'col_select',0
70
 
71
 
72
rad_c dd 150 ;для вычисления радиуса
73
 
74
 
75
;установка всех основных переменных по умолчанию
76
align 4
77
proc obj_clear_param uses edi, o_data:dword
78
	mov edi,[o_data]
79
	;обнуление указателей на данные объектов
80
	mov dword[edi+offs_obj_poi_data],0
81
	mov dword[edi+offs_obj_poi_count],0
82
	mov dword[edi+offs_obj_tri_data],0
83
	mov dword[edi+offs_obj_tri_count],0
84
	mov dword[edi+offs_obj_normals_tri_count],0
85
	mov dword[edi+offs_obj_normals_poi_count],0
6060 IgorA 86
	cmp dword[edi+offs_obj_normals_tri_data],0
87
	je @f
88
		stdcall mem.Free,[edi+offs_obj_normals_tri_data]
89
		mov dword[edi+offs_obj_normals_tri_data],0
90
	@@:
91
	cmp dword[edi+offs_obj_normals_poi_data],0
92
	je @f
93
		stdcall mem.Free,[edi+offs_obj_normals_poi_data]
94
		mov dword[edi+offs_obj_normals_poi_data],0
95
	@@:
6046 IgorA 96
	ret
97
endp
98
 
99
;поиск данных
100
;input:
101
;eax - текущий узел
102
;output:
103
;eax - структура текущего узла (или 0 при неудаче)
104
align 4
105
proc found_block_data uses ebx ecx edx, tlist:dword
106
	mov edx,[tlist]
107
	mov ecx,eax
108
	stdcall [tl_node_poi_get_info], edx,0
109
	@@:
110
		mov ebx,eax
111
		stdcall [tl_node_poi_get_data], edx,ebx
112
		cmp eax,ecx
113
		je @f ;если попали на выбранный узел
114
		stdcall [tl_node_poi_get_next_info], edx,ebx
115
		cmp eax,0
116
		jne @b
117
		jmp .end
118
	@@:
119
		mov eax,ebx
120
	.end:
121
	ret
122
endp
123
 
124
;установка размеров объекта
125
align 4
126
proc obj_set_sizes uses eax ebx esi edi, o_data:dword
127
	mov edi,[o_data]
128
	cmp dword[edi+offs_obj_poi_count],0
129
	je .end
130
		finit
131
		mov eax,[edi+offs_obj_poi_data]
132
		mov ebx,dword[eax]
133
		mov [edi+offs_obj_x_min],ebx
134
		mov [edi+offs_obj_x_max],ebx
135
		mov ebx,dword[eax+4]
136
		mov [edi+offs_obj_y_min],ebx
137
		mov [edi+offs_obj_y_max],ebx
138
		mov ebx,dword[eax+8]
139
		mov [edi+offs_obj_z_min],ebx
140
		mov [edi+offs_obj_z_max],ebx
141
 
142
	mov ebx,[edi+offs_obj_poi_data]
143
	mov esi,[edi+offs_obj_poi_count]
144
align 4
145
	.cycle_0: ;работа с координатой x
146
		fld dword[ebx]
147
		fld dword[edi+offs_obj_x_min]
148
		fcomp
149
		fstsw ax
150
		sahf
151
		jb @f
152
			mov eax,[ebx]
153
			mov [edi+offs_obj_x_min],eax
154
			ffree st0
155
			fincstp
156
			jmp .next_x
157
		@@:
158
		fld dword[edi+offs_obj_x_max]
159
		fcompp
160
		fstsw ax
161
		sahf
162
		ja .next_x
163
			mov eax,[ebx]
164
			mov [edi+offs_obj_x_max],eax
165
		.next_x:
166
 
167
		add ebx,12
168
		dec esi
169
		jnz .cycle_0
170
 
171
		fld1
172
		fld dword[edi+offs_obj_x_max]
173
		fsub dword[edi+offs_obj_x_min]
174
		fst dword[edi+offs_obj_x_centr]
175
		fdivp ;1/size.x
176
		fstp dword[edi+offs_obj_x_scale]
177
 
178
		fld dword[edi+offs_obj_x_centr]
179
		fld1
180
		fld1
181
		faddp
182
		fdivp ;centr.x = size.x/2
183
		fadd dword[edi+offs_obj_x_min]
184
		fchs
185
		fstp dword[edi+offs_obj_x_centr]
186
 
187
	mov ebx,[edi+offs_obj_poi_data]
188
	mov esi,[edi+offs_obj_poi_count]
189
align 4
190
	.cycle_1: ;работа с координатой y
191
		fld dword[ebx+4]
192
		fld dword[edi+offs_obj_y_min]
193
		fcomp
194
		fstsw ax
195
		sahf
196
		jb @f
197
			mov eax,[ebx+4]
198
			mov [edi+offs_obj_y_min],eax
199
			ffree st0
200
			fincstp
201
			jmp .next_y
202
		@@:
203
		fld dword[edi+offs_obj_y_max]
204
		fcompp
205
		fstsw ax
206
		sahf
207
		ja .next_y
208
			mov eax,[ebx+4]
209
			mov [edi+offs_obj_y_max],eax
210
		.next_y:
211
 
212
		add ebx,12
213
		dec esi
214
		jnz .cycle_1
215
 
216
		fld1
217
		fld dword[edi+offs_obj_y_max]
218
		fsub dword[edi+offs_obj_y_min]
219
		fst dword[edi+offs_obj_y_centr]
220
		fdivp ;1/size.y
221
		fstp dword[edi+offs_obj_y_scale]
222
 
223
		fld dword[edi+offs_obj_y_centr]
224
		fld1
225
		fld1
226
		faddp
227
		fdivp ;centr.y = size.y/2
228
		fadd dword[edi+offs_obj_y_min]
229
		fchs
230
		fstp dword[edi+offs_obj_y_centr]
231
 
232
	mov ebx,[edi+offs_obj_poi_data]
233
	mov esi,[edi+offs_obj_poi_count]
234
align 4
235
	.cycle_2: ;работа с координатой z
236
		fld dword[ebx+8]
237
		fld dword[edi+offs_obj_z_min]
238
		fcomp
239
		fstsw ax
240
		sahf
241
		jb @f
242
			mov eax,[ebx+8]
243
			mov [edi+offs_obj_z_min],eax
244
			ffree st0
245
			fincstp
246
			jmp .next_z
247
		@@:
248
		fld dword[edi+offs_obj_z_max]
249
		fcompp
250
		fstsw ax
251
		sahf
252
		ja .next_z
253
			mov eax,[ebx+8]
254
			mov [edi+offs_obj_z_max],eax
255
		.next_z:
256
 
257
		add ebx,12
258
		dec esi
259
		jnz .cycle_2
260
 
261
		fld1
262
		fld dword[edi+offs_obj_z_max]
263
		fsub dword[edi+offs_obj_z_min]
264
		fst dword[edi+offs_obj_z_centr]
265
		fdivp ;1/size.z
266
		fstp dword[edi+offs_obj_z_scale]
267
 
268
		fld dword[edi+offs_obj_z_centr]
269
		fld1
270
		fld1
271
		faddp
272
		fdivp ;centr.z = size.z/2
273
		fadd dword[edi+offs_obj_z_min]
274
		fchs
275
		fstp dword[edi+offs_obj_z_centr]
276
 
277
		;находим радиус для сферы
278
		fld dword[edi+offs_obj_x_max]
279
		fsub dword[edi+offs_obj_x_min]
280
		fld dword[edi+offs_obj_y_max]
281
		fsub dword[edi+offs_obj_y_min]
282
		faddp
283
		fild dword[rad_c]
284
		fdivp ;radius=(size.x+size.y)/rad_c
285
		fstp dword[sph_radius]
286
 
287
	;делаем одинаковый масштаб по осям x и y, что-бы не нарушались пропорции изображения
288
	fld dword[edi+offs_obj_y_scale]
289
	fdiv dword[ratio] ;приведение масштаба по оси y учитывая что по высоте экран меньше
290
	fcomp dword[edi+offs_obj_x_scale]
291
	fstsw ax
292
	sahf
293
	jb @f
294
		;сжатие масштаба по y
295
		fld dword[edi+offs_obj_x_scale]
296
		fmul dword[ratio]
297
		fstp dword[edi+offs_obj_y_scale] ;масштаб по оси y = масштаб по оси x
298
		jmp .end
299
	@@:
300
		;сжатие масштаба по x >...<
301
		fld	dword[edi+offs_obj_x_scale]
302
		fdiv dword[ratio]
303
		fstp dword[edi+offs_obj_x_scale]
304
	.end:
305
	ret
306
endp
307
 
308
;установка нормалей для граней
309
align 4
310
proc obj_set_normals, o_data:dword
311
locals
312
	tbl1 rd 9 ;ebp-72
313
	tbl2 rd 9 ;ebp-36
314
endl
315
pushad
316
	mov ecx,[o_data]
317
	cmp dword[ecx+offs_obj_poi_count],0
318
	je .end
319
		mov eax,[ecx+offs_obj_tri_count]
320
		mov [ecx+offs_obj_normals_tri_count],eax ;на каждый треугольник 1 нормаль
321
		cmp eax,0
322
		je .end
323
		finit
324
		imul eax,12
325
		stdcall mem.Alloc, eax
326
		mov [ecx+offs_obj_normals_tri_data],eax
327
 
328
		mov edx,[ecx+offs_obj_tri_data]
329
		mov ebx,[ecx+offs_obj_tri_count]
330
		mov ecx,[ecx+offs_obj_poi_data]
331
align 4
332
		@@:
333
			mov edi,ebp
334
			sub edi,36 ;tbl2
335
			movzx esi,word[edx] ;1-я вершина
336
			imul esi,12
337
			add esi,ecx
338
			movsd
339
			movsd
340
			movsd
341
			movzx esi,word[edx+2] ;2-я вершина
342
			imul esi,12
343
			add esi,ecx
344
			movsd
345
			movsd
346
			movsd
347
			movzx esi,word[edx+4] ;3-я вершина
348
			imul esi,12
349
			add esi,ecx
350
			movsd
351
			movsd
352
			movsd
353
 
354
			mov esi,ebp
355
			sub esi,72 ;tbl1
356
			sub edi,36 ;tbl2
357
			;v1 <-> v2
358
			fld dword[edi+12]
359
			fsub dword[edi]
360
			fstp dword[esi] ;(x1-x2)
361
			fld dword[edi+16]
362
			fsub dword[edi+4]
363
			fstp dword[esi+4] ;(y1-y2)
364
			fld dword[edi+20]
365
			fsub dword[edi+8]
366
			fstp dword[esi+8] ;(z1-z2)
367
			;v2 <-> v3
368
			fld dword[edi+24]
369
			fsub dword[edi+12]
370
			fstp dword[esi+12] ;(x2-x3)
371
			fld dword[edi+28]
372
			fsub dword[edi+16]
373
			fstp dword[esi+16] ;(y2-y3)
374
			fld dword[edi+32]
375
			fsub dword[edi+20]
376
			fstp dword[esi+20] ;(z2-z3)
377
			;v3 <-> v1
378
			fld dword[edi]
379
			fsub dword[edi+24]
380
			fstp dword[esi+24] ;(x3-x1)
381
			fld dword[edi+4]
382
			fsub dword[edi+28]
383
			fstp dword[esi+28] ;(y3-y1)
384
			fld dword[edi+8]
385
			fsub dword[edi+32]
386
			fstp dword[esi+32] ;(z3-z1)
387
 
388
			;a1,a2,a3
389
			fld dword[esi+4]
390
			fmul dword[esi+8]
391
			fstp dword[edi] ;a1=(y1-y2)*(z1-z2)
392
			fld dword[esi+16]
393
			fmul dword[esi+20]
394
			fstp dword[edi+4] ;a2=(y2-y3)*(z2-z3)
395
			fld dword[esi+28]
396
			fmul dword[esi+32]
397
			fstp dword[edi+8] ;a3=(y3-y1)*(z3-z1)
398
			;b1,b2,b3
399
			fld dword[esi]
400
			fmul dword[esi+8]
401
			fstp dword[edi+12] ;b1=(x1-x2)*(z1-z2)
402
			fld dword[esi+12]
403
			fmul dword[esi+20]
404
			fstp dword[edi+16] ;b2=(x2-x3)*(z2-z3)
405
			fld dword[esi+24]
406
			fmul dword[esi+32]
407
			fstp dword[edi+20] ;b3=(x3-x1)*(z3-z1)
408
			;c1,с2,с3
409
			fld dword[esi]
410
			fmul dword[esi+4]
411
			fstp dword[edi+24] ;c1=(x1-x2)*(y1-y2)
412
			fld dword[esi+12]
413
			fmul dword[esi+16]
414
			fstp dword[edi+28] ;c2=(x2-x3)*(y2-y3)
415
			fld dword[esi+24]
416
			fmul dword[esi+28]
417
			fstp dword[edi+32] ;c3=(x3-x1)*(y3-y1)
418
 
419
			fld dword[edi]
420
			fadd dword[edi+4]
421
			fadd dword[edi+8]
422
			fstp dword[eax] ;set normal.a
423
			fld dword[edi+12]
424
			fadd dword[edi+16]
425
			fadd dword[edi+20]
426
			fstp dword[eax+4] ;set normal.b
427
			fld dword[edi+24]
428
			fadd dword[edi+28]
429
			fadd dword[edi+32]
430
			fstp dword[eax+8] ;set normal.c
431
 
432
			add edx,8 ;размер треугольника = (3 вершины (по 2б) + свойства (2б))
433
			add eax,12
434
			dec ebx
435
			jnz @b
436
	.end:
437
popad
438
	ret
439
endp
440
 
6060 IgorA 441
;настройка структуры 3d объекта
442
align 4
443
proc obj_init, o_data:dword
444
	pushad
445
	mov edi,[o_data]
446
	stdcall obj_clear_param, edi
447
	stdcall [tl_node_get_data],tree1
448
	xor edx,edx
449
	cmp eax,0
450
	je .no_points
451
		mov ebx,[eax] ;получаем значение сдвига выбранного блока
452
		add ebx,[open_file_data]
453
		xor ecx,ecx
454
		cmp word[ebx],CHUNK_OBJBLOCK
455
		jne @f
456
			mov ecx,ebx
457
			add ecx,dword[ecx+2] ;граница блока
458
			push eax edi
459
				mov edi,ebx
460
				add edi,6
461
				cld
462
				xor al,al
463
				repne scasb ;пропуск имени объекта
464
				mov ebx,edi
465
			pop edi eax
466
		@@:
467
		cmp word[ebx],CHUNK_TRIMESH
468
		jne @f
469
			mov ecx,ebx
470
			add ecx,dword[ecx+2] ;граница блока
471
			add ebx,6
472
		@@:
473
		cmp word[ebx],CHUNK_VERTLIST
474
		jne .no_points
475
			mov esi,ebx
476
			movzx edx,word[ebx+6] ;колличество точек
477
			add ebx,8
478
			mov [edi+offs_obj_poi_data],ebx
479
			mov [edi+offs_obj_poi_count],edx
480
 
481
			.cycle_0: ;цикл для поиска треугольников
482
				add esi,dword[esi+2]
483
				cmp word[esi],CHUNK_FACELIST
484
				je @f
485
					cmp ecx,esi
486
					jg .cycle_0 ;пока не достигнута грница старшего блока
487
					jmp .end_points ;если не нашли треугольники
488
			@@:
489
			;если нашли треугольники
490
			movzx edx,word[esi+6]
491
			mov [edi+offs_obj_tri_count],edx
492
			add esi,8 ;2+4+2 (chunk+size+count)
493
			mov [edi+offs_obj_tri_data],esi
494
		.end_points:
495
 
496
		stdcall obj_set_sizes, edi
497
		stdcall obj_set_normals, edi
498
if version_edit eq 0
499
		stdcall draw_3d, edi
500
end if
501
	.no_points:
502
	popad
503
	ret
504
endp
505
 
6046 IgorA 506
;рисование точек в 3d
507
align 4
508
proc draw_3d uses eax ebx ecx edi, o_data:dword
509
	mov edi,[o_data]
6060 IgorA 510
if 0 ;debug
511
	stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT
512
	mov eax,[edi+offs_obj_poi_data]
513
	stdcall convert_int_to_str, txt_select_vert.count,16
514
	stdcall [buf2d_draw_text], buf_ogl, buf_1,txt_select_vert,5,3,[color_select]
515
	stdcall [kosglSwapBuffers]
516
	jmp .end_f
517
end if
6046 IgorA 518
	cmp dword[edi+offs_obj_poi_count],2
519
	jl .end_f
520
	stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;очистим буфер цвета и глубины
521
	stdcall [glPushMatrix]
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:
529
	stdcall [glTranslatef], 0.0,0.0,0.5 ;correct for z
530
	stdcall [glScalef], [edi+offs_obj_x_scale],[edi+offs_obj_y_scale],[edi+offs_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], [edi+offs_obj_x_centr],[edi+offs_obj_y_centr],[edi+offs_obj_z_centr]
536
 
537
	;рисование точек
538
	bt dword[draw_mode],bit_vertexes
539
	jnc .end_points
540
		stdcall [glColor3ub],[color_vert+2],[color_vert+1],[color_vert]
541
		stdcall [glBegin],GL_POINTS
542
		mov eax,[edi+offs_obj_poi_data]
543
		mov ebx,[edi+offs_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:
551
 
552
if version_edit eq 1
553
	;рисование активной точки
554
	stdcall [tl_node_get_data],tree3
555
	cmp eax,0
556
	je @f
557
		;выделение активной точки
558
		mov eax,[eax]
559
 
560
		stdcall [glBegin],GL_LINES
561
		stdcall [glColor3ub], [color_ox+2],[color_ox+1],[color_ox]
562
		stdcall [glVertex3f], [edi+offs_obj_x_min],[eax+4],[eax+8]
563
		stdcall [glVertex3f], [edi+offs_obj_x_max],[eax+4],[eax+8]
564
		stdcall [glColor3ub], [color_oy+2],[color_oy+1],[color_oy]
565
		stdcall [glVertex3f], [eax],[edi+offs_obj_y_min],[eax+8]
566
		stdcall [glVertex3f], [eax],[edi+offs_obj_y_max],[eax+8]
567
		stdcall [glColor3ub], [color_oz+2],[color_oz+1],[color_oz]
568
		stdcall [glVertex3f], [eax],[eax+4],[edi+offs_obj_z_min]
569
		stdcall [glVertex3f], [eax],[eax+4],[edi+offs_obj_z_max]
570
		stdcall [glEnd]
571
 
572
		stdcall [glColor3ub],[color_select+2],[color_select+1],[color_select]
573
		stdcall [glPushMatrix]
574
			stdcall [glTranslatef], [eax],[eax+4],[eax+8]
575
			stdcall [gluSphere], [qObj], [sph_radius], 8,8
576
		stdcall [glPopMatrix]
577
	@@:
578
 
579
	;рисование выделенных точек
580
	cmp dword[obj_poi_sel_c],0
581
	je .end_select
582
		mov ecx,dword[obj_poi_sel_c]
583
		stdcall [glColor3ub],[color_select+2],[color_select+1],[color_select]
584
		stdcall dword[tl_node_poi_get_info], tree3,0
585
		@@:
586
			cmp eax,0
587
			je .end_select
588
			mov ebx,eax
589
			cmp word[ebx],ID_ICON_POINT_SEL
590
			jne .next_sel
591
			stdcall [tl_node_poi_get_data], tree3,ebx
592
			mov eax,[eax]
593
			stdcall [glPushMatrix]
594
				stdcall [glTranslatef], [eax],[eax+4],[eax+8]
595
				stdcall [gluSphere], [qObj], [sph_radius], 4,4
596
			stdcall [glPopMatrix]
597
			dec ecx
598
			jz .end_select
599
			.next_sel:
600
			stdcall dword[tl_node_poi_get_next_info], tree3,ebx
601
			jmp @b
602
    .end_select:
603
end if
604
 
605
	;рисование граней
606
	bt dword[draw_mode],bit_faces
607
	jnc .end_triangles
608
	cmp dword[edi+offs_obj_tri_count],0
609
	je .end_triangles
610
	cmp dword[edi+offs_obj_poi_count],0
611
	je .end_triangles
612
		bt dword[draw_mode],bit_faces_fill
613
		jc @f
614
			push GL_LINE
615
			jmp .end_0
616
		@@:
617
			push GL_FILL
618
		.end_0:
619
		stdcall [glPolygonMode], GL_FRONT_AND_BACK ;mode - уже в стеке
620
		stdcall [glColor3ub],[color_face+2],[color_face+1],[color_face]
621
		stdcall [glBegin],GL_TRIANGLES
622
		mov eax,[edi+offs_obj_tri_data]
623
		mov ecx,[edi+offs_obj_tri_count]
624
		mov edx,[edi+offs_obj_normals_tri_data]
625
		@@:
626
			;
627
			bt dword[draw_mode],bit_light
628
			jnc .norm
629
				;[obj_normals_tri_count]
630
				stdcall [glNormal3fv], edx
631
				add edx,12
632
			.norm:
633
			;
634
			movzx ebx,word[eax] ;1-я вершина
635
			imul ebx,12
636
			add ebx,[edi+offs_obj_poi_data]
637
			stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
638
			movzx ebx,word[eax+2] ;2-я вершина
639
			imul ebx,12
640
			add ebx,[edi+offs_obj_poi_data]
641
			stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
642
			movzx ebx,word[eax+4] ;3-я вершина
643
			imul ebx,12
644
			add ebx,[edi+offs_obj_poi_data]
645
			stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
646
			add eax,8 ;размер треугольника = (3 вершины (по 2б) + свойства (2б))
647
			dec ecx
648
			jnz @b
649
		stdcall [glEnd]
650
	.end_triangles:
651
 
652
	stdcall [glPopMatrix]
653
if version_edit eq 1
654
	cmp dword[obj_poi_sel_c],0
655
	je @f
656
		stdcall [buf2d_draw_text], buf_ogl, buf_1,txt_select_vert,5,3,[color_select]
657
	@@:
658
end if
659
	stdcall [kosglSwapBuffers]
660
	.end_f:
661
	ret
662
endp
663
 
664
align 4
665
SetLight:
666
	stdcall [glLightfv], GL_LIGHT0, GL_POSITION, light_position
667
	stdcall [glLightfv], GL_LIGHT0, GL_SPOT_DIRECTION, light_dir
668
 
669
	stdcall [glLightfv], GL_LIGHT0, GL_DIFFUSE, white_light
670
	stdcall [glLightfv], GL_LIGHT0, GL_SPECULAR, white_light
671
 
672
	stdcall [glEnable], GL_COLOR_MATERIAL
673
	stdcall [glColorMaterial], GL_FRONT, GL_AMBIENT_AND_DIFFUSE
674
	stdcall [glMaterialfv], GL_FRONT, GL_SPECULAR, mat_specular
675
	stdcall [glMaterialf], GL_FRONT, GL_SHININESS, mat_shininess
676
	stdcall [glLightModelfv], GL_LIGHT_MODEL_AMBIENT, lmodel_ambient
677
 
678
	stdcall [glEnable],GL_LIGHTING
679
	stdcall [glEnable],GL_LIGHT0
680
	ret
681
 
6060 IgorA 682
;включаем режим рисования вершин
6046 IgorA 683
align 4
6060 IgorA 684
mnu_vertexes_on:
685
	or dword[draw_mode], 1 shl bit_vertexes
686
	and dword[draw_mode], not (1 shl bit_faces) ;выключаем режим рисования граней (что-бы не мешали)
687
	call update_obj
6046 IgorA 688
	ret
689
 
6060 IgorA 690
;включаем режим рисования каркасных граней
6046 IgorA 691
align 4
6060 IgorA 692
mnu_edges_on:
693
	or dword[draw_mode], 1 shl bit_faces
694
	and dword[draw_mode], not ((1 shl bit_vertexes)+(1 shl bit_faces_fill))
695
	call update_obj
6046 IgorA 696
	ret
697
 
6060 IgorA 698
;включаем режим рисования сплошных граней
6046 IgorA 699
align 4
6060 IgorA 700
mnu_faces_on:
701
	or dword[draw_mode], (1 shl bit_faces)+(1 shl bit_faces_fill)
702
	and dword[draw_mode], not (1 shl bit_vertexes)
703
	call update_obj
6046 IgorA 704
	ret
705
 
706
;включаем или отключаем освещение
707
align 4
708
mnu_light_on_off:
709
	xor dword[draw_mode], 1 shl bit_light
6060 IgorA 710
	call update_obj
6046 IgorA 711
	ret
712
 
713
align 4
714
mnu_reset_settings:
715
	mov dword[angle_x],0.0
716
	mov dword[angle_y],0.0
717
	mov dword[angle_z],0.0
718
	m2m dword[draw_mode],dword[def_dr_mode]
6060 IgorA 719
	call update_obj
720
	ret
721
 
722
if version_edit eq 1
723
 
724
align 4
725
update_obj:
6046 IgorA 726
	stdcall draw_3d, o3d
727
	ret
728
 
6060 IgorA 729
else
730
 
6046 IgorA 731
align 4
6060 IgorA 732
update_obj:
733
push eax
734
	stdcall [tl_node_get_data],tree1
735
	cmp eax,0
736
	je @f
737
		add eax,14 ;14=list_offs_obj3d
738
		stdcall draw_3d, eax
739
	@@:
740
pop eax
741
	ret
742
 
743
end if
744
 
745
align 4
6046 IgorA 746
draw_mode dd 0 ;режим рисования объекта
747
def_dr_mode dd 0 ;режим рисования по умолчанию
748
delt_size dd 3.0 ;изменение углов при поворотах с кливиатуры
749
mouse_drag dd 0 ;режим поворота сцены от перемещении курсора мыши
750
mouse_x dd 0
751
mouse_y dd 0
752
sph_radius dd 0 ;радиус сферы для выделения активной точки
753