Subversion Repositories Kolibri OS

Rev

Rev 6510 | Rev 6889 | 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 ?
6509 IgorA 28
	mat1_data dd ? ;данные 1-го материала в объекте
6046 IgorA 29
ends
30
 
31
offs_obj_poi_data equ 0 ;указатель на координаты вершин
32
offs_obj_poi_count equ 4 ;колличество вершин
33
offs_obj_tri_data equ 8 ;указатель на данные треугольников
34
offs_obj_tri_count equ 12 ;колличество треугольников
35
offs_obj_normals_poi_data equ 16
36
offs_obj_normals_poi_count equ 20
37
offs_obj_normals_tri_data equ 24
38
offs_obj_normals_tri_count equ 28
39
offs_obj_x_max equ 32
40
offs_obj_x_min equ 36
41
offs_obj_x_centr equ 40
42
offs_obj_x_scale equ 44
43
offs_obj_y_max equ 48
44
offs_obj_y_min equ 52
45
offs_obj_y_centr equ 56
46
offs_obj_y_scale equ 60
47
offs_obj_z_max equ 64
48
offs_obj_z_min equ 68
49
offs_obj_z_centr equ 72
50
offs_obj_z_scale equ 76
6509 IgorA 51
offs_obj_mat1_data equ 80
6046 IgorA 52
 
6081 IgorA 53
struct material
54
	name dd ?
55
	col_ambient dd ? ;цвет материала
56
	col_diffuse dd ?
57
	col_specular dd ?
58
ends
6046 IgorA 59
 
6081 IgorA 60
offs_mat_name equ 0
61
offs_mat_col_ambient equ 4
62
offs_mat_col_diffuse equ 8
63
offs_mat_col_specular equ 12
64
 
6046 IgorA 65
bit_vertexes equ 0
6513 IgorA 66
bit_faces equ 1 ;грани рисуются контурами
67
bit_faces_fill equ 2 ;грани с заливкой
6046 IgorA 68
bit_light equ 3
6513 IgorA 69
bit_faces_mat equ 4 ;грани с цветом материала
70
bit_smooth equ 5 ;грани со сглаживанием
6046 IgorA 71
 
72
ini_name db 'info3ds.ini',0
73
ini_sec_w3d db 'Window 3d',0
74
key_dv  db 'draw_vertices',0
75
key_df  db 'draw_faces',0
76
key_dff db 'draw_faces_fill',0
6513 IgorA 77
key_dfm db 'draw_faces_material',0
6046 IgorA 78
key_dl  db 'draw_light',0
6513 IgorA 79
key_ds  db 'draw_smooth',0
6046 IgorA 80
key_ox  db 'col_ox',0
81
key_oy  db 'col_oy',0
82
key_oz  db 'col_oz',0
83
key_bk  db 'col_bkgnd',0
84
key_vert db 'col_vertices',0
85
key_face db 'col_faces',0
86
key_select db 'col_select',0
87
 
88
 
89
rad_c dd 150 ;для вычисления радиуса
90
 
6081 IgorA 91
align 4
92
proc hex_in_str, buf:dword,val:dword,zif:dword
93
pushad
94
	mov edi,dword[buf]
95
	mov ecx,dword[zif]
96
	add edi,ecx
97
	dec edi
98
	mov ebx,dword[val]
6046 IgorA 99
 
6081 IgorA 100
	.cycle:
101
		mov al,bl
102
		and al,0xf
103
		cmp al,10
104
		jl @f
105
			add al,'a'-'0'-10
106
		@@:
107
		add al,'0'
108
		mov byte[edi],al
109
		dec edi
110
		shr ebx,4
111
	loop .cycle
112
popad
113
	ret
114
endp
115
 
6046 IgorA 116
;установка всех основных переменных по умолчанию
117
align 4
118
proc obj_clear_param uses edi, o_data:dword
119
	mov edi,[o_data]
120
	;обнуление указателей на данные объектов
121
	mov dword[edi+offs_obj_poi_data],0
122
	mov dword[edi+offs_obj_poi_count],0
123
	mov dword[edi+offs_obj_tri_data],0
124
	mov dword[edi+offs_obj_tri_count],0
125
	mov dword[edi+offs_obj_normals_tri_count],0
126
	mov dword[edi+offs_obj_normals_poi_count],0
6509 IgorA 127
	mov dword[edi+offs_obj_mat1_data],0
6060 IgorA 128
	cmp dword[edi+offs_obj_normals_tri_data],0
129
	je @f
130
		stdcall mem.Free,[edi+offs_obj_normals_tri_data]
131
		mov dword[edi+offs_obj_normals_tri_data],0
132
	@@:
133
	cmp dword[edi+offs_obj_normals_poi_data],0
134
	je @f
135
		stdcall mem.Free,[edi+offs_obj_normals_poi_data]
136
		mov dword[edi+offs_obj_normals_poi_data],0
137
	@@:
6046 IgorA 138
	ret
139
endp
140
 
141
;поиск данных
142
;input:
143
;eax - текущий узел
144
;output:
145
;eax - структура текущего узла (или 0 при неудаче)
146
align 4
147
proc found_block_data uses ebx ecx edx, tlist:dword
148
	mov edx,[tlist]
149
	mov ecx,eax
150
	stdcall [tl_node_poi_get_info], edx,0
151
	@@:
152
		mov ebx,eax
153
		stdcall [tl_node_poi_get_data], edx,ebx
154
		cmp eax,ecx
155
		je @f ;если попали на выбранный узел
156
		stdcall [tl_node_poi_get_next_info], edx,ebx
157
		cmp eax,0
158
		jne @b
159
		jmp .end
160
	@@:
161
		mov eax,ebx
162
	.end:
163
	ret
164
endp
165
 
166
;установка размеров объекта
167
align 4
168
proc obj_set_sizes uses eax ebx esi edi, o_data:dword
169
	mov edi,[o_data]
170
	cmp dword[edi+offs_obj_poi_count],0
171
	je .end
172
		finit
173
		mov eax,[edi+offs_obj_poi_data]
174
		mov ebx,dword[eax]
175
		mov [edi+offs_obj_x_min],ebx
176
		mov [edi+offs_obj_x_max],ebx
177
		mov ebx,dword[eax+4]
178
		mov [edi+offs_obj_y_min],ebx
179
		mov [edi+offs_obj_y_max],ebx
180
		mov ebx,dword[eax+8]
181
		mov [edi+offs_obj_z_min],ebx
182
		mov [edi+offs_obj_z_max],ebx
183
 
184
	mov ebx,[edi+offs_obj_poi_data]
185
	mov esi,[edi+offs_obj_poi_count]
186
align 4
187
	.cycle_0: ;работа с координатой x
188
		fld dword[ebx]
189
		fld dword[edi+offs_obj_x_min]
190
		fcomp
191
		fstsw ax
192
		sahf
193
		jb @f
194
			mov eax,[ebx]
195
			mov [edi+offs_obj_x_min],eax
196
			ffree st0
197
			fincstp
198
			jmp .next_x
199
		@@:
200
		fld dword[edi+offs_obj_x_max]
201
		fcompp
202
		fstsw ax
203
		sahf
204
		ja .next_x
205
			mov eax,[ebx]
206
			mov [edi+offs_obj_x_max],eax
207
		.next_x:
208
 
209
		add ebx,12
210
		dec esi
211
		jnz .cycle_0
212
 
213
		fld1
214
		fld dword[edi+offs_obj_x_max]
215
		fsub dword[edi+offs_obj_x_min]
216
		fst dword[edi+offs_obj_x_centr]
217
		fdivp ;1/size.x
218
		fstp dword[edi+offs_obj_x_scale]
219
 
220
		fld dword[edi+offs_obj_x_centr]
221
		fld1
222
		fld1
223
		faddp
224
		fdivp ;centr.x = size.x/2
225
		fadd dword[edi+offs_obj_x_min]
226
		fchs
227
		fstp dword[edi+offs_obj_x_centr]
228
 
229
	mov ebx,[edi+offs_obj_poi_data]
230
	mov esi,[edi+offs_obj_poi_count]
231
align 4
232
	.cycle_1: ;работа с координатой y
233
		fld dword[ebx+4]
234
		fld dword[edi+offs_obj_y_min]
235
		fcomp
236
		fstsw ax
237
		sahf
238
		jb @f
239
			mov eax,[ebx+4]
240
			mov [edi+offs_obj_y_min],eax
241
			ffree st0
242
			fincstp
243
			jmp .next_y
244
		@@:
245
		fld dword[edi+offs_obj_y_max]
246
		fcompp
247
		fstsw ax
248
		sahf
249
		ja .next_y
250
			mov eax,[ebx+4]
251
			mov [edi+offs_obj_y_max],eax
252
		.next_y:
253
 
254
		add ebx,12
255
		dec esi
256
		jnz .cycle_1
257
 
258
		fld1
259
		fld dword[edi+offs_obj_y_max]
260
		fsub dword[edi+offs_obj_y_min]
261
		fst dword[edi+offs_obj_y_centr]
262
		fdivp ;1/size.y
263
		fstp dword[edi+offs_obj_y_scale]
264
 
265
		fld dword[edi+offs_obj_y_centr]
266
		fld1
267
		fld1
268
		faddp
269
		fdivp ;centr.y = size.y/2
270
		fadd dword[edi+offs_obj_y_min]
271
		fchs
272
		fstp dword[edi+offs_obj_y_centr]
273
 
274
	mov ebx,[edi+offs_obj_poi_data]
275
	mov esi,[edi+offs_obj_poi_count]
276
align 4
277
	.cycle_2: ;работа с координатой z
278
		fld dword[ebx+8]
279
		fld dword[edi+offs_obj_z_min]
280
		fcomp
281
		fstsw ax
282
		sahf
283
		jb @f
284
			mov eax,[ebx+8]
285
			mov [edi+offs_obj_z_min],eax
286
			ffree st0
287
			fincstp
288
			jmp .next_z
289
		@@:
290
		fld dword[edi+offs_obj_z_max]
291
		fcompp
292
		fstsw ax
293
		sahf
294
		ja .next_z
295
			mov eax,[ebx+8]
296
			mov [edi+offs_obj_z_max],eax
297
		.next_z:
298
 
299
		add ebx,12
300
		dec esi
301
		jnz .cycle_2
302
 
303
		fld1
304
		fld dword[edi+offs_obj_z_max]
305
		fsub dword[edi+offs_obj_z_min]
306
		fst dword[edi+offs_obj_z_centr]
307
		fdivp ;1/size.z
308
		fstp dword[edi+offs_obj_z_scale]
309
 
310
		fld dword[edi+offs_obj_z_centr]
311
		fld1
312
		fld1
313
		faddp
314
		fdivp ;centr.z = size.z/2
315
		fadd dword[edi+offs_obj_z_min]
316
		fchs
317
		fstp dword[edi+offs_obj_z_centr]
318
 
319
		;находим радиус для сферы
320
		fld dword[edi+offs_obj_x_max]
321
		fsub dword[edi+offs_obj_x_min]
322
		fld dword[edi+offs_obj_y_max]
323
		fsub dword[edi+offs_obj_y_min]
324
		faddp
325
		fild dword[rad_c]
326
		fdivp ;radius=(size.x+size.y)/rad_c
327
		fstp dword[sph_radius]
328
 
329
	;делаем одинаковый масштаб по осям x и y, что-бы не нарушались пропорции изображения
330
	fld dword[edi+offs_obj_y_scale]
331
	fdiv dword[ratio] ;приведение масштаба по оси y учитывая что по высоте экран меньше
332
	fcomp dword[edi+offs_obj_x_scale]
333
	fstsw ax
334
	sahf
335
	jb @f
336
		;сжатие масштаба по y
337
		fld dword[edi+offs_obj_x_scale]
338
		fmul dword[ratio]
339
		fstp dword[edi+offs_obj_y_scale] ;масштаб по оси y = масштаб по оси x
340
		jmp .end
341
	@@:
342
		;сжатие масштаба по x >...<
343
		fld	dword[edi+offs_obj_x_scale]
344
		fdiv dword[ratio]
345
		fstp dword[edi+offs_obj_x_scale]
346
	.end:
347
	ret
348
endp
349
 
6510 IgorA 350
;description:
351
; вычисление нормалей для граней по 3-м вершинам
6513 IgorA 352
; а также нормалей для сглаживания к вершинам
6046 IgorA 353
align 4
354
proc obj_set_normals, o_data:dword
355
locals
356
	tbl1 rd 9 ;ebp-72
357
	tbl2 rd 9 ;ebp-36
358
endl
359
pushad
360
	mov ecx,[o_data]
361
	cmp dword[ecx+offs_obj_poi_count],0
362
	je .end
363
		mov eax,[ecx+offs_obj_tri_count]
364
		mov [ecx+offs_obj_normals_tri_count],eax ;на каждый треугольник 1 нормаль
365
		cmp eax,0
366
		je .end
367
		finit
368
		imul eax,12
369
		stdcall mem.Alloc, eax
370
		mov [ecx+offs_obj_normals_tri_data],eax
371
 
372
		mov edx,[ecx+offs_obj_tri_data]
373
		mov ebx,[ecx+offs_obj_tri_count]
374
		mov ecx,[ecx+offs_obj_poi_data]
375
align 4
376
		@@:
377
			mov edi,ebp
378
			sub edi,36 ;tbl2
379
			movzx esi,word[edx] ;1-я вершина
380
			imul esi,12
381
			add esi,ecx
382
			movsd
383
			movsd
384
			movsd
385
			movzx esi,word[edx+2] ;2-я вершина
386
			imul esi,12
387
			add esi,ecx
388
			movsd
389
			movsd
390
			movsd
391
			movzx esi,word[edx+4] ;3-я вершина
392
			imul esi,12
393
			add esi,ecx
394
			movsd
395
			movsd
396
			movsd
397
 
398
			mov esi,ebp
399
			sub esi,72 ;tbl1
400
			sub edi,36 ;tbl2
401
			;v1 <-> v2
402
			fld dword[edi+12]
403
			fsub dword[edi]
6510 IgorA 404
			fstp dword[esi] ;(x2-x1)
6046 IgorA 405
			fld dword[edi+16]
406
			fsub dword[edi+4]
6510 IgorA 407
			fstp dword[esi+4] ;(y2-y1)
6046 IgorA 408
			fld dword[edi+20]
409
			fsub dword[edi+8]
6510 IgorA 410
			fstp dword[esi+8] ;(z2-z1)
6046 IgorA 411
			;v2 <-> v3
6510 IgorA 412
			fld dword[edi+12]
413
			fsub dword[edi+24]
6046 IgorA 414
			fstp dword[esi+12] ;(x2-x3)
6510 IgorA 415
			fld dword[edi+16]
416
			fsub dword[edi+28]
6046 IgorA 417
			fstp dword[esi+16] ;(y2-y3)
6510 IgorA 418
			fld dword[edi+20]
419
			fsub dword[edi+32]
6046 IgorA 420
			fstp dword[esi+20] ;(z2-z3)
421
			;v3 <-> v1
6510 IgorA 422
			fld dword[edi+24]
423
			fsub dword[edi]
6046 IgorA 424
			fstp dword[esi+24] ;(x3-x1)
6510 IgorA 425
			fld dword[edi+28]
426
			fsub dword[edi+4]
6046 IgorA 427
			fstp dword[esi+28] ;(y3-y1)
6510 IgorA 428
			fld dword[edi+32]
429
			fsub dword[edi+8]
6046 IgorA 430
			fstp dword[esi+32] ;(z3-z1)
431
 
6510 IgorA 432
			;A = (y2-y1) * (z3-z1) - (z2-z1) * (y3-y1)
6046 IgorA 433
			fld dword[esi+4]
434
			fmul dword[esi+32]
6510 IgorA 435
			fld dword[esi+8]
436
			fmul dword[esi+28]
437
			fsubp
438
			fstp dword[eax] ;set normal.a
439
 
440
			;B = (z2-z1) * (x3-x1) - (x2-x1) * (z3-z1)
441
			fld dword[esi+8]
442
			fmul dword[esi+24]
6046 IgorA 443
			fld dword[esi]
444
			fmul dword[esi+32]
6510 IgorA 445
			fsubp
446
			fstp dword[eax+4] ;set normal.b
447
 
448
			;C = (x2-x1) * (y3-y1) - (y2-y1) * (x3-x1)
6046 IgorA 449
			fld dword[esi]
450
			fmul dword[esi+28]
6510 IgorA 451
			fld dword[esi+4]
452
			fmul dword[esi+24]
453
			fsubp
6046 IgorA 454
			fstp dword[eax+8] ;set normal.c
6513 IgorA 455
 
456
			stdcall V3_Norm,eax
457
 
6046 IgorA 458
			add edx,8 ;размер треугольника = (3 вершины (по 2б) + свойства (2б))
459
			add eax,12
460
			dec ebx
461
			jnz @b
6513 IgorA 462
 
463
		;нормали к вершинам
464
		mov ebx,[o_data]
465
		mov ecx,[ebx+offs_obj_poi_count]
466
		mov [ebx+offs_obj_normals_poi_count],ecx
467
		cmp ecx,0
468
		je .end
469
		imul ecx,12
470
		stdcall mem.Alloc,ecx
471
		mov [ebx+offs_obj_normals_poi_data],eax
472
 
473
		mov edi,eax
474
		mov eax,0.0
475
		shr ecx,2
476
		rep stosd ;очистка 0-ми float
477
 
478
		mov edx,[ebx+offs_obj_tri_count]
479
		mov edi,[ebx+offs_obj_tri_data]
480
		mov eax,[ebx+offs_obj_normals_tri_data]
481
		mov ecx,[ebx+offs_obj_poi_data]
482
		mov ebx,[ebx+offs_obj_normals_poi_data]
483
align 4
484
		.cycle_0: ;по граням
485
			movzx esi,word[edi] ;1-я вершина
486
			imul esi,12
487
			add esi,ecx
488
			push esi
489
			movzx esi,word[edi+2] ;2-я вершина
490
			imul esi,12
491
			add esi,ecx
492
			push esi
493
			movzx esi,word[edi+4] ;3-я вершина
494
			imul esi,12
495
			add esi,ecx
496
			push esi
497
 
498
			movzx esi,word[edi] ;1-я вершина
499
			imul esi,12
500
			add esi,ebx
501
			push esi
502
			movzx esi,word[edi+2] ;2-я вершина
503
			imul esi,12
504
			add esi,ebx
505
			push esi
506
			movzx esi,word[edi+4] ;3-я вершина
507
			imul esi,12
508
			add esi,ebx
509
			push esi
510
 
511
			stdcall poi_normal_add,eax
512
 
513
			add edi,8
514
			add eax,12
515
			dec edx
516
			jnz .cycle_0
517
		.cycle_0_end:
6046 IgorA 518
	.end:
519
popad
520
	ret
521
endp
522
 
6513 IgorA 523
;input:
524
; norm_tr - указатель на нормаль к грани
525
; n1, n2, n3 - указатели на нормали вершин
526
; c1, c2, c3 - указатели на координаты вершин
527
align 4
528
proc poi_normal_add uses eax ebx,\
529
	norm_tr:dword, n1:dword, n2:dword, n3:dword, c1:dword, c2:dword, c3:dword
530
 
531
	mov ebx,[norm_tr]
532
 
533
	mov eax,[n1]
534
	fld dword[eax]
535
	fadd dword[ebx]
536
	fstp dword[eax]
537
	fld dword[eax+4]
538
	fadd dword[ebx+4]
539
	fstp dword[eax+4]
540
	fld dword[eax+8]
541
	fadd dword[ebx+8]
542
	fstp dword[eax+8]
543
 
544
	mov eax,[n2]
545
	fld dword[eax]
546
	fadd dword[ebx]
547
	fstp dword[eax]
548
	fld dword[eax+4]
549
	fadd dword[ebx+4]
550
	fstp dword[eax+4]
551
	fld dword[eax+8]
552
	fadd dword[ebx+8]
553
	fstp dword[eax+8]
554
 
555
	mov eax,[n3]
556
	fld dword[eax]
557
	fadd dword[ebx]
558
	fstp dword[eax]
559
	fld dword[eax+4]
560
	fadd dword[ebx+4]
561
	fstp dword[eax+4]
562
	fld dword[eax+8]
563
	fadd dword[ebx+8]
564
	fstp dword[eax+8]
565
 
566
	ret
567
endp
568
 
569
;description:
570
; normalize vector
571
align 4
572
proc V3_Norm uses eax ebx, a:dword
573
	mov ebx,[a]
574
	fld dword[ebx]
575
	fmul st0,st0
576
	fld dword[ebx+4]
577
	fmul st0,st0
578
	faddp
579
	fld dword[ebx+8]
580
	fmul st0,st0
581
	faddp
582
	fsqrt ;st0 = sqrt(a.X^2 +a.Y^2 +a.Z^2)
583
	ftst
584
	fstsw ax
585
	sahf
586
	je .r1 ;if (sqrt(...)==0) return 1
587
		fld dword[ebx] ;offs_X = 0
588
		fdiv st0,st1
589
		fstp dword[ebx] ;a.X/=sqrt(...)
590
		fld dword[ebx+4]
591
		fdiv st0,st1
592
		fstp dword[ebx+4] ;a.Y/=sqrt(...)
593
		fld dword[ebx+8]
594
		fdiv st0,st1
595
		fstp dword[ebx+8] ;a.Z/=sqrt(...)
596
	.r1:
597
	ffree st0
598
	fincstp
599
	ret
600
endp
601
 
6060 IgorA 602
;настройка структуры 3d объекта
603
align 4
604
proc obj_init, o_data:dword
605
	pushad
606
	mov edi,[o_data]
607
	stdcall obj_clear_param, edi
608
	stdcall [tl_node_get_data],tree1
609
	xor edx,edx
610
	cmp eax,0
611
	je .no_points
612
		mov ebx,[eax] ;получаем значение сдвига выбранного блока
613
		add ebx,[open_file_data]
614
		xor ecx,ecx
615
		cmp word[ebx],CHUNK_OBJBLOCK
616
		jne @f
617
			mov ecx,ebx
618
			add ecx,dword[ecx+2] ;граница блока
619
			push eax edi
620
				mov edi,ebx
621
				add edi,6
622
				cld
623
				xor al,al
624
				repne scasb ;пропуск имени объекта
625
				mov ebx,edi
626
			pop edi eax
627
		@@:
628
		cmp word[ebx],CHUNK_TRIMESH
629
		jne @f
630
			mov ecx,ebx
631
			add ecx,dword[ecx+2] ;граница блока
632
			add ebx,6
633
		@@:
634
		cmp word[ebx],CHUNK_VERTLIST
635
		jne .no_points
636
			mov esi,ebx
637
			movzx edx,word[ebx+6] ;колличество точек
638
			add ebx,8
639
			mov [edi+offs_obj_poi_data],ebx
640
			mov [edi+offs_obj_poi_count],edx
641
 
642
			.cycle_0: ;цикл для поиска треугольников
643
				add esi,dword[esi+2]
644
				cmp word[esi],CHUNK_FACELIST
645
				je @f
646
					cmp ecx,esi
647
					jg .cycle_0 ;пока не достигнута грница старшего блока
648
					jmp .end_points ;если не нашли треугольники
649
			@@:
650
			;если нашли треугольники
651
			movzx edx,word[esi+6]
652
			mov [edi+offs_obj_tri_count],edx
653
			add esi,8 ;2+4+2 (chunk+size+count)
654
			mov [edi+offs_obj_tri_data],esi
6509 IgorA 655
 
656
			;поиск материалов граней
657
			shl edx,3
658
			add esi,edx
659
			cmp word[esi],CHUNK_FACEMAT
660
			jne .end_points
661
				mov [edi+offs_obj_mat1_data],esi
6060 IgorA 662
		.end_points:
663
 
664
		stdcall obj_set_sizes, edi
665
		stdcall obj_set_normals, edi
666
if version_edit eq 0
667
		stdcall draw_3d, edi
668
end if
669
	.no_points:
670
	popad
671
	ret
672
endp
673
 
6081 IgorA 674
;настройка материала
6509 IgorA 675
;input:
676
; m_data - указатель на заполняемую структуру с материалом
677
; f_data - указательна на блок CHUNK_MATERIAL из файла 3ds
6081 IgorA 678
align 4
6509 IgorA 679
proc mat_init, m_data:dword, f_data:dword
6081 IgorA 680
	pushad
681
	mov edi,[m_data]
682
 
683
	;... clear edi ...
684
	mov dword[edi+offs_mat_name],0
685
	mov dword[edi+offs_mat_col_ambient],0
686
	mov dword[edi+offs_mat_col_diffuse],0
687
	mov dword[edi+offs_mat_col_specular],0
688
 
689
	xor edx,edx
6509 IgorA 690
	mov ebx,[f_data]
691
	xor ecx,ecx
692
	cmp word[ebx],CHUNK_MATERIAL
693
	jne .no_material
694
		mov ecx,ebx
695
		add ecx,dword[ecx+2] ;граница блока
696
		add ebx,6
697
	cmp word[ebx],CHUNK_MATNAME
698
	jne .no_material
699
		;*** (0) ***
700
		mov esi,ebx
701
		add ebx,6
702
		mov [edi+offs_mat_name],ebx
703
		sub ebx,6
704
		;*** (1) ***
705
		.cycle_0: ;цикл для поиска цвета материала
706
			add esi,dword[esi+2]
707
			cmp word[esi],0xa010
708
			je @f
709
				cmp ecx,esi
710
				jg .cycle_0 ;пока не достигнута грница старшего блока
711
				jmp .end_material ;если не нашли цвет материала
712
		@@:
713
		;если нашли цвет материала
714
		add esi,6
715
		cmp word[esi],0x0011
716
		jne .end_material
6081 IgorA 717
			add esi,6
6509 IgorA 718
			mov dl,byte[esi]
719
			mov [edi+offs_mat_col_ambient+2],dl
720
			mov dx,word[esi+1]
721
			ror dx,8
722
			mov [edi+offs_mat_col_ambient],dx
723
		;*** (2) ***
724
		mov esi,ebx
725
		.cycle_1: ;цикл для поиска цвета материала
726
			add esi,dword[esi+2]
727
			cmp word[esi],0xa020
728
			je @f
729
				cmp ecx,esi
730
				jg .cycle_1 ;пока не достигнута грница старшего блока
731
				jmp .end_material ;если не нашли цвет материала
732
		@@:
733
		;если нашли цвет материала
734
		add esi,6
735
		cmp word[esi],0x0011
736
		jne .end_material
6081 IgorA 737
			add esi,6
6509 IgorA 738
			mov dl,byte[esi]
739
			mov [edi+offs_mat_col_diffuse+2],dl
740
			mov dx,word[esi+1]
741
			ror dx,8
742
			mov [edi+offs_mat_col_diffuse],dx
743
		;*** (3) ***
744
		mov esi,ebx
745
		.cycle_2: ;цикл для поиска цвета материала
746
			add esi,dword[esi+2]
747
			cmp word[esi],0xa030
748
			je @f
749
				cmp ecx,esi
750
				jg .cycle_2 ;пока не достигнута грница старшего блока
751
				jmp .end_material ;если не нашли цвет материала
752
		@@:
753
		;если нашли цвет материала
754
		add esi,6
755
		cmp word[esi],0x0011
756
		jne .end_material
6081 IgorA 757
			add esi,6
6509 IgorA 758
			mov dl,byte[esi]
759
			mov [edi+offs_mat_col_specular+2],dl
760
			mov dx,word[esi+1]
761
			ror dx,8
762
			mov [edi+offs_mat_col_specular],dx
6081 IgorA 763
 
6509 IgorA 764
		.end_material:
6081 IgorA 765
	.no_material:
766
	popad
767
	ret
768
endp
769
 
770
align 4
771
proc buf_draw_beg uses eax, buf:dword
772
	mov eax,[buf]
773
	stdcall [buf2d_clear], eax, [eax+16] ;чистим буфер
774
	stdcall [buf2d_draw_text], eax, buf_1,txt_open_3ds,5,5,0xff
775
	stdcall [buf2d_draw_text], eax, buf_1,openfile_path,5,15,0xff
776
	cmp dword[level_stack],FILE_ERROR_CHUNK_SIZE ;возможна ошибка файла
777
	jne @f
778
		stdcall [buf2d_draw_text], eax, buf_1,txt_3ds_err_sizes,5,25,0xff0000
779
	@@:
780
	ret
781
endp
782
 
783
;рисование материала
784
align 4
785
proc draw_material uses edi, m_data:dword
786
	mov edi,[m_data]
787
	stdcall buf_draw_beg, buf_ogl
788
	stdcall [buf2d_draw_text], buf_ogl, buf_1,txt_afff,5,35,0xff
789
 
790
	stdcall [buf2d_draw_text], buf_ogl,buf_1,[edi+offs_mat_name],15,45,0 ;имя материала
791
	stdcall draw_color, [edi+offs_mat_col_ambient], txt_a010,2,55 ;окружающий цвет
792
	stdcall draw_color, [edi+offs_mat_col_diffuse], txt_a020,2,75 ;дифузный цвет
793
	stdcall draw_color, [edi+offs_mat_col_specular],txt_a030,2,95 ;зеркальный цвет
794
 
795
	stdcall [buf2d_draw], buf_ogl
796
	ret
797
endp
798
 
799
align 4
800
proc draw_color uses eax ebx, color:dword, text:dword, c_x:dword, c_y:dword
801
	mov eax,[c_x]
802
	mov ebx,[c_y]
803
	; прямоугольник
804
	inc ebx
805
	stdcall [buf2d_filled_rect_by_size], buf_ogl,eax,ebx,30,17,[color]
806
	dec ebx
807
	stdcall [buf2d_rect_by_size], buf_ogl,eax,ebx,30,19, 0
808
	; подписи
809
	add eax,33
810
	stdcall [buf2d_draw_text], buf_ogl, buf_1,[text],eax,ebx,0
811
	add ebx,10
812
	stdcall hex_in_str, buffer,[color],6
813
	mov byte[buffer+6],0
814
	stdcall [buf2d_draw_text], buf_ogl, buf_1,buffer,eax,ebx,0
815
	ret
816
endp
817
 
6046 IgorA 818
;рисование точек в 3d
819
align 4
820
proc draw_3d uses eax ebx ecx edi, o_data:dword
821
	mov edi,[o_data]
822
	cmp dword[edi+offs_obj_poi_count],2
823
	jl .end_f
824
	stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;очистим буфер цвета и глубины
825
	stdcall [glPushMatrix]
826
	bt dword[draw_mode],bit_light
827
	jnc @f
828
		call SetLight
829
		jmp .end_l
830
	@@:
831
		stdcall [glDisable],GL_LIGHTING
832
	.end_l:
833
	stdcall [glTranslatef], 0.0,0.0,0.5 ;correct for z
834
	stdcall [glScalef], [edi+offs_obj_x_scale],[edi+offs_obj_y_scale],[edi+offs_obj_z_scale]
835
	stdcall [glScalef], 1.0,1.0,0.7 ;correct for z
836
	stdcall [glRotatef], [angle_z],0.0,0.0,1.0
837
	stdcall [glRotatef], [angle_y],0.0,1.0,0.0
838
	stdcall [glRotatef], [angle_x],1.0,0.0,0.0
839
	stdcall [glTranslatef], [edi+offs_obj_x_centr],[edi+offs_obj_y_centr],[edi+offs_obj_z_centr]
840
 
6509 IgorA 841
if version_edit eq 0
842
	;рисование граней с использованием цветов материалов
843
	bt dword[draw_mode],bit_faces_mat
844
	jnc @f
845
		mov eax,[edi+offs_obj_mat1_data]
846
		.b_found:
847
		cmp eax,0
6513 IgorA 848
		je .end_points
6509 IgorA 849
			mov ebx,eax
850
			stdcall get_mat_color, eax
851
			stdcall draw_3d_faces_color, edi,ebx,eax
852
			stdcall found_mat_faces, ebx
853
		jmp .b_found
854
	@@:
855
end if
856
 
6513 IgorA 857
	;рисование граней без цветов материалов
858
	bt dword[draw_mode],bit_faces
859
	jnc .end_triangles
860
	cmp dword[edi+offs_obj_tri_count],0
861
	je .end_triangles
862
	cmp dword[edi+offs_obj_poi_count],0
863
	je .end_triangles
864
		bt dword[draw_mode],bit_faces_fill
865
		jc @f
866
			push GL_LINE
867
			jmp .end_0
868
		@@:
869
			push GL_FILL
870
		.end_0:
871
		stdcall [glPolygonMode], GL_FRONT_AND_BACK ;mode - уже в стеке
872
		stdcall [glColor3ub],[color_face+2],[color_face+1],[color_face]
873
 
874
		bt dword[draw_mode],bit_smooth
875
		jnc .triangles_flat
876
		bt dword[draw_mode],bit_light
877
		jnc .triangles_flat
878
			;triangles smooth
879
			stdcall [glBegin],GL_TRIANGLES
880
			mov eax,[edi+offs_obj_tri_data]
881
			mov ecx,[edi+offs_obj_tri_count]
882
			mov edx,[edi+offs_obj_normals_tri_data]
883
align 4
884
			@@:
885
				movzx ebx,word[eax] ;1-я вершина
886
				imul ebx,12
887
					add ebx,[edi+offs_obj_normals_poi_data]
888
					stdcall [glNormal3fv], ebx
889
					sub ebx,[edi+offs_obj_normals_poi_data]
890
				add ebx,[edi+offs_obj_poi_data]
891
				stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
892
				movzx ebx,word[eax+2] ;2-я вершина
893
				imul ebx,12
894
					add ebx,[edi+offs_obj_normals_poi_data]
895
					stdcall [glNormal3fv], ebx
896
					sub ebx,[edi+offs_obj_normals_poi_data]
897
				add ebx,[edi+offs_obj_poi_data]
898
				stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
899
				movzx ebx,word[eax+4] ;3-я вершина
900
				imul ebx,12
901
					add ebx,[edi+offs_obj_normals_poi_data]
902
					stdcall [glNormal3fv], ebx
903
					sub ebx,[edi+offs_obj_normals_poi_data]
904
				add ebx,[edi+offs_obj_poi_data]
905
				stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
906
				add eax,8 ;размер треугольника = (3 вершины (по 2б) + свойства (2б))
907
				dec ecx
908
				jnz @b
909
			stdcall [glEnd]
910
			jmp .end_points
911
 
912
		.triangles_flat:
913
		stdcall [glBegin],GL_TRIANGLES
914
		mov eax,[edi+offs_obj_tri_data]
915
		mov ecx,[edi+offs_obj_tri_count]
916
		mov edx,[edi+offs_obj_normals_tri_data]
917
align 4
918
		@@:
919
			;
920
			bt dword[draw_mode],bit_light
921
			jnc .norm1
922
				stdcall [glNormal3fv], edx
923
				add edx,12
924
			.norm1:
925
			movzx ebx,word[eax] ;1-я вершина
926
			imul ebx,12
927
			add ebx,[edi+offs_obj_poi_data]
928
			stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
929
			movzx ebx,word[eax+2] ;2-я вершина
930
			imul ebx,12
931
			add ebx,[edi+offs_obj_poi_data]
932
			stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
933
			movzx ebx,word[eax+4] ;3-я вершина
934
			imul ebx,12
935
			add ebx,[edi+offs_obj_poi_data]
936
			stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
937
			add eax,8 ;размер треугольника = (3 вершины (по 2б) + свойства (2б))
938
			dec ecx
939
			jnz @b
940
		stdcall [glEnd]
941
		jmp .end_points
942
	.end_triangles:
943
 
6046 IgorA 944
	;рисование точек
945
	bt dword[draw_mode],bit_vertexes
946
	jnc .end_points
947
		stdcall [glColor3ub],[color_vert+2],[color_vert+1],[color_vert]
948
		stdcall [glBegin],GL_POINTS
949
		mov eax,[edi+offs_obj_poi_data]
950
		mov ebx,[edi+offs_obj_poi_count]
6513 IgorA 951
		mov edx,[edi+offs_obj_normals_poi_data]
952
align 4
6046 IgorA 953
		@@:
6513 IgorA 954
			bt dword[draw_mode],bit_light
955
			jnc .norm0
956
				stdcall [glNormal3fv], edx
957
				add edx,12
958
			.norm0:
6046 IgorA 959
			stdcall [glVertex3f], [eax],[eax+4],[eax+8]
960
			add eax,12
961
			dec ebx
962
			jnz @b
963
		stdcall [glEnd]
964
	.end_points:
965
 
966
if version_edit eq 1
967
	;рисование активной точки
968
	stdcall [tl_node_get_data],tree3
969
	cmp eax,0
970
	je @f
971
		;выделение активной точки
972
		mov eax,[eax]
973
 
974
		stdcall [glBegin],GL_LINES
975
		stdcall [glColor3ub], [color_ox+2],[color_ox+1],[color_ox]
976
		stdcall [glVertex3f], [edi+offs_obj_x_min],[eax+4],[eax+8]
977
		stdcall [glVertex3f], [edi+offs_obj_x_max],[eax+4],[eax+8]
978
		stdcall [glColor3ub], [color_oy+2],[color_oy+1],[color_oy]
979
		stdcall [glVertex3f], [eax],[edi+offs_obj_y_min],[eax+8]
980
		stdcall [glVertex3f], [eax],[edi+offs_obj_y_max],[eax+8]
981
		stdcall [glColor3ub], [color_oz+2],[color_oz+1],[color_oz]
982
		stdcall [glVertex3f], [eax],[eax+4],[edi+offs_obj_z_min]
983
		stdcall [glVertex3f], [eax],[eax+4],[edi+offs_obj_z_max]
984
		stdcall [glEnd]
985
 
986
		stdcall [glColor3ub],[color_select+2],[color_select+1],[color_select]
987
		stdcall [glPushMatrix]
988
			stdcall [glTranslatef], [eax],[eax+4],[eax+8]
989
			stdcall [gluSphere], [qObj], [sph_radius], 8,8
990
		stdcall [glPopMatrix]
991
	@@:
992
 
993
	;рисование выделенных точек
994
	cmp dword[obj_poi_sel_c],0
995
	je .end_select
996
		mov ecx,dword[obj_poi_sel_c]
997
		stdcall [glColor3ub],[color_select+2],[color_select+1],[color_select]
998
		stdcall dword[tl_node_poi_get_info], tree3,0
6513 IgorA 999
align 4
6046 IgorA 1000
		@@:
1001
			cmp eax,0
1002
			je .end_select
1003
			mov ebx,eax
1004
			cmp word[ebx],ID_ICON_POINT_SEL
1005
			jne .next_sel
1006
			stdcall [tl_node_poi_get_data], tree3,ebx
1007
			mov eax,[eax]
1008
			stdcall [glPushMatrix]
1009
				stdcall [glTranslatef], [eax],[eax+4],[eax+8]
1010
				stdcall [gluSphere], [qObj], [sph_radius], 4,4
1011
			stdcall [glPopMatrix]
1012
			dec ecx
1013
			jz .end_select
1014
			.next_sel:
1015
			stdcall dword[tl_node_poi_get_next_info], tree3,ebx
1016
			jmp @b
1017
    .end_select:
1018
end if
1019
 
1020
	stdcall [glPopMatrix]
1021
if version_edit eq 1
1022
	cmp dword[obj_poi_sel_c],0
1023
	je @f
1024
		stdcall [buf2d_draw_text], buf_ogl, buf_1,txt_select_vert,5,3,[color_select]
1025
	@@:
1026
end if
1027
	stdcall [kosglSwapBuffers]
1028
	.end_f:
1029
	ret
1030
endp
1031
 
1032
align 4
1033
SetLight:
1034
	stdcall [glLightfv], GL_LIGHT0, GL_POSITION, light_position
1035
	stdcall [glLightfv], GL_LIGHT0, GL_SPOT_DIRECTION, light_dir
1036
 
1037
	stdcall [glLightfv], GL_LIGHT0, GL_DIFFUSE, white_light
1038
	stdcall [glLightfv], GL_LIGHT0, GL_SPECULAR, white_light
1039
 
1040
	stdcall [glEnable], GL_COLOR_MATERIAL
1041
	stdcall [glColorMaterial], GL_FRONT, GL_AMBIENT_AND_DIFFUSE
1042
	stdcall [glMaterialfv], GL_FRONT, GL_SPECULAR, mat_specular
1043
	stdcall [glMaterialf], GL_FRONT, GL_SHININESS, mat_shininess
1044
	stdcall [glLightModelfv], GL_LIGHT_MODEL_AMBIENT, lmodel_ambient
1045
 
1046
	stdcall [glEnable],GL_LIGHTING
1047
	stdcall [glEnable],GL_LIGHT0
1048
	ret
1049
 
6060 IgorA 1050
;включаем режим рисования вершин
6046 IgorA 1051
align 4
6060 IgorA 1052
mnu_vertexes_on:
1053
	or dword[draw_mode], 1 shl bit_vertexes
6509 IgorA 1054
	and dword[draw_mode], not ((1 shl bit_faces)+(1 shl bit_faces_mat)) ;выключаем режимы рисования, которые могут мешать
6060 IgorA 1055
	call update_obj
6046 IgorA 1056
	ret
1057
 
6060 IgorA 1058
;включаем режим рисования каркасных граней
6046 IgorA 1059
align 4
6060 IgorA 1060
mnu_edges_on:
1061
	or dword[draw_mode], 1 shl bit_faces
6509 IgorA 1062
	and dword[draw_mode], not ((1 shl bit_vertexes)+(1 shl bit_faces_fill)+(1 shl bit_faces_mat))
6060 IgorA 1063
	call update_obj
6046 IgorA 1064
	ret
1065
 
6060 IgorA 1066
;включаем режим рисования сплошных граней
6046 IgorA 1067
align 4
6060 IgorA 1068
mnu_faces_on:
1069
	or dword[draw_mode], (1 shl bit_faces)+(1 shl bit_faces_fill)
6509 IgorA 1070
	and dword[draw_mode], not ((1 shl bit_vertexes)+(1 shl bit_faces_mat))
6060 IgorA 1071
	call update_obj
6046 IgorA 1072
	ret
1073
 
1074
;включаем или отключаем освещение
1075
align 4
1076
mnu_light_on_off:
1077
	xor dword[draw_mode], 1 shl bit_light
6060 IgorA 1078
	call update_obj
6046 IgorA 1079
	ret
1080
 
1081
align 4
6513 IgorA 1082
mnu_smooth_on_off:
1083
	xor dword[draw_mode], 1 shl bit_smooth
1084
	call update_obj
1085
	ret
1086
 
1087
align 4
6046 IgorA 1088
mnu_reset_settings:
1089
	mov dword[angle_x],0.0
1090
	mov dword[angle_y],0.0
1091
	mov dword[angle_z],0.0
1092
	m2m dword[draw_mode],dword[def_dr_mode]
6060 IgorA 1093
	call update_obj
1094
	ret
1095
 
1096
if version_edit eq 1
1097
 
1098
align 4
1099
update_obj:
6046 IgorA 1100
	stdcall draw_3d, o3d
1101
	ret
1102
 
6060 IgorA 1103
else
1104
 
6509 IgorA 1105
;включаем режим рисования сплошных граней
6046 IgorA 1106
align 4
6509 IgorA 1107
mnu_faces_mat:
1108
	or dword[draw_mode], (1 shl bit_faces_mat)
1109
	call update_obj
1110
	ret
1111
 
1112
align 4
6060 IgorA 1113
update_obj:
6081 IgorA 1114
push eax ebx
6060 IgorA 1115
	stdcall [tl_node_get_data],tree1
1116
	cmp eax,0
1117
	je @f
6081 IgorA 1118
		mov ebx,dword[eax] ;получаем значение сдвига выбранного блока относительно начала файла
1119
		add ebx,dword[open_file_data] ;получаем значение сдвига в памяти
1120
		cmp word[ebx],CHUNK_OBJBLOCK
1121
		jne @f
6509 IgorA 1122
			add eax,list_offs_obj3d
1123
			stdcall draw_3d,eax
6060 IgorA 1124
	@@:
6081 IgorA 1125
pop ebx eax
6060 IgorA 1126
	ret
1127
 
6509 IgorA 1128
;input:
1129
; p_mat - указатель на данные предыдущего материала
1130
align 4
1131
proc found_mat_faces uses ebx, p_mat:dword
1132
	mov eax,[p_mat]
1133
	add eax,[eax+2]
1134
	cmp word[eax],CHUNK_FACEMAT
1135
	je @f
1136
		xor eax,eax
1137
	@@:
1138
	ret
1139
endp
1140
 
1141
align 4
1142
proc get_mat_color uses ebx ecx edx edi esi, p_mat:dword
1143
	stdcall [tl_node_poi_get_info], tree1,0
1144
	mov ecx,eax
1145
	.cycle_0:
1146
		cmp ecx,0
1147
		je .cycle_0_end
1148
			stdcall [tl_node_poi_get_data], tree1,ecx
1149
			mov ebx,[eax] ;получаем значение сдвига выбранного блока
1150
			add ebx,[open_file_data]
1151
			cmp word[ebx],CHUNK_MATERIAL
1152
			jne .end_add_p3
1153
			add eax,list_offs_obj3d
1154
			mov esi,[eax+offs_mat_name]
1155
			cmp esi,0
1156
			jne @f
1157
				;init material
1158
				stdcall mat_init,eax,ebx
1159
				mov esi,[eax+offs_mat_name]
1160
			@@:
1161
			mov edi,[p_mat]
1162
			mov eax,5
1163
			add edi,eax
1164
align 4
1165
			@@:
1166
				cmp al,0
1167
				je .found
1168
				lodsb
1169
				inc edi
1170
				cmp byte[edi],al
1171
				je @b
1172
		.end_add_p3:
1173
		stdcall [tl_node_poi_get_next_info], tree1,ecx
1174
		mov ecx,eax ;переходим к следущему узлу
1175
		jmp .cycle_0
1176
	.cycle_0_end:
1177
 
1178
	.no_found:
1179
		xor eax,eax
1180
		jmp .end_f
1181
	.found:
1182
		stdcall [tl_node_poi_get_data], tree1,ecx
1183
		add eax,list_offs_obj3d
1184
		mov eax,[eax+offs_mat_col_diffuse]
1185
	.end_f:
1186
	ret
1187
endp
1188
 
1189
align 4
1190
proc draw_3d_faces_color o_data:dword, p_mat:dword, color:dword
1191
pushad
1192
	stdcall [glPolygonMode], GL_FRONT_AND_BACK,GL_FILL
1193
	stdcall [glColor3ub],[color+2],[color+1],[color]
1194
	stdcall [glBegin],GL_TRIANGLES
1195
	mov edi,[o_data]
1196
	mov esi,[p_mat]
1197
	add esi,6
1198
	@@:
1199
		lodsb
1200
		cmp al,0
1201
		jne @b
1202
	movzx ecx,word[esi] ;ecx - число граней с данным материалом
1203
	mov edx,[edi+offs_obj_poi_data]
6513 IgorA 1204
 
1205
	bt dword[draw_mode],bit_smooth
1206
	jnc @f
1207
	bt dword[draw_mode],bit_light
1208
	jnc @f
6509 IgorA 1209
align 4
6513 IgorA 1210
	.cycle_0:
1211
		add esi,2
1212
		;word[esi] - номер треугольника
1213
		movzx ebx,word[esi]
1214
 
1215
		shl ebx,3
1216
		add ebx,[edi+offs_obj_tri_data]
1217
 
1218
		movzx eax,word[ebx] ;1-я вершина
1219
		imul eax,12 ;float(x,y,z)
1220
			add eax,[edi+offs_obj_normals_poi_data]
1221
			stdcall [glNormal3fv], eax
1222
			sub eax,[edi+offs_obj_normals_poi_data]
1223
		add eax,edx
1224
		stdcall [glVertex3f], [eax],[eax+4],[eax+8]
1225
 
1226
		movzx eax,word[ebx+2] ;2-я вершина
1227
		imul eax,12 ;float(x,y,z)
1228
			add eax,[edi+offs_obj_normals_poi_data]
1229
			stdcall [glNormal3fv], eax
1230
			sub eax,[edi+offs_obj_normals_poi_data]
1231
		add eax,edx
1232
		stdcall [glVertex3f], [eax],[eax+4],[eax+8]
1233
 
1234
		movzx eax,word[ebx+4] ;3-я вершина
1235
		imul eax,12 ;float(x,y,z)
1236
			add eax,[edi+offs_obj_normals_poi_data]
1237
			stdcall [glNormal3fv], eax
1238
			sub eax,[edi+offs_obj_normals_poi_data]
1239
		add eax,edx
1240
		stdcall [glVertex3f], [eax],[eax+4],[eax+8]
1241
 
1242
		dec ecx
1243
		jnz .cycle_0
1244
	stdcall [glEnd]
1245
	jmp .end_f
1246
 
1247
align 4
6509 IgorA 1248
	@@:
1249
		add esi,2
1250
		;word[esi] - номер треугольника
1251
		movzx ebx,word[esi]
6510 IgorA 1252
		;нормали для освещения
1253
		bt dword[draw_mode],bit_light
1254
		jnc .norm
1255
			mov eax,ebx
1256
			imul eax,12
1257
			add eax,[edi+offs_obj_normals_tri_data]
1258
			stdcall [glNormal3fv], eax
1259
		.norm:
1260
 
6509 IgorA 1261
		shl ebx,3
1262
		add ebx,[edi+offs_obj_tri_data]
1263
 
1264
		movzx eax,word[ebx] ;1-я вершина
1265
		imul eax,12 ;float(x,y,z)
1266
		add eax,edx
1267
		stdcall [glVertex3f], [eax],[eax+4],[eax+8]
1268
 
1269
		movzx eax,word[ebx+2] ;2-я вершина
1270
		imul eax,12 ;float(x,y,z)
1271
		add eax,edx
1272
		stdcall [glVertex3f], [eax],[eax+4],[eax+8]
1273
 
1274
		movzx eax,word[ebx+4] ;3-я вершина
1275
		imul eax,12 ;float(x,y,z)
1276
		add eax,edx
1277
		stdcall [glVertex3f], [eax],[eax+4],[eax+8]
1278
 
1279
		dec ecx
1280
		jnz @b
1281
	stdcall [glEnd]
1282
 
1283
.end_f:
1284
popad
1285
	ret
1286
endp
1287
 
6060 IgorA 1288
end if
1289
 
1290
align 4
6046 IgorA 1291
draw_mode dd 0 ;режим рисования объекта
1292
def_dr_mode dd 0 ;режим рисования по умолчанию
1293
delt_size dd 3.0 ;изменение углов при поворотах с кливиатуры
1294
mouse_drag dd 0 ;режим поворота сцены от перемещении курсора мыши
1295
mouse_x dd 0
1296
mouse_y dd 0
1297
sph_radius dd 0 ;радиус сферы для выделения активной точки
1298