class Evas_3D_Camera (Evas_3D_Object, Evas.Common_Interface)
{
   legacy_prefix: null;
   data: Evas_3D_Camera_Data;
   methods {
      projection_matrix_set {
         /*@
           Set the projection matrix of the given camera.

           @param camera     The given camera.
           @param matrix     Pointer to the array of 16 Evas_Real values in column major order.

           Default projection matrix is identity matrix.

           @see evas_3d_camera_projection_perspective_set()
           @see evas_3d_camera_projection_ortho_set()
           @see evas_3d_camera_projection_frustum_set()

           @ingroup Evas_3D_Camera
          */
         params {
           @in const(Evas_Real)* matrix; /*@ Projection Matrix */
         }
      }

      projection_matrix_get @const {
         /*@
          Get the projection matrix of the given camera.

          @param camera     The given camera.
          @param matrix     Pointer to receive the 16 Evas_Real values in column major order.

          @see evas_3d_camera_projection_matrix_set()

          @ingroup Evas_3D_Camera
         */
         params {
           @out Evas_Real matrix; /*@ Projection Matrix */
         }
      }

      projection_perspective_set {
         /*@
           Set the projection matrix of the given camera with perspective projection.

           @param camera     The given camera.
           @param fovy       Field of view angle in Y direction.
           @param aspect     Aspect ratio.
           @param dnear      Distance to near clipping plane.
           @param dfar       Distance to far clipping plane.

           @see evas_3d_camera_projection_matrix_set()

           @ingroup Evas_3D_Camera
          */

         params {
            Evas_Real fovy; /*@ Field of view angle in Y direction. */
            Evas_Real aspect; /*@ Aspect ratio.*/
            Evas_Real dnear; /*@ Distance to near clipping plane. */
            Evas_Real dfar; /*@ Distance to far clipping plane. */
         }
      }

      projection_frustum_set {
         /*@
           Set the projection matrix of the given camera with frustum projection.

           @see evas_3d_camera_projection_matrix_set()

           @ingroup Evas_3D_Camera
          */
         params {
            Evas_Real left; /*@ Left X coordinate of the near clipping plane. */
            Evas_Real right; /*@ Right X coordinate of the near clipping plane..*/
            Evas_Real bottom; /*@ Bottom Y coordinate of the near clipping plane. */
            Evas_Real top; /*@ Top Y coordinate of the near clipping plane */
            Evas_Real dnear; /*@ Distance to near clipping plane. */
            Evas_Real dfar; /*@ Distance to far clipping plane. */
         }
      }
      projection_ortho_set {
         /*@
           Set the projection matrix of the given camera with orthogonal projection.

           @see evas_3d_camera_projection_matrix_set()

           @ingroup Evas_3D_Camera
          */
         params {
            Evas_Real left; /*@ Left X coordinate of the near clipping plane. */
            Evas_Real right; /*@ Right X coordinate of the near clipping plane..*/
            Evas_Real bottom; /*@ Bottom Y coordinate of the near clipping plane. */
            Evas_Real top; /*@ Top Y coordinate of the near clipping plane */
            Evas_Real dnear; /*@ Distance to near clipping plane. */
            Evas_Real dfar; /*@ Distance to far clipping plane. */
         }
      }
      node_visible_get {
         /*@
            Check is bounding sphere of given node inside frustum of camera node.
          *
          * @param camera          The given camera node.
          * @param node            The given node.
          * @return                @c EINA_TRUE in frustum, @c EINA_FALSE otherwise

          * If the nodes are @ NULL or nodes type mismatch error wrong type of nodes will be generated and returned @ EINA_FALSE.

          * @ingroup Evas_3D_Camera
          */
         return: bool;
         params {
            @in Evas_3D_Node *camera_node;
            @in Evas_3D_Node *node;
            @in Evas_3D_Frustum_Mode key;
         }
      }
   }

   implements {
      Eo.Base.constructor;
      Eo.Base.destructor;
      Evas_3D_Object.update_notify;
      Evas_3D_Object.change_notify;
   }

}
