/***************************************************************************************** * * * OpenSpace * * * * Copyright (c) 2014-2018 * * * * Permission is hereby granted, free of charge, to any person obtaining a copy of this * * software and associated documentation files (the "Software"), to deal in the Software * * without restriction, including without limitation the rights to use, copy, modify, * * merge, publish, distribute, sublicense, and/or sell copies of the Software, and to * * permit persons to whom the Software is furnished to do so, subject to the following * * conditions: * * * * The above copyright notice and this permission notice shall be included in all copies * * or substantial portions of the Software. * * * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, * * INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A * * PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT * * HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF * * CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE * * OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. * ****************************************************************************************/ #include namespace openspace::volume { template RawVolumeReader::RawVolumeReader(const std::string& path, const glm::uvec3& dimensions) : _dimensions(dimensions) , _path(path) {} template glm::uvec3 RawVolumeReader::dimensions() const { return _dimensions; } template void RawVolumeReader::setDimensions(const glm::uvec3& dimensions) { _dimensions = dimensions; } template std::string RawVolumeReader::path() const { return _path; } template void RawVolumeReader::setPath(const std::string& path) { _path = path; } /* TODO: Implement these methods for random access in raw volume file template VoxelType RawVolumeReader::get(const glm::ivec3& coordinates) const { return get(coordsToIndex(coordinates, dimensions())); } template VoxelType RawVolumeReader::get(size_t index) const { // TODO: read from specific position. return VoxelType(); }*/ template size_t RawVolumeReader::coordsToIndex(const glm::uvec3& cartesian) const { return coordsToIndex(cartesian, dimensions()); } template glm::uvec3 RawVolumeReader::indexToCoords(size_t linear) const { return indexToCoords(linear, dimensions()); } template std::unique_ptr> RawVolumeReader::read() { glm::uvec3 dims = dimensions(); std::unique_ptr> volume = std::make_unique>( dims ); std::ifstream file(_path, std::ios::binary); char* buffer = reinterpret_cast(volume->data()); if (file.fail()) { throw ghoul::FileNotFoundError("Volume file not found"); } size_t length = static_cast(dims.x) * static_cast(dims.y) * static_cast(dims.z) * sizeof(VoxelType); file.read(buffer, length); if (file.fail()) { throw ghoul::RuntimeError("Error reading volume file"); } return volume; } } // namespace openspace::volume