Merge branch 'experiment' of git+ssh://repo.or.cz/srv/git/glgame
[glgame.git] / src / phys / physics_obj.h
blob5be1b3ce72886945c38c7579ebd09656a597fa32
1 #ifndef PHYSICS_OBJ_H
2 #define PHYSICS_OBJ_H
4 #include <list>
5 #include "../math/vector2d.h"
6 #include "../debug.h"
7 #include "../screen.h"
8 #include "../template_obj_tree.h"
11 /**
12 @brief Физический объект
14 Физика основана на передаче импульсов между телами (так называемый "импульсный движок"). При этом по порядку циклически вызываются следующие функции (каждая - для всех объектов):
16 virtual void physics_forces_reset() = 0; ///< Сброс сил
17 virtual void physics_forces_calculate() = 0; ///< Вычисление сил
18 virtual void physics_forces_apply() = 0; ///< Применение сил
21 @author Феклушкин Денис <edu2005-60@mail.ru>
25 class physics_obj :
26 public template_obj_tree<physics_obj>,
27 public linked_list_t<physics_obj>
30 public:
31 /// Верхний элемент дерева игрового мира. С него начинается рисование всего мира.
32 static physics_obj* first_object_in_world;
34 virtual void Init(); ///< Инициализация объекта после настройки всех параметров
36 virtual void physics_forces_reset() = 0; ///< Сброс сил
37 virtual void physics_forces_calculate() = 0; ///< Вычисление сил
38 virtual void physics_forces_apply() = 0; ///< Применение сил
40 physics_obj();
41 virtual ~physics_obj();
43 static void all_forces_calculate(); ///< Подсчёт сил все объектов данного мира
44 static void all_forces_reset(); ///< Сброс сил всех объектов данного мира
45 static void all_forces_apply(); ///< Применение сил всех объектов данного мира
47 /// "Сопротивление воздуха" (сопротивление прямолинейному движению)
48 /// Применяется в основном не для реализма а для нейтрализации погрешностей вычислений
49 static double air_resistance;
51 /// Сопротивление вращению (не путать с моментом инерции!)
52 /// Применяется в основном не для реализма а для нейтрализации погрешностей вычислений
53 static double moment_resistance;
55 static double dt; ///< Приращение времени за одну итерацию движка
56 static Vector2D g; ///< Сила гравитации
58 static void display_all(); ///< Показать все объекты данного мира
60 bool visible; ///< Отображать или нет объект на экране?
62 /// Найти направление к данному объекту от указанного объекта (FIXME:ненужная функция?)
63 Vector2D getCoordsFrom ( physics_obj* ptr );
65 /// Найти направление от данного объекта к указанному объекту (FIXME:ненужная функция?)
66 Vector2D getCoordsTo ( physics_obj* ptr );
68 /// Найти направление от родительского объекта на данный объект (FIXME:ненужная функция?)
69 inline Vector2D getCoordsFromParent() { return getCoordsFrom ( getParent() ); }
71 /// Найти координаты объекта (не путать с центром тяжести!)
72 inline Vector2D getCoord() const { return coord; }
74 /// Установить координаты объекта
75 inline void setCoords (const Vector2D coords) { coord = coords; }
77 /// Установить координаты объекта
78 inline void setCoords (const Vector2D* coords) { coord = *coords; }
80 /// Изменить координаты объекта сдвинув его
81 inline void Move( const Vector2D incr ) { coord += incr; }
83 /// Заполнить 2 вектора габаритов объекта с детьми
84 void getDimensionsBoxWithChilds(Vector2D* l_d, Vector2D* r_u);
86 /// Отобразить объект с детьми в OpenGL
87 virtual void DisplayWithChilds();
89 protected:
90 /// Возвращает 2 вектора из координат объекта, указывающие углы текущего габаритного ящика
91 virtual void getDimensionsBox(Vector2D *const v1, Vector2D *const v2) = 0;
93 private:
94 Vector2D coord; ///< Координаты объекта
96 /// Возвращает 2 вектора из координат объекта, указывающие углы текущего габаритного ящика
97 /// Удобна для внутреннего применения (рекурсия из getDimensionsBoxWithChilds())
98 void getDimensionsBoxWithChilds2(Vector2D shift, Vector2D* l_d, Vector2D* r_u);
100 /// Отобразить объект (без детей) в OpenGL
101 virtual void display() = 0;
105 #endif