Box2D 3.2.0
A 2D physics engine for games
Loading...
Searching...
No Matches
base.h
1// SPDX-FileCopyrightText: 2023 Erin Catto
2// SPDX-License-Identifier: MIT
3
4#pragma once
5
6#include <stdbool.h>
7#include <stddef.h>
8#include <stdint.h>
9
10// Compile-time options. Edit box2d/config.h, or define BOX2D_USER_CONFIG to
11// point at your own copy.
12#ifdef BOX2D_USER_CONFIG
13#include BOX2D_USER_CONFIG
14#endif
15#include "config.h"
16
19#define B2_NULL_INDEX ( -1 )
20
21// clang-format off
22//
23// Shared library macros
24// Predefine BOX2D_EXPORT to reuse an existing export/import scheme, for example
25// when compiling Box2D into another shared library.
26#ifndef BOX2D_EXPORT
27#if defined( _WIN32 ) && defined( box2d_EXPORTS )
28 // build the Windows DLL
29 #define BOX2D_EXPORT __declspec( dllexport )
30#elif defined( _WIN32 ) && defined( BOX2D_DLL )
31 // using the Windows DLL
32 #define BOX2D_EXPORT __declspec( dllimport )
33#elif defined( box2d_EXPORTS )
34 // building or using the shared library
35 #define BOX2D_EXPORT __attribute__( ( visibility( "default" ) ) )
36#else
37 // static library
38 #define BOX2D_EXPORT
39#endif
40#endif
41
42// C++ macros
43#ifdef __cplusplus
44 #define B2_API extern "C" BOX2D_EXPORT
45 #define B2_INLINE inline
46 #define B2_ALIGN_AS(N) alignas(N)
47#if defined( _MSC_VER )
48 #define B2_FORCE_INLINE __forceinline
49#elif defined( __GNUC__ ) || defined( __clang__ )
50 #define B2_FORCE_INLINE inline __attribute__((always_inline))
51#else
52 #define B2_FORCE_INLINE inline
53#endif
54
55 #define B2_LITERAL(T) T
56 #define B2_ZERO_INIT {}
57#else
58 #define B2_API BOX2D_EXPORT
59 #define B2_INLINE static inline
60 #define B2_ALIGN_AS(N) _Alignas(N)
61
62#if defined( _MSC_VER )
63 #define B2_FORCE_INLINE static __forceinline
64#elif defined( __GNUC__ ) || defined( __clang__ )
65 #define B2_FORCE_INLINE static inline __attribute__((always_inline))
66#else
67 #define B2_FORCE_INLINE static inline
68#endif
69
70 // Used for C literals like (b2Vec2){1.0f, 2.0f} where C++ requires b2Vec2{1.0f, 2.0f}
71 #define B2_LITERAL(T) (T)
72 #define B2_ZERO_INIT {0}
73#endif
74// clang-format on
75
76#if defined( BOX2D_VALIDATE ) && !defined( NDEBUG )
77#define B2_ENABLE_VALIDATION 1
78#else
79#define B2_ENABLE_VALIDATION 0
80#endif
81
87
91typedef void* b2AllocCallbackFcn( size_t size, int alignment );
92
96typedef void b2FreeCallbackFcn( void* mem, size_t size );
97
99typedef int b2AssertCallbackFcn( const char* condition, const char* fileName, int lineNumber );
100
102typedef void b2LogCallbackFcn( const char* message );
103
106B2_API void b2SetAllocator( b2AllocCallbackFcn* allocFcn, b2FreeCallbackFcn* freeFcn );
107
109B2_API size_t b2GetByteCount( void );
110
113B2_API void b2SetAssertCallback( b2AssertCallbackFcn* assertFcn );
114
117B2_API void b2SetLogCallback( b2LogCallbackFcn* logFcn );
118
121typedef struct b2Version
122{
124 int major;
125
127 int minor;
128
131} b2Version;
132
134#define B2_VERSION_MAJOR 3
135
137#define B2_VERSION_MINOR 2
138
140#define B2_VERSION_REVISION 0
141
143B2_API b2Version b2GetVersion( void );
144
146B2_API bool b2IsDoublePrecision( void );
147
149B2_API bool b2IsAVX2Available( void );
150
152
154
155// see https://github.com/scottt/debugbreak
156#if defined( _MSC_VER )
157#define B2_BREAKPOINT __debugbreak()
158#elif defined( __GNUC__ ) || defined( __clang__ )
159#define B2_BREAKPOINT __builtin_trap()
160#else
161// Unknown compiler
162#include <assert.h>
163#define B2_BREAKPOINT assert( 0 )
164#endif
165
166#if !defined( NDEBUG ) || defined( B2_ENABLE_ASSERT )
167B2_API int b2InternalAssert( const char* condition, const char* fileName, int lineNumber );
168#define B2_ASSERT( condition ) \
169 ( (void)( ( !!( condition ) ) || \
170 ( b2InternalAssert( #condition, __FILE__, (int)( __LINE__ ) ), 0 ) ) )
171#else
172#define B2_ASSERT( ... ) ( (void)0 )
173#endif
174
175// Validation is used in debug builds
176#if B2_ENABLE_VALIDATION
177#define B2_VALIDATE( condition ) B2_ASSERT( condition )
178#else
179#define B2_VALIDATE( ... ) ( (void)0 )
180#endif
181
183
185B2_API uint64_t b2GetTicks( void );
186
188B2_API float b2GetMilliseconds( uint64_t ticks );
189
192B2_API float b2GetMillisecondsAndReset( uint64_t* ticks );
193
195B2_API void b2Yield( void );
196
198#define B2_HASH_INIT 5381
199
201B2_API uint32_t b2Hash( uint32_t hash, const uint8_t* data, int count );
int minor
Incremental changes.
Definition base.h:127
int revision
Bug fixes.
Definition base.h:130
int major
Significant changes.
Definition base.h:124
bool b2IsAVX2Available(void)
void b2SetLogCallback(b2LogCallbackFcn *logFcn)
Override the default log function.
void b2FreeCallbackFcn(void *mem, size_t size)
Prototype for user free function.
Definition base.h:96
int b2AssertCallbackFcn(const char *condition, const char *fileName, int lineNumber)
Prototype for the user assert callback. Return 0 to skip the debugger break.
Definition base.h:99
void b2LogCallbackFcn(const char *message)
Prototype for user log callback. Used to log warnings.
Definition base.h:102
void b2SetAllocator(b2AllocCallbackFcn *allocFcn, b2FreeCallbackFcn *freeFcn)
This allows the user to override the allocation functions.
void * b2AllocCallbackFcn(size_t size, int alignment)
Prototype for user allocation function.
Definition base.h:91
size_t b2GetByteCount(void)
bool b2IsDoublePrecision(void)
void b2SetAssertCallback(b2AssertCallbackFcn *assertFcn)
Override the default assert function.
b2Version b2GetVersion(void)
Get the current version of Box2D.
Version numbering scheme.
Definition base.h:122