Program Listing for File PointOctree.hpp

Return to documentation for file (include/lvr2/display/PointOctree.hpp)

#ifndef POINT_OCTREE
#define POINT_OCTREE

#include <vector>

#include "lvr2/types/PointBuffer.hpp"
#include "lvr2/display/BOct.hpp"
#include "lvr2/geometry/BaseVector.hpp"
#include "lvr2/geometry/BoundingBox.hpp"

#include "lvr2/display/MemoryHandler.hpp"

namespace lvr2
{

//  struct BOct
//  {
//      long m_child : 48;
//      unsigned char m_valid : 8;
//      unsigned char m_leaf : 8;
//      BOct(): m_child(0), m_valid(0), m_leaf(0){}
//  };

  struct Leaf
  {
    unsigned int m_start;
    unsigned int m_size;
    unsigned int m_listIndex;
  };

  template <typename BaseVecT>
  class PointOctree
  {
    public:
      PointOctree(PointBufferPtr& points, int depth);

      void intersect(double planes[24], std::vector<unsigned int>& indices);
      void setLOD(unsigned char lod) { m_lod = lod; }

      void genDisplayLists() { genDisplayLists(m_root); }

      virtual ~PointOctree() { m_root = NULL; }

    private:
      float m_voxelSize;
      BOct* m_root;
      BoundingBox<BaseVecT> m_bbox;
      // needs [] operator and has to be strict linear in memory
      FloatChannel m_points;

      ChunkMemoryHandler m_mem;

      unsigned char m_lod;

      template <typename T>
      void link(BOct* parent, T* child);

      template <typename T>
        T* getChildPtr(BOct* parent);

      unsigned char getIndex(const BaseVecT& point, const BoundingBox<BaseVecT>& bbox);

      void getBBoxes(const BoundingBox<BaseVecT>& bbox, BoundingBox<BaseVecT>* boxes);

      template <typename PtrT>
      void sortPC(size_t start, size_t size, const BoundingBox<BaseVecT>& bbox, size_t bucket_sizes[8]);

      long buildTree(BOct* oct, size_t start, size_t size, const BoundingBox<BaseVecT>& bbox);

      void getPoints(BOct* oct, std::vector<unsigned int >& indices);

      void intersect(Leaf* leaf, const BoundingBox<BaseVecT>& bbox, double planes[24], std::vector<unsigned int>& indices);

      void intersect(BOct* oct, const BoundingBox<BaseVecT>& bbox, double planes[24], std::vector<unsigned int>& indices);

      void genDisplayLists(Leaf* leaf);

      void genDisplayLists(BOct* oct);



//      void colorAndWrite(BOct* oct);
//
//      void colorAndWrite(BOct* oct, unsigned char index);
//
//      void writeLeaf(Leaf* leaf, unsigned char index);

    //  void intersect(BOct* oct,  const BoundingBox<BaseVecT>& octBBox, const BoundingBox<BaseVecT>& cullBBox, std::vector<BaseVecT >& pts);

    //  void intersect(const BoundingBox<BaseVecT>& cullBBox, std::vector<BaseVecT >& pts);


  };
}

#include "lvr2/display/PointOctree.tcc"

#endif