Advertisement
cr88192

Example Vec3xf pack/unpack logic.

Dec 28th, 2016
278
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.50 KB | None | 0 0
  1. BS2VM_API u64 BSVM2_Double2XFloat2(u64 lv)
  2. {
  3.     const u64 n0=0x7FFFFFFFFFFFFFFFULL;
  4.     const u64 n1=0x3800000000000000ULL;
  5.     const u64 n2=0x8000000000000000ULL;
  6.     u64 m3;
  7.     u64 lv1;
  8.    
  9.     lv1=(lv&n0)-n1;
  10.     m3=lv1|(lv1<<1); m3|=m3<<2;
  11.     m3=~(((s64)m3)>>63);
  12.     lv1=((lv1&m3)<<3)|(lv&n2);
  13.     return(lv1);
  14. }
  15.  
  16. BS2VM_API void BSVM2_Pack3DvTo3Xf(u32 *pv, double *px)
  17. {
  18.     u64 lx, ly, lz;
  19.    
  20.     lx=((u64 *)px)[0];
  21.     ly=((u64 *)px)[1];
  22.     lz=((u64 *)px)[2];
  23.  
  24.     if(!((u32)(lx|ly|lz)))
  25.     {
  26.         ((float *)pv)[0]=px[0];
  27.         ((float *)pv)[1]=px[1];
  28.         ((float *)pv)[2]=px[2];
  29.         pv[3]=0;
  30.         return;
  31.     }
  32.    
  33.     lx=BSVM2_Double2XFloat2(lx);
  34.     ly=BSVM2_Double2XFloat2(ly);
  35.     lz=BSVM2_Double2XFloat2(lz);
  36.  
  37.     lx+=0x000FFFFFU;
  38.     ly+=0x000FFFFFU;
  39.     lz+=0x001FFFFFU;
  40.  
  41.     pv[0]=lx>>32;
  42.     pv[1]=ly>>32;
  43.     pv[2]=lz>>32;
  44.     pv[3]=
  45.         ((lz>>22)&0x000003FF)|
  46.         ((ly>>11)&0x001FFC00)|
  47.         ((lx    )&0xFFE00000);
  48. }
  49.  
  50. BS2VM_API void BSVM2_Unpack3XfTo3Dv(u32 *pv, double *px)
  51. {
  52.     const u64 m0=0x8000000000000000ULL;
  53.     const u64 m1=0x7FFFFFFFFFE00000ULL;
  54.     const u64 m2=0x3800000000000000ULL;
  55.     u64 lx, ly, lz;
  56.     u64 lx1, ly1, lz1;
  57.  
  58.     if(pv[3])
  59.     {
  60.         lx=(((u64)pv[0])<<32)|((u32)(pv[3]    ));
  61.         ly=(((u64)pv[1])<<32)|((u32)(pv[3]<<11));
  62.         lz=(((u64)pv[2])<<32)|((u32)(pv[3]<<22));
  63.         lx1=(lx&m0)|(((lx&m1)>>3)+m2);
  64.         ly1=(ly&m0)|(((ly&m1)>>3)+m2);
  65.         lz1=(lz&m0)|(((lz&m1)>>3)+m2);
  66.         px[0]=*(double *)(&lx1);
  67.         px[1]=*(double *)(&ly1);
  68.         px[2]=*(double *)(&lz1);
  69.     }else
  70.     {
  71.         px[0]=((float *)pv)[0];
  72.         px[1]=((float *)pv)[1];
  73.         px[2]=((float *)pv)[2];
  74.     }
  75. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement