diff options
| author | Matthias Melcher <fltk@matthiasm.com> | 2016-01-26 20:48:21 +0000 |
|---|---|---|
| committer | Matthias Melcher <fltk@matthiasm.com> | 2016-01-26 20:48:21 +0000 |
| commit | 2b3567c83ca18b5dad62be7f10cc71446c028164 (patch) | |
| tree | fa3e3151c1bf84673d8a3632025895efa01b2da4 /src/drivers/OpenGL/Fl_OpenGL_Graphics_Driver_vertex.cxx | |
| parent | 222538baad665f226546c2cfae417df3f6835a44 (diff) | |
OpenGL new naming scheme.
git-svn-id: file:///fltk/svn/fltk/branches/branch-1.3-porting@11055 ea41ed52-d2ee-0310-a9c1-e6b18d33e121
Diffstat (limited to 'src/drivers/OpenGL/Fl_OpenGL_Graphics_Driver_vertex.cxx')
| -rw-r--r-- | src/drivers/OpenGL/Fl_OpenGL_Graphics_Driver_vertex.cxx | 142 |
1 files changed, 142 insertions, 0 deletions
diff --git a/src/drivers/OpenGL/Fl_OpenGL_Graphics_Driver_vertex.cxx b/src/drivers/OpenGL/Fl_OpenGL_Graphics_Driver_vertex.cxx new file mode 100644 index 000000000..1dd091f0d --- /dev/null +++ b/src/drivers/OpenGL/Fl_OpenGL_Graphics_Driver_vertex.cxx @@ -0,0 +1,142 @@ +// +// "$Id$" +// +// Portable drawing routines for the Fast Light Tool Kit (FLTK). +// +// Copyright 1998-2016 by Bill Spitzak and others. +// +// This library is free software. Distribution and use rights are outlined in +// the file "COPYING" which should have been included with this file. If this +// file is missing or damaged, see the license at: +// +// http://www.fltk.org/COPYING.php +// +// Please report all bugs and problems on the following page: +// +// http://www.fltk.org/str.php +// + +#ifndef FL_CFG_GFX_OPENGL_VERTEX_CXX +#define FL_CFG_GFX_OPENGL_VERTEX_CXX + +/** + \file opengl_vertex.cxx + \brief Portable drawing code for drawing arbitrary shapes with + simple 2D transformations, implemented for OpenGL. +*/ + +#include "Fl_OpenGL_Graphics_Driver.h" + +#include <FL/fl_draw.H> +#include <FL/gl.h> +#include <FL/math.h> + + +// Event though there are faster versions of the functions in OpenGL, +// we use the default FLTK implementation for compatibility in the +// following functions. + +// void Fl_OpenGL_Graphics_Driver::push_matrix() +// void Fl_OpenGL_Graphics_Driver::pop_matrix() +// void Fl_OpenGL_Graphics_Driver::mult_matrix(double a, double b, double c, double d, double x, double y) +// void Fl_OpenGL_Graphics_Driver::rotate(double d) +// double Fl_OpenGL_Graphics_Driver::transform_x(double x, double y) +// double Fl_OpenGL_Graphics_Driver::transform_y(double x, double y) +// double Fl_OpenGL_Graphics_Driver::transform_dx(double x, double y) +// double Fl_OpenGL_Graphics_Driver::transform_dy(double x, double y) + +void Fl_OpenGL_Graphics_Driver::begin_points() { + glBegin(GL_POINTS); +} + +void Fl_OpenGL_Graphics_Driver::end_points() { + glEnd(); +} + +void Fl_OpenGL_Graphics_Driver::begin_line() { + glBegin(GL_LINE_STRIP); +} + +void Fl_OpenGL_Graphics_Driver::end_line() { + glEnd(); +} + +void Fl_OpenGL_Graphics_Driver::begin_loop() { + glBegin(GL_LINE_LOOP); +} + +void Fl_OpenGL_Graphics_Driver::end_loop() { + glEnd(); +} + +void Fl_OpenGL_Graphics_Driver::begin_polygon() { + glBegin(GL_POLYGON); +} + +void Fl_OpenGL_Graphics_Driver::end_polygon() { + glEnd(); +} + +void Fl_OpenGL_Graphics_Driver::begin_complex_polygon() { + glBegin(GL_POLYGON); +} + +void Fl_OpenGL_Graphics_Driver::gap() { + glEnd(); + glBegin(GL_POLYGON); +} + +// FXIME: non-convex polygons are not supported yet +// use gluTess* functions to do this; search for gluBeginPolygon +void Fl_OpenGL_Graphics_Driver::end_complex_polygon() { + glEnd(); +} + +// remove equal points from closed path +void Fl_OpenGL_Graphics_Driver::fixloop() { } + +void Fl_OpenGL_Graphics_Driver::transformed_vertex(double xf, double yf) { + glVertex2d(xf, yf); +} + +void Fl_OpenGL_Graphics_Driver::transformed_vertex0(COORD_T x, COORD_T y) { + glVertex2d(x, y); +} + +void Fl_OpenGL_Graphics_Driver::vertex(double x,double y) { + transformed_vertex0(x*m.a + y*m.c + m.x, x*m.b + y*m.d + m.y); +} + +void Fl_OpenGL_Graphics_Driver::circle(double cx, double cy, double r) { + double rx = r * (m.c ? sqrt(m.a*m.a+m.c*m.c) : fabs(m.a)); + double ry = r * (m.b ? sqrt(m.b*m.b+m.d*m.d) : fabs(m.d)); + double rMax; + if (ry>rx) rMax = ry; else rMax = rx; + + // from http://slabode.exofire.net/circle_draw.shtml and many other places + int num_segments = (int)(10 * sqrt(rMax))+1; + double theta = 2 * M_PI / float(num_segments); + double tangetial_factor = tan(theta); + double radial_factor = cosf(theta);//calculate the radial factor + double x = r; //we start at angle = 0 + double y = 0; + + glBegin(GL_LINE_LOOP); + for(int ii = 0; ii < num_segments; ii++) { + vertex(x + cx, y + cy); // output vertex + double tx = -y; + double ty = x; + x += tx * tangetial_factor; + y += ty * tangetial_factor; + x *= radial_factor; + y *= radial_factor; + } + glEnd(); + +} + +#endif // FL_CFG_GFX_OPENGL_VERTEX_CXX + +// +// End of "$Id$". +// |
