48 lines
1.7 KiB
GDScript
48 lines
1.7 KiB
GDScript
class_name M2BuildDispatchPlanner
|
|
extends RefCounted
|
|
|
|
## Selects the next M2 build action from already observed resource state.
|
|
## The planner retains no state or engine-object references.
|
|
|
|
const ACTION_WAIT_FOR_ANIMATION := &"wait_for_animation"
|
|
const ACTION_MATERIALIZE_ANIMATED := &"materialize_animated"
|
|
const ACTION_WAIT_FOR_STATIC_MESH := &"wait_for_static_mesh"
|
|
const ACTION_MATERIALIZE_STATIC := &"materialize_static"
|
|
const ACTION_ADVANCE_WITHOUT_MATERIALIZATION := &"advance_without_materialization"
|
|
|
|
|
|
## Returns a detached action/transition plan for one M2 build operation.
|
|
func plan_step(
|
|
batch_count: int,
|
|
resource_snapshot: RefCounted
|
|
) -> Dictionary:
|
|
if resource_snapshot == null:
|
|
return _wait_plan(ACTION_WAIT_FOR_STATIC_MESH)
|
|
if bool(resource_snapshot.call("animation_request_pending")):
|
|
return _wait_plan(ACTION_WAIT_FOR_ANIMATION)
|
|
if batch_count <= 0:
|
|
return _advance_plan(ACTION_ADVANCE_WITHOUT_MATERIALIZATION, false)
|
|
if bool(resource_snapshot.call("has_animated_prototype")):
|
|
return _advance_plan(ACTION_MATERIALIZE_ANIMATED, true)
|
|
if bool(resource_snapshot.call("has_static_mesh")):
|
|
return _advance_plan(ACTION_MATERIALIZE_STATIC, true)
|
|
if bool(resource_snapshot.call("static_model_missing")):
|
|
return _advance_plan(ACTION_ADVANCE_WITHOUT_MATERIALIZATION, true)
|
|
return _wait_plan(ACTION_WAIT_FOR_STATIC_MESH)
|
|
|
|
|
|
func _wait_plan(action: StringName) -> Dictionary:
|
|
return {
|
|
"action": action,
|
|
"rotate_queue": true,
|
|
"increment_batch_serial": false,
|
|
}
|
|
|
|
|
|
func _advance_plan(action: StringName, increment_batch_serial: bool) -> Dictionary:
|
|
return {
|
|
"action": action,
|
|
"rotate_queue": false,
|
|
"increment_batch_serial": increment_batch_serial,
|
|
}
|