#ifndef _EVAS_H
# error You shall not include this header directly
#endif

EAPI extern const Eo_Event_Description _EVAS_CANVAS_EVENT_FOCUS_IN;
EAPI extern const Eo_Event_Description _EVAS_CANVAS_EVENT_FOCUS_OUT;
EAPI extern const Eo_Event_Description _EVAS_CANVAS_EVENT_RENDER_FLUSH_PRE;
EAPI extern const Eo_Event_Description _EVAS_CANVAS_EVENT_RENDER_FLUSH_POST;
EAPI extern const Eo_Event_Description _EVAS_CANVAS_EVENT_OBJECT_FOCUS_IN;
EAPI extern const Eo_Event_Description _EVAS_CANVAS_EVENT_OBJECT_FOCUS_OUT;
EAPI extern const Eo_Event_Description _EVAS_CANVAS_EVENT_RENDER_PRE;
EAPI extern const Eo_Event_Description _EVAS_CANVAS_EVENT_RENDER_POST;
EAPI extern const Eo_Event_Description _EVAS_CANVAS_EVENT_DEVICE_CHANGED;
EAPI extern const Eo_Event_Description _EVAS_CANVAS_EVENT_AXIS_UPDATE;
EAPI extern const Eo_Event_Description _EVAS_CANVAS_EVENT_VIEWPORT_RESIZE;

// Callbacks events for use with Evas canvases
#define EVAS_CANVAS_EVENT_FOCUS_IN (&(_EVAS_CANVAS_EVENT_FOCUS_IN))
#define EVAS_CANVAS_EVENT_FOCUS_OUT (&(_EVAS_CANVAS_EVENT_FOCUS_OUT))
#define EVAS_CANVAS_EVENT_RENDER_FLUSH_PRE (&(_EVAS_CANVAS_EVENT_RENDER_FLUSH_PRE))
#define EVAS_CANVAS_EVENT_RENDER_FLUSH_POST (&(_EVAS_CANVAS_EVENT_RENDER_FLUSH_POST))
#define EVAS_CANVAS_EVENT_OBJECT_FOCUS_IN (&(_EVAS_CANVAS_EVENT_OBJECT_FOCUS_IN))
#define EVAS_CANVAS_EVENT_OBJECT_FOCUS_OUT (&(_EVAS_CANVAS_EVENT_OBJECT_FOCUS_OUT))
#define EVAS_CANVAS_EVENT_RENDER_PRE (&(_EVAS_CANVAS_EVENT_RENDER_PRE))
#define EVAS_CANVAS_EVENT_RENDER_POST (&(_EVAS_CANVAS_EVENT_RENDER_POST))
#define EVAS_CANVAS_EVENT_DEVICE_CHANGED (&(_EVAS_CANVAS_EVENT_DEVICE_CHANGED))
#define EVAS_CANVAS_EVENT_AXIS_UPDATE (&(_EVAS_CANVAS_EVENT_AXIS_UPDATE))
#define EVAS_CANVAS_EVENT_VIEWPORT_RESIZE (&(_EVAS_CANVAS_EVENT_VIEWPORT_RESIZE))

#include "canvas/evas_signal_interface.eo.h"
#include "canvas/evas_draggable_interface.eo.h"
#include "canvas/evas_clickable_interface.eo.h"
#include "canvas/evas_scrollable_interface.eo.h"
#include "canvas/evas_selectable_interface.eo.h"
#include "canvas/evas_zoomable_interface.eo.h"

// Interface classes links
#define EVAS_SMART_SIGNAL_INTERFACE     EVAS_SIGNAL_INTERFACE_INTERFACE
#define EVAS_SMART_CLICKABLE_INTERFACE  EVAS_CLICKABLE_INTERFACE_INTERFACE
#define EVAS_SMART_SCROLLABLE_INTERFACE EVAS_SCROLLABLE_INTERFACE_INTERFACE
#define EVAS_SMART_DRAGGABLE_INTERFACE  EVAS_DRAGGABLE_INTERFACE_INTERFACE
#define EVAS_SMART_SELECTABLE_INTERFACE EVAS_SELECTABLE_INTERFACE_INTERFACE
#define EVAS_SMART_ZOOMABLE_INTERFACE   EVAS_ZOOMABLE_INTERFACE_INTERFACE

#include "canvas/evas_canvas.eo.h"

/**
 * @ingroup Evas_Object_Rectangle
 *
 * @{
 */
#include "canvas/evas_rectangle.eo.h"
/**
 * @}
 */

/**
 * @ingroup Evas_Object_Text
 *
 * @{
 */
#include "canvas/evas_text.eo.h"
/**
 * @}
 */

/**
 * @ingroup Evas_Object_Textblock
 *
 * @{
 */
#include "canvas/evas_textblock.eo.h"
/**
 * @}
 */

/**
 * @ingroup Evas_Object_Textgrid
 *
 * @{
 */
#include "canvas/evas_textgrid.eo.h"
/**
 * @}
 */

/**
 * @ingroup Evas_Object_Line
 *
 * @{
 */
#include "canvas/evas_line.eo.h"
/**
 * @}
 */

/**
 * @ingroup Evas_Object_Polygon
 *
 * @{
 */
#include "canvas/evas_polygon.eo.h"
/**
 * @}
 */

/**
 * @ingroup Evas_Smart_Object_Group
 *
 * @{
 */
#include "canvas/evas_object_smart.eo.h"
/**
 * @}
 */

/**
 * @ingroup Evas_Smart_Object_Clipped
 *
 * @{
 */
#include "canvas/evas_smart_clipped.eo.h"
/**
 * @}
 */

/**
 * @ingroup Evas_Object_Box
 *
 * @{
 */
#include "canvas/evas_box.eo.h"
/**
 * @}
 */

/**
 * @ingroup Evas_Object_Table
 *
 * @{
 */
#include "canvas/evas_table.eo.h"
/**
 * @}
 */

/**
 * @ingroup Evas_Object_Grid
 *
 * @{
 */
#include "canvas/evas_grid.eo.h"
/**
 * @}
 */

#include "canvas/evas_common_interface.eo.h"

#include "canvas/evas_object.eo.h"

#include "canvas/evas_out.eo.h"


 /**
 * @defgroup Evas_3D Evas 3D Extensions
 *
 * Evas extension to support 3D rendering.
 *
 * @ingroup Evas
 */

/**
 * @page evas_canvas3d_main Evas 3D
 *
 * @since 1.10
 *
 * @section toc Table of Contents
 *
 * @li @ref evas_canvas3d_intro
 * @li @ref evas_canvas3d_example
 *
 * @section evas_canvas3d_intro Introduction
 *
 * Evas 3D is an extension to support 3D scene graph rendering into 2D Evas
 * canvas supporting typicall tree-based scene graph manipulation and other 3D
 * graphics rendering techniques.
 *
 * Evas 3D provides 3D objects which are used for describing 3D scene and APIs
 * to connect the scene with an evas image object so that the scene is rendered
 * on that image object.
 *
 * Contruction of a 3D scene is process of locating desired cameras, lights and
 * meshes in the scene. Typically the scene is structured with some hierarchical
 * data structure. Evas 3D support n-ary tree structure for describing the
 * scene. Node is used to build the tree representation of the scene. Other
 * objects, like camera, light and mesh can be located in the scene by being
 * contained in a node.
 *
 * Like other 3D graphics engine, Evas 3D support standard 3D rendering method
 * like flat shading, phong shading and normal map and other features like
 * texture mapping, triangle meshes.
 *
 * Besides all the traditional 3D rendering things, one of the key feature of
 * the Evas 3D is that it is able to use existing evas objects as textures
 * inside of the 3D scene. "Existing evas objects" means all the EFL widgets
 * and applications. By supporting this, it is easy to make 3D version of an
 * application without modifying the original source that much.
 *
 * Also, 3D scene can be located on the canvas naturally stacked with existing
 * evas objects. This can make it possible putting 3D things into existing 2D
 * application layouts.
 *
 * @section evas_canvas3d_example Introductory Example
 *
 * @include evas-3d-cube.c
 */

/**
 * @defgroup Evas_Canvas3D_Types Types & Enums
 * @ingroup Evas_3D
 *
 * Primitive type definitions and enumations.
 */

/**
 * @defgroup Evas_Canvas3D_Object Generic 3D Object Descriptions
 * @ingroup Evas_3D
 *
 * Evas 3D object is a generic type of all evas 3D objects like scene, node,
 * camera, light, mesh, texture and material. Evas 3D object is basically
 * reference counted. Any successful function call on an object which make a
 * reference to an another object will increase the reference count. When the
 * reference count gets to 0, the object will be actually deleted.
 *
 * Any modifications are automatically propagated to other objects referencing
 * the modified objects. As a result, if the scene object is set to modified
 * state, all image objects having the scene as a rendering source are marked
 * as dirty, so that rendering will be updated at next frame. But all these
 * things are done internally, so feel free to forget about calling some kind
 * of update functions.
 */

/**
 * @defgroup Evas_Canvas3D_Scene Scene Object
 * @ingroup Evas_3D
 *
 * A scene represents a captured image of a scene graph through its viewing
 * camera. A scene can be set to an image object to be displayed on the Evas
 * canvas by using evas_object_image_scene_set() function.
 */

/**
 * @defgroup Evas_Canvas3D_Node Node Object
 * @ingroup Evas_3D
 *
 * A node is used for hierarchical construction of a scene graph. Evas 3D
 * provides n-ary tree structure for the scene graph construction. A node has
 * its position, orientation and scale. Other objects, like camera, light and
 * mesh can be contained in a node to be located in a 3D space.
 */

/**
 * @defgroup Evas_Canvas3D_Camera Camera Object
 * @ingroup Evas_3D
 *
 * A camera object is used for taking a picture of a scene graph. A camera
 * object itself is just a set of properties on how the camera should take the
 * picture (like focus length and film size of the real world cameras). To be
 * able to take a shot of the scene, a camera should be located in the scene, so
 * that it has its viewing position and direction. It is done by containing the
 * camera on a node. If one wants to locate several cameras having same
 * properties, instead of creating multiple cameras, just create one camera and
 * multiple nodes containing the camera and locate them at each desired position
 * and direction. Just for convinience, use evas_canvas3d_node_position_set() to move
 * the camera to desired position and use evas_canvas3d_node_look_at_set() to adjust
 * the viewing direction of the camera.
 */

/**
 * @defgroup Evas_Canvas3D_Light Light Object
 * @ingroup Evas_3D
 *
 * A light object represents a set of properties of a light source. Evas 3D
 * provides standard reflection model that of ambient, diffuse and specular
 * reflection model. Also, Evas 3D support 3 types of light model, directional,
 * point and spot light. Light position and direction is determined by the node
 * containing the light.
 */

/**
 * @defgroup Evas_Canvas3D_Mesh Mesh Object
 * @ingroup Evas_3D
 *
 * A mesh object is a set of information on a visible geometrical object like
 * character model, terrain or other structures and entities. Evas 3D support
 * key-frame-based mesh animation, so a mesh can have multiple frames and each
 * frame has its own material and geometric data. Like other data objects, a
 * mesh can be located on a scene by being contained in a node. The mesh is
 * transformed from its modeling coordinate space into the node's coordinate
 * space. Also, the frame number is saved in the containing node. So, one can
 * locate multiple nodes having same mesh object with different animation frame
 * and transform. Unlike camera and light object, multiple meshes can be
 * contained in a single node.
 */

/**
 * @defgroup Evas_Canvas3D_Primitive Primitive Object
 * @ingroup Evas_3D
 *
 * A primitive object is an object with necessary data for creating meshes with ptimitive shapes.
 * Data from a primitive can be set to Evas_Canvas3D_Mesh by using evas_canvas3d_mesh_from_primitive_set()
 * function.
 */

/**
 * @defgroup Evas_Canvas3D_Texture Texture Object
 * @ingroup Evas_3D
 *
 * A texture object is an image represents material of surfaces. A texture can
 * be set to a slot of Evas_Canvas3D_Material by using evas_canvas3d_material_texture_set()
 * function. The data of a texture can be loaded from memory, file and other
 * Evas_Object.
 */

/**
 * @defgroup Evas_Canvas3D_Material Material Object
 * @ingroup Evas_3D
 *
 * A material object represents properties of surfaces. Evas 3D defines the
 * properties with 5 material attributes, ambient, diffuse, specular emission
 * and normal. Each attribute have its color value and texture map. Materials
 * are used to determine the color of mesh surfaces.
 */

/**
 * @typedef Evas_Real
 *
 * Floating-point data type
 *
 * Evas 3D use its own floating-point type. Even though it's a standard IEEE
 * 754 floating-point type always use Evas_Real for the type safety. Double
 * precision and fixed-point types will be useful but it's not supported yet.
 *
 * @since 1.10
 * @ingroup Evas_Canvas3D_Types
 */
typedef double   Evas_Real;


/**
 * @typedef Evas_Canvas3D_Object
 *
 * 3D Object object handle
 *
 * @since 1.10
 * @ingroup Evas_Canvas3D_Object
 */
typedef Eo    Evas_Canvas3D_Object;

#define _EVAS_CANVAS3D_OBJECT_EO_CLASS_TYPE

/**
 * @typedef Evas_Canvas3D_Scene
 *
 * Scene object handle
 *
 * @since 1.10
 * @ingroup Evas_Canvas3D_Scene
 */
typedef Eo    Evas_Canvas3D_Scene;

#define _EVAS_CANVAS3D_SCENE_EO_CLASS_TYPE

/**
 * @typedef Evas_Canvas3D_Node
 *
 * Node object handle
 *
 * @since 1.10
 * @ingroup Evas_Canvas3D_Node
 */
typedef Eo     Evas_Canvas3D_Node;

#define _EVAS_CANVAS3D_NODE_EO_CLASS_TYPE

/**
 * @typedef Evas_Canvas3D_Camera
 *
 * Camera object handle
 *
 * @since 1.10
 * @ingroup Evas_Canvas3D_Camera
 */
typedef Eo   Evas_Canvas3D_Camera;

#define _EVAS_CANVAS3D_CAMERA_EO_CLASS_TYPE

/**
 * @typedef Evas_Canvas3D_Light
 *
 * Light object handle
 *
 * @since 1.10
 * @ingroup Evas_Canvas3D_Light
 */
typedef Eo    Evas_Canvas3D_Light;

#define _EVAS_CANVAS3D_LIGHT_EO_CLASS_TYPE

/**
 * @typedef Evas_Canvas3D_Mesh
 *
 * Mesh object handle
 *
 * @since 1.10
 * @ingroup Evas_Canvas3D_Mesh
 */
typedef Eo     Evas_Canvas3D_Mesh;

#define _EVAS_CANVAS3D_MESH_EO_CLASS_TYPE

/**
 * @typedef Evas_Canvas3D_Texture
 *
 * Texture object handle
 *
 * @since 1.10
 * @ingroup Evas_Canvas3D_Texture
 */
typedef Eo    Evas_Canvas3D_Texture;

#define _EVAS_CANVAS3D_TEXTURE_EO_CLASS_TYPE

/**
 * @typedef Evas_Canvas3D_Material
 *
 * Material object handle
 *
 * @since 1.10
 * @ingroup Evas_Canvas3D_Material
 */
typedef Eo     Evas_Canvas3D_Material;

#define _EVAS_CANVAS3D_MATERIAL_EO_CLASS_TYPE

/**
 * @typedef Evas_Canvas3D_Primitive
 *
 * Primitive object handle
 *
 * @since 1.15
 * @ingroup Evas_Canvas3D_Primitive
 */
typedef Eo     Evas_Canvas3D_Primitive;

#define _EVAS_CANVAS3D_PRIMITIVE_EO_CLASS_TYPE

/**
 * @typedef Evas_Canvas3D_Surface_Func
 *
 * User-defined parametric surface function.
 * Used for easy creation of custom surfaces as a primitive.
 *
 * @since 1.15
 * @ingroup Evas_Canvas3D_Primitive
 */
typedef void (Evas_Canvas3D_Surface_Func)(Evas_Real *out_x,
                                    Evas_Real *out_y,
                                    Evas_Real *out_z,
                                    Evas_Real a,
                                    Evas_Real b);

/**
 * Type of 3D Object
 *
 * @since 1.10
 * @ingroup Evas_Canvas3D_Type
 */
typedef enum _Evas_Canvas3D_Object_Type
{
   EVAS_CANVAS3D_OBJECT_TYPE_INVALID = 0,
   EVAS_CANVAS3D_OBJECT_TYPE_SCENE,
   EVAS_CANVAS3D_OBJECT_TYPE_NODE,
   EVAS_CANVAS3D_OBJECT_TYPE_CAMERA,
   EVAS_CANVAS3D_OBJECT_TYPE_LIGHT,
   EVAS_CANVAS3D_OBJECT_TYPE_MODEL,
   EVAS_CANVAS3D_OBJECT_TYPE_MESH,
   EVAS_CANVAS3D_OBJECT_TYPE_TEXTURE,
   EVAS_CANVAS3D_OBJECT_TYPE_MATERIAL,
   EVAS_CANVAS3D_OBJECT_TYPE_PRIMITIVE,
} Evas_Canvas3D_Object_Type;

/**
 * State of the Evas 3D
 *
 * @since 1.10
 * @ingroup Evas_Canvas3D_Type
 */
typedef enum _Evas_Canvas3D_State
{
   EVAS_CANVAS3D_STATE_MAX = 16,

   EVAS_CANVAS3D_STATE_ANY = 0,

   EVAS_CANVAS3D_STATE_SCENE_ROOT_NODE = 1,
   EVAS_CANVAS3D_STATE_SCENE_CAMERA_NODE,
   EVAS_CANVAS3D_STATE_SCENE_BACKGROUND_COLOR,
   EVAS_CANVAS3D_STATE_SCENE_SIZE,
   EVAS_CANVAS3D_STATE_SCENE_SHADOWS_ENABLED,
   EVAS_CANVAS3D_STATE_SCENE_UPDATED,

   EVAS_CANVAS3D_STATE_TEXTURE_DATA = 1,
   EVAS_CANVAS3D_STATE_TEXTURE_WRAP,
   EVAS_CANVAS3D_STATE_TEXTURE_FILTER,

   EVAS_CANVAS3D_STATE_MATERIAL_ID = 1,
   EVAS_CANVAS3D_STATE_MATERIAL_COLOR,
   EVAS_CANVAS3D_STATE_MATERIAL_TEXTURE,

   EVAS_CANVAS3D_STATE_MESH_VERTEX_COUNT = 1,
   EVAS_CANVAS3D_STATE_MESH_FRAME,
   EVAS_CANVAS3D_STATE_MESH_MATERIAL,
   EVAS_CANVAS3D_STATE_MESH_TRANSFORM,
   EVAS_CANVAS3D_STATE_MESH_VERTEX_DATA,
   EVAS_CANVAS3D_STATE_MESH_INDEX_DATA,
   EVAS_CANVAS3D_STATE_MESH_VERTEX_ASSEMBLY,
   EVAS_CANVAS3D_STATE_MESH_SHADE_MODE,
   EVAS_CANVAS3D_STATE_MESH_FOG,
   EVAS_CANVAS3D_STATE_MESH_BLENDING,
   EVAS_CANVAS3D_STATE_MESH_ALPHA_TEST,
   EVAS_CANVAS3D_STATE_MESH_COLOR_PICK,

   EVAS_CANVAS3D_STATE_CAMERA_PROJECTION = 1,

   EVAS_CANVAS3D_STATE_LIGHT_AMBIENT = 1,
   EVAS_CANVAS3D_STATE_LIGHT_DIFFUSE,
   EVAS_CANVAS3D_STATE_LIGHT_SPECULAR,
   EVAS_CANVAS3D_STATE_LIGHT_SPOT_DIR,
   EVAS_CANVAS3D_STATE_LIGHT_SPOT_EXP,
   EVAS_CANVAS3D_STATE_LIGHT_SPOT_CUTOFF,
   EVAS_CANVAS3D_STATE_LIGHT_ATTENUATION,
   EVAS_CANVAS3D_STATE_LIGHT_PROJECTION,

   EVAS_CANVAS3D_STATE_NODE_TRANSFORM_POSITION = 1,
   EVAS_CANVAS3D_STATE_NODE_TRANSFORM_ORIENTATION,
   EVAS_CANVAS3D_STATE_NODE_TRANSFORM_SCALE,
   EVAS_CANVAS3D_STATE_NODE_MESH_GEOMETRY,
   EVAS_CANVAS3D_STATE_NODE_MESH_MATERIAL,
   EVAS_CANVAS3D_STATE_NODE_MESH_FRAME,
   EVAS_CANVAS3D_STATE_NODE_MESH_SHADE_MODE,
   EVAS_CANVAS3D_STATE_NODE_MESH_MATERIAL_ID,
   EVAS_CANVAS3D_STATE_NODE_LIGHT,
   EVAS_CANVAS3D_STATE_NODE_CAMERA,
   EVAS_CANVAS3D_STATE_NODE_PARENT_POSITION,
   EVAS_CANVAS3D_STATE_NODE_PARENT_ORIENTATION,
   EVAS_CANVAS3D_STATE_NODE_PARENT_SCALE,
   EVAS_CANVAS3D_STATE_NODE_MEMBER,
   EVAS_CANVAS3D_STATE_NODE_PARENT_BILLBOARD,
} Evas_Canvas3D_State;

/**
 * Transform space
 *
 * @since 1.10
 * @ingroup Evas_Canvas3D_Types
 */
typedef enum _Evas_Canvas3D_Space
{
   EVAS_CANVAS3D_SPACE_LOCAL = 0, /**< Local coordinate space */
   EVAS_CANVAS3D_SPACE_PARENT,    /**< Parent coordinate space */
   EVAS_CANVAS3D_SPACE_WORLD,     /**< World coordinate space */
} Evas_Canvas3D_Space;

/**
 * Types of a node
 *
 * @since 1.10
 * @ingroup Evas_Canvas3D_Types
 */
typedef enum _Evas_Canvas3D_Node_Type
{
   EVAS_CANVAS3D_NODE_TYPE_NODE = 0, /**< Node with no items */
   EVAS_CANVAS3D_NODE_TYPE_CAMERA,   /**< Node which can contain camera object */
   EVAS_CANVAS3D_NODE_TYPE_LIGHT,    /**< Node which can contain light object */
   EVAS_CANVAS3D_NODE_TYPE_MESH,     /**< Node which can contain mesh objects */
} Evas_Canvas3D_Node_Type;

/**
 * Types of node orientation
 *
 * @since 1.13
 * @ingroup Evas_Canvas3D_Types
 */
typedef enum _Evas_Canvas3D_Node_Orientation_Type
{
   /**< Node with no orientation properties */
   EVAS_CANVAS3D_NODE_ORIENTATION_TYPE_NONE = 0,
   /**< Node orientation is given as a point to look at and a vector
        that indicates the angle at which the subject is looking at the point */
   EVAS_CANVAS3D_NODE_ORIENTATION_TYPE_LOOK_AT,
   /**< Node orientation is given as id of another part to look at and a vector
        that indicates the angle at which the subject is looking at the part */
   EVAS_CANVAS3D_NODE_ORIENTATION_TYPE_LOOK_TO,
   /**< Node orientation is given as an angle and an axis to rotate around */
   EVAS_CANVAS3D_NODE_ORIENTATION_TYPE_ANGLE_AXIS,
   /**< Node orientation is given as a quaternion */
   EVAS_CANVAS3D_NODE_ORIENTATION_TYPE_QUATERNION,
} Evas_Canvas3D_Node_Orientation_Type;

/**
 * Vertex attribute IDs
 *
 * @since 1.10
 * @ingroup Evas_Canvas3D_Types
 */
typedef enum _Evas_Canvas3D_Vertex_Attrib
{
   EVAS_CANVAS3D_VERTEX_POSITION = 0,   /**< Vertex position */
   EVAS_CANVAS3D_VERTEX_NORMAL,         /**< Vertex normal */
   EVAS_CANVAS3D_VERTEX_TANGENT,        /**< Vertex tangent (for normal mapping) */
   EVAS_CANVAS3D_VERTEX_COLOR,          /**< Vertex color */
   EVAS_CANVAS3D_VERTEX_TEXCOORD,       /**< Vertex texture coordinate */
} Evas_Canvas3D_Vertex_Attrib;

/**
 * Index formats
 *
 * @since 1.10
 * @ingroup Evas_Canvas3D_Types
 */
typedef enum _Evas_Canvas3D_Index_Format
{
   EVAS_CANVAS3D_INDEX_FORMAT_NONE = 0,       /**< Indexing is not used */
   EVAS_CANVAS3D_INDEX_FORMAT_UNSIGNED_BYTE,  /**< Index is of type unsigned byte */
   EVAS_CANVAS3D_INDEX_FORMAT_UNSIGNED_SHORT  /**< Index is of type unsigned short */
} Evas_Canvas3D_Index_Format;

/**
 * Frustum modes
 *
 * @since 1.12
 * @ingroup Evas_Canvas3D_Types
 */
typedef enum _Evas_Canvas3D_Frustum_Mode
{
   EVAS_CANVAS3D_FRUSTUM_MODE_BSPHERE,
   EVAS_CANVAS3D_FRUSTUM_MODE_AABB,
   EVAS_CANVAS3D_FRUSTUM_MODE_CENTRAL_POINT
} Evas_Canvas3D_Frustum_Mode;


/**
 * Vertex assembly modes
 *
 * Vertex assembly represents how the vertices are organized into geometric
 * primitives.
 *
 * @since 1.10
 * @ingroup Evas_Canvas3D_Types
 */
typedef enum _Evas_Canvas3D_Vertex_Assembly
{
   /**< A vertex is rendered as a point */
   EVAS_CANVAS3D_VERTEX_ASSEMBLY_POINTS = 0,
   /**< Two vertices are organized as a line */
   EVAS_CANVAS3D_VERTEX_ASSEMBLY_LINES,
   /**< Vertices are organized as a connected line path */
   EVAS_CANVAS3D_VERTEX_ASSEMBLY_LINE_STRIP,
   /**< Vertices are organized as a closed line path */
   EVAS_CANVAS3D_VERTEX_ASSEMBLY_LINE_LOOP,
   /**< Three vertices are organized as a triangle */
   EVAS_CANVAS3D_VERTEX_ASSEMBLY_TRIANGLES,
   /**< Vertices are organized as connected triangles */
   EVAS_CANVAS3D_VERTEX_ASSEMBLY_TRIANGLE_STRIP,
   /**< Vertices are organized as a triangle fan */
   EVAS_CANVAS3D_VERTEX_ASSEMBLY_TRIANGLE_FAN,
} Evas_Canvas3D_Vertex_Assembly;

typedef enum _Evas_Canvas3D_Blend_Func
{
   /**< The scale factors for color components is (0, 0, 0, 0)*/
   EVAS_CANVAS3D_BLEND_ZERO = 0,
   /**< The scale factors for color components is (1, 1, 1, 1)*/
   EVAS_CANVAS3D_BLEND_ONE,
   /**< The scale factors for color components is (Rs/kR, Gs/kG, Bs/kB, As/kA)*/
   EVAS_CANVAS3D_BLEND_SRC_COLOR,
   /**< The scale factors for color components is (1, 1, 1, 1) - (Rs/kR, Gs/kG, Bs/kB, As/kA)*/
   EVAS_CANVAS3D_BLEND_ONE_MINUS_SRC_COLOR,
   /**< The scale factors for color components is (Rd/kR, Gd/kG, Bd/kB, Ad/kA)*/
   EVAS_CANVAS3D_BLEND_DST_COLOR,
   /**< The scale factors for color components is (1, 1, 1, 1) - (Rd/kR, Gd/kG, Bd/kB, Ad/kA)*/
   EVAS_CANVAS3D_BLEND_ONE_MINUS_DST_COLOR,
   /**< The scale factors for color components is (As/kA, As/kA, As/kA, As/kA)*/
   EVAS_CANVAS3D_BLEND_SRC_ALPHA,
   /**< The scale factors for color components is (1, 1, 1, 1) - (As/kA, As/kA, As/kA, As/kA)*/
   EVAS_CANVAS3D_BLEND_ONE_MINUS_SRC_ALPHA,
   /**< The scale factors for color components is (Ad/kA, Ad/kA, Ad/kA, Ad/kA)*/
   EVAS_CANVAS3D_BLEND_DST_ALPHA,
   /**< The scale factors for color components is (1, 1, 1, 1) - (Ad/kA, Ad/kA, Ad/kA, Ad/kA)*/
   EVAS_CANVAS3D_BLEND_ONE_MINUS_DST_ALPHA,
   /**< The scale factors for color components is (Rc, Gc, Bc, Ac)*/
   EVAS_CANVAS3D_BLEND_CONSTANT_COLOR,
   /**< The scale factors for color components is (1, 1, 1, 1) - (Rc, Gc, Bc, Ac)*/
   EVAS_CANVAS3D_BLEND_ONE_MINUS_CONSTANT_COLOR,
   /**< The scale factors for color components is (Ac, Ac, Ac, Ac)*/
   EVAS_CANVAS3D_BLEND_CONSTANT_ALPHA,
   /**< The scale factors for color components is (1, 1, 1, 1) - (Ac, Ac, Ac, Ac)*/
   EVAS_CANVAS3D_BLEND_ONE_MINUS_CONSTANT_ALPHA,
   /**< The scale factors for color components is (i, i, i, 1) where i = min(As, kA, Ad)/kA*/
   EVAS_CANVAS3D_BLEND_SRC_ALPHA_SATURATE,
} Evas_Canvas3D_Blend_Func;

/**
 * Comparsion functions for testing(alpha, depth, stencil) in fragment shader.
 *
 * @since 1.14
 * @ingroup Evas_Canvas3D_Types
 */
typedef enum _Evas_Canvas3D_Comparison
{
   /**< Never passes.*/
   EVAS_CANVAS3D_COMPARISON_NEVER,
   /**< Passes if the incoming value is less than the reference value.*/
   EVAS_CANVAS3D_COMPARISON_LESS,
   /**< Passes if the incoming value is equal to the reference value.*/
   EVAS_CANVAS3D_COMPARISON_EQUAL,
   /**< Passes if the incoming value is less than or equal to the reference value.*/
   EVAS_CANVAS3D_COMPARISON_LEQUAL,
   /**< Passes if the incoming value is greater than the reference value.*/
   EVAS_CANVAS3D_COMPARISON_GREATER,
   /**< Passes if the incoming value is not equal to the reference value.*/
   EVAS_CANVAS3D_COMPARISON_NOTEQUAL,
   /**< Passes if the incoming value is greater than or equal to the reference value.*/
   EVAS_CANVAS3D_COMPARISON_GEQUAL,
   /**< Always passes (initial value).*/
   EVAS_CANVAS3D_COMPARISON_ALWAYS,
} Evas_Canvas3D_Comparison;

/**
 * Wrap modes
 *
 * @since 1.10
 * @ingroup Evas_Canvas3D_Types
 */
typedef enum _Evas_Canvas3D_Wrap_Mode
{
   /**< Values will be clamped to be in range [min, max] */
   EVAS_CANVAS3D_WRAP_MODE_CLAMP = 0,
   /**< Values will be repeated */
   EVAS_CANVAS3D_WRAP_MODE_REPEAT,
   /**< Values will be repeated in a reflected manner */
   EVAS_CANVAS3D_WRAP_MODE_REFLECT
} Evas_Canvas3D_Wrap_Mode;

/**
 * Mesh primitive
 *
 * @since 1.12
 * @ingroup Evas_Canvas3D_Types
 */
typedef enum _Evas_Canvas3D_Mesh_Primitive
{
   /**< An empty space */
   EVAS_CANVAS3D_MESH_PRIMITIVE_NONE = 0,
   /**< One sided square */
   EVAS_CANVAS3D_MESH_PRIMITIVE_SQUARE,
   /**< Cube */
   EVAS_CANVAS3D_MESH_PRIMITIVE_CUBE,
   /**< Cylinder (can use precision and texture scale) */
   EVAS_CANVAS3D_MESH_PRIMITIVE_CYLINDER,
   /**< Cone (can use precision and texture scale) */
   EVAS_CANVAS3D_MESH_PRIMITIVE_CONE,
   /**< Sphere (can use precision and texture scale) */
   EVAS_CANVAS3D_MESH_PRIMITIVE_SPHERE,
   /**< Torus (can use ratio, precision and texture scale) */
   EVAS_CANVAS3D_MESH_PRIMITIVE_TORUS,
   /**< Custom surface (can use pointer to users function, precision and texture scale) */
   EVAS_CANVAS3D_MESH_PRIMITIVE_SURFACE,
   /**< Terrain as surface with pointer to Perlin's noise function */
   EVAS_CANVAS3D_MESH_PRIMITIVE_TERRAIN,
   /**< Count of supported primitives */
   EVAS_CANVAS3D_MESH_PRIMITIVE_COUNT
} Evas_Canvas3D_Mesh_Primitive;

/**
 * Mode of mesh primitive
 *
 * @since 1.15
 * @ingroup Evas_Canvas3D_Types
 */
typedef enum _Evas_Canvas3D_Primitive_Mode
{
   /**< Default mode of primitive */
   EVAS_CANVAS3D_PRIMITIVE_MODE_DEFAULT = 0,
   /**< Primitive without base (supported for cylinder and cone) */
   EVAS_CANVAS3D_PRIMITIVE_MODE_WITHOUT_BASE,
   /**< Ptimitive with alternative UV (supported for sphere)*/
   EVAS_CANVAS3D_PRIMITIVE_MODE_ALTERNATIVE_UV
} Evas_Canvas3D_Primitive_Mode;

/**
 * Texture filters
 *
 * @since 1.10
 * @ingroup Evas_Canvas3D_Types
 */
typedef enum _Evas_Canvas3D_Texture_Filter
{
   /**< Samples nearest texel */
   EVAS_CANVAS3D_TEXTURE_FILTER_NEAREST = 0,
   /**< Lineary interpolate nearby texels */
   EVAS_CANVAS3D_TEXTURE_FILTER_LINEAR,
   /**< Nearest sampling mipmap */
   EVAS_CANVAS3D_TEXTURE_FILTER_NEAREST_MIPMAP_NEAREST,
   /**< Nearest sampling mipmap and interpolate */
   EVAS_CANVAS3D_TEXTURE_FILTER_LINEAR_MIPMAP_NEAREST,
   /**< Linear sampling in nearest mipmap */
   EVAS_CANVAS3D_TEXTURE_FILTER_NEAREST_MIPMAP_LINEAR,
   /**< Linear sampling in mipmap and interpolate */
   EVAS_CANVAS3D_TEXTURE_FILTER_LINEAR_MIPMAP_LINEAR
} Evas_Canvas3D_Texture_Filter;

/**
 * Shade modes
 *
 * @since 1.10
 * @ingroup Evas_Canvas3D_Types
 */
typedef enum _Evas_Canvas3D_Shade_Mode
{
   /**< Shaded using vertex color attribute */
   EVAS_CANVAS3D_SHADE_MODE_VERTEX_COLOR = 0,
   /**< Shaded using material diffuse term */
   EVAS_CANVAS3D_SHADE_MODE_DIFFUSE,
   /**< Per-vertex flat lighting */
   EVAS_CANVAS3D_SHADE_MODE_FLAT,
   /**< Per-pixel phong shading */
   EVAS_CANVAS3D_SHADE_MODE_PHONG,
   /**< Per-pixel normal map shading */
   EVAS_CANVAS3D_SHADE_MODE_NORMAL_MAP,
   /**< fragment color is defined by its z-coord*/
   EVAS_CANVAS3D_SHADE_MODE_SHADOW_MAP_RENDER,
   /**< rendering to additional frame bufer*/
   EVAS_CANVAS3D_SHADE_MODE_COLOR_PICK,
   /**< Per-pixel parallax occlusion map shading */
   EVAS_CANVAS3D_SHADE_MODE_PARALLAX_OCCLUSION,
} Evas_Canvas3D_Shade_Mode;

/**
 * Material attributes
 *
 * @since 1.10
 * @ingroup Evas_Canvas3D_Types
 */
typedef enum _Evas_Canvas3D_Material_Attrib
{
   EVAS_CANVAS3D_MATERIAL_AMBIENT = 0,     /**< Ambient term */
   EVAS_CANVAS3D_MATERIAL_DIFFUSE,         /**< Diffuse term */
   EVAS_CANVAS3D_MATERIAL_SPECULAR,        /**< Specular term */
   EVAS_CANVAS3D_MATERIAL_EMISSION,        /**< Emission term */
   EVAS_CANVAS3D_MATERIAL_NORMAL,          /**< Normal map term */
} Evas_Canvas3D_Material_Attrib;

#include "canvas/evas_image.eo.h"

#include "canvas/evas_canvas3d_camera.eo.h"

#include "canvas/evas_canvas3d_texture.eo.h"

#include "canvas/evas_canvas3d_material.eo.h"

#include "canvas/evas_canvas3d_light.eo.h"

#include "canvas/evas_canvas3d_mesh.eo.h"

#include "canvas/evas_canvas3d_primitive.eo.h"

#include "canvas/evas_canvas3d_node.eo.h"

#include "canvas/evas_canvas3d_scene.eo.h"

#include "canvas/evas_canvas3d_object.eo.h"

/**
 * @ingroup Evas_Object_VG
 *
 * @{
 */
#include "canvas/evas_vg.eo.h"
/**
 * @}
 */

#include "canvas/efl_vg_base.eo.h"
#include "canvas/efl_vg_container.eo.h"
#include "canvas/efl_vg_shape.eo.h"
#include "canvas/efl_vg_gradient.eo.h"
#include "canvas/efl_vg_gradient_linear.eo.h"
#include "canvas/efl_vg_gradient_radial.eo.h"
