/*
     File:       QuickTimeVRFormat.h
 
     Contains:   QuickTime VR interfaces
 
     Version:    QuickTime 7.3
 
     Copyright:  (c) 2007 (c) 1997-2007 by Apple Inc., all rights reserved.
 
     Bugs?:      For bug reports, consult the following page on
                 the World Wide Web:
 
                     http://developer.apple.com/bugreporter/
 
*/
#ifndef __QUICKTIMEVRFORMAT__
#define __QUICKTIMEVRFORMAT__

#ifndef __CONDITIONALMACROS__
#include "ConditionalMacros.h"
#endif

#ifndef __MOVIES__
#include "Movies.h"
#endif

#ifndef __QUICKTIMEVR__
#include "QuickTimeVR.h"
#endif




#if PRAGMA_ONCE
#pragma once
#endif

#ifdef __cplusplus
extern "C" {
#endif

#if PRAGMA_IMPORT
#pragma import on
#endif

#if PRAGMA_STRUCT_ALIGN
    #pragma options align=mac68k
#elif PRAGMA_STRUCT_PACKPUSH
    #pragma pack(push, 2)
#elif PRAGMA_STRUCT_PACK
    #pragma pack(2)
#endif

/* QuickTime is not available to 64-bit clients */

#if !__LP64__


/* File Format Version numbers */
#define kQTVRMajorVersion (2)
#define kQTVRMinorVersion (0)

/* User data type for the Movie Controller type specifier*/
enum {
  kQTControllerType             = kQTVRControllerSubType, /* Atom & ID of where our*/
  kQTControllerID               = 1     /* ...controller name is stored*/
};

/* VRWorld atom types*/
enum {
  kQTVRWorldHeaderAtomType      = FOUR_CHAR_CODE('vrsc'),
  kQTVRImagingParentAtomType    = FOUR_CHAR_CODE('imgp'),
  kQTVRPanoImagingAtomType      = FOUR_CHAR_CODE('impn'),
  kQTVRObjectImagingAtomType    = FOUR_CHAR_CODE('imob'),
  kQTVRNodeParentAtomType       = FOUR_CHAR_CODE('vrnp'),
  kQTVRNodeIDAtomType           = FOUR_CHAR_CODE('vrni'),
  kQTVRNodeLocationAtomType     = FOUR_CHAR_CODE('nloc'),
  kQTVRCursorParentAtomType     = FOUR_CHAR_CODE('vrcp'), /* New with 2.1*/
  kQTVRCursorAtomType           = FOUR_CHAR_CODE('CURS'), /* New with 2.1*/
  kQTVRColorCursorAtomType      = FOUR_CHAR_CODE('crsr') /* New with 2.1*/
};

/* NodeInfo atom types*/
enum {
  kQTVRNodeHeaderAtomType       = FOUR_CHAR_CODE('ndhd'),
  kQTVRHotSpotParentAtomType    = FOUR_CHAR_CODE('hspa'),
  kQTVRHotSpotAtomType          = FOUR_CHAR_CODE('hots'),
  kQTVRHotSpotInfoAtomType      = FOUR_CHAR_CODE('hsin'),
  kQTVRLinkInfoAtomType         = FOUR_CHAR_CODE('link')
};

/* Miscellaneous atom types*/
enum {
  kQTVRStringAtomType           = FOUR_CHAR_CODE('vrsg'),
  kQTVRStringEncodingAtomType   = FOUR_CHAR_CODE('vrse'), /* New with 2.1*/
  kQTVRPanoSampleDataAtomType   = FOUR_CHAR_CODE('pdat'),
  kQTVRObjectInfoAtomType       = FOUR_CHAR_CODE('obji'),
  kQTVRImageTrackRefAtomType    = FOUR_CHAR_CODE('imtr'), /* Parent is kQTVRObjectInfoAtomType. Required if track ref is not 1 as required by 2.0 format.*/
  kQTVRHotSpotTrackRefAtomType  = FOUR_CHAR_CODE('hstr'), /* Parent is kQTVRObjectInfoAtomType. Required if track ref is not 1 as required by 2.0 format.*/
  kQTVRAngleRangeAtomType       = FOUR_CHAR_CODE('arng'),
  kQTVRTrackRefArrayAtomType    = FOUR_CHAR_CODE('tref'),
  kQTVRPanConstraintAtomType    = FOUR_CHAR_CODE('pcon'),
  kQTVRTiltConstraintAtomType   = FOUR_CHAR_CODE('tcon'),
  kQTVRFOVConstraintAtomType    = FOUR_CHAR_CODE('fcon'),
  kQTVRCubicViewAtomType        = FOUR_CHAR_CODE('cuvw'), /* New with 5.0*/
  kQTVRCubicFaceDataAtomType    = FOUR_CHAR_CODE('cufa') /* New with 5.0*/
};

enum {
  kQTVRObjectInfoAtomID         = 1,
  kQTVRObjectImageTrackRefAtomID = 1,   /* New with 2.1, it adds a track reference to select between multiple image tracks*/
  kQTVRObjectHotSpotTrackRefAtomID = 1  /* New with 2.1, it adds a track reference to select between multiple hotspot tracks*/
};

/* Track reference types*/
enum {
  kQTVRImageTrackRefType        = FOUR_CHAR_CODE('imgt'),
  kQTVRHotSpotTrackRefType      = FOUR_CHAR_CODE('hott')
};

/* Old hot spot types*/
enum {
  kQTVRHotSpotNavigableType     = FOUR_CHAR_CODE('navg')
};

/* Valid bits used in QTVRLinkHotSpotAtom*/
enum {
  kQTVRValidPan                 = 1L << 0,
  kQTVRValidTilt                = 1L << 1,
  kQTVRValidFOV                 = 1L << 2,
  kQTVRValidViewCenter          = 1L << 3
};


/* Values for flags field in QTVRPanoSampleAtom*/
enum {
  kQTVRPanoFlagHorizontal       = 1L << 0,
  kQTVRPanoFlagLast             = 1L << 31
};


/* Values for locationFlags field in QTVRNodeLocationAtom*/
enum {
  kQTVRSameFile                 = 0
};


/* Header for QTVR track's Sample Description record (vrWorld atom container is appended)*/
struct QTVRSampleDescription {
  UInt32              descSize;               /* total size of the QTVRSampleDescription*/
  UInt32              descType;               /* must be 'qtvr'*/

  UInt32              reserved1;              /* must be zero*/
  UInt16              reserved2;              /* must be zero*/
  UInt16              dataRefIndex;           /* must be zero*/

  UInt32              data;                   /* Will be extended to hold vrWorld QTAtomContainer*/

};
typedef struct QTVRSampleDescription    QTVRSampleDescription;
typedef QTVRSampleDescription *         QTVRSampleDescriptionPtr;
typedef QTVRSampleDescriptionPtr *      QTVRSampleDescriptionHandle;
/*
  =================================================================================================
   Definitions and structures used in the VRWorld QTAtomContainer
  -------------------------------------------------------------------------------------------------
*/

struct QTVRStringAtom {
  UInt16              stringUsage;
  UInt16              stringLength;
  unsigned char       theString[4];           /* field previously named "string"*/
};
typedef struct QTVRStringAtom           QTVRStringAtom;
typedef QTVRStringAtom *                QTVRStringAtomPtr;

struct QTVRWorldHeaderAtom {
  UInt16              majorVersion;
  UInt16              minorVersion;

  QTAtomID            nameAtomID;
  UInt32              defaultNodeID;
  UInt32              vrWorldFlags;

  UInt32              reserved1;
  UInt32              reserved2;
};
typedef struct QTVRWorldHeaderAtom      QTVRWorldHeaderAtom;
typedef QTVRWorldHeaderAtom *           QTVRWorldHeaderAtomPtr;

/* Valid bits used in QTVRPanoImagingAtom*/
enum {
  kQTVRValidCorrection          = 1L << 0,
  kQTVRValidQuality             = 1L << 1,
  kQTVRValidDirectDraw          = 1L << 2,
  kQTVRValidFirstExtraProperty  = 1L << 3
};

struct QTVRPanoImagingAtom {
  UInt16              majorVersion;
  UInt16              minorVersion;

  UInt32              imagingMode;
  UInt32              imagingValidFlags;

  UInt32              correction;
  UInt32              quality;
  UInt32              directDraw;
  UInt32              imagingProperties[6];   /* for future properties*/

  UInt32              reserved1;
  UInt32              reserved2;
};
typedef struct QTVRPanoImagingAtom      QTVRPanoImagingAtom;
typedef QTVRPanoImagingAtom *           QTVRPanoImagingAtomPtr;
struct QTVRNodeLocationAtom {
  UInt16              majorVersion;
  UInt16              minorVersion;

  OSType              nodeType;
  UInt32              locationFlags;
  UInt32              locationData;

  UInt32              reserved1;
  UInt32              reserved2;
};
typedef struct QTVRNodeLocationAtom     QTVRNodeLocationAtom;
typedef QTVRNodeLocationAtom *          QTVRNodeLocationAtomPtr;
/*
  =================================================================================================
   Definitions and structures used in the Nodeinfo QTAtomContainer
  -------------------------------------------------------------------------------------------------
*/

struct QTVRNodeHeaderAtom {
  UInt16              majorVersion;
  UInt16              minorVersion;

  OSType              nodeType;
  QTAtomID            nodeID;
  QTAtomID            nameAtomID;
  QTAtomID            commentAtomID;

  UInt32              reserved1;
  UInt32              reserved2;
};
typedef struct QTVRNodeHeaderAtom       QTVRNodeHeaderAtom;
typedef QTVRNodeHeaderAtom *            QTVRNodeHeaderAtomPtr;
struct QTVRAngleRangeAtom {
  Float32             minimumAngle;
  Float32             maximumAngle;
};
typedef struct QTVRAngleRangeAtom       QTVRAngleRangeAtom;
typedef QTVRAngleRangeAtom *            QTVRAngleRangeAtomPtr;
struct QTVRHotSpotInfoAtom {
  UInt16              majorVersion;
  UInt16              minorVersion;

  OSType              hotSpotType;
  QTAtomID            nameAtomID;
  QTAtomID            commentAtomID;

  SInt32              cursorID[3];

                                              /* canonical view for this hot spot*/
  Float32             bestPan;
  Float32             bestTilt;
  Float32             bestFOV;
  QTVRFloatPoint      bestViewCenter;

                                              /* Bounding box for this hot spot*/
  Rect                hotSpotRect;

  UInt32              flags;
  UInt32              reserved1;
  UInt32              reserved2;
};
typedef struct QTVRHotSpotInfoAtom      QTVRHotSpotInfoAtom;
typedef QTVRHotSpotInfoAtom *           QTVRHotSpotInfoAtomPtr;
struct QTVRLinkHotSpotAtom {
  UInt16              majorVersion;
  UInt16              minorVersion;

  UInt32              toNodeID;

  UInt32              fromValidFlags;
  Float32             fromPan;
  Float32             fromTilt;
  Float32             fromFOV;
  QTVRFloatPoint      fromViewCenter;

  UInt32              toValidFlags;
  Float32             toPan;
  Float32             toTilt;
  Float32             toFOV;
  QTVRFloatPoint      toViewCenter;

  Float32             distance;

  UInt32              flags;
  UInt32              reserved1;
  UInt32              reserved2;
};
typedef struct QTVRLinkHotSpotAtom      QTVRLinkHotSpotAtom;
typedef QTVRLinkHotSpotAtom *           QTVRLinkHotSpotAtomPtr;
/*
  =================================================================================================
   Definitions and structures used in Panorama and Object tracks
  -------------------------------------------------------------------------------------------------
*/

struct QTVRPanoSampleAtom {
  UInt16              majorVersion;
  UInt16              minorVersion;

  UInt32              imageRefTrackIndex;     /* track reference index of the full res image track*/
  UInt32              hotSpotRefTrackIndex;   /* track reference index of the full res hot spot track*/

  Float32             minPan;
  Float32             maxPan;
  Float32             minTilt;
  Float32             maxTilt;
  Float32             minFieldOfView;
  Float32             maxFieldOfView;

  Float32             defaultPan;
  Float32             defaultTilt;
  Float32             defaultFieldOfView;

                                              /* Info for highest res version of image track*/
  UInt32              imageSizeX;             /* pixel width of the panorama (e.g. 768)*/
  UInt32              imageSizeY;             /* pixel height of the panorama (e.g. 2496)*/
  UInt16              imageNumFramesX;        /* diced frames wide (e.g. 1)*/
  UInt16              imageNumFramesY;        /* diced frames high (e.g. 24)*/

                                              /* Info for highest res version of hotSpot track*/
  UInt32              hotSpotSizeX;           /* pixel width of the hot spot panorama (e.g. 768)*/
  UInt32              hotSpotSizeY;           /* pixel height of the hot spot panorama (e.g. 2496)*/
  UInt16              hotSpotNumFramesX;      /* diced frames wide (e.g. 1)*/
  UInt16              hotSpotNumFramesY;      /* diced frames high (e.g. 24)*/

  UInt32              flags;
  OSType              panoType;
  UInt32              reserved2;

};
typedef struct QTVRPanoSampleAtom       QTVRPanoSampleAtom;
typedef QTVRPanoSampleAtom *            QTVRPanoSampleAtomPtr;
/*
   View atom for cubes (since same fields in QTVRPanoSampleAtom are set to special
   values for backwards compatibility and hence are ignored by the cubic engine)
*/
struct QTVRCubicViewAtom {
  Float32             minPan;
  Float32             maxPan;
  Float32             minTilt;
  Float32             maxTilt;
  Float32             minFieldOfView;
  Float32             maxFieldOfView;

  Float32             defaultPan;
  Float32             defaultTilt;
  Float32             defaultFieldOfView;
};
typedef struct QTVRCubicViewAtom        QTVRCubicViewAtom;
typedef QTVRCubicViewAtom *             QTVRCubicViewAtomPtr;
struct QTVRCubicFaceData {
  Float32             orientation[4];         /* WXYZ quaternion of absolute orientation*/
  Float32             center[2];              /* Center of image relative to center of projection (default = (0,0)) in normalized units*/
  Float32             aspect;                 /* aspect>1 => tall pixels; aspect <1 => squat pixels (default = 1)*/
  Float32             skew;                   /* skew x by y (default = 0)*/
};
typedef struct QTVRCubicFaceData        QTVRCubicFaceData;
typedef QTVRCubicFaceData *             QTVRCubicFaceDataPtr;
/* Special resolution values for the Image Track Reference Atoms. Use only one value per track reference.*/
enum {
  kQTVRFullTrackRes             = kQTVRFullRes,
  kQTVRHalfTrackRes             = kQTVRHalfRes,
  kQTVRQuarterTrackRes          = kQTVRQuarterRes,
  kQTVRPreviewTrackRes          = 0x8000
};

struct QTVRTrackRefEntry {
  UInt32              trackRefType;
  UInt16              trackResolution;
  UInt32              trackRefIndex;
};
typedef struct QTVRTrackRefEntry        QTVRTrackRefEntry;
/*
  =================================================================================================
   Object File format 2.0
  -------------------------------------------------------------------------------------------------
*/
enum {
  kQTVRObjectAnimateViewFramesOn = (1L << 0),
  kQTVRObjectPalindromeViewFramesOn = (1L << 1),
  kQTVRObjectStartFirstViewFrameOn = (1L << 2),
  kQTVRObjectAnimateViewsOn     = (1L << 3),
  kQTVRObjectPalindromeViewsOn  = (1L << 4),
  kQTVRObjectSyncViewToFrameRate = (1L << 5),
  kQTVRObjectDontLoopViewFramesOn = (1L << 6),
  kQTVRObjectPlayEveryViewFrameOn = (1L << 7),
  kQTVRObjectStreamingViewsOn   = (1L << 8)
};

enum {
  kQTVRObjectWrapPanOn          = (1L << 0),
  kQTVRObjectWrapTiltOn         = (1L << 1),
  kQTVRObjectCanZoomOn          = (1L << 2),
  kQTVRObjectReverseHControlOn  = (1L << 3),
  kQTVRObjectReverseVControlOn  = (1L << 4),
  kQTVRObjectSwapHVControlOn    = (1L << 5),
  kQTVRObjectTranslationOn      = (1L << 6)
};

enum {
  kGrabberScrollerUI            = 1,    /* "Object" */
  kOldJoyStickUI                = 2,    /*  "1.0 Object as Scene"     */
  kJoystickUI                   = 3,    /* "Object In Scene"*/
  kGrabberUI                    = 4,    /* "Grabber only"*/
  kAbsoluteUI                   = 5     /* "Absolute pointer"*/
};


struct QTVRObjectSampleAtom {
  UInt16              majorVersion;           /* kQTVRMajorVersion*/
  UInt16              minorVersion;           /* kQTVRMinorVersion*/
  UInt16              movieType;              /* ObjectUITypes*/
  UInt16              viewStateCount;         /* The number of view states 1 based*/
  UInt16              defaultViewState;       /* The default view state number. The number must be 1 to viewStateCount*/
  UInt16              mouseDownViewState;     /* The mouse down view state.   The number must be 1 to viewStateCount*/
  UInt32              viewDuration;           /* The duration of each view including all animation frames in a view*/
  UInt32              columns;                /* Number of columns in movie*/
  UInt32              rows;                   /* Number rows in movie*/
  Float32             mouseMotionScale;       /* 180.0 for kStandardObject or kQTVRObjectInScene, actual degrees for kOldNavigableMovieScene.*/
  Float32             minPan;                 /* Start   horizontal pan angle in degrees*/
  Float32             maxPan;                 /* End     horizontal pan angle in degrees*/
  Float32             defaultPan;             /* Initial horizontal pan angle in degrees (poster view)*/
  Float32             minTilt;                /* Start   vertical   pan angle in degrees*/
  Float32             maxTilt;                /* End     vertical   pan angle in degrees*/
  Float32             defaultTilt;            /* Initial vertical   pan angle in degrees (poster view)  */
  Float32             minFieldOfView;         /* minimum field of view setting (appears as the maximum zoom effect) must be >= 1*/
  Float32             fieldOfView;            /* the field of view range must be >= 1*/
  Float32             defaultFieldOfView;     /* must be in minFieldOfView and maxFieldOfView range inclusive*/
  Float32             defaultViewCenterH;
  Float32             defaultViewCenterV;

  Float32             viewRate;
  Float32             frameRate;
  UInt32              animationSettings;      /* 32 reserved bit fields*/
  UInt32              controlSettings;        /* 32 reserved bit fields*/

};
typedef struct QTVRObjectSampleAtom     QTVRObjectSampleAtom;
typedef QTVRObjectSampleAtom *          QTVRObjectSampleAtomPtr;
/*
  =================================================================================================
   QuickTime VR Authoring Components
  -------------------------------------------------------------------------------------------------
*/

/*
   ComponentDescription constants for QTVR Export components   
    (componentType = MovieExportType; componentSubType = MovieFileType)
*/
enum {
  kQTVRFlattenerManufacturer    = FOUR_CHAR_CODE('vrwe'), /* aka QTVRFlattenerType*/
  kQTVRSplitterManufacturer     = FOUR_CHAR_CODE('vrsp'),
  kQTVRObjExporterManufacturer  = FOUR_CHAR_CODE('vrob')
};

/* QuickTime VR Flattener atom types*/
enum {
  kQTVRFlattenerSettingsParentAtomType = FOUR_CHAR_CODE('VRWe'), /* parent of settings atoms (other than compression)*/
  kQTVRFlattenerPreviewResAtomType = FOUR_CHAR_CODE('PRes'), /* preview resolution Int16*/
  kQTVRFlattenerImportSpecAtomType = FOUR_CHAR_CODE('ISpe'), /* import file spec FSSpec*/
  kQTVRFlattenerCreatePreviewAtomType = FOUR_CHAR_CODE('Prev'), /* Boolean*/
  kQTVRFlattenerImportPreviewAtomType = FOUR_CHAR_CODE('IPre'), /* Boolean*/
  kQTVRFlattenerBlurPreviewAtomType = FOUR_CHAR_CODE('Blur') /* Boolean*/
};

/* QuickTime VR Splitter atom types*/
enum {
  kQTVRSplitterSettingsParentAtomType = FOUR_CHAR_CODE('VRSp'), /* parent of settings atoms (other than compression)*/
  kQTVRSplitterGenerateHTMLAtomType = FOUR_CHAR_CODE('Ghtm'), /* Boolean*/
  kQTVRSplitterOverwriteFilesAtomType = FOUR_CHAR_CODE('Owfi'), /* Boolean*/
  kQTVRSplitterUseFlattenerAtomType = FOUR_CHAR_CODE('Usef'), /* Boolean*/
  kQTVRSplitterShowControllerAtomType = FOUR_CHAR_CODE('Shco'), /* Boolean*/
  kQTVRSplitterTargetMyselfAtomType = FOUR_CHAR_CODE('Tgtm') /* Boolean*/
};

/* QuickTime VR Object Exporter atom types*/
enum {
  kQTVRObjExporterSettingsBlockSize = FOUR_CHAR_CODE('bsiz'), /* block size for compression*/
  kQTVRObjExporterSettingsTargetSize = FOUR_CHAR_CODE('tsiz') /* target file size*/
};



#if OLDROUTINENAMES
typedef QTVRStringAtom                  VRStringAtom;
typedef QTVRWorldHeaderAtom             VRWorldHeaderAtom;
typedef QTVRPanoImagingAtom             VRPanoImagingAtom;
typedef QTVRNodeLocationAtom            VRNodeLocationAtom;
typedef QTVRNodeHeaderAtom              VRNodeHeaderAtom;
typedef QTVRAngleRangeAtom              VRAngleRangeAtom;
typedef QTVRHotSpotInfoAtom             VRHotSpotInfoAtom;
typedef QTVRLinkHotSpotAtom             VRLinkHotSpotAtom;
typedef QTVRPanoSampleAtom              VRPanoSampleAtom;
typedef QTVRTrackRefEntry               VRTrackRefEntry;
typedef QTVRObjectSampleAtom            VRObjectSampleAtom;
#endif  /* OLDROUTINENAMES */


#endif // !__LP64__




#if PRAGMA_STRUCT_ALIGN
    #pragma options align=reset
#elif PRAGMA_STRUCT_PACKPUSH
    #pragma pack(pop)
#elif PRAGMA_STRUCT_PACK
    #pragma pack()
#endif

#ifdef PRAGMA_IMPORT_OFF
#pragma import off
#elif PRAGMA_IMPORT
#pragma import reset
#endif

#ifdef __cplusplus
}
#endif

#endif /* __QUICKTIMEVRFORMAT__ */

