///////////////////////////////////////////////////////////////////////////////
//  SPlane.h

#pragma once

#include "S3D.h"

struct SPlane {
	float	fA, fB, fC, fD;

public:
	SPlane(void);
	SPlane(float fA_, float fB_, float fC_, float fD_);
	SPlane(const S3D& pos, const S3D& vecN);
	SPlane(const S3D& pos1, const S3D& pos2, const S3D& pos3);

	bool CalcIntersectSegment(const S3D& Pos1, const S3D& Pos2, S3D& IntersectPos) const;
	bool CalcIntersectVector(const S3D& Pos, const S3D& Vector, S3D& IntersectPos) const;

	bool	TestFrontPos(const S3D& Pos) const;

	static S3D	CalcNormal(const S3D& vtx1, const S3D& vtx2, const S3D& vtx3);

	static bool	LinePolyCrossPoint(S3D pos1, S3D vec1, S3D pos2, S3D vec2, S3D& pos);

	static bool PointTriangleSide(S3D pos1, S3D pos2, S3D pos3, S3D pos, S3D normal);
	static bool PointPolygonSide(S3D pos1, S3D pos2, S3D pos3, S3D pos4, S3D pos, S3D normal);

	// 平面と点の表裏判定
	static bool PointPolySide(const S3D& pos, const S3D& posPlane, const S3D& vecN);

	// 平面と点の距離
	static float CalcDistance(const S3D& pos, const S3D& posPlane, const S3D& vecN);
	static float CalcHeight(S3D pos, S3D posPlane, S3D vecN);

	// 重心座標計算
	static void CalcCenterGravity(S3D pos0, S3D pos1, S3D pos2, S3D pos, float& M0, float& M1, float& M2);

	// 反射ベクトルを求める
	static S3D CalcMirrorVector(const S3D& v, const S3D& N);
};

