I have added ability to relate entities by some relationship type + data.
import ecs "moecs/src"
Joint :: struct {
type : u8,
data : [16]f32
}
related :: proc(world: ^ecs.World, entity: ^ecs.Entity, event: ecs.Event, type: typeid, target: rawptr,
relation: rawptr) {
switch type {
case ecs.ChildOf: fmt.printfln("Related: %v, %v", type, (cast(^ecs.ChildOf)relation)^)
case ecs.ParentOf: fmt.printfln("Related: %v, %v", type, (cast(^ecs.ParentOf)relation)^)
case Joint: fmt.printfln("Related: %v, %v", type, (cast(^Joint)relation)^)
}
}
main :: proc() {
arr := [3]int{ 3, 7, 14 }
ecs.init()
world := ecs.new_world()
ecs.register(world, .RELATION, Joint)
ecs.run(world)
ecs.mount(world, query = { Joint, ecs.ParentOf }, callback = drive)
ecs.observe(world, event = .RELATED, types = { ecs.ParentOf, ecs.ChildOf, Joint }, callback = related)
ecs.observe(world, event = .UNRELATED, types = { ecs.ParentOf, ecs.ChildOf, Joint }, callback = unrelated)
e1 : ^ecs.Entity = ecs.spawn(world, .DYNAMIC)
e2 : ^ecs.Entity = ecs.spawn(world, .DYNAMIC)
e3 : ^ecs.Entity = ecs.spawn(world, .DYNAMIC)
ecs.parent_of(e1, e2)
ecs.relate(e1, ecs.ParentOf { data = nil }, e3)
ecs.relate(e1, Joint { type = 7, data = { 0 = 1, 1 = 2, 2..<16 = 3 }}, e3)
ecs.relate(e1, Joint, e2)
fmt.printfln("e1 is parent of e2: %v", ecs.is_parent_of(e1, e2))
fmt.printfln("e2 is child of e1: %v", ecs.is_child_of(e2, e1))
e4 := ecs.spawn(world, .DYNAMIC)
e5 := ecs.spawn(world, .DYNAMIC)
ecs.parent_of(e1, ecs.ParentOf { data = &arr }, e3, e4)
fmt.printfln("e1 is parent of e2, e3, e4: %v", ecs.related(e1, ecs.ParentOf, e2, e3, e4))
fmt.printfln("e2 has relations: %v", ecs.is_relation(e2))
fmt.printfln("e2 is relation target of e1: %v", ecs.is_relation_of(e2, e1))
fmt.printfln("e2 is relation target of e3: %v", ecs.is_relation_of(e2, e3))
fmt.printfln("e3 with e1 relation of count: %v", ecs.relation_of_count(e3, e1))
ecs.unrelate(e1, Joint, e3)
ecs.unrelate_with(e1, ecs.ParentOf, e3)
ecs.unrelate(e1, ecs.ParentOf)
fmt.printfln("e1 is parent of e2, e3, e4: %v", ecs.related(e1, ecs.ParentOf, e2, e3, e4))
ecs.child_of(e4, e1, e2)
fmt.printfln("e4 is child of e1: %v", ecs.is_child_of(e4, e1))
fmt.printfln("e4 is child of e2: %v", ecs.is_child_of(e4, e2))
r, e := ecs.relations(e1, ecs.ParentOf)
parent := ecs.parent(e4)
parents := ecs.parents(e4)
child := ecs.child(e1)
children := ecs.children(e1)
ecs.destroy()
}