Subversion Repositories Kolibri OS

Rev

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