3 * Copyright (C) 2006 Mathias Froehlich
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.
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.
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,
22 #ifndef SG_SCENE_DEBUGDRAWCALLBACK_HXX
23 #define SG_SCENE_DEBUGDRAWCALLBACK_HXX
27 #include <osg/Drawable>
29 #include <simgear/math/SGMath.hxx>
31 struct SGDebugDrawCallback : public osg::Drawable::DrawCallback {
32 virtual void drawImplementation(osg::State& state,
33 const osg::Drawable* drawable) const
35 // state.dirtyColorPointer();
36 printState(std::cout, drawable);
37 drawable->drawImplementation(state);
38 printState(std::cout, drawable);
39 // state.dirtyColorPointer();
42 void printState(std::ostream& stream, const osg::Drawable* drawable) const
44 stream << "Drawable \"" << drawable->getName() << "\"";
49 #define ERROR_CHECK(msg) \
51 GLenum errorNo = glGetError(); \
52 if (errorNo != GL_NO_ERROR) \
59 #define PRINT_STATE(flag) \
61 if (glIsEnabled(flag)) \
62 stream << " " #flag; \
63 ERROR_CHECK(" ERROR " #flag); \
66 PRINT_STATE(GL_COLOR_ARRAY);
67 PRINT_STATE(GL_EDGE_FLAG_ARRAY);
68 PRINT_STATE(GL_INDEX_ARRAY);
69 PRINT_STATE(GL_NORMAL_ARRAY);
70 PRINT_STATE(GL_TEXTURE_COORD_ARRAY);
71 PRINT_STATE(GL_VERTEX_ARRAY);
73 PRINT_STATE(GL_ALPHA_TEST);
74 PRINT_STATE(GL_AUTO_NORMAL);
75 PRINT_STATE(GL_BLEND);
76 PRINT_STATE(GL_CLIP_PLANE0);
77 PRINT_STATE(GL_CLIP_PLANE1);
78 PRINT_STATE(GL_CLIP_PLANE2);
79 PRINT_STATE(GL_CLIP_PLANE3);
80 PRINT_STATE(GL_CLIP_PLANE4);
81 PRINT_STATE(GL_CLIP_PLANE5);
82 PRINT_STATE(GL_COLOR_LOGIC_OP);
83 // PRINT_STATE(GL_COLOR_TABLE);
84 // PRINT_STATE(GL_CONVOLUTION_1D);
85 // PRINT_STATE(GL_CONVOLUTION_2D);
86 PRINT_STATE(GL_CULL_FACE);
87 PRINT_STATE(GL_DEPTH_TEST);
88 PRINT_STATE(GL_DITHER);
90 // PRINT_STATE(GL_HISTOGRAM);
91 PRINT_STATE(GL_INDEX_LOGIC_OP);
92 PRINT_STATE(GL_LIGHT0);
93 PRINT_STATE(GL_LIGHT1);
94 PRINT_STATE(GL_LIGHT2);
95 PRINT_STATE(GL_LIGHT3);
96 PRINT_STATE(GL_LIGHT4);
97 PRINT_STATE(GL_LIGHT5);
98 PRINT_STATE(GL_LIGHT6);
99 PRINT_STATE(GL_LIGHT7);
100 PRINT_STATE(GL_LIGHTING);
101 PRINT_STATE(GL_LINE_SMOOTH);
102 PRINT_STATE(GL_LINE_STIPPLE);
103 PRINT_STATE(GL_MAP1_COLOR_4);
104 PRINT_STATE(GL_MAP1_INDEX);
105 PRINT_STATE(GL_MAP1_NORMAL);
106 PRINT_STATE(GL_MAP1_TEXTURE_COORD_1);
107 PRINT_STATE(GL_MAP1_TEXTURE_COORD_2);
108 PRINT_STATE(GL_MAP1_TEXTURE_COORD_3);
109 PRINT_STATE(GL_MAP1_TEXTURE_COORD_4);
110 PRINT_STATE(GL_MAP2_COLOR_4);
111 PRINT_STATE(GL_MAP2_INDEX);
112 PRINT_STATE(GL_MAP2_NORMAL);
113 PRINT_STATE(GL_MAP2_TEXTURE_COORD_1);
114 PRINT_STATE(GL_MAP2_TEXTURE_COORD_2);
115 PRINT_STATE(GL_MAP2_TEXTURE_COORD_3);
116 PRINT_STATE(GL_MAP2_TEXTURE_COORD_4);
117 PRINT_STATE(GL_MAP2_VERTEX_3);
118 PRINT_STATE(GL_MAP2_VERTEX_4);
119 // PRINT_STATE(GL_MINMAX);
120 PRINT_STATE(GL_NORMALIZE);
121 PRINT_STATE(GL_POINT_SMOOTH);
122 PRINT_STATE(GL_POLYGON_SMOOTH);
123 PRINT_STATE(GL_POLYGON_OFFSET_FILL);
124 PRINT_STATE(GL_POLYGON_OFFSET_LINE);
125 PRINT_STATE(GL_POLYGON_OFFSET_POINT);
126 PRINT_STATE(GL_POLYGON_STIPPLE);
127 // PRINT_STATE(GL_POST_COLOR_MATRIX_COLOR_TABLE);
128 // PRINT_STATE(GL_POST_CONVOLUTION_COLOR_TABLE);
129 PRINT_STATE(GL_RESCALE_NORMAL);
130 PRINT_STATE(GL_SCISSOR_TEST);
131 // PRINT_STATE(GL_SEPARABLE_2D);
132 PRINT_STATE(GL_STENCIL_TEST);
133 PRINT_STATE(GL_TEXTURE_1D);
134 PRINT_STATE(GL_TEXTURE_2D);
136 PRINT_STATE(GL_TEXTURE_3D);
138 PRINT_STATE(GL_TEXTURE_GEN_Q);
139 PRINT_STATE(GL_TEXTURE_GEN_R);
140 PRINT_STATE(GL_TEXTURE_GEN_S);
141 PRINT_STATE(GL_TEXTURE_GEN_T);
149 #define PRINT_LIGHT(pname) \
152 glGetLightfv(GL_LIGHT0, pname, color.data());\
153 stream << " " #pname " " << color; \
155 PRINT_LIGHT(GL_AMBIENT);
156 PRINT_LIGHT(GL_DIFFUSE);
157 PRINT_LIGHT(GL_SPECULAR);
158 PRINT_LIGHT(GL_POSITION);
159 PRINT_LIGHT(GL_SPOT_DIRECTION);
163 if (glIsEnabled(GL_COLOR_MATERIAL)) {
164 stream << " GL_COLOR_MATERIAL(";
166 glGetIntegerv(GL_COLOR_MATERIAL_PARAMETER, &value);
167 if (value == GL_DIFFUSE)
168 stream << "GL_DIFFUSE";
169 if (value == GL_AMBIENT)
170 stream << "GL_AMBIENT";
171 if (value == GL_AMBIENT_AND_DIFFUSE)
172 stream << "GL_AMBIENT_AND_DIFFUSE";
173 if (value == GL_EMISSION)
174 stream << "GL_EMISSION";
175 if (value == GL_SPECULAR)
176 stream << "GL_SPECULAR";
178 #ifdef PRINT_MATERIAL
179 #undef PRINT_MATERIAL
181 #define PRINT_MATERIAL(pname) \
184 glGetMaterialfv(GL_FRONT, pname, color.data());\
185 stream << " " #pname " GL_FRONT " << color; \
186 glGetMaterialfv(GL_BACK, pname, color.data()); \
187 stream << " " #pname " GL_BACK " << color; \
190 PRINT_MATERIAL(GL_AMBIENT);
191 PRINT_MATERIAL(GL_DIFFUSE);
192 PRINT_MATERIAL(GL_EMISSION);
193 PRINT_MATERIAL(GL_SPECULAR);
194 #undef PRINT_MATERIAL