Retired Document
Important: This sample code may not represent best practices for current development. The project may use deprecated symbols and illustrate technologies and techniques that are no longer recommended.
BoxTexShell.c
// |
// This is box, the QuickDraw 3D starter program. Written for the |
// Quickdraw 3D sample code |
// |
// This file contains utility routines for QuickDraw 3d sample code. |
// This app shows how to apply a texture shader to an object. Bear in |
// mind that any object that you wish to texture map needs to have |
// UV parameters applied. |
// |
// Nick Thompson, AppleLink: DEVSUPPORT (devsupport@applelink.apple.com) |
// |
// ©1994-5 Apple Computer Inc., All Rights Reserved |
// system headers |
#include <Devices.h> |
#include <Dialogs.h> |
#include <DiskInit.h> |
#include <Fonts.h> |
#include <Menus.h> |
#include <PictUtils.h> |
#include <QDOffScreen.h> |
#include <QuickDraw.h> |
#include <SegLoad.h> |
#include <StandardFile.h> |
#include <TextEdit.h> |
// for QuickDraw 3D |
#include "QD3D.h" |
#include "QD3DMath.h" |
#include "QD3DDrawContext.h" |
#include "QD3DShader.h" |
#include "QD3DTransform.h" |
#include "QD3DGroup.h" |
#include "BoxTexShell.h" |
#include "BoxTex3DSupport.h" |
#include "Textures.h" |
//------------------------------------------------------------------------------------------- |
// function prototypes |
static void InitToolbox( void ) ; |
static void MainEventLoop( void ) ; |
static void HandleKeyPress(EventRecord *event) ; |
static void HandleOSEvent(EventRecord *event) ; |
void InitDocumentData( DocumentPtr theDocument ) ; |
TQ3Status DocumentDraw3DData( DocumentPtr theDocument ) ; |
void DisposeDocumentData( DocumentPtr theDocument) ; |
//------------------------------------------------------------------------------------------- |
// |
Boolean gQuitFlag = false ; |
WindowPtr gMainWindow = nil ; |
DocumentRec gDocument ; |
//------------------------------------------------------------------------------------------- |
// main() |
// entry point for the application, initialize the toolbox, initialize QuickDraw 3D |
// and enter the main event loop. On exit from the main event loop, we want to call |
// the QuickDraw 3D exit function to clean up QuickDraw 3d. |
void main(void) |
{ |
TQ3Status myStatus; |
Rect rBounds = { 50, 50, 350, 350 } ; |
Str255 title = "\pSpinning Box" ; |
InitToolbox() ; |
// Initialize QuickDraw 3D, open a connection to the QuickDraw 3D library |
myStatus = Q3Initialize(); |
if ( myStatus == kQ3Failure ) |
DebugStr("\pQ3Initialize returned failure."); |
// set up our globals |
gQuitFlag = false ; |
gMainWindow = NewCWindow(nil,&rBounds,title,true,noGrowDocProc,(WindowPtr)-1,true,0) ; |
InitDocumentData( &gDocument ) ; |
MainEventLoop(); |
DisposeDocumentData( &gDocument ) ; |
// Close our connection to the QuickDraw 3D library |
myStatus = Q3Exit(); |
if ( myStatus == kQ3Failure ) |
DebugStr("\pQ3Exit returned failure."); |
} |
//------------------------------------------------------------------------------------------- |
// |
void InitDocumentData( DocumentPtr theDocument ) |
{ |
TQ3Point3D myOrigin = { 0, 0, 0 } ; |
theDocument->fGroupScale = 1; |
theDocument->fGroupCenter = myOrigin ; |
// sets up the 3d data for the scene |
// Create view for QuickDraw 3D. |
theDocument->fView = MyNewView( (WindowPtr)gMainWindow ) ; |
// the main display group: |
theDocument->fModel = MyNewModel() ; |
// the drawing styles: |
theDocument->fInterpolation = Q3InterpolationStyle_New(kQ3InterpolationStyleNone) ; |
theDocument->fBackFacing = Q3BackfacingStyle_New(kQ3BackfacingStyleRemove ) ; |
theDocument->fFillStyle = Q3FillStyle_New(kQ3FillStyleFilled ) ; |
// set the rotation matrix the identity matrix |
Q3Matrix4x4_SetIdentity(&theDocument->fRotation); |
AdjustCamera( &gDocument, |
(gMainWindow->portRect.right - gMainWindow->portRect.left), |
(gMainWindow->portRect.bottom - gMainWindow->portRect.top) ) ; |
} |
void DisposeDocumentData( DocumentPtr theDocument) |
{ |
Q3Object_Dispose(theDocument->fView) ; // the view for the scene |
Q3Object_Dispose(theDocument->fModel) ; // object in the scene being modelled |
Q3Object_Dispose(theDocument->fInterpolation) ; // interpolation style used when rendering |
Q3Object_Dispose(theDocument->fBackFacing) ; // whether to draw shapes that face away from the camera |
Q3Object_Dispose(theDocument->fFillStyle) ; // whether drawn as solid filled object or decomposed to components |
} |
//----------------------------------------------------------------------------- |
// |
TQ3Status DocumentDraw3DData( DocumentPtr theDocument ) |
{ |
Q3View_StartRendering(theDocument->fView ); |
do { |
SubmitScene( theDocument ) ; |
} while (Q3View_EndRendering(theDocument->fView) == kQ3ViewStatusRetraverse ); |
return kQ3Success ; |
} |
//------------------------------------------------------------------------------------------- |
// |
short HiWrd(long aLong) |
{ |
return (((aLong) >> 16) & 0xFFFF) ; |
} |
//------------------------------------------------------------------------------------------- |
// |
short LoWrd(long aLong) |
{ |
return ((aLong) & 0xFFFF) ; |
} |
//------------------------------------------------------------------------------------------- |
// |
void InitToolbox() |
{ |
Handle menuBar = nil; |
MaxApplZone() ; |
MoreMasters() ; MoreMasters() ; MoreMasters() ; |
InitGraf( &qd.thePort ); |
InitFonts(); |
InitWindows(); |
InitMenus(); |
TEInit() ; |
InitDialogs(0L) ; |
InitCursor(); |
FlushEvents( everyEvent, 0 ) ; |
// initialize application globals |
gQuitFlag = false; |
} |
//------------------------------------------------------------------------------------------- |
// |
void MainEventLoop() |
{ |
EventRecord event; |
WindowPtr window; |
short thePart; |
Rect screenRect, updateRect; |
Point aPoint = {100, 100}; |
while( !gQuitFlag ) |
{ |
if (WaitNextEvent( everyEvent, &event, 0, nil )) |
{ |
switch (event.what) { |
case mouseDown: |
thePart = FindWindow( event.where, &window ); |
switch( thePart ) { |
case inMenuBar: |
break; |
case inDrag: |
screenRect = (**GetGrayRgn()).rgnBBox; |
DragWindow( window, event.where, &screenRect ); |
break ; |
case inContent: |
if (window != FrontWindow()) |
SelectWindow( window ); |
break ; |
case inGoAway: |
if (TrackGoAway( window, event.where )) { |
DisposeWindow ( window ); |
gQuitFlag = true; |
} |
break ; |
default: |
break ; |
} |
break ; |
case updateEvt: |
window = (WindowPtr)event.message; |
updateRect = (**(window->visRgn)).rgnBBox; |
SetPort( window ) ; |
BeginUpdate( window ); |
DocumentDraw3DData( &gDocument ) ; |
EndUpdate( window ); |
break ; |
case keyDown: |
case autoKey: |
HandleKeyPress(&event); |
break; |
case diskEvt: |
if ( HiWrd(event.message) != noErr ) |
(void) DIBadMount(aPoint, event.message); |
break; |
case osEvt: |
case activateEvt: |
break; |
} |
} |
else { |
// we received a null event, rotate the cube |
TQ3Matrix4x4 tmp; |
Rect theRect = ((GrafPtr)gMainWindow)->portRect ; |
SetPort((GrafPtr)gMainWindow) ; |
Q3Matrix4x4_SetRotate_XYZ(&tmp, 0.03, 0.03, 0.02); |
Q3Matrix4x4_Multiply(&gDocument.fRotation, &tmp, &gDocument.fRotation); |
InvalRect( &theRect ) ; |
} |
} |
} |
//------------------------------------------------------------------------------------------- |
// |
void HandleKeyPress(EventRecord *event) |
{} |
//------------------------------------------------------------------------------------------- |
// |
Copyright © 2003 Apple Computer, Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2003-01-14