Files
fps_project_1/addons/dreadpon.spatial_gardener/greenhouse/greenhouse_LOD_variant.gd

141 lines
4.4 KiB
GDScript

@tool
extends "../utility/input_field_resource/input_field_resource.gd"
#-------------------------------------------------------------------------------
# A storage object for meshes to be shown as plants
# And spatials to be spawned at their position (typically a StaticBody3D)
#-------------------------------------------------------------------------------
var Globals = preload("../utility/globals.gd")
var mesh:Mesh = null
var spawned_spatial:PackedScene = null
# Toggle for shadow casting mode on multimeshes
var cast_shadow:int = GeometryInstance3D.SHADOW_CASTING_SETTING_ON
#-------------------------------------------------------------------------------
# Initialization
#-------------------------------------------------------------------------------
func _init(__mesh:Mesh = null, __spawned_spatial:PackedScene = null):
super()
set_meta("class", "Greenhouse_LODVariant")
resource_name = "Greenhouse_LODVariant"
mesh = __mesh
spawned_spatial = __spawned_spatial
func _create_input_field(_base_control:Control, _resource_previewer, prop:String) -> UI_InputField:
var input_field:UI_InputField = null
match prop:
"mesh":
var settings := {
"accepted_classes": [Mesh],
"element_display_size": 75 * FunLib.get_setting_safe("dreadpons_spatial_gardener/input_and_ui/greenhouse_thumbnail_scale", 1.0),
"element_interaction_flags": UI_IF_ThumbnailArray.PRESET_RESOURCE,
}
input_field = UI_IF_ThumbnailObject.new(mesh, "Mesh", prop, settings)
"spawned_spatial":
var settings := {
"accepted_classes": [PackedScene],
"element_display_size": 75 * FunLib.get_setting_safe("dreadpons_spatial_gardener/input_and_ui/greenhouse_thumbnail_scale", 1.0),
"element_interaction_flags": UI_IF_ThumbnailArray.PRESET_RESOURCE,
}
input_field = UI_IF_ThumbnailObject.new(spawned_spatial, "Spawned Node3D", prop, settings)
"cast_shadow":
var settings := {"enum_list": ["Off", "On", "Double-Sided", "Shadows Only"]}
input_field = UI_IF_Enum.new(cast_shadow, "Shadow Casting Mode", prop, settings)
return input_field
#-------------------------------------------------------------------------------
# Property export
#-------------------------------------------------------------------------------
func _set(prop, val):
var return_val = true
val = _modify_prop(prop, val)
match prop:
"mesh":
mesh = val
"spawned_spatial":
spawned_spatial = val
"cast_shadow":
cast_shadow = val
_:
return_val = false
if return_val:
emit_changed()
return return_val
func _get(prop):
match prop:
"mesh":
return mesh
"spawned_spatial":
return spawned_spatial
"cast_shadow":
return cast_shadow
return null
func _get_prop_dictionary():
return {
"mesh" : {
"name": "mesh",
"type": TYPE_OBJECT,
"usage": PROPERTY_USAGE_DEFAULT,
"hint": PROPERTY_HINT_NONE,
},
"spawned_spatial" : {
"name": "spawned_spatial",
"type": TYPE_OBJECT,
"usage": PROPERTY_USAGE_DEFAULT,
"hint": PROPERTY_HINT_NONE,
},
"cast_shadow":
{
"name": "cast_shadow",
"type": TYPE_INT,
"usage": PROPERTY_USAGE_DEFAULT,
"hint": PROPERTY_HINT_ENUM,
"hint_string": "Off,On,Double-Sided,Shadows Only"
}
}
func get_prop_tooltip(prop:String) -> String:
match prop:
"mesh":
return "The mesh (.mesh) resource used to display the plant"
"spawned_spatial":
return "The PackedScene (assumed to be Node3D) that spawns alongside the mesh\n" \
+ "They are separate because mesh rendering is optimized using Godot's MultiMesh\n" \
+ "Spawned Spatials are used to define custom behavior (excluding rendering) for each instance, mainly collision\n" \
+ "This should be used sparingly, as thousands of physics bodies will surely approach a limit of what Godot can handle\n" \
+ "\n" \
+ "NOTE: switching LODs with Spawned Spatials can be expensive due to removing and adding hundreds of nodes at once\n" \
+ "But if all your LODs reference the same PackedScene - they will persist across the LOD changes and won't cause any lag spikes\n" \
+ "The alternative would be to optimise yout octrees to contain only a small amount of Spawned Spatials - 10-20 at most\n" \
+ "Then the process of switching LODs will go a lot smoother"
"cast_shadow":
return "Shadow casting mode for this specific LOD\n" \
+ "Disabling shadow casting slightly improves performance and is recommended for higher LODs (those further away)"
return ""