tremble hace 4 años
padre
commit
ac8921bfcc
Se han modificado 41 ficheros con 8132 adiciones y 6060 borrados
  1. 1 0
      package.json
  2. 1 493
      public/static/template/plugins/combobox.xml
  3. 493 0
      public/static/template/plugins/combobox.xml.backup-2021-02-01-09-39-53
  4. 1 27
      public/static/template/plugins/fps.xml
  5. 27 0
      public/static/template/plugins/fps.xml.backup-2021-02-01-09-39-53
  6. 1 40
      public/static/template/plugins/loadingpercenttext.xml
  7. 40 0
      public/static/template/plugins/loadingpercenttext.xml.backup-2021-02-01-09-39-53
  8. 1 177
      public/static/template/plugins/showtext.xml
  9. 177 0
      public/static/template/plugins/showtext.xml.backup-2021-02-01-09-39-53
  10. 1 122
      public/static/template/plugins/swipe_gallery.xml
  11. 122 0
      public/static/template/plugins/swipe_gallery.xml.backup-2021-02-01-09-39-53
  12. 1 260
      public/static/template/plugins/thumbbar.xml
  13. 260 0
      public/static/template/plugins/thumbbar.xml.backup-2021-02-01-09-39-53
  14. 1 187
      public/static/template/plugins/tooltip.xml
  15. 187 0
      public/static/template/plugins/tooltip.xml.backup-2021-02-01-09-39-53
  16. 1 904
      public/static/template/plugins/webvr.xml
  17. 904 0
      public/static/template/plugins/webvr.xml.backup-2021-02-01-09-39-53
  18. 1 904
      public/static/template/plugins/webvr/webvr.xml
  19. 904 0
      public/static/template/plugins/webvr/webvr.xml.backup-2021-02-01-09-40-07
  20. 1 762
      public/static/template/skin/lensflare/core.xml
  21. 762 0
      public/static/template/skin/lensflare/core.xml.backup-2021-02-01-09-41-18
  22. 1 22
      public/static/template/skin/lensflare/lensflaresettings.xml
  23. 22 0
      public/static/template/skin/lensflare/lensflaresettings.xml.backup-2021-02-01-09-41-18
  24. 1 1995
      public/static/template/skin/vtourskin.xml
  25. 1995 0
      public/static/template/skin/vtourskin.xml.backup-2021-02-01-09-38-41
  26. 1995 0
      public/static/template/skin/vtourskin_backup
  27. 1 104
      public/static/template/tour.xml
  28. 100 0
      public/static/template/tour.xml.backup-2021-02-01-09-36-26
  29. 6 1
      src/Store/index.js
  30. 1 1
      src/api/index.js
  31. 1 1
      src/assets/style/component.less
  32. 23 17
      src/framework/Head.vue
  33. 19 3
      src/framework/MenuPC.vue
  34. 2 1
      src/framework/Toolbar.vue
  35. 17 8
      src/framework/core/index.vue
  36. 0 1
      src/framework/show/index.vue
  37. 11 2
      src/router/index.js
  38. 12 12
      src/utils/request.js
  39. 31 9
      src/views/information/Toolbar.vue
  40. 6 6
      src/views/information/index.vue
  41. 1 1
      vue.config.js

+ 1 - 0
package.json

@@ -4,6 +4,7 @@
   "private": true,
   "scripts": {
     "serve": "vue-cli-service serve",
+    "serve-uat": "vue-cli-service serve  --mode uat",
     "build": "vue-cli-service build",
     "build-uat": "vue-cli-service build --mode uat",
     "lint": "vue-cli-service lint"

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1 - 493
public/static/template/plugins/combobox.xml


+ 493 - 0
public/static/template/plugins/combobox.xml.backup-2021-02-01-09-39-53

@@ -0,0 +1,493 @@
+<krpano>
+
+	<!--
+		combobox.xml Plugin - krpano 1.19-pr14
+
+		- This plugin converts <combobox> elements in the current xml
+		  into <layer> container, scrollarea and textfield elements.
+		- Additionally it's also possible to add and remove combobox
+		  elements also dynamically.
+		- The full xml implementation allows many ways of customizing
+		  for own needs - custom designs/styles, custom functionality.
+		- The plugin works automatically the same for HTML5 and Flash.
+		- It's possible to use this plugin as replacement for the old
+		  combobox.swf/combobox.js plugins, the action interfaces are
+		  the same.
+
+
+		Syntax for Static XML Code:
+
+			<combobox name="..." design="..." ...any layer settings...>
+				<item name="..." caption="..." onclick="..." />
+				<item name="..." caption="..." onclick="..." />
+			</combobox>
+
+		Syntax for Dynamic XML Code:
+
+		 - Global Actions:
+
+			addComboboxLayer(cbname, design*)
+			removeComboboxLayer(cbname);
+
+		 - Combobox Layer Actions:
+
+			layer[cbname].addItem(caption, onclick)
+			layer[cbname].addNamedItem(name, caption, onclick)
+			layer[cbname].addIdItem(name, caption, onclick);       same as addNamedItem (for combobox.js compatibility)
+			layer[cbname].selectItem(caption)
+			layer[cbname].selectItemByName(name_or_index)
+			layer[cbname].selectIdItem(name_or_index)              same as selectItemByName (for combobox.js compatibility)
+			layer[cbname].removeAll()
+			layer[cbname].openList()
+			layer[cbname].closeList()
+
+		 - Events/Callbacks:
+
+			layer[cbname].onChange
+
+		- Combobox Layer Attributes:
+
+			layer[cbname].item              - krpano Array of the items
+			layer[cbname].selecteditemindex - current selected item index
+	-->
+
+	<!-- path to the scrollarea plugin -->
+	<combobox_scrollareaplugin
+		url.html5="%SWFPATH%/plugins/scrollarea.js"
+		url.flash="%SWFPATH%/plugins/scrollarea.swf"
+		/>
+
+	<!-- core internal layer styles -->
+	<style name="combobox_container_style" type="container" maskchildren="true" bgcapture="true" visible="false" onclick="combobox_onclick_event();" mergedalpha="false" alpha="1.0" />
+	<style name="combobox_marker_style" type="text" align="righttop" edge="center" html="▼" havemarkersize="false" onautosized="set(havemarkersize,true);" mergedalpha="false" alpha="1.0" />
+	<style name="combobox_item_style" type="text" wordwrap="false" vcenter="true" align="lefttop" onover="if(!combbox_item_pressed,onoveritem());asyncloop(hovering,,if(!combbox_item_pressed,onoutitem()));" ondown="onoveritem(); set(combbox_item_pressed,true);" onup="onoutitem(); set(combbox_item_pressed,false);" onoveritem="set(bg,true);" onoutitem="set(bg,false);" mergedalpha="false" alpha="1.0" />
+
+	<!-- several pre-defined designs -->
+	<combobox_design name="default" margin="2" open_close_speed="0.25">
+		<!-- default design - white box with black text and blue selection -->
+		<style name="combobox_container_style" bgalpha="1.0" bgcolor="0xFFFFFF" bgborder="1 0xFFFFFF 0.5" bgroundedge="1" bgshadow="0 1 3 0x000000 1.0" />
+		<style name="combobox_marker_style" css="color:#FFFFFF;" bg="false" txtshadow="0 0 2 0x000000 1" />
+		<style name="combobox_item_style" css="color:#222222;" padding="4 4" bg="false" bgcolor="0xC7E4FC" bgalpha="1.0" bgroundedge="1" txtshadow="0 0 1 0xFFFFFF 1.0" />
+	</combobox_design>
+
+	<combobox_design name="vtour" margin="4" open_close_speed="0.25">
+		<!-- default vtourskin.xml design -->
+		<style name="combobox_container_style" bgalpha="0.8" bgcolor="0x2D3E50" bgborder="0" bgroundedge="1" bgshadow="0 4 10 0x000000 0.3" />
+		<style name="combobox_marker_style" css="color:#FFFFFF;" bg="false" txtshadow="0 0 2 0x000000 1" />
+		<style name="combobox_item_style" css="color:#FFFFFF;" padding="4 4" bg="false" bgcolor="0xFFFFFF" bgalpha="0.5" bgroundedge="0" txtshadow="0 0 2 0x000000 1" />
+	</combobox_design>
+
+
+	<!-- internal events -->
+	<events name="combobox_xml_plugin_events" keep="true"
+	        onxmlcomplete="combobox_parse_xml_elements();"
+	        onresize="combobox_closelist();"
+	        />
+
+
+	<!-- krpano version check -->
+	<action name="combobox_versioncheck" autorun="preinit">
+		if(build LT '2017-09-13',
+			error('combobox.xml - too old krpano version!');
+			set(events[combobox_xml_plugin_events].name, null);
+			set(action[addComboboxLayer].content, '');
+			set(action[removeComboboxLayer].content, '');
+		);
+	</action>
+
+
+	<!-- convert all <combobox> elements to layers -->
+	<action name="combobox_parse_xml_elements" scope="local">
+		if(global.combobox,
+			def(i, integer, 0);
+			def(cnt, integer, get(global.combobox.count));
+			copy(combobox_src, global.combobox);
+			delete(global.combobox);
+			if(cnt GT 0, loop(i LT cnt,
+				copy(cb, combobox_src[get(i)]);
+				if(cb AND cb.name AND cb.parsed != true,
+					set(cb.parsed, true);
+					addComboboxLayer(get(cb.name), get(cb.design));
+					copy(ly, layer[get(cb.name)]);
+					copyattributes(get(ly), get(cb));
+					set(ly.keep, true);
+					def(item_cnt, integer, get(cb.item.count));
+					if(item_cnt GT 0,
+						def(item_i, integer, 0);
+						loop(item_i LT  item_cnt,
+							combobox_additem(get(ly.name), get(cb.item[get(item_i)].name), get(cb.item[get(item_i)].caption), get(cb.item[get(item_i)].onclick));
+							inc(item_i);
+						);
+					);
+				);
+				inc(i);
+			));
+		);
+	</action>
+
+
+	<!-- dynamically add a combobox layer -->
+	<action name="addComboboxLayer" scope="local" args="cbname, design">
+		<!-- create the layer -->
+		addlayer(get(cbname));
+		copy(cb, layer[get(cbname)]);
+		set(cb.keep, true);
+		
+		<!-- copy the design settings (or set defaults) -->
+		if(!combobox_design[get(design)].name, set(design,'default'));
+		copy(cb.cbdesign, combobox_design[get(design)]);
+		calc(cb.margin, cb.cbdesign.margin !== null ? cb.cbdesign.margin : 2);
+		calc(cb.open_close_speed, cb.cbdesign.open_close_speed !== null ? cb.cbdesign.open_close_speed : 0.25);
+		<!-- load the styles and copy the design style settings -->
+		cb.loadstyle(combobox_container_style);
+		copyattributes(get(cb), get(cb.cbdesign.style[combobox_container_style]));
+
+		<!-- add/build/map actions -->
+		calc(cb.addItem,          'combobox_additem(' + cbname + ', null, "%%1", "%%2");');
+		calc(cb.addNamedItem,     'combobox_additem(' + cbname + ', "%%1", "%%2", "%%3");');
+		calc(cb.addIdItem,        'combobox_additem(' + cbname + ', "%%1", "%%2", "%%3");');
+		calc(cb.selectItem,       'combobox_finditem(' + cbname + ', "%%1", __cb_fi); if(__cb_fi GE 0, combobox_selectitem(' + cbname + ', get(__cb_fi))); delete(__cb_fi);');
+		calc(cb.selectItemByName, 'combobox_selectitem(' + cbname + ', "%%1");');
+		calc(cb.selectIdItem,     'combobox_selectitem(' + cbname + ', "%%1");');
+		calc(cb.removeAll,        'combobox_removeitems(' + cbname + ');');
+		calc(cb.openList,         'combobox_openlist(' + cbname + ');');
+		calc(cb.closeList,        'combobox_closelist(' + cbname + ');');
+
+		<!-- create sub-layers -->
+		calc(saname, 'combobox_' + cbname + '_scrollarea');
+		addlayer(get(saname));
+		copy(sa, layer[get(saname)]);
+		copy(sa.parent, cbname);
+		copy(sa.url, combobox_scrollareaplugin.url);
+		copy(sa.keep, true);
+		copy(sa.align, lefttop);
+		set(sa.direction, v);
+		set(sa.enabled, false);
+		set(sa.width, 100%);
+		set(sa.height, 100%);
+		copy(cb.scrollarea, sa);
+
+		calc(mkname, 'combobox_' + cbname + '_marker');
+		addlayer(get(mkname));
+		copy(mk, layer[get(mkname)]);
+		copy(mk.parent, saname);
+		copy(mk.keep, true);
+		mk.loadstyle(combobox_marker_style);
+		copyattributes(get(mk), get(cb.cbdesign.style[combobox_marker_style]));
+		copy(cb.marker, mk);
+
+		<!-- item data array -->
+		cb.createarray('item');
+
+		<!-- item autosizing information -->
+		set(cb.autosize_i, 0);
+		set(cb.autosize_cnt, 0);
+		set(cb.autosize_max_w, 0);
+		set(cb.autosize_max_h, 0);
+
+		set(cb.lastselecteditemindex, 0);
+		set(cb.selecteditemindex, 0);
+	</action>
+
+
+	<!-- dynamically remove a combobox element -->
+	<action name="removeComboboxLayer" scope="local" args="cbname">
+		if(layer[get(cbname)],
+			copy(cb, layer[get(cbname)]);
+			if(cb === global.openedcombobox, delete(global.openedcombobox));
+			if(cb,
+				removelayer(get(cbname), true);
+			);
+		);
+	</action>
+
+
+	<!-- default onclick event for combobox elements: open the list -->
+	<action name="combobox_onclick_event">
+		combobox_openlist(get(name));
+	</action>
+
+
+	<!-- dynamically add items -->
+	<action name="combobox_additem" scope="local" args="cbname, itemname, itemcaption, itemonclick">
+		copy(cb, layer[get(cbname)]);
+
+		<!-- when no item name is set, generate an automatic one -->
+		if(itemname === null, calc(itemname, 'autoname_' + cb.item.count); );
+
+		<!-- save the item caption and onclick event -->
+		copy(cb.item[get(itemname)].caption, itemcaption);
+		copy(cb.item[get(itemname)].onclick, itemonclick);
+
+		inc(cb.autosize_cnt);
+
+		<!-- create the item layer/textfield -->
+		calc(itemlayername, 'comboboxitem_' + cbname + '_' + itemname);
+		addlayer(get(itemlayername));
+		copy(li, layer[get(itemlayername)]);
+		li.loadstyle(combobox_item_style);
+		copyattributes(get(li), get(cb.cbdesign.style[combobox_item_style]));
+		copy(li.parent, cb.scrollarea.name);
+		copy(li.keep, true);
+		copy(li.cblayername, cb.name);
+		copy(li.itemname, itemname);
+		copy(li.html, itemcaption);
+		set(li.onautosized, delayedcall(0,combobox_item_autosize_update()) );
+		set(li.onclick, combobox_item_onclick() );
+
+		copy(cb.item[get(itemname)].itemlayername, itemlayername);
+	</action>
+
+
+	<!-- onautosized callback from the item textfield -->
+	<action name="combobox_item_autosize_update" scope="local">
+		copy(cb, layer[get(caller.cblayername)]);
+		inc(cb.autosize_i);
+		Math.max(cb.autosize_max_w, caller.width);
+		Math.max(cb.autosize_max_h, caller.height);
+		if(cb.autosize_i == cb.autosize_cnt, combobox_align_items(get(cb.name)); );
+	</action>
+
+
+	<!-- align the image and set the combobox size -->
+	<action name="combobox_align_items" scope="local" args="cbname">
+		copy(cb, layer[get(cbname)]);
+		if(cb.marker.havemarkersize == false OR cb.scrollarea.loaded == false,
+			<!-- wait until everything is ready -->
+			delayedcall(calc(cb.name + '_waitformarkersize'), 0.01, combobox_align_items(get(cbname)) );
+		  ,
+			<!-- set the item positions and the combobox size -->
+			if(global.openedcombobox === cb, combobox_closelist() );
+			copy(sa, cb.scrollarea);
+			calc(itemwidth, cb.margin GT 0 ? -2 * cb.margin : '100%');
+			copy(mk_w, cb.marker.width);
+			copy(item_cnt, cb.autosize_cnt);
+
+			for(def(item_i, integer, 0), item_i LT item_cnt, inc(item_i),
+				copy(li, layer[get(cb.item[get(item_i)].itemlayername)]);
+				set(li.x, get(cb.margin));
+				copy(li.width, itemwidth);
+				copy(li.height, cb.autosize_max_h);
+				calc(li.y, cb.margin + item_i * (cb.autosize_max_h + cb.margin));
+			);
+
+			if(cb.width == null OR cb.width == cb.lastautosizedwidth,
+				<!-- no combobox width (or an autosized width) set - set the largest item width -->
+				calc(cb.width, cb.margin + cb.autosize_max_w + 2 + mk_w + cb.margin);
+				copy(cb.lastautosizedwidth, cb.width);
+			);
+
+			calc(cb.height, 2*cb.margin + cb.autosize_max_h);
+			calc(sa.height, cb.margin + item_cnt*(cb.margin+cb.autosize_max_h));
+			calc(sa.y, -(cb.selecteditemindex * (cb.autosize_max_h + cb.margin)));
+			calc(cb.marker.x, cb.margin + mk_w/2);
+			tween(layer[get(cb.name)].marker.y, calc(cb.margin + cb.selecteditemindex*(cb.autosize_max_h + cb.margin) + cb.autosize_max_h/2), 0.1);
+
+			<!-- when all is done, show the combobox -->
+			delayedcall(0.1, set(layer[get(cb.name)].visible,true); );
+		);
+	</action>
+
+
+	<!-- default onclick event for items: select the current item, close the list and call the item onclick event -->
+	<action name="combobox_item_onclick" scope="local">
+		copy(cb, layer[get(caller.cblayername)]);
+		copy(itemname, caller.itemname);
+		combobox_selectitem(get(cb.name), get(itemname));
+
+		if(global.openedcombobox === cb, combobox_closelist() );
+
+		if(cb.item[get(itemname)].onclick,
+			<!-- call the onclick event after the combobox has closed -->
+			delayedcall(get(cb.open_close_speed),
+				copy(cb.curitem, cb.item[get(itemname)]);
+				callwith(cb,
+					cb.item[get(itemname)].onclick();
+				);
+			);
+		);
+	</action>
+
+
+	<!-- select an item -->
+	<action name="combobox_selectitem" scope="local" args="cbname, itemname">
+		if(global.combbox_item_pressed != true,
+			copy(cb, layer[get(cbname)]);
+			copy(cb.lastselecteditemindex, cb.selecteditemindex);
+			copy(cb.selecteditemindex, cb.item[get(itemname)].index);
+			<!-- call onchange event on selection change -->
+			if(cb.lastselecteditemindex != cb.selecteditemindex AND cb.onchange,
+				callwith(cb, onchange() );
+			);
+			if(global.openedcombobox === cb,
+				<!-- when opened, just close to the selected item -->
+				combobox_closelist();
+			  ,
+				if(layer[get(cbname)].scrollarea.loaded,
+					layer[get(cbname)].scrollarea.stopscrolling();
+					calc(offset, cb.selecteditemindex*(cb.autosize_max_h + cb.margin));
+					tween(layer[get(cbname)].marker.y, calc(cb.margin + offset + cb.autosize_max_h/2), 0);
+					tween(layer[get(cbname)].scrollarea.y, calc(-offset), 0, default, layer[get(cbname)].scrollarea.update(); );
+				);
+			);
+		);
+	</action>
+
+
+	<!-- find an item by its caption, the global variable defined in 'returnvariable' will contain the index  -->
+	<action name="combobox_finditem" scope="local" args="cbname, itemcaption, returnvariable">
+		copy(cb, layer[get(cbname)]);
+		copy(item_cnt, cb.item.count);
+		set(calc('global.' + returnvariable), -1);
+		for(def(item_i, integer, 0), item_i LT  item_cnt, inc(item_i),
+			if(cb.item[get(item_i)].caption == itemcaption,
+				copy(calc('global.' + returnvariable), item_i);
+				copy(item_i, item_cnt);
+			);
+		);
+	</action>
+
+
+	<!-- remove all items (to be able to add new ones) -->
+	<action name="combobox_removeitems" scope="local" args="cbname">
+		copy(cb, layer[get(cbname)]);
+		if(global.openedcombobox === cb, combobox_closelist() );
+
+		<!-- remove all item layers -->
+		calc(item_i, cb.item.count - 1);
+		loop(item_i GE 0,
+			removelayer(get(cb.item[get(item_i)].itemlayername));
+			dec(item_i);
+		);
+
+		<!-- reset the item information -->
+		set(cb.item.count, 0);
+		set(cb.autosize_i,0);
+		set(cb.autosize_cnt, 0);
+		set(cb.autosize_max_w, 0);
+		set(cb.autosize_max_h, 0);
+		set(cb.selecteditemindex, 0);
+		set(cb.lastselecteditemindex, 0);
+		if(cb.width == cb.lastautosizedwidth, set(cb.width, null));
+	</action>
+
+
+	<!-- open the combobox list -->
+	<action name="combobox_openlist" scope="local" args="cbname">
+		<!-- if another combobox is already open, close that one first -->
+		if(global.openedcombobox !== null, combobox_closelist() );
+
+		copy(cb, layer[get(cbname)]);
+		copy(global.openedcombobox, cb);
+
+		<!-- find the available screen space above or below the combobox -->
+		calc(cbheight, 2*cb.margin + cb.autosize_max_h);
+		set(lx1, 0);
+		set(ly1, 0);
+		copy(lx2, cb.pixelwidth);
+		copy(ly2, cbheight);
+		layertoscreen(get(cbname), lx1,ly1, lx1,ly1);
+		layertoscreen(get(cbname), lx2,ly2, lx2,ly2);
+		calc(space_above, ly1 - area.pixely);
+		calc(space_below, area.pixelheight - (ly2 - area.pixely));
+
+		<!-- the required space for full opening: -->
+		calc(openheight, cb.margin + cb.autosize_cnt*(cb.margin+cb.autosize_max_h) );
+
+		<!-- vertical centered alignment? -->
+		calc(cb_edge, cb.edge ? cb.edge : cb.align);
+		calc(iscentered, cb_edge == 'left' OR cb_edge == 'center' OR cb_edge == 'right');
+		if(iscentered,
+			calc(openheight_max, space_above + space_below);
+		  ,
+			Math.max(openheight_max, space_above, space_below);
+		);
+
+		<!-- limit the height to the available space (minus some margin) -->
+		Math.min(openheight, calc(openheight_max + cbheight - 20));
+
+		<!-- need vertical offset? (depending on the available space and the align/edge setting) -->
+		set(yoffset, null);
+		calc(top_overflow, -ly1 + area.pixely + openheight/2);
+		calc(bottom_overflow, ly2 - area.pixely + openheight/2 - area.pixelheight);
+		if(cb.parent,
+			<!-- no vertical offset inside other layers, do only a height clipping -->
+			Math.max(max_overflow, top_overflow, bottom_overflow, 0);
+			sub(openheight, max_overflow);
+		  ,
+			if(iscentered,
+				if(openheight GE (area.pixelheight - 20),
+					set(yoffset,0);
+				  ,
+					if(top_overflow GT 0, calc(yoffset, cb.y + top_overflow); );
+					if(bottom_overflow GT 0, calc(yoffset, cb.y - bottom_overflow); );
+				);
+			,
+				indexoftxt(isbottomalign, get(cb_edge), 'bottom');
+				if(space_above GT space_below,
+					if(isbottomalign LT 0, calc(yoffset, cb.y - openheight + cbheight); );
+				  ,
+					if(isbottomalign GE 0, calc(yoffset, cb.y - openheight + cbheight); );
+				);
+			);
+		);
+		if(yoffset != null,
+			copy(cb.ybackup, cb.y);
+			tween(layer[get(cbname)].y, calc(yoffset), get(cb.open_close_speed));
+		);
+
+		<!-- center the opened list at the selected item -->
+		calc(centeritem_y, -1 * (cb.margin + cb.selecteditemindex*(cb.margin+cb.autosize_max_h) + cb.autosize_max_h/2 - openheight/2));
+		clamp(centeritem_y, calc(openheight - cb.scrollarea.height), 0);
+
+		<!-- apply the changes now -->
+		tween(layer[get(cbname)].height, get(openheight), get(cb.open_close_speed));
+		tween(layer[get(cbname)].scrollarea.y, get(centeritem_y), get(cb.open_close_speed), default, layer[get(cbname)].scrollarea.update(); );
+
+		<!-- special html5/flash case:
+			 rotating textfields (the marker symbol here) are not possible in
+			 flash (a flashplayer limitation), so use a rotated symbol instead.
+		-->
+		if(device.html5,
+			tween(layer[get(cbname)].marker.rotate, 90, get(cb.open_close_speed));
+		  ,
+			set(layer[get(cbname)].marker.html, '◀');
+		);
+
+		<!-- enable the scrollarea to allow the user to drag it -->
+		set(cb.scrollarea.enabled, true);
+
+		<!-- install a global onmousedown event to close the list when clicking at the pano -->
+		set(events[combobox_xml_plugin_events].onmousedown, combobox_closelist() );
+	</action>
+
+
+	<!-- close the current open list -->
+	<action name="combobox_closelist" scope="local">
+		if(global.openedcombobox !== null,
+			copy(cb, global.openedcombobox);
+			delete(global.openedcombobox);
+			
+			<!-- clear the global onmousedown event -->
+			set(events[combobox_xml_plugin_events].onmousedown, null);
+
+			<!-- disable the dragging -->
+			set(cb.scrollarea.enabled, false);
+
+			<!-- closing animations -->
+			calc(offset, cb.selecteditemindex*(cb.autosize_max_h + cb.margin));
+			if(cb.ybackup !== null, tween(cb.y, get(cb.ybackup), get(cb.open_close_speed)));
+			layer[get(cb.name)].scrollarea.stopscrolling();
+			tween(layer[get(cb.name)].height, calc(2*cb.margin + cb.autosize_max_h), get(cb.open_close_speed));
+			tween(layer[get(cb.name)].scrollarea.y, calc(-offset), get(cb.open_close_speed), default, layer[get(cb.name)].scrollarea.update(); );
+			tween(layer[get(cb.name)].marker.y, calc(cb.margin + offset + cb.autosize_max_h/2), get(cb.open_close_speed));
+			<!-- special html5/flash case: rotate marker or change symbol -->
+			if(device.html5,
+				tween(layer[get(cb.name)].marker.rotate, 0, get(cb.open_close_speed));
+			  ,
+				set(layer[get(cb.name)].marker.html, '▼');
+			);
+		);
+	</action>
+
+</krpano>

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1 - 27
public/static/template/plugins/fps.xml


+ 27 - 0
public/static/template/plugins/fps.xml.backup-2021-02-01-09-39-53

@@ -0,0 +1,27 @@
+<krpano>
+
+	<!--
+		fps (frames per second) xml plugin
+		- this plugin shows the current average rendering frame-rate
+	-->
+
+	<action name="fps_install" autorun="preinit" scope="local">
+		delayedcall(1.0,
+			addlayer(fps_display);
+			set(layer[fps_display],
+				type=text,
+				keep=true,
+				align='lefttop',
+				css=calc('font-size:'+(device.mobile AND stagescale LT 1.0 ? 24 : 12)+'px; color:#FFFFFF;'),
+				txtshadow='0 0 1 0x000000 1.0',
+				bg=false,
+				parent=STAGE,
+				enabled=false
+			);
+			setinterval(fps_plugin, 0.5,
+				calc(layer[fps_display].html, 'FPS: ' + ((display.currentfps+0.5) BOR 0));
+			);
+		);
+	</action>
+
+</krpano>

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1 - 40
public/static/template/plugins/loadingpercenttext.xml


+ 40 - 0
public/static/template/plugins/loadingpercenttext.xml.backup-2021-02-01-09-39-53

@@ -0,0 +1,40 @@
+<!--
+	show the loading progress as percent text
+	- just include once this xml
+-->
+<krpano>
+
+	<!-- loading percent events -->
+	<events name="loadingpercent" keep="true"
+	        onxmlcomplete="loadingpercent_startloading();"
+	        onloadcomplete="delayedcall(2.25, loadingpercent_stoploading() );"
+	        />
+
+	<!-- loading percent text -->
+	<layer name="loadingpercent_text" keep="true"
+	       url="%SWFPATH%/plugins/textfield.swf"
+	       align="center"
+	       y="10%"
+	       background="false"
+	       css="color:#ffffff; font-family:Arial; font-weight:bold; font-size:22px; font-style:italic;" textshadow="2"
+	       html="111111111"
+	       />
+
+	<!-- loading percent actions -->
+	<action name="loadingpercent_startloading">
+		set(loadingpercent_isloading, true);
+		set(layer[loadingpercent_text].visible, true);
+
+		asyncloop(loadingpercent_isloading,
+			mul(pvg, progress.progress, 100);
+			roundval(pvg,0);
+			txtadd(layer[loadingpercent_text].html, 'Loading ', get(pvg), '%');
+		  );
+	</action>
+
+	<action name="loadingpercent_stoploading">
+		set(loadingpercent_isloading, false);
+		set(layer[loadingpercent_text].visible, false);
+	</action>
+
+</krpano>

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1 - 177
public/static/template/plugins/showtext.xml


+ 177 - 0
public/static/template/plugins/showtext.xml.backup-2021-02-01-09-39-53

@@ -0,0 +1,177 @@
+<krpano>
+	<textstyle name="skintext" font="黑体" fontsize.no-mobile="14" fontsize.mobile="18" bold="false"
+           background="true" backgroundcolor="0x000000" backgroundalpha="0.667"
+           border="true" borderwidth="2" bordercolor="0xFFFFFF" roundedge="5"
+           textcolor="0xFFFFFF"
+           padding="5 7" 
+           textalign="center"
+           yoffset.no-touch="-5"
+           yoffset.touch="-40"/>
+	<!-- 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>

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1 - 122
public/static/template/plugins/swipe_gallery.xml


+ 122 - 0
public/static/template/plugins/swipe_gallery.xml.backup-2021-02-01-09-39-53

@@ -0,0 +1,122 @@
+<krpano version="1.18">
+
+	<action name="make_gallery">
+		trace(%0 %1);
+		
+		<!-- config -->
+		set(min_movement, 50);              <!-- minimal movement in pixels needed to swipe picture -->
+		set(show_arrows,  true);            <!-- show gallery arrows -->
+		
+		<!-- creating galery -->
+		if (%1 != null,
+			<!-- removing previous gallery -->
+			for(copy(i, plugin.count), i GE 0, dec(i),
+				if(plugin[get(i)].parent == gallery_scrollarea,
+					removeplugin(get(i));
+				);
+			);
+			
+			set(activeGallery, %1);
+		
+			<!-- scroller's width -->
+			mul(layer[gallery_scrollarea].width, stagewidth, gallery[%1].img.count);
+			layer[gallery_scrollarea].setcenter(0,0);
+			set(pic_id, 0);
+        	
+
+			<!-- adding images -->
+			for(set(i,0), i LT gallery[%1].img.count, inc(i),
+				set(iname, get(gallery[%1].img[get(i)].name));
+				txtadd(cname, get(gallery[%1].img[get(i)].name), '_container');
+				addlayer(get(cname));
+				set(layer[get(cname)].type, container);
+				set(layer[get(cname)].parent, gallery_scrollarea);
+				set(layer[get(cname)].width, get(stagewidth));
+				set(layer[get(cname)].height, get(stageheight));
+				set(layer[get(cname)].bgcolor, 0x000000);
+				set(layer[get(cname)].bgalpha, 0.0);
+				set(layer[get(cname)].bgcapture, true);
+				set(layer[get(cname)].align, left);
+				set(layer[get(cname)].edge, center);
+				mul(layer[get(cname)].x, stagewidth, i);
+				div(layer[get(cname)].ox, stagewidth, 2);
+				set(layer[get(cname)].id, get(i));
+				set(layer[get(cname)].ondown, set(gallery_scrollarea_start_pos, get(layer[gallery_scrollarea].x)));
+				set(layer[get(cname)].onup, move_image());
+				
+				addlayer(get(iname));
+				set(layer[get(iname)].url, get(gallery[%1].img[get(i)].url));
+				set(layer[get(iname)].parent, gallery_scrollarea);
+				set(layer[get(iname)].align, left);
+				set(layer[get(iname)].edge, center);
+				mul(layer[get(iname)].x, stagewidth, i);
+				div(layer[get(iname)].ox, stagewidth, 2);
+				set(layer[get(iname)].enabled, false);
+				set(layer[get(iname)].onloaded, if (pixelwidth GT stagewidth OR pixelheight GT stageheight, div(hscale, stagewidth, pixelwidth); div(vscale, stageheight, pixelheight); if (hscale GT vscale, copy(height, stageheight); set(width, PROP); , copy(width, stagewidth); set(height, PROP))));
+			);
+			,
+			trace(%0: missed gallery name);
+		);
+		
+		<!-- showing/hidding arrows -->
+		if(show_arrows == true AND gallery[%1].img.count GT 1,
+			set(layer[arrow_left].visible, false);
+			set(layer[arrow_right].visible, true);
+			,
+			set(layer[arrow_left].visible, false);
+			set(layer[arrow_right].visible, false);
+		);
+	</action>
+	 	
+	<action name="move_image">
+		trace(%0 %1);
+
+		sub(gallery_scrollarea_direction, gallery_scrollarea_start_pos, layer[gallery_scrollarea].x);
+		
+		<!-- 'moving' by arrows clicking (parames left/right) -->
+		if(%1 == left, set(gallery_scrollarea_direction, -500));
+		if(%1 == right, set(gallery_scrollarea_direction, 500));
+		
+		Math.abs(movement, gallery_scrollarea_direction);
+		
+		if (movement GT min_movement,
+			if(gallery_scrollarea_direction LT 0,
+				<!-- move right -->
+				dec(pic_id);
+				if(pic_id LT 0, inc(pic_id));
+				,
+				<!-- move left -->
+				inc(pic_id);
+				if(pic_id GE gallery[get(activeGallery)].img.count, dec(pic_id));
+			);
+			
+			<!-- updating arrows status -->
+			if(show_arrows == true,
+				sub(last_img_id, gallery[get(activeGallery)].img.count, 1);
+				if(pic_id LE 0, set(layer[arrow_left].visible, false), set(layer[arrow_left].visible, true));
+				if(pic_id LT  last_img_id, set(layer[arrow_right].visible, true), set(layer[arrow_right].visible, false));
+			);
+		);
+
+		mul(gallery_scrollarea_new_pos, pic_id, stagewidth);
+		div(stagewidth2, stagewidth, 2);
+		add(gallery_scrollarea_new_pos, stagewidth2);
+		
+		layer[gallery_scrollarea].scrolltocenter(get(gallery_scrollarea_new_pos),0);
+		
+	</action>
+	
+	<action name="hide_gallery">
+		tween(layer[gallery].alpha, 0);
+	</action>
+	
+	<action name="show_gallery">
+		set(foo,%1);
+		if(%1 != activeGallery, 
+			make_gallery(%1);
+		); 
+
+		tween(layer[gallery].alpha, 1);
+	</action>
+	
+</krpano>

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1 - 260
public/static/template/plugins/thumbbar.xml


+ 260 - 0
public/static/template/plugins/thumbbar.xml.backup-2021-02-01-09-39-53

@@ -0,0 +1,260 @@
+<!--
+	krpano - a krpano xml controlled thumbnails image bar
+-->
+
+<krpano>
+	<action name="gjthumbbar">
+	
+
+		create_thumbbar(get(gallery[%1].img.count), bottom, h, 0,10, calc(device.mobile ? 90 : 90), calc(device.mobile ? 120 : 120), calc(device.mobile ? 3 : 6), %1);
+
+		
+			for(set(i,0), i LT gallery[%1].img.count, inc(i), 
+		   thumbbar_addimage('get(gallery[%1].img[get(i)].url)');
+			  
+    	);
+		
+	</action>
+
+	<action name="create_thumbbar">
+	trace( %0 %1);
+	
+		set(thumbbar_images,      %1);
+		set(thumbbar_align,       %2);
+		set(thumbbar_orientation, %3);
+		set(thumbbar_x,           %4);
+		set(thumbbar_y,           %5);
+		set(thumbbar_thumbwidth,  %6);
+		set(thumbbar_thumbheight, %7);
+		set(thumbbar_border,      %8);
+		set(thumbbar_image_index, 0);
+        set(thimage,      %9);
+		set(thumbbar_xoffset, get(thumbbar_border) );
+		set(thumbbar_yoffset, get(thumbbar_border) );
+		set(thumbbar_xborder, 0);
+		set(thumbbar_yborder, 0);
+
+		if(thumbbar_orientation == h,
+			add(thumbbar_yborder, thumbbar_y, thumbbar_thumbheight);
+			add(thumbbar_yborder, thumbbar_yborder, thumbbar_border);
+			add(thumbbar_yborder, thumbbar_yborder, thumbbar_border);
+			add(thumbbar_yborder, thumbbar_yborder, thumbbar_border);
+			mul(thumbbar_yborder, thumbbar_yborder, 2);
+			mul(thumbbar_xborder, thumbbar_border, 2);
+			if(%2 == left,   set(thumbbar_yoffset,0); );
+			if(%2 == right,  set(thumbbar_yoffset,0); );
+			if(%2 == top,    mul(thumbbar_xoffset,thumbbar_border,0.5); );
+			if(%2 == bottom, mul(thumbbar_xoffset,thumbbar_border,0.5); );
+			if(%2 == center, mul(thumbbar_xoffset,thumbbar_border,0.5); set(thumbbar_yoffset,0); mul(thumbbar_yborder,thumbbar_border,2); );
+		  ,
+			add(thumbbar_xborder, thumbbar_x, thumbbar_thumbwidth);
+			add(thumbbar_xborder, thumbbar_xborder, thumbbar_border);
+			add(thumbbar_xborder, thumbbar_xborder, thumbbar_border);
+			add(thumbbar_xborder, thumbbar_xborder, thumbbar_border);
+			mul(thumbbar_xborder, thumbbar_xborder, 2);
+			mul(thumbbar_yborder, thumbbar_border, 2);
+			if(%2 == left,   mul(thumbbar_yoffset,thumbbar_border,0.5); );
+			if(%2 == right,  mul(thumbbar_yoffset,thumbbar_border,0.5); );
+			if(%2 == top,    set(thumbbar_xoffset,0); );
+			if(%2 == bottom, set(thumbbar_xoffset,0); );
+			if(%2 == center, set(thumbbar_xoffset,0); mul(thumbbar_yoffset,thumbbar_border,0.5); mul(thumbbar_xborder,thumbbar_border,2); );
+		  );
+
+		addplugin(thumbbar);
+		set(plugin[thumbbar].align, get(thumbbar_align));
+		set(plugin[thumbbar].x, get(thumbbar_x));
+		set(plugin[thumbbar].y, get(thumbbar_y));
+		set(plugin[thumbbar].type, container);
+		set(plugin[thumbbar].bgcolor, 0xFFFFFF);
+		set(plugin[thumbbar].bgalpha, 0.5);
+		set(plugin[thumbbar].zorder, 1);
+		set(plugin[thumbbar].enabled, false);
+	</action>
+
+
+	<action name="thumbbar_addimage">
+		trace(%0 %1);
+		txtadd(pname, 'thumbbar_image_', get(thumbbar_image_index));
+		addplugin(get(pname));
+		set(plugin[%pname].zorder, 2);
+		set(plugin[%pname].url, %1);
+		set(plugin[%pname].align,  get(thumbbar_align));
+		set(plugin[%pname].width,  get(thumbbar_thumbwidth));
+		set(plugin[%pname].height, get(thumbbar_thumbheight));
+
+		if (thumbbar_orientation == 'v',
+			<!-- vertical thumbs -->
+			add(plugin[%pname].x, thumbbar_x, thumbbar_xoffset);
+
+			add(tmp, thumbbar_border, thumbbar_thumbheight);
+			mul(tmp, tmp, thumbbar_image_index);
+			add(tmp, tmp, thumbbar_yoffset);
+			add(plugin[%pname].y, thumbbar_y, tmp );
+
+			set(thumbbar_vcenter,false);
+			if(thumbbar_align == left,   set(thumbbar_vcenter,true));
+			if(thumbbar_align == center, set(thumbbar_vcenter,true));
+			if(thumbbar_align == right,  set(thumbbar_vcenter,true));
+
+			if(thumbbar_vcenter,
+				add(tmp2, thumbbar_border, thumbbar_thumbheight);
+				mul(tmp2, tmp2, thumbbar_images);
+				mul(tmp2, tmp2, 0.5);
+				sub(plugin[%pname].y, plugin[%pname].y, tmp2 );
+				mul(tmp3, thumbbar_thumbheight, 0.5);
+				add(plugin[%pname].y, plugin[%pname].y, tmp3 );
+			  );
+
+			sub(tmp, tmp, thumbbar_yoffset);
+			add(tmp, tmp, thumbbar_border);
+			add(tmp, tmp, thumbbar_thumbheight);
+			add(tmp, tmp, thumbbar_border);
+			set(plugin[thumbbar].height, get(tmp));
+
+			mul(tmp, thumbbar_border, 2);
+			add(plugin[thumbbar].width, tmp, thumbbar_thumbwidth);
+		   ,
+
+			<!-- horizontal thumbs -->
+			add(plugin[%pname].y, thumbbar_y, thumbbar_yoffset);
+
+			add(tmp, thumbbar_border, thumbbar_thumbwidth);
+			mul(tmp, tmp, thumbbar_image_index);
+			add(tmp, tmp, thumbbar_xoffset);
+			add(plugin[%pname].x, thumbbar_x, tmp );
+
+			set(thumbbar_hcenter,false);
+			if(thumbbar_align == top,    set(thumbbar_hcenter,true));
+			if(thumbbar_align == center, set(thumbbar_hcenter,true));
+			if(thumbbar_align == bottom, set(thumbbar_hcenter,true));
+
+			if(thumbbar_hcenter,
+				add(tmp2, thumbbar_border, thumbbar_thumbwidth);
+				mul(tmp2, tmp2, thumbbar_images);
+				mul(tmp2, tmp2, 0.5);
+				sub(plugin[%pname].x, plugin[%pname].x, tmp2 );
+				mul(tmp3, thumbbar_thumbwidth, 0.5);
+				add(plugin[%pname].x, plugin[%pname].x, tmp3 );
+			  );
+
+			sub(tmp, tmp, thumbbar_xoffset);
+			add(tmp, tmp, thumbbar_border);
+			add(tmp, tmp, thumbbar_thumbwidth);
+			add(tmp, tmp, thumbbar_border);
+			set(plugin[thumbbar].width, get(tmp));
+ 
+			mul(tmp, thumbbar_border, 2);
+			add(plugin[thumbbar].height, tmp, thumbbar_thumbheight);
+		   );
+
+		copy(plugin[%pname].thumbx, plugin[%pname].x);
+		copy(plugin[%pname].thumby, plugin[%pname].y);
+
+		set(plugin[%pname].onclick, thumbbar_showimage(get(name)) );
+
+		inc(thumbbar_image_index);
+		
+		
+	</action>
+	<!-- 关闭 -->
+<action name="hide_thumbbar">
+		tween(layer[gclose].alpha, 0);
+		thumbbar_set_visible(false);
+		thumbbar_hide_allimages();
+		
+	</action>
+	
+<!-- 大图 -->
+	<action name="thumbbar_showimage">
+		thumbbar_hide_allimages();
+ set(pic_id,%1);
+		set(plugin[%1].zorder, 3);
+
+		push(plugin[%1].width);
+		push(plugin[%1].height);
+		plugin[%1].resetsize();
+		copy(plugin[%1].originalwidth, plugin[%1].width);
+		copy(plugin[%1].originalheight, plugin[%1].height);
+		pop(plugin[%1].height);
+		pop(plugin[%1].width);
+
+		set(imgwidth, get(plugin[%1].originalwidth));
+		set(imgheight, get(plugin[%1].originalheight));
+
+		set(maxwidth, get(stagewidth));
+		sub(maxwidth, maxwidth, thumbbar_xborder);
+
+		set(maxheight, get(stageheight));
+		sub(maxheight, maxheight, thumbbar_yborder);
+
+		if(imgwidth GT maxwidth,
+		   mul(imgheight, imgheight, maxwidth);
+		   div(imgheight, imgheight, imgwidth);
+		   copy(imgwidth, maxwidth);
+		  );
+
+		if(imgheight GT maxheight,
+		   mul(imgwidth, imgwidth, maxheight);
+		   div(imgwidth, imgwidth, imgheight);
+		   copy(imgheight, maxheight);
+		  );
+
+		tween(plugin[%1].width, get(imgwidth));
+		tween(plugin[%1].height, get(imgheight));
+
+		mul(tmp, thumbbar_border, 3);
+		add(tmp, tmp, thumbbar_thumbwidth);
+
+		plugin[%1].changeorigin(center,center);
+
+		tween(plugin[%1].x, 0);
+		tween(plugin[%1].y, 0);
+ <!-- js(calc('console.log(" '+%1+' ")'));  -->
+ jscall(calc('console.log("%1")'));
+ 
+  js(calc('thllery("'+thimage+'","'+pic_id+'")')); 		
+ 	trace(%pname %1);
+		set(plugin[%1].onclick, thumbbar_hideimage(%1) );
+	</action>
+<!-- 关闭 -->
+
+	<action name="thumbbar_hideimage">
+		plugin[%1].changeorigin(get(thumbbar_align),get(thumbbar_align));
+
+		set(plugin[%1].zorder, 2);
+
+		tween(plugin[%1].width, get(thumbbar_thumbwidth));
+		tween(plugin[%1].height, get(thumbbar_thumbheight));
+		tween(plugin[%1].x, get(plugin[%1].thumbx));
+		tween(plugin[%1].y, get(plugin[%1].thumby));
+
+		set(plugin[%1].onclick, thumbbar_showimage(%1) );
+	</action>
+
+
+	<action name="thumbbar_hide_allimages">
+		if(%1 != NEXT, set(i,0));
+		txtadd(pname, 'thumbbar_image_', get(i));
+
+		thumbbar_hideimage(get(pname));
+
+		inc(i);
+		if(i LT thumbbar_images, thumbbar_hide_allimages(NEXT));
+	</action>
+	
+	
+	<action name="thumbbar_set_visible">
+		if(%2 != NEXT, set(i,0));
+		txtadd(pname, 'thumbbar_image_', get(i));
+
+		set(plugin[get(pname)].visible,%1);
+<!-- jscall(toggleBtns(true)); -->
+		inc(i);
+		if(i LT thumbbar_images, thumbbar_set_visible(%1,NEXT), set(plugin[thumbbar].visible,%1));
+	</action>
+
+
+</krpano>
+
+
+

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1 - 187
public/static/template/plugins/tooltip.xml


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 187 - 0
public/static/template/plugins/tooltip.xml.backup-2021-02-01-09-39-53


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1 - 904
public/static/template/plugins/webvr.xml


+ 904 - 0
public/static/template/plugins/webvr.xml.backup-2021-02-01-09-39-53

@@ -0,0 +1,904 @@
+<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);    <!-- timertick为系统当前时间,赋值给vr_aclk_waiting -->
+			set(vr_aclk_waiting, true);
+			copy(vr_aclk_hotspot, name);    <!-- name为hotspot的name,赋值给vr_aclk_hotspot -->
+			set(hotspot[vr_cursor].crop,'0|0|80|80');
+
+			asyncloop(vr_aclk_waiting AND vr_aclk_hotspot == name,
+				sub(dt, timertick,vr_aclk_t1);    <!-- 求初始时间vr_aclk_t1与当前时间timertick的差值 -->
+				if(!hovering,
+					set(vr_aclk_waiting, false);
+					set(hotspot[vr_cursor].crop,'0|0|80|80');
+				  ,
+					div(f, dt, vr_aclk_timeout);    <!-- 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);    <!-- 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="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="退出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设置"
+	       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 SET',       center, center, 0, -225, #FFFFFF,     false);
+		-->
+		vr_setup_createtext(vr_setup_title, '手机VR设置',       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_siz1, '画面尺寸:',     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, '保存',          center, center, -200, +225, #FFFFFF,     true, set(background,true), set(background,false), vr_setup_save() );
+		vr_setup_createtext(vr_setup_rst, '重设',         center, center,    0, +225, #FFFFFF,     true, set(background,true), set(background,false), vr_setup_reset() );
+		vr_setup_createtext(vr_setup_cls, '关闭',         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>

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1 - 904
public/static/template/plugins/webvr/webvr.xml


+ 904 - 0
public/static/template/plugins/webvr/webvr.xml.backup-2021-02-01-09-40-07

@@ -0,0 +1,904 @@
+<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);    <!-- timertick为系统当前时间,赋值给vr_aclk_waiting -->
+			set(vr_aclk_waiting, true);
+			copy(vr_aclk_hotspot, name);    <!-- name为hotspot的name,赋值给vr_aclk_hotspot -->
+			set(hotspot[vr_cursor].crop,'0|0|80|80');
+
+			asyncloop(vr_aclk_waiting AND vr_aclk_hotspot == name,
+				sub(dt, timertick,vr_aclk_t1);    <!-- 求初始时间vr_aclk_t1与当前时间timertick的差值 -->
+				if(!hovering,
+					set(vr_aclk_waiting, false);
+					set(hotspot[vr_cursor].crop,'0|0|80|80');
+				  ,
+					div(f, dt, vr_aclk_timeout);    <!-- 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);    <!-- 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="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="退出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设置"
+	       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 SET',       center, center, 0, -225, #FFFFFF,     false);
+		-->
+		vr_setup_createtext(vr_setup_title, '手机VR设置',       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_siz1, '画面尺寸:',     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, '保存',          center, center, -200, +225, #FFFFFF,     true, set(background,true), set(background,false), vr_setup_save() );
+		vr_setup_createtext(vr_setup_rst, '重设',         center, center,    0, +225, #FFFFFF,     true, set(background,true), set(background,false), vr_setup_reset() );
+		vr_setup_createtext(vr_setup_cls, '关闭',         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>

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1 - 762
public/static/template/skin/lensflare/core.xml


+ 762 - 0
public/static/template/skin/lensflare/core.xml.backup-2021-02-01-09-41-18

@@ -0,0 +1,762 @@
+<krpano licznik="0" x_listflar="0" y_listflar="160">
+
+
+
+	<include url="lensflaresettings.xml"/>
+
+	<include url="edit.xml" devices="html5" if="addflaremode == 1"/>
+
+
+
+                                                                                                                                                                                                                                                                    
+
+            
+
+
+
+	<style name="blink_fl_lt" url="dust/d1.png" vr="true" enabled="false" align="center" edge="rightbottom" x="0" y="0" width="prop" height="70%" keep="false" alpha="0" zorder="100"/>
+
+	<style name="blink_fl_rt" url="dust/d2.png" vr="true" enabled="false" align="center" edge="leftbottom" x="0" y="0" width="prop" height="70%" keep="false" alpha="0" zorder="100"/>
+
+	<style name="blink_fl_rb" url="dust/d3.png" vr="true" enabled="false" align="center" edge="lefttop" x="0" y="0" width="prop" height="70%" keep="false" alpha="0" zorder="100"/>
+
+	<style name="blink_fl_lb" url="dust/d4.png" vr="true" enabled="false" align="center" edge="righttop" x="0" y="0" width="prop" height="70%" keep="false" alpha="0" zorder="100"/>
+
+	<style name="blink_fl_ce" url="dast4.png" vr="true" enabled="false" rotate="180" align="center" edge="center" x="0" y="0" width="prop" height="50%" keep="false" alpha="0" zorder="100"/>
+
+
+
+	                                                                                
+
+
+
+	<events name="loasflares" keep="true" onpreviewcomplete="load_flare_content()"/>
+
+
+
+	<style name="flare" enabled="false" depth="1000"  alpha="0" distorted="true" edge="center" ox="0" oy="0" width="440" height="440" keep="false" />
+
+
+
+
+
+
+
+                                                                                                  
+
+	<flare_style  name="blinkstyle1">
+
+		<item name="flare0" url="blinkstyle1/flare7.png" vars="100|0.5|1.0|-1|0|0.05|false|0.0|0.05|true"/>
+
+		<item name="flare1" url="blinkstyle1/flare5.png" vars="100|5.0|0.0|2|0|1|false|0.0|0.05|true"/>
+
+		<item name="flare2" url="blinkstyle1/flare11.png" vars="-0.2|0.1|0.0|-1|0.9|0.017|true|0.4|0.05|false"/>
+
+		<item name="flare3" url="blinkstyle1/flare6.png" vars="-9|0.05|0.2|-1|0.9|0.015|false|0.2|0.015|false"/>
+
+		<item name="flare4" url="blinkstyle1/flare6.png" vars="-1|0.1|0.3|-1|0.9|0.015|false|0.2|0.015|true"/>
+
+		<item name="flare5" url="blinkstyle1/flare6.png" vars="-0.3|0.05|0.4|-1|0.9|0.015|false|0.2|0.015|true"/>
+
+		<item name="flare6" url="blinkstyle1/flare11.png" vars="-0.7|0.2|0.0|-1|0.9|0.017|true|0.4|0.017|false"/>
+
+		<item name="flare7" url="blinkstyle1/flare16.png" vars="-9|1.8|0.0|-1|0.9|0.01|true|0.5|0.02|false"/>
+
+		<item name="flare8" url="blinkstyle1/flare4.png" vars="100|0.8|0.2|-1|0|1|false|0.0|0.015|false"/>
+
+	</flare_style>
+
+
+
+	                                                                                                            
+
+	<flare_style  name="blinkstyle2">
+
+		<item name="flare1" url="blinkstyle2/flare7.png"  vars="100|1.0|1.0|-1|0|0.05|false|0.0|0.05|true"/>
+
+		<item name="flare2" url="blinkstyle2/flare5.png"  vars="100|6.0|0.0|2|0|0.05|false|0.0|0.05|true"/>
+
+		<item name="flare7" url="blinkstyle2/flare13.png"  vars="100|1.05|0.0|-1|0|0.115|true|0.3|0.0|false"/>
+
+		<item name="flare3" url="blinkstyle2/flare3.png"  vars="-6|0.15|0.2|-1|0.9|0.015|false|0.0|0.015|false"/>
+
+		<item name="flare4" url="blinkstyle2/flare5.png"  vars="-1|0.02|0.6|-1|0.9|0.015|false|0.0|0.015|false"/>
+
+		<item name="flare5" url="blinkstyle2/flare3.png"  vars="-0.5|0.11|0.4|-1|0.9|0.015|false|0.0|0.015|true"/>
+
+		<item name="flare6" url="blinkstyle2/flare2.png"  vars="18|0.01|0.0|1|0.9|0.15|true|0.6|0.15|false"/>
+
+	</flare_style>
+
+
+
+
+
+	<flare_style  name="blinkstyle3">
+
+		<item name="flare1" url="blinkstyle3/flare7.png"  vars="100|1.0|1.0|-1|0|0.05|false|0.0|0.05|true"/>
+
+		<item name="flare2" url="blinkstyle3/flare5.png"  vars="100|8.0|0.0|2|0|0.05|false|0.0|0.05|true"/>
+
+		<item name="flare3" url="blinkstyle3/flare6.png"  vars="-8|1.2|0.1|-1|0.9|0.05|false|0.2|0.05|false"/>
+
+		<item name="flare4" url="blinkstyle3/flare6.png"  vars="-5|0.12|0.6|-1|0.9|0.009|true|0.6|0.02|false"/>
+
+		<item name="flare5" url="blinkstyle3/flare6.png"  vars="-2|0.06|0.6|-1|0.9|0.012|true|0.8|0.05|false"/>
+
+		<item name="flare6" url="blinkstyle3/flare6.png"  vars="-1.5|1.6|0.05|-1|0.9|0.07|false|0.0|0.05|true"/>
+
+		<item name="flare7" url="blinkstyle3/flare14.png"  vars="10.5|3.0|0.0|1|0.9|0.07|true|0.7|0.05|false"/>
+
+		<item name="flare8" url="blinkstyle3/flare16.png" vars="-0.1|1.2|0.0|-1|0.9|0.01|true|0.4|0.05|true"/>
+
+	</flare_style>
+
+
+
+
+
+                         
+
+	<flare_style  name="blinkstyle4">
+
+		<item name="flare1" url="blinkstyle4/flare7.png"  vars="100|0.3|0.9|-1|0|0.05|false|0.0|0.0|true"/>
+
+		<item name="flare2" url="blinkstyle4/flare7.png"  vars="100|0.001|0.0|3|0|0.05|false|0.0|0.0|true"/>
+
+		<item name="flare3" url="blinkstyle4/flare5.png"  vars="-6|1.3|0.3|-1|0.9|0.009|false|0.0|0.05|false"/>
+
+		<item name="flare4" url="blinkstyle4/flare5.png"  vars="-1|1.2|0.1|-1|0.9|0.011|false|0.0|0.05|false"/>
+
+		<item name="flare5" url="blinkstyle4/flare4.png"  vars="2|1.3|0.2|-1|0.9|0.014|false|0.0|0.05|false"/>
+
+		<item name="flare6" url="blinkstyle4/flare6.png"  vars="5|0.02|0.2|2|0.9|0.05|true|0.6|0.002|false"/>
+
+		<item name="flare7" url="blinkstyle4/flare11.png" vars="1|0.01|0.0|2|0.9|0.05|true|0.3|0.02|true"/>
+
+		<item name="flare8" url="blinkstyle4/flare17.png" vars="-2|3.22|0.5|1|0.9|0.01|true|0.6|0.02|true"/>
+
+		<item name="flare9" url="blinkstyle4/flare12.png" vars="-6|0.5|0.8|3|0.9|0.01|true|0.2|0.9|false"/>
+
+	</flare_style>
+
+
+
+	                                                                                                            
+
+
+
+	<flare_style  name="blinkstyle5">
+
+		<item name="flare1" url="blinkstyle5/flare1.png"  vars="100|1.0|1.0|-1|0|0.02|false|0.0|0.05|true"/>
+
+		<item name="flare2" url="blinkstyle5/flare5.png"  vars="100|6.0|0.0|2|0|0.01|false|0.0|0.05|true"/>
+
+		<item name="flare3" url="blinkstyle5/flare9.png"  vars="-6|0.8|0.8|1|0.9|0.01|true|0.4|0.8|false"/>
+
+		<item name="flare5" url="blinkstyle5/flare8.png"  vars="-6|4.8|0.8|-1|0.9|0.1|true|0.5|0.8|true"/>
+
+		<item name="flare6" url="blinkstyle5/flare17.png"  vars="6|3.22|0.1|1|0.9|0.01|false|0.3|0.03|false"/>
+
+		<item name="flare7" url="blinkstyle5/flare7.png"  vars="-6|0.12|0.4|-1|0.9|0.005|true|0.2|0.1|true"/>
+
+		<item name="flare8" url="blinkstyle5/flare7.png"  vars="-5|0.08|0.5|-1|0.9|0.009|true|0.6|0.2|false"/>
+
+		<item name="flare9" url="blinkstyle5/flare4.png"  vars="-5|0.12|0.4|-1|0.9|0.006|true|0.2|0.23|false"/>
+
+	</flare_style>
+
+
+
+
+
+	                                                                                                            
+
+
+
+	<flare_style  name="blinkstyle6">
+
+		<item name="flare1" url="blinkstyle6/flare7.png"  vars="100|1.0|1.0|-1|0|0.05|false|0.0|0.05|true"/>
+
+		<item name="flare2" url="blinkstyle6/flare5.png"  vars="100|8.0|0.0|2|0|0.05|false|0.0|0.05|true"/>
+
+		<item name="flare3" url="blinkstyle6/flare6.png"  vars="-8|1.2|0.05|-1|0.9|0.05|false|0.2|0.05|false"/>
+
+		<item name="flare4" url="blinkstyle6/flare6.png"  vars="-5|0.12|0.4|-1|0.9|0.009|true|0.3|0.02|true"/>
+
+		<item name="flare5" url="blinkstyle6/flare6.png"  vars="-2|0.08|0.3|-1|0.9|0.012|true|0.4|0.05|true"/>
+
+		<item name="flare6" url="blinkstyle6/flare6.png"  vars="-1.5|0.5|0.03|-1|0.9|0.07|false|0.0|0.05|false"/>
+
+		<item name="flare7" url="blinkstyle6/flare17.png"  vars="10|4.5|0.2|1|0.9|0.03|true|0.7|0.05|false"/>
+
+		<item name="flare8" url="blinkstyle6/flare8.png"  vars="-6|4.8|0.8|-1|0.9|0.1|true|0.5|0.8|false"/>
+
+		<item name="flare9" url="blinkstyle6/flare16.png" vars="-0.1|1.2|0.0|-1|0.9|0.01|true|0.6|0.05|false"/>
+
+	</flare_style>
+
+
+
+                  
+
+                                                                                                            
+
+
+
+	<flare_style  name="blinkstyle7">
+
+		<item name="flare1" url="blinkstyle7/flare7.png" vars="100|1.0|1.0|2|0|0.05|false|0.0|0.05|true"/>
+
+		<item name="flare2" url="blinkstyle7/flare5.png" vars="100|6.0|0.0|3|0|0.05|false|0.0|0.05|true"/>
+
+		<item name="flare3" url="blinkstyle7/flare1.png" vars="100|5.0|0.0|1|0|0.2|true|0.1|0.0005|false"/>
+
+		<item name="flare4" url="blinkstyle7/flare8.png" vars="-6|0.2|0.2|2|0.9|0.05|false|0.0|0.05|false"/>
+
+		<item name="flare5" url="blinkstyle7/flare6.png" vars="-3|0.2|0.2|2|0.9|0.015|false|0.0|0.05|true"/>
+
+		<item name="flare6" url="blinkstyle7/flare6.png" vars="-0.8|0.12|0.6|2|0.9|0.015|false|0.0|0.05|true"/>
+
+		<item name="flare7" url="blinkstyle7/flare3.png" vars="6|0.3|0.1|1|0.9|0.05|false|0.0|0.05|false"/>
+
+		<item name="flare8" url="blinkstyle7/flare4.png" vars="9|0.4|0.2|1|0.9|0.1|false|0.0|0.1|false"/>
+
+	</flare_style>
+
+
+
+	<flare_style  name="blinkstyle8">
+
+		<item name="flare1" url="blinkstyle8/flare7.png" vars="100|1.0|1.0|2|0|0.05|false|0.0|0.05|true"/>
+
+		<item name="flare2" url="blinkstyle8/flare5.png" vars="100|6.0|0.0|3|0|0.05|false|0.0|0.05|true"/>
+
+		<item name="flare3" url="blinkstyle8/flare2.png" vars="-8|0.06|0.2|-1|0.9|0.005|false|0.1|0.01|false"/>
+
+		<item name="flare4" url="blinkstyle8/flare16.png" vars="-4.5|0.1|0.3|2|0.9|0.005|false|0.0|0.04|false"/>
+
+		<item name="flare5" url="blinkstyle8/flare6.png" vars="-2.8|0.2|0.2|2|0.9|0.005|false|0.0|0.1|true"/>
+
+		<item name="flare6" url="blinkstyle8/flare5.png" vars="-1.5|0.1|0.6|2|0.9|0.005|false|0.0|0.15|true"/>
+
+		<item name="flare7" url="blinkstyle8/flare2.png" vars="-1.2|4.0|0.6|1|0.9|0.2|true|0.5|0.12|false"/>
+
+		<item name="flare8" url="blinkstyle8/flare16.png" vars="-1|1.2|0.8|1|0.9|0.09|true|0.3|0.17|true"/>
+
+	</flare_style>
+
+
+
+
+
+	<flare_style  name="blinkstyle9">
+
+		<item name="flare1" url="blinkstyle9/flare7.png" vars="100|0.1|1.0|2|0|0.05|false|0.0|0.005|true"/>
+
+		<item name="flare2" url="blinkstyle9/flare1.png" vars="100|1.0|0.0|3|0|0.05|false|0.0|0.1|true"/>
+
+		<item name="flare3" url="blinkstyle9/flare5.png" vars="-12|0.1|0.4|-1|0.9|0.005|false|0.0|0.5|false"/>
+
+		<item name="flare4" url="blinkstyle9/flare6.png" vars="-3|0.1|0.2|-1|0.9|0.005|false|0.0|0.02|true"/>
+
+		<item name="flare5" url="blinkstyle9/flare2.png" vars="-1.5|0.1|0.4|-1|0.9|0.005|false|0.0|0.04|true"/>
+
+		<item name="flare6" url="blinkstyle9/flare6.png" vars="-0.5|0.1|0.1|-1|0.9|0.05|false|0.0|0.04|false"/>
+
+	</flare_style>
+
+
+
+
+
+	                                                                                
+	<!-- 这里重写了WebVR,与vtourskin.xml引用本文件前对WebVR的声明造成冲突 -->
+	<!--plugin name="WebVR" keep="true" devices="html5"
+
+	        onentervr="skin_showloading(false); webvr_onentervr(); webvr_setup();roszada_flar_vebvrmode()"
+
+	        onexitvr="webvr_onexitvr(); webvr_setup();roszada_flar_vebvrmode()"
+
+	        /-->
+
+
+
+	<action name="roszada_flar_vebvrmode">
+
+		for(set(i,0),i LT hotspot.count,inc(i),
+
+		  if(hotspot[get(i)].tag == 'lensflare_tag_dynamic',
+
+				vonh(get(i));
+
+			);
+
+		);
+
+		load_flare_content();
+
+	</action>
+
+	                                                                                       
+
+
+
+	<action name="load_flare_content">
+
+		if(!first_flare_settings,
+
+			copy(suma_flar, lensflares[obj].item.count);
+
+			set(first_flare_settings, true);
+
+		);
+
+		if(lensflares[obj].item.count GT 0 OR addflaremode == true,
+
+			flayer(blink_fl_lt,blink_fl_lt);
+
+			flayer(blink_fl_rt,blink_fl_rt);
+
+			flayer(blink_fl_rb,blink_fl_rb);
+
+			flayer(blink_fl_lb,blink_fl_lb);
+
+			                                       
+
+		);
+
+
+
+		set(load_gui_flar, false);
+
+		for(set(i,0), i LT lensflares[obj].item.count, inc(i),
+
+			copy(name_flare, lensflares[obj].item[get(i)].name);
+
+			copy(blink_style, lensflares[obj].item[get(i)].typ);
+
+
+
+			if(lensflares[obj].item[get(i)].scene == scene[get(xml.scene)].name,
+
+				set(load_gui_flar, true);
+
+				for(set(j,0), j LT flare_style[get(blink_style)].item.count, inc(j),
+
+
+
+					txtsplit(flare_style[get(blink_style)].item[get(j)].vars, '|', arrows);
+
+
+
+					txtadd(n, 'f1_',get(lensflares[obj].item[get(i)].name),'_',get(j));
+
+					txtadd(n0, 'f1_',get(lensflares[obj].item[get(i)].name),'_0');
+
+
+
+					copy(move, 			arrows[0].value);
+
+					copy(scale, 		arrows[1].value);
+
+					copy(alpha, 		arrows[2].value);
+
+					copy(zorder, 		arrows[3].value);
+
+					copy(flying, 		arrows[4].value);
+
+					copy(rscale, 		arrows[5].value);
+
+					copy(ralpha, 		arrows[6].value);
+
+					copy(ralphaminus, 	arrows[7].value);
+
+					copy(rmove, 		arrows[8].value);
+
+					copy(invr, 			arrows[9].value);
+
+
+
+	add_single_flare(get(n),get(i),get(j),get(blink_style),get(name_flare),get(move),get(flying),get(rscale),get(ralpha),get(ralphaminus),get(scale),get(alpha),get(zorder),get(rmove),get(invr),get(n0));
+
+				);
+
+			);
+
+		);
+
+		if(addflaremode,
+
+			show_lensfrafe_aktyw_box(get(scene[get(xml.scene)].name),get(load_gui_flar));
+
+		);
+
+	</action>
+
+
+
+
+
+	                                
+
+	<action name="add_single_flare">
+
+		                                                                           
+
+
+
+		fhotspot(%1,flare);
+
+		copy(h.url, flare_style[%4].item[%3].url);
+
+		copy(h.ath, lensflares[obj].item[%5].ath);
+
+		copy(h.atv, lensflares[obj].item[%5].atv);
+
+		if(lensflares[obj].item[%5].dust_effect === null, set(lensflares[obj].item[%5].dust_effect, true));
+
+		copy(h.dust_effect, lensflares[obj].item[%5].dust_effect);
+
+		set(h.tagmini, %5);
+
+		set(h.move, %6);
+
+		set(h.rmove, %14);
+
+		copy(h.athbazowy, hotspot[%16].ath);
+
+		copy(h.atvbazowy, hotspot[%16].atv);
+
+		set(h.flying, %7);
+
+		set(h.scale, %11);
+
+		set(h.alpha, %12);
+
+		set(scaleTemp_%1, %11);
+
+		set(h._alpha, %12);
+
+		set(h.rscale, %8);
+
+		set(h.ralpha, %9);
+
+		set(h.ralphaminus, %10);
+
+		set(h.zorder, %13);
+
+		set(h.invr, %15);
+
+		set(h.tag, lensflare_tag_dynamic);
+
+		set(h.onloaded,
+
+			if(webvr.isenabled, if(!invr, vonh(get(name))));
+
+			asyncloop(loaded,
+
+				spheretoscreen(ath, atv, xposh_%1, yposh_%1);
+
+				div(xpos_%1, stagewidth, 2);
+
+				div(ypos_%1, stageheight, 2);
+
+				sub(xposg_%1, xposh_%1, xpos_%1);
+
+				sub(yposg_%1, yposh_%1, ypos_%1);
+
+				div(ox, xposg_%1, calc(move*1.4/(rmove*12)));
+
+				div(oy, yposg_%1, calc(move*1.4/(rmove*12)));
+
+
+
+				getlooktodistance(scal_%1, view.hlookat, view.vlookat, ath, atv);
+
+
+
+				spheretoscreen(athbazowy, atvbazowy, px_%1, py_%1);
+
+				sub(a_%1, px_%1, xpos_%1);
+
+				sub(b_%1, ypos_%1, py_%1);
+
+				Math.atan2(angle_%1, a_%1, b_%1);
+
+				mul(angle_%1, 180);
+
+				div(angle_%1, Math.PI);
+
+				add(angle_%1, 270);
+
+				mod(angle_%1, 360);
+
+				roundval(angle_%1);
+
+				copy(rz, angle_%1);
+
+
+
+				if(ralpha,
+
+					set(alpha_%1, calc((scal_%1/70)-ralphaminus));
+
+					if(alpha_%1 LE 0, set(alpha_%1, 0));
+
+					if(webVr.isenabled,
+
+						set(hotspot[%1].alpha, calc(alpha_%1/3));
+
+					,
+
+						set(hotspot[%1].alpha, calc(alpha_%1));
+
+						if(hotspot[%1].alpha GT 1, set(hotspot[%1].alpha, 1));
+
+					);
+
+				);
+
+				if(rscale != 1,
+
+					set(valsc_%1, calc((rscale*scal_%1)/10+scaleTemp_%1));
+
+					if(webVr.isenabled,
+
+						set(scale, calc(valsc_%1/2));
+
+					,
+
+						copy(scale, valsc_%1);
+
+					);
+
+				);
+
+
+
+				if(%3 == '1',
+
+					getlooktodistance(result_%1, view.hlookat, view.vlookat, ath, atv);
+
+					div(result1_%1, result_%1, 10);
+
+					clamp(result1_%1, 0.0, 1.0);
+
+					mod(result2_%1, result1_%1, 100);
+
+					sub(result2_%1,1);
+
+					mul(result2_%1,-1);
+
+
+
+					copy(alpha, result2_%1);
+
+					sub(alpha, 0.3);
+
+					if(result_%1 LT 7,
+
+						migaj_kurzem(get(result2_%1),get(dust_effect));
+
+					);
+
+					if(result_%1 GT 7 AND result_%1 LT 20,
+
+						migaj_kurzem(0,true);
+
+					);
+
+				);
+
+				testme(%1,get(xposh_%1),get(yposh_%1));
+
+			);
+
+
+
+		);
+
+		                                                                                                                                            
+
+	</action>
+
+
+
+	<action name="migaj_kurzem">
+
+		                        
+
+		                                                                                                                    
+
+		if(%2,
+
+			set(layer[blink_fl_lt].alpha, %1);
+
+			set(layer[blink_fl_rt].alpha, %1);
+
+			set(layer[blink_fl_rb].alpha, %1);
+
+			set(layer[blink_fl_lb].alpha, %1);
+
+			set(layer[blink_fl_ce].alpha, %1);
+
+		);
+
+	</action>
+
+
+
+	<action name="testme">
+
+		if(%3 LT 0 OR !%3,
+
+			set(ukryj_gora_%1, true);
+
+		,
+
+			set(ukryj_gora_%1, false);
+
+		);
+
+
+
+		if(%3 GT stageheight OR !%3,
+
+			set(ukryj_dol_%1, true);
+
+		,
+
+			set(ukryj_dol_%1, false);
+
+		);
+
+
+
+		if(%2 LT 0 OR !%2,
+
+			set(ukryj_lewo_%1, true);
+
+		,
+
+			set(ukryj_lewo_%1, false);
+
+		);
+
+
+
+		if(%2 GT stagewidth OR !%2,
+
+			set(ukryj_prawo_%1, true);
+
+		,
+
+			set(ukryj_prawo_%1, false);
+
+		);
+
+		                                                                                         
+
+
+
+		if(!ukryj_gora_%1 AND !ukryj_dol_%1 AND !ukryj_lewo_%1 AND !ukryj_prawo_%1,
+
+			set(visible, true);
+
+		,
+
+			set(visible, false);
+
+		);
+
+	</action>
+
+
+
+	<action name="reset_pano_lensflare"/>
+
+
+
+
+
+
+
+                        
+
+	<action name="flayer">
+
+		addlayer(%1);
+
+		layer[%1].loadstyle(%2);
+
+		copy(p, layer[%1]);
+
+	</action>
+
+
+
+	<action name="fhotspot">
+
+		addhotspot(%1);
+
+		hotspot[%1].loadstyle(%2);
+
+		copy(h, hotspot[%1]);
+
+	</action>
+
+
+
+	<action name="vonp">
+
+		if(layer[%1].loaded, removelayer(%1));
+
+	</action>
+
+	<action name="vonh">
+
+		if(hotspot[%1].loaded, removehotspot(%1));
+
+	</action>
+
+
+
+	<action name="vonh_all">
+
+	  sub(i,hotspot.count,1);
+
+	  if(i GE 0,loop_vonh_all(get(i),%1,%2));
+
+   </action>
+
+
+
+	<action name="loop_vonh_all">
+
+		if(%2 == null,
+
+			vonh(%1);
+
+		,
+
+			if(hotspot[%1].%2 == %3,
+
+				vonh(%1);
+
+			);
+
+		);
+
+		dec(i);
+
+		if(i GE 0, loop_vonh_all(get(i),%2,%3));
+
+   </action>
+
+
+
+
+
+</krpano>
+

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1 - 22
public/static/template/skin/lensflare/lensflaresettings.xml


+ 22 - 0
public/static/template/skin/lensflare/lensflaresettings.xml.backup-2021-02-01-09-41-18

@@ -0,0 +1,22 @@
+<krpano>
+	<lensflares name="obj">
+		<item name="flarka7151" ath="91" atv="-3" scene="scene_sunset" typ="blinkstyle4" dust_effect="false"/>
+		<item name="flarka6512" ath="88.54" atv="-20.51" scene="scene_001a" typ="blinkstyle1" dust_effect="false"/>
+		<item name="flarka14591" ath="-100.16" atv="-50.96" scene="scene_002a" typ="blinkstyle2" dust_effect="false"/>
+		<item name="flarka26735" ath="148.18" atv="-41.67" scene="scene_006a" typ="blinkstyle3" dust_effect="true"/>
+		<item name="flarka35462" ath="21.76" atv="-25.95" scene="scene_003a" typ="blinkstyle6" dust_effect="false"/>
+		<item name="flarka47239" ath="77.35" atv="-27.32" scene="scene_004a" typ="blinkstyle5" dust_effect="false"/>
+		<item name="flarka92223" ath="177.31" atv="-41.99" scene="scene_007a" typ="blinkstyle7" dust_effect="true"/>
+		<item name="flarka106717" ath="196.99" atv="-15.51" scene="scene_008a" typ="blinkstyle8" dust_effect="false"/>
+		<item name="flarka117558" ath="-172.26" atv="-15.57" scene="scene_009a" typ="blinkstyle9" dust_effect="false"/>
+		<item name="flarka11897" ath="103.14" atv="-4.86" scene="scene_1" typ="blinkstyle1" dust_effect="false"/>
+		<item name="flarka50737" ath="-98.69" atv="-51.89" scene="scene_2" typ="blinkstyle2" dust_effect="false"/>
+		<item name="flarka63633" ath="22.74" atv="-22.84" scene="scene_3" typ="blinkstyle4" dust_effect="false"/>
+		<item name="flarka72547" ath="66.46" atv="-9.92" scene="scene_4" typ="blinkstyle6" dust_effect="false"/>
+		<item name="flarka101904" ath="247.22" atv="-51.37" scene="scene_5" typ="blinkstyle3" dust_effect="false"/>
+		<item name="flarka163600" ath="176.60" atv="-30.49" scene="scene_6" typ="blinkstyle9" dust_effect="false"/>
+		<item name="flarka176490" ath="194.29" atv="-16.02" scene="scene_7" typ="blinkstyle8" dust_effect="false"/>
+		<item name="flarka200121" ath="562.21" atv="-16.13" scene="scene_8" typ="blinkstyle8" dust_effect="false"/>
+		<item name="flarka223321" ath="86.20" atv="-3.41" scene="scene_9" typ="blinkstyle4" dust_effect="false"/>
+	</lensflares>
+</krpano>

La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1 - 1995
public/static/template/skin/vtourskin.xml


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1995 - 0
public/static/template/skin/vtourskin.xml.backup-2021-02-01-09-38-41


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1995 - 0
public/static/template/skin/vtourskin_backup


La diferencia del archivo ha sido suprimido porque es demasiado grande
+ 1 - 104
public/static/template/tour.xml


+ 100 - 0
public/static/template/tour.xml.backup-2021-02-01-09-36-26

@@ -0,0 +1,100 @@
+<krpano version="1.19" title="Virtual Tour" debugmode="true" logkey="true">
+ <!-- debugmode="true" logkey="true" -->
+	<include url="%SWFPATH%/skin/vtourskin.xml" />
+	<!-- <include url="../../pano_pos.xml" /> -->
+
+	<!-- customize skin settings: maps, gyro, webvr, thumbnails, tooltips, layout, design, ... -->
+	<skin_settings maps="false"
+	               maps_type="google"
+	               maps_bing_api_key=""
+	               maps_google_api_key=""
+	               maps_zoombuttons="false"
+	               gyro="true"
+	               webvr="true"
+	               webvr_gyro_keeplookingdirection="false"
+	               webvr_prev_next_hotspots="true"
+	               littleplanetintro="false"
+	               title="true"
+	               thumbs="true"
+	               thumbs_width="120" thumbs_height="80" thumbs_padding="10" thumbs_crop="0|40|240|160"
+	               thumbs_opened="false"
+	               thumbs_text="false"
+	               thumbs_dragging="true"
+	               thumbs_onhoverscrolling="false"
+	               thumbs_scrollbuttons="false"
+	               thumbs_scrollindicator="false"
+	               thumbs_loop="false"
+	               tooltips_buttons="false"
+	               tooltips_thumbs="false"
+	               tooltips_hotspots="false"
+	               tooltips_mapspots="false"
+	               deeplinking="false"
+	               loadscene_flags="MERGE"
+	               loadscene_blend="OPENBLEND(0.5, 0.0, 0.75, 0.05, linear)"
+	               loadscene_blend_prev="SLIDEBLEND(0.5, 180, 0.75, linear)"
+	               loadscene_blend_next="SLIDEBLEND(0.5,   0, 0.75, linear)"
+	               loadingtext="loading..."
+	               layout_width="100%"
+	               layout_maxwidth="814"
+	               controlbar_width="-24"
+	               controlbar_height="40"
+	               controlbar_offset="20"
+	               controlbar_offset_closed="-40"
+	               controlbar_overlap.no-fractionalscaling="10"
+	               controlbar_overlap.fractionalscaling="0"
+	               design_skin_images="vtourskin.png"
+	               design_bgcolor="0x2D3E50"
+	               design_bgalpha="0.8"
+	               design_bgborder="0"
+	               design_bgroundedge="1"
+	               design_bgshadow="0 4 10 0x000000 0.3"
+	               design_thumbborder_bgborder="3 0xFFFFFF 1.0"
+	               design_thumbborder_padding="2"
+	               design_thumbborder_bgroundedge="0"
+	               design_text_css="color:#FFFFFF; font-family:Arial;"
+	               design_text_shadow="1"
+	               />
+
+	<!--
+	    For an alternative skin design either change the <skin_settings> values 
+	    from above or optionally include one of the predefined designs from below.
+	-->
+	<!-- <include url="skin/vtourskin_design_flat_light.xml"  /> -->
+	<!-- <include url="skin/vtourskin_design_glass.xml"       /> -->
+	<!-- <include url="skin/vtourskin_design_ultra_light.xml" /> -->
+	<!-- <include url="skin/vtourskin_design_117.xml"         /> -->
+	<!-- <include url="skin/vtourskin_design_117round.xml"    /> -->
+	<!-- <include url="skin/vtourskin_design_black.xml"       /> -->
+
+
+	<!-- startup action - load the first scene -->
+	<action name="startup" autorun="onstart">
+		if(startscene === null OR !scene[get(startscene)], copy(startscene,scene[0].name); );
+		loadscene(get(startscene), null, MERGE);
+		if(startactions !== null, startactions() );
+	</action>
+
+
+	
+	<scene name="scene_0199" title="0199" onstart="" thumburl="panos/0199.tiles/thumb.jpg" lat="" lng="" heading="">
+
+		<view hlookat="115.87" vlookat="15.88" fovtype="MFOV" fov.mobile="80" fov="85" maxpixelzoom="2.0" fovmin="70" fovmax="140" limitview="auto" />
+
+		<preview url="panos/0199.tiles/preview.jpg" />
+
+		<image type="CUBE" multires="true" tilesize="512">
+			<level tiledimagewidth="4352" tiledimageheight="4352">
+				<cube url="panos/0199.tiles/%s/l3/%0v/l3_%s_%0v_%0h.jpg" />
+			</level>
+			<level tiledimagewidth="2176" tiledimageheight="2176">
+				<cube url="panos/0199.tiles/%s/l2/%0v/l2_%s_%0v_%0h.jpg" />
+			</level>
+			<level tiledimagewidth="1152" tiledimageheight="1152">
+				<cube url="panos/0199.tiles/%s/l1/%0v/l1_%s_%0v_%0h.jpg" />
+			</level>
+		</image>
+		
+	</scene>
+
+
+</krpano>

+ 6 - 1
src/Store/index.js

@@ -9,19 +9,24 @@ const store = new Vuex.Store({
     initScene:'',
     vrlist:[],
     allVrlist:[],
-    activeItem:''
+    activeItem:'',
+    isShow: false
   },
   getters: {
     info:state=>state.info,
     initScene:state=>state.initScene,
     activeItem:state=>state.activeItem,
     vrlist:state=>state.vrlist,
+    isShow:state=>state.isShow,
     allVrlist:state=>state.allVrlist
   },
   mutations: {
     SetVrList(state, list) {
       state.vrlist = list
     },
+    UpdateIsShowState(state, isShow) {
+      state.isShow = isShow
+    },
     SetAllVrlist(state, list) {
       state.allVrlist = list
     },

+ 1 - 1
src/api/index.js

@@ -75,7 +75,7 @@ export function getSceneInfo(data, ok, no) {
  * @param {*} no 
  */
 export function getIndex(data, ok, no) {
-    return http.get(`/fcb/pano/scene/getIndex/${number()}`, {}, ok, no)
+    return http.get(`/fcb/pano/scene/getIndex/${number()}`, data, ok, no)
 }
 
 

+ 1 - 1
src/assets/style/component.less

@@ -112,6 +112,7 @@ textarea:-ms-input-placeholder {
             position: absolute;
             width: 32px;
             height: 32px;
+            z-index: 11;
             top: 10px;
             left: 10px;
             background: rgba(0, 0, 0, 0.5);
@@ -130,7 +131,6 @@ textarea:-ms-input-placeholder {
             right: 10px;
             width: 62px;
             height: 32px;
-            z-index: 11;
             cursor: pointer;
             background: none;
           >ul{

+ 23 - 17
src/framework/Head.vue

@@ -1,11 +1,11 @@
 <template>
   <header class="app-head" app-border dir-bottom>
     <span class="app-head-title">{{info.houseTitle}}</span>
-    <div class="app-head-save app-head-view" @click="onSave" :class="{disable:allVrlist?allVrlist.length<=0:true}">
+    <div class="app-head-save app-head-view" @click="onSave" :class="{disable:!canLoad}">
       <i class="iconfont icon_save"></i>
       保存
     </div>
-    <div class="app-head-save" @click="onView" :class="{disable:allVrlist?allVrlist.length<=0:true}">
+    <div class="app-head-save" @click="onView" :class="{disable:!canLoad}">
       <i class="iconfont icon_eye"></i>
       预览
     </div>
@@ -21,12 +21,14 @@ export default {
   name: "app-head",
   data(){
     return {
-      firstScene:''
+      firstScene:'',
+      canLoad:false
     }
   },
 
   mounted(){
     this.$bus.on('canLoad',(data)=>{
+      this.canLoad = true
       if (data) {
         this.getInfo()
         this.getIndex()
@@ -35,12 +37,12 @@ export default {
     }) 
 
 
-    this.$bus.on('undateAllVrList',()=>{
-      this.getPanoList()
+    this.$bus.on('undateAllVrList',islongpolling=>{
+      this.getPanoList(islongpolling)
     })
     
-    this.$bus.on('setInitScene',()=>{
-      this.getIndex()
+    this.$bus.on('setInitScene',islongpolling=>{
+      this.getIndex(islongpolling)
     })
 
     this.$bus.on('initScene',(data)=>{
@@ -50,15 +52,17 @@ export default {
   computed: {
     ...mapGetters({
       allVrlist:'allVrlist',
-      info:'info'
+      info:'info',
+      isShow:'isShow'
     })
   },
   methods: {
-    getPanoList(){
+    getPanoList(islongpolling=null){
        getPanoList({
         pageNum: 1,
         pageSize: 1000,
-        status:3
+        status:3,
+        islongpolling
       },async data=>{
         this.list = data.data.list
         this.$store.commit("SetAllVrlist", data.data.list);
@@ -73,9 +77,9 @@ export default {
             }})
           return false
         }
-       if (this.allVrlist.length<=0) {
+       if (this.allVrlist.length<=0&&this.isShow) {
           this.$alert({
-            content:'请先在场景导航添加素材',
+            content:'请至少添加一个全景图或VR模型(场景导航)',
             forceOK:true,
             ok:()=>{
               this.$router.push({path:'/information'})
@@ -94,10 +98,11 @@ export default {
         houseTitle: this.info.houseTitle
       },()=>{
         this.$tips({content:'保存成功',icon:'ok'})
+        this.$store.commit('UpdateIsShowState', true)
         setTimeout(() => {
-          if (!this.firstScene.webSite) {
-            this.$alert({
-              content: "生成预览链接失败",
+          if (!this.firstScene.webSite&&this.isShow) {
+            return this.$alert({
+              content: "请至少添加一个全景图或VR模型(场景导航)",
             })
           }
           let link = this.$intranet+this.firstScene.webSite
@@ -116,6 +121,7 @@ export default {
           houseTitle: this.info.houseTitle
         },()=>{
           this.$tips({content:'保存成功',icon:'ok'})
+          this.$store.commit('UpdateIsShowState', true)
         },()=>{
 
         })
@@ -128,8 +134,8 @@ export default {
         }
       );
     },
-    getIndex(){
-      getIndex('',data=>{
+    getIndex(islongpolling=null){
+      getIndex({islongpolling},data=>{
         // this.img =data.data&& data.data.icon
         this.$bus.emit('initScene',data.data)
         this.$store.commit("SetInitScene", data.data);

+ 19 - 3
src/framework/MenuPC.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="pc-menu" app-border dir-right>
     <ul class="pc-menu-container">
-      <li v-for="(item, key) in menu" v-show="!item.hidden" :key="key">
+      <li v-for="(item, key) in menu" v-show="!item.hidden" :class="{disable:key!=0&&!isShow}" :key="key">
         <router-link :to="item.link" :exact="false">
           <i class="iconfont" :class="item.icon"></i>
           <span>{{ item.text }}</span>
@@ -12,6 +12,8 @@
 </template>
 <script>
 import { PCMenu } from "../config/menu";
+import { mapGetters } from "vuex";
+
 export default {
   name: "pc-menu",
   data() {
@@ -19,13 +21,27 @@ export default {
       menu: []
     };
   },
+  computed: {
+    ...mapGetters({
+      isShow:'isShow'
+    })
+  },
+  watch:{
+    '$route.name':{
+      immediate:true,
+      handler:function (newVal) {
+        if (newVal!='base'&&!this.isShow) {
+          this.$router.push({path:'/base',redirect:true})
+        }
+      }
+    }
+  },
   mounted() {
     // 添加滚动条
   },
   created() {
     this.menu = PCMenu;
-  },
-  computed: {}
+  }
 };
 </script>
 <style lang="less">

+ 2 - 1
src/framework/Toolbar.vue

@@ -158,7 +158,8 @@ export default {
       this.getPanoList()
     })
     this.$bus.on('setListThumb',(data)=>{
-      this.activeItem.icon = data
+      this.activeItem.icon = data.icon
+      this.activeItem.initVisual = JSON.stringify(data.initVisual)
     })
     
     this.$bus.on('canEdit',data=>{

+ 17 - 8
src/framework/core/index.vue

@@ -44,7 +44,7 @@ export default {
       let data = __krfn.utils.setInitView(krpano, canvas);
 
       uploadCover(
-        { file: data.url, filename: "initCover.png" },
+        { file: data.url, filename: "initCover.jpg" },
         res => {
           if (res.code==0) {
             saveInitScreen({
@@ -52,15 +52,22 @@ export default {
               sceneId: this.activeItem.id
             },()=>{
               this.$bus.emit("initView", res.data);
-              this.$bus.emit("setListThumb",res.data);
+              this.$bus.emit("setListThumb",{
+                icon:res.data,
+                initVisual: {
+                  hlookat: data.hlookat,
+                  vlookat: data.vlookat
+                }
+              });
               this.$bus.emit('toggleFlash',false)
               this.$tips({ content: "设置成功",icon:'ok' });
+              savePosition({
+                  id:this.activeItem.id,
+                  hlookat: data.hlookat,
+                  vlookat: data.vlookat
+              })
             })
-            savePosition({
-                id:this.activeItem.id,
-                hlookat: data.hlookat,
-                vlookat: data.vlookat
-            })
+            
           }
         });
     },
@@ -89,11 +96,13 @@ export default {
             __krfn.utils.toggleHotspot(krpano,this.$route.name!='screen');
         }
         window.vrViewFn = ()=>{
-          if (newVal.initVisual) {
+          try {
             let tmp = JSON.parse(newVal.initVisual)
             var krpano = document.getElementById('krpanoSWFObject');
             krpano.set('view.vlookat',tmp.vlookat);
             krpano.set('view.hlookat',tmp.hlookat);
+          } catch (error) {
+            error
           }
         }
                

+ 0 - 1
src/framework/show/index.vue

@@ -57,7 +57,6 @@ export default {
               html5: "auto",
               mobilescale: 0.7,
               vars:settings,
-              webglsettings: { preserveDrawingBuffer: true },
               passQueryParameters: true,
             });
 

+ 11 - 2
src/router/index.js

@@ -3,6 +3,7 @@ import Router from 'vue-router'
 import { PCMenu } from "../config/menu";
 import { checkLogin,getPanoInfo } from '@/api'
 import { $alert } from '@/components/shared/message'
+import store from '../Store'
 
 let vue = new Vue()
 
@@ -43,6 +44,10 @@ checkLogin().then(response => {
 });
 
 getPanoInfo().then(response => {
+  if(response.data&&response.data.isShow == 1){
+    store.commit('UpdateIsShowState', true)
+  }
+  
   if(response.data&&response.data.status == 1){
     return $alert({
         content:'该VR项目待审核,不可编辑。'
@@ -57,6 +62,7 @@ getPanoInfo().then(response => {
     vue.$bus.emit('canLoad',true) 
     OnlineDetector.valid();
   }
+  
 });
 
 const router = new Router({
@@ -65,11 +71,14 @@ const router = new Router({
 
 
 router.beforeEach(async (to, from, next) => {
+  
     await LoginDetector.listener();
     await OnlineDetector.listener();
+
     if (to.path == '/') {
-      return next({path: "/base" })
-  }
+        return next({path: "/base" })
+    }
+    
     next()
 })
 

+ 12 - 12
src/utils/request.js

@@ -23,7 +23,7 @@ let postQueue = []
 export const statusCode = {
     NEXT: -999, //继续执行 
     SUCCESS: 0, //成功
-    EXCEPTION: -1, //异常错误
+    EXCEPTION: 1, //异常错误
     FAILURE_CODE_7005: 7005, //审核中不能编辑
     FAILURE_CODE_7006: 7006, //已审核不能编辑
     FAILURE_CODE_5001: 5001 //token失效
@@ -92,9 +92,7 @@ export function statusCodesHandler(result, callback) {
     }
 
     if (result.code == statusCode.EXCEPTION) {
-        return $alert({ content: result.msg,ok:()=>{
-            window.location.reload()
-        } })
+        return !http.__loading && $alert({ content: `${result.message},请稍后再试`})
     }
 
     
@@ -115,12 +113,8 @@ $.ajaxSetup({
             xhr.setRequestHeader("token", token)
         }
     },
-    error: function(xhr) { // 出错时默认的处理函数
-        if (this.url.indexOf('scene.json') != -1 && xhr.status == 404) {
-            return 
-        } else if (this.type === 'POST') {
-            return 
-        }
+    error: function() { // 出错时默认的处理函数
+        return $alert({content: '网络异常,请稍后再试'})
     },
     success: function() {
 
@@ -128,7 +122,13 @@ $.ajaxSetup({
     complete: function(data) {
         // Post类型请求无论成功或失败都关闭等待提示
         if (this.type === 'POST'&& this.url.indexOf('pano/scene/uploadPano') == -1) {
-            http.__loading && $waiting.hide()
+            let isLongpolling = ''
+            try {
+                 isLongpolling = JSON.parse(this.data).islongpolling
+            } catch (error) {
+                error
+            }
+            (http.__loading && !isLongpolling) && $waiting.hide()
         }
 
         http.__loading = true
@@ -262,7 +262,7 @@ export const http = {
      * @param {Function?} fail 失败回调
      */
     postJson(url, data = {}, done, fail) {
-        http.__loading && $waiting.show()
+        (http.__loading && !data.islongpolling) && $waiting.show()
         return this.__request($.ajax({
             type: "POST",
             url: url,

+ 31 - 9
src/views/information/Toolbar.vue

@@ -1,7 +1,7 @@
 <template>
   <div class="app-view-toolbar app-view-full-toolbar">
     <div class="tips">
-      <div class="ui-remark">1、全景图:请上传比例为2:1的全景图片,jpg格式,大小不超过120MB;</div>
+      <div class="ui-remark">1、全景图:请上传比例为2:1的全景图片,jpg、jpeg格式,大小不超过120MB。</div>
       <div class="ui-remark">2、户型:请先制作户型,然后选择添加。</div>
     </div>
     <div class="pano-label">
@@ -59,26 +59,48 @@ import { getImgWH } from '@/utils/file'
 import { $waiting } from '@/components/shared/loading'
 import draggable from 'vuedraggable'
 
+const LONGPOLLINGTIME = 10
+
 export default {
   data(){
     return {
       type:'building',
+      interval:null,
       list:[]
     }
   },
   watch:{
     type(){
       this.getPanoList()
+    },
+    '$route.name':{
+      immediate:true,
+      handler:function (newVal) {
+        if (newVal!='information') {
+          this.clearinter()
+        }else{
+          this.Longpolling()
+        }
+      }
     }
   },
   mounted(){
     this.$bus.on('refresh',()=>{
       this.getPanoList()
     })
-
     this.getPanoList()
   },
   methods:{
+    clearinter(){
+      this.interval && clearInterval(this.interval)
+      this.interval = null
+    },
+    Longpolling(){
+      this.clearinter()
+      this.interval = setInterval(() => {
+        this.getPanoList(true)
+      }, LONGPOLLINGTIME*1000);
+    },
     uploadListSort(){
       let tmp = {}
       this.list.forEach((item,i)=>{
@@ -99,17 +121,18 @@ export default {
           }
       });
     },
-    getPanoList(){
+    getPanoList(islongpolling=null){
       getPanoList({
         pageNum: 1,
         pageSize: 1000,
         searchKey: "",
-        type: this.type
+        type: this.type,
+        islongpolling
       },data=>{
         this.list = data.data.list
         this.$store.commit("SetVrList", data.data.list);
-        this.$bus.emit('undateAllVrList')
-        this.$bus.emit('setInitScene')
+        this.$bus.emit('undateAllVrList',islongpolling)
+        this.$bus.emit('setInitScene',islongpolling)
       })
     },
     onFileChange(file) {
@@ -119,7 +142,6 @@ export default {
         if (item.type.indexOf("jpeg")<=-1) {
           return this.$tips({content:'请上传jpg格式的全景图'})
         }
-        $waiting.show()
         canUploadList.push(item)
       }
 
@@ -134,7 +156,7 @@ export default {
 
     Promise.all(p).then(result=>{
         let pp = []
-        result.forEach(data => {
+        p.length>0&&result.forEach(data => {
               let {width,height}=data.WH
               if(width != 2*height){
                 return this.$tips({content:'全景图片必须为2:1比例'})
@@ -150,7 +172,7 @@ export default {
               }) 
               pp.push(promise)
         });
-        Promise.all(pp).then(response=>{
+        pp.length>0&& Promise.all(pp).then(response=>{
           if (response.length>0) {
             $waiting.hide()
             this.$alert({content:'上传成功',icon:'ok'})

+ 6 - 6
src/views/information/index.vue

@@ -46,7 +46,7 @@
         :houseList="houseList"
         @updateList="updateHX"
         @cancle="huxingshow = false"
-        :title="'选择型'"
+        :title="'选择VR模型'"
         :name="'table'"
         @changeCurrent="changeCurrent"
         :paging="paging"
@@ -104,12 +104,12 @@
             ></combox>
           </div>
           <div>
-            <p class="ui-remark">型</p>
+            <p class="ui-remark">VR模型</p>
             <div @click="huxingshow = true">
               <input
                 class="ui-input"
                 type="text"
-                placeholder="请选择型"
+                placeholder="请选择VR模型"
                 v-model="huxing.sceneName"
                 disabled
               />
@@ -180,10 +180,10 @@ export default {
       currentId: "",
       list: [],
       paging: {
-        pageSize: 10,
+        pageSize: 8,
         pageNum: 1,
         total: 0,
-        showSize: 10,
+        showSize: 8,
         current: 1,
       },
     };
@@ -323,7 +323,7 @@ export default {
     handleHouse() {
         
         if (!this.huxing.id||!(this.houseDataActive&&this.houseDataActive.id)) {
-          return this.$alert({ content: "请选择样板间名称和型" });
+          return this.$alert({ content: "请选择样板间名称和VR模型" });
         }
 
         if (!this.hasChange) {

+ 1 - 1
vue.config.js

@@ -1,6 +1,6 @@
 // const proxy_url = process.env.VUE_APP_PROXY_URL || 'http://8.135.98.231:8084'
 const proxy_url = process.env.VUE_APP_PROXY_URL || 'https://fcb.test.4dkankan.com'
-
+// https://vr-web01-uat.fcb.com.cn/
 let pages = {
   edit: 'src/pages/edit.js',
   show: 'src/pages/show.js',