载入中...
搜索中...
未找到
PixelWorldPhysics.h
浏览该文件的文档.
1#pragma once
2#include "common/Export.h"
3
4
5#include "common/Result.h"
8
9#include <cstdint>
10#include <memory>
11#include <vector>
12
13namespace eve::physics {
14class World;
15}
16
18
21 int x = 0;
22 int y = 0;
23 int width = 0;
24 int height = 0;
25};
26
29 float density = 1.0f;
30 float friction = 0.4f;
31 float restitution = 0.05f;
32 std::uint32_t maximumFixtures = 256;
33};
34
36enum class FragmentSettleDisposition : std::uint8_t { StillAwake, Rasterized };
37
45
48 std::uint64_t sourceRevision = 0;
49 std::uint32_t chunksRebuilt = 0;
50 std::uint32_t fixturesCreated = 0;
51 std::uint32_t bodiesRemoved = 0;
52};
53
57 std::vector<float> vertices;
59 bool loop = false;
60};
61
64 bool hit = false;
66 int cellX = 0;
67 int cellY = 0;
68 float pointX = 0.f;
69 float pointY = 0.f;
70 float normalX = 0.f;
71 float normalY = 0.f;
73 float depth = 0.f;
75 float fraction = 0.f;
76};
77
84 const eve::pixelworld::PixelWorld& pixelWorld, int chunkX, int chunkY, std::uint32_t maximumVertices = 4096);
85
91 const eve::pixelworld::PixelWorld& pixelWorld, float centerX, float centerY, float radius,
92 std::uint32_t maximumCells = 4096);
93
99 const eve::pixelworld::PixelWorld& pixelWorld, float startX, float startY, float endX, float endY, float radius,
100 std::uint32_t maximumCells = 16384);
101
111public:
117 PixelFragmentBody& operator=(PixelFragmentBody&&) noexcept = default;
119 PixelFragmentBody& operator=(const PixelFragmentBody&) = delete;
120
128 [[nodiscard]] static eve::Result<std::unique_ptr<PixelFragmentBody>> create(
129 eve::physics::World& world, eve::pixelworld::PixelFragment fragment,
130 FragmentBodyConfig config = {});
131
133 [[nodiscard]] const std::vector<FragmentCollisionRect>& collisionRects() const noexcept;
135 [[nodiscard]] std::uint64_t fragmentId() const noexcept;
137 [[nodiscard]] eve::physics::PhysicsLink physicsLink() const noexcept;
139 [[nodiscard]] bool isRasterized() const noexcept;
140
146 [[nodiscard]] eve::Result<FragmentSettleReceipt> settleIfSleeping(
147 eve::physics::World& physicsWorld, eve::pixelworld::PixelWorld& pixelWorld);
148
153 [[nodiscard]] eve::Result<void> releasePhysics(eve::physics::World& physicsWorld);
154
155private:
156 PixelFragmentBody(eve::pixelworld::PixelFragment fragment, eve::physics::PhysicsLink link,
157 std::vector<FragmentCollisionRect> rectangles);
158
159 eve::pixelworld::PixelFragment fragment_;
160 eve::physics::PhysicsLink link_;
161 std::vector<FragmentCollisionRect> rectangles_;
162 bool rasterized_ = false;
163 bool physicsReleased_ = false;
164};
165
174public:
185
195 [[nodiscard]] eve::Result<TerrainCollisionSyncReceipt> sync(
196 eve::physics::World& physicsWorld, const eve::pixelworld::PixelWorld& pixelWorld,
197 std::uint32_t maximumFixturesPerChunk = 256);
198
200 [[nodiscard]] eve::Result<void> clearPhysics(eve::physics::World& physicsWorld);
202 [[nodiscard]] std::uint64_t sourceRevision() const noexcept;
204 [[nodiscard]] std::size_t bodyCount() const noexcept;
205
206private:
207 struct Impl;
208 std::unique_ptr<Impl> impl_;
209};
210
211} // namespace eve::pixelworld_physics
#define EVENGINE_API_DOMAINS
Definition Export.h:110
World3D * world
float radius
Move-only, checked operation results for the common layer.
Move-only operation result carrying either a value or Status.
Definition Result.h:155
Sparse, chunked, deterministic 2D falling-material world.
Definition PixelWorld.h:224
Owning detached bitmap plus a non-owning, stale-safe dynamic body link.
PixelFragmentBody(PixelFragmentBody &&) noexcept=default
Pixel fragment body.
~PixelFragmentBody()=default
Pixel fragment body.
Incremental static collision projection of authoritative PixelWorld chunks.
~PixelTerrainCollisionCache()
Pixel terrain collision cache.
PixelTerrainCollisionCache(PixelTerrainCollisionCache &&) noexcept
Pixel terrain collision cache.
Optional physics backend for vehicle mobility and body attach.
Definition Climbing.h:36
eve::Result< PixelTerrainContact > sweepTerrainCircle(const eve::pixelworld::PixelWorld &pixelWorld, float startX, float startY, float endX, float endY, float radius, std::uint32_t maximumCells)
Sweep a circular character shape continuously through authoritative solid material cells.
eve::Result< std::vector< TerrainCollisionContour > > extractTerrainContours(const eve::pixelworld::PixelWorld &pixelWorld, int chunkX, int chunkY, std::uint32_t maximumVertices)
Extract simplified binary Marching-Squares-equivalent boundary chains for one Chunk.
eve::Result< PixelTerrainContact > probeTerrainCircle(const eve::pixelworld::PixelWorld &pixelWorld, float centerX, float centerY, float radius, std::uint32_t maximumCells)
Probe a circular character contact directly against authoritative solid material cells.
FragmentSettleDisposition
Observable outcome of polling a fragment body for settlement.
MaterialId
Compact stable material identifier stored in each authoritative cell.
Build metadata (engine git commit, build time, third-party version).
Definition Build.cpp:16
Policy for dynamic fragment fixture creation and terrain settlement.
One deterministic axis-aligned fixture produced from a fragment bitmap.
Receipt for one checked fragment-body settlement poll.
Deterministic contact returned by an authoritative terrain probe or sweep.
float fraction
Sweep time in [0,1], or zero for a probe.
float depth
Probe penetration depth, or zero for a non-overlapping sweep hit.
One simplified local-space boundary contour generated for a terrain Chunk.
std::vector< float > vertices
Packed local pixel-space vertices x0,y0,x1,y1,... without a repeated loop endpoint.
bool loop
Whether the last vertex connects back to the first.
Counters for one transactional dirty-Chunk terrain collision sync.