[docs] Replace cyrillic 'с' with latin 'c' in register names
[kolibrios.git] / programs / demos / view3ds / chunks.inc
blobe1882f84702a1a4f2708f638b81f7cc1dba93ba7
1 ;=========================================================================\r
2 detect_chunks:\r
3 ; make pivot table, sort, remove unused vertices, find chunks...\r
4 ; in  - some global variables\r
5 ; out:\r
6 ;      ebx - chunks list ptr, every chunk as word\r
7 ;      ecx - chunks number\r
8 ;      esi - tri_ch    ; vertices with triangles list\r
9 ;      edi - t_ptr     ; pointers to tri_ch list\r
11     push ebp\r
12     mov  ebp,esp\r
13     sub  esp,60\r
16    .tri_ch         equ  dword[ebp-4]    ; tri chunks list ptr\r
17    .chunks         equ  dword[ebp-8]    ; chunks ptreach tri chunk No. as word\r
18    .endt           equ  dword[ebp-12]   ;\r
19    .t_ptr          equ  dword[ebp-16]   ; pointers list\r
20    .tri_ch1        equ  dword[ebp-20]   ;\r
21    .up             equ  dword[ebp-24]   ; upload ptr\r
22    .chmr           equ  dword[ebp-28]   ; bit mark list if tri stored\r
23    .str            equ  dword[ebp-32]   ; store ptr\r
24    .ltch1          equ  dword[ebp-36]   ; end of tri_ch1 ptr\r
25    .ch_cnt         equ  dword[ebp-40]\r
26    .cntt           equ  dword[ebp-44]\r
27    .cc             equ  dword[ebp-48]\r
28    .lsparam        equ  dword[ebp-52]\r
29    .fix_mark       equ  dword[ebp-56]\r
30    .endVptr        equ  dword[ebp-60]\r
32    ; some triangles have repeated indices of vertices\r
33    ; check and remove such triangles\r
34    call    remove_dead_tri\r
36    mov     ecx,[triangles_count_var]\r
37    shl     ecx,3\r
38    lea     ecx,[ecx*3]\r
39    add     ecx,100\r
40    mov     eax,68\r
41    mov     ebx,12\r
42    int     0x40\r
43    mov     .tri_ch,eax\r
46    mov     ecx,[triangles_count_var]\r
47    imul    ecx,[i12]\r
48    add     ecx,32\r
49    mov     eax,68\r
50    mov     ebx,12\r
51    int     0x40\r
52    mov     .tri_ch1,eax\r
54    mov     ecx,[points_count_var]\r
55    shl     ecx,2\r
56    add     ecx,1120\r
57    mov     eax,68\r
58    mov     ebx,12\r
59    int     0x40\r
60    mov     .t_ptr,eax\r
62    mov     ecx,[triangles_count_var]\r
63    shl     ecx,1\r
64    add     ecx,20\r
65    mov     eax,68\r
66    mov     ebx,12\r
67    int     0x40\r
68    mov     .chunks,eax\r
70    mov     ecx,[triangles_count_var]\r
71    shr     ecx,3\r
72    add     ecx,20\r
73    mov     eax,68\r
74    mov     ebx,12\r
75    int     0x40\r
76    mov     .chmr,eax     ; chunks mark if bit is set - tri was used\r
78    mov     edi,eax\r
79 ;   pxor    xmm0,xmm0\r
80    mov     ecx,[triangles_count_var]\r
81    shr     ecx,5\r
82    inc     ecx\r
83    xor     eax,eax\r
84    cld\r
85    rep     stosd\r
86 ;   shr     ecx,7\r
87 ;   inc     ecx\r
88 ; @@:\r
89 ;   movdqa  [edi],xmm0\r
90 ;   add     edi,16\r
91 ;   loop    @b\r
94   mov      eax,[points_count_var]\r
95   imul     eax,[i12]\r
96   add      eax,[points_ptr]\r
97   mov      .endVptr,eax\r
99 ; make pivot table\r
101    mov       edi,.tri_ch\r
102    mov       esi,[triangles_ptr]\r
103    xor       ecx,ecx\r
104   @@:\r
105    movd      xmm1,ecx\r
106    movq      xmm0,[esi]\r
107    pshufd    xmm1,xmm1,0\r
108    movd      xmm2,[esi+8]\r
109    punpckldq xmm0,xmm1\r
110    punpckldq xmm2,xmm1\r
111    movdqu   [edi],xmm0\r
112    movq     [edi+16],xmm2\r
113    add       esi,12\r
114    add       edi,24\r
115    inc       ecx\r
116    cmp       ecx,[triangles_count_var]\r
117    jnz       @b\r
119 ;sort\r
121    mov    ebx,.tri_ch\r
122    mov    ecx,[triangles_count_var]\r
123    lea    ecx,[ecx*3]\r
125    mov    esi,ecx\r
126    shl    esi,3\r
127    add    esi,ebx\r
128    mov   .endt,esi\r
130  .ccc:                                ; ebx    - vert index\r
131    mov    eax,[ebx+8]                 ; ebx+4  - tri index\r
132    cmp    eax,[ebx]\r
133    jge    .g\r
134    movq   xmm0,[ebx+8]\r
135    push   ebx\r
136  .c:\r
137    cmp    ebx,esi\r
138    jae    .done\r
139    cmp    ebx,.tri_ch\r
140    jb     .done\r
141    cmp    eax,[ebx]\r
142    jae    .done\r
143    movq   xmm7,[ebx]\r
144    movq   [ebx+8],xmm7\r
145    sub    ebx,8\r
146    jnc    .c\r
147    add    ebx,8\r
148  .done:\r
149    movq   [ebx+8],xmm0\r
150  .p:\r
151    pop    ebx\r
152  .g:\r
153    add    ebx,8\r
154    dec    ecx\r
155    cmp    ecx,1\r
156    jnz    .ccc\r
162   mov    ecx,[points_count_var]\r
163   mov    esi,.tri_ch\r
164   dec    ecx\r
165  .ptC:\r
166   mov     eax,[esi]\r
167   add     esi,8\r
168  .ptCff:\r
169   cmp     esi,.endt\r
170   jae     .dnC\r
171   cmp    eax,[esi]\r
172   je     @f\r
173   lea    ebx,[eax+1]\r
174   cmp    ebx,[esi]\r
175   jne    .movt\r
176   dec    ecx\r
177   jz    .dnC            ; check done\r
178  @@:\r
179   jmp   .ptC\r
181 ;  jmp  .dnC\r
183  .movt:\r
185   movd    xmm5,esi\r
186   movd    xmm7,ebx\r
187   mov     edi,[esi]\r
188   sub     edi,ebx\r
189   movd    xmm6,edi\r
191  @@:\r
192   cmp     esi,.endt\r
193   jnb     @f\r
194   sub     [esi],edi    ; fix .tri_ch pivot table list\r
195   add     esi,8\r
196   jmp     @b\r
197  @@:\r
200   ;shrink vert\r
201   lea     ebx,[ebx*3]\r
202   shl     ebx,2\r
203   add     ebx,[points_ptr]\r
204   imul    edi,[i12]\r
205   add     edi,ebx\r
207   cmp     edi,.endVptr           ; fix points_r  list\r
208   ja      .dnV\r
209  @@:\r
210   movq    xmm0,[edi]\r
211   movd    xmm1,[edi+8]\r
212   movq    [ebx],xmm0\r
213   movd    [ebx+8],xmm1\r
214   add     edi,12\r
215   add     ebx,12\r
216   cmp     edi,.endVptr           ; fix point_r  list\r
217   jna     @b\r
219  .dnV:\r
221 ; recalc tri  all indices above ebx - sub edi\r
222   push   ecx\r
224   mov    esi,[triangles_ptr]\r
225   mov    ecx,[triangles_count_var]\r
226   lea    ecx,[ecx*3]\r
227   movd   edi,xmm6\r
228   movd   ebx,xmm7\r
229  .agT:\r
230   cmp    [esi],ebx\r
231   jb     @f\r
232   sub     [esi],edi\r
233  @@:\r
234   add   esi,4\r
235   loop  .agT\r
237   pop   ecx\r
239   movd  esi,xmm5\r
241   sub    [points_count_var],edi\r
243   dec   ecx\r
245   jmp   .ptCff           ; again check sth found\r
248  .dnC:      ; check done\r
252   .do_ch:\r
255 ;make t_ptr  - table with pointers/adresses\r
258   mov    ecx,[points_count_var]\r
259   mov    esi,.tri_ch\r
260   mov    edi,.t_ptr\r
261   mov    ebx,ecx\r
263   mov    [edi],esi\r
264   add    edi,4\r
265   dec    ecx\r
266   jz     .dn\r
267  .pt:\r
268   mov    eax,[esi]        ; [esi]   - vert ind\r
269   add    esi,8\r
270   cmp    eax,[esi]        ; [esi+4] - tri ind\r
271   je     @f\r
272   mov    [edi],esi\r
273   add    edi,4\r
274   dec    ecx\r
275   jz     .dn\r
276  @@:\r
277   cmp   esi,.endt\r
278   jb    .pt\r
281  .dn:\r
284  ; each dword position in .t_ptr list - adress of corresponding\r
285  ; triangles indices, each triangles from such index contains this\r
286  ; vertice\r
289         mov     eax,[triangles_count_var]\r
290         mov     .cntt,eax   ; temp help cnt\r
291         xor     ecx,ecx\r
292         mov     .cc,ecx\r
293         mov     esi,[triangles_ptr]\r
294         mov     edi,.tri_ch1\r
295         imul    eax,[i12]\r
296         add     eax,edi\r
297         mov     .ltch1,eax    ; last\r
299         mov     .up,esi\r
300         mov     .str,edi\r
301 ;        mov     edi,.tri_ch1\r
302     .lb1:                     ; nx chunk\r
303         cmp     edi,.ltch1\r
304         jnb     .endl\r
305         mov     edi,.tri_ch1\r
306         mov     .str,edi\r
307         mov     eax,.cc\r
308         mov     edx,.cc\r
309         inc     .cc\r
310         cmp     edx,[triangles_count_var]\r
311         jz      .endl\r
312         shr     eax,3\r
313         and     edx,111b\r
314         add     eax,.chmr\r
316         xor     ebx,ebx\r
317         bt      [eax],edx           ; mark\r
318         jc      @f                  ; tri was stored\r
319         inc     ecx\r
320         or      ebx,1b\r
321         mov     esi,.up\r
322         movdqu  xmm0,[esi]\r
323         movdqu  [edi],xmm0\r
324         add     .str,12\r
325       @@:\r
326         add     .up,12\r
327         or      ebx,ebx\r
328         jz      .lb1\r
330     .lb2:\r
331         mov     eax,[edi]\r
332         mov     edx,[edi] ; edx - vert ind\r
333         shl     eax,2\r
334         add     eax,.t_ptr\r
335         mov     eax,[eax]           ; [eax] -   t ptr\r
336         or      eax,eax\r
337         jz      .endl\r
338     .nxt:\r
340         mov     esi,[eax+4]\r
341         mov     ebx,[eax+4]\r
342         shr     esi,3\r
343         and     ebx,111b\r
344         add     esi,.chmr\r
345         bts     [esi],ebx           ; mark\r
346         jc      @f                  ; tri was stored\r
347         dec     .cntt\r
348         je      .endl\r
349         mov     esi,[eax+4]         ; [eax+4] - tri ind\r
350         add     esi,esi\r
351         add     esi,.chunks\r
352         mov     [esi],cx\r
353         mov     esi,[eax+4]\r
355         imul    esi,[i12]\r
356         add     esi,[triangles_ptr]\r
357         movups  xmm0,[esi]\r
358         mov     esi,.str\r
359         movups  [esi],xmm0\r
360         add     .str,12\r
361       @@:\r
362         add     eax,8\r
363         cmp     edx,[eax]\r
364         je      .nxt\r
365         add     edi,4\r
367         cmp     edi,.str\r
368         jne     .lb2\r
369         jmp     .lb1\r
371     .endl:\r
373         mov     .ch_cnt,ecx\r
376   .end:\r
380 ;   mov     eax,68\r
381 ;   mov     ebx,13\r
382 ;   mov     ecx,.t_ptr\r
383 ;   int     0x40\r
385 ;   mov     eax,68\r
386 ;   mov     ebx,13\r
387 ;   mov     ecx,.tri_ch\r
388 ;   int     0x40\r
390    mov     eax,68\r
391    mov     ebx,13\r
392    mov     ecx,.tri_ch1\r
393    int     0x40\r
395    mov     eax,68\r
396    mov     ebx,13\r
397    mov     ecx,.chmr\r
398    int     0x40\r
399 ; for now free mem - cunks list - unused\r
401 ;   mov     eax,68\r
402 ;   mov     ebx,13\r
403 ;   mov     ecx,.chunks\r
404 ;   int     0x40\r
408    mov    ebx,.chunks\r
409    mov    ecx,.ch_cnt\r
411    mov  esi,.tri_ch\r
412    mov  edi,.t_ptr\r
415    mov    esp,ebp\r
416    pop    ebp\r
417 ret\r