Subversion Repositories Kolibri OS

Rev

Rev 6060 | Rev 6509 | 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
 
6081 IgorA 51
struct material
52
	name dd ?
53
	col_ambient dd ? ;цвет материала
54
	col_diffuse dd ?
55
	col_specular dd ?
56
ends
6046 IgorA 57
 
6081 IgorA 58
offs_mat_name equ 0
59
offs_mat_col_ambient equ 4
60
offs_mat_col_diffuse equ 8
61
offs_mat_col_specular equ 12
62
 
6046 IgorA 63
bit_vertexes equ 0
64
bit_faces equ 1
65
bit_faces_fill equ 2
66
bit_light equ 3
67
 
68
ini_name db 'info3ds.ini',0
69
ini_sec_w3d db 'Window 3d',0
70
key_dv  db 'draw_vertices',0
71
key_df  db 'draw_faces',0
72
key_dff db 'draw_faces_fill',0
73
key_dl  db 'draw_light',0
74
key_ox  db 'col_ox',0
75
key_oy  db 'col_oy',0
76
key_oz  db 'col_oz',0
77
key_bk  db 'col_bkgnd',0
78
key_vert db 'col_vertices',0
79
key_face db 'col_faces',0
80
key_select db 'col_select',0
81
 
82
 
83
rad_c dd 150 ;для вычисления радиуса
84
 
6081 IgorA 85
align 4
86
proc hex_in_str, buf:dword,val:dword,zif:dword
87
pushad
88
	mov edi,dword[buf]
89
	mov ecx,dword[zif]
90
	add edi,ecx
91
	dec edi
92
	mov ebx,dword[val]
6046 IgorA 93
 
6081 IgorA 94
	.cycle:
95
		mov al,bl
96
		and al,0xf
97
		cmp al,10
98
		jl @f
99
			add al,'a'-'0'-10
100
		@@:
101
		add al,'0'
102
		mov byte[edi],al
103
		dec edi
104
		shr ebx,4
105
	loop .cycle
106
popad
107
	ret
108
endp
109
 
6046 IgorA 110
;установка всех основных переменных по умолчанию
111
align 4
112
proc obj_clear_param uses edi, o_data:dword
113
	mov edi,[o_data]
114
	;обнуление указателей на данные объектов
115
	mov dword[edi+offs_obj_poi_data],0
116
	mov dword[edi+offs_obj_poi_count],0
117
	mov dword[edi+offs_obj_tri_data],0
118
	mov dword[edi+offs_obj_tri_count],0
119
	mov dword[edi+offs_obj_normals_tri_count],0
120
	mov dword[edi+offs_obj_normals_poi_count],0
6060 IgorA 121
	cmp dword[edi+offs_obj_normals_tri_data],0
122
	je @f
123
		stdcall mem.Free,[edi+offs_obj_normals_tri_data]
124
		mov dword[edi+offs_obj_normals_tri_data],0
125
	@@:
126
	cmp dword[edi+offs_obj_normals_poi_data],0
127
	je @f
128
		stdcall mem.Free,[edi+offs_obj_normals_poi_data]
129
		mov dword[edi+offs_obj_normals_poi_data],0
130
	@@:
6046 IgorA 131
	ret
132
endp
133
 
134
;поиск данных
135
;input:
136
;eax - текущий узел
137
;output:
138
;eax - структура текущего узла (или 0 при неудаче)
139
align 4
140
proc found_block_data uses ebx ecx edx, tlist:dword
141
	mov edx,[tlist]
142
	mov ecx,eax
143
	stdcall [tl_node_poi_get_info], edx,0
144
	@@:
145
		mov ebx,eax
146
		stdcall [tl_node_poi_get_data], edx,ebx
147
		cmp eax,ecx
148
		je @f ;если попали на выбранный узел
149
		stdcall [tl_node_poi_get_next_info], edx,ebx
150
		cmp eax,0
151
		jne @b
152
		jmp .end
153
	@@:
154
		mov eax,ebx
155
	.end:
156
	ret
157
endp
158
 
159
;установка размеров объекта
160
align 4
161
proc obj_set_sizes uses eax ebx esi edi, o_data:dword
162
	mov edi,[o_data]
163
	cmp dword[edi+offs_obj_poi_count],0
164
	je .end
165
		finit
166
		mov eax,[edi+offs_obj_poi_data]
167
		mov ebx,dword[eax]
168
		mov [edi+offs_obj_x_min],ebx
169
		mov [edi+offs_obj_x_max],ebx
170
		mov ebx,dword[eax+4]
171
		mov [edi+offs_obj_y_min],ebx
172
		mov [edi+offs_obj_y_max],ebx
173
		mov ebx,dword[eax+8]
174
		mov [edi+offs_obj_z_min],ebx
175
		mov [edi+offs_obj_z_max],ebx
176
 
177
	mov ebx,[edi+offs_obj_poi_data]
178
	mov esi,[edi+offs_obj_poi_count]
179
align 4
180
	.cycle_0: ;работа с координатой x
181
		fld dword[ebx]
182
		fld dword[edi+offs_obj_x_min]
183
		fcomp
184
		fstsw ax
185
		sahf
186
		jb @f
187
			mov eax,[ebx]
188
			mov [edi+offs_obj_x_min],eax
189
			ffree st0
190
			fincstp
191
			jmp .next_x
192
		@@:
193
		fld dword[edi+offs_obj_x_max]
194
		fcompp
195
		fstsw ax
196
		sahf
197
		ja .next_x
198
			mov eax,[ebx]
199
			mov [edi+offs_obj_x_max],eax
200
		.next_x:
201
 
202
		add ebx,12
203
		dec esi
204
		jnz .cycle_0
205
 
206
		fld1
207
		fld dword[edi+offs_obj_x_max]
208
		fsub dword[edi+offs_obj_x_min]
209
		fst dword[edi+offs_obj_x_centr]
210
		fdivp ;1/size.x
211
		fstp dword[edi+offs_obj_x_scale]
212
 
213
		fld dword[edi+offs_obj_x_centr]
214
		fld1
215
		fld1
216
		faddp
217
		fdivp ;centr.x = size.x/2
218
		fadd dword[edi+offs_obj_x_min]
219
		fchs
220
		fstp dword[edi+offs_obj_x_centr]
221
 
222
	mov ebx,[edi+offs_obj_poi_data]
223
	mov esi,[edi+offs_obj_poi_count]
224
align 4
225
	.cycle_1: ;работа с координатой y
226
		fld dword[ebx+4]
227
		fld dword[edi+offs_obj_y_min]
228
		fcomp
229
		fstsw ax
230
		sahf
231
		jb @f
232
			mov eax,[ebx+4]
233
			mov [edi+offs_obj_y_min],eax
234
			ffree st0
235
			fincstp
236
			jmp .next_y
237
		@@:
238
		fld dword[edi+offs_obj_y_max]
239
		fcompp
240
		fstsw ax
241
		sahf
242
		ja .next_y
243
			mov eax,[ebx+4]
244
			mov [edi+offs_obj_y_max],eax
245
		.next_y:
246
 
247
		add ebx,12
248
		dec esi
249
		jnz .cycle_1
250
 
251
		fld1
252
		fld dword[edi+offs_obj_y_max]
253
		fsub dword[edi+offs_obj_y_min]
254
		fst dword[edi+offs_obj_y_centr]
255
		fdivp ;1/size.y
256
		fstp dword[edi+offs_obj_y_scale]
257
 
258
		fld dword[edi+offs_obj_y_centr]
259
		fld1
260
		fld1
261
		faddp
262
		fdivp ;centr.y = size.y/2
263
		fadd dword[edi+offs_obj_y_min]
264
		fchs
265
		fstp dword[edi+offs_obj_y_centr]
266
 
267
	mov ebx,[edi+offs_obj_poi_data]
268
	mov esi,[edi+offs_obj_poi_count]
269
align 4
270
	.cycle_2: ;работа с координатой z
271
		fld dword[ebx+8]
272
		fld dword[edi+offs_obj_z_min]
273
		fcomp
274
		fstsw ax
275
		sahf
276
		jb @f
277
			mov eax,[ebx+8]
278
			mov [edi+offs_obj_z_min],eax
279
			ffree st0
280
			fincstp
281
			jmp .next_z
282
		@@:
283
		fld dword[edi+offs_obj_z_max]
284
		fcompp
285
		fstsw ax
286
		sahf
287
		ja .next_z
288
			mov eax,[ebx+8]
289
			mov [edi+offs_obj_z_max],eax
290
		.next_z:
291
 
292
		add ebx,12
293
		dec esi
294
		jnz .cycle_2
295
 
296
		fld1
297
		fld dword[edi+offs_obj_z_max]
298
		fsub dword[edi+offs_obj_z_min]
299
		fst dword[edi+offs_obj_z_centr]
300
		fdivp ;1/size.z
301
		fstp dword[edi+offs_obj_z_scale]
302
 
303
		fld dword[edi+offs_obj_z_centr]
304
		fld1
305
		fld1
306
		faddp
307
		fdivp ;centr.z = size.z/2
308
		fadd dword[edi+offs_obj_z_min]
309
		fchs
310
		fstp dword[edi+offs_obj_z_centr]
311
 
312
		;находим радиус для сферы
313
		fld dword[edi+offs_obj_x_max]
314
		fsub dword[edi+offs_obj_x_min]
315
		fld dword[edi+offs_obj_y_max]
316
		fsub dword[edi+offs_obj_y_min]
317
		faddp
318
		fild dword[rad_c]
319
		fdivp ;radius=(size.x+size.y)/rad_c
320
		fstp dword[sph_radius]
321
 
322
	;делаем одинаковый масштаб по осям x и y, что-бы не нарушались пропорции изображения
323
	fld dword[edi+offs_obj_y_scale]
324
	fdiv dword[ratio] ;приведение масштаба по оси y учитывая что по высоте экран меньше
325
	fcomp dword[edi+offs_obj_x_scale]
326
	fstsw ax
327
	sahf
328
	jb @f
329
		;сжатие масштаба по y
330
		fld dword[edi+offs_obj_x_scale]
331
		fmul dword[ratio]
332
		fstp dword[edi+offs_obj_y_scale] ;масштаб по оси y = масштаб по оси x
333
		jmp .end
334
	@@:
335
		;сжатие масштаба по x >...<
336
		fld	dword[edi+offs_obj_x_scale]
337
		fdiv dword[ratio]
338
		fstp dword[edi+offs_obj_x_scale]
339
	.end:
340
	ret
341
endp
342
 
343
;установка нормалей для граней
344
align 4
345
proc obj_set_normals, o_data:dword
346
locals
347
	tbl1 rd 9 ;ebp-72
348
	tbl2 rd 9 ;ebp-36
349
endl
350
pushad
351
	mov ecx,[o_data]
352
	cmp dword[ecx+offs_obj_poi_count],0
353
	je .end
354
		mov eax,[ecx+offs_obj_tri_count]
355
		mov [ecx+offs_obj_normals_tri_count],eax ;на каждый треугольник 1 нормаль
356
		cmp eax,0
357
		je .end
358
		finit
359
		imul eax,12
360
		stdcall mem.Alloc, eax
361
		mov [ecx+offs_obj_normals_tri_data],eax
362
 
363
		mov edx,[ecx+offs_obj_tri_data]
364
		mov ebx,[ecx+offs_obj_tri_count]
365
		mov ecx,[ecx+offs_obj_poi_data]
366
align 4
367
		@@:
368
			mov edi,ebp
369
			sub edi,36 ;tbl2
370
			movzx esi,word[edx] ;1-я вершина
371
			imul esi,12
372
			add esi,ecx
373
			movsd
374
			movsd
375
			movsd
376
			movzx esi,word[edx+2] ;2-я вершина
377
			imul esi,12
378
			add esi,ecx
379
			movsd
380
			movsd
381
			movsd
382
			movzx esi,word[edx+4] ;3-я вершина
383
			imul esi,12
384
			add esi,ecx
385
			movsd
386
			movsd
387
			movsd
388
 
389
			mov esi,ebp
390
			sub esi,72 ;tbl1
391
			sub edi,36 ;tbl2
392
			;v1 <-> v2
393
			fld dword[edi+12]
394
			fsub dword[edi]
395
			fstp dword[esi] ;(x1-x2)
396
			fld dword[edi+16]
397
			fsub dword[edi+4]
398
			fstp dword[esi+4] ;(y1-y2)
399
			fld dword[edi+20]
400
			fsub dword[edi+8]
401
			fstp dword[esi+8] ;(z1-z2)
402
			;v2 <-> v3
403
			fld dword[edi+24]
404
			fsub dword[edi+12]
405
			fstp dword[esi+12] ;(x2-x3)
406
			fld dword[edi+28]
407
			fsub dword[edi+16]
408
			fstp dword[esi+16] ;(y2-y3)
409
			fld dword[edi+32]
410
			fsub dword[edi+20]
411
			fstp dword[esi+20] ;(z2-z3)
412
			;v3 <-> v1
413
			fld dword[edi]
414
			fsub dword[edi+24]
415
			fstp dword[esi+24] ;(x3-x1)
416
			fld dword[edi+4]
417
			fsub dword[edi+28]
418
			fstp dword[esi+28] ;(y3-y1)
419
			fld dword[edi+8]
420
			fsub dword[edi+32]
421
			fstp dword[esi+32] ;(z3-z1)
422
 
423
			;a1,a2,a3
424
			fld dword[esi+4]
425
			fmul dword[esi+8]
426
			fstp dword[edi] ;a1=(y1-y2)*(z1-z2)
427
			fld dword[esi+16]
428
			fmul dword[esi+20]
429
			fstp dword[edi+4] ;a2=(y2-y3)*(z2-z3)
430
			fld dword[esi+28]
431
			fmul dword[esi+32]
432
			fstp dword[edi+8] ;a3=(y3-y1)*(z3-z1)
433
			;b1,b2,b3
434
			fld dword[esi]
435
			fmul dword[esi+8]
436
			fstp dword[edi+12] ;b1=(x1-x2)*(z1-z2)
437
			fld dword[esi+12]
438
			fmul dword[esi+20]
439
			fstp dword[edi+16] ;b2=(x2-x3)*(z2-z3)
440
			fld dword[esi+24]
441
			fmul dword[esi+32]
442
			fstp dword[edi+20] ;b3=(x3-x1)*(z3-z1)
443
			;c1,с2,с3
444
			fld dword[esi]
445
			fmul dword[esi+4]
446
			fstp dword[edi+24] ;c1=(x1-x2)*(y1-y2)
447
			fld dword[esi+12]
448
			fmul dword[esi+16]
449
			fstp dword[edi+28] ;c2=(x2-x3)*(y2-y3)
450
			fld dword[esi+24]
451
			fmul dword[esi+28]
452
			fstp dword[edi+32] ;c3=(x3-x1)*(y3-y1)
453
 
454
			fld dword[edi]
455
			fadd dword[edi+4]
456
			fadd dword[edi+8]
457
			fstp dword[eax] ;set normal.a
458
			fld dword[edi+12]
459
			fadd dword[edi+16]
460
			fadd dword[edi+20]
461
			fstp dword[eax+4] ;set normal.b
462
			fld dword[edi+24]
463
			fadd dword[edi+28]
464
			fadd dword[edi+32]
465
			fstp dword[eax+8] ;set normal.c
466
 
467
			add edx,8 ;размер треугольника = (3 вершины (по 2б) + свойства (2б))
468
			add eax,12
469
			dec ebx
470
			jnz @b
471
	.end:
472
popad
473
	ret
474
endp
475
 
6060 IgorA 476
;настройка структуры 3d объекта
477
align 4
478
proc obj_init, o_data:dword
479
	pushad
480
	mov edi,[o_data]
481
	stdcall obj_clear_param, edi
482
	stdcall [tl_node_get_data],tree1
483
	xor edx,edx
484
	cmp eax,0
485
	je .no_points
486
		mov ebx,[eax] ;получаем значение сдвига выбранного блока
487
		add ebx,[open_file_data]
488
		xor ecx,ecx
489
		cmp word[ebx],CHUNK_OBJBLOCK
490
		jne @f
491
			mov ecx,ebx
492
			add ecx,dword[ecx+2] ;граница блока
493
			push eax edi
494
				mov edi,ebx
495
				add edi,6
496
				cld
497
				xor al,al
498
				repne scasb ;пропуск имени объекта
499
				mov ebx,edi
500
			pop edi eax
501
		@@:
502
		cmp word[ebx],CHUNK_TRIMESH
503
		jne @f
504
			mov ecx,ebx
505
			add ecx,dword[ecx+2] ;граница блока
506
			add ebx,6
507
		@@:
508
		cmp word[ebx],CHUNK_VERTLIST
509
		jne .no_points
510
			mov esi,ebx
511
			movzx edx,word[ebx+6] ;колличество точек
512
			add ebx,8
513
			mov [edi+offs_obj_poi_data],ebx
514
			mov [edi+offs_obj_poi_count],edx
515
 
516
			.cycle_0: ;цикл для поиска треугольников
517
				add esi,dword[esi+2]
518
				cmp word[esi],CHUNK_FACELIST
519
				je @f
520
					cmp ecx,esi
521
					jg .cycle_0 ;пока не достигнута грница старшего блока
522
					jmp .end_points ;если не нашли треугольники
523
			@@:
524
			;если нашли треугольники
525
			movzx edx,word[esi+6]
526
			mov [edi+offs_obj_tri_count],edx
527
			add esi,8 ;2+4+2 (chunk+size+count)
528
			mov [edi+offs_obj_tri_data],esi
529
		.end_points:
530
 
531
		stdcall obj_set_sizes, edi
532
		stdcall obj_set_normals, edi
533
if version_edit eq 0
534
		stdcall draw_3d, edi
535
end if
536
	.no_points:
537
	popad
538
	ret
539
endp
540
 
6081 IgorA 541
;настройка материала
542
align 4
543
proc mat_init, m_data:dword
544
	pushad
545
	mov edi,[m_data]
546
 
547
	;... clear edi ...
548
	mov dword[edi+offs_mat_name],0
549
	mov dword[edi+offs_mat_col_ambient],0
550
	mov dword[edi+offs_mat_col_diffuse],0
551
	mov dword[edi+offs_mat_col_specular],0
552
 
553
	stdcall [tl_node_get_data],tree1
554
	xor edx,edx
555
	cmp eax,0
556
	je .no_material
557
		mov ebx,[eax] ;получаем значение сдвига выбранного блока
558
		add ebx,[open_file_data]
559
		xor ecx,ecx
560
		cmp word[ebx],CHUNK_MATERIAL
561
		jne .no_material
562
			mov ecx,ebx
563
			add ecx,dword[ecx+2] ;граница блока
564
			add ebx,6
565
		cmp word[ebx],CHUNK_MATNAME
566
		jne .no_material
567
			;*** (0) ***
568
			mov esi,ebx
569
			add ebx,6
570
			mov [edi+offs_mat_name],ebx
571
			sub ebx,6
572
			;*** (1) ***
573
			.cycle_0: ;цикл для поиска цвета материала
574
				add esi,dword[esi+2]
575
				cmp word[esi],0xa010
576
				je @f
577
					cmp ecx,esi
578
					jg .cycle_0 ;пока не достигнута грница старшего блока
579
					jmp .end_material ;если не нашли цвет материала
580
			@@:
581
			;если нашли цвет материала
582
			add esi,6
583
			cmp word[esi],0x0011
584
			jne .end_material
585
				add esi,6
586
				mov dl,byte[esi]
587
				mov [edi+offs_mat_col_ambient+2],dl
588
				mov dx,word[esi+1]
589
				ror dx,8
590
				mov [edi+offs_mat_col_ambient],dx
591
			;*** (2) ***
592
			mov esi,ebx
593
			.cycle_1: ;цикл для поиска цвета материала
594
				add esi,dword[esi+2]
595
				cmp word[esi],0xa020
596
				je @f
597
					cmp ecx,esi
598
					jg .cycle_1 ;пока не достигнута грница старшего блока
599
					jmp .end_material ;если не нашли цвет материала
600
			@@:
601
			;если нашли цвет материала
602
			add esi,6
603
			cmp word[esi],0x0011
604
			jne .end_material
605
				add esi,6
606
				mov dl,byte[esi]
607
				mov [edi+offs_mat_col_diffuse+2],dl
608
				mov dx,word[esi+1]
609
				ror dx,8
610
				mov [edi+offs_mat_col_diffuse],dx
611
			;*** (3) ***
612
			mov esi,ebx
613
			.cycle_2: ;цикл для поиска цвета материала
614
				add esi,dword[esi+2]
615
				cmp word[esi],0xa030
616
				je @f
617
					cmp ecx,esi
618
					jg .cycle_2 ;пока не достигнута грница старшего блока
619
					jmp .end_material ;если не нашли цвет материала
620
			@@:
621
			;если нашли цвет материала
622
			add esi,6
623
			cmp word[esi],0x0011
624
			jne .end_material
625
				add esi,6
626
				mov dl,byte[esi]
627
				mov [edi+offs_mat_col_specular+2],dl
628
				mov dx,word[esi+1]
629
				ror dx,8
630
				mov [edi+offs_mat_col_specular],dx
631
 
632
			.end_material:
633
	.no_material:
634
	popad
635
	ret
636
endp
637
 
638
align 4
639
proc buf_draw_beg uses eax, buf:dword
640
	mov eax,[buf]
641
	stdcall [buf2d_clear], eax, [eax+16] ;чистим буфер
642
	stdcall [buf2d_draw_text], eax, buf_1,txt_open_3ds,5,5,0xff
643
	stdcall [buf2d_draw_text], eax, buf_1,openfile_path,5,15,0xff
644
	cmp dword[level_stack],FILE_ERROR_CHUNK_SIZE ;возможна ошибка файла
645
	jne @f
646
		stdcall [buf2d_draw_text], eax, buf_1,txt_3ds_err_sizes,5,25,0xff0000
647
	@@:
648
	ret
649
endp
650
 
651
;рисование материала
652
align 4
653
proc draw_material uses edi, m_data:dword
654
	mov edi,[m_data]
655
	stdcall buf_draw_beg, buf_ogl
656
	stdcall [buf2d_draw_text], buf_ogl, buf_1,txt_afff,5,35,0xff
657
 
658
	stdcall [buf2d_draw_text], buf_ogl,buf_1,[edi+offs_mat_name],15,45,0 ;имя материала
659
	stdcall draw_color, [edi+offs_mat_col_ambient], txt_a010,2,55 ;окружающий цвет
660
	stdcall draw_color, [edi+offs_mat_col_diffuse], txt_a020,2,75 ;дифузный цвет
661
	stdcall draw_color, [edi+offs_mat_col_specular],txt_a030,2,95 ;зеркальный цвет
662
 
663
	stdcall [buf2d_draw], buf_ogl
664
	ret
665
endp
666
 
667
align 4
668
proc draw_color uses eax ebx, color:dword, text:dword, c_x:dword, c_y:dword
669
	mov eax,[c_x]
670
	mov ebx,[c_y]
671
	; прямоугольник
672
	inc ebx
673
	stdcall [buf2d_filled_rect_by_size], buf_ogl,eax,ebx,30,17,[color]
674
	dec ebx
675
	stdcall [buf2d_rect_by_size], buf_ogl,eax,ebx,30,19, 0
676
	; подписи
677
	add eax,33
678
	stdcall [buf2d_draw_text], buf_ogl, buf_1,[text],eax,ebx,0
679
	add ebx,10
680
	stdcall hex_in_str, buffer,[color],6
681
	mov byte[buffer+6],0
682
	stdcall [buf2d_draw_text], buf_ogl, buf_1,buffer,eax,ebx,0
683
	ret
684
endp
685
 
6046 IgorA 686
;рисование точек в 3d
687
align 4
688
proc draw_3d uses eax ebx ecx edi, o_data:dword
689
	mov edi,[o_data]
6060 IgorA 690
if 0 ;debug
691
	stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT
692
	mov eax,[edi+offs_obj_poi_data]
693
	stdcall convert_int_to_str, txt_select_vert.count,16
694
	stdcall [buf2d_draw_text], buf_ogl, buf_1,txt_select_vert,5,3,[color_select]
695
	stdcall [kosglSwapBuffers]
696
	jmp .end_f
697
end if
6046 IgorA 698
	cmp dword[edi+offs_obj_poi_count],2
699
	jl .end_f
700
	stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;очистим буфер цвета и глубины
701
	stdcall [glPushMatrix]
702
	bt dword[draw_mode],bit_light
703
	jnc @f
704
		call SetLight
705
		jmp .end_l
706
	@@:
707
		stdcall [glDisable],GL_LIGHTING
708
	.end_l:
709
	stdcall [glTranslatef], 0.0,0.0,0.5 ;correct for z
710
	stdcall [glScalef], [edi+offs_obj_x_scale],[edi+offs_obj_y_scale],[edi+offs_obj_z_scale]
711
	stdcall [glScalef], 1.0,1.0,0.7 ;correct for z
712
	stdcall [glRotatef], [angle_z],0.0,0.0,1.0
713
	stdcall [glRotatef], [angle_y],0.0,1.0,0.0
714
	stdcall [glRotatef], [angle_x],1.0,0.0,0.0
715
	stdcall [glTranslatef], [edi+offs_obj_x_centr],[edi+offs_obj_y_centr],[edi+offs_obj_z_centr]
716
 
717
	;рисование точек
718
	bt dword[draw_mode],bit_vertexes
719
	jnc .end_points
720
		stdcall [glColor3ub],[color_vert+2],[color_vert+1],[color_vert]
721
		stdcall [glBegin],GL_POINTS
722
		mov eax,[edi+offs_obj_poi_data]
723
		mov ebx,[edi+offs_obj_poi_count]
724
		@@:
725
			stdcall [glVertex3f], [eax],[eax+4],[eax+8]
726
			add eax,12
727
			dec ebx
728
			jnz @b
729
		stdcall [glEnd]
730
	.end_points:
731
 
732
if version_edit eq 1
733
	;рисование активной точки
734
	stdcall [tl_node_get_data],tree3
735
	cmp eax,0
736
	je @f
737
		;выделение активной точки
738
		mov eax,[eax]
739
 
740
		stdcall [glBegin],GL_LINES
741
		stdcall [glColor3ub], [color_ox+2],[color_ox+1],[color_ox]
742
		stdcall [glVertex3f], [edi+offs_obj_x_min],[eax+4],[eax+8]
743
		stdcall [glVertex3f], [edi+offs_obj_x_max],[eax+4],[eax+8]
744
		stdcall [glColor3ub], [color_oy+2],[color_oy+1],[color_oy]
745
		stdcall [glVertex3f], [eax],[edi+offs_obj_y_min],[eax+8]
746
		stdcall [glVertex3f], [eax],[edi+offs_obj_y_max],[eax+8]
747
		stdcall [glColor3ub], [color_oz+2],[color_oz+1],[color_oz]
748
		stdcall [glVertex3f], [eax],[eax+4],[edi+offs_obj_z_min]
749
		stdcall [glVertex3f], [eax],[eax+4],[edi+offs_obj_z_max]
750
		stdcall [glEnd]
751
 
752
		stdcall [glColor3ub],[color_select+2],[color_select+1],[color_select]
753
		stdcall [glPushMatrix]
754
			stdcall [glTranslatef], [eax],[eax+4],[eax+8]
755
			stdcall [gluSphere], [qObj], [sph_radius], 8,8
756
		stdcall [glPopMatrix]
757
	@@:
758
 
759
	;рисование выделенных точек
760
	cmp dword[obj_poi_sel_c],0
761
	je .end_select
762
		mov ecx,dword[obj_poi_sel_c]
763
		stdcall [glColor3ub],[color_select+2],[color_select+1],[color_select]
764
		stdcall dword[tl_node_poi_get_info], tree3,0
765
		@@:
766
			cmp eax,0
767
			je .end_select
768
			mov ebx,eax
769
			cmp word[ebx],ID_ICON_POINT_SEL
770
			jne .next_sel
771
			stdcall [tl_node_poi_get_data], tree3,ebx
772
			mov eax,[eax]
773
			stdcall [glPushMatrix]
774
				stdcall [glTranslatef], [eax],[eax+4],[eax+8]
775
				stdcall [gluSphere], [qObj], [sph_radius], 4,4
776
			stdcall [glPopMatrix]
777
			dec ecx
778
			jz .end_select
779
			.next_sel:
780
			stdcall dword[tl_node_poi_get_next_info], tree3,ebx
781
			jmp @b
782
    .end_select:
783
end if
784
 
785
	;рисование граней
786
	bt dword[draw_mode],bit_faces
787
	jnc .end_triangles
788
	cmp dword[edi+offs_obj_tri_count],0
789
	je .end_triangles
790
	cmp dword[edi+offs_obj_poi_count],0
791
	je .end_triangles
792
		bt dword[draw_mode],bit_faces_fill
793
		jc @f
794
			push GL_LINE
795
			jmp .end_0
796
		@@:
797
			push GL_FILL
798
		.end_0:
799
		stdcall [glPolygonMode], GL_FRONT_AND_BACK ;mode - уже в стеке
800
		stdcall [glColor3ub],[color_face+2],[color_face+1],[color_face]
801
		stdcall [glBegin],GL_TRIANGLES
802
		mov eax,[edi+offs_obj_tri_data]
803
		mov ecx,[edi+offs_obj_tri_count]
804
		mov edx,[edi+offs_obj_normals_tri_data]
805
		@@:
806
			;
807
			bt dword[draw_mode],bit_light
808
			jnc .norm
809
				;[obj_normals_tri_count]
810
				stdcall [glNormal3fv], edx
811
				add edx,12
812
			.norm:
813
			;
814
			movzx ebx,word[eax] ;1-я вершина
815
			imul ebx,12
816
			add ebx,[edi+offs_obj_poi_data]
817
			stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
818
			movzx ebx,word[eax+2] ;2-я вершина
819
			imul ebx,12
820
			add ebx,[edi+offs_obj_poi_data]
821
			stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
822
			movzx ebx,word[eax+4] ;3-я вершина
823
			imul ebx,12
824
			add ebx,[edi+offs_obj_poi_data]
825
			stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
826
			add eax,8 ;размер треугольника = (3 вершины (по 2б) + свойства (2б))
827
			dec ecx
828
			jnz @b
829
		stdcall [glEnd]
830
	.end_triangles:
831
 
832
	stdcall [glPopMatrix]
833
if version_edit eq 1
834
	cmp dword[obj_poi_sel_c],0
835
	je @f
836
		stdcall [buf2d_draw_text], buf_ogl, buf_1,txt_select_vert,5,3,[color_select]
837
	@@:
838
end if
839
	stdcall [kosglSwapBuffers]
840
	.end_f:
841
	ret
842
endp
843
 
844
align 4
845
SetLight:
846
	stdcall [glLightfv], GL_LIGHT0, GL_POSITION, light_position
847
	stdcall [glLightfv], GL_LIGHT0, GL_SPOT_DIRECTION, light_dir
848
 
849
	stdcall [glLightfv], GL_LIGHT0, GL_DIFFUSE, white_light
850
	stdcall [glLightfv], GL_LIGHT0, GL_SPECULAR, white_light
851
 
852
	stdcall [glEnable], GL_COLOR_MATERIAL
853
	stdcall [glColorMaterial], GL_FRONT, GL_AMBIENT_AND_DIFFUSE
854
	stdcall [glMaterialfv], GL_FRONT, GL_SPECULAR, mat_specular
855
	stdcall [glMaterialf], GL_FRONT, GL_SHININESS, mat_shininess
856
	stdcall [glLightModelfv], GL_LIGHT_MODEL_AMBIENT, lmodel_ambient
857
 
858
	stdcall [glEnable],GL_LIGHTING
859
	stdcall [glEnable],GL_LIGHT0
860
	ret
861
 
6060 IgorA 862
;включаем режим рисования вершин
6046 IgorA 863
align 4
6060 IgorA 864
mnu_vertexes_on:
865
	or dword[draw_mode], 1 shl bit_vertexes
866
	and dword[draw_mode], not (1 shl bit_faces) ;выключаем режим рисования граней (что-бы не мешали)
867
	call update_obj
6046 IgorA 868
	ret
869
 
6060 IgorA 870
;включаем режим рисования каркасных граней
6046 IgorA 871
align 4
6060 IgorA 872
mnu_edges_on:
873
	or dword[draw_mode], 1 shl bit_faces
874
	and dword[draw_mode], not ((1 shl bit_vertexes)+(1 shl bit_faces_fill))
875
	call update_obj
6046 IgorA 876
	ret
877
 
6060 IgorA 878
;включаем режим рисования сплошных граней
6046 IgorA 879
align 4
6060 IgorA 880
mnu_faces_on:
881
	or dword[draw_mode], (1 shl bit_faces)+(1 shl bit_faces_fill)
882
	and dword[draw_mode], not (1 shl bit_vertexes)
883
	call update_obj
6046 IgorA 884
	ret
885
 
886
;включаем или отключаем освещение
887
align 4
888
mnu_light_on_off:
889
	xor dword[draw_mode], 1 shl bit_light
6060 IgorA 890
	call update_obj
6046 IgorA 891
	ret
892
 
893
align 4
894
mnu_reset_settings:
895
	mov dword[angle_x],0.0
896
	mov dword[angle_y],0.0
897
	mov dword[angle_z],0.0
898
	m2m dword[draw_mode],dword[def_dr_mode]
6060 IgorA 899
	call update_obj
900
	ret
901
 
902
if version_edit eq 1
903
 
904
align 4
905
update_obj:
6046 IgorA 906
	stdcall draw_3d, o3d
907
	ret
908
 
6060 IgorA 909
else
910
 
6046 IgorA 911
align 4
6060 IgorA 912
update_obj:
6081 IgorA 913
push eax ebx
6060 IgorA 914
	stdcall [tl_node_get_data],tree1
915
	cmp eax,0
916
	je @f
6081 IgorA 917
		mov ebx,dword[eax] ;получаем значение сдвига выбранного блока относительно начала файла
918
		add ebx,dword[open_file_data] ;получаем значение сдвига в памяти
919
		cmp word[ebx],CHUNK_OBJBLOCK
920
		jne @f
921
			add eax,14 ;14=list_offs_obj3d
922
			stdcall draw_3d, eax
6060 IgorA 923
	@@:
6081 IgorA 924
pop ebx eax
6060 IgorA 925
	ret
926
 
927
end if
928
 
929
align 4
6046 IgorA 930
draw_mode dd 0 ;режим рисования объекта
931
def_dr_mode dd 0 ;режим рисования по умолчанию
932
delt_size dd 3.0 ;изменение углов при поворотах с кливиатуры
933
mouse_drag dd 0 ;режим поворота сцены от перемещении курсора мыши
934
mouse_x dd 0
935
mouse_y dd 0
936
sph_radius dd 0 ;радиус сферы для выделения активной точки
937