00001 #ifndef __PartialElementRenderer_HPP
00002 #define __PartialElementRenderer_HPP
00003
00004 #include <GLvish/VBO.hpp>
00005 #include <GLvish/IndexBuffer.hpp>
00006 #include <GLvish/VGLRenderContext.hpp>
00007 #include <field/FragmentSelector.hpp>
00008
00009 #include "fishGLDllApi.h"
00010
00011 namespace GL
00012 {
00013
00014 typedef Fiber::index_t index_t;
00015 typedef std::multimap<double, index_t> DepthToIndexMap;
00016
00017 using Wizt::IndexBuffer;
00018 using Wizt::IndexBufferObject;
00019
00020 template <class Type>
00021 MemCore::RefPtr<IndexBuffer<Type> > SortElements(const std::vector<Type>&UnsortedElements,
00022 const DepthToIndexMap&points)
00023 {
00024 using std::vector;
00025
00026 std::vector<Type> SortedElements( UnsortedElements.size() );
00027 typename std::vector<Type>::iterator SortedElementsIterator = SortedElements.begin();
00028
00029 for(DepthToIndexMap::const_iterator it = points.begin();
00030 it != points.end(); it++)
00031 {
00032 index_t sorted_idx = it->second;
00033 *SortedElementsIterator = UnsortedElements[ sorted_idx ];
00034 SortedElementsIterator++;
00035 }
00036 #ifdef VERBOSE
00037 puts("indices copied, creating index buffer");fflush(stdout);
00038 #endif
00039 return newIndexBuffer(SortedElements);
00040 }
00041
00042 struct fishGL_API ElementSorter : MemCore::ReferenceBase<ElementSorter>
00043 {
00044 ElementSorter()
00045 : MemCore::ReferenceBase<ElementSorter>(this)
00046 {}
00047
00048 ~ElementSorter();
00049
00050 static MemCore::RefPtr<IndexBufferObject> sortPoints(const DepthToIndexMap&points);
00051 virtual MemCore::RefPtr<IndexBufferObject> sort(const DepthToIndexMap&points);
00052 };
00053
00054 template <class Type>
00055 struct fishGL_API TypedElementSorter : ElementSorter
00056 {
00057 MemCore::RefPtr<Fiber::CreativeArrayBase> BaryCenters;
00058 typedef Fiber::MemArray<1, Type> CellArray_t;
00059
00060 TypedElementSorter(const MemCore::RefPtr<Fiber::CreativeArrayBase>&BC)
00061 : BaryCenters(BC)
00062 {}
00063
00064 override MemCore::RefPtr<IndexBufferObject> sort(const DepthToIndexMap&points)
00065 {
00066 assert( BaryCenters );
00067 MemCore::RefPtr<CellArray_t> Cells = BaryCenters->create();
00068 assert( Cells );
00069
00070 MemCore::RefPtr<MemCore::TypedChunk<Type> > C = Cells->getStorage();
00071 assert( C );
00072
00073 MemCore::RefPtr<IndexBuffer<Type> >
00074 IB = SortElements(C->get_vector(), points);
00075
00076 return IB;
00077 }
00078 };
00079
00084 struct fishGL_API ElementRenderer : Wizt::VBO::Renderer
00085 {
00087 typedef MemCore::RefPtr<Wizt::IndexBufferObject> IBO_t;
00088
00093 typedef Fiber::MemArray<3, IBO_t> ViewBufferArray_t;
00094
00098 MemCore::RefPtr<ViewBufferArray_t> SortedIndices;
00099
00103 IBO_t CurrentIBO;
00104
00105 MemCore::RefPtr<ElementSorter> MyElementSorter;
00106
00107 GLenum draw_mode;
00108 GLsizei count;
00109
00113 IBO_t sortByDepth(Wizt::VRenderContext&Context,
00114 const MemCore::RefPtr<Fiber::CreativeArrayBase>&VertexCoordinates,
00115 unsigned Discretization = 2);
00116
00123 ElementRenderer(const MemCore::RefPtr<Fiber::MemBase>&FieldCoordinates,
00124 const MemCore::RefPtr<Fiber::FragmentSelector>&FS);
00125
00127 ~ElementRenderer();
00128
00134 override bool draw();
00135 };
00136
00137 typedef ElementRenderer PartialElementRenderer;
00138
00139 }
00140
00141 #endif // __PartialElementRenderer_HPP
00142