# Candera Engine 3D

#### OpenGL ES 3.0 Support

##### RenderDevice for OpenGL ES 3.0

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

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

```
CgiAddDefinitions( -DCGIDEVICE_OPENGLES_30 )
```

##### Synchronization for OpenGL ES 3.0

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

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

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

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

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

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

**See also:**

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

---

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

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

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

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

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

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

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

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

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

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

---

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

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

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

---

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

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

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

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

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

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

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

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

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

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

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

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

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

The following reference shaders have been added:

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

</div></div>---