mirror of
				https://git.zaroz.cloud/nintendo-back-up/yuzu/yuzu-mainline.git
				synced 2025-03-21 01:53:15 +00:00 
			
		
		
		
	Common: add Quaternion
This commit is contained in:
		
							parent
							
								
									2e6d8e1321
								
							
						
					
					
						commit
						6479f63091
					
				@ -46,6 +46,7 @@ set(HEADERS
 | 
			
		||||
            microprofileui.h
 | 
			
		||||
            platform.h
 | 
			
		||||
            profiler_reporting.h
 | 
			
		||||
            quaternion.h
 | 
			
		||||
            scm_rev.h
 | 
			
		||||
            scope_exit.h
 | 
			
		||||
            string_util.h
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										44
									
								
								src/common/quaternion.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								src/common/quaternion.h
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,44 @@
 | 
			
		||||
// Copyright 2016 Citra Emulator Project
 | 
			
		||||
// Licensed under GPLv2 or any later version
 | 
			
		||||
// Refer to the license.txt file included.
 | 
			
		||||
 | 
			
		||||
#pragma once
 | 
			
		||||
 | 
			
		||||
#include "common/vector_math.h"
 | 
			
		||||
 | 
			
		||||
namespace Math {
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
class Quaternion {
 | 
			
		||||
public:
 | 
			
		||||
    Math::Vec3<T> xyz;
 | 
			
		||||
    T w;
 | 
			
		||||
 | 
			
		||||
    Quaternion<decltype(-T{})> Inverse() const {
 | 
			
		||||
        return {-xyz, w};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Quaternion<decltype(T{} + T{})> operator+(const Quaternion& other) const {
 | 
			
		||||
        return {xyz + other.xyz, w + other.w};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Quaternion<decltype(T{} - T{})> operator-(const Quaternion& other) const {
 | 
			
		||||
        return {xyz - other.xyz, w - other.w};
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Quaternion<decltype(T{} * T{} - T{} * T{})> operator*(const Quaternion& other) const {
 | 
			
		||||
        return {xyz * other.w + other.xyz * w + Cross(xyz, other.xyz),
 | 
			
		||||
                w * other.w - Dot(xyz, other.xyz)};
 | 
			
		||||
    }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
template <typename T>
 | 
			
		||||
auto QuaternionRotate(const Quaternion<T>& q, const Math::Vec3<T>& v) {
 | 
			
		||||
    return v + 2 * Cross(q.xyz, Cross(q.xyz, v) + v * q.w);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
inline Quaternion<float> MakeQuaternion(const Math::Vec3<float>& axis, float angle) {
 | 
			
		||||
    return {axis * std::sin(angle / 2), std::cos(angle / 2)};
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
} // namspace Math
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user