GCOP  1.0
systemview.h
Go to the documentation of this file.
00001 #ifndef GCOP_SYSTEMVIEW_H
00002 #define GCOP_SYSTEMVIEW_H
00003 
00004 #include "GL/glu.h"
00005 #include "GL/glut.h"
00006 #include <assert.h>
00007 #include <stdlib.h>
00008 #include <string.h>
00009 #include <iostream>
00010 #include "viewer.h"
00011 #include "utils.h"
00012 #include "system.h"
00013 #include "view.h"
00014 
00015 
00016 namespace gcop {
00017 
00018   using namespace std;
00019 
00023   template <typename Tx, typename Tu>
00024     class SystemView : public View {
00025   public:
00026     
00032     SystemView(const char *name = 0, 
00033                vector<Tx> *xs = 0,
00034                vector<Tu> *us = 0);
00035 
00036     virtual ~SystemView();
00037 
00038     virtual void Render(const Tx *x,
00039                         const Tu *u = 0) = 0;
00040 
00051     virtual void Render(const vector<Tx> *xs,
00052                         const vector<Tu> *us = 0,
00053                         bool rs = true, 
00054                         int is = -1, int ie = -1,
00055                         int dis = 1, int dit = 1,
00056                         bool dl = true) = 0;
00057 
00058     virtual void Render();
00059     
00060     virtual bool RenderFrame(int i);
00061     
00066     void SetColor(const double rgba[4]);
00067 
00068     vector<Tx> *xs;  
00069     vector<Tu> *us;  
00070     
00071     int dis;                   
00072     
00073     int dit;                   
00074     
00075     double rgba[4];            
00076 
00077     double lineWidth;         
00078 
00079     bool renderSystem;        
00080     bool renderForces;       
00081   };
00082 
00083   
00084   template <typename Tx, typename Tu>
00085     SystemView<Tx,Tu>::SystemView(const char *name, vector<Tx> *xs, vector<Tu> *us) : View(name),
00086     xs(xs),
00087     us(us),
00088     dis(1),
00089     dit(1),
00090     lineWidth(1),
00091     renderSystem(true),
00092     renderForces(false) {
00093     rgba[0] = 1;
00094     rgba[1] = 1;
00095     rgba[2] = 1;
00096     rgba[3] = 0;
00097   }
00098   
00099   template <typename Tx, typename Tu>
00100     SystemView<Tx, Tu>::~SystemView() {
00101   }
00102   
00103   template <typename Tx, typename Tu>
00104     void SystemView<Tx,Tu>::SetColor(const double rgba[4]) {
00105     memcpy(this->rgba, rgba, 4*sizeof(double));
00106   }
00107   
00108   template <typename Tx, typename Tu>
00109     void SystemView<Tx, Tu>::Render() {
00110     glColor4dv(rgba);
00111     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
00112     //  glEnable(GL_BLEND);
00113     
00114     //  glColor4f(1,0,0,0);
00115     
00116     if (xs)
00117       Render(xs, us, renderSystem, 0, xs->size()-1, dis, dit); 
00118     
00119     //  glDisable(GL_BLEND);
00120   }
00121   
00122   
00123   template <typename Tx, typename Tu>
00124     bool SystemView<Tx, Tu>::RenderFrame(int i) {
00125     
00126     // glColor4dv(rgba);
00127     
00128     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
00129     //  glEnable(GL_BLEND);
00130     
00131     if (xs) {
00132       if (i < 0 || i >= xs->size())
00133         return false;
00134       
00135       // draw path without states (only last if applicable)
00136       Render(xs, us, false, 0, i, dis, dit, false);
00137       
00138       // draw current state
00139       if (us && i < us->size())
00140         Render(&(*xs)[i], &(*us)[i]);
00141       else
00142         Render(&(*xs)[i]);
00143         
00144       //    glDisable(GL_BLEND);
00145       // more states left
00146       return true;
00147     }
00148     
00149     //  glDisable(GL_BLEND);
00150     
00151     return false;
00152   }
00153 }
00154 
00155 #endif