neoGFX
C++ GPU-oriented GUI library and app/game creation framework.
physical_object.hpp
Go to the documentation of this file.
1 // physical_object.hpp
2 /*
3  neogfx C++ GUI Library
4  Copyright (c) 2015 Leigh Johnston. All Rights Reserved.
5 
6  This program is free software: you can redistribute it and / or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation, either version 3 of the License, or
9  (at your option) any later version.
10 
11  This program is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with this program. If not, see <http://www.gnu.org/licenses/>.
18 */
19 #pragma once
20 
21 #include <neogfx/neogfx.hpp>
22 #include "i_physical_object.hpp"
23 
24 namespace neogfx
25 {
26  class physical_object : public virtual i_physical_object
27  {
28  private:
29  struct physics
30  {
31  vec3 iPosition;
32  vec3 iAngle;
33  vec3 iVelocity;
34  vec3 iAcceleration;
35  vec3 iSpin;
36  scalar iMass;
37  };
38  typedef boost::optional<physics> optional_physics;
39  public:
41  physical_object(const physical_object& aOther);
42  public:
43  object_category category() const override;
44  const i_shape& as_shape() const override;
45  i_shape& as_shape() override;
46  const i_collidable_object& as_collidable_object() const override;
48  const i_physical_object& as_physical_object() const override;
50  bool killed() const override;
51  void kill() override;
52  public:
53  vec3 origin() const override;
54  vec3 position() const override;
55  vec3 angle_radians() const override;
56  vec3 angle_degrees() const override;
57  vec3 velocity() const override;
58  vec3 acceleration() const override;
59  vec3 spin_radians() const override;
60  vec3 spin_degrees() const override;
61  scalar mass() const override;
62  void set_origin(const vec3& aOrigin) override;
63  void set_position(const vec3& aPosition) override;
64  void set_angle_radians(const vec3& aAngle) override;
65  void set_angle_degrees(const vec3& aAngle) override;
66  void set_velocity(const vec3& aVelocity) override;
67  void set_acceleration(const vec3& aAcceleration) override;
68  void set_spin_radians(const vec3& aSpin) override;
70  void set_spin_degrees(const vec3& aSpin) override;
72  void set_mass(scalar aMass) override;
73  public:
74  void clear_vertices_cache() override;
75  public:
76  const neogfx::aabb& aabb() const override;
77  const neogfx::aabb& saved_aabb() const override;
78  void save_aabb() override;
79  void clear_saved_aabb() override;
80  bool collidable() const override;
81  bool has_collided(const i_collidable_object& aOther) const override;
82  void collided(i_collidable_object& aOther) override;
83  public:
84  uint32_t collision_update_id() const override;
85  void set_collision_update_id(uint32_t aCollisionUpdateId) override;
86  public:
87  void clear_aabb_cache() override;
88  public:
89  bool update(const optional_time_interval& aNow, const vec3& aForce) override;
90  const optional_time_interval& update_time() const override;
91  void set_update_time(const optional_time_interval& aLastUpdateTime) override;
92  private:
93  const physics& current_physics() const;
94  physics& current_physics();
95  const physics& next_physics() const;
96  physics& next_physics();
97  bool apply_physics(double aElapsedTime, const vec3& aForce);
98  private:
99  vec3 iOrigin;
100  optional_time_interval iTimeOfLastUpdate;
101  mutable optional_physics iCurrentPhysics;
102  mutable optional_physics iNextPhysics;
103  mutable optional_aabb iAabb;
104  mutable optional_aabb iSavedAabb;
105  bool iKilled;
106  uint32_t iCollisionUpdateId;
107  };
108 }
boost::optional< time_interval > optional_time_interval
scalar mass() const override
bool killed() const override
bool collidable() const override
void set_spin_radians(const vec3 &aSpin) override
void clear_aabb_cache() override
void set_angle_degrees(const vec3 &aAngle) override
void set_spin_degrees(const vec3 &aSpin) override
double scalar
Definition: numerical.hpp:34
boost::optional< aabb > optional_aabb
Definition: numerical.hpp:830
const i_shape & as_shape() const override
const optional_time_interval & update_time() const override
void set_acceleration(const vec3 &aAcceleration) override
vec3 angle_degrees() const override
const i_physical_object & as_physical_object() const override
void set_mass(scalar aMass) override
const neogfx::aabb & saved_aabb() const override
vec3 spin_radians() const override
const i_collidable_object & as_collidable_object() const override
void set_collision_update_id(uint32_t aCollisionUpdateId) override
vec3 position() const override
bool update(const optional_time_interval &aNow, const vec3 &aForce) override
vec3 origin() const override
object_category category() const override
vec3 acceleration() const override
void collided(i_collidable_object &aOther) override
void set_origin(const vec3 &aOrigin) override
void kill() override
void set_velocity(const vec3 &aVelocity) override
const neogfx::aabb & aabb() const override
vec3 velocity() const override
void clear_vertices_cache() override
void save_aabb() override
virtual void set_spin_radians(const vec3 &aSpin)=0
uint32_t collision_update_id() const override
virtual void set_spin_degrees(const vec3 &aSpin)=0
void set_position(const vec3 &aPosition) override
void clear_saved_aabb() override
vec3 spin_degrees() const override
bool has_collided(const i_collidable_object &aOther) const override
void set_angle_radians(const vec3 &aAngle) override
vec3 angle_radians() const override
void set_update_time(const optional_time_interval &aLastUpdateTime) override