mirror of
				https://github.com/godotengine/godot.git
				synced 2025-10-31 05:31:01 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			233 lines
		
	
	
	
		
			4.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			233 lines
		
	
	
	
		
			4.9 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* -----------------------------------------------------------------------------
 | |
| 
 | |
|     Copyright (c) 2006 Simon Brown                          si@sjbrown.co.uk
 | |
| 
 | |
|     Permission is hereby granted, free of charge, to any person obtaining
 | |
|     a copy of this software and associated documentation files (the
 | |
|     "Software"), to deal in the Software without restriction, including
 | |
|     without limitation the rights to use, copy, modify, merge, publish,
 | |
|     distribute, sublicense, and/or sell copies of the Software, and to
 | |
|     permit persons to whom the Software is furnished to do so, subject to
 | |
|     the following conditions:
 | |
| 
 | |
|     The above copyright notice and this permission notice shall be included
 | |
|     in all copies or substantial portions of the Software.
 | |
| 
 | |
|     THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 | |
|     OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 | |
|     MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 | |
|     IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
 | |
|     CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 | |
|     TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 | |
|     SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 | |
| 
 | |
|    -------------------------------------------------------------------------- */
 | |
| 
 | |
| #ifndef SQUISH_MATHS_H
 | |
| #define SQUISH_MATHS_H
 | |
| 
 | |
| #include <cmath>
 | |
| #include <algorithm>
 | |
| #include "config.h"
 | |
| 
 | |
| namespace squish {
 | |
| 
 | |
| class Vec3
 | |
| {
 | |
| public:
 | |
|     typedef Vec3 const& Arg;
 | |
| 
 | |
|     Vec3()
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     explicit Vec3( float s )
 | |
|     {
 | |
|         m_x = s;
 | |
|         m_y = s;
 | |
|         m_z = s;
 | |
|     }
 | |
| 
 | |
|     Vec3( float x, float y, float z )
 | |
|     {
 | |
|         m_x = x;
 | |
|         m_y = y;
 | |
|         m_z = z;
 | |
|     }
 | |
| 
 | |
|     float X() const { return m_x; }
 | |
|     float Y() const { return m_y; }
 | |
|     float Z() const { return m_z; }
 | |
| 
 | |
|     Vec3 operator-() const
 | |
|     {
 | |
|         return Vec3( -m_x, -m_y, -m_z );
 | |
|     }
 | |
| 
 | |
|     Vec3& operator+=( Arg v )
 | |
|     {
 | |
|         m_x += v.m_x;
 | |
|         m_y += v.m_y;
 | |
|         m_z += v.m_z;
 | |
|         return *this;
 | |
|     }
 | |
| 
 | |
|     Vec3& operator-=( Arg v )
 | |
|     {
 | |
|         m_x -= v.m_x;
 | |
|         m_y -= v.m_y;
 | |
|         m_z -= v.m_z;
 | |
|         return *this;
 | |
|     }
 | |
| 
 | |
|     Vec3& operator*=( Arg v )
 | |
|     {
 | |
|         m_x *= v.m_x;
 | |
|         m_y *= v.m_y;
 | |
|         m_z *= v.m_z;
 | |
|         return *this;
 | |
|     }
 | |
| 
 | |
|     Vec3& operator*=( float s )
 | |
|     {
 | |
|         m_x *= s;
 | |
|         m_y *= s;
 | |
|         m_z *= s;
 | |
|         return *this;
 | |
|     }
 | |
| 
 | |
|     Vec3& operator/=( Arg v )
 | |
|     {
 | |
|         m_x /= v.m_x;
 | |
|         m_y /= v.m_y;
 | |
|         m_z /= v.m_z;
 | |
|         return *this;
 | |
|     }
 | |
| 
 | |
|     Vec3& operator/=( float s )
 | |
|     {
 | |
|         float t = 1.0f/s;
 | |
|         m_x *= t;
 | |
|         m_y *= t;
 | |
|         m_z *= t;
 | |
|         return *this;
 | |
|     }
 | |
| 
 | |
|     friend Vec3 operator+( Arg left, Arg right )
 | |
|     {
 | |
|         Vec3 copy( left );
 | |
|         return copy += right;
 | |
|     }
 | |
| 
 | |
|     friend Vec3 operator-( Arg left, Arg right )
 | |
|     {
 | |
|         Vec3 copy( left );
 | |
|         return copy -= right;
 | |
|     }
 | |
| 
 | |
|     friend Vec3 operator*( Arg left, Arg right )
 | |
|     {
 | |
|         Vec3 copy( left );
 | |
|         return copy *= right;
 | |
|     }
 | |
| 
 | |
|     friend Vec3 operator*( Arg left, float right )
 | |
|     {
 | |
|         Vec3 copy( left );
 | |
|         return copy *= right;
 | |
|     }
 | |
| 
 | |
|     friend Vec3 operator*( float left, Arg right )
 | |
|     {
 | |
|         Vec3 copy( right );
 | |
|         return copy *= left;
 | |
|     }
 | |
| 
 | |
|     friend Vec3 operator/( Arg left, Arg right )
 | |
|     {
 | |
|         Vec3 copy( left );
 | |
|         return copy /= right;
 | |
|     }
 | |
| 
 | |
|     friend Vec3 operator/( Arg left, float right )
 | |
|     {
 | |
|         Vec3 copy( left );
 | |
|         return copy /= right;
 | |
|     }
 | |
| 
 | |
|     friend float Dot( Arg left, Arg right )
 | |
|     {
 | |
|         return left.m_x*right.m_x + left.m_y*right.m_y + left.m_z*right.m_z;
 | |
|     }
 | |
| 
 | |
|     friend Vec3 Min( Arg left, Arg right )
 | |
|     {
 | |
|         return Vec3(
 | |
|             std::min( left.m_x, right.m_x ),
 | |
|             std::min( left.m_y, right.m_y ),
 | |
|             std::min( left.m_z, right.m_z )
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     friend Vec3 Max( Arg left, Arg right )
 | |
|     {
 | |
|         return Vec3(
 | |
|             std::max( left.m_x, right.m_x ),
 | |
|             std::max( left.m_y, right.m_y ),
 | |
|             std::max( left.m_z, right.m_z )
 | |
|         );
 | |
|     }
 | |
| 
 | |
|     friend Vec3 Truncate( Arg v )
 | |
|     {
 | |
|         return Vec3(
 | |
|             v.m_x > 0.0f ? std::floor( v.m_x ) : std::ceil( v.m_x ),
 | |
|             v.m_y > 0.0f ? std::floor( v.m_y ) : std::ceil( v.m_y ),
 | |
|             v.m_z > 0.0f ? std::floor( v.m_z ) : std::ceil( v.m_z )
 | |
|         );
 | |
|     }
 | |
| 
 | |
| private:
 | |
|     float m_x;
 | |
|     float m_y;
 | |
|     float m_z;
 | |
| };
 | |
| 
 | |
| inline float LengthSquared( Vec3::Arg v )
 | |
| {
 | |
|     return Dot( v, v );
 | |
| }
 | |
| 
 | |
| class Sym3x3
 | |
| {
 | |
| public:
 | |
|     Sym3x3()
 | |
|     {
 | |
|     }
 | |
| 
 | |
|     Sym3x3( float s )
 | |
|     {
 | |
|         for( int i = 0; i < 6; ++i )
 | |
|             m_x[i] = s;
 | |
|     }
 | |
| 
 | |
|     float operator[]( int index ) const
 | |
|     {
 | |
|         return m_x[index];
 | |
|     }
 | |
| 
 | |
|     float& operator[]( int index )
 | |
|     {
 | |
|         return m_x[index];
 | |
|     }
 | |
| 
 | |
| private:
 | |
|     float m_x[6];
 | |
| };
 | |
| 
 | |
| Sym3x3 ComputeWeightedCovariance( int n, Vec3 const* points, float const* weights );
 | |
| Vec3 ComputePrincipleComponent( Sym3x3 const& matrix );
 | |
| 
 | |
| } // namespace squish
 | |
| 
 | |
| #endif // ndef SQUISH_MATHS_H
 | 
