Welcome to the ChangeLog and porting notes for OGRE 1.6.0 "Shoggoth"

H.P. Lovecraft wrote:
"It was a terrible, indescribable thing vaster than any subway train – a shapeless congerie of protoplasmic bubbles, faintly self-luminous, and with myriads of temporary eyes forming and un-forming as pustules of greenish light all over the tunnel-filling front that bore down upon us, crushing the frantic penguins and slithering over the glistening floor that it and its kind had swept so evilly free of all litter." - H. P. Lovecraft, At The Mountains of Madness


What's New

  • Script Changes
    • NewScriptFeatures are enabled by default, see OGRE_USE_NEW_COMPILERS in OgreConfig.h
    • Unified script syntax (.os), can contain anything that would have been in type-specific scripts (.material, .particle etc)
    • Import other scripts via the 'import' directive
    • More flexible syntax, quoted identifiers supported
    • Substitutable variables are supported
    • Interception of script parsing events now possible for custom behaviour
  • Material Changes
    • 'manual_named_constants' directive added for assembler shaders to allow you to associate named parameters stored in a file with assembler. The file can be created from the GpuNamedParameters from high-level source if you want to precompile them.
    • 'gpu_vendor_rule' and 'gpu_device_rule' allow you to influence the techniques which are used with inclusive/exclusive matching rules on the vendor and device name. Can help tune your materials for vendor or device-specific behaviour.
    • '#include' directive now supported in HLSL and Cg shaders
    • Added MaterialManager::Listener
      • Can implement default Technique setting when using a material scheme for which there isn't a specific Technique
      • Can use to change materials for all objects easily per viewport by using a new scheme name
    • Added Pass::setPolygonModeOverrideable / script 'polygon_mode_overrideable'
      • Allows pass-level control over whether the camera's polygon mode should affect rendering
    • Added 'light_scissor' option to Pass
      • Allows pass fragment processing to be limited to a scissor rectangle of the light coverage in that pass
      • Additive texture and stencil shadows now use scissor automatically for additive colour passes, previously just used for rendering stencil shadow volumes
    • Added 'iteration_depth_bias' option to pass. Allows you to increment the depth bias on a pass by a specific amount each iteration if you wish
    • 'light_number' GPU parameter binding added
    • 'light_count' GPU parameter binding added
    • 'spotlight_viewproj_matrix' and 'spotlight_worldviewproj_matrix' added so you can use matrices from spotlights even without having set up texture shadows or an explicit texture projector
    • Added 'light_clip_planes' option to Pass
      • Clips triangles to a cube (point lights) or pyramid (spot lights)
      • Available when the pass is only using one light and you need to restrict complexity
    • Added 'separate_scene_blend' option to Pass
      • Allows the use of separate blend operations for colour and alpha between rendered pixel and existing frame buffer
    • Added pass option 'illumination_stage'
      • Allows material writers to assert control over the illumination pass compilation (additive shadows)
      • You can now incorporate sequences you could not before in your additive lighting materials
      • For example, allows you to include specular effects by pulling the decal pass into the per-light pass if that works for your material (offset mapping used as an example)
    • Added 'gamma' option to texture declaration in texture_unit (sRGB support)
      • Causes hardware to perform gamma space to linear space conversion when sampling the texture
      • Useful only for 8-bit per channel colour textures (not floating point textures or normal maps)
      • Can improve quality results from shaders because they mostly assume calculations are done in linear space
      • You will need to convert results back to gamma space when rendering to an 8-bit per channel render target either via a shader instruction or enabling the gamma correction option in RenderWindow or on the render texture
    • Added 'transparent_sorting' option to Pass, allows you to disable depth sorting for transparencies
    • Added 'alpha_to_coverage' option to Pass, allowing you to use alpha to coverage to multisample alpha-rejected textures. Even though this is a Dx10 feature, it is available on Dx9 for recent ATI and NVIDIA cards, and OpenGL on all cards that implement it.
  • Frustum / Camera Changes
    • Orthographic projection now allows explicit setting of orthographic window size
    • Added Camera::getCameraToViewportBoxVolume. Similar to getCameraToViewportRay but generates a PlaneBoundedVolume from a screen-space rectangle which can be used in a PlaneBoundedVolumeListSceneQuery to do rubber-band selections
    • Added Frustum::setFrustumExtents - allows you to specify the left/right/top/bottom planes manually and thus create any shape frustum you need to, even without the camera being in the centre of it
  • MovableObject changes
    • An object will no longer render its debug display if set to visible (e.g. via a cascading visibility update), you have to explicitly turn on the debug display. This is available via MovableObject::setDebugDisplayEnabled and SceneNode::setDebugDisplayEnabled
    • Added visitRenderables() method - allows you to get a callback to a Renderable::Visitor class for all Renderables that this object will potentially add to the render queue. Identifies LOD and debug renderables.
  • Scaling Issues
    • By default now, renormalisation of normals is automatic if there is a non-unit scale on the main world matrix rather than the Entity::setNormaliseNormals option. If the user wants to optimise this, they can prevent the SceneManager doing it in all cases by calling SceneManager::setNormaliseNormalsOnScale(false) and then explicitly enabling the option per Pass instead. In the case of an array of world matrices being used, if the first world matrix isn't a guide then the shader writer should handle the renormalisation.
    • By default now, Ogre will flip the culling mode of objects that are rendered with a negative scale (ie they are reflected by the transform of the node). This means you can now negatively scale objects and they will be rendered correctly. You can disable this behaviour by calling SceneManager::setFlipCullingOnNegativeScale(false)
  • Compositor Changes
    • You can now define Multiple Render Targets (MRT) in compositor scripts.
      • To define a MRT, just list all the formats one after the other in the 'texture' definition.
      • To reference a MRT subsurface later in a render_quad pass, use the optional extra 'mrtIndex' at the end of the 'input' command
      • Note: as at this time, D3D requires that all surfaces of the MRT are of the same bit depth, and GL requires them to be of the same format
    • Compositors now detect when the viewport they are attached to is using sRGB or multisample antialiasing, and apply the same settings to any intermediate textures which are having the original scene rendered to them (explicitly via a 'render_scene' pass or implicitly via 'input previous')
    • The 'texture' directive now supports specifying a size which is a multiple of the main target size. You can use 'target_width_scaled' and 'target_height_scaled', each followed by a floating-point scaling factor, so 'target_width_scaled 0.5' for example would result in a texture with a width of half the size of the target the compositor is applied to.
  • FrameListener changes
    • Added new callback 'frameRenderingQueued'. This callback occurs after all rendering commands have been sent to all render targets, but before the double-buffered targets (windows) are asked to swap their buffers. This allows you to perform some useful work on the CPU in the main thread whilst the GPU chews over the queued rendering commands. On return from the callback, the buffers will be swapped. This is equivalent to running your own rendering loop in previous versions and using RenderWindow::update(false) then RenderWindow::swapBuffers separately, but it now makes the technique available in the standard render loop.
  • SceneManager changes
    • Chaster's 'Portal Connected Zone' SceneManager added
    • 'Camera relative rendering' option added so that in large scenes where you are far from the origin, precision issues on the GPU can be mitigated by only transforming objects relative to the camera. See SceneManager::setCameraRelativeRendering
  • ManualObject changes
    • 4D texture coordinates now supported
    • 32-bit indexes now supported
  • Tangents generation changes
    • New TangentSpaceCalc class can be used to calculate tangents for any geometry more easily, not just Mesh
    • Now generates tangents based on a UV-area weighted, triangle angle weighted basis resulting in less biasing from small / thin triangles
    • Now has options for splitting vertices when the tangent space basis is either mirrored or rotated around a vertex.
    • Tangents can now be stored as a 4-component vector, with the 'w' component containing the parity. Multiply the binormal/bitangent you calculate in your shader by this to render models with mirrored UVs correctly.
  • Resource changes
    • Resource now has a lightweight way to observe whether it has been reloaded since you last looked at it, via getStateCount(). Other changes known to make derived data out of date may also increment this number. This allows Entity to now pick up when Mesh has been altered and refresh itself on next render.
    • You can now query for file modification times via ResourceGroupManager::resourceModifiedTime
  • RenderSystemCapabilities changes
    • RenderSystem capabilities can now be serialised and these configs used to emulate lesser hardware
    • More information about graphics card is exposed in this structure now, including device name, driver version and also enumerates the most common vendors
  • SkyBox changes
    • Skyboxes now detect and can use materials which use the 'combinedUVW' option to cubic_texture. Allows you to use the same single combined DDS for both reflection maps and skybox (previously the skybox had to be 6 separate images)
  • RenderWindow changes
    • You can now request the hardware to perform linear-to-sRGB colour space conversions for you, before the blending calculation. Use the 'gamma' name-value pair option on creation of a window or the "sRGB Gamma Conversion" render system config option for the auto-window.
  • Render to Texture changes
    • You can now enable sRGB conversion on render textures when you create them
    • Multisample antialiasing is now supported when rendering to textures, specify the number of samples when you create the texture
    • MRTs with different bit depths are now supported if the hardware exposes the facility (check RSC_MRT_DIFFERENT_BIT_DEPTHS)
  • Image Changes
    • Ogre can now detect the format of an image without needing a file extension, so you can load data from streams without knowing what file it came from. The Codec system has been expanded to provide support for recognising 'magic' signatures.
  • Light changes
    • Lights now have a 'power' value as well as a colour, for HDR lights (defaults to 1.0)
    • Derived light colour auto-params are now factored by the light power
    • Lights can now have their own shadow far distance settings (default is to continue to use the SceneManager global one)
  • Animation Changes
    • You can now use 'skeletal blend masks' to simplify the process of combining multiple layered animations to subsets of skeletons, or temporarily masking out the application of predefined animation to given bones (e.g. in order to manually control them). You create & apply these through AnimationState.
    • AnimationTrack::Listener allows you to override interpolation and drive animation procedurally if you wish
  • Threading changes
    • OGRE_THREAD_SUPPORT can now take 3 values, 0=no threading, 1=full background loading, 2=semithreading (background preparing). The new option allows you to use a background thread just to perform I/O or calculate data, but for the main thread still to be responsible for dealing with the rendersystem. This means less synchronisation is required (since the rendersystem can still run without any threading protection) and thus there are fewer overheads involved in using background loading, at the expense of a slightly more complicated setup.
  • Renderable changes
    • Added preRender and postRender methods that let you further customise the render operations that are performed by a specific Renderable
  • Archive changes
    • Added Archive::getModifiedTime to allow you to query for file changes
  • Camera changes
    • Camera now has an optional 'LOD Camera' which can be used to make LOD decisions based on a different camera
  • Shadow changes
    • Texture shadows now base LOD on the main view's camera, not on the shadow camera
    • Multiple textures per light are now supported, allowing techniques such as Parallel Split Shadow Maps, Dual-parabaloid Shadow Maps and Cubic Shadow Maps to be implemented
    • Implementation of Parallel Split Shadow Maps (PSSM) is included, use the new class PSSMShadowCameraSetup. Integrated shadows are required since shaders are required to pick the appropriate shadow map. See PlayPen::testTextureShadowsIntegratedPSSM for an example.
  • Geometry shader support
    • Currently supported in OpenGL only (until Dx10 renderer complete)
    • ParticleGS and IsoSurf demos added
    • RenderToVertexBuffer support also added
  • Memory management changes
    • Custom allocators now supported
    • New debug memory tracker for tracking memory usage by pool, and identifying leaks

Porting notes

  • Root changes
    • getCurrentFrameNumber has been removed and replaced with getNextFrameNumber. The reason is that it now reflects the frame in which any changes you're making will take effect; the distinction is needed for those wanting to perform changes in the FrameListener::frameRenderingQueued callback. Changes made here will be made in the same frame number as the next frame to be rendered, so state changed here will persist for the next frame.
    • If you run your own rendering loop and have to raise frame events yourself, you must now call Root::_fireFrameRenderingQueued as well as the frame started / ended event firing methods. It is here that the frame number is incremented now.
  • ExampleFrameListener changes
    • The default behaviour of frameStarted is now contained in frameRenderingQueued as an example of using the new event.
  • Frustum changes
    • When set to orthographic mode, the Frustum size is no longer based on the FOV and near clip plane. Instead, set the orthographic window specifically using setOrthoWindow / setOrthoWindowHeight. Only the height is stored, the width is derived from the aspect ratio.
  • Renderable changes
    • getWorldPosition and getWorldOrientation removed from Renderable interface, not used
      • NOTE: the Node::* versions of the same name have also been removed. Use _getDerivedPosition/_getDerivedOrientation instead.
    • Renderable::Visitor added as an abstract way to enquire on a Renderable contained in any other object. Also see MovableObject changes.
    • Renderable::getClipPlanes method has been removed. Wasn't used for anything in OGRE and there are more useful ways the finite number of clip planes available can be used
  • SceneManager changes
    • ShadowListener has been changed to SceneManager::Listener and additional methods have been added
    • SceneManager::renderSingleObject now takes a non-const Renderable pointer
    • QueuedRenderableVisitor::visit now takes a non-const Renderable pointer, and a non-const RenderablePass pointer
  • RenderQueue changes
    • RenderableListener::renderableQueued interface changed, please check your implementations
  • Shadow changes
    • The default additive texture and stencil shadows now use a scissor rectangle based on the light coverage when rendering the additive colour passes. Previously the scissor was only used when rendering the stencil shadow volumes. Should not affect your scenes unless you are using a shader which used to apply light outside the light's attenuation range; if you did do this, the light will now be cropped.
  • Entity changes
    • setNormaliseNormals has been removed. Renormalisation is now automatic (see Changelog for details)
  • Compositor changes
    • CompositionTechnique::TextureDefinition no longer has a single 'format' member, instead it has a 'formatList' member into which you should push requested formats (only a single entry unless you want to use MRTs)
  • RenderSystemCapabilities changes
    • A few 'numBlah' methods have been renamed to the more standard 'getNumBlah' equivalent
  • RenderSystem changes
    • createRenderTexture has been removed. It has been deprecated for 2 versions, you should be using TextureManager::create with a usage mode of TU_RENDERTARGET
    • 'initialise' and 'createRenderWindow' are now called '_initialise' and '_createRenderWindow' respectively, to indicate that it's important to call Root's versions of these methods. Failure to do so can cause some key initialisation to be missed on the first window.
  • FileSystem changes
    • By default, hidden files and folders are ignored in the traversal now. You can change this via FileSystem::setIgnoreHidden, but it's useful for operating in CVS / SVN folders for example where the metadata folders are now skipped.
  • Script changes
    • You must prefix all top-level entries in the script system with the type - e.g. 'particle_system' and 'overlay'
    • If you have any problems with the new compilers you can revert to the old ones as a last resort by changing OgreConfig.h and rebuilding Ogre
  • Header changes
    • OgreMemoryMacros.h and OgreNoMemoryMacros.h no longer exist, you should delete any reference you have to them
  • DataStream changes
    • MemoryDataStream changes
      • If you pass a pointer to existing memory and set the 'freeOnClose' parameter to 'true', it is imperitive that you allocated the memory using OGRE_ALLOC_T or OGRE_MALLOC and used a category of MEMCATEGORY_GENERAL to ensure the freeing of memory matches up.
      • If you allow MemoryDataStream to allocate the memory itself, but free the memory yourself later (you set freeOnClose to false), you must free using OGRE_FREE(ptr, MEMCATEGORY_GENERAL), again to match up with the original allocation.
    • FileStreamDataStream changes
      • If you ask FileStreamDataStream to delete the std::ifstream for you on destruction, you must have allocated it with OGRE_NEW_T with a category of MEMCATEGORY_GENERAL
  • Image changes
    • If you transfer ownership of data to / from Image via the loadDynamicImage method, you must make sure that memory is allocated and freed consistently. Again, allocate and free via OGRE_ALLOC_T or OGRE_MALLOC and OGRE_FREE and use the MEMCATEGORY_GENERAL category.
  • SharedPtr changes
    • SharedPtr now has an optional second parameter to the constructor and bind() methods, indicating the method by which the memory should be freed. It defaults to OGRE_DELETE which is sufficient for instances constructed with new or OGRE_NEW. If you constructed using the new memory functions OGRE_NEW_T or OGRE_ALLOC_T then you should change this parameter to make it use OGRE_DELETE_T and OGRE_FREE respectively, so that the deallocation matches up. Only MEMCATEGORY_GENERAL is supported.
  • Archive changes
    • New method added: 'getModifiedTime' - this must be implemented by custom archives to return the file modification time
  • ShadowCameraSetup changes
    • An additional parameter, 'iteration', has been added to the getShadowCamera method to allow the support of multiple shadow textures per light. All ShadowCameraSetup implementations must be updated to include this new signature
  • ResourceBackgroundQueue changes
    • ResourceBackgroundQueue::Listener methods have changed signature; operationCompleted and operationCompletedInThread now have an additional parameter containing the result of the operation, allowing you to detect errors.

<HR>
Creative Commons Copyright -- Some rights reserved.


THE WORK (AS DEFINED BELOW) IS PROVIDED UNDER THE TERMS OF THIS CREATIVE COMMONS PUBLIC LICENSE ("CCPL" OR "LICENSE"). THE WORK IS PROTECTED BY COPYRIGHT AND/OR OTHER APPLICABLE LAW. ANY USE OF THE WORK OTHER THAN AS AUTHORIZED UNDER THIS LICENSE OR COPYRIGHT LAW IS PROHIBITED.

BY EXERCISING ANY RIGHTS TO THE WORK PROVIDED HERE, YOU ACCEPT AND AGREE TO BE BOUND BY THE TERMS OF THIS LICENSE. THE LICENSOR GRANTS YOU THE RIGHTS CONTAINED HERE IN CONSIDERATION OF YOUR ACCEPTANCE OF SUCH TERMS AND CONDITIONS.

1. Definitions

  • "Collective Work" means a work, such as a periodical issue, anthology or encyclopedia, in which the Work in its entirety in unmodified form, along with a number of other contributions, constituting separate and independent works in themselves, are assembled into a collective whole. A work that constitutes a Collective Work will not be considered a Derivative Work (as defined below) for the purposes of this License.
  • "Derivative Work" means a work based upon the Work or upon the Work and other pre-existing works, such as a translation, musical arrangement, dramatization, fictionalization, motion picture version, sound recording, art reproduction, abridgment, condensation, or any other form in which the Work may be recast, transformed, or adapted, except that a work that constitutes a Collective Work will not be considered a Derivative Work for the purpose of this License. For the avoidance of doubt, where the Work is a musical composition or sound recording, the synchronization of the Work in timed-relation with a moving image ("synching") will be considered a Derivative Work for the purpose of this License.
  • "Licensor" means the individual or entity that offers the Work under the terms of this License.
  • "Original Author" means the individual or entity who created the Work.
  • "Work" means the copyrightable work of authorship offered under the terms of this License.
  • "You" means an individual or entity exercising rights under this License who has not previously violated the terms of this License with respect to the Work, or who has received express permission from the Licensor to exercise rights under this License despite a previous violation.
  • "License Elements" means the following high-level license attributes as selected by Licensor and indicated in the title of this License: Attribution, ShareAlike.

2. Fair Use Rights

Nothing in this license is intended to reduce, limit, or restrict any rights arising from fair use, first sale or other limitations on the exclusive rights of the copyright owner under copyright law or other applicable laws.

3. License Grant

Subject to the terms and conditions of this License, Licensor hereby grants You a worldwide, royalty-free, non-exclusive, perpetual (for the duration of the applicable copyright) license to exercise the rights in the Work as stated below:

  • to reproduce the Work, to incorporate the Work into one or more Collective Works, and to reproduce the Work as incorporated in the Collective Works;
  • to create and reproduce Derivative Works;
  • to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission the Work including as incorporated in Collective Works;
  • to distribute copies or phonorecords of, display publicly, perform publicly, and perform publicly by means of a digital audio transmission Derivative Works.
  • For the avoidance of doubt, where the work is a musical composition:
    • Performance Royalties Under Blanket Licenses. Licensor waives the exclusive right to collect, whether individually or via a performance rights society (e.g. ASCAP, BMI, SESAC), royalties for the public performance or public digital performance (e.g. webcast) of the Work.
    • Mechanical Rights and Statutory Royalties. Licensor waives the exclusive right to collect, whether individually or via a music rights society or designated agent (e.g. Harry Fox Agency), royalties for any phonorecord You create from the Work ("cover version") and distribute, subject to the compulsory license created by 17 USC Section 115 of the US Copyright Act (or the equivalent in other jurisdictions).
    • Webcasting Rights and Statutory Royalties. For the avoidance of doubt, where the Work is a sound recording, Licensor waives the exclusive right to collect, whether individually or via a performance-rights society (e.g. SoundExchange), royalties for the public digital performance (e.g. webcast) of the Work, subject to the compulsory license created by 17 USC Section 114 of the US Copyright Act (or the equivalent in other jurisdictions).


The above rights may be exercised in all media and formats whether now known or hereafter devised. The above rights include the right to make such modifications as are technically necessary to exercise the rights in other media and formats. All rights not expressly granted by Licensor are hereby reserved.

4. Restrictions

The license granted in Section 3 above is expressly made subject to and limited by the following restrictions:

  • You may distribute, publicly display, publicly perform, or publicly digitally perform the Work only under the terms of this License, and You must include a copy of, or the Uniform Resource Identifier for, this License with every copy or phonorecord of the Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Work that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder. You may not sublicense the Work. You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute, publicly display, publicly perform, or publicly digitally perform the Work with any technological measures that control access or use of the Work in a manner inconsistent with the terms of this License Agreement. The above applies to the Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Work itself to be made subject to the terms of this License. If You create a Collective Work, upon notice from any Licensor You must, to the extent practicable, remove from the Collective Work any credit as required by clause 4(c), as requested. If You create a Derivative Work, upon notice from any Licensor You must, to the extent practicable, remove from the Derivative Work any credit as required by clause 4(c), as requested.
  • You may distribute, publicly display, publicly perform, or publicly digitally perform a Derivative Work only under the terms of this License, a later version of this License with the same License Elements as this License, or a Creative Commons iCommons license that contains the same License Elements as this License (e.g. Attribution-ShareAlike 2.5 Japan). You must include a copy of, or the Uniform Resource Identifier for, this License or other license specified in the previous sentence with every copy or phonorecord of each Derivative Work You distribute, publicly display, publicly perform, or publicly digitally perform. You may not offer or impose any terms on the Derivative Works that alter or restrict the terms of this License or the recipients' exercise of the rights granted hereunder, and You must keep intact all notices that refer to this License and to the disclaimer of warranties. You may not distribute, publicly display, publicly perform, or publicly digitally perform the Derivative Work with any technological measures that control access or use of the Work in a manner inconsistent with the terms of this License Agreement. The above applies to the Derivative Work as incorporated in a Collective Work, but this does not require the Collective Work apart from the Derivative Work itself to be made subject to the terms of this License.
  • If you distribute, publicly display, publicly perform, or publicly digitally perform the Work or any Derivative Works or Collective Works, You must keep intact all copyright notices for the Work and provide, reasonable to the medium or means You are utilizing: (i) the name of the Original Author (or pseudonym, if applicable) if supplied, and/or (ii) if the Original Author and/or Licensor designate another party or parties (e.g. a sponsor institute, publishing entity, journal) for attribution in Licensor's copyright notice, terms of service or by other reasonable means, the name of such party or parties; the title of the Work if supplied; to the extent reasonably practicable, the Uniform Resource Identifier, if any, that Licensor specifies to be associated with the Work, unless such URI does not refer to the copyright notice or licensing information for the Work; and in the case of a Derivative Work, a credit identifying the use of the Work in the Derivative Work (e.g., "French translation of the Work by Original Author," or "Screenplay based on original Work by Original Author"). Such credit may be implemented in any reasonable manner; provided, however, that in the case of a Derivative Work or Collective Work, at a minimum such credit will appear where any other comparable authorship credit appears and in a manner at least as prominent as such other comparable authorship credit.

5. Representations, Warranties and Disclaimer

UNLESS OTHERWISE AGREED TO BY THE PARTIES IN WRITING, LICENSOR OFFERS THE WORK AS-IS AND MAKES NO REPRESENTATIONS OR WARRANTIES OF ANY KIND CONCERNING THE MATERIALS, EXPRESS, IMPLIED, STATUTORY OR OTHERWISE, INCLUDING, WITHOUT LIMITATION, WARRANTIES OF TITLE, MERCHANTIBILITY, FITNESS FOR A PARTICULAR PURPOSE, NONINFRINGEMENT, OR THE ABSENCE OF LATENT OR OTHER DEFECTS, ACCURACY, OR THE PRESENCE OF ABSENCE OF ERRORS, WHETHER OR NOT DISCOVERABLE. SOME JURISDICTIONS DO NOT ALLOW THE EXCLUSION OF IMPLIED WARRANTIES, SO SUCH EXCLUSION MAY NOT APPLY TO YOU.

6. Limitation on Liability.

EXCEPT TO THE EXTENT REQUIRED BY APPLICABLE LAW, IN NO EVENT WILL LICENSOR BE LIABLE TO YOU ON ANY LEGAL THEORY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, PUNITIVE OR EXEMPLARY DAMAGES ARISING OUT OF THIS LICENSE OR THE USE OF THE WORK, EVEN IF LICENSOR HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

7. Termination

  • This License and the rights granted hereunder will terminate automatically upon any breach by You of the terms of this License. Individuals or entities who have received Derivative Works or Collective Works from You under this License, however, will not have their licenses terminated provided such individuals or entities remain in full compliance with those licenses. Sections 1, 2, 5, 6, 7, and 8 will survive any termination of this License.
  • Subject to the above terms and conditions, the license granted here is perpetual (for the duration of the applicable copyright in the Work). Notwithstanding the above, Licensor reserves the right to release the Work under different license terms or to stop distributing the Work at any time; provided, however that any such election will not serve to withdraw this License (or any other license that has been, or is required to be, granted under the terms of this License), and this License will continue in full force and effect unless terminated as stated above.

8. Miscellaneous

  • Each time You distribute or publicly digitally perform the Work or a Collective Work, the Licensor offers to the recipient a license to the Work on the same terms and conditions as the license granted to You under this License.
  • Each time You distribute or publicly digitally perform a Derivative Work, Licensor offers to the recipient a license to the original Work on the same terms and conditions as the license granted to You under this License.
  • If any provision of this License is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this License, and without further action by the parties to this agreement, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.
  • No term or provision of this License shall be deemed waived and no breach consented to unless such waiver or consent shall be in writing and signed by the party to be charged with such waiver or consent.
  • This License constitutes the entire agreement between the parties with respect to the Work licensed here. There are no understandings, agreements or representations with respect to the Work not specified here. Licensor shall not be bound by any additional provisions that may appear in any communication from You. This License may not be modified without the mutual written agreement of the Licensor and You.