Style frage. bzw. wie ohne Macro?



  • Könnte man das hier irgendwie genau so kurz und übersichtlich ohne ein Macro hinbekommen? Mir ist leider nichts eingefallen.

    #define setUniformVectorMacro(TYPE, TYPE_BASE, GL_UNIFORM_FUNCTION)\
        void glsl::setUniform(GLint uniformLocation, const TYPE &value, int count)\
        {\
            GL_UNIFORM_FUNCTION(uniformLocation, count, reinterpret_cast<const TYPE_BASE*>(&value));\
        }
    
        setUniformVectorMacro(GLfloat,    GLfloat,  glUniform1fv)
        setUniformVectorMacro(GLdouble,   GLdouble, glUniform1dv)
        setUniformVectorMacro(GLint,      GLint,    glUniform1iv)
        setUniformVectorMacro(GLuint,     GLuint,   glUniform1uiv)
    
        setUniformVectorMacro(glm::vec2,  GLfloat,  glUniform2fv)
        setUniformVectorMacro(glm::dvec2, GLdouble, glUniform2dv)
        setUniformVectorMacro(glm::ivec2, GLint,    glUniform2iv)
        setUniformVectorMacro(glm::uvec2, GLuint,   glUniform2uiv)
    
        setUniformVectorMacro(glm::vec3,  GLfloat,  glUniform3fv)
        setUniformVectorMacro(glm::dvec3, GLdouble, glUniform3dv)
        setUniformVectorMacro(glm::ivec3, GLint,    glUniform3iv)
        setUniformVectorMacro(glm::uvec3, GLuint,   glUniform3uiv)
    
        setUniformVectorMacro(glm::vec4,  GLfloat,  glUniform4fv)
        setUniformVectorMacro(glm::dvec4, GLdouble, glUniform4dv)
        setUniformVectorMacro(glm::ivec4, GLint,    glUniform4iv)
        setUniformVectorMacro(glm::uvec4, GLuint,   glUniform4uiv)
    

  • Mod

    Bei deiner Casterei blick ich nicht ganz durch, ob das nun const oder nicht const sein soll, aber so in dieser Richtung könnte das aussehen:

    template <typename Type, typename BaseType, void (*UniformFunction) (int, int, const BaseType*) >
    void setUniform(int uniformLocation, const Type& value, int count)
    {
      UniformFunction(uniformLocation, count, reinterpret_cast<const BaseType*>(&value));
    }
    
    void test(int, int, const int*);
    
    int main()
    {
      setUniform<int,int, test>(1,2,3);
    }
    

    Ist die Instanzierung bei Bedarf ein Problem? Falls ja, kann man die Templates natürlich nochmal explizit im Voraus instanzieren.


  • Mod

    @SeppJ: dann muss allerdings bei jedem Aufruf explizit UniformFunction angegeben werden, was den Sinn des Wrappers in Frage stellt.

    Eine Lösung ohne Makro ist möglich, dürfte sich hier aber kaum lohnen (das könnte ggf. anders aussehen, wenn noch viel mehr solche Stellen auftauchen).



  • camper schrieb:

    @SeppJ: dann muss allerdings bei jedem Aufruf explizit UniformFunction angegeben werden, was den Sinn des Wrappers in Frage stellt.

    was genauso auch in der makro variante der fall ist oder ich habe dich missverstanden.

    Edit: ja habe es missverstanden... Per makro werden entsprechende Wrapper methoden erzeugt.


Anmelden zum Antworten