mirror of
				https://github.com/DarkflameUniverse/DarkflameServer.git
				synced 2025-10-31 20:52:01 +00:00 
			
		
		
		
	 a0d51e21ca
			
		
	
	a0d51e21ca
	
	
	
		
			
			* allow usage of NiPoint3 and NiQuaternion in constexpr context * removed .cpp files entirely * moving circular dependency circumvention stuff to an .inl file * real world usage!!!!! * reverting weird branch cross-pollination * removing more weird branch cross-pollination * remove comment * added inverse header guard to inl file * Update NiPoint3.inl * trying different constructor syntax * reorganize into .inl files for readability * uncomment include * moved non-constexpr definitions to cpp file * moved static definitions back to inl files * testing fix * moved constants into seperate namespace * Undo change in build-and-test.yml * nodiscard
		
			
				
	
	
		
			205 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			205 lines
		
	
	
		
			5.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| #ifndef __NIPOINT3_H__
 | |
| #define __NIPOINT3_H__
 | |
| 
 | |
| /*!
 | |
|   \file NiPoint3.hpp
 | |
|   \brief Defines a point in space in XYZ coordinates
 | |
|  */
 | |
| 
 | |
| class NiPoint3;
 | |
| class NiQuaternion;
 | |
| typedef NiPoint3 Vector3;       //!< The Vector3 class is technically the NiPoint3 class, but typedef'd for clarity in some cases
 | |
| 
 | |
| //! A custom class the defines a point in space
 | |
| class NiPoint3 {
 | |
| public:
 | |
| 	float x{ 0 };            //!< The x position
 | |
| 	float y{ 0 };            //!< The y position
 | |
| 	float z{ 0 };            //!< The z position
 | |
| 
 | |
| 
 | |
| 	//! Initializer
 | |
| 	constexpr NiPoint3() = default;
 | |
| 
 | |
| 	//! Initializer
 | |
| 	/*!
 | |
| 	  \param x The x coordinate
 | |
| 	  \param y The y coordinate
 | |
| 	  \param z The z coordinate
 | |
| 	 */
 | |
| 	constexpr NiPoint3(const float x, const float y, const float z) noexcept
 | |
| 		: x{ x }
 | |
| 		, y{ y }
 | |
| 		, z{ z } {
 | |
| 	}
 | |
| 
 | |
| 	//! Copy Constructor
 | |
| 	/*!
 | |
| 	  \param point The point to copy
 | |
| 	 */
 | |
| 	constexpr NiPoint3(const NiPoint3& point) noexcept
 | |
| 		: x{ point.x }
 | |
| 		, y{ point.y }
 | |
| 		, z{ point.z } {
 | |
| 	}
 | |
| 
 | |
| 	// MARK: Getters / Setters
 | |
| 
 | |
| 	//! Gets the X coordinate
 | |
| 	/*!
 | |
| 	  \return The x coordinate
 | |
| 	 */
 | |
| 	[[nodiscard]] constexpr float GetX() const noexcept;
 | |
| 
 | |
| 	//! Sets the X coordinate
 | |
| 	/*!
 | |
| 	  \param x The x coordinate
 | |
| 	 */
 | |
| 	constexpr void SetX(const float x) noexcept;
 | |
| 
 | |
| 	//! Gets the Y coordinate
 | |
| 	/*!
 | |
| 	  \return The y coordinate
 | |
| 	 */
 | |
| 	[[nodiscard]] constexpr float GetY() const noexcept;
 | |
| 
 | |
| 	//! Sets the Y coordinate
 | |
| 	/*!
 | |
| 	  \param y The y coordinate
 | |
| 	 */
 | |
| 	constexpr void SetY(const float y) noexcept;
 | |
| 
 | |
| 	//! Gets the Z coordinate
 | |
| 	/*!
 | |
| 	  \return The z coordinate
 | |
| 	 */
 | |
| 	[[nodiscard]] constexpr float GetZ() const noexcept;
 | |
| 
 | |
| 	//! Sets the Z coordinate
 | |
| 	/*!
 | |
| 	  \param z The z coordinate
 | |
| 	 */
 | |
| 	constexpr void SetZ(const float z) noexcept;
 | |
| 
 | |
| 	// MARK: Member Functions
 | |
| 
 | |
| 	//! Gets the length of the vector
 | |
| 	/*!
 | |
| 	  \return The scalar length of the vector
 | |
| 	 */
 | |
| 	[[nodiscard]] float Length() const;
 | |
| 
 | |
| 	//! Gets the squared length of a vector
 | |
| 	/*!
 | |
| 	  \return The squared length of a vector
 | |
| 	 */
 | |
| 	[[nodiscard]] constexpr float SquaredLength() const noexcept;
 | |
| 
 | |
| 	//! Returns the dot product of the vector dotted with another vector
 | |
| 	/*!
 | |
| 	  \param vec The second vector
 | |
| 	  \return The dot product of the two vectors
 | |
| 	 */
 | |
| 	[[nodiscard]] constexpr float DotProduct(const Vector3& vec) const noexcept;
 | |
| 
 | |
| 	//! Returns the cross product of the vector crossed with another vector
 | |
| 	/*!
 | |
| 	  \param vec The second vector
 | |
| 	  \return The cross product of the two vectors
 | |
| 	 */
 | |
| 	[[nodiscard]] constexpr Vector3 CrossProduct(const Vector3& vec) const noexcept;
 | |
| 
 | |
| 	//! Unitize the vector
 | |
| 	/*!
 | |
| 	  \returns The current vector
 | |
| 	 */
 | |
| 	[[nodiscard]] NiPoint3 Unitize() const;
 | |
| 
 | |
| 	// MARK: Operators
 | |
| 
 | |
| 	//! Operator to check for equality
 | |
| 	constexpr bool operator==(const NiPoint3& point) const noexcept;
 | |
| 
 | |
| 	//! Operator to check for inequality
 | |
| 	constexpr bool operator!=(const NiPoint3& point) const noexcept;
 | |
| 
 | |
| 	//! Operator for subscripting
 | |
| 	constexpr float& operator[](const int i) noexcept;
 | |
| 
 | |
| 	//! Operator for subscripting
 | |
| 	constexpr const float& operator[](const int i) const noexcept;
 | |
| 
 | |
| 	//! Operator for addition of vectors
 | |
| 	constexpr NiPoint3 operator+(const NiPoint3& point) const noexcept;
 | |
| 
 | |
| 	//! Operator for addition of vectors
 | |
| 	constexpr NiPoint3& operator+=(const NiPoint3& point) noexcept;
 | |
| 
 | |
| 	constexpr NiPoint3& operator*=(const float scalar) noexcept;
 | |
| 
 | |
| 	//! Operator for subtraction of vectors
 | |
| 	constexpr NiPoint3 operator-(const NiPoint3& point) const noexcept;
 | |
| 
 | |
| 	//! Operator for addition of a scalar on all vector components
 | |
| 	constexpr NiPoint3 operator+(const float fScalar) const noexcept;
 | |
| 
 | |
| 	//! Operator for subtraction of a scalar on all vector components
 | |
| 	constexpr NiPoint3 operator-(const float fScalar) const noexcept;
 | |
| 
 | |
| 	//! Operator for scalar multiplication of a vector
 | |
| 	constexpr NiPoint3 operator*(const float fScalar) const noexcept;
 | |
| 
 | |
| 	//! Operator for scalar division of a vector
 | |
| 	constexpr NiPoint3 operator/(const float fScalar) const noexcept;
 | |
| 
 | |
| 	// MARK: Helper Functions
 | |
| 
 | |
| 	//! Checks to see if the point (or vector) is with an Axis-Aligned Bounding Box
 | |
| 	/*!
 | |
| 	  \param minPoint The minimum point of the bounding box
 | |
| 	  \param maxPoint The maximum point of the bounding box
 | |
| 	  \return Whether or not this point lies within the box
 | |
| 	 */
 | |
| 	[[nodiscard]] constexpr bool IsWithinAxisAlignedBox(const NiPoint3& minPoint, const NiPoint3& maxPoint) noexcept;
 | |
| 
 | |
| 	//! Checks to see if the point (or vector) is within a sphere
 | |
| 	/*!
 | |
| 	  \param sphereCenter The sphere center
 | |
| 	  \param radius The radius
 | |
| 	 */
 | |
| 	[[nodiscard]] constexpr bool IsWithinSphere(const NiPoint3& sphereCenter, const float radius) noexcept;
 | |
| 
 | |
| 	/*!
 | |
| 	  \param a Start of line
 | |
| 	  \param b End of line
 | |
| 	  \param p Refrence point
 | |
| 	  \return The point of line AB which is closest to P
 | |
| 	*/
 | |
| 	[[nodiscard]] static constexpr NiPoint3 ClosestPointOnLine(const NiPoint3& a, const NiPoint3& b, const NiPoint3& p) noexcept;
 | |
| 
 | |
| 	[[nodiscard]] static float Angle(const NiPoint3& a, const NiPoint3& b);
 | |
| 
 | |
| 	[[nodiscard]] static float Distance(const NiPoint3& a, const NiPoint3& b);
 | |
| 
 | |
| 	[[nodiscard]] static constexpr float DistanceSquared(const NiPoint3& a, const NiPoint3& b) noexcept;
 | |
| 
 | |
| 	[[nodiscard]] static NiPoint3 MoveTowards(const NiPoint3& current, const NiPoint3& target, const float maxDistanceDelta);
 | |
| 
 | |
| 	//This code is yoinked from the MS XNA code, so it should be right, even if it's horrible.
 | |
| 	[[nodiscard]] constexpr NiPoint3 RotateByQuaternion(const NiQuaternion& rotation) noexcept;
 | |
| };
 | |
| 
 | |
| // Static Variables
 | |
| namespace NiPoint3Constant {
 | |
| 	constexpr NiPoint3 ZERO(0.0f, 0.0f, 0.0f);
 | |
| 	constexpr NiPoint3 UNIT_X(1.0f, 0.0f, 0.0f);
 | |
| 	constexpr NiPoint3 UNIT_Y(0.0f, 1.0f, 0.0f);
 | |
| 	constexpr NiPoint3 UNIT_Z(0.0f, 0.0f, 1.0f);
 | |
| 	constexpr NiPoint3 UNIT_ALL(1.0f, 1.0f, 1.0f);
 | |
| }
 | |
| 
 | |
| // .inl file needed for code organization and to circumvent circular dependency issues
 | |
| #include "NiPoint3.inl"
 | |
| 
 | |
| #endif // !__NIPOINT3_H__
 |