rev |
line source |
nuclear@6
|
1 #include <algorithm>
|
nuclear@6
|
2 #include "opengl.h"
|
nuclear@6
|
3 #include "dragon.h"
|
nuclear@6
|
4
|
nuclear@6
|
5 Dragon::Dragon()
|
nuclear@6
|
6 : pos(0, 0, 0), dir(0, 0, -1), head_pos(0, 0, -1), target(0, 0, -2)
|
nuclear@6
|
7 {
|
nuclear@6
|
8 set_head_limits(-1, 1, -1, 1);
|
nuclear@6
|
9 }
|
nuclear@6
|
10
|
nuclear@6
|
11 Dragon::~Dragon()
|
nuclear@6
|
12 {
|
nuclear@6
|
13 }
|
nuclear@6
|
14
|
nuclear@6
|
15 void Dragon::set_position(const Vector3 &p)
|
nuclear@6
|
16 {
|
nuclear@6
|
17 pos = p;
|
nuclear@6
|
18 }
|
nuclear@6
|
19
|
nuclear@6
|
20 void Dragon::set_direction(const Vector3 &dir)
|
nuclear@6
|
21 {
|
nuclear@6
|
22 this->dir = dir.normalized();
|
nuclear@6
|
23 }
|
nuclear@6
|
24
|
nuclear@6
|
25 void Dragon::set_target(const Vector3 &p)
|
nuclear@6
|
26 {
|
nuclear@6
|
27 target = p;
|
nuclear@6
|
28 }
|
nuclear@6
|
29
|
nuclear@6
|
30 void Dragon::set_head_limits(float xmin, float xmax, float ymin, float ymax)
|
nuclear@6
|
31 {
|
nuclear@6
|
32 head_xlim[0] = std::min(xmin, xmax);
|
nuclear@6
|
33 head_xlim[1] = std::max(xmin, xmax);
|
nuclear@6
|
34 head_ylim[0] = std::min(ymin, ymax);
|
nuclear@6
|
35 head_ylim[1] = std::max(ymin, ymax);
|
nuclear@6
|
36 }
|
nuclear@6
|
37
|
nuclear@6
|
38 void Dragon::move_head(const Vector3 &p)
|
nuclear@6
|
39 {
|
nuclear@6
|
40 head_pos = p;
|
nuclear@6
|
41 }
|
nuclear@6
|
42
|
nuclear@6
|
43 static float clamp(float x, float low, float high)
|
nuclear@6
|
44 {
|
nuclear@6
|
45 return x < low ? low : (x > high ? high : x);
|
nuclear@6
|
46 }
|
nuclear@6
|
47
|
nuclear@6
|
48 void Dragon::move_head(float dx, float dy)
|
nuclear@6
|
49 {
|
nuclear@6
|
50 float newx = clamp(head_pos.x + dx, head_xlim[0], head_xlim[1]);
|
nuclear@6
|
51 float newy = clamp(head_pos.y + dy, head_ylim[0], head_ylim[1]);
|
nuclear@6
|
52
|
nuclear@6
|
53 dx = newx - head_pos.x;
|
nuclear@6
|
54 dy = newy - head_pos.y;
|
nuclear@6
|
55 head_pos.x = newx;
|
nuclear@6
|
56 head_pos.y = newy;
|
nuclear@6
|
57
|
nuclear@6
|
58 target.x += dx * 0.7;
|
nuclear@6
|
59 target.y += dy * 0.5;
|
nuclear@6
|
60 }
|
nuclear@6
|
61
|
nuclear@6
|
62 const Vector3 &Dragon::head_position() const
|
nuclear@6
|
63 {
|
nuclear@6
|
64 return head_pos;
|
nuclear@6
|
65 }
|
nuclear@6
|
66
|
nuclear@6
|
67 Vector3 Dragon::breath_dir() const
|
nuclear@6
|
68 {
|
nuclear@6
|
69 return (target - head_pos).normalized();
|
nuclear@6
|
70 }
|
nuclear@6
|
71
|
nuclear@6
|
72 void Dragon::update()
|
nuclear@6
|
73 {
|
nuclear@6
|
74 }
|
nuclear@6
|
75
|
nuclear@6
|
76 static Vector3 bezier(const Vector3 &a, const Vector3 &b, const Vector3 &c, const Vector3 &d, float t)
|
nuclear@6
|
77 {
|
nuclear@6
|
78 float x = bezier(a.x, b.x, c.x, d.x, t);
|
nuclear@6
|
79 float y = bezier(a.y, b.y, c.y, d.y, t);
|
nuclear@6
|
80 float z = bezier(a.z, b.z, c.z, d.z, t);
|
nuclear@6
|
81 return Vector3(x, y, z);
|
nuclear@6
|
82 }
|
nuclear@6
|
83
|
nuclear@6
|
84 void Dragon::draw() const
|
nuclear@6
|
85 {
|
nuclear@6
|
86 Vector3 bdir = breath_dir();
|
nuclear@6
|
87 Vector3 bezcp[] = { pos, pos + dir * 6.0, head_pos - bdir * 8.0, head_pos };
|
nuclear@6
|
88
|
nuclear@6
|
89 int cur_sdr;
|
nuclear@6
|
90 glGetIntegerv(GL_CURRENT_PROGRAM, &cur_sdr);
|
nuclear@6
|
91 glUseProgram(0);
|
nuclear@6
|
92
|
nuclear@6
|
93 glPushAttrib(GL_ENABLE_BIT);
|
nuclear@6
|
94 glDisable(GL_LIGHTING);
|
nuclear@6
|
95
|
nuclear@6
|
96 glLineWidth(2.0);
|
nuclear@6
|
97 glColor3f(0, 0, 1);
|
nuclear@6
|
98
|
nuclear@6
|
99 glBegin(GL_LINE_STRIP);
|
nuclear@6
|
100 for(int i=0; i<10; i++) {
|
nuclear@6
|
101 float t = (float)i / 10.0f;
|
nuclear@6
|
102 Vector3 p = bezier(bezcp[0], bezcp[1], bezcp[2], bezcp[3], t);
|
nuclear@6
|
103 glVertex3f(p.x, p.y, p.z);
|
nuclear@6
|
104 }
|
nuclear@6
|
105 glEnd();
|
nuclear@6
|
106 glLineWidth(1);
|
nuclear@6
|
107
|
nuclear@6
|
108 glPointSize(5.0);
|
nuclear@6
|
109 glColor3f(0, 1, 0);
|
nuclear@6
|
110
|
nuclear@6
|
111 glBegin(GL_POINTS);
|
nuclear@6
|
112 for(int i=0; i<4; i++) {
|
nuclear@6
|
113 glVertex3f(bezcp[i].x, bezcp[i].y, bezcp[i].z);
|
nuclear@6
|
114 }
|
nuclear@6
|
115 glEnd();
|
nuclear@6
|
116
|
nuclear@6
|
117 glPopAttrib();
|
nuclear@6
|
118
|
nuclear@6
|
119 glUseProgram(cur_sdr);
|
nuclear@6
|
120 }
|