Веб-сайт самохостера Lotigara

summaryrefslogtreecommitdiff
path: root/source/game/StarCollisionGenerator.hpp
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;
};

}