00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef SG_SCENE_DEBUGDRAWCALLBACK_HXX
00023 #define SG_SCENE_DEBUGDRAWCALLBACK_HXX
00024
00025 #include <iostream>
00026 #include <GL/gl.h>
00027 #include <osg/Drawable>
00028 #include <osg/State>
00029 #include <simgear/math/SGMath.hxx>
00030
00031 struct SGDebugDrawCallback : public osg::Drawable::DrawCallback {
00032 virtual void drawImplementation(osg::State& state,
00033 const osg::Drawable* drawable) const
00034 {
00035
00036 printState(std::cout, drawable);
00037 drawable->drawImplementation(state);
00038 printState(std::cout, drawable);
00039
00040 }
00041
00042 void printState(std::ostream& stream, const osg::Drawable* drawable) const
00043 {
00044 stream << "Drawable \"" << drawable->getName() << "\"";
00045 #ifdef ERROR_CHECK
00046 #undef ERROR_CHECK
00047 #endif
00048
00049 #define ERROR_CHECK(msg) \
00050 do { \
00051 GLenum errorNo = glGetError(); \
00052 if (errorNo != GL_NO_ERROR) \
00053 stream << msg; \
00054 } while(0)
00055
00056 #ifdef PRINT_STATE
00057 #undef PRINT_STATE
00058 #endif
00059 #define PRINT_STATE(flag) \
00060 do { \
00061 if (glIsEnabled(flag)) \
00062 stream << " " #flag; \
00063 ERROR_CHECK(" ERROR " #flag); \
00064 } while(0)
00065
00066 PRINT_STATE(GL_COLOR_ARRAY);
00067 PRINT_STATE(GL_EDGE_FLAG_ARRAY);
00068 PRINT_STATE(GL_INDEX_ARRAY);
00069 PRINT_STATE(GL_NORMAL_ARRAY);
00070 PRINT_STATE(GL_TEXTURE_COORD_ARRAY);
00071 PRINT_STATE(GL_VERTEX_ARRAY);
00072
00073 PRINT_STATE(GL_ALPHA_TEST);
00074 PRINT_STATE(GL_AUTO_NORMAL);
00075 PRINT_STATE(GL_BLEND);
00076 PRINT_STATE(GL_CLIP_PLANE0);
00077 PRINT_STATE(GL_CLIP_PLANE1);
00078 PRINT_STATE(GL_CLIP_PLANE2);
00079 PRINT_STATE(GL_CLIP_PLANE3);
00080 PRINT_STATE(GL_CLIP_PLANE4);
00081 PRINT_STATE(GL_CLIP_PLANE5);
00082 PRINT_STATE(GL_COLOR_LOGIC_OP);
00083
00084
00085
00086 PRINT_STATE(GL_CULL_FACE);
00087 PRINT_STATE(GL_DEPTH_TEST);
00088 PRINT_STATE(GL_DITHER);
00089 PRINT_STATE(GL_FOG);
00090
00091 PRINT_STATE(GL_INDEX_LOGIC_OP);
00092 PRINT_STATE(GL_LIGHT0);
00093 PRINT_STATE(GL_LIGHT1);
00094 PRINT_STATE(GL_LIGHT2);
00095 PRINT_STATE(GL_LIGHT3);
00096 PRINT_STATE(GL_LIGHT4);
00097 PRINT_STATE(GL_LIGHT5);
00098 PRINT_STATE(GL_LIGHT6);
00099 PRINT_STATE(GL_LIGHT7);
00100 PRINT_STATE(GL_LIGHTING);
00101 PRINT_STATE(GL_LINE_SMOOTH);
00102 PRINT_STATE(GL_LINE_STIPPLE);
00103 PRINT_STATE(GL_MAP1_COLOR_4);
00104 PRINT_STATE(GL_MAP1_INDEX);
00105 PRINT_STATE(GL_MAP1_NORMAL);
00106 PRINT_STATE(GL_MAP1_TEXTURE_COORD_1);
00107 PRINT_STATE(GL_MAP1_TEXTURE_COORD_2);
00108 PRINT_STATE(GL_MAP1_TEXTURE_COORD_3);
00109 PRINT_STATE(GL_MAP1_TEXTURE_COORD_4);
00110 PRINT_STATE(GL_MAP2_COLOR_4);
00111 PRINT_STATE(GL_MAP2_INDEX);
00112 PRINT_STATE(GL_MAP2_NORMAL);
00113 PRINT_STATE(GL_MAP2_TEXTURE_COORD_1);
00114 PRINT_STATE(GL_MAP2_TEXTURE_COORD_2);
00115 PRINT_STATE(GL_MAP2_TEXTURE_COORD_3);
00116 PRINT_STATE(GL_MAP2_TEXTURE_COORD_4);
00117 PRINT_STATE(GL_MAP2_VERTEX_3);
00118 PRINT_STATE(GL_MAP2_VERTEX_4);
00119
00120 PRINT_STATE(GL_NORMALIZE);
00121 PRINT_STATE(GL_POINT_SMOOTH);
00122 PRINT_STATE(GL_POLYGON_SMOOTH);
00123 PRINT_STATE(GL_POLYGON_OFFSET_FILL);
00124 PRINT_STATE(GL_POLYGON_OFFSET_LINE);
00125 PRINT_STATE(GL_POLYGON_OFFSET_POINT);
00126 PRINT_STATE(GL_POLYGON_STIPPLE);
00127
00128
00129 PRINT_STATE(GL_RESCALE_NORMAL);
00130 PRINT_STATE(GL_SCISSOR_TEST);
00131
00132 PRINT_STATE(GL_STENCIL_TEST);
00133 PRINT_STATE(GL_TEXTURE_1D);
00134 PRINT_STATE(GL_TEXTURE_2D);
00135 #ifdef GL_TEXTURE_3D
00136 PRINT_STATE(GL_TEXTURE_3D);
00137 #endif
00138 PRINT_STATE(GL_TEXTURE_GEN_Q);
00139 PRINT_STATE(GL_TEXTURE_GEN_R);
00140 PRINT_STATE(GL_TEXTURE_GEN_S);
00141 PRINT_STATE(GL_TEXTURE_GEN_T);
00142 #undef PRINT_STATE
00143 #undef ERROR_CHECK
00144
00145
00146 #ifdef PRINT_LIGHT
00147 #undef PRINT_LIGHT
00148 #endif
00149 #define PRINT_LIGHT(pname) \
00150 do { \
00151 SGVec4f color; \
00152 glGetLightfv(GL_LIGHT0, pname, color.data());\
00153 stream << " " #pname " " << color; \
00154 } while(0)
00155 PRINT_LIGHT(GL_AMBIENT);
00156 PRINT_LIGHT(GL_DIFFUSE);
00157 PRINT_LIGHT(GL_SPECULAR);
00158 PRINT_LIGHT(GL_POSITION);
00159 PRINT_LIGHT(GL_SPOT_DIRECTION);
00160
00161 #undef PRINT_LIGHT
00162
00163 if (glIsEnabled(GL_COLOR_MATERIAL)) {
00164 stream << " GL_COLOR_MATERIAL(";
00165 GLint value;
00166 glGetIntegerv(GL_COLOR_MATERIAL_PARAMETER, &value);
00167 if (value == GL_DIFFUSE)
00168 stream << "GL_DIFFUSE";
00169 if (value == GL_AMBIENT)
00170 stream << "GL_AMBIENT";
00171 if (value == GL_AMBIENT_AND_DIFFUSE)
00172 stream << "GL_AMBIENT_AND_DIFFUSE";
00173 if (value == GL_EMISSION)
00174 stream << "GL_EMISSION";
00175 if (value == GL_SPECULAR)
00176 stream << "GL_SPECULAR";
00177
00178 #ifdef PRINT_MATERIAL
00179 #undef PRINT_MATERIAL
00180 #endif
00181 #define PRINT_MATERIAL(pname) \
00182 do { \
00183 SGVec4f color; \
00184 glGetMaterialfv(GL_FRONT, pname, color.data());\
00185 stream << " " #pname " GL_FRONT " << color; \
00186 glGetMaterialfv(GL_BACK, pname, color.data()); \
00187 stream << " " #pname " GL_BACK " << color; \
00188 } while(0)
00189
00190 PRINT_MATERIAL(GL_AMBIENT);
00191 PRINT_MATERIAL(GL_DIFFUSE);
00192 PRINT_MATERIAL(GL_EMISSION);
00193 PRINT_MATERIAL(GL_SPECULAR);
00194 #undef PRINT_MATERIAL
00195
00196 stream << ")";
00197 }
00198
00199 stream << "\n";
00200 }
00201 };
00202
00203 #endif