News Examples Documentation Download Buy Forum Contact



XML Extensions


Third Party Software
for krpano

Release Notes Version 1.21

krpano 1.21.2 (2023-12-11)

  • Fix: The tour_testingserver_macosx file had an invalid code-signature, which caused problems when sharing the file. The tour_testingserver_macosx is now just a 64bit-only file, building a Universal Binary with 32- and 64bit support is no longer possible.

krpano 1.21.1 (2023-11-23)

  • Fix: There could be a short flickering/empty-frame when using loadpanoscene() to load a <scene> that has an <include> defined inside it (report).
  • Fix: loadjs() action - loading encrypted files wasn't working.
  • Fix: Encrypt Tool - Allow encrypting any .js files, not just krpano plugins.
  • Fix: Scrollarea layers - the mwheel setting wasn't working.
  • Fix: The contextmenu could be opened on Android devices even when the contextmenu.touch setting was disabled.
  • Fix: When using the security.cors="use-credentials" setting, send the CORS credentials also for text files (xml, js, ...) and not just for images. (report).
  • Fix: The demo logo was wrongly shown on registered viewers when WebGL was not available.
  • Fix: Support Class-B local networks for local-only restrictions.
  • Fix: krpano Testing Server - Fixed crash when using Minimize to Tray (Windows only).
  • Fix: The Update Tool was wrongly removing the information about having an upgraded license when updating Panotour Pro files, that were already using a newer krpano version.

krpano 1.21 (2023-04-30)

  • krpano 1.21 is a major update with improvements in all areas of krpano.
  • In this release, the internals of the layer/hotspot/textfield system are completely new. The system has been redesigned and reworked for better performance and to provide additional possibilities and features.
  • The new system provides Automatic Layouts, Editable Textfields, Scaleable Layers, Containers and Textfields, a now built-in Scrollarea, the usage of CSS classes for styling and CSS styles directly defined inside the xml.
  • For scene-to-scene navigation there are now nice 3D Transitions with a Motion-Blur effect. They mimic a 3D movement even on normal 2D panos (but can be used on 3D panos too).
    A small tool in the VTour Editor for easily creating such 3D Transitions is also included.
  • The support for 3D-Models and Depthmaps has also been improved. The loading is faster, it is possible to make 3D-Measurements and to use Collision-Detection when moving around in the 3D-Model or the Depthmapped-image.
  • Polygonal Hotpots can now be placed also in 3D-Space.
  • The Multiresolution loading is significantly faster, especially on fast network connections by better utilizing parallel loading and parallel processing.
  • The Actions System has been improved and provides an extended Javascript Support.
  • And there are many many detail improvements.
  • When updating older projects, please have a look at the Compatibility Notes!

Automatic Layouts

  • It's now possible to build 'automatic layouts', that means layouts where the layer elements (e.g. buttons) will arrange and resize their-self automatically and dynamically.
  • Container layers can automatically resize their-self based on their children elements.
  • Textfields and HTML-layers can also automatically resize their-self - and that fully dynamic, even when the content changes by its own or from external.
  • New: layer[].flowchildren - enable the automatic arrangment / flowing / ordering of children layers. When enabled and width or height are not set, then their size will be determined automatically by the flowing children elements.
  • New: layer[].flow - enable/disable the automatic flowing within the parent element.
  • New: layer[].childmargin - add a margin around the children layers.
  • New: layer[].flowoverflow - control the children layers overflow to a new row or column when reaching the width or height of the parent layer.
  • New: layer[].childflowspacing and layer[].flowspacing - adjust the spacing between the children layers, either for all layers or individually.
  • New: layer[].flowexpand - automatically adjust the layer size to fit in the remaining space within the parent layer.
  • New: layer[].onresize event - will be called when the size has changed (replaces also the textfield onautosized event).
  • New: layer[].onlayout event - will be called when the size, position or scale has changed.

Textfields - layer.type="text"

  • Textfield content changes are now processed instantly within the same frame. That means the layout will get updated instantly (and not delayed like in previous verisons).
  • Textfields can now be editable.
  • Scaling textfields is supported now - the whole textfield (content, borders, shadows) gets scaled now. Previously only the size (width,height) of the textfield had changed.
  • New: cssclass - assign CSS classes to the textfield.
  • New: rawhtml - use the given text content directly as it is without any parsing.
  • New: textalign - define the aligment of the content inside the textfield (replaces the old 'vcenter' setting, which is still supported and get mapped to textalign='left').
  • New: txtshadow - multiple shadows are supported now.
  • New: ellipsis - when the text/content is larger than the given textfield width and line-breaking is not allowed or possible, then the text will end with three dots '...' instead of a hard-cut.
  • New: editable - make the textfield editable.
  • New: editenterkey - define how to handle the ENTER-key during editing.
  • New: oneditstart, oneditchange, oneditstop - editing events.
  • New: startediting(select) - start the editing by code.
  • New: stopediting() - stop the editing by code.
  • New: istextfield - a variable for checking if the element is a textfield.
  • New: textlayer - the inner HTML element that contains the text/content.
  • New: textwidth / textheight - the size of the inner text/content.
  • New: ontextchanged - an event that get called when the text has been changed and new inner HTML/DOM element is ready for usage.
  • Change: The html setting has been renamed to text (the old name is still supported).
  • Change: The interactivecontent setting has been renamed to interactive (the old name is still supported).

Scrollarea - layer.type="scrollarea"

  • The scrollarea plugin is now a built-in layer type.
  • That means faster loading and better integrations.
  • The scrolling behavior/animation can be customized.
  • The scrolling-speed will automatically compensate different framerates.
  • New: scrolltype - set different scrolling types.
  • New: stepsize - set the scrolling step-size for scrolltype=step.
  • New: autoscrollbars - use other layer elements automatically as scrollbars. The design can be freely customized, but the functionality and behavior will be automatically controlled.
  • New: isscrollarea - a variable for checking if the layer is a scrollarea.

krpano Layers - layer.type="krpano"

  • The krpano layers are now better integrated - the internal frame loop, the layout processing and the rendering are synchronized.
  • New: krpanobgcolor - set a custom background color. A non-transparent background allows faster rendering and the usage of all pano-blending-modes.
  • New: krpanoembedsettings - set additional embedding settings.

HTML Layers - layer.type="html"

  • HTML layers can now also resize their-self and detect dynamic content changes.
  • New: htmlautosize - enable automatic sizing based on the html content.
  • New: htmloverflow - the old 'htmlscrollbars' setting has been replaced by the new 'htmloverflow' setting. The new setting allows more customizing. The old setting is still supported and gets mapped to the new one.

Layers, Containers


  • 2D (non-distorted) WebGL-hotspots now have their own dedicated renderer. Instead of being a 3D-plane orientated to the screen, they will be actually rendered as 2D-element. This allows more control about the actual pixel-presentation, e.g. that the position and size are exactly on the pixel-grid to get a sharp display with clear lines and clear texts. Additionally this also avoids problems when using viewing distortions like the fisheye/litteplanet views.
  • The hotspots can now anytime switch between WebGL- and CSS3D-rendering.
  • Therefore textfield hotspots are rendered using CSS3D by default. This is faster on startup, needs less GPU memory and provides better HTML/CSS support. When WebGL-rendering is required (e.g. for VR), then the hotspot will switch its rendering automatically.
  • The hotspots are using now their 3D-depth / 3D-position when hit-testing to ensure the correct hit-order of overlapping hotspots. Additionally - when the depthbuffer and depthmap.hittest setting are enabled, then hotspots that are 'behind' elements from the 3D-model or the depthmapped-pano, are blocked from hit-testing.
  • The hotspots are now kept during the pano/scene blending/transition.
  • Polygonal hotspots can now also be defined in 3D space using XYZ coordinates:
    <points x="..." y="..." z="..." />
    <points x="..." y="..." z="..." />
    <points x="..." y="..." z="..." />
    All points together need to (roughly) form a flat-plane, otherwise the hotspot can't be created.
  • Polygonal hotspots can use now also a shorter syntax for defining the points:
    points="h,v, h,v, h,v, ..."
    points3d="x,y,z, x,y,z, x,y,z, ..."
  • New: blending -set if the hotspot should be rendered during pano/scene blending.
  • New: twosided -set if the hotspot should be visible from both sides.
  • New: depthwrite - should the hotspot get written to the depthbuffer.
  • New: depthoffset - add an 'offset' to the rendering-depth.
  • New: premultiplyalpha - multiply the alpha channel into the color channels.
  • New: Support the hitd hit-distance also for polygonal hotspots.
  • New: ishotspot - a variable for checking if the element is a hotspot.
  • New: ispoly and is3dpoly - a variable for checking if the hotspot is a polygonal hotspot.
  • New: hotspot.borderwidth3d - change the borderwidth depending on the 3D-position.
  • New: hotspot.bordergradient - colorize the border with a gradient.
  • New: hotspot.getnormalvec() - function for getting the normal vector.
  • Change: The default value of renderer setting is the new "auto" setting now (see also the compatibility notes).
  • Change: The flying setting interpolates now between '3d-space' and 'screen-space'. A hotspot with flying=1.0 will have the same size as a layer element. Additionally the align setting will be supported for aligning the hotspot to a certain screen-edge when flying out (except for VR, in VR the hotspot will always aligned in the screen-center).
  • Change: subdiv is false by default now, the sub-division will be done automatically when needed (for distorted projections).
  • Fix: The hitx / hity values were wrongly also including the space of the borders and shadows from textfields.

Depthmaps / 3D-Models

  • Collision-Detection / Hit-Testing / Raycasting is possible now.
  • Textured 3D-Models are directly supported now.
  • The 3D-Model Wavefront OBJ (.obj) support was extended for .mtl Material library support. That also allows using multiple textures/images per 3D-Model.
  • The 3D-Models are cached now when using them in multiple panos/scenes. That means when reusing a 3D-Model in an other scene, even with other position settings or other images, no additional time or memory is required.
  • Using normal pano-images as texture on a 3D-Model is easier now (e.g. for using one large 3D-Model and multiple high-resolutions panos at certain locations).
  • New: raycastdepth() - raycast / hit-test from any point in 3D-space into any direction. Can be used for 3D-measurements, collision-detection, hit-testing, drawing or placing hotspots in 3D-space. The result will contain the distance, the 3D-hit-point, the normal of the hit-surface.
  • New: screentodepth() - same as raycastdepth(), but with screen-coordinates from the current view as request.
  • New: depthmap.texurl - set a texture image for the textured 3D-Model.
  • New: depthmap.backgroundurl - use a background pano for the 3D-Model.
  • New: depthmap.hittest and depthmap.hittestmode - enable the hit-testing.
  • New: depthmap.origin - set the origin-point of the 3D-Model (supports dynamic changes).
  • New: depthmap.align - rotate the pano image mapping (supports dynamic changes).
  • New: depthmap.mapmode and depthmap.curve settings for supporting depthmap images that use a different depth-mapping/encoding.
  • New: depthmap.farscale - define how far the 'background' should be away from the object foreground (only for 3D-Models with rendermode="depthmap").
  • New: Support using <preview> images for textured 3d-models.
  • New: depthmap.bytesize and depthmap.buildtime information for the 3D-Model loading.
  • New: display.depthmapcachesize - size of the internal 3D-Model cache.
  • Change: The old setting has been replaced with the new depthmap.origin setting. The center setting was using a different xyz axis/order then the one that is used in krpano. So to make the coordinates more consistent, the new origin setting was introduced. The origin setting uses the same axes as all other xyz coordinates in krpano.
    The is still supported for backward compatibility and will be automatically mapped to the new setting (and inverse):
    depthmap.origin="x|y|z" ⇒"-z|y|x""x|y|z" ⇒ depthmap.origin="z|y|-x"
  • Change: The default value for the depthmap.rendermode setting has been changed to "auto". To use 3D-Model rendering for textured 3D-Models by default.
  • Change: The default value for the depthmap.textured setting has been changed to "auto". To use the texture-mapping automatically when available.
  • Change: The default of the depthmap.subdiv setting was changed to 14.25 (before it was 17.0). The internal sub-division algorithm has been changed and the new value results in roughly the same result as the old default.
  • Fix: .obj files with lines that have trailing whitespaces could lead to parsing problems and rendering errors on some systems.
  • Fix: Support .obj files with negative texture coordinates.
  • depthmap_navigation.xml
    • New: Support for Depthmap/3D-Model Collision-Detection (no walking through walls).
    • New: Support for optional Collision-Detection with the floor/ground. That allows walking up/down stairs, elevations, jumping and falling down. This also supports matching-up the VR floor level and the real floor level.
    • New: Support for Middle/Right-Mousebutton controls.
    • New: Optional Touchpad control-mode for continuous moving.
  • depthmap_measure3d.xml
    • New: A little helper tool for doing measurements in Depthmap-Panos / 3D-Models.

3D Transitions

  • There are now nice built-in 3D Transitions with a Motion-Blur effect available. They mimic a 3D movement even on normal 2D panos.
  • A small tool in the VTour Editor for easily creating such 3D Transitions is also included.
  • New: set3dtransition() - enable a 3D-transition between panos/scenes. It makes a 3D-movement with motion-blurring during the pano-blending (automatically timed with the loading and blending).
  • New: view.longexposure - a setting for simulating a long-exposure/slow-shutter/motion-blur effect. Will be automatically used when using the set3dtransition() action.
  • Examples:

Mouse / Gesture Controls

  • It is now possible to use optionally all mouse buttons (fully customizable).
  • Multi-touch gestures (scaling, rotation, ...) are supported for custom usage now.
  • New: mouse.button - check which mouse button was pressed or released.
  • New: mouse.leftbutton, mouse.middlebutton and mouse.rightbutton - check which mouse button is currently pressed.
  • New: mouse.altkey, mouse.ctrlkey and mouse.shiftkey - check which special keys were pressed on the current mouse event.
  • New: control.panomousebuttons, control.layermousebuttons and control.eventmousebuttons - define the mouse button usage.
  • New: mouse.dx / dy - the 'delta'-movement distance between the previous and the current frame. Ideal for asyncloop/renderloop usage, e.g. when dragging elements.
  • New: mouse.screenx / screeny - the screen x/y mouse position ignoring the safearea.
  • New: ongesture event and gesture object - for using multi-touch gestures.
  • Change: Open the contextmenu now only when there was no movement between the mouse-button down and mouse-button-up (to allow using the right-mouse-button and the contextmenu the same time).
  • Change: Due recent browser updates, it is no longer possible to detect if a desktop- or laptop-system has a touchscreen and touchsupport. In such case the device.touch variable will be false now. But krpano still automatically supports touches and gestures. The detect if the browser is even able for touch-support there is the new touchsupport variable.
  • Fix: The mouse.downx / downy variables weren't updated when touching on layers.

Actions / XML / API

  • New: An assignment operator can be used in action code now:
    This is the same as:
    calc(variable, expression);
  • New: Additionally also +=, -=, *=, /= operators are supported.
  • New: Instead of get(var) it is now also possible to use just *var to resolve a variable to its value. Can be used when passing a variable to an action or as an array index.
  • New: Instead of calc(expression) it is now also possible to use just (expression) to resolve an expressions. Can be used when passing the result of an expression to to an action or as an array index. Examples:
    tween(view.hlookat, (view.hlookat + 90));
    delta_h = hs.point[(i+1)].ath - hs.point[(i)].ath;
  • New: In expressions it is now possible to call JS-functions and use their return value.
  • New: The <preview> xml can be optionally also be defined inside the <image> xml element.
  • New: There is a new <cssstyles> xml element that can be used to define CSS-styles and CSS-classes directly inside the xml file. Works the same as a <style> element in HTML.
  • New: addcssstyles() - an action for dynamically adding CSS-styles / CSS-classes.
  • New: forall() - loops through all elements of a krpano Array.
  • New: The addhotspot() action has an new optional renderer parameter. This can be used as optimization to avoid the creation of a HTML element (for CSS3D-hotspots) when actually a WebGL-hotspot is desired.
  • New: focus() - give the input focus to the current krpano viewer.
  • New: releasefocus() - remove the input focus and stop all frictions.
  • New: capitalize() - expression function.
  • New: Support preload=true also for hotspots.
  • New: RESET load flag - restore the viewer back to default when loading a new pano.
  • New: IMAGEANDVIEW load flag - load only the <image> and the <view>.
  • New: ZOOMBLEND blend flag - support setting a custom zoom center.
  • New: The layer and hotspot onhover events are now more efficient and are therefore now processed every frame (previously they were only processed at the half framerate).
  • New: hoveringelement - the top-most element (layer or hotspot) where the mouse cursor is currently over.
  • New: Using name="auto" in the xml generates automatically an unique name.
  • New: lastuserinteraction - the timertick of the last user interaction.
  • New: blendtime - the time that was set in the BLEND(blendtime) parameter of the preceding loadpano/loadscene/load... call.
  • New: display.requestresize() - request a resize calculation and an onresize event.
  • New: display.layout.update() - process a whole layout update.
  • New: lookat() - automatically call the gyro resetsensor() function to change the view also when the gyroscope is activated.
  • New: display.layout.root / stage / bglayer / overlay / hotspots - Arrays of all krpano 'root-level' elements. Can be used to browse hierarchically through all elements.
  • New: display.viewerwidth / viewerheight, display.windowwidth / windowheight and display.screenwidth / screenheight variables.
  • New: display.stereoseparation - for setting a custom stereo-separation / eye-distance for non-VR stereo usage (e.g. 3D-TV or anaglyph rendering).
  • New: Support also <action> autorun="true" (same as autorun="onstart").
  • New: deprecatedwarnings - show a warning when using old deprecated actions.
  • New: The %VIEWER% path (to the krpano script file) will be determined automatically now.
  • New: xml.fileurl - path/url of the currently loaded xml file.
  • New: device.webgl2 - for detecting if the WebGL2 API is enabled.
  • New: contextmenu.customstyle - optional backdrop-blur and outline support.
  • New: control.trackpadzoom - for optionally disabling the ctrl+wheel behavior.
  • New: image.reset("copy") - copy the current image settings when creating a new one.
  • New: onparentchange event - when the parent of a layer gets changed.
  • New: onlayoutgraphchanged event - when adding or removing layers/hotspots or when changing the parent or the childorder settings.
  • New: oncreateelement and ondestroyelement events - when adding or removing layer or hotspot elements.
  • New: onframe event - will be called once every frame.
  • New: onviewloaded event - when all that is required to fill the view is loaded.
  • New: onviewreloading event - when the view has changed and new files need to be loaded.
  • New: ondisplaystereochange - when changing between mono and stereo rendering.
  • New: krpano.webGL.depthbufferbits variable for checking the accuracy of the WebGL rendering depthbuffer.
  • New: <if> element for conditionally parsing xml contents.
  • New: When dynamically changing the device object, this has instant effects on the devices="..." xml-parsing filter.
  • Change: Previously the string-quotes of action parameters were resolved as the first parsing step, the resolving of get(var), *var, calc(expression) , (expression) was only performed afterwards. This has now been changed. Now the get/calc resolving is done 'before' the string-quotes resolving. That means when there is now a get/calc inside string-quotes, then there will be no resolving anymore and the result will be an unparsed String. This should be the better and more expected behavior, but might be incompatible with older code in some cases.
  • Change: The loadpanoimage() action needs a image.reset() call before.
  • Change: The onmousedown, onmouseup and onmousewheel events were named to ondown, onup and onwheel - to unify them with the layer/hotspot event-names.
  • Change: The roundval() negative decimal places behavoir is different now - now the given negative amount is used as maximum and addtionally the trailing zero removing is done
  • Fix: Send the onnewpano event only when the image and the depthmap are ready.
  • Fix: The onloadcomplete and onnewpano events didn't work on cubestrip panos.
  • Fix: loadxml() or includexml() calls inside preload=true plugins could cause multiple problems.
  • Fix: When a loadpano/scene/xml action was called from a localscope action, the xml parsing could wrongly write some parsing results into the localscope.
  • Fix: The loadstyle() and assignstyle() actions haven't converted the variable type (e.g. String to Number) in some cases and that could have lead to further wrong processing.
  • Fix: loadpano/scene/xml calls inside a scope="localonly" action failed when the <image> was using <level> elements.
  • Fix: Avoid triggering the oniphonefullscreen event in portrait mode and during editing a text.


  • New: Javascript Events:
  • New: Use Javascript code in xml-attributes by prefixing the code with js:. Example:
  • New: loadjs() action to dynamically load (multiple) Javascript files and execute them. The loaded Javascript code runs within the krpano context and has direct access to the krpano APIs (similar to Javascript krpano actions).
  • New: object.setvars({...}) Javascript function to copy all attributes from the given object to the krpano object. Can be used as short syntax to set several settings of an element at once. Here an usage example:
    hotspot.setvars({ath:30, atv:10, scale:0.5});
  • New: The renderloop() functions supports calling Javascript functions now. The renderloop will stop either when the Javascript function return false, or when calling stoprenderloop() with the id that the renderloop() call provided.
  • New: callwhen() supports Javascript functions as callback.
  • New: The screentosphere(), spheretoscreen(), spheretospace() and spacetosphere() actions are directly callable from Javascript.
  • New: Support also type="js" additionally to type="Javascript" for <action> elements.
  • New: Javascript code from <action> elements, from jscall()/jsget() calls will be executed in a separate context/scope now. This avoids unintended variable-scope problems.
  • New: the krpano viewer automatically installs Polyfills for these Javascript functions: __defineGetter__(), __defineSetter__(), Object.assign(), String.trim(), Array.forEach().
  • Change: krpano uses the Javascript Strict Mode by default now for all Javascript code it calls. This can help finding coding errors, but therefore works slightly different in some cases.
    If necessary the Javascript Strict Mode can be disabled either globally using the usestrictjs setting or individually per <action> using action[].usestrictjs setting.
  • Change: Now without Flash-support, the onready callback of the embedpano() function can return a krpano Interface Object instead of a limited Javascript Interface Object. The new interface object is compatible to the old one, but additionally provides direct Javascript access to the whole krpano structure and direct callable krpano actions. One Exception: when the JS-API is disabled (using the protect tool), then only the limited old Javascript interface object is provided. In this case only '' to actions with secure=true is allowed.


  • New: When the debugmode is enabled, the krpano log offers new buttons for entering commands, clearing the log, enabling/disabling the debugkeys and visualizating layer, hotspots and pano-outlines.
  • New: The debugmode input-field can now also automatically resolve expressions and print variable or object details.
  • New: display.wirecolor - customize the wireframe/outline color.
  • Change: Rename the display.showpolys setting to display.wireframe.
  • Change: The hotspot debug outlines will be now also shown for hotspots with alpha=0.
  • Change: The debugkeys setting is false by default now (but it can be enabled anytime using the new button in the log).
  • Fix: Ignore the tilde-key during typing in the log input-field.
  • Fix: The tilde-key for opening the log wasn't working on some systems (depending on the keyboard layout).


  • New: The functionality of the krpano embedding script is now directly integrated into the krpano HTML5 viewer. The usage- and the API itself are unchanged.
  • New: webgl selecting the WebGL/CSS3D usage.
  • New: Optionally enable the WebGL2 API using the webglsettings.
  • New: Due the integration of the embedding script into the HTML5 viewer, there is now no need for an extra WebGL detection step. Without that one more WebGL context can be used.
  • Change: No html5/flash embedding settings anymore.
  • Change: WebGL is now required by default, using CSS3D is optionally.
  • Change: The removepano() function can now be called also with the id of the html target element. Alternatively also krpano.unload() can be used to remove/unload the viewer.


  • New: maxopenheight setting for limiting the height of the opened combobox.
  • Change: open the combobox according to the align/edge setting (e.g. top ⇒ opens to down).

Soundinterface Plugin

  • Fix: Non-used or destroyed sounds were not released/unloaded correctly in some cases.


  • New: The gyro plugin is automatically available also as global gyro variable.
  • New: When the gyro is enabled from startup, automatically wait and use the first user-touch to activate the gyro (when necessary by the browser).
  • New: absolute and north settings for using an absolute / real-world-oriented gyroscope tracking.
  • New: isenabled variable for checking if the gyroscope is currently actually enabled.
  • Fix: When dragging the pano vertically during the gyroscope control (when using touch_mode="full), there could be sometimes an unintended jump back to the normal position.


  • New: floorlevel variable for using the real physical floor height (when available).
  • New: Use the Browser Screen Wake Lock API when available (new in iOS since 16.4 and Android Chrome) to avoid that the screen could get dimmed or turned off during VR-viewing.
  • New: absolute and north settings for using an absolute / real-world-oriented direction tracking (MobileVR only).
  • New: aimingangle variable for the VR controllers to optionally change the aiming-angle.
  • New: The laser VR-controllers will adjust their length automatically to the hit-point when using 3D-Models or a Depthmap-pano.
  • Fix: Store the hit-distance of the laser VR-controllers separately for each controller.
  • Fix: The orientation was inverted in Firefox (and in Firefox-based browsers like Wolvic) when using the WebXR API.
  • Fix: The hotspots adjusted by flatpanohfov had wrong positions in the upscaled view.
  • Fix: The display.depthrange setting was not used in all cases..


  • New: skin_hotspotstyle 'linkedscene_hoffset' setting.
  • New: skin_hotspotstyle 'use3dtransition' setting.
  • New: skin_scene3dtransition action.
  • Change: Replace the design_text_shadow settinb by design_text_txtshadow.
  • Change: Update the design xml files for using the updated textfield settings.
  • Change: Show the EnterVR button instantly on VR devices, add additionally show also a button for skipping it and continue on the normal skin.
  • Fix: Don't show the rotate-to-landscape info in portrait-mode again when loading a new pano.

Renderer Improvements

  • The Multiresolution loading is significantly faster now, especially on fast network connections. There is now a better parallel loading of files and a dynamic parallel decoding of the images.
  • The time for decoding and GPU-uploading the images is constantly measured, and depending on the required and available-frame time, a certain number of the image-tiles are decoded per frame. This utilizes better the available power of a system.
  • Support alternative framerates - e.g. devices with 120hz or mobile devices in engerie-safe-mode with 30hz or desktop systems with e.g. 75hz, 100hz, 144hz screens. Even with different framerates, the movements/frictions/autorotate-speeds will be the same. (animations/tweens were before already time-based and so frame-rate independed).
  • New: network.maxdownloads / maxrequests / maxdecodes - settings for the fine-tuning / optimizing the loading / image-decoding performance.
  • New: network.maxdecodetime_moving / maxdecodetime_still - settings for the fine-tuning / optimizing the balance between faster image-decoding and more stable framerates.
  • New: network.cachesize - size of the cache for textual files.
  • New: display.refreshrate - the actual display refreshrate.
  • New: display.rframe - the number of rendered/drawn frames.
  • New: display.chromesubpixelantialiasing - optionally enable LCD subpixel antialising in the Chrome browser. Works only when using opaque textfield backgrounds (bgcolor=1.0).
  • New: Improved iPhone fullscreen mode with instant url-bar hiding when turning to landscape-orientation.
  • Change: Automatic retry the file-loading on errors now also for layer and hotspot images (controlled by the network.retrycount setting).
  • Change: Don't apply crossOrigin="" when loading images from the same origin, this should avoid browser caching problems and avoid the double-loading of files in some browsers.
  • Fix: The near setting of the display.depthrange setting was wrongly ignored.
  • Fix: Improved video rendering performance in Firefox.
  • Fix: Rendering performance improvements for Mac Safari on Hi-DPI/Retina screens.
  • Fix: Flat panos with a hfov > 1.0 were vertically slightly wrong scaled.
  • Fix: Avoid flickering sometimes when very quickly switching betweens panos.
  • Fix: iPhone fullscreen mode - support also using externally-set sizes.
  • Fix: Support hierarchical- and multiple-stacked fullscreen elements.
  • Fix: Some events were not removed when unloading the viewer.

krpano Tools (GUI)

  • New: Create hotspots with a 3D-transition.
  • New: Set the startup view for hotspots.
  • New: Ask when there are unsaved modifications before closing or loading a new xml.
  • Change: On Linux the NWJS runtime was updated. This solves the file-drag-and-drop problem on newer Linux systems, but therefore doesn't run on very old Linux systems anymore. Additionally the Desktop icons will get installed into the user-local Desktop Applications folder.

krpano Tools (Command-Line)

  • New: makepano - support the EXIF GPS Altitude. Available as [ALT] placeholder.
  • New: makepano - new csvrayhmirror setting for optionally disabling the horizontal mirroring of cubestrip input images that use the 'VRAY' cube-face aligment/order.
  • New: encrypt - support .obj and .mtl files encryption.
  • New: encrypt - increase the maximum filesize of input files from 10MB to 256MB.
  • New: maketiles - new '-scale=#' option for scaling the image by a factor.
  • Fix: spheretocube - black-line at the 360 edge when converting partial 360x* panos.
  • Fix: makepano - crash when there is a loading-error on tiled-inputimages, now log an error and continue processing using black-color for the tiles that can't be loaded.


  • The XML documentation has been simplified, no hidden parts behind collapsible elements anymore, everything is directly there.
  • The layer and hotspots documentation has been merged together as they are sharing many setting, events and actions.
  • The Actions syntax documentation has been improved and made more detailed.
  • There is now a new extra documentation for all the xml-based extensions or helper-scripts that come with krpano.

Examples / Helper-Scripts

Compatibility Notes / Important Changes

Changes where manual adjustments might be required:

  • scalechildren=true
    • The layer scalechildren setting is true by default now! (previously it was false).
    • To provide backward-compatibility, the default value of scalechildren depends on the version setting in the xml! When the version is set to values below 1.21, then the default is false as it was in the older versions.
    • That means for updating old projects, either make sure the version setting in the xml is set to 1.20 (or lower), or set scalechildren to false where required.
  • scalemode="scale"
    • In previous versions, layers only resized themselves when their scale value was changed. In the case of textfields, this meant that the text-area became larger, but the text itself remained at the same size.
    • Now with version 1.21 real scaling using scale / scalex / scaley is supported (for normal resizing the width / height values can be changed).
    • For backward-compatibility and more flexibility, there is the new scalemode setting. It can be set to scale or resize to control the behavior when changing the scale.
    • Same as with the scalechildren setting, the default value of scalemode depends on the version setting in the xml. When set to 1.21 or higher, the default is "scale", and otherwise "resize".
  • renderer="auto"
    • The hotspot renderer setting has a new auto default-value now.
    • With that new auto setting, krpano will automatically choose between WebGL and HTML/CSS3D rendering.
    • Images, videos and polygons will typically get rendered with WebGL by default and textfields with HTML and CSS-3D-transforms.
    • Rendering textfield hotspots by HTML/CSS3D allows faster startups and fewer memory needs. Because when rendering using WebGL, the text needs to be manually drawn to an image and that image be uploaded as texture to the GPU. And this whole process is complex and needs time and memory.
    • To be able to still support VR/stereo rendering with HTML/CSS3D textfield hotspots, the rendering will automatically switch to WebGL and generate the image/texture dynamically when required, e.g. when entering the VR mode.
    • Notes for updating - in some cases/examples a hotspot was expected to get rendered with WebGL and now gets rendered with HTML/CSS3D. In these cases the setting renderer="webgl" would need to be added to the related <hotspot> element.
  • hotspot[...].pixelwidth / pixelheight
    • The pixelwidth and pixelheight values of hotspots don't include the scale anymore.
    • As the scaling doesn't resize the element, it only scales the results.
    • For getting the actual resulting size pixelwidth*scalex and pixelheight*scaley would need to be used.
  • hotspot[...].flying
    • The flying setting now fully interpolates into 'screen-space'.
    • That means a hotspot with flying=1.0 will now have the same size as a layer.
  • Javascript Strict Mode
    • krpano uses the Javascript Strict Mode by default now for all Javascript code it calls.
    • This can help finding coding errors, but therefore works slightly different in some cases.
    • So if necessary the Javascript Strict Mode can be disabled either globally using the usestrictjs setting or individually per <action> using action[].usestrictjs setting.

Removed Features

  • Removed Flash support.
  • Removed IE10 support (IE11 is still supported).
  • Removed 32bit versions.
  • Removed support for the very old 'alturl', 'altscale' and 'altonloaded' layer/hotspot settings. These were very old 'alternative' settings used only by the HTML5-viewer to set different values than for Flash.

Previous Version: