@@ -3,7 +3,31 @@ extends E3DInstancer
33
44
55func instantiate (target_node : E3DModelInstance , model : E3DModel , editable : bool = false ) -> void :
6- _do_add_submodels (target_node , target_node , model .submodels , editable )
6+ var lights = []
7+ _do_add_submodels (target_node , target_node , model .submodels , editable , lights )
8+ _link_lights (target_node , lights )
9+
10+
11+ func _link_lights (target_node : E3DModelInstance , lights : Array ) -> void :
12+ var all_nodes = target_node .find_children ("*" , "Node3D" , true , true )
13+ var node_map = {}
14+ for node in all_nodes :
15+ node_map [node .name .to_lower ()] = node
16+
17+ for light in lights :
18+ var base_name = light .name .to_lower ()
19+
20+ var on_suffixes = ["_on" , "_xon" ]
21+ for suffix in on_suffixes :
22+ var on_node = node_map .get (base_name + suffix )
23+ if on_node :
24+ light .meshes_on .append (on_node )
25+
26+ var off_node = node_map .get (base_name + "_off" )
27+ if off_node :
28+ light .meshes_off .append (off_node )
29+
30+ light ._update_state ()
731
832
933func clear (target_node : E3DModelInstance ) -> void :
@@ -20,11 +44,18 @@ func _do_add_submodels(
2044 target_node :E3DModelInstance ,
2145 parent ,
2246 submodels ,
23- editable :bool
47+ editable :bool ,
48+ lights : Array = []
2449) -> void :
2550 for submodel in submodels :
2651 if _is_submodel_valid (target_node , submodel ):
2752 var child :Node = _create_submodel_instance (target_node , submodel )
53+ if not child :
54+ continue
55+
56+ if child .has_method ("_update_state" ):
57+ lights .append (child )
58+
2859 _update_submodel_material (target_node , child , submodel )
2960 var internal = InternalMode .INTERNAL_MODE_DISABLED if editable else InternalMode .INTERNAL_MODE_BACK
3061 parent .add_child (child , false , internal )
@@ -33,12 +64,17 @@ func _do_add_submodels(
3364 # Applying transform before adding may cause issues (especially on windows)
3465 if child is Node3D and submodel .transform :
3566 var child_node :Node3D = child as Node3D
36- child_node .transform = submodel .transform
67+ if child is SpotLight3D :
68+ # Do not scale SpotLight3D to avoid configuration warnings
69+ child_node .position = submodel .transform .origin
70+ child_node .basis = submodel .transform .basis .orthonormalized ()
71+ else :
72+ child_node .transform = submodel .transform
3773
3874 if Engine .is_editor_hint ():
3975 child .owner = target_node .owner if editable else target_node
4076 if submodel .submodels :
41- _do_add_submodels (target_node , child , submodel .submodels , editable )
77+ _do_add_submodels (target_node , child , submodel .submodels , editable , lights )
4278
4379
4480func _create_submodel_instance (target_node : E3DModelInstance , submodel : E3DSubModel ):
@@ -56,6 +92,20 @@ func _create_submodel_instance(target_node: E3DModelInstance, submodel: E3DSubMo
5692 obj .visibility_range_begin = submodel .visibility_range_begin
5793 obj .visibility_range_end = submodel .visibility_range_end
5894
95+ E3DSubModel .S ubModelType.SUBMODEL_FREE_SPOTLIGHT :
96+ obj = SpotLight3D .new ()
97+ obj .set_script (preload ("res://addons/libmaszyna/e3d/e3d_light.gd" ))
98+ obj .name = submodel .resource_name
99+ obj .light_color = submodel .diffuse_color
100+ obj .light_energy = 10.0
101+ obj .shadow_enabled = true
102+ obj .distance_fade_enabled = true
103+ obj .spot_range = submodel .light_range if submodel .light_range > 0.0 else 20.0
104+ obj .spot_angle = submodel .light_angle
105+ obj .spot_attenuation = submodel .light_attenuation
106+ obj .distance_fade_begin = submodel .near_atten_start
107+ obj .enabled = submodel .visible
108+
59109 if obj :
60110 obj .visible = submodel .visible
61111 return obj
0 commit comments