QD3DRenderer.h
上传用户:xjjlds
上传日期:2015-12-05
资源大小:22823k
文件大小:51k
源码类别:

多媒体编程

开发平台:

Visual C++

  1. /*
  2.      File:       QD3DRenderer.h
  3.  
  4.      Contains:   Q3Renderer types and routines
  5.  
  6.      Version:    Technology: Quickdraw 3D 1.6
  7.                  Release:    QuickTime 6.0.2
  8.  
  9.      Copyright:  (c) 1995-2001 by Apple Computer, Inc., all rights reserved.
  10.  
  11.      Bugs?:      For bug reports, consult the following page on
  12.                  the World Wide Web:
  13.  
  14.                      http://developer.apple.com/bugreporter/
  15.  
  16. */
  17. #ifndef __QD3DRENDERER__
  18. #define __QD3DRENDERER__
  19. #ifndef __QD3D__
  20. #include "QD3D.h"
  21. #endif
  22. #ifndef __QD3DSET__
  23. #include "QD3DSet.h"
  24. #endif
  25. #ifndef __QD3DVIEW__
  26. #include "QD3DView.h"
  27. #endif
  28. #ifndef __RAVE__
  29. #include "RAVE.h"
  30. #endif
  31. #if TARGET_OS_MAC
  32. #ifndef __EVENTS__
  33. #include "Events.h"
  34. #endif
  35. #endif  /* TARGET_OS_MAC */
  36. #if PRAGMA_ONCE
  37. #pragma once
  38. #endif
  39. #ifdef __cplusplus
  40. extern "C" {
  41. #endif
  42. #if PRAGMA_IMPORT
  43. #pragma import on
  44. #endif
  45. #if PRAGMA_STRUCT_ALIGN
  46.     #pragma options align=power
  47. #elif PRAGMA_STRUCT_PACKPUSH
  48.     #pragma pack(push, 2)
  49. #elif PRAGMA_STRUCT_PACK
  50.     #pragma pack(2)
  51. #endif
  52. #if PRAGMA_ENUM_ALWAYSINT
  53.     #if defined(__fourbyteints__) && !__fourbyteints__ 
  54.         #define __QD3DRENDERER__RESTORE_TWOBYTEINTS
  55.         #pragma fourbyteints on
  56.     #endif
  57.     #pragma enumsalwaysint on
  58. #elif PRAGMA_ENUM_OPTIONS
  59.     #pragma option enum=int
  60. #elif PRAGMA_ENUM_PACK
  61.     #if __option(pack_enums)
  62.         #define __QD3DRENDERER__RESTORE_PACKED_ENUMS
  63.         #pragma options(!pack_enums)
  64.     #endif
  65. #endif
  66. /******************************************************************************
  67.  **                                                                          **
  68.  **                         User Interface Things                            **
  69.  **                                                                          **
  70.  *****************************************************************************/
  71. #if TARGET_OS_MAC
  72. /*
  73.  *  A callback to an application's event handling code. This is needed to    
  74.  *  support movable modal dialogs. The dialog's event filter calls this      
  75.  *  callback with events it does not handle.                                 
  76.  *  If an application handles the event it should return kQ3True.            
  77.  *  If the application does not handle the event it must return kQ3False and 
  78.  *  the dialog's event filter will pass the event to the system unhandled.   
  79.  */
  80. typedef CALLBACK_API_C( TQ3Boolean , TQ3MacOSDialogEventHandler )(const EventRecord *event);
  81. struct TQ3DialogAnchor {
  82.     TQ3MacOSDialogEventHandler      clientEventHandler;
  83. };
  84. typedef struct TQ3DialogAnchor          TQ3DialogAnchor;
  85. #endif  /* TARGET_OS_MAC */
  86. #if TARGET_OS_WIN32
  87. struct TQ3DialogAnchor {
  88.     HWND                            ownerWindow;
  89. };
  90. typedef struct TQ3DialogAnchor          TQ3DialogAnchor;
  91. #endif  /* TARGET_OS_WIN32 */
  92. #if TARGET_OS_UNIX
  93. struct TQ3DialogAnchor {
  94.     void *                          notUsed;                    /* place holder */
  95. };
  96. typedef struct TQ3DialogAnchor          TQ3DialogAnchor;
  97. #endif  /* TARGET_OS_UNIX */
  98. /******************************************************************************
  99.  **                                                                          **
  100.  **                         Renderer Functions                               **
  101.  **                                                                          **
  102.  *****************************************************************************/
  103. #if CALL_NOT_IN_CARBON
  104. EXTERN_API_C( TQ3RendererObject )
  105. Q3Renderer_NewFromType          (TQ3ObjectType          rendererObjectType);
  106. EXTERN_API_C( TQ3ObjectType )
  107. Q3Renderer_GetType              (TQ3RendererObject      renderer);
  108. /* Q3Renderer_Flush has been replaced by Q3View_Flush */
  109. /* Q3Renderer_Sync has been replaced by Q3View_Sync */
  110. #endif  /* CALL_NOT_IN_CARBON */
  111. /*
  112.  *  Q3Renderer_IsInteractive
  113.  *      Determine if this renderer is intended to be used interactively.
  114.  */
  115. #if CALL_NOT_IN_CARBON
  116. EXTERN_API_C( TQ3Boolean )
  117. Q3Renderer_IsInteractive        (TQ3RendererObject      renderer);
  118. /*
  119.  *  Q3Renderer_HasModalConfigure
  120.  *      Determine if this renderer has a modal settings dialog.
  121.  *
  122.  *  Q3Renderer_ModalConfigure
  123.  *      Have the renderer pop up a modal dialog box to configure its settings.
  124.  *  dialogAnchor - is platform specific data passed by the client to support
  125.  *      movable modal dialogs. 
  126.  *    MacOS: this is a callback to the calling application's event handler.
  127.  *      The renderer calls this function with events not handled by the 
  128.  *      settings dialog. This is necessary in order to support movable modal 
  129.  *      dialogs. An application's event handler must return kQ3True if it 
  130.  *      handles the event passed to the callback or kQ3False if not. 
  131.  *      An application which doesn't want to support a movable modal configure
  132.  *      dialog should pass NULL for the clientEventHandler of TQ3DialogAnchor.
  133.  *    Win32: this is the HWND of the owning window (typically an application's
  134.  *      main window).
  135.  *  canceled - returns a boolean inditacating that the user canceled the 
  136.  *  dialog.
  137.  *      
  138.  */
  139. EXTERN_API_C( TQ3Boolean )
  140. Q3Renderer_HasModalConfigure    (TQ3RendererObject      renderer);
  141. EXTERN_API_C( TQ3Status )
  142. Q3Renderer_ModalConfigure       (TQ3RendererObject      renderer,
  143.                                  TQ3DialogAnchor        dialogAnchor,
  144.                                  TQ3Boolean *           canceled);
  145. /*
  146.  *  Q3RendererClass_GetNickNameString
  147.  *      Allows an application to get a renderers name string, the 
  148.  *      renderer is responsible for storing this in a localizable format
  149.  *      for example as a resource.  This string can then be used to provide
  150.  *      a selection mechanism for an application (for example in a menu).
  151.  *
  152.  *      If this call returns nil in the supplied string, then the App may 
  153.  *      choose to use the class name for the renderer.  You should always 
  154.  *      try to get the name string before using the class name, since the
  155.  *      class name is not localizable.
  156.  */
  157. EXTERN_API_C( TQ3Status )
  158. Q3RendererClass_GetNickNameString (TQ3ObjectType        rendererClassType,
  159.                                  TQ3ObjectClassNameString  rendererClassString);
  160. /*
  161.  *  Q3Renderer_GetConfigurationData
  162.  *      Allows an application to collect private renderer configuration data
  163.  *      which it will then save. For example in a preference file or in a 
  164.  *      style template. An application should tag this data with the 
  165.  *      Renderer's object  name.
  166.  *  
  167.  *      if dataBuffer is NULL actualDataSize returns the required size in 
  168.  *      bytes of a data buffer large enough to store private data. 
  169.  *
  170.  *      bufferSize is the actual size of the memory block pointed to by 
  171.  *      dataBuffer
  172.  *
  173.  *      actualDataSize - on return the actual number of bytes written to the 
  174.  *      buffer or if dataBuffer is NULL the required size of dataBuffer
  175.  * 
  176.  */
  177. EXTERN_API_C( TQ3Status )
  178. Q3Renderer_GetConfigurationData (TQ3RendererObject      renderer,
  179.                                  unsigned char *        dataBuffer,
  180.                                  unsigned long          bufferSize,
  181.                                  unsigned long *        actualDataSize);
  182. EXTERN_API_C( TQ3Status )
  183. Q3Renderer_SetConfigurationData (TQ3RendererObject      renderer,
  184.                                  unsigned char *        dataBuffer,
  185.                                  unsigned long          bufferSize);
  186. /******************************************************************************
  187.  **                                                                          **
  188.  **                     Interactive Renderer Specific Functions              **
  189.  **                                                                          **
  190.  *****************************************************************************/
  191. /* CSG IDs attribute */
  192. #define kQ3AttributeTypeConstructiveSolidGeometryID     Q3_OBJECT_TYPE('c','s','g','i')
  193. /* Object IDs, to be applied as attributes on geometries */
  194. #endif  /* CALL_NOT_IN_CARBON */
  195. #define kQ3SolidGeometryObjNone (-1)
  196. #define kQ3SolidGeometryObjA    0
  197. #define kQ3SolidGeometryObjB    1
  198. #define kQ3SolidGeometryObjC    2
  199. #define kQ3SolidGeometryObjD    3
  200. #define kQ3SolidGeometryObjE    4
  201. /* Possible CSG equations */
  202. enum TQ3CSGEquation {
  203.     kQ3CSGEquationAandB         = (long)0x88888888,
  204.     kQ3CSGEquationAandnotB      = 0x22222222,
  205.     kQ3CSGEquationAanBonCad     = 0x2F222F22,
  206.     kQ3CSGEquationnotAandB      = 0x44444444,
  207.     kQ3CSGEquationnAaBorCanB    = 0x74747474
  208. };
  209. typedef enum TQ3CSGEquation TQ3CSGEquation;
  210. #if CALL_NOT_IN_CARBON
  211. EXTERN_API_C( TQ3Status )
  212. Q3InteractiveRenderer_SetCSGEquation (TQ3RendererObject  renderer,
  213.                                  TQ3CSGEquation         equation);
  214. EXTERN_API_C( TQ3Status )
  215. Q3InteractiveRenderer_GetCSGEquation (TQ3RendererObject  renderer,
  216.                                  TQ3CSGEquation *       equation);
  217. EXTERN_API_C( TQ3Status )
  218. Q3InteractiveRenderer_SetPreferences (TQ3RendererObject  renderer,
  219.                                  long                   vendorID,
  220.                                  long                   engineID);
  221. EXTERN_API_C( TQ3Status )
  222. Q3InteractiveRenderer_GetPreferences (TQ3RendererObject  renderer,
  223.                                  long *                 vendorID,
  224.                                  long *                 engineID);
  225. EXTERN_API_C( TQ3Status )
  226. Q3InteractiveRenderer_SetDoubleBufferBypass (TQ3RendererObject  renderer,
  227.                                  TQ3Boolean             bypass);
  228. EXTERN_API_C( TQ3Status )
  229. Q3InteractiveRenderer_GetDoubleBufferBypass (TQ3RendererObject  renderer,
  230.                                  TQ3Boolean *           bypass);
  231. EXTERN_API_C( TQ3Status )
  232. Q3InteractiveRenderer_SetRAVEContextHints (TQ3RendererObject  renderer,
  233.                                  unsigned long          RAVEContextHints);
  234. EXTERN_API_C( TQ3Status )
  235. Q3InteractiveRenderer_GetRAVEContextHints (TQ3RendererObject  renderer,
  236.                                  unsigned long *        RAVEContextHints);
  237. EXTERN_API_C( TQ3Status )
  238. Q3InteractiveRenderer_SetRAVETextureFilter (TQ3RendererObject  renderer,
  239.                                  unsigned long          RAVEtextureFilterValue);
  240. EXTERN_API_C( TQ3Status )
  241. Q3InteractiveRenderer_GetRAVETextureFilter (TQ3RendererObject  renderer,
  242.                                  unsigned long *        RAVEtextureFilterValue);
  243. EXTERN_API_C( TQ3Status )
  244. Q3InteractiveRenderer_CountRAVEDrawContexts (TQ3RendererObject  renderer,
  245.                                  unsigned long *        numRAVEContexts);
  246. #endif  /* CALL_NOT_IN_CARBON */
  247. typedef CALLBACK_API_C( void , TQ3RaveDestroyCallback )(TQ3RendererObject renderer);
  248. #if CALL_NOT_IN_CARBON
  249. EXTERN_API_C( TQ3Status )
  250. Q3InteractiveRenderer_GetRAVEDrawContexts (TQ3RendererObject  renderer,
  251.                                  TQADrawContext **      raveDrawContextList,
  252.                                  TQAEngine **           raveDrawingEnginesList,
  253.                                  unsigned long *        numRAVEContexts,
  254.                                  TQ3RaveDestroyCallback  raveDestroyCallback);
  255. /******************************************************************************
  256.  **                                                                          **
  257.  **                         Renderer View Tools                              **
  258.  **                                                                          **
  259.  **                 You may only call these methods from a plug-in           **
  260.  **                                                                          **
  261.  *****************************************************************************/
  262. /*
  263.  *  Call by a renderer to call the user "idle" method, with progress 
  264.  *  information.
  265.  *  
  266.  *  Pass in (view, 0, n) on first call
  267.  *  Pass in (view, 1..n-1, n) during rendering
  268.  *  Pass in (view, n, n) upon completion
  269.  *  
  270.  *  Note: The user must have supplied an idleProgress method with 
  271.  *  Q3XView_SetIdleProgressMethod. Otherwise, the generic idle method is
  272.  *  called with no progress data. e.g. the Q3View_SetIdleMethod method
  273.  *  is called instead. (current and final are ignored, essentially.)
  274.  *
  275.  *  Returns kQ3Failure if rendering is cancelled.
  276.  */
  277. EXTERN_API_C( TQ3Status )
  278. Q3XView_IdleProgress            (TQ3ViewObject          view,
  279.                                  unsigned long          current,
  280.                                  unsigned long          completed);
  281. /*
  282.  *  Called by an asynchronous renderer when it completes a frame.
  283.  */
  284. EXTERN_API_C( TQ3Status )
  285. Q3XView_EndFrame                (TQ3ViewObject          view);
  286. /******************************************************************************
  287.  **                                                                          **
  288.  **                         Renderer AttributeSet Tools                      **
  289.  **                                                                          **
  290.  **                 You may only call these methods from a plug-in           **
  291.  **                                                                          **
  292.  *****************************************************************************/
  293. /*
  294.  *  Faster access to geometry attribute sets.
  295.  *  
  296.  *  Returns pointer to INTERNAL data structure for elements and attributes
  297.  *  in an attributeSet, or NULL if no attribute exists.
  298.  *  
  299.  *  For attributes of type kQ3AttributeType..., the internal data structure
  300.  *  is identical to the data structure used in Q3AttributeSet_Add.
  301.  */
  302. EXTERN_API_C( void *)
  303. Q3XAttributeSet_GetPointer      (TQ3AttributeSet        attributeSet,
  304.                                  TQ3AttributeType       attributeType);
  305. #endif  /* CALL_NOT_IN_CARBON */
  306. enum {
  307.     kQ3XAttributeMaskNone       = 0L,
  308.     kQ3XAttributeMaskSurfaceUV  = 1 << (kQ3AttributeTypeSurfaceUV - 1),
  309.     kQ3XAttributeMaskShadingUV  = 1 << (kQ3AttributeTypeShadingUV - 1),
  310.     kQ3XAttributeMaskNormal     = 1 << (kQ3AttributeTypeNormal - 1),
  311.     kQ3XAttributeMaskAmbientCoefficient = 1 << (kQ3AttributeTypeAmbientCoefficient - 1),
  312.     kQ3XAttributeMaskDiffuseColor = 1 << (kQ3AttributeTypeDiffuseColor - 1),
  313.     kQ3XAttributeMaskSpecularColor = 1 << (kQ3AttributeTypeSpecularColor - 1),
  314.     kQ3XAttributeMaskSpecularControl = 1 << (kQ3AttributeTypeSpecularControl - 1),
  315.     kQ3XAttributeMaskTransparencyColor = 1 << (kQ3AttributeTypeTransparencyColor - 1),
  316.     kQ3XAttributeMaskSurfaceTangent = 1 << (kQ3AttributeTypeSurfaceTangent - 1),
  317.     kQ3XAttributeMaskHighlightState = 1 << (kQ3AttributeTypeHighlightState - 1),
  318.     kQ3XAttributeMaskSurfaceShader = 1 << (kQ3AttributeTypeSurfaceShader - 1),
  319.     kQ3XAttributeMaskCustomAttribute = (long)0x80000000,
  320.     kQ3XAttributeMaskAll        = 0x800007FF,
  321.     kQ3XAttributeMaskInherited  = 0x03FF,
  322.     kQ3XAttributeMaskInterpolated = kQ3XAttributeMaskSurfaceUV | kQ3XAttributeMaskShadingUV | kQ3XAttributeMaskNormal | kQ3XAttributeMaskAmbientCoefficient | kQ3XAttributeMaskDiffuseColor | kQ3XAttributeMaskSpecularColor | kQ3XAttributeMaskSpecularControl | kQ3XAttributeMaskTransparencyColor | kQ3XAttributeMaskSurfaceTangent
  323. };
  324. typedef unsigned long                   TQ3XAttributeMask;
  325. #if CALL_NOT_IN_CARBON
  326. EXTERN_API_C( TQ3XAttributeMask )
  327. Q3XAttributeSet_GetMask         (TQ3AttributeSet        attributeSet);
  328. /******************************************************************************
  329.  **                                                                          **
  330.  **                         Renderer Draw Context Tools                      **
  331.  **                                                                          **
  332.  *****************************************************************************/
  333. #endif  /* CALL_NOT_IN_CARBON */
  334. typedef struct OpaqueTQ3XDrawRegion*    TQ3XDrawRegion;
  335. #if CALL_NOT_IN_CARBON
  336. EXTERN_API_C( TQ3Status )
  337. Q3XDrawContext_GetDrawRegion    (TQ3DrawContextObject   drawContext,
  338.                                  TQ3XDrawRegion *       drawRegion);
  339. #endif  /* CALL_NOT_IN_CARBON */
  340. enum TQ3XDrawContextValidationMasks {
  341.     kQ3XDrawContextValidationClearFlags = 0x00000000,
  342.     kQ3XDrawContextValidationDoubleBuffer = 1 << 0,
  343.     kQ3XDrawContextValidationShader = 1 << 1,
  344.     kQ3XDrawContextValidationClearFunction = 1 << 2,
  345.     kQ3XDrawContextValidationActiveBuffer = 1 << 3,
  346.     kQ3XDrawContextValidationInternalOffScreen = 1 << 4,
  347.     kQ3XDrawContextValidationPane = 1 << 5,
  348.     kQ3XDrawContextValidationMask = 1 << 6,
  349.     kQ3XDrawContextValidationDevice = 1 << 7,
  350.     kQ3XDrawContextValidationWindow = 1 << 8,
  351.     kQ3XDrawContextValidationWindowSize = 1 << 9,
  352.     kQ3XDrawContextValidationWindowClip = 1 << 10,
  353.     kQ3XDrawContextValidationWindowPosition = 1 << 11,
  354.     kQ3XDrawContextValidationPlatformAttributes = 1 << 12,
  355.     kQ3XDrawContextValidationForegroundShader = 1 << 13,
  356.     kQ3XDrawContextValidationBackgroundShader = 1 << 14,
  357.     kQ3XDrawContextValidationColorPalette = 1 << 15,
  358.     kQ3XDrawContextValidationAll = (long)0xFFFFFFFF
  359. };
  360. typedef enum TQ3XDrawContextValidationMasks TQ3XDrawContextValidationMasks;
  361. typedef unsigned long                   TQ3XDrawContextValidation;
  362. #if CALL_NOT_IN_CARBON
  363. EXTERN_API_C( TQ3Status )
  364. Q3XDrawContext_ClearValidationFlags (TQ3DrawContextObject  drawContext);
  365. EXTERN_API_C( TQ3Status )
  366. Q3XDrawContext_GetValidationFlags (TQ3DrawContextObject  drawContext,
  367.                                  TQ3XDrawContextValidation * validationFlags);
  368. /******************************************************************************
  369.  **                                                                          **
  370.  **                         Renderer Draw Region Tools                       **
  371.  **                                                                          **
  372.  *****************************************************************************/
  373. #endif  /* CALL_NOT_IN_CARBON */
  374. enum TQ3XDevicePixelType {
  375.                                                                 /* These do not indicate byte ordering   */
  376.     kQ3XDevicePixelTypeInvalid  = 0,                            /* Unknown, un-initialized type    */
  377.     kQ3XDevicePixelTypeRGB32    = 1,                            /* Alpha:8 (ignored), R:8, G:8, B:8 */
  378.     kQ3XDevicePixelTypeARGB32   = 2,                            /* Alpha:8, R:8, G:8, B:8           */
  379.     kQ3XDevicePixelTypeRGB24    = 3,                            /* 24 bits/pixel, R:8, G:8, B:8    */
  380.     kQ3XDevicePixelTypeRGB16    = 4,                            /* Alpha:1 (ignored), R:5, G:5, B:5 */
  381.     kQ3XDevicePixelTypeARGB16   = 5,                            /* Alpha:1, R:5, G:5, B:5           */
  382.     kQ3XDevicePixelTypeRGB16_565 = 6,                           /* 16 bits/pixel, R:5, G:6, B:5    */
  383.     kQ3XDevicePixelTypeIndexed8 = 7,                            /* 8-bit color table index          */
  384.     kQ3XDevicePixelTypeIndexed4 = 8,                            /* 4-bit color table index          */
  385.     kQ3XDevicePixelTypeIndexed2 = 9,                            /* 2-bit color table index          */
  386.     kQ3XDevicePixelTypeIndexed1 = 10                            /* 1-bit color table index          */
  387. };
  388. typedef enum TQ3XDevicePixelType TQ3XDevicePixelType;
  389. enum TQ3XClipMaskState {
  390.     kQ3XClipMaskFullyExposed    = 0,
  391.     kQ3XClipMaskPartiallyExposed = 1,
  392.     kQ3XClipMaskNotExposed      = 2
  393. };
  394. typedef enum TQ3XClipMaskState TQ3XClipMaskState;
  395. struct TQ3XColorDescriptor {
  396.     unsigned long                   redShift;
  397.     unsigned long                   redMask;
  398.     unsigned long                   greenShift;
  399.     unsigned long                   greenMask;
  400.     unsigned long                   blueShift;
  401.     unsigned long                   blueMask;
  402.     unsigned long                   alphaShift;
  403.     unsigned long                   alphaMask;
  404. };
  405. typedef struct TQ3XColorDescriptor      TQ3XColorDescriptor;
  406. struct TQ3XDrawRegionDescriptor {
  407.     unsigned long                   width;
  408.     unsigned long                   height;
  409.     unsigned long                   rowBytes;
  410.     unsigned long                   pixelSize;
  411.     TQ3XDevicePixelType             pixelType;
  412.     TQ3XColorDescriptor             colorDescriptor;
  413.     TQ3Endian                       bitOrder;
  414.     TQ3Endian                       byteOrder;
  415.     TQ3Bitmap *                     clipMask;
  416. };
  417. typedef struct TQ3XDrawRegionDescriptor TQ3XDrawRegionDescriptor;
  418. enum TQ3XDrawRegionServicesMasks {
  419.     kQ3XDrawRegionServicesNoneFlag = 0L,
  420.     kQ3XDrawRegionServicesClearFlag = 1 << 0,
  421.     kQ3XDrawRegionServicesDontLockDDSurfaceFlag = 1 << 1
  422. };
  423. typedef enum TQ3XDrawRegionServicesMasks TQ3XDrawRegionServicesMasks;
  424. typedef unsigned long                   TQ3XDrawRegionServices;
  425. typedef CALLBACK_API_C( void , TQ3XDrawRegionRendererPrivateDeleteMethod )(void *rendererPrivate);
  426. #if CALL_NOT_IN_CARBON
  427. EXTERN_API_C( TQ3Status )
  428. Q3XDrawRegion_GetDeviceScaleX   (TQ3XDrawRegion         drawRegion,
  429.                                  float *                deviceScaleX);
  430. EXTERN_API_C( TQ3Status )
  431. Q3XDrawRegion_GetDeviceScaleY   (TQ3XDrawRegion         drawRegion,
  432.                                  float *                deviceScaleY);
  433. EXTERN_API_C( TQ3Status )
  434. Q3XDrawRegion_GetDeviceOffsetX  (TQ3XDrawRegion         drawRegion,
  435.                                  float *                deviceOffsetX);
  436. EXTERN_API_C( TQ3Status )
  437. Q3XDrawRegion_GetDeviceOffsetY  (TQ3XDrawRegion         drawRegion,
  438.                                  float *                deviceOffsetX);
  439. EXTERN_API_C( TQ3Status )
  440. Q3XDrawRegion_GetWindowScaleX   (TQ3XDrawRegion         drawRegion,
  441.                                  float *                windowScaleX);
  442. EXTERN_API_C( TQ3Status )
  443. Q3XDrawRegion_GetWindowScaleY   (TQ3XDrawRegion         drawRegion,
  444.                                  float *                windowScaleY);
  445. EXTERN_API_C( TQ3Status )
  446. Q3XDrawRegion_GetWindowOffsetX  (TQ3XDrawRegion         drawRegion,
  447.                                  float *                windowOffsetX);
  448. EXTERN_API_C( TQ3Status )
  449. Q3XDrawRegion_GetWindowOffsetY  (TQ3XDrawRegion         drawRegion,
  450.                                  float *                windowOffsetY);
  451. EXTERN_API_C( TQ3Status )
  452. Q3XDrawRegion_IsActive          (TQ3XDrawRegion         drawRegion,
  453.                                  TQ3Boolean *           isActive);
  454. EXTERN_API_C( TQ3Status )
  455. Q3XDrawRegion_GetNextRegion     (TQ3XDrawRegion         drawRegion,
  456.                                  TQ3XDrawRegion *       nextDrawRegion);
  457. /* 
  458.  *  One of the next two functions must be called before using a draw region 
  459.  */
  460. /*
  461.  *  Use this Start function if double buffering/image access services from the
  462.  *  Draw Context are not needed, you may still request clear for example
  463.  */
  464. EXTERN_API_C( TQ3Status )
  465. Q3XDrawRegion_Start             (TQ3XDrawRegion         drawRegion,
  466.                                  TQ3XDrawRegionServices  services,
  467.                                  TQ3XDrawRegionDescriptor ** descriptor);
  468. /*
  469.  *  Use this Start function if double buffering or image access services from 
  470.  *  the Draw Context are needed.
  471.  */
  472. EXTERN_API_C( TQ3Status )
  473. Q3XDrawRegion_StartAccessToImageBuffer (TQ3XDrawRegion  drawRegion,
  474.                                  TQ3XDrawRegionServices  services,
  475.                                  TQ3XDrawRegionDescriptor ** descriptor,
  476.                                  void **                image);
  477. /*
  478.  *  This function is used to indicate that access to a DrawRegion is ended.
  479.  */
  480. EXTERN_API_C( TQ3Status )
  481. Q3XDrawRegion_End               (TQ3XDrawRegion         drawRegion);
  482. EXTERN_API_C( TQ3Status )
  483. Q3XDrawRegion_GetDeviceTransform (TQ3XDrawRegion        drawRegion,
  484.                                  TQ3Matrix4x4 **        deviceTransform);
  485. EXTERN_API_C( TQ3Status )
  486. Q3XDrawRegion_GetClipFlags      (TQ3XDrawRegion         drawRegion,
  487.                                  TQ3XClipMaskState *    clipMaskState);
  488. EXTERN_API_C( TQ3Status )
  489. Q3XDrawRegion_GetClipMask       (TQ3XDrawRegion         drawRegion,
  490.                                  TQ3Bitmap **           clipMask);
  491. #endif  /* CALL_NOT_IN_CARBON */
  492. #if TARGET_OS_MAC
  493. #if CALL_NOT_IN_CARBON
  494. EXTERN_API_C( TQ3Status )
  495. Q3XDrawRegion_GetClipRegion     (TQ3XDrawRegion         drawRegion,
  496.                                  RgnHandle *            rgnHandle);
  497. EXTERN_API_C( TQ3Status )
  498. Q3XDrawRegion_GetGDHandle       (TQ3XDrawRegion         drawRegion,
  499.                                  GDHandle *             gdHandle);
  500. #endif  /* CALL_NOT_IN_CARBON */
  501. #endif  /* TARGET_OS_MAC */
  502. #if CALL_NOT_IN_CARBON
  503. EXTERN_API_C( TQ3Status )
  504. Q3XDrawRegion_GetRendererPrivate (TQ3XDrawRegion        drawRegion,
  505.                                  void **                rendererPrivate);
  506. EXTERN_API_C( TQ3Status )
  507. Q3XDrawRegion_SetRendererPrivate (TQ3XDrawRegion        drawRegion,
  508.                                  const void *           rendererPrivate,
  509.                                  TQ3XDrawRegionRendererPrivateDeleteMethod  deleteMethod);
  510. EXTERN_API_C( TQ3Status )
  511. Q3XDrawRegion_SetUseDefaultRendererFlag (TQ3XDrawRegion  drawRegion,
  512.                                  TQ3Boolean             flag);
  513. EXTERN_API_C( TQ3Status )
  514. Q3XDrawRegion_GetUseDefaultRendererFlag (TQ3XDrawRegion  drawRegion,
  515.                                  TQ3Boolean *           useDefaultRenderingFlag);
  516. /******************************************************************************
  517.  **                                                                          **
  518.  **                         Renderer Class Methods                           **
  519.  **                                                                          **
  520.  *****************************************************************************/
  521. /*
  522.  *  Methods from Object
  523.  *      kQ3XMethodTypeObjectClassRegister
  524.  *      kQ3XMethodTypeObjectClassUnregister
  525.  *      kQ3XMethodTypeObjectNew
  526.  *      kQ3XMethodTypeObjectDelete
  527.  *      kQ3XMethodTypeObjectRead
  528.  *      kQ3XMethodTypeObjectTraverse
  529.  *      kQ3XMethodTypeObjectWrite
  530.  *      
  531.  *  Methods from Shared
  532.  *      kQ3MethodTypeSharedEdited
  533.  *
  534.  *  Renderer Methods
  535.  *  
  536.  *  The renderer methods should be implemented according to the type
  537.  *  of renderer being written.
  538.  *
  539.  *  For the purposes of documentation, there are two basic types of
  540.  *  renderers: 
  541.  *
  542.  *      Interactive
  543.  *          Interactive Renderer
  544.  *          WireFrame Renderer
  545.  *      
  546.  *      Deferred
  547.  *          a ray-tracer
  548.  *          painter's algorithm renderer (cached in a BSP triangle tree)
  549.  *          an artistic renderer (simulates a pencil drawing, etc.)
  550.  *
  551.  *  The main difference is how each renderer handles incoming state and 
  552.  *  geometry.
  553.  *
  554.  *  An interactive renderer immediately transforms, culls, and shades
  555.  *  incoming geometry and performs rasterization. For example, in a 
  556.  *  single-buffered WireFrame renderer, you will see a new triangle
  557.  *  immediately after Q3Triangle_Draw (if it's visible, of course).
  558.  *
  559.  *  A deferred renderer caches the view state and each geometry, 
  560.  *  converting into any internal queue of drawing commands. Rasterization
  561.  *  is not actually performed until all data has been submitted.
  562.  *  
  563.  *  For example, a ray-tracer may not rasterize anything until the
  564.  *  end of the rendering loop, or until an EndFrame call is made.
  565.  */
  566. /******************************************************************************
  567.  **                                                                          **
  568.  **                     Renderer User Interface Methods                      **
  569.  **                                                                          **
  570.  *****************************************************************************/
  571. /*
  572.  *  kQ3XMethodTypeRendererIsInteractive
  573.  *  
  574.  *  There is no actual method with this - the metahandler simply returns
  575.  *  "(TQ3XFunctionPointer)kQ3True" for this "method" if the renderer is 
  576.  *  intended to be used in interactive settings, and   
  577.  *  "(TQ3XFunctionPointer)kQ3False" otherwise. 
  578.  *  
  579.  *  If neither value is specified in the metahandler, the renderer 
  580.  *  is *assumed to be non-interactive*!!!
  581.  *  
  582.  *  OPTIONAL
  583.  */
  584. #endif  /* CALL_NOT_IN_CARBON */
  585. enum {
  586.     kQ3XMethodTypeRendererIsInteractive = FOUR_CHAR_CODE('isin')
  587. };
  588. /*
  589.  *  TQ3XRendererModalConfigureMethod
  590.  *  
  591.  *  This method should pop up a modal dialog to edit the renderer settings 
  592.  *  found in the renderer private. 
  593.  *  
  594.  *  dialogAnchor - is platform specific data passed by the client to support
  595.  *      movable modal dialogs. 
  596.  *    MacOS: this is a callback to the calling application's event handler.
  597.  *      The renderer calls this function with events not handled by the 
  598.  *      settings dialog. This is necessary in order to support movable modal 
  599.  *      dialogs. An application's event handler must return kQ3True if it 
  600.  *      handles the event passed to the callback or kQ3False if not. 
  601.  *      An application which doesn't want to support a movable modal configure
  602.  *      dialog should pass NULL for the clientEventHandler of TQ3DialogAnchor.
  603.  *      A renderer should implement a non-movable style dialog in that case.
  604.  *    Win32: this is the HWND of the owning window (typically an application's
  605.  *      main window).  (Win32 application modal dialogs are always movable.)
  606.  *  canceled - returns a boolean inditacating that the user canceled the 
  607.  *  dialog.
  608.  *  
  609.  *  OPTIONAL
  610.  */
  611. enum {
  612.     kQ3XMethodTypeRendererModalConfigure = FOUR_CHAR_CODE('rdmc')
  613. };
  614. typedef CALLBACK_API_C( TQ3Status , TQ3XRendererModalConfigureMethod )(TQ3RendererObject renderer, TQ3DialogAnchor dialogAnchor, TQ3Boolean *canceled, void *rendererPrivate);
  615. /*
  616.  *  kQ3XMethodTypeRendererGetNickNameString
  617.  *  
  618.  *      Allows an application to collect the name of the renderer for
  619.  *      display in a user interface item such as a menu.
  620.  *  
  621.  *      If dataBuffer is NULL actualDataSize returns the required size in 
  622.  *      bytes of a data buffer large enough to store the renderer name. 
  623.  *
  624.  *      bufferSize is the actual size of the memory block pointed to by 
  625.  *      dataBuffer
  626.  *
  627.  *      actualDataSize - on return the actual number of bytes written to the
  628.  *      buffer or if dataBuffer is NULL the required size of dataBuffer
  629.  *
  630.  *  OPTIONAL
  631.  */
  632. enum {
  633.     kQ3XMethodTypeRendererGetNickNameString = FOUR_CHAR_CODE('rdns')
  634. };
  635. typedef CALLBACK_API_C( TQ3Status , TQ3XRendererGetNickNameStringMethod )(unsigned char *dataBuffer, unsigned long bufferSize, unsigned long *actualDataSize);
  636. /*
  637.  *  kQ3XMethodTypeRendererGetConfigurationData
  638.  *  
  639.  *      Allows an application to collect private configuration data from the
  640.  *      renderer which it will then save. For example in a preference file, 
  641.  *      a registry key (on Windows) or in a style template. An application 
  642.  *      should tag this data with the renderer's object name.
  643.  *  
  644.  *      If dataBuffer is NULL actualDataSize returns the required size in 
  645.  *      bytes of a data buffer large enough to store private data. 
  646.  *
  647.  *      bufferSize is the actual size of the memory block pointed to by 
  648.  *      dataBuffer
  649.  *
  650.  *      actualDataSize - on return the actual number of bytes written to the
  651.  *      buffer or if dataBuffer is NULL the required size of dataBuffer
  652.  *
  653.  *  OPTIONAL
  654.  */
  655. enum {
  656.     kQ3XMethodTypeRendererGetConfigurationData = FOUR_CHAR_CODE('rdgp')
  657. };
  658. typedef CALLBACK_API_C( TQ3Status , TQ3XRendererGetConfigurationDataMethod )(TQ3RendererObject renderer, unsigned char *dataBuffer, unsigned long bufferSize, unsigned long *actualDataSize, void *rendererPrivate);
  659. /*
  660.  *  TQ3XRendererSetConfigurationDataMethod
  661.  *  
  662.  *      Allows an application to pass private configuration data which has
  663.  *      previously  been obtained from a renderer via 
  664.  *      Q3Renderer_GetConfigurationData. For example in a preference file or 
  665.  *      in a style template. An application should tag this data with the 
  666.  *      renderer's object name.
  667.  *  
  668.  *      bufferSize is the actual size of the memory block pointed to by 
  669.  *      dataBuffer
  670.  *
  671.  *  OPTIONAL
  672.  */
  673. enum {
  674.     kQ3XMethodTypeRendererSetConfigurationData = FOUR_CHAR_CODE('rdsp')
  675. };
  676. typedef CALLBACK_API_C( TQ3Status , TQ3XRendererSetConfigurationDataMethod )(TQ3RendererObject renderer, unsigned char *dataBuffer, unsigned long bufferSize, void *rendererPrivate);
  677. /******************************************************************************
  678.  **                                                                          **
  679.  **                     Renderer Drawing State Methods                       **
  680.  **                                                                          **
  681.  *****************************************************************************/
  682. /*
  683.  *  TQ3RendererStartFrame
  684.  *  
  685.  *  The StartFrame method is called first at Q3View_StartRendering
  686.  *  and should:
  687.  *      - initialize any renderer state to defaults
  688.  *      - extract any and all useful data from the drawContext
  689.  *
  690.  *  If your renderer passed in kQ3RendererFlagClearBuffer at 
  691.  *  registration, then it should also:
  692.  *      - clear the drawContext 
  693.  *  
  694.  *      When clearing, your renderer may opt to:
  695.  *      - NOT clear anything (if you touch every pixel, for example)
  696.  *      - to clear with your own routine, or
  697.  *      - to use the draw context default clear method by calling 
  698.  *      Q3DrawContext_Clear. Q3DrawContext_Clear takes advantage of
  699.  *      any available hardware in the system for clearing.
  700.  *  
  701.  *  This call also signals the start of all default submit commands from
  702.  *  the view. The renderer will receive updates for the default view
  703.  *  state via its Update methods before StartPass is called.
  704.  *  
  705.  *  REQUIRED
  706.  */
  707. enum {
  708.     kQ3XMethodTypeRendererStartFrame = FOUR_CHAR_CODE('rdcl')
  709. };
  710. typedef CALLBACK_API_C( TQ3Status , TQ3XRendererStartFrameMethod )(TQ3ViewObject view, void *rendererPrivate, TQ3DrawContextObject drawContext);
  711. /*
  712.  *  kQ3XMethodTypeRendererStartPass
  713.  *  TQ3XRendererStartPassMethod
  714.  *  
  715.  *  The StartPass method is called during Q3View_StartRendering but after
  716.  *  the StartFrame command. It should:
  717.  *      - collect camera and light information
  718.  *  
  719.  *  If your renderer supports deferred camera transformation, camera is the
  720.  *  main camera which will be submitted in the hierarchy somewhere. It
  721.  *  is never NULL.
  722.  *
  723.  *  If your renderer does not support deferred camera transformation, camera
  724.  *  is the transformed camera.
  725.  *
  726.  *  If your renderer supports deferred light transformation, lights will be
  727.  *  NULL, and will be submitted to your light draw methods instead.
  728.  *
  729.  *  This call signals the end of the default update state, and the start of 
  730.  *  submit commands from the user to the view.
  731.  *
  732.  *  REQUIRED
  733.  */
  734. enum {
  735.     kQ3XMethodTypeRendererStartPass = FOUR_CHAR_CODE('rdst')
  736. };
  737. typedef CALLBACK_API_C( TQ3Status , TQ3XRendererStartPassMethod )(TQ3ViewObject view, void *rendererPrivate, TQ3CameraObject camera, TQ3GroupObject lightGroup);
  738. /*
  739.  *  kQ3XMethodTypeRendererFlushFrame
  740.  *  TQ3XRendererFlushFrameMethod
  741.  *  
  742.  *  This call is only implemented by asynchronous renderers.
  743.  *  
  744.  *  The FlushFrame method is called between the StartPass and EndPass
  745.  *  methods and is called when the user wishes to flush any asynchronous
  746.  *  drawing tasks (which draw to the drawcontext), but does not want 
  747.  *  to block.
  748.  *  
  749.  *  The result of this call is that an image should "eventually" appear
  750.  *  asynchronously.
  751.  *  
  752.  *  For asynchronous rendering, this call is non-blocking.
  753.  *  
  754.  *  An interactive renderer should ensure that all received
  755.  *  geometries are drawn in the image.
  756.  *  
  757.  *  An interactive renderer that talks to hardware should force
  758.  *  the hardware to generate an image.
  759.  *  
  760.  *  A deferred renderer should exhibit a similar behaviour,
  761.  *  though it is not required.  A deferred renderer should spawn
  762.  *  a process that generates a partial image from the currently
  763.  *  accumulated drawing state. 
  764.  *  
  765.  *  However, for renderers such as ray-tracers which generally are
  766.  *  quite compute-intensive, FlushFrame is not required and is a no-op.
  767.  *
  768.  *  OPTIONAL
  769.  */
  770. enum {
  771.     kQ3XMethodTypeRendererFlushFrame = FOUR_CHAR_CODE('rdfl')
  772. };
  773. typedef CALLBACK_API_C( TQ3Status , TQ3XRendererFlushFrameMethod )(TQ3ViewObject view, void *rendererPrivate, TQ3DrawContextObject drawContext);
  774. /*
  775.  *  kQ3XMethodTypeRendererEndPass
  776.  *  TQ3XRendererEndPassMethod
  777.  *  
  778.  *  The EndPass method is called at Q3View_EndRendering and signals
  779.  *  the end of submit commands to the view.
  780.  *
  781.  *  If an error occurs, the renderer should call Q3XError_Post and
  782.  *  return kQ3ViewStatusError.
  783.  *  
  784.  *  If a renderer requires another pass on the renderering data,
  785.  *  it should return kQ3ViewStatusRetraverse.
  786.  *  
  787.  *  If rendering was cancelled, this function will not be called
  788.  *  and the view will handle returning kQ3ViewStatusCancelled;
  789.  *  
  790.  *  Otherwise, your renderer should begin completing the process of 
  791.  *  generating the image in the drawcontext. If you have buffered
  792.  *  any drawing data, flush it. RendererEnd should have a similar
  793.  *  effect as RendererFlushFrame.
  794.  *  
  795.  *  If the renderer is synchronous:
  796.  *      - complete rendering of the entire frame
  797.  *      if the renderer supports kQ3RendererClassSupportDoubleBuffer
  798.  *          - Update the front buffer
  799.  *      else
  800.  *          - DrawContext will update the front buffer after returning
  801.  *
  802.  *  If the renderer is asynchronous
  803.  *      - spawn rendering thread for entire frame
  804.  *      if the renderer supports kQ3RendererClassSupportDoubleBuffer,
  805.  *          - you must eventually update the front buffer asynchronously
  806.  *      else
  807.  *          - you must eventually update the back buffer asynchronously
  808.  *          
  809.  *  REQUIRED
  810.  */
  811. enum {
  812.     kQ3XMethodTypeRendererEndPass = FOUR_CHAR_CODE('rded')
  813. };
  814. typedef CALLBACK_API_C( TQ3ViewStatus , TQ3XRendererEndPassMethod )(TQ3ViewObject view, void *rendererPrivate);
  815. /*
  816.  *  kQ3XMethodTypeRendererEndFrame
  817.  *  TQ3XRendererEndFrame
  818.  *  
  819.  *  This call is only implemented by asynchronous renderers.
  820.  *
  821.  *  The EndFrame method is called from Q3View_Sync, which is
  822.  *  called after Q3View_EndRendering and signals that the user
  823.  *  wishes to see the completed image and is willing to block.
  824.  *  
  825.  *  If your renderer supports kQ3RendererFlagDoubleBuffer
  826.  *      - update the front buffer completely 
  827.  *  else
  828.  *      - update the back buffer completely
  829.  *
  830.  *  This call is equivalent in functionality to RendererFlushFrame
  831.  *  but blocks until the image is completed.
  832.  *  
  833.  *  If no method is supplied, the default is a no-op.
  834.  *  
  835.  *  NOTE: Registering a method of this type indicates that your renderer will
  836.  *  be rendering after Q3View_EndRendering has been called.
  837.  *  
  838.  *  OPTIONAL
  839.  */
  840. enum {
  841.     kQ3XMethodTypeRendererEndFrame = FOUR_CHAR_CODE('rdsy')
  842. };
  843. typedef CALLBACK_API_C( TQ3Status , TQ3XRendererEndFrameMethod )(TQ3ViewObject view, void *rendererPrivate, TQ3DrawContextObject drawContext);
  844. /*
  845.  *  The RendererCancel method is called after Q3View_StartRendering
  846.  *  and signals the termination of all rendering operations.
  847.  *
  848.  *  A renderer should clean up any cached data, and cancel all 
  849.  *  rendering operations.
  850.  *  
  851.  *  If called before Q3View_EndRendering, the RendererEnd method
  852.  *  is NOT called.
  853.  *  
  854.  *  If called after Q3View_EndRendering, the renderer should kill
  855.  *  any threads and terminate any further rendering.
  856.  *  
  857.  *  REQUIRED
  858.  */
  859. enum {
  860.     kQ3XMethodTypeRendererCancel = FOUR_CHAR_CODE('rdab')
  861. };
  862. typedef CALLBACK_API_C( void , TQ3XRendererCancelMethod )(TQ3ViewObject view, void *rendererPrivate);
  863. /******************************************************************************
  864.  **                                                                          **
  865.  **                     Renderer DrawContext Methods                         **
  866.  **                                                                          **
  867.  *****************************************************************************/
  868. /*
  869.  *  kQ3XMethodTypeRendererPush
  870.  *  TQ3XRendererPushMethod
  871.  *  
  872.  *  kQ3XMethodTypeRendererPop
  873.  *  TQ3XRendererPopMethod
  874.  *  
  875.  *  These methods are called whenever the graphics state in the view
  876.  *  is pushed or popped. The user may isolate state by calling:
  877.  *  
  878.  *  Q3Attribute_Submit(kQ3AttributeTypeDiffuseColor, &red, view);
  879.  *  Q3Attribute_Submit(kQ3AttributeTypeTransparencyColor, &blue, view);
  880.  *  Q3Attribute_Submit(kQ3AttributeTypeSpecularColor, &white, view);
  881.  *  Q3Box_Submit(&unitBox, view);
  882.  *  Q3TranslateTransform_Submit(&unitVector, view);
  883.  *  Q3Push_Submit(view);
  884.  *      Q3Attribute_Submit(kQ3AttributeTypeDiffuseColor, &blue, view);
  885.  *      Q3Attribute_Submit(kQ3AttributeTypeTransparencyColor, &green, view);
  886.  *      Q3Box_Submit(&unitBox, view);
  887.  *  Q3Pop_Submit(view); 
  888.  *  Q3TranslateTransform_Submit(&unitVector, view);
  889.  *  Q3Box_Submit(&unitBox, view);
  890.  *  
  891.  *  or by submitting a display group which pushes and pops.
  892.  *  
  893.  *  If you support RendererPush and RendererPop in your renderer:
  894.  *      - you must maintain your drawing state as a stack, as well.
  895.  *      - you will not be updated with the popped state after
  896.  *          RendererPop is called.
  897.  *
  898.  *  If you do not support Push and Pop in your renderer:
  899.  *      - you may maintain a single copy of the drawing state.
  900.  *      - you will be updated with changed fields after the view stack is
  901.  *          popped.
  902.  *
  903.  *  A renderer that supports Push and Pop gets called in the following
  904.  *  sequence (from example above):
  905.  *  
  906.  *  RendererUpdateAttributeDiffuseColor(&red,...)
  907.  *  RendererUpdateAttributeTransparencyColor(&blue,...)
  908.  *  RendererUpdateAttributeSpecularColor(&white,...)
  909.  *  RendererUpdateMatrixLocalToWorld(...)
  910.  *  RendererSubmitGeometryBox(...)
  911.  *  RendererPush(...)
  912.  *      RendererUpdateAttributeDiffuseColor(&blue,...)
  913.  *      RendererUpdateAttributeTransparencyColor(&green,...)
  914.  *      RendererSubmitGeometryBox(...)
  915.  *  RendererPop(...)
  916.  *  RendererUpdateMatrixLocalToWorld(...)
  917.  *  RendererSubmitGeometryBox(...)
  918.  *
  919.  *  A renderer that does not supports Push and Pop gets called in the
  920.  *  following sequence:
  921.  *  
  922.  *  RendererUpdateAttributeDiffuseColor(&red,...)
  923.  *  RendererUpdateAttributeTransparencyColor(&blue,...)
  924.  *  RendererUpdateAttributeSpecularColor(&white,...)
  925.  *  RendererUpdateMatrixLocalToWorld(...)
  926.  *  RendererSubmitGeometryBox(...)
  927.  *      RendererUpdateAttributeDiffuseColor(&blue,...)
  928.  *      RendererUpdateAttributeTransparencyColor(&green,...)
  929.  *      RendererSubmitGeometryBox(...)
  930.  *  RendererUpdateAttributeDiffuseColor(&red,...)
  931.  *  RendererUpdateAttributeTransparencyColor(&blue,...)
  932.  *  RendererUpdateMatrixLocalToWorld(...)
  933.  *  RendererSubmitGeometryBox(...)
  934.  *  
  935.  */
  936. enum {
  937.     kQ3XMethodTypeRendererPush  = FOUR_CHAR_CODE('rdps')
  938. };
  939. typedef CALLBACK_API_C( TQ3Status , TQ3XRendererPushMethod )(TQ3ViewObject view, void *rendererPrivate);
  940. enum {
  941.     kQ3XMethodTypeRendererPop   = FOUR_CHAR_CODE('rdpo')
  942. };
  943. typedef CALLBACK_API_C( TQ3Status , TQ3XRendererPopMethod )(TQ3ViewObject view, void *rendererPrivate);
  944. /******************************************************************************
  945.  **                                                                          **
  946.  **                         Renderer Cull Methods                            **
  947.  **                                                                          **
  948.  *****************************************************************************/
  949. /*
  950.  *  kQ3XMethodTypeRendererIsBoundingBoxVisible
  951.  *  TQ3XRendererIsBoundingBoxVisibleMethod
  952.  *  
  953.  *  This method is called to cull complex groups and geometries 
  954.  *  given their bounding box in local space.
  955.  *  
  956.  *  It should transform the local-space bounding box coordinates to
  957.  *  frustum space and return a TQ3Boolean return value indicating
  958.  *  whether the box appears within the viewing frustum.
  959.  *  
  960.  *  If no method is supplied, the default behavior is to return
  961.  *  kQ3True.
  962.  *  
  963.  */
  964. enum {
  965.     kQ3XMethodTypeRendererIsBoundingBoxVisible = FOUR_CHAR_CODE('rdbx')
  966. };
  967. typedef CALLBACK_API_C( TQ3Boolean , TQ3XRendererIsBoundingBoxVisibleMethod )(TQ3ViewObject view, void *rendererPrivate, const TQ3BoundingBox *bBox);
  968. /******************************************************************************
  969.  **                                                                          **
  970.  **                     Renderer Object Support Methods                      **
  971.  **                                                                          **
  972.  *****************************************************************************/
  973. /*
  974.  *  Drawing methods (Geometry, Camera, Lights)
  975.  *
  976.  */
  977. /*
  978.  *  Geometry MetaHandler
  979.  *  
  980.  *  This metaHandler is required to support 
  981.  *  
  982.  *  kQ3GeometryTypeTriangle
  983.  *  kQ3GeometryTypeLine
  984.  *  kQ3GeometryTypePoint
  985.  *  kQ3GeometryTypeMarker
  986.  *  kQ3GeometryTypePixmapMarker
  987.  *  
  988.  *  REQUIRED
  989.  */
  990. enum {
  991.     kQ3XMethodTypeRendererSubmitGeometryMetaHandler = FOUR_CHAR_CODE('rdgm')
  992. };
  993. typedef CALLBACK_API_C( TQ3XFunctionPointer , TQ3XRendererSubmitGeometryMetaHandlerMethod )(TQ3ObjectType geometryType);
  994. /*
  995.  *  The TQ3XRendererSubmitGeometryMetaHandlerMethod switches on geometryType
  996.  *  of kQ3GeometryTypeFoo and returns methods of type:
  997.  */
  998. typedef CALLBACK_API_C( TQ3Status , TQ3XRendererSubmitGeometryMethod )(TQ3ViewObject view, void *rendererPrivate, TQ3GeometryObject geometry, const void *publicData);
  999. /*
  1000.  *  Camera MetaHandler
  1001.  *  
  1002.  *  This metaHandler, if supplied, indicates that your renderer
  1003.  *  handles deferred transformation of the main camera within a scene.
  1004.  *  
  1005.  *  If not supplied, or an unsupported camera is used, the view will do
  1006.  *  the transformation for the renderer and pass in a camera in the 
  1007.  *  StartPass method.
  1008.  *  
  1009.  *  OPTIONAL
  1010.  */
  1011. enum {
  1012.     kQ3XMethodTypeRendererSubmitCameraMetaHandler = FOUR_CHAR_CODE('rdcm')
  1013. };
  1014. typedef CALLBACK_API_C( TQ3XFunctionPointer , TQ3XRendererSubmitCameraMetaHandlerMethod )(TQ3ObjectType cameraType);
  1015. /*
  1016.  *  The TQ3XRendererSubmitCameraMetaHandlerMethod switches on cameraType
  1017.  *  of kQ3CameraTypeFoo and returns methods of type:
  1018.  */
  1019. typedef CALLBACK_API_C( TQ3Status , TQ3XRendererSubmitCameraMethod )(TQ3ViewObject view, void *rendererPrivate, TQ3CameraObject camera, const void *publicData);
  1020. /*
  1021.  *  Light MetaHandler
  1022.  *  
  1023.  *  This metaHandler, if supplied, indicates that your renderer
  1024.  *  handles deferred transformation of lights within a scene.
  1025.  *  
  1026.  *  If an unsupported light is encountered, it is ignored.
  1027.  *
  1028.  *  OPTIONAL
  1029.  */
  1030. enum {
  1031.     kQ3XMethodTypeRendererSubmitLightMetaHandler = FOUR_CHAR_CODE('rdlg')
  1032. };
  1033. typedef CALLBACK_API_C( TQ3XFunctionPointer , TQ3XRendererSubmitLightMetaHandlerMethod )(TQ3ObjectType lightType);
  1034. /*
  1035.  *  The TQ3XRendererSubmitLightMetaHandlerMethod switches on lightType
  1036.  *  of kQ3LightTypeFoo and returns methods of type:
  1037.  */
  1038. typedef CALLBACK_API_C( TQ3Status , TQ3XRendererSubmitLightMethod )(TQ3ViewObject view, void *rendererPrivate, TQ3LightObject light, const void *publicData);
  1039. /*
  1040.  *
  1041.  *  Update methods
  1042.  *
  1043.  *  They are called whenever the state has changed. If the renderer supports
  1044.  *  the RendererPush and RendererPop methods, it must maintain its own state
  1045.  *  stack. Updates are not called for changed data when the view stack is
  1046.  *  popped.
  1047.  *
  1048.  *  See the comments for the RendererPush and RendererPop methods above
  1049.  *  for an example of how data is updated.
  1050.  *
  1051.  */
  1052. /*
  1053.  *  Style
  1054.  */
  1055. enum {
  1056.     kQ3XMethodTypeRendererUpdateStyleMetaHandler = FOUR_CHAR_CODE('rdyu')
  1057. };
  1058. typedef CALLBACK_API_C( TQ3XFunctionPointer , TQ3XRendererUpdateStyleMetaHandlerMethod )(TQ3ObjectType styleType);
  1059. /*
  1060.  *  The TQ3XRendererUpdateStyleMetaHandlerMethod switches on styleType
  1061.  *  of kQ3StyleTypeFoo and returns methods of type:
  1062.  */
  1063. typedef CALLBACK_API_C( TQ3Status , TQ3XRendererUpdateStyleMethod )(TQ3ViewObject view, void *rendererPrivate, const void *publicData);
  1064. /*
  1065.  *  Attributes
  1066.  */
  1067. enum {
  1068.     kQ3XMethodTypeRendererUpdateAttributeMetaHandler = FOUR_CHAR_CODE('rdau')
  1069. };
  1070. typedef CALLBACK_API_C( TQ3XFunctionPointer , TQ3XRendererUpdateAttributeMetaHandlerMethod )(TQ3AttributeType attributeType);
  1071. /*
  1072.  *  The TQ3XRendererUpdateStyleMetaHandlerMethod switches on attributeType
  1073.  *  of kQ3AttributeTypeFoo and returns methods of type:
  1074.  */
  1075. typedef CALLBACK_API_C( TQ3Status , TQ3XRendererUpdateAttributeMethod )(TQ3ViewObject view, void *rendererPrivate, const void *publicData);
  1076. /*
  1077.  *  Shaders
  1078.  */
  1079. enum {
  1080.     kQ3XMethodTypeRendererUpdateShaderMetaHandler = FOUR_CHAR_CODE('rdsu')
  1081. };
  1082. typedef CALLBACK_API_C( TQ3XFunctionPointer , TQ3XRendererUpdateShaderMetaHandlerMethod )(TQ3ObjectType shaderType);
  1083. /*
  1084.  *  The TQ3XRendererUpdateShaderMetaHandlerMethod switches on shaderType
  1085.  *  of kQ3ShaderTypeFoo and returns methods of type:
  1086.  */
  1087. typedef CALLBACK_API_C( TQ3Status , TQ3XRendererUpdateShaderMethod )(TQ3ViewObject view, void *rendererPrivate, TQ3Object *shaderObject);
  1088. /*
  1089.  *  Matrices
  1090.  */
  1091. enum {
  1092.     kQ3XMethodTypeRendererUpdateMatrixMetaHandler = FOUR_CHAR_CODE('rdxu')
  1093. };
  1094. typedef TQ3XMetaHandler                 TQ3XRendererUpdateMatrixMetaHandlerMethod;
  1095. /*
  1096.  *  The TQ3XRendererUpdateShaderMetaHandlerMethod switches on methods
  1097.  *  of the form kQ3MethodTypeRendererUpdateMatrixFoo:
  1098.  */
  1099. enum {
  1100.     kQ3XMethodTypeRendererUpdateMatrixLocalToWorld = FOUR_CHAR_CODE('ulwx')
  1101. };
  1102. enum {
  1103.     kQ3XMethodTypeRendererUpdateMatrixLocalToWorldInverse = FOUR_CHAR_CODE('ulwi')
  1104. };
  1105. enum {
  1106.     kQ3XMethodTypeRendererUpdateMatrixLocalToWorldInverseTranspose = FOUR_CHAR_CODE('ulwt')
  1107. };
  1108. enum {
  1109.     kQ3XMethodTypeRendererUpdateMatrixLocalToCamera = FOUR_CHAR_CODE('ulcx')
  1110. };
  1111. enum {
  1112.     kQ3XMethodTypeRendererUpdateMatrixLocalToFrustum = FOUR_CHAR_CODE('ulfx')
  1113. };
  1114. enum {
  1115.     kQ3XMethodTypeRendererUpdateMatrixWorldToFrustum = FOUR_CHAR_CODE('uwfx')
  1116. };
  1117. /*
  1118.  *  and returns methods of type:
  1119.  */
  1120. typedef CALLBACK_API_C( TQ3Status , TQ3XRendererUpdateMatrixMethod )(TQ3ViewObject view, void *rendererPrivate, const TQ3Matrix4x4 *matrix);
  1121. #if PRAGMA_ENUM_ALWAYSINT
  1122.     #pragma enumsalwaysint reset
  1123.     #ifdef __QD3DRENDERER__RESTORE_TWOBYTEINTS
  1124.         #pragma fourbyteints off
  1125.     #endif
  1126. #elif PRAGMA_ENUM_OPTIONS
  1127.     #pragma option enum=reset
  1128. #elif defined(__QD3DRENDERER__RESTORE_PACKED_ENUMS)
  1129.     #pragma options(pack_enums)
  1130. #endif
  1131. #if PRAGMA_STRUCT_ALIGN
  1132.     #pragma options align=reset
  1133. #elif PRAGMA_STRUCT_PACKPUSH
  1134.     #pragma pack(pop)
  1135. #elif PRAGMA_STRUCT_PACK
  1136.     #pragma pack()
  1137. #endif
  1138. #ifdef PRAGMA_IMPORT_OFF
  1139. #pragma import off
  1140. #elif PRAGMA_IMPORT
  1141. #pragma import reset
  1142. #endif
  1143. #ifdef __cplusplus
  1144. }
  1145. #endif
  1146. #endif /* __QD3DRENDERER__ */