topical media & game development

talk show tell print

lib-of-vs-libs-QTDevWin-CIncludes-QD3DGroup.h / h



  /*
       File:       QD3DGroup.h
   
       Contains:   Q3Group methods
   
       Version:    Technology: Quickdraw 3D 1.6
                   Release:    QuickTime 6.0.2
   
       Copyright:  (c) 1995-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 __QD3DGROUP__
  define __QD3DGROUP__
  
  ifndef __QD3D__
  include <QD3D.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=power
  #elif PRAGMA_STRUCT_PACKPUSH
      #pragma pack(push, 2)
  #elif PRAGMA_STRUCT_PACK
      #pragma pack(2)
  endif
  
  if PRAGMA_ENUM_ALWAYSINT
      #if defined(__fourbyteints__) && !__fourbyteints__ 
          #define __QD3DGROUP__RESTORE_TWOBYTEINTS
          #pragma fourbyteints on
      #endif
      #pragma enumsalwaysint on
  #elif PRAGMA_ENUM_OPTIONS
      #pragma option enum=int
  #elif PRAGMA_ENUM_PACK
      #if __option(pack_enums)
          #define __QD3DGROUP__RESTORE_PACKED_ENUMS
          #pragma options(!pack_enums)
      #endif
  endif
  
  
**************************************************************************** * ** * Group Typedefs ** * ** ***************************************************************************

  
  /*
   * These flags affect how a group is traversed
   * They apply to when a group is "drawn", "picked", "bounded", "written"
   */
  
  enum TQ3DisplayGroupStateMasks {
      kQ3DisplayGroupStateNone    = 0,
      kQ3DisplayGroupStateMaskIsDrawn = 1 << 0,
      kQ3DisplayGroupStateMaskIsInline = 1 << 1,
      kQ3DisplayGroupStateMaskUseBoundingBox = 1 << 2,
      kQ3DisplayGroupStateMaskUseBoundingSphere = 1 << 3,
      kQ3DisplayGroupStateMaskIsPicked = 1 << 4,
      kQ3DisplayGroupStateMaskIsWritten = 1 << 5
  };
  typedef enum TQ3DisplayGroupStateMasks TQ3DisplayGroupStateMasks;
  
  typedef unsigned long                   TQ3DisplayGroupState;
   
  
  
**************************************************************************** * ** * Group Routines (apply to all groups) ** * ** ***************************************************************************

  
  /* May contain any shared object */
  if CALL_NOT_IN_CARBON
  EXTERN_API_C( TQ3GroupObject )
  Q3Group_New                     (void);
  
  EXTERN_API_C( TQ3ObjectType )
  Q3Group_GetType                 (TQ3GroupObject         group);
  
  EXTERN_API_C( TQ3GroupPosition )
  Q3Group_AddObject               (TQ3GroupObject         group,
                                   TQ3Object              object);
  
  EXTERN_API_C( TQ3GroupPosition )
  Q3Group_AddObjectBefore         (TQ3GroupObject         group,
                                   TQ3GroupPosition       position,
                                   TQ3Object              object);
  
  EXTERN_API_C( TQ3GroupPosition )
  Q3Group_AddObjectAfter          (TQ3GroupObject         group,
                                   TQ3GroupPosition       position,
                                   TQ3Object              object);
  
  EXTERN_API_C( TQ3Status )
  Q3Group_GetPositionObject       (TQ3GroupObject         group,
                                   TQ3GroupPosition       position,
                                   TQ3Object *            object);
  
  EXTERN_API_C( TQ3Status )
  Q3Group_SetPositionObject       (TQ3GroupObject         group,
                                   TQ3GroupPosition       position,
                                   TQ3Object              object);
  
  EXTERN_API_C( TQ3Object )
  Q3Group_RemovePosition          (TQ3GroupObject         group,
                                   TQ3GroupPosition       position);
  
  EXTERN_API_C( TQ3Status )
  Q3Group_GetFirstPosition        (TQ3GroupObject         group,
                                   TQ3GroupPosition *     position);
  
  EXTERN_API_C( TQ3Status )
  Q3Group_GetLastPosition         (TQ3GroupObject         group,
                                   TQ3GroupPosition *     position);
  
  EXTERN_API_C( TQ3Status )
  Q3Group_GetNextPosition         (TQ3GroupObject         group,
                                   TQ3GroupPosition *     position);
  
  EXTERN_API_C( TQ3Status )
  Q3Group_GetPreviousPosition     (TQ3GroupObject         group,
                                   TQ3GroupPosition *     position);
  
  EXTERN_API_C( TQ3Status )
  Q3Group_CountObjects            (TQ3GroupObject         group,
                                   unsigned long *        nObjects);
  
  EXTERN_API_C( TQ3Status )
  Q3Group_EmptyObjects            (TQ3GroupObject         group);
  
  /*
   *  Typed Access
   */
  EXTERN_API_C( TQ3Status )
  Q3Group_GetFirstPositionOfType  (TQ3GroupObject         group,
                                   TQ3ObjectType          isType,
                                   TQ3GroupPosition *     position);
  
  EXTERN_API_C( TQ3Status )
  Q3Group_GetLastPositionOfType   (TQ3GroupObject         group,
                                   TQ3ObjectType          isType,
                                   TQ3GroupPosition *     position);
  
  EXTERN_API_C( TQ3Status )
  Q3Group_GetNextPositionOfType   (TQ3GroupObject         group,
                                   TQ3ObjectType          isType,
                                   TQ3GroupPosition *     position);
  
  EXTERN_API_C( TQ3Status )
  Q3Group_GetPreviousPositionOfType (TQ3GroupObject       group,
                                   TQ3ObjectType          isType,
                                   TQ3GroupPosition *     position);
  
  EXTERN_API_C( TQ3Status )
  Q3Group_CountObjectsOfType      (TQ3GroupObject         group,
                                   TQ3ObjectType          isType,
                                   unsigned long *        nObjects);
  
  EXTERN_API_C( TQ3Status )
  Q3Group_EmptyObjectsOfType      (TQ3GroupObject         group,
                                   TQ3ObjectType          isType);
  
  /*
   *  Determine position of objects in a group
   */
  EXTERN_API_C( TQ3Status )
  Q3Group_GetFirstObjectPosition  (TQ3GroupObject         group,
                                   TQ3Object              object,
                                   TQ3GroupPosition *     position);
  
  EXTERN_API_C( TQ3Status )
  Q3Group_GetLastObjectPosition   (TQ3GroupObject         group,
                                   TQ3Object              object,
                                   TQ3GroupPosition *     position);
  
  EXTERN_API_C( TQ3Status )
  Q3Group_GetNextObjectPosition   (TQ3GroupObject         group,
                                   TQ3Object              object,
                                   TQ3GroupPosition *     position);
  
  EXTERN_API_C( TQ3Status )
  Q3Group_GetPreviousObjectPosition (TQ3GroupObject       group,
                                   TQ3Object              object,
                                   TQ3GroupPosition *     position);
  
  
**************************************************************************** * ** * Group Subclasses ** * ** ***************************************************************************

  
  /* Must contain only lights */
  EXTERN_API_C( TQ3GroupObject )
  Q3LightGroup_New                (void);
  
  /* Must contain only strings */
  EXTERN_API_C( TQ3GroupObject )
  Q3InfoGroup_New                 (void);
  
  
**************************************************************************** * ** * Display Group Routines ** * ** ***************************************************************************

  
  /* May contain only drawables */
  EXTERN_API_C( TQ3GroupObject )
  Q3DisplayGroup_New              (void);
  
  EXTERN_API_C( TQ3ObjectType )
  Q3DisplayGroup_GetType          (TQ3GroupObject         group);
  
  EXTERN_API_C( TQ3Status )
  Q3DisplayGroup_GetState         (TQ3GroupObject         group,
                                   TQ3DisplayGroupState * state);
  
  EXTERN_API_C( TQ3Status )
  Q3DisplayGroup_SetState         (TQ3GroupObject         group,
                                   TQ3DisplayGroupState   state);
  
  EXTERN_API_C( TQ3Status )
  Q3DisplayGroup_Submit           (TQ3GroupObject         group,
                                   TQ3ViewObject          view);
  
  EXTERN_API_C( TQ3Status )
  Q3DisplayGroup_SetAndUseBoundingBox (TQ3GroupObject     group,
                                   TQ3BoundingBox *       bBox);
  
  EXTERN_API_C( TQ3Status )
  Q3DisplayGroup_GetBoundingBox   (TQ3GroupObject         group,
                                   TQ3BoundingBox *       bBox);
  
  EXTERN_API_C( TQ3Status )
  Q3DisplayGroup_RemoveBoundingBox (TQ3GroupObject        group);
  
  EXTERN_API_C( TQ3Status )
  Q3DisplayGroup_CalcAndUseBoundingBox (TQ3GroupObject    group,
                                   TQ3ComputeBounds       computeBounds,
                                   TQ3ViewObject          view);
  
  
**************************************************************************** * ** * Ordered Display Group ** * ** * Ordered display groups keep objects in order by the type of object: ** * ** * 1 kQ3ShapeTypeTransform ** * 2 kQ3ShapeTypeStyle ** * 3 kQ3SetTypeAttribute ** * 4 kQ3ShapeTypeShader ** * 5 kQ3ShapeTypeCamera ** * 6 kQ3ShapeTypeLight ** * 7 kQ3ShapeTypeGeometry ** * 8 kQ3ShapeTypeGroup ** * 9 kQ3ShapeTypeUnknown ** * ** * Within a type, you are responsible for keeping things in order. ** * ** * You may access and/or manipulate the group using the above types ** * (fast), or you may use any parent or leaf class types (slower). ** * ** * Additional types will be added as functionality grows. ** * ** * The group calls which access by type are much faster for ordered ** * display group for the types above. ** * ** * N.B. Lights and Cameras in groups are a no-op when drawn and will ** * post an error with the debug libraries. ** * ** ***************************************************************************

  
  EXTERN_API_C( TQ3GroupObject )
  Q3OrderedDisplayGroup_New       (void);
  
  
**************************************************************************** * ** * IO Proxy Display Group ** * ** * IO Proxy display groups are used to place more than one ** * representation of an object in a metafile. For example, if you know ** * another program does not understand NURBPatches but does understand ** * Meshes, you may place a mesh and a NURB Patch in an IO Proxy Group, ** * and the reading program will select the desired representation. ** * ** * Objects in an IO Proxy Display Group are placed in their preferencial** * order, with the FIRST object being the MOST preferred, the LAST ** * object the least preferred. ** * ** * The behavior of an IO Proxy Display Group is that when drawn/picked/ ** * bounded, the first object in the group that is not "Unknown" is used,** * and the other objects ignored. ** * ** ***************************************************************************

  
  EXTERN_API_C( TQ3GroupObject )
  Q3IOProxyDisplayGroup_New       (void);
  
  
**************************************************************************** * ** * Group Extension Definitions ** * ** ***************************************************************************

  
  /*
   *  Searching methods - OPTIONAL
   */
  endif  /* CALL_NOT_IN_CARBON */
  
  enum {
      kQ3XMethodType_GroupAcceptObject = FOUR_CHAR_CODE('gaco')
  };
  
  typedef CALLBACK_API_C( TQ3Boolean , TQ3XGroupAcceptObjectMethod )(TQ3GroupObject group, TQ3Object object);
  enum {
      kQ3XMethodType_GroupAddObject = FOUR_CHAR_CODE('gado')
  };
  
  typedef CALLBACK_API_C( TQ3GroupPosition , TQ3XGroupAddObjectMethod )(TQ3GroupObject group, TQ3Object object);
  enum {
      kQ3XMethodType_GroupAddObjectBefore = FOUR_CHAR_CODE('gaob')
  };
  
  typedef CALLBACK_API_C( TQ3GroupPosition , TQ3XGroupAddObjectBeforeMethod )(TQ3GroupObject group, TQ3GroupPosition position, TQ3Object object);
  enum {
      kQ3XMethodType_GroupAddObjectAfter = FOUR_CHAR_CODE('gaoa')
  };
  
  typedef CALLBACK_API_C( TQ3GroupPosition , TQ3XGroupAddObjectAfterMethod )(TQ3GroupObject group, TQ3GroupPosition position, TQ3Object object);
  enum {
      kQ3XMethodType_GroupSetPositionObject = FOUR_CHAR_CODE('gspo')
  };
  
  typedef CALLBACK_API_C( TQ3Status , TQ3XGroupSetPositionObjectMethod )(TQ3GroupObject group, TQ3GroupPosition gPos, TQ3Object obj);
  enum {
      kQ3XMethodType_GroupRemovePosition = FOUR_CHAR_CODE('grmp')
  };
  
  typedef CALLBACK_API_C( TQ3Object , TQ3XGroupRemovePositionMethod )(TQ3GroupObject group, TQ3GroupPosition position);
   
  
  /*
   *  Searching methods - OPTIONAL - default uses above methods
   */
  enum {
      kQ3XMethodType_GroupGetFirstPositionOfType = FOUR_CHAR_CODE('gfrt')
  };
  
  typedef CALLBACK_API_C( TQ3Status , TQ3XGroupGetFirstPositionOfTypeMethod )(TQ3GroupObject group, TQ3ObjectType isType, TQ3GroupPosition *gPos);
  enum {
      kQ3XMethodType_GroupGetLastPositionOfType = FOUR_CHAR_CODE('glst')
  };
  
  typedef CALLBACK_API_C( TQ3Status , TQ3XGroupGetLastPositionOfTypeMethod )(TQ3GroupObject group, TQ3ObjectType isType, TQ3GroupPosition *gPos);
  enum {
      kQ3XMethodType_GroupGetNextPositionOfType = FOUR_CHAR_CODE('gnxt')
  };
  
  typedef CALLBACK_API_C( TQ3Status , TQ3XGroupGetNextPositionOfTypeMethod )(TQ3GroupObject group, TQ3ObjectType isType, TQ3GroupPosition *gPos);
  enum {
      kQ3XMethodType_GroupGetPrevPositionOfType = FOUR_CHAR_CODE('gpvt')
  };
  
  typedef CALLBACK_API_C( TQ3Status , TQ3XGroupGetPrevPositionOfTypeMethod )(TQ3GroupObject group, TQ3ObjectType isType, TQ3GroupPosition *gPos);
  enum {
      kQ3XMethodType_GroupCountObjectsOfType = FOUR_CHAR_CODE('gcnt')
  };
  
  typedef CALLBACK_API_C( TQ3Status , TQ3XGroupCountObjectsOfTypeMethod )(TQ3GroupObject group, TQ3ObjectType isType, unsigned long *nObjects);
  enum {
      kQ3XMethodType_GroupEmptyObjectsOfType = FOUR_CHAR_CODE('geot')
  };
  
  typedef CALLBACK_API_C( TQ3Status , TQ3XGroupEmptyObjectsOfTypeMethod )(TQ3GroupObject group, TQ3ObjectType isType);
  enum {
      kQ3XMethodType_GroupGetFirstObjectPosition = FOUR_CHAR_CODE('gfop')
  };
  
  typedef CALLBACK_API_C( TQ3Status , TQ3XGroupGetFirstObjectPositionMethod )(TQ3GroupObject group, TQ3Object object, TQ3GroupPosition *gPos);
  enum {
      kQ3XMethodType_GroupGetLastObjectPosition = FOUR_CHAR_CODE('glop')
  };
  
  typedef CALLBACK_API_C( TQ3Status , TQ3XGroupGetLastObjectPositionMethod )(TQ3GroupObject group, TQ3Object object, TQ3GroupPosition *gPos);
  enum {
      kQ3XMethodType_GroupGetNextObjectPosition = FOUR_CHAR_CODE('gnop')
  };
  
  typedef CALLBACK_API_C( TQ3Status , TQ3XGroupGetNextObjectPositionMethod )(TQ3GroupObject group, TQ3Object object, TQ3GroupPosition *gPos);
  enum {
      kQ3XMethodType_GroupGetPrevObjectPosition = FOUR_CHAR_CODE('gpop')
  };
  
  typedef CALLBACK_API_C( TQ3Status , TQ3XGroupGetPrevObjectPositionMethod )(TQ3GroupObject group, TQ3Object object, TQ3GroupPosition *gPos);
   
  
  /*
   *  Group Position Methods
   */
  enum {
      kQ3XMethodType_GroupPositionSize = FOUR_CHAR_CODE('ggpz')
  };
  
  typedef unsigned long                   TQ3XMethodTypeGroupPositionSize;
  enum {
      kQ3XMethodType_GroupPositionNew = FOUR_CHAR_CODE('ggpn')
  };
  
  typedef CALLBACK_API_C( TQ3Status , TQ3XGroupPositionNewMethod )(void *gPos, TQ3Object object, const void *initData);
  enum {
      kQ3XMethodType_GroupPositionCopy = FOUR_CHAR_CODE('ggpc')
  };
  
  typedef CALLBACK_API_C( TQ3Status , TQ3XGroupPositionCopyMethod )(void *srcGPos, void *dstGPos);
  enum {
      kQ3XMethodType_GroupPositionDelete = FOUR_CHAR_CODE('ggpd')
  };
  
  typedef CALLBACK_API_C( void , TQ3XGroupPositionDeleteMethod )(void *gPos);
   
  
  /*
   *  View Drawing Helpers
   *  
   *  TQ3XGroupStartIterateMethod
   *
   *      Pass back *object = NULL to NOT call EndIterate iterate
   *      Pass back *object != NULL to draw object
   *       (other side will pass it to EndIterate for deletion!)
   *
   *      *iterator is uninitialized, use for iteration state. Caller should 
   *       ignore it.
   *  
   *  TQ3XGroupEndIterateMethod
   *  
   *      *object is previous object, dispose it or play with it.
   *      Pass back NULL when last iteration has occurred
   *      *iterator is previous value, use for iteration state Caller should 
   *      ignore it.
   */
  enum {
      kQ3XMethodType_GroupStartIterate = FOUR_CHAR_CODE('gstd')
  };
  
  typedef CALLBACK_API_C( TQ3Status , TQ3XGroupStartIterateMethod )(TQ3GroupObject group, TQ3GroupPosition *iterator, TQ3Object *object, TQ3ViewObject view);
  enum {
      kQ3XMethodType_GroupEndIterate = FOUR_CHAR_CODE('gitd')
  };
  
  typedef CALLBACK_API_C( TQ3Status , TQ3XGroupEndIterateMethod )(TQ3GroupObject group, TQ3GroupPosition *iterator, TQ3Object *object, TQ3ViewObject view);
   
  
  /*
   *  IO  Helpers
   *  
   *  TQ3XGroupEndReadMethod
   *      Called when a group has been completely read. Group should perform
   *      validation and clean up any reading caches.
   */
  enum {
      kQ3XMethodType_GroupEndRead = FOUR_CHAR_CODE('gerd')
  };
  
  typedef CALLBACK_API_C( TQ3Status , TQ3XGroupEndReadMethod )(TQ3GroupObject group);
  if CALL_NOT_IN_CARBON
  EXTERN_API_C( void *)
  Q3XGroup_GetPositionPrivate     (TQ3GroupObject         group,
                                   TQ3GroupPosition       position);
  
  endif  /* CALL_NOT_IN_CARBON */
  
  if PRAGMA_ENUM_ALWAYSINT
      #pragma enumsalwaysint reset
      #ifdef __QD3DGROUP__RESTORE_TWOBYTEINTS
          #pragma fourbyteints off
      #endif
  #elif PRAGMA_ENUM_OPTIONS
      #pragma option enum=reset
  #elif defined(__QD3DGROUP__RESTORE_PACKED_ENUMS)
      #pragma options(pack_enums)
  endif
  
  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 /* __QD3DGROUP__ */
  
  


(C) Æliens 04/09/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.