Fichier source en cours : FW - AABB.h






Voici le code source cpp :




	#ifndef AXIS_ALIGNED_BOUNDING_BOX_H
#define AXIS_ALIGNED_BOUNDING_BOX_H

namespace fw
{
	struct Ray
	{
		D3DXVECTOR3 x0;
		D3DXVECTOR3 n;
		/* On spécifie l'inverse de n pour rendre le calcul plus rapide
			c'est-à-dire opéré sans division */
		D3DXVECTOR3 n_inv;
	};

	class AABB
	{
	public:
		AABB();
		AABB(const D3DXVECTOR3& min, const D3DXVECTOR3& max);

		virtual ~AABB();

		// Stocke tous les 8 côtés de la box dans le tableau
		void GetEdges(std::vector<D3DXVECTOR3>& edges);

		D3DXVECTOR3 GetCenter();

		void Reset(float x, float y, float z);
		void Reset(const D3DXVECTOR3& initValue);

		void AddInternalPoint(float x, float y, float z);
		void AddInternalPoint(const D3DXVECTOR3& p);

		// Extent : distance maximale entre deux points de la box
		D3DXVECTOR3 GetExtent() const;

		// Renvoie le volume en unité de cube
		float GetVolume();

		const D3DXVECTOR3& GetMin() const ;
		const D3DXVECTOR3& GetMax() const;

		void Translate(const D3DXVECTOR3& translate);
		void Scale(const D3DXVECTOR3& scale);

		/*
		Aide à la lecture :

		AABB : Une Aligned Axis Bounding Box
		Ray : Un rayon lancé depuis n'importe où

		t : la position d'un segment à certain point
		x0 : un point d'un segment (ici en l'occurence l'origine)
		n : la direction du vecteur du segment
		tmin, tmax : les valeurs de t pour les deux points d'intersections

		http://www.scratchapixel.com/lessons/3d-basic-rendering/minimal-ray-tracer-rendering-simple-shapes/ray-box-intersection

		*/
		bool Intersects(const Ray& r);

		void Repair();

		void Transform(const D3DXMATRIX& mat);

		bool Contains(const AABB& other);

	private:
		// Le côté proche
		D3DXVECTOR3 m_minEdge;
		// Le côté lointain
		D3DXVECTOR3 m_maxEdge;
	};
}

#endif