ld33_umonster

annotate src/dragon.cc @ 6:3b4460b34d43

progress
author John Tsiombikas <nuclear@member.fsf.org>
date Sun, 23 Aug 2015 05:37:09 +0300
parents
children 92d662deb66e
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 }