WIP checkpoint: Implement chunk streaming system in GDScript
This commit is contained in:
@@ -0,0 +1,67 @@
|
||||
class_name StaticObjectNode
|
||||
extends Node3D
|
||||
## A visual representation of a static world object within a chunk.
|
||||
##
|
||||
## This node is instantiated by [ChunkScene] for each static (non-dynamic)
|
||||
## [WorldObject]. It renders the object's mesh (referenced by `asset_id`) at
|
||||
## the object's transform. If the asset is not yet loaded, a placeholder mesh
|
||||
## is shown.
|
||||
##
|
||||
## ## Structure
|
||||
##
|
||||
## ```
|
||||
## StaticObjectNode (Node3D)
|
||||
## └── MeshInstance3D # the object's visual mesh
|
||||
## ```
|
||||
|
||||
## The world object data this node represents.
|
||||
var world_object: WorldObject = null
|
||||
|
||||
## The loaded mesh instance (or placeholder).
|
||||
var _mesh_instance: MeshInstance3D = null
|
||||
|
||||
|
||||
func _ready() -> void:
|
||||
if world_object == null:
|
||||
return
|
||||
_load_mesh()
|
||||
|
||||
|
||||
## Load and attach the object's mesh.
|
||||
func _load_mesh() -> void:
|
||||
_mesh_instance = MeshInstance3D.new()
|
||||
_mesh_instance.name = "mesh"
|
||||
|
||||
# Try to load the asset by its id (path). Fall back to a placeholder.
|
||||
var mesh := _load_asset_mesh(world_object.asset_id)
|
||||
if mesh == null:
|
||||
mesh = _make_placeholder_mesh()
|
||||
|
||||
_mesh_instance.mesh = mesh
|
||||
add_child(_mesh_instance)
|
||||
|
||||
|
||||
## Attempt to load a mesh from the asset path.
|
||||
func _load_asset_mesh(asset_id: String) -> Mesh:
|
||||
if asset_id.is_empty():
|
||||
return null
|
||||
var path := "res://assets/%s" % asset_id
|
||||
if ResourceLoader.exists(path):
|
||||
var res := load(path)
|
||||
if res is Mesh:
|
||||
return res
|
||||
return null
|
||||
|
||||
|
||||
## Create a simple placeholder box mesh when the real asset is unavailable.
|
||||
func _make_placeholder_mesh() -> Mesh:
|
||||
var mesh := BoxMesh.new()
|
||||
mesh.size = Vector3(1.0, 1.0, 1.0)
|
||||
return mesh
|
||||
|
||||
|
||||
## Get the world object's display name.
|
||||
func get_display_name() -> String:
|
||||
if world_object == null:
|
||||
return ""
|
||||
return world_object.get_display_name()
|
||||
Reference in New Issue
Block a user