FiberVISH 0.2
Fish - The Fiber Bundle API for the Vish Visualization Shell
FieldBuffer.hpp
1#ifndef __FieldBuffer_HPP
2#define __FieldBuffer_HPP
3
4#include <field/Field.hpp>
5#include <GLvish/ArrayTypes.hpp>
6#include <plankton/VActionNotifier.hpp>
7#include "fishGLDllApi.h"
8
9//#define VERBOSE
10
11namespace GL
12{
13 using namespace Wizt;
14
15template <class ArrayType>
16bool LoadArray(ArrayType&What, const MemCore::RefPtr<Fiber::MemBase>&SRC,
17 BufferArray::usage usage_hint = BufferArray::STATIC_DRAW)
18{
19typedef typename ArrayType::value_type value_type;
20
22 if (!TI)
23 return false;
24
26
27 return What.load(it.ptr(), it.count()*sizeof(value_type), it.count(), usage_hint );
28}
29
36template <class ArrayType, bool ThrowExceptionOnTypeMismatch = true>
38{
39 typedef typename ArrayType::value_type value_type;
40 typedef typename ArrayType::Base_t Base_t;
41
43 const Fiber::MemBase::Creator_t&theCreator,
44 BufferArray::usage usage_hint = BufferArray::STATIC_DRAW)
45 {
46 using namespace MemCore;
47 using namespace Fiber;
48
49 if (!MB)
50 {
52 throw BufferArray::Error("GL::FieldBuffer::create() No array data given",
53 typeid(ArrayType), typeid(value_type), __FILE__, __LINE__ );
54 else
55 return MemCore::NullPtr();
56 }
57
58#ifdef VERBOSE
59 printf(" UNPARAMETERIZED FIELDBUFFER: %s LOADING?\n", Typename(typeid(ArrayType)).c_str() );
60 MB.Speak(" UNPARAMETERIZED FIELDBUFFER DATA");
61#endif
62
63 if (RefPtr<MemCore::ChunkBase> DataChunk = MB->getChunk() )
64 {
66 {
67 if (!DataChunk->data_ptr())
68 throw BufferArray::Error("FieldBuffer (unparameterized): NO data provided (nullptr in DataChunk)",
69 typeid(value_type), MB->getType(), __FILE__, __LINE__ );
70
71 if ( !DataChunk->elements() )
72 throw BufferArray::Error("FieldBuffer (unparameterized): NO data elements provided (zero elements)",
73 typeid(value_type), MB->getType(), __FILE__, __LINE__ );
74 }
75
77 if (!B->load( DataChunk, usage_hint ) )
78 {
79 printf("GL/FieldBuffer: Data provided by %p, %u elements\n",
80 DataChunk->data_ptr(),
81 unsigned(DataChunk->elements() ));
82
83 DataChunk.Speak("GL/FieldBuffer.hpp: FieldBuffer::create() - DataChunk ");
84 B.Speak("GL/FieldBuffer.hpp: FieldBuffer::create() - ArrayType ");
85
87 {
88 if (!DataChunk->data_ptr())
89 throw BufferArray::Error("FieldBuffer (unparameterized): NO data provided (nullptr in DataChunk)",
90 typeid(value_type), MB->getType(), __FILE__, __LINE__ );
91
92 if ( !DataChunk->elements() )
93 throw BufferArray::Error("FieldBuffer (unparameterized): NO data elements provided (zero elements)",
94 typeid(value_type), MB->getType(), __FILE__, __LINE__ );
95
96 throw BufferArray::Error("FieldBuffer (unparameterized): Cannot load array data",
97 typeid(value_type), MB->getType(), __FILE__, __LINE__ );
98 }
99 else
100 return MemCore::NullPtr();
101 }
102 return B;
103 }
104
106 {
107 if (RefPtr<MemBase> TempMB = MB->makeMemArray( theCreator) )
108 {
110 {
112 if (!B->load( DataChunk, usage_hint ) )
113 {
115 throw BufferArray::Error("Cannot load temporary array data",
116 typeid(value_type), MB->getType(), __FILE__, __LINE__ );
117 else
118 return MemCore::NullPtr();
119 }
120 return B;
121 }
122// MB.Speak("FieldBuffer::MB");
124 throw BufferArray::Error("FieldBuffer: No data chunk available on temporary array data (bug?)",
125 typeid(value_type), MB->getType(), __FILE__, __LINE__ );
126 }
127// MB.Speak("FieldBuffer::MB");
129 throw BufferArray::Error("FieldBuffer: Cannot create temporary array data (bug?)",
130 typeid(value_type), MB->getType(), __FILE__, __LINE__ );
131 // internal bug?
132 return MemCore::NullPtr();
133 }
134
135 VActionNotifier::Warning("FieldBuffer(): Could not load specified data.\n");
136 return MemCore::NullPtr();
137 }
138
139
140template <class ArrayConstructorParam>
142 bool ForceMemCreation, const Fiber::MemBase::Creator_t&theCreator,
143 BufferArray::usage usage_hint = BufferArray::STATIC_DRAW)
144 {
145 using namespace MemCore;
146 using namespace Fiber;
147
148 if (!MB)
149 {
151 throw BufferArray::Error("GL::FieldBuffer::create() No array data given",
152 typeid(ArrayType), typeid(value_type), __FILE__, __LINE__ );
153 else
154 return MemCore::NullPtr();
155 }
156
157#ifdef VERBOSE
158 printf(" UNPARAMETERIZED FIELDBUFFER: %s LOADING?\n", Typename(typeid(ArrayType)).c_str() );
159 MB.Speak(" UNPARAMETERIZED FIELDBUFFER DATA");
160#endif
161
162 if (RefPtr<MemCore::ChunkBase> DataChunk = MB->getChunk() )
163 {
165 if (!B->load( DataChunk, usage_hint ) )
166 {
168 throw BufferArray::Error("Fieldbuffer: Buffer Array/Data Mismatch: Cannot load array data",
169 typeid(value_type), MB->getType(), __FILE__, __LINE__ );
170 return MemCore::NullPtr();
171 }
172#ifdef VERBOSE
173 printf(" FIELDBUFFER: %s LOADED OK\n", Typename(typeid(ArrayType)).c_str() ); fflush(stdout);
174#endif
175 return B;
176 }
177#ifdef VERBOSE
178 printf(" FIELDBUFFER: %s WRONG FIELD TYPE\n", Typename(typeid(ArrayType)).c_str() ); fflush(stdout);
179#endif
181 {
182 if (RefPtr<MemBase> TempMB = MB->makeMemArray( theCreator) )
183 {
185 {
187 if (!B->load( DataChunk, usage_hint ) )
188 {
190 throw BufferArray::Error("Cannot load temporary array data",
191 typeid(value_type), MB->getType(), __FILE__, __LINE__ );
192
193 return MemCore::NullPtr();
194 }
195 return B;
196 }
197 }
198
200 throw BufferArray::Error("FieldBuffer: Cannot create temporary array data",
201 typeid(value_type), MB->getType(), __FILE__, __LINE__ );
202 // internal bug?
203// return MemCore::NullPtr();
204 }
205 VActionNotifier::Warning("FieldBuffer(): Could not load specified data.\n");
206 return MemCore::NullPtr();
207 }
208};
209
210
211/*
212template <class ArrayType, class NextType>
213struct FieldBuffer<LIST<ArrayType, NextType> >
214{
215};
216*/
217
218
219
220
221
222
223
224
232
240
248
258
259
260} // namespace
261
262#endif // __FieldBuffer_HPP
263
An iterator with an optional DataCreator, which is just a class to intercept creation of data along a...
Definition CreativeIterator.hpp:34
T * ptr(int c=0) const
Return pointer to data, which is good for C interface, but otherwise, avoid that.
Definition vector/Iterator.hpp:266
index_t count() const
Return the number of steps which can be traversed through this ElementIterator.
Definition HyperslabParameters.hpp:147
const type_info & getType() const noexcept
void Speak(const char *s, const char *prefix="") const
MEMCORE_API std::string Typename(const std::type_info &t)
Given a fragmented field of curvilinear coordinates, (3D array of coordinates), build a uniform Grid ...
Definition FAQ.dox:2
std::nullptr_t NullPtr
note: cannot derive from FloatingSkeletonRenderer as long as independent base class TriangleRenderer ...
A named vertex attribute array, to be used for shaders.
Definition FieldBuffer.hpp:253
Definition FieldBuffer.hpp:243
Definition FieldBuffer.hpp:235
Definition FieldBuffer.hpp:227
Templated static member function to load data from MemArrays into vertex arrays.
Definition FieldBuffer.hpp:38