Subversion Repositories Kolibri OS

Rev

Rev 6060 | Go to most recent revision | Details | 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
86
	stdcall mem.Free,[edi+offs_obj_normals_tri_data]
87
	stdcall mem.Free,[edi+offs_obj_normals_poi_data]
88
	mov dword[edi+offs_obj_normals_tri_data],0
89
	mov dword[edi+offs_obj_normals_poi_data],0
90
 
91
	;установка параметров отображения
92
	call mnu_reset_settings
93
	ret
94
endp
95
 
96
;поиск данных
97
;input:
98
;eax - текущий узел
99
;output:
100
;eax - структура текущего узла (или 0 при неудаче)
101
align 4
102
proc found_block_data uses ebx ecx edx, tlist:dword
103
	mov edx,[tlist]
104
	mov ecx,eax
105
	stdcall [tl_node_poi_get_info], edx,0
106
	@@:
107
		mov ebx,eax
108
		stdcall [tl_node_poi_get_data], edx,ebx
109
		cmp eax,ecx
110
		je @f ;если попали на выбранный узел
111
		stdcall [tl_node_poi_get_next_info], edx,ebx
112
		cmp eax,0
113
		jne @b
114
		jmp .end
115
	@@:
116
		mov eax,ebx
117
	.end:
118
	ret
119
endp
120
 
121
;установка размеров объекта
122
align 4
123
proc obj_set_sizes uses eax ebx esi edi, o_data:dword
124
	mov edi,[o_data]
125
	cmp dword[edi+offs_obj_poi_count],0
126
	je .end
127
		finit
128
		mov eax,[edi+offs_obj_poi_data]
129
		mov ebx,dword[eax]
130
		mov [edi+offs_obj_x_min],ebx
131
		mov [edi+offs_obj_x_max],ebx
132
		mov ebx,dword[eax+4]
133
		mov [edi+offs_obj_y_min],ebx
134
		mov [edi+offs_obj_y_max],ebx
135
		mov ebx,dword[eax+8]
136
		mov [edi+offs_obj_z_min],ebx
137
		mov [edi+offs_obj_z_max],ebx
138
 
139
	mov ebx,[edi+offs_obj_poi_data]
140
	mov esi,[edi+offs_obj_poi_count]
141
align 4
142
	.cycle_0: ;работа с координатой x
143
		fld dword[ebx]
144
		fld dword[edi+offs_obj_x_min]
145
		fcomp
146
		fstsw ax
147
		sahf
148
		jb @f
149
			mov eax,[ebx]
150
			mov [edi+offs_obj_x_min],eax
151
			ffree st0
152
			fincstp
153
			jmp .next_x
154
		@@:
155
		fld dword[edi+offs_obj_x_max]
156
		fcompp
157
		fstsw ax
158
		sahf
159
		ja .next_x
160
			mov eax,[ebx]
161
			mov [edi+offs_obj_x_max],eax
162
		.next_x:
163
 
164
		add ebx,12
165
		dec esi
166
		jnz .cycle_0
167
 
168
		fld1
169
		fld dword[edi+offs_obj_x_max]
170
		fsub dword[edi+offs_obj_x_min]
171
		fst dword[edi+offs_obj_x_centr]
172
		fdivp ;1/size.x
173
		fstp dword[edi+offs_obj_x_scale]
174
 
175
		fld dword[edi+offs_obj_x_centr]
176
		fld1
177
		fld1
178
		faddp
179
		fdivp ;centr.x = size.x/2
180
		fadd dword[edi+offs_obj_x_min]
181
		fchs
182
		fstp dword[edi+offs_obj_x_centr]
183
 
184
	mov ebx,[edi+offs_obj_poi_data]
185
	mov esi,[edi+offs_obj_poi_count]
186
align 4
187
	.cycle_1: ;работа с координатой y
188
		fld dword[ebx+4]
189
		fld dword[edi+offs_obj_y_min]
190
		fcomp
191
		fstsw ax
192
		sahf
193
		jb @f
194
			mov eax,[ebx+4]
195
			mov [edi+offs_obj_y_min],eax
196
			ffree st0
197
			fincstp
198
			jmp .next_y
199
		@@:
200
		fld dword[edi+offs_obj_y_max]
201
		fcompp
202
		fstsw ax
203
		sahf
204
		ja .next_y
205
			mov eax,[ebx+4]
206
			mov [edi+offs_obj_y_max],eax
207
		.next_y:
208
 
209
		add ebx,12
210
		dec esi
211
		jnz .cycle_1
212
 
213
		fld1
214
		fld dword[edi+offs_obj_y_max]
215
		fsub dword[edi+offs_obj_y_min]
216
		fst dword[edi+offs_obj_y_centr]
217
		fdivp ;1/size.y
218
		fstp dword[edi+offs_obj_y_scale]
219
 
220
		fld dword[edi+offs_obj_y_centr]
221
		fld1
222
		fld1
223
		faddp
224
		fdivp ;centr.y = size.y/2
225
		fadd dword[edi+offs_obj_y_min]
226
		fchs
227
		fstp dword[edi+offs_obj_y_centr]
228
 
229
	mov ebx,[edi+offs_obj_poi_data]
230
	mov esi,[edi+offs_obj_poi_count]
231
align 4
232
	.cycle_2: ;работа с координатой z
233
		fld dword[ebx+8]
234
		fld dword[edi+offs_obj_z_min]
235
		fcomp
236
		fstsw ax
237
		sahf
238
		jb @f
239
			mov eax,[ebx+8]
240
			mov [edi+offs_obj_z_min],eax
241
			ffree st0
242
			fincstp
243
			jmp .next_z
244
		@@:
245
		fld dword[edi+offs_obj_z_max]
246
		fcompp
247
		fstsw ax
248
		sahf
249
		ja .next_z
250
			mov eax,[ebx+8]
251
			mov [edi+offs_obj_z_max],eax
252
		.next_z:
253
 
254
		add ebx,12
255
		dec esi
256
		jnz .cycle_2
257
 
258
		fld1
259
		fld dword[edi+offs_obj_z_max]
260
		fsub dword[edi+offs_obj_z_min]
261
		fst dword[edi+offs_obj_z_centr]
262
		fdivp ;1/size.z
263
		fstp dword[edi+offs_obj_z_scale]
264
 
265
		fld dword[edi+offs_obj_z_centr]
266
		fld1
267
		fld1
268
		faddp
269
		fdivp ;centr.z = size.z/2
270
		fadd dword[edi+offs_obj_z_min]
271
		fchs
272
		fstp dword[edi+offs_obj_z_centr]
273
 
274
		;находим радиус для сферы
275
		fld dword[edi+offs_obj_x_max]
276
		fsub dword[edi+offs_obj_x_min]
277
		fld dword[edi+offs_obj_y_max]
278
		fsub dword[edi+offs_obj_y_min]
279
		faddp
280
		fild dword[rad_c]
281
		fdivp ;radius=(size.x+size.y)/rad_c
282
		fstp dword[sph_radius]
283
 
284
	;делаем одинаковый масштаб по осям x и y, что-бы не нарушались пропорции изображения
285
	fld dword[edi+offs_obj_y_scale]
286
	fdiv dword[ratio] ;приведение масштаба по оси y учитывая что по высоте экран меньше
287
	fcomp dword[edi+offs_obj_x_scale]
288
	fstsw ax
289
	sahf
290
	jb @f
291
		;сжатие масштаба по y
292
		fld dword[edi+offs_obj_x_scale]
293
		fmul dword[ratio]
294
		fstp dword[edi+offs_obj_y_scale] ;масштаб по оси y = масштаб по оси x
295
		jmp .end
296
	@@:
297
		;сжатие масштаба по x >...<
298
		fld	dword[edi+offs_obj_x_scale]
299
		fdiv dword[ratio]
300
		fstp dword[edi+offs_obj_x_scale]
301
	.end:
302
	ret
303
endp
304
 
305
;установка нормалей для граней
306
align 4
307
proc obj_set_normals, o_data:dword
308
locals
309
	tbl1 rd 9 ;ebp-72
310
	tbl2 rd 9 ;ebp-36
311
endl
312
pushad
313
	mov ecx,[o_data]
314
	cmp dword[ecx+offs_obj_poi_count],0
315
	je .end
316
		mov eax,[ecx+offs_obj_tri_count]
317
		mov [ecx+offs_obj_normals_tri_count],eax ;на каждый треугольник 1 нормаль
318
		cmp eax,0
319
		je .end
320
		finit
321
		imul eax,12
322
		stdcall mem.Alloc, eax
323
		mov [ecx+offs_obj_normals_tri_data],eax
324
 
325
		mov edx,[ecx+offs_obj_tri_data]
326
		mov ebx,[ecx+offs_obj_tri_count]
327
		mov ecx,[ecx+offs_obj_poi_data]
328
align 4
329
		@@:
330
			mov edi,ebp
331
			sub edi,36 ;tbl2
332
			movzx esi,word[edx] ;1-я вершина
333
			imul esi,12
334
			add esi,ecx
335
			movsd
336
			movsd
337
			movsd
338
			movzx esi,word[edx+2] ;2-я вершина
339
			imul esi,12
340
			add esi,ecx
341
			movsd
342
			movsd
343
			movsd
344
			movzx esi,word[edx+4] ;3-я вершина
345
			imul esi,12
346
			add esi,ecx
347
			movsd
348
			movsd
349
			movsd
350
 
351
			mov esi,ebp
352
			sub esi,72 ;tbl1
353
			sub edi,36 ;tbl2
354
			;v1 <-> v2
355
			fld dword[edi+12]
356
			fsub dword[edi]
357
			fstp dword[esi] ;(x1-x2)
358
			fld dword[edi+16]
359
			fsub dword[edi+4]
360
			fstp dword[esi+4] ;(y1-y2)
361
			fld dword[edi+20]
362
			fsub dword[edi+8]
363
			fstp dword[esi+8] ;(z1-z2)
364
			;v2 <-> v3
365
			fld dword[edi+24]
366
			fsub dword[edi+12]
367
			fstp dword[esi+12] ;(x2-x3)
368
			fld dword[edi+28]
369
			fsub dword[edi+16]
370
			fstp dword[esi+16] ;(y2-y3)
371
			fld dword[edi+32]
372
			fsub dword[edi+20]
373
			fstp dword[esi+20] ;(z2-z3)
374
			;v3 <-> v1
375
			fld dword[edi]
376
			fsub dword[edi+24]
377
			fstp dword[esi+24] ;(x3-x1)
378
			fld dword[edi+4]
379
			fsub dword[edi+28]
380
			fstp dword[esi+28] ;(y3-y1)
381
			fld dword[edi+8]
382
			fsub dword[edi+32]
383
			fstp dword[esi+32] ;(z3-z1)
384
 
385
			;a1,a2,a3
386
			fld dword[esi+4]
387
			fmul dword[esi+8]
388
			fstp dword[edi] ;a1=(y1-y2)*(z1-z2)
389
			fld dword[esi+16]
390
			fmul dword[esi+20]
391
			fstp dword[edi+4] ;a2=(y2-y3)*(z2-z3)
392
			fld dword[esi+28]
393
			fmul dword[esi+32]
394
			fstp dword[edi+8] ;a3=(y3-y1)*(z3-z1)
395
			;b1,b2,b3
396
			fld dword[esi]
397
			fmul dword[esi+8]
398
			fstp dword[edi+12] ;b1=(x1-x2)*(z1-z2)
399
			fld dword[esi+12]
400
			fmul dword[esi+20]
401
			fstp dword[edi+16] ;b2=(x2-x3)*(z2-z3)
402
			fld dword[esi+24]
403
			fmul dword[esi+32]
404
			fstp dword[edi+20] ;b3=(x3-x1)*(z3-z1)
405
			;c1,с2,с3
406
			fld dword[esi]
407
			fmul dword[esi+4]
408
			fstp dword[edi+24] ;c1=(x1-x2)*(y1-y2)
409
			fld dword[esi+12]
410
			fmul dword[esi+16]
411
			fstp dword[edi+28] ;c2=(x2-x3)*(y2-y3)
412
			fld dword[esi+24]
413
			fmul dword[esi+28]
414
			fstp dword[edi+32] ;c3=(x3-x1)*(y3-y1)
415
 
416
			fld dword[edi]
417
			fadd dword[edi+4]
418
			fadd dword[edi+8]
419
			fstp dword[eax] ;set normal.a
420
			fld dword[edi+12]
421
			fadd dword[edi+16]
422
			fadd dword[edi+20]
423
			fstp dword[eax+4] ;set normal.b
424
			fld dword[edi+24]
425
			fadd dword[edi+28]
426
			fadd dword[edi+32]
427
			fstp dword[eax+8] ;set normal.c
428
 
429
			add edx,8 ;размер треугольника = (3 вершины (по 2б) + свойства (2б))
430
			add eax,12
431
			dec ebx
432
			jnz @b
433
	.end:
434
popad
435
	ret
436
endp
437
 
438
;рисование точек в 3d
439
align 4
440
proc draw_3d uses eax ebx ecx edi, o_data:dword
441
	mov edi,[o_data]
442
	cmp dword[edi+offs_obj_poi_count],2
443
	jl .end_f
444
	stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;очистим буфер цвета и глубины
445
	stdcall [glPushMatrix]
446
	bt dword[draw_mode],bit_light
447
	jnc @f
448
		call SetLight
449
		jmp .end_l
450
	@@:
451
		stdcall [glDisable],GL_LIGHTING
452
	.end_l:
453
	stdcall [glTranslatef], 0.0,0.0,0.5 ;correct for z
454
	stdcall [glScalef], [edi+offs_obj_x_scale],[edi+offs_obj_y_scale],[edi+offs_obj_z_scale]
455
	stdcall [glScalef], 1.0,1.0,0.7 ;correct for z
456
	stdcall [glRotatef], [angle_z],0.0,0.0,1.0
457
	stdcall [glRotatef], [angle_y],0.0,1.0,0.0
458
	stdcall [glRotatef], [angle_x],1.0,0.0,0.0
459
	stdcall [glTranslatef], [edi+offs_obj_x_centr],[edi+offs_obj_y_centr],[edi+offs_obj_z_centr]
460
 
461
	;рисование точек
462
	bt dword[draw_mode],bit_vertexes
463
	jnc .end_points
464
		stdcall [glColor3ub],[color_vert+2],[color_vert+1],[color_vert]
465
		stdcall [glBegin],GL_POINTS
466
		mov eax,[edi+offs_obj_poi_data]
467
		mov ebx,[edi+offs_obj_poi_count]
468
		@@:
469
			stdcall [glVertex3f], [eax],[eax+4],[eax+8]
470
			add eax,12
471
			dec ebx
472
			jnz @b
473
		stdcall [glEnd]
474
	.end_points:
475
 
476
if version_edit eq 1
477
	;рисование активной точки
478
	stdcall [tl_node_get_data],tree3
479
	cmp eax,0
480
	je @f
481
		;выделение активной точки
482
		mov eax,[eax]
483
 
484
		stdcall [glBegin],GL_LINES
485
		stdcall [glColor3ub], [color_ox+2],[color_ox+1],[color_ox]
486
		stdcall [glVertex3f], [edi+offs_obj_x_min],[eax+4],[eax+8]
487
		stdcall [glVertex3f], [edi+offs_obj_x_max],[eax+4],[eax+8]
488
		stdcall [glColor3ub], [color_oy+2],[color_oy+1],[color_oy]
489
		stdcall [glVertex3f], [eax],[edi+offs_obj_y_min],[eax+8]
490
		stdcall [glVertex3f], [eax],[edi+offs_obj_y_max],[eax+8]
491
		stdcall [glColor3ub], [color_oz+2],[color_oz+1],[color_oz]
492
		stdcall [glVertex3f], [eax],[eax+4],[edi+offs_obj_z_min]
493
		stdcall [glVertex3f], [eax],[eax+4],[edi+offs_obj_z_max]
494
		stdcall [glEnd]
495
 
496
		stdcall [glColor3ub],[color_select+2],[color_select+1],[color_select]
497
		stdcall [glPushMatrix]
498
			stdcall [glTranslatef], [eax],[eax+4],[eax+8]
499
			stdcall [gluSphere], [qObj], [sph_radius], 8,8
500
		stdcall [glPopMatrix]
501
	@@:
502
 
503
	;рисование выделенных точек
504
	cmp dword[obj_poi_sel_c],0
505
	je .end_select
506
		mov ecx,dword[obj_poi_sel_c]
507
		stdcall [glColor3ub],[color_select+2],[color_select+1],[color_select]
508
		stdcall dword[tl_node_poi_get_info], tree3,0
509
		@@:
510
			cmp eax,0
511
			je .end_select
512
			mov ebx,eax
513
			cmp word[ebx],ID_ICON_POINT_SEL
514
			jne .next_sel
515
			stdcall [tl_node_poi_get_data], tree3,ebx
516
			mov eax,[eax]
517
			stdcall [glPushMatrix]
518
				stdcall [glTranslatef], [eax],[eax+4],[eax+8]
519
				stdcall [gluSphere], [qObj], [sph_radius], 4,4
520
			stdcall [glPopMatrix]
521
			dec ecx
522
			jz .end_select
523
			.next_sel:
524
			stdcall dword[tl_node_poi_get_next_info], tree3,ebx
525
			jmp @b
526
    .end_select:
527
end if
528
 
529
	;рисование граней
530
	bt dword[draw_mode],bit_faces
531
	jnc .end_triangles
532
	cmp dword[edi+offs_obj_tri_count],0
533
	je .end_triangles
534
	cmp dword[edi+offs_obj_poi_count],0
535
	je .end_triangles
536
		bt dword[draw_mode],bit_faces_fill
537
		jc @f
538
			push GL_LINE
539
			jmp .end_0
540
		@@:
541
			push GL_FILL
542
		.end_0:
543
		stdcall [glPolygonMode], GL_FRONT_AND_BACK ;mode - уже в стеке
544
		stdcall [glColor3ub],[color_face+2],[color_face+1],[color_face]
545
		stdcall [glBegin],GL_TRIANGLES
546
		mov eax,[edi+offs_obj_tri_data]
547
		mov ecx,[edi+offs_obj_tri_count]
548
		mov edx,[edi+offs_obj_normals_tri_data]
549
		@@:
550
			;
551
			bt dword[draw_mode],bit_light
552
			jnc .norm
553
				;[obj_normals_tri_count]
554
				stdcall [glNormal3fv], edx
555
				add edx,12
556
			.norm:
557
			;
558
			movzx ebx,word[eax] ;1-я вершина
559
			imul ebx,12
560
			add ebx,[edi+offs_obj_poi_data]
561
			stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
562
			movzx ebx,word[eax+2] ;2-я вершина
563
			imul ebx,12
564
			add ebx,[edi+offs_obj_poi_data]
565
			stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
566
			movzx ebx,word[eax+4] ;3-я вершина
567
			imul ebx,12
568
			add ebx,[edi+offs_obj_poi_data]
569
			stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
570
			add eax,8 ;размер треугольника = (3 вершины (по 2б) + свойства (2б))
571
			dec ecx
572
			jnz @b
573
		stdcall [glEnd]
574
	.end_triangles:
575
 
576
	stdcall [glPopMatrix]
577
if version_edit eq 1
578
	cmp dword[obj_poi_sel_c],0
579
	je @f
580
		stdcall [buf2d_draw_text], buf_ogl, buf_1,txt_select_vert,5,3,[color_select]
581
	@@:
582
end if
583
	stdcall [kosglSwapBuffers]
584
	.end_f:
585
	ret
586
endp
587
 
588
align 4
589
SetLight:
590
	stdcall [glLightfv], GL_LIGHT0, GL_POSITION, light_position
591
	stdcall [glLightfv], GL_LIGHT0, GL_SPOT_DIRECTION, light_dir
592
 
593
	stdcall [glLightfv], GL_LIGHT0, GL_DIFFUSE, white_light
594
	stdcall [glLightfv], GL_LIGHT0, GL_SPECULAR, white_light
595
 
596
	stdcall [glEnable], GL_COLOR_MATERIAL
597
	stdcall [glColorMaterial], GL_FRONT, GL_AMBIENT_AND_DIFFUSE
598
	stdcall [glMaterialfv], GL_FRONT, GL_SPECULAR, mat_specular
599
	stdcall [glMaterialf], GL_FRONT, GL_SHININESS, mat_shininess
600
	stdcall [glLightModelfv], GL_LIGHT_MODEL_AMBIENT, lmodel_ambient
601
 
602
	stdcall [glEnable],GL_LIGHTING
603
	stdcall [glEnable],GL_LIGHT0
604
	ret
605
 
606
;изменяем режим рисования вершин
607
align 4
608
mnu_vertexes_on_off:
609
	xor dword[draw_mode], 1 shl bit_vertexes
610
	stdcall draw_3d, o3d
611
	ret
612
 
613
;изменяем режим рисования граней
614
align 4
615
mnu_faces_on_off:
616
	xor dword[draw_mode], 1 shl bit_faces
617
	stdcall draw_3d, o3d
618
	ret
619
 
620
;изменяем каркасные или сплошные грани
621
align 4
622
mnu_faces_fill_on_off:
623
	xor dword[draw_mode], 1 shl bit_faces_fill
624
	or  dword[draw_mode], 1 shl bit_faces ;включаем режим рисования граней (если вдруг был отключен)
625
	stdcall draw_3d, o3d
626
	ret
627
 
628
;включаем или отключаем освещение
629
align 4
630
mnu_light_on_off:
631
	xor dword[draw_mode], 1 shl bit_light
632
	stdcall draw_3d, o3d
633
	ret
634
 
635
align 4
636
mnu_reset_settings:
637
	mov dword[angle_x],0.0
638
	mov dword[angle_y],0.0
639
	mov dword[angle_z],0.0
640
	m2m dword[draw_mode],dword[def_dr_mode]
641
	stdcall draw_3d, o3d
642
	ret
643
 
644
align 4
645
draw_mode dd 0 ;режим рисования объекта
646
def_dr_mode dd 0 ;режим рисования по умолчанию
647
delt_size dd 3.0 ;изменение углов при поворотах с кливиатуры
648
mouse_drag dd 0 ;режим поворота сцены от перемещении курсора мыши
649
mouse_x dd 0
650
mouse_y dd 0
651
sph_radius dd 0 ;радиус сферы для выделения активной точки
652