File: mvdraw.hpp

package info (click to toggle)
netgen 6.2.2601%2Bdfsg1-3
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 13,076 kB
  • sloc: cpp: 166,627; tcl: 6,310; python: 2,868; sh: 528; makefile: 90
file content (325 lines) | stat: -rw-r--r-- 8,629 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
#ifndef FILE_MVDRAW
#define FILE_MVDRAW


namespace netgen
{


  class VisualScene
  {
  protected:
    static NGGUI_API Point3d center;
    static NGGUI_API double rad;

    static double lookatmat[16];
    static double transmat[16];
    static double rotmat[16];
    static double centermat[16];
	
    static NGGUI_API double transformationmat[16];

    GLdouble clipplane[4];

    int changeval;
    static NGGUI_API GLdouble backcolor;

    static int NGGUI_API selface;
    static int selelement;
    static PointIndex NGGUI_API selpoint;
    static PointIndex selpoint2;
    static int locpi;
    static int NGGUI_API seledge;

    static optional<Point<3>> marker;

    static int subdivision_timestamp;
    static int subdivisions;
  public:
    static int viewport[4];
    static GLuint coltexname;
    static int ntexcols;
    int invcolor;


  public:
    NGGUI_API VisualScene ();
    NGGUI_API virtual ~VisualScene();

    NGGUI_API virtual void BuildScene (int zoomall = 0);
    NGGUI_API virtual void DrawScene ();
  
    NGGUI_API void CalcTransformationMatrices();
    NGGUI_API void StandardRotation (const char * dir);
    NGGUI_API void ArbitraryRotation (const NgArray<double> & alpha, const NgArray<Vec3d> & vec);
    NGGUI_API void ArbitraryRotation (const double alpha, const Vec3d & vec);

    NGGUI_API virtual void MouseMove(int oldx, int oldy,
                                      int newx, int newy,
                                      char mode);

    NGGUI_API void LookAt (const Point<3> & cam, const Point<3> & obj,
                 const Point<3> & camup);

    NGGUI_API void SetClippingPlane ();

    NGGUI_API virtual void MouseDblClick (int px, int py);

    NGGUI_API void SetLight ();
    static void SetBackGroundColor (double col)
    { backcolor = col; }

    NGGUI_API void CreateTexture (int ncols, int linear, double alpha, int typ);
    NGGUI_API void DrawColorBar (double minval, double maxval, int logscale = 0, bool linear = 1, string format="%8.3e", string unit="");
    NGGUI_API void DrawTitle (string title);
    NGGUI_API void DrawCoordinateCross ();
    NGGUI_API void DrawMarker();
    NGGUI_API void DrawNetgenLogo ();
    NGGUI_API void SetOpenGlColor(double val, double valmin, double valmax, int logscale = 0);
	

#ifdef PARALLELGL
    NGGUI_API void InitParallelGL ();
    NGGUI_API void Broadcast ();
#endif 
  };


  NGGUI_API extern void MyOpenGLText (const char * text);
  NGGUI_API extern int MyOpenGLTextWidth ();
  NGGUI_API extern void Set_OpenGLText_Callback ( void (*fun) (const char * text), int width );
  NGGUI_API extern VisualScene visual_scene_cross;
  NGGUI_API extern VisualScene *visual_scene;
  NGGUI_API extern void MyOpenGLLines (FlatArray<Point<3>> points);










  class VisualSceneSurfaceMeshing : public VisualScene
  {
    double scalex = 1., scaley = 1., shiftx = 0., shifty = 0.;
  public:
    shared_ptr<NgArray<Point<3>>> locpointsptr;
    shared_ptr<NgArray<INDEX_2>> loclinesptr;
    shared_ptr<NgArray<Point<2>>> plainpointsptr;
    int oldnl;
    bool clearptr;
    VisualSceneSurfaceMeshing ();
    virtual ~VisualSceneSurfaceMeshing ();

    void BuildScene (int zoomall = 0) override;
    void DrawScene () override;
    NGGUI_API void MouseMove(int oldx, int oldy, int newx, int newy,
                   char mode) override;
  };

  NGGUI_API extern VisualSceneSurfaceMeshing vssurfacemeshing;



  struct VisualSelect
  {
    unsigned framebuffer = 0;
    unsigned render_buffers[2];
    unsigned width = 0;
    unsigned height = 0;
    unsigned x = 0;
    unsigned y = 0;
    int list = 0;
    int list_timestamp = -1;
    double projmat[16];
    double transformationmat[16]; // todo: set
    double clipplane[4]; // todo: set
    int viewport[4];
    int selelement = -1;
    Point<3> center; // todo: set
    double rad = 0.0; // todo: set
    bool enable_clipping_plane = true; // todo: set

    bool Unproject(int px, int py, Point<3> &p)
    {
      auto hy = viewport[3] - py;
      float pz;
      glReadPixels (px, hy, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, &pz);
      if(pz<1 && pz>0)
        gluUnProject(px, hy, pz, transformationmat, projmat, viewport,
            &p[0], &p[1], &p[2]);
      return pz<1 && pz>0;
    }

    ngcore::IVec<2> Project(Point<3> p)
    {
      Point<3> pwin;
      gluProject(p[0], p[1], p[2], transformationmat, projmat, viewport,
          &pwin[0], &pwin[1], &pwin[2]);

      return ngcore::IVec<2>(pwin[0]+0.5, viewport[3]-pwin[1]+0.5);
    }

    bool SelectSurfaceElement (shared_ptr<Mesh> mesh, int px, int py, Point<3> &p, bool select_on_clipping_plane);
  };




  class VisualSceneMesh : public VisualScene
  {
    int filledlist = 0;
    int linelist = 0;
    int edgelist = 0;
    int pointnumberlist = 0;

    int tetlist = 0;
    int prismlist = 0;
    int pyramidlist = 0;
    int hexlist = 0;

    int badellist = 0;
    int identifiedlist = 0;
    int domainsurflist = 0;

    int vstimestamp = -1;
    int filledtimestamp = -1;
    int linetimestamp = -1;
    int edgetimestamp = -1;
    // int pointnumbertimestamp = -1;

    int tettimestamp = -1;
    int prismtimestamp = -1;
    int pyramidtimestamp = -1;
    int hextimestamp = -1;

    // int badeltimestamp = -1;
    // int identifiedtimestamp = -1;
    // int domainsurftimestamp = -1;

    struct {
      unsigned texture = -1;
      int width = 0;
      int height = 0;
      int size = 0;
    } colors;

    VisualSelect select;

#ifdef PARALLELGL
    NgArray<int> par_linelists;
    NgArray<int> par_filledlists;
#endif

    MouseEventHandler * user_me_handler;

    NgLock *lock;

    //  int selface, selelement;
    //  int selpoint, selpoint2, locpi;
    //  int seledge;

    double minh, maxh; // for meshsize coloring

    // weak_ptr<Mesh> wp_mesh;

  public:
    NGGUI_API VisualSceneMesh ();
	NGGUI_API virtual ~VisualSceneMesh ();

	NGGUI_API virtual void BuildScene (int zoomall = 0);
	NGGUI_API virtual void DrawScene ();
	NGGUI_API virtual void MouseDblClick (int px, int py);

    // void SetMesh (shared_ptr<Mesh> mesh) { wp_mesh = mesh; }
    // shared_ptr<Mesh> GetMesh () { return shared_ptr<Mesh>(wp_mesh); }
    shared_ptr<Mesh> GetMesh () const { return shared_ptr<Mesh>(global_mesh); }

    void SetMouseEventHandler (MouseEventHandler * handler)
    { user_me_handler = handler; }


	NGGUI_API int SelectedFace () const
    { return selface; }
	NGGUI_API void SetSelectedFace (int asf);
    //    { selface = asf; selecttimestamp = GetTimeStamp(); }

	NGGUI_API int SelectedEdge () const
    { return seledge; }
	NGGUI_API int SelectedElement () const
    { return selelement; }
	NGGUI_API int SelectedPoint () const
    { return selpoint; }
    void BuildFilledList (bool select);
    void BuildColorTexture();
    void SelectCenter(int zoomall);
    // private:
    void BuildLineList();
    void BuildEdgeList();
    void BuildPointNumberList();

    void BuildTetList(const BitArray & shownode);
    void BuildPrismList(const BitArray & shownode);
    void BuildPyramidList(const BitArray & shownode);
    void BuildHexList(const BitArray & shownode);

    void BuildBadelList();
    void BuildIdentifiedList();
    void BuildDomainSurfList();

    bool SelectSurfaceElement (int px, int py, Point<3> &p, bool select_on_clipping_plane);
    bool Unproject(int px, int py, Point<3> &p);
    ngcore::IVec<2> Project(Point<3> p);
  };

  NGGUI_API extern VisualSceneMesh vsmesh;
  

  class NGGUI_API VisualSceneSpecPoints : public VisualScene
  {
  public:
    VisualSceneSpecPoints ();
    virtual ~VisualSceneSpecPoints ();

    virtual void BuildScene (int zoomall = 0);
    virtual void DrawScene ();

    double len;
  };



  
  


  // extern struct Tcl_Interp * hinterp;


  extern void AddVisualizationScene (const string & name, 
                                     VisualScene * vs);


  void MouseDblClickSelect (const int px, const int py,
                            const GLdouble * clipplane, const GLdouble backcolor,
                            const double * transformationmat,
                            const Point3d & center,
                            const double rad,
                            const int displaylist,
                            int & selelement, int & selface, int & seledge, PointIndex & selpoint,
                            PointIndex & selpoint2, int & locpi);

  void RenderSurfaceElements (shared_ptr<Mesh> mesh,
      int subdivisions,
      std::function<bool(int)> face_init,
      std::function<bool(SurfaceElementIndex)> sel_init
  );

  NGGUI_API std::vector<unsigned char> Snapshot( int w, int h );
}


#endif