root/include/gpac/internal/camera.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


/*
 *                      GPAC - Multimedia Framework C SDK
 *
 *                      Authors: Jean Le Feuvre
 *                      Copyright (c) Telecom ParisTech 2000-2012
 *                                      All rights reserved
 *
 *  This file is part of GPAC / Scene Compositor sub-project
 *
 *  GPAC is free software; you can redistribute it and/or modify
 *  it under the terms of the GNU Lesser General Public License as published by
 *  the Free Software Foundation; either version 2, or (at your option)
 *  any later version.
 *
 *  GPAC is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU Lesser General Public License for more details.
 *
 *  You should have received a copy of the GNU Lesser General Public
 *  License along with this library; see the file COPYING.  If not, write to
 *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
 *
 */

#ifndef _CAMERA_H_
#define _CAMERA_H_

//#include <gpac/internal/compositor_dev.h>
#include <gpac/scenegraph_vrml.h>

/*camera flags*/
enum
{
        /*if set frustum needs to be recomputed
        we avoid computing it at each frame/interaction since that's a lot of matrix maths*/
        CAM_IS_DIRTY = 1,
        /*if set when ortho, indicates the viewport matrix shall be used when computing modelview (2D only)*/
        CAM_HAS_VIEWPORT = 1<<2,
        /*if set when ortho to disable LookAt mode*/
        CAM_NO_LOOKAT = 1<<3,
};

enum
{
        /*only valid at root node*/
        CULL_NOT_SET = 0,
        /*subtree completely outside view vol*/
        CULL_OUTSIDE,
        /*subtree completely inside view vol*/
        CULL_INSIDE,
        /*subtree overlaps view vol - FIXME: would be nice to keep track of intersecting planes*/
        CULL_INTERSECTS
};

/*navigation info flags - non-VRML ones are simply blaxxun contact ones */
enum
{
        /*headlight is on*/
        NAV_HEADLIGHT = 1,
        /*navigtion is selectable*/
        NAV_SELECTABLE = 1<<1,
        /*any navigation (eg, user-interface navigation control allowed)*/
        NAV_ANY = 1<<2
};

/*frustum object*/
enum
{
        FRUS_NEAR_PLANE = 0,
        FRUS_FAR_PLANE,
        FRUS_LEFT_PLANE,
        FRUS_RIGHT_PLANE,
        FRUS_BOTTOM_PLANE,
        FRUS_TOP_PLANE
};



enum
{
        /*nothing detected*/
        CF_NONE = 0,
        /*collision detected*/
        CF_COLLISION = 1,
        /*gravity detecion enabled*/
        CF_DO_GRAVITY = (1<<1),
        /*gravity detected*/
        CF_GRAVITY = (1<<2),
        /*viewpoint is stored at end of animation*/
        CF_STORE_VP = (1<<3),
};

typedef struct _camera
{
        /*this flag MUST be set by the owner of the camera*/
        Bool is_3D;

        u32 flags;

        /*viewport info*/
        GF_Rect vp;
        /*not always same as VP due to aspect ratio*/
        Fixed width, height;
        Fixed z_near, z_far;

        /*current vectors*/
        Fixed fieldOfView;
        SFVec3f up, position, target;

        /*initial vp for reset*/
        SFVec3f vp_position;
        SFRotation vp_orientation;
        Fixed vp_fov, vp_dist;

        /*animation path*/
        SFVec3f start_pos, end_pos;
        SFRotation start_ori, end_ori;
        Fixed start_fov, end_fov;
        /*for 2D cameras we never animate except for vp reset*/
        Fixed start_zoom, end_zoom;
        SFVec2f start_trans, start_rot;

        /*center of examine movement*/
        SFVec3f examine_center;

        /*anim*/
        u32 anim_len, anim_start;
        Bool jumping;
        Fixed dheight;

        /*navigation info - overwridden by any bindable NavigationInfo node*/
        u32 navigation_flags, navigate_mode;
        SFVec3f avatar_size;
        Fixed visibility, speed;
        Bool had_nav_info;
        u32 had_viewpoint;

        /*last camera position before collision& gravity detection*/
        SFVec3f last_pos;
        u32 collide_flags;
        /*collision point in world coord*/
        SFVec3f collide_point;
        /*collide dist in world coord, used to check if we have a closer collision*/
        Fixed collide_dist;
        /*ground in world coord*/
        SFVec3f ground_point;
        /*ground dist in world coord, used to check if we have a closer ground*/
        Fixed ground_dist;
        /*for obstacle detection*/
        Bool last_had_ground;
        Bool last_had_col;

        /*projection & modelview matrices*/
        GF_Matrix projection, modelview;
        /*unprojection matrix = INV(P*M) used for screen->world compute*/
        GF_Matrix unprojection;
        /*viewport matrix*/
        GF_Matrix viewport;
        /*frustum planes*/
        GF_Plane planes[6];
        /*p vertex idx per plane (for bbox-frustum intersection checks)*/
        u32 p_idx[6];
        /*frustrum bounding sphere (for sphere-sphere frustum intersection checks)*/
        SFVec3f center;
        Fixed radius;

        GF_BBox world_bbox;
} GF_Camera;

/*invalidate camera to force recompute of all params*/
void camera_invalidate(GF_Camera *cam);
/*updates camera. user transform is only used in 2D to set global user zoom/pan/translate*/
void camera_update(GF_Camera *cam, GF_Matrix2D *user_transform, Bool center_coords);
/*updates camera. user transform is only used in 2D to set global user zoom/pan/translate + stereo param*/
void camera_update_stereo(GF_Camera *cam, GF_Matrix2D *user_transform, Bool center_coords, Fixed horizontal_shift, Fixed viewing_distance, Fixed viewing_distance_offset, u32 camera_layout);
/*reset to last viewport*/
void camera_reset_viewpoint(GF_Camera *cam, Bool animate);
/*move camera to given vp*/
void camera_move_to(GF_Camera *cam, SFVec3f pos, SFVec3f target, SFVec3f up);
Bool camera_animate(GF_Camera *cam);
void camera_stop_anim(GF_Camera *cam);
/*start jump mode*/
void camera_jump(GF_Camera *cam);

void camera_set_vectors(GF_Camera *cam, SFVec3f pos, SFRotation ori, Fixed fov);

SFRotation camera_get_orientation(SFVec3f pos, SFVec3f target, SFVec3f up);
SFVec3f camera_get_pos_dir(GF_Camera *cam);
SFVec3f camera_get_target_dir(GF_Camera *cam);
SFVec3f camera_get_right_dir(GF_Camera *cam);
void camera_set_2d(GF_Camera *cam);

#endif


/* [<][>][^][v][top][bottom][index][help] */