blob: b8240b834b91b95ed608a1774fa8e2555b8b3aea (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
#pragma once
#include "StarCollisionBlock.hpp"
#include "StarMultiArray.hpp"
#include <functional>
namespace Star {
STAR_CLASS(CollisionGenerator);
// Turns cell geometry into "smoothed" polygonal geometry. Used by World to
// generate ramps and slopes based on tiles.
class CollisionGenerator {
public:
// The maximum number of spaces away from a block that can influence the
// collision geometry of a given block.
static int const BlockInfluenceRadius = 2;
// The Maximum number of blocks that will be generated for a single tile
// space.
static size_t const MaximumCollisionsPerSpace = 4;
// Callback function to tell what kind of collision geometry is in a cell.
// Will be called up to BlockInfluenceRadius outside of the given query
// region.
typedef std::function<CollisionKind(int, int)> CollisionKindAccessor;
void init(CollisionKindAccessor accessor);
// Get collision geometry for the given block region.
List<CollisionBlock> getBlocks(RectI const& region) const;
private:
void getBlocksPlatforms(List<CollisionBlock>& output, RectI const& region, CollisionKind kind) const;
void getBlocksMarchingSquares(List<CollisionBlock>& output, RectI const& region, CollisionKind kind) const;
void populateCollisionBuffer(RectI const& region) const;
CollisionKind collisionKind(int x, int y) const;
CollisionKindAccessor m_accessor;
mutable Vec2I m_collisionBufferCorner;
mutable MultiArray<CollisionKind, 2> m_collisionBuffer;
};
}
|