5 #include "../math/vector2d.h"
8 #include "../template_obj_tree.h"
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>
26 public template_obj_tree
<physics_obj
>,
27 public linked_list_t
<physics_obj
>
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; ///< Применение сил
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();
90 /// Возвращает 2 вектора из координат объекта, указывающие углы текущего габаритного ящика
91 virtual void getDimensionsBox(Vector2D
*const v1
, Vector2D
*const v2
) = 0;
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;