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