00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00040 #include "../Include/Sky.h"
00041 #include "../Include/Utility.h"
00042
00043
00044
00045
00046
00047 static int mercury_predraw (ssgEntity *e)
00048 {
00049 ssgLeaf *f = (ssgLeaf*)e;
00050 if (f->hasState()) f->getState()->apply();
00051
00052 glPushAttrib (GL_DEPTH_BUFFER_BIT | GL_FOG_BIT | GL_POINT_BIT);
00053 glDisable (GL_DEPTH_TEST);
00054 glDisable (GL_FOG);
00055 glEnable (GL_POINT_SMOOTH);
00056 glPointSize (2.0);
00057
00058 return true;
00059 }
00060
00061
00062
00063
00064
00065 static int mercury_postdraw (ssgEntity *e)
00066 {
00067 glPopAttrib ();
00068
00069 return true;
00070 }
00071
00072
00073 CMercuryImage::CMercuryImage (void)
00074 {
00075
00076 top = new ssgTransform;
00077 top->setName ("Mercury");
00078
00079
00080 ssgSimpleState *state = new ssgSimpleState ();
00081 state->setShadeModel (GL_SMOOTH);
00082 state->disable (GL_LIGHTING);
00083 state->disable (GL_CULL_FACE);
00084 state->disable (GL_TEXTURE_2D);
00085 state->enable (GL_COLOR_MATERIAL);
00086 state->enable (GL_BLEND);
00087 state->enable (GL_ALPHA_TEST);
00088 state->setColourMaterial (GL_AMBIENT_AND_DIFFUSE);
00089 state->setMaterial (GL_EMISSION, 0, 0, 0, 1);
00090 state->setMaterial (GL_SPECULAR, 0, 0, 0, 1);
00091
00092
00093 rgba = new ssgColourArray (1);
00094 sgVec4 default_colour;
00095 sgSetVec4 (default_colour, 1.0, 1.0, 1.0, 1.0);
00096 rgba->add (default_colour);
00097
00098
00099 va = new ssgVertexArray (1);
00100 sgVec3 v;
00101 sgSetVec3 (v, 0, 0, 0);
00102 va->add (v);
00103
00104
00105 ssgLeaf *leaf = new ssgVtxTable (GL_POINTS, va, NULL, NULL, rgba);
00106 leaf->setState (state);
00107 leaf->setCallback (SSG_CALLBACK_PREDRAW, mercury_predraw);
00108 leaf->setCallback (SSG_CALLBACK_POSTDRAW, mercury_postdraw);
00109 top->addKid (leaf);
00110 }
00111
00112
00113 ssgEntity* CMercuryImage::GetSSGEntity (void)
00114 {
00115 return top;
00116 }
00117
00118
00119
00120
00121
00122 void CMercuryImage::Repaint (float mv, float limit, float factor)
00123 {
00124 float nmag, alpha;
00125 if (mv < limit) {
00126
00127 nmag = (limit - mv) / limit;
00128 alpha = (nmag * 0.85);
00129 alpha += 0.25;
00130 alpha *= factor;
00131 } else {
00132
00133 alpha = 0.0;
00134 }
00135
00136
00137 if (alpha > 1.0) { alpha = 1.0; }
00138 if (alpha < 0.0) { alpha = 0.0; }
00139
00140 float* colour = rgba->get (0);
00141 colour[3] = alpha;
00142 }
00143
00144
00145
00146
00147
00148
00149
00150
00151
00152
00153
00154
00155 void CMercuryImage::Reposition (sgVec3 pos, double lst, double lat,
00156 double ra, double dec, double distance)
00157 {
00158 sgMat4 LST, LAT, RA, DEC, D;
00159 sgVec3 axis;
00160 sgVec3 v;
00161
00162
00163 sgSetVec3 (axis, -1, 0, 0);
00164 sgMakeRotMat4 (LAT, 90-lat, axis);
00165
00166
00167 sgSetVec3 (axis, 0, 0, -1);
00168 sgMakeRotMat4 (LST, (lst * 15), axis);
00169
00170
00171 sgSetVec3 (axis, 0, 0, 1);
00172 sgMakeRotMat4 (RA, RadToDeg (ra), axis);
00173
00174
00175 sgSetVec3 (axis, 1, 0, 0);
00176 sgMakeRotMat4 (DEC, 90 - RadToDeg (dec), axis);
00177
00178
00179 sgSetVec3 (v, 0, 0, distance);
00180 sgMakeTransMat4 (D, v);
00181
00182
00183 sgMat4 T;
00184 sgMakeIdentMat4 (T);
00185 sgPreMultMat4 (T, LAT);
00186 sgPreMultMat4 (T, LST);
00187 sgPreMultMat4 (T, RA);
00188 sgPreMultMat4 (T, DEC);
00189 sgPreMultMat4 (T, D);
00190
00191 top->setTransform (T);
00192 }
00193