1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
|
//
// "$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
//
/**
\file Fl_OpenGL_Graphics_Driver_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::vertex(double x,double y) {
transformed_vertex(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();
}
//
// End of "$Id$".
//
|