Files
OpenSpace/include/openspace/flare/BrickManager.h
Alexander Bock 43e510fded Fixed for Win32 compatability
Renamed OpenCL qualifiers due to conflict with "ERROR" macros
Removed boost::timer and boost::system dependencies
Added fixed for Windows path handling
2014-05-02 10:48:16 +02:00

155 lines
3.8 KiB
C++

/*
* Author: Victor Sand (victor.sand@gmail.com)
*
*/
#ifndef BRICKMANAGER_H
#define BRICKMANAGER_H
#include <iostream>
#include <string>
#include <vector>
#include <map>
#include <fstream>
//#include <boost/timer/timer.hpp>
#include <stdio.h>
#include <ghoul/opengl/texture.h>
// Make sure we get 64 bits for offset
#define _FILE_OFFSET_BITS 64
// For easy switching between offset types
#define off off64_t
namespace osp {
class Config;
class BrickManager {
public:
static BrickManager * New(Config *_config);
~BrickManager();
Config *config_;
enum BUFFER_INDEX { EVEN = 0, ODD };
// Read header data from file, should normally only be called once
// unless header data changes
bool ReadHeader();
bool InitAtlas();
// Build brick list from request list
// Resets values in _brickRequest to 0
bool BuildBrickList(BUFFER_INDEX _bufIdx, std::vector<int> &_brickRequest);
// Upload bricks from memory buffer to PBO using the brick list
bool DiskToPBO(BUFFER_INDEX _pboIndex);
// Init transfer from PBO to texture atlas
bool PBOToAtlas(BUFFER_INDEX _pboIndex);
std::vector<int> BrickList(BUFFER_INDEX _bufIdx) {
return brickLists_[_bufIdx];
}
ghoul::opengl::Texture * TextureAtlas() { return textureAtlas_; }
// Header accessors
unsigned int GridType() const { return gridType_; }
unsigned int NumOrigTimesteps() const { return numOrigTimesteps_; }
unsigned int NumTimesteps() const { return numTimesteps_; }
unsigned int XBrickDim() const { return xBrickDim_; }
unsigned int YBrickDim() const { return yBrickDim_; }
unsigned int ZBrickDim() const { return zBrickDim_; }
unsigned int XNumBricks() const { return xNumBricks_; }
unsigned int YNumBricks() const { return yNumBricks_; }
unsigned int ZNumBricks() const { return zNumBricks_; }
unsigned int PaddingWidth() const { return paddingWidth_; }
unsigned int DataSize() const { return dataSize_; }
private:
BrickManager();
BrickManager(Config *_config);
BrickManager(const BrickManager&);
// Header data
unsigned int gridType_;
unsigned int numOrigTimesteps_;
unsigned int numTimesteps_;
unsigned int xBrickDim_;
unsigned int yBrickDim_;
unsigned int zBrickDim_;
unsigned int xNumBricks_;
unsigned int yNumBricks_;
unsigned int zNumBricks_;
unsigned int dataSize_;
unsigned int numBricks_;
unsigned int brickDim_;
unsigned int paddedBrickDim_;
unsigned int atlasDim_;
const unsigned int paddingWidth_ = 1;
unsigned int numBrickVals_;
unsigned int numBricksFrame_;
unsigned int numBricksTree_;
unsigned int brickSize_;
unsigned int volumeSize_;
unsigned int numValsTot_;
// Texture coordinates to be assigned
int xCoord_;
int yCoord_;
int zCoord_;
// Texture where the actual atlas is kept
ghoul::opengl::Texture *textureAtlas_;
std::vector<std::vector<int> > brickLists_;
// C-style I/O
std::FILE *file_;
#ifdef WIN32
long long dataPos_;
#else
off_t dataPos_;
#endif
bool hasReadHeader_;
bool atlasInitialized_;
// PBOs
unsigned int pboHandle_[2];
// Caching, one for each PBO
std::vector<std::vector<int> > bricksInPBO_;
std::vector<std::vector<bool> > usedCoords_;
// Increment the coordinate to be assigned (handle looping)
void IncCoord();
// Linear version of the current x, y, z coordinate to be assigned
unsigned int LinearCoord(int _x, int _y, int _z);
// 3D coordinates from linear index
void CoordsFromLin(int _idx, int &_x, int &_y, int &_z);
// Fill a brick in the volume using a pointer to flattened brick data
bool FillVolume(float *_in,
float *_out,
unsigned int _x,
unsigned int _y,
unsigned int _z);
// Timer and timer constants
//boost::timer::cpu_timer timer_;
const double BYTES_PER_GB = 1073741824.0;
};
}
#endif