nuclear@0: #ifndef CURVE_H_ nuclear@0: #define CURVE_H_ nuclear@0: nuclear@0: #include nuclear@0: #include nuclear@0: #include "vmath/vmath.h" nuclear@0: #include "mesh.h" nuclear@0: nuclear@15: namespace goatgfx { nuclear@15: nuclear@0: class Curve { nuclear@0: private: nuclear@0: std::string name; nuclear@0: nuclear@0: std::vector cv; nuclear@0: float thickness; nuclear@0: nuclear@0: int segm_subdiv, ring_subdiv; nuclear@0: nuclear@0: /// normalized arc-lengths of each control vertex from the beginning nuclear@0: mutable std::vector length; nuclear@0: mutable bool lengths_valid; nuclear@0: nuclear@0: mutable Vector3 bbmin, bbmax; nuclear@0: mutable bool bbox_valid; nuclear@0: nuclear@0: mutable Mesh mesh; nuclear@0: mutable bool mesh_valid; nuclear@0: nuclear@0: float reparametrize(float t) const; nuclear@0: nuclear@0: void calc_cvlengths() const; nuclear@0: void update_mesh() const; nuclear@0: nuclear@0: public: nuclear@0: Curve(); nuclear@0: Curve(const Vector3 *points, int num_points); nuclear@0: Curve(const Vector2 *points, int num_points); nuclear@0: nuclear@0: void set_name(const char *name); nuclear@0: const char *get_name() const; nuclear@0: nuclear@0: bool empty() const; nuclear@0: nuclear@0: void set_thickness(float thickness); nuclear@0: void set_subdiv(int seg, int ring); nuclear@0: nuclear@0: void clear(); nuclear@0: void add_point(const Vector3 &pt); nuclear@0: Vector3 &get_point(int idx); nuclear@0: const Vector3 &get_point(int idx) const; nuclear@0: int get_count() const; nuclear@0: nuclear@0: Vector3 &operator[] (int idx); nuclear@0: const Vector3 &operator[] (int idx) const; nuclear@0: nuclear@0: void get_bbox(Vector3 *bbmin, Vector3 *bbmax) const; nuclear@0: void normalize(); nuclear@0: nuclear@0: Vector3 get_pos(float t) const; nuclear@0: Vector3 operator() (float t) const; nuclear@0: nuclear@0: void draw() const; nuclear@0: }; nuclear@0: nuclear@15: } // namespace goatgfx nuclear@15: nuclear@0: #endif // CURVE_H_