1 /* -*-c++-*- 2 * 3 * Copyright (C) 2006 Mathias Froehlich 4 * 5 * This program is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU General Public License as 7 * published by the Free Software Foundation; either version 2 of the 8 * License, or (at your option) any later version. 9 * 10 * This program is distributed in the hope that it will be useful, but 11 * WITHOUT ANY WARRANTY; without even the implied warranty of 12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 13 * General Public License for more details. 14 * 15 * You should have received a copy of the GNU General Public License 16 * along with this program; if not, write to the Free Software 17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, 18 * MA 02110-1301, USA. 19 * 20 */ 21 22 #ifndef SG_SCENE_DEBUGDRAWCALLBACK_HXX 23 #define SG_SCENE_DEBUGDRAWCALLBACK_HXX 24 25 #include <iostream> 26 #include <GL/gl.h> 27 #include <osg/Drawable> 28 #include <osg/State> 29 30 struct SGDebugDrawCallback : public osg::Drawable::DrawCallback { drawImplementationSGDebugDrawCallback31 virtual void drawImplementation(osg::State& state, 32 const osg::Drawable* drawable) const 33 { 34 // state.dirtyColorPointer(); 35 printState(std::cout, drawable); 36 drawable->drawImplementation(state); 37 printState(std::cout, drawable); 38 // state.dirtyColorPointer(); 39 } 40 printStateSGDebugDrawCallback41 void printState(std::ostream& stream, const osg::Drawable* drawable) const 42 { 43 stream << "Drawable \"" << drawable->getName() << "\""; 44 #ifdef ERROR_CHECK 45 #undef ERROR_CHECK 46 #endif 47 48 #define ERROR_CHECK(msg) \ 49 do { \ 50 GLenum errorNo = glGetError(); \ 51 if (errorNo != GL_NO_ERROR) \ 52 stream << msg; \ 53 } while(0) 54 55 #ifdef PRINT_STATE 56 #undef PRINT_STATE 57 #endif 58 #define PRINT_STATE(flag) \ 59 do { \ 60 if (glIsEnabled(flag)) \ 61 stream << " " #flag; \ 62 ERROR_CHECK(" ERROR " #flag); \ 63 } while(0) 64 65 PRINT_STATE(GL_COLOR_ARRAY); 66 PRINT_STATE(GL_EDGE_FLAG_ARRAY); 67 PRINT_STATE(GL_INDEX_ARRAY); 68 PRINT_STATE(GL_NORMAL_ARRAY); 69 PRINT_STATE(GL_TEXTURE_COORD_ARRAY); 70 PRINT_STATE(GL_VERTEX_ARRAY); 71 72 PRINT_STATE(GL_ALPHA_TEST); 73 PRINT_STATE(GL_AUTO_NORMAL); 74 PRINT_STATE(GL_BLEND); 75 PRINT_STATE(GL_CLIP_PLANE0); 76 PRINT_STATE(GL_CLIP_PLANE1); 77 PRINT_STATE(GL_CLIP_PLANE2); 78 PRINT_STATE(GL_CLIP_PLANE3); 79 PRINT_STATE(GL_CLIP_PLANE4); 80 PRINT_STATE(GL_CLIP_PLANE5); 81 PRINT_STATE(GL_COLOR_LOGIC_OP); 82 // PRINT_STATE(GL_COLOR_TABLE); 83 // PRINT_STATE(GL_CONVOLUTION_1D); 84 // PRINT_STATE(GL_CONVOLUTION_2D); 85 PRINT_STATE(GL_CULL_FACE); 86 PRINT_STATE(GL_DEPTH_TEST); 87 PRINT_STATE(GL_DITHER); 88 PRINT_STATE(GL_FOG); 89 // PRINT_STATE(GL_HISTOGRAM); 90 PRINT_STATE(GL_INDEX_LOGIC_OP); 91 PRINT_STATE(GL_LIGHT0); 92 PRINT_STATE(GL_LIGHT1); 93 PRINT_STATE(GL_LIGHT2); 94 PRINT_STATE(GL_LIGHT3); 95 PRINT_STATE(GL_LIGHT4); 96 PRINT_STATE(GL_LIGHT5); 97 PRINT_STATE(GL_LIGHT6); 98 PRINT_STATE(GL_LIGHT7); 99 PRINT_STATE(GL_LIGHTING); 100 PRINT_STATE(GL_LINE_SMOOTH); 101 PRINT_STATE(GL_LINE_STIPPLE); 102 PRINT_STATE(GL_MAP1_COLOR_4); 103 PRINT_STATE(GL_MAP1_INDEX); 104 PRINT_STATE(GL_MAP1_NORMAL); 105 PRINT_STATE(GL_MAP1_TEXTURE_COORD_1); 106 PRINT_STATE(GL_MAP1_TEXTURE_COORD_2); 107 PRINT_STATE(GL_MAP1_TEXTURE_COORD_3); 108 PRINT_STATE(GL_MAP1_TEXTURE_COORD_4); 109 PRINT_STATE(GL_MAP2_COLOR_4); 110 PRINT_STATE(GL_MAP2_INDEX); 111 PRINT_STATE(GL_MAP2_NORMAL); 112 PRINT_STATE(GL_MAP2_TEXTURE_COORD_1); 113 PRINT_STATE(GL_MAP2_TEXTURE_COORD_2); 114 PRINT_STATE(GL_MAP2_TEXTURE_COORD_3); 115 PRINT_STATE(GL_MAP2_TEXTURE_COORD_4); 116 PRINT_STATE(GL_MAP2_VERTEX_3); 117 PRINT_STATE(GL_MAP2_VERTEX_4); 118 // PRINT_STATE(GL_MINMAX); 119 PRINT_STATE(GL_NORMALIZE); 120 PRINT_STATE(GL_POINT_SMOOTH); 121 PRINT_STATE(GL_POLYGON_SMOOTH); 122 PRINT_STATE(GL_POLYGON_OFFSET_FILL); 123 PRINT_STATE(GL_POLYGON_OFFSET_LINE); 124 PRINT_STATE(GL_POLYGON_OFFSET_POINT); 125 PRINT_STATE(GL_POLYGON_STIPPLE); 126 // PRINT_STATE(GL_POST_COLOR_MATRIX_COLOR_TABLE); 127 // PRINT_STATE(GL_POST_CONVOLUTION_COLOR_TABLE); 128 PRINT_STATE(GL_RESCALE_NORMAL); 129 PRINT_STATE(GL_SCISSOR_TEST); 130 // PRINT_STATE(GL_SEPARABLE_2D); 131 PRINT_STATE(GL_STENCIL_TEST); 132 PRINT_STATE(GL_TEXTURE_1D); 133 PRINT_STATE(GL_TEXTURE_2D); 134 #ifdef GL_TEXTURE_3D 135 PRINT_STATE(GL_TEXTURE_3D); 136 #endif 137 PRINT_STATE(GL_TEXTURE_GEN_Q); 138 PRINT_STATE(GL_TEXTURE_GEN_R); 139 PRINT_STATE(GL_TEXTURE_GEN_S); 140 PRINT_STATE(GL_TEXTURE_GEN_T); 141 #undef PRINT_STATE 142 #undef ERROR_CHECK 143 144 145 #ifdef PRINT_LIGHT 146 #undef PRINT_LIGHT 147 #endif 148 #define PRINT_LIGHT(pname) \ 149 do { \ 150 SGVec4f color; \ 151 glGetLightfv(GL_LIGHT0, pname, color.data());\ 152 stream << " " #pname " " << color; \ 153 } while(0) 154 PRINT_LIGHT(GL_AMBIENT); 155 PRINT_LIGHT(GL_DIFFUSE); 156 PRINT_LIGHT(GL_SPECULAR); 157 PRINT_LIGHT(GL_POSITION); 158 PRINT_LIGHT(GL_SPOT_DIRECTION); 159 160 #undef PRINT_LIGHT 161 162 if (glIsEnabled(GL_COLOR_MATERIAL)) { 163 stream << " GL_COLOR_MATERIAL("; 164 GLint value; 165 glGetIntegerv(GL_COLOR_MATERIAL_PARAMETER, &value); 166 if (value == GL_DIFFUSE) 167 stream << "GL_DIFFUSE"; 168 if (value == GL_AMBIENT) 169 stream << "GL_AMBIENT"; 170 if (value == GL_AMBIENT_AND_DIFFUSE) 171 stream << "GL_AMBIENT_AND_DIFFUSE"; 172 if (value == GL_EMISSION) 173 stream << "GL_EMISSION"; 174 if (value == GL_SPECULAR) 175 stream << "GL_SPECULAR"; 176 177 #ifdef PRINT_MATERIAL 178 #undef PRINT_MATERIAL 179 #endif 180 #define PRINT_MATERIAL(pname) \ 181 do { \ 182 SGVec4f color; \ 183 glGetMaterialfv(GL_FRONT, pname, color.data());\ 184 stream << " " #pname " GL_FRONT " << color; \ 185 glGetMaterialfv(GL_BACK, pname, color.data()); \ 186 stream << " " #pname " GL_BACK " << color; \ 187 } while(0) 188 189 PRINT_MATERIAL(GL_AMBIENT); 190 PRINT_MATERIAL(GL_DIFFUSE); 191 PRINT_MATERIAL(GL_EMISSION); 192 PRINT_MATERIAL(GL_SPECULAR); 193 #undef PRINT_MATERIAL 194 195 stream << ")"; 196 } 197 198 stream << "\n"; 199 } 200 }; 201 202 #endif 203