# Requires Panotools::Script
# Simple usage:
#   make -f Makefile.equirect.mk equirect_all PTO=myproject.pto

# requirements:
#
# libtiff (tiffcp)
# libpano13 (PTtiff2psd)
# Panotools::Script (erect2cubic jpeg2qtvr erect2planet transform-pano erect2mercator)
# ImageMagick (convert)
# hugin (nona)
# Image::ExifTool (exiftool)

include $(PTO).mk

JPEG_QUALITY = 70
GEOMETRY = $(HUGIN_WIDTH)x$(HUGIN_WIDTH)

ifdef DO_LDR_BLENDED
FUSED_SUFFIX =
else
FUSED_SUFFIX = _fused
endif

equirect_all : qtvr sky planet mercator gpano

.PHONY: equirect_all layered psd qtvr preview panosalado vrml x3d spiv sky planet mercator equirect_clean faces_clean sky_clean planet_clean mercator_clean gpano
.SECONDARY: $(LDR_EXPOSURE_LAYERS_REMAPPED) $(LDR_STACKS) $(LDR_LAYERS)

EQUIRECT_PREFIX = $(LDR_REMAPPED_PREFIX)$(FUSED_SUFFIX)
EQUIRECT_PREFIX_SHELL = $(LDR_REMAPPED_PREFIX_SHELL)$(FUSED_SUFFIX)

# a multilayer TIFF

layered : $(EQUIRECT_PREFIX)_multilayer.tif

# a multilayer PSD

psd : $(EQUIRECT_PREFIX)_multilayer.psd

# a JPEG equirectangular with metadata intact

EQUIRECT_JPEG = $(EQUIRECT_PREFIX).jpg
EQUIRECT_JPEG_SHELL = $(EQUIRECT_PREFIX_SHELL).jpg

$(EQUIRECT_JPEG) : $(EQUIRECT_PREFIX).tif
	convert $(EQUIRECT_PREFIX_SHELL).tif $(EQUIRECT_JPEG_SHELL)
	$(EXIFTOOL_SHELL) -overwrite_original_in_place -TagsFromFile $(EQUIRECT_PREFIX_SHELL).tif $(EXIFTOOL_COPY_ARGS_SHELL) $(EQUIRECT_JPEG_SHELL)

# a set of cubefaces

CUBE_PREFIX = $(EQUIRECT_PREFIX)_cube
CUBE_PREFIX_SHELL = $(EQUIRECT_PREFIX_SHELL)_cube

CUBE_PROJECT = $(CUBE_PREFIX).pto
CUBE_PROJECT_SHELL = $(CUBE_PREFIX_SHELL).pto

JPEG_FACE_0 = $(CUBE_PREFIX)0.jpg
JPEG_FACE_0_SHELL = $(CUBE_PREFIX_SHELL)0.jpg
JPEG_FACE_1 = $(CUBE_PREFIX)1.jpg
JPEG_FACE_1_SHELL = $(CUBE_PREFIX_SHELL)1.jpg
JPEG_FACE_2 = $(CUBE_PREFIX)2.jpg
JPEG_FACE_2_SHELL = $(CUBE_PREFIX_SHELL)2.jpg
JPEG_FACE_3 = $(CUBE_PREFIX)3.jpg
JPEG_FACE_3_SHELL = $(CUBE_PREFIX_SHELL)3.jpg
JPEG_FACE_4 = $(CUBE_PREFIX)4.jpg
JPEG_FACE_4_SHELL = $(CUBE_PREFIX_SHELL)4.jpg
JPEG_FACE_5 = $(CUBE_PREFIX)5.jpg
JPEG_FACE_5_SHELL = $(CUBE_PREFIX_SHELL)5.jpg

JPEG_FACES = $(JPEG_FACE_0) $(JPEG_FACE_1) $(JPEG_FACE_2) \
    $(JPEG_FACE_3) $(JPEG_FACE_4) $(JPEG_FACE_5)
JPEG_FACES_SHELL = $(JPEG_FACE_0_SHELL) $(JPEG_FACE_1_SHELL) \
    $(JPEG_FACE_2_SHELL) $(JPEG_FACE_3_SHELL) \
    $(JPEG_FACE_4_SHELL) $(JPEG_FACE_5_SHELL)

CUBE_ROLL = 0.0
CUBE_PITCH = 0.0
CUBE_YAW = 0.0

$(CUBE_PROJECT) : $(EQUIRECT_PREFIX).tif
	erect2cubic --erect=$(EQUIRECT_PREFIX_SHELL).tif --ptofile=$(CUBE_PROJECT_SHELL) \
	--filespec="JPEG q$(JPEG_QUALITY)" \
	--roll=$(CUBE_ROLL) --pitch=$(CUBE_PITCH) --yaw=$(CUBE_YAW)

$(JPEG_FACE_0) : $(EQUIRECT_PREFIX).tif $(CUBE_PROJECT)
	$(NONA) -p UINT8 -i 0 -o $(JPEG_FACE_0_SHELL) $(CUBE_PROJECT_SHELL)
$(JPEG_FACE_1) : $(EQUIRECT_PREFIX).tif $(CUBE_PROJECT)
	$(NONA) -p UINT8 -i 1 -o $(JPEG_FACE_1_SHELL) $(CUBE_PROJECT_SHELL)
$(JPEG_FACE_2) : $(EQUIRECT_PREFIX).tif $(CUBE_PROJECT)
	$(NONA) -p UINT8 -i 2 -o $(JPEG_FACE_2_SHELL) $(CUBE_PROJECT_SHELL)
$(JPEG_FACE_3) : $(EQUIRECT_PREFIX).tif $(CUBE_PROJECT)
	$(NONA) -p UINT8 -i 3 -o $(JPEG_FACE_3_SHELL) $(CUBE_PROJECT_SHELL)
$(JPEG_FACE_4) : $(EQUIRECT_PREFIX).tif $(CUBE_PROJECT)
	$(NONA) -p UINT8 -i 4 -o $(JPEG_FACE_4_SHELL) $(CUBE_PROJECT_SHELL)
$(JPEG_FACE_5) : $(EQUIRECT_PREFIX).tif $(CUBE_PROJECT)
	$(NONA) -p UINT8 -i 5 -o $(JPEG_FACE_5_SHELL) $(CUBE_PROJECT_SHELL)

# a qvtr file

MOV = $(EQUIRECT_PREFIX).mov
MOV_SHELL = $(EQUIRECT_PREFIX_SHELL).mov

QTVR_NAME = 'Panorama created by hugin'
QTVR_PAN = 0.1
QTVR_TILT = 0.1
QTVR_FOV = 90.0

$(MOV) : faces
	jpeg2qtvr --outfile=$(MOV_SHELL) --prefix=$(CUBE_PREFIX_SHELL) --name=$(QTVR_NAME) \
	 --pan=$(QTVR_PAN) --tilt=$(QTVR_TILT) --fov=$(QTVR_FOV)

# a SPi-V cube strip

SPIV_CUBE = $(EQUIRECT_PREFIX)-SPiV_cube.jpg
SPIV_CUBE_SHELL = $(EQUIRECT_PREFIX_SHELL)-SPiV_cube.jpg

$(SPIV_CUBE) : $(JPEG_FACES)
	convert $(JPEG_FACES_SHELL) +append $(SPIV_CUBE_SHELL)

# a small JPEG preview

EQUIRECT_PREVIEW = $(EQUIRECT_PREFIX)-preview.jpg
EQUIRECT_PREVIEW_SHELL = $(EQUIRECT_PREFIX_SHELL)-preview.jpg

$(EQUIRECT_PREVIEW) : $(EQUIRECT_PREFIX).tif
	convert -geometry 320x160 $(EQUIRECT_PREFIX_SHELL).tif $(EQUIRECT_PREVIEW_SHELL)

# a very simple PanoSalado XML file

PANOSALADO = $(EQUIRECT_PREFIX)-PanoSalado.xml
PANOSALADO_SHELL = $(EQUIRECT_PREFIX_SHELL)-PanoSalado.xml
PANOSALADO_SWF = PanoSalado.swf

$(PANOSALADO) : $(JPEG_FACES) $(EQUIRECT_PREVIEW)
	echo -e $(XML_PANOSALADO) > $(PANOSALADO_SHELL)

XML_PANOSALADO = '<?xml version="1.0"?>\n\
<PanoSalado>\n\
  <layer id="PanoSalado" url="$(PANOSALADO_SWF)?xml=$(PANOSALADO)" depth="0" onStart="loadSpace:myPreview">\n\
    <spaces>\n\
      <space id="myPreview" onTransitionEnd="loadSpace:myPano">\n\
        <sphere id="myPreviewImage">\n\
          <file>$(EQUIRECT_PREVIEW)</file>\n\
        </sphere>\n\
      </space>\n\
      <space id="myPano">\n\
        <cube id="myPanoCubeFaces">\n\
          <file id="front">$(JPEG_FACE_0)</file>\n\
          <file id="right">$(JPEG_FACE_1)</file>\n\
          <file id="back">$(JPEG_FACE_2)</file>\n\
          <file id="left">$(JPEG_FACE_3)</file>\n\
          <file id="top">$(JPEG_FACE_4)</file>\n\
          <file id="bottom">$(JPEG_FACE_5)</file>\n\
        </cube>\n\
      </space>\n\
    </spaces>\n\
  </layer>\n\
</PanoSalado>'

# a very simple VRML file

VRML = $(EQUIRECT_PREFIX).wrl
VRML_SHELL = $(EQUIRECT_PREFIX_SHELL).wrl

$(VRML) : $(JPEG_FACES)
	echo -e $(TXT_VRML) > $(VRML_SHELL)

TXT_VRML = '\#VRML V2.0 utf8\n\
Background {\n\
 frontUrl  "$(JPEG_FACE_0)"\n\
 rightUrl  "$(JPEG_FACE_1)"\n\
 backUrl   "$(JPEG_FACE_2)"\n\
 leftUrl   "$(JPEG_FACE_3)"\n\
 topUrl    "$(JPEG_FACE_4)"\n\
 bottomUrl "$(JPEG_FACE_5)"\n\
}'

# a very simple X3D file

X3D = $(EQUIRECT_PREFIX).x3d
X3D_SHELL = $(EQUIRECT_PREFIX_SHELL).x3d

$(X3D) : $(JPEG_FACES)
	echo -e $(XML_X3D) > $(X3D_SHELL)

XML_X3D = '<?xml version="1.0" encoding="UTF-8"?>\n<!DOCTYPE\
 X3D PUBLIC "ISO//Web3D//DTD X3D 3.0//EN"\
 "http://www.web3d.org/specifications/x3d-3.0.dtd">\n\
<X3D version="3.0" profile="Immersive"\
 xmlns:xsd="http://www.w3.org/2001/XMLSchema-instance"\
 xsd:noNamespaceSchemaLocation="http://www.web3d.org/specifications/x3d-3.0.xsd">\n\
  <Scene>\n\
    <Background\
     frontUrl="$(JPEG_FACE_0)"\
     rightUrl="$(JPEG_FACE_1)"\
     backUrl="$(JPEG_FACE_2)"\
     leftUrl="$(JPEG_FACE_3)"\
     topUrl="$(JPEG_FACE_4)"\
     bottomUrl="$(JPEG_FACE_5)" />\n\
  </Scene>\n\
</X3D>'

# a pto base for stereographic output

PTO_SGRAPHIC = $(EQUIRECT_PREFIX)-sgraphic.pto
PTO_SGRAPHIC_SHELL = $(EQUIRECT_PREFIX_SHELL)-sgraphic.pto

$(PTO_SGRAPHIC) : $(EQUIRECT_PREFIX).tif
	erect2planet $(EQUIRECT_PREFIX_SHELL).tif

# a stereographic view looking up

SKY_PREFIX = $(EQUIRECT_PREFIX)-sky
SKY_PREFIX_SHELL = $(EQUIRECT_PREFIX_SHELL)-sky
PTO_SKY = $(SKY_PREFIX).pto
PTO_SKY_SHELL = $(SKY_PREFIX_SHELL).pto
TIFF_SKY = $(SKY_PREFIX)_0000.tif
TIFF_SKY_SHELL = $(SKY_PREFIX_SHELL)_0000.tif
JPEG_SKY = $(SKY_PREFIX).jpg
JPEG_SKY_SHELL = $(SKY_PREFIX_SHELL).jpg

$(PTO_SKY) : $(PTO_SGRAPHIC)
	transform-pano 0 -90 0 $(PTO_SGRAPHIC_SHELL) $(PTO_SKY_SHELL)

$(TIFF_SKY) : $(PTO_SKY)
	$(NONA) -r ldr -m TIFF_m -i 0 -o $(SKY_PREFIX_SHELL)_ $(PTO_SKY_SHELL)

$(JPEG_SKY) : $(TIFF_SKY)
	convert -quality $(JPEG_QUALITY) $(TIFF_SKY_SHELL) $(JPEG_SKY_SHELL)
	$(EXIFTOOL) -overwrite_original_in_place -TagsFromFile $(INPUT_IMAGE_1_SHELL) \
	$(EXIFTOOL_COPY_ARGS) $(JPEG_SKY_SHELL)

# a stereographic view looking down

PLANET_PREFIX = $(EQUIRECT_PREFIX)-planet
PLANET_PREFIX_SHELL = $(EQUIRECT_PREFIX_SHELL)-planet
PTO_PLANET = $(PLANET_PREFIX).pto
PTO_PLANET_SHELL = $(PLANET_PREFIX_SHELL).pto
TIFF_PLANET = $(PLANET_PREFIX)_0000.tif
TIFF_PLANET_SHELL = $(PLANET_PREFIX_SHELL)_0000.tif
JPEG_PLANET = $(PLANET_PREFIX).jpg
JPEG_PLANET_SHELL = $(PLANET_PREFIX_SHELL).jpg

$(PTO_PLANET) : $(PTO_SGRAPHIC)
	transform-pano 0 90 0 $(PTO_SGRAPHIC_SHELL) $(PTO_PLANET_SHELL)

$(TIFF_PLANET) : $(PTO_PLANET)
	$(NONA) -r ldr -m TIFF_m -i 0 -o $(PLANET_PREFIX_SHELL)_ $(PTO_PLANET_SHELL)

$(JPEG_PLANET) : $(TIFF_PLANET)
	convert -quality $(JPEG_QUALITY) $(TIFF_PLANET_SHELL) $(JPEG_PLANET_SHELL)
	$(EXIFTOOL) -overwrite_original_in_place -TagsFromFile $(INPUT_IMAGE_1_SHELL) \
	$(EXIFTOOL_COPY_ARGS) $(JPEG_PLANET_SHELL)

# a mercator view

MERCATOR_PREFIX = $(EQUIRECT_PREFIX)-mercator
MERCATOR_PREFIX_SHELL = $(EQUIRECT_PREFIX_SHELL)-mercator
PTO_MERCATOR = $(MERCATOR_PREFIX).pto
PTO_MERCATOR_SHELL = $(MERCATOR_PREFIX_SHELL).pto
TIFF_MERCATOR = $(MERCATOR_PREFIX)_0000.tif
TIFF_MERCATOR_SHELL = $(MERCATOR_PREFIX_SHELL)_0000.tif
JPEG_MERCATOR = $(MERCATOR_PREFIX).jpg
JPEG_MERCATOR_SHELL = $(MERCATOR_PREFIX_SHELL).jpg

$(PTO_MERCATOR) : $(EQUIRECT_PREFIX).tif
	erect2mercator $(EQUIRECT_PREFIX_SHELL).tif

$(TIFF_MERCATOR) : $(PTO_MERCATOR)
	$(NONA) -r ldr -m TIFF_m -i 0 -o $(MERCATOR_PREFIX_SHELL)_ $(PTO_MERCATOR_SHELL)

$(JPEG_MERCATOR) : $(TIFF_MERCATOR)
	convert -quality $(JPEG_QUALITY) $(TIFF_MERCATOR_SHELL) $(JPEG_MERCATOR_SHELL)
	$(EXIFTOOL) -overwrite_original_in_place -TagsFromFile $(INPUT_IMAGE_1_SHELL) \
	$(EXIFTOOL_COPY_ARGS) $(JPEG_MERCATOR_SHELL)

# This Makefile is only useful for equirectangular
ifeq ($(HUGIN_PROJECTION),2)
gpano : $(EQUIRECT_JPEG)
faces : $(JPEG_FACES)
qtvr : $(MOV)
spiv : $(SPIV_CUBE)
panosalado : $(PANOSALADO)
vrml : $(VRML)
x3d : $(X3D)
preview : $(EQUIRECT_PREVIEW)
sky : $(JPEG_SKY)
planet : $(JPEG_PLANET)
mercator : $(JPEG_MERCATOR)
else
equirect_all faces qtvr spiv panosalado vrml x3d preview sky planet mercator :
endif

# cleanup

equirect_clean : faces_clean sky_clean planet_clean mercator_clean

faces_clean :
	$(RM) -f $(JPEG_FACES_SHELL) $(CUBE_PROJECT_SHELL)
sky_clean :
	$(RM) -f $(TIFF_SKY_SHELL)
planet_clean :
	$(RM) -f $(TIFF_PLANET_SHELL)
mercator_clean :
	$(RM) -f $(TIFF_MERCATOR_SHELL)