rmath3d 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
 - data/ChangeLog +73 -0
 - data/LICENSE.txt +21 -0
 - data/README.txt +154 -0
 - data/Rakefile +42 -0
 - data/ext/rmath3d/RMath3D.h +35 -0
 - data/ext/rmath3d/RMtx3.c +370 -0
 - data/ext/rmath3d/RMtx3.h +95 -0
 - data/ext/rmath3d/RMtx4.c +572 -0
 - data/ext/rmath3d/RMtx4.h +110 -0
 - data/ext/rmath3d/RQuat.c +367 -0
 - data/ext/rmath3d/RQuat.h +92 -0
 - data/ext/rmath3d/RType.h +76 -0
 - data/ext/rmath3d/RVec3.c +285 -0
 - data/ext/rmath3d/RVec3.h +89 -0
 - data/ext/rmath3d/RVec4.c +215 -0
 - data/ext/rmath3d/RVec4.h +86 -0
 - data/ext/rmath3d/extconf.rb +9 -0
 - data/ext/rmath3d/rmath3d.c +5999 -0
 - data/lib/rmath3d/rmath3d_plain.rb +3311 -0
 - data/sample/opengl-bindings/load_matrix.rb +174 -0
 - data/sample/opengl2/load_matrix.rb +118 -0
 - data/sample/simple/transform.rb +11 -0
 - data/test/test.rb +15 -0
 - data/test/test_RMtx3.rb +517 -0
 - data/test/test_RMtx4.rb +735 -0
 - data/test/test_RQuat.rb +381 -0
 - data/test/test_RVec3.rb +308 -0
 - data/test/test_RVec4.rb +287 -0
 - metadata +74 -0
 
    
        data/ext/rmath3d/RQuat.h
    ADDED
    
    | 
         @@ -0,0 +1,92 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            /* -*- C -*- */
         
     | 
| 
      
 2 
     | 
    
         
            +
            #ifndef RMATHQUAT_H_INCLUDED
         
     | 
| 
      
 3 
     | 
    
         
            +
            #define RMATHQUAT_H_INCLUDED
         
     | 
| 
      
 4 
     | 
    
         
            +
             
     | 
| 
      
 5 
     | 
    
         
            +
            #include "RType.h"
         
     | 
| 
      
 6 
     | 
    
         
            +
             
     | 
| 
      
 7 
     | 
    
         
            +
            struct RVec3;
         
     | 
| 
      
 8 
     | 
    
         
            +
            struct RMtx4;
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            typedef struct RQuat
         
     | 
| 
      
 11 
     | 
    
         
            +
            {
         
     | 
| 
      
 12 
     | 
    
         
            +
                union
         
     | 
| 
      
 13 
     | 
    
         
            +
                {
         
     | 
| 
      
 14 
     | 
    
         
            +
                    struct
         
     | 
| 
      
 15 
     | 
    
         
            +
                    {
         
     | 
| 
      
 16 
     | 
    
         
            +
                        rmReal x, y, z, w;
         
     | 
| 
      
 17 
     | 
    
         
            +
                    };
         
     | 
| 
      
 18 
     | 
    
         
            +
                    rmReal e[4];
         
     | 
| 
      
 19 
     | 
    
         
            +
                };
         
     | 
| 
      
 20 
     | 
    
         
            +
            } RQuat;
         
     | 
| 
      
 21 
     | 
    
         
            +
             
     | 
| 
      
 22 
     | 
    
         
            +
            #ifdef __cplusplus
         
     | 
| 
      
 23 
     | 
    
         
            +
            extern "C" {
         
     | 
| 
      
 24 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
            void    RQuatSetElements( RQuat* out, rmReal x, rmReal y, rmReal z, rmReal w );
         
     | 
| 
      
 27 
     | 
    
         
            +
            void    RQuatSetElement( RQuat* out, int at, rmReal f );
         
     | 
| 
      
 28 
     | 
    
         
            +
            void    RQuatSetX( RQuat* out, rmReal x );
         
     | 
| 
      
 29 
     | 
    
         
            +
            void    RQuatSetY( RQuat* out, rmReal y );
         
     | 
| 
      
 30 
     | 
    
         
            +
            void    RQuatSetZ( RQuat* out, rmReal z );
         
     | 
| 
      
 31 
     | 
    
         
            +
            void    RQuatSetW( RQuat* out, rmReal w );
         
     | 
| 
      
 32 
     | 
    
         
            +
            void    RQuatSetXYZ( RQuat* out, const struct RVec3* v );
         
     | 
| 
      
 33 
     | 
    
         
            +
             
     | 
| 
      
 34 
     | 
    
         
            +
            rmReal  RQuatGetElement( const RQuat* in, int at );
         
     | 
| 
      
 35 
     | 
    
         
            +
            rmReal  RQuatGetX( const RQuat* in );
         
     | 
| 
      
 36 
     | 
    
         
            +
            rmReal  RQuatGetY( const RQuat* in );
         
     | 
| 
      
 37 
     | 
    
         
            +
            rmReal  RQuatGetZ( const RQuat* in );
         
     | 
| 
      
 38 
     | 
    
         
            +
            rmReal  RQuatGetW( const RQuat* in );
         
     | 
| 
      
 39 
     | 
    
         
            +
            void    RQuatGetXYZ( struct RVec3* out, const RQuat* in );
         
     | 
| 
      
 40 
     | 
    
         
            +
             
     | 
| 
      
 41 
     | 
    
         
            +
            int     RQuatEqual( const RQuat* q1, const RQuat* q2 );
         
     | 
| 
      
 42 
     | 
    
         
            +
            rmReal  RQuatDot( const RQuat* q1, const RQuat* q2 );
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
            void    RQuatIdentity( RQuat* out );
         
     | 
| 
      
 45 
     | 
    
         
            +
            void    RQuatCopy( RQuat* out, const RQuat* in );
         
     | 
| 
      
 46 
     | 
    
         
            +
            void    RQuatNormalize( RQuat* out, const RQuat* in );
         
     | 
| 
      
 47 
     | 
    
         
            +
            void    RQuatConjugate( RQuat* out, const RQuat* in );
         
     | 
| 
      
 48 
     | 
    
         
            +
            void    RQuatInverse( RQuat* out, const RQuat* in );
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
            void    RQuatAdd( RQuat* out, const RQuat* q1, const RQuat* q2 );
         
     | 
| 
      
 51 
     | 
    
         
            +
            void    RQuatSub( RQuat* out, const RQuat* q1, const RQuat* q2 );
         
     | 
| 
      
 52 
     | 
    
         
            +
            void    RQuatMul( RQuat* out, const RQuat* q1, const RQuat* q2 );
         
     | 
| 
      
 53 
     | 
    
         
            +
            void    RQuatScale( RQuat* out, const RQuat* in, rmReal f );
         
     | 
| 
      
 54 
     | 
    
         
            +
             
     | 
| 
      
 55 
     | 
    
         
            +
            rmReal  RQuatLength( const RQuat* in );
         
     | 
| 
      
 56 
     | 
    
         
            +
            rmReal  RQuatLengthSq( const RQuat* in );
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
            void    RQuatSlerp( RQuat* out, const RQuat* q1, const RQuat* q2, rmReal t );
         
     | 
| 
      
 59 
     | 
    
         
            +
             
     | 
| 
      
 60 
     | 
    
         
            +
            void    RQuatRotationMatrix( RQuat* out, const struct RMtx4* mtx );
         
     | 
| 
      
 61 
     | 
    
         
            +
            void    RQuatRotationAxis( RQuat* out, const struct RVec3* axis, rmReal radian );
         
     | 
| 
      
 62 
     | 
    
         
            +
            void    RQuatToAxisAngle( const RQuat* in, struct RVec3* axis, rmReal* radian );
         
     | 
| 
      
 63 
     | 
    
         
            +
             
     | 
| 
      
 64 
     | 
    
         
            +
            #ifdef __cplusplus
         
     | 
| 
      
 65 
     | 
    
         
            +
            }
         
     | 
| 
      
 66 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 67 
     | 
    
         
            +
             
     | 
| 
      
 68 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 69 
     | 
    
         
            +
             
     | 
| 
      
 70 
     | 
    
         
            +
            /*
         
     | 
| 
      
 71 
     | 
    
         
            +
            RMath : Ruby math module for 3D Applications
         
     | 
| 
      
 72 
     | 
    
         
            +
            Copyright (c) 2008- vaiorabbit  <http://twitter.com/vaiorabbit>
         
     | 
| 
      
 73 
     | 
    
         
            +
             
     | 
| 
      
 74 
     | 
    
         
            +
            This software is provided 'as-is', without any express or implied
         
     | 
| 
      
 75 
     | 
    
         
            +
            warranty. In no event will the authors be held liable for any damages
         
     | 
| 
      
 76 
     | 
    
         
            +
            arising from the use of this software.
         
     | 
| 
      
 77 
     | 
    
         
            +
             
     | 
| 
      
 78 
     | 
    
         
            +
            Permission is granted to anyone to use this software for any purpose,
         
     | 
| 
      
 79 
     | 
    
         
            +
            including commercial applications, and to alter it and redistribute it
         
     | 
| 
      
 80 
     | 
    
         
            +
            freely, subject to the following restrictions:
         
     | 
| 
      
 81 
     | 
    
         
            +
             
     | 
| 
      
 82 
     | 
    
         
            +
                1. The origin of this software must not be misrepresented; you must not
         
     | 
| 
      
 83 
     | 
    
         
            +
                claim that you wrote the original software. If you use this software
         
     | 
| 
      
 84 
     | 
    
         
            +
                in a product, an acknowledgment in the product documentation would be
         
     | 
| 
      
 85 
     | 
    
         
            +
                appreciated but is not required.
         
     | 
| 
      
 86 
     | 
    
         
            +
             
     | 
| 
      
 87 
     | 
    
         
            +
                2. Altered source versions must be plainly marked as such, and must not be
         
     | 
| 
      
 88 
     | 
    
         
            +
                misrepresented as being the original software.
         
     | 
| 
      
 89 
     | 
    
         
            +
             
     | 
| 
      
 90 
     | 
    
         
            +
                3. This notice may not be removed or altered from any source
         
     | 
| 
      
 91 
     | 
    
         
            +
                distribution.
         
     | 
| 
      
 92 
     | 
    
         
            +
             */
         
     | 
    
        data/ext/rmath3d/RType.h
    ADDED
    
    | 
         @@ -0,0 +1,76 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #ifndef RTYPE_H_INCLUDED
         
     | 
| 
      
 2 
     | 
    
         
            +
            #define RTYPE_H_INCLUDED
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            /*
         
     | 
| 
      
 5 
     | 
    
         
            +
             * Build Configuration
         
     | 
| 
      
 6 
     | 
    
         
            +
             *
         
     | 
| 
      
 7 
     | 
    
         
            +
             * * RMATH_SINGLE_PRECISION : float (32-bit single scalar)
         
     | 
| 
      
 8 
     | 
    
         
            +
             */
         
     | 
| 
      
 9 
     | 
    
         
            +
            /*
         
     | 
| 
      
 10 
     | 
    
         
            +
            #define RMATH_SINGLE_PRECISION
         
     | 
| 
      
 11 
     | 
    
         
            +
            */
         
     | 
| 
      
 12 
     | 
    
         
            +
             
     | 
| 
      
 13 
     | 
    
         
            +
             
     | 
| 
      
 14 
     | 
    
         
            +
            #if defined(RMATH_SINGLE_PRECISION)
         
     | 
| 
      
 15 
     | 
    
         
            +
            typedef float  rmReal;
         
     | 
| 
      
 16 
     | 
    
         
            +
            #else
         
     | 
| 
      
 17 
     | 
    
         
            +
            typedef double rmReal;
         
     | 
| 
      
 18 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 19 
     | 
    
         
            +
             
     | 
| 
      
 20 
     | 
    
         
            +
            #if defined(RMATH_SINGLE_PRECISION)
         
     | 
| 
      
 21 
     | 
    
         
            +
            # define RMATH_TOLERANCE (1e-6)
         
     | 
| 
      
 22 
     | 
    
         
            +
            #else
         
     | 
| 
      
 23 
     | 
    
         
            +
            # define RMATH_TOLERANCE (1e-15)
         
     | 
| 
      
 24 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 25 
     | 
    
         
            +
             
     | 
| 
      
 26 
     | 
    
         
            +
            #if defined(RMATH_SINGLE_PRECISION)
         
     | 
| 
      
 27 
     | 
    
         
            +
             
     | 
| 
      
 28 
     | 
    
         
            +
            #define rmAcos  acosf
         
     | 
| 
      
 29 
     | 
    
         
            +
            #define rmAsin  asinf
         
     | 
| 
      
 30 
     | 
    
         
            +
            #define rmAtan  atanf
         
     | 
| 
      
 31 
     | 
    
         
            +
            #define rmAtan2 atan2f
         
     | 
| 
      
 32 
     | 
    
         
            +
            #define rmCos   cosf
         
     | 
| 
      
 33 
     | 
    
         
            +
            #define rmSin   sinf
         
     | 
| 
      
 34 
     | 
    
         
            +
            #define rmTan   tanf
         
     | 
| 
      
 35 
     | 
    
         
            +
            #define rmSqrt  sqrtf
         
     | 
| 
      
 36 
     | 
    
         
            +
            #define rmFabs  fabsf
         
     | 
| 
      
 37 
     | 
    
         
            +
             
     | 
| 
      
 38 
     | 
    
         
            +
            #else
         
     | 
| 
      
 39 
     | 
    
         
            +
             
     | 
| 
      
 40 
     | 
    
         
            +
            #define rmAcos  acos
         
     | 
| 
      
 41 
     | 
    
         
            +
            #define rmAsin  asin
         
     | 
| 
      
 42 
     | 
    
         
            +
            #define rmAtan  atan
         
     | 
| 
      
 43 
     | 
    
         
            +
            #define rmAtan2 atan2
         
     | 
| 
      
 44 
     | 
    
         
            +
            #define rmCos   cos
         
     | 
| 
      
 45 
     | 
    
         
            +
            #define rmSin   sin
         
     | 
| 
      
 46 
     | 
    
         
            +
            #define rmTan   tan
         
     | 
| 
      
 47 
     | 
    
         
            +
            #define rmSqrt  sqrt
         
     | 
| 
      
 48 
     | 
    
         
            +
            #define rmFabs  fabs
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 51 
     | 
    
         
            +
             
     | 
| 
      
 52 
     | 
    
         
            +
            #endif
         
     | 
| 
      
 53 
     | 
    
         
            +
             
     | 
| 
      
 54 
     | 
    
         
            +
            /*
         
     | 
| 
      
 55 
     | 
    
         
            +
            RMath : Ruby math module for 3D Applications
         
     | 
| 
      
 56 
     | 
    
         
            +
            Copyright (c) 2008- vaiorabbit  <http://twitter.com/vaiorabbit>
         
     | 
| 
      
 57 
     | 
    
         
            +
             
     | 
| 
      
 58 
     | 
    
         
            +
            This software is provided 'as-is', without any express or implied
         
     | 
| 
      
 59 
     | 
    
         
            +
            warranty. In no event will the authors be held liable for any damages
         
     | 
| 
      
 60 
     | 
    
         
            +
            arising from the use of this software.
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
            Permission is granted to anyone to use this software for any purpose,
         
     | 
| 
      
 63 
     | 
    
         
            +
            including commercial applications, and to alter it and redistribute it
         
     | 
| 
      
 64 
     | 
    
         
            +
            freely, subject to the following restrictions:
         
     | 
| 
      
 65 
     | 
    
         
            +
             
     | 
| 
      
 66 
     | 
    
         
            +
                1. The origin of this software must not be misrepresented; you must not
         
     | 
| 
      
 67 
     | 
    
         
            +
                claim that you wrote the original software. If you use this software
         
     | 
| 
      
 68 
     | 
    
         
            +
                in a product, an acknowledgment in the product documentation would be
         
     | 
| 
      
 69 
     | 
    
         
            +
                appreciated but is not required.
         
     | 
| 
      
 70 
     | 
    
         
            +
             
     | 
| 
      
 71 
     | 
    
         
            +
                2. Altered source versions must be plainly marked as such, and must not be
         
     | 
| 
      
 72 
     | 
    
         
            +
                misrepresented as being the original software.
         
     | 
| 
      
 73 
     | 
    
         
            +
             
     | 
| 
      
 74 
     | 
    
         
            +
                3. This notice may not be removed or altered from any source
         
     | 
| 
      
 75 
     | 
    
         
            +
                distribution.
         
     | 
| 
      
 76 
     | 
    
         
            +
             */
         
     | 
    
        data/ext/rmath3d/RVec3.c
    ADDED
    
    | 
         @@ -0,0 +1,285 @@ 
     | 
|
| 
      
 1 
     | 
    
         
            +
            #include <math.h>
         
     | 
| 
      
 2 
     | 
    
         
            +
            #include <string.h>
         
     | 
| 
      
 3 
     | 
    
         
            +
             
     | 
| 
      
 4 
     | 
    
         
            +
            #include "RVec3.h"
         
     | 
| 
      
 5 
     | 
    
         
            +
            #include "RVec4.h"
         
     | 
| 
      
 6 
     | 
    
         
            +
            #include "RQuat.h"
         
     | 
| 
      
 7 
     | 
    
         
            +
            #include "RMtx3.h"
         
     | 
| 
      
 8 
     | 
    
         
            +
            #include "RMtx4.h"
         
     | 
| 
      
 9 
     | 
    
         
            +
             
     | 
| 
      
 10 
     | 
    
         
            +
            #define SET_ELEMENT( out, at, f )
         
     | 
| 
      
 11 
     | 
    
         
            +
             
     | 
| 
      
 12 
     | 
    
         
            +
            void
         
     | 
| 
      
 13 
     | 
    
         
            +
            RVec3SetElement( RVec3* out, int at, rmReal f )
         
     | 
| 
      
 14 
     | 
    
         
            +
            {
         
     | 
| 
      
 15 
     | 
    
         
            +
                out->e[at] = f;
         
     | 
| 
      
 16 
     | 
    
         
            +
            }
         
     | 
| 
      
 17 
     | 
    
         
            +
             
     | 
| 
      
 18 
     | 
    
         
            +
            void
         
     | 
| 
      
 19 
     | 
    
         
            +
            RVec3SetX( RVec3* out, rmReal x )
         
     | 
| 
      
 20 
     | 
    
         
            +
            {
         
     | 
| 
      
 21 
     | 
    
         
            +
                out->x = x;
         
     | 
| 
      
 22 
     | 
    
         
            +
            }
         
     | 
| 
      
 23 
     | 
    
         
            +
             
     | 
| 
      
 24 
     | 
    
         
            +
            void
         
     | 
| 
      
 25 
     | 
    
         
            +
            RVec3SetY( RVec3* out, rmReal y )
         
     | 
| 
      
 26 
     | 
    
         
            +
            {
         
     | 
| 
      
 27 
     | 
    
         
            +
                out->y = y;
         
     | 
| 
      
 28 
     | 
    
         
            +
            }
         
     | 
| 
      
 29 
     | 
    
         
            +
             
     | 
| 
      
 30 
     | 
    
         
            +
            void
         
     | 
| 
      
 31 
     | 
    
         
            +
            RVec3SetZ( RVec3* out, rmReal z )
         
     | 
| 
      
 32 
     | 
    
         
            +
            {
         
     | 
| 
      
 33 
     | 
    
         
            +
                out->z = z;
         
     | 
| 
      
 34 
     | 
    
         
            +
            }
         
     | 
| 
      
 35 
     | 
    
         
            +
             
     | 
| 
      
 36 
     | 
    
         
            +
            void
         
     | 
| 
      
 37 
     | 
    
         
            +
            RVec3SetElements( RVec3* out, rmReal x, rmReal y, rmReal z )
         
     | 
| 
      
 38 
     | 
    
         
            +
            {
         
     | 
| 
      
 39 
     | 
    
         
            +
                RVec3SetX( out, x );
         
     | 
| 
      
 40 
     | 
    
         
            +
                RVec3SetY( out, y );
         
     | 
| 
      
 41 
     | 
    
         
            +
                RVec3SetZ( out, z );
         
     | 
| 
      
 42 
     | 
    
         
            +
            }
         
     | 
| 
      
 43 
     | 
    
         
            +
             
     | 
| 
      
 44 
     | 
    
         
            +
            rmReal
         
     | 
| 
      
 45 
     | 
    
         
            +
            RVec3GetElement( const RVec3* in, int at )
         
     | 
| 
      
 46 
     | 
    
         
            +
            {
         
     | 
| 
      
 47 
     | 
    
         
            +
                return in->e[at];
         
     | 
| 
      
 48 
     | 
    
         
            +
            }
         
     | 
| 
      
 49 
     | 
    
         
            +
             
     | 
| 
      
 50 
     | 
    
         
            +
            rmReal
         
     | 
| 
      
 51 
     | 
    
         
            +
            RVec3GetX( const RVec3* in )
         
     | 
| 
      
 52 
     | 
    
         
            +
            {
         
     | 
| 
      
 53 
     | 
    
         
            +
                return in->x;
         
     | 
| 
      
 54 
     | 
    
         
            +
            }
         
     | 
| 
      
 55 
     | 
    
         
            +
             
     | 
| 
      
 56 
     | 
    
         
            +
            rmReal
         
     | 
| 
      
 57 
     | 
    
         
            +
            RVec3GetY( const RVec3* in )
         
     | 
| 
      
 58 
     | 
    
         
            +
            {
         
     | 
| 
      
 59 
     | 
    
         
            +
                return in->y;
         
     | 
| 
      
 60 
     | 
    
         
            +
            }
         
     | 
| 
      
 61 
     | 
    
         
            +
             
     | 
| 
      
 62 
     | 
    
         
            +
            rmReal
         
     | 
| 
      
 63 
     | 
    
         
            +
            RVec3GetZ( const RVec3* in )
         
     | 
| 
      
 64 
     | 
    
         
            +
            {
         
     | 
| 
      
 65 
     | 
    
         
            +
                return in->z;
         
     | 
| 
      
 66 
     | 
    
         
            +
            }
         
     | 
| 
      
 67 
     | 
    
         
            +
             
     | 
| 
      
 68 
     | 
    
         
            +
            int
         
     | 
| 
      
 69 
     | 
    
         
            +
            RVec3Equal( const RVec3* v1, const RVec3* v2 )
         
     | 
| 
      
 70 
     | 
    
         
            +
            {
         
     | 
| 
      
 71 
     | 
    
         
            +
                if ( 0 == memcmp( v1, v2, sizeof(RVec3) ) )
         
     | 
| 
      
 72 
     | 
    
         
            +
                    return !0;
         
     | 
| 
      
 73 
     | 
    
         
            +
                else
         
     | 
| 
      
 74 
     | 
    
         
            +
                    return 0;
         
     | 
| 
      
 75 
     | 
    
         
            +
            }
         
     | 
| 
      
 76 
     | 
    
         
            +
             
     | 
| 
      
 77 
     | 
    
         
            +
            void
         
     | 
| 
      
 78 
     | 
    
         
            +
            RVec3Add( RVec3* out, const RVec3* v1, const RVec3* v2 )
         
     | 
| 
      
 79 
     | 
    
         
            +
            {
         
     | 
| 
      
 80 
     | 
    
         
            +
                out->x = v1->x + v2->x;
         
     | 
| 
      
 81 
     | 
    
         
            +
                out->y = v1->y + v2->y;
         
     | 
| 
      
 82 
     | 
    
         
            +
                out->z = v1->z + v2->z;
         
     | 
| 
      
 83 
     | 
    
         
            +
            }
         
     | 
| 
      
 84 
     | 
    
         
            +
             
     | 
| 
      
 85 
     | 
    
         
            +
            void
         
     | 
| 
      
 86 
     | 
    
         
            +
            RVec3Sub( RVec3* out, const RVec3* v1, const RVec3* v2 )
         
     | 
| 
      
 87 
     | 
    
         
            +
            {
         
     | 
| 
      
 88 
     | 
    
         
            +
                out->x = v1->x - v2->x;
         
     | 
| 
      
 89 
     | 
    
         
            +
                out->y = v1->y - v2->y;
         
     | 
| 
      
 90 
     | 
    
         
            +
                out->z = v1->z - v2->z;
         
     | 
| 
      
 91 
     | 
    
         
            +
            }
         
     | 
| 
      
 92 
     | 
    
         
            +
             
     | 
| 
      
 93 
     | 
    
         
            +
            void
         
     | 
| 
      
 94 
     | 
    
         
            +
            RVec3Scale( RVec3* out, const RVec3* in, rmReal f )
         
     | 
| 
      
 95 
     | 
    
         
            +
            {
         
     | 
| 
      
 96 
     | 
    
         
            +
                out->x = in->x * f;
         
     | 
| 
      
 97 
     | 
    
         
            +
                out->y = in->y * f;
         
     | 
| 
      
 98 
     | 
    
         
            +
                out->z = in->z * f;
         
     | 
| 
      
 99 
     | 
    
         
            +
            }
         
     | 
| 
      
 100 
     | 
    
         
            +
             
     | 
| 
      
 101 
     | 
    
         
            +
            void
         
     | 
| 
      
 102 
     | 
    
         
            +
            RVec3Cross( RVec3* out, const RVec3* v1, const RVec3* v2 )
         
     | 
| 
      
 103 
     | 
    
         
            +
            {
         
     | 
| 
      
 104 
     | 
    
         
            +
                RVec3 tmp;
         
     | 
| 
      
 105 
     | 
    
         
            +
                rmReal v1x, v1y, v1z, v2x, v2y, v2z;
         
     | 
| 
      
 106 
     | 
    
         
            +
             
     | 
| 
      
 107 
     | 
    
         
            +
                v1x = v1->x;
         
     | 
| 
      
 108 
     | 
    
         
            +
                v1y = v1->y;
         
     | 
| 
      
 109 
     | 
    
         
            +
                v1z = v1->z;
         
     | 
| 
      
 110 
     | 
    
         
            +
                v2x = v2->x;
         
     | 
| 
      
 111 
     | 
    
         
            +
                v2y = v2->y;
         
     | 
| 
      
 112 
     | 
    
         
            +
                v2z = v2->z;
         
     | 
| 
      
 113 
     | 
    
         
            +
             
     | 
| 
      
 114 
     | 
    
         
            +
                tmp.x = v1y*v2z - v1z*v2y;
         
     | 
| 
      
 115 
     | 
    
         
            +
                tmp.y = v1z*v2x - v1x*v2z;
         
     | 
| 
      
 116 
     | 
    
         
            +
                tmp.z = v1x*v2y - v1y*v2x;
         
     | 
| 
      
 117 
     | 
    
         
            +
             
     | 
| 
      
 118 
     | 
    
         
            +
                RVec3Copy( out, &tmp );
         
     | 
| 
      
 119 
     | 
    
         
            +
            }
         
     | 
| 
      
 120 
     | 
    
         
            +
             
     | 
| 
      
 121 
     | 
    
         
            +
            rmReal
         
     | 
| 
      
 122 
     | 
    
         
            +
            RVec3LengthSq( const RVec3* in )
         
     | 
| 
      
 123 
     | 
    
         
            +
            {
         
     | 
| 
      
 124 
     | 
    
         
            +
                return in->x*in->x + in->y*in->y + in->z*in->z;
         
     | 
| 
      
 125 
     | 
    
         
            +
            }
         
     | 
| 
      
 126 
     | 
    
         
            +
             
     | 
| 
      
 127 
     | 
    
         
            +
            rmReal
         
     | 
| 
      
 128 
     | 
    
         
            +
            RVec3Length( const RVec3* in )
         
     | 
| 
      
 129 
     | 
    
         
            +
            {
         
     | 
| 
      
 130 
     | 
    
         
            +
                return rmSqrt( in->x*in->x + in->y*in->y + in->z*in->z );
         
     | 
| 
      
 131 
     | 
    
         
            +
            }
         
     | 
| 
      
 132 
     | 
    
         
            +
             
     | 
| 
      
 133 
     | 
    
         
            +
            rmReal
         
     | 
| 
      
 134 
     | 
    
         
            +
            RVec3Dot( const RVec3* v1, const RVec3* v2 )
         
     | 
| 
      
 135 
     | 
    
         
            +
            {
         
     | 
| 
      
 136 
     | 
    
         
            +
                return v1->x*v2->x + v1->y*v2->y + v1->z*v2->z;
         
     | 
| 
      
 137 
     | 
    
         
            +
            }
         
     | 
| 
      
 138 
     | 
    
         
            +
             
     | 
| 
      
 139 
     | 
    
         
            +
            void
         
     | 
| 
      
 140 
     | 
    
         
            +
            RVec3Copy( RVec3* out, const RVec3* in )
         
     | 
| 
      
 141 
     | 
    
         
            +
            {
         
     | 
| 
      
 142 
     | 
    
         
            +
                out->x = in->x;
         
     | 
| 
      
 143 
     | 
    
         
            +
                out->y = in->y;
         
     | 
| 
      
 144 
     | 
    
         
            +
                out->z = in->z;
         
     | 
| 
      
 145 
     | 
    
         
            +
            }
         
     | 
| 
      
 146 
     | 
    
         
            +
             
     | 
| 
      
 147 
     | 
    
         
            +
            void
         
     | 
| 
      
 148 
     | 
    
         
            +
            RVec3Normalize( RVec3* out, const RVec3* in )
         
     | 
| 
      
 149 
     | 
    
         
            +
            {
         
     | 
| 
      
 150 
     | 
    
         
            +
                rmReal length = RVec3Length( in );
         
     | 
| 
      
 151 
     | 
    
         
            +
                RVec3Scale( out, in, 1.0f/length );
         
     | 
| 
      
 152 
     | 
    
         
            +
            }
         
     | 
| 
      
 153 
     | 
    
         
            +
             
     | 
| 
      
 154 
     | 
    
         
            +
            void
         
     | 
| 
      
 155 
     | 
    
         
            +
            RVec3Transform( RVec4* out, const RMtx4* m, const RVec3* in )
         
     | 
| 
      
 156 
     | 
    
         
            +
            {
         
     | 
| 
      
 157 
     | 
    
         
            +
                RVec4 result, in_vec4;
         
     | 
| 
      
 158 
     | 
    
         
            +
                int row;
         
     | 
| 
      
 159 
     | 
    
         
            +
             
     | 
| 
      
 160 
     | 
    
         
            +
                RVec4SetXYZ( &in_vec4, in );
         
     | 
| 
      
 161 
     | 
    
         
            +
                RVec4SetW( &in_vec4, 1.0f );
         
     | 
| 
      
 162 
     | 
    
         
            +
                for ( row = 0; row < 4; ++row )
         
     | 
| 
      
 163 
     | 
    
         
            +
                {
         
     | 
| 
      
 164 
     | 
    
         
            +
                    RVec4 row_vector;
         
     | 
| 
      
 165 
     | 
    
         
            +
                    RMtx4GetRow( &row_vector, m, row );
         
     | 
| 
      
 166 
     | 
    
         
            +
                    RVec4SetElement( &result, row, RVec4Dot( &row_vector, &in_vec4 ) );
         
     | 
| 
      
 167 
     | 
    
         
            +
                }
         
     | 
| 
      
 168 
     | 
    
         
            +
                RVec4Copy( out, &result );
         
     | 
| 
      
 169 
     | 
    
         
            +
            }
         
     | 
| 
      
 170 
     | 
    
         
            +
             
     | 
| 
      
 171 
     | 
    
         
            +
            void
         
     | 
| 
      
 172 
     | 
    
         
            +
            RVec3TransformCoord( RVec3* out, const RMtx4* m, const RVec3* in )
         
     | 
| 
      
 173 
     | 
    
         
            +
            {
         
     | 
| 
      
 174 
     | 
    
         
            +
                RVec4 tmp;
         
     | 
| 
      
 175 
     | 
    
         
            +
                rmReal w;
         
     | 
| 
      
 176 
     | 
    
         
            +
             
     | 
| 
      
 177 
     | 
    
         
            +
                RVec3Transform( &tmp, m, in );
         
     | 
| 
      
 178 
     | 
    
         
            +
                w = RVec4GetW( &tmp );
         
     | 
| 
      
 179 
     | 
    
         
            +
                w = 1.0f / w;
         
     | 
| 
      
 180 
     | 
    
         
            +
             
     | 
| 
      
 181 
     | 
    
         
            +
                out->x = w * RVec4GetX( &tmp );
         
     | 
| 
      
 182 
     | 
    
         
            +
                out->y = w * RVec4GetY( &tmp );
         
     | 
| 
      
 183 
     | 
    
         
            +
                out->z = w * RVec4GetZ( &tmp );
         
     | 
| 
      
 184 
     | 
    
         
            +
            }
         
     | 
| 
      
 185 
     | 
    
         
            +
             
     | 
| 
      
 186 
     | 
    
         
            +
            void
         
     | 
| 
      
 187 
     | 
    
         
            +
            RVec3TransformNormal( RVec3* out, const RMtx4* m, const RVec3* in )
         
     | 
| 
      
 188 
     | 
    
         
            +
            {
         
     | 
| 
      
 189 
     | 
    
         
            +
                RVec4 result, in_vec4;
         
     | 
| 
      
 190 
     | 
    
         
            +
                int row;
         
     | 
| 
      
 191 
     | 
    
         
            +
             
     | 
| 
      
 192 
     | 
    
         
            +
                RVec4SetXYZ( &in_vec4, in );
         
     | 
| 
      
 193 
     | 
    
         
            +
                RVec4SetW( &in_vec4, 0.0f );
         
     | 
| 
      
 194 
     | 
    
         
            +
                for ( row = 0; row < 4; ++row )
         
     | 
| 
      
 195 
     | 
    
         
            +
                {
         
     | 
| 
      
 196 
     | 
    
         
            +
                    RVec4 row_vector;
         
     | 
| 
      
 197 
     | 
    
         
            +
                    RMtx4GetRow( &row_vector, m, row );
         
     | 
| 
      
 198 
     | 
    
         
            +
                    RVec4SetElement( &result, row, RVec4Dot( &row_vector, &in_vec4 ) );
         
     | 
| 
      
 199 
     | 
    
         
            +
                }
         
     | 
| 
      
 200 
     | 
    
         
            +
             
     | 
| 
      
 201 
     | 
    
         
            +
                out->x = RVec4GetX( &result );
         
     | 
| 
      
 202 
     | 
    
         
            +
                out->y = RVec4GetY( &result );
         
     | 
| 
      
 203 
     | 
    
         
            +
                out->z = RVec4GetZ( &result );
         
     | 
| 
      
 204 
     | 
    
         
            +
            }
         
     | 
| 
      
 205 
     | 
    
         
            +
             
     | 
| 
      
 206 
     | 
    
         
            +
            void
         
     | 
| 
      
 207 
     | 
    
         
            +
            RVec3TransformRS( RVec3* out, const RMtx3* m, const RVec3* in )
         
     | 
| 
      
 208 
     | 
    
         
            +
            {
         
     | 
| 
      
 209 
     | 
    
         
            +
                RVec3 result;
         
     | 
| 
      
 210 
     | 
    
         
            +
                int row;
         
     | 
| 
      
 211 
     | 
    
         
            +
             
     | 
| 
      
 212 
     | 
    
         
            +
                for ( row = 0; row < 3; ++row )
         
     | 
| 
      
 213 
     | 
    
         
            +
                {
         
     | 
| 
      
 214 
     | 
    
         
            +
                    RVec3 row_vector;
         
     | 
| 
      
 215 
     | 
    
         
            +
                    RMtx3GetRow( &row_vector, m, row );
         
     | 
| 
      
 216 
     | 
    
         
            +
                    RVec3SetElement( &result, row, RVec3Dot( &row_vector, in ) );
         
     | 
| 
      
 217 
     | 
    
         
            +
                }
         
     | 
| 
      
 218 
     | 
    
         
            +
             
     | 
| 
      
 219 
     | 
    
         
            +
                out->x = RVec3GetX( &result );
         
     | 
| 
      
 220 
     | 
    
         
            +
                out->y = RVec3GetY( &result );
         
     | 
| 
      
 221 
     | 
    
         
            +
                out->z = RVec3GetZ( &result );
         
     | 
| 
      
 222 
     | 
    
         
            +
            }
         
     | 
| 
      
 223 
     | 
    
         
            +
             
     | 
| 
      
 224 
     | 
    
         
            +
            void
         
     | 
| 
      
 225 
     | 
    
         
            +
            RVec3TransformRSTransposed( RVec3* out, const struct RMtx3* m, const RVec3* in )
         
     | 
| 
      
 226 
     | 
    
         
            +
            {
         
     | 
| 
      
 227 
     | 
    
         
            +
                RVec3 result;
         
     | 
| 
      
 228 
     | 
    
         
            +
                int column;
         
     | 
| 
      
 229 
     | 
    
         
            +
             
     | 
| 
      
 230 
     | 
    
         
            +
                for ( column = 0; column < 3; ++column )
         
     | 
| 
      
 231 
     | 
    
         
            +
                {
         
     | 
| 
      
 232 
     | 
    
         
            +
                    RVec3 column_vector;
         
     | 
| 
      
 233 
     | 
    
         
            +
                    RMtx3GetColumn( &column_vector, m, column );
         
     | 
| 
      
 234 
     | 
    
         
            +
                    RVec3SetElement( &result, column, RVec3Dot( &column_vector, in ) );
         
     | 
| 
      
 235 
     | 
    
         
            +
                }
         
     | 
| 
      
 236 
     | 
    
         
            +
             
     | 
| 
      
 237 
     | 
    
         
            +
                out->x = RVec3GetX( &result );
         
     | 
| 
      
 238 
     | 
    
         
            +
                out->y = RVec3GetY( &result );
         
     | 
| 
      
 239 
     | 
    
         
            +
                out->z = RVec3GetZ( &result );
         
     | 
| 
      
 240 
     | 
    
         
            +
            }
         
     | 
| 
      
 241 
     | 
    
         
            +
             
     | 
| 
      
 242 
     | 
    
         
            +
            void
         
     | 
| 
      
 243 
     | 
    
         
            +
            RVec3TransformByQuaternion( RVec3* out, const struct RQuat* q, const RVec3* in )
         
     | 
| 
      
 244 
     | 
    
         
            +
            {
         
     | 
| 
      
 245 
     | 
    
         
            +
                rmReal qcx = -q->x;
         
     | 
| 
      
 246 
     | 
    
         
            +
                rmReal qcy = -q->y;
         
     | 
| 
      
 247 
     | 
    
         
            +
                rmReal qcz = -q->z;
         
     | 
| 
      
 248 
     | 
    
         
            +
                rmReal qcw =  q->w;
         
     | 
| 
      
 249 
     | 
    
         
            +
                rmReal v_x = in->x;
         
     | 
| 
      
 250 
     | 
    
         
            +
                rmReal v_y = in->y;
         
     | 
| 
      
 251 
     | 
    
         
            +
                rmReal v_z = in->z;
         
     | 
| 
      
 252 
     | 
    
         
            +
             
     | 
| 
      
 253 
     | 
    
         
            +
                rmReal t_x = q->w*v_x            + q->y*v_z - q->z*v_y;
         
     | 
| 
      
 254 
     | 
    
         
            +
                rmReal t_y = q->w*v_y - q->x*v_z            + q->z*v_x;
         
     | 
| 
      
 255 
     | 
    
         
            +
                rmReal t_z = q->w*v_z + q->x*v_y - q->y*v_x           ;
         
     | 
| 
      
 256 
     | 
    
         
            +
                rmReal t_w =          - q->x*v_x - q->y*v_y - q->z*v_z;
         
     | 
| 
      
 257 
     | 
    
         
            +
             
     | 
| 
      
 258 
     | 
    
         
            +
                out->x = t_w*qcx + t_x*qcw + t_y*qcz - t_z*qcy;
         
     | 
| 
      
 259 
     | 
    
         
            +
                out->y = t_w*qcy - t_x*qcz + t_y*qcw + t_z*qcx;
         
     | 
| 
      
 260 
     | 
    
         
            +
                out->z = t_w*qcz + t_x*qcy - t_y*qcx + t_z*qcw;
         
     | 
| 
      
 261 
     | 
    
         
            +
            }
         
     | 
| 
      
 262 
     | 
    
         
            +
             
     | 
| 
      
 263 
     | 
    
         
            +
            /*
         
     | 
| 
      
 264 
     | 
    
         
            +
            RMath : Ruby math module for 3D Applications
         
     | 
| 
      
 265 
     | 
    
         
            +
            Copyright (c) 2008- vaiorabbit  <http://twitter.com/vaiorabbit>.
         
     | 
| 
      
 266 
     | 
    
         
            +
             
     | 
| 
      
 267 
     | 
    
         
            +
            This software is provided 'as-is', without any express or implied
         
     | 
| 
      
 268 
     | 
    
         
            +
            warranty. In no event will the authors be held liable for any damages
         
     | 
| 
      
 269 
     | 
    
         
            +
            arising from the use of this software.
         
     | 
| 
      
 270 
     | 
    
         
            +
             
     | 
| 
      
 271 
     | 
    
         
            +
            Permission is granted to anyone to use this software for any purpose,
         
     | 
| 
      
 272 
     | 
    
         
            +
            including commercial applications, and to alter it and redistribute it
         
     | 
| 
      
 273 
     | 
    
         
            +
            freely, subject to the following restrictions:
         
     | 
| 
      
 274 
     | 
    
         
            +
             
     | 
| 
      
 275 
     | 
    
         
            +
                1. The origin of this software must not be misrepresented; you must not
         
     | 
| 
      
 276 
     | 
    
         
            +
                claim that you wrote the original software. If you use this software
         
     | 
| 
      
 277 
     | 
    
         
            +
                in a product, an acknowledgment in the product documentation would be
         
     | 
| 
      
 278 
     | 
    
         
            +
                appreciated but is not required.
         
     | 
| 
      
 279 
     | 
    
         
            +
             
     | 
| 
      
 280 
     | 
    
         
            +
                2. Altered source versions must be plainly marked as such, and must not be
         
     | 
| 
      
 281 
     | 
    
         
            +
                misrepresented as being the original software.
         
     | 
| 
      
 282 
     | 
    
         
            +
             
     | 
| 
      
 283 
     | 
    
         
            +
                3. This notice may not be removed or altered from any source
         
     | 
| 
      
 284 
     | 
    
         
            +
                distribution.
         
     | 
| 
      
 285 
     | 
    
         
            +
             */
         
     |