是否可以包装和隐藏GLM,而不会影响性能?

时间:2017-12-03 13:58:25

标签: c++ glm-math

如此便携,我不太可能真的需要将GLM放在包装纸后面,但为了学习,我想知道我是否能够。

我最初喜欢这个快速技巧:

// MyMaths.h
#define GLM_FORCE_CXX03
#include <glm/glm.hpp>
#include <glm/gtc/matrix_transform.hpp>
#include <glm/gtc/type_ptr.hpp>

namespace mathspace
{ 
    using Matrix4 = glm::mat4; 
}

例如,这允许调用mathspace::Matrix4而不是glm::mat4。但后来我意识到这并不能将GLM隐藏在外部文件中。

因此,我考虑了将所有“GLM”放在源文件中同时保持标题不含GLM代码的标准方法。这意味着源文件中的函数可以转换所有内容。 (我考虑过pImpl但是看不到它的需要。)所以设置了几个基础(旋转和[] []操作),标题看起来像这样:

// MyMaths.h
#include "Direction3.h" // My own vec3 of some sort

namespace mathspace
{
    void Rotate(Matrix4& matrix, float angle, const Direction3& axis);

    class Matrix4
    {
    private:
        float** m_matrix;

    public:
        Matrix4();

        // All this Proxy stuff is to implement a [][] operator.
        class Proxy 
        {
        private:
            float* m_column;

        public:
            Proxy(float* column);

            float& operator[](int index)
            {
                return m_column[index];
            }
        };

        Proxy operator[](int index)
        {
            return Proxy(m_matrix[index]);
        }
    };
}

这种方法的明显变化是我必须将每个我想要的功能添加到包装器中;在这种情况下,两个重载和Rotate()函数。

但真正的问题(我认为)是表现。说到源文件,这个新的Rotate()函数必须:

  1. 将我的float **矩阵转换/复制到GLM矩阵,并将Direction3复制到vec3
  2. 使用GLM矩阵
  3. 调用glm :: rotate()
  4. 将结果转换回我的float **矩阵
  5. ..这看起来并不好。

    所以,只是重复一遍,这不是关于GLM,而是GLM创建了一个我想学习的例子,问题是:

    是否可以在没有性能损失的情况下包装和隐藏GLM?如果是这样,怎么样?

0 个答案:

没有答案