ciao.
Ho implementato un gestore di bufferobject opengl, funziona coi template e si usa cosi:
il primo parametro è il Creator , ce ne possono essere vari e l'ho pensato in un futuro in cui volessi cambiare o implementare per es la versione directx ,il secondo è il numero di elementicodice:CVboManager< CVboCreator , 3, glm::vec3[3], GL_FLOAT, CEmpty, 0, glm::vec3[3], GL_FLOAT > VBO("VertexPosition", "", "VertexColor"); VBO.Position[0].x = -0.5f; VBO.Position[0].y = -0.5f; VBO.Position[0].z = 0.5f; ecc.....
il terzo il tipo di elemento(glm è una libreria matematica studiata per opengl, in questo caso uso un array di tre vettori float.
il 4 è il tipo del elemento base per opengl. passo il problema e non mi dilungo: in questo caso
devo per forza sapere in anticipo il numero di elementi che avra' quel vertex buffer e mi piacerebbe aggiungere quanti voglio elementi senza starli a contare e fare si che sia il c++ a calcolare il tutto.
per questo ho pensato ad un mio personale buffer tipo questobasandomi su di un vector(pseudocodice)
in modo da fare cosi:codice:#pragma once #include <vector> template< class T > class CSizeVaringData { public: CSizeVaringData(); ~CSizeVaringData(); std::vector<T> m_data; typedef T Type; void AddData(T element) { m_data.push_back(element); } T* getAllData(){ return m_data[]; } };
il problema è che devo mantenere la compatibilità con i precedenti parametri.codice:CVboManager< CVboCreator , 3, CSizeVaringData<glm::vec3>, GL_FLOAT, CEmpty, 0, glm::vec3[3], GL_FLOAT > VBO("VertexPosition", "", "VertexColor");
e devo usare l'overloading per gestire diversamente il cariccamento nel creator del buffer
il problema è questo:codice:Creator: template<class Data> bool Create(GLuint& vertexArrayObject, GLuint& vertexBufferObject, std::string strSemantic, ptrBaseEffect ptrEff, GLenum type, Data* VBOData) { glGenBuffers(1, &vertexBufferObject); glBindBuffer(GL_ARRAY_BUFFER, vertexBufferObject); glBufferData(GL_ARRAY_BUFFER, sizeof(*VBOData), glm::value_ptr(*VBOData[0]), GL_STATIC_DRAW); glVertexAttribPointer(glGetAttribLocation(ptrEff->m_headerShader, strSemantic.c_str()), 3, GL_FLOAT, GL_FALSE, sizeof(*VBOData[0]), (void*)0/*nOffset*/); glEnableVertexAttribArray(glGetAttribLocation(ptrEff->m_headerShader, strSemantic.c_str())); float* pF = glm::value_ptr(*VBOData[0]); return true; } template<class Data> bool Create(GLuint& vertexArrayObject, GLuint& vertexBufferObject, std::string strSemantic, ptrBaseEffect ptrEff, GLenum type, CEmpty* VBOData) { return true; } template<class Data> bool Create(GLuint& vertexArrayObject, GLuint& vertexBufferObject, std::string strSemantic, ptrBaseEffect ptrEff, GLenum type, CSizeVaringData<glm::vec3>* VBOData) { } //il problema è attorno a questa funzione in overload: //bool Create(GLuint& vertexArrayObject, GLuint& vertexBufferObject, std::string strSemantic, ptrBaseEffect ptrEff, GLenum type, CSizeVaringData<glm::vec3>* VBOData) //{ //}
CSizeVaringData<glm::vec3>* VBOData
se uso un overloading cosi va, ma io non so che tipo ho specificato nel template CVboManager potrei aver specificato un int3 ,
e devo specificare per forza un tipo nel parametro con CSizeVaringData.
quello che posso fare è utilizzare due parametri template , uno per il contenitore e uno per il tipo contenuto nel contenitore.
poi gestire in overloading i diversi contenitori , quando ce ne ho 2 o 3 è abbastanza per quello che devo fare .
non vedo altra soluzione.
è possibile utilizzare i template template parameter ? come si usano? possono tornare utili in questo caso
io non ci sono riuscito.
grazie.

Rispondi quotando