48 lines
938 B
Odin
48 lines
938 B
Odin
package shoal
|
|
|
|
import "core:fmt"
|
|
|
|
Entity :: distinct u32
|
|
|
|
Storage :: struct($T: typeid) {
|
|
data: map[Entity]T,
|
|
}
|
|
|
|
spawn_entity :: proc(app: ^App) -> Entity {
|
|
entity_num := len(&app.entities)
|
|
entity: Entity = Entity(entity_num)
|
|
append(&app.entities, entity)
|
|
return entity
|
|
}
|
|
|
|
add_component :: proc {
|
|
add_fresh_component,
|
|
add_component_with_data,
|
|
}
|
|
|
|
add_fresh_component :: proc(entity: Entity, storage: ^Storage($T)) {
|
|
storage.data[entity] = T{}
|
|
}
|
|
|
|
add_component_with_data :: proc(entity: Entity, storage: ^Storage($T), component: T) {
|
|
storage.data[entity] = component
|
|
}
|
|
|
|
slice :: proc(storage: ^Storage($T)) -> map[Entity]T {
|
|
return storage.data
|
|
}
|
|
|
|
single :: proc(storage: ^Storage($T)) -> (Entity, ^T) {
|
|
for i, &v in slice(storage) {
|
|
return i, &v
|
|
}
|
|
return Entity{}, new(T)
|
|
}
|
|
|
|
get_component :: proc(entity: Entity, storage: ^Storage($T)) -> ^T {
|
|
if c, exists := &storage.data[entity]; exists {
|
|
return c
|
|
}
|
|
return new(T)
|
|
}
|