亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? _vector3_sse.h

?? 奇跡世界公用文件源代碼,研究網絡游戲的朋友可以研究下
?? H
字號:
#ifndef _VECTOR3_SSE_H
#define _VECTOR3_SSE_H
//------------------------------------------------------------------------------
/**
    SSE based vector3 class.

    @author
    - RadonLabs GmbH 

    @since
    - 2005.7.06
    @remarks
    - 瘤肯 眠啊 
*/

#include <xmmintrin.h>
#include <math.h>

//------------------------------------------------------------------------------
class _vector3_sse
{
public:
    /// constructor 1
    _vector3_sse();
    /// constructor 2
    _vector3_sse(const float _x, const float _y, const float _z);
    /// constructor 3
    _vector3_sse(const _vector3_sse& vec);
    /// constructor 4
    _vector3_sse(const float* p);
    /// private constructor
    _vector3_sse(const __m128& m);
    /// set elements 1
    void set(const float _x, const float _y, const float _z);
    /// set elements 2 
    void set(const _vector3_sse& vec);
    /// set elements 3
    void set(const float* p);
    /// return length
    float len() const;
    /// return length squared
    float lensquared() const;
    /// normalize
    void norm();
    /// inplace add
    void operator +=(const _vector3_sse& v0);
    /// inplace sub
    void operator -=(const _vector3_sse& v0);
    /// inplace scalar multiplication
    void operator *=(float s);
    /// fuzzy compare
    bool isequal(const _vector3_sse& v, float tol) const;
    /// fuzzy compare, returns -1, 0, +1
    int compare(const _vector3_sse& v, float tol) const;
    /// rotate around axis
    void rotate(const _vector3_sse& axis, float angle);
    /// inplace linear interpolation
    void lerp(const _vector3_sse& v0, float lerpVal);
    /// returns a vector orthogonal to self, not normalized
    _vector3_sse findortho() const;

    union
    {
        __m128 m128;
        struct
        {
            float x, y, z, pad;
        };
    };
};

//------------------------------------------------------------------------------
/**
*/
inline
_vector3_sse::_vector3_sse()
{
    m128 = _mm_setzero_ps();
}

//------------------------------------------------------------------------------
/**
*/
inline
_vector3_sse::_vector3_sse(const float _x, const float _y, const float _z)
{
    m128 = _mm_set_ps(0.0f, _z, _y, _x);
}

//------------------------------------------------------------------------------
/**
*/
inline
_vector3_sse::_vector3_sse(const _vector3_sse& vec)
{
    m128 = vec.m128;
}

//------------------------------------------------------------------------------
/**
*/
inline
_vector3_sse::_vector3_sse(const __m128& m)
{
    m128 = m;
}

//------------------------------------------------------------------------------
/**
*/
inline
void
_vector3_sse::set(const float _x, const float _y, const float _z)
{
    m128 = _mm_set_ps(0.0f, _z, _y, _x);
}

//------------------------------------------------------------------------------
/**
*/
inline
void
_vector3_sse::set(const _vector3_sse& vec)
{
    m128 = vec.m128;
}

//------------------------------------------------------------------------------
/**
*/
inline
float
_vector3_sse::len() const
{
    static const int X = 0;
    static const int Y = 1;
    static const int Z = 2;
    static const int W = 3;

    __m128 a = _mm_mul_ps(m128, m128);

    // horizontal add
    __m128 b = _mm_add_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(X,X,X,X)), _mm_add_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(Y,Y,Y,Y)), _mm_shuffle_ps(a, a, _MM_SHUFFLE(Z,Z,Z,Z))));
    __m128 l = _mm_sqrt_ss(b);
    return l.m128_f32[X];
}

//------------------------------------------------------------------------------
/**
*/
inline
float 
_vector3_sse::lensquared() const
{
    static const int X = 0;
    static const int Y = 1;
    static const int Z = 2;
    static const int W = 3;

    __m128 a = _mm_mul_ps(m128, m128);
    __m128 b = _mm_add_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(X,X,X,X)), _mm_add_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(Y,Y,Y,Y)), _mm_shuffle_ps(a, a, _MM_SHUFFLE(Z,Z,Z,Z))));
    return b.m128_f32[X];
}

//------------------------------------------------------------------------------
/**
*/
inline
void
_vector3_sse::norm()
{
    static const int X = 0;
    static const int Y = 1;
    static const int Z = 2;
    static const int W = 3;

    __m128 a = _mm_mul_ps(m128, m128);

    // horizontal add
    __m128 b = _mm_add_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(X,X,X,X)), _mm_add_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(Y,Y,Y,Y)), _mm_shuffle_ps(a, a, _MM_SHUFFLE(Z,Z,Z,Z))));

    // get reciprocal of square root of squared length
    __m128 f = _mm_rsqrt_ss(b);
    __m128 oneDivLen = _mm_shuffle_ps(f, f, _MM_SHUFFLE(X,X,X,X));
    
    m128 = _mm_mul_ps(m128, oneDivLen);
}

//------------------------------------------------------------------------------
/**
*/
inline
void
_vector3_sse::operator +=(const _vector3_sse& v)
{
    m128 = _mm_add_ps(m128, v.m128);
}

//------------------------------------------------------------------------------
/**
*/
inline
void
_vector3_sse::operator -=(const _vector3_sse& v)
{
    m128 = _mm_sub_ps(m128, v.m128);
}

//------------------------------------------------------------------------------
/**
*/
inline
void
_vector3_sse::operator *=(float s)
{
    __m128 packed = _mm_set1_ps(s);
    m128 = _mm_mul_ps(m128, packed);
}

//------------------------------------------------------------------------------
/**
*/
inline
bool
_vector3_sse::isequal(const _vector3_sse& v, float tol) const
{
    if (fabs(v.x - x) > tol)      return false;
    else if (fabs(v.y - y) > tol) return false;
    else if (fabs(v.z - z) > tol) return false;
    return true;
}

//------------------------------------------------------------------------------
/**
*/
inline
int
_vector3_sse::compare(const _vector3_sse& v, float tol) const
{
    if (fabs(v.x - x) > tol)      return (v.x > x) ? +1 : -1; 
    else if (fabs(v.y - y) > tol) return (v.y > y) ? +1 : -1;
    else if (fabs(v.z - z) > tol) return (v.z > z) ? +1 : -1;
    else                          return 0;
}

//------------------------------------------------------------------------------
/**
*/
inline
void
_vector3_sse::rotate(const _vector3_sse& axis, float angle)
{
    // rotates this one around given vector. We do
    // rotation with matrices, but these aren't defined yet!
    float rotM[9];
    float sa, ca;

    sa = (float) sin(angle);
    ca = (float) cos(angle);

    // build a rotation matrix
    rotM[0] = ca + (1 - ca) * axis.x * axis.x;
    rotM[1] = (1 - ca) * axis.x * axis.y - sa * axis.z;
    rotM[2] = (1 - ca) * axis.z * axis.x + sa * axis.y;
    rotM[3] = (1 - ca) * axis.x * axis.y + sa * axis.z;
    rotM[4] = ca + (1 - ca) * axis.y * axis.y;
    rotM[5] = (1 - ca) * axis.y * axis.z - sa * axis.x;
    rotM[6] = (1 - ca) * axis.z * axis.x - sa * axis.y;
    rotM[7] = (1 - ca) * axis.y * axis.z + sa * axis.x;
    rotM[8] = ca + (1 - ca) * axis.z * axis.z;

    // "handmade" multiplication
    _vector3_sse help(rotM[0] * this->x + rotM[1] * this->y + rotM[2] * this->z,
                      rotM[3] * this->x + rotM[4] * this->y + rotM[5] * this->z,
                      rotM[6] * this->x + rotM[7] * this->y + rotM[8] * this->z);
    *this = help;
}

//------------------------------------------------------------------------------
/**
*/
static 
inline 
_vector3_sse operator +(const _vector3_sse& v0, const _vector3_sse& v1) 
{
    return _vector3_sse(_mm_add_ps(v0.m128, v1.m128));
}

//------------------------------------------------------------------------------
/**
*/
static 
inline 
_vector3_sse operator -(const _vector3_sse& v0, const _vector3_sse& v1) 
{
    return _vector3_sse(_mm_sub_ps(v0.m128, v1.m128));
}

//------------------------------------------------------------------------------
/**
*/
static 
inline 
_vector3_sse operator *(const _vector3_sse& v0, const float s) 
{
    __m128 packed = _mm_set1_ps(s);
    return _vector3_sse(_mm_mul_ps(v0.m128, packed));
}

//------------------------------------------------------------------------------
/**
*/
static 
inline 
_vector3_sse operator -(const _vector3_sse& v) 
{
    __m128 zero = _mm_setzero_ps();
    return _vector3_sse(_mm_sub_ps(zero, v.m128));
}

//------------------------------------------------------------------------------
/**
    Dot product.
*/
static
inline
float operator %(const _vector3_sse& v0, const _vector3_sse& v1)
{
    __m128 a = _mm_mul_ps(v0.m128, v1.m128);
    __m128 b = _mm_add_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(0,0,0,0)), _mm_add_ss(_mm_shuffle_ps(a, a, _MM_SHUFFLE(1,1,1,1)), _mm_shuffle_ps(a, a, _MM_SHUFFLE(2,2,2,2))));
    return b.m128_f32[0];
}

//------------------------------------------------------------------------------
/**
    Cross product.
*/
static 
inline 
_vector3_sse operator *(const _vector3_sse& v0, const _vector3_sse& v1) 
{
    // x = v0.y * v1.z - v0.z * v1.y
    // y = v0.z * v1.x - v0.x * v1.z
    // z = v0.x * v1.y - v0.y * v1.x
    //
    // a = v0.y | v0.z | v0.x | xxx
    // b = v1.z | v1.x | v1.y | xxx
    // c = v0.z | v0.x | v0.y | xxx
    // d = v1.y | v1.z | v1.x | xxx
    //

    static const int X = 0;
    static const int Y = 1;
    static const int Z = 2;
    static const int W = 3;

    __m128 a = _mm_shuffle_ps(v0.m128, v0.m128, _MM_SHUFFLE(W, X, Z, Y));
    __m128 b = _mm_shuffle_ps(v1.m128, v1.m128, _MM_SHUFFLE(W, Y, X, Z));
    __m128 c = _mm_shuffle_ps(v0.m128, v0.m128, _MM_SHUFFLE(W, Y, X, Z));
    __m128 d = _mm_shuffle_ps(v1.m128, v1.m128, _MM_SHUFFLE(W, X, Z, Y));

    __m128 e = _mm_mul_ps(a, b);
    __m128 f = _mm_mul_ps(c, d);

    return _vector3_sse(_mm_sub_ps(e, f));
}

//------------------------------------------------------------------------------
/**
*/
inline
void
_vector3_sse::lerp(const _vector3_sse& v0, float lerpVal)
{
    x = v0.x + ((x - v0.x) * lerpVal);
    y = v0.y + ((y - v0.y) * lerpVal);
    z = v0.z + ((z - v0.z) * lerpVal);
}

//------------------------------------------------------------------------------
/**
    Find a vector that is orthogonal to self. Self should not be (0,0,0).
    Return value is not normalized.
*/
inline
_vector3_sse
_vector3_sse::findortho() const
{
    if (0.0 != x)
    {
        return _vector3_sse((-y - z) / x, 1.0, 1.0);
    } else
    if (0.0 != y)
    {
        return _vector3_sse(1.0, (-x - z) / y, 1.0);
    } else
    if (0.0 != z)
    {
        return _vector3_sse(1.0, 1.0, (-x - y) / z);
    } else
    {
        return _vector3_sse(0.0, 0.0, 0.0);
    }
}

//------------------------------------------------------------------------------
#endif

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲午夜成aⅴ人片| 久久激情五月婷婷| 午夜精品久久一牛影视| 粉嫩高潮美女一区二区三区 | 欧美肥胖老妇做爰| 日本一区二区三区四区在线视频| 亚洲一区二区四区蜜桃| 成人福利视频在线看| 91麻豆精品国产91久久久更新时间 | 日本伦理一区二区| 中文无字幕一区二区三区| 日本女优在线视频一区二区| 色视频欧美一区二区三区| 日本一区二区动态图| 精彩视频一区二区| 91精品久久久久久久91蜜桃| 一区二区三区在线视频免费 | 亚洲国产精品黑人久久久| 奇米精品一区二区三区在线观看| 色综合久久综合网| 自拍偷在线精品自拍偷无码专区| 国产精品99久久久久久似苏梦涵 | 欧美亚洲精品一区| 亚洲欧美视频在线观看视频| youjizz国产精品| 国产精品欧美一区二区三区| 国产成人综合网站| 久久久久久久免费视频了| 激情图片小说一区| 精品国产91洋老外米糕| 精品亚洲成av人在线观看| 欧美成人精精品一区二区频| 美女一区二区久久| 精品国产免费人成电影在线观看四季 | 蜜桃一区二区三区在线观看| 欧美一区二区三区成人| 秋霞午夜av一区二区三区| 欧美一区二区视频在线观看 | 亚洲午夜精品网| 欧美色欧美亚洲另类二区| 玉足女爽爽91| 欧美精品乱码久久久久久按摩| 亚洲一区二区三区在线播放| 欧美日韩国产中文| 日韩福利视频导航| 2020国产精品自拍| 成人激情免费视频| 亚洲无人区一区| 制服丝袜国产精品| 国产一区二区三区精品欧美日韩一区二区三区| 精品国产一二三区| 成人sese在线| 亚洲电影欧美电影有声小说| 91麻豆精品久久久久蜜臀| 国产在线视视频有精品| 国产精品成人免费精品自在线观看| 91在线播放网址| 青青草原综合久久大伊人精品优势 | 日韩欧美一区二区三区在线| 国产一区二区三区香蕉| 欧美国产日本韩| 欧美丰满高潮xxxx喷水动漫| 国产成人精品亚洲午夜麻豆| 亚洲欧洲日韩av| 欧美一二三区在线| 北条麻妃国产九九精品视频| 亚洲成人动漫在线免费观看| 久久久亚洲午夜电影| 色av一区二区| 国产精品 日产精品 欧美精品| 亚洲美女少妇撒尿| 欧美精品一区二区三区在线播放| 99久久精品免费看国产免费软件| 日韩高清一区二区| 亚洲免费观看高清完整版在线 | 在线观看91精品国产入口| 蜜桃视频第一区免费观看| 亚洲欧洲日本在线| 精品福利一二区| 欧美精品vⅰdeose4hd| 成人精品小蝌蚪| 国内一区二区在线| 亚洲成人你懂的| 亚洲摸摸操操av| 国产欧美一区二区精品秋霞影院| 欧美日韩国产中文| 91久久国产综合久久| 高清不卡在线观看av| 精品伊人久久久久7777人| 亚洲chinese男男1069| 国产精品美女久久久久av爽李琼| 日韩欧美在线综合网| 欧美自拍丝袜亚洲| 97se亚洲国产综合自在线不卡| 黄色成人免费在线| 蜜桃在线一区二区三区| 香蕉成人啪国产精品视频综合网| 自拍偷自拍亚洲精品播放| 国产欧美日韩三区| 久久中文娱乐网| 日韩一二三区不卡| 欧美肥妇bbw| 欧美一区二区三区四区高清| 欧美色大人视频| 欧美天堂亚洲电影院在线播放| 91视频国产观看| 99视频一区二区| 91亚洲精品久久久蜜桃| av成人免费在线观看| 成人免费av网站| 波多野结衣精品在线| 风流少妇一区二区| 成人黄色综合网站| av电影天堂一区二区在线| a美女胸又www黄视频久久| zzijzzij亚洲日本少妇熟睡| 91亚洲国产成人精品一区二三| 成人av电影在线播放| 成人av在线影院| 丁香婷婷综合五月| 成人一级视频在线观看| 不卡的av网站| 在线观看91视频| 3d动漫精品啪啪一区二区竹菊| 日韩精品一区在线| 久久一二三国产| 中文字幕永久在线不卡| 亚洲精品国产成人久久av盗摄| 亚洲黄色片在线观看| 天天综合色天天综合色h| 日产欧产美韩系列久久99| 久久精品国产**网站演员| 国产一区二区精品在线观看| 风间由美一区二区av101| 91美女在线看| 欧美一区日韩一区| 国产日韩欧美激情| 亚洲欧美日韩在线| 亚洲成人av免费| 国产乱码精品一区二区三| 99国产欧美另类久久久精品| 91精彩视频在线观看| 日韩欧美精品在线视频| 国产精品久久99| 爽好久久久欧美精品| 韩国精品在线观看| 色综合欧美在线| 精品国产3级a| 亚洲国产日韩a在线播放性色| 久久99久久99| 日本电影欧美片| 久久尤物电影视频在线观看| 亚洲欧美一区二区三区极速播放 | 成人a区在线观看| 欧美日本一道本在线视频| 亚洲精品一区二区三区99| 一区二区三区四区国产精品| 九九久久精品视频| 欧美性生活久久| 国产午夜亚洲精品理论片色戒| 一区二区三区在线视频观看| 精品一区二区免费在线观看| 色婷婷综合久久久久中文 | 99r国产精品| 五月婷婷综合在线| 欧美日韩亚洲综合在线 欧美亚洲特黄一级 | 欧美精品第1页| 亚洲自拍偷拍九九九| 99久久精品国产导航| 国产精品成人免费在线| 99久久精品久久久久久清纯| 久久久91精品国产一区二区精品| 精品一区二区三区视频在线观看| 日韩欧美二区三区| 久久99精品久久只有精品| 久久精品在线免费观看| 国产精品正在播放| 久久久国产一区二区三区四区小说| 国产自产视频一区二区三区| 久久一区二区三区国产精品| 国产成人av影院| 日韩美女啊v在线免费观看| 色综合久久久网| 亚洲国产日韩一级| 91.成人天堂一区| 韩日精品视频一区| 中文字幕二三区不卡| av一区二区三区四区| 一区二区三区在线免费视频| 精品视频全国免费看| 久久成人麻豆午夜电影| 国产精品沙发午睡系列990531| 成人国产亚洲欧美成人综合网| 最新日韩av在线| 欧美三级一区二区| 激情五月婷婷综合网| 国产精品国产a| 91精品一区二区三区在线观看| 国产一区二区三区视频在线播放| 中文字幕欧美一区|