# Candera V3.0.0

# Overview

#### Release Info

<div class="contents" id="bkmrk-release-date%3A-july-1"><div class="contents"><div class="textblock">- Release Date: July 10, 2014

</div></div></div>#### Interface Changes

<div class="contents" id="bkmrk-candera-engine-3d-ca"><div class="contents"><div class="textblock">- Candera Engine 3D
- Candera Engine 2D
- Candera Base
- Candera System
- Candera Device
- Candera AssetLoader
- Text Engine

</div></div></div>#### Migration Guide and Backwards Compatibility

In CGI Studio V3.0.0, deprecated interfaces from CGI Studio V2.10.0 can still be used to a large extent, while deprecation functions for interfaces from releases before V2.10.0 have been removed completely.

<div class="contents" id="bkmrk-when-interfaces-are-"><div class="contents"><div class="textblock">- When interfaces are used which are marked as **deprecated**, compiler warnings will be generated through the usage of [Candera](http://dev.doc.cgistudio.at/APILINK/namespace_candera.html "[DataBinding_RefTypeSample]") Macro **CANDERA\_DEPRECATED\_3\_0\_0**.
- Interface changes in V3.0.0, which are **not backward compatible** to V2.10.0, are explicitely listed in the page below.

</div></div></div>Refer to:

<div class="contents" id="bkmrk-candera-v3.0.0-migra"><div class="contents"><div class="textblock">- Candera V3.0.0 Migration Guide

---

</div></div></div>

# Candera Engine 3D

#### OpenGL ES 3.0 Support

##### RenderDevice for OpenGL ES 3.0

In order to support OpenGL ES 3.0 a new RenderDevice.cpp has been added, which implements RenderDevice.h with OpenGL ES 3.0 functions. Additionally GlInclude.h, GlTraceMapper and GlTypeMapper have been adapted to support the split of one RenderDevice into several ones for multiple GLES versions. GlTraces are now all displayed under Gles device (instead of Gles20).

For current device packages OpenGL ES 2.0 is still used. If it is supported by a device, usage of OpenGL ES 3.0 can easily be configured in Device.cmake. Simply include Common/OpenGLES30 instead of Common/OpenGLES20 and add the following line to the CMake file.

```
CgiAddDefinitions( -DCGIDEVICE_OPENGLES_30 )
```

##### Synchronization for OpenGL ES 3.0

The OpenGL ES 3.0 render device uses core OpenGL ES 3.0 fences for synchronization, instead of EGL extension EGL\_KHR\_fence\_sync.

##### OpenGL ES 3.0 Support for Linux OpenGLAdapter

OpenGLAdapter for Linux hosts now also supports OpenGL ES 3.0 interface (based on GLX and OpenGL 3.0).

##### OpenGL ES 3.0 ETC2/EAC Texture Compression

OpenGL ES 3.0 introduces ETC2/EAC texture compression as part of the core standard. This enables all OpenGL ES 3.0 capable devices to reduce VRAM and memory bandwidth usage per texture at unnoticeable reduction of image quality, allowing either higher framerates or more and bigger textures used simultaneously.

[Candera](http://dev.doc.cgistudio.at/APILINK/namespace_candera.html "[DataBinding_RefTypeSample]") now supports this feature in the OpenGL ES 3.0 render device. For this purpose [Bitmap](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_bitmap.html "A 2-dimensional bitmap that can be used as a texture, background or sprite. A bitmap pointing to a va...") class has been changed (see [Changes in Bitmap Enumerations](https://doc316en.candera.eu/link/977#bkmrk-changes-in-bitmap-en)). The new [Bitmap::PixelFormat](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_bitmap.html#a0028006b9fd5b6e630bc6aca572603cb) enumerator has to be used for texture uploading.

**See also:**

<div class="contents" id="bkmrk-import-images-for-in"><div class="contents"><div class="textblock">- <span style="color: rgb(230, 126, 35);">[Import Images](https://doc316en.candera.eu/link/1101#bkmrk-image%2C-font%2C-shader%2C-1)</span> for information how to import ETC2/EAC compressed images into SceneComposer.

---

</div></div></div>#### Cloning Interface

In accordance to basic [Unified Cloning Interface](https://doc316en.candera.eu/link/977#bkmrk-unified-cloning-inte), the following changes have been applied to the affected classes in [Candera](http://dev.doc.cgistudio.at/APILINK/namespace_candera.html "[DataBinding_RefTypeSample]") 3D:

<div class="contents" id="bkmrk-cloneinternal-protec"><div class="contents"><div class="textblock">- CloneInternal protected interface was removed.
- Clone(Traversing) has become deprecated.
- Copy constructor was implemented or cleaned up.
- Assignment operator was moved to the private section, and its implementation removed.
- Clone() const function was added.

</div></div></div>The cloning interface was applied to:

<div class="contents" id="bkmrk-node-and-its-descend"><div class="contents"><div class="textblock">- [Node](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_node.html "The class Node is an abstract base class for all scene graph nodes. Each Node defines a local coordin...") and its descendants: [Billboard](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_billboard.html "The class Billboard represents a Plane that can align towards camera automatically, according to the alignment type set. Thus, Billboards are quite often used as "imposters" pretending to be a 3D geometry by showing a 2D image that is always facing the camera. In order to relief distinction between Billboard and PointSprite see following comparison: + Billboards support rectangular dimension and non-uniform scale, + Billboards support different rotation techniques (see Alignment), whereas PointSprites are aligned according to CenterEyeAlignment, exclusively. + Billboards take local rotation and scale into account (see class Transformable), whereas PointSprites ignore Transformable parameters others than position. + PointSprites have a performance advantage due to less geometry (one instead of 4 vertices). Overall recommendation: Use PointSprites for spherical shapes like particles, lens flares, sparkles, dust which are screen aligned (see Billboard::CameraUpAlignment). Further, use Billboards for world up oriented clouds, text, or yaw axis aligned trees, and signs, etc. Note: The Billboard - because of absent normals - does not support lighting. Belows sketch depicts the layout of a Billboard. W U:0,V:1 +-----+ U:1,V:1 H | X | Legend: texture coordinates: U,V; Width: W, Height: H, Local Center: X U:0,V:0 +-----+ U:1,V:0."), [Camera](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_camera.html "A Camera provides Modelview and Projection matrices. Camera is a Transformable.* The eye point is set..."), [Group](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_group.html "The class Group is a scene graph node that stores a set of Nodes as its children. The parent-child re..."), [Light](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_light.html "A Node that represents different kinds of light sources. Light sources are used to determine the colo..."), [LineList](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_line_list.html "The LineList represents a list of lines (segments). It can be used to store a wireframe, a list of connected vertices, or just a list of isolated segments. A generic LineList instance can be created by the static method LineList::Create. A wireframe LineList can be created out of a Mesh by the static helper function Math3D::CreateLineListFromMesh."), [LodNode](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_lod_node.html "LodNode represents a Node which accommodates multiple nodes, each of them representing a certain..."), [Mesh](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_mesh.html "The class Mesh represents a three-dimensional rigid body object defined by polygons. The Mesh's polygonal surface is defined by its VertexBuffer. Each Mesh must have exactly one Appearance set, in order to specify how the Mesh geometry is rendered."), [MorphingMesh](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_morphing_mesh.html "MorphingMesh is a Mesh that stores weight values for morphing, and activates them as uniforms at rend..."), [PlanarShadow](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_planar_shadow.html "PlanarShadow implements a simple technique to simulate shadow casting. Basically a PlanarShadow node ..."), [PointSprite](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_point_sprite.html "PointSprite represents a GL point primitive. The size (glPointSize) of the point is calculated by def..."), [ReflectionCamera](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_reflection_camera.html "A ReflectionCamera represents a reflected view of an associated source camera (See function SetSource..."), [Scene](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_scene.html "The class Scene represents a top level scene graph node. Multiple Scenes are allowed. A Scene can not be part of any other Scene. To render a Scene, at least one Camera must be part of this Scene and the Camera must have rendering enabled. A Scene can have more than one Camera. Note: Lights added to a Scene apply for that Scene only and do not affect 3D objects in any other Scene."), [StereoCamera](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_stereo_camera.html "A StereoCamera is a controller of two assigned Camera objects, used to realize the effect of stereosc...").
- All other objects that are linked to node and descendants through shared pointers: [Appearance](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_appearance.html "The class Appearance groups following render attributes: Material, Textures, RenderMode, and Shader. Render attributes define the distinctive visualization of a geometry like Mesh, Billboard, and PointSprite. Further, render attributes can be shared across multiple objects, which conserves memory and enables sharing of appearance characteristics. An Appearance object is mandatory for any object in order to get rendered. Per default all render attributes are initialized to null, which is a valid setting. If the Appearance is activated, all render attributes that are set become activated. If no RenderMode is defined (null), then the default RenderMode is used instead;.") (and [MultiPassAppearance](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_multi_pass_appearance.html "A MultiPassAppearance enables a node to be rendered multiple times with different appearance settings...")), [Material](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_material.html "The class Material describes the color attributes of an object's surface and is primarily used for li..."), [RenderMode](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_render_mode.html "The class RenderMode is an Appearance component that encapsulates polygon-level and per-fragment comp..."), [Texture](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_texture.html "Texture encapsulates a TextureImage and a set of attributes specifying how it is applied to a vertex'..."), [AbstractShaderParamSetter](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_abstract_shader_param_setter.html "AbstractShaderParamSetter provides an interface to pass shader parameters like uniforms and constant ..."), [GenericShaderParamSetter](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_generic_shader_param_setter.html "GenericShaderParamSetter bundles uniform shader parameters that are calculated by Candera..."), [ShaderParamSetter](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_shader_param_setter.html "ShaderParamSetter maintains a list of uniform parameters that are passed to a Shader."), [Projection](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_projection.html "A Projection provides a projection matrix (for use with Cameras)."), [GenericProjection](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_generic_projection.html "Projection using an externally supplied matrix."), [OrthographicProjection](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_orthographic_projection.html "The class OrthographicProjection represents a form of parallel projection where the view direction is..."), [PerspectiveProjection](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_perspective_projection.html "Perspective projection.").
- [RenderOrder](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_render_order.html "Defines the order(sequence) in which nodes are rendered. Collaborates with Renderer. Must cover functional correctness (translucent/transparent objects after opaque/solid objects) as well as optimization-related orderings (sorting by state, defining a background bin for rendering without depth checks). Nodes are assigned to bins; all nodes in an "earlier" bin are rendered before all nodes in a "later" bin. Two default bins are defined and must not be deleted. The opaque bin, which is sorted from front to back (DistanceToCameraOrderCriterion), and the transparent bin, which is sorted from back to front (ReverseDistanceToCameraOrderCriterion). If a Node has no specific assignment to a render order bin, it will be automatically assigned by Candera either to opaque or transparent bin, according to its RenderMode::IsAlphaBlendingEnabled setting."), as its lifetime is controlled by [Scene](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_scene.html "The class Scene represents a top level scene graph node. Multiple Scenes are allowed. A Scene can not be part of any other Scene. To render a Scene, at least one Camera must be part of this Scene and the Camera must have rendering enabled. A Scene can have more than one Camera. Note: Lights added to a Scene apply for that Scene only and do not affect 3D objects in any other Scene.").

</div></div></div>Special considerations:

<div class="contents" id="bkmrk-general.-clone-for-s"><div class="contents"><div class="textblock">- General. Clone for shared objects returns a shared pointer to the base shared class.
- General. Descendants of [Node](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_node.html "The class Node is an abstract base class for all scene graph nodes. Each Node defines a local coordin...") implement deprecated "Node\* Clone(Traversing)" for backward compatibility.
- [Billboard](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_billboard.html "The class Billboard represents a Plane that can align towards camera automatically, according to the alignment type set. Thus, Billboards are quite often used as "imposters" pretending to be a 3D geometry by showing a 2D image that is always facing the camera. In order to relief distinction between Billboard and PointSprite see following comparison: + Billboards support rectangular dimension and non-uniform scale, + Billboards support different rotation techniques (see Alignment), whereas PointSprites are aligned according to CenterEyeAlignment, exclusively. + Billboards take local rotation and scale into account (see class Transformable), whereas PointSprites ignore Transformable parameters others than position. + PointSprites have a performance advantage due to less geometry (one instead of 4 vertices). Overall recommendation: Use PointSprites for spherical shapes like particles, lens flares, sparkles, dust which are screen aligned (see Billboard::CameraUpAlignment). Further, use Billboards for world up oriented clouds, text, or yaw axis aligned trees, and signs, etc. Note: The Billboard - because of absent normals - does not support lighting. Belows sketch depicts the layout of a Billboard. W U:0,V:1 +-----+ U:1,V:1 H | X | Legend: texture coordinates: U,V; Width: W, Height: H, Local Center: X U:0,V:0 +-----+ U:1,V:0."). Bounding box and bounding sphere are copied from the base class, not recomputed.
- [Camera](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_camera.html "A Camera provides Modelview and Projection matrices. Camera is a Transformable.* The eye point is set..."). [CameraRenderStrategy](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_camera_render_strategy.html "The abstract class CameraRenderStrategy is intended to be derived in order to tell the Renderer...") is not linked to the clone anymore.
- [LodNode](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_lod_node.html "LodNode represents a Node which accommodates multiple nodes, each of them representing a certain..."). Clone contains the same number of levels as the original, but no level information is stored.
- [Node](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_node.html "The class Node is an abstract base class for all scene graph nodes. Each Node defines a local coordin..."). CopyFrom is provided to copy transformations, appearance and other such properties from this node to another one.
- [PlanarShadow](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_planar_shadow.html "PlanarShadow implements a simple technique to simulate shadow casting. Basically a PlanarShadow node ..."). Clone loses association to light.
- [PlanarShadow](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_planar_shadow.html "PlanarShadow implements a simple technique to simulate shadow casting. Basically a PlanarShadow node ..."). As defined by the Copy constructor (but not the assignment operator, previously used for cloning), the id of the clone is different from the one of the original.
- [ReflectionCamera](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_reflection_camera.html "A ReflectionCamera represents a reflected view of an associated source camera (See function SetSource..."). Clone loses association to source camera.
- [Scene](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_scene.html "The class Scene represents a top level scene graph node. Multiple Scenes are allowed. A Scene can not be part of any other Scene. To render a Scene, at least one Camera must be part of this Scene and the Camera must have rendering enabled. A Scene can have more than one Camera. Note: Lights added to a Scene apply for that Scene only and do not affect 3D objects in any other Scene."). [Scene](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_scene.html "The class Scene represents a top level scene graph node. Multiple Scenes are allowed. A Scene can not be part of any other Scene. To render a Scene, at least one Camera must be part of this Scene and the Camera must have rendering enabled. A Scene can have more than one Camera. Note: Lights added to a Scene apply for that Scene only and do not affect 3D objects in any other Scene.") may be cloned. The clone does not receive a render order.
- [StereoCamera](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_stereo_camera.html "A StereoCamera is a controller of two assigned Camera objects, used to realize the effect of stereosc..."). [ProjectionListener](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_projection_listener.html "A ProjectionListener defines hooks that are called when a projection's parameters are changed...") may be copied.
- [ShaderParamSetter](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_shader_param_setter.html "ShaderParamSetter maintains a list of uniform parameters that are passed to a Shader."). Clone does not hold any data since data is handled by the application.
- AssetLoader nodes. They don't support cloning.

</div></div></div>##### Deep Cloning Interface

In accordance to basic [Tree Cloning Strategies](https://doc316en.candera.eu/link/977#bkmrk-tree-cloning-strateg), the following support is provided for deep cloning in 3D as follows:

<div class="contents" id="bkmrk-treecloner-is-a-spec"><div class="contents"><div class="textblock">- TreeCloner is a specialization of [TreeClonerBase](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_tree_cloner_base.html "This class clones scene subtrees.").
- [DeepNodeCloneStrategy](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_deep_node_clone_strategy.html "This is the default clone strategy for deep cloning.") provides a generic node strategy that clones the delegates the cloning of appearance and derived Nodes to specialized strategies.
- [DeepAppearanceCloneStrategy](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_deep_appearance_clone_strategy.html "This is the default clone strategy for deep cloning of appearances.") provides deep appearance cloning. It clones its constituents by resolving shared instances.
- [DeepCompositeGroupCloneStrategy](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_deep_composite_group_clone_strategy.html "This is the default clone strategy for deep cloning composite groups. See DeepNodeCloneStrategy for r..."), [DeepLodNodeCloneStrategy](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_deep_lod_node_clone_strategy.html "This is the default clone strategy for deep cloning lod nodes. See DeepNodeCloneStrategy for rules..."), [DeepStereoCameraCloneStrategy](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_deep_stereo_camera_clone_strategy.html "This is the default clone strategy for deep cloning stereo cameras. See DeepNodeCloneStrategy for rul...") and [DeepReflectionCameraCloneStrategy](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_deep_reflection_camera_clone_strategy.html "This is the default clone strategy for deep cloning reflection cameras. See DeepNodeCloneStrategy for...") resolve node binding by use of TreeMatch.
- [DeepCameraCloneStrategy](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_deep_camera_clone_strategy.html "This is the default clone strategy for deep cloning cameras. See DeepNodeCloneStrategy for rules...") resolves the sharing of projections.
- [DeepSceneCloneStrategy](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_deep_scene_clone_strategy.html "This is the default clone strategy for deep cloning scenes. See DeepNodeCloneStrategy for rules...") clones the [RenderOrder](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_render_order.html "Defines the order(sequence) in which nodes are rendered. Collaborates with Renderer. Must cover functional correctness (translucent/transparent objects after opaque/solid objects) as well as optimization-related orderings (sorting by state, defining a background bin for rendering without depth checks). Nodes are assigned to bins; all nodes in an "earlier" bin are rendered before all nodes in a "later" bin. Two default bins are defined and must not be deleted. The opaque bin, which is sorted from front to back (DistanceToCameraOrderCriterion), and the transparent bin, which is sorted from back to front (ReverseDistanceToCameraOrderCriterion). If a Node has no specific assignment to a render order bin, it will be automatically assigned by Candera either to opaque or transparent bin, according to its RenderMode::IsAlphaBlendingEnabled setting.").
- [DeepTreeCloner](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_deep_tree_cloner.html "This class creates deep clones scene subtrees.") is a wrapper of [DeepNodeCloneStrategy](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_deep_node_clone_strategy.html "This is the default clone strategy for deep cloning.") that provides an interface similar to TreeCloner.

---

</div></div></div>#### CompositeGroup

[CompositeGroup](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_composite_group.html "CompositeGroup is a Group that allows direct access to a number of descendants, called 'anchor points...") is a new [Node](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_node.html "The class Node is an abstract base class for all scene graph nodes. Each Node defines a local coordin...") type that is usually created by AssetLoader and which contain:

<div class="contents" id="bkmrk-a-list-of-anchorpoin"><div class="contents"><div class="textblock">- a list of AnchorPoints: descendants of the [CompositeGroup](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_composite_group.html "CompositeGroup is a Group that allows direct access to a number of descendants, called 'anchor points...") that can be accessed directly from the [CompositeGroup](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_composite_group.html "CompositeGroup is a Group that allows direct access to a number of descendants, called 'anchor points...") instance.
- a list of Widgets that act on any node within the [CompositeGroup](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_composite_group.html "CompositeGroup is a Group that allows direct access to a number of descendants, called 'anchor points...") subtree.
- a list of AnimationPlayers that act on any node within the [CompositeGroup](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_composite_group.html "CompositeGroup is a Group that allows direct access to a number of descendants, called 'anchor points...") subtree.

---

</div></div></div>#### Picking Test: Consistent Behavior for deep and flat Picking

In both cases [Node::IsPickIntersectingGeometry](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_node.html#a0e1a8d24555a67b3cddf6a2ceef94481) only returns true for a tested node if it is hit by the intersection ray AND [Node::IsEffectiveIntersectionTestEnabled](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_node.html#afe02245f99d5af6beff8253a55eb4340) is true.

<div class="contents" id="bkmrk-"><div class="contents"><div class="textblock">---

</div></div></div>#### DeviceObject Listener

[DeviceObject](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_device_object.html "DeviceObject is the pure abstract base class for all objects which are able to upload or unload itsel...") now supports adding listeners that are notified before and after the object is uploaded and unloaded and before it is destroyed.

<div class="contents" id="bkmrk--0"><div class="contents"><div class="textblock">---

</div></div></div>#### Upload to Multiple Contexts

Device Objects of a [Node](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_node.html "The class Node is an abstract base class for all scene graph nodes. Each Node defines a local coordin...") (and its descendants) can be uploaded to all render target contexts belonging to the cameras the nodes are in scope of.

<div class="contents" id="bkmrk-see-also%3A-node%3A%3Auplo"><div class="contents"><div class="textblock"><dl class="see"><dt>**See also:**</dt><dd>[Node::UploadAll()](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_node.html#aadc2503500f1f656444d4570c49ca4f1). Furthermore, logical operators for intersection and union of Scope masks have been added to [Candera::ScopeMask](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_scope_mask.html "The class ScopeMask allows scene graph nodes to form conceptual groups independent of the scene graph...").</dd></dl>---

</div></div></div>#### ExternalTextureImage

Added ExternalTextureImage which is a texture image that allows wrapping external created native texture objects.

<div class="contents" id="bkmrk--1"><div class="contents"><div class="textblock">---

</div></div></div>#### Car Paint Shaders added

The following reference shaders have been added:

<div class="contents" id="bkmrk-refcarbon-%2F-reftrans"><div class="textblock">- RefCarbon / RefTransLight1Carbon  
    Creates a car paint with typical carbon look.
- RefFlopCarPaint / RefTransLight1FlopCarPaint  
    Creates a car paint with shiny, anisotropic two color look.
- RefMetalFlakesCarPaint / RefTransLight1MetalFlakesCarPaint  
    Creates a car paint with shiny, sparkling look produced by metal flakes within specular highlight.
- RefFlopMetalFlakesCarPaint / RefTransLight1FlopMetalFlakesCarPaint  
    Creates a car paint with shiny, sparkling look produced by metal flakes within specular highlight combined with anisotropic two color look.

</div></div>---

# Candera Engine 2D

#### Deterministic Render Order

In the past, RenderNodes with the same depth value have been rendered in an order which was dependent on the point of time the node has been added to the scene. The result was that in SceneComposer the render order could look different as when

 loading the scene from the asset on target.

The new implementation ensures that the render order of nodes with the same depth value is defined by the position within the scene tree. Nodes which appear on top of the scene tree (as shown in SceneComposer) are rendered before nodes that are located on the bottom of the scene tree. Therefore the render order is always the same during design on host (SceneComposer) and on target.

<div class="contents" id="bkmrk-"><div class="contents"><div class="textblock">---

</div></div></div>#### Cloning Interface

In accordance to basic [Unified Cloning Interface](https://doc316en.candera.eu/link/977#bkmrk-unified-cloning-inte), the following changes have been applied to the affected classes in [Candera](http://dev.doc.cgistudio.at/APILINK/namespace_candera.html "[DataBinding_RefTypeSample]") Engine 2D:

<div class="contents" id="bkmrk-cloneself%28cloneopera"><div class="contents"><div class="textblock">- CloneSelf(CloneOperation) protected interface was removed.
- Clone(TraverseOperation, CloneOperation) has become deprecated.
- Copy constructor lost the optional CloneOperation argument.
- Clone() const function was added.

</div></div></div>The cloning interface was applied to:

<div class="contents" id="bkmrk-node2d-and-its-desce"><div class="contents"><div class="textblock">- [Node2D](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_node2_d.html "The class Node2D is an abstract base class for all 2D scene graph nodes.") and its descendants: [Camera2D](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_camera2_d.html "A camera defines the view to the scene. At least one Camera2D has to be added to a 2D scene graph and..."), [CompositeGroup2D](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_composite_group2_d.html "CompositeGroup2D is a Group2D that allows direct access to a number of descendants, called 'anchor points'."), [Group2D](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_group2_d.html "The class Group2D is a scene graph node that stores a set of nodes as its children. The parent-child relationship between groups and nodes is bidirectional. Whereas a group can hold a group of nodes, a node can at most have one parent at a time. Cycles are prohibited. Changing the groups transformation or alpha value affects the children nodes of the group."), [RenderNode](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_render_node.html "RenderNode is a 2D node that links to an effect chain. Therefore this is the only type of 2D node whi..."), [Scene2D](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_scene2_d.html "The class Scene2D represents a top level scene graph node. Multiple scenes are allowed. A scene can not be part of any other scene.").
- [Effect2D](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_effect2_d.html "Base class for all 2D effects which can be added to a 2D RenderNode.") and [Layouter](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_layouter.html "A non-zero padding applies space inside the element layout's width and height. The values can be set ...") already define the interface appropriately.

</div></div></div>Special considerations:

<div class="contents" id="bkmrk-general.-descendants"><div class="contents"><div class="textblock">- General. Descendants of [Node](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_node.html "The class Node is an abstract base class for all scene graph nodes. Each Node defines a local coordin...") implement deprecated "Node2D\* Clone(Traversing) const" and "Node2D Clone(TraverseOperation, CloneOperation) const" for backward compatibility.
- [Camera2D](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_camera2_d.html "A camera defines the view to the scene. At least one Camera2D has to be added to a 2D scene graph and..."). [Camera2DRenderStrategy](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_camera2_d_render_strategy.html "The abstract class Camera2DRenderStrategy is intended to be derived in order to tell the Renderer2D...") and RenderTarget2D are not linked to the clone anymore.
- [Node2D](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_node2_d.html "The class Node2D is an abstract base class for all 2D scene graph nodes."). [Layouter](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_layouter.html "A non-zero padding applies space inside the element layout's width and height. The values can be set ...") is copied during deep node cloning. Because of this [Node2D](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_node2_d.html "The class Node2D is an abstract base class for all 2D scene graph nodes.") handles the destruction of [Layouter](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_layouter.html "A non-zero padding applies space inside the element layout's width and height. The values can be set ...") upon disposing the node.
- [Scene2D](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_scene2_d.html "The class Scene2D represents a top level scene graph node. Multiple scenes are allowed. A scene can not be part of any other scene."). [Scene2D](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_scene2_d.html "The class Scene2D represents a top level scene graph node. Multiple scenes are allowed. A scene can not be part of any other scene.") may be cloned. [Scene2D](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_scene2_d.html "The class Scene2D represents a top level scene graph node. Multiple scenes are allowed. A scene can not be part of any other scene.") render order is not cloned, as it doesn't support different render order bins.

</div></div></div>##### Deep Cloning Interface

In accordance to basic [Tree Cloning Strategies](https://doc316en.candera.eu/link/977#bkmrk-unified-cloning-inte), the following support is provided for deep cloning in 2D as follows:

<div class="contents" id="bkmrk-treecloner2d-is-a-sp"><div class="contents"><div class="textblock">- TreeCloner2D is a specialization for the 2D scene tree of [TreeClonerBase](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_tree_cloner_base.html "This class clones scene subtrees.").
- [DeepNode2DCloneStrategy](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_deep_node2_d_clone_strategy.html "This is the default clone strategy for deep cloning.") provides a generic node strategy that clones the delegates the cloning of derived Nodes to specialized strategies.
- [DeepCompositeGroup2DCloneStrategy](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_deep_composite_group2_d_clone_strategy.html "This is the default clone strategy for deep cloning composite groups. See DeepNode2DCloneStrategy for...") resolves node binding by use of TreeMatch2D.
- [DeepRenderNodeCloneStrategy](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_deep_render_node_clone_strategy.html "This is the default clone strategy for deep cloning render nodes. See DeepNode2DCloneStrategy for rul...") resolves the sharing of effects by use of a map.
- [DeepTreeCloner2D](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_deep_tree_cloner2_d.html "This class creates deep clones scene subtrees.") is a wrapper of [DeepNode2DCloneStrategy](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_deep_node2_d_clone_strategy.html "This is the default clone strategy for deep cloning.") that provides an interface similar to TreeCloner2D.

---

</div></div></div>#### CompositeGroup2D

[CompositeGroup](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_composite_group.html "CompositeGroup is a Group that allows direct access to a number of descendants, called 'anchor points...") is a new [Node2D](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_node2_d.html "The class Node2D is an abstract base class for all 2D scene graph nodes.") type that is usually created by AssetLoader and which contain:

<div class="contents" id="bkmrk-a-list-of-anchorpoin"><div class="contents"><div class="textblock">- a list of AnchorPoints: descendants of the [CompositeGroup2D](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_composite_group2_d.html "CompositeGroup2D is a Group2D that allows direct access to a number of descendants, called 'anchor points'.") that can be accessed directly from the [CompositeGroup2D](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_composite_group2_d.html "CompositeGroup2D is a Group2D that allows direct access to a number of descendants, called 'anchor points'.") instance.
- a list of Widgets that act on any node within the [CompositeGroup2D](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_composite_group2_d.html "CompositeGroup2D is a Group2D that allows direct access to a number of descendants, called 'anchor points'.") subtree.
- a list of AnimationPlayers that act on any node within the [CompositeGroup2D](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_composite_group2_d.html "CompositeGroup2D is a Group2D that allows direct access to a number of descendants, called 'anchor points'.") subtree.

---

</div></div></div>#### SharedPointer: Deprecated '...Ptr' types

All effect Ptr types like e.g. BitmapBrushPtr are marked as deprecated. Please use e.g. BitmapBrush::SharedPointer instead.

<div class="contents" id="bkmrk--0"><div class="contents"><div class="textblock">---

</div></div></div>#### Deprecated BaseEffect2DPropertySetter

BaseEffect2DPropertySetter and its derivate classes became deprecated. [Effect2D](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_effect2_d.html "Base class for all 2D effects which can be added to a 2D RenderNode.") objects, as other objects with attached MetaInfo, can already animate their properties using built-in PropertyMetaInfo AnimationPropertySetters, with an improved performance.

<div class="contents" id="bkmrk--1"><div class="contents"><div class="textblock">---

</div></div></div>#### AnimationPropertySetters Namespace Correction

All AnimationPropertySetters residing in `<cgi_studio_candera>/src/Candera/Engine2D/AnimationPropertySetters` have been moved from the *[Candera](http://dev.doc.cgistudio.at/APILINK/namespace_candera.html "[DataBinding_RefTypeSample]")* to the *Candera::Animation* namespace. The following classes are affected by this change:

<div class="contents" id="bkmrk-alphanode2dpropertys"><div class="contents"><div class="textblock">- [AlphaNode2DPropertySetter](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_alpha_node2_d_property_setter.html)
- [BaseNode2DPropertySetter](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_base_node2_d_property_setter.html)
- [BaseTransformable2DPropertySetter](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_base_transformable2_d_property_setter.html)
- [BaseTransformable2DRelativePropertySetter](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_base_transformable2_d_relative_property_setter.html)
- BaseEffect2DPropertySetter
- Effect2DFloatPropertySetter
- [RenderingEnabledNode2DPropertySetter](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_rendering_enabled_node2_d_property_setter.html)
- [Transformable2DRelativeRotatePropertySetter](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_transformable2_d_relative_rotate_property_setter.html)
- [Transformable2DRelativeScalePropertySetter](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_transformable2_d_relative_scale_property_setter.html)
- [Transformable2DRelativeScaleXPropertySetter](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_transformable2_d_relative_scale_x_property_setter.html)
- [Transformable2DRelativeScaleYPropertySetter](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_transformable2_d_relative_scale_y_property_setter.html)
- [Transformable2DRelativeTranslatePropertySetter](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_transformable2_d_relative_translate_property_setter.html)
- [Transformable2DRelativeTranslateXPropertySetter](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_transformable2_d_relative_translate_x_property_setter.html)
- [Transformable2DRelativeTranslateYPropertySetter](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_transformable2_d_relative_translate_y_property_setter.html)
- [Transformable2DRotatePropertySetter](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_transformable2_d_rotate_property_setter.html)
- [Transformable2DScalePropertySetter](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_transformable2_d_scale_property_setter.html)
- [Transformable2DScaleXPropertySetter](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_transformable2_d_scale_x_property_setter.html)
- [Transformable2DScaleYPropertySetter](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_transformable2_d_scale_y_property_setter.html)
- [Transformable2DTranslatePropertySetter](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_transformable2_d_translate_property_setter.html)
- [Transformable2DTranslateXPropertySetter](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_transformable2_d_translate_x_property_setter.html)
- [Transformable2DTranslateYPropertySetter](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_transformable2_d_translate_y_property_setter.html)

<dl class="note"></dl></div></div></div><p class="callout info">Moved classes are still accessible via the Candera namespace in CGI-Studio 3.0.0 but these deprecated interfaces will be removed in the next release.</p>

<div class="contents" id="bkmrk--2"><div class="contents"><div class="textblock">---

</div></div></div>#### Candera2D Bitmap MipMap Flag

Candera2D internally uses MipMapping for Bitmaps, as long as OpenGL is used to render. Whereas this measure typically improves image quality, MipMaps consume ~1/3 more memory and might bear side effects (interpolation between MipMap levels may produce artifacts). Therefore a MipMapEnabled flag has been added.

<div class="contents" id="bkmrk-see-also%3A-candera%3A%3Ab"><div class="contents"><div class="textblock"><dl class="see"><dt>**See also:**</dt><dd>Candera::Bitmap::SetMipMappingEnabled() and Candera::Bitmap::IsMipMappingEnabled().</dd></dl>---

</div></div></div>#### Camera2D Viewport Transformation functions moved

Viewport transformation functions have been moved from [Candera::Camera2D](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_camera2_d.html "A camera defines the view to the scene. At least one Camera2D has to be added to a 2D scene graph and...") to new class [Candera::Math2D](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_math2_d.html "The Math2D class for 2D transformation and helper functions."). Picking in 2D considers window offset.

<div class="contents" id="bkmrk--3"><div class="contents"><div class="textblock">---

</div></div></div>#### Reduced size of members

To reduce heap usage some elements in [Candera](http://dev.doc.cgistudio.at/APILINK/namespace_candera.html "[DataBinding_RefTypeSample]") 2D have been reduced in size:

<div class="contents" id="bkmrk-the-camera-sequence-"><div class="contents"><div class="textblock">- The camera sequence number from 32 to 16 bit, <dl class="see"><dt>**See also:**</dt><dd>[Candera::Camera2D::SetSequenceNumber(Int16 sequenceNumber)](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_camera2_d.html#a86f661bc6f4dd115e9e13a2f9efb0291)</dd></dl>
- The bitmap width and height from 32 to 16 bit, <dl class="see"><dt>**See also:**</dt><dd>[Candera::Bitmap](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_bitmap.html "A 2-dimensional bitmap that can be used as a texture, background or sprite. A bitmap pointing to a va...")</dd></dl>
- The child count of [Node2D](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_node2_d.html "The class Node2D is an abstract base class for all 2D scene graph nodes.") from 32 to 16 bit, <dl class="see"><dt>**See also:**</dt><dd>[Candera::Node2D::GetChildCount()](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_node2_d.html#aa3c00fa2c52103b48c400b13c1bd47ae)</dd></dl>

---

</div></div></div>#### DeviceObject2D listener.

[DeviceObject2D](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_device_object2_d.html "DeviceObject2D is the pure abstract base class for all objects which are able to upload or unload its...") now supports adding listeners that are notified before and after the object is uploaded and unloaded and before it is destroyied.

<div class="contents" id="bkmrk--4"><div class="contents"><div class="textblock">---

</div></div></div>#### Layout Rectangle

The Layout is no longer done based on bounding rectangle. Instead, [Node2D](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_node2_d.html "The class Node2D is an abstract base class for all 2D scene graph nodes.") has a new property, layout rectangle. Bouding rectangle is used for picking and dirty area management. Computed layout and bounding rectangle are based on affect layout and bounding rectangle, respectively.

<div class="contents" id="bkmrk-see-also%3A-node2d%3A%3Ase"><div class="contents"><div class="textblock"><dl class="see"><dt>**See also:**</dt><dd>Node2D::SetLayoutingRectangle() and [Candera::Effect2D::GetLayoutingRectangle()](http://dev.doc.cgistudio.at/APILINK/group___effects2_d.html#gafa31c551c09efb1c6ccfb9540e34e1ac). [Candera::Node2D](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_node2_d.html "The class Node2D is an abstract base class for all 2D scene graph nodes.") uses new [Layout](http://dev.doc.cgistudio.at/APILINK/group___layout.html "Layout features.") Rectangle instead of Bounding Rectangle for layout.</dd></dl></div></div></div>[TextBrush](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_text_brush.html "Output alpha only glyph data. A color may be specified, which is applied to the color channels...") and TextBrushCaches compute their Layout Rectangle based on Text Cursor Position. MaximumSize property of [TextBrush](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_text_brush.html "Output alpha only glyph data. A color may be specified, which is applied to the color channels...") has been replaced by [CacheArea](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_text_brush.html#a8bd385827d4edfd56dbfd8a0b4eb5fde). Bounding Box and Cache Size have been decoupled from Layout. To retrieve the height of a [TextBrush](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_text_brush.html "Output alpha only glyph data. A color may be specified, which is applied to the color channels...") with ConstantHeight use GetLayoutingRectangle, and for ActualHeight use GetBoundingRectangle.

<div class="contents" id="bkmrk--5"><div class="contents"><div class="textblock">---

</div></div></div>#### Renderer2DListener

A [Renderer2DListener](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_renderer2_d_listener.html "A Renderer2DListener defines hooks that are called before and after a Node is rendered.") allows to listen to Renderer-Events in Candera2D like in [Candera](http://dev.doc.cgistudio.at/APILINK/namespace_candera.html "[DataBinding_RefTypeSample]") 3D with [RendererListener](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_renderer_listener.html "A RendererListener defines hooks that are called before or after a Node is rendered.").

---

# Candera Base

#### Camera Groups

[CameraGroup](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_camera_group.html) is a container that groups cameras from multiple scenes. [CameraGroup](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_camera_group.html) has an arbitrary number of 2D and/or 3D cameras from different scenes and it is used by applications to easily access and change camera settings uniformly, e.g. in transitions.

<div class="contents" id="bkmrk-see-also%3A-texture-re"><div class="contents"><div class="textblock"><dl class="see"><dt>**See also:**</dt><dd><span style="color: rgb(230, 126, 35);">[Texture Render Targets](https://doc316en.candera.eu/link/539#bkmrk-page-title)</span></dd></dl>---

</div></div></div>#### Unified Cloning Interface

Base classes implement a virtual "Clone() const" method, which is overridden in all children. "Clone() const" builds a new instance of the class using the copy constructor. Copy constructors are protected for use only in derived copy constructors. Copying via assignment operator is prohibited, as it could cause problems, like orphaned nodes, memory leaks or dangling pointers. Assignment operators are thus private.

Cloning is shallow, with only shared pointers and constant character pointers being copied. All other coupling via pointers is broken for the clones.

For more complex cloning see <span style="color: rgb(230, 126, 35);">[Tree Cloner](https://doc316en.candera.eu/link/977#bkmrk-tree-cloner)</span> and <span style="color: rgb(230, 126, 35);">[Tree Cloning Strategies](https://doc316en.candera.eu/link/977#bkmrk-tree-cloning-strateg)</span>.

##### Tree Cloner

[TreeClonerBase](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_tree_cloner_base.html "This class clones scene subtrees.") is provided for cloning trees. The default clone strategy is to call the Clone interface on each node, and build the clone tree with the same node pattern as the original tree. For deeper cloning, [TreeClonerBase](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_tree_cloner_base.html "This class clones scene subtrees.") supports attaching a [TreeCloneStrategy](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_tree_clone_strategy.html "This is an interface for strategies used during cloning by TreeCloner."). This [TreeCloneStrategy](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_tree_clone_strategy.html "This is an interface for strategies used during cloning by TreeCloner.") is typically aware of different types of nodes, and delegates to other strategies.

##### Tree Cloning Strategies

The deep cloning strategies respect the following rules:

<div class="contents" id="bkmrk-all-shared-resources"><div class="contents"><div class="textblock">- all shared resources are deep cloned as long as they are not device objects; shared resources in the destination are shared in the same pattern as in the source tree.
- node references are rebuilt as long as source references are found as descendants of the source root; descendants are mapped to the destination tree.
- strategies are designed to support the decorator pattern.
- general strategies delegate to more specific strategies.

---

</div></div></div>#### Bitmap as SharedPointer

Instances of class [Bitmap](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_bitmap.html "A 2-dimensional bitmap that can be used as a texture, background or sprite. A bitmap pointing to a va...") can only be created by calling static method [Bitmap::Create()](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_bitmap.html#a53c1f585b24819ae815fbeb54820fe23) which returns a SharedPointer.

All interfaces have been changed to pass the shared pointer and the corresponding disposer function has been removed from the interfaces.

Old interface (example):

```
void <a class="code" href="http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_bitmap_image2_d.html#a08c2f33716d31ff5de24c14cdd0a7550">BitmapImage2D::SetBitmap</a>(Bitmap* bitmap, BitmapDisposerFn disposerFn);
```

New interface (example):

```
void <a class="code" href="http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_bitmap_image2_d.html#a08c2f33716d31ff5de24c14cdd0a7550">BitmapImage2D::SetBitmap</a>(Bitmap::SharedPointer bitmap);
```

<div class="contents" id="bkmrk-"><div class="contents"><div class="textblock"><div class="fragment">  
</div>---

</div></div></div>#### Changes in Bitmap Enumerations

Until now, [Bitmap](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_bitmap.html "A 2-dimensional bitmap that can be used as a texture, background or sprite. A bitmap pointing to a va...") class described the organization of the pixels with the enumerators Bitmap::Format and Bitmap::Type.

With introducing <span style="color: rgb(230, 126, 35);">[OpenGL ES 3.0 ETC2/EAC Texture Compression](https://doc316en.candera.eu/link/975#bkmrk-opengl-es-3.0-etc2%2Fe)</span>, it came up that the bitmap description was not suitable for describing compressed images (which have a format descriptor, but no type descriptor). Another problem was that the [Bitmap](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_bitmap.html "A 2-dimensional bitmap that can be used as a texture, background or sprite. A bitmap pointing to a va...") class allowed invalid combinations of Format and Type, e.g. Bitmap::Format::RgbFormat (3 components) and UnsignedShort4444Type (4 components).

In order to enable compressed bitmaps and to avoid invalid combinations the enumerator [Bitmap::PixelFormat](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_bitmap.html#a0028006b9fd5b6e630bc6aca572603cb) has been introduced, here Format and Type have been merged to valid enumeration items, while the ETC2/EAC items have been added.

For this reason Bitmap::Format and Bitmap::Type have become deprecated. Of course it is still possible to use custom formats.

<div class="contents" id="bkmrk--0"><div class="contents"><div class="textblock">---

</div></div></div>#### Shared Pointer Concept in Animation Framework

Objects of the following classes can only be created by calling static method [Create()](http://dev.doc.cgistudio.at/APILINK/group___c_o_u_r_i_e_r___v_i_s_u_a_l_i_z_a_t_i_o_n.html#ggaf0e93dc4242f607c3c8d13dafd036af9aaabfa5309af24986d3111a092449f857) which returns a SharedPointer:

<div class="contents" id="bkmrk-animationcontroller-"><div class="contents"><div class="textblock">- AnimationController
- AnimationTimeDispatcher
- AbstractEasingFunction (and all derived classes)
- InterpolationStrategy (and all derived classes)
- AnimationPropertySetter (and all derived classes)

</div></div></div>All interfaces have been changed to pass the shared pointer and the corresponding disposer function has been removed from the interfaces.

Old interface (example):

```
void AnimationPlayer::SetController(AnimationController* controller, DisposerFn disposerFn = 0);
```

New interface (example):

```
void AnimationPlayer::SetController(AnimationController::SharedPointer controller);
```

<div class="contents" id="bkmrk--1"><div class="contents"><div class="textblock"><div class="fragment">  
</div>---

</div></div></div>#### TreeTraverserBase for 'const' Traversing

Interface of template class [TreeTraverserBase](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_tree_traverser_base.html "Traverses a Node tree depth-first. What is done at each node is customized in the ProcessNode virtual...") has been changed to use only Traverse() and ProcessNode(). TraverseConst() and ProcessConstNode() have been removed. This ensures type safe const correct usage but enforce all const-traverser implementations to be changed. Const traversers have to be defined the following way:

```
class MyTraverser : public TreeTraverserBase<const Node> {
    protected:
        virtual TraverserAction ProcessNode(const Node& node)
        {
        ...
        }
};
```

<div class="contents" id="bkmrk--2"><div class="contents"><div class="textblock"><div class="fragment">  
</div>---

</div></div></div>#### Candera::Animation Namespace extension

Classes and Types located in `<cgi_studio_candera>/src/Candera/EngineBase/Animation` which formerly belonged to the *[Candera](http://dev.doc.cgistudio.at/APILINK/namespace_candera.html "[DataBinding_RefTypeSample]")* namespace were reassigned to the Candera::Animation namespace.

Affected classes/types:

<div class="contents" id="bkmrk-abstracteasingfuncti"><div class="contents"><div class="textblock">- [AbstractEasingFunction](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_abstract_easing_function.html)
- [AnimationBlendedProperty](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_animation_blended_property.html)
- [AnimationController](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_animation_controller.html)
- [AnimationGroupPlayer](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_animation_group_player.html)
- [AnimationKeyframeSequence](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_animation_keyframe_sequence.html)
- [AnimationPlayer](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_animation_player.html)
- [AnimationPlayerBase](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_animation_player_base.html)
- [AnimationPlayerListener](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_animation_player_listener.html)
- [AnimationPropertySetter](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_animation_property_setter.html)
- [AnimationTimeDispatcher](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_animation_time_dispatcher.html)
- WorldTimeType
- SequenceTimeType
- [BackEaseFunction](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_back_ease_function.html)
- [BezierInterpolationStrategy](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_bezier_interpolation_strategy.html)
- [BounceEaseFunction](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_bounce_ease_function.html)
- [EaseInterpolationStrategy](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_ease_interpolation_strategy.html)
- [ElasticEaseFunction](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_elastic_ease_function.html)
- [ExponentialEaseFunction](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_exponential_ease_function.html)
- [InterpolationStrategy](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_interpolation_strategy.html)
- [KeyframeSequence](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_keyframe_sequence.html)
- [LinearInterpolationStrategy](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_linear_interpolation_strategy.html)
- [PowerEaseFunction](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_power_ease_function.html)
- [SplineInterpolationStrategy](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_spline_interpolation_strategy.html)
- [StepInterpolationStrategy](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_animation_1_1_step_interpolation_strategy.html)

</div></div></div><dl class="note" id="bkmrk-moved-classes-and-ty"><dd><p class="callout info">Moved classes and types are still accessible via the *[Candera](http://dev.doc.cgistudio.at/APILINK/namespace_candera.html "[DataBinding_RefTypeSample]")* namespace in CGI-Studio 3.0.0 but these deprecated interfaces will be removed in the next release.</p>

</dd></dl><div class="contents" id="bkmrk--3"><div class="contents"><div class="textblock">---

</div></div></div>#### CanderaObject becomes DynamicPropertyHost

[CanderaObject](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_candera_object.html "Represents the base class for Candera objects related to 3D rendering. Every CanderaObject can have a...") inherits from DynamicPropertyHost. Objects previously inheriting from DynamicPropertyHost now inherit from [CanderaObject](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_candera_object.html "Represents the base class for Candera objects related to 3D rendering. Every CanderaObject can have a..."). [ApplicationData](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_application_data.html "This class supports to attach custom ApplicationData to any CanderaObject. This is possible by creati...") is deprecated. The DynamicPropertyHost allows to attach multiple application data objects.

---

# Candera System

#### Property Validation

A new macro CdaValidityTest allows the definition of a validation function for [Widget](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_widget.html "Abstract class for Candera Widgets."), [Effect2D](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_effect2_d.html "Base class for all 2D effects which can be added to a 2D RenderNode.") and Gdu properties. In case of failed validation the property will be highlighted in SceneComposer property list and an error message will be displayed.

---

# Candera Device

#### Automatic Context Resource Pools

Context resource pools are created automatically, and assigned automatically to Device objects. If all objects attached to a display share a context resource pool, the display is associated to the context resource pool. Otherwise, the display has a null context resource pool. The interface for replacing context resource pools on the display is deprecated. So is the interface for manually creating context resource pools.

<div class="contents" id="bkmrk-"><div class="contents"><div class="textblock">---

</div></div></div>#### Layout Rectangle of Effects

[Effect2D](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_effect2_d.html "Base class for all 2D effects which can be added to a 2D RenderNode.") has an interface to compute the layout rectangle. Layout rectangle is the same as bounding rectangle for non-text effects. For text effects the layout rectangle is given by CursorTextMeasureContext, and bounding rectangle is given by GlyphTextMeasureContext. ActualHight parameter of [TextBrush](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_text_brush.html "Output alpha only glyph data. A color may be specified, which is applied to the color channels...") has been removed. Text is now always constant aligned. Applications need to compensate for this parameter by moving the pivot of the node by the offset of the bounding rectangle.

<div class="contents" id="bkmrk--0"><div class="contents"><div class="textblock">---

</div></div></div>#### RenderTarget Auto Clearing

Added auto clear flag (RenderTarget::SetAutoClearEnabled and RenderTarget::IsAutoClearEnabled) to Candera::RenderTarget2D / Candera::RenderTarget3D. This flag, unlike the auto swap, does not alter the clear setting of the Camera/Camera2D, but assures that the RenderTarget is cleared automatically before the first camera renders.

Further changes in detail:

<div class="contents" id="bkmrk-candera%3A%3Acamera2dlis"><div class="contents"><div class="textblock">- [Candera::Camera2DListener](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_camera2_d_listener.html "A Camera2DListener defines hooks that are called before or after a Camera2D is rendered. In order to register a Camera2DListener to a Camera2D simply derive from Camera2DListener and override pure virtual functions with custom code.") has been enhanced by new methods [Candera::Camera2DListener::OnRenderTargetChanged()](http://dev.doc.cgistudio.at/APILINK/group___core2_d.html#gaf6590ca54d3067f7e6061a653a0f21f2) and [Candera::Camera2DListener::OnCameraRenderStrategyChanged()](http://dev.doc.cgistudio.at/APILINK/group___core2_d.html#ga7fd7e7e1813429203692a747434ba7a1).
- [Candera::CameraListener](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_camera_listener.html "A CameraListener defines hooks that are called before or after a Camera is rendered. In order to register a CameraListener to a Camera simply derive from CameraListener and override pure virtual functions with custom code.") has been enhanced by new methods [Candera::CameraListener::OnRenderTargetChanged()](http://dev.doc.cgistudio.at/APILINK/group___core3_d.html#ga1aaf10414b78117d5b911de03c83585b) and [Candera::CameraListener::OnCameraRenderStrategyChanged()](http://dev.doc.cgistudio.at/APILINK/group___core3_d.html#gaaaaea22d60af3f1fcf72d9f121ae9304).
- [ClearMode](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_clear_mode.html "Describes how a viewport is cleared. The color buffer may be cleared using a given color...") is always enabled for [Candera::Camera](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_camera.html "A Camera provides Modelview and Projection matrices. Camera is a Transformable.* The eye point is set...").
- Candera::SharedClearMode and Candera::SharedClearMode2D have been introduced.

<dl class="see"><dt>**See also:**</dt><dd><span style="color: rgb(230, 126, 35);">[Render Buffer Swapping and Clearing](https://doc316en.candera.eu/link/536#bkmrk-render-buffer-swappi)</span></dd></dl>---

</div></div></div>#### Warping Orientation

The orientation of the display to use during warping can be set on the Display.

<div class="contents" id="bkmrk-see-also%3A-display%3A%3As"><div class="contents"><div class="textblock"><dl class="see"><dt>**See also:**</dt><dd>Display::SetWarpOrientation</dd></dl>---

</div></div></div>#### Warping Image Bounds

In previous versions the warped image was not restricted to bitmap image bounds. The function Display::SetWarpImageBounds() has to be invoked before function Display::SetWarpMatrix() is called.

<div class="contents" id="bkmrk--1"><div class="contents"><div class="textblock">---

</div></div></div>#### GraphicDeviceUnit Name

A name may be attached to a Graphic Device Unit.

<div class="contents" id="bkmrk-see-also%3A-graphicdev"><div class="textblock"><dl class="see"><dt>**See also:**</dt><dd>GraphicDeviceUnit::SetName()</dd></dl></div></div>---

# Candera AssetLoader

#### AssetDescriptor

[AssetContext](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_asset_context.html "Encapsulates main list of objects' names that define an asset context. The scene context is provided ...") class has become deprecated and its functionality is taken by the new [AssetDescriptor](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_asset_descriptor.html "Descriptor of the loaded asset.") class.

**Old Interface:**

```
<a class="code" href="http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_default_asset_provider.html" title="Implements objects handling mechanisms. It implements the interface AssetProvider and holds an asset ...">Candera::DefaultAssetProvider</a>* provider = m_assetProvider;
<a class="code" href="http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_asset_context.html" title="Encapsulates main list of objects' names that define an asset context. The scene context is provided ...">Candera::AssetContext</a>* assetContext = provider->GetAssetContext();
if (assetContext != 0) {
    for (Int i = 0; i < assetContext->GetAnimationCount(); i++) {
        const Candera::Char* animation = assetContext->GetAnimationName(i);
        //Use animation name
    }
}
```

**New Interface in 3.0.0:**

```
<a class="code" href="http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_default_asset_provider.html" title="Implements objects handling mechanisms. It implements the interface AssetProvider and holds an asset ...">Candera::DefaultAssetProvider</a>* provider = m_assetProvider;
for (<a class="code" href="http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_forward_iterator.html" title="Forward iterator wrapper.">Candera::AssetDescriptor::AssetIdIterator</a> animationIdIterator =  provider-><a class="code" href="http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_default_asset_provider.html#ac6785af7778a6b1d4b15b10c2379b9c4" title="Retrieve the AssetDescriptor object associated to this DefaultAssetProvider instance.">GetAssetDescriptor</a>().<a class="code" href="http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_asset_descriptor.html#a0d22d16a59544b51649d3a67330f5414" title="Get an iterator over object AssetIds.">GetAssetIdIterator</a>(<a class="code" href="http://dev.doc.cgistudio.at/APILINK/group___asset_loader_base.html#gga55cedfecc49c10372c78ba9f8e779cc2a22048a4d98d870ee3527a929b714f283" title="Library for AnimationPlayer objects.">AnimationLib</a>); animationIdIterator.IsValid(); ++animationIdIterator) {
    //use animation AssetId: *animationIdIterator
    //or use animation name: provider->GetNameById(AnimationLib, *animationIdIterator, 0)
}
```

<div class="contents" id="bkmrk-"><div class="contents"><div class="textblock"><div class="fragment">  
</div>---

</div></div></div>#### AssetId

AssetId is a unique binary identifier that should be used to retrieve objects from the asset though the [AssetProvider](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_asset_provider.html "Abstract class providing methods for retrieving objects.") interface. AssetIds are supposed to replace the identification of objects by their name/path.

AssetIds should not be hard coded, but referenced through <span style="color: rgb(230, 126, 35);">[Symbolic Names](https://doc316en.candera.eu/link/36#bkmrk-symbolic-names)</span>. For more information see <span style="color: rgb(230, 126, 35);">[Accessing Items via AssetId](https://doc316en.candera.eu/link/418#bkmrk-using-asset-ids)</span>. AssetIds can also be retrieved via the [AssetDescriptor](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_asset_descriptor.html "Descriptor of the loaded asset.") class iterators as shown in the [AssetDescriptor](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_asset_descriptor.html "Descriptor of the loaded asset.") example above.

**Old Interface:**

```
<a class="code" href="http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_default_asset_provider.html" title="Implements objects handling mechanisms. It implements the interface AssetProvider and holds an asset ...">Candera::DefaultAssetProvider</a>* provider = m_assetProvider;
Bitmap::SharedPointer bitmap = provider->GetBitmap(bitmapName);            
```

**New Interface in 3.0.0:**

```
<a class="code" href="http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_default_asset_provider.html" title="Implements objects handling mechanisms. It implements the interface AssetProvider and holds an asset ...">Candera::DefaultAssetProvider</a>* provider = m_assetProvider;
 //copy AssetId directly from SceneComposer, but better use specified symbolic name or retrieve it via AssetIdIterator
AssetId assetId = CDA_LIBRARY_ASSETID(0x0, 0x100);
Bitmap::SharedPointer bitmap = provider-><a class="code" href="http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_asset_provider.html#a85e81d0b45b8340905ac5a98920389d5">GetBitmapById</a>(assetId);
```

---

# Text Engine

## <a class="anchor" id="bkmrk--1"></a>Text Alignment

Enumeration type TextAlignment has been replaced by new enum types HorizontalAlignment and VerticalAlignment.

<div class="contents" id="bkmrk-horizontalalignment%3A"><div class="contents"><div class="textblock">- HorizontalAlignment: HLeft, HCenter, HRight, HStretch
- VerticalAlignment: VTop, VCenter, VBottom, VStretch

---

</div></div></div>#### Integrated FreeType 2.5

The following new options are available for configuration from CMake:

<div class="contents" id="bkmrk-ft_config_option_no_"><div class="contents"><div class="textblock">- FT\_CONFIG\_OPTION\_NO\_ASSEMBLER
- FT\_CONFIG\_OPTION\_SYSTEM\_ZLIB
- FT\_CONFIG\_OPTION\_DISABLE\_STREAM\_SUPPORT
- FT\_CONFIG\_OPTION\_USE\_PNG
- FT\_CONFIG\_OPTION\_PIC
- TT\_CONFIG\_OPTION\_SUBPIXEL\_HINTING
- TT\_CONFIG\_OPTION\_UNPATENTED\_HINTING All these options are disabled by default.

---

</div></div></div>#### RgbColor deprecated

The class Candera::TextRendering::RgbColor has been deprecated. [Candera::Color](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_color.html "Represents a color by its red-, green-, blue- and alpha-value. Provides color arithmetic functions an...") shall be used instead.

<div class="contents" id="bkmrk-"><div class="contents"><div class="textblock">---

</div></div></div>#### Text Measure Context

TextRenderer::GetBoundingRectangle is deprecated. Instead TextMeasureContext is available to provide similar functionality, in a more configurable manner. GlyphTextMeasureContext is a class provided to emulate the behavior of GetBoundingRectangle for ActualHeight alignment parameter. The rectangle returned by this class may be offset from the text position. To have the same alignment as before when rendering the text, the inverse of this offset needs to be applied. CursorTextMeasureContext is a class provided to emulate the behavior of GetBoundingRectangle for ConstantHeight alignment parameter. The rectangle returned by this class does not usually have an offset and it contains the final advancement of the cursor. From the two rectangles, all values returned by GetBoundingRectangle may be computed.

---

# Candera V3.0.0 Migration Guide

Following a guide how to uprade application code from V2.10.0 to V3.0.0 [Candera](http://dev.doc.cgistudio.at/APILINK/namespace_candera.html "[DataBinding_RefTypeSample]") Interfaces.

<div class="contents" id="bkmrk-migration-guide-for-"><div class="contents"><div class="textblock">- <span style="color: rgb(230, 126, 35);">[Migration Guide for Backward Compatible Interface Changes](https://doc316en.candera.eu/link/982#bkmrk-migration-guide-for--0)</span>
- <span style="color: rgb(230, 126, 35);">[Migration Guide for Breaking Interface Changes](https://doc316en.candera.eu/link/982#bkmrk-migration-guide-for--1)</span>

</div></div></div>Besides interface changes, also the build system has been changed significantly in V3.0.0:

<div class="contents" id="bkmrk-candera%2Ffeatstd-buil"><div class="contents"><div class="textblock">- <span style="color: rgb(230, 126, 35);">[Candera/FeatStd Build System Changes](https://doc316en.candera.eu/link/982#bkmrk-candera%2Ffeatstd-buil-0)</span>

</div></div></div><span style="color: rgb(230, 126, 35);">[Regular Expression Search and Replace Patterns](https://doc316en.candera.eu/link/982#bkmrk-regular-expression-s-0)</span>

---

#### **Migration Guide for Backward Compatible Interface Changes**

This page provides an overview about interface changes between [Candera](http://dev.doc.cgistudio.at/APILINK/namespace_candera.html "[DataBinding_RefTypeSample]") V2.10.0 and [Candera](http://dev.doc.cgistudio.at/APILINK/namespace_candera.html "[DataBinding_RefTypeSample]") V3.0.0, which are backward compatible.

##### Interface Changes with Deprecations

These changes do not require immediate adaptation of existing code. Although deprecated interfaces are still accessible, consider switching to the new interfaces as the deprecated interfaces will be removed with the next release.

<div class="contents" id="bkmrk-description-candera-"><div class="contents"><div class="textblock"><table border="1" class="doxtable" style="border-collapse: collapse; width: 800px;"><tbody><tr><th style="width: 18.6449%;">**Description**</th><th style="width: 33.8891%;">**[Candera](http://dev.doc.cgistudio.at/APILINK/namespace_candera.html "[DataBinding_RefTypeSample]") V2.10.0**</th><th style="width: 47.466%;">**[Candera](http://dev.doc.cgistudio.at/APILINK/namespace_candera.html "[DataBinding_RefTypeSample]") V3.0.0**</th></tr><tr><td style="width: 18.6449%;">TextAlignment</td><td style="width: 33.8891%;">TextAlignment ```
Leading
Middle
Trailing
```

</td><td style="width: 47.466%;">HorizontalAlignment ```
HLeft
HCenter
HRight
```

VerticalAlignment ```
VTop
VCenter
VBottom
```

</td></tr><tr><td style="width: 18.6449%;">Effect shared pointer types</td><td style="width: 33.8891%;">\[Effect\]Ptr

e.g.

```
BitmapBrushPtr
```

</td><td style="width: 47.466%;">\[Effect\]SharedPointer

e.g.

```
BitmapBrush::SharedPointer
```

</td></tr><tr><td style="width: 18.6449%;">const TreeTraverser</td><td style="width: 33.8891%;">```
class MyTraverser : public TreeTraverserBase<Node> {
    protected:
        virtual TraverserAction ProcessConstNode(const Node& node)
        {
        ...
        }
};
```

</td><td style="width: 47.466%;">```
class MyTraverser : public TreeTraverserBase<const Node> {
    protected:
        virtual TraverserAction ProcessNode(const Node& node)
        {
        ...
        }
};
```

</td></tr><tr><td style="width: 18.6449%;">[AssetDescriptor](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_asset_descriptor.html "Descriptor of the loaded asset.")</td><td style="width: 33.8891%;">```
<a class="code" href="http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_default_asset_provider.html" title="Implements objects handling mechanisms. It implements the interface AssetProvider and holds an asset ...">Candera::DefaultAssetProvider</a>* provider = m_assetProvider;
<a class="code" href="http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_asset_context.html" title="Encapsulates main list of objects' names that define an asset context. The scene context is provided ...">Candera::AssetContext</a>* assetContext = provider->GetAssetContext();
if (assetContext != 0) {
    for (Int i = 0; i < assetContext->GetAnimationCount(); i++) {
        const Candera::Char* animation = assetContext->GetAnimationName(i);
        //Use animation name
    }
}
```

</td><td style="width: 47.466%;">```
<a class="code" href="http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_default_asset_provider.html" title="Implements objects handling mechanisms. It implements the interface AssetProvider and holds an asset ...">Candera::DefaultAssetProvider</a>* provider = m_assetProvider;
for (<a class="code" href="http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_forward_iterator.html" title="Forward iterator wrapper.">Candera::AssetDescriptor::AssetIdIterator</a> animationIdIterator =  
        provider-><a class="code" href="http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_default_asset_provider.html#ac6785af7778a6b1d4b15b10c2379b9c4" title="Retrieve the AssetDescriptor object associated to this DefaultAssetProvider instance.">GetAssetDescriptor</a>().<a class="code" href="http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_asset_descriptor.html#a0d22d16a59544b51649d3a67330f5414" title="Get an iterator over object AssetIds.">GetAssetIdIterator</a>(<a class="code" href="http://dev.doc.cgistudio.at/APILINK/group___asset_loader_base.html#gga55cedfecc49c10372c78ba9f8e779cc2a22048a4d98d870ee3527a929b714f283" title="Library for AnimationPlayer objects.">AnimationLib</a>);
        animationIdIterator.IsValid(); ++animationIdIterator) {
    //use animation AssetId: *animationIdIterator
    //or use animation name: provider->GetNameById(AnimationLib, *animationIdIterator, 0)}
```

</td></tr><tr><td style="width: 18.6449%;">AssetId</td><td style="width: 33.8891%;">```
Bitmap::SharedPointer bitmap= Base::GetAssetProvider()->GetBitmap("MyModule#Imports#Models#myBmp");
```

</td><td style="width: 47.466%;">Assign a Symbol Name "myBmp" to the [Bitmap](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_bitmap.html "A 2-dimensional bitmap that can be used as a texture, background or sprite. A bitmap pointing to a va...") Asset and export headers in SceneComposer as "MyAssets.h". ```
#include "MyAssets.h"
Bitmap::SharedPointer bitmap = Base::GetAssetProvider()->GetBitmapById(CgiAssetNames::myBmp);
```

</td></tr><tr><td style="width: 18.6449%;">Animation namespace</td><td style="width: 33.8891%;">```
Candera::InterpolationStrategy* interpolationStrategy =
       <a class="code" href="http://dev.doc.cgistudio.at/APILINK/group___c_o_u_r_i_e_r___v_i_s_u_a_l_i_z_a_t_i_o_n.html#ggaf0e93dc4242f607c3c8d13dafd036af9aaabfa5309af24986d3111a092449f857">Candera::LinearInterpolationStrategy::Create</a>();
```

</td><td style="width: 47.466%;">```
Animation::InterpolationStrategy::SharedPointer interpolationStrategy =
       <a class="code" href="http://dev.doc.cgistudio.at/APILINK/group___c_o_u_r_i_e_r___v_i_s_u_a_l_i_z_a_t_i_o_n.html#ggaf0e93dc4242f607c3c8d13dafd036af9aaabfa5309af24986d3111a092449f857">Animation::LinearInterpolationStrategy::Create</a>();
```

</td></tr><tr><td style="width: 18.6449%;">New namespace CgiWidgetLibrary</td><td style="width: 33.8891%;">no namespace required</td><td style="width: 47.466%;">```
using namespace CgiWidgetLibrary;
```

</td></tr><tr><td style="width: 18.6449%;">3D Shallow cloning with flat traversing</td><td style="width: 33.8891%;">```
Node* clone = node->Clone();
```

or ```
Node* clone = node->Clone(<a class="code" href="http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_node.html#aa40eb44bf6f1b812ebd941db38999d39ad30f69f69d7d2693d59eb071310e3dc1" title="Only this Node.">Node::Flat</a>);
```

</td><td style="width: 47.466%;">```
Node* clone = node->Clone();
```

</td></tr><tr><td style="width: 18.6449%;">3D Shallow cloning with deep traversing</td><td style="width: 33.8891%;">```
Node* clone = node->Clone(<a class="code" href="http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_node.html#aa40eb44bf6f1b812ebd941db38999d39a79176f5f30aad3d343ab4d0e4be83f5c" title="This Node and all its descendants.">Node::Deep</a>);
```

</td><td style="width: 47.466%;">```
Node* clone = <a class="code" href="http://dev.doc.cgistudio.at/APILINK/group___cloning3_d.html#gaf1781cbf2a3e09d5d24d63bdf3685145" title="Specialization of TreeClonerBase for use with Node.">TreeCloner</a>().CreateClone(*node);
```

</td></tr><tr><td style="width: 18.6449%;">2D Shallow cloning with flat traversing</td><td style="width: 33.8891%;">```
Node2D* clone = node->Clone();
```

or ```
Node2D* clone = node->Clone(<a class="code" href="http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_node2_d.html#a6df6b7520326b479dfddd918597539dfaa660f3b1c8b3074081822d2922617cab" title="Only this node.">Node2D::Flat</a>);
```

or ```
Node2D* clone = node->Clone(<a class="code" href="http://dev.doc.cgistudio.at/APILINK/namespace_candera.html#a22134b81a6f0af80cae7f7bb3d226fe8ad1dadd4d2a4dfb3f113fd19d0cfb158d" title="No child nodes are processed.">TraverseFlat</a>, <a class="code" href="http://dev.doc.cgistudio.at/APILINK/namespace_candera.html#a080306bf58aecbd8693110d7ae696ed8a3c2d8500f82fa0f9c1ca1c7a031ddb10" title="Only node properties are copied but attached content like effects are still shared.">CloneShallow</a>);
```

</td><td style="width: 47.466%;">```
Node2D* clone = node->Clone();
```

</td></tr><tr><td style="width: 18.6449%;">[Bitmap](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_bitmap.html "A 2-dimensional bitmap that can be used as a texture, background or sprite. A bitmap pointing to a va...") type/format changes</td><td style="width: 33.8891%;">```
UInt8* pixels = GetBitmapDataFromArbitrarySource(); //exemplary
Bitmap* bitmap = &Bitmap(128, 128, 
    <a class="code" href="http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_bitmap.html#a573690d2335df7df1e42030121237308a24b6af53eb0c1d4bca837b9245078c79" title="Rgba.">Bitmap::RgbaFormat</a>, Bitmap::UnsignedByteType,
    Bitmap::PackAlignment1, pixels, 0,
    true, true);
```

</td><td style="width: 47.466%;">```
UInt8* pixels = GetBitmapDataFromArbitrarySource(); //exemplary
Bitmap* bitmap = &Bitmap(128, 128, 
    <a class="code" href="http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_bitmap.html#a0028006b9fd5b6e630bc6aca572603cbaaac8f7acd8e25a68317ee29db03960f8" title="32 bit RGBA">Bitmap::RgbaUnsignedBytePixelFormat</a>,
    Bitmap::PackAlignment1, pixels, 0,0,
    true, true);
```

</td></tr><tr><td style="width: 18.6449%;">GetBoudingRectangle with ExcludeFinalAdvance, ActualTransversalSize</td><td style="width: 33.8891%;">```
bound = textRenderer.GetBoudingRectangle(layoutingOptions, shapingOptions, textProperties,
                        MeasuringOptions(ExcludeFinalAdvance, ActualTransversalSize));
```

</td><td style="width: 47.466%;">```
GlyphTextMeasureContext context;
textRenderer.Render(context, layoutingOptions, shapingOptions, textProperties);
bound = context.GetTextRectangle();
```

</td></tr><tr><td style="width: 18.6449%;">GetBoudingRectangle with IncludeFinalAdvance, ActualTransversalSize</td><td style="width: 33.8891%;">```
bound = textRenderer.GetBoudingRectangle(layoutingOptions, shapingOptions, textProperties,
                        MeasuringOptions(IncludeFinalAdvance, ActualTransversalSize));
```

</td><td style="width: 47.466%;">```
CursorTextMeasureContext cursorContext;
GlyphTextMeasureContext glyphContext;
glyphContext.SetNextContext(&cursorContext);
textRenderer.Render(glyphContext, layoutingOptions, shapingOptions, textProperties);
glyphBound = glyphContext.GetTextRectangle();
cursorBound = cursorContext.GetTextRectangle();
bound = Rectangle(
    glyphBound.GetLeft(),
    glyphBound.GetTop(),
    <a class="code" href="http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_math.html#a9410892f373576c2925671789e91d2c0">Math::Maximum</a>(
        cursorBound.GetWidth() - glyphBound.GetLeft(),
        glyphBound.GetWidth()),
    glyphBound.GetHeight());
```

</td></tr><tr><td style="width: 18.6449%;">GetBoudingRectangle with ExcludeFinalAdvance, ContantTransversalSize</td><td style="width: 33.8891%;">```
bound = textRenderer.GetBoudingRectangle(layoutingOptions, shapingOptions, textProperties, 
                        MeasuringOptions(IncludeFinalAdvance, ContantTransversalSize));
```

</td><td style="width: 47.466%;">```
CursorTextMeasureContext cursorContext;
GlyphTextMeasureContext glyphContext;
glyphContext.SetNextContext(&cursorContext);
textRenderer.Render(glyphContext, layoutingOptions, shapingOptions, textProperties);
glyphBound = glyphContext.GetTextRectangle();
cursorBound = cursorContext.GetTextRectangle();
bound = Rectangle(
    glyphBound.GetLeft(),
    cursorBound.GetTop(),
    glyphBound.GetWidth()),
    cursorBound.GetHeight());
```

</td></tr><tr><td style="width: 18.6449%;">GetBoudingRectangle with IncludeFinalAdvance, ContantTransversalSize</td><td style="width: 33.8891%;">```
bound = textRenderer.GetBoudingRectangle(layoutingOptions, shapingOptions, textProperties, 
                        MeasuringOptions(IncludeFinalAdvance, ContantTransversalSize));
```

</td><td style="width: 47.466%;">```
CursorTextMeasureContext cursorContext;
GlyphTextMeasureContext glyphContext;
glyphContext.SetNextContext(&cursorContext);
textRenderer.Render(glyphContext, layoutingOptions, shapingOptions, textProperties);
glyphBound = glyphContext.GetTextRectangle();
cursorBound = cursorContext.GetTextRectangle();
bound = Rectangle(
    glyphBound.GetLeft(),
    cursorBound.GetTop(),
    <a class="code" href="http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_math.html#a9410892f373576c2925671789e91d2c0">Math::Maximum</a>(
        cursorBound.GetWidth() - glyphBound.GetLeft(),
        glyphBound.GetWidth()),
    cursorBound.GetHeight());
```

</td></tr></tbody></table>

</div></div></div>##### Extended Interfaces

These changes extend existing interfaces by adding new functionality and do not require any adaptation of existing code. However, custom implementations may be replaced by these library functions.

<div class="contents" id="bkmrk-description-candera--0"><div class="contents"><div class="textblock"><table border="1" class="doxtable" style="border-collapse: collapse; width: 800px;"><tbody><tr><th>**Description**</th><th>**[Candera](http://dev.doc.cgistudio.at/APILINK/namespace_candera.html "[DataBinding_RefTypeSample]") V2.10.0**</th><th>**[Candera](http://dev.doc.cgistudio.at/APILINK/namespace_candera.html "[DataBinding_RefTypeSample]") V3.0.0**

</th></tr><tr><td>3D Deep cloning with flat traversing</td><td>No previous support.</td><td>```
Node* clone = node->Clone();
DeepNodeCloneStrategy cloneStrategy;
DeepNodeCloneStrategy::Pair pair(node, clone);
cloneStrategy.Execute(pair, pair);
```

</td></tr><tr><td>3D Deep cloning with deep traversing</td><td>No previous support.</td><td>```
Node* clone = DeepTreeCloner().CreateClone(*node);
```

or ```
<a class="code" href="http://dev.doc.cgistudio.at/APILINK/group___cloning3_d.html#gaf1781cbf2a3e09d5d24d63bdf3685145" title="Specialization of TreeClonerBase for use with Node.">TreeCloner</a> treeCloner;
DeepNodeCloneStrategy cloneStrategy;
treeCloner.SetNodeCloneStrategy(&cloneStrategy);
Node* clone = treeCloner.CreateClone(*node);
```

</td></tr></tbody></table>

</div></div></div>##### Header File Relocations

In CGI Studio 2.x, some functionality had been moved from [Candera](http://dev.doc.cgistudio.at/APILINK/namespace_candera.html "[DataBinding_RefTypeSample]") into FeatStd, keeping redirection macros and header files for backward compatibility. In CGI Studio 3.0.0, redirection code has been removed to a large extent. Following is an overview about macros and header files that will be removed.

##### Candera/System/Diagnostics Cleanup

<p class="callout warning">To ensure backward compatibility, macros and files formerly located in Candera/System/Diagnostics can still be accessed in CGI-Studio V3.0.0 . Please be aware that this access will be removed with the next release.</p>

Header files from `Candera/Systems/Diagnostics` which only represented redirections to files located in FeatStd should no longer be used.  
Please use respective files in `FeatStd/Diagnostics` and the namespace `Featstd::Diagnostics` instead.

<div class="contents" id="bkmrk-deprecated-use-inste"><div class="contents"><div class="textblock"><table border="1" class="doxtable" style="border-collapse: collapse; width: 800px;"><tbody><tr><th>**Deprecated**</th><th>**Use instead**</th></tr><tr><td>Candera/System/Diagnostics/Appender.h</td><td>FeatStd/Diagnostics/Appender.h</td></tr><tr><td>Candera/System/Diagnostics/CharBuffer.h</td><td>FeatStd/Diagnostics/CharBuffer.h</td></tr><tr><td>Candera/System/Diagnostics/ConsoleAppender.h</td><td>FeatStd/Diagnostics/ConsoleAppender.h</td></tr><tr><td>Candera/System/Diagnostics/Debug.h</td><td>FeatStd/Diagnostics/Debug.h</td></tr><tr><td>Candera/System/Diagnostics/DebuggerOutSystemMemoryStatistic.h</td><td>FeatStd/Diagnostics/DebuggerOutSystemMemoryStatistic.h</td></tr><tr><td>Candera/System/Diagnostics/ErrorHandling.h</td><td>FeatStd/Diagnostics/ErrorHandling.h</td></tr><tr><td>Candera/System/Diagnostics/FileAppender.h</td><td>FeatStd/Diagnostics/FileAppender.h</td></tr><tr><td>Candera/System/Diagnostics/LocationInfo.h</td><td>FeatStd/Diagnostics/LocationInfo.h</td></tr><tr><td>Candera/System/Diagnostics/LogControl.h</td><td>FeatStd/Diagnostics/Log.h</td></tr><tr><td>Candera/System/Diagnostics/LogEvent.h</td><td>FeatStd/Diagnostics/LogEvent.h</td></tr><tr><td>Candera/System/Diagnostics/Logger.h</td><td>FeatStd/Diagnostics/Logger.h</td></tr><tr><td>Candera/System/Diagnostics/LoggerTyped.h</td><td>FeatStd/Diagnostics/LoggerTyped.h</td></tr><tr><td>Candera/System/Diagnostics/LogLevel.h</td><td>FeatStd/Diagnostics/LogLevel.h</td></tr><tr><td>Candera/System/Diagnostics/Measurable.h</td><td>FeatStd/Diagnostics/Measurable.h</td></tr><tr><td>Candera/System/Diagnostics/SystemMemoryStatistic.h</td><td>FeatStd/Diagnostics/SystemMemoryStatistic.h</td></tr></tbody></table>

</div></div></div>Similarly, all macros contained in files located in `Candera/System/Diagnostics` which only served as redirection to macros located in FeatStd should not be used any more.

<div class="contents" id="bkmrk-deprecated-use-inste-0"><div class="textblock"><table border="1" class="doxtable" style="border-collapse: collapse; width: 800px;"><tbody><tr><th>**Deprecated**</th><th>**Use instead**</th></tr><tr><td>CANDERA\_DEBUG\_BREAK</td><td>FEATSTD\_DEBUG\_BREAK</td></tr><tr><td>CANDERA\_DEBUG\_ASSERT</td><td>FEATSTD\_DEBUG\_ASSERT</td></tr><tr><td>CANDERA\_DEBUG\_FAIL</td><td>FEATSTD\_DEBUG\_FAIL</td></tr><tr><td>CANDERA\_DEBUG\_REENTRANCE\_GUARD</td><td>FEATSTD\_DEBUG\_REENTRANCE\_GUARD</td></tr><tr><td>CANDERA\_COMPILETIME\_ASSERT</td><td>FEATSTD\_COMPILETIME\_ASSERT</td></tr><tr><td>CANDERA\_UNUSED\_PARAMETER</td><td>FEATSTD\_UNUSED</td></tr><tr><td>CANDERA\_PANIC</td><td>FEATSTD\_PANIC</td></tr><tr><td>CANDERA\_PANIC\_IF</td><td>FEATSTD\_PANIC\_IF</td></tr><tr><td>CANDERA\_LOG\_FUNC</td><td>FEATSTD\_LOG\_FUNC</td></tr><tr><td>CANDERA\_LOG\_LOCATION</td><td>FEATSTD\_LOG\_LOCATION</td></tr><tr><td>CANDERA\_LOG\_SET\_REALM</td><td>FEATSTD\_LOG\_SET\_REALM</td></tr><tr><td>CANDERA\_LOG\_DEBUG</td><td>FEATSTD\_LOG\_DEBUG</td></tr><tr><td>CANDERA\_LOG\_INFO</td><td>FEATSTD\_LOG\_INFO</td></tr><tr><td>CANDERA\_LOG\_WARN</td><td>FEATSTD\_LOG\_WARN</td></tr><tr><td>CANDERA\_LOG\_ERROR</td><td>FEATSTD\_LOG\_ERROR</td></tr><tr><td>CANDERA\_LOG\_FATAL</td><td>FEATSTD\_LOG\_FATAL</td></tr><tr><td>CANDERA\_LOG\_REALM</td><td>FEATSTD\_LOG\_REALM</td></tr><tr><td>CANDERA\_LOG</td><td>FEATSTD\_LOG</td></tr></tbody></table>

</div></div>---

#### **Migration Guide for Breaking Interface Changes**

These changes are incompatible with earlier versions of [Candera](http://dev.doc.cgistudio.at/APILINK/namespace_candera.html "[DataBinding_RefTypeSample]") and will require immediate adaptation of existing code.

##### Interface Changes without Deprecations

<div class="header" id="bkmrk-description-candera--1"><div class="header"><div class="headertitle"><div class="title"><div class="contents"><div class="contents"><div class="textblock"><table border="1" class="doxtable" style="border-collapse: collapse; width: 800px;"><tbody><tr><th style="width: 16.9345%;">**Description**</th><th style="width: 38.4373%;">**[Candera](http://dev.doc.cgistudio.at/APILINK/namespace_candera.html "[DataBinding_RefTypeSample]") V2.10.0**</th><th style="width: 44.6282%;">**[Candera](http://dev.doc.cgistudio.at/APILINK/namespace_candera.html "[DataBinding_RefTypeSample]") V3.0.0**</th></tr><tr><td style="width: 16.9345%;">Shared pointers in animation framework</td><td style="width: 38.4373%;">```
AnimationController* animController = <a class="code" href="http://dev.doc.cgistudio.at/APILINK/group___c_o_u_r_i_e_r___v_i_s_u_a_l_i_z_a_t_i_o_n.html#ggaf0e93dc4242f607c3c8d13dafd036af9aaabfa5309af24986d3111a092449f857">AnimationController::Create</a>();
AnimationTimeDispatcher* animDispatcher = <a class="code" href="http://dev.doc.cgistudio.at/APILINK/group___c_o_u_r_i_e_r___v_i_s_u_a_l_i_z_a_t_i_o_n.html#ggaf0e93dc4242f607c3c8d13dafd036af9aaabfa5309af24986d3111a092449f857">AnimationTimeDispatcher::Create</a>();
InterpolationStrategy* interpolationStrategy = <a class="code" href="http://dev.doc.cgistudio.at/APILINK/group___c_o_u_r_i_e_r___v_i_s_u_a_l_i_z_a_t_i_o_n.html#ggaf0e93dc4242f607c3c8d13dafd036af9aaabfa5309af24986d3111a092449f857">SplineInterpolationStrategy::Create</a>();
BackEaseFunction backEase;
```

</td><td style="width: 44.6282%;">```
AnimationController::SharedPointer animController = <a class="code" href="http://dev.doc.cgistudio.at/APILINK/group___c_o_u_r_i_e_r___v_i_s_u_a_l_i_z_a_t_i_o_n.html#ggaf0e93dc4242f607c3c8d13dafd036af9aaabfa5309af24986d3111a092449f857">AnimationController::Create</a>();
AnimationTimeDispatcher::SharedPointer animDispatcher = <a class="code" href="http://dev.doc.cgistudio.at/APILINK/group___c_o_u_r_i_e_r___v_i_s_u_a_l_i_z_a_t_i_o_n.html#ggaf0e93dc4242f607c3c8d13dafd036af9aaabfa5309af24986d3111a092449f857">AnimationTimeDispatcher::Create</a>();
InterpolationStrategy::SharedPointer interpolationStrategy = <a class="code" href="http://dev.doc.cgistudio.at/APILINK/group___c_o_u_r_i_e_r___v_i_s_u_a_l_i_z_a_t_i_o_n.html#ggaf0e93dc4242f607c3c8d13dafd036af9aaabfa5309af24986d3111a092449f857">SplineInterpolationStrategy::Create</a>();
BackEaseFunction::SharedPointer backEase = <a class="code" href="http://dev.doc.cgistudio.at/APILINK/group___c_o_u_r_i_e_r___v_i_s_u_a_l_i_z_a_t_i_o_n.html#ggaf0e93dc4242f607c3c8d13dafd036af9aaabfa5309af24986d3111a092449f857">BackEaseFunction::Create</a>();
```

</td></tr><tr><td style="width: 16.9345%;">Shared pointers and Create methods for animation property setters instead of constructors</td><td style="width: 38.4373%;">e.g. ```
Candera::Transformable2DTranslateYPropertySetter transitionPS();
Candera::MaterialPropertySetter materialPS();
```

</td><td style="width: 44.6282%;">e.g.

```
Candera::Transformable2DTranslateYPropertySetter::SharedPointer transitionPS = <a class="code" href="http://dev.doc.cgistudio.at/APILINK/group___c_o_u_r_i_e_r___v_i_s_u_a_l_i_z_a_t_i_o_n.html#ggaf0e93dc4242f607c3c8d13dafd036af9aaabfa5309af24986d3111a092449f857">Transformable2DTranslateYPropertySetter::Create</a>();
Candera::MaterialPropertySetter::SharedPointer materialPS = <a class="code" href="http://dev.doc.cgistudio.at/APILINK/group___c_o_u_r_i_e_r___v_i_s_u_a_l_i_z_a_t_i_o_n.html#ggaf0e93dc4242f607c3c8d13dafd036af9aaabfa5309af24986d3111a092449f857">MaterialPropertySetter::Create</a>();
```

</td></tr><tr><td style="width: 16.9345%;">Shared pointer destruction</td><td style="width: 38.4373%;">```
Bitmap* bmp = CANDERA_NEW(...);
CANDERA_DELETE(bmp);
bmp = 0;
```

</td><td style="width: 44.6282%;">SharedPointers may not be manually disposed, freed or deleted. Additionally SharedPointers cannot be set to NULL in the same way as pointers. According code has to be removed:

```
Bitmap::SharedPointer bmp = <a class="code" href="http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_bitmap.html#a53c1f585b24819ae815fbeb54820fe23">Bitmap::Create</a>(...);
// no manual destruction
// no need to set to zero / NULL
```

</td></tr><tr><td style="width: 16.9345%;">[Bitmap](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_bitmap.html "A 2-dimensional bitmap that can be used as a texture, background or sprite. A bitmap pointing to a va...") as SharedPointer</td><td style="width: 38.4373%;">```
Bitmap bitmap(...);
```

</td><td style="width: 44.6282%;">```
Bitmap::SharedPointer bitmap = <a class="code" href="http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_bitmap.html#a53c1f585b24819ae815fbeb54820fe23">Bitmap::Create</a>(...);
```

</td></tr><tr><td style="width: 16.9345%;">[BitmapTextureImage](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_bitmap_texture_image.html "TextureImage encapsulates a VRAM handle which is retrieved when uploading an image to the vram..."), [CubeMapTextureImage](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_cube_map_texture_image.html "CubeMapTextureImage encapsulates a VRAM handle which is retrieved when uploading a cube mapping textu..."), [BitmapImage2D](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_bitmap_image2_d.html "Supplies an Image2D interface to a Bitmap.") setters take SharedPointer to [Bitmap](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_bitmap.html "A 2-dimensional bitmap that can be used as a texture, background or sprite. A bitmap pointing to a va...") and no disposer function</td><td style="width: 38.4373%;">```
BitmapTextureImage textureImage = <a class="code" href="http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_bitmap_texture_image.html#a2370d9c05948c12cb6fa6acec733d565">BitmapTextureImage::Create</a>();
Bitmap bitmap = CANDERA_NEW(Bitmap)(...);
textureImage->SetBitmap(bitmap, 0);
```

</td><td style="width: 44.6282%;">```
BitmapTextureImage textureImage = <a class="code" href="http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_bitmap_texture_image.html#a2370d9c05948c12cb6fa6acec733d565">BitmapTextureImage::Create</a>();
Bitmap::SharedPointer bitmap = <a class="code" href="http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_bitmap.html#a53c1f585b24819ae815fbeb54820fe23">Bitmap::Create</a>(...);
textureImage->SetBitmap(bitmap);
```

</td></tr></tbody></table>

</div></div></div></div></div></div></div>##### Header File Relocations

In CGI Studio 2.x, some functionality had been moved from [Candera](http://dev.doc.cgistudio.at/APILINK/namespace_candera.html "[DataBinding_RefTypeSample]") into FeatStd, keeping redirection macros and header files for backward compatibility. In CGI Studio 3.0.0, redirection code has been removed to a large extent. Following is an overview about removed macros and header files.

##### CanderaPlatform/OS Cleanup

<div class="header" id="bkmrk-removed-use-instead-"><div class="header"><div class="headertitle"><div class="title"><div class="contents"><div class="contents"><div class="textblock"><table border="1" class="doxtable" style="border-collapse: collapse; width: 800px;"><tbody><tr><th>**Removed**</th><th>**Use instead**</th></tr><tr><td>CanderaPlatform/OS/FixedPoint</td><td>FeatStd/Platform/FixedPoint</td></tr><tr><td>CanderaPlatform/OS/FractionNumberMath.h</td><td>FeatStd/Platform/FractionNumberMath.h</td></tr><tr><td>CanderaPlatform/OS/FractionNumber.h</td><td>FeatStd/Platform/FractionNumber.h</td></tr><tr><td>CanderaPlatform/OS/CodePointIterator.h</td><td>FeatStd/Platform/CodePointIterator.h</td></tr></tbody></table>

</div></div></div></div></div></div></div>##### Candera TimePlatform

<div class="header" id="bkmrk-removed-use-instead--0"><div class="header"><div class="headertitle"><div class="title"><div class="contents"><div class="textblock"><table border="1" class="doxtable" style="border-collapse: collapse; width: 800px;"><tbody><tr><th>**Removed**</th><th>**Use instead**</th></tr><tr><td>Candera/Time.h</td><td>CanderaPlatform/OS/TimePlatform.h

</td></tr></tbody></table>

</div></div></div></div></div></div><div class="header" id="bkmrk--1"><div class="headertitle"><div class="title"><div class="contents"><div class="textblock">---

</div></div></div></div></div>#### **Candera/FeatStd Build System Changes**

##### Library Changes

[Candera](http://dev.doc.cgistudio.at/APILINK/namespace_candera.html "[DataBinding_RefTypeSample]") base feature libraries have been joined into the new common library called **Candera.lib**. The following libraries from CGI-Studio V2.x no longer exist separately:

<div class="contents" id="bkmrk-canderaenginebase.li"><div class="contents"><div class="textblock">- CanderaEngineBase.lib
- CanderaEngine2D.lib
- CanderaEngine3D.lib
- CanderaGlobalization.lib
- CanderaSystem.lib
- CanderaOsWin32.lib
- CanderaWidget.lib

</div></div></div>##### CMake Switch Name Modification

The names of almost all CMake switches used in CGI-Studio V2.x have been revised to improve effect and feature association. The feature name now reflects, to which component the feature belongs to.

<p class="callout warning">Please be aware, that even though the CMake Switch names and preprocessor defines from CGI-Studio V2.x still work in CGI-Studio V3.0.0, this backward compatibility is going to be removed with the next release.</p>

##### Candera CMake Switch Changes

<div class="contents" id="bkmrk-for-detailed-informa"><div class="contents"><div class="textblock">- For detailed information on [Candera](http://dev.doc.cgistudio.at/APILINK/namespace_candera.html "[DataBinding_RefTypeSample]") configuration please see <span style="color: rgb(230, 126, 35);">[Application Development &gt; Build System Setup &gt; Building Candera](https://doc316en.candera.eu/link/408#bkmrk-page-title)</span>.
- For [Candera](http://dev.doc.cgistudio.at/APILINK/namespace_candera.html "[DataBinding_RefTypeSample]") compiler defines refer to [Candera Configuration](http://dev.doc.cgistudio.at/APILINK/group___config.html).

<table border="1" class="doxtable" style="border-collapse: collapse; width: 800px;"><tbody><tr><th>**V2.10.0**</th><th>**V3.0.0**</th></tr><tr><td>CGIFEATURE\_ENABLE\_CANDERA\_2D</td><td>CANDERA\_2D\_ENABLED</td></tr><tr><td>CGIFEATURE\_ENABLE\_CANDERA\_3D</td><td>CANDERA\_3D\_ENABLED</td></tr><tr><td>CGIFEATURE\_VRAM\_ALLOCATOR\_CHECK</td><td>CANDERA\_VRAM\_ALLOCATOR\_CHECK\_ENABLED</td></tr><tr><td>CGIFEATURE\_VRAM\_ALLOCATOR\_STATISTICS</td><td>CANDERA\_VRAM\_ALLOCATOR\_STATISTICS\_ENABLED</td></tr><tr><td>CGIFEATURE\_ENABLE\_RENDER\_STATE\_CACHING</td><td>CANDERA\_RENDER\_STATE\_CACHING\_ENABLED</td></tr><tr><td>CGIFEATURE\_ENABLE\_GLOBALIZATION</td><td>CANDERA\_GLOBALIZATION\_ENABLED</td></tr><tr><td>CGIFEATURE\_ENABLE\_ASSET\_DECOMPRESSION</td><td>CANDERA\_ASSET\_DECOMPRESSION\_ENABLED</td></tr><tr><td>CGIFEATURE\_TEXTSHAPER</td><td>CANDERA\_TEXT\_SHAPER</td></tr><tr><td>CGIFEATURE\_ENABLE\_BIDIRECTIONAL\_TEXT</td><td>CANDERA\_BIDIRECTIONAL\_TEXT\_ENABLED</td></tr><tr><td>CGIFEATURE\_ENABLE\_MULTILINE\_TEXT</td><td>CANDERA\_MULTILINE\_TEXT\_ENABLED</td></tr><tr><td>CGIFEATURE\_ENABLE\_VIDEO\_MEMORY\_STATISTIC  
FEATSTD\_ENABLE\_VIDEO\_MEMORY\_STATISTIC</td><td>CANDERA\_VIDEO\_MEMORY\_STATISTIC\_ENABLED</td></tr><tr><td>CGIUNITTEST\_ENABLED</td><td>CANDERA\_UNITTEST\_ENABLED</td></tr><tr><td>CGIUNITTEST\_INCLUDE\_ISOLATED</td><td>CANDERA\_UNITTEST\_INCLUDE\_ISOLATED</td></tr><tr><td>CGIDEVICE\_ENABLE\_4BIT\_GLYPH\_CACHE</td><td>CANDERA\_4BIT\_GLYPH\_CACHE\_ENABLED</td></tr><tr><td>CGIFEATURE\_ENABLE\_LOG</td><td>FEATSTD\_LOG\_ENABLED</td></tr><tr><td>CGIFEATURE\_ENABLE\_MEMORYPOOL</td><td>FEATSTD\_MEMORYPOOL\_ENABLED</td></tr><tr><td>CGIFEATURE\_ENABLE\_TEXTENGINE\_MEMORYPOOL</td><td>CANDERA\_TEXTENGINE\_MEMORYPOOL\_ENABLED</td></tr><tr><td>CGIFEATURE\_ENABLE\_ASSETLOADER\_MEMORYPOOL</td><td>CANDERA\_ASSETLOADER\_MEMORYPOOL\_ENABLED</td></tr><tr><td>CGIFEATURE\_ENABLE\_MEMORY\_STATISTIC</td><td>FEATSTD\_SYSTEM\_MEMORY\_STATISTIC\_ENABLED</td></tr><tr><td>CGIFEATURE\_SYSTEM\_MEMORY\_STATISTIC\_FILE\_AND\_LINE\_TRACKING</td><td>FEATSTD\_SYSTEM\_MEMORY\_STATISTIC\_FILE  
\_AND\_LINE\_TRACKING\_ENABLED</td></tr><tr><td>CGIFEATURE\_FRACTIONAL\_NUMBER\_TYPE</td><td>FEATSTD\_FRACTIONAL\_NUMBER\_TYPE</td></tr><tr><td>CGIFEATURE\_ENABLE\_MONITOR</td><td>FEATSTD\_MONITOR\_ENABLED</td></tr><tr><td>CGISTUDIO\_BUILD\_FREETYPE</td><td>Has been removed, Freetype will be included automatically.</td></tr></tbody></table>

</div></div></div>##### FeatStd CMake Switch Changes

<div class="contents" id="bkmrk-refer-to-the-featstd"><div class="contents"><div class="textblock">- Refer to the <span style="color: rgb(230, 126, 35);">[FeatStd 3.0.0 CMake Changelog](https://doc316en.candera.eu/link/984#bkmrk-page-title)</span> to learn about FeatStd V3.0.0 CMake switch modifications.
- For FeatStd compiler defines refer to [FeatStd Configuration](http://dev.doc.cgistudio.at/APILINK/group___f_e_a_t_s_t_d___c_o_n_f_i_g.html).

</div></div></div><div class="contents" id="bkmrk--2"><div class="textblock">---

</div></div>#### **Regular Expression Search and Replace Patterns**

The following Regular Expression Search &amp; Replace patterns may be used to quickly apply changes to existing source code. They aim at fixing many (breaking) changes introduced with the new version of [Candera](http://dev.doc.cgistudio.at/APILINK/namespace_candera.html "[DataBinding_RefTypeSample]"). However, as simple text replacement with regular expressions is used, corrections which resulted from applying these patterns may be incorrect in some situations. Therefore, the patterns are just provided as-is in the hope that they may be useful for code migration.

To apply the patterns Notepad++ or any other compatible Regular Expression Search &amp; Replace tool can be used. When using Notepad++ please make sure to select the search method "Regular expression" and check "Match case".

##### Patterns for Fixing Breaking Changes

<div class="contents" id="bkmrk-use-case-search-patt"><div class="contents"><div class="textblock"><table border="1" class="doxtable" style="border-collapse: collapse; width: 800px; border-width: 1px;"><tbody><tr><th style="width: 22.7392%; border-width: 1px;">**Use case**</th><th style="width: 39.5599%; border-width: 1px;">**Search pattern**</th><th style="width: 37.7009%; border-width: 1px;">**Replace pattern**</th></tr><tr><td style="width: 22.7392%; border-width: 1px;">Declarations of AnimationPlayer pointer</td><td style="width: 39.5599%; border-width: 1px;">(\\\\S\*)SharedPointer&lt;AnimationPlayer&gt;</td><td style="width: 37.7009%; border-width: 1px;">AnimationPlayer::SharedPointer</td></tr><tr><td style="width: 22.7392%; border-width: 1px;">Declarations of AnimationGroupPlayer pointer</td><td style="width: 39.5599%; border-width: 1px;">(\\\\S\*)SharedPointer&lt;AnimationGroupPlayer&gt;</td><td style="width: 37.7009%; border-width: 1px;">AnimationGroupPlayer::SharedPointer</td></tr><tr><td style="width: 22.7392%; border-width: 1px;">Declarations of AnimationTimeDispatcher pointer variables</td><td style="width: 39.5599%; border-width: 1px;">((\\\\W)|(const\\\\s+))(Candera::)?AnimationTimeDispatcher((\\\\s\*)\\\\\*)(\\\\s\*?\[\\\\w:\]+)(\\\\s\*?=\\\\s\*?(NULL|0))?</td><td style="width: 37.7009%; border-width: 1px;">$2$4AnimationTimeDispatcher::SharedPointer$6$7</td></tr><tr><td style="width: 22.7392%; border-width: 1px;">Declarations of AnimationController pointer variables</td><td style="width: 39.5599%; border-width: 1px;">((\\\\W)|(const\\\\s+))(Candera::)?AnimationController((\\\\s\*)\\\\\*)(\\\\s\*?\[\\\\w:\]+)(\\\\s\*?=\\\\s\*?(NULL|0))?</td><td style="width: 37.7009%; border-width: 1px;">$2$4AnimationController::SharedPointer$6$7</td></tr><tr><td style="width: 22.7392%; border-width: 1px;">Declarations of InterpolationStrategy pointer variables</td><td style="width: 39.5599%; border-width: 1px;">((\\\\W)|(const\\\\s+))(Candera::)?InterpolationStrategy ((\\\\s\*)\\\\\*)(\\\\s\*?\[\\\\w:\]+)(\\\\s\*?=\\\\s\*?(NULL|0))?</td><td style="width: 37.7009%; border-width: 1px;">$2$4InterpolationStrategy::SharedPointer$6$7</td></tr><tr><td style="width: 22.7392%; border-width: 1px;">Calls to AnimationKeyframeSequence::SetInterpolationStrategy()</td><td style="width: 39.5599%; border-width: 1px;">SetInterpolationStrategy\\\\(\\\\s\*?&amp;?\\\\s\*?(\[\\\\w:\\\\(\\\\)\]+),.\*?\\\\)</td><td style="width: 37.7009%; border-width: 1px;">SetInterpolationStrategy \\\\($1\\\\)</td></tr><tr><td style="width: 22.7392%; border-width: 1px;">Calls to AnimationPlayer::SetController()</td><td style="width: 39.5599%; border-width: 1px;">SetController\\\\(\\\\s\*?&amp;?\\\\s\*?(\[\\\\w:\\\\(\\\\)\]+),.\*?\\\\)</td><td style="width: 37.7009%; border-width: 1px;">SetController\\\\($1\\\\)</td></tr><tr><td style="width: 22.7392%; border-width: 1px;">Declarations of Animation PropertySetter pointer variables</td><td style="width: 39.5599%; border-width: 1px;">((\\\\W)|(const\\\\s+))(Candera::)?(\\\\w\*)PropertySetter((\\\\s\*)\\\\\*?)(\\\\s\*?\\\\w+)(\\\\s\*?=\\\\s\*?(NULL|0))?</td><td style="width: 37.7009%; border-width: 1px;">$2$4$5PropertySetter::SharedPointer$7$8</td></tr><tr><td style="width: 22.7392%; border-width: 1px;">Creation of Animation PropertySetter objects</td><td style="width: 39.5599%; border-width: 1px;">(CANDERA\_NEW|FEATSTD\_NEW)(\\\\s\*?\\\\(\\\\s\*?)(Candera::)?(\[\\\\w:\]\*)PropertySetter(\\\\s\*\\\\))</td><td style="width: 37.7009%; border-width: 1px;">$3$4PropertySetter::Create\\\\(\\\\)</td></tr><tr><td style="width: 22.7392%; border-width: 1px;">Calls to AnimationBlendedProperty::SetAnimationPropertySetter()</td><td style="width: 39.5599%; border-width: 1px;">SetAnimationPropertySetter\\\\(\\\\s\*?&amp;?\\\\s\*?(\[\\\\w:\\\\(\\\\)\]+)\\\\)</td><td style="width: 37.7009%; border-width: 1px;">SetAnimationPropertySetter\\\\($1\\\\)</td></tr><tr><td style="width: 22.7392%; border-width: 1px;">Forward declarations of classes for pointer declarations which are now SharedPointer instances</td><td style="width: 39.5599%; border-width: 1px;">(namespace Candera.\*\\\\{.\*)(\[\\\\r\\\\n\\\\s\\\\w;\]\*)(class AnimationController;.\*\[\\\\r\\\\n\])</td><td style="width: 37.7009%; border-width: 1px;">\#include &lt;Candera/EngineBase/Animation/AnimationController.h&gt;\\\\n\\\\n$1</td></tr><tr><td style="width: 22.7392%; border-width: 1px;">Forward declarations of classes for pointer declarations which are now SharedPointer instances</td><td style="width: 39.5599%; border-width: 1px;">(namespace Candera.\*\\\\{.\*)(\[\\\\r\\\\n\\\\s\\\\w;\]\*)(class AnimationTimeDispatcher;.\*\[\\\\r\\\\n\])</td><td style="width: 37.7009%; border-width: 1px;">\#include &lt;Candera/EngineBase/Animation/AnimationTimeDispatcher.h&gt;\\\\n\\\\n$1</td></tr><tr><td style="width: 22.7392%; border-width: 1px;">Declarations of Bitmap pointer variables</td><td style="width: 39.5599%; border-width: 1px;">((\\\\W)|(const\\\\s+))(Candera::)?Bitmap((\\\\s\*)\\\\\*)(\\\\s\*?\\\\w+)(\\\\s\*?=\\\\s\*?(NULL|0))?</td><td style="width: 37.7009%; border-width: 1px;">$2$4Bitmap::SharedPointer$6$7</td></tr><tr><td style="width: 22.7392%; border-width: 1px;">Forward declarations of classes for pointer declarations which are now SharedPointer instances.</td><td style="width: 39.5599%; border-width: 1px;">(namespace Candera.\*\\\\{.\*)(\[\\\\r\\\\n\\\\s\\\\w;\]\*)(class Bitmap;.\*\[\\\\r\\\\n\])</td><td style="width: 37.7009%; border-width: 1px;">\#include &lt;Candera/EngineBase/Common/Bitmap.h&gt;\\\\n\\\\n$1</td></tr><tr><td style="width: 22.7392%; border-width: 1px;">Calls to e.g. BitmapImage2D::SetBitmap()</td><td style="width: 39.5599%; border-width: 1px;">SetBitmap\\\\(\\\\s\*?&amp;?\\\\s\*?(\[\\\\w:\\\\(\\\\)\]+),.\*?\\\\)</td><td style="width: 37.7009%; border-width: 1px;">SetBitmap\\\\($1\\\\)</td></tr><tr><td style="width: 22.7392%; border-width: 1px;">Calls to CubeMapTextureImage::SetBitmapFace()</td><td style="width: 39.5599%; border-width: 1px;">SetBitmapFace\\\\(\\\\s\*?&amp;?\\\\s\*?(\[\\\\w:\\\\(\\\\)\]+),(.\*?),.\*?\\\\)</td><td style="width: 37.7009%; border-width: 1px;">SetBitmapFace\\\\($1,$2\\\\)</td></tr><tr><td style="width: 22.7392%; border-width: 1px;">Use CanderaPlatform/OS/TimePlatform.h instead of Candera/Time.h</td><td style="width: 39.5599%; border-width: 1px;">(#include &lt;Candera\\\\/Time\\\\.h&gt;)</td><td style="width: 37.7009%; border-width: 1px;">\#include &lt;CanderaPlatform\\\\/OS\\\\/TimePlatform\\\\.h&gt;</td></tr><tr><td style="width: 22.7392%; border-width: 1px;">Use CanderaPlatform/OS/TimePlatform.h instead of Candera/Time.h</td><td style="width: 39.5599%; border-width: 1px;">(\[\\\\s=\\\\n\\\\(&lt;\])Time::</td><td style="width: 37.7009%; border-width: 1px;">$1TimePlatform::</td></tr><tr><td style="width: 22.7392%; border-width: 1px;">Use headers in FeatStd, that were previously located in CanderaPlatform/OS</td><td style="width: 39.5599%; border-width: 1px;">\#include &lt;CanderaPlatform\\\\/OS\\\\/Diagnostics\\\\/(FixedPoint(.\*)|FractionNumberMath.h|FractionNumber.h|CodePointIterator.h)&gt;  
</td><td style="width: 37.7009%; border-width: 1px;">\#include &lt;FeatStd\\\\/Platform\\\\/$1.h&gt;</td></tr></tbody></table>

</div></div></div>##### Patterns for fixing backward compatible changes

<div class="contents" id="bkmrk-use-case-search-patt-0"><div class="contents"><div class="textblock"><table border="1" class="doxtable" style="border-collapse: collapse; width: 800px; border-width: 1px;"><tbody><tr><th style="width: 167.703px; border-width: 1px;">**Use case**</th><th style="width: 374.938px; border-width: 1px;">**Search pattern**</th><th style="width: 256.359px; border-width: 1px;">**Replace pattern**</th></tr><tr><td style="width: 167.703px; border-width: 1px;">Usage of EaseFunction qualifier</td><td style="width: 374.938px; border-width: 1px;">(\[^(\\\\w|(Animation::)|\\\\/|(enum )|(class ))\]|\\\\(|(Candera::)|\\\\s)((Back|Bounce|Elastic|Power|Exponential)EaseFunction)</td><td style="width: 256.359px; border-width: 1px;">$1Animation::$3</td></tr><tr><td style="width: 167.703px; border-width: 1px;">Usage of InterpolationStrategy qualifier</td><td style="width: 374.938px; border-width: 1px;">(\[^(\\\\w|(Animation::)|\\\\/|(enum )|(class ))\]|\\\\(|(Candera::)|\\\\s)((Bezier|Ease|Linear|Spline|Step)?InterpolationStrategy)</td><td style="width: 256.359px; border-width: 1px;">$1Animation::$3</td></tr><tr><td style="width: 167.703px; border-width: 1px;">Usage of Animation core classes qualifier</td><td style="width: 374.938px; border-width: 1px;">(\[^(\\\\w|(Animation::)|\\\\/|(enum )|(class ))\]|\\\\(|(Candera::)|SharedPointer&lt;|\\\\s)(Animation(BlendedProperty|Controller|GroupPlayer|KeyframeSequence|Player|PlayerBase|PlayerListener|PropertySetter|TimeDispatcher|TimeType))(\\\\W)</td><td style="width: 256.359px; border-width: 1px;">$1Animation::$3$5</td></tr><tr><td style="width: 167.703px; border-width: 1px;">Usage of Animation core classes qualifier</td><td style="width: 374.938px; border-width: 1px;">(\[^(\\\\w|(Animation::)|\\\\/|(enum )|(class ))\]|\\\\(|(Candera::)|\\\\s)(AbstractEasingFunction|CameraGroupAnimationPropertySetter|KeyframeSequence|SequenceTimeType)</td><td style="width: 256.359px; border-width: 1px;">$1Animation::$3</td></tr><tr><td style="width: 167.703px; border-width: 1px;">New namespace CgiWidgetLibrary</td><td style="width: 374.938px; border-width: 1px;">public\\\\s+(Listener)\\\\s\*?&lt;</td><td style="width: 256.359px; border-width: 1px;">public CgiWidgetLibrary::$1&lt;</td></tr><tr><td style="width: 167.703px; border-width: 1px;">Removed indirection from Candera to FeatStd for Logging</td><td style="width: 374.938px; border-width: 1px;">CANDERA\_DEBUG\_(\\\\w\*)\\\\(</td><td style="width: 256.359px; border-width: 1px;">FEATSTD\_DEBUG\_$1\\\\(</td></tr><tr><td style="width: 167.703px; border-width: 1px;">Removed indirection from Candera to FeatStd for Logging</td><td style="width: 374.938px; border-width: 1px;">CANDERA\_LOG(\\\\w\*)\\\\(</td><td style="width: 256.359px; border-width: 1px;">FEATSTD\_LOG$1\\\\(</td></tr><tr><td style="width: 167.703px; border-width: 1px;">Removed indirection from Candera to FeatStd for Logging</td><td style="width: 374.938px; border-width: 1px;">(\[^:\\\\/\\\\w\]|\\\\s)(Log(Control|Level))</td><td style="width: 256.359px; border-width: 1px;">$1FeatStd::Diagnostics::$2</td></tr><tr><td style="width: 167.703px; border-width: 1px;">Removed indirection from Candera to FeatStd</td><td style="width: 374.938px; border-width: 1px;">CANDERA\_PANIC(\\\\w\*)\\\\(</td><td style="width: 256.359px; border-width: 1px;">FEATSTD\_PANIC$1\\\\(</td></tr><tr><td style="width: 167.703px; border-width: 1px;">Removed indirection from Candera to FeatStd</td><td style="width: 374.938px; border-width: 1px;">CANDERA\_COMPILETIME\_ASSERT</td><td style="width: 256.359px; border-width: 1px;">FEATSTD\_COMPILETIME\_ASSERT</td></tr><tr><td style="width: 167.703px; border-width: 1px;">Removed indirection from Candera to FeatStd</td><td style="width: 374.938px; border-width: 1px;">CANDERA\_UNUSED\_PARAMETER</td><td style="width: 256.359px; border-width: 1px;">FEATSTD\_UNUSED</td></tr><tr><td style="width: 167.703px; border-width: 1px;">Removed indirection from Candera to FeatStd</td><td style="width: 374.938px; border-width: 1px;">\#include &lt;Candera\\\\/Systems\\\\/Diagnostics\\\\/(Appender|CharBuffer|ConsoleAppender|Debug|DebuggerOutSystemmemoryStatistic|ErrorHandling|FileAppender|LocationInfo|Measurable|SystemMemoryStatistic|Log(ger(Typed)?|Event|Level|))(.h|Control.h)&gt;</td><td style="width: 256.359px; border-width: 1px;">\#include &lt;FeatStd\\\\/Diagnostics\\\\/$1.h&gt;</td></tr><tr><td style="width: 167.703px; border-width: 1px;">Removed indirection from Candera to FeatStd</td><td style="width: 374.938px; border-width: 1px;">\#include &lt;FeatStd\\\\/Diagnostics\\\\/LogRealm.h&gt;</td><td style="width: 256.359px; border-width: 1px;">\#include &lt;FeatStd\\\\/Diagnostics\\\\/Log.h&gt;</td></tr></tbody></table>

</div></div></div><div class="contents" id="bkmrk--3"><div class="textblock">  
</div></div>---

<div class="header" id="bkmrk--5"><div class="headertitle"><div class="title">  
</div></div></div>