diff options
author | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
---|---|---|
committer | Norbert Preining <norbert@preining.info> | 2019-09-02 13:46:59 +0900 |
commit | e0c6872cf40896c7be36b11dcc744620f10adf1d (patch) | |
tree | 60335e10d2f4354b0674ec22d7b53f0f8abee672 /graphics/asymptote/beziercurve.h |
Initial commit
Diffstat (limited to 'graphics/asymptote/beziercurve.h')
-rw-r--r-- | graphics/asymptote/beziercurve.h | 137 |
1 files changed, 137 insertions, 0 deletions
diff --git a/graphics/asymptote/beziercurve.h b/graphics/asymptote/beziercurve.h new file mode 100644 index 0000000000..573b48a792 --- /dev/null +++ b/graphics/asymptote/beziercurve.h @@ -0,0 +1,137 @@ +/***** + * beziercurve.h + * Author: John C. Bowman + * + * Render a Bezier curve. + *****/ + +#ifndef BEZIERCURVE_H +#define BEZIERCURVE_H + +#include "drawelement.h" + +namespace camp { + +#ifdef HAVE_GL + +extern const double Fuzz; +extern const double Fuzz2; + +class vertexData1 { +public: + GLfloat position[3]; + GLint material; + vertexData1() {}; + vertexData1(const triple& v) { + position[0]=v.getx(); + position[1]=v.gety(); + position[2]=v.getz(); + material=drawElement::materialIndex; + } +}; + +class pixelData { +public: + GLfloat position[3]; + GLint material; + GLfloat width; + pixelData() {}; + pixelData(const triple& v, double width) : width(width) { + position[0]=v.getx(); + position[1]=v.gety(); + position[2]=v.getz(); + material=drawElement::materialIndex; + } +}; + +struct BezierCurve +{ + static std::vector<vertexData1> vertexbuffer; + static std::vector<GLuint> indices; + double res,res2; + triple Min,Max; + + static GLuint vertsBufferIndex; + static GLuint elemBufferIndex; + + void init(double res, const triple& Min, const triple& Max); + +// Store the vertex v in the buffer. + static GLuint vertex(const triple &v) { + size_t nvertices=vertexbuffer.size(); + vertexbuffer.push_back(vertexData1(v)); + return nvertices; + } + + void createBuffers() { + glGenBuffers(1,&vertsBufferIndex); + glGenBuffers(1,&elemBufferIndex); + + //vbo + registerBuffer(vertexbuffer,vertsBufferIndex); + + //ebo + registerBuffer(indices,elemBufferIndex); + } + +// Approximate bounds by bounding box of control polyhedron. + bool offscreen(size_t n, const triple *v) { + double x,y,z; + double X,Y,Z; + + boundstriples(x,y,z,X,Y,Z,n,v); + return + X < Min.getx() || x > Max.getx() || + Y < Min.gety() || y > Max.gety() || + Z < Min.getz() || z > Max.getz(); + } + + static void clear() { + vertexbuffer.clear(); + indices.clear(); + } + + ~BezierCurve() {} + + void render(const triple *p, GLuint I0, GLuint I1); + void render(const triple *p, bool straight); + + void queue(const triple *g, bool straight, double ratio, + const triple& Min, const triple& Max) { + init(pixel*ratio,Min,Max); + render(g,straight); + } + + void draw(); + void draw(const triple *g, bool straight, double ratio, + const triple& Min, const triple& Max) { + queue(g,straight,ratio,Min,Max); + draw(); + } +}; + +struct Pixel +{ + static std::vector<pixelData> vertexbuffer; + +// Store the vertex v in the buffer. + static void vertex(const triple &v, double width) { + vertexbuffer.push_back(pixelData(v,width)); + } + + static void clear() { + vertexbuffer.clear(); + } + + Pixel() {} + ~Pixel() {} + + void queue(const triple& p, double width); + void draw(); +}; + +#endif + +} //namespace camp + +#endif |