neoGFX
C++ GPU-oriented GUI library and app/game creation framework.
i_physical_object.hpp
Go to the documentation of this file.
1 // i_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 <chrono>
23 #include <boost/optional.hpp>
25 #include <neogfx/game/chrono.hpp>
26 #include "i_collidable_object.hpp"
27 
28 namespace neogfx
29 {
30  class i_physical_object : public virtual i_collidable_object
31  {
32  // types
33  public:
35  typedef boost::optional<time_interval> optional_time_interval;
36  typedef int64_t step_time_interval;
37  typedef boost::optional<step_time_interval> optional_step_time_interval;
38  // lifetime
39  public:
40  virtual ~i_physical_object() {}
41  // physics
42  public:
43  virtual vec3 origin() const = 0;
44  virtual vec3 position() const = 0;
45  virtual vec3 angle_radians() const = 0;
46  virtual vec3 angle_degrees() const = 0;
47  virtual vec3 velocity() const = 0;
48  virtual vec3 acceleration() const = 0;
49  virtual vec3 spin_radians() const = 0;
50  virtual vec3 spin_degrees() const = 0;
51  virtual scalar mass() const = 0;
52  virtual void set_origin(const vec3& aOrigin) = 0;
53  virtual void set_position(const vec3& aPosition) = 0;
54  virtual void set_angle_radians(const vec3& aAngle) = 0;
55  virtual void set_angle_degrees(const vec3& aAngle) = 0;
56  virtual void set_velocity(const vec3& aVelocity) = 0;
57  virtual void set_acceleration(const vec3& aAcceleration) = 0;
58  virtual void set_spin_radians(const vec3& aSpin) = 0;
59  virtual void set_spin_degrees(const vec3& aSpin) = 0;
60  virtual void set_mass(scalar aMass) = 0;
61  // object
62  public:
63  virtual void clear_vertices_cache() = 0;
64  virtual bool update(const optional_time_interval& aNow, const vec3& aForce) = 0;
65  virtual const optional_time_interval& update_time() const = 0;
66  virtual void set_update_time(const optional_time_interval& aLastUpdateTime) = 0;
67  // helpers
68  public:
70  {
71  set_angle_radians(vec3{ 0.0, 0.0, aAngle });
72  }
74  {
75  set_angle_degrees(vec3{ 0.0, 0.0, aAngle });
76  }
78  {
79  set_spin_radians(vec3{ 0.0, 0.0, aSpin });
80  }
82  {
83  set_spin_degrees(vec3{ 0.0, 0.0, aSpin });
84  }
85  };
86 
87  inline rect to_rect(const aabb& aAabb)
88  {
89  return rect{ point{aAabb.min.x, aAabb.min.y}, point{ aAabb.max.x, aAabb.max.y } };
90  }
91 
93  {
94  auto fs = chrono::to_flicks(aTime).count();
95  return fs - (fs % aStepInterval);
96  }
97 
99  {
100  if (aTime)
101  return to_step_time(*aTime, aStepInterval);
102  else
103  return 0;
104  }
105 
107  {
108  return chrono::to_seconds(chrono::flicks{ aStepTime });
109  }
110 }
boost::optional< time_interval > optional_time_interval
virtual vec3 angle_degrees() const =0
rect to_rect(const aabb &aAabb)
boost::optional< step_time_interval > optional_step_time_interval
virtual vec3 velocity() const =0
double scalar
Definition: numerical.hpp:34
virtual vec3 origin() const =0
virtual vec3 spin_degrees() const =0
i_physical_object::time_interval from_step_time(i_physical_object::step_time_interval aStepTime)
void set_angle_radians(scalar aAngle)
constexpr flicks to_flicks(const double s)
Definition: flicks.h:83
virtual vec3 acceleration() const =0
virtual void set_acceleration(const vec3 &aAcceleration)=0
virtual const optional_time_interval & update_time() const =0
virtual void set_angle_radians(const vec3 &aAngle)=0
virtual vec3 spin_radians() const =0
virtual void set_update_time(const optional_time_interval &aLastUpdateTime)=0
constexpr double to_seconds(const flicks ns)
Definition: flicks.h:77
void set_spin_radians(scalar aSpin)
virtual void set_origin(const vec3 &aOrigin)=0
i_physical_object::step_time_interval to_step_time(i_physical_object::time_interval aTime, i_physical_object::step_time_interval aStepInterval)
virtual void set_velocity(const vec3 &aVelocity)=0
virtual void clear_vertices_cache()=0
virtual vec3 position() const =0
void set_angle_degrees(scalar aAngle)
virtual void set_spin_radians(const vec3 &aSpin)=0
virtual void set_mass(scalar aMass)=0
std::chrono::duration< std::chrono::nanoseconds::rep, std::ratio< 1, 705600000 > > flicks
Definition: flicks.h:60
virtual void set_angle_degrees(const vec3 &aAngle)=0
virtual void set_spin_degrees(const vec3 &aSpin)=0
virtual vec3 angle_radians() const =0
virtual bool update(const optional_time_interval &aNow, const vec3 &aForce)=0
void set_spin_degrees(scalar aSpin)
virtual void set_position(const vec3 &aPosition)=0
virtual scalar mass() const =0