GCOP
1.0
|
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