Skip to content
Snippets Groups Projects
Plot.H 4.36 KiB
Newer Older
  • Learn to ignore specific revisions
  • slevy's avatar
    slevy committed
    #ifndef _PLOT_H
    #define _PLOT_H
    /*
    
     * FLTK OpenGL 2-D plot widget.
     * Stuart Levy, slevy@ncsa.uiuc.edu
     * National Center for Supercomputing Applications,
     * University of Illinois 2001.
    
     * This file is part of partiview, released under the
     * Illinois Open Source License; see the file LICENSE.partiview for details.
    
    #ifdef __APPLE__
    # include <OpenGL/gl.h>
    # include <OpenGL/glu.h>
    #else
    # include <GL/gl.h>
    # include <GL/glu.h>
    #endif
    
    
    slevy's avatar
    slevy committed
    #include <stdio.h>
    
    #ifndef __cplusplus
    
    typedef struct _Fl_Plot Fl_Plot;
    int Plot_add_drawer( Fl_Plot *,
    			void (*func)( Fl_Plot *, void *obj, void *arg ),
    			void *obj, void *arg, CONST char *name, int id );
    int Plot_inpick( Fl_Plot * );	/* for plain-C drawers */
    void Plot_setpick( Fl_Plot *, void (*pickcb)(Fl_Plot *, int hits, int ents, GLuint *buf) );
    
    #else /* C++ */
    
    #include <stdlib.h>
    #include <FL/Fl.H>
    #include <FL/Fl_Gl_Window.H>
    #include "geometry.h"
    
    class Fl_Plot : public Fl_Gl_Window {
    
     public:
    
      Fl_Plot(int x, int y, int w, int h, const char *label = 0);
    
      int add_drawer( void (*func)( Fl_Plot *, void *obj, void *arg ), void *obj, void *arg, const char *name = NULL, int id = -1 );
      int  next_id() const;
      void notifier( void (*func)( Fl_Plot *, void * ), void * );
      int  (*msg)( const char *fmt, ... );
      int  (*eventhook)( Fl_Plot *, int ev );
    
      void xrange( float xmin, float xmax );
      void yrange( float ymin, float ymax );
    
    slevy's avatar
    slevy committed
      float x0() const { return x0_; }
      float x1() const { return x1_; }
      float y0() const { return y0_; }
      float y1() const { return y1_; }
    
      void xtitle( const char * );
      void ytitle( const char * );
      char *xtitle() const { return xtitle_; }
      char *ytitle() const { return ytitle_; }
    
      float zoomview( float zoomin, int xev = 0, int yev = 0 );
    
    
    slevy's avatar
    slevy committed
      int inpick() const { return inpick_; } // draw()ers: am I in GL_SELECT mode?
      void picksize( float width, float height );
      void pickbuffer( int words, GLuint *buf );
    
      void picker( void (*pickcb)(Fl_Gl_Window *, int, int, GLuint *, void *arg), void *arg ); 
      void (*picker( void **argp = 0 ))(Fl_Gl_Window *, int, int, GLuint *, void *arg);
    
    slevy's avatar
    slevy committed
      int pickresults( int *wordsp, GLuint **bufp );  /* returns num hits, too */
      int do_pick( float pickx, float picky ); /* Calls back function given by picker() */
    
      int snapshot( int x, int y, int w, int h, void *packedrgb );
    	// Take snapshot into caller-supplied buffer, w*h*3 bytes long
    
      int ndrawers() const { return ndrawers_; }
    
      char *dname( int drawerno );
    
      void bgcolor( Point *rgb ) { bgcolor_ = *rgb; redraw(); }
      const Point *bgcolor() const { return &bgcolor_; }
    
      virtual void draw();
      virtual int  handle(int ev);
    
      static void idlepick( void *me );
    
     protected:
    
    slevy's avatar
    slevy committed
      float x0_, x1_, y0_, y1_;
    
      float initx0_, inity0_, initx1_, inity1_;
    
    slevy's avatar
    slevy committed
      char *xtitle_, *ytitle_;
    
      float orthox0_, orthox1_, orthoy0_, orthoy1_;
    
      void (*pickcb_)( Fl_Gl_Window *, int hits, int nents, GLuint *buf, void *arg );
    
    slevy's avatar
    slevy committed
      int inpick_;
      float pickx_, picky_, pickwidth_, pickheight_;
      int picknents_, pickhits_;
      GLuint *pickbuf_;
      GLuint tpickbuf[1024];
      void *pickarg_;
    
    	/* We handle mouse-driven picking in an idle-callback, to avoid
    	 * getting behind if there are many events.
    	 */
      float dpickx_, dpicky_;
      int pickneeded_;
      int hasfocus_;
    
      void (*notify_)( Fl_Plot *, void *);
      void *notifyarg_;
      void notify();
    				/* navigation settings */
      /* Sweep status -- where current mouse drag started */
      int evx_, evy_, evzaxis_, evconstrain_;
    
      struct drawer {
        void (*func)(Fl_Plot *, void *obj, void *arg);
        void *obj, *arg;
        char *name;
        int id;
      };
      int ndrawers_, maxdrawers_;
      struct drawer *drawers_;
      int withid( int id ) const;
      void draw_scene( int needproj, const Matrix *postproj );
    
      Point bgcolor_;	/* OK, it's not a Point, we just want 3 components */
    
      void do_nav(int ev, int slow, int zaxis, int constrained);
    
      void start_nav( int navtarget ); /* Save event-position, camera, target-position */
    
      void init() {
        msg = printf;
        eventhook = NULL;
        ndrawers_ = maxdrawers_ = 0;
        drawers_ = NULL;
        inpick_ = 0;
        pickwidth_ = 2, pickheight_ = 2;
    
    
        orthox0_ = -.15;
        orthox1_ = 1.05;
        orthoy0_ = -.15;
        orthoy1_ = 1.05;
    
    
    slevy's avatar
    slevy committed
        picknents_ = sizeof(tpickbuf) / sizeof(tpickbuf[0]);
        pickbuf_ = tpickbuf;
        pickarg_ = NULL;
        notify_ = NULL;
        notifyarg_ = NULL;
        bgcolor_.x[0] = bgcolor_.x[1] = bgcolor_.x[2] = .2;
        hasfocus_ = 0;
      }
    };
    #endif /* C++ */
    #endif /*_GVIEW_H*/