nuclear@6: #ifndef DRAGON_H_ nuclear@6: #define DRAGON_H_ nuclear@6: nuclear@6: #include "vmath/vmath.h" nuclear@7: #include "mesh.h" nuclear@7: #include "metasurf.h" nuclear@7: nuclear@7: struct Capsule { nuclear@7: Vector3 p[2]; nuclear@7: float w[2]; nuclear@7: }; nuclear@7: nuclear@7: struct DynVertex { nuclear@7: float x, y, z; nuclear@7: float nx, ny, nz; nuclear@7: }; nuclear@6: nuclear@6: class Dragon { nuclear@6: private: nuclear@6: Vector3 pos, dir; nuclear@6: Vector3 head_pos, target; nuclear@6: float head_xlim[2], head_ylim[2]; nuclear@6: nuclear@7: struct metasurface *msurf; nuclear@7: nuclear@6: public: nuclear@6: Dragon(); nuclear@6: ~Dragon(); nuclear@6: nuclear@6: void set_position(const Vector3 &p); nuclear@6: void set_direction(const Vector3 &dir); nuclear@6: void set_target(const Vector3 &p); nuclear@6: nuclear@6: void set_head_limits(float xmin, float xmax, float ymin, float ymax); nuclear@6: void move_head(const Vector3 &p); nuclear@6: void move_head(float dx, float dy); nuclear@6: const Vector3 &head_position() const; nuclear@6: Vector3 breath_dir() const; nuclear@6: nuclear@6: void update(); nuclear@6: void draw() const; nuclear@7: nuclear@7: // implementation details, must be public for the msurf callbacks nuclear@7: Capsule *neck_seg; nuclear@7: int neck_seg_count; nuclear@7: DynVertex *dyn_varr; nuclear@7: mutable int dyn_vidx; nuclear@7: unsigned int dyn_vbo; nuclear@7: nuclear@7: void flush_dynvbo() const; nuclear@6: }; nuclear@6: nuclear@6: #endif // DRAGON_H_