raylib-cpp-template/include/Physics.hpp
Jonathan Moallem 85f1dd7a1e Initial commit
2020-11-19 14:55:38 +11:00

153 lines
4.0 KiB
C++

/*
* LICENSE: zlib/libpng
*
* raylib-cpp is licensed under an unmodified zlib/libpng license, which is an OSI-certified,
* BSD-like license that allows static linking with closed source software:
*
* Copyright (c) 2020 Rob Loach (@RobLoach)
*
* This software is provided "as-is", without any express or implied warranty. In no event
* will the authors be held liable for any damages arising from the use of this software.
*
* Permission is granted to anyone to use this software for any purpose, including commercial
* applications, and to alter it and redistribute it freely, subject to the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not claim that you
* wrote the original software. If you use this software in a product, an acknowledgment
* in the product documentation would be appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not be misrepresented
* as being the original software.
*
* 3. This notice may not be removed or altered from any source distribution.
*/
#ifndef RAYLIB_CPP_INCLUDE_PHYSICS_HPP_
#define RAYLIB_CPP_INCLUDE_PHYSICS_HPP_
#include "./raylib.hpp"
#ifdef __cplusplus
extern "C" {
#endif
#include "physac.h" // NOLINT
#ifdef __cplusplus
}
#endif
#include "./Vector2.hpp"
namespace raylib {
class Physics {
public:
Physics() {
Init();
}
Physics(float gravityY) {
Init();
SetGravity(0, gravityY);
}
Physics(float gravityX, float gravityY) {
Init();
SetGravity(gravityX, gravityY);
}
~Physics() {
Close();
}
inline Physics& Init() {
::InitPhysics();
return *this;
}
inline Physics& Close() {
::ClosePhysics();
return *this;
}
inline Physics& RunStep() {
::RunPhysicsStep();
return *this;
}
inline Physics& SetTimeStep(double delta) {
::SetPhysicsTimeStep(delta);
return *this;
}
inline bool IsEnabled() {
return ::IsPhysicsEnabled();
}
inline Physics& SetGravity(float x, float y) {
::SetPhysicsGravity(x, y);
return *this;
}
inline PhysicsBody CreateBodyCircle(Vector2 pos, float radius, float density) {
return ::CreatePhysicsBodyCircle(pos, radius, density);
}
inline PhysicsBody CreateBodyRectangle(Vector2 pos, float width, float height, float density) {
return ::CreatePhysicsBodyRectangle(pos, width, height, density);
}
inline PhysicsBody CreateBodyPolygon(Vector2 pos, float radius, int sides, float density) {
return ::CreatePhysicsBodyPolygon(pos, radius, sides, density);
}
inline Physics& AddForce(PhysicsBody body, Vector2 force) {
::PhysicsAddForce(body, force);
return *this;
}
inline Physics& AddTorque(PhysicsBody body, float amount) {
::PhysicsAddTorque(body, amount);
return *this;
}
inline Physics& Shatter(PhysicsBody body, Vector2 position, float force) {
::PhysicsShatter(body, position, force);
return *this;
}
inline int GetBodiesCount() const {
return ::GetPhysicsBodiesCount();
}
inline PhysicsBody GetBody(int index) const {
return ::GetPhysicsBody(index);
}
inline int GetShapeType(int index) const {
return ::GetPhysicsShapeType(index);
}
inline int GetShapeVerticesCount(int index) const {
return ::GetPhysicsShapeVerticesCount(index);
}
inline Vector2 GetShapeVertex(PhysicsBody body, int vertex) const {
return ::GetPhysicsShapeVertex(body, vertex);
}
inline Physics& SetBodyRotation(PhysicsBody body, float radians) {
::SetPhysicsBodyRotation(body, radians);
return *this;
}
inline Physics& DestroyBody(PhysicsBody body) {
::DestroyPhysicsBody(body);
return *this;
}
inline Physics& Reset() {
::ResetPhysics();
return *this;
}
};
} // namespace raylib
#endif // RAYLIB_CPP_INCLUDE_PHYSICS_HPP_