mirror of
https://github.com/FOSS-Supremacy/OpenLiberty.git
synced 2025-04-28 11:57:58 +03:00
54 lines
1.9 KiB
GDScript
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()
|