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
|
/*****
* glrender.h
* Render 3D Bezier paths and surfaces.
*****/
#ifndef GLRENDER_H
#define GLRENDER_H
#include "common.h"
#include "triple.h"
#ifdef HAVE_GL
#include <csignal>
#ifdef __APPLE__
#include <OpenGL/gl.h>
#include <OpenGL/glext.h>
#include <OpenGL/glu.h>
#include <GLUT/glut.h>
#ifdef GLU_TESS_CALLBACK_TRIPLEDOT
typedef GLvoid (* _GLUfuncptr)(...);
#else
typedef GLvoid (* _GLUfuncptr)();
#endif
#else
#include <GL/gl.h>
#include <GL/glext.h>
#include <GL/glu.h>
#include <GL/glut.h>
#endif
namespace camp {
class picture;
inline void store(GLfloat *f, double *C)
{
f[0]=C[0];
f[1]=C[1];
f[2]=C[2];
}
inline void store(GLfloat *control, const camp::triple& v)
{
control[0]=v.getx();
control[1]=v.gety();
control[2]=v.getz();
}
inline void store(GLfloat *control, const triple& v, double weight)
{
control[0]=v.getx()*weight;
control[1]=v.gety()*weight;
control[2]=v.getz()*weight;
control[3]=weight;
}
}
namespace gl {
struct projection
{
public:
bool orthographic;
camp::triple camera;
camp::triple up;
camp::triple target;
double zoom;
double angle;
camp::pair viewportshift;
projection(bool orthographic=false, camp::triple camera=0.0,
camp::triple up=0.0, camp::triple target=0.0,
double zoom=0.0, double angle=0.0,
camp::pair viewportshift=0.0) :
orthographic(orthographic), camera(camera), up(up), target(target),
zoom(zoom), angle(angle), viewportshift(viewportshift) {}
};
projection camera(bool user=true);
void glrender(const string& prefix, const camp::picture* pic,
const string& format, double width, double height, double angle,
double zoom, const camp::triple& m, const camp::triple& M,
const camp::pair& shift, double *t, double *background,
size_t nlights, camp::triple *lights, double *diffuse,
double *ambient, double *specular, bool viewportlighting,
bool view, int oldpid=0);
}
namespace camp {
struct billboard
{
triple u,v,w;
void init() {
gl::projection P=gl::camera(false);
w=unit(P.camera-P.target);
v=unit(perp(P.up,w));
u=cross(v,w);
}
void store(GLfloat* C, const triple& V, const triple ¢er) {
double cx=center.getx();
double cy=center.gety();
double cz=center.getz();
double x=V.getx()-cx;
double y=V.gety()-cy;
double z=V.getz()-cz;
C[0]=cx+u.getx()*x+v.getx()*y+w.getx()*z;
C[1]=cy+u.gety()*x+v.gety()*y+w.gety()*z;
C[2]=cz+u.getz()*x+v.getz()*y+w.getz()*z;
}
};
extern billboard BB;
}
#else
typedef void GLUnurbs;
typedef float GLfloat;
#endif
#endif
|