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.
Skinny3DSources ƒ/Cameras.c
// File Cameras.c |
#include <OSUtils.h> |
#include "SkinnyMain.h" // for menu item symbols |
#include "Cameras.h" |
/* |
contains: |
TQ3CameraObject MakeCamera(long select); |
VccPtr CameraDataToVCC(TQ3CameraObject camera); |
void VCCtoCameraData(VccPtr vcc, TQ3CameraObject camera); |
*/ |
extern Rect gContrlRect; |
static void BasicCameraDataToVCC(TQ3CameraData cameraData, VccPtr vcc); |
static void VCCtoBasicCameraData(VccPtr vcc, TQ3CameraData *cameraData); |
//---------------------------------------------------------------------------------- |
TQ3CameraObject MakeCamera(long select) |
{ |
TQ3CameraObject camera; |
TQ3CameraData cameraData; |
TQ3OrthographicCameraData orthographCameraData; |
TQ3ViewPlaneCameraData viewPlaneCameraData; |
TQ3ViewAngleAspectCameraData viewAngleCameraData; |
TQ3Point3D cameraFrom = { 0.0, 0.0, 15.0 }; |
TQ3Point3D cameraTo = { 0.0, 0.0, 0.0 }; |
TQ3Vector3D cameraUp = { 0.0, 1.0, 0.0 }; |
cameraData.placement.cameraLocation = cameraFrom; |
cameraData.placement.pointOfInterest = cameraTo; |
cameraData.placement.upVector = cameraUp; |
cameraData.range.hither = .25; |
cameraData.range.yon = 25.0; |
cameraData.viewPort.origin.x = -1.0; |
cameraData.viewPort.origin.y = 1.0; |
cameraData.viewPort.width = 3.0; |
cameraData.viewPort.height = 2.0; |
switch (select) { |
case iOrthoGraphic: |
orthographCameraData.cameraData = cameraData; |
orthographCameraData.left = -12.0; |
orthographCameraData.top = -12.0; |
orthographCameraData.right = 12.0; |
orthographCameraData.bottom = 12.0; |
camera = Q3OrthographicCamera_New(&orthographCameraData); |
break; |
case iViewPlane: |
viewPlaneCameraData.cameraData = cameraData; |
viewPlaneCameraData.viewPlane = 20.0 ; |
viewPlaneCameraData.halfWidthAtViewPlane = 20.0; |
viewPlaneCameraData.halfHeightAtViewPlane = 20.0; |
viewPlaneCameraData.centerXOnViewPlane = 0.0; |
viewPlaneCameraData.centerYOnViewPlane = 0.0; |
camera = Q3ViewPlaneCamera_New(&viewPlaneCameraData); |
break; |
case iAspectRatio: |
viewAngleCameraData.cameraData = cameraData; |
viewAngleCameraData.fov = 90.0; |
viewAngleCameraData.aspectRatioXToY = 1.0; |
camera = Q3ViewAngleAspectCamera_New(&viewAngleCameraData); |
break; |
} |
return ( camera ); |
} |
//---------------------------------------------------------------------------------- |
#define cBasicData 20 |
VccPtr CameraDataToVCC(TQ3CameraObject camera) |
{ |
TQ3OrthographicCameraData orthographCameraData; |
TQ3ViewPlaneCameraData viewPlaneCameraData; |
TQ3ViewAngleAspectCameraData viewAngleCameraData; |
TQ3ObjectType type; |
TQ3Status status; |
VccPtr vcc; |
type = Q3Camera_GetType( camera ); |
switch (type) { |
case kQ3CameraTypeOrthographic: |
status = Q3OrthographicCamera_GetData(camera, &orthographCameraData); |
if (status == kQ3Failure) return nil; |
vcc = NewVCluster((long)kQ3CameraTypeOrthographic, |
"\pOrthographicCamera", cBasicData + 4, &gContrlRect); |
if (vcc == nil) { |
SysBeep(10); // ErrMsg("\pNewVCluster failed"); |
return nil; |
} |
BasicCameraDataToVCC(orthographCameraData.cameraData, vcc); |
AddValueCtl(vcc, "\pleft", orthographCameraData.left, -20.0, 0.0, 2.0); |
AddValueCtl(vcc, "\ptop", orthographCameraData.top, -20.0, 0.0, 2.0); |
AddValueCtl(vcc, "\pright", orthographCameraData.right, 0.0, 20.0, 2.0); |
AddValueCtl(vcc, "\pbottom", orthographCameraData.bottom, 0.0, 20.0, 2.0); |
break; |
case kQ3CameraTypeViewPlane: |
status = Q3ViewPlaneCamera_GetData(camera, &viewPlaneCameraData); |
if (status == kQ3Failure) return nil; |
vcc = NewVCluster((long)kQ3CameraTypeViewPlane, |
"\pViewPlaneCamera", cBasicData + 5, &gContrlRect); |
if (vcc == nil) { |
SysBeep(10); // ErrMsg("\pNewVCluster failed"); |
return nil; |
} |
BasicCameraDataToVCC(viewPlaneCameraData.cameraData, vcc); |
AddValueCtl(vcc, "\pviewPlane", viewPlaneCameraData.viewPlane, 5.0, 100.0, 5.0); |
AddValueCtl(vcc, "\phalfWidthAtViewPlane", viewPlaneCameraData.halfWidthAtViewPlane, 1.0, 39.0, 2.0); |
AddValueCtl(vcc, "\phalfHeightAtViewPlane", viewPlaneCameraData.halfHeightAtViewPlane, 1.0, 39.0, 2.0); |
AddValueCtl(vcc, "\pcenterXOnViewPlane", viewPlaneCameraData.centerXOnViewPlane, -5.0, 5.0, 1.0); |
AddValueCtl(vcc, "\pcenterYOnViewPlane", viewPlaneCameraData.centerYOnViewPlane, -5.0, 5.0, 1.0); |
break; |
case kQ3CameraTypeViewAngleAspect: |
status = Q3ViewAngleAspectCamera_GetData(camera, &viewAngleCameraData); |
if (status == kQ3Failure) return nil; |
vcc = NewVCluster((long)kQ3CameraTypeViewAngleAspect, |
"\pViewAngleCamera", cBasicData + 2, &gContrlRect); |
if (vcc == nil) { |
SysBeep(10); // ErrMsg("\pNewVCluster failed"); |
return nil; |
} |
BasicCameraDataToVCC(viewAngleCameraData.cameraData, vcc); |
AddValueCtl(vcc, "\pviewAngleData.fov", viewAngleCameraData.fov, 0.0, 3.0, 0.1); |
AddValueCtl(vcc, "\paspectRatioXToY", viewAngleCameraData.aspectRatioXToY, 0.4, 2.5, 0.1); |
break; |
} |
return vcc; |
} |
//---------------------------------------------------------------------------------- |
void VCCtoCameraData(VccPtr vcc, TQ3CameraObject camera) |
{ |
TQ3OrthographicCameraData orthographCameraData; |
TQ3ViewPlaneCameraData viewPlaneCameraData; |
TQ3ViewAngleAspectCameraData viewAngleCameraData; |
TQ3ObjectType type; |
TQ3Status status; |
type = Q3Camera_GetType( camera ); |
switch (type) { |
case kQ3CameraTypeOrthographic: |
status = Q3OrthographicCamera_GetData(camera, &orthographCameraData); |
if (status == kQ3Failure) |
return; |
VCCtoBasicCameraData(vcc, &orthographCameraData.cameraData); |
orthographCameraData.left = GetCurrentValue(vcc, 20); |
orthographCameraData.top = GetCurrentValue(vcc, 21); |
orthographCameraData.right = GetCurrentValue(vcc, 22); |
orthographCameraData.bottom = GetCurrentValue(vcc, 23); |
status = Q3OrthographicCamera_SetData(camera, &orthographCameraData); |
break; |
case kQ3CameraTypeViewPlane: |
status = Q3ViewPlaneCamera_GetData(camera, &viewPlaneCameraData); |
if (status == kQ3Failure) |
return; |
VCCtoBasicCameraData(vcc, &viewPlaneCameraData.cameraData); |
viewPlaneCameraData.viewPlane = GetCurrentValue(vcc, 20); |
viewPlaneCameraData.halfWidthAtViewPlane = GetCurrentValue(vcc, 21); |
viewPlaneCameraData.halfHeightAtViewPlane = GetCurrentValue(vcc, 22); |
viewPlaneCameraData.centerXOnViewPlane = GetCurrentValue(vcc, 23); |
viewPlaneCameraData.centerYOnViewPlane = GetCurrentValue(vcc, 24); |
status = Q3ViewPlaneCamera_SetData(camera, &viewPlaneCameraData); |
break; |
case kQ3CameraTypeViewAngleAspect: |
status = Q3ViewAngleAspectCamera_GetData(camera, &viewAngleCameraData); |
if (status == kQ3Failure) |
return; |
VCCtoBasicCameraData(vcc, &viewAngleCameraData.cameraData); |
viewAngleCameraData.fov = GetCurrentValue(vcc, 20); |
viewAngleCameraData.aspectRatioXToY = GetCurrentValue(vcc, 21); |
status = Q3ViewAngleAspectCamera_SetData(camera, &viewAngleCameraData); |
break; |
} |
} |
//---------------------------------------------------------------------------------- |
static void BasicCameraDataToVCC(TQ3CameraData cameraData, VccPtr vcc) |
{ |
TQ3Point3D p; |
TQ3Vector3D pp; |
TQ3Point2D q; |
p = cameraData.placement.cameraLocation; |
AddValueCtl(vcc, "\pcameraLocation.x", p.x, -10.0, 10.0, 0.5); // [0] |
AddValueCtl(vcc, "\pcameraLocation.y", p.y, -10.0, 10.0, 0.5); |
AddValueCtl(vcc, "\pcameraLocation.z", p.z, 0.0, 30.0, 1.0); |
AddSeparator(vcc); |
p = cameraData.placement.pointOfInterest; |
AddValueCtl(vcc, "\ppointOfInterest.x", p.x, -10.0, 10.0, 1.0); // [4] |
AddValueCtl(vcc, "\ppointOfInterest.y", p.y, -10.0, 10.0, 1.0); |
AddValueCtl(vcc, "\ppointOfInterest.z", p.z, -10.0, 10.0, 1.0); |
AddSeparator(vcc); |
pp = cameraData.placement.upVector; |
AddValueCtl(vcc, "\pupVector.x", pp.x, -1.0, 1.0, 0.1); // [8] |
AddValueCtl(vcc, "\pupVector.y", pp.y, -1.0, 1.0, 0.1); |
AddValueCtl(vcc, "\pupVector.z", pp.z, -1.0, 1.0, 0.1); |
AddSeparator(vcc); |
AddValueCtl(vcc, "\prange.hither", cameraData.range.hither, 0.0, 15.0, 1.0); // [12] |
AddValueCtl(vcc, "\prange.yon", cameraData.range.yon, 15.0, 100.0, 2.5); |
AddSeparator(vcc); |
q = cameraData.viewPort.origin; |
AddValueCtl(vcc, "\pviewPort.origin.x", q.x, -2.0, 2.0, 0.1); // [15] |
AddValueCtl(vcc, "\pviewPort.origin.y", q.y, -2.0, 2.0, 0.1); |
AddValueCtl(vcc, "\pviewPort.width", cameraData.viewPort.width, 1.0, 10.0, 0.5); |
AddValueCtl(vcc, "\pviewPort.height", cameraData.viewPort.height, 1.0, 10.0, 0.5); |
AddSeparator(vcc); // cBasicData = 20 |
} |
//---------------------------------------------------------------------------------- |
static void VCCtoBasicCameraData(VccPtr vcc, TQ3CameraData *cameraData) |
{ |
(*cameraData).placement.cameraLocation.x = GetCurrentValue(vcc, 0); |
(*cameraData).placement.cameraLocation.y = GetCurrentValue(vcc, 1); |
(*cameraData).placement.cameraLocation.z = GetCurrentValue(vcc, 2); |
(*cameraData).placement.pointOfInterest.x = GetCurrentValue(vcc, 4); |
(*cameraData).placement.pointOfInterest.y = GetCurrentValue(vcc, 5); |
(*cameraData).placement.pointOfInterest.z = GetCurrentValue(vcc, 6); |
(*cameraData).placement.upVector.x = GetCurrentValue(vcc, 8); |
(*cameraData).placement.upVector.y = GetCurrentValue(vcc, 9); |
(*cameraData).placement.upVector.z = GetCurrentValue(vcc, 10); |
(*cameraData).range.hither = GetCurrentValue(vcc, 12); |
(*cameraData).range.yon = GetCurrentValue(vcc, 13); |
(*cameraData).viewPort.origin.x = GetCurrentValue(vcc, 15); |
(*cameraData).viewPort.origin.y = GetCurrentValue(vcc, 16); |
(*cameraData).viewPort.width = GetCurrentValue(vcc, 17); |
(*cameraData).viewPort.height = GetCurrentValue(vcc, 18); |
} |
Copyright © 2003 Apple Computer, Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2003-01-14