# CGI Studio 3.0.2

# Candera V3.0.2

Release Date: February 19, 2015  
  
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\_2\_0.

# Candera Engine Base

#### Resource Objects.

Large data buffers that need to be uploaded or that are rarely used are not longer directly stored in [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...") objects. Instead, a [ResourceDataHandle](http://dev.doc.cgistudio.at/APILINK/struct_candera_1_1_resource_data_handle.html "Object that stores information about access to large data buffers.") structure is stored, which can consist of one of :

<div class="contents" id="bkmrk-pointer-to-existing-"><div class="contents"><div class="textblock">- pointer to existing data, pointer to disposer function and size (backward compatible)
- information on where data can be found in asset and size
- custom information for custom ResourceProviders.

</div></div></div>ResourceObjects are objects that guarantee that during their lifetime, data referenced by a [ResourceDataHandle](http://dev.doc.cgistudio.at/APILINK/struct_candera_1_1_resource_data_handle.html "Object that stores information about access to large data buffers.") is available.

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

</div></div></div>#### Bitmap Resource Objects.

The pixel buffer is stored in the new [ResourceDataHandle](http://dev.doc.cgistudio.at/APILINK/struct_candera_1_1_resource_data_handle.html "Object that stores information about access to large data buffers.") structure. See migration guide for an example on how it can be used.

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

</div></div></div>#### Introduce C++ keyword override in Candera

In a method declaration, override specifies that the function must be overriding a base class method.

The keyword override is part of C++ 11 standard and supported by MSVC 11 and gcc 4.7. It helps to prevent unintentional newly created functions, e.g. due to typos, that are intended to override virtual base function.

---

# Candera Engine 3D

#### Shader: Support for precompiled shaders on all enabled platforms.

Uploading shader programs using [Shader::Upload](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_device_object.html#a844bff65eb133e28e8cfb4132b12d840) can now be done in a more flexible way. Until now it was only possible to upload either shader source or pre-compiled binaries, through a target-specific implementation of RenderDevice::CompileAndLoadShaderPair.

Now it is possible to upload (and compile if necessary) either shader source or shader binary objects. It is even possible to upload complete shader programs in order to avoid shader linking. How shader upload is done depends on the kind of data that is available in the asset and the capabilities of the target platform, however at runtime this is done completely transparent to the user.

Advantage is that the more flexible way of runtime created shader source code (as used in Candera2D implementations over OpenGL ES) is supported as well as using pre-compiled shaders to save execution time for compiling them. While using pre-compiled shaders on enabled platform is recommended due to performance reasons, still backward compatibility to existing solutions using uncompiled shaders is given.

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

</div></div></div>#### OpenGL ES 2 Reference Shaders relocated

The [Candera](http://dev.doc.cgistudio.at/APILINK/namespace_candera.html "[DataBinding_RefTypeSample]") OpenGL ES 2.0 [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...") language reference Shaders have been moved from   
 `<cgi_studio_candera>/src/Candera/Engine3D/ReferenceShaders`   
to `<cgi_studio_candera>/src/Candera/Engine3D/RefShaders/ESSL1`

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

</div></div></div>#### OpenGL ES 3 Reference Shaders

[Candera](http://dev.doc.cgistudio.at/APILINK/namespace_candera.html "[DataBinding_RefTypeSample]") now contains a set of reference Shaders for the OpenGL ES 3.0 [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...") language.   
`<cgi_studio_candera>/src/Candera/Engine3D/RefShaders/ESSL3`

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

</div></div></div>#### Shader Resource Objects.

Fragment and vertex shader data or access information is stored in the new [ResourceDataHandle](http://dev.doc.cgistudio.at/APILINK/struct_candera_1_1_resource_data_handle.html "Object that stores information about access to large data buffers.") structure. See migration guide for an example on how it can be used.

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

</div></div></div>#### VertexGeometry Resource Objects.

The vertex, index and element format arrays are stored in the new [ResourceDataHandle](http://dev.doc.cgistudio.at/APILINK/struct_candera_1_1_resource_data_handle.html "Object that stores information about access to large data buffers.") structure. See migration guide for an example on how it can be used.

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

</div></div></div>#### VertexBuffer primitive iteration.

Iteration over triangles is replaced by primitive iteration using a forward iterator, which is more performant, allows iteration over point and line primitives and supports multiple parallel iterations. See migration guide for an example on how it can be used.

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

</div></div></div>#### VertexBuffer vertex access.

Vertex access interface is moved from the [VertexBuffer](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_vertex_buffer.html "The VertexBuffer encapsulates the attributes of an uploaded VertexGeometry. It holds the actual handl...") to a separate class for better performance in case of vertex data accessed from assets. See migration guide for an example on how it can be used.

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

</div></div></div>#### 8/16/32 bit indexed array buffers.

[VertexGeometry](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_vertex_geometry.html "The VertexGeometry holds all vertex data of a mesh. VertexGeometry may be used also for multiple Vert...") accepts index buffers that consist of 8, 16 or 32 bit indexes. The configuration of index size can be set through the new values of BufferType enumeration: UInt8IndexedArrayBuffer, UInt16IndexedArrayBuffer and UInt32IndexedArrayBuffer.

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

</div></div></div>#### VertexElementFormat access.

VertexElementFormat access interface is moved from the [VertexGeometry](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_vertex_geometry.html "The VertexGeometry holds all vertex data of a mesh. VertexGeometry may be used also for multiple Vert...") to a separate class for better performance in case of vertex data accessed from assets. See migration guide for an example on how it can be used.

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

</div></div></div>#### VertexGeometryBuilder support for 8/16/32 bit index buffers.

[VertexGeometryBuilder](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_vertex_geometry_builder.html "The VertexGeometryBuilder helps effectively build VertexGeometry objects.") can create index buffers with values on 8, 16 or 32 bit, depending on the number of vetices, or on the configured format if explicitly set.

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

</div></div></div>#### BlendEquation Min/Max support.

Min/Max options were added to the [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...") BlendEquation, which specifies how a new pixel is combined with previously rendered pixels in the frame buffer.

---

# Candera Engine 2D

#### Node2D Listener support.

[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.") defines hooks that are called when certain [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...") functions are triggered, e.g. when a Node's transformation changes.

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

</div></div></div>#### Auto Arrangement for GridLayouter

Two new methods available for [GridLayouter](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_grid_layouter.html "GridLayouter arranges its elements in a grid. The amount of rows and columns for the grid must be spe..."):

<div class="contents" id="bkmrk-gridlayouter%3A%3Asetgri"><div class="textblock">- [GridLayouter::SetGridAutoArrangement](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_grid_layouter.html#a293779ec4c742e1edd4d762cfc55bd9d) : sets the grid autoArrangement. See method description for possible layouter arrangement settings.
- [GridLayouter::GetGridAutoArrangement](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_grid_layouter.html#a89e23963c01aa7776c367c077f669a10): retrieves the grid autoArrangement settings of a given node, set by [GridLayouter::SetGridAutoArrangement](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_grid_layouter.html#a293779ec4c742e1edd4d762cfc55bd9d) method.

</div></div>---

# Candera System

#### Different namespace than 'Candera' for EnumDataTypes

```
#define ENUM_DATA_TYPE_NAMESPACE MyNamespace        // <-- new!

#define ENUM_DATA_TYPE \
    ENUM_DATA_TYPE_BEGIN(SomeEnum) \
        ENUM_DATA_TYPE_ITEM(SomeItem0) \
        ENUM_DATA_TYPE_ITEM_VALUE(SomeItem1, 4) \
        ENUM_DATA_TYPE_ITEM(SomeItem2) \
        ENUM_DATA_TYPE_ITEM_INVISIBLE(InvisibleItem) \
        ENUM_DATA_TYPE_ITEM_VALUE(SomeItem3, 7) \
    ENUM_DATA_TYPE_END(SomeEnum)

#include <Candera/System/MetaInfo/EnumDataType.h>
```

If ENUM\_DATA\_TYPE\_NAMESPACE is defined before including EnumDataType.h, the enum 'SomeEnum' will be placed into MyNamespace. Without that (ENUM\_DATA\_TYPE\_NAMESPACE is not defined), SomeEnum is placed automatically into namespace [Candera](http://dev.doc.cgistudio.at/APILINK/namespace_candera.html "[DataBinding_RefTypeSample]").

---

# Candera Device

#### Uniform Location Caching

Introduced Uniform Caching for Auto uniforms to increase performance. Calls to GetUniformLocation now pass semantic instead of names as parameter, which speeds up comparison within cache.

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

</div></div></div>#### Maximum Element Index capability

RenderDeviceCapabilities structure contains a new field for the maximum value of vertex index that is supported by the device.

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

</div></div></div>#### RenderDevice::DrawVertexBuffer

RenderDevice::DrawVertexBuffer handles drawing of a [VertexBuffer](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_vertex_buffer.html "The VertexBuffer encapsulates the attributes of an uploaded VertexGeometry. It holds the actual handl..."), regadless of its configuration (primitive types, index formats, upload location).

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

</div></div></div>#### Added formats on DirectTextureImage

Additional formats have been added to DirectTextureImage::Format, unpacked RGBA and BGRA texture format.

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

</div></div></div>#### Shader Upload functions now support Upload of precompiled binary shaders.

The function RenderDevice::CompileAndLoadShaderPair only supports the fixed Upload of text or binary shader objects. In order to provide a more flexible handling of shader Upload, this function has been split up into RenderDevice::UploadShaderSource, RenderDevice::UploadShaderBinary and RenderDevice::UploadShaderBinaryProgram. Additionally the function RenderDevice::UploadShader has been added which calls the appropriate shader upload function transparently to the user. This interface enables the user to choose whether shader shall be available as binary or source shader objects.

---

# Candera AssetLoader

#### Resource Objects.

The font and raw resources are stored in the new [ResourceDataHandle](http://dev.doc.cgistudio.at/APILINK/struct_candera_1_1_resource_data_handle.html "Object that stores information about access to large data buffers.") structure. See migration guide for an example on how it can be used.

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

</div></div></div>#### Dispose after upload.

The dispose after upload feature of [DefaultAssetProvider](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_default_asset_provider.html "Implements objects handling mechanisms. It implements the interface AssetProvider and holds an asset ...") has become deprecated with the introduction of resource objects. The data is no longer attached to the device objects, but rather it is loaded from the asset upon necessity.

---

# TextEngine

#### Glyph Spacing

Glyph Spacing is available on [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 LayoutingOptions. This allows a user to correct the spacing between glyphs, by adding a specified number of pixels to the spaces between glyphs.

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

</div></div></div>#### BitmapFont Engine

BitmapFont Engine is available for usage inside Candera-based applications. A bitmap font is essentially an image file which consists of several characters images and a header that depicts the size and location of each character inside the image. Each bitmap font might contain several fonts - mainly one font face with multiple sizes. One advantage of utilizing bitmap fonts is that the rendering to the screen requires very little resources and since each character is represented as a sub-texture, they can be reused without requiring additional memory on the GPU.

In order to use BitmapFonts, the CMake variable **CANDERA\_FONTENGINE** should be changed to *BitmapFont*.

<div class="contents" id="bkmrk--0"><div class="contents"><div class="textblock"><dl class="note"></dl>  
</div></div></div><p class="callout info">Harbuzz Text Shaper cannot be used with BitmapFont, either ComplexScriptLib or NoShaping should be chosen.</p>

This font engine uses a proprietary format to describe glyph bitmaps and glyph meta info. In order to use a bitmap font, provide an implementation for [Candera::TextRendering::FontStore](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_text_rendering_1_1_font_store.html "FontStore is an abstract interface to retrieve font data The font store defines unique descriptor id ...").

[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...") fonts require memory mapped assets. So, when the faces are loaded in be sure the storageType is set correctly:

`<a class="el" href="http://dev.doc.cgistudio.at/APILINK/struct_candera_1_1_text_rendering_1_1_font_resource_descriptor.html">TextRendering::FontResourceDescriptor</a> descriptor.storageType = <a class="el" href="http://dev.doc.cgistudio.at/APILINK/struct_candera_1_1_text_rendering_1_1_font_resource_descriptor.html#aeec8ca3513881b96d67a1af6d5c4c9ddadd7f609d0583effb6a0de5767427464e" title="the font data can be retrieved from a memory location">TextRendering::FontResourceDescriptor::MemoryResource</a>; `

#### Generating Bitmap Fonts

The following steps need to be considered:

<div class="contents" id="bkmrk-install-bitmap-font-"><div class="contents"><div class="textblock">- Install [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...") Font Generator from [http://www.angelcode.com/products/bmfont/](http://www.angelcode.com/products/bmfont/)

</div></div></div>Open the application. From the Options menu:

<div class="contents" id="bkmrk-choose-font-settings"><div class="contents"><div class="textblock">- Choose Font Settings. Set as needed the settings for "Font", "Add font file", "Size" etc.

- Configure the Export Options. Set "Font descriptor" to "XML" and Textures to "png - Portable Network Graphics"

- "Save bitmap font as ..."

</div></div></div>Convert the resulted XML and PNG files to binary format using the internal tool BmFontCreator using the following command:

<div class="contents" id="bkmrk-bmfontcreator.-exe--"><div class="contents"><div class="textblock">- BmFontCreator. exe -o MyFont32.fbm \*.fnt

</div></div></div><p class="callout info">A bitmap font should be used at its native pixel size. However, they are scalable because of the use of bitmaps, but only scaling down is recommended. In case of up scaling, the visual quality will be reduced. Including separate font sizes for bitmap fonts is possible in order to achieve the best looking results.</p>

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

</div></div></div>#### Glyph Substitution

A substitution character may be set within the style with the interface Style::SetDefaultCodepoint. This character is used by the text engine in any of the following situations:

<div class="contents" id="bkmrk-when-a-glyph-is-miss"><div class="contents"><div class="textblock">- when a glyph is missing from the style. i.e. no matching font can provide that glyph. Exception make control character, like newline or LRE.
- when UTF8 buffers contain malformed characters.

---

</div></div></div>#### Character Glyph Mapping

GlyphBitmap now contains information about the position within the text from where the glyphs originated, and the location of the glyph within the font.

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

</div></div></div>#### Glyph Order

The order in which glyphs are generated may be controlled by setting a property within the TextRenderContext. See TextRenderContext::GlyphOrder for details. This is most relevant when doing preprocessing. OriginalGlyphOrder is intended for use when intermediate measurements of the text are required, for instance when truncating texts. OrigitnalChunkOrder is more performant then [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."), and is intende for measurements, where the order of the chunk is not important, for instance instance when computing layout rectangles. [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.") shall be used when rendering.

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

</div></div></div>#### Text Preprocessing

The text engine allows text to be preprocessed by providing utility the class PreprocessingContext. This interface is satisfied by two concrete instances.

<div class="contents" id="bkmrk-minimalpreprocessing"><div class="textblock">- MinimalPreprocessingContext - stores all the information need to be able to render the glyphs.
- MaximalPreprocessingContext - stores all the information available within the text renderer for each glyph. [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...") allows setting PreprocessedText instead of Text, to speed up text processing within the brush.

</div></div>---

# Migration Guide

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

<div class="contents" id="bkmrk-description-candera-"><div class="textblock"><table class="doxtable" style="width: 100%;"><tbody><tr><th style="width: 17.0581%;">Description</th><th style="width: 24.2274%;">[Candera](http://dev.doc.cgistudio.at/APILINK/namespace_candera.html "[DataBinding_RefTypeSample]") V3.0.1</th><th style="width: 58.7145%;">[Candera](http://dev.doc.cgistudio.at/APILINK/namespace_candera.html "[DataBinding_RefTypeSample]") V3.0.2</th></tr><tr><td style="width: 17.0581%;">[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...") Resource Object</td><td style="width: 24.2274%;">const void\* fragmentShader = shader-&gt;GetFragmentShader(); const void\* vertexShader = shader-&gt;GetVertexShader();</td><td style="width: 58.7145%;">[Shader::ShaderResource](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_shader.html#adc9f14dc8275b2abb28609a7ea0bb8bd) fragmentShaderResource(shader-&gt;GetFragmentShaderResourceHandle()); const void\* fragmentShader = fragmentShaderResource.GetData();

[Shader::ShaderResource](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_shader.html#adc9f14dc8275b2abb28609a7ea0bb8bd) vertexShaderResource(shader-&gt;GetVertexShaderResourceHandle()); const void\* vertexShader = vertexShaderResource.GetData();

NOTE: data is guaranteed only until ShaderResource objects are destroyed by going out of scope.

</td></tr><tr><td style="width: 17.0581%;">Vertex Geometry Resource Object</td><td style="width: 24.2274%;">bool isGeometryMutable = vg-&gt;IsMutable();

const void\* vertexArray = vg-&gt;GetVertexArray(); void\* vertexArray = vg-&gt;GetVertexArray();

const UINT16\* indexArray = vg-&gt;GetIndexBuffer(); UINT16\* indexArray = vg-&gt;GetIndexBuffer();

const [VertexGeometry::VertexElementFormat](http://dev.doc.cgistudio.at/APILINK/struct_candera_1_1_vertex_geometry_1_1_vertex_element_format.html)\* formatArray = vg-&gt;GetVertexElementFormat(); [VertexGeometry::VertexElementFormat](http://dev.doc.cgistudio.at/APILINK/struct_candera_1_1_vertex_geometry_1_1_vertex_element_format.html)\* formatArray = vg-&gt;GetVertexElementFormat();

</td><td style="width: 58.7145%;">bool isVertexArrayMutable = vg-&gt;GetVertexArrayResourceHandle().m\_isMutable; [VertexGeometry::VertexArrayResource](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_vertex_geometry.html#a6bb0785e3d01adc05bac96f615df99bb) vertexArrayResource(vg-&gt;GetVertexArrayResourceHandle()); const void\* vertexArray = vertexArrayResource.GetData(); void\* vertexArray = vertexArrayResource.GetMutableData();

bool isIndexArrayMutable = vg-&gt;GetIndexArrayResourceHandle().m\_isMutable; [VertexGeometry::IndexArrayResource](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_vertex_geometry.html#a86282aeeac4b75f80b1ab9edee896a50) indexArrayResource(vg-&gt;GetIndexArrayResourceHandle()); const void\* indexArray = indexArrayResource.GetData(); void\* indexArray = indexArrayResource.GetMutableData();

bool isFormatArrayMutable = vg-&gt;GetFormatArrayResourceHandle().m\_isMutable; [VertexGeometry::FormatArrayResource](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_vertex_geometry.html#a648c208a147f20358b1d02a3fc417b4c) formatArrayResource(vg-&gt;GetFormatArrayResourceHandle()); const [VertexGeometry::VertexElementFormat](http://dev.doc.cgistudio.at/APILINK/struct_candera_1_1_vertex_geometry_1_1_vertex_element_format.html)\* formatArray = formatArrayResource.GetData(); [VertexGeometry::VertexElementFormat](http://dev.doc.cgistudio.at/APILINK/struct_candera_1_1_vertex_geometry_1_1_vertex_element_format.html)\* formatArray = formatArrayResource.GetMutableData();

NOTE: data is guaranteed only until resource objects are destroyed by going out of scope.

</td></tr><tr><td style="width: 17.0581%;">[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...") Resource Object</td><td style="width: 24.2274%;">bool isMutable = bitmap-&gt;IsMutable(); const void\* pixels = bitmap-&gt;GetPixels(); void\* pixels = bitmap-&gt;GetPixels();</td><td style="width: 58.7145%;">bool isMutable = bitmap-&gt;GetPixelsResourceHandle().m\_isMutable; [Bitmap::PixelsResource](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_bitmap.html#a2cbf2631c53346423ad38747c9e29d0f) pixlesResource(bitmap-&gt;GetPixelsResourceHandle()); const void\* pixels = pixlesResource.GetData(); void\* pixels = pixlesResource.GetMutableData();

NOTE: data is guaranteed only until resource objects are destroyed by going out of scope.

</td></tr><tr><td style="width: 17.0581%;">Font/Raw Resource Object</td><td style="width: 24.2274%;">ResourceHandle fontHandle = provider-&gt;OpenFontResourceById(fontId); if (fontHandle != 0) { UInt32 fontSize = provider-&gt;GetResourceSize(fontHandle); const void\* fontAdress = provider-&gt;GetResourceAddress(fontHandle); provider-&gt;ReadResource(fontHandle, fontData, 0, fontSize); provider-&gt;CloseResource(fontHandle); }</td><td style="width: 58.7145%;">[ResourceDataHandle](http://dev.doc.cgistudio.at/APILINK/struct_candera_1_1_resource_data_handle.html "Object that stores information about access to large data buffers.") fontHandle = provider-&gt;GetFontResourceById(fontId); UInt32 fontSize = fontHandle.m\_size; const void\* fontAddress = ResourceData::GetAddress(fontHandle); ResourceData::CopyData(fontData, fontHandle, 0, fontSize);

NOTE: data is guaranteed only until resource objects are destroyed by going out of scope.

</td></tr><tr><td style="width: 17.0581%;">[VertexBuffer](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_vertex_buffer.html "The VertexBuffer encapsulates the attributes of an uploaded VertexGeometry. It holds the actual handl...") Primitive Iteration</td><td style="width: 24.2274%;">VertexBuffer\* vb; const VertexBuffer::Triangle\* triangle = vb-&gt;GetFirstTriangle(); while (triangle != 0) { UInt16 x = triangle-&gt;index\[0\]; UInt16 y = triangle-&gt;index\[1\]; UInt16 z = triangle-&gt;index\[2\]; triangle = vb-&gt;GetNextTriangle(); }</td><td style="width: 58.7145%;">VertexBuffer\* vb; for ([VertexBuffer::PrimitiveIterator](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_vertex_buffer.html#ad2b50cb0c10add8719aab668ac78706a) it = vb-&gt;GetPrimitiveIterator(); it.IsValid(); ++it) { const [VertexBuffer::Primitive](http://dev.doc.cgistudio.at/APILINK/struct_candera_1_1_vertex_buffer_1_1_primitive.html)&amp; primitive = \*it; UInt16 x = primitive.m\_index\[0\]; UInt16 y = primitive.m\_index\[1\]; UInt16 z = primitive.m\_index\[2\]; }</td></tr><tr><td style="width: 17.0581%;">[VertexBuffer](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_vertex_buffer.html "The VertexBuffer encapsulates the attributes of an uploaded VertexGeometry. It holds the actual handl...") Vertex access</td><td style="width: 24.2274%;">VertexBuffer\* vb; const void\* vertex = vb-&gt;GetVertex(0); void\* mutableVertex = vb-&gt;GetMutableVertex(0);</td><td style="width: 58.7145%;">[VertexAccessor](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_vertex_accessor.html) accessor([VertexAccessor](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_vertex_accessor.html)(\*vb-&gt;GetVertexGeometry())); const void\* vertex = accessor.GetVertex(0); void\* mutableVertex = accessor.GetMutableVertex(0);</td></tr><tr><td style="width: 17.0581%;">VertexElementFormat access</td><td style="width: 24.2274%;">VertexGeometry\* vg; bool isPosition = vg-&gt;DoesVertexUsageExistAtUsageIndex(VertexGeometry::Position, 0); const [VertexGeometry::VertexElementFormat](http://dev.doc.cgistudio.at/APILINK/struct_candera_1_1_vertex_geometry_1_1_vertex_element_format.html)\* positionElementFormat = vg-&gt;GetVertexElementFormatAtUsageAndUsageIndex(VertexGeometry::Position, 0);</td><td style="width: 58.7145%;">VertexGeometry\* vg; [ElementFormatAccessor](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_element_format_accessor.html) accessor = ElementFormatAccessor(\*vg); bool isPosition = (accessor.GetElementFormatByUsageAndIndex(VertexGeometry::Position, 0) != 0); const [VertexGeometry::VertexElementFormat](http://dev.doc.cgistudio.at/APILINK/struct_candera_1_1_vertex_geometry_1_1_vertex_element_format.html)\* positionElementFormat = accessor.GetElementFormatByUsageAndIndex(VertexGeometry::Position, 0);</td></tr><tr><td style="width: 17.0581%;">[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...") Upload</td><td style="width: 24.2274%;">const void\* fragmentShader = shader-&gt;GetFragmentShader(); const void\* vertexShader = shader-&gt;GetVertexShader(); Handle fragmentShaderHandle; Handle vertexShaderHandle; CompileAndLoadShaderPair(vertexShader, vertexShaderHandle, fragmentShader, fragmentShaderHandle);</td><td style="width: 58.7145%;">const void\* fragmentShader = shader-&gt;GetFragmentShader(); const void\* vertexShader = shader-&gt;GetVertexShader(); Handle fragmentShaderHandle; Handle vertexShaderHandle; [Shader::BuildType](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_shader.html#a06f170703f1baeb71dffd7cb9d645290) buildType; GetShaderBuildType(vertexShader, buildType); if (buildType == [Shader::ShaderSource](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_shader.html#a06f170703f1baeb71dffd7cb9d645290a44bb34d76f318ea9ccd702087be8da3a "Shader object is provided as source code.")) { UploadShaderSource(Shader::VertexShader, vertexShader, vertexShaderHandle); } else { ... } GetShaderBuildType(fragmentShader, buildType); if (buildType == [Shader::ShaderSource](http://dev.doc.cgistudio.at/APILINK/class_candera_1_1_shader.html#a06f170703f1baeb71dffd7cb9d645290a44bb34d76f318ea9ccd702087be8da3a "Shader object is provided as source code.")) { UploadShaderSource(Shader::FragmentShader, fragmentShader, fragmentShaderHandle); } else { ... }

Note: This is normally done transparently by [Candera](http://dev.doc.cgistudio.at/APILINK/namespace_candera.html "[DataBinding_RefTypeSample]").

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

</div></div>---

# CGI-Studio CMake Configuration

<div class="contents" id="bkmrk-the-cmake-macro-cgic"><div class="textblock">- The CMake macro `CgiCreateWidgetSet` now creates an empty WidgetSet if no additional widgets have been added.
- `-m32` has been added as default compiler flag for gcc builds to ensure compilation even on x64 gcc.
- With update of Attribute Caching the user variable CANDERA\_MAX\_SHADER\_ATTRIBUTE\_COUNT became obsolete and has been deleted.

</div></div>---

# Courier V3.0.2

#### 3.0.0-1 Message Processing

1\. New [Courier::Component::PostProcess](http://dev.doc.cgistudio.at/APILINK/class_courier_1_1_component.html#a70cb48090796e1584c43dadc228b41ab) method has been added. This method is called after a component has been processed. A custom component is able to react on each process of a component.

2\. New [Courier::MessageReceiver::Deactivate](http://dev.doc.cgistudio.at/APILINK/class_courier_1_1_message_receiver.html#a28698cf0881a3f6c363922ef435fceae) method has been added. This method deactivates the message receiver in the system. After calling this method the message router stops serving this receiver with appropriate messages (means the method Receive() is called). If a custom message receiver is used this method should be called before destroying the custom message receiver instance.

#### 3.0.0-2 Input Handling

New methods where added for setting custom names for GenericConsoleListener and PosixTerminalListener. These are:

<div class="contents" id="bkmrk-courier%3A%3Aplatform%3A%3Ae"><div class="contents"><div class="textblock">- Courier::Platform::ExtComm::Generic::GenericConsoleInputHandler::SetConsoleListenerName
- Courier::Platform::ExtComm::Posix::SetTerminalListenerName

</div></div></div>Corresponding getter methods were also provided.

#### 3.0.0-3 Camera Groups

Activation and enable /disable rendering for views have been reworked to fix different aspects related to handling views together with camera groups.

For this the following modifications have been made:

<div class="contents" id="bkmrk-new-courier%3A%3Acamerag"><div class="contents"><div class="textblock">- New Courier::CameraGroupHandler::OnViewInitContent method added for correctly initializing the cameras of a camera group, when their associated views are recreated.This method retrieves a camera if it has been lost, adds it to the camera group and makes all necessary settings for it to correctly be handled;
- New [Courier::ViewScene::ActivateForCamera](http://dev.doc.cgistudio.at/APILINK/class_courier_1_1_view_scene.html#a48b3645ccbb9c0b6b153174416f7df1d) method has been added. This method activates / deactivates the view for message receiving, regardless of its rendering state and manages a reference count for activation requests for a specific camera of the view;
- New [Courier::ViewScene::EnableRenderingForCamera](http://dev.doc.cgistudio.at/APILINK/class_courier_1_1_view_scene.html#a5fe0776a674be8ef7e57d614190f470d) method has been added. This method enables / disables rendering for the current ViewScene and a specific camera and manages a reference count for rendering requests for a specific camera of the view;
- [Courier::ViewScene::IsRenderingEnabled](http://dev.doc.cgistudio.at/APILINK/class_courier_1_1_view_scene.html#aa142f5e02fb0b888cc8fd6df0a566459 "Returns true if the view is enabled for rendering.") method has been moved from [Courier::ViewScene2D](http://dev.doc.cgistudio.at/APILINK/class_courier_1_1_view_scene2_d.html) and [Courier::ViewScene3D](http://dev.doc.cgistudio.at/APILINK/class_courier_1_1_view_scene3_d.html) to [Courier::ViewScene](http://dev.doc.cgistudio.at/APILINK/class_courier_1_1_view_scene.html). This method returns true if the view is enabled for rendering;
- New [Courier::ViewScene::OnActivate](http://dev.doc.cgistudio.at/APILINK/class_courier_1_1_view_scene.html#ac56020793e9554863bfb9317e0c46521 "Delegates ParentViewActivateEvent event to controller and widgets.") protected method has been added. This method delegates [Courier::ParentViewActivateEvent](http://dev.doc.cgistudio.at/APILINK/class_courier_1_1_parent_view_activate_event.html) event to controller and widgets;
- New protected methods [Courier::ViewScene2D::ActivateImpl](http://dev.doc.cgistudio.at/APILINK/class_courier_1_1_view_scene2_d.html#a122f6a3cc74b576aba5e8ef4ddfe2fe3 "Actual implementation for Activate method.") and [Courier::ViewScene3D::ActivateImpl](http://dev.doc.cgistudio.at/APILINK/class_courier_1_1_view_scene3_d.html#aa5e3eda50137b704603f8aaed429137c "Actual implementation for Activate method.") were added. These are actual implementations for [Courier::ViewScene2D::Activate](http://dev.doc.cgistudio.at/APILINK/class_courier_1_1_view_scene2_d.html#aeb5e48b53bb270b9e8dd07bf340053bd) and [Courier::ViewScene3D::Activate](http://dev.doc.cgistudio.at/APILINK/class_courier_1_1_view_scene3_d.html#ae624f0d5f3c71a88d84796fee0be58af) methods;
- New protected methods [Courier::ViewScene2D::EnableRenderingImpl](http://dev.doc.cgistudio.at/APILINK/class_courier_1_1_view_scene2_d.html#a76bb00cf2b91da4b825a2588306c610d "Actual implementation for EnableRendering method.") and [Courier::ViewScene3D::EnableRenderingImpl](http://dev.doc.cgistudio.at/APILINK/class_courier_1_1_view_scene3_d.html#a95a666f578939a61a20d5d0aaad79912 "Actual implementation for EnableRendering method.") were added. These are actual implementations for [Courier::ViewScene2D::EnableRendering](http://dev.doc.cgistudio.at/APILINK/class_courier_1_1_view_scene2_d.html#a0603cccb06512496d893a6bead11f3ee) and [Courier::ViewScene3D::EnableRendering](http://dev.doc.cgistudio.at/APILINK/class_courier_1_1_view_scene3_d.html#a097edf636d2b0bca71b7b1faeb871292) methods;
- [Courier::ViewScene2D::EnableRenderingScene](http://dev.doc.cgistudio.at/APILINK/class_courier_1_1_view_scene2_d.html#af01949d476f82b96562a2831bac2283d "Sets the rendering state for the actual scene from Candera.") and [Courier::ViewScene3D::EnableRenderingScene](http://dev.doc.cgistudio.at/APILINK/class_courier_1_1_view_scene3_d.html#a6e10f35132dad4621ac5b369efc06201 "Sets the rendering state for the actual scene from Candera.") have been made protected;
- New protected and virtual method Courier::ViewScene::UpdateCameraRenderingState has been added. This is overridden by [Courier::ViewScene2D::UpdateCameraRenderingState](http://dev.doc.cgistudio.at/APILINK/class_courier_1_1_view_scene2_d.html#ae8129c9b4d6c49401a04ad2d0a3e96e9 "Sets the rendering state for the actual camera from Candera.") and [Courier::ViewScene3D::UpdateCameraRenderingState](http://dev.doc.cgistudio.at/APILINK/class_courier_1_1_view_scene3_d.html#a509a23b0e41811d9799e77da275ec605 "Sets the rendering state for the actual camera from Candera.") methods. These methods set the rendering state for the actual camera from [Candera](http://dev.doc.cgistudio.at/APILINK/namespace_candera.html "[DataBinding_RefTypeSample]").

</div></div></div>#### 3.0.0-4 Render Configuration

A new option [Courier::RenderConfiguration::ClearRenderTargetOnUpload](http://dev.doc.cgistudio.at/APILINK/class_courier_1_1_render_configuration.html#a49104c37f8ef234bfca94746cf5b6682) was added for configurating the rendering.

This option enables / disables the automatic clearing of the render targets on the next upload. By default, to keep backwards compatibility, this option is set to false.

The interface of [Courier::Gdu](http://dev.doc.cgistudio.at/APILINK/class_courier_1_1_gdu.html) class has also been modified to support the above change. Therefore [Courier::Gdu::Upload](http://dev.doc.cgistudio.at/APILINK/class_courier_1_1_gdu.html#a2419f979ca7664419440ac22eca2ae9a) and [Courier::Gdu::Unload](http://dev.doc.cgistudio.at/APILINK/class_courier_1_1_gdu.html#a30d257c41178651051c286ed9a91a7bd) now have a *renderer* parameter which is a pointer to [Courier::Renderer](http://dev.doc.cgistudio.at/APILINK/class_courier_1_1_renderer.html).

Also [Courier::Renderer::DeleteRenderJobs](http://dev.doc.cgistudio.at/APILINK/class_courier_1_1_renderer.html#a40825a3c3844b5ecaf5e438bdf593b59 "Delete Render Jobs.") method has been made public, so it can be used by [Courier::Gdu](http://dev.doc.cgistudio.at/APILINK/class_courier_1_1_gdu.html) class.

#### 3.0.0-5 Visualization

1\. A new Courier::ViewAction::ClearCameraViewports is added to the [Courier::ViewReqMsg](http://dev.doc.cgistudio.at/APILINK/class_courier_1_1_view_req_msg.html). This new Courier::ViewAction::ClearCameraViewports will only clear the areas that are rendered by the cameras of the view.

For this, the following changes have been made:

<div class="contents" id="bkmrk-a-new-enumeration-va"><div class="contents"><div class="textblock">- a new enumeration value has been added to Courier::ViewAction;
- a new *onlyCameraViewPorts* parameter has been added to [Courier::View::Clear](http://dev.doc.cgistudio.at/APILINK/class_courier_1_1_view.html#a8d7347965d20aa57371fa685f95adee0 "Implements the clear method."), [Courier::ViewContainer::Clear](http://dev.doc.cgistudio.at/APILINK/class_courier_1_1_view_container.html#a22f8a41477ac34720ace08026dd85939), [Courier::ViewScene2D::Clear](http://dev.doc.cgistudio.at/APILINK/class_courier_1_1_view_scene2_d.html#afee7fa73cc3043a68ed866d46dc6e654) and [Courier::ViewScene3D::Clear](http://dev.doc.cgistudio.at/APILINK/class_courier_1_1_view_scene3_d.html#ac66ed19dfb71c85fe63c714d0c5e9dd8) methods.

</div></div></div>2\. New [Courier::Renderer::SetIs2DRequest](http://dev.doc.cgistudio.at/APILINK/class_courier_1_1_renderer.html#adfd52f5dac364b299454bf651998b384 "Sets flag for determining if load/unload on a certain layer is requested by 2D View.") method has been added to [Courier::Renderer](http://dev.doc.cgistudio.at/APILINK/class_courier_1_1_renderer.html), which sets a flag for determining if load/unload on a certain layer is requested by a 2D View. Corresponding getter method was also provided.

---

# FeatStd V3.0.2

# FeatStd CMake

#### Location of generated files

Automatically generated configuration headers are generated into `CMAKE_CURRENT_BINARY_DIR/gensrc/FeatStd` (i.e in most cases `CMAKE_BINARY_DIR/FeatStd/gensrc/FeatStd`) instead of `CMAKE_BINARY_DIR/gensrc/FeatStd`. Automatic CGI-Studio includes paths have been adapted to accommodate this change.

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

</div></div></div>#### Add custom config header file

New build setting FEATSTD\_CUSTOM\_CONFIG to specifiy a custom config header file that gets included on top of generated file `CMAKE_CURRENT_BINARY_DIR/gensrc/FeatStd/Config.h`. This allows to add or override global CGI system settings (e.g. macros).

Example:

`FEATSTD_CUSTOM_CONFIG="path/to/MyConfig.h"`

MyConfig.h

```
#define FEATSTD_DEBUG_ASSERT(condition) \
    if (!(condition)) { \
        FeatStd::Internal::Generic::assert((#condition), __FILE__, __LINE__, false); \
    }
```

---

# FeatStd Diagnostics

#### Debug Macros

The following macros can get overridden for custom needs:

<div class="contents" id="bkmrk-featstd_debug_break-"><div class="contents"><div class="textblock">- FEATSTD\_DEBUG\_BREAK
- FEATSTD\_DEBUG\_ASSERT
- FEATSTD\_DEBUG\_FAIL
- FEATSTD\_DEBUG\_REENTRANCE\_GUARD

</div></div></div>If these macros are not defined in custom header file the default implementation is taken, e.g. (code as in FeatStd/Diagnostics/Debug.h)

```
#if !defined(FEATSTD_DEBUG_ASSERT)              // <-- allows to override in custom header file
    #if defined(FEATSTD_DEBUG)

        <a class="code" href="http://dev.doc.cgistudio.at/APILINK/group___f_e_a_t_s_t_d___u_t_i_l_s.html#gae2fcecfbe2727007268d9e72e2335b44" title="do ... while (false) favored">FEATSTD_LINT_MACRO_WHILEFALSE</a>(FEATSTD_DEBUG_ASSERT)
        #define FEATSTD_DEBUG_ASSERT(condition) \
                do { \
                    if (!(condition)) { \
                        if (FeatStd::Diagnostics::DebugControl::Assert((#condition), \
                                                                      __FILE__, __LINE__)) { \
                            FEATSTD_OS_BREAK(); \
                                       } \
                                } \
                            FEATSTD_SUPPRESS_MSC_WARNING_FOR_NEXT_EXPRESSION(4127, while (false) accepted) \
                        } while (false)
    #else
        #define FEATSTD_DEBUG_ASSERT(condition)
    #endif
#endif
```

<div class="contents" id="bkmrk-see-also%3A-add-custom"><div class="textblock"><div class="fragment">  
</div><dl class="see"><dt>**See also:**</dt><dd><span style="color: rgb(230, 126, 35);">[Add custom config header file](https://doc316en.candera.eu/link/962#bkmrk-add-custom-config-he)</span></dd></dl></div></div>---

# FeatStd Util

#### UTF8 String Constructor

The [String](http://dev.doc.cgistudio.at/APILINK/class_feat_std_1_1_string.html) class constructor now has an optional parameter, to specify whether the length of a non-null-terminated UTF8 string with multi-byte characters is given in bytes or in code-points.

---

# SceneComposer V3.0.2

# Restructuring Sources

There were 2 major changes in source code organization:

<div class="contents" id="bkmrk-decoupling%3A-schost-p"><div class="contents"><div class="textblock">- Decoupling: SCHost projects which produce the SCHost.lib were decoupled from cgi\_studio\_scenecomposer to a separate repository. Also, some projects were renamed: CommonLib -&gt; Common, SCHostLib -&gt; SCHostApp, SCImporterLib -&gt; MffWriter. The new repository is called cgi\_studio\_schost and can be configured and build separately to obtain the SCHost.lib required by custom environments that create SCHost.dll files.

- 2D/3D separation: SCHost can be compiled/built now with only CANDERA\_2D\_ENABLED or CANDERA\_3D\_ENABLED, as required by the selected platform.

---

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

# SceneComposer Usability Improvements

#### Clear Mode Palette

A ClearMode Palette View was added in Solution Options. By using it ("File" &gt; "Solution Options"), it is possible to create different clear mode items which can be saved and later reused.

<div class="contents" id="bkmrk-see-also%3A-clear-mode"><div class="contents"><div class="textblock"><div drawio-diagram="2977"><img src="https://doc316en.candera.eu/uploads/images/drawio/2023-03/drawing-7-1677743928.png" alt=""/></div>

<dl class="see"><dt>**See also:**</dt><dd>- <span style="color: rgb(230, 126, 35);">[Clear Mode](https://doc316en.candera.eu/link/55#bkmrk-page-title)</span> in SceneComposer User Manual

</dd></dl>---

</div></div></div>#### Delete Items

In the ImportView of the "New Solution Wizard", it is now possible to delete selected items before they are imported.

<div class="contents" id="bkmrk-see-also%3A-new-soluti"><div class="contents"><div class="textblock"><div drawio-diagram="2978"><img src="https://doc316en.candera.eu/uploads/images/drawio/2023-03/drawing-7-1677743956.png" alt=""/></div>

<dl class="see"><dt>**See also:**</dt><dd>- <span style="color: rgb(230, 126, 35);">[New Solution Wizard](https://doc316en.candera.eu/link/39#bkmrk-page-title)</span> in SceneComposer User Manual

</dd></dl>---

</div></div></div>#### Delete Perspective

The option "Delete Current Perspective" inside "View-&gt;New Perspective" is available (at the same level with "New Perspective").

<div class="contents" id="bkmrk-see-also%3A-perspectiv"><div class="contents"><div class="textblock"><div drawio-diagram="2979"><img src="https://doc316en.candera.eu/uploads/images/drawio/2023-03/drawing-7-1677743986.png" alt=""/></div>

<dl class="see"><dt>**See also:**</dt><dd>- <span style="color: rgb(230, 126, 35);">[Perspective Support](https://doc316en.candera.eu/link/9#bkmrk-perspective-support)</span> in SceneComposer User Manual

</dd></dl>---

</div></div></div>#### Search Option for Hot-Keys Panel

Due to the huge number of available hot-keys (shortcuts), it could be difficult to find a specific hot-key. In order to solve this issue, a search option was made available in the upper side of the Hot Key panel ("Help" &gt; "Hot Keys").

<div class="contents" id="bkmrk-see-also%3A-shortcut-c"><div class="contents"><div class="textblock"><div drawio-diagram="2980"><img src="https://doc316en.candera.eu/uploads/images/drawio/2023-03/drawing-7-1677744016.png" alt=""/></div>

<dl class="see"><dt>**See also:**</dt><dd>- <span style="color: rgb(230, 126, 35);">[Shortcut Customization](https://doc316en.candera.eu/link/96#bkmrk-page-title)</span> in SceneComposer User Manual

</dd></dl>---

</div></div></div>#### Export Only Used Translatable Texts

In the previous versions of SC, the unreferenced text ids were not exported into the asset. To allow the export of all the text ids even if they are not used, a special option was added. Entitled "Export Only Used Translatable Texts" this option is available as a check box in the "File" &gt; "Preferences" &gt; "Plugins" &gt; "Cgi-Studio Translator" panel.

<div class="contents" id="bkmrk-"><div class="contents"><div class="textblock"><div drawio-diagram="2981"><img src="https://doc316en.candera.eu/uploads/images/drawio/2023-03/drawing-7-1677744043.png" alt=""/></div>

</div></div></div>If the option is used there will be exported just the referenced text ids. If the option is left as default, all the text ids will be exported into the asset.

<p class="callout info">The plugin does not work in order to receive the notifications if the "Enable Plugin Notification" is not used when the asset is generated.</p>

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

</div></div></div>#### Tab Size Configuration

Tab size configuration was added for the Shader Editor panel ("View" &gt; "Editors" &gt; "Shader Editor"). The user can change the tab size and decide if tabs should be changed to spaces from "File" &gt; "Preferences" &gt; "Environment". (Mantis issue 3724)

<div class="contents" id="bkmrk-see-also%3A-tab-option"><div class="contents"><div class="textblock"><div drawio-diagram="2982"><img src="https://doc316en.candera.eu/uploads/images/drawio/2023-03/drawing-7-1677744079.png" alt=""/></div>

<dl class="see"><dt>**See also:**</dt><dd>- <span style="color: rgb(230, 126, 35);">[Tab Options](https://doc316en.candera.eu/link/92#bkmrk-tab-options)</span> in SceneComposer User Manual

</dd></dl>---

</div></div></div>#### FTC Command Wildcard Support

If there are many files (i.e. images) which must be imported, an improvement - wildcard support - can help us to import them simultaneously. For instance, if in a folder we have many graphic files named "img1.png", "img2.png", "img3.png" ..., and if it is necessary to import all of them we can do this by specifying through the wildcard (\*) that we need to import simultaneously the files which respect the rule "img\*.png".

To use the FTCCmd extension for wildcard image import with option to set bitmap attributes, following option is available:

```
FTCCmd ... /BitmapProfile <bitmap_profile_full_name>
```

<div class="contents" id="bkmrk-see-also%3A-ftccmd-ope"><div class="contents"><div class="textblock"><div class="fragment">  
</div><dl class="see"><dt>**See also:**</dt><dd>- <span style="color: rgb(230, 126, 35);">[FTCCmd Operation Mode Import](https://doc316en.candera.eu/link/178#bkmrk-ftccmd-operation-mod-0)</span> in SceneComposer User Manual

</dd></dl>---

</div></div></div>#### Composites with Widgets

Created composites will include widgets with the observation that the widgets will be included only if are binded to a node from the created composite.

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

</div></div></div>#### Minor Improvements

<div class="contents" id="bkmrk-check%2Funcheck-licens"><div class="textblock">- **Check/Uncheck Licenses.** The possibility to check/uncheck all licences was added.

- **Buttons Highlighted.** The "New Solution Dialog" wizard and the "Change Platform" wizard have a button highlighted in order to suggest the action performed by pressing the Enter key.

- **New Tooltip.** The tooltip for the "Revert" button in SCML Editor was modified to "Discard changes".

- **Time Displayed.** Now, the "Output" panel also displays the time of any given message.

- **Screen Space Management.** In order to improve the screen space, the "Close" button ("X") has become visible only for the selected panels.

- **Zoom Buttons.** The zoom buttons in "Animation Curve Editor" were replaced for better visibility.

- **New Options in Scene Editor.** The possibility to Delete, Copy and Paste was added in Scene Editor through context menu commands and keyboard.

- **Reorganizing Multiple Selected Elements.** When reorganizing multiple selected elements, the focus will be kept on all elements that were multi-selected.

- **New Shortcuts.** New key shortcuts were added for the tree panels. CTRL + A selects all the visible elements and SHIFT + Home / End selects all the elements which are in visible level from the selected item to the beginning / end.

- **Just One Animation.** The same animated property isn't allowed to be added for the same object in an animation more than one time, on the same channel (Mantis 3722).

- **New Commands Added.** Export All and Clear commands are available in the context menu in CanderaLoggingView (Mantis 4593).

- **Activate Animation.** Double click on an AnimationNode from an AnimationGroup will activate the corresponding animation (Mantis 5049).

- **Rearrange the Perspectives.** The user has the possibility to rearrange the perspectives through drag and drop.

- **Text Search in Shader Editor.** A new option was added in the Text Search panel, for search only in the ShaderEditor (Mantis 4637).

- **Launcher Improvements.** SCLauncher horizontal scroll bar is now hidden. Vertical scrollbar is always visible and active. All checked requirements are now shown and the text has been reformatted (Mantis 2820).

</div></div>---