1 #ifdef __cplusplus
2 extern "C" {
3 #endif
4 
5 #include "medit.h"
6 #include "extern.h"
7 #include "sproto.h"
8 
9 
Azimuth(pCamera c)10 double Azimuth(pCamera c) {
11   double  dd,azim,cosazim,sinazim;
12 
13   dd      = sqrt((double)c->speed[0]*c->speed[0]+(double)c->speed[2]*c->speed[2]);
14   cosazim = c->speed[2] / dd;
15   sinazim = c->speed[0] / dd;
16   azim = atan2(sinazim,cosazim) * RTOD;
17   return(azim);
18 }
19 
Elevation(pCamera c)20 double Elevation(pCamera c) {
21   double  elev;
22 
23   elev  = sqrt((double)c->speed[0]*c->speed[0]+(double)c->speed[2]*c->speed[2]);
24   elev  = atan2(c->speed[1],elev) * RTOD;
25   return(elev);
26 }
27 
28 /* compute new sun position */
updateSun(pScene sc,pCamera c)29 void updateSun(pScene sc,pCamera c) {
30   double    dd;
31   GLfloat   axe[3],sunf[4];
32   GLdouble  speed[3],sunp[4],matrix[16];
33 
34   axe[0] = c->speed[2];
35   axe[1] = 0.0f;
36   axe[2] = -c->speed[0];
37   dd = sqrt(axe[0]*axe[0] + axe[2]*axe[2]);
38   if ( dd != 0.0f ) {
39     axe[0] /= dd;
40     axe[2] /= dd;
41   }
42 
43   speed[0] = c->speed[0];
44   speed[1] = c->speed[1];
45   speed[2] = c->speed[2];
46 
47   glPushMatrix();
48   glLoadIdentity();
49     glRotatef(-30.0f,axe[0],axe[1],axe[2]);
50     glGetDoublev(GL_MODELVIEW_MATRIX,matrix);
51   glPopMatrix();
52   transformPointd(sunp,speed,matrix);
53   sunf[0] = -sc->dmax*sunp[0];
54   sunf[1] = -sc->dmax*sunp[1];
55   sunf[2] = -sc->dmax*sunp[2];
56   sunf[3] = 0.0;
57 
58   glLightfv(GL_LIGHT0,GL_POSITION,sunf);
59 
60   if ( ddebug ) {
61     printf("    speed  %g %g %g\n",c->speed[0],c->speed[1],c->speed[2]);
62     printf("    axe    %g %g %g\n",axe[0],axe[1],axe[2]);
63     printf("    sunpos %g %g %g\n",sunp[0],sunp[1],sunp[2]);
64   }
65 }
66 
67 
updateCamera(pScene sc,pCamera c,double azim,double elev)68 void updateCamera(pScene sc,pCamera c,double azim,double elev) {
69   double     d,lazim,lelev;
70 
71   /* compute speed vector */
72   if ( elev > 89.0f )       elev =  89.0;
73   else if ( elev < -89.0f ) elev = -89.0;
74   lazim = azim * DTOR;
75   lelev = elev * DTOR;
76   c->speed[0] = sin(lazim)*cos(lelev);
77   c->speed[1] = sin(lelev);
78   c->speed[2] = cos(lazim)*cos(lelev);
79 
80   d = (double)c->speed[0]*sc->par.sunpos[0] + c->speed[1]*sc->par.sunpos[1] +
81               c->speed[2]*sc->par.sunpos[2];
82   d = d / sqrt((double)sc->par.sunpos[0]*sc->par.sunpos[0]+
83                sc->par.sunpos[1]*sc->par.sunpos[1]+
84                sc->par.sunpos[2]*sc->par.sunpos[2]);
85   d = acos(d);
86   if ( fabs(d) > 0.10*sc->persp->fovy*DTOR )
87     updateSun(sc,c);
88 }
89 
90 
initCamera(pScene sc,int up)91 pCamera initCamera(pScene sc,int up) {
92   pCamera  c;
93   pMesh    mesh;
94   double   dd;
95   double   look[3];
96 
97   if ( ddebug ) printf("    initCamera dmax %g\n",sc->dmax);
98   if ( sc->camera ) c = sc->camera;
99   else {
100     c = (pCamera)M_calloc(1,sizeof(struct camera),"camera");
101     if ( !c ) {
102       printf("  ## unable to allocate memory / camera\n");
103       exit(1);
104     }
105   }
106 
107   /* adjust coeffs */
108   mesh = cv.mesh[sc->idmesh];
109   c->eye[0] = c->eye[1] = 0.0;
110   c->eye[2] = sc->dmax;
111 
112   c->vecup  = up;
113 
114   c->speed[0] = 0.0;
115   c->speed[1] = 0.0;
116   c->speed[2] = c->eye[2];
117   dd = -1.0 / sqrt(c->speed[2]*c->speed[2]);
118   c->speed[2] *= dd;
119   c->spmod  = 0.01*sc->dmax;
120   c->altinc = 0.01*(mesh->ymax-mesh->ymin);
121 
122   /* set sun position */
123   updateSun(sc,c);
124 
125   if ( ddebug ) {
126     look[0] = c->eye[0] + sc->dmax*c->speed[0];
127     look[1] = c->eye[1] + sc->dmax*c->speed[1];
128     look[2] = c->eye[2] + sc->dmax*c->speed[2];
129     printf("    eye   %g %g %g\n",c->eye[0],c->eye[1],c->eye[2]);
130     printf("    speed %g %g %g\n",c->speed[0],c->speed[1],c->speed[2]);
131     printf("    look  %g %g %g\n",look[0],look[1],look[2]);
132   }
133 
134   return(c);
135 }
136 
137 #ifdef __cplusplus
138 }
139 #endif
140