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