# Candera V3.3.0

Release Date: November 2016  
  
To keep backwards compatibility for any interface change in the public API the old interface has been kept and marked as deprecated. The deprecated interfaces will be removed in future versions. Compiler warnings will be generated when using a deprecated interface through the usage of Candera Macro CANDERA\_DEPRECATED\_3\_3\_0.

# Candera/FeatStd CMake Build System Changes

---

# Candera Engine 3D

#### Changed Light Specular Color to White

Changed default specular light color to White due to feedback from designers. [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...") default specular color is black anyway, so no specular highlight will occur by default. But if user (designer, technical artist) changes material specular color, an immediate change of appearance will be visible.

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

</div></div></div>#### Reduction of glGetUniform calls on Shader Upload

By improving handling of [Shader](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_shader.html "The class Shader is an Appearance component representing a graphical processing unit (GPU) program...") Uniforms, the number of calls to glGetUniform during shader uploading was significantly reduced.

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

</div></div></div>#### Introduction of LoadingHint for DeviceObject.

Version 3.3.0 introduces a LoadingHint for the [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..."). Loading hints can e.g. trigger warnings when uploading while rendering, or force unloading from all contexts.

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

</div></div></div>#### New methods for NodeListener

New methods have been added to [NodeListener](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_node_listener.html "A NodeListener defines hooks that are called when certain Node functions are triggered, e.g. when a Node's transformation changes. In order to register a NodeListener to a Node simply derive from NodeListener and override pure virtual functions with custom code.") class. These are:

<div class="contents" id="bkmrk-candera%3A%3Anodelistene"><div class="contents"><div class="textblock">- [Candera::NodeListener::OnNodeAdded](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_node_listener.html#a4d01c50508f145a5d57fe736621756a1): this is invoked whenever a parent is set for the node;
- [Candera::NodeListener::OnChildAdded](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_node_listener.html#a295d6454aefa42188ebc02fc9e50f3d7): this is invoked whenever a child node is added to the node;
- [Candera::NodeListener::OnChildRemoved](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_node_listener.html#a1114fc91be13375eb9c699adabb0c735): this is invoked whenever a child of the node is removed.

---

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

# Candera Engine 2D

#### Introduction of LoadingHint for DeviceObject2D.

Version 3.3.0 introduces a LoadingHint for the [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..."). Loading hints can e.g. trigger warnings when uploading while rendering, or force unloading from a context.

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

</div></div></div>#### New methods for Node2DListener

New methods have been added to [Node2DListener](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_node2_d_listener.html "A Node2DListener defines hooks that are called when certain Node functions are triggered, e.g. when a Node's transformation changes. In order to register a Node2DListener to a Node simply derive from Node2DListener and override pure virtual functions with custom code.") class. These are:

<div class="contents" id="bkmrk-candera%3A%3Anode2dliste"><div class="contents"><div class="textblock">- [Candera::Node2DListener::OnNodeAdded](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_node2_d_listener.html#a8ebb0afc488f8da128041dc11d9ceb80): this is invoked whenever a parent is set for the node;
- [Candera::Node2DListener::OnChildAdded](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_node2_d_listener.html#ab9e9d94d5a50c6e08def26e7e42d5d9e): this is invoked whenever a child node is added to the node;
- [Candera::Node2DListener::OnChildRemoved](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_node2_d_listener.html#a1acb5635774ed5caa1cfc955bc1d0d67): this is invoked whenever a child of the node is removed.

---

</div></div></div>#### TextNode2D cloning strategy

[TextNode2D](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_text_node2_d.html "TextNode2D is a RenderNode that renders text using the attached BitmapBrush effect.") adopts the unified cloning mechanism, with the introduction of [DeepTextNode2DCloneStrategy](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_deep_text_node2_d_clone_strategy.html "This is the default clone strategy for deep cloning TextNode2d See DeepNode2DCloneStrategy for rules...").

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

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

</div></div></div>#### Improved Pixel Accuracy

Scissoring is now utilized on platforms that support it. This improves pixel accuracy in 2D rendering when a dirty area or a camera scissor is used.

---

# Candera Base

#### Renderer2D3D

A new renderer has been added. It renders the cameras interleaved in order of their sequence-number. This means that 3D-cameras can be rendered between two 2D-cameras and vice versa. The interleaved renderer however, has the requirement that buffer swapping and clearing needs to be done by the according Cameras directly. Therefore auto clear and auto swapping becomes deprecated. Please see the <span style="color: rgb(230, 126, 35);">[Migration Guide](https://doc316en.candera.eu/link/849#bkmrk-page-title)</span>.

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

</div></div></div>#### DXT image formats

New compressed formats support in [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...") is avaiable on selected platforms: Dxt1CompressedRgbFormat, Dxt1CompressedRgbaFormat, Dxt3CompressedRgbaFormat, Dxt5CompressedRgbaFormat.

---

# Candera Scripting

#### Lua Update.

Lua has been updated to version 5.3.3.

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

</div></div></div>#### New Script Callbacks.

This version adds a new callback:

<div class="contents" id="bkmrk-fixedupdate"><div class="contents"><div class="textblock">- [FixedUpdate](http://dev.doc.cgistudio.at/APILINK/group___lua_tutorial.html#LuaTutorialFunctionsCalledByCandera)

---

</div></div></div>#### Time interface.

This version adds a new [interface](http://dev.doc.cgistudio.at/APILINK/group___lua_binding_gobal_data_structures.html#CanderaLuaCanderaTime) to get time information in Lua.

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

</div></div></div>#### Added uniform functions.

This version adds new [functions](http://dev.doc.cgistudio.at/APILINK/group___lua_binding_shader_param_setter.html) to Lua to access uniforms through Candera's shader parameter setter.

---

# Candera System

#### Update System

This release adds an [update system](http://dev.doc.cgistudio.at/APILINK/group___update_system.html) where entities can be registered to receive any of a series of update calls.

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

</div></div></div>#### Controller System

This release adds a [controller system](http://dev.doc.cgistudio.at/APILINK/group___controller_system.html) which offers an abstract interface that the user can implement and attach to entities to receive update calls.

---

# Candera Device

---

# Candera Transitions

#### New Default Transition Types

The transition framework now supports Cut, Fade, Slide and Scale transitions.

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

</div></div></div>#### Transition Request Handles

Transition requests can now be assigned a handle allowing creation of multiple requests at once. This is a requirement for courier

---

# TextEngine

#### TTC font iterator.

A function to iterate over the style names of the font faces contained by a TTC font was introduced in the Font.h interface. Additional functions to retrieve the font style name and the font family name of the current font set up are available.

---

# Candera Behavior

#### Added support for Behaviors.

Behaviors have been added to support application development with considering the hierarchy of the scene graphs. Behaviors are small application building blocks that allow the user to create their own application handling. Being similar to Widgets Behaviors have the advantage that they can rely on hierarchical information, as every [Behavior](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_behavior.html "Behaviors are small re-usable functional blocks that communicate via events. Behaviors are based on W...") has to be attached to a node in the scene graph. By design they can be implemented in such a way that one behavior can even be reused for both 2D and 3D, if no special functionality of the [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...") below has to be used. Behaviors also support event handling through mechanisms for event routing (to other behaviors) and having a base interface ([Behavior::OnEvent](http://dev.doc.cgistudio.at/APILINK/group___behavior_base.html#ga70f74ac5da12a27f11a28e55b2aab429)) to handle events.

---

# Migration Guide

Following an overview about interface changes between [Candera](http://dev.doc.cgistudio.at/APILINK/namespace_candera.html "[DataBinding_RefTypeSample]") V3.2.2 and [Candera](http://dev.doc.cgistudio.at/APILINK/namespace_candera.html "[DataBinding_RefTypeSample]") V3.3.0.

<div class="contents" id="bkmrk-description-candera-"><div class="contents"><div class="textblock"><table class="doxtable"><tbody><tr><th>Description</th><th>[Candera](http://dev.doc.cgistudio.at/APILINK/namespace_candera.html "[DataBinding_RefTypeSample]") V3.2.2</th><th>[Candera](http://dev.doc.cgistudio.at/APILINK/namespace_candera.html "[DataBinding_RefTypeSample]") V3.3.0

</th></tr><tr><td>RenderTarget Changes due to [Renderer2D3D](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_renderer2_d3_d.html "The class Renderer2D3D is responsible of the rendering with 2D- and 3D-cameras. The cameras are rende...").</td><td>void RenderTarget::SetAutoSwapEnabled(bool enabled);   
bool RenderTarget::IsAutoSwapEnabled() const;   
void RenderTarget::SetAutoClearEnabled(bool enabled);   
bool RenderTarget::IsAutoClearEnabled() const;   
void RenderTarget2D::SetClearMode(const SharedClearMode2D::SharedPointer&amp; clearMode);   
SharedClearMode2D::SharedPointer RenderTarget2D::GetSharedClearMode() const;   
void SetClearMode(const SharedClearMode::SharedPointer&amp; clearMode);   
SharedClearMode::SharedPointer GetSharedClearMode() const;   
</td><td>Use corresponding [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...") and [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...") settings.   
  
void [Camera2D::SetClearColorEnabled(bool isEnabled)](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_camera2_d.html#a6b5cc304f150b5a9acc20471362ac121);  
bool [Camera2D::IsClearColorEnabled()](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_camera2_d.html#aec722b464408d247509e7abfb43a1856);  
void [Camera2D::SetSwapEnabled(bool isEnabled)](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_camera2_d.html#aa42862f6adf1211128094f5c27f02c5f);  
bool [Camera2D::IsSwapEnabled() const](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_camera2_d.html#a018101ef5b70de5330972e594d2bea18);  
void [Camera2D::SetClearColor(const Color&amp; clearColor)](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_camera2_d.html#a2d3d31a572091262dac11dca58050fed);  
const [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...")&amp; [Camera2D::GetClearColor()](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_camera2_d.html#a6d6640eeb2afc9ddb2842618e0c23806);  
void [Camera::SetClearMode(const ClearMode&amp; clearMode)](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_camera.html#a0bc080835de611ca1f15dac9346f6b00);  
const [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...")&amp; [Camera::GetClearMode()](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_camera.html#a0ebc0d670014f34b21de83209a584ea6);  
void [Camera::SetSwapEnabled(bool enable)](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_camera.html#a4d8422ed9703ddb9e0803eae61fe0bc6);  
bool [Camera::IsSwapEnabled() const](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_camera.html#a17eb537a7eef7ac43e993eb838439c47);  
  
\\ Use dedicated clear and swap cameras if you don't want to manage clearing and swapping on dynamic camera configurations.

</td></tr><tr><td>RenderDevice Changes due to LoadingHint</td><td>static bool RenderDevice::UploadBitmapTextureImage(BitmapTextureImage&amp; textureImage, UInt unit);  
static bool RenderDevice::UploadCubeMapTextureImage(CubeMapTextureImage&amp; textureImage, UInt unit);  
static bool RenderDevice::UnloadBitmapTextureImage(BitmapTextureImage&amp; textureImage);  
static bool RenderDevice::UnloadCubeMapTextureImage(CubeMapTextureImage&amp; textureImage);  
static bool RenderDevice::UploadVertexBuffer(VertexBuffer&amp; vertexBuffer);  
static bool RenderDevice::UnloadVertexBuffer(VertexBuffer&amp; vertexBuffer);  
static bool RenderDevice::UploadShader(Shader&amp; shader);  
static bool RenderDevice::DeleteShader(Handle vertexShaderHandle, Handle fragmentShaderHandle, Handle programHandle);  
static bool RenderDevice::UploadRenderBuffer(RenderBuffer&amp; renderBuffer);  
static bool RenderDevice::UnloadRenderBuffer(RenderBuffer&amp; renderBuffer);  
static bool RenderDevice::UploadDirectTextureImage(DirectTextureImage&amp; textureImage, UInt unit);  
static bool RenderDevice::UnloadDirectTextureImage(DirectTextureImage&amp; textureImage);  
</td><td>static bool [Renderer::UploadBitmapTextureImage(BitmapTextureImage&amp; textureImage, UInt unit, DeviceObject::LoadingHint loadingHint)](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_renderer.html#afc8c92907dac23b2d0f6d7ace2ed64ae);  
static bool [Renderer::UploadCubeMapTextureImage(CubeMapTextureImage&amp; textureImage, UInt unit, DeviceObject::LoadingHint loadingHint)](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_renderer.html#a59b819d0e19ce1e56105da25999ab139);  
static bool [Renderer::UnloadBitmapTextureImage(BitmapTextureImage&amp; textureImage, DeviceObject::LoadingHint loadingHint)](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_renderer.html#a0fcfef360c89485f977a6882a69e1d05);  
static bool [Renderer::UnloadCubeMapTextureImage(CubeMapTextureImage&amp; textureImage, DeviceObject::LoadingHint loadingHint)](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_renderer.html#adf9d2ae1de55a40677784ec4e259db80);  
static bool [Renderer::UploadVertexBuffer(VertexBuffer&amp; vertexBuffer, DeviceObject::LoadingHint loadingHint)](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_renderer.html#aa0e950c62b2f79e25dfd3e725a35ec5c);  
static bool [Renderer::UnloadVertexBuffer(VertexBuffer&amp; vertexBuffer, DeviceObject::LoadingHint loadingHint)](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_renderer.html#a208a8ac3c92d3c666da733cc9ed52057);  
static bool [Renderer::UploadShader(Shader&amp; shader, DeviceObject::LoadingHint loadingHint)](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_renderer.html#a908a2f56a50792c3b306be6a71bbb157);  
static bool [Renderer::DeleteShader(Handle vertexShaderHandle, Handle fragmentShaderHandle, Handle programHandle, const Char\* shaderName, DeviceObject::LoadingHint loadingHint)](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_renderer.html#a56334d2791c9d8cd2907a80c089dda40);  
static bool [Renderer::UploadRenderBuffer(RenderBuffer&amp; renderBuffer, DeviceObject::LoadingHint loadingHint)](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_renderer.html#aa0d386d42fe57b9eac5e9b16fb5c3da8);  
static bool [Renderer::UnloadRenderBuffer(RenderBuffer&amp; renderBuffer, DeviceObject::LoadingHint loadingHint)](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_renderer.html#aaa25ad5a851c68afaa0d3f11ee9762f0);  
static bool [Renderer::UploadDirectTextureImage(DirectTextureImage&amp; textureImage, UInt unit, DeviceObject::LoadingHint loadingHint)](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_renderer.html#ab08d054cebb93cc923b1336250bad2c4);  
static bool [Renderer::UnloadDirectTextureImage(DirectTextureImage&amp; textureImage, DeviceObject::LoadingHint loadingHint)](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_renderer.html#ae65db2e46fef51c8b5c9e57fbb5644b5);

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

---

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