Subversion Repositories Kolibri OS

Rev

Rev 8666 | Rev 9512 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
8719 leency 1
x3d equ 0
2
y3d equ 2
3
z3d equ 4
4
vec_x equ 0
5
vec_y equ 4
6
vec_z equ 8
7
; 3d point - triple integer word coordinate
8
; vector   - triple float dword coordinate
9
;----------------------in: --------------------------------
10
;------------------------ esi - pointer to 1st 3d point ---
11
;------------------------ edi - pointer to 2nd 3d point ---
12
;------------------------ ebx - pointer to result vector --
13
;---------------------- out : none ------------------------
14
reverse_mx_3x3:
15
; esi - source matrix
16
; edi - desired reversed matrix
17
 
18
  push  ebp
19
  mov   ebp,esp
20
  sub   esp,4
21
  .det  equ  ebp-4
22
 
23
  fninit
24
  fld  dword[esi]
25
  fmul dword[esi+16]
26
  fmul dword[esi+32]
27
  fld  dword[esi+12]
28
  fmul dword[esi+28]
29
  fmul dword[esi+8]
30
  faddp
31
  fld  dword[esi+24]
32
  fmul dword[esi+4]
33
  fmul dword[esi+20]
34
  faddp
35
  fld  dword[esi]
36
  fmul dword[esi+28]
37
  fmul dword[esi+20]
38
  fchs
39
  faddp
40
  fld  dword[esi+24]
41
  fmul dword[esi+16]
42
  fmul dword[esi+8]
43
  fchs
44
  faddp
45
  fld  dword[esi+12]
46
  fmul dword[esi+4]
47
  fmul dword[esi+32]
48
  fchs
49
  faddp
50
  fstp dword[.det]
51
  cmp  dword[.det],0
52
  jne  @f
53
  int3
54
 @@:
55
 ; fld1
56
 ; fdiv dword[.det]
57
 ; fstp dword[.det]
58
 
59
  fld  dword[esi+16]
60
  fmul dword[esi+32]
61
  fld  dword[esi+20]
62
  fmul dword[esi+28]
63
  fchs
64
  faddp
65
  fdiv dword[.det]
66
  fstp dword[edi]
67
 
68
  fld  dword[esi+8]
69
  fmul dword[esi+28]
70
  fld  dword[esi+4]
71
  fmul dword[esi+32]
72
  fchs
73
  faddp
74
  fdiv dword[.det]
75
  fstp dword[edi+4]
76
 
77
  fld  dword[esi+4]
78
  fmul dword[esi+20]
79
  fld  dword[esi+8]
80
  fmul dword[esi+16]
81
  fchs
82
  faddp
83
  fdiv dword[.det]
84
  fstp dword[edi+8]
85
 
86
  fld  dword[esi+20]
87
  fmul dword[esi+24]
88
  fld  dword[esi+12]
89
  fmul dword[esi+32]
90
  fchs
91
  faddp
92
  fdiv dword[.det]
93
  fstp dword[edi+12]
94
 
95
  fld  dword[esi]
96
  fmul dword[esi+32]
97
  fld  dword[esi+8]
98
  fmul dword[esi+24]
99
  fchs
100
  faddp
101
  fdiv dword[.det]
102
  fstp dword[edi+16]
103
 
104
  fld  dword[esi+8]
105
  fmul dword[esi+12]
106
  fld  dword[esi]
107
  fmul dword[esi+20]
108
  fchs
109
  faddp
110
  fdiv dword[.det]
111
  fstp dword[edi+20]
112
 
113
  fld  dword[esi+12]
114
  fmul dword[esi+28]
115
  fld  dword[esi+16]
116
  fmul dword[esi+24]
117
  fchs
118
  faddp
119
  fdiv dword[.det]
120
  fstp dword[edi+24]
121
 
122
  fld  dword[esi+4]
123
  fmul dword[esi+24]
124
  fld  dword[esi]
125
  fmul dword[esi+28]
126
  fchs
127
  faddp
128
  fdiv dword[.det]
129
  fstp dword[edi+28]
130
 
131
  fld  dword[esi]
132
  fmul dword[esi+16]
133
  fld  dword[esi+4]
134
  fmul dword[esi+12]
135
  fchs
136
  faddp
137
  fdiv dword[.det]
138
  fstp dword[edi+32]
139
 
140
 
141
  mov  esp,ebp
142
  pop  ebp
143
ret
144
 
145
make_vector_r:
146
   if Ext < SSE2
147
        fninit
148
        fld     dword[edi]                ;edi+x3d
149
        fsub    dword[esi]                ;esi+x3d
150
        fstp    dword[ebx+vec_x]
151
 
152
        fld     dword[edi+4]
153
        fsub    dword[esi+4]
154
        fstp    dword[ebx+vec_y]
155
 
156
        fld     dword[edi+8]
157
        fsub    dword[esi+8]
158
        fstp    dword[ebx+vec_z]
159
    else
160
        movups  xmm0,[esi]
161
        movups  xmm1,[edi]
162
        subps   xmm1,xmm0
163
        movlps  [ebx],xmm1
164
        movhlps  xmm1,xmm1
165
        movss   [ebx+8],xmm1
166
     end if
167
 
168
ret
169
;---------------------- in: -------------------------------
170
;--------------------------- esi - pointer to 1st vector --
171
;--------------------------- edi - pointer to 2nd vector --
172
;--------------------------- ebx - pointer to result vector
173
;---------------------- out : none
174
cross_product:
175
        fninit
176
        fld     dword [esi+vec_y]
177
        fmul    dword [edi+vec_z]
178
        fld     dword [esi+vec_z]
179
        fmul    dword [edi+vec_y]
180
        fsubp   ;st1 ,st
181
        fstp    dword [ebx+vec_x]
182
 
183
        fld     dword [esi+vec_z]
184
        fmul    dword [edi+vec_x]
185
        fld     dword [esi+vec_x]
186
        fmul    dword [edi+vec_z]
187
        fsubp   ;st1 ,st
188
        fstp    dword [ebx+vec_y]
189
 
190
        fld     dword [esi+vec_x]
191
        fmul    dword [edi+vec_y]
192
        fld     dword [esi+vec_y]
193
        fmul    dword [edi+vec_x]
194
        fsubp   ;st1 ,st
195
        fstp    dword [ebx+vec_z]
196
ret
197
;----------------------- in: ------------------------------
198
;---------------------------- edi - pointer to vector -----
199
;----------------------- out : none
200
normalize_vector:
201
if Ext >= SSE3
202
        movups  xmm0,[edi]
203
        andps   xmm0,[zero_hgst_dd]
204
        movups  xmm1,xmm0
205
        mulps   xmm0,xmm0
206
        haddps  xmm0,xmm0
207
        haddps  xmm0,xmm0
208
        rsqrtps xmm0,xmm0
209
        mulps   xmm0,xmm1
210
        movlps  [edi],xmm0
211
        movhlps xmm0,xmm0
212
        movss   [edi+8],xmm0
213
else
214
 
215
        fninit
216
        fld     dword [edi+vec_x]
217
        fmul    st, st
218
        fld     dword [edi+vec_y]
219
        fmul    st, st
220
        fld     dword [edi+vec_z]
221
        fmul    st, st
222
        faddp   st1, st
223
        faddp   st1, st
224
        fsqrt
225
 
226
        ftst
227
        fstsw ax
228
        sahf
229
        jnz     @f
230
 
231
        fst     dword [edi+vec_x]
232
        fst     dword [edi+vec_y]
233
        fstp    dword [edi+vec_z]
234
        ret
235
      @@:
236
        fld st
237
        fld st
238
        fdivr dword [edi+vec_x]
239
        fstp  dword [edi+vec_x]
240
        fdivr dword [edi+vec_y]
241
        fstp  dword [edi+vec_y]
242
        fdivr dword [edi+vec_z]
243
        fstp  dword [edi+vec_z]
244
end if
245
ret
246
;------------------in: -------------------------
247
;------------------ esi - pointer to 1st vector
248
;------------------ edi - pointer to 2nd vector
249
;------------------out: ------------------------
250
;------------------ st0 - dot-product
251
dot_product:
252
        fninit
253
;if Ext >=SSE3
254
;        movups  xmm0,[esi]
255
;        movups  xmm1,[edi]
256
;        andps   xmm0,[zero_hgst_dd]
257
;        mulps   xmm0,xmm1
258
;        haddps  xmm0,xmm0
259
;        haddps  xmm0,xmm0
260
;        movss   [esp-4],xmm0
261
;        fld     dword[esp-4]
262
;else
263
        fld     dword [esi+vec_x]
264
        fmul    dword [edi+vec_x]
265
        fld     dword [esi+vec_y]
266
        fmul    dword [edi+vec_y]
267
        fld     dword [esi+vec_z]
268
        fmul    dword [edi+vec_z]
269
        faddp
270
        faddp
271
;end if
272
ret
273
 
274
; DOS version Coded by Mikolaj Felix aka Majuma
275
; mfelix@polbox.com
276
; www.majuma.xt.pl
277
; into FASM translation by Macgub
278
init_sincos_tab:
279
.counter   equ  dword [ebp-4]  ; cur angle
280
 
281
     push       ebp
282
     mov        ebp,esp
283
 
284
     xor        eax,eax
285
     push       eax            ; init .counter
286
     mov        edi,cos_tab
287
     mov        esi,sin_tab
288
     mov        ecx,256
289
     fninit
290
 
291
     fld        .counter
292
  @@:
293
     fld        st
294
     fsincos
295
     fstp       dword [edi]
296
     fstp       dword [esi]
297
;     fadd       [piD180]
298
     fadd       [piD128]
299
     add        esi,4
300
     add        edi,4
301
     loop       @b
302
     ffree      st
303
 
304
     mov        esp,ebp
305
     pop        ebp
306
ret
307
;------
308
; esi - offset (pointer) to angles, edi offset to 3x3 matrix
309
make_rotation_matrix:
310
   .sinx   equ dword[ebp-4]
311
   .cosx   equ dword[ebp-8]
312
   .siny   equ dword[ebp-12]
313
   .cosy   equ dword[ebp-16]
314
   .sinz   equ dword[ebp-20]
315
   .cosz   equ dword[ebp-24]
316
     push      ebp
317
     mov       ebp,esp
318
     sub       esp,24
319
 
320
     movzx     ebx,word[esi]
321
     shl       ebx,2
322
     mov       eax,dword[sin_tab+ebx]
323
     mov       .sinx,eax
324
     mov       edx,dword[cos_tab+ebx]
325
     mov       .cosx,edx
326
 
327
     movzx     ebx,word[esi+2]
328
     shl       ebx,2
329
     mov       eax,dword[sin_tab+ebx]
330
     mov       .siny,eax
331
     mov       edx,dword[cos_tab+ebx]
332
     mov       .cosy,edx
333
 
334
     movzx     ebx,word[esi+4]
335
     shl       ebx,2
336
     mov       eax,dword[sin_tab+ebx]
337
     mov       .sinz,eax
338
     mov       edx,dword[cos_tab+ebx]
339
     mov       .cosz,edx
340
 
341
     fninit
342
     fld       .cosy
343
     fmul      .cosz
344
     fstp      dword[edi]
345
 
346
     fld       .sinx
347
     fmul      .siny
348
     fmul      .cosz
349
     fld       .cosx
350
     fmul      .sinz
351
     fchs
352
     faddp
353
     fstp      dword[edi+12]
354
 
355
     fld       .cosx
356
     fmul      .siny
357
     fmul      .cosz
358
     fld       .sinx
359
     fmul      .sinz
360
     faddp
361
     fstp      dword[edi+24]
362
 
363
     fld       .cosy
364
     fmul      .sinz
365
     fstp      dword[edi+4]
366
 
367
     fld       .sinx
368
     fmul      .siny
369
     fmul      .sinz
370
     fld       .cosx
371
     fmul      .cosz
372
     faddp
373
     fstp      dword[edi+16]
374
 
375
     fld       .cosx
376
     fmul      .siny
377
     fmul      .sinz
378
     fld       .sinx
379
     fchs
380
     fmul      .cosz
381
     faddp
382
     fstp      dword[edi+28]
383
 
384
     fld       .siny
385
     fchs
386
     fstp      dword[edi+8]
387
 
388
     fld       .cosy
389
     fmul      .sinx
390
     fstp      dword[edi+20]
391
 
392
     fld       .cosx
393
     fmul      .cosy
394
     fstp      dword[edi+32]
395
 
396
     mov       esp,ebp
397
     pop       ebp
398
ret
399
;---------------------
400
;  in:  esi - ptr to points(normals], each point(normal) coeficient as dword
401
;       edi - ptr to rotated points(normals)
402
;       ebx - ptr to 3x3 (9 dwords, 36 bytes) rotation matrix
403
;       ecx - number of points(normals)
404
rotary:
405
if Ext
406
    fninit
407
 .again:
408
 
409
    fld     dword[esi]
410
    fmul    dword[ebx]
411
    fld     dword[esi+4]
412
    fmul    dword[ebx+12]
413
    faddp
414
    fld     dword[esi+8]
415
    fmul    dword[ebx+24]
416
    faddp
417
    fstp    dword[edi]
418
 
419
 
420
    fld     dword[esi+4]
421
    fmul    dword[ebx+16]
422
    fld     dword[esi]
423
    fmul    dword[ebx+4]
424
    faddp
425
    fld     dword[esi+8]
426
    fmul    dword[ebx+28]
427
    faddp
428
    fstp    dword[edi+4]
429
 
430
 
431
    fld     dword[esi+8]
432
    fmul    dword[ebx+32]
433
    fld     dword[esi]
434
    fmul    dword[ebx+8]
435
    fld     dword[esi+4]
436
    fmul    dword[ebx+20]
437
    faddp
438
    faddp
439
    fstp    dword[edi+8]
440
 
441
 
442
    add     esi,12
443
    add     edi,12
444
    loop    .again
445
    mov     [edi],dword -1
446
else
447
;   Copyright (C) 1999-2001  Brian Paul
448
;   Copyright (C)            Maciej Guba
449
;---------------------
450
;  in:  esi - ptr to points(normals], each point(normal) coeficient as dword
451
;       edi - ptr to rotated points(normals)
452
;       ebx - ptr to 3x3 (9 dwords, 36 bytes) rotation matrix
453
;       ecx - number of points(normals)
454
;align 32
455
    movups   xmm4,[ebx]
456
 ;   lddqu    xmm4,[ebx]   ; I tried sse3 :D
457
    movups   xmm5,[ebx+12]
458
    movups   xmm6,[ebx+24]
459
;align 32
460
  .again:
461
    movss    xmm0,dword[esi]
462
    shufps   xmm0,xmm0,0
463
    mulps    xmm0,xmm4
464
 
465
    movss    xmm1,dword[esi+4]
466
    shufps   xmm1,xmm1,0
467
    mulps    xmm1,xmm5
468
 
469
    movss    xmm2,dword[esi+8]
470
    shufps   xmm2,xmm2,0
471
    mulps    xmm2,xmm6
472
 
473
    addps    xmm0,xmm1
474
    addps    xmm0,xmm2
475
 
476
    movups   [edi],xmm0
477
 
478
    add      esi,12
479
    add      edi,12
480
    dec      ecx
481
    jne      .again
482
    mov      [edi],dword -1
483
end if
484
ret
485
;----------------------------------------------
486
;  esi - pointer to 3x3 matrix
487
add_scale_to_matrix:
488
     fninit
489
     fld     [rsscale]
490
     fld     dword[esi]            ;-----
491
     fmul    st,st1
492
     fstp    dword[esi]
493
     fld     dword[esi+12]           ; x scale
494
     fmul    st,st1
495
     fstp    dword[esi+12]
496
     fld     dword[esi+24]
497
     fmul    st,st1
498
     fstp    dword[esi+24]         ;------
499
 
500
     fld     dword[esi+4]          ;-----
501
     fmul    st,st1
502
     fstp    dword[esi+4]
503
     fld     dword[esi+16]            ; y scale
504
     fmul    st,st1
505
     fstp    dword[esi+16]
506
     fld     dword[esi+28]
507
     fmul    st,st1
508
     fstp    dword[esi+28]         ;------
509
 
510
 
511
     fld     dword[esi+8]          ;-----
512
     fmul    st,st1
513
     fstp    dword[esi+8]
514
     fld     dword[esi+20]              ; z scale
515
     fmul    st,st1
516
     fstp    dword[esi+20]
517
     fld     dword[esi+32]
518
     fmulp    st1,st
519
     fstp    dword[esi+32]         ;------
520
 
521
ret
522
 
523
;in   esi - offset to 3d points  (point as 3 dwords float)
524
;     edi - offset to 2d points  ( as 3 words integer)
525
;     ecx - number of points
526
translate_points:  ; just convert into integer; z coord still needed
527
    fninit
528
  .again:
529
  if 0
530
    fld    dword[esi+8]
531
 ;   fmul   [rsscale]
532
    fist   word[edi+4]
533
 
534
    fisub  [zobs]
535
    fchs
536
 
537
    fld    dword[esi]
538
;    fmul   [rsscale]
539
    fisub  [xobs]
540
    fimul  [zobs]
541
    fdiv   st0,st1
542
 
543
    fiadd  [xobs]
544
    fiadd  [vect_x]
545
    fistp  word[edi]
546
 
547
    fld    dword[esi+4]
548
;    fmul   [rsscale]
549
    fisub  [yobs]
550
    fimul  [zobs]
551
    fdivrp  ;   st0,st1
552
 
553
    fiadd  [yobs]
554
    fiadd  [vect_y]
555
    fistp  word[edi+2]
556
   end if
557
   ; movups   xmm0,[esi]
558
   ; cvtps2dq xmm0,xmm0
559
   ; packsdw xmm0,xmm0
560
   ; movq     [edi]
561
    fld    dword[esi]
562
    fiadd  [vect_x]
563
    fistp  word[edi]
564
    fld    dword[esi+4]
565
    fiadd  [vect_y]
566
    fistp  word[edi+2]
567
    fld    dword[esi+8]
568
    fistp  word[edi+4]
569
    add    esi,12
570
    add    edi,6
571
    dec    ecx
572
    jnz    .again
573
 
574
ret