Select Git revision
screenshot_pass.cpp

Sebastian Pape authored
screenshot_pass.cpp 2.40 KiB
//------------------------------------------------------------------------------
// Project Phoenix
//
// Copyright (c) 2017-2018 RWTH Aachen University, Germany,
// Virtual Reality & Immersive Visualization Group.
//------------------------------------------------------------------------------
// License
//
// Licensed under the 3-Clause BSD License (the "License");
// you may not use this file except in compliance with the License.
// See the file LICENSE for the full text.
// You may obtain a copy of the License at
//
// https://opensource.org/licenses/BSD-3-Clause
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//------------------------------------------------------------------------------
#include "screenshot_pass.hpp"
#include "phx/core/logger.hpp"
#include "phx/resources/types/image.hpp"
#include <fstream>
namespace phx {
// Copied from Stackoverflow
inline bool file_exists(const std::string& name) {
std::ifstream f(name.c_str());
return f.good();
}
ScreenshotPass::ScreenshotPass(RenderTarget* render_target)
: render_target_(render_target) {}
ScreenshotPass::~ScreenshotPass() { free(data_storage_); }
void ScreenshotPass::Initialize() {
dims_ = render_target_->GetDimensions();
data_storage_ = malloc(dims_.x * dims_.y * 4);
}
void ScreenshotPass::Execute() {
if (!screenshot_next_frame) return;
// Get Pixels into Memory
render_target_->bind();
glReadPixels(0, 0, dims_.x, dims_.y, GL_RGB, GL_UNSIGNED_BYTE, data_storage_);
render_target_->unbind();
// Save to disk
auto image = new phx::Image(data_storage_, {dims_.x, dims_.y}, 24);
auto name = FindNextFileName("Screenshot_") + ".png";
if (image->Save(name)) {
phx::info(("Saved " + name).c_str());
} else {
phx::warn(("Could not save " + name).c_str());
}
delete image;
// Reset
screenshot_next_frame = false;
}
void ScreenshotPass::Screenshot() { screenshot_next_frame = true; }
std::string ScreenshotPass::FindNextFileName(const std::string name) {
unsigned int i = 0;
while (file_exists(name + std::to_string(i) + ".png")) {
i++;
}
return name + std::to_string(i);
}
} // namespace phx