TQ3ViewObject MyNewView(DocumentPtr theDocument) { TQ3Status myStatus; TQ3ViewObject myView; TQ3DrawContextObject myDrawContext; TQ3RendererObject myRenderer; TQ3CameraObject myCamera; TQ3GroupObject myLights; myView = Q3View_New(); // Create and set draw context. switch( theDocument->drawcontextType ) { case kQ3DrawContextTypeWin32DC: if ((myDrawContext = NewWin32DCDrawContext(theDocument)) == NULL ) goto bail; break; case kQ3DrawContextTypeDDSurface: goto bail; /* TBD */ default: case kQ3DrawContextTypePixmap: if ((myDrawContext = NewPixmapDrawContext(theDocument, theDocument->fPixelFormat )) == NULL ) goto bail; break; } if ((myStatus = Q3View_SetDrawContext(myView, myDrawContext)) == kQ3Failure ) goto bail; Q3Object_Dispose( myDrawContext ) ; // Create and set renderer. switch( theDocument->rendererType ) { case kQ3RendererTypeWireFrame: // this uses the wire frame renderer myRenderer = Q3Renderer_NewFromType(kQ3RendererTypeWireFrame); if ((myStatus = Q3View_SetRenderer(myView, myRenderer)) == kQ3Failure ) { goto bail; } break; default: case kQ3RendererTypeInteractive: // this uses the interactive renderer if ((myRenderer = Q3Renderer_NewFromType(kQ3RendererTypeInteractive)) != NULL ) { if ((myStatus = Q3View_SetRenderer(myView, myRenderer)) == kQ3Failure ) { goto bail; } // these two lines set us up to use the best possible renderer, // including hardware if it is installed. Q3InteractiveRenderer_SetDoubleBufferBypass (myRenderer, kQ3True); Q3InteractiveRenderer_SetPreferences(myRenderer, kQAVendor_BestChoice, 0); } else { goto bail; } break; } Q3Object_Dispose( myRenderer ) ; // Create and set camera if ( (myCamera = MyNewCamera(theDocument)) == NULL ) goto bail; if ((myStatus = Q3View_SetCamera(myView, myCamera)) == kQ3Failure ) goto bail; Q3Object_Dispose( myCamera ) ; // Create and set lights if ((myLights = MyNewLights()) == NULL ) goto bail; if ((myStatus = Q3View_SetLightGroup(myView, myLights)) == kQ3Failure ) goto bail; Q3Object_Dispose(myLights); return ( myView ); bail: // If any of the above failed, then don't return a view. return ( NULL ); }
void pvCamera_Fit(DocumentPtr theDocument) { TQ3Point3D from, to; TQ3BoundingBox viewBBox; float fieldOfView, hither, yon; if (!theDocument) return; if (!theDocument->fModel) return; pvBBox_Get(theDocument, &viewBBox); pvBBoxCenter(&viewBBox, &to); { TQ3Vector3D viewVector; TQ3Vector3D normViewVector; TQ3Vector3D eyeToFrontClip; TQ3Vector3D eyeToBackClip; TQ3Vector3D diagonalVector; float viewDistance; float maxDimension; Q3Point3D_Subtract(&viewBBox.max, &viewBBox.min, &diagonalVector); maxDimension = Q3Vector3D_Length(&diagonalVector); if (maxDimension == 0.0F) maxDimension = 1.0F; maxDimension *= 8.0F / 7.0F; from.x = to.x; from.y = to.y; from.z = to.z + (2 * maxDimension); Q3Point3D_Subtract(&to, &from, &viewVector); viewDistance = Q3Vector3D_Length(&viewVector); Q3Vector3D_Normalize(&viewVector, &normViewVector); maxDimension /= 2.0F; Q3Vector3D_Scale(&normViewVector, viewDistance - maxDimension, &eyeToFrontClip); Q3Vector3D_Scale(&normViewVector, viewDistance + maxDimension, &eyeToBackClip); hither = Q3Vector3D_Length(&eyeToFrontClip); yon = Q3Vector3D_Length(&eyeToBackClip); fieldOfView = Q3Math_RadiansToDegrees(1.25 * ErMath_Atan(maxDimension/hither)); } { TQ3ViewAngleAspectCameraData data; TQ3Vector3D up = { 0.0F, 1.0F, 0.0F }; data.cameraData.placement.cameraLocation = from; data.cameraData.placement.pointOfInterest = to; data.cameraData.placement.upVector = up; data.cameraData.range.hither = hither; data.cameraData.range.yon = yon; data.cameraData.viewPort.origin.x = -1.0F; data.cameraData.viewPort.origin.y = 1.0F; data.cameraData.viewPort.width = 2.0F; data.cameraData.viewPort.height = 2.0F; data.fov = Q3Math_DegreesToRadians(fieldOfView); { float w = (float)(theDocument->fWidth); float h = (float)(theDocument->fHeight); data.aspectRatioXToY = w/h; } if (theDocument->fView) { TQ3CameraObject camera; Q3View_GetCamera(theDocument->fView, &camera); if (camera) { Q3ViewAngleAspectCamera_SetData(camera, &data); Q3Object_Dispose(camera); } else { camera = Q3ViewAngleAspectCamera_New (&data); if (camera) { Q3View_SetCamera (theDocument->fView, camera); Q3Object_Dispose(camera); } } } } }
static TQ3ViewObject QD3DSupport_NewView(HWND theWindow) #endif { TQ3Status myStatus; TQ3ViewObject myView; TQ3DrawContextObject myDrawContext; TQ3RendererObject myRenderer; TQ3GroupObject myLights; TQ3CameraObject myCamera; #if TARGET_OS_WIN32 RECT clientRect; BOOL success; #endif myView = Q3View_New(); if (myView == nil) { goto bail; } // Create and set draw context. if ((myDrawContext = QD3DSupport_NewDrawContext(theWindow)) == nil ) { goto bail; } if ((myStatus = Q3View_SetDrawContext(myView, myDrawContext)) == kQ3Failure ) { goto bail; } Q3Object_Dispose( myDrawContext ) ; // Create and set renderer. // this would use the Z-Buffer renderer #if 0 myRenderer = Q3Renderer_NewFromType(kQ3RendererTypeWireFrame); if ((myStatus = Q3View_SetRenderer(myView, myRenderer)) == kQ3Failure ) { goto bail; } #else // this would use the interactive software renderer if ((myRenderer = Q3Renderer_NewFromType(kQ3RendererTypeInteractive)) != nil ) { if ((myStatus = Q3View_SetRenderer(myView, myRenderer)) == kQ3Failure ) { goto bail; } // these two lines set us up to use the best possible renderer, // including hardware if it is installed. Q3InteractiveRenderer_SetDoubleBufferBypass (myRenderer, kQ3True); Q3InteractiveRenderer_SetPreferences(myRenderer, kQAVendor_BestChoice, 0); } else { goto bail; } #endif Q3Object_Dispose( myRenderer ) ; // Create and set camera. #if TARGET_OS_MAC if ( (myCamera = QD3DSupport_NewCamera((float) (theWindow->portRect.right - theWindow->portRect.left), (float) (theWindow->portRect.bottom - theWindow->portRect.top))) == nil ) { goto bail; } #else if TARGET_OS_WIN32 success = GetClientRect(theWindow, &clientRect); if (success) { if ( (myCamera = QD3DSupport_NewCamera((float)RECT_WIDTH(clientRect), (float)RECT_HEIGHT(clientRect))) == nil ) { goto bail; } } else { goto bail; } #endif if ((myStatus = Q3View_SetCamera(myView, myCamera)) == kQ3Failure ) { goto bail; } Q3Object_Dispose( myCamera ) ; // Create and set lights. if ((myLights = QD3DSupport_NewLights()) == nil ) { goto bail; } if ((myStatus = Q3View_SetLightGroup(myView, myLights)) == kQ3Failure ) { goto bail; } Q3Object_Dispose(myLights); // Done!!! return ( myView ); bail: // If any of the above failed, then don't return a view. return ( nil ); }