#include "jp/ggaf/lib/util/ColliAAPrism.h"

#include "jp/ggaf/lib/util/StgUtil.h"

using namespace GgafCore;
using namespace GgafDxCore;
using namespace GgafLib;

ColliAAPrism::ColliAAPrism() : ColliAAB() {
    _pos_prism = 0;
    _shape_kind = COLLI_AAPRISM;
    _a = 0;
    _b = 0;
    _vIH_x = 0;
    _vIH_y = 0;
}

void ColliAAPrism::set(int x1, int y1, int z1, int x2, int y2, int z2, int pos_prism, bool rot_x, bool rot_y, bool rot_z) {
    ColliAAB::set(x1, y1, z1, x2, y2, z2, rot_x, rot_y, rot_z);

    //   y  = ax + b
    //   a  = (y2-y1)/(x2-x1)
    //   b  = (x1y2-x2y1) / (x1-x2)

    //   y  = {(y2-y1)/(x2-x1)} (x-x1) + y1
    //+90搙偱朄慄偱峴偙偆
    int x1_s=0, y1_s=0, x2_e=0, y2_e=0;
    _pos_prism = pos_prism;
    if (_pos_prism & POS_PRISM_XY) {
        if (_pos_prism & POS_PRISM_pp) {
            //            仾 y+
            // (_x1,_y2)      (_x2,_y2)
            //        劇劅劅劅劉
            //        劆乢偙偪劆
            // x- 仼  劆  乢傜劆  仺 x+
            //        劆    乢劆
            //        劋劅劅劅劊
            // (_x1,_y1)      (_x2,_y1)
            //            伀 y-
            x1_s = _x2;
            y1_s = _y1;
            x2_e = _x1;
            y2_e = _y2;
        } else if (_pos_prism & POS_PRISM_np) {
            //            仾 y+
            // (_x1,_y2)      (_x2,_y2)
            //        劇劅劅劅劉
            //        劆偙偪乛劆
            // x- 仼  劆傜乛  劆  仺 x+
            //        劆乛    劆
            //        劋劅劅劅劊
            // (_x1,_y1)      (_x2,_y1)
            //            伀 y-
            x1_s = _x2;
            y1_s = _y2;
            x2_e = _x1;
            y2_e = _y1;
        } else if (_pos_prism & POS_PRISM_pn) {
            //            仾 y+
            // (_x1,_y2)      (_x2,_y2)
            //        劇劅劅劅劉
            //        劆    乛劆
            // x- 仼  劆  乛偙劆  仺 x+
            //        劆乛偪傜劆
            //        劋劅劅劅劊
            // (_x1,_y1)      (_x2,_y1)
            //            伀 y-
            x1_s = _x1;
            y1_s = _y1;
            x2_e = _x2;
            y2_e = _y2;
        } else { // 偺偙傝偼 POS_PRISM_nn
            //            仾 y+
            // (_x1,_y2)      (_x2,_y2)
            //        劇劅劅劅劉
            //        劆乢    劆
            // x- 仼  劆偙乢  劆  仺 x+
            //        劆偪傜乢劆
            //        劋劅劅劅劊
            // (_x1,_y1)      (_x2,_y1)
            //            伀 y-
            x1_s = _x1;
            y1_s = _y2;
            x2_e = _x2;
            y2_e = _y1;
        }


    } else if (_pos_prism & POS_PRISM_YZ) {

        if (_pos_prism & POS_PRISM_pp) {
            //            仾 z+
            // (_y1,_z2)      (_y2,_z2)
            //        劇劅劅劅劉
            //        劆乢偙偪劆
            // y- 仼  劆  乢傜劆  仺 y+
            //        劆    乢劆
            //        劋劅劅劅劊
            // (_y1,_z1)      (_y2,_z1)
            //            伀 z-
            x1_s = _y2;
            y1_s = _z1;
            x2_e = _y1;
            y2_e = _z2;
        } else if (_pos_prism & POS_PRISM_np) {
            //            仾 z+
            // (_y1,_z2)      (_y2,_z2)
            //        劇劅劅劅劉
            //        劆偙偪乛劆
            // y- 仼  劆傜乛  劆  仺 y+
            //        劆乛    劆
            //        劋劅劅劅劊
            // (_y1,_z1)      (_y2,_z1)
            //            伀 z-
            x1_s = _y2;
            y1_s = _z2;
            x2_e = _y1;
            y2_e = _z1;
        } else if (_pos_prism & POS_PRISM_pn) {
            //            仾 z+
            // (_y1,_z2)      (_y2,_z2)
            //        劇劅劅劅劉
            //        劆    乛劆
            // y- 仼  劆  乛偙劆  仺 y+
            //        劆乛偪傜劆
            //        劋劅劅劅劊
            // (_y1,_z1)      (_y2,_z1)
            //            伀 z-
            x1_s = _y1;
            y1_s = _z1;
            x2_e = _y2;
            y2_e = _z2;
        } else { // 偺偙傝偼 POS_PRISM_nn
            //            仾 z+
            // (_y1,_z2)      (_y2,_z2)
            //        劇劅劅劅劉
            //        劆乢    劆
            // y- 仼  劆偙乢  劆  仺 y+
            //        劆偪傜乢劆
            //        劋劅劅劅劊
            // (_y1,_z1)      (_y2,_z1)
            //            伀 z-
            x1_s = _y1;
            y1_s = _z2;
            x2_e = _y2;
            y2_e = _z1;
        }

    } else if (_pos_prism & POS_PRISM_ZX) {
        if (_pos_prism & POS_PRISM_pp) {
            //            仾 x+
            // (_z1,_x2)      (_z2,_x2)
            //        劇劅劅劅劉
            //        劆乢偙偪劆
            // z- 仼  劆  乢傜劆  仺 z+
            //        劆    乢劆
            //        劋劅劅劅劊
            // (_z1,_x1)      (_z2,_x1)
            //            伀 x-
            x1_s = _z2;
            y1_s = _x1;
            x2_e = _z1;
            y2_e = _x2;
        } else if (_pos_prism & POS_PRISM_np) {
            //            仾 x+
            // (_z1,_x2)      (_z2,_x2)
            //        劇劅劅劅劉
            //        劆偙偪乛劆
            // z- 仼  劆傜乛  劆  仺 z+
            //        劆乛    劆
            //        劋劅劅劅劊
            // (_z1,_x1)      (_z2,_x1)
            //            伀 x-
            x1_s = _z2;
            y1_s = _x2;
            x2_e = _z1;
            y2_e = _x1;
        } else if (_pos_prism & POS_PRISM_pn) {
            //            仾 x+
            // (_z1,_x2)      (_z2,_x2)
            //        劇劅劅劅劉
            //        劆    乛劆
            // z- 仼  劆  乛偙劆  仺 z+
            //        劆乛偪傜劆
            //        劋劅劅劅劊
            // (_z1,_x1)      (_z2,_x1)
            //            伀 x-
            x1_s = _z1;
            y1_s = _x1;
            x2_e = _z2;
            y2_e = _x2;
        } else { // 偺偙傝偼 POS_PRISM_nn
            //            仾 x+
            // (_z1,_x2)      (_z2,_x2)
            //        劇劅劅劅劉
            //        劆乢    劆
            // z- 仼  劆偙乢  劆  仺 z+
            //        劆偪傜乢劆
            //        劋劅劅劅劊
            // (_z1,_x1)      (_z2,_x1)
            //            伀 x-
            x1_s = _z1;
            y1_s = _x2;
            x2_e = _z2;
            y2_e = _x1;
        }
    } else {
        //memo WallAAPrismActor 偺 嬻new帪偼僾儕僘儉埵抲 0 偵偡傞偙偲偲偟偨偺偱丄
        //埲壓偺僄儔乕偼僗儖乕偡傞傛偆偵曄峏偟偨丅

        //throwGgafCriticalException("ColliAAPrism::set 偍偐偟側僾儕僘儉埵抲 _pos_prism="<<_pos_prism)
    }

    //摉偨傝敾掕帪偵巊梡偡傞寁嶼梡偺抣傪梊傔媮傔偰偍偔丅
    if (x2_e == x1_s) {
        _a = 0;
        _b = 0;
    } else {
        //僾儕僘儉幬曈偺嫬奅慄孹偒
        _a = 1.0*(y2_e - y1_s) / (x2_e - x1_s);
        //僾儕僘儉幬曈偺嫬奅慄偺愗曅
        _b = (x1_s*y2_e - x2_e*y1_s) / (x1_s - x2_e);
    }
    //偁偲偱寁嶼偑妝偵側傞偨傔丄
    //僾儕僘儉幬曈柺偺朄慄儀僋僩儖偺媡曽岦偺儀僋僩儖 _vIH_x, _vIH_y傪媮傔偰偍偔
    //幬曈儀僋僩儖(x2_e-x1_s, y2_e-y1_s)偵90搙壛偊傞偲
    //幬曈柺偺朄慄儀僋僩儖偲側傞傛偆偵偟偰偁傞丅
    //偙偙偱曐帩偟偰偍偒偨偄偺偼-90搙(+270搙)偺儀僋僩儖偱偁傞
    angle angIH = UTIL::simplifyAng(
        UTIL::getAngle2D(x2_e-x1_s, y2_e-y1_s)
        + D270ANG
        );
    _vIH_x = UTIL::COS[angIH/SANG_RATE];
    _vIH_y = UTIL::SIN[angIH/SANG_RATE];

}


ColliAAPrism::~ColliAAPrism() {
}
