#apply
#include "../_include.txt"
#include "../../define/_vector2.txt"
#include "../../define/_const_pinball.txt"

/*
@param
玉ID(0-1)
衝突時間
玉の中心点x
y
法線x
y
衝突対象の速度x
y
転がり係数
反射係数

@return
反射の勢い(0:反射しなかった)
*/

cev[CEV_PB_BALL_REFLECTION] .name(">>>玉の反射") {
    defv {
        r_dot = TV_RETURN

        a_id = TV_PB_BALL_REFLECTION
        a_time
        a_cx
        a_cy
        a_nx
        a_ny
        a_wx
        a_wy
        a_fri
        a_ref

        ptr
        cur
        dot
        ax
        ay
    }

    getBallPtr(ptr, a_id)

    //回転速度
    cur = v[ptr + MB_SPIN]
    dot = (a_nx * v[ptr + MB_VY] - a_ny * v[ptr + MB_VX]) / UNIT_NORMAL//cross

    dot = muldiv(dot, UNIT_LOOP, BA_RADxUNIT * 2 * 3)//3≒pi
    dot = clamp(dot - cur, -BA_ACC_SPIN, BA_ACC_SPIN)//速度を拘束する
    v[ptr + MB_SPIN] = clamp(dot + cur, -BA_MAX_SPIN, BA_MAX_SPIN)

    //反射
    getReflection(ax, ay, dot,
    v[ptr + MB_VX], v[ptr + MB_VY], a_nx, a_ny, a_wx, a_wy, a_fri, a_ref)

    //反射方向が壁の方向を向いていた場合、無視する
    @if dot <= 0 bl {
        //内積
        r_dot = dot
        //速度制限
        V2_clampMag(ax, maxVelocity)
        //代入
        v[ptr + MB_VX] = ax
        v[ptr + MB_VY] = ay
        //余った時間分動かし、法線方向に補正する
        v[ptr + MB_NX] = a_cx + muldiv(v[ptr + MB_VX], UNIT_SECOND - a_time, UNIT_SECOND) + muldiv(a_nx, BA_REF_CORRECT, UNIT_NORMAL)
        v[ptr + MB_NY] = a_cy + muldiv(v[ptr + MB_VY], UNIT_SECOND - a_time, UNIT_SECOND) + muldiv(a_nx, BA_REF_CORRECT, UNIT_NORMAL)
    } .else bl {
        r_dot = 0
    }
}