/*
     File:       QD3DSet.h
 
     Contains:   Q3Set types and routines
 
     Version:    Technology: Quickdraw 3D 1.6
                 Release:    Universal Interfaces 3.4
 
     Copyright:  © 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 __QD3DSET__
#define __QD3DSET__

#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 __QD3DSET__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 __QD3DSET__RESTORE_PACKED_ENUMS
        #pragma options(!pack_enums)
    #endif
#endif

/******************************************************************************
 **                                                                          **
 **                             Set Routines                                 **
 **                                                                          **
 *****************************************************************************/
#if CALL_NOT_IN_CARBON
/*
 *  Q3Set_New()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQ3SetObject )
Q3Set_New(void);


/*
 *  Q3Set_GetType()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQ3ObjectType )
Q3Set_GetType(TQ3SetObject theSet);


/*
 *  Q3Set_Add()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQ3Status )
Q3Set_Add(
  TQ3SetObject     theSet,
  TQ3ElementType   theType,
  const void *     data);


/*
 *  Q3Set_Get()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQ3Status )
Q3Set_Get(
  TQ3SetObject     theSet,
  TQ3ElementType   theType,
  void *           data);


/*
 *  Q3Set_Contains()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQ3Boolean )
Q3Set_Contains(
  TQ3SetObject     theSet,
  TQ3ElementType   theType);


/*
 *  Q3Set_Clear()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQ3Status )
Q3Set_Clear(
  TQ3SetObject     theSet,
  TQ3ElementType   theType);


/*
 *  Q3Set_Empty()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQ3Status )
Q3Set_Empty(TQ3SetObject target);


/*
 *  Iterating through all elements in a set
 *
 *  Pass in kQ3ElementTypeNone to get first type
 *  kQ3ElementTypeNone is returned when end of list is reached
 */
/*
 *  Q3Set_GetNextElementType()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQ3Status )
Q3Set_GetNextElementType(
  TQ3SetObject      theSet,
  TQ3ElementType *  theType);



/******************************************************************************
 **                                                                          **
 **                             Attribute Types                              **
 **                                                                          **
 *****************************************************************************/
/* 
 *  For the data types listed below, pass in a pointer to it in the _Add 
 *  and _Get calls.
 *
 *  For surface shader attributes, reference counts are incremented on 
 *  the _Add and _Get 
 */
#endif  /* CALL_NOT_IN_CARBON */


enum TQ3AttributeTypes {
                                        /* Data Type          */
  kQ3AttributeTypeNone          = 0,    /* ---------          */
  kQ3AttributeTypeSurfaceUV     = 1,    /* TQ3Param2D          */
  kQ3AttributeTypeShadingUV     = 2,    /* TQ3Param2D           */
  kQ3AttributeTypeNormal        = 3,    /* TQ3Vector3D           */
  kQ3AttributeTypeAmbientCoefficient = 4, /* float            */
  kQ3AttributeTypeDiffuseColor  = 5,    /* TQ3ColorRGB          */
  kQ3AttributeTypeSpecularColor = 6,    /* TQ3ColorRGB          */
  kQ3AttributeTypeSpecularControl = 7,  /* float            */
  kQ3AttributeTypeTransparencyColor = 8, /* TQ3ColorRGB          */
  kQ3AttributeTypeSurfaceTangent = 9,   /* TQ3Tangent2D          */
  kQ3AttributeTypeHighlightState = 10,  /* TQ3Switch           */
  kQ3AttributeTypeSurfaceShader = 11,   /* TQ3SurfaceShaderObject */
  kQ3AttributeTypeNumTypes      = 12
};
typedef enum TQ3AttributeTypes TQ3AttributeTypes;

typedef TQ3ElementType                  TQ3AttributeType;
/******************************************************************************
 **                                                                          **
 **                             Attribute Drawing                            **
 **                                                                          **
 *****************************************************************************/
#if CALL_NOT_IN_CARBON
/*
 *  Q3Attribute_Submit()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQ3Status )
Q3Attribute_Submit(
  TQ3AttributeType   attributeType,
  const void *       data,
  TQ3ViewObject      view);



/******************************************************************************
 **                                                                          **
 **                         AttributeSet Routines                            **
 **                                                                          **
 *****************************************************************************/
/*
 *  Q3AttributeSet_New()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQ3AttributeSet )
Q3AttributeSet_New(void);


/*
 *  Q3AttributeSet_Add()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQ3Status )
Q3AttributeSet_Add(
  TQ3AttributeSet    attributeSet,
  TQ3AttributeType   theType,
  const void *       data);


/*
 *  Q3AttributeSet_Contains()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQ3Boolean )
Q3AttributeSet_Contains(
  TQ3AttributeSet    attributeSet,
  TQ3AttributeType   attributeType);


/*
 *  Q3AttributeSet_Get()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQ3Status )
Q3AttributeSet_Get(
  TQ3AttributeSet    attributeSet,
  TQ3AttributeType   theType,
  void *             data);


/*
 *  Q3AttributeSet_Clear()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQ3Status )
Q3AttributeSet_Clear(
  TQ3AttributeSet    attributeSet,
  TQ3AttributeType   theType);


/*
 *  Q3AttributeSet_Empty()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQ3Status )
Q3AttributeSet_Empty(TQ3AttributeSet target);


/*
 * Q3AttributeSet_GetNextAttributeType
 *
 * Pass in kQ3AttributeTypeNone to get first type
 * kQ3AttributeTypeNone is returned when end of list is reached
 */
/*
 *  Q3AttributeSet_GetNextAttributeType()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQ3Status )
Q3AttributeSet_GetNextAttributeType(
  TQ3AttributeSet     source,
  TQ3AttributeType *  theType);


/*
 *  Q3AttributeSet_Submit()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQ3Status )
Q3AttributeSet_Submit(
  TQ3AttributeSet   attributeSet,
  TQ3ViewObject     view);


/*
 * Inherit from parent->child into result
 *  Result attributes are:
 *      all child attributes + all parent attributes NOT in the child
 */
/*
 *  Q3AttributeSet_Inherit()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQ3Status )
Q3AttributeSet_Inherit(
  TQ3AttributeSet   parent,
  TQ3AttributeSet   child,
  TQ3AttributeSet   result);



/******************************************************************************
 **                                                                          **
 **                         Custom Element Registration                      **
 **                                                                          **
 *****************************************************************************/
/*
 * Element Methods - 
 *
 *      When you create a custom element, you control what structures are 
 *      passed around the API. For example, you may allow the Q3Set_Add call 
 *      take one type of argument, store your element internally in some 
 *      abstract data type, and have the Q3Set_Get call take a different 
 *      argument.
 *
 *      For example:
 *          
 *      There are four calls which at some point will copy an element:
 *
 *      Q3Set_Add (copied from Application memory to QuickDraw3D memory)
 *      Q3Set_Get (copied from QuickDraw3D memory to Application memory)
 *      Q3Object_Duplicate (all elements are copied internally)
 *      Q3AttributeSet_Inherit (all elements are copied internally)
 *
 *      Either CopyAdd or CopyReplace is called during the "_Add" call.
 *          - CopyAdd is destructive and should assume "toElement" is garbage
 *          - CopyReplace is replacing an existing element.
 *
 *      CopyGet is called during the "_Get" call.
 *
 *      CopyDuplicate is called to duplicate an element's internal structure.
 *
 * Attributes Methods - 
 *
 *      For copying data while Inheriting. Element methods are used
 *      at all other times.
 *  
 *      CopyInherit is called to duplicate an element's internal structure 
 *          during inheritance. You should make this as fast as possible.
 *          (for example, if your custom element contains objects, you
 *           should do a Q3Shared_GetReference instead of a Q3Object_Duplicate)
 *          
 *      The ElementDelete method will be called for all of your elements 
 *      copied around via CopyAdd, CopyReplace, CopyDuplicate, and 
 *      CopyInherit.
 *      If CopyGet allocates any memory in it's destination, it is up to the 
 *      application to delete it on its side.
 */
#endif  /* CALL_NOT_IN_CARBON */

#define kQ3XMethodTypeElementCopyAdd            Q3_METHOD_TYPE('e','c','p','a')
#define kQ3XMethodTypeElementCopyReplace        Q3_METHOD_TYPE('e','c','p','r')
#define kQ3XMethodTypeElementCopyGet            Q3_METHOD_TYPE('e','c','p','g')
#define kQ3XMethodTypeElementCopyDuplicate      Q3_METHOD_TYPE('e','c','p','d')
#define kQ3XMethodTypeElementDelete             Q3_METHOD_TYPE('e','d','e','l')
typedef CALLBACK_API_C( TQ3Status , TQ3XElementCopyAddMethod )(const void *fromAPIElement, void *toInternalElement);
typedef CALLBACK_API_C( TQ3Status , TQ3XElementCopyReplaceMethod )(const void *fromAPIElement, void *ontoInternalElement);
typedef CALLBACK_API_C( TQ3Status , TQ3XElementCopyGetMethod )(const void *fromInternalElement, void *toAPIElement);
typedef CALLBACK_API_C( TQ3Status , TQ3XElementCopyDuplicateMethod )(const void *fromInternalElement, void *toInternalElement);
typedef CALLBACK_API_C( TQ3Status , TQ3XElementDeleteMethod )(void * internalElement);
#if CALL_NOT_IN_CARBON
/*
 *  Q3XElementClass_Register()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQ3XObjectClass )
Q3XElementClass_Register(
  TQ3ElementType *  elementType,
  const char *      name,
  unsigned long     sizeOfElement,
  TQ3XMetaHandler   metaHandler);


/*
 *  Q3XElementType_GetElementSize()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQ3Status )
Q3XElementType_GetElementSize(
  TQ3ElementType   elementType,
  unsigned long *  sizeOfElement);



#endif  /* CALL_NOT_IN_CARBON */

/******************************************************************************
 **                                                                          **
 **                     Custom Attribute Registration                        **
 **                                                                          **
 *****************************************************************************/
#define kQ3XMethodTypeAttributeInherit      Q3_METHOD_TYPE('i','n','h','t')
typedef TQ3Boolean                      TQ3XAttributeInheritMethod;
/* return kQ3True or kQ3False in your metahandler */
#define kQ3XMethodTypeAttributeCopyInherit  Q3_METHOD_TYPE('a','c','p','i')
typedef CALLBACK_API_C( TQ3Status , TQ3XAttributeCopyInheritMethod )(const void *fromInternalAttribute, void *toInternalAttribute);
#if CALL_NOT_IN_CARBON
/*
 *  Q3XAttributeClass_Register()
 *  
 *  Availability:
 *    Non-Carbon CFM:   not available
 *    CarbonLib:        not available
 *    Mac OS X:         not available
 */
EXTERN_API_C( TQ3XObjectClass )
Q3XAttributeClass_Register(
  TQ3AttributeType *  attributeType,
  const char *        creatorName,
  unsigned long       sizeOfElement,
  TQ3XMetaHandler     metaHandler);


#endif  /* CALL_NOT_IN_CARBON */

/*
 *  Version 1.5
 */
#define kQ3XMethodTypeAttributeDefault      Q3_METHOD_TYPE('a','s','d','f')
typedef CALLBACK_API_C( TQ3Status , TQ3XAttributeDefaultMethod )(void * internalElement);
#define kQ3XMethodTypeAttributeIsDefault        Q3_METHOD_TYPE('a','i','d','f')
typedef CALLBACK_API_C( TQ3Boolean , TQ3XAttributeIsDefaultMethod )(void * internalElement);







#if PRAGMA_ENUM_ALWAYSINT
    #pragma enumsalwaysint reset
    #ifdef __QD3DSET__RESTORE_TWOBYTEINTS
        #pragma fourbyteints off
    #endif
#elif PRAGMA_ENUM_OPTIONS
    #pragma option enum=reset
#elif defined(__QD3DSET__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 /* __QD3DSET__ */

