/******************************************************************************
Plush Version 1.2
cam.c
Camera Control
Copyright (c) 1996-2000, Justin Frankel
******************************************************************************/

#include "plush.h"

void plCamDelete(pl_Cam *c) {
  if (c) free(c);
}

void plCamSetTarget(pl_Cam *c, pl_Float x, pl_Float y, pl_Float z) {
  double dx, dy, dz;
  dx = x - c->X;
  dy = y - c->Y;
  dz = z - c->Z;
  c->Roll = 0;
  if (dz > 0.0001f) {
    c->Pan = (pl_Float) (-atan(dx/dz)*(180.0/PL_PI));
    dz /= cos(c->Pan*(PL_PI/180.0));
    c->Pitch = (pl_Float) (atan(dy/dz)*(180.0/PL_PI));
  } else if (dz < -0.0001f) {
    c->Pan = (pl_Float) (180.0-atan(dx/dz)*(180.0/PL_PI));
    dz /= cos((c->Pan-180.0f)*(PL_PI/180.0));
    c->Pitch = (pl_Float) (-atan(dy/dz)*(180.0/PL_PI));
  } else {
    c->Pan = 0.0f;
    c->Pitch = -90.0f;
  }
}

pl_Cam *plCamCreate(pl_uInt sw, pl_uInt sh, pl_Float ar, pl_Float fov,
                    pl_uChar *fb, pl_ZBuffer *zb) {
  pl_Cam *c;
  c = malloc(sizeof(pl_Cam));
  if (!c) return 0;
  memset(c,0,sizeof(pl_Cam));
  c->Fov = fov;
  c->AspectRatio = ar;
  c->ClipRight = c->ScreenWidth = sw;
  c->ClipBottom = c->ScreenHeight = sh;
  c->CenterX = sw>>1;
  c->CenterY = sh>>1;
  c->ClipBack = 8.0e30f;
  c->frameBuffer = fb;
  c->zBuffer = zb;
  c->Sort = 1;
  if (zb) c->Sort = 0;
  return (c);
}