diff options
author | saurabhb17 | 2020-02-26 16:20:48 +0530 |
---|---|---|
committer | GitHub | 2020-02-26 16:20:48 +0530 |
commit | b77f5d9d8097c38159c6f60917995d6af13bbe1c (patch) | |
tree | 1392c90227aeea231c1d86371131e04c40382918 /include/gal | |
parent | dadc4d490966a24efe15b5cc533ef8695986048a (diff) | |
parent | 003d02608917e7a69d1a98438837e94ccf68352a (diff) | |
download | KiCad-eSim-b77f5d9d8097c38159c6f60917995d6af13bbe1c.tar.gz KiCad-eSim-b77f5d9d8097c38159c6f60917995d6af13bbe1c.tar.bz2 KiCad-eSim-b77f5d9d8097c38159c6f60917995d6af13bbe1c.zip |
Merge pull request #4 from FOSSEE/develop
merging dev into master
Diffstat (limited to 'include/gal')
241 files changed, 55521 insertions, 0 deletions
diff --git a/include/gal/cairo/cairo_compositor.h b/include/gal/cairo/cairo_compositor.h new file mode 100644 index 0000000..6d5d74a --- /dev/null +++ b/include/gal/cairo/cairo_compositor.h @@ -0,0 +1,127 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2013 CERN + * @author Maciej Suminski <maciej.suminski@cern.ch> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/** + * @file cairo_compositor.h + * @brief Class that handles multitarget rendering (ie. to different textures/surfaces) and + * later compositing into a single image (Cairo flavour). + */ + +#ifndef CAIRO_COMPOSITOR_H_ +#define CAIRO_COMPOSITOR_H_ + +#include <gal/compositor.h> +#include <cairo.h> +#include <boost/smart_ptr/shared_array.hpp> +#include <deque> + +namespace KIGFX +{ +class CAIRO_COMPOSITOR : public COMPOSITOR +{ +public: + CAIRO_COMPOSITOR( cairo_t** aMainContext ); + virtual ~CAIRO_COMPOSITOR(); + + /// @copydoc COMPOSITOR::Initialize() + virtual void Initialize(); + + /// @copydoc COMPOSITOR::Resize() + virtual void Resize( unsigned int aWidth, unsigned int aHeight ); + + /// @copydoc COMPOSITOR::CreateBuffer() + virtual unsigned int CreateBuffer(); + + /// @copydoc COMPOSITOR::GetBuffer() + inline virtual unsigned int GetBuffer() const + { + return m_current + 1; + } + + /// @copydoc COMPOSITOR::SetBuffer() + virtual void SetBuffer( unsigned int aBufferHandle ); + + /// @copydoc COMPOSITOR::ClearBuffer() + virtual void ClearBuffer(); + + /// @copydoc COMPOSITOR::DrawBuffer() + virtual void DrawBuffer( unsigned int aBufferHandle ); + + /** + * Function SetMainContext() + * Sets a context to be treated as the main context (ie. as a target of buffers rendering and + * as a source of settings for newly created buffers). + * + * @param aMainContext is the context that should be treated as the main one. + */ + inline virtual void SetMainContext( cairo_t* aMainContext ) + { + m_mainContext = aMainContext; + + // Use the context's transformation matrix + cairo_get_matrix( m_mainContext, &m_matrix ); + } + +protected: + typedef boost::shared_array<unsigned int> BitmapPtr; + typedef struct + { + cairo_t* context; ///< Main texture handle + cairo_surface_t* surface; ///< Point to which an image from texture is attached + BitmapPtr bitmap; ///< Pixel storage + } CAIRO_BUFFER; + + unsigned int m_current; ///< Currently used buffer handle + typedef std::deque<CAIRO_BUFFER> CAIRO_BUFFERS; + + /// Pointer to the current context, so it can be changed + cairo_t** m_currentContext; + + /// Rendering target used for compositing (the main display) + cairo_t* m_mainContext; + + /// Transformation matrix + cairo_matrix_t m_matrix; + + /// Stores information about initialized buffers + CAIRO_BUFFERS m_buffers; + + unsigned int m_stride; ///< Stride to use given the desired format and width + unsigned int m_bufferSize; ///< Amount of memory needed to store a buffer + + /** + * Function clean() + * performs freeing of resources. + */ + void clean(); + + /// Returns number of currently used buffers + unsigned int usedBuffers() + { + return m_buffers.size(); + } +}; +} // namespace KIGFX + +#endif /* COMPOSITOR_H_ */ diff --git a/include/gal/cairo/cairo_gal.h b/include/gal/cairo/cairo_gal.h new file mode 100644 index 0000000..1f395f7 --- /dev/null +++ b/include/gal/cairo/cairo_gal.h @@ -0,0 +1,405 @@ +/* + * This program source code file is part of KICAD, a free EDA CAD application. + * + * Copyright (C) 2012 Torsten Hueter, torstenhtr <at> gmx.de + * Copyright (C) 2012 Kicad Developers, see change_log.txt for contributors. + * + * CairoGal - Graphics Abstraction Layer for Cairo + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef CAIROGAL_H_ +#define CAIROGAL_H_ + +#include <map> +#include <iterator> + +#include <cairo.h> + +#include <gal/graphics_abstraction_layer.h> +#include <boost/smart_ptr/shared_ptr.hpp> +#include <wx/dcbuffer.h> + +#if defined(__WXMSW__) +#define SCREEN_DEPTH 24 +#else +#if wxCHECK_VERSION( 2, 9, 0 ) +#define SCREEN_DEPTH wxBITMAP_SCREEN_DEPTH +#else +#define SCREEN_DEPTH 32 +#endif +#endif + +/** + * @brief Class CAIRO_GAL is the cairo implementation of the graphics abstraction layer. + * + * Quote from Wikipedia: + * " Cairo is a software library used to provide a vector graphics-based, device-independent + * API for software developers. It is designed to provide primitives for 2-dimensional + * drawing across a number of different backends. " + * <br> + * Cairo offers also backends for Postscript and PDF surfaces. So it can be used for printing + * of KiCad graphics surfaces as well. + * + */ +namespace KIGFX +{ +class CAIRO_COMPOSITOR; + +class CAIRO_GAL : public GAL, public wxWindow +{ +public: + /** + * Constructor CAIRO_GAL + * + * @param aParent is the wxWidgets immediate wxWindow parent of this object. + * + * @param aMouseListener is the wxEvtHandler that should receive the mouse events, + * this can be can be any wxWindow, but is often a wxFrame container. + * + * @param aPaintListener is the wxEvtHandler that should receive the paint + * event. This can be any wxWindow, but is often a derived instance + * of this class or a containing wxFrame. The "paint event" here is + * a wxCommandEvent holding EVT_GAL_REDRAW, as sent by PostPaint(). + * + * @param aName is the name of this window for use by wxWindow::FindWindowByName() + */ + CAIRO_GAL( wxWindow* aParent, wxEvtHandler* aMouseListener = NULL, + wxEvtHandler* aPaintListener = NULL, const wxString& aName = wxT( "CairoCanvas" ) ); + + virtual ~CAIRO_GAL(); + + // --------------- + // Drawing methods + // --------------- + + /// @copydoc GAL::BeginDrawing() + virtual void BeginDrawing(); + + /// @copydoc GAL::EndDrawing() + virtual void EndDrawing(); + + /// @copydoc GAL::DrawLine() + virtual void DrawLine( const VECTOR2D& aStartPoint, const VECTOR2D& aEndPoint ); + + /// @copydoc GAL::DrawSegment() + virtual void DrawSegment( const VECTOR2D& aStartPoint, const VECTOR2D& aEndPoint, double aWidth ); + + /// @copydoc GAL::DrawCircle() + virtual void DrawCircle( const VECTOR2D& aCenterPoint, double aRadius ); + + /// @copydoc GAL::DrawArc() + virtual void DrawArc( const VECTOR2D& aCenterPoint, double aRadius, + double aStartAngle, double aEndAngle ); + + /// @copydoc GAL::DrawRectangle() + virtual void DrawRectangle( const VECTOR2D& aStartPoint, const VECTOR2D& aEndPoint ); + + /// @copydoc GAL::DrawPolyline() + virtual void DrawPolyline( const std::deque<VECTOR2D>& aPointList ) { drawPoly( aPointList ); } + virtual void DrawPolyline( const VECTOR2D aPointList[], int aListSize ) { drawPoly( aPointList, aListSize ); } + + /// @copydoc GAL::DrawPolygon() + virtual void DrawPolygon( const std::deque<VECTOR2D>& aPointList ) { drawPoly( aPointList ); } + virtual void DrawPolygon( const VECTOR2D aPointList[], int aListSize ) { drawPoly( aPointList, aListSize ); } + + /// @copydoc GAL::DrawCurve() + virtual void DrawCurve( const VECTOR2D& startPoint, const VECTOR2D& controlPointA, + const VECTOR2D& controlPointB, const VECTOR2D& endPoint ); + + // -------------- + // Screen methods + // -------------- + + /// @brief Resizes the canvas. + virtual void ResizeScreen( int aWidth, int aHeight ); + + /// @brief Shows/hides the GAL canvas + virtual bool Show( bool aShow ); + + /// @copydoc GAL::Flush() + virtual void Flush(); + + /// @copydoc GAL::ClearScreen() + virtual void ClearScreen( const COLOR4D& aColor ); + + // ----------------- + // Attribute setting + // ----------------- + + /// @copydoc GAL::SetIsFill() + virtual void SetIsFill( bool aIsFillEnabled ); + + /// @copydoc GAL::SetIsStroke() + virtual void SetIsStroke( bool aIsStrokeEnabled ); + + /// @copydoc GAL::SetStrokeColor() + virtual void SetStrokeColor( const COLOR4D& aColor ); + + /// @copydoc GAL::SetFillColor() + virtual void SetFillColor( const COLOR4D& aColor ); + + /// @copydoc GAL::SetLineWidth() + virtual void SetLineWidth( double aLineWidth ); + + /// @copydoc GAL::SetLayerDepth() + virtual void SetLayerDepth( double aLayerDepth ); + + // -------------- + // Transformation + // -------------- + + /// @copydoc GAL::Transform() + virtual void Transform( const MATRIX3x3D& aTransformation ); + + /// @copydoc GAL::Rotate() + virtual void Rotate( double aAngle ); + + /// @copydoc GAL::Translate() + virtual void Translate( const VECTOR2D& aTranslation ); + + /// @copydoc GAL::Scale() + virtual void Scale( const VECTOR2D& aScale ); + + /// @copydoc GAL::Save() + virtual void Save(); + + /// @copydoc GAL::Restore() + virtual void Restore(); + + // -------------------------------------------- + // Group methods + // --------------------------------------------- + + /// @copydoc GAL::BeginGroup() + virtual int BeginGroup(); + + /// @copydoc GAL::EndGroup() + virtual void EndGroup(); + + /// @copydoc GAL::DrawGroup() + virtual void DrawGroup( int aGroupNumber ); + + /// @copydoc GAL::ChangeGroupColor() + virtual void ChangeGroupColor( int aGroupNumber, const COLOR4D& aNewColor ); + + /// @copydoc GAL::ChangeGroupDepth() + virtual void ChangeGroupDepth( int aGroupNumber, int aDepth ); + + /// @copydoc GAL::DeleteGroup() + virtual void DeleteGroup( int aGroupNumber ); + + /// @copydoc GAL::ClearCache() + virtual void ClearCache(); + + // -------------------------------------------------------- + // Handling the world <-> screen transformation + // -------------------------------------------------------- + + /// @copydoc GAL::SaveScreen() + virtual void SaveScreen(); + + /// @copydoc GAL::RestoreScreen() + virtual void RestoreScreen(); + + /// @copydoc GAL::SetTarget() + virtual void SetTarget( RENDER_TARGET aTarget ); + + /// @copydoc GAL::GetTarget() + virtual RENDER_TARGET GetTarget() const; + + /// @copydoc GAL::ClearTarget() + virtual void ClearTarget( RENDER_TARGET aTarget ); + + // ------- + // Cursor + // ------- + + /// @copydoc GAL::SetCursorSize() + virtual void SetCursorSize( unsigned int aCursorSize ); + + /// @copydoc GAL::DrawCursor() + virtual void DrawCursor( const VECTOR2D& aCursorPosition ); + + /** + * Function PostPaint + * posts an event to m_paint_listener. A post is used so that the actual drawing + * function can use a device context type that is not specific to the wxEVT_PAINT event. + */ + void PostPaint() + { + if( paintListener ) + { + wxPaintEvent redrawEvent; + wxPostEvent( paintListener, redrawEvent ); + } + } + + void SetMouseListener( wxEvtHandler* aMouseListener ) + { + mouseListener = aMouseListener; + } + + void SetPaintListener( wxEvtHandler* aPaintListener ) + { + paintListener = aPaintListener; + } + +protected: + virtual void drawGridLine( const VECTOR2D& aStartPoint, const VECTOR2D& aEndPoint ); + +private: + /// Super class definition + typedef GAL super; + + // Compositing variables + boost::shared_ptr<CAIRO_COMPOSITOR> compositor; ///< Object for layers compositing + unsigned int mainBuffer; ///< Handle to the main buffer + unsigned int overlayBuffer; ///< Handle to the overlay buffer + RENDER_TARGET currentTarget; ///< Current rendering target + bool validCompositor; ///< Compositor initialization flag + + // Variables related to wxWidgets + wxWindow* parentWindow; ///< Parent window + wxEvtHandler* mouseListener; ///< Mouse listener + wxEvtHandler* paintListener; ///< Paint listener + unsigned int bufferSize; ///< Size of buffers cairoOutput, bitmapBuffers + unsigned char* wxOutput; ///< wxImage comaptible buffer + + // Cursor variables + std::deque<wxColour> savedCursorPixels; ///< Saved pixels of the cursor + bool isDeleteSavedPixels; ///< True, if the saved pixels can be discarded + wxPoint savedCursorPosition; ///< The last cursor position + wxBitmap* cursorPixels; ///< Cursor pixels + wxBitmap* cursorPixelsSaved; ///< Saved cursor pixels + + /// Maximum number of arguments for one command + static const int MAX_CAIRO_ARGUMENTS = 6; + + /// Definitions for the command recorder + enum GRAPHICS_COMMAND + { + CMD_SET_FILL, ///< Enable/disable filling + CMD_SET_STROKE, ///< Enable/disable stroking + CMD_SET_FILLCOLOR, ///< Set the fill color + CMD_SET_STROKECOLOR, ///< Set the stroke color + CMD_SET_LINE_WIDTH, ///< Set the line width + CMD_STROKE_PATH, ///< Set the stroke path + CMD_FILL_PATH, ///< Set the fill path + CMD_TRANSFORM, ///< Transform the actual context + CMD_ROTATE, ///< Rotate the context + CMD_TRANSLATE, ///< Translate the context + CMD_SCALE, ///< Scale the context + CMD_SAVE, ///< Save the transformation matrix + CMD_RESTORE, ///< Restore the transformation matrix + CMD_CALL_GROUP ///< Call a group + }; + + /// Type definition for an graphics group element + typedef struct + { + GRAPHICS_COMMAND command; ///< Command to execute + double arguments[MAX_CAIRO_ARGUMENTS]; ///< Arguments for Cairo commands + bool boolArgument; ///< A bool argument + int intArgument; ///< An int argument + cairo_path_t* cairoPath; ///< Pointer to a Cairo path + } GROUP_ELEMENT; + + // Variables for the grouping function + bool isGrouping; ///< Is grouping enabled ? + bool isElementAdded; ///< Was an graphic element added ? + typedef std::deque<GROUP_ELEMENT> GROUP; ///< A graphic group type definition + std::map<int, GROUP> groups; ///< List of graphic groups + unsigned int groupCounter; ///< Counter used for generating keys for groups + GROUP* currentGroup; ///< Currently used group + + // Variables related to Cairo <-> wxWidgets + cairo_matrix_t cairoWorldScreenMatrix; ///< Cairo world to screen transformation matrix + cairo_t* currentContext; ///< Currently used Cairo context for drawing + cairo_t* context; ///< Cairo image + cairo_surface_t* surface; ///< Cairo surface + unsigned int* bitmapBuffer; ///< Storage of the cairo image + unsigned int* bitmapBufferBackup; ///< Backup storage of the cairo image + int stride; ///< Stride value for Cairo + bool isInitialized; ///< Are Cairo image & surface ready to use + COLOR4D backgroundColor; ///< Background color + + // Methods + void storePath(); ///< Store the actual path + + // Event handlers + /** + * @brief Paint event handler. + * + * @param aEvent is the paint event. + */ + void onPaint( wxPaintEvent& aEvent ); + + /** + * @brief Mouse event handler, forwards the event to the child. + * + * @param aEvent is the mouse event to be forwarded. + */ + void skipMouseEvent( wxMouseEvent& aEvent ); + + /** + * @brief Prepares cursor bitmap. + */ + virtual void initCursor(); + + /** + * @brief Blits cursor into the current screen. + */ + virtual void blitCursor( wxBufferedDC& clientDC ); + + /// Prepare Cairo surfaces for drawing + void initSurface(); + + /// Destroy Cairo surfaces when are not needed anymore + void deinitSurface(); + + /// Allocate the bitmaps for drawing + void allocateBitmaps(); + + /// Allocate the bitmaps for drawing + void deleteBitmaps(); + + /// Prepare the compositor + void setCompositor(); + + /// Drawing polygons & polylines is the same in cairo, so here is the common code + void drawPoly( const std::deque<VECTOR2D>& aPointList ); + void drawPoly( const VECTOR2D aPointList[], int aListSize ); + + /** + * @brief Returns a valid key that can be used as a new group number. + * + * @return An unique group number that is not used by any other group. + */ + unsigned int getNewGroupNumber(); + + /// Format used to store pixels + static const cairo_format_t GAL_FORMAT = CAIRO_FORMAT_RGB24; + + ///> Opacity of a single layer + static const float LAYER_ALPHA; +}; +} // namespace KIGFX + +#endif // CAIROGAL_H_ diff --git a/include/gal/color4d.h b/include/gal/color4d.h new file mode 100644 index 0000000..46ae899 --- /dev/null +++ b/include/gal/color4d.h @@ -0,0 +1,222 @@ +/* + * This program source code file is part of KICAD, a free EDA CAD application. + * + * Copyright (C) 2012 Torsten Hueter, torstenhtr <at> gmx.de + * Copyright (C) 2012 Kicad Developers, see change_log.txt for contributors. + * + * Color class + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef COLOR4D_H_ +#define COLOR4D_H_ + +#include <colors.h> +#include <cassert> + +namespace KIGFX +{ +/** + * Class COLOR4D + * is the color representation with 4 components: red, green, blue, alpha. + */ +class COLOR4D +{ +public: + // Constructor (creates the Color 0,0,0,0) + COLOR4D() : + r( 0 ), g( 0 ), b( 0 ), a( 1 ) + { + } + + /** + * @brief Constructor + * + * @param aRed is the red component [0.0 .. 1.0]. + * @param aGreen is the green component [0.0 .. 1.0]. + * @param aBlue is the blue component [0.0 .. 1.0]. + * @param aAlpha is the alpha value [0.0 .. 1.0]. + */ + COLOR4D( double aRed, double aGreen, double aBlue, double aAlpha ) : + r( aRed ), g( aGreen ), b( aBlue ), a( aAlpha ) + { + assert( r >= 0.0 && r <= 1.0 ); + assert( g >= 0.0 && g <= 1.0 ); + assert( b >= 0.0 && b <= 1.0 ); + assert( a >= 0.0 && a <= 1.0 ); + } + + /** + * @brief Constructor + * + * @param aColor is one of KiCad's palette colors. + * @see EDA_COLOR_T + */ + COLOR4D( EDA_COLOR_T aColor ); + +#ifdef WX_COMPATIBILITY + /** + * @brief Constructor + * + * @param aColor is the color type used by wxWidgets. + */ + COLOR4D( const wxColour& aColor ); +#endif /* WX_COMPATIBLITY */ + + /** + * Function Brighten + * Makes the color brighter by a given factor. + * @param aFactor Specifies how bright the color should become (valid values: 0.0 .. 1.0). + * @return COLOR4D& Brightened color. + */ + COLOR4D& Brighten( double aFactor ) + { + assert( aFactor >= 0.0 && aFactor <= 1.0 ); + + r = r * ( 1.0 - aFactor ) + aFactor; + g = g * ( 1.0 - aFactor ) + aFactor; + b = b * ( 1.0 - aFactor ) + aFactor; + + return *this; + } + + /** + * Function Darken + * Makes the color darker by a given factor. + * @param aFactor Specifies how dark the color should become (valid values: 0.0 .. 1.0). + * @return COLOR4D& Darkened color. + */ + COLOR4D& Darken( double aFactor ) + { + assert( aFactor >= 0.0 && aFactor <= 1.0 ); + + r = r * ( 1.0 - aFactor ); + g = g * ( 1.0 - aFactor ); + b = b * ( 1.0 - aFactor ); + + return *this; + } + + /** + * Function Invert + * Makes the color inverted, alpha remains the same. + * @return COLOR4D& Inverted color. + */ + COLOR4D& Invert() + { + r = ( 1.0 - r ); + g = ( 1.0 - g ); + b = ( 1.0 - b ); + + return *this; + } + + /** + * Saturates the color to a given factor (in HSV model) + */ + COLOR4D& Saturate( double aFactor ); + + /** + * Function Brightened + * Returns a color that is brighter by a given factor, without modifying object. + * @param aFactor Specifies how bright the color should become (valid values: 0.0 .. 1.0). + * @return COLOR4D Highlighted color. + */ + COLOR4D Brightened( double aFactor ) const + { + assert( aFactor >= 0.0 && aFactor <= 1.0 ); + + return COLOR4D( r * ( 1.0 - aFactor ) + aFactor, + g * ( 1.0 - aFactor ) + aFactor, + b * ( 1.0 - aFactor ) + aFactor, + a ); + } + + /** + * Function Darkened + * Returns a color that is darker by a given factor, without modifying object. + * @param aFactor Specifies how dark the color should become (valid values: 0.0 .. 1.0). + * @return COLOR4D Darkened color. + */ + COLOR4D Darkened( double aFactor ) const + { + assert( aFactor >= 0.0 && aFactor <= 1.0 ); + + return COLOR4D( r * ( 1.0 - aFactor ), + g * ( 1.0 - aFactor ), + b * ( 1.0 - aFactor ), + a ); + } + + /** + * Function Inverted + * Returns an inverted color, alpha remains the same. + * @return COLOR4D& Inverted color. + */ + COLOR4D Inverted() const + { + return COLOR4D( 1.0 - r, 1.0 - g, 1.0 - b, a ); + } + + /** + * Function GetBrightness + * Returns the brightness value of the color ranged from 0.0 to 1.0. + * @return The brightness value. + */ + double GetBrightness() const + { + // Weighted W3C formula + return r * 0.299 + g * 0.587 + b * 0.117; + } + + /** + * Function ToHSV() + * Converts current color (stored in RGB) to HSV format. + * + * @param aOutH is conversion result for hue component. + * @param aOutS is conversion result for saturation component. + * @param aOutV is conversion result for value component. + */ + void ToHSV( double& aOutH, double& aOutS, double& aOutV ) const; + + /** + * Function FromHSV() + * Changes currently used color to the one given by hue, saturation and value parameters. + * + * @param aInH is hue component. + * @param aInS is saturation component. + * @param aInV is value component. + */ + void FromHSV( double aInH, double aInS, double aInV ); + + /// @brief Equality operator, are two colors equal + const bool operator==( const COLOR4D& aColor ); + + /// @brief Not equality operator, are two colors not equal + const bool operator!=( const COLOR4D& aColor ); + + // Color components: red, green, blue, alpha + double r; ///< Red component + double g; ///< Green component + double b; ///< Blue component + double a; ///< Alpha component +}; +} // namespace KIGFX + +#endif /* COLOR4D_H_ */ diff --git a/include/gal/compositor.h b/include/gal/compositor.h new file mode 100644 index 0000000..cd1d636 --- /dev/null +++ b/include/gal/compositor.h @@ -0,0 +1,106 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2013 CERN + * @author Maciej Suminski <maciej.suminski@cern.ch> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/** + * @file compositor.h + * @brief Class that handles multitarget rendering (ie. to different textures/surfaces) and + * later compositing into a single image. + */ + +#ifndef COMPOSITOR_H_ +#define COMPOSITOR_H_ + +namespace KIGFX +{ + +class COMPOSITOR +{ +public: + virtual ~COMPOSITOR() + { + } + + /** + * Function Reset() + * performs primary initialiation, necessary to use the object. + */ + virtual void Initialize() = 0; + + /** + * Function Resize() + * clears the state of COMPOSITOR, so it has to be reinitialized again with the new dimensions. + * + * @param aWidth is the framebuffer width (in pixels). + * @param aHeight is the framebuffer height (in pixels). + */ + virtual void Resize( unsigned int aWidth, unsigned int aHeight ) = 0; + + /** + * Function CreateBuffer() + * prepares a new buffer that may be used as a rendering target. + * + * @return is the handle of the buffer. In case of failure 0 (zero) is returned as the handle. + */ + virtual unsigned int CreateBuffer() = 0; + + /** + * Function GetBuffer() + * returns currently used buffer handle. + * + * @return Currently used buffer handle. + */ + virtual unsigned int GetBuffer() const = 0; + + /** + * Function SetBuffer() + * sets the selected buffer as the rendering target. All the following drawing functions are + * going to be rendered in the selected buffer. + * + * @param aBufferHandle is the handle of the buffer or 0 in case of rendering directly to the + * display. + */ + virtual void SetBuffer( unsigned int aBufferHandle ) = 0; + + /** + * Function ClearBuffer() + * clears the selected buffer (set by the SetBuffer() function). + */ + virtual void ClearBuffer() = 0; + + /** + * Function DrawBuffer() + * draws the selected buffer on the screen. + * + * @param aBufferHandle is the handle of the buffer to be drawn. + */ + virtual void DrawBuffer( unsigned int aBufferHandle ) = 0; + +protected: + unsigned int m_width; ///< Width of the buffer (in pixels) + unsigned int m_height; ///< Height of the buffer (in pixels) +}; + +} // namespace KIGFX + +#endif /* COMPOSITOR_H_ */ diff --git a/include/gal/definitions.h b/include/gal/definitions.h new file mode 100644 index 0000000..4ee1d6f --- /dev/null +++ b/include/gal/definitions.h @@ -0,0 +1,48 @@ +/* + * This program source code file is part of KICAD, a free EDA CAD application. + * + * Copyright (C) 2012 Torsten Hueter, torstenhtr <at> gmx.de + * Copyright (C) 2012 Kicad Developers, see change_log.txt for contributors. + * + * Macro definitions + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef DEFINITIONS_H_ +#define DEFINITIONS_H_ + +/// Swap the variables if a condition is met. +#define SWAP( varA, condition, varB ) if( varA condition varB ) { double tmp = varA; varA = varB; \ + varB = tmp; } + +namespace KIGFX +{ +/** + * RENDER_TARGET: Possible rendering targets + */ +enum RENDER_TARGET +{ + TARGET_CACHED = 0, ///< Main rendering target (cached) + TARGET_NONCACHED, ///< Auxiliary rendering target (noncached) + TARGET_OVERLAY, ///< Items that may change while the view stays the same (noncached) + TARGETS_NUMBER ///< Number of available rendering targets +}; +} // namespace KIGFX + +#endif /* DEFINITIONS_H_ */ diff --git a/include/gal/graphics_abstraction_layer.h b/include/gal/graphics_abstraction_layer.h new file mode 100644 index 0000000..40cebbf --- /dev/null +++ b/include/gal/graphics_abstraction_layer.h @@ -0,0 +1,910 @@ +/* + * This program source code file is part of KICAD, a free EDA CAD application. + * + * Copyright (C) 2012 Torsten Hueter, torstenhtr <at> gmx.de + * Copyright (C) 2012 Kicad Developers, see change_log.txt for contributors. + * + * Graphics Abstraction Layer (GAL) - base class + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef GRAPHICSABSTRACTIONLAYER_H_ +#define GRAPHICSABSTRACTIONLAYER_H_ + +#include <deque> +#include <stack> +#include <limits> + +#include <math/matrix3x3.h> + +#include <gal/color4d.h> +#include <gal/definitions.h> +#include <gal/stroke_font.h> +#include <newstroke_font.h> + +namespace KIGFX +{ +/** + * GridStyle: Type definition of the grid style + */ +enum GRID_STYLE +{ + GRID_STYLE_LINES, ///< Use lines for the grid + GRID_STYLE_DOTS ///< Use dots for the grid +}; + +/** + * @brief Class GAL is the abstract interface for drawing on a 2D-surface. + * + * The functions are optimized for drawing shapes of an EDA-program such as KiCad. Most methods + * are abstract and need to be implemented by a lower layer, for example by a cairo or OpenGL implementation. + * <br> + * Almost all methods use world coordinates as arguments. The board design is defined in world space units; + * for drawing purposes these are transformed to screen units with this layer. So zooming is handled here as well. + * + */ +class GAL +{ +public: + // Constructor / Destructor + GAL(); + virtual ~GAL(); + + /// @brief Returns the initalization status for the canvas. + virtual bool IsInitialized() const { return true; } + + // --------------- + // Drawing methods + // --------------- + + /// @brief Begin the drawing, needs to be called for every new frame. + virtual void BeginDrawing() {}; + + /// @brief End the drawing, needs to be called for every new frame. + virtual void EndDrawing() {}; + + /** + * @brief Draw a line. + * + * Start and end points are defined as 2D-Vectors. + * + * @param aStartPoint is the start point of the line. + * @param aEndPoint is the end point of the line. + */ + virtual void DrawLine( const VECTOR2D& aStartPoint, const VECTOR2D& aEndPoint ) {}; + + /** + * @brief Draw a rounded segment. + * + * Start and end points are defined as 2D-Vectors. + * + * @param aStartPoint is the start point of the segment. + * @param aEndPoint is the end point of the segment. + * @param aWidth is a width of the segment + */ + virtual void DrawSegment( const VECTOR2D& aStartPoint, const VECTOR2D& aEndPoint, double aWidth ) {}; + + /** + * @brief Draw a polyline + * + * @param aPointList is a list of 2D-Vectors containing the polyline points. + */ + virtual void DrawPolyline( const std::deque<VECTOR2D>& aPointList ) {}; + virtual void DrawPolyline( const VECTOR2D aPointList[], int aListSize ) {}; + + /** + * @brief Draw a circle using world coordinates. + * + * @param aCenterPoint is the center point of the circle. + * @param aRadius is the radius of the circle. + */ + virtual void DrawCircle( const VECTOR2D& aCenterPoint, double aRadius ) {}; + + /** + * @brief Draw an arc. + * + * @param aCenterPoint is the center point of the arc. + * @param aRadius is the arc radius. + * @param aStartAngle is the start angle of the arc. + * @param aEndAngle is the end angle of the arc. + */ + virtual void + DrawArc( const VECTOR2D& aCenterPoint, double aRadius, double aStartAngle, double aEndAngle ) {}; + + /** + * @brief Draw a rectangle. + * + * @param aStartPoint is the start point of the rectangle. + * @param aEndPoint is the end point of the rectangle. + */ + virtual void DrawRectangle( const VECTOR2D& aStartPoint, const VECTOR2D& aEndPoint ) {}; + + /** + * @brief Draw a polygon. + * + * @param aPointList is the list of the polygon points. + */ + virtual void DrawPolygon( const std::deque<VECTOR2D>& aPointList ) {}; + virtual void DrawPolygon( const VECTOR2D aPointList[], int aListSize ) {}; + + /** + * @brief Draw a cubic bezier spline. + * + * @param startPoint is the start point of the spline. + * @param controlPointA is the first control point. + * @param controlPointB is the second control point. + * @param endPoint is the end point of the spline. + */ + virtual void DrawCurve( const VECTOR2D& startPoint, const VECTOR2D& controlPointA, + const VECTOR2D& controlPointB, const VECTOR2D& endPoint ) {}; + + // -------------- + // Screen methods + // -------------- + + /// @brief Resizes the canvas. + virtual void ResizeScreen( int aWidth, int aHeight ) {}; + + /// @brief Shows/hides the GAL canvas + virtual bool Show( bool aShow ) { return true; }; + + /// @brief Returns GAL canvas size in pixels + const VECTOR2I& GetScreenPixelSize() const + { + return screenSize; + } + + /// @brief Force all remaining objects to be drawn. + virtual void Flush() {}; + + /** + * @brief Clear the screen. + * @param aColor is the color used for clearing. + */ + virtual void ClearScreen( const COLOR4D& aColor ) {}; + + // ----------------- + // Attribute setting + // ----------------- + + /** + * @brief Enable/disable fill. + * + * @param aIsFillEnabled is true, when the graphics objects should be filled, else false. + */ + inline virtual void SetIsFill( bool aIsFillEnabled ) + { + isFillEnabled = aIsFillEnabled; + } + + /** + * @brief Enable/disable stroked outlines. + * + * @param aIsStrokeEnabled is true, if the outline of an object should be stroked. + */ + inline virtual void SetIsStroke( bool aIsStrokeEnabled ) + { + isStrokeEnabled = aIsStrokeEnabled; + } + + /** + * @brief Set the fill color. + * + * @param aColor is the color for filling. + */ + inline virtual void SetFillColor( const COLOR4D& aColor ) + { + fillColor = aColor; + } + + /** + * @brief Set the stroke color. + * + * @param aColor is the color for stroking the outline. + */ + inline virtual void SetStrokeColor( const COLOR4D& aColor ) + { + strokeColor = aColor; + } + + /** + * @brief Get the stroke color. + * + * @return the color for stroking the outline. + */ + inline const COLOR4D& GetStrokeColor() const + { + return strokeColor; + } + + /** + * @brief Set the line width. + * + * @param aLineWidth is the line width. + */ + inline virtual void SetLineWidth( double aLineWidth ) + { + lineWidth = aLineWidth; + } + + /** + * @brief Get the line width. + * + * @return the actual line width. + */ + inline double GetLineWidth() const + { + return lineWidth; + } + + /** + * @brief Set the depth of the layer (position on the z-axis) + * + * @param aLayerDepth the layer depth for the objects. + */ + inline virtual void SetLayerDepth( double aLayerDepth ) + { + assert( aLayerDepth <= depthRange.y ); + assert( aLayerDepth >= depthRange.x ); + + layerDepth = aLayerDepth; + } + + // ---- + // Text + // ---- + /** + * @brief Draws a vector type text using preloaded Newstroke font. + * + * @param aText is the text to be drawn. + * @param aPosition is the text position in world coordinates. + * @param aRotationAngle is the text rotation angle. + */ + inline virtual void StrokeText( const wxString& aText, const VECTOR2D& aPosition, + double aRotationAngle ) + { + strokeFont.Draw( aText, aPosition, aRotationAngle ); + } + + /** + * @brief Loads attributes of the given text (bold/italic/underline/mirrored and so on). + * + * @param aText is the text item. + */ + virtual void SetTextAttributes( const EDA_TEXT* aText ); + + /// @copydoc STROKE_FONT::SetGlyphSize() + inline void SetGlyphSize( const VECTOR2D aGlyphSize ) + { + strokeFont.SetGlyphSize( aGlyphSize ); + } + + /// @copydoc STROKE_FONT::SetBold() + inline void SetBold( const bool aBold ) + { + strokeFont.SetBold( aBold ); + } + + /// @copydoc STROKE_FONT::SetItalic() + inline void SetItalic( const bool aItalic ) + { + strokeFont.SetItalic( aItalic ); + } + + /// @copydoc STROKE_FONT::SetMirrored() + inline void SetMirrored( const bool aMirrored ) + { + strokeFont.SetMirrored( aMirrored ); + } + + /// @copydoc STROKE_FONT::SetHorizontalJustify() + inline void SetHorizontalJustify( const EDA_TEXT_HJUSTIFY_T aHorizontalJustify ) + { + strokeFont.SetHorizontalJustify( aHorizontalJustify ); + } + + /// @copydoc STROKE_FONT::SetVerticalJustify() + inline void SetVerticalJustify( const EDA_TEXT_VJUSTIFY_T aVerticalJustify ) + { + strokeFont.SetVerticalJustify( aVerticalJustify ); + } + + // -------------- + // Transformation + // -------------- + + /** + * @brief Transform the context. + * + * @param aTransformation is the ransformation matrix. + */ + virtual void Transform( const MATRIX3x3D& aTransformation ) {}; + + /** + * @brief Rotate the context. + * + * @param aAngle is the rotation angle in radians. + */ + virtual void Rotate( double aAngle ) {}; + + /** + * @brief Translate the context. + * + * @param aTranslation is the translation vector. + */ + virtual void Translate( const VECTOR2D& aTranslation ) {}; + + /** + * @brief Scale the context. + * + * @param aScale is the scale factor for the x- and y-axis. + */ + virtual void Scale( const VECTOR2D& aScale ) {}; + + /// @brief Save the context. + virtual void Save() {}; + + /// @brief Restore the context. + virtual void Restore() {}; + + // -------------------------------------------- + // Group methods + // --------------------------------------------- + + /** + * @brief Begin a group. + * + * A group is a collection of graphic items. + * Hierarchical groups are possible, attributes and transformations can be used. + * + * @return the number of the group. + */ + virtual int BeginGroup() { return 0; }; + + /// @brief End the group. + virtual void EndGroup() {}; + + /** + * @brief Draw the stored group. + * + * @param aGroupNumber is the group number. + */ + virtual void DrawGroup( int aGroupNumber ) {}; + + /** + * @brief Changes the color used to draw the group. + * + * @param aGroupNumber is the group number. + * @param aNewColor is the new color. + */ + virtual void ChangeGroupColor( int aGroupNumber, const COLOR4D& aNewColor ) {}; + + /** + * @brief Changes the depth (Z-axis position) of the group. + * + * @param aGroupNumber is the group number. + * @param aDepth is the new depth. + */ + virtual void ChangeGroupDepth( int aGroupNumber, int aDepth ) {}; + + /** + * @brief Delete the group from the memory. + * + * @param aGroupNumber is the group number. + */ + virtual void DeleteGroup( int aGroupNumber ) {}; + + /** + * @brief Delete all data created during caching of graphic items. + */ + virtual void ClearCache() {}; + + // -------------------------------------------------------- + // Handling the world <-> screen transformation + // -------------------------------------------------------- + + /// @brief Compute the world <-> screen transformation matrix + virtual void ComputeWorldScreenMatrix(); + + /** + * @brief Get the world <-> screen transformation matrix. + * + * @return the transformation matrix. + */ + const MATRIX3x3D& GetWorldScreenMatrix() const + { + return worldScreenMatrix; + } + + /** + * @brief Get the screen <-> world transformation matrix. + * + * @return the transformation matrix. + */ + const MATRIX3x3D& GetScreenWorldMatrix() const + { + return screenWorldMatrix; + } + + /** + * @brief Set the world <-> screen transformation matrix. + * + * @param aMatrix is the 3x3 world <-> screen transformation matrix. + */ + inline void SetWorldScreenMatrix( const MATRIX3x3D& aMatrix ) + { + worldScreenMatrix = aMatrix; + } + + /** + * @brief Set the unit length. + * + * This defines the length [inch] per one integer. For instance a value 0.001 means + * that the coordinate [1000, 1000] corresponds with a point at (1 inch, 1 inch) or + * 1 mil resolution per integer. + * + * @param aWorldUnitLength is the world Unit length. + */ + inline void SetWorldUnitLength( double aWorldUnitLength ) + { + worldUnitLength = aWorldUnitLength; + } + + /** + * @brief Set the dots per inch of the screen. + * + * This value depends on the user screen, it should be configurable by the application. + * For instance a typical notebook with HD+ resolution (1600x900) has 106 DPI. + * + * @param aScreenDPI are the screen DPI. + */ + inline void SetScreenDPI( double aScreenDPI ) + { + screenDPI = aScreenDPI; + } + + /** + * @brief Set the Point in world space to look at. + * + * This point corresponds with the center of the actual drawing area. + * + * @param aPoint is the look at point (center of the actual drawing area). + */ + inline void SetLookAtPoint( const VECTOR2D& aPoint ) + { + lookAtPoint = aPoint; + } + + /** + * @brief Get the look at point. + * + * @return the look at point. + */ + inline const VECTOR2D& GetLookAtPoint() const + { + return lookAtPoint; + } + + /** + * @brief Set the zoom factor of the scene. + * + * @param aZoomFactor is the zoom factor. + */ + inline void SetZoomFactor( double aZoomFactor ) + { + zoomFactor = aZoomFactor; + } + + /** + * @brief Get the zoom factor + * + * @return the zoom factor. + */ + inline double GetZoomFactor() const + { + return zoomFactor; + } + + /** + * @brief Set the range of the layer depth. + * + * Usually required for the OpenGL implementation, any object outside this range is not drawn. + * + * @param aDepthRange is the depth range where component x is the near clipping plane and y + * is the far clipping plane. + */ + inline void SetDepthRange( const VECTOR2D& aDepthRange ) + { + depthRange = aDepthRange; + } + + /** + * @brief Returns the minimum depth in the currently used range (the top). + */ + inline double GetMinDepth() const + { + return depthRange.x; + } + + /** + * @brief Returns the maximum depth in the currently used range (the bottom). + */ + inline double GetMaxDepth() const + { + return depthRange.y; + } + + /** + * @brief Get the world scale. + * + * @return the actual world scale factor. + */ + inline double GetWorldScale() const + { + return worldScale; + } + + /** + * @brief Sets flipping of the screen. + * + * @param xAxis is the flip flag for the X axis. + * @param yAxis is the flip flag for the Y axis. + */ + inline void SetFlip( bool xAxis, bool yAxis ) + { + if( xAxis ) + flipX = -1.0; // flipped + else + flipX = 1.0; // regular + + if( yAxis ) + flipY = -1.0; // flipped + else + flipY = 1.0; // regular + } + + // --------------------------- + // Buffer manipulation methods + // --------------------------- + + /** + * @brief Save the screen contents. + */ + virtual void SaveScreen() {}; + + /** + * @brief Restore the screen contents. + */ + virtual void RestoreScreen() {}; + + /** + * @brief Sets the target for rendering. + * + * @param aTarget is the new target for rendering. + */ + virtual void SetTarget( RENDER_TARGET aTarget ) {}; + + /** + * @brief Gets the currently used target for rendering. + * + * @return The current rendering target. + */ + virtual RENDER_TARGET GetTarget() const { return TARGET_CACHED; }; + + /** + * @brief Clears the target for rendering. + * + * @param aTarget is the target to be cleared. + */ + virtual void ClearTarget( RENDER_TARGET aTarget ) {}; + + // ------------- + // Grid methods + // ------------- + + /** + * @brief Sets the visibility setting of the grid. + * + * @param aVisibility is the new visibility setting of the grid. + */ + inline void SetGridVisibility( bool aVisibility ) + { + gridVisibility = aVisibility; + } + + /** + * @brief Set the origin point for the grid. + * + * @param aGridOrigin is a vector containing the grid origin point, in world coordinates. + */ + inline void SetGridOrigin( const VECTOR2D& aGridOrigin ) + { + gridOrigin = aGridOrigin; + + if( gridSize.x == 0.0 || gridSize.y == 0.0 ) + gridOffset = VECTOR2D(0.0, 0.0); + else + gridOffset = VECTOR2D( (long) gridOrigin.x % (long) gridSize.x, + (long) gridOrigin.y % (long) gridSize.y ); + } + + /** + * @brief Set the threshold for grid drawing. + * + * @param aThreshold is the minimum grid cell size (in pixels) for which the grid is drawn. + */ + inline void SetGridDrawThreshold( int aThreshold ) + { + gridDrawThreshold = aThreshold; + } + + /** + * @brief Set the grid size. + * + * @param aGridSize is a vector containing the grid size in x and y direction. + */ + inline void SetGridSize( const VECTOR2D& aGridSize ) + { + gridSize = aGridSize; + + gridOffset = VECTOR2D( (long) gridOrigin.x % (long) gridSize.x, + (long) gridOrigin.y % (long) gridSize.y ); + } + + /** + * @brief Returns the grid size. + * + * @return A vector containing the grid size in x and y direction. + */ + inline const VECTOR2D& GetGridSize() const + { + return gridSize; + } + + /** + * @brief Set the grid color. + * + * @param aGridColor is the grid color, it should have a low alpha value for the best effect. + */ + inline void SetGridColor( const COLOR4D& aGridColor ) + { + gridColor = aGridColor; + } + + /** + * @brief Draw every tick line wider. + * + * @param aInterval increase the width of every aInterval line, if 0 do not use this feature. + */ + inline void SetCoarseGrid( int aInterval ) + { + gridTick = aInterval; + } + + /** + * @brief Get the grid line width. + * + * @return the grid line width + */ + inline double GetGridLineWidth() const + { + return gridLineWidth; + } + + /** + * @brief Set the grid line width. + * + * @param aGridLineWidth is the rid line width. + */ + inline void SetGridLineWidth( double aGridLineWidth ) + { + gridLineWidth = aGridLineWidth; + } + + ///> @brief Draw the grid + void DrawGrid(); + + /** + * Function GetGridPoint() + * For a given point it returns the nearest point belonging to the grid in world coordinates. + * + * @param aPoint is the point for which the grid point is searched. + * @return The nearest grid point in world coordinates. + */ + VECTOR2D GetGridPoint( const VECTOR2D& aPoint ) const; + + /** + * @brief Change the grid display style. + * + * @param aGridStyle is the new style for grid. + */ + inline virtual void SetGridStyle( GRID_STYLE aGridStyle ) + { + gridStyle = aGridStyle; + } + + /** + * @brief Compute the point position in world coordinates from given screen coordinates. + * + * @param aPoint the pointposition in screen coordinates. + * @return the point position in world coordinates. + */ + inline VECTOR2D ToWorld( const VECTOR2D& aPoint ) const + { + return VECTOR2D( screenWorldMatrix * aPoint ); + } + + /** + * @brief Compute the point position in screen coordinates from given world coordinates. + * + * @param aPoint the pointposition in world coordinates. + * @return the point position in screen coordinates. + */ + inline VECTOR2D ToScreen( const VECTOR2D& aPoint ) const + { + return VECTOR2D( worldScreenMatrix * aPoint ); + } + + /** + * @brief Enable/disable cursor. + * + * @param aCursorEnabled is true if the cursor should be drawn, else false. + */ + inline void SetCursorEnabled( bool aCursorEnabled ) + { + isCursorEnabled = aCursorEnabled; + } + + /** + * @brief Set the cursor color. + * + * @param aCursorColor is the color of the cursor. + */ + inline void SetCursorColor( const COLOR4D& aCursorColor ) + { + cursorColor = aCursorColor; + } + + /** + * @brief Returns the cursor size. + * + * @return The current cursor size (in pixels). + */ + inline unsigned int GetCursorSize() const + { + return cursorSize; + } + + /** + * @brief Set the cursor size. + * + * @param aCursorSize is the size of the cursor expressed in pixels. + */ + virtual inline void SetCursorSize( unsigned int aCursorSize ) + { + cursorSize = aCursorSize; + } + + /** + * @brief Draw the cursor. + * + * @param aCursorPosition is the cursor position in screen coordinates. + */ + virtual void DrawCursor( const VECTOR2D& aCursorPosition ) {}; + + /** + * @brief Changes the current depth to deeper, so it is possible to draw objects right beneath + * other. + */ + inline void AdvanceDepth() + { + layerDepth -= 0.001; + } + + /** + * @brief Stores current drawing depth on the depth stack. + */ + inline void PushDepth() + { + depthStack.push( layerDepth ); + } + + /** + * @brief Restores previously stored drawing depth for the depth stack. + */ + inline void PopDepth() + { + layerDepth = depthStack.top(); + depthStack.pop(); + } + + static const double METRIC_UNIT_LENGTH; + +protected: + std::stack<double> depthStack; ///< Stored depth values + VECTOR2I screenSize; ///< Screen size in screen coordinates + + double worldUnitLength; ///< The unit length of the world coordinates [inch] + double screenDPI; ///< The dots per inch of the screen + VECTOR2D lookAtPoint; ///< Point to be looked at in world space + + double zoomFactor; ///< The zoom factor + MATRIX3x3D worldScreenMatrix; ///< World transformation + MATRIX3x3D screenWorldMatrix; ///< Screen transformation + double worldScale; ///< The scale factor world->screen + double flipX; ///< Flag for X axis flipping + double flipY; ///< Flag for Y axis flipping + + double lineWidth; ///< The line width + + bool isFillEnabled; ///< Is filling of graphic objects enabled ? + bool isStrokeEnabled; ///< Are the outlines stroked ? + + COLOR4D fillColor; ///< The fill color + COLOR4D strokeColor; ///< The color of the outlines + + double layerDepth; ///< The actual layer depth + VECTOR2D depthRange; ///< Range of the depth + + // Grid settings + bool gridVisibility; ///< Should the grid be shown + GRID_STYLE gridStyle; ///< Grid display style + VECTOR2D gridSize; ///< The grid size + VECTOR2D gridOrigin; ///< The grid origin + VECTOR2D gridOffset; ///< The grid offset to compensate cursor position + COLOR4D gridColor; ///< Color of the grid + int gridTick; ///< Every tick line gets the double width + double gridLineWidth; ///< Line width of the grid + int gridDrawThreshold; ///< Minimum screen size of the grid (pixels) + ///< below which the grid is not drawn + + // Cursor settings + bool isCursorEnabled; ///< Is the cursor enabled? + COLOR4D cursorColor; ///< Cursor color + unsigned int cursorSize; ///< Size of the cursor in pixels + VECTOR2D cursorPosition; ///< Current cursor position (world coordinates) + + /// Instance of object that stores information about how to draw texts + STROKE_FONT strokeFont; + + /// Compute the scaling factor for the world->screen matrix + inline void ComputeWorldScale() + { + worldScale = screenDPI * worldUnitLength * zoomFactor; + } + + /** + * @brief Draw a grid line (usually a simplified line function). + * + * @param aStartPoint is the start point of the line. + * @param aEndPoint is the end point of the line. + */ + virtual void drawGridLine( const VECTOR2D& aStartPoint, const VECTOR2D& aEndPoint ) {}; + + /// Possible depth range + static const int MIN_DEPTH; + static const int MAX_DEPTH; + + /// Depth level on which the grid is drawn + static const int GRID_DEPTH; + +}; +} // namespace KIGFX + +#endif /* GRAPHICSABSTRACTIONLAYER_H_ */ diff --git a/include/gal/opengl/cached_container.h b/include/gal/opengl/cached_container.h new file mode 100644 index 0000000..7bfc784 --- /dev/null +++ b/include/gal/opengl/cached_container.h @@ -0,0 +1,170 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2013 CERN + * @author Maciej Suminski <maciej.suminski@cern.ch> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/** + * @file cached_container.h + * @brief Class to store instances of VERTEX with caching. It allows storing VERTEX objects and + * associates them with VERTEX_ITEMs. This leads to a possibility of caching vertices data in the + * GPU memory and a fast reuse of that data. + */ + +#ifndef CACHED_CONTAINER_H_ +#define CACHED_CONTAINER_H_ + +#include <gal/opengl/vertex_container.h> +#include <map> +#include <set> + +// Debug messages verbosity level +// #define CACHED_CONTAINER_TEST 1 + +namespace KIGFX +{ +class VERTEX_ITEM; +class SHADER; + +class CACHED_CONTAINER : public VERTEX_CONTAINER +{ +public: + CACHED_CONTAINER( unsigned int aSize = defaultInitSize ); + + ///> @copydoc VERTEX_CONTAINER::SetItem() + virtual void SetItem( VERTEX_ITEM* aItem ); + + ///> @copydoc VERTEX_CONTAINER::FinishItem() + virtual void FinishItem(); + + ///> @copydoc VERTEX_CONTAINER::Allocate() + virtual VERTEX* Allocate( unsigned int aSize ); + + ///> @copydoc VERTEX_CONTAINER::Delete() + virtual void Delete( VERTEX_ITEM* aItem ); + + ///> @copydoc VERTEX_CONTAINER::Clear() + virtual void Clear(); + +protected: + ///> Maps size of free memory chunks to their offsets + typedef std::pair<unsigned int, unsigned int> CHUNK; + typedef std::multimap<unsigned int, unsigned int> FREE_CHUNK_MAP; + + /// List of all the stored items + typedef std::set<VERTEX_ITEM*> ITEMS; + + ///> Stores size & offset of free chunks. + FREE_CHUNK_MAP m_freeChunks; + + ///> Stored VERTEX_ITEMs + ITEMS m_items; + + ///> Currently modified item + VERTEX_ITEM* m_item; + + ///> Properties of currently modified chunk & item + unsigned int m_chunkSize; + unsigned int m_chunkOffset; + unsigned int m_itemSize; + + /** + * Function reallocate() + * resizes the chunk that stores the current item to the given size. + * + * @param aSize is the number of vertices to be stored. + * @return offset of the new chunk. + */ + virtual unsigned int reallocate( unsigned int aSize ); + + /** + * Function defragment() + * removes empty spaces between chunks, so after that there is a long continous space + * for storing vertices at the and of the container. + * + * @param aTarget is the already allocated destination for defragmented data. It has to be + * at least of the same size as the current container. If left NULL, it will be allocated + * inside the defragment() function. + * @return false in case of failure (eg. memory shortage) + */ + virtual bool defragment( VERTEX* aTarget = NULL ); + + /** + * Function mergeFreeChunks() + * looks for consecutive free memory chunks and merges them, decreasing fragmentation of + * memory. + */ + virtual void mergeFreeChunks(); + + /** + * Function resizeContainer() + * + * prepares a bigger container of a given size. + * @param aNewSize is the new size of container, expressed in vertices + * @return false in case of failure (eg. memory shortage) + */ + virtual bool resizeContainer( unsigned int aNewSize ); + + /** + * Function getPowerOf2() + * returns the nearest power of 2, bigger than aNumber. + * + * @param aNumber is the number for which we look for a bigger power of 2. + */ + unsigned int getPowerOf2( unsigned int aNumber ) const; + +private: + /** + * Function getChunkSize() + * returns size of the given chunk. + * + * @param aChunk is the chunk. + */ + inline int getChunkSize( const CHUNK& aChunk ) const + { + return aChunk.first; + } + + /** + * Function getChunkOffset() + * returns offset of the chunk. + * + * @param aChunk is the chunk. + */ + inline unsigned int getChunkOffset( const CHUNK& aChunk ) const + { + return aChunk.second; + } + + /// Debug & test functions +#if CACHED_CONTAINER_TEST > 0 + void showFreeChunks(); + void showReservedChunks(); + void test(); +#else + inline void showFreeChunks() {} + inline void showReservedChunks() {} + inline void test() {} +#endif /* CACHED_CONTAINER_TEST */ +}; +} // namespace KIGFX + +#endif /* CACHED_CONTAINER_H_ */ diff --git a/include/gal/opengl/glm/core/_detail.hpp b/include/gal/opengl/glm/core/_detail.hpp new file mode 100644 index 0000000..e6b42c2 --- /dev/null +++ b/include/gal/opengl/glm/core/_detail.hpp @@ -0,0 +1,482 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/_detail.hpp +/// @date 2008-07-24 / 2011-06-14 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_detail +#define glm_core_detail + +#include "setup.hpp" +#include <cassert> +#if(defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) +#include <cstdint> +#endif + +namespace glm{ +namespace detail +{ + class half; + +#if(defined(__STDC_VERSION__) && (__STDC_VERSION__ >= 199901L)) // C99 detected, 64 bit types available + typedef int64_t sint64; + typedef uint64_t uint64; +#elif(GLM_COMPILER & GLM_COMPILER_VC) + typedef signed __int64 sint64; + typedef unsigned __int64 uint64; +#elif(GLM_COMPILER & (GLM_COMPILER_GCC | GLM_COMPILER_LLVM_GCC | GLM_COMPILER_CLANG)) + __extension__ typedef signed long long sint64; + __extension__ typedef unsigned long long uint64; +#elif(GLM_COMPILER & GLM_COMPILER_BC) + typedef Int64 sint64; + typedef Uint64 uint64; +#else//unknown compiler + typedef signed long long sint64; + typedef unsigned long long uint64; +#endif//GLM_COMPILER + + template<bool C> + struct If + { + template<typename F, typename T> + static GLM_FUNC_QUALIFIER T apply(F functor, const T& val) + { + return functor(val); + } + }; + + template<> + struct If<false> + { + template<typename F, typename T> + static GLM_FUNC_QUALIFIER T apply(F, const T& val) + { + return val; + } + }; + + //template <typename T> + //struct traits + //{ + // static const bool is_signed = false; + // static const bool is_float = false; + // static const bool is_vector = false; + // static const bool is_matrix = false; + // static const bool is_genType = false; + // static const bool is_genIType = false; + // static const bool is_genUType = false; + //}; + + //template <> + //struct traits<half> + //{ + // static const bool is_float = true; + // static const bool is_genType = true; + //}; + + //template <> + //struct traits<float> + //{ + // static const bool is_float = true; + // static const bool is_genType = true; + //}; + + //template <> + //struct traits<double> + //{ + // static const bool is_float = true; + // static const bool is_genType = true; + //}; + + //template <typename genType> + //struct desc + //{ + // typedef genType type; + // typedef genType * pointer; + // typedef genType const* const_pointer; + // typedef genType const *const const_pointer_const; + // typedef genType *const pointer_const; + // typedef genType & reference; + // typedef genType const& const_reference; + // typedef genType const& param_type; + + // typedef typename genType::value_type value_type; + // typedef typename genType::size_type size_type; + // static const typename size_type value_size; + //}; + + //template <typename genType> + //const typename desc<genType>::size_type desc<genType>::value_size = genType::value_size(); + + union uif32 + { + GLM_FUNC_QUALIFIER uif32() : + i(0) + {} + + GLM_FUNC_QUALIFIER uif32(float f) : + f(f) + {} + + GLM_FUNC_QUALIFIER uif32(unsigned int i) : + i(i) + {} + + float f; + unsigned int i; + }; + + union uif64 + { + GLM_FUNC_QUALIFIER uif64() : + i(0) + {} + + GLM_FUNC_QUALIFIER uif64(double f) : + f(f) + {} + + GLM_FUNC_QUALIFIER uif64(uint64 i) : + i(i) + {} + + double f; + uint64 i; + }; + + typedef uif32 uif; + + ////////////////// + // int + + template <typename T> + struct is_int + { + enum is_int_enum + { + _YES = 0, + _NO = 1 + }; + }; + +#define GLM_DETAIL_IS_INT(T) \ + template <> \ + struct is_int<T> \ + { \ + enum is_int_enum \ + { \ + _YES = 1, \ + _NO = 0 \ + }; \ + } + + ////////////////// + // uint + + template <typename T> + struct is_uint + { + enum is_uint_enum + { + _YES = 0, + _NO = 1 + }; + }; + +#define GLM_DETAIL_IS_UINT(T) \ + template <> \ + struct is_uint<T> \ + { \ + enum is_uint_enum \ + { \ + _YES = 1, \ + _NO = 0 \ + }; \ + } + + //GLM_DETAIL_IS_UINT(unsigned long long) + + ////////////////// + // float + + template <typename T> + struct is_float + { + enum is_float_enum + { + _YES = 0, + _NO = 1 + }; + }; + +#define GLM_DETAIL_IS_FLOAT(T) \ + template <> \ + struct is_float<T> \ + { \ + enum is_float_enum \ + { \ + _YES = 1, \ + _NO = 0 \ + }; \ + } + + GLM_DETAIL_IS_FLOAT(detail::half); + GLM_DETAIL_IS_FLOAT(float); + GLM_DETAIL_IS_FLOAT(double); + GLM_DETAIL_IS_FLOAT(long double); + + ////////////////// + // bool + + template <typename T> + struct is_bool + { + enum is_bool_enum + { + _YES = 0, + _NO = 1 + }; + }; + + template <> + struct is_bool<bool> + { + enum is_bool_enum + { + _YES = 1, + _NO = 0 + }; + }; + + ////////////////// + // vector + + template <typename T> + struct is_vector + { + enum is_vector_enum + { + _YES = 0, + _NO = 1 + }; + }; + +# define GLM_DETAIL_IS_VECTOR(TYPE) \ + template <typename T> \ + struct is_vector<TYPE<T> > \ + { \ + enum is_vector_enum \ + { \ + _YES = 1, \ + _NO = 0 \ + }; \ + } + + ////////////////// + // matrix + + template <typename T> + struct is_matrix + { + enum is_matrix_enum + { + _YES = 0, + _NO = 1 + }; + }; + +#define GLM_DETAIL_IS_MATRIX(T) \ + template <> \ + struct is_matrix \ + { \ + enum is_matrix_enum \ + { \ + _YES = 1, \ + _NO = 0 \ + }; \ + } + + ////////////////// + // type + + template <typename T> + struct type + { + enum type_enum + { + is_float = is_float<T>::_YES, + is_int = is_int<T>::_YES, + is_uint = is_uint<T>::_YES, + is_bool = is_bool<T>::_YES + }; + }; + + ////////////////// + // type + + typedef signed char int8; + typedef signed short int16; + typedef signed int int32; + typedef detail::sint64 int64; + + typedef unsigned char uint8; + typedef unsigned short uint16; + typedef unsigned int uint32; + typedef detail::uint64 uint64; + + typedef detail::half float16; + typedef float float32; + typedef double float64; + + ////////////////// + // float_or_int_trait + + struct float_or_int_value + { + enum + { + GLM_ERROR, + GLM_FLOAT, + GLM_INT + }; + }; + + template <typename T> + struct float_or_int_trait + { + enum{ID = float_or_int_value::GLM_ERROR}; + }; + + template <> + struct float_or_int_trait<int8> + { + enum{ID = float_or_int_value::GLM_INT}; + }; + + template <> + struct float_or_int_trait<int16> + { + enum{ID = float_or_int_value::GLM_INT}; + }; + + template <> + struct float_or_int_trait<int32> + { + enum{ID = float_or_int_value::GLM_INT}; + }; + + template <> + struct float_or_int_trait<int64> + { + enum{ID = float_or_int_value::GLM_INT}; + }; + + template <> + struct float_or_int_trait<uint8> + { + enum{ID = float_or_int_value::GLM_INT}; + }; + + template <> + struct float_or_int_trait<uint16> + { + enum{ID = float_or_int_value::GLM_INT}; + }; + + template <> + struct float_or_int_trait<uint32> + { + enum{ID = float_or_int_value::GLM_INT}; + }; + + template <> + struct float_or_int_trait<uint64> + { + enum{ID = float_or_int_value::GLM_INT}; + }; + + template <> + struct float_or_int_trait<float16> + { + enum{ID = float_or_int_value::GLM_FLOAT}; + }; + + template <> + struct float_or_int_trait<float32> + { + enum{ID = float_or_int_value::GLM_FLOAT}; + }; + + template <> + struct float_or_int_trait<float64> + { + enum{ID = float_or_int_value::GLM_FLOAT}; + }; + +}//namespace detail +}//namespace glm + +#if((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2005)) +# define GLM_DEPRECATED __declspec(deprecated) +# define GLM_ALIGN(x) __declspec(align(x)) +# define GLM_ALIGNED_STRUCT(x) __declspec(align(x)) struct +# define GLM_RESTRICT __declspec(restrict) +# define GLM_RESTRICT_VAR __restrict +# define GLM_CONSTEXPR +#elif(GLM_COMPILER & GLM_COMPILER_INTEL) +# define GLM_DEPRECATED +# define GLM_ALIGN(x) __declspec(align(x)) +# define GLM_ALIGNED_STRUCT(x) __declspec(align(x)) struct +# define GLM_RESTRICT +# define GLM_RESTRICT_VAR __restrict +# define GLM_CONSTEXPR +#elif(((GLM_COMPILER & (GLM_COMPILER_GCC | GLM_COMPILER_LLVM_GCC)) && (GLM_COMPILER >= GLM_COMPILER_GCC31)) || (GLM_COMPILER & GLM_COMPILER_CLANG)) +# define GLM_DEPRECATED __attribute__((__deprecated__)) +# define GLM_ALIGN(x) __attribute__((aligned(x))) +# define GLM_ALIGNED_STRUCT(x) struct __attribute__((aligned(x))) +# if(GLM_COMPILER >= GLM_COMPILER_GCC33) +# define GLM_RESTRICT __restrict__ +# define GLM_RESTRICT_VAR __restrict__ +# else +# define GLM_RESTRICT +# define GLM_RESTRICT_VAR +# endif +# define GLM_RESTRICT __restrict__ +# define GLM_RESTRICT_VAR __restrict__ +# if((GLM_COMPILER >= GLM_COMPILER_GCC47) && ((GLM_LANG & GLM_LANG_CXX0X) == GLM_LANG_CXX0X)) +# define GLM_CONSTEXPR constexpr +# else +# define GLM_CONSTEXPR +# endif +#else +# define GLM_DEPRECATED +# define GLM_ALIGN +# define GLM_ALIGNED_STRUCT(x) +# define GLM_RESTRICT +# define GLM_RESTRICT_VAR +# define GLM_CONSTEXPR +#endif//GLM_COMPILER + +#endif//glm_core_detail diff --git a/include/gal/opengl/glm/core/_fixes.hpp b/include/gal/opengl/glm/core/_fixes.hpp new file mode 100644 index 0000000..b4cec5f --- /dev/null +++ b/include/gal/opengl/glm/core/_fixes.hpp @@ -0,0 +1,55 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/_fixes.hpp +/// @date 2011-02-21 / 2011-11-22 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#include <cmath> + +//! Workaround for compatibility with other libraries +#ifdef max +#undef max +#endif + +//! Workaround for compatibility with other libraries +#ifdef min +#undef min +#endif + +//! Workaround for Android +#ifdef isnan +#undef isnan +#endif + +//! Workaround for Android +#ifdef isinf +#undef isinf +#endif + +//! Workaround for Chrone Native Client +#ifdef log2 +#undef log2 +#endif + diff --git a/include/gal/opengl/glm/core/_swizzle.hpp b/include/gal/opengl/glm/core/_swizzle.hpp new file mode 100644 index 0000000..dc06944 --- /dev/null +++ b/include/gal/opengl/glm/core/_swizzle.hpp @@ -0,0 +1,861 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/_swizzle.hpp +/// @date 2006-04-20 / 2011-02-16 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_swizzle +#define glm_core_swizzle + +#include "_swizzle_func.hpp" + +namespace glm +{ + enum comp + { + X = 0, + R = 0, + S = 0, + Y = 1, + G = 1, + T = 1, + Z = 2, + B = 2, + P = 2, + W = 3, + A = 3, + Q = 3 + }; +}//namespace glm + +namespace glm{ +namespace detail +{ + // Internal class for implementing swizzle operators + template <typename T, int N> + struct _swizzle_base0 + { + typedef T value_type; + + protected: + GLM_FUNC_QUALIFIER value_type& elem (size_t i) { return (reinterpret_cast<value_type*>(_buffer))[i]; } + GLM_FUNC_QUALIFIER const value_type& elem (size_t i) const { return (reinterpret_cast<const value_type*>(_buffer))[i]; } + + // Use an opaque buffer to *ensure* the compiler doesn't call a constructor. + // The size 1 buffer is assumed to aligned to the actual members so that the + // elem() + char _buffer[1]; + }; + + template <typename T, typename V, int E0, int E1, int E2, int E3, int N> + struct _swizzle_base1 : public _swizzle_base0<T,N> + { + }; + + template <typename T, typename V, int E0, int E1> + struct _swizzle_base1<T,V,E0,E1,-1,-2,2> : public _swizzle_base0<T,2> + { + GLM_FUNC_QUALIFIER V operator ()() const { return V(this->elem(E0), this->elem(E1)); } + }; + + template <typename T, typename V, int E0, int E1, int E2> + struct _swizzle_base1<T,V,E0,E1,E2,-1,3> : public _swizzle_base0<T,3> + { + GLM_FUNC_QUALIFIER V operator ()() const { return V(this->elem(E0), this->elem(E1), this->elem(E2)); } + }; + + template <typename T, typename V, int E0, int E1, int E2, int E3> + struct _swizzle_base1<T,V,E0,E1,E2,E3,4> : public _swizzle_base0<T,4> + { + GLM_FUNC_QUALIFIER V operator ()() const { return V(this->elem(E0), this->elem(E1), this->elem(E2), this->elem(E3)); } + }; + + // Internal class for implementing swizzle operators + /* + Template parameters: + + ValueType = type of scalar values (e.g. float, double) + VecType = class the swizzle is applies to (e.g. tvec3<float>) + N = number of components in the vector (e.g. 3) + E0...3 = what index the n-th element of this swizzle refers to in the unswizzled vec + + DUPLICATE_ELEMENTS = 1 if there is a repeated element, 0 otherwise (used to specialize swizzles + containing duplicate elements so that they cannot be used as r-values). + */ + template <typename ValueType, typename VecType, int N, int E0, int E1, int E2, int E3, int DUPLICATE_ELEMENTS> + struct _swizzle_base2 : public _swizzle_base1<ValueType,VecType,E0,E1,E2,E3,N> + { + typedef VecType vec_type; + typedef ValueType value_type; + + GLM_FUNC_QUALIFIER _swizzle_base2& operator= (const ValueType& t) + { + for (int i = 0; i < N; ++i) + (*this)[i] = t; + return *this; + } + + GLM_FUNC_QUALIFIER _swizzle_base2& operator= (const VecType& that) + { + struct op { + GLM_FUNC_QUALIFIER void operator() (value_type& e, value_type& t) { e = t; } + }; + _apply_op(that, op()); + return *this; + } + + GLM_FUNC_QUALIFIER void operator -= (const VecType& that) + { + struct op { + GLM_FUNC_QUALIFIER void operator() (value_type& e, value_type& t) { e -= t; } + }; + _apply_op(that, op()); + } + + GLM_FUNC_QUALIFIER void operator += (const VecType& that) + { + struct op { + GLM_FUNC_QUALIFIER void operator() (value_type& e, value_type& t) { e += t; } + }; + _apply_op(that, op()); + } + + GLM_FUNC_QUALIFIER void operator *= (const VecType& that) + { + struct op { + GLM_FUNC_QUALIFIER void operator() (value_type& e, value_type& t) { e *= t; } + }; + _apply_op(that, op()); + } + + GLM_FUNC_QUALIFIER void operator /= (const VecType& that) + { + struct op { + GLM_FUNC_QUALIFIER void operator() (value_type& e, value_type& t) { e /= t; } + }; + _apply_op(that, op()); + } + + GLM_FUNC_QUALIFIER value_type& operator[] (size_t i) + { +#ifndef __CUDA_ARCH__ + static +#endif + const int offset_dst[4] = { E0, E1, E2, E3 }; + return this->elem(offset_dst[i]); + } + GLM_FUNC_QUALIFIER value_type operator[] (size_t i) const + { +#ifndef __CUDA_ARCH__ + static +#endif + const int offset_dst[4] = { E0, E1, E2, E3 }; + return this->elem(offset_dst[i]); + } + protected: + template <typename T> + GLM_FUNC_QUALIFIER void _apply_op(const VecType& that, T op) + { + // Make a copy of the data in this == &that. + // The copier should optimize out the copy in cases where the function is + // properly inlined and the copy is not necessary. + ValueType t[N]; + for (int i = 0; i < N; ++i) + t[i] = that[i]; + for (int i = 0; i < N; ++i) + op( (*this)[i], t[i] ); + } + }; + + // Specialization for swizzles containing duplicate elements. These cannot be modified. + template <typename ValueType, typename VecType, int N, int E0, int E1, int E2, int E3> + struct _swizzle_base2<ValueType,VecType,N,E0,E1,E2,E3,1> : public _swizzle_base1<ValueType,VecType,E0,E1,E2,E3,N> + { + typedef VecType vec_type; + typedef ValueType value_type; + + struct Stub {}; + GLM_FUNC_QUALIFIER _swizzle_base2& operator= (Stub const &) { return *this; } + + GLM_FUNC_QUALIFIER value_type operator[] (size_t i) const + { +#ifndef __CUDA_ARCH__ + static +#endif + const int offset_dst[4] = { E0, E1, E2, E3 }; + return this->elem(offset_dst[i]); + } + }; + + template <int N,typename ValueType, typename VecType, int E0,int E1,int E2,int E3> + struct swizzle : public _swizzle_base2<ValueType,VecType,N,E0,E1,E2,E3,(E0==E1||E0==E2||E0==E3||E1==E2||E1==E3||E2==E3)> + { + typedef _swizzle_base2<ValueType,VecType,N,E0,E1,E2,E3,(E0==E1||E0==E2||E0==E3||E1==E2||E1==E3||E2==E3)> base_type; + + using base_type::operator=; + + GLM_FUNC_QUALIFIER operator VecType () const { return (*this)(); } + }; + +// +// To prevent the C++ syntax from getting entirely overwhelming, define some alias macros +// +#define _GLM_SWIZZLE_TEMPLATE1 template <int N, typename T, typename V, int E0, int E1, int E2, int E3> +#define _GLM_SWIZZLE_TEMPLATE2 template <int N, typename T, typename V, int E0, int E1, int E2, int E3, int F0, int F1, int F2, int F3> +#define _GLM_SWIZZLE_TYPE1 glm::detail::swizzle<N,T,V,E0,E1,E2,E3> +#define _GLM_SWIZZLE_TYPE2 glm::detail::swizzle<N,T,V,F0,F1,F2,F3> + +// +// Wrapper for a binary operator (e.g. u.yy + v.zy) +// +#define _GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(OPERAND) \ + _GLM_SWIZZLE_TEMPLATE2 \ + GLM_FUNC_QUALIFIER V operator OPERAND ( const _GLM_SWIZZLE_TYPE1& a, const _GLM_SWIZZLE_TYPE2& b) \ + { \ + return a() OPERAND b(); \ + } \ + _GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER V operator OPERAND ( const _GLM_SWIZZLE_TYPE1& a, const V& b) \ + { \ + return a() OPERAND b; \ + } \ + _GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER V operator OPERAND ( const V& a, const _GLM_SWIZZLE_TYPE1& b) \ + { \ + return a OPERAND b(); \ + } + +// +// Wrapper for a operand between a swizzle and a binary (e.g. 1.0f - u.xyz) +// +#define _GLM_SWIZZLE_SCALAR_BINARY_OPERATOR_IMPLEMENTATION(OPERAND) \ + _GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER V operator OPERAND ( const _GLM_SWIZZLE_TYPE1& a, const T& b) \ + { \ + return a() OPERAND b; \ + } \ + _GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER V operator OPERAND ( const T& a, const _GLM_SWIZZLE_TYPE1& b) \ + { \ + return a OPERAND b(); \ + } + +// +// Macro for wrapping a function taking one argument (e.g. abs()) +// +#define _GLM_SWIZZLE_FUNCTION_1_ARGS(RETURN_TYPE,FUNCTION) \ + _GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const _GLM_SWIZZLE_TYPE1& a) \ + { \ + return FUNCTION(a()); \ + } + +// +// Macro for wrapping a function taking two vector arguments (e.g. dot()). +// +#define _GLM_SWIZZLE_FUNCTION_2_ARGS(RETURN_TYPE,FUNCTION) \ + _GLM_SWIZZLE_TEMPLATE2 \ + GLM_FUNC_QUALIFIER typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const _GLM_SWIZZLE_TYPE1& a, const _GLM_SWIZZLE_TYPE2& b) \ + { \ + return FUNCTION(a(), b()); \ + } \ + _GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const _GLM_SWIZZLE_TYPE1& a, const _GLM_SWIZZLE_TYPE1& b) \ + { \ + return FUNCTION(a(), b()); \ + } \ + _GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const _GLM_SWIZZLE_TYPE1& a, const typename V& b) \ + { \ + return FUNCTION(a(), b); \ + } \ + _GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const V& a, const _GLM_SWIZZLE_TYPE1& b) \ + { \ + return FUNCTION(a, b()); \ + } + +// +// Macro for wrapping a function take 2 vec arguments followed by a scalar (e.g. mix()). +// +#define _GLM_SWIZZLE_FUNCTION_2_ARGS_SCALAR(RETURN_TYPE,FUNCTION) \ + _GLM_SWIZZLE_TEMPLATE2 \ + GLM_FUNC_QUALIFIER typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const _GLM_SWIZZLE_TYPE1& a, const _GLM_SWIZZLE_TYPE2& b, const T& c) \ + { \ + return FUNCTION(a(), b(), c); \ + } \ + _GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const _GLM_SWIZZLE_TYPE1& a, const _GLM_SWIZZLE_TYPE1& b, const T& c) \ + { \ + return FUNCTION(a(), b(), c); \ + } \ + _GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const _GLM_SWIZZLE_TYPE1& a, const typename S0::vec_type& b, const T& c)\ + { \ + return FUNCTION(a(), b, c); \ + } \ + _GLM_SWIZZLE_TEMPLATE1 \ + GLM_FUNC_QUALIFIER typename _GLM_SWIZZLE_TYPE1::RETURN_TYPE FUNCTION(const typename V& a, const _GLM_SWIZZLE_TYPE1& b, const T& c) \ + { \ + return FUNCTION(a, b(), c); \ + } + +}//namespace detail +}//namespace glm + +namespace glm +{ + namespace detail + { + _GLM_SWIZZLE_SCALAR_BINARY_OPERATOR_IMPLEMENTATION(-) + _GLM_SWIZZLE_SCALAR_BINARY_OPERATOR_IMPLEMENTATION(*) + _GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(+) + _GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(-) + _GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(*) + _GLM_SWIZZLE_VECTOR_BINARY_OPERATOR_IMPLEMENTATION(/) + } + + // + // Swizzles are distinct types from the unswizzled type. The below macros will + // provide template specializations for the swizzle types for the given functions + // so that the compiler does not have any ambiguity to choosing how to handle + // the function. + // + // The alternative is to use the operator()() when calling the function in order + // to explicitly convert the swizzled type to the unswizzled type. + // + + //_GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type, abs); + //_GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type, acos); + //_GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type, acosh); + //_GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type, all); + //_GLM_SWIZZLE_FUNCTION_1_ARGS(vec_type, any); + + //_GLM_SWIZZLE_FUNCTION_2_ARGS(value_type, dot); + //_GLM_SWIZZLE_FUNCTION_2_ARGS(vec_type, cross); + //_GLM_SWIZZLE_FUNCTION_2_ARGS(vec_type, step); + //_GLM_SWIZZLE_FUNCTION_2_ARGS_SCALAR(vec_type, mix); +} + +#define _GLM_SWIZZLE2_2_MEMBERS(T,P,E0,E1) \ + struct { glm::detail::swizzle<2,T,P,0,0,-1,-2> E0 ## E0; }; \ + struct { glm::detail::swizzle<2,T,P,0,1,-1,-2> E0 ## E1; }; \ + struct { glm::detail::swizzle<2,T,P,1,0,-1,-2> E1 ## E0; }; \ + struct { glm::detail::swizzle<2,T,P,1,1,-1,-2> E1 ## E1; }; + +#define _GLM_SWIZZLE2_3_MEMBERS(T,P2,E0,E1) \ + struct { glm::detail::swizzle<3,T,P2,0,0,0,-1> E0 ## E0 ## E0; }; \ + struct { glm::detail::swizzle<3,T,P2,0,0,1,-1> E0 ## E0 ## E1; }; \ + struct { glm::detail::swizzle<3,T,P2,0,1,0,-1> E0 ## E1 ## E0; }; \ + struct { glm::detail::swizzle<3,T,P2,0,1,1,-1> E0 ## E1 ## E1; }; \ + struct { glm::detail::swizzle<3,T,P2,1,0,0,-1> E1 ## E0 ## E0; }; \ + struct { glm::detail::swizzle<3,T,P2,1,0,1,-1> E1 ## E0 ## E1; }; \ + struct { glm::detail::swizzle<3,T,P2,1,1,0,-1> E1 ## E1 ## E0; }; \ + struct { glm::detail::swizzle<3,T,P2,1,1,1,-1> E1 ## E1 ## E1; }; + +#define _GLM_SWIZZLE2_4_MEMBERS(T,P2,E0,E1) \ + struct { glm::detail::swizzle<4,T,P2,0,0,0,0> E0 ## E0 ## E0 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P2,0,0,0,1> E0 ## E0 ## E0 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P2,0,0,1,0> E0 ## E0 ## E1 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P2,0,0,1,1> E0 ## E0 ## E1 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P2,0,1,0,0> E0 ## E1 ## E0 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P2,0,1,0,1> E0 ## E1 ## E0 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P2,0,1,1,0> E0 ## E1 ## E1 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P2,0,1,1,1> E0 ## E1 ## E1 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P2,1,0,0,0> E1 ## E0 ## E0 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P2,1,0,0,1> E1 ## E0 ## E0 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P2,1,0,1,0> E1 ## E0 ## E1 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P2,1,0,1,1> E1 ## E0 ## E1 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P2,1,1,0,0> E1 ## E1 ## E0 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P2,1,1,0,1> E1 ## E1 ## E0 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P2,1,1,1,0> E1 ## E1 ## E1 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P2,1,1,1,1> E1 ## E1 ## E1 ## E1; }; + +#define _GLM_SWIZZLE3_2_MEMBERS(T,P2,E0,E1,E2) \ + struct { glm::detail::swizzle<2,T,P2,0,0,-1,-2> E0 ## E0; }; \ + struct { glm::detail::swizzle<2,T,P2,0,1,-1,-2> E0 ## E1; }; \ + struct { glm::detail::swizzle<2,T,P2,0,2,-1,-2> E0 ## E2; }; \ + struct { glm::detail::swizzle<2,T,P2,1,0,-1,-2> E1 ## E0; }; \ + struct { glm::detail::swizzle<2,T,P2,1,1,-1,-2> E1 ## E1; }; \ + struct { glm::detail::swizzle<2,T,P2,1,2,-1,-2> E1 ## E2; }; \ + struct { glm::detail::swizzle<2,T,P2,2,0,-1,-2> E2 ## E0; }; \ + struct { glm::detail::swizzle<2,T,P2,2,1,-1,-2> E2 ## E1; }; \ + struct { glm::detail::swizzle<2,T,P2,2,2,-1,-2> E2 ## E2; }; + +#define _GLM_SWIZZLE3_3_MEMBERS(T,P,E0,E1,E2) \ + struct { glm::detail::swizzle<3,T,P,0,0,0,-1> E0 ## E0 ## E0; }; \ + struct { glm::detail::swizzle<3,T,P,0,0,1,-1> E0 ## E0 ## E1; }; \ + struct { glm::detail::swizzle<3,T,P,0,0,2,-1> E0 ## E0 ## E2; }; \ + struct { glm::detail::swizzle<3,T,P,0,1,0,-1> E0 ## E1 ## E0; }; \ + struct { glm::detail::swizzle<3,T,P,0,1,1,-1> E0 ## E1 ## E1; }; \ + struct { glm::detail::swizzle<3,T,P,0,1,2,-1> E0 ## E1 ## E2; }; \ + struct { glm::detail::swizzle<3,T,P,0,2,0,-1> E0 ## E2 ## E0; }; \ + struct { glm::detail::swizzle<3,T,P,0,2,1,-1> E0 ## E2 ## E1; }; \ + struct { glm::detail::swizzle<3,T,P,0,2,2,-1> E0 ## E2 ## E2; }; \ + struct { glm::detail::swizzle<3,T,P,1,0,0,-1> E1 ## E0 ## E0; }; \ + struct { glm::detail::swizzle<3,T,P,1,0,1,-1> E1 ## E0 ## E1; }; \ + struct { glm::detail::swizzle<3,T,P,1,0,2,-1> E1 ## E0 ## E2; }; \ + struct { glm::detail::swizzle<3,T,P,1,1,0,-1> E1 ## E1 ## E0; }; \ + struct { glm::detail::swizzle<3,T,P,1,1,1,-1> E1 ## E1 ## E1; }; \ + struct { glm::detail::swizzle<3,T,P,1,1,2,-1> E1 ## E1 ## E2; }; \ + struct { glm::detail::swizzle<3,T,P,1,2,0,-1> E1 ## E2 ## E0; }; \ + struct { glm::detail::swizzle<3,T,P,1,2,1,-1> E1 ## E2 ## E1; }; \ + struct { glm::detail::swizzle<3,T,P,1,2,2,-1> E1 ## E2 ## E2; }; \ + struct { glm::detail::swizzle<3,T,P,2,0,0,-1> E2 ## E0 ## E0; }; \ + struct { glm::detail::swizzle<3,T,P,2,0,1,-1> E2 ## E0 ## E1; }; \ + struct { glm::detail::swizzle<3,T,P,2,0,2,-1> E2 ## E0 ## E2; }; \ + struct { glm::detail::swizzle<3,T,P,2,1,0,-1> E2 ## E1 ## E0; }; \ + struct { glm::detail::swizzle<3,T,P,2,1,1,-1> E2 ## E1 ## E1; }; \ + struct { glm::detail::swizzle<3,T,P,2,1,2,-1> E2 ## E1 ## E2; }; \ + struct { glm::detail::swizzle<3,T,P,2,2,0,-1> E2 ## E2 ## E0; }; \ + struct { glm::detail::swizzle<3,T,P,2,2,1,-1> E2 ## E2 ## E1; }; \ + struct { glm::detail::swizzle<3,T,P,2,2,2,-1> E2 ## E2 ## E2; }; + +#define _GLM_SWIZZLE3_4_MEMBERS(T,P2,E0,E1,E2) \ + struct { glm::detail::swizzle<4,T,P2,0,0,0,0> E0 ## E0 ## E0 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P2,0,0,0,1> E0 ## E0 ## E0 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P2,0,0,0,2> E0 ## E0 ## E0 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P2,0,0,1,0> E0 ## E0 ## E1 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P2,0,0,1,1> E0 ## E0 ## E1 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P2,0,0,1,2> E0 ## E0 ## E1 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P2,0,0,2,0> E0 ## E0 ## E2 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P2,0,0,2,1> E0 ## E0 ## E2 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P2,0,0,2,2> E0 ## E0 ## E2 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P2,0,1,0,0> E0 ## E1 ## E0 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P2,0,1,0,1> E0 ## E1 ## E0 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P2,0,1,0,2> E0 ## E1 ## E0 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P2,0,1,1,0> E0 ## E1 ## E1 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P2,0,1,1,1> E0 ## E1 ## E1 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P2,0,1,1,2> E0 ## E1 ## E1 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P2,0,1,2,0> E0 ## E1 ## E2 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P2,0,1,2,1> E0 ## E1 ## E2 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P2,0,1,2,2> E0 ## E1 ## E2 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P2,0,2,0,0> E0 ## E2 ## E0 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P2,0,2,0,1> E0 ## E2 ## E0 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P2,0,2,0,2> E0 ## E2 ## E0 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P2,0,2,1,0> E0 ## E2 ## E1 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P2,0,2,1,1> E0 ## E2 ## E1 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P2,0,2,1,2> E0 ## E2 ## E1 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P2,0,2,2,0> E0 ## E2 ## E2 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P2,0,2,2,1> E0 ## E2 ## E2 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P2,0,2,2,2> E0 ## E2 ## E2 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P2,1,0,0,0> E1 ## E0 ## E0 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P2,1,0,0,1> E1 ## E0 ## E0 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P2,1,0,0,2> E1 ## E0 ## E0 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P2,1,0,1,0> E1 ## E0 ## E1 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P2,1,0,1,1> E1 ## E0 ## E1 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P2,1,0,1,2> E1 ## E0 ## E1 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P2,1,0,2,0> E1 ## E0 ## E2 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P2,1,0,2,1> E1 ## E0 ## E2 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P2,1,0,2,2> E1 ## E0 ## E2 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P2,1,1,0,0> E1 ## E1 ## E0 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P2,1,1,0,1> E1 ## E1 ## E0 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P2,1,1,0,2> E1 ## E1 ## E0 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P2,1,1,1,0> E1 ## E1 ## E1 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P2,1,1,1,1> E1 ## E1 ## E1 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P2,1,1,1,2> E1 ## E1 ## E1 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P2,1,1,2,0> E1 ## E1 ## E2 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P2,1,1,2,1> E1 ## E1 ## E2 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P2,1,1,2,2> E1 ## E1 ## E2 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P2,1,2,0,0> E1 ## E2 ## E0 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P2,1,2,0,1> E1 ## E2 ## E0 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P2,1,2,0,2> E1 ## E2 ## E0 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P2,1,2,1,0> E1 ## E2 ## E1 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P2,1,2,1,1> E1 ## E2 ## E1 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P2,1,2,1,2> E1 ## E2 ## E1 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P2,1,2,2,0> E1 ## E2 ## E2 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P2,1,2,2,1> E1 ## E2 ## E2 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P2,1,2,2,2> E1 ## E2 ## E2 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P2,2,0,0,0> E2 ## E0 ## E0 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P2,2,0,0,1> E2 ## E0 ## E0 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P2,2,0,0,2> E2 ## E0 ## E0 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P2,2,0,1,0> E2 ## E0 ## E1 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P2,2,0,1,1> E2 ## E0 ## E1 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P2,2,0,1,2> E2 ## E0 ## E1 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P2,2,0,2,0> E2 ## E0 ## E2 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P2,2,0,2,1> E2 ## E0 ## E2 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P2,2,0,2,2> E2 ## E0 ## E2 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P2,2,1,0,0> E2 ## E1 ## E0 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P2,2,1,0,1> E2 ## E1 ## E0 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P2,2,1,0,2> E2 ## E1 ## E0 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P2,2,1,1,0> E2 ## E1 ## E1 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P2,2,1,1,1> E2 ## E1 ## E1 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P2,2,1,1,2> E2 ## E1 ## E1 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P2,2,1,2,0> E2 ## E1 ## E2 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P2,2,1,2,1> E2 ## E1 ## E2 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P2,2,1,2,2> E2 ## E1 ## E2 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P2,2,2,0,0> E2 ## E2 ## E0 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P2,2,2,0,1> E2 ## E2 ## E0 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P2,2,2,0,2> E2 ## E2 ## E0 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P2,2,2,1,0> E2 ## E2 ## E1 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P2,2,2,1,1> E2 ## E2 ## E1 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P2,2,2,1,2> E2 ## E2 ## E1 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P2,2,2,2,0> E2 ## E2 ## E2 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P2,2,2,2,1> E2 ## E2 ## E2 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P2,2,2,2,2> E2 ## E2 ## E2 ## E2; }; + +#define _GLM_SWIZZLE4_2_MEMBERS(T,P,E0,E1,E2,E3) \ + struct { glm::detail::swizzle<2,T,P,0,0,-1,-2> E0 ## E0; }; \ + struct { glm::detail::swizzle<2,T,P,0,1,-1,-2> E0 ## E1; }; \ + struct { glm::detail::swizzle<2,T,P,0,2,-1,-2> E0 ## E2; }; \ + struct { glm::detail::swizzle<2,T,P,0,3,-1,-2> E0 ## E3; }; \ + struct { glm::detail::swizzle<2,T,P,1,0,-1,-2> E1 ## E0; }; \ + struct { glm::detail::swizzle<2,T,P,1,1,-1,-2> E1 ## E1; }; \ + struct { glm::detail::swizzle<2,T,P,1,2,-1,-2> E1 ## E2; }; \ + struct { glm::detail::swizzle<2,T,P,1,3,-1,-2> E1 ## E3; }; \ + struct { glm::detail::swizzle<2,T,P,2,0,-1,-2> E2 ## E0; }; \ + struct { glm::detail::swizzle<2,T,P,2,1,-1,-2> E2 ## E1; }; \ + struct { glm::detail::swizzle<2,T,P,2,2,-1,-2> E2 ## E2; }; \ + struct { glm::detail::swizzle<2,T,P,2,3,-1,-2> E2 ## E3; }; \ + struct { glm::detail::swizzle<2,T,P,3,0,-1,-2> E3 ## E0; }; \ + struct { glm::detail::swizzle<2,T,P,3,1,-1,-2> E3 ## E1; }; \ + struct { glm::detail::swizzle<2,T,P,3,2,-1,-2> E3 ## E2; }; \ + struct { glm::detail::swizzle<2,T,P,3,3,-1,-2> E3 ## E3; }; + +#define _GLM_SWIZZLE4_3_MEMBERS(T,P,E0,E1,E2,E3) \ + struct { glm::detail::swizzle<3,T,P,0,0,0,-1> E0 ## E0 ## E0; }; \ + struct { glm::detail::swizzle<3,T,P,0,0,1,-1> E0 ## E0 ## E1; }; \ + struct { glm::detail::swizzle<3,T,P,0,0,2,-1> E0 ## E0 ## E2; }; \ + struct { glm::detail::swizzle<3,T,P,0,0,3,-1> E0 ## E0 ## E3; }; \ + struct { glm::detail::swizzle<3,T,P,0,1,0,-1> E0 ## E1 ## E0; }; \ + struct { glm::detail::swizzle<3,T,P,0,1,1,-1> E0 ## E1 ## E1; }; \ + struct { glm::detail::swizzle<3,T,P,0,1,2,-1> E0 ## E1 ## E2; }; \ + struct { glm::detail::swizzle<3,T,P,0,1,3,-1> E0 ## E1 ## E3; }; \ + struct { glm::detail::swizzle<3,T,P,0,2,0,-1> E0 ## E2 ## E0; }; \ + struct { glm::detail::swizzle<3,T,P,0,2,1,-1> E0 ## E2 ## E1; }; \ + struct { glm::detail::swizzle<3,T,P,0,2,2,-1> E0 ## E2 ## E2; }; \ + struct { glm::detail::swizzle<3,T,P,0,2,3,-1> E0 ## E2 ## E3; }; \ + struct { glm::detail::swizzle<3,T,P,0,3,0,-1> E0 ## E3 ## E0; }; \ + struct { glm::detail::swizzle<3,T,P,0,3,1,-1> E0 ## E3 ## E1; }; \ + struct { glm::detail::swizzle<3,T,P,0,3,2,-1> E0 ## E3 ## E2; }; \ + struct { glm::detail::swizzle<3,T,P,0,3,3,-1> E0 ## E3 ## E3; }; \ + struct { glm::detail::swizzle<3,T,P,1,0,0,-1> E1 ## E0 ## E0; }; \ + struct { glm::detail::swizzle<3,T,P,1,0,1,-1> E1 ## E0 ## E1; }; \ + struct { glm::detail::swizzle<3,T,P,1,0,2,-1> E1 ## E0 ## E2; }; \ + struct { glm::detail::swizzle<3,T,P,1,0,3,-1> E1 ## E0 ## E3; }; \ + struct { glm::detail::swizzle<3,T,P,1,1,0,-1> E1 ## E1 ## E0; }; \ + struct { glm::detail::swizzle<3,T,P,1,1,1,-1> E1 ## E1 ## E1; }; \ + struct { glm::detail::swizzle<3,T,P,1,1,2,-1> E1 ## E1 ## E2; }; \ + struct { glm::detail::swizzle<3,T,P,1,1,3,-1> E1 ## E1 ## E3; }; \ + struct { glm::detail::swizzle<3,T,P,1,2,0,-1> E1 ## E2 ## E0; }; \ + struct { glm::detail::swizzle<3,T,P,1,2,1,-1> E1 ## E2 ## E1; }; \ + struct { glm::detail::swizzle<3,T,P,1,2,2,-1> E1 ## E2 ## E2; }; \ + struct { glm::detail::swizzle<3,T,P,1,2,3,-1> E1 ## E2 ## E3; }; \ + struct { glm::detail::swizzle<3,T,P,1,3,0,-1> E1 ## E3 ## E0; }; \ + struct { glm::detail::swizzle<3,T,P,1,3,1,-1> E1 ## E3 ## E1; }; \ + struct { glm::detail::swizzle<3,T,P,1,3,2,-1> E1 ## E3 ## E2; }; \ + struct { glm::detail::swizzle<3,T,P,1,3,3,-1> E1 ## E3 ## E3; }; \ + struct { glm::detail::swizzle<3,T,P,2,0,0,-1> E2 ## E0 ## E0; }; \ + struct { glm::detail::swizzle<3,T,P,2,0,1,-1> E2 ## E0 ## E1; }; \ + struct { glm::detail::swizzle<3,T,P,2,0,2,-1> E2 ## E0 ## E2; }; \ + struct { glm::detail::swizzle<3,T,P,2,0,3,-1> E2 ## E0 ## E3; }; \ + struct { glm::detail::swizzle<3,T,P,2,1,0,-1> E2 ## E1 ## E0; }; \ + struct { glm::detail::swizzle<3,T,P,2,1,1,-1> E2 ## E1 ## E1; }; \ + struct { glm::detail::swizzle<3,T,P,2,1,2,-1> E2 ## E1 ## E2; }; \ + struct { glm::detail::swizzle<3,T,P,2,1,3,-1> E2 ## E1 ## E3; }; \ + struct { glm::detail::swizzle<3,T,P,2,2,0,-1> E2 ## E2 ## E0; }; \ + struct { glm::detail::swizzle<3,T,P,2,2,1,-1> E2 ## E2 ## E1; }; \ + struct { glm::detail::swizzle<3,T,P,2,2,2,-1> E2 ## E2 ## E2; }; \ + struct { glm::detail::swizzle<3,T,P,2,2,3,-1> E2 ## E2 ## E3; }; \ + struct { glm::detail::swizzle<3,T,P,2,3,0,-1> E2 ## E3 ## E0; }; \ + struct { glm::detail::swizzle<3,T,P,2,3,1,-1> E2 ## E3 ## E1; }; \ + struct { glm::detail::swizzle<3,T,P,2,3,2,-1> E2 ## E3 ## E2; }; \ + struct { glm::detail::swizzle<3,T,P,2,3,3,-1> E2 ## E3 ## E3; }; \ + struct { glm::detail::swizzle<3,T,P,3,0,0,-1> E3 ## E0 ## E0; }; \ + struct { glm::detail::swizzle<3,T,P,3,0,1,-1> E3 ## E0 ## E1; }; \ + struct { glm::detail::swizzle<3,T,P,3,0,2,-1> E3 ## E0 ## E2; }; \ + struct { glm::detail::swizzle<3,T,P,3,0,3,-1> E3 ## E0 ## E3; }; \ + struct { glm::detail::swizzle<3,T,P,3,1,0,-1> E3 ## E1 ## E0; }; \ + struct { glm::detail::swizzle<3,T,P,3,1,1,-1> E3 ## E1 ## E1; }; \ + struct { glm::detail::swizzle<3,T,P,3,1,2,-1> E3 ## E1 ## E2; }; \ + struct { glm::detail::swizzle<3,T,P,3,1,3,-1> E3 ## E1 ## E3; }; \ + struct { glm::detail::swizzle<3,T,P,3,2,0,-1> E3 ## E2 ## E0; }; \ + struct { glm::detail::swizzle<3,T,P,3,2,1,-1> E3 ## E2 ## E1; }; \ + struct { glm::detail::swizzle<3,T,P,3,2,2,-1> E3 ## E2 ## E2; }; \ + struct { glm::detail::swizzle<3,T,P,3,2,3,-1> E3 ## E2 ## E3; }; \ + struct { glm::detail::swizzle<3,T,P,3,3,0,-1> E3 ## E3 ## E0; }; \ + struct { glm::detail::swizzle<3,T,P,3,3,1,-1> E3 ## E3 ## E1; }; \ + struct { glm::detail::swizzle<3,T,P,3,3,2,-1> E3 ## E3 ## E2; }; \ + struct { glm::detail::swizzle<3,T,P,3,3,3,-1> E3 ## E3 ## E3; }; + +#define _GLM_SWIZZLE4_4_MEMBERS(T,P,E0,E1,E2,E3) \ + struct { glm::detail::swizzle<4,T,P,0,0,0,0> E0 ## E0 ## E0 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,0,0,0,1> E0 ## E0 ## E0 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,0,0,0,2> E0 ## E0 ## E0 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,0,0,0,3> E0 ## E0 ## E0 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,0,0,1,0> E0 ## E0 ## E1 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,0,0,1,1> E0 ## E0 ## E1 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,0,0,1,2> E0 ## E0 ## E1 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,0,0,1,3> E0 ## E0 ## E1 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,0,0,2,0> E0 ## E0 ## E2 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,0,0,2,1> E0 ## E0 ## E2 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,0,0,2,2> E0 ## E0 ## E2 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,0,0,2,3> E0 ## E0 ## E2 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,0,0,3,0> E0 ## E0 ## E3 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,0,0,3,1> E0 ## E0 ## E3 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,0,0,3,2> E0 ## E0 ## E3 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,0,0,3,3> E0 ## E0 ## E3 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,0,1,0,0> E0 ## E1 ## E0 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,0,1,0,1> E0 ## E1 ## E0 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,0,1,0,2> E0 ## E1 ## E0 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,0,1,0,3> E0 ## E1 ## E0 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,0,1,1,0> E0 ## E1 ## E1 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,0,1,1,1> E0 ## E1 ## E1 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,0,1,1,2> E0 ## E1 ## E1 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,0,1,1,3> E0 ## E1 ## E1 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,0,1,2,0> E0 ## E1 ## E2 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,0,1,2,1> E0 ## E1 ## E2 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,0,1,2,2> E0 ## E1 ## E2 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,0,1,2,3> E0 ## E1 ## E2 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,0,1,3,0> E0 ## E1 ## E3 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,0,1,3,1> E0 ## E1 ## E3 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,0,1,3,2> E0 ## E1 ## E3 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,0,1,3,3> E0 ## E1 ## E3 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,0,2,0,0> E0 ## E2 ## E0 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,0,2,0,1> E0 ## E2 ## E0 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,0,2,0,2> E0 ## E2 ## E0 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,0,2,0,3> E0 ## E2 ## E0 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,0,2,1,0> E0 ## E2 ## E1 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,0,2,1,1> E0 ## E2 ## E1 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,0,2,1,2> E0 ## E2 ## E1 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,0,2,1,3> E0 ## E2 ## E1 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,0,2,2,0> E0 ## E2 ## E2 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,0,2,2,1> E0 ## E2 ## E2 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,0,2,2,2> E0 ## E2 ## E2 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,0,2,2,3> E0 ## E2 ## E2 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,0,2,3,0> E0 ## E2 ## E3 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,0,2,3,1> E0 ## E2 ## E3 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,0,2,3,2> E0 ## E2 ## E3 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,0,2,3,3> E0 ## E2 ## E3 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,0,3,0,0> E0 ## E3 ## E0 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,0,3,0,1> E0 ## E3 ## E0 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,0,3,0,2> E0 ## E3 ## E0 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,0,3,0,3> E0 ## E3 ## E0 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,0,3,1,0> E0 ## E3 ## E1 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,0,3,1,1> E0 ## E3 ## E1 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,0,3,1,2> E0 ## E3 ## E1 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,0,3,1,3> E0 ## E3 ## E1 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,0,3,2,0> E0 ## E3 ## E2 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,0,3,2,1> E0 ## E3 ## E2 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,0,3,2,2> E0 ## E3 ## E2 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,0,3,2,3> E0 ## E3 ## E2 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,0,3,3,0> E0 ## E3 ## E3 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,0,3,3,1> E0 ## E3 ## E3 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,0,3,3,2> E0 ## E3 ## E3 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,0,3,3,3> E0 ## E3 ## E3 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,1,0,0,0> E1 ## E0 ## E0 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,1,0,0,1> E1 ## E0 ## E0 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,1,0,0,2> E1 ## E0 ## E0 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,1,0,0,3> E1 ## E0 ## E0 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,1,0,1,0> E1 ## E0 ## E1 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,1,0,1,1> E1 ## E0 ## E1 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,1,0,1,2> E1 ## E0 ## E1 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,1,0,1,3> E1 ## E0 ## E1 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,1,0,2,0> E1 ## E0 ## E2 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,1,0,2,1> E1 ## E0 ## E2 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,1,0,2,2> E1 ## E0 ## E2 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,1,0,2,3> E1 ## E0 ## E2 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,1,0,3,0> E1 ## E0 ## E3 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,1,0,3,1> E1 ## E0 ## E3 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,1,0,3,2> E1 ## E0 ## E3 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,1,0,3,3> E1 ## E0 ## E3 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,1,1,0,0> E1 ## E1 ## E0 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,1,1,0,1> E1 ## E1 ## E0 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,1,1,0,2> E1 ## E1 ## E0 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,1,1,0,3> E1 ## E1 ## E0 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,1,1,1,0> E1 ## E1 ## E1 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,1,1,1,1> E1 ## E1 ## E1 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,1,1,1,2> E1 ## E1 ## E1 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,1,1,1,3> E1 ## E1 ## E1 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,1,1,2,0> E1 ## E1 ## E2 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,1,1,2,1> E1 ## E1 ## E2 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,1,1,2,2> E1 ## E1 ## E2 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,1,1,2,3> E1 ## E1 ## E2 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,1,1,3,0> E1 ## E1 ## E3 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,1,1,3,1> E1 ## E1 ## E3 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,1,1,3,2> E1 ## E1 ## E3 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,1,1,3,3> E1 ## E1 ## E3 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,1,2,0,0> E1 ## E2 ## E0 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,1,2,0,1> E1 ## E2 ## E0 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,1,2,0,2> E1 ## E2 ## E0 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,1,2,0,3> E1 ## E2 ## E0 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,1,2,1,0> E1 ## E2 ## E1 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,1,2,1,1> E1 ## E2 ## E1 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,1,2,1,2> E1 ## E2 ## E1 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,1,2,1,3> E1 ## E2 ## E1 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,1,2,2,0> E1 ## E2 ## E2 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,1,2,2,1> E1 ## E2 ## E2 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,1,2,2,2> E1 ## E2 ## E2 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,1,2,2,3> E1 ## E2 ## E2 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,1,2,3,0> E1 ## E2 ## E3 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,1,2,3,1> E1 ## E2 ## E3 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,1,2,3,2> E1 ## E2 ## E3 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,1,2,3,3> E1 ## E2 ## E3 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,1,3,0,0> E1 ## E3 ## E0 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,1,3,0,1> E1 ## E3 ## E0 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,1,3,0,2> E1 ## E3 ## E0 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,1,3,0,3> E1 ## E3 ## E0 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,1,3,1,0> E1 ## E3 ## E1 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,1,3,1,1> E1 ## E3 ## E1 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,1,3,1,2> E1 ## E3 ## E1 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,1,3,1,3> E1 ## E3 ## E1 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,1,3,2,0> E1 ## E3 ## E2 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,1,3,2,1> E1 ## E3 ## E2 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,1,3,2,2> E1 ## E3 ## E2 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,1,3,2,3> E1 ## E3 ## E2 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,1,3,3,0> E1 ## E3 ## E3 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,1,3,3,1> E1 ## E3 ## E3 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,1,3,3,2> E1 ## E3 ## E3 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,1,3,3,3> E1 ## E3 ## E3 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,2,0,0,0> E2 ## E0 ## E0 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,2,0,0,1> E2 ## E0 ## E0 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,2,0,0,2> E2 ## E0 ## E0 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,2,0,0,3> E2 ## E0 ## E0 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,2,0,1,0> E2 ## E0 ## E1 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,2,0,1,1> E2 ## E0 ## E1 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,2,0,1,2> E2 ## E0 ## E1 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,2,0,1,3> E2 ## E0 ## E1 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,2,0,2,0> E2 ## E0 ## E2 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,2,0,2,1> E2 ## E0 ## E2 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,2,0,2,2> E2 ## E0 ## E2 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,2,0,2,3> E2 ## E0 ## E2 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,2,0,3,0> E2 ## E0 ## E3 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,2,0,3,1> E2 ## E0 ## E3 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,2,0,3,2> E2 ## E0 ## E3 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,2,0,3,3> E2 ## E0 ## E3 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,2,1,0,0> E2 ## E1 ## E0 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,2,1,0,1> E2 ## E1 ## E0 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,2,1,0,2> E2 ## E1 ## E0 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,2,1,0,3> E2 ## E1 ## E0 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,2,1,1,0> E2 ## E1 ## E1 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,2,1,1,1> E2 ## E1 ## E1 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,2,1,1,2> E2 ## E1 ## E1 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,2,1,1,3> E2 ## E1 ## E1 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,2,1,2,0> E2 ## E1 ## E2 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,2,1,2,1> E2 ## E1 ## E2 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,2,1,2,2> E2 ## E1 ## E2 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,2,1,2,3> E2 ## E1 ## E2 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,2,1,3,0> E2 ## E1 ## E3 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,2,1,3,1> E2 ## E1 ## E3 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,2,1,3,2> E2 ## E1 ## E3 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,2,1,3,3> E2 ## E1 ## E3 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,2,2,0,0> E2 ## E2 ## E0 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,2,2,0,1> E2 ## E2 ## E0 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,2,2,0,2> E2 ## E2 ## E0 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,2,2,0,3> E2 ## E2 ## E0 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,2,2,1,0> E2 ## E2 ## E1 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,2,2,1,1> E2 ## E2 ## E1 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,2,2,1,2> E2 ## E2 ## E1 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,2,2,1,3> E2 ## E2 ## E1 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,2,2,2,0> E2 ## E2 ## E2 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,2,2,2,1> E2 ## E2 ## E2 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,2,2,2,2> E2 ## E2 ## E2 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,2,2,2,3> E2 ## E2 ## E2 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,2,2,3,0> E2 ## E2 ## E3 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,2,2,3,1> E2 ## E2 ## E3 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,2,2,3,2> E2 ## E2 ## E3 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,2,2,3,3> E2 ## E2 ## E3 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,2,3,0,0> E2 ## E3 ## E0 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,2,3,0,1> E2 ## E3 ## E0 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,2,3,0,2> E2 ## E3 ## E0 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,2,3,0,3> E2 ## E3 ## E0 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,2,3,1,0> E2 ## E3 ## E1 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,2,3,1,1> E2 ## E3 ## E1 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,2,3,1,2> E2 ## E3 ## E1 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,2,3,1,3> E2 ## E3 ## E1 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,2,3,2,0> E2 ## E3 ## E2 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,2,3,2,1> E2 ## E3 ## E2 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,2,3,2,2> E2 ## E3 ## E2 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,2,3,2,3> E2 ## E3 ## E2 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,2,3,3,0> E2 ## E3 ## E3 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,2,3,3,1> E2 ## E3 ## E3 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,2,3,3,2> E2 ## E3 ## E3 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,2,3,3,3> E2 ## E3 ## E3 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,3,0,0,0> E3 ## E0 ## E0 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,3,0,0,1> E3 ## E0 ## E0 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,3,0,0,2> E3 ## E0 ## E0 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,3,0,0,3> E3 ## E0 ## E0 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,3,0,1,0> E3 ## E0 ## E1 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,3,0,1,1> E3 ## E0 ## E1 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,3,0,1,2> E3 ## E0 ## E1 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,3,0,1,3> E3 ## E0 ## E1 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,3,0,2,0> E3 ## E0 ## E2 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,3,0,2,1> E3 ## E0 ## E2 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,3,0,2,2> E3 ## E0 ## E2 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,3,0,2,3> E3 ## E0 ## E2 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,3,0,3,0> E3 ## E0 ## E3 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,3,0,3,1> E3 ## E0 ## E3 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,3,0,3,2> E3 ## E0 ## E3 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,3,0,3,3> E3 ## E0 ## E3 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,3,1,0,0> E3 ## E1 ## E0 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,3,1,0,1> E3 ## E1 ## E0 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,3,1,0,2> E3 ## E1 ## E0 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,3,1,0,3> E3 ## E1 ## E0 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,3,1,1,0> E3 ## E1 ## E1 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,3,1,1,1> E3 ## E1 ## E1 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,3,1,1,2> E3 ## E1 ## E1 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,3,1,1,3> E3 ## E1 ## E1 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,3,1,2,0> E3 ## E1 ## E2 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,3,1,2,1> E3 ## E1 ## E2 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,3,1,2,2> E3 ## E1 ## E2 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,3,1,2,3> E3 ## E1 ## E2 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,3,1,3,0> E3 ## E1 ## E3 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,3,1,3,1> E3 ## E1 ## E3 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,3,1,3,2> E3 ## E1 ## E3 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,3,1,3,3> E3 ## E1 ## E3 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,3,2,0,0> E3 ## E2 ## E0 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,3,2,0,1> E3 ## E2 ## E0 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,3,2,0,2> E3 ## E2 ## E0 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,3,2,0,3> E3 ## E2 ## E0 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,3,2,1,0> E3 ## E2 ## E1 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,3,2,1,1> E3 ## E2 ## E1 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,3,2,1,2> E3 ## E2 ## E1 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,3,2,1,3> E3 ## E2 ## E1 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,3,2,2,0> E3 ## E2 ## E2 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,3,2,2,1> E3 ## E2 ## E2 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,3,2,2,2> E3 ## E2 ## E2 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,3,2,2,3> E3 ## E2 ## E2 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,3,2,3,0> E3 ## E2 ## E3 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,3,2,3,1> E3 ## E2 ## E3 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,3,2,3,2> E3 ## E2 ## E3 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,3,2,3,3> E3 ## E2 ## E3 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,3,3,0,0> E3 ## E3 ## E0 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,3,3,0,1> E3 ## E3 ## E0 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,3,3,0,2> E3 ## E3 ## E0 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,3,3,0,3> E3 ## E3 ## E0 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,3,3,1,0> E3 ## E3 ## E1 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,3,3,1,1> E3 ## E3 ## E1 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,3,3,1,2> E3 ## E3 ## E1 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,3,3,1,3> E3 ## E3 ## E1 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,3,3,2,0> E3 ## E3 ## E2 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,3,3,2,1> E3 ## E3 ## E2 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,3,3,2,2> E3 ## E3 ## E2 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,3,3,2,3> E3 ## E3 ## E2 ## E3; }; \ + struct { glm::detail::swizzle<4,T,P,3,3,3,0> E3 ## E3 ## E3 ## E0; }; \ + struct { glm::detail::swizzle<4,T,P,3,3,3,1> E3 ## E3 ## E3 ## E1; }; \ + struct { glm::detail::swizzle<4,T,P,3,3,3,2> E3 ## E3 ## E3 ## E2; }; \ + struct { glm::detail::swizzle<4,T,P,3,3,3,3> E3 ## E3 ## E3 ## E3; }; + +#endif//glm_core_swizzle diff --git a/include/gal/opengl/glm/core/_swizzle_func.hpp b/include/gal/opengl/glm/core/_swizzle_func.hpp new file mode 100644 index 0000000..be66784 --- /dev/null +++ b/include/gal/opengl/glm/core/_swizzle_func.hpp @@ -0,0 +1,787 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/_swizzle_func.hpp +/// @date 2011-10-16 / 2011-10-16 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_swizzle_func +#define glm_core_swizzle_func + +#define GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B) \ + SWIZZLED_TYPE<TMPL_TYPE> A ## B() CONST \ + { \ + return SWIZZLED_TYPE<TMPL_TYPE>(this->A, this->B); \ + } + +#define GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B, C) \ + SWIZZLED_TYPE<TMPL_TYPE> A ## B ## C() CONST \ + { \ + return SWIZZLED_TYPE<TMPL_TYPE>(this->A, this->B, this->C); \ + } + +#define GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B, C, D) \ + SWIZZLED_TYPE<TMPL_TYPE> A ## B ## C ## D() CONST \ + { \ + return SWIZZLED_TYPE<TMPL_TYPE>(this->A, this->B, this->C, this->D); \ + } + +#define GLM_SWIZZLE_GEN_VEC2_ENTRY_DEF(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B) \ + template <typename TMPL_TYPE> \ + SWIZZLED_TYPE<TMPL_TYPE> CLASS_TYPE<TMPL_TYPE>::A ## B() CONST \ + { \ + return SWIZZLED_TYPE<TMPL_TYPE>(this->A, this->B); \ + } + +#define GLM_SWIZZLE_GEN_VEC3_ENTRY_DEF(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B, C) \ + template <typename TMPL_TYPE> \ + SWIZZLED_TYPE<TMPL_TYPE> CLASS_TYPE<TMPL_TYPE>::A ## B ## C() CONST \ + { \ + return SWIZZLED_TYPE<TMPL_TYPE>(this->A, this->B, this->C); \ + } + +#define GLM_SWIZZLE_GEN_VEC4_ENTRY_DEF(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, CONST, A, B, C, D) \ + template <typename TMPL_TYPE> \ + SWIZZLED_TYPE<TMPL_TYPE> CLASS_TYPE<TMPL_TYPE>::A ## B ## C ## D() CONST \ + { \ + return SWIZZLED_TYPE<TMPL_TYPE>(this->A, this->B, this->C, this->D); \ + } + +#define GLM_MUTABLE + +#define GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, A) + +#define GLM_SWIZZLE_GEN_REF_FROM_VEC2(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE) \ + GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, x, y) \ + GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, r, g) \ + GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, s, t) + +//GLM_SWIZZLE_GEN_REF_FROM_VEC2(valType, detail::vec2, detail::ref2) + +#define GLM_SWIZZLE_GEN_REF2_FROM_VEC3_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, B) + +#define GLM_SWIZZLE_GEN_REF3_FROM_VEC3_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, B, A) + +#define GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, A, B, C) \ + GLM_SWIZZLE_GEN_REF3_FROM_VEC3_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC3_TYPE, A, B, C) \ + GLM_SWIZZLE_GEN_REF2_FROM_VEC3_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, A, B, C) + +#define GLM_SWIZZLE_GEN_REF_FROM_VEC3(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE) \ + GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, x, y, z) \ + GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, r, g, b) \ + GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, s, t, q) + +//GLM_SWIZZLE_GEN_REF_FROM_VEC3(valType, detail::vec3, detail::ref2, detail::ref3) + +#define GLM_SWIZZLE_GEN_REF2_FROM_VEC4_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, A, D) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, B, D) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, C, D) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, D, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, D, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, GLM_MUTABLE, D, C) + +#define GLM_SWIZZLE_GEN_REF3_FROM_VEC4_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , A, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , A, B, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , A, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , A, C, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , A, D, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , A, D, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , B, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , B, A, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , B, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , B, C, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , B, D, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , B, D, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , C, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , C, A, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , C, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , C, B, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , C, D, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , C, D, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , D, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , D, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , D, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , D, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , D, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , D, C, B) + +#define GLM_SWIZZLE_GEN_REF4_FROM_VEC4_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , A, C, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , A, C, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , A, D, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , A, D, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , A, B, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , B, C, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , B, C, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , B, D, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , B, D, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , B, A, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , B, A, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , C, B, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , C, B, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , C, D, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , C, D, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , C, A, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , C, A, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , D, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , D, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , D, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , D, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , D, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, , D, B, C, A) + +#define GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, A, B, C, D) \ + GLM_SWIZZLE_GEN_REF2_FROM_VEC4_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, A, B, C, D) \ + GLM_SWIZZLE_GEN_REF3_FROM_VEC4_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC3_TYPE, A, B, C, D) \ + GLM_SWIZZLE_GEN_REF4_FROM_VEC4_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC4_TYPE, A, B, C, D) + +#define GLM_SWIZZLE_GEN_REF_FROM_VEC4(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE) \ + GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, x, y, z, w) \ + GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, r, g, b, a) \ + GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, s, t, q, p) + +//GLM_SWIZZLE_GEN_REF_FROM_VEC4(valType, detail::vec4, detail::ref2, detail::ref3, detail::ref4) + +#define GLM_SWIZZLE_GEN_VEC2_FROM_VEC2_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B) + +#define GLM_SWIZZLE_GEN_VEC3_FROM_VEC2_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B) + +#define GLM_SWIZZLE_GEN_VEC4_FROM_VEC2_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, B) + +#define GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, A, B) \ + GLM_SWIZZLE_GEN_VEC2_FROM_VEC2_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, A, B) \ + GLM_SWIZZLE_GEN_VEC3_FROM_VEC2_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC3_TYPE, A, B) \ + GLM_SWIZZLE_GEN_VEC4_FROM_VEC2_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC4_TYPE, A, B) + +#define GLM_SWIZZLE_GEN_VEC_FROM_VEC2(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, x, y) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, r, g) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, s, t) + +//GLM_SWIZZLE_GEN_VEC_FROM_VEC2(valType, detail::vec2, detail::vec2, detail::vec3, detail::vec4) + +#define GLM_SWIZZLE_GEN_VEC2_FROM_VEC3_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C) + +#define GLM_SWIZZLE_GEN_VEC3_FROM_VEC3_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C) + +#define GLM_SWIZZLE_GEN_VEC4_FROM_VEC3_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, C, C) + +#define GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, A, B, C) \ + GLM_SWIZZLE_GEN_VEC2_FROM_VEC3_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, A, B, C) \ + GLM_SWIZZLE_GEN_VEC3_FROM_VEC3_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC3_TYPE, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_FROM_VEC3_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC4_TYPE, A, B, C) + +#define GLM_SWIZZLE_GEN_VEC_FROM_VEC3(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, x, y, z) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, r, g, b) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, s, t, q) + +//GLM_SWIZZLE_GEN_VEC_FROM_VEC3(valType, detail::vec3, detail::vec2, detail::vec3, detail::vec4) + +#define GLM_SWIZZLE_GEN_VEC2_FROM_VEC4_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C) \ + GLM_SWIZZLE_GEN_VEC2_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D) + +#define GLM_SWIZZLE_GEN_VEC3_FROM_VEC4_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, D) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, A) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, B) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, C) \ + GLM_SWIZZLE_GEN_VEC3_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, D) + +#define GLM_SWIZZLE_GEN_VEC4_FROM_VEC4_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, A, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, B, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, C, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, A, D, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, A, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, B, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, C, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, B, D, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, A, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, B, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, C, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, C, D, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, A, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, B, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, C, D, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, A, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, A, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, A, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, A, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, B, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, B, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, B, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, B, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, C, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, C, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, C, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, C, D) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, D, A) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, D, B) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, D, C) \ + GLM_SWIZZLE_GEN_VEC4_ENTRY(TMPL_TYPE, CLASS_TYPE, SWIZZLED_TYPE, const, D, D, D, D) + +#define GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC2_FROM_VEC4_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC3_FROM_VEC4_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC3_TYPE, A, B, C, D) \ + GLM_SWIZZLE_GEN_VEC4_FROM_VEC4_SWIZZLE(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC4_TYPE, A, B, C, D) + +#define GLM_SWIZZLE_GEN_VEC_FROM_VEC4(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, x, y, z, w) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, r, g, b, a) \ + GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(TMPL_TYPE, CLASS_TYPE, SWIZZLED_VEC2_TYPE, SWIZZLED_VEC3_TYPE, SWIZZLED_VEC4_TYPE, s, t, q, p) + +//GLM_SWIZZLE_GEN_VEC_FROM_VEC4(valType, detail::vec4, detail::vec2, detail::vec3, detail::vec4) + +#endif//glm_core_swizzle_func diff --git a/include/gal/opengl/glm/core/_vectorize.hpp b/include/gal/opengl/glm/core/_vectorize.hpp new file mode 100644 index 0000000..9984014 --- /dev/null +++ b/include/gal/opengl/glm/core/_vectorize.hpp @@ -0,0 +1,159 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/_vectorize.hpp +/// @date 2011-10-14 / 2011-10-14 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#define VECTORIZE2_VEC(func) \ + template <typename T> \ + GLM_FUNC_QUALIFIER detail::tvec2<T> func( \ + detail::tvec2<T> const & v) \ + { \ + return detail::tvec2<T>( \ + func(v.x), \ + func(v.y)); \ + } + +#define VECTORIZE3_VEC(func) \ + template <typename T> \ + GLM_FUNC_QUALIFIER detail::tvec3<T> func( \ + detail::tvec3<T> const & v) \ + { \ + return detail::tvec3<T>( \ + func(v.x), \ + func(v.y), \ + func(v.z)); \ + } + +#define VECTORIZE4_VEC(func) \ + template <typename T> \ + GLM_FUNC_QUALIFIER detail::tvec4<T> func( \ + detail::tvec4<T> const & v) \ + { \ + return detail::tvec4<T>( \ + func(v.x), \ + func(v.y), \ + func(v.z), \ + func(v.w)); \ + } + +#define VECTORIZE_VEC(func) \ + VECTORIZE2_VEC(func) \ + VECTORIZE3_VEC(func) \ + VECTORIZE4_VEC(func) + +#define VECTORIZE2_VEC_SCA(func) \ + template <typename T> \ + GLM_FUNC_QUALIFIER detail::tvec2<T> func \ + ( \ + detail::tvec2<T> const & x, \ + typename detail::tvec2<T>::value_type const & y \ + ) \ + { \ + return detail::tvec2<T>( \ + func(x.x, y), \ + func(x.y, y)); \ + } + +#define VECTORIZE3_VEC_SCA(func) \ + template <typename T> \ + GLM_FUNC_QUALIFIER detail::tvec3<T> func \ + ( \ + detail::tvec3<T> const & x, \ + typename detail::tvec3<T>::value_type const & y \ + ) \ + { \ + return detail::tvec3<T>( \ + func(x.x, y), \ + func(x.y, y), \ + func(x.z, y)); \ + } + +#define VECTORIZE4_VEC_SCA(func) \ + template <typename T> \ + GLM_FUNC_QUALIFIER detail::tvec4<T> func \ + ( \ + detail::tvec4<T> const & x, \ + typename detail::tvec4<T>::value_type const & y \ + ) \ + { \ + return detail::tvec4<T>( \ + func(x.x, y), \ + func(x.y, y), \ + func(x.z, y), \ + func(x.w, y)); \ + } + +#define VECTORIZE_VEC_SCA(func) \ + VECTORIZE2_VEC_SCA(func) \ + VECTORIZE3_VEC_SCA(func) \ + VECTORIZE4_VEC_SCA(func) + +#define VECTORIZE2_VEC_VEC(func) \ + template <typename T> \ + GLM_FUNC_QUALIFIER detail::tvec2<T> func \ + ( \ + detail::tvec2<T> const & x, \ + detail::tvec2<T> const & y \ + ) \ + { \ + return detail::tvec2<T>( \ + func(x.x, y.x), \ + func(x.y, y.y)); \ + } + +#define VECTORIZE3_VEC_VEC(func) \ + template <typename T> \ + GLM_FUNC_QUALIFIER detail::tvec3<T> func \ + ( \ + detail::tvec3<T> const & x, \ + detail::tvec3<T> const & y \ + ) \ + { \ + return detail::tvec3<T>( \ + func(x.x, y.x), \ + func(x.y, y.y), \ + func(x.z, y.z)); \ + } + +#define VECTORIZE4_VEC_VEC(func) \ + template <typename T> \ + GLM_FUNC_QUALIFIER detail::tvec4<T> func \ + ( \ + detail::tvec4<T> const & x, \ + detail::tvec4<T> const & y \ + ) \ + { \ + return detail::tvec4<T>( \ + func(x.x, y.x), \ + func(x.y, y.y), \ + func(x.z, y.z), \ + func(x.w, y.w)); \ + } + +#define VECTORIZE_VEC_VEC(func) \ + VECTORIZE2_VEC_VEC(func) \ + VECTORIZE3_VEC_VEC(func) \ + VECTORIZE4_VEC_VEC(func) diff --git a/include/gal/opengl/glm/core/dummy.cpp b/include/gal/opengl/glm/core/dummy.cpp new file mode 100644 index 0000000..38fcca0 --- /dev/null +++ b/include/gal/opengl/glm/core/dummy.cpp @@ -0,0 +1,40 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/dummy.cpp +/// @date 2011-01-19 / 2011-06-15 +/// @author Christophe Riccio +/// +/// GLM is a header only library. There is nothing to compile. +/// dummy.cpp exist only a wordaround for CMake file. +/////////////////////////////////////////////////////////////////////////////////// + +#define GLM_MESSAGES +#include "../glm.hpp" + +//#error "GLM is a header only library" + +int main() +{ + +} diff --git a/include/gal/opengl/glm/core/func_common.hpp b/include/gal/opengl/glm/core/func_common.hpp new file mode 100644 index 0000000..fcf7eb7 --- /dev/null +++ b/include/gal/opengl/glm/core/func_common.hpp @@ -0,0 +1,430 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/func_common.hpp +/// @date 2008-03-08 / 2010-01-26 +/// @author Christophe Riccio +/// +/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> +/// +/// @defgroup core_func_common Common functions +/// @ingroup core +/// +/// These all operate component-wise. The description is per component. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_CORE_func_common +#define GLM_CORE_func_common GLM_VERSION + +#include "_fixes.hpp" + +namespace glm +{ + /// @addtogroup core_func_common + /// @{ + + /// Returns x if x >= 0; otherwise, it returns -x. + /// + /// @tparam genType floating-point or signed integer; scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/abs.xml">GLSL abs man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template <typename genType> + GLM_FUNC_DECL genType abs(genType const & x); + + /// Returns 1.0 if x > 0, 0.0 if x == 0, or -1.0 if x < 0. + /// + /// @tparam genType Floating-point or signed integer; scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/sign.xml">GLSL sign man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template <typename genType> + GLM_FUNC_DECL genType sign(genType const & x); + + /// Returns a value equal to the nearest integer that is less then or equal to x. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/floor.xml">GLSL floor man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template <typename genType> + GLM_FUNC_DECL genType floor(genType const & x); + + /// Returns a value equal to the nearest integer to x + /// whose absolute value is not larger than the absolute value of x. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/trunc.xml">GLSL trunc man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template <typename genType> + GLM_FUNC_DECL genType trunc(genType const & x); + + /// Returns a value equal to the nearest integer to x. + /// The fraction 0.5 will round in a direction chosen by the + /// implementation, presumably the direction that is fastest. + /// This includes the possibility that round(x) returns the + /// same value as roundEven(x) for all values of x. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/round.xml">GLSL round man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template <typename genType> + GLM_FUNC_DECL genType round(genType const & x); + + /// Returns a value equal to the nearest integer to x. + /// A fractional part of 0.5 will round toward the nearest even + /// integer. (Both 3.5 and 4.5 for x will return 4.0.) + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/roundEven.xml">GLSL roundEven man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + /// @see <a href="http://developer.amd.com/documentation/articles/pages/New-Round-to-Even-Technique.aspx">New round to even technique</a> + template <typename genType> + GLM_FUNC_DECL genType roundEven(genType const & x); + + /// Returns a value equal to the nearest integer + /// that is greater than or equal to x. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/ceil.xml">GLSL ceil man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template <typename genType> + GLM_FUNC_DECL genType ceil(genType const & x); + + /// Return x - floor(x). + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/fract.xml">GLSL fract man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template <typename genType> + GLM_FUNC_DECL genType fract(genType const & x); + + /// Modulus. Returns x - y * floor(x / y) + /// for each component in x using the floating point value y. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/mod.xml">GLSL mod man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template <typename genType> + GLM_FUNC_DECL genType mod( + genType const & x, + genType const & y); + + /// Modulus. Returns x - y * floor(x / y) + /// for each component in x using the floating point value y. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/mod.xml">GLSL mod man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template <typename genType> + GLM_FUNC_DECL genType mod( + genType const & x, + typename genType::value_type const & y); + + /// Returns the fractional part of x and sets i to the integer + /// part (as a whole number floating point value). Both the + /// return value and the output parameter will have the same + /// sign as x. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/modf.xml">GLSL modf man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template <typename genType> + GLM_FUNC_DECL genType modf( + genType const & x, + genType & i); + + /// Returns y if y < x; otherwise, it returns x. + /// + /// @tparam genType Floating-point or integer; scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/min.xml">GLSL min man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template <typename genType> + GLM_FUNC_DECL genType min( + genType const & x, + genType const & y); + + template <typename genType> + GLM_FUNC_DECL genType min( + genType const & x, + typename genType::value_type const & y); + + /// Returns y if x < y; otherwise, it returns x. + /// + /// @tparam genType Floating-point or integer; scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/max.xml">GLSL max man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template <typename genType> + GLM_FUNC_DECL genType max( + genType const & x, + genType const & y); + + template <typename genType> + GLM_FUNC_DECL genType max( + genType const & x, + typename genType::value_type const & y); + + /// Returns min(max(x, minVal), maxVal) for each component in x + /// using the floating-point values minVal and maxVal. + /// + /// @tparam genType Floating-point or integer; scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/clamp.xml">GLSL clamp man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template <typename genType> + GLM_FUNC_DECL genType clamp( + genType const & x, + genType const & minVal, + genType const & maxVal); + + template <typename genType> + GLM_FUNC_DECL genType clamp( + genType const & x, + typename genType::value_type const & minVal, + typename genType::value_type const & maxVal); + + /// If genTypeU is a floating scalar or vector: + /// Returns x * (1.0 - a) + y * a, i.e., the linear blend of + /// x and y using the floating-point value a. + /// The value for a is not restricted to the range [0, 1]. + /// + /// If genTypeU is a boolean scalar or vector: + /// Selects which vector each returned component comes + /// from. For a component of <a> that is false, the + /// corresponding component of x is returned. For a + /// component of a that is true, the corresponding + /// component of y is returned. Components of x and y that + /// are not selected are allowed to be invalid floating point + /// values and will have no effect on the results. Thus, this + /// provides different functionality than + /// genType mix(genType x, genType y, genType(a)) + /// where a is a Boolean vector. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/mix.xml">GLSL mix man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + /// + /// @param[in] x Value to interpolate. + /// @param[in] y Value to interpolate. + /// @param[in] a Interpolant. + /// + /// @tparam genTypeT Floating point scalar or vector. + /// @tparam genTypeU Floating point or boolean scalar or vector. It can't be a vector if it is the length of genTypeT. + /// + /// @code + /// #include <glm/glm.hpp> + /// ... + /// float a; + /// bool b; + /// glm::dvec3 e; + /// glm::dvec3 f; + /// glm::vec4 g; + /// glm::vec4 h; + /// ... + /// glm::vec4 r = glm::mix(g, h, a); // Interpolate with a floating-point scalar two vectors. + /// glm::vec4 s = glm::mix(g, h, b); // Teturns g or h; + /// glm::dvec3 t = glm::mix(e, f, a); // Types of the third parameter is not required to match with the first and the second. + /// glm::vec4 u = glm::mix(g, h, r); // Interpolations can be perform per component with a vector for the last parameter. + /// @endcode + template <typename genTypeT, typename genTypeU> + GLM_FUNC_DECL genTypeT mix(genTypeT const & x, genTypeT const & y, genTypeU const & a); + + //! Returns 0.0 if x < edge, otherwise it returns 1.0. + //! + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/step.xml">GLSL step man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template <typename genType> + GLM_FUNC_DECL genType step( + genType const & edge, + genType const & x); + + template <typename genType> + GLM_FUNC_DECL genType step( + typename genType::value_type const & edge, + genType const & x); + + /// Returns 0.0 if x <= edge0 and 1.0 if x >= edge1 and + /// performs smooth Hermite interpolation between 0 and 1 + /// when edge0 < x < edge1. This is useful in cases where + /// you would want a threshold function with a smooth + /// transition. This is equivalent to: + /// genType t; + /// t = clamp ((x - edge0) / (edge1 - edge0), 0, 1); + /// return t * t * (3 - 2 * t); + /// Results are undefined if edge0 >= edge1. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/smoothstep.xml">GLSL smoothstep man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template <typename genType> + GLM_FUNC_DECL genType smoothstep( + genType const & edge0, + genType const & edge1, + genType const & x); + + template <typename genType> + GLM_FUNC_DECL genType smoothstep( + typename genType::value_type const & edge0, + typename genType::value_type const & edge1, + genType const & x); + + /// Returns true if x holds a NaN (not a number) + /// representation in the underlying implementation's set of + /// floating point representations. Returns false otherwise, + /// including for implementations with no NaN + /// representations. + /// + /// /!\ When using compiler fast math, this function may fail. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/isnan.xml">GLSL isnan man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template <typename genType> + GLM_FUNC_DECL typename genType::bool_type isnan(genType const & x); + + /// Returns true if x holds a positive infinity or negative + /// infinity representation in the underlying implementation's + /// set of floating point representations. Returns false + /// otherwise, including for implementations with no infinity + /// representations. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/isinf.xml">GLSL isinf man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template <typename genType> + GLM_FUNC_DECL typename genType::bool_type isinf(genType const & x); + + /// Returns a signed integer value representing + /// the encoding of a floating-point value. The floatingpoint + /// value's bit-level representation is preserved. + /// + /// @tparam genType Single-precision floating-point scalar or vector types. + /// @tparam genIType Signed integer scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/floatBitsToInt.xml">GLSL floatBitsToInt man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template <typename genType, typename genIType> + GLM_FUNC_DECL genIType floatBitsToInt(genType const & value); + + /// Returns a unsigned integer value representing + /// the encoding of a floating-point value. The floatingpoint + /// value's bit-level representation is preserved. + /// + /// @tparam genType Single-precision floating-point scalar or vector types. + /// @tparam genUType Unsigned integer scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/floatBitsToUint.xml">GLSL floatBitsToUint man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template <typename genType, typename genUType> + GLM_FUNC_DECL genUType floatBitsToUint(genType const & value); + + /// Returns a floating-point value corresponding to a signed + /// integer encoding of a floating-point value. + /// If an inf or NaN is passed in, it will not signal, and the + /// resulting floating point value is unspecified. Otherwise, + /// the bit-level representation is preserved. + /// + /// @tparam genType Single-precision floating-point scalar or vector types. + /// @tparam genIType Signed integer scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/intBitsToFloat.xml">GLSL intBitsToFloat man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + /// + /// @todo Clarify this declaration, we don't need to actually specify the return type + template <typename genType, typename genIType> + GLM_FUNC_DECL genType intBitsToFloat(genIType const & value); + + /// Returns a floating-point value corresponding to a + /// unsigned integer encoding of a floating-point value. + /// If an inf or NaN is passed in, it will not signal, and the + /// resulting floating point value is unspecified. Otherwise, + /// the bit-level representation is preserved. + /// + /// @tparam genType Single-precision floating-point scalar or vector types. + /// @tparam genUType Unsigned integer scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/uintBitsToFloat.xml">GLSL uintBitsToFloat man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + /// + /// @todo Clarify this declaration, we don't need to actually specify the return type + template <typename genType, typename genUType> + GLM_FUNC_DECL genType uintBitsToFloat(genUType const & value); + + /// Computes and returns a * b + c. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/fma.xml">GLSL fma man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template <typename genType> + GLM_FUNC_DECL genType fma(genType const & a, genType const & b, genType const & c); + + /// Splits x into a floating-point significand in the range + /// [0.5, 1.0) and an integral exponent of two, such that: + /// x = significand * exp(2, exponent) + /// + /// The significand is returned by the function and the + /// exponent is returned in the parameter exp. For a + /// floating-point value of zero, the significant and exponent + /// are both zero. For a floating-point value that is an + /// infinity or is not a number, the results are undefined. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/frexp.xml">GLSL frexp man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template <typename genType, typename genIType> + GLM_FUNC_DECL genType frexp(genType const & x, genIType & exp); + + /// Builds a floating-point number from x and the + /// corresponding integral exponent of two in exp, returning: + /// significand * exp(2, exponent) + /// + /// If this product is too large to be represented in the + /// floating-point type, the result is undefined. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/ldexp.xml">GLSL ldexp man page</a>; + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.3 Common Functions</a> + template <typename genType, typename genIType> + GLM_FUNC_DECL genType ldexp(genType const & x, genIType const & exp); + + /// @} +}//namespace glm + +#include "func_common.inl" + +#endif//GLM_CORE_func_common diff --git a/include/gal/opengl/glm/core/func_common.inl b/include/gal/opengl/glm/core/func_common.inl new file mode 100644 index 0000000..1c0d9df --- /dev/null +++ b/include/gal/opengl/glm/core/func_common.inl @@ -0,0 +1,1226 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/func_common.inl +/// @date 2008-08-03 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +namespace glm{ +namespace detail +{ + template <typename genFIType, bool /*signed*/> + struct Abs_ + {}; + + template <typename genFIType> + struct Abs_<genFIType, true> + { + GLM_FUNC_QUALIFIER static genFIType get(genFIType const & x) + { + GLM_STATIC_ASSERT( + detail::type<genFIType>::is_float || + detail::type<genFIType>::is_int, "'abs' only accept floating-point and integer inputs"); + return x >= genFIType(0) ? x : -x; + // TODO, perf comp with: *(((int *) &x) + 1) &= 0x7fffffff; + } + }; + + template <typename genFIType> + struct Abs_<genFIType, false> + { + GLM_FUNC_QUALIFIER static genFIType get(genFIType const & x) + { + GLM_STATIC_ASSERT( + detail::type<genFIType>::is_uint, "'abs' only accept floating-point and integer inputs"); + return x; + } + }; +}//namespace detail + + // abs + template <typename genFIType> + GLM_FUNC_QUALIFIER genFIType abs + ( + genFIType const & x + ) + { + return detail::Abs_<genFIType, std::numeric_limits<genFIType>::is_signed>::get(x); + } + + VECTORIZE_VEC(abs) + + // sign + //Try something like based on x >> 31 to get the sign bit + template <typename genFIType> + GLM_FUNC_QUALIFIER genFIType sign + ( + genFIType const & x + ) + { + GLM_STATIC_ASSERT( + detail::type<genFIType>::is_float || + detail::type<genFIType>::is_int, "'sign' only accept signed inputs"); + + genFIType result; + if(x > genFIType(0)) + result = genFIType(1); + else if(x < genFIType(0)) + result = genFIType(-1); + else + result = genFIType(0); + return result; + } + + VECTORIZE_VEC(sign) + + // floor + template <> + GLM_FUNC_QUALIFIER detail::half floor<detail::half>(detail::half const & x) + { + return detail::half(::std::floor(float(x))); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType floor(genType const & x) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'floor' only accept floating-point inputs"); + + return ::std::floor(x); + } + + VECTORIZE_VEC(floor) + + // trunc + template <typename genType> + GLM_FUNC_QUALIFIER genType trunc(genType const & x) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'trunc' only accept floating-point inputs"); + return x < 0 ? -floor(-x) : floor(x); + } + + VECTORIZE_VEC(trunc) + + // round + template <typename genType> + GLM_FUNC_QUALIFIER genType round(genType const& x) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'round' only accept floating-point inputs"); + + if(x < 0) + return genType(int(x - genType(0.5))); + return genType(int(x + genType(0.5))); + } + + VECTORIZE_VEC(round) + +/* + // roundEven + template <typename genType> + GLM_FUNC_QUALIFIER genType roundEven(genType const& x) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'roundEven' only accept floating-point inputs"); + + return genType(int(x + genType(int(x) % 2))); + } +*/ + + // roundEven + template <typename genType> + GLM_FUNC_QUALIFIER genType roundEven(genType const & x) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'roundEven' only accept floating-point inputs"); + + int Integer = int(x); + genType IntegerPart = genType(Integer); + genType FractionalPart = fract(x); + + if(FractionalPart > genType(0.5) || FractionalPart < genType(0.5)) + { + return round(x); + } + else if((Integer % 2) == 0) + { + return IntegerPart; + } + else if(x <= genType(0)) // Work around... + { + return IntegerPart - 1; + } + else + { + return IntegerPart + 1; + } + //else // Bug on MinGW 4.5.2 + //{ + // return mix(IntegerPart + genType(-1), IntegerPart + genType(1), x <= genType(0)); + //} + } + + VECTORIZE_VEC(roundEven) + + // ceil + template <typename genType> + GLM_FUNC_QUALIFIER genType ceil(genType const & x) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'ceil' only accept floating-point inputs"); + + return ::std::ceil(x); + } + + VECTORIZE_VEC(ceil) + + // fract + template <typename genType> + GLM_FUNC_QUALIFIER genType fract + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'fract' only accept floating-point inputs"); + + return x - ::std::floor(x); + } + + VECTORIZE_VEC(fract) + + // mod + template <typename genType> + GLM_FUNC_QUALIFIER genType mod + ( + genType const & x, + genType const & y + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'mod' only accept floating-point inputs"); + + return x - y * floor(x / y); + } + + VECTORIZE_VEC_SCA(mod) + VECTORIZE_VEC_VEC(mod) + + // modf + template <typename genType> + GLM_FUNC_QUALIFIER genType modf + ( + genType const & x, + genType & i + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'modf' only accept floating-point inputs"); + + return std::modf(x, &i); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec2<valType> modf + ( + detail::tvec2<valType> const & x, + detail::tvec2<valType> & i + ) + { + return detail::tvec2<valType>( + modf(x.x, i.x), + modf(x.y, i.y)); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec3<valType> modf + ( + detail::tvec3<valType> const & x, + detail::tvec3<valType> & i + ) + { + return detail::tvec3<valType>( + modf(x.x, i.x), + modf(x.y, i.y), + modf(x.z, i.z)); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec4<valType> modf + ( + detail::tvec4<valType> const & x, + detail::tvec4<valType> & i + ) + { + return detail::tvec4<valType>( + modf(x.x, i.x), + modf(x.y, i.y), + modf(x.z, i.z), + modf(x.w, i.w)); + } + + //// Only valid if (INT_MIN <= x-y <= INT_MAX) + //// min(x,y) + //r = y + ((x - y) & ((x - y) >> (sizeof(int) * + //CHAR_BIT - 1))); + //// max(x,y) + //r = x - ((x - y) & ((x - y) >> (sizeof(int) * + //CHAR_BIT - 1))); + + // min + template <typename genType> + GLM_FUNC_QUALIFIER genType min + ( + genType const & x, + genType const & y + ) + { + GLM_STATIC_ASSERT( + detail::type<genType>::is_float || + detail::type<genType>::is_int || + detail::type<genType>::is_uint, "'min' only accept numbers"); + + return x < y ? x : y; + } + + VECTORIZE_VEC_SCA(min) + VECTORIZE_VEC_VEC(min) + + // max + template <typename genType> + GLM_FUNC_QUALIFIER genType max + ( + genType const & x, + genType const & y + ) + { + GLM_STATIC_ASSERT( + detail::type<genType>::is_float || + detail::type<genType>::is_int || + detail::type<genType>::is_uint, "'max' only accept numbers"); + + return x > y ? x : y; + } + + VECTORIZE_VEC_SCA(max) + VECTORIZE_VEC_VEC(max) + + // clamp + template <typename valType> + GLM_FUNC_QUALIFIER valType clamp + ( + valType const & x, + valType const & minVal, + valType const & maxVal + ) + { + GLM_STATIC_ASSERT( + detail::type<valType>::is_float || + detail::type<valType>::is_int || + detail::type<valType>::is_uint, "'clamp' only accept numbers"); + + return min(maxVal, max(minVal, x)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec2<T> clamp + ( + detail::tvec2<T> const & x, + typename detail::tvec2<T>::value_type const & minVal, + typename detail::tvec2<T>::value_type const & maxVal + ) + { + return detail::tvec2<T>( + clamp(x.x, minVal, maxVal), + clamp(x.y, minVal, maxVal)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> clamp + ( + detail::tvec3<T> const & x, + typename detail::tvec3<T>::value_type const & minVal, + typename detail::tvec3<T>::value_type const & maxVal + ) + { + return detail::tvec3<T>( + clamp(x.x, minVal, maxVal), + clamp(x.y, minVal, maxVal), + clamp(x.z, minVal, maxVal)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec4<T> clamp + ( + detail::tvec4<T> const & x, + typename detail::tvec4<T>::value_type const & minVal, + typename detail::tvec4<T>::value_type const & maxVal + ) + { + return detail::tvec4<T>( + clamp(x.x, minVal, maxVal), + clamp(x.y, minVal, maxVal), + clamp(x.z, minVal, maxVal), + clamp(x.w, minVal, maxVal)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec2<T> clamp + ( + detail::tvec2<T> const & x, + detail::tvec2<T> const & minVal, + detail::tvec2<T> const & maxVal + ) + { + return detail::tvec2<T>( + clamp(x.x, minVal.x, maxVal.x), + clamp(x.y, minVal.y, maxVal.y)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> clamp + ( + detail::tvec3<T> const & x, + detail::tvec3<T> const & minVal, + detail::tvec3<T> const & maxVal + ) + { + return detail::tvec3<T>( + clamp(x.x, minVal.x, maxVal.x), + clamp(x.y, minVal.y, maxVal.y), + clamp(x.z, minVal.z, maxVal.z)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec4<T> clamp + ( + detail::tvec4<T> const & x, + detail::tvec4<T> const & minVal, + detail::tvec4<T> const & maxVal + ) + { + return detail::tvec4<T>( + clamp(x.x, minVal.x, maxVal.x), + clamp(x.y, minVal.y, maxVal.y), + clamp(x.z, minVal.z, maxVal.z), + clamp(x.w, minVal.w, maxVal.w)); + } + + // mix + template <typename genType> + GLM_FUNC_QUALIFIER genType mix + ( + genType const & x, + genType const & y, + genType const & a + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float , "'genType' is not floating-point type"); + + return x + a * (y - x); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec2<valType> mix + ( + detail::tvec2<valType> const & x, + detail::tvec2<valType> const & y, + valType const & a + ) + { + GLM_STATIC_ASSERT(detail::type<valType>::is_float , "'genType' is not floating-point type"); + + return x + a * (y - x); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec3<valType> mix + ( + detail::tvec3<valType> const & x, + detail::tvec3<valType> const & y, + valType const & a + ) + { + return x + a * (y - x); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec4<valType> mix + ( + detail::tvec4<valType> const & x, + detail::tvec4<valType> const & y, + valType const & a + ) + { + return x + a * (y - x); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec2<valType> mix + ( + detail::tvec2<valType> const & x, + detail::tvec2<valType> const & y, + detail::tvec2<valType> const & a + ) + { + return x + a * (y - x); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec3<valType> mix + ( + detail::tvec3<valType> const & x, + detail::tvec3<valType> const & y, + detail::tvec3<valType> const & a + ) + { + GLM_STATIC_ASSERT(detail::type<valType>::is_float , "'genType' is not floating-point type"); + + return x + a * (y - x); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec4<valType> mix + ( + detail::tvec4<valType> const & x, + detail::tvec4<valType> const & y, + detail::tvec4<valType> const & a + ) + { + return x + a * (y - x); + } + + //template <typename genTypeT> + //GLM_FUNC_QUALIFIER genTypeT mix + //( + // genTypeT const & x, + // genTypeT const & y, + // float const & a + //) + //{ + // // It could be a vector too + // //GLM_STATIC_ASSERT( + // // detail::type<genTypeT>::is_float && + // // detail::type<genTypeU>::is_float); + + // return x + a * (y - x); + //} + + template <> + GLM_FUNC_QUALIFIER float mix + ( + float const & x, + float const & y, + bool const & a + ) + { + return a ? y : x; + } + + template <> + GLM_FUNC_QUALIFIER double mix + ( + double const & x, + double const & y, + bool const & a + ) + { + return a ? y : x; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec2<T> mix + ( + detail::tvec2<T> const & x, + detail::tvec2<T> const & y, + bool a + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'mix' only accept floating-point inputs"); + + return a ? y : x; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> mix + ( + detail::tvec3<T> const & x, + detail::tvec3<T> const & y, + bool a + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'mix' only accept floating-point inputs"); + + return a ? y : x; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec4<T> mix + ( + detail::tvec4<T> const & x, + detail::tvec4<T> const & y, + bool a + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'mix' only accept floating-point inputs"); + + return a ? y : x; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec2<T> mix + ( + detail::tvec2<T> const & x, + detail::tvec2<T> const & y, + typename detail::tvec2<T>::bool_type a + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'mix' only accept floating-point inputs"); + + detail::tvec2<T> result; + for + ( + typename detail::tvec2<T>::size_type i = 0; + i < x.length(); ++i + ) + { + result[i] = a[i] ? y[i] : x[i]; + } + return result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> mix + ( + detail::tvec3<T> const & x, + detail::tvec3<T> const & y, + typename detail::tvec3<T>::bool_type a + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'mix' only accept floating-point inputs"); + + detail::tvec3<T> result; + for + ( + typename detail::tvec3<T>::size_type i = 0; + i < x.length(); ++i + ) + { + result[i] = a[i] ? y[i] : x[i]; + } + return result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec4<T> mix + ( + detail::tvec4<T> const & x, + detail::tvec4<T> const & y, + typename detail::tvec4<T>::bool_type a + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'mix' only accept floating-point inputs"); + + detail::tvec4<T> result; + for + ( + typename detail::tvec4<T>::size_type i = 0; + i < x.length(); ++i + ) + { + result[i] = a[i] ? y[i] : x[i]; + } + return result; + } + + // step + template <typename genType> + GLM_FUNC_QUALIFIER genType step + ( + genType const & edge, + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'step' only accept floating-point inputs"); + + return x < edge ? genType(0) : genType(1); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec2<T> step + ( + typename detail::tvec2<T>::value_type const & edge, + detail::tvec2<T> const & x + ) + { + return detail::tvec2<T>( + x.x < edge ? T(0) : T(1), + x.y < edge ? T(0) : T(1)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> step + ( + typename detail::tvec3<T>::value_type const & edge, + detail::tvec3<T> const & x + ) + { + return detail::tvec3<T>( + x.x < edge ? T(0) : T(1), + x.y < edge ? T(0) : T(1), + x.z < edge ? T(0) : T(1)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec4<T> step + ( + typename detail::tvec4<T>::value_type const & edge, + detail::tvec4<T> const & x + ) + { + return detail::tvec4<T>( + x.x < edge ? T(0) : T(1), + x.y < edge ? T(0) : T(1), + x.z < edge ? T(0) : T(1), + x.w < edge ? T(0) : T(1)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec2<T> step + ( + detail::tvec2<T> const & edge, + detail::tvec2<T> const & x + ) + { + return detail::tvec2<T>( + x.x < edge.x ? T(0) : T(1), + x.y < edge.y ? T(0) : T(1)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> step + ( + detail::tvec3<T> const & edge, + detail::tvec3<T> const & x + ) + { + return detail::tvec3<T>( + x.x < edge.x ? T(0) : T(1), + x.y < edge.y ? T(0) : T(1), + x.z < edge.z ? T(0) : T(1)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec4<T> step + ( + detail::tvec4<T> const & edge, + detail::tvec4<T> const & x + ) + { + return detail::tvec4<T>( + x.x < edge.x ? T(0) : T(1), + x.y < edge.y ? T(0) : T(1), + x.z < edge.z ? T(0) : T(1), + x.w < edge.w ? T(0) : T(1)); + } + + // smoothstep + template <typename genType> + GLM_FUNC_QUALIFIER genType smoothstep + ( + genType const & edge0, + genType const & edge1, + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'smoothstep' only accept floating-point inputs"); + + genType tmp = clamp((x - edge0) / (edge1 - edge0), genType(0), genType(1)); + return tmp * tmp * (genType(3) - genType(2) * tmp); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec2<T> smoothstep + ( + typename detail::tvec2<T>::value_type const & edge0, + typename detail::tvec2<T>::value_type const & edge1, + detail::tvec2<T> const & x + ) + { + return detail::tvec2<T>( + smoothstep(edge0, edge1, x.x), + smoothstep(edge0, edge1, x.y)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> smoothstep + ( + typename detail::tvec3<T>::value_type const & edge0, + typename detail::tvec3<T>::value_type const & edge1, + detail::tvec3<T> const & x + ) + { + return detail::tvec3<T>( + smoothstep(edge0, edge1, x.x), + smoothstep(edge0, edge1, x.y), + smoothstep(edge0, edge1, x.z)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec4<T> smoothstep + ( + typename detail::tvec4<T>::value_type const & edge0, + typename detail::tvec4<T>::value_type const & edge1, + detail::tvec4<T> const & x + ) + { + return detail::tvec4<T>( + smoothstep(edge0, edge1, x.x), + smoothstep(edge0, edge1, x.y), + smoothstep(edge0, edge1, x.z), + smoothstep(edge0, edge1, x.w)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec2<T> smoothstep + ( + detail::tvec2<T> const & edge0, + detail::tvec2<T> const & edge1, + detail::tvec2<T> const & x + ) + { + return detail::tvec2<T>( + smoothstep(edge0.x, edge1.x, x.x), + smoothstep(edge0.y, edge1.y, x.y)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> smoothstep + ( + detail::tvec3<T> const & edge0, + detail::tvec3<T> const & edge1, + detail::tvec3<T> const & x + ) + { + return detail::tvec3<T>( + smoothstep(edge0.x, edge1.x, x.x), + smoothstep(edge0.y, edge1.y, x.y), + smoothstep(edge0.z, edge1.z, x.z)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec4<T> smoothstep + ( + detail::tvec4<T> const & edge0, + detail::tvec4<T> const & edge1, + detail::tvec4<T> const & x + ) + { + return detail::tvec4<T>( + smoothstep(edge0.x, edge1.x, x.x), + smoothstep(edge0.y, edge1.y, x.y), + smoothstep(edge0.z, edge1.z, x.z), + smoothstep(edge0.w, edge1.w, x.w)); + } + + // TODO: Not working on MinGW... + template <typename genType> + GLM_FUNC_QUALIFIER bool isnan(genType const & x) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'isnan' only accept floating-point inputs"); + +# if(GLM_COMPILER & (GLM_COMPILER_VC | GLM_COMPILER_INTEL)) + return _isnan(x) != 0; +# elif(GLM_COMPILER & (GLM_COMPILER_GCC | GLM_COMPILER_CLANG)) +# if(GLM_PLATFORM & GLM_PLATFORM_ANDROID) + return _isnan(x) != 0; +# else + return std::isnan(x); +# endif +# elif(GLM_COMPILER & GLM_COMPILER_CUDA) + return isnan(x) != 0; +# else + return std::isnan(x); +# endif + } + + template <typename T> + GLM_FUNC_QUALIFIER typename detail::tvec2<T>::bool_type isnan + ( + detail::tvec2<T> const & x + ) + { + return typename detail::tvec2<T>::bool_type( + isnan(x.x), + isnan(x.y)); + } + + template <typename T> + GLM_FUNC_QUALIFIER typename detail::tvec3<T>::bool_type isnan + ( + detail::tvec3<T> const & x + ) + { + return typename detail::tvec3<T>::bool_type( + isnan(x.x), + isnan(x.y), + isnan(x.z)); + } + + template <typename T> + GLM_FUNC_QUALIFIER typename detail::tvec4<T>::bool_type isnan + ( + detail::tvec4<T> const & x + ) + { + return typename detail::tvec4<T>::bool_type( + isnan(x.x), + isnan(x.y), + isnan(x.z), + isnan(x.w)); + } + + template <typename genType> + GLM_FUNC_QUALIFIER bool isinf( + genType const & x) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'isinf' only accept floating-point inputs"); + +# if(GLM_COMPILER & (GLM_COMPILER_INTEL | GLM_COMPILER_VC)) + return _fpclass(x) == _FPCLASS_NINF || _fpclass(x) == _FPCLASS_PINF; +# elif(GLM_COMPILER & (GLM_COMPILER_GCC | GLM_COMPILER_CLANG)) +# if(GLM_PLATFORM & GLM_PLATFORM_ANDROID) + return _isinf(x) != 0; +# else + return std::isinf(x); +# endif +# elif(GLM_COMPILER & GLM_COMPILER_CUDA) + // http://developer.download.nvidia.com/compute/cuda/4_2/rel/toolkit/docs/online/group__CUDA__MATH__DOUBLE_g13431dd2b40b51f9139cbb7f50c18fab.html#g13431dd2b40b51f9139cbb7f50c18fab + return isinf(double(x)) != 0; +# else + return std::isinf(x); +# endif + } + + template <typename T> + GLM_FUNC_QUALIFIER typename detail::tvec2<T>::bool_type isinf + ( + detail::tvec2<T> const & x + ) + { + return typename detail::tvec2<T>::bool_type( + isinf(x.x), + isinf(x.y)); + } + + template <typename T> + GLM_FUNC_QUALIFIER typename detail::tvec3<T>::bool_type isinf + ( + detail::tvec3<T> const & x + ) + { + return typename detail::tvec3<T>::bool_type( + isinf(x.x), + isinf(x.y), + isinf(x.z)); + } + + template <typename T> + GLM_FUNC_QUALIFIER typename detail::tvec4<T>::bool_type isinf + ( + detail::tvec4<T> const & x + ) + { + return typename detail::tvec4<T>::bool_type( + isinf(x.x), + isinf(x.y), + isinf(x.z), + isinf(x.w)); + } + + GLM_FUNC_QUALIFIER int floatBitsToInt(float const & value) + { + union + { + float f; + int i; + } fi; + + fi.f = value; + return fi.i; + } + + GLM_FUNC_QUALIFIER detail::tvec2<int> floatBitsToInt + ( + detail::tvec2<float> const & value + ) + { + return detail::tvec2<int>( + floatBitsToInt(value.x), + floatBitsToInt(value.y)); + } + + GLM_FUNC_QUALIFIER detail::tvec3<int> floatBitsToInt + ( + detail::tvec3<float> const & value + ) + { + return detail::tvec3<int>( + floatBitsToInt(value.x), + floatBitsToInt(value.y), + floatBitsToInt(value.z)); + } + + GLM_FUNC_QUALIFIER detail::tvec4<int> floatBitsToInt + ( + detail::tvec4<float> const & value + ) + { + return detail::tvec4<int>( + floatBitsToInt(value.x), + floatBitsToInt(value.y), + floatBitsToInt(value.z), + floatBitsToInt(value.w)); + } + + GLM_FUNC_QUALIFIER uint floatBitsToUint(float const & value) + { + union + { + float f; + uint u; + } fu; + + fu.f = value; + return fu.u; + } + + GLM_FUNC_QUALIFIER detail::tvec2<uint> floatBitsToUint + ( + detail::tvec2<float> const & value + ) + { + return detail::tvec2<uint>( + floatBitsToUint(value.x), + floatBitsToUint(value.y)); + } + + GLM_FUNC_QUALIFIER detail::tvec3<uint> floatBitsToUint + ( + detail::tvec3<float> const & value + ) + { + return detail::tvec3<uint>( + floatBitsToUint(value.x), + floatBitsToUint(value.y), + floatBitsToUint(value.z)); + } + + GLM_FUNC_QUALIFIER detail::tvec4<uint> floatBitsToUint + ( + detail::tvec4<float> const & value + ) + { + return detail::tvec4<uint>( + floatBitsToUint(value.x), + floatBitsToUint(value.y), + floatBitsToUint(value.z), + floatBitsToUint(value.w)); + } + + GLM_FUNC_QUALIFIER float intBitsToFloat(int const & value) + { + union + { + float f; + int i; + } fi; + + fi.i = value; + return fi.f; + } + + GLM_FUNC_QUALIFIER detail::tvec2<float> intBitsToFloat + + ( + detail::tvec2<int> const & value + ) + { + return detail::tvec2<float>( + intBitsToFloat(value.x), + intBitsToFloat(value.y)); + } + + GLM_FUNC_QUALIFIER detail::tvec3<float> intBitsToFloat + ( + detail::tvec3<int> const & value + ) + { + return detail::tvec3<float>( + intBitsToFloat(value.x), + intBitsToFloat(value.y), + intBitsToFloat(value.z)); + } + + GLM_FUNC_QUALIFIER detail::tvec4<float> intBitsToFloat + ( + detail::tvec4<int> const & value + ) + { + return detail::tvec4<float>( + intBitsToFloat(value.x), + intBitsToFloat(value.y), + intBitsToFloat(value.z), + intBitsToFloat(value.w)); + } + + GLM_FUNC_QUALIFIER float uintBitsToFloat(uint const & value) + { + union + { + float f; + uint u; + } fu; + + fu.u = value; + return fu.f; + } + + GLM_FUNC_QUALIFIER detail::tvec2<float> uintBitsToFloat + ( + detail::tvec2<uint> const & value + ) + { + return detail::tvec2<float>( + uintBitsToFloat(value.x), + uintBitsToFloat(value.y)); + } + + GLM_FUNC_QUALIFIER detail::tvec3<float> uintBitsToFloat + ( + detail::tvec3<uint> const & value + ) + { + return detail::tvec3<float>( + uintBitsToFloat(value.x), + uintBitsToFloat(value.y), + uintBitsToFloat(value.z)); + } + + GLM_FUNC_QUALIFIER detail::tvec4<float> uintBitsToFloat + ( + detail::tvec4<uint> const & value + ) + { + return detail::tvec4<float>( + uintBitsToFloat(value.x), + uintBitsToFloat(value.y), + uintBitsToFloat(value.z), + uintBitsToFloat(value.w)); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType fma + ( + genType const & a, + genType const & b, + genType const & c + ) + { + return a * b + c; + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType frexp + ( + genType const & x, + int & exp + ) + { + return std::frexp(x, exp); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec2<T> frexp + ( + detail::tvec2<T> const & x, + detail::tvec2<int> & exp + ) + { + return std::frexp(x, exp); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> frexp + ( + detail::tvec3<T> const & x, + detail::tvec3<int> & exp + ) + { + return std::frexp(x, exp); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec4<T> frexp + ( + detail::tvec4<T> const & x, + detail::tvec4<int> & exp + ) + { + return std::frexp(x, exp); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType ldexp + ( + genType const & x, + int const & exp + ) + { + return std::frexp(x, exp); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec2<T> ldexp + ( + detail::tvec2<T> const & x, + detail::tvec2<int> const & exp + ) + { + return std::frexp(x, exp); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> ldexp + ( + detail::tvec3<T> const & x, + detail::tvec3<int> const & exp + ) + { + return std::frexp(x, exp); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec4<T> ldexp + ( + detail::tvec4<T> const & x, + detail::tvec4<int> const & exp + ) + { + return std::frexp(x, exp); + } + +}//namespace glm diff --git a/include/gal/opengl/glm/core/func_exponential.hpp b/include/gal/opengl/glm/core/func_exponential.hpp new file mode 100644 index 0000000..dc76fcb --- /dev/null +++ b/include/gal/opengl/glm/core/func_exponential.hpp @@ -0,0 +1,123 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/func_exponential.hpp +/// @date 2008-08-08 / 2011-06-14 +/// @author Christophe Riccio +/// +/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.2 Exponential Functions</a> +/// +/// @defgroup core_func_exponential Exponential functions +/// @ingroup core +/// +/// These all operate component-wise. The description is per component. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_func_exponential +#define glm_core_func_exponential GLM_VERSION + +namespace glm +{ + /// @addtogroup core_func_exponential + /// @{ + + /// Returns 'base' raised to the power 'exponent'. + /// + /// @param base Floating point value. pow function is defined for input values of x defined in the range (inf-, inf+) in the limit of the type precision. + /// @param exponent Floating point value representing the 'exponent'. + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/pow.xml">GLSL pow man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.2 Exponential Functions</a> + template <typename genType> + GLM_FUNC_DECL genType pow(genType const & base, genType const & exponent); + + /// Returns the natural exponentiation of x, i.e., e^x. + /// + /// @param x exp function is defined for input values of x defined in the range (inf-, inf+) in the limit of the type precision. + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/exp.xml">GLSL exp man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.2 Exponential Functions</a> + template <typename genType> + GLM_FUNC_DECL genType exp(genType const & x); + + /// Returns the natural logarithm of x, i.e., + /// returns the value y which satisfies the equation x = e^y. + /// Results are undefined if x <= 0. + /// + /// @param x log function is defined for input values of x defined in the range (0, inf+) in the limit of the type precision. + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/log.xml">GLSL log man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.2 Exponential Functions</a> + template <typename genType> + GLM_FUNC_DECL genType log(genType const & x); + + /// Returns 2 raised to the x power. + /// + /// @param x exp2 function is defined for input values of x defined in the range (inf-, inf+) in the limit of the type precision. + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/exp2.xml">GLSL exp2 man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.2 Exponential Functions</a> + template <typename genType> + GLM_FUNC_DECL genType exp2(genType const & x); + + /// Returns the base 2 log of x, i.e., returns the value y, + /// which satisfies the equation x = 2 ^ y. + /// + /// @param x log2 function is defined for input values of x defined in the range (0, inf+) in the limit of the type precision. + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/log2.xml">GLSL log2 man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.2 Exponential Functions</a> + template <typename genType> + GLM_FUNC_DECL genType log2(genType const & x); + + /// Returns the positive square root of x. + /// + /// @param x sqrt function is defined for input values of x defined in the range [0, inf+) in the limit of the type precision. + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/sqrt.xml">GLSL sqrt man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.2 Exponential Functions</a> + template <typename genType> + GLM_FUNC_DECL genType sqrt(genType const & x); + + /// Returns the reciprocal of the positive square root of x. + /// + /// @param x inversesqrt function is defined for input values of x defined in the range [0, inf+) in the limit of the type precision. + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/inversesqrt.xml">GLSL inversesqrt man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.2 Exponential Functions</a> + template <typename genType> + GLM_FUNC_DECL genType inversesqrt(genType const & x); + + /// @} +}//namespace glm + +#include "func_exponential.inl" + +#endif//glm_core_func_exponential diff --git a/include/gal/opengl/glm/core/func_exponential.inl b/include/gal/opengl/glm/core/func_exponential.inl new file mode 100644 index 0000000..1b08786 --- /dev/null +++ b/include/gal/opengl/glm/core/func_exponential.inl @@ -0,0 +1,156 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/func_exponential.inl +/// @date 2008-08-03 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + // pow + template <typename genType> + GLM_FUNC_QUALIFIER genType pow + ( + genType const & x, + genType const & y + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'pow' only accept floating-point input"); + + return genType(::std::pow(x, y)); + } + + VECTORIZE_VEC_VEC(pow) + + // exp + template <typename genType> + GLM_FUNC_QUALIFIER genType exp + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'exp' only accept floating-point input"); + + return genType(::std::exp(x)); + } + + VECTORIZE_VEC(exp) + + // log + template <typename genType> + GLM_FUNC_QUALIFIER genType log + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'log' only accept floating-point input"); + + return genType(::std::log(x)); + } + + VECTORIZE_VEC(log) + + //exp2, ln2 = 0.69314718055994530941723212145818f + template <typename genType> + GLM_FUNC_QUALIFIER genType exp2 + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'exp2' only accept floating-point input"); + + return genType(::std::exp(genType(0.69314718055994530941723212145818) * x)); + } + + VECTORIZE_VEC(exp2) + +namespace _detail +{ + template <int _PATH = detail::float_or_int_value::GLM_ERROR> + struct _compute_log2 + { + template <typename T> + T operator() (T const & Value) const; +/* + { + GLM_STATIC_ASSERT(0, "'log2' parameter has an invalid template parameter type. GLM core features only supports floating-point types, include <glm/gtx/integer.hpp> for integer types support. Others types are not supported."); + return Value; + } +*/ + }; + + template <> + struct _compute_log2<detail::float_or_int_value::GLM_FLOAT> + { + template <typename T> + T operator() (T const & Value) const + { + return T(::std::log(Value)) / T(0.69314718055994530941723212145818); + } + }; + +}//namespace _detail + + // log2, ln2 = 0.69314718055994530941723212145818f + template <typename genType> + GLM_FUNC_QUALIFIER genType log2 + ( + genType const & x + ) + { + assert(x > genType(0)); // log2 is only defined on the range (0, inf] + return _detail::_compute_log2<detail::float_or_int_trait<genType>::ID>()(x); + } + + VECTORIZE_VEC(log2) + + // sqrt + template <typename genType> + GLM_FUNC_QUALIFIER genType sqrt + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'sqrt' only accept floating-point input"); + + return genType(::std::sqrt(x)); + } + + VECTORIZE_VEC(sqrt) + + template <typename genType> + GLM_FUNC_QUALIFIER genType inversesqrt + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'inversesqrt' only accept floating-point input"); + assert(x > genType(0)); + + return genType(1) / ::std::sqrt(x); + } + + VECTORIZE_VEC(inversesqrt) + +}//namespace glm diff --git a/include/gal/opengl/glm/core/func_geometric.hpp b/include/gal/opengl/glm/core/func_geometric.hpp new file mode 100644 index 0000000..c221084 --- /dev/null +++ b/include/gal/opengl/glm/core/func_geometric.hpp @@ -0,0 +1,138 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/func_geometric.hpp +/// @date 2008-08-03 / 2011-06-14 +/// @author Christophe Riccio +/// +/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> +/// +/// @defgroup core_func_geometric Geometric functions +/// @ingroup core +/// +/// These operate on vectors as vectors, not component-wise. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_func_geometric +#define glm_core_func_geometric GLM_VERSION + +namespace glm +{ + /// @addtogroup core_func_geometric + /// @{ + + /// Returns the length of x, i.e., sqrt(x * x). + /// + /// @tparam genType Floating-point vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/length.xml">GLSL length man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> + template <typename genType> + GLM_FUNC_DECL typename genType::value_type length( + genType const & x); + + /// Returns the distance betwwen p0 and p1, i.e., length(p0 - p1). + /// + /// @tparam genType Floating-point vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/distance.xml">GLSL distance man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> + template <typename genType> + GLM_FUNC_DECL typename genType::value_type distance( + genType const & p0, + genType const & p1); + + /// Returns the dot product of x and y, i.e., result = x * y. + /// + /// @tparam genType Floating-point vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/dot.xml">GLSL dot man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> + template <typename genType> + GLM_FUNC_DECL typename genType::value_type dot( + genType const & x, + genType const & y); + + /// Returns the cross product of x and y. + /// + /// @tparam valType Floating-point scalar types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/cross.xml">GLSL cross man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> + template <typename valType> + GLM_FUNC_DECL detail::tvec3<valType> cross( + detail::tvec3<valType> const & x, + detail::tvec3<valType> const & y); + + /// Returns a vector in the same direction as x but with length of 1. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/normalize.xml">GLSL normalize man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> + template <typename genType> + GLM_FUNC_DECL genType normalize( + genType const & x); + + /// If dot(Nref, I) < 0.0, return N, otherwise, return -N. + /// + /// @tparam genType Floating-point vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/faceforward.xml">GLSL faceforward man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> + template <typename genType> + GLM_FUNC_DECL genType faceforward( + genType const & N, + genType const & I, + genType const & Nref); + + /// For the incident vector I and surface orientation N, + /// returns the reflection direction : result = I - 2.0 * dot(N, I) * N. + /// + /// @tparam genType Floating-point vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/reflect.xml">GLSL reflect man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> + template <typename genType> + GLM_FUNC_DECL genType reflect( + genType const & I, + genType const & N); + + /// For the incident vector I and surface normal N, + /// and the ratio of indices of refraction eta, + /// return the refraction vector. + /// + /// @tparam genType Floating-point vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/refract.xml">GLSL refract man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.5 Geometric Functions</a> + template <typename genType> + GLM_FUNC_DECL genType refract( + genType const & I, + genType const & N, + typename genType::value_type const & eta); + + /// @} +}//namespace glm + +#include "func_geometric.inl" + +#endif//glm_core_func_geometric diff --git a/include/gal/opengl/glm/core/func_geometric.inl b/include/gal/opengl/glm/core/func_geometric.inl new file mode 100644 index 0000000..259a0ff --- /dev/null +++ b/include/gal/opengl/glm/core/func_geometric.inl @@ -0,0 +1,321 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/func_geometric.inl +/// @date 2008-08-03 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + // length + template <typename genType> + GLM_FUNC_QUALIFIER genType length + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'length' only accept floating-point inputs"); + + genType sqr = x * x; + return sqrt(sqr); + } + + template <typename T> + GLM_FUNC_QUALIFIER typename detail::tvec2<T>::value_type length + ( + detail::tvec2<T> const & v + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'length' only accept floating-point inputs"); + + typename detail::tvec2<T>::value_type sqr = v.x * v.x + v.y * v.y; + return sqrt(sqr); + } + + template <typename T> + GLM_FUNC_QUALIFIER typename detail::tvec3<T>::value_type length + ( + detail::tvec3<T> const & v + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'length' only accept floating-point inputs"); + + typename detail::tvec3<T>::value_type sqr = v.x * v.x + v.y * v.y + v.z * v.z; + return sqrt(sqr); + } + + template <typename T> + GLM_FUNC_QUALIFIER typename detail::tvec4<T>::value_type length + ( + detail::tvec4<T> const & v + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'length' only accept floating-point inputs"); + + typename detail::tvec4<T>::value_type sqr = v.x * v.x + v.y * v.y + v.z * v.z + v.w * v.w; + return sqrt(sqr); + } + + // distance + template <typename genType> + GLM_FUNC_QUALIFIER genType distance + ( + genType const & p0, + genType const & p1 + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'distance' only accept floating-point inputs"); + + return length(p1 - p0); + } + + template <typename T> + GLM_FUNC_QUALIFIER typename detail::tvec2<T>::value_type distance + ( + detail::tvec2<T> const & p0, + detail::tvec2<T> const & p1 + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'distance' only accept floating-point inputs"); + + return length(p1 - p0); + } + + template <typename T> + GLM_FUNC_QUALIFIER typename detail::tvec3<T>::value_type distance + ( + detail::tvec3<T> const & p0, + detail::tvec3<T> const & p1 + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'distance' only accept floating-point inputs"); + + return length(p1 - p0); + } + + template <typename T> + GLM_FUNC_QUALIFIER typename detail::tvec4<T>::value_type distance + ( + detail::tvec4<T> const & p0, + detail::tvec4<T> const & p1 + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'distance' only accept floating-point inputs"); + + return length(p1 - p0); + } + + // dot + template <typename genType> + GLM_FUNC_QUALIFIER genType dot + ( + genType const & x, + genType const & y + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'dot' only accept floating-point inputs"); + + return x * y; + } + + template <typename T> + GLM_FUNC_QUALIFIER typename detail::tvec2<T>::value_type dot + ( + detail::tvec2<T> const & x, + detail::tvec2<T> const & y + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'dot' only accept floating-point inputs"); + + return x.x * y.x + x.y * y.y; + } + + template <typename T> + GLM_FUNC_QUALIFIER T dot + ( + detail::tvec3<T> const & x, + detail::tvec3<T> const & y + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'dot' only accept floating-point inputs"); + + return x.x * y.x + x.y * y.y + x.z * y.z; + } +/* // SSE3 + GLM_FUNC_QUALIFIER float dot(const tvec4<float>& x, const tvec4<float>& y) + { + float Result; + __asm + { + mov esi, x + mov edi, y + movaps xmm0, [esi] + mulps xmm0, [edi] + haddps( _xmm0, _xmm0 ) + haddps( _xmm0, _xmm0 ) + movss Result, xmm0 + } + return Result; + } +*/ + template <typename T> + GLM_FUNC_QUALIFIER T dot + ( + detail::tvec4<T> const & x, + detail::tvec4<T> const & y + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'dot' only accept floating-point inputs"); + + return x.x * y.x + x.y * y.y + x.z * y.z + x.w * y.w; + } + + // cross + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> cross + ( + detail::tvec3<T> const & x, + detail::tvec3<T> const & y + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'cross' only accept floating-point inputs"); + + return detail::tvec3<T>( + x.y * y.z - y.y * x.z, + x.z * y.x - y.z * x.x, + x.x * y.y - y.x * x.y); + } + + // normalize + template <typename genType> + GLM_FUNC_QUALIFIER genType normalize + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'normalize' only accept floating-point inputs"); + + return x < genType(0) ? genType(-1) : genType(1); + } + + // According to issue 10 GLSL 1.10 specification, if length(x) == 0 then result is undefine and generate an error + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec2<T> normalize + ( + detail::tvec2<T> const & x + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'normalize' only accept floating-point inputs"); + + typename detail::tvec2<T>::value_type sqr = x.x * x.x + x.y * x.y; + return x * inversesqrt(sqr); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> normalize + ( + detail::tvec3<T> const & x + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'normalize' only accept floating-point inputs"); + + typename detail::tvec3<T>::value_type sqr = x.x * x.x + x.y * x.y + x.z * x.z; + return x * inversesqrt(sqr); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec4<T> normalize + ( + detail::tvec4<T> const & x + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'normalize' only accept floating-point inputs"); + + typename detail::tvec4<T>::value_type sqr = x.x * x.x + x.y * x.y + x.z * x.z + x.w * x.w; + return x * inversesqrt(sqr); + } + + // faceforward + template <typename genType> + GLM_FUNC_QUALIFIER genType faceforward + ( + genType const & N, + genType const & I, + genType const & Nref + ) + { + return dot(Nref, I) < 0 ? N : -N; + } + + // reflect + template <typename genType> + GLM_FUNC_QUALIFIER genType reflect + ( + genType const & I, + genType const & N + ) + { + return I - N * dot(N, I) * genType(2); + } + + // refract + template <typename genType> + GLM_FUNC_QUALIFIER genType refract + ( + genType const & I, + genType const & N, + genType const & eta + ) + { + //It could be a vector + //GLM_STATIC_ASSERT(detail::type<genType>::is_float); + + genType dotValue = dot(N, I); + genType k = genType(1) - eta * eta * (genType(1) - dotValue * dotValue); + if(k < genType(0)) + return genType(0); + else + return eta * I - (eta * dotValue + sqrt(k)) * N; + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType refract + ( + genType const & I, + genType const & N, + typename genType::value_type const & eta + ) + { + //It could be a vector + //GLM_STATIC_ASSERT(detail::type<genType>::is_float); + + typename genType::value_type dotValue = dot(N, I); + typename genType::value_type k = typename genType::value_type(1) - eta * eta * (typename genType::value_type(1) - dotValue * dotValue); + if(k < typename genType::value_type(0)) + return genType(0); + else + return eta * I - (eta * dotValue + sqrt(k)) * N; + } + +}//namespace glm diff --git a/include/gal/opengl/glm/core/func_integer.hpp b/include/gal/opengl/glm/core/func_integer.hpp new file mode 100644 index 0000000..df9a401 --- /dev/null +++ b/include/gal/opengl/glm/core/func_integer.hpp @@ -0,0 +1,201 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/func_integer.hpp +/// @date 2010-03-17 / 2011-06-18 +/// @author Christophe Riccio +/// +/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> +/// +/// @defgroup core_func_integer Integer functions +/// @ingroup core +/// +/// These all operate component-wise. The description is per component. +/// The notation [a, b] means the set of bits from bit-number a through bit-number +/// b, inclusive. The lowest-order bit is bit 0. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_func_integer +#define glm_core_func_integer GLM_VERSION + +namespace glm +{ + /// @addtogroup core_func_integer + /// @{ + + /// Adds 32-bit unsigned integer x and y, returning the sum + /// modulo pow(2, 32). The value carry is set to 0 if the sum was + /// less than pow(2, 32), or to 1 otherwise. + /// + /// @tparam genUType Unsigned integer scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/uaddCarry.xml">GLSL uaddCarry man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> + template <typename genUType> + GLM_FUNC_DECL genUType uaddCarry( + genUType const & x, + genUType const & y, + genUType & carry); + + /// Subtracts the 32-bit unsigned integer y from x, returning + /// the difference if non-negative, or pow(2, 32) plus the difference + /// otherwise. The value borrow is set to 0 if x >= y, or to 1 otherwise. + /// + /// @tparam genUType Unsigned integer scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/usubBorrow.xml">GLSL usubBorrow man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> + template <typename genUType> + GLM_FUNC_DECL genUType usubBorrow( + genUType const & x, + genUType const & y, + genUType & borrow); + + /// Multiplies 32-bit integers x and y, producing a 64-bit + /// result. The 32 least-significant bits are returned in lsb. + /// The 32 most-significant bits are returned in msb. + /// + /// @tparam genUType Unsigned integer scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/umulExtended.xml">GLSL umulExtended man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> + template <typename genUType> + GLM_FUNC_DECL void umulExtended( + genUType const & x, + genUType const & y, + genUType & msb, + genUType & lsb); + + /// Multiplies 32-bit integers x and y, producing a 64-bit + /// result. The 32 least-significant bits are returned in lsb. + /// The 32 most-significant bits are returned in msb. + /// + /// @tparam genIType Signed integer scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/imulExtended.xml">GLSL imulExtended man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> + template <typename genIType> + GLM_FUNC_DECL void imulExtended( + genIType const & x, + genIType const & y, + genIType & msb, + genIType & lsb); + + /// Extracts bits [offset, offset + bits - 1] from value, + /// returning them in the least significant bits of the result. + /// For unsigned data types, the most significant bits of the + /// result will be set to zero. For signed data types, the + /// most significant bits will be set to the value of bit offset + base - 1. + /// + /// If bits is zero, the result will be zero. The result will be + /// undefined if offset or bits is negative, or if the sum of + /// offset and bits is greater than the number of bits used + /// to store the operand. + /// + /// @tparam genIUType Signed or unsigned integer scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/bitfieldExtract.xml">GLSL bitfieldExtract man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> + template <typename genIUType> + GLM_FUNC_DECL genIUType bitfieldExtract( + genIUType const & Value, + int const & Offset, + int const & Bits); + + /// Returns the insertion the bits least-significant bits of insert into base. + /// + /// The result will have bits [offset, offset + bits - 1] taken + /// from bits [0, bits - 1] of insert, and all other bits taken + /// directly from the corresponding bits of base. If bits is + /// zero, the result will simply be base. The result will be + /// undefined if offset or bits is negative, or if the sum of + /// offset and bits is greater than the number of bits used to + /// store the operand. + /// + /// @tparam genIUType Signed or unsigned integer scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/bitfieldInsert.xml">GLSL bitfieldInsert man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> + template <typename genIUType> + GLM_FUNC_DECL genIUType bitfieldInsert( + genIUType const & Base, + genIUType const & Insert, + int const & Offset, + int const & Bits); + + /// Returns the reversal of the bits of value. + /// The bit numbered n of the result will be taken from bit (bits - 1) - n of value, + /// where bits is the total number of bits used to represent value. + /// + /// @tparam genIUType Signed or unsigned integer scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/bitfieldReverse.xml">GLSL bitfieldReverse man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> + template <typename genIUType> + GLM_FUNC_DECL genIUType bitfieldReverse(genIUType const & Value); + + /// Returns the number of bits set to 1 in the binary representation of value. + /// + /// @tparam genIUType Signed or unsigned integer scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/bitCount.xml">GLSL bitCount man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> + /// + /// @todo Clarify the declaration to specify that scalars are suported. + template <typename T, template <typename> class genIUType> + GLM_FUNC_DECL typename genIUType<T>::signed_type bitCount(genIUType<T> const & Value); + + /// Returns the bit number of the least significant bit set to + /// 1 in the binary representation of value. + /// If value is zero, -1 will be returned. + /// + /// @tparam genIUType Signed or unsigned integer scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/findLSB.xml">GLSL findLSB man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> + /// + /// @todo Clarify the declaration to specify that scalars are suported. + template <typename T, template <typename> class genIUType> + GLM_FUNC_DECL typename genIUType<T>::signed_type findLSB(genIUType<T> const & Value); + + /// Returns the bit number of the most significant bit in the binary representation of value. + /// For positive integers, the result will be the bit number of the most significant bit set to 1. + /// For negative integers, the result will be the bit number of the most significant + /// bit set to 0. For a value of zero or negative one, -1 will be returned. + /// + /// @tparam genIUType Signed or unsigned integer scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/findMSB.xml">GLSL findMSB man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.8 Integer Functions</a> + /// + /// @todo Clarify the declaration to specify that scalars are suported. + template <typename T, template <typename> class genIUType> + GLM_FUNC_DECL typename genIUType<T>::signed_type findMSB(genIUType<T> const & Value); + + /// @} +}//namespace glm + +#include "func_integer.inl" + +#endif//glm_core_func_integer + diff --git a/include/gal/opengl/glm/core/func_integer.inl b/include/gal/opengl/glm/core/func_integer.inl new file mode 100644 index 0000000..ad8b1fe --- /dev/null +++ b/include/gal/opengl/glm/core/func_integer.inl @@ -0,0 +1,648 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/func_integer.inl +/// @date 2010-03-17 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#if(GLM_ARCH != GLM_ARCH_PURE) +#if(GLM_COMPILER & GLM_COMPILER_VC) +# include <intrin.h> +# pragma intrinsic(_BitScanReverse) +#endif//(GLM_COMPILER & GLM_COMPILER_VC) +#endif//(GLM_ARCH != GLM_ARCH_PURE) + +namespace glm +{ + // uaddCarry + template <typename genUType> + GLM_FUNC_QUALIFIER genUType uaddCarry + ( + genUType const & x, + genUType const & y, + genUType & Carry + ) + { + detail::highp_uint_t Value64 = detail::highp_uint_t(x) + detail::highp_uint_t(y); + genUType Result = genUType(Value64 % (detail::highp_uint_t(1) << detail::highp_uint_t(32))); + Carry = (Value64 % (detail::highp_uint_t(1) << detail::highp_uint_t(32))) > 1 ? 1 : 0; + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec2<T> uaddCarry + ( + detail::tvec2<T> const & x, + detail::tvec2<T> const & y, + detail::tvec2<T> & Carry + ) + { + return detail::tvec2<T>( + uaddCarry(x[0], y[0], Carry[0]), + uaddCarry(x[1], y[1], Carry[1])); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> uaddCarry + ( + detail::tvec3<T> const & x, + detail::tvec3<T> const & y, + detail::tvec3<T> & Carry + ) + { + return detail::tvec3<T>( + uaddCarry(x[0], y[0], Carry[0]), + uaddCarry(x[1], y[1], Carry[1]), + uaddCarry(x[2], y[2], Carry[2])); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec4<T> uaddCarry + ( + detail::tvec4<T> const & x, + detail::tvec4<T> const & y, + detail::tvec4<T> & Carry + ) + { + return detail::tvec4<T>( + uaddCarry(x[0], y[0], Carry[0]), + uaddCarry(x[1], y[1], Carry[1]), + uaddCarry(x[2], y[2], Carry[2]), + uaddCarry(x[3], y[3], Carry[3])); + } + + // usubBorrow + template <typename genUType> + GLM_FUNC_QUALIFIER genUType usubBorrow + ( + genUType const & x, + genUType const & y, + genUType & Borrow + ) + { + Borrow = x >= y ? 0 : 1; + if(x > y) + return genUType(detail::highp_int_t(x) - detail::highp_int_t(y)); + else + return genUType((detail::highp_int_t(1) << detail::highp_int_t(32)) + detail::highp_int_t(x) - detail::highp_int_t(y)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec2<T> usubBorrow + ( + detail::tvec2<T> const & x, + detail::tvec2<T> const & y, + detail::tvec2<T> & Borrow + ) + { + return detail::tvec2<T>( + usubBorrow(x[0], y[0], Borrow[0]), + usubBorrow(x[1], y[1], Borrow[1])); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> usubBorrow + ( + detail::tvec3<T> const & x, + detail::tvec3<T> const & y, + detail::tvec3<T> & Borrow + ) + { + return detail::tvec3<T>( + usubBorrow(x[0], y[0], Borrow[0]), + usubBorrow(x[1], y[1], Borrow[1]), + usubBorrow(x[2], y[2], Borrow[2])); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec4<T> usubBorrow + ( + detail::tvec4<T> const & x, + detail::tvec4<T> const & y, + detail::tvec4<T> & Borrow + ) + { + return detail::tvec4<T>( + usubBorrow(x[0], y[0], Borrow[0]), + usubBorrow(x[1], y[1], Borrow[1]), + usubBorrow(x[2], y[2], Borrow[2]), + usubBorrow(x[3], y[3], Borrow[3])); + } + + // umulExtended + template <typename genUType> + GLM_FUNC_QUALIFIER void umulExtended + ( + genUType const & x, + genUType const & y, + genUType & msb, + genUType & lsb + ) + { + detail::highp_uint_t ValueX64 = x; + detail::highp_uint_t ValueY64 = y; + detail::highp_uint_t Value64 = ValueX64 * ValueY64; + msb = *(genUType*)&genUType(Value64 & ((detail::highp_uint_t(1) << detail::highp_uint_t(32)) - detail::highp_uint_t(1))); + lsb = *(genUType*)&genUType(Value64 >> detail::highp_uint_t(32)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec2<T> umulExtended + ( + detail::tvec2<T> const & x, + detail::tvec2<T> const & y, + detail::tvec2<T> & msb, + detail::tvec2<T> & lsb + ) + { + return detail::tvec2<T>( + umulExtended(x[0], y[0], msb, lsb), + umulExtended(x[1], y[1], msb, lsb)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> umulExtended + ( + detail::tvec3<T> const & x, + detail::tvec3<T> const & y, + detail::tvec3<T> & msb, + detail::tvec3<T> & lsb + ) + { + return detail::tvec3<T>( + umulExtended(x[0], y[0], msb, lsb), + umulExtended(x[1], y[1], msb, lsb), + umulExtended(x[2], y[2], msb, lsb)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec4<T> umulExtended + ( + detail::tvec4<T> const & x, + detail::tvec4<T> const & y, + detail::tvec4<T> & msb, + detail::tvec4<T> & lsb + ) + { + return detail::tvec4<T>( + umulExtended(x[0], y[0], msb, lsb), + umulExtended(x[1], y[1], msb, lsb), + umulExtended(x[2], y[2], msb, lsb), + umulExtended(x[3], y[3], msb, lsb)); + } + + // imulExtended + template <typename genIType> + GLM_FUNC_QUALIFIER void imulExtended + ( + genIType const & x, + genIType const & y, + genIType & msb, + genIType & lsb + ) + { + detail::highp_int_t ValueX64 = x; + detail::highp_int_t ValueY64 = y; + detail::highp_int_t Value64 = ValueX64 * ValueY64; + msb = *(genIType*)&genIType(Value64 & ((detail::highp_uint_t(1) << detail::highp_uint_t(32)) - detail::highp_uint_t(1))); + lsb = *(genIType*)&genIType(Value64 >> detail::highp_uint_t(32)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec2<T> imulExtended + ( + detail::tvec2<T> const & x, + detail::tvec2<T> const & y, + detail::tvec2<T> & msb, + detail::tvec2<T> & lsb + ) + { + return detail::tvec2<T>( + imulExtended(x[0], y[0], msb, lsb), + imulExtended(x[1], y[1], msb, lsb)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> imulExtended + ( + detail::tvec3<T> const & x, + detail::tvec3<T> const & y, + detail::tvec3<T> & msb, + detail::tvec3<T> & lsb + ) + { + return detail::tvec3<T>( + imulExtended(x[0], y[0], msb, lsb), + imulExtended(x[1], y[1], msb, lsb), + imulExtended(x[2], y[2], msb, lsb)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec4<T> imulExtended + ( + detail::tvec4<T> const & x, + detail::tvec4<T> const & y, + detail::tvec4<T> & msb, + detail::tvec4<T> & lsb + ) + { + return detail::tvec4<T>( + imulExtended(x[0], y[0], msb, lsb), + imulExtended(x[1], y[1], msb, lsb), + imulExtended(x[2], y[2], msb, lsb), + imulExtended(x[3], y[3], msb, lsb)); + } + + // bitfieldExtract + template <typename genIUType> + GLM_FUNC_QUALIFIER genIUType bitfieldExtract + ( + genIUType const & Value, + int const & Offset, + int const & Bits + ) + { + int GenSize = int(sizeof(genIUType)) << int(3); + + assert(Offset + Bits <= GenSize); + + genIUType ShiftLeft = Bits ? Value << (GenSize - (Bits + Offset)) : genIUType(0); + genIUType ShiftBack = ShiftLeft >> genIUType(GenSize - Bits); + + return ShiftBack; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec2<T> bitfieldExtract + ( + detail::tvec2<T> const & Value, + int const & Offset, + int const & Bits + ) + { + return detail::tvec2<T>( + bitfieldExtract(Value[0], Offset, Bits), + bitfieldExtract(Value[1], Offset, Bits)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> bitfieldExtract + ( + detail::tvec3<T> const & Value, + int const & Offset, + int const & Bits + ) + { + return detail::tvec3<T>( + bitfieldExtract(Value[0], Offset, Bits), + bitfieldExtract(Value[1], Offset, Bits), + bitfieldExtract(Value[2], Offset, Bits)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec4<T> bitfieldExtract + ( + detail::tvec4<T> const & Value, + int const & Offset, + int const & Bits + ) + { + return detail::tvec4<T>( + bitfieldExtract(Value[0], Offset, Bits), + bitfieldExtract(Value[1], Offset, Bits), + bitfieldExtract(Value[2], Offset, Bits), + bitfieldExtract(Value[3], Offset, Bits)); + } + + // bitfieldInsert + template <typename genIUType> + GLM_FUNC_QUALIFIER genIUType bitfieldInsert + ( + genIUType const & Base, + genIUType const & Insert, + int const & Offset, + int const & Bits + ) + { + GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer, "'bitfieldInsert' only accept integer values"); + assert(Offset + Bits <= sizeof(genIUType)); + + if(Bits == 0) + return Base; + + genIUType Mask = 0; + for(int Bit = Offset; Bit < Offset + Bits; ++Bit) + Mask |= (1 << Bit); + + return (Base & ~Mask) | (Insert & Mask); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec2<T> bitfieldInsert + ( + detail::tvec2<T> const & Base, + detail::tvec2<T> const & Insert, + int const & Offset, + int const & Bits + ) + { + return detail::tvec2<T>( + bitfieldInsert(Base[0], Insert[0], Offset, Bits), + bitfieldInsert(Base[1], Insert[1], Offset, Bits)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> bitfieldInsert + ( + detail::tvec3<T> const & Base, + detail::tvec3<T> const & Insert, + int const & Offset, + int const & Bits + ) + { + return detail::tvec3<T>( + bitfieldInsert(Base[0], Insert[0], Offset, Bits), + bitfieldInsert(Base[1], Insert[1], Offset, Bits), + bitfieldInsert(Base[2], Insert[2], Offset, Bits)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec4<T> bitfieldInsert + ( + detail::tvec4<T> const & Base, + detail::tvec4<T> const & Insert, + int const & Offset, + int const & Bits + ) + { + return detail::tvec4<T>( + bitfieldInsert(Base[0], Insert[0], Offset, Bits), + bitfieldInsert(Base[1], Insert[1], Offset, Bits), + bitfieldInsert(Base[2], Insert[2], Offset, Bits), + bitfieldInsert(Base[3], Insert[3], Offset, Bits)); + } + + // bitfieldReverse + template <typename genIUType> + GLM_FUNC_QUALIFIER genIUType bitfieldReverse(genIUType const & Value) + { + GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer, "'bitfieldReverse' only accept integer values"); + + genIUType Out = 0; + std::size_t BitSize = sizeof(genIUType) * 8; + for(std::size_t i = 0; i < BitSize; ++i) + if(Value & (genIUType(1) << i)) + Out |= genIUType(1) << (BitSize - 1 - i); + return Out; + } + + VECTORIZE_VEC(bitfieldReverse) + + // bitCount + template <typename genIUType> + GLM_FUNC_QUALIFIER int bitCount(genIUType const & Value) + { + GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer, "'bitCount' only accept integer values"); + + int Count = 0; + for(std::size_t i = 0; i < sizeof(genIUType) * std::size_t(8); ++i) + { + if(Value & (1 << i)) + ++Count; + } + return Count; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec2<int> bitCount + ( + detail::tvec2<T> const & value + ) + { + return detail::tvec2<int>( + bitCount(value[0]), + bitCount(value[1])); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<int> bitCount + ( + detail::tvec3<T> const & value + ) + { + return detail::tvec3<int>( + bitCount(value[0]), + bitCount(value[1]), + bitCount(value[2])); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec4<int> bitCount + ( + detail::tvec4<T> const & value + ) + { + return detail::tvec4<int>( + bitCount(value[0]), + bitCount(value[1]), + bitCount(value[2]), + bitCount(value[3])); + } + + // findLSB + template <typename genIUType> + GLM_FUNC_QUALIFIER int findLSB + ( + genIUType const & Value + ) + { + GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer, "'findLSB' only accept integer values"); + if(Value == 0) + return -1; + + genIUType Bit; + for(Bit = genIUType(0); !(Value & (1 << Bit)); ++Bit){} + return Bit; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec2<int> findLSB + ( + detail::tvec2<T> const & value + ) + { + return detail::tvec2<int>( + findLSB(value[0]), + findLSB(value[1])); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<int> findLSB + ( + detail::tvec3<T> const & value + ) + { + return detail::tvec3<int>( + findLSB(value[0]), + findLSB(value[1]), + findLSB(value[2])); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec4<int> findLSB + ( + detail::tvec4<T> const & value + ) + { + return detail::tvec4<int>( + findLSB(value[0]), + findLSB(value[1]), + findLSB(value[2]), + findLSB(value[3])); + } + + // findMSB +#if((GLM_ARCH != GLM_ARCH_PURE) && (GLM_COMPILER & GLM_COMPILER_VC)) + + template <typename genIUType> + GLM_FUNC_QUALIFIER int findMSB + ( + genIUType const & Value + ) + { + GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer, "'findMSB' only accept integer values"); + if(Value == 0) + return -1; + + unsigned long Result(0); + _BitScanReverse(&Result, Value); + return int(Result); + } +/* +// __builtin_clz seems to be buggy as it crasks for some values, from 0x00200000 to 80000000 +#elif((GLM_ARCH != GLM_ARCH_PURE) && (GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC40)) + + template <typename genIUType> + GLM_FUNC_QUALIFIER int findMSB + ( + genIUType const & Value + ) + { + GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer, "'findMSB' only accept integer values"); + if(Value == 0) + return -1; + + // clz returns the number or trailing 0-bits; see + // http://gcc.gnu.org/onlinedocs/gcc-4.7.1/gcc/Other-Builtins.html + // + // NoteBecause __builtin_clz only works for unsigned ints, this + // implementation will not work for 64-bit integers. + // + return 31 - __builtin_clzl(Value); + } +*/ +#else + +/* SSE implementation idea + + __m128i const Zero = _mm_set_epi32( 0, 0, 0, 0); + __m128i const One = _mm_set_epi32( 1, 1, 1, 1); + __m128i Bit = _mm_set_epi32(-1, -1, -1, -1); + __m128i Tmp = _mm_set_epi32(Value, Value, Value, Value); + __m128i Mmi = Zero; + for(int i = 0; i < 32; ++i) + { + __m128i Shilt = _mm_and_si128(_mm_cmpgt_epi32(Tmp, One), One); + Tmp = _mm_srai_epi32(Tmp, One); + Bit = _mm_add_epi32(Bit, _mm_and_si128(Shilt, i)); + Mmi = _mm_and_si128(Mmi, One); + } + return Bit; + +*/ + + template <typename genIUType> + GLM_FUNC_QUALIFIER int findMSB + ( + genIUType const & Value + ) + { + GLM_STATIC_ASSERT(std::numeric_limits<genIUType>::is_integer, "'findMSB' only accept integer values"); + + if(Value == genIUType(0) || Value == genIUType(-1)) + return -1; + else if(Value > 0) + { + genIUType Bit = genIUType(-1); + for(genIUType tmp = Value; tmp > 0; tmp >>= 1, ++Bit){} + return Bit; + } + else //if(Value < 0) + { + int const BitCount(sizeof(genIUType) * 8); + int MostSignificantBit(-1); + for(int BitIndex(0); BitIndex < BitCount; ++BitIndex) + MostSignificantBit = (Value & (1 << BitIndex)) ? MostSignificantBit : BitIndex; + assert(MostSignificantBit >= 0); + return MostSignificantBit; + } + } +#endif//(GLM_COMPILER) + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec2<int> findMSB + ( + detail::tvec2<T> const & value + ) + { + return detail::tvec2<int>( + findMSB(value[0]), + findMSB(value[1])); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<int> findMSB + ( + detail::tvec3<T> const & value + ) + { + return detail::tvec3<int>( + findMSB(value[0]), + findMSB(value[1]), + findMSB(value[2])); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec4<int> findMSB + ( + detail::tvec4<T> const & value + ) + { + return detail::tvec4<int>( + findMSB(value[0]), + findMSB(value[1]), + findMSB(value[2]), + findMSB(value[3])); + } +}//namespace glm diff --git a/include/gal/opengl/glm/core/func_matrix.hpp b/include/gal/opengl/glm/core/func_matrix.hpp new file mode 100644 index 0000000..3c92cbb --- /dev/null +++ b/include/gal/opengl/glm/core/func_matrix.hpp @@ -0,0 +1,150 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/func_matrix.hpp +/// @date 2008-08-03 / 2011-06-15 +/// @author Christophe Riccio +/// +/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.6 Matrix Functions</a> +/// +/// @defgroup core_func_matrix Matrix functions +/// @ingroup core +/// +/// For each of the following built-in matrix functions, there is both a +/// single-precision floating point version, where all arguments and return values +/// are single precision, and a double-precision floating version, where all +/// arguments and return values are double precision. Only the single-precision +/// floating point version is shown. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_CORE_func_matrix +#define GLM_CORE_func_matrix GLM_VERSION + +namespace glm +{ + /// @addtogroup core_func_matrix + /// @{ + + /// Multiply matrix x by matrix y component-wise, i.e., + /// result[i][j] is the scalar product of x[i][j] and y[i][j]. + /// + /// @tparam matType Floating-point matrix types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/matrixCompMult.xml">GLSL matrixCompMult man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.6 Matrix Functions</a> + template <typename matType> + GLM_FUNC_DECL matType matrixCompMult( + matType const & x, + matType const & y); + + /// Treats the first parameter c as a column vector + /// and the second parameter r as a row vector + /// and does a linear algebraic matrix multiply c * r. + /// + /// @tparam matType Floating-point matrix types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/outerProduct.xml">GLSL outerProduct man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.6 Matrix Functions</a> + /// + /// @todo Clarify the declaration to specify that matType doesn't have to be provided when used. + template <typename vecType, typename matType> + GLM_FUNC_DECL matType outerProduct( + vecType const & c, + vecType const & r); + + /// Returns the transposed matrix of x + /// + /// @tparam matType Floating-point matrix types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/transpose.xml">GLSL transpose man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.6 Matrix Functions</a> + template <typename matType> + GLM_FUNC_DECL typename matType::transpose_type transpose( + matType const & x); + + /// Return the determinant of a mat2 matrix. + /// + /// @tparam valType Floating-point scalar types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/determinant.xml">GLSL determinant man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.6 Matrix Functions</a> + template <typename valType> + GLM_FUNC_DECL typename detail::tmat2x2<valType>::value_type determinant( + detail::tmat2x2<valType> const & m); + + /// Return the determinant of a mat3 matrix. + /// + /// @tparam valType Floating-point scalar types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/determinant.xml">GLSL determinant man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.6 Matrix Functions</a> + template <typename valType> + GLM_FUNC_DECL typename detail::tmat3x3<valType>::value_type determinant( + detail::tmat3x3<valType> const & m); + + /// Return the determinant of a mat4 matrix. + /// + /// @tparam valType Floating-point scalar types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/determinant.xml">GLSL determinant man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.6 Matrix Functions</a> + template <typename valType> + GLM_FUNC_DECL typename detail::tmat4x4<valType>::value_type determinant( + detail::tmat4x4<valType> const & m); + + /// Return the inverse of a mat2 matrix. + /// + /// @tparam valType Floating-point scalar types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/inverse.xml">GLSL inverse man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.6 Matrix Functions</a> + template <typename valType> + GLM_FUNC_DECL detail::tmat2x2<valType> inverse( + detail::tmat2x2<valType> const & m); + + /// Return the inverse of a mat3 matrix. + /// + /// @tparam valType Floating-point scalar types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/inverse.xml">GLSL inverse man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.6 Matrix Functions</a> + template <typename valType> + GLM_FUNC_DECL detail::tmat3x3<valType> inverse( + detail::tmat3x3<valType> const & m); + + /// Return the inverse of a mat4 matrix. + /// + /// @tparam valType Floating-point scalar types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/inverse.xml">GLSL inverse man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.6 Matrix Functions</a> + template <typename valType> + GLM_FUNC_DECL detail::tmat4x4<valType> inverse( + detail::tmat4x4<valType> const & m); + + /// @} +}//namespace glm + +#include "func_matrix.inl" + +#endif//GLM_CORE_func_matrix diff --git a/include/gal/opengl/glm/core/func_matrix.inl b/include/gal/opengl/glm/core/func_matrix.inl new file mode 100644 index 0000000..d89d5d4 --- /dev/null +++ b/include/gal/opengl/glm/core/func_matrix.inl @@ -0,0 +1,582 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/func_matrix.inl +/// @date 2008-03-08 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + // matrixCompMult + template <typename matType> + GLM_FUNC_QUALIFIER matType matrixCompMult + ( + matType const & x, + matType const & y + ) + { + GLM_STATIC_ASSERT(detail::type<typename matType::value_type>::is_float, "'matrixCompMult' only accept floating-point inputs"); + + matType result(matType::null); + for(typename matType::size_type i = 0; i < matType::row_size(); ++i) + result[i] = x[i] * y[i]; + return result; + } + + // outerProduct + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat2x2<T> outerProduct + ( + detail::tvec2<T> const & c, + detail::tvec2<T> const & r + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'outerProduct' only accept floating-point inputs"); + + detail::tmat2x2<T> m(detail::tmat2x2<T>::null); + m[0][0] = c[0] * r[0]; + m[0][1] = c[1] * r[0]; + m[1][0] = c[0] * r[1]; + m[1][1] = c[1] * r[1]; + return m; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat3x3<T> outerProduct + ( + detail::tvec3<T> const & c, + detail::tvec3<T> const & r + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'outerProduct' only accept floating-point inputs"); + + detail::tmat3x3<T> m(detail::tmat3x3<T>::null); + for(typename detail::tmat3x3<T>::size_type i(0); i < m.length(); ++i) + m[i] = c * r[i]; + return m; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> outerProduct + ( + detail::tvec4<T> const & c, + detail::tvec4<T> const & r + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'outerProduct' only accept floating-point inputs"); + + detail::tmat4x4<T> m(detail::tmat4x4<T>::null); + for(typename detail::tmat4x4<T>::size_type i(0); i < m.length(); ++i) + m[i] = c * r[i]; + return m; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat2x3<T> outerProduct + ( + detail::tvec3<T> const & c, + detail::tvec2<T> const & r + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'outerProduct' only accept floating-point inputs"); + + detail::tmat2x3<T> m(detail::tmat2x3<T>::null); + m[0][0] = c.x * r.x; + m[0][1] = c.y * r.x; + m[0][2] = c.z * r.x; + m[1][0] = c.x * r.y; + m[1][1] = c.y * r.y; + m[1][2] = c.z * r.y; + return m; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat3x2<T> outerProduct + ( + detail::tvec2<T> const & c, + detail::tvec3<T> const & r + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'outerProduct' only accept floating-point inputs"); + + detail::tmat3x2<T> m(detail::tmat3x2<T>::null); + m[0][0] = c.x * r.x; + m[0][1] = c.y * r.x; + m[1][0] = c.x * r.y; + m[1][1] = c.y * r.y; + m[2][0] = c.x * r.z; + m[2][1] = c.y * r.z; + return m; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat2x4<T> outerProduct + ( + detail::tvec4<T> const & c, + detail::tvec2<T> const & r + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'outerProduct' only accept floating-point inputs"); + + detail::tmat2x4<T> m(detail::tmat2x4<T>::null); + m[0][0] = c.x * r.x; + m[0][1] = c.y * r.x; + m[0][2] = c.z * r.x; + m[0][3] = c.w * r.x; + m[1][0] = c.x * r.y; + m[1][1] = c.y * r.y; + m[1][2] = c.z * r.y; + m[1][3] = c.w * r.y; + return m; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x2<T> outerProduct + ( + detail::tvec2<T> const & c, + detail::tvec4<T> const & r + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'outerProduct' only accept floating-point inputs"); + + detail::tmat4x2<T> m(detail::tmat4x2<T>::null); + m[0][0] = c.x * r.x; + m[0][1] = c.y * r.x; + m[1][0] = c.x * r.y; + m[1][1] = c.y * r.y; + m[2][0] = c.x * r.z; + m[2][1] = c.y * r.z; + m[3][0] = c.x * r.w; + m[3][1] = c.y * r.w; + return m; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat3x4<T> outerProduct + ( + detail::tvec4<T> const & c, + detail::tvec3<T> const & r + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'outerProduct' only accept floating-point inputs"); + + detail::tmat3x4<T> m(detail::tmat3x4<T>::null); + m[0][0] = c.x * r.x; + m[0][1] = c.y * r.x; + m[0][2] = c.z * r.x; + m[0][3] = c.w * r.x; + m[1][0] = c.x * r.y; + m[1][1] = c.y * r.y; + m[1][2] = c.z * r.y; + m[1][3] = c.w * r.y; + m[2][0] = c.x * r.z; + m[2][1] = c.y * r.z; + m[2][2] = c.z * r.z; + m[2][3] = c.w * r.z; + return m; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x3<T> outerProduct + ( + detail::tvec3<T> const & c, + detail::tvec4<T> const & r + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'outerProduct' only accept floating-point inputs"); + + detail::tmat4x3<T> m(detail::tmat4x3<T>::null); + m[0][0] = c.x * r.x; + m[0][1] = c.y * r.x; + m[0][2] = c.z * r.x; + m[1][0] = c.x * r.y; + m[1][1] = c.y * r.y; + m[1][2] = c.z * r.y; + m[2][0] = c.x * r.z; + m[2][1] = c.y * r.z; + m[2][2] = c.z * r.z; + m[3][0] = c.x * r.w; + m[3][1] = c.y * r.w; + m[3][2] = c.z * r.w; + return m; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat2x2<T> transpose + ( + detail::tmat2x2<T> const & m + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'transpose' only accept floating-point inputs"); + + detail::tmat2x2<T> result(detail::tmat2x2<T>::null); + result[0][0] = m[0][0]; + result[0][1] = m[1][0]; + result[1][0] = m[0][1]; + result[1][1] = m[1][1]; + return result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat3x3<T> transpose + ( + detail::tmat3x3<T> const & m + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'transpose' only accept floating-point inputs"); + + detail::tmat3x3<T> result(detail::tmat3x3<T>::null); + result[0][0] = m[0][0]; + result[0][1] = m[1][0]; + result[0][2] = m[2][0]; + + result[1][0] = m[0][1]; + result[1][1] = m[1][1]; + result[1][2] = m[2][1]; + + result[2][0] = m[0][2]; + result[2][1] = m[1][2]; + result[2][2] = m[2][2]; + return result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> transpose + ( + detail::tmat4x4<T> const & m + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'transpose' only accept floating-point inputs"); + + detail::tmat4x4<T> result(detail::tmat4x4<T>::null); + result[0][0] = m[0][0]; + result[0][1] = m[1][0]; + result[0][2] = m[2][0]; + result[0][3] = m[3][0]; + + result[1][0] = m[0][1]; + result[1][1] = m[1][1]; + result[1][2] = m[2][1]; + result[1][3] = m[3][1]; + + result[2][0] = m[0][2]; + result[2][1] = m[1][2]; + result[2][2] = m[2][2]; + result[2][3] = m[3][2]; + + result[3][0] = m[0][3]; + result[3][1] = m[1][3]; + result[3][2] = m[2][3]; + result[3][3] = m[3][3]; + return result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat2x3<T> transpose + ( + detail::tmat3x2<T> const & m + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'transpose' only accept floating-point inputs"); + + detail::tmat2x3<T> result(detail::tmat2x3<T>::null); + result[0][0] = m[0][0]; + result[0][1] = m[1][0]; + result[0][2] = m[2][0]; + result[1][0] = m[0][1]; + result[1][1] = m[1][1]; + result[1][2] = m[2][1]; + return result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat3x2<T> transpose + ( + detail::tmat2x3<T> const & m + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'transpose' only accept floating-point inputs"); + + detail::tmat3x2<T> result(detail::tmat3x2<T>::null); + result[0][0] = m[0][0]; + result[0][1] = m[1][0]; + result[1][0] = m[0][1]; + result[1][1] = m[1][1]; + result[2][0] = m[0][2]; + result[2][1] = m[1][2]; + return result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat2x4<T> transpose + ( + detail::tmat4x2<T> const & m + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'transpose' only accept floating-point inputs"); + + detail::tmat2x4<T> result(detail::tmat2x4<T>::null); + result[0][0] = m[0][0]; + result[0][1] = m[1][0]; + result[0][2] = m[2][0]; + result[0][3] = m[3][0]; + result[1][0] = m[0][1]; + result[1][1] = m[1][1]; + result[1][2] = m[2][1]; + result[1][3] = m[3][1]; + return result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x2<T> transpose + ( + detail::tmat2x4<T> const & m + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'transpose' only accept floating-point inputs"); + + detail::tmat4x2<T> result(detail::tmat4x2<T>::null); + result[0][0] = m[0][0]; + result[0][1] = m[1][0]; + result[1][0] = m[0][1]; + result[1][1] = m[1][1]; + result[2][0] = m[0][2]; + result[2][1] = m[1][2]; + result[3][0] = m[0][3]; + result[3][1] = m[1][3]; + return result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat3x4<T> transpose + ( + detail::tmat4x3<T> const & m + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'transpose' only accept floating-point inputs"); + + detail::tmat3x4<T> result(detail::tmat3x4<T>::null); + result[0][0] = m[0][0]; + result[0][1] = m[1][0]; + result[0][2] = m[2][0]; + result[0][3] = m[3][0]; + result[1][0] = m[0][1]; + result[1][1] = m[1][1]; + result[1][2] = m[2][1]; + result[1][3] = m[3][1]; + result[2][0] = m[0][2]; + result[2][1] = m[1][2]; + result[2][2] = m[2][2]; + result[2][3] = m[3][2]; + return result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x3<T> transpose + ( + detail::tmat3x4<T> const & m + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'transpose' only accept floating-point inputs"); + + detail::tmat4x3<T> result(detail::tmat4x3<T>::null); + result[0][0] = m[0][0]; + result[0][1] = m[1][0]; + result[0][2] = m[2][0]; + result[1][0] = m[0][1]; + result[1][1] = m[1][1]; + result[1][2] = m[2][1]; + result[2][0] = m[0][2]; + result[2][1] = m[1][2]; + result[2][2] = m[2][2]; + result[3][0] = m[0][3]; + result[3][1] = m[1][3]; + result[3][2] = m[2][3]; + return result; + } + + template <typename T> + GLM_FUNC_QUALIFIER typename detail::tmat2x2<T>::value_type determinant + ( + detail::tmat2x2<T> const & m + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'determinant' only accept floating-point inputs"); + + return m[0][0] * m[1][1] - m[1][0] * m[0][1]; + } + + template <typename T> + GLM_FUNC_QUALIFIER typename detail::tmat3x3<T>::value_type determinant + ( + detail::tmat3x3<T> const & m + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'determinant' only accept floating-point inputs"); + + return + + m[0][0] * (m[1][1] * m[2][2] - m[2][1] * m[1][2]) + - m[1][0] * (m[0][1] * m[2][2] - m[2][1] * m[0][2]) + + m[2][0] * (m[0][1] * m[1][2] - m[1][1] * m[0][2]); + } + + template <typename T> + GLM_FUNC_QUALIFIER typename detail::tmat4x4<T>::value_type determinant + ( + detail::tmat4x4<T> const & m + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'determinant' only accept floating-point inputs"); + + T SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3]; + T SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3]; + T SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2]; + T SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3]; + T SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2]; + T SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1]; + + detail::tvec4<T> DetCof( + + (m[1][1] * SubFactor00 - m[1][2] * SubFactor01 + m[1][3] * SubFactor02), + - (m[1][0] * SubFactor00 - m[1][2] * SubFactor03 + m[1][3] * SubFactor04), + + (m[1][0] * SubFactor01 - m[1][1] * SubFactor03 + m[1][3] * SubFactor05), + - (m[1][0] * SubFactor02 - m[1][1] * SubFactor04 + m[1][2] * SubFactor05)); + + return m[0][0] * DetCof[0] + + m[0][1] * DetCof[1] + + m[0][2] * DetCof[2] + + m[0][3] * DetCof[3]; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat2x2<T> inverse + ( + detail::tmat2x2<T> const & m + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'inverse' only accept floating-point inputs"); + + //valType Determinant = m[0][0] * m[1][1] - m[1][0] * m[0][1]; + T Determinant = determinant(m); + + detail::tmat2x2<T> Inverse( + + m[1][1] / Determinant, + - m[0][1] / Determinant, + - m[1][0] / Determinant, + + m[0][0] / Determinant); + + return Inverse; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat3x3<T> inverse + ( + detail::tmat3x3<T> const & m + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'inverse' only accept floating-point inputs"); + + //valType Determinant = m[0][0] * (m[1][1] * m[2][2] - m[2][1] * m[1][2]) + // - m[1][0] * (m[0][1] * m[2][2] - m[2][1] * m[0][2]) + // + m[2][0] * (m[0][1] * m[1][2] - m[1][1] * m[0][2]); + + T Determinant = determinant(m); + + detail::tmat3x3<T> Inverse(detail::tmat3x3<T>::null); + Inverse[0][0] = + (m[1][1] * m[2][2] - m[2][1] * m[1][2]); + Inverse[1][0] = - (m[1][0] * m[2][2] - m[2][0] * m[1][2]); + Inverse[2][0] = + (m[1][0] * m[2][1] - m[2][0] * m[1][1]); + Inverse[0][1] = - (m[0][1] * m[2][2] - m[2][1] * m[0][2]); + Inverse[1][1] = + (m[0][0] * m[2][2] - m[2][0] * m[0][2]); + Inverse[2][1] = - (m[0][0] * m[2][1] - m[2][0] * m[0][1]); + Inverse[0][2] = + (m[0][1] * m[1][2] - m[1][1] * m[0][2]); + Inverse[1][2] = - (m[0][0] * m[1][2] - m[1][0] * m[0][2]); + Inverse[2][2] = + (m[0][0] * m[1][1] - m[1][0] * m[0][1]); + Inverse /= Determinant; + + return Inverse; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> inverse + ( + detail::tmat4x4<T> const & m + ) + { + GLM_STATIC_ASSERT(detail::type<T>::is_float, "'inverse' only accept floating-point inputs"); + + T Coef00 = m[2][2] * m[3][3] - m[3][2] * m[2][3]; + T Coef02 = m[1][2] * m[3][3] - m[3][2] * m[1][3]; + T Coef03 = m[1][2] * m[2][3] - m[2][2] * m[1][3]; + + T Coef04 = m[2][1] * m[3][3] - m[3][1] * m[2][3]; + T Coef06 = m[1][1] * m[3][3] - m[3][1] * m[1][3]; + T Coef07 = m[1][1] * m[2][3] - m[2][1] * m[1][3]; + + T Coef08 = m[2][1] * m[3][2] - m[3][1] * m[2][2]; + T Coef10 = m[1][1] * m[3][2] - m[3][1] * m[1][2]; + T Coef11 = m[1][1] * m[2][2] - m[2][1] * m[1][2]; + + T Coef12 = m[2][0] * m[3][3] - m[3][0] * m[2][3]; + T Coef14 = m[1][0] * m[3][3] - m[3][0] * m[1][3]; + T Coef15 = m[1][0] * m[2][3] - m[2][0] * m[1][3]; + + T Coef16 = m[2][0] * m[3][2] - m[3][0] * m[2][2]; + T Coef18 = m[1][0] * m[3][2] - m[3][0] * m[1][2]; + T Coef19 = m[1][0] * m[2][2] - m[2][0] * m[1][2]; + + T Coef20 = m[2][0] * m[3][1] - m[3][0] * m[2][1]; + T Coef22 = m[1][0] * m[3][1] - m[3][0] * m[1][1]; + T Coef23 = m[1][0] * m[2][1] - m[2][0] * m[1][1]; + + detail::tvec4<T> const SignA(+1, -1, +1, -1); + detail::tvec4<T> const SignB(-1, +1, -1, +1); + + detail::tvec4<T> Fac0(Coef00, Coef00, Coef02, Coef03); + detail::tvec4<T> Fac1(Coef04, Coef04, Coef06, Coef07); + detail::tvec4<T> Fac2(Coef08, Coef08, Coef10, Coef11); + detail::tvec4<T> Fac3(Coef12, Coef12, Coef14, Coef15); + detail::tvec4<T> Fac4(Coef16, Coef16, Coef18, Coef19); + detail::tvec4<T> Fac5(Coef20, Coef20, Coef22, Coef23); + + detail::tvec4<T> Vec0(m[1][0], m[0][0], m[0][0], m[0][0]); + detail::tvec4<T> Vec1(m[1][1], m[0][1], m[0][1], m[0][1]); + detail::tvec4<T> Vec2(m[1][2], m[0][2], m[0][2], m[0][2]); + detail::tvec4<T> Vec3(m[1][3], m[0][3], m[0][3], m[0][3]); + + detail::tvec4<T> Inv0 = SignA * (Vec1 * Fac0 - Vec2 * Fac1 + Vec3 * Fac2); + detail::tvec4<T> Inv1 = SignB * (Vec0 * Fac0 - Vec2 * Fac3 + Vec3 * Fac4); + detail::tvec4<T> Inv2 = SignA * (Vec0 * Fac1 - Vec1 * Fac3 + Vec3 * Fac5); + detail::tvec4<T> Inv3 = SignB * (Vec0 * Fac2 - Vec1 * Fac4 + Vec2 * Fac5); + + detail::tmat4x4<T> Inverse(Inv0, Inv1, Inv2, Inv3); + + detail::tvec4<T> Row0(Inverse[0][0], Inverse[1][0], Inverse[2][0], Inverse[3][0]); + + T Determinant = glm::dot(m[0], Row0); + + Inverse /= Determinant; + + return Inverse; + } +}//namespace glm diff --git a/include/gal/opengl/glm/core/func_noise.hpp b/include/gal/opengl/glm/core/func_noise.hpp new file mode 100644 index 0000000..3e5f874 --- /dev/null +++ b/include/gal/opengl/glm/core/func_noise.hpp @@ -0,0 +1,87 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/func_noise.hpp +/// @date 2008-08-01 / 2011-06-18 +/// @author Christophe Riccio +/// +/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.13 Noise Functions</a> +/// +/// @defgroup core_func_noise Noise functions +/// @ingroup core +/// +/// Noise functions are stochastic functions that can be used to increase visual +/// complexity. Values returned by the following noise functions give the +/// appearance of randomness, but are not truly random. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_func_noise +#define glm_core_func_noise GLM_VERSION + +namespace glm +{ + /// @addtogroup core_func_noise + /// @{ + + /// Returns a 1D noise value based on the input value x. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/noise1.xml">GLSL noise1 man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.13 Noise Functions</a> + template <typename genType> + GLM_FUNC_DECL typename genType::value_type noise1(genType const & x); + + /// Returns a 2D noise value based on the input value x. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/noise2.xml">GLSL noise2 man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.13 Noise Functions</a> + template <typename genType> + GLM_FUNC_DECL detail::tvec2<typename genType::value_type> noise2(genType const & x); + + /// Returns a 3D noise value based on the input value x. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/noise3.xml">GLSL noise3 man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.13 Noise Functions</a> + template <typename genType> + GLM_FUNC_DECL detail::tvec3<typename genType::value_type> noise3(genType const & x); + + /// Returns a 4D noise value based on the input value x. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/noise4.xml">GLSL noise4 man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.13 Noise Functions</a> + template <typename genType> + GLM_FUNC_DECL detail::tvec4<typename genType::value_type> noise4(genType const & x); + + /// @} +}//namespace glm + +#include "func_noise.inl" + +#endif//glm_core_func_noise diff --git a/include/gal/opengl/glm/core/func_noise.inl b/include/gal/opengl/glm/core/func_noise.inl new file mode 100644 index 0000000..68a1933 --- /dev/null +++ b/include/gal/opengl/glm/core/func_noise.inl @@ -0,0 +1,364 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/func_noise.inl +/// @date 2008-08-01 / 2011-09-27 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template <typename T> + GLM_FUNC_QUALIFIER T noise1(T const & x) + { + return noise1(glm::detail::tvec2<T>(x, T(0))); + } + + template <typename T> + GLM_FUNC_QUALIFIER glm::detail::tvec2<T> noise2(T const & x) + { + return glm::detail::tvec2<T>( + noise1(x + T(0.0)), + noise1(x + T(1.0))); + } + + template <typename T> + GLM_FUNC_QUALIFIER glm::detail::tvec3<T> noise3(T const & x) + { + return glm::detail::tvec3<T>( + noise1(x - T(1.0)), + noise1(x + T(0.0)), + noise1(x + T(1.0))); + } + + template <typename T> + GLM_FUNC_QUALIFIER glm::detail::tvec4<T> noise4(T const & x) + { + return glm::detail::tvec4<T>( + noise1(x - T(1.0)), + noise1(x + T(0.0)), + noise1(x + T(1.0)), + noise1(x + T(2.0))); + } + + template <typename T> + GLM_FUNC_QUALIFIER T noise1(glm::detail::tvec2<T> const & v) + { + detail::tvec4<T> const C = detail::tvec4<T>( + T( 0.211324865405187), // (3.0 - sqrt(3.0)) / 6.0 + T( 0.366025403784439), // 0.5 * (sqrt(3.0) - 1.0) + T(-0.577350269189626), // -1.0 + 2.0 * C.x + T( 0.024390243902439)); // 1.0 / 41.0 + + // First corner + detail::tvec2<T> i = floor(v + dot(v, detail::tvec2<T>(C[1]))); + detail::tvec2<T> x0 = v - i + dot(i, detail::tvec2<T>(C[0])); + + // Other corners + //i1.x = step( x0.y, x0.x ); // x0.x > x0.y ? 1.0 : 0.0 + //i1.y = 1.0 - i1.x; + detail::tvec2<T> i1 = (x0.x > x0.y) ? detail::tvec2<T>(1, 0) : detail::tvec2<T>(0, 1); + // x0 = x0 - 0.0 + 0.0 * C.xx ; + // x1 = x0 - i1 + 1.0 * C.xx ; + // x2 = x0 - 1.0 + 2.0 * C.xx ; + detail::tvec4<T> x12 = detail::tvec4<T>(x0.x, x0.y, x0.x, x0.y) + detail::tvec4<T>(C.x, C.x, C.z, C.z); + x12 = detail::tvec4<T>(detail::tvec2<T>(x12) - i1, x12.z, x12.w); + + // Permutations + i = mod(i, T(289)); // Avoid truncation effects in permutation + detail::tvec3<T> p = permute( + permute(i.y + detail::tvec3<T>(T(0), i1.y, T(1))) + + i.x + detail::tvec3<T>(T(0), i1.x, T(1))); + + detail::tvec3<T> m = max(T(0.5) - detail::tvec3<T>( + dot(x0, x0), + dot(detail::tvec2<T>(x12.x, x12.y), detail::tvec2<T>(x12.x, x12.y)), + dot(detail::tvec2<T>(x12.z, x12.w), detail::tvec2<T>(x12.z, x12.w))), T(0)); + m = m * m ; + m = m * m ; + + // Gradients: 41 points uniformly over a line, mapped onto a diamond. + // The ring size 17*17 = 289 is close to a multiple of 41 (41*7 = 287) + + detail::tvec3<T> x = T(2) * fract(p * C.w) - T(1); + detail::tvec3<T> h = abs(x) - T(0.5); + detail::tvec3<T> ox = floor(x + T(0.5)); + detail::tvec3<T> a0 = x - ox; + + // Normalise gradients implicitly by scaling m + // Inlined for speed: m *= taylorInvSqrt( a0*a0 + h*h ); + m *= T(1.79284291400159) - T(0.85373472095314) * (a0 * a0 + h * h); + + // Compute final noise value at P + detail::tvec3<T> g; + g.x = a0.x * x0.x + h.x * x0.y; + //g.yz = a0.yz * x12.xz + h.yz * x12.yw; + g.y = a0.y * x12.x + h.y * x12.y; + g.z = a0.z * x12.z + h.z * x12.w; + return T(130) * dot(m, g); + } + + template <typename T> + GLM_FUNC_QUALIFIER T noise1(detail::tvec3<T> const & v) + { + detail::tvec2<T> const C(1.0 / 6.0, 1.0 / 3.0); + detail::tvec4<T> const D(0.0, 0.5, 1.0, 2.0); + + // First corner + detail::tvec3<T> i(floor(v + dot(v, detail::tvec3<T>(C.y)))); + detail::tvec3<T> x0(v - i + dot(i, detail::tvec3<T>(C.x))); + + // Other corners + detail::tvec3<T> g(step(detail::tvec3<T>(x0.y, x0.z, x0.x), x0)); + detail::tvec3<T> l(T(1) - g); + detail::tvec3<T> i1(min(g, detail::tvec3<T>(l.z, l.x, l.y))); + detail::tvec3<T> i2(max(g, detail::tvec3<T>(l.z, l.x, l.y))); + + // x0 = x0 - 0.0 + 0.0 * C.xxx; + // x1 = x0 - i1 + 1.0 * C.xxx; + // x2 = x0 - i2 + 2.0 * C.xxx; + // x3 = x0 - 1.0 + 3.0 * C.xxx; + detail::tvec3<T> x1(x0 - i1 + C.x); + detail::tvec3<T> x2(x0 - i2 + C.y); // 2.0*C.x = 1/3 = C.y + detail::tvec3<T> x3(x0 - D.y); // -1.0+3.0*C.x = -0.5 = -D.y + + // Permutations + i = mod289(i); + detail::tvec4<T> p(permute(permute(permute( + i.z + detail::tvec4<T>(T(0), i1.z, i2.z, T(1))) + + i.y + detail::tvec4<T>(T(0), i1.y, i2.y, T(1))) + + i.x + detail::tvec4<T>(T(0), i1.x, i2.x, T(1)))); + + // Gradients: 7x7 points over a square, mapped onto an octahedron. + // The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294) + T n_ = T(0.142857142857); // 1.0/7.0 + detail::tvec3<T> ns(n_ * detail::tvec3<T>(D.w, D.y, D.z) - detail::tvec3<T>(D.x, D.z, D.x)); + + detail::tvec4<T> j(p - T(49) * floor(p * ns.z * ns.z)); // mod(p,7*7) + + detail::tvec4<T> x_(floor(j * ns.z)); + detail::tvec4<T> y_(floor(j - T(7) * x_)); // mod(j,N) + + detail::tvec4<T> x(x_ * ns.x + ns.y); + detail::tvec4<T> y(y_ * ns.x + ns.y); + detail::tvec4<T> h(T(1) - abs(x) - abs(y)); + + detail::tvec4<T> b0(x.x, x.y, y.x, y.y); + detail::tvec4<T> b1(x.z, x.w, y.z, y.w); + + // vec4 s0 = vec4(lessThan(b0,0.0))*2.0 - 1.0; + // vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0; + detail::tvec4<T> s0(floor(b0) * T(2) + T(1)); + detail::tvec4<T> s1(floor(b1) * T(2) + T(1)); + detail::tvec4<T> sh(-step(h, detail::tvec4<T>(0.0))); + + detail::tvec4<T> a0 = detail::tvec4<T>(b0.x, b0.z, b0.y, b0.w) + detail::tvec4<T>(s0.x, s0.z, s0.y, s0.w) * detail::tvec4<T>(sh.x, sh.x, sh.y, sh.y); + detail::tvec4<T> a1 = detail::tvec4<T>(b1.x, b1.z, b1.y, b1.w) + detail::tvec4<T>(s1.x, s1.z, s1.y, s1.w) * detail::tvec4<T>(sh.z, sh.z, sh.w, sh.w); + + detail::tvec3<T> p0(a0.x, a0.y, h.x); + detail::tvec3<T> p1(a0.z, a0.w, h.y); + detail::tvec3<T> p2(a1.x, a1.y, h.z); + detail::tvec3<T> p3(a1.z, a1.w, h.w); + + // Normalise gradients + detail::tvec4<T> norm = taylorInvSqrt(detail::tvec4<T>(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3))); + p0 *= norm.x; + p1 *= norm.y; + p2 *= norm.z; + p3 *= norm.w; + + // Mix final noise value + detail::tvec4<T> m = max(T(0.6) - detail::tvec4<T>(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), T(0)); + m = m * m; + return T(42) * dot(m * m, detail::tvec4<T>(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3))); + } + + template <typename T> + GLM_FUNC_QUALIFIER T noise1(detail::tvec4<T> const & v) + { + detail::tvec4<T> const C( + 0.138196601125011, // (5 - sqrt(5))/20 G4 + 0.276393202250021, // 2 * G4 + 0.414589803375032, // 3 * G4 + -0.447213595499958); // -1 + 4 * G4 + + // (sqrt(5) - 1)/4 = F4, used once below + T const F4 = T(0.309016994374947451); + + // First corner + detail::tvec4<T> i = floor(v + dot(v, vec4(F4))); + detail::tvec4<T> x0 = v - i + dot(i, vec4(C.x)); + + // Other corners + + // Rank sorting originally contributed by Bill Licea-Kane, AMD (formerly ATI) + detail::tvec4<T> i0; + detail::tvec3<T> isX = step(detail::tvec3<T>(x0.y, x0.z, x0.w), detail::tvec3<T>(x0.x)); + detail::tvec3<T> isYZ = step(detail::tvec3<T>(x0.z, x0.w, x0.w), detail::tvec3<T>(x0.y, x0.y, x0.z)); + // i0.x = dot(isX, vec3(1.0)); + //i0.x = isX.x + isX.y + isX.z; + //i0.yzw = T(1) - isX; + i0 = detail::tvec4<T>(isX.x + isX.y + isX.z, T(1) - isX); + // i0.y += dot(isYZ.xy, vec2(1.0)); + i0.y += isYZ.x + isYZ.y; + //i0.zw += 1.0 - detail::tvec2<T>(isYZ.x, isYZ.y); + i0.z += T(1) - isYZ.x; + i0.w += T(1) - isYZ.y; + i0.z += isYZ.z; + i0.w += T(1) - isYZ.z; + + // i0 now contains the unique values 0,1,2,3 in each channel + detail::tvec4<T> i3 = clamp(i0, 0.0, 1.0); + detail::tvec4<T> i2 = clamp(i0 - 1.0, 0.0, 1.0); + detail::tvec4<T> i1 = clamp(i0 - 2.0, 0.0, 1.0); + + // x0 = x0 - 0.0 + 0.0 * C.xxxx + // x1 = x0 - i1 + 0.0 * C.xxxx + // x2 = x0 - i2 + 0.0 * C.xxxx + // x3 = x0 - i3 + 0.0 * C.xxxx + // x4 = x0 - 1.0 + 4.0 * C.xxxx + detail::tvec4<T> x1 = x0 - i1 + C.x; + detail::tvec4<T> x2 = x0 - i2 + C.y; + detail::tvec4<T> x3 = x0 - i3 + C.z; + detail::tvec4<T> x4 = x0 + C.w; + + // Permutations + i = mod(i, T(289)); + T j0 = permute(permute(permute(permute(i.w) + i.z) + i.y) + i.x); + detail::tvec4<T> j1 = permute(permute(permute(permute( + i.w + detail::tvec4<T>(i1.w, i2.w, i3.w, T(1))) + + i.z + detail::tvec4<T>(i1.z, i2.z, i3.z, T(1))) + + i.y + detail::tvec4<T>(i1.y, i2.y, i3.y, T(1))) + + i.x + detail::tvec4<T>(i1.x, i2.x, i3.x, T(1))); + + // Gradients: 7x7x6 points over a cube, mapped onto a 4-cross polytope + // 7*7*6 = 294, which is close to the ring size 17*17 = 289. + detail::tvec4<T> ip = detail::tvec4<T>(T(1) / T(294), T(1) / T(49), T(1) / T(7), T(0)); + + detail::tvec4<T> p0 = grad4(j0, ip); + detail::tvec4<T> p1 = grad4(j1.x, ip); + detail::tvec4<T> p2 = grad4(j1.y, ip); + detail::tvec4<T> p3 = grad4(j1.z, ip); + detail::tvec4<T> p4 = grad4(j1.w, ip); + + // Normalise gradients + detail::tvec4<T> norm = taylorInvSqrt(detail::tvec4<T>(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3))); + p0 *= norm.x; + p1 *= norm.y; + p2 *= norm.z; + p3 *= norm.w; + p4 *= taylorInvSqrt(dot(p4, p4)); + + // Mix contributions from the five corners + detail::tvec3<T> m0 = max(T(0.6) - detail::tvec3<T>(dot(x0, x0), dot(x1, x1), dot(x2, x2)), T(0)); + detail::tvec2<T> m1 = max(T(0.6) - detail::tvec2<T>(dot(x3, x3), dot(x4, x4) ), T(0)); + m0 = m0 * m0; + m1 = m1 * m1; + return T(49) * + (dot(m0 * m0, detail::tvec3<T>(dot(p0, x0), dot(p1, x1), dot(p2, x2))) + + dot(m1 * m1, detail::tvec2<T>(dot(p3, x3), dot(p4, x4)))); + } + + template <typename T> + GLM_FUNC_QUALIFIER glm::detail::tvec2<T> noise2(glm::detail::tvec2<T> const & x) + { + return glm::detail::tvec2<T>( + noise1(x + glm::detail::tvec2<T>(0.0)), + noise1(glm::detail::tvec2<T>(0.0) - x)); + } + + template <typename T> + GLM_FUNC_QUALIFIER glm::detail::tvec2<T> noise2(glm::detail::tvec3<T> const & x) + { + return glm::detail::tvec2<T>( + noise1(x + glm::detail::tvec3<T>(0.0)), + noise1(glm::detail::tvec3<T>(0.0) - x)); + } + + template <typename T> + GLM_FUNC_QUALIFIER glm::detail::tvec2<T> noise2(glm::detail::tvec4<T> const & x) + { + return glm::detail::tvec2<T>( + noise1(x + glm::detail::tvec4<T>(0.0)), + noise1(glm::detail::tvec4<T>(0.0) - x)); + } + + template <typename T> + GLM_FUNC_QUALIFIER glm::detail::tvec3<T> noise3(glm::detail::tvec2<T> const & x) + { + return glm::detail::tvec3<T>( + noise1(x - glm::detail::tvec2<T>(1.0)), + noise1(x + glm::detail::tvec2<T>(0.0)), + noise1(x + glm::detail::tvec2<T>(1.0))); + } + + template <typename T> + GLM_FUNC_QUALIFIER glm::detail::tvec3<T> noise3(glm::detail::tvec3<T> const & x) + { + return glm::detail::tvec3<T>( + noise1(x - glm::detail::tvec3<T>(1.0)), + noise1(x + glm::detail::tvec3<T>(0.0)), + noise1(x + glm::detail::tvec3<T>(1.0))); + } + + template <typename T> + GLM_FUNC_QUALIFIER glm::detail::tvec3<T> noise3(glm::detail::tvec4<T> const & x) + { + return glm::detail::tvec3<T>( + noise1(x - glm::detail::tvec4<T>(1.0)), + noise1(x + glm::detail::tvec4<T>(0.0)), + noise1(x + glm::detail::tvec4<T>(1.0))); + } + + template <typename T> + GLM_FUNC_QUALIFIER glm::detail::tvec4<T> noise4(glm::detail::tvec2<T> const & x) + { + return glm::detail::tvec4<T>( + noise1(x - glm::detail::tvec2<T>(1.0)), + noise1(x + glm::detail::tvec2<T>(0.0)), + noise1(x + glm::detail::tvec2<T>(1.0)), + noise1(x + glm::detail::tvec2<T>(2.0))); + } + + + template <typename T> + GLM_FUNC_QUALIFIER glm::detail::tvec4<T> noise4(glm::detail::tvec3<T> const & x) + { + return glm::detail::tvec4<T>( + noise1(x - glm::detail::tvec3<T>(1.0)), + noise1(x + glm::detail::tvec3<T>(0.0)), + noise1(x + glm::detail::tvec3<T>(1.0)), + noise1(x + glm::detail::tvec3<T>(2.0))); + } + + template <typename T> + GLM_FUNC_QUALIFIER glm::detail::tvec4<T> noise4(glm::detail::tvec4<T> const & x) + { + return glm::detail::tvec4<T>( + noise1(x - glm::detail::tvec4<T>(1.0)), + noise1(x + glm::detail::tvec4<T>(0.0)), + noise1(x + glm::detail::tvec4<T>(1.0)), + noise1(x + glm::detail::tvec4<T>(2.0))); + } + +}//namespace glm diff --git a/include/gal/opengl/glm/core/func_packing.hpp b/include/gal/opengl/glm/core/func_packing.hpp new file mode 100644 index 0000000..b4312e1 --- /dev/null +++ b/include/gal/opengl/glm/core/func_packing.hpp @@ -0,0 +1,193 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/func_packing.hpp +/// @date 2010-03-17 / 2011-06-15 +/// @author Christophe Riccio +/// +/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> +/// +/// @defgroup core_func_packing Floating-Point Pack and Unpack Functions +/// @ingroup core +/// +/// These functions do not operate component-wise, rather as described in each case. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_CORE_func_packing +#define GLM_CORE_func_packing GLM_VERSION + +namespace glm +{ + /// @addtogroup core_func_packing + /// @{ + + //! First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values. + //! Then, the results are packed into the returned 32-bit unsigned integer. + //! + //! The conversion for component c of v to fixed point is done as follows: + //! packUnorm2x16: round(clamp(c, 0, +1) * 65535.0) + //! + //! The first component of the vector will be written to the least significant bits of the output; + //! the last component will be written to the most significant bits. + //! + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packUnorm2x16.xml">GLSL packUnorm2x16 man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> + GLM_FUNC_DECL detail::uint32 packUnorm2x16(detail::tvec2<detail::float32> const & v); + + //! First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values. + //! Then, the results are packed into the returned 32-bit unsigned integer. + //! + //! The conversion for component c of v to fixed point is done as follows: + //! packSnorm2x16: round(clamp(v, -1, +1) * 32767.0) + //! + //! The first component of the vector will be written to the least significant bits of the output; + //! the last component will be written to the most significant bits. + //! + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packSnorm2x16.xml">GLSL packSnorm2x16 man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> + GLM_FUNC_DECL detail::uint32 packSnorm2x16(detail::tvec2<detail::float32> const & v); + + //! First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values. + //! Then, the results are packed into the returned 32-bit unsigned integer. + //! + //! The conversion for component c of v to fixed point is done as follows: + //! packUnorm4x8: round(clamp(c, 0, +1) * 255.0) + //! + //! The first component of the vector will be written to the least significant bits of the output; + //! the last component will be written to the most significant bits. + //! + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packUnorm4x8.xml">GLSL packUnorm4x8 man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> + GLM_FUNC_DECL detail::uint32 packUnorm4x8(detail::tvec4<detail::float32> const & v); + + //! First, converts each component of the normalized floating-point value v into 8- or 16-bit integer values. + //! Then, the results are packed into the returned 32-bit unsigned integer. + //! + //! The conversion for component c of v to fixed point is done as follows: + //! packSnorm4x8: round(clamp(c, -1, +1) * 127.0) + //! + //! The first component of the vector will be written to the least significant bits of the output; + //! the last component will be written to the most significant bits. + //! + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packSnorm4x8.xml">GLSL packSnorm4x8 man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> + GLM_FUNC_DECL detail::uint32 packSnorm4x8(detail::tvec4<detail::float32> const & v); + + //! First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit unsigned integers, four 8-bit unsigned integers, or four 8-bit signed integers. + //! Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector. + //! + //! The conversion for unpacked fixed-point value f to floating point is done as follows: + //! unpackUnorm2x16: f / 65535.0 + //! + //! The first component of the returned vector will be extracted from the least significant bits of the input; + //! the last component will be extracted from the most significant bits. + //! + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackUnorm2x16.xml">GLSL unpackUnorm2x16 man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> + GLM_FUNC_DECL detail::tvec2<detail::float32> unpackUnorm2x16(detail::uint32 const & p); + + //! First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit unsigned integers, four 8-bit unsigned integers, or four 8-bit signed integers. + //! Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector. + //! + //! The conversion for unpacked fixed-point value f to floating point is done as follows: + //! unpackSnorm2x16: clamp(f / 32767.0, -1, +1) + //! + //! The first component of the returned vector will be extracted from the least significant bits of the input; + //! the last component will be extracted from the most significant bits. + //! + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackSnorm2x16.xml">GLSL unpackSnorm2x16 man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> + GLM_FUNC_DECL detail::tvec2<detail::float32> unpackSnorm2x16(detail::uint32 const & p); + + /// First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit unsigned integers, four 8-bit unsigned integers, or four 8-bit signed integers. + /// Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector. + /// + /// The conversion for unpacked fixed-point value f to floating point is done as follows: + /// unpackUnorm4x8: f / 255.0 + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// the last component will be extracted from the most significant bits. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackUnorm4x8.xml">GLSL unpackUnorm4x8 man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> + GLM_FUNC_DECL detail::tvec4<detail::float32> unpackUnorm4x8(detail::uint32 const & p); + + /// First, unpacks a single 32-bit unsigned integer p into a pair of 16-bit unsigned integers, four 8-bit unsigned integers, or four 8-bit signed integers. + /// Then, each component is converted to a normalized floating-point value to generate the returned two- or four-component vector. + /// + /// The conversion for unpacked fixed-point value f to floating point is done as follows: + /// unpackSnorm4x8: clamp(f / 127.0, -1, +1) + /// + /// The first component of the returned vector will be extracted from the least significant bits of the input; + /// the last component will be extracted from the most significant bits. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackSnorm4x8.xml">GLSL unpackSnorm4x8 man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> + GLM_FUNC_DECL detail::tvec4<detail::float32> unpackSnorm4x8(detail::uint32 const & p); + + /// Returns a double-precision value obtained by packing the components of v into a 64-bit value. + /// If an IEEE 754 Inf or NaN is created, it will not signal, and the resulting floating point value is unspecified. + /// Otherwise, the bit- level representation of v is preserved. + /// The first vector component specifies the 32 least significant bits; + /// the second component specifies the 32 most significant bits. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packDouble2x32.xml">GLSL packDouble2x32 man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> + GLM_FUNC_DECL double packDouble2x32(detail::tvec2<detail::uint32> const & v); + + /// Returns a two-component unsigned integer vector representation of v. + /// The bit-level representation of v is preserved. + /// The first component of the vector contains the 32 least significant bits of the double; + /// the second component consists the 32 most significant bits. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackDouble2x32.xml">GLSL unpackDouble2x32 man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> + GLM_FUNC_DECL detail::tvec2<detail::uint32> unpackDouble2x32(double const & v); + + /// Returns an unsigned integer obtained by converting the components of a two-component floating-point vector + /// to the 16-bit floating-point representation found in the OpenGL Specification, + /// and then packing these two 16- bit integers into a 32-bit unsigned integer. + /// The first vector component specifies the 16 least-significant bits of the result; + /// the second component specifies the 16 most-significant bits. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/packHalf2x16.xml">GLSL packHalf2x16 man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> + GLM_FUNC_DECL uint packHalf2x16(vec2 const & v); + + /// Returns a two-component floating-point vector with components obtained by unpacking a 32-bit unsigned integer into a pair of 16-bit values, + /// interpreting those values as 16-bit floating-point numbers according to the OpenGL Specification, + /// and converting them to 32-bit floating-point values. + /// The first component of the vector is obtained from the 16 least-significant bits of v; + /// the second component is obtained from the 16 most-significant bits of v. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/unpackHalf2x16.xml">GLSL unpackHalf2x16 man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.4 Floating-Point Pack and Unpack Functions</a> + GLM_FUNC_DECL vec2 unpackHalf2x16(uint const & v); + + /// @} +}//namespace glm + +#include "func_packing.inl" + +#endif//GLM_CORE_func_packing + diff --git a/include/gal/opengl/glm/core/func_packing.inl b/include/gal/opengl/glm/core/func_packing.inl new file mode 100644 index 0000000..e10e161 --- /dev/null +++ b/include/gal/opengl/glm/core/func_packing.inl @@ -0,0 +1,208 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/func_packing.inl +/// @date 2010-03-17 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + GLM_FUNC_QUALIFIER detail::uint32 packUnorm2x16(detail::tvec2<detail::float32> const & v) + { + detail::uint16 A(detail::uint16(round(clamp(v.x, 0.0f, 1.0f) * 65535.0f))); + detail::uint16 B(detail::uint16(round(clamp(v.y, 0.0f, 1.0f) * 65535.0f))); + return detail::uint32((B << 16) | A); + } + + GLM_FUNC_QUALIFIER detail::tvec2<detail::float32> unpackUnorm2x16(detail::uint32 const & p) + { + detail::uint32 Mask16((1 << 16) - 1); + detail::uint32 A((p >> 0) & Mask16); + detail::uint32 B((p >> 16) & Mask16); + return detail::tvec2<detail::float32>( + A * 1.0f / 65535.0f, + B * 1.0f / 65535.0f); + } + + GLM_FUNC_QUALIFIER detail::uint32 packSnorm2x16(detail::tvec2<detail::float32> const & v) + { + union iu + { + detail::int16 i; + detail::uint16 u; + } A, B; + + detail::tvec2<detail::float32> Unpack = clamp(v ,-1.0f, 1.0f) * 32767.0f; + A.i = detail::int16(round(Unpack.x)); + B.i = detail::int16(round(Unpack.y)); + detail::uint32 Pack = (detail::uint32(B.u) << 16) | (detail::uint32(A.u) << 0); + return Pack; + } + + GLM_FUNC_QUALIFIER detail::tvec2<detail::float32> unpackSnorm2x16(detail::uint32 const & p) + { + union iu + { + detail::int16 i; + detail::uint16 u; + } A, B; + + detail::uint32 Mask16((1 << 16) - 1); + A.u = detail::uint16((p >> 0) & Mask16); + B.u = detail::uint16((p >> 16) & Mask16); + detail::tvec2<detail::float32> Pack(A.i, B.i); + + return clamp(Pack * 1.0f / 32767.0f, -1.0f, 1.0f); + } + + GLM_FUNC_QUALIFIER detail::uint32 packUnorm4x8(detail::tvec4<detail::float32> const & v) + { + detail::uint8 A((detail::uint8)round(clamp(v.x, 0.0f, 1.0f) * 255.0f)); + detail::uint8 B((detail::uint8)round(clamp(v.y, 0.0f, 1.0f) * 255.0f)); + detail::uint8 C((detail::uint8)round(clamp(v.z, 0.0f, 1.0f) * 255.0f)); + detail::uint8 D((detail::uint8)round(clamp(v.w, 0.0f, 1.0f) * 255.0f)); + return detail::uint32((D << 24) | (C << 16) | (B << 8) | A); + } + + GLM_FUNC_QUALIFIER detail::tvec4<detail::float32> unpackUnorm4x8(detail::uint32 const & p) + { + detail::uint32 Mask8((1 << 8) - 1); + detail::uint32 A((p >> 0) & Mask8); + detail::uint32 B((p >> 8) & Mask8); + detail::uint32 C((p >> 16) & Mask8); + detail::uint32 D((p >> 24) & Mask8); + return detail::tvec4<detail::float32>( + A * 1.0f / 255.0f, + B * 1.0f / 255.0f, + C * 1.0f / 255.0f, + D * 1.0f / 255.0f); + } + + GLM_FUNC_QUALIFIER detail::uint32 packSnorm4x8(detail::tvec4<detail::float32> const & v) + { + union iu + { + detail::int8 i; + detail::uint8 u; + } A, B, C, D; + + detail::tvec4<detail::float32> Unpack = clamp(v ,-1.0f, 1.0f) * 127.0f; + A.i = detail::int8(round(Unpack.x)); + B.i = detail::int8(round(Unpack.y)); + C.i = detail::int8(round(Unpack.z)); + D.i = detail::int8(round(Unpack.w)); + detail::uint32 Pack = (detail::uint32(D.u) << 24) | (detail::uint32(C.u) << 16) | (detail::uint32(B.u) << 8) | (detail::uint32(A.u) << 0); + return Pack; + } + + GLM_FUNC_QUALIFIER detail::tvec4<detail::float32> unpackSnorm4x8(detail::uint32 const & p) + { + union iu + { + detail::int8 i; + detail::uint8 u; + } A, B, C, D; + + detail::uint32 Mask8((1 << 8) - 1); + A.u = detail::uint8((p >> 0) & Mask8); + B.u = detail::uint8((p >> 8) & Mask8); + C.u = detail::uint8((p >> 16) & Mask8); + D.u = detail::uint8((p >> 24) & Mask8); + detail::tvec4<detail::float32> Pack(A.i, B.i, C.i, D.i); + + return clamp(Pack * 1.0f / 127.0f, -1.0f, 1.0f); + } + + GLM_FUNC_QUALIFIER double packDouble2x32(detail::tvec2<detail::uint32> const & v) + { + struct uint32_pair + { + detail::uint32 x; + detail::uint32 y; + }; + + union helper + { + uint32_pair input; + double output; + } Helper; + + Helper.input.x = v.x; + Helper.input.y = v.y; + + return Helper.output; + //return *(double*)&v; + } + + GLM_FUNC_QUALIFIER detail::tvec2<uint> unpackDouble2x32(double const & v) + { + struct uint32_pair + { + detail::uint32 x; + detail::uint32 y; + }; + + union helper + { + double input; + uint32_pair output; + } Helper; + + Helper.input = v; + + return detail::tvec2<uint>(Helper.output.x, Helper.output.y); + } + + GLM_FUNC_QUALIFIER uint packHalf2x16(detail::tvec2<float> const & v) + { + union helper + { + uint other; + struct + { + detail::hdata a, b; + } orig; + } Pack; + + Pack.orig.a = detail::toFloat16(v.x); + Pack.orig.b = detail::toFloat16(v.y); + return Pack.other; + } + + GLM_FUNC_QUALIFIER vec2 unpackHalf2x16(uint const & v) + { + union helper + { + uint other; + struct + { + detail::hdata a, b; + } orig; + } Unpack; + Unpack.other = v; + + return vec2(detail::toFloat32(Unpack.orig.a), detail::toFloat32(Unpack.orig.b)); + } +}//namespace glm + diff --git a/include/gal/opengl/glm/core/func_trigonometric.hpp b/include/gal/opengl/glm/core/func_trigonometric.hpp new file mode 100644 index 0000000..9954d9c --- /dev/null +++ b/include/gal/opengl/glm/core/func_trigonometric.hpp @@ -0,0 +1,203 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/func_trigonometric.hpp +/// @date 2008-08-01 / 2011-06-15 +/// @author Christophe Riccio +/// +/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> +/// +/// @defgroup core_func_trigonometric Angle and Trigonometry Functions +/// @ingroup core +/// +/// Function parameters specified as angle are assumed to be in units of radians. +/// In no case will any of these functions result in a divide by zero error. If +/// the divisor of a ratio is 0, then results will be undefined. +/// +/// These all operate component-wise. The description is per component. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_CORE_func_trigonometric +#define GLM_CORE_func_trigonometric GLM_VERSION + +namespace glm +{ + /// @addtogroup core_func_trigonometric + /// @{ + + /// Converts degrees to radians and returns the result. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/radians.xml">GLSL radians man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> + template <typename genType> + GLM_FUNC_DECL genType radians(genType const & degrees); + + /// Converts radians to degrees and returns the result. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/degrees.xml">GLSL degrees man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> + template <typename genType> + GLM_FUNC_DECL genType degrees(genType const & radians); + + /// The standard trigonometric sine function. + /// The values returned by this function will range from [-1, 1]. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/sin.xml">GLSL sin man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> + template <typename genType> + GLM_FUNC_DECL genType sin(genType const & angle); + + /// The standard trigonometric cosine function. + /// The values returned by this function will range from [-1, 1]. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/cos.xml">GLSL cos man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> + template <typename genType> + GLM_FUNC_DECL genType cos(genType const & angle); + + /// The standard trigonometric tangent function. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/tan.xml">GLSL tan man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> + template <typename genType> + GLM_FUNC_DECL genType tan(genType const & angle); + + /// Arc sine. Returns an angle whose sine is x. + /// The range of values returned by this function is [-PI/2, PI/2]. + /// Results are undefined if |x| > 1. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/asin.xml">GLSL asin man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> + template <typename genType> + GLM_FUNC_DECL genType asin(genType const & x); + + /// Arc cosine. Returns an angle whose sine is x. + /// The range of values returned by this function is [0, PI]. + /// Results are undefined if |x| > 1. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/acos.xml">GLSL acos man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> + template <typename genType> + GLM_FUNC_DECL genType acos(genType const & x); + + /// Arc tangent. Returns an angle whose tangent is y/x. + /// The signs of x and y are used to determine what + /// quadrant the angle is in. The range of values returned + /// by this function is [-PI, PI]. Results are undefined + /// if x and y are both 0. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/atan.xml">GLSL atan man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> + template <typename genType> + GLM_FUNC_DECL genType atan(genType const & y, genType const & x); + + /// Arc tangent. Returns an angle whose tangent is y_over_x. + /// The range of values returned by this function is [-PI/2, PI/2]. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/atan.xml">GLSL atan man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> + template <typename genType> + GLM_FUNC_DECL genType atan(genType const & y_over_x); + + /// Returns the hyperbolic sine function, (exp(x) - exp(-x)) / 2 + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/sinh.xml">GLSL sinh man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> + template <typename genType> + GLM_FUNC_DECL genType sinh(genType const & angle); + + /// Returns the hyperbolic cosine function, (exp(x) + exp(-x)) / 2 + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/cosh.xml">GLSL cosh man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> + template <typename genType> + GLM_FUNC_DECL genType cosh(genType const & angle); + + /// Returns the hyperbolic tangent function, sinh(angle) / cosh(angle) + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/tanh.xml">GLSL tanh man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> + template <typename genType> + GLM_FUNC_DECL genType tanh(genType const & angle); + + /// Arc hyperbolic sine; returns the inverse of sinh. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/asinh.xml">GLSL asinh man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> + template <typename genType> + GLM_FUNC_DECL genType asinh(genType const & x); + + /// Arc hyperbolic cosine; returns the non-negative inverse + /// of cosh. Results are undefined if x < 1. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/acosh.xml">GLSL acosh man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> + template <typename genType> + GLM_FUNC_DECL genType acosh(genType const & x); + + /// Arc hyperbolic tangent; returns the inverse of tanh. + /// Results are undefined if abs(x) >= 1. + /// + /// @tparam genType Floating-point scalar or vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/atanh.xml">GLSL atanh man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.1 Angle and Trigonometry Functions</a> + template <typename genType> + GLM_FUNC_DECL genType atanh(genType const & x); + + /// @} +}//namespace glm + +#include "func_trigonometric.inl" + +#endif//GLM_CORE_func_trigonometric + + diff --git a/include/gal/opengl/glm/core/func_trigonometric.inl b/include/gal/opengl/glm/core/func_trigonometric.inl new file mode 100644 index 0000000..bd59cd7 --- /dev/null +++ b/include/gal/opengl/glm/core/func_trigonometric.inl @@ -0,0 +1,244 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/func_trigonometric.inl +/// @date 2008-08-03 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + // radians + template <typename genType> + GLM_FUNC_QUALIFIER genType radians + ( + genType const & degrees + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'radians' only accept floating-point input"); + + genType const pi = genType(3.1415926535897932384626433832795); + return degrees * (pi / genType(180)); + } + + VECTORIZE_VEC(radians) + + // degrees + template <typename genType> + GLM_FUNC_QUALIFIER genType degrees + ( + genType const & radians + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'degrees' only accept floating-point input"); + + const genType pi = genType(3.1415926535897932384626433832795); + return radians * (genType(180) / pi); + } + + VECTORIZE_VEC(degrees) + + // sin + template <typename genType> + GLM_FUNC_QUALIFIER genType sin + ( + genType const & angle + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'sin' only accept floating-point input"); + + return genType(::std::sin(angle)); + } + + VECTORIZE_VEC(sin) + + // cos + template <typename genType> + GLM_FUNC_QUALIFIER genType cos(genType const & angle) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'cos' only accept floating-point input"); + + return genType(::std::cos(angle)); + } + + VECTORIZE_VEC(cos) + + // tan + template <typename genType> + GLM_FUNC_QUALIFIER genType tan + ( + genType const & angle + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'tan' only accept floating-point input"); + + return genType(::std::tan(angle)); + } + + VECTORIZE_VEC(tan) + + // asin + template <typename genType> + GLM_FUNC_QUALIFIER genType asin + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'asin' only accept floating-point input"); + + return genType(::std::asin(x)); + } + + VECTORIZE_VEC(asin) + + // acos + template <typename genType> + GLM_FUNC_QUALIFIER genType acos + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'acos' only accept floating-point input"); + + return genType(::std::acos(x)); + } + + VECTORIZE_VEC(acos) + + // atan + template <typename genType> + GLM_FUNC_QUALIFIER genType atan + ( + genType const & y, + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'atan' only accept floating-point input"); + + return genType(::std::atan2(y, x)); + } + + VECTORIZE_VEC_VEC(atan) + + template <typename genType> + GLM_FUNC_QUALIFIER genType atan + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'atan' only accept floating-point input"); + + return genType(::std::atan(x)); + } + + VECTORIZE_VEC(atan) + + // sinh + template <typename genType> + GLM_FUNC_QUALIFIER genType sinh + ( + genType const & angle + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'sinh' only accept floating-point input"); + + return genType(std::sinh(angle)); + } + + VECTORIZE_VEC(sinh) + + // cosh + template <typename genType> + GLM_FUNC_QUALIFIER genType cosh + ( + genType const & angle + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'cosh' only accept floating-point input"); + + return genType(std::cosh(angle)); + } + + VECTORIZE_VEC(cosh) + + // tanh + template <typename genType> + GLM_FUNC_QUALIFIER genType tanh + ( + genType const & angle + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'tanh' only accept floating-point input"); + + return genType(std::tanh(angle)); + } + + VECTORIZE_VEC(tanh) + + // asinh + template <typename genType> + GLM_FUNC_QUALIFIER genType asinh + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'asinh' only accept floating-point input"); + + return (x < genType(0) ? genType(-1) : (x > genType(0) ? genType(1) : genType(0))) * log(abs(x) + sqrt(genType(1) + x * x)); + } + + VECTORIZE_VEC(asinh) + + // acosh + template <typename genType> + GLM_FUNC_QUALIFIER genType acosh + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'acosh' only accept floating-point input"); + + if(x < genType(1)) + return genType(0); + return log(x + sqrt(x * x - genType(1))); + } + + VECTORIZE_VEC(acosh) + + // atanh + template <typename genType> + GLM_FUNC_QUALIFIER genType atanh + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'atanh' only accept floating-point input"); + + if(abs(x) >= genType(1)) + return 0; + return genType(0.5) * log((genType(1) + x) / (genType(1) - x)); + } + + VECTORIZE_VEC(atanh) + +}//namespace glm diff --git a/include/gal/opengl/glm/core/func_vector_relational.hpp b/include/gal/opengl/glm/core/func_vector_relational.hpp new file mode 100644 index 0000000..4ffe14e --- /dev/null +++ b/include/gal/opengl/glm/core/func_vector_relational.hpp @@ -0,0 +1,138 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/func_vector_relational.hpp +/// @date 2008-08-03 / 2011-06-15 +/// @author Christophe Riccio +/// +/// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7 Vector Relational Functions</a> +/// +/// @defgroup core_func_vector_relational Vector Relational Functions +/// @ingroup core +/// +/// Relational and equality operators (<, <=, >, >=, ==, !=) are defined to +/// operate on scalars and produce scalar Boolean results. For vector results, +/// use the following built-in functions. +/// +/// In all cases, the sizes of all the input and return vectors for any particular +/// call must match. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_CORE_func_vector_relational +#define GLM_CORE_func_vector_relational GLM_VERSION + +#include "_detail.hpp" + +namespace glm +{ + /// @addtogroup core_func_vector_relational + /// @{ + + /// Returns the component-wise comparison result of x < y. + /// + /// @tparam vecType Floating-point or integer vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/lessThan.xml">GLSL lessThan man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7 Vector Relational Functions</a> + template <typename vecType> + GLM_FUNC_DECL typename vecType::bool_type lessThan(vecType const & x, vecType const & y); + + /// Returns the component-wise comparison of result x <= y. + /// + /// @tparam vecType Floating-point or integer vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/lessThanEqual.xml">GLSL lessThanEqual man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7 Vector Relational Functions</a> + template <typename vecType> + GLM_FUNC_DECL typename vecType::bool_type lessThanEqual(vecType const & x, vecType const & y); + + /// Returns the component-wise comparison of result x > y. + /// + /// @tparam vecType Floating-point or integer vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/greaterThan.xml">GLSL greaterThan man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7 Vector Relational Functions</a> + template <typename vecType> + GLM_FUNC_DECL typename vecType::bool_type greaterThan(vecType const & x, vecType const & y); + + /// Returns the component-wise comparison of result x >= y. + /// + /// @tparam vecType Floating-point or integer vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/greaterThanEqual.xml">GLSL greaterThanEqual man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7 Vector Relational Functions</a> + template <typename vecType> + GLM_FUNC_DECL typename vecType::bool_type greaterThanEqual(vecType const & x, vecType const & y); + + /// Returns the component-wise comparison of result x == y. + /// + /// @tparam vecType Floating-point, integer or boolean vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/equal.xml">GLSL equal man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7 Vector Relational Functions</a> + template <typename vecType> + GLM_FUNC_DECL typename vecType::bool_type equal(vecType const & x, vecType const & y); + + /// Returns the component-wise comparison of result x != y. + /// + /// @tparam vecType Floating-point, integer or boolean vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/notEqual.xml">GLSL notEqual man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7 Vector Relational Functions</a> + template <typename vecType> + GLM_FUNC_DECL typename vecType::bool_type notEqual(vecType const & x, vecType const & y); + + /// Returns true if any component of x is true. + /// + /// @tparam vecType Boolean vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/any.xml">GLSL any man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7 Vector Relational Functions</a> + template <template <typename> class vecType> + GLM_FUNC_DECL bool any(vecType<bool> const & v); + + /// Returns true if all components of x are true. + /// + /// @tparam vecType Boolean vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/all.xml">GLSL all man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7 Vector Relational Functions</a> + template <template <typename> class vecType> + GLM_FUNC_DECL bool all(vecType<bool> const & v); + + /// Returns the component-wise logical complement of x. + /// /!\ Because of language incompatibilities between C++ and GLSL, GLM defines the function not but not_ instead. + /// + /// @tparam vecType Boolean vector types. + /// + /// @see <a href="http://www.opengl.org/sdk/docs/manglsl/xhtml/not.xml">GLSL not man page</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 8.7 Vector Relational Functions</a> + template <template <typename> class vecType> + GLM_FUNC_DECL vecType<bool> not_(vecType<bool> const & v); + + /// @} +}//namespace glm + +#include "func_vector_relational.inl" + +#endif//GLM_CORE_func_vector_relational diff --git a/include/gal/opengl/glm/core/func_vector_relational.inl b/include/gal/opengl/glm/core/func_vector_relational.inl new file mode 100644 index 0000000..7fb4f43 --- /dev/null +++ b/include/gal/opengl/glm/core/func_vector_relational.inl @@ -0,0 +1,178 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/func_vector_relational.inl +/// @date 2008-08-03 / 2011-09-09 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template <typename T, template <typename> class vecType> + GLM_FUNC_QUALIFIER typename vecType<T>::bool_type lessThan + ( + vecType<T> const & x, + vecType<T> const & y + ) + { + GLM_STATIC_ASSERT(detail::is_vector<vecType<T> >::_YES, + "Invalid template instantiation of 'lessThan', GLM vector types required"); + GLM_STATIC_ASSERT(detail::is_bool<T>::_NO, + "Invalid template instantiation of 'lessThan', GLM vector types required floating-point or integer value types vectors"); + assert(x.length() == y.length()); + + typename vecType<bool>::bool_type Result(vecType<bool>::null); + for(typename vecType<bool>::size_type i = 0; i < x.length(); ++i) + Result[i] = x[i] < y[i]; + + return Result; + } + + template <typename T, template <typename> class vecType> + GLM_FUNC_QUALIFIER typename vecType<T>::bool_type lessThanEqual + ( + vecType<T> const & x, + vecType<T> const & y + ) + { + GLM_STATIC_ASSERT(detail::is_vector<vecType<T> >::_YES, + "Invalid template instantiation of 'lessThanEqual', GLM vector types required"); + GLM_STATIC_ASSERT(detail::is_bool<T>::_NO, + "Invalid template instantiation of 'lessThanEqual', GLM vector types required floating-point or integer value types vectors"); + assert(x.length() == y.length()); + + typename vecType<bool>::bool_type Result(vecType<bool>::null); + for(typename vecType<bool>::size_type i = 0; i < x.length(); ++i) + Result[i] = x[i] <= y[i]; + return Result; + } + + template <typename T, template <typename> class vecType> + GLM_FUNC_QUALIFIER typename vecType<T>::bool_type greaterThan + ( + vecType<T> const & x, + vecType<T> const & y + ) + { + GLM_STATIC_ASSERT(detail::is_vector<vecType<T> >::_YES, + "Invalid template instantiation of 'greaterThan', GLM vector types required"); + GLM_STATIC_ASSERT(detail::is_bool<T>::_NO, + "Invalid template instantiation of 'greaterThan', GLM vector types required floating-point or integer value types vectors"); + assert(x.length() == y.length()); + + typename vecType<bool>::bool_type Result(vecType<bool>::null); + for(typename vecType<bool>::size_type i = 0; i < x.length(); ++i) + Result[i] = x[i] > y[i]; + return Result; + } + + template <typename T, template <typename> class vecType> + GLM_FUNC_QUALIFIER typename vecType<T>::bool_type greaterThanEqual + ( + vecType<T> const & x, + vecType<T> const & y + ) + { + GLM_STATIC_ASSERT(detail::is_vector<vecType<T> >::_YES, + "Invalid template instantiation of 'greaterThanEqual', GLM vector types required"); + GLM_STATIC_ASSERT(detail::is_bool<T>::_NO, + "Invalid template instantiation of 'greaterThanEqual', GLM vector types required floating-point or integer value types vectors"); + assert(x.length() == y.length()); + + typename vecType<bool>::bool_type Result(vecType<bool>::null); + for(typename vecType<bool>::size_type i = 0; i < x.length(); ++i) + Result[i] = x[i] >= y[i]; + return Result; + } + + template <typename T, template <typename> class vecType> + GLM_FUNC_QUALIFIER typename vecType<T>::bool_type equal + ( + vecType<T> const & x, + vecType<T> const & y + ) + { + GLM_STATIC_ASSERT(detail::is_vector<vecType<T> >::_YES, + "Invalid template instantiation of 'equal', GLM vector types required"); + assert(x.length() == y.length()); + + typename vecType<bool>::bool_type Result(vecType<bool>::null); + for(typename vecType<bool>::size_type i = 0; i < x.length(); ++i) + Result[i] = x[i] == y[i]; + return Result; + } + + template <typename T, template <typename> class vecType> + GLM_FUNC_QUALIFIER typename vecType<T>::bool_type notEqual + ( + vecType<T> const & x, + vecType<T> const & y + ) + { + GLM_STATIC_ASSERT(detail::is_vector<vecType<T> >::_YES, + "Invalid template instantiation of 'notEqual', GLM vector types required"); + assert(x.length() == y.length()); + + typename vecType<bool>::bool_type Result(vecType<bool>::null); + for(typename vecType<bool>::size_type i = 0; i < x.length(); ++i) + Result[i] = x[i] != y[i]; + return Result; + } + + template <template <typename> class vecType> + GLM_FUNC_QUALIFIER bool any(vecType<bool> const & v) + { + GLM_STATIC_ASSERT(detail::is_vector<vecType<bool> >::_YES, + "Invalid template instantiation of 'any', GLM boolean vector types required"); + + bool Result = false; + for(typename vecType<bool>::size_type i = 0; i < v.length(); ++i) + Result = Result || v[i]; + return Result; + } + + template <template <typename> class vecType> + GLM_FUNC_QUALIFIER bool all(vecType<bool> const & v) + { + GLM_STATIC_ASSERT(detail::is_vector<vecType<bool> >::_YES, + "Invalid template instantiation of 'all', GLM boolean vector types required"); + + bool Result = true; + for(typename vecType<bool>::size_type i = 0; i < v.length(); ++i) + Result = Result && v[i]; + return Result; + } + + template <template <typename> class vecType> + GLM_FUNC_QUALIFIER vecType<bool> not_(vecType<bool> const & v) + { + GLM_STATIC_ASSERT(detail::is_vector<vecType<bool> >::_YES, + "Invalid template instantiation of 'not_', GLM vector types required"); + + typename vecType<bool>::bool_type Result(vecType<bool>::null); + for(typename vecType<bool>::size_type i = 0; i < v.length(); ++i) + Result[i] = !v[i]; + return Result; + } +}//namespace glm + diff --git a/include/gal/opengl/glm/core/hint.hpp b/include/gal/opengl/glm/core/hint.hpp new file mode 100644 index 0000000..79433a1 --- /dev/null +++ b/include/gal/opengl/glm/core/hint.hpp @@ -0,0 +1,40 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/hint.hpp +/// @date 2008-08-14 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_type +#define glm_core_type + +namespace glm +{ + // Use dont_care, nicest and fastest to optimize implementations. + class dont_care {}; + class nicest {}; + class fastest {}; +}//namespace glm + +#endif//glm_core_type diff --git a/include/gal/opengl/glm/core/intrinsic_common.hpp b/include/gal/opengl/glm/core/intrinsic_common.hpp new file mode 100644 index 0000000..a435522 --- /dev/null +++ b/include/gal/opengl/glm/core/intrinsic_common.hpp @@ -0,0 +1,89 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/intrinsic_common.hpp +/// @date 2009-05-11 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_detail_intrinsic_common +#define glm_detail_intrinsic_common + +#include "setup.hpp" + +#if(!(GLM_ARCH & GLM_ARCH_SSE2)) +# error "SSE2 instructions not supported or enabled" +#else + +namespace glm{ +namespace detail +{ + __m128 sse_abs_ps(__m128 x); + + __m128 sse_sgn_ps(__m128 x); + + //floor + __m128 sse_flr_ps(__m128 v); + + //trunc + __m128 sse_trc_ps(__m128 v); + + //round + __m128 sse_nd_ps(__m128 v); + + //roundEven + __m128 sse_rde_ps(__m128 v); + + __m128 sse_rnd_ps(__m128 x); + + __m128 sse_ceil_ps(__m128 v); + + __m128 sse_frc_ps(__m128 x); + + __m128 sse_mod_ps(__m128 x, __m128 y); + + __m128 sse_modf_ps(__m128 x, __m128i & i); + + //GLM_FUNC_QUALIFIER __m128 sse_min_ps(__m128 x, __m128 y) + + //GLM_FUNC_QUALIFIER __m128 sse_max_ps(__m128 x, __m128 y) + + __m128 sse_clp_ps(__m128 v, __m128 minVal, __m128 maxVal); + + __m128 sse_mix_ps(__m128 v1, __m128 v2, __m128 a); + + __m128 sse_stp_ps(__m128 edge, __m128 x); + + __m128 sse_ssp_ps(__m128 edge0, __m128 edge1, __m128 x); + + __m128 sse_nan_ps(__m128 x); + + __m128 sse_inf_ps(__m128 x); + +}//namespace detail +}//namespace glm + +#include "intrinsic_common.inl" + +#endif//GLM_ARCH +#endif//glm_detail_intrinsic_common diff --git a/include/gal/opengl/glm/core/intrinsic_common.inl b/include/gal/opengl/glm/core/intrinsic_common.inl new file mode 100644 index 0000000..ba7ac94 --- /dev/null +++ b/include/gal/opengl/glm/core/intrinsic_common.inl @@ -0,0 +1,313 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/intrinsic_common.inl +/// @date 2009-05-08 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +namespace glm{ +namespace detail{ + +#if(GLM_COMPILER & GLM_COMPILER_VC) +#pragma warning(push) +#pragma warning(disable : 4510 4512 4610) +#endif + + union ieee754_QNAN + { + const float f; + struct i + { + const unsigned int mantissa:23, exp:8, sign:1; + }; + + ieee754_QNAN() : f(0.0)/*, mantissa(0x7FFFFF), exp(0xFF), sign(0x0)*/ {} + }; + +#if(GLM_COMPILER & GLM_COMPILER_VC) +#pragma warning(pop) +#endif + + static const __m128 GLM_VAR_USED zero = _mm_setzero_ps(); + static const __m128 GLM_VAR_USED one = _mm_set_ps1(1.0f); + static const __m128 GLM_VAR_USED minus_one = _mm_set_ps1(-1.0f); + static const __m128 GLM_VAR_USED two = _mm_set_ps1(2.0f); + static const __m128 GLM_VAR_USED three = _mm_set_ps1(3.0f); + static const __m128 GLM_VAR_USED pi = _mm_set_ps1(3.1415926535897932384626433832795f); + static const __m128 GLM_VAR_USED hundred_eighty = _mm_set_ps1(180.f); + static const __m128 GLM_VAR_USED pi_over_hundred_eighty = _mm_set_ps1(0.017453292519943295769236907684886f); + static const __m128 GLM_VAR_USED hundred_eighty_over_pi = _mm_set_ps1(57.295779513082320876798154814105f); + + static const ieee754_QNAN absMask; + static const __m128 GLM_VAR_USED abs4Mask = _mm_set_ps1(absMask.f); + + static const __m128 GLM_VAR_USED _epi32_sign_mask = _mm_castsi128_ps(_mm_set1_epi32(static_cast<int>(0x80000000))); + //static const __m128 GLM_VAR_USED _epi32_inv_sign_mask = _mm_castsi128_ps(_mm_set1_epi32(0x7FFFFFFF)); + //static const __m128 GLM_VAR_USED _epi32_mant_mask = _mm_castsi128_ps(_mm_set1_epi32(0x7F800000)); + //static const __m128 GLM_VAR_USED _epi32_inv_mant_mask = _mm_castsi128_ps(_mm_set1_epi32(0x807FFFFF)); + //static const __m128 GLM_VAR_USED _epi32_min_norm_pos = _mm_castsi128_ps(_mm_set1_epi32(0x00800000)); + static const __m128 GLM_VAR_USED _epi32_0 = _mm_set_ps1(0); + static const __m128 GLM_VAR_USED _epi32_1 = _mm_set_ps1(1); + static const __m128 GLM_VAR_USED _epi32_2 = _mm_set_ps1(2); + static const __m128 GLM_VAR_USED _epi32_3 = _mm_set_ps1(3); + static const __m128 GLM_VAR_USED _epi32_4 = _mm_set_ps1(4); + static const __m128 GLM_VAR_USED _epi32_5 = _mm_set_ps1(5); + static const __m128 GLM_VAR_USED _epi32_6 = _mm_set_ps1(6); + static const __m128 GLM_VAR_USED _epi32_7 = _mm_set_ps1(7); + static const __m128 GLM_VAR_USED _epi32_8 = _mm_set_ps1(8); + static const __m128 GLM_VAR_USED _epi32_9 = _mm_set_ps1(9); + static const __m128 GLM_VAR_USED _epi32_127 = _mm_set_ps1(127); + //static const __m128 GLM_VAR_USED _epi32_ninf = _mm_castsi128_ps(_mm_set1_epi32(0xFF800000)); + //static const __m128 GLM_VAR_USED _epi32_pinf = _mm_castsi128_ps(_mm_set1_epi32(0x7F800000)); + + static const __m128 GLM_VAR_USED _ps_1_3 = _mm_set_ps1(0.33333333333333333333333333333333f); + static const __m128 GLM_VAR_USED _ps_0p5 = _mm_set_ps1(0.5f); + static const __m128 GLM_VAR_USED _ps_1 = _mm_set_ps1(1.0f); + static const __m128 GLM_VAR_USED _ps_m1 = _mm_set_ps1(-1.0f); + static const __m128 GLM_VAR_USED _ps_2 = _mm_set_ps1(2.0f); + static const __m128 GLM_VAR_USED _ps_3 = _mm_set_ps1(3.0f); + static const __m128 GLM_VAR_USED _ps_127 = _mm_set_ps1(127.0f); + static const __m128 GLM_VAR_USED _ps_255 = _mm_set_ps1(255.0f); + static const __m128 GLM_VAR_USED _ps_2pow23 = _mm_set_ps1(8388608.0f); + + static const __m128 GLM_VAR_USED _ps_1_0_0_0 = _mm_set_ps(1.0f, 0.0f, 0.0f, 0.0f); + static const __m128 GLM_VAR_USED _ps_0_1_0_0 = _mm_set_ps(0.0f, 1.0f, 0.0f, 0.0f); + static const __m128 GLM_VAR_USED _ps_0_0_1_0 = _mm_set_ps(0.0f, 0.0f, 1.0f, 0.0f); + static const __m128 GLM_VAR_USED _ps_0_0_0_1 = _mm_set_ps(0.0f, 0.0f, 0.0f, 1.0f); + + static const __m128 GLM_VAR_USED _ps_pi = _mm_set_ps1(3.1415926535897932384626433832795f); + static const __m128 GLM_VAR_USED _ps_pi2 = _mm_set_ps1(6.283185307179586476925286766560f); + static const __m128 GLM_VAR_USED _ps_2_pi = _mm_set_ps1(0.63661977236758134307553505349006f); + static const __m128 GLM_VAR_USED _ps_pi_2 = _mm_set_ps1(1.5707963267948966192313216916398f); + static const __m128 GLM_VAR_USED _ps_4_pi = _mm_set_ps1(1.2732395447351626861510701069801f); + static const __m128 GLM_VAR_USED _ps_pi_4 = _mm_set_ps1(0.78539816339744830961566084581988f); + + static const __m128 GLM_VAR_USED _ps_sincos_p0 = _mm_set_ps1(0.15707963267948963959e1f); + static const __m128 GLM_VAR_USED _ps_sincos_p1 = _mm_set_ps1(-0.64596409750621907082e0f); + static const __m128 GLM_VAR_USED _ps_sincos_p2 = _mm_set_ps1(0.7969262624561800806e-1f); + static const __m128 GLM_VAR_USED _ps_sincos_p3 = _mm_set_ps1(-0.468175413106023168e-2f); + static const __m128 GLM_VAR_USED _ps_tan_p0 = _mm_set_ps1(-1.79565251976484877988e7f); + static const __m128 GLM_VAR_USED _ps_tan_p1 = _mm_set_ps1(1.15351664838587416140e6f); + static const __m128 GLM_VAR_USED _ps_tan_p2 = _mm_set_ps1(-1.30936939181383777646e4f); + static const __m128 GLM_VAR_USED _ps_tan_q0 = _mm_set_ps1(-5.38695755929454629881e7f); + static const __m128 GLM_VAR_USED _ps_tan_q1 = _mm_set_ps1(2.50083801823357915839e7f); + static const __m128 GLM_VAR_USED _ps_tan_q2 = _mm_set_ps1(-1.32089234440210967447e6f); + static const __m128 GLM_VAR_USED _ps_tan_q3 = _mm_set_ps1(1.36812963470692954678e4f); + static const __m128 GLM_VAR_USED _ps_tan_poleval = _mm_set_ps1(3.68935e19f); + static const __m128 GLM_VAR_USED _ps_atan_t0 = _mm_set_ps1(-0.91646118527267623468e-1f); + static const __m128 GLM_VAR_USED _ps_atan_t1 = _mm_set_ps1(-0.13956945682312098640e1f); + static const __m128 GLM_VAR_USED _ps_atan_t2 = _mm_set_ps1(-0.94393926122725531747e2f); + static const __m128 GLM_VAR_USED _ps_atan_t3 = _mm_set_ps1(0.12888383034157279340e2f); + static const __m128 GLM_VAR_USED _ps_atan_s0 = _mm_set_ps1(0.12797564625607904396e1f); + static const __m128 GLM_VAR_USED _ps_atan_s1 = _mm_set_ps1(0.21972168858277355914e1f); + static const __m128 GLM_VAR_USED _ps_atan_s2 = _mm_set_ps1(0.68193064729268275701e1f); + static const __m128 GLM_VAR_USED _ps_atan_s3 = _mm_set_ps1(0.28205206687035841409e2f); + + static const __m128 GLM_VAR_USED _ps_exp_hi = _mm_set_ps1(88.3762626647949f); + static const __m128 GLM_VAR_USED _ps_exp_lo = _mm_set_ps1(-88.3762626647949f); + static const __m128 GLM_VAR_USED _ps_exp_rln2 = _mm_set_ps1(1.4426950408889634073599f); + static const __m128 GLM_VAR_USED _ps_exp_p0 = _mm_set_ps1(1.26177193074810590878e-4f); + static const __m128 GLM_VAR_USED _ps_exp_p1 = _mm_set_ps1(3.02994407707441961300e-2f); + static const __m128 GLM_VAR_USED _ps_exp_q0 = _mm_set_ps1(3.00198505138664455042e-6f); + static const __m128 GLM_VAR_USED _ps_exp_q1 = _mm_set_ps1(2.52448340349684104192e-3f); + static const __m128 GLM_VAR_USED _ps_exp_q2 = _mm_set_ps1(2.27265548208155028766e-1f); + static const __m128 GLM_VAR_USED _ps_exp_q3 = _mm_set_ps1(2.00000000000000000009e0f); + static const __m128 GLM_VAR_USED _ps_exp_c1 = _mm_set_ps1(6.93145751953125e-1f); + static const __m128 GLM_VAR_USED _ps_exp_c2 = _mm_set_ps1(1.42860682030941723212e-6f); + static const __m128 GLM_VAR_USED _ps_exp2_hi = _mm_set_ps1(127.4999961853f); + static const __m128 GLM_VAR_USED _ps_exp2_lo = _mm_set_ps1(-127.4999961853f); + static const __m128 GLM_VAR_USED _ps_exp2_p0 = _mm_set_ps1(2.30933477057345225087e-2f); + static const __m128 GLM_VAR_USED _ps_exp2_p1 = _mm_set_ps1(2.02020656693165307700e1f); + static const __m128 GLM_VAR_USED _ps_exp2_p2 = _mm_set_ps1(1.51390680115615096133e3f); + static const __m128 GLM_VAR_USED _ps_exp2_q0 = _mm_set_ps1(2.33184211722314911771e2f); + static const __m128 GLM_VAR_USED _ps_exp2_q1 = _mm_set_ps1(4.36821166879210612817e3f); + static const __m128 GLM_VAR_USED _ps_log_p0 = _mm_set_ps1(-7.89580278884799154124e-1f); + static const __m128 GLM_VAR_USED _ps_log_p1 = _mm_set_ps1(1.63866645699558079767e1f); + static const __m128 GLM_VAR_USED _ps_log_p2 = _mm_set_ps1(-6.41409952958715622951e1f); + static const __m128 GLM_VAR_USED _ps_log_q0 = _mm_set_ps1(-3.56722798256324312549e1f); + static const __m128 GLM_VAR_USED _ps_log_q1 = _mm_set_ps1(3.12093766372244180303e2f); + static const __m128 GLM_VAR_USED _ps_log_q2 = _mm_set_ps1(-7.69691943550460008604e2f); + static const __m128 GLM_VAR_USED _ps_log_c0 = _mm_set_ps1(0.693147180559945f); + static const __m128 GLM_VAR_USED _ps_log2_c0 = _mm_set_ps1(1.44269504088896340735992f); + +GLM_FUNC_QUALIFIER __m128 sse_abs_ps(__m128 x) +{ + return _mm_and_ps(glm::detail::abs4Mask, x); +} + +GLM_FUNC_QUALIFIER __m128 sse_sgn_ps(__m128 x) +{ + __m128 Neg = _mm_set1_ps(-1.0f); + __m128 Pos = _mm_set1_ps(1.0f); + + __m128 Cmp0 = _mm_cmplt_ps(x, zero); + __m128 Cmp1 = _mm_cmpgt_ps(x, zero); + + __m128 And0 = _mm_and_ps(Cmp0, Neg); + __m128 And1 = _mm_and_ps(Cmp1, Pos); + + return _mm_or_ps(And0, And1); +} + +//floor +GLM_FUNC_QUALIFIER __m128 sse_flr_ps(__m128 x) +{ + __m128 rnd0 = sse_rnd_ps(x); + __m128 cmp0 = _mm_cmplt_ps(x, rnd0); + __m128 and0 = _mm_and_ps(cmp0, glm::detail::_ps_1); + __m128 sub0 = _mm_sub_ps(rnd0, and0); + return sub0; +} + +//trunc +/* +GLM_FUNC_QUALIFIER __m128 _mm_trc_ps(__m128 v) +{ + return __m128(); +} +*/ +//round +GLM_FUNC_QUALIFIER __m128 sse_rnd_ps(__m128 x) +{ + __m128 and0 = _mm_and_ps(glm::detail::_epi32_sign_mask, x); + __m128 or0 = _mm_or_ps(and0, glm::detail::_ps_2pow23); + __m128 add0 = _mm_add_ps(x, or0); + __m128 sub0 = _mm_sub_ps(add0, or0); + return sub0; +} + +//roundEven +GLM_FUNC_QUALIFIER __m128 sse_rde_ps(__m128 x) +{ + __m128 and0 = _mm_and_ps(glm::detail::_epi32_sign_mask, x); + __m128 or0 = _mm_or_ps(and0, glm::detail::_ps_2pow23); + __m128 add0 = _mm_add_ps(x, or0); + __m128 sub0 = _mm_sub_ps(add0, or0); + return sub0; +} + +GLM_FUNC_QUALIFIER __m128 sse_ceil_ps(__m128 x) +{ + __m128 rnd0 = sse_rnd_ps(x); + __m128 cmp0 = _mm_cmpgt_ps(x, rnd0); + __m128 and0 = _mm_and_ps(cmp0, glm::detail::_ps_1); + __m128 add0 = _mm_add_ps(rnd0, and0); + return add0; +} + +GLM_FUNC_QUALIFIER __m128 sse_frc_ps(__m128 x) +{ + __m128 flr0 = sse_flr_ps(x); + __m128 sub0 = _mm_sub_ps(x, flr0); + return sub0; +} + +GLM_FUNC_QUALIFIER __m128 sse_mod_ps(__m128 x, __m128 y) +{ + __m128 div0 = _mm_div_ps(x, y); + __m128 flr0 = sse_flr_ps(div0); + __m128 mul0 = _mm_mul_ps(y, flr0); + __m128 sub0 = _mm_sub_ps(x, mul0); + return sub0; +} + +/// TODO +/* +GLM_FUNC_QUALIFIER __m128 sse_modf_ps(__m128 x, __m128i & i) +{ + __m128 empty; + return empty; +} +*/ + +//GLM_FUNC_QUALIFIER __m128 _mm_min_ps(__m128 x, __m128 y) + +//GLM_FUNC_QUALIFIER __m128 _mm_max_ps(__m128 x, __m128 y) + +GLM_FUNC_QUALIFIER __m128 sse_clp_ps(__m128 v, __m128 minVal, __m128 maxVal) +{ + __m128 min0 = _mm_min_ps(v, maxVal); + __m128 max0 = _mm_max_ps(min0, minVal); + return max0; +} + +GLM_FUNC_QUALIFIER __m128 sse_mix_ps(__m128 v1, __m128 v2, __m128 a) +{ + __m128 sub0 = _mm_sub_ps(glm::detail::one, a); + __m128 mul0 = _mm_mul_ps(v1, sub0); + __m128 mul1 = _mm_mul_ps(v2, a); + __m128 add0 = _mm_add_ps(mul0, mul1); + return add0; +} + +GLM_FUNC_QUALIFIER __m128 sse_stp_ps(__m128 edge, __m128 x) +{ + __m128 cmp = _mm_cmple_ps(x, edge); + if(_mm_movemask_ps(cmp) == 0) + return glm::detail::one; + else + return glm::detail::zero; +} + +GLM_FUNC_QUALIFIER __m128 sse_ssp_ps(__m128 edge0, __m128 edge1, __m128 x) +{ + __m128 sub0 = _mm_sub_ps(x, edge0); + __m128 sub1 = _mm_sub_ps(edge1, edge0); + __m128 div0 = _mm_sub_ps(sub0, sub1); + __m128 clp0 = sse_clp_ps(div0, glm::detail::zero, glm::detail::one); + __m128 mul0 = _mm_mul_ps(glm::detail::two, clp0); + __m128 sub2 = _mm_sub_ps(glm::detail::three, mul0); + __m128 mul1 = _mm_mul_ps(clp0, clp0); + __m128 mul2 = _mm_mul_ps(mul1, sub2); + return mul2; +} + +/// \todo +//GLM_FUNC_QUALIFIER __m128 sse_nan_ps(__m128 x) +//{ +// __m128 empty; +// return empty; +//} + +/// \todo +//GLM_FUNC_QUALIFIER __m128 sse_inf_ps(__m128 x) +//{ +// __m128 empty; +// return empty; +//} + +// SSE scalar reciprocal sqrt using rsqrt op, plus one Newton-Rhaphson iteration +// By Elan Ruskin, http://assemblyrequired.crashworks.org/ +GLM_FUNC_QUALIFIER __m128 sse_sqrt_wip_ss(__m128 const & x) +{ + __m128 recip = _mm_rsqrt_ss(x); // "estimate" opcode + const static __m128 three = {3, 3, 3, 3}; // aligned consts for fast load + const static __m128 half = {0.5,0.5,0.5,0.5}; + __m128 halfrecip = _mm_mul_ss(half, recip); + __m128 threeminus_xrr = _mm_sub_ss(three, _mm_mul_ss(x, _mm_mul_ss (recip, recip))); + return _mm_mul_ss( halfrecip, threeminus_xrr); +} + +}//namespace detail +}//namespace glms diff --git a/include/gal/opengl/glm/core/intrinsic_exponential.hpp b/include/gal/opengl/glm/core/intrinsic_exponential.hpp new file mode 100644 index 0000000..785527a --- /dev/null +++ b/include/gal/opengl/glm/core/intrinsic_exponential.hpp @@ -0,0 +1,79 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/intrinsic_exponential.hpp +/// @date 2009-05-11 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_detail_intrinsic_exponential +#define glm_detail_intrinsic_exponential + +#include "setup.hpp" + +#if(!(GLM_ARCH & GLM_ARCH_SSE2)) +# error "SSE2 instructions not supported or enabled" +#else + +namespace glm{ +namespace detail +{ +/* +GLM_FUNC_QUALIFIER __m128 sse_rsqrt_nr_ss(__m128 const x) +{ + __m128 recip = _mm_rsqrt_ss( x ); // "estimate" opcode + const static __m128 three = { 3, 3, 3, 3 }; // aligned consts for fast load + const static __m128 half = { 0.5,0.5,0.5,0.5 }; + __m128 halfrecip = _mm_mul_ss( half, recip ); + __m128 threeminus_xrr = _mm_sub_ss( three, _mm_mul_ss( x, _mm_mul_ss ( recip, recip ) ) ); + return _mm_mul_ss( halfrecip, threeminus_xrr ); +} + +GLM_FUNC_QUALIFIER __m128 sse_normalize_fast_ps( float * RESTRICT vOut, float * RESTRICT vIn ) +{ + __m128 x = _mm_load_ss(&vIn[0]); + __m128 y = _mm_load_ss(&vIn[1]); + __m128 z = _mm_load_ss(&vIn[2]); + + const __m128 l = // compute x*x + y*y + z*z + _mm_add_ss( + _mm_add_ss( _mm_mul_ss(x,x), + _mm_mul_ss(y,y) + ), + _mm_mul_ss( z, z ) + ); + + + const __m128 rsqt = _mm_rsqrt_nr_ss( l ); + _mm_store_ss( &vOut[0] , _mm_mul_ss( rsqt, x ) ); + _mm_store_ss( &vOut[1] , _mm_mul_ss( rsqt, y ) ); + _mm_store_ss( &vOut[2] , _mm_mul_ss( rsqt, z ) ); + + return _mm_mul_ss( l , rsqt ); +} +*/ +}//namespace detail +}//namespace glm + +#endif//GLM_ARCH +#endif//glm_detail_intrinsic_exponential diff --git a/include/gal/opengl/glm/core/intrinsic_exponential.inl b/include/gal/opengl/glm/core/intrinsic_exponential.inl new file mode 100644 index 0000000..8023e0b --- /dev/null +++ b/include/gal/opengl/glm/core/intrinsic_exponential.inl @@ -0,0 +1,27 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/intrinsic_exponential.inl +/// @date 2011-06-15 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// diff --git a/include/gal/opengl/glm/core/intrinsic_geometric.hpp b/include/gal/opengl/glm/core/intrinsic_geometric.hpp new file mode 100644 index 0000000..ff60c48 --- /dev/null +++ b/include/gal/opengl/glm/core/intrinsic_geometric.hpp @@ -0,0 +1,76 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/intrinsic_geometric.hpp +/// @date 2009-05-08 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_intrinsic_geometric +#define glm_core_intrinsic_geometric + +#include "setup.hpp" + +#if(!(GLM_ARCH & GLM_ARCH_SSE2)) +# error "SSE2 instructions not supported or enabled" +#else + +#include "intrinsic_common.hpp" + +namespace glm{ +namespace detail +{ + //length + __m128 sse_len_ps(__m128 x); + + //distance + __m128 sse_dst_ps(__m128 p0, __m128 p1); + + //dot + __m128 sse_dot_ps(__m128 v1, __m128 v2); + + // SSE1 + __m128 sse_dot_ss(__m128 v1, __m128 v2); + + //cross + __m128 sse_xpd_ps(__m128 v1, __m128 v2); + + //normalize + __m128 sse_nrm_ps(__m128 v); + + //faceforward + __m128 sse_ffd_ps(__m128 N, __m128 I, __m128 Nref); + + //reflect + __m128 sse_rfe_ps(__m128 I, __m128 N); + + //refract + __m128 sse_rfa_ps(__m128 I, __m128 N, __m128 eta); + +}//namespace detail +}//namespace glm + +#include "intrinsic_geometric.inl" + +#endif//GLM_ARCH +#endif//glm_core_intrinsic_geometric diff --git a/include/gal/opengl/glm/core/intrinsic_geometric.inl b/include/gal/opengl/glm/core/intrinsic_geometric.inl new file mode 100644 index 0000000..9411e90 --- /dev/null +++ b/include/gal/opengl/glm/core/intrinsic_geometric.inl @@ -0,0 +1,146 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/intrinsic_geometric.inl +/// @date 2009-05-08 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +namespace glm{ +namespace detail{ + +//length +GLM_FUNC_QUALIFIER __m128 sse_len_ps(__m128 x) +{ + __m128 dot0 = sse_dot_ps(x, x); + __m128 sqt0 = _mm_sqrt_ps(dot0); + return sqt0; +} + +//distance +GLM_FUNC_QUALIFIER __m128 sse_dst_ps(__m128 p0, __m128 p1) +{ + __m128 sub0 = _mm_sub_ps(p0, p1); + __m128 len0 = sse_len_ps(sub0); + return len0; +} + +//dot +GLM_FUNC_QUALIFIER __m128 sse_dot_ps(__m128 v1, __m128 v2) +{ +# if((GLM_ARCH & GLM_ARCH_SSE4) == GLM_ARCH_SSE4) + return _mm_dp_ps(v1, v2, 0xff); +# else + __m128 mul0 = _mm_mul_ps(v1, v2); + __m128 swp0 = _mm_shuffle_ps(mul0, mul0, _MM_SHUFFLE(2, 3, 0, 1)); + __m128 add0 = _mm_add_ps(mul0, swp0); + __m128 swp1 = _mm_shuffle_ps(add0, add0, _MM_SHUFFLE(0, 1, 2, 3)); + __m128 add1 = _mm_add_ps(add0, swp1); + return add1; +# endif +} + +// SSE1 +GLM_FUNC_QUALIFIER __m128 sse_dot_ss(__m128 v1, __m128 v2) +{ + __m128 mul0 = _mm_mul_ps(v1, v2); + __m128 mov0 = _mm_movehl_ps(mul0, mul0); + __m128 add0 = _mm_add_ps(mov0, mul0); + __m128 swp1 = _mm_shuffle_ps(add0, add0, 1); + __m128 add1 = _mm_add_ss(add0, swp1); + return add1; +} + +//cross +GLM_FUNC_QUALIFIER __m128 sse_xpd_ps(__m128 v1, __m128 v2) +{ + __m128 swp0 = _mm_shuffle_ps(v1, v1, _MM_SHUFFLE(3, 0, 2, 1)); + __m128 swp1 = _mm_shuffle_ps(v1, v1, _MM_SHUFFLE(3, 1, 0, 2)); + __m128 swp2 = _mm_shuffle_ps(v2, v2, _MM_SHUFFLE(3, 0, 2, 1)); + __m128 swp3 = _mm_shuffle_ps(v2, v2, _MM_SHUFFLE(3, 1, 0, 2)); + __m128 mul0 = _mm_mul_ps(swp0, swp3); + __m128 mul1 = _mm_mul_ps(swp1, swp2); + __m128 sub0 = _mm_sub_ps(mul0, mul1); + return sub0; +} + +//normalize +GLM_FUNC_QUALIFIER __m128 sse_nrm_ps(__m128 v) +{ + __m128 dot0 = sse_dot_ps(v, v); + __m128 isr0 = _mm_rsqrt_ps(dot0); + __m128 mul0 = _mm_mul_ps(v, isr0); + return mul0; +} + +//faceforward +GLM_FUNC_QUALIFIER __m128 sse_ffd_ps(__m128 N, __m128 I, __m128 Nref) +{ + //__m128 dot0 = _mm_dot_ps(v, v); + //__m128 neg0 = _mm_neg_ps(N); + //__m128 sgn0 = _mm_sgn_ps(dot0); + //__m128 mix0 = _mm_mix_ps(N, neg0, sgn0); + //return mix0; + + __m128 dot0 = sse_dot_ps(Nref, I); + __m128 sgn0 = sse_sgn_ps(dot0); + __m128 mul0 = _mm_mul_ps(sgn0, glm::detail::minus_one); + __m128 mul1 = _mm_mul_ps(N, mul0); + return mul1; +} + +//reflect +GLM_FUNC_QUALIFIER __m128 sse_rfe_ps(__m128 I, __m128 N) +{ + __m128 dot0 = sse_dot_ps(N, I); + __m128 mul0 = _mm_mul_ps(N, dot0); + __m128 mul1 = _mm_mul_ps(mul0, glm::detail::two); + __m128 sub0 = _mm_sub_ps(I, mul1); + return sub0; +} + +//refract +GLM_FUNC_QUALIFIER __m128 sse_rfa_ps(__m128 I, __m128 N, __m128 eta) +{ + __m128 dot0 = sse_dot_ps(N, I); + __m128 mul0 = _mm_mul_ps(eta, eta); + __m128 mul1 = _mm_mul_ps(dot0, dot0); + __m128 sub0 = _mm_sub_ps(glm::detail::one, mul0); + __m128 sub1 = _mm_sub_ps(glm::detail::one, mul1); + __m128 mul2 = _mm_mul_ps(sub0, sub1); + + if(_mm_movemask_ps(_mm_cmplt_ss(mul2, glm::detail::zero)) == 0) + return glm::detail::zero; + + __m128 sqt0 = _mm_sqrt_ps(mul2); + __m128 mul3 = _mm_mul_ps(eta, dot0); + __m128 add0 = _mm_add_ps(mul3, sqt0); + __m128 mul4 = _mm_mul_ps(add0, N); + __m128 mul5 = _mm_mul_ps(eta, I); + __m128 sub2 = _mm_sub_ps(mul5, mul4); + + return sub2; +} + +}//namespace detail +}//namespace glm diff --git a/include/gal/opengl/glm/core/intrinsic_matrix.hpp b/include/gal/opengl/glm/core/intrinsic_matrix.hpp new file mode 100644 index 0000000..b2f4767 --- /dev/null +++ b/include/gal/opengl/glm/core/intrinsic_matrix.hpp @@ -0,0 +1,69 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/intrinsic_common.hpp +/// @date 2009-06-05 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_detail_intrinsic_matrix +#define glm_detail_intrinsic_matrix + +#include "setup.hpp" + +#if(!(GLM_ARCH & GLM_ARCH_SSE2)) +# error "SSE2 instructions not supported or enabled" +#else + +#include "intrinsic_geometric.hpp" + +namespace glm{ +namespace detail +{ + void sse_add_ps(__m128 in1[4], __m128 in2[4], __m128 out[4]); + + void sse_sub_ps(__m128 in1[4], __m128 in2[4], __m128 out[4]); + + __m128 sse_mul_ps(__m128 m[4], __m128 v); + + __m128 sse_mul_ps(__m128 v, __m128 m[4]); + + void sse_mul_ps(__m128 const in1[4], __m128 const in2[4], __m128 out[4]); + + void sse_transpose_ps(__m128 const in[4], __m128 out[4]); + + void sse_inverse_ps(__m128 const in[4], __m128 out[4]); + + void sse_rotate_ps(__m128 const in[4], float Angle, float const v[3], __m128 out[4]); + + __m128 sse_det_ps(__m128 const m[4]); + + __m128 sse_slow_det_ps(__m128 const m[4]); + +}//namespace detail +}//namespace glm + +#include "intrinsic_matrix.inl" + +#endif//GLM_ARCH +#endif//glm_detail_intrinsic_matrix diff --git a/include/gal/opengl/glm/core/intrinsic_matrix.inl b/include/gal/opengl/glm/core/intrinsic_matrix.inl new file mode 100644 index 0000000..ec53f03 --- /dev/null +++ b/include/gal/opengl/glm/core/intrinsic_matrix.inl @@ -0,0 +1,1070 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/intrinsic_common.inl +/// @date 2009-06-05 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +namespace glm{ +namespace detail{ + +static const __m128 GLM_VAR_USED _m128_rad_ps = _mm_set_ps1(3.141592653589793238462643383279f / 180.f); +static const __m128 GLM_VAR_USED _m128_deg_ps = _mm_set_ps1(180.f / 3.141592653589793238462643383279f); + +template <typename matType> +GLM_FUNC_QUALIFIER matType sse_comp_mul_ps +( + __m128 const in1[4], + __m128 const in2[4], + __m128 out[4] +) +{ + out[0] = _mm_mul_ps(in1[0], in2[0]); + out[1] = _mm_mul_ps(in1[1], in2[1]); + out[2] = _mm_mul_ps(in1[2], in2[2]); + out[3] = _mm_mul_ps(in1[3], in2[3]); +} + +GLM_FUNC_QUALIFIER void sse_add_ps(__m128 const in1[4], __m128 const in2[4], __m128 out[4]) +{ + { + out[0] = _mm_add_ps(in1[0], in2[0]); + out[1] = _mm_add_ps(in1[1], in2[1]); + out[2] = _mm_add_ps(in1[2], in2[2]); + out[3] = _mm_add_ps(in1[3], in2[3]); + } +} + +GLM_FUNC_QUALIFIER void sse_sub_ps(__m128 const in1[4], __m128 const in2[4], __m128 out[4]) +{ + { + out[0] = _mm_sub_ps(in1[0], in2[0]); + out[1] = _mm_sub_ps(in1[1], in2[1]); + out[2] = _mm_sub_ps(in1[2], in2[2]); + out[3] = _mm_sub_ps(in1[3], in2[3]); + } +} + +GLM_FUNC_QUALIFIER __m128 sse_mul_ps(__m128 const m[4], __m128 v) +{ + __m128 v0 = _mm_shuffle_ps(v, v, _MM_SHUFFLE(0, 0, 0, 0)); + __m128 v1 = _mm_shuffle_ps(v, v, _MM_SHUFFLE(1, 1, 1, 1)); + __m128 v2 = _mm_shuffle_ps(v, v, _MM_SHUFFLE(2, 2, 2, 2)); + __m128 v3 = _mm_shuffle_ps(v, v, _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 m0 = _mm_mul_ps(m[0], v0); + __m128 m1 = _mm_mul_ps(m[1], v1); + __m128 m2 = _mm_mul_ps(m[2], v2); + __m128 m3 = _mm_mul_ps(m[3], v3); + + __m128 a0 = _mm_add_ps(m0, m1); + __m128 a1 = _mm_add_ps(m2, m3); + __m128 a2 = _mm_add_ps(a0, a1); + + return a2; +} + +GLM_FUNC_QUALIFIER __m128 sse_mul_ps(__m128 v, __m128 const m[4]) +{ + __m128 i0 = m[0]; + __m128 i1 = m[1]; + __m128 i2 = m[2]; + __m128 i3 = m[3]; + + __m128 m0 = _mm_mul_ps(v, i0); + __m128 m1 = _mm_mul_ps(v, i1); + __m128 m2 = _mm_mul_ps(v, i2); + __m128 m3 = _mm_mul_ps(v, i3); + + __m128 u0 = _mm_unpacklo_ps(m0, m1); + __m128 u1 = _mm_unpackhi_ps(m0, m1); + __m128 a0 = _mm_add_ps(u0, u1); + + __m128 u2 = _mm_unpacklo_ps(m2, m3); + __m128 u3 = _mm_unpackhi_ps(m2, m3); + __m128 a1 = _mm_add_ps(u2, u3); + + __m128 f0 = _mm_movelh_ps(a0, a1); + __m128 f1 = _mm_movehl_ps(a1, a0); + __m128 f2 = _mm_add_ps(f0, f1); + + return f2; +} + +GLM_FUNC_QUALIFIER void sse_mul_ps(__m128 const in1[4], __m128 const in2[4], __m128 out[4]) +{ + { + __m128 e0 = _mm_shuffle_ps(in2[0], in2[0], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 e1 = _mm_shuffle_ps(in2[0], in2[0], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 e2 = _mm_shuffle_ps(in2[0], in2[0], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 e3 = _mm_shuffle_ps(in2[0], in2[0], _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 m0 = _mm_mul_ps(in1[0], e0); + __m128 m1 = _mm_mul_ps(in1[1], e1); + __m128 m2 = _mm_mul_ps(in1[2], e2); + __m128 m3 = _mm_mul_ps(in1[3], e3); + + __m128 a0 = _mm_add_ps(m0, m1); + __m128 a1 = _mm_add_ps(m2, m3); + __m128 a2 = _mm_add_ps(a0, a1); + + out[0] = a2; + } + + { + __m128 e0 = _mm_shuffle_ps(in2[1], in2[1], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 e1 = _mm_shuffle_ps(in2[1], in2[1], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 e2 = _mm_shuffle_ps(in2[1], in2[1], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 e3 = _mm_shuffle_ps(in2[1], in2[1], _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 m0 = _mm_mul_ps(in1[0], e0); + __m128 m1 = _mm_mul_ps(in1[1], e1); + __m128 m2 = _mm_mul_ps(in1[2], e2); + __m128 m3 = _mm_mul_ps(in1[3], e3); + + __m128 a0 = _mm_add_ps(m0, m1); + __m128 a1 = _mm_add_ps(m2, m3); + __m128 a2 = _mm_add_ps(a0, a1); + + out[1] = a2; + } + + { + __m128 e0 = _mm_shuffle_ps(in2[2], in2[2], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 e1 = _mm_shuffle_ps(in2[2], in2[2], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 e2 = _mm_shuffle_ps(in2[2], in2[2], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 e3 = _mm_shuffle_ps(in2[2], in2[2], _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 m0 = _mm_mul_ps(in1[0], e0); + __m128 m1 = _mm_mul_ps(in1[1], e1); + __m128 m2 = _mm_mul_ps(in1[2], e2); + __m128 m3 = _mm_mul_ps(in1[3], e3); + + __m128 a0 = _mm_add_ps(m0, m1); + __m128 a1 = _mm_add_ps(m2, m3); + __m128 a2 = _mm_add_ps(a0, a1); + + out[2] = a2; + } + + { + //(__m128&)_mm_shuffle_epi32(__m128i&)in2[0], _MM_SHUFFLE(3, 3, 3, 3)) + __m128 e0 = _mm_shuffle_ps(in2[3], in2[3], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 e1 = _mm_shuffle_ps(in2[3], in2[3], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 e2 = _mm_shuffle_ps(in2[3], in2[3], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 e3 = _mm_shuffle_ps(in2[3], in2[3], _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 m0 = _mm_mul_ps(in1[0], e0); + __m128 m1 = _mm_mul_ps(in1[1], e1); + __m128 m2 = _mm_mul_ps(in1[2], e2); + __m128 m3 = _mm_mul_ps(in1[3], e3); + + __m128 a0 = _mm_add_ps(m0, m1); + __m128 a1 = _mm_add_ps(m2, m3); + __m128 a2 = _mm_add_ps(a0, a1); + + out[3] = a2; + } +} + +GLM_FUNC_QUALIFIER void sse_transpose_ps(__m128 const in[4], __m128 out[4]) +{ + __m128 tmp0 = _mm_shuffle_ps(in[0], in[1], 0x44); + __m128 tmp2 = _mm_shuffle_ps(in[0], in[1], 0xEE); + __m128 tmp1 = _mm_shuffle_ps(in[2], in[3], 0x44); + __m128 tmp3 = _mm_shuffle_ps(in[2], in[3], 0xEE); + + out[0] = _mm_shuffle_ps(tmp0, tmp1, 0x88); + out[1] = _mm_shuffle_ps(tmp0, tmp1, 0xDD); + out[2] = _mm_shuffle_ps(tmp2, tmp3, 0x88); + out[3] = _mm_shuffle_ps(tmp2, tmp3, 0xDD); +} + +GLM_FUNC_QUALIFIER __m128 sse_slow_det_ps(__m128 const in[4]) +{ + __m128 Fac0; + { + // valType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3]; + // valType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3]; + // valType SubFactor06 = m[1][2] * m[3][3] - m[3][2] * m[1][3]; + // valType SubFactor13 = m[1][2] * m[2][3] - m[2][2] * m[1][3]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac0 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 Fac1; + { + // valType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3]; + // valType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3]; + // valType SubFactor07 = m[1][1] * m[3][3] - m[3][1] * m[1][3]; + // valType SubFactor14 = m[1][1] * m[2][3] - m[2][1] * m[1][3]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac1 = _mm_sub_ps(Mul00, Mul01); + } + + + __m128 Fac2; + { + // valType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2]; + // valType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2]; + // valType SubFactor08 = m[1][1] * m[3][2] - m[3][1] * m[1][2]; + // valType SubFactor15 = m[1][1] * m[2][2] - m[2][1] * m[1][2]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac2 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 Fac3; + { + // valType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3]; + // valType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3]; + // valType SubFactor09 = m[1][0] * m[3][3] - m[3][0] * m[1][3]; + // valType SubFactor16 = m[1][0] * m[2][3] - m[2][0] * m[1][3]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac3 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 Fac4; + { + // valType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2]; + // valType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2]; + // valType SubFactor10 = m[1][0] * m[3][2] - m[3][0] * m[1][2]; + // valType SubFactor17 = m[1][0] * m[2][2] - m[2][0] * m[1][2]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac4 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 Fac5; + { + // valType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1]; + // valType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1]; + // valType SubFactor12 = m[1][0] * m[3][1] - m[3][0] * m[1][1]; + // valType SubFactor18 = m[1][0] * m[2][1] - m[2][0] * m[1][1]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac5 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 SignA = _mm_set_ps( 1.0f,-1.0f, 1.0f,-1.0f); + __m128 SignB = _mm_set_ps(-1.0f, 1.0f,-1.0f, 1.0f); + + // m[1][0] + // m[0][0] + // m[0][0] + // m[0][0] + __m128 Temp0 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Vec0 = _mm_shuffle_ps(Temp0, Temp0, _MM_SHUFFLE(2, 2, 2, 0)); + + // m[1][1] + // m[0][1] + // m[0][1] + // m[0][1] + __m128 Temp1 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 Vec1 = _mm_shuffle_ps(Temp1, Temp1, _MM_SHUFFLE(2, 2, 2, 0)); + + // m[1][2] + // m[0][2] + // m[0][2] + // m[0][2] + __m128 Temp2 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Vec2 = _mm_shuffle_ps(Temp2, Temp2, _MM_SHUFFLE(2, 2, 2, 0)); + + // m[1][3] + // m[0][3] + // m[0][3] + // m[0][3] + __m128 Temp3 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Vec3 = _mm_shuffle_ps(Temp3, Temp3, _MM_SHUFFLE(2, 2, 2, 0)); + + // col0 + // + (Vec1[0] * Fac0[0] - Vec2[0] * Fac1[0] + Vec3[0] * Fac2[0]), + // - (Vec1[1] * Fac0[1] - Vec2[1] * Fac1[1] + Vec3[1] * Fac2[1]), + // + (Vec1[2] * Fac0[2] - Vec2[2] * Fac1[2] + Vec3[2] * Fac2[2]), + // - (Vec1[3] * Fac0[3] - Vec2[3] * Fac1[3] + Vec3[3] * Fac2[3]), + __m128 Mul00 = _mm_mul_ps(Vec1, Fac0); + __m128 Mul01 = _mm_mul_ps(Vec2, Fac1); + __m128 Mul02 = _mm_mul_ps(Vec3, Fac2); + __m128 Sub00 = _mm_sub_ps(Mul00, Mul01); + __m128 Add00 = _mm_add_ps(Sub00, Mul02); + __m128 Inv0 = _mm_mul_ps(SignB, Add00); + + // col1 + // - (Vec0[0] * Fac0[0] - Vec2[0] * Fac3[0] + Vec3[0] * Fac4[0]), + // + (Vec0[0] * Fac0[1] - Vec2[1] * Fac3[1] + Vec3[1] * Fac4[1]), + // - (Vec0[0] * Fac0[2] - Vec2[2] * Fac3[2] + Vec3[2] * Fac4[2]), + // + (Vec0[0] * Fac0[3] - Vec2[3] * Fac3[3] + Vec3[3] * Fac4[3]), + __m128 Mul03 = _mm_mul_ps(Vec0, Fac0); + __m128 Mul04 = _mm_mul_ps(Vec2, Fac3); + __m128 Mul05 = _mm_mul_ps(Vec3, Fac4); + __m128 Sub01 = _mm_sub_ps(Mul03, Mul04); + __m128 Add01 = _mm_add_ps(Sub01, Mul05); + __m128 Inv1 = _mm_mul_ps(SignA, Add01); + + // col2 + // + (Vec0[0] * Fac1[0] - Vec1[0] * Fac3[0] + Vec3[0] * Fac5[0]), + // - (Vec0[0] * Fac1[1] - Vec1[1] * Fac3[1] + Vec3[1] * Fac5[1]), + // + (Vec0[0] * Fac1[2] - Vec1[2] * Fac3[2] + Vec3[2] * Fac5[2]), + // - (Vec0[0] * Fac1[3] - Vec1[3] * Fac3[3] + Vec3[3] * Fac5[3]), + __m128 Mul06 = _mm_mul_ps(Vec0, Fac1); + __m128 Mul07 = _mm_mul_ps(Vec1, Fac3); + __m128 Mul08 = _mm_mul_ps(Vec3, Fac5); + __m128 Sub02 = _mm_sub_ps(Mul06, Mul07); + __m128 Add02 = _mm_add_ps(Sub02, Mul08); + __m128 Inv2 = _mm_mul_ps(SignB, Add02); + + // col3 + // - (Vec1[0] * Fac2[0] - Vec1[0] * Fac4[0] + Vec2[0] * Fac5[0]), + // + (Vec1[0] * Fac2[1] - Vec1[1] * Fac4[1] + Vec2[1] * Fac5[1]), + // - (Vec1[0] * Fac2[2] - Vec1[2] * Fac4[2] + Vec2[2] * Fac5[2]), + // + (Vec1[0] * Fac2[3] - Vec1[3] * Fac4[3] + Vec2[3] * Fac5[3])); + __m128 Mul09 = _mm_mul_ps(Vec0, Fac2); + __m128 Mul10 = _mm_mul_ps(Vec1, Fac4); + __m128 Mul11 = _mm_mul_ps(Vec2, Fac5); + __m128 Sub03 = _mm_sub_ps(Mul09, Mul10); + __m128 Add03 = _mm_add_ps(Sub03, Mul11); + __m128 Inv3 = _mm_mul_ps(SignA, Add03); + + __m128 Row0 = _mm_shuffle_ps(Inv0, Inv1, _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Row1 = _mm_shuffle_ps(Inv2, Inv3, _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Row2 = _mm_shuffle_ps(Row0, Row1, _MM_SHUFFLE(2, 0, 2, 0)); + + // valType Determinant = m[0][0] * Inverse[0][0] + // + m[0][1] * Inverse[1][0] + // + m[0][2] * Inverse[2][0] + // + m[0][3] * Inverse[3][0]; + __m128 Det0 = sse_dot_ps(in[0], Row2); + return Det0; +} + +GLM_FUNC_QUALIFIER __m128 sse_detd_ps +( + __m128 const m[4] +) +{ + // _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128( + + //T SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3]; + //T SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3]; + //T SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2]; + //T SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3]; + //T SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2]; + //T SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1]; + + // First 2 columns + __m128 Swp2A = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[2]), _MM_SHUFFLE(0, 1, 1, 2))); + __m128 Swp3A = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[3]), _MM_SHUFFLE(3, 2, 3, 3))); + __m128 MulA = _mm_mul_ps(Swp2A, Swp3A); + + // Second 2 columns + __m128 Swp2B = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[2]), _MM_SHUFFLE(3, 2, 3, 3))); + __m128 Swp3B = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[3]), _MM_SHUFFLE(0, 1, 1, 2))); + __m128 MulB = _mm_mul_ps(Swp2B, Swp3B); + + // Columns subtraction + __m128 SubE = _mm_sub_ps(MulA, MulB); + + // Last 2 rows + __m128 Swp2C = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[2]), _MM_SHUFFLE(0, 0, 1, 2))); + __m128 Swp3C = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[3]), _MM_SHUFFLE(1, 2, 0, 0))); + __m128 MulC = _mm_mul_ps(Swp2C, Swp3C); + __m128 SubF = _mm_sub_ps(_mm_movehl_ps(MulC, MulC), MulC); + + //detail::tvec4<T> DetCof( + // + (m[1][1] * SubFactor00 - m[1][2] * SubFactor01 + m[1][3] * SubFactor02), + // - (m[1][0] * SubFactor00 - m[1][2] * SubFactor03 + m[1][3] * SubFactor04), + // + (m[1][0] * SubFactor01 - m[1][1] * SubFactor03 + m[1][3] * SubFactor05), + // - (m[1][0] * SubFactor02 - m[1][1] * SubFactor04 + m[1][2] * SubFactor05)); + + __m128 SubFacA = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(SubE), _MM_SHUFFLE(2, 1, 0, 0))); + __m128 SwpFacA = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[1]), _MM_SHUFFLE(0, 0, 0, 1))); + __m128 MulFacA = _mm_mul_ps(SwpFacA, SubFacA); + + __m128 SubTmpB = _mm_shuffle_ps(SubE, SubF, _MM_SHUFFLE(0, 0, 3, 1)); + __m128 SubFacB = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(SubTmpB), _MM_SHUFFLE(3, 1, 1, 0)));//SubF[0], SubE[3], SubE[3], SubE[1]; + __m128 SwpFacB = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[1]), _MM_SHUFFLE(1, 1, 2, 2))); + __m128 MulFacB = _mm_mul_ps(SwpFacB, SubFacB); + + __m128 SubRes = _mm_sub_ps(MulFacA, MulFacB); + + __m128 SubTmpC = _mm_shuffle_ps(SubE, SubF, _MM_SHUFFLE(1, 0, 2, 2)); + __m128 SubFacC = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(SubTmpC), _MM_SHUFFLE(3, 3, 2, 0))); + __m128 SwpFacC = _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(m[1]), _MM_SHUFFLE(2, 3, 3, 3))); + __m128 MulFacC = _mm_mul_ps(SwpFacC, SubFacC); + + __m128 AddRes = _mm_add_ps(SubRes, MulFacC); + __m128 DetCof = _mm_mul_ps(AddRes, _mm_setr_ps( 1.0f,-1.0f, 1.0f,-1.0f)); + + //return m[0][0] * DetCof[0] + // + m[0][1] * DetCof[1] + // + m[0][2] * DetCof[2] + // + m[0][3] * DetCof[3]; + + return sse_dot_ps(m[0], DetCof); +} + +GLM_FUNC_QUALIFIER __m128 sse_det_ps +( + __m128 const m[4] +) +{ + // _mm_castsi128_ps(_mm_shuffle_epi32(_mm_castps_si128(add) + + //T SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3]; + //T SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3]; + //T SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2]; + //T SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3]; + //T SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2]; + //T SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1]; + + // First 2 columns + __m128 Swp2A = _mm_shuffle_ps(m[2], m[2], _MM_SHUFFLE(0, 1, 1, 2)); + __m128 Swp3A = _mm_shuffle_ps(m[3], m[3], _MM_SHUFFLE(3, 2, 3, 3)); + __m128 MulA = _mm_mul_ps(Swp2A, Swp3A); + + // Second 2 columns + __m128 Swp2B = _mm_shuffle_ps(m[2], m[2], _MM_SHUFFLE(3, 2, 3, 3)); + __m128 Swp3B = _mm_shuffle_ps(m[3], m[3], _MM_SHUFFLE(0, 1, 1, 2)); + __m128 MulB = _mm_mul_ps(Swp2B, Swp3B); + + // Columns subtraction + __m128 SubE = _mm_sub_ps(MulA, MulB); + + // Last 2 rows + __m128 Swp2C = _mm_shuffle_ps(m[2], m[2], _MM_SHUFFLE(0, 0, 1, 2)); + __m128 Swp3C = _mm_shuffle_ps(m[3], m[3], _MM_SHUFFLE(1, 2, 0, 0)); + __m128 MulC = _mm_mul_ps(Swp2C, Swp3C); + __m128 SubF = _mm_sub_ps(_mm_movehl_ps(MulC, MulC), MulC); + + //detail::tvec4<T> DetCof( + // + (m[1][1] * SubFactor00 - m[1][2] * SubFactor01 + m[1][3] * SubFactor02), + // - (m[1][0] * SubFactor00 - m[1][2] * SubFactor03 + m[1][3] * SubFactor04), + // + (m[1][0] * SubFactor01 - m[1][1] * SubFactor03 + m[1][3] * SubFactor05), + // - (m[1][0] * SubFactor02 - m[1][1] * SubFactor04 + m[1][2] * SubFactor05)); + + __m128 SubFacA = _mm_shuffle_ps(SubE, SubE, _MM_SHUFFLE(2, 1, 0, 0)); + __m128 SwpFacA = _mm_shuffle_ps(m[1], m[1], _MM_SHUFFLE(0, 0, 0, 1)); + __m128 MulFacA = _mm_mul_ps(SwpFacA, SubFacA); + + __m128 SubTmpB = _mm_shuffle_ps(SubE, SubF, _MM_SHUFFLE(0, 0, 3, 1)); + __m128 SubFacB = _mm_shuffle_ps(SubTmpB, SubTmpB, _MM_SHUFFLE(3, 1, 1, 0));//SubF[0], SubE[3], SubE[3], SubE[1]; + __m128 SwpFacB = _mm_shuffle_ps(m[1], m[1], _MM_SHUFFLE(1, 1, 2, 2)); + __m128 MulFacB = _mm_mul_ps(SwpFacB, SubFacB); + + __m128 SubRes = _mm_sub_ps(MulFacA, MulFacB); + + __m128 SubTmpC = _mm_shuffle_ps(SubE, SubF, _MM_SHUFFLE(1, 0, 2, 2)); + __m128 SubFacC = _mm_shuffle_ps(SubTmpC, SubTmpC, _MM_SHUFFLE(3, 3, 2, 0)); + __m128 SwpFacC = _mm_shuffle_ps(m[1], m[1], _MM_SHUFFLE(2, 3, 3, 3)); + __m128 MulFacC = _mm_mul_ps(SwpFacC, SubFacC); + + __m128 AddRes = _mm_add_ps(SubRes, MulFacC); + __m128 DetCof = _mm_mul_ps(AddRes, _mm_setr_ps( 1.0f,-1.0f, 1.0f,-1.0f)); + + //return m[0][0] * DetCof[0] + // + m[0][1] * DetCof[1] + // + m[0][2] * DetCof[2] + // + m[0][3] * DetCof[3]; + + return sse_dot_ps(m[0], DetCof); +} + +GLM_FUNC_QUALIFIER void sse_inverse_ps(__m128 const in[4], __m128 out[4]) +{ + __m128 Fac0; + { + // valType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3]; + // valType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3]; + // valType SubFactor06 = m[1][2] * m[3][3] - m[3][2] * m[1][3]; + // valType SubFactor13 = m[1][2] * m[2][3] - m[2][2] * m[1][3]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac0 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 Fac1; + { + // valType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3]; + // valType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3]; + // valType SubFactor07 = m[1][1] * m[3][3] - m[3][1] * m[1][3]; + // valType SubFactor14 = m[1][1] * m[2][3] - m[2][1] * m[1][3]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac1 = _mm_sub_ps(Mul00, Mul01); + } + + + __m128 Fac2; + { + // valType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2]; + // valType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2]; + // valType SubFactor08 = m[1][1] * m[3][2] - m[3][1] * m[1][2]; + // valType SubFactor15 = m[1][1] * m[2][2] - m[2][1] * m[1][2]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac2 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 Fac3; + { + // valType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3]; + // valType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3]; + // valType SubFactor09 = m[1][0] * m[3][3] - m[3][0] * m[1][3]; + // valType SubFactor16 = m[1][0] * m[2][3] - m[2][0] * m[1][3]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac3 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 Fac4; + { + // valType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2]; + // valType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2]; + // valType SubFactor10 = m[1][0] * m[3][2] - m[3][0] * m[1][2]; + // valType SubFactor17 = m[1][0] * m[2][2] - m[2][0] * m[1][2]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac4 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 Fac5; + { + // valType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1]; + // valType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1]; + // valType SubFactor12 = m[1][0] * m[3][1] - m[3][0] * m[1][1]; + // valType SubFactor18 = m[1][0] * m[2][1] - m[2][0] * m[1][1]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac5 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 SignA = _mm_set_ps( 1.0f,-1.0f, 1.0f,-1.0f); + __m128 SignB = _mm_set_ps(-1.0f, 1.0f,-1.0f, 1.0f); + + // m[1][0] + // m[0][0] + // m[0][0] + // m[0][0] + __m128 Temp0 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Vec0 = _mm_shuffle_ps(Temp0, Temp0, _MM_SHUFFLE(2, 2, 2, 0)); + + // m[1][1] + // m[0][1] + // m[0][1] + // m[0][1] + __m128 Temp1 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 Vec1 = _mm_shuffle_ps(Temp1, Temp1, _MM_SHUFFLE(2, 2, 2, 0)); + + // m[1][2] + // m[0][2] + // m[0][2] + // m[0][2] + __m128 Temp2 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Vec2 = _mm_shuffle_ps(Temp2, Temp2, _MM_SHUFFLE(2, 2, 2, 0)); + + // m[1][3] + // m[0][3] + // m[0][3] + // m[0][3] + __m128 Temp3 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Vec3 = _mm_shuffle_ps(Temp3, Temp3, _MM_SHUFFLE(2, 2, 2, 0)); + + // col0 + // + (Vec1[0] * Fac0[0] - Vec2[0] * Fac1[0] + Vec3[0] * Fac2[0]), + // - (Vec1[1] * Fac0[1] - Vec2[1] * Fac1[1] + Vec3[1] * Fac2[1]), + // + (Vec1[2] * Fac0[2] - Vec2[2] * Fac1[2] + Vec3[2] * Fac2[2]), + // - (Vec1[3] * Fac0[3] - Vec2[3] * Fac1[3] + Vec3[3] * Fac2[3]), + __m128 Mul00 = _mm_mul_ps(Vec1, Fac0); + __m128 Mul01 = _mm_mul_ps(Vec2, Fac1); + __m128 Mul02 = _mm_mul_ps(Vec3, Fac2); + __m128 Sub00 = _mm_sub_ps(Mul00, Mul01); + __m128 Add00 = _mm_add_ps(Sub00, Mul02); + __m128 Inv0 = _mm_mul_ps(SignB, Add00); + + // col1 + // - (Vec0[0] * Fac0[0] - Vec2[0] * Fac3[0] + Vec3[0] * Fac4[0]), + // + (Vec0[0] * Fac0[1] - Vec2[1] * Fac3[1] + Vec3[1] * Fac4[1]), + // - (Vec0[0] * Fac0[2] - Vec2[2] * Fac3[2] + Vec3[2] * Fac4[2]), + // + (Vec0[0] * Fac0[3] - Vec2[3] * Fac3[3] + Vec3[3] * Fac4[3]), + __m128 Mul03 = _mm_mul_ps(Vec0, Fac0); + __m128 Mul04 = _mm_mul_ps(Vec2, Fac3); + __m128 Mul05 = _mm_mul_ps(Vec3, Fac4); + __m128 Sub01 = _mm_sub_ps(Mul03, Mul04); + __m128 Add01 = _mm_add_ps(Sub01, Mul05); + __m128 Inv1 = _mm_mul_ps(SignA, Add01); + + // col2 + // + (Vec0[0] * Fac1[0] - Vec1[0] * Fac3[0] + Vec3[0] * Fac5[0]), + // - (Vec0[0] * Fac1[1] - Vec1[1] * Fac3[1] + Vec3[1] * Fac5[1]), + // + (Vec0[0] * Fac1[2] - Vec1[2] * Fac3[2] + Vec3[2] * Fac5[2]), + // - (Vec0[0] * Fac1[3] - Vec1[3] * Fac3[3] + Vec3[3] * Fac5[3]), + __m128 Mul06 = _mm_mul_ps(Vec0, Fac1); + __m128 Mul07 = _mm_mul_ps(Vec1, Fac3); + __m128 Mul08 = _mm_mul_ps(Vec3, Fac5); + __m128 Sub02 = _mm_sub_ps(Mul06, Mul07); + __m128 Add02 = _mm_add_ps(Sub02, Mul08); + __m128 Inv2 = _mm_mul_ps(SignB, Add02); + + // col3 + // - (Vec1[0] * Fac2[0] - Vec1[0] * Fac4[0] + Vec2[0] * Fac5[0]), + // + (Vec1[0] * Fac2[1] - Vec1[1] * Fac4[1] + Vec2[1] * Fac5[1]), + // - (Vec1[0] * Fac2[2] - Vec1[2] * Fac4[2] + Vec2[2] * Fac5[2]), + // + (Vec1[0] * Fac2[3] - Vec1[3] * Fac4[3] + Vec2[3] * Fac5[3])); + __m128 Mul09 = _mm_mul_ps(Vec0, Fac2); + __m128 Mul10 = _mm_mul_ps(Vec1, Fac4); + __m128 Mul11 = _mm_mul_ps(Vec2, Fac5); + __m128 Sub03 = _mm_sub_ps(Mul09, Mul10); + __m128 Add03 = _mm_add_ps(Sub03, Mul11); + __m128 Inv3 = _mm_mul_ps(SignA, Add03); + + __m128 Row0 = _mm_shuffle_ps(Inv0, Inv1, _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Row1 = _mm_shuffle_ps(Inv2, Inv3, _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Row2 = _mm_shuffle_ps(Row0, Row1, _MM_SHUFFLE(2, 0, 2, 0)); + + // valType Determinant = m[0][0] * Inverse[0][0] + // + m[0][1] * Inverse[1][0] + // + m[0][2] * Inverse[2][0] + // + m[0][3] * Inverse[3][0]; + __m128 Det0 = sse_dot_ps(in[0], Row2); + __m128 Rcp0 = _mm_div_ps(one, Det0); + //__m128 Rcp0 = _mm_rcp_ps(Det0); + + // Inverse /= Determinant; + out[0] = _mm_mul_ps(Inv0, Rcp0); + out[1] = _mm_mul_ps(Inv1, Rcp0); + out[2] = _mm_mul_ps(Inv2, Rcp0); + out[3] = _mm_mul_ps(Inv3, Rcp0); +} + +GLM_FUNC_QUALIFIER void sse_inverse_fast_ps(__m128 const in[4], __m128 out[4]) +{ + __m128 Fac0; + { + // valType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3]; + // valType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3]; + // valType SubFactor06 = m[1][2] * m[3][3] - m[3][2] * m[1][3]; + // valType SubFactor13 = m[1][2] * m[2][3] - m[2][2] * m[1][3]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac0 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 Fac1; + { + // valType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3]; + // valType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3]; + // valType SubFactor07 = m[1][1] * m[3][3] - m[3][1] * m[1][3]; + // valType SubFactor14 = m[1][1] * m[2][3] - m[2][1] * m[1][3]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac1 = _mm_sub_ps(Mul00, Mul01); + } + + + __m128 Fac2; + { + // valType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2]; + // valType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2]; + // valType SubFactor08 = m[1][1] * m[3][2] - m[3][1] * m[1][2]; + // valType SubFactor15 = m[1][1] * m[2][2] - m[2][1] * m[1][2]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac2 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 Fac3; + { + // valType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3]; + // valType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3]; + // valType SubFactor09 = m[1][0] * m[3][3] - m[3][0] * m[1][3]; + // valType SubFactor16 = m[1][0] * m[2][3] - m[2][0] * m[1][3]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(3, 3, 3, 3)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac3 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 Fac4; + { + // valType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2]; + // valType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2]; + // valType SubFactor10 = m[1][0] * m[3][2] - m[3][0] * m[1][2]; + // valType SubFactor17 = m[1][0] * m[2][2] - m[2][0] * m[1][2]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(2, 2, 2, 2)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac4 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 Fac5; + { + // valType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1]; + // valType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1]; + // valType SubFactor12 = m[1][0] * m[3][1] - m[3][0] * m[1][1]; + // valType SubFactor18 = m[1][0] * m[2][1] - m[2][0] * m[1][1]; + + __m128 Swp0a = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 Swp0b = _mm_shuffle_ps(in[3], in[2], _MM_SHUFFLE(0, 0, 0, 0)); + + __m128 Swp00 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Swp01 = _mm_shuffle_ps(Swp0a, Swp0a, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp02 = _mm_shuffle_ps(Swp0b, Swp0b, _MM_SHUFFLE(2, 0, 0, 0)); + __m128 Swp03 = _mm_shuffle_ps(in[2], in[1], _MM_SHUFFLE(1, 1, 1, 1)); + + __m128 Mul00 = _mm_mul_ps(Swp00, Swp01); + __m128 Mul01 = _mm_mul_ps(Swp02, Swp03); + Fac5 = _mm_sub_ps(Mul00, Mul01); + } + + __m128 SignA = _mm_set_ps( 1.0f,-1.0f, 1.0f,-1.0f); + __m128 SignB = _mm_set_ps(-1.0f, 1.0f,-1.0f, 1.0f); + + // m[1][0] + // m[0][0] + // m[0][0] + // m[0][0] + __m128 Temp0 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Vec0 = _mm_shuffle_ps(Temp0, Temp0, _MM_SHUFFLE(2, 2, 2, 0)); + + // m[1][1] + // m[0][1] + // m[0][1] + // m[0][1] + __m128 Temp1 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(1, 1, 1, 1)); + __m128 Vec1 = _mm_shuffle_ps(Temp1, Temp1, _MM_SHUFFLE(2, 2, 2, 0)); + + // m[1][2] + // m[0][2] + // m[0][2] + // m[0][2] + __m128 Temp2 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Vec2 = _mm_shuffle_ps(Temp2, Temp2, _MM_SHUFFLE(2, 2, 2, 0)); + + // m[1][3] + // m[0][3] + // m[0][3] + // m[0][3] + __m128 Temp3 = _mm_shuffle_ps(in[1], in[0], _MM_SHUFFLE(3, 3, 3, 3)); + __m128 Vec3 = _mm_shuffle_ps(Temp3, Temp3, _MM_SHUFFLE(2, 2, 2, 0)); + + // col0 + // + (Vec1[0] * Fac0[0] - Vec2[0] * Fac1[0] + Vec3[0] * Fac2[0]), + // - (Vec1[1] * Fac0[1] - Vec2[1] * Fac1[1] + Vec3[1] * Fac2[1]), + // + (Vec1[2] * Fac0[2] - Vec2[2] * Fac1[2] + Vec3[2] * Fac2[2]), + // - (Vec1[3] * Fac0[3] - Vec2[3] * Fac1[3] + Vec3[3] * Fac2[3]), + __m128 Mul00 = _mm_mul_ps(Vec1, Fac0); + __m128 Mul01 = _mm_mul_ps(Vec2, Fac1); + __m128 Mul02 = _mm_mul_ps(Vec3, Fac2); + __m128 Sub00 = _mm_sub_ps(Mul00, Mul01); + __m128 Add00 = _mm_add_ps(Sub00, Mul02); + __m128 Inv0 = _mm_mul_ps(SignB, Add00); + + // col1 + // - (Vec0[0] * Fac0[0] - Vec2[0] * Fac3[0] + Vec3[0] * Fac4[0]), + // + (Vec0[0] * Fac0[1] - Vec2[1] * Fac3[1] + Vec3[1] * Fac4[1]), + // - (Vec0[0] * Fac0[2] - Vec2[2] * Fac3[2] + Vec3[2] * Fac4[2]), + // + (Vec0[0] * Fac0[3] - Vec2[3] * Fac3[3] + Vec3[3] * Fac4[3]), + __m128 Mul03 = _mm_mul_ps(Vec0, Fac0); + __m128 Mul04 = _mm_mul_ps(Vec2, Fac3); + __m128 Mul05 = _mm_mul_ps(Vec3, Fac4); + __m128 Sub01 = _mm_sub_ps(Mul03, Mul04); + __m128 Add01 = _mm_add_ps(Sub01, Mul05); + __m128 Inv1 = _mm_mul_ps(SignA, Add01); + + // col2 + // + (Vec0[0] * Fac1[0] - Vec1[0] * Fac3[0] + Vec3[0] * Fac5[0]), + // - (Vec0[0] * Fac1[1] - Vec1[1] * Fac3[1] + Vec3[1] * Fac5[1]), + // + (Vec0[0] * Fac1[2] - Vec1[2] * Fac3[2] + Vec3[2] * Fac5[2]), + // - (Vec0[0] * Fac1[3] - Vec1[3] * Fac3[3] + Vec3[3] * Fac5[3]), + __m128 Mul06 = _mm_mul_ps(Vec0, Fac1); + __m128 Mul07 = _mm_mul_ps(Vec1, Fac3); + __m128 Mul08 = _mm_mul_ps(Vec3, Fac5); + __m128 Sub02 = _mm_sub_ps(Mul06, Mul07); + __m128 Add02 = _mm_add_ps(Sub02, Mul08); + __m128 Inv2 = _mm_mul_ps(SignB, Add02); + + // col3 + // - (Vec1[0] * Fac2[0] - Vec1[0] * Fac4[0] + Vec2[0] * Fac5[0]), + // + (Vec1[0] * Fac2[1] - Vec1[1] * Fac4[1] + Vec2[1] * Fac5[1]), + // - (Vec1[0] * Fac2[2] - Vec1[2] * Fac4[2] + Vec2[2] * Fac5[2]), + // + (Vec1[0] * Fac2[3] - Vec1[3] * Fac4[3] + Vec2[3] * Fac5[3])); + __m128 Mul09 = _mm_mul_ps(Vec0, Fac2); + __m128 Mul10 = _mm_mul_ps(Vec1, Fac4); + __m128 Mul11 = _mm_mul_ps(Vec2, Fac5); + __m128 Sub03 = _mm_sub_ps(Mul09, Mul10); + __m128 Add03 = _mm_add_ps(Sub03, Mul11); + __m128 Inv3 = _mm_mul_ps(SignA, Add03); + + __m128 Row0 = _mm_shuffle_ps(Inv0, Inv1, _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Row1 = _mm_shuffle_ps(Inv2, Inv3, _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Row2 = _mm_shuffle_ps(Row0, Row1, _MM_SHUFFLE(2, 0, 2, 0)); + + // valType Determinant = m[0][0] * Inverse[0][0] + // + m[0][1] * Inverse[1][0] + // + m[0][2] * Inverse[2][0] + // + m[0][3] * Inverse[3][0]; + __m128 Det0 = sse_dot_ps(in[0], Row2); + __m128 Rcp0 = _mm_rcp_ps(Det0); + //__m128 Rcp0 = _mm_div_ps(one, Det0); + // Inverse /= Determinant; + out[0] = _mm_mul_ps(Inv0, Rcp0); + out[1] = _mm_mul_ps(Inv1, Rcp0); + out[2] = _mm_mul_ps(Inv2, Rcp0); + out[3] = _mm_mul_ps(Inv3, Rcp0); +} +/* +GLM_FUNC_QUALIFIER void sse_rotate_ps(__m128 const in[4], float Angle, float const v[3], __m128 out[4]) +{ + float a = glm::radians(Angle); + float c = cos(a); + float s = sin(a); + + glm::vec4 AxisA(v[0], v[1], v[2], float(0)); + __m128 AxisB = _mm_set_ps(AxisA.w, AxisA.z, AxisA.y, AxisA.x); + __m128 AxisC = detail::sse_nrm_ps(AxisB); + + __m128 Cos0 = _mm_set_ss(c); + __m128 CosA = _mm_shuffle_ps(Cos0, Cos0, _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Sin0 = _mm_set_ss(s); + __m128 SinA = _mm_shuffle_ps(Sin0, Sin0, _MM_SHUFFLE(0, 0, 0, 0)); + + // detail::tvec3<valType> temp = (valType(1) - c) * axis; + __m128 Temp0 = _mm_sub_ps(one, CosA); + __m128 Temp1 = _mm_mul_ps(Temp0, AxisC); + + //Rotate[0][0] = c + temp[0] * axis[0]; + //Rotate[0][1] = 0 + temp[0] * axis[1] + s * axis[2]; + //Rotate[0][2] = 0 + temp[0] * axis[2] - s * axis[1]; + __m128 Axis0 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(0, 0, 0, 0)); + __m128 TmpA0 = _mm_mul_ps(Axis0, AxisC); + __m128 CosA0 = _mm_shuffle_ps(Cos0, Cos0, _MM_SHUFFLE(1, 1, 1, 0)); + __m128 TmpA1 = _mm_add_ps(CosA0, TmpA0); + __m128 SinA0 = SinA;//_mm_set_ps(0.0f, s, -s, 0.0f); + __m128 TmpA2 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(3, 1, 2, 3)); + __m128 TmpA3 = _mm_mul_ps(SinA0, TmpA2); + __m128 TmpA4 = _mm_add_ps(TmpA1, TmpA3); + + //Rotate[1][0] = 0 + temp[1] * axis[0] - s * axis[2]; + //Rotate[1][1] = c + temp[1] * axis[1]; + //Rotate[1][2] = 0 + temp[1] * axis[2] + s * axis[0]; + __m128 Axis1 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(1, 1, 1, 1)); + __m128 TmpB0 = _mm_mul_ps(Axis1, AxisC); + __m128 CosA1 = _mm_shuffle_ps(Cos0, Cos0, _MM_SHUFFLE(1, 1, 0, 1)); + __m128 TmpB1 = _mm_add_ps(CosA1, TmpB0); + __m128 SinB0 = SinA;//_mm_set_ps(-s, 0.0f, s, 0.0f); + __m128 TmpB2 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(3, 0, 3, 2)); + __m128 TmpB3 = _mm_mul_ps(SinA0, TmpB2); + __m128 TmpB4 = _mm_add_ps(TmpB1, TmpB3); + + //Rotate[2][0] = 0 + temp[2] * axis[0] + s * axis[1]; + //Rotate[2][1] = 0 + temp[2] * axis[1] - s * axis[0]; + //Rotate[2][2] = c + temp[2] * axis[2]; + __m128 Axis2 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(2, 2, 2, 2)); + __m128 TmpC0 = _mm_mul_ps(Axis2, AxisC); + __m128 CosA2 = _mm_shuffle_ps(Cos0, Cos0, _MM_SHUFFLE(1, 0, 1, 1)); + __m128 TmpC1 = _mm_add_ps(CosA2, TmpC0); + __m128 SinC0 = SinA;//_mm_set_ps(s, -s, 0.0f, 0.0f); + __m128 TmpC2 = _mm_shuffle_ps(AxisC, AxisC, _MM_SHUFFLE(3, 3, 0, 1)); + __m128 TmpC3 = _mm_mul_ps(SinA0, TmpC2); + __m128 TmpC4 = _mm_add_ps(TmpC1, TmpC3); + + __m128 Result[4]; + Result[0] = TmpA4; + Result[1] = TmpB4; + Result[2] = TmpC4; + Result[3] = _mm_set_ps(1, 0, 0, 0); + + //detail::tmat4x4<valType> Result(detail::tmat4x4<valType>::null); + //Result[0] = m[0] * Rotate[0][0] + m[1] * Rotate[0][1] + m[2] * Rotate[0][2]; + //Result[1] = m[0] * Rotate[1][0] + m[1] * Rotate[1][1] + m[2] * Rotate[1][2]; + //Result[2] = m[0] * Rotate[2][0] + m[1] * Rotate[2][1] + m[2] * Rotate[2][2]; + //Result[3] = m[3]; + //return Result; + sse_mul_ps(in, Result, out); +} +*/ +GLM_FUNC_QUALIFIER void sse_outer_ps(__m128 const & c, __m128 const & r, __m128 out[4]) +{ + out[0] = _mm_mul_ps(c, _mm_shuffle_ps(r, r, _MM_SHUFFLE(0, 0, 0, 0))); + out[1] = _mm_mul_ps(c, _mm_shuffle_ps(r, r, _MM_SHUFFLE(1, 1, 1, 1))); + out[2] = _mm_mul_ps(c, _mm_shuffle_ps(r, r, _MM_SHUFFLE(2, 2, 2, 2))); + out[3] = _mm_mul_ps(c, _mm_shuffle_ps(r, r, _MM_SHUFFLE(3, 3, 3, 3))); +} + +}//namespace detail +}//namespace glm diff --git a/include/gal/opengl/glm/core/intrinsic_trigonometric.hpp b/include/gal/opengl/glm/core/intrinsic_trigonometric.hpp new file mode 100644 index 0000000..b7d298b --- /dev/null +++ b/include/gal/opengl/glm/core/intrinsic_trigonometric.hpp @@ -0,0 +1,48 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/intrinsic_trigonometric.hpp +/// @date 2009-06-09 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_detail_intrinsic_trigonometric +#define glm_detail_intrinsic_trigonometric + +#include "setup.hpp" + +#if(!(GLM_ARCH & GLM_ARCH_SSE2)) +# error "SSE2 instructions not supported or enabled" +#else + +namespace glm{ +namespace detail +{ + +}//namespace detail +}//namespace glm + +#include "intrinsic_trigonometric.inl" + +#endif//GLM_ARCH +#endif//glm_detail_intrinsic_trigonometric diff --git a/include/gal/opengl/glm/core/intrinsic_trigonometric.inl b/include/gal/opengl/glm/core/intrinsic_trigonometric.inl new file mode 100644 index 0000000..93343bc --- /dev/null +++ b/include/gal/opengl/glm/core/intrinsic_trigonometric.inl @@ -0,0 +1,27 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/intrinsic_trigonometric.inl +/// @date 2011-06-15 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// diff --git a/include/gal/opengl/glm/core/intrinsic_vector_relational.hpp b/include/gal/opengl/glm/core/intrinsic_vector_relational.hpp new file mode 100644 index 0000000..c9ec82e --- /dev/null +++ b/include/gal/opengl/glm/core/intrinsic_vector_relational.hpp @@ -0,0 +1,48 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/intrinsic_vector_relational.hpp +/// @date 2009-06-09 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_detail_intrinsic_vector_relational +#define glm_detail_intrinsic_vector_relational + +#include "setup.hpp" + +#if(!(GLM_ARCH & GLM_ARCH_SSE2)) +# error "SSE2 instructions not supported or enabled" +#else + +namespace glm{ +namespace detail +{ + +}//namespace detail +}//namespace glm + +#include "intrinsic_vector_relational.inl" + +#endif//GLM_ARCH +#endif//glm_detail_intrinsic_vector_relational diff --git a/include/gal/opengl/glm/core/intrinsic_vector_relational.inl b/include/gal/opengl/glm/core/intrinsic_vector_relational.inl new file mode 100644 index 0000000..8068832 --- /dev/null +++ b/include/gal/opengl/glm/core/intrinsic_vector_relational.inl @@ -0,0 +1,366 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/intrinsic_vector_relational.inl +/// @date 2009-06-09 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// +// +//// lessThan +//template <typename valType> +//GLM_FUNC_QUALIFIER typename detail::tvec2<valType>::bool_type lessThan +//( +// detail::tvec2<valType> const & x, +// detail::tvec2<valType> const & y +//) +//{ +// GLM_STATIC_ASSERT( +// detail::type<valType>::is_float || +// detail::type<valType>::is_int || +// detail::type<valType>::is_uint); +// +// return typename detail::tvec2<bool>::bool_type(x.x < y.x, x.y < y.y); +//} +// +//template <typename valType> +//GLM_FUNC_QUALIFIER typename detail::tvec3<valType>::bool_type lessThan +//( +// detail::tvec3<valType> const & x, +// detail::tvec3<valType> const & y +//) +//{ +// GLM_STATIC_ASSERT( +// detail::type<valType>::is_float || +// detail::type<valType>::is_int || +// detail::type<valType>::is_uint); +// +// return typename detail::tvec3<bool>::bool_type(x.x < y.x, x.y < y.y, x.z < y.z); +//} +// +//template <typename valType> +//GLM_FUNC_QUALIFIER typename detail::tvec4<valType>::bool_type lessThan +//( +// detail::tvec4<valType> const & x, +// detail::tvec4<valType> const & y +//) +//{ +// GLM_STATIC_ASSERT( +// detail::type<valType>::is_float || +// detail::type<valType>::is_int || +// detail::type<valType>::is_uint); +// +// return typename detail::tvec4<bool>::bool_type(x.x < y.x, x.y < y.y, x.z < y.z, x.w < y.w); +//} +// +//// lessThanEqual +//template <typename valType> +//GLM_FUNC_QUALIFIER typename detail::tvec2<valType>::bool_type lessThanEqual +//( +// detail::tvec2<valType> const & x, +// detail::tvec2<valType> const & y +//) +//{ +// GLM_STATIC_ASSERT( +// detail::type<valType>::is_float || +// detail::type<valType>::is_int || +// detail::type<valType>::is_uint); +// +// return typename detail::tvec2<bool>::bool_type(x.x <= y.x, x.y <= y.y); +//} +// +//template <typename valType> +//GLM_FUNC_QUALIFIER typename detail::tvec3<valType>::bool_type lessThanEqual +//( +// detail::tvec3<valType> const & x, +// detail::tvec3<valType> const & y +//) +//{ +// GLM_STATIC_ASSERT( +// detail::type<valType>::is_float || +// detail::type<valType>::is_int || +// detail::type<valType>::is_uint); +// +// return typename detail::tvec3<bool>::bool_type(x.x <= y.x, x.y <= y.y, x.z <= y.z); +//} +// +//template <typename valType> +//GLM_FUNC_QUALIFIER typename detail::tvec4<valType>::bool_type lessThanEqual +//( +// detail::tvec4<valType> const & x, +// detail::tvec4<valType> const & y +//) +//{ +// GLM_STATIC_ASSERT( +// detail::type<valType>::is_float || +// detail::type<valType>::is_int || +// detail::type<valType>::is_uint); +// +// return typename detail::tvec4<bool>::bool_type(x.x <= y.x, x.y <= y.y, x.z <= y.z, x.w <= y.w); +//} +// +//// greaterThan +//template <typename valType> +//GLM_FUNC_QUALIFIER typename detail::tvec2<valType>::bool_type greaterThan +//( +// detail::tvec2<valType> const & x, +// detail::tvec2<valType> const & y +//) +//{ +// GLM_STATIC_ASSERT( +// detail::type<valType>::is_float || +// detail::type<valType>::is_int || +// detail::type<valType>::is_uint); +// +// return typename detail::tvec2<bool>::bool_type(x.x > y.x, x.y > y.y); +//} +// +//template <typename valType> +//GLM_FUNC_QUALIFIER typename detail::tvec3<valType>::bool_type greaterThan +//( +// detail::tvec3<valType> const & x, +// detail::tvec3<valType> const & y +//) +//{ +// GLM_STATIC_ASSERT( +// detail::type<valType>::is_float || +// detail::type<valType>::is_int || +// detail::type<valType>::is_uint); +// +// return typename detail::tvec3<bool>::bool_type(x.x > y.x, x.y > y.y, x.z > y.z); +//} +// +//template <typename valType> +//GLM_FUNC_QUALIFIER typename detail::tvec4<valType>::bool_type greaterThan +//( +// detail::tvec4<valType> const & x, +// detail::tvec4<valType> const & y +//) +//{ +// GLM_STATIC_ASSERT( +// detail::type<valType>::is_float || +// detail::type<valType>::is_int || +// detail::type<valType>::is_uint); +// +// return typename detail::tvec4<bool>::bool_type(x.x > y.x, x.y > y.y, x.z > y.z, x.w > y.w); +//} +// +//// greaterThanEqual +//template <typename valType> +//GLM_FUNC_QUALIFIER typename detail::tvec2<valType>::bool_type greaterThanEqual +//( +// detail::tvec2<valType> const & x, +// detail::tvec2<valType> const & y +//) +//{ +// GLM_STATIC_ASSERT( +// detail::type<valType>::is_float || +// detail::type<valType>::is_int || +// detail::type<valType>::is_uint); +// +// return typename detail::tvec2<bool>::bool_type(x.x >= y.x, x.y >= y.y); +//} +// +//template <typename valType> +//GLM_FUNC_QUALIFIER typename detail::tvec3<valType>::bool_type greaterThanEqual +//( +// detail::tvec3<valType> const & x, +// detail::tvec3<valType> const & y +//) +//{ +// GLM_STATIC_ASSERT( +// detail::type<valType>::is_float || +// detail::type<valType>::is_int || +// detail::type<valType>::is_uint); +// +// return typename detail::tvec3<bool>::bool_type(x.x >= y.x, x.y >= y.y, x.z >= y.z); +//} +// +//template <typename valType> +//GLM_FUNC_QUALIFIER typename detail::tvec4<valType>::bool_type greaterThanEqual +//( +// detail::tvec4<valType> const & x, +// detail::tvec4<valType> const & y +//) +//{ +// GLM_STATIC_ASSERT( +// detail::type<valType>::is_float || +// detail::type<valType>::is_int || +// detail::type<valType>::is_uint); +// +// return typename detail::tvec4<bool>::bool_type(x.x >= y.x, x.y >= y.y, x.z >= y.z, x.w >= y.w); +//} +// +//// equal +//template <typename valType> +//GLM_FUNC_QUALIFIER typename detail::tvec2<valType>::bool_type equal +//( +// detail::tvec2<valType> const & x, +// detail::tvec2<valType> const & y +//) +//{ +// GLM_STATIC_ASSERT( +// detail::type<valType>::is_float || +// detail::type<valType>::is_int || +// detail::type<valType>::is_uint || +// detail::type<valType>::is_bool); +// +// return typename detail::tvec2<valType>::bool_type(x.x == y.x, x.y == y.y); +//} +// +//template <typename valType> +//GLM_FUNC_QUALIFIER typename detail::tvec3<valType>::bool_type equal +//( +// detail::tvec3<valType> const & x, +// detail::tvec3<valType> const & y +//) +//{ +// GLM_STATIC_ASSERT( +// detail::type<valType>::is_float || +// detail::type<valType>::is_int || +// detail::type<valType>::is_uint || +// detail::type<valType>::is_bool); +// +// return typename detail::tvec3<valType>::bool_type(x.x == y.x, x.y == y.y, x.z == y.z); +//} +// +//template <typename valType> +//GLM_FUNC_QUALIFIER typename detail::tvec4<valType>::bool_type equal +//( +// detail::tvec4<valType> const & x, +// detail::tvec4<valType> const & y +//) +//{ +// GLM_STATIC_ASSERT( +// detail::type<valType>::is_float || +// detail::type<valType>::is_int || +// detail::type<valType>::is_uint || +// detail::type<valType>::is_bool); +// +// return typename detail::tvec4<valType>::bool_type(x.x == y.x, x.y == y.y, x.z == y.z, x.w == y.w); +//} +// +//// notEqual +//template <typename valType> +//GLM_FUNC_QUALIFIER typename detail::tvec2<valType>::bool_type notEqual +//( +// detail::tvec2<valType> const & x, +// detail::tvec2<valType> const & y +//) +//{ +// GLM_STATIC_ASSERT( +// detail::type<valType>::is_float || +// detail::type<valType>::is_int || +// detail::type<valType>::is_uint || +// detail::type<valType>::is_bool); +// +// return typename detail::tvec2<valType>::bool_type(x.x != y.x, x.y != y.y); +//} +// +//template <typename valType> +//GLM_FUNC_QUALIFIER typename detail::tvec3<valType>::bool_type notEqual +//( +// detail::tvec3<valType> const & x, +// detail::tvec3<valType> const & y +//) +//{ +// GLM_STATIC_ASSERT( +// detail::type<valType>::is_float || +// detail::type<valType>::is_int || +// detail::type<valType>::is_uint || +// detail::type<valType>::is_bool); +// +// return typename detail::tvec3<valType>::bool_type(x.x != y.x, x.y != y.y, x.z != y.z); +//} +// +//template <typename valType> +//GLM_FUNC_QUALIFIER typename detail::tvec4<valType>::bool_type notEqual +//( +// detail::tvec4<valType> const & x, +// detail::tvec4<valType> const & y +//) +//{ +// GLM_STATIC_ASSERT( +// detail::type<valType>::is_float || +// detail::type<valType>::is_int || +// detail::type<valType>::is_uint || +// detail::type<valType>::is_bool); +// +// return typename detail::tvec4<valType>::bool_type(x.x != y.x, x.y != y.y, x.z != y.z, x.w != y.w); +//} +// +//// any +//GLM_FUNC_QUALIFIER bool any(detail::tvec2<bool> const & x) +//{ +// return x.x || x.y; +//} +// +//GLM_FUNC_QUALIFIER bool any(detail::tvec3<bool> const & x) +//{ +// return x.x || x.y || x.z; +//} +// +//GLM_FUNC_QUALIFIER bool any(detail::tvec4<bool> const & x) +//{ +// return x.x || x.y || x.z || x.w; +//} +// +//// all +//GLM_FUNC_QUALIFIER bool all(const detail::tvec2<bool>& x) +//{ +// return x.x && x.y; +//} +// +//GLM_FUNC_QUALIFIER bool all(const detail::tvec3<bool>& x) +//{ +// return x.x && x.y && x.z; +//} +// +//GLM_FUNC_QUALIFIER bool all(const detail::tvec4<bool>& x) +//{ +// return x.x && x.y && x.z && x.w; +//} +// +//// not +//GLM_FUNC_QUALIFIER detail::tvec2<bool>::bool_type not_ +//( +// detail::tvec2<bool> const & v +//) +//{ +// return detail::tvec2<bool>::bool_type(!v.x, !v.y); +//} +// +//GLM_FUNC_QUALIFIER detail::tvec3<bool>::bool_type not_ +//( +// detail::tvec3<bool> const & v +//) +//{ +// return detail::tvec3<bool>::bool_type(!v.x, !v.y, !v.z); +//} +// +//GLM_FUNC_QUALIFIER detail::tvec4<bool>::bool_type not_ +//( +// detail::tvec4<bool> const & v +//) +//{ +// return detail::tvec4<bool>::bool_type(!v.x, !v.y, !v.z, !v.w); +//}
\ No newline at end of file diff --git a/include/gal/opengl/glm/core/setup.hpp b/include/gal/opengl/glm/core/setup.hpp new file mode 100644 index 0000000..95020ea --- /dev/null +++ b/include/gal/opengl/glm/core/setup.hpp @@ -0,0 +1,694 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/setup.hpp +/// @date 2006-11-13 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_setup +#define glm_setup + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Version + +#define GLM_VERSION 94 +#define GLM_VERSION_MAJOR 0 +#define GLM_VERSION_MINOR 9 +#define GLM_VERSION_PATCH 4 +#define GLM_VERSION_REVISION 7 + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Platform + +#define GLM_PLATFORM_UNKNOWN 0x00000000 +#define GLM_PLATFORM_WINDOWS 0x00010000 +#define GLM_PLATFORM_LINUX 0x00020000 +#define GLM_PLATFORM_APPLE 0x00040000 +//#define GLM_PLATFORM_IOS 0x00080000 +#define GLM_PLATFORM_ANDROID 0x00100000 +#define GLM_PLATFORM_CHROME_NACL 0x00200000 +#define GLM_PLATFORM_UNIX 0x00400000 +#define GLM_PLATFORM_QNXNTO 0x00800000 +#define GLM_PLATFORM_WINCE 0x01000000 + +#ifdef GLM_FORCE_PLATFORM_UNKNOWN +# define GLM_PLATFORM GLM_PLATFORM_UNKNOWN +#elif defined(__QNXNTO__) +# define GLM_PLATFORM GLM_PLATFORM_QNXNTO +#elif defined(__APPLE__) +# define GLM_PLATFORM GLM_PLATFORM_APPLE +#elif defined(WINCE) +# define GLM_PLATFORM GLM_PLATFORM_WINCE +#elif defined(_WIN32) +# define GLM_PLATFORM GLM_PLATFORM_WINDOWS +#elif defined(__native_client__) +# define GLM_PLATFORM GLM_PLATFORM_CHROME_NACL +#elif defined(__ANDROID__) +# define GLM_PLATFORM GLM_PLATFORM_ANDROID +#elif defined(__linux) +# define GLM_PLATFORM GLM_PLATFORM_LINUX +#elif defined(__unix) +# define GLM_PLATFORM GLM_PLATFORM_UNIX +#else +# define GLM_PLATFORM GLM_PLATFORM_UNKNOWN +#endif// + +// Report platform detection +#if(defined(GLM_MESSAGES) && !defined(GLM_MESSAGE_PLATFORM_DISPLAYED)) +# define GLM_MESSAGE_PLATFORM_DISPLAYED +# if(GLM_PLATFORM & GLM_PLATFORM_QNXNTO) +# pragma message("GLM: QNX platform detected") +//# elif(GLM_PLATFORM & GLM_PLATFORM_IOS) +//# pragma message("GLM: iOS platform detected") +# elif(GLM_PLATFORM & GLM_PLATFORM_APPLE) +# pragma message("GLM: Apple platform detected") +# elif(GLM_PLATFORM & GLM_PLATFORM_WINCE) +# pragma message("GLM: WinCE platform detected") +# elif(GLM_PLATFORM & GLM_PLATFORM_WINDOWS) +# pragma message("GLM: Windows platform detected") +# elif(GLM_PLATFORM & GLM_PLATFORM_CHROME_NACL) +# pragma message("GLM: Native Client detected") +# elif(GLM_PLATFORM & GLM_PLATFORM_ANDROID) +# pragma message("GLM: Android platform detected") +# elif(GLM_PLATFORM & GLM_PLATFORM_LINUX) +# pragma message("GLM: Linux platform detected") +# elif(GLM_PLATFORM & GLM_PLATFORM_UNIX) +# pragma message("GLM: UNIX platform detected") +# elif(GLM_PLATFORM & GLM_PLATFORM_UNKNOWN) +# pragma message("GLM: platform unknown") +# else +# pragma message("GLM: platform not detected") +# endif +#endif//GLM_MESSAGE + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Compiler + +// User defines: GLM_FORCE_COMPILER_UNKNOWN +// TODO ? __llvm__ + +#define GLM_COMPILER_UNKNOWN 0x00000000 + +// Intel +#define GLM_COMPILER_INTEL 0x00100000 +#define GLM_COMPILER_INTEL9 0x00100010 +#define GLM_COMPILER_INTEL10_0 0x00100020 +#define GLM_COMPILER_INTEL10_1 0x00100030 +#define GLM_COMPILER_INTEL11_0 0x00100040 +#define GLM_COMPILER_INTEL11_1 0x00100050 +#define GLM_COMPILER_INTEL12_0 0x00100060 +#define GLM_COMPILER_INTEL12_1 0x00100070 +#define GLM_COMPILER_INTEL13_0 0x00100080 + +// Visual C++ defines +#define GLM_COMPILER_VC 0x01000000 +#define GLM_COMPILER_VC2 0x01000010 +#define GLM_COMPILER_VC4 0x01000020 +#define GLM_COMPILER_VC5 0x01000030 +#define GLM_COMPILER_VC6 0x01000040 +#define GLM_COMPILER_VC2002 0x01000050 +#define GLM_COMPILER_VC2003 0x01000060 +#define GLM_COMPILER_VC2005 0x01000070 +#define GLM_COMPILER_VC2008 0x01000080 +#define GLM_COMPILER_VC2010 0x01000090 +#define GLM_COMPILER_VC2012 0x010000A0 +#define GLM_COMPILER_VC2013 0x010000B0 + +// GCC defines +#define GLM_COMPILER_GCC 0x02000000 +#define GLM_COMPILER_GCC_LLVM 0x02000001 +#define GLM_COMPILER_GCC_CLANG 0x02000002 +#define GLM_COMPILER_GCC30 0x02000010 +#define GLM_COMPILER_GCC31 0x02000020 +#define GLM_COMPILER_GCC32 0x02000030 +#define GLM_COMPILER_GCC33 0x02000040 +#define GLM_COMPILER_GCC34 0x02000050 +#define GLM_COMPILER_GCC35 0x02000060 +#define GLM_COMPILER_GCC40 0x02000070 +#define GLM_COMPILER_GCC41 0x02000080 +#define GLM_COMPILER_GCC42 0x02000090 +#define GLM_COMPILER_GCC43 0x020000A0 +#define GLM_COMPILER_GCC44 0x020000B0 +#define GLM_COMPILER_GCC45 0x020000C0 +#define GLM_COMPILER_GCC46 0x020000D0 +#define GLM_COMPILER_GCC47 0x020000E0 +#define GLM_COMPILER_GCC48 0x020000F0 +#define GLM_COMPILER_GCC49 0x02000100 + +// G++ command line to display defined +// echo "" | g++ -E -dM -x c++ - | sort + +// Borland C++ defines. How to identify BC? +#define GLM_COMPILER_BC 0x04000000 +#define GLM_COMPILER_BCB4 0x04000100 +#define GLM_COMPILER_BCB5 0x04000200 +#define GLM_COMPILER_BCB6 0x04000300 +//#define GLM_COMPILER_BCBX 0x04000400 // What's the version value? +#define GLM_COMPILER_BCB2009 0x04000500 + +// CodeWarrior +#define GLM_COMPILER_CODEWARRIOR 0x08000000 + +// CUDA +#define GLM_COMPILER_CUDA 0x10000000 +#define GLM_COMPILER_CUDA30 0x10000010 +#define GLM_COMPILER_CUDA31 0x10000020 +#define GLM_COMPILER_CUDA32 0x10000030 +#define GLM_COMPILER_CUDA40 0x10000040 +#define GLM_COMPILER_CUDA41 0x10000050 +#define GLM_COMPILER_CUDA42 0x10000060 + +// Clang +#define GLM_COMPILER_CLANG 0x20000000 +#define GLM_COMPILER_CLANG26 0x20000010 +#define GLM_COMPILER_CLANG27 0x20000020 +#define GLM_COMPILER_CLANG28 0x20000030 +#define GLM_COMPILER_CLANG29 0x20000040 +#define GLM_COMPILER_CLANG30 0x20000050 +#define GLM_COMPILER_CLANG31 0x20000060 +#define GLM_COMPILER_CLANG32 0x20000070 +#define GLM_COMPILER_CLANG33 0x20000080 +#define GLM_COMPILER_CLANG40 0x20000090 +#define GLM_COMPILER_CLANG41 0x200000A0 +#define GLM_COMPILER_CLANG42 0x200000B0 +#define GLM_COMPILER_CLANG43 0x200000C0 + +// LLVM GCC +#define GLM_COMPILER_LLVM_GCC 0x40000000 + +// Build model +#define GLM_MODEL_32 0x00000010 +#define GLM_MODEL_64 0x00000020 + +// Force generic C++ compiler +#ifdef GLM_FORCE_COMPILER_UNKNOWN +# define GLM_COMPILER GLM_COMPILER_UNKNOWN + +#elif defined(__INTEL_COMPILER) +# if __INTEL_COMPILER == 900 +# define GLM_COMPILER GLM_COMPILER_INTEL9 +# elif __INTEL_COMPILER == 1000 +# define GLM_COMPILER GLM_COMPILER_INTEL10_0 +# elif __INTEL_COMPILER == 1010 +# define GLM_COMPILER GLM_COMPILER_INTEL10_1 +# elif __INTEL_COMPILER == 1100 +# define GLM_COMPILER GLM_COMPILER_INTEL11_0 +# elif __INTEL_COMPILER == 1110 +# define GLM_COMPILER GLM_COMPILER_INTEL11_1 +# elif __INTEL_COMPILER == 1200 +# define GLM_COMPILER GLM_COMPILER_INTEL12_0 +# elif __INTEL_COMPILER == 1210 +# define GLM_COMPILER GLM_COMPILER_INTEL12_1 +# elif __INTEL_COMPILER >= 1300 +# define GLM_COMPILER GLM_COMPILER_INTEL13_0 +# else +# define GLM_COMPILER GLM_COMPILER_INTEL +# endif + +// CUDA +#elif defined(__CUDACC__) +# if CUDA_VERSION < 3000 +# error "GLM requires CUDA 3.0 or higher" +# else +# define GLM_COMPILER GLM_COMPILER_CUDA +# endif + +// Visual C++ +#elif defined(_MSC_VER) +# if _MSC_VER < 1400 +# error "GLM requires Visual C++ 2005 or higher" +# elif _MSC_VER == 1400 +# define GLM_COMPILER GLM_COMPILER_VC2005 +# elif _MSC_VER == 1500 +# define GLM_COMPILER GLM_COMPILER_VC2008 +# elif _MSC_VER == 1600 +# define GLM_COMPILER GLM_COMPILER_VC2010 +# elif _MSC_VER == 1700 +# define GLM_COMPILER GLM_COMPILER_VC2012 +# elif _MSC_VER >= 1800 +# define GLM_COMPILER GLM_COMPILER_VC2013 +# else//_MSC_VER +# define GLM_COMPILER GLM_COMPILER_VC +# endif//_MSC_VER + +// Clang +#elif defined(__clang__) +# if (__clang_major__ <= 1) || ((__clang_major__ == 2) && (__clang_minor__ < 6)) +# error "GLM requires Clang 2.6 or higher" +# elif(__clang_major__ == 2) && (__clang_minor__ == 6) +# define GLM_COMPILER GLM_COMPILER_CLANG26 +# elif(__clang_major__ == 2) && (__clang_minor__ == 7) +# define GLM_COMPILER GLM_COMPILER_CLANG27 +# elif(__clang_major__ == 2) && (__clang_minor__ == 8) +# define GLM_COMPILER GLM_COMPILER_CLANG28 +# elif(__clang_major__ == 2) && (__clang_minor__ == 9) +# define GLM_COMPILER GLM_COMPILER_CLANG29 +# elif(__clang_major__ == 3) && (__clang_minor__ == 0) +# define GLM_COMPILER GLM_COMPILER_CLANG30 +# elif(__clang_major__ == 3) && (__clang_minor__ == 1) +# define GLM_COMPILER GLM_COMPILER_CLANG31 +# elif(__clang_major__ == 3) && (__clang_minor__ == 2) +# define GLM_COMPILER GLM_COMPILER_CLANG32 +# elif(__clang_major__ == 3) && (__clang_minor__ == 3) +# define GLM_COMPILER GLM_COMPILER_CLANG33 +# elif(__clang_major__ == 4) && (__clang_minor__ == 0) +# define GLM_COMPILER GLM_COMPILER_CLANG40 +# elif(__clang_major__ == 4) && (__clang_minor__ == 1) +# define GLM_COMPILER GLM_COMPILER_CLANG41 +# elif(__clang_major__ == 4) && (__clang_minor__ == 2) +# define GLM_COMPILER GLM_COMPILER_CLANG42 +# elif(__clang_major__ == 4) && (__clang_minor__ >= 3) +# define GLM_COMPILER GLM_COMPILER_CLANG43 +# elif(__clang_major__ > 4) +# define GLM_COMPILER GLM_COMPILER_CLANG43 +# else +# define GLM_COMPILER GLM_COMPILER_CLANG +# endif + +// G++ +#elif(defined(__GNUC__) || defined(__MINGW32__))// || defined(__llvm__) || defined(__clang__) +# if (__GNUC__ == 3) && (__GNUC_MINOR__ == 2) +# define GLM_COMPILER GLM_COMPILER_GCC32 +# elif (__GNUC__ == 3) && (__GNUC_MINOR__ == 3) +# define GLM_COMPILER GLM_COMPILER_GCC33 +# elif (__GNUC__ == 3) && (__GNUC_MINOR__ == 4) +# define GLM_COMPILER GLM_COMPILER_GCC34 +# elif (__GNUC__ == 3) && (__GNUC_MINOR__ == 5) +# define GLM_COMPILER GLM_COMPILER_GCC35 +# elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 0) +# define GLM_COMPILER (GLM_COMPILER_GCC40) +# elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 1) +# define GLM_COMPILER (GLM_COMPILER_GCC41) +# elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 2) +# define GLM_COMPILER (GLM_COMPILER_GCC42) +# elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 3) +# define GLM_COMPILER (GLM_COMPILER_GCC43) +# elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 4) +# define GLM_COMPILER (GLM_COMPILER_GCC44) +# elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 5) +# define GLM_COMPILER (GLM_COMPILER_GCC45) +# elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 6) +# define GLM_COMPILER (GLM_COMPILER_GCC46) +# elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 7) +# define GLM_COMPILER (GLM_COMPILER_GCC47) +# elif (__GNUC__ == 4) && (__GNUC_MINOR__ == 8) +# define GLM_COMPILER (GLM_COMPILER_GCC48) +# elif (__GNUC__ == 4) && (__GNUC_MINOR__ >= 9) +# define GLM_COMPILER (GLM_COMPILER_GCC49) +# elif (__GNUC__ > 4 ) +# define GLM_COMPILER (GLM_COMPILER_GCC49) +# else +# define GLM_COMPILER (GLM_COMPILER_GCC) +# endif + +// Borland C++ +#elif defined(_BORLANDC_) +# define GLM_COMPILER GLM_COMPILER_BC + +// Codewarrior +#elif defined(__MWERKS__) +# define GLM_COMPILER GLM_COMPILER_CODEWARRIOR + +#else +# define GLM_COMPILER GLM_COMPILER_UNKNOWN +#endif + +#ifndef GLM_COMPILER +#error "GLM_COMPILER undefined, your compiler may not be supported by GLM. Add #define GLM_COMPILER 0 to ignore this message." +#endif//GLM_COMPILER + +// Report compiler detection +#if(defined(GLM_MESSAGES) && !defined(GLM_MESSAGE_COMPILER_DISPLAYED)) +# define GLM_MESSAGE_COMPILER_DISPLAYED +# if(GLM_COMPILER & GLM_COMPILER_CUDA) +# pragma message("GLM: CUDA compiler detected") +# elif(GLM_COMPILER & GLM_COMPILER_VC) +# pragma message("GLM: Visual C++ compiler detected") +# elif(GLM_COMPILER & GLM_COMPILER_CLANG) +# pragma message("GLM: Clang compiler detected") +# elif(GLM_COMPILER & GLM_COMPILER_LLVM_GCC) +# pragma message("GLM: LLVM GCC compiler detected") +# elif(GLM_COMPILER & GLM_COMPILER_GCC) +# if(GLM_COMPILER == GLM_COMPILER_GCC_LLVM) +# pragma message("GLM: LLVM GCC compiler detected") +# elif(GLM_COMPILER == GLM_COMPILER_GCC_CLANG) +# pragma message("GLM: CLANG compiler detected") +# else +# pragma message("GLM: GCC compiler detected") +# endif +# elif(GLM_COMPILER & GLM_COMPILER_BC) +# pragma message("GLM: Borland compiler detected but not supported") +# elif(GLM_COMPILER & GLM_COMPILER_CODEWARRIOR) +# pragma message("GLM: Codewarrior compiler detected but not supported") +# else +# pragma message("GLM: Compiler not detected") +# endif +#endif//GLM_MESSAGE + +///////////////// +// Build model // + +#if(defined(__arch64__) || defined(__LP64__) || defined(_M_X64) || defined(__ppc64__) || defined(__x86_64__)) +# define GLM_MODEL GLM_MODEL_64 +#elif(defined(__i386__) || defined(__ppc__)) +# define GLM_MODEL GLM_MODEL_32 +#else +# define GLM_MODEL GLM_MODEL_32 +#endif// + +#if(!defined(GLM_MODEL) && GLM_COMPILER != 0) +# error "GLM_MODEL undefined, your compiler may not be supported by GLM. Add #define GLM_MODEL 0 to ignore this message." +#endif//GLM_MODEL + +#if(defined(GLM_MESSAGES) && !defined(GLM_MESSAGE_MODEL_DISPLAYED)) +# define GLM_MESSAGE_MODEL_DISPLAYED +# if(GLM_MODEL == GLM_MODEL_64) +# pragma message("GLM: 64 bits model") +# elif(GLM_MODEL == GLM_MODEL_32) +# pragma message("GLM: 32 bits model") +# endif//GLM_MODEL +#endif//GLM_MESSAGE + +///////////////// +// C++ Version // + +// User defines: GLM_FORCE_CXX98 + +#define GLM_LANG_CXX (0 << 0) +#define GLM_LANG_CXX98 ((1 << 1) | GLM_LANG_CXX) +#define GLM_LANG_CXX03 ((1 << 2) | GLM_LANG_CXX98) +#define GLM_LANG_CXX0X ((1 << 3) | GLM_LANG_CXX03) +#define GLM_LANG_CXX11 ((1 << 4) | GLM_LANG_CXX0X) +#define GLM_LANG_CXXMS (1 << 5) +#define GLM_LANG_CXXGNU (1 << 6) + +#if(defined(GLM_FORCE_CXX11)) +# define GLM_LANG GLM_LANG_CXX11 +#elif(defined(GLM_FORCE_CXX03)) +# define GLM_LANG GLM_LANG_CXX03 +#elif(defined(GLM_FORCE_CXX98)) +# define GLM_LANG GLM_LANG_CXX98 +#else +# if(__cplusplus >= 201103L) +# define GLM_LANG GLM_LANG_CXX11 +# elif((GLM_COMPILER & GLM_COMPILER_CLANG) == GLM_COMPILER_CLANG) +# if(GLM_PLATFORM == GLM_PLATFORM_APPLE) +# define GLM_DETAIL_MAJOR 1 +# else +# define GLM_DETAIL_MAJOR 0 +# endif +# if(__clang_major__ < (2 + GLM_DETAIL_MAJOR)) +# define GLM_LANG GLM_LANG_CXX +# elif(__has_feature(cxx_auto_type)) +# define GLM_LANG GLM_LANG_CXX0X +# else +# define GLM_LANG GLM_LANG_CXX98 +# endif +# elif((GLM_COMPILER & GLM_COMPILER_GCC) == GLM_COMPILER_GCC) +# if defined(__GXX_EXPERIMENTAL_CXX0X__) +# define GLM_LANG GLM_LANG_CXX0X +# else +# define GLM_LANG GLM_LANG_CXX98 +# endif +# elif(((GLM_COMPILER & GLM_COMPILER_VC) == GLM_COMPILER_VC) && defined(_MSC_EXTENSIONS)) +# define GLM_LANG GLM_LANG_CXXMS +# elif(((GLM_COMPILER & GLM_COMPILER_VC) == GLM_COMPILER_VC) && !defined(_MSC_EXTENSIONS)) +# if(GLM_COMPILER >= GLM_COMPILER_VC2010) +# define GLM_LANG GLM_LANG_CXX0X +# else +# define GLM_LANG GLM_LANG_CXX98 +# endif +# elif(__cplusplus >= 199711L) +# define GLM_LANG GLM_LANG_CXX98 +# else +# define GLM_LANG GLM_LANG_CXX +# endif +#endif + +#if(defined(GLM_MESSAGES) && !defined(GLM_MESSAGE_LANG_DISPLAYED)) +# define GLM_MESSAGE_LANG_DISPLAYED +# if(GLM_LANG == GLM_LANG_CXX98) +# pragma message("GLM: C++98") +# elif(GLM_LANG == GLM_LANG_CXX03) +# pragma message("GLM: C++03") +# elif(GLM_LANG == GLM_LANG_CXX0X) +# pragma message("GLM: C++0x") +# elif(GLM_LANG == GLM_LANG_CXX11) +# pragma message("GLM: C++11") +# elif(GLM_LANG == GLM_LANG_CXXGNU) +# pragma message("GLM: C++ with GNU language extensions") +# elif(GLM_LANG == GLM_LANG_CXXMS) +# pragma message("GLM: C++ with VC language extensions") +# else +# pragma message("GLM: C++ language undetected") +# endif//GLM_MODEL +#endif//GLM_MESSAGE + +///////////////// +// Platform + +// User defines: GLM_FORCE_PURE GLM_FORCE_SSE2 GLM_FORCE_AVX + +#define GLM_ARCH_PURE 0x0000 +#define GLM_ARCH_SSE2 0x0001 +#define GLM_ARCH_SSE3 0x0002// | GLM_ARCH_SSE2 +#define GLM_ARCH_SSE4 0x0004// | GLM_ARCH_SSE3 | GLM_ARCH_SSE2 +#define GLM_ARCH_AVX 0x0008// | GLM_ARCH_SSE4 | GLM_ARCH_SSE3 | GLM_ARCH_SSE2 +#define GLM_ARCH_AVX2 0x0010// | GLM_ARCH_AVX | GLM_ARCH_SSE4 | GLM_ARCH_SSE3 | GLM_ARCH_SSE2 + +#if(defined(GLM_FORCE_PURE)) +# define GLM_ARCH GLM_ARCH_PURE +#elif(defined(GLM_FORCE_AVX2)) +# define GLM_ARCH (GLM_ARCH_AVX2 | GLM_ARCH_AVX | GLM_ARCH_SSE3 | GLM_ARCH_SSE2) +#elif(defined(GLM_FORCE_AVX)) +# define GLM_ARCH (GLM_ARCH_AVX | GLM_ARCH_SSE3 | GLM_ARCH_SSE2) +#elif(defined(GLM_FORCE_SSE4)) +# define GLM_ARCH (GLM_ARCH_SSE4 | GLM_ARCH_SSE3 | GLM_ARCH_SSE2) +#elif(defined(GLM_FORCE_SSE3)) +# define GLM_ARCH (GLM_ARCH_SSE3 | GLM_ARCH_SSE2) +#elif(defined(GLM_FORCE_SSE2)) +# define GLM_ARCH (GLM_ARCH_SSE2) +#elif((GLM_COMPILER & GLM_COMPILER_VC) && (defined(_M_IX86) || defined(_M_X64))) +# if(GLM_PLATFORM == GLM_PLATFORM_WINCE) +# define GLM_ARCH GLM_ARCH_PURE +# elif(defined(_M_CEE_PURE)) +# define GLM_ARCH GLM_ARCH_PURE +/* TODO: Explore auto detection of instruction set support +# elif(defined(_M_IX86_FP)) +# if(_M_IX86_FP >= 3) +# define GLM_ARCH (GLM_ARCH_AVX | GLM_ARCH_SSE3 | GLM_ARCH_SSE2) +# elif(_M_IX86_FP >= 2) +# define GLM_ARCH (GLM_ARCH_SSE2) +# else +# define GLM_ARCH GLM_ARCH_PURE +# endif +*/ +# elif(GLM_COMPILER >= GLM_COMPILER_VC2012) +# define GLM_ARCH (GLM_ARCH_AVX | GLM_ARCH_SSE3 | GLM_ARCH_SSE2) +# elif(GLM_COMPILER >= GLM_COMPILER_VC2010) +# if(_MSC_FULL_VER >= 160031118) //160031118: VC2010 SP1 beta full version +# define GLM_ARCH (GLM_ARCH_AVX | GLM_ARCH_SSE3 | GLM_ARCH_SSE2)//GLM_ARCH_AVX (Require SP1) +# else +# define GLM_ARCH (GLM_ARCH_SSE3 | GLM_ARCH_SSE2) +# endif +# elif(GLM_COMPILER >= GLM_COMPILER_VC2008) +# define GLM_ARCH (GLM_ARCH_SSE3 | GLM_ARCH_SSE2) +# elif(GLM_COMPILER >= GLM_COMPILER_VC2005) +# define GLM_ARCH GLM_ARCH_SSE2 +# else +# define GLM_ARCH GLM_ARCH_PURE +# endif +#elif((GLM_PLATFORM & GLM_PLATFORM_APPLE) && (GLM_COMPILER & GLM_COMPILER_GCC)) +# define GLM_ARCH GLM_ARCH_PURE +#elif(((GLM_COMPILER & GLM_COMPILER_GCC) && (defined(__i386__) || defined(__x86_64__))) || (GLM_COMPILER & GLM_COMPILER_LLVM_GCC)) +# define GLM_ARCH (GLM_ARCH_PURE \ +| (defined(__AVX2__) ? GLM_ARCH_AVX2 : 0) \ +| (defined(__AVX__) ? GLM_ARCH_AVX : 0) \ +| (defined(__SSE4__) ? GLM_ARCH_SSE4 : 0) \ +| (defined(__SSE3__) ? GLM_ARCH_SSE3 : 0) \ +| (defined(__SSE2__) ? GLM_ARCH_SSE2 : 0)) +#else +# define GLM_ARCH GLM_ARCH_PURE +#endif + +// With MinGW-W64, including intrinsic headers before intrin.h will produce some errors. The problem is +// that windows.h (and maybe other headers) will silently include intrin.h, which of course causes problems. +// To fix, we just explicitly include intrin.h here. +#if defined(__MINGW32__) && (GLM_ARCH != GLM_ARCH_PURE) +# include <intrin.h> +#endif + +//#if(GLM_ARCH != GLM_ARCH_PURE) +#if(GLM_ARCH & GLM_ARCH_AVX2) +# include <immintrin.h> +#endif//GLM_ARCH +#if(GLM_ARCH & GLM_ARCH_AVX) +# include <immintrin.h> +#endif//GLM_ARCH +#if(GLM_ARCH & GLM_ARCH_SSE4) +# include <smmintrin.h> +#endif//GLM_ARCH +#if(GLM_ARCH & GLM_ARCH_SSE3) +# include <pmmintrin.h> +#endif//GLM_ARCH +#if(GLM_ARCH & GLM_ARCH_SSE2) +# include <emmintrin.h> +#endif//GLM_ARCH +//#endif//(GLM_ARCH != GLM_ARCH_PURE) + +#if(defined(GLM_MESSAGES) && !defined(GLM_MESSAGE_ARCH_DISPLAYED)) +# define GLM_MESSAGE_ARCH_DISPLAYED +# if(GLM_ARCH == GLM_ARCH_PURE) +# pragma message("GLM: Platform independent") +# elif(GLM_ARCH & GLM_ARCH_SSE2) +# pragma message("GLM: SSE2 instruction set") +# elif(GLM_ARCH & GLM_ARCH_SSE3) +# pragma message("GLM: SSE3 instruction set") +# elif(GLM_ARCH & GLM_ARCH_SSE4) +# pragma message("GLM: SSE4 instruction set") +# elif(GLM_ARCH & GLM_ARCH_AVX) +# pragma message("GLM: AVX instruction set") +# elif(GLM_ARCH & GLM_ARCH_AVX2) +# pragma message("GLM: AVX2 instruction set") +# endif//GLM_ARCH +#endif//GLM_MESSAGE + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Support check macros + +#define GLM_SUPPORT_ANONYMOUS_UNION() \ + ((GLM_LANG & GLM_LANG_CXX98) == GLM_LANG_CXX98) + +//#define GLM_SUPPORT_ANONYMOUS_UNION_OF_STRUCTURE() <backslash> +// (((GLM_LANG & GLM_LANG_CXX11) == GLM_LANG_CXX11) || ((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_LANG & GLM_LANG_CXXMS) == GLM_LANG_CXXMS) || ((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_LANG == GLM_LANG_CXX0X))) + +#define GLM_SUPPORT_ANONYMOUS_UNION_OF_STRUCTURE() \ + (((GLM_LANG & GLM_LANG_CXX11) == GLM_LANG_CXX11) || ((GLM_COMPILER & GLM_COMPILER_VC) && ((GLM_LANG & GLM_LANG_CXXMS) == GLM_LANG_CXXMS)) || ((GLM_LANG == GLM_LANG_CXX0X) == GLM_LANG_CXX0X)) + +#define GLM_SUPPORT_SWIZZLE_OPERATOR() \ + (/*defined(GLM_SWIZZLE) && */GLM_SUPPORT_ANONYMOUS_UNION_OF_STRUCTURE()) + +#define GLM_SUPPORT_SWIZZLE_FUNCTION() defined(GLM_SWIZZLE) + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Components + +//#define GLM_FORCE_ONLY_XYZW +#define GLM_COMPONENT_ONLY_XYZW 0 // To disable multiple vector component names access. +#define GLM_COMPONENT_CXX98 1 // +#define GLM_COMPONENT_CXX11 2 // To use anonymous union to provide multiple component names access for class valType. Visual C++ only. + +#if(GLM_SUPPORT_ANONYMOUS_UNION_OF_STRUCTURE() && !defined(GLM_FORCE_ONLY_XYZW)) +# define GLM_COMPONENT GLM_COMPONENT_CXX11 +#elif(GLM_SUPPORT_ANONYMOUS_UNION() && !defined(GLM_FORCE_ONLY_XYZW)) +# define GLM_COMPONENT GLM_COMPONENT_CXX98 +#else +# define GLM_COMPONENT GLM_COMPONENT_ONLY_XYZW +#endif + +#if(defined(GLM_MESSAGES) && !defined(GLM_MESSAGE_COMPONENT_DISPLAYED)) +# define GLM_MESSAGE_COMPONENT_DISPLAYED +# if(GLM_COMPONENT == GLM_COMPONENT_CXX98) +# pragma message("GLM: x,y,z,w; r,g,b,a; s,t,p,q component names except of half based vector types") +# elif(GLM_COMPONENT == GLM_COMPONENT_ONLY_XYZW) +# pragma message("GLM: x,y,z,w component names for all vector types") +# elif(GLM_COMPONENT == GLM_COMPONENT_CXX11) +# pragma message("GLM: x,y,z,w; r,g,b,a; s,t,p,q component names for all vector types") +# else +# error "GLM: GLM_COMPONENT value unknown" +# endif//GLM_MESSAGE_COMPONENT_DISPLAYED +#endif//GLM_MESSAGE + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Radians + +//#define GLM_FORCE_RADIANS + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Static assert + +#if(GLM_LANG == GLM_LANG_CXX0X) +# define GLM_STATIC_ASSERT(x, message) static_assert(x, message) +#elif(defined(BOOST_STATIC_ASSERT)) +# define GLM_STATIC_ASSERT(x, message) BOOST_STATIC_ASSERT(x) +#elif(GLM_COMPILER & GLM_COMPILER_VC) +# define GLM_STATIC_ASSERT(x, message) typedef char __CASSERT__##__LINE__[(x) ? 1 : -1] +#else +# define GLM_STATIC_ASSERT(x, message) +# define GLM_STATIC_ASSERT_NULL +#endif//GLM_LANG + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Qualifiers + +// User defines: GLM_FORCE_INLINE GLM_FORCE_CUDA + +#if(defined(GLM_FORCE_CUDA) || (GLM_COMPILER & GLM_COMPILER_CUDA)) +# define GLM_CUDA_FUNC_DEF __device__ __host__ +# define GLM_CUDA_FUNC_DECL __device__ __host__ +#else +# define GLM_CUDA_FUNC_DEF +# define GLM_CUDA_FUNC_DECL +#endif + +#if GLM_COMPILER & GLM_COMPILER_GCC +# define GLM_VAR_USED __attribute__ ((unused)) +#else +# define GLM_VAR_USED +#endif + +#if(defined(GLM_FORCE_INLINE)) +# if((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2005)) +# define GLM_INLINE __forceinline +# elif((GLM_COMPILER & GLM_COMPILER_GCC) && (GLM_COMPILER >= GLM_COMPILER_GCC34)) +# define GLM_INLINE __attribute__((always_inline)) +# elif(GLM_COMPILER & GLM_COMPILER_CLANG) +# define GLM_INLINE __attribute__((always_inline)) +# else +# define GLM_INLINE inline +# endif//GLM_COMPILER +#else +# define GLM_INLINE inline +#endif//defined(GLM_FORCE_INLINE) + +#define GLM_FUNC_DECL GLM_CUDA_FUNC_DECL +#define GLM_FUNC_QUALIFIER GLM_CUDA_FUNC_DEF GLM_INLINE + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Swizzle operators + +// User defines: GLM_SWIZZLE + +#if(defined(GLM_MESSAGES) && !defined(GLM_MESSAGE_SWIZZLE_DISPLAYED)) +# define GLM_MESSAGE_SWIZZLE_DISPLAYED +# if(GLM_SUPPORT_SWIZZLE_OPERATOR()) +# pragma message("GLM: Swizzling operators enabled") +# elif(GLM_SUPPORT_SWIZZLE_FUNCTION()) +# pragma message("GLM: Swizzling operators supported through swizzling functions") +# else +# pragma message("GLM: Swizzling operators disabled") +# endif +#endif//GLM_MESSAGE + +#endif//glm_setup diff --git a/include/gal/opengl/glm/core/type.hpp b/include/gal/opengl/glm/core/type.hpp new file mode 100644 index 0000000..6361e2e --- /dev/null +++ b/include/gal/opengl/glm/core/type.hpp @@ -0,0 +1,341 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/type.hpp +/// @date 2008-01-08 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_type +#define glm_core_type + +#include "type_half.hpp" +#include "type_float.hpp" +#include "type_int.hpp" + +#include "type_gentype.hpp" + +#include "type_vec1.hpp" +#include "type_vec2.hpp" +#include "type_vec3.hpp" +#include "type_vec4.hpp" + +#include "type_mat2x2.hpp" +#include "type_mat2x3.hpp" +#include "type_mat2x4.hpp" +#include "type_mat3x2.hpp" +#include "type_mat3x3.hpp" +#include "type_mat3x4.hpp" +#include "type_mat4x2.hpp" +#include "type_mat4x3.hpp" +#include "type_mat4x4.hpp" + +namespace glm +{ + /// @addtogroup core_types + /// @{ + + ////////////////////////// + // Float definition + +#if(defined(GLM_PRECISION_HIGHP_FLOAT)) + typedef highp_vec2 vec2; + typedef highp_vec3 vec3; + typedef highp_vec4 vec4; + typedef highp_mat2x2 mat2x2; + typedef highp_mat2x3 mat2x3; + typedef highp_mat2x4 mat2x4; + typedef highp_mat3x2 mat3x2; + typedef highp_mat3x3 mat3x3; + typedef highp_mat3x4 mat3x4; + typedef highp_mat4x2 mat4x2; + typedef highp_mat4x3 mat4x3; + typedef highp_mat4x4 mat4x4; +#elif(defined(GLM_PRECISION_MEDIUMP_FLOAT)) + typedef mediump_vec2 vec2; + typedef mediump_vec3 vec3; + typedef mediump_vec4 vec4; + typedef mediump_mat2x2 mat2x2; + typedef mediump_mat2x3 mat2x3; + typedef mediump_mat2x4 mat2x4; + typedef mediump_mat3x2 mat3x2; + typedef mediump_mat3x3 mat3x3; + typedef mediump_mat3x4 mat3x4; + typedef mediump_mat4x2 mat4x2; + typedef mediump_mat4x3 mat4x3; + typedef mediump_mat4x4 mat4x4; +#elif(defined(GLM_PRECISION_LOWP_FLOAT)) + typedef lowp_vec2 vec2; + typedef lowp_vec3 vec3; + typedef lowp_vec4 vec4; + typedef lowp_mat2x2 mat2x2; + typedef lowp_mat2x3 mat2x3; + typedef lowp_mat2x4 mat2x4; + typedef lowp_mat3x2 mat3x2; + typedef lowp_mat3x3 mat3x3; + typedef lowp_mat3x4 mat3x4; + typedef lowp_mat4x2 mat4x2; + typedef lowp_mat4x3 mat4x3; + typedef lowp_mat4x4 mat4x4; +#else + /// 2 components vector of floating-point numbers. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + typedef mediump_vec2 vec2; + + //! 3 components vector of floating-point numbers. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + typedef mediump_vec3 vec3; + + //! 4 components vector of floating-point numbers. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + typedef mediump_vec4 vec4; + + //! 2 columns of 2 components matrix of floating-point numbers. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + typedef mediump_mat2x2 mat2x2; + + //! 2 columns of 3 components matrix of floating-point numbers. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + typedef mediump_mat2x3 mat2x3; + + //! 2 columns of 4 components matrix of floating-point numbers. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + typedef mediump_mat2x4 mat2x4; + + //! 3 columns of 2 components matrix of floating-point numbers. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + typedef mediump_mat3x2 mat3x2; + + //! 3 columns of 3 components matrix of floating-point numbers. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + typedef mediump_mat3x3 mat3x3; + + //! 3 columns of 4 components matrix of floating-point numbers. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + typedef mediump_mat3x4 mat3x4; + + //! 4 columns of 2 components matrix of floating-point numbers. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + typedef mediump_mat4x2 mat4x2; + + //! 4 columns of 3 components matrix of floating-point numbers. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + typedef mediump_mat4x3 mat4x3; + + //! 4 columns of 4 components matrix of floating-point numbers. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + typedef mediump_mat4x4 mat4x4; + +#endif//GLM_PRECISION + + //! 2 columns of 2 components matrix of floating-point numbers. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + typedef mat2x2 mat2; + + //! 3 columns of 3 components matrix of floating-point numbers. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + typedef mat3x3 mat3; + + //! 4 columns of 4 components matrix of floating-point numbers. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + typedef mat4x4 mat4; + + ////////////////////////// + // Signed integer definition + +#if(defined(GLM_PRECISION_HIGHP_INT)) + typedef highp_ivec2 ivec2; + typedef highp_ivec3 ivec3; + typedef highp_ivec4 ivec4; +#elif(defined(GLM_PRECISION_MEDIUMP_INT)) + typedef mediump_ivec2 ivec2; + typedef mediump_ivec3 ivec3; + typedef mediump_ivec4 ivec4; +#elif(defined(GLM_PRECISION_LOWP_INT)) + typedef lowp_ivec2 ivec2; + typedef lowp_ivec3 ivec3; + typedef lowp_ivec4 ivec4; +#else + //! 2 components vector of signed integer numbers. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + typedef mediump_ivec2 ivec2; + + //! 3 components vector of signed integer numbers. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + typedef mediump_ivec3 ivec3; + + //! 4 components vector of signed integer numbers. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + typedef mediump_ivec4 ivec4; +#endif//GLM_PRECISION + + ////////////////////////// + // Unsigned integer definition + +#if(defined(GLM_PRECISION_HIGHP_UINT)) + typedef highp_uvec2 uvec2; + typedef highp_uvec3 uvec3; + typedef highp_uvec4 uvec4; +#elif(defined(GLM_PRECISION_MEDIUMP_UINT)) + typedef mediump_uvec2 uvec2; + typedef mediump_uvec3 uvec3; + typedef mediump_uvec4 uvec4; +#elif(defined(GLM_PRECISION_LOWP_UINT)) + typedef lowp_uvec2 uvec2; + typedef lowp_uvec3 uvec3; + typedef lowp_uvec4 uvec4; +#else + //! 2 components vector of unsigned integer numbers. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + typedef mediump_uvec2 uvec2; + + //! 3 components vector of unsigned integer numbers. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + typedef mediump_uvec3 uvec3; + + //! 4 components vector of unsigned integer numbers. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + typedef mediump_uvec4 uvec4; +#endif//GLM_PRECISION + + ////////////////////////// + // Boolean definition + + //! 2 components vector of boolean. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + typedef detail::tvec2<bool> bvec2; + + //! 3 components vector of boolean. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + typedef detail::tvec3<bool> bvec3; + + //! 4 components vector of boolean. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + typedef detail::tvec4<bool> bvec4; + + ////////////////////////// + // Double definition + + //! Vector of 2 double-precision floating-point numbers. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + typedef detail::tvec2<double> dvec2; + + //! Vector of 3 double-precision floating-point numbers. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + typedef detail::tvec3<double> dvec3; + + //! Vector of 4 double-precision floating-point numbers. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + typedef detail::tvec4<double> dvec4; + + //! 2 * 2 matrix of double-precision floating-point numbers. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + typedef detail::tmat2x2<double> dmat2; + + //! 3 * 3 matrix of double-precision floating-point numbers. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + typedef detail::tmat3x3<double> dmat3; + + //! 4 * 4 matrix of double-precision floating-point numbers. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + typedef detail::tmat4x4<double> dmat4; + + //! 2 * 2 matrix of double-precision floating-point numbers. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + typedef detail::tmat2x2<double> dmat2x2; + + //! 2 * 3 matrix of double-precision floating-point numbers. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + typedef detail::tmat2x3<double> dmat2x3; + + //! 2 * 4 matrix of double-precision floating-point numbers. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + typedef detail::tmat2x4<double> dmat2x4; + + //! 3 * 2 matrix of double-precision floating-point numbers. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + typedef detail::tmat3x2<double> dmat3x2; + + //! 3 * 3 matrix of double-precision floating-point numbers. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + typedef detail::tmat3x3<double> dmat3x3; + + //! 3 * 4 matrix of double-precision floating-point numbers. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + typedef detail::tmat3x4<double> dmat3x4; + + //! 4 * 2 matrix of double-precision floating-point numbers. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + typedef detail::tmat4x2<double> dmat4x2; + + //! 4 * 3 matrix of double-precision floating-point numbers. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + typedef detail::tmat4x3<double> dmat4x3; + + //! 4 * 4 matrix of double-precision floating-point numbers. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + typedef detail::tmat4x4<double> dmat4x4; + + /// @} +}//namespace glm + +#endif//glm_core_type diff --git a/include/gal/opengl/glm/core/type_float.hpp b/include/gal/opengl/glm/core/type_float.hpp new file mode 100644 index 0000000..095812c --- /dev/null +++ b/include/gal/opengl/glm/core/type_float.hpp @@ -0,0 +1,84 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/type_float.hpp +/// @date 2008-08-22 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_type_float +#define glm_core_type_float + +#include "type_half.hpp" +#include "setup.hpp" + +namespace glm +{ +#ifdef GLM_USE_HALF_SCALAR + typedef detail::half lowp_float_t; +#else//GLM_USE_HALF_SCALAR + typedef float lowp_float_t; +#endif//GLM_USE_HALF_SCALAR + typedef float mediump_float_t; + typedef double highp_float_t; + + /// @addtogroup core_precision + /// @{ + + /// Low precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.4 Floats</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef lowp_float_t lowp_float; + + /// Medium precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.4 Floats</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef mediump_float_t mediump_float; + + /// High precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.4 Floats</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef highp_float_t highp_float; + +#if(!defined(GLM_PRECISION_HIGHP_FLOAT) && !defined(GLM_PRECISION_MEDIUMP_FLOAT) && !defined(GLM_PRECISION_LOWP_FLOAT)) + typedef mediump_float float_t; +#elif(defined(GLM_PRECISION_HIGHP_FLOAT) && !defined(GLM_PRECISION_MEDIUMP_FLOAT) && !defined(GLM_PRECISION_LOWP_FLOAT)) + typedef highp_float float_t; +#elif(!defined(GLM_PRECISION_HIGHP_FLOAT) && defined(GLM_PRECISION_MEDIUMP_FLOAT) && !defined(GLM_PRECISION_LOWP_FLOAT)) + typedef mediump_float float_t; +#elif(!defined(GLM_PRECISION_HIGHP_FLOAT) && !defined(GLM_PRECISION_MEDIUMP_FLOAT) && defined(GLM_PRECISION_LOWP_FLOAT)) + typedef lowp_float float_t; +#else +# error "GLM error: multiple default precision requested for floating-point types" +#endif + + /// @} +}//namespace glm + +#endif//glm_core_type_float diff --git a/include/gal/opengl/glm/core/type_gentype.hpp b/include/gal/opengl/glm/core/type_gentype.hpp new file mode 100644 index 0000000..c79152a --- /dev/null +++ b/include/gal/opengl/glm/core/type_gentype.hpp @@ -0,0 +1,169 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/type_gentype.hpp +/// @date 2008-10-05 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_type_gentype +#define glm_core_type_gentype + +#include "type_size.hpp" + +namespace glm +{ + enum profile + { + nice, + fast, + simd + }; + +namespace detail +{ + template + < + typename VALTYPE, + template <typename> class TYPE + > + struct genType + { + public: + enum ctor{null}; + + typedef VALTYPE value_type; + typedef VALTYPE & value_reference; + typedef VALTYPE * value_pointer; + typedef VALTYPE const * value_const_pointer; + typedef TYPE<bool> bool_type; + + typedef sizeType size_type; + static bool is_vector(); + static bool is_matrix(); + + typedef TYPE<VALTYPE> type; + typedef TYPE<VALTYPE> * pointer; + typedef TYPE<VALTYPE> const * const_pointer; + typedef TYPE<VALTYPE> const * const const_pointer_const; + typedef TYPE<VALTYPE> * const pointer_const; + typedef TYPE<VALTYPE> & reference; + typedef TYPE<VALTYPE> const & const_reference; + typedef TYPE<VALTYPE> const & param_type; + + ////////////////////////////////////// + // Address (Implementation details) + + value_const_pointer value_address() const{return value_pointer(this);} + value_pointer value_address(){return value_pointer(this);} + + //protected: + // enum kind + // { + // GEN_TYPE, + // VEC_TYPE, + // MAT_TYPE + // }; + + // typedef typename TYPE::kind kind; + }; + + template + < + typename VALTYPE, + template <typename> class TYPE + > + bool genType<VALTYPE, TYPE>::is_vector() + { + return true; + } +/* + template <typename valTypeT, unsigned int colT, unsigned int rowT, profile proT = nice> + class base + { + public: + ////////////////////////////////////// + // Traits + + typedef sizeType size_type; + typedef valTypeT value_type; + + typedef base<value_type, colT, rowT> class_type; + + typedef base<bool, colT, rowT> bool_type; + typedef base<value_type, rowT, 1> col_type; + typedef base<value_type, colT, 1> row_type; + typedef base<value_type, rowT, colT> transpose_type; + + static size_type col_size(); + static size_type row_size(); + static size_type value_size(); + static bool is_scalar(); + static bool is_vector(); + static bool is_matrix(); + + private: + // Data + col_type value[colT]; + + public: + ////////////////////////////////////// + // Constructors + base(); + base(class_type const & m); + + explicit base(value_type const & x); + explicit base(value_type const * const x); + explicit base(col_type const * const x); + + ////////////////////////////////////// + // Conversions + template <typename vU, uint cU, uint rU, profile pU> + explicit base(base<vU, cU, rU, pU> const & m); + + ////////////////////////////////////// + // Accesses + col_type& operator[](size_type i); + col_type const & operator[](size_type i) const; + + ////////////////////////////////////// + // Unary updatable operators + class_type& operator= (class_type const & x); + class_type& operator+= (value_type const & x); + class_type& operator+= (class_type const & x); + class_type& operator-= (value_type const & x); + class_type& operator-= (class_type const & x); + class_type& operator*= (value_type const & x); + class_type& operator*= (class_type const & x); + class_type& operator/= (value_type const & x); + class_type& operator/= (class_type const & x); + class_type& operator++ (); + class_type& operator-- (); + }; +*/ + }//namespace detail +}//namespace glm + +//#include "type_gentype.inl" + +#endif//glm_core_type_gentype diff --git a/include/gal/opengl/glm/core/type_gentype.inl b/include/gal/opengl/glm/core/type_gentype.inl new file mode 100644 index 0000000..2ca7496 --- /dev/null +++ b/include/gal/opengl/glm/core/type_gentype.inl @@ -0,0 +1,366 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/type_gentype.inl +/// @date 2008-10-05 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +namespace glm{ +namespace detail{ + +///////////////////////////////// +// Static functions + +template <typename vT, uint cT, uint rT, profile pT> +typename base<vT, cT, rT, pT>::size_type base<vT, cT, rT, pT>::col_size() +{ + return cT; +} + +template <typename vT, uint cT, uint rT, profile pT> +typename base<vT, cT, rT, pT>::size_type base<vT, cT, rT, pT>::row_size() +{ + return rT; +} + +template <typename vT, uint cT, uint rT, profile pT> +typename base<vT, cT, rT, pT>::size_type base<vT, cT, rT, pT>::value_size() +{ + return rT * cT; +} + +template <typename vT, uint cT, uint rT, profile pT> +bool base<vT, cT, rT, pT>::is_scalar() +{ + return rT == 1 && cT == 1; +} + +template <typename vT, uint cT, uint rT, profile pT> +bool base<vT, cT, rT, pT>::is_vector() +{ + return rT == 1; +} + +template <typename vT, uint cT, uint rT, profile pT> +bool base<vT, cT, rT, pT>::is_matrix() +{ + return rT != 1; +} + +///////////////////////////////// +// Constructor + +template <typename vT, uint cT, uint rT, profile pT> +base<vT, cT, rT, pT>::base() +{ + memset(&this->value, 0, cT * rT * sizeof(vT)); +} + +template <typename vT, uint cT, uint rT, profile pT> +base<vT, cT, rT, pT>::base +( + typename base<vT, cT, rT, pT>::class_type const & m +) +{ + for + ( + typename genType<vT, cT, rT, pT>::size_type i = typename base<vT, cT, rT, pT>::size_type(0); + i < base<vT, cT, rT, pT>::col_size(); + ++i + ) + { + this->value[i] = m[i]; + } +} + +template <typename vT, uint cT, uint rT, profile pT> +base<vT, cT, rT, pT>::base +( + typename base<vT, cT, rT, pT>::value_type const & x +) +{ + if(rT == 1) // vector + { + for + ( + typename base<vT, cT, rT, pT>::size_type i = typename base<vT, cT, rT, pT>::size_type(0); + i < base<vT, cT, rT, pT>::col_size(); + ++i + ) + { + this->value[i][rT] = x; + } + } + else // matrix + { + memset(&this->value, 0, cT * rT * sizeof(vT)); + + typename base<vT, cT, rT, pT>::size_type stop = cT < rT ? cT : rT; + + for + ( + typename base<vT, cT, rT, pT>::size_type i = typename base<vT, cT, rT, pT>::size_type(0); + i < stop; + ++i + ) + { + this->value[i][i] = x; + } + } +} + +template <typename vT, uint cT, uint rT, profile pT> +base<vT, cT, rT, pT>::base +( + typename base<vT, cT, rT, pT>::value_type const * const x +) +{ + memcpy(&this->value, &x.value, cT * rT * sizeof(vT)); +} + +template <typename vT, uint cT, uint rT, profile pT> +base<vT, cT, rT, pT>::base +( + typename base<vT, cT, rT, pT>::col_type const * const x +) +{ + for + ( + typename base<vT, cT, rT, pT>::size_type i = typename base<vT, cT, rT, pT>::size_type(0); + i < base<vT, cT, rT, pT>::col_size(); + ++i + ) + { + this->value[i] = x[i]; + } +} + +template <typename vT, uint cT, uint rT, profile pT> +template <typename vU, uint cU, uint rU, profile pU> +base<vT, cT, rT, pT>::base +( + base<vU, cU, rU, pU> const & m +) +{ + for + ( + typename base<vT, cT, rT, pT>::size_type i = typename base<vT, cT, rT, pT>::size_type(0); + i < base<vT, cT, rT, pT>::col_size(); + ++i + ) + { + this->value[i] = base<vT, cT, rT, pT>(m[i]); + } +} + +////////////////////////////////////// +// Accesses + +template <typename vT, uint cT, uint rT, profile pT> +typename base<vT, cT, rT, pT>::col_type& base<vT, cT, rT, pT>::operator[] +( + typename base<vT, cT, rT, pT>::size_type i +) +{ + return this->value[i]; +} + +template <typename vT, uint cT, uint rT, profile pT> +typename base<vT, cT, rT, pT>::col_type const & base<vT, cT, rT, pT>::operator[] +( + typename base<vT, cT, rT, pT>::size_type i +) const +{ + return this->value[i]; +} + +////////////////////////////////////// +// Unary updatable operators + +template <typename vT, uint cT, uint rT, profile pT> +typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator= +( + typename base<vT, cT, rT, pT>::class_type const & x +) +{ + memcpy(&this->value, &x.value, cT * rT * sizeof(vT)); + return *this; +} + +template <typename vT, uint cT, uint rT, profile pT> +typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator+= +( + typename base<vT, cT, rT, pT>::value_type const & x +) +{ + typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size(); + typename base<vT, cT, rT, pT>::size_type stop_row = x.row_size(); + + for(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j) + for(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i) + this->value[j][i] += x; + + return *this; +} + +template <typename vT, uint cT, uint rT, profile pT> +typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator+= +( + typename base<vT, cT, rT, pT>::class_type const & x +) +{ + typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size(); + typename base<vT, cT, rT, pT>::size_type stop_row = x.row_size(); + + for(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j) + for(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i) + this->value[j][i] += x[j][i]; + + return *this; +} + +template <typename vT, uint cT, uint rT, profile pT> +typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator-= +( + typename base<vT, cT, rT, pT>::value_type const & x +) +{ + typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size(); + typename base<vT, cT, rT, pT>::size_type stop_row = x.row_size(); + + for(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j) + for(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i) + this->value[j][i] -= x; + + return *this; +} + +template <typename vT, uint cT, uint rT, profile pT> +typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator-= +( + typename base<vT, cT, rT, pT>::class_type const & x +) +{ + typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size(); + typename base<vT, cT, rT, pT>::size_type stop_row = x.row_size(); + + for(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j) + for(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i) + this->value[j][i] -= x[j][i]; + + return *this; +} + +template <typename vT, uint cT, uint rT, profile pT> +typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator*= +( + typename base<vT, cT, rT, pT>::value_type const & x +) +{ + typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size(); + typename base<vT, cT, rT, pT>::size_type stop_row = x.row_size(); + + for(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j) + for(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i) + this->value[j][i] *= x; + + return *this; +} + +template <typename vT, uint cT, uint rT, profile pT> +typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator*= +( + typename base<vT, cT, rT, pT>::class_type const & x +) +{ + typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size(); + typename base<vT, cT, rT, pT>::size_type stop_row = x.row_size(); + + for(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j) + for(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i) + this->value[j][i] *= x[j][i]; + + return *this; +} + +template <typename vT, uint cT, uint rT, profile pT> +typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator/= +( + typename base<vT, cT, rT, pT>::value_type const & x +) +{ + typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size(); + typename base<vT, cT, rT, pT>::size_type stop_row = x.row_size(); + + for(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j) + for(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i) + this->value[j][i] /= x; + + return *this; +} + +template <typename vT, uint cT, uint rT, profile pT> +typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator/= +( + typename base<vT, cT, rT, pT>::class_type const & x +) +{ + typename base<vT, cT, rT, pT>::size_type stop_col = x.col_size(); + typename base<vT, cT, rT, pT>::size_type stop_row = x.row_size(); + + for(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j) + for(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i) + this->value[j][i] /= x[j][i]; + + return *this; +} + +template <typename vT, uint cT, uint rT, profile pT> +typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator++ () +{ + typename base<vT, cT, rT, pT>::size_type stop_col = col_size(); + typename base<vT, cT, rT, pT>::size_type stop_row = row_size(); + + for(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j) + for(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i) + ++this->value[j][i]; + + return *this; +} + +template <typename vT, uint cT, uint rT, profile pT> +typename base<vT, cT, rT, pT>::class_type& base<vT, cT, rT, pT>::operator-- () +{ + typename base<vT, cT, rT, pT>::size_type stop_col = col_size(); + typename base<vT, cT, rT, pT>::size_type stop_row = row_size(); + + for(typename base<vT, cT, rT, pT>::size_type j = 0; j < stop_col; ++j) + for(typename base<vT, cT, rT, pT>::size_type i = 0; i < stop_row; ++i) + --this->value[j][i]; + + return *this; +} + +} //namespace detail +} //namespace glm diff --git a/include/gal/opengl/glm/core/type_half.hpp b/include/gal/opengl/glm/core/type_half.hpp new file mode 100644 index 0000000..5f14fbd --- /dev/null +++ b/include/gal/opengl/glm/core/type_half.hpp @@ -0,0 +1,118 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/type_half.hpp +/// @date 2008-08-17 / 2011-09-20 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_type_half +#define glm_core_type_half + +#include <cstdlib> + +namespace glm{ +namespace detail +{ + typedef short hdata; + + GLM_FUNC_DECL float toFloat32(hdata value); + GLM_FUNC_DECL hdata toFloat16(float const & value); + + class half + { + public: + // Constructors + GLM_FUNC_DECL half(); + GLM_FUNC_DECL half(half const & s); + + template <typename U> + GLM_FUNC_DECL explicit half(U const & s); + + // Cast + //template <typename U> + //GLM_FUNC_DECL operator U() const; + GLM_FUNC_DECL operator float() const; + + // Unary updatable operators + GLM_FUNC_DECL half& operator= (half const & s); + GLM_FUNC_DECL half& operator+=(half const & s); + GLM_FUNC_DECL half& operator-=(half const & s); + GLM_FUNC_DECL half& operator*=(half const & s); + GLM_FUNC_DECL half& operator/=(half const & s); + GLM_FUNC_DECL half& operator++(); + GLM_FUNC_DECL half& operator--(); + + GLM_FUNC_DECL float toFloat() const{return toFloat32(data);} + + GLM_FUNC_DECL hdata _data() const{return data;} + + private: + hdata data; + }; + + GLM_FUNC_DECL half operator+ (half const & s1, half const & s2); + + GLM_FUNC_DECL half operator- (half const & s1, half const & s2); + + GLM_FUNC_DECL half operator* (half const & s1, half const & s2); + + GLM_FUNC_DECL half operator/ (half const & s1, half const & s2); + + // Unary constant operators + GLM_FUNC_DECL half operator- (half const & s); + + GLM_FUNC_DECL half operator-- (half const & s, int); + + GLM_FUNC_DECL half operator++ (half const & s, int); + + GLM_FUNC_DECL bool operator==( + detail::half const & x, + detail::half const & y); + + GLM_FUNC_DECL bool operator!=( + detail::half const & x, + detail::half const & y); + + GLM_FUNC_DECL bool operator<( + detail::half const & x, + detail::half const & y); + + GLM_FUNC_DECL bool operator<=( + detail::half const & x, + detail::half const & y); + + GLM_FUNC_DECL bool operator>( + detail::half const & x, + detail::half const & y); + + GLM_FUNC_DECL bool operator>=( + detail::half const & x, + detail::half const & y); + +}//namespace detail +}//namespace glm + +#include "type_half.inl" + +#endif//glm_core_type_half diff --git a/include/gal/opengl/glm/core/type_half.inl b/include/gal/opengl/glm/core/type_half.inl new file mode 100644 index 0000000..9cd72b3 --- /dev/null +++ b/include/gal/opengl/glm/core/type_half.inl @@ -0,0 +1,421 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// +/// This half implementation is based on OpenEXR which is Copyright (c) 2002, +/// Industrial Light & Magic, a division of Lucas Digital Ltd. LLC +/// +/// 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. +/// +/// @ref core +/// @file glm/core/type_half.inl +/// @date 2008-08-17 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#include "_detail.hpp" + +namespace glm{ +namespace detail +{ + GLM_FUNC_QUALIFIER float overflow() + { + volatile float f = 1e10; + + for(int i = 0; i < 10; ++i) + f *= f; // this will overflow before + // the forloop terminates + return f; + } + + GLM_FUNC_QUALIFIER float toFloat32(hdata value) + { + int s = (value >> 15) & 0x00000001; + int e = (value >> 10) & 0x0000001f; + int m = value & 0x000003ff; + + if(e == 0) + { + if(m == 0) + { + // + // Plus or minus zero + // + + detail::uif result; + result.i = (unsigned int)(s << 31); + return result.f; + } + else + { + // + // Denormalized number -- renormalize it + // + + while(!(m & 0x00000400)) + { + m <<= 1; + e -= 1; + } + + e += 1; + m &= ~0x00000400; + } + } + else if(e == 31) + { + if(m == 0) + { + // + // Positive or negative infinity + // + + uif result; + result.i = (unsigned int)((s << 31) | 0x7f800000); + return result.f; + } + else + { + // + // Nan -- preserve sign and significand bits + // + + uif result; + result.i = (unsigned int)((s << 31) | 0x7f800000 | (m << 13)); + return result.f; + } + } + + // + // Normalized number + // + + e = e + (127 - 15); + m = m << 13; + + // + // Assemble s, e and m. + // + + uif Result; + Result.i = (unsigned int)((s << 31) | (e << 23) | m); + return Result.f; + } + + GLM_FUNC_QUALIFIER hdata toFloat16(float const & f) + { + uif Entry; + Entry.f = f; + int i = (int)Entry.i; + + // + // Our floating point number, f, is represented by the bit + // pattern in integer i. Disassemble that bit pattern into + // the sign, s, the exponent, e, and the significand, m. + // Shift s into the position where it will go in in the + // resulting half number. + // Adjust e, accounting for the different exponent bias + // of float and half (127 versus 15). + // + + int s = (i >> 16) & 0x00008000; + int e = ((i >> 23) & 0x000000ff) - (127 - 15); + int m = i & 0x007fffff; + + // + // Now reassemble s, e and m into a half: + // + + if(e <= 0) + { + if(e < -10) + { + // + // E is less than -10. The absolute value of f is + // less than half_MIN (f may be a small normalized + // float, a denormalized float or a zero). + // + // We convert f to a half zero. + // + + return hdata(s); + } + + // + // E is between -10 and 0. F is a normalized float, + // whose magnitude is less than __half_NRM_MIN. + // + // We convert f to a denormalized half. + // + + m = (m | 0x00800000) >> (1 - e); + + // + // Round to nearest, round "0.5" up. + // + // Rounding may cause the significand to overflow and make + // our number normalized. Because of the way a half's bits + // are laid out, we don't have to treat this case separately; + // the code below will handle it correctly. + // + + if(m & 0x00001000) + m += 0x00002000; + + // + // Assemble the half from s, e (zero) and m. + // + + return hdata(s | (m >> 13)); + } + else if(e == 0xff - (127 - 15)) + { + if(m == 0) + { + // + // F is an infinity; convert f to a half + // infinity with the same sign as f. + // + + return hdata(s | 0x7c00); + } + else + { + // + // F is a NAN; we produce a half NAN that preserves + // the sign bit and the 10 leftmost bits of the + // significand of f, with one exception: If the 10 + // leftmost bits are all zero, the NAN would turn + // into an infinity, so we have to set at least one + // bit in the significand. + // + + m >>= 13; + + return hdata(s | 0x7c00 | m | (m == 0)); + } + } + else + { + // + // E is greater than zero. F is a normalized float. + // We try to convert f to a normalized half. + // + + // + // Round to nearest, round "0.5" up + // + + if(m & 0x00001000) + { + m += 0x00002000; + + if(m & 0x00800000) + { + m = 0; // overflow in significand, + e += 1; // adjust exponent + } + } + + // + // Handle exponent overflow + // + + if (e > 30) + { + overflow(); // Cause a hardware floating point overflow; + + return hdata(s | 0x7c00); + // if this returns, the half becomes an + } // infinity with the same sign as f. + + // + // Assemble the half from s, e and m. + // + + return hdata(s | (e << 10) | (m >> 13)); + } + } + + GLM_FUNC_QUALIFIER half::half() : + data(0) + {} + + GLM_FUNC_QUALIFIER half::half(half const & s) : + data(s.data) + {} + + template <typename U> + GLM_FUNC_QUALIFIER half::half(U const & s) : + data(toFloat16(float(s))) + {} +/* + template <typename U> + GLM_FUNC_QUALIFIER half::operator U() const + { + return static_cast<U>(toFloat32(this->data)); + } +*/ + + GLM_FUNC_QUALIFIER half::operator float() const + { + return toFloat32(this->data); + } + + // Unary updatable operators + GLM_FUNC_QUALIFIER half& half::operator= (half const & s) + { + data = s.data; + return *this; + } + + GLM_FUNC_QUALIFIER half& half::operator+=(half const & s) + { + data = toFloat16(toFloat32(data) + toFloat32(s.data)); + return *this; + } + + GLM_FUNC_QUALIFIER half& half::operator-=(half const & s) + { + data = toFloat16(toFloat32(data) - toFloat32(s.data)); + return *this; + } + + GLM_FUNC_QUALIFIER half& half::operator*=(half const & s) + { + data = toFloat16(toFloat32(data) * toFloat32(s.data)); + return *this; + } + + GLM_FUNC_QUALIFIER half& half::operator/=(half const & s) + { + data = toFloat16(toFloat32(data) / toFloat32(s.data)); + return *this; + } + + GLM_FUNC_QUALIFIER half& half::operator++() + { + float Casted = toFloat32(data); + this->data = toFloat16(++Casted); + return *this; + } + + GLM_FUNC_QUALIFIER half& half::operator--() + { + float Casted = toFloat32(data); + this->data = toFloat16(--Casted); + return *this; + } + + ////////////////////////////////////// + // Binary arithmetic operators + + GLM_FUNC_QUALIFIER detail::half operator+ (detail::half const & s1, detail::half const & s2) + { + return detail::half(float(s1) + float(s2)); + } + + GLM_FUNC_QUALIFIER detail::half operator- (detail::half const & s1, detail::half const & s2) + { + return detail::half(float(s1) - float(s2)); + } + + GLM_FUNC_QUALIFIER detail::half operator* (detail::half const & s1, detail::half const & s2) + { + return detail::half(float(s1) * float(s2)); + } + + GLM_FUNC_QUALIFIER detail::half operator/ (detail::half const & s1, detail::half const & s2) + { + return detail::half(float(s1) / float(s2)); + } + + // Unary constant operators + GLM_FUNC_QUALIFIER detail::half operator- (detail::half const & s) + { + return detail::half(-float(s)); + } + + GLM_FUNC_QUALIFIER detail::half operator-- (detail::half const & s, int) + { + return detail::half(float(s) - 1.0f); + } + + GLM_FUNC_QUALIFIER detail::half operator++ (detail::half const & s, int) + { + return detail::half(float(s) + 1.0f); + } + + GLM_FUNC_QUALIFIER bool operator== + ( + detail::half const & x, + detail::half const & y + ) + { + return x._data() == y._data(); + } + + GLM_FUNC_QUALIFIER bool operator!= + ( + detail::half const & x, + detail::half const & y + ) + { + return x._data() != y._data(); + } + + GLM_FUNC_QUALIFIER bool operator< + ( + detail::half const & x, + detail::half const & y + ) + { + return float(x) < float(y); + } + + GLM_FUNC_QUALIFIER bool operator<= + ( + detail::half const & x, + detail::half const & y + ) + { + return float(x) <= float(y); + } + + GLM_FUNC_QUALIFIER bool operator> + ( + detail::half const & x, + detail::half const & y + ) + { + return float(x) > float(y); + } + + GLM_FUNC_QUALIFIER bool operator>= + ( + detail::half const & x, + detail::half const & y + ) + { + return float(x) >= float(y); + } + +}//namespace detail +}//namespace glm diff --git a/include/gal/opengl/glm/core/type_int.hpp b/include/gal/opengl/glm/core/type_int.hpp new file mode 100644 index 0000000..c7de0c5 --- /dev/null +++ b/include/gal/opengl/glm/core/type_int.hpp @@ -0,0 +1,142 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/type_int.hpp +/// @date 2008-08-22 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_type_int +#define glm_core_type_int + +#include "setup.hpp" +#include "_detail.hpp" + +namespace glm{ +namespace detail +{ + typedef signed short lowp_int_t; + typedef signed int mediump_int_t; + typedef sint64 highp_int_t; + + typedef unsigned short lowp_uint_t; + typedef unsigned int mediump_uint_t; + typedef uint64 highp_uint_t; + + GLM_DETAIL_IS_INT(signed char); + GLM_DETAIL_IS_INT(signed short); + GLM_DETAIL_IS_INT(signed int); + GLM_DETAIL_IS_INT(signed long); + + GLM_DETAIL_IS_UINT(unsigned char); + GLM_DETAIL_IS_UINT(unsigned short); + GLM_DETAIL_IS_UINT(unsigned int); + GLM_DETAIL_IS_UINT(unsigned long); + +#if(GLM_LANG >= GLM_LANG_CXX0X) + GLM_DETAIL_IS_INT(signed long long); + GLM_DETAIL_IS_UINT(unsigned long long); +#else + GLM_DETAIL_IS_INT(highp_int_t); + GLM_DETAIL_IS_UINT(highp_uint_t); +#endif +}//namespace detail + + /// @addtogroup core_precision + /// @{ + + /// Low precision signed integer. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.3 Integers</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::lowp_int_t lowp_int; + + /// Medium precision signed integer. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.3 Integers</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::mediump_int_t mediump_int; + + /// High precision signed integer. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.3 Integers</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::highp_int_t highp_int; + + /// Low precision unsigned integer. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.3 Integers</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::lowp_uint_t lowp_uint; + + /// Medium precision unsigned integer. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.3 Integers</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::mediump_uint_t mediump_uint; + + /// High precision unsigned integer. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.3 Integers</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::highp_uint_t highp_uint; + +#if(!defined(GLM_PRECISION_HIGHP_INT) && !defined(GLM_PRECISION_MEDIUMP_INT) && !defined(GLM_PRECISION_LOWP_INT)) + typedef mediump_int int_t; +#elif(defined(GLM_PRECISION_HIGHP_INT) && !defined(GLM_PRECISION_MEDIUMP_INT) && !defined(GLM_PRECISION_LOWP_INT)) + typedef highp_int int_t; +#elif(!defined(GLM_PRECISION_HIGHP_INT) && defined(GLM_PRECISION_MEDIUMP_INT) && !defined(GLM_PRECISION_LOWP_INT)) + typedef mediump_int int_t; +#elif(!defined(GLM_PRECISION_HIGHP_INT) && !defined(GLM_PRECISION_MEDIUMP_INT) && defined(GLM_PRECISION_LOWP_INT)) + typedef lowp_int int_t; +#else +# error "GLM error: multiple default precision requested for signed interger types" +#endif + +#if(!defined(GLM_PRECISION_HIGHP_UINT) && !defined(GLM_PRECISION_MEDIUMP_UINT) && !defined(GLM_PRECISION_LOWP_UINT)) + typedef mediump_uint uint_t; +#elif(defined(GLM_PRECISION_HIGHP_UINT) && !defined(GLM_PRECISION_MEDIUMP_UINT) && !defined(GLM_PRECISION_LOWP_UINT)) + typedef highp_uint uint_t; +#elif(!defined(GLM_PRECISION_HIGHP_UINT) && defined(GLM_PRECISION_MEDIUMP_UINT) && !defined(GLM_PRECISION_LOWP_UINT)) + typedef mediump_uint uint_t; +#elif(!defined(GLM_PRECISION_HIGHP_UINT) && !defined(GLM_PRECISION_MEDIUMP_UINT) && defined(GLM_PRECISION_LOWP_UINT)) + typedef lowp_uint uint_t; +#else +# error "GLM error: multiple default precision requested for unsigned interger types" +#endif + + /// Unsigned integer type. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.3 Integers</a> + typedef uint_t uint; + + /// @} +}//namespace glm + +#endif//glm_core_type_int diff --git a/include/gal/opengl/glm/core/type_mat.hpp b/include/gal/opengl/glm/core/type_mat.hpp new file mode 100644 index 0000000..1520ad5 --- /dev/null +++ b/include/gal/opengl/glm/core/type_mat.hpp @@ -0,0 +1,41 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/type_mat.hpp +/// @date 2010-01-26 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_type_mat +#define glm_core_type_mat + +#include "type_gentype.hpp" + +namespace glm{ +namespace detail +{ + +}//namespace detail +}//namespace glm + +#endif//glm_core_type_mat diff --git a/include/gal/opengl/glm/core/type_mat.inl b/include/gal/opengl/glm/core/type_mat.inl new file mode 100644 index 0000000..477d17e --- /dev/null +++ b/include/gal/opengl/glm/core/type_mat.inl @@ -0,0 +1,27 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/type_mat.inl +/// @date 2011-06-15 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// diff --git a/include/gal/opengl/glm/core/type_mat2x2.hpp b/include/gal/opengl/glm/core/type_mat2x2.hpp new file mode 100644 index 0000000..432a6b9 --- /dev/null +++ b/include/gal/opengl/glm/core/type_mat2x2.hpp @@ -0,0 +1,314 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/type_mat2x2.hpp +/// @date 2005-01-27 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_type_mat2x2 +#define glm_core_type_mat2x2 + +#include "type_mat.hpp" + +namespace glm{ +namespace detail +{ + template <typename T> struct tvec1; + template <typename T> struct tvec2; + template <typename T> struct tvec3; + template <typename T> struct tvec4; + template <typename T> struct tmat2x2; + template <typename T> struct tmat2x3; + template <typename T> struct tmat2x4; + template <typename T> struct tmat3x2; + template <typename T> struct tmat3x3; + template <typename T> struct tmat3x4; + template <typename T> struct tmat4x2; + template <typename T> struct tmat4x3; + template <typename T> struct tmat4x4; + + template <typename T> + struct tmat2x2 + { + // Implementation detail + enum ctor{null}; + typedef T value_type; + typedef std::size_t size_type; + typedef tvec2<T> col_type; + typedef tvec2<T> row_type; + typedef tmat2x2<T> type; + typedef tmat2x2<T> transpose_type; + + static GLM_FUNC_DECL size_type col_size(); + static GLM_FUNC_DECL size_type row_size(); + + GLM_FUNC_DECL GLM_CONSTEXPR size_type length() const; + + public: + // Implementation detail + GLM_FUNC_DECL tmat2x2<T> _inverse() const; + + private: + ////////////////////////////////////// + // Implementation detail + col_type value[2]; + + public: + ////////////////////////////////////// + // Constructors + GLM_FUNC_DECL tmat2x2(); + GLM_FUNC_DECL tmat2x2( + tmat2x2 const & m); + + GLM_FUNC_DECL explicit tmat2x2( + ctor Null); + GLM_FUNC_DECL explicit tmat2x2( + value_type const & x); + GLM_FUNC_DECL explicit tmat2x2( + value_type const & x1, value_type const & y1, + value_type const & x2, value_type const & y2); + GLM_FUNC_DECL explicit tmat2x2( + col_type const & v1, + col_type const & v2); + + ////////////////////////////////////// + // Conversions + template <typename U> + GLM_FUNC_DECL explicit tmat2x2( + U const & x); + + template <typename U, typename V, typename M, typename N> + GLM_FUNC_DECL explicit tmat2x2( + U const & x1, V const & y1, + M const & x2, N const & y2); + + template <typename U, typename V> + GLM_FUNC_DECL explicit tmat2x2( + tvec2<U> const & v1, + tvec2<V> const & v2); + + ////////////////////////////////////// + // Matrix conversions + template <typename U> + GLM_FUNC_DECL explicit tmat2x2(tmat2x2<U> const & m); + + GLM_FUNC_DECL explicit tmat2x2(tmat3x3<T> const & x); + GLM_FUNC_DECL explicit tmat2x2(tmat4x4<T> const & x); + GLM_FUNC_DECL explicit tmat2x2(tmat2x3<T> const & x); + GLM_FUNC_DECL explicit tmat2x2(tmat3x2<T> const & x); + GLM_FUNC_DECL explicit tmat2x2(tmat2x4<T> const & x); + GLM_FUNC_DECL explicit tmat2x2(tmat4x2<T> const & x); + GLM_FUNC_DECL explicit tmat2x2(tmat3x4<T> const & x); + GLM_FUNC_DECL explicit tmat2x2(tmat4x3<T> const & x); + + ////////////////////////////////////// + // Accesses + + GLM_FUNC_DECL col_type & operator[](size_type i); + GLM_FUNC_DECL col_type const & operator[](size_type i) const; + + // Unary updatable operators + GLM_FUNC_DECL tmat2x2<T> & operator=(tmat2x2<T> const & m); + template <typename U> + GLM_FUNC_DECL tmat2x2<T> & operator=(tmat2x2<U> const & m); + template <typename U> + GLM_FUNC_DECL tmat2x2<T> & operator+=(U s); + template <typename U> + GLM_FUNC_DECL tmat2x2<T> & operator+=(tmat2x2<U> const & m); + template <typename U> + GLM_FUNC_DECL tmat2x2<T> & operator-=(U s); + template <typename U> + GLM_FUNC_DECL tmat2x2<T> & operator-=(tmat2x2<U> const & m); + template <typename U> + GLM_FUNC_DECL tmat2x2<T> & operator*=(U s); + template <typename U> + GLM_FUNC_DECL tmat2x2<T> & operator*=(tmat2x2<U> const & m); + template <typename U> + GLM_FUNC_DECL tmat2x2<T> & operator/=(U s); + template <typename U> + GLM_FUNC_DECL tmat2x2<T> & operator/=(tmat2x2<U> const & m); + GLM_FUNC_DECL tmat2x2<T> & operator++(); + GLM_FUNC_DECL tmat2x2<T> & operator--(); + }; + + // Binary operators + template <typename T> + GLM_FUNC_DECL tmat2x2<T> operator+ ( + tmat2x2<T> const & m, + typename tmat2x2<T>::value_type const & s); + + template <typename T> + GLM_FUNC_DECL tmat2x2<T> operator+ ( + typename tmat2x2<T>::value_type const & s, + tmat2x2<T> const & m); + + template <typename T> + GLM_FUNC_DECL tmat2x2<T> operator+ ( + tmat2x2<T> const & m1, + tmat2x2<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat2x2<T> operator- ( + tmat2x2<T> const & m, + typename tmat2x2<T>::value_type const & s); + + template <typename T> + GLM_FUNC_DECL tmat2x2<T> operator- ( + typename tmat2x2<T>::value_type const & s, + tmat2x2<T> const & m); + + template <typename T> + GLM_FUNC_DECL tmat2x2<T> operator- ( + tmat2x2<T> const & m1, + tmat2x2<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat2x2<T> operator* ( + tmat2x2<T> const & m, + typename tmat2x2<T>::value_type const & s); + + template <typename T> + GLM_FUNC_DECL tmat2x2<T> operator* ( + typename tmat2x2<T>::value_type const & s, + tmat2x2<T> const & m); + + template <typename T> + GLM_FUNC_DECL typename tmat2x2<T>::col_type operator* ( + tmat2x2<T> const & m, + typename tmat2x2<T>::row_type const & v); + + template <typename T> + GLM_FUNC_DECL typename tmat2x2<T>::row_type operator* ( + typename tmat2x2<T>::col_type const & v, + tmat2x2<T> const & m); + + template <typename T> + GLM_FUNC_DECL tmat2x2<T> operator* ( + tmat2x2<T> const & m1, + tmat2x2<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat3x2<T> operator* ( + tmat2x2<T> const & m1, + tmat3x2<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat4x2<T> operator* ( + tmat2x2<T> const & m1, + tmat4x2<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat2x2<T> operator/ ( + tmat2x2<T> const & m, + typename tmat2x2<T>::value_type const & s); + + template <typename T> + GLM_FUNC_DECL tmat2x2<T> operator/ ( + typename tmat2x2<T>::value_type const & s, + tmat2x2<T> const & m); + + template <typename T> + GLM_FUNC_DECL typename tmat2x2<T>::col_type operator/ ( + tmat2x2<T> const & m, + typename tmat2x2<T>::row_type const & v); + + template <typename T> + GLM_FUNC_DECL typename tmat2x2<T>::row_type operator/ ( + typename tmat2x2<T>::col_type const & v, + tmat2x2<T> const & m); + + template <typename T> + GLM_FUNC_DECL tmat2x2<T> operator/ ( + tmat2x2<T> const & m1, + tmat2x2<T> const & m2); + + // Unary constant operators + template <typename T> + GLM_FUNC_DECL tmat2x2<T> const operator- ( + tmat2x2<T> const & m); + + template <typename T> + GLM_FUNC_DECL tmat2x2<T> const operator-- ( + tmat2x2<T> const & m, + int); + + template <typename T> + GLM_FUNC_DECL tmat2x2<T> const operator++ ( + tmat2x2<T> const & m, + int); +} //namespace detail + + /// @addtogroup core_precision + /// @{ + + /// 2 columns of 2 components matrix of low precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tmat2x2<lowp_float> lowp_mat2; + + /// 2 columns of 2 components matrix of medium precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tmat2x2<mediump_float> mediump_mat2; + + /// 2 columns of 2 components matrix of high precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tmat2x2<highp_float> highp_mat2; + + /// 2 columns of 2 components matrix of low precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tmat2x2<lowp_float> lowp_mat2x2; + + /// 2 columns of 2 components matrix of medium precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tmat2x2<mediump_float> mediump_mat2x2; + + /// 2 columns of 2 components matrix of high precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tmat2x2<highp_float> highp_mat2x2; + + /// @} +}//namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_mat2x2.inl" +#endif + +#endif //glm_core_type_mat2x2 diff --git a/include/gal/opengl/glm/core/type_mat2x2.inl b/include/gal/opengl/glm/core/type_mat2x2.inl new file mode 100644 index 0000000..9d6e191 --- /dev/null +++ b/include/gal/opengl/glm/core/type_mat2x2.inl @@ -0,0 +1,688 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/type_mat2x2.inl +/// @date 2005-01-16 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +namespace glm{ +namespace detail +{ + template <typename T> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename tmat2x2<T>::size_type tmat2x2<T>::length() const + { + return 2; + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat2x2<T>::size_type tmat2x2<T>::col_size() + { + return 2; + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat2x2<T>::size_type tmat2x2<T>::row_size() + { + return 2; + } + + ////////////////////////////////////// + // Accesses + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat2x2<T>::col_type & + tmat2x2<T>::operator[] + ( + size_type i + ) + { + assert(i < this->length()); + return this->value[i]; + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat2x2<T>::col_type const & + tmat2x2<T>::operator[] + ( + size_type i + ) const + { + assert(i < this->length()); + return this->value[i]; + } + + ////////////////////////////////////////////////////////////// + // Constructors + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x2<T>::tmat2x2() + { + this->value[0] = col_type(1, 0); + this->value[1] = col_type(0, 1); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x2<T>::tmat2x2 + ( + tmat2x2<T> const & m + ) + { + this->value[0] = m.value[0]; + this->value[1] = m.value[1]; + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x2<T>::tmat2x2 + ( + ctor + ) + {} + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x2<T>::tmat2x2 + ( + value_type const & s + ) + { + value_type const Zero(0); + this->value[0] = col_type(s, Zero); + this->value[1] = col_type(Zero, s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x2<T>::tmat2x2 + ( + value_type const & x0, value_type const & y0, + value_type const & x1, value_type const & y1 + ) + { + this->value[0] = col_type(x0, y0); + this->value[1] = col_type(x1, y1); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x2<T>::tmat2x2 + ( + col_type const & v0, + col_type const & v1 + ) + { + this->value[0] = v0; + this->value[1] = v1; + } + + ////////////////////////////////////// + // Convertion constructors + template <typename T> + template <typename U> + GLM_FUNC_DECL tmat2x2<T>::tmat2x2 + ( + U const & s + ) + { + value_type const Zero(0); + this->value[0] = tvec2<T>(value_type(s), Zero); + this->value[1] = tvec2<T>(Zero, value_type(s)); + } + + template <typename T> + template <typename X1, typename Y1, typename X2, typename Y2> + GLM_FUNC_DECL tmat2x2<T>::tmat2x2 + ( + X1 const & x1, Y1 const & y1, + X2 const & x2, Y2 const & y2 + ) + { + this->value[0] = col_type(value_type(x1), value_type(y1)); + this->value[1] = col_type(value_type(x2), value_type(y2)); + } + + template <typename T> + template <typename V1, typename V2> + GLM_FUNC_DECL tmat2x2<T>::tmat2x2 + ( + tvec2<V1> const & v1, + tvec2<V2> const & v2 + ) + { + this->value[0] = col_type(v1); + this->value[1] = col_type(v2); + } + + ////////////////////////////////////////////////////////////// + // mat2x2 matrix conversions + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat2x2<T>::tmat2x2 + ( + tmat2x2<U> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x2<T>::tmat2x2 + ( + tmat3x3<T> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x2<T>::tmat2x2 + ( + tmat4x4<T> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x2<T>::tmat2x2 + ( + tmat2x3<T> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x2<T>::tmat2x2 + ( + tmat3x2<T> const & m + ) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x2<T>::tmat2x2 + ( + tmat2x4<T> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x2<T>::tmat2x2 + ( + tmat4x2<T> const & m + ) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x2<T>::tmat2x2 + ( + tmat3x4<T> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x2<T>::tmat2x2 + ( + tmat4x3<T> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x2<T> tmat2x2<T>::_inverse() const + { + typename tmat2x2<T>::value_type Determinant = this->value[0][0] * this->value[1][1] - this->value[1][0] * this->value[0][1]; + + tmat2x2<T> Inverse( + + this->value[1][1] / Determinant, + - this->value[0][1] / Determinant, + - this->value[1][0] / Determinant, + + this->value[0][0] / Determinant); + return Inverse; + } + + ////////////////////////////////////////////////////////////// + // mat2x2 operators + + // This function shouldn't required but it seems that VC7.1 have an optimisation bug if this operator wasn't declared + template <typename T> + GLM_FUNC_QUALIFIER tmat2x2<T>& tmat2x2<T>::operator= + ( + tmat2x2<T> const & m + ) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat2x2<T>& tmat2x2<T>::operator= + ( + tmat2x2<U> const & m + ) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat2x2<T>& tmat2x2<T>::operator+= (U s) + { + this->value[0] += s; + this->value[1] += s; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat2x2<T>& tmat2x2<T>::operator+= + ( + tmat2x2<U> const & m + ) + { + this->value[0] += m[0]; + this->value[1] += m[1]; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat2x2<T>& tmat2x2<T>::operator-= (U s) + { + this->value[0] -= s; + this->value[1] -= s; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat2x2<T>& tmat2x2<T>::operator-= + ( + tmat2x2<U> const & m + ) + { + this->value[0] -= m[0]; + this->value[1] -= m[1]; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat2x2<T>& tmat2x2<T>::operator*= (U s) + { + this->value[0] *= s; + this->value[1] *= s; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat2x2<T>& tmat2x2<T>::operator*= + ( + tmat2x2<U> const & m + ) + { + return (*this = *this * m); + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat2x2<T>& tmat2x2<T>::operator/= (U s) + { + this->value[0] /= s; + this->value[1] /= s; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat2x2<T>& tmat2x2<T>::operator/= + ( + tmat2x2<U> const & m + ) + { + return (*this = *this / m); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x2<T>& tmat2x2<T>::operator++ () + { + ++this->value[0]; + ++this->value[1]; + return *this; + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x2<T>& tmat2x2<T>::operator-- () + { + --this->value[0]; + --this->value[1]; + return *this; + } + + ////////////////////////////////////////////////////////////// + // Binary operators + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x2<T> operator+ + ( + tmat2x2<T> const & m, + typename tmat2x2<T>::value_type const & s + ) + { + return tmat2x2<T>( + m[0] + s, + m[1] + s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x2<T> operator+ + ( + typename tmat2x2<T>::value_type const & s, + tmat2x2<T> const & m + ) + { + return tmat2x2<T>( + m[0] + s, + m[1] + s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x2<T> operator+ + ( + tmat2x2<T> const & m1, + tmat2x2<T> const & m2 + ) + { + return tmat2x2<T>( + m1[0] + m2[0], + m1[1] + m2[1]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x2<T> operator- + ( + tmat2x2<T> const & m, + typename tmat2x2<T>::value_type const & s + ) + { + return tmat2x2<T>( + m[0] - s, + m[1] - s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x2<T> operator- + ( + typename tmat2x2<T>::value_type const & s, + tmat2x2<T> const & m + ) + { + return tmat2x2<T>( + s - m[0], + s - m[1]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x2<T> operator- + ( + tmat2x2<T> const & m1, + tmat2x2<T> const & m2 + ) + { + return tmat2x2<T>( + m1[0] - m2[0], + m1[1] - m2[1]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x2<T> operator* + ( + tmat2x2<T> const & m, + typename tmat2x2<T>::value_type const & s + ) + { + return tmat2x2<T>( + m[0] * s, + m[1] * s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x2<T> operator* + ( + typename tmat2x2<T>::value_type const & s, + tmat2x2<T> const & m + ) + { + return tmat2x2<T>( + m[0] * s, + m[1] * s); + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat2x2<T>::col_type operator* + ( + tmat2x2<T> const & m, + typename tmat2x2<T>::row_type const & v + ) + { + return detail::tvec2<T>( + m[0][0] * v.x + m[1][0] * v.y, + m[0][1] * v.x + m[1][1] * v.y); + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat2x2<T>::row_type operator* + ( + typename tmat2x2<T>::col_type const & v, + tmat2x2<T> const & m + ) + { + return detail::tvec2<T>( + v.x * m[0][0] + v.y * m[0][1], + v.x * m[1][0] + v.y * m[1][1]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x2<T> operator* + ( + tmat2x2<T> const & m1, + tmat2x2<T> const & m2 + ) + { + return tmat2x2<T>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x2<T> operator* + ( + tmat2x2<T> const & m1, + tmat3x2<T> const & m2 + ) + { + return tmat3x2<T>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1], + m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1], + m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x2<T> operator* + ( + tmat2x2<T> const & m1, + tmat4x2<T> const & m2 + ) + { + return tmat4x2<T>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1], + m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1], + m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1], + m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1], + m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x2<T> operator/ + ( + tmat2x2<T> const & m, + typename tmat2x2<T>::value_type const & s + ) + { + return tmat2x2<T>( + m[0] / s, + m[1] / s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x2<T> operator/ + ( + typename tmat2x2<T>::value_type const & s, + tmat2x2<T> const & m + ) + { + return tmat2x2<T>( + s / m[0], + s / m[1]); + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat2x2<T>::col_type operator/ + ( + tmat2x2<T> const & m, + typename tmat2x2<T>::row_type & v + ) + { + return m._inverse() * v; + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat2x2<T>::row_type operator/ + ( + typename tmat2x2<T>::col_type const & v, + tmat2x2<T> const & m + ) + { + return v * m._inverse(); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x2<T> operator/ + ( + tmat2x2<T> const & m1, + tmat2x2<T> const & m2 + ) + { + return m1 * m2._inverse(); + } + + // Unary constant operators + template <typename T> + GLM_FUNC_QUALIFIER tmat2x2<T> const operator- + ( + tmat2x2<T> const & m + ) + { + return tmat2x2<T>( + -m[0], + -m[1]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x2<T> const operator++ + ( + tmat2x2<T> const & m, + int + ) + { + return tmat2x2<T>( + m[0] + T(1), + m[1] + T(1)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x2<T> const operator-- + ( + tmat2x2<T> const & m, + int + ) + { + return tmat2x2<T>( + m[0] - T(1), + m[1] - T(1)); + } + + ////////////////////////////////////// + // Boolean operators + + template <typename T> + GLM_FUNC_QUALIFIER bool operator== + ( + tmat2x2<T> const & m1, + tmat2x2<T> const & m2 + ) + { + return (m1[0] == m2[0]) && (m1[1] == m2[1]); + } + + template <typename T> + GLM_FUNC_QUALIFIER bool operator!= + ( + tmat2x2<T> const & m1, + tmat2x2<T> const & m2 + ) + { + return (m1[0] != m2[0]) || (m1[1] != m2[1]); + } + +} //namespace detail +} //namespace glm diff --git a/include/gal/opengl/glm/core/type_mat2x3.hpp b/include/gal/opengl/glm/core/type_mat2x3.hpp new file mode 100644 index 0000000..14f1548 --- /dev/null +++ b/include/gal/opengl/glm/core/type_mat2x3.hpp @@ -0,0 +1,258 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/type_mat2x3.hpp +/// @date 2006-10-01 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_type_mat2x3 +#define glm_core_type_mat2x3 + +#include "type_mat.hpp" + +namespace glm{ +namespace detail +{ + template <typename T> struct tvec1; + template <typename T> struct tvec2; + template <typename T> struct tvec3; + template <typename T> struct tvec4; + template <typename T> struct tmat2x2; + template <typename T> struct tmat2x3; + template <typename T> struct tmat2x4; + template <typename T> struct tmat3x2; + template <typename T> struct tmat3x3; + template <typename T> struct tmat3x4; + template <typename T> struct tmat4x2; + template <typename T> struct tmat4x3; + template <typename T> struct tmat4x4; + + template <typename T> + struct tmat2x3 + { + enum ctor{null}; + typedef T value_type; + typedef std::size_t size_type; + typedef tvec3<T> col_type; + typedef tvec2<T> row_type; + typedef tmat2x3<T> type; + typedef tmat3x2<T> transpose_type; + + static GLM_FUNC_DECL size_type col_size(); + static GLM_FUNC_DECL size_type row_size(); + + GLM_FUNC_DECL GLM_CONSTEXPR size_type length() const; + + private: + // Data + col_type value[2]; + + public: + // Constructors + GLM_FUNC_DECL tmat2x3(); + GLM_FUNC_DECL tmat2x3(tmat2x3 const & m); + + GLM_FUNC_DECL explicit tmat2x3( + ctor); + GLM_FUNC_DECL explicit tmat2x3( + value_type const & s); + GLM_FUNC_DECL explicit tmat2x3( + value_type const & x0, value_type const & y0, value_type const & z0, + value_type const & x1, value_type const & y1, value_type const & z1); + GLM_FUNC_DECL explicit tmat2x3( + col_type const & v0, + col_type const & v1); + + ////////////////////////////////////// + // Conversions + template <typename U> + GLM_FUNC_DECL explicit tmat2x3( + U const & x); + + template <typename X1, typename Y1, typename Z1, typename X2, typename Y2, typename Z2> + GLM_FUNC_DECL explicit tmat2x3( + X1 const & x1, Y1 const & y1, Z1 const & z1, + X2 const & x2, Y2 const & y2, Z2 const & z2); + + template <typename U, typename V> + GLM_FUNC_DECL explicit tmat2x3( + tvec3<U> const & v1, + tvec3<V> const & v2); + + ////////////////////////////////////// + // Matrix conversion + template <typename U> + GLM_FUNC_DECL explicit tmat2x3(tmat2x3<U> const & m); + + GLM_FUNC_DECL explicit tmat2x3(tmat2x2<T> const & x); + GLM_FUNC_DECL explicit tmat2x3(tmat3x3<T> const & x); + GLM_FUNC_DECL explicit tmat2x3(tmat4x4<T> const & x); + GLM_FUNC_DECL explicit tmat2x3(tmat2x4<T> const & x); + GLM_FUNC_DECL explicit tmat2x3(tmat3x2<T> const & x); + GLM_FUNC_DECL explicit tmat2x3(tmat3x4<T> const & x); + GLM_FUNC_DECL explicit tmat2x3(tmat4x2<T> const & x); + GLM_FUNC_DECL explicit tmat2x3(tmat4x3<T> const & x); + + // Accesses + GLM_FUNC_DECL col_type & operator[](size_type i); + GLM_FUNC_DECL col_type const & operator[](size_type i) const; + + // Unary updatable operators + GLM_FUNC_DECL tmat2x3<T> & operator= (tmat2x3<T> const & m); + template <typename U> + GLM_FUNC_DECL tmat2x3<T> & operator= (tmat2x3<U> const & m); + template <typename U> + GLM_FUNC_DECL tmat2x3<T> & operator+= (U s); + template <typename U> + GLM_FUNC_DECL tmat2x3<T> & operator+= (tmat2x3<U> const & m); + template <typename U> + GLM_FUNC_DECL tmat2x3<T> & operator-= (U s); + template <typename U> + GLM_FUNC_DECL tmat2x3<T> & operator-= (tmat2x3<U> const & m); + template <typename U> + GLM_FUNC_DECL tmat2x3<T> & operator*= (U s); + template <typename U> + GLM_FUNC_DECL tmat2x3<T> & operator*= (tmat2x3<U> const & m); + template <typename U> + GLM_FUNC_DECL tmat2x3<T> & operator/= (U s); + + GLM_FUNC_DECL tmat2x3<T> & operator++ (); + GLM_FUNC_DECL tmat2x3<T> & operator-- (); + }; + + // Binary operators + template <typename T> + GLM_FUNC_DECL tmat2x3<T> operator+ ( + tmat2x3<T> const & m, + typename tmat2x3<T>::value_type const & s); + + template <typename T> + GLM_FUNC_DECL tmat2x3<T> operator+ ( + tmat2x3<T> const & m1, + tmat2x3<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat2x3<T> operator- ( + tmat2x3<T> const & m, + typename tmat2x3<T>::value_type const & s); + + template <typename T> + GLM_FUNC_DECL tmat2x3<T> operator- ( + tmat2x3<T> const & m1, + tmat2x3<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat2x3<T> operator* ( + tmat2x3<T> const & m, + typename tmat2x3<T>::value_type const & s); + + template <typename T> + GLM_FUNC_DECL tmat2x3<T> operator* ( + typename tmat2x3<T>::value_type const & s, + tmat2x3<T> const & m); + + template <typename T> + GLM_FUNC_DECL typename tmat2x3<T>::col_type operator* ( + tmat2x3<T> const & m, + typename tmat2x3<T>::row_type const & v); + + template <typename T> + GLM_FUNC_DECL typename tmat2x3<T>::row_type operator* ( + typename tmat2x3<T>::col_type const & v, + tmat2x3<T> const & m); + + template <typename T> + GLM_FUNC_DECL tmat2x3<T> operator* ( + tmat2x3<T> const & m1, + tmat2x2<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat3x3<T> operator* ( + tmat2x3<T> const & m1, + tmat3x2<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat4x3<T> operator* ( + tmat2x3<T> const & m1, + tmat4x2<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat2x3<T> operator/ ( + tmat2x3<T> const & m, + typename tmat2x3<T>::value_type const & s); + + template <typename T> + GLM_FUNC_DECL tmat2x3<T> operator/ ( + typename tmat2x3<T>::value_type const & s, + tmat2x3<T> const & m); + + // Unary constant operators + template <typename T> + GLM_FUNC_DECL tmat2x3<T> const operator- ( + tmat2x3<T> const & m); + + template <typename T> + GLM_FUNC_DECL tmat2x3<T> const operator-- ( + tmat2x3<T> const & m, + int); + + template <typename T> + GLM_FUNC_DECL tmat2x3<T> const operator++ ( + tmat2x3<T> const & m, + int); + +} //namespace detail + + /// @addtogroup core_precision + /// @{ + + /// 2 columns of 3 components matrix of low precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tmat2x3<lowp_float> lowp_mat2x3; + + /// 2 columns of 3 components matrix of medium precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tmat2x3<mediump_float> mediump_mat2x3; + + /// 2 columns of 3 components matrix of high precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tmat2x3<highp_float> highp_mat2x3; + + /// @} +}//namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_mat2x3.inl" +#endif + +#endif //glm_core_type_mat2x3 diff --git a/include/gal/opengl/glm/core/type_mat2x3.inl b/include/gal/opengl/glm/core/type_mat2x3.inl new file mode 100644 index 0000000..b77f4fa --- /dev/null +++ b/include/gal/opengl/glm/core/type_mat2x3.inl @@ -0,0 +1,633 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/type_mat2x3.inl +/// @date 2006-08-05 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +namespace glm{ +namespace detail +{ + template <typename T> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename tmat2x3<T>::size_type tmat2x3<T>::length() const + { + return 2; + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat2x3<T>::size_type tmat2x3<T>::col_size() + { + return 3; + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat2x3<T>::size_type tmat2x3<T>::row_size() + { + return 2; + } + + ////////////////////////////////////// + // Accesses + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat2x3<T>::col_type & + tmat2x3<T>::operator[] + ( + size_type i + ) + { + assert(i < this->length()); + return this->value[i]; + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat2x3<T>::col_type const & + tmat2x3<T>::operator[] + ( + size_type i + ) const + { + assert(i < this->length()); + return this->value[i]; + } + + ////////////////////////////////////////////////////////////// + // Constructors + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3() + { + this->value[0] = col_type(T(1), T(0), T(0)); + this->value[1] = col_type(T(0), T(1), T(0)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3 + ( + tmat2x3<T> const & m + ) + { + this->value[0] = m.value[0]; + this->value[1] = m.value[1]; + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3 + ( + ctor + ) + {} + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3 + ( + value_type const & s + ) + { + this->value[0] = col_type(s, T(0), T(0)); + this->value[1] = col_type(T(0), s, T(0)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3 + ( + value_type const & x0, value_type const & y0, value_type const & z0, + value_type const & x1, value_type const & y1, value_type const & z1 + ) + { + this->value[0] = col_type(x0, y0, z0); + this->value[1] = col_type(x1, y1, z1); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3 + ( + col_type const & v0, + col_type const & v1 + ) + { + this->value[0] = v0; + this->value[1] = v1; + } + + ////////////////////////////////////// + // Convertion constructors + template <typename T> + template <typename U> + GLM_FUNC_DECL tmat2x3<T>::tmat2x3 + ( + U const & s + ) + { + value_type const Zero(0); + this->value[0] = tvec3<T>(value_type(s), Zero, Zero); + this->value[1] = tvec3<T>(Zero, value_type(s), Zero); + } + + template <typename T> + template < + typename X1, typename Y1, typename Z1, + typename X2, typename Y2, typename Z2> + GLM_FUNC_DECL tmat2x3<T>::tmat2x3 + ( + X1 const & x1, Y1 const & y1, Z1 const & z1, + X2 const & x2, Y2 const & y2, Z2 const & z2 + ) + { + this->value[0] = col_type(value_type(x1), value_type(y1), value_type(z1)); + this->value[1] = col_type(value_type(x2), value_type(y2), value_type(z2)); + } + + template <typename T> + template <typename V1, typename V2> + GLM_FUNC_DECL tmat2x3<T>::tmat2x3 + ( + tvec3<V1> const & v1, + tvec3<V2> const & v2 + ) + { + this->value[0] = col_type(v1); + this->value[1] = col_type(v2); + } + + ////////////////////////////////////// + // Matrix conversions + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3 + ( + tmat2x3<U> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3 + ( + tmat2x2<T> const & m + ) + { + this->value[0] = col_type(m[0], T(0)); + this->value[1] = col_type(m[1], T(0)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3 + ( + tmat3x3<T> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3 + ( + tmat4x4<T> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3 + ( + tmat2x4<T> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3 + ( + tmat3x2<T> const & m + ) + { + this->value[0] = col_type(m[0], T(0)); + this->value[1] = col_type(m[1], T(0)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3 + ( + tmat3x4<T> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3 + ( + tmat4x2<T> const & m + ) + { + this->value[0] = col_type(m[0], T(0)); + this->value[1] = col_type(m[1], T(0)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x3<T>::tmat2x3 + ( + tmat4x3<T> const & m + ) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + } + + ////////////////////////////////////////////////////////////// + // Unary updatable operators + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x3<T>& tmat2x3<T>::operator= + ( + tmat2x3<T> const & m + ) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat2x3<T>& tmat2x3<T>::operator= + ( + tmat2x3<U> const & m + ) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat2x3<T> & tmat2x3<T>::operator+= (U s) + { + this->value[0] += s; + this->value[1] += s; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat2x3<T>& tmat2x3<T>::operator+= + ( + tmat2x3<U> const & m + ) + { + this->value[0] += m[0]; + this->value[1] += m[1]; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat2x3<T>& tmat2x3<T>::operator-= (U s) + { + this->value[0] -= s; + this->value[1] -= s; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat2x3<T>& tmat2x3<T>::operator-= + ( + tmat2x3<U> const & m + ) + { + this->value[0] -= m[0]; + this->value[1] -= m[1]; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat2x3<T>& tmat2x3<T>::operator*= (U s) + { + this->value[0] *= s; + this->value[1] *= s; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat2x3<T> & tmat2x3<T>::operator*= + ( + tmat2x3<U> const & m + ) + { + return (*this = tmat2x3<U>(*this * m)); + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat2x3<T> & tmat2x3<T>::operator/= (U s) + { + this->value[0] /= s; + this->value[1] /= s; + return *this; + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x3<T> & tmat2x3<T>::operator++ () + { + ++this->value[0]; + ++this->value[1]; + return *this; + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x3<T> & tmat2x3<T>::operator-- () + { + --this->value[0]; + --this->value[1]; + return *this; + } + + ////////////////////////////////////////////////////////////// + // Binary operators + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x3<T> operator+ + ( + tmat2x3<T> const & m, + typename tmat2x3<T>::value_type const & s + ) + { + return tmat2x3<T>( + m[0] + s, + m[1] + s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x3<T> operator+ + ( + tmat2x3<T> const & m1, + tmat2x3<T> const & m2 + ) + { + return tmat2x3<T>( + m1[0] + m2[0], + m1[1] + m2[1]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x3<T> operator- + ( + tmat2x3<T> const & m, + typename tmat2x3<T>::value_type const & s + ) + { + return tmat2x3<T>( + m[0] - s, + m[1] - s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x3<T> operator- + ( + tmat2x3<T> const & m1, + tmat2x3<T> const & m2 + ) + { + return tmat2x3<T>( + m1[0] - m2[0], + m1[1] - m2[1]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x3<T> operator* + ( + tmat2x3<T> const & m, + typename tmat2x3<T>::value_type const & s + ) + { + return tmat2x3<T>( + m[0] * s, + m[1] * s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x3<T> operator* + ( + typename tmat2x3<T>::value_type const & s, + tmat2x3<T> const & m + ) + { + return tmat2x3<T>( + m[0] * s, + m[1] * s); + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat2x3<T>::col_type operator* + ( + tmat2x3<T> const & m, + typename tmat2x3<T>::row_type const & v) + { + return typename tmat2x3<T>::col_type( + m[0][0] * v.x + m[1][0] * v.y, + m[0][1] * v.x + m[1][1] * v.y, + m[0][2] * v.x + m[1][2] * v.y); + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat2x3<T>::row_type operator* + ( + typename tmat2x3<T>::col_type const & v, + tmat2x3<T> const & m) + { + return typename tmat2x3<T>::row_type( + v.x * m[0][0] + v.y * m[0][1] + v.z * m[0][2], + v.x * m[1][0] + v.y * m[1][1] + v.z * m[1][2]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x3<T> operator* + ( + tmat2x3<T> const & m1, + tmat2x2<T> const & m2 + ) + { + return tmat2x3<T>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1], + m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1], + m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x3<T> operator* + ( + tmat2x3<T> const & m1, + tmat3x2<T> const & m2 + ) + { + typename tmat2x3<T>::value_type SrcA00 = m1[0][0]; + typename tmat2x3<T>::value_type SrcA01 = m1[0][1]; + typename tmat2x3<T>::value_type SrcA02 = m1[0][2]; + typename tmat2x3<T>::value_type SrcA10 = m1[1][0]; + typename tmat2x3<T>::value_type SrcA11 = m1[1][1]; + typename tmat2x3<T>::value_type SrcA12 = m1[1][2]; + + typename tmat2x3<T>::value_type SrcB00 = m2[0][0]; + typename tmat2x3<T>::value_type SrcB01 = m2[0][1]; + typename tmat2x3<T>::value_type SrcB10 = m2[1][0]; + typename tmat2x3<T>::value_type SrcB11 = m2[1][1]; + typename tmat2x3<T>::value_type SrcB20 = m2[2][0]; + typename tmat2x3<T>::value_type SrcB21 = m2[2][1]; + + tmat3x3<T> Result(tmat3x3<T>::null); + Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01; + Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01; + Result[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01; + Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11; + Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11; + Result[1][2] = SrcA02 * SrcB10 + SrcA12 * SrcB11; + Result[2][0] = SrcA00 * SrcB20 + SrcA10 * SrcB21; + Result[2][1] = SrcA01 * SrcB20 + SrcA11 * SrcB21; + Result[2][2] = SrcA02 * SrcB20 + SrcA12 * SrcB21; + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x3<T> operator* + ( + tmat2x3<T> const & m1, + tmat4x2<T> const & m2 + ) + { + return tmat4x3<T>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1], + m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1], + m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1], + m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1], + m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1], + m1[0][2] * m2[2][0] + m1[1][2] * m2[2][1], + m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1], + m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1], + m1[0][2] * m2[3][0] + m1[1][2] * m2[3][1]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x3<T> operator/ + ( + tmat2x3<T> const & m, + typename tmat2x3<T>::value_type const & s + ) + { + return tmat2x3<T>( + m[0] / s, + m[1] / s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x3<T> operator/ + ( + typename tmat2x3<T>::value_type const & s, + tmat2x3<T> const & m + ) + { + return tmat2x3<T>( + s / m[0], + s / m[1]); + } + + // Unary constant operators + template <typename T> + GLM_FUNC_QUALIFIER tmat2x3<T> const operator- + ( + tmat2x3<T> const & m + ) + { + return tmat2x3<T>( + -m[0], + -m[1]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x3<T> const operator++ + ( + tmat2x3<T> const & m, + int + ) + { + return tmat2x3<T>( + m[0] + typename tmat2x3<T>::value_type(1), + m[1] + typename tmat2x3<T>::value_type(1)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x3<T> const operator-- + ( + tmat2x3<T> const & m, + int + ) + { + return tmat2x3<T>( + m[0] - typename tmat2x3<T>::value_type(1), + m[1] - typename tmat2x3<T>::value_type(1)); + } + + ////////////////////////////////////// + // Boolean operators + + template <typename T> + GLM_FUNC_QUALIFIER bool operator== + ( + tmat2x3<T> const & m1, + tmat2x3<T> const & m2 + ) + { + return (m1[0] == m2[0]) && (m1[1] == m2[1]); + } + + template <typename T> + GLM_FUNC_QUALIFIER bool operator!= + ( + tmat2x3<T> const & m1, + tmat2x3<T> const & m2 + ) + { + return (m1[0] != m2[0]) || (m1[1] != m2[1]); + } +} //namespace detail +} //namespace glm diff --git a/include/gal/opengl/glm/core/type_mat2x4.hpp b/include/gal/opengl/glm/core/type_mat2x4.hpp new file mode 100644 index 0000000..c335700 --- /dev/null +++ b/include/gal/opengl/glm/core/type_mat2x4.hpp @@ -0,0 +1,260 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/type_mat2x4.hpp +/// @date 2006-08-05 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_type_mat2x4 +#define glm_core_type_mat2x4 + +#include "type_mat.hpp" + +namespace glm{ +namespace detail +{ + template <typename T> struct tvec1; + template <typename T> struct tvec2; + template <typename T> struct tvec3; + template <typename T> struct tvec4; + template <typename T> struct tmat2x2; + template <typename T> struct tmat2x3; + template <typename T> struct tmat2x4; + template <typename T> struct tmat3x2; + template <typename T> struct tmat3x3; + template <typename T> struct tmat3x4; + template <typename T> struct tmat4x2; + template <typename T> struct tmat4x3; + template <typename T> struct tmat4x4; + + template <typename T> + struct tmat2x4 + { + enum ctor{null}; + typedef T value_type; + typedef std::size_t size_type; + typedef tvec4<T> col_type; + typedef tvec2<T> row_type; + typedef tmat2x4<T> type; + typedef tmat4x2<T> transpose_type; + + static GLM_FUNC_DECL size_type col_size(); + static GLM_FUNC_DECL size_type row_size(); + + GLM_FUNC_DECL GLM_CONSTEXPR size_type length() const; + + private: + // Data + col_type value[2]; + + public: + // Constructors + GLM_FUNC_DECL tmat2x4(); + GLM_FUNC_DECL tmat2x4(tmat2x4 const & m); + + GLM_FUNC_DECL explicit tmat2x4( + ctor); + GLM_FUNC_DECL explicit tmat2x4( + value_type const & s); + GLM_FUNC_DECL explicit tmat2x4( + value_type const & x0, value_type const & y0, value_type const & z0, value_type const & w0, + value_type const & x1, value_type const & y1, value_type const & z1, value_type const & w1); + GLM_FUNC_DECL explicit tmat2x4( + col_type const & v0, + col_type const & v1); + + ////////////////////////////////////// + // Conversions + template <typename U> + GLM_FUNC_DECL explicit tmat2x4( + U const & x); + + template < + typename X1, typename Y1, typename Z1, typename W1, + typename X2, typename Y2, typename Z2, typename W2> + GLM_FUNC_DECL explicit tmat2x4( + X1 const & x1, Y1 const & y1, Z1 const & z1, W1 const & w1, + X2 const & x2, Y2 const & y2, Z2 const & z2, W2 const & w2); + + template <typename U, typename V> + GLM_FUNC_DECL explicit tmat2x4( + tvec4<U> const & v1, + tvec4<V> const & v2); + + ////////////////////////////////////// + // Matrix conversions + template <typename U> + GLM_FUNC_DECL explicit tmat2x4(tmat2x4<U> const & m); + + GLM_FUNC_DECL explicit tmat2x4(tmat2x2<T> const & x); + GLM_FUNC_DECL explicit tmat2x4(tmat3x3<T> const & x); + GLM_FUNC_DECL explicit tmat2x4(tmat4x4<T> const & x); + GLM_FUNC_DECL explicit tmat2x4(tmat2x3<T> const & x); + GLM_FUNC_DECL explicit tmat2x4(tmat3x2<T> const & x); + GLM_FUNC_DECL explicit tmat2x4(tmat3x4<T> const & x); + GLM_FUNC_DECL explicit tmat2x4(tmat4x2<T> const & x); + GLM_FUNC_DECL explicit tmat2x4(tmat4x3<T> const & x); + + // Accesses + GLM_FUNC_DECL col_type & operator[](size_type i); + GLM_FUNC_DECL col_type const & operator[](size_type i) const; + + // Unary updatable operators + GLM_FUNC_DECL tmat2x4<T>& operator= (tmat2x4<T> const & m); + template <typename U> + GLM_FUNC_DECL tmat2x4<T>& operator= (tmat2x4<U> const & m); + template <typename U> + GLM_FUNC_DECL tmat2x4<T>& operator+= (U s); + template <typename U> + GLM_FUNC_DECL tmat2x4<T>& operator+= (tmat2x4<U> const & m); + template <typename U> + GLM_FUNC_DECL tmat2x4<T>& operator-= (U s); + template <typename U> + GLM_FUNC_DECL tmat2x4<T>& operator-= (tmat2x4<U> const & m); + template <typename U> + GLM_FUNC_DECL tmat2x4<T>& operator*= (U s); + template <typename U> + GLM_FUNC_DECL tmat2x4<T>& operator*= (tmat2x4<U> const & m); + template <typename U> + GLM_FUNC_DECL tmat2x4<T>& operator/= (U s); + + GLM_FUNC_DECL tmat2x4<T>& operator++ (); + GLM_FUNC_DECL tmat2x4<T>& operator-- (); + }; + + // Binary operators + template <typename T> + GLM_FUNC_DECL tmat2x4<T> operator+ ( + tmat2x4<T> const & m, + typename tmat2x4<T>::value_type const & s); + + template <typename T> + GLM_FUNC_DECL tmat2x4<T> operator+ ( + tmat2x4<T> const & m1, + tmat2x4<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat2x4<T> operator- ( + tmat2x4<T> const & m, + typename tmat2x4<T>::value_type const & s); + + template <typename T> + GLM_FUNC_DECL tmat2x4<T> operator- ( + tmat2x4<T> const & m1, + tmat2x4<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat2x4<T> operator* ( + tmat2x4<T> const & m, + typename tmat2x4<T>::value_type const & s); + + template <typename T> + GLM_FUNC_DECL tmat2x4<T> operator* ( + typename tmat2x4<T>::value_type const & s, + tmat2x4<T> const & m); + + template <typename T> + GLM_FUNC_DECL typename tmat2x4<T>::col_type operator* ( + tmat2x4<T> const & m, + typename tmat2x4<T>::row_type const & v); + + template <typename T> + GLM_FUNC_DECL typename tmat2x4<T>::row_type operator* ( + typename tmat2x4<T>::col_type const & v, + tmat2x4<T> const & m); + + template <typename T> + GLM_FUNC_DECL tmat4x4<T> operator* ( + tmat2x4<T> const & m1, + tmat4x2<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat2x4<T> operator* ( + tmat2x4<T> const & m1, + tmat2x2<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat3x4<T> operator* ( + tmat2x4<T> const & m1, + tmat3x2<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat2x4<T> operator/ ( + tmat2x4<T> const & m, + typename tmat2x4<T>::value_type const & s); + + template <typename T> + GLM_FUNC_DECL tmat2x4<T> operator/ ( + typename tmat2x4<T>::value_type const & s, + tmat2x4<T> const & m); + + // Unary constant operators + template <typename T> + GLM_FUNC_DECL tmat2x4<T> const operator- ( + tmat2x4<T> const & m); + + template <typename T> + GLM_FUNC_DECL tmat2x4<T> const operator-- ( + tmat2x4<T> const & m, + int); + + template <typename T> + GLM_FUNC_DECL tmat2x4<T> const operator++ ( + tmat2x4<T> const & m, + int); + +} //namespace detail + + /// @addtogroup core_precision + /// @{ + + /// 2 columns of 4 components matrix of low precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tmat2x4<lowp_float> lowp_mat2x4; + + /// 2 columns of 4 components matrix of medium precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tmat2x4<mediump_float> mediump_mat2x4; + + /// 2 columns of 4 components matrix of high precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tmat2x4<highp_float> highp_mat2x4; + + /// @} +}//namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_mat2x4.inl" +#endif + +#endif //glm_core_type_mat2x4 diff --git a/include/gal/opengl/glm/core/type_mat2x4.inl b/include/gal/opengl/glm/core/type_mat2x4.inl new file mode 100644 index 0000000..598bddc --- /dev/null +++ b/include/gal/opengl/glm/core/type_mat2x4.inl @@ -0,0 +1,652 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/type_mat2x4.inl +/// @date 2006-08-05 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +namespace glm{ +namespace detail +{ + template <typename T> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename tmat2x4<T>::size_type tmat2x4<T>::length() const + { + return 2; + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat2x4<T>::size_type tmat2x4<T>::col_size() + { + return 4; + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat2x4<T>::size_type tmat2x4<T>::row_size() + { + return 2; + } + + ////////////////////////////////////// + // Accesses + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat2x4<T>::col_type & + tmat2x4<T>::operator[] + ( + size_type i + ) + { + assert(i < this->length()); + return this->value[i]; + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat2x4<T>::col_type const & + tmat2x4<T>::operator[] + ( + size_type i + ) const + { + assert(i < this->length()); + return this->value[i]; + } + + ////////////////////////////////////////////////////////////// + // Constructors + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x4<T>::tmat2x4() + { + value_type const Zero(0); + value_type const One(1); + this->value[0] = col_type(One, Zero, Zero, Zero); + this->value[1] = col_type(Zero, One, Zero, Zero); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x4<T>::tmat2x4 + ( + tmat2x4<T> const & m + ) + { + this->value[0] = m.value[0]; + this->value[1] = m.value[1]; + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x4<T>::tmat2x4 + ( + ctor + ) + {} + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x4<T>::tmat2x4 + ( + value_type const & s + ) + { + value_type const Zero(0); + this->value[0] = col_type(s, Zero, Zero, Zero); + this->value[1] = col_type(Zero, s, Zero, Zero); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x4<T>::tmat2x4 + ( + value_type const & x0, value_type const & y0, value_type const & z0, value_type const & w0, + value_type const & x1, value_type const & y1, value_type const & z1, value_type const & w1 + ) + { + this->value[0] = col_type(x0, y0, z0, w0); + this->value[1] = col_type(x1, y1, z1, w1); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x4<T>::tmat2x4 + ( + col_type const & v0, + col_type const & v1 + ) + { + this->value[0] = v0; + this->value[1] = v1; + } + + ////////////////////////////////////// + // Convertion constructors + template <typename T> + template <typename U> + GLM_FUNC_DECL tmat2x4<T>::tmat2x4 + ( + U const & s + ) + { + value_type const Zero(0); + this->value[0] = tvec4<T>(value_type(s), Zero, Zero, Zero); + this->value[1] = tvec4<T>(Zero, value_type(s), Zero, Zero); + } + + template <typename T> + template < + typename X1, typename Y1, typename Z1, typename W1, + typename X2, typename Y2, typename Z2, typename W2> + GLM_FUNC_DECL tmat2x4<T>::tmat2x4 + ( + X1 const & x1, Y1 const & y1, Z1 const & z1, W1 const & w1, + X2 const & x2, Y2 const & y2, Z2 const & z2, W2 const & w2 + ) + { + this->value[0] = col_type(value_type(x1), value_type(y1), value_type(z1), value_type(w1)); + this->value[1] = col_type(value_type(x2), value_type(y2), value_type(z2), value_type(w2)); + } + + template <typename T> + template <typename V1, typename V2> + GLM_FUNC_DECL tmat2x4<T>::tmat2x4 + ( + tvec4<V1> const & v1, + tvec4<V2> const & v2 + ) + { + this->value[0] = col_type(v1); + this->value[1] = col_type(v2); + } + + ////////////////////////////////////// + // Matrix conversions + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat2x4<T>::tmat2x4 + ( + tmat2x4<U> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x4<T>::tmat2x4 + ( + tmat2x2<T> const & m + ) + { + this->value[0] = col_type(m[0], detail::tvec2<T>(0)); + this->value[1] = col_type(m[1], detail::tvec2<T>(0)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x4<T>::tmat2x4 + ( + tmat3x3<T> const & m + ) + { + this->value[0] = col_type(m[0], T(0)); + this->value[1] = col_type(m[1], T(0)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x4<T>::tmat2x4 + ( + tmat4x4<T> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x4<T>::tmat2x4 + ( + tmat2x3<T> const & m + ) + { + this->value[0] = col_type(m[0], T(0)); + this->value[1] = col_type(m[1], T(0)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x4<T>::tmat2x4 + ( + tmat3x2<T> const & m + ) + { + this->value[0] = col_type(m[0], detail::tvec2<T>(0)); + this->value[1] = col_type(m[1], detail::tvec2<T>(0)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x4<T>::tmat2x4 + ( + tmat3x4<T> const & m + ) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x4<T>::tmat2x4 + ( + tmat4x2<T> const & m + ) + { + this->value[0] = col_type(m[0], detail::tvec2<T>(T(0))); + this->value[1] = col_type(m[1], detail::tvec2<T>(T(0))); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x4<T>::tmat2x4 + ( + tmat4x3<T> const & m + ) + { + this->value[0] = col_type(m[0], T(0)); + this->value[1] = col_type(m[1], T(0)); + } + + ////////////////////////////////////////////////////////////// + // Unary updatable operators + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x4<T>& tmat2x4<T>::operator= + ( + tmat2x4<T> const & m + ) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat2x4<T>& tmat2x4<T>::operator= + ( + tmat2x4<U> const & m + ) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat2x4<T>& tmat2x4<T>::operator+= (U s) + { + this->value[0] += s; + this->value[1] += s; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat2x4<T>& tmat2x4<T>::operator+= + ( + tmat2x4<U> const & m + ) + { + this->value[0] += m[0]; + this->value[1] += m[1]; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat2x4<T>& tmat2x4<T>::operator-= (U s) + { + this->value[0] -= s; + this->value[1] -= s; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat2x4<T>& tmat2x4<T>::operator-= + ( + tmat2x4<U> const & m + ) + { + this->value[0] -= m[0]; + this->value[1] -= m[1]; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat2x4<T>& tmat2x4<T>::operator*= (U s) + { + this->value[0] *= s; + this->value[1] *= s; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat2x4<T>& tmat2x4<T>::operator*= + ( + tmat2x4<U> const & m + ) + { + return (*this = tmat2x4<T>(*this * m)); + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat2x4<T> & tmat2x4<T>::operator/= (U s) + { + this->value[0] /= s; + this->value[1] /= s; + return *this; + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x4<T>& tmat2x4<T>::operator++ () + { + ++this->value[0]; + ++this->value[1]; + return *this; + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x4<T>& tmat2x4<T>::operator-- () + { + --this->value[0]; + --this->value[1]; + return *this; + } + + ////////////////////////////////////////////////////////////// + // Binary operators + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x4<T> operator+ + ( + tmat2x4<T> const & m, + typename tmat2x4<T>::value_type const & s + ) + { + return tmat2x4<T>( + m[0] + s, + m[1] + s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x4<T> operator+ + ( + tmat2x4<T> const & m1, + tmat2x4<T> const & m2 + ) + { + return tmat2x4<T>( + m1[0] + m2[0], + m1[1] + m2[1]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x4<T> operator- + ( + tmat2x4<T> const & m, + typename tmat2x4<T>::value_type const & s + ) + { + return tmat2x4<T>( + m[0] - s, + m[1] - s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x4<T> operator- + ( + tmat2x4<T> const & m1, + tmat2x4<T> const & m2 + ) + { + return tmat2x4<T>( + m1[0] - m2[0], + m1[1] - m2[1]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x4<T> operator* + ( + tmat2x4<T> const & m, + typename tmat2x4<T>::value_type const & s + ) + { + return tmat2x4<T>( + m[0] * s, + m[1] * s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x4<T> operator* + ( + typename tmat2x4<T>::value_type const & s, + tmat2x4<T> const & m + ) + { + return tmat2x4<T>( + m[0] * s, + m[1] * s); + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat2x4<T>::col_type operator* + ( + tmat2x4<T> const & m, + typename tmat2x4<T>::row_type const & v + ) + { + return typename tmat2x4<T>::col_type( + m[0][0] * v.x + m[1][0] * v.y, + m[0][1] * v.x + m[1][1] * v.y, + m[0][2] * v.x + m[1][2] * v.y, + m[0][3] * v.x + m[1][3] * v.y); + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat2x4<T>::row_type operator* + ( + typename tmat2x4<T>::col_type const & v, + tmat2x4<T> const & m + ) + { + return typename tmat2x4<T>::row_type( + v.x * m[0][0] + v.y * m[0][1] + v.z * m[0][2] + v.w * m[0][3], + v.x * m[1][0] + v.y * m[1][1] + v.z * m[1][2] + v.w * m[1][3]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x4<T> operator* + ( + tmat2x4<T> const & m1, + tmat4x2<T> const & m2 + ) + { + typename tmat2x4<T>::value_type SrcA00 = m1[0][0]; + typename tmat2x4<T>::value_type SrcA01 = m1[0][1]; + typename tmat2x4<T>::value_type SrcA02 = m1[0][2]; + typename tmat2x4<T>::value_type SrcA03 = m1[0][3]; + typename tmat2x4<T>::value_type SrcA10 = m1[1][0]; + typename tmat2x4<T>::value_type SrcA11 = m1[1][1]; + typename tmat2x4<T>::value_type SrcA12 = m1[1][2]; + typename tmat2x4<T>::value_type SrcA13 = m1[1][3]; + + typename tmat2x4<T>::value_type SrcB00 = m2[0][0]; + typename tmat2x4<T>::value_type SrcB01 = m2[0][1]; + typename tmat2x4<T>::value_type SrcB10 = m2[1][0]; + typename tmat2x4<T>::value_type SrcB11 = m2[1][1]; + typename tmat2x4<T>::value_type SrcB20 = m2[2][0]; + typename tmat2x4<T>::value_type SrcB21 = m2[2][1]; + typename tmat2x4<T>::value_type SrcB30 = m2[3][0]; + typename tmat2x4<T>::value_type SrcB31 = m2[3][1]; + + tmat4x4<T> Result(tmat4x4<T>::null); + Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01; + Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01; + Result[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01; + Result[0][3] = SrcA03 * SrcB00 + SrcA13 * SrcB01; + Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11; + Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11; + Result[1][2] = SrcA02 * SrcB10 + SrcA12 * SrcB11; + Result[1][3] = SrcA03 * SrcB10 + SrcA13 * SrcB11; + Result[2][0] = SrcA00 * SrcB20 + SrcA10 * SrcB21; + Result[2][1] = SrcA01 * SrcB20 + SrcA11 * SrcB21; + Result[2][2] = SrcA02 * SrcB20 + SrcA12 * SrcB21; + Result[2][3] = SrcA03 * SrcB20 + SrcA13 * SrcB21; + Result[3][0] = SrcA00 * SrcB30 + SrcA10 * SrcB31; + Result[3][1] = SrcA01 * SrcB30 + SrcA11 * SrcB31; + Result[3][2] = SrcA02 * SrcB30 + SrcA12 * SrcB31; + Result[3][3] = SrcA03 * SrcB30 + SrcA13 * SrcB31; + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x4<T> operator* + ( + tmat2x4<T> const & m1, + tmat2x2<T> const & m2 + ) + { + return tmat2x4<T>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1], + m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1], + m1[0][3] * m2[0][0] + m1[1][3] * m2[0][1], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1], + m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1], + m1[0][3] * m2[1][0] + m1[1][3] * m2[1][1]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x4<T> operator* + ( + tmat2x4<T> const & m1, + tmat3x2<T> const & m2 + ) + { + return tmat3x4<T>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1], + m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1], + m1[0][3] * m2[0][0] + m1[1][3] * m2[0][1], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1], + m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1], + m1[0][3] * m2[1][0] + m1[1][3] * m2[1][1], + m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1], + m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1], + m1[0][2] * m2[2][0] + m1[1][2] * m2[2][1], + m1[0][3] * m2[2][0] + m1[1][3] * m2[2][1]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x4<T> operator/ + ( + tmat2x4<T> const & m, + typename tmat2x4<T>::value_type const & s + ) + { + return tmat2x4<T>( + m[0] / s, + m[1] / s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x4<T> operator/ + ( + typename tmat2x4<T>::value_type const & s, + tmat2x4<T> const & m + ) + { + return tmat2x4<T>( + s / m[0], + s / m[1]); + } + + // Unary constant operators + template <typename T> + GLM_FUNC_QUALIFIER tmat2x4<T> const operator- + ( + tmat2x4<T> const & m + ) + { + return tmat2x4<T>( + -m[0], + -m[1]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x4<T> const operator++ + ( + tmat2x4<T> const & m, + int + ) + { + return tmat2x4<T>( + m[0] + typename tmat2x4<T>::value_type(1), + m[1] + typename tmat2x4<T>::value_type(1)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x4<T> const operator-- + ( + tmat2x4<T> const & m, + int + ) + { + return tmat2x4<T>( + m[0] - typename tmat2x4<T>::value_type(1), + m[1] - typename tmat2x4<T>::value_type(1)); + } + + ////////////////////////////////////// + // Boolean operators + + template <typename T> + GLM_FUNC_QUALIFIER bool operator== + ( + tmat2x4<T> const & m1, + tmat2x4<T> const & m2 + ) + { + return (m1[0] == m2[0]) && (m1[1] == m2[1]); + } + + template <typename T> + GLM_FUNC_QUALIFIER bool operator!= + ( + tmat2x4<T> const & m1, + tmat2x4<T> const & m2 + ) + { + return (m1[0] != m2[0]) || (m1[1] != m2[1]); + } +} //namespace detail +} //namespace glm diff --git a/include/gal/opengl/glm/core/type_mat3x2.hpp b/include/gal/opengl/glm/core/type_mat3x2.hpp new file mode 100644 index 0000000..06a3228 --- /dev/null +++ b/include/gal/opengl/glm/core/type_mat3x2.hpp @@ -0,0 +1,265 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/type_mat3x2.hpp +/// @date 2006-08-05 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_type_mat3x2 +#define glm_core_type_mat3x2 + +#include "type_mat.hpp" + +namespace glm{ +namespace detail +{ + template <typename T> struct tvec1; + template <typename T> struct tvec2; + template <typename T> struct tvec3; + template <typename T> struct tvec4; + template <typename T> struct tmat2x2; + template <typename T> struct tmat2x3; + template <typename T> struct tmat2x4; + template <typename T> struct tmat3x2; + template <typename T> struct tmat3x3; + template <typename T> struct tmat3x4; + template <typename T> struct tmat4x2; + template <typename T> struct tmat4x3; + template <typename T> struct tmat4x4; + + template <typename T> + struct tmat3x2 + { + enum ctor{null}; + typedef T value_type; + typedef std::size_t size_type; + typedef tvec2<T> col_type; + typedef tvec3<T> row_type; + typedef tmat3x2<T> type; + typedef tmat2x3<T> transpose_type; + + static GLM_FUNC_DECL size_type col_size(); + static GLM_FUNC_DECL size_type row_size(); + + GLM_FUNC_DECL GLM_CONSTEXPR size_type length() const; + + private: + // Data + col_type value[3]; + + public: + // Constructors + GLM_FUNC_DECL tmat3x2(); + GLM_FUNC_DECL tmat3x2(tmat3x2 const & m); + + GLM_FUNC_DECL explicit tmat3x2( + ctor); + GLM_FUNC_DECL explicit tmat3x2( + value_type const & s); + GLM_FUNC_DECL explicit tmat3x2( + value_type const & x0, value_type const & y0, + value_type const & x1, value_type const & y1, + value_type const & x2, value_type const & y2); + GLM_FUNC_DECL explicit tmat3x2( + col_type const & v0, + col_type const & v1, + col_type const & v2); + + ////////////////////////////////////// + // Conversions + template <typename U> + GLM_FUNC_DECL explicit tmat3x2( + U const & x); + + template + < + typename X1, typename Y1, + typename X2, typename Y2, + typename X3, typename Y3 + > + GLM_FUNC_DECL explicit tmat3x2( + X1 const & x1, Y1 const & y1, + X2 const & x2, Y2 const & y2, + X3 const & x3, Y3 const & y3); + + template <typename V1, typename V2, typename V3> + GLM_FUNC_DECL explicit tmat3x2( + tvec2<V1> const & v1, + tvec2<V2> const & v2, + tvec2<V3> const & v3); + + // Matrix conversions + template <typename U> + GLM_FUNC_DECL explicit tmat3x2(tmat3x2<U> const & m); + + GLM_FUNC_DECL explicit tmat3x2(tmat2x2<T> const & x); + GLM_FUNC_DECL explicit tmat3x2(tmat3x3<T> const & x); + GLM_FUNC_DECL explicit tmat3x2(tmat4x4<T> const & x); + GLM_FUNC_DECL explicit tmat3x2(tmat2x3<T> const & x); + GLM_FUNC_DECL explicit tmat3x2(tmat2x4<T> const & x); + GLM_FUNC_DECL explicit tmat3x2(tmat3x4<T> const & x); + GLM_FUNC_DECL explicit tmat3x2(tmat4x2<T> const & x); + GLM_FUNC_DECL explicit tmat3x2(tmat4x3<T> const & x); + + // Accesses + GLM_FUNC_DECL col_type & operator[](size_type i); + GLM_FUNC_DECL col_type const & operator[](size_type i) const; + + // Unary updatable operators + GLM_FUNC_DECL tmat3x2<T> & operator= (tmat3x2<T> const & m); + template <typename U> + GLM_FUNC_DECL tmat3x2<T> & operator= (tmat3x2<U> const & m); + template <typename U> + GLM_FUNC_DECL tmat3x2<T> & operator+= (U s); + template <typename U> + GLM_FUNC_DECL tmat3x2<T> & operator+= (tmat3x2<U> const & m); + template <typename U> + GLM_FUNC_DECL tmat3x2<T> & operator-= (U s); + template <typename U> + GLM_FUNC_DECL tmat3x2<T> & operator-= (tmat3x2<U> const & m); + template <typename U> + GLM_FUNC_DECL tmat3x2<T> & operator*= (U s); + template <typename U> + GLM_FUNC_DECL tmat3x2<T> & operator*= (tmat3x2<U> const & m); + template <typename U> + GLM_FUNC_DECL tmat3x2<T> & operator/= (U s); + + GLM_FUNC_DECL tmat3x2<T> & operator++ (); + GLM_FUNC_DECL tmat3x2<T> & operator-- (); + }; + + // Binary operators + template <typename T> + GLM_FUNC_DECL tmat3x2<T> operator+ ( + tmat3x2<T> const & m, + typename tmat3x2<T>::value_type const & s); + + template <typename T> + GLM_FUNC_DECL tmat3x2<T> operator+ ( + tmat3x2<T> const & m1, + tmat3x2<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat3x2<T> operator- ( + tmat3x2<T> const & m, + typename tmat3x2<T>::value_type const & s); + + template <typename T> + GLM_FUNC_DECL tmat3x2<T> operator- ( + tmat3x2<T> const & m1, + tmat3x2<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat3x2<T> operator* ( + tmat3x2<T> const & m, + typename tmat3x2<T>::value_type const & s); + + template <typename T> + GLM_FUNC_DECL tmat3x2<T> operator* ( + typename tmat3x2<T>::value_type const & s, + tmat3x2<T> const & m); + + template <typename T> + GLM_FUNC_DECL typename tmat3x2<T>::col_type operator* ( + tmat3x2<T> const & m, + typename tmat3x2<T>::row_type const & v); + + template <typename T> + GLM_FUNC_DECL typename tmat3x2<T>::row_type operator* ( + typename tmat3x2<T>::col_type const & v, + tmat3x2<T> const & m); + + template <typename T> + GLM_FUNC_DECL tmat2x2<T> operator* ( + tmat3x2<T> const & m1, + tmat2x3<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat3x2<T> operator* ( + tmat3x2<T> const & m1, + tmat3x3<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat4x2<T> operator* ( + tmat3x2<T> const & m1, + tmat4x3<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat3x2<T> operator/ ( + tmat3x2<T> const & m, + typename tmat3x2<T>::value_type const & s); + + template <typename T> + GLM_FUNC_DECL tmat3x2<T> operator/ ( + typename tmat3x2<T>::value_type const & s, + tmat3x2<T> const & m); + + // Unary constant operators + template <typename T> + GLM_FUNC_DECL tmat3x2<T> const operator- ( + tmat3x2<T> const & m); + + template <typename T> + GLM_FUNC_DECL tmat3x2<T> const operator-- ( + tmat3x2<T> const & m, + int); + + template <typename T> + GLM_FUNC_DECL tmat3x2<T> const operator++ ( + tmat3x2<T> const & m, + int); +} //namespace detail + + /// @addtogroup core_precision + /// @{ + + /// 3 columns of 2 components matrix of low precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tmat3x2<lowp_float> lowp_mat3x2; + + /// 3 columns of 2 components matrix of medium precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tmat3x2<mediump_float> mediump_mat3x2; + + /// 3 columns of 2 components matrix of high precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tmat3x2<highp_float> highp_mat3x2; + + /// @} +}//namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_mat3x2.inl" +#endif + +#endif //glm_core_type_mat3x2 diff --git a/include/gal/opengl/glm/core/type_mat3x2.inl b/include/gal/opengl/glm/core/type_mat3x2.inl new file mode 100644 index 0000000..7d7e16e --- /dev/null +++ b/include/gal/opengl/glm/core/type_mat3x2.inl @@ -0,0 +1,670 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/type_mat3x2.inl +/// @date 2006-08-05 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +namespace glm{ +namespace detail +{ + template <typename T> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename tmat3x2<T>::size_type tmat3x2<T>::length() const + { + return 3; + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat3x2<T>::size_type tmat3x2<T>::col_size() + { + return 2; + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat3x2<T>::size_type tmat3x2<T>::row_size() + { + return 3; + } + + ////////////////////////////////////// + // Accesses + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat3x2<T>::col_type & + tmat3x2<T>::operator[] + ( + size_type i + ) + { + assert(i < this->length()); + return this->value[i]; + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat3x2<T>::col_type const & + tmat3x2<T>::operator[] + ( + size_type i + ) const + { + assert(i < this->length()); + return this->value[i]; + } + + ////////////////////////////////////////////////////////////// + // Constructors + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x2<T>::tmat3x2() + { + this->value[0] = col_type(1, 0); + this->value[1] = col_type(0, 1); + this->value[2] = col_type(0, 0); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x2<T>::tmat3x2 + ( + tmat3x2<T> const & m + ) + { + this->value[0] = m.value[0]; + this->value[1] = m.value[1]; + this->value[2] = m.value[2]; + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x2<T>::tmat3x2 + ( + ctor + ) + {} + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x2<T>::tmat3x2 + ( + value_type const & s + ) + { + this->value[0] = col_type(s, 0); + this->value[1] = col_type(0, s); + this->value[2] = col_type(0, 0); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x2<T>::tmat3x2 + ( + value_type const & x0, value_type const & y0, + value_type const & x1, value_type const & y1, + value_type const & x2, value_type const & y2 + ) + { + this->value[0] = col_type(x0, y0); + this->value[1] = col_type(x1, y1); + this->value[2] = col_type(x2, y2); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x2<T>::tmat3x2 + ( + col_type const & v0, + col_type const & v1, + col_type const & v2 + ) + { + this->value[0] = v0; + this->value[1] = v1; + this->value[2] = v2; + } + + ////////////////////////////////////// + // Convertion constructors + template <typename T> + template <typename U> + GLM_FUNC_DECL tmat3x2<T>::tmat3x2 + ( + U const & s + ) + { + value_type const Zero(0); + this->value[0] = tvec2<T>(value_type(s), Zero); + this->value[1] = tvec2<T>(Zero, value_type(s)); + this->value[2] = tvec2<T>(Zero); + } + + template <typename T> + template < + typename X1, typename Y1, + typename X2, typename Y2, + typename X3, typename Y3> + GLM_FUNC_DECL tmat3x2<T>::tmat3x2 + ( + X1 const & x1, Y1 const & y1, + X2 const & x2, Y2 const & y2, + X3 const & x3, Y3 const & y3 + ) + { + this->value[0] = col_type(value_type(x1), value_type(y1)); + this->value[1] = col_type(value_type(x2), value_type(y2)); + this->value[2] = col_type(value_type(x3), value_type(y3)); + } + + template <typename T> + template <typename V1, typename V2, typename V3> + GLM_FUNC_DECL tmat3x2<T>::tmat3x2 + ( + tvec2<V1> const & v1, + tvec2<V2> const & v2, + tvec2<V3> const & v3 + ) + { + this->value[0] = col_type(v1); + this->value[1] = col_type(v2); + this->value[2] = col_type(v3); + } + + ////////////////////////////////////////////////////////////// + // mat3x2 matrix conversions + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat3x2<T>::tmat3x2 + ( + tmat3x2<U> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x2<T>::tmat3x2 + ( + tmat2x2<T> const & m + ) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = col_type(T(0)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x2<T>::tmat3x2 + ( + tmat3x3<T> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x2<T>::tmat3x2 + ( + tmat4x4<T> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x2<T>::tmat3x2 + ( + tmat2x3<T> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(T(0)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x2<T>::tmat3x2 + ( + tmat2x4<T> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(T(0)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x2<T>::tmat3x2 + ( + tmat3x4<T> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x2<T>::tmat3x2 + ( + tmat4x2<T> const & m + ) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x2<T>::tmat3x2 + ( + tmat4x3<T> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + } + + ////////////////////////////////////////////////////////////// + // Unary updatable operators + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x2<T>& tmat3x2<T>::operator= + ( + tmat3x2<T> const & m + ) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat3x2<T>& tmat3x2<T>::operator= + ( + tmat3x2<U> const & m + ) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat3x2<T>& tmat3x2<T>::operator+= (U s) + { + this->value[0] += s; + this->value[1] += s; + this->value[2] += s; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat3x2<T>& tmat3x2<T>::operator+= + ( + tmat3x2<U> const & m + ) + { + this->value[0] += m[0]; + this->value[1] += m[1]; + this->value[2] += m[2]; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat3x2<T>& tmat3x2<T>::operator-= (U s) + { + this->value[0] -= s; + this->value[1] -= s; + this->value[2] -= s; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat3x2<T>& tmat3x2<T>::operator-= + ( + tmat3x2<U> const & m + ) + { + this->value[0] -= m[0]; + this->value[1] -= m[1]; + this->value[2] -= m[2]; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat3x2<T>& tmat3x2<T>::operator*= (U s) + { + this->value[0] *= s; + this->value[1] *= s; + this->value[2] *= s; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat3x2<T>& tmat3x2<T>::operator*= + ( + tmat3x2<U> const & m + ) + { + return (*this = tmat3x2<T>(*this * m)); + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat3x2<T> & tmat3x2<T>::operator/= (U s) + { + this->value[0] /= s; + this->value[1] /= s; + this->value[2] /= s; + return *this; + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x2<T>& tmat3x2<T>::operator++ () + { + ++this->value[0]; + ++this->value[1]; + ++this->value[2]; + return *this; + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x2<T>& tmat3x2<T>::operator-- () + { + --this->value[0]; + --this->value[1]; + --this->value[2]; + return *this; + } + + ////////////////////////////////////////////////////////////// + // Binary operators + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x2<T> operator+ + ( + tmat3x2<T> const & m, + typename tmat3x2<T>::value_type const & s + ) + { + return tmat3x2<T>( + m[0] + s, + m[1] + s, + m[2] + s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x2<T> operator+ + ( + tmat3x2<T> const & m1, + tmat3x2<T> const & m2 + ) + { + return tmat3x2<T>( + m1[0] + m2[0], + m1[1] + m2[1], + m1[2] + m2[2]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x2<T> operator- + ( + tmat3x2<T> const & m, + typename tmat3x2<T>::value_type const & s + ) + { + return tmat3x2<T>( + m[0] - s, + m[1] - s, + m[2] - s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x2<T> operator- + ( + tmat3x2<T> const & m1, + tmat3x2<T> const & m2 + ) + { + return tmat3x2<T>( + m1[0] - m2[0], + m1[1] - m2[1], + m1[2] - m2[2]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x2<T> operator* + ( + tmat3x2<T> const & m, + typename tmat3x2<T>::value_type const & s + ) + { + return tmat3x2<T>( + m[0] * s, + m[1] * s, + m[2] * s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x2<T> operator* + ( + typename tmat3x2<T>::value_type const & s, + tmat3x2<T> const & m + ) + { + return tmat3x2<T>( + m[0] * s, + m[1] * s, + m[2] * s); + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat3x2<T>::col_type operator* + ( + tmat3x2<T> const & m, + typename tmat3x2<T>::row_type const & v) + { + return typename tmat3x2<T>::col_type( + m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z, + m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z); + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat3x2<T>::row_type operator* + ( + typename tmat3x2<T>::col_type const & v, + tmat3x2<T> const & m) + { + return typename tmat3x2<T>::row_type( + v.x * m[0][0] + v.y * m[0][1], + v.x * m[1][0] + v.y * m[1][1], + v.x * m[2][0] + v.y * m[2][1]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x2<T> operator* + ( + tmat3x2<T> const & m1, + tmat2x3<T> const & m2 + ) + { + const T SrcA00 = m1[0][0]; + const T SrcA01 = m1[0][1]; + const T SrcA10 = m1[1][0]; + const T SrcA11 = m1[1][1]; + const T SrcA20 = m1[2][0]; + const T SrcA21 = m1[2][1]; + + const T SrcB00 = m2[0][0]; + const T SrcB01 = m2[0][1]; + const T SrcB02 = m2[0][2]; + const T SrcB10 = m2[1][0]; + const T SrcB11 = m2[1][1]; + const T SrcB12 = m2[1][2]; + + tmat2x2<T> Result(tmat2x2<T>::null); + Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02; + Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02; + Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12; + Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11 + SrcA21 * SrcB12; + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x2<T> operator* + ( + tmat3x2<T> const & m1, + tmat3x3<T> const & m2 + ) + { + return tmat3x2<T>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2], + m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2], + m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x2<T> operator* + ( + tmat3x2<T> const & m1, + tmat4x3<T> const & m2 + ) + { + return tmat4x2<T>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2], + m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2], + m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2], + m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1] + m1[2][0] * m2[3][2], + m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1] + m1[2][1] * m2[3][2]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x2<T> operator/ + ( + tmat3x2<T> const & m, + typename tmat3x2<T>::value_type const & s + ) + { + return tmat3x2<T>( + m[0] / s, + m[1] / s, + m[2] / s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x2<T> operator/ + ( + typename tmat3x2<T>::value_type const & s, + tmat3x2<T> const & m + ) + { + return tmat3x2<T>( + s / m[0], + s / m[1], + s / m[2]); + } + + // Unary constant operators + template <typename T> + GLM_FUNC_QUALIFIER tmat3x2<T> const operator- + ( + tmat3x2<T> const & m + ) + { + return tmat3x2<T>( + -m[0], + -m[1], + -m[2]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x2<T> const operator++ + ( + tmat3x2<T> const & m, + int + ) + { + typename tmat3x2<T>::value_type One(1); + return tmat3x2<T>( + m[0] + One, + m[1] + One, + m[2] + One); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x2<T> const operator-- + ( + tmat3x2<T> const & m, + int + ) + { + typename tmat3x2<T>::value_type One(1); + return tmat3x2<T>( + m[0] - One, + m[1] - One, + m[2] - One); + } + + ////////////////////////////////////// + // Boolean operators + + template <typename T> + GLM_FUNC_QUALIFIER bool operator== + ( + tmat3x2<T> const & m1, + tmat3x2<T> const & m2 + ) + { + return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]); + } + + template <typename T> + GLM_FUNC_QUALIFIER bool operator!= + ( + tmat3x2<T> const & m1, + tmat3x2<T> const & m2 + ) + { + return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]); + } + +} //namespace detail +} //namespace glm diff --git a/include/gal/opengl/glm/core/type_mat3x3.hpp b/include/gal/opengl/glm/core/type_mat3x3.hpp new file mode 100644 index 0000000..b2122d8 --- /dev/null +++ b/include/gal/opengl/glm/core/type_mat3x3.hpp @@ -0,0 +1,318 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/type_mat3x3.hpp +/// @date 2005-01-27 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_type_mat3x3 +#define glm_core_type_mat3x3 + +#include "type_mat.hpp" + +namespace glm{ +namespace detail +{ + template <typename T> struct tvec1; + template <typename T> struct tvec2; + template <typename T> struct tvec3; + template <typename T> struct tvec4; + template <typename T> struct tmat2x2; + template <typename T> struct tmat2x3; + template <typename T> struct tmat2x4; + template <typename T> struct tmat3x2; + template <typename T> struct tmat3x3; + template <typename T> struct tmat3x4; + template <typename T> struct tmat4x2; + template <typename T> struct tmat4x3; + template <typename T> struct tmat4x4; + + template <typename T> + struct tmat3x3 + { + enum ctor{null}; + typedef T value_type; + typedef std::size_t size_type; + typedef tvec3<T> col_type; + typedef tvec3<T> row_type; + typedef tmat3x3<T> type; + typedef tmat3x3<T> transpose_type; + + static GLM_FUNC_DECL size_type col_size(); + static GLM_FUNC_DECL size_type row_size(); + + GLM_FUNC_DECL GLM_CONSTEXPR size_type length() const; + + public: + /// Implementation detail + /// @cond DETAIL + GLM_FUNC_DECL tmat3x3<T> _inverse() const; + /// @endcond + + private: + // Data + col_type value[3]; + + public: + // Constructors + GLM_FUNC_DECL tmat3x3(); + GLM_FUNC_DECL tmat3x3(tmat3x3 const & m); + + GLM_FUNC_DECL explicit tmat3x3( + ctor Null); + GLM_FUNC_DECL explicit tmat3x3( + value_type const & s); + GLM_FUNC_DECL explicit tmat3x3( + value_type const & x0, value_type const & y0, value_type const & z0, + value_type const & x1, value_type const & y1, value_type const & z1, + value_type const & x2, value_type const & y2, value_type const & z2); + GLM_FUNC_DECL explicit tmat3x3( + col_type const & v0, + col_type const & v1, + col_type const & v2); + + ////////////////////////////////////// + // Conversions + template <typename U> + GLM_FUNC_DECL explicit tmat3x3( + U const & x); + + template + < + typename X1, typename Y1, typename Z1, + typename X2, typename Y2, typename Z2, + typename X3, typename Y3, typename Z3 + > + GLM_FUNC_DECL explicit tmat3x3( + X1 const & x1, Y1 const & y1, Z1 const & z1, + X2 const & x2, Y2 const & y2, Z2 const & z2, + X3 const & x3, Y3 const & y3, Z3 const & z3); + + template <typename V1, typename V2, typename V3> + GLM_FUNC_DECL explicit tmat3x3( + tvec3<V1> const & v1, + tvec3<V2> const & v2, + tvec3<V3> const & v3); + + // Matrix conversions + template <typename U> + GLM_FUNC_DECL explicit tmat3x3(tmat3x3<U> const & m); + + GLM_FUNC_DECL explicit tmat3x3(tmat2x2<T> const & x); + GLM_FUNC_DECL explicit tmat3x3(tmat4x4<T> const & x); + GLM_FUNC_DECL explicit tmat3x3(tmat2x3<T> const & x); + GLM_FUNC_DECL explicit tmat3x3(tmat3x2<T> const & x); + GLM_FUNC_DECL explicit tmat3x3(tmat2x4<T> const & x); + GLM_FUNC_DECL explicit tmat3x3(tmat4x2<T> const & x); + GLM_FUNC_DECL explicit tmat3x3(tmat3x4<T> const & x); + GLM_FUNC_DECL explicit tmat3x3(tmat4x3<T> const & x); + + // Accesses + GLM_FUNC_DECL col_type & operator[](size_type i); + GLM_FUNC_DECL col_type const & operator[](size_type i) const; + + // Unary updatable operators + GLM_FUNC_DECL tmat3x3<T>& operator= (tmat3x3<T> const & m); + template <typename U> + GLM_FUNC_DECL tmat3x3<T>& operator= (tmat3x3<U> const & m); + template <typename U> + GLM_FUNC_DECL tmat3x3<T>& operator+= (U s); + template <typename U> + GLM_FUNC_DECL tmat3x3<T>& operator+= (tmat3x3<U> const & m); + template <typename U> + GLM_FUNC_DECL tmat3x3<T>& operator-= (U s); + template <typename U> + GLM_FUNC_DECL tmat3x3<T>& operator-= (tmat3x3<U> const & m); + template <typename U> + GLM_FUNC_DECL tmat3x3<T>& operator*= (U s); + template <typename U> + GLM_FUNC_DECL tmat3x3<T>& operator*= (tmat3x3<U> const & m); + template <typename U> + GLM_FUNC_DECL tmat3x3<T>& operator/= (U s); + template <typename U> + GLM_FUNC_DECL tmat3x3<T>& operator/= (tmat3x3<U> const & m); + GLM_FUNC_DECL tmat3x3<T>& operator++ (); + GLM_FUNC_DECL tmat3x3<T>& operator-- (); + }; + + // Binary operators + template <typename T> + GLM_FUNC_DECL tmat3x3<T> operator+ ( + tmat3x3<T> const & m, + typename tmat3x3<T>::value_type const & s); + + template <typename T> + GLM_FUNC_DECL tmat3x3<T> operator+ ( + typename tmat3x3<T>::value_type const & s, + tmat3x3<T> const & m); + + template <typename T> + GLM_FUNC_DECL tmat3x3<T> operator+ ( + tmat3x3<T> const & m1, + tmat3x3<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat3x3<T> operator- ( + tmat3x3<T> const & m, + typename tmat3x3<T>::value_type const & s); + + template <typename T> + GLM_FUNC_DECL tmat3x3<T> operator- ( + typename tmat3x3<T>::value_type const & s, + tmat3x3<T> const & m); + + template <typename T> + GLM_FUNC_DECL tmat3x3<T> operator- ( + tmat3x3<T> const & m1, + tmat3x3<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat3x3<T> operator* ( + tmat3x3<T> const & m, + typename tmat3x3<T>::value_type const & s); + + template <typename T> + GLM_FUNC_DECL tmat3x3<T> operator* ( + typename tmat3x3<T>::value_type const & s, + tmat3x3<T> const & m); + + template <typename T> + GLM_FUNC_DECL typename tmat3x3<T>::col_type operator* ( + tmat3x3<T> const & m, + typename tmat3x3<T>::row_type const & v); + + template <typename T> + GLM_FUNC_DECL typename tmat3x3<T>::row_type operator* ( + typename tmat3x3<T>::col_type const & v, + tmat3x3<T> const & m); + + template <typename T> + GLM_FUNC_DECL tmat3x3<T> operator* ( + tmat3x3<T> const & m1, + tmat3x3<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat2x3<T> operator* ( + tmat3x3<T> const & m1, + tmat2x3<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat4x3<T> operator* ( + tmat3x3<T> const & m1, + tmat4x3<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat3x3<T> operator/ ( + tmat3x3<T> const & m, + typename tmat3x3<T>::value_type const & s); + + template <typename T> + GLM_FUNC_DECL tmat3x3<T> operator/ ( + typename tmat3x3<T>::value_type const & s, + tmat3x3<T> const & m); + + template <typename T> + GLM_FUNC_DECL typename tmat3x3<T>::col_type operator/ ( + tmat3x3<T> const & m, + typename tmat3x3<T>::row_type const & v); + + template <typename T> + GLM_FUNC_DECL typename tmat3x3<T>::row_type operator/ ( + typename tmat3x3<T>::col_type const & v, + tmat3x3<T> const & m); + + template <typename T> + GLM_FUNC_DECL tmat3x3<T> operator/ ( + tmat3x3<T> const & m1, + tmat3x3<T> const & m2); + + // Unary constant operators + template <typename T> + GLM_FUNC_DECL tmat3x3<T> const operator- ( + tmat3x3<T> const & m); + + template <typename T> + GLM_FUNC_DECL tmat3x3<T> const operator-- ( + tmat3x3<T> const & m, + int); + + template <typename T> + GLM_FUNC_DECL tmat3x3<T> const operator++ ( + tmat3x3<T> const & m, + int); +} //namespace detail + + /// @addtogroup core_precision + /// @{ + + /// 3 columns of 3 components matrix of low precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tmat3x3<lowp_float> lowp_mat3; + + /// 3 columns of 3 components matrix of medium precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tmat3x3<mediump_float> mediump_mat3; + + /// 3 columns of 3 components matrix of high precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tmat3x3<highp_float> highp_mat3; + + /// 3 columns of 3 components matrix of low precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tmat3x3<lowp_float> lowp_mat3x3; + + /// 3 columns of 3 components matrix of medium precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tmat3x3<mediump_float> mediump_mat3x3; + + /// 3 columns of 3 components matrix of high precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tmat3x3<highp_float> highp_mat3x3; + + /// @} +}//namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_mat3x3.inl" +#endif + +#endif //glm_core_type_mat3x3 diff --git a/include/gal/opengl/glm/core/type_mat3x3.inl b/include/gal/opengl/glm/core/type_mat3x3.inl new file mode 100644 index 0000000..73731e9 --- /dev/null +++ b/include/gal/opengl/glm/core/type_mat3x3.inl @@ -0,0 +1,800 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/type_mat3x3.inl +/// @date 2005-01-27 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +namespace glm{ +namespace detail +{ + template <typename T> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename tmat3x3<T>::size_type tmat3x3<T>::length() const + { + return 3; + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat3x3<T>::size_type tmat3x3<T>::col_size() + { + return 3; + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat3x3<T>::size_type tmat3x3<T>::row_size() + { + return 3; + } + + ////////////////////////////////////// + // Accesses + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat3x3<T>::col_type & + tmat3x3<T>::operator[] + ( + size_type i + ) + { + assert(i < this->length()); + return this->value[i]; + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat3x3<T>::col_type const & + tmat3x3<T>::operator[] + ( + size_type i + ) const + { + assert(i < this->length()); + return this->value[i]; + } + + ////////////////////////////////////////////////////////////// + // Constructors + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x3<T>::tmat3x3() + { + value_type const Zero(0); + value_type const One(1); + this->value[0] = col_type(One, Zero, Zero); + this->value[1] = col_type(Zero, One, Zero); + this->value[2] = col_type(Zero, Zero, One); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x3<T>::tmat3x3 + ( + tmat3x3<T> const & m + ) + { + this->value[0] = m.value[0]; + this->value[1] = m.value[1]; + this->value[2] = m.value[2]; + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x3<T>::tmat3x3 + ( + ctor + ) + {} + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x3<T>::tmat3x3 + ( + value_type const & s + ) + { + value_type const Zero(0); + this->value[0] = col_type(s, Zero, Zero); + this->value[1] = col_type(Zero, s, Zero); + this->value[2] = col_type(Zero, Zero, s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x3<T>::tmat3x3 + ( + value_type const & x0, value_type const & y0, value_type const & z0, + value_type const & x1, value_type const & y1, value_type const & z1, + value_type const & x2, value_type const & y2, value_type const & z2 + ) + { + this->value[0] = col_type(x0, y0, z0); + this->value[1] = col_type(x1, y1, z1); + this->value[2] = col_type(x2, y2, z2); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x3<T>::tmat3x3 + ( + col_type const & v0, + col_type const & v1, + col_type const & v2 + ) + { + this->value[0] = v0; + this->value[1] = v1; + this->value[2] = v2; + } + + ////////////////////////////////////// + // Convertion constructors + template <typename T> + template <typename U> + GLM_FUNC_DECL tmat3x3<T>::tmat3x3 + ( + U const & s + ) + { + value_type const Zero(0); + this->value[0] = tvec3<T>(value_type(s), Zero, Zero); + this->value[1] = tvec3<T>(Zero, value_type(s), Zero); + this->value[2] = tvec3<T>(Zero, Zero, value_type(s)); + } + + template <typename T> + template < + typename X1, typename Y1, typename Z1, + typename X2, typename Y2, typename Z2, + typename X3, typename Y3, typename Z3> + GLM_FUNC_DECL tmat3x3<T>::tmat3x3 + ( + X1 const & x1, Y1 const & y1, Z1 const & z1, + X2 const & x2, Y2 const & y2, Z2 const & z2, + X3 const & x3, Y3 const & y3, Z3 const & z3 + ) + { + this->value[0] = col_type(value_type(x1), value_type(y1), value_type(z1)); + this->value[1] = col_type(value_type(x2), value_type(y2), value_type(z2)); + this->value[2] = col_type(value_type(x3), value_type(y3), value_type(z3)); + } + + template <typename T> + template <typename V1, typename V2, typename V3> + GLM_FUNC_DECL tmat3x3<T>::tmat3x3 + ( + tvec3<V1> const & v1, + tvec3<V2> const & v2, + tvec3<V3> const & v3 + ) + { + this->value[0] = col_type(v1); + this->value[1] = col_type(v2); + this->value[2] = col_type(v3); + } + + ////////////////////////////////////////////////////////////// + // Conversions + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat3x3<T>::tmat3x3 + ( + tmat3x3<U> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x3<T>::tmat3x3 + ( + tmat2x2<T> const & m + ) + { + this->value[0] = col_type(m[0], value_type(0)); + this->value[1] = col_type(m[1], value_type(0)); + this->value[2] = col_type(detail::tvec2<T>(0), value_type(1)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x3<T>::tmat3x3 + ( + tmat4x4<T> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x3<T>::tmat3x3 + ( + tmat2x3<T> const & m + ) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = col_type(detail::tvec2<T>(0), value_type(1)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x3<T>::tmat3x3 + ( + tmat3x2<T> const & m + ) + { + this->value[0] = col_type(m[0], value_type(0)); + this->value[1] = col_type(m[1], value_type(0)); + this->value[2] = col_type(m[2], value_type(1)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x3<T>::tmat3x3 + ( + tmat2x4<T> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(detail::tvec2<T>(0), value_type(1)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x3<T>::tmat3x3 + ( + tmat4x2<T> const & m + ) + { + this->value[0] = col_type(m[0], value_type(0)); + this->value[1] = col_type(m[1], value_type(0)); + this->value[2] = col_type(m[2], value_type(1)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x3<T>::tmat3x3 + ( + tmat3x4<T> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x3<T>::tmat3x3 + ( + tmat4x3<T> const & m + ) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; + } + + ////////////////////////////////////////////////////////////// + // Operators + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x3<T> & tmat3x3<T>::operator= + ( + tmat3x3<T> const & m + ) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat3x3<T> & tmat3x3<T>::operator= + ( + tmat3x3<U> const & m + ) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat3x3<T> & tmat3x3<T>::operator+= (U s) + { + this->value[0] += s; + this->value[1] += s; + this->value[2] += s; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat3x3<T> & tmat3x3<T>::operator+= + ( + tmat3x3<U> const & m + ) + { + this->value[0] += m[0]; + this->value[1] += m[1]; + this->value[2] += m[2]; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat3x3<T> & tmat3x3<T>::operator-= (U s) + { + this->value[0] -= s; + this->value[1] -= s; + this->value[2] -= s; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat3x3<T> & tmat3x3<T>::operator-= + ( + tmat3x3<U> const & m + ) + { + this->value[0] -= m[0]; + this->value[1] -= m[1]; + this->value[2] -= m[2]; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat3x3<T> & tmat3x3<T>::operator*= (U s) + { + this->value[0] *= s; + this->value[1] *= s; + this->value[2] *= s; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat3x3<T> & tmat3x3<T>::operator*= + ( + tmat3x3<U> const & m + ) + { + return (*this = *this * m); + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat3x3<T> & tmat3x3<T>::operator/= (U s) + { + this->value[0] /= s; + this->value[1] /= s; + this->value[2] /= s; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat3x3<T> & tmat3x3<T>::operator/= + ( + tmat3x3<U> const & m + ) + { + return (*this = *this / m); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x3<T> & tmat3x3<T>::operator++ () + { + ++this->value[0]; + ++this->value[1]; + ++this->value[2]; + return *this; + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x3<T> & tmat3x3<T>::operator-- () + { + --this->value[0]; + --this->value[1]; + --this->value[2]; + return *this; + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x3<T> tmat3x3<T>::_inverse() const + { + T S00 = value[0][0]; + T S01 = value[0][1]; + T S02 = value[0][2]; + + T S10 = value[1][0]; + T S11 = value[1][1]; + T S12 = value[1][2]; + + T S20 = value[2][0]; + T S21 = value[2][1]; + T S22 = value[2][2]; +/* + tmat3x3<T> Inverse( + + (S11 * S22 - S21 * S12), + - (S10 * S22 - S20 * S12), + + (S10 * S21 - S20 * S11), + - (S01 * S22 - S21 * S02), + + (S00 * S22 - S20 * S02), + - (S00 * S21 - S20 * S01), + + (S01 * S12 - S11 * S02), + - (S00 * S12 - S10 * S02), + + (S00 * S11 - S10 * S01)); +*/ + tmat3x3<T> Inverse( + S11 * S22 - S21 * S12, + S12 * S20 - S22 * S10, + S10 * S21 - S20 * S11, + S02 * S21 - S01 * S22, + S00 * S22 - S02 * S20, + S01 * S20 - S00 * S21, + S12 * S01 - S11 * S02, + S10 * S02 - S12 * S00, + S11 * S00 - S10 * S01); + + T Determinant = S00 * (S11 * S22 - S21 * S12) + - S10 * (S01 * S22 - S21 * S02) + + S20 * (S01 * S12 - S11 * S02); + + Inverse /= Determinant; + return Inverse; + } + + ////////////////////////////////////////////////////////////// + // Binary operators + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x3<T> operator+ + ( + tmat3x3<T> const & m, + typename tmat3x3<T>::value_type const & s + ) + { + return tmat3x3<T>( + m[0] + s, + m[1] + s, + m[2] + s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x3<T> operator+ + ( + typename tmat3x3<T>::value_type const & s, + tmat3x3<T> const & m + ) + { + return tmat3x3<T>( + m[0] + s, + m[1] + s, + m[2] + s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x3<T> operator+ + ( + tmat3x3<T> const & m1, + tmat3x3<T> const & m2 + ) + { + return tmat3x3<T>( + m1[0] + m2[0], + m1[1] + m2[1], + m1[2] + m2[2]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x3<T> operator- + ( + tmat3x3<T> const & m, + typename tmat3x3<T>::value_type const & s + ) + { + return tmat3x3<T>( + m[0] - s, + m[1] - s, + m[2] - s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x3<T> operator- + ( + typename tmat3x3<T>::value_type const & s, + tmat3x3<T> const & m + ) + { + return tmat3x3<T>( + s - m[0], + s - m[1], + s - m[2]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x3<T> operator- + ( + tmat3x3<T> const & m1, + tmat3x3<T> const & m2 + ) + { + return tmat3x3<T>( + m1[0] - m2[0], + m1[1] - m2[1], + m1[2] - m2[2]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x3<T> operator* + ( + tmat3x3<T> const & m, + typename tmat3x3<T>::value_type const & s + ) + { + return tmat3x3<T>( + m[0] * s, + m[1] * s, + m[2] * s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x3<T> operator* + ( + typename tmat3x3<T>::value_type const & s, + tmat3x3<T> const & m + ) + { + return tmat3x3<T>( + m[0] * s, + m[1] * s, + m[2] * s); + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat3x3<T>::col_type operator* + ( + tmat3x3<T> const & m, + typename tmat3x3<T>::row_type const & v + ) + { + return typename tmat3x3<T>::col_type( + m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z, + m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z, + m[0][2] * v.x + m[1][2] * v.y + m[2][2] * v.z); + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat3x3<T>::row_type operator* + ( + typename tmat3x3<T>::col_type const & v, + tmat3x3<T> const & m + ) + { + return typename tmat3x3<T>::row_type( + m[0][0] * v.x + m[0][1] * v.y + m[0][2] * v.z, + m[1][0] * v.x + m[1][1] * v.y + m[1][2] * v.z, + m[2][0] * v.x + m[2][1] * v.y + m[2][2] * v.z); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x3<T> operator* + ( + tmat3x3<T> const & m1, + tmat3x3<T> const & m2 + ) + { + typename tmat3x3<T>::value_type const SrcA00 = m1[0][0]; + typename tmat3x3<T>::value_type const SrcA01 = m1[0][1]; + typename tmat3x3<T>::value_type const SrcA02 = m1[0][2]; + typename tmat3x3<T>::value_type const SrcA10 = m1[1][0]; + typename tmat3x3<T>::value_type const SrcA11 = m1[1][1]; + typename tmat3x3<T>::value_type const SrcA12 = m1[1][2]; + typename tmat3x3<T>::value_type const SrcA20 = m1[2][0]; + typename tmat3x3<T>::value_type const SrcA21 = m1[2][1]; + typename tmat3x3<T>::value_type const SrcA22 = m1[2][2]; + + typename tmat3x3<T>::value_type const SrcB00 = m2[0][0]; + typename tmat3x3<T>::value_type const SrcB01 = m2[0][1]; + typename tmat3x3<T>::value_type const SrcB02 = m2[0][2]; + typename tmat3x3<T>::value_type const SrcB10 = m2[1][0]; + typename tmat3x3<T>::value_type const SrcB11 = m2[1][1]; + typename tmat3x3<T>::value_type const SrcB12 = m2[1][2]; + typename tmat3x3<T>::value_type const SrcB20 = m2[2][0]; + typename tmat3x3<T>::value_type const SrcB21 = m2[2][1]; + typename tmat3x3<T>::value_type const SrcB22 = m2[2][2]; + + tmat3x3<T> Result(tmat3x3<T>::null); + Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02; + Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02; + Result[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01 + SrcA22 * SrcB02; + Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12; + Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11 + SrcA21 * SrcB12; + Result[1][2] = SrcA02 * SrcB10 + SrcA12 * SrcB11 + SrcA22 * SrcB12; + Result[2][0] = SrcA00 * SrcB20 + SrcA10 * SrcB21 + SrcA20 * SrcB22; + Result[2][1] = SrcA01 * SrcB20 + SrcA11 * SrcB21 + SrcA21 * SrcB22; + Result[2][2] = SrcA02 * SrcB20 + SrcA12 * SrcB21 + SrcA22 * SrcB22; + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x3<T> operator* + ( + tmat3x3<T> const & m1, + tmat2x3<T> const & m2 + ) + { + return tmat2x3<T>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2], + m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2], + m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x3<T> operator* + ( + tmat3x3<T> const & m1, + tmat4x3<T> const & m2 + ) + { + return tmat4x3<T>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2], + m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2], + m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2], + m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2], + m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2], + m1[0][2] * m2[2][0] + m1[1][2] * m2[2][1] + m1[2][2] * m2[2][2], + m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1] + m1[2][0] * m2[3][2], + m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1] + m1[2][1] * m2[3][2], + m1[0][2] * m2[3][0] + m1[1][2] * m2[3][1] + m1[2][2] * m2[3][2]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x3<T> operator/ + ( + tmat3x3<T> const & m, + typename tmat3x3<T>::value_type const & s + ) + { + return tmat3x3<T>( + m[0] / s, + m[1] / s, + m[2] / s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x3<T> operator/ + ( + typename tmat3x3<T>::value_type const & s, + tmat3x3<T> const & m + ) + { + return tmat3x3<T>( + s / m[0], + s / m[1], + s / m[2]); + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat3x3<T>::col_type operator/ + ( + tmat3x3<T> const & m, + typename tmat3x3<T>::row_type const & v + ) + { + return m._inverse() * v; + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat3x3<T>::row_type operator/ + ( + typename tmat3x3<T>::col_type const & v, + tmat3x3<T> const & m + ) + { + return v * m._inverse(); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x3<T> operator/ + ( + tmat3x3<T> const & m1, + tmat3x3<T> const & m2 + ) + { + return m1 * m2._inverse(); + } + + // Unary constant operators + template <typename T> + GLM_FUNC_QUALIFIER tmat3x3<T> const operator- + ( + tmat3x3<T> const & m + ) + { + return tmat3x3<T>( + -m[0], + -m[1], + -m[2]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x3<T> const operator++ + ( + tmat3x3<T> const & m, + int + ) + { + return tmat3x3<T>( + m[0] + T(1), + m[1] + T(1), + m[2] + T(1)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x3<T> const operator-- + ( + tmat3x3<T> const & m, + int + ) + { + return tmat3x3<T>( + m[0] - T(1), + m[1] - T(1), + m[2] - T(1)); + } + + ////////////////////////////////////// + // Boolean operators + + template <typename T> + GLM_FUNC_QUALIFIER bool operator== + ( + tmat3x3<T> const & m1, + tmat3x3<T> const & m2 + ) + { + return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]); + } + + template <typename T> + GLM_FUNC_QUALIFIER bool operator!= + ( + tmat3x3<T> const & m1, + tmat3x3<T> const & m2 + ) + { + return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]); + } + +} //namespace detail +} //namespace glm diff --git a/include/gal/opengl/glm/core/type_mat3x4.hpp b/include/gal/opengl/glm/core/type_mat3x4.hpp new file mode 100644 index 0000000..8fe3106 --- /dev/null +++ b/include/gal/opengl/glm/core/type_mat3x4.hpp @@ -0,0 +1,266 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/type_mat3x4.hpp +/// @date 2006-08-05 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_type_mat3x4 +#define glm_core_type_mat3x4 + +#include "type_mat.hpp" + +namespace glm{ +namespace detail +{ + template <typename T> struct tvec1; + template <typename T> struct tvec2; + template <typename T> struct tvec3; + template <typename T> struct tvec4; + template <typename T> struct tmat2x2; + template <typename T> struct tmat2x3; + template <typename T> struct tmat2x4; + template <typename T> struct tmat3x2; + template <typename T> struct tmat3x3; + template <typename T> struct tmat3x4; + template <typename T> struct tmat4x2; + template <typename T> struct tmat4x3; + template <typename T> struct tmat4x4; + + template <typename T> + struct tmat3x4 + { + enum ctor{null}; + typedef T value_type; + typedef std::size_t size_type; + typedef tvec4<T> col_type; + typedef tvec3<T> row_type; + typedef tmat3x4<T> type; + typedef tmat4x3<T> transpose_type; + + static GLM_FUNC_DECL size_type col_size(); + static GLM_FUNC_DECL size_type row_size(); + + GLM_FUNC_DECL GLM_CONSTEXPR size_type length() const; + + private: + // Data + col_type value[3]; + + public: + // Constructors + GLM_FUNC_DECL tmat3x4(); + GLM_FUNC_DECL tmat3x4(tmat3x4 const & m); + + GLM_FUNC_DECL explicit tmat3x4( + ctor Null); + GLM_FUNC_DECL explicit tmat3x4( + value_type const & s); + GLM_FUNC_DECL explicit tmat3x4( + value_type const & x0, value_type const & y0, value_type const & z0, value_type const & w0, + value_type const & x1, value_type const & y1, value_type const & z1, value_type const & w1, + value_type const & x2, value_type const & y2, value_type const & z2, value_type const & w2); + GLM_FUNC_DECL explicit tmat3x4( + col_type const & v0, + col_type const & v1, + col_type const & v2); + + ////////////////////////////////////// + // Conversions + template <typename U> + GLM_FUNC_DECL explicit tmat3x4( + U const & x); + + template + < + typename X1, typename Y1, typename Z1, typename W1, + typename X2, typename Y2, typename Z2, typename W2, + typename X3, typename Y3, typename Z3, typename W3 + > + GLM_FUNC_DECL explicit tmat3x4( + X1 const & x1, Y1 const & y1, Z1 const & z1, W1 const & w1, + X2 const & x2, Y2 const & y2, Z2 const & z2, W2 const & w2, + X3 const & x3, Y3 const & y3, Z3 const & z3, W3 const & w3); + + template <typename V1, typename V2, typename V3> + GLM_FUNC_DECL explicit tmat3x4( + tvec4<V1> const & v1, + tvec4<V2> const & v2, + tvec4<V3> const & v3); + + // Matrix conversion + template <typename U> + GLM_FUNC_DECL explicit tmat3x4(tmat3x4<U> const & m); + + GLM_FUNC_DECL explicit tmat3x4(tmat2x2<T> const & x); + GLM_FUNC_DECL explicit tmat3x4(tmat3x3<T> const & x); + GLM_FUNC_DECL explicit tmat3x4(tmat4x4<T> const & x); + GLM_FUNC_DECL explicit tmat3x4(tmat2x3<T> const & x); + GLM_FUNC_DECL explicit tmat3x4(tmat3x2<T> const & x); + GLM_FUNC_DECL explicit tmat3x4(tmat2x4<T> const & x); + GLM_FUNC_DECL explicit tmat3x4(tmat4x2<T> const & x); + GLM_FUNC_DECL explicit tmat3x4(tmat4x3<T> const & x); + + // Accesses + GLM_FUNC_DECL col_type & operator[](size_type i); + GLM_FUNC_DECL col_type const & operator[](size_type i) const; + + // Unary updatable operators + GLM_FUNC_DECL tmat3x4<T> & operator= (tmat3x4<T> const & m); + template <typename U> + GLM_FUNC_DECL tmat3x4<T> & operator= (tmat3x4<U> const & m); + template <typename U> + GLM_FUNC_DECL tmat3x4<T> & operator+= (U s); + template <typename U> + GLM_FUNC_DECL tmat3x4<T> & operator+= (tmat3x4<U> const & m); + template <typename U> + GLM_FUNC_DECL tmat3x4<T> & operator-= (U s); + template <typename U> + GLM_FUNC_DECL tmat3x4<T> & operator-= (tmat3x4<U> const & m); + template <typename U> + GLM_FUNC_DECL tmat3x4<T> & operator*= (U s); + template <typename U> + GLM_FUNC_DECL tmat3x4<T> & operator*= (tmat3x4<U> const & m); + template <typename U> + GLM_FUNC_DECL tmat3x4<T> & operator/= (U s); + + GLM_FUNC_DECL tmat3x4<T> & operator++ (); + GLM_FUNC_DECL tmat3x4<T> & operator-- (); + }; + + // Binary operators + template <typename T> + GLM_FUNC_DECL tmat3x4<T> operator+ ( + tmat3x4<T> const & m, + typename tmat3x4<T>::value_type const & s); + + template <typename T> + GLM_FUNC_DECL tmat3x4<T> operator+ ( + tmat3x4<T> const & m1, + tmat3x4<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat3x4<T> operator- ( + tmat3x4<T> const & m, + typename tmat3x4<T>::value_type const & s); + + template <typename T> + GLM_FUNC_DECL tmat3x4<T> operator- ( + tmat3x4<T> const & m1, + tmat3x4<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat3x4<T> operator* ( + tmat3x4<T> const & m, + typename tmat3x4<T>::value_type const & s); + + template <typename T> + GLM_FUNC_DECL tmat3x4<T> operator* ( + typename tmat3x4<T>::value_type const & s, + tmat3x4<T> const & m); + + template <typename T> + GLM_FUNC_DECL typename tmat3x4<T>::col_type operator* ( + tmat3x4<T> const & m, + typename tmat3x4<T>::row_type const & v); + + template <typename T> + GLM_FUNC_DECL typename tmat3x4<T>::row_type operator* ( + typename tmat3x4<T>::col_type const & v, + tmat3x4<T> const & m); + + template <typename T> + GLM_FUNC_DECL tmat4x4<T> operator* ( + tmat3x4<T> const & m1, + tmat4x3<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat2x4<T> operator* ( + tmat3x4<T> const & m1, + tmat2x3<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat3x4<T> operator* ( + tmat3x4<T> const & m1, + tmat3x3<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat3x4<T> operator/ ( + tmat3x4<T> const & m, + typename tmat3x4<T>::value_type const & s); + + template <typename T> + GLM_FUNC_DECL tmat3x4<T> operator/ ( + typename tmat3x4<T>::value_type const & s, + tmat3x4<T> const & m); + + // Unary constant operators + template <typename T> + GLM_FUNC_DECL tmat3x4<T> const operator- ( + tmat3x4<T> const & m); + + template <typename T> + GLM_FUNC_DECL tmat3x4<T> const operator-- ( + tmat3x4<T> const & m, + int); + + template <typename T> + GLM_FUNC_DECL tmat3x4<T> const operator++ ( + tmat3x4<T> const & m, + int); + +}//namespace detail + + /// @addtogroup core_precision + /// @{ + + /// 3 columns of 4 components matrix of low precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tmat3x4<lowp_float> lowp_mat3x4; + + /// 3 columns of 4 components matrix of medium precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tmat3x4<mediump_float> mediump_mat3x4; + + /// 3 columns of 4 components matrix of high precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tmat3x4<highp_float> highp_mat3x4; + + /// @} +}//namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_mat3x4.inl" +#endif + +#endif //glm_core_type_mat3x4 diff --git a/include/gal/opengl/glm/core/type_mat3x4.inl b/include/gal/opengl/glm/core/type_mat3x4.inl new file mode 100644 index 0000000..be613d0 --- /dev/null +++ b/include/gal/opengl/glm/core/type_mat3x4.inl @@ -0,0 +1,700 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/type_mat3x4.inl +/// @date 2006-08-05 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +namespace glm{ +namespace detail +{ + template <typename T> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename tmat3x4<T>::size_type tmat3x4<T>::length() const + { + return 3; + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat3x4<T>::size_type tmat3x4<T>::col_size() + { + return 4; + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat3x4<T>::size_type tmat3x4<T>::row_size() + { + return 3; + } + + ////////////////////////////////////// + // Accesses + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat3x4<T>::col_type & + tmat3x4<T>::operator[] + ( + size_type i + ) + { + assert(i < this->length()); + return this->value[i]; + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat3x4<T>::col_type const & + tmat3x4<T>::operator[] + ( + size_type i + ) const + { + assert(i < this->length()); + return this->value[i]; + } + + ////////////////////////////////////////////////////////////// + // Constructors + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x4<T>::tmat3x4() + { + this->value[0] = col_type(1, 0, 0, 0); + this->value[1] = col_type(0, 1, 0, 0); + this->value[2] = col_type(0, 0, 1, 0); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x4<T>::tmat3x4 + ( + tmat3x4<T> const & m + ) + { + this->value[0] = m.value[0]; + this->value[1] = m.value[1]; + this->value[2] = m.value[2]; + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x4<T>::tmat3x4 + ( + ctor + ) + {} + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x4<T>::tmat3x4 + ( + value_type const & s + ) + { + value_type const Zero(0); + this->value[0] = col_type(s, Zero, Zero, Zero); + this->value[1] = col_type(Zero, s, Zero, Zero); + this->value[2] = col_type(Zero, Zero, s, Zero); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x4<T>::tmat3x4 + ( + value_type const & x0, value_type const & y0, value_type const & z0, value_type const & w0, + value_type const & x1, value_type const & y1, value_type const & z1, value_type const & w1, + value_type const & x2, value_type const & y2, value_type const & z2, value_type const & w2 + ) + { + this->value[0] = col_type(x0, y0, z0, w0); + this->value[1] = col_type(x1, y1, z1, w1); + this->value[2] = col_type(x2, y2, z2, w2); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x4<T>::tmat3x4 + ( + col_type const & v0, + col_type const & v1, + col_type const & v2 + ) + { + this->value[0] = v0; + this->value[1] = v1; + this->value[2] = v2; + } + + ////////////////////////////////////// + // Convertion constructors + template <typename T> + template <typename U> + GLM_FUNC_DECL tmat3x4<T>::tmat3x4 + ( + U const & s + ) + { + value_type const Zero(0); + this->value[0] = tvec4<T>(value_type(s), Zero, Zero, Zero); + this->value[1] = tvec4<T>(Zero, value_type(s), Zero, Zero); + this->value[2] = tvec4<T>(Zero, Zero, value_type(s), Zero); + } + + template <typename T> + template < + typename X1, typename Y1, typename Z1, typename W1, + typename X2, typename Y2, typename Z2, typename W2, + typename X3, typename Y3, typename Z3, typename W3> + GLM_FUNC_DECL tmat3x4<T>::tmat3x4 + ( + X1 const & x1, Y1 const & y1, Z1 const & z1, W1 const & w1, + X2 const & x2, Y2 const & y2, Z2 const & z2, W2 const & w2, + X3 const & x3, Y3 const & y3, Z3 const & z3, W3 const & w3 + ) + { + this->value[0] = col_type(value_type(x1), value_type(y1), value_type(z1), value_type(w1)); + this->value[1] = col_type(value_type(x2), value_type(y2), value_type(z2), value_type(w2)); + this->value[2] = col_type(value_type(x3), value_type(y3), value_type(z3), value_type(w3)); + } + + template <typename T> + template <typename V1, typename V2, typename V3> + GLM_FUNC_DECL tmat3x4<T>::tmat3x4 + ( + tvec4<V1> const & v1, + tvec4<V2> const & v2, + tvec4<V3> const & v3 + ) + { + this->value[0] = col_type(v1); + this->value[1] = col_type(v2); + this->value[2] = col_type(v3); + } + + // Conversion + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat3x4<T>::tmat3x4 + ( + tmat3x4<U> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x4<T>::tmat3x4 + ( + tmat2x2<T> const & m + ) + { + this->value[0] = col_type(m[0], detail::tvec2<T>(0)); + this->value[1] = col_type(m[1], detail::tvec2<T>(0)); + this->value[2] = col_type(T(0), T(0), T(1), T(0)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x4<T>::tmat3x4 + ( + tmat3x3<T> const & m + ) + { + this->value[0] = col_type(m[0], T(0)); + this->value[1] = col_type(m[1], T(0)); + this->value[2] = col_type(m[2], T(0)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x4<T>::tmat3x4 + ( + tmat4x4<T> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x4<T>::tmat3x4 + ( + tmat2x3<T> const & m + ) + { + this->value[0] = col_type(m[0], T(0)); + this->value[1] = col_type(m[1], T(0)); + this->value[2] = col_type(T(0), T(0), T(1), T(0)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x4<T>::tmat3x4 + ( + tmat3x2<T> const & m + ) + { + this->value[0] = col_type(m[0], detail::tvec2<T>(0)); + this->value[1] = col_type(m[1], detail::tvec2<T>(0)); + this->value[2] = col_type(m[2], T(0), T(1)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x4<T>::tmat3x4 + ( + tmat2x4<T> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(T(0), T(0), T(1), T(0)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x4<T>::tmat3x4 + ( + tmat4x2<T> const & m + ) + { + this->value[0] = col_type(m[0], detail::tvec2<T>(T(0))); + this->value[1] = col_type(m[1], detail::tvec2<T>(T(0))); + this->value[2] = col_type(m[2], detail::tvec2<T>(T(1), T(0))); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x4<T>::tmat3x4 + ( + tmat4x3<T> const & m + ) + { + this->value[0] = col_type(m[0], T(0)); + this->value[1] = col_type(m[1], T(0)); + this->value[2] = col_type(m[2], T(0)); + } + + ////////////////////////////////////////////////////////////// + // Unary updatable operators + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x4<T>& tmat3x4<T>::operator= + ( + tmat3x4<T> const & m + ) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat3x4<T>& tmat3x4<T>::operator= + ( + tmat3x4<U> const & m + ) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat3x4<T>& tmat3x4<T>::operator+= (U s) + { + this->value[0] += s; + this->value[1] += s; + this->value[2] += s; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat3x4<T>& tmat3x4<T>::operator+= + ( + tmat3x4<U> const & m + ) + { + this->value[0] += m[0]; + this->value[1] += m[1]; + this->value[2] += m[2]; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat3x4<T>& tmat3x4<T>::operator-= (U s) + { + this->value[0] -= s; + this->value[1] -= s; + this->value[2] -= s; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat3x4<T>& tmat3x4<T>::operator-= + ( + tmat3x4<U> const & m + ) + { + this->value[0] -= m[0]; + this->value[1] -= m[1]; + this->value[2] -= m[2]; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat3x4<T>& tmat3x4<T>::operator*= (U s) + { + this->value[0] *= s; + this->value[1] *= s; + this->value[2] *= s; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat3x4<T>& tmat3x4<T>::operator*= + ( + tmat3x4<U> const & m + ) + { + return (*this = tmat3x4<T>(*this * m)); + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat3x4<T> & tmat3x4<T>::operator/= (U s) + { + this->value[0] /= s; + this->value[1] /= s; + this->value[2] /= s; + return *this; + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x4<T>& tmat3x4<T>::operator++ () + { + ++this->value[0]; + ++this->value[1]; + ++this->value[2]; + return *this; + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x4<T>& tmat3x4<T>::operator-- () + { + --this->value[0]; + --this->value[1]; + --this->value[2]; + return *this; + } + + ////////////////////////////////////////////////////////////// + // Binary operators + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x4<T> operator+ + ( + tmat3x4<T> const & m, + typename tmat3x4<T>::value_type const & s + ) + { + return tmat3x4<T>( + m[0] + s, + m[1] + s, + m[2] + s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x4<T> operator+ + ( + tmat3x4<T> const & m1, + tmat3x4<T> const & m2 + ) + { + return tmat3x4<T>( + m1[0] + m2[0], + m1[1] + m2[1], + m1[2] + m2[2]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x4<T> operator- + ( + tmat3x4<T> const & m, + typename tmat3x4<T>::value_type const & s + ) + { + return tmat3x4<T>( + m[0] - s, + m[1] - s, + m[2] - s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x4<T> operator- + ( + tmat3x4<T> const & m1, + tmat3x4<T> const & m2 + ) + { + return tmat3x4<T>( + m1[0] - m2[0], + m1[1] - m2[1], + m1[2] - m2[2]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x4<T> operator* + ( + tmat3x4<T> const & m, + typename tmat3x4<T>::value_type const & s + ) + { + return tmat3x4<T>( + m[0] * s, + m[1] * s, + m[2] * s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x4<T> operator* + ( + typename tmat3x4<T>::value_type const & s, + tmat3x4<T> const & m + ) + { + return tmat3x4<T>( + m[0] * s, + m[1] * s, + m[2] * s); + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat3x4<T>::col_type operator* + ( + tmat3x4<T> const & m, + typename tmat3x4<T>::row_type const & v + ) + { + return typename tmat3x4<T>::col_type( + m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z, + m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z, + m[0][2] * v.x + m[1][2] * v.y + m[2][2] * v.z, + m[0][3] * v.x + m[1][3] * v.y + m[2][3] * v.z); + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat3x4<T>::row_type operator* + ( + typename tmat3x4<T>::col_type const & v, + tmat3x4<T> const & m + ) + { + return typename tmat3x4<T>::row_type( + v.x * m[0][0] + v.y * m[0][1] + v.z * m[0][2] + v.w * m[0][3], + v.x * m[1][0] + v.y * m[1][1] + v.z * m[1][2] + v.w * m[1][3], + v.x * m[2][0] + v.y * m[2][1] + v.z * m[2][2] + v.w * m[2][3]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x4<T> operator* + ( + tmat3x4<T> const & m1, + tmat4x3<T> const & m2 + ) + { + const T SrcA00 = m1[0][0]; + const T SrcA01 = m1[0][1]; + const T SrcA02 = m1[0][2]; + const T SrcA03 = m1[0][3]; + const T SrcA10 = m1[1][0]; + const T SrcA11 = m1[1][1]; + const T SrcA12 = m1[1][2]; + const T SrcA13 = m1[1][3]; + const T SrcA20 = m1[2][0]; + const T SrcA21 = m1[2][1]; + const T SrcA22 = m1[2][2]; + const T SrcA23 = m1[2][3]; + + const T SrcB00 = m2[0][0]; + const T SrcB01 = m2[0][1]; + const T SrcB02 = m2[0][2]; + const T SrcB10 = m2[1][0]; + const T SrcB11 = m2[1][1]; + const T SrcB12 = m2[1][2]; + const T SrcB20 = m2[2][0]; + const T SrcB21 = m2[2][1]; + const T SrcB22 = m2[2][2]; + const T SrcB30 = m2[3][0]; + const T SrcB31 = m2[3][1]; + const T SrcB32 = m2[3][2]; + + tmat4x4<T> Result(tmat4x4<T>::null); + Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02; + Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02; + Result[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01 + SrcA22 * SrcB02; + Result[0][3] = SrcA03 * SrcB00 + SrcA13 * SrcB01 + SrcA23 * SrcB02; + Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12; + Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11 + SrcA21 * SrcB12; + Result[1][2] = SrcA02 * SrcB10 + SrcA12 * SrcB11 + SrcA22 * SrcB12; + Result[1][3] = SrcA03 * SrcB10 + SrcA13 * SrcB11 + SrcA23 * SrcB12; + Result[2][0] = SrcA00 * SrcB20 + SrcA10 * SrcB21 + SrcA20 * SrcB22; + Result[2][1] = SrcA01 * SrcB20 + SrcA11 * SrcB21 + SrcA21 * SrcB22; + Result[2][2] = SrcA02 * SrcB20 + SrcA12 * SrcB21 + SrcA22 * SrcB22; + Result[2][3] = SrcA03 * SrcB20 + SrcA13 * SrcB21 + SrcA23 * SrcB22; + Result[3][0] = SrcA00 * SrcB30 + SrcA10 * SrcB31 + SrcA20 * SrcB32; + Result[3][1] = SrcA01 * SrcB30 + SrcA11 * SrcB31 + SrcA21 * SrcB32; + Result[3][2] = SrcA02 * SrcB30 + SrcA12 * SrcB31 + SrcA22 * SrcB32; + Result[3][3] = SrcA03 * SrcB30 + SrcA13 * SrcB31 + SrcA23 * SrcB32; + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x4<T> operator* + ( + tmat3x4<T> const & m1, + tmat2x3<T> const & m2 + ) + { + return tmat2x4<T>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2], + m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2], + m1[0][3] * m2[0][0] + m1[1][3] * m2[0][1] + m1[2][3] * m2[0][2], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2], + m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2], + m1[0][3] * m2[1][0] + m1[1][3] * m2[1][1] + m1[2][3] * m2[1][2]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x4<T> operator* + ( + tmat3x4<T> const & m1, + tmat3x3<T> const & m2 + ) + { + return tmat3x4<T>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2], + m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2], + m1[0][3] * m2[0][0] + m1[1][3] * m2[0][1] + m1[2][3] * m2[0][2], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2], + m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2], + m1[0][3] * m2[1][0] + m1[1][3] * m2[1][1] + m1[2][3] * m2[1][2], + m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2], + m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2], + m1[0][2] * m2[2][0] + m1[1][2] * m2[2][1] + m1[2][2] * m2[2][2], + m1[0][3] * m2[2][0] + m1[1][3] * m2[2][1] + m1[2][3] * m2[2][2]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x4<T> operator/ + ( + tmat3x4<T> const & m, + typename tmat3x4<T>::value_type const & s + ) + { + return tmat3x4<T>( + m[0] / s, + m[1] / s, + m[2] / s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x4<T> operator/ + ( + typename tmat3x4<T>::value_type const & s, + tmat3x4<T> const & m + ) + { + return tmat3x4<T>( + s / m[0], + s / m[1], + s / m[2]); + } + + // Unary constant operators + template <typename T> + GLM_FUNC_QUALIFIER tmat3x4<T> const operator- + ( + tmat3x4<T> const & m + ) + { + return tmat3x4<T>( + -m[0], + -m[1], + -m[2]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x4<T> const operator++ + ( + tmat3x4<T> const & m, + int + ) + { + return tmat3x4<T>( + m[0] + T(1), + m[1] + T(1), + m[2] + T(1)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x4<T> const operator-- + ( + tmat3x4<T> const & m, + int + ) + { + return tmat3x4<T>( + m[0] - T(1), + m[1] - T(1), + m[2] - T(1)); + } + + ////////////////////////////////////// + // Boolean operators + + template <typename T> + GLM_FUNC_QUALIFIER bool operator== + ( + tmat3x4<T> const & m1, + tmat3x4<T> const & m2 + ) + { + return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]); + } + + template <typename T> + GLM_FUNC_QUALIFIER bool operator!= + ( + tmat3x4<T> const & m1, + tmat3x4<T> const & m2 + ) + { + return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]); + } +} //namespace detail +} //namespace glm diff --git a/include/gal/opengl/glm/core/type_mat4x2.hpp b/include/gal/opengl/glm/core/type_mat4x2.hpp new file mode 100644 index 0000000..3bc6cc0 --- /dev/null +++ b/include/gal/opengl/glm/core/type_mat4x2.hpp @@ -0,0 +1,270 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/type_mat4x2.hpp +/// @date 2006-10-01 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_type_mat4x2 +#define glm_core_type_mat4x2 + +#include "type_mat.hpp" + +namespace glm{ +namespace detail +{ + template <typename T> struct tvec1; + template <typename T> struct tvec2; + template <typename T> struct tvec3; + template <typename T> struct tvec4; + template <typename T> struct tmat2x2; + template <typename T> struct tmat2x3; + template <typename T> struct tmat2x4; + template <typename T> struct tmat3x2; + template <typename T> struct tmat3x3; + template <typename T> struct tmat3x4; + template <typename T> struct tmat4x2; + template <typename T> struct tmat4x3; + template <typename T> struct tmat4x4; + + template <typename T> + struct tmat4x2 + { + enum ctor{null}; + typedef T value_type; + typedef std::size_t size_type; + typedef tvec2<T> col_type; + typedef tvec4<T> row_type; + typedef tmat4x2<T> type; + typedef tmat2x4<T> transpose_type; + + static GLM_FUNC_DECL size_type col_size(); + static GLM_FUNC_DECL size_type row_size(); + + GLM_FUNC_DECL GLM_CONSTEXPR size_type length() const; + + private: + // Data + col_type value[4]; + + public: + // Constructors + GLM_FUNC_DECL tmat4x2(); + GLM_FUNC_DECL tmat4x2(tmat4x2 const & m); + + GLM_FUNC_DECL explicit tmat4x2( + ctor Null); + GLM_FUNC_DECL explicit tmat4x2( + value_type const & x); + GLM_FUNC_DECL explicit tmat4x2( + value_type const & x0, value_type const & y0, + value_type const & x1, value_type const & y1, + value_type const & x2, value_type const & y2, + value_type const & x3, value_type const & y3); + GLM_FUNC_DECL explicit tmat4x2( + col_type const & v0, + col_type const & v1, + col_type const & v2, + col_type const & v3); + + ////////////////////////////////////// + // Conversions + template <typename U> + GLM_FUNC_DECL explicit tmat4x2( + U const & x); + + template + < + typename X1, typename Y1, + typename X2, typename Y2, + typename X3, typename Y3, + typename X4, typename Y4 + > + GLM_FUNC_DECL explicit tmat4x2( + X1 const & x1, Y1 const & y1, + X2 const & x2, Y2 const & y2, + X3 const & x3, Y3 const & y3, + X4 const & x4, Y4 const & y4); + + template <typename V1, typename V2, typename V3, typename V4> + GLM_FUNC_DECL explicit tmat4x2( + tvec2<V1> const & v1, + tvec2<V2> const & v2, + tvec2<V3> const & v3, + tvec2<V4> const & v4); + + // Matrix conversions + template <typename U> + GLM_FUNC_DECL explicit tmat4x2(tmat4x2<U> const & m); + + GLM_FUNC_DECL explicit tmat4x2(tmat2x2<T> const & x); + GLM_FUNC_DECL explicit tmat4x2(tmat3x3<T> const & x); + GLM_FUNC_DECL explicit tmat4x2(tmat4x4<T> const & x); + GLM_FUNC_DECL explicit tmat4x2(tmat2x3<T> const & x); + GLM_FUNC_DECL explicit tmat4x2(tmat3x2<T> const & x); + GLM_FUNC_DECL explicit tmat4x2(tmat2x4<T> const & x); + GLM_FUNC_DECL explicit tmat4x2(tmat4x3<T> const & x); + GLM_FUNC_DECL explicit tmat4x2(tmat3x4<T> const & x); + + // Accesses + GLM_FUNC_DECL col_type & operator[](size_type i); + GLM_FUNC_DECL col_type const & operator[](size_type i) const; + + // Unary updatable operators + GLM_FUNC_DECL tmat4x2<T>& operator= (tmat4x2<T> const & m); + template <typename U> + GLM_FUNC_DECL tmat4x2<T>& operator= (tmat4x2<U> const & m); + template <typename U> + GLM_FUNC_DECL tmat4x2<T>& operator+= (U s); + template <typename U> + GLM_FUNC_DECL tmat4x2<T>& operator+= (tmat4x2<U> const & m); + template <typename U> + GLM_FUNC_DECL tmat4x2<T>& operator-= (U s); + template <typename U> + GLM_FUNC_DECL tmat4x2<T>& operator-= (tmat4x2<U> const & m); + template <typename U> + GLM_FUNC_DECL tmat4x2<T>& operator*= (U s); + template <typename U> + GLM_FUNC_DECL tmat4x2<T>& operator*= (tmat4x2<U> const & m); + template <typename U> + GLM_FUNC_DECL tmat4x2<T>& operator/= (U s); + + GLM_FUNC_DECL tmat4x2<T>& operator++ (); + GLM_FUNC_DECL tmat4x2<T>& operator-- (); + }; + + // Binary operators + template <typename T> + GLM_FUNC_DECL tmat4x2<T> operator+ ( + tmat4x2<T> const & m, + typename tmat4x2<T>::value_type const & s); + + template <typename T> + GLM_FUNC_DECL tmat4x2<T> operator+ ( + tmat4x2<T> const & m1, + tmat4x2<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat4x2<T> operator- ( + tmat4x2<T> const & m, + typename tmat4x2<T>::value_type const & s); + + template <typename T> + GLM_FUNC_DECL tmat4x2<T> operator- ( + tmat4x2<T> const & m1, + tmat4x2<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat4x2<T> operator* ( + tmat4x2<T> const & m, + typename tmat4x2<T>::value_type const & s); + + template <typename T> + GLM_FUNC_DECL tmat4x2<T> operator* ( + typename tmat4x2<T>::value_type const & s, + tmat4x2<T> const & m); + + template <typename T> + GLM_FUNC_DECL typename tmat4x2<T>::col_type operator* ( + tmat4x2<T> const & m, + typename tmat4x2<T>::row_type const & v); + + template <typename T> + GLM_FUNC_DECL typename tmat4x2<T>::row_type operator* ( + typename tmat4x2<T>::col_type const & v, + tmat4x2<T> const & m); + + template <typename T> + GLM_FUNC_DECL tmat3x2<T> operator* ( + tmat4x2<T> const & m1, + tmat3x4<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat4x2<T> operator* ( + tmat4x2<T> const & m1, + tmat4x4<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat2x3<T> operator* ( + tmat4x3<T> const & m1, + tmat2x4<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat4x2<T> operator/ ( + tmat4x2<T> const & m, + typename tmat4x2<T>::value_type const & s); + + template <typename T> + GLM_FUNC_DECL tmat4x2<T> operator/ ( + typename tmat4x2<T>::value_type const & s, + tmat4x2<T> const & m); + + // Unary constant operators + template <typename T> + GLM_FUNC_DECL tmat4x2<T> const operator- ( + tmat4x2<T> const & m); + + template <typename T> + GLM_FUNC_DECL tmat4x2<T> const operator-- ( + tmat4x2<T> const & m, + int); + + template <typename T> + GLM_FUNC_DECL tmat4x2<T> const operator++ ( + tmat4x2<T> const & m, + int); +} //namespace detail + + /// @addtogroup core_precision + /// @{ + + /// 4 columns of 2 components matrix of low precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tmat4x2<lowp_float> lowp_mat4x2; + + /// 4 columns of 2 components matrix of medium precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tmat4x2<mediump_float> mediump_mat4x2; + + /// 4 columns of 2 components matrix of high precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tmat4x2<highp_float> highp_mat4x2; + + /// @} +}//namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_mat4x2.inl" +#endif + +#endif //glm_core_type_mat4x2 diff --git a/include/gal/opengl/glm/core/type_mat4x2.inl b/include/gal/opengl/glm/core/type_mat4x2.inl new file mode 100644 index 0000000..3f65e63 --- /dev/null +++ b/include/gal/opengl/glm/core/type_mat4x2.inl @@ -0,0 +1,716 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/type_mat4x2.inl +/// @date 2006-10-01 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +namespace glm{ +namespace detail +{ + template <typename T> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename tmat4x2<T>::size_type tmat4x2<T>::length() const + { + return 4; + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat4x2<T>::size_type tmat4x2<T>::col_size() + { + return 2; + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat4x2<T>::size_type tmat4x2<T>::row_size() + { + return 4; + } + + ////////////////////////////////////// + // Accesses + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat4x2<T>::col_type & + tmat4x2<T>::operator[] + ( + size_type i + ) + { + assert(i < this->length()); + return this->value[i]; + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat4x2<T>::col_type const & + tmat4x2<T>::operator[] + ( + size_type i + ) const + { + assert(i < this->length()); + return this->value[i]; + } + + ////////////////////////////////////////////////////////////// + // Constructors + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2() + { + value_type const Zero(0); + value_type const One(1); + this->value[0] = col_type(One, Zero); + this->value[1] = col_type(Zero, One); + this->value[2] = col_type(Zero, Zero); + this->value[3] = col_type(Zero, Zero); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2 + ( + tmat4x2<T> const & m + ) + { + this->value[0] = m.value[0]; + this->value[1] = m.value[1]; + this->value[2] = m.value[2]; + this->value[3] = m.value[3]; + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2 + ( + ctor + ) + {} + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2 + ( + value_type const & s + ) + { + value_type const Zero(0); + this->value[0] = col_type(s, Zero); + this->value[1] = col_type(Zero, s); + this->value[2] = col_type(Zero, Zero); + this->value[3] = col_type(Zero, Zero); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2 + ( + value_type const & x0, value_type const & y0, + value_type const & x1, value_type const & y1, + value_type const & x2, value_type const & y2, + value_type const & x3, value_type const & y3 + ) + { + this->value[0] = col_type(x0, y0); + this->value[1] = col_type(x1, y1); + this->value[2] = col_type(x2, y2); + this->value[3] = col_type(x3, y3); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2 + ( + col_type const & v0, + col_type const & v1, + col_type const & v2, + col_type const & v3 + ) + { + this->value[0] = v0; + this->value[1] = v1; + this->value[2] = v2; + this->value[3] = v3; + } + + ////////////////////////////////////// + // Convertion constructors + template <typename T> + template <typename U> + GLM_FUNC_DECL tmat4x2<T>::tmat4x2 + ( + U const & s + ) + { + value_type const Zero(0); + this->value[0] = tvec2<T>(value_type(s), Zero); + this->value[1] = tvec2<T>(Zero, value_type(s)); + this->value[2] = tvec2<T>(Zero, Zero); + this->value[3] = tvec2<T>(Zero, Zero); + } + + template <typename T> + template < + typename X1, typename Y1, + typename X2, typename Y2, + typename X3, typename Y3, + typename X4, typename Y4> + GLM_FUNC_DECL tmat4x2<T>::tmat4x2 + ( + X1 const & x1, Y1 const & y1, + X2 const & x2, Y2 const & y2, + X3 const & x3, Y3 const & y3, + X4 const & x4, Y4 const & y4 + ) + { + this->value[0] = col_type(value_type(x1), value_type(y1)); + this->value[1] = col_type(value_type(x2), value_type(y2)); + this->value[2] = col_type(value_type(x3), value_type(y3)); + this->value[3] = col_type(value_type(x4), value_type(y4)); + } + + template <typename T> + template <typename V1, typename V2, typename V3, typename V4> + GLM_FUNC_DECL tmat4x2<T>::tmat4x2 + ( + tvec2<V1> const & v1, + tvec2<V2> const & v2, + tvec2<V3> const & v3, + tvec2<V4> const & v4 + ) + { + this->value[0] = col_type(v1); + this->value[1] = col_type(v2); + this->value[2] = col_type(v3); + this->value[3] = col_type(v4); + } + + // Conversion + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2 + ( + tmat4x2<U> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + this->value[3] = col_type(m[3]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2 + ( + tmat2x2<T> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(value_type(0)); + this->value[3] = col_type(value_type(0)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2 + ( + tmat3x3<T> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + this->value[3] = col_type(value_type(0)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2 + ( + tmat4x4<T> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + this->value[3] = col_type(m[3]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2 + ( + tmat2x3<T> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(value_type(0)); + this->value[3] = col_type(value_type(0)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2 + ( + tmat3x2<T> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + this->value[3] = col_type(value_type(0)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2 + ( + tmat2x4<T> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(value_type(0)); + this->value[3] = col_type(value_type(0)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2 + ( + tmat4x3<T> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + this->value[3] = col_type(m[3]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x2<T>::tmat4x2 + ( + tmat3x4<T> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + this->value[3] = col_type(value_type(0)); + } + + ////////////////////////////////////////////////////////////// + // Unary updatable operators + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x2<T>& tmat4x2<T>::operator= + ( + tmat4x2<T> const & m + ) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; + this->value[3] = m[3]; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat4x2<T>& tmat4x2<T>::operator= + ( + tmat4x2<U> const & m + ) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; + this->value[3] = m[3]; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat4x2<T> & tmat4x2<T>::operator+= (U s) + { + this->value[0] += s; + this->value[1] += s; + this->value[2] += s; + this->value[3] += s; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat4x2<T> & tmat4x2<T>::operator+= + ( + tmat4x2<U> const & m + ) + { + this->value[0] += m[0]; + this->value[1] += m[1]; + this->value[2] += m[2]; + this->value[3] += m[3]; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat4x2<T> & tmat4x2<T>::operator-= (U s) + { + this->value[0] -= s; + this->value[1] -= s; + this->value[2] -= s; + this->value[3] -= s; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat4x2<T> & tmat4x2<T>::operator-= + ( + tmat4x2<U> const & m + ) + { + this->value[0] -= m[0]; + this->value[1] -= m[1]; + this->value[2] -= m[2]; + this->value[3] -= m[3]; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat4x2<T> & tmat4x2<T>::operator*= (U s) + { + this->value[0] *= s; + this->value[1] *= s; + this->value[2] *= s; + this->value[3] *= s; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat4x2<T> & tmat4x2<T>::operator*= + ( + tmat4x2<U> const & m + ) + { + return (*this = tmat4x2<T>(*this * m)); + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat4x2<T> & tmat4x2<T>::operator/= (U s) + { + this->value[0] /= s; + this->value[1] /= s; + this->value[2] /= s; + this->value[3] /= s; + return *this; + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x2<T> & tmat4x2<T>::operator++ () + { + ++this->value[0]; + ++this->value[1]; + ++this->value[2]; + ++this->value[3]; + return *this; + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x2<T> & tmat4x2<T>::operator-- () + { + --this->value[0]; + --this->value[1]; + --this->value[2]; + --this->value[3]; + return *this; + } + + ////////////////////////////////////////////////////////////// + // Binary operators + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x2<T> operator+ + ( + tmat4x2<T> const & m, + typename tmat4x2<T>::value_type const & s + ) + { + return tmat4x2<T>( + m[0] + s, + m[1] + s, + m[2] + s, + m[3] + s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x2<T> operator+ + ( + tmat4x2<T> const & m1, + tmat4x2<T> const & m2 + ) + { + return tmat4x2<T>( + m1[0] + m2[0], + m1[1] + m2[1], + m1[2] + m2[2], + m1[3] + m2[3]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x2<T> operator- + ( + tmat4x2<T> const & m, + typename tmat4x2<T>::value_type const & s + ) + { + return tmat4x2<T>( + m[0] - s, + m[1] - s, + m[2] - s, + m[3] - s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x2<T> operator- + ( + tmat4x2<T> const & m1, + tmat4x2<T> const & m2 + ) + { + return tmat4x2<T>( + m1[0] - m2[0], + m1[1] - m2[1], + m1[2] - m2[2], + m1[3] - m2[3]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x2<T> operator* + ( + tmat4x2<T> const & m, + typename tmat4x2<T>::value_type const & s + ) + { + return tmat4x2<T>( + m[0] * s, + m[1] * s, + m[2] * s, + m[3] * s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x2<T> operator* + ( + typename tmat4x2<T>::value_type const & s, + tmat4x2<T> const & m + ) + { + return tmat4x2<T>( + m[0] * s, + m[1] * s, + m[2] * s, + m[3] * s); + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat4x2<T>::col_type operator* + ( + tmat4x2<T> const & m, + typename tmat4x2<T>::row_type const & v) + { + return typename tmat4x2<T>::col_type( + m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z + m[3][0] * v.w, + m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z + m[3][1] * v.w); + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat4x2<T>::row_type operator* + ( + typename tmat4x2<T>::col_type const & v, + tmat4x2<T> const & m) + { + return typename tmat4x2<T>::row_type( + v.x * m[0][0] + v.y * m[0][1], + v.x * m[1][0] + v.y * m[1][1], + v.x * m[2][0] + v.y * m[2][1], + v.x * m[3][0] + v.y * m[3][1]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x2<T> operator* + ( + tmat4x2<T> const & m1, + tmat2x4<T> const & m2 + ) + { + T const SrcA00 = m1[0][0]; + T const SrcA01 = m1[0][1]; + T const SrcA10 = m1[1][0]; + T const SrcA11 = m1[1][1]; + T const SrcA20 = m1[2][0]; + T const SrcA21 = m1[2][1]; + T const SrcA30 = m1[3][0]; + T const SrcA31 = m1[3][1]; + + T const SrcB00 = m2[0][0]; + T const SrcB01 = m2[0][1]; + T const SrcB02 = m2[0][2]; + T const SrcB03 = m2[0][3]; + T const SrcB10 = m2[1][0]; + T const SrcB11 = m2[1][1]; + T const SrcB12 = m2[1][2]; + T const SrcB13 = m2[1][3]; + + tmat2x2<T> Result(tmat2x2<T>::null); + Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02 + SrcA30 * SrcB03; + Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02 + SrcA31 * SrcB03; + Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12 + SrcA30 * SrcB13; + Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11 + SrcA21 * SrcB12 + SrcA31 * SrcB13; + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x2<T> operator* + ( + tmat4x2<T> const & m1, + tmat3x4<T> const & m2 + ) + { + return tmat3x2<T>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3], + m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2] + m1[3][0] * m2[2][3], + m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2] + m1[3][1] * m2[2][3]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x2<T> operator* + ( + tmat4x2<T> const & m1, + tmat4x4<T> const & m2 + ) + { + return tmat4x2<T>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3], + m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2] + m1[3][0] * m2[2][3], + m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2] + m1[3][1] * m2[2][3], + m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1] + m1[2][0] * m2[3][2] + m1[3][0] * m2[3][3], + m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1] + m1[2][1] * m2[3][2] + m1[3][1] * m2[3][3]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x2<T> operator/ + ( + tmat4x2<T> const & m, + typename tmat4x2<T>::value_type const & s + ) + { + return tmat4x2<T>( + m[0] / s, + m[1] / s, + m[2] / s, + m[3] / s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x2<T> operator/ + ( + typename tmat4x2<T>::value_type const & s, + tmat4x2<T> const & m + ) + { + return tmat4x2<T>( + s / m[0], + s / m[1], + s / m[2], + s / m[3]); + } + + // Unary constant operators + template <typename T> + GLM_FUNC_QUALIFIER tmat4x2<T> const operator- + ( + tmat4x2<T> const & m + ) + { + return tmat4x2<T>( + -m[0], + -m[1], + -m[2], + -m[3]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x2<T> const operator++ + ( + tmat4x2<T> const & m, + int + ) + { + return tmat4x2<T>( + m[0] + typename tmat4x2<T>::value_type(1), + m[1] + typename tmat4x2<T>::value_type(1), + m[2] + typename tmat4x2<T>::value_type(1), + m[3] + typename tmat4x2<T>::value_type(1)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x2<T> const operator-- + ( + tmat4x2<T> const & m, + int + ) + { + return tmat4x2<T>( + m[0] - typename tmat4x2<T>::value_type(1), + m[1] - typename tmat4x2<T>::value_type(1), + m[2] - typename tmat4x2<T>::value_type(1), + m[3] - typename tmat4x2<T>::value_type(1)); + } + + ////////////////////////////////////// + // Boolean operators + + template <typename T> + GLM_FUNC_QUALIFIER bool operator== + ( + tmat4x2<T> const & m1, + tmat4x2<T> const & m2 + ) + { + return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]) && (m1[3] == m2[3]); + } + + template <typename T> + GLM_FUNC_QUALIFIER bool operator!= + ( + tmat4x2<T> const & m1, + tmat4x2<T> const & m2 + ) + { + return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]) || (m1[3] != m2[3]); + } +} //namespace detail +} //namespace glm diff --git a/include/gal/opengl/glm/core/type_mat4x3.hpp b/include/gal/opengl/glm/core/type_mat4x3.hpp new file mode 100644 index 0000000..8465a83 --- /dev/null +++ b/include/gal/opengl/glm/core/type_mat4x3.hpp @@ -0,0 +1,268 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/type_mat4x3.hpp +/// @date 2006-08-04 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_type_mat4x3 +#define glm_core_type_mat4x3 + +#include "type_mat.hpp" + +namespace glm{ +namespace detail +{ + template <typename T> struct tvec1; + template <typename T> struct tvec2; + template <typename T> struct tvec3; + template <typename T> struct tvec4; + template <typename T> struct tmat2x2; + template <typename T> struct tmat2x3; + template <typename T> struct tmat2x4; + template <typename T> struct tmat3x2; + template <typename T> struct tmat3x3; + template <typename T> struct tmat3x4; + template <typename T> struct tmat4x2; + template <typename T> struct tmat4x3; + template <typename T> struct tmat4x4; + + template <typename T> + struct tmat4x3 + { + enum ctor{null}; + typedef T value_type; + typedef std::size_t size_type; + typedef tvec3<T> col_type; + typedef tvec4<T> row_type; + typedef tmat4x3<T> type; + typedef tmat3x4<T> transpose_type; + + static GLM_FUNC_DECL size_type col_size(); + static GLM_FUNC_DECL size_type row_size(); + + GLM_FUNC_DECL GLM_CONSTEXPR size_type length() const; + + private: + // Data + col_type value[4]; + + public: + // Constructors + GLM_FUNC_DECL tmat4x3(); + GLM_FUNC_DECL tmat4x3(tmat4x3 const & m); + + GLM_FUNC_DECL explicit tmat4x3( + ctor Null); + GLM_FUNC_DECL explicit tmat4x3( + value_type const & x); + GLM_FUNC_DECL explicit tmat4x3( + value_type const & x0, value_type const & y0, value_type const & z0, + value_type const & x1, value_type const & y1, value_type const & z1, + value_type const & x2, value_type const & y2, value_type const & z2, + value_type const & x3, value_type const & y3, value_type const & z3); + GLM_FUNC_DECL explicit tmat4x3( + col_type const & v0, + col_type const & v1, + col_type const & v2, + col_type const & v3); + + ////////////////////////////////////// + // Conversions + template <typename U> + GLM_FUNC_DECL explicit tmat4x3( + U const & x); + + template < + typename X1, typename Y1, typename Z1, + typename X2, typename Y2, typename Z2, + typename X3, typename Y3, typename Z3, + typename X4, typename Y4, typename Z4> + GLM_FUNC_DECL explicit tmat4x3( + X1 const & x1, Y1 const & y1, Z1 const & z1, + X2 const & x2, Y2 const & y2, Z2 const & z2, + X3 const & x3, Y3 const & y3, Z3 const & z3, + X4 const & x4, Y4 const & y4, Z4 const & z4); + + template <typename V1, typename V2, typename V3, typename V4> + GLM_FUNC_DECL explicit tmat4x3( + tvec3<V1> const & v1, + tvec3<V2> const & v2, + tvec3<V3> const & v3, + tvec3<V4> const & v4); + + // Matrix conversions + template <typename U> + GLM_FUNC_DECL explicit tmat4x3(tmat4x3<U> const & m); + + GLM_FUNC_DECL explicit tmat4x3(tmat2x2<T> const & x); + GLM_FUNC_DECL explicit tmat4x3(tmat3x3<T> const & x); + GLM_FUNC_DECL explicit tmat4x3(tmat4x4<T> const & x); + GLM_FUNC_DECL explicit tmat4x3(tmat2x3<T> const & x); + GLM_FUNC_DECL explicit tmat4x3(tmat3x2<T> const & x); + GLM_FUNC_DECL explicit tmat4x3(tmat2x4<T> const & x); + GLM_FUNC_DECL explicit tmat4x3(tmat4x2<T> const & x); + GLM_FUNC_DECL explicit tmat4x3(tmat3x4<T> const & x); + + // Accesses + GLM_FUNC_DECL col_type & operator[](size_type i); + GLM_FUNC_DECL col_type const & operator[](size_type i) const; + + // Unary updatable operators + GLM_FUNC_DECL tmat4x3<T> & operator= (tmat4x3<T> const & m); + template <typename U> + GLM_FUNC_DECL tmat4x3<T> & operator= (tmat4x3<U> const & m); + template <typename U> + GLM_FUNC_DECL tmat4x3<T> & operator+= (U s); + template <typename U> + GLM_FUNC_DECL tmat4x3<T> & operator+= (tmat4x3<U> const & m); + template <typename U> + GLM_FUNC_DECL tmat4x3<T> & operator-= (U s); + template <typename U> + GLM_FUNC_DECL tmat4x3<T> & operator-= (tmat4x3<U> const & m); + template <typename U> + GLM_FUNC_DECL tmat4x3<T> & operator*= (U s); + template <typename U> + GLM_FUNC_DECL tmat4x3<T> & operator*= (tmat4x3<U> const & m); + template <typename U> + GLM_FUNC_DECL tmat4x3<T> & operator/= (U s); + + GLM_FUNC_DECL tmat4x3<T> & operator++ (); + GLM_FUNC_DECL tmat4x3<T> & operator-- (); + }; + + // Binary operators + template <typename T> + GLM_FUNC_DECL tmat4x3<T> operator+ ( + tmat4x3<T> const & m, + typename tmat4x3<T>::value_type const & s); + + template <typename T> + GLM_FUNC_DECL tmat4x3<T> operator+ ( + tmat4x3<T> const & m1, + tmat4x3<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat4x3<T> operator- ( + tmat4x3<T> const & m, + typename tmat4x3<T>::value_type const & s); + + template <typename T> + GLM_FUNC_DECL tmat4x3<T> operator- ( + tmat4x3<T> const & m1, + tmat4x3<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat4x3<T> operator* ( + tmat4x3<T> const & m, + typename tmat4x3<T>::value_type const & s); + + template <typename T> + GLM_FUNC_DECL tmat4x3<T> operator* ( + typename tmat4x3<T>::value_type const & s, + tmat4x3<T> const & m); + + template <typename T> + GLM_FUNC_DECL typename tmat4x3<T>::col_type operator* ( + tmat4x3<T> const & m, + typename tmat4x3<T>::row_type const & v); + + template <typename T> + GLM_FUNC_DECL typename tmat4x3<T>::row_type operator* ( + typename tmat4x3<T>::col_type const & v, + tmat4x3<T> const & m); + + template <typename T> + GLM_FUNC_DECL tmat2x3<T> operator* ( + tmat4x3<T> const & m1, + tmat2x4<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat3x3<T> operator* ( + tmat4x3<T> const & m1, + tmat3x4<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat4x3<T> operator* ( + tmat4x3<T> const & m1, + tmat4x4<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat4x3<T> operator/ ( + tmat4x3<T> const & m, + typename tmat4x3<T>::value_type const & s); + + template <typename T> + GLM_FUNC_DECL tmat4x3<T> operator/ ( + typename tmat4x3<T>::value_type const & s, + tmat4x3<T> const & m); + + // Unary constant operators + template <typename T> + GLM_FUNC_DECL tmat4x3<T> const operator- ( + tmat4x3<T> const & m); + + template <typename T> + GLM_FUNC_DECL tmat4x3<T> const operator-- ( + tmat4x3<T> const & m, + int); + + template <typename T> + GLM_FUNC_DECL tmat4x3<T> const operator++ ( + tmat4x3<T> const & m, + int); +}//namespace detail + + /// @addtogroup core_precision + /// @{ + + /// 4 columns of 3 components matrix of low precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tmat4x3<lowp_float> lowp_mat4x3; + + /// 4 columns of 3 components matrix of medium precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tmat4x3<mediump_float> mediump_mat4x3; + + /// 4 columns of 3 components matrix of high precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tmat4x3<highp_float> highp_mat4x3; + + /// @} +}//namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_mat4x3.inl" +#endif //GLM_EXTERNAL_TEMPLATE + +#endif//glm_core_type_mat4x3 diff --git a/include/gal/opengl/glm/core/type_mat4x3.inl b/include/gal/opengl/glm/core/type_mat4x3.inl new file mode 100644 index 0000000..75307a5 --- /dev/null +++ b/include/gal/opengl/glm/core/type_mat4x3.inl @@ -0,0 +1,725 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/type_mat4x3.inl +/// @date 2006-04-17 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +namespace glm{ +namespace detail +{ + template <typename T> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename tmat4x3<T>::size_type tmat4x3<T>::length() const + { + return 4; + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat4x3<T>::size_type tmat4x3<T>::col_size() + { + return 3; + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat4x3<T>::size_type tmat4x3<T>::row_size() + { + return 4; + } + + ////////////////////////////////////// + // Accesses + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat4x3<T>::col_type & + tmat4x3<T>::operator[] + ( + size_type i + ) + { + assert(i < this->length()); + return this->value[i]; + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat4x3<T>::col_type const & + tmat4x3<T>::operator[] + ( + size_type i + ) const + { + assert(i < this->length()); + return this->value[i]; + } + + ////////////////////////////////////////////////////////////// + // Constructors + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x3<T>::tmat4x3() + { + value_type const Zero(0); + value_type const One(1); + this->value[0] = col_type(One, Zero, Zero); + this->value[1] = col_type(Zero, One, Zero); + this->value[2] = col_type(Zero, Zero, One); + this->value[3] = col_type(Zero, Zero, Zero); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x3<T>::tmat4x3 + ( + tmat4x3<T> const & m + ) + { + this->value[0] = m.value[0]; + this->value[1] = m.value[1]; + this->value[2] = m.value[2]; + this->value[3] = m.value[3]; + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x3<T>::tmat4x3 + ( + ctor + ) + {} + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x3<T>::tmat4x3 + ( + value_type const & s + ) + { + value_type const Zero(0); + this->value[0] = col_type(s, Zero, Zero); + this->value[1] = col_type(Zero, s, Zero); + this->value[2] = col_type(Zero, Zero, s); + this->value[3] = col_type(Zero, Zero, Zero); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x3<T>::tmat4x3 + ( + value_type const & x0, value_type const & y0, value_type const & z0, + value_type const & x1, value_type const & y1, value_type const & z1, + value_type const & x2, value_type const & y2, value_type const & z2, + value_type const & x3, value_type const & y3, value_type const & z3 + ) + { + this->value[0] = col_type(x0, y0, z0); + this->value[1] = col_type(x1, y1, z1); + this->value[2] = col_type(x2, y2, z2); + this->value[3] = col_type(x3, y3, z3); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x3<T>::tmat4x3 + ( + col_type const & v0, + col_type const & v1, + col_type const & v2, + col_type const & v3 + ) + { + this->value[0] = v0; + this->value[1] = v1; + this->value[2] = v2; + this->value[3] = v3; + } + + ////////////////////////////////////// + // Convertion constructors + template <typename T> + template <typename U> + GLM_FUNC_DECL tmat4x3<T>::tmat4x3 + ( + U const & s + ) + { + value_type const Zero(0); + this->value[0] = tvec3<T>(value_type(s), Zero, Zero); + this->value[1] = tvec3<T>(Zero, value_type(s), Zero); + this->value[2] = tvec3<T>(Zero, Zero, value_type(s)); + this->value[3] = tvec3<T>(Zero, Zero, Zero); + } + + template <typename T> + template < + typename X1, typename Y1, typename Z1, + typename X2, typename Y2, typename Z2, + typename X3, typename Y3, typename Z3, + typename X4, typename Y4, typename Z4> + GLM_FUNC_DECL tmat4x3<T>::tmat4x3 + ( + X1 const & x1, Y1 const & y1, Z1 const & z1, + X2 const & x2, Y2 const & y2, Z2 const & z2, + X3 const & x3, Y3 const & y3, Z3 const & z3, + X4 const & x4, Y4 const & y4, Z4 const & z4 + ) + { + this->value[0] = col_type(value_type(x1), value_type(y1), value_type(z1)); + this->value[1] = col_type(value_type(x2), value_type(y2), value_type(z2)); + this->value[2] = col_type(value_type(x3), value_type(y3), value_type(z3)); + this->value[3] = col_type(value_type(x4), value_type(y4), value_type(z4)); + } + + template <typename T> + template <typename V1, typename V2, typename V3, typename V4> + GLM_FUNC_DECL tmat4x3<T>::tmat4x3 + ( + tvec3<V1> const & v1, + tvec3<V2> const & v2, + tvec3<V3> const & v3, + tvec3<V4> const & v4 + ) + { + this->value[0] = col_type(v1); + this->value[1] = col_type(v2); + this->value[2] = col_type(v3); + this->value[3] = col_type(v4); + } + + ////////////////////////////////////////////////////////////// + // Matrix conversions + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat4x3<T>::tmat4x3 + ( + tmat4x3<U> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + this->value[3] = col_type(m[3]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x3<T>::tmat4x3 + ( + tmat2x2<T> const & m + ) + { + this->value[0] = col_type(m[0], value_type(0)); + this->value[1] = col_type(m[1], value_type(0)); + this->value[2] = col_type(m[2], value_type(1)); + this->value[3] = col_type(value_type(0)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x3<T>::tmat4x3 + ( + tmat3x3<T> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + this->value[3] = col_type(value_type(0)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x3<T>::tmat4x3 + ( + tmat4x4<T> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + this->value[3] = col_type(m[3]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x3<T>::tmat4x3 + ( + tmat2x3<T> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(value_type(0), value_type(0), value_type(1)); + this->value[3] = col_type(value_type(0)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x3<T>::tmat4x3 + ( + tmat3x2<T> const & m + ) + { + this->value[0] = col_type(m[0], value_type(0)); + this->value[1] = col_type(m[1], value_type(0)); + this->value[2] = col_type(m[2], value_type(1)); + this->value[3] = col_type(value_type(0)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x3<T>::tmat4x3 + ( + tmat2x4<T> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(value_type(0), value_type(0), value_type(1)); + this->value[3] = col_type(value_type(0)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x3<T>::tmat4x3 + ( + tmat4x2<T> const & m + ) + { + this->value[0] = col_type(m[0], value_type(0)); + this->value[1] = col_type(m[1], value_type(0)); + this->value[2] = col_type(m[2], value_type(1)); + this->value[3] = col_type(m[3], value_type(0)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x3<T>::tmat4x3 + ( + tmat3x4<T> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + this->value[3] = col_type(value_type(0)); + } + + ////////////////////////////////////////////////////////////// + // Unary updatable operators + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x3<T>& tmat4x3<T>::operator= + ( + tmat4x3<T> const & m + ) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; + this->value[3] = m[3]; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat4x3<T>& tmat4x3<T>::operator= + ( + tmat4x3<U> const & m + ) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; + this->value[3] = m[3]; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat4x3<T> & tmat4x3<T>::operator+= (U s) + { + this->value[0] += s; + this->value[1] += s; + this->value[2] += s; + this->value[3] += s; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat4x3<T> & tmat4x3<T>::operator+= + ( + tmat4x3<U> const & m + ) + { + this->value[0] += m[0]; + this->value[1] += m[1]; + this->value[2] += m[2]; + this->value[3] += m[3]; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat4x3<T> & tmat4x3<T>::operator-= (U s) + { + this->value[0] -= s; + this->value[1] -= s; + this->value[2] -= s; + this->value[3] -= s; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat4x3<T> & tmat4x3<T>::operator-= + ( + tmat4x3<U> const & m + ) + { + this->value[0] -= m[0]; + this->value[1] -= m[1]; + this->value[2] -= m[2]; + this->value[3] -= m[3]; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat4x3<T> & tmat4x3<T>::operator*= (U s) + { + this->value[0] *= s; + this->value[1] *= s; + this->value[2] *= s; + this->value[3] *= s; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat4x3<T> & tmat4x3<T>::operator*= + ( + tmat4x3<U> const & m + ) + { + return (*this = tmat4x3<T>(*this * m)); + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat4x3<T> & tmat4x3<T>::operator/= (U s) + { + this->value[0] /= s; + this->value[1] /= s; + this->value[2] /= s; + this->value[3] /= s; + return *this; + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x3<T> & tmat4x3<T>::operator++ () + { + ++this->value[0]; + ++this->value[1]; + ++this->value[2]; + ++this->value[3]; + return *this; + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x3<T> & tmat4x3<T>::operator-- () + { + --this->value[0]; + --this->value[1]; + --this->value[2]; + --this->value[3]; + return *this; + } + + ////////////////////////////////////////////////////////////// + // Binary operators + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x3<T> operator+ ( + tmat4x3<T> const & m, + typename tmat4x3<T>::value_type const & s) + { + return tmat4x3<T>( + m[0] + s, + m[1] + s, + m[2] + s, + m[3] + s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x3<T> operator+ ( + tmat4x3<T> const & m1, + tmat4x3<T> const & m2) + { + return tmat4x3<T>( + m1[0] + m2[0], + m1[1] + m2[1], + m1[2] + m2[2], + m1[3] + m2[3]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x3<T> operator- ( + tmat4x3<T> const & m, + typename tmat4x3<T>::value_type const & s) + { + return tmat4x3<T>( + m[0] - s, + m[1] - s, + m[2] - s, + m[3] - s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x3<T> operator- ( + tmat4x3<T> const & m1, + tmat4x3<T> const & m2) + { + return tmat4x3<T>( + m1[0] - m2[0], + m1[1] - m2[1], + m1[2] - m2[2], + m1[3] - m2[3]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x3<T> operator* ( + tmat4x3<T> const & m, + typename tmat4x3<T>::value_type const & s) + { + return tmat4x3<T>( + m[0] * s, + m[1] * s, + m[2] * s, + m[3] * s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x3<T> operator* ( + typename tmat4x3<T>::value_type const & s, + tmat4x3<T> const & m) + { + return tmat4x3<T>( + m[0] * s, + m[1] * s, + m[2] * s, + m[3] * s); + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat4x3<T>::col_type operator* + ( + tmat4x3<T> const & m, + typename tmat4x3<T>::row_type const & v) + { + return typename tmat4x3<T>::col_type( + m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z + m[3][0] * v.w, + m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z + m[3][1] * v.w, + m[0][2] * v.x + m[1][2] * v.y + m[2][2] * v.z + m[3][2] * v.w); + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat4x3<T>::row_type operator* + ( + typename tmat4x3<T>::col_type const & v, + tmat4x3<T> const & m) + { + return typename tmat4x3<T>::row_type( + v.x * m[0][0] + v.y * m[0][1] + v.z * m[0][2], + v.x * m[1][0] + v.y * m[1][1] + v.z * m[1][2], + v.x * m[2][0] + v.y * m[2][1] + v.z * m[2][2], + v.x * m[3][0] + v.y * m[3][1] + v.z * m[3][2]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x3<T> operator* + ( + tmat4x3<T> const & m1, + tmat2x4<T> const & m2 + ) + { + return tmat2x3<T>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3], + m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2] + m1[3][2] * m2[0][3], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3], + m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2] + m1[3][2] * m2[1][3]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x3<T> operator* + ( + tmat4x3<T> const & m1, + tmat3x4<T> const & m2 + ) + { + T const SrcA00 = m1[0][0]; + T const SrcA01 = m1[0][1]; + T const SrcA02 = m1[0][2]; + T const SrcA10 = m1[1][0]; + T const SrcA11 = m1[1][1]; + T const SrcA12 = m1[1][2]; + T const SrcA20 = m1[2][0]; + T const SrcA21 = m1[2][1]; + T const SrcA22 = m1[2][2]; + T const SrcA30 = m1[3][0]; + T const SrcA31 = m1[3][1]; + T const SrcA32 = m1[3][2]; + + T const SrcB00 = m2[0][0]; + T const SrcB01 = m2[0][1]; + T const SrcB02 = m2[0][2]; + T const SrcB03 = m2[0][3]; + T const SrcB10 = m2[1][0]; + T const SrcB11 = m2[1][1]; + T const SrcB12 = m2[1][2]; + T const SrcB13 = m2[1][3]; + T const SrcB20 = m2[2][0]; + T const SrcB21 = m2[2][1]; + T const SrcB22 = m2[2][2]; + T const SrcB23 = m2[2][3]; + + tmat3x3<T> Result(tmat3x3<T>::null); + Result[0][0] = SrcA00 * SrcB00 + SrcA10 * SrcB01 + SrcA20 * SrcB02 + SrcA30 * SrcB03; + Result[0][1] = SrcA01 * SrcB00 + SrcA11 * SrcB01 + SrcA21 * SrcB02 + SrcA31 * SrcB03; + Result[0][2] = SrcA02 * SrcB00 + SrcA12 * SrcB01 + SrcA22 * SrcB02 + SrcA32 * SrcB03; + Result[1][0] = SrcA00 * SrcB10 + SrcA10 * SrcB11 + SrcA20 * SrcB12 + SrcA30 * SrcB13; + Result[1][1] = SrcA01 * SrcB10 + SrcA11 * SrcB11 + SrcA21 * SrcB12 + SrcA31 * SrcB13; + Result[1][2] = SrcA02 * SrcB10 + SrcA12 * SrcB11 + SrcA22 * SrcB12 + SrcA32 * SrcB13; + Result[2][0] = SrcA00 * SrcB20 + SrcA10 * SrcB21 + SrcA20 * SrcB22 + SrcA30 * SrcB23; + Result[2][1] = SrcA01 * SrcB20 + SrcA11 * SrcB21 + SrcA21 * SrcB22 + SrcA31 * SrcB23; + Result[2][2] = SrcA02 * SrcB20 + SrcA12 * SrcB21 + SrcA22 * SrcB22 + SrcA32 * SrcB23; + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x3<T> operator* + ( + tmat4x3<T> const & m1, + tmat4x4<T> const & m2 + ) + { + return tmat4x3<T>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3], + m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2] + m1[3][2] * m2[0][3], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3], + m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2] + m1[3][2] * m2[1][3], + m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2] + m1[3][0] * m2[2][3], + m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2] + m1[3][1] * m2[2][3], + m1[0][2] * m2[2][0] + m1[1][2] * m2[2][1] + m1[2][2] * m2[2][2] + m1[3][2] * m2[2][3], + m1[0][0] * m2[3][0] + m1[1][0] * m2[3][1] + m1[2][0] * m2[3][2] + m1[3][0] * m2[3][3], + m1[0][1] * m2[3][0] + m1[1][1] * m2[3][1] + m1[2][1] * m2[3][2] + m1[3][1] * m2[3][3], + m1[0][2] * m2[3][0] + m1[1][2] * m2[3][1] + m1[2][2] * m2[3][2] + m1[3][2] * m2[3][3]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x3<T> operator/ + ( + tmat4x3<T> const & m, + typename tmat4x3<T>::value_type const & s + ) + { + return tmat4x3<T>( + m[0] / s, + m[1] / s, + m[2] / s, + m[3] / s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x3<T> operator/ + ( + typename tmat4x3<T>::value_type const & s, + tmat4x3<T> const & m + ) + { + return tmat4x3<T>( + s / m[0], + s / m[1], + s / m[2], + s / m[3]); + } + + // Unary constant operators + template <typename T> + GLM_FUNC_QUALIFIER tmat4x3<T> const operator- + ( + tmat4x3<T> const & m + ) + { + return tmat4x3<T>( + -m[0], + -m[1], + -m[2], + -m[3]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x3<T> const operator++ + ( + tmat4x3<T> const & m, + int + ) + { + return tmat4x3<T>( + m[0] + T(1), + m[1] + T(1), + m[2] + T(1), + m[3] + T(1)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x3<T> const operator-- + ( + tmat4x3<T> const & m, + int + ) + { + return tmat4x3<T>( + m[0] - T(1), + m[1] - T(1), + m[2] - T(1), + m[3] - T(1)); + } + + ////////////////////////////////////// + // Boolean operators + + template <typename T> + GLM_FUNC_QUALIFIER bool operator== + ( + tmat4x3<T> const & m1, + tmat4x3<T> const & m2 + ) + { + return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]) && (m1[3] == m2[3]); + } + + template <typename T> + GLM_FUNC_QUALIFIER bool operator!= + ( + tmat4x3<T> const & m1, + tmat4x3<T> const & m2 + ) + { + return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]) || (m1[3] != m2[3]); + } +} //namespace detail +} //namespace glm + diff --git a/include/gal/opengl/glm/core/type_mat4x4.hpp b/include/gal/opengl/glm/core/type_mat4x4.hpp new file mode 100644 index 0000000..85696b9 --- /dev/null +++ b/include/gal/opengl/glm/core/type_mat4x4.hpp @@ -0,0 +1,320 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/type_mat4x4.hpp +/// @date 2005-01-27 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_type_mat4x4 +#define glm_core_type_mat4x4 + +#include "type_mat.hpp" + +namespace glm{ +namespace detail +{ + template <typename T> struct tvec1; + template <typename T> struct tvec2; + template <typename T> struct tvec3; + template <typename T> struct tvec4; + template <typename T> struct tmat2x2; + template <typename T> struct tmat2x3; + template <typename T> struct tmat2x4; + template <typename T> struct tmat3x2; + template <typename T> struct tmat3x3; + template <typename T> struct tmat3x4; + template <typename T> struct tmat4x2; + template <typename T> struct tmat4x3; + template <typename T> struct tmat4x4; + + template <typename T> + struct tmat4x4 + { + enum ctor{null}; + typedef T value_type; + typedef std::size_t size_type; + typedef tvec4<T> col_type; + typedef tvec4<T> row_type; + typedef tmat4x4<T> type; + typedef tmat4x4<T> transpose_type; + + static GLM_FUNC_DECL size_type col_size(); + static GLM_FUNC_DECL size_type row_size(); + + GLM_FUNC_DECL GLM_CONSTEXPR size_type length() const; + + public: + /// Implementation detail + /// @cond DETAIL + GLM_FUNC_DECL tmat4x4<T> _inverse() const; + /// @endcond + + private: + // Data + col_type value[4]; + + public: + // Constructors + GLM_FUNC_DECL tmat4x4(); + GLM_FUNC_DECL tmat4x4(tmat4x4 const & m); + + GLM_FUNC_DECL explicit tmat4x4( + ctor Null); + GLM_FUNC_DECL explicit tmat4x4( + value_type const & x); + GLM_FUNC_DECL explicit tmat4x4( + value_type const & x0, value_type const & y0, value_type const & z0, value_type const & w0, + value_type const & x1, value_type const & y1, value_type const & z1, value_type const & w1, + value_type const & x2, value_type const & y2, value_type const & z2, value_type const & w2, + value_type const & x3, value_type const & y3, value_type const & z3, value_type const & w3); + GLM_FUNC_DECL explicit tmat4x4( + col_type const & v0, + col_type const & v1, + col_type const & v2, + col_type const & v3); + + ////////////////////////////////////// + // Conversions + template <typename U> + GLM_FUNC_DECL explicit tmat4x4( + U const & x); + + template < + typename X1, typename Y1, typename Z1, typename W1, + typename X2, typename Y2, typename Z2, typename W2, + typename X3, typename Y3, typename Z3, typename W3, + typename X4, typename Y4, typename Z4, typename W4> + GLM_FUNC_DECL explicit tmat4x4( + X1 const & x1, Y1 const & y1, Z1 const & z1, W1 const & w1, + X2 const & x2, Y2 const & y2, Z2 const & z2, W2 const & w2, + X3 const & x3, Y3 const & y3, Z3 const & z3, W3 const & w3, + X4 const & x4, Y4 const & y4, Z4 const & z4, W4 const & w4); + + template <typename V1, typename V2, typename V3, typename V4> + GLM_FUNC_DECL explicit tmat4x4( + tvec4<V1> const & v1, + tvec4<V2> const & v2, + tvec4<V3> const & v3, + tvec4<V4> const & v4); + + // Matrix conversions + template <typename U> + GLM_FUNC_DECL explicit tmat4x4(tmat4x4<U> const & m); + + GLM_FUNC_DECL explicit tmat4x4(tmat2x2<T> const & x); + GLM_FUNC_DECL explicit tmat4x4(tmat3x3<T> const & x); + GLM_FUNC_DECL explicit tmat4x4(tmat2x3<T> const & x); + GLM_FUNC_DECL explicit tmat4x4(tmat3x2<T> const & x); + GLM_FUNC_DECL explicit tmat4x4(tmat2x4<T> const & x); + GLM_FUNC_DECL explicit tmat4x4(tmat4x2<T> const & x); + GLM_FUNC_DECL explicit tmat4x4(tmat3x4<T> const & x); + GLM_FUNC_DECL explicit tmat4x4(tmat4x3<T> const & x); + + // Accesses + GLM_FUNC_DECL col_type & operator[](size_type i); + GLM_FUNC_DECL col_type const & operator[](size_type i) const; + + // Unary updatable operators + GLM_FUNC_DECL tmat4x4<T> & operator= (tmat4x4<T> const & m); + template <typename U> + GLM_FUNC_DECL tmat4x4<T> & operator= (tmat4x4<U> const & m); + template <typename U> + GLM_FUNC_DECL tmat4x4<T> & operator+= (U s); + template <typename U> + GLM_FUNC_DECL tmat4x4<T> & operator+= (tmat4x4<U> const & m); + template <typename U> + GLM_FUNC_DECL tmat4x4<T> & operator-= (U s); + template <typename U> + GLM_FUNC_DECL tmat4x4<T> & operator-= (tmat4x4<U> const & m); + template <typename U> + GLM_FUNC_DECL tmat4x4<T> & operator*= (U s); + template <typename U> + GLM_FUNC_DECL tmat4x4<T> & operator*= (tmat4x4<U> const & m); + template <typename U> + GLM_FUNC_DECL tmat4x4<T> & operator/= (U s); + template <typename U> + GLM_FUNC_DECL tmat4x4<T> & operator/= (tmat4x4<U> const & m); + GLM_FUNC_DECL tmat4x4<T> & operator++ (); + GLM_FUNC_DECL tmat4x4<T> & operator-- (); + }; + + // Binary operators + template <typename T> + GLM_FUNC_DECL tmat4x4<T> operator+ ( + tmat4x4<T> const & m, + typename tmat4x4<T>::value_type const & s); + + template <typename T> + GLM_FUNC_DECL tmat4x4<T> operator+ ( + typename tmat4x4<T>::value_type const & s, + tmat4x4<T> const & m); + + template <typename T> + GLM_FUNC_DECL tmat4x4<T> operator+ ( + tmat4x4<T> const & m1, + tmat4x4<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat4x4<T> operator- ( + tmat4x4<T> const & m, + typename tmat4x4<T>::value_type const & s); + + template <typename T> + GLM_FUNC_DECL tmat4x4<T> operator- ( + typename tmat4x4<T>::value_type const & s, + tmat4x4<T> const & m); + + template <typename T> + GLM_FUNC_DECL tmat4x4<T> operator- ( + tmat4x4<T> const & m1, + tmat4x4<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat4x4<T> operator* ( + tmat4x4<T> const & m, + typename tmat4x4<T>::value_type const & s); + + template <typename T> + GLM_FUNC_DECL tmat4x4<T> operator* ( + typename tmat4x4<T>::value_type const & s, + tmat4x4<T> const & m); + + template <typename T> + GLM_FUNC_DECL typename tmat4x4<T>::col_type operator* ( + tmat4x4<T> const & m, + typename tmat4x4<T>::row_type const & v); + + template <typename T> + GLM_FUNC_DECL typename tmat4x4<T>::row_type operator* ( + typename tmat4x4<T>::col_type const & v, + tmat4x4<T> const & m); + + template <typename T> + GLM_FUNC_DECL tmat2x4<T> operator* ( + tmat4x4<T> const & m1, + tmat2x4<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat3x4<T> operator* ( + tmat4x4<T> const & m1, + tmat3x4<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat4x4<T> operator* ( + tmat4x4<T> const & m1, + tmat4x4<T> const & m2); + + template <typename T> + GLM_FUNC_DECL tmat4x4<T> operator/ ( + tmat4x4<T> const & m, + typename tmat4x4<T>::value_type const & s); + + template <typename T> + GLM_FUNC_DECL tmat4x4<T> operator/ ( + typename tmat4x4<T>::value_type const & s, + tmat4x4<T> const & m); + + template <typename T> + GLM_FUNC_DECL typename tmat4x4<T>::col_type operator/ ( + tmat4x4<T> const & m, + typename tmat4x4<T>::row_type const & v); + + template <typename T> + GLM_FUNC_DECL typename tmat4x4<T>::row_type operator/ ( + typename tmat4x4<T>::col_type & v, + tmat4x4<T> const & m); + + template <typename T> + GLM_FUNC_DECL tmat4x4<T> operator/ ( + tmat4x4<T> const & m1, + tmat4x4<T> const & m2); + + // Unary constant operators + template <typename T> + GLM_FUNC_DECL tmat4x4<T> const operator- ( + tmat4x4<T> const & m); + + template <typename T> + GLM_FUNC_DECL tmat4x4<T> const operator-- ( + tmat4x4<T> const & m, int); + + template <typename T> + GLM_FUNC_DECL tmat4x4<T> const operator++ ( + tmat4x4<T> const & m, int); + +} //namespace detail + + /// @addtogroup core_precision + /// @{ + + /// 4 columns of 4 components matrix of low precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tmat4x4<lowp_float> lowp_mat4; + + /// 4 columns of 4 components matrix of medium precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tmat4x4<mediump_float> mediump_mat4; + + /// 4 columns of 4 components matrix of high precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tmat4x4<highp_float> highp_mat4; + + /// 4 columns of 4 components matrix of low precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tmat4x4<lowp_float> lowp_mat4x4; + + /// 4 columns of 4 components matrix of medium precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tmat4x4<mediump_float> mediump_mat4x4; + + /// 4 columns of 4 components matrix of high precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.6 Matrices</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tmat4x4<highp_float> highp_mat4x4; + + /// @} +}//namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_mat4x4.inl" +#endif//GLM_EXTERNAL_TEMPLATE + +#endif//glm_core_type_mat4x4 diff --git a/include/gal/opengl/glm/core/type_mat4x4.inl b/include/gal/opengl/glm/core/type_mat4x4.inl new file mode 100644 index 0000000..29f80d8 --- /dev/null +++ b/include/gal/opengl/glm/core/type_mat4x4.inl @@ -0,0 +1,893 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/type_mat4x4.inl +/// @date 2005-01-27 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +namespace glm{ +namespace detail +{ + template <typename T> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename tmat4x4<T>::size_type tmat4x4<T>::length() const + { + return 4; + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat4x4<T>::size_type tmat4x4<T>::col_size() + { + return 4; + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat4x4<T>::size_type tmat4x4<T>::row_size() + { + return 4; + } + + ////////////////////////////////////// + // Accesses + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat4x4<T>::col_type & + tmat4x4<T>::operator[] + ( + size_type i + ) + { + assert(i < this->length()); + return this->value[i]; + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat4x4<T>::col_type const & + tmat4x4<T>::operator[] + ( + size_type i + ) const + { + assert(i < this->length()); + return this->value[i]; + } + + ////////////////////////////////////////////////////////////// + // Constructors + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x4<T>::tmat4x4() + { + value_type Zero(0); + value_type One(1); + this->value[0] = col_type(One, Zero, Zero, Zero); + this->value[1] = col_type(Zero, One, Zero, Zero); + this->value[2] = col_type(Zero, Zero, One, Zero); + this->value[3] = col_type(Zero, Zero, Zero, One); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x4<T>::tmat4x4 + ( + tmat4x4<T> const & m + ) + { + this->value[0] = m.value[0]; + this->value[1] = m.value[1]; + this->value[2] = m.value[2]; + this->value[3] = m.value[3]; + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x4<T>::tmat4x4 + ( + ctor + ) + {} + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x4<T>::tmat4x4 + ( + value_type const & s + ) + { + value_type const Zero(0); + this->value[0] = col_type(s, Zero, Zero, Zero); + this->value[1] = col_type(Zero, s, Zero, Zero); + this->value[2] = col_type(Zero, Zero, s, Zero); + this->value[3] = col_type(Zero, Zero, Zero, s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x4<T>::tmat4x4 + ( + value_type const & x0, value_type const & y0, value_type const & z0, value_type const & w0, + value_type const & x1, value_type const & y1, value_type const & z1, value_type const & w1, + value_type const & x2, value_type const & y2, value_type const & z2, value_type const & w2, + value_type const & x3, value_type const & y3, value_type const & z3, value_type const & w3 + ) + { + this->value[0] = col_type(x0, y0, z0, w0); + this->value[1] = col_type(x1, y1, z1, w1); + this->value[2] = col_type(x2, y2, z2, w2); + this->value[3] = col_type(x3, y3, z3, w3); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x4<T>::tmat4x4 + ( + col_type const & v0, + col_type const & v1, + col_type const & v2, + col_type const & v3 + ) + { + this->value[0] = v0; + this->value[1] = v1; + this->value[2] = v2; + this->value[3] = v3; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat4x4<T>::tmat4x4 + ( + tmat4x4<U> const & m + ) + { + this->value[0] = col_type(m[0]); + this->value[1] = col_type(m[1]); + this->value[2] = col_type(m[2]); + this->value[3] = col_type(m[3]); + } + + ////////////////////////////////////// + // Convertion constructors + template <typename T> + template <typename U> + GLM_FUNC_DECL tmat4x4<T>::tmat4x4 + ( + U const & s + ) + { + GLM_STATIC_ASSERT(detail::type<U>::is_float || std::numeric_limits<U>::is_integer, "*mat4x4 constructor only takes float and integer types"); + + value_type const Zero(0); + this->value[0] = tvec4<T>(value_type(s), Zero, Zero, Zero); + this->value[1] = tvec4<T>(Zero, value_type(s), Zero, Zero); + this->value[2] = tvec4<T>(Zero, Zero, value_type(s), Zero); + this->value[3] = tvec4<T>(Zero, Zero, Zero, value_type(s)); + } + + template <typename T> + template < + typename X1, typename Y1, typename Z1, typename W1, + typename X2, typename Y2, typename Z2, typename W2, + typename X3, typename Y3, typename Z3, typename W3, + typename X4, typename Y4, typename Z4, typename W4> + GLM_FUNC_DECL tmat4x4<T>::tmat4x4 + ( + X1 const & x1, Y1 const & y1, Z1 const & z1, W1 const & w1, + X2 const & x2, Y2 const & y2, Z2 const & z2, W2 const & w2, + X3 const & x3, Y3 const & y3, Z3 const & z3, W3 const & w3, + X4 const & x4, Y4 const & y4, Z4 const & z4, W4 const & w4 + ) + { + GLM_STATIC_ASSERT(detail::type<X1>::is_float || std::numeric_limits<X1>::is_integer, "*mat4x4 constructor only takes float and integer types, 1st parameter type invalid."); + GLM_STATIC_ASSERT(detail::type<Y1>::is_float || std::numeric_limits<Y1>::is_integer, "*mat4x4 constructor only takes float and integer types, 2nd parameter type invalid."); + GLM_STATIC_ASSERT(detail::type<Z1>::is_float || std::numeric_limits<Z1>::is_integer, "*mat4x4 constructor only takes float and integer types, 3rd parameter type invalid."); + GLM_STATIC_ASSERT(detail::type<W1>::is_float || std::numeric_limits<W1>::is_integer, "*mat4x4 constructor only takes float and integer types, 4th parameter type invalid."); + + GLM_STATIC_ASSERT(detail::type<X2>::is_float || std::numeric_limits<X2>::is_integer, "*mat4x4 constructor only takes float and integer types, 5th parameter type invalid."); + GLM_STATIC_ASSERT(detail::type<Y2>::is_float || std::numeric_limits<Y2>::is_integer, "*mat4x4 constructor only takes float and integer types, 6th parameter type invalid."); + GLM_STATIC_ASSERT(detail::type<Z2>::is_float || std::numeric_limits<Z2>::is_integer, "*mat4x4 constructor only takes float and integer types, 7th parameter type invalid."); + GLM_STATIC_ASSERT(detail::type<W2>::is_float || std::numeric_limits<W2>::is_integer, "*mat4x4 constructor only takes float and integer types, 8th parameter type invalid."); + + GLM_STATIC_ASSERT(detail::type<X3>::is_float || std::numeric_limits<X3>::is_integer, "*mat4x4 constructor only takes float and integer types, 9th parameter type invalid."); + GLM_STATIC_ASSERT(detail::type<Y3>::is_float || std::numeric_limits<Y3>::is_integer, "*mat4x4 constructor only takes float and integer types, 10th parameter type invalid."); + GLM_STATIC_ASSERT(detail::type<Z3>::is_float || std::numeric_limits<Z3>::is_integer, "*mat4x4 constructor only takes float and integer types, 11th parameter type invalid."); + GLM_STATIC_ASSERT(detail::type<W3>::is_float || std::numeric_limits<W3>::is_integer, "*mat4x4 constructor only takes float and integer types, 12th parameter type invalid."); + + GLM_STATIC_ASSERT(detail::type<X4>::is_float || std::numeric_limits<X4>::is_integer, "*mat4x4 constructor only takes float and integer types, 13th parameter type invalid."); + GLM_STATIC_ASSERT(detail::type<Y4>::is_float || std::numeric_limits<Y4>::is_integer, "*mat4x4 constructor only takes float and integer types, 14th parameter type invalid."); + GLM_STATIC_ASSERT(detail::type<Z4>::is_float || std::numeric_limits<Z4>::is_integer, "*mat4x4 constructor only takes float and integer types, 15th parameter type invalid."); + GLM_STATIC_ASSERT(detail::type<W4>::is_float || std::numeric_limits<W4>::is_integer, "*mat4x4 constructor only takes float and integer types, 16th parameter type invalid."); + + this->value[0] = col_type(value_type(x1), value_type(y1), value_type(z1), value_type(w1)); + this->value[1] = col_type(value_type(x2), value_type(y2), value_type(z2), value_type(w2)); + this->value[2] = col_type(value_type(x3), value_type(y3), value_type(z3), value_type(w3)); + this->value[3] = col_type(value_type(x4), value_type(y4), value_type(z4), value_type(w4)); + } + + template <typename T> + template <typename V1, typename V2, typename V3, typename V4> + GLM_FUNC_DECL tmat4x4<T>::tmat4x4 + ( + tvec4<V1> const & v1, + tvec4<V2> const & v2, + tvec4<V3> const & v3, + tvec4<V4> const & v4 + ) + { + GLM_STATIC_ASSERT(detail::type<V1>::is_float || std::numeric_limits<V1>::is_integer, "*mat4x4 constructor only takes float and integer types, 1st parameter type invalid."); + GLM_STATIC_ASSERT(detail::type<V2>::is_float || std::numeric_limits<V2>::is_integer, "*mat4x4 constructor only takes float and integer types, 2nd parameter type invalid."); + GLM_STATIC_ASSERT(detail::type<V3>::is_float || std::numeric_limits<V3>::is_integer, "*mat4x4 constructor only takes float and integer types, 3rd parameter type invalid."); + GLM_STATIC_ASSERT(detail::type<V4>::is_float || std::numeric_limits<V4>::is_integer, "*mat4x4 constructor only takes float and integer types, 4th parameter type invalid."); + + this->value[0] = col_type(v1); + this->value[1] = col_type(v2); + this->value[2] = col_type(v3); + this->value[3] = col_type(v4); + } + + ////////////////////////////////////// + // Matrix convertion constructors + template <typename T> + GLM_FUNC_QUALIFIER tmat4x4<T>::tmat4x4 + ( + tmat2x2<T> const & m + ) + { + this->value[0] = col_type(m[0], detail::tvec2<T>(0)); + this->value[1] = col_type(m[1], detail::tvec2<T>(0)); + this->value[2] = col_type(value_type(0)); + this->value[3] = col_type(value_type(0), value_type(0), value_type(0), value_type(1)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x4<T>::tmat4x4 + ( + tmat3x3<T> const & m + ) + { + this->value[0] = col_type(m[0], value_type(0)); + this->value[1] = col_type(m[1], value_type(0)); + this->value[2] = col_type(m[2], value_type(0)); + this->value[3] = col_type(value_type(0), value_type(0), value_type(0), value_type(1)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x4<T>::tmat4x4 + ( + tmat2x3<T> const & m + ) + { + this->value[0] = col_type(m[0], value_type(0)); + this->value[1] = col_type(m[1], value_type(0)); + this->value[2] = col_type(value_type(0)); + this->value[3] = col_type(value_type(0), value_type(0), value_type(0), value_type(1)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x4<T>::tmat4x4 + ( + tmat3x2<T> const & m + ) + { + this->value[0] = col_type(m[0], detail::tvec2<T>(0)); + this->value[1] = col_type(m[1], detail::tvec2<T>(0)); + this->value[2] = col_type(m[2], detail::tvec2<T>(0)); + this->value[3] = col_type(value_type(0), value_type(0), value_type(0), value_type(1)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x4<T>::tmat4x4 + ( + tmat2x4<T> const & m + ) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = col_type(T(0)); + this->value[3] = col_type(T(0), T(0), T(0), T(1)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x4<T>::tmat4x4 + ( + tmat4x2<T> const & m + ) + { + this->value[0] = col_type(m[0], detail::tvec2<T>(0)); + this->value[1] = col_type(m[1], detail::tvec2<T>(0)); + this->value[2] = col_type(T(0)); + this->value[3] = col_type(T(0), T(0), T(0), T(1)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x4<T>::tmat4x4 + ( + tmat3x4<T> const & m + ) + { + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; + this->value[3] = col_type(T(0), T(0), T(0), T(1)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x4<T>::tmat4x4 + ( + tmat4x3<T> const & m + ) + { + this->value[0] = col_type(m[0], T(0)); + this->value[1] = col_type(m[1], T(0)); + this->value[2] = col_type(m[2], T(0)); + this->value[3] = col_type(m[3], T(1)); + } + + ////////////////////////////////////////////////////////////// + // Operators + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x4<T>& tmat4x4<T>::operator= + ( + tmat4x4<T> const & m + ) + { + //memcpy could be faster + //memcpy(&this->value, &m.value, 16 * sizeof(valType)); + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; + this->value[3] = m[3]; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat4x4<T>& tmat4x4<T>::operator= + ( + tmat4x4<U> const & m + ) + { + //memcpy could be faster + //memcpy(&this->value, &m.value, 16 * sizeof(valType)); + this->value[0] = m[0]; + this->value[1] = m[1]; + this->value[2] = m[2]; + this->value[3] = m[3]; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat4x4<T>& tmat4x4<T>::operator+= (U s) + { + this->value[0] += s; + this->value[1] += s; + this->value[2] += s; + this->value[3] += s; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat4x4<T>& tmat4x4<T>::operator+= + ( + tmat4x4<U> const & m + ) + { + this->value[0] += m[0]; + this->value[1] += m[1]; + this->value[2] += m[2]; + this->value[3] += m[3]; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat4x4<T> & tmat4x4<T>::operator-= (U s) + { + this->value[0] -= s; + this->value[1] -= s; + this->value[2] -= s; + this->value[3] -= s; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat4x4<T> & tmat4x4<T>::operator-= + ( + tmat4x4<U> const & m + ) + { + this->value[0] -= m[0]; + this->value[1] -= m[1]; + this->value[2] -= m[2]; + this->value[3] -= m[3]; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat4x4<T> & tmat4x4<T>::operator*= (U s) + { + this->value[0] *= s; + this->value[1] *= s; + this->value[2] *= s; + this->value[3] *= s; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat4x4<T> & tmat4x4<T>::operator*= + ( + tmat4x4<U> const & m + ) + { + return (*this = *this * m); + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat4x4<T> & tmat4x4<T>::operator/= (U s) + { + this->value[0] /= s; + this->value[1] /= s; + this->value[2] /= s; + this->value[3] /= s; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tmat4x4<T> & tmat4x4<T>::operator/= + ( + tmat4x4<U> const & m + ) + { + return (*this = *this / m); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x4<T> & tmat4x4<T>::operator++ () + { + ++this->value[0]; + ++this->value[1]; + ++this->value[2]; + ++this->value[3]; + return *this; + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x4<T> & tmat4x4<T>::operator-- () + { + --this->value[0]; + --this->value[1]; + --this->value[2]; + --this->value[3]; + return *this; + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x4<T> tmat4x4<T>::_inverse() const + { + // Calculate all mat2 determinants + value_type SubFactor00 = this->value[2][2] * this->value[3][3] - this->value[3][2] * this->value[2][3]; + value_type SubFactor01 = this->value[2][1] * this->value[3][3] - this->value[3][1] * this->value[2][3]; + value_type SubFactor02 = this->value[2][1] * this->value[3][2] - this->value[3][1] * this->value[2][2]; + value_type SubFactor03 = this->value[2][0] * this->value[3][3] - this->value[3][0] * this->value[2][3]; + value_type SubFactor04 = this->value[2][0] * this->value[3][2] - this->value[3][0] * this->value[2][2]; + value_type SubFactor05 = this->value[2][0] * this->value[3][1] - this->value[3][0] * this->value[2][1]; + value_type SubFactor06 = this->value[1][2] * this->value[3][3] - this->value[3][2] * this->value[1][3]; + value_type SubFactor07 = this->value[1][1] * this->value[3][3] - this->value[3][1] * this->value[1][3]; + value_type SubFactor08 = this->value[1][1] * this->value[3][2] - this->value[3][1] * this->value[1][2]; + value_type SubFactor09 = this->value[1][0] * this->value[3][3] - this->value[3][0] * this->value[1][3]; + value_type SubFactor10 = this->value[1][0] * this->value[3][2] - this->value[3][0] * this->value[1][2]; + value_type SubFactor11 = this->value[1][1] * this->value[3][3] - this->value[3][1] * this->value[1][3]; + value_type SubFactor12 = this->value[1][0] * this->value[3][1] - this->value[3][0] * this->value[1][1]; + value_type SubFactor13 = this->value[1][2] * this->value[2][3] - this->value[2][2] * this->value[1][3]; + value_type SubFactor14 = this->value[1][1] * this->value[2][3] - this->value[2][1] * this->value[1][3]; + value_type SubFactor15 = this->value[1][1] * this->value[2][2] - this->value[2][1] * this->value[1][2]; + value_type SubFactor16 = this->value[1][0] * this->value[2][3] - this->value[2][0] * this->value[1][3]; + value_type SubFactor17 = this->value[1][0] * this->value[2][2] - this->value[2][0] * this->value[1][2]; + value_type SubFactor18 = this->value[1][0] * this->value[2][1] - this->value[2][0] * this->value[1][1]; +/* + tmat4x4<T> Inverse( + + (this->value[1][1] * SubFactor00 - this->value[1][2] * SubFactor01 + this->value[1][3] * SubFactor02), + - (this->value[1][0] * SubFactor00 - this->value[1][2] * SubFactor03 + this->value[1][3] * SubFactor04), + + (this->value[1][0] * SubFactor01 - this->value[1][1] * SubFactor03 + this->value[1][3] * SubFactor05), + - (this->value[1][0] * SubFactor02 - this->value[1][1] * SubFactor04 + this->value[1][2] * SubFactor05), + + - (this->value[0][1] * SubFactor00 - this->value[0][2] * SubFactor01 + this->value[0][3] * SubFactor02), + + (this->value[0][0] * SubFactor00 - this->value[0][2] * SubFactor03 + this->value[0][3] * SubFactor04), + - (this->value[0][0] * SubFactor01 - this->value[0][1] * SubFactor03 + this->value[0][3] * SubFactor05), + + (this->value[0][0] * SubFactor02 - this->value[0][1] * SubFactor04 + this->value[0][2] * SubFactor05), + + + (this->value[0][1] * SubFactor06 - this->value[0][2] * SubFactor07 + this->value[0][3] * SubFactor08), + - (this->value[0][0] * SubFactor06 - this->value[0][2] * SubFactor09 + this->value[0][3] * SubFactor10), + + (this->value[0][0] * SubFactor11 - this->value[0][1] * SubFactor09 + this->value[0][3] * SubFactor12), + - (this->value[0][0] * SubFactor08 - this->value[0][1] * SubFactor10 + this->value[0][2] * SubFactor12), + + - (this->value[0][1] * SubFactor13 - this->value[0][2] * SubFactor14 + this->value[0][3] * SubFactor15), + + (this->value[0][0] * SubFactor13 - this->value[0][2] * SubFactor16 + this->value[0][3] * SubFactor17), + - (this->value[0][0] * SubFactor14 - this->value[0][1] * SubFactor16 + this->value[0][3] * SubFactor18), + + (this->value[0][0] * SubFactor15 - this->value[0][1] * SubFactor17 + this->value[0][2] * SubFactor18)); +*/ + tmat4x4<T> Inverse( + + this->value[1][1] * SubFactor00 - this->value[1][2] * SubFactor01 + this->value[1][3] * SubFactor02, + - this->value[1][0] * SubFactor00 + this->value[1][2] * SubFactor03 - this->value[1][3] * SubFactor04, + + this->value[1][0] * SubFactor01 - this->value[1][1] * SubFactor03 + this->value[1][3] * SubFactor05, + - this->value[1][0] * SubFactor02 + this->value[1][1] * SubFactor04 - this->value[1][2] * SubFactor05, + + - this->value[0][1] * SubFactor00 + this->value[0][2] * SubFactor01 - this->value[0][3] * SubFactor02, + + this->value[0][0] * SubFactor00 - this->value[0][2] * SubFactor03 + this->value[0][3] * SubFactor04, + - this->value[0][0] * SubFactor01 + this->value[0][1] * SubFactor03 - this->value[0][3] * SubFactor05, + + this->value[0][0] * SubFactor02 - this->value[0][1] * SubFactor04 + this->value[0][2] * SubFactor05, + + + this->value[0][1] * SubFactor06 - this->value[0][2] * SubFactor07 + this->value[0][3] * SubFactor08, + - this->value[0][0] * SubFactor06 + this->value[0][2] * SubFactor09 - this->value[0][3] * SubFactor10, + + this->value[0][0] * SubFactor11 - this->value[0][1] * SubFactor09 + this->value[0][3] * SubFactor12, + - this->value[0][0] * SubFactor08 + this->value[0][1] * SubFactor10 - this->value[0][2] * SubFactor12, + + - this->value[0][1] * SubFactor13 + this->value[0][2] * SubFactor14 - this->value[0][3] * SubFactor15, + + this->value[0][0] * SubFactor13 - this->value[0][2] * SubFactor16 + this->value[0][3] * SubFactor17, + - this->value[0][0] * SubFactor14 + this->value[0][1] * SubFactor16 - this->value[0][3] * SubFactor18, + + this->value[0][0] * SubFactor15 - this->value[0][1] * SubFactor17 + this->value[0][2] * SubFactor18); + + value_type Determinant = + + this->value[0][0] * Inverse[0][0] + + this->value[0][1] * Inverse[1][0] + + this->value[0][2] * Inverse[2][0] + + this->value[0][3] * Inverse[3][0]; + + Inverse /= Determinant; + return Inverse; + } + + // Binary operators + template <typename T> + GLM_FUNC_QUALIFIER tmat4x4<T> operator+ + ( + tmat4x4<T> const & m, + typename tmat4x4<T>::value_type const & s + ) + { + return tmat4x4<T>( + m[0] + s, + m[1] + s, + m[2] + s, + m[3] + s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x4<T> operator+ + ( + typename tmat4x4<T>::value_type const & s, + tmat4x4<T> const & m + ) + { + return tmat4x4<T>( + m[0] + s, + m[1] + s, + m[2] + s, + m[3] + s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x4<T> operator+ + ( + tmat4x4<T> const & m1, + tmat4x4<T> const & m2 + ) + { + return tmat4x4<T>( + m1[0] + m2[0], + m1[1] + m2[1], + m1[2] + m2[2], + m1[3] + m2[3]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x4<T> operator- + ( + tmat4x4<T> const & m, + typename tmat4x4<T>::value_type const & s + ) + { + return tmat4x4<T>( + m[0] - s, + m[1] - s, + m[2] - s, + m[3] - s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x4<T> operator- + ( + typename tmat4x4<T>::value_type const & s, + tmat4x4<T> const & m + ) + { + return tmat4x4<T>( + s - m[0], + s - m[1], + s - m[2], + s - m[3]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x4<T> operator- + ( + tmat4x4<T> const & m1, + tmat4x4<T> const & m2 + ) + { + return tmat4x4<T>( + m1[0] - m2[0], + m1[1] - m2[1], + m1[2] - m2[2], + m1[3] - m2[3]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x4<T> operator* + ( + tmat4x4<T> const & m, + typename tmat4x4<T>::value_type const & s + ) + { + return tmat4x4<T>( + m[0] * s, + m[1] * s, + m[2] * s, + m[3] * s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x4<T> operator* + ( + typename tmat4x4<T>::value_type const & s, + tmat4x4<T> const & m + ) + { + return tmat4x4<T>( + m[0] * s, + m[1] * s, + m[2] * s, + m[3] * s); + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat4x4<T>::col_type operator* + ( + tmat4x4<T> const & m, + typename tmat4x4<T>::row_type const & v + ) + { + return typename tmat4x4<T>::col_type( + m[0][0] * v.x + m[1][0] * v.y + m[2][0] * v.z + m[3][0] * v.w, + m[0][1] * v.x + m[1][1] * v.y + m[2][1] * v.z + m[3][1] * v.w, + m[0][2] * v.x + m[1][2] * v.y + m[2][2] * v.z + m[3][2] * v.w, + m[0][3] * v.x + m[1][3] * v.y + m[2][3] * v.z + m[3][3] * v.w); + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat4x4<T>::row_type operator* + ( + typename tmat4x4<T>::col_type const & v, + tmat4x4<T> const & m + ) + { + return typename tmat4x4<T>::row_type( + m[0][0] * v.x + m[0][1] * v.y + m[0][2] * v.z + m[0][3] * v.w, + m[1][0] * v.x + m[1][1] * v.y + m[1][2] * v.z + m[1][3] * v.w, + m[2][0] * v.x + m[2][1] * v.y + m[2][2] * v.z + m[2][3] * v.w, + m[3][0] * v.x + m[3][1] * v.y + m[3][2] * v.z + m[3][3] * v.w); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat2x4<T> operator* + ( + tmat4x4<T> const & m1, + tmat2x4<T> const & m2 + ) + { + return tmat2x4<T>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3], + m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2] + m1[3][2] * m2[0][3], + m1[0][3] * m2[0][0] + m1[1][3] * m2[0][1] + m1[2][3] * m2[0][2] + m1[3][3] * m2[0][3], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3], + m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2] + m1[3][2] * m2[1][3], + m1[0][3] * m2[1][0] + m1[1][3] * m2[1][1] + m1[2][3] * m2[1][2] + m1[3][3] * m2[1][3]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat3x4<T> operator* + ( + tmat4x4<T> const & m1, + tmat3x4<T> const & m2 + ) + { + return tmat3x4<T>( + m1[0][0] * m2[0][0] + m1[1][0] * m2[0][1] + m1[2][0] * m2[0][2] + m1[3][0] * m2[0][3], + m1[0][1] * m2[0][0] + m1[1][1] * m2[0][1] + m1[2][1] * m2[0][2] + m1[3][1] * m2[0][3], + m1[0][2] * m2[0][0] + m1[1][2] * m2[0][1] + m1[2][2] * m2[0][2] + m1[3][2] * m2[0][3], + m1[0][3] * m2[0][0] + m1[1][3] * m2[0][1] + m1[2][3] * m2[0][2] + m1[3][3] * m2[0][3], + m1[0][0] * m2[1][0] + m1[1][0] * m2[1][1] + m1[2][0] * m2[1][2] + m1[3][0] * m2[1][3], + m1[0][1] * m2[1][0] + m1[1][1] * m2[1][1] + m1[2][1] * m2[1][2] + m1[3][1] * m2[1][3], + m1[0][2] * m2[1][0] + m1[1][2] * m2[1][1] + m1[2][2] * m2[1][2] + m1[3][2] * m2[1][3], + m1[0][3] * m2[1][0] + m1[1][3] * m2[1][1] + m1[2][3] * m2[1][2] + m1[3][3] * m2[1][3], + m1[0][0] * m2[2][0] + m1[1][0] * m2[2][1] + m1[2][0] * m2[2][2] + m1[3][0] * m2[2][3], + m1[0][1] * m2[2][0] + m1[1][1] * m2[2][1] + m1[2][1] * m2[2][2] + m1[3][1] * m2[2][3], + m1[0][2] * m2[2][0] + m1[1][2] * m2[2][1] + m1[2][2] * m2[2][2] + m1[3][2] * m2[2][3], + m1[0][3] * m2[2][0] + m1[1][3] * m2[2][1] + m1[2][3] * m2[2][2] + m1[3][3] * m2[2][3]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x4<T> operator* + ( + tmat4x4<T> const & m1, + tmat4x4<T> const & m2 + ) + { + typename tmat4x4<T>::col_type const SrcA0 = m1[0]; + typename tmat4x4<T>::col_type const SrcA1 = m1[1]; + typename tmat4x4<T>::col_type const SrcA2 = m1[2]; + typename tmat4x4<T>::col_type const SrcA3 = m1[3]; + + typename tmat4x4<T>::col_type const SrcB0 = m2[0]; + typename tmat4x4<T>::col_type const SrcB1 = m2[1]; + typename tmat4x4<T>::col_type const SrcB2 = m2[2]; + typename tmat4x4<T>::col_type const SrcB3 = m2[3]; + + tmat4x4<T> Result(tmat4x4<T>::null); + Result[0] = SrcA0 * SrcB0[0] + SrcA1 * SrcB0[1] + SrcA2 * SrcB0[2] + SrcA3 * SrcB0[3]; + Result[1] = SrcA0 * SrcB1[0] + SrcA1 * SrcB1[1] + SrcA2 * SrcB1[2] + SrcA3 * SrcB1[3]; + Result[2] = SrcA0 * SrcB2[0] + SrcA1 * SrcB2[1] + SrcA2 * SrcB2[2] + SrcA3 * SrcB2[3]; + Result[3] = SrcA0 * SrcB3[0] + SrcA1 * SrcB3[1] + SrcA2 * SrcB3[2] + SrcA3 * SrcB3[3]; + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x4<T> operator/ + ( + tmat4x4<T> const & m, + typename tmat4x4<T>::value_type const & s + ) + { + return tmat4x4<T>( + m[0] / s, + m[1] / s, + m[2] / s, + m[3] / s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x4<T> operator/ + ( + typename tmat4x4<T>::value_type const & s, + tmat4x4<T> const & m + ) + { + return tmat4x4<T>( + s / m[0], + s / m[1], + s / m[2], + s / m[3]); + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat4x4<T>::col_type operator/ + ( + tmat4x4<T> const & m, + typename tmat4x4<T>::row_type const & v + ) + { + return m._inverse() * v; + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tmat4x4<T>::row_type operator/ + ( + typename tmat4x4<T>::col_type const & v, + tmat4x4<T> const & m + ) + { + return v * m._inverse(); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x4<T> operator/ + ( + tmat4x4<T> const & m1, + tmat4x4<T> const & m2 + ) + { + return m1 * m2._inverse(); + } + + // Unary constant operators + template <typename T> + GLM_FUNC_QUALIFIER tmat4x4<T> const operator- + ( + tmat4x4<T> const & m + ) + { + return tmat4x4<T>( + -m[0], + -m[1], + -m[2], + -m[3]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x4<T> const operator++ + ( + tmat4x4<T> const & m, + int + ) + { + return tmat4x4<T>( + m[0] + typename tmat4x4<T>::value_type(1), + m[1] + typename tmat4x4<T>::value_type(1), + m[2] + typename tmat4x4<T>::value_type(1), + m[3] + typename tmat4x4<T>::value_type(1)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tmat4x4<T> const operator-- + ( + tmat4x4<T> const & m, + int + ) + { + return tmat4x4<T>( + m[0] - typename tmat4x4<T>::value_type(1), + m[1] - typename tmat4x4<T>::value_type(1), + m[2] - typename tmat4x4<T>::value_type(1), + m[3] - typename tmat4x4<T>::value_type(1)); + } + + ////////////////////////////////////// + // Boolean operators + + template <typename T> + GLM_FUNC_QUALIFIER bool operator== + ( + tmat4x4<T> const & m1, + tmat4x4<T> const & m2 + ) + { + return (m1[0] == m2[0]) && (m1[1] == m2[1]) && (m1[2] == m2[2]) && (m1[3] == m2[3]); + } + + template <typename T> + GLM_FUNC_QUALIFIER bool operator!= + ( + tmat4x4<T> const & m1, + tmat4x4<T> const & m2 + ) + { + return (m1[0] != m2[0]) || (m1[1] != m2[1]) || (m1[2] != m2[2]) || (m1[3] != m2[3]); + } + +} //namespace detail +} //namespace glm diff --git a/include/gal/opengl/glm/core/type_size.hpp b/include/gal/opengl/glm/core/type_size.hpp new file mode 100644 index 0000000..b7a7c31 --- /dev/null +++ b/include/gal/opengl/glm/core/type_size.hpp @@ -0,0 +1,43 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/type_size.hpp +/// @date 2008-10-05 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_type_size +#define glm_core_type_size + +#include <cstdlib> + +namespace glm{ +namespace detail +{ + //typedef std::size_t size_t; + typedef int sizeType; + +}//namespace detail +}//namespace glm + +#endif//glm_core_type_size diff --git a/include/gal/opengl/glm/core/type_vec.hpp b/include/gal/opengl/glm/core/type_vec.hpp new file mode 100644 index 0000000..60e2b70 --- /dev/null +++ b/include/gal/opengl/glm/core/type_vec.hpp @@ -0,0 +1,41 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/type_vec.hpp +/// @date 2010-01-26 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_type_vec +#define glm_core_type_vec + +#include "type_gentype.hpp" + +namespace glm{ +namespace detail +{ + +}//namespace detail +}//namespace glm + +#endif//glm_core_type_vec diff --git a/include/gal/opengl/glm/core/type_vec.inl b/include/gal/opengl/glm/core/type_vec.inl new file mode 100644 index 0000000..ef3f8f4 --- /dev/null +++ b/include/gal/opengl/glm/core/type_vec.inl @@ -0,0 +1,27 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/type_vec.inl +/// @date 2011-06-15 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// diff --git a/include/gal/opengl/glm/core/type_vec1.hpp b/include/gal/opengl/glm/core/type_vec1.hpp new file mode 100644 index 0000000..395cc78 --- /dev/null +++ b/include/gal/opengl/glm/core/type_vec1.hpp @@ -0,0 +1,212 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/type_vec1.hpp +/// @date 2008-08-25 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_type_gentype1 +#define glm_core_type_gentype1 + +#include "type_vec.hpp" +#include "type_float.hpp" +#include "type_int.hpp" +#include "type_size.hpp" +#include "_swizzle.hpp" + +namespace glm{ +namespace detail +{ + template <typename T> struct tref1; + template <typename T> struct tref2; + template <typename T> struct tref3; + template <typename T> struct tref4; + template <typename T> struct tvec1; + template <typename T> struct tvec2; + template <typename T> struct tvec3; + template <typename T> struct tvec4; + + template <typename T> + struct tvec1 + { + enum ctor{null}; + + typedef T value_type; + typedef std::size_t size_type; + typedef tvec1<T> type; + typedef tvec1<bool> bool_type; + + GLM_FUNC_DECL GLM_CONSTEXPR size_type length() const; + + ////////////////////////////////////// + // Data + +# if(GLM_COMPONENT == GLM_COMPONENT_ONLY_XYZW) + value_type x; +# else//(GLM_COMPONENT == GLM_COMPONENT_GLSL_NAMES) + union {value_type x, r, s;}; +# endif//GLM_COMPONENT + + ////////////////////////////////////// + // Accesses + + GLM_FUNC_DECL value_type & operator[](size_type i); + GLM_FUNC_DECL value_type const & operator[](size_type i) const; + + ////////////////////////////////////// + // Implicit basic constructors + + GLM_FUNC_DECL tvec1(); + GLM_FUNC_DECL tvec1(tvec1<T> const & v); + + ////////////////////////////////////// + // Explicit basic constructors + + GLM_FUNC_DECL explicit tvec1( + ctor); + GLM_FUNC_DECL explicit tvec1( + value_type const & s); + + ////////////////////////////////////// + // Swizzle constructors + + GLM_FUNC_DECL tvec1(tref1<T> const & r); + + ////////////////////////////////////// + // Convertion scalar constructors + + //! Explicit converions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename U> + GLM_FUNC_DECL explicit tvec1(U const & s); + + ////////////////////////////////////// + // Convertion vector constructors + + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename U> + GLM_FUNC_DECL explicit tvec1(tvec2<U> const & v); + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename U> + GLM_FUNC_DECL explicit tvec1(tvec3<U> const & v); + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename U> + GLM_FUNC_DECL explicit tvec1(tvec4<U> const & v); + + ////////////////////////////////////// + // Unary arithmetic operators + + GLM_FUNC_DECL tvec1<T> & operator= (tvec1<T> const & v); + template <typename U> + GLM_FUNC_DECL tvec1<T> & operator= (tvec1<U> const & v); + + template <typename U> + GLM_FUNC_DECL tvec1<T> & operator+=(U const & s); + template <typename U> + GLM_FUNC_DECL tvec1<T> & operator+=(tvec1<U> const & v); + template <typename U> + GLM_FUNC_DECL tvec1<T> & operator-=(U const & s); + template <typename U> + GLM_FUNC_DECL tvec1<T> & operator-=(tvec1<U> const & v); + template <typename U> + GLM_FUNC_DECL tvec1<T> & operator*=(U const & s); + template <typename U> + GLM_FUNC_DECL tvec1<T> & operator*=(tvec1<U> const & v); + template <typename U> + GLM_FUNC_DECL tvec1<T> & operator/=(U const & s); + template <typename U> + GLM_FUNC_DECL tvec1<T> & operator/=(tvec1<U> const & v); + GLM_FUNC_DECL tvec1<T> & operator++(); + GLM_FUNC_DECL tvec1<T> & operator--(); + + ////////////////////////////////////// + // Unary bit operators + + template <typename U> + GLM_FUNC_DECL tvec1<T> & operator%=(U const & s); + template <typename U> + GLM_FUNC_DECL tvec1<T> & operator%=(tvec1<U> const & v); + template <typename U> + GLM_FUNC_DECL tvec1<T> & operator&=(U const & s); + template <typename U> + GLM_FUNC_DECL tvec1<T> & operator&=(tvec1<U> const & v); + template <typename U> + GLM_FUNC_DECL tvec1<T> & operator|=(U const & s); + template <typename U> + GLM_FUNC_DECL tvec1<T> & operator|=(tvec1<U> const & v); + template <typename U> + GLM_FUNC_DECL tvec1<T> & operator^=(U const & s); + template <typename U> + GLM_FUNC_DECL tvec1<T> & operator^=(tvec1<U> const & v); + template <typename U> + GLM_FUNC_DECL tvec1<T> & operator<<=(U const & s); + template <typename U> + GLM_FUNC_DECL tvec1<T> & operator<<=(tvec1<U> const & v); + template <typename U> + GLM_FUNC_DECL tvec1<T> & operator>>=(U const & s); + template <typename U> + GLM_FUNC_DECL tvec1<T> & operator>>=(tvec1<U> const & v); + + ////////////////////////////////////// + // Swizzle operators + + GLM_FUNC_DECL value_type swizzle(comp X) const; + GLM_FUNC_DECL tvec2<T> swizzle(comp X, comp Y) const; + GLM_FUNC_DECL tvec3<T> swizzle(comp X, comp Y, comp Z) const; + GLM_FUNC_DECL tvec4<T> swizzle(comp X, comp Y, comp Z, comp W) const; + GLM_FUNC_DECL tref1<T> swizzle(comp X); + }; + + template <typename T> + struct tref1 + { + GLM_FUNC_DECL tref1(T & x); + GLM_FUNC_DECL tref1(tref1<T> const & r); + GLM_FUNC_DECL tref1(tvec1<T> const & v); + + GLM_FUNC_DECL tref1<T> & operator= (tref1<T> const & r); + GLM_FUNC_DECL tref1<T> & operator= (tvec1<T> const & v); + + T& x; + }; + + GLM_DETAIL_IS_VECTOR(tvec1); + + typedef detail::tvec1<highp_float> highp_vec1_t; + typedef detail::tvec1<mediump_float> mediump_vec1_t; + typedef detail::tvec1<lowp_float> lowp_vec1_t; + typedef detail::tvec1<highp_int> highp_ivec1_t; + typedef detail::tvec1<mediump_int> mediump_ivec1_t; + typedef detail::tvec1<lowp_int> lowp_ivec1_t; + typedef detail::tvec1<highp_uint> highp_uvec1_t; + typedef detail::tvec1<mediump_uint> mediump_uvec1_t; + typedef detail::tvec1<lowp_uint> lowp_uvec1_t; + +}//namespace detail +}//namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_vec1.inl" +#endif//GLM_EXTERNAL_TEMPLATE + +#endif//glm_core_type_gentype1 diff --git a/include/gal/opengl/glm/core/type_vec1.inl b/include/gal/opengl/glm/core/type_vec1.inl new file mode 100644 index 0000000..6b12e03 --- /dev/null +++ b/include/gal/opengl/glm/core/type_vec1.inl @@ -0,0 +1,928 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/type_vec1.inl +/// @date 2008-08-25 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +namespace glm{ +namespace detail +{ + template <typename T> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename tvec1<T>::size_type tvec1<T>::length() const + { + return 1; + } + + ////////////////////////////////////// + // Accesses + + template <typename T> + GLM_FUNC_QUALIFIER typename tvec1<T>::value_type & tvec1<T>::operator[] + ( + size_type i + ) + { + assert(i < this->length()); + return (&x)[i]; + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tvec1<T>::value_type const & tvec1<T>::operator[] + ( + size_type i + ) const + { + assert(i < this->length()); + return (&x)[i]; + } + + ////////////////////////////////////// + // Implicit basic constructors + + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T>::tvec1() : + x(value_type(0)) + {} + + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T>::tvec1 + ( + ctor + ) + {} + + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T>::tvec1 + ( + tvec1<T> const & v + ) : + x(v.x) + {} + + ////////////////////////////////////// + // Explicit basic constructors + + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T>::tvec1 + ( + value_type const & s + ) : + x(s) + {} + + ////////////////////////////////////// + // Swizzle constructors + + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T>::tvec1 + ( + tref1<T> const & r + ) : + x(r.x) + {} + + ////////////////////////////////////// + // Convertion scalar constructors + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec1<T>::tvec1 + ( + U const & s + ) : + x(value_type(s)) + {} + + ////////////////////////////////////// + // Convertion vector constructors + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec1<T>::tvec1 + ( + tvec2<U> const & v + ) : + x(value_type(v.x)) + {} + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec1<T>::tvec1 + ( + tvec3<U> const & v + ) : + x(value_type(v.x)) + {} + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec1<T>::tvec1 + ( + tvec4<U> const & v + ) : + x(value_type(v.x)) + {} + + ////////////////////////////////////// + // Unary arithmetic operators + + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator= + ( + tvec1<T> const & v + ) + { + this->x = v.x; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator= + ( + tvec1<U> const & v + ) + { + this->x = T(v.x); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator+= + ( + U const & s + ) + { + this->x += T(s); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator+= + ( + tvec1<U> const & v + ) + { + this->x += T(v.x); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator-= + ( + U const & s + ) + { + this->x -= T(s); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator-= + ( + tvec1<U> const & v + ) + { + this->x -= T(v.x); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator*= + ( + U const & s + ) + { + this->x *= T(s); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator*= + ( + tvec1<U> const & v + ) + { + this->x *= T(v.x); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator/= + ( + U const & s + ) + { + this->x /= T(s); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator/= + ( + tvec1<U> const & v + ) + { + this->x /= T(v.x); + return *this; + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator++() + { + ++this->x; + return *this; + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator--() + { + --this->x; + return *this; + } + + ////////////////////////////////////// + // Boolean operators + + template <typename T> + GLM_FUNC_QUALIFIER bool operator== + ( + tvec1<T> const & v1, + tvec1<T> const & v2 + ) + { + return (v1.x == v2.x); + } + + template <typename T> + GLM_FUNC_QUALIFIER bool operator!= + ( + tvec1<T> const & v1, + tvec1<T> const & v2 + ) + { + return (v1.x != v2.x); + } + + ////////////////////////////////////// + // Unary bit operators + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator%= + ( + U const & s + ) + { + this->x %= T(s); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator%= + ( + tvec1<U> const & v + ) + { + this->x %= T(v.x); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator&= + ( + U const & s + ) + { + this->x &= T(s); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator&= + ( + tvec1<U> const & v + ) + { + this->x &= T(v.x); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator|= + ( + U const & s + ) + { + this->x |= T(s); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator|= + ( + tvec1<U> const & v + ) + { + this->x |= U(v.x); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator^= + ( + U const & s + ) + { + this->x ^= T(s); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator^= + ( + tvec1<U> const & v + ) + { + this->x ^= T(v.x); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator<<= + ( + U const & s + ) + { + this->x <<= T(s); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator<<= + ( + tvec1<U> const & v + ) + { + this->x <<= T(v.x); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator>>= + ( + U const & s + ) + { + this->x >>= T(s); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec1<T> & tvec1<T>::operator>>= + ( + tvec1<U> const & v + ) + { + this->x >>= T(v.x); + return *this; + } + + ////////////////////////////////////// + // Swizzle operators + + template <typename T> + GLM_FUNC_QUALIFIER T + tvec1<T>::swizzle(comp x) const + { + return (*this)[x]; + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> + tvec1<T>::swizzle + ( + comp x, + comp y + ) const + { + return tvec2<T>( + (*this)[x], + (*this)[y]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> + tvec1<T>::swizzle + ( + comp x, + comp y, + comp z + ) const + { + return tvec3<T>( + (*this)[x], + (*this)[y], + (*this)[z]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> + tvec1<T>::swizzle + ( + comp x, + comp y, + comp z, + comp w + ) const + { + return tvec4<T>( + (*this)[x], + (*this)[y], + (*this)[z], + (*this)[w]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tref1<T> + tvec1<T>::swizzle + ( + comp x + ) + { + return tref1<T>( + (*this)[x]); + } + + ////////////////////////////////////// + // Binary arithmetic operators + + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T> operator+ + ( + tvec1<T> const & v, + typename tvec1<T>::value_type const & s + ) + { + return tvec1<T>( + v.x + s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T> operator+ + ( + typename tvec1<T>::value_type const & s, + tvec1<T> const & v + ) + { + return tvec1<T>( + s + v.x); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T> operator+ + ( + tvec1<T> const & v1, + tvec1<T> const & v2 + ) + { + return tvec1<T>( + v1.x + v2.x); + } + + //operator- + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T> operator- + ( + tvec1<T> const & v, + typename tvec1<T>::value_type const & s + ) + { + return tvec1<T>( + v.x - s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T> operator- + ( + typename tvec1<T>::value_type const & s, + tvec1<T> const & v + ) + { + return tvec1<T>( + s - v.x); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T> operator- + ( + tvec1<T> const & v1, + tvec1<T> const & v2 + ) + { + return tvec1<T>( + v1.x - v2.x); + } + + //operator* + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T> operator* + ( + tvec1<T> const & v, + typename tvec1<T>::value_type const & s + ) + { + return tvec1<T>( + v.x * s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T> operator* + ( + typename tvec1<T>::value_type const & s, + tvec1<T> const & v + ) + { + return tvec1<T>( + s * v.x); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T> operator* + ( + tvec1<T> const & v1, + tvec1<T> const & v2 + ) + { + return tvec1<T>( + v1.x * v2.x); + } + + //operator/ + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T> operator/ + ( + tvec1<T> const & v, + typename tvec1<T>::value_type const & s + ) + { + return tvec1<T>( + v.x / s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T> operator/ + ( + typename tvec1<T>::value_type const & s, + tvec1<T> const & v + ) + { + return tvec1<T>( + s / v.x); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T> operator/ + ( + tvec1<T> const & v1, + tvec1<T> const & v2 + ) + { + return tvec1<T>( + v1.x / v2.x); + } + + // Unary constant operators + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T> operator- + ( + tvec1<T> const & v + ) + { + return tvec1<T>( + -v.x); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T> operator++ + ( + tvec1<T> const & v, + int + ) + { + return tvec1<T>( + v.x + T(1)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T> operator-- + ( + tvec1<T> const & v, + int + ) + { + return tvec1<T>( + v.x - T(1)); + } + + ////////////////////////////////////// + // Binary bit operators + + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T> operator% + ( + tvec1<T> const & v, + typename tvec1<T>::value_type const & s + ) + { + return tvec1<T>( + v.x % s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T> operator% + ( + typename tvec1<T>::value_type const & s, + tvec1<T> const & v + ) + { + return tvec1<T>( + s % v.x); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T> operator% + ( + tvec1<T> const & v1, + tvec1<T> const & v2 + ) + { + return tvec1<T>( + v1.x % v2.x); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T> operator& + ( + tvec1<T> const & v, + typename tvec1<T>::value_type const & s + ) + { + return tvec1<T>( + v.x & s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T> operator& + ( + typename tvec1<T>::value_type const & s, + tvec1<T> const & v + ) + { + return tvec1<T>( + s & v.x); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T> operator& + ( + tvec1<T> const & v1, + tvec1<T> const & v2 + ) + { + return tvec1<T>( + v1.x & v2.x); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T> operator| + ( + tvec1<T> const & v, + typename tvec1<T>::value_type const & s + ) + { + return tvec1<T>( + v.x | s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T> operator| + ( + typename tvec1<T>::value_type const & s, + tvec1<T> const & v + ) + { + return tvec1<T>( + s | v.x); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T> operator| + ( + tvec1<T> const & v1, + tvec1<T> const & v2 + ) + { + return tvec1<T>( + v1.x | v2.x); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T> operator^ + ( + tvec1<T> const & v, + typename tvec1<T>::value_type const & s + ) + { + return tvec1<T>( + v.x ^ s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T> operator^ + ( + typename tvec1<T>::value_type const & s, + tvec1<T> const & v + ) + { + return tvec1<T>( + s ^ v.x); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T> operator^ + ( + tvec1<T> const & v1, + tvec1<T> const & v2 + ) + { + return tvec1<T>( + v1.x ^ v2.x); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T> operator<< + ( + tvec1<T> const & v, + typename tvec1<T>::value_type const & s + ) + { + return tvec1<T>( + v.x << s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T> operator<< + ( + typename tvec1<T>::value_type const & s, + tvec1<T> const & v + ) + { + return tvec1<T>( + s << v.x); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T> operator<< + ( + tvec1<T> const & v1, + tvec1<T> const & v2 + ) + { + return tvec1<T>( + v1.x << v2.x); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T> operator>> + ( + tvec1<T> const & v, + typename tvec1<T>::value_type const & s + ) + { + return tvec1<T>( + v.x >> s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T> operator>> + ( + typename tvec1<T>::value_type const & s, + tvec1<T> const & v + ) + { + return tvec1<T>( + s >> v.x); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T> operator>> + ( + tvec1<T> const & v1, + tvec1<T> const & v2 + ) + { + return tvec1<T>( + v1.x >> v2.x); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec1<T> operator~ + ( + tvec1<T> const & v + ) + { + return tvec1<T>( + ~v.x); + } + + ////////////////////////////////////// + // tref definition + + template <typename T> + GLM_FUNC_QUALIFIER tref1<T>::tref1 + ( + T & x + ) : + x(x) + {} + + template <typename T> + GLM_FUNC_QUALIFIER tref1<T>::tref1 + ( + tref1<T> const & r + ) : + x(r.x) + {} + + template <typename T> + GLM_FUNC_QUALIFIER tref1<T>::tref1 + ( + tvec1<T> const & v + ) : + x(v.x) + {} + + template <typename T> + GLM_FUNC_QUALIFIER tref1<T> & tref1<T>::operator= + ( + tref1<T> const & r + ) + { + x = r.x; + return *this; + } + + template <typename T> + GLM_FUNC_QUALIFIER tref1<T> & tref1<T>::operator= + ( + tvec1<T> const & v + ) + { + x = v.x; + return *this; + } + +}//namespace detail +}//namespace glm diff --git a/include/gal/opengl/glm/core/type_vec2.hpp b/include/gal/opengl/glm/core/type_vec2.hpp new file mode 100644 index 0000000..a858198 --- /dev/null +++ b/include/gal/opengl/glm/core/type_vec2.hpp @@ -0,0 +1,317 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/type_vec2.hpp +/// @date 2008-08-18 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_type_gentype2 +#define glm_core_type_gentype2 + +#include "type_vec.hpp" +#include "type_float.hpp" +#include "type_int.hpp" +#include "type_size.hpp" +#include "_swizzle.hpp" + +namespace glm{ +namespace detail +{ + template <typename T> struct tref2; + template <typename T> struct tref3; + template <typename T> struct tref4; + template <typename T> struct tvec3; + template <typename T> struct tvec4; + + template <typename T> + struct tvec2 + { + enum ctor{null}; + + typedef T value_type; + typedef std::size_t size_type; + typedef tvec2<T> type; + typedef tvec2<bool> bool_type; + + GLM_FUNC_DECL GLM_CONSTEXPR size_type length() const; + + ////////////////////////////////////// + // Data + +# if(GLM_COMPONENT == GLM_COMPONENT_CXX11) + union + { + struct{value_type x, y;}; + struct{value_type r, g;}; + struct{value_type s, t;}; + +# if(defined(GLM_SWIZZLE)) + _GLM_SWIZZLE2_2_MEMBERS(value_type, glm::detail::tvec2<value_type>, x, y) + _GLM_SWIZZLE2_2_MEMBERS(value_type, glm::detail::tvec2<value_type>, r, g) + _GLM_SWIZZLE2_2_MEMBERS(value_type, glm::detail::tvec2<value_type>, s, t) + _GLM_SWIZZLE2_3_MEMBERS(value_type, glm::detail::tvec3<value_type>, x, y) + _GLM_SWIZZLE2_3_MEMBERS(value_type, glm::detail::tvec3<value_type>, r, g) + _GLM_SWIZZLE2_3_MEMBERS(value_type, glm::detail::tvec3<value_type>, s, t) + _GLM_SWIZZLE2_4_MEMBERS(value_type, glm::detail::tvec4<value_type>, x, y) + _GLM_SWIZZLE2_4_MEMBERS(value_type, glm::detail::tvec4<value_type>, r, g) + _GLM_SWIZZLE2_4_MEMBERS(value_type, glm::detail::tvec4<value_type>, s, t) +# endif//(defined(GLM_SWIZZLE)) + }; +# elif(GLM_COMPONENT == GLM_COMPONENT_CXX98) + union {value_type x, r, s;}; + union {value_type y, g, t;}; + +# if(defined(GLM_SWIZZLE)) + // Defines all he swizzle operator as functions + GLM_SWIZZLE_GEN_REF_FROM_VEC2(value_type, detail::tvec2, detail::tref2) + GLM_SWIZZLE_GEN_VEC_FROM_VEC2(value_type, detail::tvec2, detail::tvec2, detail::tvec3, detail::tvec4) +# endif//(defined(GLM_SWIZZLE)) +# else //(GLM_COMPONENT == GLM_COMPONENT_ONLY_XYZW) + value_type x, y; + +# if(defined(GLM_SWIZZLE)) + // Defines all he swizzle operator as functions + GLM_SWIZZLE_GEN_REF2_FROM_VEC2_SWIZZLE(value_type, detail::tvec2, detail::tref2, x, y) + GLM_SWIZZLE_GEN_VEC_FROM_VEC2_COMP(value_type, detail::tvec2, detail::tvec2, detail::tvec3, detail::tvec4, x, y) +# endif//(defined(GLM_SWIZZLE)) +# endif//GLM_COMPONENT + + ////////////////////////////////////// + // Accesses + + GLM_FUNC_DECL value_type & operator[](size_type i); + GLM_FUNC_DECL value_type const & operator[](size_type i) const; + + ////////////////////////////////////// + // Implicit basic constructors + + GLM_FUNC_DECL tvec2(); + GLM_FUNC_DECL tvec2(tvec2<T> const & v); + + ////////////////////////////////////// + // Explicit basic constructors + + GLM_FUNC_DECL explicit tvec2( + ctor); + GLM_FUNC_DECL explicit tvec2( + value_type const & s); + GLM_FUNC_DECL explicit tvec2( + value_type const & s1, + value_type const & s2); + + ////////////////////////////////////// + // Swizzle constructors + + GLM_FUNC_DECL tvec2(tref2<T> const & r); + + template <int E0, int E1> + GLM_FUNC_DECL tvec2(const glm::detail::swizzle<2,T,tvec2<T>,E0,E1,-1,-2>& that) + { + *this = that(); + } + + ////////////////////////////////////// + // Convertion constructors + + //! Explicit converions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename U> + GLM_FUNC_DECL explicit tvec2( + U const & x); + //! Explicit converions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename U, typename V> + GLM_FUNC_DECL explicit tvec2( + U const & x, + V const & y); + + ////////////////////////////////////// + // Convertion vector constructors + + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename U> + GLM_FUNC_DECL explicit tvec2(tvec2<U> const & v); + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename U> + GLM_FUNC_DECL explicit tvec2(tvec3<U> const & v); + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename U> + GLM_FUNC_DECL explicit tvec2(tvec4<U> const & v); + + ////////////////////////////////////// + // Unary arithmetic operators + + GLM_FUNC_DECL tvec2<T> & operator= (tvec2<T> const & v); + template <typename U> + GLM_FUNC_DECL tvec2<T> & operator= (tvec2<U> const & v); + + template <typename U> + GLM_FUNC_DECL tvec2<T> & operator+=(U s); + template <typename U> + GLM_FUNC_DECL tvec2<T> & operator+=(tvec2<U> const & v); + template <typename U> + GLM_FUNC_DECL tvec2<T> & operator-=(U s); + template <typename U> + GLM_FUNC_DECL tvec2<T> & operator-=(tvec2<U> const & v); + template <typename U> + GLM_FUNC_DECL tvec2<T> & operator*=(U s); + template <typename U> + GLM_FUNC_DECL tvec2<T> & operator*=(tvec2<U> const & v); + template <typename U> + GLM_FUNC_DECL tvec2<T> & operator/=(U s); + template <typename U> + GLM_FUNC_DECL tvec2<T> & operator/=(tvec2<U> const & v); + GLM_FUNC_DECL tvec2<T> & operator++(); + GLM_FUNC_DECL tvec2<T> & operator--(); + + ////////////////////////////////////// + // Unary bit operators + + template <typename U> + GLM_FUNC_DECL tvec2<T> & operator%= (U s); + template <typename U> + GLM_FUNC_DECL tvec2<T> & operator%= (tvec2<U> const & v); + template <typename U> + GLM_FUNC_DECL tvec2<T> & operator&= (U s); + template <typename U> + GLM_FUNC_DECL tvec2<T> & operator&= (tvec2<U> const & v); + template <typename U> + GLM_FUNC_DECL tvec2<T> & operator|= (U s); + template <typename U> + GLM_FUNC_DECL tvec2<T> & operator|= (tvec2<U> const & v); + template <typename U> + GLM_FUNC_DECL tvec2<T> & operator^= (U s); + template <typename U> + GLM_FUNC_DECL tvec2<T> & operator^= (tvec2<U> const & v); + template <typename U> + GLM_FUNC_DECL tvec2<T> & operator<<=(U s); + template <typename U> + GLM_FUNC_DECL tvec2<T> & operator<<=(tvec2<U> const & v); + template <typename U> + GLM_FUNC_DECL tvec2<T> & operator>>=(U s); + template <typename U> + GLM_FUNC_DECL tvec2<T> & operator>>=(tvec2<U> const & v); + + ////////////////////////////////////// + // Swizzle operators + + GLM_FUNC_DECL value_type swizzle(comp X) const; + GLM_FUNC_DECL tvec2<T> swizzle(comp X, comp Y) const; + GLM_FUNC_DECL tvec3<T> swizzle(comp X, comp Y, comp Z) const; + GLM_FUNC_DECL tvec4<T> swizzle(comp X, comp Y, comp Z, comp W) const; + GLM_FUNC_DECL tref2<T> swizzle(comp X, comp Y); + }; + + template <typename T> + struct tref2 + { + GLM_FUNC_DECL tref2(T & x, T & y); + GLM_FUNC_DECL tref2(tref2<T> const & r); + GLM_FUNC_DECL explicit tref2(tvec2<T> const & v); + + GLM_FUNC_DECL tref2<T> & operator= (tref2<T> const & r); + GLM_FUNC_DECL tref2<T> & operator= (tvec2<T> const & v); + + GLM_FUNC_DECL tvec2<T> operator() (); + + T & x; + T & y; + }; + + GLM_DETAIL_IS_VECTOR(tvec2); + +} //namespace detail + + /// @addtogroup core_precision + /// @{ + + /// 2 components vector of high precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tvec2<highp_float> highp_vec2; + + /// 2 components vector of medium precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tvec2<mediump_float> mediump_vec2; + + /// 2 components vector of low precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tvec2<lowp_float> lowp_vec2; + + /// 2 components vector of high precision signed integer numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tvec2<highp_int> highp_ivec2; + + /// 2 components vector of medium precision signed integer numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tvec2<mediump_int> mediump_ivec2; + + /// 2 components vector of low precision signed integer numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tvec2<lowp_int> lowp_ivec2; + + /// 2 components vector of high precision unsigned integer numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tvec2<highp_uint> highp_uvec2; + + /// 2 components vector of medium precision unsigned integer numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tvec2<mediump_uint> mediump_uvec2; + + /// 2 components vector of low precision unsigned integer numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tvec2<lowp_uint> lowp_uvec2; + + /// @} +}//namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_vec2.inl" +#endif//GLM_EXTERNAL_TEMPLATE + +#endif//glm_core_type_gentype2 diff --git a/include/gal/opengl/glm/core/type_vec2.inl b/include/gal/opengl/glm/core/type_vec2.inl new file mode 100644 index 0000000..32e4f9f --- /dev/null +++ b/include/gal/opengl/glm/core/type_vec2.inl @@ -0,0 +1,998 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/type_tvec2.inl +/// @date 2008-08-18 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +namespace glm{ +namespace detail +{ + template <typename T> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename tvec2<T>::size_type tvec2<T>::length() const + { + return 2; + } + + ////////////////////////////////////// + // Accesses + + template <typename T> + GLM_FUNC_QUALIFIER typename tvec2<T>::value_type & + tvec2<T>::operator[] + ( + size_type i + ) + { + assert(i < this->length()); + return (&x)[i]; + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tvec2<T>::value_type const & + tvec2<T>::operator[] + ( + size_type i + ) const + { + assert(i < this->length()); + return (&x)[i]; + } + + ////////////////////////////////////// + // Implicit basic constructors + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T>::tvec2() : + x(value_type(0)), + y(value_type(0)) + {} + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T>::tvec2 + ( + ctor + ) + {} + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T>::tvec2 + ( + tvec2<T> const & v + ) : + x(v.x), + y(v.y) + {} + + ////////////////////////////////////// + // Explicit basic constructors + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T>::tvec2 + ( + value_type const & s + ) : + x(s), + y(s) + {} + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T>::tvec2 + ( + value_type const & s1, + value_type const & s2 + ) : + x(s1), + y(s2) + {} + + ////////////////////////////////////// + // Swizzle constructors + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T>::tvec2 + ( + tref2<T> const & r + ) : + x(r.x), + y(r.y) + {} + + ////////////////////////////////////// + // Convertion scalar constructors + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec2<T>::tvec2 + ( + U const & x + ) : + x(value_type(x)), + y(value_type(x)) + {} + + template <typename T> + template <typename U, typename V> + GLM_FUNC_QUALIFIER tvec2<T>::tvec2 + ( + U const & a, + V const & b + ) : + x(value_type(a)), + y(value_type(b)) + {} + + ////////////////////////////////////// + // Convertion vector constructors + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec2<T>::tvec2 + ( + tvec2<U> const & v + ) : + x(value_type(v.x)), + y(value_type(v.y)) + {} + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec2<T>::tvec2 + ( + tvec3<U> const & v + ) : + x(value_type(v.x)), + y(value_type(v.y)) + {} + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec2<T>::tvec2 + ( + tvec4<U> const & v + ) : + x(value_type(v.x)), + y(value_type(v.y)) + {} + + ////////////////////////////////////// + // Unary arithmetic operators + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator= + ( + tvec2<T> const & v + ) + { + this->x = v.x; + this->y = v.y; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator= + ( + tvec2<U> const & v + ) + { + this->x = T(v.x); + this->y = T(v.y); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator+=(U s) + { + this->x += T(s); + this->y += T(s); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator+= + ( + tvec2<U> const & v + ) + { + this->x += T(v.x); + this->y += T(v.y); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator-=(U s) + { + this->x -= T(s); + this->y -= T(s); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator-= + ( + tvec2<U> const & v + ) + { + this->x -= T(v.x); + this->y -= T(v.y); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator*=(U s) + { + this->x *= T(s); + this->y *= T(s); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator*= + ( + tvec2<U> const & v + ) + { + this->x *= T(v.x); + this->y *= T(v.y); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator/=(U s) + { + this->x /= T(s); + this->y /= T(s); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator/= + ( + tvec2<U> const & v + ) + { + this->x /= T(v.x); + this->y /= T(v.y); + return *this; + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator++() + { + ++this->x; + ++this->y; + return *this; + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator--() + { + --this->x; + --this->y; + return *this; + } + + ////////////////////////////////////// + // Boolean operators + + template <typename T> + GLM_FUNC_QUALIFIER bool operator== + ( + tvec2<T> const & v1, + tvec2<T> const & v2 + ) + { + return (v1.x == v2.x) && (v1.y == v2.y); + } + + template <typename T> + GLM_FUNC_QUALIFIER bool operator!= + ( + tvec2<T> const & v1, + tvec2<T> const & v2 + ) + { + return (v1.x != v2.x) || (v1.y != v2.y); + } + + ////////////////////////////////////// + // Unary bit operators + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator%=(U s) + { + this->x %= T(s); + this->y %= T(s); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator%= + ( + tvec2<U> const & v + ) + { + this->x %= T(v.x); + this->y %= T(v.y); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator&=(U s) + { + this->x &= T(s); + this->y &= T(s); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator&= + ( + tvec2<U> const & v + ) + { + this->x &= T(v.x); + this->y &= T(v.y); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator|=(U s) + { + this->x |= T(s); + this->y |= T(s); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator|= + ( + tvec2<U> const & v + ) + { + this->x |= T(v.x); + this->y |= T(v.y); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator^=(U s) + { + this->x ^= T(s); + this->y ^= T(s); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator^= + ( + tvec2<U> const & v + ) + { + this->x ^= T(v.x); + this->y ^= T(v.y); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator<<=(U s) + { + this->x <<= T(s); + this->y <<= T(s); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator<<= + ( + tvec2<U> const & v + ) + { + this->x <<= T(v.x); + this->y <<= T(v.y); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator>>=(U s) + { + this->x >>= T(s); + this->y >>= T(s); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec2<T> & tvec2<T>::operator>>= + ( + tvec2<U> const & v + ) + { + this->x >>= T(v.x); + this->y >>= T(v.y); + return *this; + } + + ////////////////////////////////////// + // Swizzle operators + + template <typename T> + GLM_FUNC_QUALIFIER typename tvec2<T>::value_type tvec2<T>::swizzle + ( + comp x + ) const + { + return (*this)[x]; + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> tvec2<T>::swizzle + ( + comp x, + comp y + ) const + { + return tvec2<T>( + (*this)[x], + (*this)[y]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> tvec2<T>::swizzle + ( + comp x, + comp y, + comp z + ) const + { + return tvec3<T>( + (*this)[x], + (*this)[y], + (*this)[z]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> tvec2<T>::swizzle + ( + comp x, + comp y, + comp z, + comp w + ) const + { + return tvec4<T>( + (*this)[x], + (*this)[y], + (*this)[z], + (*this)[w]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tref2<T> tvec2<T>::swizzle + ( + comp x, + comp y + ) + { + return tref2<T>( + (*this)[x], + (*this)[y]); + } + + ////////////////////////////////////// + // Binary arithmetic operators + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> operator+ + ( + tvec2<T> const & v, + T const & s + ) + { + return tvec2<T>( + v.x + T(s), + v.y + T(s)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> operator+ + ( + T const & s, + tvec2<T> const & v + ) + { + return tvec2<T>( + T(s) + v.x, + T(s) + v.y); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> operator+ + ( + tvec2<T> const & v1, + tvec2<T> const & v2 + ) + { + return tvec2<T>( + v1.x + T(v2.x), + v1.y + T(v2.y)); + } + + //operator- + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> operator- + ( + tvec2<T> const & v, + T const & s + ) + { + return tvec2<T>( + v.x - T(s), + v.y - T(s)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> operator- + ( + T const & s, + tvec2<T> const & v + ) + { + return tvec2<T>( + T(s) - v.x, + T(s) - v.y); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> operator- + ( + tvec2<T> const & v1, + tvec2<T> const & v2 + ) + { + return tvec2<T>( + v1.x - T(v2.x), + v1.y - T(v2.y)); + } + + //operator* + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> operator* + ( + tvec2<T> const & v, + T const & s + ) + { + return tvec2<T>( + v.x * T(s), + v.y * T(s)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> operator* + ( + T const & s, + tvec2<T> const & v + ) + { + return tvec2<T>( + T(s) * v.x, + T(s) * v.y); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> operator* + ( + tvec2<T> const & v1, + tvec2<T> const & v2 + ) + { + return tvec2<T>( + v1.x * T(v2.x), + v1.y * T(v2.y)); + } + + //operator/ + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> operator/ + ( + tvec2<T> const & v, + T const & s + ) + { + return tvec2<T>( + v.x / T(s), + v.y / T(s)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> operator/ + ( + T const & s, + tvec2<T> const & v + ) + { + return tvec2<T>( + T(s) / v.x, + T(s) / v.y); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> operator/ + ( + tvec2<T> const & v1, + tvec2<T> const & v2 + ) + { + return tvec2<T>( + v1.x / T(v2.x), + v1.y / T(v2.y)); + } + + // Unary constant operators + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> operator- + ( + tvec2<T> const & v + ) + { + return tvec2<T>( + -v.x, + -v.y); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> operator++ + ( + tvec2<T> const & v, + int + ) + { + return tvec2<T>( + v.x + T(1), + v.y + T(1)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> operator-- + ( + tvec2<T> const & v, + int + ) + { + return tvec2<T>( + v.x - T(1), + v.y - T(1)); + } + + ////////////////////////////////////// + // Binary bit operators + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> operator% + ( + tvec2<T> const & v, + T const & s + ) + { + return tvec2<T>( + v.x % T(s), + v.y % T(s)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> operator% + ( + T const & s, + tvec2<T> const & v + ) + { + return tvec2<T>( + T(s) % v.x, + T(s) % v.y); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> operator% + ( + tvec2<T> const & v1, + tvec2<T> const & v2 + ) + { + return tvec2<T>( + v1.x % T(v2.x), + v1.y % T(v2.y)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> operator& + ( + tvec2<T> const & v, + T const & s + ) + { + return tvec2<T>( + v.x & T(s), + v.y & T(s)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> operator& + ( + T const & s, + tvec2<T> const & v + ) + { + return tvec2<T>( + T(s) & v.x, + T(s) & v.y); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> operator& + ( + tvec2<T> const & v1, + tvec2<T> const & v2 + ) + { + return tvec2<T>( + v1.x & T(v2.x), + v1.y & T(v2.y)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> operator| + ( + tvec2<T> const & v, + T const & s + ) + { + return tvec2<T>( + v.x | T(s), + v.y | T(s)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> operator| + ( + T const & s, + tvec2<T> const & v + ) + { + return tvec2<T>( + T(s) | v.x, + T(s) | v.y); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> operator| + ( + tvec2<T> const & v1, + tvec2<T> const & v2 + ) + { + return tvec2<T>( + v1.x | T(v2.x), + v1.y | T(v2.y)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> operator^ + ( + tvec2<T> const & v, + T const & s + ) + { + return tvec2<T>( + v.x ^ T(s), + v.y ^ T(s)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> operator^ + ( + T const & s, + tvec2<T> const & v + ) + { + return tvec2<T>( + T(s) ^ v.x, + T(s) ^ v.y); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> operator^ + ( + tvec2<T> const & v1, + tvec2<T> const & v2 + ) + { + return tvec2<T>( + v1.x ^ T(v2.x), + v1.y ^ T(v2.y)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> operator<< + ( + tvec2<T> const & v, + T const & s + ) + { + return tvec2<T>( + v.x << T(s), + v.y << T(s)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> operator<< + ( + T const & s, + tvec2<T> const & v + ) + { + return tvec2<T>( + s << T(v.x), + s << T(v.y)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> operator<< + ( + tvec2<T> const & v1, + tvec2<T> const & v2 + ) + { + return tvec2<T>( + v1.x << T(v2.x), + v1.y << T(v2.y)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> operator>> + ( + tvec2<T> const & v, + T const & s + ) + { + return tvec2<T>( + v.x >> T(s), + v.y >> T(s)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> operator>> + ( + T const & s, + tvec2<T> const & v + ) + { + return tvec2<T>( + T(s) >> v.x, + T(s) >> v.y); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> operator>> + ( + tvec2<T> const & v1, + tvec2<T> const & v2 + ) + { + return tvec2<T>( + v1.x >> T(v2.x), + v1.y >> T(v2.y)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> operator~ + ( + tvec2<T> const & v + ) + { + return tvec2<T>( + ~v.x, + ~v.y); + } + + ////////////////////////////////////// + // tref definition + + template <typename T> + tref2<T>::tref2 + ( + T & x, + T & y + ) : + x(x), + y(y) + {} + + template <typename T> + tref2<T>::tref2 + ( + tref2<T> const & r + ) : + x(r.x), + y(r.y) + {} + + template <typename T> + tref2<T>::tref2 + ( + tvec2<T> const & v + ) : + x(v.x), + y(v.y) + {} + + template <typename T> + tref2<T>& tref2<T>::operator= + ( + tref2<T> const & r + ) + { + x = r.x; + y = r.y; + return *this; + } + + template <typename T> + tref2<T>& tref2<T>::operator= + ( + tvec2<T> const & v + ) + { + x = v.x; + y = v.y; + return *this; + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> tref2<T>::operator() () + { + return tvec2<T>(this->x, this->y); + } +}//namespace detail +}//namespace glm diff --git a/include/gal/opengl/glm/core/type_vec3.hpp b/include/gal/opengl/glm/core/type_vec3.hpp new file mode 100644 index 0000000..ea265ca --- /dev/null +++ b/include/gal/opengl/glm/core/type_vec3.hpp @@ -0,0 +1,342 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/type_vec3.hpp +/// @date 2008-08-22 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_type_gentype3 +#define glm_core_type_gentype3 + +#include "type_vec.hpp" +#include "type_float.hpp" +#include "type_int.hpp" +#include "type_size.hpp" +#include "_swizzle.hpp" + +namespace glm{ +namespace detail +{ + template <typename T> struct tref2; + template <typename T> struct tref3; + template <typename T> struct tref4; + template <typename T> struct tvec2; + template <typename T> struct tvec4; + + template <typename T> + struct tvec3 + { + enum ctor{null}; + + typedef T value_type; + typedef std::size_t size_type; + typedef tvec3<T> type; + typedef tvec3<bool> bool_type; + + GLM_FUNC_DECL GLM_CONSTEXPR size_type length() const; + + ////////////////////////////////////// + // Data + +# if(GLM_COMPONENT == GLM_COMPONENT_CXX11) + union + { + struct{value_type x, y, z;}; + struct{value_type r, g, b;}; + struct{value_type s, t, p;}; + +# if(defined(GLM_SWIZZLE)) + _GLM_SWIZZLE3_2_MEMBERS(value_type, glm::detail::tvec2<value_type>, x, y, z) + _GLM_SWIZZLE3_2_MEMBERS(value_type, glm::detail::tvec2<value_type>, r, g, b) + _GLM_SWIZZLE3_2_MEMBERS(value_type, glm::detail::tvec2<value_type>, s, t, p) + _GLM_SWIZZLE3_3_MEMBERS(value_type, glm::detail::tvec3<value_type>, x, y, z) + _GLM_SWIZZLE3_3_MEMBERS(value_type, glm::detail::tvec3<value_type>, r, g, b) + _GLM_SWIZZLE3_3_MEMBERS(value_type, glm::detail::tvec3<value_type>, s, t, p) + _GLM_SWIZZLE3_4_MEMBERS(value_type, glm::detail::tvec4<value_type>, x, y, z) + _GLM_SWIZZLE3_4_MEMBERS(value_type, glm::detail::tvec4<value_type>, r, g, b) + _GLM_SWIZZLE3_4_MEMBERS(value_type, glm::detail::tvec4<value_type>, s, t, p) +# endif//(defined(GLM_SWIZZLE)) + }; +# elif(GLM_COMPONENT == GLM_COMPONENT_CXX98) + union {value_type x, r, s;}; + union {value_type y, g, t;}; + union {value_type z, b, p;}; + +# if(defined(GLM_SWIZZLE)) + // Defines all he swizzle operator as functions + GLM_SWIZZLE_GEN_REF_FROM_VEC3(T, detail::tvec3, detail::tref2, detail::tref3) + GLM_SWIZZLE_GEN_VEC_FROM_VEC3(T, detail::tvec3, detail::tvec2, detail::tvec3, detail::tvec4) +# endif//(defined(GLM_SWIZZLE)) +# else //(GLM_COMPONENT == GLM_COMPONENT_ONLY_XYZW) + value_type x, y, z; + +# if(defined(GLM_SWIZZLE)) + // Defines all he swizzle operator as functions + GLM_SWIZZLE_GEN_REF_FROM_VEC3_COMP(T, detail::tvec3, detail::tref2, detail::tref3, x, y, z) + GLM_SWIZZLE_GEN_VEC_FROM_VEC3_COMP(T, detail::tvec3, detail::tvec2, detail::tvec3, detail::tvec4, x, y, z) +# endif//(defined(GLM_SWIZZLE)) +# endif//GLM_COMPONENT + + ////////////////////////////////////// + // Accesses + + GLM_FUNC_DECL value_type & operator[](size_type i); + GLM_FUNC_DECL value_type const & operator[](size_type i) const; + + ////////////////////////////////////// + // Implicit basic constructors + + GLM_FUNC_DECL tvec3(); + GLM_FUNC_DECL tvec3(tvec3<T> const & v); + + ////////////////////////////////////// + // Explicit basic constructors + + GLM_FUNC_DECL explicit tvec3( + ctor); + GLM_FUNC_DECL explicit tvec3( + value_type const & s); + GLM_FUNC_DECL explicit tvec3( + value_type const & s1, + value_type const & s2, + value_type const & s3); + + ////////////////////////////////////// + // Convertion scalar constructors + + //! Explicit converions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename U> + GLM_FUNC_DECL explicit tvec3( + U const & x); + //! Explicit converions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename U, typename V, typename W> + GLM_FUNC_DECL explicit tvec3( + U const & x, + V const & y, + W const & z); + + ////////////////////////////////////// + // Convertion vector constructors + + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename A, typename B> + GLM_FUNC_DECL explicit tvec3(tvec2<A> const & v, B const & s); + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename A, typename B> + GLM_FUNC_DECL explicit tvec3(A const & s, tvec2<B> const & v); + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename U> + GLM_FUNC_DECL explicit tvec3(tvec3<U> const & v); + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename U> + GLM_FUNC_DECL explicit tvec3(tvec4<U> const & v); + + ////////////////////////////////////// + // Swizzle constructors + + GLM_FUNC_DECL tvec3(tref3<T> const & r); + + template <typename A, typename B> + GLM_FUNC_DECL explicit tvec3(tref2<A> const & v, B const & s); + + template <typename A, typename B> + GLM_FUNC_DECL explicit tvec3(A const & s, tref2<B> const & v); + + template <int E0, int E1, int E2> + GLM_FUNC_DECL tvec3(glm::detail::swizzle<3, T, tvec3<T>, E0, E1, E2, -1> const & that) + { + *this = that(); + } + + template <int E0, int E1> + GLM_FUNC_DECL tvec3(glm::detail::swizzle<2, T, tvec2<T>, E0, E1, -1, -2> const & v, T const & s) + { + *this = tvec3<T>(v(), s); + } + + template <int E0, int E1> + GLM_FUNC_DECL tvec3(T const & s, glm::detail::swizzle<2, T, tvec2<T>, E0, E1, -1, -2> const & v) + { + *this = tvec3<T>(s, v()); + } + + ////////////////////////////////////// + // Unary arithmetic operators + + GLM_FUNC_DECL tvec3<T> & operator= (tvec3<T> const & v); + template <typename U> + GLM_FUNC_DECL tvec3<T> & operator= (tvec3<U> const & v); + + template <typename U> + GLM_FUNC_DECL tvec3<T> & operator+=(U s); + template <typename U> + GLM_FUNC_DECL tvec3<T> & operator+=(tvec3<U> const & v); + template <typename U> + GLM_FUNC_DECL tvec3<T> & operator-=(U s); + template <typename U> + GLM_FUNC_DECL tvec3<T> & operator-=(tvec3<U> const & v); + template <typename U> + GLM_FUNC_DECL tvec3<T> & operator*=(U s); + template <typename U> + GLM_FUNC_DECL tvec3<T> & operator*=(tvec3<U> const & v); + template <typename U> + GLM_FUNC_DECL tvec3<T> & operator/=(U s); + template <typename U> + GLM_FUNC_DECL tvec3<T> & operator/=(tvec3<U> const & v); + GLM_FUNC_DECL tvec3<T> & operator++(); + GLM_FUNC_DECL tvec3<T> & operator--(); + + ////////////////////////////////////// + // Unary bit operators + + template <typename U> + GLM_FUNC_DECL tvec3<T> & operator%= (U s); + template <typename U> + GLM_FUNC_DECL tvec3<T> & operator%= (tvec3<U> const & v); + template <typename U> + GLM_FUNC_DECL tvec3<T> & operator&= (U s); + template <typename U> + GLM_FUNC_DECL tvec3<T> & operator&= (tvec3<U> const & v); + template <typename U> + GLM_FUNC_DECL tvec3<T> & operator|= (U s); + template <typename U> + GLM_FUNC_DECL tvec3<T> & operator|= (tvec3<U> const & v); + template <typename U> + GLM_FUNC_DECL tvec3<T> & operator^= (U s); + template <typename U> + GLM_FUNC_DECL tvec3<T> & operator^= (tvec3<U> const & v); + template <typename U> + GLM_FUNC_DECL tvec3<T> & operator<<=(U s); + template <typename U> + GLM_FUNC_DECL tvec3<T> & operator<<=(tvec3<U> const & v); + template <typename U> + GLM_FUNC_DECL tvec3<T> & operator>>=(U s); + template <typename U> + GLM_FUNC_DECL tvec3<T> & operator>>=(tvec3<U> const & v); + + ////////////////////////////////////// + // Swizzle operators + + GLM_FUNC_DECL value_type swizzle(comp X) const; + GLM_FUNC_DECL tvec2<T> swizzle(comp X, comp Y) const; + GLM_FUNC_DECL tvec3<T> swizzle(comp X, comp Y, comp Z) const; + GLM_FUNC_DECL tvec4<T> swizzle(comp X, comp Y, comp Z, comp W) const; + GLM_FUNC_DECL tref2<T> swizzle(comp X, comp Y); + GLM_FUNC_DECL tref3<T> swizzle(comp X, comp Y, comp Z); + }; + + template <typename T> + struct tref3 + { + GLM_FUNC_DECL tref3(T & x, T & y, T & z); + GLM_FUNC_DECL tref3(tref3<T> const & r); + GLM_FUNC_DECL explicit tref3(tvec3<T> const & v); + + GLM_FUNC_DECL tref3<T> & operator= (tref3<T> const & r); + GLM_FUNC_DECL tref3<T> & operator= (tvec3<T> const & v); + + GLM_FUNC_DECL tvec3<T> operator() (); + + T & x; + T & y; + T & z; + }; + + GLM_DETAIL_IS_VECTOR(tvec3); +} //namespace detail + + /// @addtogroup core_precision + /// @{ + + /// 3 components vector of high precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tvec3<highp_float> highp_vec3; + + /// 3 components vector of medium precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tvec3<mediump_float> mediump_vec3; + + /// 3 components vector of low precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tvec3<lowp_float> lowp_vec3; + + /// 3 components vector of high precision signed integer numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tvec3<highp_int> highp_ivec3; + + /// 3 components vector of medium precision signed integer numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tvec3<mediump_int> mediump_ivec3; + + /// 3 components vector of low precision signed integer numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tvec3<lowp_int> lowp_ivec3; + + /// 3 components vector of high precision unsigned integer numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tvec3<highp_uint> highp_uvec3; + + /// 3 components vector of medium precision unsigned integer numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tvec3<mediump_uint> mediump_uvec3; + + /// 3 components vector of low precision unsigned integer numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tvec3<lowp_uint> lowp_uvec3; + + /// @} +}//namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_vec3.inl" +#endif//GLM_EXTERNAL_TEMPLATE + +#endif//glm_core_type_gentype3 diff --git a/include/gal/opengl/glm/core/type_vec3.inl b/include/gal/opengl/glm/core/type_vec3.inl new file mode 100644 index 0000000..2279abf --- /dev/null +++ b/include/gal/opengl/glm/core/type_vec3.inl @@ -0,0 +1,1122 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/type_tvec3.inl +/// @date 2008-08-22 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +namespace glm{ +namespace detail +{ + template <typename T> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename tvec3<T>::size_type tvec3<T>::length() const + { + return 3; + } + + ////////////////////////////////////// + // Accesses + + template <typename T> + GLM_FUNC_QUALIFIER typename tvec3<T>::value_type & + tvec3<T>::operator[] + ( + size_type i + ) + { + assert(i < this->length()); + return (&x)[i]; + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tvec3<T>::value_type const & + tvec3<T>::operator[] + ( + size_type i + ) const + { + assert(i < this->length()); + return (&x)[i]; + } + + ////////////////////////////////////// + // Implicit basic constructors + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T>::tvec3() : + x(value_type(0)), + y(value_type(0)), + z(value_type(0)) + {} + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T>::tvec3 + ( + ctor + ) + {} + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T>::tvec3 + ( + tvec3<T> const & v + ) : + x(v.x), + y(v.y), + z(v.z) + {} + + ////////////////////////////////////// + // Explicit basic constructors + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T>::tvec3 + ( + value_type const & s + ) : + x(s), + y(s), + z(s) + {} + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T>::tvec3 + ( + value_type const & s0, + value_type const & s1, + value_type const & s2 + ) : + x(s0), + y(s1), + z(s2) + {} + + ////////////////////////////////////// + // Swizzle constructors + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T>::tvec3 + ( + tref3<T> const & r + ) : + x(r.x), + y(r.y), + z(r.z) + {} + + template <typename T> + template <typename A, typename B> + GLM_FUNC_QUALIFIER tvec3<T>::tvec3 + ( + tref2<A> const & v, + B const & s + ) : + x(value_type(v.x)), + y(value_type(v.y)), + z(value_type(s)) + {} + + template <typename T> + template <typename A, typename B> + GLM_FUNC_QUALIFIER tvec3<T>::tvec3 + ( + A const & s, + tref2<B> const & v + ) : + x(value_type(s)), + y(value_type(v.x)), + z(value_type(v.y)) + {} + + ////////////////////////////////////// + // Convertion scalar constructors + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec3<T>::tvec3 + ( + U const & s + ) : + x(value_type(s)), + y(value_type(s)), + z(value_type(s)) + {} + + template <typename T> + template <typename A, typename B, typename C> + GLM_FUNC_QUALIFIER tvec3<T>::tvec3 + ( + A const & x, + B const & y, + C const & z + ) : + x(value_type(x)), + y(value_type(y)), + z(value_type(z)) + {} + + ////////////////////////////////////// + // Convertion vector constructors + + template <typename T> + template <typename A, typename B> + GLM_FUNC_QUALIFIER tvec3<T>::tvec3 + ( + tvec2<A> const & v, + B const & s + ) : + x(value_type(v.x)), + y(value_type(v.y)), + z(value_type(s)) + {} + + template <typename T> + template <typename A, typename B> + GLM_FUNC_QUALIFIER tvec3<T>::tvec3 + ( + A const & s, + tvec2<B> const & v + ) : + x(value_type(s)), + y(value_type(v.x)), + z(value_type(v.y)) + {} + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec3<T>::tvec3 + ( + tvec3<U> const & v + ) : + x(value_type(v.x)), + y(value_type(v.y)), + z(value_type(v.z)) + {} + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec3<T>::tvec3 + ( + tvec4<U> const & v + ) : + x(value_type(v.x)), + y(value_type(v.y)), + z(value_type(v.z)) + {} + + ////////////////////////////////////// + // Unary arithmetic operators + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T>& tvec3<T>::operator= + ( + tvec3<T> const & v + ) + { + this->x = v.x; + this->y = v.y; + this->z = v.z; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec3<T>& tvec3<T>::operator= + ( + tvec3<U> const & v + ) + { + this->x = T(v.x); + this->y = T(v.y); + this->z = T(v.z); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator+=(U s) + { + this->x += T(s); + this->y += T(s); + this->z += T(s); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator+= + ( + tvec3<U> const & v + ) + { + this->x += T(v.x); + this->y += T(v.y); + this->z += T(v.z); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator-=(U s) + { + this->x -= T(s); + this->y -= T(s); + this->z -= T(s); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator-= + ( + tvec3<U> const & v + ) + { + this->x -= T(v.x); + this->y -= T(v.y); + this->z -= T(v.z); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator*=(U s) + { + this->x *= T(s); + this->y *= T(s); + this->z *= T(s); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator*= + ( + tvec3<U> const & v + ) + { + this->x *= T(v.x); + this->y *= T(v.y); + this->z *= T(v.z); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator/=(U s) + { + this->x /= T(s); + this->y /= T(s); + this->z /= T(s); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator/= + ( + tvec3<U> const & v + ) + { + this->x /= T(v.x); + this->y /= T(v.y); + this->z /= T(v.z); + return *this; + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator++() + { + ++this->x; + ++this->y; + ++this->z; + return *this; + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator--() + { + --this->x; + --this->y; + --this->z; + return *this; + } + + ////////////////////////////////////// + // Boolean operators + + template <typename T> + GLM_FUNC_QUALIFIER bool operator== + ( + tvec3<T> const & v1, + tvec3<T> const & v2 + ) + { + return (v1.x == v2.x) && (v1.y == v2.y) && (v1.z == v2.z); + } + + template <typename T> + GLM_FUNC_QUALIFIER bool operator!= + ( + tvec3<T> const & v1, + tvec3<T> const & v2 + ) + { + return (v1.x != v2.x) || (v1.y != v2.y) || (v1.z != v2.z); + } + + ////////////////////////////////////// + // Unary bit operators + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator%=(U s) + { + this->x %= s; + this->y %= s; + this->z %= s; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator%= + ( + tvec3<U> const & v + ) + { + this->x %= v.x; + this->y %= v.y; + this->z %= v.z; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator&=(U s) + { + this->x &= s; + this->y &= s; + this->z &= s; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator&= + ( + tvec3<U> const & v + ) + { + this->x &= v.x; + this->y &= v.y; + this->z &= v.z; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator|=(U s) + { + this->x |= s; + this->y |= s; + this->z |= s; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator|= + ( + tvec3<U> const & v + ) + { + this->x |= v.x; + this->y |= v.y; + this->z |= v.z; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator^=(U s) + { + this->x ^= s; + this->y ^= s; + this->z ^= s; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator^= + ( + tvec3<U> const & v + ) + { + this->x ^= v.x; + this->y ^= v.y; + this->z ^= v.z; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator<<=(U s) + { + this->x <<= s; + this->y <<= s; + this->z <<= s; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator<<= + ( + tvec3<U> const & v + ) + { + this->x <<= T(v.x); + this->y <<= T(v.y); + this->z <<= T(v.z); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator>>=(U s) + { + this->x >>= T(s); + this->y >>= T(s); + this->z >>= T(s); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec3<T> & tvec3<T>::operator>>= + ( + tvec3<U> const & v + ) + { + this->x >>= T(v.x); + this->y >>= T(v.y); + this->z >>= T(v.z); + return *this; + } + + ////////////////////////////////////// + // Swizzle operators + + template <typename T> + GLM_FUNC_QUALIFIER typename tvec3<T>::value_type + tvec3<T>::swizzle + ( + comp x + ) const + { + return (*this)[x]; + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> tvec3<T>::swizzle + ( + comp x, + comp y + ) const + { + return tvec2<T>( + (*this)[x], + (*this)[y]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> tvec3<T>::swizzle + ( + comp x, + comp y, + comp z + ) const + { + return tvec3<T>( + (*this)[x], + (*this)[y], + (*this)[z]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> tvec3<T>::swizzle + ( + comp x, + comp y, + comp z, + comp w + ) const + { + return tvec4<T>( + (*this)[x], + (*this)[y], + (*this)[z], + (*this)[w]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tref2<T> tvec3<T>::swizzle + ( + comp x, + comp y + ) + { + return tref2<T>( + (*this)[x], + (*this)[y]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tref3<T> tvec3<T>::swizzle + ( + comp x, + comp y, + comp z + ) + { + return tref3<T>( + (*this)[x], + (*this)[y], + (*this)[z]); + } + + ////////////////////////////////////// + // Binary arithmetic operators + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> operator+ + ( + tvec3<T> const & v, + T const & s + ) + { + return tvec3<T>( + v.x + T(s), + v.y + T(s), + v.z + T(s)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> operator+ + ( + T const & s, + tvec3<T> const & v + ) + { + return tvec3<T>( + T(s) + v.x, + T(s) + v.y, + T(s) + v.z); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> operator+ + ( + tvec3<T> const & v1, + tvec3<T> const & v2 + ) + { + return tvec3<T>( + v1.x + T(v2.x), + v1.y + T(v2.y), + v1.z + T(v2.z)); + } + + //operator- + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> operator- + ( + tvec3<T> const & v, + T const & s + ) + { + return tvec3<T>( + v.x - T(s), + v.y - T(s), + v.z - T(s)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> operator- + ( + T const & s, + tvec3<T> const & v + ) + { + return tvec3<T>( + T(s) - v.x, + T(s) - v.y, + T(s) - v.z); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> operator- + ( + tvec3<T> const & v1, + tvec3<T> const & v2 + ) + { + return tvec3<T>( + v1.x - T(v2.x), + v1.y - T(v2.y), + v1.z - T(v2.z)); + } + + //operator* + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> operator* + ( + tvec3<T> const & v, + T const & s + ) + { + return tvec3<T>( + v.x * T(s), + v.y * T(s), + v.z * T(s)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> operator* + ( + T const & s, + tvec3<T> const & v + ) + { + return tvec3<T>( + T(s) * v.x, + T(s) * v.y, + T(s) * v.z); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> operator* + ( + tvec3<T> const & v1, + tvec3<T> const & v2 + ) + { + return tvec3<T>( + v1.x * T(v2.x), + v1.y * T(v2.y), + v1.z * T(v2.z)); + } + + //operator/ + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> operator/ + ( + tvec3<T> const & v, + T const & s + ) + { + return tvec3<T>( + v.x / T(s), + v.y / T(s), + v.z / T(s)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> operator/ + ( + T const & s, + tvec3<T> const & v + ) + { + return tvec3<T>( + T(s) / v.x, + T(s) / v.y, + T(s) / v.z); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> operator/ + ( + tvec3<T> const & v1, + tvec3<T> const & v2 + ) + { + return tvec3<T>( + v1.x / T(v2.x), + v1.y / T(v2.y), + v1.z / T(v2.z)); + } + + // Unary constant operators + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> operator- + ( + tvec3<T> const & v + ) + { + return tvec3<T>( + -v.x, + -v.y, + -v.z); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> operator++ + ( + tvec3<T> const & v, + int + ) + { + return tvec3<T>( + v.x + T(1), + v.y + T(1), + v.z + T(1)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> operator-- + ( + tvec3<T> const & v, + int + ) + { + return tvec3<T>( + v.x - T(1), + v.y - T(1), + v.z - T(1)); + } + + ////////////////////////////////////// + // Binary bit operators + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> operator% + ( + tvec3<T> const & v, + T const & s + ) + { + return tvec3<T>( + v.x % T(s), + v.y % T(s), + v.z % T(s)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> operator% + ( + T const & s, + tvec3<T> const & v + ) + { + return tvec3<T>( + T(s) % v.x, + T(s) % v.y, + T(s) % v.z); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> operator% + ( + tvec3<T> const & v1, + tvec3<T> const & v2 + ) + { + return tvec3<T>( + v1.x % T(v2.x), + v1.y % T(v2.y), + v1.z % T(v2.z)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> operator& + ( + tvec3<T> const & v, + T const & s + ) + { + return tvec3<T>( + v.x & T(s), + v.y & T(s), + v.z & T(s)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> operator& + ( + T const & s, + tvec3<T> const & v + ) + { + return tvec3<T>( + T(s) & v.x, + T(s) & v.y, + T(s) & v.z); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> operator& + ( + tvec3<T> const & v1, + tvec3<T> const & v2 + ) + { + return tvec3<T>( + v1.x & T(v2.x), + v1.y & T(v2.y), + v1.z & T(v2.z)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> operator| + ( + tvec3<T> const & v, + T const & s + ) + { + return tvec3<T>( + v.x | T(s), + v.y | T(s), + v.z | T(s)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> operator| + ( + T const & s, + tvec3<T> const & v + ) + { + return tvec3<T>( + T(s) | v.x, + T(s) | v.y, + T(s) | v.z); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> operator| + ( + tvec3<T> const & v1, + tvec3<T> const & v2 + ) + { + return tvec3<T>( + v1.x | T(v2.x), + v1.y | T(v2.y), + v1.z | T(v2.z)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> operator^ + ( + tvec3<T> const & v, + T const & s + ) + { + return tvec3<T>( + v.x ^ T(s), + v.y ^ T(s), + v.z ^ T(s)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> operator^ + ( + T const & s, + tvec3<T> const & v + ) + { + return tvec3<T>( + T(s) ^ v.x, + T(s) ^ v.y, + T(s) ^ v.z); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> operator^ + ( + tvec3<T> const & v1, + tvec3<T> const & v2 + ) + { + return tvec3<T>( + v1.x ^ T(v2.x), + v1.y ^ T(v2.y), + v1.z ^ T(v2.z)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> operator<< + ( + tvec3<T> const & v, + T const & s + ) + { + return tvec3<T>( + v.x << T(s), + v.y << T(s), + v.z << T(s)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> operator<< + ( + T const & s, + tvec3<T> const & v + ) + { + return tvec3<T>( + T(s) << v.x, + T(s) << v.y, + T(s) << v.z); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> operator<< + ( + tvec3<T> const & v1, + tvec3<T> const & v2 + ) + { + return tvec3<T>( + v1.x << T(v2.x), + v1.y << T(v2.y), + v1.z << T(v2.z)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> operator>> + ( + tvec3<T> const & v, + T const & s + ) + { + return tvec3<T>( + v.x >> T(s), + v.y >> T(s), + v.z >> T(s)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> operator>> + ( + T const & s, + tvec3<T> const & v + ) + { + return tvec3<T>( + s >> T(v.x), + s >> T(v.y), + s >> T(v.z)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> operator>> + ( + tvec3<T> const & v1, + tvec3<T> const & v2 + ) + { + return tvec3<T>( + v1.x >> T(v2.x), + v1.y >> T(v2.y), + v1.z >> T(v2.z)); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> operator~ + ( + tvec3<T> const & v + ) + { + return tvec3<T>( + ~v.x, + ~v.y, + ~v.z); + } + + ////////////////////////////////////// + // tref definition + + template <typename T> + GLM_FUNC_QUALIFIER tref3<T>::tref3(T & x, T & y, T & z) : + x(x), + y(y), + z(z) + {} + + template <typename T> + GLM_FUNC_QUALIFIER tref3<T>::tref3 + ( + tref3<T> const & r + ) : + x(r.x), + y(r.y), + z(r.z) + {} + + template <typename T> + GLM_FUNC_QUALIFIER tref3<T>::tref3 + ( + tvec3<T> const & v + ) : + x(v.x), + y(v.y), + z(v.z) + {} + + template <typename T> + GLM_FUNC_QUALIFIER tref3<T> & tref3<T>::operator= + ( + tref3<T> const & r + ) + { + x = r.x; + y = r.y; + z = r.z; + return *this; + } + + template <typename T> + GLM_FUNC_QUALIFIER tref3<T> & tref3<T>::operator= + ( + tvec3<T> const & v + ) + { + x = v.x; + y = v.y; + z = v.z; + return *this; + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> tref3<T>::operator() () + { + return tvec3<T>(this->x, this->y, this->z); + } + +}//namespace detail +}//namespace glm diff --git a/include/gal/opengl/glm/core/type_vec4.hpp b/include/gal/opengl/glm/core/type_vec4.hpp new file mode 100644 index 0000000..d1e1b71 --- /dev/null +++ b/include/gal/opengl/glm/core/type_vec4.hpp @@ -0,0 +1,399 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/type_vec4.hpp +/// @date 2008-08-22 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_core_type_gentype4 +#define glm_core_type_gentype4 + +#include "type_vec.hpp" +#include "type_float.hpp" +#include "type_int.hpp" +#include "type_size.hpp" +#include "_swizzle.hpp" + +namespace glm{ +namespace detail +{ + template <typename T> struct tref2; + template <typename T> struct tref3; + template <typename T> struct tref4; + template <typename T> struct tvec2; + template <typename T> struct tvec3; + + template <typename T> + struct tvec4 + { + enum ctor{null}; + + typedef T value_type; + typedef std::size_t size_type; + typedef tvec4<T> type; + typedef tvec4<bool> bool_type; + + GLM_FUNC_DECL GLM_CONSTEXPR size_type length() const; + + ////////////////////////////////////// + // Data + +# if(GLM_COMPONENT == GLM_COMPONENT_CXX11) + union + { + struct{value_type x, y, z, w;}; + struct{value_type r, g, b, a;}; + struct{value_type s, t, p, q;}; + +# if(defined(GLM_SWIZZLE)) + _GLM_SWIZZLE4_2_MEMBERS(value_type, glm::detail::tvec2<value_type>, x, y, z, w) + _GLM_SWIZZLE4_2_MEMBERS(value_type, glm::detail::tvec2<value_type>, r, g, b, a) + _GLM_SWIZZLE4_2_MEMBERS(value_type, glm::detail::tvec2<value_type>, s, t, p, q) + _GLM_SWIZZLE4_3_MEMBERS(value_type, glm::detail::tvec3<value_type>, x, y, z, w) + _GLM_SWIZZLE4_3_MEMBERS(value_type, glm::detail::tvec3<value_type>, r, g, b, a) + _GLM_SWIZZLE4_3_MEMBERS(value_type, glm::detail::tvec3<value_type>, s, t, p, q) + _GLM_SWIZZLE4_4_MEMBERS(value_type, glm::detail::tvec4<value_type>, x, y, z, w) + _GLM_SWIZZLE4_4_MEMBERS(value_type, glm::detail::tvec4<value_type>, r, g, b, a) + _GLM_SWIZZLE4_4_MEMBERS(value_type, glm::detail::tvec4<value_type>, s, t, p, q) +# endif//(defined(GLM_SWIZZLE)) + }; +# elif(GLM_COMPONENT == GLM_COMPONENT_CXX98) + union {value_type x, r, s;}; + union {value_type y, g, t;}; + union {value_type z, b, p;}; + union {value_type w, a, q;}; + +# if(defined(GLM_SWIZZLE)) + // Defines all he swizzle operator as functions + GLM_SWIZZLE_GEN_REF_FROM_VEC4(T, detail::tvec4, detail::tref2, detail::tref3, detail::tref4) + GLM_SWIZZLE_GEN_VEC_FROM_VEC4(T, detail::tvec4, detail::tvec2, detail::tvec3, detail::tvec4) +# endif//(defined(GLM_SWIZZLE)) +# else //(GLM_COMPONENT == GLM_COMPONENT_ONLY_XYZW) + value_type x, y, z, w; + +# if(defined(GLM_SWIZZLE)) + // Defines all he swizzle operator as functions + GLM_SWIZZLE_GEN_REF_FROM_VEC4_COMP(T, detail::tvec4, detail::tref2, detail::tref3, detail::tref4, x, y, z, w) + GLM_SWIZZLE_GEN_VEC_FROM_VEC4_COMP(T, detail::tvec4, detail::tvec2, detail::tvec3, detail::tvec4, x, y, z, w) +# endif//(defined(GLM_SWIZZLE)) +# endif//GLM_COMPONENT + + ////////////////////////////////////// + // Accesses + + GLM_FUNC_DECL value_type & operator[](size_type i); + GLM_FUNC_DECL value_type const & operator[](size_type i) const; + + ////////////////////////////////////// + // Implicit basic constructors + + GLM_FUNC_DECL tvec4(); + GLM_FUNC_DECL tvec4(type const & v); + + ////////////////////////////////////// + // Explicit basic constructors + + GLM_FUNC_DECL explicit tvec4( + ctor); + GLM_FUNC_DECL explicit tvec4( + value_type const & s); + GLM_FUNC_DECL explicit tvec4( + value_type const & s0, + value_type const & s1, + value_type const & s2, + value_type const & s3); + + ////////////////////////////////////// + // Convertion scalar constructors + + //! Explicit converions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename U> + GLM_FUNC_DECL explicit tvec4( + U const & x); + //! Explicit converions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename A, typename B, typename C, typename D> + GLM_FUNC_DECL explicit tvec4( + A const & x, + B const & y, + C const & z, + D const & w); + + ////////////////////////////////////// + // Convertion vector constructors + + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename A, typename B, typename C> + GLM_FUNC_DECL explicit tvec4(tvec2<A> const & v, B const & s1, C const & s2); + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename A, typename B, typename C> + GLM_FUNC_DECL explicit tvec4(A const & s1, tvec2<B> const & v, C const & s2); + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename A, typename B, typename C> + GLM_FUNC_DECL explicit tvec4(A const & s1, B const & s2, tvec2<C> const & v); + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename A, typename B> + GLM_FUNC_DECL explicit tvec4(tvec3<A> const & v, B const & s); + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename A, typename B> + GLM_FUNC_DECL explicit tvec4(A const & s, tvec3<B> const & v); + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename A, typename B> + GLM_FUNC_DECL explicit tvec4(tvec2<A> const & v1, tvec2<B> const & v2); + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename U> + GLM_FUNC_DECL explicit tvec4(tvec4<U> const & v); + + template <int E0, int E1, int E2, int E3> + GLM_FUNC_DECL tvec4(glm::detail::swizzle<4, T, tvec4<T>, E0, E1, E2, E3> const & that) + { + *this = that(); + } + + template <int E0, int E1, int F0, int F1> + GLM_FUNC_DECL tvec4(glm::detail::swizzle<2, T, tvec2<T>, E0, E1, -1, -2> const & v, glm::detail::swizzle<2, T, tvec2<T>, F0, F1, -1, -2> const & u) + { + *this = tvec4<T>(v(), u()); + } + + template <int E0, int E1> + GLM_FUNC_DECL tvec4(T const & x, T const & y, glm::detail::swizzle<2, T, tvec2<T>, E0, E1, -1, -2> const & v) + { + *this = tvec4<T>(x, y, v()); + } + + template <int E0, int E1> + GLM_FUNC_DECL tvec4(T const & x, glm::detail::swizzle<2, T, tvec2<T>, E0, E1, -1, -2> const & v, T const & w) + { + *this = tvec4<T>(x, v(), w); + } + + template <int E0, int E1> + GLM_FUNC_DECL tvec4(glm::detail::swizzle<2, T, tvec2<T>, E0, E1, -1, -2> const & v, T const & z, T const & w) + { + *this = tvec4<T>(v(), z, w); + } + + template <int E0, int E1, int E2> + GLM_FUNC_DECL tvec4(glm::detail::swizzle<3, T, tvec3<T>, E0, E1, E2, -1> const & v, T const & w) + { + *this = tvec4<T>(v(), w); + } + + template <int E0, int E1, int E2> + GLM_FUNC_DECL tvec4(T const & x, glm::detail::swizzle<3, T, tvec3<T>, E0, E1, E2, -1> const & v) + { + *this = tvec4<T>(x, v()); + } + + ////////////////////////////////////// + // Swizzle constructors + + GLM_FUNC_DECL tvec4(tref4<T> const & r); + + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename A, typename B, typename C> + GLM_FUNC_DECL explicit tvec4(tref2<A> const & v, B const & s1, C const & s2); + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename A, typename B, typename C> + GLM_FUNC_DECL explicit tvec4(A const & s1, tref2<B> const & v, C const & s2); + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename A, typename B, typename C> + GLM_FUNC_DECL explicit tvec4(A const & s1, B const & s2, tref2<C> const & v); + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename A, typename B> + GLM_FUNC_DECL explicit tvec4(tref3<A> const & v, B const & s); + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename A, typename B> + GLM_FUNC_DECL explicit tvec4(A const & s, tref3<B> const & v); + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename A, typename B> + GLM_FUNC_DECL explicit tvec4(tref2<A> const & v1, tref2<B> const & v2); + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename A, typename B> + GLM_FUNC_DECL explicit tvec4(tvec2<A> const & v1, tref2<B> const & v2); + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename A, typename B> + GLM_FUNC_DECL explicit tvec4(tref2<A> const & v1, tvec2<B> const & v2); + + ////////////////////////////////////// + // Unary arithmetic operators + + GLM_FUNC_DECL tvec4<T> & operator= (tvec4<T> const & v); + template <typename U> + GLM_FUNC_DECL tvec4<T> & operator= (tvec4<U> const & v); + + template <typename U> + GLM_FUNC_DECL tvec4<T> & operator+=(U s); + template <typename U> + GLM_FUNC_DECL tvec4<T> & operator+=(tvec4<U> const & v); + template <typename U> + GLM_FUNC_DECL tvec4<T> & operator-=(U s); + template <typename U> + GLM_FUNC_DECL tvec4<T> & operator-=(tvec4<U> const & v); + template <typename U> + GLM_FUNC_DECL tvec4<T> & operator*=(U s); + template <typename U> + GLM_FUNC_DECL tvec4<T> & operator*=(tvec4<U> const & v); + template <typename U> + GLM_FUNC_DECL tvec4<T> & operator/=(U s); + template <typename U> + GLM_FUNC_DECL tvec4<T> & operator/=(tvec4<U> const & v); + GLM_FUNC_DECL tvec4<T> & operator++(); + GLM_FUNC_DECL tvec4<T> & operator--(); + + ////////////////////////////////////// + // Unary bit operators + + template <typename U> + GLM_FUNC_DECL tvec4<T> & operator%= (U s); + template <typename U> + GLM_FUNC_DECL tvec4<T> & operator%= (tvec4<U> const & v); + template <typename U> + GLM_FUNC_DECL tvec4<T> & operator&= (U s); + template <typename U> + GLM_FUNC_DECL tvec4<T> & operator&= (tvec4<U> const & v); + template <typename U> + GLM_FUNC_DECL tvec4<T> & operator|= (U s); + template <typename U> + GLM_FUNC_DECL tvec4<T> & operator|= (tvec4<U> const & v); + template <typename U> + GLM_FUNC_DECL tvec4<T> & operator^= (U s); + template <typename U> + GLM_FUNC_DECL tvec4<T> & operator^= (tvec4<U> const & v); + template <typename U> + GLM_FUNC_DECL tvec4<T> & operator<<=(U s); + template <typename U> + GLM_FUNC_DECL tvec4<T> & operator<<=(tvec4<U> const & v); + template <typename U> + GLM_FUNC_DECL tvec4<T> & operator>>=(U s); + template <typename U> + GLM_FUNC_DECL tvec4<T> & operator>>=(tvec4<U> const & v); + + ////////////////////////////////////// + // Swizzle operators + + GLM_FUNC_DECL value_type swizzle(comp X) const; + GLM_FUNC_DECL tvec2<T> swizzle(comp X, comp Y) const; + GLM_FUNC_DECL tvec3<T> swizzle(comp X, comp Y, comp Z) const; + GLM_FUNC_DECL tvec4<T> swizzle(comp X, comp Y, comp Z, comp W) const; + GLM_FUNC_DECL tref2<T> swizzle(comp X, comp Y); + GLM_FUNC_DECL tref3<T> swizzle(comp X, comp Y, comp Z); + GLM_FUNC_DECL tref4<T> swizzle(comp X, comp Y, comp Z, comp W); + }; + + template <typename T> + struct tref4 + { + GLM_FUNC_DECL tref4(T & x, T & y, T & z, T & w); + GLM_FUNC_DECL tref4(tref4<T> const & r); + GLM_FUNC_DECL explicit tref4(tvec4<T> const & v); + + GLM_FUNC_DECL tref4<T> & operator= (tref4<T> const & r); + GLM_FUNC_DECL tref4<T> & operator= (tvec4<T> const & v); + + GLM_FUNC_DECL tvec4<T> operator() (); + + T & x; + T & y; + T & z; + T & w; + }; + + GLM_DETAIL_IS_VECTOR(tvec4); +}//namespace detail + + /// @addtogroup core_precision + /// @{ + + /// 4 components vector of high precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tvec4<highp_float> highp_vec4; + + /// 4 components vector of medium precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tvec4<mediump_float> mediump_vec4; + + /// 4 components vector of low precision floating-point numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tvec4<lowp_float> lowp_vec4; + + /// 4 components vector of high precision signed integer numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tvec4<highp_int> highp_ivec4; + + /// 4 components vector of medium precision signed integer numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tvec4<mediump_int> mediump_ivec4; + + /// 4 components vector of low precision signed integer numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tvec4<lowp_int> lowp_ivec4; + + /// 4 components vector of high precision unsigned integer numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tvec4<highp_uint> highp_uvec4; + + /// 4 components vector of medium precision unsigned integer numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tvec4<mediump_uint> mediump_uvec4; + + /// 4 components vector of low precision unsigned integer numbers. + /// There is no guarantee on the actual precision. + /// + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.1.5 Vectors</a> + /// @see <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.pdf">GLSL 4.20.8 specification, section 4.7.2 Precision Qualifier</a> + typedef detail::tvec4<lowp_uint> lowp_uvec4; + + /// @} +}//namespace glm + +#ifndef GLM_EXTERNAL_TEMPLATE +#include "type_vec4.inl" +#endif//GLM_EXTERNAL_TEMPLATE + +#endif//glm_core_type_gentype4 diff --git a/include/gal/opengl/glm/core/type_vec4.inl b/include/gal/opengl/glm/core/type_vec4.inl new file mode 100644 index 0000000..7f98c1b --- /dev/null +++ b/include/gal/opengl/glm/core/type_vec4.inl @@ -0,0 +1,1348 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/core/type_tvec4.inl +/// @date 2008-08-23 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +namespace glm{ +namespace detail +{ + template <typename T> + GLM_FUNC_QUALIFIER GLM_CONSTEXPR typename tvec4<T>::size_type tvec4<T>::length() const + { + return 4; + } + + ////////////////////////////////////// + // Accesses + + template <typename T> + GLM_FUNC_QUALIFIER typename tvec4<T>::value_type & + tvec4<T>::operator[] + ( + size_type i + ) + { + assert(i < this->length()); + return (&x)[i]; + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tvec4<T>::value_type const & + tvec4<T>::operator[] + ( + size_type i + ) const + { + assert(i < this->length()); + return (&x)[i]; + } + + ////////////////////////////////////// + // Implicit basic constructors + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T>::tvec4() : + x(value_type(0)), + y(value_type(0)), + z(value_type(0)), + w(value_type(0)) + {} + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T>::tvec4 + ( + ctor + ) + {} + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T>::tvec4 + ( + type const & v + ) : + x(v.x), + y(v.y), + z(v.z), + w(v.w) + {} + + ////////////////////////////////////// + // Explicit basic constructors + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T>::tvec4 + ( + value_type const & s + ) : + x(s), + y(s), + z(s), + w(s) + {} + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T>::tvec4 + ( + value_type const & s1, + value_type const & s2, + value_type const & s3, + value_type const & s4 + ) : + x(s1), + y(s2), + z(s3), + w(s4) + {} + + ////////////////////////////////////// + // Swizzle constructors + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T>::tvec4 + ( + tref4<T> const & r + ) : + x(r.x), + y(r.y), + z(r.z), + w(r.w) + {} + + template <typename T> + template <typename A, typename B, typename C> + GLM_FUNC_QUALIFIER tvec4<T>::tvec4 + ( + tref2<A> const & v, + B const & s1, + C const & s2 + ) : + x(value_type(v.x)), + y(value_type(v.y)), + z(value_type(s1)), + w(value_type(s2)) + {} + + template <typename T> + template <typename A, typename B, typename C> + GLM_FUNC_QUALIFIER tvec4<T>::tvec4 + ( + A const & s1, + tref2<B> const & v, + C const & s2 + ) : + x(value_type(s1)), + y(value_type(v.x)), + z(value_type(v.y)), + w(value_type(s2)) + {} + + template <typename T> + template <typename A, typename B, typename C> + GLM_FUNC_QUALIFIER tvec4<T>::tvec4 + ( + A const & s1, + B const & s2, + tref2<C> const & v + ) : + x(value_type(s1)), + y(value_type(s2)), + z(value_type(v.x)), + w(value_type(v.y)) + {} + + template <typename T> + template <typename A, typename B> + GLM_FUNC_QUALIFIER tvec4<T>::tvec4 + ( + tref3<A> const & v, + B const & s + ) : + x(value_type(v.x)), + y(value_type(v.y)), + z(value_type(v.z)), + w(value_type(s)) + {} + + template <typename T> + template <typename A, typename B> + GLM_FUNC_QUALIFIER tvec4<T>::tvec4 + ( + A const & s, + tref3<B> const & v + ) : + x(value_type(s)), + y(value_type(v.x)), + z(value_type(v.y)), + w(value_type(v.z)) + {} + + template <typename T> + template <typename A, typename B> + GLM_FUNC_QUALIFIER tvec4<T>::tvec4 + ( + tref2<A> const & v1, + tref2<B> const & v2 + ) : + x(value_type(v1.x)), + y(value_type(v1.y)), + z(value_type(v2.x)), + w(value_type(v2.y)) + {} + + template <typename T> + template <typename A, typename B> + GLM_FUNC_QUALIFIER tvec4<T>::tvec4 + ( + tvec2<A> const & v1, + tref2<B> const & v2 + ) : + x(value_type(v1.x)), + y(value_type(v1.y)), + z(value_type(v2.x)), + w(value_type(v2.y)) + {} + + template <typename T> + template <typename A, typename B> + GLM_FUNC_QUALIFIER tvec4<T>::tvec4 + ( + tref2<A> const & v1, + tvec2<B> const & v2 + ) : + x(value_type(v1.x)), + y(value_type(v1.y)), + z(value_type(v2.x)), + w(value_type(v2.y)) + {} + + ////////////////////////////////////// + // Convertion scalar constructors + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec4<T>::tvec4 + ( + U const & x + ) : + x(value_type(x)), + y(value_type(x)), + z(value_type(x)), + w(value_type(x)) + {} + + template <typename T> + template <typename A, typename B, typename C, typename D> + GLM_FUNC_QUALIFIER tvec4<T>::tvec4 + ( + A const & x, + B const & y, + C const & z, + D const & w + ) : + x(value_type(x)), + y(value_type(y)), + z(value_type(z)), + w(value_type(w)) + {} + + ////////////////////////////////////// + // Convertion vector constructors + + template <typename T> + template <typename A, typename B, typename C> + GLM_FUNC_QUALIFIER tvec4<T>::tvec4 + ( + tvec2<A> const & v, + B const & s1, + C const & s2 + ) : + x(value_type(v.x)), + y(value_type(v.y)), + z(value_type(s1)), + w(value_type(s2)) + {} + + template <typename T> + template <typename A, typename B, typename C> + GLM_FUNC_QUALIFIER tvec4<T>::tvec4 + ( + A const & s1, + tvec2<B> const & v, + C const & s2 + ) : + x(value_type(s1)), + y(value_type(v.x)), + z(value_type(v.y)), + w(value_type(s2)) + {} + + template <typename T> + template <typename A, typename B, typename C> + GLM_FUNC_QUALIFIER tvec4<T>::tvec4 + ( + A const & s1, + B const & s2, + tvec2<C> const & v + ) : + x(value_type(s1)), + y(value_type(s2)), + z(value_type(v.x)), + w(value_type(v.y)) + {} + + template <typename T> + template <typename A, typename B> + GLM_FUNC_QUALIFIER tvec4<T>::tvec4 + ( + tvec3<A> const & v, + B const & s + ) : + x(value_type(v.x)), + y(value_type(v.y)), + z(value_type(v.z)), + w(value_type(s)) + {} + + template <typename T> + template <typename A, typename B> + GLM_FUNC_QUALIFIER tvec4<T>::tvec4 + ( + A const & s, + tvec3<B> const & v + ) : + x(value_type(s)), + y(value_type(v.x)), + z(value_type(v.y)), + w(value_type(v.z)) + {} + + template <typename T> + template <typename A, typename B> + GLM_FUNC_QUALIFIER tvec4<T>::tvec4 + ( + tvec2<A> const & v1, + tvec2<B> const & v2 + ) : + x(value_type(v1.x)), + y(value_type(v1.y)), + z(value_type(v2.x)), + w(value_type(v2.y)) + {} + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec4<T>::tvec4 + ( + tvec4<U> const & v + ) : + x(value_type(v.x)), + y(value_type(v.y)), + z(value_type(v.z)), + w(value_type(v.w)) + {} + + ////////////////////////////////////// + // Unary arithmetic operators + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator= + ( + tvec4<T> const & v + ) + { + this->x = v.x; + this->y = v.y; + this->z = v.z; + this->w = v.w; + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator= + ( + tvec4<U> const & v + ) + { + this->x = T(v.x); + this->y = T(v.y); + this->z = T(v.z); + this->w = T(v.w); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator+= (U s) + { + this->x += T(s); + this->y += T(s); + this->z += T(s); + this->w += T(s); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator+= + ( + tvec4<U> const & v + ) + { + this->x += T(v.x); + this->y += T(v.y); + this->z += T(v.z); + this->w += T(v.w); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator-= (U s) + { + this->x -= T(s); + this->y -= T(s); + this->z -= T(s); + this->w -= T(s); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator-= + ( + tvec4<U> const & v + ) + { + this->x -= T(v.x); + this->y -= T(v.y); + this->z -= T(v.z); + this->w -= T(v.w); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator*= (U s) + { + this->x *= T(s); + this->y *= T(s); + this->z *= T(s); + this->w *= T(s); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator*= + ( + tvec4<U> const & v + ) + { + this->x *= T(v.x); + this->y *= T(v.y); + this->z *= T(v.z); + this->w *= T(v.w); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator/= (U s) + { + this->x /= T(s); + this->y /= T(s); + this->z /= T(s); + this->w /= T(s); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator/= + ( + tvec4<U> const & v + ) + { + this->x /= T(v.x); + this->y /= T(v.y); + this->z /= T(v.z); + this->w /= T(v.w); + return *this; + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator++() + { + ++this->x; + ++this->y; + ++this->z; + ++this->w; + return *this; + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator--() + { + --this->x; + --this->y; + --this->z; + --this->w; + return *this; + } + + ////////////////////////////////////// + // Unary bit operators + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator%= (U s) + { + this->x %= T(s); + this->y %= T(s); + this->z %= T(s); + this->w %= T(s); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator%= + ( + tvec4<U> const & v + ) + { + this->x %= T(v.x); + this->y %= T(v.y); + this->z %= T(v.z); + this->w %= T(v.w); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator&= (U s) + { + this->x &= T(s); + this->y &= T(s); + this->z &= T(s); + this->w &= T(s); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator&= + ( + tvec4<U> const & v + ) + { + this->x &= T(v.x); + this->y &= T(v.y); + this->z &= T(v.z); + this->w &= T(v.w); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator|= (U s) + { + this->x |= T(s); + this->y |= T(s); + this->z |= T(s); + this->w |= T(s); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator|= + ( + tvec4<U> const & v + ) + { + this->x |= T(v.x); + this->y |= T(v.y); + this->z |= T(v.z); + this->w |= T(v.w); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator^= (U s) + { + this->x ^= T(s); + this->y ^= T(s); + this->z ^= T(s); + this->w ^= T(s); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator^= + ( + tvec4<U> const & v + ) + { + this->x ^= T(v.x); + this->y ^= T(v.y); + this->z ^= T(v.z); + this->w ^= T(v.w); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator<<= (U s) + { + this->x <<= T(s); + this->y <<= T(s); + this->z <<= T(s); + this->w <<= T(s); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator<<= + ( + tvec4<U> const & v + ) + { + this->x <<= T(v.x); + this->y <<= T(v.y); + this->z <<= T(v.z); + this->w <<= T(v.w); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator>>= (U s) + { + this->x >>= T(s); + this->y >>= T(s); + this->z >>= T(s); + this->w >>= T(s); + return *this; + } + + template <typename T> + template <typename U> + GLM_FUNC_QUALIFIER tvec4<T> & tvec4<T>::operator>>= + ( + tvec4<U> const & v + ) + { + this->x >>= T(v.x); + this->y >>= T(v.y); + this->z >>= T(v.z); + this->w >>= T(v.w); + return *this; + } + + ////////////////////////////////////// + // Swizzle operators + + template <typename T> + GLM_FUNC_QUALIFIER typename tvec4<T>::value_type + tvec4<T>::swizzle + ( + comp x + ) const + { + return (*this)[x]; + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec2<T> tvec4<T>::swizzle + ( + comp x, + comp y + ) const + { + return tvec2<T>( + (*this)[x], + (*this)[y]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec3<T> tvec4<T>::swizzle + ( + comp x, + comp y, + comp z + ) const + { + return tvec3<T>( + (*this)[x], + (*this)[y], + (*this)[z]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> tvec4<T>::swizzle + ( + comp x, + comp y, + comp z, + comp w + ) const + { + return tvec4<T>( + (*this)[x], + (*this)[y], + (*this)[z], + (*this)[w]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tref2<T> tvec4<T>::swizzle + ( + comp x, + comp y + ) + { + return tref2<T>( + (*this)[x], + (*this)[y]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tref3<T> tvec4<T>::swizzle + ( + comp x, + comp y, + comp z + ) + { + return tref3<T>( + (*this)[x], + (*this)[y], + (*this)[z]); + } + + template <typename T> + GLM_FUNC_QUALIFIER tref4<T> tvec4<T>::swizzle + ( + comp x, + comp y, + comp z, + comp w + ) + { + return tref4<T>( + (*this)[x], + (*this)[y], + (*this)[z], + (*this)[w]); + } + + ////////////////////////////////////// + // Binary arithmetic operators + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> operator+ + ( + tvec4<T> const & v, + typename tvec4<T>::value_type const & s + ) + { + return tvec4<T>( + v.x + s, + v.y + s, + v.z + s, + v.w + s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> operator+ + ( + typename tvec4<T>::value_type const & s, + tvec4<T> const & v + ) + { + return tvec4<T>( + s + v.x, + s + v.y, + s + v.z, + s + v.w); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> operator+ + ( + tvec4<T> const & v1, + tvec4<T> const & v2 + ) + { + return tvec4<T>( + v1.x + v2.x, + v1.y + v2.y, + v1.z + v2.z, + v1.w + v2.w); + } + + //operator- + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> operator- + ( + tvec4<T> const & v, + typename tvec4<T>::value_type const & s + ) + { + return tvec4<T>( + v.x - s, + v.y - s, + v.z - s, + v.w - s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> operator- + ( + typename tvec4<T>::value_type const & s, + tvec4<T> const & v + ) + { + return tvec4<T>( + s - v.x, + s - v.y, + s - v.z, + s - v.w); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> operator- + ( + tvec4<T> const & v1, + tvec4<T> const & v2 + ) + { + return tvec4<T>( + v1.x - v2.x, + v1.y - v2.y, + v1.z - v2.z, + v1.w - v2.w); + } + + //operator* + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> operator* + ( + tvec4<T> const & v, + typename tvec4<T>::value_type const & s + ) + { + return tvec4<T>( + v.x * s, + v.y * s, + v.z * s, + v.w * s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> operator* + ( + typename tvec4<T>::value_type const & s, + tvec4<T> const & v + ) + { + return tvec4<T>( + s * v.x, + s * v.y, + s * v.z, + s * v.w); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> operator* + ( + tvec4<T> const & v1, + tvec4<T> const & v2 + ) + { + return tvec4<T>( + v1.x * v2.x, + v1.y * v2.y, + v1.z * v2.z, + v1.w * v2.w); + } + + //operator/ + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> operator/ + ( + tvec4<T> const & v, + typename tvec4<T>::value_type const & s + ) + { + return tvec4<T>( + v.x / s, + v.y / s, + v.z / s, + v.w / s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> operator/ + ( + typename tvec4<T>::value_type const & s, + tvec4<T> const & v + ) + { + return tvec4<T>( + s / v.x, + s / v.y, + s / v.z, + s / v.w); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> operator/ + ( + tvec4<T> const & v1, + tvec4<T> const & v2 + ) + { + return tvec4<T>( + v1.x / v2.x, + v1.y / v2.y, + v1.z / v2.z, + v1.w / v2.w); + } + + // Unary constant operators + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> operator- + ( + tvec4<T> const & v + ) + { + return tvec4<T>( + -v.x, + -v.y, + -v.z, + -v.w); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> operator++ + ( + tvec4<T> const & v, + int + ) + { + typename tvec4<T>::value_type One(1); + return tvec4<T>( + v.x + One, + v.y + One, + v.z + One, + v.w + One); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> operator-- + ( + tvec4<T> const & v, + int + ) + { + typename tvec4<T>::value_type One(1); + return tvec4<T>( + v.x - One, + v.y - One, + v.z - One, + v.w - One); + } + + ////////////////////////////////////// + // Boolean operators + + template <typename T> + GLM_FUNC_QUALIFIER bool operator== + ( + tvec4<T> const & v1, + tvec4<T> const & v2 + ) + { + return (v1.x == v2.x) && (v1.y == v2.y) && (v1.z == v2.z) && (v1.w == v2.w); + } + + template <typename T> + GLM_FUNC_QUALIFIER bool operator!= + ( + tvec4<T> const & v1, + tvec4<T> const & v2 + ) + { + return (v1.x != v2.x) || (v1.y != v2.y) || (v1.z != v2.z) || (v1.w != v2.w); + } + + ////////////////////////////////////// + // Binary bit operators + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> operator% + ( + tvec4<T> const & v, + typename tvec4<T>::value_type const & s + ) + { + return tvec4<T>( + v.x % s, + v.y % s, + v.z % s, + v.w % s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> operator% + ( + typename tvec4<T>::value_type const & s, + tvec4<T> const & v + ) + { + return tvec4<T>( + s % v.x, + s % v.y, + s % v.z, + s % v.w); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> operator% + ( + tvec4<T> const & v1, + tvec4<T> const & v2 + ) + { + return tvec4<T>( + v1.x % v2.x, + v1.y % v2.y, + v1.z % v2.z, + v1.w % v2.w); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> operator& + ( + tvec4<T> const & v, + typename tvec4<T>::value_type const & s + ) + { + return tvec4<T>( + v.x & s, + v.y & s, + v.z & s, + v.w & s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> operator& + ( + typename tvec4<T>::value_type const & s, + tvec4<T> const & v + ) + { + return tvec4<T>( + s & v.x, + s & v.y, + s & v.z, + s & v.w); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> operator& + ( + tvec4<T> const & v1, + tvec4<T> const & v2 + ) + { + return tvec4<T>( + v1.x & v2.x, + v1.y & v2.y, + v1.z & v2.z, + v1.w & v2.w); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> operator| + ( + tvec4<T> const & v, + typename tvec4<T>::value_type const & s + ) + { + return tvec4<T>( + v.x | s, + v.y | s, + v.z | s, + v.w | s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> operator| + ( + typename tvec4<T>::value_type const & s, + tvec4<T> const & v + ) + { + return tvec4<T>( + s | v.x, + s | v.y, + s | v.z, + s | v.w); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> operator| + ( + tvec4<T> const & v1, + tvec4<T> const & v2 + ) + { + return tvec4<T>( + v1.x | v2.x, + v1.y | v2.y, + v1.z | v2.z, + v1.w | v2.w); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> operator^ + ( + tvec4<T> const & v, + typename tvec4<T>::value_type const & s + ) + { + return tvec4<T>( + v.x ^ s, + v.y ^ s, + v.z ^ s, + v.w ^ s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> operator^ + ( + typename tvec4<T>::value_type const & s, + tvec4<T> const & v + ) + { + return tvec4<T>( + s ^ v.x, + s ^ v.y, + s ^ v.z, + s ^ v.w); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> operator^ + ( + tvec4<T> const & v1, + tvec4<T> const & v2 + ) + { + return tvec4<T>( + v1.x ^ v2.x, + v1.y ^ v2.y, + v1.z ^ v2.z, + v1.w ^ v2.w); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> operator<< + ( + tvec4<T> const & v, + typename tvec4<T>::value_type const & s + ) + { + return tvec4<T>( + v.x << s, + v.y << s, + v.z << s, + v.w << s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> operator<< + ( + typename tvec4<T>::value_type const & s, + tvec4<T> const & v + ) + { + return tvec4<T>( + s << v.x, + s << v.y, + s << v.z, + s << v.w); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> operator<< + ( + tvec4<T> const & v1, + tvec4<T> const & v2 + ) + { + return tvec4<T>( + v1.x << v2.x, + v1.y << v2.y, + v1.z << v2.z, + v1.w << v2.w); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> operator>> + ( + tvec4<T> const & v, + typename tvec4<T>::value_type const & s + ) + { + return tvec4<T>( + v.x >> s, + v.y >> s, + v.z >> s, + v.w >> s); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> operator>> + ( + typename tvec4<T>::value_type const & s, + tvec4<T> const & v + ) + { + return tvec4<T>( + s >> v.x, + s >> v.y, + s >> v.z, + s >> v.w); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> operator>> + ( + tvec4<T> const & v1, + tvec4<T> const & v2 + ) + { + return tvec4<T>( + v1.x >> v2.x, + v1.y >> v2.y, + v1.z >> v2.z, + v1.w >> v2.w); + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> operator~ + ( + tvec4<T> const & v + ) + { + return tvec4<T>( + ~v.x, + ~v.y, + ~v.z, + ~v.w); + } + + ////////////////////////////////////// + // tref definition + + template <typename T> + tref4<T>::tref4 + ( + T & x, + T & y, + T & z, + T & w + ) : + x(x), + y(y), + z(z), + w(w) + {} + + template <typename T> + tref4<T>::tref4 + ( + tref4<T> const & r + ) : + x(r.x), + y(r.y), + z(r.z), + w(r.w) + {} + + template <typename T> + tref4<T>::tref4 + ( + tvec4<T> const & v + ) : + x(v.x), + y(v.y), + z(v.z), + w(v.w) + {} + + template <typename T> + tref4<T>& tref4<T>::operator= + ( + tref4<T> const & r + ) + { + x = r.x; + y = r.y; + z = r.z; + w = r.w; + return *this; + } + + template <typename T> + tref4<T>& tref4<T>::operator= + ( + tvec4<T> const & v + ) + { + x = v.x; + y = v.y; + z = v.z; + w = v.w; + return *this; + } + + template <typename T> + GLM_FUNC_QUALIFIER tvec4<T> tref4<T>::operator() () + { + return tvec4<T>(this->x, this->y, this->z, this->w); + } + +}//namespace detail +}//namespace glm diff --git a/include/gal/opengl/glm/ext.hpp b/include/gal/opengl/glm/ext.hpp new file mode 100644 index 0000000..9ef0c92 --- /dev/null +++ b/include/gal/opengl/glm/ext.hpp @@ -0,0 +1,145 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @file glm/glm.hpp +/// @date 2009-05-01 / 2011-05-16 +/// @author Christophe Riccio +/// +/// @ref core (Dependence) +/// +/// @defgroup gtc GTC Extensions (Stable) +/// +/// @brief Functions and types that the GLSL specification doesn't define, but useful to have for a C++ program. +/// +/// GTC extensions aim to be stable. +/// +/// Even if it's highly unrecommended, it's possible to include all the extensions at once by +/// including <glm/ext.hpp>. Otherwise, each extension needs to be included a specific file. +/// +/// @defgroup gtx GTX Extensions (Experimental) +/// +/// @brief Functions and types that the GLSL specification doesn't define, but +/// useful to have for a C++ program. +/// +/// Experimental extensions are useful functions and types, but the development of +/// their API and functionality is not necessarily stable. They can change +/// substantially between versions. Backwards compatibility is not much of an issue +/// for them. +/// +/// Even if it's highly unrecommended, it's possible to include all the extensions +/// at once by including <glm/ext.hpp>. Otherwise, each extension needs to be +/// included a specific file. +/// +/// @defgroup virtrev VIRTREV Extensions +/// +/// @brief Extensions develop and maintain by Mathieu [matrem] Roumillac +/// (http://www.opengl.org/discussion_boards/ubbthreads.php?ubb=showprofile&User=22660). +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_ext +#define glm_ext + +#if(defined(GLM_MESSAGES) && !defined(GLM_MESSAGE_EXT_INCLUDED_DISPLAYED)) +# define GLM_MESSAGE_EXT_INCLUDED_DISPLAYED +# pragma message("GLM: All extensions included (not recommanded)") +#endif//GLM_MESSAGES + +#include "./gtc/constants.hpp" +#include "./gtc/epsilon.hpp" +#include "./gtc/half_float.hpp" +#include "./gtc/matrix_access.hpp" +#include "./gtc/matrix_integer.hpp" +#include "./gtc/matrix_inverse.hpp" +#include "./gtc/matrix_transform.hpp" +#include "./gtc/noise.hpp" +#include "./gtc/quaternion.hpp" +#include "./gtc/random.hpp" +#include "./gtc/reciprocal.hpp" +#include "./gtc/swizzle.hpp" +#include "./gtc/type_precision.hpp" +#include "./gtc/type_ptr.hpp" +#include "./gtc/ulp.hpp" + +#include "./gtx/associated_min_max.hpp" +#include "./gtx/bit.hpp" +#include "./gtx/closest_point.hpp" +#include "./gtx/color_cast.hpp" +#include "./gtx/color_space.hpp" +#include "./gtx/color_space_YCoCg.hpp" +#include "./gtx/compatibility.hpp" +#include "./gtx/component_wise.hpp" +#include "./gtx/euler_angles.hpp" +#include "./gtx/extend.hpp" +#include "./gtx/extented_min_max.hpp" +#include "./gtx/fast_exponential.hpp" +#include "./gtx/fast_square_root.hpp" +#include "./gtx/fast_trigonometry.hpp" +#include "./gtx/gradient_paint.hpp" +#include "./gtx/handed_coordinate_space.hpp" +#include "./gtx/inertia.hpp" +#include "./gtx/int_10_10_10_2.hpp" +#include "./gtx/integer.hpp" +#include "./gtx/intersect.hpp" +#include "./gtx/log_base.hpp" +#include "./gtx/matrix_cross_product.hpp" +#include "./gtx/matrix_interpolation.hpp" +#include "./gtx/matrix_major_storage.hpp" +#include "./gtx/matrix_operation.hpp" +#include "./gtx/matrix_query.hpp" +#include "./gtx/mixed_product.hpp" +#include "./gtx/multiple.hpp" +#include "./gtx/norm.hpp" +#include "./gtx/normal.hpp" +#include "./gtx/normalize_dot.hpp" +#include "./gtx/number_precision.hpp" +#include "./gtx/ocl_type.hpp" +#include "./gtx/optimum_pow.hpp" +#include "./gtx/orthonormalize.hpp" +#include "./gtx/perpendicular.hpp" +#include "./gtx/polar_coordinates.hpp" +#include "./gtx/projection.hpp" +#include "./gtx/quaternion.hpp" +#include "./gtx/raw_data.hpp" +#include "./gtx/rotate_vector.hpp" +#include "./gtx/spline.hpp" +#include "./gtx/std_based_type.hpp" +#include "./gtx/string_cast.hpp" +#include "./gtx/transform.hpp" +#include "./gtx/transform2.hpp" +#include "./gtx/vec1.hpp" +#include "./gtx/vector_access.hpp" +#include "./gtx/vector_angle.hpp" +#include "./gtx/vector_query.hpp" +#include "./gtx/verbose_operator.hpp" +#include "./gtx/wrap.hpp" + +#if(GLM_ARCH & GLM_ARCH_SSE2) +# include "./gtx/simd_vec4.hpp" +# include "./gtx/simd_mat4.hpp" +#endif + +#include "./virtrev/xstream.hpp" + +//const float goldenRatio = 1.618033988749894848f; +//const float pi = 3.141592653589793238f; + +#endif //glm_ext diff --git a/include/gal/opengl/glm/glm.hpp b/include/gal/opengl/glm/glm.hpp new file mode 100644 index 0000000..5474fe3 --- /dev/null +++ b/include/gal/opengl/glm/glm.hpp @@ -0,0 +1,129 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref core +/// @file glm/glm.hpp +/// @date 2005-01-14 / 2011-10-24 +/// @author Christophe Riccio +/// +/// @defgroup core GLM Core +/// +/// @brief The core of GLM, which implements exactly and only the GLSL specification to the degree possible. +/// +/// The GLM core consists of @ref core_types "C++ types that mirror GLSL types" and +/// C++ functions that mirror the GLSL functions. It also includes +/// @ref core_precision "a set of precision-based types" that can be used in the appropriate +/// functions. The C++ types are all based on a basic set of @ref core_template "template types". +/// +/// The best documentation for GLM Core is the current GLSL specification, +/// <a href="http://www.opengl.org/registry/doc/GLSLangSpec.4.20.8.clean.pdf">version 4.2 +/// (pdf file)</a>. +/// There are a few @ref pg_differences "differences" between GLM core and GLSL. +/// +/// GLM core functionnalities require <glm/glm.hpp> to be included to be used. +/// +/// @defgroup core_types Types +/// +/// @brief The standard types defined by the specification. +/// +/// These types are all typedefs of more generalized, template types. To see the definiton +/// of these template types, go to @ref core_template. +/// +/// @ingroup core +/// +/// @defgroup core_precision Precision types +/// +/// @brief Non-GLSL types that are used to define precision-based types. +/// +/// The GLSL language allows the user to define the precision of a particular variable. +/// In OpenGL's GLSL, these precision qualifiers have no effect; they are there for compatibility +/// with OpenGL ES's precision qualifiers, where they @em do have an effect. +/// +/// C++ has no language equivalent to precision qualifiers. So GLM provides the next-best thing: +/// a number of typedefs of the @ref core_template that use a particular precision. +/// +/// None of these types make any guarantees about the actual precision used. +/// +/// @ingroup core +/// +/// @defgroup core_template Template types +/// +/// @brief The generic template types used as the basis for the core types. +/// +/// These types are all templates used to define the actual @ref core_types. +/// These templetes are implementation details of GLM types and should not be used explicitly. +/// +/// @ingroup core +/////////////////////////////////////////////////////////////////////////////////// + +#include "core/_fixes.hpp" + +#ifndef glm_glm +#define glm_glm + +#include <cmath> +#include <climits> +#include <cfloat> +#include <limits> +#include <cstdio> +//#include <type_traits> +#include "core/setup.hpp" + +#if(defined(GLM_MESSAGES) && !defined(GLM_MESSAGE_CORE_INCLUDED_DISPLAYED)) +# define GLM_MESSAGE_CORE_INCLUDED_DISPLAYED +# pragma message("GLM: Core library included") +#endif//GLM_MESSAGE + +#include "./core/_detail.hpp" +#include "./core/_vectorize.hpp" +#include "./core/type.hpp" + +#include "./core/func_trigonometric.hpp" +#include "./core/func_exponential.hpp" +#include "./core/func_common.hpp" +#include "./core/func_packing.hpp" +#include "./core/func_geometric.hpp" +#include "./core/func_matrix.hpp" +#include "./core/func_vector_relational.hpp" +#include "./core/func_integer.hpp" +#include "./core/func_noise.hpp" +#include "./core/_swizzle.hpp" + +//////////////////// +// check type sizes +#ifndef GLM_STATIC_ASSERT_NULL + GLM_STATIC_ASSERT(sizeof(glm::detail::int8) == 1, "int8 size isn't 1 byte on this platform"); + GLM_STATIC_ASSERT(sizeof(glm::detail::int16) == 2, "int16 size isn't 2 bytes on this platform"); + GLM_STATIC_ASSERT(sizeof(glm::detail::int32) == 4, "int32 size isn't 4 bytes on this platform"); + GLM_STATIC_ASSERT(sizeof(glm::detail::int64) == 8, "int64 size isn't 8 bytes on this platform"); + + GLM_STATIC_ASSERT(sizeof(glm::detail::uint8) == 1, "uint8 size isn't 1 byte on this platform"); + GLM_STATIC_ASSERT(sizeof(glm::detail::uint16) == 2, "uint16 size isn't 2 bytes on this platform"); + GLM_STATIC_ASSERT(sizeof(glm::detail::uint32) == 4, "uint32 size isn't 4 bytes on this platform"); + GLM_STATIC_ASSERT(sizeof(glm::detail::uint64) == 8, "uint64 size isn't 8 bytes on this platform"); + + GLM_STATIC_ASSERT(sizeof(glm::detail::float16) == 2, "float16 size isn't 2 bytes on this platform"); + GLM_STATIC_ASSERT(sizeof(glm::detail::float32) == 4, "float32 size isn't 4 bytes on this platform"); + GLM_STATIC_ASSERT(sizeof(glm::detail::float64) == 8, "float64 size isn't 8 bytes on this platform"); +#endif//GLM_STATIC_ASSERT_NULL + +#endif//glm_glm diff --git a/include/gal/opengl/glm/gtc/constants.hpp b/include/gal/opengl/glm/gtc/constants.hpp new file mode 100644 index 0000000..4887629 --- /dev/null +++ b/include/gal/opengl/glm/gtc/constants.hpp @@ -0,0 +1,186 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtc_constants +/// @file glm/gtc/constants.hpp +/// @date 2011-09-30 / 2012-01-25 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// @see gtc_half_float (dependence) +/// +/// @defgroup gtc_constants GLM_GTC_constants +/// @ingroup gtc +/// +/// @brief Allow to perform bit operations on integer values +/// +/// <glm/gtc/constants.hpp> need to be included to use these features. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTC_constants +#define GLM_GTC_constants GLM_VERSION + +// Dependency: +#include "../glm.hpp" +#include "../gtc/half_float.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTC_constants extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_constants + /// @{ + + /// Return the epsilon constant for floating point types. + /// @todo Implement epsilon for half-precision floating point type. + /// @see gtc_constants + template <typename genType> + GLM_FUNC_DECL genType epsilon(); + + /// Return 0. + /// @see gtc_constants + template <typename genType> + GLM_FUNC_DECL genType zero(); + + /// Return 1. + /// @see gtc_constants + template <typename genType> + GLM_FUNC_DECL genType one(); + + /// Return the pi constant. + /// @see gtc_constants + template <typename genType> + GLM_FUNC_DECL genType pi(); + + /// Return square root of pi. + /// @see gtc_constants + template <typename genType> + GLM_FUNC_DECL genType root_pi(); + + /// Return pi / 2. + /// @see gtc_constants + template <typename genType> + GLM_FUNC_DECL genType half_pi(); + + /// Return pi / 4. + /// @see gtc_constants + template <typename genType> + GLM_FUNC_DECL genType quarter_pi(); + + /// Return 1 / pi. + /// @see gtc_constants + template <typename genType> + GLM_FUNC_DECL genType one_over_pi(); + + /// Return 2 / pi. + /// @see gtc_constants + template <typename genType> + GLM_FUNC_DECL genType two_over_pi(); + + /// Return 2 / sqrt(pi). + /// @see gtc_constants + template <typename genType> + GLM_FUNC_DECL genType two_over_root_pi(); + + /// Return 1 / sqrt(2). + /// @see gtc_constants + template <typename genType> + GLM_FUNC_DECL genType one_over_root_two(); + + /// Return sqrt(pi / 2). + /// @see gtc_constants + template <typename genType> + GLM_FUNC_DECL genType root_half_pi(); + + /// Return sqrt(2 * pi). + /// @see gtc_constants + template <typename genType> + GLM_FUNC_DECL genType root_two_pi(); + + /// Return sqrt(ln(4)). + /// @see gtc_constants + template <typename genType> + GLM_FUNC_DECL genType root_ln_four(); + + /// Return e constant. + /// @see gtc_constants + template <typename genType> + GLM_FUNC_DECL genType e(); + + /// Return Euler's constant. + /// @see gtc_constants + template <typename genType> + GLM_FUNC_DECL genType euler(); + + /// Return sqrt(2). + /// @see gtc_constants + template <typename genType> + GLM_FUNC_DECL genType root_two(); + + /// Return sqrt(3). + /// @see gtc_constants + template <typename genType> + GLM_FUNC_DECL genType root_three(); + + /// Return sqrt(5). + /// @see gtc_constants + template <typename genType> + GLM_FUNC_DECL genType root_five(); + + /// Return ln(2). + /// @see gtc_constants + template <typename genType> + GLM_FUNC_DECL genType ln_two(); + + /// Return ln(10). + /// @see gtc_constants + template <typename genType> + GLM_FUNC_DECL genType ln_ten(); + + /// Return ln(ln(2)). + /// @see gtc_constants + template <typename genType> + GLM_FUNC_DECL genType ln_ln_two(); + + /// Return 1 / 3. + /// @see gtc_constants + template <typename genType> + GLM_FUNC_DECL genType third(); + + /// Return 2 / 3. + /// @see gtc_constants + template <typename genType> + GLM_FUNC_DECL genType two_thirds(); + + /// Return the golden ratio constant. + /// @see gtc_constants + template <typename genType> + GLM_FUNC_DECL genType golden_ratio(); + + /// @} +} //namespace glm + +#include "constants.inl" + +#endif//GLM_GTC_constants diff --git a/include/gal/opengl/glm/gtc/constants.inl b/include/gal/opengl/glm/gtc/constants.inl new file mode 100644 index 0000000..e9bde75 --- /dev/null +++ b/include/gal/opengl/glm/gtc/constants.inl @@ -0,0 +1,186 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_constants +/// @file glm/gtx/constants.inl +/// @date 2011-10-14 / 2012-01-25 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template <typename genType> + GLM_FUNC_QUALIFIER genType epsilon() + { + return std::numeric_limits<genType>::epsilon(); + } + + template <> + GLM_FUNC_QUALIFIER half epsilon() + { + return half(1.19209290e-007); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType zero() + { + return genType(0); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType one() + { + return genType(1); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType pi() + { + return genType(3.14159265358979323846264338327950288); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType root_pi() + { + return genType(1.772453850905516027); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType half_pi() + { + return genType(1.57079632679489661923132169163975144); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType quarter_pi() + { + return genType(0.785398163397448309615660845819875721); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType one_over_pi() + { + return genType(0.318309886183790671537767526745028724); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType two_over_pi() + { + return genType(0.636619772367581343075535053490057448); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType two_over_root_pi() + { + return genType(1.12837916709551257389615890312154517); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType one_over_root_two() + { + return genType(0.707106781186547524400844362104849039); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType root_half_pi() + { + return genType(1.253314137315500251); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType root_two_pi() + { + return genType(2.506628274631000502); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType root_ln_four() + { + return genType(1.17741002251547469); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType e() + { + return genType(2.71828182845904523536); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType euler() + { + return genType(0.577215664901532860606); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType root_two() + { + return genType(1.41421356237309504880168872420969808); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType root_three() + { + return genType(1.73205080756887729352744634150587236); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType root_five() + { + return genType(2.23606797749978969640917366873127623); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType ln_two() + { + return genType(0.693147180559945309417232121458176568); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType ln_ten() + { + return genType(2.30258509299404568401799145468436421); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType ln_ln_two() + { + return genType(-0.3665129205816643); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType third() + { + return genType(0.3333333333333333333333333333333333333333); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType two_thirds() + { + return genType(0.666666666666666666666666666666666666667); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType golden_ratio() + { + return genType(1.61803398874989484820458683436563811); + } +} //namespace glm diff --git a/include/gal/opengl/glm/gtc/epsilon.hpp b/include/gal/opengl/glm/gtc/epsilon.hpp new file mode 100644 index 0000000..b8729f3 --- /dev/null +++ b/include/gal/opengl/glm/gtc/epsilon.hpp @@ -0,0 +1,94 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtc_epsilon +/// @file glm/gtc/epsilon.hpp +/// @date 2012-04-07 / 2012-04-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// @see gtc_half_float (dependence) +/// @see gtc_quaternion (dependence) +/// +/// @defgroup gtc_epsilon GLM_GTC_epsilon +/// @ingroup gtc +/// +/// @brief Comparison functions for a user defined epsilon values. +/// +/// <glm/gtc/epsilon.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTC_epsilon +#define GLM_GTC_epsilon GLM_VERSION + +// Dependency: +#include "../glm.hpp" +#include "../gtc/half_float.hpp" +#include "../gtc/quaternion.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTC_epsilon extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_epsilon + /// @{ + + /// Returns the component-wise compare of |x - y| < epsilon. + /// @see gtc_epsilon + template <typename genType> + typename genType::boolType epsilonEqual( + genType const & x, + genType const & y, + typename genType::value_type const & epsilon); + + /// Returns the component-wise compare of |x - y| < epsilon. + /// @see gtc_epsilon + template <typename genType> + typename genType::boolType epsilonEqual( + genType const & x, + genType const & y, + genType const & epsilon); + + /// Returns the component-wise compare of |x - y| < epsilon. + /// @see gtc_epsilon + template <typename genType> + typename genType::boolType epsilonNotEqual( + genType const & x, + genType const & y, + typename genType::value_type const & epsilon); + + /// Returns the component-wise compare of |x - y| >= epsilon. + /// @see gtc_epsilon + template <typename genType> + typename genType::boolType epsilonNotEqual( + genType const & x, + genType const & y, + genType const & epsilon); + + /// @} +}//namespace glm + +#include "epsilon.inl" + +#endif//GLM_GTC_epsilon diff --git a/include/gal/opengl/glm/gtc/epsilon.inl b/include/gal/opengl/glm/gtc/epsilon.inl new file mode 100644 index 0000000..ecfc4aa --- /dev/null +++ b/include/gal/opengl/glm/gtc/epsilon.inl @@ -0,0 +1,286 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtc_epsilon +/// @file glm/gtc/epsilon.inl +/// @date 2012-04-07 / 2012-04-07 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + GLM_FUNC_QUALIFIER bool epsilonEqual + ( + glm::half const & x, + glm::half const & y, + glm::half const & epsilon + ) + { + return abs(x - y) < epsilon; + } + + GLM_FUNC_QUALIFIER bool epsilonEqual + ( + float const & x, + float const & y, + float const & epsilon + ) + { + return abs(x - y) < epsilon; + } + + GLM_FUNC_QUALIFIER bool epsilonEqual + ( + double const & x, + double const & y, + double const & epsilon + ) + { + return abs(x - y) < epsilon; + } + + GLM_FUNC_QUALIFIER bool epsilonNotEqual + ( + glm::half const & x, + glm::half const & y, + glm::half const & epsilon + ) + { + return abs(x - y) >= epsilon; + } + + GLM_FUNC_QUALIFIER bool epsilonNotEqual + ( + float const & x, + float const & y, + float const & epsilon + ) + { + return abs(x - y) >= epsilon; + } + + GLM_FUNC_QUALIFIER bool epsilonNotEqual + ( + double const & x, + double const & y, + double const & epsilon + ) + { + return abs(x - y) >= epsilon; + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec2<bool> epsilonEqual + ( + detail::tvec2<valType> const & x, + detail::tvec2<valType> const & y, + valType const & epsilon) + { + return detail::tvec2<bool>( + abs(x.x - y.x) < epsilon, + abs(x.y - y.y) < epsilon); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec2<bool> epsilonEqual + ( + detail::tvec2<valType> const & x, + detail::tvec2<valType> const & y, + detail::tvec2<valType> const & epsilon + ) + { + return detail::tvec2<bool>( + abs(x.x - y.x) < epsilon.x, + abs(x.y - y.y) < epsilon.y); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec3<bool> epsilonEqual + ( + detail::tvec3<valType> const & x, + detail::tvec3<valType> const & y, + valType const & epsilon) + { + return detail::tvec3<bool>( + abs(x.x - y.x) < epsilon, + abs(x.y - y.y) < epsilon, + abs(x.z - y.z) < epsilon); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec3<bool> epsilonEqual + ( + detail::tvec3<valType> const & x, + detail::tvec3<valType> const & y, + detail::tvec3<valType> const & epsilon + ) + { + return detail::tvec3<bool>( + abs(x.x - y.x) < epsilon.x, + abs(x.y - y.y) < epsilon.y, + abs(x.z - y.z) < epsilon.z); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec4<bool> epsilonEqual + ( + detail::tvec4<valType> const & x, + detail::tvec4<valType> const & y, + valType const & epsilon + ) + { + return detail::tvec4<bool>( + abs(x.x - y.x) < epsilon, + abs(x.y - y.y) < epsilon, + abs(x.z - y.z) < epsilon, + abs(x.w - y.w) < epsilon); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec4<bool> epsilonEqual + ( + detail::tvec4<valType> const & x, + detail::tvec4<valType> const & y, + detail::tvec4<valType> const & epsilon + ) + { + return detail::tvec4<bool>( + abs(x.x - y.x) < epsilon.x, + abs(x.y - y.y) < epsilon.y, + abs(x.z - y.z) < epsilon.z, + abs(x.w - y.w) < epsilon.w); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec2<bool> epsilonNotEqual + ( + detail::tvec2<valType> const & x, + detail::tvec2<valType> const & y, + valType const & epsilon + ) + { + return detail::tvec2<bool>( + abs(x.x - y.x) >= epsilon, + abs(x.y - y.y) >= epsilon); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec2<bool> epsilonNotEqual + ( + detail::tvec2<valType> const & x, + detail::tvec2<valType> const & y, + detail::tvec2<valType> const & epsilon + ) + { + return detail::tvec2<bool>( + abs(x.x - y.x) >= epsilon.x, + abs(x.y - y.y) >= epsilon.y); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec3<bool> epsilonNotEqual + ( + detail::tvec3<valType> const & x, + detail::tvec3<valType> const & y, + valType const & epsilon + ) + { + return detail::tvec3<bool>( + abs(x.x - y.x) >= epsilon, + abs(x.y - y.y) >= epsilon, + abs(x.z - y.z) >= epsilon); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec3<bool> epsilonNotEqual + ( + detail::tvec3<valType> const & x, + detail::tvec3<valType> const & y, + detail::tvec3<valType> const & epsilon + ) + { + return detail::tvec3<bool>( + abs(x.x - y.x) >= epsilon.x, + abs(x.y - y.y) >= epsilon.y, + abs(x.z - y.z) >= epsilon.z); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec4<bool> epsilonNotEqual + ( + detail::tvec4<valType> const & x, + detail::tvec4<valType> const & y, + valType const & epsilon + ) + { + return detail::tvec4<bool>( + abs(x.x - y.x) >= epsilon, + abs(x.y - y.y) >= epsilon, + abs(x.z - y.z) >= epsilon, + abs(x.w - y.w) >= epsilon); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec4<bool> epsilonNotEqual + ( + detail::tvec4<valType> const & x, + detail::tvec4<valType> const & y, + detail::tvec4<valType> const & epsilon + ) + { + return detail::tvec4<bool>( + abs(x.x - y.x) >= epsilon.x, + abs(x.y - y.y) >= epsilon.y, + abs(x.z - y.z) >= epsilon.z, + abs(x.w - y.w) >= epsilon.w); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec4<bool> epsilonEqual + ( + detail::tquat<valType> const & x, + detail::tquat<valType> const & y, + valType const & epsilon + ) + { + return detail::tvec4<bool>( + abs(x.x - y.x) < epsilon, + abs(x.y - y.y) < epsilon, + abs(x.z - y.z) < epsilon, + abs(x.w - y.w) < epsilon); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec4<bool> epsilonNotEqual + ( + detail::tquat<valType> const & x, + detail::tquat<valType> const & y, + valType const & epsilon + ) + { + return detail::tvec4<bool>( + abs(x.x - y.x) >= epsilon, + abs(x.y - y.y) >= epsilon, + abs(x.z - y.z) >= epsilon, + abs(x.w - y.w) >= epsilon); + } +}//namespace glm diff --git a/include/gal/opengl/glm/gtc/half_float.hpp b/include/gal/opengl/glm/gtc/half_float.hpp new file mode 100644 index 0000000..fa0fe1a --- /dev/null +++ b/include/gal/opengl/glm/gtc/half_float.hpp @@ -0,0 +1,454 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtc_half_float +/// @file glm/gtc/half_float.hpp +/// @date 2009-04-29 / 2012-11-06 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// +/// @defgroup gtc_half_float GLM_GTC_half_float +/// @ingroup gtc +/// +/// Defines the half-precision floating-point type, along with various typedefs for vectors and matrices. +/// <glm/gtc/half_float.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTC_half_float +#define GLM_GTC_half_float GLM_VERSION + +// Dependency: +#include "../glm.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTC_half_float extension included") +#endif + +namespace glm{ +namespace detail +{ +#if(GLM_COMPONENT == GLM_COMPONENT_CXX98) + template <> + struct tvec2<half> + { + enum ctor{null}; + typedef half value_type; + typedef std::size_t size_type; + + GLM_FUNC_DECL size_type length() const; + static GLM_FUNC_DECL size_type value_size(); + + typedef tvec2<half> type; + typedef tvec2<bool> bool_type; + + ////////////////////////////////////// + // Data + + half x, y; + + ////////////////////////////////////// + // Accesses + + GLM_FUNC_DECL half & operator[](size_type i); + GLM_FUNC_DECL half const & operator[](size_type i) const; + + ////////////////////////////////////// + // Implicit basic constructors + + GLM_FUNC_DECL tvec2(); + GLM_FUNC_DECL tvec2(tvec2<half> const & v); + + ////////////////////////////////////// + // Explicit basic constructors + + GLM_FUNC_DECL explicit tvec2(ctor); + GLM_FUNC_DECL explicit tvec2( + half const & s); + GLM_FUNC_DECL explicit tvec2( + half const & s1, + half const & s2); + + ////////////////////////////////////// + // Swizzle constructors + + GLM_FUNC_DECL tvec2(tref2<half> const & r); + + ////////////////////////////////////// + // Convertion scalar constructors + + //! Explicit converions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename U> + GLM_FUNC_DECL explicit tvec2(U const & x); + //! Explicit converions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename U, typename V> + GLM_FUNC_DECL explicit tvec2(U const & x, V const & y); + + ////////////////////////////////////// + // Convertion vector constructors + + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename U> + GLM_FUNC_DECL explicit tvec2(tvec2<U> const & v); + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename U> + GLM_FUNC_DECL explicit tvec2(tvec3<U> const & v); + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename U> + GLM_FUNC_DECL explicit tvec2(tvec4<U> const & v); + + ////////////////////////////////////// + // Unary arithmetic operators + + GLM_FUNC_DECL tvec2<half>& operator= (tvec2<half> const & v); + + GLM_FUNC_DECL tvec2<half>& operator+=(half const & s); + GLM_FUNC_DECL tvec2<half>& operator+=(tvec2<half> const & v); + GLM_FUNC_DECL tvec2<half>& operator-=(half const & s); + GLM_FUNC_DECL tvec2<half>& operator-=(tvec2<half> const & v); + GLM_FUNC_DECL tvec2<half>& operator*=(half const & s); + GLM_FUNC_DECL tvec2<half>& operator*=(tvec2<half> const & v); + GLM_FUNC_DECL tvec2<half>& operator/=(half const & s); + GLM_FUNC_DECL tvec2<half>& operator/=(tvec2<half> const & v); + GLM_FUNC_DECL tvec2<half>& operator++(); + GLM_FUNC_DECL tvec2<half>& operator--(); + + ////////////////////////////////////// + // Swizzle operators + + GLM_FUNC_DECL half swizzle(comp X) const; + GLM_FUNC_DECL tvec2<half> swizzle(comp X, comp Y) const; + GLM_FUNC_DECL tvec3<half> swizzle(comp X, comp Y, comp Z) const; + GLM_FUNC_DECL tvec4<half> swizzle(comp X, comp Y, comp Z, comp W) const; + GLM_FUNC_DECL tref2<half> swizzle(comp X, comp Y); + }; + + template <> + struct tvec3<half> + { + enum ctor{null}; + typedef half value_type; + typedef std::size_t size_type; + GLM_FUNC_DECL size_type length() const; + static GLM_FUNC_DECL size_type value_size(); + + typedef tvec3<half> type; + typedef tvec3<bool> bool_type; + + ////////////////////////////////////// + // Data + + half x, y, z; + + ////////////////////////////////////// + // Accesses + + GLM_FUNC_DECL half & operator[](size_type i); + GLM_FUNC_DECL half const & operator[](size_type i) const; + + ////////////////////////////////////// + // Implicit basic constructors + + GLM_FUNC_DECL tvec3(); + GLM_FUNC_DECL tvec3(tvec3<half> const & v); + + ////////////////////////////////////// + // Explicit basic constructors + + GLM_FUNC_DECL explicit tvec3(ctor); + GLM_FUNC_DECL explicit tvec3( + half const & s); + GLM_FUNC_DECL explicit tvec3( + half const & s1, + half const & s2, + half const & s3); + + ////////////////////////////////////// + // Swizzle constructors + + GLM_FUNC_DECL tvec3(tref3<half> const & r); + + ////////////////////////////////////// + // Convertion scalar constructors + + //! Explicit converions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename U> + GLM_FUNC_DECL explicit tvec3(U const & x); + //! Explicit converions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename U, typename V, typename W> + GLM_FUNC_DECL explicit tvec3(U const & x, V const & y, W const & z); + + ////////////////////////////////////// + // Convertion vector constructors + + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename A, typename B> + GLM_FUNC_DECL explicit tvec3(tvec2<A> const & v, B const & s); + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename A, typename B> + GLM_FUNC_DECL explicit tvec3(A const & s, tvec2<B> const & v); + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename U> + GLM_FUNC_DECL explicit tvec3(tvec3<U> const & v); + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename U> + GLM_FUNC_DECL explicit tvec3(tvec4<U> const & v); + + ////////////////////////////////////// + // Unary arithmetic operators + + GLM_FUNC_DECL tvec3<half>& operator= (tvec3<half> const & v); + + GLM_FUNC_DECL tvec3<half>& operator+=(half const & s); + GLM_FUNC_DECL tvec3<half>& operator+=(tvec3<half> const & v); + GLM_FUNC_DECL tvec3<half>& operator-=(half const & s); + GLM_FUNC_DECL tvec3<half>& operator-=(tvec3<half> const & v); + GLM_FUNC_DECL tvec3<half>& operator*=(half const & s); + GLM_FUNC_DECL tvec3<half>& operator*=(tvec3<half> const & v); + GLM_FUNC_DECL tvec3<half>& operator/=(half const & s); + GLM_FUNC_DECL tvec3<half>& operator/=(tvec3<half> const & v); + GLM_FUNC_DECL tvec3<half>& operator++(); + GLM_FUNC_DECL tvec3<half>& operator--(); + + ////////////////////////////////////// + // Swizzle operators + + GLM_FUNC_DECL half swizzle(comp X) const; + GLM_FUNC_DECL tvec2<half> swizzle(comp X, comp Y) const; + GLM_FUNC_DECL tvec3<half> swizzle(comp X, comp Y, comp Z) const; + GLM_FUNC_DECL tvec4<half> swizzle(comp X, comp Y, comp Z, comp W) const; + GLM_FUNC_DECL tref3<half> swizzle(comp X, comp Y, comp Z); + }; + + template <> + struct tvec4<half> + { + enum ctor{null}; + typedef half value_type; + typedef std::size_t size_type; + GLM_FUNC_DECL size_type length() const; + static GLM_FUNC_DECL size_type value_size(); + + typedef tvec4<half> type; + typedef tvec4<bool> bool_type; + + ////////////////////////////////////// + // Data + + half x, y, z, w; + + ////////////////////////////////////// + // Accesses + + GLM_FUNC_DECL half & operator[](size_type i); + GLM_FUNC_DECL half const & operator[](size_type i) const; + + ////////////////////////////////////// + // Implicit basic constructors + + GLM_FUNC_DECL tvec4(); + GLM_FUNC_DECL tvec4(tvec4<half> const & v); + + ////////////////////////////////////// + // Explicit basic constructors + + GLM_FUNC_DECL explicit tvec4(ctor); + GLM_FUNC_DECL explicit tvec4( + half const & s); + GLM_FUNC_DECL explicit tvec4( + half const & s0, + half const & s1, + half const & s2, + half const & s3); + + ////////////////////////////////////// + // Swizzle constructors + + GLM_FUNC_DECL tvec4(tref4<half> const & r); + + ////////////////////////////////////// + // Convertion scalar constructors + + //! Explicit converions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename U> + GLM_FUNC_DECL explicit tvec4(U const & x); + //! Explicit converions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename A, typename B, typename C, typename D> + GLM_FUNC_DECL explicit tvec4(A const & x, B const & y, C const & z, D const & w); + + ////////////////////////////////////// + // Convertion vector constructors + + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename A, typename B, typename C> + GLM_FUNC_DECL explicit tvec4(tvec2<A> const & v, B const & s1, C const & s2); + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename A, typename B, typename C> + GLM_FUNC_DECL explicit tvec4(A const & s1, tvec2<B> const & v, C const & s2); + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename A, typename B, typename C> + GLM_FUNC_DECL explicit tvec4(A const & s1, B const & s2, tvec2<C> const & v); + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename A, typename B> + GLM_FUNC_DECL explicit tvec4(tvec3<A> const & v, B const & s); + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename A, typename B> + GLM_FUNC_DECL explicit tvec4(A const & s, tvec3<B> const & v); + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename A, typename B> + GLM_FUNC_DECL explicit tvec4(tvec2<A> const & v1, tvec2<B> const & v2); + //! Explicit conversions (From section 5.4.1 Conversion and scalar constructors of GLSL 1.30.08 specification) + template <typename U> + GLM_FUNC_DECL explicit tvec4(tvec4<U> const & v); + + ////////////////////////////////////// + // Unary arithmetic operators + + GLM_FUNC_DECL tvec4<half>& operator= (tvec4<half> const & v); + + GLM_FUNC_DECL tvec4<half>& operator+=(half const & s); + GLM_FUNC_DECL tvec4<half>& operator+=(tvec4<half> const & v); + GLM_FUNC_DECL tvec4<half>& operator-=(half const & s); + GLM_FUNC_DECL tvec4<half>& operator-=(tvec4<half> const & v); + GLM_FUNC_DECL tvec4<half>& operator*=(half const & s); + GLM_FUNC_DECL tvec4<half>& operator*=(tvec4<half> const & v); + GLM_FUNC_DECL tvec4<half>& operator/=(half const & s); + GLM_FUNC_DECL tvec4<half>& operator/=(tvec4<half> const & v); + GLM_FUNC_DECL tvec4<half>& operator++(); + GLM_FUNC_DECL tvec4<half>& operator--(); + + ////////////////////////////////////// + // Swizzle operators + + GLM_FUNC_DECL half swizzle(comp X) const; + GLM_FUNC_DECL tvec2<half> swizzle(comp X, comp Y) const; + GLM_FUNC_DECL tvec3<half> swizzle(comp X, comp Y, comp Z) const; + GLM_FUNC_DECL tvec4<half> swizzle(comp X, comp Y, comp Z, comp W) const; + GLM_FUNC_DECL tref4<half> swizzle(comp X, comp Y, comp Z, comp W); + }; +#endif//(GLM_COMPONENT == GLM_COMPONENT_CXX98) +} +//namespace detail + + /// @addtogroup gtc_half_float + /// @{ + + /// Type for half-precision floating-point numbers. + /// @see gtc_half_float + typedef detail::half half; + + /// Vector of 2 half-precision floating-point numbers. + /// @see gtc_half_float + typedef detail::tvec2<detail::half> hvec2; + + /// Vector of 3 half-precision floating-point numbers. + /// @see gtc_half_float + typedef detail::tvec3<detail::half> hvec3; + + /// Vector of 4 half-precision floating-point numbers. + /// @see gtc_half_float + typedef detail::tvec4<detail::half> hvec4; + + /// 2 * 2 matrix of half-precision floating-point numbers. + /// @see gtc_half_float + typedef detail::tmat2x2<detail::half> hmat2; + + /// 3 * 3 matrix of half-precision floating-point numbers. + /// @see gtc_half_float + typedef detail::tmat3x3<detail::half> hmat3; + + /// 4 * 4 matrix of half-precision floating-point numbers. + /// @see gtc_half_float + typedef detail::tmat4x4<detail::half> hmat4; + + /// 2 * 2 matrix of half-precision floating-point numbers. + /// @see gtc_half_float + typedef detail::tmat2x2<detail::half> hmat2x2; + + /// 2 * 3 matrix of half-precision floating-point numbers. + /// @see gtc_half_float + typedef detail::tmat2x3<detail::half> hmat2x3; + + /// 2 * 4 matrix of half-precision floating-point numbers. + /// @see gtc_half_float + typedef detail::tmat2x4<detail::half> hmat2x4; + + /// 3 * 2 matrix of half-precision floating-point numbers. + /// @see gtc_half_float + typedef detail::tmat3x2<detail::half> hmat3x2; + + /// 3 * 3 matrix of half-precision floating-point numbers. + /// @see gtc_half_float + typedef detail::tmat3x3<detail::half> hmat3x3; + + /// 3 * 4 matrix of half-precision floating-point numbers. + /// @see gtc_half_float + typedef detail::tmat3x4<detail::half> hmat3x4; + + /// 4 * 2 matrix of half-precision floating-point numbers. + /// @see gtc_half_float + typedef detail::tmat4x2<detail::half> hmat4x2; + + /// 4 * 3 matrix of half-precision floating-point numbers. + /// @see gtc_half_float + typedef detail::tmat4x3<detail::half> hmat4x3; + + /// 4 * 4 matrix of half-precision floating-point numbers. + /// @see gtc_half_float + typedef detail::tmat4x4<detail::half> hmat4x4; + + /// Returns the absolute value of a half-precision floating-point value + /// @see gtc_half_float + GLM_FUNC_DECL half abs(half const & x); + + /// Returns the absolute value of a half-precision floating-point two dimensional vector + /// @see gtc_half_float + GLM_FUNC_DECL hvec2 abs(hvec2 const & x); + + /// Returns the absolute value of a half-precision floating-point three dimensional vector + /// @see gtc_half_float + GLM_FUNC_DECL hvec3 abs(hvec3 const & x); + + /// Returns the absolute value of a half-precision floating-point four dimensional vector + /// @see gtc_half_float + GLM_FUNC_DECL hvec4 abs(hvec4 const & x); + + /// Selects which vector each returned component comes + /// from. For a component of <a> that is false, the + /// corresponding component of x is returned. For a + /// component of a that is true, the corresponding + /// component of y is returned. Components of x and y that + /// are not selected are allowed to be invalid floating point + /// values and will have no effect on the results. Thus, this + /// provides different functionality than + /// genType mix(genType x, genType y, genType(a)) + /// where a is a Boolean vector. + /// + /// @see gtc_half_float + GLM_FUNC_DECL half mix(half const & x, half const & y, bool const & a); + + /// @} +}// namespace glm + +#include "half_float.inl" + +#endif//GLM_GTC_half_float diff --git a/include/gal/opengl/glm/gtc/half_float.inl b/include/gal/opengl/glm/gtc/half_float.inl new file mode 100644 index 0000000..57dae8e --- /dev/null +++ b/include/gal/opengl/glm/gtc/half_float.inl @@ -0,0 +1,1050 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtc_half_float +/// @file glm/gtc/half_float.inl +/// @date 2009-04-29 / 2012-11-06 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +namespace glm{ +namespace detail +{ +#if(GLM_COMPONENT == GLM_COMPONENT_CXX98) + + ////////////////////////////////////// + // hvec2 + + GLM_FUNC_QUALIFIER tvec2<half>::size_type tvec2<half>::length() const + { + return 2; + } + + GLM_FUNC_QUALIFIER tvec2<half>::size_type tvec2<half>::value_size() + { + return 2; + } + + ////////////////////////////////////// + // Accesses + + GLM_FUNC_QUALIFIER half & tvec2<half>::operator[](tvec2<half>::size_type i) + { + assert(/*i >= tvec2<half>::size_type(0) && */i < tvec2<half>::value_size()); + return (&x)[i]; + } + + GLM_FUNC_QUALIFIER half const & tvec2<half>::operator[](tvec2<half>::size_type i) const + { + assert(/*i >= tvec2<half>::size_type(0) && */i < tvec2<half>::value_size()); + return (&x)[i]; + } + + ////////////////////////////////////// + // Implicit basic constructors + + GLM_FUNC_QUALIFIER tvec2<half>::tvec2() : + x(half(0.f)), + y(half(0.f)) + {} + + GLM_FUNC_QUALIFIER tvec2<half>::tvec2 + ( + tvec2<half> const & v + ) : + x(v.x), + y(v.y) + {} + + ////////////////////////////////////// + // Explicit basic constructors + + GLM_FUNC_QUALIFIER tvec2<half>::tvec2 + ( + half const & s + ) : + x(s), + y(s) + {} + + GLM_FUNC_QUALIFIER tvec2<half>::tvec2 + ( + half const & s1, + half const & s2 + ) : + x(s1), + y(s2) + {} + + ////////////////////////////////////// + // Swizzle constructors + + GLM_FUNC_QUALIFIER tvec2<half>::tvec2 + ( + tref2<half> const & r + ) : + x(r.x), + y(r.y) + {} + + ////////////////////////////////////// + // Convertion scalar constructors + + template <typename U> + GLM_FUNC_QUALIFIER tvec2<half>::tvec2 + ( + U const & x + ) : + x(half(x)), + y(half(x)) + {} + + template <typename U, typename V> + GLM_FUNC_QUALIFIER tvec2<half>::tvec2 + ( + U const & x, + V const & y + ) : + x(half(x)), + y(half(y)) + {} + + ////////////////////////////////////// + // Convertion vector constructors + + template <typename U> + GLM_FUNC_QUALIFIER tvec2<half>::tvec2 + ( + tvec2<U> const & v + ) : + x(half(v.x)), + y(half(v.y)) + {} + + template <typename U> + GLM_FUNC_QUALIFIER tvec2<half>::tvec2 + ( + tvec3<U> const & v + ) : + x(half(v.x)), + y(half(v.y)) + {} + + template <typename U> + GLM_FUNC_QUALIFIER tvec2<half>::tvec2 + ( + tvec4<U> const & v + ) : + x(half(v.x)), + y(half(v.y)) + {} + + ////////////////////////////////////// + // Unary arithmetic operators + + GLM_FUNC_QUALIFIER tvec2<half> & tvec2<half>::operator= + ( + tvec2<half> const & v + ) + { + this->x = v.x; + this->y = v.y; + return *this; + } + + GLM_FUNC_QUALIFIER tvec2<half> & tvec2<half>::operator+= + ( + half const & s + ) + { + this->x += s; + this->y += s; + return *this; + } + + GLM_FUNC_QUALIFIER tvec2<half> & tvec2<half>::operator+= + ( + tvec2<half> const & v + ) + { + this->x += v.x; + this->y += v.y; + return *this; + } + + GLM_FUNC_QUALIFIER tvec2<half> & tvec2<half>::operator-= + ( + half const & s + ) + { + this->x -= s; + this->y -= s; + return *this; + } + + GLM_FUNC_QUALIFIER tvec2<half> & tvec2<half>::operator-= + ( + tvec2<half> const & v + ) + { + this->x -= v.x; + this->y -= v.y; + return *this; + } + + GLM_FUNC_QUALIFIER tvec2<half>& tvec2<half>::operator*= + ( + half const & s + ) + { + this->x *= s; + this->y *= s; + return *this; + } + + GLM_FUNC_QUALIFIER tvec2<half> & tvec2<half>::operator*= + ( + tvec2<half> const & v + ) + { + this->x *= v.x; + this->y *= v.y; + return *this; + } + + GLM_FUNC_QUALIFIER tvec2<half> & tvec2<half>::operator/= + ( + half const & s + ) + { + this->x /= s; + this->y /= s; + return *this; + } + + GLM_FUNC_QUALIFIER tvec2<half> & tvec2<half>::operator/= + ( + tvec2<half> const & v + ) + { + this->x /= v.x; + this->y /= v.y; + return *this; + } + + GLM_FUNC_QUALIFIER tvec2<half> & tvec2<half>::operator++() + { + ++this->x; + ++this->y; + return *this; + } + + GLM_FUNC_QUALIFIER tvec2<half>& tvec2<half>::operator--() + { + --this->x; + --this->y; + return *this; + } + + ////////////////////////////////////// + // Swizzle operators + + GLM_FUNC_QUALIFIER half tvec2<half>::swizzle(comp x) const + { + return (*this)[x]; + } + + GLM_FUNC_QUALIFIER tvec2<half> tvec2<half>::swizzle(comp x, comp y) const + { + return tvec2<half>( + (*this)[x], + (*this)[y]); + } + + GLM_FUNC_QUALIFIER tvec3<half> tvec2<half>::swizzle(comp x, comp y, comp z) const + { + return tvec3<half>( + (*this)[x], + (*this)[y], + (*this)[z]); + } + + GLM_FUNC_QUALIFIER tvec4<half> tvec2<half>::swizzle(comp x, comp y, comp z, comp w) const + { + return tvec4<half>( + (*this)[x], + (*this)[y], + (*this)[z], + (*this)[w]); + } + + GLM_FUNC_QUALIFIER tref2<half> tvec2<half>::swizzle(comp x, comp y) + { + return tref2<half>( + (*this)[x], + (*this)[y]); + } + + ////////////////////////////////////// + // hvec3 + + GLM_FUNC_QUALIFIER tvec3<half>::size_type tvec3<half>::length() const + { + return 3; + } + + GLM_FUNC_QUALIFIER tvec3<half>::size_type tvec3<half>::value_size() + { + return 3; + } + + ////////////////////////////////////// + // Accesses + + GLM_FUNC_QUALIFIER half & tvec3<half>::operator[] + ( + tvec3<half>::size_type i + ) + { + assert(/*i >= tvec3<half>::size_type(0) &&*/ i < tvec3<half>::value_size()); + + return (&x)[i]; + } + + GLM_FUNC_QUALIFIER half const & tvec3<half>::operator[] + ( + tvec3<half>::size_type i + ) const + { + assert(/*i >= tvec3<half>::size_type(0) &&*/ i < tvec3<half>::value_size()); + + return (&x)[i]; + } + + ////////////////////////////////////// + // Implicit basic constructors + + GLM_FUNC_QUALIFIER tvec3<half>::tvec3() : + x(half(0)), + y(half(0)), + z(half(0)) + {} + + GLM_FUNC_QUALIFIER tvec3<half>::tvec3 + ( + tvec3<half> const & v + ) : + x(v.x), + y(v.y), + z(v.z) + {} + + ////////////////////////////////////// + // Explicit basic constructors + + GLM_FUNC_QUALIFIER tvec3<half>::tvec3 + ( + half const & s + ) : + x(s), + y(s), + z(s) + {} + + GLM_FUNC_QUALIFIER tvec3<half>::tvec3 + ( + half const & s0, + half const & s1, + half const & s2 + ) : + x(s0), + y(s1), + z(s2) + {} + + ////////////////////////////////////// + // Swizzle constructors + + GLM_FUNC_QUALIFIER tvec3<half>::tvec3 + ( + tref3<half> const & r + ) : + x(r.x), + y(r.y), + z(r.z) + {} + + ////////////////////////////////////// + // Convertion scalar constructors + + template <typename U> + GLM_FUNC_QUALIFIER tvec3<half>::tvec3 + ( + U const & x + ) : + x(half(x)), + y(half(x)), + z(half(x)) + {} + + template <typename A, typename B, typename C> + GLM_FUNC_QUALIFIER tvec3<half>::tvec3 + ( + A const & x, + B const & y, + C const & z + ) : + x(half(x)), + y(half(y)), + z(half(z)) + {} + + ////////////////////////////////////// + // Convertion vector constructors + + template <typename A, typename B> + GLM_FUNC_QUALIFIER tvec3<half>::tvec3 + ( + tvec2<A> const & v, + B const & s + ) : + x(half(v.x)), + y(half(v.y)), + z(half(s)) + {} + + template <typename A, typename B> + GLM_FUNC_QUALIFIER tvec3<half>::tvec3 + ( + A const & s, + tvec2<B> const & v + ) : + x(half(s)), + y(half(v.x)), + z(half(v.y)) + {} + + template <typename U> + GLM_FUNC_QUALIFIER tvec3<half>::tvec3 + ( + tvec3<U> const & v + ) : + x(half(v.x)), + y(half(v.y)), + z(half(v.z)) + {} + + template <typename U> + GLM_FUNC_QUALIFIER tvec3<half>::tvec3 + ( + tvec4<U> const & v + ) : + x(half(v.x)), + y(half(v.y)), + z(half(v.z)) + {} + + ////////////////////////////////////// + // Unary arithmetic operators + + GLM_FUNC_QUALIFIER tvec3<half> & tvec3<half>::operator= + ( + tvec3<half> const & v + ) + { + this->x = v.x; + this->y = v.y; + this->z = v.z; + return *this; + } + + GLM_FUNC_QUALIFIER tvec3<half> & tvec3<half>::operator+= + ( + half const & s + ) + { + this->x += s; + this->y += s; + this->z += s; + return *this; + } + + GLM_FUNC_QUALIFIER tvec3<half> & tvec3<half>::operator+= + ( + tvec3<half> const & v + ) + { + this->x += v.x; + this->y += v.y; + this->z += v.z; + return *this; + } + + GLM_FUNC_QUALIFIER tvec3<half> & tvec3<half>::operator-= + ( + half const & s + ) + { + this->x -= s; + this->y -= s; + this->z -= s; + return *this; + } + + GLM_FUNC_QUALIFIER tvec3<half> & tvec3<half>::operator-= + ( + tvec3<half> const & v + ) + { + this->x -= v.x; + this->y -= v.y; + this->z -= v.z; + return *this; + } + + GLM_FUNC_QUALIFIER tvec3<half> & tvec3<half>::operator*= + ( + half const & s + ) + { + this->x *= s; + this->y *= s; + this->z *= s; + return *this; + } + + GLM_FUNC_QUALIFIER tvec3<half> & tvec3<half>::operator*= + ( + tvec3<half> const & v + ) + { + this->x *= v.x; + this->y *= v.y; + this->z *= v.z; + return *this; + } + + GLM_FUNC_QUALIFIER tvec3<half> & tvec3<half>::operator/= + ( + half const & s + ) + { + this->x /= s; + this->y /= s; + this->z /= s; + return *this; + } + + GLM_FUNC_QUALIFIER tvec3<half> & tvec3<half>::operator/= + ( + tvec3<half> const & v + ) + { + this->x /= v.x; + this->y /= v.y; + this->z /= v.z; + return *this; + } + + GLM_FUNC_QUALIFIER tvec3<half> & tvec3<half>::operator++() + { + ++this->x; + ++this->y; + ++this->z; + return *this; + } + + GLM_FUNC_QUALIFIER tvec3<half> & tvec3<half>::operator--() + { + --this->x; + --this->y; + --this->z; + return *this; + } + + ////////////////////////////////////// + // Swizzle operators + + GLM_FUNC_QUALIFIER half tvec3<half>::swizzle(comp x) const + { + return (*this)[x]; + } + + GLM_FUNC_QUALIFIER tvec2<half> tvec3<half>::swizzle(comp x, comp y) const + { + return tvec2<half>( + (*this)[x], + (*this)[y]); + } + + GLM_FUNC_QUALIFIER tvec3<half> tvec3<half>::swizzle(comp x, comp y, comp z) const + { + return tvec3<half>( + (*this)[x], + (*this)[y], + (*this)[z]); + } + + GLM_FUNC_QUALIFIER tvec4<half> tvec3<half>::swizzle(comp x, comp y, comp z, comp w) const + { + return tvec4<half>( + (*this)[x], + (*this)[y], + (*this)[z], + (*this)[w]); + } + + GLM_FUNC_QUALIFIER tref3<half> tvec3<half>::swizzle(comp x, comp y, comp z) + { + return tref3<half>( + (*this)[x], + (*this)[y], + (*this)[z]); + } + + ////////////////////////////////////// + // hvec4 + + GLM_FUNC_QUALIFIER tvec4<half>::size_type tvec4<half>::length() const + { + return 4; + } + + GLM_FUNC_QUALIFIER tvec4<half>::size_type tvec4<half>::value_size() + { + return 4; + } + + ////////////////////////////////////// + // Accesses + + GLM_FUNC_QUALIFIER half & tvec4<half>::operator[] + ( + tvec4<half>::size_type i + ) + { + assert(/*i >= tvec4<half>::size_type(0) && */i < tvec4<half>::value_size()); + + return (&x)[i]; + } + + GLM_FUNC_QUALIFIER half const & tvec4<half>::operator[] + ( + tvec4<half>::size_type i + ) const + { + assert(/*i >= tvec4<half>::size_type(0) && */i < tvec4<half>::value_size()); + + return (&x)[i]; + } + + ////////////////////////////////////// + // Implicit basic constructors + + GLM_FUNC_QUALIFIER tvec4<half>::tvec4() : + x(half(0)), + y(half(0)), + z(half(0)), + w(half(0)) + {} + + GLM_FUNC_QUALIFIER tvec4<half>::tvec4 + ( + tvec4<half> const & v + ) : + x(v.x), + y(v.y), + z(v.z), + w(v.w) + {} + + ////////////////////////////////////// + // Explicit basic constructors + + GLM_FUNC_QUALIFIER tvec4<half>::tvec4 + ( + half const & s + ) : + x(s), + y(s), + z(s), + w(s) + {} + + GLM_FUNC_QUALIFIER tvec4<half>::tvec4 + ( + half const & s1, + half const & s2, + half const & s3, + half const & s4 + ) : + x(s1), + y(s2), + z(s3), + w(s4) + {} + + ////////////////////////////////////// + // Swizzle constructors + + GLM_FUNC_QUALIFIER tvec4<half>::tvec4 + ( + tref4<half> const & r + ) : + x(r.x), + y(r.y), + z(r.z), + w(r.w) + {} + + ////////////////////////////////////// + // Convertion scalar constructors + + template <typename U> + GLM_FUNC_QUALIFIER tvec4<half>::tvec4 + ( + U const & x + ) : + x(half(x)), + y(half(x)), + z(half(x)), + w(half(x)) + {} + + template <typename A, typename B, typename C, typename D> + GLM_FUNC_QUALIFIER tvec4<half>::tvec4 + ( + A const & x, + B const & y, + C const & z, + D const & w + ) : + x(half(x)), + y(half(y)), + z(half(z)), + w(half(w)) + {} + + ////////////////////////////////////// + // Convertion vector constructors + + template <typename A, typename B, typename C> + GLM_FUNC_QUALIFIER tvec4<half>::tvec4 + ( + tvec2<A> const & v, + B const & s1, + C const & s2 + ) : + x(half(v.x)), + y(half(v.y)), + z(half(s1)), + w(half(s2)) + {} + + template <typename A, typename B, typename C> + GLM_FUNC_QUALIFIER tvec4<half>::tvec4 + ( + A const & s1, + tvec2<B> const & v, + C const & s2 + ) : + x(half(s1)), + y(half(v.x)), + z(half(v.y)), + w(half(s2)) + {} + + template <typename A, typename B, typename C> + GLM_FUNC_QUALIFIER tvec4<half>::tvec4 + ( + A const & s1, + B const & s2, + tvec2<C> const & v + ) : + x(half(s1)), + y(half(s2)), + z(half(v.x)), + w(half(v.y)) + {} + + template <typename A, typename B> + GLM_FUNC_QUALIFIER tvec4<half>::tvec4 + ( + tvec3<A> const & v, + B const & s + ) : + x(half(v.x)), + y(half(v.y)), + z(half(v.z)), + w(half(s)) + {} + + template <typename A, typename B> + GLM_FUNC_QUALIFIER tvec4<half>::tvec4 + ( + A const & s, + tvec3<B> const & v + ) : + x(half(s)), + y(half(v.x)), + z(half(v.y)), + w(half(v.z)) + {} + + template <typename A, typename B> + GLM_FUNC_QUALIFIER tvec4<half>::tvec4 + ( + tvec2<A> const & v1, + tvec2<B> const & v2 + ) : + x(half(v1.x)), + y(half(v1.y)), + z(half(v2.x)), + w(half(v2.y)) + {} + + template <typename U> + GLM_FUNC_QUALIFIER tvec4<half>::tvec4 + ( + tvec4<U> const & v + ) : + x(half(v.x)), + y(half(v.y)), + z(half(v.z)), + w(half(v.w)) + {} + + ////////////////////////////////////// + // Unary arithmetic operators + + GLM_FUNC_QUALIFIER tvec4<half>& tvec4<half>::operator= + ( + tvec4<half> const & v + ) + { + this->x = v.x; + this->y = v.y; + this->z = v.z; + this->w = v.w; + return *this; + } + + GLM_FUNC_QUALIFIER tvec4<half>& tvec4<half>::operator+= + ( + half const & s + ) + { + this->x += s; + this->y += s; + this->z += s; + this->w += s; + return *this; + } + + GLM_FUNC_QUALIFIER tvec4<half>& tvec4<half>::operator+= + ( + tvec4<half> const & v + ) + { + this->x += v.x; + this->y += v.y; + this->z += v.z; + this->w += v.w; + return *this; + } + + GLM_FUNC_QUALIFIER tvec4<half>& tvec4<half>::operator-= + ( + half const & s + ) + { + this->x -= s; + this->y -= s; + this->z -= s; + this->w -= s; + return *this; + } + + GLM_FUNC_QUALIFIER tvec4<half>& tvec4<half>::operator-= + ( + tvec4<half> const & v + ) + { + this->x -= v.x; + this->y -= v.y; + this->z -= v.z; + this->w -= v.w; + return *this; + } + + GLM_FUNC_QUALIFIER tvec4<half>& tvec4<half>::operator*= + ( + half const & s + ) + { + this->x *= s; + this->y *= s; + this->z *= s; + this->w *= s; + return *this; + } + + GLM_FUNC_QUALIFIER tvec4<half>& tvec4<half>::operator*= + ( + tvec4<half> const & v + ) + { + this->x *= v.x; + this->y *= v.y; + this->z *= v.z; + this->w *= v.w; + return *this; + } + + GLM_FUNC_QUALIFIER tvec4<half>& tvec4<half>::operator/= + ( + half const & s + ) + { + this->x /= s; + this->y /= s; + this->z /= s; + this->w /= s; + return *this; + } + + GLM_FUNC_QUALIFIER tvec4<half>& tvec4<half>::operator/= + ( + tvec4<half> const & v + ) + { + this->x /= v.x; + this->y /= v.y; + this->z /= v.z; + this->w /= v.w; + return *this; + } + + GLM_FUNC_QUALIFIER tvec4<half>& tvec4<half>::operator++() + { + ++this->x; + ++this->y; + ++this->z; + ++this->w; + return *this; + } + + GLM_FUNC_QUALIFIER tvec4<half>& tvec4<half>::operator--() + { + --this->x; + --this->y; + --this->z; + --this->w; + return *this; + } + + ////////////////////////////////////// + // Swizzle operators + + GLM_FUNC_QUALIFIER half tvec4<half>::swizzle(comp x) const + { + return (*this)[x]; + } + + GLM_FUNC_QUALIFIER tvec2<half> tvec4<half>::swizzle(comp x, comp y) const + { + return tvec2<half>( + (*this)[x], + (*this)[y]); + } + + GLM_FUNC_QUALIFIER tvec3<half> tvec4<half>::swizzle(comp x, comp y, comp z) const + { + return tvec3<half>( + (*this)[x], + (*this)[y], + (*this)[z]); + } + + GLM_FUNC_QUALIFIER tvec4<half> tvec4<half>::swizzle(comp x, comp y, comp z, comp w) const + { + return tvec4<half>( + (*this)[x], + (*this)[y], + (*this)[z], + (*this)[w]); + } + + GLM_FUNC_QUALIFIER tref4<half> tvec4<half>::swizzle(comp x, comp y, comp z, comp w) + { + return tref4<half>( + (*this)[x], + (*this)[y], + (*this)[z], + (*this)[w]); + } + +#endif//(GLM_COMPONENT == GLM_COMPONENT_CXX98) + +}//namespace detail + + GLM_FUNC_QUALIFIER half abs(half const & x) + { + return float(x) >= float(0) ? x : -x; + } + + GLM_FUNC_QUALIFIER hvec2 abs(hvec2 const & v) + { + return hvec2( + float(v.x) >= float(0) ? v.x : -v.x, + float(v.y) >= float(0) ? v.y : -v.y); + } + + GLM_FUNC_QUALIFIER hvec3 abs(hvec3 const & v) + { + return hvec3( + float(v.x) >= float(0) ? v.x : -v.x, + float(v.y) >= float(0) ? v.y : -v.y, + float(v.z) >= float(0) ? v.z : -v.z); + } + + GLM_FUNC_QUALIFIER hvec4 abs(hvec4 const & v) + { + return hvec4( + float(v.x) >= float(0) ? v.x : -v.x, + float(v.y) >= float(0) ? v.y : -v.y, + float(v.z) >= float(0) ? v.z : -v.z, + float(v.w) >= float(0) ? v.w : -v.w); + } + + template <> + GLM_FUNC_QUALIFIER glm::half mix + ( + glm::half const & x, + glm::half const & y, + bool const & a + ) + { + return a ? y : x; + } + +}//namespace glm diff --git a/include/gal/opengl/glm/gtc/matrix_access.hpp b/include/gal/opengl/glm/gtc/matrix_access.hpp new file mode 100644 index 0000000..201317e --- /dev/null +++ b/include/gal/opengl/glm/gtc/matrix_access.hpp @@ -0,0 +1,87 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtc_matrix_access +/// @file glm/gtc/matrix_access.hpp +/// @date 2005-12-27 / 2011-05-16 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// +/// @defgroup gtc_matrix_access GLM_GTC_matrix_access +/// @ingroup gtc +/// +/// Defines functions to access rows or columns of a matrix easily. +/// <glm/gtc/matrix_access.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTC_matrix_access +#define GLM_GTC_matrix_access GLM_VERSION + +// Dependency: +#include "../glm.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTC_matrix_access extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_matrix_access + /// @{ + + /// Get a specific row of a matrix. + /// @see gtc_matrix_access + template <typename genType> + typename genType::row_type row( + genType const & m, + int index); + + /// Set a specific row to a matrix. + /// @see gtc_matrix_access + template <typename genType> + genType row( + genType const & m, + int index, + typename genType::row_type const & x); + + /// Get a specific column of a matrix. + /// @see gtc_matrix_access + template <typename genType> + typename genType::col_type column( + genType const & m, + int index); + + /// Set a specific column to a matrix. + /// @see gtc_matrix_access + template <typename genType> + genType column( + genType const & m, + int index, + typename genType::col_type const & x); + + /// @} +}//namespace glm + +#include "matrix_access.inl" + +#endif//GLM_GTC_matrix_access diff --git a/include/gal/opengl/glm/gtc/matrix_access.inl b/include/gal/opengl/glm/gtc/matrix_access.inl new file mode 100644 index 0000000..a9e48bb --- /dev/null +++ b/include/gal/opengl/glm/gtc/matrix_access.inl @@ -0,0 +1,80 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtc_matrix_access +/// @file glm/gtc/matrix_access.inl +/// @date 2005-12-27 / 2011-06-05 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template <typename genType> + GLM_FUNC_QUALIFIER genType row + ( + genType const & m, + int index, + typename genType::row_type const & x + ) + { + genType Result = m; + for(typename genType::size_type i = 0; i < genType::row_size(); ++i) + Result[i][index] = x[i]; + return Result; + } + + template <typename genType> + GLM_FUNC_QUALIFIER typename genType::row_type row + ( + genType const & m, + int index + ) + { + typename genType::row_type Result; + for(typename genType::size_type i = 0; i < genType::row_size(); ++i) + Result[i] = m[i][index]; + return Result; + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType column + ( + genType const & m, + int index, + typename genType::col_type const & x + ) + { + genType Result = m; + Result[index] = x; + return Result; + } + + template <typename genType> + GLM_FUNC_QUALIFIER typename genType::col_type column + ( + genType const & m, + int index + ) + { + return m[index]; + } +}//namespace glm diff --git a/include/gal/opengl/glm/gtc/matrix_integer.hpp b/include/gal/opengl/glm/gtc/matrix_integer.hpp new file mode 100644 index 0000000..caed807 --- /dev/null +++ b/include/gal/opengl/glm/gtc/matrix_integer.hpp @@ -0,0 +1,506 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtc_matrix_integer +/// @file glm/gtc/matrix_integer.hpp +/// @date 2011-01-20 / 2011-06-05 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// +/// @defgroup gtc_matrix_integer GLM_GTC_matrix_integer +/// @ingroup gtc +/// +/// Defines a number of matrices with integer types. +/// <glm/gtc/matrix_integer.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTC_matrix_integer +#define GLM_GTC_matrix_integer GLM_VERSION + +// Dependency: +#include "../glm.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTC_matrix_integer extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_matrix_integer + /// @{ + + /// High-precision signed integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat2x2<highp_int> highp_imat2; + + /// High-precision signed integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat3x3<highp_int> highp_imat3; + + /// High-precision signed integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat4x4<highp_int> highp_imat4; + + /// High-precision signed integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat2x2<highp_int> highp_imat2x2; + + /// High-precision signed integer 2x3 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat2x3<highp_int> highp_imat2x3; + + /// High-precision signed integer 2x4 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat2x4<highp_int> highp_imat2x4; + + /// High-precision signed integer 3x2 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat3x2<highp_int> highp_imat3x2; + + /// High-precision signed integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat3x3<highp_int> highp_imat3x3; + + /// High-precision signed integer 3x4 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat3x4<highp_int> highp_imat3x4; + + /// High-precision signed integer 4x2 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat4x2<highp_int> highp_imat4x2; + + /// High-precision signed integer 4x3 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat4x3<highp_int> highp_imat4x3; + + /// High-precision signed integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat4x4<highp_int> highp_imat4x4; + + + /// Medium-precision signed integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat2x2<mediump_int> mediump_imat2; + + /// Medium-precision signed integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat3x3<mediump_int> mediump_imat3; + + /// Medium-precision signed integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat4x4<mediump_int> mediump_imat4; + + + /// Medium-precision signed integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat2x2<mediump_int> mediump_imat2x2; + + /// Medium-precision signed integer 2x3 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat2x3<mediump_int> mediump_imat2x3; + + /// Medium-precision signed integer 2x4 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat2x4<mediump_int> mediump_imat2x4; + + /// Medium-precision signed integer 3x2 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat3x2<mediump_int> mediump_imat3x2; + + /// Medium-precision signed integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat3x3<mediump_int> mediump_imat3x3; + + /// Medium-precision signed integer 3x4 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat3x4<mediump_int> mediump_imat3x4; + + /// Medium-precision signed integer 4x2 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat4x2<mediump_int> mediump_imat4x2; + + /// Medium-precision signed integer 4x3 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat4x3<mediump_int> mediump_imat4x3; + + /// Medium-precision signed integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat4x4<mediump_int> mediump_imat4x4; + + + /// Low-precision signed integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat2x2<lowp_int> lowp_imat2; + + /// Low-precision signed integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat3x3<lowp_int> lowp_imat3; + + /// Low-precision signed integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat4x4<lowp_int> lowp_imat4; + + + /// Low-precision signed integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat2x2<lowp_int> lowp_imat2x2; + + /// Low-precision signed integer 2x3 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat2x3<lowp_int> lowp_imat2x3; + + /// Low-precision signed integer 2x4 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat2x4<lowp_int> lowp_imat2x4; + + /// Low-precision signed integer 3x2 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat3x2<lowp_int> lowp_imat3x2; + + /// Low-precision signed integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat3x3<lowp_int> lowp_imat3x3; + + /// Low-precision signed integer 3x4 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat3x4<lowp_int> lowp_imat3x4; + + /// Low-precision signed integer 4x2 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat4x2<lowp_int> lowp_imat4x2; + + /// Low-precision signed integer 4x3 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat4x3<lowp_int> lowp_imat4x3; + + /// Low-precision signed integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat4x4<lowp_int> lowp_imat4x4; + + + /// High-precision unsigned integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat2x2<highp_uint> highp_umat2; + + /// High-precision unsigned integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat3x3<highp_uint> highp_umat3; + + /// High-precision unsigned integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat4x4<highp_uint> highp_umat4; + + /// High-precision unsigned integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat2x2<highp_uint> highp_umat2x2; + + /// High-precision unsigned integer 2x3 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat2x3<highp_uint> highp_umat2x3; + + /// High-precision unsigned integer 2x4 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat2x4<highp_uint> highp_umat2x4; + + /// High-precision unsigned integer 3x2 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat3x2<highp_uint> highp_umat3x2; + + /// High-precision unsigned integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat3x3<highp_uint> highp_umat3x3; + + /// High-precision unsigned integer 3x4 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat3x4<highp_uint> highp_umat3x4; + + /// High-precision unsigned integer 4x2 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat4x2<highp_uint> highp_umat4x2; + + /// High-precision unsigned integer 4x3 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat4x3<highp_uint> highp_umat4x3; + + /// High-precision unsigned integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat4x4<highp_uint> highp_umat4x4; + + + /// Medium-precision unsigned integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat2x2<mediump_uint> mediump_umat2; + + /// Medium-precision unsigned integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat3x3<mediump_uint> mediump_umat3; + + /// Medium-precision unsigned integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat4x4<mediump_uint> mediump_umat4; + + + /// Medium-precision unsigned integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat2x2<mediump_uint> mediump_umat2x2; + + /// Medium-precision unsigned integer 2x3 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat2x3<mediump_uint> mediump_umat2x3; + + /// Medium-precision unsigned integer 2x4 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat2x4<mediump_uint> mediump_umat2x4; + + /// Medium-precision unsigned integer 3x2 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat3x2<mediump_uint> mediump_umat3x2; + + /// Medium-precision unsigned integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat3x3<mediump_uint> mediump_umat3x3; + + /// Medium-precision unsigned integer 3x4 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat3x4<mediump_uint> mediump_umat3x4; + + /// Medium-precision unsigned integer 4x2 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat4x2<mediump_uint> mediump_umat4x2; + + /// Medium-precision unsigned integer 4x3 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat4x3<mediump_uint> mediump_umat4x3; + + /// Medium-precision unsigned integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat4x4<mediump_uint> mediump_umat4x4; + + + /// Low-precision unsigned integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat2x2<lowp_uint> lowp_umat2; + + /// Low-precision unsigned integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat3x3<lowp_uint> lowp_umat3; + + /// Low-precision unsigned integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat4x4<lowp_uint> lowp_umat4; + + + /// Low-precision unsigned integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat2x2<lowp_uint> lowp_umat2x2; + + /// Low-precision unsigned integer 2x3 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat2x3<lowp_uint> lowp_umat2x3; + + /// Low-precision unsigned integer 2x4 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat2x4<lowp_uint> lowp_umat2x4; + + /// Low-precision unsigned integer 3x2 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat3x2<lowp_uint> lowp_umat3x2; + + /// Low-precision unsigned integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat3x3<lowp_uint> lowp_umat3x3; + + /// Low-precision unsigned integer 3x4 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat3x4<lowp_uint> lowp_umat3x4; + + /// Low-precision unsigned integer 4x2 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat4x2<lowp_uint> lowp_umat4x2; + + /// Low-precision unsigned integer 4x3 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat4x3<lowp_uint> lowp_umat4x3; + + /// Low-precision unsigned integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef detail::tmat4x4<lowp_uint> lowp_umat4x4; + +#if(defined(GLM_PRECISION_HIGHP_INT)) + typedef highp_imat2 imat2; + typedef highp_imat3 imat3; + typedef highp_imat4 imat4; + typedef highp_imat2x2 imat2x2; + typedef highp_imat2x3 imat2x3; + typedef highp_imat2x4 imat2x4; + typedef highp_imat3x2 imat3x2; + typedef highp_imat3x3 imat3x3; + typedef highp_imat3x4 imat3x4; + typedef highp_imat4x2 imat4x2; + typedef highp_imat4x3 imat4x3; + typedef highp_imat4x4 imat4x4; +#elif(defined(GLM_PRECISION_LOWP_INT)) + typedef lowp_imat2 imat2; + typedef lowp_imat3 imat3; + typedef lowp_imat4 imat4; + typedef lowp_imat2x2 imat2x2; + typedef lowp_imat2x3 imat2x3; + typedef lowp_imat2x4 imat2x4; + typedef lowp_imat3x2 imat3x2; + typedef lowp_imat3x3 imat3x3; + typedef lowp_imat3x4 imat3x4; + typedef lowp_imat4x2 imat4x2; + typedef lowp_imat4x3 imat4x3; + typedef lowp_imat4x4 imat4x4; +#else //if(defined(GLM_PRECISION_MEDIUMP_INT)) + + /// Signed integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef mediump_imat2 imat2; + + /// Signed integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef mediump_imat3 imat3; + + /// Signed integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef mediump_imat4 imat4; + + /// Signed integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef mediump_imat2x2 imat2x2; + + /// Signed integer 2x3 matrix. + /// @see gtc_matrix_integer + typedef mediump_imat2x3 imat2x3; + + /// Signed integer 2x4 matrix. + /// @see gtc_matrix_integer + typedef mediump_imat2x4 imat2x4; + + /// Signed integer 3x2 matrix. + /// @see gtc_matrix_integer + typedef mediump_imat3x2 imat3x2; + + /// Signed integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef mediump_imat3x3 imat3x3; + + /// Signed integer 3x4 matrix. + /// @see gtc_matrix_integer + typedef mediump_imat3x4 imat3x4; + + /// Signed integer 4x2 matrix. + /// @see gtc_matrix_integer + typedef mediump_imat4x2 imat4x2; + + /// Signed integer 4x3 matrix. + /// @see gtc_matrix_integer + typedef mediump_imat4x3 imat4x3; + + /// Signed integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef mediump_imat4x4 imat4x4; +#endif//GLM_PRECISION + +#if(defined(GLM_PRECISION_HIGHP_UINT)) + typedef highp_umat2 umat2; + typedef highp_umat3 umat3; + typedef highp_umat4 umat4; + typedef highp_umat2x2 umat2x2; + typedef highp_umat2x3 umat2x3; + typedef highp_umat2x4 umat2x4; + typedef highp_umat3x2 umat3x2; + typedef highp_umat3x3 umat3x3; + typedef highp_umat3x4 umat3x4; + typedef highp_umat4x2 umat4x2; + typedef highp_umat4x3 umat4x3; + typedef highp_umat4x4 umat4x4; +#elif(defined(GLM_PRECISION_LOWP_UINT)) + typedef lowp_umat2 umat2; + typedef lowp_umat3 umat3; + typedef lowp_umat4 umat4; + typedef lowp_umat2x2 umat2x2; + typedef lowp_umat2x3 umat2x3; + typedef lowp_umat2x4 umat2x4; + typedef lowp_umat3x2 umat3x2; + typedef lowp_umat3x3 umat3x3; + typedef lowp_umat3x4 umat3x4; + typedef lowp_umat4x2 umat4x2; + typedef lowp_umat4x3 umat4x3; + typedef lowp_umat4x4 umat4x4; +#else //if(defined(GLM_PRECISION_MEDIUMP_UINT)) + + /// Unsigned integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef mediump_umat2 umat2; + + /// Unsigned integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef mediump_umat3 umat3; + + /// Unsigned integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef mediump_umat4 umat4; + + /// Unsigned integer 2x2 matrix. + /// @see gtc_matrix_integer + typedef mediump_umat2x2 umat2x2; + + /// Unsigned integer 2x3 matrix. + /// @see gtc_matrix_integer + typedef mediump_umat2x3 umat2x3; + + /// Unsigned integer 2x4 matrix. + /// @see gtc_matrix_integer + typedef mediump_umat2x4 umat2x4; + + /// Unsigned integer 3x2 matrix. + /// @see gtc_matrix_integer + typedef mediump_umat3x2 umat3x2; + + /// Unsigned integer 3x3 matrix. + /// @see gtc_matrix_integer + typedef mediump_umat3x3 umat3x3; + + /// Unsigned integer 3x4 matrix. + /// @see gtc_matrix_integer + typedef mediump_umat3x4 umat3x4; + + /// Unsigned integer 4x2 matrix. + /// @see gtc_matrix_integer + typedef mediump_umat4x2 umat4x2; + + /// Unsigned integer 4x3 matrix. + /// @see gtc_matrix_integer + typedef mediump_umat4x3 umat4x3; + + /// Unsigned integer 4x4 matrix. + /// @see gtc_matrix_integer + typedef mediump_umat4x4 umat4x4; +#endif//GLM_PRECISION + + /// @} +}//namespace glm + +#endif//GLM_GTC_matrix_integer diff --git a/include/gal/opengl/glm/gtc/matrix_inverse.hpp b/include/gal/opengl/glm/gtc/matrix_inverse.hpp new file mode 100644 index 0000000..6ccfe35 --- /dev/null +++ b/include/gal/opengl/glm/gtc/matrix_inverse.hpp @@ -0,0 +1,74 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtc_matrix_inverse +/// @file glm/gtc/matrix_inverse.hpp +/// @date 2005-12-21 / 2011-06-05 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// +/// @defgroup gtc_matrix_inverse GLM_GTC_matrix_inverse +/// @ingroup gtc +/// +/// Defines additional matrix inverting functions. +/// <glm/gtc/matrix_inverse.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTC_matrix_inverse +#define GLM_GTC_matrix_inverse GLM_VERSION + +// Dependency: +#include "../glm.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTC_matrix_inverse extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_matrix_inverse + /// @{ + + /// Fast matrix inverse for affine matrix. + /// + /// @param m Input matrix to invert. + /// @tparam genType Squared floating-point matrix: half, float or double. Inverse of matrix based of half-precision floating point value is highly innacurate. + /// @see gtc_matrix_inverse + template <typename genType> + genType affineInverse(genType const & m); + + /// Compute the inverse transpose of a matrix. + /// + /// @param m Input matrix to invert transpose. + /// @tparam genType Squared floating-point matrix: half, float or double. Inverse of matrix based of half-precision floating point value is highly innacurate. + /// @see gtc_matrix_inverse + template <typename genType> + GLM_FUNC_QUALIFIER typename genType::value_type inverseTranspose( + genType const & m); + + /// @} +}//namespace glm + +#include "matrix_inverse.inl" + +#endif//GLM_GTC_matrix_inverse diff --git a/include/gal/opengl/glm/gtc/matrix_inverse.inl b/include/gal/opengl/glm/gtc/matrix_inverse.inl new file mode 100644 index 0000000..470dca8 --- /dev/null +++ b/include/gal/opengl/glm/gtc/matrix_inverse.inl @@ -0,0 +1,159 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtc_matrix_inverse +/// @file glm/gtc/matrix_inverse.inl +/// @date 2005-12-21 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat3x3<T> affineInverse + ( + detail::tmat3x3<T> const & m + ) + { + detail::tmat3x3<T> Result(m); + Result[2] = detail::tvec3<T>(0, 0, 1); + Result = transpose(Result); + detail::tvec3<T> Translation = Result * detail::tvec3<T>(-detail::tvec2<T>(m[2]), m[2][2]); + Result[2] = Translation; + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> affineInverse + ( + detail::tmat4x4<T> const & m + ) + { + detail::tmat4x4<T> Result(m); + Result[3] = detail::tvec4<T>(0, 0, 0, 1); + Result = transpose(Result); + detail::tvec4<T> Translation = Result * detail::tvec4<T>(-detail::tvec3<T>(m[3]), m[3][3]); + Result[3] = Translation; + return Result; + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tmat2x2<valType> inverseTranspose + ( + detail::tmat2x2<valType> const & m + ) + { + valType Determinant = m[0][0] * m[1][1] - m[1][0] * m[0][1]; + + detail::tmat2x2<valType> Inverse( + + m[1][1] / Determinant, + - m[0][1] / Determinant, + - m[1][0] / Determinant, + + m[0][0] / Determinant); + + return Inverse; + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tmat3x3<valType> inverseTranspose + ( + detail::tmat3x3<valType> const & m + ) + { + valType Determinant = + + m[0][0] * (m[1][1] * m[2][2] - m[1][2] * m[2][1]) + - m[0][1] * (m[1][0] * m[2][2] - m[1][2] * m[2][0]) + + m[0][2] * (m[1][0] * m[2][1] - m[1][1] * m[2][0]); + + detail::tmat3x3<valType> Inverse; + Inverse[0][0] = + (m[1][1] * m[2][2] - m[2][1] * m[1][2]); + Inverse[0][1] = - (m[1][0] * m[2][2] - m[2][0] * m[1][2]); + Inverse[0][2] = + (m[1][0] * m[2][1] - m[2][0] * m[1][1]); + Inverse[1][0] = - (m[0][1] * m[2][2] - m[2][1] * m[0][2]); + Inverse[1][1] = + (m[0][0] * m[2][2] - m[2][0] * m[0][2]); + Inverse[1][2] = - (m[0][0] * m[2][1] - m[2][0] * m[0][1]); + Inverse[2][0] = + (m[0][1] * m[1][2] - m[1][1] * m[0][2]); + Inverse[2][1] = - (m[0][0] * m[1][2] - m[1][0] * m[0][2]); + Inverse[2][2] = + (m[0][0] * m[1][1] - m[1][0] * m[0][1]); + Inverse /= Determinant; + + return Inverse; + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tmat4x4<valType> inverseTranspose + ( + detail::tmat4x4<valType> const & m + ) + { + valType SubFactor00 = m[2][2] * m[3][3] - m[3][2] * m[2][3]; + valType SubFactor01 = m[2][1] * m[3][3] - m[3][1] * m[2][3]; + valType SubFactor02 = m[2][1] * m[3][2] - m[3][1] * m[2][2]; + valType SubFactor03 = m[2][0] * m[3][3] - m[3][0] * m[2][3]; + valType SubFactor04 = m[2][0] * m[3][2] - m[3][0] * m[2][2]; + valType SubFactor05 = m[2][0] * m[3][1] - m[3][0] * m[2][1]; + valType SubFactor06 = m[1][2] * m[3][3] - m[3][2] * m[1][3]; + valType SubFactor07 = m[1][1] * m[3][3] - m[3][1] * m[1][3]; + valType SubFactor08 = m[1][1] * m[3][2] - m[3][1] * m[1][2]; + valType SubFactor09 = m[1][0] * m[3][3] - m[3][0] * m[1][3]; + valType SubFactor10 = m[1][0] * m[3][2] - m[3][0] * m[1][2]; + valType SubFactor11 = m[1][1] * m[3][3] - m[3][1] * m[1][3]; + valType SubFactor12 = m[1][0] * m[3][1] - m[3][0] * m[1][1]; + valType SubFactor13 = m[1][2] * m[2][3] - m[2][2] * m[1][3]; + valType SubFactor14 = m[1][1] * m[2][3] - m[2][1] * m[1][3]; + valType SubFactor15 = m[1][1] * m[2][2] - m[2][1] * m[1][2]; + valType SubFactor16 = m[1][0] * m[2][3] - m[2][0] * m[1][3]; + valType SubFactor17 = m[1][0] * m[2][2] - m[2][0] * m[1][2]; + valType SubFactor18 = m[1][0] * m[2][1] - m[2][0] * m[1][1]; + + detail::tmat4x4<valType> Inverse; + Inverse[0][0] = + (m[1][1] * SubFactor00 - m[1][2] * SubFactor01 + m[1][3] * SubFactor02); + Inverse[0][1] = - (m[1][0] * SubFactor00 - m[1][2] * SubFactor03 + m[1][3] * SubFactor04); + Inverse[0][2] = + (m[1][0] * SubFactor01 - m[1][1] * SubFactor03 + m[1][3] * SubFactor05); + Inverse[0][3] = - (m[1][0] * SubFactor02 - m[1][1] * SubFactor04 + m[1][2] * SubFactor05); + + Inverse[1][0] = - (m[0][1] * SubFactor00 - m[0][2] * SubFactor01 + m[0][3] * SubFactor02); + Inverse[1][1] = + (m[0][0] * SubFactor00 - m[0][2] * SubFactor03 + m[0][3] * SubFactor04); + Inverse[1][2] = - (m[0][0] * SubFactor01 - m[0][1] * SubFactor03 + m[0][3] * SubFactor05); + Inverse[1][3] = + (m[0][0] * SubFactor02 - m[0][1] * SubFactor04 + m[0][2] * SubFactor05); + + Inverse[2][0] = + (m[0][1] * SubFactor06 - m[0][2] * SubFactor07 + m[0][3] * SubFactor08); + Inverse[2][1] = - (m[0][0] * SubFactor06 - m[0][2] * SubFactor09 + m[0][3] * SubFactor10); + Inverse[2][2] = + (m[0][0] * SubFactor11 - m[0][1] * SubFactor09 + m[0][3] * SubFactor12); + Inverse[2][3] = - (m[0][0] * SubFactor08 - m[0][1] * SubFactor10 + m[0][2] * SubFactor12); + + Inverse[3][0] = - (m[0][1] * SubFactor13 - m[0][2] * SubFactor14 + m[0][3] * SubFactor15); + Inverse[3][1] = + (m[0][0] * SubFactor13 - m[0][2] * SubFactor16 + m[0][3] * SubFactor17); + Inverse[3][2] = - (m[0][0] * SubFactor14 - m[0][1] * SubFactor16 + m[0][3] * SubFactor18); + Inverse[3][3] = + (m[0][0] * SubFactor15 - m[0][1] * SubFactor17 + m[0][2] * SubFactor18); + + valType Determinant = + + m[0][0] * Inverse[0][0] + + m[0][1] * Inverse[0][1] + + m[0][2] * Inverse[0][2] + + m[0][3] * Inverse[0][3]; + + Inverse /= Determinant; + + return Inverse; + } +}//namespace glm diff --git a/include/gal/opengl/glm/gtc/matrix_transform.hpp b/include/gal/opengl/glm/gtc/matrix_transform.hpp new file mode 100644 index 0000000..020c6dd --- /dev/null +++ b/include/gal/opengl/glm/gtc/matrix_transform.hpp @@ -0,0 +1,291 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtc_matrix_transform +/// @file glm/gtc/matrix_transform.hpp +/// @date 2009-04-29 / 2011-05-16 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// @see gtx_transform +/// @see gtx_transform2 +/// +/// @defgroup gtc_matrix_transform GLM_GTC_matrix_transform +/// @ingroup gtc +/// +/// @brief Defines functions that generate common transformation matrices. +/// +/// The matrices generated by this extension use standard OpenGL fixed-function +/// conventions. For example, the lookAt function generates a transform from world +/// space into the specific eye space that the projective matrix functions +/// (perspective, ortho, etc) are designed to expect. The OpenGL compatibility +/// specifications defines the particular layout of this eye space. +/// +/// <glm/gtc/matrix_transform.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTC_matrix_transform +#define GLM_GTC_matrix_transform GLM_VERSION + +// Dependency: +#include "../glm.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTC_matrix_transform extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_matrix_transform + /// @{ + + /// Builds a translation 4 * 4 matrix created from a vector of 3 components. + /// + /// @param m Input matrix multiplied by this translation matrix. + /// @param v Coordinates of a translation vector. + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double. + /// @code + /// #include <glm/glm.hpp> + /// #include <glm/gtc/matrix_transform.hpp> + /// ... + /// glm::mat4 m = glm::translate(glm::mat4(1.0f), glm::vec3(1.0f)); + /// // m[0][0] == 1.0f, m[0][1] == 0.0f, m[0][2] == 0.0f, m[0][3] == 0.0f + /// // m[1][0] == 0.0f, m[1][1] == 1.0f, m[1][2] == 0.0f, m[1][3] == 0.0f + /// // m[2][0] == 0.0f, m[2][1] == 0.0f, m[2][2] == 1.0f, m[2][3] == 0.0f + /// // m[3][0] == 1.0f, m[3][1] == 1.0f, m[3][2] == 1.0f, m[3][3] == 1.0f + /// @endcode + /// @see gtc_matrix_transform + /// @see gtx_transform + /// @see - translate(T x, T y, T z) + /// @see - translate(detail::tmat4x4<T> const & m, T x, T y, T z) + /// @see - translate(detail::tvec3<T> const & v) + template <typename T> + detail::tmat4x4<T> translate( + detail::tmat4x4<T> const & m, + detail::tvec3<T> const & v); + + /// Builds a rotation 4 * 4 matrix created from an axis vector and an angle. + /// + /// @param m Input matrix multiplied by this rotation matrix. + /// @param angle Rotation angle expressed in radians if GLM_FORCE_RADIANS is define or degrees otherwise. + /// @param axis Rotation axis, recommanded to be normalized. + /// @tparam T Value type used to build the matrix. Supported: half, float or double. + /// @see gtc_matrix_transform + /// @see gtx_transform + /// @see - rotate(T angle, T x, T y, T z) + /// @see - rotate(detail::tmat4x4<T> const & m, T angle, T x, T y, T z) + /// @see - rotate(T angle, detail::tvec3<T> const & v) + template <typename T> + detail::tmat4x4<T> rotate( + detail::tmat4x4<T> const & m, + T const & angle, + detail::tvec3<T> const & axis); + + /// Builds a scale 4 * 4 matrix created from 3 scalars. + /// + /// @param m Input matrix multiplied by this scale matrix. + /// @param v Ratio of scaling for each axis. + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double. + /// @see gtc_matrix_transform + /// @see gtx_transform + /// @see - scale(T x, T y, T z) scale(T const & x, T const & y, T const & z) + /// @see - scale(detail::tmat4x4<T> const & m, T x, T y, T z) + /// @see - scale(detail::tvec3<T> const & v) + template <typename T> + detail::tmat4x4<T> scale( + detail::tmat4x4<T> const & m, + detail::tvec3<T> const & v); + + /// Creates a matrix for an orthographic parallel viewing volume. + /// + /// @param left + /// @param right + /// @param bottom + /// @param top + /// @param zNear + /// @param zFar + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double. + /// @see gtc_matrix_transform + /// @see - glm::ortho(T const & left, T const & right, T const & bottom, T const & top) + template <typename T> + detail::tmat4x4<T> ortho( + T const & left, + T const & right, + T const & bottom, + T const & top, + T const & zNear, + T const & zFar); + + /// Creates a matrix for projecting two-dimensional coordinates onto the screen. + /// + /// @param left + /// @param right + /// @param bottom + /// @param top + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double. + /// @see gtc_matrix_transform + /// @see - glm::ortho(T const & left, T const & right, T const & bottom, T const & top, T const & zNear, T const & zFar) + template <typename T> + detail::tmat4x4<T> ortho( + T const & left, + T const & right, + T const & bottom, + T const & top); + + /// Creates a frustum matrix. + /// + /// @param left + /// @param right + /// @param bottom + /// @param top + /// @param near + /// @param far + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double. + /// @see gtc_matrix_transform + template <typename T> + detail::tmat4x4<T> frustum( + T const & left, + T const & right, + T const & bottom, + T const & top, + T const & near, + T const & far); + + /// Creates a matrix for a symetric perspective-view frustum. + /// + /// @param fovy Expressed in radians if GLM_FORCE_RADIANS is define or degrees otherwise. + /// @param aspect + /// @param near + /// @param far + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double. + /// @see gtc_matrix_transform + template <typename T> + detail::tmat4x4<T> perspective( + T const & fovy, + T const & aspect, + T const & near, + T const & far); + + /// Builds a perspective projection matrix based on a field of view. + /// + /// @param fov Expressed in radians if GLM_FORCE_RADIANS is define or degrees otherwise. + /// @param width + /// @param height + /// @param near + /// @param far + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double. + /// @see gtc_matrix_transform + template <typename valType> + detail::tmat4x4<valType> perspectiveFov( + valType const & fov, + valType const & width, + valType const & height, + valType const & near, + valType const & far); + + /// Creates a matrix for a symmetric perspective-view frustum with far plane at infinite. + /// + /// @param fovy Expressed in radians if GLM_FORCE_RADIANS is define or degrees otherwise. + /// @param aspect + /// @param near + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double. + /// @see gtc_matrix_transform + template <typename T> + detail::tmat4x4<T> infinitePerspective( + T fovy, T aspect, T near); + + /// Creates a matrix for a symmetric perspective-view frustum with far plane at infinite for graphics hardware that doesn't support depth clamping. + /// + /// @param fovy Expressed in radians if GLM_FORCE_RADIANS is define or degrees otherwise. + /// @param aspect + /// @param near + /// @tparam T Value type used to build the matrix. Currently supported: half (not recommanded), float or double. + /// @see gtc_matrix_transform + template <typename T> + detail::tmat4x4<T> tweakedInfinitePerspective( + T fovy, T aspect, T near); + + /// Map the specified object coordinates (obj.x, obj.y, obj.z) into window coordinates. + /// + /// @param obj + /// @param model + /// @param proj + /// @param viewport + /// @tparam T Native type used for the computation. Currently supported: half (not recommanded), float or double. + /// @tparam U Currently supported: Floating-point types and integer types. + /// @see gtc_matrix_transform + template <typename T, typename U> + detail::tvec3<T> project( + detail::tvec3<T> const & obj, + detail::tmat4x4<T> const & model, + detail::tmat4x4<T> const & proj, + detail::tvec4<U> const & viewport); + + /// Map the specified window coordinates (win.x, win.y, win.z) into object coordinates. + /// + /// @param win + /// @param model + /// @param proj + /// @param viewport + /// @tparam T Native type used for the computation. Currently supported: half (not recommanded), float or double. + /// @tparam U Currently supported: Floating-point types and integer types. + /// @see gtc_matrix_transform + template <typename T, typename U> + detail::tvec3<T> unProject( + detail::tvec3<T> const & win, + detail::tmat4x4<T> const & model, + detail::tmat4x4<T> const & proj, + detail::tvec4<U> const & viewport); + + /// Define a picking region + /// + /// @param center + /// @param delta + /// @param viewport + /// @tparam T Native type used for the computation. Currently supported: half (not recommanded), float or double. + /// @tparam U Currently supported: Floating-point types and integer types. + /// @see gtc_matrix_transform + template <typename T, typename U> + detail::tmat4x4<T> pickMatrix( + detail::tvec2<T> const & center, + detail::tvec2<T> const & delta, + detail::tvec4<U> const & viewport); + + /// Build a look at view matrix. + /// + /// @param eye Position of the camera + /// @param center Position where the camera is looking at + /// @param up Normalized up vector, how the camera is oriented. Typically (0, 0, 1) + /// @see gtc_matrix_transform + /// @see - frustum(T const & left, T const & right, T const & bottom, T const & top, T const & nearVal, T const & farVal) frustum(T const & left, T const & right, T const & bottom, T const & top, T const & nearVal, T const & farVal) + template <typename T> + detail::tmat4x4<T> lookAt( + detail::tvec3<T> const & eye, + detail::tvec3<T> const & center, + detail::tvec3<T> const & up); + + /// @} +}//namespace glm + +#include "matrix_transform.inl" + +#endif//GLM_GTC_matrix_transform diff --git a/include/gal/opengl/glm/gtc/matrix_transform.inl b/include/gal/opengl/glm/gtc/matrix_transform.inl new file mode 100644 index 0000000..6f20b4c --- /dev/null +++ b/include/gal/opengl/glm/gtc/matrix_transform.inl @@ -0,0 +1,434 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtc_matrix_transform +/// @file glm/gtc/matrix_transform.inl +/// @date 2009-04-29 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> translate + ( + detail::tmat4x4<T> const & m, + detail::tvec3<T> const & v + ) + { + detail::tmat4x4<T> Result(m); + Result[3] = m[0] * v[0] + m[1] * v[1] + m[2] * v[2] + m[3]; + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> rotate + ( + detail::tmat4x4<T> const & m, + T const & angle, + detail::tvec3<T> const & v + ) + { +#ifdef GLM_FORCE_RADIANS + T a = angle; +#else + T a = radians(angle); +#endif + T c = cos(a); + T s = sin(a); + + detail::tvec3<T> axis = normalize(v); + + detail::tvec3<T> temp = (T(1) - c) * axis; + + detail::tmat4x4<T> Rotate(detail::tmat4x4<T>::null); + Rotate[0][0] = c + temp[0] * axis[0]; + Rotate[0][1] = 0 + temp[0] * axis[1] + s * axis[2]; + Rotate[0][2] = 0 + temp[0] * axis[2] - s * axis[1]; + + Rotate[1][0] = 0 + temp[1] * axis[0] - s * axis[2]; + Rotate[1][1] = c + temp[1] * axis[1]; + Rotate[1][2] = 0 + temp[1] * axis[2] + s * axis[0]; + + Rotate[2][0] = 0 + temp[2] * axis[0] + s * axis[1]; + Rotate[2][1] = 0 + temp[2] * axis[1] - s * axis[0]; + Rotate[2][2] = c + temp[2] * axis[2]; + + detail::tmat4x4<T> Result(detail::tmat4x4<T>::null); + Result[0] = m[0] * Rotate[0][0] + m[1] * Rotate[0][1] + m[2] * Rotate[0][2]; + Result[1] = m[0] * Rotate[1][0] + m[1] * Rotate[1][1] + m[2] * Rotate[1][2]; + Result[2] = m[0] * Rotate[2][0] + m[1] * Rotate[2][1] + m[2] * Rotate[2][2]; + Result[3] = m[3]; + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> scale + ( + detail::tmat4x4<T> const & m, + detail::tvec3<T> const & v + ) + { + detail::tmat4x4<T> Result(detail::tmat4x4<T>::null); + Result[0] = m[0] * v[0]; + Result[1] = m[1] * v[1]; + Result[2] = m[2] * v[2]; + Result[3] = m[3]; + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> translate_slow + ( + detail::tmat4x4<T> const & m, + detail::tvec3<T> const & v + ) + { + detail::tmat4x4<T> Result(T(1)); + Result[3] = detail::tvec4<T>(v, T(1)); + return m * Result; + + //detail::tmat4x4<valType> Result(m); + Result[3] = m[0] * v[0] + m[1] * v[1] + m[2] * v[2] + m[3]; + //Result[3][0] = m[0][0] * v[0] + m[1][0] * v[1] + m[2][0] * v[2] + m[3][0]; + //Result[3][1] = m[0][1] * v[0] + m[1][1] * v[1] + m[2][1] * v[2] + m[3][1]; + //Result[3][2] = m[0][2] * v[0] + m[1][2] * v[1] + m[2][2] * v[2] + m[3][2]; + //Result[3][3] = m[0][3] * v[0] + m[1][3] * v[1] + m[2][3] * v[2] + m[3][3]; + //return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> rotate_slow + ( + detail::tmat4x4<T> const & m, + T const & angle, + detail::tvec3<T> const & v + ) + { +#ifdef GLM_FORCE_RADIANS + T const a = angle; +#else + T const a = radians(angle); +#endif + T c = cos(a); + T s = sin(a); + detail::tmat4x4<T> Result; + + detail::tvec3<T> axis = normalize(v); + + Result[0][0] = c + (1 - c) * axis.x * axis.x; + Result[0][1] = (1 - c) * axis.x * axis.y + s * axis.z; + Result[0][2] = (1 - c) * axis.x * axis.z - s * axis.y; + Result[0][3] = 0; + + Result[1][0] = (1 - c) * axis.y * axis.x - s * axis.z; + Result[1][1] = c + (1 - c) * axis.y * axis.y; + Result[1][2] = (1 - c) * axis.y * axis.z + s * axis.x; + Result[1][3] = 0; + + Result[2][0] = (1 - c) * axis.z * axis.x + s * axis.y; + Result[2][1] = (1 - c) * axis.z * axis.y - s * axis.x; + Result[2][2] = c + (1 - c) * axis.z * axis.z; + Result[2][3] = 0; + + Result[3] = detail::tvec4<T>(0, 0, 0, 1); + return m * Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> scale_slow + ( + detail::tmat4x4<T> const & m, + detail::tvec3<T> const & v + ) + { + detail::tmat4x4<T> Result(T(1)); + Result[0][0] = v.x; + Result[1][1] = v.y; + Result[2][2] = v.z; + return m * Result; + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tmat4x4<valType> ortho + ( + valType const & left, + valType const & right, + valType const & bottom, + valType const & top, + valType const & zNear, + valType const & zFar + ) + { + detail::tmat4x4<valType> Result(1); + Result[0][0] = valType(2) / (right - left); + Result[1][1] = valType(2) / (top - bottom); + Result[2][2] = - valType(2) / (zFar - zNear); + Result[3][0] = - (right + left) / (right - left); + Result[3][1] = - (top + bottom) / (top - bottom); + Result[3][2] = - (zFar + zNear) / (zFar - zNear); + return Result; + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tmat4x4<valType> ortho( + valType const & left, + valType const & right, + valType const & bottom, + valType const & top) + { + detail::tmat4x4<valType> Result(1); + Result[0][0] = valType(2) / (right - left); + Result[1][1] = valType(2) / (top - bottom); + Result[2][2] = - valType(1); + Result[3][0] = - (right + left) / (right - left); + Result[3][1] = - (top + bottom) / (top - bottom); + return Result; + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tmat4x4<valType> frustum + ( + valType const & left, + valType const & right, + valType const & bottom, + valType const & top, + valType const & nearVal, + valType const & farVal + ) + { + detail::tmat4x4<valType> Result(0); + Result[0][0] = (valType(2) * nearVal) / (right - left); + Result[1][1] = (valType(2) * nearVal) / (top - bottom); + Result[2][0] = (right + left) / (right - left); + Result[2][1] = (top + bottom) / (top - bottom); + Result[2][2] = -(farVal + nearVal) / (farVal - nearVal); + Result[2][3] = valType(-1); + Result[3][2] = -(valType(2) * farVal * nearVal) / (farVal - nearVal); + return Result; + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tmat4x4<valType> perspective + ( + valType const & fovy, + valType const & aspect, + valType const & zNear, + valType const & zFar + ) + { + assert(aspect != valType(0)); + assert(zFar != zNear); + +#ifdef GLM_FORCE_RADIANS + valType const rad = fovy; +#else + valType const rad = glm::radians(fovy); +#endif + + valType tanHalfFovy = tan(rad / valType(2)); + detail::tmat4x4<valType> Result(valType(0)); + Result[0][0] = valType(1) / (aspect * tanHalfFovy); + Result[1][1] = valType(1) / (tanHalfFovy); + Result[2][2] = - (zFar + zNear) / (zFar - zNear); + Result[2][3] = - valType(1); + Result[3][2] = - (valType(2) * zFar * zNear) / (zFar - zNear); + return Result; + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tmat4x4<valType> perspectiveFov + ( + valType const & fov, + valType const & width, + valType const & height, + valType const & zNear, + valType const & zFar + ) + { +#ifdef GLM_FORCE_RADIANS + valType rad = fov; +#else + valType rad = glm::radians(fov); +#endif + valType h = glm::cos(valType(0.5) * rad) / glm::sin(valType(0.5) * rad); + valType w = h * height / width; ///todo max(width , Height) / min(width , Height)? + + detail::tmat4x4<valType> Result(valType(0)); + Result[0][0] = w; + Result[1][1] = h; + Result[2][2] = - (zFar + zNear) / (zFar - zNear); + Result[2][3] = - valType(1); + Result[3][2] = - (valType(2) * zFar * zNear) / (zFar - zNear); + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> infinitePerspective + ( + T fovy, + T aspect, + T zNear + ) + { +#ifdef GLM_FORCE_RADIANS + T const range = tan(fovy / T(2)) * zNear; +#else + T const range = tan(radians(fovy / T(2))) * zNear; +#endif + T left = -range * aspect; + T right = range * aspect; + T bottom = -range; + T top = range; + + detail::tmat4x4<T> Result(T(0)); + Result[0][0] = (T(2) * zNear) / (right - left); + Result[1][1] = (T(2) * zNear) / (top - bottom); + Result[2][2] = - T(1); + Result[2][3] = - T(1); + Result[3][2] = - T(2) * zNear; + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> tweakedInfinitePerspective + ( + T fovy, + T aspect, + T zNear + ) + { +#ifdef GLM_FORCE_RADIANS + T range = tan(fovy / T(2)) * zNear; +#else + T range = tan(radians(fovy / T(2))) * zNear; +#endif + T left = -range * aspect; + T right = range * aspect; + T bottom = -range; + T top = range; + + detail::tmat4x4<T> Result(T(0)); + Result[0][0] = (T(2) * zNear) / (right - left); + Result[1][1] = (T(2) * zNear) / (top - bottom); + Result[2][2] = T(0.0001) - T(1); + Result[2][3] = T(-1); + Result[3][2] = - (T(0.0001) - T(2)) * zNear; + return Result; + } + + template <typename T, typename U> + GLM_FUNC_QUALIFIER detail::tvec3<T> project + ( + detail::tvec3<T> const & obj, + detail::tmat4x4<T> const & model, + detail::tmat4x4<T> const & proj, + detail::tvec4<U> const & viewport + ) + { + detail::tvec4<T> tmp = detail::tvec4<T>(obj, T(1)); + tmp = model * tmp; + tmp = proj * tmp; + + tmp /= tmp.w; + tmp = tmp * T(0.5) + T(0.5); + tmp[0] = tmp[0] * T(viewport[2]) + T(viewport[0]); + tmp[1] = tmp[1] * T(viewport[3]) + T(viewport[1]); + + return detail::tvec3<T>(tmp); + } + + template <typename T, typename U> + GLM_FUNC_QUALIFIER detail::tvec3<T> unProject + ( + detail::tvec3<T> const & win, + detail::tmat4x4<T> const & model, + detail::tmat4x4<T> const & proj, + detail::tvec4<U> const & viewport + ) + { + detail::tmat4x4<T> inverse = glm::inverse(proj * model); + + detail::tvec4<T> tmp = detail::tvec4<T>(win, T(1)); + tmp.x = (tmp.x - T(viewport[0])) / T(viewport[2]); + tmp.y = (tmp.y - T(viewport[1])) / T(viewport[3]); + tmp = tmp * T(2) - T(1); + + detail::tvec4<T> obj = inverse * tmp; + obj /= obj.w; + + return detail::tvec3<T>(obj); + } + + template <typename T, typename U> + detail::tmat4x4<T> pickMatrix + ( + detail::tvec2<T> const & center, + detail::tvec2<T> const & delta, + detail::tvec4<U> const & viewport + ) + { + assert(delta.x > T(0) && delta.y > T(0)); + detail::tmat4x4<T> Result(1.0f); + + if(!(delta.x > T(0) && delta.y > T(0))) + return Result; // Error + + detail::tvec3<T> Temp( + (T(viewport[2]) - T(2) * (center.x - T(viewport[0]))) / delta.x, + (T(viewport[3]) - T(2) * (center.y - T(viewport[1]))) / delta.y, + T(0)); + + // Translate and scale the picked region to the entire window + Result = translate(Result, Temp); + return scale(Result, detail::tvec3<T>(T(viewport[2]) / delta.x, T(viewport[3]) / delta.y, T(1))); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> lookAt + ( + detail::tvec3<T> const & eye, + detail::tvec3<T> const & center, + detail::tvec3<T> const & up + ) + { + detail::tvec3<T> f = normalize(center - eye); + detail::tvec3<T> u = normalize(up); + detail::tvec3<T> s = normalize(cross(f, u)); + u = cross(s, f); + + detail::tmat4x4<T> Result(1); + Result[0][0] = s.x; + Result[1][0] = s.y; + Result[2][0] = s.z; + Result[0][1] = u.x; + Result[1][1] = u.y; + Result[2][1] = u.z; + Result[0][2] =-f.x; + Result[1][2] =-f.y; + Result[2][2] =-f.z; + Result[3][0] =-dot(s, eye); + Result[3][1] =-dot(u, eye); + Result[3][2] = dot(f, eye); + return Result; + } +}//namespace glm diff --git a/include/gal/opengl/glm/gtc/noise.hpp b/include/gal/opengl/glm/gtc/noise.hpp new file mode 100644 index 0000000..1768bd2 --- /dev/null +++ b/include/gal/opengl/glm/gtc/noise.hpp @@ -0,0 +1,80 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtc_noise +/// @file glm/gtc/noise.hpp +/// @date 2011-04-21 / 2011-09-27 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// +/// @defgroup gtc_noise GLM_GTC_noise +/// @ingroup gtc +/// +/// Defines 2D, 3D and 4D procedural noise functions +/// Based on the work of Stefan Gustavson and Ashima Arts on "webgl-noise": +/// https://github.com/ashima/webgl-noise +/// Following Stefan Gustavson's paper "Simplex noise demystified": +/// http://www.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf +/// <glm/gtc/noise.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTC_noise +#define GLM_GTC_noise GLM_VERSION + +// Dependency: +#include "../glm.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTC_noise extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_noise + /// @{ + + /// Classic perlin noise. + /// @see gtc_noise + template <typename T, template<typename> class vecType> + T perlin( + vecType<T> const & p); + + /// Periodic perlin noise. + /// @see gtc_noise + template <typename T, template<typename> class vecType> + T perlin( + vecType<T> const & p, + vecType<T> const & rep); + + /// Simplex noise. + /// @see gtc_noise + template <typename T, template<typename> class vecType> + T simplex( + vecType<T> const & p); + + /// @} +}//namespace glm + +#include "noise.inl" + +#endif//GLM_GTC_noise diff --git a/include/gal/opengl/glm/gtc/noise.inl b/include/gal/opengl/glm/gtc/noise.inl new file mode 100644 index 0000000..1c6d557 --- /dev/null +++ b/include/gal/opengl/glm/gtc/noise.inl @@ -0,0 +1,867 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtc_noise +/// @file glm/gtc/noise.inl +/// @date 2011-04-21 / 2012-04-07 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// +// Based on the work of Stefan Gustavson and Ashima Arts on "webgl-noise": +// https://github.com/ashima/webgl-noise +// Following Stefan Gustavson's paper "Simplex noise demystified": +// http://www.itn.liu.se/~stegu/simplexnoise/simplexnoise.pdf +/////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template <typename T> + GLM_FUNC_QUALIFIER T mod289(T const & x) + { + return x - floor(x * T(1.0 / 289.0)) * T(289.0); + } + + template <typename T> + GLM_FUNC_QUALIFIER T permute(T const & x) + { + return mod289(((x * T(34)) + T(1)) * x); + } + + template <typename T, template<typename> class vecType> + GLM_FUNC_QUALIFIER vecType<T> permute(vecType<T> const & x) + { + return mod289(((x * T(34)) + T(1)) * x); + } + + template <typename T> + GLM_FUNC_QUALIFIER T taylorInvSqrt(T const & r) + { + return T(1.79284291400159) - T(0.85373472095314) * r; + } + + template <typename T, template<typename> class vecType> + GLM_FUNC_QUALIFIER vecType<T> taylorInvSqrt(vecType<T> const & r) + { + return T(1.79284291400159) - T(0.85373472095314) * r; + } + + template <typename T, template <typename> class vecType> + GLM_FUNC_QUALIFIER vecType<T> fade(vecType<T> const & t) + { + return t * t * t * (t * (t * T(6) - T(15)) + T(10)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec4<T> grad4(T const & j, detail::tvec4<T> const & ip) + { + detail::tvec3<T> pXYZ = floor(fract(detail::tvec3<T>(j) * detail::tvec3<T>(ip)) * T(7)) * ip[2] - T(1); + T pW = T(1.5) - dot(abs(pXYZ), detail::tvec3<T>(1)); + detail::tvec4<T> s = detail::tvec4<T>(lessThan(detail::tvec4<T>(pXYZ, pW), detail::tvec4<T>(0.0))); + pXYZ = pXYZ + (detail::tvec3<T>(s) * T(2) - T(1)) * s.w; + return detail::tvec4<T>(pXYZ, pW); + } + + // Classic Perlin noise + template <typename T> + GLM_FUNC_QUALIFIER T perlin(detail::tvec2<T> const & P) + { + detail::tvec4<T> Pi = glm::floor(detail::tvec4<T>(P.x, P.y, P.x, P.y)) + detail::tvec4<T>(0.0, 0.0, 1.0, 1.0); + detail::tvec4<T> Pf = glm::fract(detail::tvec4<T>(P.x, P.y, P.x, P.y)) - detail::tvec4<T>(0.0, 0.0, 1.0, 1.0); + Pi = mod(Pi, T(289)); // To avoid truncation effects in permutation + detail::tvec4<T> ix(Pi.x, Pi.z, Pi.x, Pi.z); + detail::tvec4<T> iy(Pi.y, Pi.y, Pi.w, Pi.w); + detail::tvec4<T> fx(Pf.x, Pf.z, Pf.x, Pf.z); + detail::tvec4<T> fy(Pf.y, Pf.y, Pf.w, Pf.w); + + detail::tvec4<T> i = glm::permute(glm::permute(ix) + iy); + + detail::tvec4<T> gx = T(2) * glm::fract(i / T(41)) - T(1); + detail::tvec4<T> gy = glm::abs(gx) - T(0.5); + detail::tvec4<T> tx = glm::floor(gx + T(0.5)); + gx = gx - tx; + + detail::tvec2<T> g00(gx.x, gy.x); + detail::tvec2<T> g10(gx.y, gy.y); + detail::tvec2<T> g01(gx.z, gy.z); + detail::tvec2<T> g11(gx.w, gy.w); + + detail::tvec4<T> norm = taylorInvSqrt(detail::tvec4<T>(dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11))); + g00 *= norm.x; + g01 *= norm.y; + g10 *= norm.z; + g11 *= norm.w; + + T n00 = dot(g00, detail::tvec2<T>(fx.x, fy.x)); + T n10 = dot(g10, detail::tvec2<T>(fx.y, fy.y)); + T n01 = dot(g01, detail::tvec2<T>(fx.z, fy.z)); + T n11 = dot(g11, detail::tvec2<T>(fx.w, fy.w)); + + detail::tvec2<T> fade_xy = fade(detail::tvec2<T>(Pf.x, Pf.y)); + detail::tvec2<T> n_x = mix(detail::tvec2<T>(n00, n01), detail::tvec2<T>(n10, n11), fade_xy.x); + T n_xy = mix(n_x.x, n_x.y, fade_xy.y); + return T(2.3) * n_xy; + } + + // Classic Perlin noise + template <typename T> + GLM_FUNC_QUALIFIER T perlin(detail::tvec3<T> const & P) + { + detail::tvec3<T> Pi0 = floor(P); // Integer part for indexing + detail::tvec3<T> Pi1 = Pi0 + T(1); // Integer part + 1 + Pi0 = mod289(Pi0); + Pi1 = mod289(Pi1); + detail::tvec3<T> Pf0 = fract(P); // Fractional part for interpolation + detail::tvec3<T> Pf1 = Pf0 - T(1); // Fractional part - 1.0 + detail::tvec4<T> ix(Pi0.x, Pi1.x, Pi0.x, Pi1.x); + detail::tvec4<T> iy = detail::tvec4<T>(detail::tvec2<T>(Pi0.y), detail::tvec2<T>(Pi1.y)); + detail::tvec4<T> iz0(Pi0.z); + detail::tvec4<T> iz1(Pi1.z); + + detail::tvec4<T> ixy = permute(permute(ix) + iy); + detail::tvec4<T> ixy0 = permute(ixy + iz0); + detail::tvec4<T> ixy1 = permute(ixy + iz1); + + detail::tvec4<T> gx0 = ixy0 * T(1.0 / 7.0); + detail::tvec4<T> gy0 = fract(floor(gx0) * T(1.0 / 7.0)) - T(0.5); + gx0 = fract(gx0); + detail::tvec4<T> gz0 = detail::tvec4<T>(0.5) - abs(gx0) - abs(gy0); + detail::tvec4<T> sz0 = step(gz0, detail::tvec4<T>(0.0)); + gx0 -= sz0 * (step(T(0), gx0) - T(0.5)); + gy0 -= sz0 * (step(T(0), gy0) - T(0.5)); + + detail::tvec4<T> gx1 = ixy1 * T(1.0 / 7.0); + detail::tvec4<T> gy1 = fract(floor(gx1) * T(1.0 / 7.0)) - T(0.5); + gx1 = fract(gx1); + detail::tvec4<T> gz1 = detail::tvec4<T>(0.5) - abs(gx1) - abs(gy1); + detail::tvec4<T> sz1 = step(gz1, detail::tvec4<T>(0.0)); + gx1 -= sz1 * (step(T(0), gx1) - T(0.5)); + gy1 -= sz1 * (step(T(0), gy1) - T(0.5)); + + detail::tvec3<T> g000(gx0.x, gy0.x, gz0.x); + detail::tvec3<T> g100(gx0.y, gy0.y, gz0.y); + detail::tvec3<T> g010(gx0.z, gy0.z, gz0.z); + detail::tvec3<T> g110(gx0.w, gy0.w, gz0.w); + detail::tvec3<T> g001(gx1.x, gy1.x, gz1.x); + detail::tvec3<T> g101(gx1.y, gy1.y, gz1.y); + detail::tvec3<T> g011(gx1.z, gy1.z, gz1.z); + detail::tvec3<T> g111(gx1.w, gy1.w, gz1.w); + + detail::tvec4<T> norm0 = taylorInvSqrt(detail::tvec4<T>(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110))); + g000 *= norm0.x; + g010 *= norm0.y; + g100 *= norm0.z; + g110 *= norm0.w; + detail::tvec4<T> norm1 = taylorInvSqrt(detail::tvec4<T>(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111))); + g001 *= norm1.x; + g011 *= norm1.y; + g101 *= norm1.z; + g111 *= norm1.w; + + T n000 = dot(g000, Pf0); + T n100 = dot(g100, detail::tvec3<T>(Pf1.x, Pf0.y, Pf0.z)); + T n010 = dot(g010, detail::tvec3<T>(Pf0.x, Pf1.y, Pf0.z)); + T n110 = dot(g110, detail::tvec3<T>(Pf1.x, Pf1.y, Pf0.z)); + T n001 = dot(g001, detail::tvec3<T>(Pf0.x, Pf0.y, Pf1.z)); + T n101 = dot(g101, detail::tvec3<T>(Pf1.x, Pf0.y, Pf1.z)); + T n011 = dot(g011, detail::tvec3<T>(Pf0.x, Pf1.y, Pf1.z)); + T n111 = dot(g111, Pf1); + + detail::tvec3<T> fade_xyz = fade(Pf0); + detail::tvec4<T> n_z = mix(detail::tvec4<T>(n000, n100, n010, n110), detail::tvec4<T>(n001, n101, n011, n111), fade_xyz.z); + detail::tvec2<T> n_yz = mix(detail::tvec2<T>(n_z.x, n_z.y), detail::tvec2<T>(n_z.z, n_z.w), fade_xyz.y); + T n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x); + return T(2.2) * n_xyz; + } + /* + // Classic Perlin noise + template <typename T> + GLM_FUNC_QUALIFIER T perlin(detail::tvec3<T> const & P) + { + detail::tvec3<T> Pi0 = floor(P); // Integer part for indexing + detail::tvec3<T> Pi1 = Pi0 + T(1); // Integer part + 1 + Pi0 = mod(Pi0, T(289)); + Pi1 = mod(Pi1, T(289)); + detail::tvec3<T> Pf0 = fract(P); // Fractional part for interpolation + detail::tvec3<T> Pf1 = Pf0 - T(1); // Fractional part - 1.0 + detail::tvec4<T> ix(Pi0.x, Pi1.x, Pi0.x, Pi1.x); + detail::tvec4<T> iy(Pi0.y, Pi0.y, Pi1.y, Pi1.y); + detail::tvec4<T> iz0(Pi0.z); + detail::tvec4<T> iz1(Pi1.z); + + detail::tvec4<T> ixy = permute(permute(ix) + iy); + detail::tvec4<T> ixy0 = permute(ixy + iz0); + detail::tvec4<T> ixy1 = permute(ixy + iz1); + + detail::tvec4<T> gx0 = ixy0 / T(7); + detail::tvec4<T> gy0 = fract(floor(gx0) / T(7)) - T(0.5); + gx0 = fract(gx0); + detail::tvec4<T> gz0 = detail::tvec4<T>(0.5) - abs(gx0) - abs(gy0); + detail::tvec4<T> sz0 = step(gz0, detail::tvec4<T>(0.0)); + gx0 -= sz0 * (step(0.0, gx0) - T(0.5)); + gy0 -= sz0 * (step(0.0, gy0) - T(0.5)); + + detail::tvec4<T> gx1 = ixy1 / T(7); + detail::tvec4<T> gy1 = fract(floor(gx1) / T(7)) - T(0.5); + gx1 = fract(gx1); + detail::tvec4<T> gz1 = detail::tvec4<T>(0.5) - abs(gx1) - abs(gy1); + detail::tvec4<T> sz1 = step(gz1, detail::tvec4<T>(0.0)); + gx1 -= sz1 * (step(T(0), gx1) - T(0.5)); + gy1 -= sz1 * (step(T(0), gy1) - T(0.5)); + + detail::tvec3<T> g000(gx0.x, gy0.x, gz0.x); + detail::tvec3<T> g100(gx0.y, gy0.y, gz0.y); + detail::tvec3<T> g010(gx0.z, gy0.z, gz0.z); + detail::tvec3<T> g110(gx0.w, gy0.w, gz0.w); + detail::tvec3<T> g001(gx1.x, gy1.x, gz1.x); + detail::tvec3<T> g101(gx1.y, gy1.y, gz1.y); + detail::tvec3<T> g011(gx1.z, gy1.z, gz1.z); + detail::tvec3<T> g111(gx1.w, gy1.w, gz1.w); + + detail::tvec4<T> norm0 = taylorInvSqrt(detail::tvec4<T>(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110))); + g000 *= norm0.x; + g010 *= norm0.y; + g100 *= norm0.z; + g110 *= norm0.w; + detail::tvec4<T> norm1 = taylorInvSqrt(detail::tvec4<T>(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111))); + g001 *= norm1.x; + g011 *= norm1.y; + g101 *= norm1.z; + g111 *= norm1.w; + + T n000 = dot(g000, Pf0); + T n100 = dot(g100, detail::tvec3<T>(Pf1.x, Pf0.y, Pf0.z)); + T n010 = dot(g010, detail::tvec3<T>(Pf0.x, Pf1.y, Pf0.z)); + T n110 = dot(g110, detail::tvec3<T>(Pf1.x, Pf1.y, Pf0.z)); + T n001 = dot(g001, detail::tvec3<T>(Pf0.x, Pf0.y, Pf1.z)); + T n101 = dot(g101, detail::tvec3<T>(Pf1.x, Pf0.y, Pf1.z)); + T n011 = dot(g011, detail::tvec3<T>(Pf0.x, Pf1.y, Pf1.z)); + T n111 = dot(g111, Pf1); + + detail::tvec3<T> fade_xyz = fade(Pf0); + detail::tvec4<T> n_z = mix(detail::tvec4<T>(n000, n100, n010, n110), detail::tvec4<T>(n001, n101, n011, n111), fade_xyz.z); + detail::tvec2<T> n_yz = mix( + detail::tvec2<T>(n_z.x, n_z.y), + detail::tvec2<T>(n_z.z, n_z.w), fade_xyz.y); + T n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x); + return T(2.2) * n_xyz; + } + */ + // Classic Perlin noise + template <typename T> + GLM_FUNC_QUALIFIER T perlin(detail::tvec4<T> const & P) + { + detail::tvec4<T> Pi0 = floor(P); // Integer part for indexing + detail::tvec4<T> Pi1 = Pi0 + T(1); // Integer part + 1 + Pi0 = mod(Pi0, T(289)); + Pi1 = mod(Pi1, T(289)); + detail::tvec4<T> Pf0 = fract(P); // Fractional part for interpolation + detail::tvec4<T> Pf1 = Pf0 - T(1); // Fractional part - 1.0 + detail::tvec4<T> ix(Pi0.x, Pi1.x, Pi0.x, Pi1.x); + detail::tvec4<T> iy(Pi0.y, Pi0.y, Pi1.y, Pi1.y); + detail::tvec4<T> iz0(Pi0.z); + detail::tvec4<T> iz1(Pi1.z); + detail::tvec4<T> iw0(Pi0.w); + detail::tvec4<T> iw1(Pi1.w); + + detail::tvec4<T> ixy = permute(permute(ix) + iy); + detail::tvec4<T> ixy0 = permute(ixy + iz0); + detail::tvec4<T> ixy1 = permute(ixy + iz1); + detail::tvec4<T> ixy00 = permute(ixy0 + iw0); + detail::tvec4<T> ixy01 = permute(ixy0 + iw1); + detail::tvec4<T> ixy10 = permute(ixy1 + iw0); + detail::tvec4<T> ixy11 = permute(ixy1 + iw1); + + detail::tvec4<T> gx00 = ixy00 / T(7); + detail::tvec4<T> gy00 = floor(gx00) / T(7); + detail::tvec4<T> gz00 = floor(gy00) / T(6); + gx00 = fract(gx00) - T(0.5); + gy00 = fract(gy00) - T(0.5); + gz00 = fract(gz00) - T(0.5); + detail::tvec4<T> gw00 = detail::tvec4<T>(0.75) - abs(gx00) - abs(gy00) - abs(gz00); + detail::tvec4<T> sw00 = step(gw00, detail::tvec4<T>(0.0)); + gx00 -= sw00 * (step(T(0), gx00) - T(0.5)); + gy00 -= sw00 * (step(T(0), gy00) - T(0.5)); + + detail::tvec4<T> gx01 = ixy01 / T(7); + detail::tvec4<T> gy01 = floor(gx01) / T(7); + detail::tvec4<T> gz01 = floor(gy01) / T(6); + gx01 = fract(gx01) - T(0.5); + gy01 = fract(gy01) - T(0.5); + gz01 = fract(gz01) - T(0.5); + detail::tvec4<T> gw01 = detail::tvec4<T>(0.75) - abs(gx01) - abs(gy01) - abs(gz01); + detail::tvec4<T> sw01 = step(gw01, detail::tvec4<T>(0.0)); + gx01 -= sw01 * (step(T(0), gx01) - T(0.5)); + gy01 -= sw01 * (step(T(0), gy01) - T(0.5)); + + detail::tvec4<T> gx10 = ixy10 / T(7); + detail::tvec4<T> gy10 = floor(gx10) / T(7); + detail::tvec4<T> gz10 = floor(gy10) / T(6); + gx10 = fract(gx10) - T(0.5); + gy10 = fract(gy10) - T(0.5); + gz10 = fract(gz10) - T(0.5); + detail::tvec4<T> gw10 = detail::tvec4<T>(0.75) - abs(gx10) - abs(gy10) - abs(gz10); + detail::tvec4<T> sw10 = step(gw10, detail::tvec4<T>(0)); + gx10 -= sw10 * (step(T(0), gx10) - T(0.5)); + gy10 -= sw10 * (step(T(0), gy10) - T(0.5)); + + detail::tvec4<T> gx11 = ixy11 / T(7); + detail::tvec4<T> gy11 = floor(gx11) / T(7); + detail::tvec4<T> gz11 = floor(gy11) / T(6); + gx11 = fract(gx11) - T(0.5); + gy11 = fract(gy11) - T(0.5); + gz11 = fract(gz11) - T(0.5); + detail::tvec4<T> gw11 = detail::tvec4<T>(0.75) - abs(gx11) - abs(gy11) - abs(gz11); + detail::tvec4<T> sw11 = step(gw11, detail::tvec4<T>(0.0)); + gx11 -= sw11 * (step(T(0), gx11) - T(0.5)); + gy11 -= sw11 * (step(T(0), gy11) - T(0.5)); + + detail::tvec4<T> g0000(gx00.x, gy00.x, gz00.x, gw00.x); + detail::tvec4<T> g1000(gx00.y, gy00.y, gz00.y, gw00.y); + detail::tvec4<T> g0100(gx00.z, gy00.z, gz00.z, gw00.z); + detail::tvec4<T> g1100(gx00.w, gy00.w, gz00.w, gw00.w); + detail::tvec4<T> g0010(gx10.x, gy10.x, gz10.x, gw10.x); + detail::tvec4<T> g1010(gx10.y, gy10.y, gz10.y, gw10.y); + detail::tvec4<T> g0110(gx10.z, gy10.z, gz10.z, gw10.z); + detail::tvec4<T> g1110(gx10.w, gy10.w, gz10.w, gw10.w); + detail::tvec4<T> g0001(gx01.x, gy01.x, gz01.x, gw01.x); + detail::tvec4<T> g1001(gx01.y, gy01.y, gz01.y, gw01.y); + detail::tvec4<T> g0101(gx01.z, gy01.z, gz01.z, gw01.z); + detail::tvec4<T> g1101(gx01.w, gy01.w, gz01.w, gw01.w); + detail::tvec4<T> g0011(gx11.x, gy11.x, gz11.x, gw11.x); + detail::tvec4<T> g1011(gx11.y, gy11.y, gz11.y, gw11.y); + detail::tvec4<T> g0111(gx11.z, gy11.z, gz11.z, gw11.z); + detail::tvec4<T> g1111(gx11.w, gy11.w, gz11.w, gw11.w); + + detail::tvec4<T> norm00 = taylorInvSqrt(detail::tvec4<T>(dot(g0000, g0000), dot(g0100, g0100), dot(g1000, g1000), dot(g1100, g1100))); + g0000 *= norm00.x; + g0100 *= norm00.y; + g1000 *= norm00.z; + g1100 *= norm00.w; + + detail::tvec4<T> norm01 = taylorInvSqrt(detail::tvec4<T>(dot(g0001, g0001), dot(g0101, g0101), dot(g1001, g1001), dot(g1101, g1101))); + g0001 *= norm01.x; + g0101 *= norm01.y; + g1001 *= norm01.z; + g1101 *= norm01.w; + + detail::tvec4<T> norm10 = taylorInvSqrt(detail::tvec4<T>(dot(g0010, g0010), dot(g0110, g0110), dot(g1010, g1010), dot(g1110, g1110))); + g0010 *= norm10.x; + g0110 *= norm10.y; + g1010 *= norm10.z; + g1110 *= norm10.w; + + detail::tvec4<T> norm11 = taylorInvSqrt(detail::tvec4<T>(dot(g0011, g0011), dot(g0111, g0111), dot(g1011, g1011), dot(g1111, g1111))); + g0011 *= norm11.x; + g0111 *= norm11.y; + g1011 *= norm11.z; + g1111 *= norm11.w; + + T n0000 = dot(g0000, Pf0); + T n1000 = dot(g1000, detail::tvec4<T>(Pf1.x, Pf0.y, Pf0.z, Pf0.w)); + T n0100 = dot(g0100, detail::tvec4<T>(Pf0.x, Pf1.y, Pf0.z, Pf0.w)); + T n1100 = dot(g1100, detail::tvec4<T>(Pf1.x, Pf1.y, Pf0.z, Pf0.w)); + T n0010 = dot(g0010, detail::tvec4<T>(Pf0.x, Pf0.y, Pf1.z, Pf0.w)); + T n1010 = dot(g1010, detail::tvec4<T>(Pf1.x, Pf0.y, Pf1.z, Pf0.w)); + T n0110 = dot(g0110, detail::tvec4<T>(Pf0.x, Pf1.y, Pf1.z, Pf0.w)); + T n1110 = dot(g1110, detail::tvec4<T>(Pf1.x, Pf1.y, Pf1.z, Pf0.w)); + T n0001 = dot(g0001, detail::tvec4<T>(Pf0.x, Pf0.y, Pf0.z, Pf1.w)); + T n1001 = dot(g1001, detail::tvec4<T>(Pf1.x, Pf0.y, Pf0.z, Pf1.w)); + T n0101 = dot(g0101, detail::tvec4<T>(Pf0.x, Pf1.y, Pf0.z, Pf1.w)); + T n1101 = dot(g1101, detail::tvec4<T>(Pf1.x, Pf1.y, Pf0.z, Pf1.w)); + T n0011 = dot(g0011, detail::tvec4<T>(Pf0.x, Pf0.y, Pf1.z, Pf1.w)); + T n1011 = dot(g1011, detail::tvec4<T>(Pf1.x, Pf0.y, Pf1.z, Pf1.w)); + T n0111 = dot(g0111, detail::tvec4<T>(Pf0.x, Pf1.y, Pf1.z, Pf1.w)); + T n1111 = dot(g1111, Pf1); + + detail::tvec4<T> fade_xyzw = fade(Pf0); + detail::tvec4<T> n_0w = mix(detail::tvec4<T>(n0000, n1000, n0100, n1100), detail::tvec4<T>(n0001, n1001, n0101, n1101), fade_xyzw.w); + detail::tvec4<T> n_1w = mix(detail::tvec4<T>(n0010, n1010, n0110, n1110), detail::tvec4<T>(n0011, n1011, n0111, n1111), fade_xyzw.w); + detail::tvec4<T> n_zw = mix(n_0w, n_1w, fade_xyzw.z); + detail::tvec2<T> n_yzw = mix(detail::tvec2<T>(n_zw.x, n_zw.y), detail::tvec2<T>(n_zw.z, n_zw.w), fade_xyzw.y); + T n_xyzw = mix(n_yzw.x, n_yzw.y, fade_xyzw.x); + return T(2.2) * n_xyzw; + } + + // Classic Perlin noise, periodic variant + template <typename T> + GLM_FUNC_QUALIFIER T perlin(detail::tvec2<T> const & P, detail::tvec2<T> const & rep) + { + detail::tvec4<T> Pi = floor(detail::tvec4<T>(P.x, P.y, P.x, P.y)) + detail::tvec4<T>(0.0, 0.0, 1.0, 1.0); + detail::tvec4<T> Pf = fract(detail::tvec4<T>(P.x, P.y, P.x, P.y)) - detail::tvec4<T>(0.0, 0.0, 1.0, 1.0); + Pi = mod(Pi, detail::tvec4<T>(rep.x, rep.y, rep.x, rep.y)); // To create noise with explicit period + Pi = mod(Pi, T(289)); // To avoid truncation effects in permutation + detail::tvec4<T> ix(Pi.x, Pi.z, Pi.x, Pi.z); + detail::tvec4<T> iy(Pi.y, Pi.y, Pi.w, Pi.w); + detail::tvec4<T> fx(Pf.x, Pf.z, Pf.x, Pf.z); + detail::tvec4<T> fy(Pf.y, Pf.y, Pf.w, Pf.w); + + detail::tvec4<T> i = permute(permute(ix) + iy); + + detail::tvec4<T> gx = T(2) * fract(i / T(41)) - T(1); + detail::tvec4<T> gy = abs(gx) - T(0.5); + detail::tvec4<T> tx = floor(gx + T(0.5)); + gx = gx - tx; + + detail::tvec2<T> g00(gx.x, gy.x); + detail::tvec2<T> g10(gx.y, gy.y); + detail::tvec2<T> g01(gx.z, gy.z); + detail::tvec2<T> g11(gx.w, gy.w); + + detail::tvec4<T> norm = taylorInvSqrt(detail::tvec4<T>(dot(g00, g00), dot(g01, g01), dot(g10, g10), dot(g11, g11))); + g00 *= norm.x; + g01 *= norm.y; + g10 *= norm.z; + g11 *= norm.w; + + T n00 = dot(g00, detail::tvec2<T>(fx.x, fy.x)); + T n10 = dot(g10, detail::tvec2<T>(fx.y, fy.y)); + T n01 = dot(g01, detail::tvec2<T>(fx.z, fy.z)); + T n11 = dot(g11, detail::tvec2<T>(fx.w, fy.w)); + + detail::tvec2<T> fade_xy = fade(detail::tvec2<T>(Pf.x, Pf.y)); + detail::tvec2<T> n_x = mix(detail::tvec2<T>(n00, n01), detail::tvec2<T>(n10, n11), fade_xy.x); + T n_xy = mix(n_x.x, n_x.y, fade_xy.y); + return T(2.3) * n_xy; + } + + // Classic Perlin noise, periodic variant + template <typename T> + GLM_FUNC_QUALIFIER T perlin(detail::tvec3<T> const & P, detail::tvec3<T> const & rep) + { + detail::tvec3<T> Pi0 = mod(floor(P), rep); // Integer part, modulo period + detail::tvec3<T> Pi1 = mod(Pi0 + detail::tvec3<T>(1.0), rep); // Integer part + 1, mod period + Pi0 = mod(Pi0, T(289)); + Pi1 = mod(Pi1, T(289)); + detail::tvec3<T> Pf0 = fract(P); // Fractional part for interpolation + detail::tvec3<T> Pf1 = Pf0 - detail::tvec3<T>(1.0); // Fractional part - 1.0 + detail::tvec4<T> ix = detail::tvec4<T>(Pi0.x, Pi1.x, Pi0.x, Pi1.x); + detail::tvec4<T> iy = detail::tvec4<T>(Pi0.y, Pi0.y, Pi1.y, Pi1.y); + detail::tvec4<T> iz0(Pi0.z); + detail::tvec4<T> iz1(Pi1.z); + + detail::tvec4<T> ixy = permute(permute(ix) + iy); + detail::tvec4<T> ixy0 = permute(ixy + iz0); + detail::tvec4<T> ixy1 = permute(ixy + iz1); + + detail::tvec4<T> gx0 = ixy0 / T(7); + detail::tvec4<T> gy0 = fract(floor(gx0) / T(7)) - T(0.5); + gx0 = fract(gx0); + detail::tvec4<T> gz0 = detail::tvec4<T>(0.5) - abs(gx0) - abs(gy0); + detail::tvec4<T> sz0 = step(gz0, detail::tvec4<T>(0)); + gx0 -= sz0 * (step(0.0, gx0) - T(0.5)); + gy0 -= sz0 * (step(0.0, gy0) - T(0.5)); + + detail::tvec4<T> gx1 = ixy1 / T(7); + detail::tvec4<T> gy1 = fract(floor(gx1) / T(7)) - T(0.5); + gx1 = fract(gx1); + detail::tvec4<T> gz1 = detail::tvec4<T>(0.5) - abs(gx1) - abs(gy1); + detail::tvec4<T> sz1 = step(gz1, detail::tvec4<T>(0.0)); + gx1 -= sz1 * (step(0.0, gx1) - T(0.5)); + gy1 -= sz1 * (step(0.0, gy1) - T(0.5)); + + detail::tvec3<T> g000 = detail::tvec3<T>(gx0.x, gy0.x, gz0.x); + detail::tvec3<T> g100 = detail::tvec3<T>(gx0.y, gy0.y, gz0.y); + detail::tvec3<T> g010 = detail::tvec3<T>(gx0.z, gy0.z, gz0.z); + detail::tvec3<T> g110 = detail::tvec3<T>(gx0.w, gy0.w, gz0.w); + detail::tvec3<T> g001 = detail::tvec3<T>(gx1.x, gy1.x, gz1.x); + detail::tvec3<T> g101 = detail::tvec3<T>(gx1.y, gy1.y, gz1.y); + detail::tvec3<T> g011 = detail::tvec3<T>(gx1.z, gy1.z, gz1.z); + detail::tvec3<T> g111 = detail::tvec3<T>(gx1.w, gy1.w, gz1.w); + + detail::tvec4<T> norm0 = taylorInvSqrt(detail::tvec4<T>(dot(g000, g000), dot(g010, g010), dot(g100, g100), dot(g110, g110))); + g000 *= norm0.x; + g010 *= norm0.y; + g100 *= norm0.z; + g110 *= norm0.w; + detail::tvec4<T> norm1 = taylorInvSqrt(detail::tvec4<T>(dot(g001, g001), dot(g011, g011), dot(g101, g101), dot(g111, g111))); + g001 *= norm1.x; + g011 *= norm1.y; + g101 *= norm1.z; + g111 *= norm1.w; + + T n000 = dot(g000, Pf0); + T n100 = dot(g100, detail::tvec3<T>(Pf1.x, Pf0.y, Pf0.z)); + T n010 = dot(g010, detail::tvec3<T>(Pf0.x, Pf1.y, Pf0.z)); + T n110 = dot(g110, detail::tvec3<T>(Pf1.x, Pf1.y, Pf0.z)); + T n001 = dot(g001, detail::tvec3<T>(Pf0.x, Pf0.y, Pf1.z)); + T n101 = dot(g101, detail::tvec3<T>(Pf1.x, Pf0.y, Pf1.z)); + T n011 = dot(g011, detail::tvec3<T>(Pf0.x, Pf1.y, Pf1.z)); + T n111 = dot(g111, Pf1); + + detail::tvec3<T> fade_xyz = fade(Pf0); + detail::tvec4<T> n_z = mix(detail::tvec4<T>(n000, n100, n010, n110), detail::tvec4<T>(n001, n101, n011, n111), fade_xyz.z); + detail::tvec2<T> n_yz = mix(detail::tvec2<T>(n_z.x, n_z.y), detail::tvec2<T>(n_z.z, n_z.w), fade_xyz.y); + T n_xyz = mix(n_yz.x, n_yz.y, fade_xyz.x); + return T(2.2) * n_xyz; + } + + // Classic Perlin noise, periodic version + template <typename T> + GLM_FUNC_QUALIFIER T perlin(detail::tvec4<T> const & P, detail::tvec4<T> const & rep) + { + detail::tvec4<T> Pi0 = mod(floor(P), rep); // Integer part modulo rep + detail::tvec4<T> Pi1 = mod(Pi0 + T(1), rep); // Integer part + 1 mod rep + detail::tvec4<T> Pf0 = fract(P); // Fractional part for interpolation + detail::tvec4<T> Pf1 = Pf0 - T(1); // Fractional part - 1.0 + detail::tvec4<T> ix = detail::tvec4<T>(Pi0.x, Pi1.x, Pi0.x, Pi1.x); + detail::tvec4<T> iy = detail::tvec4<T>(Pi0.y, Pi0.y, Pi1.y, Pi1.y); + detail::tvec4<T> iz0(Pi0.z); + detail::tvec4<T> iz1(Pi1.z); + detail::tvec4<T> iw0(Pi0.w); + detail::tvec4<T> iw1(Pi1.w); + + detail::tvec4<T> ixy = permute(permute(ix) + iy); + detail::tvec4<T> ixy0 = permute(ixy + iz0); + detail::tvec4<T> ixy1 = permute(ixy + iz1); + detail::tvec4<T> ixy00 = permute(ixy0 + iw0); + detail::tvec4<T> ixy01 = permute(ixy0 + iw1); + detail::tvec4<T> ixy10 = permute(ixy1 + iw0); + detail::tvec4<T> ixy11 = permute(ixy1 + iw1); + + detail::tvec4<T> gx00 = ixy00 / T(7); + detail::tvec4<T> gy00 = floor(gx00) / T(7); + detail::tvec4<T> gz00 = floor(gy00) / T(6); + gx00 = fract(gx00) - T(0.5); + gy00 = fract(gy00) - T(0.5); + gz00 = fract(gz00) - T(0.5); + detail::tvec4<T> gw00 = detail::tvec4<T>(0.75) - abs(gx00) - abs(gy00) - abs(gz00); + detail::tvec4<T> sw00 = step(gw00, detail::tvec4<T>(0)); + gx00 -= sw00 * (step(0.0, gx00) - T(0.5)); + gy00 -= sw00 * (step(0.0, gy00) - T(0.5)); + + detail::tvec4<T> gx01 = ixy01 / T(7); + detail::tvec4<T> gy01 = floor(gx01) / T(7); + detail::tvec4<T> gz01 = floor(gy01) / T(6); + gx01 = fract(gx01) - T(0.5); + gy01 = fract(gy01) - T(0.5); + gz01 = fract(gz01) - T(0.5); + detail::tvec4<T> gw01 = detail::tvec4<T>(0.75) - abs(gx01) - abs(gy01) - abs(gz01); + detail::tvec4<T> sw01 = step(gw01, detail::tvec4<T>(0.0)); + gx01 -= sw01 * (step(0.0, gx01) - T(0.5)); + gy01 -= sw01 * (step(0.0, gy01) - T(0.5)); + + detail::tvec4<T> gx10 = ixy10 / T(7); + detail::tvec4<T> gy10 = floor(gx10) / T(7); + detail::tvec4<T> gz10 = floor(gy10) / T(6); + gx10 = fract(gx10) - T(0.5); + gy10 = fract(gy10) - T(0.5); + gz10 = fract(gz10) - T(0.5); + detail::tvec4<T> gw10 = detail::tvec4<T>(0.75) - abs(gx10) - abs(gy10) - abs(gz10); + detail::tvec4<T> sw10 = step(gw10, detail::tvec4<T>(0.0)); + gx10 -= sw10 * (step(0.0, gx10) - T(0.5)); + gy10 -= sw10 * (step(0.0, gy10) - T(0.5)); + + detail::tvec4<T> gx11 = ixy11 / T(7); + detail::tvec4<T> gy11 = floor(gx11) / T(7); + detail::tvec4<T> gz11 = floor(gy11) / T(6); + gx11 = fract(gx11) - T(0.5); + gy11 = fract(gy11) - T(0.5); + gz11 = fract(gz11) - T(0.5); + detail::tvec4<T> gw11 = detail::tvec4<T>(0.75) - abs(gx11) - abs(gy11) - abs(gz11); + detail::tvec4<T> sw11 = step(gw11, detail::tvec4<T>(0.0)); + gx11 -= sw11 * (step(0.0, gx11) - T(0.5)); + gy11 -= sw11 * (step(0.0, gy11) - T(0.5)); + + detail::tvec4<T> g0000(gx00.x, gy00.x, gz00.x, gw00.x); + detail::tvec4<T> g1000(gx00.y, gy00.y, gz00.y, gw00.y); + detail::tvec4<T> g0100(gx00.z, gy00.z, gz00.z, gw00.z); + detail::tvec4<T> g1100(gx00.w, gy00.w, gz00.w, gw00.w); + detail::tvec4<T> g0010(gx10.x, gy10.x, gz10.x, gw10.x); + detail::tvec4<T> g1010(gx10.y, gy10.y, gz10.y, gw10.y); + detail::tvec4<T> g0110(gx10.z, gy10.z, gz10.z, gw10.z); + detail::tvec4<T> g1110(gx10.w, gy10.w, gz10.w, gw10.w); + detail::tvec4<T> g0001(gx01.x, gy01.x, gz01.x, gw01.x); + detail::tvec4<T> g1001(gx01.y, gy01.y, gz01.y, gw01.y); + detail::tvec4<T> g0101(gx01.z, gy01.z, gz01.z, gw01.z); + detail::tvec4<T> g1101(gx01.w, gy01.w, gz01.w, gw01.w); + detail::tvec4<T> g0011(gx11.x, gy11.x, gz11.x, gw11.x); + detail::tvec4<T> g1011(gx11.y, gy11.y, gz11.y, gw11.y); + detail::tvec4<T> g0111(gx11.z, gy11.z, gz11.z, gw11.z); + detail::tvec4<T> g1111(gx11.w, gy11.w, gz11.w, gw11.w); + + detail::tvec4<T> norm00 = taylorInvSqrt(detail::tvec4<T>(dot(g0000, g0000), dot(g0100, g0100), dot(g1000, g1000), dot(g1100, g1100))); + g0000 *= norm00.x; + g0100 *= norm00.y; + g1000 *= norm00.z; + g1100 *= norm00.w; + + detail::tvec4<T> norm01 = taylorInvSqrt(detail::tvec4<T>(dot(g0001, g0001), dot(g0101, g0101), dot(g1001, g1001), dot(g1101, g1101))); + g0001 *= norm01.x; + g0101 *= norm01.y; + g1001 *= norm01.z; + g1101 *= norm01.w; + + detail::tvec4<T> norm10 = taylorInvSqrt(detail::tvec4<T>(dot(g0010, g0010), dot(g0110, g0110), dot(g1010, g1010), dot(g1110, g1110))); + g0010 *= norm10.x; + g0110 *= norm10.y; + g1010 *= norm10.z; + g1110 *= norm10.w; + + detail::tvec4<T> norm11 = taylorInvSqrt(detail::tvec4<T>(dot(g0011, g0011), dot(g0111, g0111), dot(g1011, g1011), dot(g1111, g1111))); + g0011 *= norm11.x; + g0111 *= norm11.y; + g1011 *= norm11.z; + g1111 *= norm11.w; + + T n0000 = dot(g0000, Pf0); + T n1000 = dot(g1000, detail::tvec4<T>(Pf1.x, Pf0.y, Pf0.z, Pf0.w)); + T n0100 = dot(g0100, detail::tvec4<T>(Pf0.x, Pf1.y, Pf0.z, Pf0.w)); + T n1100 = dot(g1100, detail::tvec4<T>(Pf1.x, Pf1.y, Pf0.z, Pf0.w)); + T n0010 = dot(g0010, detail::tvec4<T>(Pf0.x, Pf0.y, Pf1.z, Pf0.w)); + T n1010 = dot(g1010, detail::tvec4<T>(Pf1.x, Pf0.y, Pf1.z, Pf0.w)); + T n0110 = dot(g0110, detail::tvec4<T>(Pf0.x, Pf1.y, Pf1.z, Pf0.w)); + T n1110 = dot(g1110, detail::tvec4<T>(Pf1.x, Pf1.y, Pf1.z, Pf0.w)); + T n0001 = dot(g0001, detail::tvec4<T>(Pf0.x, Pf0.y, Pf0.z, Pf1.w)); + T n1001 = dot(g1001, detail::tvec4<T>(Pf1.x, Pf0.y, Pf0.z, Pf1.w)); + T n0101 = dot(g0101, detail::tvec4<T>(Pf0.x, Pf1.y, Pf0.z, Pf1.w)); + T n1101 = dot(g1101, detail::tvec4<T>(Pf1.x, Pf1.y, Pf0.z, Pf1.w)); + T n0011 = dot(g0011, detail::tvec4<T>(Pf0.x, Pf0.y, Pf1.z, Pf1.w)); + T n1011 = dot(g1011, detail::tvec4<T>(Pf1.x, Pf0.y, Pf1.z, Pf1.w)); + T n0111 = dot(g0111, detail::tvec4<T>(Pf0.x, Pf1.y, Pf1.z, Pf1.w)); + T n1111 = dot(g1111, Pf1); + + detail::tvec4<T> fade_xyzw = fade(Pf0); + detail::tvec4<T> n_0w = mix(detail::tvec4<T>(n0000, n1000, n0100, n1100), detail::tvec4<T>(n0001, n1001, n0101, n1101), fade_xyzw.w); + detail::tvec4<T> n_1w = mix(detail::tvec4<T>(n0010, n1010, n0110, n1110), detail::tvec4<T>(n0011, n1011, n0111, n1111), fade_xyzw.w); + detail::tvec4<T> n_zw = mix(n_0w, n_1w, fade_xyzw.z); + detail::tvec2<T> n_yzw = mix(detail::tvec2<T>(n_zw.x, n_zw.y), detail::tvec2<T>(n_zw.z, n_zw.w), fade_xyzw.y); + T n_xyzw = mix(n_yzw.x, n_yzw.y, fade_xyzw.x); + return T(2.2) * n_xyzw; + } + + template <typename T> + GLM_FUNC_QUALIFIER T simplex(glm::detail::tvec2<T> const & v) + { + detail::tvec4<T> const C = detail::tvec4<T>( + T( 0.211324865405187), // (3.0 - sqrt(3.0)) / 6.0 + T( 0.366025403784439), // 0.5 * (sqrt(3.0) - 1.0) + T(-0.577350269189626), // -1.0 + 2.0 * C.x + T( 0.024390243902439)); // 1.0 / 41.0 + + // First corner + detail::tvec2<T> i = floor(v + dot(v, detail::tvec2<T>(C[1]))); + detail::tvec2<T> x0 = v - i + dot(i, detail::tvec2<T>(C[0])); + + // Other corners + //i1.x = step( x0.y, x0.x ); // x0.x > x0.y ? 1.0 : 0.0 + //i1.y = 1.0 - i1.x; + detail::tvec2<T> i1 = (x0.x > x0.y) ? detail::tvec2<T>(1, 0) : detail::tvec2<T>(0, 1); + // x0 = x0 - 0.0 + 0.0 * C.xx ; + // x1 = x0 - i1 + 1.0 * C.xx ; + // x2 = x0 - 1.0 + 2.0 * C.xx ; + detail::tvec4<T> x12 = detail::tvec4<T>(x0.x, x0.y, x0.x, x0.y) + detail::tvec4<T>(C.x, C.x, C.z, C.z); + x12 = detail::tvec4<T>(detail::tvec2<T>(x12) - i1, x12.z, x12.w); + + // Permutations + i = mod(i, T(289)); // Avoid truncation effects in permutation + detail::tvec3<T> p = permute( + permute(i.y + detail::tvec3<T>(T(0), i1.y, T(1))) + + i.x + detail::tvec3<T>(T(0), i1.x, T(1))); + + detail::tvec3<T> m = max(T(0.5) - detail::tvec3<T>( + dot(x0, x0), + dot(detail::tvec2<T>(x12.x, x12.y), detail::tvec2<T>(x12.x, x12.y)), + dot(detail::tvec2<T>(x12.z, x12.w), detail::tvec2<T>(x12.z, x12.w))), T(0)); + m = m * m ; + m = m * m ; + + // Gradients: 41 points uniformly over a line, mapped onto a diamond. + // The ring size 17*17 = 289 is close to a multiple of 41 (41*7 = 287) + + detail::tvec3<T> x = T(2) * fract(p * C.w) - T(1); + detail::tvec3<T> h = abs(x) - T(0.5); + detail::tvec3<T> ox = floor(x + T(0.5)); + detail::tvec3<T> a0 = x - ox; + + // Normalise gradients implicitly by scaling m + // Inlined for speed: m *= taylorInvSqrt( a0*a0 + h*h ); + m *= T(1.79284291400159) - T(0.85373472095314) * (a0 * a0 + h * h); + + // Compute final noise value at P + detail::tvec3<T> g; + g.x = a0.x * x0.x + h.x * x0.y; + //g.yz = a0.yz * x12.xz + h.yz * x12.yw; + g.y = a0.y * x12.x + h.y * x12.y; + g.z = a0.z * x12.z + h.z * x12.w; + return T(130) * dot(m, g); + } + + template <typename T> + GLM_FUNC_QUALIFIER T simplex(detail::tvec3<T> const & v) + { + detail::tvec2<T> const C(1.0 / 6.0, 1.0 / 3.0); + detail::tvec4<T> const D(0.0, 0.5, 1.0, 2.0); + + // First corner + detail::tvec3<T> i(floor(v + dot(v, detail::tvec3<T>(C.y)))); + detail::tvec3<T> x0(v - i + dot(i, detail::tvec3<T>(C.x))); + + // Other corners + detail::tvec3<T> g(step(detail::tvec3<T>(x0.y, x0.z, x0.x), x0)); + detail::tvec3<T> l(T(1) - g); + detail::tvec3<T> i1(min(g, detail::tvec3<T>(l.z, l.x, l.y))); + detail::tvec3<T> i2(max(g, detail::tvec3<T>(l.z, l.x, l.y))); + + // x0 = x0 - 0.0 + 0.0 * C.xxx; + // x1 = x0 - i1 + 1.0 * C.xxx; + // x2 = x0 - i2 + 2.0 * C.xxx; + // x3 = x0 - 1.0 + 3.0 * C.xxx; + detail::tvec3<T> x1(x0 - i1 + C.x); + detail::tvec3<T> x2(x0 - i2 + C.y); // 2.0*C.x = 1/3 = C.y + detail::tvec3<T> x3(x0 - D.y); // -1.0+3.0*C.x = -0.5 = -D.y + + // Permutations + i = mod289(i); + detail::tvec4<T> p(permute(permute(permute( + i.z + detail::tvec4<T>(T(0), i1.z, i2.z, T(1))) + + i.y + detail::tvec4<T>(T(0), i1.y, i2.y, T(1))) + + i.x + detail::tvec4<T>(T(0), i1.x, i2.x, T(1)))); + + // Gradients: 7x7 points over a square, mapped onto an octahedron. + // The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294) + T n_ = T(0.142857142857); // 1.0/7.0 + detail::tvec3<T> ns(n_ * detail::tvec3<T>(D.w, D.y, D.z) - detail::tvec3<T>(D.x, D.z, D.x)); + + detail::tvec4<T> j(p - T(49) * floor(p * ns.z * ns.z)); // mod(p,7*7) + + detail::tvec4<T> x_(floor(j * ns.z)); + detail::tvec4<T> y_(floor(j - T(7) * x_)); // mod(j,N) + + detail::tvec4<T> x(x_ * ns.x + ns.y); + detail::tvec4<T> y(y_ * ns.x + ns.y); + detail::tvec4<T> h(T(1) - abs(x) - abs(y)); + + detail::tvec4<T> b0(x.x, x.y, y.x, y.y); + detail::tvec4<T> b1(x.z, x.w, y.z, y.w); + + // vec4 s0 = vec4(lessThan(b0,0.0))*2.0 - 1.0; + // vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0; + detail::tvec4<T> s0(floor(b0) * T(2) + T(1)); + detail::tvec4<T> s1(floor(b1) * T(2) + T(1)); + detail::tvec4<T> sh(-step(h, detail::tvec4<T>(0.0))); + + detail::tvec4<T> a0 = detail::tvec4<T>(b0.x, b0.z, b0.y, b0.w) + detail::tvec4<T>(s0.x, s0.z, s0.y, s0.w) * detail::tvec4<T>(sh.x, sh.x, sh.y, sh.y); + detail::tvec4<T> a1 = detail::tvec4<T>(b1.x, b1.z, b1.y, b1.w) + detail::tvec4<T>(s1.x, s1.z, s1.y, s1.w) * detail::tvec4<T>(sh.z, sh.z, sh.w, sh.w); + + detail::tvec3<T> p0(a0.x, a0.y, h.x); + detail::tvec3<T> p1(a0.z, a0.w, h.y); + detail::tvec3<T> p2(a1.x, a1.y, h.z); + detail::tvec3<T> p3(a1.z, a1.w, h.w); + + // Normalise gradients + detail::tvec4<T> norm = taylorInvSqrt(detail::tvec4<T>(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3))); + p0 *= norm.x; + p1 *= norm.y; + p2 *= norm.z; + p3 *= norm.w; + + // Mix final noise value + detail::tvec4<T> m = max(T(0.6) - detail::tvec4<T>(dot(x0, x0), dot(x1, x1), dot(x2, x2), dot(x3, x3)), T(0)); + m = m * m; + return T(42) * dot(m * m, detail::tvec4<T>(dot(p0, x0), dot(p1, x1), dot(p2, x2), dot(p3, x3))); + } + + template <typename T> + GLM_FUNC_QUALIFIER T simplex(detail::tvec4<T> const & v) + { + detail::tvec4<T> const C( + 0.138196601125011, // (5 - sqrt(5))/20 G4 + 0.276393202250021, // 2 * G4 + 0.414589803375032, // 3 * G4 + -0.447213595499958); // -1 + 4 * G4 + + // (sqrt(5) - 1)/4 = F4, used once below + T const F4 = T(0.309016994374947451); + + // First corner + detail::tvec4<T> i = floor(v + dot(v, vec4(F4))); + detail::tvec4<T> x0 = v - i + dot(i, vec4(C.x)); + + // Other corners + + // Rank sorting originally contributed by Bill Licea-Kane, AMD (formerly ATI) + detail::tvec4<T> i0; + detail::tvec3<T> isX = step(detail::tvec3<T>(x0.y, x0.z, x0.w), detail::tvec3<T>(x0.x)); + detail::tvec3<T> isYZ = step(detail::tvec3<T>(x0.z, x0.w, x0.w), detail::tvec3<T>(x0.y, x0.y, x0.z)); + // i0.x = dot(isX, vec3(1.0)); + //i0.x = isX.x + isX.y + isX.z; + //i0.yzw = T(1) - isX; + i0 = detail::tvec4<T>(isX.x + isX.y + isX.z, T(1) - isX); + // i0.y += dot(isYZ.xy, vec2(1.0)); + i0.y += isYZ.x + isYZ.y; + //i0.zw += 1.0 - detail::tvec2<T>(isYZ.x, isYZ.y); + i0.z += T(1) - isYZ.x; + i0.w += T(1) - isYZ.y; + i0.z += isYZ.z; + i0.w += T(1) - isYZ.z; + + // i0 now contains the unique values 0,1,2,3 in each channel + detail::tvec4<T> i3 = clamp(i0, 0.0, 1.0); + detail::tvec4<T> i2 = clamp(i0 - 1.0, 0.0, 1.0); + detail::tvec4<T> i1 = clamp(i0 - 2.0, 0.0, 1.0); + + // x0 = x0 - 0.0 + 0.0 * C.xxxx + // x1 = x0 - i1 + 0.0 * C.xxxx + // x2 = x0 - i2 + 0.0 * C.xxxx + // x3 = x0 - i3 + 0.0 * C.xxxx + // x4 = x0 - 1.0 + 4.0 * C.xxxx + detail::tvec4<T> x1 = x0 - i1 + C.x; + detail::tvec4<T> x2 = x0 - i2 + C.y; + detail::tvec4<T> x3 = x0 - i3 + C.z; + detail::tvec4<T> x4 = x0 + C.w; + + // Permutations + i = mod(i, T(289)); + T j0 = permute(permute(permute(permute(i.w) + i.z) + i.y) + i.x); + detail::tvec4<T> j1 = permute(permute(permute(permute( + i.w + detail::tvec4<T>(i1.w, i2.w, i3.w, T(1))) + + i.z + detail::tvec4<T>(i1.z, i2.z, i3.z, T(1))) + + i.y + detail::tvec4<T>(i1.y, i2.y, i3.y, T(1))) + + i.x + detail::tvec4<T>(i1.x, i2.x, i3.x, T(1))); + + // Gradients: 7x7x6 points over a cube, mapped onto a 4-cross polytope + // 7*7*6 = 294, which is close to the ring size 17*17 = 289. + detail::tvec4<T> ip = detail::tvec4<T>(T(1) / T(294), T(1) / T(49), T(1) / T(7), T(0)); + + detail::tvec4<T> p0 = grad4(j0, ip); + detail::tvec4<T> p1 = grad4(j1.x, ip); + detail::tvec4<T> p2 = grad4(j1.y, ip); + detail::tvec4<T> p3 = grad4(j1.z, ip); + detail::tvec4<T> p4 = grad4(j1.w, ip); + + // Normalise gradients + detail::tvec4<T> norm = taylorInvSqrt(detail::tvec4<T>(dot(p0, p0), dot(p1, p1), dot(p2, p2), dot(p3, p3))); + p0 *= norm.x; + p1 *= norm.y; + p2 *= norm.z; + p3 *= norm.w; + p4 *= taylorInvSqrt(dot(p4, p4)); + + // Mix contributions from the five corners + detail::tvec3<T> m0 = max(T(0.6) - detail::tvec3<T>(dot(x0, x0), dot(x1, x1), dot(x2, x2)), T(0)); + detail::tvec2<T> m1 = max(T(0.6) - detail::tvec2<T>(dot(x3, x3), dot(x4, x4) ), T(0)); + m0 = m0 * m0; + m1 = m1 * m1; + return T(49) * + (dot(m0 * m0, detail::tvec3<T>(dot(p0, x0), dot(p1, x1), dot(p2, x2))) + + dot(m1 * m1, detail::tvec2<T>(dot(p3, x3), dot(p4, x4)))); + } +}//namespace glm diff --git a/include/gal/opengl/glm/gtc/quaternion.hpp b/include/gal/opengl/glm/gtc/quaternion.hpp new file mode 100644 index 0000000..705d3d3 --- /dev/null +++ b/include/gal/opengl/glm/gtc/quaternion.hpp @@ -0,0 +1,381 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtc_quaternion +/// @file glm/gtc/quaternion.hpp +/// @date 2009-05-21 / 2012-12-20 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// @see gtc_half_float (dependence) +/// @see gtc_constants (dependence) +/// +/// @defgroup gtc_quaternion GLM_GTC_quaternion +/// @ingroup gtc +/// +/// @brief Defines a templated quaternion type and several quaternion operations. +/// +/// <glm/gtc/quaternion.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTC_quaternion +#define GLM_GTC_quaternion GLM_VERSION + +// Dependency: +#include "../glm.hpp" +#include "../gtc/half_float.hpp" +#include "../gtc/constants.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTC_quaternion extension included") +#endif + +namespace glm{ +namespace detail +{ + template <typename T> + struct tquat// : public genType<T, tquat> + { + enum ctor{null}; + + typedef T value_type; + typedef std::size_t size_type; + + public: + value_type x, y, z, w; + + GLM_FUNC_DECL size_type length() const; + + // Constructors + tquat(); + explicit tquat( + value_type const & s, + glm::detail::tvec3<T> const & v); + explicit tquat( + value_type const & w, + value_type const & x, + value_type const & y, + value_type const & z); + + // Convertions + + /// Build a quaternion from euler angles (pitch, yaw, roll), in radians. + explicit tquat( + tvec3<T> const & eulerAngles); + explicit tquat( + tmat3x3<T> const & m); + explicit tquat( + tmat4x4<T> const & m); + + // Accesses + value_type & operator[](int i); + value_type const & operator[](int i) const; + + // Operators + tquat<T> & operator*=(value_type const & s); + tquat<T> & operator/=(value_type const & s); + }; + + template <typename T> + detail::tquat<T> operator- ( + detail::tquat<T> const & q); + + template <typename T> + detail::tquat<T> operator+ ( + detail::tquat<T> const & q, + detail::tquat<T> const & p); + + template <typename T> + detail::tquat<T> operator* ( + detail::tquat<T> const & q, + detail::tquat<T> const & p); + + template <typename T> + detail::tvec3<T> operator* ( + detail::tquat<T> const & q, + detail::tvec3<T> const & v); + + template <typename T> + detail::tvec3<T> operator* ( + detail::tvec3<T> const & v, + detail::tquat<T> const & q); + + template <typename T> + detail::tvec4<T> operator* ( + detail::tquat<T> const & q, + detail::tvec4<T> const & v); + + template <typename T> + detail::tvec4<T> operator* ( + detail::tvec4<T> const & v, + detail::tquat<T> const & q); + + template <typename T> + detail::tquat<T> operator* ( + detail::tquat<T> const & q, + typename detail::tquat<T>::value_type const & s); + + template <typename T> + detail::tquat<T> operator* ( + typename detail::tquat<T>::value_type const & s, + detail::tquat<T> const & q); + + template <typename T> + detail::tquat<T> operator/ ( + detail::tquat<T> const & q, + typename detail::tquat<T>::value_type const & s); + +} //namespace detail + + /// @addtogroup gtc_quaternion + /// @{ + + /// Returns the length of the quaternion. + /// + /// @see gtc_quaternion + template <typename T> + T length( + detail::tquat<T> const & q); + + /// Returns the normalized quaternion. + /// + /// @see gtc_quaternion + template <typename T> + detail::tquat<T> normalize( + detail::tquat<T> const & q); + + /// Returns dot product of q1 and q2, i.e., q1[0] * q2[0] + q1[1] * q2[1] + ... + /// + /// @see gtc_quaternion + template <typename T> + T dot( + detail::tquat<T> const & q1, + detail::tquat<T> const & q2); + + /// Spherical linear interpolation of two quaternions. + /// The interpolation is oriented and the rotation is performed at constant speed. + /// For short path spherical linear interpolation, use the slerp function. + /// + /// @param x A quaternion + /// @param y A quaternion + /// @param a Interpolation factor. The interpolation is defined beyond the range [0, 1]. + /// @tparam T Value type used to build the quaternion. Supported: half, float or double. + /// @see gtc_quaternion + /// @see - slerp(detail::tquat<T> const & x, detail::tquat<T> const & y, T const & a) + template <typename T> + detail::tquat<T> mix( + detail::tquat<T> const & x, + detail::tquat<T> const & y, + T const & a); + + /// Linear interpolation of two quaternions. + /// The interpolation is oriented. + /// + /// @param x A quaternion + /// @param y A quaternion + /// @param a Interpolation factor. The interpolation is defined in the range [0, 1]. + /// @tparam T Value type used to build the quaternion. Supported: half, float or double. + /// @see gtc_quaternion + template <typename T> + detail::tquat<T> lerp( + detail::tquat<T> const & x, + detail::tquat<T> const & y, + T const & a); + + /// Spherical linear interpolation of two quaternions. + /// The interpolation always take the short path and the rotation is performed at constant speed. + /// + /// @param x A quaternion + /// @param y A quaternion + /// @param a Interpolation factor. The interpolation is defined beyond the range [0, 1]. + /// @tparam T Value type used to build the quaternion. Supported: half, float or double. + /// @see gtc_quaternion + template <typename T> + detail::tquat<T> slerp( + detail::tquat<T> const & x, + detail::tquat<T> const & y, + T const & a); + + /// Returns the q conjugate. + /// + /// @see gtc_quaternion + template <typename T> + detail::tquat<T> conjugate( + detail::tquat<T> const & q); + + /// Returns the q inverse. + /// + /// @see gtc_quaternion + template <typename T> + detail::tquat<T> inverse( + detail::tquat<T> const & q); + + /// Rotates a quaternion from an vector of 3 components axis and an angle. + /// + /// @param q Source orientation + /// @param angle Angle expressed in radians if GLM_FORCE_RADIANS is define or degrees otherwise. + /// @param axis Axis of the rotation, must be normalized. + /// + /// @see gtc_quaternion + template <typename T> + detail::tquat<T> rotate( + detail::tquat<T> const & q, + typename detail::tquat<T>::value_type const & angle, + detail::tvec3<T> const & axis); + + /// Returns euler angles, yitch as x, yaw as y, roll as z. + /// + /// @see gtc_quaternion + template <typename T> + detail::tvec3<T> eulerAngles( + detail::tquat<T> const & x); + + /// Returns roll value of euler angles expressed in radians if GLM_FORCE_RADIANS is define or degrees otherwise. + /// + /// @see gtx_quaternion + template <typename valType> + valType roll( + detail::tquat<valType> const & x); + + /// Returns pitch value of euler angles expressed in radians if GLM_FORCE_RADIANS is define or degrees otherwise. + /// + /// @see gtx_quaternion + template <typename valType> + valType pitch( + detail::tquat<valType> const & x); + + /// Returns yaw value of euler angles expressed in radians if GLM_FORCE_RADIANS is define or degrees otherwise. + /// + /// @see gtx_quaternion + template <typename valType> + valType yaw( + detail::tquat<valType> const & x); + + /// Converts a quaternion to a 3 * 3 matrix. + /// + /// @see gtc_quaternion + template <typename T> + detail::tmat3x3<T> mat3_cast( + detail::tquat<T> const & x); + + /// Converts a quaternion to a 4 * 4 matrix. + /// + /// @see gtc_quaternion + template <typename T> + detail::tmat4x4<T> mat4_cast( + detail::tquat<T> const & x); + + /// Converts a 3 * 3 matrix to a quaternion. + /// + /// @see gtc_quaternion + template <typename T> + detail::tquat<T> quat_cast( + detail::tmat3x3<T> const & x); + + /// Converts a 4 * 4 matrix to a quaternion. + /// + /// @see gtc_quaternion + template <typename T> + detail::tquat<T> quat_cast( + detail::tmat4x4<T> const & x); + + /// Returns the quaternion rotation angle. + /// + /// @see gtc_quaternion + template <typename valType> + valType angle( + detail::tquat<valType> const & x); + + /// Returns the q rotation axis. + /// + /// @see gtc_quaternion + template <typename valType> + detail::tvec3<valType> axis( + detail::tquat<valType> const & x); + + /// Build a quaternion from an angle and a normalized axis. + /// + /// @param angle Angle expressed in radians if GLM_FORCE_RADIANS is define or degrees otherwise. + /// @param x x component of the x-axis, x, y, z must be a normalized axis + /// @param y y component of the y-axis, x, y, z must be a normalized axis + /// @param z z component of the z-axis, x, y, z must be a normalized axis + /// + /// @see gtc_quaternion + template <typename valType> + detail::tquat<valType> angleAxis( + valType const & angle, + valType const & x, + valType const & y, + valType const & z); + + /// Build a quaternion from an angle and a normalized axis. + /// + /// @param angle Angle expressed in radians if GLM_FORCE_RADIANS is define or degrees otherwise. + /// @param axis Axis of the quaternion, must be normalized. + /// + /// @see gtc_quaternion + template <typename valType> + detail::tquat<valType> angleAxis( + valType const & angle, + detail::tvec3<valType> const & axis); + + /// Quaternion of floating-point numbers. + /// + /// @see gtc_quaternion + typedef detail::tquat<float> quat; + + /// Quaternion of half-precision floating-point numbers. + /// + /// @see gtc_quaternion + typedef detail::tquat<detail::half> hquat; + + /// Quaternion of single-precision floating-point numbers. + /// + /// @see gtc_quaternion + typedef detail::tquat<float> fquat; + + /// Quaternion of double-precision floating-point numbers. + /// + /// @see gtc_quaternion + typedef detail::tquat<double> dquat; + + /// Quaternion of low precision floating-point numbers. + /// + /// @see gtc_quaternion + typedef detail::tquat<lowp_float> lowp_quat; + + /// Quaternion of medium precision floating-point numbers. + /// + /// @see gtc_quaternion + typedef detail::tquat<mediump_float> mediump_quat; + + /// Quaternion of high precision floating-point numbers. + /// + /// @see gtc_quaternion + typedef detail::tquat<highp_float> highp_quat; + + /// @} +} //namespace glm + +#include "quaternion.inl" + +#endif//GLM_GTC_quaternion diff --git a/include/gal/opengl/glm/gtc/quaternion.inl b/include/gal/opengl/glm/gtc/quaternion.inl new file mode 100644 index 0000000..8b83865 --- /dev/null +++ b/include/gal/opengl/glm/gtc/quaternion.inl @@ -0,0 +1,792 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtc_quaternion +/// @file glm/gtc/quaternion.inl +/// @date 2009-05-21 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#include <limits> + +namespace glm{ +namespace detail +{ + template <typename T> + GLM_FUNC_QUALIFIER typename tquat<T>::size_type tquat<T>::length() const + { + return 4; + } + + template <typename T> + GLM_FUNC_QUALIFIER tquat<T>::tquat() : + x(0), + y(0), + z(0), + w(1) + {} + + template <typename T> + GLM_FUNC_QUALIFIER tquat<T>::tquat + ( + value_type const & s, + tvec3<T> const & v + ) : + x(v.x), + y(v.y), + z(v.z), + w(s) + {} + + template <typename T> + GLM_FUNC_QUALIFIER tquat<T>::tquat + ( + value_type const & w, + value_type const & x, + value_type const & y, + value_type const & z + ) : + x(x), + y(y), + z(z), + w(w) + {} + + ////////////////////////////////////////////////////////////// + // tquat conversions + + //template <typename valType> + //GLM_FUNC_QUALIFIER tquat<valType>::tquat + //( + // valType const & pitch, + // valType const & yaw, + // valType const & roll + //) + //{ + // tvec3<valType> eulerAngle(pitch * valType(0.5), yaw * valType(0.5), roll * valType(0.5)); + // tvec3<valType> c = glm::cos(eulerAngle * valType(0.5)); + // tvec3<valType> s = glm::sin(eulerAngle * valType(0.5)); + // + // this->w = c.x * c.y * c.z + s.x * s.y * s.z; + // this->x = s.x * c.y * c.z - c.x * s.y * s.z; + // this->y = c.x * s.y * c.z + s.x * c.y * s.z; + // this->z = c.x * c.y * s.z - s.x * s.y * c.z; + //} + + template <typename T> + GLM_FUNC_QUALIFIER tquat<T>::tquat + ( + tvec3<T> const & eulerAngle + ) + { + tvec3<T> c = glm::cos(eulerAngle * value_type(0.5)); + tvec3<T> s = glm::sin(eulerAngle * value_type(0.5)); + + this->w = c.x * c.y * c.z + s.x * s.y * s.z; + this->x = s.x * c.y * c.z - c.x * s.y * s.z; + this->y = c.x * s.y * c.z + s.x * c.y * s.z; + this->z = c.x * c.y * s.z - s.x * s.y * c.z; + } + + template <typename T> + GLM_FUNC_QUALIFIER tquat<T>::tquat + ( + tmat3x3<T> const & m + ) + { + *this = quat_cast(m); + } + + template <typename T> + GLM_FUNC_QUALIFIER tquat<T>::tquat + ( + tmat4x4<T> const & m + ) + { + *this = quat_cast(m); + } + + ////////////////////////////////////////////////////////////// + // tquat<T> accesses + + template <typename T> + GLM_FUNC_QUALIFIER typename tquat<T>::value_type & tquat<T>::operator [] (int i) + { + return (&x)[i]; + } + + template <typename T> + GLM_FUNC_QUALIFIER typename tquat<T>::value_type const & tquat<T>::operator [] (int i) const + { + return (&x)[i]; + } + + ////////////////////////////////////////////////////////////// + // tquat<valType> operators + + template <typename T> + GLM_FUNC_QUALIFIER tquat<T> & tquat<T>::operator *= + ( + value_type const & s + ) + { + this->w *= s; + this->x *= s; + this->y *= s; + this->z *= s; + return *this; + } + + template <typename T> + GLM_FUNC_QUALIFIER tquat<T> & tquat<T>::operator /= + ( + value_type const & s + ) + { + this->w /= s; + this->x /= s; + this->y /= s; + this->z /= s; + return *this; + } + + ////////////////////////////////////////////////////////////// + // tquat<valType> external operators + + template <typename T> + GLM_FUNC_QUALIFIER detail::tquat<T> operator- + ( + detail::tquat<T> const & q + ) + { + return detail::tquat<T>(-q.w, -q.x, -q.y, -q.z); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tquat<T> operator+ + ( + detail::tquat<T> const & q, + detail::tquat<T> const & p + ) + { + return detail::tquat<T>( + q.w + p.w, + q.x + p.x, + q.y + p.y, + q.z + p.z); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tquat<T> operator* + ( + detail::tquat<T> const & q, + detail::tquat<T> const & p + ) + { + return detail::tquat<T>( + q.w * p.w - q.x * p.x - q.y * p.y - q.z * p.z, + q.w * p.x + q.x * p.w + q.y * p.z - q.z * p.y, + q.w * p.y + q.y * p.w + q.z * p.x - q.x * p.z, + q.w * p.z + q.z * p.w + q.x * p.y - q.y * p.x); + } + + // Transformation + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> operator* + ( + detail::tquat<T> const & q, + detail::tvec3<T> const & v + ) + { + typename detail::tquat<T>::value_type Two(2); + + detail::tvec3<T> uv, uuv; + detail::tvec3<T> QuatVector(q.x, q.y, q.z); + uv = glm::cross(QuatVector, v); + uuv = glm::cross(QuatVector, uv); + uv *= (Two * q.w); + uuv *= Two; + + return v + uv + uuv; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> operator* + ( + detail::tvec3<T> const & v, + detail::tquat<T> const & q + ) + { + return inverse(q) * v; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec4<T> operator* + ( + detail::tquat<T> const & q, + detail::tvec4<T> const & v + ) + { + return detail::tvec4<T>(q * detail::tvec3<T>(v), v.w); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec4<T> operator* + ( + detail::tvec4<T> const & v, + detail::tquat<T> const & q + ) + { + return inverse(q) * v; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tquat<T> operator* + ( + detail::tquat<T> const & q, + typename detail::tquat<T>::value_type const & s + ) + { + return detail::tquat<T>( + q.w * s, q.x * s, q.y * s, q.z * s); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tquat<T> operator* + ( + typename detail::tquat<T>::value_type const & s, + detail::tquat<T> const & q + ) + { + return q * s; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tquat<T> operator/ + ( + detail::tquat<T> const & q, + typename detail::tquat<T>::value_type const & s + ) + { + return detail::tquat<T>( + q.w / s, q.x / s, q.y / s, q.z / s); + } + + ////////////////////////////////////// + // Boolean operators + + template <typename T> + GLM_FUNC_QUALIFIER bool operator== + ( + detail::tquat<T> const & q1, + detail::tquat<T> const & q2 + ) + { + return (q1.x == q2.x) && (q1.y == q2.y) && (q1.z == q2.z) && (q1.w == q2.w); + } + + template <typename T> + GLM_FUNC_QUALIFIER bool operator!= + ( + detail::tquat<T> const & q1, + detail::tquat<T> const & q2 + ) + { + return (q1.x != q2.x) || (q1.y != q2.y) || (q1.z != q2.z) || (q1.w != q2.w); + } + +}//namespace detail + + //////////////////////////////////////////////////////// + template <typename T> + GLM_FUNC_QUALIFIER T length + ( + detail::tquat<T> const & q + ) + { + return glm::sqrt(dot(q, q)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tquat<T> normalize + ( + detail::tquat<T> const & q + ) + { + typename detail::tquat<T>::value_type len = length(q); + if(len <= typename detail::tquat<T>::value_type(0)) // Problem + return detail::tquat<T>(1, 0, 0, 0); + typename detail::tquat<T>::value_type oneOverLen = typename detail::tquat<T>::value_type(1) / len; + return detail::tquat<T>(q.w * oneOverLen, q.x * oneOverLen, q.y * oneOverLen, q.z * oneOverLen); + } + + template <typename T> + GLM_FUNC_QUALIFIER T dot + ( + detail::tquat<T> const & q1, + detail::tquat<T> const & q2 + ) + { + return q1.x * q2.x + q1.y * q2.y + q1.z * q2.z + q1.w * q2.w; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tquat<T> cross + ( + detail::tquat<T> const & q1, + detail::tquat<T> const & q2 + ) + { + return detail::tquat<T>( + q1.w * q2.w - q1.x * q2.x - q1.y * q2.y - q1.z * q2.z, + q1.w * q2.x + q1.x * q2.w + q1.y * q2.z - q1.z * q2.y, + q1.w * q2.y + q1.y * q2.w + q1.z * q2.x - q1.x * q2.z, + q1.w * q2.z + q1.z * q2.w + q1.x * q2.y - q1.y * q2.x); + } +/* + // (x * sin(1 - a) * angle / sin(angle)) + (y * sin(a) * angle / sin(angle)) + template <typename T> + GLM_FUNC_QUALIFIER detail::tquat<T> mix + ( + detail::tquat<T> const & x, + detail::tquat<T> const & y, + typename detail::tquat<T>::value_type const & a + ) + { + if(a <= typename detail::tquat<T>::value_type(0)) return x; + if(a >= typename detail::tquat<T>::value_type(1)) return y; + + float fCos = dot(x, y); + detail::tquat<T> y2(y); //BUG!!! tquat<T> y2; + if(fCos < typename detail::tquat<T>::value_type(0)) + { + y2 = -y; + fCos = -fCos; + } + + //if(fCos > 1.0f) // problem + float k0, k1; + if(fCos > typename detail::tquat<T>::value_type(0.9999)) + { + k0 = typename detail::tquat<T>::value_type(1) - a; + k1 = typename detail::tquat<T>::value_type(0) + a; //BUG!!! 1.0f + a; + } + else + { + typename detail::tquat<T>::value_type fSin = sqrt(T(1) - fCos * fCos); + typename detail::tquat<T>::value_type fAngle = atan(fSin, fCos); + typename detail::tquat<T>::value_type fOneOverSin = T(1) / fSin; + k0 = sin((typename detail::tquat<T>::value_type(1) - a) * fAngle) * fOneOverSin; + k1 = sin((typename detail::tquat<T>::value_type(0) + a) * fAngle) * fOneOverSin; + } + + return detail::tquat<T>( + k0 * x.w + k1 * y2.w, + k0 * x.x + k1 * y2.x, + k0 * x.y + k1 * y2.y, + k0 * x.z + k1 * y2.z); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tquat<T> mix2 + ( + detail::tquat<T> const & x, + detail::tquat<T> const & y, + T const & a + ) + { + bool flip = false; + if(a <= T(0)) return x; + if(a >= T(1)) return y; + + T cos_t = dot(x, y); + if(cos_t < T(0)) + { + cos_t = -cos_t; + flip = true; + } + + T alpha(0), beta(0); + + if(T(1) - cos_t < 1e-7) + beta = T(1) - alpha; + else + { + T theta = acos(cos_t); + T sin_t = sin(theta); + beta = sin(theta * (T(1) - alpha)) / sin_t; + alpha = sin(alpha * theta) / sin_t; + } + + if(flip) + alpha = -alpha; + + return normalize(beta * x + alpha * y); + } +*/ + + template <typename T> + GLM_FUNC_QUALIFIER detail::tquat<T> mix + ( + detail::tquat<T> const & x, + detail::tquat<T> const & y, + T const & a + ) + { + T cosTheta = dot(x, y); + + // Perform a linear interpolation when cosTheta is close to 1 to avoid side effect of sin(angle) becoming a zero denominator + if(cosTheta > T(1) - epsilon<T>()) + { + // Linear interpolation + return detail::tquat<T>( + mix(x.w, y.w, a), + mix(x.x, y.x, a), + mix(x.y, y.y, a), + mix(x.z, y.z, a)); + } + else + { + // Essential Mathematics, page 467 + T angle = acos(cosTheta); + return (sin((T(1) - a) * angle) * x + sin(a * angle) * y) / sin(angle); + } + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tquat<T> lerp + ( + detail::tquat<T> const & x, + detail::tquat<T> const & y, + T const & a + ) + { + // Lerp is only defined in [0, 1] + assert(a >= T(0)); + assert(a <= T(1)); + + return x * (T(1) - a) + (y * a); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tquat<T> slerp + ( + detail::tquat<T> const & x, + detail::tquat<T> const & y, + T const & a + ) + { + detail::tquat<T> z = y; + + T cosTheta = dot(x, y); + + // If cosTheta < 0, the interpolation will take the long way around the sphere. + // To fix this, one quat must be negated. + if (cosTheta < T(0)) + { + z = -y; + cosTheta = -cosTheta; + } + + // Perform a linear interpolation when cosTheta is close to 1 to avoid side effect of sin(angle) becoming a zero denominator + if(cosTheta > T(1) - epsilon<T>()) + { + // Linear interpolation + return detail::tquat<T>( + mix(x.w, z.w, a), + mix(x.x, z.x, a), + mix(x.y, z.y, a), + mix(x.z, z.z, a)); + } + else + { + // Essential Mathematics, page 467 + T angle = acos(cosTheta); + return (sin((T(1) - a) * angle) * x + sin(a * angle) * z) / sin(angle); + } + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tquat<T> conjugate + ( + detail::tquat<T> const & q + ) + { + return detail::tquat<T>(q.w, -q.x, -q.y, -q.z); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tquat<T> inverse + ( + detail::tquat<T> const & q + ) + { + return conjugate(q) / dot(q, q); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tquat<T> rotate + ( + detail::tquat<T> const & q, + typename detail::tquat<T>::value_type const & angle, + detail::tvec3<T> const & v + ) + { + detail::tvec3<T> Tmp = v; + + // Axis of rotation must be normalised + typename detail::tquat<T>::value_type len = glm::length(Tmp); + if(abs(len - T(1)) > T(0.001)) + { + T oneOverLen = T(1) / len; + Tmp.x *= oneOverLen; + Tmp.y *= oneOverLen; + Tmp.z *= oneOverLen; + } + +#ifdef GLM_FORCE_RADIANS + typename detail::tquat<T>::value_type const AngleRad(angle); +#else + typename detail::tquat<T>::value_type const AngleRad = radians(angle); +#endif + typename detail::tquat<T>::value_type const Sin = sin(AngleRad * T(0.5)); + + return q * detail::tquat<T>(cos(AngleRad * T(0.5)), Tmp.x * Sin, Tmp.y * Sin, Tmp.z * Sin); + //return gtc::quaternion::cross(q, detail::tquat<T>(cos(AngleRad * T(0.5)), Tmp.x * fSin, Tmp.y * fSin, Tmp.z * fSin)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> eulerAngles + ( + detail::tquat<T> const & x + ) + { + return detail::tvec3<T>(pitch(x), yaw(x), roll(x)); + } + + template <typename valType> + GLM_FUNC_QUALIFIER valType roll + ( + detail::tquat<valType> const & q + ) + { +#ifdef GLM_FORCE_RADIANS + return valType(atan2(valType(2) * (q.x * q.y + q.w * q.z), q.w * q.w + q.x * q.x - q.y * q.y - q.z * q.z)); +#else + return glm::degrees(atan(valType(2) * (q.x * q.y + q.w * q.z), q.w * q.w + q.x * q.x - q.y * q.y - q.z * q.z)); +#endif + } + + template <typename valType> + GLM_FUNC_QUALIFIER valType pitch + ( + detail::tquat<valType> const & q + ) + { +#ifdef GLM_FORCE_RADIANS + return valType(atan2(valType(2) * (q.y * q.z + q.w * q.x), q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z)); +#else + return glm::degrees(atan(valType(2) * (q.y * q.z + q.w * q.x), q.w * q.w - q.x * q.x - q.y * q.y + q.z * q.z)); +#endif + } + + template <typename valType> + GLM_FUNC_QUALIFIER valType yaw + ( + detail::tquat<valType> const & q + ) + { +#ifdef GLM_FORCE_RADIANS + return asin(valType(-2) * (q.x * q.z - q.w * q.y)); +#else + return glm::degrees(asin(valType(-2) * (q.x * q.z - q.w * q.y))); +#endif + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat3x3<T> mat3_cast + ( + detail::tquat<T> const & q + ) + { + detail::tmat3x3<T> Result(T(1)); + Result[0][0] = 1 - 2 * q.y * q.y - 2 * q.z * q.z; + Result[0][1] = 2 * q.x * q.y + 2 * q.w * q.z; + Result[0][2] = 2 * q.x * q.z - 2 * q.w * q.y; + + Result[1][0] = 2 * q.x * q.y - 2 * q.w * q.z; + Result[1][1] = 1 - 2 * q.x * q.x - 2 * q.z * q.z; + Result[1][2] = 2 * q.y * q.z + 2 * q.w * q.x; + + Result[2][0] = 2 * q.x * q.z + 2 * q.w * q.y; + Result[2][1] = 2 * q.y * q.z - 2 * q.w * q.x; + Result[2][2] = 1 - 2 * q.x * q.x - 2 * q.y * q.y; + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> mat4_cast + ( + detail::tquat<T> const & q + ) + { + return detail::tmat4x4<T>(mat3_cast(q)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tquat<T> quat_cast + ( + detail::tmat3x3<T> const & m + ) + { + typename detail::tquat<T>::value_type fourXSquaredMinus1 = m[0][0] - m[1][1] - m[2][2]; + typename detail::tquat<T>::value_type fourYSquaredMinus1 = m[1][1] - m[0][0] - m[2][2]; + typename detail::tquat<T>::value_type fourZSquaredMinus1 = m[2][2] - m[0][0] - m[1][1]; + typename detail::tquat<T>::value_type fourWSquaredMinus1 = m[0][0] + m[1][1] + m[2][2]; + + int biggestIndex = 0; + typename detail::tquat<T>::value_type fourBiggestSquaredMinus1 = fourWSquaredMinus1; + if(fourXSquaredMinus1 > fourBiggestSquaredMinus1) + { + fourBiggestSquaredMinus1 = fourXSquaredMinus1; + biggestIndex = 1; + } + if(fourYSquaredMinus1 > fourBiggestSquaredMinus1) + { + fourBiggestSquaredMinus1 = fourYSquaredMinus1; + biggestIndex = 2; + } + if(fourZSquaredMinus1 > fourBiggestSquaredMinus1) + { + fourBiggestSquaredMinus1 = fourZSquaredMinus1; + biggestIndex = 3; + } + + typename detail::tquat<T>::value_type biggestVal = sqrt(fourBiggestSquaredMinus1 + T(1)) * T(0.5); + typename detail::tquat<T>::value_type mult = T(0.25) / biggestVal; + + detail::tquat<T> Result; + switch(biggestIndex) + { + case 0: + Result.w = biggestVal; + Result.x = (m[1][2] - m[2][1]) * mult; + Result.y = (m[2][0] - m[0][2]) * mult; + Result.z = (m[0][1] - m[1][0]) * mult; + break; + case 1: + Result.w = (m[1][2] - m[2][1]) * mult; + Result.x = biggestVal; + Result.y = (m[0][1] + m[1][0]) * mult; + Result.z = (m[2][0] + m[0][2]) * mult; + break; + case 2: + Result.w = (m[2][0] - m[0][2]) * mult; + Result.x = (m[0][1] + m[1][0]) * mult; + Result.y = biggestVal; + Result.z = (m[1][2] + m[2][1]) * mult; + break; + case 3: + Result.w = (m[0][1] - m[1][0]) * mult; + Result.x = (m[2][0] + m[0][2]) * mult; + Result.y = (m[1][2] + m[2][1]) * mult; + Result.z = biggestVal; + break; + + default: // Silence a -Wswitch-default warning in GCC. Should never actually get here. Assert is just for sanity. + assert(false); + break; + } + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tquat<T> quat_cast + ( + detail::tmat4x4<T> const & m4 + ) + { + return quat_cast(detail::tmat3x3<T>(m4)); + } + + template <typename T> + GLM_FUNC_QUALIFIER T angle + ( + detail::tquat<T> const & x + ) + { +#ifdef GLM_FORCE_RADIANS + return acos(x.w) * T(2); +#else + return glm::degrees(acos(x.w) * T(2)); +#endif + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> axis + ( + detail::tquat<T> const & x + ) + { + T tmp1 = T(1) - x.w * x.w; + if(tmp1 <= T(0)) + return detail::tvec3<T>(0, 0, 1); + T tmp2 = T(1) / sqrt(tmp1); + return detail::tvec3<T>(x.x * tmp2, x.y * tmp2, x.z * tmp2); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tquat<valType> angleAxis + ( + valType const & angle, + valType const & x, + valType const & y, + valType const & z + ) + { + return angleAxis(angle, detail::tvec3<valType>(x, y, z)); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tquat<valType> angleAxis + ( + valType const & angle, + detail::tvec3<valType> const & v + ) + { + detail::tquat<valType> result; + +#ifdef GLM_FORCE_RADIANS + valType a(angle); +#else + valType a(glm::radians(angle)); +#endif + valType s = glm::sin(a * valType(0.5)); + + result.w = glm::cos(a * valType(0.5)); + result.x = v.x * s; + result.y = v.y * s; + result.z = v.z * s; + return result; + } + +}//namespace glm diff --git a/include/gal/opengl/glm/gtc/random.hpp b/include/gal/opengl/glm/gtc/random.hpp new file mode 100644 index 0000000..3cda59c --- /dev/null +++ b/include/gal/opengl/glm/gtc/random.hpp @@ -0,0 +1,114 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtc_random +/// @file glm/gtc/random.hpp +/// @date 2011-09-18 / 2011-09-18 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// @see gtc_half_float (dependence) +/// @see gtx_random (extended) +/// +/// @defgroup gtc_random GLM_GTC_random +/// @ingroup gtc +/// +/// @brief Generate random number from various distribution methods. +/// +/// <glm/gtc/random.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTC_random +#define GLM_GTC_random GLM_VERSION + +// Dependency: +#include "../glm.hpp" +#include "../gtc/half_float.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTC_random extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_random + /// @{ + + /// Generate random numbers in the interval [Min, Max], according a linear distribution + /// + /// @param Min + /// @param Max + /// @tparam genType Value type. Currently supported: half (not recommanded), float or double scalars and vectors. + /// @see gtc_random + template <typename genType> + genType linearRand( + genType const & Min, + genType const & Max); + + /// Generate random numbers in the interval [Min, Max], according a gaussian distribution + /// + /// @param Mean + /// @param Deviation + /// @see gtc_random + template <typename genType> + genType gaussRand( + genType const & Mean, + genType const & Deviation); + + /// Generate a random 2D vector which coordinates are regulary distributed on a circle of a given radius + /// + /// @param Radius + /// @see gtc_random + template <typename T> + detail::tvec2<T> circularRand( + T const & Radius); + + /// Generate a random 3D vector which coordinates are regulary distributed on a sphere of a given radius + /// + /// @param Radius + /// @see gtc_random + template <typename T> + detail::tvec3<T> sphericalRand( + T const & Radius); + + /// Generate a random 2D vector which coordinates are regulary distributed within the area of a disk of a given radius + /// + /// @param Radius + /// @see gtc_random + template <typename T> + detail::tvec2<T> diskRand( + T const & Radius); + + /// Generate a random 3D vector which coordinates are regulary distributed within the volume of a ball of a given radius + /// + /// @param Radius + /// @see gtc_random + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> ballRand( + T const & Radius); + + /// @} +}//namespace glm + +#include "random.inl" + +#endif//GLM_GTC_random diff --git a/include/gal/opengl/glm/gtc/random.inl b/include/gal/opengl/glm/gtc/random.inl new file mode 100644 index 0000000..ca1bd7e --- /dev/null +++ b/include/gal/opengl/glm/gtc/random.inl @@ -0,0 +1,170 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtc_random +/// @file glm/gtc/random.inl +/// @date 2011-09-19 / 2012-04-07 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +#include <ctime> +#include <cassert> + +namespace glm{ +namespace detail +{ + struct compute_linearRand + { + template <typename T> + GLM_FUNC_QUALIFIER T operator() (T const & Min, T const & Max) const; +/* + { + GLM_STATIC_ASSERT(0, "'linearRand' invalid template parameter type. GLM_GTC_random only supports floating-point template types."); + return Min; + } +*/ + }; + + template <> + GLM_FUNC_QUALIFIER half compute_linearRand::operator()<half> (half const & Min, half const & Max) const + { + return half(float(std::rand()) / float(RAND_MAX) * (float(Max) - float(Min)) + float(Min)); + } + + template <> + GLM_FUNC_QUALIFIER float compute_linearRand::operator()<float> (float const & Min, float const & Max) const + { + return float(std::rand()) / float(RAND_MAX) * (Max - Min) + Min; + } + + template <> + GLM_FUNC_QUALIFIER double compute_linearRand::operator()<double> (double const & Min, double const & Max) const + { + return double(std::rand()) / double(RAND_MAX) * (Max - Min) + Min; + } + + template <> + GLM_FUNC_QUALIFIER long double compute_linearRand::operator()<long double> (long double const & Min, long double const & Max) const + { + return (long double)(std::rand()) / (long double)(RAND_MAX) * (Max - Min) + Min; + } +}//namespace detail + + template <typename genType> + GLM_FUNC_QUALIFIER genType linearRand + ( + genType const & Min, + genType const & Max + ) + { + return detail::compute_linearRand()(Min, Max); + } + + VECTORIZE_VEC_VEC(linearRand) + + template <typename genType> + GLM_FUNC_QUALIFIER genType gaussRand + ( + genType const & Mean, + genType const & Deviation + ) + { + genType w, x1, x2; + + do + { + x1 = linearRand(genType(-1), genType(1)); + x2 = linearRand(genType(-1), genType(1)); + + w = x1 * x1 + x2 * x2; + } while(w > genType(1)); + + return x2 * Deviation * Deviation * sqrt((genType(-2) * log(w)) / w) + Mean; + } + + VECTORIZE_VEC_VEC(gaussRand) + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec2<T> diskRand + ( + T const & Radius + ) + { + detail::tvec2<T> Result(T(0)); + T LenRadius(T(0)); + + do + { + Result = linearRand(detail::tvec2<T>(-Radius), detail::tvec2<T>(Radius)); + LenRadius = length(Result); + } + while(LenRadius > Radius); + + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> ballRand + ( + T const & Radius + ) + { + detail::tvec3<T> Result(T(0)); + T LenRadius(T(0)); + + do + { + Result = linearRand(detail::tvec3<T>(-Radius), detail::tvec3<T>(Radius)); + LenRadius = length(Result); + } + while(LenRadius > Radius); + + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec2<T> circularRand + ( + T const & Radius + ) + { + T a = linearRand(T(0), T(6.283185307179586476925286766559f)); + return detail::tvec2<T>(cos(a), sin(a)) * Radius; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> sphericalRand + ( + T const & Radius + ) + { + T z = linearRand(T(-1), T(1)); + T a = linearRand(T(0), T(6.283185307179586476925286766559f)); + + T r = sqrt(T(1) - z * z); + + T x = r * cos(a); + T y = r * sin(a); + + return detail::tvec3<T>(x, y, z) * Radius; + } +}//namespace glm diff --git a/include/gal/opengl/glm/gtc/reciprocal.hpp b/include/gal/opengl/glm/gtc/reciprocal.hpp new file mode 100644 index 0000000..4b04b66 --- /dev/null +++ b/include/gal/opengl/glm/gtc/reciprocal.hpp @@ -0,0 +1,133 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtc_reciprocal +/// @file glm/gtc/reciprocal.hpp +/// @date 2008-10-09 / 2012-01-25 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// +/// @defgroup gtc_reciprocal GLM_GTC_reciprocal +/// @ingroup gtc +/// +/// @brief Define secant, cosecant and cotangent functions. +/// +/// <glm/gtc/reciprocal.hpp> need to be included to use these features. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTC_reciprocal +#define GLM_GTC_reciprocal GLM_VERSION + +// Dependency: +#include "../glm.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTC_reciprocal extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_reciprocal + /// @{ + + /// Secant function. + /// hypotenuse / adjacent or 1 / cos(x) + /// + /// @see gtc_reciprocal + template <typename genType> + genType sec(genType const & angle); + + /// Cosecant function. + /// hypotenuse / opposite or 1 / sin(x) + /// + /// @see gtc_reciprocal + template <typename genType> + genType csc(genType const & angle); + + /// Cotangent function. + /// adjacent / opposite or 1 / tan(x) + /// + /// @see gtc_reciprocal + template <typename genType> + genType cot(genType const & angle); + + /// Inverse secant function. + /// + /// @see gtc_reciprocal + template <typename genType> + genType asec(genType const & x); + + /// Inverse cosecant function. + /// + /// @see gtc_reciprocal + template <typename genType> + genType acsc(genType const & x); + + /// Inverse cotangent function. + /// + /// @see gtc_reciprocal + template <typename genType> + genType acot(genType const & x); + + /// Secant hyperbolic function. + /// + /// @see gtc_reciprocal + template <typename genType> + genType sech(genType const & angle); + + /// Cosecant hyperbolic function. + /// + /// @see gtc_reciprocal + template <typename genType> + genType csch(genType const & angle); + + /// Cotangent hyperbolic function. + /// + /// @see gtc_reciprocal + template <typename genType> + genType coth(genType const & angle); + + /// Inverse secant hyperbolic function. + /// + /// @see gtc_reciprocal + template <typename genType> + genType asech(genType const & x); + + /// Inverse cosecant hyperbolic function. + /// + /// @see gtc_reciprocal + template <typename genType> + genType acsch(genType const & x); + + /// Inverse cotangent hyperbolic function. + /// + /// @see gtc_reciprocal + template <typename genType> + genType acoth(genType const & x); + + /// @} +}//namespace glm + +#include "reciprocal.inl" + +#endif//GLM_GTC_reciprocal diff --git a/include/gal/opengl/glm/gtc/reciprocal.inl b/include/gal/opengl/glm/gtc/reciprocal.inl new file mode 100644 index 0000000..84f5cb7 --- /dev/null +++ b/include/gal/opengl/glm/gtc/reciprocal.inl @@ -0,0 +1,199 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtc_reciprocal +/// @file glm/gtc/reciprocal.inl +/// @date 2008-10-09 / 2012-04-07 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + // sec + template <typename genType> + GLM_FUNC_QUALIFIER genType sec + ( + genType const & angle + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'sec' only accept floating-point values"); + + return genType(1) / glm::cos(angle); + } + + VECTORIZE_VEC(sec) + + // csc + template <typename genType> + GLM_FUNC_QUALIFIER genType csc + ( + genType const & angle + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'csc' only accept floating-point values"); + + return genType(1) / glm::sin(angle); + } + + VECTORIZE_VEC(csc) + + // cot + template <typename genType> + GLM_FUNC_QUALIFIER genType cot + ( + genType const & angle + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'cot' only accept floating-point values"); + + return genType(1) / glm::tan(angle); + } + + VECTORIZE_VEC(cot) + + // asec + template <typename genType> + GLM_FUNC_QUALIFIER genType asec + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'asec' only accept floating-point values"); + + return acos(genType(1) / x); + } + + VECTORIZE_VEC(asec) + + // acsc + template <typename genType> + GLM_FUNC_QUALIFIER genType acsc + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'acsc' only accept floating-point values"); + + return asin(genType(1) / x); + } + + VECTORIZE_VEC(acsc) + + // acot + template <typename genType> + GLM_FUNC_QUALIFIER genType acot + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'acot' only accept floating-point values"); + + genType const pi_over_2 = genType(3.1415926535897932384626433832795 / 2.0); + return pi_over_2 - atan(x); + } + + VECTORIZE_VEC(acot) + + // sech + template <typename genType> + GLM_FUNC_QUALIFIER genType sech + ( + genType const & angle + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'sech' only accept floating-point values"); + + return genType(1) / glm::cosh(angle); + } + + VECTORIZE_VEC(sech) + + // csch + template <typename genType> + GLM_FUNC_QUALIFIER genType csch + ( + genType const & angle + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'csch' only accept floating-point values"); + + return genType(1) / glm::sinh(angle); + } + + VECTORIZE_VEC(csch) + + // coth + template <typename genType> + GLM_FUNC_QUALIFIER genType coth + ( + genType const & angle + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'coth' only accept floating-point values"); + + return glm::cosh(angle) / glm::sinh(angle); + } + + VECTORIZE_VEC(coth) + + // asech + template <typename genType> + GLM_FUNC_QUALIFIER genType asech + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'asech' only accept floating-point values"); + + return acosh(genType(1) / x); + } + + VECTORIZE_VEC(asech) + + // acsch + template <typename genType> + GLM_FUNC_QUALIFIER genType acsch + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'acsch' only accept floating-point values"); + + return asinh(genType(1) / x); + } + + VECTORIZE_VEC(acsch) + + // acoth + template <typename genType> + GLM_FUNC_QUALIFIER genType acoth + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'acoth' only accept floating-point values"); + + return atanh(genType(1) / x); + } + + VECTORIZE_VEC(acoth) +}//namespace glm diff --git a/include/gal/opengl/glm/gtc/swizzle.hpp b/include/gal/opengl/glm/gtc/swizzle.hpp new file mode 100644 index 0000000..31fdf61 --- /dev/null +++ b/include/gal/opengl/glm/gtc/swizzle.hpp @@ -0,0 +1,375 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtc_swizzle +/// @file glm/gtc/swizzle.hpp +/// @date 2010-02-20 / 2011-06-05 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// +/// @defgroup gtc_swizzle GLM_GTC_swizzle +/// @ingroup gtc +/// +/// @brief Provide functions to emulate GLSL swizzle operator fonctionalities. +/// +/// <glm/gtc/swizzle.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTC_swizzle +#define GLM_GTC_swizzle GLM_VERSION + +// Dependency: +#include "../glm.hpp" +#include "../gtc/type_precision.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTC_swizzle extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_swizzle + /// @{ + + template <typename T, template <typename> class vecType> + T const & swizzle( + vecType<T> const & v, + comp x); + + template <typename T, template <typename> class vecType> + detail::tvec2<T> const & swizzle( + vecType<T> const & v, + comp x, comp y); + + template <typename T, template <typename> class vecType> + detail::tvec3<T> const & swizzle( + vecType<T> const & v, + comp x, comp y, comp z); + + template <typename T, template <typename> class vecType> + detail::tvec4<T> const & swizzle( + vecType<T> const & v, + comp x, comp y, comp z, comp w); + + template <typename T, template <typename> class vecType> + T & swizzle( + vecType<T> & v, + comp x); + + template <typename T, template <typename> class vecType> + detail::tref2<T> swizzle( + vecType<T> & v, + comp x, comp y); + + template <typename T, template <typename> class vecType> + detail::tref3<T> swizzle( + vecType<T> & v, + comp x, comp y, comp z); + + template <typename T, template <typename> class vecType> + detail::tref4<T> swizzle( + vecType<T> & v, + comp x, comp y, comp z, comp w); + +# define static_swizzle1_const(TYPE, SIZE) \ + template <comp x> \ + GLM_FUNC_QUALIFIER TYPE swizzle(detail::tvec##SIZE<TYPE> const & v) \ + {return v[x];} + +# define static_swizzle1_ref(TYPE, SIZE) \ + template <comp x> \ + GLM_FUNC_QUALIFIER TYPE& swizzle(detail::tvec##SIZE<TYPE> & v) \ + {return v[x];} + + static_swizzle1_ref(detail::float16, 2) + static_swizzle1_ref(detail::float16, 3) + static_swizzle1_ref(detail::float16, 4) + static_swizzle1_ref(detail::float32, 2) + static_swizzle1_ref(detail::float32, 3) + static_swizzle1_ref(detail::float32, 4) + static_swizzle1_ref(detail::float64, 2) + static_swizzle1_ref(detail::float64, 3) + static_swizzle1_ref(detail::float64, 4) + + static_swizzle1_ref(detail::int8, 2) + static_swizzle1_ref(detail::int8, 3) + static_swizzle1_ref(detail::int8, 4) + static_swizzle1_ref(detail::int16, 2) + static_swizzle1_ref(detail::int16, 3) + static_swizzle1_ref(detail::int16, 4) + static_swizzle1_ref(detail::int32, 2) + static_swizzle1_ref(detail::int32, 3) + static_swizzle1_ref(detail::int32, 4) + static_swizzle1_ref(detail::int64, 2) + static_swizzle1_ref(detail::int64, 3) + static_swizzle1_ref(detail::int64, 4) + + static_swizzle1_ref(detail::uint8, 2) + static_swizzle1_ref(detail::uint8, 3) + static_swizzle1_ref(detail::uint8, 4) + static_swizzle1_ref(detail::uint16, 2) + static_swizzle1_ref(detail::uint16, 3) + static_swizzle1_ref(detail::uint16, 4) + static_swizzle1_ref(detail::uint32, 2) + static_swizzle1_ref(detail::uint32, 3) + static_swizzle1_ref(detail::uint32, 4) + static_swizzle1_ref(detail::uint64, 2) + static_swizzle1_ref(detail::uint64, 3) + static_swizzle1_ref(detail::uint64, 4) +/* +# define static_swizzle2_const(TYPE) \ + template <comp x, comp y> \ + GLM_FUNC_QUALIFIER TYPE swizzle(TYPE const & v) \ + {return TYPE(v[x], v[y]);} + +# define static_swizzle3_const(TYPE) \ + template <comp x, comp y, comp z> \ + GLM_FUNC_QUALIFIER TYPE swizzle(TYPE const & v) \ + {return TYPE(v[x], v[y], v[z]);} + +# define static_swizzle4_const(TYPE) \ + template <comp x, comp y, comp z, comp w> \ + GLM_FUNC_QUALIFIER TYPE swizzle(TYPE const & v) \ + {return TYPE(v[x], v[y], v[z], v[w]);} +*/ + +# define static_swizzle2_const(TYPE, SIZE) \ + template <comp x, comp y> \ + GLM_FUNC_QUALIFIER detail::tvec2<TYPE> swizzle(detail::tvec##SIZE<TYPE> const & v) \ + {return detail::tvec2<TYPE>(v[x], v[y]);} + +# define static_swizzle3_const(TYPE, SIZE) \ + template <comp x, comp y, comp z> \ + GLM_FUNC_QUALIFIER detail::tvec3<TYPE> swizzle(detail::tvec##SIZE<TYPE> const & v) \ + {return detail::tvec3<TYPE>(v[x], v[y], v[z]);} + +# define static_swizzle4_const(TYPE, SIZE) \ + template <comp x, comp y, comp z, comp w> \ + GLM_FUNC_QUALIFIER detail::tvec4<TYPE> swizzle(detail::tvec##SIZE<TYPE> const & v) \ + {return detail::tvec4<TYPE>(v[x], v[y], v[z], v[w]);} + + + static_swizzle2_const(glm::f16, 2) + static_swizzle2_const(glm::f16, 3) + static_swizzle2_const(glm::f16, 4) + static_swizzle2_const(glm::f32, 2) + static_swizzle2_const(glm::f32, 3) + static_swizzle2_const(glm::f32, 4) + static_swizzle2_const(glm::f64, 2) + static_swizzle2_const(glm::f64, 3) + static_swizzle2_const(glm::f64, 4) + + static_swizzle2_const(glm::i8, 2) + static_swizzle2_const(glm::i8, 3) + static_swizzle2_const(glm::i8, 4) + static_swizzle2_const(glm::i16, 2) + static_swizzle2_const(glm::i16, 3) + static_swizzle2_const(glm::i16, 4) + static_swizzle2_const(glm::i32, 2) + static_swizzle2_const(glm::i32, 3) + static_swizzle2_const(glm::i32, 4) + static_swizzle2_const(glm::i64, 2) + static_swizzle2_const(glm::i64, 3) + static_swizzle2_const(glm::i64, 4) + + static_swizzle2_const(glm::u8, 2) + static_swizzle2_const(glm::u8, 3) + static_swizzle2_const(glm::u8, 4) + static_swizzle2_const(glm::u16, 2) + static_swizzle2_const(glm::u16, 3) + static_swizzle2_const(glm::u16, 4) + static_swizzle2_const(glm::u32, 2) + static_swizzle2_const(glm::u32, 3) + static_swizzle2_const(glm::u32, 4) + static_swizzle2_const(glm::u64, 2) + static_swizzle2_const(glm::u64, 3) + static_swizzle2_const(glm::u64, 4) + + static_swizzle3_const(glm::f16, 2) + static_swizzle3_const(glm::f16, 3) + static_swizzle3_const(glm::f16, 4) + static_swizzle3_const(glm::f32, 2) + static_swizzle3_const(glm::f32, 3) + static_swizzle3_const(glm::f32, 4) + static_swizzle3_const(glm::f64, 2) + static_swizzle3_const(glm::f64, 3) + static_swizzle3_const(glm::f64, 4) + + static_swizzle3_const(glm::i8, 2) + static_swizzle3_const(glm::i8, 3) + static_swizzle3_const(glm::i8, 4) + static_swizzle3_const(glm::i16, 2) + static_swizzle3_const(glm::i16, 3) + static_swizzle3_const(glm::i16, 4) + static_swizzle3_const(glm::i32, 2) + static_swizzle3_const(glm::i32, 3) + static_swizzle3_const(glm::i32, 4) + static_swizzle3_const(glm::i64, 2) + static_swizzle3_const(glm::i64, 3) + static_swizzle3_const(glm::i64, 4) + + static_swizzle3_const(glm::u8, 2) + static_swizzle3_const(glm::u8, 3) + static_swizzle3_const(glm::u8, 4) + static_swizzle3_const(glm::u16, 2) + static_swizzle3_const(glm::u16, 3) + static_swizzle3_const(glm::u16, 4) + static_swizzle3_const(glm::u32, 2) + static_swizzle3_const(glm::u32, 3) + static_swizzle3_const(glm::u32, 4) + static_swizzle3_const(glm::u64, 2) + static_swizzle3_const(glm::u64, 3) + static_swizzle3_const(glm::u64, 4) + + static_swizzle4_const(glm::f16, 2) + static_swizzle4_const(glm::f16, 3) + static_swizzle4_const(glm::f16, 4) + static_swizzle4_const(glm::f32, 2) + static_swizzle4_const(glm::f32, 3) + static_swizzle4_const(glm::f32, 4) + static_swizzle4_const(glm::f64, 2) + static_swizzle4_const(glm::f64, 3) + static_swizzle4_const(glm::f64, 4) + + static_swizzle4_const(glm::i8, 2) + static_swizzle4_const(glm::i8, 3) + static_swizzle4_const(glm::i8, 4) + static_swizzle4_const(glm::i16, 2) + static_swizzle4_const(glm::i16, 3) + static_swizzle4_const(glm::i16, 4) + static_swizzle4_const(glm::i32, 2) + static_swizzle4_const(glm::i32, 3) + static_swizzle4_const(glm::i32, 4) + static_swizzle4_const(glm::i64, 2) + static_swizzle4_const(glm::i64, 3) + static_swizzle4_const(glm::i64, 4) + + static_swizzle4_const(glm::u8, 2) + static_swizzle4_const(glm::u8, 3) + static_swizzle4_const(glm::u8, 4) + static_swizzle4_const(glm::u16, 2) + static_swizzle4_const(glm::u16, 3) + static_swizzle4_const(glm::u16, 4) + static_swizzle4_const(glm::u32, 2) + static_swizzle4_const(glm::u32, 3) + static_swizzle4_const(glm::u32, 4) + static_swizzle4_const(glm::u64, 2) + static_swizzle4_const(glm::u64, 3) + static_swizzle4_const(glm::u64, 4) + +# define static_swizzle2_ref(TYPE, SIZE) \ + template <glm::comp x, glm::comp y> \ + GLM_FUNC_QUALIFIER glm::detail::tref2<TYPE> swizzle(detail::tvec##SIZE<TYPE> & v) \ + {return glm::detail::tref2<TYPE>(v[x], v[y]);} + +# define static_swizzle3_ref(TYPE, SIZE) \ + template <glm::comp x, glm::comp y, glm::comp z> \ + GLM_FUNC_QUALIFIER glm::detail::tref3<TYPE> swizzle(detail::tvec##SIZE<TYPE> & v) \ + {return glm::detail::tref3<TYPE>(v[x], v[y], v[z]);} + +# define static_swizzle4_ref(TYPE, SIZE) \ + template <glm::comp x, glm::comp y, glm::comp z, glm::comp w> \ + GLM_FUNC_QUALIFIER glm::detail::tref4<TYPE> swizzle(detail::tvec##SIZE<TYPE> & v) \ + {return glm::detail::tref4<TYPE>(v[x], v[y], v[z], v[w]);} + + static_swizzle2_ref(glm::f16, 2) + static_swizzle2_ref(glm::f16, 3) + static_swizzle2_ref(glm::f16, 4) + static_swizzle2_ref(glm::f32, 2) + static_swizzle2_ref(glm::f32, 3) + static_swizzle2_ref(glm::f32, 4) + static_swizzle2_ref(glm::f64, 2) + static_swizzle2_ref(glm::f64, 3) + static_swizzle2_ref(glm::f64, 4) + + static_swizzle2_ref(glm::i8, 2) + static_swizzle2_ref(glm::i8, 3) + static_swizzle2_ref(glm::i8, 4) + static_swizzle2_ref(glm::i16, 2) + static_swizzle2_ref(glm::i16, 3) + static_swizzle2_ref(glm::i16, 4) + static_swizzle2_ref(glm::i32, 2) + static_swizzle2_ref(glm::i32, 3) + static_swizzle2_ref(glm::i32, 4) + static_swizzle2_ref(glm::i64, 2) + static_swizzle2_ref(glm::i64, 3) + static_swizzle2_ref(glm::i64, 4) + + static_swizzle2_ref(glm::u8, 2) + static_swizzle2_ref(glm::u8, 3) + static_swizzle2_ref(glm::u8, 4) + static_swizzle2_ref(glm::u16, 2) + static_swizzle2_ref(glm::u16, 3) + static_swizzle2_ref(glm::u16, 4) + static_swizzle2_ref(glm::u32, 2) + static_swizzle2_ref(glm::u32, 3) + static_swizzle2_ref(glm::u32, 4) + static_swizzle2_ref(glm::u64, 2) + static_swizzle2_ref(glm::u64, 3) + static_swizzle2_ref(glm::u64, 4) + + static_swizzle3_ref(glm::f16, 3) + static_swizzle3_ref(glm::f16, 4) + static_swizzle3_ref(glm::f32, 3) + static_swizzle3_ref(glm::f32, 4) + static_swizzle3_ref(glm::f64, 3) + static_swizzle3_ref(glm::f64, 4) + + static_swizzle3_ref(glm::i8, 3) + static_swizzle3_ref(glm::i8, 4) + static_swizzle3_ref(glm::i16, 3) + static_swizzle3_ref(glm::i16, 4) + static_swizzle3_ref(glm::i32, 3) + static_swizzle3_ref(glm::i32, 4) + static_swizzle3_ref(glm::i64, 3) + static_swizzle3_ref(glm::i64, 4) + + static_swizzle3_ref(glm::u8, 3) + static_swizzle3_ref(glm::u8, 4) + static_swizzle3_ref(glm::u16, 3) + static_swizzle3_ref(glm::u16, 4) + static_swizzle3_ref(glm::u32, 3) + static_swizzle3_ref(glm::u32, 4) + static_swizzle3_ref(glm::u64, 3) + static_swizzle3_ref(glm::u64, 4) + + static_swizzle4_ref(glm::f16, 4) + static_swizzle4_ref(glm::f32, 4) + static_swizzle4_ref(glm::f64, 4) + + static_swizzle4_ref(glm::i8, 4) + static_swizzle4_ref(glm::i16, 4) + static_swizzle4_ref(glm::i32, 4) + static_swizzle4_ref(glm::i64, 4) + + static_swizzle4_ref(glm::u8, 4) + static_swizzle4_ref(glm::u16, 4) + static_swizzle4_ref(glm::u32, 4) + static_swizzle4_ref(glm::u64, 4) + + /// @} +}//namespace glm + +#include "swizzle.inl" + +#endif//GLM_GTC_swizzle diff --git a/include/gal/opengl/glm/gtc/swizzle.inl b/include/gal/opengl/glm/gtc/swizzle.inl new file mode 100644 index 0000000..043b8fc --- /dev/null +++ b/include/gal/opengl/glm/gtc/swizzle.inl @@ -0,0 +1,116 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtc_swizzle +/// @file glm/gtc/swizzle.inl +/// @date 2011-01-15 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template <typename T, template <typename> class vecType> + GLM_FUNC_QUALIFIER T swizzle + ( + vecType<T> const & v, + comp x + ) + { + assert(int(x) < int(vecType<T>::value_size)); + return v[x]; + } + + template <typename T, template <typename> class vecType> + GLM_FUNC_QUALIFIER detail::tvec2<T> swizzle + ( + vecType<T> const & v, + comp x, comp y + ) + { + return detail::tvec2<T>( + v[x], + v[y]); + } + + template <typename T, template <typename> class vecType> + GLM_FUNC_QUALIFIER detail::tvec3<T> swizzle + ( + vecType<T> const & v, + comp x, comp y, comp z + ) + { + return detail::tvec3<T>( + v[x], + v[y], + v[z]); + } + + template <typename T, template <typename> class vecType> + GLM_FUNC_QUALIFIER detail::tvec4<T> swizzle + ( + vecType<T> const & v, + comp x, comp y, comp z, comp w + ) + { + return detail::tvec4<T>(v[x], v[y], v[z], v[w]); + } + + template <typename T> + GLM_FUNC_QUALIFIER T& swizzle + ( + detail::tvec4<T> & v, + comp x + ) + { + return v[x]; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tref2<T> swizzle + ( + detail::tvec4<T> & v, + comp x, comp y + ) + { + return detail::tref2<T>(v[x], v[y]); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tref3<T> swizzle + ( + detail::tvec4<T> & v, + comp x, comp y, comp z + ) + { + return detail::tref3<T>(v[x], v[y], v[z]); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tref4<T> swizzle + ( + detail::tvec4<T> & v, + comp x, comp y, comp z, comp w + ) + { + return detail::tref4<T>(v[x], v[y], v[z], v[w]); + } +}//namespace glm diff --git a/include/gal/opengl/glm/gtc/type_precision.hpp b/include/gal/opengl/glm/gtc/type_precision.hpp new file mode 100644 index 0000000..80a96c3 --- /dev/null +++ b/include/gal/opengl/glm/gtc/type_precision.hpp @@ -0,0 +1,669 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtc_type_precision +/// @file glm/gtc/type_precision.hpp +/// @date 2009-06-04 / 2011-12-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// @see gtc_half_float (dependence) +/// @see gtc_quaternion (dependence) +/// +/// @defgroup gtc_type_precision GLM_GTC_type_precision +/// @ingroup gtc +/// +/// @brief Defines specific C++-based precision types. +/// +/// @ref core_precision defines types based on GLSL's precision qualifiers. This +/// extension defines types based on explicitly-sized C++ data types. +/// +/// <glm/gtc/type_precision.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTC_type_precision +#define GLM_GTC_type_precision GLM_VERSION + +// Dependency: +#include "../glm.hpp" +#include "../gtc/half_float.hpp" +#include "../gtc/quaternion.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTC_type_precision extension included") +#endif + +namespace glm +{ + /////////////////////////// + // Signed int vector types + + /// @addtogroup gtc_type_precision + /// @{ + + /// 8 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int8 int8; + + /// 16 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int16 int16; + + /// 32 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int32 int32; + + /// 64 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int64 int64; + + + /// 8 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int8 int8_t; + + /// 16 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int16 int16_t; + + /// 32 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int32 int32_t; + + /// 64 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int64 int64_t; + + + /// 8 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int8 i8; + + /// 16 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int16 i16; + + /// 32 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int32 i32; + + /// 64 bit signed integer type. + /// @see gtc_type_precision + typedef detail::int64 i64; + + + /// 8 bit signed integer scalar type. + /// @see gtc_type_precision + typedef detail::tvec1<i8> i8vec1; + + /// 8 bit signed integer vector of 2 components type. + /// @see gtc_type_precision + typedef detail::tvec2<i8> i8vec2; + + /// 8 bit signed integer vector of 3 components type. + /// @see gtc_type_precision + typedef detail::tvec3<i8> i8vec3; + + /// 8 bit signed integer vector of 4 components type. + /// @see gtc_type_precision + typedef detail::tvec4<i8> i8vec4; + + + /// 16 bit signed integer scalar type. + /// @see gtc_type_precision + typedef detail::tvec1<i16> i16vec1; + + /// 16 bit signed integer vector of 2 components type. + /// @see gtc_type_precision + typedef detail::tvec2<i16> i16vec2; + + /// 16 bit signed integer vector of 3 components type. + /// @see gtc_type_precision + typedef detail::tvec3<i16> i16vec3; + + /// 16 bit signed integer vector of 4 components type. + /// @see gtc_type_precision + typedef detail::tvec4<i16> i16vec4; + + + /// 32 bit signed integer scalar type. + /// @see gtc_type_precision + typedef detail::tvec1<i32> i32vec1; + + /// 32 bit signed integer vector of 2 components type. + /// @see gtc_type_precision + typedef detail::tvec2<i32> i32vec2; + + /// 32 bit signed integer vector of 3 components type. + /// @see gtc_type_precision + typedef detail::tvec3<i32> i32vec3; + + /// 32 bit signed integer vector of 4 components type. + /// @see gtc_type_precision + typedef detail::tvec4<i32> i32vec4; + + + /// 64 bit signed integer scalar type. + /// @see gtc_type_precision + typedef detail::tvec1<i64> i64vec1; + + /// 64 bit signed integer vector of 2 components type. + /// @see gtc_type_precision + typedef detail::tvec2<i64> i64vec2; + + /// 64 bit signed integer vector of 3 components type. + /// @see gtc_type_precision + typedef detail::tvec3<i64> i64vec3; + + /// 64 bit signed integer vector of 4 components type. + /// @see gtc_type_precision + typedef detail::tvec4<i64> i64vec4; + + + ///////////////////////////// + // Unsigned int vector types + + /// 8 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint8 uint8; + + /// 16 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint16 uint16; + + /// 32 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint32 uint32; + + /// 64 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint64 uint64; + + + /// 8 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint8 uint8_t; + + /// 16 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint16 uint16_t; + + /// 32 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint32 uint32_t; + + /// 64 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint64 uint64_t; + + + /// 8 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint8 u8; + + /// 16 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint16 u16; + + /// 32 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint32 u32; + + /// 64 bit unsigned integer type. + /// @see gtc_type_precision + typedef detail::uint64 u64; + + + /// 8 bit unsigned integer scalar type. + /// @see gtc_type_precision + typedef detail::tvec1<u8> u8vec1; + + /// 8 bit unsigned integer vector of 2 components type. + /// @see gtc_type_precision + typedef detail::tvec2<u8> u8vec2; + + /// 8 bit unsigned integer vector of 3 components type. + /// @see gtc_type_precision + typedef detail::tvec3<u8> u8vec3; + + /// 8 bit unsigned integer vector of 4 components type. + /// @see gtc_type_precision + typedef detail::tvec4<u8> u8vec4; + + + /// 16 bit unsigned integer scalar type. + /// @see gtc_type_precision + typedef detail::tvec1<u16> u16vec1; + + /// 16 bit unsigned integer vector of 2 components type. + /// @see gtc_type_precision + typedef detail::tvec2<u16> u16vec2; + + /// 16 bit unsigned integer vector of 3 components type. + /// @see gtc_type_precision + typedef detail::tvec3<u16> u16vec3; + + /// 16 bit unsigned integer vector of 4 components type. + /// @see gtc_type_precision + typedef detail::tvec4<u16> u16vec4; + + + /// 32 bit unsigned integer scalar type. + /// @see gtc_type_precision + typedef detail::tvec1<u32> u32vec1; + + /// 32 bit unsigned integer vector of 2 components type. + /// @see gtc_type_precision + typedef detail::tvec2<u32> u32vec2; + + /// 32 bit unsigned integer vector of 3 components type. + /// @see gtc_type_precision + typedef detail::tvec3<u32> u32vec3; + + /// 32 bit unsigned integer vector of 4 components type. + /// @see gtc_type_precision + typedef detail::tvec4<u32> u32vec4; + + + /// 64 bit unsigned integer scalar type. + /// @see gtc_type_precision + typedef detail::tvec1<u64> u64vec1; + + /// 64 bit unsigned integer vector of 2 components type. + /// @see gtc_type_precision + typedef detail::tvec2<u64> u64vec2; + + /// 64 bit unsigned integer vector of 3 components type. + /// @see gtc_type_precision + typedef detail::tvec3<u64> u64vec3; + + /// 64 bit unsigned integer vector of 4 components type. + /// @see gtc_type_precision + typedef detail::tvec4<u64> u64vec4; + + + ////////////////////// + // Float vector types + + /// 16 bit half-precision floating-point scalar. + /// @see gtc_type_precision + typedef detail::float16 float16; + + /// 32 bit single-precision floating-point scalar. + /// @see gtc_type_precision + typedef detail::float32 float32; + + /// 64 bit double-precision floating-point scalar. + /// @see gtc_type_precision + typedef detail::float64 float64; + + + /// 16 bit half-precision floating-point scalar. + /// @see gtc_type_precision + typedef detail::float16 float16_t; + + /// 32 bit single-precision floating-point scalar. + /// @see gtc_type_precision + typedef detail::float32 float32_t; + + /// 64 bit double-precision floating-point scalar. + /// @see gtc_type_precision + typedef detail::float64 float64_t; + + + /// 16 bit half-precision floating-point scalar. + /// @see gtc_type_precision + typedef float16 f16; + + /// 32 bit single-precision floating-point scalar. + /// @see gtc_type_precision + typedef float32 f32; + + /// 64 bit double-precision floating-point scalar. + /// @see gtc_type_precision + typedef float64 f64; + + + /// Single-precision floating-point vector of 1 component. + /// @see gtc_type_precision + typedef detail::tvec1<float> fvec1; + + /// Single-precision floating-point vector of 2 components. + /// @see gtc_type_precision + typedef detail::tvec2<float> fvec2; + + /// Single-precision floating-point vector of 3 components. + /// @see gtc_type_precision + typedef detail::tvec3<float> fvec3; + + /// Single-precision floating-point vector of 4 components. + /// @see gtc_type_precision + typedef detail::tvec4<float> fvec4; + + + /// Half-precision floating-point vector of 1 component. + /// @see gtc_type_precision + typedef detail::tvec1<f16> f16vec1; + + /// Half-precision floating-point vector of 2 components. + /// @see gtc_type_precision + typedef detail::tvec2<f16> f16vec2; + + /// Half-precision floating-point vector of 3 components. + /// @see gtc_type_precision + typedef detail::tvec3<f16> f16vec3; + + /// Half-precision floating-point vector of 4 components. + /// @see gtc_type_precision + typedef detail::tvec4<f16> f16vec4; + + + /// Single-precision floating-point vector of 1 component. + /// @see gtc_type_precision + typedef detail::tvec1<f32> f32vec1; + + /// Single-precision floating-point vector of 2 components. + /// @see gtc_type_precision + typedef detail::tvec2<f32> f32vec2; + + /// Single-precision floating-point vector of 3 components. + /// @see gtc_type_precision + typedef detail::tvec3<f32> f32vec3; + + /// Single-precision floating-point vector of 4 components. + /// @see gtc_type_precision + typedef detail::tvec4<f32> f32vec4; + + + /// Double-precision floating-point vector of 1 component. + /// @see gtc_type_precision + typedef detail::tvec1<f64> f64vec1; + + /// Double-precision floating-point vector of 2 components. + /// @see gtc_type_precision + typedef detail::tvec2<f64> f64vec2; + + /// Double-precision floating-point vector of 3 components. + /// @see gtc_type_precision + typedef detail::tvec3<f64> f64vec3; + + /// Double-precision floating-point vector of 4 components. + /// @see gtc_type_precision + typedef detail::tvec4<f64> f64vec4; + + + ////////////////////// + // Float matrix types + + /// Single-precision floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef detail::tmat1x1<f32> fmat1; + + /// Single-precision floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef detail::tmat2x2<f32> fmat2; + + /// Single-precision floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef detail::tmat3x3<f32> fmat3; + + /// Single-precision floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef detail::tmat4x4<f32> fmat4; + + + /// Single-precision floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef f32 fmat1x1; + + /// Single-precision floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef detail::tmat2x2<f32> fmat2x2; + + /// Single-precision floating-point 2x3 matrix. + /// @see gtc_type_precision + typedef detail::tmat2x3<f32> fmat2x3; + + /// Single-precision floating-point 2x4 matrix. + /// @see gtc_type_precision + typedef detail::tmat2x4<f32> fmat2x4; + + /// Single-precision floating-point 3x2 matrix. + /// @see gtc_type_precision + typedef detail::tmat3x2<f32> fmat3x2; + + /// Single-precision floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef detail::tmat3x3<f32> fmat3x3; + + /// Single-precision floating-point 3x4 matrix. + /// @see gtc_type_precision + typedef detail::tmat3x4<f32> fmat3x4; + + /// Single-precision floating-point 4x2 matrix. + /// @see gtc_type_precision + typedef detail::tmat4x2<f32> fmat4x2; + + /// Single-precision floating-point 4x3 matrix. + /// @see gtc_type_precision + typedef detail::tmat4x3<f32> fmat4x3; + + /// Single-precision floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef detail::tmat4x4<f32> fmat4x4; + + + /// Half-precision floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef detail::tmat1x1<f16> f16mat1; + + /// Half-precision floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef detail::tmat2x2<f16> f16mat2; + + /// Half-precision floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef detail::tmat3x3<f16> f16mat3; + + /// Half-precision floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef detail::tmat4x4<f16> f16mat4; + + + /// Half-precision floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef f16 f16mat1x1; + + /// Half-precision floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef detail::tmat2x2<f16> f16mat2x2; + + /// Half-precision floating-point 2x3 matrix. + /// @see gtc_type_precision + typedef detail::tmat2x3<f16> f16mat2x3; + + /// Half-precision floating-point 2x4 matrix. + /// @see gtc_type_precision + typedef detail::tmat2x4<f16> f16mat2x4; + + /// Half-precision floating-point 3x2 matrix. + /// @see gtc_type_precision + typedef detail::tmat3x2<f16> f16mat3x2; + + /// Half-precision floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef detail::tmat3x3<f16> f16mat3x3; + + /// Half-precision floating-point 3x4 matrix. + /// @see gtc_type_precision + typedef detail::tmat3x4<f16> f16mat3x4; + + /// Half-precision floating-point 4x2 matrix. + /// @see gtc_type_precision + typedef detail::tmat4x2<f16> f16mat4x2; + + /// Half-precision floating-point 4x3 matrix. + /// @see gtc_type_precision + typedef detail::tmat4x3<f16> f16mat4x3; + + /// Half-precision floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef detail::tmat4x4<f16> f16mat4x4; + + + /// Single-precision floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef detail::tmat1x1<f32> f32mat1; + + /// Single-precision floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef detail::tmat2x2<f32> f32mat2; + + /// Single-precision floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef detail::tmat3x3<f32> f32mat3; + + /// Single-precision floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef detail::tmat4x4<f32> f32mat4; + + + /// Single-precision floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef f32 f32mat1x1; + + /// Single-precision floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef detail::tmat2x2<f32> f32mat2x2; + + /// Single-precision floating-point 2x3 matrix. + /// @see gtc_type_precision + typedef detail::tmat2x3<f32> f32mat2x3; + + /// Single-precision floating-point 2x4 matrix. + /// @see gtc_type_precision + typedef detail::tmat2x4<f32> f32mat2x4; + + /// Single-precision floating-point 3x2 matrix. + /// @see gtc_type_precision + typedef detail::tmat3x2<f32> f32mat3x2; + + /// Single-precision floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef detail::tmat3x3<f32> f32mat3x3; + + /// Single-precision floating-point 3x4 matrix. + /// @see gtc_type_precision + typedef detail::tmat3x4<f32> f32mat3x4; + + /// Single-precision floating-point 4x2 matrix. + /// @see gtc_type_precision + typedef detail::tmat4x2<f32> f32mat4x2; + + /// Single-precision floating-point 4x3 matrix. + /// @see gtc_type_precision + typedef detail::tmat4x3<f32> f32mat4x3; + + /// Single-precision floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef detail::tmat4x4<f32> f32mat4x4; + + + /// Double-precision floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef detail::tmat1x1<f64> f64mat1; + + /// Double-precision floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef detail::tmat2x2<f64> f64mat2; + + /// Double-precision floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef detail::tmat3x3<f64> f64mat3; + + /// Double-precision floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef detail::tmat4x4<f64> f64mat4; + + + /// Double-precision floating-point 1x1 matrix. + /// @see gtc_type_precision + //typedef f64 f64mat1x1; + + /// Double-precision floating-point 2x2 matrix. + /// @see gtc_type_precision + typedef detail::tmat2x2<f64> f64mat2x2; + + /// Double-precision floating-point 2x3 matrix. + /// @see gtc_type_precision + typedef detail::tmat2x3<f64> f64mat2x3; + + /// Double-precision floating-point 2x4 matrix. + /// @see gtc_type_precision + typedef detail::tmat2x4<f64> f64mat2x4; + + /// Double-precision floating-point 3x2 matrix. + /// @see gtc_type_precision + typedef detail::tmat3x2<f64> f64mat3x2; + + /// Double-precision floating-point 3x3 matrix. + /// @see gtc_type_precision + typedef detail::tmat3x3<f64> f64mat3x3; + + /// Double-precision floating-point 3x4 matrix. + /// @see gtc_type_precision + typedef detail::tmat3x4<f64> f64mat3x4; + + /// Double-precision floating-point 4x2 matrix. + /// @see gtc_type_precision + typedef detail::tmat4x2<f64> f64mat4x2; + + /// Double-precision floating-point 4x3 matrix. + /// @see gtc_type_precision + typedef detail::tmat4x3<f64> f64mat4x3; + + /// Double-precision floating-point 4x4 matrix. + /// @see gtc_type_precision + typedef detail::tmat4x4<f64> f64mat4x4; + + + ////////////////////////// + // Quaternion types + + /// Half-precision floating-point quaternion. + /// @see gtc_type_precision + typedef detail::tquat<f16> f16quat; + + /// Single-precision floating-point quaternion. + /// @see gtc_type_precision + typedef detail::tquat<f32> f32quat; + + /// Double-precision floating-point quaternion. + /// @see gtc_type_precision + typedef detail::tquat<f64> f64quat; + + /// @} +}//namespace glm + +#include "type_precision.inl" + +#endif//GLM_GTC_type_precision diff --git a/include/gal/opengl/glm/gtc/type_precision.inl b/include/gal/opengl/glm/gtc/type_precision.inl new file mode 100644 index 0000000..5bb4ab8 --- /dev/null +++ b/include/gal/opengl/glm/gtc/type_precision.inl @@ -0,0 +1,32 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtc_swizzle +/// @file glm/gtc/swizzle.inl +/// @date 2009-06-14 / 2011-06-15 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + +} diff --git a/include/gal/opengl/glm/gtc/type_ptr.hpp b/include/gal/opengl/glm/gtc/type_ptr.hpp new file mode 100644 index 0000000..4939573 --- /dev/null +++ b/include/gal/opengl/glm/gtc/type_ptr.hpp @@ -0,0 +1,169 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtc_type_ptr +/// @file glm/gtc/type_ptr.hpp +/// @date 2009-05-06 / 2011-06-05 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// @see gtc_half_float (dependence) +/// @see gtc_quaternion (dependence) +/// +/// @defgroup gtc_type_ptr GLM_GTC_type_ptr +/// @ingroup gtc +/// +/// @brief Handles the interaction between pointers and vector, matrix types. +/// +/// This extension defines an overloaded function, glm::value_ptr, which +/// takes any of the \ref core_template "core template types". It returns +/// a pointer to the memory layout of the object. Matrix types store their values +/// in column-major order. +/// +/// This is useful for uploading data to matrices or copying data to buffer objects. +/// +/// Example: +/// @code +/// #include <glm/glm.hpp> +/// #include <glm/gtc/type_ptr.hpp> +/// +/// glm::vec3 aVector(3); +/// glm::mat4 someMatrix(1.0); +/// +/// glUniform3fv(uniformLoc, 1, glm::value_ptr(aVector)); +/// glUniformMatrix4fv(uniformMatrixLoc, 1, GL_FALSE, glm::value_ptr(someMatrix)); +/// @endcode +/// +/// <glm/gtc/type_ptr.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTC_type_ptr +#define GLM_GTC_type_ptr GLM_VERSION + +// Dependency: +#include "../glm.hpp" +#include "../gtc/half_float.hpp" +#include "../gtc/quaternion.hpp" +#include <cstring> + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTC_type_ptr extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_type_ptr + /// @{ + + /// Return the constant address to the data of the input parameter. + /// @see gtc_type_ptr + template<typename genType> + typename genType::value_type const * value_ptr(genType const & vec); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template<typename T> + detail::tvec2<T> make_vec2(T const * const ptr); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template<typename T> + detail::tvec3<T> make_vec3(T const * const ptr); + + /// Build a vector from a pointer. + /// @see gtc_type_ptr + template<typename T> + detail::tvec4<T> make_vec4(T const * const ptr); + + /// Build a matrix from a pointer. + /// @see gtc_type_ptr + template<typename T> + detail::tmat2x2<T> make_mat2x2(T const * const ptr); + + /// Build a matrix from a pointer. + /// @see gtc_type_ptr + template<typename T> + detail::tmat2x3<T> make_mat2x3(T const * const ptr); + + /// Build a matrix from a pointer. + /// @see gtc_type_ptr + template<typename T> + detail::tmat2x4<T> make_mat2x4(T const * const ptr); + + /// Build a matrix from a pointer. + /// @see gtc_type_ptr + template<typename T> + detail::tmat3x2<T> make_mat3x2(T const * const ptr); + + /// Build a matrix from a pointer. + /// @see gtc_type_ptr + template<typename T> + detail::tmat3x3<T> make_mat3x3(T const * const ptr); + + /// Build a matrix from a pointer. + /// @see gtc_type_ptr + template<typename T> + detail::tmat3x4<T> make_mat3x4(T const * const ptr); + + /// Build a matrix from a pointer. + /// @see gtc_type_ptr + template<typename T> + detail::tmat4x2<T> make_mat4x2( + T const * const ptr); + + /// Build a matrix from a pointer. + /// @see gtc_type_ptr + template<typename T> + detail::tmat4x3<T> make_mat4x3(T const * const ptr); + + /// Build a matrix from a pointer. + /// @see gtc_type_ptr + template<typename T> + detail::tmat4x4<T> make_mat4x4(T const * const ptr); + + /// Build a matrix from a pointer. + /// @see gtc_type_ptr + template<typename T> + detail::tmat2x2<T> make_mat2(T const * const ptr); + + /// Build a matrix from a pointer. + /// @see gtc_type_ptr + template<typename T> + detail::tmat3x3<T> make_mat3(T const * const ptr); + + /// Build a matrix from a pointer. + /// @see gtc_type_ptr + template<typename T> + detail::tmat4x4<T> make_mat4(T const * const ptr); + + /// Build a quaternion from a pointer. + /// @see gtc_type_ptr + template<typename T> + detail::tquat<T> make_quat(T const * const ptr); + + /// @} +}//namespace glm + +#include "type_ptr.inl" + +#endif//GLM_GTC_type_ptr + diff --git a/include/gal/opengl/glm/gtc/type_ptr.inl b/include/gal/opengl/glm/gtc/type_ptr.inl new file mode 100644 index 0000000..6c5a157 --- /dev/null +++ b/include/gal/opengl/glm/gtc/type_ptr.inl @@ -0,0 +1,473 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtc_type_ptr +/// @file glm/gtc/type_ptr.inl +/// @date 2011-06-15 / 2011-12-07 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + /// @addtogroup gtc_type_ptr + /// @{ + + /// Return the constant address to the data of the input parameter. + /// @see gtc_type_ptr + template<typename T> + GLM_FUNC_QUALIFIER T const * value_ptr + ( + detail::tvec2<T> const & vec + ) + { + return &(vec.x); + } + + //! Return the constant address to the data of the input parameter. + /// @see gtc_type_ptr + template<typename T> + GLM_FUNC_QUALIFIER T * value_ptr + ( + detail::tvec2<T> & vec + ) + { + return &(vec.x); + } + + //! Return the constant address to the data of the input parameter. + /// @see gtc_type_ptr + template<typename T> + GLM_FUNC_QUALIFIER T const * value_ptr + ( + detail::tvec3<T> const & vec + ) + { + return &(vec.x); + } + + //! Return the constant address to the data of the input parameter. + /// @see gtc_type_ptr + template<typename T> + GLM_FUNC_QUALIFIER T * value_ptr + ( + detail::tvec3<T> & vec + ) + { + return &(vec.x); + } + + //! Return the constant address to the data of the input parameter. + /// @see gtc_type_ptr + template<typename T> + GLM_FUNC_QUALIFIER T const * value_ptr + ( + detail::tvec4<T> const & vec + ) + { + return &(vec.x); + } + + //! Return the constant address to the data of the input parameter. + //! From GLM_GTC_type_ptr extension. + template<typename T> + GLM_FUNC_QUALIFIER T * value_ptr + ( + detail::tvec4<T> & vec + ) + { + return &(vec.x); + } + + //! Return the constant address to the data of the input parameter. + /// @see gtc_type_ptr + template<typename T> + GLM_FUNC_QUALIFIER T const * value_ptr + ( + detail::tmat2x2<T> const & mat + ) + { + return &(mat[0].x); + } + + //! Return the constant address to the data of the input parameter. + /// @see gtc_type_ptr + template<typename T> + GLM_FUNC_QUALIFIER T * value_ptr + ( + detail::tmat2x2<T> & mat + ) + { + return &(mat[0].x); + } + + //! Return the constant address to the data of the input parameter. + /// @see gtc_type_ptr + template<typename T> + GLM_FUNC_QUALIFIER T const * value_ptr + ( + detail::tmat3x3<T> const & mat + ) + { + return &(mat[0].x); + } + + //! Return the constant address to the data of the input parameter. + /// @see gtc_type_ptr + template<typename T> + GLM_FUNC_QUALIFIER T * value_ptr + ( + detail::tmat3x3<T> & mat + ) + { + return &(mat[0].x); + } + + //! Return the constant address to the data of the input parameter. + /// @see gtc_type_ptr + template<typename T> + GLM_FUNC_QUALIFIER T const * value_ptr + ( + detail::tmat4x4<T> const & mat + ) + { + return &(mat[0].x); + } + + //! Return the constant address to the data of the input parameter. + //! From GLM_GTC_type_ptr extension. + template<typename T> + GLM_FUNC_QUALIFIER T * value_ptr + ( + detail::tmat4x4<T> & mat + ) + { + return &(mat[0].x); + } + + //! Return the constant address to the data of the input parameter. + /// @see gtc_type_ptr + template<typename T> + GLM_FUNC_QUALIFIER T const * value_ptr + ( + detail::tmat2x3<T> const & mat + ) + { + return &(mat[0].x); + } + + //! Return the constant address to the data of the input parameter. + /// @see gtc_type_ptr + template<typename T> + GLM_FUNC_QUALIFIER T * value_ptr + ( + detail::tmat2x3<T> & mat + ) + { + return &(mat[0].x); + } + + //! Return the constant address to the data of the input parameter. + /// @see gtc_type_ptr + template<typename T> + GLM_FUNC_QUALIFIER T const * value_ptr + ( + detail::tmat3x2<T> const & mat + ) + { + return &(mat[0].x); + } + + //! Return the constant address to the data of the input parameter. + /// @see gtc_type_ptr + template<typename T> + GLM_FUNC_QUALIFIER T * value_ptr + ( + detail::tmat3x2<T> & mat + ) + { + return &(mat[0].x); + } + + //! Return the constant address to the data of the input parameter. + /// @see gtc_type_ptr + template<typename T> + GLM_FUNC_QUALIFIER T const * value_ptr + ( + detail::tmat2x4<T> const & mat + ) + { + return &(mat[0].x); + } + + //! Return the constant address to the data of the input parameter. + /// @see gtc_type_ptr + template<typename T> + GLM_FUNC_QUALIFIER T * value_ptr + ( + detail::tmat2x4<T> & mat + ) + { + return &(mat[0].x); + } + + //! Return the constant address to the data of the input parameter. + /// @see gtc_type_ptr + template<typename T> + GLM_FUNC_QUALIFIER T const * value_ptr + ( + detail::tmat4x2<T> const & mat + ) + { + return &(mat[0].x); + } + + //! Return the constant address to the data of the input parameter. + /// @see gtc_type_ptr + template<typename T> + GLM_FUNC_QUALIFIER T * value_ptr + ( + detail::tmat4x2<T> & mat + ) + { + return &(mat[0].x); + } + + //! Return the constant address to the data of the input parameter. + /// @see gtc_type_ptr + template<typename T> + GLM_FUNC_QUALIFIER T const * value_ptr + ( + detail::tmat3x4<T> const & mat + ) + { + return &(mat[0].x); + } + + //! Return the constant address to the data of the input parameter. + /// @see gtc_type_ptr + template<typename T> + GLM_FUNC_QUALIFIER T * value_ptr + ( + detail::tmat3x4<T> & mat + ) + { + return &(mat[0].x); + } + + //! Return the constant address to the data of the input parameter. + /// @see gtc_type_ptr + template<typename T> + GLM_FUNC_QUALIFIER T const * value_ptr + ( + detail::tmat4x3<T> const & mat + ) + { + return &(mat[0].x); + } + + //! Get the address of the matrix content. + /// @see gtc_type_ptr + template<typename T> + GLM_FUNC_QUALIFIER T * value_ptr(detail::tmat4x3<T> & mat) + { + return &(mat[0].x); + } + + //! Return the constant address to the data of the input parameter. + /// @see gtc_type_ptr + template<typename T> + GLM_FUNC_QUALIFIER T const * value_ptr + ( + detail::tquat<T> const & q + ) + { + return &(q[0]); + } + + //! Return the constant address to the data of the input parameter. + /// @see gtc_type_ptr + template<typename T> + GLM_FUNC_QUALIFIER T * value_ptr + ( + detail::tquat<T> & q + ) + { + return &(q[0]); + } + + //! Build a vector from a pointer. + /// @see gtc_type_ptr + template<typename T> + GLM_FUNC_QUALIFIER detail::tvec2<T> make_vec2(T const * const ptr) + { + detail::tvec2<T> Result; + memcpy(value_ptr(Result), ptr, sizeof(detail::tvec2<T>)); + return Result; + } + + //! Build a vector from a pointer. + /// @see gtc_type_ptr + template<typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> make_vec3(T const * const ptr) + { + detail::tvec3<T> Result; + memcpy(value_ptr(Result), ptr, sizeof(detail::tvec3<T>)); + return Result; + } + + //! Build a vector from a pointer. + /// @see gtc_type_ptr + template<typename T> + GLM_FUNC_QUALIFIER detail::tvec4<T> make_vec4(T const * const ptr) + { + detail::tvec4<T> Result; + memcpy(value_ptr(Result), ptr, sizeof(detail::tvec4<T>)); + return Result; + } + + //! Build a matrix from a pointer. + /// @see gtc_type_ptr + template<typename T> + GLM_FUNC_QUALIFIER detail::tmat2x2<T> make_mat2x2(T const * const ptr) + { + detail::tmat2x2<T> Result; + memcpy(value_ptr(Result), ptr, sizeof(detail::tmat2x2<T>)); + return Result; + } + + //! Build a matrix from a pointer. + /// @see gtc_type_ptr + template<typename T> + GLM_FUNC_QUALIFIER detail::tmat2x3<T> make_mat2x3(T const * const ptr) + { + detail::tmat2x3<T> Result; + memcpy(value_ptr(Result), ptr, sizeof(detail::tmat2x3<T>)); + return Result; + } + + //! Build a matrix from a pointer. + /// @see gtc_type_ptr + template<typename T> + GLM_FUNC_QUALIFIER detail::tmat2x4<T> make_mat2x4(T const * const ptr) + { + detail::tmat2x4<T> Result; + memcpy(value_ptr(Result), ptr, sizeof(detail::tmat2x4<T>)); + return Result; + } + + //! Build a matrix from a pointer. + /// @see gtc_type_ptr + template<typename T> + GLM_FUNC_QUALIFIER detail::tmat3x2<T> make_mat3x2(T const * const ptr) + { + detail::tmat3x2<T> Result; + memcpy(value_ptr(Result), ptr, sizeof(detail::tmat3x2<T>)); + return Result; + } + + //! Build a matrix from a pointer. + /// @see gtc_type_ptr + template<typename T> + GLM_FUNC_QUALIFIER detail::tmat3x3<T> make_mat3x3(T const * const ptr) + { + detail::tmat3x3<T> Result; + memcpy(value_ptr(Result), ptr, sizeof(detail::tmat3x3<T>)); + return Result; + } + + //! Build a matrix from a pointer. + /// @see gtc_type_ptr + template<typename T> + GLM_FUNC_QUALIFIER detail::tmat3x4<T> make_mat3x4(T const * const ptr) + { + detail::tmat3x4<T> Result; + memcpy(value_ptr(Result), ptr, sizeof(detail::tmat3x4<T>)); + return Result; + } + + //! Build a matrix from a pointer. + /// @see gtc_type_ptr + template<typename T> + GLM_FUNC_QUALIFIER detail::tmat4x2<T> make_mat4x2(T const * const ptr) + { + detail::tmat4x2<T> Result; + memcpy(value_ptr(Result), ptr, sizeof(detail::tmat4x2<T>)); + return Result; + } + + //! Build a matrix from a pointer. + /// @see gtc_type_ptr + template<typename T> + GLM_FUNC_QUALIFIER detail::tmat4x3<T> make_mat4x3(T const * const ptr) + { + detail::tmat4x3<T> Result; + memcpy(value_ptr(Result), ptr, sizeof(detail::tmat4x3<T>)); + return Result; + } + + //! Build a matrix from a pointer. + /// @see gtc_type_ptr + template<typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> make_mat4x4(T const * const ptr) + { + detail::tmat4x4<T> Result; + memcpy(value_ptr(Result), ptr, sizeof(detail::tmat4x4<T>)); + return Result; + } + + //! Build a matrix from a pointer. + /// @see gtc_type_ptr + template<typename T> + GLM_FUNC_QUALIFIER detail::tmat2x2<T> make_mat2(T const * const ptr) + { + return make_mat2x2(ptr); + } + + //! Build a matrix from a pointer. + /// @see gtc_type_ptr + template<typename T> + GLM_FUNC_QUALIFIER detail::tmat3x3<T> make_mat3(T const * const ptr) + { + return make_mat3x3(ptr); + } + + //! Build a matrix from a pointer. + /// @see gtc_type_ptr + template<typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> make_mat4(T const * const ptr) + { + return make_mat4x4(ptr); + } + + //! Build a quaternion from a pointer. + /// @see gtc_type_ptr + template<typename T> + GLM_FUNC_QUALIFIER detail::tquat<T> make_quat(T const * const ptr) + { + detail::tquat<T> Result; + memcpy(value_ptr(Result), ptr, sizeof(detail::tquat<T>)); + return Result; + } + + /// @} +}//namespace glm + diff --git a/include/gal/opengl/glm/gtc/ulp.hpp b/include/gal/opengl/glm/gtc/ulp.hpp new file mode 100644 index 0000000..7ab0d6a --- /dev/null +++ b/include/gal/opengl/glm/gtc/ulp.hpp @@ -0,0 +1,90 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtc_ulp +/// @file glm/gtc/ulp.hpp +/// @date 2011-02-21 / 2011-12-12 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// +/// @defgroup gtc_ulp GLM_GTC_ulp +/// @ingroup gtc +/// +/// @brief Allow the measurement of the accuracy of a function against a reference +/// implementation. This extension works on floating-point data and provide results +/// in ULP. +/// <glm/gtc/ulp.hpp> need to be included to use these features. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTC_ulp +#define GLM_GTC_ulp GLM_VERSION + +// Dependency: +#include "../glm.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTC_ulp extension included") +#endif + +namespace glm +{ + /// @addtogroup gtc_ulp + /// @{ + + /// Return the next ULP value(s) after the input value(s). + /// @see gtc_ulp + template <typename genType> + genType next_float(genType const & x); + + /// Return the previous ULP value(s) before the input value(s). + /// @see gtc_ulp + template <typename genType> + genType prev_float(genType const & x); + + /// Return the value(s) ULP distance after the input value(s). + /// @see gtc_ulp + template <typename genType> + genType next_float(genType const & x, uint const & Distance); + + /// Return the value(s) ULP distance before the input value(s). + /// @see gtc_ulp + template <typename genType> + genType prev_float(genType const & x, uint const & Distance); + + /// Return the distance in the number of ULP between 2 scalars. + /// @see gtc_ulp + template <typename T> + uint float_distance(T const & x, T const & y); + + /// Return the distance in the number of ULP between 2 vectors. + /// @see gtc_ulp + template<typename T, template<typename> class vecType> + vecType<uint> float_distance(vecType<T> const & x, vecType<T> const & y); + + /// @} +}// namespace glm + +#include "ulp.inl" + +#endif//GLM_GTC_ulp + diff --git a/include/gal/opengl/glm/gtc/ulp.inl b/include/gal/opengl/glm/gtc/ulp.inl new file mode 100644 index 0000000..997a816 --- /dev/null +++ b/include/gal/opengl/glm/gtc/ulp.inl @@ -0,0 +1,318 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtc_ulp +/// @file glm/gtc/ulp.inl +/// @date 2011-03-07 / 2012-04-07 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// +/// Copyright (C) 1993 by Sun Microsystems, Inc. All rights reserved. +/// +/// Developed at SunPro, a Sun Microsystems, Inc. business. +/// Permission to use, copy, modify, and distribute this +/// software is freely granted, provided that this notice +/// is preserved. +/////////////////////////////////////////////////////////////////////////////////// + +#include <cmath> +#include <cfloat> + +#if(GLM_COMPILER & GLM_COMPILER_VC) +# pragma warning(push) +# pragma warning(disable : 4127) +#endif + +typedef union +{ + float value; + /* FIXME: Assumes 32 bit int. */ + unsigned int word; +} ieee_float_shape_type; + +typedef union +{ + double value; + struct + { + glm::detail::int32 lsw; + glm::detail::int32 msw; + } parts; +} ieee_double_shape_type; + +#define GLM_EXTRACT_WORDS(ix0,ix1,d) \ + do { \ + ieee_double_shape_type ew_u; \ + ew_u.value = (d); \ + (ix0) = ew_u.parts.msw; \ + (ix1) = ew_u.parts.lsw; \ + } while (0) + +#define GLM_GET_FLOAT_WORD(i,d) \ + do { \ + ieee_float_shape_type gf_u; \ + gf_u.value = (d); \ + (i) = gf_u.word; \ + } while (0) + +#define GLM_SET_FLOAT_WORD(d,i) \ + do { \ + ieee_float_shape_type sf_u; \ + sf_u.word = (i); \ + (d) = sf_u.value; \ + } while (0) + +#define GLM_INSERT_WORDS(d,ix0,ix1) \ + do { \ + ieee_double_shape_type iw_u; \ + iw_u.parts.msw = (ix0); \ + iw_u.parts.lsw = (ix1); \ + (d) = iw_u.value; \ + } while (0) + +namespace glm{ +namespace detail +{ + GLM_FUNC_QUALIFIER float nextafterf(float x, float y) + { + volatile float t; + glm::detail::int32 hx, hy, ix, iy; + + GLM_GET_FLOAT_WORD(hx, x); + GLM_GET_FLOAT_WORD(hy, y); + ix = hx&0x7fffffff; // |x| + iy = hy&0x7fffffff; // |y| + + if((ix>0x7f800000) || // x is nan + (iy>0x7f800000)) // y is nan + return x+y; + if(x==y) return y; // x=y, return y + if(ix==0) { // x == 0 + GLM_SET_FLOAT_WORD(x,(hy&0x80000000)|1);// return +-minsubnormal + t = x*x; + if(t==x) return t; else return x; // raise underflow flag + } + if(hx>=0) { // x > 0 + if(hx>hy) { // x > y, x -= ulp + hx -= 1; + } else { // x < y, x += ulp + hx += 1; + } + } else { // x < 0 + if(hy>=0||hx>hy){ // x < y, x -= ulp + hx -= 1; + } else { // x > y, x += ulp + hx += 1; + } + } + hy = hx&0x7f800000; + if(hy>=0x7f800000) return x+x; // overflow + if(hy<0x00800000) { // underflow + t = x*x; + if(t!=x) { // raise underflow flag + GLM_SET_FLOAT_WORD(y,hx); + return y; + } + } + GLM_SET_FLOAT_WORD(x,hx); + return x; + } + + GLM_FUNC_QUALIFIER double nextafter(double x, double y) + { + volatile double t; + glm::detail::int32 hx, hy, ix, iy; + glm::detail::uint32 lx, ly; + + GLM_EXTRACT_WORDS(hx, lx, x); + GLM_EXTRACT_WORDS(hy, ly, y); + ix = hx & 0x7fffffff; // |x| + iy = hy & 0x7fffffff; // |y| + + if(((ix>=0x7ff00000)&&((ix-0x7ff00000)|lx)!=0) || // x is nan + ((iy>=0x7ff00000)&&((iy-0x7ff00000)|ly)!=0)) // y is nan + return x+y; + if(x==y) return y; // x=y, return y + if((ix|lx)==0) { // x == 0 + GLM_INSERT_WORDS(x, hy & 0x80000000, 1); // return +-minsubnormal + t = x*x; + if(t==x) return t; else return x; // raise underflow flag + } + if(hx>=0) { // x > 0 + if(hx>hy||((hx==hy)&&(lx>ly))) { // x > y, x -= ulp + if(lx==0) hx -= 1; + lx -= 1; + } else { // x < y, x += ulp + lx += 1; + if(lx==0) hx += 1; + } + } else { // x < 0 + if(hy>=0||hx>hy||((hx==hy)&&(lx>ly))){// x < y, x -= ulp + if(lx==0) hx -= 1; + lx -= 1; + } else { // x > y, x += ulp + lx += 1; + if(lx==0) hx += 1; + } + } + hy = hx&0x7ff00000; + if(hy>=0x7ff00000) return x+x; // overflow + if(hy<0x00100000) { // underflow + t = x*x; + if(t!=x) { // raise underflow flag + GLM_INSERT_WORDS(y,hx,lx); + return y; + } + } + GLM_INSERT_WORDS(x,hx,lx); + return x; + } +}//namespace detail +}//namespace glm + +#if(GLM_COMPILER & GLM_COMPILER_VC) +# pragma warning(pop) +#endif + +#if((GLM_COMPILER & GLM_COMPILER_VC) || ((GLM_COMPILER & GLM_COMPILER_INTEL) && (GLM_PLATFORM & GLM_PLATFORM_WINDOWS))) +# define GLM_NEXT_AFTER_FLT(x, toward) glm::detail::nextafterf((x), (toward)) +# define GLM_NEXT_AFTER_DBL(x, toward) _nextafter((x), (toward)) +#else +# define GLM_NEXT_AFTER_FLT(x, toward) nextafterf((x), (toward)) +# define GLM_NEXT_AFTER_DBL(x, toward) nextafter((x), (toward)) +#endif + +namespace glm +{ + GLM_FUNC_QUALIFIER float next_float(float const & x) + { + return GLM_NEXT_AFTER_FLT(x, std::numeric_limits<float>::max()); + } + + GLM_FUNC_QUALIFIER double next_float(double const & x) + { + return GLM_NEXT_AFTER_DBL(x, std::numeric_limits<double>::max()); + } + + template<typename T, template<typename> class vecType> + GLM_FUNC_QUALIFIER vecType<T> next_float(vecType<T> const & x) + { + vecType<T> Result; + for(std::size_t i = 0; i < Result.length(); ++i) + Result[i] = next_float(x[i]); + return Result; + } + + GLM_FUNC_QUALIFIER float prev_float(float const & x) + { + return GLM_NEXT_AFTER_FLT(x, std::numeric_limits<float>::min()); + } + + GLM_FUNC_QUALIFIER double prev_float(double const & x) + { + return GLM_NEXT_AFTER_DBL(x, std::numeric_limits<double>::min()); + } + + template<typename T, template<typename> class vecType> + GLM_FUNC_QUALIFIER vecType<T> prev_float(vecType<T> const & x) + { + vecType<T> Result; + for(std::size_t i = 0; i < Result.length(); ++i) + Result[i] = prev_float(x[i]); + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER T next_float(T const & x, uint const & ulps) + { + T temp = x; + for(std::size_t i = 0; i < ulps; ++i) + temp = next_float(temp); + return temp; + } + + template<typename T, template<typename> class vecType> + GLM_FUNC_QUALIFIER vecType<T> next_float(vecType<T> const & x, vecType<uint> const & ulps) + { + vecType<T> Result; + for(std::size_t i = 0; i < Result.length(); ++i) + Result[i] = next_float(x[i], ulps[i]); + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER T prev_float(T const & x, uint const & ulps) + { + T temp = x; + for(std::size_t i = 0; i < ulps; ++i) + temp = prev_float(temp); + return temp; + } + + template<typename T, template<typename> class vecType> + GLM_FUNC_QUALIFIER vecType<T> prev_float(vecType<T> const & x, vecType<uint> const & ulps) + { + vecType<T> Result; + for(std::size_t i = 0; i < Result.length(); ++i) + Result[i] = prev_float(x[i], ulps[i]); + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER uint float_distance(T const & x, T const & y) + { + uint ulp = 0; + + if(x < y) + { + T temp = x; + while(temp != y && ulp < std::numeric_limits<std::size_t>::max()) + { + ++ulp; + temp = next_float(temp); + } + } + else if(y < x) + { + T temp = y; + while(temp != x && ulp < std::numeric_limits<std::size_t>::max()) + { + ++ulp; + temp = next_float(temp); + } + } + else // == + { + + } + + return ulp; + } + + template<typename T, template<typename> class vecType> + GLM_FUNC_QUALIFIER vecType<uint> float_distance(vecType<T> const & x, vecType<T> const & y) + { + vecType<uint> Result; + for(std::size_t i = 0; i < Result.length(); ++i) + Result[i] = float_distance(x[i], y[i]); + return Result; + } +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/associated_min_max.hpp b/include/gal/opengl/glm/gtx/associated_min_max.hpp new file mode 100644 index 0000000..7283b69 --- /dev/null +++ b/include/gal/opengl/glm/gtx/associated_min_max.hpp @@ -0,0 +1,106 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_associated_min_max +/// @file glm/gtx/associated_min_max.hpp +/// @date 2008-03-10 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// @see gtx_extented_min_max (dependence) +/// +/// @defgroup gtx_associated_min_max GLM_GTX_associated_min_max +/// @ingroup gtx +/// +/// @brief Min and max functions that return associated values not the compared onces. +/// <glm/gtx/associated_min_max.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_associated_min_max +#define GLM_GTX_associated_min_max GLM_VERSION + +// Dependency: +#include "../glm.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_associated_min_max extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_associated_min_max + /// @{ + + /// Min comparison between 2 variables + /// @see gtx_associated_min_max + template<typename genTypeT, typename genTypeU> + genTypeU associatedMin( + const genTypeT& x, const genTypeU& a, + const genTypeT& y, const genTypeU& b); + + /// Min comparison between 3 variables + /// @see gtx_associated_min_max + template<typename genTypeT, typename genTypeU> + genTypeU associatedMin( + const genTypeT& x, const genTypeU& a, + const genTypeT& y, const genTypeU& b, + const genTypeT& z, const genTypeU& c); + + /// Min comparison between 4 variables + /// @see gtx_associated_min_max + template<typename genTypeT, typename genTypeU> + genTypeU associatedMin( + const genTypeT& x, const genTypeU& a, + const genTypeT& y, const genTypeU& b, + const genTypeT& z, const genTypeU& c, + const genTypeT& w, const genTypeU& d); + + /// Max comparison between 2 variables + /// @see gtx_associated_min_max + template<typename genTypeT, typename genTypeU> + genTypeU associatedMax( + const genTypeT& x, const genTypeU& a, + const genTypeT& y, const genTypeU& b); + + /// Max comparison between 3 variables + /// @see gtx_associated_min_max + template<typename genTypeT, typename genTypeU> + genTypeU associatedMax( + const genTypeT& x, const genTypeU& a, + const genTypeT& y, const genTypeU& b, + const genTypeT& z, const genTypeU& c); + + /// Max comparison between 4 variables + /// @see gtx_associated_min_max + template<typename genTypeT, typename genTypeU> + genTypeU associatedMax( + const genTypeT& x, const genTypeU& a, + const genTypeT& y, const genTypeU& b, + const genTypeT& z, const genTypeU& c, + const genTypeT& w, const genTypeU& d); + + /// @} +} //namespace glm + +#include "associated_min_max.inl" + +#endif//GLM_GTX_associated_min_max diff --git a/include/gal/opengl/glm/gtx/associated_min_max.inl b/include/gal/opengl/glm/gtx/associated_min_max.inl new file mode 100644 index 0000000..ffaa1ef --- /dev/null +++ b/include/gal/opengl/glm/gtx/associated_min_max.inl @@ -0,0 +1,912 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2008-03-10 +// Updated : 2008-03-15 +// Licence : This source is under MIT License +// File : gtx_associated_min_max.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm{ + +// Min comparison between 2 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER U associatedMin(T x, U a, T y, U b) +{ + return x < y ? a : b; +} + +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec2<U> associatedMin +( + const detail::tvec2<T>& x, const detail::tvec2<U>& a, + const detail::tvec2<T>& y, const detail::tvec2<U>& b +) +{ + detail::tvec2<U> Result; + //Result.x = x[0] < y[0] ? a[0] : b[0]; + //Result.y = x[1] < y[1] ? a[1] : b[1]; + for(typename detail::tvec2<U>::size_type i = 0; i < detail::tvec2<U>::value_size; ++i) + Result[i] = x[i] < y[i] ? a[i] : b[i]; + return Result; +} + +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec3<U> associatedMin +( + const detail::tvec3<T>& x, const detail::tvec3<U>& a, + const detail::tvec3<T>& y, const detail::tvec3<U>& b +) +{ + detail::tvec3<U> Result; + for(typename detail::tvec3<U>::size_type i = 0; i < detail::tvec3<U>::value_size; ++i) + Result[i] = x[i] < y[i] ? a[i] : b[i]; + return Result; +} + +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec4<U> associatedMin +( + const detail::tvec4<T>& x, const detail::tvec4<U>& a, + const detail::tvec4<T>& y, const detail::tvec4<U>& b +) +{ + detail::tvec4<U> Result; + for(typename detail::tvec4<U>::size_type i = 0; i < detail::tvec4<U>::value_size; ++i) + Result[i] = x[i] < y[i] ? a[i] : b[i]; + return Result; +} + +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec2<U> associatedMin +( + T x, const detail::tvec2<U>& a, + T y, const detail::tvec2<U>& b +) +{ + detail::tvec2<U> Result; + for(typename detail::tvec2<U>::size_type i = 0; i < detail::tvec2<U>::value_size; ++i) + Result[i] = x < y ? a[i] : b[i]; + return Result; +} + +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec3<U> associatedMin +( + T x, const detail::tvec3<U>& a, + T y, const detail::tvec3<U>& b +) +{ + detail::tvec3<U> Result; + for(typename detail::tvec3<U>::size_type i = 0; i < detail::tvec3<U>::value_size; ++i) + Result[i] = x < y ? a[i] : b[i]; + return Result; +} + +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec4<U> associatedMin +( + T x, const detail::tvec4<U>& a, + T y, const detail::tvec4<U>& b +) +{ + detail::tvec4<U> Result; + for(typename detail::tvec4<U>::size_type i = 0; i < detail::tvec4<U>::value_size; ++i) + Result[i] = x < y ? a[i] : b[i]; + return Result; +} + +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec2<U> associatedMin +( + const detail::tvec2<T>& x, U a, + const detail::tvec2<T>& y, U b +) +{ + detail::tvec2<U> Result; + for(typename detail::tvec2<U>::size_type i = 0; i < detail::tvec2<T>::value_size(); ++i) + Result[i] = x[i] < y[i] ? a : b; + return Result; +} + +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec3<U> associatedMin +( + const detail::tvec3<T>& x, U a, + const detail::tvec3<T>& y, U b +) +{ + detail::tvec3<U> Result; + for(typename detail::tvec3<U>::size_type i = 0; i < detail::tvec3<T>::value_size(); ++i) + Result[i] = x[i] < y[i] ? a : b; + return Result; +} + +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec4<U> associatedMin +( + const detail::tvec4<T>& x, U a, + const detail::tvec4<T>& y, U b +) +{ + detail::tvec4<U> Result; + for(typename detail::tvec4<U>::size_type i = 0; i < detail::tvec4<T>::value_size(); ++i) + Result[i] = x[i] < y[i] ? a : b; + return Result; +} + +// Min comparison between 3 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER U associatedMin +( + T x, U a, + T y, U b, + T z, U c +) +{ + U Result = x < y ? (x < z ? a : c) : (y < z ? b : c); + return Result; +} + +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec2<U> associatedMin +( + const detail::tvec2<T>& x, const detail::tvec2<U>& a, + const detail::tvec2<T>& y, const detail::tvec2<U>& b, + const detail::tvec2<T>& z, const detail::tvec2<U>& c +) +{ + detail::tvec2<U> Result; + for(typename detail::tvec2<U>::size_type i = 0; i < detail::tvec2<U>::value_size; ++i) + Result[i] = x[i] < y[i] ? (x[i] < z[i] ? a[i] : c[i]) : (y[i] < z[i] ? b[i] : c[i]); + return Result; +} + +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec3<U> associatedMin +( + const detail::tvec3<T>& x, const detail::tvec3<U>& a, + const detail::tvec3<T>& y, const detail::tvec3<U>& b, + const detail::tvec3<T>& z, const detail::tvec3<U>& c +) +{ + detail::tvec3<U> Result; + for(typename detail::tvec3<U>::size_type i = 0; i < detail::tvec3<U>::value_size; ++i) + Result[i] = x[i] < y[i] ? (x[i] < z[i] ? a[i] : c[i]) : (y[i] < z[i] ? b[i] : c[i]); + return Result; +} + +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec4<U> associatedMin +( + const detail::tvec4<T>& x, const detail::tvec4<U>& a, + const detail::tvec4<T>& y, const detail::tvec4<U>& b, + const detail::tvec4<T>& z, const detail::tvec4<U>& c +) +{ + detail::tvec4<U> Result; + for(typename detail::tvec4<U>::size_type i = 0; i < detail::tvec4<U>::value_size; ++i) + Result[i] = x[i] < y[i] ? (x[i] < z[i] ? a[i] : c[i]) : (y[i] < z[i] ? b[i] : c[i]); + return Result; +} + +// Min comparison between 4 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER U associatedMin +( + T x, U a, + T y, U b, + T z, U c, + T w, U d +) +{ + T Test1 = min(x, y); + T Test2 = min(z, w);; + U Result1 = x < y ? a : b; + U Result2 = z < w ? c : d; + U Result = Test1 < Test2 ? Result1 : Result2; + return Result; +} + +// Min comparison between 4 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec2<U> associatedMin +( + const detail::tvec2<T>& x, const detail::tvec2<U>& a, + const detail::tvec2<T>& y, const detail::tvec2<U>& b, + const detail::tvec2<T>& z, const detail::tvec2<U>& c, + const detail::tvec2<T>& w, const detail::tvec2<U>& d +) +{ + detail::tvec2<U> Result; + for(typename detail::tvec2<U>::size_type i = 0; i < detail::tvec2<U>::value_size; ++i) + { + T Test1 = min(x[i], y[i]); + T Test2 = min(z[i], w[i]); + U Result1 = x[i] < y[i] ? a[i] : b[i]; + U Result2 = z[i] < w[i] ? c[i] : d[i]; + Result[i] = Test1 < Test2 ? Result1 : Result2; + } + return Result; +} + +// Min comparison between 4 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec3<U> associatedMin +( + const detail::tvec3<T>& x, const detail::tvec3<U>& a, + const detail::tvec3<T>& y, const detail::tvec3<U>& b, + const detail::tvec3<T>& z, const detail::tvec3<U>& c, + const detail::tvec3<T>& w, const detail::tvec3<U>& d +) +{ + detail::tvec3<U> Result; + for(typename detail::tvec3<U>::size_type i = 0; i < detail::tvec3<U>::value_size; ++i) + { + T Test1 = min(x[i], y[i]); + T Test2 = min(z[i], w[i]); + U Result1 = x[i] < y[i] ? a[i] : b[i]; + U Result2 = z[i] < w[i] ? c[i] : d[i]; + Result[i] = Test1 < Test2 ? Result1 : Result2; + } + return Result; +} + +// Min comparison between 4 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec4<U> associatedMin +( + const detail::tvec4<T>& x, const detail::tvec4<U>& a, + const detail::tvec4<T>& y, const detail::tvec4<U>& b, + const detail::tvec4<T>& z, const detail::tvec4<U>& c, + const detail::tvec4<T>& w, const detail::tvec4<U>& d +) +{ + detail::tvec4<U> Result; + for(typename detail::tvec4<U>::size_type i = 0; i < detail::tvec4<U>::value_size; ++i) + { + T Test1 = min(x[i], y[i]); + T Test2 = min(z[i], w[i]); + U Result1 = x[i] < y[i] ? a[i] : b[i]; + U Result2 = z[i] < w[i] ? c[i] : d[i]; + Result[i] = Test1 < Test2 ? Result1 : Result2; + } + return Result; +} + +// Min comparison between 4 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec2<U> associatedMin +( + T x, const detail::tvec2<U>& a, + T y, const detail::tvec2<U>& b, + T z, const detail::tvec2<U>& c, + T w, const detail::tvec2<U>& d +) +{ + T Test1 = min(x, y); + T Test2 = min(z, w); + + detail::tvec2<U> Result; + for(typename detail::tvec2<U>::size_type i = 0; i < detail::tvec2<U>::value_size; ++i) + { + U Result1 = x < y ? a[i] : b[i]; + U Result2 = z < w ? c[i] : d[i]; + Result[i] = Test1 < Test2 ? Result1 : Result2; + } + return Result; +} + +// Min comparison between 4 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec3<U> associatedMin +( + T x, const detail::tvec3<U>& a, + T y, const detail::tvec3<U>& b, + T z, const detail::tvec3<U>& c, + T w, const detail::tvec3<U>& d +) +{ + T Test1 = min(x, y); + T Test2 = min(z, w); + + detail::tvec3<U> Result; + for(typename detail::tvec3<U>::size_type i = 0; i < detail::tvec3<U>::value_size; ++i) + { + U Result1 = x < y ? a[i] : b[i]; + U Result2 = z < w ? c[i] : d[i]; + Result[i] = Test1 < Test2 ? Result1 : Result2; + } + return Result; +} + +// Min comparison between 4 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec4<U> associatedMin +( + T x, const detail::tvec4<U>& a, + T y, const detail::tvec4<U>& b, + T z, const detail::tvec4<U>& c, + T w, const detail::tvec4<U>& d +) +{ + T Test1 = min(x, y); + T Test2 = min(z, w); + + detail::tvec4<U> Result; + for(typename detail::tvec4<U>::size_type i = 0; i < detail::tvec4<U>::value_size; ++i) + { + U Result1 = x < y ? a[i] : b[i]; + U Result2 = z < w ? c[i] : d[i]; + Result[i] = Test1 < Test2 ? Result1 : Result2; + } + return Result; +} + +// Min comparison between 4 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec2<U> associatedMin +( + const detail::tvec2<T>& x, U a, + const detail::tvec2<T>& y, U b, + const detail::tvec2<T>& z, U c, + const detail::tvec2<T>& w, U d +) +{ + detail::tvec2<U> Result; + for(typename detail::tvec2<T>::size_type i = 0; i < detail::tvec2<T>::value_size(); ++i) + { + T Test1 = min(x[i], y[i]); + T Test2 = min(z[i], w[i]);; + U Result1 = x[i] < y[i] ? a : b; + U Result2 = z[i] < w[i] ? c : d; + Result[i] = Test1 < Test2 ? Result1 : Result2; + } + return Result; +} + +// Min comparison between 4 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec3<U> associatedMin +( + const detail::tvec3<T>& x, U a, + const detail::tvec3<T>& y, U b, + const detail::tvec3<T>& z, U c, + const detail::tvec3<T>& w, U d +) +{ + detail::tvec3<U> Result; + for(typename detail::tvec3<T>::size_type i = 0; i < detail::tvec3<T>::value_size(); ++i) + { + T Test1 = min(x[i], y[i]); + T Test2 = min(z[i], w[i]);; + U Result1 = x[i] < y[i] ? a : b; + U Result2 = z[i] < w[i] ? c : d; + Result[i] = Test1 < Test2 ? Result1 : Result2; + } + return Result; +} + +// Min comparison between 4 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec4<U> associatedMin +( + const detail::tvec4<T>& x, U a, + const detail::tvec4<T>& y, U b, + const detail::tvec4<T>& z, U c, + const detail::tvec4<T>& w, U d +) +{ + detail::tvec4<U> Result; + for(typename detail::tvec4<T>::size_type i = 0; i < detail::tvec4<T>::value_size(); ++i) + { + T Test1 = min(x[i], y[i]); + T Test2 = min(z[i], w[i]);; + U Result1 = x[i] < y[i] ? a : b; + U Result2 = z[i] < w[i] ? c : d; + Result[i] = Test1 < Test2 ? Result1 : Result2; + } + return Result; +} + +// Max comparison between 2 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER U associatedMax(T x, U a, T y, U b) +{ + return x > y ? a : b; +} + +// Max comparison between 2 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec2<U> associatedMax +( + const detail::tvec2<T>& x, const detail::tvec2<U>& a, + const detail::tvec2<T>& y, const detail::tvec2<U>& b +) +{ + detail::tvec2<U> Result; + for(typename detail::tvec2<U>::size_type i = 0; i < detail::tvec2<U>::value_size; ++i) + Result[i] = x[i] > y[i] ? a[i] : b[i]; + return Result; +} + +// Max comparison between 2 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec3<U> associatedMax +( + const detail::tvec3<T>& x, const detail::tvec3<U>& a, + const detail::tvec3<T>& y, const detail::tvec3<U>& b +) +{ + detail::tvec3<U> Result; + for(typename detail::tvec3<U>::size_type i = 0; i < detail::tvec3<U>::value_size; ++i) + Result[i] = x[i] > y[i] ? a[i] : b[i]; + return Result; +} + +// Max comparison between 2 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec4<U> associatedMax +( + const detail::tvec4<T>& x, const detail::tvec4<U>& a, + const detail::tvec4<T>& y, const detail::tvec4<U>& b +) +{ + detail::tvec4<U> Result; + for(typename detail::tvec4<U>::size_type i = 0; i < detail::tvec4<U>::value_size; ++i) + Result[i] = x[i] > y[i] ? a[i] : b[i]; + return Result; +} + +// Max comparison between 2 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec2<U> associatedMax +( + T x, const detail::tvec2<U>& a, + T y, const detail::tvec2<U>& b +) +{ + detail::tvec2<U> Result; + for(typename detail::tvec2<U>::size_type i = 0; i < detail::tvec2<U>::value_size; ++i) + Result[i] = x > y ? a[i] : b[i]; + return Result; +} + +// Max comparison between 2 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec3<U> associatedMax +( + T x, const detail::tvec3<U>& a, + T y, const detail::tvec3<U>& b +) +{ + detail::tvec3<U> Result; + for(typename detail::tvec3<U>::size_type i = 0; i < detail::tvec3<U>::value_size; ++i) + Result[i] = x > y ? a[i] : b[i]; + return Result; +} + +// Max comparison between 2 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec4<U> associatedMax +( + T x, const detail::tvec4<U>& a, + T y, const detail::tvec4<U>& b +) +{ + detail::tvec4<U> Result; + for(typename detail::tvec4<U>::size_type i = 0; i < detail::tvec4<U>::value_size; ++i) + Result[i] = x > y ? a[i] : b[i]; + return Result; +} + +// Max comparison between 2 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec2<U> associatedMax +( + const detail::tvec2<T>& x, U a, + const detail::tvec2<T>& y, U b +) +{ + detail::tvec2<U> Result; + for(typename detail::tvec2<T>::size_type i = 0; i < detail::tvec2<T>::value_size(); ++i) + Result[i] = x[i] > y[i] ? a : b; + return Result; +} + +// Max comparison between 2 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec3<U> associatedMax +( + const detail::tvec3<T>& x, U a, + const detail::tvec3<T>& y, U b +) +{ + detail::tvec3<U> Result; + for(typename detail::tvec3<T>::size_type i = 0; i < detail::tvec3<T>::value_size(); ++i) + Result[i] = x[i] > y[i] ? a : b; + return Result; +} + +// Max comparison between 2 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec4<U> associatedMax +( + const detail::tvec4<T>& x, U a, + const detail::tvec4<T>& y, U b +) +{ + detail::tvec4<U> Result; + for(typename detail::tvec4<T>::size_type i = 0; i < detail::tvec4<T>::value_size(); ++i) + Result[i] = x[i] > y[i] ? a : b; + return Result; +} + +// Max comparison between 3 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER U associatedMax +( + T x, U a, + T y, U b, + T z, U c +) +{ + U Result = x > y ? (x > z ? a : c) : (y > z ? b : c); + return Result; +} + +// Max comparison between 3 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec2<U> associatedMax +( + const detail::tvec2<T>& x, const detail::tvec2<U>& a, + const detail::tvec2<T>& y, const detail::tvec2<U>& b, + const detail::tvec2<T>& z, const detail::tvec2<U>& c +) +{ + detail::tvec2<U> Result; + for(typename detail::tvec2<U>::size_type i = 0; i < detail::tvec2<U>::value_size; ++i) + Result[i] = x[i] > y[i] ? (x[i] > z[i] ? a[i] : c[i]) : (y[i] > z[i] ? b[i] : c[i]); + return Result; +} + +// Max comparison between 3 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec3<U> associatedMax +( + const detail::tvec3<T>& x, const detail::tvec3<U>& a, + const detail::tvec3<T>& y, const detail::tvec3<U>& b, + const detail::tvec3<T>& z, const detail::tvec3<U>& c +) +{ + detail::tvec3<U> Result; + for(typename detail::tvec3<U>::size_type i = 0; i < detail::tvec3<U>::value_size; ++i) + Result[i] = x[i] > y[i] ? (x[i] > z[i] ? a[i] : c[i]) : (y[i] > z[i] ? b[i] : c[i]); + return Result; +} + +// Max comparison between 3 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec4<U> associatedMax +( + const detail::tvec4<T>& x, const detail::tvec4<U>& a, + const detail::tvec4<T>& y, const detail::tvec4<U>& b, + const detail::tvec4<T>& z, const detail::tvec4<U>& c +) +{ + detail::tvec4<U> Result; + for(typename detail::tvec4<U>::size_type i = 0; i < detail::tvec4<U>::value_size; ++i) + Result[i] = x[i] > y[i] ? (x[i] > z[i] ? a[i] : c[i]) : (y[i] > z[i] ? b[i] : c[i]); + return Result; +} + +// Max comparison between 3 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec2<U> associatedMax +( + T x, const detail::tvec2<U>& a, + T y, const detail::tvec2<U>& b, + T z, const detail::tvec2<U>& c +) +{ + detail::tvec2<U> Result; + for(typename detail::tvec2<U>::size_type i = 0; i < detail::tvec2<U>::value_size; ++i) + Result[i] = x > y ? (x > z ? a[i] : c[i]) : (y > z ? b[i] : c[i]); + return Result; +} + +// Max comparison between 3 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec3<U> associatedMax +( + T x, const detail::tvec3<U>& a, + T y, const detail::tvec3<U>& b, + T z, const detail::tvec3<U>& c +) +{ + detail::tvec3<U> Result; + for(typename detail::tvec3<U>::size_type i = 0; i < detail::tvec3<U>::value_size; ++i) + Result[i] = x > y ? (x > z ? a[i] : c[i]) : (y > z ? b[i] : c[i]); + return Result; +} + +// Max comparison between 3 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec4<U> associatedMax +( + T x, const detail::tvec4<U>& a, + T y, const detail::tvec4<U>& b, + T z, const detail::tvec4<U>& c +) +{ + detail::tvec4<U> Result; + for(typename detail::tvec4<U>::size_type i = 0; i < detail::tvec4<U>::value_size; ++i) + Result[i] = x > y ? (x > z ? a[i] : c[i]) : (y > z ? b[i] : c[i]); + return Result; +} + +// Max comparison between 3 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec2<U> associatedMax +( + const detail::tvec2<T>& x, U a, + const detail::tvec2<T>& y, U b, + const detail::tvec2<T>& z, U c +) +{ + detail::tvec2<U> Result; + for(typename detail::tvec2<T>::size_type i = 0; i < detail::tvec2<T>::value_size(); ++i) + Result[i] = x[i] > y[i] ? (x[i] > z[i] ? a : c) : (y[i] > z[i] ? b : c); + return Result; +} + +// Max comparison between 3 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec3<U> associatedMax +( + const detail::tvec3<T>& x, U a, + const detail::tvec3<T>& y, U b, + const detail::tvec3<T>& z, U c +) +{ + detail::tvec3<U> Result; + for(typename detail::tvec3<T>::size_type i = 0; i < detail::tvec3<T>::value_size(); ++i) + Result[i] = x[i] > y[i] ? (x[i] > z[i] ? a : c) : (y[i] > z[i] ? b : c); + return Result; +} + +// Max comparison between 3 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec4<U> associatedMax +( + const detail::tvec4<T>& x, U a, + const detail::tvec4<T>& y, U b, + const detail::tvec4<T>& z, U c +) +{ + detail::tvec4<U> Result; + for(typename detail::tvec4<T>::size_type i = 0; i < detail::tvec4<T>::value_size(); ++i) + Result[i] = x[i] > y[i] ? (x[i] > z[i] ? a : c) : (y[i] > z[i] ? b : c); + return Result; +} + +// Max comparison between 4 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER U associatedMax +( + T x, U a, + T y, U b, + T z, U c, + T w, U d +) +{ + T Test1 = max(x, y); + T Test2 = max(z, w);; + U Result1 = x > y ? a : b; + U Result2 = z > w ? c : d; + U Result = Test1 > Test2 ? Result1 : Result2; + return Result; +} + +// Max comparison between 4 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec2<U> associatedMax +( + const detail::tvec2<T>& x, const detail::tvec2<U>& a, + const detail::tvec2<T>& y, const detail::tvec2<U>& b, + const detail::tvec2<T>& z, const detail::tvec2<U>& c, + const detail::tvec2<T>& w, const detail::tvec2<U>& d +) +{ + detail::tvec2<U> Result; + for(typename detail::tvec2<U>::size_type i = 0; i < detail::tvec2<U>::value_size; ++i) + { + T Test1 = max(x[i], y[i]); + T Test2 = max(z[i], w[i]); + U Result1 = x[i] > y[i] ? a[i] : b[i]; + U Result2 = z[i] > w[i] ? c[i] : d[i]; + Result[i] = Test1 > Test2 ? Result1 : Result2; + } + return Result; +} + +// Max comparison between 4 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec3<U> associatedMax +( + const detail::tvec3<T>& x, const detail::tvec3<U>& a, + const detail::tvec3<T>& y, const detail::tvec3<U>& b, + const detail::tvec3<T>& z, const detail::tvec3<U>& c, + const detail::tvec3<T>& w, const detail::tvec3<U>& d +) +{ + detail::tvec3<U> Result; + for(typename detail::tvec3<U>::size_type i = 0; i < detail::tvec3<U>::value_size; ++i) + { + T Test1 = max(x[i], y[i]); + T Test2 = max(z[i], w[i]); + U Result1 = x[i] > y[i] ? a[i] : b[i]; + U Result2 = z[i] > w[i] ? c[i] : d[i]; + Result[i] = Test1 > Test2 ? Result1 : Result2; + } + return Result; +} + +// Max comparison between 4 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec4<U> associatedMax +( + const detail::tvec4<T>& x, const detail::tvec4<U>& a, + const detail::tvec4<T>& y, const detail::tvec4<U>& b, + const detail::tvec4<T>& z, const detail::tvec4<U>& c, + const detail::tvec4<T>& w, const detail::tvec4<U>& d +) +{ + detail::tvec4<U> Result; + for(typename detail::tvec4<U>::size_type i = 0; i < detail::tvec4<U>::value_size; ++i) + { + T Test1 = max(x[i], y[i]); + T Test2 = max(z[i], w[i]); + U Result1 = x[i] > y[i] ? a[i] : b[i]; + U Result2 = z[i] > w[i] ? c[i] : d[i]; + Result[i] = Test1 > Test2 ? Result1 : Result2; + } + return Result; +} + +// Max comparison between 4 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec2<U> associatedMax +( + T x, const detail::tvec2<U>& a, + T y, const detail::tvec2<U>& b, + T z, const detail::tvec2<U>& c, + T w, const detail::tvec2<U>& d +) +{ + T Test1 = max(x, y); + T Test2 = max(z, w); + + detail::tvec2<U> Result; + for(typename detail::tvec2<U>::size_type i = 0; i < detail::tvec2<U>::value_size; ++i) + { + U Result1 = x > y ? a[i] : b[i]; + U Result2 = z > w ? c[i] : d[i]; + Result[i] = Test1 > Test2 ? Result1 : Result2; + } + return Result; +} + +// Max comparison between 4 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec3<U> associatedMax +( + T x, const detail::tvec3<U>& a, + T y, const detail::tvec3<U>& b, + T z, const detail::tvec3<U>& c, + T w, const detail::tvec3<U>& d +) +{ + T Test1 = max(x, y); + T Test2 = max(z, w); + + detail::tvec3<U> Result; + for(typename detail::tvec3<U>::size_type i = 0; i < detail::tvec3<U>::value_size; ++i) + { + U Result1 = x > y ? a[i] : b[i]; + U Result2 = z > w ? c[i] : d[i]; + Result[i] = Test1 > Test2 ? Result1 : Result2; + } + return Result; +} + +// Max comparison between 4 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec4<U> associatedMax +( + T x, const detail::tvec4<U>& a, + T y, const detail::tvec4<U>& b, + T z, const detail::tvec4<U>& c, + T w, const detail::tvec4<U>& d +) +{ + T Test1 = max(x, y); + T Test2 = max(z, w); + + detail::tvec4<U> Result; + for(typename detail::tvec4<U>::size_type i = 0; i < detail::tvec4<U>::value_size; ++i) + { + U Result1 = x > y ? a[i] : b[i]; + U Result2 = z > w ? c[i] : d[i]; + Result[i] = Test1 > Test2 ? Result1 : Result2; + } + return Result; +} + +// Max comparison between 4 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec2<U> associatedMax +( + const detail::tvec2<T>& x, U a, + const detail::tvec2<T>& y, U b, + const detail::tvec2<T>& z, U c, + const detail::tvec2<T>& w, U d +) +{ + detail::tvec2<U> Result; + for(typename detail::tvec2<T>::size_type i = 0; i < detail::tvec2<T>::value_size(); ++i) + { + T Test1 = max(x[i], y[i]); + T Test2 = max(z[i], w[i]);; + U Result1 = x[i] > y[i] ? a : b; + U Result2 = z[i] > w[i] ? c : d; + Result[i] = Test1 > Test2 ? Result1 : Result2; + } + return Result; +} + +// Max comparison between 4 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec3<U> associatedMax +( + const detail::tvec3<T>& x, U a, + const detail::tvec3<T>& y, U b, + const detail::tvec3<T>& z, U c, + const detail::tvec3<T>& w, U d +) +{ + detail::tvec3<U> Result; + for(typename detail::tvec3<T>::size_type i = 0; i < detail::tvec3<T>::value_size(); ++i) + { + T Test1 = max(x[i], y[i]); + T Test2 = max(z[i], w[i]);; + U Result1 = x[i] > y[i] ? a : b; + U Result2 = z[i] > w[i] ? c : d; + Result[i] = Test1 > Test2 ? Result1 : Result2; + } + return Result; +} + +// Max comparison between 4 variables +template<typename T, typename U> +GLM_FUNC_QUALIFIER detail::tvec4<U> associatedMax +( + const detail::tvec4<T>& x, U a, + const detail::tvec4<T>& y, U b, + const detail::tvec4<T>& z, U c, + const detail::tvec4<T>& w, U d +) +{ + detail::tvec4<U> Result; + for(typename detail::tvec4<T>::size_type i = 0; i < detail::tvec4<T>::value_size(); ++i) + { + T Test1 = max(x[i], y[i]); + T Test2 = max(z[i], w[i]);; + U Result1 = x[i] > y[i] ? a : b; + U Result2 = z[i] > w[i] ? c : d; + Result[i] = Test1 > Test2 ? Result1 : Result2; + } + return Result; +} + +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/bit.hpp b/include/gal/opengl/glm/gtx/bit.hpp new file mode 100644 index 0000000..94aaae5 --- /dev/null +++ b/include/gal/opengl/glm/gtx/bit.hpp @@ -0,0 +1,140 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_bit +/// @file glm/gtx/bit.hpp +/// @date 2007-03-14 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// @see gtc_half_float (dependence) +/// +/// @defgroup gtx_bit GLM_GTX_bit +/// @ingroup gtx +/// +/// @brief Allow to perform bit operations on integer values +/// +/// <glm/gtx/bit.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_bit +#define GLM_GTX_bit GLM_VERSION + +// Dependency: +#include "../glm.hpp" +#include "../gtc/half_float.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_bit extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_bit + /// @{ + + /// Build a mask of 'count' bits + /// @see gtx_bit + template <typename genIType> + genIType mask(genIType const & count); + + /// Component wise extraction of bit fields. + /// genType and genIType could be a scalar or a vector. + /// @see gtx_bit + template <typename genIUType, typename sizeType> + GLM_DEPRECATED genIUType extractField( + genIUType const & v, + sizeType const & first, + sizeType const & count); + + //! Find the lowest bit set to 1 in a integer variable. + /// @see gtx_bit + template <typename genType> + GLM_DEPRECATED int lowestBit(genType const & value); + + //! Find the highest bit set to 1 in a integer variable. + /// @see gtx_bit + template <typename genType> + GLM_DEPRECATED int highestBit(genType const & value); + + //! Find the highest bit set to 1 in a integer variable and return its value. + /// @see gtx_bit + template <typename genType> + genType highestBitValue(genType const & value); + + //! Return true if the value is a power of two number. + /// @see gtx_bit + template <typename genType> + bool isPowerOfTwo(genType const & value); + + //! Return the power of two number which value is just higher the input value. + /// @see gtx_bit + template <typename genType> + genType powerOfTwoAbove(genType const & value); + + //! Return the power of two number which value is just lower the input value. + /// @see gtx_bit + template <typename genType> + genType powerOfTwoBelow(genType const & value); + + //! Return the power of two number which value is the closet to the input value. + /// @see gtx_bit + template <typename genType> + genType powerOfTwoNearest(genType const & value); + + //! Revert all bits of any integer based type. + /// @see gtx_bit + template <typename genType> + GLM_DEPRECATED genType bitRevert(genType const & value); + + //! Rotate all bits to the right. + /// @see gtx_bit + template <typename genType> + genType bitRotateRight(genType const & In, std::size_t Shift); + + //! Rotate all bits to the left. + /// @see gtx_bit + template <typename genType> + genType bitRotateLeft(genType const & In, std::size_t Shift); + + //! Set to 1 a range of bits. + /// @see gtx_bit + template <typename genIUType> + genIUType fillBitfieldWithOne( + genIUType const & Value, + int const & FromBit, + int const & ToBit); + + //! Set to 0 a range of bits. + /// @see gtx_bit + template <typename genIUType> + genIUType fillBitfieldWithZero( + genIUType const & Value, + int const & FromBit, + int const & ToBit); + + /// @} +} //namespace glm + +#include "bit.inl" + +#endif//GLM_GTX_bit diff --git a/include/gal/opengl/glm/gtx/bit.inl b/include/gal/opengl/glm/gtx/bit.inl new file mode 100644 index 0000000..27647ae --- /dev/null +++ b/include/gal/opengl/glm/gtx/bit.inl @@ -0,0 +1,600 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2007-03-14 +// Updated : 2008-11-14 +// Licence : This source is under MIT License +// File : glm/gtx/bit.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template <typename genIType> + GLM_FUNC_QUALIFIER genIType mask + ( + genIType const & count + ) + { + return ((genIType(1) << (count)) - genIType(1)); + } + + VECTORIZE_VEC(mask) + + // extractField + template <typename genIType> + GLM_FUNC_QUALIFIER genIType extractField + ( + half const & value, + genIType const & first, + genIType const & count + ) + { + assert(first + count < sizeof(half)); + return (value._data() << first) >> ((sizeof(half) << 3) - count); + } + + template <typename genIType> + GLM_FUNC_QUALIFIER genIType extractField + ( + float const & value, + genIType const & first, + genIType const & count + ) + { + assert(first + count < sizeof(float)); + return (detail::uif32(value).i << first) >> ((sizeof(float) << 3) - count); + } + + template <typename genIType> + GLM_FUNC_QUALIFIER genIType extractField + ( + double const & value, + genIType const & first, + genIType const & count + ) + { + assert(first + count < sizeof(double)); + return (detail::uif64(value).i << first) >> ((sizeof(double) << genIType(3)) - count); + } + + template <typename genIUType, typename sizeType> + GLM_FUNC_QUALIFIER genIUType extractField + ( + genIUType const & Value, + sizeType const & First, + sizeType const & Count + ) + { + sizeType GenSize = sizeof(genIUType) << 3; + + assert(First + Count <= GenSize); + + genIUType ShiftLeft = Count ? Value << (GenSize - (Count + First)) : 0; + genIUType ShiftBack = ShiftLeft >> genIUType(GenSize - Count); + + return ShiftBack; + } + + template <typename genIUType, typename sizeType> + GLM_FUNC_QUALIFIER detail::tvec2<genIUType> extractField + ( + detail::tvec2<genIUType> const & value, + sizeType const & first, + sizeType const & count + ) + { + return detail::tvec2<genIUType>( + extractField(value[0], first, count), + extractField(value[1], first, count)); + } + + template <typename genIUType, typename sizeType> + GLM_FUNC_QUALIFIER detail::tvec3<genIUType> extractField + ( + detail::tvec3<genIUType> const & value, + sizeType const & first, + sizeType const & count + ) + { + return detail::tvec3<genIUType>( + extractField(value[0], first, count), + extractField(value[1], first, count), + extractField(value[2], first, count)); + } + + template <typename genIUType, typename sizeType> + GLM_FUNC_QUALIFIER detail::tvec4<genIUType> extractField + ( + detail::tvec4<genIUType> const & value, + sizeType const & first, + sizeType const & count + ) + { + return detail::tvec4<genIUType>( + extractField(value[0], first, count), + extractField(value[1], first, count), + extractField(value[2], first, count), + extractField(value[3], first, count)); + } + + template <typename genIUType, typename sizeType> + GLM_FUNC_QUALIFIER detail::tvec2<genIUType> extractField + ( + detail::tvec2<genIUType> const & value, + detail::tvec2<sizeType> const & first, + detail::tvec2<sizeType> const & count + ) + { + return detail::tvec2<genIUType>( + extractField(value[0], first[0], count[0]), + extractField(value[1], first[1], count[1])); + } + + template <typename genIUType, typename sizeType> + GLM_FUNC_QUALIFIER detail::tvec3<genIUType> extractField + ( + detail::tvec3<genIUType> const & value, + detail::tvec3<sizeType> const & first, + detail::tvec3<sizeType> const & count + ) + { + return detail::tvec3<genIUType>( + extractField(value[0], first[0], count[0]), + extractField(value[1], first[1], count[1]), + extractField(value[2], first[2], count[2])); + } + + template <typename genIUType, typename sizeType> + GLM_FUNC_QUALIFIER detail::tvec4<genIUType> extractField + ( + detail::tvec4<genIUType> const & value, + detail::tvec4<sizeType> const & first, + detail::tvec4<sizeType> const & count + ) + { + return detail::tvec4<genIUType>( + extractField(value[0], first[0], count[0]), + extractField(value[1], first[1], count[1]), + extractField(value[2], first[2], count[2]), + extractField(value[3], first[3], count[3])); + } + + template <typename genIUType, typename sizeType> + GLM_FUNC_QUALIFIER detail::tvec2<genIUType> extractField + ( + genIUType const & value, + detail::tvec2<sizeType> const & first, + detail::tvec2<sizeType> const & count + ) + { + return detail::tvec2<genIUType>( + extractField(value, first[0], count[0]), + extractField(value, first[1], count[1])); + } + + template <typename genIUType, typename sizeType> + GLM_FUNC_QUALIFIER detail::tvec3<genIUType> extractField + ( + genIUType const & value, + detail::tvec3<sizeType> const & first, + detail::tvec3<sizeType> const & count + ) + { + return detail::tvec3<genIUType>( + extractField(value, first[0], count[0]), + extractField(value, first[1], count[1]), + extractField(value, first[2], count[2])); + } + + template <typename genIUType, typename sizeType> + GLM_FUNC_QUALIFIER detail::tvec4<genIUType> extractField + ( + genIUType const & value, + detail::tvec4<sizeType> const & first, + detail::tvec4<sizeType> const & count + ) + { + return detail::tvec4<genIUType>( + extractField(value, first[0], count[0]), + extractField(value, first[1], count[1]), + extractField(value, first[2], count[2]), + extractField(value, first[3], count[3])); + } + + // lowestBit + template <typename genType> + GLM_FUNC_QUALIFIER int lowestBit + ( + genType const & Value + ) + { + assert(Value != genType(0)); // not valid call + + genType Bit; + for(Bit = genType(0); !(Value & (1 << Bit)); ++Bit){} + return Bit; + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec2<int> lowestBit + ( + detail::tvec2<valType> const & value + ) + { + return detail::tvec2<int>( + lowestBit(value[0]), + lowestBit(value[1])); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec3<int> lowestBit + ( + detail::tvec3<valType> const & value + ) + { + return detail::tvec3<int>( + lowestBit(value[0]), + lowestBit(value[1]), + lowestBit(value[2])); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec4<int> lowestBit + ( + detail::tvec4<valType> const & value + ) + { + return detail::tvec4<int>( + lowestBit(value[0]), + lowestBit(value[1]), + lowestBit(value[2]), + lowestBit(value[3])); + } + + // highestBit + template <typename genType> + GLM_FUNC_QUALIFIER int highestBit + ( + genType const & value + ) + { + assert(value != genType(0)); // not valid call + + genType bit = genType(-1); + for(genType tmp = value; tmp; tmp >>= 1, ++bit){} + return bit; + } + + //template <> + //GLM_FUNC_QUALIFIER int highestBit<int> + //( + // int value + //) + //{ + // int bit = -1; + // for(int tmp = value; tmp; tmp >>= 1, ++bit); + // return bit; + //} + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec2<int> highestBit + ( + detail::tvec2<valType> const & value + ) + { + return detail::tvec2<int>( + highestBit(value[0]), + highestBit(value[1])); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec3<int> highestBit + ( + detail::tvec3<valType> const & value + ) + { + return detail::tvec3<int>( + highestBit(value[0]), + highestBit(value[1]), + highestBit(value[2])); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec4<int> highestBit + ( + detail::tvec4<valType> const & value + ) + { + return detail::tvec4<int>( + highestBit(value[0]), + highestBit(value[1]), + highestBit(value[2]), + highestBit(value[3])); + } + + // highestBitValue + template <typename genType> + GLM_FUNC_QUALIFIER genType highestBitValue + ( + genType const & value + ) + { + genType tmp = value; + genType result = genType(0); + while(tmp) + { + result = (tmp & (~tmp + 1)); // grab lowest bit + tmp &= ~result; // clear lowest bit + } + return result; + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec2<int> highestBitValue + ( + detail::tvec2<valType> const & value + ) + { + return detail::tvec2<int>( + highestBitValue(value[0]), + highestBitValue(value[1])); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec3<int> highestBitValue + ( + detail::tvec3<valType> const & value + ) + { + return detail::tvec3<int>( + highestBitValue(value[0]), + highestBitValue(value[1]), + highestBitValue(value[2])); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec4<int> highestBitValue + ( + detail::tvec4<valType> const & value + ) + { + return detail::tvec4<int>( + highestBitValue(value[0]), + highestBitValue(value[1]), + highestBitValue(value[2]), + highestBitValue(value[3])); + } + + // isPowerOfTwo + template <typename genType> + GLM_FUNC_QUALIFIER bool isPowerOfTwo(genType const & Value) + { + //detail::If<std::numeric_limits<genType>::is_signed>::apply(abs, Value); + //return !(Value & (Value - 1)); + + // For old complier? + genType Result = Value; + if(std::numeric_limits<genType>::is_signed) + Result = abs(Result); + return !(Result & (Result - 1)); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec2<bool> isPowerOfTwo + ( + detail::tvec2<valType> const & value + ) + { + return detail::tvec2<bool>( + isPowerOfTwo(value[0]), + isPowerOfTwo(value[1])); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec3<bool> isPowerOfTwo + ( + detail::tvec3<valType> const & value + ) + { + return detail::tvec3<bool>( + isPowerOfTwo(value[0]), + isPowerOfTwo(value[1]), + isPowerOfTwo(value[2])); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec4<bool> isPowerOfTwo + ( + detail::tvec4<valType> const & value + ) + { + return detail::tvec4<bool>( + isPowerOfTwo(value[0]), + isPowerOfTwo(value[1]), + isPowerOfTwo(value[2]), + isPowerOfTwo(value[3])); + } + + // powerOfTwoAbove + template <typename genType> + GLM_FUNC_QUALIFIER genType powerOfTwoAbove(genType const & value) + { + return isPowerOfTwo(value) ? value : highestBitValue(value) << 1; + } + + VECTORIZE_VEC(powerOfTwoAbove) + + // powerOfTwoBelow + template <typename genType> + GLM_FUNC_QUALIFIER genType powerOfTwoBelow + ( + genType const & value + ) + { + return isPowerOfTwo(value) ? value : highestBitValue(value); + } + + VECTORIZE_VEC(powerOfTwoBelow) + + // powerOfTwoNearest + template <typename genType> + GLM_FUNC_QUALIFIER genType powerOfTwoNearest + ( + genType const & value + ) + { + if(isPowerOfTwo(value)) + return value; + + genType prev = highestBitValue(value); + genType next = prev << 1; + return (next - value) < (value - prev) ? next : prev; + } + + VECTORIZE_VEC(powerOfTwoNearest) + + template <typename genType> + GLM_FUNC_QUALIFIER genType bitRevert(genType const & In) + { + GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_integer, "'bitRevert' only accept integer values"); + + genType Out = 0; + std::size_t BitSize = sizeof(genType) * 8; + for(std::size_t i = 0; i < BitSize; ++i) + if(In & (genType(1) << i)) + Out |= genType(1) << (BitSize - 1 - i); + return Out; + } + + VECTORIZE_VEC(bitRevert) + + template <typename genType> + GLM_FUNC_QUALIFIER genType bitRotateRight(genType const & In, std::size_t Shift) + { + GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_integer, "'bitRotateRight' only accept integer values"); + + std::size_t BitSize = sizeof(genType) * 8; + return (In << Shift) | (In >> (BitSize - Shift)); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec2<valType> bitRotateRight + ( + detail::tvec2<valType> const & Value, + std::size_t Shift + ) + { + return detail::tvec2<valType>( + bitRotateRight(Value[0], Shift), + bitRotateRight(Value[1], Shift)); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec3<valType> bitRotateRight + ( + detail::tvec3<valType> const & Value, + std::size_t Shift + ) + { + return detail::tvec3<valType>( + bitRotateRight(Value[0], Shift), + bitRotateRight(Value[1], Shift), + bitRotateRight(Value[2], Shift)); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec4<valType> bitRotateRight + ( + detail::tvec4<valType> const & Value, + std::size_t Shift + ) + { + return detail::tvec4<valType>( + bitRotateRight(Value[0], Shift), + bitRotateRight(Value[1], Shift), + bitRotateRight(Value[2], Shift), + bitRotateRight(Value[3], Shift)); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType bitRotateLeft(genType const & In, std::size_t Shift) + { + GLM_STATIC_ASSERT(std::numeric_limits<genType>::is_integer, "'bitRotateLeft' only accept integer values"); + + std::size_t BitSize = sizeof(genType) * 8; + return (In >> Shift) | (In << (BitSize - Shift)); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec2<valType> bitRotateLeft + ( + detail::tvec2<valType> const & Value, + std::size_t Shift + ) + { + return detail::tvec2<valType>( + bitRotateLeft(Value[0], Shift), + bitRotateLeft(Value[1], Shift)); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec3<valType> bitRotateLeft + ( + detail::tvec3<valType> const & Value, + std::size_t Shift + ) + { + return detail::tvec3<valType>( + bitRotateLeft(Value[0], Shift), + bitRotateLeft(Value[1], Shift), + bitRotateLeft(Value[2], Shift)); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec4<valType> bitRotateLeft + ( + detail::tvec4<valType> const & Value, + std::size_t Shift + ) + { + return detail::tvec4<valType>( + bitRotateLeft(Value[0], Shift), + bitRotateLeft(Value[1], Shift), + bitRotateLeft(Value[2], Shift), + bitRotateLeft(Value[3], Shift)); + } + + template <typename genIUType> + GLM_FUNC_QUALIFIER genIUType fillBitfieldWithOne + ( + genIUType const & Value, + int const & FromBit, + int const & ToBit + ) + { + assert(FromBit <= ToBit); + assert(ToBit <= sizeof(genIUType) * std::size_t(8)); + + genIUType Result = Value; + for(std::size_t i = 0; i <= ToBit; ++i) + Result |= (1 << i); + return Result; + } + + template <typename genIUType> + GLM_FUNC_QUALIFIER genIUType fillBitfieldWithZero + ( + genIUType const & Value, + int const & FromBit, + int const & ToBit + ) + { + assert(FromBit <= ToBit); + assert(ToBit <= sizeof(genIUType) * std::size_t(8)); + + genIUType Result = Value; + for(std::size_t i = 0; i <= ToBit; ++i) + Result &= ~(1 << i); + return Result; + } +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/closest_point.hpp b/include/gal/opengl/glm/gtx/closest_point.hpp new file mode 100644 index 0000000..7f79556 --- /dev/null +++ b/include/gal/opengl/glm/gtx/closest_point.hpp @@ -0,0 +1,66 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_bit +/// @file glm/gtx/bit.hpp +/// @date 2005-12-30 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// +/// @defgroup gtx_closest_point GLM_GTX_closest_point +/// @ingroup gtx +/// +/// @brief Find the point on a straight line which is the closet of a point. +/// +/// <glm/gtx/closest_point.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_closest_point +#define GLM_GTX_closest_point GLM_VERSION + +// Dependency: +#include "../glm.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_closest_point extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_closest_point + /// @{ + + /// Find the point on a straight line which is the closet of a point. + /// @see gtx_closest_point + template <typename T> + detail::tvec3<T> closestPointOnLine( + detail::tvec3<T> const & point, + detail::tvec3<T> const & a, + detail::tvec3<T> const & b); + + /// @} +}// namespace glm + +#include "closest_point.inl" + +#endif//GLM_GTX_closest_point diff --git a/include/gal/opengl/glm/gtx/closest_point.inl b/include/gal/opengl/glm/gtx/closest_point.inl new file mode 100644 index 0000000..d018c1d --- /dev/null +++ b/include/gal/opengl/glm/gtx/closest_point.inl @@ -0,0 +1,36 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2005-12-30 +// Updated : 2008-10-05 +// Licence : This source is under MIT License +// File : glm/gtx/closest_point.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_gtx_closest_point +#define glm_gtx_closest_point + +namespace glm +{ + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec3<valType> closestPointOnLine + ( + detail::tvec3<valType> const & point, + detail::tvec3<valType> const & a, + detail::tvec3<valType> const & b + ) + { + valType LineLength = distance(a, b); + detail::tvec3<valType> Vector = point - a; + detail::tvec3<valType> LineDirection = (b - a) / LineLength; + + // Project Vector to LineDirection to get the distance of point from a + valType Distance = dot(Vector, LineDirection); + + if(Distance <= valType(0)) return a; + if(Distance >= LineLength) return b; + return a + LineDirection * Distance; + } +}//namespace glm + +#endif//glm_gtx_closest_point diff --git a/include/gal/opengl/glm/gtx/color_cast.hpp b/include/gal/opengl/glm/gtx/color_cast.hpp new file mode 100644 index 0000000..5dada88 --- /dev/null +++ b/include/gal/opengl/glm/gtx/color_cast.hpp @@ -0,0 +1,124 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_color_cast +/// @file glm/gtx/color_cast.hpp +/// @date 2007-06-21 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// @see gtx_number_precision (dependence) +/// +/// @defgroup gtx_color_cast GLM_GTX_color_cast +/// @ingroup gtx +/// +/// @brief Conversion between two color types. +/// +/// <glm/gtx/color_cast.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_color_cast +#define GLM_GTX_color_cast GLM_VERSION + +// Dependency: +#include "../glm.hpp" +#include "../gtx/number_precision.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_color_cast extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_color_cast + /// @{ + + //! Conversion of a floating value into a 8bit unsigned int value. + /// @see gtx_color_cast + template <typename valType> uint8 u8channel_cast(valType a); + + /// Conversion of a floating value into a 16bit unsigned int value. + /// @see gtx_color_cast + template <typename valType> uint16 u16channel_cast(valType a); + + template <typename T> uint32 u32_rgbx_cast(const detail::tvec3<T>& c); //!< \brief Conversion of a 3 components color into an 32bit unsigned int value. (From GLM_GTX_color_cast extension) + template <typename T> uint32 u32_xrgb_cast(const detail::tvec3<T>& c); //!< \brief Conversion of a 3 components color into an 32bit unsigned int value. (From GLM_GTX_color_cast extension) + template <typename T> uint32 u32_bgrx_cast(const detail::tvec3<T>& c); //!< \brief Conversion of a 3 components color into an 32bit unsigned int value. (From GLM_GTX_color_cast extension) + template <typename T> uint32 u32_xbgr_cast(const detail::tvec3<T>& c); //!< \brief Conversion of a 3 components color into an 32bit unsigned int value. (From GLM_GTX_color_cast extension) + + template <typename T> uint32 u32_rgba_cast(const detail::tvec4<T>& c); //!< \brief Conversion of a 4 components color into an 32bit unsigned int value. (From GLM_GTX_color_cast extension) + template <typename T> uint32 u32_argb_cast(const detail::tvec4<T>& c); //!< \brief Conversion of a 4 components color into an 32bit unsigned int value. (From GLM_GTX_color_cast extension) + template <typename T> uint32 u32_bgra_cast(const detail::tvec4<T>& c); //!< \brief Conversion of a 4 components color into an 32bit unsigned int value. (From GLM_GTX_color_cast extension) + template <typename T> uint32 u32_abgr_cast(const detail::tvec4<T>& c); //!< \brief Conversion of a 4 components color into an 32bit unsigned int value. (From GLM_GTX_color_cast extension) + + template <typename T> uint64 u64_rgbx_cast(const detail::tvec3<T>& c); //!< \brief Conversion of a 3 components color into an 64bit unsigned int value. (From GLM_GTX_color_cast extension) + template <typename T> uint64 u64_xrgb_cast(const detail::tvec3<T>& c); //!< \brief Conversion of a 3 components color into an 64bit unsigned int value. (From GLM_GTX_color_cast extension) + template <typename T> uint64 u64_bgrx_cast(const detail::tvec3<T>& c); //!< \brief Conversion of a 3 components color into an 64bit unsigned int value. (From GLM_GTX_color_cast extension) + template <typename T> uint64 u64_xbgr_cast(const detail::tvec3<T>& c); //!< \brief Conversion of a 3 components color into an 64bit unsigned int value. (From GLM_GTX_color_cast extension) + + template <typename T> uint64 u64_rgba_cast(const detail::tvec4<T>& c); //!< \brief Conversion of a 4 components color into an 64bit unsigned int value. (From GLM_GTX_color_cast extension) + template <typename T> uint64 u64_argb_cast(const detail::tvec4<T>& c); //!< \brief Conversion of a 4 components color into an 64bit unsigned int value. (From GLM_GTX_color_cast extension) + template <typename T> uint64 u64_bgra_cast(const detail::tvec4<T>& c); //!< \brief Conversion of a 4 components color into an 64bit unsigned int value. (From GLM_GTX_color_cast extension) + template <typename T> uint64 u64_abgr_cast(const detail::tvec4<T>& c); //!< \brief Conversion of a 4 components color into an 64bit unsigned int value. (From GLM_GTX_color_cast extension) + + template <typename T> f16 f16_channel_cast(T a); //!< \brief Conversion of a u8 or u16 value to a single channel floating value. (From GLM_GTX_color_cast extension) + + template <typename T> f16vec3 f16_rgbx_cast(T c); //!< \brief Conversion of a u32 or u64 color into 3 components floating color. (From GLM_GTX_color_cast extension) + template <typename T> f16vec3 f16_xrgb_cast(T c); //!< \brief Conversion of a u32 or u64 color into 3 components floating color. (From GLM_GTX_color_cast extension) + template <typename T> f16vec3 f16_bgrx_cast(T c); //!< \brief Conversion of a u32 or u64 color into 3 components floating color. (From GLM_GTX_color_cast extension) + template <typename T> f16vec3 f16_xbgr_cast(T c); //!< \brief Conversion of a u32 or u64 color into 3 components floating color. (From GLM_GTX_color_cast extension) + + template <typename T> f16vec4 f16_rgba_cast(T c); //!< \brief Conversion of a u32 or u64 color into 4 components floating color. (From GLM_GTX_color_cast extension) + template <typename T> f16vec4 f16_argb_cast(T c); //!< \brief Conversion of a u32 or u64 color into 4 components floating color. (From GLM_GTX_color_cast extension) + template <typename T> f16vec4 f16_bgra_cast(T c); //!< \brief Conversion of a u32 or u64 color into 4 components floating color. (From GLM_GTX_color_cast extension) + template <typename T> f16vec4 f16_abgr_cast(T c); //!< \brief Conversion of a u32 or u64 color into 4 components floating color. (From GLM_GTX_color_cast extension) + + template <typename T> f32 f32_channel_cast(T a); //!< \brief Conversion of a u8 or u16 value to a single channel floating value. (From GLM_GTX_color_cast extension) + + template <typename T> f32vec3 f32_rgbx_cast(T c); //!< \brief Conversion of a u32 or u64 color into 3 components floating color. (From GLM_GTX_color_cast extension) + template <typename T> f32vec3 f32_xrgb_cast(T c); //!< \brief Conversion of a u32 or u64 color into 3 components floating color. (From GLM_GTX_color_cast extension) + template <typename T> f32vec3 f32_bgrx_cast(T c); //!< \brief Conversion of a u32 or u64 color into 3 components floating color. (From GLM_GTX_color_cast extension) + template <typename T> f32vec3 f32_xbgr_cast(T c); //!< \brief Conversion of a u32 or u64 color into 3 components floating color. (From GLM_GTX_color_cast extension) + + template <typename T> f32vec4 f32_rgba_cast(T c); //!< \brief Conversion of a u32 or u64 color into 4 components floating color. (From GLM_GTX_color_cast extension) + template <typename T> f32vec4 f32_argb_cast(T c); //!< \brief Conversion of a u32 or u64 color into 4 components floating color. (From GLM_GTX_color_cast extension) + template <typename T> f32vec4 f32_bgra_cast(T c); //!< \brief Conversion of a u32 or u64 color into 4 components floating color. (From GLM_GTX_color_cast extension) + template <typename T> f32vec4 f32_abgr_cast(T c); //!< \brief Conversion of a u32 or u64 color into 4 components floating color. (From GLM_GTX_color_cast extension) + + template <typename T> f64 f64_channel_cast(T a); //!< \brief Conversion of a u8 or u16 value to a single channel floating value. (From GLM_GTX_color_cast extension) + + template <typename T> f64vec3 f64_rgbx_cast(T c); //!< \brief Conversion of a u32 or u64 color into 3 components floating color. (From GLM_GTX_color_cast extension) + template <typename T> f64vec3 f64_xrgb_cast(T c); //!< \brief Conversion of a u32 or u64 color into 3 components floating color. (From GLM_GTX_color_cast extension) + template <typename T> f64vec3 f64_bgrx_cast(T c); //!< \brief Conversion of a u32 or u64 color into 3 components floating color. (From GLM_GTX_color_cast extension) + template <typename T> f64vec3 f64_xbgr_cast(T c); //!< \brief Conversion of a u32 or u64 color into 3 components floating color. (From GLM_GTX_color_cast extension) + + template <typename T> f64vec4 f64_rgba_cast(T c); //!< \brief Conversion of a u32 or u64 color into 4 components floating color. (From GLM_GTX_color_cast extension) + template <typename T> f64vec4 f64_argb_cast(T c); //!< \brief Conversion of a u32 or u64 color into 4 components floating color. (From GLM_GTX_color_cast extension) + template <typename T> f64vec4 f64_bgra_cast(T c); //!< \brief Conversion of a u32 or u64 color into 4 components floating color. (From GLM_GTX_color_cast extension) + template <typename T> f64vec4 f64_abgr_cast(T c); //!< \brief Conversion of a u32 or u64 color into 4 components floating color. (From GLM_GTX_color_cast extension) + + /// @} +}//namespace glm + +#include "color_cast.inl" + +#endif//GLM_GTX_color_cast diff --git a/include/gal/opengl/glm/gtx/color_cast.inl b/include/gal/opengl/glm/gtx/color_cast.inl new file mode 100644 index 0000000..55fd1ce --- /dev/null +++ b/include/gal/opengl/glm/gtx/color_cast.inl @@ -0,0 +1,733 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2007-06-21 +// Updated : 2007-08-03 +// Licence : This source is under MIT License +// File : glm/gtx/color_cast.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template <typename T> + GLM_FUNC_QUALIFIER uint8 u8channel_cast(T a) + { + return static_cast<uint8>(a * T(255)); + } + + template <typename T> + GLM_FUNC_QUALIFIER uint16 u16channel_cast(T a) + { + return static_cast<uint16>(a * T(65535)); + } + + template <typename T> + GLM_FUNC_QUALIFIER uint32 u32_rgbx_cast(const detail::tvec3<T>& c) + { + uint32 result = 0; + result += static_cast<uint32>(c.x * detail::tvec3<T>::value_type(255)) << 0; + result += static_cast<uint32>(c.y * detail::tvec3<T>::value_type(255)) << 8; + result += static_cast<uint32>(c.z * detail::tvec3<T>::value_type(255)) << 16; + return result; + } + + template <typename T> + GLM_FUNC_QUALIFIER uint32 u32_xrgb_cast(const detail::tvec3<T>& c) + { + uint32 result = 0; + result += static_cast<uint32>(c.x * detail::tvec3<T>::value_type(255)) << 8; + result += static_cast<uint32>(c.y * detail::tvec3<T>::value_type(255)) << 16; + result += static_cast<uint32>(c.z * detail::tvec3<T>::value_type(255)) << 24; + return result; + } + + template <typename T> + GLM_FUNC_QUALIFIER uint32 u32_bgrx_cast(const detail::tvec3<T>& c) + { + uint32 result = 0; + result += static_cast<uint32>(c.x * detail::tvec3<T>::value_type(255)) << 16; + result += static_cast<uint32>(c.y * detail::tvec3<T>::value_type(255)) << 8; + result += static_cast<uint32>(c.z * detail::tvec3<T>::value_type(255)) << 0; + return result; + } + + template <typename T> + GLM_FUNC_QUALIFIER uint32 u32_xbgr_cast(const detail::tvec3<T>& c) + { + uint32 result = 0; + result += static_cast<uint32>(c.x * detail::tvec3<T>::value_type(255)) << 24; + result += static_cast<uint32>(c.y * detail::tvec3<T>::value_type(255)) << 16; + result += static_cast<uint32>(c.z * detail::tvec3<T>::value_type(255)) << 8; + result += static_cast<uint32>(c.w * detail::tvec3<T>::value_type(255)) << 0; + return result; + } + + template <typename T> + GLM_FUNC_QUALIFIER uint32 u32_rgba_cast(const detail::tvec4<T>& c) + { + uint32 result = 0; + result += static_cast<uint32>(c.x * detail::tvec4<T>::value_type(255)) << 0; + result += static_cast<uint32>(c.y * detail::tvec4<T>::value_type(255)) << 8; + result += static_cast<uint32>(c.z * detail::tvec4<T>::value_type(255)) << 16; + result += static_cast<uint32>(c.w * detail::tvec4<T>::value_type(255)) << 24; + return result; + } + + template <typename T> + GLM_FUNC_QUALIFIER uint32 u32_argb_cast(const detail::tvec4<T>& c) + { + uint32 result = 0; + result += static_cast<uint32>(c.x * detail::tvec4<T>::value_type(255)) << 8; + result += static_cast<uint32>(c.y * detail::tvec4<T>::value_type(255)) << 16; + result += static_cast<uint32>(c.z * detail::tvec4<T>::value_type(255)) << 24; + result += static_cast<uint32>(c.w * detail::tvec4<T>::value_type(255)) << 0; + return result; + } + + template <typename T> + GLM_FUNC_QUALIFIER uint32 u32_bgra_cast(const detail::tvec4<T>& c) + { + uint32 result = 0; + result += static_cast<uint32>(c.x * detail::tvec4<T>::value_type(255)) << 16; + result += static_cast<uint32>(c.y * detail::tvec4<T>::value_type(255)) << 8; + result += static_cast<uint32>(c.z * detail::tvec4<T>::value_type(255)) << 0; + result += static_cast<uint32>(c.w * detail::tvec4<T>::value_type(255)) << 24; + return result; + } + + template <typename T> + GLM_FUNC_QUALIFIER uint32 u32_abgr_cast(const detail::tvec4<T>& c) + { + uint32 result = 0; + result += static_cast<uint32>(c.x * detail::tvec4<T>::value_type(255)) << 24; + result += static_cast<uint32>(c.y * detail::tvec4<T>::value_type(255)) << 16; + result += static_cast<uint32>(c.z * detail::tvec4<T>::value_type(255)) << 8; + result += static_cast<uint32>(c.w * detail::tvec4<T>::value_type(255)) << 0; + return result; + } + + template <typename T> + GLM_FUNC_QUALIFIER uint64 u64_rgbx_cast(const detail::tvec3<T>& c) + { + uint64 result = 0; + result += static_cast<uint64>(c.x * detail::tvec3<T>::value_type(65535)) << 0; + result += static_cast<uint64>(c.y * detail::tvec3<T>::value_type(65535)) << 16; + result += static_cast<uint64>(c.z * detail::tvec3<T>::value_type(65535)) << 32; + return result; + } + + template <typename T> + GLM_FUNC_QUALIFIER uint64 u32_xrgb_cast(const detail::tvec3<T>& c) + { + uint64 result = 0; + result += static_cast<uint64>(c.x * detail::tvec3<T>::value_type(65535)) << 16; + result += static_cast<uint64>(c.y * detail::tvec3<T>::value_type(65535)) << 32; + result += static_cast<uint64>(c.z * detail::tvec3<T>::value_type(65535)) << 48; + return result; + } + + template <typename T> + GLM_FUNC_QUALIFIER uint64 u32_bgrx_cast(const detail::tvec3<T>& c) + { + uint64 result = 0; + result += static_cast<uint64>(c.x * detail::tvec3<T>::value_type(65535)) << 32; + result += static_cast<uint64>(c.y * detail::tvec3<T>::value_type(65535)) << 16; + result += static_cast<uint64>(c.z * detail::tvec3<T>::value_type(65535)) << 0; + return result; + } + + template <typename T> + GLM_FUNC_QUALIFIER uint64 u32_xbgr_cast(const detail::tvec3<T>& c) + { + uint64 result = 0; + result += static_cast<uint64>(c.x * detail::tvec3<T>::value_type(65535)) << 48; + result += static_cast<uint64>(c.y * detail::tvec3<T>::value_type(65535)) << 32; + result += static_cast<uint64>(c.z * detail::tvec3<T>::value_type(65535)) << 16; + result += static_cast<uint64>(c.w * detail::tvec3<T>::value_type(65535)) << 0; + return result; + } + + template <typename T> + GLM_FUNC_QUALIFIER uint64 u64_rgba_cast(const detail::tvec4<T>& c) + { + uint64 result = 0; + result += static_cast<uint64>(c.x * detail::tvec4<T>::value_type(65535)) << 0; + result += static_cast<uint64>(c.y * detail::tvec4<T>::value_type(65535)) << 16; + result += static_cast<uint64>(c.z * detail::tvec4<T>::value_type(65535)) << 32; + result += static_cast<uint64>(c.w * detail::tvec4<T>::value_type(65535)) << 48; + return result; + } + + template <typename T> + GLM_FUNC_QUALIFIER uint64 u64_argb_cast(const detail::tvec4<T>& c) + { + uint64 result = 0; + result += static_cast<uint64>(c.x * detail::tvec4<T>::value_type(65535)) << 16; + result += static_cast<uint64>(c.y * detail::tvec4<T>::value_type(65535)) << 32; + result += static_cast<uint64>(c.z * detail::tvec4<T>::value_type(65535)) << 48; + result += static_cast<uint64>(c.w * detail::tvec4<T>::value_type(65535)) << 0; + return result; + } + + template <typename T> + GLM_FUNC_QUALIFIER uint64 u64_bgra_cast(const detail::tvec4<T>& c) + { + uint64 result = 0; + result += static_cast<uint64>(c.x * detail::tvec4<T>::value_type(65535)) << 32; + result += static_cast<uint64>(c.y * detail::tvec4<T>::value_type(65535)) << 16; + result += static_cast<uint64>(c.z * detail::tvec4<T>::value_type(65535)) << 0; + result += static_cast<uint64>(c.w * detail::tvec4<T>::value_type(65535)) << 48; + return result; + } + + template <typename T> + GLM_FUNC_QUALIFIER uint64 u64_abgr_cast(const detail::tvec4<T>& c) + { + uint64 result = 0; + result += static_cast<uint64>(c.x * detail::tvec4<T>::value_type(65535)) << 48; + result += static_cast<uint64>(c.y * detail::tvec4<T>::value_type(65535)) << 32; + result += static_cast<uint64>(c.z * detail::tvec4<T>::value_type(65535)) << 16; + result += static_cast<uint64>(c.w * detail::tvec4<T>::value_type(65535)) << 0; + return result; + } + + template <> + GLM_FUNC_QUALIFIER f16 f16_channel_cast<uint32>(uint32 color) + { + return f16(static_cast<float>(color >> 0) / static_cast<float>(255)); + } + + template <> + GLM_FUNC_QUALIFIER f16vec3 f16_rgbx_cast<uint32>(uint32 color) + { + f16vec3 result; + result.x = f16(static_cast<float>((color >> 0) & 0xFF) / static_cast<float>(255)); + result.y = f16(static_cast<float>((color >> 8) & 0xFF) / static_cast<float>(255)); + result.z = f16(static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255)); + return result; + } + + template <> + GLM_FUNC_QUALIFIER f16vec3 f16_xrgb_cast<uint32>(uint32 color) + { + f16vec3 result; + result.x = f16(static_cast<float>((color >> 8) & 0xFF) / static_cast<float>(255)); + result.y = f16(static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255)); + result.z = f16(static_cast<float>((color >> 24) & 0xFF) / static_cast<float>(255)); + return result; + } + + template <> + GLM_FUNC_QUALIFIER f16vec3 f16_bgrx_cast<uint32>(uint32 color) + { + f16vec3 result; + result.x = f16(static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255)); + result.y = f16(static_cast<float>((color >> 8) & 0xFF) / static_cast<float>(255)); + result.z = f16(static_cast<float>((color >> 0) & 0xFF) / static_cast<float>(255)); + return result; + } + + template <> + GLM_FUNC_QUALIFIER f16vec3 f16_xbgr_cast<uint32>(uint32 color) + { + f16vec3 result; + result.x = f16(static_cast<float>((color >> 24) & 0xFF) / static_cast<float>(255)); + result.y = f16(static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255)); + result.z = f16(static_cast<float>((color >> 8) & 0xFF) / static_cast<float>(255)); + return result; + } + + template <> + GLM_FUNC_QUALIFIER f16vec4 f16_rgba_cast<uint32>(uint32 color) + { + f16vec4 result; + result.x = f16(static_cast<float>((color >> 0) & 0xFF) / static_cast<float>(255)); + result.y = f16(static_cast<float>((color >> 8) & 0xFF) / static_cast<float>(255)); + result.z = f16(static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255)); + result.w = f16(static_cast<float>((color >> 24) & 0xFF) / static_cast<float>(255)); + return result; + } + + template <> + GLM_FUNC_QUALIFIER f16vec4 f16_argb_cast<uint32>(uint32 color) + { + f16vec4 result; + result.x = f16(static_cast<float>((color >> 8) & 0xFF) / static_cast<float>(255)); + result.y = f16(static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255)); + result.z = f16(static_cast<float>((color >> 24) & 0xFF) / static_cast<float>(255)); + result.w = f16(static_cast<float>((color >> 0) & 0xFF) / static_cast<float>(255)); + return result; + } + + template <> + GLM_FUNC_QUALIFIER f16vec4 f16_bgra_cast<uint32>(uint32 color) + { + f16vec4 result; + result.x = f16(static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255)); + result.y = f16(static_cast<float>((color >> 8) & 0xFF) / static_cast<float>(255)); + result.z = f16(static_cast<float>((color >> 0) & 0xFF) / static_cast<float>(255)); + result.w = f16(static_cast<float>((color >> 24) & 0xFF) / static_cast<float>(255)); + return result; + } + + template <> + GLM_FUNC_QUALIFIER f16vec4 f16_abgr_cast<uint32>(uint32 color) + { + f16vec4 result; + result.x = f16(static_cast<float>((color >> 24) & 0xFF) / static_cast<float>(255)); + result.y = f16(static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255)); + result.z = f16(static_cast<float>((color >> 8) & 0xFF) / static_cast<float>(255)); + result.w = f16(static_cast<float>((color >> 0) & 0xFF) / static_cast<float>(255)); + return result; + } + + template <> + GLM_FUNC_QUALIFIER float f32_channel_cast<uint8>(uint8 color) + { + return static_cast<float>(color >> 0) / static_cast<float>(255); + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec3<float> f32_rgbx_cast<uint32>(uint32 color) + { + detail::tvec3<float> result; + result.x = static_cast<float>((color >> 0) & 0xFF) / static_cast<float>(255); + result.y = static_cast<float>((color >> 8) & 0xFF) / static_cast<float>(255); + result.z = static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec3<float> f32_xrgb_cast<uint32>(uint32 color) + { + detail::tvec3<float> result; + result.x = static_cast<float>((color >> 8) & 0xFF) / static_cast<float>(255); + result.y = static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255); + result.z = static_cast<float>((color >> 24) & 0xFF) / static_cast<float>(255); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec3<float> f32_bgrx_cast<uint32>(uint32 color) + { + detail::tvec3<float> result; + result.x = static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255); + result.y = static_cast<float>((color >> 8) & 0xFF) / static_cast<float>(255); + result.z = static_cast<float>((color >> 0) & 0xFF) / static_cast<float>(255); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec3<float> f32_xbgr_cast<uint32>(uint32 color) + { + detail::tvec3<float> result; + result.x = static_cast<float>((color >> 24) & 0xFF) / static_cast<float>(255); + result.y = static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255); + result.z = static_cast<float>((color >> 8) & 0xFF) / static_cast<float>(255); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec4<float> f32_rgba_cast<uint32>(uint32 color) + { + detail::tvec4<float> result; + result.x = static_cast<float>((color >> 0) & 0xFF) / static_cast<float>(255); + result.y = static_cast<float>((color >> 8) & 0xFF) / static_cast<float>(255); + result.z = static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255); + result.w = static_cast<float>((color >> 24) & 0xFF) / static_cast<float>(255); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec4<float> f32_argb_cast<uint32>(uint32 color) + { + detail::tvec4<float> result; + result.x = static_cast<float>((color >> 8) & 0xFF) / static_cast<float>(255); + result.y = static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255); + result.z = static_cast<float>((color >> 24) & 0xFF) / static_cast<float>(255); + result.w = static_cast<float>((color >> 0) & 0xFF) / static_cast<float>(255); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec4<float> f32_bgra_cast<uint32>(uint32 color) + { + detail::tvec4<float> result; + result.x = static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255); + result.y = static_cast<float>((color >> 8) & 0xFF) / static_cast<float>(255); + result.z = static_cast<float>((color >> 0) & 0xFF) / static_cast<float>(255); + result.w = static_cast<float>((color >> 24) & 0xFF) / static_cast<float>(255); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec4<float> f32_abgr_cast<uint32>(uint32 color) + { + detail::tvec4<float> result; + result.x = static_cast<float>((color >> 24) & 0xFF) / static_cast<float>(255); + result.y = static_cast<float>((color >> 16) & 0xFF) / static_cast<float>(255); + result.z = static_cast<float>((color >> 8) & 0xFF) / static_cast<float>(255); + result.w = static_cast<float>((color >> 0) & 0xFF) / static_cast<float>(255); + return result; + } + + template <> + GLM_FUNC_QUALIFIER double f64_channel_cast<uint8>(uint8 color) + { + return static_cast<double>(color >> 0) / static_cast<double>(255); + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec3<double> f64_rgbx_cast<uint32>(uint32 color) + { + detail::tvec3<double> result; + result.x = static_cast<double>((color >> 0) & 0xFF) / static_cast<double>(255); + result.y = static_cast<double>((color >> 8) & 0xFF) / static_cast<double>(255); + result.z = static_cast<double>((color >> 16) & 0xFF) / static_cast<double>(255); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec3<double> f64_xrgb_cast<uint32>(uint32 color) + { + detail::tvec3<double> result; + result.x = static_cast<double>((color >> 8) & 0xFF) / static_cast<double>(255); + result.y = static_cast<double>((color >> 16) & 0xFF) / static_cast<double>(255); + result.z = static_cast<double>((color >> 24) & 0xFF) / static_cast<double>(255); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec3<double> f64_bgrx_cast<uint32>(uint32 color) + { + detail::tvec3<double> result; + result.x = static_cast<double>((color >> 16) & 0xFF) / static_cast<double>(255); + result.y = static_cast<double>((color >> 8) & 0xFF) / static_cast<double>(255); + result.z = static_cast<double>((color >> 0) & 0xFF) / static_cast<double>(255); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec3<double> f64_xbgr_cast<uint32>(uint32 color) + { + detail::tvec3<double> result; + result.x = static_cast<double>((color >> 24) & 0xFF) / static_cast<double>(255); + result.y = static_cast<double>((color >> 16) & 0xFF) / static_cast<double>(255); + result.z = static_cast<double>((color >> 8) & 0xFF) / static_cast<double>(255); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec4<double> f64_rgba_cast<uint32>(uint32 color) + { + detail::tvec4<double> result; + result.x = static_cast<double>((color >> 0) & 0xFF) / static_cast<double>(255); + result.y = static_cast<double>((color >> 8) & 0xFF) / static_cast<double>(255); + result.z = static_cast<double>((color >> 16) & 0xFF) / static_cast<double>(255); + result.w = static_cast<double>((color >> 24) & 0xFF) / static_cast<double>(255); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec4<double> f64_argb_cast<uint32>(uint32 color) + { + detail::tvec4<double> result; + result.x = static_cast<double>((color >> 8) & 0xFF) / static_cast<double>(255); + result.y = static_cast<double>((color >> 16) & 0xFF) / static_cast<double>(255); + result.z = static_cast<double>((color >> 24) & 0xFF) / static_cast<double>(255); + result.w = static_cast<double>((color >> 0) & 0xFF) / static_cast<double>(255); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec4<double> f64_bgra_cast<uint32>(uint32 color) + { + detail::tvec4<double> result; + result.x = static_cast<double>((color >> 16) & 0xFF) / static_cast<double>(255); + result.y = static_cast<double>((color >> 8) & 0xFF) / static_cast<double>(255); + result.z = static_cast<double>((color >> 0) & 0xFF) / static_cast<double>(255); + result.w = static_cast<double>((color >> 24) & 0xFF) / static_cast<double>(255); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec4<double> f64_abgr_cast<uint32>(uint32 color) + { + detail::tvec4<double> result; + result.x = static_cast<double>((color >> 24) & 0xFF) / static_cast<double>(255); + result.y = static_cast<double>((color >> 16) & 0xFF) / static_cast<double>(255); + result.z = static_cast<double>((color >> 8) & 0xFF) / static_cast<double>(255); + result.w = static_cast<double>((color >> 0) & 0xFF) / static_cast<double>(255); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::half f16_channel_cast<uint16>(uint16 color) + { + return detail::half(static_cast<float>(color >> 0) / static_cast<float>(65535)); + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec3<detail::half> f16_rgbx_cast<uint64>(uint64 color) + { + detail::tvec3<detail::half> result; + result.x = detail::half(static_cast<float>((color >> 0) & 0xFFFF) / static_cast<float>(65535)); + result.y = detail::half(static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535)); + result.z = detail::half(static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535)); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec3<detail::half> f16_xrgb_cast<uint64>(uint64 color) + { + detail::tvec3<detail::half> result; + result.x = detail::half(static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535)); + result.y = detail::half(static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535)); + result.z = detail::half(static_cast<float>((color >> 48) & 0xFFFF) / static_cast<float>(65535)); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec3<detail::half> f16_bgrx_cast<uint64>(uint64 color) + { + detail::tvec3<detail::half> result; + result.x = detail::half(static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535)); + result.y = detail::half(static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535)); + result.z = detail::half(static_cast<float>((color >> 0) & 0xFFFF) / static_cast<float>(65535)); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec3<detail::half> f16_xbgr_cast<uint64>(uint64 color) + { + detail::tvec3<detail::half> result; + result.x = detail::half(static_cast<float>((color >> 48) & 0xFFFF) / static_cast<float>(65535)); + result.y = detail::half(static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535)); + result.z = detail::half(static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535)); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec4<detail::half> f16_rgba_cast<uint64>(uint64 color) + { + detail::tvec4<detail::half> result; + result.x = detail::half(static_cast<float>((color >> 0) & 0xFFFF) / static_cast<float>(65535)); + result.y = detail::half(static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535)); + result.z = detail::half(static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535)); + result.w = detail::half(static_cast<float>((color >> 48) & 0xFFFF) / static_cast<float>(65535)); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec4<detail::half> f16_argb_cast<uint64>(uint64 color) + { + detail::tvec4<detail::half> result; + result.x = detail::half(static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535)); + result.y = detail::half(static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535)); + result.z = detail::half(static_cast<float>((color >> 48) & 0xFFFF) / static_cast<float>(65535)); + result.w = detail::half(static_cast<float>((color >> 0) & 0xFFFF) / static_cast<float>(65535)); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec4<detail::half> f16_bgra_cast<uint64>(uint64 color) + { + detail::tvec4<detail::half> result; + result.x = detail::half(static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535)); + result.y = detail::half(static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535)); + result.z = detail::half(static_cast<float>((color >> 0) & 0xFFFF) / static_cast<float>(65535)); + result.w = detail::half(static_cast<float>((color >> 48) & 0xFFFF) / static_cast<float>(65535)); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec4<detail::half> f16_abgr_cast<uint64>(uint64 color) + { + detail::tvec4<detail::half> result; + result.x = detail::half(static_cast<float>((color >> 48) & 0xFFFF) / static_cast<float>(65535)); + result.y = detail::half(static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535)); + result.z = detail::half(static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535)); + result.w = detail::half(static_cast<float>((color >> 0) & 0xFFFF) / static_cast<float>(65535)); + return result; + } + + template <> + GLM_FUNC_QUALIFIER float f32_channel_cast<uint16>(uint16 color) + { + return static_cast<float>(color >> 0) / static_cast<float>(65535); + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec3<float> f32_rgbx_cast<uint64>(uint64 color) + { + detail::tvec3<float> result; + result.x = static_cast<float>((color >> 0) & 0xFFFF) / static_cast<float>(65535); + result.y = static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535); + result.z = static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec3<float> f32_xrgb_cast<uint64>(uint64 color) + { + detail::tvec3<float> result; + result.x = static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535); + result.y = static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535); + result.z = static_cast<float>((color >> 48) & 0xFFFF) / static_cast<float>(65535); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec3<float> f32_bgrx_cast<uint64>(uint64 color) + { + detail::tvec3<float> result; + result.x = static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535); + result.y = static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535); + result.z = static_cast<float>((color >> 0) & 0xFFFF) / static_cast<float>(65535); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec3<float> f32_xbgr_cast<uint64>(uint64 color) + { + detail::tvec3<float> result; + result.x = static_cast<float>((color >> 48) & 0xFFFF) / static_cast<float>(65535); + result.y = static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535); + result.z = static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec4<float> f32_rgba_cast<uint64>(uint64 color) + { + detail::tvec4<float> result; + result.x = static_cast<float>((color >> 0) & 0xFFFF) / static_cast<float>(65535); + result.y = static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535); + result.z = static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535); + result.w = static_cast<float>((color >> 48) & 0xFFFF) / static_cast<float>(65535); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec4<float> f32_argb_cast<uint64>(uint64 color) + { + detail::tvec4<float> result; + result.x = static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535); + result.y = static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535); + result.z = static_cast<float>((color >> 48) & 0xFFFF) / static_cast<float>(65535); + result.w = static_cast<float>((color >> 0) & 0xFFFF) / static_cast<float>(65535); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec4<float> f32_bgra_cast<uint64>(uint64 color) + { + detail::tvec4<float> result; + result.x = static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535); + result.y = static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535); + result.z = static_cast<float>((color >> 0) & 0xFFFF) / static_cast<float>(65535); + result.w = static_cast<float>((color >> 48) & 0xFFFF) / static_cast<float>(65535); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec4<float> f32_abgr_cast<uint64>(uint64 color) + { + detail::tvec4<float> result; + result.x = static_cast<float>((color >> 48) & 0xFFFF) / static_cast<float>(65535); + result.y = static_cast<float>((color >> 32) & 0xFFFF) / static_cast<float>(65535); + result.z = static_cast<float>((color >> 16) & 0xFFFF) / static_cast<float>(65535); + result.w = static_cast<float>((color >> 0) & 0xFFFF) / static_cast<float>(65535); + return result; + } + + template <> + GLM_FUNC_QUALIFIER double f64_channel_cast<uint16>(uint16 color) + { + return static_cast<double>(color >> 0) / static_cast<double>(65535); + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec3<double> f64_rgbx_cast<uint64>(uint64 color) + { + detail::tvec3<double> result; + result.x = static_cast<double>((color >> 0) & 0xFFFF) / static_cast<double>(65535); + result.y = static_cast<double>((color >> 16) & 0xFFFF) / static_cast<double>(65535); + result.z = static_cast<double>((color >> 32) & 0xFFFF) / static_cast<double>(65535); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec3<double> f64_xrgb_cast<uint64>(uint64 color) + { + detail::tvec3<double> result; + result.x = static_cast<double>((color >> 16) & 0xFFFF) / static_cast<double>(65535); + result.y = static_cast<double>((color >> 32) & 0xFFFF) / static_cast<double>(65535); + result.z = static_cast<double>((color >> 48) & 0xFFFF) / static_cast<double>(65535); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec3<double> f64_bgrx_cast<uint64>(uint64 color) + { + detail::tvec3<double> result; + result.x = static_cast<double>((color >> 32) & 0xFFFF) / static_cast<double>(65535); + result.y = static_cast<double>((color >> 16) & 0xFFFF) / static_cast<double>(65535); + result.z = static_cast<double>((color >> 0) & 0xFFFF) / static_cast<double>(65535); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec3<double> f64_xbgr_cast<uint64>(uint64 color) + { + detail::tvec3<double> result; + result.x = static_cast<double>((color >> 48) & 0xFFFF) / static_cast<double>(65535); + result.y = static_cast<double>((color >> 32) & 0xFFFF) / static_cast<double>(65535); + result.z = static_cast<double>((color >> 16) & 0xFFFF) / static_cast<double>(65535); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec4<double> f64_rgba_cast<uint64>(uint64 color) + { + detail::tvec4<double> result; + result.x = static_cast<double>((color >> 0) & 0xFFFF) / static_cast<double>(65535); + result.y = static_cast<double>((color >> 16) & 0xFFFF) / static_cast<double>(65535); + result.z = static_cast<double>((color >> 32) & 0xFFFF) / static_cast<double>(65535); + result.w = static_cast<double>((color >> 48) & 0xFFFF) / static_cast<double>(65535); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec4<double> f64_argb_cast<uint64>(uint64 color) + { + detail::tvec4<double> result; + result.x = static_cast<double>((color >> 16) & 0xFFFF) / static_cast<double>(65535); + result.y = static_cast<double>((color >> 32) & 0xFFFF) / static_cast<double>(65535); + result.z = static_cast<double>((color >> 48) & 0xFFFF) / static_cast<double>(65535); + result.w = static_cast<double>((color >> 0) & 0xFFFF) / static_cast<double>(65535); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec4<double> f64_bgra_cast<uint64>(uint64 color) + { + detail::tvec4<double> result; + result.x = static_cast<double>((color >> 32) & 0xFFFF) / static_cast<double>(65535); + result.y = static_cast<double>((color >> 16) & 0xFFFF) / static_cast<double>(65535); + result.z = static_cast<double>((color >> 0) & 0xFFFF) / static_cast<double>(65535); + result.w = static_cast<double>((color >> 48) & 0xFFFF) / static_cast<double>(65535); + return result; + } + + template <> + GLM_FUNC_QUALIFIER detail::tvec4<double> f64_abgr_cast<uint64>(uint64 color) + { + detail::tvec4<double> result; + result.x = static_cast<double>((color >> 48) & 0xFFFF) / static_cast<double>(65535); + result.y = static_cast<double>((color >> 32) & 0xFFFF) / static_cast<double>(65535); + result.z = static_cast<double>((color >> 16) & 0xFFFF) / static_cast<double>(65535); + result.w = static_cast<double>((color >> 0) & 0xFFFF) / static_cast<double>(65535); + return result; + } +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/color_space.hpp b/include/gal/opengl/glm/gtx/color_space.hpp new file mode 100644 index 0000000..f144378 --- /dev/null +++ b/include/gal/opengl/glm/gtx/color_space.hpp @@ -0,0 +1,96 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_color_space +/// @file glm/gtx/color_space.hpp +/// @date 2005-12-21 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// +/// @defgroup gtx_color_space GLM_GTX_color_space +/// @ingroup gtx +/// +/// @brief Related to RGB to HSV conversions and operations. +/// +/// <glm/gtx/color_space.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_color_space +#define GLM_GTX_color_space GLM_VERSION + +// Dependency: +#include "../glm.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_color_space extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_color_space + /// @{ + + /// Converts a color from HSV color space to its color in RGB color space. + /// @see gtx_color_space + template <typename valType> + detail::tvec3<valType> rgbColor( + detail::tvec3<valType> const & hsvValue); + + /// Converts a color from RGB color space to its color in HSV color space. + /// @see gtx_color_space + template <typename valType> + detail::tvec3<valType> hsvColor( + detail::tvec3<valType> const & rgbValue); + + /// Build a saturation matrix. + /// @see gtx_color_space + template <typename valType> + detail::tmat4x4<valType> saturation( + valType const s); + + /// Modify the saturation of a color. + /// @see gtx_color_space + template <typename valType> + detail::tvec3<valType> saturation( + valType const s, + detail::tvec3<valType> const & color); + + /// Modify the saturation of a color. + /// @see gtx_color_space + template <typename valType> + detail::tvec4<valType> saturation( + valType const s, + detail::tvec4<valType> const & color); + + /// Compute color luminosity associating ratios (0.33, 0.59, 0.11) to RGB canals. + /// @see gtx_color_space + template <typename valType> + valType luminosity( + detail::tvec3<valType> const & color); + + /// @} +}//namespace glm + +#include "color_space.inl" + +#endif//GLM_GTX_color_space diff --git a/include/gal/opengl/glm/gtx/color_space.inl b/include/gal/opengl/glm/gtx/color_space.inl new file mode 100644 index 0000000..15cdc35 --- /dev/null +++ b/include/gal/opengl/glm/gtx/color_space.inl @@ -0,0 +1,149 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2005-12-21 +// Updated : 2007-02-22 +// Licence : This source is under MIT License +// File : glm/gtx/color_space.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> rgbColor(const detail::tvec3<T>& hsvColor) + { + detail::tvec3<T> hsv = hsvColor; + detail::tvec3<T> rgbColor; + + if(hsv.y == T(0)) + // achromatic (grey) + rgbColor = detail::tvec3<T>(hsv.z); + else + { + T sector = floor(hsv.x / T(60)); + T frac = (hsv.x / T(60)) - sector; + // factorial part of h + T o = hsv.z * (T(1) - hsv.y); + T p = hsv.z * (T(1) - hsv.y * frac); + T q = hsv.z * (T(1) - hsv.y * (T(1) - frac)); + + switch(int(sector)) + { + default: + case 0: + rgbColor.r = hsv.z; + rgbColor.g = q; + rgbColor.b = o; + break; + case 1: + rgbColor.r = p; + rgbColor.g = hsv.z; + rgbColor.b = o; + break; + case 2: + rgbColor.r = o; + rgbColor.g = hsv.z; + rgbColor.b = q; + break; + case 3: + rgbColor.r = o; + rgbColor.g = p; + rgbColor.b = hsv.z; + break; + case 4: + rgbColor.r = q; + rgbColor.g = o; + rgbColor.b = hsv.z; + break; + case 5: + rgbColor.r = hsv.z; + rgbColor.g = o; + rgbColor.b = p; + break; + } + } + + return rgbColor; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> hsvColor(const detail::tvec3<T>& rgbColor) + { + detail::tvec3<T> hsv = rgbColor; + float Min = min(min(rgbColor.r, rgbColor.g), rgbColor.b); + float Max = max(max(rgbColor.r, rgbColor.g), rgbColor.b); + float Delta = Max - Min; + + hsv.z = Max; + + if(Max != T(0)) + { + hsv.y = Delta / hsv.z; + T h = T(0); + + if(rgbColor.r == Max) + // between yellow & magenta + h = T(0) + T(60) * (rgbColor.g - rgbColor.b) / Delta; + else if(rgbColor.g == Max) + // between cyan & yellow + h = T(120) + T(60) * (rgbColor.b - rgbColor.r) / Delta; + else + // between magenta & cyan + h = T(240) + T(60) * (rgbColor.r - rgbColor.g) / Delta; + + if(h < T(0)) + hsv.x = h + T(360); + else + hsv.x = h; + } + else + { + // If r = g = b = 0 then s = 0, h is undefined + hsv.y = T(0); + hsv.x = T(0); + } + + return hsv; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> saturation(const T s) + { + detail::tvec3<T> rgbw = detail::tvec3<T>(T(0.2126), T(0.7152), T(0.0722)); + + T col0 = (T(1) - s) * rgbw.r; + T col1 = (T(1) - s) * rgbw.g; + T col2 = (T(1) - s) * rgbw.b; + + detail::tmat4x4<T> result(T(1)); + result[0][0] = col0 + s; + result[0][1] = col0; + result[0][2] = col0; + result[1][0] = col1; + result[1][1] = col1 + s; + result[1][2] = col1; + result[2][0] = col2; + result[2][1] = col2; + result[2][2] = col2 + s; + return result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> saturation(const T s, const detail::tvec3<T>& color) + { + return detail::tvec3<T>(saturation(s) * detail::tvec4<T>(color, T(0))); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec4<T> saturation(const T s, const detail::tvec4<T>& color) + { + return saturation(s) * color; + } + + template <typename T> + GLM_FUNC_QUALIFIER T luminosity(const detail::tvec3<T>& color) + { + const detail::tvec3<T> tmp = detail::tvec3<T>(0.33, 0.59, 0.11); + return dot(color, tmp); + } +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/color_space_YCoCg.hpp b/include/gal/opengl/glm/gtx/color_space_YCoCg.hpp new file mode 100644 index 0000000..8ca4b10 --- /dev/null +++ b/include/gal/opengl/glm/gtx/color_space_YCoCg.hpp @@ -0,0 +1,84 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_color_space_YCoCg +/// @file glm/gtx/color_space_YCoCg.hpp +/// @date 2008-10-28 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// +/// @defgroup gtx_color_space_YCoCg GLM_GTX_color_space_YCoCg +/// @ingroup gtx +/// +/// @brief RGB to YCoCg conversions and operations +/// +/// <glm/gtx/color_space_YCoCg.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef glm_gtx_color_space_YCoCg +#define glm_gtx_color_space_YCoCg GLM_VERSION + +// Dependency: +#include "../glm.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_color_space_YCoCg extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_color_space_YCoCg + /// @{ + + /// Convert a color from RGB color space to YCoCg color space. + /// @see gtx_color_space_YCoCg + template <typename valType> + detail::tvec3<valType> rgb2YCoCg( + detail::tvec3<valType> const & rgbColor); + + /// Convert a color from YCoCg color space to RGB color space. + /// @see gtx_color_space_YCoCg + template <typename valType> + detail::tvec3<valType> YCoCg2rgb( + detail::tvec3<valType> const & YCoCgColor); + + /// Convert a color from RGB color space to YCoCgR color space. + /// @see "YCoCg-R: A Color Space with RGB Reversibility and Low Dynamic Range" + /// @see gtx_color_space_YCoCg + template <typename valType> + detail::tvec3<valType> rgb2YCoCgR( + detail::tvec3<valType> const & rgbColor); + + /// Convert a color from YCoCgR color space to RGB color space. + /// @see "YCoCg-R: A Color Space with RGB Reversibility and Low Dynamic Range" + /// @see gtx_color_space_YCoCg + template <typename valType> + detail::tvec3<valType> YCoCgR2rgb( + detail::tvec3<valType> const & YCoCgColor); + + /// @} +}//namespace glm + +#include "color_space_YCoCg.inl" + +#endif//glm_gtx_color_space_YCoCg diff --git a/include/gal/opengl/glm/gtx/color_space_YCoCg.inl b/include/gal/opengl/glm/gtx/color_space_YCoCg.inl new file mode 100644 index 0000000..08d8440 --- /dev/null +++ b/include/gal/opengl/glm/gtx/color_space_YCoCg.inl @@ -0,0 +1,64 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2008-10-28 +// Updated : 2008-10-28 +// Licence : This source is under MIT License +// File : glm/gtx/color_space_YCoCg.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec3<valType> rgb2YCoCg + ( + detail::tvec3<valType> const & rgbColor + ) + { + detail::tvec3<valType> result; + result.x/*Y */ = rgbColor.r / valType(4) + rgbColor.g / valType(2) + rgbColor.b / valType(4); + result.y/*Co*/ = rgbColor.r / valType(2) + rgbColor.g * valType(0) - rgbColor.b / valType(2); + result.z/*Cg*/ = - rgbColor.r / valType(4) + rgbColor.g / valType(2) - rgbColor.b / valType(4); + return result; + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec3<valType> rgb2YCoCgR + ( + detail::tvec3<valType> const & rgbColor + ) + { + detail::tvec3<valType> result; + result.x/*Y */ = rgbColor.g / valType(2) + (rgbColor.r + rgbColor.b) / valType(4); + result.y/*Co*/ = rgbColor.r - rgbColor.b; + result.z/*Cg*/ = rgbColor.g - (rgbColor.r + rgbColor.b) / valType(2); + return result; + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec3<valType> YCoCg2rgb + ( + detail::tvec3<valType> const & YCoCgColor + ) + { + detail::tvec3<valType> result; + result.r = YCoCgColor.x + YCoCgColor.y - YCoCgColor.z; + result.g = YCoCgColor.x + YCoCgColor.z; + result.b = YCoCgColor.x - YCoCgColor.y - YCoCgColor.z; + return result; + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec3<valType> YCoCgR2rgb + ( + detail::tvec3<valType> const & YCoCgRColor + ) + { + detail::tvec3<valType> result; + valType tmp = YCoCgRColor.x - (YCoCgRColor.z / valType(2)); + result.g = YCoCgRColor.z + tmp; + result.b = tmp - (YCoCgRColor.y / valType(2)); + result.r = result.b + YCoCgRColor.y; + return result; + } +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/compatibility.hpp b/include/gal/opengl/glm/gtx/compatibility.hpp new file mode 100644 index 0000000..c394a43 --- /dev/null +++ b/include/gal/opengl/glm/gtx/compatibility.hpp @@ -0,0 +1,176 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_compatibility +/// @file glm/gtx/compatibility.hpp +/// @date 2007-01-24 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// @see gtc_half_float (dependence) +/// +/// @defgroup gtx_compatibility GLM_GTX_compatibility +/// @ingroup gtx +/// +/// @brief Provide functions to increase the compatibility with Cg and HLSL languages +/// +/// <glm/gtx/compatibility.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_compatibility +#define GLM_GTX_compatibility GLM_VERSION + +// Dependency: +#include "../glm.hpp" +#include "../gtc/half_float.hpp" +#include "../gtc/quaternion.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_compatibility extension included") +#endif + +#if(GLM_COMPILER & GLM_COMPILER_VC) +# include <cfloat> +#elif(GLM_COMPILER & GLM_COMPILER_GCC) +# include <cmath> +# if(GLM_PLATFORM & GLM_PLATFORM_ANDROID) +# undef isfinite +# endif +#endif//GLM_COMPILER + +namespace glm +{ + /// @addtogroup gtx_compatibility + /// @{ + + template <typename T> GLM_FUNC_QUALIFIER T lerp(T x, T y, T a){return mix(x, y, a);} //!< \brief Returns x * (1.0 - a) + y * a, i.e., the linear blend of x and y using the floating-point value a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) + template <typename T> GLM_FUNC_QUALIFIER detail::tvec2<T> lerp(const detail::tvec2<T>& x, const detail::tvec2<T>& y, T a){return mix(x, y, a);} //!< \brief Returns x * (1.0 - a) + y * a, i.e., the linear blend of x and y using the floating-point value a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) + template <typename T> GLM_FUNC_QUALIFIER detail::tvec3<T> lerp(const detail::tvec3<T>& x, const detail::tvec3<T>& y, T a){return mix(x, y, a);} //!< \brief Returns x * (1.0 - a) + y * a, i.e., the linear blend of x and y using the floating-point value a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) + template <typename T> GLM_FUNC_QUALIFIER detail::tvec4<T> lerp(const detail::tvec4<T>& x, const detail::tvec4<T>& y, T a){return mix(x, y, a);} //!< \brief Returns x * (1.0 - a) + y * a, i.e., the linear blend of x and y using the floating-point value a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) + template <typename T> GLM_FUNC_QUALIFIER detail::tvec2<T> lerp(const detail::tvec2<T>& x, const detail::tvec2<T>& y, const detail::tvec2<T>& a){return mix(x, y, a);} //!< \brief Returns the component-wise result of x * (1.0 - a) + y * a, i.e., the linear blend of x and y using vector a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) + template <typename T> GLM_FUNC_QUALIFIER detail::tvec3<T> lerp(const detail::tvec3<T>& x, const detail::tvec3<T>& y, const detail::tvec3<T>& a){return mix(x, y, a);} //!< \brief Returns the component-wise result of x * (1.0 - a) + y * a, i.e., the linear blend of x and y using vector a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) + template <typename T> GLM_FUNC_QUALIFIER detail::tvec4<T> lerp(const detail::tvec4<T>& x, const detail::tvec4<T>& y, const detail::tvec4<T>& a){return mix(x, y, a);} //!< \brief Returns the component-wise result of x * (1.0 - a) + y * a, i.e., the linear blend of x and y using vector a. The value for a is not restricted to the range [0, 1]. (From GLM_GTX_compatibility) + + template <typename T> GLM_FUNC_QUALIFIER T slerp(detail::tquat<T> const & x, detail::tquat<T> const & y, T const & a){return mix(x, y, a);} //!< \brief Returns the slurp interpolation between two quaternions. + + template <typename T> GLM_FUNC_QUALIFIER T saturate(T x){return clamp(x, T(0), T(1));} //!< \brief Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility) + template <typename T> GLM_FUNC_QUALIFIER detail::tvec2<T> saturate(const detail::tvec2<T>& x){return clamp(x, T(0), T(1));} //!< \brief Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility) + template <typename T> GLM_FUNC_QUALIFIER detail::tvec3<T> saturate(const detail::tvec3<T>& x){return clamp(x, T(0), T(1));} //!< \brief Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility) + template <typename T> GLM_FUNC_QUALIFIER detail::tvec4<T> saturate(const detail::tvec4<T>& x){return clamp(x, T(0), T(1));} //!< \brief Returns clamp(x, 0, 1) for each component in x. (From GLM_GTX_compatibility) + + template <typename T> GLM_FUNC_QUALIFIER T atan2(T x, T y){return atan(x, y);} //!< \brief Arc tangent. Returns an angle whose tangent is y/x. The signs of x and y are used to determine what quadrant the angle is in. The range of values returned by this function is [-PI, PI]. Results are undefined if x and y are both 0. (From GLM_GTX_compatibility) + template <typename T> GLM_FUNC_QUALIFIER detail::tvec2<T> atan2(const detail::tvec2<T>& x, const detail::tvec2<T>& y){return atan(x, y);} //!< \brief Arc tangent. Returns an angle whose tangent is y/x. The signs of x and y are used to determine what quadrant the angle is in. The range of values returned by this function is [-PI, PI]. Results are undefined if x and y are both 0. (From GLM_GTX_compatibility) + template <typename T> GLM_FUNC_QUALIFIER detail::tvec3<T> atan2(const detail::tvec3<T>& x, const detail::tvec3<T>& y){return atan(x, y);} //!< \brief Arc tangent. Returns an angle whose tangent is y/x. The signs of x and y are used to determine what quadrant the angle is in. The range of values returned by this function is [-PI, PI]. Results are undefined if x and y are both 0. (From GLM_GTX_compatibility) + template <typename T> GLM_FUNC_QUALIFIER detail::tvec4<T> atan2(const detail::tvec4<T>& x, const detail::tvec4<T>& y){return atan(x, y);} //!< \brief Arc tangent. Returns an angle whose tangent is y/x. The signs of x and y are used to determine what quadrant the angle is in. The range of values returned by this function is [-PI, PI]. Results are undefined if x and y are both 0. (From GLM_GTX_compatibility) + + template <typename genType> bool isfinite(genType const & x); //!< \brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility) + template <typename valType> detail::tvec2<bool> isfinite(const detail::tvec2<valType>& x); //!< \brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility) + template <typename valType> detail::tvec3<bool> isfinite(const detail::tvec3<valType>& x); //!< \brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility) + template <typename valType> detail::tvec4<bool> isfinite(const detail::tvec4<valType>& x); //!< \brief Test whether or not a scalar or each vector component is a finite value. (From GLM_GTX_compatibility) + + typedef bool bool1; //!< \brief boolean type with 1 component. (From GLM_GTX_compatibility extension) + typedef detail::tvec2<bool> bool2; //!< \brief boolean type with 2 components. (From GLM_GTX_compatibility extension) + typedef detail::tvec3<bool> bool3; //!< \brief boolean type with 3 components. (From GLM_GTX_compatibility extension) + typedef detail::tvec4<bool> bool4; //!< \brief boolean type with 4 components. (From GLM_GTX_compatibility extension) + + typedef bool bool1x1; //!< \brief boolean matrix with 1 x 1 component. (From GLM_GTX_compatibility extension) + typedef detail::tmat2x2<bool> bool2x2; //!< \brief boolean matrix with 2 x 2 components. (From GLM_GTX_compatibility extension) + typedef detail::tmat2x3<bool> bool2x3; //!< \brief boolean matrix with 2 x 3 components. (From GLM_GTX_compatibility extension) + typedef detail::tmat2x4<bool> bool2x4; //!< \brief boolean matrix with 2 x 4 components. (From GLM_GTX_compatibility extension) + typedef detail::tmat3x2<bool> bool3x2; //!< \brief boolean matrix with 3 x 2 components. (From GLM_GTX_compatibility extension) + typedef detail::tmat3x3<bool> bool3x3; //!< \brief boolean matrix with 3 x 3 components. (From GLM_GTX_compatibility extension) + typedef detail::tmat3x4<bool> bool3x4; //!< \brief boolean matrix with 3 x 4 components. (From GLM_GTX_compatibility extension) + typedef detail::tmat4x2<bool> bool4x2; //!< \brief boolean matrix with 4 x 2 components. (From GLM_GTX_compatibility extension) + typedef detail::tmat4x3<bool> bool4x3; //!< \brief boolean matrix with 4 x 3 components. (From GLM_GTX_compatibility extension) + typedef detail::tmat4x4<bool> bool4x4; //!< \brief boolean matrix with 4 x 4 components. (From GLM_GTX_compatibility extension) + + typedef int int1; //!< \brief integer vector with 1 component. (From GLM_GTX_compatibility extension) + typedef detail::tvec2<int> int2; //!< \brief integer vector with 2 components. (From GLM_GTX_compatibility extension) + typedef detail::tvec3<int> int3; //!< \brief integer vector with 3 components. (From GLM_GTX_compatibility extension) + typedef detail::tvec4<int> int4; //!< \brief integer vector with 4 components. (From GLM_GTX_compatibility extension) + + typedef int int1x1; //!< \brief integer matrix with 1 component. (From GLM_GTX_compatibility extension) + typedef detail::tmat2x2<int> int2x2; //!< \brief integer matrix with 2 x 2 components. (From GLM_GTX_compatibility extension) + typedef detail::tmat2x3<int> int2x3; //!< \brief integer matrix with 2 x 3 components. (From GLM_GTX_compatibility extension) + typedef detail::tmat2x4<int> int2x4; //!< \brief integer matrix with 2 x 4 components. (From GLM_GTX_compatibility extension) + typedef detail::tmat3x2<int> int3x2; //!< \brief integer matrix with 3 x 2 components. (From GLM_GTX_compatibility extension) + typedef detail::tmat3x3<int> int3x3; //!< \brief integer matrix with 3 x 3 components. (From GLM_GTX_compatibility extension) + typedef detail::tmat3x4<int> int3x4; //!< \brief integer matrix with 3 x 4 components. (From GLM_GTX_compatibility extension) + typedef detail::tmat4x2<int> int4x2; //!< \brief integer matrix with 4 x 2 components. (From GLM_GTX_compatibility extension) + typedef detail::tmat4x3<int> int4x3; //!< \brief integer matrix with 4 x 3 components. (From GLM_GTX_compatibility extension) + typedef detail::tmat4x4<int> int4x4; //!< \brief integer matrix with 4 x 4 components. (From GLM_GTX_compatibility extension) + + typedef detail::half half1; //!< \brief half-precision floating-point vector with 1 component. (From GLM_GTX_compatibility extension) + typedef detail::tvec2<detail::half> half2; //!< \brief half-precision floating-point vector with 2 components. (From GLM_GTX_compatibility extension) + typedef detail::tvec3<detail::half> half3; //!< \brief half-precision floating-point vector with 2 components. (From GLM_GTX_compatibility extension) + typedef detail::tvec4<detail::half> half4; //!< \brief half-precision floating-point vector with 2 components. (From GLM_GTX_compatibility extension) + + typedef detail::half half1x1; //!< \brief half-precision floating-point matrix with 1 component. (From GLM_GTX_compatibility extension) + typedef detail::tmat2x2<detail::half> half2x2; //!< \brief half-precision floating-point matrix with 2 x 2 components. (From GLM_GTX_compatibility extension) + typedef detail::tmat2x3<detail::half> half2x3; //!< \brief half-precision floating-point matrix with 2 x 3 components. (From GLM_GTX_compatibility extension) + typedef detail::tmat2x4<detail::half> half2x4; //!< \brief half-precision floating-point matrix with 2 x 4 components. (From GLM_GTX_compatibility extension) + typedef detail::tmat3x2<detail::half> half3x2; //!< \brief half-precision floating-point matrix with 3 x 2 components. (From GLM_GTX_compatibility extension) + typedef detail::tmat3x3<detail::half> half3x3; //!< \brief half-precision floating-point matrix with 3 x 3 components. (From GLM_GTX_compatibility extension) + typedef detail::tmat3x4<detail::half> half3x4; //!< \brief half-precision floating-point matrix with 3 x 3 components. (From GLM_GTX_compatibility extension) + typedef detail::tmat4x2<detail::half> half4x2; //!< \brief half-precision floating-point matrix with 4 x 2 components. (From GLM_GTX_compatibility extension) + typedef detail::tmat4x3<detail::half> half4x3; //!< \brief half-precision floating-point matrix with 4 x 3 components. (From GLM_GTX_compatibility extension) + typedef detail::tmat4x4<detail::half> half4x4; //!< \brief half-precision floating-point matrix with 4 x 4 components. (From GLM_GTX_compatibility extension) + + typedef float float1; //!< \brief single-precision floating-point vector with 1 component. (From GLM_GTX_compatibility extension) + typedef detail::tvec2<float> float2; //!< \brief single-precision floating-point vector with 2 components. (From GLM_GTX_compatibility extension) + typedef detail::tvec3<float> float3; //!< \brief single-precision floating-point vector with 3 components. (From GLM_GTX_compatibility extension) + typedef detail::tvec4<float> float4; //!< \brief single-precision floating-point vector with 4 components. (From GLM_GTX_compatibility extension) + + typedef float float1x1; //!< \brief single-precision floating-point matrix with 1 component. (From GLM_GTX_compatibility extension) + typedef detail::tmat2x2<float> float2x2; //!< \brief single-precision floating-point matrix with 2 x 2 components. (From GLM_GTX_compatibility extension) + typedef detail::tmat2x3<float> float2x3; //!< \brief single-precision floating-point matrix with 2 x 3 components. (From GLM_GTX_compatibility extension) + typedef detail::tmat2x4<float> float2x4; //!< \brief single-precision floating-point matrix with 2 x 4 components. (From GLM_GTX_compatibility extension) + typedef detail::tmat3x2<float> float3x2; //!< \brief single-precision floating-point matrix with 3 x 2 components. (From GLM_GTX_compatibility extension) + typedef detail::tmat3x3<float> float3x3; //!< \brief single-precision floating-point matrix with 3 x 3 components. (From GLM_GTX_compatibility extension) + typedef detail::tmat3x4<float> float3x4; //!< \brief single-precision floating-point matrix with 3 x 4 components. (From GLM_GTX_compatibility extension) + typedef detail::tmat4x2<float> float4x2; //!< \brief single-precision floating-point matrix with 4 x 2 components. (From GLM_GTX_compatibility extension) + typedef detail::tmat4x3<float> float4x3; //!< \brief single-precision floating-point matrix with 4 x 3 components. (From GLM_GTX_compatibility extension) + typedef detail::tmat4x4<float> float4x4; //!< \brief single-precision floating-point matrix with 4 x 4 components. (From GLM_GTX_compatibility extension) + + typedef double double1; //!< \brief double-precision floating-point vector with 1 component. (From GLM_GTX_compatibility extension) + typedef detail::tvec2<double> double2; //!< \brief double-precision floating-point vector with 2 components. (From GLM_GTX_compatibility extension) + typedef detail::tvec3<double> double3; //!< \brief double-precision floating-point vector with 3 components. (From GLM_GTX_compatibility extension) + typedef detail::tvec4<double> double4; //!< \brief double-precision floating-point vector with 4 components. (From GLM_GTX_compatibility extension) + + typedef double double1x1; //!< \brief double-precision floating-point matrix with 1 component. (From GLM_GTX_compatibility extension) + typedef detail::tmat2x2<double> double2x2; //!< \brief double-precision floating-point matrix with 2 x 2 components. (From GLM_GTX_compatibility extension) + typedef detail::tmat2x3<double> double2x3; //!< \brief double-precision floating-point matrix with 2 x 3 components. (From GLM_GTX_compatibility extension) + typedef detail::tmat2x4<double> double2x4; //!< \brief double-precision floating-point matrix with 2 x 4 components. (From GLM_GTX_compatibility extension) + typedef detail::tmat3x2<double> double3x2; //!< \brief double-precision floating-point matrix with 3 x 2 components. (From GLM_GTX_compatibility extension) + typedef detail::tmat3x3<double> double3x3; //!< \brief double-precision floating-point matrix with 3 x 3 components. (From GLM_GTX_compatibility extension) + typedef detail::tmat3x4<double> double3x4; //!< \brief double-precision floating-point matrix with 3 x 4 components. (From GLM_GTX_compatibility extension) + typedef detail::tmat4x2<double> double4x2; //!< \brief double-precision floating-point matrix with 4 x 2 components. (From GLM_GTX_compatibility extension) + typedef detail::tmat4x3<double> double4x3; //!< \brief double-precision floating-point matrix with 4 x 3 components. (From GLM_GTX_compatibility extension) + typedef detail::tmat4x4<double> double4x4; //!< \brief double-precision floating-point matrix with 4 x 4 components. (From GLM_GTX_compatibility extension) + + /// @} +}//namespace glm + +#include "compatibility.inl" + +#endif//GLM_GTX_compatibility + diff --git a/include/gal/opengl/glm/gtx/compatibility.inl b/include/gal/opengl/glm/gtx/compatibility.inl new file mode 100644 index 0000000..073c694 --- /dev/null +++ b/include/gal/opengl/glm/gtx/compatibility.inl @@ -0,0 +1,60 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2007-03-16 +// Updated : 2008-10-24 +// Licence : This source is under MIT License +// File : glm/gtx/compatibility.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + // isfinite + template <typename genType> + GLM_FUNC_QUALIFIER bool isfinite( + genType const & x) + { +# if(GLM_COMPILER & GLM_COMPILER_VC) + return _finite(x); +# elif(GLM_COMPILER & GLM_COMPILER_GCC) +# if(GLM_PLATFORM & GLM_PLATFORM_ANDROID) + return _isfinite(x) != 0; +# else + return std::isfinite(x) != 0; +# endif +# else + return std::isfinite(x) != 0; +# endif + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec2<bool> isfinite( + detail::tvec2<valType> const & x) + { + return detail::tvec2<bool>( + isfinite(x.x), + isfinite(x.y)); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec3<bool> isfinite( + detail::tvec3<valType> const & x) + { + return detail::tvec3<bool>( + isfinite(x.x), + isfinite(x.y), + isfinite(x.z)); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec4<bool> isfinite( + detail::tvec4<valType> const & x) + { + return detail::tvec4<bool>( + isfinite(x.x), + isfinite(x.y), + isfinite(x.z), + isfinite(x.w)); + } + +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/component_wise.hpp b/include/gal/opengl/glm/gtx/component_wise.hpp new file mode 100644 index 0000000..d3274be --- /dev/null +++ b/include/gal/opengl/glm/gtx/component_wise.hpp @@ -0,0 +1,82 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_component_wise +/// @file glm/gtx/component_wise.hpp +/// @date 2007-05-21 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// +/// @defgroup gtx_component_wise GLM_GTX_component_wise +/// @ingroup gtx +/// +/// @brief Operations between components of a type +/// +/// <glm/gtx/component_wise.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_component_wise +#define GLM_GTX_component_wise GLM_VERSION + +// Dependency: +#include "../glm.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_component_wise extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_component_wise + /// @{ + + /// Add all vector components together. + /// @see gtx_component_wise + template <typename genType> + typename genType::value_type compAdd( + genType const & v); + + /// Multiply all vector components together. + /// @see gtx_component_wise + template <typename genType> + typename genType::value_type compMul( + genType const & v); + + /// Find the minimum value between single vector components. + /// @see gtx_component_wise + template <typename genType> + typename genType::value_type compMin( + genType const & v); + + /// Find the maximum value between single vector components. + /// @see gtx_component_wise + template <typename genType> + typename genType::value_type compMax( + genType const & v); + + /// @} +}//namespace glm + +#include "component_wise.inl" + +#endif//GLM_GTX_component_wise diff --git a/include/gal/opengl/glm/gtx/component_wise.inl b/include/gal/opengl/glm/gtx/component_wise.inl new file mode 100644 index 0000000..8baea62 --- /dev/null +++ b/include/gal/opengl/glm/gtx/component_wise.inl @@ -0,0 +1,47 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2007-05-21 +// Updated : 2010-02-12 +// Licence : This source is under MIT License +// File : gtx_component_wise.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template <typename genType> + GLM_FUNC_QUALIFIER typename genType::value_type compAdd(genType const & v) + { + typename genType::value_type result = typename genType::value_type(0); + for(typename genType::size_type i = 0; i < v.length(); ++i) + result += v[i]; + return result; + } + + template <typename genType> + GLM_FUNC_QUALIFIER typename genType::value_type compMul(genType const & v) + { + typename genType::value_type result = typename genType::value_type(1); + for(typename genType::size_type i = 0; i < v.length(); ++i) + result *= v[i]; + return result; + } + + template <typename genType> + GLM_FUNC_QUALIFIER typename genType::value_type compMin(genType const & v) + { + typename genType::value_type result = typename genType::value_type(v[0]); + for(typename genType::size_type i = 1; i < v.length(); ++i) + result = min(result, v[i]); + return result; + } + + template <typename genType> + GLM_FUNC_QUALIFIER typename genType::value_type compMax(genType const & v) + { + typename genType::value_type result = typename genType::value_type(v[0]); + for(typename genType::size_type i = 1; i < v.length(); ++i) + result = max(result, v[i]); + return result; + } +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/constants.hpp b/include/gal/opengl/glm/gtx/constants.hpp new file mode 100644 index 0000000..78356ff --- /dev/null +++ b/include/gal/opengl/glm/gtx/constants.hpp @@ -0,0 +1,33 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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 GLM_GTX_constants +#define GLM_GTX_constants GLM_VERSION + +#include "../gtc/constants.hpp" + +#if(defined(GLM_MESSAGES)) +# pragma message("GLM: GLM_GTX_constants extension is deprecated, include GLM_GTC_constants (glm/gtc/constants.hpp) instead") +#endif + +#endif//GLM_GTX_constants diff --git a/include/gal/opengl/glm/gtx/epsilon.hpp b/include/gal/opengl/glm/gtx/epsilon.hpp new file mode 100644 index 0000000..9cb91cb --- /dev/null +++ b/include/gal/opengl/glm/gtx/epsilon.hpp @@ -0,0 +1,29 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/////////////////////////////////////////////////////////////////////////////////// + +#if(defined(GLM_MESSAGES)) +# pragma message("GLM: GLM_GTX_epsilon extension is deprecated, include GLM_GTC_epsilon (glm/gtc/epsilon) instead") +#endif + +// Promoted: +#include "../gtc/epsilon.hpp" diff --git a/include/gal/opengl/glm/gtx/euler_angles.hpp b/include/gal/opengl/glm/gtx/euler_angles.hpp new file mode 100644 index 0000000..ab04042 --- /dev/null +++ b/include/gal/opengl/glm/gtx/euler_angles.hpp @@ -0,0 +1,156 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_euler_angles +/// @file glm/gtx/euler_angles.hpp +/// @date 2005-12-21 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// @see gtc_half_float (dependence) +/// +/// @defgroup gtx_euler_angles GLM_GTX_euler_angles +/// @ingroup gtx +/// +/// @brief Build matrices from Euler angles. +/// +/// <glm/gtx/euler_angles.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_euler_angles +#define GLM_GTX_euler_angles GLM_VERSION + +// Dependency: +#include "../glm.hpp" +#include "../gtc/half_float.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_euler_angles extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_euler_angles + /// @{ + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from an euler angle X. + /// @see gtx_euler_angles + template <typename valType> + detail::tmat4x4<valType> eulerAngleX( + valType const & angleX); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from an euler angle Y. + /// @see gtx_euler_angles + template <typename valType> + detail::tmat4x4<valType> eulerAngleY( + valType const & angleY); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from an euler angle Z. + /// @see gtx_euler_angles + template <typename valType> + detail::tmat4x4<valType> eulerAngleZ( + valType const & angleZ); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Y). + /// @see gtx_euler_angles + template <typename valType> + detail::tmat4x4<valType> eulerAngleXY( + valType const & angleX, + valType const & angleY); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X). + /// @see gtx_euler_angles + template <typename valType> + detail::tmat4x4<valType> eulerAngleYX( + valType const & angleY, + valType const & angleX); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (X * Z). + /// @see gtx_euler_angles + template <typename valType> + detail::tmat4x4<valType> eulerAngleXZ( + valType const & angleX, + valType const & angleZ); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Z * X). + /// @see gtx_euler_angles + template <typename valType> + detail::tmat4x4<valType> eulerAngleZX( + valType const & angleZ, + valType const & angleX); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * Z). + /// @see gtx_euler_angles + template <typename valType> + detail::tmat4x4<valType> eulerAngleYZ( + valType const & angleY, + valType const & angleZ); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Z * Y). + /// @see gtx_euler_angles + template <typename valType> + detail::tmat4x4<valType> eulerAngleZY( + valType const & angleZ, + valType const & angleY); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X * Z). + /// @see gtx_euler_angles + template <typename valType> + detail::tmat4x4<valType> eulerAngleYXZ( + valType const & yaw, + valType const & pitch, + valType const & roll); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X * Z). + /// @see gtx_euler_angles + template <typename valType> + detail::tmat4x4<valType> yawPitchRoll( + valType const & yaw, + valType const & pitch, + valType const & roll); + + /// Creates a 2D 2 * 2 rotation matrix from an euler angle. + /// @see gtx_euler_angles + template <typename T> + detail::tmat2x2<T> orientate2(T const & angle); + + /// Creates a 2D 4 * 4 homogeneous rotation matrix from an euler angle. + /// @see gtx_euler_angles + template <typename T> + detail::tmat3x3<T> orientate3(T const & angle); + + /// Creates a 3D 3 * 3 rotation matrix from euler angles (Y * X * Z). + /// @see gtx_euler_angles + template <typename T> + detail::tmat3x3<T> orientate3(detail::tvec3<T> const & angles); + + /// Creates a 3D 4 * 4 homogeneous rotation matrix from euler angles (Y * X * Z). + /// @see gtx_euler_angles + template <typename T> + detail::tmat4x4<T> orientate4(detail::tvec3<T> const & angles); + + /// @} +}//namespace glm + +#include "euler_angles.inl" + +#endif//GLM_GTX_euler_angles diff --git a/include/gal/opengl/glm/gtx/euler_angles.inl b/include/gal/opengl/glm/gtx/euler_angles.inl new file mode 100644 index 0000000..a6ca0ab --- /dev/null +++ b/include/gal/opengl/glm/gtx/euler_angles.inl @@ -0,0 +1,244 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2005-12-21 +// Updated : 2007-08-14 +// Licence : This source is under MIT License +// File : glm/gtx/euler_angles.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template <typename valType> + GLM_FUNC_QUALIFIER detail::tmat4x4<valType> eulerAngleX + ( + valType const & angleX + ) + { + valType cosX = glm::cos(angleX); + valType sinX = glm::sin(angleX); + + return detail::tmat4x4<valType>( + valType(1), valType(0), valType(0), valType(0), + valType(0), cosX, sinX, valType(0), + valType(0),-sinX, cosX, valType(0), + valType(0), valType(0), valType(0), valType(1)); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tmat4x4<valType> eulerAngleY + ( + valType const & angleY + ) + { + valType cosY = glm::cos(angleY); + valType sinY = glm::sin(angleY); + + return detail::tmat4x4<valType>( + cosY, valType(0),-sinY, valType(0), + valType(0), valType(1), valType(0), valType(0), + sinY, valType(0), cosY, valType(0), + valType(0), valType(0), valType(0), valType(1)); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tmat4x4<valType> eulerAngleZ + ( + valType const & angleZ + ) + { + valType cosZ = glm::cos(angleZ); + valType sinZ = glm::sin(angleZ); + + return detail::tmat4x4<valType>( + cosZ, sinZ, valType(0), valType(0), + -sinZ, cosZ, valType(0), valType(0), + valType(0), valType(0), valType(1), valType(0), + valType(0), valType(0), valType(0), valType(1)); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tmat4x4<valType> eulerAngleXY + ( + valType const & angleX, + valType const & angleY + ) + { + valType cosX = glm::cos(angleX); + valType sinX = glm::sin(angleX); + valType cosY = glm::cos(angleY); + valType sinY = glm::sin(angleY); + + return detail::tmat4x4<valType>( + cosY, -sinX * sinY, cosX * sinY, valType(0), + valType(0), cosX, sinX, valType(0), + -sinY , -sinX * cosY, cosX * cosY, valType(0), + valType(0), valType(0), valType(0), valType(1)); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tmat4x4<valType> eulerAngleYX + ( + valType const & angleY, + valType const & angleX + ) + { + valType cosX = glm::cos(angleX); + valType sinX = glm::sin(angleX); + valType cosY = glm::cos(angleY); + valType sinY = glm::sin(angleY); + + return detail::tmat4x4<valType>( + cosY, valType(0), sinY, valType(0), + -sinX * sinY, cosX, sinX * cosY, valType(0), + -cosX * sinY, -sinX, cosX * cosY, valType(0), + valType(0), valType(0), valType(0), valType(1)); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tmat4x4<valType> eulerAngleXZ + ( + valType const & angleX, + valType const & angleZ + ) + { + return eulerAngleX(angleX) * eulerAngleZ(angleZ); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tmat4x4<valType> eulerAngleZX + ( + valType const & angleZ, + valType const & angleX + ) + { + return eulerAngleZ(angleZ) * eulerAngleX(angleX); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tmat4x4<valType> eulerAngleYXZ + ( + valType const & yaw, + valType const & pitch, + valType const & roll + ) + { + valType tmp_ch = glm::cos(yaw); + valType tmp_sh = glm::sin(yaw); + valType tmp_cp = glm::cos(pitch); + valType tmp_sp = glm::sin(pitch); + valType tmp_cb = glm::cos(roll); + valType tmp_sb = glm::sin(roll); + + detail::tmat4x4<valType> Result; + Result[0][0] = tmp_ch * tmp_cb + tmp_sh * tmp_sp * tmp_sb; + Result[0][1] = tmp_sb * tmp_cp; + Result[0][2] = -tmp_sh * tmp_cb + tmp_ch * tmp_sp * tmp_sb; + Result[0][3] = valType(0); + Result[1][0] = -tmp_ch * tmp_sb + tmp_sh * tmp_sp * tmp_cb; + Result[1][1] = tmp_cb * tmp_cp; + Result[1][2] = tmp_sb * tmp_sh + tmp_ch * tmp_sp * tmp_cb; + Result[1][3] = valType(0); + Result[2][0] = tmp_sh * tmp_cp; + Result[2][1] = -tmp_sp; + Result[2][2] = tmp_ch * tmp_cp; + Result[2][3] = valType(0); + Result[3][0] = valType(0); + Result[3][1] = valType(0); + Result[3][2] = valType(0); + Result[3][3] = valType(1); + return Result; + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tmat4x4<valType> yawPitchRoll + ( + valType const & yaw, + valType const & pitch, + valType const & roll + ) + { + valType tmp_ch = glm::cos(yaw); + valType tmp_sh = glm::sin(yaw); + valType tmp_cp = glm::cos(pitch); + valType tmp_sp = glm::sin(pitch); + valType tmp_cb = glm::cos(roll); + valType tmp_sb = glm::sin(roll); + + detail::tmat4x4<valType> Result; + Result[0][0] = tmp_ch * tmp_cb + tmp_sh * tmp_sp * tmp_sb; + Result[0][1] = tmp_sb * tmp_cp; + Result[0][2] = -tmp_sh * tmp_cb + tmp_ch * tmp_sp * tmp_sb; + Result[0][3] = valType(0); + Result[1][0] = -tmp_ch * tmp_sb + tmp_sh * tmp_sp * tmp_cb; + Result[1][1] = tmp_cb * tmp_cp; + Result[1][2] = tmp_sb * tmp_sh + tmp_ch * tmp_sp * tmp_cb; + Result[1][3] = valType(0); + Result[2][0] = tmp_sh * tmp_cp; + Result[2][1] = -tmp_sp; + Result[2][2] = tmp_ch * tmp_cp; + Result[2][3] = valType(0); + Result[3][0] = valType(0); + Result[3][1] = valType(0); + Result[3][2] = valType(0); + Result[3][3] = valType(1); + return Result; + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tmat2x2<valType> orientate2 + ( + valType const & angle + ) + { + valType c = glm::cos(angle); + valType s = glm::sin(angle); + + detail::tmat2x2<valType> Result; + Result[0][0] = c; + Result[0][1] = s; + Result[1][0] = -s; + Result[1][1] = c; + return Result; + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tmat3x3<valType> orientate3 + ( + valType const & angle + ) + { + valType c = glm::cos(angle); + valType s = glm::sin(angle); + + detail::tmat3x3<valType> Result; + Result[0][0] = c; + Result[0][1] = s; + Result[0][2] = 0.0f; + Result[1][0] = -s; + Result[1][1] = c; + Result[1][2] = 0.0f; + Result[2][0] = 0.0f; + Result[2][1] = 0.0f; + Result[2][2] = 1.0f; + return Result; + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tmat3x3<valType> orientate3 + ( + detail::tvec3<valType> const & angles + ) + { + return detail::tmat3x3<valType>(yawPitchRoll(angles.x, angles.y, angles.z)); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tmat4x4<valType> orientate4 + ( + detail::tvec3<valType> const & angles + ) + { + return yawPitchRoll(angles.z, angles.x, angles.y); + } +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/extend.hpp b/include/gal/opengl/glm/gtx/extend.hpp new file mode 100644 index 0000000..d23beba --- /dev/null +++ b/include/gal/opengl/glm/gtx/extend.hpp @@ -0,0 +1,66 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_extend +/// @file glm/gtx/extend.hpp +/// @date 2006-01-07 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// +/// @defgroup gtx_extend GLM_GTX_extend +/// @ingroup gtx +/// +/// @brief Extend a position from a source to a position at a defined length. +/// +/// <glm/gtx/extend.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_extend +#define GLM_GTX_extend GLM_VERSION + +// Dependency: +#include "../glm.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_extend extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_extend + /// @{ + + /// Extends of Length the Origin position using the (Source - Origin) direction. + /// @see gtx_extend + template <typename genType> + genType extend( + genType const & Origin, + genType const & Source, + typename genType::value_type const Length); + + /// @} +}//namespace glm + +#include "extend.inl" + +#endif//GLM_GTX_extend diff --git a/include/gal/opengl/glm/gtx/extend.inl b/include/gal/opengl/glm/gtx/extend.inl new file mode 100644 index 0000000..9827401 --- /dev/null +++ b/include/gal/opengl/glm/gtx/extend.inl @@ -0,0 +1,55 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2006-01-07 +// Updated : 2008-10-05 +// Licence : This source is under MIT License +// File : glm/gtx/extend.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template <typename genType> + genType extend + ( + genType const & Origin, + genType const & Source, + genType const & Distance + ) + { + return Origin + (Source - Origin) * Distance; + } + + template <typename valType> + detail::tvec2<valType> extend + ( + detail::tvec2<valType> const & Origin, + detail::tvec2<valType> const & Source, + valType const & Distance + ) + { + return Origin + (Source - Origin) * Distance; + } + + template <typename valType> + detail::tvec3<valType> extend + ( + detail::tvec3<valType> const & Origin, + detail::tvec3<valType> const & Source, + valType const & Distance + ) + { + return Origin + (Source - Origin) * Distance; + } + + template <typename valType> + detail::tvec4<valType> extend + ( + detail::tvec4<valType> const & Origin, + detail::tvec4<valType> const & Source, + valType const & Distance + ) + { + return Origin + (Source - Origin) * Distance; + } +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/extented_min_max.hpp b/include/gal/opengl/glm/gtx/extented_min_max.hpp new file mode 100644 index 0000000..c623409 --- /dev/null +++ b/include/gal/opengl/glm/gtx/extented_min_max.hpp @@ -0,0 +1,194 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_extented_min_max +/// @file glm/gtx/extented_min_max.hpp +/// @date 2007-03-14 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// @see gtx_half_float (dependence) +/// +/// @defgroup gtx_extented_min_max GLM_GTX_extented_min_max +/// @ingroup gtx +/// +/// Min and max functions for 3 to 4 parameters. +/// +/// <glm/gtx/extented_min_max.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_extented_min_max +#define GLM_GTX_extented_min_max GLM_VERSION + +// Dependency: +#include "../glm.hpp" +#include "../gtc/half_float.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_extented_min_max extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_extented_min_max + /// @{ + + /// Return the minimum component-wise values of 3 inputs + /// @see gtx_extented_min_max + template <typename T> + T min( + T const & x, + T const & y, + T const & z); + + /// Return the minimum component-wise values of 3 inputs + /// @see gtx_extented_min_max + template + < + typename T, + template <typename> class C + > + C<T> min( + C<T> const & x, + typename C<T>::value_type const & y, + typename C<T>::value_type const & z); + + /// Return the minimum component-wise values of 3 inputs + /// @see gtx_extented_min_max + template + < + typename T, + template <typename> class C + > + C<T> min( + C<T> const & x, + C<T> const & y, + C<T> const & z); + + /// Return the minimum component-wise values of 4 inputs + /// @see gtx_extented_min_max + template <typename T> + T min( + T const & x, + T const & y, + T const & z, + T const & w); + + /// Return the minimum component-wise values of 4 inputs + /// @see gtx_extented_min_max + template + < + typename T, + template <typename> class C + > + C<T> min( + C<T> const & x, + typename C<T>::value_type const & y, + typename C<T>::value_type const & z, + typename C<T>::value_type const & w); + + /// Return the minimum component-wise values of 4 inputs + /// @see gtx_extented_min_max + template + < + typename T, + template <typename> class C + > + C<T> min( + C<T> const & x, + C<T> const & y, + C<T> const & z, + C<T> const & w); + + /// Return the maximum component-wise values of 3 inputs + /// @see gtx_extented_min_max + template <typename T> + T max( + T const & x, + T const & y, + T const & z); + + /// Return the maximum component-wise values of 3 inputs + /// @see gtx_extented_min_max + template + < + typename T, + template <typename> class C + > + C<T> max( + C<T> const & x, + typename C<T>::value_type const & y, + typename C<T>::value_type const & z); + + /// Return the maximum component-wise values of 3 inputs + /// @see gtx_extented_min_max + template + < + typename T, + template <typename> class C + > + C<T> max( + C<T> const & x, + C<T> const & y, + C<T> const & z); + + /// Return the maximum component-wise values of 4 inputs + /// @see gtx_extented_min_max + template <typename T> + T max( + T const & x, + T const & y, + T const & z, + T const & w); + + /// Return the maximum component-wise values of 4 inputs + /// @see gtx_extented_min_max + template + < + typename T, + template <typename> class C + > + C<T> max( + C<T> const & x, + typename C<T>::value_type const & y, + typename C<T>::value_type const & z, + typename C<T>::value_type const & w); + + /// Return the maximum component-wise values of 4 inputs + /// @see gtx_extented_min_max + template + < + typename T, + template <typename> class C + > + C<T> max( + C<T> const & x, + C<T> const & y, + C<T> const & z, + C<T> const & w); + + /// @} +}//namespace glm + +#include "extented_min_max.inl" + +#endif//GLM_GTX_extented_min_max diff --git a/include/gal/opengl/glm/gtx/extented_min_max.inl b/include/gal/opengl/glm/gtx/extented_min_max.inl new file mode 100644 index 0000000..d0a74ef --- /dev/null +++ b/include/gal/opengl/glm/gtx/extented_min_max.inl @@ -0,0 +1,178 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2007-03-14 +// Updated : 2010-02-19 +// Licence : This source is under MIT License +// File : gtx_extented_min_max.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template <typename T> + GLM_FUNC_QUALIFIER T min( + T const & x, + T const & y, + T const & z) + { + return glm::min(glm::min(x, y), z); + } + + template + < + typename T, + template <typename> class C + > + GLM_FUNC_QUALIFIER C<T> min + ( + C<T> const & x, + typename C<T>::value_type const & y, + typename C<T>::value_type const & z + ) + { + return glm::min(glm::min(x, y), z); + } + + template + < + typename T, + template <typename> class C + > + GLM_FUNC_QUALIFIER C<T> min + ( + C<T> const & x, + C<T> const & y, + C<T> const & z + ) + { + return glm::min(glm::min(x, y), z); + } + + template <typename T> + GLM_FUNC_QUALIFIER T min + ( + T const & x, + T const & y, + T const & z, + T const & w + ) + { + return glm::min(glm::min(x, y), glm::min(z, w)); + } + + template + < + typename T, + template <typename> class C + > + GLM_FUNC_QUALIFIER C<T> min + ( + C<T> const & x, + typename C<T>::value_type const & y, + typename C<T>::value_type const & z, + typename C<T>::value_type const & w + ) + { + return glm::min(glm::min(x, y), glm::min(z, w)); + } + + template + < + typename T, + template <typename> class C + > + GLM_FUNC_QUALIFIER C<T> min + ( + C<T> const & x, + C<T> const & y, + C<T> const & z, + C<T> const & w + ) + { + return glm::min(glm::min(x, y), glm::min(z, w)); + } + + template <typename T> + GLM_FUNC_QUALIFIER T max( + T const & x, + T const & y, + T const & z) + { + return glm::max(glm::max(x, y), z); + } + + template + < + typename T, + template <typename> class C + > + GLM_FUNC_QUALIFIER C<T> max + ( + C<T> const & x, + typename C<T>::value_type const & y, + typename C<T>::value_type const & z + ) + { + return glm::max(glm::max(x, y), z); + } + + template + < + typename T, + template <typename> class C + > + GLM_FUNC_QUALIFIER C<T> max + ( + C<T> const & x, + C<T> const & y, + C<T> const & z + ) + { + return glm::max(glm::max(x, y), z); + } + + template <typename T> + GLM_FUNC_QUALIFIER T max + ( + T const & x, + T const & y, + T const & z, + T const & w + ) + { + return glm::max(glm::max(x, y), glm::max(z, w)); + } + + template + < + typename T, + template <typename> class C + > + GLM_FUNC_QUALIFIER C<T> max + ( + C<T> const & x, + typename C<T>::value_type const & y, + typename C<T>::value_type const & z, + typename C<T>::value_type const & w + ) + { + return glm::max(glm::max(x, y), glm::max(z, w)); + } + + template + < + typename T, + template <typename> class C + > + GLM_FUNC_QUALIFIER C<T> max + ( + C<T> const & x, + C<T> const & y, + C<T> const & z, + C<T> const & w + ) + { + return glm::max(glm::max(x, y), glm::max(z, w)); + } + +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/fast_exponential.hpp b/include/gal/opengl/glm/gtx/fast_exponential.hpp new file mode 100644 index 0000000..ff50eec --- /dev/null +++ b/include/gal/opengl/glm/gtx/fast_exponential.hpp @@ -0,0 +1,99 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_fast_exponential +/// @file glm/gtx/fast_exponential.hpp +/// @date 2006-01-09 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// @see gtx_half_float (dependence) +/// +/// @defgroup gtx_fast_exponential GLM_GTX_fast_exponential +/// @ingroup gtx +/// +/// @brief Fast but less accurate implementations of exponential based functions. +/// +/// <glm/gtx/fast_exponential.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_fast_exponential +#define GLM_GTX_fast_exponential GLM_VERSION + +// Dependency: +#include "../glm.hpp" +#include "../gtc/half_float.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_fast_exponential extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_fast_exponential + /// @{ + + /// Faster than the common pow function but less accurate. + /// @see gtx_fast_exponential + template <typename genType> + genType fastPow( + genType const & x, + genType const & y); + + /// Faster than the common pow function but less accurate. + /// @see gtx_fast_exponential + template <typename genTypeT, typename genTypeU> + genTypeT fastPow( + genTypeT const & x, + genTypeU const & y); + + /// Faster than the common exp function but less accurate. + /// @see gtx_fast_exponential + template <typename T> + T fastExp(const T& x); + + /// Faster than the common log function but less accurate. + /// @see gtx_fast_exponential + template <typename T> + T fastLog(const T& x); + + /// Faster than the common exp2 function but less accurate. + /// @see gtx_fast_exponential + template <typename T> + T fastExp2(const T& x); + + /// Faster than the common log2 function but less accurate. + /// @see gtx_fast_exponential + template <typename T> + T fastLog2(const T& x); + + /// Faster than the common ln function but less accurate. + /// @see gtx_fast_exponential + template <typename T> + T fastLn(const T& x); + + /// @} +}//namespace glm + +#include "fast_exponential.inl" + +#endif//GLM_GTX_fast_exponential diff --git a/include/gal/opengl/glm/gtx/fast_exponential.inl b/include/gal/opengl/glm/gtx/fast_exponential.inl new file mode 100644 index 0000000..80837ff --- /dev/null +++ b/include/gal/opengl/glm/gtx/fast_exponential.inl @@ -0,0 +1,148 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2006-01-09 +// Updated : 2006-01-09 +// Licence : This source is under MIT License +// File : glm/gtx/fast_exponential.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + // fastPow: + template <typename genType> + GLM_FUNC_QUALIFIER genType fastPow(genType const & x, genType const & y) + { + return exp(y * log(x)); + } + + VECTORIZE_VEC_VEC(fastPow) + + template <typename T> + GLM_FUNC_QUALIFIER T fastPow(const T x, int y) + { + T f = T(1); + for(int i = 0; i < y; ++i) + f *= x; + return f; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec2<T> fastPow( + const detail::tvec2<T>& x, + const detail::tvec2<int>& y) + { + return detail::tvec2<T>( + fastPow(x.x, y.x), + fastPow(x.y, y.y)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> fastPow( + const detail::tvec3<T>& x, + const detail::tvec3<int>& y) + { + return detail::tvec3<T>( + fastPow(x.x, y.x), + fastPow(x.y, y.y), + fastPow(x.z, y.z)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec4<T> fastPow( + const detail::tvec4<T>& x, + const detail::tvec4<int>& y) + { + return detail::tvec4<T>( + fastPow(x.x, y.x), + fastPow(x.y, y.y), + fastPow(x.z, y.z), + fastPow(x.w, y.w)); + } + + // fastExp + // Note: This function provides accurate results only for value between -1 and 1, else avoid it. + template <typename T> + GLM_FUNC_QUALIFIER T fastExp(const T x) + { + // This has a better looking and same performance in release mode than the following code. However, in debug mode it's slower. + // return 1.0f + x * (1.0f + x * 0.5f * (1.0f + x * 0.3333333333f * (1.0f + x * 0.25 * (1.0f + x * 0.2f)))); + T x2 = x * x; + T x3 = x2 * x; + T x4 = x3 * x; + T x5 = x4 * x; + return T(1) + x + (x2 * T(0.5)) + (x3 * T(0.1666666667)) + (x4 * T(0.041666667)) + (x5 * T(0.008333333333)); + } + /* // Try to handle all values of float... but often shower than std::exp, glm::floor and the loop kill the performance + GLM_FUNC_QUALIFIER float fastExp(float x) + { + const float e = 2.718281828f; + const float IntegerPart = floor(x); + const float FloatPart = x - IntegerPart; + float z = 1.f; + + for(int i = 0; i < int(IntegerPart); ++i) + z *= e; + + const float x2 = FloatPart * FloatPart; + const float x3 = x2 * FloatPart; + const float x4 = x3 * FloatPart; + const float x5 = x4 * FloatPart; + return z * (1.0f + FloatPart + (x2 * 0.5f) + (x3 * 0.1666666667f) + (x4 * 0.041666667f) + (x5 * 0.008333333333f)); + } + + // Increase accuracy on number bigger that 1 and smaller than -1 but it's not enough for high and negative numbers + GLM_FUNC_QUALIFIER float fastExp(float x) + { + // This has a better looking and same performance in release mode than the following code. However, in debug mode it's slower. + // return 1.0f + x * (1.0f + x * 0.5f * (1.0f + x * 0.3333333333f * (1.0f + x * 0.25 * (1.0f + x * 0.2f)))); + float x2 = x * x; + float x3 = x2 * x; + float x4 = x3 * x; + float x5 = x4 * x; + float x6 = x5 * x; + float x7 = x6 * x; + float x8 = x7 * x; + return 1.0f + x + (x2 * 0.5f) + (x3 * 0.1666666667f) + (x4 * 0.041666667f) + (x5 * 0.008333333333f)+ (x6 * 0.00138888888888f) + (x7 * 0.000198412698f) + (x8 * 0.0000248015873f);; + } + */ + + VECTORIZE_VEC(fastExp) + + // fastLog + template <typename genType> + GLM_FUNC_QUALIFIER genType fastLog(genType const & x) + { + return std::log(x); + } + + /* Slower than the VC7.1 function... + GLM_FUNC_QUALIFIER float fastLog(float x) + { + float y1 = (x - 1.0f) / (x + 1.0f); + float y2 = y1 * y1; + return 2.0f * y1 * (1.0f + y2 * (0.3333333333f + y2 * (0.2f + y2 * 0.1428571429f))); + } + */ + + VECTORIZE_VEC(fastLog) + + //fastExp2, ln2 = 0.69314718055994530941723212145818f + template <typename genType> + GLM_FUNC_QUALIFIER genType fastExp2(genType const & x) + { + return fastExp(0.69314718055994530941723212145818f * x); + } + + VECTORIZE_VEC(fastExp2) + + // fastLog2, ln2 = 0.69314718055994530941723212145818f + template <typename genType> + GLM_FUNC_QUALIFIER genType fastLog2(genType const & x) + { + return fastLog(x) / 0.69314718055994530941723212145818f; + } + + VECTORIZE_VEC(fastLog2) + +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/fast_square_root.hpp b/include/gal/opengl/glm/gtx/fast_square_root.hpp new file mode 100644 index 0000000..a49ae94 --- /dev/null +++ b/include/gal/opengl/glm/gtx/fast_square_root.hpp @@ -0,0 +1,85 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_fast_square_root +/// @file glm/gtx/fast_square_root.hpp +/// @date 2006-01-04 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// +/// @defgroup gtx_fast_square_root GLM_GTX_fast_square_root +/// @ingroup gtx +/// +/// @brief Fast but less accurate implementations of square root based functions. +/// - Sqrt optimisation based on Newton's method, +/// www.gamedev.net/community/forums/topic.asp?topic id=139956 +/// +/// <glm/gtx/fast_square_root.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_fast_square_root +#define GLM_GTX_fast_square_root GLM_VERSION + +// Dependency: +#include "../glm.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_fast_square_root extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_fast_square_root + /// @{ + + //! Faster than the common sqrt function but less accurate. + //! From GLM_GTX_fast_square_root extension. + template <typename genType> + genType fastSqrt(genType const & x); + + //! Faster than the common inversesqrt function but less accurate. + //! From GLM_GTX_fast_square_root extension. + template <typename genType> + genType fastInverseSqrt(genType const & x); + + //! Faster than the common length function but less accurate. + //! From GLM_GTX_fast_square_root extension. + template <typename genType> + typename genType::value_type fastLength(genType const & x); + + //! Faster than the common distance function but less accurate. + //! From GLM_GTX_fast_square_root extension. + template <typename genType> + typename genType::value_type fastDistance(genType const & x, genType const & y); + + //! Faster than the common normalize function but less accurate. + //! From GLM_GTX_fast_square_root extension. + template <typename genType> + genType fastNormalize(genType const & x); + + /// @} +}// namespace glm + +#include "fast_square_root.inl" + +#endif//GLM_GTX_fast_square_root diff --git a/include/gal/opengl/glm/gtx/fast_square_root.inl b/include/gal/opengl/glm/gtx/fast_square_root.inl new file mode 100644 index 0000000..0f51fbb --- /dev/null +++ b/include/gal/opengl/glm/gtx/fast_square_root.inl @@ -0,0 +1,136 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2006-01-04 +// Updated : 2011-10-14 +// Licence : This source is under MIT License +// File : glm/gtx/fast_square_root.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + // fastSqrt + template <typename genType> + GLM_FUNC_QUALIFIER genType fastSqrt + ( + genType const & x + ) + { + GLM_STATIC_ASSERT(detail::type<genType>::is_float, "'fastSqrt' only accept floating-point input"); + + return genType(1) / fastInverseSqrt(x); + } + + VECTORIZE_VEC(fastSqrt) + + // fastInversesqrt + template <typename genType> + GLM_FUNC_QUALIFIER genType fastInverseSqrt + ( + genType const & x + ) + { + genType tmp = x; + float xhalf = 0.5f * float(tmp); + uint i = *(uint*)&x; + i = 0x5f375a86 - (i >> 1); + //x = *(float*)&i; + //x = *((float*)(char*)&i); + tmp = detail::uif(i).f; + tmp = tmp * (1.5f - xhalf * tmp * tmp); + return genType(tmp); + } + + VECTORIZE_VEC(fastInverseSqrt) + + // fastLength + template <typename genType> + GLM_FUNC_QUALIFIER genType fastLength + ( + genType const & x + ) + { + return abs(x); + } + + template <typename valType> + GLM_FUNC_QUALIFIER valType fastLength + ( + detail::tvec2<valType> const & x + ) + { + valType sqr = x.x * x.x + x.y * x.y; + return fastSqrt(sqr); + } + + template <typename valType> + GLM_FUNC_QUALIFIER valType fastLength + ( + detail::tvec3<valType> const & x + ) + { + valType sqr = x.x * x.x + x.y * x.y + x.z * x.z; + return fastSqrt(sqr); + } + + template <typename valType> + GLM_FUNC_QUALIFIER valType fastLength + ( + detail::tvec4<valType> const & x + ) + { + valType sqr = x.x * x.x + x.y * x.y + x.z * x.z + x.w * x.w; + return fastSqrt(sqr); + } + + // fastDistance + template <typename genType> + GLM_FUNC_QUALIFIER genType fastDistance + ( + genType const & x, + genType const & y + ) + { + return fastLength(y - x); + } + + // fastNormalize + template <typename genType> + GLM_FUNC_QUALIFIER genType fastNormalize + ( + genType const & x + ) + { + return x > genType(0) ? genType(1) : -genType(1); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec2<valType> fastNormalize + ( + detail::tvec2<valType> const & x + ) + { + valType sqr = x.x * x.x + x.y * x.y; + return x * fastInverseSqrt(sqr); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec3<valType> fastNormalize + ( + detail::tvec3<valType> const & x + ) + { + valType sqr = x.x * x.x + x.y * x.y + x.z * x.z; + return x * fastInverseSqrt(sqr); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec4<valType> fastNormalize + ( + detail::tvec4<valType> const & x + ) + { + valType sqr = x.x * x.x + x.y * x.y + x.z * x.z + x.w * x.w; + return x * fastInverseSqrt(sqr); + } +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/fast_trigonometry.hpp b/include/gal/opengl/glm/gtx/fast_trigonometry.hpp new file mode 100644 index 0000000..16f326d --- /dev/null +++ b/include/gal/opengl/glm/gtx/fast_trigonometry.hpp @@ -0,0 +1,100 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_fast_trigonometry +/// @file glm/gtx/fast_trigonometry.hpp +/// @date 2006-01-08 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// +/// @defgroup gtx_fast_trigonometry GLM_GTX_fast_trigonometry +/// @ingroup gtx +/// +/// @brief Fast but less accurate implementations of trigonometric functions. +/// +/// <glm/gtx/fast_trigonometry.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_fast_trigonometry +#define GLM_GTX_fast_trigonometry GLM_VERSION + +// Dependency: +#include "../glm.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_fast_trigonometry extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_fast_trigonometry + /// @{ + + //! Faster than the common sin function but less accurate. + //! Defined between -2pi and 2pi. + //! From GLM_GTX_fast_trigonometry extension. + template <typename T> + T fastSin(const T& angle); + + //! Faster than the common cos function but less accurate. + //! Defined between -2pi and 2pi. + //! From GLM_GTX_fast_trigonometry extension. + template <typename T> + T fastCos(const T& angle); + + //! Faster than the common tan function but less accurate. + //! Defined between -2pi and 2pi. + //! From GLM_GTX_fast_trigonometry extension. + template <typename T> + T fastTan(const T& angle); + + //! Faster than the common asin function but less accurate. + //! Defined between -2pi and 2pi. + //! From GLM_GTX_fast_trigonometry extension. + template <typename T> + T fastAsin(const T& angle); + + //! Faster than the common acos function but less accurate. + //! Defined between -2pi and 2pi. + //! From GLM_GTX_fast_trigonometry extension. + template <typename T> + T fastAcos(const T& angle); + + //! Faster than the common atan function but less accurate. + //! Defined between -2pi and 2pi. + //! From GLM_GTX_fast_trigonometry extension. + template <typename T> + T fastAtan(const T& y, const T& x); + + //! Faster than the common atan function but less accurate. + //! Defined between -2pi and 2pi. + //! From GLM_GTX_fast_trigonometry extension. + template <typename T> + T fastAtan(const T& angle); + + /// @} +}//namespace glm + +#include "fast_trigonometry.inl" + +#endif//GLM_GTX_fast_trigonometry diff --git a/include/gal/opengl/glm/gtx/fast_trigonometry.inl b/include/gal/opengl/glm/gtx/fast_trigonometry.inl new file mode 100644 index 0000000..b2179a6 --- /dev/null +++ b/include/gal/opengl/glm/gtx/fast_trigonometry.inl @@ -0,0 +1,75 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2006-01-08 +// Updated : 2011-10-14 +// Licence : This source is under MIT License +// File : glm/gtx/fast_trigonometry.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + // sin + template <typename T> + GLM_FUNC_QUALIFIER T fastSin(T const & x) + { + return x - ((x * x * x) / T(6)) + ((x * x * x * x * x) / T(120)) - ((x * x * x * x * x * x * x) / T(5040)); + } + + VECTORIZE_VEC(fastSin) + + // cos + template <typename T> + GLM_FUNC_QUALIFIER T fastCos(T const & x) + { + return T(1) - (x * x * T(0.5)) + (x * x * x * x * T(0.041666666666)) - (x * x * x * x * x * x * T(0.00138888888888)); + } + + VECTORIZE_VEC(fastCos) + + // tan + template <typename T> + GLM_FUNC_QUALIFIER T fastTan(T const & x) + { + return x + (x * x * x * T(0.3333333333)) + (x * x * x * x * x * T(0.1333333333333)) + (x * x * x * x * x * x * x * T(0.0539682539)); + } + + VECTORIZE_VEC(fastTan) + + // asin + template <typename T> + GLM_FUNC_QUALIFIER T fastAsin(T const & x) + { + return x + (x * x * x * T(0.166666667)) + (x * x * x * x * x * T(0.075)) + (x * x * x * x * x * x * x * T(0.0446428571)) + (x * x * x * x * x * x * x * x * x * T(0.0303819444));// + (x * x * x * x * x * x * x * x * x * x * x * T(0.022372159)); + } + + VECTORIZE_VEC(fastAsin) + + // acos + template <typename T> + GLM_FUNC_QUALIFIER T fastAcos(T const & x) + { + return T(1.5707963267948966192313216916398) - fastAsin(x); //(PI / 2) + } + + VECTORIZE_VEC(fastAcos) + + // atan + template <typename T> + GLM_FUNC_QUALIFIER T fastAtan(T const & y, T const & x) + { + T sgn = sign(y) * sign(x); + return abs(fastAtan(y / x)) * sgn; + } + + VECTORIZE_VEC_VEC(fastAtan) + + template <typename T> + GLM_FUNC_QUALIFIER T fastAtan(T const & x) + { + return x - (x * x * x * T(0.333333333333)) + (x * x * x * x * x * T(0.2)) - (x * x * x * x * x * x * x * T(0.1428571429)) + (x * x * x * x * x * x * x * x * x * T(0.111111111111)) - (x * x * x * x * x * x * x * x * x * x * x * T(0.0909090909)); + } + + VECTORIZE_VEC(fastAtan) + +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/gradient_paint.hpp b/include/gal/opengl/glm/gtx/gradient_paint.hpp new file mode 100644 index 0000000..f3bfde7 --- /dev/null +++ b/include/gal/opengl/glm/gtx/gradient_paint.hpp @@ -0,0 +1,76 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_gradient_paint +/// @file glm/gtx/gradient_paint.hpp +/// @date 2009-03-06 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// @see gtx_optimum_pow (dependence) +/// +/// @defgroup gtx_gradient_paint GLM_GTX_gradient_paint +/// @ingroup gtx +/// +/// @brief Functions that return the color of procedural gradient for specific coordinates. +/// <glm/gtx/gradient_paint.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_gradient_paint +#define GLM_GTX_gradient_paint GLM_VERSION + +// Dependency: +#include "../glm.hpp" +#include "../gtx/optimum_pow.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_gradient_paint extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_gradient_paint + /// @{ + + /// Return a color from a radial gradient. + /// @see - gtx_gradient_paint + template <typename valType> + valType radialGradient( + detail::tvec2<valType> const & Center, + valType const & Radius, + detail::tvec2<valType> const & Focal, + detail::tvec2<valType> const & Position); + + /// Return a color from a linear gradient. + /// @see - gtx_gradient_paint + template <typename valType> + valType linearGradient( + detail::tvec2<valType> const & Point0, + detail::tvec2<valType> const & Point1, + detail::tvec2<valType> const & Position); + + /// @} +}// namespace glm + +#include "gradient_paint.inl" + +#endif//GLM_GTX_gradient_paint diff --git a/include/gal/opengl/glm/gtx/gradient_paint.inl b/include/gal/opengl/glm/gtx/gradient_paint.inl new file mode 100644 index 0000000..bdf5a65 --- /dev/null +++ b/include/gal/opengl/glm/gtx/gradient_paint.inl @@ -0,0 +1,43 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2009-03-06 +// Updated : 2009-03-09 +// Licence : This source is under MIT License +// File : glm/gtx/gradient_paint.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template <typename valType> + valType radialGradient + ( + detail::tvec2<valType> const & Center, + valType const & Radius, + detail::tvec2<valType> const & Focal, + detail::tvec2<valType> const & Position + ) + { + detail::tvec2<valType> F = Focal - Center; + detail::tvec2<valType> D = Position - Focal; + valType Radius2 = pow2(Radius); + valType Fx2 = pow2(F.x); + valType Fy2 = pow2(F.y); + + valType Numerator = (D.x * F.x + D.y * F.y) + sqrt(Radius2 * (pow2(D.x) + pow2(D.y)) - pow2(D.x * F.y - D.y * F.x)); + valType Denominator = Radius2 - (Fx2 + Fy2); + return Numerator / Denominator; + } + + template <typename valType> + valType linearGradient + ( + detail::tvec2<valType> const & Point0, + detail::tvec2<valType> const & Point1, + detail::tvec2<valType> const & Position + ) + { + detail::tvec2<valType> Dist = Point1 - Point0; + return (Dist.x * (Position.x - Point0.x) + Dist.y * (Position.y - Point0.y)) / glm::dot(Dist, Dist); + } +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/handed_coordinate_space.hpp b/include/gal/opengl/glm/gtx/handed_coordinate_space.hpp new file mode 100644 index 0000000..5ed0b0b --- /dev/null +++ b/include/gal/opengl/glm/gtx/handed_coordinate_space.hpp @@ -0,0 +1,74 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_handed_coordinate_space +/// @file glm/gtx/handed_coordinate_space.hpp +/// @date 2005-12-21 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// +/// @defgroup gtx_handed_coordinate_space GLM_GTX_handed_coordinate_space +/// @ingroup gtx +/// +/// @brief To know if a set of three basis vectors defines a right or left-handed coordinate system. +/// +/// <glm/gtx/handed_coordinate_system.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_handed_coordinate_space +#define GLM_GTX_handed_coordinate_space GLM_VERSION + +// Dependency: +#include "../glm.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_handed_coordinate_space extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_handed_coordinate_space + /// @{ + + //! Return if a trihedron right handed or not. + //! From GLM_GTX_handed_coordinate_space extension. + template <typename T> + bool rightHanded( + detail::tvec3<T> const & tangent, + detail::tvec3<T> const & binormal, + detail::tvec3<T> const & normal); + + //! Return if a trihedron left handed or not. + //! From GLM_GTX_handed_coordinate_space extension. + template <typename T> + bool leftHanded( + detail::tvec3<T> const & tangent, + detail::tvec3<T> const & binormal, + detail::tvec3<T> const & normal); + + /// @} +}// namespace glm + +#include "handed_coordinate_space.inl" + +#endif//GLM_GTX_handed_coordinate_space diff --git a/include/gal/opengl/glm/gtx/handed_coordinate_space.inl b/include/gal/opengl/glm/gtx/handed_coordinate_space.inl new file mode 100644 index 0000000..51a0553 --- /dev/null +++ b/include/gal/opengl/glm/gtx/handed_coordinate_space.inl @@ -0,0 +1,33 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2005-12-21 +// Updated : 2009-02-19 +// Licence : This source is under MIT License +// File : glm/gtx/handed_coordinate_space.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template <typename T> + GLM_FUNC_QUALIFIER bool rightHanded + ( + detail::tvec3<T> const & tangent, + detail::tvec3<T> const & binormal, + detail::tvec3<T> const & normal + ) + { + return dot(cross(normal, tangent), binormal) > T(0); + } + + template <typename T> + GLM_FUNC_QUALIFIER bool leftHanded + ( + detail::tvec3<T> const & tangent, + detail::tvec3<T> const & binormal, + detail::tvec3<T> const & normal + ) + { + return dot(cross(normal, tangent), binormal) < T(0); + } +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/inertia.hpp b/include/gal/opengl/glm/gtx/inertia.hpp new file mode 100644 index 0000000..9133299 --- /dev/null +++ b/include/gal/opengl/glm/gtx/inertia.hpp @@ -0,0 +1,115 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_inertia +/// @file glm/gtx/inertia.hpp +/// @date 2006-04-21 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// @see gtx_extented_min_max (dependence) +/// +/// @defgroup gtx_inertia GLM_GTX_inertia +/// @ingroup gtx +/// +/// @brief Create inertia matrices +/// +/// <glm/gtx/inertia.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_inertia +#define GLM_GTX_inertia GLM_VERSION + +// Dependency: +#include "../glm.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_inertia extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_inertia + /// @{ + + //! Build an inertia matrix for a box. + //! From GLM_GTX_inertia extension. + template <typename T> + detail::tmat3x3<T> boxInertia3( + T const & Mass, + detail::tvec3<T> const & Scale); + + //! Build an inertia matrix for a box. + //! From GLM_GTX_inertia extension. + template <typename T> + detail::tmat4x4<T> boxInertia4( + T const & Mass, + detail::tvec3<T> const & Scale); + + //! Build an inertia matrix for a disk. + //! From GLM_GTX_inertia extension. + template <typename T> + detail::tmat3x3<T> diskInertia3( + T const & Mass, + T const & Radius); + + //! Build an inertia matrix for a disk. + //! From GLM_GTX_inertia extension. + template <typename T> + detail::tmat4x4<T> diskInertia4( + T const & Mass, + T const & Radius); + + //! Build an inertia matrix for a ball. + //! From GLM_GTX_inertia extension. + template <typename T> + detail::tmat3x3<T> ballInertia3( + T const & Mass, + T const & Radius); + + //! Build an inertia matrix for a ball. + //! From GLM_GTX_inertia extension. + template <typename T> + detail::tmat4x4<T> ballInertia4( + T const & Mass, + T const & Radius); + + //! Build an inertia matrix for a sphere. + //! From GLM_GTX_inertia extension. + template <typename T> + detail::tmat3x3<T> sphereInertia3( + T const & Mass, + T const & Radius); + + //! Build an inertia matrix for a sphere. + //! From GLM_GTX_inertia extension. + template <typename T> + detail::tmat4x4<T> sphereInertia4( + T const & Mass, + T const & Radius); + + /// @} +}// namespace glm + +#include "inertia.inl" + +#endif//GLM_GTX_inertia diff --git a/include/gal/opengl/glm/gtx/inertia.inl b/include/gal/opengl/glm/gtx/inertia.inl new file mode 100644 index 0000000..a8f2ad7 --- /dev/null +++ b/include/gal/opengl/glm/gtx/inertia.inl @@ -0,0 +1,114 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2006-04-21 +// Updated : 2006-12-06 +// Licence : This source is under MIT License +// File : glm/gtx/inertia.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat3x3<T> boxInertia3 + ( + T const & Mass, + detail::tvec3<T> const & Scale + ) + { + detail::tmat3x3<T> Result(T(1)); + Result[0][0] = (Scale.y * Scale.y + Scale.z * Scale.z) * Mass / T(12); + Result[1][1] = (Scale.x * Scale.x + Scale.z * Scale.z) * Mass / T(12); + Result[2][2] = (Scale.x * Scale.x + Scale.y * Scale.y) * Mass / T(12); + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> boxInertia4 + ( + T const & Mass, + detail::tvec3<T> const & Scale + ) + { + detail::tmat4x4<T> Result(T(1)); + Result[0][0] = (Scale.y * Scale.y + Scale.z * Scale.z) * Mass / T(12); + Result[1][1] = (Scale.x * Scale.x + Scale.z * Scale.z) * Mass / T(12); + Result[2][2] = (Scale.x * Scale.x + Scale.y * Scale.y) * Mass / T(12); + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat3x3<T> diskInertia3 + ( + T const & Mass, + T const & Radius + ) + { + T a = Mass * Radius * Radius / T(2); + detail::tmat3x3<T> Result(a); + Result[2][2] *= T(2); + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> diskInertia4 + ( + T const & Mass, + T const & Radius + ) + { + T a = Mass * Radius * Radius / T(2); + detail::tmat4x4<T> Result(a); + Result[2][2] *= T(2); + Result[3][3] = T(1); + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat3x3<T> ballInertia3 + ( + T const & Mass, + T const & Radius + ) + { + T a = T(2) * Mass * Radius * Radius / T(5); + return detail::tmat3x3<T>(a); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> ballInertia4 + ( + T const & Mass, + T const & Radius + ) + { + T a = T(2) * Mass * Radius * Radius / T(5); + detail::tmat4x4<T> Result(a); + Result[3][3] = T(1); + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat3x3<T> sphereInertia3 + ( + T const & Mass, + T const & Radius + ) + { + T a = T(2) * Mass * Radius * Radius / T(3); + return detail::tmat3x3<T>(a); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> sphereInertia4 + ( + T const & Mass, + T const & Radius + ) + { + T a = T(2) * Mass * Radius * Radius / T(3); + detail::tmat4x4<T> Result(a); + Result[3][3] = T(1); + return Result; + } +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/int_10_10_10_2.hpp b/include/gal/opengl/glm/gtx/int_10_10_10_2.hpp new file mode 100644 index 0000000..1270481 --- /dev/null +++ b/include/gal/opengl/glm/gtx/int_10_10_10_2.hpp @@ -0,0 +1,64 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_int_10_10_10_2 +/// @file glm/gtx/int_10_10_10_2.hpp +/// @date 2010-07-07 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// @see gtx_raw_data (dependence) +/// +/// @defgroup gtx_int_10_10_10_2 GLM_GTX_int_10_10_10_2 +/// @ingroup gtx +/// +/// @brief Pack vector to 1010102 integers. Storage only. +/// +/// <glm/gtx/int_10_10_10_2.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_int_10_10_10_2 +#define GLM_GTX_int_10_10_10_2 GLM_VERSION + +// Dependency: +#include "../glm.hpp" +#include "../gtx/raw_data.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_int_10_10_10_2 extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_int_10_10_10_2 + /// @{ + + //! From GLM_GTX_int_10_10_10_2 extension. + //! Cast a vec4 to an u_10_10_10_2. + dword uint10_10_10_2_cast(glm::vec4 const & v); + + /// @} +}//namespace glm + +#include "int_10_10_10_2.inl" + +#endif//GLM_GTX_int_10_10_10_2 diff --git a/include/gal/opengl/glm/gtx/int_10_10_10_2.inl b/include/gal/opengl/glm/gtx/int_10_10_10_2.inl new file mode 100644 index 0000000..c1ec201 --- /dev/null +++ b/include/gal/opengl/glm/gtx/int_10_10_10_2.inl @@ -0,0 +1,19 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2010-07-07 +// Updated : 2010-07-07 +// Licence : This source is under MIT License +// File : glm/gtx/int_10_10_10_2.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + GLM_FUNC_QUALIFIER dword uint10_10_10_2_cast + ( + glm::vec4 const & v + ) + { + return dword(uint(v.x * 2047.f) << 0 | uint(v.y * 2047.f) << 10 | uint(v.z * 2047.f) << 20 | uint(v.w * 3.f) << 30); + } +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/integer.hpp b/include/gal/opengl/glm/gtx/integer.hpp new file mode 100644 index 0000000..b3e21fd --- /dev/null +++ b/include/gal/opengl/glm/gtx/integer.hpp @@ -0,0 +1,104 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_integer +/// @file glm/gtx/integer.hpp +/// @date 2005-12-24 / 2011-10-13 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// +/// @defgroup gtx_integer GLM_GTX_integer +/// @ingroup gtx +/// +/// @brief Add support for integer for core functions +/// +/// <glm/gtx/integer.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_integer +#define GLM_GTX_integer GLM_VERSION + +// Dependency: +#include "../glm.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_integer extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_integer + /// @{ + + //! Returns x raised to the y power. + //! From GLM_GTX_integer extension. + int pow(int x, int y); + + //! Returns the positive square root of x. + //! From GLM_GTX_integer extension. + int sqrt(int x); + + //! Returns the log2 of x. Can be reliably using to compute mipmap count from the texture size. + //! From GLM_GTX_integer extension. + template <typename genIUType> + genIUType log2(genIUType const & x); + + //! Returns the floor log2 of x. + //! From GLM_GTX_integer extension. + unsigned int floor_log2(unsigned int x); + + //! Modulus. Returns x - y * floor(x / y) for each component in x using the floating point value y. + //! From GLM_GTX_integer extension. + int mod(int x, int y); + + //! Return the factorial value of a number (!12 max, integer only) + //! From GLM_GTX_integer extension. + template <typename genType> + genType factorial(genType const & x); + + //! 32bit signed integer. + //! From GLM_GTX_integer extension. + typedef signed int sint; + + //! Returns x raised to the y power. + //! From GLM_GTX_integer extension. + uint pow(uint x, uint y); + + //! Returns the positive square root of x. + //! From GLM_GTX_integer extension. + uint sqrt(uint x); + + //! Modulus. Returns x - y * floor(x / y) for each component in x using the floating point value y. + //! From GLM_GTX_integer extension. + uint mod(uint x, uint y); + + //! Returns the number of leading zeros. + //! From GLM_GTX_integer extension. + uint nlz(uint x); + + /// @} +}//namespace glm + +#include "integer.inl" + +#endif//GLM_GTX_integer diff --git a/include/gal/opengl/glm/gtx/integer.inl b/include/gal/opengl/glm/gtx/integer.inl new file mode 100644 index 0000000..2478616 --- /dev/null +++ b/include/gal/opengl/glm/gtx/integer.inl @@ -0,0 +1,203 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2005-12-24 +// Updated : 2011-10-13 +// Licence : This source is under MIT License +// File : glm/gtx/integer.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + // pow + GLM_FUNC_QUALIFIER int pow(int x, int y) + { + if(y == 0) + return 1; + int result = x; + for(int i = 1; i < y; ++i) + result *= x; + return result; + } + + // sqrt: From Christopher J. Musial, An integer square root, Graphics Gems, 1990, page 387 + GLM_FUNC_QUALIFIER int sqrt(int x) + { + if(x <= 1) return x; + + int NextTrial = x >> 1; + int CurrentAnswer; + + do + { + CurrentAnswer = NextTrial; + NextTrial = (NextTrial + x / NextTrial) >> 1; + } while(NextTrial < CurrentAnswer); + + return CurrentAnswer; + } + +// Henry Gordon Dietz: http://aggregate.org/MAGIC/ +namespace _detail +{ + GLM_FUNC_QUALIFIER unsigned int ones32(unsigned int x) + { + /* 32-bit recursive reduction using SWAR... + but first step is mapping 2-bit values + into sum of 2 1-bit values in sneaky way + */ + x -= ((x >> 1) & 0x55555555); + x = (((x >> 2) & 0x33333333) + (x & 0x33333333)); + x = (((x >> 4) + x) & 0x0f0f0f0f); + x += (x >> 8); + x += (x >> 16); + return(x & 0x0000003f); + } + + template <> + struct _compute_log2<detail::float_or_int_value::GLM_INT> + { + template <typename T> + GLM_FUNC_QUALIFIER T operator() (T const & Value) const + { +#if(GLM_COMPILER & (GLM_COMPILER_VC | GLM_COMPILER_GCC)) + return Value <= T(1) ? T(0) : T(32) - nlz(Value - T(1)); +#else + return T(32) - nlz(Value - T(1)); +#endif + } + }; + +}//namespace _detail + + // Henry Gordon Dietz: http://aggregate.org/MAGIC/ +/* + GLM_FUNC_QUALIFIER unsigned int floor_log2(unsigned int x) + { + x |= (x >> 1); + x |= (x >> 2); + x |= (x >> 4); + x |= (x >> 8); + x |= (x >> 16); + + return _detail::ones32(x) >> 1; + } +*/ + // mod + GLM_FUNC_QUALIFIER int mod(int x, int y) + { + return x - y * (x / y); + } + + // factorial (!12 max, integer only) + template <typename genType> + GLM_FUNC_QUALIFIER genType factorial(genType const & x) + { + genType Temp = x; + genType Result; + for(Result = 1; Temp > 1; --Temp) + Result *= Temp; + return Result; + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec2<valType> factorial( + detail::tvec2<valType> const & x) + { + return detail::tvec2<valType>( + factorial(x.x), + factorial(x.y)); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec3<valType> factorial( + detail::tvec3<valType> const & x) + { + return detail::tvec3<valType>( + factorial(x.x), + factorial(x.y), + factorial(x.z)); + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec4<valType> factorial( + detail::tvec4<valType> const & x) + { + return detail::tvec4<valType>( + factorial(x.x), + factorial(x.y), + factorial(x.z), + factorial(x.w)); + } + + GLM_FUNC_QUALIFIER uint pow(uint x, uint y) + { + uint result = x; + for(uint i = 1; i < y; ++i) + result *= x; + return result; + } + + GLM_FUNC_QUALIFIER uint sqrt(uint x) + { + if(x <= 1) return x; + + uint NextTrial = x >> 1; + uint CurrentAnswer; + + do + { + CurrentAnswer = NextTrial; + NextTrial = (NextTrial + x / NextTrial) >> 1; + } while(NextTrial < CurrentAnswer); + + return CurrentAnswer; + } + + GLM_FUNC_QUALIFIER uint mod(uint x, uint y) + { + return x - y * (x / y); + } + +#if(GLM_COMPILER & (GLM_COMPILER_VC | GLM_COMPILER_GCC)) + + GLM_FUNC_QUALIFIER unsigned int nlz(unsigned int x) + { + return 31u - findMSB(x); + } + +#else + + // Hackers Delight: http://www.hackersdelight.org/HDcode/nlz.c.txt + GLM_FUNC_QUALIFIER unsigned int nlz(unsigned int x) + { + int y, m, n; + + y = -int(x >> 16); // If left half of x is 0, + m = (y >> 16) & 16; // set n = 16. If left half + n = 16 - m; // is nonzero, set n = 0 and + x = x >> m; // shift x right 16. + // Now x is of the form 0000xxxx. + y = x - 0x100; // If positions 8-15 are 0, + m = (y >> 16) & 8; // add 8 to n and shift x left 8. + n = n + m; + x = x << m; + + y = x - 0x1000; // If positions 12-15 are 0, + m = (y >> 16) & 4; // add 4 to n and shift x left 4. + n = n + m; + x = x << m; + + y = x - 0x4000; // If positions 14-15 are 0, + m = (y >> 16) & 2; // add 2 to n and shift x left 2. + n = n + m; + x = x << m; + + y = x >> 14; // Set y = 0, 1, 2, or 3. + m = y & ~(y >> 1); // Set m = 0, 1, 2, or 2 resp. + return unsigned(n + 2 - m); + } + +#endif//(GLM_COMPILER) + +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/intersect.hpp b/include/gal/opengl/glm/gtx/intersect.hpp new file mode 100644 index 0000000..e3319ee --- /dev/null +++ b/include/gal/opengl/glm/gtx/intersect.hpp @@ -0,0 +1,102 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_intersect +/// @file glm/gtx/intersect.hpp +/// @date 2007-04-03 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// @see gtx_closest_point (dependence) +/// +/// @defgroup gtx_intersect GLM_GTX_intersect +/// @ingroup gtx +/// +/// @brief Add intersection functions +/// +/// <glm/gtx/intersect.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_intersect +#define GLM_GTX_intersect GLM_VERSION + +// Dependency: +#include "../glm.hpp" +#include "../gtx/closest_point.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_closest_point extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_intersect + /// @{ + + //! Compute the intersection of a ray and a triangle. + //! From GLM_GTX_intersect extension. + template <typename genType> + bool intersectRayTriangle( + genType const & orig, genType const & dir, + genType const & vert0, genType const & vert1, genType const & vert2, + genType & baryPosition); + + //! Compute the intersection of a line and a triangle. + //! From GLM_GTX_intersect extension. + template <typename genType> + bool intersectLineTriangle( + genType const & orig, genType const & dir, + genType const & vert0, genType const & vert1, genType const & vert2, + genType & position); + + //! Compute the intersection distance of a ray and a sphere. + //! The ray direction vector is unit length. + //! From GLM_GTX_intersect extension. + template <typename genType> + bool intersectRaySphere( + genType const & rayStarting, genType const & rayNormalizedDirection, + genType const & sphereCenter, const typename genType::value_type sphereRadiusSquered, + typename genType::value_type & intersectionDistance); + + //! Compute the intersection of a ray and a sphere. + //! From GLM_GTX_intersect extension. + template <typename genType> + bool intersectRaySphere( + genType const & rayStarting, genType const & rayNormalizedDirection, + genType const & sphereCenter, const typename genType::value_type sphereRadius, + genType & intersectionPosition, genType & intersectionNormal); + + //! Compute the intersection of a line and a sphere. + //! From GLM_GTX_intersect extension + template <typename genType> + bool intersectLineSphere( + genType const & point0, genType const & point1, + genType const & sphereCenter, typename genType::value_type sphereRadius, + genType & intersectionPosition1, genType & intersectionNormal1, + genType & intersectionPosition2 = genType(), genType & intersectionNormal2 = genType()); + + /// @} +}//namespace glm + +#include "intersect.inl" + +#endif//GLM_GTX_intersect diff --git a/include/gal/opengl/glm/gtx/intersect.inl b/include/gal/opengl/glm/gtx/intersect.inl new file mode 100644 index 0000000..3fd8cea --- /dev/null +++ b/include/gal/opengl/glm/gtx/intersect.inl @@ -0,0 +1,196 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2007-04-03 +// Updated : 2009-01-20 +// Licence : This source is under MIT licence +// File : glm/gtx/intersect.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +#include <cfloat> +#include <limits> + +namespace glm +{ + template <typename genType> + GLM_FUNC_QUALIFIER bool intersectRayTriangle + ( + genType const & orig, genType const & dir, + genType const & v0, genType const & v1, genType const & v2, + genType & baryPosition + ) + { + genType e1 = v1 - v0; + genType e2 = v2 - v0; + + genType p = glm::cross(dir, e2); + + typename genType::value_type a = glm::dot(e1, p); + + typename genType::value_type Epsilon = std::numeric_limits<typename genType::value_type>::epsilon(); + if(a < Epsilon) + return false; + + typename genType::value_type f = typename genType::value_type(1.0f) / a; + + genType s = orig - v0; + baryPosition.x = f * glm::dot(s, p); + if(baryPosition.x < typename genType::value_type(0.0f)) + return false; + if(baryPosition.x > typename genType::value_type(1.0f)) + return false; + + genType q = glm::cross(s, e1); + baryPosition.y = f * glm::dot(dir, q); + if(baryPosition.y < typename genType::value_type(0.0f)) + return false; + if(baryPosition.y + baryPosition.x > typename genType::value_type(1.0f)) + return false; + + baryPosition.z = f * glm::dot(e2, q); + + return baryPosition.z >= typename genType::value_type(0.0f); + } + + //template <typename genType> + //GLM_FUNC_QUALIFIER bool intersectRayTriangle + //( + // genType const & orig, genType const & dir, + // genType const & vert0, genType const & vert1, genType const & vert2, + // genType & position + //) + //{ + // typename genType::value_type Epsilon = std::numeric_limits<typename genType::value_type>::epsilon(); + // + // genType edge1 = vert1 - vert0; + // genType edge2 = vert2 - vert0; + // + // genType pvec = cross(dir, edge2); + // + // float det = dot(edge1, pvec); + // if(det < Epsilon) + // return false; + // + // genType tvec = orig - vert0; + // + // position.y = dot(tvec, pvec); + // if (position.y < typename genType::value_type(0) || position.y > det) + // return typename genType::value_type(0); + // + // genType qvec = cross(tvec, edge1); + // + // position.z = dot(dir, qvec); + // if (position.z < typename genType::value_type(0) || position.y + position.z > det) + // return typename genType::value_type(0); + // + // position.x = dot(edge2, qvec); + // position *= typename genType::value_type(1) / det; + // + // return typename genType::value_type(1); + //} + + template <typename genType> + GLM_FUNC_QUALIFIER bool intersectLineTriangle + ( + genType const & orig, genType const & dir, + genType const & vert0, genType const & vert1, genType const & vert2, + genType & position + ) + { + typename genType::value_type Epsilon = std::numeric_limits<typename genType::value_type>::epsilon(); + + genType edge1 = vert1 - vert0; + genType edge2 = vert2 - vert0; + + genType pvec = cross(dir, edge2); + + float det = dot(edge1, pvec); + + if (det > -Epsilon && det < Epsilon) + return false; + float inv_det = typename genType::value_type(1) / det; + + genType tvec = orig - vert0; + + position.y = dot(tvec, pvec) * inv_det; + if (position.y < typename genType::value_type(0) || position.y > typename genType::value_type(1)) + return false; + + genType qvec = cross(tvec, edge1); + + position.z = dot(dir, qvec) * inv_det; + if (position.z < typename genType::value_type(0) || position.y + position.z > typename genType::value_type(1)) + return false; + + position.x = dot(edge2, qvec) * inv_det; + + return true; + } + + template <typename genType> + GLM_FUNC_QUALIFIER bool intersectRaySphere + ( + genType const & rayStarting, genType const & rayNormalizedDirection, + genType const & sphereCenter, const typename genType::value_type sphereRadiusSquered, + typename genType::value_type & intersectionDistance + ) + { + typename genType::value_type Epsilon = std::numeric_limits<typename genType::value_type>::epsilon(); + genType diff = sphereCenter - rayStarting; + typename genType::value_type t0 = dot(diff, rayNormalizedDirection); + typename genType::value_type dSquared = dot(diff, diff) - t0 * t0; + if( dSquared > sphereRadiusSquered ) + { + return false; + } + typename genType::value_type t1 = sqrt( sphereRadiusSquered - dSquared ); + intersectionDistance = t0 > t1 + Epsilon ? t0 - t1 : t0 + t1; + return intersectionDistance > Epsilon; + } + + template <typename genType> + GLM_FUNC_QUALIFIER bool intersectRaySphere + ( + genType const & rayStarting, genType const & rayNormalizedDirection, + genType const & sphereCenter, const typename genType::value_type sphereRadius, + genType & intersectionPosition, genType & intersectionNormal + ) + { + typename genType::value_type distance; + if( intersectRaySphere( rayStarting, rayNormalizedDirection, sphereCenter, sphereRadius * sphereRadius, distance ) ) + { + intersectionPosition = rayStarting + rayNormalizedDirection * distance; + intersectionNormal = (intersectionPosition - sphereCenter) / sphereRadius; + return true; + } + return false; + } + + template <typename genType> + GLM_FUNC_QUALIFIER bool intersectLineSphere + ( + genType const & point0, genType const & point1, + genType const & sphereCenter, typename genType::value_type sphereRadius, + genType & intersectionPoint1, genType & intersectionNormal1, + genType & intersectionPoint2, genType & intersectionNormal2 + ) + { + typename genType::value_type Epsilon = std::numeric_limits<typename genType::value_type>::epsilon(); + genType dir = normalize(point1 - point0); + genType diff = sphereCenter - point0; + typename genType::value_type t0 = dot(diff, dir); + typename genType::value_type dSquared = dot(diff, diff) - t0 * t0; + if( dSquared > sphereRadius * sphereRadius ) + { + return false; + } + typename genType::value_type t1 = sqrt( sphereRadius * sphereRadius - dSquared ); + if( t0 < t1 + Epsilon ) + t1 = -t1; + intersectionPoint1 = point0 + dir * (t0 - t1); + intersectionNormal1 = (intersectionPoint1 - sphereCenter) / sphereRadius; + intersectionPoint2 = point0 + dir * (t0 + t1); + intersectionNormal2 = (intersectionPoint2 - sphereCenter) / sphereRadius; + return true; + } +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/log_base.hpp b/include/gal/opengl/glm/gtx/log_base.hpp new file mode 100644 index 0000000..0f2033e --- /dev/null +++ b/include/gal/opengl/glm/gtx/log_base.hpp @@ -0,0 +1,65 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_log_base +/// @file glm/gtx/log_base.hpp +/// @date 2008-10-24 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// +/// @defgroup gtx_log_base GLM_GTX_log_base +/// @ingroup gtx +/// +/// @brief Logarithm for any base. base can be a vector or a scalar. +/// +/// <glm/gtx/log_base.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_log_base +#define GLM_GTX_log_base GLM_VERSION + +// Dependency: +#include "../glm.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_log_base extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_log_base + /// @{ + + //! Logarithm for any base. + //! From GLM_GTX_log_base. + template <typename genType> + genType log( + genType const & x, + genType const & base); + + /// @} +}//namespace glm + +#include "log_base.inl" + +#endif//GLM_GTX_log_base diff --git a/include/gal/opengl/glm/gtx/log_base.inl b/include/gal/opengl/glm/gtx/log_base.inl new file mode 100644 index 0000000..d8be51e --- /dev/null +++ b/include/gal/opengl/glm/gtx/log_base.inl @@ -0,0 +1,24 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2008-10-24 +// Updated : 2008-10-24 +// Licence : This source is under MIT License +// File : glm/gtx/log_base.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template <typename genType> + GLM_FUNC_QUALIFIER genType log( + genType const & x, + genType const & base) + { + assert(x != genType(0)); + + return glm::log(x) / glm::log(base); + } + + VECTORIZE_VEC_SCA(log) + VECTORIZE_VEC_VEC(log) +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/matrix_cross_product.hpp b/include/gal/opengl/glm/gtx/matrix_cross_product.hpp new file mode 100644 index 0000000..a298ab8 --- /dev/null +++ b/include/gal/opengl/glm/gtx/matrix_cross_product.hpp @@ -0,0 +1,71 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_matrix_cross_product +/// @file glm/gtx/matrix_cross_product.hpp +/// @date 2005-12-21 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// @see gtx_extented_min_max (dependence) +/// +/// @defgroup gtx_matrix_cross_product GLM_GTX_matrix_cross_product +/// @ingroup gtx +/// +/// @brief Build cross product matrices +/// +/// <glm/gtx/matrix_cross_product.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_matrix_cross_product +#define GLM_GTX_matrix_cross_product GLM_VERSION + +// Dependency: +#include "../glm.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_matrix_cross_product extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_matrix_cross_product + /// @{ + + //! Build a cross product matrix. + //! From GLM_GTX_matrix_cross_product extension. + template <typename T> + detail::tmat3x3<T> matrixCross3( + detail::tvec3<T> const & x); + + //! Build a cross product matrix. + //! From GLM_GTX_matrix_cross_product extension. + template <typename T> + detail::tmat4x4<T> matrixCross4( + detail::tvec3<T> const & x); + + /// @} +}//namespace glm + +#include "matrix_cross_product.inl" + +#endif//GLM_GTX_matrix_cross_product diff --git a/include/gal/opengl/glm/gtx/matrix_cross_product.inl b/include/gal/opengl/glm/gtx/matrix_cross_product.inl new file mode 100644 index 0000000..5da4403 --- /dev/null +++ b/include/gal/opengl/glm/gtx/matrix_cross_product.inl @@ -0,0 +1,44 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2005-12-21 +// Updated : 2005-12-21 +// Licence : This source is under MIT License +// File : glm/gtx/matrix_cross_product.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat3x3<T> matrixCross3 + ( + detail::tvec3<T> const & x + ) + { + detail::tmat3x3<T> Result(T(0)); + Result[0][1] = x.z; + Result[1][0] = -x.z; + Result[0][2] = -x.y; + Result[2][0] = x.y; + Result[1][2] = x.x; + Result[2][1] = -x.x; + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> matrixCross4 + ( + detail::tvec3<T> const & x + ) + { + detail::tmat4x4<T> Result(T(0)); + Result[0][1] = x.z; + Result[1][0] = -x.z; + Result[0][2] = -x.y; + Result[2][0] = x.y; + Result[1][2] = x.x; + Result[2][1] = -x.x; + return Result; + } + +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/matrix_interpolation.hpp b/include/gal/opengl/glm/gtx/matrix_interpolation.hpp new file mode 100644 index 0000000..75f2047 --- /dev/null +++ b/include/gal/opengl/glm/gtx/matrix_interpolation.hpp @@ -0,0 +1,88 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_matrix_interpolation +/// @file glm/gtx/matrix_interpolation.hpp +/// @date 2011-03-05 / 2011-06-07 +/// @author Ghenadii Ursachi (the.asteroth@gmail.com) +/// +/// @see core (dependence) +/// +/// @defgroup gtx_matrix_interpolation GLM_GTX_matrix_interpolation +/// @ingroup gtx +/// +/// @brief Allows to directly interpolate two exiciting matrices. +/// +/// <glm/gtx/matrix_interpolation.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_matrix_interpolation +#define GLM_GTX_matrix_interpolation GLM_VERSION + +// Dependency: +//#include "../glm.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_matrix_interpolation extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_matrix_interpolation + /// @{ + + //! Get the axis and angle of the rotation from a matrix. + //! From GLM_GTX_matrix_interpolation extension. + template <typename T> + void axisAngle( + detail::tmat4x4<T> const & mat, + detail::tvec3<T> & axis, + T & angle); + + //! Build a matrix from axis and angle. + //! From GLM_GTX_matrix_interpolation extension. + template <typename T> + detail::tmat4x4<T> axisAngleMatrix( + detail::tvec3<T> const & axis, + T const angle); + + //! Extracts the rotation part of a matrix. + //! From GLM_GTX_matrix_interpolation extension. + template <typename T> + detail::tmat4x4<T> extractMatrixRotation( + detail::tmat4x4<T> const & mat); + + //! Build a interpolation of 4 * 4 matrixes. + //! From GLM_GTX_matrix_interpolation extension. + //! Warning! works only with rotation and/or translation matrixes, scale will generate unexpected results. + template <typename T> + detail::tmat4x4<T> interpolate( + detail::tmat4x4<T> const & m1, + detail::tmat4x4<T> const & m2, + T const delta); + + /// @} +}//namespace glm + +#include "matrix_interpolation.inl" + +#endif//GLM_GTX_matrix_interpolation diff --git a/include/gal/opengl/glm/gtx/matrix_interpolation.inl b/include/gal/opengl/glm/gtx/matrix_interpolation.inl new file mode 100644 index 0000000..8ab1343 --- /dev/null +++ b/include/gal/opengl/glm/gtx/matrix_interpolation.inl @@ -0,0 +1,131 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2011-03-05 +// Updated : 2011-03-05 +// Licence : This source is under MIT License +// File : glm/gtx/matrix_interpolation.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template <typename T> + GLM_FUNC_QUALIFIER void axisAngle + ( + detail::tmat4x4<T> const & mat, + detail::tvec3<T> & axis, + T & angle + ) + { + T epsilon = (T)0.01; + T epsilon2 = (T)0.1; + + if ((fabs(mat[1][0] - mat[0][1]) < epsilon) && (fabs(mat[2][0] - mat[0][2]) < epsilon) && (fabs(mat[2][1] - mat[1][2]) < epsilon)) { + if ((fabs(mat[1][0] + mat[0][1]) < epsilon2) && (fabs(mat[2][0] + mat[0][2]) < epsilon2) && (fabs(mat[2][1] + mat[1][2]) < epsilon2) && (fabs(mat[0][0] + mat[1][1] + mat[2][2] - (T)3.0) < epsilon2)) { + angle = (T)0.0; + axis.x = (T)1.0; + axis.y = (T)0.0; + axis.z = (T)0.0; + return; + } + angle = T(3.1415926535897932384626433832795); + T xx = (mat[0][0] + (T)1.0) / (T)2.0; + T yy = (mat[1][1] + (T)1.0) / (T)2.0; + T zz = (mat[2][2] + (T)1.0) / (T)2.0; + T xy = (mat[1][0] + mat[0][1]) / (T)4.0; + T xz = (mat[2][0] + mat[0][2]) / (T)4.0; + T yz = (mat[2][1] + mat[1][2]) / (T)4.0; + if ((xx > yy) && (xx > zz)) { + if (xx < epsilon) { + axis.x = (T)0.0; + axis.y = (T)0.7071; + axis.z = (T)0.7071; + } else { + axis.x = sqrt(xx); + axis.y = xy / axis.x; + axis.z = xz / axis.x; + } + } else if (yy > zz) { + if (yy < epsilon) { + axis.x = (T)0.7071; + axis.y = (T)0.0; + axis.z = (T)0.7071; + } else { + axis.y = sqrt(yy); + axis.x = xy / axis.y; + axis.z = yz / axis.y; + } + } else { + if (zz < epsilon) { + axis.x = (T)0.7071; + axis.y = (T)0.7071; + axis.z = (T)0.0; + } else { + axis.z = sqrt(zz); + axis.x = xz / axis.z; + axis.y = yz / axis.z; + } + } + return; + } + T s = sqrt((mat[2][1] - mat[1][2]) * (mat[2][1] - mat[1][2]) + (mat[2][0] - mat[0][2]) * (mat[2][0] - mat[0][2]) + (mat[1][0] - mat[0][1]) * (mat[1][0] - mat[0][1])); + if (glm::abs(s) < T(0.001)) + s = (T)1.0; + angle = acos((mat[0][0] + mat[1][1] + mat[2][2] - (T)1.0) / (T)2.0); + axis.x = (mat[1][2] - mat[2][1]) / s; + axis.y = (mat[2][0] - mat[0][2]) / s; + axis.z = (mat[0][1] - mat[1][0]) / s; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> axisAngleMatrix + ( + detail::tvec3<T> const & axis, + T const angle + ) + { + T c = cos(angle); + T s = sin(angle); + T t = T(1) - c; + detail::tvec3<T> n = normalize(axis); + + return detail::tmat4x4<T>( + t * n.x * n.x + c, t * n.x * n.y + n.z * s, t * n.x * n.z - n.y * s, T(0), + t * n.x * n.y - n.z * s, t * n.y * n.y + c, t * n.y * n.z + n.x * s, T(0), + t * n.x * n.z + n.y * s, t * n.y * n.z - n.x * s, t * n.z * n.z + c, T(0), + T(0), T(0), T(0), T(1) + ); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> extractMatrixRotation( + detail::tmat4x4<T> const & mat) + { + return detail::tmat4x4<T>( + mat[0][0], mat[0][1], mat[0][2], 0.0, + mat[1][0], mat[1][1], mat[1][2], 0.0, + mat[2][0], mat[2][1], mat[2][2], 0.0, + 0.0, 0.0, 0.0, 1.0 + ); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> interpolate + ( + detail::tmat4x4<T> const & m1, + detail::tmat4x4<T> const & m2, + T const delta + ) + { + detail::tmat4x4<T> m1rot = extractMatrixRotation(m1); + detail::tmat4x4<T> dltRotation = m2 * transpose(m1rot); + detail::tvec3<T> dltAxis; + T dltAngle; + axisAngle(dltRotation, dltAxis, dltAngle); + detail::tmat4x4<T> out = axisAngleMatrix(dltAxis, dltAngle * delta) * m1rot; + out[3][0] = m1[3][0] + delta * (m2[3][0] - m1[3][0]); + out[3][1] = m1[3][1] + delta * (m2[3][1] - m1[3][1]); + out[3][2] = m1[3][2] + delta * (m2[3][2] - m1[3][2]); + return out; + } +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/matrix_major_storage.hpp b/include/gal/opengl/glm/gtx/matrix_major_storage.hpp new file mode 100644 index 0000000..74b5db0 --- /dev/null +++ b/include/gal/opengl/glm/gtx/matrix_major_storage.hpp @@ -0,0 +1,143 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_matrix_major_storage +/// @file glm/gtx/matrix_major_storage.hpp +/// @date 2006-04-19 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// @see gtx_extented_min_max (dependence) +/// +/// @defgroup gtx_matrix_major_storage GLM_GTX_matrix_major_storage +/// @ingroup gtx +/// +/// @brief Build matrices with specific matrix order, row or column +/// +/// <glm/gtx/matrix_major_storage.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_matrix_major_storage +#define GLM_GTX_matrix_major_storage GLM_VERSION + +// Dependency: +#include "../glm.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_matrix_major_storage extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_matrix_major_storage + /// @{ + + //! Build a row major matrix from row vectors. + //! From GLM_GTX_matrix_major_storage extension. + template <typename T> + detail::tmat2x2<T> rowMajor2( + detail::tvec2<T> const & v1, + detail::tvec2<T> const & v2); + + //! Build a row major matrix from other matrix. + //! From GLM_GTX_matrix_major_storage extension. + template <typename T> + detail::tmat2x2<T> rowMajor2( + detail::tmat2x2<T> const & m); + + //! Build a row major matrix from row vectors. + //! From GLM_GTX_matrix_major_storage extension. + template <typename T> + detail::tmat3x3<T> rowMajor3( + detail::tvec3<T> const & v1, + detail::tvec3<T> const & v2, + detail::tvec3<T> const & v3); + + //! Build a row major matrix from other matrix. + //! From GLM_GTX_matrix_major_storage extension. + template <typename T> + detail::tmat3x3<T> rowMajor3( + detail::tmat3x3<T> const & m); + + //! Build a row major matrix from row vectors. + //! From GLM_GTX_matrix_major_storage extension. + template <typename T> + detail::tmat4x4<T> rowMajor4( + detail::tvec4<T> const & v1, + detail::tvec4<T> const & v2, + detail::tvec4<T> const & v3, + detail::tvec4<T> const & v4); + + //! Build a row major matrix from other matrix. + //! From GLM_GTX_matrix_major_storage extension. + template <typename T> + detail::tmat4x4<T> rowMajor4( + detail::tmat4x4<T> const & m); + + //! Build a column major matrix from column vectors. + //! From GLM_GTX_matrix_major_storage extension. + template <typename T> + detail::tmat2x2<T> colMajor2( + detail::tvec2<T> const & v1, + detail::tvec2<T> const & v2); + + //! Build a column major matrix from other matrix. + //! From GLM_GTX_matrix_major_storage extension. + template <typename T> + detail::tmat2x2<T> colMajor2( + detail::tmat2x2<T> const & m); + + //! Build a column major matrix from column vectors. + //! From GLM_GTX_matrix_major_storage extension. + template <typename T> + detail::tmat3x3<T> colMajor3( + detail::tvec3<T> const & v1, + detail::tvec3<T> const & v2, + detail::tvec3<T> const & v3); + + //! Build a column major matrix from other matrix. + //! From GLM_GTX_matrix_major_storage extension. + template <typename T> + detail::tmat3x3<T> colMajor3( + detail::tmat3x3<T> const & m); + + //! Build a column major matrix from column vectors. + //! From GLM_GTX_matrix_major_storage extension. + template <typename T> + detail::tmat4x4<T> colMajor4( + detail::tvec4<T> const & v1, + detail::tvec4<T> const & v2, + detail::tvec4<T> const & v3, + detail::tvec4<T> const & v4); + + //! Build a column major matrix from other matrix. + //! From GLM_GTX_matrix_major_storage extension. + template <typename T> + detail::tmat4x4<T> colMajor4( + detail::tmat4x4<T> const & m); + + /// @} +}//namespace glm + +#include "matrix_major_storage.inl" + +#endif//GLM_GTX_matrix_major_storage diff --git a/include/gal/opengl/glm/gtx/matrix_major_storage.inl b/include/gal/opengl/glm/gtx/matrix_major_storage.inl new file mode 100644 index 0000000..a12ed36 --- /dev/null +++ b/include/gal/opengl/glm/gtx/matrix_major_storage.inl @@ -0,0 +1,173 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2006-04-19 +// Updated : 2009-02-19 +// Licence : This source is under MIT License +// File : glm/gtx/matrix_major_storage.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat2x2<T> rowMajor2 + ( + detail::tvec2<T> const & v1, + detail::tvec2<T> const & v2 + ) + { + detail::tmat2x2<T> Result; + Result[0][0] = v1.x; + Result[1][0] = v1.y; + Result[0][1] = v2.x; + Result[1][1] = v2.y; + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat2x2<T> rowMajor2( + const detail::tmat2x2<T>& m) + { + detail::tmat2x2<T> Result; + Result[0][0] = m[0][0]; + Result[0][1] = m[1][0]; + Result[1][0] = m[0][1]; + Result[1][1] = m[1][1]; + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat3x3<T> rowMajor3( + const detail::tvec3<T>& v1, + const detail::tvec3<T>& v2, + const detail::tvec3<T>& v3) + { + detail::tmat3x3<T> Result; + Result[0][0] = v1.x; + Result[1][0] = v1.y; + Result[2][0] = v1.z; + Result[0][1] = v2.x; + Result[1][1] = v2.y; + Result[2][1] = v2.z; + Result[0][2] = v3.x; + Result[1][2] = v3.y; + Result[2][2] = v3.z; + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat3x3<T> rowMajor3( + const detail::tmat3x3<T>& m) + { + detail::tmat3x3<T> Result; + Result[0][0] = m[0][0]; + Result[0][1] = m[1][0]; + Result[0][2] = m[2][0]; + Result[1][0] = m[0][1]; + Result[1][1] = m[1][1]; + Result[1][2] = m[2][1]; + Result[2][0] = m[0][2]; + Result[2][1] = m[1][2]; + Result[2][2] = m[2][2]; + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> rowMajor4( + const detail::tvec4<T>& v1, + const detail::tvec4<T>& v2, + const detail::tvec4<T>& v3, + const detail::tvec4<T>& v4) + { + detail::tmat4x4<T> Result; + Result[0][0] = v1.x; + Result[1][0] = v1.y; + Result[2][0] = v1.z; + Result[3][0] = v1.w; + Result[0][1] = v2.x; + Result[1][1] = v2.y; + Result[2][1] = v2.z; + Result[3][1] = v2.w; + Result[0][2] = v3.x; + Result[1][2] = v3.y; + Result[2][2] = v3.z; + Result[3][2] = v3.w; + Result[0][3] = v4.x; + Result[1][3] = v4.y; + Result[2][3] = v4.z; + Result[3][3] = v4.w; + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> rowMajor4( + const detail::tmat4x4<T>& m) + { + detail::tmat4x4<T> Result; + Result[0][0] = m[0][0]; + Result[0][1] = m[1][0]; + Result[0][2] = m[2][0]; + Result[0][3] = m[3][0]; + Result[1][0] = m[0][1]; + Result[1][1] = m[1][1]; + Result[1][2] = m[2][1]; + Result[1][3] = m[3][1]; + Result[2][0] = m[0][2]; + Result[2][1] = m[1][2]; + Result[2][2] = m[2][2]; + Result[2][3] = m[3][2]; + Result[3][0] = m[0][3]; + Result[3][1] = m[1][3]; + Result[3][2] = m[2][3]; + Result[3][3] = m[3][3]; + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat2x2<T> colMajor2( + const detail::tvec2<T>& v1, + const detail::tvec2<T>& v2) + { + return detail::tmat2x2<T>(v1, v2); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat2x2<T> colMajor2( + const detail::tmat2x2<T>& m) + { + return detail::tmat2x2<T>(m); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat3x3<T> colMajor3( + const detail::tvec3<T>& v1, + const detail::tvec3<T>& v2, + const detail::tvec3<T>& v3) + { + return detail::tmat3x3<T>(v1, v2, v3); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat3x3<T> colMajor3( + const detail::tmat3x3<T>& m) + { + return detail::tmat3x3<T>(m); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> colMajor4( + const detail::tvec4<T>& v1, + const detail::tvec4<T>& v2, + const detail::tvec4<T>& v3, + const detail::tvec4<T>& v4) + { + return detail::tmat4x4<T>(v1, v2, v3, v4); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> colMajor4( + const detail::tmat4x4<T>& m) + { + return detail::tmat4x4<T>(m); + } +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/matrix_operation.hpp b/include/gal/opengl/glm/gtx/matrix_operation.hpp new file mode 100644 index 0000000..8a57324 --- /dev/null +++ b/include/gal/opengl/glm/gtx/matrix_operation.hpp @@ -0,0 +1,112 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_matrix_operation +/// @file glm/gtx/matrix_operation.hpp +/// @date 2009-08-29 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// +/// @defgroup gtx_matrix_operation GLM_GTX_matrix_operation +/// @ingroup gtx +/// +/// @brief Build diagonal matrices from vectors. +/// +/// <glm/gtx/matrix_operation.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_matrix_operation +#define GLM_GTX_matrix_operation GLM_VERSION + +// Dependency: +#include "../glm.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_matrix_operation extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_matrix_operation + /// @{ + + //! Build a diagonal matrix. + //! From GLM_GTX_matrix_operation extension. + template <typename valType> + detail::tmat2x2<valType> diagonal2x2( + detail::tvec2<valType> const & v); + + //! Build a diagonal matrix. + //! From GLM_GTX_matrix_operation extension. + template <typename valType> + detail::tmat2x3<valType> diagonal2x3( + detail::tvec2<valType> const & v); + + //! Build a diagonal matrix. + //! From GLM_GTX_matrix_operation extension. + template <typename valType> + detail::tmat2x4<valType> diagonal2x4( + detail::tvec2<valType> const & v); + + //! Build a diagonal matrix. + //! From GLM_GTX_matrix_operation extension. + template <typename valType> + detail::tmat3x2<valType> diagonal3x2( + detail::tvec2<valType> const & v); + + //! Build a diagonal matrix. + //! From GLM_GTX_matrix_operation extension. + template <typename valType> + detail::tmat3x3<valType> diagonal3x3( + detail::tvec3<valType> const & v); + + //! Build a diagonal matrix. + //! From GLM_GTX_matrix_operation extension. + template <typename valType> + detail::tmat3x4<valType> diagonal3x4( + detail::tvec3<valType> const & v); + + //! Build a diagonal matrix. + //! From GLM_GTX_matrix_operation extension. + template <typename valType> + detail::tmat4x2<valType> diagonal4x2( + detail::tvec2<valType> const & v); + + //! Build a diagonal matrix. + //! From GLM_GTX_matrix_operation extension. + template <typename valType> + detail::tmat4x3<valType> diagonal4x3( + detail::tvec3<valType> const & v); + + //! Build a diagonal matrix. + //! From GLM_GTX_matrix_operation extension. + template <typename valType> + detail::tmat4x4<valType> diagonal4x4( + detail::tvec4<valType> const & v); + + /// @} +}//namespace glm + +#include "matrix_operation.inl" + +#endif//GLM_GTX_matrix_operation diff --git a/include/gal/opengl/glm/gtx/matrix_operation.inl b/include/gal/opengl/glm/gtx/matrix_operation.inl new file mode 100644 index 0000000..37b2b02 --- /dev/null +++ b/include/gal/opengl/glm/gtx/matrix_operation.inl @@ -0,0 +1,124 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2009-08-29 +// Updated : 2009-08-29 +// Licence : This source is under MIT License +// File : glm/gtx/matrix_operation.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template <typename valType> + GLM_FUNC_QUALIFIER detail::tmat2x2<valType> diagonal2x2 + ( + detail::tvec2<valType> const & v + ) + { + detail::tmat2x2<valType> Result(valType(1)); + Result[0][0] = v[0]; + Result[1][1] = v[1]; + return Result; + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tmat2x3<valType> diagonal2x3 + ( + detail::tvec2<valType> const & v + ) + { + detail::tmat2x3<valType> Result(valType(1)); + Result[0][0] = v[0]; + Result[1][1] = v[1]; + return Result; + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tmat2x4<valType> diagonal2x4 + ( + detail::tvec2<valType> const & v + ) + { + detail::tmat2x4<valType> Result(valType(1)); + Result[0][0] = v[0]; + Result[1][1] = v[1]; + return Result; + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tmat3x2<valType> diagonal3x2 + ( + detail::tvec2<valType> const & v + ) + { + detail::tmat3x2<valType> Result(valType(1)); + Result[0][0] = v[0]; + Result[1][1] = v[1]; + return Result; + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tmat3x3<valType> diagonal3x3 + ( + detail::tvec3<valType> const & v + ) + { + detail::tmat3x3<valType> Result(valType(1)); + Result[0][0] = v[0]; + Result[1][1] = v[1]; + Result[2][2] = v[2]; + return Result; + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tmat3x4<valType> diagonal3x4 + ( + detail::tvec3<valType> const & v + ) + { + detail::tmat3x4<valType> Result(valType(1)); + Result[0][0] = v[0]; + Result[1][1] = v[1]; + Result[2][2] = v[2]; + return Result; + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tmat4x4<valType> diagonal4x4 + ( + detail::tvec4<valType> const & v + ) + { + detail::tmat4x4<valType> Result(valType(1)); + Result[0][0] = v[0]; + Result[1][1] = v[1]; + Result[2][2] = v[2]; + Result[3][3] = v[3]; + return Result; + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tmat4x3<valType> diagonal4x3 + ( + detail::tvec3<valType> const & v + ) + { + detail::tmat4x3<valType> Result(valType(1)); + Result[0][0] = v[0]; + Result[1][1] = v[1]; + Result[2][2] = v[2]; + return Result; + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tmat4x2<valType> diagonal4x2 + ( + detail::tvec2<valType> const & v + ) + { + detail::tmat4x2<valType> Result(valType(1)); + Result[0][0] = v[0]; + Result[1][1] = v[1]; + return Result; + } +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/matrix_query.hpp b/include/gal/opengl/glm/gtx/matrix_query.hpp new file mode 100644 index 0000000..bba233b --- /dev/null +++ b/include/gal/opengl/glm/gtx/matrix_query.hpp @@ -0,0 +1,117 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_matrix_query +/// @file glm/gtx/matrix_query.hpp +/// @date 2007-03-05 / 2011-08-28 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// @see gtx_vector_query (dependence) +/// +/// @defgroup gtx_matrix_query GLM_GTX_matrix_query +/// @ingroup gtx +/// +/// @brief Query to evaluate matrix properties +/// +/// <glm/gtx/matrix_query.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_matrix_query +#define GLM_GTX_matrix_query GLM_VERSION + +// Dependency: +#include "../glm.hpp" +#include "../gtx/vector_query.hpp" +#include <limits> + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_matrix_query extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_matrix_query + /// @{ + + /// Return whether a matrix a null matrix. + /// From GLM_GTX_matrix_query extension. + template<typename T> + bool isNull( + detail::tmat2x2<T> const & m, + T const & epsilon/* = std::numeric_limits<T>::epsilon()*/); + + /// Return whether a matrix a null matrix. + /// From GLM_GTX_matrix_query extension. + template<typename T> + bool isNull( + detail::tmat3x3<T> const & m, + T const & epsilon/* = std::numeric_limits<T>::epsilon()*/); + + /// Return whether a matrix is a null matrix. + /// From GLM_GTX_matrix_query extension. + template<typename T> + bool isNull( + detail::tmat4x4<T> const & m, + T const & epsilon/* = std::numeric_limits<T>::epsilon()*/); + + /// Return whether a matrix is an identity matrix. + /// From GLM_GTX_matrix_query extension. + template<typename genType> + bool isIdentity( + genType const & m, + typename genType::value_type const & epsilon/* = std::numeric_limits<typename genType::value_type>::epsilon()*/); + + /// Return whether a matrix is a normalized matrix. + /// From GLM_GTX_matrix_query extension. + template<typename valType> + bool isNormalized( + detail::tmat2x2<valType> const & m, + valType const & epsilon/* = std::numeric_limits<valType>::epsilon()*/); + + /// Return whether a matrix is a normalized matrix. + /// From GLM_GTX_matrix_query extension. + template<typename valType> + bool isNormalized( + detail::tmat3x3<valType> const & m, + valType const & epsilon/* = std::numeric_limits<valType>::epsilon()*/); + + /// Return whether a matrix is a normalized matrix. + /// From GLM_GTX_matrix_query extension. + template<typename valType> + bool isNormalized( + detail::tmat4x4<valType> const & m, + valType const & epsilon/* = std::numeric_limits<valType>::epsilon()*/); + + /// Return whether a matrix is an orthonormalized matrix. + /// From GLM_GTX_matrix_query extension. + template<typename valType, template <typename> class matType> + bool isOrthogonal( + matType<valType> const & m, + valType const & epsilon/* = std::numeric_limits<genType>::epsilon()*/); + + /// @} +}//namespace glm + +#include "matrix_query.inl" + +#endif//GLM_GTX_matrix_query diff --git a/include/gal/opengl/glm/gtx/matrix_query.inl b/include/gal/opengl/glm/gtx/matrix_query.inl new file mode 100644 index 0000000..6db3391 --- /dev/null +++ b/include/gal/opengl/glm/gtx/matrix_query.inl @@ -0,0 +1,154 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2007-03-05 +// Updated : 2007-03-05 +// Licence : This source is under MIT License +// File : glm/gtx/matrix_query.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Dependency: +// - GLM core +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template<typename T> + GLM_FUNC_QUALIFIER bool isNull + ( + detail::tmat2x2<T> const & m, + T const & epsilon) + { + bool result = true; + for(int i = 0; result && i < 2 ; ++i) + result = isNull(m[i], epsilon); + return result; + } + + template<typename T> + GLM_FUNC_QUALIFIER bool isNull + ( + detail::tmat3x3<T> const & m, + T const & epsilon + ) + { + bool result = true; + for(int i = 0; result && i < 3 ; ++i) + result = isNull(m[i], epsilon); + return result; + } + + template<typename T> + GLM_FUNC_QUALIFIER bool isNull + ( + detail::tmat4x4<T> const & m, + T const & epsilon + ) + { + bool result = true; + for(int i = 0; result && i < 4 ; ++i) + result = isNull(m[i], epsilon); + return result; + } + + template<typename genType> + GLM_FUNC_QUALIFIER bool isIdentity + ( + genType const & m, + typename genType::value_type const & epsilon + ) + { + bool result = true; + for(typename genType::size_type i = typename genType::size_type(0); result && i < genType::col_size(); ++i) + { + for(typename genType::size_type j = typename genType::size_type(0); result && j < i ; ++j) + result = abs(m[i][j]) <= epsilon; + if(result) + result = abs(m[i][i] - typename genType::value_type(1)) <= epsilon; + for(typename genType::size_type j = i + typename genType::size_type(1); result && j < genType::row_size(); ++j) + result = abs(m[i][j]) <= epsilon; + } + return result; + } + + template<typename genType> + GLM_FUNC_QUALIFIER bool isNormalized + ( + detail::tmat2x2<genType> const & m, + genType const & epsilon + ) + { + bool result(true); + for(typename detail::tmat2x2<genType>::size_type i(0); result && i < m.length(); ++i) + result = isNormalized(m[i], epsilon); + for(typename detail::tmat2x2<genType>::size_type i(0); result && i < m.length(); ++i) + { + typename detail::tmat2x2<genType>::col_type v; + for(typename detail::tmat2x2<genType>::size_type j(0); j < m.length(); ++j) + v[j] = m[j][i]; + result = isNormalized(v, epsilon); + } + return result; + } + + template<typename genType> + GLM_FUNC_QUALIFIER bool isNormalized + ( + detail::tmat3x3<genType> const & m, + genType const & epsilon + ) + { + bool result(true); + for(typename detail::tmat3x3<genType>::size_type i(0); result && i < m.length(); ++i) + result = isNormalized(m[i], epsilon); + for(typename detail::tmat3x3<genType>::size_type i(0); result && i < m.length(); ++i) + { + typename detail::tmat3x3<genType>::col_type v; + for(typename detail::tmat3x3<genType>::size_type j(0); j < m.length(); ++j) + v[j] = m[j][i]; + result = isNormalized(v, epsilon); + } + return result; + } + + template<typename genType> + GLM_FUNC_QUALIFIER bool isNormalized + ( + detail::tmat4x4<genType> const & m, + genType const & epsilon + ) + { + bool result(true); + for(typename detail::tmat4x4<genType>::size_type i(0); result && i < m.length(); ++i) + result = isNormalized(m[i], epsilon); + for(typename detail::tmat4x4<genType>::size_type i(0); result && i < m.length(); ++i) + { + typename detail::tmat4x4<genType>::col_type v; + for(typename detail::tmat4x4<genType>::size_type j(0); j < m.length(); ++j) + v[j] = m[j][i]; + result = isNormalized(v, epsilon); + } + return result; + } + + template<typename genType, template <typename> class matType> + GLM_FUNC_QUALIFIER bool isOrthogonal + ( + matType<genType> const & m, + genType const & epsilon + ) + { + bool result(true); + for(typename matType<genType>::size_type i(0); result && i < m.length() - 1; ++i) + for(typename matType<genType>::size_type j(i + 1); result && j < m.length(); ++j) + result = areOrthogonal(m[i], m[j], epsilon); + + if(result) + { + matType<genType> tmp = transpose(m); + for(typename matType<genType>::size_type i(0); result && i < m.length() - 1 ; ++i) + for(typename matType<genType>::size_type j(i + 1); result && j < m.length(); ++j) + result = areOrthogonal(tmp[i], tmp[j], epsilon); + } + return result; + } +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/mixed_product.hpp b/include/gal/opengl/glm/gtx/mixed_product.hpp new file mode 100644 index 0000000..b222271 --- /dev/null +++ b/include/gal/opengl/glm/gtx/mixed_product.hpp @@ -0,0 +1,65 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_mixed_product +/// @file glm/gtx/mixed_product.hpp +/// @date 2007-04-03 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// +/// @defgroup gtx_mixed_product GLM_GTX_mixed_producte +/// @ingroup gtx +/// +/// @brief Mixed product of 3 vectors. +/// +/// <glm/gtx/mixed_product.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_mixed_product +#define GLM_GTX_mixed_product GLM_VERSION + +// Dependency: +#include "../glm.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_mixed_product extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_mixed_product + /// @{ + + /// @brief Mixed product of 3 vectors (from GLM_GTX_mixed_product extension) + template <typename valType> + valType mixedProduct( + detail::tvec3<valType> const & v1, + detail::tvec3<valType> const & v2, + detail::tvec3<valType> const & v3); + + /// @} +}// namespace glm + +#include "mixed_product.inl" + +#endif//GLM_GTX_mixed_product diff --git a/include/gal/opengl/glm/gtx/mixed_product.inl b/include/gal/opengl/glm/gtx/mixed_product.inl new file mode 100644 index 0000000..9c3a179 --- /dev/null +++ b/include/gal/opengl/glm/gtx/mixed_product.inl @@ -0,0 +1,22 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2007-04-03 +// Updated : 2008-09-17 +// Licence : This source is under MIT License +// File : glm/gtx/mixed_product.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template <typename valType> + GLM_FUNC_QUALIFIER valType mixedProduct + ( + detail::tvec3<valType> const & v1, + detail::tvec3<valType> const & v2, + detail::tvec3<valType> const & v3 + ) + { + return dot(cross(v1, v2), v3); + } +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/multiple.hpp b/include/gal/opengl/glm/gtx/multiple.hpp new file mode 100644 index 0000000..0092802 --- /dev/null +++ b/include/gal/opengl/glm/gtx/multiple.hpp @@ -0,0 +1,73 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_multiple +/// @file glm/gtx/multiple.hpp +/// @date 2009-10-26 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// @see gtx_extented_min_max (dependence) +/// +/// @defgroup gtx_multiple GLM_GTX_multiple +/// @ingroup gtx +/// +/// @brief Find the closest number of a number multiple of other number. +/// +/// <glm/gtx/multiple.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_multiple +#define GLM_GTX_multiple GLM_VERSION + +// Dependency: +#include "../glm.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_multiple extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_multiple + /// @{ + + //! Higher Multiple number of Source. + //! From GLM_GTX_multiple extension. + template <typename genType> + genType higherMultiple( + genType const & Source, + genType const & Multiple); + + //! Lower Multiple number of Source. + //! From GLM_GTX_multiple extension. + template <typename genType> + genType lowerMultiple( + genType const & Source, + genType const & Multiple); + + /// @} +}//namespace glm + +#include "multiple.inl" + +#endif//GLM_GTX_multiple diff --git a/include/gal/opengl/glm/gtx/multiple.inl b/include/gal/opengl/glm/gtx/multiple.inl new file mode 100644 index 0000000..e7d25b0 --- /dev/null +++ b/include/gal/opengl/glm/gtx/multiple.inl @@ -0,0 +1,128 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2009-10-26 +// Updated : 2011-06-07 +// Licence : This source is under MIT License +// File : glm/gtx/multiple.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Dependency: +// - GLM core +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + ////////////////////// + // higherMultiple + + template <typename genType> + GLM_FUNC_QUALIFIER genType higherMultiple + ( + genType const & Source, + genType const & Multiple + ) + { + if (Source > 0) + { + genType Tmp = Source - 1; + return Tmp + (Multiple - (Tmp % Multiple)); + } + else + return Source + (-Source % Multiple); + } + + template <> + GLM_FUNC_QUALIFIER detail::half higherMultiple + ( + detail::half const & SourceH, + detail::half const & MultipleH + ) + { + float Source = SourceH.toFloat(); + float Multiple = MultipleH.toFloat(); + + int Tmp = int(float(Source)) % int(Multiple); + return detail::half(Tmp ? Source + Multiple - float(Tmp) : Source); + } + + template <> + GLM_FUNC_QUALIFIER float higherMultiple + ( + float const & Source, + float const & Multiple + ) + { + int Tmp = int(Source) % int(Multiple); + return Tmp ? Source + Multiple - float(Tmp) : Source; + } + + template <> + GLM_FUNC_QUALIFIER double higherMultiple + ( + double const & Source, + double const & Multiple + ) + { + long Tmp = long(Source) % long(Multiple); + return Tmp ? Source + Multiple - double(Tmp) : Source; + } + + VECTORIZE_VEC_VEC(higherMultiple) + + ////////////////////// + // lowerMultiple + + template <typename genType> + GLM_FUNC_QUALIFIER genType lowerMultiple + ( + genType const & Source, + genType const & Multiple + ) + { + if (Source >= 0) + return Source - Source % Multiple; + else + { + genType Tmp = Source + 1; + return Tmp - Tmp % Multiple - Multiple; + } + } + + template <> + GLM_FUNC_QUALIFIER detail::half lowerMultiple + ( + detail::half const & SourceH, + detail::half const & MultipleH + ) + { + float Source = SourceH.toFloat(); + float Multiple = MultipleH.toFloat(); + + int Tmp = int(float(Source)) % int(float(Multiple)); + return detail::half(Tmp ? Source - float(Tmp) : Source); + } + + template <> + GLM_FUNC_QUALIFIER float lowerMultiple + ( + float const & Source, + float const & Multiple + ) + { + int Tmp = int(Source) % int(Multiple); + return Tmp ? Source - float(Tmp) : Source; + } + + template <> + GLM_FUNC_QUALIFIER double lowerMultiple + ( + double const & Source, + double const & Multiple + ) + { + long Tmp = long(Source) % long(Multiple); + return Tmp ? Source - double(Tmp) : Source; + } + + VECTORIZE_VEC_VEC(lowerMultiple) +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/noise.hpp b/include/gal/opengl/glm/gtx/noise.hpp new file mode 100644 index 0000000..f081dac --- /dev/null +++ b/include/gal/opengl/glm/gtx/noise.hpp @@ -0,0 +1,29 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/////////////////////////////////////////////////////////////////////////////////// + +#if(defined(GLM_MESSAGES)) +# pragma message("GLM: GLM_GTX_random extension is deprecated, include GLM_GTC_random (glm/gtc/noise.hpp) instead") +#endif + +// Promoted: +#include "../gtc/noise.hpp" diff --git a/include/gal/opengl/glm/gtx/norm.hpp b/include/gal/opengl/glm/gtx/norm.hpp new file mode 100644 index 0000000..2b065f4 --- /dev/null +++ b/include/gal/opengl/glm/gtx/norm.hpp @@ -0,0 +1,133 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_norm +/// @file glm/gtx/norm.hpp +/// @date 2005-12-21 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// @see gtx_quaternion (dependence) +/// +/// @defgroup gtx_norm GLM_GTX_norm +/// @ingroup gtx +/// +/// @brief Various ways to compute vector norms. +/// +/// <glm/gtx/norm.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_norm +#define GLM_GTX_norm GLM_VERSION + +// Dependency: +#include "../glm.hpp" +#include "../gtx/quaternion.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_norm extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_norm + /// @{ + + //! Returns the squared length of x. + //! From GLM_GTX_norm extension. + template <typename T> + T length2( + T const & x); + + //! Returns the squared length of x. + //! From GLM_GTX_norm extension. + template <typename genType> + typename genType::value_type length2( + genType const & x); + + //! Returns the squared length of x. + //! From GLM_GTX_norm extension. + template <typename T> + T length2( + detail::tquat<T> const & q); + + //! Returns the squared distance between p0 and p1, i.e., length(p0 - p1). + //! From GLM_GTX_norm extension. + template <typename T> + T distance2( + T const & p0, + T const & p1); + + //! Returns the squared distance between p0 and p1, i.e., length(p0 - p1). + //! From GLM_GTX_norm extension. + template <typename genType> + typename genType::value_type distance2( + genType const & p0, + genType const & p1); + + //! Returns the L1 norm between x and y. + //! From GLM_GTX_norm extension. + template <typename T> + T l1Norm( + detail::tvec3<T> const & x, + detail::tvec3<T> const & y); + + //! Returns the L1 norm of v. + //! From GLM_GTX_norm extension. + template <typename T> + T l1Norm( + detail::tvec3<T> const & v); + + //! Returns the L2 norm between x and y. + //! From GLM_GTX_norm extension. + template <typename T> + T l2Norm( + detail::tvec3<T> const & x, + detail::tvec3<T> const & y); + + //! Returns the L2 norm of v. + //! From GLM_GTX_norm extension. + template <typename T> + T l2Norm( + detail::tvec3<T> const & x); + + //! Returns the L norm between x and y. + //! From GLM_GTX_norm extension. + template <typename T> + T lxNorm( + detail::tvec3<T> const & x, + detail::tvec3<T> const & y, + unsigned int Depth); + + //! Returns the L norm of v. + //! From GLM_GTX_norm extension. + template <typename T> + T lxNorm( + detail::tvec3<T> const & x, + unsigned int Depth); + + /// @} +}//namespace glm + +#include "norm.inl" + +#endif//GLM_GTX_norm diff --git a/include/gal/opengl/glm/gtx/norm.inl b/include/gal/opengl/glm/gtx/norm.inl new file mode 100644 index 0000000..427a5a1 --- /dev/null +++ b/include/gal/opengl/glm/gtx/norm.inl @@ -0,0 +1,156 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2005-12-21 +// Updated : 2008-07-24 +// Licence : This source is under MIT License +// File : glm/gtx/norm.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template <typename T> + GLM_FUNC_QUALIFIER T length2 + ( + T const & x + ) + { + return x * x; + } + + template <typename T> + GLM_FUNC_QUALIFIER T length2 + ( + detail::tvec2<T> const & x + ) + { + return dot(x, x); + } + + template <typename T> + GLM_FUNC_QUALIFIER T length2 + ( + detail::tvec3<T> const & x + ) + { + return dot(x, x); + } + + template <typename T> + GLM_FUNC_QUALIFIER T length2 + ( + detail::tvec4<T> const & x + ) + { + return dot(x, x); + } + + template <typename T> + GLM_FUNC_QUALIFIER T length2 + ( + detail::tquat<T> const & q + ) + { + return q.x * q.x + q.y * q.y + q.z * q.z + q.w * q.w; + } + + template <typename T> + GLM_FUNC_QUALIFIER T distance2 + ( + T const & p0, + T const & p1 + ) + { + return length2(p1 - p0); + } + + template <typename T> + GLM_FUNC_QUALIFIER T distance2 + ( + detail::tvec2<T> const & p0, + detail::tvec2<T> const & p1 + ) + { + return length2(p1 - p0); + } + + template <typename T> + GLM_FUNC_QUALIFIER T distance2 + ( + detail::tvec3<T> const & p0, + detail::tvec3<T> const & p1 + ) + { + return length2(p1 - p0); + } + + template <typename T> + GLM_FUNC_QUALIFIER T distance2 + ( + detail::tvec4<T> const & p0, + detail::tvec4<T> const & p1 + ) + { + return length2(p1 - p0); + } + + template <typename T> + GLM_FUNC_QUALIFIER T l1Norm + ( + detail::tvec3<T> const & a, + detail::tvec3<T> const & b + ) + { + return abs(b.x - a.x) + abs(b.y - a.y) + abs(b.z - a.z); + } + + template <typename T> + GLM_FUNC_QUALIFIER T l1Norm + ( + detail::tvec3<T> const & v + ) + { + return abs(v.x) + abs(v.y) + abs(v.z); + } + + template <typename T> + GLM_FUNC_QUALIFIER T l2Norm + ( + detail::tvec3<T> const & a, + detail::tvec3<T> const & b + ) + { + return length(b - a); + } + + template <typename T> + GLM_FUNC_QUALIFIER T l2Norm + ( + detail::tvec3<T> const & v + ) + { + return length(v); + } + + template <typename T> + GLM_FUNC_QUALIFIER T lxNorm + ( + detail::tvec3<T> const & x, + detail::tvec3<T> const & y, + unsigned int Depth + ) + { + return pow(pow(y.x - x.x, T(Depth)) + pow(y.y - x.y, T(Depth)) + pow(y.z - x.z, T(Depth)), T(1) / T(Depth)); + } + + template <typename T> + GLM_FUNC_QUALIFIER T lxNorm + ( + detail::tvec3<T> const & v, + unsigned int Depth + ) + { + return pow(pow(v.x, T(Depth)) + pow(v.y, T(Depth)) + pow(v.z, T(Depth)), T(1) / T(Depth)); + } + +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/normal.hpp b/include/gal/opengl/glm/gtx/normal.hpp new file mode 100644 index 0000000..a04e304 --- /dev/null +++ b/include/gal/opengl/glm/gtx/normal.hpp @@ -0,0 +1,67 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_normal +/// @file glm/gtx/normal.hpp +/// @date 2005-12-21 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// @see gtx_extented_min_max (dependence) +/// +/// @defgroup gtx_normal GLM_GTX_normal +/// @ingroup gtx +/// +/// @brief Compute the normal of a triangle. +/// +/// <glm/gtx/normal.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_normal +#define GLM_GTX_normal GLM_VERSION + +// Dependency: +#include "../glm.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_normal extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_normal + /// @{ + + //! Computes triangle normal from triangle points. + //! From GLM_GTX_normal extension. + template <typename T> + detail::tvec3<T> triangleNormal( + detail::tvec3<T> const & p1, + detail::tvec3<T> const & p2, + detail::tvec3<T> const & p3); + + /// @} +}//namespace glm + +#include "normal.inl" + +#endif//GLM_GTX_normal diff --git a/include/gal/opengl/glm/gtx/normal.inl b/include/gal/opengl/glm/gtx/normal.inl new file mode 100644 index 0000000..5aedcc7 --- /dev/null +++ b/include/gal/opengl/glm/gtx/normal.inl @@ -0,0 +1,22 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2005-12-21 +// Updated : 2011-06-07 +// Licence : This source is under MIT License +// File : glm/gtx/normal.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> triangleNormal + ( + detail::tvec3<T> const & p1, + detail::tvec3<T> const & p2, + detail::tvec3<T> const & p3 + ) + { + return normalize(cross(p1 - p2, p1 - p3)); + } +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/normalize_dot.hpp b/include/gal/opengl/glm/gtx/normalize_dot.hpp new file mode 100644 index 0000000..1ba027a --- /dev/null +++ b/include/gal/opengl/glm/gtx/normalize_dot.hpp @@ -0,0 +1,76 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_normalize_dot +/// @file glm/gtx/normalize_dot.hpp +/// @date 2007-09-28 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// @see gtx_fast_square_root (dependence) +/// +/// @defgroup gtx_normalize_dot GLM_GTX_normalize_dot +/// @ingroup gtx +/// +/// @brief Dot product of vectors that need to be normalize with a single square root. +/// +/// <glm/gtx/normalized_dot.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_normalize_dot +#define GLM_GTX_normalize_dot GLM_VERSION + +// Dependency: +#include "../glm.hpp" +#include "../gtx/fast_square_root.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_normalize_dot extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_normalize_dot + /// @{ + + //! Normalize parameters and returns the dot product of x and y. + //! It's faster that dot(normalize(x), normalize(y)). + //! From GLM_GTX_normalize_dot extension. + template <typename genType> + typename genType::value_type normalizeDot( + genType const & x, + genType const & y); + + //! Normalize parameters and returns the dot product of x and y. + //! Faster that dot(fastNormalize(x), fastNormalize(y)). + //! From GLM_GTX_normalize_dot extension. + template <typename genType> + typename genType::value_type fastNormalizeDot( + genType const & x, + genType const & y); + + /// @} +}//namespace glm + +#include "normalize_dot.inl" + +#endif//GLM_GTX_normalize_dot diff --git a/include/gal/opengl/glm/gtx/normalize_dot.inl b/include/gal/opengl/glm/gtx/normalize_dot.inl new file mode 100644 index 0000000..5058eac --- /dev/null +++ b/include/gal/opengl/glm/gtx/normalize_dot.inl @@ -0,0 +1,115 @@ +////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +////////////////////////////////////////////////////////////////////////////////// +// Created : 2007-09-28 +// Updated : 2008-10-07 +// Licence : This source is under MIT License +// File : glm/gtx/normalize_dot.inl +////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template <typename genType> + GLM_FUNC_QUALIFIER genType normalizeDot + ( + genType const & x, + genType const & y + ) + { + return + glm::dot(x, y) * + glm::inversesqrt(glm::dot(x, x) * + glm::dot(y, y)); + } + + template <typename valType> + GLM_FUNC_QUALIFIER valType normalizeDot + ( + detail::tvec2<valType> const & x, + detail::tvec2<valType> const & y + ) + { + return + glm::dot(x, y) * + glm::inversesqrt(glm::dot(x, x) * + glm::dot(y, y)); + } + + template <typename valType> + GLM_FUNC_QUALIFIER valType normalizeDot + ( + detail::tvec3<valType> const & x, + detail::tvec3<valType> const & y + ) + { + return + glm::dot(x, y) * + glm::inversesqrt(glm::dot(x, x) * + glm::dot(y, y)); + } + + template <typename valType> + GLM_FUNC_QUALIFIER valType normalizeDot + ( + detail::tvec4<valType> const & x, + detail::tvec4<valType> const & y + ) + { + return + glm::dot(x, y) * + glm::inversesqrt(glm::dot(x, x) * + glm::dot(y, y)); + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType fastNormalizeDot + ( + genType const & x, + genType const & y + ) + { + return + glm::dot(x, y) * + fastInverseSqrt(glm::dot(x, x) * + glm::dot(y, y)); + } + + template <typename valType> + GLM_FUNC_QUALIFIER valType fastNormalizeDot + ( + detail::tvec2<valType> const & x, + detail::tvec2<valType> const & y + ) + { + return + glm::dot(x, y) * + fastInverseSqrt(glm::dot(x, x) * + glm::dot(y, y)); + } + + template <typename valType> + GLM_FUNC_QUALIFIER valType fastNormalizeDot + ( + detail::tvec3<valType> const & x, + detail::tvec3<valType> const & y + ) + { + return + glm::dot(x, y) * + fastInverseSqrt(glm::dot(x, x) * + glm::dot(y, y)); + } + + template <typename valType> + GLM_FUNC_QUALIFIER valType fastNormalizeDot + ( + detail::tvec4<valType> const & x, + detail::tvec4<valType> const & y + ) + { + return + glm::dot(x, y) * + fastInverseSqrt(glm::dot(x, x) * + glm::dot(y, y)); + } +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/number_precision.hpp b/include/gal/opengl/glm/gtx/number_precision.hpp new file mode 100644 index 0000000..1597936 --- /dev/null +++ b/include/gal/opengl/glm/gtx/number_precision.hpp @@ -0,0 +1,88 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_number_precision +/// @file glm/gtx/number_precision.hpp +/// @date 2007-05-10 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// @see gtc_type_precision (dependence) +/// @see gtc_quaternion (dependence) +/// +/// @defgroup gtx_number_precision GLM_GTX_number_precision +/// @ingroup gtx +/// +/// @brief Defined size types. +/// +/// <glm/gtx/number_precision.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_number_precision +#define GLM_GTX_number_precision GLM_VERSION + +// Dependency: +#include "../glm.hpp" +#include "../gtc/type_precision.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_number_precision extension included") +#endif + +namespace glm{ +namespace gtx +{ + ///////////////////////////// + // Unsigned int vector types + + /// @addtogroup gtx_number_precision + /// @{ + + typedef u8 u8vec1; //!< \brief 8bit unsigned integer scalar. (from GLM_GTX_number_precision extension) + typedef u16 u16vec1; //!< \brief 16bit unsigned integer scalar. (from GLM_GTX_number_precision extension) + typedef u32 u32vec1; //!< \brief 32bit unsigned integer scalar. (from GLM_GTX_number_precision extension) + typedef u64 u64vec1; //!< \brief 64bit unsigned integer scalar. (from GLM_GTX_number_precision extension) + + ////////////////////// + // Float vector types + + typedef f16 f16vec1; //!< \brief Half-precision floating-point scalar. (from GLM_GTX_number_precision extension) + typedef f32 f32vec1; //!< \brief Single-precision floating-point scalar. (from GLM_GTX_number_precision extension) + typedef f64 f64vec1; //!< \brief Single-precision floating-point scalar. (from GLM_GTX_number_precision extension) + + ////////////////////// + // Float matrix types + + typedef f16 f16mat1; //!< \brief Half-precision floating-point scalar. (from GLM_GTX_number_precision extension) + typedef f16 f16mat1x1; //!< \brief Half-precision floating-point scalar. (from GLM_GTX_number_precision extension) + typedef f32 f32mat1; //!< \brief Single-precision floating-point scalar. (from GLM_GTX_number_precision extension) + typedef f32 f32mat1x1; //!< \brief Single-precision floating-point scalar. (from GLM_GTX_number_precision extension) + typedef f64 f64mat1; //!< \brief Double-precision floating-point scalar. (from GLM_GTX_number_precision extension) + typedef f64 f64mat1x1; //!< \brief Double-precision floating-point scalar. (from GLM_GTX_number_precision extension) + + /// @} +}//namespace gtx +}//namespace glm + +#include "number_precision.inl" + +#endif//GLM_GTX_number_precision diff --git a/include/gal/opengl/glm/gtx/number_precision.inl b/include/gal/opengl/glm/gtx/number_precision.inl new file mode 100644 index 0000000..3981856 --- /dev/null +++ b/include/gal/opengl/glm/gtx/number_precision.inl @@ -0,0 +1,13 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2007-05-10 +// Updated : 2007-05-10 +// Licence : This source is under MIT License +// File : glm/gtx/number_precision.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + +} diff --git a/include/gal/opengl/glm/gtx/ocl_type.hpp b/include/gal/opengl/glm/gtx/ocl_type.hpp new file mode 100644 index 0000000..7e8af09 --- /dev/null +++ b/include/gal/opengl/glm/gtx/ocl_type.hpp @@ -0,0 +1,132 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_ocl_type +/// @file glm/gtx/ocl_type.hpp +/// @date 2009-05-07 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// @see gtx_extented_min_max (dependence) +/// +/// @defgroup gtx_ocl_type GLM_GTX_ocl_type +/// @ingroup gtx +/// +/// @brief OpenCL types. +/// +/// <glm/gtx/ocl_type.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_ocl_type +#define GLM_GTX_ocl_type GLM_VERSION + +// Dependency: +#include "../glm.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_ocl_type extension included") +#endif + +namespace glm{ +namespace gtx +{ + /////////////////////////// + // Scalar types + + /// @addtogroup gtx_ocl_type + /// @{ + + typedef detail::int8 cl_char; //!< \brief 8bit signed integer. (from GLM_GTX_ocl_type extension) + typedef detail::int16 cl_short; //!< \brief 16bit signed integer. (from GLM_GTX_ocl_type extension) + typedef detail::int32 cl_int; //!< \brief 32bit signed integer. (from GLM_GTX_ocl_type extension) + typedef detail::int64 cl_long; //!< \brief 64bit signed integer. (from GLM_GTX_ocl_type extension) + + typedef detail::uint8 cl_uchar; //!< \brief 8bit signed integer. (from GLM_GTX_ocl_type extension) + typedef detail::uint16 cl_ushort; //!< \brief 16bit signed integer. (from GLM_GTX_ocl_type extension) + typedef detail::uint32 cl_uint; //!< \brief 32bit signed integer. (from GLM_GTX_ocl_type extension) + typedef detail::uint64 cl_ulong; //!< \brief 64bit signed integer. (from GLM_GTX_ocl_type extension) + + typedef detail::float16 cl_half; //!< \brief Half-precision floating-point scalar. (from GLM_GTX_ocl_type extension) + typedef detail::float32 cl_float; //!< \brief Single-precision floating-point scalar. (from GLM_GTX_ocl_type extension) + + + typedef detail::int8 cl_char1; //!< \brief 8bit signed integer. (from GLM_GTX_ocl_type extension) + typedef detail::int16 cl_short1; //!< \brief 16bit signed integer. (from GLM_GTX_ocl_type extension) + typedef detail::int32 cl_int1; //!< \brief 32bit signed integer. (from GLM_GTX_ocl_type extension) + typedef detail::int64 cl_long1; //!< \brief 64bit signed integer. (from GLM_GTX_ocl_type extension) + + typedef detail::uint8 cl_uchar1; //!< \brief 8bit signed integer. (from GLM_GTX_ocl_type extension) + typedef detail::uint16 cl_ushort1; //!< \brief 16bit signed integer. (from GLM_GTX_ocl_type extension) + typedef detail::uint32 cl_uint1; //!< \brief 32bit signed integer. (from GLM_GTX_ocl_type extension) + typedef detail::uint64 cl_ulong1; //!< \brief 64bit signed integer. (from GLM_GTX_ocl_type extension) + + //typedef detail::float16 cl_half1; //!< \brief Half-precision floating-point scalar. (from GLM_GTX_ocl_type extension) + typedef detail::float32 cl_float1; //!< \brief Single-precision floating-point scalar. (from GLM_GTX_ocl_type extension) + + + typedef detail::tvec2<detail::int8> cl_char2; //!< \brief 8bit signed integer. (from GLM_GTX_ocl_type extension) + typedef detail::tvec2<detail::int16> cl_short2; //!< \brief 16bit signed integer. (from GLM_GTX_ocl_type extension) + typedef detail::tvec2<detail::int32> cl_int2; //!< \brief 32bit signed integer. (from GLM_GTX_ocl_type extension) + typedef detail::tvec2<detail::int64> cl_long2; //!< \brief 64bit signed integer. (from GLM_GTX_ocl_type extension) + + typedef detail::tvec2<detail::uint8> cl_uchar2; //!< \brief 8bit signed integer. (from GLM_GTX_ocl_type extension) + typedef detail::tvec2<detail::uint16> cl_ushort2; //!< \brief 16bit signed integer. (from GLM_GTX_ocl_type extension) + typedef detail::tvec2<detail::uint32> cl_uint2; //!< \brief 32bit signed integer. (from GLM_GTX_ocl_type extension) + typedef detail::tvec2<detail::uint64> cl_ulong2; //!< \brief 64bit signed integer. (from GLM_GTX_ocl_type extension) + + //typedef detail::tvec2<detail::float16> cl_half2; //!< \brief Half-precision floating-point scalar. (from GLM_GTX_ocl_type extension) + typedef detail::tvec2<detail::float32> cl_float2; //!< \brief Single-precision floating-point scalar. (from GLM_GTX_ocl_type extension) + + + typedef detail::tvec3<detail::int8> cl_char3; //!< \brief 8bit signed integer. (from GLM_GTX_ocl_type extension) + typedef detail::tvec3<detail::int16> cl_short3; //!< \brief 16bit signed integer. (from GLM_GTX_ocl_type extension) + typedef detail::tvec3<detail::int32> cl_int3; //!< \brief 32bit signed integer. (from GLM_GTX_ocl_type extension) + typedef detail::tvec3<detail::int64> cl_long3; //!< \brief 64bit signed integer. (from GLM_GTX_ocl_type extension) + + typedef detail::tvec3<detail::uint8> cl_uchar3; //!< \brief 8bit signed integer. (from GLM_GTX_ocl_type extension) + typedef detail::tvec3<detail::uint16> cl_ushort3; //!< \brief 16bit signed integer. (from GLM_GTX_ocl_type extension) + typedef detail::tvec3<detail::uint32> cl_uint3; //!< \brief 32bit signed integer. (from GLM_GTX_ocl_type extension) + typedef detail::tvec3<detail::uint64> cl_ulong3; //!< \brief 64bit signed integer. (from GLM_GTX_ocl_type extension) + + //typedef detail::tvec3<detail::float16> cl_half3; //!< \brief Half-precision floating-point scalar. (from GLM_GTX_ocl_type extension) + typedef detail::tvec3<detail::float32> cl_float3; //!< \brief Single-precision floating-point scalar. (from GLM_GTX_ocl_type extension) + + + typedef detail::tvec4<detail::int8> cl_char4; //!< \brief 8bit signed integer. (from GLM_GTX_ocl_type extension) + typedef detail::tvec4<detail::int16> cl_short4; //!< \brief 16bit signed integer. (from GLM_GTX_ocl_type extension) + typedef detail::tvec4<detail::int32> cl_int4; //!< \brief 32bit signed integer. (from GLM_GTX_ocl_type extension) + typedef detail::tvec4<detail::int64> cl_long4; //!< \brief 64bit signed integer. (from GLM_GTX_ocl_type extension) + typedef detail::tvec4<detail::uint8> cl_uchar4; //!< \brief 8bit signed integer. (from GLM_GTX_ocl_type extension) + typedef detail::tvec4<detail::uint16> cl_ushort4; //!< \brief 16bit signed integer. (from GLM_GTX_ocl_type extension) + typedef detail::tvec4<detail::uint32> cl_uint4; //!< \brief 32bit signed integer. (from GLM_GTX_ocl_type extension) + typedef detail::tvec4<detail::uint64> cl_ulong4; //!< \brief 64bit signed integer. (from GLM_GTX_ocl_type extension) + + //typedef detail::tvec4<detail::float16> cl_half4; //!< \brief Half-precision floating-point scalar. (from GLM_GTX_ocl_type extension) + typedef detail::tvec4<detail::float32> cl_float4; //!< \brief Single-precision floating-point scalar. (from GLM_GTX_ocl_type extension) + + /// @} +}//namespace gtx +}//namespace glm + +#include "ocl_type.inl" + +#endif//GLM_GTX_ocl_type diff --git a/include/gal/opengl/glm/gtx/ocl_type.inl b/include/gal/opengl/glm/gtx/ocl_type.inl new file mode 100644 index 0000000..ac15145 --- /dev/null +++ b/include/gal/opengl/glm/gtx/ocl_type.inl @@ -0,0 +1,27 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_ocl_type +/// @file glm/gtx/ocl_type.inl +/// @date 2013-03-16 / 2013-03-16 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// diff --git a/include/gal/opengl/glm/gtx/optimum_pow.hpp b/include/gal/opengl/glm/gtx/optimum_pow.hpp new file mode 100644 index 0000000..d348473 --- /dev/null +++ b/include/gal/opengl/glm/gtx/optimum_pow.hpp @@ -0,0 +1,91 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_optimum_pow +/// @file glm/gtx/optimum_pow.hpp +/// @date 2005-12-21 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// +/// @defgroup gtx_optimum_pow GLM_GTX_optimum_pow +/// @ingroup gtx +/// +/// @brief Integer exponentiation of power functions. +/// +/// <glm/gtx/optimum_pow.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_optimum_pow +#define GLM_GTX_optimum_pow GLM_VERSION + +// Dependency: +#include "../glm.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_optimum_pow extension included") +#endif + +namespace glm{ +namespace gtx +{ + /// @addtogroup gtx_optimum_pow + /// @{ + + //! Returns x raised to the power of 2. + //! From GLM_GTX_optimum_pow extension. + template <typename genType> + genType pow2(const genType& x); + + //! Returns x raised to the power of 3. + //! From GLM_GTX_optimum_pow extension. + template <typename genType> + genType pow3(const genType& x); + + //! Returns x raised to the power of 4. + //! From GLM_GTX_optimum_pow extension. + template <typename genType> + genType pow4(const genType& x); + + //! Checks if the parameter is a power of 2 number. + //! From GLM_GTX_optimum_pow extension. + bool powOfTwo(int num); + + //! Checks to determine if the parameter component are power of 2 numbers. + //! From GLM_GTX_optimum_pow extension. + detail::tvec2<bool> powOfTwo(const detail::tvec2<int>& x); + + //! Checks to determine if the parameter component are power of 2 numbers. + //! From GLM_GTX_optimum_pow extension. + detail::tvec3<bool> powOfTwo(const detail::tvec3<int>& x); + + //! Checks to determine if the parameter component are power of 2 numbers. + //! From GLM_GTX_optimum_pow extension. + detail::tvec4<bool> powOfTwo(const detail::tvec4<int>& x); + + /// @} +}//namespace gtx +}//namespace glm + +#include "optimum_pow.inl" + +#endif//GLM_GTX_optimum_pow diff --git a/include/gal/opengl/glm/gtx/optimum_pow.inl b/include/gal/opengl/glm/gtx/optimum_pow.inl new file mode 100644 index 0000000..1e6f226 --- /dev/null +++ b/include/gal/opengl/glm/gtx/optimum_pow.inl @@ -0,0 +1,58 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2005-12-21 +// Updated : 2005-12-27 +// Licence : This source is under MIT License +// File : glm/gtx/optimum_pow.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template <typename genType> + GLM_FUNC_QUALIFIER genType pow2(const genType& x) + { + return x * x; + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType pow3(const genType& x) + { + return x * x * x; + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType pow4(const genType& x) + { + return x * x * x * x; + } + + GLM_FUNC_QUALIFIER bool powOfTwo(int x) + { + return !(x & (x - 1)); + } + + GLM_FUNC_QUALIFIER detail::tvec2<bool> powOfTwo(const detail::tvec2<int>& x) + { + return detail::tvec2<bool>( + powOfTwo(x.x), + powOfTwo(x.y)); + } + + GLM_FUNC_QUALIFIER detail::tvec3<bool> powOfTwo(const detail::tvec3<int>& x) + { + return detail::tvec3<bool>( + powOfTwo(x.x), + powOfTwo(x.y), + powOfTwo(x.z)); + } + + GLM_FUNC_QUALIFIER detail::tvec4<bool> powOfTwo(const detail::tvec4<int>& x) + { + return detail::tvec4<bool>( + powOfTwo(x.x), + powOfTwo(x.y), + powOfTwo(x.z), + powOfTwo(x.w)); + } +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/orthonormalize.hpp b/include/gal/opengl/glm/gtx/orthonormalize.hpp new file mode 100644 index 0000000..9f97f66 --- /dev/null +++ b/include/gal/opengl/glm/gtx/orthonormalize.hpp @@ -0,0 +1,72 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_orthonormalize +/// @file glm/gtx/orthonormalize.hpp +/// @date 2005-12-21 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// @see gtx_extented_min_max (dependence) +/// +/// @defgroup gtx_orthonormalize GLM_GTX_orthonormalize +/// @ingroup gtx +/// +/// @brief Orthonormalize matrices. +/// +/// <glm/gtx/orthonormalize.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_orthonormalize +#define GLM_GTX_orthonormalize GLM_VERSION + +// Dependency: +#include "../glm.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_orthonormalize extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_orthonormalize + /// @{ + + //! Returns the orthonormalized matrix of m. + //! From GLM_GTX_orthonormalize extension. + template <typename T> + detail::tmat3x3<T> orthonormalize( + const detail::tmat3x3<T>& m); + + //! Orthonormalizes x according y. + //! From GLM_GTX_orthonormalize extension. + template <typename T> + detail::tvec3<T> orthonormalize( + const detail::tvec3<T>& x, + const detail::tvec3<T>& y); + + /// @} +}//namespace glm + +#include "orthonormalize.inl" + +#endif//GLM_GTX_orthonormalize diff --git a/include/gal/opengl/glm/gtx/orthonormalize.inl b/include/gal/opengl/glm/gtx/orthonormalize.inl new file mode 100644 index 0000000..ea9ff7f --- /dev/null +++ b/include/gal/opengl/glm/gtx/orthonormalize.inl @@ -0,0 +1,43 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2005-12-21 +// Updated : 2005-12-21 +// Licence : This source is under MIT License +// File : glm/gtx/orthonormalize.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat3x3<T> orthonormalize + ( + const detail::tmat3x3<T>& m + ) + { + detail::tmat3x3<T> r = m; + + r[0] = normalize(r[0]); + + float d0 = dot(r[0], r[1]); + r[1] -= r[0] * d0; + r[1] = normalize(r[1]); + + float d1 = dot(r[1], r[2]); + d0 = dot(r[0], r[2]); + r[2] -= r[0] * d0 + r[1] * d1; + r[2] = normalize(r[2]); + + return r; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> orthonormalize + ( + const detail::tvec3<T>& x, + const detail::tvec3<T>& y + ) + { + return normalize(x - y * dot(y, x)); + } +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/perpendicular.hpp b/include/gal/opengl/glm/gtx/perpendicular.hpp new file mode 100644 index 0000000..f6515ab --- /dev/null +++ b/include/gal/opengl/glm/gtx/perpendicular.hpp @@ -0,0 +1,67 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_perpendicular +/// @file glm/gtx/perpendicular.hpp +/// @date 2005-12-21 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// @see gtx_projection (dependence) +/// +/// @defgroup gtx_perpendicular GLM_GTX_perpendicular +/// @ingroup gtx +/// +/// @brief Perpendicular of a vector from other one +/// +/// <glm/gtx/perpendicular.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_perpendicular +#define GLM_GTX_perpendicular GLM_VERSION + +// Dependency: +#include "../glm.hpp" +#include "../gtx/projection.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_perpendicular extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_perpendicular + /// @{ + + //! Projects x a perpendicular axis of Normal. + //! From GLM_GTX_perpendicular extension. + template <typename vecType> + vecType perp( + vecType const & x, + vecType const & Normal); + + /// @} +}//namespace glm + +#include "perpendicular.inl" + +#endif//GLM_GTX_perpendicular diff --git a/include/gal/opengl/glm/gtx/perpendicular.inl b/include/gal/opengl/glm/gtx/perpendicular.inl new file mode 100644 index 0000000..c96812a --- /dev/null +++ b/include/gal/opengl/glm/gtx/perpendicular.inl @@ -0,0 +1,21 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2005-12-21 +// Updated : 2009-03-06 +// Licence : This source is under MIT License +// File : glm/gtx/perpendicular.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template <typename vecType> + GLM_FUNC_QUALIFIER vecType perp + ( + vecType const & x, + vecType const & Normal + ) + { + return x - proj(x, Normal); + } +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/polar_coordinates.hpp b/include/gal/opengl/glm/gtx/polar_coordinates.hpp new file mode 100644 index 0000000..1cba486 --- /dev/null +++ b/include/gal/opengl/glm/gtx/polar_coordinates.hpp @@ -0,0 +1,72 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_polar_coordinates +/// @file glm/gtx/polar_coordinates.hpp +/// @date 2007-03-06 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// +/// @defgroup gtx_polar_coordinates GLM_GTX_polar_coordinates +/// @ingroup gtx +/// +/// @brief Conversion from Euclidean space to polar space and revert. +/// +/// <glm/gtx/polar_coordinates.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_polar_coordinates +#define GLM_GTX_polar_coordinates GLM_VERSION + +// Dependency: +#include "../glm.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_polar_coordinates extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_polar_coordinates + /// @{ + + /// Convert Euclidean to Polar coordinates, x is the xz distance, y, the latitude and z the longitude. + /// + /// @see gtx_polar_coordinates + template <typename T> + detail::tvec3<T> polar( + detail::tvec3<T> const & euclidean); + + /// Convert Polar to Euclidean coordinates. + /// + /// @see gtx_polar_coordinates + template <typename T> + detail::tvec3<T> euclidean( + detail::tvec2<T> const & polar); + + /// @} +}//namespace glm + +#include "polar_coordinates.inl" + +#endif//GLM_GTX_polar_coordinates diff --git a/include/gal/opengl/glm/gtx/polar_coordinates.inl b/include/gal/opengl/glm/gtx/polar_coordinates.inl new file mode 100644 index 0000000..376a31c --- /dev/null +++ b/include/gal/opengl/glm/gtx/polar_coordinates.inl @@ -0,0 +1,55 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2007-03-06 +// Updated : 2009-05-01 +// Licence : This source is under MIT License +// File : glm/gtx/polar_coordinates.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> polar + ( + detail::tvec3<T> const & euclidean + ) + { + T const Length(length(euclidean)); + detail::tvec3<T> const tmp(euclidean / Length); + T const xz_dist(sqrt(tmp.x * tmp.x + tmp.z * tmp.z)); + +#ifdef GLM_FORCE_RADIANS + return detail::tvec3<T>( + atan(xz_dist, tmp.y), // latitude + atan(tmp.x, tmp.z), // longitude + xz_dist); // xz distance +#else + return detail::tvec3<T>( + degrees(atan(xz_dist, tmp.y)), // latitude + degrees(atan(tmp.x, tmp.z)), // longitude + xz_dist); // xz distance +#endif + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> euclidean + ( + detail::tvec2<T> const & polar + ) + { +#ifdef GLM_FORCE_RADIANS + T const latitude(polar.x); + T const longitude(polar.y); +#else + T const latitude(radians(polar.x)); + T const longitude(radians(polar.y)); +#endif + + return detail::tvec3<T>( + cos(latitude) * sin(longitude), + sin(latitude), + cos(latitude) * cos(longitude)); + } + +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/projection.hpp b/include/gal/opengl/glm/gtx/projection.hpp new file mode 100644 index 0000000..6e20922 --- /dev/null +++ b/include/gal/opengl/glm/gtx/projection.hpp @@ -0,0 +1,65 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_projection +/// @file glm/gtx/projection.hpp +/// @date 2005-12-21 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// +/// @defgroup gtx_projection GLM_GTX_projection +/// @ingroup gtx +/// +/// @brief Projection of a vector to other one +/// +/// <glm/gtx/projection.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_projection +#define GLM_GTX_projection GLM_VERSION + +// Dependency: +#include "../glm.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_projection extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_projection + /// @{ + + //! Projects x on Normal. + //! From GLM_GTX_projection extension. + template <typename vecType> + vecType proj( + vecType const & x, + vecType const & Normal); + + /// @} +}//namespace glm + +#include "projection.inl" + +#endif//GLM_GTX_projection diff --git a/include/gal/opengl/glm/gtx/projection.inl b/include/gal/opengl/glm/gtx/projection.inl new file mode 100644 index 0000000..4107d89 --- /dev/null +++ b/include/gal/opengl/glm/gtx/projection.inl @@ -0,0 +1,21 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2005-12-21 +// Updated : 2009-03-06 +// Licence : This source is under MIT License +// File : glm/gtx/projection.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template <typename vecType> + GLM_FUNC_QUALIFIER vecType proj + ( + vecType const & x, + vecType const & Normal + ) + { + return glm::dot(x, Normal) / glm::dot(Normal, Normal) * Normal; + } +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/quaternion.hpp b/include/gal/opengl/glm/gtx/quaternion.hpp new file mode 100644 index 0000000..3c9e8b0 --- /dev/null +++ b/include/gal/opengl/glm/gtx/quaternion.hpp @@ -0,0 +1,195 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_quaternion +/// @file glm/gtx/quaternion.hpp +/// @date 2005-12-21 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// @see gtx_extented_min_max (dependence) +/// +/// @defgroup gtx_quaternion GLM_GTX_quaternion +/// @ingroup gtx +/// +/// @brief Extented quaternion types and functions +/// +/// <glm/gtx/quaternion.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_quaternion +#define GLM_GTX_quaternion GLM_VERSION + +// Dependency: +#include "../glm.hpp" +#include "../gtc/quaternion.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_quaternion extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_quaternion + /// @{ + + //! Compute a cross product between a quaternion and a vector. + /// + /// @see gtx_quaternion + template <typename valType> + detail::tvec3<valType> cross( + detail::tquat<valType> const & q, + detail::tvec3<valType> const & v); + + //! Compute a cross product between a vector and a quaternion. + /// + /// @see gtx_quaternion + template <typename valType> + detail::tvec3<valType> cross( + detail::tvec3<valType> const & v, + detail::tquat<valType> const & q); + + //! Compute a point on a path according squad equation. + //! q1 and q2 are control points; s1 and s2 are intermediate control points. + /// + /// @see gtx_quaternion + template <typename valType> + detail::tquat<valType> squad( + detail::tquat<valType> const & q1, + detail::tquat<valType> const & q2, + detail::tquat<valType> const & s1, + detail::tquat<valType> const & s2, + valType const & h); + + //! Returns an intermediate control point for squad interpolation. + /// + /// @see gtx_quaternion + template <typename valType> + detail::tquat<valType> intermediate( + detail::tquat<valType> const & prev, + detail::tquat<valType> const & curr, + detail::tquat<valType> const & next); + + //! Returns a exp of a quaternion. + /// + /// @see gtx_quaternion + template <typename valType> + detail::tquat<valType> exp( + detail::tquat<valType> const & q); + + //! Returns a log of a quaternion. + /// + /// @see gtx_quaternion + template <typename valType> + detail::tquat<valType> log( + detail::tquat<valType> const & q); + + /// Returns x raised to the y power. + /// + /// @see gtx_quaternion + template <typename valType> + detail::tquat<valType> pow( + detail::tquat<valType> const & x, + valType const & y); + + //! Returns quarternion square root. + /// + /// @see gtx_quaternion + //template <typename valType> + //detail::tquat<valType> sqrt( + // detail::tquat<valType> const & q); + + //! Rotates a 3 components vector by a quaternion. + /// + /// @see gtx_quaternion + template <typename valType> + detail::tvec3<valType> rotate( + detail::tquat<valType> const & q, + detail::tvec3<valType> const & v); + + /// Rotates a 4 components vector by a quaternion. + /// + /// @see gtx_quaternion + template <typename valType> + detail::tvec4<valType> rotate( + detail::tquat<valType> const & q, + detail::tvec4<valType> const & v); + + /// Extract the real component of a quaternion. + /// + /// @see gtx_quaternion + template <typename valType> + valType extractRealComponent( + detail::tquat<valType> const & q); + + /// Converts a quaternion to a 3 * 3 matrix. + /// + /// @see gtx_quaternion + template <typename valType> + detail::tmat3x3<valType> toMat3( + detail::tquat<valType> const & x){return mat3_cast(x);} + + /// Converts a quaternion to a 4 * 4 matrix. + /// + /// @see gtx_quaternion + template <typename valType> + detail::tmat4x4<valType> toMat4( + detail::tquat<valType> const & x){return mat4_cast(x);} + + /// Converts a 3 * 3 matrix to a quaternion. + /// + /// @see gtx_quaternion + template <typename valType> + detail::tquat<valType> toQuat( + detail::tmat3x3<valType> const & x){return quat_cast(x);} + + /// Converts a 4 * 4 matrix to a quaternion. + /// + /// @see gtx_quaternion + template <typename valType> + detail::tquat<valType> toQuat( + detail::tmat4x4<valType> const & x){return quat_cast(x);} + + /// Quaternion interpolation using the rotation short path. + /// + /// @see gtx_quaternion + template <typename T> + detail::tquat<T> shortMix( + detail::tquat<T> const & x, + detail::tquat<T> const & y, + T const & a); + + /// Quaternion normalized linear interpolation. + /// + /// @see gtx_quaternion + template <typename T> + detail::tquat<T> fastMix( + detail::tquat<T> const & x, + detail::tquat<T> const & y, + T const & a); + + /// @} +}//namespace glm + +#include "quaternion.inl" + +#endif//GLM_GTX_quaternion diff --git a/include/gal/opengl/glm/gtx/quaternion.inl b/include/gal/opengl/glm/gtx/quaternion.inl new file mode 100644 index 0000000..32155ce --- /dev/null +++ b/include/gal/opengl/glm/gtx/quaternion.inl @@ -0,0 +1,208 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2005-12-21 +// Updated : 2008-11-27 +// Licence : This source is under MIT License +// File : glm/gtx/quaternion.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +#include <limits> + +namespace glm +{ + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec3<valType> cross + ( + detail::tvec3<valType> const & v, + detail::tquat<valType> const & q + ) + { + return inverse(q) * v; + } + + template <typename valType> + GLM_FUNC_QUALIFIER detail::tvec3<valType> cross + ( + detail::tquat<valType> const & q, + detail::tvec3<valType> const & v + ) + { + return q * v; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tquat<T> squad + ( + detail::tquat<T> const & q1, + detail::tquat<T> const & q2, + detail::tquat<T> const & s1, + detail::tquat<T> const & s2, + T const & h) + { + return mix(mix(q1, q2, h), mix(s1, s2, h), T(2) * (T(1) - h) * h); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tquat<T> intermediate + ( + detail::tquat<T> const & prev, + detail::tquat<T> const & curr, + detail::tquat<T> const & next + ) + { + detail::tquat<T> invQuat = inverse(curr); + return exp((log(next + invQuat) + log(prev + invQuat)) / T(-4)) * curr; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tquat<T> exp + ( + detail::tquat<T> const & q + ) + { + detail::tvec3<T> u(q.x, q.y, q.z); + float Angle = glm::length(u); + detail::tvec3<T> v(u / Angle); + return detail::tquat<T>(cos(Angle), sin(Angle) * v); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tquat<T> log + ( + detail::tquat<T> const & q + ) + { + if((q.x == T(0)) && (q.y == T(0)) && (q.z == T(0))) + { + if(q.w > T(0)) + return detail::tquat<T>(log(q.w), T(0), T(0), T(0)); + else if(q.w < T(0)) + return detail::tquat<T>(log(-q.w), T(3.1415926535897932384626433832795), T(0),T(0)); + else + return detail::tquat<T>(std::numeric_limits<T>::infinity(), std::numeric_limits<T>::infinity(), std::numeric_limits<T>::infinity(), std::numeric_limits<T>::infinity()); + } + else + { + T Vec3Len = sqrt(q.x * q.x + q.y * q.y + q.z * q.z); + T QuatLen = sqrt(Vec3Len * Vec3Len + q.w * q.w); + T t = atan(Vec3Len, T(q.w)) / Vec3Len; + return detail::tquat<T>(t * q.x, t * q.y, t * q.z, log(QuatLen)); + } + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tquat<T> pow + ( + detail::tquat<T> const & x, + T const & y + ) + { + if(abs(x.w) > T(0.9999)) + return x; + float Angle = acos(y); + float NewAngle = Angle * y; + float Div = sin(NewAngle) / sin(Angle); + return detail::tquat<T>( + cos(NewAngle), + x.x * Div, + x.y * Div, + x.z * Div); + } + + //template <typename T> + //GLM_FUNC_QUALIFIER detail::tquat<T> sqrt + //( + // detail::tquat<T> const & q + //) + //{ + // T q0 = T(1) - dot(q, q); + // return T(2) * (T(1) + q0) * q; + //} + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> rotate + ( + detail::tquat<T> const & q, + detail::tvec3<T> const & v + ) + { + return q * v; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec4<T> rotate + ( + detail::tquat<T> const & q, + detail::tvec4<T> const & v + ) + { + return q * v; + } + + template <typename T> + GLM_FUNC_QUALIFIER T extractRealComponent + ( + detail::tquat<T> const & q + ) + { + T w = T(1.0) - q.x * q.x - q.y * q.y - q.z * q.z; + if(w < T(0)) + return T(0); + else + return -sqrt(w); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tquat<T> shortMix + ( + detail::tquat<T> const & x, + detail::tquat<T> const & y, + T const & a + ) + { + if(a <= typename detail::tquat<T>::value_type(0)) return x; + if(a >= typename detail::tquat<T>::value_type(1)) return y; + + T fCos = dot(x, y); + detail::tquat<T> y2(y); //BUG!!! tquat<T> y2; + if(fCos < T(0)) + { + y2 = -y; + fCos = -fCos; + } + + //if(fCos > 1.0f) // problem + T k0, k1; + if(fCos > T(0.9999)) + { + k0 = T(1) - a; + k1 = T(0) + a; //BUG!!! 1.0f + a; + } + else + { + T fSin = sqrt(T(1) - fCos * fCos); + T fAngle = atan(fSin, fCos); + T fOneOverSin = T(1) / fSin; + k0 = sin((T(1) - a) * fAngle) * fOneOverSin; + k1 = sin((T(0) + a) * fAngle) * fOneOverSin; + } + + return detail::tquat<T>( + k0 * x.w + k1 * y2.w, + k0 * x.x + k1 * y2.x, + k0 * x.y + k1 * y2.y, + k0 * x.z + k1 * y2.z); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tquat<T> fastMix + ( + detail::tquat<T> const & x, + detail::tquat<T> const & y, + T const & a + ) + { + return glm::normalize(x * (T(1) - a) + (y * a)); + } +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/random.hpp b/include/gal/opengl/glm/gtx/random.hpp new file mode 100644 index 0000000..a23d894 --- /dev/null +++ b/include/gal/opengl/glm/gtx/random.hpp @@ -0,0 +1,29 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/////////////////////////////////////////////////////////////////////////////////// + +#if(defined(GLM_MESSAGES)) +# pragma message("GLM: GLM_GTX_random extension is deprecated, include GLM_GTC_random instead") +#endif + +// Promoted: +#include "../gtc/random.hpp" diff --git a/include/gal/opengl/glm/gtx/raw_data.hpp b/include/gal/opengl/glm/gtx/raw_data.hpp new file mode 100644 index 0000000..4ec6cf0 --- /dev/null +++ b/include/gal/opengl/glm/gtx/raw_data.hpp @@ -0,0 +1,75 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_raw_data +/// @file glm/gtx/raw_data.hpp +/// @date 2008-11-19 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// +/// @defgroup gtx_raw_data GLM_GTX_raw_data +/// @ingroup gtx +/// +/// @brief Projection of a vector to other one +/// +/// <glm/gtx/raw_data.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_raw_data +#define GLM_GTX_raw_data GLM_VERSION + +// Dependency: +#include "../glm.hpp" +#include "../gtc/type_precision.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_raw_data extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_raw_data + /// @{ + + //! Type for byte numbers. + //! From GLM_GTX_raw_data extension. + typedef uint8 byte; + + //! Type for word numbers. + //! From GLM_GTX_raw_data extension. + typedef uint16 word; + + //! Type for dword numbers. + //! From GLM_GTX_raw_data extension. + typedef uint32 dword; + + //! Type for qword numbers. + //! From GLM_GTX_raw_data extension. + typedef uint64 qword; + + /// @} +}// namespace glm + +#include "raw_data.inl" + +#endif//GLM_GTX_raw_data diff --git a/include/gal/opengl/glm/gtx/raw_data.inl b/include/gal/opengl/glm/gtx/raw_data.inl new file mode 100644 index 0000000..526e3cd --- /dev/null +++ b/include/gal/opengl/glm/gtx/raw_data.inl @@ -0,0 +1,11 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2008-11-19 +// Updated : 2008-11-19 +// Licence : This source is under MIT License +// File : glm/gtx/raw_data.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Dependency: +// - GLM core +/////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/include/gal/opengl/glm/gtx/reciprocal.hpp b/include/gal/opengl/glm/gtx/reciprocal.hpp new file mode 100644 index 0000000..3519861 --- /dev/null +++ b/include/gal/opengl/glm/gtx/reciprocal.hpp @@ -0,0 +1,26 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/////////////////////////////////////////////////////////////////////////////////// + +#if(defined(GLM_MESSAGES)) +# pragma message("GLM: GLM_GTX_reciprocal extension is deprecated, include GLM_GTC_reciprocal instead") +#endif diff --git a/include/gal/opengl/glm/gtx/rotate_vector.hpp b/include/gal/opengl/glm/gtx/rotate_vector.hpp new file mode 100644 index 0000000..70c5e03 --- /dev/null +++ b/include/gal/opengl/glm/gtx/rotate_vector.hpp @@ -0,0 +1,132 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_rotate_vector +/// @file glm/gtx/rotate_vector.hpp +/// @date 2006-11-02 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// @see gtx_transform (dependence) +/// +/// @defgroup gtx_rotate_vector GLM_GTX_rotate_vector +/// @ingroup gtx +/// +/// @brief Function to directly rotate a vector +/// +/// <glm/gtx/rotate_vector.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_rotate_vector +#define GLM_GTX_rotate_vector GLM_VERSION + +// Dependency: +#include "../glm.hpp" +#include "../gtx/transform.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_rotate_vector extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_rotate_vector + /// @{ + + //! Rotate a two dimensional vector. + //! From GLM_GTX_rotate_vector extension. + template <typename T> + detail::tvec2<T> rotate( + detail::tvec2<T> const & v, + T const & angle); + + //! Rotate a three dimensional vector around an axis. + //! From GLM_GTX_rotate_vector extension. + template <typename T> + detail::tvec3<T> rotate( + detail::tvec3<T> const & v, + T const & angle, + detail::tvec3<T> const & normal); + + //! Rotate a four dimensional vector around an axis. + //! From GLM_GTX_rotate_vector extension. + template <typename T> + detail::tvec4<T> rotate( + detail::tvec4<T> const & v, + T const & angle, + detail::tvec3<T> const & normal); + + //! Rotate a three dimensional vector around the X axis. + //! From GLM_GTX_rotate_vector extension. + template <typename T> + detail::tvec3<T> rotateX( + detail::tvec3<T> const & v, + T const & angle); + + //! Rotate a three dimensional vector around the Y axis. + //! From GLM_GTX_rotate_vector extension. + template <typename T> + detail::tvec3<T> rotateY( + detail::tvec3<T> const & v, + T const & angle); + + //! Rotate a three dimensional vector around the Z axis. + //! From GLM_GTX_rotate_vector extension. + template <typename T> + detail::tvec3<T> rotateZ( + detail::tvec3<T> const & v, + T const & angle); + + //! Rotate a four dimentionnals vector around the X axis. + //! From GLM_GTX_rotate_vector extension. + template <typename T> + detail::tvec4<T> rotateX( + detail::tvec4<T> const & v, + T const & angle); + + //! Rotate a four dimensional vector around the X axis. + //! From GLM_GTX_rotate_vector extension. + template <typename T> + detail::tvec4<T> rotateY( + detail::tvec4<T> const & v, + T const & angle); + + //! Rotate a four dimensional vector around the X axis. + //! From GLM_GTX_rotate_vector extension. + template <typename T> + detail::tvec4<T> rotateZ( + detail::tvec4<T> const & v, + T const & angle); + + //! Build a rotation matrix from a normal and a up vector. + //! From GLM_GTX_rotate_vector extension. + template <typename T> + detail::tmat4x4<T> orientation( + detail::tvec3<T> const & Normal, + detail::tvec3<T> const & Up); + + /// @} +}//namespace glm + +#include "rotate_vector.inl" + +#endif//GLM_GTX_rotate_vector diff --git a/include/gal/opengl/glm/gtx/rotate_vector.inl b/include/gal/opengl/glm/gtx/rotate_vector.inl new file mode 100644 index 0000000..1ec1717 --- /dev/null +++ b/include/gal/opengl/glm/gtx/rotate_vector.inl @@ -0,0 +1,215 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2006-11-02 +// Updated : 2009-02-19 +// Licence : This source is under MIT License +// File : glm/gtx/rotate_vector.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec2<T> rotate + ( + detail::tvec2<T> const & v, + T const & angle + ) + { + detail::tvec2<T> Result; +#ifdef GLM_FORCE_RADIANS + T const Cos(cos(angle)); + T const Sin(sin(angle)); +#else + T const Cos = cos(radians(angle)); + T const Sin = sin(radians(angle)); +#endif + Result.x = v.x * Cos - v.y * Sin; + Result.y = v.x * Sin + v.y * Cos; + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> rotate + ( + detail::tvec3<T> const & v, + T const & angle, + detail::tvec3<T> const & normal + ) + { + return detail::tmat3x3<T>(glm::rotate(angle, normal)) * v; + } + /* + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> rotateGTX( + const detail::tvec3<T>& x, + T angle, + const detail::tvec3<T>& normal) + { + const T Cos = cos(radians(angle)); + const T Sin = sin(radians(angle)); + return x * Cos + ((x * normal) * (T(1) - Cos)) * normal + cross(x, normal) * Sin; + } + */ + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec4<T> rotate + ( + detail::tvec4<T> const & v, + T const & angle, + detail::tvec3<T> const & normal + ) + { + return rotate(angle, normal) * v; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> rotateX + ( + detail::tvec3<T> const & v, + T const & angle + ) + { + detail::tvec3<T> Result(v); + +#ifdef GLM_FORCE_RADIANS + T const Cos(cos(angle)); + T const Sin(sin(angle)); +#else + T const Cos = cos(radians(angle)); + T const Sin = sin(radians(angle)); +#endif + + Result.y = v.y * Cos - v.z * Sin; + Result.z = v.y * Sin + v.z * Cos; + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> rotateY + ( + detail::tvec3<T> const & v, + T const & angle + ) + { + detail::tvec3<T> Result = v; + +#ifdef GLM_FORCE_RADIANS + T const Cos(cos(angle)); + T const Sin(sin(angle)); +#else + T const Cos(cos(radians(angle))); + T const Sin(sin(radians(angle))); +#endif + + Result.x = v.x * Cos + v.z * Sin; + Result.z = -v.x * Sin + v.z * Cos; + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> rotateZ + ( + detail::tvec3<T> const & v, + T const & angle + ) + { + detail::tvec3<T> Result = v; + +#ifdef GLM_FORCE_RADIANS + T const Cos(cos(angle)); + T const Sin(sin(angle)); +#else + T const Cos(cos(radians(angle))); + T const Sin(sin(radians(angle))); +#endif + + Result.x = v.x * Cos - v.y * Sin; + Result.y = v.x * Sin + v.y * Cos; + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec4<T> rotateX + ( + detail::tvec4<T> const & v, + T const & angle + ) + { + detail::tvec4<T> Result = v; + +#ifdef GLM_FORCE_RADIANS + T const Cos(cos(angle)); + T const Sin(sin(angle)); +#else + T const Cos(cos(radians(angle))); + T const Sin(sin(radians(angle))); +#endif + + Result.y = v.y * Cos - v.z * Sin; + Result.z = v.y * Sin + v.z * Cos; + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec4<T> rotateY + ( + detail::tvec4<T> const & v, + T const & angle + ) + { + detail::tvec4<T> Result = v; + +#ifdef GLM_FORCE_RADIANS + T const Cos(cos(angle)); + T const Sin(sin(angle)); +#else + T const Cos(cos(radians(angle))); + T const Sin(sin(radians(angle))); +#endif + + Result.x = v.x * Cos + v.z * Sin; + Result.z = -v.x * Sin + v.z * Cos; + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec4<T> rotateZ + ( + detail::tvec4<T> const & v, + T const & angle + ) + { + detail::tvec4<T> Result = v; + +#ifdef GLM_FORCE_RADIANS + T const Cos(cos(angle)); + T const Sin(sin(angle)); +#else + T const Cos(cos(radians(angle))); + T const Sin(sin(radians(angle))); +#endif + + Result.x = v.x * Cos - v.y * Sin; + Result.y = v.x * Sin + v.y * Cos; + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> orientation + ( + detail::tvec3<T> const & Normal, + detail::tvec3<T> const & Up + ) + { + if(all(equal(Normal, Up))) + return detail::tmat4x4<T>(T(1)); + + detail::tvec3<T> RotationAxis = cross(Up, Normal); +# ifdef GLM_FORCE_RADIANS + T Angle = acos(dot(Normal, Up)); +# else + T Angle = degrees(acos(dot(Normal, Up))); +# endif + return rotate(Angle, RotationAxis); + } +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/simd_mat4.hpp b/include/gal/opengl/glm/gtx/simd_mat4.hpp new file mode 100644 index 0000000..b435b11 --- /dev/null +++ b/include/gal/opengl/glm/gtx/simd_mat4.hpp @@ -0,0 +1,206 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_simd_vec4 +/// @file glm/gtx/simd_vec4.hpp +/// @date 2009-05-07 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// +/// @defgroup gtx_simd_mat4 GLM_GTX_simd_mat4 +/// @ingroup gtx +/// +/// @brief SIMD implementation of mat4 type. +/// +/// <glm/gtx/simd_mat4.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_simd_mat4 +#define GLM_GTX_simd_mat4 GLM_VERSION + +// Dependency: +#include "../glm.hpp" + +#if(GLM_ARCH != GLM_ARCH_PURE) + +#if(GLM_ARCH & GLM_ARCH_SSE2) +# include "../core/intrinsic_matrix.hpp" +# include "../gtx/simd_vec4.hpp" +#else +# error "GLM: GLM_GTX_simd_mat4 requires compiler support of SSE2 through intrinsics" +#endif + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_simd_mat4 extension included") +#endif + +namespace glm{ +namespace detail +{ + /// 4x4 Matrix implemented using SIMD SEE intrinsics. + /// \ingroup gtx_simd_mat4 + GLM_ALIGNED_STRUCT(16) fmat4x4SIMD + { + enum ctor{null}; + + typedef float value_type; + typedef fvec4SIMD col_type; + typedef fvec4SIMD row_type; + typedef std::size_t size_type; + static size_type value_size(); + static size_type col_size(); + static size_type row_size(); + static bool is_matrix(); + + fvec4SIMD Data[4]; + + ////////////////////////////////////// + // Constructors + + fmat4x4SIMD(); + explicit fmat4x4SIMD(float const & s); + explicit fmat4x4SIMD( + float const & x0, float const & y0, float const & z0, float const & w0, + float const & x1, float const & y1, float const & z1, float const & w1, + float const & x2, float const & y2, float const & z2, float const & w2, + float const & x3, float const & y3, float const & z3, float const & w3); + explicit fmat4x4SIMD( + fvec4SIMD const & v0, + fvec4SIMD const & v1, + fvec4SIMD const & v2, + fvec4SIMD const & v3); + explicit fmat4x4SIMD( + tmat4x4<float> const & m); + explicit fmat4x4SIMD( + __m128 const in[4]); + + // Conversions + //template <typename U> + //explicit tmat4x4(tmat4x4<U> const & m); + + //explicit tmat4x4(tmat2x2<T> const & x); + //explicit tmat4x4(tmat3x3<T> const & x); + //explicit tmat4x4(tmat2x3<T> const & x); + //explicit tmat4x4(tmat3x2<T> const & x); + //explicit tmat4x4(tmat2x4<T> const & x); + //explicit tmat4x4(tmat4x2<T> const & x); + //explicit tmat4x4(tmat3x4<T> const & x); + //explicit tmat4x4(tmat4x3<T> const & x); + + // Accesses + fvec4SIMD & operator[](size_type i); + fvec4SIMD const & operator[](size_type i) const; + + // Unary updatable operators + fmat4x4SIMD & operator= (fmat4x4SIMD const & m); + fmat4x4SIMD & operator+= (float const & s); + fmat4x4SIMD & operator+= (fmat4x4SIMD const & m); + fmat4x4SIMD & operator-= (float const & s); + fmat4x4SIMD & operator-= (fmat4x4SIMD const & m); + fmat4x4SIMD & operator*= (float const & s); + fmat4x4SIMD & operator*= (fmat4x4SIMD const & m); + fmat4x4SIMD & operator/= (float const & s); + fmat4x4SIMD & operator/= (fmat4x4SIMD const & m); + fmat4x4SIMD & operator++ (); + fmat4x4SIMD & operator-- (); + }; + + // Binary operators + fmat4x4SIMD operator+ (fmat4x4SIMD const & m, float const & s); + fmat4x4SIMD operator+ (float const & s, fmat4x4SIMD const & m); + fmat4x4SIMD operator+ (fmat4x4SIMD const & m1, fmat4x4SIMD const & m2); + + fmat4x4SIMD operator- (fmat4x4SIMD const & m, float const & s); + fmat4x4SIMD operator- (float const & s, fmat4x4SIMD const & m); + fmat4x4SIMD operator- (fmat4x4SIMD const & m1, fmat4x4SIMD const & m2); + + fmat4x4SIMD operator* (fmat4x4SIMD const & m, float const & s); + fmat4x4SIMD operator* (float const & s, fmat4x4SIMD const & m); + + fvec4SIMD operator* (fmat4x4SIMD const & m, fvec4SIMD const & v); + fvec4SIMD operator* (fvec4SIMD const & v, fmat4x4SIMD const & m); + + fmat4x4SIMD operator* (fmat4x4SIMD const & m1, fmat4x4SIMD const & m2); + + fmat4x4SIMD operator/ (fmat4x4SIMD const & m, float const & s); + fmat4x4SIMD operator/ (float const & s, fmat4x4SIMD const & m); + + fvec4SIMD operator/ (fmat4x4SIMD const & m, fvec4SIMD const & v); + fvec4SIMD operator/ (fvec4SIMD const & v, fmat4x4SIMD const & m); + + fmat4x4SIMD operator/ (fmat4x4SIMD const & m1, fmat4x4SIMD const & m2); + + // Unary constant operators + fmat4x4SIMD const operator- (fmat4x4SIMD const & m); + fmat4x4SIMD const operator-- (fmat4x4SIMD const & m, int); + fmat4x4SIMD const operator++ (fmat4x4SIMD const & m, int); +}//namespace detail + + typedef detail::fmat4x4SIMD simdMat4; + + /// @addtogroup gtx_simd_mat4 + /// @{ + + //! Convert a simdMat4 to a mat4. + //! (From GLM_GTX_simd_mat4 extension) + detail::tmat4x4<float> mat4_cast( + detail::fmat4x4SIMD const & x); + + //! Multiply matrix x by matrix y component-wise, i.e., + //! result[i][j] is the scalar product of x[i][j] and y[i][j]. + //! (From GLM_GTX_simd_mat4 extension). + detail::fmat4x4SIMD matrixCompMult( + detail::fmat4x4SIMD const & x, + detail::fmat4x4SIMD const & y); + + //! Treats the first parameter c as a column vector + //! and the second parameter r as a row vector + //! and does a linear algebraic matrix multiply c * r. + //! (From GLM_GTX_simd_mat4 extension). + detail::fmat4x4SIMD outerProduct( + detail::fvec4SIMD const & c, + detail::fvec4SIMD const & r); + + //! Returns the transposed matrix of x + //! (From GLM_GTX_simd_mat4 extension). + detail::fmat4x4SIMD transpose( + detail::fmat4x4SIMD const & x); + + //! Return the determinant of a mat4 matrix. + //! (From GLM_GTX_simd_mat4 extension). + float determinant( + detail::fmat4x4SIMD const & m); + + //! Return the inverse of a mat4 matrix. + //! (From GLM_GTX_simd_mat4 extension). + detail::fmat4x4SIMD inverse( + detail::fmat4x4SIMD const & m); + + /// @} +}// namespace glm + +#include "simd_mat4.inl" + +#endif//(GLM_ARCH != GLM_ARCH_PURE) + +#endif//GLM_GTX_simd_mat4 diff --git a/include/gal/opengl/glm/gtx/simd_mat4.inl b/include/gal/opengl/glm/gtx/simd_mat4.inl new file mode 100644 index 0000000..d6ec8ca --- /dev/null +++ b/include/gal/opengl/glm/gtx/simd_mat4.inl @@ -0,0 +1,590 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2009-05-19 +// Updated : 2009-05-19 +// Licence : This source is under MIT License +// File : glm/gtx/simd_mat4.hpp +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm{ +namespace detail{ + +GLM_FUNC_QUALIFIER fmat4x4SIMD::size_type fmat4x4SIMD::value_size() +{ + return sizeof(value_type); +} + +GLM_FUNC_QUALIFIER fmat4x4SIMD::size_type fmat4x4SIMD::col_size() +{ + return 4; +} + +GLM_FUNC_QUALIFIER fmat4x4SIMD::size_type fmat4x4SIMD::row_size() +{ + return 4; +} + +GLM_FUNC_QUALIFIER fmat4x4SIMD::fmat4x4SIMD() +{ +#ifndef GLM_SIMD_ENABLE_DEFAULT_INIT + this->Data[0] = fvec4SIMD(1.0f, 0, 0, 0); + this->Data[1] = fvec4SIMD(0, 1.0f, 0, 0); + this->Data[2] = fvec4SIMD(0, 0, 1.0f, 0); + this->Data[3] = fvec4SIMD(0, 0, 0, 1.0f); +#endif +} + +GLM_FUNC_QUALIFIER fmat4x4SIMD::fmat4x4SIMD(float const & s) +{ + this->Data[0] = fvec4SIMD(s, 0, 0, 0); + this->Data[1] = fvec4SIMD(0, s, 0, 0); + this->Data[2] = fvec4SIMD(0, 0, s, 0); + this->Data[3] = fvec4SIMD(0, 0, 0, s); +} + +GLM_FUNC_QUALIFIER fmat4x4SIMD::fmat4x4SIMD +( + float const & x0, float const & y0, float const & z0, float const & w0, + float const & x1, float const & y1, float const & z1, float const & w1, + float const & x2, float const & y2, float const & z2, float const & w2, + float const & x3, float const & y3, float const & z3, float const & w3 +) +{ + this->Data[0] = fvec4SIMD(x0, y0, z0, w0); + this->Data[1] = fvec4SIMD(x1, y1, z1, w1); + this->Data[2] = fvec4SIMD(x2, y2, z2, w2); + this->Data[3] = fvec4SIMD(x3, y3, z3, w3); +} + +GLM_FUNC_QUALIFIER fmat4x4SIMD::fmat4x4SIMD +( + fvec4SIMD const & v0, + fvec4SIMD const & v1, + fvec4SIMD const & v2, + fvec4SIMD const & v3 +) +{ + this->Data[0] = v0; + this->Data[1] = v1; + this->Data[2] = v2; + this->Data[3] = v3; +} + +GLM_FUNC_QUALIFIER fmat4x4SIMD::fmat4x4SIMD +( + tmat4x4<float> const & m +) +{ + this->Data[0] = fvec4SIMD(m[0]); + this->Data[1] = fvec4SIMD(m[1]); + this->Data[2] = fvec4SIMD(m[2]); + this->Data[3] = fvec4SIMD(m[3]); +} + +GLM_FUNC_QUALIFIER fmat4x4SIMD::fmat4x4SIMD +( + __m128 const in[4] +) +{ + this->Data[0] = in[0]; + this->Data[1] = in[1]; + this->Data[2] = in[2]; + this->Data[3] = in[3]; +} + +////////////////////////////////////// +// Accesses + +GLM_FUNC_QUALIFIER fvec4SIMD & fmat4x4SIMD::operator[] +( + fmat4x4SIMD::size_type i +) +{ + assert( + //i >= fmat4x4SIMD::size_type(0) && + i < fmat4x4SIMD::col_size()); + + return this->Data[i]; +} + +GLM_FUNC_QUALIFIER fvec4SIMD const & fmat4x4SIMD::operator[] +( + fmat4x4SIMD::size_type i +) const +{ + assert( + //i >= fmat4x4SIMD::size_type(0) && + i < fmat4x4SIMD::col_size()); + + return this->Data[i]; +} + +////////////////////////////////////////////////////////////// +// mat4 operators + +GLM_FUNC_QUALIFIER fmat4x4SIMD& fmat4x4SIMD::operator= +( + fmat4x4SIMD const & m +) +{ + this->Data[0] = m[0]; + this->Data[1] = m[1]; + this->Data[2] = m[2]; + this->Data[3] = m[3]; + return *this; +} + +GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator+= +( + fmat4x4SIMD const & m +) +{ + this->Data[0].Data = _mm_add_ps(this->Data[0].Data, m[0].Data); + this->Data[1].Data = _mm_add_ps(this->Data[1].Data, m[1].Data); + this->Data[2].Data = _mm_add_ps(this->Data[2].Data, m[2].Data); + this->Data[3].Data = _mm_add_ps(this->Data[3].Data, m[3].Data); + return *this; +} + +GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator-= +( + fmat4x4SIMD const & m +) +{ + this->Data[0].Data = _mm_sub_ps(this->Data[0].Data, m[0].Data); + this->Data[1].Data = _mm_sub_ps(this->Data[1].Data, m[1].Data); + this->Data[2].Data = _mm_sub_ps(this->Data[2].Data, m[2].Data); + this->Data[3].Data = _mm_sub_ps(this->Data[3].Data, m[3].Data); + + return *this; +} + +GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator*= +( + fmat4x4SIMD const & m +) +{ + sse_mul_ps(&this->Data[0].Data, &m.Data[0].Data, &this->Data[0].Data); + return *this; +} + +GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator/= +( + fmat4x4SIMD const & m +) +{ + __m128 Inv[4]; + sse_inverse_ps(&m.Data[0].Data, Inv); + sse_mul_ps(&this->Data[0].Data, Inv, &this->Data[0].Data); + return *this; +} + +GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator+= +( + float const & s +) +{ + __m128 Operand = _mm_set_ps1(s); + this->Data[0].Data = _mm_add_ps(this->Data[0].Data, Operand); + this->Data[1].Data = _mm_add_ps(this->Data[1].Data, Operand); + this->Data[2].Data = _mm_add_ps(this->Data[2].Data, Operand); + this->Data[3].Data = _mm_add_ps(this->Data[3].Data, Operand); + return *this; +} + +GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator-= +( + float const & s +) +{ + __m128 Operand = _mm_set_ps1(s); + this->Data[0].Data = _mm_sub_ps(this->Data[0].Data, Operand); + this->Data[1].Data = _mm_sub_ps(this->Data[1].Data, Operand); + this->Data[2].Data = _mm_sub_ps(this->Data[2].Data, Operand); + this->Data[3].Data = _mm_sub_ps(this->Data[3].Data, Operand); + return *this; +} + +GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator*= +( + float const & s +) +{ + __m128 Operand = _mm_set_ps1(s); + this->Data[0].Data = _mm_mul_ps(this->Data[0].Data, Operand); + this->Data[1].Data = _mm_mul_ps(this->Data[1].Data, Operand); + this->Data[2].Data = _mm_mul_ps(this->Data[2].Data, Operand); + this->Data[3].Data = _mm_mul_ps(this->Data[3].Data, Operand); + return *this; +} + +GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator/= +( + float const & s +) +{ + __m128 Operand = _mm_div_ps(one, _mm_set_ps1(s)); + this->Data[0].Data = _mm_mul_ps(this->Data[0].Data, Operand); + this->Data[1].Data = _mm_mul_ps(this->Data[1].Data, Operand); + this->Data[2].Data = _mm_mul_ps(this->Data[2].Data, Operand); + this->Data[3].Data = _mm_mul_ps(this->Data[3].Data, Operand); + return *this; +} + +GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator++ () +{ + this->Data[0].Data = _mm_add_ps(this->Data[0].Data, one); + this->Data[1].Data = _mm_add_ps(this->Data[1].Data, one); + this->Data[2].Data = _mm_add_ps(this->Data[2].Data, one); + this->Data[3].Data = _mm_add_ps(this->Data[3].Data, one); + return *this; +} + +GLM_FUNC_QUALIFIER fmat4x4SIMD & fmat4x4SIMD::operator-- () +{ + this->Data[0].Data = _mm_sub_ps(this->Data[0].Data, one); + this->Data[1].Data = _mm_sub_ps(this->Data[1].Data, one); + this->Data[2].Data = _mm_sub_ps(this->Data[2].Data, one); + this->Data[3].Data = _mm_sub_ps(this->Data[3].Data, one); + return *this; +} + + +////////////////////////////////////////////////////////////// +// Binary operators + +GLM_FUNC_QUALIFIER fmat4x4SIMD operator+ +( + const fmat4x4SIMD &m, + float const & s +) +{ + return detail::fmat4x4SIMD + ( + m[0] + s, + m[1] + s, + m[2] + s, + m[3] + s + ); +} + +GLM_FUNC_QUALIFIER fmat4x4SIMD operator+ +( + float const & s, + const fmat4x4SIMD &m +) +{ + return detail::fmat4x4SIMD + ( + m[0] + s, + m[1] + s, + m[2] + s, + m[3] + s + ); +} + +GLM_FUNC_QUALIFIER fmat4x4SIMD operator+ +( + const fmat4x4SIMD &m1, + const fmat4x4SIMD &m2 +) +{ + return detail::fmat4x4SIMD + ( + m1[0] + m2[0], + m1[1] + m2[1], + m1[2] + m2[2], + m1[3] + m2[3] + ); +} + + +GLM_FUNC_QUALIFIER fmat4x4SIMD operator- +( + const fmat4x4SIMD &m, + float const & s +) +{ + return detail::fmat4x4SIMD + ( + m[0] - s, + m[1] - s, + m[2] - s, + m[3] - s + ); +} + +GLM_FUNC_QUALIFIER fmat4x4SIMD operator- +( + float const & s, + const fmat4x4SIMD &m +) +{ + return detail::fmat4x4SIMD + ( + s - m[0], + s - m[1], + s - m[2], + s - m[3] + ); +} + +GLM_FUNC_QUALIFIER fmat4x4SIMD operator- +( + const fmat4x4SIMD &m1, + const fmat4x4SIMD &m2 +) +{ + return detail::fmat4x4SIMD + ( + m1[0] - m2[0], + m1[1] - m2[1], + m1[2] - m2[2], + m1[3] - m2[3] + ); +} + + +GLM_FUNC_QUALIFIER fmat4x4SIMD operator* +( + const fmat4x4SIMD &m, + float const & s +) +{ + return detail::fmat4x4SIMD + ( + m[0] * s, + m[1] * s, + m[2] * s, + m[3] * s + ); +} + +GLM_FUNC_QUALIFIER fmat4x4SIMD operator* +( + float const & s, + const fmat4x4SIMD &m +) +{ + return detail::fmat4x4SIMD + ( + m[0] * s, + m[1] * s, + m[2] * s, + m[3] * s + ); +} + +GLM_FUNC_QUALIFIER fvec4SIMD operator* +( + const fmat4x4SIMD &m, + fvec4SIMD const & v +) +{ + return sse_mul_ps(&m.Data[0].Data, v.Data); +} + +GLM_FUNC_QUALIFIER fvec4SIMD operator* +( + fvec4SIMD const & v, + const fmat4x4SIMD &m +) +{ + return sse_mul_ps(v.Data, &m.Data[0].Data); +} + +GLM_FUNC_QUALIFIER fmat4x4SIMD operator* +( + const fmat4x4SIMD &m1, + const fmat4x4SIMD &m2 +) +{ + fmat4x4SIMD result; + sse_mul_ps(&m1.Data[0].Data, &m2.Data[0].Data, &result.Data[0].Data); + + return result; +} + + + +GLM_FUNC_QUALIFIER fmat4x4SIMD operator/ +( + const fmat4x4SIMD &m, + float const & s +) +{ + return detail::fmat4x4SIMD + ( + m[0] / s, + m[1] / s, + m[2] / s, + m[3] / s + ); +} + +GLM_FUNC_QUALIFIER fmat4x4SIMD operator/ +( + float const & s, + const fmat4x4SIMD &m +) +{ + return detail::fmat4x4SIMD + ( + s / m[0], + s / m[1], + s / m[2], + s / m[3] + ); +} + +GLM_FUNC_QUALIFIER fvec4SIMD operator/ +( + const fmat4x4SIMD &m, + fvec4SIMD const & v +) +{ + return inverse(m) * v; +} + +GLM_FUNC_QUALIFIER fvec4SIMD operator/ +( + fvec4SIMD const & v, + const fmat4x4SIMD &m +) +{ + return v * inverse(m); +} + +GLM_FUNC_QUALIFIER fmat4x4SIMD operator/ +( + const fmat4x4SIMD &m1, + const fmat4x4SIMD &m2 +) +{ + __m128 result[4]; + __m128 inv[4]; + + sse_inverse_ps(&m2.Data[0].Data, inv); + sse_mul_ps(&m1.Data[0].Data, inv, result); + + return fmat4x4SIMD(result); +} + + +////////////////////////////////////////////////////////////// +// Unary constant operators +GLM_FUNC_QUALIFIER fmat4x4SIMD const operator- +( + fmat4x4SIMD const & m +) +{ + return detail::fmat4x4SIMD + ( + -m[0], + -m[1], + -m[2], + -m[3] + ); +} + +GLM_FUNC_QUALIFIER fmat4x4SIMD const operator-- +( + fmat4x4SIMD const & m, + int +) +{ + return detail::fmat4x4SIMD + ( + m[0] - 1.0f, + m[1] - 1.0f, + m[2] - 1.0f, + m[3] - 1.0f + ); +} + +GLM_FUNC_QUALIFIER fmat4x4SIMD const operator++ +( + fmat4x4SIMD const & m, + int +) +{ + return detail::fmat4x4SIMD + ( + m[0] + 1.0f, + m[1] + 1.0f, + m[2] + 1.0f, + m[3] + 1.0f + ); +} + +}//namespace detail + +GLM_FUNC_QUALIFIER detail::tmat4x4<float> mat4_cast +( + detail::fmat4x4SIMD const & x +) +{ + GLM_ALIGN(16) detail::tmat4x4<float> Result; + _mm_store_ps(&Result[0][0], x.Data[0].Data); + _mm_store_ps(&Result[1][0], x.Data[1].Data); + _mm_store_ps(&Result[2][0], x.Data[2].Data); + _mm_store_ps(&Result[3][0], x.Data[3].Data); + return Result; +} + +GLM_FUNC_QUALIFIER detail::fmat4x4SIMD matrixCompMult +( + detail::fmat4x4SIMD const & x, + detail::fmat4x4SIMD const & y +) +{ + detail::fmat4x4SIMD result; + result[0] = x[0] * y[0]; + result[1] = x[1] * y[1]; + result[2] = x[2] * y[2]; + result[3] = x[3] * y[3]; + return result; +} + +GLM_FUNC_QUALIFIER detail::fmat4x4SIMD outerProduct +( + detail::fvec4SIMD const & c, + detail::fvec4SIMD const & r +) +{ + __m128 Shu0 = _mm_shuffle_ps(r.Data, r.Data, _MM_SHUFFLE(0, 0, 0, 0)); + __m128 Shu1 = _mm_shuffle_ps(r.Data, r.Data, _MM_SHUFFLE(1, 1, 1, 1)); + __m128 Shu2 = _mm_shuffle_ps(r.Data, r.Data, _MM_SHUFFLE(2, 2, 2, 2)); + __m128 Shu3 = _mm_shuffle_ps(r.Data, r.Data, _MM_SHUFFLE(3, 3, 3, 3)); + + detail::fmat4x4SIMD result(detail::fmat4x4SIMD::null); + result[0].Data = _mm_mul_ps(c.Data, Shu0); + result[1].Data = _mm_mul_ps(c.Data, Shu1); + result[2].Data = _mm_mul_ps(c.Data, Shu2); + result[3].Data = _mm_mul_ps(c.Data, Shu3); + return result; +} + +GLM_FUNC_QUALIFIER detail::fmat4x4SIMD transpose(detail::fmat4x4SIMD const & m) +{ + detail::fmat4x4SIMD result; + detail::sse_transpose_ps(&m[0].Data, &result[0].Data); + return result; +} + +GLM_FUNC_QUALIFIER float determinant(detail::fmat4x4SIMD const & m) +{ + float Result; + _mm_store_ss(&Result, detail::sse_det_ps(&m[0].Data)); + return Result; +} + +GLM_FUNC_QUALIFIER detail::fmat4x4SIMD inverse(detail::fmat4x4SIMD const & m) +{ + detail::fmat4x4SIMD result; + detail::sse_inverse_ps(&m[0].Data, &result[0].Data); + return result; +} + +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/simd_vec4.hpp b/include/gal/opengl/glm/gtx/simd_vec4.hpp new file mode 100644 index 0000000..6f60060 --- /dev/null +++ b/include/gal/opengl/glm/gtx/simd_vec4.hpp @@ -0,0 +1,517 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_simd_vec4 +/// @file glm/gtx/simd_vec4.hpp +/// @date 2009-05-07 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// +/// @defgroup gtx_simd_vec4 GLM_GTX_simd_vec4 +/// @ingroup gtx +/// +/// @brief SIMD implementation of vec4 type. +/// +/// <glm/gtx/simd_vec4.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_simd_vec4 +#define GLM_GTX_simd_vec4 GLM_VERSION + +// Dependency: +#include "../glm.hpp" + +#if(GLM_ARCH != GLM_ARCH_PURE) + +#if(GLM_ARCH & GLM_ARCH_SSE2) +# include "../core/intrinsic_common.hpp" +# include "../core/intrinsic_geometric.hpp" +#else +# error "GLM: GLM_GTX_simd_vec4 requires compiler support of SSE2 through intrinsics" +#endif + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_simd_vec4 extension included") +#endif + + +// Warning silencer for nameless struct/union. +#if (GLM_COMPILER & GLM_COMPILER_VC) +# pragma warning(push) +# pragma warning(disable:4201) // warning C4201: nonstandard extension used : nameless struct/union +#endif + + +namespace glm{ +namespace detail +{ + /// 4-dimensional vector implemented using SIMD SEE intrinsics. + /// \ingroup gtx_simd_vec4 + GLM_ALIGNED_STRUCT(16) fvec4SIMD + { + enum ctor{null}; + typedef __m128 value_type; + typedef std::size_t size_type; + static size_type value_size(); + + typedef fvec4SIMD type; + typedef tvec4<bool> bool_type; + +#ifdef GLM_SIMD_ENABLE_XYZW_UNION + union + { + __m128 Data; + struct {float x, y, z, w;}; + }; +#else + __m128 Data; +#endif + + ////////////////////////////////////// + // Implicit basic constructors + + fvec4SIMD(); + fvec4SIMD(__m128 const & Data); + fvec4SIMD(fvec4SIMD const & v); + + ////////////////////////////////////// + // Explicit basic constructors + + explicit fvec4SIMD( + ctor); + explicit fvec4SIMD( + float const & s); + explicit fvec4SIMD( + float const & x, + float const & y, + float const & z, + float const & w); + explicit fvec4SIMD( + tvec4<float> const & v); + + //////////////////////////////////////// + //// Convertion vector constructors + + fvec4SIMD(vec2 const & v, float const & s1, float const & s2); + fvec4SIMD(float const & s1, vec2 const & v, float const & s2); + fvec4SIMD(float const & s1, float const & s2, vec2 const & v); + fvec4SIMD(vec3 const & v, float const & s); + fvec4SIMD(float const & s, vec3 const & v); + fvec4SIMD(vec2 const & v1, vec2 const & v2); + //fvec4SIMD(ivec4SIMD const & v); + + ////////////////////////////////////// + // Unary arithmetic operators + + fvec4SIMD& operator= (fvec4SIMD const & v); + fvec4SIMD& operator+=(fvec4SIMD const & v); + fvec4SIMD& operator-=(fvec4SIMD const & v); + fvec4SIMD& operator*=(fvec4SIMD const & v); + fvec4SIMD& operator/=(fvec4SIMD const & v); + + fvec4SIMD& operator+=(float const & s); + fvec4SIMD& operator-=(float const & s); + fvec4SIMD& operator*=(float const & s); + fvec4SIMD& operator/=(float const & s); + + fvec4SIMD& operator++(); + fvec4SIMD& operator--(); + + ////////////////////////////////////// + // Swizzle operators + + template <comp X, comp Y, comp Z, comp W> + fvec4SIMD& swizzle(); + template <comp X, comp Y, comp Z, comp W> + fvec4SIMD swizzle() const; + template <comp X, comp Y, comp Z> + fvec4SIMD swizzle() const; + template <comp X, comp Y> + fvec4SIMD swizzle() const; + template <comp X> + fvec4SIMD swizzle() const; + }; +}//namespace detail + + typedef glm::detail::fvec4SIMD simdVec4; + + /// @addtogroup gtx_simd_vec4 + /// @{ + + //! Convert a simdVec4 to a vec4. + //! (From GLM_GTX_simd_vec4 extension) + detail::tvec4<float> vec4_cast( + detail::fvec4SIMD const & x); + + //! Returns x if x >= 0; otherwise, it returns -x. + //! (From GLM_GTX_simd_vec4 extension, common function) + detail::fvec4SIMD abs(detail::fvec4SIMD const & x); + + //! Returns 1.0 if x > 0, 0.0 if x = 0, or -1.0 if x < 0. + //! (From GLM_GTX_simd_vec4 extension, common function) + detail::fvec4SIMD sign(detail::fvec4SIMD const & x); + + //! Returns a value equal to the nearest integer that is less then or equal to x. + //! (From GLM_GTX_simd_vec4 extension, common function) + detail::fvec4SIMD floor(detail::fvec4SIMD const & x); + + //! Returns a value equal to the nearest integer to x + //! whose absolute value is not larger than the absolute value of x. + //! (From GLM_GTX_simd_vec4 extension, common function) + detail::fvec4SIMD trunc(detail::fvec4SIMD const & x); + + //! Returns a value equal to the nearest integer to x. + //! The fraction 0.5 will round in a direction chosen by the + //! implementation, presumably the direction that is fastest. + //! This includes the possibility that round(x) returns the + //! same value as roundEven(x) for all values of x. + //! (From GLM_GTX_simd_vec4 extension, common function) + detail::fvec4SIMD round(detail::fvec4SIMD const & x); + + //! Returns a value equal to the nearest integer to x. + //! A fractional part of 0.5 will round toward the nearest even + //! integer. (Both 3.5 and 4.5 for x will return 4.0.) + //! (From GLM_GTX_simd_vec4 extension, common function) + //detail::fvec4SIMD roundEven(detail::fvec4SIMD const & x); + + //! Returns a value equal to the nearest integer + //! that is greater than or equal to x. + //! (From GLM_GTX_simd_vec4 extension, common function) + detail::fvec4SIMD ceil(detail::fvec4SIMD const & x); + + //! Return x - floor(x). + //! (From GLM_GTX_simd_vec4 extension, common function) + detail::fvec4SIMD fract(detail::fvec4SIMD const & x); + + //! Modulus. Returns x - y * floor(x / y) + //! for each component in x using the floating point value y. + //! (From GLM_GTX_simd_vec4 extension, common function) + detail::fvec4SIMD mod( + detail::fvec4SIMD const & x, + detail::fvec4SIMD const & y); + + //! Modulus. Returns x - y * floor(x / y) + //! for each component in x using the floating point value y. + //! (From GLM_GTX_simd_vec4 extension, common function) + detail::fvec4SIMD mod( + detail::fvec4SIMD const & x, + float const & y); + + //! Returns the fractional part of x and sets i to the integer + //! part (as a whole number floating point value). Both the + //! return value and the output parameter will have the same + //! sign as x. + //! (From GLM_GTX_simd_vec4 extension, common function) + //detail::fvec4SIMD modf( + // detail::fvec4SIMD const & x, + // detail::fvec4SIMD & i); + + //! Returns y if y < x; otherwise, it returns x. + //! (From GLM_GTX_simd_vec4 extension, common function) + detail::fvec4SIMD min( + detail::fvec4SIMD const & x, + detail::fvec4SIMD const & y); + + detail::fvec4SIMD min( + detail::fvec4SIMD const & x, + float const & y); + + //! Returns y if x < y; otherwise, it returns x. + //! (From GLM_GTX_simd_vec4 extension, common function) + detail::fvec4SIMD max( + detail::fvec4SIMD const & x, + detail::fvec4SIMD const & y); + + detail::fvec4SIMD max( + detail::fvec4SIMD const & x, + float const & y); + + //! Returns min(max(x, minVal), maxVal) for each component in x + //! using the floating-point values minVal and maxVal. + //! (From GLM_GTX_simd_vec4 extension, common function) + detail::fvec4SIMD clamp( + detail::fvec4SIMD const & x, + detail::fvec4SIMD const & minVal, + detail::fvec4SIMD const & maxVal); + + detail::fvec4SIMD clamp( + detail::fvec4SIMD const & x, + float const & minVal, + float const & maxVal); + + //! \return If genTypeU is a floating scalar or vector: + //! Returns x * (1.0 - a) + y * a, i.e., the linear blend of + //! x and y using the floating-point value a. + //! The value for a is not restricted to the range [0, 1]. + //! + //! \return If genTypeU is a boolean scalar or vector: + //! Selects which vector each returned component comes + //! from. For a component of a that is false, the + //! corresponding component of x is returned. For a + //! component of a that is true, the corresponding + //! component of y is returned. Components of x and y that + //! are not selected are allowed to be invalid floating point + //! values and will have no effect on the results. Thus, this + //! provides different functionality than + //! genType mix(genType x, genType y, genType(a)) + //! where a is a Boolean vector. + //! + //! From GLSL 1.30.08 specification, section 8.3 + //! + //! \param[in] x Floating point scalar or vector. + //! \param[in] y Floating point scalar or vector. + //! \param[in] a Floating point or boolean scalar or vector. + //! + // \todo Test when 'a' is a boolean. + //! (From GLM_GTX_simd_vec4 extension, common function) + detail::fvec4SIMD mix( + detail::fvec4SIMD const & x, + detail::fvec4SIMD const & y, + detail::fvec4SIMD const & a); + + //! Returns 0.0 if x < edge, otherwise it returns 1.0. + //! (From GLM_GTX_simd_vec4 extension, common function) + detail::fvec4SIMD step( + detail::fvec4SIMD const & edge, + detail::fvec4SIMD const & x); + + detail::fvec4SIMD step( + float const & edge, + detail::fvec4SIMD const & x); + + //! Returns 0.0 if x <= edge0 and 1.0 if x >= edge1 and + //! performs smooth Hermite interpolation between 0 and 1 + //! when edge0 < x < edge1. This is useful in cases where + //! you would want a threshold function with a smooth + //! transition. This is equivalent to: + //! genType t; + //! t = clamp ((x - edge0) / (edge1 - edge0), 0, 1); + //! return t * t * (3 - 2 * t); + //! Results are undefined if edge0 >= edge1. + //! (From GLM_GTX_simd_vec4 extension, common function) + detail::fvec4SIMD smoothstep( + detail::fvec4SIMD const & edge0, + detail::fvec4SIMD const & edge1, + detail::fvec4SIMD const & x); + + detail::fvec4SIMD smoothstep( + float const & edge0, + float const & edge1, + detail::fvec4SIMD const & x); + + //! Returns true if x holds a NaN (not a number) + //! representation in the underlying implementation's set of + //! floating point representations. Returns false otherwise, + //! including for implementations with no NaN + //! representations. + //! (From GLM_GTX_simd_vec4 extension, common function) + //bvec4 isnan(detail::fvec4SIMD const & x); + + //! Returns true if x holds a positive infinity or negative + //! infinity representation in the underlying implementation's + //! set of floating point representations. Returns false + //! otherwise, including for implementations with no infinity + //! representations. + //! (From GLM_GTX_simd_vec4 extension, common function) + //bvec4 isinf(detail::fvec4SIMD const & x); + + //! Returns a signed or unsigned integer value representing + //! the encoding of a floating-point value. The floatingpoint + //! value's bit-level representation is preserved. + //! (From GLM_GTX_simd_vec4 extension, common function) + //detail::ivec4SIMD floatBitsToInt(detail::fvec4SIMD const & value); + + //! Returns a floating-point value corresponding to a signed + //! or unsigned integer encoding of a floating-point value. + //! If an inf or NaN is passed in, it will not signal, and the + //! resulting floating point value is unspecified. Otherwise, + //! the bit-level representation is preserved. + //! (From GLM_GTX_simd_vec4 extension, common function) + //detail::fvec4SIMD intBitsToFloat(detail::ivec4SIMD const & value); + + //! Computes and returns a * b + c. + //! (From GLM_GTX_simd_vec4 extension, common function) + detail::fvec4SIMD fma( + detail::fvec4SIMD const & a, + detail::fvec4SIMD const & b, + detail::fvec4SIMD const & c); + + //! Splits x into a floating-point significand in the range + //! [0.5, 1.0) and an integral exponent of two, such that: + //! x = significand * exp(2, exponent) + //! The significand is returned by the function and the + //! exponent is returned in the parameter exp. For a + //! floating-point value of zero, the significant and exponent + //! are both zero. For a floating-point value that is an + //! infinity or is not a number, the results are undefined. + //! (From GLM_GTX_simd_vec4 extension, common function) + //detail::fvec4SIMD frexp(detail::fvec4SIMD const & x, detail::ivec4SIMD & exp); + + //! Builds a floating-point number from x and the + //! corresponding integral exponent of two in exp, returning: + //! significand * exp(2, exponent) + //! If this product is too large to be represented in the + //! floating-point type, the result is undefined. + //! (From GLM_GTX_simd_vec4 extension, common function) + //detail::fvec4SIMD ldexp(detail::fvec4SIMD const & x, detail::ivec4SIMD const & exp); + + //! Returns the length of x, i.e., sqrt(x * x). + //! (From GLM_GTX_simd_vec4 extension, geometry functions) + float length( + detail::fvec4SIMD const & x); + + //! Returns the length of x, i.e., sqrt(x * x). + //! Less accurate but much faster than simdLength. + //! (From GLM_GTX_simd_vec4 extension, geometry functions) + float fastLength( + detail::fvec4SIMD const & x); + + //! Returns the length of x, i.e., sqrt(x * x). + //! Slightly more accurate but much slower than simdLength. + //! (From GLM_GTX_simd_vec4 extension, geometry functions) + float niceLength( + detail::fvec4SIMD const & x); + + //! Returns the length of x, i.e., sqrt(x * x). + //! (From GLM_GTX_simd_vec4 extension, geometry functions) + detail::fvec4SIMD length4( + detail::fvec4SIMD const & x); + + //! Returns the length of x, i.e., sqrt(x * x). + //! Less accurate but much faster than simdLength4. + //! (From GLM_GTX_simd_vec4 extension, geometry functions) + detail::fvec4SIMD fastLength4( + detail::fvec4SIMD const & x); + + //! Returns the length of x, i.e., sqrt(x * x). + //! Slightly more accurate but much slower than simdLength4. + //! (From GLM_GTX_simd_vec4 extension, geometry functions) + detail::fvec4SIMD niceLength4( + detail::fvec4SIMD const & x); + + //! Returns the distance betwwen p0 and p1, i.e., length(p0 - p1). + //! (From GLM_GTX_simd_vec4 extension, geometry functions) + float distance( + detail::fvec4SIMD const & p0, + detail::fvec4SIMD const & p1); + + //! Returns the distance betwwen p0 and p1, i.e., length(p0 - p1). + //! (From GLM_GTX_simd_vec4 extension, geometry functions) + detail::fvec4SIMD distance4( + detail::fvec4SIMD const & p0, + detail::fvec4SIMD const & p1); + + //! Returns the dot product of x and y, i.e., result = x * y. + //! (From GLM_GTX_simd_vec4 extension, geometry functions) + float simdDot( + detail::fvec4SIMD const & x, + detail::fvec4SIMD const & y); + + //! Returns the dot product of x and y, i.e., result = x * y. + //! (From GLM_GTX_simd_vec4 extension, geometry functions) + detail::fvec4SIMD dot4( + detail::fvec4SIMD const & x, + detail::fvec4SIMD const & y); + + //! Returns the cross product of x and y. + //! (From GLM_GTX_simd_vec4 extension, geometry functions) + detail::fvec4SIMD cross( + detail::fvec4SIMD const & x, + detail::fvec4SIMD const & y); + + //! Returns a vector in the same direction as x but with length of 1. + //! (From GLM_GTX_simd_vec4 extension, geometry functions) + detail::fvec4SIMD normalize( + detail::fvec4SIMD const & x); + + //! Returns a vector in the same direction as x but with length of 1. + //! Less accurate but much faster than simdNormalize. + //! (From GLM_GTX_simd_vec4 extension, geometry functions) + detail::fvec4SIMD fastNormalize( + detail::fvec4SIMD const & x); + + //! If dot(Nref, I) < 0.0, return N, otherwise, return -N. + //! (From GLM_GTX_simd_vec4 extension, geometry functions) + detail::fvec4SIMD simdFaceforward( + detail::fvec4SIMD const & N, + detail::fvec4SIMD const & I, + detail::fvec4SIMD const & Nref); + + //! For the incident vector I and surface orientation N, + //! returns the reflection direction : result = I - 2.0 * dot(N, I) * N. + //! (From GLM_GTX_simd_vec4 extension, geometry functions) + detail::fvec4SIMD reflect( + detail::fvec4SIMD const & I, + detail::fvec4SIMD const & N); + + //! For the incident vector I and surface normal N, + //! and the ratio of indices of refraction eta, + //! return the refraction vector. + //! (From GLM_GTX_simd_vec4 extension, geometry functions) + detail::fvec4SIMD refract( + detail::fvec4SIMD const & I, + detail::fvec4SIMD const & N, + float const & eta); + + //! Returns the positive square root of x. + //! (From GLM_GTX_simd_vec4 extension, exponential function) + detail::fvec4SIMD sqrt( + detail::fvec4SIMD const & x); + + //! Returns the positive square root of x with the nicest quality but very slow. + //! Slightly more accurate but much slower than simdSqrt. + //! (From GLM_GTX_simd_vec4 extension, exponential function) + detail::fvec4SIMD niceSqrt( + detail::fvec4SIMD const & x); + + //! Returns the positive square root of x + //! Less accurate but much faster than sqrt. + //! (From GLM_GTX_simd_vec4 extension, exponential function) + detail::fvec4SIMD fastSqrt( + detail::fvec4SIMD const & x); + + //! Returns the reciprocal of the positive square root of x. + //! (From GLM_GTX_simd_vec4 extension, exponential function) + detail::fvec4SIMD inversesqrt( + detail::fvec4SIMD const & x); + + //! Returns the reciprocal of the positive square root of x. + //! Faster than inversesqrt but less accurate. + //! (From GLM_GTX_simd_vec4 extension, exponential function) + detail::fvec4SIMD fastInversesqrt( + detail::fvec4SIMD const & x); + + /// @} +}//namespace glm + +#include "simd_vec4.inl" + + +#if (GLM_COMPILER & GLM_COMPILER_VC) +# pragma warning(pop) +#endif + + +#endif//(GLM_ARCH != GLM_ARCH_PURE) + +#endif//GLM_GTX_simd_vec4 diff --git a/include/gal/opengl/glm/gtx/simd_vec4.inl b/include/gal/opengl/glm/gtx/simd_vec4.inl new file mode 100644 index 0000000..0b22115 --- /dev/null +++ b/include/gal/opengl/glm/gtx/simd_vec4.inl @@ -0,0 +1,727 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2009-05-07 +// Updated : 2009-05-07 +// Licence : This source is under MIT License +// File : glm/gtx/simd_vec4.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm{ +namespace detail{ + +template <int Value> +struct mask +{ + enum{value = Value}; +}; + +////////////////////////////////////// +// Implicit basic constructors + +GLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD() +#ifdef GLM_SIMD_ENABLE_DEFAULT_INIT + : Data(_mm_set_ps(0.0f, 0.0f, 0.0f, 0.0f)) +#endif +{} + +GLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(__m128 const & Data) : + Data(Data) +{} + +GLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(fvec4SIMD const & v) : + Data(v.Data) +{} + +GLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(tvec4<float> const & v) : + Data(_mm_set_ps(v.w, v.z, v.y, v.x)) +{} + +////////////////////////////////////// +// Explicit basic constructors + +GLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(float const & s) : + Data(_mm_set1_ps(s)) +{} + +GLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(float const & x, float const & y, float const & z, float const & w) : +// Data(_mm_setr_ps(x, y, z, w)) + Data(_mm_set_ps(w, z, y, x)) +{} +/* +GLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(float const v[4]) : + Data(_mm_load_ps(v)) +{} +*/ +////////////////////////////////////// +// Swizzle constructors + +//fvec4SIMD(ref4<float> const & r); + +////////////////////////////////////// +// Convertion vector constructors + +GLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(vec2 const & v, float const & s1, float const & s2) : + Data(_mm_set_ps(s2, s1, v.y, v.x)) +{} + +GLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(float const & s1, vec2 const & v, float const & s2) : + Data(_mm_set_ps(s2, v.y, v.x, s1)) +{} + +GLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(float const & s1, float const & s2, vec2 const & v) : + Data(_mm_set_ps(v.y, v.x, s2, s1)) +{} + +GLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(vec3 const & v, float const & s) : + Data(_mm_set_ps(s, v.z, v.y, v.x)) +{} + +GLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(float const & s, vec3 const & v) : + Data(_mm_set_ps(v.z, v.y, v.x, s)) +{} + +GLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(vec2 const & v1, vec2 const & v2) : + Data(_mm_set_ps(v2.y, v2.x, v1.y, v1.x)) +{} + +//GLM_FUNC_QUALIFIER fvec4SIMD::fvec4SIMD(ivec4SIMD const & v) : +// Data(_mm_cvtepi32_ps(v.Data)) +//{} + +////////////////////////////////////// +// Unary arithmetic operators + +GLM_FUNC_QUALIFIER fvec4SIMD& fvec4SIMD::operator=(fvec4SIMD const & v) +{ + this->Data = v.Data; + return *this; +} + +GLM_FUNC_QUALIFIER fvec4SIMD& fvec4SIMD::operator+=(float const & s) +{ + this->Data = _mm_add_ps(Data, _mm_set_ps1(s)); + return *this; +} + +GLM_FUNC_QUALIFIER fvec4SIMD& fvec4SIMD::operator+=(fvec4SIMD const & v) +{ + this->Data = _mm_add_ps(this->Data , v.Data); + return *this; +} + +GLM_FUNC_QUALIFIER fvec4SIMD& fvec4SIMD::operator-=(float const & s) +{ + this->Data = _mm_sub_ps(Data, _mm_set_ps1(s)); + return *this; +} + +GLM_FUNC_QUALIFIER fvec4SIMD& fvec4SIMD::operator-=(fvec4SIMD const & v) +{ + this->Data = _mm_sub_ps(this->Data , v.Data); + return *this; +} + +GLM_FUNC_QUALIFIER fvec4SIMD& fvec4SIMD::operator*=(float const & s) +{ + this->Data = _mm_mul_ps(this->Data, _mm_set_ps1(s)); + return *this; +} + +GLM_FUNC_QUALIFIER fvec4SIMD& fvec4SIMD::operator*=(fvec4SIMD const & v) +{ + this->Data = _mm_mul_ps(this->Data , v.Data); + return *this; +} + +GLM_FUNC_QUALIFIER fvec4SIMD& fvec4SIMD::operator/=(float const & s) +{ + this->Data = _mm_div_ps(Data, _mm_set1_ps(s)); + return *this; +} + +GLM_FUNC_QUALIFIER fvec4SIMD& fvec4SIMD::operator/=(fvec4SIMD const & v) +{ + this->Data = _mm_div_ps(this->Data , v.Data); + return *this; +} + +GLM_FUNC_QUALIFIER fvec4SIMD& fvec4SIMD::operator++() +{ + this->Data = _mm_add_ps(this->Data , glm::detail::one); + return *this; +} + +GLM_FUNC_QUALIFIER fvec4SIMD& fvec4SIMD::operator--() +{ + this->Data = _mm_sub_ps(this->Data, glm::detail::one); + return *this; +} + +////////////////////////////////////// +// Swizzle operators + +template <comp X, comp Y, comp Z, comp W> +GLM_FUNC_QUALIFIER fvec4SIMD fvec4SIMD::swizzle() const +{ + __m128 Data = _mm_shuffle_ps( + this->Data, this->Data, + mask<(W << 6) | (Z << 4) | (Y << 2) | (X << 0)>::value); + return fvec4SIMD(Data); +} + +template <comp X, comp Y, comp Z, comp W> +GLM_FUNC_QUALIFIER fvec4SIMD& fvec4SIMD::swizzle() +{ + this->Data = _mm_shuffle_ps( + this->Data, this->Data, + mask<(W << 6) | (Z << 4) | (Y << 2) | (X << 0)>::value); + return *this; +} + +// operator+ +GLM_FUNC_QUALIFIER fvec4SIMD operator+ (fvec4SIMD const & v, float s) +{ + return fvec4SIMD(_mm_add_ps(v.Data, _mm_set1_ps(s))); +} + +GLM_FUNC_QUALIFIER fvec4SIMD operator+ (float s, fvec4SIMD const & v) +{ + return fvec4SIMD(_mm_add_ps(_mm_set1_ps(s), v.Data)); +} + +GLM_FUNC_QUALIFIER fvec4SIMD operator+ (fvec4SIMD const & v1, fvec4SIMD const & v2) +{ + return fvec4SIMD(_mm_add_ps(v1.Data, v2.Data)); +} + +//operator- +GLM_FUNC_QUALIFIER fvec4SIMD operator- (fvec4SIMD const & v, float s) +{ + return fvec4SIMD(_mm_sub_ps(v.Data, _mm_set1_ps(s))); +} + +GLM_FUNC_QUALIFIER fvec4SIMD operator- (float s, fvec4SIMD const & v) +{ + return fvec4SIMD(_mm_sub_ps(_mm_set1_ps(s), v.Data)); +} + +GLM_FUNC_QUALIFIER fvec4SIMD operator- (fvec4SIMD const & v1, fvec4SIMD const & v2) +{ + return fvec4SIMD(_mm_sub_ps(v1.Data, v2.Data)); +} + +//operator* +GLM_FUNC_QUALIFIER fvec4SIMD operator* (fvec4SIMD const & v, float s) +{ + __m128 par0 = v.Data; + __m128 par1 = _mm_set1_ps(s); + return fvec4SIMD(_mm_mul_ps(par0, par1)); +} + +GLM_FUNC_QUALIFIER fvec4SIMD operator* (float s, fvec4SIMD const & v) +{ + __m128 par0 = _mm_set1_ps(s); + __m128 par1 = v.Data; + return fvec4SIMD(_mm_mul_ps(par0, par1)); +} + +GLM_FUNC_QUALIFIER fvec4SIMD operator* (fvec4SIMD const & v1, fvec4SIMD const & v2) +{ + return fvec4SIMD(_mm_mul_ps(v1.Data, v2.Data)); +} + +//operator/ +GLM_FUNC_QUALIFIER fvec4SIMD operator/ (fvec4SIMD const & v, float s) +{ + __m128 par0 = v.Data; + __m128 par1 = _mm_set1_ps(s); + return fvec4SIMD(_mm_div_ps(par0, par1)); +} + +GLM_FUNC_QUALIFIER fvec4SIMD operator/ (float s, fvec4SIMD const & v) +{ + __m128 par0 = _mm_set1_ps(s); + __m128 par1 = v.Data; + return fvec4SIMD(_mm_div_ps(par0, par1)); +} + +GLM_FUNC_QUALIFIER fvec4SIMD operator/ (fvec4SIMD const & v1, fvec4SIMD const & v2) +{ + return fvec4SIMD(_mm_div_ps(v1.Data, v2.Data)); +} + +// Unary constant operators +GLM_FUNC_QUALIFIER fvec4SIMD operator- (fvec4SIMD const & v) +{ + return fvec4SIMD(_mm_sub_ps(_mm_setzero_ps(), v.Data)); +} + +GLM_FUNC_QUALIFIER fvec4SIMD operator++ (fvec4SIMD const & v, int) +{ + return fvec4SIMD(_mm_add_ps(v.Data, glm::detail::one)); +} + +GLM_FUNC_QUALIFIER fvec4SIMD operator-- (fvec4SIMD const & v, int) +{ + return fvec4SIMD(_mm_sub_ps(v.Data, glm::detail::one)); +} + +}//namespace detail + +GLM_FUNC_QUALIFIER detail::tvec4<float> vec4_cast +( + detail::fvec4SIMD const & x +) +{ + GLM_ALIGN(16) detail::tvec4<float> Result; + _mm_store_ps(&Result[0], x.Data); + return Result; +} + +// Other possible implementation +//float abs(float a) +//{ +// return max(-a, a); +//} +GLM_FUNC_QUALIFIER detail::fvec4SIMD abs +( + detail::fvec4SIMD const & x +) +{ + return detail::sse_abs_ps(x.Data); +} + +GLM_FUNC_QUALIFIER detail::fvec4SIMD sign +( + detail::fvec4SIMD const & x +) +{ + return detail::sse_sgn_ps(x.Data); +} + +GLM_FUNC_QUALIFIER detail::fvec4SIMD floor +( + detail::fvec4SIMD const & x +) +{ + return detail::sse_flr_ps(x.Data); +} + +GLM_FUNC_QUALIFIER detail::fvec4SIMD trunc +( + detail::fvec4SIMD const & x +) +{ + //return x < 0 ? -floor(-x) : floor(x); + + __m128 Flr0 = detail::sse_flr_ps(_mm_sub_ps(_mm_setzero_ps(), x.Data)); + __m128 Sub0 = _mm_sub_ps(Flr0, x.Data); + __m128 Flr1 = detail::sse_flr_ps(x.Data); + + __m128 Cmp0 = _mm_cmplt_ps(x.Data, glm::detail::zero); + __m128 Cmp1 = _mm_cmpnlt_ps(x.Data, glm::detail::zero); + + __m128 And0 = _mm_and_ps(Sub0, Cmp0); + __m128 And1 = _mm_and_ps(Flr1, Cmp1); + + return _mm_or_ps(And0, And1); +} + +GLM_FUNC_QUALIFIER detail::fvec4SIMD round +( + detail::fvec4SIMD const & x +) +{ + return detail::sse_rnd_ps(x.Data); +} + +//GLM_FUNC_QUALIFIER detail::fvec4SIMD roundEven +//( +// detail::fvec4SIMD const & x +//) +//{ + +//} + +GLM_FUNC_QUALIFIER detail::fvec4SIMD ceil +( + detail::fvec4SIMD const & x +) +{ + return detail::sse_ceil_ps(x.Data); +} + +GLM_FUNC_QUALIFIER detail::fvec4SIMD fract +( + detail::fvec4SIMD const & x +) +{ + return detail::sse_frc_ps(x.Data); +} + +GLM_FUNC_QUALIFIER detail::fvec4SIMD mod +( + detail::fvec4SIMD const & x, + detail::fvec4SIMD const & y +) +{ + return detail::sse_mod_ps(x.Data, y.Data); +} + +GLM_FUNC_QUALIFIER detail::fvec4SIMD mod +( + detail::fvec4SIMD const & x, + float const & y +) +{ + return detail::sse_mod_ps(x.Data, _mm_set1_ps(y)); +} + +//GLM_FUNC_QUALIFIER detail::fvec4SIMD modf +//( +// detail::fvec4SIMD const & x, +// detail::fvec4SIMD & i +//) +//{ + +//} + +GLM_FUNC_QUALIFIER detail::fvec4SIMD min +( + detail::fvec4SIMD const & x, + detail::fvec4SIMD const & y +) +{ + return _mm_min_ps(x.Data, y.Data); +} + +GLM_FUNC_QUALIFIER detail::fvec4SIMD min +( + detail::fvec4SIMD const & x, + float const & y +) +{ + return _mm_min_ps(x.Data, _mm_set1_ps(y)); +} + +GLM_FUNC_QUALIFIER detail::fvec4SIMD max +( + detail::fvec4SIMD const & x, + detail::fvec4SIMD const & y +) +{ + return _mm_max_ps(x.Data, y.Data); +} + +GLM_FUNC_QUALIFIER detail::fvec4SIMD max +( + detail::fvec4SIMD const & x, + float const & y +) +{ + return _mm_max_ps(x.Data, _mm_set1_ps(y)); +} + +GLM_FUNC_QUALIFIER detail::fvec4SIMD clamp +( + detail::fvec4SIMD const & x, + detail::fvec4SIMD const & minVal, + detail::fvec4SIMD const & maxVal +) +{ + return detail::sse_clp_ps(x.Data, minVal.Data, maxVal.Data); +} + +GLM_FUNC_QUALIFIER detail::fvec4SIMD clamp +( + detail::fvec4SIMD const & x, + float const & minVal, + float const & maxVal +) +{ + return detail::sse_clp_ps(x.Data, _mm_set1_ps(minVal), _mm_set1_ps(maxVal)); +} + +GLM_FUNC_QUALIFIER detail::fvec4SIMD mix +( + detail::fvec4SIMD const & x, + detail::fvec4SIMD const & y, + detail::fvec4SIMD const & a +) +{ + __m128 Sub0 = _mm_sub_ps(y.Data, x.Data); + __m128 Mul0 = _mm_mul_ps(a.Data, Sub0); + return _mm_add_ps(x.Data, Mul0); +} + +GLM_FUNC_QUALIFIER detail::fvec4SIMD step +( + detail::fvec4SIMD const & edge, + detail::fvec4SIMD const & x +) +{ + __m128 cmp0 = _mm_cmpngt_ps(x.Data, edge.Data); + return _mm_max_ps(_mm_min_ps(cmp0, _mm_setzero_ps()), detail::one); +} + +GLM_FUNC_QUALIFIER detail::fvec4SIMD step +( + float const & edge, + detail::fvec4SIMD const & x +) +{ + __m128 cmp0 = _mm_cmpngt_ps(x.Data, _mm_set1_ps(edge)); + return _mm_max_ps(_mm_min_ps(cmp0, _mm_setzero_ps()), detail::one); +} + +GLM_FUNC_QUALIFIER detail::fvec4SIMD smoothstep +( + detail::fvec4SIMD const & edge0, + detail::fvec4SIMD const & edge1, + detail::fvec4SIMD const & x +) +{ + return detail::sse_ssp_ps(edge0.Data, edge1.Data, x.Data); +} + +GLM_FUNC_QUALIFIER detail::fvec4SIMD smoothstep +( + float const & edge0, + float const & edge1, + detail::fvec4SIMD const & x +) +{ + return detail::sse_ssp_ps(_mm_set1_ps(edge0), _mm_set1_ps(edge1), x.Data); +} + +//GLM_FUNC_QUALIFIER bvec4 isnan(detail::fvec4SIMD const & x) +//{ + +//} + +//GLM_FUNC_QUALIFIER bvec4 isinf(detail::fvec4SIMD const & x) +//{ + +//} + +//GLM_FUNC_QUALIFIER detail::ivec4SIMD floatBitsToInt +//( +// detail::fvec4SIMD const & value +//) +//{ + +//} + +//GLM_FUNC_QUALIFIER detail::fvec4SIMD intBitsToFloat +//( +// detail::ivec4SIMD const & value +//) +//{ + +//} + +GLM_FUNC_QUALIFIER detail::fvec4SIMD fma +( + detail::fvec4SIMD const & a, + detail::fvec4SIMD const & b, + detail::fvec4SIMD const & c +) +{ + return _mm_add_ps(_mm_mul_ps(a.Data, b.Data), c.Data); +} + +GLM_FUNC_QUALIFIER float length +( + detail::fvec4SIMD const & x +) +{ + detail::fvec4SIMD dot0 = detail::sse_dot_ss(x.Data, x.Data); + detail::fvec4SIMD sqt0 = sqrt(dot0); + float Result = 0; + _mm_store_ss(&Result, sqt0.Data); + return Result; +} + +GLM_FUNC_QUALIFIER float fastLength +( + detail::fvec4SIMD const & x +) +{ + detail::fvec4SIMD dot0 = detail::sse_dot_ss(x.Data, x.Data); + detail::fvec4SIMD sqt0 = fastSqrt(dot0); + float Result = 0; + _mm_store_ss(&Result, sqt0.Data); + return Result; +} + +GLM_FUNC_QUALIFIER float niceLength +( + detail::fvec4SIMD const & x +) +{ + detail::fvec4SIMD dot0 = detail::sse_dot_ss(x.Data, x.Data); + detail::fvec4SIMD sqt0 = niceSqrt(dot0); + float Result = 0; + _mm_store_ss(&Result, sqt0.Data); + return Result; +} + +GLM_FUNC_QUALIFIER detail::fvec4SIMD length4 +( + detail::fvec4SIMD const & x +) +{ + return sqrt(dot4(x, x)); +} + +GLM_FUNC_QUALIFIER detail::fvec4SIMD fastLength4 +( + detail::fvec4SIMD const & x +) +{ + return fastSqrt(dot4(x, x)); +} + +GLM_FUNC_QUALIFIER detail::fvec4SIMD niceLength4 +( + detail::fvec4SIMD const & x +) +{ + return niceSqrt(dot4(x, x)); +} + +GLM_FUNC_QUALIFIER float distance +( + detail::fvec4SIMD const & p0, + detail::fvec4SIMD const & p1 +) +{ + float Result = 0; + _mm_store_ss(&Result, detail::sse_dst_ps(p0.Data, p1.Data)); + return Result; +} + +GLM_FUNC_QUALIFIER detail::fvec4SIMD distance4 +( + detail::fvec4SIMD const & p0, + detail::fvec4SIMD const & p1 +) +{ + return detail::sse_dst_ps(p0.Data, p1.Data); +} + +GLM_FUNC_QUALIFIER float dot +( + detail::fvec4SIMD const & x, + detail::fvec4SIMD const & y +) +{ + float Result = 0; + _mm_store_ss(&Result, detail::sse_dot_ss(x.Data, y.Data)); + return Result; +} + +GLM_FUNC_QUALIFIER detail::fvec4SIMD dot4 +( + detail::fvec4SIMD const & x, + detail::fvec4SIMD const & y +) +{ + return detail::sse_dot_ps(x.Data, y.Data); +} + +GLM_FUNC_QUALIFIER detail::fvec4SIMD cross +( + detail::fvec4SIMD const & x, + detail::fvec4SIMD const & y +) +{ + return detail::sse_xpd_ps(x.Data, y.Data); +} + +GLM_FUNC_QUALIFIER detail::fvec4SIMD normalize +( + detail::fvec4SIMD const & x +) +{ + __m128 dot0 = detail::sse_dot_ps(x.Data, x.Data); + __m128 isr0 = inversesqrt(detail::fvec4SIMD(dot0)).Data; + __m128 mul0 = _mm_mul_ps(x.Data, isr0); + return mul0; +} + +GLM_FUNC_QUALIFIER detail::fvec4SIMD fastNormalize +( + detail::fvec4SIMD const & x +) +{ + __m128 dot0 = detail::sse_dot_ps(x.Data, x.Data); + __m128 isr0 = fastInversesqrt(dot0).Data; + __m128 mul0 = _mm_mul_ps(x.Data, isr0); + return mul0; +} + +GLM_FUNC_QUALIFIER detail::fvec4SIMD faceforward +( + detail::fvec4SIMD const & N, + detail::fvec4SIMD const & I, + detail::fvec4SIMD const & Nref +) +{ + return detail::sse_ffd_ps(N.Data, I.Data, Nref.Data); +} + +GLM_FUNC_QUALIFIER detail::fvec4SIMD reflect +( + detail::fvec4SIMD const & I, + detail::fvec4SIMD const & N +) +{ + return detail::sse_rfe_ps(I.Data, N.Data); +} + +GLM_FUNC_QUALIFIER detail::fvec4SIMD refract +( + detail::fvec4SIMD const & I, + detail::fvec4SIMD const & N, + float const & eta +) +{ + return detail::sse_rfa_ps(I.Data, N.Data, _mm_set1_ps(eta)); +} + +GLM_FUNC_QUALIFIER detail::fvec4SIMD sqrt(detail::fvec4SIMD const & x) +{ + return _mm_mul_ps(inversesqrt(x).Data, x.Data); +} + +GLM_FUNC_QUALIFIER detail::fvec4SIMD niceSqrt(detail::fvec4SIMD const & x) +{ + return _mm_sqrt_ps(x.Data); +} + +GLM_FUNC_QUALIFIER detail::fvec4SIMD fastSqrt(detail::fvec4SIMD const & x) +{ + return _mm_mul_ps(fastInversesqrt(x.Data).Data, x.Data); +} + +// SSE scalar reciprocal sqrt using rsqrt op, plus one Newton-Rhaphson iteration +// By Elan Ruskin, http://assemblyrequired.crashworks.org/ +GLM_FUNC_QUALIFIER detail::fvec4SIMD inversesqrt(detail::fvec4SIMD const & x) +{ + GLM_ALIGN(4) static const __m128 three = {3, 3, 3, 3}; // aligned consts for fast load + GLM_ALIGN(4) static const __m128 half = {0.5,0.5,0.5,0.5}; + + __m128 recip = _mm_rsqrt_ps(x.Data); // "estimate" opcode + __m128 halfrecip = _mm_mul_ps(half, recip); + __m128 threeminus_xrr = _mm_sub_ps(three, _mm_mul_ps(x.Data, _mm_mul_ps(recip, recip))); + return _mm_mul_ps(halfrecip, threeminus_xrr); +} + +GLM_FUNC_QUALIFIER detail::fvec4SIMD fastInversesqrt(detail::fvec4SIMD const & x) +{ + return _mm_rsqrt_ps(x.Data); +} + +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/spline.hpp b/include/gal/opengl/glm/gtx/spline.hpp new file mode 100644 index 0000000..e9035ce --- /dev/null +++ b/include/gal/opengl/glm/gtx/spline.hpp @@ -0,0 +1,90 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_spline +/// @file glm/gtx/spline.hpp +/// @date 2007-01-25 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// +/// @defgroup gtx_spline GLM_GTX_spline +/// @ingroup gtx +/// +/// @brief Spline functions +/// +/// <glm/gtx/spline.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_spline +#define GLM_GTX_spline GLM_VERSION + +// Dependency: +#include "../glm.hpp" +#include "../gtx/optimum_pow.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_spline extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_spline + /// @{ + + //! Return a point from a catmull rom curve. + //! From GLM_GTX_spline extension. + template <typename genType> + genType catmullRom( + genType const & v1, + genType const & v2, + genType const & v3, + genType const & v4, + typename genType::value_type const & s); + + //! Return a point from a hermite curve. + //! From GLM_GTX_spline extension. + template <typename genType> + genType hermite( + genType const & v1, + genType const & t1, + genType const & v2, + genType const & t2, + typename genType::value_type const & s); + + //! Return a point from a cubic curve. + //! From GLM_GTX_spline extension. + template <typename genType> + genType cubic( + genType const & v1, + genType const & v2, + genType const & v3, + genType const & v4, + typename genType::value_type const & s); + + /// @} +}//namespace glm + +#include "spline.inl" + +#endif//GLM_GTX_spline + diff --git a/include/gal/opengl/glm/gtx/spline.inl b/include/gal/opengl/glm/gtx/spline.inl new file mode 100644 index 0000000..6a6509e --- /dev/null +++ b/include/gal/opengl/glm/gtx/spline.inl @@ -0,0 +1,70 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2007-01-25 +// Updated : 2009-02-19 +// Licence : This source is under MIT License +// File : glm/gtx/spline.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm{ + +template <typename genType> +GLM_FUNC_QUALIFIER genType catmullRom +( + genType const & v1, + genType const & v2, + genType const & v3, + genType const & v4, + typename genType::value_type const & s +) +{ + typename genType::value_type s1 = s; + typename genType::value_type s2 = pow2(s); + typename genType::value_type s3 = pow3(s); + + typename genType::value_type f1 = -s3 + typename genType::value_type(2) * s2 - s; + typename genType::value_type f2 = typename genType::value_type(3) * s3 - typename genType::value_type(5) * s2 + typename genType::value_type(2); + typename genType::value_type f3 = typename genType::value_type(-3) * s3 + typename genType::value_type(4) * s2 + s; + typename genType::value_type f4 = s3 - s2; + + return (f1 * v1 + f2 * v2 + f3 * v3 + f4 * v4) / typename genType::value_type(2); + +} + +template <typename genType> +GLM_FUNC_QUALIFIER genType hermite +( + genType const & v1, + genType const & t1, + genType const & v2, + genType const & t2, + typename genType::value_type const & s +) +{ + typename genType::value_type s1 = s; + typename genType::value_type s2 = pow2(s); + typename genType::value_type s3 = pow3(s); + + typename genType::value_type f1 = typename genType::value_type(2) * s3 - typename genType::value_type(3) * s2 + typename genType::value_type(1); + typename genType::value_type f2 = typename genType::value_type(-2) * s3 + typename genType::value_type(3) * s2; + typename genType::value_type f3 = s3 - typename genType::value_type(2) * s2 + s; + typename genType::value_type f4 = s3 - s2; + + return f1 * v1 + f2 * v2 + f3 * t1 + f4 * t2; +} + +template <typename genType> +GLM_FUNC_QUALIFIER genType cubic +( + genType const & v1, + genType const & v2, + genType const & v3, + genType const & v4, + typename genType::value_type const & s +) +{ + return ((v1 * s + v2) * s + v3) * s + v4; +} + +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/std_based_type.hpp b/include/gal/opengl/glm/gtx/std_based_type.hpp new file mode 100644 index 0000000..c5c04dc --- /dev/null +++ b/include/gal/opengl/glm/gtx/std_based_type.hpp @@ -0,0 +1,83 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_std_based_type +/// @file glm/gtx/std_based_type.hpp +/// @date 2008-06-08 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// @see gtx_extented_min_max (dependence) +/// +/// @defgroup gtx_std_based_type GLM_GTX_std_based_type +/// @ingroup gtx +/// +/// @brief Adds vector types based on STL value types. +/// <glm/gtx/std_based_type.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_std_based_type +#define GLM_GTX_std_based_type GLM_VERSION + +// Dependency: +#include "../glm.hpp" +#include <cstdlib> + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_std_based_type extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_std_based_type + /// @{ + + /// Vector type based of two std::size_t components. + /// @see GLM_GTX_std_based_type + typedef detail::tvec2<std::size_t> size2; + + /// Vector type based of three std::size_t components. + /// @see GLM_GTX_std_based_type + typedef detail::tvec3<std::size_t> size3; + + /// Vector type based of four std::size_t components. + /// @see GLM_GTX_std_based_type + typedef detail::tvec4<std::size_t> size4; + + /// Vector type based of two std::size_t components. + /// @see GLM_GTX_std_based_type + typedef detail::tvec2<std::size_t> size2_t; + + /// Vector type based of three std::size_t components. + /// @see GLM_GTX_std_based_type + typedef detail::tvec3<std::size_t> size3_t; + + /// Vector type based of four std::size_t components. + /// @see GLM_GTX_std_based_type + typedef detail::tvec4<std::size_t> size4_t; + + /// @} +}//namespace glm + +#include "std_based_type.inl" + +#endif//GLM_GTX_std_based_type diff --git a/include/gal/opengl/glm/gtx/std_based_type.inl b/include/gal/opengl/glm/gtx/std_based_type.inl new file mode 100644 index 0000000..e349c4a --- /dev/null +++ b/include/gal/opengl/glm/gtx/std_based_type.inl @@ -0,0 +1,13 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2008-06-08 +// Updated : 2008-06-08 +// Licence : This source is under MIT License +// File : glm/gtx/std_based_type.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + +} diff --git a/include/gal/opengl/glm/gtx/string_cast.hpp b/include/gal/opengl/glm/gtx/string_cast.hpp new file mode 100644 index 0000000..b306093 --- /dev/null +++ b/include/gal/opengl/glm/gtx/string_cast.hpp @@ -0,0 +1,70 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_string_cast +/// @file glm/gtx/string_cast.hpp +/// @date 2008-04-26 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// @see gtc_half_float (dependence) +/// @see gtx_integer (dependence) +/// @see gtx_quaternion (dependence) +/// +/// @defgroup gtx_string_cast GLM_GTX_string_cast +/// @ingroup gtx +/// +/// @brief Setup strings for GLM type values +/// +/// <glm/gtx/string_cast.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_string_cast +#define GLM_GTX_string_cast GLM_VERSION + +// Dependency: +#include "../glm.hpp" +#include "../gtc/half_float.hpp" +#include "../gtx/integer.hpp" +#include "../gtx/quaternion.hpp" +#include <string> + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_string_cast extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_string_cast + /// @{ + + /// Create a string from a GLM type value. + /// From GLM_GTX_string_cast extension. + template <typename genType> + std::string to_string(genType const & x); + + /// @} +}//namespace glm + +#include "string_cast.inl" + +#endif//GLM_GTX_string_cast diff --git a/include/gal/opengl/glm/gtx/string_cast.inl b/include/gal/opengl/glm/gtx/string_cast.inl new file mode 100644 index 0000000..d0e8f43 --- /dev/null +++ b/include/gal/opengl/glm/gtx/string_cast.inl @@ -0,0 +1,588 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2006 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2008-04-27 +// Updated : 2008-05-24 +// Licence : This source is under MIT License +// File : glm/gtx/string_cast.hpp +/////////////////////////////////////////////////////////////////////////////////////////////////// + +#include <cstdarg> +#include <cstdio> + +namespace glm{ +namespace detail +{ + GLM_FUNC_QUALIFIER std::string format(const char* msg, ...) + { + std::size_t const STRING_BUFFER(4096); + char text[STRING_BUFFER]; + va_list list; + + if(msg == 0) + return std::string(); + + va_start(list, msg); + +#if((GLM_COMPILER & GLM_COMPILER_VC) && (GLM_COMPILER >= GLM_COMPILER_VC2005)) + vsprintf_s(text, STRING_BUFFER, msg, list); +#else// + vsprintf(text, msg, list); +#endif// + va_end(list); + + return std::string(text); + } + + static const char* True = "true"; + static const char* False = "false"; +}//namespace detail + + //////////////////////////////// + // Scalars + + GLM_FUNC_QUALIFIER std::string to_string(detail::half const & x) + { + return detail::format("half(%2.4f)", float(x)); + } + + GLM_FUNC_QUALIFIER std::string to_string(float x) + { + return detail::format("float(%f)", x); + } + + GLM_FUNC_QUALIFIER std::string to_string(double x) + { + return detail::format("double(%f)", x); + } + + GLM_FUNC_QUALIFIER std::string to_string(int x) + { + return detail::format("int(%d)", x); + } + + GLM_FUNC_QUALIFIER std::string to_string(unsigned int x) + { + return detail::format("uint(%d)", x); + } + + //////////////////////////////// + // Bool vectors + + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tvec2<bool> const & v + ) + { + return detail::format("bvec2(%s, %s)", + v.x ? detail::True : detail::False, + v.y ? detail::True : detail::False); + } + + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tvec3<bool> const & v + ) + { + return detail::format("bvec3(%s, %s, %s)", + v.x ? detail::True : detail::False, + v.y ? detail::True : detail::False, + v.z ? detail::True : detail::False); + } + + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tvec4<bool> const & v + ) + { + return detail::format("bvec4(%s, %s, %s, %s)", + v.x ? detail::True : detail::False, + v.y ? detail::True : detail::False, + v.z ? detail::True : detail::False, + v.w ? detail::True : detail::False); + } + + //////////////////////////////// + // Half vectors + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tvec2<detail::half> const & v + ) + { + return detail::format("hvec2(%2.4f, %2.4f)", v.x.toFloat(), v.y.toFloat()); + } + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tvec3<detail::half> const & v + ) + { + return detail::format("hvec3(%2.4f, %2.4f, %2.4f)", v.x.toFloat(), v.y.toFloat(), v.z.toFloat()); + } + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tvec4<detail::half> const & v + ) + { + return detail::format("hvec4(%2.4f, %2.4f, %2.4f, %2.4f)", v.x.toFloat(), v.y.toFloat(), v.z.toFloat(), v.w.toFloat()); + } + + //////////////////////////////// + // Float vectors + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tvec2<float> const & v + ) + { + return detail::format("fvec2(%f, %f)", v.x, v.y); + } + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tvec3<float> const & v + ) + { + return detail::format("fvec3(%f, %f, %f)", v.x, v.y, v.z); + } + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tvec4<float> const & v + ) + { + return detail::format("fvec4(%f, %f, %f, %f)", v.x, v.y, v.z, v.w); + } + + //////////////////////////////// + // Double vectors + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tvec2<double> const & v + ) + { + return detail::format("dvec2(%f, %f)", v.x, v.y); + } + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tvec3<double> const & v + ) + { + return detail::format("dvec3(%f, %f, %f)", v.x, v.y, v.z); + } + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tvec4<double> const & v + ) + { + return detail::format("dvec4(%f, %f, %f, %f)", v.x, v.y, v.z, v.w); + } + + //////////////////////////////// + // Int vectors + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tvec2<int> const & v + ) + { + return detail::format("ivec2(%d, %d)", v.x, v.y); + } + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tvec3<int> const & v + ) + { + return detail::format("ivec3(%d, %d, %d)", v.x, v.y, v.z); + } + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tvec4<int> const & v + ) + { + return detail::format("ivec4(%d, %d, %d, %d)", v.x, v.y, v.z, v.w); + } + + //////////////////////////////// + // Unsigned int vectors + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tvec2<unsigned int> const & v + ) + { + return detail::format("uvec2(%d, %d)", v.x, v.y); + } + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tvec3<unsigned int> const & v + ) + { + return detail::format("uvec3(%d, %d, %d)", v.x, v.y, v.z); + } + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tvec4<unsigned int> const & v + ) + { + return detail::format("uvec4(%d, %d, %d, %d)", v.x, v.y, v.z, v.w); + } + + //////////////////////////////// + // Half matrices + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tmat2x2<detail::half> const & m + ) + { + return detail::format("hmat2x2((%f, %f), (%f, %f))", + m[0][0].toFloat(), m[0][1].toFloat(), + m[1][0].toFloat(), m[1][1].toFloat()); + } + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tmat2x3<detail::half> const & x + ) + { + return detail::format("hmat2x3((%f, %f, %f), (%f, %f, %f))", + x[0][0].toFloat(), x[0][1].toFloat(), x[0][2].toFloat(), + x[1][0].toFloat(), x[1][1].toFloat(), x[1][2].toFloat()); + } + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tmat2x4<detail::half> const & x + ) + { + return detail::format("hmat2x4((%f, %f, %f, %f), (%f, %f, %f, %f))", + x[0][0].toFloat(), x[0][1].toFloat(), x[0][2].toFloat(), x[0][3].toFloat(), + x[1][0].toFloat(), x[1][1].toFloat(), x[1][2].toFloat(), x[1][3].toFloat()); + } + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tmat3x2<detail::half> const & x + ) + { + return detail::format("hmat3x2((%f, %f), (%f, %f), (%f, %f))", + x[0][0].toFloat(), x[0][1].toFloat(), + x[1][0].toFloat(), x[1][1].toFloat(), + x[2][0].toFloat(), x[2][1].toFloat()); + } + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tmat3x3<detail::half> const & x + ) + { + return detail::format("hmat3x3((%f, %f, %f), (%f, %f, %f), (%f, %f, %f))", + x[0][0].toFloat(), x[0][1].toFloat(), x[0][2].toFloat(), + x[1][0].toFloat(), x[1][1].toFloat(), x[1][2].toFloat(), + x[2][0].toFloat(), x[2][1].toFloat(), x[2][2].toFloat()); + } + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tmat3x4<detail::half> const & x + ) + { + return detail::format("hmat3x4((%f, %f, %f, %f), (%f, %f, %f, %f), (%f, %f, %f, %f))", + x[0][0].toFloat(), x[0][1].toFloat(), x[0][2].toFloat(), x[0][3].toFloat(), + x[1][0].toFloat(), x[1][1].toFloat(), x[1][2].toFloat(), x[1][3].toFloat(), + x[2][0].toFloat(), x[2][1].toFloat(), x[2][2].toFloat(), x[2][3].toFloat()); + } + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tmat4x2<detail::half> const & x + ) + { + return detail::format("hmat4x2((%f, %f), (%f, %f), (%f, %f), (%f, %f))", + x[0][0].toFloat(), x[0][1].toFloat(), + x[1][0].toFloat(), x[1][1].toFloat(), + x[2][0].toFloat(), x[2][1].toFloat(), + x[3][0].toFloat(), x[3][1].toFloat()); + } + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tmat4x3<detail::half> const & x + ) + { + return detail::format("hmat4x3((%f, %f, %f), (%f, %f, %f), (%f, %f, %f), (%f, %f, %f))", + x[0][0].toFloat(), x[0][1].toFloat(), x[0][2].toFloat(), + x[1][0].toFloat(), x[1][1].toFloat(), x[1][2].toFloat(), + x[2][0].toFloat(), x[2][1].toFloat(), x[2][2].toFloat(), + x[3][0].toFloat(), x[3][1].toFloat(), x[3][2].toFloat()); + } + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tmat4x4<detail::half> const & x + ) + { + return detail::format("hmat4x4((%f, %f, %f, %f), (%f, %f, %f, %f), (%f, %f, %f, %f), (%f, %f, %f, %f))", + x[0][0].toFloat(), x[0][1].toFloat(), x[0][2].toFloat(), x[0][3].toFloat(), + x[1][0].toFloat(), x[1][1].toFloat(), x[1][2].toFloat(), x[1][3].toFloat(), + x[2][0].toFloat(), x[2][1].toFloat(), x[2][2].toFloat(), x[2][3].toFloat(), + x[3][0].toFloat(), x[3][1].toFloat(), x[3][2].toFloat(), x[3][3].toFloat()); + } + + //////////////////////////////// + // Float matrices + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tmat2x2<float> const & x + ) + { + return detail::format("mat2x2((%f, %f), (%f, %f))", + x[0][0], x[0][1], + x[1][0], x[1][1]); + } + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tmat2x3<float> const & x + ) + { + return detail::format("mat2x3((%f, %f, %f), (%f, %f, %f))", + x[0][0], x[0][1], x[0][2], + x[1][0], x[1][1], x[1][2]); + } + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tmat2x4<float> const & x + ) + { + return detail::format("mat2x4((%f, %f, %f, %f), (%f, %f, %f, %f))", + x[0][0], x[0][1], x[0][2], x[0][3], + x[1][0], x[1][1], x[1][2], x[1][3]); + } + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tmat3x2<float> const & x + ) + { + return detail::format("mat3x2((%f, %f), (%f, %f), (%f, %f))", + x[0][0], x[0][1], + x[1][0], x[1][1], + x[2][0], x[2][1]); + } + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tmat3x3<float> const & x + ) + { + return detail::format("mat3x3((%f, %f, %f), (%f, %f, %f), (%f, %f, %f))", + x[0][0], x[0][1], x[0][2], + x[1][0], x[1][1], x[1][2], + x[2][0], x[2][1], x[2][2]); + } + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tmat3x4<float> const & x + ) + { + return detail::format("mat3x4((%f, %f, %f, %f), (%f, %f, %f, %f), (%f, %f, %f, %f))", + x[0][0], x[0][1], x[0][2], x[0][3], + x[1][0], x[1][1], x[1][2], x[1][3], + x[2][0], x[2][1], x[2][2], x[2][3]); + } + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tmat4x2<float> const & x + ) + { + return detail::format("mat4x2((%f, %f), (%f, %f), (%f, %f), (%f, %f))", + x[0][0], x[0][1], + x[1][0], x[1][1], + x[2][0], x[2][1], + x[3][0], x[3][1]); + } + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tmat4x3<float> const & x + ) + { + return detail::format("mat4x3((%f, %f, %f), (%f, %f, %f), (%f, %f, %f), (%f, %f, %f))", + x[0][0], x[0][1], x[0][2], + x[1][0], x[1][1], x[1][2], + x[2][0], x[2][1], x[2][2], + x[3][0], x[3][1], x[3][2]); + } + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tmat4x4<float> const & x + ) + { + return detail::format("mat4x4((%f, %f, %f, %f), (%f, %f, %f, %f), (%f, %f, %f, %f), (%f, %f, %f, %f))", + x[0][0], x[0][1], x[0][2], x[0][3], + x[1][0], x[1][1], x[1][2], x[1][3], + x[2][0], x[2][1], x[2][2], x[2][3], + x[3][0], x[3][1], x[3][2], x[3][3]); + } + + //////////////////////////////// + // Double matrices + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tmat2x2<double> const & x + ) + { + return detail::format("dmat2x2((%f, %f), (%f, %f))", + x[0][0], x[0][1], + x[1][0], x[1][1]); + } + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tmat2x3<double> const & x + ) + { + return detail::format("dmat2x3((%f, %f, %f), (%f, %f, %f))", + x[0][0], x[0][1], x[0][2], + x[1][0], x[1][1], x[1][2]); + } + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tmat2x4<double> const & x + ) + { + return detail::format("dmat2x4((%f, %f, %f, %f), (%f, %f, %f, %f))", + x[0][0], x[0][1], x[0][2], x[0][3], + x[1][0], x[1][1], x[1][2], x[1][3]); + } + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tmat3x2<double> const & x + ) + { + return detail::format("dmat3x2((%f, %f), (%f, %f), (%f, %f))", + x[0][0], x[0][1], + x[1][0], x[1][1], + x[2][0], x[2][1]); + } + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tmat3x3<double> const & x + ) + { + return detail::format("dmat3x3((%f, %f, %f), (%f, %f, %f), (%f, %f, %f))", + x[0][0], x[0][1], x[0][2], + x[1][0], x[1][1], x[1][2], + x[2][0], x[2][1], x[2][2]); + } + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tmat3x4<double> const & x + ) + { + return detail::format("dmat3x4((%f, %f, %f, %f), (%f, %f, %f, %f), (%f, %f, %f, %f))", + x[0][0], x[0][1], x[0][2], x[0][3], + x[1][0], x[1][1], x[1][2], x[1][3], + x[2][0], x[2][1], x[2][2], x[2][3]); + } + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tmat4x2<double> const & x + ) + { + return detail::format("dmat4x2((%f, %f), (%f, %f), (%f, %f), (%f, %f))", + x[0][0], x[0][1], + x[1][0], x[1][1], + x[2][0], x[2][1], + x[3][0], x[3][1]); + } + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tmat4x3<double> const & x + ) + { + return detail::format("dmat4x3((%f, %f, %f), (%f, %f, %f), (%f, %f, %f), (%f, %f, %f))", + x[0][0], x[0][1], x[0][2], + x[1][0], x[1][1], x[1][2], + x[2][0], x[2][1], x[2][2], + x[3][0], x[3][1], x[3][2]); + } + + template <> + GLM_FUNC_QUALIFIER std::string to_string + ( + detail::tmat4x4<double> const & x + ) + { + return detail::format("dmat4x4((%f, %f, %f, %f), (%f, %f, %f, %f), (%f, %f, %f, %f), (%f, %f, %f, %f))", + x[0][0], x[0][1], x[0][2], x[0][3], + x[1][0], x[1][1], x[1][2], x[1][3], + x[2][0], x[2][1], x[2][2], x[2][3], + x[3][0], x[3][1], x[3][2], x[3][3]); + } + +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/transform.hpp b/include/gal/opengl/glm/gtx/transform.hpp new file mode 100644 index 0000000..8929e46 --- /dev/null +++ b/include/gal/opengl/glm/gtx/transform.hpp @@ -0,0 +1,131 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_transform +/// @file glm/gtx/transform.hpp +/// @date 2005-12-21 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// @see gtc_matrix_transform (dependence) +/// @see gtx_transform +/// @see gtx_transform2 +/// +/// @defgroup gtx_transform GLM_GTX_transform +/// @ingroup gtx +/// +/// @brief Add transformation matrices +/// +/// <glm/gtx/transform.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_transform +#define GLM_GTX_transform GLM_VERSION + +// Dependency: +#include "../glm.hpp" +#include "../gtc/matrix_transform.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_transform extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_transform + /// @{ + + //! Builds a translation 4 * 4 matrix created from 3 scalars. + //! - From \link gtx_transform GLM_GTX_transform \endlink extension + // - See also: \link glm::translate GLM_GTC_matrix_transform \endlink + template <typename T> + detail::tmat4x4<T> translate( + T x, T y, T z); + + //! Transforms a matrix with a translation 4 * 4 matrix created from 3 scalars. + //! - From \link gtx_transform GLM_GTX_transform \endlink extension + // - See also: \link glm::translate GLM_GTC_matrix_transform \endlink + template <typename T> + detail::tmat4x4<T> translate( + detail::tmat4x4<T> const & m, + T x, T y, T z); + + //! Transforms a matrix with a translation 4 * 4 matrix created from 3 scalars. + //! - From \link gtx_transform GLM_GTX_transform \endlink extension + // - See also: \link glm::translate GLM_GTC_matrix_transform \endlink + template <typename T> + detail::tmat4x4<T> translate( + detail::tvec3<T> const & v); + + //! Builds a rotation 4 * 4 matrix created from an axis of 3 scalars and an angle expressed in degrees. + //! - From \link gtx_transform GLM_GTX_transform \endlink extension + // - See also: \link glm::rotate GLM_GTC_matrix_transform \endlink + template <typename T> + detail::tmat4x4<T> rotate( + T angle, + T x, T y, T z); + + //! Builds a rotation 4 * 4 matrix created from an axis of 3 scalars and an angle expressed in degrees. + //! - From \link gtx_transform GLM_GTX_transform \endlink extension + // - See also: \link glm::rotate GLM_GTC_matrix_transform \endlink + template <typename T> + detail::tmat4x4<T> rotate( + T angle, + detail::tvec3<T> const & v); + + //! Transforms a matrix with a rotation 4 * 4 matrix created from an axis of 3 scalars and an angle expressed in degrees. + //! - From \link gtx_transform GLM_GTX_transform \endlink extension + // - See also: \link glm::rotate GLM_GTC_matrix_transform \endlink + template <typename T> + detail::tmat4x4<T> rotate( + detail::tmat4x4<T> const & m, + T angle, + T x, T y, T z); + + //! Builds a scale 4 * 4 matrix created from 3 scalars. + //! - From \link gtx_transform GLM_GTX_transform \endlink extension + // - See also: \link glm::scale GLM_GTC_matrix_transform \endlink + template <typename T> + detail::tmat4x4<T> scale( + T x, T y, T z); + + //! Transforms a matrix with a scale 4 * 4 matrix created from 3 scalars. + //! - From \link gtx_transform GLM_GTX_transform \endlink extension + // - See also: \link glm::scale GLM_GTC_matrix_transform \endlink + template <typename T> + detail::tmat4x4<T> scale( + detail::tmat4x4<T> const & m, + T x, T y, T z); + + //! Transforms a matrix with a scale 4 * 4 matrix created from a vector of 3 components. + //! - From \link gtx_transform GLM_GTX_transform \endlink extension + // - See also: \link glm::scale GLM_GTC_matrix_transform \endlink + template <typename T> + detail::tmat4x4<T> scale( + detail::tvec3<T> const & v); + + /// @} +}// namespace glm + +#include "transform.inl" + +#endif//GLM_GTX_transform diff --git a/include/gal/opengl/glm/gtx/transform.inl b/include/gal/opengl/glm/gtx/transform.inl new file mode 100644 index 0000000..8f8c921 --- /dev/null +++ b/include/gal/opengl/glm/gtx/transform.inl @@ -0,0 +1,90 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2005-12-21 +// Updated : 2009-04-29 +// Licence : This source is under MIT License +// File : glm/gtx/transform.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> translate( + T x, T y, T z) + { + return translate( + detail::tmat4x4<T>(1.0f), + detail::tvec3<T>(x, y , z)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> translate( + detail::tmat4x4<T> const & m, + T x, T y, T z) + { + return translate( + m, detail::tvec3<T>(x, y , z)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> translate( + detail::tvec3<T> const & v) + { + return translate( + detail::tmat4x4<T>(1.0f), v); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> rotate( + T angle, + T x, T y, T z) + { + return rotate( + detail::tmat4x4<T>(1), angle, detail::tvec3<T>(x, y, z)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> rotate( + T angle, + detail::tvec3<T> const & v) + { + return rotate( + detail::tmat4x4<T>(1), angle, v); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> rotate( + detail::tmat4x4<T> const & m, + T angle, + T x, T y, T z) + { + return rotate( + m, angle, detail::tvec3<T>(x, y, z)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> scale(T x, T y, T z) + { + return scale( + detail::tmat4x4<T>(1), detail::tvec3<T>(x, y, z)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> scale( + detail::tmat4x4<T> const & m, + T x, T y, T z) + { + return scale( + m, detail::tvec3<T>(x, y, z)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> scale( + detail::tvec3<T> const & v) + { + return scale( + detail::tmat4x4<T>(1.0f), v); + } + +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/transform2.hpp b/include/gal/opengl/glm/gtx/transform2.hpp new file mode 100644 index 0000000..4c6bd15 --- /dev/null +++ b/include/gal/opengl/glm/gtx/transform2.hpp @@ -0,0 +1,135 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_transform2 +/// @file glm/gtx/transform2.hpp +/// @date 2005-12-21 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// @see gtx_transform (dependence) +/// +/// @defgroup gtx_transform2 GLM_GTX_transform2 +/// @ingroup gtx +/// +/// @brief Add extra transformation matrices +/// +/// <glm/gtx/transform2.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_transform2 +#define GLM_GTX_transform2 GLM_VERSION + +// Dependency: +#include "../glm.hpp" +#include "../gtx/transform.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_transform2 extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_transform2 + /// @{ + + //! Transforms a matrix with a shearing on X axis. + //! From GLM_GTX_transform2 extension. + template <typename T> + detail::tmat3x3<T> shearX2D( + detail::tmat3x3<T> const & m, + T y); + + //! Transforms a matrix with a shearing on Y axis. + //! From GLM_GTX_transform2 extension. + template <typename T> + detail::tmat3x3<T> shearY2D( + detail::tmat3x3<T> const & m, + T x); + + //! Transforms a matrix with a shearing on X axis + //! From GLM_GTX_transform2 extension. + template <typename T> + detail::tmat4x4<T> shearX3D( + const detail::tmat4x4<T> & m, + T y, + T z); + + //! Transforms a matrix with a shearing on Y axis. + //! From GLM_GTX_transform2 extension. + template <typename T> + detail::tmat4x4<T> shearY3D( + const detail::tmat4x4<T> & m, + T x, + T z); + + //! Transforms a matrix with a shearing on Z axis. + //! From GLM_GTX_transform2 extension. + template <typename T> + detail::tmat4x4<T> shearZ3D( + const detail::tmat4x4<T> & m, + T x, + T y); + + //template <typename T> GLM_FUNC_QUALIFIER detail::tmat4x4<T> shear(const detail::tmat4x4<T> & m, shearPlane, planePoint, angle) + // Identity + tan(angle) * cross(Normal, OnPlaneVector) 0 + // - dot(PointOnPlane, normal) * OnPlaneVector 1 + + // Reflect functions seem to don't work + //template <typename T> detail::tmat3x3<T> reflect2D(const detail::tmat3x3<T> & m, const detail::tvec3<T>& normal){return reflect2DGTX(m, normal);} //!< \brief Build a reflection matrix (from GLM_GTX_transform2 extension) + //template <typename T> detail::tmat4x4<T> reflect3D(const detail::tmat4x4<T> & m, const detail::tvec3<T>& normal){return reflect3DGTX(m, normal);} //!< \brief Build a reflection matrix (from GLM_GTX_transform2 extension) + + //! Build planar projection matrix along normal axis. + //! From GLM_GTX_transform2 extension. + template <typename T> + detail::tmat3x3<T> proj2D( + const detail::tmat3x3<T> & m, + const detail::tvec3<T>& normal); + + //! Build planar projection matrix along normal axis. + //! From GLM_GTX_transform2 extension. + template <typename T> + detail::tmat4x4<T> proj3D( + const detail::tmat4x4<T> & m, + const detail::tvec3<T>& normal); + + //! Build a scale bias matrix. + //! From GLM_GTX_transform2 extension. + template <typename valType> + detail::tmat4x4<valType> scaleBias( + valType scale, + valType bias); + + //! Build a scale bias matrix. + //! From GLM_GTX_transform2 extension. + template <typename valType> + detail::tmat4x4<valType> scaleBias( + detail::tmat4x4<valType> const & m, + valType scale, + valType bias); + + /// @} +}// namespace glm + +#include "transform2.inl" + +#endif//GLM_GTX_transform2 diff --git a/include/gal/opengl/glm/gtx/transform2.inl b/include/gal/opengl/glm/gtx/transform2.inl new file mode 100644 index 0000000..06b65f5 --- /dev/null +++ b/include/gal/opengl/glm/gtx/transform2.inl @@ -0,0 +1,154 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2005-02-28 +// Updated : 2005-04-23 +// Licence : This source is under MIT License +// File : glm/gtx/transform2.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat3x3<T> shearX2D( + const detail::tmat3x3<T>& m, + T s) + { + detail::tmat3x3<T> r(1); + r[0][1] = s; + return m * r; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat3x3<T> shearY2D( + const detail::tmat3x3<T>& m, + T s) + { + detail::tmat3x3<T> r(1); + r[1][0] = s; + return m * r; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> shearX3D( + const detail::tmat4x4<T>& m, + T s, + T t) + { + detail::tmat4x4<T> r(1); + r[1][0] = s; + r[2][0] = t; + return m * r; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> shearY3D( + const detail::tmat4x4<T>& m, + T s, + T t) + { + detail::tmat4x4<T> r(1); + r[0][1] = s; + r[2][1] = t; + return m * r; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> shearZ3D( + const detail::tmat4x4<T>& m, + T s, + T t) + { + detail::tmat4x4<T> r(1); + r[0][2] = s; + r[1][2] = t; + return m * r; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat3x3<T> reflect2D( + const detail::tmat3x3<T>& m, + const detail::tvec3<T>& normal) + { + detail::tmat3x3<T> r(1); + r[0][0] = 1 - 2 * normal.x * normal.x; + r[0][1] = -2 * normal.x * normal.y; + r[1][0] = -2 * normal.x * normal.y; + r[1][1] = 1 - 2 * normal.y * normal.y; + return m * r; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> reflect3D( + const detail::tmat4x4<T>& m, + const detail::tvec3<T>& normal) + { + detail::tmat4x4<T> r(1); + r[0][0] = 1 - 2 * normal.x * normal.x; + r[0][1] = -2 * normal.x * normal.y; + r[0][2] = -2 * normal.x * normal.z; + + r[1][0] = -2 * normal.x * normal.y; + r[1][1] = 1 - 2 * normal.y * normal.y; + r[1][2] = -2 * normal.y * normal.z; + + r[2][0] = -2 * normal.x * normal.z; + r[2][1] = -2 * normal.y * normal.z; + r[2][2] = 1 - 2 * normal.z * normal.z; + return m * r; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat3x3<T> proj2D( + const detail::tmat3x3<T>& m, + const detail::tvec3<T>& normal) + { + detail::tmat3x3<T> r(1); + r[0][0] = 1 - normal.x * normal.x; + r[0][1] = - normal.x * normal.y; + r[1][0] = - normal.x * normal.y; + r[1][1] = 1 - normal.y * normal.y; + return m * r; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> proj3D( + const detail::tmat4x4<T>& m, + const detail::tvec3<T>& normal) + { + detail::tmat4x4<T> r(1); + r[0][0] = 1 - normal.x * normal.x; + r[0][1] = - normal.x * normal.y; + r[0][2] = - normal.x * normal.z; + r[1][0] = - normal.x * normal.y; + r[1][1] = 1 - normal.y * normal.y; + r[1][2] = - normal.y * normal.z; + r[2][0] = - normal.x * normal.z; + r[2][1] = - normal.y * normal.z; + r[2][2] = 1 - normal.z * normal.z; + return m * r; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> scaleBias( + T scale, + T bias) + { + detail::tmat4x4<T> result; + result[3] = detail::tvec4<T>(detail::tvec3<T>(bias), T(1)); + result[0][0] = scale; + result[1][1] = scale; + result[2][2] = scale; + return result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> scaleBias( + const detail::tmat4x4<T>& m, + T scale, + T bias) + { + return m * scaleBias(scale, bias); + } +}//namespace glm + diff --git a/include/gal/opengl/glm/gtx/ulp.hpp b/include/gal/opengl/glm/gtx/ulp.hpp new file mode 100644 index 0000000..b74f480 --- /dev/null +++ b/include/gal/opengl/glm/gtx/ulp.hpp @@ -0,0 +1,29 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/////////////////////////////////////////////////////////////////////////////////// + +#if(defined(GLM_MESSAGES)) +# pragma message("GLM: GLM_GTX_ulp extension is deprecated, include GLM_GTC_ulp (glm/gtc/ulp.hpp) instead") +#endif + +// Promoted: +#include "../gtc/ulp.hpp" diff --git a/include/gal/opengl/glm/gtx/unsigned_int.hpp b/include/gal/opengl/glm/gtx/unsigned_int.hpp new file mode 100644 index 0000000..340cfd4 --- /dev/null +++ b/include/gal/opengl/glm/gtx/unsigned_int.hpp @@ -0,0 +1,26 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/////////////////////////////////////////////////////////////////////////////////// + +#if(defined(GLM_MESSAGES)) +# pragma message("GLM: GLM_GTX_unsigned_int extension is deprecated, include GLM_GTX_integer instead") +#endif diff --git a/include/gal/opengl/glm/gtx/unsigned_int.inl b/include/gal/opengl/glm/gtx/unsigned_int.inl new file mode 100644 index 0000000..b08a387 --- /dev/null +++ b/include/gal/opengl/glm/gtx/unsigned_int.inl @@ -0,0 +1,13 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2005-12-24 +// Updated : 2008-10-07 +// Licence : This source is under MIT License +// File : glm/gtx/unsigned_int.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/vec1.hpp b/include/gal/opengl/glm/gtx/vec1.hpp new file mode 100644 index 0000000..7d37e6d --- /dev/null +++ b/include/gal/opengl/glm/gtx/vec1.hpp @@ -0,0 +1,137 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_vec1 +/// @file glm/gtx/vec1.hpp +/// @date 2010-02-08 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// +/// @defgroup gtx_vec1 GLM_GTX_vec1 +/// @ingroup gtx +/// +/// @brief Add vec1, ivec1, uvec1 and bvec1 types. +/// <glm/gtx/vec1.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_vec1 +#define GLM_GTX_vec1 GLM_VERSION + +// Dependency: +#include "../glm.hpp" +#include "../core/type_vec1.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_vec1 extension included") +#endif + +namespace glm +{ + //! 1 component vector of high precision floating-point numbers. + //! There is no guarantee on the actual precision. + //! From GLM_GTX_vec1 extension. + typedef detail::highp_vec1_t highp_vec1; + //! 1 component vector of medium precision floating-point numbers. + //! There is no guarantee on the actual precision. + //! From GLM_GTX_vec1 extension. + typedef detail::mediump_vec1_t mediump_vec1; + //! 1 component vector of low precision floating-point numbers. + //! There is no guarantee on the actual precision. + //! From GLM_GTX_vec1 extension. + typedef detail::lowp_vec1_t lowp_vec1; + + //! 1 component vector of high precision signed integer numbers. + //! There is no guarantee on the actual precision. + //! From GLM_GTX_vec1 extension. + typedef detail::highp_ivec1_t highp_ivec1; + //! 1 component vector of medium precision signed integer numbers. + //! There is no guarantee on the actual precision. + //! From GLM_GTX_vec1 extension. + typedef detail::mediump_ivec1_t mediump_ivec1; + //! 1 component vector of low precision signed integer numbers. + //! There is no guarantee on the actual precision. + //! From GLM_GTX_vec1 extension. + typedef detail::lowp_ivec1_t lowp_ivec1; + + //! 1 component vector of high precision unsigned integer numbers. + //! There is no guarantee on the actual precision. + //! From GLM_GTX_vec1 extension. + typedef detail::highp_uvec1_t highp_uvec1; + //! 1 component vector of medium precision unsigned integer numbers. + //! There is no guarantee on the actual precision. + //! From GLM_GTX_vec1 extension. + typedef detail::mediump_uvec1_t mediump_uvec1; + //! 1 component vector of low precision unsigned integer numbers. + //! There is no guarantee on the actual precision. + //! From GLM_GTX_vec1 extension. + typedef detail::lowp_uvec1_t lowp_uvec1; + + ////////////////////////// + // vec1 definition + + //! 1 component vector of boolean. + //! From GLM_GTX_vec1 extension. + typedef detail::tvec1<bool> bvec1; + +#if(defined(GLM_PRECISION_HIGHP_FLOAT)) + typedef highp_vec1 vec1; +#elif(defined(GLM_PRECISION_MEDIUMP_FLOAT)) + typedef mediump_vec1 vec1; +#elif(defined(GLM_PRECISION_LOWP_FLOAT)) + typedef lowp_vec1 vec1; +#else + //! 1 component vector of floating-point numbers. + //! From GLM_GTX_vec1 extension. + typedef mediump_vec1 vec1; +#endif//GLM_PRECISION + +#if(defined(GLM_PRECISION_HIGHP_INT)) + typedef highp_ivec1 ivec1; +#elif(defined(GLM_PRECISION_MEDIUMP_INT)) + typedef mediump_ivec1 ivec1; +#elif(defined(GLM_PRECISION_LOWP_INT)) + typedef lowp_ivec1 ivec1; +#else + //! 1 component vector of signed integer numbers. + //! From GLM_GTX_vec1 extension. + typedef mediump_ivec1 ivec1; +#endif//GLM_PRECISION + +#if(defined(GLM_PRECISION_HIGHP_UINT)) + typedef highp_uvec1 uvec1; +#elif(defined(GLM_PRECISION_MEDIUMP_UINT)) + typedef mediump_uvec1 uvec1; +#elif(defined(GLM_PRECISION_LOWP_UINT)) + typedef lowp_uvec1 uvec1; +#else + //! 1 component vector of unsigned integer numbers. + //! From GLM_GTX_vec1 extension. + typedef mediump_uvec1 uvec1; +#endif//GLM_PRECISION + +}// namespace glm + +#include "vec1.inl" + +#endif//GLM_GTX_vec1 + diff --git a/include/gal/opengl/glm/gtx/vec1.inl b/include/gal/opengl/glm/gtx/vec1.inl new file mode 100644 index 0000000..782a8ec --- /dev/null +++ b/include/gal/opengl/glm/gtx/vec1.inl @@ -0,0 +1,27 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_vec1 +/// @file glm/gtx/vec1.inl +/// @date 2013-03-16 / 2013-03-16 +/// @author Christophe Riccio +/////////////////////////////////////////////////////////////////////////////////// diff --git a/include/gal/opengl/glm/gtx/vector_access.hpp b/include/gal/opengl/glm/gtx/vector_access.hpp new file mode 100644 index 0000000..8942661 --- /dev/null +++ b/include/gal/opengl/glm/gtx/vector_access.hpp @@ -0,0 +1,85 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_vector_access +/// @file glm/gtx/vector_access.hpp +/// @date 2006-01-16 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// +/// @defgroup gtx_vector_access GLM_GTX_vector_access +/// @ingroup gtx +/// +/// @brief Function to set values to vectors +/// +/// <glm/gtx/vector_access.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_vector_access +#define GLM_GTX_vector_access GLM_VERSION + +// Dependency: +#include "../glm.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_vector_access extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_vector_access + /// @{ + + //! Set values to a 2 components vector. + //! From GLM_GTX_vector_access extension. + template <typename valType> + void set( + detail::tvec2<valType> & v, + valType const & x, + valType const & y); + + //! Set values to a 3 components vector. + //! From GLM_GTX_vector_access extension. + template <typename valType> + void set( + detail::tvec3<valType> & v, + valType const & x, + valType const & y, + valType const & z); + + //! Set values to a 4 components vector. + //! From GLM_GTX_vector_access extension. + template <typename valType> + void set( + detail::tvec4<valType> & v, + valType const & x, + valType const & y, + valType const & z, + valType const & w); + + /// @} +}//namespace glm + +#include "vector_access.inl" + +#endif//GLM_GTX_vector_access diff --git a/include/gal/opengl/glm/gtx/vector_access.inl b/include/gal/opengl/glm/gtx/vector_access.inl new file mode 100644 index 0000000..b5a5603 --- /dev/null +++ b/include/gal/opengl/glm/gtx/vector_access.inl @@ -0,0 +1,53 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2006-01-16 +// Updated : 2008-10-07 +// Licence : This source is under MIT License +// File : glm/gtx/vector_access.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template <typename valType> + GLM_FUNC_QUALIFIER void set + ( + detail::tvec2<valType>& v, + valType const & x, + valType const & y + ) + { + v.x = x; + v.y = y; + } + + template <typename valType> + GLM_FUNC_QUALIFIER void set + ( + detail::tvec3<valType>& v, + valType const & x, + valType const & y, + valType const & z + ) + { + v.x = x; + v.y = y; + v.z = z; + } + + template <typename valType> + GLM_FUNC_QUALIFIER void set + ( + detail::tvec4<valType>& v, + valType const & x, + valType const & y, + valType const & z, + valType const & w + ) + { + v.x = x; + v.y = y; + v.z = z; + v.w = w; + } +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/vector_angle.hpp b/include/gal/opengl/glm/gtx/vector_angle.hpp new file mode 100644 index 0000000..fea8f65 --- /dev/null +++ b/include/gal/opengl/glm/gtx/vector_angle.hpp @@ -0,0 +1,88 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_vector_angle +/// @file glm/gtx/vector_angle.hpp +/// @date 2005-12-30 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// @see gtx_quaternion (dependence) +/// @see gtx_epsilon (dependence) +/// +/// @defgroup gtx_vector_angle GLM_GTX_vector_angle +/// @ingroup gtx +/// +/// @brief Compute angle between vectors +/// +/// <glm/gtx/vector_angle.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_vector_angle +#define GLM_GTX_vector_angle GLM_VERSION + +// Dependency: +#include "../glm.hpp" +#include "../gtc/epsilon.hpp" +#include "../gtx/quaternion.hpp" +#include "../gtx/rotate_vector.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_vector_angle extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_vector_angle + /// @{ + + //! Returns the absolute angle between two vectors + //! Parameters need to be normalized. + //! From GLM_GTX_vector_angle extension + template <typename vecType> + GLM_FUNC_QUALIFIER typename vecType::value_type angle( + vecType const & x, + vecType const & y); + + //! Returns the oriented angle between two 2d vectors + //! Parameters need to be normalized. + //! From GLM_GTX_vector_angle extension. + template <typename T> + GLM_FUNC_QUALIFIER T orientedAngle( + detail::tvec2<T> const & x, + detail::tvec2<T> const & y); + + //! Returns the oriented angle between two 3d vectors based from a reference axis. + //! Parameters need to be normalized. + //! From GLM_GTX_vector_angle extension. + template <typename T> + GLM_FUNC_QUALIFIER T orientedAngle( + detail::tvec3<T> const & x, + detail::tvec3<T> const & y, + detail::tvec3<T> const & ref); + + /// @} +}// namespace glm + +#include "vector_angle.inl" + +#endif//GLM_GTX_vector_angle diff --git a/include/gal/opengl/glm/gtx/vector_angle.inl b/include/gal/opengl/glm/gtx/vector_angle.inl new file mode 100644 index 0000000..ad221b1 --- /dev/null +++ b/include/gal/opengl/glm/gtx/vector_angle.inl @@ -0,0 +1,57 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2005-12-30 +// Updated : 2008-09-29 +// Licence : This source is under MIT License +// File : glm/gtx/vector_angle.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template <typename genType> + GLM_FUNC_QUALIFIER typename genType::value_type angle + ( + genType const & x, + genType const & y + ) + { + return degrees(acos(dot(x, y))); + } + + //! \todo epsilon is hard coded to 0.01 + template <typename valType> + GLM_FUNC_QUALIFIER valType orientedAngle + ( + detail::tvec2<valType> const & x, + detail::tvec2<valType> const & y + ) + { +#ifdef GLM_FORCE_RADIANS + valType const Angle(acos(dot(x, y))); +#else + valType const Angle(glm::degrees(acos(dot(x, y)))); +#endif + detail::tvec2<valType> const TransformedVector(glm::rotate(x, Angle)); + if(all(epsilonEqual(y, TransformedVector, valType(0.01)))) + return Angle; + else + return -Angle; + } + + template <typename valType> + GLM_FUNC_QUALIFIER valType orientedAngle + ( + detail::tvec3<valType> const & x, + detail::tvec3<valType> const & y, + detail::tvec3<valType> const & ref + ) + { + valType const Angle(glm::degrees(glm::acos(glm::dot(x, y)))); + + if(glm::dot(ref, glm::cross(x, y)) < valType(0)) + return -Angle; + else + return Angle; + } +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/vector_query.hpp b/include/gal/opengl/glm/gtx/vector_query.hpp new file mode 100644 index 0000000..f49f9e9 --- /dev/null +++ b/include/gal/opengl/glm/gtx/vector_query.hpp @@ -0,0 +1,112 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_vector_query +/// @file glm/gtx/vector_query.hpp +/// @date 2008-03-10 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// +/// @defgroup gtx_vector_query GLM_GTX_vector_query +/// @ingroup gtx +/// +/// @brief Query informations of vector types +/// +/// <glm/gtx/vector_query.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_vector_query +#define GLM_GTX_vector_query GLM_VERSION + +// Dependency: +#include "../glm.hpp" +#include <cfloat> +#include <limits> + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_vector_query extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_vector_query + /// @{ + + //! Check whether two vectors are collinears. + //! From GLM_GTX_vector_query extensions. + template <typename genType> + bool areCollinear( + genType const & v0, + genType const & v1, + typename genType::value_type const & epsilon/* = std::numeric_limits<typename genType::value_type>::epsilon()*/); + + //! Check whether two vectors are orthogonals. + //! From GLM_GTX_vector_query extensions. + template <typename genType> + bool areOrthogonal( + genType const & v0, + genType const & v1, + typename genType::value_type const & epsilon/* = std::numeric_limits<typename genType::value_type>::epsilon()*/); + + //! Check whether a vector is normalized. + //! From GLM_GTX_vector_query extensions. + template <typename genType, template <typename> class vecType> + bool isNormalized( + vecType<genType> const & v, + genType const & epsilon/* = std::numeric_limits<genType>::epsilon()*/); + + //! Check whether a vector is null. + //! From GLM_GTX_vector_query extensions. + template <typename valType> + bool isNull( + detail::tvec2<valType> const & v, + valType const & epsilon/* = std::numeric_limits<typename genType::value_type>::epsilon()*/); + + //! Check whether a vector is null. + //! From GLM_GTX_vector_query extensions. + template <typename valType> + bool isNull( + detail::tvec3<valType> const & v, + valType const & epsilon/* = std::numeric_limits<typename genType::value_type>::epsilon()*/); + + //! Check whether a vector is null. + //! From GLM_GTX_vector_query extensions. + template <typename valType> + bool isNull( + detail::tvec4<valType> const & v, + valType const & epsilon/* = std::numeric_limits<typename genType::value_type>::epsilon()*/); + + //! Check whether two vectors are orthonormal. + //! From GLM_GTX_vector_query extensions. + template <typename genType> + bool areOrthonormal( + genType const & v0, + genType const & v1, + typename genType::value_type const & epsilon/* = std::numeric_limits<typename genType::value_type>::epsilon()*/); + + /// @} +}// namespace glm + +#include "vector_query.inl" + +#endif//GLM_GTX_vector_query diff --git a/include/gal/opengl/glm/gtx/vector_query.inl b/include/gal/opengl/glm/gtx/vector_query.inl new file mode 100644 index 0000000..c955315 --- /dev/null +++ b/include/gal/opengl/glm/gtx/vector_query.inl @@ -0,0 +1,164 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2007-03-05 +// Updated : 2010-02-16 +// Licence : This source is under MIT License +// File : glm/gtx/vector_query.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Dependency: +// - GLM core +/////////////////////////////////////////////////////////////////////////////////////////////////// + +#include <cassert> + +namespace glm +{ + template <typename T> + GLM_FUNC_QUALIFIER bool areCollinear + ( + detail::tvec2<T> const & v0, + detail::tvec2<T> const & v1, + typename detail::tvec2<T>::value_type const & epsilon + ) + { + return length(cross(detail::tvec3<T>(v0, T(0)), detail::tvec3<T>(v1, T(0)))) < epsilon; + } + + template <typename T> + GLM_FUNC_QUALIFIER bool areCollinear + ( + detail::tvec3<T> const & v0, + detail::tvec3<T> const & v1, + typename detail::tvec3<T>::value_type const & epsilon + ) + { + return length(cross(v0, v1)) < epsilon; + } + + template <typename T> + GLM_FUNC_QUALIFIER bool areCollinear + ( + detail::tvec4<T> const & v0, + detail::tvec4<T> const & v1, + typename detail::tvec4<T>::value_type const & epsilon + ) + { + return length(cross(detail::tvec3<T>(v0), detail::tvec3<T>(v1))) < epsilon; + } + + template <typename genType> + GLM_FUNC_QUALIFIER bool areOrthogonal + ( + genType const & v0, + genType const & v1, + typename genType::value_type const & epsilon + ) + { + return abs(dot(v0, v1)) <= max( + typename genType::value_type(1), + length(v0)) * max( + typename genType::value_type(1), + length(v1)) * epsilon; + } + + template <typename genType, template <typename> class vecType> + GLM_FUNC_QUALIFIER bool isNormalized + ( + vecType<genType> const & v, + genType const & epsilon + ) + { + return abs(length(v) - genType(1)) <= genType(2) * epsilon; + } + + template <typename valType> + GLM_FUNC_QUALIFIER bool isNull + ( + detail::tvec2<valType> const & v, + valType const & epsilon + ) + { + return length(v) <= epsilon; + } + + template <typename valType> + GLM_FUNC_QUALIFIER bool isNull + ( + detail::tvec3<valType> const & v, + valType const & epsilon + ) + { + return length(v) <= epsilon; + } + + template <typename valType> + GLM_FUNC_QUALIFIER bool isNull + ( + detail::tvec4<valType> const & v, + valType const & epsilon + ) + { + return length(v) <= epsilon; + } + + template <typename T> + GLM_FUNC_QUALIFIER bool isCompNull + ( + T const & s, + T const & epsilon + ) + { + return abs(s) < epsilon; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec2<bool> isCompNull + ( + detail::tvec2<T> const & v, + T const & epsilon) + { + return detail::tvec2<bool>( + (abs(v.x) < epsilon), + (abs(v.y) < epsilon)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<bool> isCompNull + ( + detail::tvec3<T> const & v, + T const & epsilon + ) + { + return detail::tvec3<bool>( + abs(v.x) < epsilon, + abs(v.y) < epsilon, + abs(v.z) < epsilon); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec4<bool> isCompNull + ( + detail::tvec4<T> const & v, + T const & epsilon + ) + { + return detail::tvec4<bool>( + abs(v.x) < epsilon, + abs(v.y) < epsilon, + abs(v.z) < epsilon, + abs(v.w) < epsilon); + } + + template <typename genType> + GLM_FUNC_QUALIFIER bool areOrthonormal + ( + genType const & v0, + genType const & v1, + typename genType::value_type const & epsilon + ) + { + return isNormalized(v0, epsilon) && isNormalized(v1, epsilon) && (abs(dot(v0, v1)) <= epsilon); + } + +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/verbose_operator.hpp b/include/gal/opengl/glm/gtx/verbose_operator.hpp new file mode 100644 index 0000000..0a2f0e3 --- /dev/null +++ b/include/gal/opengl/glm/gtx/verbose_operator.hpp @@ -0,0 +1,83 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_verbose_operator +/// @file glm/gtx/verbose_operator.hpp +/// @date 2007-05-21 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// +/// @defgroup gtx_verbose_operator GLM_GTX_verbose_operator +/// @ingroup gtx +/// +/// @brief Use words to replace operators +/// +/// <glm/gtx/verbose_operator.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_verbose_operator +#define GLM_GTX_verbose_operator GLM_VERSION + +// Dependency: +#include "../glm.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_verbose_operator extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_verbose_operator + /// @{ + + //! Addition of two values + //! From GLM_GTX_verbose_operator extension. + template <typename genTypeT, typename genTypeU> + genTypeT add(genTypeT const & a, genTypeU const & b); + + //! Substration of two values + //! From GLM_GTX_verbose_operator extension. + template <typename genTypeT, typename genTypeU> + genTypeT sub(genTypeT const & a, genTypeU const & b); + + //! Multiplication of two values + //! From GLM_GTX_verbose_operator extension. + template <typename genTypeT, typename genTypeU> + genTypeT mul(genTypeT const & a, genTypeU const & b); + + //! Division of two values + //! From GLM_GTX_verbose_operator extension. + template <typename genTypeT, typename genTypeU> + genTypeT div(genTypeT const & a, genTypeU const & b); + + //! Multiplication and addition of three values + //! From GLM_GTX_verbose_operator extension. + template <typename genTypeT, typename genTypeU, typename genTypeV> + genTypeT mad(genTypeT const & a, genTypeU const & b, genTypeV const & c); + + /// @} +}// namespace glm + +#include "verbose_operator.inl" + +#endif//GLM_GTX_verbose_operator diff --git a/include/gal/opengl/glm/gtx/verbose_operator.inl b/include/gal/opengl/glm/gtx/verbose_operator.inl new file mode 100644 index 0000000..468bdd4 --- /dev/null +++ b/include/gal/opengl/glm/gtx/verbose_operator.inl @@ -0,0 +1,124 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2006-04-20 +// Updated : 2008-09-29 +// Licence : This source is under MIT License +// File : glm/gtx/verbose_operator.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template <typename genType> + GLM_FUNC_QUALIFIER genType add(genType const & a, genType const & b) + { + return a + b; + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType sub(genType const & a, genType const & b) + { + return a - b; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat2x2<T> mul + ( + detail::tmat2x2<T> const & a, + detail::tmat2x2<T> const & b + ) + { + return a * b; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat3x3<T> mul + ( + detail::tmat3x3<T> const & a, + detail::tmat3x3<T> const & b + ) + { + return a * b; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tmat4x4<T> mul + ( + detail::tmat4x4<T> const & a, + detail::tmat4x4<T> const & b + ) + { + return a * b; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec2<T> mul + ( + detail::tmat2x2<T> const & m, + detail::tvec2<T> const & v + ) + { + return m * v; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> mul + ( + detail::tmat3x3<T> const & m, + detail::tvec3<T> const & v) + { + return m * v; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec4<T> mul + ( + detail::tmat4x4<T> const & m, + detail::tvec4<T> const & v + ) + { + return m * v; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec2<T> mul + ( + detail::tvec2<T> const & v, + detail::tmat2x2<T> const & m + ) + { + return v * m; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> mul + ( + detail::tvec3<T> const & v, + detail::tmat3x3<T> const & m + ) + { + return v * m; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec4<T> mul + ( + detail::tvec4<T> const & v, + detail::tmat4x4<T> const & m + ) + { + return v * m; + } + + template <typename genType> + GLM_FUNC_QUALIFIER genType div(genType const & a, genType const & b) + { + return a / b; + } + + template <typename genTypeT, typename genTypeU, typename genTypeV> + GLM_FUNC_QUALIFIER genTypeT mad(genTypeT const & a, genTypeU const & b, genTypeV const & c) + { + return a * b + c; + } +}//namespace glm diff --git a/include/gal/opengl/glm/gtx/wrap.hpp b/include/gal/opengl/glm/gtx/wrap.hpp new file mode 100644 index 0000000..a671327 --- /dev/null +++ b/include/gal/opengl/glm/gtx/wrap.hpp @@ -0,0 +1,73 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref gtx_wrap +/// @file glm/gtx/wrap.hpp +/// @date 2009-11-25 / 2011-06-07 +/// @author Christophe Riccio +/// +/// @see core (dependence) +/// +/// @defgroup gtx_wrap GLM_GTX_wrap +/// @ingroup gtx +/// +/// @brief Wrapping mode of texture coordinates. +/// +/// <glm/gtx/wrap.hpp> need to be included to use these functionalities. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_GTX_wrap +#define GLM_GTX_wrap GLM_VERSION + +// Dependency: +#include "../glm.hpp" + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_GTX_wrap extension included") +#endif + +namespace glm +{ + /// @addtogroup gtx_wrap + /// @{ + + //! Simulate GL_CLAMP OpenGL wrap mode + //! From GLM_GTX_wrap extension. + template <typename genType> + genType clamp(genType const & Texcoord); + + //! Simulate GL_REPEAT OpenGL wrap mode + //! From GLM_GTX_wrap extension. + template <typename genType> + genType repeat(genType const & Texcoord); + + //! Simulate GL_MIRROR_REPEAT OpenGL wrap mode + //! From GLM_GTX_wrap extension. + template <typename genType> + genType mirrorRepeat(genType const & Texcoord); + + /// @} +}// namespace glm + +#include "wrap.inl" + +#endif//GLM_GTX_wrap diff --git a/include/gal/opengl/glm/gtx/wrap.inl b/include/gal/opengl/glm/gtx/wrap.inl new file mode 100644 index 0000000..41c7d47 --- /dev/null +++ b/include/gal/opengl/glm/gtx/wrap.inl @@ -0,0 +1,165 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////// +// OpenGL Mathematics Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Created : 2009-11-25 +// Updated : 2010-02-13 +// Licence : This source is under MIT License +// File : glm/gtx/wrap.inl +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Dependency: +// - GLM core +/////////////////////////////////////////////////////////////////////////////////////////////////// + +namespace glm +{ + template <typename genType> + GLM_FUNC_QUALIFIER genType clamp + ( + genType const & Texcoord + ) + { + return glm::clamp(Texcoord, genType(0), genType(1)); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec2<T> clamp + ( + detail::tvec2<T> const & Texcoord + ) + { + detail::tvec2<T> Result; + for(typename detail::tvec2<T>::size_type i = 0; i < detail::tvec2<T>::value_size(); ++i) + Result[i] = clamp(Texcoord[i]); + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> clamp + ( + detail::tvec3<T> const & Texcoord + ) + { + detail::tvec3<T> Result; + for(typename detail::tvec3<T>::size_type i = 0; i < detail::tvec3<T>::value_size(); ++i) + Result[i] = clamp(Texcoord[i]); + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec4<T> clamp + ( + detail::tvec4<T> const & Texcoord + ) + { + detail::tvec4<T> Result; + for(typename detail::tvec4<T>::size_type i = 0; i < detail::tvec4<T>::value_size(); ++i) + Result[i] = clamp(Texcoord[i]); + return Result; + } + + //////////////////////// + // repeat + + template <typename genType> + GLM_FUNC_QUALIFIER genType repeat + ( + genType const & Texcoord + ) + { + return glm::fract(Texcoord); + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec2<T> repeat + ( + detail::tvec2<T> const & Texcoord + ) + { + detail::tvec2<T> Result; + for(typename detail::tvec2<T>::size_type i = 0; i < detail::tvec2<T>::value_size(); ++i) + Result[i] = repeat(Texcoord[i]); + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> repeat + ( + detail::tvec3<T> const & Texcoord + ) + { + detail::tvec3<T> Result; + for(typename detail::tvec3<T>::size_type i = 0; i < detail::tvec3<T>::value_size(); ++i) + Result[i] = repeat(Texcoord[i]); + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec4<T> repeat + ( + detail::tvec4<T> const & Texcoord + ) + { + detail::tvec4<T> Result; + for(typename detail::tvec4<T>::size_type i = 0; i < detail::tvec4<T>::value_size(); ++i) + Result[i] = repeat(Texcoord[i]); + return Result; + } + + //////////////////////// + // mirrorRepeat + + template <typename genType> + GLM_FUNC_QUALIFIER genType mirrorRepeat + ( + genType const & Texcoord + ) + { + genType const Clamp = genType(int(glm::floor(Texcoord)) % 2); + genType const Floor = glm::floor(Texcoord); + genType const Rest = Texcoord - Floor; + genType const Mirror = Clamp + Rest; + + genType Out; + if(Mirror >= genType(1)) + Out = genType(1) - Rest; + else + Out = Rest; + return Out; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec2<T> mirrorRepeat + ( + detail::tvec2<T> const & Texcoord + ) + { + detail::tvec2<T> Result; + for(typename detail::tvec2<T>::size_type i = 0; i < detail::tvec2<T>::value_size(); ++i) + Result[i] = mirrorRepeat(Texcoord[i]); + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec3<T> mirrorRepeat + ( + detail::tvec3<T> const & Texcoord + ) + { + detail::tvec3<T> Result; + for(typename detail::tvec3<T>::size_type i = 0; i < detail::tvec3<T>::value_size(); ++i) + Result[i] = mirrorRepeat(Texcoord[i]); + return Result; + } + + template <typename T> + GLM_FUNC_QUALIFIER detail::tvec4<T> mirrorRepeat + ( + detail::tvec4<T> const & Texcoord + ) + { + detail::tvec4<T> Result; + for(typename detail::tvec4<T>::size_type i = 0; i < detail::tvec4<T>::value_size(); ++i) + Result[i] = mirrorRepeat(Texcoord[i]); + return Result; + } +}//namespace glm diff --git a/include/gal/opengl/glm/virtrev/xstream.hpp b/include/gal/opengl/glm/virtrev/xstream.hpp new file mode 100644 index 0000000..3be1f98 --- /dev/null +++ b/include/gal/opengl/glm/virtrev/xstream.hpp @@ -0,0 +1,166 @@ +/////////////////////////////////////////////////////////////////////////////////// +/// OpenGL Mathematics (glm.g-truc.net) +/// +/// Copyright (c) 2005 - 2013 G-Truc Creation (www.g-truc.net) +/// 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. +/// +/// @ref virtrev_xstream +/// @file glm/virtrev/xstream.hpp +/// @date 2008-05-24 / 2008-05-26 +/// @author Mathieu Roumillac (matrem84.free.fr) +/// +/// @see core (dependence) +/// @see gtc_matrix_access (dependence) +/// +/// @defgroup virtrev_xstream GLM_VIRTREV_xstream: xml like output +/// @ingroup virtrev +/// +/// @brief Streaming vector and matrix in a xml way. +/// +/// Include <glm/virtrev/xstream.hpp> for this functionality. +/////////////////////////////////////////////////////////////////////////////////// + +#ifndef GLM_VIRTREV_xstream +#define GLM_VIRTREV_xstream GLM_VERSION + +#include "../glm.hpp" +#include "../gtc/matrix_access.hpp" +#include <iostream> + +#if(defined(GLM_MESSAGES) && !defined(glm_ext)) +# pragma message("GLM: GLM_VIRTREV_xstream extension included") +#endif +/* +namespace glm{ +namespace detail +{ + template<typename T> + std::ostream & operator << (std::ostream & stream, glm::detail::tvec2<T> const & vec) + { + stream << "<glm_vec2 "; + stream << "x=\"" << vec.x << "\" "; + stream << "y=\"" << vec.y << "\" "; + stream << "/>"; + + return stream; + } + + template<typename T> + std::ostream & operator << (std::ostream & stream, glm::detail::tvec3<T> const & vec) + { + stream << "<glm_vec3 "; + stream << "x=\"" << vec.x << "\" "; + stream << "y=\"" << vec.y << "\" "; + stream << "z=\"" << vec.z << "\" "; + stream << "/>"; + + return stream; + } + + template<typename T> + std::ostream & operator << (std::ostream & stream, glm::detail::tvec4<T> const & vec) + { + stream << "<glm_vec4 "; + stream << "x=\"" << vec.x << "\" "; + stream << "y=\"" << vec.y << "\" "; + stream << "z=\"" << vec.z << "\" "; + stream << "w=\"" << vec.w << "\" "; + stream << "/>"; + + return stream; + } + + template<typename T> + std::ostream & operator << (std::ostream & stream, glm::detail::tmat2x2<T> const & mat) + { + stream << "<glm_mat2>" << std::endl; + stream << "<row "; + stream << "x=\"" << glm::row(mat, 0)[0] << "\" "; + stream << "y=\"" << glm::row(mat, 0)[1] << "\" "; + stream << "/>" << std::endl; + stream << "<row "; + stream << "x=\"" << glm::row(mat, 1)[0] << "\" "; + stream << "y=\"" << glm::row(mat, 1)[1] << "\" "; + stream << "/>" << std::endl; + stream << "</glm_mat2>"; + + return stream; + } + + template<typename T> + std::ostream & operator << (std::ostream & stream, glm::detail::tmat3x3<T> const & mat) + { + stream << "<glm_mat3>" << std::endl; + stream << "<row "; + stream << "x=\"" << glm::row(mat, 0)[0] << "\" "; + stream << "y=\"" << glm::row(mat, 0)[1] << "\" "; + stream << "z=\"" << glm::row(mat, 0)[2] << "\" "; + stream << "/>" << std::endl; + stream << "<row "; + stream << "x=\"" << glm::row(mat, 1)[0] << "\" "; + stream << "y=\"" << glm::row(mat, 1)[1] << "\" "; + stream << "z=\"" << glm::row(mat, 1)[2] << "\" "; + stream << "/>" << std::endl; + stream << "<row "; + stream << "x=\"" << glm::row(mat, 2)[0] << "\" "; + stream << "y=\"" << glm::row(mat, 2)[1] << "\" "; + stream << "z=\"" << glm::row(mat, 2)[2] << "\" "; + stream << "/>" << std::endl; + stream << "</glm_mat3>"; + + return stream; + } + + template<typename T> + std::ostream & operator << (std::ostream & stream, glm::detail::tmat4x4<T> const & mat) + { + stream << "<glm_mat4>" << std::endl; + stream << "<row "; + stream << "x=\"" << glm::row(mat, 0)[0] << "\" "; + stream << "y=\"" << glm::row(mat, 0)[1] << "\" "; + stream << "z=\"" << glm::row(mat, 0)[2] << "\" "; + stream << "w=\"" << glm::row(mat, 0)[3] << "\" "; + stream << "/>" << std::endl; + stream << "<row "; + stream << "x=\"" << glm::row(mat, 1)[0] << "\" "; + stream << "y=\"" << glm::row(mat, 1)[1] << "\" "; + stream << "z=\"" << glm::row(mat, 1)[2] << "\" "; + stream << "w=\"" << glm::row(mat, 1)[3] << "\" "; + stream << "/>" << std::endl; + stream << "<row "; + stream << "x=\"" << glm::row(mat, 2)[0] << "\" "; + stream << "y=\"" << glm::row(mat, 2)[1] << "\" "; + stream << "z=\"" << glm::row(mat, 2)[2] << "\" "; + stream << "w=\"" << glm::row(mat, 2)[3] << "\" "; + stream << "/>" << std::endl; + stream << "<row "; + stream << "x=\"" << glm::row(mat, 3)[0] << "\" "; + stream << "y=\"" << glm::row(mat, 3)[1] << "\" "; + stream << "z=\"" << glm::row(mat, 3)[2] << "\" "; + stream << "w=\"" << glm::row(mat, 3)[3] << "\" "; + stream << "/>" << std::endl; + stream << "</glm_mat4>"; + + return stream; + } + +}//namespace detail +}//namespace glm +*/ +#endif//GLM_VIRTREV_xstream diff --git a/include/gal/opengl/gpu_manager.h b/include/gal/opengl/gpu_manager.h new file mode 100644 index 0000000..5ed2a08 --- /dev/null +++ b/include/gal/opengl/gpu_manager.h @@ -0,0 +1,182 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2013 CERN + * @author Maciej Suminski <maciej.suminski@cern.ch> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/** + * @file gpu_manager.h + * @brief Class to handle uploading vertices and indices to GPU in drawing purposes. + */ + +#ifndef GPU_MANAGER_H_ +#define GPU_MANAGER_H_ + +#include <gal/opengl/vertex_common.h> +#include <boost/scoped_array.hpp> + +namespace KIGFX +{ +class SHADER; +class VERTEX_CONTAINER; +class CACHED_CONTAINER; +class NONCACHED_CONTAINER; + +class GPU_MANAGER +{ +public: + static GPU_MANAGER* MakeManager( VERTEX_CONTAINER* aContainer ); + + virtual ~GPU_MANAGER(); + + /** + * @brief Initializes everything needed to use vertex buffer objects (should be called when + * there is an OpenGL context available). + */ + virtual void Initialize() = 0; + + /** + * Function BeginDrawing() + * Prepares the stored data to be drawn. + */ + virtual void BeginDrawing() = 0; + + /** + * Function DrawIndices() + * Makes the GPU draw given range of vertices. + * @param aOffset is the beginning of the range. + * @param aSize is the number of vertices to be drawn. + */ + virtual void DrawIndices( unsigned int aOffset, unsigned int aSize ) = 0; + + /** + * Function DrawIndices() + * Makes the GPU draw all the vertices stored in the container. + */ + virtual void DrawAll() = 0; + + /** + * Function EndDrawing() + * Clears the container after drawing routines. + */ + virtual void EndDrawing() = 0; + + /** + * Function SetShader() + * Allows using shaders with the stored data. + * @param aShader is the object that allows using shaders. + */ + virtual void SetShader( SHADER& aShader ); + +protected: + GPU_MANAGER( VERTEX_CONTAINER* aContainer ); + + ///> Drawing status flag. + bool m_isDrawing; + + ///> Container that stores vertices data. + VERTEX_CONTAINER* m_container; + + ///> Shader handling + SHADER* m_shader; + + ///> Location of shader attributes (for glVertexAttribPointer) + int m_shaderAttrib; +}; + + +class GPU_CACHED_MANAGER : public GPU_MANAGER +{ +public: + GPU_CACHED_MANAGER( VERTEX_CONTAINER* aContainer ); + ~GPU_CACHED_MANAGER(); + + ///> @copydoc GPU_MANAGER::Initialize() + virtual void Initialize(); + + ///> @copydoc GPU_MANAGER::BeginDrawing() + virtual void BeginDrawing(); + + ///> @copydoc GPU_MANAGER::DrawIndices() + virtual void DrawIndices( unsigned int aOffset, unsigned int aSize ); + + ///> @copydoc GPU_MANAGER::DrawAll() + virtual void DrawAll(); + + ///> @copydoc GPU_MANAGER::EndDrawing() + virtual void EndDrawing(); + +protected: + /** + * Function uploadToGpu + * Rebuilds vertex buffer object using stored VERTEX_ITEMs and sends it to the graphics card + * memory. + */ + virtual void uploadToGpu(); + + ///> Resizes the indices buffer to aNewSize if necessary + void resizeIndices( unsigned int aNewSize ); + + ///> Buffers initialization flag + bool m_buffersInitialized; + + ///> Pointer to the current indices buffer + boost::scoped_array<GLuint> m_indices; + + ///> Pointer to the first free cell in the indices buffer + GLuint* m_indicesPtr; + + ///> Handle to vertices buffer + GLuint m_verticesBuffer; + + ///> Handle to indices buffer + GLuint m_indicesBuffer; + + ///> Number of indices stored in the indices buffer + unsigned int m_indicesSize; + + ///> Current indices buffer size + unsigned int m_indicesCapacity; +}; + + +class GPU_NONCACHED_MANAGER : public GPU_MANAGER +{ +public: + GPU_NONCACHED_MANAGER( VERTEX_CONTAINER* aContainer ); + + ///> @copydoc GPU_MANAGER::Initialize() + virtual void Initialize(); + + ///> @copydoc GPU_MANAGER::BeginDrawing() + virtual void BeginDrawing(); + + ///> @copydoc GPU_MANAGER::DrawIndices() + virtual void DrawIndices( unsigned int aOffset, unsigned int aSize ); + + ///> @copydoc GPU_MANAGER::DrawAll() + virtual void DrawAll(); + + ///> @copydoc GPU_MANAGER::EndDrawing() + virtual void EndDrawing(); +}; +} // namespace KIGFX +#endif /* GPU_MANAGER_H_ */ diff --git a/include/gal/opengl/noncached_container.h b/include/gal/opengl/noncached_container.h new file mode 100644 index 0000000..3a51e6d --- /dev/null +++ b/include/gal/opengl/noncached_container.h @@ -0,0 +1,73 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2013 CERN + * @author Maciej Suminski <maciej.suminski@cern.ch> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/** + * @file noncached_container.h + * @brief Class to store instances of VERTEX without caching. It allows a fast one-frame drawing + * and then clearing the buffer and starting from scratch. + */ + +#ifndef NONCACHED_CONTAINER_H_ +#define NONCACHED_CONTAINER_H_ + +#include <gal/opengl/vertex_container.h> + +namespace KIGFX +{ +class VERTEX_ITEM; +class SHADER; + +class NONCACHED_CONTAINER : public VERTEX_CONTAINER +{ +public: + NONCACHED_CONTAINER( unsigned int aSize = defaultInitSize ); + virtual ~NONCACHED_CONTAINER(); + + ///< @copydoc VERTEX_CONTAINER::SetItem( VERTEX_ITEM* aItem ) + virtual void SetItem( VERTEX_ITEM* aItem ); + + ///< @copydoc VERTEX_CONTAINER::Allocate( unsigned int aSize ) + virtual VERTEX* Allocate( unsigned int aSize ); + + ///< @copydoc VERTEX_CONTAINER::Delete( VERTEX_ITEM* aItem ) + void Delete( VERTEX_ITEM* aItem ) {}; + + ///< @copydoc VERTEX_CONTAINER::Clear() + virtual void Clear(); + + ///< @copydoc VERTEX_CONTAINER::GetSize() + virtual inline unsigned int GetSize() const + { + // As the m_freePtr points to the first free space, we can safely assume + // that this is the number of vertices stored inside + return m_freePtr; + } + +protected: + ///< Index of the free first space where a vertex can be stored + unsigned int m_freePtr; +}; +} // namespace KIGFX + +#endif /* NONCACHED_CONTAINER_H_ */ diff --git a/include/gal/opengl/opengl_compositor.h b/include/gal/opengl/opengl_compositor.h new file mode 100644 index 0000000..c06add7 --- /dev/null +++ b/include/gal/opengl/opengl_compositor.h @@ -0,0 +1,109 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2013 CERN + * @author Maciej Suminski <maciej.suminski@cern.ch> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/** + * @file opengl_compositor.h + * @brief Class that handles multitarget rendering (ie. to different textures/surfaces) and + * later compositing into a single image (OpenGL flavour). + */ + +#ifndef OPENGL_COMPOSITOR_H_ +#define OPENGL_COMPOSITOR_H_ + +#include <gal/compositor.h> +#include <GL/glew.h> +#include <deque> + +namespace KIGFX +{ +class OPENGL_COMPOSITOR : public COMPOSITOR +{ +public: + OPENGL_COMPOSITOR(); + virtual ~OPENGL_COMPOSITOR(); + + /// @copydoc COMPOSITOR::Initialize() + virtual void Initialize(); + + /// @copydoc COMPOSITOR::Resize() + virtual void Resize( unsigned int aWidth, unsigned int aHeight ); + + /// @copydoc COMPOSITOR::CreateBuffer() + virtual unsigned int CreateBuffer(); + + /// @copydoc COMPOSITOR::SetBuffer() + virtual void SetBuffer( unsigned int aBufferHandle ); + + /// @copydoc COMPOSITOR::GetBuffer() + inline virtual unsigned int GetBuffer() const + { + if( m_currentFbo == DIRECT_RENDERING ) + return DIRECT_RENDERING; + + return m_current + 1; + } + + /// @copydoc COMPOSITOR::ClearBuffer() + virtual void ClearBuffer(); + + /// @copydoc COMPOSITOR::DrawBuffer() + virtual void DrawBuffer( unsigned int aBufferHandle ); + + // Constant used by glBindFramebuffer to turn off rendering to framebuffers + static const unsigned int DIRECT_RENDERING = 0; + +protected: + typedef struct + { + GLuint textureTarget; ///< Main texture handle + GLuint attachmentPoint; ///< Point to which an image from texture is attached + } OPENGL_BUFFER; + + bool m_initialized; ///< Initialization status flag + unsigned int m_current; ///< Currently used buffer handle + GLuint m_framebuffer; ///< Main FBO handle + GLuint m_depthBuffer; ///< Depth buffer handle + typedef std::deque<OPENGL_BUFFER> OPENGL_BUFFERS; + + /// Stores information about initialized buffers + OPENGL_BUFFERS m_buffers; + + /// Store the currently used FBO name in case there was more than one compositor used + GLuint m_currentFbo; + + /** + * Function clean() + * performs freeing of resources. + */ + void clean(); + + /// Returns number of used buffers + inline unsigned int usedBuffers() + { + return m_buffers.size(); + } +}; +} // namespace KIGFX + +#endif /* COMPOSITOR_H_ */ diff --git a/include/gal/opengl/opengl_gal.h b/include/gal/opengl/opengl_gal.h new file mode 100644 index 0000000..83598ba --- /dev/null +++ b/include/gal/opengl/opengl_gal.h @@ -0,0 +1,394 @@ +/* + * This program source code file is part of KICAD, a free EDA CAD application. + * + * Copyright (C) 2012 Torsten Hueter, torstenhtr <at> gmx.de + * Copyright (C) 2012 Kicad Developers, see change_log.txt for contributors. + * Copyright (C) 2013-2016 CERN + * @author Maciej Suminski <maciej.suminski@cern.ch> + * + * Graphics Abstraction Layer (GAL) for OpenGL + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef OPENGLGAL_H_ +#define OPENGLGAL_H_ + +// GAL imports +#include <gal/graphics_abstraction_layer.h> +#include <gal/opengl/shader.h> +#include <gal/opengl/vertex_manager.h> +#include <gal/opengl/vertex_item.h> +#include <gal/opengl/noncached_container.h> +#include <gal/opengl/opengl_compositor.h> + +#include <wx/glcanvas.h> + +#include <map> +#include <boost/smart_ptr/shared_ptr.hpp> +#include <boost/smart_ptr/shared_array.hpp> + +#ifndef CALLBACK +#define CALLBACK +#endif + +namespace KIGFX +{ +class SHADER; + +/** + * @brief Class OpenGL_GAL is the OpenGL implementation of the Graphics Abstraction Layer. + * + * This is a direct OpenGL-implementation and uses low-level graphics primitives like triangles + * and quads. The purpose is to provide a fast graphics interface, that takes advantage of modern + * graphics card GPUs. All methods here benefit thus from the hardware acceleration. + */ +class OPENGL_GAL : public GAL, public wxGLCanvas +{ +public: + + /** + * @brief Constructor OPENGL_GAL + * + * @param aParent is the wxWidgets immediate wxWindow parent of this object. + * + * @param aMouseListener is the wxEvtHandler that should receive the mouse events, + * this can be can be any wxWindow, but is often a wxFrame container. + * + * @param aPaintListener is the wxEvtHandler that should receive the paint + * event. This can be any wxWindow, but is often a derived instance + * of this class or a containing wxFrame. The "paint event" here is + * a wxCommandEvent holding EVT_GAL_REDRAW, as sent by PostPaint(). + * + * @param aName is the name of this window for use by wxWindow::FindWindowByName() + */ + OPENGL_GAL( wxWindow* aParent, wxEvtHandler* aMouseListener = NULL, + wxEvtHandler* aPaintListener = NULL, const wxString& aName = wxT( "GLCanvas" ) ); + + virtual ~OPENGL_GAL(); + + /// @copydoc GAL::IsInitialized() + virtual bool IsInitialized() const { return IsShownOnScreen(); } + + // --------------- + // Drawing methods + // --------------- + + /// @copydoc GAL::BeginDrawing() + virtual void BeginDrawing(); + + /// @copydoc GAL::EndDrawing() + virtual void EndDrawing(); + + /// @copydoc GAL::DrawLine() + virtual void DrawLine( const VECTOR2D& aStartPoint, const VECTOR2D& aEndPoint ); + + /// @copydoc GAL::DrawSegment() + virtual void DrawSegment( const VECTOR2D& aStartPoint, const VECTOR2D& aEndPoint, + double aWidth ); + + /// @copydoc GAL::DrawCircle() + virtual void DrawCircle( const VECTOR2D& aCenterPoint, double aRadius ); + + /// @copydoc GAL::DrawArc() + virtual void DrawArc( const VECTOR2D& aCenterPoint, double aRadius, + double aStartAngle, double aEndAngle ); + + /// @copydoc GAL::DrawRectangle() + virtual void DrawRectangle( const VECTOR2D& aStartPoint, const VECTOR2D& aEndPoint ); + + /// @copydoc GAL::DrawPolyline() + virtual void DrawPolyline( const std::deque<VECTOR2D>& aPointList ); + virtual void DrawPolyline( const VECTOR2D aPointList[], int aListSize ); + + /// @copydoc GAL::DrawPolygon() + virtual void DrawPolygon( const std::deque<VECTOR2D>& aPointList ); + virtual void DrawPolygon( const VECTOR2D aPointList[], int aListSize ); + + /// @copydoc GAL::DrawCurve() + virtual void DrawCurve( const VECTOR2D& startPoint, const VECTOR2D& controlPointA, + const VECTOR2D& controlPointB, const VECTOR2D& endPoint ); + + // -------------- + // Screen methods + // -------------- + + /// @brief Resizes the canvas. + virtual void ResizeScreen( int aWidth, int aHeight ); + + /// @brief Shows/hides the GAL canvas + virtual bool Show( bool aShow ); + + /// @copydoc GAL::Flush() + virtual void Flush(); + + /// @copydoc GAL::ClearScreen() + virtual void ClearScreen( const COLOR4D& aColor ); + + // -------------- + // Transformation + // -------------- + + /// @copydoc GAL::Transform() + virtual void Transform( const MATRIX3x3D& aTransformation ); + + /// @copydoc GAL::Rotate() + virtual void Rotate( double aAngle ); + + /// @copydoc GAL::Translate() + virtual void Translate( const VECTOR2D& aTranslation ); + + /// @copydoc GAL::Scale() + virtual void Scale( const VECTOR2D& aScale ); + + /// @copydoc GAL::Save() + virtual void Save(); + + /// @copydoc GAL::Restore() + virtual void Restore(); + + // -------------------------------------------- + // Group methods + // --------------------------------------------- + + /// @copydoc GAL::BeginGroup() + virtual int BeginGroup(); + + /// @copydoc GAL::EndGroup() + virtual void EndGroup(); + + /// @copydoc GAL::DrawGroup() + virtual void DrawGroup( int aGroupNumber ); + + /// @copydoc GAL::ChangeGroupColor() + virtual void ChangeGroupColor( int aGroupNumber, const COLOR4D& aNewColor ); + + /// @copydoc GAL::ChangeGroupDepth() + virtual void ChangeGroupDepth( int aGroupNumber, int aDepth ); + + /// @copydoc GAL::DeleteGroup() + virtual void DeleteGroup( int aGroupNumber ); + + /// @copydoc GAL::ClearCache() + virtual void ClearCache(); + + // -------------------------------------------------------- + // Handling the world <-> screen transformation + // -------------------------------------------------------- + + /// @copydoc GAL::SaveScreen() + virtual void SaveScreen(); + + /// @copydoc GAL::RestoreScreen() + virtual void RestoreScreen(); + + /// @copydoc GAL::SetTarget() + virtual void SetTarget( RENDER_TARGET aTarget ); + + /// @copydoc GAL::GetTarget() + virtual RENDER_TARGET GetTarget() const; + + /// @copydoc GAL::ClearTarget() + virtual void ClearTarget( RENDER_TARGET aTarget ); + + // ------- + // Cursor + // ------- + + /// @copydoc GAL::DrawCursor() + virtual void DrawCursor( const VECTOR2D& aCursorPosition ); + + /** + * @brief Function PostPaint + * posts an event to m_paint_listener. A post is used so that the actual drawing + * function can use a device context type that is not specific to the wxEVT_PAINT event. + */ + void PostPaint() + { + if( paintListener ) + { + wxPaintEvent redrawEvent; + wxPostEvent( paintListener, redrawEvent ); + } + } + + void SetMouseListener( wxEvtHandler* aMouseListener ) + { + mouseListener = aMouseListener; + } + + void SetPaintListener( wxEvtHandler* aPaintListener ) + { + paintListener = aPaintListener; + } + + ///< Parameters passed to the GLU tesselator + typedef struct + { + /// Manager used for storing new vertices + VERTEX_MANAGER* vboManager; + + /// Intersect points, that have to be freed after tessellation + std::deque< boost::shared_array<GLdouble> >& intersectPoints; + } TessParams; + +protected: + virtual void drawGridLine( const VECTOR2D& aStartPoint, const VECTOR2D& aEndPoint ); + +private: + /// Super class definition + typedef GAL super; + + static const int CIRCLE_POINTS = 64; ///< The number of points for circle approximation + static const int CURVE_POINTS = 32; ///< The number of points for curve approximation + + wxClientDC* clientDC; ///< Drawing context + static wxGLContext* glContext; ///< OpenGL context of wxWidgets + wxEvtHandler* mouseListener; + wxEvtHandler* paintListener; + + // Vertex buffer objects related fields + typedef std::map< unsigned int, boost::shared_ptr<VERTEX_ITEM> > GROUPS_MAP; + GROUPS_MAP groups; ///< Stores informations about VBO objects (groups) + unsigned int groupCounter; ///< Counter used for generating keys for groups + VERTEX_MANAGER* currentManager; ///< Currently used VERTEX_MANAGER (for storing VERTEX_ITEMs) + VERTEX_MANAGER cachedManager; ///< Container for storing cached VERTEX_ITEMs + VERTEX_MANAGER nonCachedManager; ///< Container for storing non-cached VERTEX_ITEMs + VERTEX_MANAGER overlayManager; ///< Container for storing overlaid VERTEX_ITEMs + + // Framebuffer & compositing + OPENGL_COMPOSITOR compositor; ///< Handles multiple rendering targets + unsigned int mainBuffer; ///< Main rendering target + unsigned int overlayBuffer; ///< Auxiliary rendering target (for menus etc.) + RENDER_TARGET currentTarget; ///< Current rendering target + + // Shader + SHADER shader; ///< There is only one shader used for different objects + + // Internal flags + bool isFramebufferInitialized; ///< Are the framebuffers initialized? + bool isGrouping; ///< Was a group started? + + // Polygon tesselation + /// The tessellator + GLUtesselator* tesselator; + /// Storage for intersecting points + std::deque< boost::shared_array<GLdouble> > tessIntersects; + + /** + * @brief Draw a quad for the line. + * + * @param aStartPoint is the start point of the line. + * @param aEndPoint is the end point of the line. + */ + void drawLineQuad( const VECTOR2D& aStartPoint, const VECTOR2D& aEndPoint ); + + /** + * @brief Draw a semicircle. Depending on settings (isStrokeEnabled & isFilledEnabled) it runs + * the proper function (drawStrokedSemiCircle or drawFilledSemiCircle). + * + * @param aCenterPoint is the center point. + * @param aRadius is the radius of the semicircle. + * @param aAngle is the angle of the semicircle. + * + */ + void drawSemiCircle( const VECTOR2D& aCenterPoint, double aRadius, double aAngle ); + + /** + * @brief Draw a filled semicircle. + * + * @param aCenterPoint is the center point. + * @param aRadius is the radius of the semicircle. + * @param aAngle is the angle of the semicircle. + * + */ + void drawFilledSemiCircle( const VECTOR2D& aCenterPoint, double aRadius, double aAngle ); + + /** + * @brief Draw a stroked semicircle. + * + * @param aCenterPoint is the center point. + * @param aRadius is the radius of the semicircle. + * @param aAngle is the angle of the semicircle. + * + */ + void drawStrokedSemiCircle( const VECTOR2D& aCenterPoint, double aRadius, double aAngle ); + + // Event handling + /** + * @brief This is the OnPaint event handler. + * + * @param aEvent is the OnPaint event. + */ + void onPaint( wxPaintEvent& aEvent ); + + /** + * @brief Skip the mouse event to the parent. + * + * @param aEvent is the mouse event. + */ + void skipMouseEvent( wxMouseEvent& aEvent ); + + /** + * @brief Blits cursor into the current screen. + */ + void blitCursor(); + + /** + * @brief Returns a valid key that can be used as a new group number. + * + * @return An unique group number that is not used by any other group. + */ + unsigned int getNewGroupNumber(); + + /** + * @brief Checks if the required OpenGL version and extensions are supported. + * @return true in case of success. + */ + bool runTest(); + + // Helper class to determine OpenGL capabilities + class OPENGL_TEST: public wxGLCanvas + { + public: + OPENGL_TEST( wxDialog* aParent, OPENGL_GAL* aGal ); + + void Render( wxPaintEvent& aEvent ); + void OnTimeout( wxTimerEvent& aEvent ); + void OnDialogPaint( wxPaintEvent& aEvent ); + + inline bool IsTested() const { return m_tested; } + inline bool IsOk() const { return m_result && m_tested; } + inline std::string GetError() const { return m_error; } + + private: + void error( const std::string& aError ); + + wxDialog* m_parent; + OPENGL_GAL* m_gal; + bool m_tested; + bool m_result; + std::string m_error; + wxTimer m_timeoutTimer; + }; + + friend class OPENGL_TEST; +}; +} // namespace KIGFX + +#endif // OPENGLGAL_H_ diff --git a/include/gal/opengl/shader.h b/include/gal/opengl/shader.h new file mode 100644 index 0000000..a83de84 --- /dev/null +++ b/include/gal/opengl/shader.h @@ -0,0 +1,210 @@ +/* + * This program source code file is part of KICAD, a free EDA CAD application. + * + * Copyright (C) 2012 Torsten Hueter, torstenhtr <at> gmx.de + * Copyright (C) 2012 Kicad Developers, see change_log.txt for contributors. + * + * Graphics Abstraction Layer (GAL) for OpenGL + * + * Shader class + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef SHADER_H_ +#define SHADER_H_ + +#include <GL/glew.h> + +#include <string> +#include <deque> + +namespace KIGFX +{ +class OPENGL_GAL; + +/// Type definition for the shader +enum SHADER_TYPE +{ + SHADER_TYPE_VERTEX = GL_VERTEX_SHADER, ///< Vertex shader + SHADER_TYPE_FRAGMENT = GL_FRAGMENT_SHADER, ///< Fragment shader + SHADER_TYPE_GEOMETRY = GL_GEOMETRY_SHADER ///< Geometry shader +}; + +/** + * @brief Class SHADER provides the access to the OpenGL shaders. + * + * The purpose of this class is advanced drawing with OpenGL. One example is using the pixel + * shader for drawing exact circles or for anti-aliasing. This class supports vertex, geometry + * and fragment shaders. + * <br> + * Make sure that the hardware supports these features. This can be identified with the "GLEW" + * library. + */ +class SHADER +{ +public: + + /** + * @brief Constructor + */ + SHADER(); + + /** + * @brief Destructor + */ + virtual ~SHADER(); + + /** + * @brief Loads one of the built-in shaders and compiles it. + * + * @param aShaderNumber is the shader number (indexing from 0). + * @param aShaderType is the type of the shader. + * @return True in case of success, false otherwise. + */ + bool LoadBuiltinShader( unsigned int aShaderNumber, SHADER_TYPE aShaderType ); + + /** + * @brief Loads one of the built-in shaders and compiles it. + * + * @param aShaderSourceName is the shader source file name. + * @param aShaderType is the type of the shader. + * @return True in case of success, false otherwise. + */ + bool LoadShaderFromFile( const std::string& aShaderSourceName, SHADER_TYPE aShaderType ); + + /** + * @brief Link the shaders. + * + * @return true in case of success, false otherwise. + */ + bool Link(); + + /** + * @brief Use the shader. + */ + inline void Use() + { + glUseProgram( programNumber ); + active = true; + } + + /** + * @brief Deactivate the shader and use the default OpenGL program. + */ + inline void Deactivate() + { + glUseProgram( 0 ); + active = false; + } + + /** + * @brief Returns the current state of the shader. + * + * @return True if any of shaders is enabled. + */ + inline bool IsActive() const + { + return active; + } + + /** + * @brief Configure the geometry shader - has to be done before linking! + * + * @param maxVertices is the maximum of vertices to be generated. + * @param geometryInputType is the input type [e.g. GL_LINES, GL_TRIANGLES, GL_QUADS etc.] + * @param geometryOutputType is the output type [e.g. GL_LINES, GL_TRIANGLES, GL_QUADS etc.] + */ + void ConfigureGeometryShader( GLuint maxVertices, GLuint geometryInputType, + GLuint geometryOutputType ); + + /** + * @brief Add a parameter to the parameter queue. + * + * To communicate with the shader use this function to set up the names for the uniform + * variables. These are queued in a list and can be assigned with the SetParameter(..) + * method using the queue position. + * + * @param aParameterName is the name of the parameter. + * @return the added parameter location. + */ + int AddParameter( const std::string& aParameterName ); + + /** + * @brief Set a parameter of the shader. + * + * @param aParameterNumber is the number of the parameter. + * @param aValue is the value of the parameter. + */ + void SetParameter( int aParameterNumber, float aValue ) const; + void SetParameter( int aParameterNumber, int aValue ) const; + + /** + * @brief Gets an attribute location. + * + * @param aAttributeName is the name of the attribute. + * @return the location. + */ + int GetAttribute( std::string aAttributeName ) const; + +private: + + /** + * @brief Get the shader program information. + * + * @param aProgram is the program number. + */ + void programInfo( GLuint aProgram ); + + /** + * @brief Get the shader information. + * + * @param aShader is the shader number. + */ + void shaderInfo( GLuint aShader ); + + /** + * @brief Read the shader source file + * + * @param aShaderSourceName is the shader source file name. + * @return the source as string + */ + std::string readSource( std::string aShaderSourceName ); + + /** + * @brief Add a shader and compile the shader sources. + * + * @param aShaderSource is the shader source content. + * @param aShaderType is the type of the shader. + * @return True in case of success, false otherwise. + */ + bool addSource( const std::string& aShaderSource, SHADER_TYPE aShaderType ); + + std::deque<GLuint> shaderNumbers; ///< Shader number list + GLuint programNumber; ///< Shader program number + bool isProgramCreated; ///< Flag for program creation + bool isShaderLinked; ///< Is the shader linked? + bool active; ///< Is any of shaders used? + GLuint maximumVertices; ///< The maximum of vertices to be generated + GLuint geomInputType; ///< Input type [e.g. GL_LINES, GL_TRIANGLES, GL_QUADS etc.] + GLuint geomOutputType; ///< Output type [e.g. GL_LINES, GL_TRIANGLES, GL_QUADS etc.] + std::deque<GLint> parameterLocation; ///< Location of the parameter +}; +} // namespace KIGFX + +#endif /* SHADER_H_ */ diff --git a/include/gal/opengl/vertex_common.h b/include/gal/opengl/vertex_common.h new file mode 100644 index 0000000..0d8eb9d --- /dev/null +++ b/include/gal/opengl/vertex_common.h @@ -0,0 +1,76 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2013 CERN + * @author Maciej Suminski <maciej.suminski@cern.ch> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/** + * @file vertex_common.h + * @brief Common defines and consts used in vertex related classes. + */ + +#ifndef VERTEX_COMMON_H_ +#define VERTEX_COMMON_H_ + +#include <GL/glew.h> + +#include <cstddef> + +namespace KIGFX +{ +// Possible types of shaders +enum SHADER_MODE +{ + SHADER_NONE = 0, + SHADER_LINE, + SHADER_FILLED_CIRCLE, + SHADER_STROKED_CIRCLE, +}; + +typedef struct +{ + GLfloat x, y, z; // Coordinates + GLubyte r, g, b, a; // Color + GLfloat shader[4]; // Shader type & params +} VERTEX; + +///< Data structure for vertices {X,Y,Z,R,G,B,A,shader¶m} (@see VERTEX). +const unsigned int VertexSize = sizeof(VERTEX); +const unsigned int VertexStride = VertexSize / sizeof(GLfloat); + +const unsigned int CoordSize = sizeof(VERTEX().x) + sizeof(VERTEX().y) + sizeof(VERTEX().z); +const unsigned int CoordStride = CoordSize / sizeof(GLfloat); + +// Offset of color data from the beginning of each vertex data +const unsigned int ColorOffset = offsetof(VERTEX, r); +const unsigned int ColorSize = sizeof(VERTEX().r) + sizeof(VERTEX().g) + + sizeof(VERTEX().b) + sizeof(VERTEX().a); +const unsigned int ColorStride = ColorSize / sizeof(GLubyte); + +// Shader attributes +const unsigned int ShaderOffset = offsetof(VERTEX, shader); +const unsigned int ShaderSize = sizeof(VERTEX().shader); +const unsigned int ShaderStride = ShaderSize / sizeof(GLfloat); + +const unsigned int IndexSize = sizeof(GLuint); +} // namespace KIGFX + +#endif /* VERTEX_COMMON_H_ */ diff --git a/include/gal/opengl/vertex_container.h b/include/gal/opengl/vertex_container.h new file mode 100644 index 0000000..1c7b00b --- /dev/null +++ b/include/gal/opengl/vertex_container.h @@ -0,0 +1,176 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2013 CERN + * @author Maciej Suminski <maciej.suminski@cern.ch> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/** + * @file vertex_container.h + * @brief Class to store vertices and handle transfers between system memory and GPU memory. + */ + +#ifndef VERTEX_CONTAINER_H_ +#define VERTEX_CONTAINER_H_ + +#include <gal/opengl/vertex_common.h> + +namespace KIGFX +{ +class VERTEX_ITEM; +class SHADER; + +class VERTEX_CONTAINER +{ +public: + /** + * Function MakeContainer() + * Returns a pointer to a new container of an appropriate type. + */ + static VERTEX_CONTAINER* MakeContainer( bool aCached ); + + virtual ~VERTEX_CONTAINER(); + + /** + * Function SetItem() + * sets the item in order to modify or finishes its current modifications. + * @param aItem is the item or NULL in case of finishing the item. + */ + virtual void SetItem( VERTEX_ITEM* aItem ) = 0; + + /** + * Function FinishItem() + * does the cleaning after adding an item. + */ + virtual void FinishItem() {}; + + /** + * Function Allocate() + * returns allocated space (possibly resizing the reserved memory chunk or allocating a new + * chunk if it was not stored before) for the given number of vertices associated with the + * current item (set by SetItem()). The newly allocated space is added at the end of the chunk + * used by the current item and may serve to store new vertices. + * @param aSize is the number of vertices to be allocated. + * @return Pointer to the allocated space or NULL in case of failure. + */ + virtual VERTEX* Allocate( unsigned int aSize ) = 0; + + /** + * Function Delete() + * erases the selected item. + * + * @param aItem is the item to be erased. + */ + virtual void Delete( VERTEX_ITEM* aItem ) = 0; + + /** + * Function Clear() + * removes all the data stored in the container and restores its original state. + */ + virtual void Clear() = 0; + + /** + * Function GetAllVertices() + * returns all the vertices stored in the container. It is especially useful for transferring + * data to the GPU memory. + */ + inline virtual VERTEX* GetAllVertices() const + { + return m_vertices; + } + + /** + * Function GetVertices() + * returns vertices stored at the specific offset. + * @param aOffset is the offset. + */ + virtual inline VERTEX* GetVertices( unsigned int aOffset ) const + { + return &m_vertices[aOffset]; + } + + /** + * Function GetSize() + * returns amount of vertices currently stored in the container. + */ + virtual inline unsigned int GetSize() const + { + return m_currentSize; + } + + /** + * Function IsDirty() + * returns information about container cache state. Clears the flag after calling the function. + * @return true in case the vertices have to be reuploaded. + */ + inline bool IsDirty() + { + bool state = m_dirty; + + m_dirty = false; + + return state; + } + + /** + * Function SetDirty() + * sets the dirty flag, so vertices in the container are going to be reuploaded to the GPU on + * the next frame. + */ + inline void SetDirty() + { + m_dirty = true; + } + +protected: + VERTEX_CONTAINER( unsigned int aSize = defaultInitSize ); + + ///< How many vertices we can store in the container + unsigned int m_freeSpace; + + ///< How big is the current container, expressed in vertices + unsigned int m_currentSize; + + ///< Store the initial size, so it can be resized to this on Clear() + unsigned int m_initialSize; + + ///< Actual storage memory (should be handled using malloc/realloc/free to speed up resizing) + VERTEX* m_vertices; + + ///< State flags + bool m_failed; + bool m_dirty; + + /** + * Function reservedSpace() + * returns size of the reserved memory space. + * @return Size of the reserved memory space (expressed as a number of vertices). + */ + inline unsigned int reservedSpace() + { + return m_currentSize - m_freeSpace; + } + + ///< Default initial size of a container (expressed in vertices) + static const unsigned int defaultInitSize = 1048576; +}; +} // namespace KIGFX + +#endif /* VERTEX_CONTAINER_H_ */ diff --git a/include/gal/opengl/vertex_item.h b/include/gal/opengl/vertex_item.h new file mode 100644 index 0000000..c5bf962 --- /dev/null +++ b/include/gal/opengl/vertex_item.h @@ -0,0 +1,103 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2013 CERN + * @author Maciej Suminski <maciej.suminski@cern.ch> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/** + * @file vertex_item.h + * @brief Class to handle an item held in a container. + */ + +#ifndef VERTEX_ITEM_H_ +#define VERTEX_ITEM_H_ + +#include <gal/opengl/vertex_common.h> +#include <gal/color4d.h> +#include <cstddef> + +namespace KIGFX +{ +class VERTEX_MANAGER; + +class VERTEX_ITEM +{ +public: + friend class CACHED_CONTAINER; + friend class VERTEX_MANAGER; + + VERTEX_ITEM( const VERTEX_MANAGER& aManager ); + virtual ~VERTEX_ITEM(); + + /** + * Function GetSize() + * Returns information about number of vertices stored. + * @return Number of vertices. + */ + inline unsigned int GetSize() const + { + return m_size; + } + + /** + * Function GetOffset() + * Returns data offset in the container. + * @return Data offset expressed as a number of vertices. + */ + inline unsigned int GetOffset() const + { + return m_offset; + } + + /** + * Function GetVertices() + * Returns pointer to the data used by the VERTEX_ITEM. + */ + VERTEX* GetVertices() const; + +private: + const VERTEX_MANAGER& m_manager; + unsigned int m_offset; + unsigned int m_size; + + /** + * Function SetOffset() + * Sets data offset in the container. + * @param aOffset is the offset expressed as a number of vertices. + */ + inline void setOffset( unsigned int aOffset ) + { + m_offset = aOffset; + } + + /** + * Function SetSize() + * Sets data size in the container. + * @param aSize is the size expressed as a number of vertices. + */ + inline void setSize( unsigned int aSize ) + { + m_size = aSize; + } +}; +} // namespace KIGFX + +#endif /* VERTEX_ITEM_H_ */ diff --git a/include/gal/opengl/vertex_manager.h b/include/gal/opengl/vertex_manager.h new file mode 100644 index 0000000..56c84a6 --- /dev/null +++ b/include/gal/opengl/vertex_manager.h @@ -0,0 +1,347 @@ +/* + * This program source code file is part of KiCad, a free EDA CAD application. + * + * Copyright (C) 2013 CERN + * @author Maciej Suminski <maciej.suminski@cern.ch> + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +/** + * @file vertex_manager.h + * @brief Class to control vertex container and GPU with possibility of emulating old-style OpenGL + * 1.0 state machine using modern OpenGL methods. + */ + +#ifndef VERTEX_MANAGER_H_ +#define VERTEX_MANAGER_H_ + +#define GLM_FORCE_RADIANS +#include <gal/opengl/glm/gtc/matrix_transform.hpp> +#include <gal/opengl/glm/glm.hpp> +#include <gal/opengl/vertex_common.h> +#include <gal/color4d.h> +#include <stack> +#include <boost/smart_ptr/shared_ptr.hpp> +#include <wx/log.h> + +namespace KIGFX +{ +class SHADER; +class VERTEX_ITEM; +class VERTEX_CONTAINER; +class GPU_MANAGER; + +class VERTEX_MANAGER +{ +public: + /** + * @brief Constructor. + * + * @param aCached says if vertices should be cached in GPU or system memory. For data that + * does not change every frame, it is better to store vertices in GPU memory. + */ + VERTEX_MANAGER( bool aCached ); + + /** + * Function Vertex() + * adds a vertex with the given coordinates to the currently set item. Color & shader + * parameters stored in aVertex are ignored, instead color & shader set by Color() and + * Shader() functions are used. Vertex coordinates will have the current transformation + * matrix applied. + * + * @param aVertex contains vertex coordinates. + */ + inline void Vertex( const VERTEX& aVertex ) const + { + Vertex( aVertex.x, aVertex.y, aVertex.z ); + } + + /** + * Function Vertex() + * adds a vertex with the given coordinates to the currently set item. Vertex coordinates will + * have the current transformation matrix applied. + * + * @param aX is the X coordinate of the new vertex. + * @param aY is the Y coordinate of the new vertex. + * @param aZ is the Z coordinate of the new vertex. + */ + void Vertex( GLfloat aX, GLfloat aY, GLfloat aZ ) const; + + /** + * Function Vertices() + * adds one or more vertices to the currently set item. It takes advantage of allocating memory + * in advance, so should be faster than adding vertices one by one. Color & shader + * parameters stored in aVertices are ignored, instead color & shader set by Color() and + * Shader() functions are used. All the vertex coordinates will have the current + * transformation matrix applied. + * + * @param aVertices contains vertices to be added + * @param aSize is the number of vertices to be added. + */ + void Vertices( const VERTEX aVertices[], unsigned int aSize ) const; + + /** + * Function Color() + * changes currently used color that will be applied to newly added vertices. + * + * @param aColor is the new color. + */ + inline void Color( const COLOR4D& aColor ) + { + m_color[0] = aColor.r * 255.0; + m_color[1] = aColor.g * 255.0; + m_color[2] = aColor.b * 255.0; + m_color[3] = aColor.a * 255.0; + } + + /** + * Function Color() + * changes currently used color that will be applied to newly added vertices. It is the + * equivalent of glColor4f() function. + * @param aRed is the red component of the new color. + * @param aGreen is the green component of the new color. + * @param aBlue is the blue component of the new color. + * @param aAlpha is the alpha component of the new color. + */ + inline void Color( GLfloat aRed, GLfloat aGreen, GLfloat aBlue, GLfloat aAlpha ) + { + m_color[0] = aRed * 255.0; + m_color[1] = aGreen * 255.0; + m_color[2] = aBlue * 255.0; + m_color[3] = aAlpha * 255.0; + } + + /** + * Function Shader() + * changes currently used shader and its parameters that will be applied to newly added + * vertices. Parameters depend on shader, for more information have a look at shaders source + * code. + * @see SHADER_TYPE + * + * @param aShaderType is the a shader type to be applied. + * @param aParam1 is the optional parameter for a shader. + * @param aParam2 is the optional parameter for a shader. + * @param aParam3 is the optional parameter for a shader. + */ + inline void Shader( GLfloat aShaderType, GLfloat aParam1 = 0.0f, + GLfloat aParam2 = 0.0f, GLfloat aParam3 = 0.0f ) + { + m_shader[0] = aShaderType; + m_shader[1] = aParam1; + m_shader[2] = aParam2; + m_shader[3] = aParam3; + } + + /** + * Function Translate() + * multiplies the current matrix by a translation matrix, so newly vertices will be + * translated by the given vector. It is the equivalent of the glTranslatef() function. + * + * @param aX is the X coordinate of a translation vector. + * @param aY is the X coordinate of a translation vector. + * @param aZ is the X coordinate of a translation vector. + */ + inline void Translate( GLfloat aX, GLfloat aY, GLfloat aZ ) + { + m_transform = glm::translate( m_transform, glm::vec3( aX, aY, aZ ) ); + } + + /** + * Function Rotate() + * multiplies the current matrix by a rotation matrix, so the newly vertices will be + * rotated by the given angles. It is the equivalent of the glRotatef() function. + * + * @param aAngle is the angle of rotation, in radians. + * @param aX is a multiplier for the X axis + * @param aY is a multiplier for the Y axis + * @param aZ is a multiplier for the Z axis. + */ + inline void Rotate( GLfloat aAngle, GLfloat aX, GLfloat aY, GLfloat aZ ) + { + m_transform = glm::rotate( m_transform, aAngle, glm::vec3( aX, aY, aZ ) ); + } + + /** + * Function Scale() + * multiplies the current matrix by a scaling matrix, so the newly vertices will be + * scaled by the given factors. It is the equivalent of the glScalef() function. + * + * @param aX is the X axis scaling factor. + * @param aY is the Y axis scaling factor. + * @param aZ is the Z axis scaling factor. + */ + inline void Scale( GLfloat aX, GLfloat aY, GLfloat aZ ) + { + m_transform = glm::scale( m_transform, glm::vec3( aX, aY, aZ ) ); + } + + /** + * Function PushMatrix() + * pushes the current transformation matrix stack. It is the equivalent of the glPushMatrix() + * function. + */ + inline void PushMatrix() + { + m_transformStack.push( m_transform ); + + // Every transformation starts with PushMatrix + m_noTransform = false; + } + + /** + * Function PopMatrix() + * pops the current transformation matrix stack. It is the equivalent of the glPopMatrix() + * function. + */ + void PopMatrix() + { + wxASSERT( !m_transformStack.empty() ); + + m_transform = m_transformStack.top(); + m_transformStack.pop(); + + if( m_transformStack.empty() ) + { + // We return back to the identity matrix, thus no vertex transformation is needed + m_noTransform = true; + } + } + + /** + * Function SetItem() + * sets an item to start its modifications. After calling the function it is possible to add + * vertices using function Add(). + * + * @param aItem is the item that is going to store vertices in the container. + */ + void SetItem( VERTEX_ITEM& aItem ) const; + + /** + * Function FinishItem() + * does the cleaning after adding an item. + */ + void FinishItem() const; + + /** + * Function FreeItem() + * frees the memory occupied by the item, so it is no longer stored in the container. + * + * @param aItem is the item to be freed + */ + void FreeItem( VERTEX_ITEM& aItem ) const; + + /** + * Function ChangeItemColor() + * changes the color of all vertices owned by an item. + * + * @param aItem is the item to change. + * @param aColor is the new color to be applied. + */ + void ChangeItemColor( const VERTEX_ITEM& aItem, const COLOR4D& aColor ) const; + + /** + * Function ChangeItemDepth() + * changes the depth of all vertices owned by an item. + * + * @param aItem is the item to change. + * @param aDepth is the new color to be applied. + */ + void ChangeItemDepth( const VERTEX_ITEM& aItem, GLfloat aDepth ) const; + + /** + * Function GetVertices() + * returns a pointer to the vertices owned by an item. + * + * @param aItem is the owner of vertices that are going to be returned. + * @return Pointer to the vertices or NULL if the item is not stored at the container. + */ + VERTEX* GetVertices( const VERTEX_ITEM& aItem ) const; + + const glm::mat4& GetTransformation() const + { + return m_transform; + } + + /** + * Function SetShader() + * sets a shader program that is going to be used during rendering. + * @param aShader is the object containing compiled and linked shader program. + */ + void SetShader( SHADER& aShader ) const; + + /** + * Function Clear() + * removes all the stored vertices from the container. + */ + void Clear() const; + + /** + * Function BeginDrawing() + * prepares buffers and items to start drawing. + */ + void BeginDrawing() const; + + /** + * Function DrawItem() + * draws an item to the buffer. + * + * @param aItem is the item to be drawn. + */ + void DrawItem( const VERTEX_ITEM& aItem ) const; + + /** + * Function EndDrawing() + * finishes drawing operations. + */ + void EndDrawing() const; + +protected: + /** + * Function putVertex() + * applies all transformation to the given coordinates and store them at the specified target. + * + * @param aTarget is the place where the new vertex is going to be stored (it has to be + * allocated first). + * @param aX is the X coordinate of the new vertex. + * @param aY is the Y coordinate of the new vertex. + * @param aZ is the Z coordinate of the new vertex. + */ + void putVertex( VERTEX& aTarget, GLfloat aX, GLfloat aY, GLfloat aZ ) const; + + /// Container for vertices, may be cached or noncached + boost::shared_ptr<VERTEX_CONTAINER> m_container; + /// GPU manager for data transfers and drawing operations + boost::shared_ptr<GPU_MANAGER> m_gpu; + + /// State machine variables + /// True in case there is no need to transform vertices + bool m_noTransform; + /// Currently used transform matrix + glm::mat4 m_transform; + /// Stack of transformation matrices, used for Push/PopMatrix + std::stack<glm::mat4> m_transformStack; + /// Currently used color + GLubyte m_color[ColorStride]; + /// Currently used shader and its parameters + GLfloat m_shader[ShaderStride]; +}; + +} // namespace KIGFX + +#endif /* VERTEX_MANAGER_H_ */ diff --git a/include/gal/stroke_font.h b/include/gal/stroke_font.h new file mode 100644 index 0000000..2cea7fd --- /dev/null +++ b/include/gal/stroke_font.h @@ -0,0 +1,226 @@ +/* + * This program source code file is part of KICAD, a free EDA CAD application. + * + * Copyright (C) 2012 Torsten Hueter, torstenhtr <at> gmx.de + * Copyright (C) 2012 Kicad Developers, see change_log.txt for contributors. + * Copyright (C) 2013 CERN + * @author Maciej Suminski <maciej.suminski@cern.ch> + * + * Stroke font class + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, you may find one here: + * http://www.gnu.org/licenses/old-licenses/gpl-2.0.html + * or you may search the http://www.gnu.org website for the version 2 license, + * or you may write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA + */ + +#ifndef STROKE_FONT_H_ +#define STROKE_FONT_H_ + +#include <deque> +#include <utf8.h> + +#include <eda_text.h> + +#include <math/box2.h> + +namespace KIGFX +{ +class GAL; + +typedef std::deque< std::deque<VECTOR2D> > GLYPH; +typedef std::vector<GLYPH> GLYPH_LIST; + +/** + * @brief Class STROKE_FONT implements stroke font drawing. + * + * A stroke font is composed of lines. + */ +class STROKE_FONT +{ +public: + /// Constructor + STROKE_FONT( GAL* aGal ); + + /** + * @brief Load the new stroke font. + * + * @param aNewStrokeFont is the pointer to the font data. + * @param aNewStrokeFontSize is the size of the font data. + * @return True, if the font was successfully loaded, else false. + */ + bool LoadNewStrokeFont( const char* const aNewStrokeFont[], int aNewStrokeFontSize ); + + /** + * @brief Draw a string. + * + * @param aText is the text to be drawn. + * @param aPosition is the text position in world coordinates. + * @param aRotationAngle is the text rotation angle. + */ + void Draw( const UTF8& aText, const VECTOR2D& aPosition, double aRotationAngle ); + + /** + * @brief Set the glyph size. + * + * @param aGlyphSize is the glyph size. + */ + inline void SetGlyphSize( const VECTOR2D aGlyphSize ) + { + m_glyphSize = aGlyphSize; + } + + /** + * @brief Set a bold property of current font. + * + * @param aBold tells if the font should be bold or not. + */ + inline void SetBold( const bool aBold ) + { + m_bold = aBold; + } + + /** + * @brief Set an italic property of current font. + * + * @param aItalic tells if the font should be italic or not. + */ + inline void SetItalic( const bool aItalic ) + { + m_italic = aItalic; + } + + /** + * @brief Set a mirrored property of text. + * + * @param aMirrored tells if the text should be mirrored or not. + */ + inline void SetMirrored( const bool aMirrored ) + { + m_mirrored = aMirrored; + } + + /** + * @brief Set the horizontal justify for text drawing. + * + * @param aHorizontalJustify is the horizontal justify value. + */ + inline void SetHorizontalJustify( const EDA_TEXT_HJUSTIFY_T aHorizontalJustify ) + { + m_horizontalJustify = aHorizontalJustify; + } + + /** + * @brief Set the vertical justify for text drawing. + * + * @param aVerticalJustify is the vertical justify value. + */ + inline void SetVerticalJustify( const EDA_TEXT_VJUSTIFY_T aVerticalJustify ) + { + m_verticalJustify = aVerticalJustify; + } + + /** + * Function SetGAL + * Changes Graphics Abstraction Layer used for drawing items for a new one. + * @param aGal is the new GAL instance. + */ + void SetGAL( GAL* aGal ) + { + m_gal = aGal; + } + +private: + GAL* m_gal; ///< Pointer to the GAL + GLYPH_LIST m_glyphs; ///< Glyph list + std::vector<BOX2D> m_glyphBoundingBoxes; ///< Bounding boxes of the glyphs + VECTOR2D m_glyphSize; ///< Size of the glyphs + EDA_TEXT_HJUSTIFY_T m_horizontalJustify; ///< Horizontal justification + EDA_TEXT_VJUSTIFY_T m_verticalJustify; ///< Vertical justification + bool m_bold, m_italic, m_mirrored, m_overbar; ///< Properties of text + + /** + * @brief Returns a single line height using current settings. + * + * @return The line height. + */ + int getInterline() const; + + /** + * @brief Compute the bounding box of a given glyph. + * + * @param aGlyph is the glyph. + * @param aGlyphBoundingX is the x-component of the bounding box size. + * @return is the complete bounding box size. + */ + BOX2D computeBoundingBox( const GLYPH& aGlyph, const VECTOR2D& aGlyphBoundingX ) const; + + /** + * @brief Draws a single line of text. Multiline texts should be split before using the + * function. + * + * @param aText is the text to be drawn. + */ + void drawSingleLineText( const UTF8& aText ); + + /** + * @brief Compute the size of a given text. + * + * @param aText is the text string. + * @return is the text size. + */ + VECTOR2D computeTextSize( const UTF8& aText ) const; + + /** + * @brief Returns number of lines for a given text. + * + * @param aText is the text to be checked. + * @return unsigned - The number of lines in aText. + */ + inline unsigned linesCount( const UTF8& aText ) const + { + if( aText.empty() ) + return 0; // std::count does not work well with empty strings + else + // aText.end() - 1 is to skip a newline character that is potentially at the end + return std::count( aText.begin(), aText.end() - 1, '\n' ) + 1; + } + +public: + // These members are declared public only to be (temporary, I am expecting) + // used in legacy canvas, to avoid multiple declarations of the same constants, + // having multiple declarations of the same constants is really a thing to avoid. + // + // They will be private later, when the legacy canvas is removed. + + ///> Factor that determines the pitch between 2 lines. + static const double INTERLINE_PITCH_RATIO; + + ///> Factor that determines relative height of overbar. + static const double OVERBAR_HEIGHT; + + ///> Factor that determines relative line width for bold text. + static const double BOLD_FACTOR; + + ///> Scale factor for a glyph + static const double STROKE_FONT_SCALE; + + ///> Tilt factor for italic style (the is is the scaling factor + ///> on dY relative coordinates to give a tilst shape + static const double ITALIC_TILT; +}; +} // namespace KIGFX + +#endif // STROKE_FONT_H_ |