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);
}