/**************************************************************************** * camera.c * * This module implements methods for managing the viewpoint. * * from Persistence of Vision(tm) Ray Tracer * Copyright 1996 Persistence of Vision Team *--------------------------------------------------------------------------- * NOTICE: This source code file is provided so that users may experiment * with enhancements to POV-Ray and to port the software to platforms other * than those supported by the POV-Ray Team. There are strict rules under * which you are permitted to use this file. The rules are in the file * named POVLEGAL.DOC which should be distributed with this file. If * POVLEGAL.DOC is not available or for more info please contact the POV-Ray * Team Coordinator by leaving a message in CompuServe's Graphics Developer's * Forum. The latest version of POV-Ray may be found there as well. * * This program is based on the popular DKB raytracer version 2.12. * DKBTrace was originally written by David K. Buck. * DKBTrace Ver 2.0-2.12 were written by David K. Buck & Aaron A. Collins. * *****************************************************************************/ #include "frame.h" #include "vector.h" #include "povproto.h" #include "camera.h" #include "matrices.h" #include "normal.h" /***************************************************************************** * * FUNCTION * * Translate_Camera * * INPUT * * OUTPUT * * RETURNS * * AUTHOR * * POV-Ray Team * * DESCRIPTION * * - * * CHANGES * * - * ******************************************************************************/ void Translate_Camera(Camera, Vector) CAMERA *Camera; VECTOR Vector; { VAddEq(((CAMERA *)Camera)->Location, Vector); } /***************************************************************************** * * FUNCTION * * Rotate_Camera * * INPUT * * OUTPUT * * RETURNS * * AUTHOR * * POV-Ray Team * * DESCRIPTION * * - * * CHANGES * * - * ******************************************************************************/ void Rotate_Camera(Camera, Vector) CAMERA *Camera; VECTOR Vector; { TRANSFORM Trans; Compute_Rotation_Transform(&Trans, Vector); Transform_Camera(Camera, &Trans); } /***************************************************************************** * * FUNCTION * * Scale_Camera * * INPUT * * OUTPUT * * RETURNS * * AUTHOR * * POV-Ray Team * * DESCRIPTION * * - * * CHANGES * * - * ******************************************************************************/ void Scale_Camera(Camera, Vector) CAMERA *Camera; VECTOR Vector; { TRANSFORM Trans; Compute_Scaling_Transform(&Trans, Vector); Transform_Camera(Camera, &Trans); } /***************************************************************************** * * FUNCTION * * Transform_Camera * * INPUT * * OUTPUT * * RETURNS * * AUTHOR * * POV-Ray Team * * DESCRIPTION * * - * * CHANGES * * - * ******************************************************************************/ void Transform_Camera(Camera, Trans) CAMERA *Camera; TRANSFORM *Trans; { MTransPoint(Camera->Location, Camera->Location, Trans); MTransPoint(Camera->Direction, Camera->Direction, Trans); MTransPoint(Camera->Up, Camera->Up, Trans); MTransPoint(Camera->Right, Camera->Right, Trans); } /***************************************************************************** * * FUNCTION * * Create_Camera * * INPUT * * OUTPUT * * RETURNS * * AUTHOR * * POV-Ray Team * * DESCRIPTION * * - * * CHANGES * * - * ******************************************************************************/ CAMERA *Create_Camera() { CAMERA *New; New = (CAMERA *)POV_MALLOC(sizeof (CAMERA), "camera"); Make_Vector(New->Location, 0.0, 0.0, 0.0); Make_Vector(New->Direction, 0.0, 0.0, 1.0); Make_Vector(New->Up, 0.0, 1.0, 0.0); Make_Vector(New->Right, 1.33, 0.0, 0.0); Make_Vector(New->Sky, 0.0, 1.0, 0.0); Make_Vector(New->Look_At, 0.0, 0.0, 1.0); /* Init focal blur stuff (not used by default). */ New->Blur_Samples = 0; New->Confidence = 0.9; New->Variance = 1.0 / 128.0; New->Aperture = 0.0; New->Focal_Distance = -1.0; /* Set default camera type and viewing angle. [DB 7/94] */ New->Type = PERSPECTIVE_CAMERA; New->Angle = 90.0; /* Do not perturb primary rays by default. [DB 7/94] */ New->Tnormal = NULL; return (New); } /***************************************************************************** * * FUNCTION * * Copy_Camera * * INPUT * * OUTPUT * * RETURNS * * AUTHOR * * POV-Ray Team * * DESCRIPTION * * - * * CHANGES * * - * ******************************************************************************/ CAMERA *Copy_Camera(Old) CAMERA *Old; { CAMERA *New; if (Old != NULL) { New = Create_Camera(); *New = *Old; } else { New = NULL; } return (New); } /***************************************************************************** * * FUNCTION * * Destroy_Camera * * INPUT * * OUTPUT * * RETURNS * * AUTHOR * * Dieter Bayer * * DESCRIPTION * * - * * CHANGES * * - * ******************************************************************************/ void Destroy_Camera(Camera) CAMERA *Camera; { if (Camera != NULL) { Destroy_Tnormal(Camera->Tnormal); POV_FREE(Camera); } }