PartialElementRenderer.hpp

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 } // namespace GL
00140 
00141 #endif // __PartialElementRenderer_HPP
00142