/*
     File:       QuickTimeVRFormat.h
 
     Contains:   QuickTime VR interfaces
 
     Version:    Technology: QuickTime VR 5.0
                 Release:    QuickTime 6.0.2
 
     Copyright:  (c) 1997-2001 by Apple Computer, 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 __DIALOGS__
#include "Dialogs.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


/* 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 */




#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__ */

