Subversion Repositories Kolibri OS

Rev

Rev 6081 | Rev 6510 | 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
 
347
;установка нормалей для граней
348
align 4
349
proc obj_set_normals, o_data:dword
350
locals
351
	tbl1 rd 9 ;ebp-72
352
	tbl2 rd 9 ;ebp-36
353
endl
354
pushad
355
	mov ecx,[o_data]
356
	cmp dword[ecx+offs_obj_poi_count],0
357
	je .end
358
		mov eax,[ecx+offs_obj_tri_count]
359
		mov [ecx+offs_obj_normals_tri_count],eax ;на каждый треугольник 1 нормаль
360
		cmp eax,0
361
		je .end
362
		finit
363
		imul eax,12
364
		stdcall mem.Alloc, eax
365
		mov [ecx+offs_obj_normals_tri_data],eax
366
 
367
		mov edx,[ecx+offs_obj_tri_data]
368
		mov ebx,[ecx+offs_obj_tri_count]
369
		mov ecx,[ecx+offs_obj_poi_data]
370
align 4
371
		@@:
372
			mov edi,ebp
373
			sub edi,36 ;tbl2
374
			movzx esi,word[edx] ;1-я вершина
375
			imul esi,12
376
			add esi,ecx
377
			movsd
378
			movsd
379
			movsd
380
			movzx esi,word[edx+2] ;2-я вершина
381
			imul esi,12
382
			add esi,ecx
383
			movsd
384
			movsd
385
			movsd
386
			movzx esi,word[edx+4] ;3-я вершина
387
			imul esi,12
388
			add esi,ecx
389
			movsd
390
			movsd
391
			movsd
392
 
393
			mov esi,ebp
394
			sub esi,72 ;tbl1
395
			sub edi,36 ;tbl2
396
			;v1 <-> v2
397
			fld dword[edi+12]
398
			fsub dword[edi]
399
			fstp dword[esi] ;(x1-x2)
400
			fld dword[edi+16]
401
			fsub dword[edi+4]
402
			fstp dword[esi+4] ;(y1-y2)
403
			fld dword[edi+20]
404
			fsub dword[edi+8]
405
			fstp dword[esi+8] ;(z1-z2)
406
			;v2 <-> v3
407
			fld dword[edi+24]
408
			fsub dword[edi+12]
409
			fstp dword[esi+12] ;(x2-x3)
410
			fld dword[edi+28]
411
			fsub dword[edi+16]
412
			fstp dword[esi+16] ;(y2-y3)
413
			fld dword[edi+32]
414
			fsub dword[edi+20]
415
			fstp dword[esi+20] ;(z2-z3)
416
			;v3 <-> v1
417
			fld dword[edi]
418
			fsub dword[edi+24]
419
			fstp dword[esi+24] ;(x3-x1)
420
			fld dword[edi+4]
421
			fsub dword[edi+28]
422
			fstp dword[esi+28] ;(y3-y1)
423
			fld dword[edi+8]
424
			fsub dword[edi+32]
425
			fstp dword[esi+32] ;(z3-z1)
426
 
427
			;a1,a2,a3
428
			fld dword[esi+4]
429
			fmul dword[esi+8]
430
			fstp dword[edi] ;a1=(y1-y2)*(z1-z2)
431
			fld dword[esi+16]
432
			fmul dword[esi+20]
433
			fstp dword[edi+4] ;a2=(y2-y3)*(z2-z3)
434
			fld dword[esi+28]
435
			fmul dword[esi+32]
436
			fstp dword[edi+8] ;a3=(y3-y1)*(z3-z1)
437
			;b1,b2,b3
438
			fld dword[esi]
439
			fmul dword[esi+8]
440
			fstp dword[edi+12] ;b1=(x1-x2)*(z1-z2)
441
			fld dword[esi+12]
442
			fmul dword[esi+20]
443
			fstp dword[edi+16] ;b2=(x2-x3)*(z2-z3)
444
			fld dword[esi+24]
445
			fmul dword[esi+32]
446
			fstp dword[edi+20] ;b3=(x3-x1)*(z3-z1)
447
			;c1,с2,с3
448
			fld dword[esi]
449
			fmul dword[esi+4]
450
			fstp dword[edi+24] ;c1=(x1-x2)*(y1-y2)
451
			fld dword[esi+12]
452
			fmul dword[esi+16]
453
			fstp dword[edi+28] ;c2=(x2-x3)*(y2-y3)
454
			fld dword[esi+24]
455
			fmul dword[esi+28]
456
			fstp dword[edi+32] ;c3=(x3-x1)*(y3-y1)
457
 
458
			fld dword[edi]
459
			fadd dword[edi+4]
460
			fadd dword[edi+8]
461
			fstp dword[eax] ;set normal.a
462
			fld dword[edi+12]
463
			fadd dword[edi+16]
464
			fadd dword[edi+20]
465
			fstp dword[eax+4] ;set normal.b
466
			fld dword[edi+24]
467
			fadd dword[edi+28]
468
			fadd dword[edi+32]
469
			fstp dword[eax+8] ;set normal.c
470
 
471
			add edx,8 ;размер треугольника = (3 вершины (по 2б) + свойства (2б))
472
			add eax,12
473
			dec ebx
474
			jnz @b
475
	.end:
476
popad
477
	ret
478
endp
479
 
6060 IgorA 480
;настройка структуры 3d объекта
481
align 4
482
proc obj_init, o_data:dword
483
	pushad
484
	mov edi,[o_data]
485
	stdcall obj_clear_param, edi
486
	stdcall [tl_node_get_data],tree1
487
	xor edx,edx
488
	cmp eax,0
489
	je .no_points
490
		mov ebx,[eax] ;получаем значение сдвига выбранного блока
491
		add ebx,[open_file_data]
492
		xor ecx,ecx
493
		cmp word[ebx],CHUNK_OBJBLOCK
494
		jne @f
495
			mov ecx,ebx
496
			add ecx,dword[ecx+2] ;граница блока
497
			push eax edi
498
				mov edi,ebx
499
				add edi,6
500
				cld
501
				xor al,al
502
				repne scasb ;пропуск имени объекта
503
				mov ebx,edi
504
			pop edi eax
505
		@@:
506
		cmp word[ebx],CHUNK_TRIMESH
507
		jne @f
508
			mov ecx,ebx
509
			add ecx,dword[ecx+2] ;граница блока
510
			add ebx,6
511
		@@:
512
		cmp word[ebx],CHUNK_VERTLIST
513
		jne .no_points
514
			mov esi,ebx
515
			movzx edx,word[ebx+6] ;колличество точек
516
			add ebx,8
517
			mov [edi+offs_obj_poi_data],ebx
518
			mov [edi+offs_obj_poi_count],edx
519
 
520
			.cycle_0: ;цикл для поиска треугольников
521
				add esi,dword[esi+2]
522
				cmp word[esi],CHUNK_FACELIST
523
				je @f
524
					cmp ecx,esi
525
					jg .cycle_0 ;пока не достигнута грница старшего блока
526
					jmp .end_points ;если не нашли треугольники
527
			@@:
528
			;если нашли треугольники
529
			movzx edx,word[esi+6]
530
			mov [edi+offs_obj_tri_count],edx
531
			add esi,8 ;2+4+2 (chunk+size+count)
532
			mov [edi+offs_obj_tri_data],esi
6509 IgorA 533
 
534
			;поиск материалов граней
535
			shl edx,3
536
			add esi,edx
537
			cmp word[esi],CHUNK_FACEMAT
538
			jne .end_points
539
				mov [edi+offs_obj_mat1_data],esi
6060 IgorA 540
		.end_points:
541
 
542
		stdcall obj_set_sizes, edi
543
		stdcall obj_set_normals, edi
544
if version_edit eq 0
545
		stdcall draw_3d, edi
546
end if
547
	.no_points:
548
	popad
549
	ret
550
endp
551
 
6081 IgorA 552
;настройка материала
6509 IgorA 553
;input:
554
; m_data - указатель на заполняемую структуру с материалом
555
; f_data - указательна на блок CHUNK_MATERIAL из файла 3ds
6081 IgorA 556
align 4
6509 IgorA 557
proc mat_init, m_data:dword, f_data:dword
6081 IgorA 558
	pushad
559
	mov edi,[m_data]
560
 
561
	;... clear edi ...
562
	mov dword[edi+offs_mat_name],0
563
	mov dword[edi+offs_mat_col_ambient],0
564
	mov dword[edi+offs_mat_col_diffuse],0
565
	mov dword[edi+offs_mat_col_specular],0
566
 
567
	xor edx,edx
6509 IgorA 568
	mov ebx,[f_data]
569
	xor ecx,ecx
570
	cmp word[ebx],CHUNK_MATERIAL
571
	jne .no_material
572
		mov ecx,ebx
573
		add ecx,dword[ecx+2] ;граница блока
574
		add ebx,6
575
	cmp word[ebx],CHUNK_MATNAME
576
	jne .no_material
577
		;*** (0) ***
578
		mov esi,ebx
579
		add ebx,6
580
		mov [edi+offs_mat_name],ebx
581
		sub ebx,6
582
		;*** (1) ***
583
		.cycle_0: ;цикл для поиска цвета материала
584
			add esi,dword[esi+2]
585
			cmp word[esi],0xa010
586
			je @f
587
				cmp ecx,esi
588
				jg .cycle_0 ;пока не достигнута грница старшего блока
589
				jmp .end_material ;если не нашли цвет материала
590
		@@:
591
		;если нашли цвет материала
592
		add esi,6
593
		cmp word[esi],0x0011
594
		jne .end_material
6081 IgorA 595
			add esi,6
6509 IgorA 596
			mov dl,byte[esi]
597
			mov [edi+offs_mat_col_ambient+2],dl
598
			mov dx,word[esi+1]
599
			ror dx,8
600
			mov [edi+offs_mat_col_ambient],dx
601
		;*** (2) ***
602
		mov esi,ebx
603
		.cycle_1: ;цикл для поиска цвета материала
604
			add esi,dword[esi+2]
605
			cmp word[esi],0xa020
606
			je @f
607
				cmp ecx,esi
608
				jg .cycle_1 ;пока не достигнута грница старшего блока
609
				jmp .end_material ;если не нашли цвет материала
610
		@@:
611
		;если нашли цвет материала
612
		add esi,6
613
		cmp word[esi],0x0011
614
		jne .end_material
6081 IgorA 615
			add esi,6
6509 IgorA 616
			mov dl,byte[esi]
617
			mov [edi+offs_mat_col_diffuse+2],dl
618
			mov dx,word[esi+1]
619
			ror dx,8
620
			mov [edi+offs_mat_col_diffuse],dx
621
		;*** (3) ***
622
		mov esi,ebx
623
		.cycle_2: ;цикл для поиска цвета материала
624
			add esi,dword[esi+2]
625
			cmp word[esi],0xa030
626
			je @f
627
				cmp ecx,esi
628
				jg .cycle_2 ;пока не достигнута грница старшего блока
629
				jmp .end_material ;если не нашли цвет материала
630
		@@:
631
		;если нашли цвет материала
632
		add esi,6
633
		cmp word[esi],0x0011
634
		jne .end_material
6081 IgorA 635
			add esi,6
6509 IgorA 636
			mov dl,byte[esi]
637
			mov [edi+offs_mat_col_specular+2],dl
638
			mov dx,word[esi+1]
639
			ror dx,8
640
			mov [edi+offs_mat_col_specular],dx
6081 IgorA 641
 
6509 IgorA 642
		.end_material:
6081 IgorA 643
	.no_material:
644
	popad
645
	ret
646
endp
647
 
648
align 4
649
proc buf_draw_beg uses eax, buf:dword
650
	mov eax,[buf]
651
	stdcall [buf2d_clear], eax, [eax+16] ;чистим буфер
652
	stdcall [buf2d_draw_text], eax, buf_1,txt_open_3ds,5,5,0xff
653
	stdcall [buf2d_draw_text], eax, buf_1,openfile_path,5,15,0xff
654
	cmp dword[level_stack],FILE_ERROR_CHUNK_SIZE ;возможна ошибка файла
655
	jne @f
656
		stdcall [buf2d_draw_text], eax, buf_1,txt_3ds_err_sizes,5,25,0xff0000
657
	@@:
658
	ret
659
endp
660
 
661
;рисование материала
662
align 4
663
proc draw_material uses edi, m_data:dword
664
	mov edi,[m_data]
665
	stdcall buf_draw_beg, buf_ogl
666
	stdcall [buf2d_draw_text], buf_ogl, buf_1,txt_afff,5,35,0xff
667
 
668
	stdcall [buf2d_draw_text], buf_ogl,buf_1,[edi+offs_mat_name],15,45,0 ;имя материала
669
	stdcall draw_color, [edi+offs_mat_col_ambient], txt_a010,2,55 ;окружающий цвет
670
	stdcall draw_color, [edi+offs_mat_col_diffuse], txt_a020,2,75 ;дифузный цвет
671
	stdcall draw_color, [edi+offs_mat_col_specular],txt_a030,2,95 ;зеркальный цвет
672
 
673
	stdcall [buf2d_draw], buf_ogl
674
	ret
675
endp
676
 
677
align 4
678
proc draw_color uses eax ebx, color:dword, text:dword, c_x:dword, c_y:dword
679
	mov eax,[c_x]
680
	mov ebx,[c_y]
681
	; прямоугольник
682
	inc ebx
683
	stdcall [buf2d_filled_rect_by_size], buf_ogl,eax,ebx,30,17,[color]
684
	dec ebx
685
	stdcall [buf2d_rect_by_size], buf_ogl,eax,ebx,30,19, 0
686
	; подписи
687
	add eax,33
688
	stdcall [buf2d_draw_text], buf_ogl, buf_1,[text],eax,ebx,0
689
	add ebx,10
690
	stdcall hex_in_str, buffer,[color],6
691
	mov byte[buffer+6],0
692
	stdcall [buf2d_draw_text], buf_ogl, buf_1,buffer,eax,ebx,0
693
	ret
694
endp
695
 
6046 IgorA 696
;рисование точек в 3d
697
align 4
698
proc draw_3d uses eax ebx ecx edi, o_data:dword
699
	mov edi,[o_data]
6060 IgorA 700
if 0 ;debug
701
	stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT
702
	mov eax,[edi+offs_obj_poi_data]
703
	stdcall convert_int_to_str, txt_select_vert.count,16
704
	stdcall [buf2d_draw_text], buf_ogl, buf_1,txt_select_vert,5,3,[color_select]
705
	stdcall [kosglSwapBuffers]
706
	jmp .end_f
707
end if
6046 IgorA 708
	cmp dword[edi+offs_obj_poi_count],2
709
	jl .end_f
710
	stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;очистим буфер цвета и глубины
711
	stdcall [glPushMatrix]
712
	bt dword[draw_mode],bit_light
713
	jnc @f
714
		call SetLight
715
		jmp .end_l
716
	@@:
717
		stdcall [glDisable],GL_LIGHTING
718
	.end_l:
719
	stdcall [glTranslatef], 0.0,0.0,0.5 ;correct for z
720
	stdcall [glScalef], [edi+offs_obj_x_scale],[edi+offs_obj_y_scale],[edi+offs_obj_z_scale]
721
	stdcall [glScalef], 1.0,1.0,0.7 ;correct for z
722
	stdcall [glRotatef], [angle_z],0.0,0.0,1.0
723
	stdcall [glRotatef], [angle_y],0.0,1.0,0.0
724
	stdcall [glRotatef], [angle_x],1.0,0.0,0.0
725
	stdcall [glTranslatef], [edi+offs_obj_x_centr],[edi+offs_obj_y_centr],[edi+offs_obj_z_centr]
726
 
6509 IgorA 727
if version_edit eq 0
728
	;рисование граней с использованием цветов материалов
729
	bt dword[draw_mode],bit_faces_mat
730
	jnc @f
731
		mov eax,[edi+offs_obj_mat1_data]
732
		.b_found:
733
		cmp eax,0
734
		je .end_triangles
735
			mov ebx,eax
736
			stdcall get_mat_color, eax
737
			stdcall draw_3d_faces_color, edi,ebx,eax
738
			stdcall found_mat_faces, ebx
739
		jmp .b_found
740
	@@:
741
end if
742
 
6046 IgorA 743
	;рисование точек
744
	bt dword[draw_mode],bit_vertexes
745
	jnc .end_points
746
		stdcall [glColor3ub],[color_vert+2],[color_vert+1],[color_vert]
747
		stdcall [glBegin],GL_POINTS
748
		mov eax,[edi+offs_obj_poi_data]
749
		mov ebx,[edi+offs_obj_poi_count]
750
		@@:
751
			stdcall [glVertex3f], [eax],[eax+4],[eax+8]
752
			add eax,12
753
			dec ebx
754
			jnz @b
755
		stdcall [glEnd]
756
	.end_points:
757
 
758
if version_edit eq 1
759
	;рисование активной точки
760
	stdcall [tl_node_get_data],tree3
761
	cmp eax,0
762
	je @f
763
		;выделение активной точки
764
		mov eax,[eax]
765
 
766
		stdcall [glBegin],GL_LINES
767
		stdcall [glColor3ub], [color_ox+2],[color_ox+1],[color_ox]
768
		stdcall [glVertex3f], [edi+offs_obj_x_min],[eax+4],[eax+8]
769
		stdcall [glVertex3f], [edi+offs_obj_x_max],[eax+4],[eax+8]
770
		stdcall [glColor3ub], [color_oy+2],[color_oy+1],[color_oy]
771
		stdcall [glVertex3f], [eax],[edi+offs_obj_y_min],[eax+8]
772
		stdcall [glVertex3f], [eax],[edi+offs_obj_y_max],[eax+8]
773
		stdcall [glColor3ub], [color_oz+2],[color_oz+1],[color_oz]
774
		stdcall [glVertex3f], [eax],[eax+4],[edi+offs_obj_z_min]
775
		stdcall [glVertex3f], [eax],[eax+4],[edi+offs_obj_z_max]
776
		stdcall [glEnd]
777
 
778
		stdcall [glColor3ub],[color_select+2],[color_select+1],[color_select]
779
		stdcall [glPushMatrix]
780
			stdcall [glTranslatef], [eax],[eax+4],[eax+8]
781
			stdcall [gluSphere], [qObj], [sph_radius], 8,8
782
		stdcall [glPopMatrix]
783
	@@:
784
 
785
	;рисование выделенных точек
786
	cmp dword[obj_poi_sel_c],0
787
	je .end_select
788
		mov ecx,dword[obj_poi_sel_c]
789
		stdcall [glColor3ub],[color_select+2],[color_select+1],[color_select]
790
		stdcall dword[tl_node_poi_get_info], tree3,0
791
		@@:
792
			cmp eax,0
793
			je .end_select
794
			mov ebx,eax
795
			cmp word[ebx],ID_ICON_POINT_SEL
796
			jne .next_sel
797
			stdcall [tl_node_poi_get_data], tree3,ebx
798
			mov eax,[eax]
799
			stdcall [glPushMatrix]
800
				stdcall [glTranslatef], [eax],[eax+4],[eax+8]
801
				stdcall [gluSphere], [qObj], [sph_radius], 4,4
802
			stdcall [glPopMatrix]
803
			dec ecx
804
			jz .end_select
805
			.next_sel:
806
			stdcall dword[tl_node_poi_get_next_info], tree3,ebx
807
			jmp @b
808
    .end_select:
809
end if
810
 
811
	;рисование граней
812
	bt dword[draw_mode],bit_faces
813
	jnc .end_triangles
814
	cmp dword[edi+offs_obj_tri_count],0
815
	je .end_triangles
816
	cmp dword[edi+offs_obj_poi_count],0
817
	je .end_triangles
818
		bt dword[draw_mode],bit_faces_fill
819
		jc @f
820
			push GL_LINE
821
			jmp .end_0
822
		@@:
823
			push GL_FILL
824
		.end_0:
825
		stdcall [glPolygonMode], GL_FRONT_AND_BACK ;mode - уже в стеке
826
		stdcall [glColor3ub],[color_face+2],[color_face+1],[color_face]
827
		stdcall [glBegin],GL_TRIANGLES
828
		mov eax,[edi+offs_obj_tri_data]
829
		mov ecx,[edi+offs_obj_tri_count]
830
		mov edx,[edi+offs_obj_normals_tri_data]
831
		@@:
832
			;
833
			bt dword[draw_mode],bit_light
834
			jnc .norm
835
				;[obj_normals_tri_count]
836
				stdcall [glNormal3fv], edx
837
				add edx,12
838
			.norm:
839
			;
840
			movzx ebx,word[eax] ;1-я вершина
841
			imul ebx,12
842
			add ebx,[edi+offs_obj_poi_data]
843
			stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
844
			movzx ebx,word[eax+2] ;2-я вершина
845
			imul ebx,12
846
			add ebx,[edi+offs_obj_poi_data]
847
			stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
848
			movzx ebx,word[eax+4] ;3-я вершина
849
			imul ebx,12
850
			add ebx,[edi+offs_obj_poi_data]
851
			stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
852
			add eax,8 ;размер треугольника = (3 вершины (по 2б) + свойства (2б))
853
			dec ecx
854
			jnz @b
855
		stdcall [glEnd]
856
	.end_triangles:
857
 
858
	stdcall [glPopMatrix]
859
if version_edit eq 1
860
	cmp dword[obj_poi_sel_c],0
861
	je @f
862
		stdcall [buf2d_draw_text], buf_ogl, buf_1,txt_select_vert,5,3,[color_select]
863
	@@:
864
end if
865
	stdcall [kosglSwapBuffers]
866
	.end_f:
867
	ret
868
endp
869
 
870
align 4
871
SetLight:
872
	stdcall [glLightfv], GL_LIGHT0, GL_POSITION, light_position
873
	stdcall [glLightfv], GL_LIGHT0, GL_SPOT_DIRECTION, light_dir
874
 
875
	stdcall [glLightfv], GL_LIGHT0, GL_DIFFUSE, white_light
876
	stdcall [glLightfv], GL_LIGHT0, GL_SPECULAR, white_light
877
 
878
	stdcall [glEnable], GL_COLOR_MATERIAL
879
	stdcall [glColorMaterial], GL_FRONT, GL_AMBIENT_AND_DIFFUSE
880
	stdcall [glMaterialfv], GL_FRONT, GL_SPECULAR, mat_specular
881
	stdcall [glMaterialf], GL_FRONT, GL_SHININESS, mat_shininess
882
	stdcall [glLightModelfv], GL_LIGHT_MODEL_AMBIENT, lmodel_ambient
883
 
884
	stdcall [glEnable],GL_LIGHTING
885
	stdcall [glEnable],GL_LIGHT0
886
	ret
887
 
6060 IgorA 888
;включаем режим рисования вершин
6046 IgorA 889
align 4
6060 IgorA 890
mnu_vertexes_on:
891
	or dword[draw_mode], 1 shl bit_vertexes
6509 IgorA 892
	and dword[draw_mode], not ((1 shl bit_faces)+(1 shl bit_faces_mat)) ;выключаем режимы рисования, которые могут мешать
6060 IgorA 893
	call update_obj
6046 IgorA 894
	ret
895
 
6060 IgorA 896
;включаем режим рисования каркасных граней
6046 IgorA 897
align 4
6060 IgorA 898
mnu_edges_on:
899
	or dword[draw_mode], 1 shl bit_faces
6509 IgorA 900
	and dword[draw_mode], not ((1 shl bit_vertexes)+(1 shl bit_faces_fill)+(1 shl bit_faces_mat))
6060 IgorA 901
	call update_obj
6046 IgorA 902
	ret
903
 
6060 IgorA 904
;включаем режим рисования сплошных граней
6046 IgorA 905
align 4
6060 IgorA 906
mnu_faces_on:
907
	or dword[draw_mode], (1 shl bit_faces)+(1 shl bit_faces_fill)
6509 IgorA 908
	and dword[draw_mode], not ((1 shl bit_vertexes)+(1 shl bit_faces_mat))
6060 IgorA 909
	call update_obj
6046 IgorA 910
	ret
911
 
912
;включаем или отключаем освещение
913
align 4
914
mnu_light_on_off:
915
	xor dword[draw_mode], 1 shl bit_light
6060 IgorA 916
	call update_obj
6046 IgorA 917
	ret
918
 
919
align 4
920
mnu_reset_settings:
921
	mov dword[angle_x],0.0
922
	mov dword[angle_y],0.0
923
	mov dword[angle_z],0.0
924
	m2m dword[draw_mode],dword[def_dr_mode]
6060 IgorA 925
	call update_obj
926
	ret
927
 
928
if version_edit eq 1
929
 
930
align 4
931
update_obj:
6046 IgorA 932
	stdcall draw_3d, o3d
933
	ret
934
 
6060 IgorA 935
else
936
 
6509 IgorA 937
;включаем режим рисования сплошных граней
6046 IgorA 938
align 4
6509 IgorA 939
mnu_faces_mat:
940
	or dword[draw_mode], (1 shl bit_faces_mat)
941
	call update_obj
942
	ret
943
 
944
align 4
6060 IgorA 945
update_obj:
6081 IgorA 946
push eax ebx
6060 IgorA 947
	stdcall [tl_node_get_data],tree1
948
	cmp eax,0
949
	je @f
6081 IgorA 950
		mov ebx,dword[eax] ;получаем значение сдвига выбранного блока относительно начала файла
951
		add ebx,dword[open_file_data] ;получаем значение сдвига в памяти
952
		cmp word[ebx],CHUNK_OBJBLOCK
953
		jne @f
6509 IgorA 954
			add eax,list_offs_obj3d
955
			stdcall draw_3d,eax
6060 IgorA 956
	@@:
6081 IgorA 957
pop ebx eax
6060 IgorA 958
	ret
959
 
6509 IgorA 960
;input:
961
; p_mat - указатель на данные предыдущего материала
962
align 4
963
proc found_mat_faces uses ebx, p_mat:dword
964
	mov eax,[p_mat]
965
	add eax,[eax+2]
966
	cmp word[eax],CHUNK_FACEMAT
967
	je @f
968
		xor eax,eax
969
	@@:
970
	ret
971
endp
972
 
973
align 4
974
proc get_mat_color uses ebx ecx edx edi esi, p_mat:dword
975
	stdcall [tl_node_poi_get_info], tree1,0
976
	mov ecx,eax
977
	.cycle_0:
978
		cmp ecx,0
979
		je .cycle_0_end
980
			stdcall [tl_node_poi_get_data], tree1,ecx
981
			mov ebx,[eax] ;получаем значение сдвига выбранного блока
982
			add ebx,[open_file_data]
983
			cmp word[ebx],CHUNK_MATERIAL
984
			jne .end_add_p3
985
			add eax,list_offs_obj3d
986
			mov esi,[eax+offs_mat_name]
987
			cmp esi,0
988
			jne @f
989
				;init material
990
				stdcall mat_init,eax,ebx
991
				mov esi,[eax+offs_mat_name]
992
			@@:
993
			mov edi,[p_mat]
994
			mov eax,5
995
			add edi,eax
996
align 4
997
			@@:
998
				cmp al,0
999
				je .found
1000
				lodsb
1001
				inc edi
1002
				cmp byte[edi],al
1003
				je @b
1004
		.end_add_p3:
1005
		stdcall [tl_node_poi_get_next_info], tree1,ecx
1006
		mov ecx,eax ;переходим к следущему узлу
1007
		jmp .cycle_0
1008
	.cycle_0_end:
1009
 
1010
	.no_found:
1011
		xor eax,eax
1012
		jmp .end_f
1013
	.found:
1014
		stdcall [tl_node_poi_get_data], tree1,ecx
1015
		add eax,list_offs_obj3d
1016
		mov eax,[eax+offs_mat_col_diffuse]
1017
	.end_f:
1018
	ret
1019
endp
1020
 
1021
align 4
1022
proc draw_3d_faces_color o_data:dword, p_mat:dword, color:dword
1023
pushad
1024
	stdcall [glPolygonMode], GL_FRONT_AND_BACK,GL_FILL
1025
	stdcall [glColor3ub],[color+2],[color+1],[color]
1026
	stdcall [glBegin],GL_TRIANGLES
1027
	mov edi,[o_data]
1028
	mov esi,[p_mat]
1029
	add esi,6
1030
	@@:
1031
		lodsb
1032
		cmp al,0
1033
		jne @b
1034
	movzx ecx,word[esi] ;ecx - число граней с данным материалом
1035
	mov edx,[edi+offs_obj_poi_data]
1036
align 4
1037
	@@:
1038
		add esi,2
1039
		;word[esi] - номер треугольника
1040
		movzx ebx,word[esi]
1041
		shl ebx,3
1042
		add ebx,[edi+offs_obj_tri_data]
1043
 
1044
		movzx eax,word[ebx] ;1-я вершина
1045
		imul eax,12 ;float(x,y,z)
1046
		add eax,edx
1047
		stdcall [glVertex3f], [eax],[eax+4],[eax+8]
1048
 
1049
		movzx eax,word[ebx+2] ;2-я вершина
1050
		imul eax,12 ;float(x,y,z)
1051
		add eax,edx
1052
		stdcall [glVertex3f], [eax],[eax+4],[eax+8]
1053
 
1054
		movzx eax,word[ebx+4] ;3-я вершина
1055
		imul eax,12 ;float(x,y,z)
1056
		add eax,edx
1057
		stdcall [glVertex3f], [eax],[eax+4],[eax+8]
1058
 
1059
		dec ecx
1060
		jnz @b
1061
	stdcall [glEnd]
1062
 
1063
.end_f:
1064
popad
1065
	ret
1066
endp
1067
 
6060 IgorA 1068
end if
1069
 
1070
align 4
6046 IgorA 1071
draw_mode dd 0 ;режим рисования объекта
1072
def_dr_mode dd 0 ;режим рисования по умолчанию
1073
delt_size dd 3.0 ;изменение углов при поворотах с кливиатуры
1074
mouse_drag dd 0 ;режим поворота сцены от перемещении курсора мыши
1075
mouse_x dd 0
1076
mouse_y dd 0
1077
sph_radius dd 0 ;радиус сферы для выделения активной точки
1078