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.
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 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.
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.
The Multiresolution loading is significantly faster, especially on fast network connections by better utilizing parallel loading and parallel processing.
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.
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).
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: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.
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.
New:sourcewidth / sourceheight - these contains the original source/base size of an element.
This can be the size of a container, but also the cropped size of an image.
Change: The default value for align has been changed from null to
"lefttop" for layers and to "center" for hotspots.
Change: The default value for the x, y and ox, oy variables
has been changed from null to "0".
This prevents unintentional variable-type changes and enables the direct use for dynamic changes (e.g. for tween calls).
Change: The new gridfit setting replaces the old accuracy setting
(accuracy=0 ⇒ gridfit=true, accuracy=1 ⇒ gridfit=false) and offers an additionally "auto" mode.
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:
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.
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.
Change: The old depthmap.center 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 depthmap.center is still supported for backward compatibility and will be automatically mapped to the new setting (and inverse):
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.
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.
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.
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: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.
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:
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: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:<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 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: 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.
When there was a related browser-event, the original Javascript Event
object will be available as callback parameter, and for layer/hotspots also as rawEvent variable.
New: Use Javascript code in xml-attributes by prefixing the code with
js:.
Example:
onclick="js:console.log(caller.name);"
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: 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 'krpano.call(actionname)' 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: 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: 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: 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.
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: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.
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.
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 layer scalechildren setting is trueby 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.
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.
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".
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.
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 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.