struct drawable\r
{\r
virtual ~drawable(){}\r
- virtual void draw(double dy, double y) = 0;\r
+ virtual void draw() = 0;\r
};\r
\r
class context\r
\r
void render()\r
{\r
+ glLoadIdentity();\r
+ glTranslated(-1.0f, -1.0f, 0.0f);\r
+ glScaled(2.0f, 2.0f, 1.0f);\r
+\r
float dy = 1.0/static_cast<float>(std::max<int>(5, drawables_.size()));\r
- float y = 1.0-dy;\r
+\r
+ glTranslated(0.0f, (1.0-dy), 0.0f);\r
for(auto it = drawables_.begin(); it != drawables_.end();)\r
{\r
auto drawable = it->lock();\r
if(drawable)\r
{\r
- drawable->draw(dy, y); \r
- y -= dy;// + 0.01;\r
+ glPushMatrix();\r
+ glScaled(1.0f, dy, 1.0f);\r
+ drawable->draw();\r
+ glPopMatrix();\r
+ glTranslated(0.0f, -dy, 0.0f);\r
++it;\r
}\r
else \r
it = drawables_.erase(it); \r
- }\r
+ } \r
} \r
+\r
static context& get_instance()\r
{\r
static context impl;\r
{\r
boost::circular_buffer<float> line_data_;\r
std::vector<float> tick_data_;\r
- std::array<float, 3> color_;\r
+ color c_;\r
public:\r
line(size_t res = 600)\r
: line_data_(res)\r
- {\r
- color(1.0f, 1.0f, 1.0f);\r
- }\r
+ , c_(1.0f, 1.0f, 1.0f){}\r
\r
void update(float value)\r
{\r
tick_data_.push_back(value);\r
}\r
\r
- void color(float r, float g, float b)\r
- {\r
- color_[0] = r; color_[1] = g; color_[2] = b;\r
- }\r
+ void set_color(color c){c_ = c;}\r
\r
- void draw(double dy, double y)\r
+ void draw()\r
{\r
float dx = 1.0f/static_cast<float>(line_data_.capacity());\r
float x = static_cast<float>(line_data_.capacity()-line_data_.size())*dx;\r
}\r
\r
glBegin(GL_LINE_STRIP);\r
- glColor4f(color_[0], color_[1], color_[2], 1.0f); \r
+ glColor4f(c_.red, c_.green, c_.blue, 1.0f); \r
for(size_t n = 0; n < line_data_.size(); ++n) \r
- glVertex3f((x+n*dx)*2.0f-1.0f, (y + dy * std::max(0.05f, std::min(0.95f, line_data_[n]*0.8f + 0.1f))) * 2.0f - 1.0f, 0.0f); \r
+ glVertex3f(x+n*dx, std::max(0.05f, std::min(0.95f, line_data_[n]*0.8f + 0.1f)), 0.0f); \r
glEnd();\r
}\r
};\r
\r
class guide\r
{\r
- std::array<float, 3> color_;\r
+ color c_;\r
float value_;\r
public:\r
- guide() : value_(0.0f)\r
- {\r
- color_[0] = color_[1] = color_[2] = 0.0f;\r
- }\r
+ guide() : value_(0.0f){}\r
\r
- guide(float value, float r, float g, float b) : value_(value)\r
- {\r
- color_[0] = r; color_[1] = g; color_[2] = b;\r
- }\r
+ guide(float value, color c) \r
+ : value_(value)\r
+ , c_(c){}\r
\r
- void draw(double dy, double y)\r
+ void draw()\r
{ \r
glEnable(GL_LINE_STIPPLE);\r
glLineStipple(3, 0xAAAA);\r
glBegin(GL_LINE_STRIP);\r
- glColor4f(color_[0], color_[1], color_[2], 1.0f); \r
- glVertex3f(0.0f*2.0f-1.0f, (y + dy * (value_ * 0.8f + 0.1f)) * 2.0f - 1.0f, 0.0f); \r
- glVertex3f(1.0f*2.0f-1.0f, (y + dy * (value_ * 0.8f + 0.1f)) * 2.0f - 1.0f, 0.0f); \r
+ glColor4f(c_.red, c_.green, c_.blue, 1.0f); \r
+ glVertex3f(0.0f, value_ * 0.8f + 0.1f, 0.0f); \r
+ glVertex3f(1.0f, value_ * 0.8f + 0.1f, 0.0f); \r
glEnd();\r
glDisable(GL_LINE_STIPPLE);\r
}\r
\r
implementation(const std::string&)\r
{\r
- guides_["max"] = diagnostics::guide(1.0f, 0.4f, 0.4f, 0.4f);\r
- guides_["min"] = diagnostics::guide(0.0f, 0.4f, 0.4f, 0.4f);\r
+ guides_["max"] = diagnostics::guide(1.0f, color(0.4f, 0.4f, 0.4f));\r
+ guides_["min"] = diagnostics::guide(0.0f, color(0.4f, 0.4f, 0.4f));\r
}\r
\r
void update(const std::string& name, float value)\r
});\r
}\r
\r
- void color(const std::string& name, float r, float g, float b)\r
+ void set_color(const std::string& name, color c)\r
{\r
context::begin_invoke([=]\r
{\r
- lines_[name].color(r, g, b);\r
+ lines_[name].set_color(c);\r
});\r
}\r
\r
- void line(const std::string& name, float value, float r, float g, float b)\r
+ void add_guide(const std::string& name, float value, color c)\r
{\r
context::begin_invoke([=]\r
{\r
- guides_[name] = diagnostics::guide(value, r, g, b);\r
+ guides_[name] = diagnostics::guide(value, c);\r
});\r
}\r
\r
private:\r
- void draw(double dy, double y)\r
+ void draw()\r
{\r
glBegin(GL_QUADS);\r
glColor4f(1.0f, 1.0f, 1.0f, 0.2f); \r
- glVertex2f(0.0f*2.0f-1.0f, (y + dy*0.99 )*2.0f-1.0f);\r
- glVertex2f(1.0f*2.0f-1.0f, (y + dy*0.99 )*2.0f-1.0f);\r
- glVertex2f(1.0f*2.0f-1.0f, (y + dy*0.01)*2.0f-1.0f); \r
- glVertex2f(0.0f*2.0f-1.0f, (y + dy*0.01)*2.0f-1.0f); \r
+ glVertex2f(1.0f, 0.99f);\r
+ glVertex2f(0.0f, 0.99f);\r
+ glVertex2f(0.0f, 0.01f); \r
+ glVertex2f(1.0f, 0.01f); \r
glEnd();\r
\r
for(auto it = guides_.begin(); it != guides_.end(); ++it)\r
- it->second.draw(dy, y);\r
+ it->second.draw();\r
\r
for(auto it = lines_.begin(); it != lines_.end(); ++it)\r
- it->second.draw(dy, y);\r
+ it->second.draw();\r
}\r
\r
implementation(implementation&);\r
context::register_drawable(impl_);\r
}\r
void graph::update(const std::string& name, float value){impl_->update(name, value);}\r
-void graph::color(const std::string& name, float r, float g, float b){impl_->color(name, r, g, b);}\r
-void graph::line(const std::string& name, float value, float r, float g, float b){impl_->line(name, value, r, g, b);}\r
+void graph::set_color(const std::string& name, color c){impl_->set_color(name, c);}\r
+void graph::add_guide(const std::string& name, float value, color c){impl_->add_guide(name, value, c);}\r
\r
safe_ptr<graph> create_graph(const std::string& name)\r
{\r