OpenLiberty/scripts/classes/streamed_mesh.gd
2024-08-19 18:30:48 +07:00

54 lines
1.9 KiB
GDScript

class_name StreamedMesh
extends MeshInstance3D
var _idef: ItemDef
var _thread := Thread.new()
var _mesh_buf: Mesh
func _init(idef: ItemDef):
_idef = idef
func _exit_tree():
if _thread.is_alive():
_thread.wait_to_finish()
func _process(delta: float) -> void:
if _thread.is_started() == false:
if get_viewport().get_camera_3d() != null:
var dist := get_viewport().get_camera_3d().global_position.distance_to(global_position)
if dist < visibility_range_end and mesh == null:
_thread.start(_load_mesh)
while _thread.is_alive():
await get_tree().process_frame
_thread.wait_to_finish()
mesh = _mesh_buf
elif dist > visibility_range_end and mesh != null:
mesh = null
func _load_mesh() -> void:
AssetLoader.mutex.lock()
if _idef.flags & 0x40:
return
var access := AssetLoader.open_asset(_idef.model_name + ".dff")
var glist := RWClump.new(access).geometry_list
for geometry in glist.geometries:
_mesh_buf = geometry.mesh
for surf_id in _mesh_buf.get_surface_count():
var material := _mesh_buf.surface_get_material(surf_id) as StandardMaterial3D
material.cull_mode = BaseMaterial3D.CULL_DISABLED
if _idef.flags & 0x08:
material.blend_mode = BaseMaterial3D.BLEND_MODE_ADD
material.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED
if material.has_meta("texture_name"):
var txd := RWTextureDict.new(AssetLoader.open_asset(_idef.txd_name + ".txd"))
var texture_name = material.get_meta("texture_name")
for raster in txd.textures:
if texture_name.matchn(raster.name):
material.albedo_texture = ImageTexture.create_from_image(raster.image)
if raster.has_alpha:
material.transparency = (
BaseMaterial3D.TRANSPARENCY_ALPHA_HASH if _idef.flags & 0x04 and not _idef.flags & 0x08
else BaseMaterial3D.TRANSPARENCY_ALPHA )
break
_mesh_buf.surface_set_material(surf_id, material)
AssetLoader.mutex.unlock()