source: trunk/packages/vizservers/nanovis/NvCamera.cpp @ 2921

Last change on this file since 2921 was 2877, checked in by ldelgass, 12 years ago

Some minor refactoring, also add some more fine grained config.h defines
(e.g. replace NV40 define with feature defines). Add tests for some required
OpenGL extensions (should always check for extensions or base version before
calling entry points from the extension). Also, clamp diffuse and specular
values on input and warn when they are out of range.

  • Property svn:eol-style set to native
File size: 3.7 KB
Line 
1/* -*- mode: c++; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2/*
3 * ----------------------------------------------------------------------
4 * NvCamera.cpp : NvCamera class
5 *
6 * ======================================================================
7 *  AUTHOR:  Wei Qiao <qiaow@purdue.edu>
8 *           Purdue Rendering and Perceptualization Lab (PURPL)
9 *
10 *  Copyright (c) 2004-2006  Purdue Research Foundation
11 *
12 *  See the file "license.terms" for information on usage and
13 *  redistribution of this file, and for a DISCLAIMER OF ALL WARRANTIES.
14 * ======================================================================
15 */
16#include <stdio.h>
17#include <math.h>
18
19#include <GL/glew.h>
20#include <GL/glu.h>
21
22#include <vrmath/vrQuaternion.h>
23#include <vrmath/vrRotation.h>
24#include <vrmath/vrMatrix4x4f.h>
25
26#include "NvCamera.h"
27#include "Trace.h"
28
29static inline float deg2rad(float deg)
30{
31    return ((deg * M_PI) / 180.);
32}
33
34static inline float rad2deg(float rad)
35{
36    return ((rad * 180.) / M_PI);
37}
38
39NvCamera::NvCamera(int startx, int starty, int w, int h,
40                   float loc_x, float loc_y, float loc_z,
41                   float target_x, float target_y, float target_z,
42                   float angle_x, float angle_y, float angle_z) :
43    _location(loc_x, loc_y, loc_z),
44    _target(target_x, target_y, target_z),
45    _angle(angle_x, angle_y, angle_z),
46    _width(w),
47    _height(h),
48    _startX(startx),
49    _startY(starty)
50{
51}
52
53void
54NvCamera::initialize()
55{
56    TRACE("camera: %d, %d\n", _width, _height);
57    glViewport(_startX, _startY, _width, _height);
58    glMatrixMode(GL_PROJECTION);
59    glLoadIdentity();
60    gluPerspective(30,
61                   (GLdouble)(_width - _startX)/(GLdouble)(_height - _startY),
62                   0.1, 50.0);
63
64    glMatrixMode(GL_MODELVIEW);
65    glLoadIdentity();
66
67#ifndef OLD_CAMERA
68    glTranslatef(-_location.x, -_location.y, -_location.z);
69    glMultMatrixf((const GLfloat *)_cameraMatrix.get());
70#else
71
72    gluLookAt(_location.x, _location.y, _location.z,
73              _target.x, _target.y, _target.z,
74              0., 1., 0.);
75
76    if (_angle.x != 0.0f)
77        glRotated(_angle.x, 1., 0., 0.);
78    if (_angle.y != 0.0f)
79        glRotated(_angle.y, 0., 1., 0.);
80    if (_angle.z != 0.0f)
81        glRotated(_angle.z, 0., 0., 1.);
82#endif
83}
84
85void NvCamera::rotate(double *quat)
86{
87    vrQuaternion q(quat[0], quat[1], quat[2], quat[3]);
88    vrRotation rot;
89    rot.set(q);
90    _cameraMatrix.makeRotation(rot);
91    _cameraMatrix.transpose();
92    _angle.set(0, 0, 0);
93    TRACE("Set rotation to quat: %g %g %g %g\n",
94          quat[0], quat[1], quat[2], quat[3]);
95}
96
97void NvCamera::rotate(float angle_x, float angle_y, float angle_z)
98{
99#ifdef OLD_CAMERA
100    _angle = Vector3(angle_x, angle_y, angle_z);
101#else
102    angle_x = -angle_x;
103    angle_y = angle_y - 180.;
104    _angle = Vector3(angle_x, angle_y, angle_z);
105
106    _cameraMatrix.makeRotation(1, 0, 0, deg2rad(_angle.x));
107    vrMatrix4x4f mat;
108    mat.makeRotation(0, 1, 0, deg2rad(_angle.y));
109    _cameraMatrix.multiply(mat);
110    mat.makeRotation(0, 0, 1, deg2rad(_angle.z));
111    _cameraMatrix.multiply(mat);
112    //_cameraMatrix.transpose();
113#endif
114    TRACE("Set rotation to angles: %g %g %g\n",
115          _angle.x, _angle.y, _angle.z);
116}
117
118void NvCamera::rotate(const Vector3& angle)
119{
120#ifdef OLD_CAMERA
121    _angle = angle;
122#else
123    _angle.x = -angle.x;
124    _angle.y = angle.y - 180.;
125    _angle.z = angle.z;
126
127    _cameraMatrix.makeRotation(1, 0, 0, deg2rad(_angle.x));
128    vrMatrix4x4f mat;
129    mat.makeRotation(0, 1, 0, deg2rad(_angle.y));
130    _cameraMatrix.multiply(mat);
131    mat.makeRotation(0, 0, 1, deg2rad(_angle.z));
132    _cameraMatrix.multiply(mat);
133    //_cameraMatrix.transpose();
134#endif
135    TRACE("Set rotation to angles: %g %g %g\n",
136          _angle.x, _angle.y, _angle.z);
137}
Note: See TracBrowser for help on using the repository browser.