OpenLiberty/scripts/classes/streamed_mesh.gd

55 lines
1.9 KiB
GDScript3
Raw Permalink Normal View History

2022-11-18 03:10:21 +07:00
class_name StreamedMesh
extends MeshInstance3D
var _idef: ItemDef
var _thread := Thread.new()
2022-11-18 03:10:21 +07:00
var _mesh_buf: Mesh
func _init(idef: ItemDef):
_idef = idef
func _exit_tree():
if _thread.is_alive():
_thread.wait_to_finish()
2022-11-18 03:10:21 +07:00
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
2022-11-18 03:10:21 +07:00
func _load_mesh() -> void:
AssetLoader.mutex.lock()
if _idef.flags & 0x40:
return
2022-11-18 11:33:52 +07:00
var access := AssetLoader.open_asset(_idef.model_name + ".dff")
2022-11-18 03:10:21 +07:00
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
2022-11-20 01:40:57 +07:00
if _idef.flags & 0x08:
material.blend_mode = BaseMaterial3D.BLEND_MODE_ADD
material.shading_mode = BaseMaterial3D.SHADING_MODE_UNSHADED
2022-11-18 03:10:21 +07:00
if material.has_meta("texture_name"):
2022-11-18 11:33:52 +07:00
var txd := RWTextureDict.new(AssetLoader.open_asset(_idef.txd_name + ".txd"))
2022-11-18 03:10:21 +07:00
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 = (
2022-11-20 01:40:57 +07:00
BaseMaterial3D.TRANSPARENCY_ALPHA_HASH if _idef.flags & 0x04 and not _idef.flags & 0x08
2024-08-15 19:25:32 -03:00
else BaseMaterial3D.TRANSPARENCY_ALPHA )
2022-11-18 03:10:21 +07:00
break
_mesh_buf.surface_set_material(surf_id, material)
AssetLoader.mutex.unlock()