]> git.mxchange.org Git - simgear.git/blob - simgear/scene/util/SGDebugDrawCallback.hxx
hla: Provide a directly property based api for property data element.
[simgear.git] / simgear / scene / util / SGDebugDrawCallback.hxx
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 #include <simgear/math/SGMath.hxx>
30
31 struct SGDebugDrawCallback : public osg::Drawable::DrawCallback {
32   virtual void drawImplementation(osg::State& state,
33                                   const osg::Drawable* drawable) const
34   {
35 //     state.dirtyColorPointer();
36     printState(std::cout, drawable);
37     drawable->drawImplementation(state);
38     printState(std::cout, drawable);
39 //     state.dirtyColorPointer();
40   }
41
42   void printState(std::ostream& stream, const osg::Drawable* drawable) const
43   {
44     stream << "Drawable \"" << drawable->getName() << "\"";
45 #ifdef ERROR_CHECK
46 #undef ERROR_CHECK
47 #endif
48
49 #define ERROR_CHECK(msg)              \
50 do {                                  \
51   GLenum errorNo = glGetError();      \
52   if (errorNo != GL_NO_ERROR)         \
53     stream << msg;                    \
54 } while(0)
55
56 #ifdef PRINT_STATE
57 #undef PRINT_STATE
58 #endif
59 #define PRINT_STATE(flag)             \
60 do {                                  \
61   if (glIsEnabled(flag))              \
62     stream << " " #flag;              \
63   ERROR_CHECK(" ERROR " #flag);       \
64 } while(0)
65
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);
72
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);
89     PRINT_STATE(GL_FOG);
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);
135 #ifdef GL_TEXTURE_3D
136     PRINT_STATE(GL_TEXTURE_3D);
137 #endif
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);
142 #undef PRINT_STATE
143 #undef ERROR_CHECK
144
145
146 #ifdef PRINT_LIGHT
147 #undef PRINT_LIGHT
148 #endif
149 #define PRINT_LIGHT(pname)                    \
150 do {                                             \
151   SGVec4f color;                                 \
152   glGetLightfv(GL_LIGHT0, pname, color.data());\
153   stream << " " #pname " " << color;    \
154 } while(0)
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);
160
161 #undef PRINT_LIGHT
162
163     if (glIsEnabled(GL_COLOR_MATERIAL)) {
164       stream << " GL_COLOR_MATERIAL(";
165       GLint value;
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";
177
178 #ifdef PRINT_MATERIAL
179 #undef PRINT_MATERIAL
180 #endif
181 #define PRINT_MATERIAL(pname)                    \
182 do {                                             \
183   SGVec4f color;                                 \
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;     \
188 } while(0)
189
190       PRINT_MATERIAL(GL_AMBIENT);
191       PRINT_MATERIAL(GL_DIFFUSE);
192       PRINT_MATERIAL(GL_EMISSION);
193       PRINT_MATERIAL(GL_SPECULAR);
194 #undef PRINT_MATERIAL
195
196       stream << ")";
197     }
198
199     stream << "\n";
200   }
201 };
202   
203 #endif