# SPDX-License-Identifier: GPL-2.0-or-later
#
# Copyright (C) 2009 by Torsten Renk
# Copyright (C) 2013 by penta
# Copyright (C) 2022 by Erik Hofman
#
# Based on:
# https://forum.flightgear.org/viewtopic.php?f=6&t=6380&p=53863#p53681
# https://forum.flightgear.org/viewtopic.php?f=19&t=7713&start=15#p180816

var rotatescreen = func(heading_deg, pitch_deg, roll_deg)
{
	setprop("/sim/current-view/goal-heading-offset-deg", heading_deg);
	setprop("/sim/current-view/heading-offset-deg", heading_deg);
	setprop("/sim/current-view/goal-pitch-offset-deg", pitch_deg);
	setprop("/sim/current-view/pitch-offset-deg", pitch_deg);
	setprop("/sim/current-view/goal-roll-offset-deg", roll_deg);
	setprop("/sim/current-view/roll-offset-deg", roll_deg);
}

var takescreen = func(heading_deg, pitch_deg)
{
	print ("taking screen with heading= ", heading_deg, " and pitch= ", pitch_deg);
	var success = fgcommand("screen-capture");
	if (success) 
	{ 
		print ("screen taken with heading= ", heading_deg, " and pitch= ", pitch_deg);
	} 
	else
	{
		print("screen not taken");
	}
}

var i=0;
var j=0;
var k=0;
var tick_time=3;
var width  = getprop("/sim/startup/xsize");
var height = getprop("/sim/startup/ysize");
var menubarvalue=getprop("/sim/menubar/visibility");
var znearvalue=("sim/rendering/camera-group/znear");
var fovvalue=getprop("/sim/current-view/field-of-view");
var freezemvalue=getprop("/sim/freeze/master");
var freezecvalue=getprop("/sim/freeze/clock");
var headingvalue=getprop("/sim/current-view/heading-offset-deg");
var pitchvalue=getprop("/sim/current-view/pitch-offset-deg");
var rollvalue=getprop("/sim/current-view/roll-offset-deg");

var cube_screen_ticks = func()
{
	if (i==0 or i==2)
	{
                roll_deg=0;
		heading_deg=headingvalue;
		if (i==0) pitch_deg=-90;
		else pitch_deg=90;
	}
	else
	{
		pitch_deg=0;
		heading_deg=headingvalue-90*j;
		roll_deg = -270+j*90;
	}
        if (k==0)
	{
		k = 1;
		rotatescreen(heading_deg, pitch_deg, roll_deg);
		settimer(cube_screen_ticks, tick_time, tick_time);
	}
	elsif (k==1)
	{
		if (i<3)
		{
			k = 0;
			takescreen(heading_deg, pitch_deg);
			if (i==0 or i==2) {
				i=i+1;
				settimer(cube_screen_ticks, tick_time, tick_time);
			}
			else if (i==1)
			{
				if (j<3)
				{
					j=j+1;
					settimer(cube_screen_ticks, tick_time, tick_time);
				}
				else {
					i=i+1;
					settimer(cube_screen_ticks, tick_time, tick_time);
				}
			}
		}
		else
		{
			setprop("/sim/menubar/visibility", menubarvalue);
			setprop("/sim/current-view/field-of-view", fovvalue);
			setprop("/sim/current-view/heading-offset-deg", headingvalue);
			setprop("/sim/current-view/pitch-offset-deg", pitchvalue);
			setprop("/sim/freeze/master", freezemvalue);
			setprop("/sim/freeze/clock", freezecvalue);
		}
	}
}

var panorama_screen_ticks = func()
{
	if (i==0) {
		pitch_deg=-45;
	} else {
		pitch_deg=45;
	}
	heading_deg=j*(-90);
	if (k==0)
	{
		k=1;
		rotatescreen(heading_deg, pitch_deg, 0);
		settimer(panorama_screen_ticks, tick_time, tick_time);
	}
	else if (k==1)
	{
		k=0;
		takescreen(heading_deg, pitch_deg);
		if (j!=3)
		{
			j=j+1;
			settimer(panorama_screen_ticks, tick_time, tick_time);
		}
		else
		{
			if (i==0)
			{
				i=i+1;
				j=0;
				settimer(panorama_screen_ticks, tick_time, tick_time);
			}
			else
			{
                                k=2;
				settimer(panorama_screen_ticks, tick_time, tick_time);
			}
		}
	}
	else
	{
		setprop("/sim/menubar/visibility", menubarvalue);
		setprop("/sim/current-view/field-of-view", fovvalue);
		setprop("/sim/current-view/heading-offset-deg", headingvalue);
		setprop("/sim/current-view/pitch-offset-deg", pitchvalue);
		setprop("/sim/current-view/roll-offset-deg", rollvalue);
		setprop("/sim/freeze/master", freezemvalue);
		setprop("/sim/freeze/clock", freezecvalue);
	}
}

var make_cubemap = func()
{
	width  = getprop("/sim/startup/xsize");
	height = getprop("/sim/startup/ysize");
	menubarvalue=getprop("/sim/menubar/visibility");
	znearvalue=("sim/rendering/camera-group/znear");
	fovvalue=getprop("/sim/current-view/field-of-view");
	freezemvalue=getprop("/sim/freeze/master");
	freezecvalue=getprop("/sim/freeze/clock");
	headingvalue=getprop("/sim/current-view/heading-offset-deg");
	pitchvalue=getprop("/sim/current-view/pitch-offset-deg");
	rollvalue=getprop("/sim/current-view/roll-offset-deg");

        setprop("/sim/menubar/visibility", 'false');
        setprop("/sim/rendering/camera-group/znear",0.03);
        setprop("/sim/current-view/field-of-view", 170);
        setprop("/sim/freeze/master",'true');
        setprop("/sim/freeze/clock",'true');

	i=0;
	j=0;
	k=0;
        cube_screen_ticks();
}

var make_panorama = func()
{
	menubarvalue=getprop("/sim/menubar/visibility");
	znearvalue=("sim/rendering/camera-group/znear");
	fovvalue=getprop("/sim/current-view/field-of-view");
	freezemvalue=getprop("/sim/freeze/master");
	freezecvalue=getprop("/sim/freeze/clock");
	headingvalue=getprop("/sim/current-view/heading-offset-deg");
	pitchvalue=getprop("/sim/current-view/pitch-offset-deg");
	rollvalue=getprop("/sim/current-view/roll-offset-deg");

	setprop("/sim/menubar/visibility", 'false');
	setprop("/sim/rendering/camera-group/znear",0.03);
	setprop("/sim/current-view/field-of-view", 120);
	setprop("/sim/freeze/master",'true');
	setprop("/sim/freeze/clock",'true');

	i=0;
	j=0;
	k=0;
	panorama_screen_ticks();
}