Browse Source

first commit

xun 2 months ago
commit
f8a61d8eb3
100 changed files with 8028 additions and 0 deletions
  1. 34 0
      .htaccess
  2. 21 0
      add.php
  3. 28 0
      captcha.php
  4. 37 0
      config/config.php
  5. 4 0
      crossdomain.xml
  6. 0 0
      data/article/index.htm
  7. 0 0
      data/avatar/user/index.htm
  8. 0 0
      data/json/index.htm
  9. 49 0
      data/krpano/Convert CUBE to SPHERE droplet.bat
  10. 32 0
      data/krpano/Convert SPHERE to CUBE droplet.bat
  11. 11 0
      data/krpano/ENCRYPT XML droplet.bat
  12. 20 0
      data/krpano/MAKE OBJECT droplet.bat
  13. 20 0
      data/krpano/MAKE PANO (FLAT) droplet.bat
  14. 20 0
      data/krpano/MAKE PANO (MULTIRES) droplet.bat
  15. 20 0
      data/krpano/MAKE PANO (NORMAL) droplet.bat
  16. 20 0
      data/krpano/MAKE PANO (SINGLE-SWF) droplet.bat
  17. 20 0
      data/krpano/MAKE VTOUR (MULTIRES) droplet.bat
  18. BIN
      data/krpano/krpano Testing Server.exe
  19. BIN
      data/krpano/krpano Tools.exe
  20. BIN
      data/krpano/krpanotools32.exe
  21. BIN
      data/krpano/krpanotools64.exe
  22. 189 0
      data/krpano/license.txt
  23. 21 0
      data/krpano/make-run-first-time.bat
  24. 21 0
      data/krpano/make.bat
  25. 2928 0
      data/krpano/releasenotes.txt
  26. 14 0
      data/krpano/templates/basicsettings.config
  27. 93 0
      data/krpano/templates/convertdroplets.config
  28. 11 0
      data/krpano/templates/defaultbuttons.skin
  29. 69 0
      data/krpano/templates/flat.config
  30. 39 0
      data/krpano/templates/html/embedpano-inline-js-singleswf.html
  31. 29 0
      data/krpano/templates/html/embedpano.html
  32. 47 0
      data/krpano/templates/html/tour_editor.html
  33. 56 0
      data/krpano/templates/multiframe.config
  34. 70 0
      data/krpano/templates/multires.config
  35. 60 0
      data/krpano/templates/normal.config
  36. 56 0
      data/krpano/templates/object.config
  37. 5 0
      data/krpano/templates/panoonly.skin
  38. 55 0
      data/krpano/templates/singleswf.config
  39. 77 0
      data/krpano/templates/vtour-multires.config
  40. 71 0
      data/krpano/templates/vtour-normal.config
  41. 40 0
      data/krpano/templates/vtourskin118.skin
  42. 49 0
      data/krpano/templates/vtourskin119.skin
  43. 14 0
      data/krpano/templates/xml/default.xml
  44. 13 0
      data/krpano/templates/xml/flat.xml
  45. BIN
      data/krpano/templates/xml/krpano_default_flares.jpg
  46. 9 0
      data/krpano/templates/xml/multiframe.xml
  47. 7 0
      data/krpano/templates/xml/object.xml
  48. 9 0
      data/krpano/templates/xml/panoonly.xml
  49. 5 0
      data/krpano/templates/xml/plugins/bingmaps.js
  50. BIN
      data/krpano/templates/xml/plugins/bingmaps.swf
  51. 33 0
      data/krpano/templates/xml/plugins/combobox.js
  52. BIN
      data/krpano/templates/xml/plugins/combobox.swf
  53. 4 0
      data/krpano/templates/xml/plugins/compass.js
  54. BIN
      data/krpano/templates/xml/plugins/editor.swf
  55. 37 0
      data/krpano/templates/xml/plugins/fps.xml
  56. 5 0
      data/krpano/templates/xml/plugins/googlemaps.js
  57. 18 0
      data/krpano/templates/xml/plugins/gyro.js
  58. 5 0
      data/krpano/templates/xml/plugins/gyro2.js
  59. 9 0
      data/krpano/templates/xml/plugins/moretweentypes.js
  60. BIN
      data/krpano/templates/xml/plugins/moretweentypes.swf
  61. BIN
      data/krpano/templates/xml/plugins/options.swf
  62. 13 0
      data/krpano/templates/xml/plugins/radar.js
  63. BIN
      data/krpano/templates/xml/plugins/radar.swf
  64. 18 0
      data/krpano/templates/xml/plugins/scrollarea.js
  65. BIN
      data/krpano/templates/xml/plugins/scrollarea.swf
  66. 209 0
      data/krpano/templates/xml/plugins/showtext.xml
  67. 11 0
      data/krpano/templates/xml/plugins/snow.js
  68. BIN
      data/krpano/templates/xml/plugins/snow.swf
  69. 5 0
      data/krpano/templates/xml/plugins/soundinterface.js
  70. BIN
      data/krpano/templates/xml/plugins/soundinterface.swf
  71. BIN
      data/krpano/templates/xml/plugins/textfield.swf
  72. 5 0
      data/krpano/templates/xml/plugins/videoplayer.js
  73. BIN
      data/krpano/templates/xml/plugins/videoplayer.swf
  74. BIN
      data/krpano/templates/xml/plugins/vtoureditor.swf
  75. 5 0
      data/krpano/templates/xml/plugins/webvr.js
  76. 892 0
      data/krpano/templates/xml/plugins/webvr.xml
  77. BIN
      data/krpano/templates/xml/plugins/webvr_cursor_80x80_17f.png
  78. BIN
      data/krpano/templates/xml/skin/androidbuttons.png
  79. 16 0
      data/krpano/templates/xml/skin/androidskin.xml
  80. BIN
      data/krpano/templates/xml/skin/arrow.png
  81. BIN
      data/krpano/templates/xml/skin/black.png
  82. BIN
      data/krpano/templates/xml/skin/buttons-2.png
  83. BIN
      data/krpano/templates/xml/skin/buttons.jpg
  84. BIN
      data/krpano/templates/xml/skin/buttons.png
  85. BIN
      data/krpano/templates/xml/skin/cardboard_logo.png
  86. 173 0
      data/krpano/templates/xml/skin/defaultskin.xml
  87. BIN
      data/krpano/templates/xml/skin/drag-cursors-2.png
  88. BIN
      data/krpano/templates/xml/skin/drag-cursors.png
  89. 55 0
      data/krpano/templates/xml/skin/flatpano_setup.xml
  90. 69 0
      data/krpano/templates/xml/skin/flatskin.xml
  91. 38 0
      data/krpano/templates/xml/skin/multiframeskin.xml
  92. 142 0
      data/krpano/templates/xml/skin/objectskin.xml
  93. BIN
      data/krpano/templates/xml/skin/qtvr-bar.png
  94. BIN
      data/krpano/templates/xml/skin/qtvr-cursors.png
  95. BIN
      data/krpano/templates/xml/skin/rotate_device.png
  96. 765 0
      data/krpano/templates/xml/skin/videointerface.xml
  97. BIN
      data/krpano/templates/xml/skin/videointerface_skin.png
  98. BIN
      data/krpano/templates/xml/skin/vtourskin.png
  99. 1108 0
      data/krpano/templates/xml/skin/vtourskin.xml
  100. 0 0
      data/krpano/templates/xml/skin/vtourskin118.png

+ 34 - 0
.htaccess

@@ -0,0 +1,34 @@
+<FilesMatch "\.(bak|inc|lib|sh|tpl|lbi|dwt|conf)$">
+    order deny,allow
+    deny from all
+</FilesMatch>
+
+RewriteEngine On
+RewriteBase /
+
+<Files *>
+  Options -Indexes	 
+</Files>
+
+RewriteCond %{http_host} ^krpano100.com$ [nc]   
+RewriteRule ^(.*)$ http://www.krpano100.com/$1 [r=301,nc]
+
+RewriteRule ^passport/$                                  /passport\.php        		[QSA,L]
+RewriteRule ^passport/([a-zA-Z0-9_]+)$                   /passport.\php?module=$1   [QSA,L] 
+RewriteRule ^passport/([a-zA-Z0-9_]+)?redirectUrl=(.*)$               /passport.\php?module=$1&redirectUrl=$2     [QSA,L]
+
+RewriteRule ^member/$                                  /member\.php        		[QSA,L]
+RewriteRule ^member/([a-zA-Z0-9_]+)$                   /member.\php?module=$1   [QSA,L] 
+
+RewriteRule ^tour/([a-zA-Z0-9_]+)$                   /tour.\php?view_uuid=$1   [QSA,L]  
+
+RewriteRule ^edit/$                                  /edit\.php        		[QSA,L]
+RewriteRule ^edit/([a-zA-Z0-9_]+)$                   /edit.\php?module=$1   [QSA,L] 
+
+RewriteRule ^add/$                                  /add\.php        		[QSA,L]
+RewriteRule ^add/([a-zA-Z0-9_]+)$                   /add.\php?module=$1   [QSA,L] 
+
+RewriteRule ^index\.html$                            /index.\php        [QSA,L]
+RewriteRule ^([a-zA-Z0-9_]+)$                   /index.\php?module=$1   [QSA,L] 
+RewriteRule ^people/([0-9]+)$                   /index.\php?module=people&uid=$1   [QSA,L] 
+

+ 21 - 0
add.php

@@ -0,0 +1,21 @@
+<?php
+//添加项目(图片、视频)入口文件
+define('IN_T',true);
+require 'source/include/init.php';
+//未登录
+if($user['pk_user_main']<=0){
+   Common::base_header("Location:".$_lang['host']."passport/login?redirectUrl=/member/$module\n");
+}
+//请求模块
+$module = isset($_REQUEST['module']) ? Common::sfilter($_REQUEST['module']) : 'pic';
+
+if(file_exists($module_file= 'module/add/'.$module.'.php')){ 
+   require $module_file;
+   $tp->assign('module',$module);
+   $tp->assign('limit_num',Transaction::get_user_projects_limit($user['pk_user_main']));
+   $tp->display('add/add.tpl');
+}
+else{
+   die('hacking attempt');
+}
+?>

+ 28 - 0
captcha.php

@@ -0,0 +1,28 @@
+<?php
+/**
+ * 生成验证码
+ * Author:yuanjiang
+ * Release Date: 2013-8-28
+ **/
+header("Cache-Control: no-cache, must-revalidate");
+header("Pragma: no-cache");
+
+define('IN_T', true);
+
+require('./source/include/init.php');
+require('./source/include/cls_captcha.php');
+
+$act = Common::sfilter($_REQUEST['act']);
+
+if(!empty($act)){
+	$rsi = new Captcha();
+	$rsi->TFontSize=array(15,20);
+	$rsi->Width=60;
+	$rsi->Height=32;
+	$code = $rsi->RandRSI();
+	$_SESSION['captcha'][$act] = md5(strtolower($code));
+	$rsi->Draw();
+	exit;
+}
+
+?>

+ 37 - 0
config/config.php

@@ -0,0 +1,37 @@
+<?php
+/*
+ * 配置信息
+ * @author yuanjiang 02.16.2013 
+*/
+if(!defined('IN_T'))
+{
+   die('hacking attempt');
+} 
+
+/* 设置编码 */
+header("Content-type:text/html; charset=utf-8");
+
+/*设置时区 东八区*/
+date_default_timezone_set('Asia/Chongqing');
+
+/* php错误报告 */
+error_reporting(E_ALL^E_WARNING^E_NOTICE);
+
+/* 数据库配置 */
+$db_type = 'mysql';   //数据库类型
+
+$db_host = '127.0.0.1';
+
+$db_user = 'root';
+
+$db_pass =  'root';
+
+$db_port = 3306;
+
+$db_charset = 'utf8';  //编码
+
+$db_name = 'krpano100';  
+
+$db_prefix  = 'u_';    //表前缀
+
+?>

+ 4 - 0
crossdomain.xml

@@ -0,0 +1,4 @@
+<?xml version="1.0"?> 
+<cross-domain-policy><site-control permitted-cross-domain-policies="master-only"/> 
+<allow-access-from domain="*"/> 
+</cross-domain-policy>

+ 0 - 0
data/article/index.htm


+ 0 - 0
data/avatar/user/index.htm


+ 0 - 0
data/json/index.htm


+ 49 - 0
data/krpano/Convert CUBE to SPHERE droplet.bat

@@ -0,0 +1,49 @@
+@echo off
+echo Convert CUBE to SPHERE droplet
+echo.
+
+SET /A COUNT=0
+FOR %%V in (%*) DO SET /A COUNT=COUNT+1
+
+IF NOT %COUNT% == 6 GOTO ERROR
+IF "%~1" == "" GOTO ERROR
+IF "%~2" == "" GOTO ERROR
+IF "%~3" == "" GOTO ERROR
+IF "%~4" == "" GOTO ERROR
+IF "%~5" == "" GOTO ERROR
+IF "%~6" == "" GOTO ERROR
+IF NOT EXIST "%~1" GOTO ERROR
+IF NOT EXIST "%~2" GOTO ERROR
+IF NOT EXIST "%~3" GOTO ERROR
+IF NOT EXIST "%~4" GOTO ERROR
+IF NOT EXIST "%~5" GOTO ERROR
+IF NOT EXIST "%~6" GOTO ERROR
+
+set KRPANOTOOLSEXE=krpanotools64.exe
+if "%PROCESSOR_ARCHITECTURE%" == "x86" set KRPANOTOOLSEXE=krpanotools32.exe
+
+"%~dp0\%KRPANOTOOLSEXE%" cube2sphere -config=templates\convertdroplets.config "%~1" "%~2" "%~3" "%~4" "%~5" "%~6"
+GOTO DONE
+
+:ERROR
+echo.
+echo Usage:
+echo.
+echo - Drag and drop cubical panorama images on this droplet
+echo   to convert them to spherical panorama images.
+echo.
+echo - The cubical images must have suffixes like "_l", "_f" 
+echo   or "left", "front" in their filename to allow an 
+echo   automatic identifcation of the cubeside.
+echo.
+echo.
+echo Settings:
+echo.
+echo - See the "convertdroplets.config" file for settings 
+echo   regarding output imageformat or compression.
+echo.
+echo.
+
+:DONE
+echo.
+pause

+ 32 - 0
data/krpano/Convert SPHERE to CUBE droplet.bat

@@ -0,0 +1,32 @@
+@echo off
+echo Convert SPHERE to CUBE droplet
+echo.
+
+IF "%~1" == "" GOTO ERROR
+IF NOT EXIST "%~1" GOTO ERROR
+
+set KRPANOTOOLSEXE=krpanotools64.exe
+if "%PROCESSOR_ARCHITECTURE%" == "x86" set KRPANOTOOLSEXE=krpanotools32.exe
+
+FOR %%V in (%*) do "%~dp0\%KRPANOTOOLSEXE%" sphere2cube -config=templates\convertdroplets.config "%%~V"
+
+GOTO DONE
+
+:ERROR
+echo.
+echo Usage:
+echo.
+echo - Drag and drop spherical panorama images on this droplet
+echo   to convert them to cubical panorama images.
+echo.
+echo.
+echo Settings:
+echo.
+echo - See the "convertdroplets.config" file for settings 
+echo   regarding output imageformat or compression.
+echo.
+echo.
+
+:DONE
+echo.
+pause

+ 11 - 0
data/krpano/ENCRYPT XML droplet.bat

@@ -0,0 +1,11 @@
+@echo off
+echo ENCRYPT XML droplet
+echo.
+
+set KRPANOTOOLSEXE=krpanotools64.exe
+if "%PROCESSOR_ARCHITECTURE%" == "x86" set KRPANOTOOLSEXE=krpanotools32.exe
+
+"%~dp0\%KRPANOTOOLSEXE%" encrypt -h5 -z -bk %*
+
+echo.
+pause

+ 20 - 0
data/krpano/MAKE OBJECT droplet.bat

@@ -0,0 +1,20 @@
+@echo off
+echo MAKE OBJECT droplet
+
+IF "%~1" == "" GOTO ERROR
+IF NOT EXIST "%~1" GOTO ERROR
+
+set KRPANOTOOLSEXE=krpanotools64.exe
+if "%PROCESSOR_ARCHITECTURE%" == "x86" set KRPANOTOOLSEXE=krpanotools32.exe
+
+"%~dp0\%KRPANOTOOLSEXE%" makepano "%~dp0\templates\object.config" %*
+GOTO DONE
+
+:ERROR
+echo.
+echo Drag and drop all object images on thie droplet to create 
+echo automatically a multiresolution object movie from it.
+
+:DONE
+echo.
+pause

+ 20 - 0
data/krpano/MAKE PANO (FLAT) droplet.bat

@@ -0,0 +1,20 @@
+@echo off
+echo MAKE PANO (FLAT) droplet
+
+IF "%~1" == "" GOTO ERROR
+IF NOT EXIST "%~1" GOTO ERROR
+
+set KRPANOTOOLSEXE=krpanotools64.exe
+if "%PROCESSOR_ARCHITECTURE%" == "x86" set KRPANOTOOLSEXE=krpanotools32.exe
+
+"%~dp0\%KRPANOTOOLSEXE%" makepano "%~dp0\templates\flat.config" %*
+GOTO DONE
+
+:ERROR
+echo.
+echo Drag and drop panoramic images on this droplet to create 
+echo automatically flat multiresolution panoramas from it.
+
+:DONE
+echo.
+pause

+ 20 - 0
data/krpano/MAKE PANO (MULTIRES) droplet.bat

@@ -0,0 +1,20 @@
+@echo off
+echo MAKE PANO (MULTIRES) droplet
+
+IF "%~1" == "" GOTO ERROR
+IF NOT EXIST "%~1" GOTO ERROR
+
+set KRPANOTOOLSEXE=krpanotools64.exe
+if "%PROCESSOR_ARCHITECTURE%" == "x86" set KRPANOTOOLSEXE=krpanotools32.exe
+
+"%~dp0\%KRPANOTOOLSEXE%" makepano "%~dp0\templates\multires.config" %*
+GOTO DONE
+
+:ERROR
+echo.
+echo Drag and drop panoramic images on this droplet to create 
+echo automatically multiresolution panoramas from it.
+
+:DONE
+echo.
+pause

+ 20 - 0
data/krpano/MAKE PANO (NORMAL) droplet.bat

@@ -0,0 +1,20 @@
+@echo off
+echo MAKE PANO (NORMAL) droplet
+
+IF "%~1" == "" GOTO ERROR
+IF NOT EXIST "%~1" GOTO ERROR
+
+set KRPANOTOOLSEXE=krpanotools64.exe
+if "%PROCESSOR_ARCHITECTURE%" == "x86" set KRPANOTOOLSEXE=krpanotools32.exe
+
+"%~dp0\%KRPANOTOOLSEXE%" makepano "%~dp0\templates\normal.config" %*
+GOTO DONE
+
+:ERROR
+echo.
+echo Drag and drop panoramic images to create automatically 
+echo normal (not-tiled, not-multiresolution) panoramas from it.
+
+:DONE
+echo.
+pause

+ 20 - 0
data/krpano/MAKE PANO (SINGLE-SWF) droplet.bat

@@ -0,0 +1,20 @@
+@echo off
+echo MAKE PANO (SINGLE-SWF) droplet
+
+IF "%~1" == "" GOTO ERROR
+IF NOT EXIST "%~1" GOTO ERROR
+
+set KRPANOTOOLSEXE=krpanotools64.exe
+if "%PROCESSOR_ARCHITECTURE%" == "x86" set KRPANOTOOLSEXE=krpanotools32.exe
+
+"%~dp0\%KRPANOTOOLSEXE%" makepano "%~dp0\templates\singleswf.config" %*
+GOTO DONE
+
+:ERROR
+echo.
+echo Drag and drop panoramic images to create automatically 
+echo single swf files from it.
+
+:DONE
+echo.
+pause

+ 20 - 0
data/krpano/MAKE VTOUR (MULTIRES) droplet.bat

@@ -0,0 +1,20 @@
+@echo off
+echo MAKE VTOUR (MULTIRES) droplet
+
+IF "%~1" == "" GOTO ERROR
+IF NOT EXIST "%~1" GOTO ERROR
+
+set KRPANOTOOLSEXE=krpanotools64.exe
+if "%PROCESSOR_ARCHITECTURE%" == "x86" set KRPANOTOOLSEXE=krpanotools32.exe
+
+"%~dp0\%KRPANOTOOLSEXE%" makepano "%~dp0\templates\vtour-multires.config" %*
+GOTO DONE
+
+:ERROR
+echo.
+echo Drag and drop several panoramic images on this droplet to create 
+echo automatically a simple virtual tour with multires panos from it.
+
+:DONE
+echo.
+pause

BIN
data/krpano/krpano Testing Server.exe


BIN
data/krpano/krpano Tools.exe


BIN
data/krpano/krpanotools32.exe


BIN
data/krpano/krpanotools64.exe


+ 189 - 0
data/krpano/license.txt

@@ -0,0 +1,189 @@
+krpano.com - License Usage and License Agreement
+===============================================================================
+
+Files Overview:
+
+  Viewer Software:
+   o krpano.js    - krpano HTML5 Viewer (+krpano Embedding Script)
+   o krpano.swf   - krpano Flash Viewer
+   o plugins/*    - krpano Plugins: .js - HTML5, .swf - Flash, .xml - both
+
+  Tools Software:
+   o All applications, batch/script files and droplets.
+
+  Examples/Skins:
+   o All files in the examples, templates or skin folders.
+   o These files can be freely used and modified.
+
+
+-------------------------------------------------------------------------------
+
+LICENSE AGREEMENT
+
+  Terms and Conditions
+
+  1. All copyrights to krpano are exclusively owned by the krpano GmbH.
+
+  2. The krpano software is protected by copyright laws and international
+     copyright treaties, as well as other intellectual property laws and
+     treaties.
+
+  3. This license is a legal and binding agreement between you and the krpano
+     GmbH. Using the krpano software signifies that you have read, understand
+     and accept the terms and conditions of this license agreement. Any
+     unauthorized use of krpano shall result in immediate termination of this
+     license and may result in criminal and/or civil prosecution.
+
+  4. You may not modify, clone, decompile, disassemble, reverse engineer or
+     create derivative works based upon krpano.
+
+  5. Your krpano license grants you the right to sell and distribute projects
+     containing your licensed version of krpano.
+
+  6. Third parties may not use your licensed version of krpano to create new
+     projects, including modified versions of your projects.
+
+  7. You may not rent, lease, lend or sublicense krpano.
+
+  8. Offering your licensed krpano version to third parties on a hosting
+     platform is not allowed without 'krpano Hosting License'.
+
+  9. The krpano entry in the context menu may not be removed, suppressed,
+     altered, disabled or covered in any way without owning the additional
+     'krpano Branding Free License'.
+
+  10. krpano is provided "As Is" without warranty of any kind, either express
+      or implied, including any warranty of quality, merchantability, or
+      fitness for a particular purpose. In no event will the krpano GmbH be
+      liable for loss of data, costs of procurement of substitute goods or
+      services or any special, consequential or incidental damages, under any
+      cause of action and regardless of whether or not the krpano GmbH have
+      been advised of the possibility of such damage. This limitation will
+      apply notwithstanding any failure of essential purpose of any limited
+      remedy provided herein. In any event the krpano GmbH will have liability
+      arising out of this agreement.
+
+  11. All rights not expressly granted here are reserved by the krpano GmbH.
+
+
+-------------------------------------------------------------------------------
+
+ACKNOWLEDGMENTS / THIRD-PARTY LIBRARY LICENSES
+
+  krpano includes a number of third-party libraries that are used to provide
+  certain features. Here the copyright licenses of these libraries:
+
+
+  o zlib Copyright and License Agreement
+
+    Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler
+
+    This software is provided 'as-is', without any express or implied
+    warranty. In no event will the authors be held liable for any damages
+    arising from the use of this software.
+
+    Permission is granted to anyone to use this software for any purpose,
+    including commercial applications, and to alter it and redistribute it
+    freely, subject to the following restrictions:
+
+    1. The origin of this software must not be misrepresented; you must not
+       claim that you wrote the original software. If you use this software
+       in a product, an acknowledgment in the product documentation would be
+       appreciated but is not required.
+    2. Altered source versions must be plainly marked as such, and must not be
+       misrepresented as being the original software.
+    3. This notice may not be removed or altered from any source distribution.
+
+    Jean-loup Gailly        Mark Adler
+    jloup@gzip.org          madler@alumni.caltech.edu
+
+
+  o LibJPEG Copyright and License Agreement
+
+    The authors make NO WARRANTY or representation, either express or implied,
+    with respect to this software, its quality, accuracy, merchantability, or
+    fitness for a particular purpose.  This software is provided "AS IS", and
+    you, its user, assume the entire risk as to its quality and accuracy.
+
+    This software is copyright (C) 1991-1998, Thomas G. Lane.
+
+    All Rights Reserved except as specified below.
+
+    Permission is hereby granted to use, copy, modify, and distribute this
+    software (or portions thereof) for any purpose, without fee, subject to
+    these conditions:
+
+    1. If any part of the source code for this software is distributed, then
+       this README file must be included, with this copyright and no-warranty
+       notice unaltered; and any additions, deletions, or changes to the
+       original files must be clearly indicated in accompanying documentation.
+    2. If only executable code is distributed, then the accompanying
+       documentation must state that "this software is based in part on the
+       work of the Independent JPEG Group".
+    3. Permission for use of this software is granted only if the user accepts
+       full responsibility for any undesirable consequences; the authors accept
+       NO LIABILITY for damages of any kind.
+
+    These conditions apply to any software derived from or based on the IJG
+    code, not just to the unmodified library.  If you use our work, you ought
+    to acknowledge us.
+    Permission is NOT granted for the use of any IJG author's name or company
+    name in advertising or publicity relating to this software or products
+    derived from it.  This software may be referred to only as "the
+    Independent JPEG Group's software".
+    We specifically permit and encourage the use of this software as the basis
+    of commercial products, provided that all warranty or liability claims are
+    assumed by the product vendor.
+
+
+  o LibTIFF Copyright and License Agreement
+
+    Use and Copyright
+
+    Copyright© 1988-1997 Sam Leffler
+    Copyright© 1991-1997 Silicon Graphics, Inc.
+
+    Permission to use, copy, modify, distribute, and sell this software and
+    its documentation for any purpose is hereby granted without fee, provided
+    that (i) the above copyright notices and this permission notice appear in
+    all copies of the software and related documentation, and (ii) the names
+    of Sam Leffler and Silicon Graphics may not be used in any advertising or
+    publicity relating to the software without the specific, prior written
+    permission of Sam Leffler and Silicon Graphics.
+
+    THE SOFTWARE IS PROVIDED "AS-IS" AND WITHOUT WARRANTY OF ANY KIND,
+    EXPRESS, IMPLIED OR OTHERWISE, INCLUDING WITHOUT LIMITATION, ANY WARRANTY
+    OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE.
+    IN NO EVENT SHALL SAM LEFFLER OR SILICON GRAPHICS BE LIABLE FOR ANY
+    SPECIAL, INCIDENTAL, INDIRECT OR CONSEQUENTIAL DAMAGES OF ANY KIND, OR ANY
+    DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER OR
+    NOT ADVISED OF THE POSSIBILITY OF DAMAGE, AND ON ANY THEORY OF LIABILITY,
+    ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
+    SOFTWARE.
+
+
+  o mongoose Copyright and License Agreement
+
+    Copyright (c) 2004-2010 Sergey Lyubka
+
+    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.
+
+
+===============================================================================
+                                                 Copyright (c) 2016 krpano GmbH

+ 21 - 0
data/krpano/make-run-first-time.bat

@@ -0,0 +1,21 @@
+@echo off
+echo MAKE VTOUR (NORMAL) droplet
+
+IF "%~1" == "" GOTO ERROR
+IF NOT EXIST "%~1" GOTO ERROR
+
+set KRPANOTOOLSEXE=krpanotools64.exe
+if "%PROCESSOR_ARCHITECTURE%" == "x86" set KRPANOTOOLSEXE=krpanotools32.exe
+
+"%~dp0\%KRPANOTOOLSEXE%" register "ruza4tk2X4MdHuE7djJQGr9QTftMFHiSH2ac5jkIlFgGqG0K0IVQnh5vF/cicLpwedsURI0QTg+UluEgysRLUytpeVFyBTxdwREEIGquRh1Hp2BY2EtZ8kdO2r6CHLJAFlzY5w6au1rnHwRhJXgaK8J75RwK1DYb/OEZ4tD2pniUrnMrpFwGWwcKnxGyNSmMktsU6qadFjKbMH3HUKNXa7Y59lEzbDZJbsTuP+UynwwBhogv8K+byjs2LDvU48sx4/CNHWi26g==" makepano "%~dp0\templates\vtour-normal.config" %*
+GOTO DONE
+
+:ERROR
+echo.
+echo error
+exit
+
+:DONE
+echo.
+echo success
+exit

+ 21 - 0
data/krpano/make.bat

@@ -0,0 +1,21 @@
+@echo off
+echo MAKE VTOUR (NORMAL) droplet
+
+IF "%~1" == "" GOTO ERROR
+IF NOT EXIST "%~1" GOTO ERROR
+
+set KRPANOTOOLSEXE=krpanotools64.exe
+if "%PROCESSOR_ARCHITECTURE%" == "x86" set KRPANOTOOLSEXE=krpanotools32.exe
+
+"%~dp0\%KRPANOTOOLSEXE%" makepano "%~dp0\templates\vtour-normal.config" %*
+GOTO DONE
+
+:ERROR
+echo.
+echo error
+exit
+
+:DONE
+echo.
+echo success
+exit

File diff suppressed because it is too large
+ 2928 - 0
data/krpano/releasenotes.txt


+ 14 - 0
data/krpano/templates/basicsettings.config

@@ -0,0 +1,14 @@
+# Basic Settings
+# Documentation: http://krpano.com/tools/kmakemultires/config?version=119
+# krpano 1.19
+
+
+# image filtering and compression settings
+filter=LANCZOS
+jpegquality=82
+jpegsubsamp=422
+jpegoptimize=true
+
+
+# protection settings (nomb = no Flashplayer menubar for standalone swf)
+kprotectclparameters=-nomb

+ 93 - 0
data/krpano/templates/convertdroplets.config

@@ -0,0 +1,93 @@
+# convertdroplets.config
+# config file for the "Convert to" droplets
+# krpano 1.18
+
+
+[Convert SPHERE to CUBE]
+cubeformat=CUBE
+cubesize=auto
+outputformat=tif
+tiffcompress=lzw
+jpegquality=85
+jpegsubsamp=422
+jpegoptimize=true
+fast=false
+
+
+[Convert CUBE to SPHERE]
+spheresize=auto
+outputformat=tif
+tiffcompress=lzw
+jpegquality=98
+jpegsubsamp=444
+jpegoptimize=false
+fast=false
+
+
+#------------------------------------------------------------------------------
+# convertdroplets.config settings documentation:
+#
+# * cubeformat (SPHERE to CUBE only)
+#   - the destination cube format
+#   - possible settings:
+#       CUBE = standard 6 separated cube side images
+#       VCUBE = vertical cube imagestrip
+#       HCUBE = horizontal cube imagestrip
+#       CUBE32 = 3x2 cube imagestrip
+#       CUBE23 = 2x3 cube imagestrip
+#
+# * cubesize (SPHERE to CUBE only)
+#   - output cube size [cubesize]
+#   - width or height of a cube side
+#   - use "auto" for automatic using: 
+#            cubesize = spherewidth / PI
+#
+# * spheresize (CUBE to SPHERE only)
+#   - output sphere size [width]x[height] 
+#   - use "auto" for automatic using: 
+#            spherewidth  = cubesize * PI
+#            sphereheight = spherewidth/2
+#
+# * outputformat
+#   - the output image fileformat 
+#   - supported image fileformats:
+#      - kro             = Kolor RAW (no limits, default)
+#      - tif,tiff        = TIFF (max. filesize 4GB)
+#      - btf,tf8,bigtiff = BigTIFF (no limits)
+#      - psd             = Photoshop Document (max. size 30000x30000)
+#      - psb             = Photoshop Big Document (max. size 300000x300000)
+#      - jpg,jpeg        = JPEG (max. size 30000x30000)
+#
+# * tiffcompress
+#   - the tiff compressionen method (only for tiff or bigtiff outputs)
+#   - possible settings: none, lzw, zip or jpeg
+#
+# * jpegquality
+#   - the jpeg compression quality (only for jpeg or tiff/jpeg outputs)
+#   - from 0 (worst quality/smallest file) to 100 (best quality/biggest file)
+#
+# * jpegsubsamp
+#   - jpeg color subsampling to reduce file size
+#   - more informations: http://en.wikipedia.org/wiki/Chroma_subsampling
+#   - possible values:
+#     444 = no color subsampling                              (best quality)
+#     422 = 1/2 horizontal color subsampling                  (good compromise)
+#     420 = 1/2 horizontal and vertical color subsampling     (the jpeg default)
+#     411 = 1/4 horizontal and 1/2 vertical color subsampling (smallest)
+#
+# * jpegoptimize
+#   - optimize the jpeg huffman compression tables
+#   - can result a smaller image but requires much more memory and it is slower
+#   - if memory usage is critical (on very large images) it should be disabled
+#
+# * jpegprogressive
+#   - use progressive jpeg compression
+#   - Warning - the jpeg decoding can be slower when used!
+#
+# * fast
+#   - faster but lower quality converting (e.g. use for quick previews)
+#   - only linear interpolation, no subsampling on reducing
+#   - settings:
+#      - false (default)
+#      - true
+#

+ 11 - 0
data/krpano/templates/defaultbuttons.skin

@@ -0,0 +1,11 @@
+# Single Pano Skin
+# - krpano Default Buttons
+# - QTVR/Drag Mouse Cursor
+# - Context Menu with Different Projections
+# krpano 1.18
+
+xmltemplate=xml/default.xml
+xmltemplate_additional_file=xml/skin/defaultskin.xml
+xmltemplate_additional_file=xml/skin/buttons-2.png
+xmltemplate_additional_file=xml/skin/qtvr-cursors.png
+xmltemplate_additional_file=xml/skin/drag-cursors-2.png

+ 69 - 0
data/krpano/templates/flat.config

@@ -0,0 +1,69 @@
+# Flat/2D Multi-Resolution Panos
+# Skin with Default Buttons
+# Documentation: http://krpano.com/tools/kmakemultires/config?version=118
+# krpano 1.18
+
+
+# basic settings
+include basicsettings.config
+panotype=flat
+
+
+# output
+flash=true
+html5=true
+
+
+# convert spherical/cylindrical to cubical
+converttocube=false
+
+
+# multiresolution settings
+multires=true
+tilesize=512
+levels=auto
+levelstep=2
+minsize=128
+maxsize=auto
+leveldownload=view
+progressiveloading=auto
+
+
+# output images path
+tilepath=%INPUTPATH%/%BASENAME%.tiles/l%Al/%Av/l%Al_%Av_%Ah.jpg
+
+
+# preview pano settings
+preview=true
+cspreview=false
+graypreview=false
+previewsmooth=25
+previewpath=%INPUTPATH%/%BASENAME%.tiles/preview.jpg
+
+
+# xml output
+xml=true
+xmlpath=%INPUTPATH%/%BASENAME%.xml
+
+
+# skin / xml template
+xmltemplate=xml/flat.xml
+xmltemplate_additional_file=xml/skin/defaultskin.xml
+xmltemplate_additional_file=xml/skin/flatpano_setup.xml
+xmltemplate_additional_file=xml/skin/buttons-2.png
+xmltemplate_additional_file=xml/skin/qtvr-cursors.png
+xmltemplate_additional_file=xml/skin/drag-cursors-2.png
+
+
+
+# html output/template
+html=true
+htmlpath=%INPUTPATH%/%BASENAME%.html
+htmltemplate=html/embedpano.html
+htmltemplate_html5=prefer
+
+
+# compression settings (note - no jpegoptimize for extreme big panos, this could cause too much memory usage during building)
+jpegquality=82
+jpegsubsamp=422
+jpegoptimize=false

File diff suppressed because it is too large
+ 39 - 0
data/krpano/templates/html/embedpano-inline-js-singleswf.html


+ 29 - 0
data/krpano/templates/html/embedpano.html

@@ -0,0 +1,29 @@
+<!DOCTYPE html>
+<html>
+<head>
+	<title>krpano - [NAME]</title>
+	<meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0" />
+	<meta name="apple-mobile-web-app-capable" content="yes" />
+	<meta name="apple-mobile-web-app-status-bar-style" content="black" />
+	<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+	<meta http-equiv="x-ua-compatible" content="IE=edge" />
+	<style>
+		@-ms-viewport { width:device-width; }
+		@media only screen and (min-device-width:800px) { html { overflow:hidden; } }
+		html { height:100%; }
+		body { height:100%; overflow:hidden; margin:0; padding:0; font-family:Arial, Helvetica, sans-serif; font-size:16px; color:#FFFFFF; background-color:#000000; }
+	</style>
+</head>
+<body>
+
+<script src="[JS]"></script>
+
+<div id="pano" style="width:100%;height:100%;">
+	<noscript><table style="width:100%;height:100%;"><tr style="vertical-align:middle;"><td><div style="text-align:center;">ERROR:<br/><br/>Javascript not activated<br/><br/></div></td></tr></table></noscript>
+	<script>
+		embedpano({swf:"[SWF]", xml:"[XML]", target:"pano", html5:"[HTML5]", mobilescale:1.0, passQueryParameters:true});
+	</script>
+</div>
+
+</body>
+</html>

+ 47 - 0
data/krpano/templates/html/tour_editor.html

@@ -0,0 +1,47 @@
+<!DOCTYPE html>
+<html>
+<head>
+	<title>krpano - MAKE VTOUR - Virtual Tour Editor</title>
+	<meta name="viewport" content="target-densitydpi=device-dpi, width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, minimal-ui" />
+	<meta name="apple-mobile-web-app-capable" content="yes" />
+	<meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
+	<meta http-equiv="x-ua-compatible" content="IE=edge" />
+	<style>
+		@-ms-viewport { width: device-width; }
+		@media only screen and (min-device-width: 800px) { html { overflow:hidden; } }
+		html { height:100%; }
+		body { height:100%; overflow: hidden; margin:0; padding:0; font-family:Arial, Helvetica, sans-serif; font-size:16px; color:#FFFFFF; background-color:#000000; }
+		a{ color:#AAAAAA; text-decoration:underline; }
+		a:hover{ color:#FFFFFF; text-decoration:underline; }
+	</style>
+</head>
+<body>
+
+<script src="tour.js"></script>
+
+<div id="title" style="width:100%; height:20px; padding:5px; font-size:16px;"><b>krpano - MAKE VTOUR - Virtual Tour Editor</b> <span style="font-size:10px; font-style:italic; color:#777777;">// 1. set the startup views / 2. add hotspots / 3. edit the titles / 4. save and overwrite the original tour.xml</span></div>
+<div id="pano" style="width:100%; height:95%;">
+	<noscript><table style="width:100%;height:100%;"><tr style="vertical-align:middle;"><td><div style="text-align:center;">ERROR:<br/><br/>Javascript not activated<br/><br/></div></td></tr></table></noscript>
+	<script>
+		var vars = {};
+		vars["plugin[vtoureditor].url"] = "plugins/vtoureditor.swf";
+		vars["plugin[vtoureditor].keep"] = true;
+		
+		embedpano({swf:"tour.swf", xml:"tour.xml", target:"pano", flash:"only", passQueryParameters:false, vars:vars});
+		
+		function resize()
+		{
+			var th = document.getElementById("title").clientHeight;
+			var ph = (typeof(window.innerHeight) == 'number') ? window.innerHeight : ((document.documentElement && document.documentElement.clientHeight) ? document.documentElement.clientHeight : ((document.body && document.body.clientHeight) ? document.body.clientHeight : 500));
+			
+			document.getElementById("pano").style.height = (ph-th)+"px"
+		}
+		
+		window.onresize = resize;
+		
+		resize();
+	</script>
+</div>
+
+</body>
+</html>

+ 56 - 0
data/krpano/templates/multiframe.config

@@ -0,0 +1,56 @@
+# Multi-Frame Multi-Resolution Panos
+# Skin with Default Buttons
+# Documentation: http://krpano.com/tools/kmakemultires/config?version=118
+# krpano 1.18
+
+
+# basic settings
+include basicsettings.config
+frames=true
+panotype=auto
+
+
+# output (no multiframe-support in html5 yet)
+flash=true
+html5=false
+
+
+# convert spherical/cylindrical to cubical
+converttocube=true
+converttocubelimit=360x120
+
+
+# multiresolution settings
+multires=true
+tilesize=512
+levels=auto
+levelstep=2
+minsize=128
+maxsize=auto
+progressiveloading=auto
+
+
+# output images path
+tilepath=%INPUTPATH%/%BASENAME%.tiles/%Af/l%Al/[c_]%Av_%Ah.jpg
+
+
+# preview pano settings (no preview image for multi-frame!)
+preview=false
+
+
+# xml output
+xml=true
+xmlpath=%INPUTPATH%/%BASENAME%.xml
+
+
+# skin / xml template
+xmltemplate=xml/multiframe.xml
+xmltemplate_additional_file=xml/skin/multiframeskin.xml
+xmltemplate_additional_file=xml/skin/black.png
+xmltemplate_additional_file=xml/skin/arrow.png
+
+
+# html output/template
+html=true
+htmlpath=%INPUTPATH%/%BASENAME%.html
+htmltemplate=html/embedpano.html

+ 70 - 0
data/krpano/templates/multires.config

@@ -0,0 +1,70 @@
+# Multi-Resolution Panos
+# Skin with Default Buttons
+# Documentation: http://krpano.com/tools/kmakemultires/config?version=118
+# krpano 1.18
+
+
+# basic settings
+include basicsettings.config
+panotype=autodetect
+hfov=360
+
+
+# output
+flash=true
+html5=true
+
+
+# convert spherical/cylindrical to cubical
+converttocube=true
+converttocubelimit=360x45
+
+
+# multiresolution settings
+multires=true
+tilesize=512
+levels=auto
+levelstep=2
+maxsize=auto
+maxcubesize=auto
+leveldownload=auto
+
+
+# output images path
+tilepath=%INPUTPATH%/%BASENAME%.tiles/[mres_c/]l%Al/%Av/l%Al[_c]_%Av_%Ah.jpg
+
+
+# preview pano settings
+preview=true
+graypreview=false
+previewsmooth=25
+previewpath=%INPUTPATH%/%BASENAME%.tiles/preview.jpg
+
+
+# generate smaller mobile images
+customimage[mobile].size=1024
+customimage[mobile].path=%INPUTPATH%/%BASENAME%.tiles/mobile_%s.jpg
+customimage[mobile].imagesettings=jpegquality=85 jpegsubsamp=444 jpegoptimize=true
+customimage[mobile].xml=<mobile>[NL][TAB]<cube url="[PATH]" />[NL]</mobile>
+
+
+# xml output
+xml=true
+xmlpath=%INPUTPATH%/%BASENAME%.xml
+
+
+# skin / xml template
+include defaultbuttons.skin
+
+
+# html output/template
+html=true
+htmlpath=%INPUTPATH%/%BASENAME%.html
+htmltemplate=html/embedpano.html
+htmltemplate_html5=prefer
+
+
+# compression settings (note - no jpegoptimize for extreme big panos, this could cause too much memory usage during building)
+jpegquality=82
+jpegsubsamp=422
+jpegoptimize=false

+ 60 - 0
data/krpano/templates/normal.config

@@ -0,0 +1,60 @@
+# Normal/Single-Resolution Panos
+# Skin with Default Buttons
+# Documentation: http://krpano.com/tools/kmakemultires/config?version=118
+# krpano 1.18
+
+
+# basic settings
+include basicsettings.config
+panotype=autodetect
+hfov=360
+
+
+# output
+flash=true
+html5=true
+
+
+# convert spherical/cylindrical to cubical
+converttocube=true
+converttocubelimit=360x45
+
+
+# multiresolution settings
+multires=false
+maxsize=8000
+maxcubesize=2048
+
+
+# output images path
+tilepath=%INPUTPATH%/%BASENAME%.tiles/pano[_c].jpg
+
+
+# preview pano settings
+preview=true
+graypreview=false
+previewsmooth=25
+previewpath=%INPUTPATH%/%BASENAME%.tiles/preview.jpg
+
+
+# generate smaller mobile images
+customimage[mobile].size=1024
+customimage[mobile].path=%INPUTPATH%/%BASENAME%.tiles/mobile_%s.jpg
+customimage[mobile].imagesettings=jpegquality=85 jpegsubsamp=444 jpegoptimize=true
+customimage[mobile].xml=<mobile>[NL][TAB]<cube url="[PATH]" />[NL]</mobile>
+
+
+# xml output
+xml=true
+xmlpath=%INPUTPATH%/%BASENAME%.xml
+
+
+# skin / xml template
+include defaultbuttons.skin
+
+
+# html output/template
+html=true
+htmlpath=%INPUTPATH%/%BASENAME%.html
+htmltemplate=html/embedpano.html
+htmltemplate_html5=prefer

+ 56 - 0
data/krpano/templates/object.config

@@ -0,0 +1,56 @@
+# Zoom-/Rotateable Objects Movies (Flat/2D Multi-Frame/Multi-Resolution Panos)
+# Skin with Default Buttons
+# Documentation: http://krpano.com/tools/kmakemultires/config?version=118
+# krpano 1.18
+
+
+# basic settings
+include basicsettings.config
+frames=true
+panotype=flat
+
+
+# output (no multiframe-support in html5 yet)
+flash=true
+html5=false
+
+
+# convert spherical/cylindrical to cubical
+converttocube=false
+
+
+# multiresolution settings
+multires=true
+tilesize=512
+levels=auto
+levelstep=2
+minsize=128
+maxsize=auto
+progressiveloading=auto
+
+
+# output images path
+tilepath=%INPUTPATH%/%BASENAME%.tiles/%Af/l%Al/%Av_%Ah.jpg
+
+
+# preview pano settings (no preview image for multi-frame!)
+preview=false
+
+
+# xml output
+xml=true
+xmlpath=%INPUTPATH%/%BASENAME%.xml
+
+
+# skin / xml template
+xmltemplate=xml/object.xml
+xmltemplate_additional_file=xml/skin/objectskin.xml
+xmltemplate_additional_file=xml/skin/buttons.png
+xmltemplate_additional_file=xml/skin/black.png
+xmltemplate_additional_file=xml/skin/arrow.png
+
+
+# html output/template
+html=true
+htmlpath=%INPUTPATH%/%BASENAME%.html
+htmltemplate=html/embedpano.html

+ 5 - 0
data/krpano/templates/panoonly.skin

@@ -0,0 +1,5 @@
+# Single Pano Skin
+# - Just the pano itself, no skin
+# krpano 1.18
+
+xmltemplate=xml/panoonly.xml

+ 55 - 0
data/krpano/templates/singleswf.config

@@ -0,0 +1,55 @@
+# Single SWF File Panos (Normal/Single-Resolution)
+# Skin with Default Buttons
+# Documentation: http://krpano.com/tools/kmakemultires/config?version=118
+# krpano 1.18
+
+
+# basic settings
+include basicsettings.config
+panotype=autodetect
+hfov=360
+buildembeddedswf=true
+embedorderlookat=0/0
+kprotectclparameters=-nomb -swfsize=900x600
+
+
+# outpuf (single-swf is flash only)
+flash=true
+html5=false
+
+
+# convert spherical/cylindrical to cubical
+converttocube=true
+converttocubelimit=360x45
+
+
+# multiresolution settings
+multires=false
+maxsize=8000
+maxcubesize=2200
+
+
+# output images path (no folders for single-swf!)
+tilepath=%INPUTPATH%/%BASENAME%_tiles_l%Al[_c].jpg
+
+
+# preview pano settings (no folders for single-swf!)
+preview=true
+graypreview=false
+previewsmooth=25
+previewpath=%INPUTPATH%/%BASENAME%_preview.jpg
+
+
+# xml output
+xml=true
+xmlpath=%INPUTPATH%/%BASENAME%.xml
+
+
+# skin / xml template
+include defaultbuttons.skin
+
+
+# html output/template
+html=true
+htmlpath=%INPUTPATH%/%BASENAME%.html
+htmltemplate=html/embedpano-inline-js-singleswf.html

+ 77 - 0
data/krpano/templates/vtour-multires.config

@@ -0,0 +1,77 @@
+# Virtual Tour with Multi-Resolution Panos
+# Skin with Scrolling-Thumbnails, Bingmaps, Gyroscope, VR-Support
+# Documentation: http://krpano.com/tools/kmakemultires/config?version=119
+# krpano 1.19
+
+
+# basic settings
+include basicsettings.config
+panotype=autodetect
+hfov=360
+makescenes=true
+
+
+# output
+flash=true
+html5=true
+
+
+# convert spherical/cylindrical to cubical
+converttocube=true
+converttocubelimit=360x45
+
+
+# multiresolution settings
+multires=true
+tilesize=512
+levels=auto
+levelstep=2
+maxsize=auto
+maxcubesize=auto
+
+
+# output images path
+tilepath=%INPUTPATH%/vtour/panos/%BASENAME%.tiles/[c/]l%Al/%Av/l%Al[_c]_%Av_%Ah.jpg
+
+
+# preview pano settings
+preview=true
+graypreview=false
+previewsmooth=25
+previewpath=%INPUTPATH%/vtour/panos/%BASENAME%.tiles/preview.jpg
+
+
+# generate special optimized, non-tiled, lower-res images for VR
+customimage[vr].size=1536
+customimage[vr].path=%INPUTPATH%/vtour/panos/%BASENAME%.tiles/vr/pano_%s.jpg
+customimage[vr].imagesettings=jpegquality=82 jpegsubsamp=444 jpegoptimize=true
+customimage[vr].xmlsceneparameters=havevrimage="true"
+customimage[vr].xmlimageparameters=if="!webvr.isenabled"
+customimage[vr].xmllevel=krpano
+customimage[vr].xml=<image if="webvr.isenabled">[NL][TAB]<cube url="[PATH]" />[NL]</image>
+
+
+# generate thumbnails
+makethumb=true
+thumbsize=240
+thumbpath=%INPUTPATH%/vtour/panos/%BASENAME%.tiles/thumb.jpg
+
+
+# xml output
+xml=true
+xmlpath=%INPUTPATH%/vtour/tour.xml
+
+
+# html output/template
+html=true
+htmlpath=%INPUTPATH%/vtour/tour.html
+htmltemplate_html5=auto
+
+
+# skin / xml template
+include vtourskin119.skin
+
+
+# include vtour editor
+xmltemplate_additional_file=xml/plugins/vtoureditor.swf
+htmltemplate_additional_file=html/tour_editor.html

+ 71 - 0
data/krpano/templates/vtour-normal.config

@@ -0,0 +1,71 @@
+# Virtual Tour with Normal/Single-Resolution Panos
+# Skin with Scrolling-Thumbnails, Bingmaps, Gyroscope, VR-Support
+# Documentation: http://krpano.com/tools/kmakemultires/config?version=119
+# krpano 1.19
+
+
+# basic settings
+include basicsettings.config
+panotype=autodetect
+hfov=360
+makescenes=true
+
+
+# output
+flash=true
+html5=true
+
+
+# convert spherical/cylindrical to cubical
+converttocube=true
+converttocubelimit=360x45
+
+
+# multiresolution settings
+multires=false
+maxsize=8000
+maxcubesize=2048
+
+
+# output images path
+tilepath=%INPUTPATH%/vtour/panos/%BASENAME%/pano[_c].jpg
+
+
+# preview pano settings
+preview=true
+graypreview=false
+previewsmooth=25
+previewpath=%INPUTPATH%/vtour/panos/%BASENAME%/preview.jpg
+
+
+# generate smaller mobile images
+customimage[mobile].size=1024
+customimage[mobile].path=%INPUTPATH%/vtour/panos/%BASENAME%/mobile/pano_%s.jpg
+customimage[mobile].imagesettings=jpegquality=85 jpegsubsamp=444 jpegoptimize=true
+customimage[mobile].xml=<cube url="[PATH]" devices="mobile" />
+
+
+# generate thumbnails
+makethumb=true
+thumbsize=240
+thumbpath=%INPUTPATH%/vtour/panos/%BASENAME%/thumb.jpg
+
+
+# xml output
+xml=true
+xmlpath=%INPUTPATH%/vtour/tour.xml
+
+
+# html output/template
+html=true
+htmlpath=%INPUTPATH%/vtour/tour.html
+htmltemplate_html5=prefer
+
+
+# skin / xml template
+include vtourskin119.skin
+
+
+# include vtour editor
+#xmltemplate_additional_file=xml/plugins/vtoureditor.swf
+#htmltemplate_additional_file=html/tour_editor.html

+ 40 - 0
data/krpano/templates/vtourskin118.skin

@@ -0,0 +1,40 @@
+# Virtual Tour Skin - Design 1.18
+# - Button bar
+# - Scene/pano title
+# - Previous/next scene buttons
+# - Show/hide skin buttons
+# - Hotspots style
+# - Scrolling thumbnails
+# - Bingmaps or Googlemaps plugin
+# - Tooltips
+# - Gyroscope plugin
+# - WebVR support
+# - Retina resolution images
+# - Different mobile layout
+# - Virtual Tour Editor compatible
+# krpano 1.19-pr2
+
+htmltemplate=html/embedpano.html
+
+xmltemplate=xml/vtour118.xml
+xmltemplate_scene=xml/vtour_scenetemplate.xml
+xmltemplate_view=xml/vtour_viewtemplate.xml
+xmltemplate_hotspot=xml/vtour_hotspottemplate.xml
+xmltemplate_additional_file=xml/skin/vtourskin118.xml
+xmltemplate_additional_file=xml/skin/vtourskin118.png
+xmltemplate_additional_file=xml/skin/vtourskin_thumbborder.png
+xmltemplate_additional_file=xml/skin/vtourskin_hotspot.png
+xmltemplate_additional_file=xml/skin/vtourskin_mapspot.png
+xmltemplate_additional_file=xml/skin/vtourskin_mapspotactive.png
+xmltemplate_additional_file=xml/plugins/scrollarea.swf
+xmltemplate_additional_file=xml/plugins/scrollarea.js
+xmltemplate_additional_file=xml/plugins/bingmaps.swf
+xmltemplate_additional_file=xml/plugins/bingmaps.js
+xmltemplate_additional_file=xml/plugins/googlemaps.js
+xmltemplate_additional_file=xml/plugins/textfield.swf
+xmltemplate_additional_file=xml/plugins/gyro2.js
+xmltemplate_additional_file=xml/plugins/webvr.js
+xmltemplate_additional_file=xml/plugins/webvr.xml
+xmltemplate_additional_file=xml/plugins/webvr_cursor_80x80_17f.png
+xmltemplate_additional_file=xml/skin/cardboard_logo.png
+xmltemplate_additional_file=xml/skin/rotate_device.png

+ 49 - 0
data/krpano/templates/vtourskin119.skin

@@ -0,0 +1,49 @@
+# Virtual Tour Skin - Design 1.19
+# - Button bar
+# - Scene/pano title
+# - Previous/next scene buttons
+# - Show/hide skin buttons
+# - Hotspots style
+# - Scrolling thumbnails
+# - Bingmaps or Googlemaps plugin
+# - Tooltips
+# - Gyroscope plugin
+# - WebVR support
+# - Retina resolution images
+# - Different mobile layout
+# - Virtual Tour Editor compatible
+# krpano 1.19-pr4
+
+htmltemplate=html/embedpano.html
+
+xmltemplate=xml/vtour.xml
+xmltemplate_scene=xml/vtour_scenetemplate.xml
+xmltemplate_view=xml/vtour_viewtemplate.xml
+xmltemplate_hotspot=xml/vtour_hotspottemplate.xml
+xmltemplate_additional_file=xml/skin/vtourskin.xml
+xmltemplate_additional_file=xml/skin/vtourskin_design_glass.xml
+xmltemplate_additional_file=xml/skin/vtourskin_design_flat_light.xml
+xmltemplate_additional_file=xml/skin/vtourskin_design_ultra_light.xml
+xmltemplate_additional_file=xml/skin/vtourskin_design_117.xml
+xmltemplate_additional_file=xml/skin/vtourskin_design_117round.xml
+xmltemplate_additional_file=xml/skin/vtourskin.png
+xmltemplate_additional_file=xml/skin/vtourskin_light.png
+xmltemplate_additional_file=xml/skin/vtourskin_hotspot.png
+xmltemplate_additional_file=xml/skin/vtourskin_mapspot.png
+xmltemplate_additional_file=xml/skin/vtourskin_mapspotactive.png
+xmltemplate_additional_file=xml/plugins/scrollarea.swf
+xmltemplate_additional_file=xml/plugins/scrollarea.js
+xmltemplate_additional_file=xml/plugins/bingmaps.swf
+xmltemplate_additional_file=xml/plugins/bingmaps.js
+xmltemplate_additional_file=xml/plugins/googlemaps.js
+xmltemplate_additional_file=xml/plugins/textfield.swf
+xmltemplate_additional_file=xml/plugins/videoplayer.swf
+xmltemplate_additional_file=xml/plugins/videoplayer.js
+xmltemplate_additional_file=xml/plugins/soundinterface.swf
+xmltemplate_additional_file=xml/plugins/soundinterface.js
+xmltemplate_additional_file=xml/plugins/fps.xml
+xmltemplate_additional_file=xml/plugins/gyro2.js
+xmltemplate_additional_file=xml/plugins/webvr.js
+xmltemplate_additional_file=xml/plugins/webvr.xml
+xmltemplate_additional_file=xml/plugins/webvr_cursor_80x80_17f.png
+xmltemplate_additional_file=xml/skin/rotate_device.png

+ 14 - 0
data/krpano/templates/xml/default.xml

@@ -0,0 +1,14 @@
+<krpano version="1.18">
+	
+	<!-- the skin -->
+	<include url="skin/defaultskin.xml" />
+	
+	<!-- view settings -->
+	<view hlookat="0" vlookat="0" maxpixelzoom="1.0" fovmax="150" [VIEWLIMITS]/>
+	
+
+	[PREVIEW]
+
+	[IMAGE]
+
+</krpano>

+ 13 - 0
data/krpano/templates/xml/flat.xml

@@ -0,0 +1,13 @@
+<krpano version="1.18" bgcolor="0x000000">
+
+	<!-- the skin and the flat pano viewing and controlling setup -->
+	<include url="skin/defaultskin.xml" />
+	<include url="skin/flatpano_setup.xml" />
+	
+	<!-- preview pano image -->
+	[PREVIEW]
+
+	<!-- pano image -->
+	[IMAGE]
+
+</krpano>

BIN
data/krpano/templates/xml/krpano_default_flares.jpg


+ 9 - 0
data/krpano/templates/xml/multiframe.xml

@@ -0,0 +1,9 @@
+<krpano version="1.18">
+
+	<include url="skin/multiframeskin.xml" />
+	
+	<view fov="90" maxpixelzoom="2.0" fovmax="120" limitview="fullrange" />
+	
+	[IMAGE]
+
+</krpano>

+ 7 - 0
data/krpano/templates/xml/object.xml

@@ -0,0 +1,7 @@
+<krpano version="1.18">
+
+	<include url="skin/objectskin.xml" />
+
+	[IMAGE]
+
+</krpano>

+ 9 - 0
data/krpano/templates/xml/panoonly.xml

@@ -0,0 +1,9 @@
+<krpano version="1.18">
+	
+	<view hlookat="0" vlookat="0" fovtype="MFOV" fov="120" maxpixelzoom="1.0" fovmin="70" fovmax="140" [VIEWLIMITS]/>
+
+	[PREVIEW]
+
+	[IMAGE]
+
+</krpano>

File diff suppressed because it is too large
+ 5 - 0
data/krpano/templates/xml/plugins/bingmaps.js


BIN
data/krpano/templates/xml/plugins/bingmaps.swf


File diff suppressed because it is too large
+ 33 - 0
data/krpano/templates/xml/plugins/combobox.js


BIN
data/krpano/templates/xml/plugins/combobox.swf


File diff suppressed because it is too large
+ 4 - 0
data/krpano/templates/xml/plugins/compass.js


BIN
data/krpano/templates/xml/plugins/editor.swf


+ 37 - 0
data/krpano/templates/xml/plugins/fps.xml

@@ -0,0 +1,37 @@
+<krpano>
+	
+	<!--
+		fps (frames per second) xml plugin
+		- this plugin shows the current average rendering frame-rate 
+		- krpano 1.18
+	-->
+	
+	<action name="fps_install" autorun="preinit">
+		delayedcall(1.0,
+			addlayer(fps_display);
+			set(layer[fps_display].keep, true);
+			set(layer[fps_display].align, 'lefttop');
+			if(device.mobile AND stagescale LT 1.0,
+				<!-- a larger font for mobiles -->
+				set(layer[fps_display].css, 'font-size:24px; color:#FFFFFF;');
+			  ,
+				<!-- and a smaller font for desktop and tablets -->
+				set(layer[fps_display].css, 'font-size:12px; color:#FFFFFF;');
+			  );
+			set(layer[fps_display].textshadow, 0.01);
+			set(layer[fps_display].background, false);
+			set(layer[fps_display].parent, STAGE);
+			set(layer[fps_display].enabled, false);
+			set(layer[fps_display].url, '%SWFPATH%/plugins/textfield.swf');
+			fps_update();
+		);
+	</action>
+	
+	<action name="fps_update">
+		copy(tmp, display.currentfps);
+		roundval(tmp);
+		txtadd(layer[fps_display].html, 'FPS: ', get(tmp));
+		delayedcall(0.5, fps_update());
+	</action>
+	
+</krpano>

File diff suppressed because it is too large
+ 5 - 0
data/krpano/templates/xml/plugins/googlemaps.js


File diff suppressed because it is too large
+ 18 - 0
data/krpano/templates/xml/plugins/gyro.js


File diff suppressed because it is too large
+ 5 - 0
data/krpano/templates/xml/plugins/gyro2.js


File diff suppressed because it is too large
+ 9 - 0
data/krpano/templates/xml/plugins/moretweentypes.js


BIN
data/krpano/templates/xml/plugins/moretweentypes.swf


BIN
data/krpano/templates/xml/plugins/options.swf


File diff suppressed because it is too large
+ 13 - 0
data/krpano/templates/xml/plugins/radar.js


BIN
data/krpano/templates/xml/plugins/radar.swf


File diff suppressed because it is too large
+ 18 - 0
data/krpano/templates/xml/plugins/scrollarea.js


BIN
data/krpano/templates/xml/plugins/scrollarea.swf


+ 209 - 0
data/krpano/templates/xml/plugins/showtext.xml

@@ -0,0 +1,209 @@
+<krpano>
+	<!--
+		showtext() xml plugin
+		- showtext() and <textstyle> support for HTML5
+		- extended <textstyle> functionality compared to the build-in showtext() action
+		- just include this xml file via: <include url="showtext.xml" />
+		- docu: http://krpano.com/plugins/showtext/
+		- krpano 1.19
+	-->
+
+
+	<!-- predefine a DEFAULT textstyle element -->
+	<textstyle name="DEFAULT" />
+
+
+	<!-- the automatic running (autorun=preinit) install action -->
+	<action name="showtext_install" autorun="preinit">
+		<!-- redirect the build-in 'showtext' action to the 'showtext_xml' action: -->
+		set(showtext, action(showtext_xml,'%%1','%%2') );
+
+		<!-- initialize internal variables -->
+		set(showtext_style, DEFAULT);
+		set(showtext_prevstyle, null);
+		set(showtext_text, '');
+		set(showtext_prevtext, '');
+		set(showtext_timeout, 0.1);
+		set(showtext_fadeout, 0.0);
+		set(showtext_clipping, false);
+	</action>
+	
+
+	<action name="showtext_xml">
+		set(showtext_style, DEFAULT);
+		if('%2' != 'null', ifnot(textstyle['%2'], trace('textstyle "%2" not found'); , set(showtext_style,'%2')); );
+
+		set(showtext_text, '%1');
+		if(showtext_text != showtext_prevtext,
+			copy(showtext_prevtext, showtext_text);
+			showtext_createnewtext();
+		  ,
+			delayedcall(showtext_timer, get(showtext_timeout), showtext_hide() );
+		  );
+	</action>
+
+
+	<action name="showtext_createnewtext">
+		<!-- stop running mouse and alpha update calls -->
+		stopdelayedcall(showtext_mouseupdates);
+		stoptween(layer[showtext_tf].alpha);
+
+		<!-- remove the old textfield when the style has changed -->
+		if(showtext_style != showtext_prevstyle,
+			copy(showtext_prevstyle, showtext_style);
+			removelayer(showtext_tf);
+		  );
+
+		<!-- create a new textfield plugin layer -->
+		addlayer(showtext_tf);
+
+		<!-- create 'shortcut' variables (tf,ts) for faster access -->
+		copy(tf, layer[showtext_tf]);
+		copy(ts, textstyle[get(showtext_style)]);
+
+		<!-- get the position settings -->
+		if(ts.origin  !== null, copy(ts_origin,  ts.origin),  set(ts_origin, 'cursor'));
+		if(ts.edge    !== null, copy(ts_edge,    ts.edge),    set(ts_edge, 'bottom'));
+		if(ts.xoffset !== null, copy(ts_xoffset, ts.xoffset), set(ts_xoffset, 0));
+		if(ts.yoffset !== null, copy(ts_yoffset, ts.yoffset), set(ts_yoffset, -3));
+
+		<!-- set the position settings -->
+		if(ts_origin == 'cursor',
+			set(tf.align, 'lefttop');
+			showtext_movetomouse();
+		  ,
+			copy(tf.align, ts_origin);
+		  );
+		copy(tf.edge, ts_edge);
+		copy(tf.ox, ts_xoffset);
+		copy(tf.oy, ts_yoffset);
+
+		<!-- get the font settings -->
+		if(ts.font      !== null, copy(ts_font,      ts.font),      set(ts_font, 'Times'));
+		if(ts.fontsize  !== null, copy(ts_fontsize,  ts.fontsize),  set(ts_fontsize, 12.0));
+		if(ts.bold      !== null, copy(ts_bold,      ts.bold),      set(ts_bold, true));
+		if(ts.italic    !== null, copy(ts_italic,    ts.italic),    set(ts_italic, false));
+		if(ts.textcolor !== null, copy(ts_textcolor, ts.textcolor), set(ts_textcolor, 0x000000));
+		if(ts.textalign !== null, copy(ts_textalign, ts.textalign), set(ts_textalign, 'left'));
+
+		<!-- use the font settings to build the CSS style -->
+		set(tf_css, '');
+		tohex(ts_textcolor, '#', 6);
+		txtadd(tf_css, 'font-family:',get(ts_font),'; font-size:',get(ts_fontsize),'px; color:',get(ts_textcolor),'; ');
+		if(ts_textalign != 'none', txtadd(tf_css, get(tf_css), 'text-align:',get(ts_textalign),'; '));
+		if(ts_bold,   txtadd(tf_css, 'font-weight:bold; '));
+		if(ts_italic, txtadd(tf_css, 'font-style:italic; '));
+		if(ts.css !== null, txtadd(tf_css, get(ts.css)));
+		copy(tf.css, tf_css);
+
+		<!-- size settings -->
+		if(ts.width   !== null AND ts.width   !== '', copy(tf.width,   ts.width));
+		if(ts.height  !== null AND ts.height  !== '', copy(tf.height,  ts.height));
+		if(ts.vcenter !== null AND ts.vcenter !== '', copy(tf.vcenter, ts.vcenter));
+		if(ts.padding !== null AND ts.padding !== '', copy(tf.padding, ts.padding), set(tf.padding,1));
+
+		<!-- background, border, shadow settings -->
+		if(ts.background      !== null, copy(tf.background,      ts.background));
+		if(ts.backgroundcolor !== null, copy(tf.backgroundcolor, ts.backgroundcolor));
+		if(ts.backgroundalpha !== null, copy(tf.backgroundalpha, ts.backgroundalpha));
+		if(ts.border          !== null, copy(tf.border,          ts.border), set(tf.border,true));
+		if(ts.bordercolor     !== null, copy(tf.bordercolor,     ts.bordercolor));
+		if(ts.borderalpha     !== null, copy(tf.borderalpha,     ts.borderalpha));
+		if(ts.borderwidth     !== null, copy(tf.borderwidth,     ts.borderwidth));
+		if(ts.roundedge       !== null, copy(tf.roundedge,       ts.roundedge));
+		if(ts.shadow          !== null, copy(tf.shadow,          ts.shadow));
+		if(ts.shadowrange     !== null, copy(tf.shadowrange,     ts.shadowrange));
+		if(ts.shadowangle     !== null, copy(tf.shadowangle,     ts.shadowangle));
+		if(ts.shadowcolor     !== null, copy(tf.shadowcolor,     ts.shadowcolor));
+		if(ts.shadowalpha     !== null, copy(tf.shadowalpha,     ts.shadowalpha));
+		if(ts.textshadow      !== null, copy(tf.textshadow,      ts.textshadow));
+		if(ts.textshadowrange !== null, copy(tf.textshadowrange, ts.textshadowrange));
+		if(ts.textshadowangle !== null, copy(tf.textshadowangle, ts.textshadowangle));
+		if(ts.textshadowcolor !== null, copy(tf.textshadowcolor, ts.textshadowcolor));
+		if(ts.textshadowalpha !== null, copy(tf.textshadowalpha, ts.textshadowalpha));
+
+		<!-- showing settings -->
+		if(ts.alpha      !== null, copy(ts_alpha,      ts.alpha),      set(ts_alpha, 1.0));
+		if(ts.showtime   !== null, copy(ts_showtime,   ts.showtime),   set(ts_showtime, 0.1));
+		if(ts.fadetime   !== null, copy(ts_fadetime,   ts.fadetime),   set(ts_fadetime, 0.0));
+		if(ts.fadeintime !== null, copy(ts_fadeintime, ts.fadeintime), set(ts_fadeintime, 0.0));
+		copy(showtext_timeout, ts_showtime);
+		copy(showtext_fadeout, ts_fadetime);
+		if(ts_fadeintime GT 0,
+			set(tf.alpha, 0.0);
+			tween(layer[showtext_tf].alpha, get(ts_alpha), get(ts_fadeintime), linear);
+		  ,
+			copy(tf.alpha, ts_alpha);
+		  );
+
+		if(ts.noclip !== null, copy(showtext_clipping,ts.noclip), set(showtext_clipping, true));
+		
+		if(showtext_clipping,
+			set(tf.onloaded,    showtext_do_clipping() );
+			set(tf.onautosized, showtext_do_clipping() );
+		  );
+
+		<!-- special flash-only settings -->
+		if(ts.embeddedfonts !== null, copy(tf.embeddedfonts, ts.embeddedfonts));
+		if(ts.effect        !== null, copy(tf.effect,        ts.effect));
+		if(ts.blendmode     !== null, copy(tf.blendmode,     ts.blendmode));
+
+		<!-- set the text and the basic settings to start showing the textfield -->
+		copy(tf.html, showtext_text);
+		set(tf.enabled, false);
+		set(tf.zorder, 999999);
+		if(ts.parent, copy(tf.parent, ts.parent) );
+		set(tf.url, '%SWFPATH%/plugins/textfield.swf');
+		
+		<!-- remove the shortcut variables -->
+		delete(ts);
+		delete(tf);
+
+		<!-- start the text-hiding timer -->
+		delayedcall(showtext_timer, get(showtext_timeout), showtext_hide() );
+	</action>
+
+
+	<action name="showtext_do_clipping">
+		if(showtext_clipping,
+			layer[showtext_tf].updatepos();
+			copy(tf_px, layer[showtext_tf].pixelx);
+			copy(tf_py, layer[showtext_tf].pixely);
+			if(tf_px LT 0,
+				sub(layer[showtext_tf].x, tf_px);
+			  ,
+				add(tf_rightedge, tf_px, layer[showtext_tf].pixelwidth);
+				if(tf_rightedge GE stagewidth, sub(tf_rightedge,stagewidth); sub(layer[showtext_tf].x,tf_rightedge); );
+			  );
+			if(tf_py LT 0,
+				sub(layer[showtext_tf].y,  tf_py);
+			  ,
+				add(tf_bottomedge, tf_py, layer[showtext_tf].pixelheight);
+				if(tf_bottomedge GE stageheight, sub(tf_bottomedge,stageheight); sub(layer[showtext_tf].y,tf_bottomedge); );
+			  );
+		  );
+	</action>
+
+
+	<action name="showtext_movetomouse">
+		copy(layer[showtext_tf].x, mouse.stagex);
+		copy(layer[showtext_tf].y, mouse.stagey);
+
+		showtext_do_clipping();
+
+		delayedcall(showtext_mouseupdates, 0, showtext_movetomouse() );
+	</action>
+
+
+	<action name="showtext_hide">
+		if(layer[showtext_tf],
+			tween(layer[showtext_tf].alpha, 0.0, get(showtext_fadeout), linear,
+					stopdelayedcall(showtext_mouseupdates);
+					removelayer(showtext_tf);
+					set(showtext_text, '');
+					set(showtext_prevtext, '');
+				);
+		  );
+	</action>
+
+</krpano>

File diff suppressed because it is too large
+ 11 - 0
data/krpano/templates/xml/plugins/snow.js


BIN
data/krpano/templates/xml/plugins/snow.swf


File diff suppressed because it is too large
+ 5 - 0
data/krpano/templates/xml/plugins/soundinterface.js


BIN
data/krpano/templates/xml/plugins/soundinterface.swf


BIN
data/krpano/templates/xml/plugins/textfield.swf


File diff suppressed because it is too large
+ 5 - 0
data/krpano/templates/xml/plugins/videoplayer.js


BIN
data/krpano/templates/xml/plugins/videoplayer.swf


BIN
data/krpano/templates/xml/plugins/vtoureditor.swf


File diff suppressed because it is too large
+ 5 - 0
data/krpano/templates/xml/plugins/webvr.js


+ 892 - 0
data/krpano/templates/xml/plugins/webvr.xml

@@ -0,0 +1,892 @@
+<krpano>
+
+	<!-- load the WebVR plugin and assign it to a 'webvr' variable for easier usage -->
+	<plugin name="WebVR" devices="html5" keep="true"
+	        url="webvr.js"
+	        onloaded="copy(webvr, plugin[WebVR]);"
+	        mousespeed="0.00125"
+	        multireslock="true"
+	        mobilevr_support="true"
+	        mobilevr_ipd="63.5"
+	        mobilevr_screensize="auto"
+	        mobilevr_lens_overlap="1.0"
+	        mobilevr_lens_fov="96"
+	        mobilevr_lens_dist="0.6"
+	        mobilevr_lens_dist2="1|0|0|0"
+	        mobilevr_lens_ca="0.0"
+	        mobilevr_lens_vign="100"
+	        mobilevr_wakelock="true"
+	        mobilevr_sensor_mode="3"
+	        mobilevr_autocalibration="false"
+	        mobilevr_touch_support="true"
+	        mobilevr_fake_support="false"
+	        vr_cursor="hotspot[vr_cursor]"
+	        vr_cursor_enabled="true"
+	        vr_cursor_onover="if(handcursor, tween(hotspot[vr_cursor].scale,0.4,0.1); vr_auto_click(get(vr_timeout)); );"
+	        vr_cursor_onout="tween(hotspot[vr_cursor].scale,0.3,0.1);"
+	        onavailable="webvr_onavailable();"
+	        onunavailable=""
+	        onunknowndevice="webvr_onunknowndevice();"
+	        onentervr="webvr_onentervr();"
+	        onexitvr="webvr_onexitvr();"
+	        />
+
+	
+	<!-- a custom xml data structure with the supported VR headsets -->
+	<vrheadsets>
+		<headset name="cb1" caption="Cardboard A"   overlap="1.10" fov="96.0"  dist="1.00" dist2="1|0|0|0" ca="0.000" vig="100" />
+		<headset name="cb2" caption="Cardboard B"   overlap="1.00" fov="96.0"  dist="0.60" dist2="1|0|0|0" ca="0.000" vig="100" />
+		<headset name="gvr" caption="GearVR"        overlap="1.00" fov="112.0" dist="0.95" dist2="1|0|0|0" ca="0.090" vig="100" />
+		<headset name="hom" caption="HOMiDO"        overlap="1.00" fov="101.0" dist="1.10" dist2="1|0|0|0" ca="0.075" vig="100" />
+		<headset name="one" caption="VR ONE"        overlap="1.00" fov="109.9" dist="0.00" dist2="1.139|0.093|0.018|0.207" ca="0.090" vig="35" />
+		<headset name="ccr" caption="ColorCross VR" overlap="1.00" fov="70.0"  dist="0.65" dist2="1|0|0|0" ca="0.000" vig="100" />
+		<headset name="nod" caption="No Distortion" overlap="1.00" fov="96.0"  dist="0.00" dist2="1|0|0|0" ca="0.000" vig="100" />
+	</vrheadsets>
+
+
+	<!-- the VR cursor hotspot -->
+	<hotspot name="vr_cursor" keep="true"
+	         url="webvr_cursor_80x80_17f.png"
+	         visible="false"
+	         enabled="false"
+	         distorted="true"
+	         crop="0|0|80|80"
+	         scale="0.3"
+	         depth="1000"
+	         />
+
+
+	<!-- vr_auto_click() - call this action in the onover event of a
+	     hotspot to trigger automatically a click after some time.  -->
+	<action name="vr_auto_click">
+		if(webvr.isenabled,
+			if(%1 != null, set(vr_aclk_timeout, %1), set(vr_aclk_timeout, 2000));
+			copy(vr_aclk_t1, timertick);
+			set(vr_aclk_waiting, true);
+			copy(vr_aclk_hotspot, name);
+			set(hotspot[vr_cursor].crop,'0|0|80|80');
+
+			asyncloop(vr_aclk_waiting AND vr_aclk_hotspot == name,
+				sub(dt, timertick,vr_aclk_t1);
+
+				if(!hovering,
+					set(vr_aclk_waiting, false);
+					set(hotspot[vr_cursor].crop,'0|0|80|80');
+				  ,
+					div(f, dt, vr_aclk_timeout);
+					mul(f, 16);
+					roundval(f);
+					Math.min(f, 16);
+					mul(f, 80);
+
+					txtadd(hotspot[vr_cursor].crop,get(f),'|0|80|80');
+
+					<!-- wait another 100ms delay after finishing the animation before doing the click -->
+					sub(dt, 100);
+					if(dt GT vr_aclk_timeout,
+						set(vr_aclk_waiting,false);
+						set(hotspot[vr_cursor].crop,'0|0|80|80');
+						<!-- call onclick -->
+						onclick();
+					  );
+				  );
+				);
+		  );
+	</action>
+
+
+	<!-- by pressing SPACE the Oculus Rift could be re-centered -->
+	<events name="webvr_events" devices="html5" keep="true"
+	        onkeydown="if(webvr AND webvr.isenabled AND keycode==32, webvr.resetSensor() );"
+	        onmousedown="if(webvr AND webvr.isenabled, webvr_showbuttons() );"
+	        />
+
+
+	<!-- when WebVR support is available show an EnterVR button -->
+	<action name="webvr_onavailable">
+		webvr.loadsettings();
+		delayedcall(0.5, tween(layer[webvr_enterbutton].alpha,1.0); );
+	</action>
+	
+	
+	<action name="webvr_onunknowndevice">
+		if(webvr.isfake AND device.desktop AND webvr.havesettings == false,
+			<!-- set the 'no distortion' headset for fake desktop usage -->
+			set(webvr.mobilevr_lens_overlap, 1.0);
+			set(webvr.mobilevr_lens_fov, 96.0);
+			set(webvr.mobilevr_lens_dist, 0.0);
+			set(webvr.mobilevr_lens_dist2, '1|0|0|0');
+			set(webvr.mobilevr_lens_ca, 0.0);
+			set(webvr.mobilevr_lens_vign, 100);
+		  ,
+			set(ask_user_for_screensize,true);
+		  );
+	</action>
+
+
+	<action name="webvr_onentervr">
+		tween(layer[webvr_enterbutton].alpha,0,0);
+
+		webvr_showbuttons();
+		webvr_hide_all_non_vr_layers();
+
+		<!-- when the screen size is unknown an no custom size is set, open the setup screen on entering the VR mode -->
+		if(webvr.ismobilevr == true AND !webvr.isfake AND ask_user_for_screensize == true AND webvr.mobilevr_screensize == 'auto',
+			set(ask_user_for_screensize, false);
+			vr_setup();
+		  );
+		if(webvr.isfake,
+			webvr_show_fakemode_info(true);
+		  );
+	</action>
+
+
+	<action name="webvr_onexitvr">
+		stopdelayedcall(vr_button_fadeout);
+
+		tween(layer[webvr_enterbutton].alpha,1);
+		tween(layer[webvr_exitbutton].alpha,0);
+		tween(layer[webvr_setupbutton].alpha,0);
+		
+		webvr_show_fakemode_info(false);
+
+		webvr_restore_layers();
+	</action>
+
+
+	<action name="webvr_hide_all_non_vr_layers">
+		for(set(i,0), i LT layer.count, inc(i),
+			copy(lr, layer[get(i)]);
+			if(lr.vr !== true,
+				copy(lr.vr_backup_visible, lr.visible);
+				set(lr.visible, false);
+			  );
+		  );
+	</action>
+
+	<action name="webvr_restore_layers">
+		for(set(i,0), i LT layer.count, inc(i),
+			copy(lr, layer[get(i)]);
+			if(lr.vr_backup_visible,
+				copy(lr.visible, lr.vr_backup_visible);
+				delete(lr.vr_backup_visible);
+			  );
+		  );
+	</action>
+	
+	<action name="webvr_show_fakemode_info">
+		if('%1' == 'true',
+			addlayer(webvr_fakemode_info);
+			set(layer[webvr_fakemode_info].url, '%SWFPATH%/plugins/textfield.swf');
+			set(layer[webvr_fakemode_info].keep, true);
+			set(layer[webvr_fakemode_info].align, 'bottom');
+			set(layer[webvr_fakemode_info].y, 80);
+			set(layer[webvr_fakemode_info].background, false);
+			set(layer[webvr_fakemode_info].css, 'color:#FFFFFF;text-align:center;');
+			set(layer[webvr_fakemode_info].html, '[i][u]Simulated WebVR Mode![/u][/i][br]For real WebVR with headset tracking, either use a [a href="http://webvr.info" target="_blank" style="color:#FFFFFF;"]WebVR-API-capable[/a] desktop browser or a mobile device and a VR headset.');
+		  ,
+			removelayer(webvr_fakemode_info);
+		  );
+	</action>
+	
+	
+	<!-- ensure the same scaling on mobiles (regardless if mobilescale is 0.5 or 1.0) -->
+	<krpano webvr_setup_scale="calc:(1.0 + 1.0*(device.mobile AND stagescale LT 1.0)) / (1.0 + 1.0*device.mobile)"
+	        webvr_button_scale.normal="1.0"
+	        webvr_button_scale.mobile="1.6"
+	        />
+
+	
+	<!-- the EnterVR/ExitVR and SetupVR buttons -->
+	<style name="webvr_button_style"
+	       url="%SWFPATH%/plugins/textfield.swf"
+	       backgroundcolor="0x000000"
+	       backgroundalpha="0.5"
+	       roundedge="calc:9*webvr_setup_scale*webvr_button_scale"
+	       css="calc:'color:#FFFFFF;font-size:' + 20*webvr_setup_scale*webvr_button_scale + 'px;'"
+	       padding="calc:6*webvr_setup_scale*webvr_button_scale + ' ' + 10*webvr_setup_scale*webvr_button_scale"
+	       />
+	
+	<layer name="webvr_enterbutton" keep="true" vr="true"
+	       style="webvr_button_style"
+	       html="Enter VR"
+	       align="top" y="24"
+	       autoalpha="true" alpha="0.0"
+	       onclick="webvr.enterVR();"
+	       />
+
+	<layer name="webvr_exitbutton" keep="true" vr="true"
+	       style="webvr_button_style"
+	       html="Exit VR"
+	       align="top" y="24"
+	       autoalpha="true" alpha="0.0"
+	       onclick="webvr.exitVR();"
+	       />
+
+	<layer name="webvr_setupbutton" keep="true" vr="true"
+	       style="webvr_button_style"
+	       html="VR Setup"
+	       align="bottom" y="24"
+	       autoalpha="true" alpha="0.0"
+	       onclick="vr_setup()"
+	       />
+
+
+	<action name="webvr_showbuttons">
+		stopdelayedcall(vr_button_fadeout);
+		if(webvr.ismobilevr,
+			tween(layer[webvr_exitbutton].alpha|layer[webvr_setupbutton].alpha, 1.0|1.0, 0.25);
+			delayedcall(vr_button_fadeout, 3.0, tween(layer[webvr_exitbutton].alpha|layer[webvr_setupbutton].alpha, 0.0|0.0, 1.0); );
+		  ,
+			tween(layer[webvr_exitbutton].alpha, 1.0, 0.25);
+			delayedcall(vr_button_fadeout, 3.0, tween(layer[webvr_exitbutton].alpha, 0.0, 1.0); );
+		  );
+	</action>
+
+
+
+	<!--
+		VR Setup
+	-->
+
+	<action name="vr_setup">
+		<!-- disable cursor -->
+		set(webvr.vr_cursor_enabled, false);
+		
+		<!-- hide VR buttons -->
+		tween(layer[webvr_exitbutton].alpha,0);
+		tween(layer[webvr_setupbutton].alpha,0);
+		
+		<!-- create background layer -->
+		addlayer(vr_setup_bg);
+		set(layer[vr_setup_bg].type, container);
+		set(layer[vr_setup_bg].bgcolor, 0x000000);
+		set(layer[vr_setup_bg].bgalpha, 0.5);
+		set(layer[vr_setup_bg].bgcapture, true);
+		set(layer[vr_setup_bg].handcursor, false);
+		set(layer[vr_setup_bg].align, lefttop);
+		set(layer[vr_setup_bg].width, 100%);
+		set(layer[vr_setup_bg].height, 100%);
+		set(layer[vr_setup_bg].zorder, 99999);
+		
+		<!-- get and prepare device infos and settings -->
+		copy(i_screensize, webvr.mobilevr_screensize);
+		if(i_screensize == 'auto', copy(i_screensize, webvr.devicesize));
+		if(i_screensize LE 0, set(i_screensize, 5.0));
+		roundval(i_screensize, 1);
+		txtadd(i_screensize, ' inch');
+
+		copy(i_ipd, webvr.mobilevr_ipd);
+		roundval(i_ipd, 1);
+		txtadd(i_ipd, ' mm');
+
+		copy(i_fov, webvr.mobilevr_lens_fov);
+		roundval(i_fov, 1);
+
+		copy(i_dist, webvr.mobilevr_lens_dist);
+		roundval(i_dist, 2);
+		
+		copy(i_dist2, webvr.mobilevr_lens_dist2);
+		txtsplit(i_dist2, '|', i_dist2_k1, i_dist2_k2, i_dist2_k3, i_dist2_k4);
+		mul(i_dist2_k1,1);
+		mul(i_dist2_k2,10);
+		mul(i_dist2_k3,10);
+		mul(i_dist2_k4,10);
+		roundval(i_dist2_k1,2);
+		roundval(i_dist2_k2,2);
+		roundval(i_dist2_k3,2);
+		roundval(i_dist2_k4,2);
+
+		copy(i_vig, webvr.mobilevr_lens_vign);
+		roundval(i_vig, 0);
+		
+		copy(i_overlap, webvr.mobilevr_lens_overlap);
+		roundval(i_overlap, 2);
+		
+		copy(i_ca, webvr.mobilevr_lens_ca);
+		roundval(i_ca, 3);
+
+		set(i_headset, 'Custom');
+		for(set(i,0), i LT vrheadsets.headset.count, inc(i),
+			copy(hs, vrheadsets.headset[get(i)]);
+			if(i_overlap == hs.overlap AND i_fov == hs.fov AND i_dist == hs.dist AND i_dist2 == hs.dist2 AND i_ca == hs.ca AND i_vig == hs.vig , copy(i_headset, hs.caption));
+		   );
+
+		<!-- when the screen size is unknown, mark it red -->
+		set(known_size, true);
+		set(sizcol, #FFFFFF);
+		copy(i_devicename, webvr.devicename);
+		if(i_devicename == 'Unknown',
+			if(webvr.mobilevr_screensize == 'auto',
+				set(sizcol, #AA0000);
+				set(known_size, false);
+			  ,
+				set(i_devicename, 'Custom');
+			  );
+		  );
+
+		
+		<!-- create layer for the main menu -->
+		addlayer(vr_setup_m1);
+		set(layer[vr_setup_m1].type, container);
+		set(layer[vr_setup_m1].parent, vr_setup_bg);
+		set(layer[vr_setup_m1].align, lefttop);
+		set(layer[vr_setup_m1].width, 100%);
+		set(layer[vr_setup_m1].height, 100%);
+		
+		<!-- create layer for the headset customization menu -->
+		addlayer(vr_setup_m3);
+		set(layer[vr_setup_m3].type, container);
+		set(layer[vr_setup_m3].parent, vr_setup_bg);
+		set(layer[vr_setup_m3].align, lefttop);
+		set(layer[vr_setup_m3].width, 100%);
+		set(layer[vr_setup_m3].height, 100%);
+		set(layer[vr_setup_m3].visible, false);
+		
+		<!-- create layer for the calibration menu -->
+		addlayer(vr_setup_m2);
+		set(layer[vr_setup_m2].type, container);
+		set(layer[vr_setup_m2].parent, vr_setup_bg);
+		set(layer[vr_setup_m2].align, lefttop);
+		set(layer[vr_setup_m2].width, 100%);
+		set(layer[vr_setup_m2].height, 100%);
+		set(layer[vr_setup_m2].visible, false);
+		
+		<!-- create the text elements -->
+		set(vr_setup_text_parent, 'vr_setup_m1');
+		vr_setup_createtext(vr_setup_title, 'MOBILE VR SETUP',       center, center, 0, -225, #FFFFFF,     false);
+
+		vr_setup_createtext(vr_setup_dvn1, 'Device:',         center, right,  0, -145, #FFFFFF,     true, vr_setup_select('screen') );
+		vr_setup_createtext(vr_setup_dvn2, get(i_devicename), center, left,   0, -145, get(sizcol), true, vr_setup_select('screen') );
+		vr_setup_createtext(vr_setup_siz1, 'Screensize:',     center, right,  0, -105, #FFFFFF,     true, vr_setup_select('screen') );
+		vr_setup_createtext(vr_setup_siz2, get(i_screensize), center, left,   0, -105, get(sizcol), true, vr_setup_select('screen') );
+
+		vr_setup_createtext(vr_setup_ipd1, 'IPD:',            center, right,  0,  -35, #FFFFFF,     true, vr_setup_select('ipd') );
+		vr_setup_createtext(vr_setup_ipd2, get(i_ipd),        center, left,   0,  -35, #FFFFFF,     true, vr_setup_select('ipd') );
+
+		vr_setup_createtext(vr_setup_hmd1, 'VR Headset:',     center, right,  0,  +35, #FFFFFF,     true, vr_setup_select('headset') );
+		vr_setup_createtext(vr_setup_hmd2, get(i_headset),    center, left,   0,  +35, #FFFFFF,     true, vr_setup_select('headset') );
+		
+		vr_setup_createtext(vr_setup_hmd3, 'Customize',       center, center, 0,  +75, #FFFFFF,     true, set(background,true), set(background,false), vr_setup_customize_headset() );
+
+		
+
+		if(webvr.iswebvr == false,
+			vr_setup_createtext(vr_setup_cal, 'Calibrate Gyroscope',   center, center,    0, +145, #FFFFFF,     true, set(background,true), set(background,false), vr_setup_calibration() );
+		  );
+
+		vr_setup_createtext(vr_setup_sav, 'SAVE',          center, center, -200, +225, #FFFFFF,     true, set(background,true), set(background,false), vr_setup_save() );
+		vr_setup_createtext(vr_setup_rst, 'RESET',         center, center,    0, +225, #FFFFFF,     true, set(background,true), set(background,false), vr_setup_reset() );
+		vr_setup_createtext(vr_setup_cls, 'CLOSE',         center, center, +200, +225, #FFFFFF,     true, set(background,true), set(background,false), vr_setup_close() );
+		
+		<!-- and the adjusting buttons -->
+		vr_setup_createbutton(vr_setup_btn1, '&#60;', left,  left,  5%, -35, #FFFFFF, true, null);
+		vr_setup_createbutton(vr_setup_btn2, '&#62;', right, right, 5%, -35, #FFFFFF, true, null);
+		
+		
+		<!-- create the customize_headset text elements -->
+		set(vr_setup_text_parent, 'vr_setup_m3');
+		vr_setup_createtext(vr_setup_m31, 'VR HEADSET', center, center, 0, -225, #FFFFFF, false);
+		
+		vr_setup_createtext(vr_setup_fov1,  'FOV:',           center, right,  0,  -80,  #FFFFFF,    true, vr_setup_select('fov') );
+		vr_setup_createtext(vr_setup_fov2, get(i_fov),        center, left,   0,  -80,  #FFFFFF,    true, vr_setup_select('fov') );
+		vr_setup_createtext(vr_setup_dst1, 'Distortion:',     center, right,  0,  -32,  #FFFFFF,    true, vr_setup_select('dist') );
+		vr_setup_createtext(vr_setup_dst2, get(i_dist),       center, left,   0,  -32,  #FFFFFF,    true, vr_setup_select('dist') );
+		vr_setup_createtext(vr_setup_d2tx, 'Dist2:',          center, right,  0,  +16,  #FFFFFF,    true, vr_setup_select('dist2k1') );
+		vr_setup_createtext(vr_setup_d2k1, get(i_dist2_k1),   center, left,   0,  +16,  #FFFFFF,    true, vr_setup_select('dist2k1') );
+		vr_setup_createtext(vr_setup_d2k2, get(i_dist2_k2),   center, left, +100, +16,  #FFFFFF,    true, vr_setup_select('dist2k2') );
+		vr_setup_createtext(vr_setup_d2k3, get(i_dist2_k3),   center, left, +200, +16,  #FFFFFF,    true, vr_setup_select('dist2k3') );
+		vr_setup_createtext(vr_setup_d2k4, get(i_dist2_k4),   center, left, +300, +16,  #FFFFFF,    true, vr_setup_select('dist2k4') );
+		
+		
+		vr_setup_createtext(vr_setup_cac1, 'CA Corr:',        center, right,  0,  +64,  #FFFFFF,    true, vr_setup_select('ca') );
+		vr_setup_createtext(vr_setup_cac2, get(i_ca),         center, left,   0,  +64,  #FFFFFF,    true, vr_setup_select('ca') );
+		vr_setup_createtext(vr_setup_vig1, 'Vignette:',       center, right,  0, +112,  #FFFFFF,    true, vr_setup_select('vignette') );
+		vr_setup_createtext(vr_setup_vig2, get(i_vig),        center, left,   0, +112,  #FFFFFF,    true, vr_setup_select('vignette') );
+		vr_setup_createtext(vr_setup_olp1, 'Overlap:',        center, right,  0, +160,  #FFFFFF,    true, vr_setup_select('overlap') );
+		vr_setup_createtext(vr_setup_olp2, get(i_overlap),    center, left,   0, +160,  #FFFFFF,    true, vr_setup_select('overlap') );
+				
+		vr_setup_createtext(vr_setup_m35, 'CLOSE',       center, center, 0, +225, #FFFFFF, true, set(background,true), set(background,false), vr_setup_close_sub_menus() );
+		
+		
+		<!-- create the calibration text elements -->
+		set(vr_setup_text_parent, 'vr_setup_m2');
+		vr_setup_createtext(vr_setup_cb1, 'GYROSCOPE', center, center, 0, -225, #FFFFFF, false);
+		vr_setup_createtext(vr_setup_cb2, 'Place the device on a flat and[br]stable surface and tab calibrate[br]to correct a gyroscope drifting.', center, center, 0, -95, #FFFFFF, false, vr_setup_select('screen') );
+		vr_setup_createtext(vr_setup_cb3, 'CALIBRATE',   center, center, 0,  +55, #FFFFFF, true, set(background,true), set(background,false), vr_setup_do_calibration() );
+		vr_setup_createtext(vr_setup_cb4, 'RESET',       center, center, 0, +125, #FFFFFF, true, set(background,true), set(background,false), webvr.resetcalibration() );
+		vr_setup_createtext(vr_setup_cb5, 'CLOSE',       center, center, 0, +225, #FFFFFF, true, set(background,true), set(background,false), vr_setup_close_sub_menus() );
+		
+		vr_setup_createtext(vr_setup_cb6, 'Calibrating...',      bottom, center, 0, 40, #FFFFFF, false, null );
+		vr_setup_createtext(vr_setup_cb7, 'Calibration okay.',   bottom, center, 0, 40, #FFFFFF, false, null );
+		vr_setup_createtext(vr_setup_cb8, 'Calibration failed!', bottom, center, 0, 40, #FFFFFF, false, null );
+		set(layer[vr_setup_cb6].autoalpha, true);
+		set(layer[vr_setup_cb7].autoalpha, true);
+		set(layer[vr_setup_cb8].autoalpha, true);
+		set(layer[vr_setup_cb6].alpha, 0.0);
+		set(layer[vr_setup_cb7].alpha, 0.0);
+		set(layer[vr_setup_cb8].alpha, 0.0);
+		
+		
+		<!-- pre-select the screen size for adjusting when it is unknown, otherwise the IPD -->
+		if(known_size == false,
+			vr_setup_select('screen', true);
+		  ,
+			vr_setup_select('ipd', true);
+		  );
+	</action>
+
+
+	<action name="vr_setup_createtext">
+		<!--
+			%1 = name
+			%2 = text
+			%3 = align
+			%4 = edge
+			%5 = x
+			%6 = y
+			%7 = color
+			%8 = enabled
+			%9 = ondown
+			%10 = onup
+			%11 = onclick
+		-->
+		addlayer(%1);
+		set(layer[%1].parent, get(vr_setup_text_parent));
+		set(layer[%1].url, '%SWFPATH%/plugins/textfield.swf');
+		set(layer[%1].css, calc('text-align:%3;color:%7;font-size:'+40*webvr_setup_scale+'px;font-weight:bold;'));
+		set(layer[%1].padding, calc(0 + ' ' + 8*webvr_setup_scale));
+		set(layer[%1].roundedge, calc(8*webvr_setup_scale));
+		set(layer[%1].background, false);
+		set(layer[%1].backgroundcolor, 0xFFFFFF);
+		set(layer[%1].backgroundalpha, 0.25);
+		set(layer[%1].align, %3);
+		set(layer[%1].edge, %4);
+		set(layer[%1].x, calc(%5 * webvr_setup_scale));
+		set(layer[%1].y, calc(%6 * webvr_setup_scale));
+		set(layer[%1].html, %2);
+		set(layer[%1].enabled, %8);
+		set(layer[%1].ondown, %9);
+		set(layer[%1].onup, %10);
+		set(layer[%1].onclick, %11);
+	</action>
+
+
+	<action name="vr_setup_createbutton">
+		vr_setup_createtext(%1,%2,%3,%4,%5,%6,%7,%8,%9);
+		set(layer[%1].css, calc('vertical-align:middle;text-align:center;color:%7;font-size:'+60*webvr_setup_scale+'px;font-weight:bold;'));
+		set(layer[%1].background, true);
+		set(layer[%1].padding, 0);
+		set(layer[%1].roundedge, calc(40 * webvr_setup_scale));
+		set(layer[%1].width, calc(70 * webvr_setup_scale));
+		set(layer[%1].height, calc(70 * webvr_setup_scale));
+		set(layer[%1].vcenter, true);
+	</action>
+
+
+	<action name="vr_setup_reset">
+		<!-- reset to the defaults -->
+		set(webvr.mobilevr_screensize, 'auto');
+		copy(i_screensize, webvr.devicesize);
+		if(i_screensize LE 0, set(i_screensize, 5.0); );
+		roundval(i_screensize, 1);
+		set(layer[vr_setup_dvn2].html, get(webvr.devicename));
+		txtadd(layer[vr_setup_siz2].html, get(i_screensize), ' inch');
+
+		set(webvr.mobilevr_ipd, 63.5);
+		copy(i_ipd, webvr.mobilevr_ipd);
+		roundval(i_ipd, 1);
+		txtadd(layer[vr_setup_ipd2].html, get(i_ipd), ' mm');
+
+		<!-- set fake custom lens settings and call 'next' headset to switch to the default 'Cardboard' settings -->
+		set(webvr.mobilevr_lens_fov, 100);
+		set(webvr.mobilevr_lens_dist, 0.5);
+		set(webvr.mobilevr_lens_dist2, '1|0|0|0');
+		set(webvr.mobilevr_lens_vign, 100);
+		set(webvr.mobilevr_lens_overlap, 1.0);
+		set(webvr.mobilevr_lens_ca, 0.0);
+		
+		if(webvr.isfake AND device.desktop,
+			<!-- select 'no distortion' headset for fake desktop usage -->
+			vr_setup_change_headset(-1);
+		  ,
+			<!-- select 'Cardboard A' headset for Mobile-VR usage -->
+			vr_setup_change_headset(+1);	
+		  );
+
+		vr_setup_select(get(selected_var));
+	</action>
+
+
+	<action name="vr_setup_close">
+		<!-- 2. parameter == true => remove children elements too -->
+		removelayer(vr_setup_bg, true);
+		
+		<!-- enable cursor -->
+		set(webvr.vr_cursor_enabled, true);
+	</action>
+
+
+	<action name="vr_setup_save">
+		webvr.saveSettings();
+		vr_setup_close();
+	</action>
+	
+	
+	<action name="vr_setup_customize_headset">
+		set(layer[vr_setup_bg].bgalpha, 0.1);
+		
+		set(layer[vr_setup_m1].visible,false);
+		set(layer[vr_setup_m2].visible,false);
+		set(layer[vr_setup_m3].visible,true);
+		
+		set(layer[vr_setup_hmd1].parent, vr_setup_m3);
+		set(layer[vr_setup_hmd2].parent, vr_setup_m3);
+		set(layer[vr_setup_btn1].parent, vr_setup_m3);
+		set(layer[vr_setup_btn2].parent, vr_setup_m3);
+		
+		set(layer[vr_setup_hmd1].y, calc(-145 * webvr_setup_scale));
+		set(layer[vr_setup_hmd2].y, calc(-145 * webvr_setup_scale));
+		
+		copy(old_selection, selected_var);
+		vr_setup_select('headset');
+	</action>
+	
+	
+
+	<action name="vr_setup_calibration">
+		set(layer[vr_setup_m1].visible,false);
+		set(layer[vr_setup_m2].visible,true);
+	</action>
+	
+	<action name="vr_setup_close_sub_menus">
+		set(layer[vr_setup_bg].bgalpha, 0.5);
+		
+		set(layer[vr_setup_m1].visible,true);
+		set(layer[vr_setup_m2].visible,false);
+		set(layer[vr_setup_m3].visible,false);
+		
+		set(layer[vr_setup_hmd1].parent, vr_setup_m1);
+		set(layer[vr_setup_hmd2].parent, vr_setup_m1);
+		set(layer[vr_setup_btn1].parent, vr_setup_m1);
+		set(layer[vr_setup_btn2].parent, vr_setup_m1);
+		
+		set(layer[vr_setup_hmd1].y, calc(+35 * webvr_setup_scale));
+		set(layer[vr_setup_hmd2].y, calc(+35 * webvr_setup_scale));
+		
+		if(old_selection,
+			vr_setup_select(get(old_selection));
+			delete(old_selection);
+		  );
+	</action>
+	
+	<action name="vr_setup_do_calibration">
+		if(!webvr.isfake,
+			tween(layer[vr_setup_cb6].alpha, 1.0, 0.1);
+			tween(layer[vr_setup_cb7].alpha, 0.0, 0.1);
+			tween(layer[vr_setup_cb8].alpha, 0.0, 0.1);
+			webvr.calibrate(
+				tween(layer[vr_setup_cb6].alpha, 0.0, 0.1);
+				tween(layer[vr_setup_cb7].alpha, 1.0, 0.1);
+				delayedcall(2.0, tween(layer[vr_setup_cb7].alpha, 0.0, 0.25) );
+			  ,
+				tween(layer[vr_setup_cb6].alpha, 0.0, 0.1);
+				tween(layer[vr_setup_cb8].alpha, 1.0, 0.1);
+				delayedcall(2.0, tween(layer[vr_setup_cb8].alpha, 0.0, 0.25) );
+			  );
+		  );
+	</action>
+
+	<action name="vr_setup_update_dist2">
+		txtadd(webvr.mobilevr_lens_dist2, get(i_dist2_k1), '|', calc(i_dist2_k2/10.0), '|', calc(i_dist2_k3/10.0), '|', calc(i_dist2_k4/10.0));
+		vr_setup_change_headset(0);
+	</action>
+
+	<action name="vr_setup_select">
+		<!-- select a setting for adjusting -->
+		set(layer[vr_setup_siz2].background, false);
+		set(layer[vr_setup_ipd2].background, false);
+		set(layer[vr_setup_hmd2].background, false);
+		set(layer[vr_setup_fov2].background, false);
+		set(layer[vr_setup_dst2].background, false);
+		set(layer[vr_setup_d2k1].background, false);
+		set(layer[vr_setup_d2k2].background, false);
+		set(layer[vr_setup_d2k3].background, false);
+		set(layer[vr_setup_d2k4].background, false);
+		set(layer[vr_setup_vig2].background, false);
+		set(layer[vr_setup_cac2].background, false);
+		set(layer[vr_setup_olp2].background, false);
+
+		set(selected_setting, null);
+		delete(selected_var_value);
+
+		set(layer[vr_setup_btn1].ondown, vr_setup_change_ondown(-1) );
+		set(layer[vr_setup_btn2].ondown, vr_setup_change_ondown(+1) );
+		set(selected_var_callback, null);
+
+		set(selected_var, %1);
+
+		if(selected_var == 'screen',
+			set(selected_setting,      vr_setup_siz2);
+			set(selected_var_name,     'webvr.mobilevr_screensize');
+			set(selected_var_postfix,  ' inch');
+			copy(selected_var_value,   get(selected_var_name));
+			if(selected_var_value == 'auto', copy(selected_var_value, webvr.devicesize));
+			if(selected_var_value LE 0, set(selected_var_value, 5.0));
+			set(selected_var_step,     0.1);
+			set(selected_var_min,      4);
+			set(selected_var_max,      10);
+			set(selected_var_round,    1);
+			set(selected_var_callback, vr_setup_change_screen() );
+		  );
+
+		if(selected_var == 'ipd',
+			set(selected_setting,      vr_setup_ipd2);
+			set(selected_var_name,     'webvr.mobilevr_ipd');
+			set(selected_var_postfix,  ' mm');
+			copy(selected_var_value,   get(selected_var_name));
+			set(selected_var_step,     0.1);
+			set(selected_var_min,      40);
+			set(selected_var_max,      80);
+			set(selected_var_round,    1);
+		  );
+
+		if(selected_var == 'headset',
+			set(selected_setting,      vr_setup_hmd2);
+			set(layer[vr_setup_btn1].ondown, vr_setup_change_headset(-1) );
+			set(layer[vr_setup_btn2].ondown, vr_setup_change_headset(+1) );
+		  );
+
+		if(selected_var == 'fov',
+			set(selected_setting,      vr_setup_fov2);
+			set(selected_var_name,     'webvr.mobilevr_lens_fov');
+			set(selected_var_postfix,  '');
+			copy(selected_var_value,   get(selected_var_name));
+			set(selected_var_step,     0.1);
+			set(selected_var_min,      40);
+			set(selected_var_max,      179);
+			set(selected_var_round,    1);
+			set(selected_var_callback, vr_setup_change_headset(0) );
+		  );
+
+		if(selected_var == 'dist',
+			set(selected_setting,      vr_setup_dst2);
+			set(selected_var_name,     'webvr.mobilevr_lens_dist');
+			set(selected_var_postfix,  '');
+			copy(selected_var_value,   get(selected_var_name));
+			set(selected_var_step,     0.01);
+			set(selected_var_min,      0);
+			set(selected_var_max,      5);
+			set(selected_var_round,    2);
+			set(selected_var_callback, vr_setup_change_headset(0) );
+		  );
+		
+		if(selected_var == 'dist2k1',
+			set(selected_setting,      vr_setup_d2k1);
+			set(selected_var_name,     'i_dist2_k1');
+			set(selected_var_postfix,  '');
+			copy(selected_var_value,   get(selected_var_name));
+			set(selected_var_step,     0.01);
+			set(selected_var_min,      -9);
+			set(selected_var_max,      +9);
+			set(selected_var_round,    2);
+			set(selected_var_callback, vr_setup_update_dist2() );
+		  );
+		
+		if(selected_var == 'dist2k2',
+			set(selected_setting,      vr_setup_d2k2);
+			set(selected_var_name,     'i_dist2_k2');
+			set(selected_var_postfix,  '');
+			copy(selected_var_value,   get(selected_var_name));
+			set(selected_var_step,     0.01);
+			set(selected_var_min,      -9);
+			set(selected_var_max,      +9);
+			set(selected_var_round,    2);
+			set(selected_var_callback, vr_setup_update_dist2() );
+		  );
+		
+		if(selected_var == 'dist2k3',
+			set(selected_setting,      vr_setup_d2k3);
+			set(selected_var_name,     'i_dist2_k3');
+			set(selected_var_postfix,  '');
+			copy(selected_var_value,   get(selected_var_name));
+			set(selected_var_step,     0.01);
+			set(selected_var_min,      -9);
+			set(selected_var_max,      +9);
+			set(selected_var_round,    2);
+			set(selected_var_callback, vr_setup_update_dist2() );
+		  );
+
+		if(selected_var == 'dist2k4',
+			set(selected_setting,      vr_setup_d2k4);
+			set(selected_var_name,     'i_dist2_k4');
+			set(selected_var_postfix,  '');
+			copy(selected_var_value,   get(selected_var_name));
+			set(selected_var_step,     0.01);
+			set(selected_var_min,      -9);
+			set(selected_var_max,      +9);
+			set(selected_var_round,    2);
+			set(selected_var_callback, vr_setup_update_dist2() );
+		  );
+
+		if(selected_var == 'vignette',
+			set(selected_setting,      vr_setup_vig2);
+			set(selected_var_name,     'webvr.mobilevr_lens_vign');
+			set(selected_var_postfix,  '');
+			copy(selected_var_value,   get(selected_var_name));
+			set(selected_var_step,     1);
+			set(selected_var_min,      10);
+			set(selected_var_max,      200);
+			set(selected_var_round,    0);
+			set(selected_var_callback, vr_setup_change_headset(0) );
+		  );
+
+		if(selected_var == 'ca',
+			set(selected_setting,      vr_setup_cac2);
+			set(selected_var_name,     'webvr.mobilevr_lens_ca');
+			set(selected_var_postfix,  '');
+			copy(selected_var_value,   get(selected_var_name));
+			set(selected_var_step,     0.01);
+			set(selected_var_min,      -1.0);
+			set(selected_var_max,      +1.0);
+			set(selected_var_round,    2);
+			set(selected_var_callback, vr_setup_change_headset(0) );
+		  );
+		  
+		if(selected_var == 'overlap',
+			set(selected_setting,      vr_setup_olp2);
+			set(selected_var_name,     'webvr.mobilevr_lens_overlap');
+			set(selected_var_postfix,  '');
+			copy(selected_var_value,   get(selected_var_name));
+			set(selected_var_step,     0.01);
+			set(selected_var_min,      0.5);
+			set(selected_var_max,      2.0);
+			set(selected_var_round,    2);
+			set(selected_var_callback, vr_setup_change_headset(0) );
+		  );
+
+		if(selected_setting != null,
+			set(layer[get(selected_setting)].background, true);
+			if(%2 == true,
+				set(layer[vr_setup_btn1].y, get(layer[get(selected_setting)].y));
+				set(layer[vr_setup_btn2].y, get(layer[get(selected_setting)].y));
+			  ,
+				tween(layer[vr_setup_btn1].y, get(layer[get(selected_setting)].y));
+				tween(layer[vr_setup_btn2].y, get(layer[get(selected_setting)].y));
+			  );
+		  );
+	</action>
+
+
+	<action name="vr_setup_change_screen">
+		set(layer[vr_setup_dvn2].html, 'Custom');
+		set(layer[vr_setup_dvn2].css, calc('color:#FFFFFF;font-size:'+40*webvr_setup_scale+'px;font-weight:bold;'));
+		set(layer[vr_setup_siz2].css, calc('color:#FFFFFF;font-size:'+40*webvr_setup_scale+'px;font-weight:bold;'));
+	</action>
+
+
+	<action name="vr_setup_change_ondown">
+		copy(t0,timertick);
+		set(t1,0);
+		asyncloop(pressed,
+			copy(t2,timertick);
+			sub(dt,t2,t1);
+			if(dt GT 100,
+				copy(t1,t2);
+				sub(dt,t1,t0);
+				div(dt,1000);
+				Math.max(dt,1);
+				mul(dt,%1);
+				vr_setup_adjust(get(dt));
+			  );
+		  );
+	</action>
+
+
+	<action name="vr_setup_adjust">
+		if(selected_setting != null,
+			mul(change, selected_var_step, %1);
+			add(selected_var_value, change);
+			Math.max(selected_var_value, selected_var_min);
+			Math.min(selected_var_value, selected_var_max);
+			roundval(selected_var_value, get(selected_var_round));
+			tween(get(selected_var_name), get(selected_var_value), 0.1);
+			txtadd(layer[get(selected_setting)].html, get(selected_var_value), get(selected_var_postfix));
+			if(selected_var_callback != null, selected_var_callback());
+		  );
+	</action>
+
+
+	<action name="vr_setup_change_headset">
+		set(i_headset, 'Custom');
+		if(%1 != 0,
+			copy(i_fov, webvr.mobilevr_lens_fov);
+			roundval(i_fov, 1);
+			copy(i_dist, webvr.mobilevr_lens_dist);
+			roundval(i_dist, 2);
+			copy(i_dist2, webvr.mobilevr_lens_dist2);
+			copy(i_vig, webvr.mobilevr_lens_vign);
+			roundval(i_vig, 0);
+			copy(i_ca, webvr.mobilevr_lens_ca);
+			roundval(i_ca, 3);
+			copy(i_overlap, webvr.mobilevr_lens_overlap);
+			roundval(i_overlap, 2);
+			set(i_hsindex, -1);
+			copy(i_hscount, vrheadsets.headset.count);
+			for(set(i,0), i LT i_hscount, inc(i),
+				copy(hs, vrheadsets.headset[get(i)]);
+				if(i_overlap == hs.overlap AND i_fov == hs.fov AND i_dist == hs.dist AND i_dist2 == hs.dist2 AND i_ca == hs.ca AND i_vig == hs.vig , copy(i_hsindex, i); copy(i_headset, hs.caption); );
+			   );
+
+			if(%1 GT 0,
+				<!-- loop right -->
+				add(i_hsindex, 1);
+				if(i_hsindex GE i_hscount, set(i_hsindex,0));
+			  ,
+				<!-- loop left -->
+				sub(i_hsindex, 1);
+				if(i_hsindex LT 0, sub(i_hsindex,i_hscount,1));
+			  );
+
+			copy(hs, vrheadsets.headset[get(i_hsindex)]);
+			copy(i_headset, hs.caption);
+			copy(i_overlap, hs.overlap);
+			copy(i_fov,     hs.fov);
+			copy(i_dist,    hs.dist);
+			copy(i_dist2,   hs.dist2);
+			copy(i_ca,      hs.ca);
+			copy(i_vig,     hs.vig);
+		  );
+
+		copy(layer[vr_setup_hmd2].html, i_headset);
+		if(%1 != 0,
+			copy(webvr.mobilevr_lens_overlap, i_overlap);
+			copy(webvr.mobilevr_lens_fov, i_fov);
+			copy(webvr.mobilevr_lens_dist, i_dist);
+			copy(webvr.mobilevr_lens_dist2, i_dist2);
+			copy(webvr.mobilevr_lens_ca, i_ca);
+			copy(webvr.mobilevr_lens_vign, i_vig);
+			copy(layer[vr_setup_olp2].html, i_overlap);
+			copy(layer[vr_setup_fov2].html, i_fov);
+			copy(layer[vr_setup_dst2].html, i_dist);
+			
+			txtsplit(i_dist2, '|', i_dist2_k1, i_dist2_k2, i_dist2_k3, i_dist2_k4);
+			mul(i_dist2_k1,1);
+			mul(i_dist2_k2,10);
+			mul(i_dist2_k3,10);
+			mul(i_dist2_k4,10);
+			roundval(i_dist2_k1,2);
+			roundval(i_dist2_k2,2);
+			roundval(i_dist2_k3,2);
+			roundval(i_dist2_k4,2);
+			copy(layer[vr_setup_d2k1].html, i_dist2_k1);
+			copy(layer[vr_setup_d2k2].html, i_dist2_k2);
+			copy(layer[vr_setup_d2k3].html, i_dist2_k3);
+			copy(layer[vr_setup_d2k4].html, i_dist2_k4);
+			
+			copy(layer[vr_setup_cac2].html, i_ca);
+			copy(layer[vr_setup_vig2].html, i_vig);
+		  );
+	</action>
+
+</krpano>

BIN
data/krpano/templates/xml/plugins/webvr_cursor_80x80_17f.png


BIN
data/krpano/templates/xml/skin/androidbuttons.png


+ 16 - 0
data/krpano/templates/xml/skin/androidskin.xml

@@ -0,0 +1,16 @@
+<krpano>
+
+	<!--
+		Android Skin (androidskin.xml)
+		In the Android Flashplayer there are unfortunately no multi-touch gestures,
+		like the two-finger zooming - so provide zoom buttons instead.
+		Additionally this skin provides also a fullscreen button.
+	-->  
+	
+	<plugin name="androidzoom_out" keep="true" url="androidbuttons.png" alpha="0.5" crop="0|0|71|64"   align="rightbottom" x="88" y="10" ondown="set(crop,0|64|71|64);  set(fov_moveforce,+1);" onup="set(crop,0|0|71|64);  set(fov_moveforce,0);" />
+	<plugin name="androidzoom_in"  keep="true" url="androidbuttons.png" alpha="0.5" crop="71|0|78|64"  align="rightbottom" x="10" y="10" ondown="set(crop,71|64|78|64); set(fov_moveforce,-1);" onup="set(crop,71|0|78|64); set(fov_moveforce,0);" />
+	<plugin name="androidfsbutton" keep="true" url="androidbuttons.png" alpha="0.5" crop="149|0|64|64" align="righttop"    x="0"  y="0"  onclick="switch(fullscreen);" />
+	
+	<events name="androidfsbutton" keep="true" onenterfullscreen="set(plugin[androidfsbutton].crop,149|64|64|64);" onexitfullscreen="set(plugin[androidfsbutton].crop,149|0|64|64);" />
+
+</krpano>

BIN
data/krpano/templates/xml/skin/arrow.png


BIN
data/krpano/templates/xml/skin/black.png


BIN
data/krpano/templates/xml/skin/buttons-2.png


BIN
data/krpano/templates/xml/skin/buttons.jpg


BIN
data/krpano/templates/xml/skin/buttons.png


BIN
data/krpano/templates/xml/skin/cardboard_logo.png


+ 173 - 0
data/krpano/templates/xml/skin/defaultskin.xml

@@ -0,0 +1,173 @@
+<krpano>
+	<!-- krpano 1.18 default buttons skin -->
+
+	<!-- default mouse control mode (moveto or drag2d) -->
+	<control mousetype="moveto" />
+
+	<!-- default autorotate settings (disabled by default) -->
+	<autorotate enabled="false" waittime="1.0" accel="2.0" speed="8.0" horizon="0.0" tofov="90.0" />
+
+
+	<!-- control buttons style -->
+	<style name="defaultskin_button" url="buttons-2.png" scale="0.5" align="lefttop" />
+
+	<!-- the container layer that contains the buttons -->
+	<layer name="defaultskin_buttons" type="container" width="360" height="40" align="bottom=" y="10" scalechildren="true" scale="1.0" keep="true">
+		<layer name="btn_in"       x="0"   style="defaultskin_button" crop="320|0|80|80" onovercrop="320|80|80|80" ondown="set(fov_moveforce,-1);"     onup="set(fov_moveforce,0);"     />
+		<layer name="btn_out"      x="40"  style="defaultskin_button" crop="400|0|80|80" onovercrop="400|80|80|80" ondown="set(fov_moveforce,+1);"     onup="set(fov_moveforce,0);"     />
+		<layer name="btn_left"     x="80"  style="defaultskin_button" crop=  "0|0|80|80" onovercrop=  "0|80|80|80" ondown="set(hlookat_moveforce,-1);" onup="set(hlookat_moveforce,0);" />
+		<layer name="btn_right"    x="120" style="defaultskin_button" crop= "80|0|80|80" onovercrop= "80|80|80|80" ondown="set(hlookat_moveforce,+1);" onup="set(hlookat_moveforce,0);" />
+		<layer name="btn_up"       x="160" style="defaultskin_button" crop="160|0|80|80" onovercrop="160|80|80|80" ondown="set(vlookat_moveforce,-1);" onup="set(vlookat_moveforce,0);" />
+		<layer name="btn_down"     x="200" style="defaultskin_button" crop="240|0|80|80" onovercrop="240|80|80|80" ondown="set(vlookat_moveforce,+1);" onup="set(vlookat_moveforce,0);" />
+		<layer name="btn_ctrlmode" x="240" style="defaultskin_button" crop="800|0|80|80" onovercrop="800|80|80|80" onclick="switch(control.mousetype,moveto,drag2d); switch(control.touchtype,moveto,drag2d); update_ctrl_mode();" />
+		<layer name="btn_autorot"  x="280" style="defaultskin_button" crop="480|0|80|80" onovercrop="480|80|80|80" onclick="switch(autorotate.enabled);" />
+		<layer name="btn_fs"       x="320" style="defaultskin_button" crop="560|0|80|80" onovercrop="560|80|80|80" onclick="switch(fullscreen);" visible="true" devices="fullscreensupport" />
+	</layer>
+
+	<!-- no fullscreen support => no fullscreen button => smaller container width -->
+	<layer name="defaultskin_buttons" width="320" devices="!fullscreensupport" />
+
+	<!-- scale the buttons 2x for mobile devices -->
+	<layer name="defaultskin_buttons" scale="2.0" devices="mobile" />
+
+
+	<!-- events for handling dynamic changes -->
+	<events name="defaultskin_buttons" keep="true"
+	        onxmlcomplete="update_ctrl_mode(); update_fs_button();"
+	        onresize="adjust_button_sizes();"
+	        onenterfullscreen="update_fs_button();"
+	        onexitfullscreen ="update_fs_button();"
+	        />
+
+
+	<!-- check if the buttons fit inside the window, and if not, make them smaller so that they will fit -->
+	<action name="adjust_button_sizes">
+		if(layer[defaultskin_buttons].pixelwidth GT stagewidth,
+			div(layer[defaultskin_buttons].scale, stagewidth, layer[defaultskin_buttons].width);
+		  );
+	</action>
+
+	<!-- update the buttons and the cursors according to the current control mode setting -->
+	<action name="update_ctrl_mode">
+		if(control.mousetype == drag2d,
+			<!-- set mouse cursor graphic -->
+			set(cursors.url, %SWFPATH%/skin/drag-cursors-2.png);
+			set(cursors.type, drag);
+			set(cursors.move,  0|0|32|32);
+			set(cursors.drag, 32|0|32|32);
+			<!-- set button graphic -->
+			set(layer[btn_ctrlmode].crop,       720|0|80|80);
+			set(layer[btn_ctrlmode].onovercrop, 720|80|80|80);
+		  ,
+			<!-- set mouse cursor graphic -->
+			set(cursors.url, %SWFPATH%/skin/qtvr-cursors.png);
+			set(cursors.type, 8way);
+			set(cursors.move,       0|0|16|16);
+			set(cursors.drag,      16|0|16|16);
+			set(cursors.arrow_u,   32|0|16|16);
+			set(cursors.arrow_d,   48|0|16|16);
+			set(cursors.arrow_l,   64|0|16|16);
+			set(cursors.arrow_r,   80|0|16|16);
+			set(cursors.arrow_lu,  96|0|16|16);
+			set(cursors.arrow_ru, 112|0|16|16);
+			set(cursors.arrow_rd, 128|0|16|16);
+			set(cursors.arrow_ld, 144|0|16|16);
+			<!-- set button graphic -->
+			set(layer[btn_ctrlmode].crop,       800|0|80|80);
+			set(layer[btn_ctrlmode].onovercrop, 800|80|80|80);
+		  );
+	</action>
+
+	<!-- update the fullscreen button according to the current state -->
+	<action name="update_fs_button">
+		if(fullscreen,
+			set(layer[btn_fs].crop,       640|0|80|80);
+			set(layer[btn_fs].onovercrop, 640|80|80|80);
+		  ,
+			set(layer[btn_fs].crop,       560|0|80|80);
+			set(layer[btn_fs].onovercrop, 560|80|80|80);
+		  );
+	</action>
+
+
+	<!--
+		inlined contextmenu.xml 1.18
+		- Change the control mode and the viewing projection via the right click contextmenu.
+		- The distorted view items will be only shown when Flash or WebGL are supported and when the
+		  pano image itself is a full 360x180 pano.
+		- Note: The distorted views will only work correctly when view.stereographic=true will be set.
+	-->
+
+	<contextmenu>
+		<item name="kr" caption="KRPANO"     />
+		<item name="fs" caption="FULLSCREEN" />
+		<item name="cc" caption="Change Controlmode" onclick="cm_changecontrolmode();"  separator="true" />
+		<item name="nv" caption="Normal View"        onclick="cm_normal_view();"        showif="view.vlookatrange == 180" separator="true"      />
+		<item name="fv" caption="Fisheye View"       onclick="cm_fisheye_view();"       showif="view.vlookatrange == 180" devices="flash|webgl" />
+		<item name="sv" caption="Stereographic View" onclick="cm_stereographic_view();" showif="view.vlookatrange == 180" devices="flash|webgl" />
+		<item name="av" caption="Architectural View" onclick="cm_architectural_view();" showif="view.vlookatrange == 180"                       />
+		<item name="pv" caption="Pannini View"       onclick="cm_pannini_view();"       showif="view.vlookatrange == 180" devices="flash|webgl" />
+		<item name="lp" caption="Little Planet View" onclick="cm_littleplanet_view();"  showif="view.vlookatrange == 180" devices="flash|webgl" />
+	</contextmenu>
+
+
+	<action name="cm_changecontrolmode">
+		switch(control.mousetype, moveto, drag2d);
+		switch(control.touchtype, moveto, drag2d);
+	</action>
+
+	<action name="cm_look_straight">
+		if(view.vlookat LT -80 OR view.vlookat GT +80,
+			tween(view.vlookat, 0.0, 1.0, easeInOutSine);
+			tween(view.fov,     100, distance(150,0.8));
+		  );
+	</action>
+
+	<action name="cm_normal_view">
+		cm_look_straight();
+		tween(view.architectural, 0.0, distance(1.0,0.5));
+		tween(view.pannini,       0.0, distance(1.0,0.5));
+		tween(view.fisheye,       0.0, distance(1.0,0.5));
+	</action>
+
+	<action name="cm_architectural_view">
+		cm_look_straight();
+		tween(view.architectural, 1.0, distance(1.0,0.5));
+		tween(view.pannini,       0.0, distance(1.0,0.5));
+		tween(view.fisheye,       0.0, distance(1.0,0.5));
+	</action>
+
+	<action name="cm_fisheye_view">
+		cm_look_straight();
+		tween(view.architectural, 0.0,  distance(1.0,0.5));
+		tween(view.pannini,       0.0,  distance(1.0,0.5));
+		tween(view.fisheye,       0.35, distance(1.0,0.5));
+	</action>
+
+	<action name="cm_stereographic_view">
+		cm_look_straight();
+		tween(view.architectural, 0.0, distance(1.0,0.5));
+		tween(view.pannini,       0.0, distance(1.0,0.5));
+		tween(view.fisheye,       1.0, distance(1.0,0.8));
+	</action>
+
+	<action name="cm_pannini_view">
+		cm_look_straight();
+		tween(view.architectural, 0.0, distance(1.0,0.5));
+		tween(view.pannini,       1.0, distance(1.0,0.8));
+		if(view.fisheye LT 0.1,
+			tween(view.fisheye, 1.0, distance(1.0,0.8));
+		  );
+	</action>
+
+	<action name="cm_littleplanet_view">
+		tween(view.architectural, 0.0, distance(1.0,0.5));
+		tween(view.pannini,       0.0, distance(1.0,0.5));
+		tween(view.fisheye,       1.0, distance(1.0,0.8));
+		tween(view.fov,           150, distance(150,0.8));
+		tween(view.vlookat,        90, distance(100,0.8));
+		add(new_hlookat, view.hlookat, 123.0);
+		tween(view.hlookat, get(new_hlookat), distance(100,0.8));
+	</action>
+
+</krpano>

BIN
data/krpano/templates/xml/skin/drag-cursors-2.png


BIN
data/krpano/templates/xml/skin/drag-cursors.png


+ 55 - 0
data/krpano/templates/xml/skin/flatpano_setup.xml

@@ -0,0 +1,55 @@
+<krpano>
+	<!-- krpano 1.18 viewing and controlling setup for flat panos -->
+
+	<!-- view settings -->
+	<view fovtype="HFOV" fov="1.0" fovmax="1.0" maxpixelzoom="2.0" limitview="lookat" />
+
+	<!-- control settings (drag2d for flat pano) -->
+	<control mousetype="drag2d" touchtype="drag2d" zoomtocursor="true" zoomoutcursor="true" bouncinglimits="true" keycodesin="16" keycodesout="17" />
+
+
+	<!-- events and actions for adjusting the view settings to see the whole image -->
+	<events name="flatpano_events" onnewpano="flatpano_startup();" onresize="flatpano_imagefit();" />
+
+	<!-- setup the view to show the whole image at startup -->
+	<action name="flatpano_startup">
+		div(pano_aspectratio, image.hfov, image.vfov);
+		div(screen_aspectratio, area.pixelwidth, area.pixelheight);
+
+		if(pano_aspectratio GT screen_aspectratio,
+			set(view.fovtype, HFOV);
+			copy(view.fov,    image.hfov);
+			copy(view.fovmax, image.hfov);
+		  ,
+			set(view.fovtype, VFOV);
+			copy(view.fov,    image.vfov);
+			copy(view.fovmax, image.vfov);
+		  );
+	</action>
+
+	<!-- adjust the fov limits during resizing -->
+	<action name="flatpano_imagefit">
+		if(image.vfov GT 0,
+			div(pano_aspectratio, image.hfov, image.vfov);
+			div(screen_aspectratio, area.pixelwidth, area.pixelheight);
+
+			if(pano_aspectratio GT screen_aspectratio,
+				if(view.fovtype == VFOV,
+						remapfovtype(view.fov, VFOV, HFOV, lastresize_width, lastresize_height);
+						set(view.fovtype, HFOV);
+						copy(view.fovmax, image.hfov);
+				  );
+			  ,
+				if(view.fovtype == HFOV,
+						remapfovtype(view.fov, HFOV, VFOV, lastresize_width, lastresize_height);
+						set(view.fovtype, VFOV);
+						copy(view.fovmax, image.vfov);
+				  );
+			  );
+		  );
+
+		set(lastresize_width, get(area.pixelwidth));
+		set(lastresize_height, get(area.pixelheight));
+	</action>
+
+</krpano>

+ 69 - 0
data/krpano/templates/xml/skin/flatskin.xml

@@ -0,0 +1,69 @@
+<krpano>
+	<!-- krpano 1.16 default buttons skin for flat panos -->
+
+	<progress showload="none" showwait="none" />
+	<control zoomtocursor="true" zoomoutcursor="false" />
+
+	<!-- control buttons -->
+	<style name="button" url="%SWFPATH%/skin/buttons.png" keep="true" align="bottom" />
+
+	<plugin name="btn_in"       devices="desktop" x="-160" y="10" style="button" crop="160|0|40|40" onovercrop="160|40|40|40" ondowncrop="160|80|40|40" ondown="set(fov_moveforce,-1);"     onup="set(fov_moveforce,0);"     />
+	<plugin name="btn_out"      devices="desktop" x="-120" y="10" style="button" crop="200|0|40|40" onovercrop="200|40|40|40" ondowncrop="200|80|40|40" ondown="set(fov_moveforce,+1);"     onup="set(fov_moveforce,0);"     />
+	<plugin name="btn_lft"      devices="desktop" x="-80"  y="10" style="button" crop=  "0|0|40|40" onovercrop=  "0|40|40|40" ondowncrop=  "0|80|40|40" ondown="set(hlookat_moveforce,-1);" onup="set(hlookat_moveforce,0);" />
+	<plugin name="btn_rgt"      devices="desktop" x="-40"  y="10" style="button" crop= "40|0|40|40" onovercrop= "40|40|40|40" ondowncrop= "40|80|40|40" ondown="set(hlookat_moveforce,+1);" onup="set(hlookat_moveforce,0);" />
+	<plugin name="btn_up"       devices="desktop" x="+00"  y="10" style="button" crop= "80|0|40|40" onovercrop= "80|40|40|40" ondowncrop= "80|80|40|40" ondown="set(vlookat_moveforce,-1);" onup="set(vlookat_moveforce,0);" />
+	<plugin name="btn_dwn"      devices="desktop" x="+40"  y="10" style="button" crop="120|0|40|40" onovercrop="120|40|40|40" ondowncrop="120|80|40|40" ondown="set(vlookat_moveforce,+1);" onup="set(vlookat_moveforce,0);" />
+	<plugin name="btn_home"     devices="desktop" x="+80"  y="10" style="button" crop="240|0|40|40" onovercrop="240|40|40|40" ondowncrop="240|80|40|40" onclick="zoomto(1.0,smooth(3,3,10));" />
+	<plugin name="btn_dragmode" devices="desktop" x="+120" y="10" style="button" crop="400|0|40|40" onovercrop="400|40|40|40" ondowncrop="400|80|40|40" onclick="dragcursor();" visible="true"  />
+	<plugin name="btn_movemode" devices="desktop" x="+120" y="10" style="button" crop="360|0|40|40" onovercrop="360|40|40|40" ondowncrop="360|80|40|40" onclick="qtvrcursor();" visible="false" />
+	<plugin name="btn_enterfs"  devices="desktop+fullscreensupport" x="+160" y="10" style="button" crop="280|0|40|40" onovercrop="280|40|40|40" ondowncrop="280|80|40|40" onclick="set(fullscreen,true);"  visible="true"  />
+	<plugin name="btn_exitfs"   devices="desktop+fullscreensupport" x="+160" y="10" style="button" crop="320|0|40|40" onovercrop="320|40|40|40" ondowncrop="320|80|40|40" onclick="set(fullscreen,false);" visible="false" />
+
+	<events name="defaultbuttons" keep="true" devices="desktop"
+	        onxmlcomplete="setuppano();"
+	        onenterfullscreen="set(plugin[btn_enterfs].visible,false); set(plugin[btn_exitfs].visible,true);"
+	        onexitfullscreen ="set(plugin[btn_enterfs].visible,true);  set(plugin[btn_exitfs].visible,false);"
+	        />
+
+	<!-- android buttons and events -->
+	<plugin name="androidzoom_out" devices="android+flash" keep="true" url="%SWFPATH%/skin/androidbuttons.png" alpha="0.5" crop="0|0|71|64"   align="rightbottom" x="88" y="10" ondown="set(crop,0|64|71|64);  set(fov_moveforce,+1);" onup="set(crop,0|0|71|64);  set(fov_moveforce,0);" />
+	<plugin name="androidzoom_in"  devices="android+flash" keep="true" url="%SWFPATH%/skin/androidbuttons.png" alpha="0.5" crop="71|0|78|64"  align="rightbottom" x="10" y="10" ondown="set(crop,71|64|78|64); set(fov_moveforce,-1);" onup="set(crop,71|0|78|64); set(fov_moveforce,0);" />
+	<plugin name="androidfsbutton" devices="android+flash" keep="true" url="%SWFPATH%/skin/androidbuttons.png" alpha="0.5" crop="149|0|64|64" align="righttop"    x="0"  y="0"  onclick="switch(fullscreen);" />
+
+	<events name="androidfsbutton" devices="android+flash" keep="true" onenterfullscreen="set(plugin[androidfsbutton].crop,149|64|64|64);" onexitfullscreen="set(plugin[androidfsbutton].crop,149|0|64|64);" />
+
+
+	<!-- actions to change the mouse cursor -->
+	<action name="dragcursor">
+		set(plugin[btn_dragmode].visible, false);
+		set(plugin[btn_movemode].visible, true);
+		set(control.mousetype, drag2D);
+		set(cursors.url, %SWFPATH%/skin/drag-cursors.png);
+		set(cursors.type, drag);
+		set(cursors.move,  2|0|30|32);
+		set(cursors.drag, 37|0|30|32);
+	</action>
+
+	<action name="qtvrcursor">
+		set(plugin[btn_dragmode].visible, true);
+		set(plugin[btn_movemode].visible, false);
+		set(control.mousetype, moveto);
+		set(cursors.url, %SWFPATH%/skin/qtvr-cursors.png);
+		set(cursors.type, 8way);
+		set(cursors.move,       0|0|16|16);
+		set(cursors.drag,      16|0|16|16);
+		set(cursors.arrow_u,   32|0|16|16);
+		set(cursors.arrow_d,   48|0|16|16);
+		set(cursors.arrow_l,   64|0|16|16);
+		set(cursors.arrow_r,   80|0|16|16);
+		set(cursors.arrow_lu,  96|0|16|16);
+		set(cursors.arrow_ru, 112|0|16|16);
+		set(cursors.arrow_rd, 128|0|16|16);
+		set(cursors.arrow_ld, 144|0|16|16);
+	</action>
+
+	<action name="setuppano">
+		qtvrcursor();
+	</action>
+
+</krpano>

+ 38 - 0
data/krpano/templates/xml/skin/multiframeskin.xml

@@ -0,0 +1,38 @@
+<!--
+	krpano 1.16
+	simple multi-frame pano skin 
+-->
+
+<krpano>
+	
+	<plugin name="prevframebg"   url="%SWFPATH%/skin/black.png" align="bottom" y="10" x="+50" width="100" height="70" alpha="0.2" zorder="1" onover="tween(alpha,0.7);" onout="tween(alpha,0.2);" ondown="startnextframe();" onup="stopframechanging();" />
+	<plugin name="nextframebg"   url="%SWFPATH%/skin/black.png" align="bottom" y="10" x="-50" width="100" height="70" alpha="0.2" zorder="1" onover="tween(alpha,0.7);" onout="tween(alpha,0.2);" ondown="startprevframe();" onup="stopframechanging();" />
+	<plugin name="prevframeicon" url="%SWFPATH%/skin/arrow.png" parent="prevframebg" align="right" edge="right"              x="10" scale="0.4" zorder="2" enabled="false" />
+	<plugin name="nextframeicon" url="%SWFPATH%/skin/arrow.png" parent="nextframebg" align="left"  edge="right" rotate="180" x="10" scale="0.4" zorder="2" enabled="false" />
+
+
+	<action name="startnextframe">
+		set(buttondown,true);
+		nextframe();
+	</action>
+
+	<action name="startprevframe">
+		set(buttondown,true);
+		prevframe();
+	</action>
+
+	<action name="nextframe">
+		inc(image.frame,1,get(image.frames),get(image.frames));
+		delayedcall(0.02, if(buttondown,nextframe()) );
+	</action>
+
+	<action name="prevframe">
+		dec(image.frame,1,1,1);
+		delayedcall(0.02,  if(buttondown,prevframe()) );
+	</action>
+
+	<action name="stopframechanging">
+		set(buttondown,false);
+	</action>
+
+</krpano>

+ 142 - 0
data/krpano/templates/xml/skin/objectskin.xml

@@ -0,0 +1,142 @@
+<!--
+	krpano - object movie rotate/zoom/move example skin 
+-->
+
+<krpano>
+
+	<events name="objectskin"
+	        onnewpano="setup_object_viewer(backup);"
+	        onremovepano="setup_object_viewer(restore);"
+	        onenterfullscreen="set(plugin[openfs].visible,false); set(plugin[closefs].visible,true);"
+	        onexitfullscreen ="set(plugin[openfs].visible,true); set(plugin[closefs].visible,false);"
+	        onmousedown="mdown();"
+	        onmouseup="mup();"
+	        onidle="showup_rotate_buttons();"
+	        onviewchange="if(fullviewfov===null, if(view.fov != 90, copy(fullviewfov,view.fov);roundval(fullviewfov,1); ));
+	                      copy(fovrounded,view.fov);
+	                      roundval(fovrounded,1);
+	                      if(fovrounded LT fullviewfov, set(control.mousespeed,10), set(control.mousespeed,0));"
+	        />
+
+	<action name="backup">
+		copy(objectbackup.%1,%1);
+		set(%1,%2);
+	</action>
+	
+	<action name="restore">
+		copy(%1,objectbackup.%1);
+	</action>
+
+	<action name="setup_object_viewer">
+		<!-- backup and set or restore all settings for viewing objects -->
+		%1(idletime, 2.0);
+		%1(view.fovtype, HFOV);
+		%1(view.limitview, fullrange);
+		%1(view.maxpixelzoom, 1.0);
+		%1(control.zoomtocursor, true);
+		%1(control.zoomoutcursor, true);
+		%1(control.mousetype, drag2D);
+		%1(control.mousespeed, mousespeed);
+		%1(display.stillquality, HIGHSHARP);
+	</action>
+	
+
+	<!-- object mouse rotate actions -->
+	
+	<action name="mdown">
+		if(control.mousespeed == 0,
+			set(mbdown, true);
+			set(lastframepos,null);
+			objectrotate();
+		  );
+	</action>
+
+	<action name="mup">
+		set(mbdown, false);
+	</action>
+
+	<action name="objectrotate">
+		div(mxpos, mouse.x, stagewidth);
+		mul(framepos, mxpos, image.frames);
+		roundval(framepos);
+
+		if(lastframepos == null, copy(lastframepos,framepos));
+
+		sub(framemove, lastframepos, framepos);
+		copy(lastframepos,framepos);
+
+		set(rotatedirection, right);
+		if(framemove LT 0, mul(framemove,framemove,-1); set(rotatedirection, left); );
+
+		if(mbdown,
+			if(framemove != 0,
+				if(rotatedirection == left,
+					dec(image.frame,get(framemove),1,get(image.frames));
+				   ,
+					inc(image.frame,get(framemove),get(image.frames),1);
+				  );
+			  );
+
+			delayedcall(0.01,objectrotate());
+		  );
+	</action>
+
+
+	<!-- object UI skin - buttons -->
+
+	<textstyle name="buttonstyle" font="Arial" fontsize="12" bold="true" italic="true"
+	           textcolor="0x000000" background="false" border="false"
+	           blendmode="layer" effect="glow(0xFFFFFF,0.85,4,4);dropshadow(2,45,0x000000,4,1);"
+	           origin="cursor" edge="bottom" xoffset="15" yoffset="-5" showtime="0.1" fadeintime="0.1" fadetime="0.1"
+	           />
+
+	<style name="button" url="%SWFPATH%/skin/buttons.png" zorder="3" keep="true" />
+
+	<plugin name="in"       align="bottom" x="-120" y="10" style="button" crop="160|0|40|40" onovercrop="160|40|40|40" ondowncrop="160|80|40|40" onhover="showtext('Zoom IN ', buttonstyle);"   ondown="set(movevectorz,-1);"  onup="set(movevectorz,0);" />
+	<plugin name="out"      align="bottom" x="-80"  y="10" style="button" crop="200|0|40|40" onovercrop="200|40|40|40" ondowncrop="200|80|40|40" onhover="showtext('Zoom OUT ', buttonstyle);"  ondown="set(movevectorz,+1);"  onup="set(movevectorz,0);" />
+	<plugin name="left"     align="bottom" x="-40"  y="10" style="button" crop=  "0|0|40|40" onovercrop=  "0|40|40|40" ondowncrop=  "0|80|40|40" onhover="showtext('Pan Left ', buttonstyle);"  ondown="set(movevectorx,-1);"  onup="set(movevectorx,0);" />
+	<plugin name="right"    align="bottom" x="0"    y="10" style="button" crop= "40|0|40|40" onovercrop= "40|40|40|40" ondowncrop= "40|80|40|40" onhover="showtext('Pan Right ', buttonstyle);" ondown="set(movevectorx,+1);"  onup="set(movevectorx,0);" />
+	<plugin name="up"       align="bottom" x="+40"  y="10" style="button" crop= "80|0|40|40" onovercrop= "80|40|40|40" ondowncrop= "80|80|40|40" onhover="showtext('Pan Up ', buttonstyle);"    ondown="set(movevectory,-1);"  onup="set(movevectory,0);" />
+	<plugin name="down"     align="bottom" x="+80"  y="10" style="button" crop="120|0|40|40" onovercrop="120|40|40|40" ondowncrop="120|80|40|40" onhover="showtext('Pan Down ', buttonstyle);"  ondown="set(movevectory,+1);"  onup="set(movevectory,0);" />
+	<plugin name="openfs"   align="bottom" x="+120" y="10" style="button" crop="280|0|40|40" onovercrop="280|40|40|40" ondowncrop="280|80|40|40" onhover="showtext('Fullscreen ', buttonstyle);"      onclick="set(fullscreen,true);"  visible="true"  />
+	<plugin name="closefs"  align="bottom" x="+120" y="10" style="button" crop="320|0|40|40" onovercrop="320|40|40|40" ondowncrop="320|80|40|40" onhover="showtext('Exit Fullscreen ',buttonstyle);"  onclick="set(fullscreen,false);" visible="false" />
+
+	<plugin name="rotaterightbg" url="%SWFPATH%/skin/black.png" align="right" width="125" height="100%" alpha="0.0" zorder="1" onover="tween(plugin[rotaterightbg].alpha,0.7);" onout="tween(plugin[rotaterightbg].alpha,0);" ondown="startrotateleft();"  onup="stoprotate();" />
+	<plugin name="rotateleftbg"  url="%SWFPATH%/skin/black.png" align="left"  width="125" height="100%" alpha="0.0" zorder="1" onover="tween(plugin[rotateleftbg].alpha,0.7);"  onout="tween(plugin[rotateleftbg].alpha,0);"  ondown="startrotateright();" onup="stoprotate();" />
+
+	<plugin name="rotaterighticon" url="%SWFPATH%/skin/arrow.png" align="right" x="10" scale="0.5" zorder="2" enabled="false" parent="rotaterightbg" />
+	<plugin name="rotatelefticon"  url="%SWFPATH%/skin/arrow.png" align="left" edge="right" rotate="180" x="10" scale="0.5" zorder="2" enabled="false"  parent="rotateleftbg" />
+
+
+	<!-- button actions -->
+
+	<action name="showup_rotate_buttons">
+		tween(plugin[rotaterightbg].alpha, 0.7, 1.5, easeOutQuad, tween(plugin[rotaterightbg].alpha, 0.0, 2.5, easeInExpo));
+		tween(plugin[rotateleftbg].alpha,  0.7, 1.5, easeOutQuad, tween(plugin[rotateleftbg].alpha,  0.0, 2.5, easeInExpo));
+	</action>
+
+	<action name="startrotateleft">
+		set(rotateing,true);
+		rotateleft();
+	</action>
+
+	<action name="startrotateright">
+		set(rotateing,true);
+		rotateright();
+	</action>
+
+	<action name="rotateleft">
+		dec(image.frame,1,1,get(image.frames));
+		delayedcall(0.02, if(rotateing,rotateleft()) );
+	</action>
+
+	<action name="rotateright">
+		inc(image.frame,1,get(image.frames),1);
+		delayedcall(0.02, if(rotateing,rotateright()) );
+	</action>
+
+	<action name="stoprotate">
+		set(rotateing,false);
+	</action>
+
+</krpano>

BIN
data/krpano/templates/xml/skin/qtvr-bar.png


BIN
data/krpano/templates/xml/skin/qtvr-cursors.png


BIN
data/krpano/templates/xml/skin/rotate_device.png


File diff suppressed because it is too large
+ 765 - 0
data/krpano/templates/xml/skin/videointerface.xml


BIN
data/krpano/templates/xml/skin/videointerface_skin.png


BIN
data/krpano/templates/xml/skin/vtourskin.png


File diff suppressed because it is too large
+ 1108 - 0
data/krpano/templates/xml/skin/vtourskin.xml


+ 0 - 0
data/krpano/templates/xml/skin/vtourskin118.png


Some files were not shown because too many files changed in this diff