Subversion Repositories Kolibri OS

Rev

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

Rev Author Line No. Line
5388 IgorA 1
;
2
; Функции нужные для отображения воксельного объекта через библиотеку tinygl
3
;
4
 
5393 IgorA 5
normal_gran_z1 equ -1.0
6
normal_gran_z0 equ  1.0
7
normal_gran_y1 equ -1.0
8
normal_gran_y0 equ  1.0
9
normal_gran_x1 equ -1.0
10
normal_gran_x0 equ  1.0
11
 
5388 IgorA 12
;марос коректировки вектора нормали для закругления крайних вокселей
13
macro normal_gran param, gran
14
{
15
    mov dword[param],0.0
16
    bt dword[edi+vox_ogl_planes],vox_ogl_gran_#gran
17
    jnc @f
18
        mov dword[param],normal_gran_#gran
19
    @@:
20
}
21
 
22
;марос коректировки вектора нормали для диагонального сглаживания вокселей
23
;диагональные воксели после этого сглаживания смотрятся не степеньками а сплошной плоскостью
24
macro normal_gran_2 param, gran2, gran1
25
{
26
    bt dword[edi+vox_ogl_planes],vox_ogl_gran_#gran2
27
    jnc @f
28
        mov dword[param],normal_gran_#gran1 ;поставить 0.0 в dword[param] если нужно не сильное сглаживание
29
    @@:
30
}
31
 
32
vox_ogl_x0 equ 0
33
vox_ogl_y0 equ 4
34
vox_ogl_z0 equ 8
35
vox_ogl_x1 equ 12
36
vox_ogl_y1 equ 16
37
vox_ogl_z1 equ 20
38
vox_ogl_color equ 24
39
vox_ogl_zoom equ 28
40
vox_ogl_planes equ 30
41
vox_ogl_size equ 34
42
 
43
def_del_planes equ 63
44
 
45
;номера битов, которые указывают на то какие есть соседние воксели
46
;нужно для отсечения внутренних граней между соседними вокселями
47
;а еще нужно для задания векторов нормалей, что-бы воксели были сглаженными (закругленными)
48
vox_ogl_gran_z1 equ 1
49
vox_ogl_gran_z0 equ 0
50
vox_ogl_gran_y1 equ 3
51
vox_ogl_gran_y0 equ 2
52
vox_ogl_gran_x1 equ 5
53
vox_ogl_gran_x0 equ 4
54
vox_ogl_gran_y1z1 equ 7
55
vox_ogl_gran_y0z0 equ 6
56
vox_ogl_gran_x1z1 equ 9
57
vox_ogl_gran_x0z0 equ 8
58
vox_ogl_gran_y0z1 equ 11
59
vox_ogl_gran_y1z0 equ 10
60
vox_ogl_gran_x0z1 equ 13
61
vox_ogl_gran_x1z0 equ 12
62
vox_ogl_gran_x1y1 equ 15
63
vox_ogl_gran_x0y0 equ 14
64
vox_ogl_gran_x0y1 equ 17
65
vox_ogl_gran_x1y0 equ 16
66
 
67
 
68
vox_offs_tree_table equ 4
69
vox_offs_data equ 12
70
 
71
 
72
;description:
73
; создание воксельного объекта для показа в 3d графике
74
;input:
75
align 4
76
proc buf_vox_obj_create_3d, v_obj:dword, p_mem:dword, coord_x:dword,\
77
coord_y:dword, k_scale:dword
78
	cmp [k_scale],0
79
	jl .end_f
80
pushad
81
	mov edi,[p_mem]
82
    mov dword[edi],0 ;count voxels
83
 
84
	mov ecx,[k_scale]
85
	mov ebx,[coord_x]
86
	mov edx,[coord_y]
87
	mov edi,[v_obj]
88
	add edi,vox_offs_data
89
	xor esi,esi
90
	stdcall create_sub_vox_obj_3d, [v_obj],[p_mem],[k_scale]
91
 
92
    ; (1)
93
    ; сортировка вокселей по координатам x,y,z
94
    ;
95
    mov edi,[p_mem]
96
    mov ecx,dword[edi]
97
    ;inc ecx
98
    add edi,4
99
    sub edi,vox_ogl_size
100
    stdcall pole_fl_sort, edi, ecx
101
 
102
    ;отсечение соседних граней для ускорения отрисовки
103
    mov edi,[p_mem]
104
    mov ecx,dword[edi]
105
    dec ecx
106
    add edi,4
107
 
108
align 4
109
    .cycle_0:
110
        mov ax,word[edi+vox_ogl_zoom]
111
        cmp ax,word[edi+vox_ogl_size+vox_ogl_zoom]
112
        jne @f
113
        mov eax,dword[edi+vox_ogl_x0]
114
        cmp eax,dword[edi+vox_ogl_size+vox_ogl_x0]
115
        jne @f
116
        mov eax,dword[edi+vox_ogl_y0]
117
        cmp eax,dword[edi+vox_ogl_size+vox_ogl_y0]
118
        jne @f
119
        mov eax,dword[edi+vox_ogl_z0]
120
        inc eax ;увеличиваем высоту, для будущего сравнения
121
        cmp eax,dword[edi+vox_ogl_size+vox_ogl_z0]
122
        jne @f
123
        ;если по высоте воксели различается на 1 координату, то соседние высоту и низ отсекаем
124
        btr dword[edi+vox_ogl_planes],vox_ogl_gran_z1 ;верх отсекаем
125
        btr dword[edi+vox_ogl_size+vox_ogl_planes],vox_ogl_gran_z0 ;низ отсекаем
126
    @@:
127
        add edi,vox_ogl_size
128
        loop .cycle_0
129
 
130
push ebx edx esi
131
    ;диагональные соседние воксели
132
    mov edi,[p_mem]
133
    mov ecx,dword[edi]
134
    dec ecx
135
    add edi,4
136
 
137
    mov ebx,ecx
138
    ;inc ebx ;??? cmp esi,ebx -> jge @f
139
    imul ebx,vox_ogl_size
140
    add ebx,edi
141
 
142
align 4
143
    .cycle_3:
144
        mov dx,word[edi+vox_ogl_zoom]
145
        mov esi,edi
146
align 4
147
        .cycle_4:
148
        add esi,vox_ogl_size
149
        cmp esi,ebx
150
        jg @f
151
        cmp dx,word[esi+vox_ogl_zoom]
152
        jne .cycle_4
153
 
154
        mov eax,dword[edi+vox_ogl_x0]
155
        cmp eax,dword[esi+vox_ogl_x0]
156
        jne @f
157
        mov eax,dword[edi+vox_ogl_y0]
158
        inc eax ; y+
159
        cmp eax,dword[esi+vox_ogl_y0]
160
        jl @f
161
        jne .cycle_4
162
        mov eax,dword[edi+vox_ogl_z0]
163
        inc eax ; z+
164
        cmp eax,dword[esi+vox_ogl_z0]
165
        jne .cycle_4
166
        ;если по высоте воксели различается на 1 координату
167
        bts dword[edi+vox_ogl_planes],vox_ogl_gran_y1z1 ;
168
        bts dword[esi+vox_ogl_planes],vox_ogl_gran_y0z0 ;
169
    @@:
170
        add edi,vox_ogl_size
171
        loop .cycle_3
172
 
173
; ***
174
    mov edi,[p_mem]
175
    mov ecx,dword[edi]
176
    dec ecx
177
    add edi,4
178
 
179
align 4
180
    .cycle_7:
181
        mov dx,word[edi+vox_ogl_zoom]
182
        mov esi,edi
183
align 4
184
        .cycle_8:
185
        add esi,vox_ogl_size
186
        cmp esi,ebx
187
        jg @f
188
        cmp dx,word[esi+vox_ogl_zoom]
189
        jne .cycle_8
190
 
191
        mov eax,dword[edi+vox_ogl_x0]
192
        cmp eax,dword[esi+vox_ogl_x0]
193
        jne @f
194
        mov eax,dword[edi+vox_ogl_y0]
195
        inc eax ; y+
196
        cmp eax,dword[esi+vox_ogl_y0]
197
        jl @f
198
        jne .cycle_8
199
        mov eax,dword[edi+vox_ogl_z0]
200
        dec eax ; z-
201
        cmp eax,dword[esi+vox_ogl_z0]
202
        jne .cycle_8
203
        ;если по высоте воксели различается на 1 координату
204
        bts dword[edi+vox_ogl_planes],vox_ogl_gran_y1z0 ;
205
        bts dword[esi+vox_ogl_planes],vox_ogl_gran_y0z1 ;
206
    @@:
207
        add edi,vox_ogl_size
208
        loop .cycle_7
209
pop esi edx ebx
210
 
211
    ; (2)
212
    ; сортировка вокселей по координатам x,z,y
213
    ;
214
    mov edi,[p_mem]
215
    mov ecx,dword[edi]
216
    add edi,4
217
    sub edi,vox_ogl_size
218
    stdcall pole_fl_sort_zxy, edi, ecx
219
 
220
    ;отсечение соседних граней для ускорения отрисовки
221
    mov edi,[p_mem]
222
    mov ecx,dword[edi]
223
    dec ecx
224
    add edi,4
225
 
226
align 4
227
    .cycle_1:
228
        mov ax,word[edi+vox_ogl_zoom]
229
        cmp ax,word[edi+vox_ogl_size+vox_ogl_zoom]
230
        jne @f
231
        mov eax,dword[edi+vox_ogl_z0]
232
        cmp eax,dword[edi+vox_ogl_size+vox_ogl_z0]
233
        jne @f
234
        mov eax,dword[edi+vox_ogl_x0]
235
        cmp eax,dword[edi+vox_ogl_size+vox_ogl_x0]
236
        jne @f
237
        mov eax,dword[edi+vox_ogl_y0]
238
        inc eax ;увеличиваем высоту, для будущего сравнения
239
        cmp eax,dword[edi+vox_ogl_size+vox_ogl_y0]
240
        jne @f
241
        ;если по высоте воксели различается на 1 координату, то соседние высоту и низ отсекаем
242
        btr dword[edi+vox_ogl_planes],vox_ogl_gran_y1 ;верх отсекаем
243
        btr dword[edi+vox_ogl_size+vox_ogl_planes],vox_ogl_gran_y0 ;низ отсекаем
244
    @@:
245
        add edi,vox_ogl_size
246
        loop .cycle_1
247
 
248
push ebx edx esi
249
    ;диагональные соседние воксели
250
    mov edi,[p_mem]
251
    mov ecx,dword[edi]
252
    dec ecx
253
    add edi,4
254
 
255
    mov ebx,ecx
256
    ;inc ebx ;??? cmp esi,ebx -> jge @f
257
    imul ebx,vox_ogl_size
258
    add ebx,edi
259
 
260
align 4
261
    .cycle_11:
262
        mov dx,word[edi+vox_ogl_zoom]
263
        mov esi,edi
264
align 4
265
        .cycle_12:
266
        add esi,vox_ogl_size
267
        cmp esi,ebx
268
        jg @f
269
        cmp dx,word[esi+vox_ogl_zoom]
270
        jne .cycle_12
271
 
272
        mov eax,dword[edi+vox_ogl_z0]
273
        cmp eax,dword[esi+vox_ogl_z0]
274
        jne @f
275
        mov eax,dword[edi+vox_ogl_x0]
276
        inc eax ; x+
277
        cmp eax,dword[esi+vox_ogl_x0]
278
        jl @f
279
        jne .cycle_12
280
        mov eax,dword[edi+vox_ogl_y0]
281
        inc eax ; y+
282
        cmp eax,dword[esi+vox_ogl_y0]
283
        jne .cycle_12
284
        ;если по высоте воксели различается на 1 координату
285
        bts dword[edi+vox_ogl_planes],vox_ogl_gran_x1y1 ;
286
        bts dword[esi+vox_ogl_planes],vox_ogl_gran_x0y0 ;
287
    @@:
288
        add edi,vox_ogl_size
289
        loop .cycle_11
290
 
291
; ***
292
    mov edi,[p_mem]
293
    mov ecx,dword[edi]
294
    dec ecx
295
    add edi,4
296
 
297
align 4
298
    .cycle_15:
299
        mov dx,word[edi+vox_ogl_zoom]
300
        mov esi,edi
301
align 4
302
        .cycle_16:
303
        add esi,vox_ogl_size
304
        cmp esi,ebx
305
        jg @f
306
        cmp dx,word[esi+vox_ogl_zoom]
307
        jne .cycle_16
308
 
309
        mov eax,dword[edi+vox_ogl_z0]
310
        cmp eax,dword[esi+vox_ogl_z0]
311
        jne @f
312
        mov eax,dword[edi+vox_ogl_x0]
313
        inc eax ; x+
314
        cmp eax,dword[esi+vox_ogl_x0]
315
        jl @f
316
        jne .cycle_16
317
        mov eax,dword[edi+vox_ogl_y0]
318
        dec eax ; y-
319
        cmp eax,dword[esi+vox_ogl_y0]
320
        jne .cycle_16
321
        ;если по высоте воксели различается на 1 координату
322
        bts dword[edi+vox_ogl_planes],vox_ogl_gran_x1y0 ;
323
        bts dword[esi+vox_ogl_planes],vox_ogl_gran_x0y1 ;
324
    @@:
325
        add edi,vox_ogl_size
326
        loop .cycle_15
327
 
328
pop esi edx ebx
329
 
330
    ; (3)
331
    ; сортировка вокселей по координатам y,z,x
332
    ;
333
    mov edi,[p_mem]
334
    mov ecx,dword[edi]
335
    add edi,4
336
    sub edi,vox_ogl_size
337
    stdcall pole_fl_sort_yzx, edi, ecx
338
 
339
    ;отсечение соседних граней для ускорения отрисовки
340
    mov edi,[p_mem]
341
    mov ecx,dword[edi]
342
    dec ecx
343
    add edi,4
344
 
345
align 4
346
    .cycle_2:
347
        mov ax,word[edi+vox_ogl_zoom]
348
        cmp ax,word[edi+vox_ogl_size+vox_ogl_zoom]
349
        jne @f
350
        mov eax,dword[edi+vox_ogl_y0]
351
        cmp eax,dword[edi+vox_ogl_size+vox_ogl_y0]
352
        jne @f
353
        mov eax,dword[edi+vox_ogl_z0]
354
        cmp eax,dword[edi+vox_ogl_size+vox_ogl_z0]
355
        jne @f
356
        mov eax,dword[edi+vox_ogl_x0]
357
        inc eax ;увеличиваем высоту, для будущего сравнения
358
        cmp eax,dword[edi+vox_ogl_size+vox_ogl_x0]
359
        jne @f
360
        ;если по высоте воксели различается на 1 координату, то соседние высоту и низ отсекаем
361
        btr dword[edi+vox_ogl_planes],vox_ogl_gran_x1 ;верх отсекаем
362
        btr dword[edi+vox_ogl_size+vox_ogl_planes],vox_ogl_gran_x0 ;низ отсекаем
363
    @@:
364
        add edi,vox_ogl_size
365
        loop .cycle_2
366
 
367
push ebx edx esi
368
    ;диагональные соседние воксели
369
    mov edi,[p_mem]
370
    mov ecx,dword[edi]
371
    dec ecx
372
    add edi,4
373
 
374
    mov ebx,ecx
375
    ;inc ebx ;??? cmp esi,ebx -> jge @f
376
    imul ebx,vox_ogl_size
377
    add ebx,edi
378
 
379
align 4
380
    .cycle_5:
381
        mov dx,word[edi+vox_ogl_zoom]
382
        mov esi,edi
383
align 4
384
        .cycle_6:
385
        add esi,vox_ogl_size
386
        cmp esi,ebx
387
        jg @f
388
        cmp dx,word[esi+vox_ogl_zoom]
389
        jne .cycle_6
390
 
391
        mov eax,dword[edi+vox_ogl_y0]
392
        cmp eax,dword[esi+vox_ogl_y0]
393
        jne @f
394
        mov eax,dword[edi+vox_ogl_z0]
395
        inc eax ; z+
396
        cmp eax,dword[esi+vox_ogl_z0]
397
        jl @f
398
        jne .cycle_6
399
        mov eax,dword[edi+vox_ogl_x0]
400
        inc eax ; x+
401
        cmp eax,dword[esi+vox_ogl_x0]
402
        jne .cycle_6
403
        ;если по высоте воксели различается на 1 координату
404
        bts dword[edi+vox_ogl_planes],vox_ogl_gran_x1z1 ;
405
        bts dword[esi+vox_ogl_planes],vox_ogl_gran_x0z0 ;
406
    @@:
407
        add edi,vox_ogl_size
408
        loop .cycle_5
409
 
410
; ***
411
    mov edi,[p_mem]
412
    mov ecx,dword[edi]
413
    dec ecx
414
    add edi,4
415
 
416
align 4
417
    .cycle_9:
418
        mov dx,word[edi+vox_ogl_zoom]
419
        mov esi,edi
420
align 4
421
        .cycle_10:
422
        add esi,vox_ogl_size
423
        cmp esi,ebx
424
        jg @f
425
        cmp dx,word[esi+vox_ogl_zoom]
426
        jne .cycle_10
427
 
428
        mov eax,dword[edi+vox_ogl_y0]
429
        cmp eax,dword[esi+vox_ogl_y0]
430
        jne @f
431
        mov eax,dword[edi+vox_ogl_z0]
432
        inc eax ; z+
433
        cmp eax,dword[esi+vox_ogl_z0]
434
        jl @f
435
        jne .cycle_10
436
        mov eax,dword[edi+vox_ogl_x0]
437
        dec eax ; x-
438
        cmp eax,dword[esi+vox_ogl_x0]
439
        jne .cycle_10
440
        ;если по высоте воксели различается на 1 координату
441
        bts dword[edi+vox_ogl_planes],vox_ogl_gran_x0z1 ;
442
        bts dword[esi+vox_ogl_planes],vox_ogl_gran_x1z0 ;
443
    @@:
444
        add edi,vox_ogl_size
445
        loop .cycle_9
446
 
447
pop esi edx ebx
448
 
449
    ;преобразование координат во float
450
    stdcall vox_obj_3d_recalc, [p_mem]
451
popad
452
	.end_f:
453
	ret
454
endp
455
 
456
;input:
457
; ebx - coord_x
458
; edx - coord_y
459
; esi - coord_z
460
; ecx - уровень текушего узла 
461
; edi - указатель на данные воксельного объекта
462
align 4
463
proc create_sub_vox_obj_3d, v_obj:dword, p_mem:dword, k_scale:dword
464
	cmp byte[edi+3],0 ;смотрим есть ли поддеревья
465
	je .sub_trees
466
 
467
		;добавляем узел, который содержит дочерние узлы, при этом дочерние мелкие и не попадают на вывод
468
		cmp ecx,0
469
		jne @f
470
			push ecx
471
                mov eax,[p_mem]
472
                inc dword[eax] ;увеличиваем счетчик вокселей на 1
473
                mov eax,[eax]
474
                imul eax,vox_ogl_size ;умножаем на размер данных о вокселе
475
                add eax,4-vox_ogl_size ;число вокселей 4 байта
476
                add eax,[p_mem]
477
                mov [eax+vox_ogl_x0],ebx
478
                mov [eax+vox_ogl_y0],edx
479
                mov [eax+vox_ogl_z0],esi
480
                sub ecx,[k_scale]
481
                mov word[eax+vox_ogl_zoom],cx
482
                mov dword[eax+vox_ogl_planes],def_del_planes
483
				mov ecx,dword[edi]
484
				and ecx,0xffffff
485
                mov [eax+vox_ogl_color],ecx
486
			pop ecx
487
		@@:
488
 
489
		;рекурсивный перебор поддеревьев
490
		push edx
491
		;вход внутрь узла
492
		dec ecx
493
 
494
		mov eax,1
495
		cmp ecx,1
496
		jl @f
497
			shl eax,cl
498
		@@:
499
 
500
		add edx,eax ;коректировка высоты под воксель нижнего уровня
501
 
502
		mov ah,byte[edi+3]
503
		add edi,4
504
		mov al,8
505
		.cycle:
506
			bt ax,8 ;тестируем только ah
507
			jnc .c_next
508
				push eax ebx edx esi
509
				stdcall vox_corect_coords_pl, [v_obj],1
510
				stdcall create_sub_vox_obj_3d, [v_obj], [p_mem],[k_scale]
511
				pop esi edx ebx eax
512
			.c_next:
513
			shr ah,1
514
			dec al
515
			jnz .cycle
516
		;выход из узла
517
		inc ecx
518
		pop edx
519
		jmp .end_f
520
	.sub_trees:
521
		cmp ecx,0
522
		jl .end_0 ;не рисуем очень маленькие воксели
523
 
524
			;cmp ecx,1
525
			;jl @f
526
				;квадрат больше текущего масштаба
527
				;stdcall vox_draw_square_1g, [buf_i],[buf_z],eax
528
				;jmp .end_0
529
			;@@:
530
				;квадрат текущего масштаба
531
				push ecx
532
                mov eax,[p_mem]
533
                inc dword[eax] ;увеличиваем счетчик вокселей на 1
534
                mov eax,[eax]
535
                imul eax,vox_ogl_size ;умножаем на размер данных о вокселе
536
                add eax,4-vox_ogl_size ;число вокселей 4 байта
537
                add eax,[p_mem]
538
                mov [eax+vox_ogl_x0],ebx
539
                mov [eax+vox_ogl_y0],edx
540
                mov [eax+vox_ogl_z0],esi
541
                cmp ecx,1
542
                jl @f
543
                    ;квадрат больше текущего масштаба
544
                    shr dword[eax+vox_ogl_x0],cl
545
                    shr dword[eax+vox_ogl_y0],cl
546
                    shr dword[eax+vox_ogl_z0],cl
547
                @@:
548
                sub ecx,[k_scale]
549
                mov word[eax+vox_ogl_zoom],cx
550
                mov dword[eax+vox_ogl_planes],def_del_planes
551
				mov ecx,dword[edi]
552
				and ecx,0xffffff
553
                mov [eax+vox_ogl_color],ecx
554
				pop ecx
555
		.end_0:
556
		add edi,4
557
	.end_f:
558
	ret
559
endp
560
 
561
;description:
562
; в OpenGL требуются координаты float
563
; преобразование координат из int во float,
564
align 4
565
proc vox_obj_3d_recalc uses eax ebx ecx, p_mem:dword
566
 
567
;получаем координаты в пределах от 0 до 1 в дробном виде
568
	mov eax,[p_mem]
569
	mov ecx,dword[eax]
570
	add eax,4
571
 
572
	finit
573
align 4
574
	@@:
575
		fild word[eax+vox_ogl_zoom]
576
		fld1 ; размер кубической грани без учета масштаба
577
		fscale ; st0=1*2^st1 или размер кубической грани с учетом масштаба
578
		fxch
579
 
580
		;coord x
581
		fild dword[eax+vox_ogl_x0]
582
		fscale
583
		fst dword[eax+vox_ogl_x0]
5393 IgorA 584
		fadd st0,st2 ;добавляем ко второй точке размер масштабированной кубической грани
5388 IgorA 585
		fstp dword[eax+vox_ogl_x1]
586
		;coord y
587
		fild dword[eax+vox_ogl_y0]
588
		fscale
589
		fst dword[eax+vox_ogl_y0]
590
		fadd st0,st2
591
		fstp dword[eax+vox_ogl_y1]
592
		;coord z
593
		fild dword[eax+vox_ogl_z0]
594
		fscale
595
		fst dword[eax+vox_ogl_z0]
596
		fadd st0,st2
597
		fstp dword[eax+vox_ogl_z1]
598
 
599
		;goto next voxel
600
		add eax,vox_ogl_size
601
		ffree st0
602
		fincstp
603
		ffree st0
604
		fincstp
605
		loop @b
606
 
607
;отнимаем от каждой координаты по 0.5 для центровки объекта по центру экрана
608
	mov eax,[p_mem]
609
	mov ecx,dword[eax]
610
	add eax,4
611
	fld1 ;st0=1
612
	fchs ;st0=-1
613
	fld1 ;st0=1 st1=-1
614
	fscale ;st0=1*2^st1 или 1*2^-1=1/2=0.5
615
align 4
616
	@@:
617
		;coord x
618
		fld dword[eax+vox_ogl_x0]
5393 IgorA 619
		fsub st0,st1 ;-0.5
5388 IgorA 620
		fstp dword[eax+vox_ogl_x0]
621
		fld dword[eax+vox_ogl_x1]
5393 IgorA 622
		fsub st0,st1 ;-0.5
5388 IgorA 623
		fstp dword[eax+vox_ogl_x1]
624
		;coord y
625
		fld dword[eax+vox_ogl_y0]
626
		fsub st0,st1 ;-0.5
627
		fstp dword[eax+vox_ogl_y0]
628
		fld dword[eax+vox_ogl_y1]
629
		fsub st0,st1 ;-0.5
630
		fstp dword[eax+vox_ogl_y1]
631
		;coord z
632
		fld dword[eax+vox_ogl_z0]
633
		fsub st0,st1 ;-0.5
634
		fstp dword[eax+vox_ogl_z0]
635
		fld dword[eax+vox_ogl_z1]
636
		fsub st0,st1 ;-0.5
637
		fstp dword[eax+vox_ogl_z1]
638
 
639
		;goto next voxel
640
		add eax,vox_ogl_size
641
		loop @b
642
	ffree st0
643
	fincstp
644
	ffree st0
645
	fincstp
646
	ret
647
endp
648
 
649
;Сортировка вектора a[1..n] методом Флойда
650
align 4
651
proc pole_fl_sort, a:dword, n:dword
652
	pushad
653
	mov ecx,dword[a]
654
	;Формировать исходное частично упорядоченное дерево
655
	mov eax,dword[n]
656
	shr eax,1
657
	@@: ;for(i=n/2; i>=2; i--)
658
		stdcall pole_fl_surface, ecx,eax,[n] ;(a,i,n)
659
		dec eax
660
		cmp eax,2
661
		jge @b
662
	;Выполнить процедуру всплытия Флойда для каждого поддерева
663
	mov eax,dword[n]
664
	@@: ;for(i=n; i>=2; i--){
665
		stdcall pole_fl_surface, ecx,1,eax ;(a,1,i)
666
		;Поместить найденный максимальный элемент в конец списка
667
        stdcall swap_cell, ecx,1,eax ;меняем местами a[1] <-> a[i]
668
		dec eax
669
		cmp eax,2
670
		jge @b
671
	popad
672
	ret
673
endp
674
 
675
;Процедура всплытия Флойда по дереву a[1..k]
676
align 4
677
proc pole_fl_surface, a:dword, i:dword, k:dword
678
	pushad
679
	;edx -> ...
680
	;edi -> m
681
	;esi -> j
682
	mov eax,dword[a]
683
	mov ebx,dword[i]
684
	mov ecx,dword[k]
685
 
686
	stdcall copy_cell, eax, -1,ebx ;copy=a[i];
687
	mov edi,ebx
688
	shl edi,1 ;m=2*i где edi=m
689
	.cycle_b: ;while (m<=k) {
690
		cmp edi,ecx
691
		jg .cycle_e
692
		jne @f ;if (m==k) j=m;
693
			mov esi,edi
694
			jmp .else_e
695
		@@: ;else if (pole_compare_cells_bm(a[m],a[m+1])) j=m;
696
		mov edx,edi
697
        inc edx
698
		stdcall pole_compare_cells_bm, eax, edi,edx
699
		cmp dl,0
700
		je @f
701
			mov esi,edi
702
			jmp .else_e
703
		@@: ;else j=m+1;
704
			mov esi,edi
705
			inc esi
706
		.else_e:
707
 
708
		;if (pole_compare_cells_bm(a[j],copy)) {
709
		stdcall pole_compare_cells_bm, eax, esi,-1
710
		cmp dl,0
711
		je .cycle_e ;} else break; //выход из цикла
712
 
713
		stdcall copy_cell, eax, ebx,esi ;a[i]=a[j];
714
		mov ebx,esi ;i=j;
715
		mov edi,ebx
716
		shl edi,1 ;m=2*i;
717
 
718
		jmp .cycle_b
719
	.cycle_e:
720
 
721
	;значения многих регистров уже не важны т. к. конец функции
722
	stdcall copy_cell, eax, ebx,-1 ;a[i]=copy;
723
 
724
	popad
725
	ret
726
endp
727
 
728
;output:
729
; dl
730
align 4
731
proc pole_compare_cells_bm uses eax ebx ecx, p_mem:dword, i0:dword, i1:dword
732
 
733
	mov eax,[i0] ;eax -> cell[i0]
734
    imul eax,vox_ogl_size
735
    add eax,[p_mem]
736
 
737
	mov ebx,[i1] ;ebx -> cell[i1]
738
    cmp ebx,0
739
    jl .copy
740
    imul ebx,vox_ogl_size
741
    add ebx,[p_mem]
742
    jmp @f
743
    .copy:
744
        mov ebx,mem_copy_32
745
    @@:
746
 
747
	mov cx,word[ebx+vox_ogl_zoom] ;zoom
748
	cmp word[eax+vox_ogl_zoom],cx
749
	jle @f ;zoom0>zoom1
750
		mov dl,1
751
		jmp .fun_e
752
	@@:
753
	jne .r_0 ;if zoom0
754
 
755
	mov ecx,dword[ebx+vox_ogl_x0] ;coord x
756
	cmp dword[eax+vox_ogl_x0],ecx
757
	jle @f ;x0>x1
758
		mov dl,1
759
		jmp .fun_e
760
	@@:
761
	jne .r_0 ;if x0
762
 
763
	mov ecx,dword[ebx+vox_ogl_y0] ;coord y
764
	cmp dword[eax+vox_ogl_y0],ecx
765
	jle @f ;y0>y1
766
		mov dl,1
767
		jmp .fun_e
768
	@@:
769
	jne .r_0 ;if y0
770
 
771
	mov ecx,dword[ebx+vox_ogl_z0] ;coord z
772
	cmp dword[eax+vox_ogl_z0],ecx
773
	jle @f ;z0>z1
774
		mov dl,1
775
		jmp .fun_e
776
	@@:
777
 
778
    .r_0:
779
	xor dl,dl
780
	.fun_e:
781
	ret
782
endp
783
 
784
if 0 ;пока не нужно, но работало правильно
785
;Сортировка вектора a[1..n] методом Флойда
786
align 4
787
proc pole_fl_sort_xzy, a:dword, n:dword
788
	pushad
789
	mov ecx,dword[a]
790
	;Формировать исходное частично упорядоченное дерево
791
	mov eax,dword[n]
792
	shr eax,1
793
	@@: ;for(i=n/2; i>=2; i--)
794
		stdcall pole_fl_surface_xzy, ecx,eax,[n] ;(a,i,n)
795
		dec eax
796
		cmp eax,2
797
		jge @b
798
	;Выполнить процедуру всплытия Флойда для каждого поддерева
799
	mov eax,dword[n]
800
	@@: ;for(i=n; i>=2; i--){
801
		stdcall pole_fl_surface_xzy, ecx,1,eax ;(a,1,i)
802
		;Поместить найденный максимальный элемент в конец списка
803
        stdcall swap_cell, ecx,1,eax ;меняем местами a[1] <-> a[i]
804
		dec eax
805
		cmp eax,2
806
		jge @b
807
	popad
808
	ret
809
endp
810
 
811
;Процедура всплытия Флойда по дереву a[1..k]
812
align 4
813
proc pole_fl_surface_xzy, a:dword, i:dword, k:dword
814
	pushad
815
	;edx -> ...
816
	;edi -> m
817
	;esi -> j
818
	mov eax,dword[a]
819
	mov ebx,dword[i]
820
	mov ecx,dword[k]
821
 
822
	stdcall copy_cell, eax, -1,ebx ;copy=a[i];
823
	mov edi,ebx
824
	shl edi,1 ;m=2*i где edi=m
825
	.cycle_b: ;while (m<=k) {
826
		cmp edi,ecx
827
		jg .cycle_e
828
		jne @f ;if (m==k) j=m;
829
			mov esi,edi
830
			jmp .else_e
831
		@@: ;else if (pole_compare_bm_xzy(a[m],a[m+1])) j=m;
832
		mov edx,edi
833
        inc edx
834
		stdcall pole_compare_bm_xzy, eax, edi,edx
835
		cmp dl,0
836
		je @f
837
			mov esi,edi
838
			jmp .else_e
839
		@@: ;else j=m+1;
840
			mov esi,edi
841
			inc esi
842
		.else_e:
843
 
844
		;if (pole_compare_bm_xzy(a[j],copy)) {
845
		stdcall pole_compare_bm_xzy, eax, esi,-1
846
		cmp dl,0
847
		je .cycle_e ;} else break; //выход из цикла
848
 
849
		stdcall copy_cell, eax, ebx,esi ;a[i]=a[j];
850
		mov ebx,esi ;i=j;
851
		mov edi,ebx
852
		shl edi,1 ;m=2*i;
853
 
854
		jmp .cycle_b
855
	.cycle_e:
856
 
857
	;значения многих регистров уже не важны т. к. конец функции
858
	stdcall copy_cell, eax, ebx,-1 ;a[i]=copy;
859
 
860
	popad
861
	ret
862
endp
863
 
864
;output:
865
; dl
866
align 4
867
proc pole_compare_bm_xzy uses eax ebx ecx, p_mem:dword, i0:dword, i1:dword
868
 
869
	mov eax,[i0] ;eax -> cell[i0]
870
    imul eax,vox_ogl_size
871
    add eax,[p_mem]
872
 
873
	mov ebx,[i1] ;ebx -> cell[i1]
874
    cmp ebx,0
875
    jl .copy
876
    imul ebx,vox_ogl_size
877
    add ebx,[p_mem]
878
    jmp @f
879
    .copy:
880
        mov ebx,mem_copy_32
881
    @@:
882
 
883
	mov cx,word[ebx+vox_ogl_zoom] ;zoom
884
	cmp word[eax+vox_ogl_zoom],cx
885
	jle @f ;zoom0>zoom1
886
		mov dl,1
887
		jmp .fun_e
888
	@@:
889
	jne .r_0 ;if zoom0
890
 
891
	mov ecx,dword[ebx+vox_ogl_x0] ;coord x
892
	cmp dword[eax+vox_ogl_x0],ecx
893
	jle @f ;x0>x1
894
		mov dl,1
895
		jmp .fun_e
896
	@@:
897
	jne .r_0 ;if x0
898
 
899
	mov ecx,dword[ebx+vox_ogl_z0] ;coord z
900
	cmp dword[eax+vox_ogl_z0],ecx
901
	jle @f ;z0>z1
902
		mov dl,1
903
		jmp .fun_e
904
	@@:
905
	jne .r_0 ;if z0
906
 
907
	mov ecx,dword[ebx+vox_ogl_y0] ;coord y
908
	cmp dword[eax+vox_ogl_y0],ecx
909
	jle @f ;y0>y1
910
		mov dl,1
911
		jmp .fun_e
912
	@@:
913
 
914
    .r_0:
915
	xor dl,dl
916
	.fun_e:
917
	ret
918
endp
919
end if
920
 
921
;Сортировка вектора a[1..n] методом Флойда
922
align 4
923
proc pole_fl_sort_zxy, a:dword, n:dword
924
	pushad
925
	mov ecx,dword[a]
926
	;Формировать исходное частично упорядоченное дерево
927
	mov eax,dword[n]
928
	shr eax,1
929
	@@: ;for(i=n/2; i>=2; i--)
930
		stdcall pole_fl_surface_zxy, ecx,eax,[n] ;(a,i,n)
931
		dec eax
932
		cmp eax,2
933
		jge @b
934
	;Выполнить процедуру всплытия Флойда для каждого поддерева
935
	mov eax,dword[n]
936
	@@: ;for(i=n; i>=2; i--){
937
		stdcall pole_fl_surface_zxy, ecx,1,eax ;(a,1,i)
938
		;Поместить найденный максимальный элемент в конец списка
939
        stdcall swap_cell, ecx,1,eax ;меняем местами a[1] <-> a[i]
940
		dec eax
941
		cmp eax,2
942
		jge @b
943
	popad
944
	ret
945
endp
946
 
947
;Процедура всплытия Флойда по дереву a[1..k]
948
align 4
949
proc pole_fl_surface_zxy, a:dword, i:dword, k:dword
950
	pushad
951
	;edx -> ...
952
	;edi -> m
953
	;esi -> j
954
	mov eax,dword[a]
955
	mov ebx,dword[i]
956
	mov ecx,dword[k]
957
 
958
	stdcall copy_cell, eax, -1,ebx ;copy=a[i];
959
	mov edi,ebx
960
	shl edi,1 ;m=2*i где edi=m
961
	.cycle_b: ;while (m<=k) {
962
		cmp edi,ecx
963
		jg .cycle_e
964
		jne @f ;if (m==k) j=m;
965
			mov esi,edi
966
			jmp .else_e
967
		@@: ;else if (pole_compare_bm_xzy(a[m],a[m+1])) j=m;
968
		mov edx,edi
969
        inc edx
970
		stdcall pole_compare_bm_zxy, eax, edi,edx
971
		cmp dl,0
972
		je @f
973
			mov esi,edi
974
			jmp .else_e
975
		@@: ;else j=m+1;
976
			mov esi,edi
977
			inc esi
978
		.else_e:
979
 
980
		;if (pole_compare_bm_xzy(a[j],copy)) {
981
		stdcall pole_compare_bm_zxy, eax, esi,-1
982
		cmp dl,0
983
		je .cycle_e ;} else break; //выход из цикла
984
 
985
		stdcall copy_cell, eax, ebx,esi ;a[i]=a[j];
986
		mov ebx,esi ;i=j;
987
		mov edi,ebx
988
		shl edi,1 ;m=2*i;
989
 
990
		jmp .cycle_b
991
	.cycle_e:
992
 
993
	;значения многих регистров уже не важны т. к. конец функции
994
	stdcall copy_cell, eax, ebx,-1 ;a[i]=copy;
995
 
996
	popad
997
	ret
998
endp
999
 
1000
;output:
1001
; dl
1002
align 4
1003
proc pole_compare_bm_zxy uses eax ebx ecx, p_mem:dword, i0:dword, i1:dword
1004
 
1005
	mov eax,[i0] ;eax -> cell[i0]
1006
    imul eax,vox_ogl_size
1007
    add eax,[p_mem]
1008
 
1009
	mov ebx,[i1] ;ebx -> cell[i1]
1010
    cmp ebx,0
1011
    jl .copy
1012
    imul ebx,vox_ogl_size
1013
    add ebx,[p_mem]
1014
    jmp @f
1015
    .copy:
1016
        mov ebx,mem_copy_32
1017
    @@:
1018
 
1019
	mov cx,word[ebx+vox_ogl_zoom] ;zoom
1020
	cmp word[eax+vox_ogl_zoom],cx
1021
	jle @f ;zoom0>zoom1
1022
		mov dl,1
1023
		jmp .fun_e
1024
	@@:
1025
	jne .r_0 ;if zoom0
1026
 
1027
	mov ecx,dword[ebx+vox_ogl_z0] ;coord z
1028
	cmp dword[eax+vox_ogl_z0],ecx
1029
	jle @f ;z0>z1
1030
		mov dl,1
1031
		jmp .fun_e
1032
	@@:
1033
	jne .r_0 ;if z0
1034
 
1035
	mov ecx,dword[ebx+vox_ogl_x0] ;coord x
1036
	cmp dword[eax+vox_ogl_x0],ecx
1037
	jle @f ;x0>x1
1038
		mov dl,1
1039
		jmp .fun_e
1040
	@@:
1041
	jne .r_0 ;if x0
1042
 
1043
	mov ecx,dword[ebx+vox_ogl_y0] ;coord y
1044
	cmp dword[eax+vox_ogl_y0],ecx
1045
	jle @f ;y0>y1
1046
		mov dl,1
1047
		jmp .fun_e
1048
	@@:
1049
 
1050
    .r_0:
1051
	xor dl,dl
1052
	.fun_e:
1053
	ret
1054
endp
1055
 
1056
;Сортировка вектора a[1..n] методом Флойда
1057
align 4
1058
proc pole_fl_sort_yzx, a:dword, n:dword
1059
	pushad
1060
	mov ecx,dword[a]
1061
	;Формировать исходное частично упорядоченное дерево
1062
	mov eax,dword[n]
1063
	shr eax,1
1064
	@@: ;for(i=n/2; i>=2; i--)
1065
		stdcall pole_fl_surface_yzx, ecx,eax,[n] ;(a,i,n)
1066
		dec eax
1067
		cmp eax,2
1068
		jge @b
1069
	;Выполнить процедуру всплытия Флойда для каждого поддерева
1070
	mov eax,dword[n]
1071
	@@: ;for(i=n; i>=2; i--){
1072
		stdcall pole_fl_surface_yzx, ecx,1,eax ;(a,1,i)
1073
		;Поместить найденный максимальный элемент в конец списка
1074
        stdcall swap_cell, ecx,1,eax ;меняем местами a[1] <-> a[i]
1075
		dec eax
1076
		cmp eax,2
1077
		jge @b
1078
	popad
1079
	ret
1080
endp
1081
 
1082
;Процедура всплытия Флойда по дереву a[1..k]
1083
align 4
1084
proc pole_fl_surface_yzx, a:dword, i:dword, k:dword
1085
	pushad
1086
	;edx -> ...
1087
	;edi -> m
1088
	;esi -> j
1089
	mov eax,dword[a]
1090
	mov ebx,dword[i]
1091
	mov ecx,dword[k]
1092
 
1093
	stdcall copy_cell, eax, -1,ebx ;copy=a[i];
1094
	mov edi,ebx
1095
	shl edi,1 ;m=2*i где edi=m
1096
	.cycle_b: ;while (m<=k) {
1097
		cmp edi,ecx
1098
		jg .cycle_e
1099
		jne @f ;if (m==k) j=m;
1100
			mov esi,edi
1101
			jmp .else_e
1102
		@@: ;else if (pole_compare_bm_yzx(a[m],a[m+1])) j=m;
1103
		mov edx,edi
1104
        inc edx
1105
		stdcall pole_compare_bm_yzx, eax, edi,edx
1106
		cmp dl,0
1107
		je @f
1108
			mov esi,edi
1109
			jmp .else_e
1110
		@@: ;else j=m+1;
1111
			mov esi,edi
1112
			inc esi
1113
		.else_e:
1114
 
1115
		;if (pole_compare_bm_yzx(a[j],copy)) {
1116
		stdcall pole_compare_bm_yzx, eax, esi,-1
1117
		cmp dl,0
1118
		je .cycle_e ;} else break; //выход из цикла
1119
 
1120
		stdcall copy_cell, eax, ebx,esi ;a[i]=a[j];
1121
		mov ebx,esi ;i=j;
1122
		mov edi,ebx
1123
		shl edi,1 ;m=2*i;
1124
 
1125
		jmp .cycle_b
1126
	.cycle_e:
1127
 
1128
	;значения многих регистров уже не важны т. к. конец функции
1129
	stdcall copy_cell, eax, ebx,-1 ;a[i]=copy;
1130
 
1131
	popad
1132
	ret
1133
endp
1134
 
1135
;output:
1136
; dl
1137
align 4
1138
proc pole_compare_bm_yzx uses eax ebx ecx, p_mem:dword, i0:dword, i1:dword
1139
 
1140
	mov eax,[i0] ;eax -> cell[i0]
1141
    imul eax,vox_ogl_size
1142
    add eax,[p_mem]
1143
 
1144
	mov ebx,[i1] ;ebx -> cell[i1]
1145
    cmp ebx,0
1146
    jl .copy
1147
    imul ebx,vox_ogl_size
1148
    add ebx,[p_mem]
1149
    jmp @f
1150
    .copy:
1151
        mov ebx,mem_copy_32
1152
    @@:
1153
 
1154
	mov cx,word[ebx+vox_ogl_zoom] ;zoom
1155
	cmp word[eax+vox_ogl_zoom],cx
1156
	jle @f ;zoom0>zoom1
1157
		mov dl,1
1158
		jmp .fun_e
1159
	@@:
1160
	jne .r_0 ;if zoom0
1161
 
1162
	mov ecx,dword[ebx+vox_ogl_y0] ;coord y
1163
	cmp dword[eax+vox_ogl_y0],ecx
1164
	jle @f ;y0>y1
1165
		mov dl,1
1166
		jmp .fun_e
1167
	@@:
1168
	jne .r_0 ;if y0
1169
 
1170
	mov ecx,dword[ebx+vox_ogl_z0] ;coord z
1171
	cmp dword[eax+vox_ogl_z0],ecx
1172
	jle @f ;z0>z1
1173
		mov dl,1
1174
		jmp .fun_e
1175
	@@:
1176
	jne .r_0 ;if z0
1177
 
1178
	mov ecx,dword[ebx+vox_ogl_x0] ;coord x
1179
	cmp dword[eax+vox_ogl_x0],ecx
1180
	jle @f ;x0>x1
1181
		mov dl,1
1182
		jmp .fun_e
1183
	@@:
1184
 
1185
    .r_0:
1186
	xor dl,dl
1187
	.fun_e:
1188
	ret
1189
endp
1190
 
1191
align 4
1192
proc copy_cell uses ecx edi esi, p_mem:dword, i0:dword, i1:dword
1193
 
1194
    mov esi,[i1]
1195
    cmp esi,0
1196
    jl .copy_0
1197
    imul esi,vox_ogl_size
1198
    add esi,[p_mem]
1199
    jmp @f
1200
    .copy_0:
1201
        mov esi,mem_copy_32
1202
    @@:
1203
 
1204
    mov edi,[i0]
1205
    cmp edi,0
1206
    jl .copy_1
1207
    imul edi,vox_ogl_size
1208
    add edi,[p_mem]
1209
    jmp @f
1210
    .copy_1:
1211
        mov edi,mem_copy_32
1212
    @@:
1213
 
1214
if vox_ogl_size eq 34
1215
    mov ecx,8 ;ecx=32/4
1216
    cld
1217
    rep movsd
1218
    movsw
1219
else
1220
    vox_ogl_size не равно 34 !
1221
end if
1222
    ret
1223
endp
1224
 
1225
align 4
1226
proc swap_cell uses eax ebx ecx edi esi, p_mem:dword, i0:dword, i1:dword
1227
    mov esi,[i0]
1228
    imul esi,vox_ogl_size
1229
    add esi,[p_mem]
1230
    mov edi,[i1]
1231
    imul edi,vox_ogl_size
1232
    add edi,[p_mem]
1233
if vox_ogl_size eq 34
1234
    ;vox_ogl_size = 34 = 32 + 2
1235
    mov ecx,8 ;ecx=32/4
1236
    cld
1237
    @@:
1238
        mov eax,dword[edi]
1239
        mov ebx,dword[esi]
1240
        mov dword[edi],ebx
1241
        mov dword[esi],eax
1242
        add esi,4
1243
        add edi,4
1244
        loop @b
1245
    mov ax,word[edi]
1246
    mov bx,word[esi]
1247
    mov word[edi],bx
1248
    mov word[esi],ax
1249
else
1250
    vox_ogl_size не равно 34 !
1251
end if
1252
    ret
1253
endp
1254
 
1255
align 4
1256
mem_copy_32 rb vox_ogl_size
1257
 
1258
;функция для коректировки координат
1259
;направления осей координат в вокселе:
1260
;*z
1261
;|
1262
;+-* x
1263
;input:
1264
;  al - номер узла в дереве (от 1 до 8)
1265
; ebx - координата x
1266
; edx - координата y
1267
; esi - координата z
1268
; ecx - уровень текушего узла
1269
;output:
1270
; ebx - новая координата x
1271
; edx - новая координата y
1272
; esi - новая координата z
1273
align 4
1274
proc vox_corect_coords_pl, v_obj:dword, v_size:dword
1275
	cmp ecx,0
1276
	jl .end_f ;для ускорения отрисовки
1277
 
1278
	push eax edi
1279
	and eax,15 ;выделяем номер узла в дереве
1280
	mov edi,[v_obj]
1281
	add edi,vox_offs_tree_table
1282
	add edi,8
1283
	sub edi,eax
1284
 
1285
	mov eax,[v_size]
1286
	cmp ecx,1
1287
	jl @f
1288
		shl eax,cl
1289
	@@:
1290
 
1291
	bt word[edi],0 ;test voxel coord x
1292
	jnc @f
1293
		add ebx,eax
1294
	@@:
1295
	bt word[edi],2 ;test voxel coord z
1296
	jnc @f
1297
		sub edx,eax
1298
	@@:
1299
	bt word[edi],1 ;test voxel coord y
1300
	jc @f
1301
		mov eax,1
1302
		cmp ecx,1
1303
		jl .end_0
1304
			shl eax,cl
1305
		.end_0:
1306
		add esi,eax ;меняем глубину для буфера z
1307
	@@:
1308
	pop edi eax
1309
	.end_f:
1310
	ret
1311
endp
1312
 
1313
align 4
1314
p1 dd ?
1315
p2 dd ?
1316
 
1317
align 4
1318
proc draw_voxels_3d uses ebx ecx edx edi, p_mem:dword
1319
locals
1320
    v_count dd ?
1321
endl
1322
    mov edi,[p_mem]
1323
    cmp edi,0
1324
    je .end_f
1325
    mov eax,dword[edi]
1326
    mov dword[v_count],eax
1327
    add edi,4
1328
 
1329
bt word[opt_cube_box],0
1330
jnc @f
1331
;рисование рамки
1332
stdcall [glColor3ub],128,128,128
1333
stdcall [glBegin],GL_LINE_STRIP
1334
    stdcall [glVertex3f], -0.5, -0.5, -0.5
1335
    stdcall [glVertex3f], -0.5,  0.5, -0.5
1336
    stdcall [glVertex3f],  0.5,  0.5, -0.5
1337
    stdcall [glVertex3f],  0.5, -0.5, -0.5
1338
    stdcall [glVertex3f], -0.5, -0.5, -0.5
1339
    stdcall [glVertex3f], -0.5, -0.5,  0.5
1340
    stdcall [glVertex3f], -0.5,  0.5,  0.5
1341
    stdcall [glVertex3f],  0.5,  0.5,  0.5
1342
    stdcall [glVertex3f],  0.5, -0.5,  0.5
1343
    stdcall [glVertex3f], -0.5, -0.5,  0.5
1344
stdcall [glEnd]
1345
stdcall [glBegin],GL_LINES
1346
    stdcall [glVertex3f], -0.5,  0.5, -0.5
1347
    stdcall [glVertex3f], -0.5,  0.5,  0.5
1348
    stdcall [glVertex3f],  0.5,  0.5, -0.5
1349
    stdcall [glVertex3f],  0.5,  0.5,  0.5
1350
    stdcall [glVertex3f],  0.5, -0.5, -0.5
1351
    stdcall [glVertex3f],  0.5, -0.5,  0.5
1352
stdcall [glEnd]
1353
@@:
1354
 
1355
;рисование объекта
1356
    stdcall [glBegin],GL_QUADS
1357
    .cycle_0:
1358
        cmp dword[v_count],1
1359
        jl .cycle_1
1360
        stdcall [glColor3ub],[edi+vox_ogl_color+2],[edi+vox_ogl_color+1],[edi+vox_ogl_color]
1361
 
1362
        bt word[edi+vox_ogl_planes],vox_ogl_gran_z1
1363
        jnc .e_gran_z1
1364
        ;передняя грань Normal(0.0,0.0,normal_gran_z1)
1365
            normal_gran p1,x0
1366
            normal_gran_2 p1,x0z1,x1
1367
            normal_gran p2,y0
1368
            normal_gran_2 p2,y0z1,y1
1369
            stdcall [glNormal3f], [p1],[p2],normal_gran_z1
1370
        stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y0],[edi+vox_ogl_z1]
1371
            normal_gran p1,x1
1372
            normal_gran_2 p1,x1z1,x0
1373
            ;normal_gran p2,y0
1374
            ;normal_gran_2 p2,y0z1,y1
1375
            stdcall [glNormal3f], [p1],[p2],normal_gran_z1
1376
        stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y0],[edi+vox_ogl_z1]
1377
            ;normal_gran p1,x1
1378
            ;normal_gran_2 p1,x1z1,x0
1379
            normal_gran p2,y1
1380
            normal_gran_2 p2,y1z1,y0
1381
            stdcall [glNormal3f], [p1],[p2],normal_gran_z1
1382
        stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y1],[edi+vox_ogl_z1]
1383
            normal_gran p1,x0
1384
            normal_gran_2 p1,x0z1,x1
1385
            ;normal_gran p2,y1
1386
            ;normal_gran_2 p2,y1z1,y0
1387
            stdcall [glNormal3f], [p1],[p2],normal_gran_z1
1388
        stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y1],[edi+vox_ogl_z1]
1389
        .e_gran_z1:
1390
 
1391
        bt word[edi+vox_ogl_planes],vox_ogl_gran_y0
1392
        jnc .e_gran_y0
1393
        ;верхняя грань Normal(0.0,normal_gran_y0,0.0)
1394
            normal_gran p1,x0
1395
            normal_gran_2 p1,x0y0,x1
1396
            normal_gran p2,z0
1397
            normal_gran_2 p2,y0z0,z1
1398
            stdcall [glNormal3f], [p1],normal_gran_y0,[p2]
1399
        stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y0],[edi+vox_ogl_z0]
1400
            normal_gran p1,x1
1401
            normal_gran_2 p1,x1y0,x0
1402
            ;normal_gran p2,z0
1403
            ;normal_gran_2 p2,y0z0,z1
1404
            stdcall [glNormal3f], [p1],normal_gran_y0,[p2]
1405
        stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y0],[edi+vox_ogl_z0]
1406
            ;normal_gran p1,x1
1407
            ;normal_gran_2 p1,x1y0,x0
1408
            normal_gran p2,z1
1409
            normal_gran_2 p2,y0z1,z0
1410
            stdcall [glNormal3f], [p1],normal_gran_y0,[p2]
1411
        stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y0],[edi+vox_ogl_z1]
1412
            normal_gran p1,x0
1413
            normal_gran_2 p1,x0y0,x1
1414
            ;normal_gran p2,z1
1415
            ;normal_gran_2 p2,y0z1,z0
1416
            stdcall [glNormal3f], [p1],normal_gran_y0,[p2]
1417
        stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y0],[edi+vox_ogl_z1]
1418
        .e_gran_y0:
1419
 
1420
        bt word[edi+vox_ogl_planes],vox_ogl_gran_y1
1421
        jnc .e_gran_y1
1422
        ;нижняя грань Normal(0.0,normal_gran_y1,0.0)
1423
            normal_gran p1,x0
1424
            normal_gran_2 p1,x0y1,x1
1425
            normal_gran p2,z1
1426
            normal_gran_2 p2,y1z1,z0
1427
            stdcall [glNormal3f], [p1],normal_gran_y1,[p2]
1428
        stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y1],[edi+vox_ogl_z1]
1429
            normal_gran p1,x1
1430
            normal_gran_2 p1,x1y1,x0
1431
            ;normal_gran p2,z1
1432
            ;normal_gran_2 p2,y1z1,z0
1433
            stdcall [glNormal3f], [p1],normal_gran_y1,[p2]
1434
        stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y1],[edi+vox_ogl_z1]
1435
            ;normal_gran p1,x1
1436
            ;normal_gran_2 p1,x1y1,x0
1437
            normal_gran p2,z0
1438
            normal_gran_2 p2,y1z0,z1
1439
            stdcall [glNormal3f], [p1],normal_gran_y1,[p2]
1440
        stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y1],[edi+vox_ogl_z0]
1441
            normal_gran p1,x0
1442
            normal_gran_2 p1,x0y1,x1
1443
            ;normal_gran p2,z0
1444
            ;normal_gran_2 p2,y1z0,z1
1445
            stdcall [glNormal3f], [p1],normal_gran_y1,[p2]
1446
        stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y1],[edi+vox_ogl_z0]
1447
        .e_gran_y1:
1448
 
1449
        bt word[edi+vox_ogl_planes],vox_ogl_gran_x0
1450
        jnc .e_gran_x0
1451
        ;левая грань Normal(normal_gran_x0,0.0,0.0)
1452
            normal_gran p1,y0
1453
            normal_gran_2 p1,x0y0,y1
1454
            normal_gran p2,z1
1455
            normal_gran_2 p2,x0z1,z0
1456
            stdcall [glNormal3f], normal_gran_x0,[p1],[p2]
1457
        stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y0],[edi+vox_ogl_z1]
1458
            normal_gran p1,y1
1459
            normal_gran_2 p1,x0y1,y0
1460
            ;normal_gran p2,z1
1461
            ;normal_gran_2 p2,x0z1,z0
1462
            stdcall [glNormal3f], normal_gran_x0,[p1],[p2]
1463
        stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y1],[edi+vox_ogl_z1]
1464
            ;normal_gran p1,y1
1465
            ;normal_gran_2 p1,x0y1,y0
1466
            normal_gran p2,z0
1467
            normal_gran_2 p2,x0z0,z1
1468
            stdcall [glNormal3f], normal_gran_x0,[p1],[p2]
1469
        stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y1],[edi+vox_ogl_z0]
1470
            normal_gran p1,y0
1471
            normal_gran_2 p1,x0y0,y1
1472
            ;normal_gran p2,z0
1473
            ;normal_gran_2 p2,x0z0,z1
1474
            stdcall [glNormal3f], normal_gran_x0,[p1],[p2]
1475
        stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y0],[edi+vox_ogl_z0]
1476
        .e_gran_x0:
1477
 
1478
        bt word[edi+vox_ogl_planes],vox_ogl_gran_x1
1479
        jnc .e_gran_x1
1480
        ;правая грань Normal(normal_gran_x1,0.0,0.0)
1481
            normal_gran p1,y0
1482
            normal_gran_2 p1,x1y0,y1
1483
            normal_gran p2,z1
1484
            normal_gran_2 p2,x1z1,z0
1485
            stdcall [glNormal3f], normal_gran_x1,[p1],[p2]
1486
        stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y0],[edi+vox_ogl_z1]
1487
            ;normal_gran p1,y0
1488
            ;normal_gran_2 p1,x1y0,y1
1489
            normal_gran p2,z0
1490
            normal_gran_2 p2,x1z0,z1
1491
            stdcall [glNormal3f], normal_gran_x1,[p1],[p2]
1492
        stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y0],[edi+vox_ogl_z0]
1493
            normal_gran p1,y1
1494
            normal_gran_2 p1,x1y1,y0
1495
            ;normal_gran p2,z0
1496
            ;normal_gran_2 p2,x1z0,z1
1497
            stdcall [glNormal3f], normal_gran_x1,[p1],[p2]
1498
        stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y1],[edi+vox_ogl_z0]
1499
            ;normal_gran p1,y1
1500
            ;normal_gran_2 p1,x1y1,y0
1501
            normal_gran p2,z1
1502
            normal_gran_2 p2,x1z1,z0
1503
            stdcall [glNormal3f], normal_gran_x1,[p1],[p2]
1504
        stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y1],[edi+vox_ogl_z1]
1505
        .e_gran_x1:
1506
 
1507
        bt word[edi+vox_ogl_planes],vox_ogl_gran_z0
1508
        jnc .e_gran_z0
1509
        ;задняя грань Normal(0.0,0.0,normal_gran_z0)
1510
            normal_gran p1,x0
1511
            normal_gran_2 p1,x0z0,x1
1512
            normal_gran p2,y1
1513
            normal_gran_2 p2,y1z0,y0
1514
            stdcall [glNormal3f], [p1],[p2],normal_gran_z0
1515
        stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y1],[edi+vox_ogl_z0]
1516
            normal_gran p1,x1
1517
            normal_gran_2 p1,x1z0,x0
1518
            ;normal_gran p2,y1
1519
            ;normal_gran_2 p2,y1z0,y0
1520
            stdcall [glNormal3f], [p1],[p2],normal_gran_z0
1521
        stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y1],[edi+vox_ogl_z0]
1522
            ;normal_gran p1,x1
1523
            ;normal_gran_2 p1,x1z0,x0
1524
            normal_gran p2,y0
1525
            normal_gran_2 p2,y0z0,y1
1526
            stdcall [glNormal3f], [p1],[p2],normal_gran_z0
1527
        stdcall [glVertex3f],[edi+vox_ogl_x1],[edi+vox_ogl_y0],[edi+vox_ogl_z0]
1528
            normal_gran p1,x0
1529
            normal_gran_2 p1,x0z0,x1
1530
            ;normal_gran p2,y0
1531
            ;normal_gran_2 p2,y0z0,y1
1532
            stdcall [glNormal3f], [p1],[p2],normal_gran_z0
1533
        stdcall [glVertex3f],[edi+vox_ogl_x0],[edi+vox_ogl_y0],[edi+vox_ogl_z0]
1534
        .e_gran_z0:
1535
 
1536
        ;goto next voxel
1537
        add edi,vox_ogl_size
1538
        dec dword[v_count]
1539
        jmp .cycle_0
1540
    .cycle_1:
1541
 
1542
    stdcall [glEnd]
1543
 
1544
    .end_f:
1545
    ret
1546
endp