载入中...
搜索中...
未找到
Fixture.cpp
浏览该文件的文档.
1#include "physics/Fixture.h"
2#include "physics/Body.h"
3#include "physics/World.h"
4
5#include <Box2D/Box2D.h>
6
7namespace eve::physics {
8
9Fixture::Fixture(World *world, Body *body, b2Fixture *fixture)
10 : world_(world), body_(body), fixture_(fixture) {}
11
13 if (fixture_ && body_ && body_->raw()) {
14 if (world_) world_->forgetFixture(this);
15 fixture_->SetUserData(nullptr);
16 body_->raw()->DestroyFixture(fixture_);
17 }
18 fixture_ = nullptr;
19 body_ = nullptr;
20 world_ = nullptr;
21}
22
24 if (fixture_) fixture_->SetUserData(nullptr);
25 fixture_ = nullptr;
26 body_ = nullptr;
27 world_ = nullptr;
28}
29
31 if (!fixture_ || !body_ || !body_->raw()) {
32 invalidate();
33 return;
34 }
35 if (world_) world_->forgetFixture(this);
36 fixture_->SetUserData(nullptr);
37 body_->raw()->DestroyFixture(fixture_);
38 fixture_ = nullptr;
39 body_ = nullptr;
40 world_ = nullptr;
41}
42
43void Fixture::setSensor(bool sensor) {
44 if (!fixture_) return;
45 fixture_->SetSensor(sensor);
46}
47
48bool Fixture::isSensor() const { return fixture_ ? fixture_->IsSensor() : false; }
49
50void Fixture::setFriction(float friction) {
51 if (!fixture_) return;
52 fixture_->SetFriction(friction);
53}
54
55float Fixture::getFriction() const { return fixture_ ? fixture_->GetFriction() : 0.f; }
56
57void Fixture::setRestitution(float restitution) {
58 if (!fixture_) return;
59 fixture_->SetRestitution(restitution);
60}
61
62float Fixture::getRestitution() const { return fixture_ ? fixture_->GetRestitution() : 0.f; }
63
64void Fixture::setDensity(float density) {
65 if (!fixture_) return;
66 fixture_->SetDensity(density);
67 if (body_ && body_->raw()) body_->raw()->ResetMassData();
68}
69
70float Fixture::getDensity() const { return fixture_ ? fixture_->GetDensity() : 0.f; }
71
73 if (!fixture_) return;
74 b2Filter filter = fixture_->GetFilterData();
75 filter.categoryBits = static_cast<uint16>(bits);
76 fixture_->SetFilterData(filter);
77}
78
80 return fixture_ ? int(fixture_->GetFilterData().categoryBits) : 0;
81}
82
83void Fixture::setMaskBits(int bits) {
84 if (!fixture_) return;
85 b2Filter filter = fixture_->GetFilterData();
86 filter.maskBits = static_cast<uint16>(bits);
87 fixture_->SetFilterData(filter);
88}
89
90int Fixture::getMaskBits() const { return fixture_ ? int(fixture_->GetFilterData().maskBits) : 0; }
91
92void Fixture::setGroupIndex(int index) {
93 if (!fixture_) return;
94 b2Filter filter = fixture_->GetFilterData();
95 filter.groupIndex = static_cast<int16>(index);
96 fixture_->SetFilterData(filter);
97}
98
100 return fixture_ ? int(fixture_->GetFilterData().groupIndex) : 0;
101}
102
103int Fixture::getBodyId() const { return body_ ? body_->getId() : 0; }
104
105bool Fixture::testPoint(float x, float y) const {
106 if (!fixture_ || !world_) return false;
107 return fixture_->TestPoint(b2Vec2(world_->toMeters(x), world_->toMeters(y)));
108}
109
110} // namespace eve::physics
int y
Definition Grass.cpp:135
int x
Definition Grass.cpp:135
JobFunc body
std::string filter
2D rigid body (Box2D) in pixel-space coordinates. Owned by a World; create shapes with newRectangleFi...
Definition Body.h:16
b2Body * raw()
Definition Body.h:97
int getId() const
Stable id used by contact/impact events.
Definition Body.h:26
void destroy()
Destroys the fixture inside its world.
Definition Fixture.cpp:30
void setSensor(bool sensor)
Sensor fixtures report contacts but never collide.
Definition Fixture.cpp:43
bool testPoint(float x, float y) const
Pixel-space point-in-fixture test (uses World meter).
Definition Fixture.cpp:105
int getMaskBits() const
Definition Fixture.cpp:90
int getCategoryBits() const
Definition Fixture.cpp:79
Fixture(World *world, Body *body, b2Fixture *fixture)
Internal: wraps a Box2D fixture (use Body::new*Fixture).
Definition Fixture.cpp:9
void setMaskBits(int bits)
Definition Fixture.cpp:83
void invalidate()
Internal: marks the wrapper invalid after destruction.
Definition Fixture.cpp:23
float getFriction() const
Definition Fixture.cpp:55
void setDensity(float density)
Definition Fixture.cpp:64
bool isSensor() const
Definition Fixture.cpp:48
void setFriction(float friction)
Material properties.
Definition Fixture.cpp:50
int getGroupIndex() const
Definition Fixture.cpp:99
int getBodyId() const
Id of the owning body.
Definition Fixture.cpp:103
void setCategoryBits(int bits)
Collision filtering (Box2D category/mask bits, group index).
Definition Fixture.cpp:72
void setGroupIndex(int index)
Definition Fixture.cpp:92
float getDensity() const
Definition Fixture.cpp:70
void setRestitution(float restitution)
Definition Fixture.cpp:57
float getRestitution() const
Definition Fixture.cpp:62
Box2D world wrapper (2D physics) with pixel-space coordinates. Handles stepping, gravity,...
Definition World.h:31
void forgetFixture(Fixture *fixture)
Definition World.cpp:260
float toMeters(float pixels) const
Converts a pixel-space length to meters.
Definition World.cpp:225