summaryrefslogtreecommitdiff
path: root/composeApp/src/commonMain/kotlin/coffee/liz/ecs/physics/PhysicsSystem.kt
blob: 703e614c9b77cd5e4023667a7465b1642c46dd15 (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
package coffee.liz.ecs.physics

import coffee.liz.ecs.Entity
import coffee.liz.ecs.TickedSystem
import coffee.liz.ecs.World
import kotlin.time.Duration

internal fun interface CollisionResolver<Outside> {
    fun resolveCollision(world: World<Outside>, a: Entity, b: Entity)
}

abstract class PhysicsSystem<Outside>(
    physicsTickRate: Duration
): TickedSystem<Outside>(physicsTickRate), CollisionResolver<Outside> {
    private val integrationTick = IntegrationTick<Outside>()
    private val collisionTick = CollisionTick(this)

    abstract override fun resolveCollision(world: World<Outside>, a: Entity, b: Entity)

    override fun update(world: World<Outside>, state: Outside, ticks: Int) {
        for (tick in 1..ticks) {
            collisionTick.runTick(world)
            integrationTick.runTick(world)
        }
    }
}