FiberVISH 0.2
Fish - The Fiber Bundle API for the Vish Visualization Shell
VertexField.hpp
1#ifndef __VERTEXFIELD_HPP
2#define __VERTEXFIELD_HPP
3
4
5#include <bone/BundleInput.hpp>
6#include <bone/FishField.hpp>
7#include <bone/FishSlice.hpp>
8
9#include <ocean/GLvish/VGLRenderObject.hpp>
10#include <ocean/GLvish/ArrayTypes.hpp>
11#include <ocean/GLvish/Shader.hpp>
12
13#include <eagle/PhysicalSpace.hpp>
14
15#include <ocean/shrimp/VEnum.hpp>
16
17#include <GL/fieldGL.hpp>
18#include <GL/FieldBuffer.hpp>
19
20#include "fisheyeDllApi.h"
21
22namespace Wizt
23{
24
71{
72public:
74
78 struct Error : GLError
79 {
80 MemCore::simplestring fieldname;
81
82 Error(const char*what, const string&f, const char*srcfilename, unsigned lineNo)
83 : GLError(0, what, srcfilename, lineNo)
84 , fieldname(f)
85 {
86 }
87 };
88
96 const bool ConvertToElements = false;
97
110 VertexField(VObject*what,
111 const string&fieldname, bool ConvertToElements=true,
112 int expertLevel=0);
113
115 ~VertexField();
116
122 const string&arrayname,
124 const Fiber::MemBase::Creator_t&theCreator) const = 0;
125
132 const string&arrayname, const RefPtr<GLProgram>&Shader
133 ) const;
134
142 virtual bool isOlderThan(const Ageable&A, const RefPtr<ValuePool>&Context) const;
143
148 virtual void updateAge(Ageable&A, const RefPtr<ValuePool>&Context) const;
149};
150
157template <class VBOArrayType>
158class VBOField : public VertexField
159{
160public:
161 typedef typename VBOArrayType::value_type value_type;
162
163 VBOField(VObject*that, const string&fieldname, int expertLevel=0)
164 : VertexField(that, fieldname, true, expertLevel)
165 {
166 TypedSlot<Fiber::Field>&myField = this->MyField;
167 myField.acceptType<value_type>();
168 }
169
171 const string&arrayname,
173 const Fiber::MemBase::Creator_t&theCreator
174 ) const override
175 {
176// return GL::FieldBuffer<VBOArrayType>::create( MB, ConvertToElements );
177 return GL::FieldBuffer<VBOArrayType>::create( MB, true, theCreator );
178 }
179};
180
181
186template <class Type>
188{
189public:
191 typedef typename VBOArrayType::value_type value_type;
192
193 int TU;
194
195 VBOField(VObject*that, const string&fieldname, int TextureUnit, int expertLevel = 0)
196 : VertexField(that, fieldname, true, expertLevel)
197 , TU(TextureUnit)
198 {
199 TypedSlot<Fiber::Field>&myField = this->MyField;
200 myField.acceptType<value_type>();
201 }
202
204 const string&arrayname,
206 const Fiber::MemBase::Creator_t&theCreator) const override
207 {
208 int Id = TU;
209#if 0
210 if (Shader)
211 {
212 if (!Shader->getUniformValuei( arrayname.c_str(), Id ) )
213 {
214 throw BufferArray::Error("No texture ID defined in associated shader", typeid(Type), MB->getType() );
215 }
216 }
217#endif
218// return GL::FieldBuffer<VBOArrayType>::create( MB, ConvertToElements );
219 return GL::FieldBuffer<VBOArrayType>::createParam(Id, MB, true, theCreator );
220 }
221};
222
233template <class Type>
235{
236public:
238 typedef typename VBOArrayType::value_type value_type;
239
240 VBOField(VObject*that, const string&fieldname, int EL=0)
241 : VertexField(that, fieldname, true, EL)
242 {
243 TypedSlot<Fiber::Field>&myField = this->MyField;
244 myField.acceptType<value_type>();
245 }
246
248 const string&arrayname,
250 const Fiber::MemBase::Creator_t&theCreator) const override
251 {
252 if (!Shader)
253 return NullPtr();
254
255 int Id = Shader->getAttribID( arrayname.c_str() );
256 if (Id<0)
257 throw BufferArray::Error("Vertex Attribute '" + arrayname + "' was not found in vertex shader.",
258 typeid(Type), MB->getType(), __FILE__, __LINE__ );
259
260// throw BufferArray::Error("Invalid attribute ID used in associated shader", typeid(Type), MB->getType() );
261
262 return GL::FieldBuffer<VBOArrayType>::createParam(Id, MB, true, theCreator );
263 }
264};
265
266template <class VBOArrayType>
267class VBOField<LIST<VBOArrayType, NIL> > : public VBOField<VBOArrayType>
268{
269public:
270// typedef typename VBOArrayType::value_type value_type;
271
272 VBOField(VObject*that, const string&fieldname, int EL=0)
273 : VBOField<VBOArrayType>(that, fieldname, EL)
274 {
275// TypedSlot<Fiber::Field>&myField = this->MyField;
276// myField.acceptType<value_type>();
277 }
278
279/* taken from base class
280 RefPtr<BufferArray> createVBOArray(const RefPtr<Fiber::MemBase>&MB,
281 const string&arrayname,
282 const RefPtr<GLProgram>&Shader,
283 const Fiber::MemBase::Creator_t&theCreator
284 ) const override
285 {
286// return GL::FieldBuffer<VBOArrayType>::create( MB, ConvertToElements );
287 return GL::FieldBuffer<VBOArrayType>::create( MB, true, theCreator );
288 }
289*/
290};
291
292
297template <class VBOArrayType, class NextType>
298class VBOField<LIST<VBOArrayType, NextType> > : public VBOField<NextType>
299{
300public:
301 typedef typename VBOArrayType::value_type value_type;
302
303 VBOField(VObject*that, const string&fieldname, int EL=0)
304 : VBOField<NextType>(that, fieldname, EL)
305 {
306 TypedSlot<Fiber::Field>&myField = this->MyField;
307 myField.acceptType<value_type>();
308 }
309
311 const string&arrayname,
313 const Fiber::MemBase::Creator_t&theCreator
314 ) const override
315 {
317 GL::FieldBuffer<VBOArrayType, false>::create( MB, true, theCreator ) )
318 {
320 }
321#ifdef VERBOSE
322 printf("VBO: Could not load data as %s, trying to load as %s next.\n",
323 Typename(typeid(VBOArrayType)).c_str(), Typename(typeid(NextType)).c_str() );
324 fflush(stdout);
325#endif
326 return VBOField<NextType>::createVBOArray(MB, arrayname, Shader, theCreator);
327 }
328};
329
330
331template <class Type>
332class VBOField<LIST<TypedVertexAttribArray<Type>, NIL> > : public VBOField<TypedVertexAttribArray<Type> >
333{
334public:
335 VBOField(VObject*that, const string&fieldname, int EL=0)
336 : VBOField<TypedVertexAttribArray<Type> >(that, fieldname, EL)
337 {}
338};
339
340
341template <class Type, class NextType>
342class VBOField<LIST<TypedVertexAttribArray<Type>, NextType> > : public VBOField<NextType>
343{
344public:
346 typedef typename VBOArrayType::value_type value_type;
347
348 VBOField(VObject*that, const string&fieldname, int EL=0)
349 : VBOField<NextType>(that, fieldname, EL)
350 {
351 TypedSlot<Fiber::Field>&myField = this->MyField;
352 myField.acceptType<value_type>();
353 }
354
356 const string&arrayname,
358 const Fiber::MemBase::Creator_t&theCreator
359 ) const override
360 {
361 if (!Shader)
362 return NullPtr();
363
364 int Id = Shader->getAttribID( arrayname.c_str() );
365 if (Id<0)
366 throw BufferArray::Error("Vertex Attribute '" + arrayname + "' was not found in vertex shader.",
367 typeid(Type), MB->getType(), __FILE__, __LINE__ );
368
370 GL::FieldBuffer<VBOArrayType, false>::createParam(Id, MB, true, theCreator ) )
371 {
373 }
374
375#ifdef VERBOSE
376 printf("VBO: Could not load data as %s, trying to load as %s next.\n",
377 Typename(typeid(VBOArrayType)).c_str(), Typename(typeid(NextType)).c_str() );
378 fflush(stdout);
379#endif
380
381 return VBOField<NextType>::createVBOArray(MB, arrayname, Shader, theCreator);
382 }
383};
384
385
386
387/*
388TODO: class VBOField<LIST<TypedTexCoordArray<Type>, ...>
389
390 */
391
392} // namespace Wizt
393
394#endif // __VERTEXFIELD_HPP
An iterator with an optional DataCreator, which is just a class to intercept creation of data along a...
Definition CreativeIterator.hpp:34
RefPtr< BufferArray > createVBOArray(const RefPtr< Fiber::MemBase > &MB, const string &arrayname, const RefPtr< GLProgram > &Shader, const Fiber::MemBase::Creator_t &theCreator) const override
Virtual function to create a vertex array from a given memory array.
Definition VertexField.hpp:355
RefPtr< BufferArray > createVBOArray(const RefPtr< Fiber::MemBase > &MB, const string &arrayname, const RefPtr< GLProgram > &Shader, const Fiber::MemBase::Creator_t &theCreator) const override
Virtual function to create a vertex array from a given memory array.
Definition VertexField.hpp:310
RefPtr< BufferArray > createVBOArray(const RefPtr< Fiber::MemBase > &MB, const string &arrayname, const RefPtr< GLProgram > &Shader, const Fiber::MemBase::Creator_t &theCreator) const override
Virtual function to create a vertex array from a given memory array.
Definition VertexField.hpp:203
RefPtr< BufferArray > createVBOArray(const RefPtr< Fiber::MemBase > &MB, const string &arrayname, const RefPtr< GLProgram > &Shader, const Fiber::MemBase::Creator_t &theCreator) const override
Virtual function to create a vertex array from a given memory array.
Definition VertexField.hpp:247
Associate a Field with some vertex array that is uniquely defined by its type, such as a ColorArray.
Definition VertexField.hpp:159
RefPtr< BufferArray > createVBOArray(const RefPtr< Fiber::MemBase > &MB, const string &arrayname, const RefPtr< GLProgram > &Shader, const Fiber::MemBase::Creator_t &theCreator) const override
Virtual function to create a vertex array from a given memory array.
Definition VertexField.hpp:170
A VertexField is a (abstract) gateway from RAM to GPU memory.
Definition VertexField.hpp:71
virtual RefPtr< BufferArray > createVBOArray(const RefPtr< Fiber::MemBase > &MB, const string &arrayname, const RefPtr< GLProgram > &Shader, const Fiber::MemBase::Creator_t &theCreator) const =0
Virtual function to create a vertex array from a given memory array.
MEMCORE_API std::string Typename(const std::type_info &t)
std::nullptr_t NullPtr
note: cannot derive from FloatingSkeletonRenderer as long as independent base class TriangleRenderer ...
Templated static member function to load data from MemArrays into vertex arrays.
Definition FieldBuffer.hpp:38
Exception class.
Definition VertexField.hpp:79