versor  3.0
C++11 library for Geometric algebra
vsr_cga3D_render.h
1 /*
2  * =====================================================================================
3  *
4  * Filename: vsr_cga3D_render.h
5  *
6  * Description: advanced graphics pipelin
7  *
8  * Version: 1.0
9  * Created: 01/19/2015 18:02:48
10  * Revision: none
11  * Compiler: gcc
12  *
13  * Author: Pablo Colapinto (), gmail -> wolftype
14  * Organization: wolftype
15  *
16  * =====================================================================================
17  */
18 
19 
20 #ifndef vsr_cga3D_render_INC
21 #define vsr_cga3D_render_INC
22 
23 
24 //#include "gfx/gfx_glyphs.h"
25 #include "gfx/gfx_render.h"
26 
27 #include "space/vsr_cga3D_op.h"
28 #include "space/vsr_cga3D_xf.h"
29 
30 #include "form/vsr_cga3D_frame.h"
31 #include "form/vsr_field.h"
32 
33 //#include "draw/vsr_cga3D_draw.h"
34 
35 namespace gfx{
36 
37  using namespace vsr;
38 
39  /*-----------------------------------------------------------------------------
40  * Template Specializations for Making Meshes for Specfic Types
41  *-----------------------------------------------------------------------------*/
42  template<> MeshBuffer<cga::Frame>::MeshBuffer();
43  template<> MeshBuffer<cga::Circle>::MeshBuffer();
44  template<> MeshBuffer<cga::DualLine>::MeshBuffer();
45  template<> MeshBuffer<cga::Line>::MeshBuffer();
46  template<> MeshBuffer<cga::Plane>::MeshBuffer();
47  template<> MeshBuffer<cga::DualPlane>::MeshBuffer();
48  template<> MeshBuffer<cga::Biv>::MeshBuffer();
49  template<> MeshBuffer<cga::Vec>::MeshBuffer();
50  template<> MeshBuffer<cga::Par>::MeshBuffer();
51  template<> MeshBuffer<cga::Pnt>::MeshBuffer();
52  template<> MeshBuffer<cga::Sph>::MeshBuffer();
53 
54  /*-----------------------------------------------------------------------------
55  * FIELDS (arrays) CAN VARY IN SIZE, SO USER IS RESPONSIBLE TO Add BUFFER ONLY ONCE
56  * (the GetMeshBuffer uses address of argument to check for existence the mMBOmap)
57  *-----------------------------------------------------------------------------*/
58 
59  template<> MeshBuffer<Field<cga::Vec>>::MeshBuffer();
60  template<> MeshBuffer<Field<cga::Pnt>>::MeshBuffer();
61 
62  template<> void MeshBuffer<Field<cga::Vec>>::Add( const Field<cga::Vec>& f );
63  template<> void MeshBuffer<Field<cga::Pnt>>::Add( const Field<cga::Pnt>& f );
64 
65  extern template MeshBuffer<cga::Frame>::MeshBuffer();
66  extern template MeshBuffer<cga::Circle>::MeshBuffer();
67  extern template MeshBuffer<cga::DualLine>::MeshBuffer();
68  extern template MeshBuffer<cga::Line>::MeshBuffer();
69  extern template MeshBuffer<cga::Plane>::MeshBuffer();
70  extern template MeshBuffer<cga::DualPlane>::MeshBuffer();
71  extern template MeshBuffer<cga::Biv>::MeshBuffer();
72  extern template MeshBuffer<cga::Vec>::MeshBuffer();
73  extern template MeshBuffer<cga::Par>::MeshBuffer();
74  extern template MeshBuffer<cga::Pnt>::MeshBuffer();
75  extern template MeshBuffer<cga::Sph>::MeshBuffer();
76 
77  extern template MeshBuffer<Field<cga::Vec>>::MeshBuffer();
78  extern template MeshBuffer<Field<cga::Pnt>>::MeshBuffer();
79 
80  extern template void MeshBuffer<Field<cga::Vec>>::Add( const Field<cga::Vec>& f );
81  extern template void MeshBuffer<Field<cga::Pnt>>::Add( const Field<cga::Pnt>& f );
82 
83  template<> struct ModelMatrix<cga::Frame>;
84  //extern template struct ModelMatrix<cga::Frame>;
85 
86  template<> void Renderable<cga::Frame>::Draw(const cga::Frame&, GFXSceneNode * s);
87  template<> void Renderable<cga::Cir>::Draw(const cga::Cir&, GFXSceneNode * s);
88  template<> void Renderable<vector<cga::Cir>>::Draw(const vector<cga::Cir>&, GFXSceneNode * s);
89  template<> void Renderable<cga::Pnt>::Draw(const cga::Pnt&, GFXSceneNode * s);
90  template<> void Renderable<cga::Sph>::Draw(const cga::Sph&, GFXSceneNode * s);
91  template<> void Renderable<cga::Par>::Draw(const cga::Par&, GFXSceneNode * s);
92  template<> void Renderable<cga::Dll>::Draw(const cga::Dll&, GFXSceneNode * s);
93  template<> void Renderable<cga::Lin>::Draw(const cga::Lin&, GFXSceneNode * s);
94  template<> void Renderable<cga::Pln>::Draw(const cga::Pln&, GFXSceneNode * s);
95  template<> void Renderable<cga::Dlp>::Draw(const cga::Dlp&, GFXSceneNode * s);
96  template<> void Renderable<cga::Biv>::Draw(const cga::Biv&, GFXSceneNode * s);
97  template<> void Renderable<Field<cga::Vec>>::Draw(const Field<cga::Vec>&, GFXSceneNode * s);
98  template<> void Renderable<Field<cga::Pnt>>::Draw(const Field<cga::Pnt>&, GFXSceneNode * s);
99 
100 
101  extern template void Renderable<cga::Frame>::Draw(const cga::Frame&, GFXSceneNode * s);
102  extern template void Renderable<cga::Cir>::Draw(const cga::Cir&, GFXSceneNode * s);
103  extern template void Renderable<vector<cga::Cir>>::Draw(const vector<cga::Cir>&, GFXSceneNode * s);
104  extern template void Renderable<cga::Pnt>::Draw(const cga::Pnt&, GFXSceneNode * s);
105  extern template void Renderable<cga::Sph>::Draw(const cga::Sph&, GFXSceneNode * s);
106  extern template void Renderable<cga::Par>::Draw(const cga::Par&, GFXSceneNode * s);
107  extern template void Renderable<cga::Dll>::Draw(const cga::Dll&, GFXSceneNode * s);
108  extern template void Renderable<cga::Lin>::Draw(const cga::Lin&, GFXSceneNode * s);
109  extern template void Renderable<cga::Dlp>::Draw(const cga::Dlp&, GFXSceneNode * s);
110  extern template void Renderable<cga::Pln>::Draw(const cga::Pln&, GFXSceneNode * s);
111  extern template void Renderable<cga::Biv>::Draw(const cga::Biv&, GFXSceneNode * s);
112  extern template void Renderable<Field<cga::Vec>>::Draw(const Field<cga::Vec>&, GFXSceneNode * s);
113  extern template void Renderable<Field<cga::Pnt>>::Draw(const Field<cga::Pnt>&, GFXSceneNode * s);
114 
115 
116 
117  /* template<> void Drawable<Field<Frame>>::Immediate( const Field<Frame>& f){ */
118  /* for (int i = 0; i < f.num(); ++i){ */
119  /* glPushMatrix(); */
120  /* Immediate( f[i] ); */
121  /* glPopMatrix(); */
122  /* } */
123  /* } */
124 
125  /* template<> void Drawable<Frame>::ImmediateB( const Frame& f){ */
126 
127  /* gfx::GL::translate( f.pos().begin() ); */
128  /* gfx::GL::rotate( Gen::aa( f.rot() ).begin() ); */
129  /* gfx::GL::scale( f.scale() ); */
130  /* Draw( Vec::x,1,0,0); */
131  /* Draw( Vec::y,0,1,0); */
132  /* Draw( Vec::z,0,0,1); */
133  /* } */
134 
135  /* template<> */
136  /* template<> void Drawable<ttttt>::ImmediateB( const Field<Vec>& f){ */
137  /* for (int i = 0; i < f.num(); ++i){ */
138  /* DrawAtB( f[i], f.grid(i) );// f[i][0], 1, 1 - f[i][0] ); */
139  /* } */
140  /* } */
141 
142 
143 
144  /* template<> void Drawable<Vec>::Immediate (const Vec& s){ */
145  /* gfx::Glyph::Line(s); */
146  /* glPushMatrix(); */
147  /* gfx::GL::translate( s.begin() ); */
148  /* gfx::GL::rotate( Op::AA(s).begin() ); */
149  /* Glyph::Cone(); */
150  /* glPopMatrix(); */
151  /* } */
152 
153 
154  /* template<> void Drawable<Vec>::ImmediateB (const Vec& s){ */
155  /* //cout << "ehl" << endl; */
156  /* gfx::Glyph::Line(s); */
157  /* glPushMatrix(); */
158  /* gfx::GL::translate( s.begin() ); */
159  /* gfx::Glyph::SolidSphere(.05,5,5); */
160  /* glPopMatrix(); */
161  /* } */
162 
163  /* template<> void Drawable<Biv>::Immediate(const Biv& s){ */
164  /* double ta = s.norm(); */
165  /* bool sn = Op::sn( s , Biv::xy * (-1)); */
166 
167  /* glPushMatrix(); */
168  /* gfx::GL::rotate( Op::AA(s).begin() ); */
169  /* gfx::Glyph::DirCircle( ta, sn ); */
170  /* glPopMatrix(); */
171  /* } */
172 
173  /* template<> void Drawable<Tnv>::Immediate (const Tnv& s){ */
174  /* Immediate( s.copy<Vec>() ); */
175  /* } */
176 
177  /* template<> void Drawable<Drv>::Immediate (const Drv& s){ */
178  /* Immediate( s.copy<Vec>() ); */
179  /* } */
180 
181  /* template<> void Drawable<Dlp>::Immediate (const Dlp& s){ */
182  /* gfx::GL::translate( Op::Pos(s).begin() ); */
183  /* gfx::GL::rotate( Op::AA(s).begin() ); */
184  /* Glyph::SolidGrid(6,6,5); */
185  /* } */
186  /* template<> void Drawable<Pln>::Immediate (const Pln& s){ */
187  /* Immediate(s.dual()); */
188  /* } */
189 
190  /* template<> void Drawable<Cir>::Immediate( const Cir& s ) { */
191  /* VT rad = Round::rad( s ); */
192  /* bool im = Round::size(s, false) > 0 ? 1 : 0; */
193 
194  /* gfx::GL::translate( Op::Pos(s).begin() ); */
195  /* gfx::GL::rotate( Op::AA(s).begin() ); */
196 
197  /* im ? gfx::Glyph::Circle( rad ) : gfx::Glyph::DashedCircle( rad ); */
198  /* } */
199 
200  /* template<> void Drawable<Pnt>::Immediate (const Pnt& s){ */
201 
202  /* VT ta = Round::size( s, true ); */
203 
204  /* //Draw as dual Sphere (if |radius^2| > 0.000001); */
205  /* if ( fabs(ta) > FPERROR ) { */
206  /* bool real = ta > 0 ? 1 : 0; */
207 
208  /* Pnt p = Round::cen( s ); */
209  /* VT t = sqrt ( fabs ( ta ) ); */
210 
211  /* gfx::GL::translate ( p.begin() ); */
212  /* (real) ? gfx::Glyph::SolidSphere(t, 5+ floor(t*30), 5+floor(t*30)) : Glyph::Sphere(t); */
213  /* } else { */
214  /* gfx::Glyph::Point(s); */
215  /* } */
216  /* } */
217 
218  /* template<> void Drawable<Sph>::Immediate (const Sph& s){ */
219 
220  /* VT ta = Round::size( s, false ); */
221 
222  /* //Draw as dual Sphere (if |radius^2| > 0.000001); */
223  /* if ( fabs(ta) > FPERROR ) { */
224  /* bool real = ta > 0 ? 1 : 0; */
225 
226  /* Pnt p = Round::cen( s ); */
227  /* VT t = sqrt ( fabs ( ta ) ); */
228 
229  /* gfx::GL::translate ( p.begin() ); */
230  /* (real) ? gfx::Glyph::SolidSphere(t, 5+ floor(t*30), 5+floor(t*30)) : Glyph::Sphere(t); */
231  /* } else { */
232  /* gfx::Glyph::Point(s); */
233  /* } */
234  /* } */
235 
236  /* template<> void Drawable<Flp>::Immediate (const Flp& s){ */
237  /* Immediate( Round::null( s[0], s[1], s[2] ) ); */
238  /* } */
239 
240  /* template<> void Drawable<Par>::Immediate (const Par& s){ */
241  /* //Is Imaginary? */
242  /* VT size = Round::size( s, false ); */
243 
244  /* //is null? */
245  /* if ( fabs(size) < FPERROR ){ */
246  /* GL::translate( Round::loc(s).begin() ); */
247  /* Immediate( -Round::dir(s).copy<Vec>() ); */
248 
249  /* }else{ */
250 
251  /* std::vector<Pnt> pp = Round::split( s ); */
252 
253  /* VT ta = Round::size( pp[0], true ); */
254 
255  /* if ( fabs(ta) > FPERROR ) { */
256  /* Pnt p1 = Round::cen( pp[0] ); */
257  /* Pnt p2 = Round::cen( pp[1] ); */
258  /* double t = sqrt ( fabs ( ta ) ); */
259  /* bool real = size > 0 ? 1 : 0; */
260 
261  /* glPushMatrix(); */
262  /* gfx::GL::translate ( p1.begin() );//(p1[0], p1[1], p1[2]); */
263  /* (real) ? gfx::Glyph::SolidSphere(t, 5+ floor(t*30), 5+floor(t*30)) : gfx::Glyph::Sphere(t); */
264  /* glPopMatrix(); */
265 
266  /* gfx::GL::translate ( p2.begin() ); */
267  /* (real) ? gfx::Glyph::SolidSphere(t, 5+ floor(t*30), 5+floor(t*30)) : gfx::Glyph::Sphere(t); */
268 
269  /* } else { */
270  /* // pp[0].vprint(); pp[1].vprint(); */
271  /* gfx::Glyph::Point(pp[0]); */
272  /* gfx::Glyph::Point(pp[1]); */
273  /* gfx::Glyph::Line(pp[0],pp[1]); */
274  /* } */
275  /* } */
276  /* } */
277 
278  /* template<> void Drawable<Dll>::Immediate (const Dll& s){ */
279  /* Drv d = Fl::dir( s.undual() ); */
280  /* Dls v = Fl::loc( s , PAO, true); */
281  /* gfx::GL::translate (v.begin()); */
282  /* gfx::Glyph::DashedLine(d * 10, d * -10); */
283  /* } */
284 
285  /* template<> void Drawable<Lin>::Immediate (const Lin& s){ */
286  /* Drv d = Fl::dir( s ); */
287  /* Dls v = Fl::loc( s , PAO, false); */
288  /* gfx::GL::translate (v.begin()); */
289  /* gfx::Glyph::Line(d * 10, d * -10); */
290  /* } */
291 
292 
293 } //vsr::
294 
295 
296 
297 
298 
299 #endif /* ----- #ifndef vsr_render_INC ----- */
Common Operations Specific to CGA3D.
Definition: vsr_cga2D_draw.h:13
A Basic 3D Field (slowly porting this over from the now defunct vsr_lattice class) Use to Evaluate Ne...
Definition: vsr_field.h:67
the versor library namespace
Definition: vsr_algebra.h:29
3D CGA Orthonormal Frame