# CGI Studio 3.7

Release Date: December 2018

# General 3.7

# Restructuring of platform definitions

The CourierPlatformDefs folders have been removed from the applications. The content is platform dependent and not application dependent. With this, every application can share the platform definitions. With this change we also removed the force of CMake flags in the platform definitions. These flags are not platform but application specific. This might have impact on your applications as the default settings may have changed. The CourierPlatformDefs name might have also changed to a more generalized name for the device (e.g. removal of some OS information in the platform name).

Toolchain files are moved from cgi\_studio\_candera to the appropriate device in cgi\_studio\_device.

---

# Player changes

#### Player application renaming

The former CourierPlayer has been renamed to Player. Class names and code are adapted accordingly. The former CGIPlayer ([Candera](http://dev.doc.cgistudio.at/APILINK/namespace_candera.html "[DataBinding_RefTypeSample]") only) has been renamed to LightPlayer. The LightPlayer is a light weight player application which uses candera only. It is recommended to use CGIStudio with [Courier](http://dev.doc.cgistudio.at/APILINK/namespace_courier.html) support. In some cases this is not possible or has restricitons e.g. small devices. For this, the LightPlayer still exists. The LightPlayer has been moved from cgi\_studio\_dev to cgi\_studio\_player/LightPlayer.

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

</div></div></div>#### Network connection replacing DLL approach

<div class="contents" id="bkmrk--0"><div class="contents"><div class="textblock"><dl class="note"></dl>  
</div></div></div><p class="callout info">This has been changed for Player. LightPlayer is still using the DLL approach.</p>

The panel has loaded the player application as DLL. This has changed, so executable builds (Player.exe) are required on host.

<div class="contents" id="bkmrk--1"><div class="contents"><div class="textblock"><dl class="note"></dl>  
</div></div></div><p class="callout info">NativeDLL is only buildable for specific target builds which require a dll/shared object approach.</p>

The connection has to be established by "Start application..." or "Attach" if the application is already running. Debugging under host starts the application - therefore an "attach" is required. The Panel connects over TCP/IP. Target application is server, therefore the panel has to know the IP of the target. New CMake flags have been added to:

<div class="contents" id="bkmrk-enable-and-disable-t"><div class="contents"><div class="textblock">- enable and disable the Network control feature (CGIAPP\_NETWORK\_CONTROL\_ENABLED)
- set a port for the application (CGIAPP\_NETWORK\_CONTROL\_PORT) The application can now be blocked right before the asset loading begins. The application has to be unblocked in this case. The application has command line parameters to change e.g. listener port in case of port is blocked or already in use.

---

</div></div></div>#### Player render order configuration change

The camera sequence number is now global for 2D and 3D by default. If the previous behavior that 2D gets rendered before 3D shall be preserved, then either change the camera sequence number accordingly or change myRenderConfiguration.Use2DBefore3D(false); to true.

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

</div></div></div>#### Player action recording and replay

A recording feature has been added as first version to the panel. With this, requests from panel to application can be recorded and replayed again.

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

</div></div></div>#### Player target support

The CourierPlatformDefs have been adapted. With this we officially support the Player on all targets but NoOS and targets without multi-threading. This includes the connection of Panel over TCP/IP if TCP/IP is available.

---

# Candera 3.7

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\_7\_0.

# Candera Platform

#### Owner Requirement

OpenGL Offscreen Render Targets (Frame Buffer Objects) are now required to have an owner RenderTarget to ensure that the used EGL context is safe. For this reason RDenderTarget now has the "IsOwnerRequired" function which returns if a parent render target is needed. The concrete RenderTarget implementation needs to implement the function accordingly. If IsOwnerRequired returns true, an Upload of the RenderTarget will only succeed if the owner is set. RenderTarget3D has additionally a protected SetOwner function that classes derived from RenderTarget may call to set their parent render target. This mechanism can of course also be used for non-OpenGL implementations. Widgets and Behaviors need to take care that owners are set correctly.

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

</div></div></div>#### GlInclude Header File

From now on, the GlInclude header file only includes Open GL header files if a CGIDEVICE\_OPENGLES\_xx has been defined. E.g. the NullRenderDevice does no longer include them.

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

</div></div></div>#### Interface to load / store binary shader programs

Binary [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...") Programs or Object can be retrieved from the driver and stored to an arbitrary persistence mechanism (e.g. a file.). This is supported by the RenderDevice and can be used by Device Packages. Therefoe RenderDevice::UploadStoredShaderBinaryProgram and RenderDevice::RetrieveShaderBinaryProgram have been added if the CANDERA\_SHADER\_PROGRAM\_PERSIST\_INTERFACE\_ENABLED flag is defined.

---

# Candera Base

#### Post Processing System

The new [Post Processing System](http://dev.doc.cgistudio.at/APILINK/group___post_processing_system.html) provides an interface to the user to implement their own post processing effects. Such effects are attached to cameras and get callbacks from the system every time the corresponding camera has finished rendering its scene. The effect then processes the camera's render target, and the system routes the render target automatically through the stack of effects.

For ease of use, post processing effects can also be scripted using Lua.

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

</div></div></div>#### Math numeric stabilization

Standard rotation values like 0, 90, 180, 270 degree should result in stable matrix values. But, due to the calculation of the rotation matrix values the resulting rotated position values have been quite unstable. Therefore, these values are handled separately. Including an optimized handling of rotation value 0 (which no longer leads to sine and cosine calculations). The [Math](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_math.html "The Math class for mathematical helper functions and defined constants.") interface of [Candera](http://dev.doc.cgistudio.at/APILINK/namespace_candera.html "[DataBinding_RefTypeSample]") has been extended by NormalizeDegree and DegreeSineAndCosine to implement this optimization.

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

</div></div></div>#### Candera::WidgetBase::SetStringId with disposer deprecated

The SetStringId interface with a disposer function of [WidgetBase](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_widget_base.html "Abstract base class for Candera Widgets.") has been deprecated due to optimization of the the StringId memory consumption.

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

</div></div></div>#### Touch event extended

Due to extension in the controls the touch event has been extended by a camera. For details please take a look into controls change log. Beside the additional camera parameter of the touch event the GraphicDeviceUnit interface has been extended by a GetSourceId method to enable an improved sorting of touchable behaviours in the controls.

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

</div></div></div>#### Glyph Atlas Outline

The glyph atlas has been extended to support glyph outlines.

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

</div></div></div>#### ThreadedAssetProviderDispatched Outline

Class ThreadedAssetProviderDispatched was updated to offer access the worker thread. This allows to set the worker thread priority.

---

# Candera Engine 2D

#### Renderer 2D Statistics

Candera's 2D renderer statistics have been extended to keep statistics about uploaded bitmap images, and render camera calls.

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

</div></div></div>#### Asset References

A scene can now reference assets that are not referenced by scene graph objects, and upload/unload them whenever the scene is uploaded/unloaded.

---

# Candera Engine 3D

#### Renderer 3D Statistics

Candera's 3D renderer statistics now keep statistics about vertex buffers, shaders, cubemaps, direct textures, render camera calls, and render state cache hit/miss rates (if enabled).

The renderer statistics overlay has also been extended to support the new values.

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

</div></div></div>#### Canvas Text Outline

The canvas text has been extended to support outlines.

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

</div></div></div>#### Texel Size Auto Uniform

New auto uniforms have been added, called "u\_TexelSize", "u\_TexelSize1", .. "u\_TexelSize8", which pass a vec2(1.0/(textureWidth\*4), 1.0/(textureHeight\*4)) to the uniform corresponding with the texture at the given unit. The only purpose for this is to support the outline reference shader.

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

</div></div></div>#### Asset References

A scene can now reference assets that are not referenced by scene graph objects, and upload/unload them whenever the scene is uploaded/unloaded.

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

</div></div></div>#### Renderer Functions

New functions were introduced in the [Renderer](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_renderer.html "The class Renderer represents the unique Candera render interface to the application. Each render call an base of Candera shall be triggered via the Renderer interface.") to support implementation of post processing effects. Render targets can now be retrieved from the [Renderer](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_renderer.html "The class Renderer represents the unique Candera render interface to the application. Each render call an base of Candera shall be triggered via the Renderer interface.") for temporary use, while a Blit function provides a convenient way to apply a shader to a full screen quad.

---

# Candera Transitions

#### Transition reverse improvements

Optimizations on the transition reverse algorithm were done. Reverting an already reversing transition is possible now.

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

</div></div></div>#### Transition requests

A [Candera::Transitions::Request::End()](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_transitions_1_1_request.html#aaef5c1b838b7187b9818eb9743cbc714) might now return a null pointer depending on whether the request was filled with content or not. The framework changed so that it uses lazy object creation now to minimize memory operations.

---

# Text engine

http://dev.doc.cgistudio.at/APILINK/class\_

# Candera Scripting

#### Lua Post Processing Scripts

The post processing system has also been integrated into the Lua script system. [Candera Lua Post Processing](http://dev.doc.cgistudio.at/APILINK/group___lua_post_processing.html) offers an easy way to create post processing effects directly in [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.") Composer using Lua.

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

</div></div></div>#### Lua Bindings

Candera's Lua bindings have been extended with various functions to facilitate development of post processing effects.

---

# Candera System

#### Component Handle

The ComponentHandle class from the entity component system has been refactored to use FeatStd's GenericHandle.

---

# Courier V3.7

#### ViewScene2D/3D

New getter function was added to return the Scene Context

---

# Control Behaviors 3.7

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\_7\_0.

# Behaviors CMake Build System Changes

Added flags:

<div class="contents" id="bkmrk-name-description-pos"><div class="contents"><div class="textblock"><table border="1" cellpadding="5" cellspacing="0" style="width: 100%;"><tbody><tr bgcolor="#d4d4d4"><td class="align-center" style="width: 31.7647%;">**Name**</td><td class="align-center" style="width: 58.0993%;">**Description**</td><td class="align-center" style="width: 10.136%;">**Possible values**</td></tr><tr><td style="width: 31.7647%;">CONTROLS\_HOVER\_EVENT\_ENABLED</td><td style="width: 58.0993%;">Activate hover events from Control Touch Session. An explicit call to [ControlTouchSession::SetHoverEnabled](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_control_touch_session.html#aa987f22b24272bc4500b32c25240c94b) is not required in application.</td><td style="width: 10.136%;">ON/OFF</td></tr></tbody></table>

---

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

# Behaviors Changes

#### Converted 2D/3D behaviors to "mixed" behaviors

Several behaviors had a dedicated 2D and 3D variant. Such behaviors have been cleaned up and replaced by a mixed behavior providing a 2D or 3D implementation based on the node attached to. The 2D and 3D specific behaviors have been deprecated, a solution conversion will automatically convert existing Scene Composer solutions.

Affected behaviors:

<div class="contents" id="bkmrk-arcalignbehaviorbase"><div class="contents"><div class="textblock">- ArcAlignBehaviorBase2D deprecated, replaced by [ArcAlignBehavior](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_arc_align_behavior.html "Base Class. 2D Class aligns child nodes in a circular layout. Provides properties for the radius...")
- TouchIndicationBehavior2D and TouchIndicationBehavior3D deprecated, replaced by [TouchIndicationBehavior](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_touch_indication_behavior.html "changes the position of a node in the scene so the node's origin appears on the screen under the curr...")
- PositionProcessValueBehavior2D and PositionProcessValueBehavior3D deprecated, replaced by PositionProcessValueBehavior 
    - property TranslationAxis has been renamed to TranslationAxis2D, a new property TranslationAxis3D has been introduced
- RotateProcessValueBehavior2D and RotateProcessValueBehavior3D deprecated, replaced by RotateProcessValueBehavior 
    - property RotationAxis added
- ScaleProcessValueBehavior2D deprecated, replaced by ScaleProcessValueBehavior 
    - property IsScalingAlongXEnabled has been renamed to ScaleAlongX
    - property IsScalingAlongYEnabled has been renamed to ScaleAlongY
    - new property ScaleAlongZ added
    - property VectorXY has been renamed to ScaleVector2D
    - new property ScaleVector3D added
- TranslateProcessValueBehavior2D and TranslateProcessValueBehavior3D deprecated, replaced by TranslateProcessValueBehavior 
    - property VectorXY (Vector2) has been replaced by MultipliedVector (Vector3)
- TrackPositionProcessValueBehavior2D and TrackPositionProcessValueBehavior3D deprecated, replaced by [TrackPositionProcessValueBehavior](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_track_position_process_value_behavior.html "Translates drag events along a horizontal or vertical track into values in normalized range (0...")
- AlphaProcessValueBehavior2D and AlphaProcessValueBehavior3D deprecated, replaced by [AlphaProcessValueBehavior](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_alpha_process_value_behavior.html "Expects a Float value as a ProcessValueEvent and sets the Alpha value by the received value...")
- ColorActionBehavior2D deprecated, replaced by [ColorActionBehavior](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_color_action_behavior.html "Sets the color of a 2D node with a Color effect attached (e.g. BitmapBrushColorBlend or SolidColorBru...")
- EffectColorBehavior2D deprecated, replaced by [EffectColorBehavior](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_effect_color_behavior.html "Sets the color of a 2D node with a Color effect attached (e.g. BitmapBrushColorBlend or SolidColorBru...")
- ImageActionBehavior2D deprecated, replaced by [ImageActionBehavior](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_image_action_behavior.html "When triggered by an InvokeActionEvent, sets an Image to a Render Node.")
    - property Texture has been added
- SetImageBehavior2D deprecated, replaced by [SetImageBehavior](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_set_image_behavior.html "Sets the Image of a Render Node and provides the Image as a property for Controls.")
    - new property Textures added
- TextBehavior2D deprecated, replaced [TextBehavior](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_text_behavior.html "TextBehavior modifies the Text of a TextNode or CanvasText and provides the Text as property for Cont...")
- ZoomProcessValueBehavior2D deprecated, replaced by [ZoomProcessValueBehavior](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_zoom_process_value_behavior.html "Expects a Float value between 0 and 1 (inclusive) as an event. Applies scale and alpha on children of...").
- ScrollbarBehavior2D and ScrollbarBehavior3D deprecated, replaced by [ScrollbarBehavior](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_scrollbar_behavior.html "ScrollbarBehavior Reflects the position of the scrollable behavior. Eg. ListBehavior2D.")
- SwitchActionBehavior2D deprecated, replaced by [SwitchActionBehavior](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_switch_action_behavior.html "If invoked by a TriggerBehavior, enables/disables Child nodes corresponding to the value and the beha...")
- SwitchImageProcessValueBehavior2D deprecated, replaced by [SwitchImageProcessValueBehavior](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_switch_image_process_value_behavior.html "Sets an image on a Render Node based on an float index received as ProcessValueEvent.")
    - property RenderNode has been renamed to TargetNode
    - new property Textures added
- SwitchRangeProcessValueBehavior2D deprecated, replaced by [SwitchRangeProcessValueBehavior](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_switch_range_process_value_behavior.html "Enables/Disables Child nodes corresponding to the received value and the behavior settings...")

</div></div></div>Further changes:

<div class="contents" id="bkmrk-constructor-clipping"><div class="contents"><div class="textblock">- Constructor ClippingSetterTraverser(const Candera::Rectangle&amp; clippingArea, Candera::Node2D&amp; node) has been deprecated 
    - Please use ClippingSetterTraverser(const Candera::Rectangle&amp; clippingArea, Candera::AbstractNodePointer&amp; node) instead
- [PropertyProviderBehaviorBase](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_property_provider_behavior_base.html "[PropertyProviderBehaviorBase_Declaration]"): properties Texture, Appearance, Value have been added

---

</div></div></div>#### ControlTouchSession considers Camera for sorting

In the past the camera was not considered by the touch handling. This resulted in ambiguous touched controls.

The [ControlTouchSession](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_control_touch_session.html "The ControlTouchSession handles TouchEvents and emits several, more specific Events like the HoveredE...") has to sort behaviors according their "visual" order to assure, that touch inputs are forwarded to the "nearest" touchable behaviors. For this purpose a sub-struct [ControlTouchSession::TouchedBehavior](http://dev.doc.cgistudio.at/APILINK/struct_cgi_studio_control_1_1_control_touch_session_1_1_touched_behavior.html "Structure to keep together a behavior and a camera for touch handling. The camera is required for the...") has been introduced. The camera will be used to retrieve the according Candera::RenderTarget. Consequently HW layer order, SW Layer order, surface id and camera sequence number are considered during sorting of behaviors.

Each behavior-camera pair will be treated separately, thus a behavior rendered by two cameras will be distinguished for each camera.

Beside the internal handling in the [ControlTouchSession](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_control_touch_session.html "The ControlTouchSession handles TouchEvents and emits several, more specific Events like the HoveredE...") also the touch related events (TouchEvent, [ClickEvent](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_click_event.html "ClickEvent Input Event generated from ControlTouchSession and dispatched from the clicked Control..."), [PressedEvent](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_pressed_event.html "PressedEvent Input Event generated from ControlTouchSession and dispatched from the pressed Control..."), [DragDropEvent](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_drag_drop_event.html "DragDropEvent Input Event which is yet not used from the ControlTouchSession.") and [HoverEvent](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_hover_event.html "HoverEvent Input Event generated from ControlTouchSession and dispatched from the hovered Control...")) have been extended by a touched camera. The old constructors have been deprecated. Please use the one with the additional camera instead.

For the same reason also [KeyboardFocusManager](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_keyboard_focus_manager.html "The KeyboardFocusManager is the central point for managing the keyboard focus. Custom implementation ...") has been enhanced by new methods [KeyboardFocusManager::SetFocused(const Candera::AbstractNodePointer&amp; node, const Candera::AbstractCameraPointer&amp; camera)](http://dev.doc.cgistudio.at/APILINK/group___behaviors_common.html#ga68c8da301430bf57ffa877113d36c5cb) and [KeyboardFocusManager::GetFocusedCamera()](http://dev.doc.cgistudio.at/APILINK/group___behaviors_common.html#ga7c69f0c94f3bfc4b5ddff20d732bd299). Please also use the SetFocused with the extra camera parameter in future.

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

</div></div></div>#### Implementation of geometric and tab order focus navigation

A new event class [KeyboardFocusNavigationEvent](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_keyboard_focus_navigation_event.html "Send the KeyboardFocusNavigationEvent to the keyboard focused control to change the keyboard focus ac...") has been added to reflect navigation input like a rotary input to navigate between the visual controls. Furthermore the controls will use the new RegisterNavigation and DeregisterNavigation interface of the [KeyboardFocusManager](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_keyboard_focus_manager.html "The KeyboardFocusManager is the central point for managing the keyboard focus. Custom implementation ...") to register themselves for the navigation.

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

</div></div></div>#### An interface has been added to extend the ControlTouchSession by gesture detectors

The detection of Click, press/release and drag&amp;drop has been transformed into such a gesture detector. Futhermore, a gesture detector for swipe/flick and a gesture detector for transformations (rotate, pan and pinch) has been added.

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

</div></div></div>#### Further minor changes

<div class="contents" id="bkmrk-the-return-value-of-"><div class="contents"><div class="textblock">- The return value of EventToMessageBridge::PostAsMessage has been changed to an enum type to reflect the exact outcome of the Post and to reduce the logging to errors only.
- A Getter/Setter interface has been added to the [ControlTouchSession](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_control_touch_session.html "The ControlTouchSession handles TouchEvents and emits several, more specific Events like the HoveredE...") to enable/disable the consumption of touch events by the [ControlTouchSession](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_control_touch_session.html "The ControlTouchSession handles TouchEvents and emits several, more specific Events like the HoveredE..."). If the touch event is not consumed the [Courier](http://dev.doc.cgistudio.at/APILINK/namespace_courier.html) Touch Session will forward the touch messages to all widgets in the old touch handling style as message.

---

</div></div></div>#### Property Provider supports Value

<div class="contents" id="bkmrk-property-provider-%28p"><div class="contents"><div class="textblock">- Property Provider ([PropertyProviderBehavior](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_property_provider_behavior.html "Offers to set a property of a selectable type. These property can then be used for other Behaviors (e...")) supports Value variant type
- Send Value As Event has now PropertyReference that can be set to Other and point to Property Provider

---

</div></div></div>#### SelectionGroup memory leak patched

<div class="contents" id="bkmrk-patched-selectiongro"><div class="contents"><div class="textblock">- Patched SelectionGroup memory leak when creating new [ChangeSelectionEvent](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_change_selection_event.html "ChangeSelectionEvent is sent to a SelectionGroupBehavior with the Identifier of the currently selecte...")

---

</div></div></div>#### Arithmetic operation behavior created

<div class="contents" id="bkmrk-arithmetic-operation-0"><div class="contents"><div class="textblock">- Arithmetic operation behavior ([ArithmeticProcessValueBehavior](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_arithmetic_process_value_behavior.html "ArithmeticProcessValueBehavior allows to perform simple arithmetic operations on provided values...")) can be placed in ProcessValue chain to perform simple arithmetic operations on provided values.
- It allows to perform addition, subtraction, multiplication and division operations on the passed value.

---

</div></div></div>#### Send ChangeValueEvent on ProcessValueEvent behavior created

<div class="contents" id="bkmrk-%3Csend-changevalueeve"><div class="contents"><div class="textblock">- &lt;Send [ChangeValueEvent](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_change_value_event.html "Received by a ValueBehavior to change the value. Value can be absolute or relative (will be added)...") on ProcessValueEvent&gt; ([SendChangeValueOnProcessValueEventBehavior](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_send_change_value_on_process_value_event_behavior.html "Action Behavior which sends an ChangeValueEvent which is meant for changing the value of an Value Beh...")) can be used as a termination of ProcessValue chain to invoke value change on connected control
- This Behavior sends a [ChangeValueEvent](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_change_value_event.html "Received by a ValueBehavior to change the value. Value can be absolute or relative (will be added)...") which is meant for changing the value of an Value Behavior.
- The value can be absolute or relative (value will be added).

---

</div></div></div>#### ValueBehavior supports broadcast feature

<div class="contents" id="bkmrk-if-enabled%2C-valuebeh"><div class="contents"><div class="textblock">- If enabled, [ValueBehavior](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_value_behavior.html "Receives a ChangeValueEvent and passes its changed value to the receivers (Value Processing Behaviors...") can now be used to forward input value even if it is the same as current value stored in the behavior, which is useful in broadcasting context

---

</div></div></div>#### Provide Alignment adds Alignment property to the control

<div class="contents" id="bkmrk-provide-alignment-ca"><div class="contents"><div class="textblock">- Provide Alignment can be used to add a controllable Alignment property to the control
- [AlignmentBehavior](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_alignment_behavior.html "AlignmentBehavior Provides to set the horizontal and vertical alignment of a node. Especially for Control properties.") enables setting the horizontal and vertical alignment of a node.

---

</div></div></div>#### Tracks angle on touch with regard to control's base point

<div class="contents" id="bkmrk-track-angle-behavior"><div class="contents"><div class="textblock">- Track angle behavior allows to obtain the angle (from the position of user interaction) with regard to control's base point, using the mathematical function atan2.
- [TrackAngleProcessValueBehavior](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_track_angle_process_value_behavior.html "TrackAngleProcessValueBehavior listens to the touch of the selected node, returns the angle between p...") listens to the touch of the selected node, returns the angle between pressing, moving and releasing.

---

</div></div></div>#### DialBehavior supports Dial control

<div class="contents" id="bkmrk-dialbehavior-uses-th"><div class="contents"><div class="textblock">- [DialBehavior](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_dial_behavior.html "Dial behavior receives angle in ProcessValueEvent or value in ChangeValueEvent. It changes to appropr...") uses the angle obtained to calculate the rotation of the knob and change the position of the twisted knob to the value which is passed by ProcessValue function and [ValueChangedEvent](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_value_changed_event.html "ValueChangedEvent Event emitted from ValueBehavior when it changed its value.").
- [DialBehavior](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_dial_behavior.html "Dial behavior receives angle in ProcessValueEvent or value in ChangeValueEvent. It changes to appropr...") receives angle in ProcessValueEvent or value in [ChangeValueEvent](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_change_value_event.html "Received by a ValueBehavior to change the value. Value can be absolute or relative (will be added)..."). It changes to appropriate rotation for knob. Transmits the changed value through events ([ValueChangedEvent](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_value_changed_event.html "ValueChangedEvent Event emitted from ValueBehavior when it changed its value.") and ProcessValueEvent).

---

</div></div></div>#### CircularSlider behavior supports CircularSlider control

<div class="contents" id="bkmrk-circularsliderbehavi"><div class="contents"><div class="textblock">- [CircularSliderBehavior](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_circular_slider_behavior.html "CircularSliderBehavior that draws a blending mask and rotates thumb node.") draws a blending mask and rotates attached thumb.
- Creates respective effects on runtime, according to [Candera](http://dev.doc.cgistudio.at/APILINK/namespace_candera.html "[DataBinding_RefTypeSample]") build options.

---

</div></div></div>#### BreadcrumbBehavior supports breadcrumb control

<div class="contents" id="bkmrk-a-breadcrumb-is-used"><div class="contents"><div class="textblock">- A breadcrumb is used as a navigational aid in user interfaces.
- It allows users to keep track and maintain awareness of their location.
- Child nodes like Text, TextValue, TextButton or other nodes can react on [TextEvent](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_text_event.html "TextEvent provides the changed Text.") which is sent to child nodes.
- Also [BreadcrumbBehavior](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_breadcrumb_behavior.html "A breadcrumb used as a navigational aid in user interfaces. It allows users to keep track and maintai...") sends [ValueChangedEvent](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_value_changed_event.html "ValueChangedEvent Event emitted from ValueBehavior when it changed its value.") to the state machine with the last value that has been received.
- [BreadcrumbActionBehavior](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_breadcrumb_action_behavior.html "Action Behavior which sends breadcrumb action event allows you control the breadcrumb. The operations he can do are: add, go back one element and go back to the selected element.") allows you to control the breadcrumb.

---

</div></div></div>#### Provide Appearance adds Appearance property to the control

<div class="contents" id="bkmrk-provide-appearance-c"><div class="contents"><div class="textblock">- Provide Appearance can be used to add a controllable 3D Appearance property to the control
- Also extends Property Provider by Appearance.

---

</div></div></div>#### Control State Behavior properly handles Disabled State

Previously it was possible to still interact disabled Control via Inputs. In 3.7 this is not happening anymore (e.g. a disaled button cannot be pressed).

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

</div></div></div>#### Interpolate Value can be set to Instant Mode

Using the [ChangeInterpolationModeEvent](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_change_interpolation_mode_event.html "Class representing an event to set the animation mode for Interpolate Process Value Behavior...") in a Behavior allows to control which Mode the Interpolate Value will operate.

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

</div></div></div>#### Check Processed Value got extended by Almost Equal

Since comparing exact Float Values can lead to issues, the Check Processed Value Behavior now also supports checking if they are almost equal.

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

</div></div></div>#### TrackPositionProcessValue can be set to only react on dragging the Knob

Normally the TrackPositionProcessValue would also react to Inputs outside of the Knob Node. By enabling the Drag On Knob Only property, this can be prevented.

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

</div></div></div>#### Format String now supports all Variant Types

Format String did only support Integers and Float Values previously. This is now resolved.

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

</div></div></div>#### DrawerActionBehavior / "Change Drawer State"

The [DrawerActionBehavior](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_drawer_action_behavior.html "The DrawerActionBehavior sends a DrawerEvent to a DrawerBehavior. When the DrawerBehavior receives th...") has been created to support the new Drawer Control.

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

</div></div></div>#### ParticleEmitterBehavior / "Particle Emitter"

The ParticleEmitterBehavior has been created to support the new Point Sprite Emitter Control.

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

</div></div></div>#### Change Animation Mode by Event

The Animation Mode of [InterpolateProcessValueBehavior](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_interpolate_process_value_behavior.html "Expects a Float value as an event. InterpolateProcessValueBehavior holds an internal Float value...") can be changed by event now.

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

</div></div></div>#### Input Range for MapProcessValueBehavior

The [MapProcessValueBehavior](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_map_process_value_behavior.html "Expects a Float value as an event. Maps received value from one interval to another and returns it ba...") has been enhanced by an input range for use cases where parts of the input range of the ProcessValueEvent shall be processed by several [MapProcessValueBehavior](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_map_process_value_behavior.html "Expects a Float value as an event. Maps received value from one interval to another and returns it ba..."). The input range is optional. If not set, then the input range is taken from the ProcessValueEvent.

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

</div></div></div>#### RenderingEnabled Property now bindable

The property RenderingEnabled of behavior [RenderNodeBehavior](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_render_node_behavior.html "Sets rendering of a node enabled/disabled and provides the setting as a property for Controls...") / "Render Node" is now bindable.

<div class="contents" id="bkmrk-see-also%3A-rendernode"><div class="textblock"><dl class="see"><dt>**See also:**</dt><dd>[RenderNodeBehaviorBase::SetEnableRendering](http://dev.doc.cgistudio.at/APILINK/class_cgi_studio_control_1_1_render_node_behavior_base.html#a41ff9280f04d2ae83c532a6d168ab0db "[DataBinding_EnableRenderingPropertyGetterSetter]")</dd></dl></div></div>---

# FeatStd 3.7.0

# FeatStd Stream interface

An interface for streams has been added. This shall be an abstraction layer for read and write actions. A stream implementation has been added for TCP/IP: See also <span style="color: rgb(230, 126, 35);">[FeatStd TCP/IP reimplementation](https://doc316en.candera.eu/link/715#bkmrk-page-title)</span> Classes for buffered streaming and classes for primitive datatype reading and writing from and to streams have been added.

---

# FeatStd TCP/IP reimplementation

The concept of TCP/IP has been reworked. There are two new classes available: TcpServer and TcpClient. The server can open a port to listen to. A connection to such a server will return a stream which is of type TcpClient. The client can then be used for communication. This concept allows multiple connections at the same time with the convenient stream interface. The old TcpIp interface is still available and extended by an own socket concept. Using the old functions work completely equal to the old concept. Therefore, only one connection to the server is allowed. After the connection is lost, it cannot be reused. A shutdown is required.

<p class="callout info">The old TcpIp will be deprecated in future versione with an upgrade of Monitor to the new concept.</p>

---

# State machine

The state machine has been extended by a monitor feature. This feature can be enabled by the CMake flag: FEATSTD\_STATEMACHINE\_MONITOR\_ENABLED. This feature adds events on different locations to track changes within the state machine. Depending on the type of change a MonitorEvent or a TransitionMonitorEvent will be sent. To receive this events, an event listener has to be attached to Candera::Internal::StateMachineBehaviorData::State::GetMonitorEventSource().

---

# Generic Handle

Relevant functions were inlined, and a reverse lookup was added.

---

# Thread Priority

Class Thread was enhanced with the posibility to set/get the thread priority. This feature is implemented for Posix, Windows and Integrity platform. For all other platforms setting the priority has no effect. See FeatStd::Thread class for more details.

---

# Thread Nice Value

Class Thread was enhanced with the posibility to set/get the thread nice value. This feature is supported only for Linux Posix platforms. On all other platforms it has no effect. See FeatStd::Thread::SetNiceLevel for more details.

---

# Updated AsyncRequestDispatcherWorkerThread interface

Class [AsyncRequestDispatcherWorkerThread](http://dev.doc.cgistudio.at/APILINK/class_feat_std_1_1_async_request_dispatcher_worker_thread.html "The AsyncRequestDispatcherWorkerThread contains an AsyncRequestDispatcher and dispatches the request ...") was updated with the option to set the worker thread priority on thread start.

---

# SceneComposer 3.7

#### HMI Contract Synchronization Plugin

The Plugin does not show up anymore at startup if there are only unmachted items found. It only shows up if there are matched or missing items detected.

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

</div></div></div>#### Behavior Path

The generation of paths for behaviors has been enhanced. The behavior groups and behavior building blocks are considered for the path generation. This leads to understandable paths, expecially if the same behavior name is used inside multiple building blocks our behavior groups. The path is stored in the generated asset and has impact on application code that dealing with [Candera](http://dev.doc.cgistudio.at/APILINK/namespace_candera.html "[DataBinding_RefTypeSample]") paths for behaviors.

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

</div></div></div>#### Custom Properties Support

The plugins can register (extra) properties for solution items. These properties can be edited using the property grid and are stored in the solution files.In previous version of Scene Composer, these properties were called “Annotations”. In this new version, they were renamed to “Custom properties”, because a new Annotations concept was introduced.

The Type Manager service contains a method to register properties and another one to retrieve all properties registered (by the plugins) for a type. A reference to this service can be obtained by the plugin in the initialization method using the Unity Container. Plugin compatibility is preserved. The plugins can used the old methods, but they were marked as deprecated.

More information is available in chapter <span style="color:rgb(230,126,35);">[Custom Properties Support](https://doc316en.candera.eu/link/177#bkmrk-page-title)</span>.

---

# Controls 3.7

# New Controls

#### SpinBox Control

A spin box or spin button is a control that enables users to increase or decrease the number value by a specific increment (often by 1, 5 or 10) via clicking an up or down arrow button.

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

</div></div></div>#### IconButton Control

IconButton has similar functionality as the standard button, but in addition an icon (image) (defined via multiple properties per control state) is placed on top of the button.

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

</div></div></div>#### Dial Control

A dial is used to set a value within a specified range or to select between different options which are represented by the value of the dial. The control knob changes the value when user touches and turns it. Degree of rotation corresponds to the desired value change. The dial snaps into its predefined positions defined by its step size.

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

</div></div></div>#### Breadcrumb Control

A breadcrumb is used as a navigational aid in user interfaces. It allows users to keep track and maintain awareness of their location. A Breadcrumb shows the history/flow through the screen hierarchy.

Each breadcrumb element must contain BreadcrumbAction behavior for work properly. By default, we can use any element that contains the text control (for example: Text, TextValue or TextButton).

It is possible to create your own control for your own needs (e.g. adding a separator between items), that will work properly with the breadcrumb. Remember to add BreadcrumbAction behavior in own control.

When breadcrumb gets more values than it can display it will always collapse elements, replacing the display of the name with the ellipsis text (e.g. three dots). First element is always fully visible. Breadcrumb display can be controlled by event sent by BreadcrumbAction behavior.

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

</div></div></div>#### Circular Slider Control

Circular slider is a control that allows user to set the value using circular slide movement or directly indicate value on slider's bar. In default version the slider is a full circle, but using properties user easily can operate on e.g. quarter of the circle. In case of circular slider user can set the start angle and the end angle and map that to output value which is also customizable. Change of the value is indicated by slider's bar and (optional) thumb position.

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

</div></div></div>#### Drawer Control

The Drawer is a control that allows to hide content that can be shown again when it is needed.

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

</div></div></div>#### Point Sprite Emitter Control

The Point Sprite Emitter is control for 3D to make Particle Effects.

---

# Control Modifications

#### Text Value Control now supports Disabled color

Text Value Control now supports Disabled color and Enabled property (bindable through HandleControlState), so it can be directly used inside of other control supporting disabled state.

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

</div></div></div>#### Text Button Control now supports Text color and Data Binding

Text Value Control now supports text color as property. The following properties are now bindable:

<div class="contents" id="bkmrk-pressedimage-hovered"><div class="contents"><div class="textblock">- PressedImage
- HoveredColor
- DisabledColor

---

</div></div></div>#### Button Control: New Properties and Data Binding

The Button Control has following new properties:

<div class="contents" id="bkmrk-hoveredcolorproperty"><div class="contents"><div class="textblock">- HoveredColorPropertyReference
- HoveredColorPropertyProvider
- DisabledColorPropertyReference
- DisabledColorPropertyProvider

</div></div></div>The following properties are now bindable:

<div class="contents" id="bkmrk-pressedimage-hovered-0"><div class="contents"><div class="textblock">- PressedImage
- HoveredColor
- DisabledColor

---

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