Subversion Repositories Kolibri OS

Rev

Rev 6889 | 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
7610 IgorA 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
7610 IgorA 641
			cmp esi,ecx
642
			jge .end_points ;если нет блока с материалом
6509 IgorA 643
			cmp word[esi],CHUNK_FACEMAT
644
			jne .end_points
6889 IgorA 645
				mov [edi+obj_3d.mat1_data],esi
6060 IgorA 646
		.end_points:
647
 
648
		stdcall obj_set_sizes, edi
649
		stdcall obj_set_normals, edi
650
if version_edit eq 0
651
		stdcall draw_3d, edi
652
end if
653
	.no_points:
654
	popad
655
	ret
656
endp
657
 
6081 IgorA 658
;настройка материала
6509 IgorA 659
;input:
660
; m_data - указатель на заполняемую структуру с материалом
661
; f_data - указательна на блок CHUNK_MATERIAL из файла 3ds
6081 IgorA 662
align 4
6509 IgorA 663
proc mat_init, m_data:dword, f_data:dword
6081 IgorA 664
	pushad
665
	mov edi,[m_data]
666
 
667
	;... clear edi ...
6889 IgorA 668
	mov dword[edi+material.name],0
669
	mov dword[edi+material.col_ambient],0
670
	mov dword[edi+material.col_diffuse],0
671
	mov dword[edi+material.col_specular],0
6081 IgorA 672
 
673
	xor edx,edx
6509 IgorA 674
	mov ebx,[f_data]
675
	xor ecx,ecx
676
	cmp word[ebx],CHUNK_MATERIAL
677
	jne .no_material
678
		mov ecx,ebx
679
		add ecx,dword[ecx+2] ;граница блока
680
		add ebx,6
681
	cmp word[ebx],CHUNK_MATNAME
682
	jne .no_material
683
		;*** (0) ***
684
		mov esi,ebx
685
		add ebx,6
6889 IgorA 686
		mov [edi+material.name],ebx
6509 IgorA 687
		sub ebx,6
688
		;*** (1) ***
689
		.cycle_0: ;цикл для поиска цвета материала
690
			add esi,dword[esi+2]
691
			cmp word[esi],0xa010
692
			je @f
693
				cmp ecx,esi
694
				jg .cycle_0 ;пока не достигнута грница старшего блока
695
				jmp .end_material ;если не нашли цвет материала
696
		@@:
697
		;если нашли цвет материала
698
		add esi,6
699
		cmp word[esi],0x0011
700
		jne .end_material
6081 IgorA 701
			add esi,6
6509 IgorA 702
			mov dl,byte[esi]
6889 IgorA 703
			mov byte[edi+material.col_ambient+2],dl
6509 IgorA 704
			mov dx,word[esi+1]
705
			ror dx,8
6889 IgorA 706
			mov word[edi+material.col_ambient],dx
6509 IgorA 707
		;*** (2) ***
708
		mov esi,ebx
709
		.cycle_1: ;цикл для поиска цвета материала
710
			add esi,dword[esi+2]
711
			cmp word[esi],0xa020
712
			je @f
713
				cmp ecx,esi
714
				jg .cycle_1 ;пока не достигнута грница старшего блока
715
				jmp .end_material ;если не нашли цвет материала
716
		@@:
717
		;если нашли цвет материала
718
		add esi,6
719
		cmp word[esi],0x0011
720
		jne .end_material
6081 IgorA 721
			add esi,6
6509 IgorA 722
			mov dl,byte[esi]
6889 IgorA 723
			mov byte[edi+material.col_diffuse+2],dl
6509 IgorA 724
			mov dx,word[esi+1]
725
			ror dx,8
6889 IgorA 726
			mov word[edi+material.col_diffuse],dx
6509 IgorA 727
		;*** (3) ***
728
		mov esi,ebx
729
		.cycle_2: ;цикл для поиска цвета материала
730
			add esi,dword[esi+2]
731
			cmp word[esi],0xa030
732
			je @f
733
				cmp ecx,esi
734
				jg .cycle_2 ;пока не достигнута грница старшего блока
735
				jmp .end_material ;если не нашли цвет материала
736
		@@:
737
		;если нашли цвет материала
738
		add esi,6
739
		cmp word[esi],0x0011
740
		jne .end_material
6081 IgorA 741
			add esi,6
6509 IgorA 742
			mov dl,byte[esi]
6889 IgorA 743
			mov byte[edi+material.col_specular+2],dl
6509 IgorA 744
			mov dx,word[esi+1]
745
			ror dx,8
6889 IgorA 746
			mov word[edi+material.col_specular],dx
6081 IgorA 747
 
6509 IgorA 748
		.end_material:
6081 IgorA 749
	.no_material:
750
	popad
751
	ret
752
endp
753
 
754
align 4
755
proc buf_draw_beg uses eax, buf:dword
756
	mov eax,[buf]
757
	stdcall [buf2d_clear], eax, [eax+16] ;чистим буфер
758
	stdcall [buf2d_draw_text], eax, buf_1,txt_open_3ds,5,5,0xff
759
	stdcall [buf2d_draw_text], eax, buf_1,openfile_path,5,15,0xff
760
	cmp dword[level_stack],FILE_ERROR_CHUNK_SIZE ;возможна ошибка файла
761
	jne @f
762
		stdcall [buf2d_draw_text], eax, buf_1,txt_3ds_err_sizes,5,25,0xff0000
763
	@@:
764
	ret
765
endp
766
 
767
;рисование материала
768
align 4
769
proc draw_material uses edi, m_data:dword
770
	mov edi,[m_data]
771
	stdcall buf_draw_beg, buf_ogl
772
	stdcall [buf2d_draw_text], buf_ogl, buf_1,txt_afff,5,35,0xff
773
 
6889 IgorA 774
	stdcall [buf2d_draw_text], buf_ogl,buf_1,[edi+material.name],15,45,0 ;имя материала
775
	stdcall draw_color, [edi+material.col_ambient], txt_a010,2,55 ;окружающий цвет
776
	stdcall draw_color, [edi+material.col_diffuse], txt_a020,2,75 ;дифузный цвет
777
	stdcall draw_color, [edi+material.col_specular],txt_a030,2,95 ;зеркальный цвет
6081 IgorA 778
 
779
	stdcall [buf2d_draw], buf_ogl
780
	ret
781
endp
782
 
783
align 4
784
proc draw_color uses eax ebx, color:dword, text:dword, c_x:dword, c_y:dword
785
	mov eax,[c_x]
786
	mov ebx,[c_y]
787
	; прямоугольник
788
	inc ebx
789
	stdcall [buf2d_filled_rect_by_size], buf_ogl,eax,ebx,30,17,[color]
790
	dec ebx
791
	stdcall [buf2d_rect_by_size], buf_ogl,eax,ebx,30,19, 0
792
	; подписи
793
	add eax,33
794
	stdcall [buf2d_draw_text], buf_ogl, buf_1,[text],eax,ebx,0
795
	add ebx,10
796
	stdcall hex_in_str, buffer,[color],6
797
	mov byte[buffer+6],0
798
	stdcall [buf2d_draw_text], buf_ogl, buf_1,buffer,eax,ebx,0
799
	ret
800
endp
801
 
6046 IgorA 802
;рисование точек в 3d
803
align 4
804
proc draw_3d uses eax ebx ecx edi, o_data:dword
805
	mov edi,[o_data]
6889 IgorA 806
	cmp dword[edi+obj_3d.poi_count],2
6046 IgorA 807
	jl .end_f
808
	stdcall [glClear], GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT ;очистим буфер цвета и глубины
809
	stdcall [glPushMatrix]
810
	bt dword[draw_mode],bit_light
811
	jnc @f
812
		call SetLight
813
		jmp .end_l
814
	@@:
815
		stdcall [glDisable],GL_LIGHTING
816
	.end_l:
817
	stdcall [glTranslatef], 0.0,0.0,0.5 ;correct for z
6889 IgorA 818
	stdcall [glScalef], [edi+obj_3d.x_scale],[edi+obj_3d.y_scale],[edi+obj_3d.z_scale]
6046 IgorA 819
	stdcall [glScalef], 1.0,1.0,0.7 ;correct for z
820
	stdcall [glRotatef], [angle_z],0.0,0.0,1.0
821
	stdcall [glRotatef], [angle_y],0.0,1.0,0.0
822
	stdcall [glRotatef], [angle_x],1.0,0.0,0.0
6889 IgorA 823
	stdcall [glTranslatef], [edi+obj_3d.x_centr],[edi+obj_3d.y_centr],[edi+obj_3d.z_centr]
6046 IgorA 824
 
6509 IgorA 825
if version_edit eq 0
826
	;рисование граней с использованием цветов материалов
827
	bt dword[draw_mode],bit_faces_mat
828
	jnc @f
6889 IgorA 829
		mov eax,[edi+obj_3d.mat1_data]
7610 IgorA 830
		or eax,eax
831
		jnz .b_found
832
			stdcall [buf2d_draw_text], buf_ogl, buf_1,txt_mat_null,5,3,[color_select]
833
			jmp .mat_null ;если нет материала, рисуем все грани одним цветом
6509 IgorA 834
		.b_found:
835
			mov ebx,eax
836
			stdcall get_mat_color, eax
837
			stdcall draw_3d_faces_color, edi,ebx,eax
838
			stdcall found_mat_faces, ebx
7610 IgorA 839
			or eax,eax
840
			jnz .b_found
841
		jmp .end_points
842
 
6509 IgorA 843
	@@:
844
end if
845
 
6513 IgorA 846
	;рисование граней без цветов материалов
847
	bt dword[draw_mode],bit_faces
848
	jnc .end_triangles
7610 IgorA 849
	.mat_null:
6889 IgorA 850
	cmp dword[edi+obj_3d.tri_count],0
6513 IgorA 851
	je .end_triangles
6889 IgorA 852
	cmp dword[edi+obj_3d.poi_count],0
6513 IgorA 853
	je .end_triangles
854
		bt dword[draw_mode],bit_faces_fill
855
		jc @f
856
			push GL_LINE
857
			jmp .end_0
858
		@@:
859
			push GL_FILL
860
		.end_0:
861
		stdcall [glPolygonMode], GL_FRONT_AND_BACK ;mode - уже в стеке
862
		stdcall [glColor3ub],[color_face+2],[color_face+1],[color_face]
863
 
864
		bt dword[draw_mode],bit_smooth
865
		jnc .triangles_flat
866
		bt dword[draw_mode],bit_light
867
		jnc .triangles_flat
868
			;triangles smooth
869
			stdcall [glBegin],GL_TRIANGLES
6889 IgorA 870
			mov eax,[edi+obj_3d.tri_data]
871
			mov ecx,[edi+obj_3d.tri_count]
872
			mov edx,[edi+obj_3d.normals_tri_data]
6513 IgorA 873
align 4
874
			@@:
875
				movzx ebx,word[eax] ;1-я вершина
876
				imul ebx,12
6889 IgorA 877
					add ebx,[edi+obj_3d.normals_poi_data]
6513 IgorA 878
					stdcall [glNormal3fv], ebx
6889 IgorA 879
					sub ebx,[edi+obj_3d.normals_poi_data]
880
				add ebx,[edi+obj_3d.poi_data]
6513 IgorA 881
				stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
882
				movzx ebx,word[eax+2] ;2-я вершина
883
				imul ebx,12
6889 IgorA 884
					add ebx,[edi+obj_3d.normals_poi_data]
6513 IgorA 885
					stdcall [glNormal3fv], ebx
6889 IgorA 886
					sub ebx,[edi+obj_3d.normals_poi_data]
887
				add ebx,[edi+obj_3d.poi_data]
6513 IgorA 888
				stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
889
				movzx ebx,word[eax+4] ;3-я вершина
890
				imul ebx,12
6889 IgorA 891
					add ebx,[edi+obj_3d.normals_poi_data]
6513 IgorA 892
					stdcall [glNormal3fv], ebx
6889 IgorA 893
					sub ebx,[edi+obj_3d.normals_poi_data]
894
				add ebx,[edi+obj_3d.poi_data]
6513 IgorA 895
				stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
896
				add eax,8 ;размер треугольника = (3 вершины (по 2б) + свойства (2б))
897
				dec ecx
898
				jnz @b
899
			stdcall [glEnd]
900
			jmp .end_points
901
 
902
		.triangles_flat:
903
		stdcall [glBegin],GL_TRIANGLES
6889 IgorA 904
		mov eax,[edi+obj_3d.tri_data]
905
		mov ecx,[edi+obj_3d.tri_count]
906
		mov edx,[edi+obj_3d.normals_tri_data]
6513 IgorA 907
align 4
908
		@@:
909
			;
910
			bt dword[draw_mode],bit_light
911
			jnc .norm1
912
				stdcall [glNormal3fv], edx
913
				add edx,12
914
			.norm1:
915
			movzx ebx,word[eax] ;1-я вершина
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
			movzx ebx,word[eax+2] ;2-я вершина
920
			imul ebx,12
6889 IgorA 921
			add ebx,[edi+obj_3d.poi_data]
6513 IgorA 922
			stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
923
			movzx ebx,word[eax+4] ;3-я вершина
924
			imul ebx,12
6889 IgorA 925
			add ebx,[edi+obj_3d.poi_data]
6513 IgorA 926
			stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
927
			add eax,8 ;размер треугольника = (3 вершины (по 2б) + свойства (2б))
928
			dec ecx
929
			jnz @b
930
		stdcall [glEnd]
931
		jmp .end_points
932
	.end_triangles:
933
 
6046 IgorA 934
	;рисование точек
935
	bt dword[draw_mode],bit_vertexes
936
	jnc .end_points
937
		stdcall [glColor3ub],[color_vert+2],[color_vert+1],[color_vert]
938
		stdcall [glBegin],GL_POINTS
6889 IgorA 939
		mov eax,[edi+obj_3d.poi_data]
940
		mov ebx,[edi+obj_3d.poi_count]
941
		mov edx,[edi+obj_3d.normals_poi_data]
6513 IgorA 942
align 4
6046 IgorA 943
		@@:
6513 IgorA 944
			bt dword[draw_mode],bit_light
945
			jnc .norm0
7610 IgorA 946
			or edx,edx
947
			jz .norm0 ;если нормалей нет
6513 IgorA 948
				stdcall [glNormal3fv], edx
949
				add edx,12
950
			.norm0:
6046 IgorA 951
			stdcall [glVertex3f], [eax],[eax+4],[eax+8]
952
			add eax,12
953
			dec ebx
954
			jnz @b
955
		stdcall [glEnd]
956
	.end_points:
957
 
958
if version_edit eq 1
959
	;рисование активной точки
960
	stdcall [tl_node_get_data],tree3
961
	cmp eax,0
962
	je @f
963
		;выделение активной точки
964
		mov eax,[eax]
965
 
966
		stdcall [glBegin],GL_LINES
967
		stdcall [glColor3ub], [color_ox+2],[color_ox+1],[color_ox]
6889 IgorA 968
		stdcall [glVertex3f], [edi+obj_3d.x_min],[eax+4],[eax+8]
969
		stdcall [glVertex3f], [edi+obj_3d.x_max],[eax+4],[eax+8]
6046 IgorA 970
		stdcall [glColor3ub], [color_oy+2],[color_oy+1],[color_oy]
6889 IgorA 971
		stdcall [glVertex3f], [eax],[edi+obj_3d.y_min],[eax+8]
972
		stdcall [glVertex3f], [eax],[edi+obj_3d.y_max],[eax+8]
6046 IgorA 973
		stdcall [glColor3ub], [color_oz+2],[color_oz+1],[color_oz]
6889 IgorA 974
		stdcall [glVertex3f], [eax],[eax+4],[edi+obj_3d.z_min]
975
		stdcall [glVertex3f], [eax],[eax+4],[edi+obj_3d.z_max]
6046 IgorA 976
		stdcall [glEnd]
977
 
978
		stdcall [glColor3ub],[color_select+2],[color_select+1],[color_select]
979
		stdcall [glPushMatrix]
980
			stdcall [glTranslatef], [eax],[eax+4],[eax+8]
981
			stdcall [gluSphere], [qObj], [sph_radius], 8,8
982
		stdcall [glPopMatrix]
983
	@@:
984
 
985
	;рисование выделенных точек
986
	cmp dword[obj_poi_sel_c],0
987
	je .end_select
988
		mov ecx,dword[obj_poi_sel_c]
989
		stdcall [glColor3ub],[color_select+2],[color_select+1],[color_select]
7610 IgorA 990
		stdcall [tl_node_poi_get_info], tree3,0
6513 IgorA 991
align 4
6046 IgorA 992
		@@:
993
			cmp eax,0
994
			je .end_select
995
			mov ebx,eax
996
			cmp word[ebx],ID_ICON_POINT_SEL
997
			jne .next_sel
998
			stdcall [tl_node_poi_get_data], tree3,ebx
999
			mov eax,[eax]
1000
			stdcall [glPushMatrix]
1001
				stdcall [glTranslatef], [eax],[eax+4],[eax+8]
1002
				stdcall [gluSphere], [qObj], [sph_radius], 4,4
1003
			stdcall [glPopMatrix]
1004
			dec ecx
1005
			jz .end_select
1006
			.next_sel:
7610 IgorA 1007
			stdcall [tl_node_poi_get_next_info], tree3,ebx
6046 IgorA 1008
			jmp @b
1009
    .end_select:
1010
end if
1011
 
1012
	stdcall [glPopMatrix]
1013
if version_edit eq 1
1014
	cmp dword[obj_poi_sel_c],0
1015
	je @f
1016
		stdcall [buf2d_draw_text], buf_ogl, buf_1,txt_select_vert,5,3,[color_select]
1017
	@@:
1018
end if
1019
	stdcall [kosglSwapBuffers]
1020
	.end_f:
1021
	ret
1022
endp
1023
 
1024
align 4
1025
SetLight:
1026
	stdcall [glLightfv], GL_LIGHT0, GL_POSITION, light_position
1027
	stdcall [glLightfv], GL_LIGHT0, GL_SPOT_DIRECTION, light_dir
1028
 
1029
	stdcall [glLightfv], GL_LIGHT0, GL_DIFFUSE, white_light
1030
	stdcall [glLightfv], GL_LIGHT0, GL_SPECULAR, white_light
1031
 
1032
	stdcall [glEnable], GL_COLOR_MATERIAL
1033
	stdcall [glColorMaterial], GL_FRONT, GL_AMBIENT_AND_DIFFUSE
1034
	stdcall [glMaterialfv], GL_FRONT, GL_SPECULAR, mat_specular
1035
	stdcall [glMaterialf], GL_FRONT, GL_SHININESS, mat_shininess
1036
	stdcall [glLightModelfv], GL_LIGHT_MODEL_AMBIENT, lmodel_ambient
1037
 
1038
	stdcall [glEnable],GL_LIGHTING
1039
	stdcall [glEnable],GL_LIGHT0
1040
	ret
1041
 
6060 IgorA 1042
;включаем режим рисования вершин
6046 IgorA 1043
align 4
6060 IgorA 1044
mnu_vertexes_on:
1045
	or dword[draw_mode], 1 shl bit_vertexes
6509 IgorA 1046
	and dword[draw_mode], not ((1 shl bit_faces)+(1 shl bit_faces_mat)) ;выключаем режимы рисования, которые могут мешать
6060 IgorA 1047
	call update_obj
6046 IgorA 1048
	ret
1049
 
6060 IgorA 1050
;включаем режим рисования каркасных граней
6046 IgorA 1051
align 4
6060 IgorA 1052
mnu_edges_on:
1053
	or dword[draw_mode], 1 shl bit_faces
6509 IgorA 1054
	and dword[draw_mode], not ((1 shl bit_vertexes)+(1 shl bit_faces_fill)+(1 shl bit_faces_mat))
6060 IgorA 1055
	call update_obj
6046 IgorA 1056
	ret
1057
 
6060 IgorA 1058
;включаем режим рисования сплошных граней
6046 IgorA 1059
align 4
6060 IgorA 1060
mnu_faces_on:
1061
	or dword[draw_mode], (1 shl bit_faces)+(1 shl bit_faces_fill)
6509 IgorA 1062
	and dword[draw_mode], not ((1 shl bit_vertexes)+(1 shl bit_faces_mat))
6060 IgorA 1063
	call update_obj
6046 IgorA 1064
	ret
1065
 
1066
;включаем или отключаем освещение
1067
align 4
1068
mnu_light_on_off:
1069
	xor dword[draw_mode], 1 shl bit_light
6060 IgorA 1070
	call update_obj
6046 IgorA 1071
	ret
1072
 
1073
align 4
6513 IgorA 1074
mnu_smooth_on_off:
1075
	xor dword[draw_mode], 1 shl bit_smooth
1076
	call update_obj
1077
	ret
1078
 
1079
align 4
6046 IgorA 1080
mnu_reset_settings:
1081
	mov dword[angle_x],0.0
1082
	mov dword[angle_y],0.0
1083
	mov dword[angle_z],0.0
1084
	m2m dword[draw_mode],dword[def_dr_mode]
6060 IgorA 1085
	call update_obj
1086
	ret
1087
 
6889 IgorA 1088
align 4
1089
mnu_make_scrshot:
1090
	pushad
1091
	copy_path open_dialog_name,communication_area_default_path,file_name,0
1092
	mov [OpenDialog_data.type],1
1093
	stdcall [OpenDialog_Start],OpenDialog_data
1094
	cmp [OpenDialog_data.status],2
1095
	je .end_save_file
1096
		;код при удачном открытии диалога
1097
		mov dword[png_data],0
1098
 
1099
		;create image struct
1100
		stdcall [img_create], [buf_ogl.w], [buf_ogl.h], Image.bpp24
1101
		mov ebx,eax
1102
		test eax,eax
1103
		jz @f
1104
			;copy foto to image buffer
1105
			mov edi,[eax+Image.Data]
1106
			mov esi,[buf_ogl]
1107
			mov ecx,[buf_ogl.w]
1108
			mov edx,[buf_ogl.h]
1109
			imul ecx,edx
1110
			imul ecx,3
1111
			shr ecx,2 ;OpenGL buffer align to 4
1112
			rep movsd
1113
 
1114
			;encode image
1115
			stdcall [img_encode], eax, LIBIMG_FORMAT_PNG, 0
1116
			test eax,eax
1117
			jz @f
1118
				mov [png_data],eax
1119
				mov [png_size],ecx
1120
		@@:
1121
		stdcall [img_destroy],ebx
1122
 
1123
        ; заполняем структуру для сохранения файла
1124
        mov ebx,run_file_70
1125
        mov dword[ebx],SSF_CREATE_FILE
1126
        mov eax,[png_size]
1127
        mov [ebx+12],eax ;file size
1128
        mov eax,[png_data]
1129
        mov [ebx+16],eax
1130
        mov dword[ebx+FileInfoBlock.FileName], openfile_path
1131
 
1132
        mcall SF_FILE,run_file_70
1133
        test eax,eax
1134
        jnz .save_error
1135
			;notify_window_run openfile_path
1136
			jmp @f
1137
		.save_error:
1138
			;сообщение о неудачном сохранении
1139
			notify_window_run txt_err_save_img_file
1140
		@@:
1141
		mcall SF_SYS_MISC, SSF_MEM_FREE, [png_data]
1142
	.end_save_file:
1143
	popad
1144
	ret
1145
 
6060 IgorA 1146
if version_edit eq 1
1147
 
1148
align 4
1149
update_obj:
6046 IgorA 1150
	stdcall draw_3d, o3d
1151
	ret
1152
 
6060 IgorA 1153
else
1154
 
6509 IgorA 1155
;включаем режим рисования сплошных граней
6046 IgorA 1156
align 4
6509 IgorA 1157
mnu_faces_mat:
1158
	or dword[draw_mode], (1 shl bit_faces_mat)
1159
	call update_obj
1160
	ret
1161
 
1162
align 4
6060 IgorA 1163
update_obj:
6081 IgorA 1164
push eax ebx
6060 IgorA 1165
	stdcall [tl_node_get_data],tree1
1166
	cmp eax,0
1167
	je @f
6081 IgorA 1168
		mov ebx,dword[eax] ;получаем значение сдвига выбранного блока относительно начала файла
1169
		add ebx,dword[open_file_data] ;получаем значение сдвига в памяти
1170
		cmp word[ebx],CHUNK_OBJBLOCK
1171
		jne @f
6509 IgorA 1172
			add eax,list_offs_obj3d
1173
			stdcall draw_3d,eax
6060 IgorA 1174
	@@:
6081 IgorA 1175
pop ebx eax
6060 IgorA 1176
	ret
1177
 
6509 IgorA 1178
;input:
1179
; p_mat - указатель на данные предыдущего материала
1180
align 4
1181
proc found_mat_faces uses ebx, p_mat:dword
1182
	mov eax,[p_mat]
7610 IgorA 1183
	or eax,eax
1184
	jz @f
6509 IgorA 1185
	add eax,[eax+2]
1186
	cmp word[eax],CHUNK_FACEMAT
1187
	je @f
1188
		xor eax,eax
1189
	@@:
1190
	ret
1191
endp
1192
 
1193
align 4
1194
proc get_mat_color uses ebx ecx edx edi esi, p_mat:dword
1195
	stdcall [tl_node_poi_get_info], tree1,0
1196
	mov ecx,eax
1197
	.cycle_0:
1198
		cmp ecx,0
1199
		je .cycle_0_end
1200
			stdcall [tl_node_poi_get_data], tree1,ecx
1201
			mov ebx,[eax] ;получаем значение сдвига выбранного блока
1202
			add ebx,[open_file_data]
1203
			cmp word[ebx],CHUNK_MATERIAL
1204
			jne .end_add_p3
1205
			add eax,list_offs_obj3d
6889 IgorA 1206
			mov esi,[eax+material.name]
6509 IgorA 1207
			cmp esi,0
1208
			jne @f
1209
				;init material
1210
				stdcall mat_init,eax,ebx
6889 IgorA 1211
				mov esi,[eax+material.name]
6509 IgorA 1212
			@@:
1213
			mov edi,[p_mat]
1214
			mov eax,5
1215
			add edi,eax
1216
align 4
1217
			@@:
1218
				cmp al,0
1219
				je .found
1220
				lodsb
1221
				inc edi
1222
				cmp byte[edi],al
1223
				je @b
1224
		.end_add_p3:
1225
		stdcall [tl_node_poi_get_next_info], tree1,ecx
1226
		mov ecx,eax ;переходим к следущему узлу
1227
		jmp .cycle_0
1228
	.cycle_0_end:
1229
 
1230
	.no_found:
1231
		xor eax,eax
1232
		jmp .end_f
1233
	.found:
1234
		stdcall [tl_node_poi_get_data], tree1,ecx
1235
		add eax,list_offs_obj3d
6889 IgorA 1236
		mov eax,[eax+material.col_diffuse]
6509 IgorA 1237
	.end_f:
1238
	ret
1239
endp
1240
 
1241
align 4
1242
proc draw_3d_faces_color o_data:dword, p_mat:dword, color:dword
1243
pushad
1244
	stdcall [glPolygonMode], GL_FRONT_AND_BACK,GL_FILL
1245
	stdcall [glColor3ub],[color+2],[color+1],[color]
1246
	stdcall [glBegin],GL_TRIANGLES
1247
	mov edi,[o_data]
1248
	mov esi,[p_mat]
1249
	add esi,6
1250
	@@:
1251
		lodsb
1252
		cmp al,0
1253
		jne @b
1254
	movzx ecx,word[esi] ;ecx - число граней с данным материалом
6889 IgorA 1255
	mov edx,[edi+obj_3d.poi_data]
6513 IgorA 1256
 
1257
	bt dword[draw_mode],bit_smooth
1258
	jnc @f
1259
	bt dword[draw_mode],bit_light
1260
	jnc @f
6509 IgorA 1261
align 4
6513 IgorA 1262
	.cycle_0:
1263
		add esi,2
1264
		;word[esi] - номер треугольника
1265
		movzx ebx,word[esi]
1266
 
1267
		shl ebx,3
6889 IgorA 1268
		add ebx,[edi+obj_3d.tri_data]
6513 IgorA 1269
 
1270
		movzx eax,word[ebx] ;1-я вершина
1271
		imul eax,12 ;float(x,y,z)
6889 IgorA 1272
			add eax,[edi+obj_3d.normals_poi_data]
6513 IgorA 1273
			stdcall [glNormal3fv], eax
6889 IgorA 1274
			sub eax,[edi+obj_3d.normals_poi_data]
6513 IgorA 1275
		add eax,edx
1276
		stdcall [glVertex3f], [eax],[eax+4],[eax+8]
1277
 
1278
		movzx eax,word[ebx+2] ;2-я вершина
1279
		imul eax,12 ;float(x,y,z)
6889 IgorA 1280
			add eax,[edi+obj_3d.normals_poi_data]
6513 IgorA 1281
			stdcall [glNormal3fv], eax
6889 IgorA 1282
			sub eax,[edi+obj_3d.normals_poi_data]
6513 IgorA 1283
		add eax,edx
1284
		stdcall [glVertex3f], [eax],[eax+4],[eax+8]
1285
 
1286
		movzx eax,word[ebx+4] ;3-я вершина
1287
		imul eax,12 ;float(x,y,z)
6889 IgorA 1288
			add eax,[edi+obj_3d.normals_poi_data]
6513 IgorA 1289
			stdcall [glNormal3fv], eax
6889 IgorA 1290
			sub eax,[edi+obj_3d.normals_poi_data]
6513 IgorA 1291
		add eax,edx
1292
		stdcall [glVertex3f], [eax],[eax+4],[eax+8]
1293
 
1294
		dec ecx
1295
		jnz .cycle_0
1296
	stdcall [glEnd]
1297
	jmp .end_f
1298
 
1299
align 4
6509 IgorA 1300
	@@:
1301
		add esi,2
1302
		;word[esi] - номер треугольника
1303
		movzx ebx,word[esi]
6510 IgorA 1304
		;нормали для освещения
1305
		bt dword[draw_mode],bit_light
1306
		jnc .norm
1307
			mov eax,ebx
1308
			imul eax,12
6889 IgorA 1309
			add eax,[edi+obj_3d.normals_tri_data]
6510 IgorA 1310
			stdcall [glNormal3fv], eax
1311
		.norm:
1312
 
6509 IgorA 1313
		shl ebx,3
6889 IgorA 1314
		add ebx,[edi+obj_3d.tri_data]
6509 IgorA 1315
 
1316
		movzx eax,word[ebx] ;1-я вершина
1317
		imul eax,12 ;float(x,y,z)
1318
		add eax,edx
1319
		stdcall [glVertex3f], [eax],[eax+4],[eax+8]
1320
 
1321
		movzx eax,word[ebx+2] ;2-я вершина
1322
		imul eax,12 ;float(x,y,z)
1323
		add eax,edx
1324
		stdcall [glVertex3f], [eax],[eax+4],[eax+8]
1325
 
1326
		movzx eax,word[ebx+4] ;3-я вершина
1327
		imul eax,12 ;float(x,y,z)
1328
		add eax,edx
1329
		stdcall [glVertex3f], [eax],[eax+4],[eax+8]
1330
 
1331
		dec ecx
1332
		jnz @b
1333
	stdcall [glEnd]
1334
 
1335
.end_f:
1336
popad
1337
	ret
1338
endp
1339
 
6060 IgorA 1340
end if
1341
 
1342
align 4
6046 IgorA 1343
draw_mode dd 0 ;режим рисования объекта
1344
def_dr_mode dd 0 ;режим рисования по умолчанию
1345
delt_size dd 3.0 ;изменение углов при поворотах с кливиатуры
1346
mouse_drag dd 0 ;режим поворота сцены от перемещении курсора мыши
1347
mouse_x dd 0
1348
mouse_y dd 0
1349
sph_radius dd 0 ;радиус сферы для выделения активной точки
1350