This repository has been archived on 2023-10-09. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
blender-archive/extern/mantaflow/helper/util/quaternion.h
Sebastián Barschkis 4ff7c5eed6 Mantaflow [Part 1]: Added preprocessed Mantaflow source files
Includes preprocessed Mantaflow source files for both OpenMP and TBB (if OpenMP is not present, TBB files will be used instead).

These files come directly from the Mantaflow repository. Future updates to the core fluid solver will take place by updating the files.

Reviewed By: sergey, mont29

Maniphest Tasks: T59995

Differential Revision: https://developer.blender.org/D3850
2019-12-16 16:27:26 +01:00

104 lines
2.2 KiB
C++

/******************************************************************************
*
* MantaFlow fluid solver framework
* Copyright 2011 Tobias Pfaff, Nils Thuerey
*
* This program is free software, distributed under the terms of the
* Apache License, Version 2.0
* http://www.apache.org/licenses/LICENSE-2.0
*
* Basic quaternion class
*
******************************************************************************/
#ifndef _QUATERNION_H
#define _QUATERNION_H
#include "vectorbase.h"
namespace Manta {
//! Very basic quaternion class
class Quaternion {
public:
//! default constructor
Quaternion() : x(0), y(0), z(0), w(0)
{
}
//! copy constructor
Quaternion(const Quaternion &q) : x(q.x), y(q.y), z(q.z), w(q.w)
{
}
//! construct a quaternion from members
Quaternion(Real _x, Real _y, Real _z, Real _w) : x(_x), y(_y), z(_z), w(_w)
{
}
//! construct a quaternion from imag/real parts
Quaternion(Vec3 i, Real r) : x(i.x), y(i.y), z(i.z), w(r)
{
}
//! Assign operator
inline Quaternion &operator=(const Quaternion &q)
{
x = q.x;
y = q.y;
z = q.z;
w = q.w;
return *this;
}
//! Assign multiplication operator
inline Quaternion &operator*=(const Real a)
{
x *= a;
y *= a;
z *= a;
w *= a;
return *this;
}
//! return inverse quaternion
inline Quaternion inverse() const
{
Real mag = 1.0 / (x * x + y * y + z * z + w * w);
return Quaternion(-x * mag, -y * mag, -z * mag, w * mag);
}
//! imaginary part accessor
inline Vec3 imag()
{
return Vec3(x, y, z);
}
// imaginary part
Real x;
Real y;
Real z;
// real part
Real w;
};
//! Multiplication operator
inline Quaternion operator*(const Quaternion &q1, const Quaternion &q2)
{
return Quaternion(q2.w * q1.x + q2.x * q1.w + q2.y * q1.z - q2.z * q1.y,
q2.w * q1.y + q2.y * q1.w + q2.z * q1.x - q2.x * q1.z,
q2.w * q1.z + q2.z * q1.w + q2.x * q1.y - q2.y * q1.x,
q2.w * q1.w - q2.x * q1.x - q2.y * q1.y - q2.z * q1.z);
}
//! Multiplication operator
inline Quaternion operator*(const Quaternion &q, const Real a)
{
return Quaternion(q.x * a, q.y * a, q.z * a, q.w * a);
}
} // namespace Manta
#endif