Skip to content
Snippets Groups Projects
media_panel.cpp 7.54 KiB
Newer Older
Nicolas Pope's avatar
Nicolas Pope committed
#include "media_panel.hpp"
#include "screen.hpp"
Iiro Rastas's avatar
Iiro Rastas committed
#include "record_window.hpp"
Nicolas Pope's avatar
Nicolas Pope committed

#include <nanogui/layout.h>
#include <nanogui/button.h>
#include <nanogui/popupbutton.h>
#include <nanogui/entypo.h>

#ifdef HAVE_LIBARCHIVE
#include "ftl/rgbd/snapshot.hpp"
#endif

using ftl::gui::MediaPanel;
using ftl::codecs::Channel;
MediaPanel::MediaPanel(ftl::gui::Screen *screen, ftl::gui::SourceWindow *sourceWindow) : nanogui::Window(screen, ""), screen_(screen), sourceWindow_(sourceWindow) {
Sebastian Hahta's avatar
Sebastian Hahta committed
	using namespace nanogui;
Sebastian Hahta's avatar
Sebastian Hahta committed
	paused_ = false;
Sebastian Hahta's avatar
Sebastian Hahta committed
	disable_switch_channels_ = false;
	record_mode_ = RecordMode::None;
Sebastian Hahta's avatar
Sebastian Hahta committed
	setLayout(new BoxLayout(Orientation::Horizontal,
Nicolas Pope's avatar
Nicolas Pope committed
									Alignment::Middle, 5, 10));

Sebastian Hahta's avatar
Sebastian Hahta committed
	auto size = Vector2i(400, 60);
	//setFixedSize(size);
	setPosition(Vector2i(screen->width() / 2 - size[0]/2, screen->height() - 30 - size[1]));
Sebastian Hahta's avatar
Sebastian Hahta committed
	auto button = new Button(this, "", ENTYPO_ICON_EDIT);
Nicolas Pope's avatar
Nicolas Pope committed
	button->setTooltip("Edit camera properties");
Sebastian Hahta's avatar
Sebastian Hahta committed
	button->setCallback([this]() {
		auto *cam = screen_->activeCamera();
		if (cam) cam->showPoseWindow();
	});

Iiro Rastas's avatar
Iiro Rastas committed
	recordbutton_ = new PopupButton(this, "", ENTYPO_ICON_CONTROLLER_RECORD);
	recordbutton_->setTooltip("Record");
	recordbutton_->setSide(Popup::Side::Right);
	recordbutton_->setChevronIcon(0);
	auto recordpopup = recordbutton_->popup();
	recordpopup->setLayout(new GroupLayout());
	recordpopup->setTheme(screen->toolbuttheme);
	recordpopup->setAnchorHeight(150);
	auto itembutton = new Button(recordpopup, "2D snapshot (.png)");
Iiro Rastas's avatar
Iiro Rastas committed
	itembutton->setCallback([this]() {
		_startRecording(RecordMode::Snapshot2D);
Iiro Rastas's avatar
Iiro Rastas committed
		recordbutton_->setPushed(false);
	});
	itembutton = new Button(recordpopup, "Virtual camera recording (.ftl)");
Iiro Rastas's avatar
Iiro Rastas committed
	itembutton->setCallback([this]() {
		_startRecording(RecordMode::Video2D);
Iiro Rastas's avatar
Iiro Rastas committed
		recordbutton_->setTextColor(nanogui::Color(1.0f,0.1f,0.1f,1.0f));
		recordbutton_->setPushed(false);
	});
	itembutton = new Button(recordpopup, "3D scene snapshot (.ftl)");
	itembutton->setCallback([this]() {
		_startRecording(RecordMode::Snapshot3D);
Iiro Rastas's avatar
Iiro Rastas committed
		recordbutton_->setPushed(false);
	});
	itembutton = new Button(recordpopup, "3D scene recording (.ftl)");
Iiro Rastas's avatar
Iiro Rastas committed
	itembutton->setCallback([this]() {
		_startRecording(RecordMode::Video3D);
Iiro Rastas's avatar
Iiro Rastas committed
		recordbutton_->setTextColor(nanogui::Color(1.0f,0.1f,0.1f,1.0f));
		recordbutton_->setPushed(false);
Sebastian Hahta's avatar
Sebastian Hahta committed
	});
	itembutton = new Button(recordpopup, "Detailed recording options");
Iiro Rastas's avatar
Iiro Rastas committed
	itembutton->setCallback([this,sourceWindow] {
		auto record_window = new RecordWindow(screen_, screen_, sourceWindow->getCameras(), this);
		record_window->setTheme(screen_->windowtheme);
		recordbutton_->setPushed(false);
		recordbutton_->setEnabled(false);
	});
Nicolas Pope's avatar
Nicolas Pope committed

Iiro Rastas's avatar
Iiro Rastas committed
	recordbutton_->setCallback([this](){
		if (record_mode_ != RecordMode::None) {
			_stopRecording();
Iiro Rastas's avatar
Iiro Rastas committed
			recordbutton_->setTextColor(nanogui::Color(1.0f,1.0f,1.0f,1.0f));
			recordbutton_->setPushed(false);
Nicolas Pope's avatar
Nicolas Pope committed
	button = new Button(this, "", ENTYPO_ICON_CONTROLLER_STOP);
Sebastian Hahta's avatar
Sebastian Hahta committed
	button->setCallback([this]() {
		screen_->setActiveCamera(nullptr);
	});

	button = new Button(this, "", ENTYPO_ICON_CONTROLLER_PAUS);
	button->setCallback([this,button,sourceWindow]() {
		//paused_ = !paused_;
		//paused_ = !(bool)ftl::config::get("[reconstruction]/controls/paused");
		//ftl::config::update("[reconstruction]/controls/paused", paused_);

		paused_ = !paused_;
		sourceWindow->paused(paused_);

Sebastian Hahta's avatar
Sebastian Hahta committed
		if (paused_) {
			button->setIcon(ENTYPO_ICON_CONTROLLER_PLAY);
		} else {
			button->setIcon(ENTYPO_ICON_CONTROLLER_PAUS);
		}
	});
Sebastian Hahta's avatar
Sebastian Hahta committed
	
	// not very useful (l/r)

	/*auto button_dual = new Button(this, "", ENTYPO_ICON_MAP);
Sebastian Hahta's avatar
Sebastian Hahta committed
	button_dual->setCallback([this]() {
		screen_->setDualView(!screen_->getDualView());
	});
	*/

#ifdef HAVE_OPENVR
	if (this->screen_->isHmdPresent()) {
Sebastian Hahta's avatar
Sebastian Hahta committed
		auto button_vr = new Button(this, "VR");
		button_vr->setFlags(Button::ToggleButton);
		button_vr->setChangeCallback([this, button_vr](bool state) {
			if (!screen_->isVR()) {
Sebastian Hahta's avatar
Sebastian Hahta committed
				if (screen_->switchVR(true) == true) {
					button_vr->setTextColor(nanogui::Color(0.5f,0.5f,1.0f,1.0f));
					//this->button_channels_->setEnabled(false);
Sebastian Hahta's avatar
Sebastian Hahta committed
				}
			}
			else {
				if (screen_->switchVR(false) == false) {
					button_vr->setTextColor(nanogui::Color(1.0f,1.0f,1.0f,1.0f));
					//this->button_channels_->setEnabled(true);
Sebastian Hahta's avatar
Sebastian Hahta committed
				}
			}
		});
	}
#endif

	button_channels_ = new PopupButton(this, "", ENTYPO_ICON_LAYERS);
	button_channels_->setSide(Popup::Side::Right);
	button_channels_->setChevronIcon(ENTYPO_ICON_CHEVRON_SMALL_RIGHT);
	Popup *popup = button_channels_->popup();
	popup->setLayout(new GroupLayout());
	popup->setTheme(screen->toolbuttheme);
Sebastian Hahta's avatar
Sebastian Hahta committed
	popup->setAnchorHeight(150);

	for (int i=0; i<=2; ++i) {
		ftl::codecs::Channel c = static_cast<ftl::codecs::Channel>(i);
		button = new Button(popup, ftl::codecs::name(c));
		button->setFlags(Button::RadioButton);
		//button->setPushed(true);
		button->setVisible(false);
		button->setCallback([this,c]() {
			ftl::gui::Camera *cam = screen_->activeCamera();
			if (cam) {
				cam->setChannel(c);
			}
		});
		channel_buttons_[i] = button;
	}
Sebastian Hahta's avatar
Sebastian Hahta committed

	auto *stereobut = new Button(popup, "Stereo On");
	stereobut->setCallback([this,stereobut]() {
		ftl::gui::Camera *cam = screen_->activeCamera();
		if (cam) {
			cam->setStereo(!cam->isStereo());
			if (cam->isStereo()) {
				stereobut->setCaption("Stereo Off");
			} else {
				stereobut->setCaption("Stereo On");
			}
		}
	});
	

Sebastian Hahta's avatar
Sebastian Hahta committed
	auto *popbutton = new PopupButton(popup, "More");
	popbutton->setSide(Popup::Side::Right);
	popbutton->setChevronIcon(ENTYPO_ICON_CHEVRON_SMALL_RIGHT);
Sebastian Hahta's avatar
Sebastian Hahta committed
	popup = popbutton->popup();
	popup->setLayout(new GroupLayout());
	popup->setTheme(screen->toolbuttheme);
Sebastian Hahta's avatar
Sebastian Hahta committed
	popup->setAnchorHeight(150);
	for (int i=3; i<32; ++i) {
		ftl::codecs::Channel c = static_cast<ftl::codecs::Channel>(i);
		button = new Button(popup, ftl::codecs::name(c));
		button->setFlags(Button::RadioButton);
		//button->setPushed(true);
		button->setVisible(false);
		button->setCallback([this,c]() {
			ftl::gui::Camera *cam = screen_->activeCamera();
			if (cam) {
				cam->setChannel(c);
			}
		});
		channel_buttons_[i] = button;
	}
}
MediaPanel::~MediaPanel() {
Sebastian Hahta's avatar
Sebastian Hahta committed

void MediaPanel::_startRecording(MediaPanel::RecordMode mode) {
	char timestamp[18];
	std::time_t t=std::time(NULL);
	std::strftime(timestamp, sizeof(timestamp), "%F-%H%M%S", std::localtime(&t));

	std::string filename(timestamp);
	switch(mode) {
	case RecordMode::Snapshot2D		: filename += ".png"; break;
	case RecordMode::Snapshot3D		:
	case RecordMode::Video3D		: filename += ".ftl"; break;
	case RecordMode::Video2D		: filename += ".ftl"; break;
	}
	if (mode == RecordMode::Video3D) {
		record_mode_ = mode;
		sourceWindow_->recordVideo(filename);
	} else if (mode == RecordMode::Snapshot2D) {
		screen_->activeCamera()->snapshot(filename);
	} else if (mode == RecordMode::Video2D) {
		record_mode_ = mode;
		screen_->activeCamera()->startVideoRecording(filename);
	}
void MediaPanel::_stopRecording() {
	if (record_mode_ == RecordMode::Video3D) {
		sourceWindow_->stopRecordingVideo();
	} else if (record_mode_ == RecordMode::Video2D) {
		screen_->activeCamera()->stopVideoRecording();
	}
	record_mode_ = RecordMode::None;

// Update button enabled status
void MediaPanel::cameraChanged() {
Sebastian Hahta's avatar
Sebastian Hahta committed
	ftl::gui::Camera *cam = screen_->activeCamera();
	if (cam) {
		auto channels = cam->availableChannels();
		for (int i=0; i<32; ++i) {
			if (channels.has(static_cast<ftl::codecs::Channel>(i))) {
				channel_buttons_[i]->setVisible(true);
			} else {
				channel_buttons_[i]->setVisible(false);
			if (cam->getChannel() == static_cast<ftl::codecs::Channel>(i)) {
				channel_buttons_[i]->setPushed(true);
			} else {
				channel_buttons_[i]->setPushed(false);
Iiro Rastas's avatar
Iiro Rastas committed
			}
		}
	}
}

void MediaPanel::recordWindowClosed() {
	recordbutton_->setEnabled(true);
}