Subversion Repositories Kolibri OS

Rev

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