Buongiorno a tutti, Sto studiando un libro sulle opengl ed ogni nuovo concetto che incontro cerco di farlo mio scrivendoci un wrapper attorno.
Ora... Un vbo di per se è legato ad un buffer in memoria video e come deve essere interpretato il suo contenuto è un compito lasciato al programmatore. Quindi io ho creato la classe VertexBuffer che rappresenta un vbo (senza informazioni sul suo utilizzo o su cosa contenga) e una classe VertexAttributes che eredita da VertexBuffer, ma che contiene delle informazioni aggiuntive, ovvero il numero di attributi contenuti ed il descrittore dei contenuti. Per intenderci un VertexAttributes può contenere informazioni del tipo: ho 35 vertici, ognuno formato da 3 float.
Fin qui nessun problema, il tutto è semplicemente fantastico ed elegante da usare.
Leggo nel libro che esiste un glMapNamedBuffer() o un nome simile, che permette di portare il buffer nella memoria accessibile alla mia applicazione per leggerlo e/o modificarlo.
Quindi ho creato una classe MappedMemory come sottoclasse protetta di VertexBuffer e una funzione virtuale che ritorna un oggetto di quel tipo.
Ora voglio che una chiamata a quella funzione su un oggetto di tipo VertexAttributes mi restituisca un oggetto la cui classe eredita da MappedMemory, ma che possa fare delle cose in più.
A questo punto mi rendo conto che non avrei dovuto usare, come tipo di ritorno un MappedMemory, ma bensì un MappedMemory& oppure un MappedMemory*, ma nessuna delle due opzioni mi aggrada: il riferimento finirebbe ad essere un riferimento a memoria che verrebbe distrutta dal return stesso, e il puntatore mi forzerebbe a pensare a un metodo di gestione della memoria (potrei ovviare usando uno unique_ptr o uno shared_ptr, ma poi ogni volta che uso tale funzione dovrei fare un dynamic_cast per poter chiamare funzioni disponibili solo sulla implementazione di MappedMemory relativa ad un VertexAttrubutes).
Un'altra soluzione potrebbe essere quella di mantenere come membro privato un oggetto del tipo corretto e ritornarne il riferimento, pregando però ogni santo di non dimenticare mai di chiamare glUnmapNamedBuffer() quando chi usa la libreria (io) avrà finito di usare il buffer, perché il risultato potrebbe essere catastrofico e il bug diffile da trovare!!!!
Sono un po indeciso sulla strada da seguire, e mi farebbe piacere sentire il vostro parere.
|