soc-2008-mxcurioni: first version of lib3ds code. It does NOT work yet and has to...
[blender.git] / source / blender / freestyle / intern / rendering / GLRenderer.h
1 //
2 //  Filename         : GLRenderer.h
3 //  Author(s)        : Stephane Grabli, Emmanuel Turquin
4 //  Purpose          : Class to render a 3D scene thanks to OpenGL
5 //  Date of creation : 07/02/2002
6 //
7 ///////////////////////////////////////////////////////////////////////////////
8
9
10 //
11 //  Copyright (C) : Please refer to the COPYRIGHT file distributed 
12 //   with this source distribution. 
13 //
14 //  This program is free software; you can redistribute it and/or
15 //  modify it under the terms of the GNU General Public License
16 //  as published by the Free Software Foundation; either version 2
17 //  of the License, or (at your option) any later version.
18 //
19 //  This program is distributed in the hope that it will be useful,
20 //  but WITHOUT ANY WARRANTY; without even the implied warranty of
21 //  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
22 //  GNU General Public License for more details.
23 //
24 //  You should have received a copy of the GNU General Public License
25 //  along with this program; if not, write to the Free Software
26 //  Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA  02111-1307, USA.
27 //
28 ///////////////////////////////////////////////////////////////////////////////
29
30 #ifndef  GLRENDERER_H
31 # define GLRENDERER_H
32
33 # ifdef WIN32
34 #  include <windows.h>
35 # endif
36 # ifdef __MACH__
37 #  include <OpenGL/gl.h>
38 # else
39 #  include <GL/gl.h>
40 # endif
41
42 # include "../system/FreestyleConfig.h"
43 # include "../system/Precision.h"
44 # include "../scene_graph/SceneVisitor.h"
45 # include "../geometry/Geom.h"
46 using namespace Geometry; 
47
48 class LIB_RENDERING_EXPORT GLRenderer : public SceneVisitor
49 {
50  public:
51
52   inline GLRenderer() : SceneVisitor() {}
53   virtual ~GLRenderer() {}
54
55   //
56   // visitClass methods
57   //
58   //////////////////////////////////////////////
59
60   VISIT_DECL(NodeLight)
61   VISIT_DECL(NodeCamera)
62   VISIT_DECL(NodeTransform)
63
64   VISIT_DECL(LineRep)
65   VISIT_DECL(OrientedLineRep)
66   VISIT_DECL(TriangleRep)
67   VISIT_DECL(VertexRep)
68   VISIT_DECL(IndexedFaceSet)
69   VISIT_DECL(DrawingStyle)
70   VISIT_DECL(FrsMaterial)
71
72   virtual void visitFrsMaterial(const FrsMaterial&);
73   virtual void visitNodeTransformBefore(NodeTransform&);
74   virtual void visitNodeTransformAfter(NodeTransform&);
75   virtual void visitNodeDrawingStyleBefore(NodeDrawingStyle&);
76   virtual void visitNodeDrawingStyleAfter(NodeDrawingStyle&);
77
78  protected:
79
80   /*! Renders a face made of a triangles strip
81    *    iVertices
82    *      Array of float containing the face vertices. 3 floats per 
83    *      x, y, z vertex coordinates
84    *    iNormals 
85    *      Array of float containing the face normals. 3 floats per 
86    *      x, y, z vertex normal coordinates
87    *    iTexCoords
88    *      Array of float containing the face uv coords. 2 floats per 
89    *      u,v vertex texture coordinates
90    *    iVIndices
91    *      Array of the indices (to use with the iVertices array) 
92    *      describing the vertices parsing order
93    *    iNIndices
94    *      Array of normals indices (to use with iNormals array)
95    *      describing the normals parsing order
96    *    iTIndices
97    *      Array of texture coordinates indices (to use with iTexCoords array)
98    *      describing the texture coordinates parsing order
99    *    iNVertices
100    *      The number of vertices in the face
101    */
102   virtual void RenderTriangleStrip(const real *iVertices, 
103                                    const real *iNormals,
104                                    const FrsMaterial *const*iMaterials, 
105                                    const real *iTexCoords,
106                                    const unsigned* iVIndices, 
107                                    const unsigned* iNIndices,
108                                    const unsigned* iMIndices,
109                                    const unsigned* iTIndices,
110                                    const unsigned iNVertices) ;
111
112   /*! Renders a face made of a triangles fan
113    *    iVertices
114    *      Array of float containing the face vertices. 3 floats per 
115    *      x, y, z vertex coordinates
116    *    iNormals 
117    *      Array of float containing the face normals. 3 floats per 
118    *      x, y, z vertex normal coordinates
119    *    iTexCoords
120    *      Array of float containing the face uv coords. 2 floats per 
121    *      u,v vertex texture coordinates
122    *    iVIndices
123    *      Array of the indices (to use with the iVertices array) 
124    *      describing the vertices parsing order
125    *    iNIndices
126    *      Array of normals indices (to use with iNormals array)
127    *      describing the normals parsing order
128    *    iTIndices
129    *      Array of texture coordinates indices (to use with iTexCoords array)
130    *      describing the texture coordinates parsing order
131    *    iNVertices
132    *      The number of vertices in the face
133    */
134   virtual void RenderTriangleFan(const real *iVertices, 
135                                  const real *iNormals,
136                                  const FrsMaterial *const* iMaterials,
137                                  const real *iTexCoords,
138                                  const unsigned* iVIndices, 
139                                  const unsigned* iNIndices,
140                                  const unsigned* iMIndices,
141                                  const unsigned* iTIndices,
142                                  const unsigned iNVertices) ;
143
144   /*! Renders a face made of single triangles
145    *    iVertices
146    *      Array of float containing the face vertices. 3 floats per 
147    *      x, y, z vertex coordinates
148    *    iNormals 
149    *      Array of float containing the face normals. 3 floats per 
150    *      x, y, z vertex normal coordinates
151    *    iTexCoords
152    *      Array of float containing the face uv coords. 2 floats per 
153    *      u,v vertex texture coordinates
154    *    iVIndices
155    *      Array of the indices (to use with the iVertices array) 
156    *      describing the vertices parsing order
157    *    iNIndices
158    *      Array of normals indices (to use with iNormals array)
159    *      describing the normals parsing order
160    *    iTIndices
161    *      Array of texture coordinates indices (to use with iTexCoords array)
162    *      describing the texture coordinates parsing order
163    *    iNVertices
164    *      The number of vertices in the face
165    */
166   virtual void RenderTriangles(const real *iVertices, 
167                                const real *iNormals,
168                                const FrsMaterial *const* iMaterials, 
169                                const real *iTexCoords,
170                                const unsigned* iVIndices, 
171                                const unsigned* iNIndices,
172                                const unsigned* iMIndices,
173                                const unsigned* iTIndices,
174                                const unsigned iNVertices)  ;
175
176   /*! Apply a transform matrix by multiplying 
177    *  the current OpenGL ModelView Matrix by 
178    *  iMatrix
179    */
180   virtual void applyTransform( const Matrix44r &iMatrix)  ;
181
182   /*! Sets the current drawing color.
183    *  Active only when light is disabled
184    *  (simple call to glColor4fv)
185    *    rgba
186    *      array of 4 floats (r, g, b and alpha)
187    */
188   virtual void RenderColor( const float *rgba);
189
190   /*! glVertex3f or glVertex3d */
191   inline void glVertex3r(float x, float y, float z) {glVertex3f(x,y,z);}
192   inline void glVertex3r(real x, real y, real z) {glVertex3d(x,y,z);}
193
194   /*! glVertex3f or glNormal3d */
195   inline void glNormal3r(float x, float y, float z) {glNormal3f(x,y,z);}
196   inline void glNormal3r(real x, real y, real z) {glNormal3d(x,y,z);}
197
198   /*! glMultMatrixf or glMultMatrixd */
199   inline void glMultMatrixr(float *m) {glMultMatrixf(m);}
200   inline void glMultMatrixr(real *m) {glMultMatrixd(m);}
201
202 };
203
204 #endif // GLRENDERER_H