Subversion Repositories Kolibri OS

Rev

Rev 7616 | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
6046 IgorA 1
;
2
; структуры и функции для рисования 3d объектов
3
;
4
 
8083 IgorA 5
include '../../develop/libraries/TinyGL/asm_fork/zbuffer.inc'
6046 IgorA 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
7616 IgorA 63
	db '"Не могу сохранить файл." -W',0
6889 IgorA 64
else
7616 IgorA 65
	db '"Can',39,'t save file." -W',0
6889 IgorA 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
		@@:
8083 IgorA 359
			lea edi,[ebp-36] ;tbl2
6046 IgorA 360
			movzx esi,word[edx] ;1-я вершина
361
			imul esi,12
362
			add esi,ecx
363
			movsd
364
			movsd
365
			movsd
366
			movzx esi,word[edx+2] ;2-я вершина
367
			imul esi,12
368
			add esi,ecx
369
			movsd
370
			movsd
371
			movsd
372
			movzx esi,word[edx+4] ;3-я вершина
373
			imul esi,12
374
			add esi,ecx
375
			movsd
376
			movsd
377
			movsd
378
 
8083 IgorA 379
			lea esi,[ebp-72] ;tbl1
6046 IgorA 380
			sub edi,36 ;tbl2
381
			;v1 <-> v2
382
			fld dword[edi+12]
383
			fsub dword[edi]
6510 IgorA 384
			fstp dword[esi] ;(x2-x1)
6046 IgorA 385
			fld dword[edi+16]
386
			fsub dword[edi+4]
6510 IgorA 387
			fstp dword[esi+4] ;(y2-y1)
6046 IgorA 388
			fld dword[edi+20]
389
			fsub dword[edi+8]
6510 IgorA 390
			fstp dword[esi+8] ;(z2-z1)
6046 IgorA 391
			;v2 <-> v3
6510 IgorA 392
			fld dword[edi+12]
393
			fsub dword[edi+24]
6046 IgorA 394
			fstp dword[esi+12] ;(x2-x3)
6510 IgorA 395
			fld dword[edi+16]
396
			fsub dword[edi+28]
6046 IgorA 397
			fstp dword[esi+16] ;(y2-y3)
6510 IgorA 398
			fld dword[edi+20]
399
			fsub dword[edi+32]
6046 IgorA 400
			fstp dword[esi+20] ;(z2-z3)
401
			;v3 <-> v1
6510 IgorA 402
			fld dword[edi+24]
403
			fsub dword[edi]
6046 IgorA 404
			fstp dword[esi+24] ;(x3-x1)
6510 IgorA 405
			fld dword[edi+28]
406
			fsub dword[edi+4]
6046 IgorA 407
			fstp dword[esi+28] ;(y3-y1)
6510 IgorA 408
			fld dword[edi+32]
409
			fsub dword[edi+8]
6046 IgorA 410
			fstp dword[esi+32] ;(z3-z1)
411
 
6510 IgorA 412
			;A = (y2-y1) * (z3-z1) - (z2-z1) * (y3-y1)
6046 IgorA 413
			fld dword[esi+4]
414
			fmul dword[esi+32]
6510 IgorA 415
			fld dword[esi+8]
416
			fmul dword[esi+28]
417
			fsubp
418
			fstp dword[eax] ;set normal.a
419
 
420
			;B = (z2-z1) * (x3-x1) - (x2-x1) * (z3-z1)
421
			fld dword[esi+8]
422
			fmul dword[esi+24]
6046 IgorA 423
			fld dword[esi]
424
			fmul dword[esi+32]
6510 IgorA 425
			fsubp
426
			fstp dword[eax+4] ;set normal.b
427
 
428
			;C = (x2-x1) * (y3-y1) - (y2-y1) * (x3-x1)
6046 IgorA 429
			fld dword[esi]
430
			fmul dword[esi+28]
6510 IgorA 431
			fld dword[esi+4]
432
			fmul dword[esi+24]
433
			fsubp
6046 IgorA 434
			fstp dword[eax+8] ;set normal.c
6513 IgorA 435
 
436
			stdcall V3_Norm,eax
437
 
6046 IgorA 438
			add edx,8 ;размер треугольника = (3 вершины (по 2б) + свойства (2б))
439
			add eax,12
440
			dec ebx
441
			jnz @b
6513 IgorA 442
 
443
		;нормали к вершинам
444
		mov ebx,[o_data]
6889 IgorA 445
		mov ecx,[ebx+obj_3d.poi_count]
446
		mov [ebx+obj_3d.normals_poi_count],ecx
6513 IgorA 447
		cmp ecx,0
448
		je .end
449
		imul ecx,12
450
		stdcall mem.Alloc,ecx
6889 IgorA 451
		mov [ebx+obj_3d.normals_poi_data],eax
6513 IgorA 452
 
453
		mov edi,eax
454
		mov eax,0.0
455
		shr ecx,2
456
		rep stosd ;очистка 0-ми float
457
 
6889 IgorA 458
		mov edx,[ebx+obj_3d.tri_count]
459
		mov edi,[ebx+obj_3d.tri_data]
460
		mov eax,[ebx+obj_3d.normals_tri_data]
461
		mov ecx,[ebx+obj_3d.poi_data]
462
		mov ebx,[ebx+obj_3d.normals_poi_data]
6513 IgorA 463
align 4
464
		.cycle_0: ;по граням
465
			movzx esi,word[edi] ;1-я вершина
466
			imul esi,12
467
			add esi,ecx
468
			push esi
469
			movzx esi,word[edi+2] ;2-я вершина
470
			imul esi,12
471
			add esi,ecx
472
			push esi
473
			movzx esi,word[edi+4] ;3-я вершина
474
			imul esi,12
475
			add esi,ecx
476
			push esi
477
 
478
			movzx esi,word[edi] ;1-я вершина
479
			imul esi,12
480
			add esi,ebx
481
			push esi
482
			movzx esi,word[edi+2] ;2-я вершина
483
			imul esi,12
484
			add esi,ebx
485
			push esi
486
			movzx esi,word[edi+4] ;3-я вершина
487
			imul esi,12
488
			add esi,ebx
489
			push esi
490
 
491
			stdcall poi_normal_add,eax
492
 
493
			add edi,8
494
			add eax,12
495
			dec edx
496
			jnz .cycle_0
497
		.cycle_0_end:
6046 IgorA 498
	.end:
499
popad
500
	ret
501
endp
502
 
6513 IgorA 503
;input:
504
; norm_tr - указатель на нормаль к грани
505
; n1, n2, n3 - указатели на нормали вершин
506
; c1, c2, c3 - указатели на координаты вершин
507
align 4
508
proc poi_normal_add uses eax ebx,\
509
	norm_tr:dword, n1:dword, n2:dword, n3:dword, c1:dword, c2:dword, c3:dword
510
 
511
	mov ebx,[norm_tr]
512
 
513
	mov eax,[n1]
514
	fld dword[eax]
515
	fadd dword[ebx]
516
	fstp dword[eax]
517
	fld dword[eax+4]
518
	fadd dword[ebx+4]
519
	fstp dword[eax+4]
520
	fld dword[eax+8]
521
	fadd dword[ebx+8]
522
	fstp dword[eax+8]
523
 
524
	mov eax,[n2]
525
	fld dword[eax]
526
	fadd dword[ebx]
527
	fstp dword[eax]
528
	fld dword[eax+4]
529
	fadd dword[ebx+4]
530
	fstp dword[eax+4]
531
	fld dword[eax+8]
532
	fadd dword[ebx+8]
533
	fstp dword[eax+8]
534
 
535
	mov eax,[n3]
536
	fld dword[eax]
537
	fadd dword[ebx]
538
	fstp dword[eax]
539
	fld dword[eax+4]
540
	fadd dword[ebx+4]
541
	fstp dword[eax+4]
542
	fld dword[eax+8]
543
	fadd dword[ebx+8]
544
	fstp dword[eax+8]
545
 
546
	ret
547
endp
548
 
549
;description:
550
; normalize vector
551
align 4
552
proc V3_Norm uses eax ebx, a:dword
553
	mov ebx,[a]
554
	fld dword[ebx]
555
	fmul st0,st0
556
	fld dword[ebx+4]
557
	fmul st0,st0
558
	faddp
559
	fld dword[ebx+8]
560
	fmul st0,st0
561
	faddp
562
	fsqrt ;st0 = sqrt(a.X^2 +a.Y^2 +a.Z^2)
563
	ftst
564
	fstsw ax
565
	sahf
566
	je .r1 ;if (sqrt(...)==0) return 1
567
		fld dword[ebx] ;offs_X = 0
568
		fdiv st0,st1
569
		fstp dword[ebx] ;a.X/=sqrt(...)
570
		fld dword[ebx+4]
571
		fdiv st0,st1
572
		fstp dword[ebx+4] ;a.Y/=sqrt(...)
573
		fld dword[ebx+8]
574
		fdiv st0,st1
575
		fstp dword[ebx+8] ;a.Z/=sqrt(...)
576
	.r1:
577
	ffree st0
578
	fincstp
579
	ret
580
endp
581
 
6060 IgorA 582
;настройка структуры 3d объекта
583
align 4
584
proc obj_init, o_data:dword
585
	pushad
586
	mov edi,[o_data]
587
	stdcall obj_clear_param, edi
588
	stdcall [tl_node_get_data],tree1
589
	xor edx,edx
590
	cmp eax,0
591
	je .no_points
592
		mov ebx,[eax] ;получаем значение сдвига выбранного блока
593
		add ebx,[open_file_data]
594
		xor ecx,ecx
595
		cmp word[ebx],CHUNK_OBJBLOCK
596
		jne @f
597
			mov ecx,ebx
598
			add ecx,dword[ecx+2] ;граница блока
599
			push eax edi
600
				mov edi,ebx
601
				add edi,6
602
				cld
603
				xor al,al
604
				repne scasb ;пропуск имени объекта
605
				mov ebx,edi
606
			pop edi eax
607
		@@:
608
		cmp word[ebx],CHUNK_TRIMESH
609
		jne @f
610
			mov ecx,ebx
611
			add ecx,dword[ecx+2] ;граница блока
612
			add ebx,6
613
		@@:
614
		cmp word[ebx],CHUNK_VERTLIST
615
		jne .no_points
616
			mov esi,ebx
617
			movzx edx,word[ebx+6] ;колличество точек
618
			add ebx,8
6889 IgorA 619
			mov [edi+obj_3d.poi_data],ebx
620
			mov [edi+obj_3d.poi_count],edx
6060 IgorA 621
 
622
			.cycle_0: ;цикл для поиска треугольников
623
				add esi,dword[esi+2]
624
				cmp word[esi],CHUNK_FACELIST
625
				je @f
626
					cmp ecx,esi
627
					jg .cycle_0 ;пока не достигнута грница старшего блока
628
					jmp .end_points ;если не нашли треугольники
629
			@@:
630
			;если нашли треугольники
631
			movzx edx,word[esi+6]
6889 IgorA 632
			mov [edi+obj_3d.tri_count],edx
6060 IgorA 633
			add esi,8 ;2+4+2 (chunk+size+count)
6889 IgorA 634
			mov [edi+obj_3d.tri_data],esi
6509 IgorA 635
 
636
			;поиск материалов граней
637
			shl edx,3
638
			add esi,edx
7610 IgorA 639
			cmp esi,ecx
640
			jge .end_points ;если нет блока с материалом
6509 IgorA 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 ;очистим буфер цвета и глубины
8083 IgorA 807
	call [glPushMatrix]
6046 IgorA 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]
7610 IgorA 828
		or eax,eax
829
		jnz .b_found
830
			stdcall [buf2d_draw_text], buf_ogl, buf_1,txt_mat_null,5,3,[color_select]
831
			jmp .mat_null ;если нет материала, рисуем все грани одним цветом
6509 IgorA 832
		.b_found:
833
			mov ebx,eax
834
			stdcall get_mat_color, eax
835
			stdcall draw_3d_faces_color, edi,ebx,eax
836
			stdcall found_mat_faces, ebx
7610 IgorA 837
			or eax,eax
838
			jnz .b_found
839
		jmp .end_points
840
 
6509 IgorA 841
	@@:
842
end if
843
 
6513 IgorA 844
	;рисование граней без цветов материалов
845
	bt dword[draw_mode],bit_faces
846
	jnc .end_triangles
7610 IgorA 847
	.mat_null:
6889 IgorA 848
	cmp dword[edi+obj_3d.tri_count],0
6513 IgorA 849
	je .end_triangles
6889 IgorA 850
	cmp dword[edi+obj_3d.poi_count],0
6513 IgorA 851
	je .end_triangles
852
		bt dword[draw_mode],bit_faces_fill
853
		jc @f
854
			push GL_LINE
855
			jmp .end_0
856
		@@:
857
			push GL_FILL
858
		.end_0:
859
		stdcall [glPolygonMode], GL_FRONT_AND_BACK ;mode - уже в стеке
860
		stdcall [glColor3ub],[color_face+2],[color_face+1],[color_face]
861
 
862
		bt dword[draw_mode],bit_smooth
863
		jnc .triangles_flat
864
		bt dword[draw_mode],bit_light
865
		jnc .triangles_flat
866
			;triangles smooth
867
			stdcall [glBegin],GL_TRIANGLES
6889 IgorA 868
			mov eax,[edi+obj_3d.tri_data]
869
			mov ecx,[edi+obj_3d.tri_count]
870
			mov edx,[edi+obj_3d.normals_tri_data]
6513 IgorA 871
align 4
872
			@@:
873
				movzx ebx,word[eax] ;1-я вершина
874
				imul ebx,12
6889 IgorA 875
					add ebx,[edi+obj_3d.normals_poi_data]
6513 IgorA 876
					stdcall [glNormal3fv], ebx
6889 IgorA 877
					sub ebx,[edi+obj_3d.normals_poi_data]
878
				add ebx,[edi+obj_3d.poi_data]
6513 IgorA 879
				stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
880
				movzx ebx,word[eax+2] ;2-я вершина
881
				imul ebx,12
6889 IgorA 882
					add ebx,[edi+obj_3d.normals_poi_data]
6513 IgorA 883
					stdcall [glNormal3fv], ebx
6889 IgorA 884
					sub ebx,[edi+obj_3d.normals_poi_data]
885
				add ebx,[edi+obj_3d.poi_data]
6513 IgorA 886
				stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
887
				movzx ebx,word[eax+4] ;3-я вершина
888
				imul ebx,12
6889 IgorA 889
					add ebx,[edi+obj_3d.normals_poi_data]
6513 IgorA 890
					stdcall [glNormal3fv], ebx
6889 IgorA 891
					sub ebx,[edi+obj_3d.normals_poi_data]
892
				add ebx,[edi+obj_3d.poi_data]
6513 IgorA 893
				stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
894
				add eax,8 ;размер треугольника = (3 вершины (по 2б) + свойства (2б))
895
				dec ecx
896
				jnz @b
897
			stdcall [glEnd]
898
			jmp .end_points
899
 
900
		.triangles_flat:
901
		stdcall [glBegin],GL_TRIANGLES
6889 IgorA 902
		mov eax,[edi+obj_3d.tri_data]
903
		mov ecx,[edi+obj_3d.tri_count]
904
		mov edx,[edi+obj_3d.normals_tri_data]
6513 IgorA 905
align 4
906
		@@:
907
			;
908
			bt dword[draw_mode],bit_light
909
			jnc .norm1
910
				stdcall [glNormal3fv], edx
911
				add edx,12
912
			.norm1:
913
			movzx ebx,word[eax] ;1-я вершина
914
			imul ebx,12
6889 IgorA 915
			add ebx,[edi+obj_3d.poi_data]
6513 IgorA 916
			stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
917
			movzx ebx,word[eax+2] ;2-я вершина
918
			imul ebx,12
6889 IgorA 919
			add ebx,[edi+obj_3d.poi_data]
6513 IgorA 920
			stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
921
			movzx ebx,word[eax+4] ;3-я вершина
922
			imul ebx,12
6889 IgorA 923
			add ebx,[edi+obj_3d.poi_data]
6513 IgorA 924
			stdcall [glVertex3f], [ebx],[ebx+4],[ebx+8]
925
			add eax,8 ;размер треугольника = (3 вершины (по 2б) + свойства (2б))
926
			dec ecx
927
			jnz @b
928
		stdcall [glEnd]
929
		jmp .end_points
930
	.end_triangles:
931
 
6046 IgorA 932
	;рисование точек
933
	bt dword[draw_mode],bit_vertexes
934
	jnc .end_points
935
		stdcall [glColor3ub],[color_vert+2],[color_vert+1],[color_vert]
936
		stdcall [glBegin],GL_POINTS
6889 IgorA 937
		mov eax,[edi+obj_3d.poi_data]
938
		mov ebx,[edi+obj_3d.poi_count]
939
		mov edx,[edi+obj_3d.normals_poi_data]
6513 IgorA 940
align 4
6046 IgorA 941
		@@:
6513 IgorA 942
			bt dword[draw_mode],bit_light
943
			jnc .norm0
7610 IgorA 944
			or edx,edx
945
			jz .norm0 ;если нормалей нет
6513 IgorA 946
				stdcall [glNormal3fv], edx
947
				add edx,12
948
			.norm0:
6046 IgorA 949
			stdcall [glVertex3f], [eax],[eax+4],[eax+8]
950
			add eax,12
951
			dec ebx
952
			jnz @b
953
		stdcall [glEnd]
954
	.end_points:
955
 
956
if version_edit eq 1
957
	;рисование активной точки
958
	stdcall [tl_node_get_data],tree3
959
	cmp eax,0
960
	je @f
961
		;выделение активной точки
962
		mov eax,[eax]
963
 
964
		stdcall [glBegin],GL_LINES
965
		stdcall [glColor3ub], [color_ox+2],[color_ox+1],[color_ox]
6889 IgorA 966
		stdcall [glVertex3f], [edi+obj_3d.x_min],[eax+4],[eax+8]
967
		stdcall [glVertex3f], [edi+obj_3d.x_max],[eax+4],[eax+8]
6046 IgorA 968
		stdcall [glColor3ub], [color_oy+2],[color_oy+1],[color_oy]
6889 IgorA 969
		stdcall [glVertex3f], [eax],[edi+obj_3d.y_min],[eax+8]
970
		stdcall [glVertex3f], [eax],[edi+obj_3d.y_max],[eax+8]
6046 IgorA 971
		stdcall [glColor3ub], [color_oz+2],[color_oz+1],[color_oz]
6889 IgorA 972
		stdcall [glVertex3f], [eax],[eax+4],[edi+obj_3d.z_min]
973
		stdcall [glVertex3f], [eax],[eax+4],[edi+obj_3d.z_max]
6046 IgorA 974
		stdcall [glEnd]
975
 
976
		stdcall [glColor3ub],[color_select+2],[color_select+1],[color_select]
8083 IgorA 977
		call [glPushMatrix]
6046 IgorA 978
			stdcall [glTranslatef], [eax],[eax+4],[eax+8]
979
			stdcall [gluSphere], [qObj], [sph_radius], 8,8
8083 IgorA 980
		call [glPopMatrix]
6046 IgorA 981
	@@:
982
 
983
	;рисование выделенных точек
984
	cmp dword[obj_poi_sel_c],0
985
	je .end_select
986
		mov ecx,dword[obj_poi_sel_c]
987
		stdcall [glColor3ub],[color_select+2],[color_select+1],[color_select]
7610 IgorA 988
		stdcall [tl_node_poi_get_info], tree3,0
6513 IgorA 989
align 4
6046 IgorA 990
		@@:
991
			cmp eax,0
992
			je .end_select
993
			mov ebx,eax
994
			cmp word[ebx],ID_ICON_POINT_SEL
995
			jne .next_sel
996
			stdcall [tl_node_poi_get_data], tree3,ebx
997
			mov eax,[eax]
8083 IgorA 998
			call [glPushMatrix]
6046 IgorA 999
				stdcall [glTranslatef], [eax],[eax+4],[eax+8]
1000
				stdcall [gluSphere], [qObj], [sph_radius], 4,4
8083 IgorA 1001
			call [glPopMatrix]
6046 IgorA 1002
			dec ecx
1003
			jz .end_select
1004
			.next_sel:
7610 IgorA 1005
			stdcall [tl_node_poi_get_next_info], tree3,ebx
6046 IgorA 1006
			jmp @b
1007
    .end_select:
1008
end if
1009
 
8083 IgorA 1010
	call [glPopMatrix]
6046 IgorA 1011
if version_edit eq 1
1012
	cmp dword[obj_poi_sel_c],0
1013
	je @f
1014
		stdcall [buf2d_draw_text], buf_ogl, buf_1,txt_select_vert,5,3,[color_select]
1015
	@@:
1016
end if
8083 IgorA 1017
	call [kosglSwapBuffers]
6046 IgorA 1018
	.end_f:
1019
	ret
1020
endp
1021
 
1022
align 4
1023
SetLight:
1024
	stdcall [glLightfv], GL_LIGHT0, GL_POSITION, light_position
1025
	stdcall [glLightfv], GL_LIGHT0, GL_SPOT_DIRECTION, light_dir
1026
 
1027
	stdcall [glLightfv], GL_LIGHT0, GL_DIFFUSE, white_light
1028
	stdcall [glLightfv], GL_LIGHT0, GL_SPECULAR, white_light
1029
 
1030
	stdcall [glEnable], GL_COLOR_MATERIAL
1031
	stdcall [glColorMaterial], GL_FRONT, GL_AMBIENT_AND_DIFFUSE
1032
	stdcall [glMaterialfv], GL_FRONT, GL_SPECULAR, mat_specular
1033
	stdcall [glMaterialf], GL_FRONT, GL_SHININESS, mat_shininess
1034
	stdcall [glLightModelfv], GL_LIGHT_MODEL_AMBIENT, lmodel_ambient
1035
 
1036
	stdcall [glEnable],GL_LIGHTING
1037
	stdcall [glEnable],GL_LIGHT0
1038
	ret
1039
 
6060 IgorA 1040
;включаем режим рисования вершин
6046 IgorA 1041
align 4
6060 IgorA 1042
mnu_vertexes_on:
1043
	or dword[draw_mode], 1 shl bit_vertexes
6509 IgorA 1044
	and dword[draw_mode], not ((1 shl bit_faces)+(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_edges_on:
1051
	or dword[draw_mode], 1 shl bit_faces
6509 IgorA 1052
	and dword[draw_mode], not ((1 shl bit_vertexes)+(1 shl bit_faces_fill)+(1 shl bit_faces_mat))
6060 IgorA 1053
	call update_obj
6046 IgorA 1054
	ret
1055
 
6060 IgorA 1056
;включаем режим рисования сплошных граней
6046 IgorA 1057
align 4
6060 IgorA 1058
mnu_faces_on:
1059
	or dword[draw_mode], (1 shl bit_faces)+(1 shl bit_faces_fill)
6509 IgorA 1060
	and dword[draw_mode], not ((1 shl bit_vertexes)+(1 shl bit_faces_mat))
6060 IgorA 1061
	call update_obj
6046 IgorA 1062
	ret
1063
 
1064
;включаем или отключаем освещение
1065
align 4
1066
mnu_light_on_off:
1067
	xor dword[draw_mode], 1 shl bit_light
6060 IgorA 1068
	call update_obj
6046 IgorA 1069
	ret
1070
 
1071
align 4
6513 IgorA 1072
mnu_smooth_on_off:
1073
	xor dword[draw_mode], 1 shl bit_smooth
1074
	call update_obj
1075
	ret
1076
 
1077
align 4
6046 IgorA 1078
mnu_reset_settings:
1079
	mov dword[angle_x],0.0
1080
	mov dword[angle_y],0.0
1081
	mov dword[angle_z],0.0
1082
	m2m dword[draw_mode],dword[def_dr_mode]
6060 IgorA 1083
	call update_obj
1084
	ret
1085
 
6889 IgorA 1086
align 4
1087
mnu_make_scrshot:
1088
	pushad
1089
	copy_path open_dialog_name,communication_area_default_path,file_name,0
1090
	mov [OpenDialog_data.type],1
7616 IgorA 1091
	stdcall [OpenDialog_Set_file_ext],OpenDialog_data,Filter.3 ;.png
6889 IgorA 1092
	stdcall [OpenDialog_Start],OpenDialog_data
7616 IgorA 1093
	cmp [OpenDialog_data.status],1
1094
	jne .end_save_file
6889 IgorA 1095
		;код при удачном открытии диалога
1096
		mov dword[png_data],0
1097
 
1098
		;create image struct
1099
		stdcall [img_create], [buf_ogl.w], [buf_ogl.h], Image.bpp24
1100
		mov ebx,eax
1101
		test eax,eax
1102
		jz @f
1103
			;copy foto to image buffer
1104
			mov edi,[eax+Image.Data]
1105
			mov esi,[buf_ogl]
1106
			mov ecx,[buf_ogl.w]
1107
			mov edx,[buf_ogl.h]
1108
			imul ecx,edx
1109
			imul ecx,3
1110
			shr ecx,2 ;OpenGL buffer align to 4
1111
			rep movsd
1112
 
1113
			;encode image
1114
			stdcall [img_encode], eax, LIBIMG_FORMAT_PNG, 0
1115
			test eax,eax
1116
			jz @f
1117
				mov [png_data],eax
1118
				mov [png_size],ecx
1119
		@@:
1120
		stdcall [img_destroy],ebx
1121
 
1122
        ; заполняем структуру для сохранения файла
1123
        mov ebx,run_file_70
1124
        mov dword[ebx],SSF_CREATE_FILE
1125
        mov eax,[png_size]
1126
        mov [ebx+12],eax ;file size
1127
        mov eax,[png_data]
1128
        mov [ebx+16],eax
1129
        mov dword[ebx+FileInfoBlock.FileName], openfile_path
1130
 
1131
        mcall SF_FILE,run_file_70
1132
        test eax,eax
1133
        jnz .save_error
1134
			;notify_window_run openfile_path
1135
			jmp @f
1136
		.save_error:
1137
			;сообщение о неудачном сохранении
1138
			notify_window_run txt_err_save_img_file
1139
		@@:
1140
		mcall SF_SYS_MISC, SSF_MEM_FREE, [png_data]
1141
	.end_save_file:
1142
	popad
1143
	ret
1144
 
6060 IgorA 1145
if version_edit eq 1
1146
 
1147
align 4
1148
update_obj:
6046 IgorA 1149
	stdcall draw_3d, o3d
1150
	ret
1151
 
6060 IgorA 1152
else
1153
 
6509 IgorA 1154
;включаем режим рисования сплошных граней
6046 IgorA 1155
align 4
6509 IgorA 1156
mnu_faces_mat:
1157
	or dword[draw_mode], (1 shl bit_faces_mat)
1158
	call update_obj
1159
	ret
1160
 
1161
align 4
6060 IgorA 1162
update_obj:
6081 IgorA 1163
push eax ebx
6060 IgorA 1164
	stdcall [tl_node_get_data],tree1
1165
	cmp eax,0
1166
	je @f
6081 IgorA 1167
		mov ebx,dword[eax] ;получаем значение сдвига выбранного блока относительно начала файла
1168
		add ebx,dword[open_file_data] ;получаем значение сдвига в памяти
1169
		cmp word[ebx],CHUNK_OBJBLOCK
1170
		jne @f
6509 IgorA 1171
			add eax,list_offs_obj3d
1172
			stdcall draw_3d,eax
6060 IgorA 1173
	@@:
6081 IgorA 1174
pop ebx eax
6060 IgorA 1175
	ret
1176
 
6509 IgorA 1177
;input:
1178
; p_mat - указатель на данные предыдущего материала
1179
align 4
1180
proc found_mat_faces uses ebx, p_mat:dword
1181
	mov eax,[p_mat]
7610 IgorA 1182
	or eax,eax
1183
	jz @f
6509 IgorA 1184
	add eax,[eax+2]
1185
	cmp word[eax],CHUNK_FACEMAT
1186
	je @f
1187
		xor eax,eax
1188
	@@:
1189
	ret
1190
endp
1191
 
1192
align 4
1193
proc get_mat_color uses ebx ecx edx edi esi, p_mat:dword
1194
	stdcall [tl_node_poi_get_info], tree1,0
1195
	mov ecx,eax
1196
	.cycle_0:
1197
		cmp ecx,0
1198
		je .cycle_0_end
1199
			stdcall [tl_node_poi_get_data], tree1,ecx
1200
			mov ebx,[eax] ;получаем значение сдвига выбранного блока
1201
			add ebx,[open_file_data]
1202
			cmp word[ebx],CHUNK_MATERIAL
1203
			jne .end_add_p3
1204
			add eax,list_offs_obj3d
6889 IgorA 1205
			mov esi,[eax+material.name]
6509 IgorA 1206
			cmp esi,0
1207
			jne @f
1208
				;init material
1209
				stdcall mat_init,eax,ebx
6889 IgorA 1210
				mov esi,[eax+material.name]
6509 IgorA 1211
			@@:
1212
			mov edi,[p_mat]
1213
			mov eax,5
1214
			add edi,eax
1215
align 4
1216
			@@:
1217
				cmp al,0
1218
				je .found
1219
				lodsb
1220
				inc edi
1221
				cmp byte[edi],al
1222
				je @b
1223
		.end_add_p3:
1224
		stdcall [tl_node_poi_get_next_info], tree1,ecx
1225
		mov ecx,eax ;переходим к следущему узлу
1226
		jmp .cycle_0
1227
	.cycle_0_end:
1228
 
1229
	.no_found:
1230
		xor eax,eax
1231
		jmp .end_f
1232
	.found:
1233
		stdcall [tl_node_poi_get_data], tree1,ecx
1234
		add eax,list_offs_obj3d
6889 IgorA 1235
		mov eax,[eax+material.col_diffuse]
6509 IgorA 1236
	.end_f:
1237
	ret
1238
endp
1239
 
1240
align 4
1241
proc draw_3d_faces_color o_data:dword, p_mat:dword, color:dword
1242
pushad
1243
	stdcall [glPolygonMode], GL_FRONT_AND_BACK,GL_FILL
1244
	stdcall [glColor3ub],[color+2],[color+1],[color]
1245
	stdcall [glBegin],GL_TRIANGLES
1246
	mov edi,[o_data]
1247
	mov esi,[p_mat]
1248
	add esi,6
1249
	@@:
1250
		lodsb
1251
		cmp al,0
1252
		jne @b
1253
	movzx ecx,word[esi] ;ecx - число граней с данным материалом
6889 IgorA 1254
	mov edx,[edi+obj_3d.poi_data]
6513 IgorA 1255
 
1256
	bt dword[draw_mode],bit_smooth
1257
	jnc @f
1258
	bt dword[draw_mode],bit_light
1259
	jnc @f
6509 IgorA 1260
align 4
6513 IgorA 1261
	.cycle_0:
1262
		add esi,2
1263
		;word[esi] - номер треугольника
1264
		movzx ebx,word[esi]
1265
 
1266
		shl ebx,3
6889 IgorA 1267
		add ebx,[edi+obj_3d.tri_data]
6513 IgorA 1268
 
1269
		movzx eax,word[ebx] ;1-я вершина
1270
		imul eax,12 ;float(x,y,z)
6889 IgorA 1271
			add eax,[edi+obj_3d.normals_poi_data]
6513 IgorA 1272
			stdcall [glNormal3fv], eax
6889 IgorA 1273
			sub eax,[edi+obj_3d.normals_poi_data]
6513 IgorA 1274
		add eax,edx
1275
		stdcall [glVertex3f], [eax],[eax+4],[eax+8]
1276
 
1277
		movzx eax,word[ebx+2] ;2-я вершина
1278
		imul eax,12 ;float(x,y,z)
6889 IgorA 1279
			add eax,[edi+obj_3d.normals_poi_data]
6513 IgorA 1280
			stdcall [glNormal3fv], eax
6889 IgorA 1281
			sub eax,[edi+obj_3d.normals_poi_data]
6513 IgorA 1282
		add eax,edx
1283
		stdcall [glVertex3f], [eax],[eax+4],[eax+8]
1284
 
1285
		movzx eax,word[ebx+4] ;3-я вершина
1286
		imul eax,12 ;float(x,y,z)
6889 IgorA 1287
			add eax,[edi+obj_3d.normals_poi_data]
6513 IgorA 1288
			stdcall [glNormal3fv], eax
6889 IgorA 1289
			sub eax,[edi+obj_3d.normals_poi_data]
6513 IgorA 1290
		add eax,edx
1291
		stdcall [glVertex3f], [eax],[eax+4],[eax+8]
1292
 
1293
		dec ecx
1294
		jnz .cycle_0
1295
	stdcall [glEnd]
1296
	jmp .end_f
1297
 
1298
align 4
6509 IgorA 1299
	@@:
1300
		add esi,2
1301
		;word[esi] - номер треугольника
1302
		movzx ebx,word[esi]
6510 IgorA 1303
		;нормали для освещения
1304
		bt dword[draw_mode],bit_light
1305
		jnc .norm
1306
			mov eax,ebx
1307
			imul eax,12
6889 IgorA 1308
			add eax,[edi+obj_3d.normals_tri_data]
6510 IgorA 1309
			stdcall [glNormal3fv], eax
1310
		.norm:
1311
 
6509 IgorA 1312
		shl ebx,3
6889 IgorA 1313
		add ebx,[edi+obj_3d.tri_data]
6509 IgorA 1314
 
1315
		movzx eax,word[ebx] ;1-я вершина
1316
		imul eax,12 ;float(x,y,z)
1317
		add eax,edx
1318
		stdcall [glVertex3f], [eax],[eax+4],[eax+8]
1319
 
1320
		movzx eax,word[ebx+2] ;2-я вершина
1321
		imul eax,12 ;float(x,y,z)
1322
		add eax,edx
1323
		stdcall [glVertex3f], [eax],[eax+4],[eax+8]
1324
 
1325
		movzx eax,word[ebx+4] ;3-я вершина
1326
		imul eax,12 ;float(x,y,z)
1327
		add eax,edx
1328
		stdcall [glVertex3f], [eax],[eax+4],[eax+8]
1329
 
1330
		dec ecx
1331
		jnz @b
1332
	stdcall [glEnd]
1333
 
1334
.end_f:
1335
popad
1336
	ret
1337
endp
1338
 
6060 IgorA 1339
end if
1340
 
1341
align 4
6046 IgorA 1342
draw_mode dd 0 ;режим рисования объекта
1343
def_dr_mode dd 0 ;режим рисования по умолчанию
1344
delt_size dd 3.0 ;изменение углов при поворотах с кливиатуры
1345
mouse_drag dd 0 ;режим поворота сцены от перемещении курсора мыши
1346
mouse_x dd 0
1347
mouse_y dd 0
1348
sph_radius dd 0 ;радиус сферы для выделения активной точки
1349