refactor(M03): extract WMO render build planner
This commit is contained in:
@@ -15,6 +15,9 @@ const WMO_PLACEMENT_RESOLVER_SCRIPT := preload(
|
||||
const WMO_PLACEMENT_REGISTRY_SCRIPT := preload(
|
||||
"res://src/render/wmo/wmo_placement_registry.gd"
|
||||
)
|
||||
const WMO_RENDER_BUILD_STEP_PLANNER_SCRIPT := preload(
|
||||
"res://src/render/wmo/wmo_render_build_step_planner.gd"
|
||||
)
|
||||
const M2_BUILDER_SCRIPT := preload("res://addons/mpq_extractor/loaders/m2_builder.gd")
|
||||
const M2_NATIVE_ANIMATED_BUILDER_SCRIPT := preload("res://addons/mpq_extractor/loaders/m2_native_animated_builder.gd")
|
||||
const M2_NATIVE_ANIMATOR_SCRIPT := preload("res://src/scenes/streaming/m2_native_animator.gd")
|
||||
@@ -290,6 +293,7 @@ var _m2_static_animation_cache: Dictionary = {}
|
||||
var _m2_missing_cache: Dictionary = {}
|
||||
var _world_wmo_root: Node3D
|
||||
var _wmo_placement_registry := WMO_PLACEMENT_REGISTRY_SCRIPT.new()
|
||||
var _wmo_render_build_step_planner := WMO_RENDER_BUILD_STEP_PLANNER_SCRIPT.new()
|
||||
var _wmo_instance_nodes_by_unique_key: Dictionary = {}
|
||||
|
||||
|
||||
@@ -3791,15 +3795,30 @@ func _process_wmo_render_build_jobs() -> void:
|
||||
var mesh_transforms: Array = render_resource.get("mesh_transforms")
|
||||
var mesh_names: PackedStringArray = render_resource.get("mesh_names")
|
||||
var mesh_index: int = int(job.get("mesh_index", 0))
|
||||
if mesh_index < meshes.size():
|
||||
var mesh := meshes[mesh_index] as Mesh
|
||||
var multimeshes: Array = render_resource.get("multimeshes")
|
||||
var multimesh_transforms: Array = render_resource.get("multimesh_transforms")
|
||||
var multimesh_names: PackedStringArray = render_resource.get("multimesh_names")
|
||||
var multimesh_index: int = int(job.get("multimesh_index", 0))
|
||||
var build_step: Dictionary = _wmo_render_build_step_planner.plan_step(
|
||||
meshes.size(),
|
||||
mesh_index,
|
||||
multimeshes.size(),
|
||||
multimesh_index
|
||||
)
|
||||
var selected_index := int(build_step["selected_index"])
|
||||
if build_step["operation"] == WMO_RENDER_BUILD_STEP_PLANNER_SCRIPT.OPERATION_MESH:
|
||||
var mesh := meshes[selected_index] as Mesh
|
||||
if mesh != null:
|
||||
_refresh_cached_wmo_mesh_materials(mesh)
|
||||
var mesh_instance := MeshInstance3D.new()
|
||||
mesh_instance.name = mesh_names[mesh_index] if mesh_index < mesh_names.size() else "Group_%d" % mesh_index
|
||||
mesh_instance.name = (
|
||||
mesh_names[selected_index]
|
||||
if selected_index < mesh_names.size()
|
||||
else "Group_%d" % selected_index
|
||||
)
|
||||
mesh_instance.mesh = mesh
|
||||
if mesh_index < mesh_transforms.size():
|
||||
mesh_instance.transform = mesh_transforms[mesh_index]
|
||||
if selected_index < mesh_transforms.size():
|
||||
mesh_instance.transform = mesh_transforms[selected_index]
|
||||
mesh_instance.cast_shadow = (
|
||||
GeometryInstance3D.SHADOW_CASTING_SETTING_ON
|
||||
if wmo_cast_shadows
|
||||
@@ -3810,28 +3829,24 @@ func _process_wmo_render_build_jobs() -> void:
|
||||
mesh_instance.visibility_range_end_margin = CHUNK_SIZE
|
||||
(root as Node3D).add_child(mesh_instance)
|
||||
_set_editor_owner_recursive(mesh_instance)
|
||||
job["mesh_index"] = mesh_index + 1
|
||||
job["mesh_index"] = int(build_step["next_mesh_index"])
|
||||
_wmo_render_build_jobs[unique_key] = job
|
||||
_render_budget_scheduler.try_consume_permit(RENDER_BUDGET_SCHEDULER_SCRIPT.WMO_RENDER_GROUP_BUILD)
|
||||
continue
|
||||
|
||||
var multimeshes: Array = render_resource.get("multimeshes")
|
||||
var multimesh_transforms: Array = render_resource.get("multimesh_transforms")
|
||||
var multimesh_names: PackedStringArray = render_resource.get("multimesh_names")
|
||||
var multimesh_index: int = int(job.get("multimesh_index", 0))
|
||||
if multimesh_index < multimeshes.size():
|
||||
var multimesh := multimeshes[multimesh_index] as MultiMesh
|
||||
if build_step["operation"] == WMO_RENDER_BUILD_STEP_PLANNER_SCRIPT.OPERATION_MULTIMESH:
|
||||
var multimesh := multimeshes[selected_index] as MultiMesh
|
||||
if multimesh != null:
|
||||
_refresh_cached_wmo_mesh_materials(multimesh.mesh)
|
||||
var multimesh_instance := MultiMeshInstance3D.new()
|
||||
multimesh_instance.name = (
|
||||
multimesh_names[multimesh_index]
|
||||
if multimesh_index < multimesh_names.size()
|
||||
else "DoodadGroup_%d" % multimesh_index
|
||||
multimesh_names[selected_index]
|
||||
if selected_index < multimesh_names.size()
|
||||
else "DoodadGroup_%d" % selected_index
|
||||
)
|
||||
multimesh_instance.multimesh = multimesh
|
||||
if multimesh_index < multimesh_transforms.size():
|
||||
multimesh_instance.transform = multimesh_transforms[multimesh_index]
|
||||
if selected_index < multimesh_transforms.size():
|
||||
multimesh_instance.transform = multimesh_transforms[selected_index]
|
||||
multimesh_instance.cast_shadow = (
|
||||
GeometryInstance3D.SHADOW_CASTING_SETTING_ON
|
||||
if wmo_cast_shadows
|
||||
@@ -3842,7 +3857,7 @@ func _process_wmo_render_build_jobs() -> void:
|
||||
multimesh_instance.visibility_range_end_margin = CHUNK_SIZE
|
||||
(root as Node3D).add_child(multimesh_instance)
|
||||
_set_editor_owner_recursive(multimesh_instance)
|
||||
job["multimesh_index"] = multimesh_index + 1
|
||||
job["multimesh_index"] = int(build_step["next_multimesh_index"])
|
||||
_wmo_render_build_jobs[unique_key] = job
|
||||
_render_budget_scheduler.try_consume_permit(RENDER_BUDGET_SCHEDULER_SCRIPT.WMO_RENDER_GROUP_BUILD)
|
||||
continue
|
||||
|
||||
Reference in New Issue
Block a user