diff options
| -rw-r--r-- | core/image.cpp | 4 | ||||
| -rw-r--r-- | core/variant_op.cpp | 5 | ||||
| -rw-r--r-- | doc/classes/SpatialMaterial.xml | 70 | ||||
| -rw-r--r-- | drivers/gles2/shaders/scene.glsl | 109 | ||||
| -rw-r--r-- | editor/plugins/spatial_editor_plugin.cpp | 11 | ||||
| -rw-r--r-- | modules/mono/glue/nodepath_glue.cpp | 2 | ||||
| -rw-r--r-- | modules/mono/glue/rid_glue.cpp | 2 | ||||
| -rw-r--r-- | modules/mono/mono_gd/gd_mono.cpp | 87 | ||||
| -rw-r--r-- | modules/mono/mono_gd/gd_mono.h | 7 | 
9 files changed, 156 insertions, 141 deletions
diff --git a/core/image.cpp b/core/image.cpp index e2b56c51dc..3d85bdd345 100644 --- a/core/image.cpp +++ b/core/image.cpp @@ -1198,7 +1198,9 @@ void Image::expand_x2_hq2x() {  	if (current != FORMAT_RGBA8)  		convert(current); -	if (used_mipmaps) { +	// FIXME: This is likely meant to use "used_mipmaps" as defined above, but if we do, +	// we end up with a regression: GH-22747 +	if (mipmaps) {  		generate_mipmaps();  	}  } diff --git a/core/variant_op.cpp b/core/variant_op.cpp index 493f77bd07..f230f12b5d 100644 --- a/core/variant_op.cpp +++ b/core/variant_op.cpp @@ -3542,7 +3542,10 @@ void Variant::interpolate(const Variant &a, const Variant &b, float c, Variant &  		case INT: {  			int64_t va = a._data._int;  			int64_t vb = b._data._int; -			r_dst = int((1.0 - c) * va + vb * c); +			if (va != vb) +				r_dst = int((1.0 - c) * va + vb * c); +			else //avoid int casting issues +				r_dst = a;  		}  			return;  		case REAL: { diff --git a/doc/classes/SpatialMaterial.xml b/doc/classes/SpatialMaterial.xml index 354c6686bb..57fb267e91 100644 --- a/doc/classes/SpatialMaterial.xml +++ b/doc/classes/SpatialMaterial.xml @@ -1,8 +1,10 @@  <?xml version="1.0" encoding="UTF-8" ?>  <class name="SpatialMaterial" inherits="Material" category="Core" version="3.1">  	<brief_description> +		Default 3D rendering material.  	</brief_description>  	<description> +		This provides a default material with a wide variety of rendering features and properties without the need to write shader code. See the tutorial below for details.  	</description>  	<tutorials>  		<link>http://docs.godotengine.org/en/3.0/tutorials/3d/spatial_material.html</link> @@ -13,16 +15,20 @@  	</methods>  	<members>  		<member name="albedo_color" type="Color" setter="set_albedo" getter="get_albedo"> +			The material's base color.  		</member>  		<member name="albedo_texture" type="Texture" setter="set_texture" getter="get_texture">  		</member>  		<member name="anisotropy" type="float" setter="set_anisotropy" getter="get_anisotropy"> +			The strength of the anisotropy effect.  		</member>  		<member name="anisotropy_enabled" type="bool" setter="set_feature" getter="get_feature"> +			If [code]true[/code] anisotropy is enabled. Changes the shape of the specular blob and aligns it to tangent space. Default value: [code]false[/code].  		</member>  		<member name="anisotropy_flowmap" type="Texture" setter="set_texture" getter="get_texture">  		</member>  		<member name="ao_enabled" type="bool" setter="set_feature" getter="get_feature"> +			If [code]true[/code] ambient occlusion is enabled.  		</member>  		<member name="ao_light_affect" type="float" setter="set_ao_light_affect" getter="get_ao_light_affect">  		</member> @@ -35,6 +41,7 @@  		<member name="clearcoat" type="float" setter="set_clearcoat" getter="get_clearcoat">  		</member>  		<member name="clearcoat_enabled" type="bool" setter="set_feature" getter="get_feature"> +			If [code]true[/code] clearcoat rendering is enabled. Adds a secondary transparent pass to the material. Default value: [code]false[/code].  		</member>  		<member name="clearcoat_gloss" type="float" setter="set_clearcoat_gloss" getter="get_clearcoat_gloss">  		</member> @@ -43,6 +50,7 @@  		<member name="depth_deep_parallax" type="bool" setter="set_depth_deep_parallax" getter="is_depth_deep_parallax_enabled">  		</member>  		<member name="depth_enabled" type="bool" setter="set_feature" getter="get_feature"> +			If [code]true[/code] Depth mapping is enabled. See also [member normal_enabled].  		</member>  		<member name="depth_max_layers" type="int" setter="set_depth_deep_parallax_max_layers" getter="get_depth_deep_parallax_max_layers">  		</member> @@ -71,10 +79,13 @@  		<member name="distance_fade_mode" type="int" setter="set_distance_fade" getter="get_distance_fade" enum="SpatialMaterial.DistanceFadeMode">  		</member>  		<member name="emission" type="Color" setter="set_emission" getter="get_emission"> +			The emitted light's color. See [member emission_enabled].  		</member>  		<member name="emission_enabled" type="bool" setter="set_feature" getter="get_feature"> +			If [code]true[/code] the body emits light.  		</member>  		<member name="emission_energy" type="float" setter="set_emission_energy" getter="get_emission_energy"> +			The emitted light's strength. See [member emission_enabled].  		</member>  		<member name="emission_on_uv2" type="bool" setter="set_flag" getter="get_flag">  		</member> @@ -85,36 +96,49 @@  		<member name="flags_albedo_tex_force_srgb" type="bool" setter="set_flag" getter="get_flag">  		</member>  		<member name="flags_disable_ambient_light" type="bool" setter="set_flag" getter="get_flag"> +			If [code]true[/code] the object receives no ambient light. Default value: [code]false[/code].  		</member>  		<member name="flags_do_not_receive_shadows" type="bool" setter="set_flag" getter="get_flag"> +			If [code]true[/code] the object receives no shadow that would otherwise be cast onto it. Default value: [code]false[/code].  		</member>  		<member name="flags_ensure_correct_normals" type="bool" setter="set_flag" getter="get_flag">  		</member>  		<member name="flags_fixed_size" type="bool" setter="set_flag" getter="get_flag"> +			If [code]true[/code] the object is rendered at the same size regardless of distance. Default value: [code]false[/code].  		</member>  		<member name="flags_no_depth_test" type="bool" setter="set_flag" getter="get_flag"> +			If [code]true[/code] depth testing is disabled and the object will be drawn in render order.  		</member>  		<member name="flags_transparent" type="bool" setter="set_feature" getter="get_feature"> +			If [code]true[/code] transparency is enabled on the body. Default value: [code]false[/code]. See also [member params_blend_mode].  		</member>  		<member name="flags_unshaded" type="bool" setter="set_flag" getter="get_flag"> +			If [code]true[/code] the object is unaffected by lighting. Default value: [code]false[/code].  		</member>  		<member name="flags_use_point_size" type="bool" setter="set_flag" getter="get_flag"> +			If [code]true[/code] render point size can be changed. Note: this is only effective for objects whose geometry is point-based rather than triangle-based. See also [member params_point_size].  		</member>  		<member name="flags_vertex_lighting" type="bool" setter="set_flag" getter="get_flag"> +			If [code]true[/code] lighting is calculated per vertex rather than per pixel. This may increase performance on low-end devices. Default value: [code]false[/code].  		</member>  		<member name="flags_world_triplanar" type="bool" setter="set_flag" getter="get_flag"> +			If [code]true[/code] triplanar mapping is calculated in world space rather than object local space. See also [member uv1_triplanar]. Default value: [code]false[/code].  		</member>  		<member name="metallic" type="float" setter="set_metallic" getter="get_metallic"> +			The reflectivity of the object's surface. The higher the value the more light is reflected.  		</member>  		<member name="metallic_specular" type="float" setter="set_specular" getter="get_specular"> +			General reflectivity amount. Note: unlike [member metallic], this is not energy-conserving, so it should be left at [code]0.5[/code] in most cases.  See also [member roughness].  		</member>  		<member name="metallic_texture" type="Texture" setter="set_texture" getter="get_texture">  		</member>  		<member name="metallic_texture_channel" type="int" setter="set_metallic_texture_channel" getter="get_metallic_texture_channel" enum="SpatialMaterial.TextureChannel">  		</member>  		<member name="normal_enabled" type="bool" setter="set_feature" getter="get_feature"> +			If [code]true[/code] normal mapping is enabled.  		</member>  		<member name="normal_scale" type="float" setter="set_normal_scale" getter="get_normal_scale"> +			The strength of the normal map's effect.  		</member>  		<member name="normal_texture" type="Texture" setter="set_texture" getter="get_texture">  		</member> @@ -123,40 +147,55 @@  		<member name="params_billboard_keep_scale" type="bool" setter="set_flag" getter="get_flag">  		</member>  		<member name="params_billboard_mode" type="int" setter="set_billboard_mode" getter="get_billboard_mode" enum="SpatialMaterial.BillboardMode"> +			Controls how the object faces the camera. See [enum BillboardMode].  		</member>  		<member name="params_blend_mode" type="int" setter="set_blend_mode" getter="get_blend_mode" enum="SpatialMaterial.BlendMode"> +			The material's blend mode. Note that values other than [code]Mix[/code] force the object into the transparent pipeline. See [enum BlendMode].  		</member>  		<member name="params_cull_mode" type="int" setter="set_cull_mode" getter="get_cull_mode" enum="SpatialMaterial.CullMode"> +			Which side of the object is not drawn when backfaces are rendered. See [enum CullMode].  		</member>  		<member name="params_depth_draw_mode" type="int" setter="set_depth_draw_mode" getter="get_depth_draw_mode" enum="SpatialMaterial.DepthDrawMode"> +			Determines when depth rendering takes place. See [enum DepthDrawMode]. See also [member flags_transparent].  		</member>  		<member name="params_diffuse_mode" type="int" setter="set_diffuse_mode" getter="get_diffuse_mode" enum="SpatialMaterial.DiffuseMode"> +			The algorithm used for diffuse light scattering. See [enum DiffuseMode].  		</member>  		<member name="params_grow" type="bool" setter="set_grow_enabled" getter="is_grow_enabled"> +			If [code]true[/code] enables the vertex grow setting. See [member params_grow_amount].  		</member>  		<member name="params_grow_amount" type="float" setter="set_grow" getter="get_grow"> +			Grows object vertices in the direction of their normals.  		</member>  		<member name="params_line_width" type="float" setter="set_line_width" getter="get_line_width">  		</member>  		<member name="params_point_size" type="float" setter="set_point_size" getter="get_point_size"> +			The point size in pixels. See [member flags_use_point_size].  		</member>  		<member name="params_specular_mode" type="int" setter="set_specular_mode" getter="get_specular_mode" enum="SpatialMaterial.SpecularMode"> +			The method for rendering the specular blob. See [enum SpecularMode].  		</member>  		<member name="params_use_alpha_scissor" type="bool" setter="set_flag" getter="get_flag">  		</member>  		<member name="particles_anim_h_frames" type="int" setter="set_particles_anim_h_frames" getter="get_particles_anim_h_frames"> +			The number of horizontal frames in the particle spritesheet. Only enabled when using [code]BillboardMode.BILLBOARD_PARTICLES[/code]. See [member params_billboard_mode].  		</member>  		<member name="particles_anim_loop" type="int" setter="set_particles_anim_loop" getter="get_particles_anim_loop"> +			If [code]true[/code] particle animations are looped. Only enabled when using [code]BillboardMode.BILLBOARD_PARTICLES[/code]. See [member params_billboard_mode].  		</member>  		<member name="particles_anim_v_frames" type="int" setter="set_particles_anim_v_frames" getter="get_particles_anim_v_frames"> +			The number of vertical frames in the particle spritesheet. Only enabled when using [code]BillboardMode.BILLBOARD_PARTICLES[/code]. See [member params_billboard_mode].  		</member>  		<member name="proximity_fade_distance" type="float" setter="set_proximity_fade_distance" getter="get_proximity_fade_distance">  		</member>  		<member name="proximity_fade_enable" type="bool" setter="set_proximity_fade" getter="is_proximity_fade_enabled"> +			If [code]true[/code] the proximity and distance fade effect is enabled. Default value: [code]false[/code].  		</member>  		<member name="refraction_enabled" type="bool" setter="set_feature" getter="get_feature"> +			If [code]true[/code] the refraction effect is enabled. Distorts transparency based on light from behind the object. Default value: [code]false[/code].  		</member>  		<member name="refraction_scale" type="float" setter="set_refraction" getter="get_refraction"> +			The strength of the refraction effect.  		</member>  		<member name="refraction_texture" type="Texture" setter="set_texture" getter="get_texture">  		</member> @@ -165,26 +204,33 @@  		<member name="rim" type="float" setter="set_rim" getter="get_rim">  		</member>  		<member name="rim_enabled" type="bool" setter="set_feature" getter="get_feature"> +			If [code]true[/code] rim effect is enabled. Default value: [code]false[/code].  		</member>  		<member name="rim_texture" type="Texture" setter="set_texture" getter="get_texture">  		</member>  		<member name="rim_tint" type="float" setter="set_rim_tint" getter="get_rim_tint"> +			The amount of to blend light and albedo color when rendering rim effect. If [code]0[/code] the light color is used, while [code]1[/code] means albedo color is used. An intermediate value generally works best.  		</member>  		<member name="roughness" type="float" setter="set_roughness" getter="get_roughness"> +			Surface reflection. A value of [code]0[/code] represents a perfect mirror while a value of [code]1[/code] completely blurs the reflection. See also [member metallic].  		</member>  		<member name="roughness_texture" type="Texture" setter="set_texture" getter="get_texture">  		</member>  		<member name="roughness_texture_channel" type="int" setter="set_roughness_texture_channel" getter="get_roughness_texture_channel" enum="SpatialMaterial.TextureChannel">  		</member>  		<member name="subsurf_scatter_enabled" type="bool" setter="set_feature" getter="get_feature"> +			If [code]true[/code] subsurface scattering is enabled. Emulates light that penetrates an object's surface, is scattered, and then emerges.  		</member>  		<member name="subsurf_scatter_strength" type="float" setter="set_subsurface_scattering_strength" getter="get_subsurface_scattering_strength"> +			The strength of the subsurface scattering effect.  		</member>  		<member name="subsurf_scatter_texture" type="Texture" setter="set_texture" getter="get_texture">  		</member>  		<member name="transmission" type="Color" setter="set_transmission" getter="get_transmission"> +			The color used by the transmission effect. Represents the light passing through an object.  		</member>  		<member name="transmission_enabled" type="bool" setter="set_feature" getter="get_feature"> +			If [code]true[/code] the transmission effect is enabled. Default value: [code]false[/code].  		</member>  		<member name="transmission_texture" type="Texture" setter="set_texture" getter="get_texture">  		</member> @@ -205,8 +251,10 @@  		<member name="uv2_triplanar_sharpness" type="float" setter="set_uv2_triplanar_blend_sharpness" getter="get_uv2_triplanar_blend_sharpness">  		</member>  		<member name="vertex_color_is_srgb" type="bool" setter="set_flag" getter="get_flag"> +			If [code]true[/code] the model's vertex colors are processed as sRGB mode. Default value: [code]false[/code].  		</member>  		<member name="vertex_color_use_as_albedo" type="bool" setter="set_flag" getter="get_flag"> +			If [code]true[/code] the vertex color is used as albedo color. Default value: [code]false[/code].  		</member>  	</members>  	<constants> @@ -275,6 +323,7 @@  		<constant name="FEATURE_MAX" value="12" enum="Feature">  		</constant>  		<constant name="BLEND_MODE_MIX" value="0" enum="BlendMode"> +			Default blend mode.  		</constant>  		<constant name="BLEND_MODE_ADD" value="1" enum="BlendMode">  		</constant> @@ -283,18 +332,25 @@  		<constant name="BLEND_MODE_MUL" value="3" enum="BlendMode">  		</constant>  		<constant name="DEPTH_DRAW_OPAQUE_ONLY" value="0" enum="DepthDrawMode"> +			Default depth draw mode. Depth is drawn only for opaque objects.  		</constant>  		<constant name="DEPTH_DRAW_ALWAYS" value="1" enum="DepthDrawMode"> +			Depth draw is calculated for both opaque and transparent objects.  		</constant>  		<constant name="DEPTH_DRAW_DISABLED" value="2" enum="DepthDrawMode"> +			No depth draw.  		</constant>  		<constant name="DEPTH_DRAW_ALPHA_OPAQUE_PREPASS" value="3" enum="DepthDrawMode"> +			For transparent objects, an opaque pass is made first with the opaque parts, then transparency is drawn.  		</constant>  		<constant name="CULL_BACK" value="0" enum="CullMode"> +			Default cull mode. The back of the object is culled when not visible.  		</constant>  		<constant name="CULL_FRONT" value="1" enum="CullMode"> +			The front of the object is culled when not visible.  		</constant>  		<constant name="CULL_DISABLED" value="2" enum="CullMode"> +			No culling is performed.  		</constant>  		<constant name="FLAG_UNSHADED" value="0" enum="Flags">  		</constant> @@ -335,32 +391,46 @@  		<constant name="FLAG_MAX" value="18" enum="Flags">  		</constant>  		<constant name="DIFFUSE_BURLEY" value="0" enum="DiffuseMode"> +			Default diffuse scattering algorithm.  		</constant>  		<constant name="DIFFUSE_LAMBERT" value="1" enum="DiffuseMode"> +			Diffuse scattering ignores roughness.  		</constant>  		<constant name="DIFFUSE_LAMBERT_WRAP" value="2" enum="DiffuseMode"> +			Extends Lambert to cover more than 90 degrees when roughness increases.  		</constant>  		<constant name="DIFFUSE_OREN_NAYAR" value="3" enum="DiffuseMode"> +			Attempts to use roughness to emulate microsurfacing.  		</constant>  		<constant name="DIFFUSE_TOON" value="4" enum="DiffuseMode"> +			Uses a hard cut for lighting, with smoothing affected by roughness.  		</constant>  		<constant name="SPECULAR_SCHLICK_GGX" value="0" enum="SpecularMode"> +			Default specular blob.  		</constant>  		<constant name="SPECULAR_BLINN" value="1" enum="SpecularMode"> +			Older specular algorithm, included for compatibility.  		</constant>  		<constant name="SPECULAR_PHONG" value="2" enum="SpecularMode"> +			Older specular algorithm, included for compatibility.  		</constant>  		<constant name="SPECULAR_TOON" value="3" enum="SpecularMode"> +			Toon blob which changes size based on roughness.  		</constant>  		<constant name="SPECULAR_DISABLED" value="4" enum="SpecularMode"> +			No specular blob.  		</constant>  		<constant name="BILLBOARD_DISABLED" value="0" enum="BillboardMode"> +			Default value.  		</constant>  		<constant name="BILLBOARD_ENABLED" value="1" enum="BillboardMode"> +			The object's z-axis will always face the camera.  		</constant>  		<constant name="BILLBOARD_FIXED_Y" value="2" enum="BillboardMode"> +			The object's x-axis will always face the camera.  		</constant>  		<constant name="BILLBOARD_PARTICLES" value="3" enum="BillboardMode"> +			Used for particle systems. Enables particle animation options.  		</constant>  		<constant name="TEXTURE_CHANNEL_RED" value="0" enum="TextureChannel">  		</constant> diff --git a/drivers/gles2/shaders/scene.glsl b/drivers/gles2/shaders/scene.glsl index fae010b003..7b57f5d497 100644 --- a/drivers/gles2/shaders/scene.glsl +++ b/drivers/gles2/shaders/scene.glsl @@ -75,12 +75,12 @@ attribute highp vec4 instance_custom_data; // attrib:12  // uniforms  // -uniform mat4 camera_matrix; -uniform mat4 camera_inverse_matrix; -uniform mat4 projection_matrix; -uniform mat4 projection_inverse_matrix; +uniform highp mat4 camera_matrix; +uniform highp mat4 camera_inverse_matrix; +uniform highp mat4 projection_matrix; +uniform highp mat4 projection_inverse_matrix; -uniform mat4 world_transform; +uniform highp mat4 world_transform;  uniform highp float time; @@ -156,22 +156,22 @@ varying highp vec3 diffuse_interp;  varying highp vec3 specular_interp;  // general for all lights -uniform vec4 light_color; -uniform float light_specular; +uniform highp vec4 light_color; +uniform highp float light_specular;  // directional -uniform vec3 light_direction; +uniform highp vec3 light_direction;  // omni -uniform vec3 light_position; +uniform highp vec3 light_position; -uniform float light_range; -uniform float light_attenuation; +uniform highp float light_range; +uniform highp float light_attenuation;  // spot -uniform float light_spot_attenuation; -uniform float light_spot_range; -uniform float light_spot_angle; +uniform highp float light_spot_attenuation; +uniform highp float light_spot_range; +uniform highp float light_spot_angle;  void light_compute(  		vec3 N, @@ -262,9 +262,9 @@ void light_compute(  #ifdef USE_REFLECTION_PROBE1 -uniform mat4 refprobe1_local_matrix; +uniform highp mat4 refprobe1_local_matrix;  varying mediump vec4 refprobe1_reflection_normal_blend; -uniform vec3 refprobe1_box_extents; +uniform highp vec3 refprobe1_box_extents;  #ifndef USE_LIGHTMAP  varying mediump vec3 refprobe1_ambient_normal; @@ -274,9 +274,9 @@ varying mediump vec3 refprobe1_ambient_normal;  #ifdef USE_REFLECTION_PROBE2 -uniform mat4 refprobe2_local_matrix; +uniform highp mat4 refprobe2_local_matrix;  varying mediump vec4 refprobe2_reflection_normal_blend; -uniform vec3 refprobe2_box_extents; +uniform highp vec3 refprobe2_box_extents;  #ifndef USE_LIGHTMAP  varying mediump vec3 refprobe2_ambient_normal; @@ -310,7 +310,6 @@ uniform highp float fog_height_max;  uniform mediump float fog_height_curve;  #endif -  #endif //fog  void main() { @@ -625,19 +624,19 @@ VERTEX_SHADER_CODE  	{ -	    float fog_z = smoothstep(fog_depth_begin, fog_max_distance, length(vertex)); +		float fog_z = smoothstep(fog_depth_begin, fog_max_distance, length(vertex)); -	    fog_amount = pow(fog_z, fog_depth_curve); +		fog_amount = pow(fog_z, fog_depth_curve);  	}  #endif  #ifdef FOG_HEIGHT_ENABLED  	{ -	    float y = (camera_matrix * vec4(vertex_interp, 1.0)).y; -	    fog_amount = max(fog_amount, pow(smoothstep(fog_height_min, fog_height_max, y), fog_height_curve)); +		float y = (camera_matrix * vec4(vertex_interp, 1.0)).y; +		fog_amount = max(fog_amount, pow(smoothstep(fog_height_min, fog_height_max, y), fog_height_curve));  	}  #endif -	fog_interp = vec4(fog_color,fog_amount); +	fog_interp = vec4(fog_color, fog_amount);  #endif //fog @@ -671,13 +670,13 @@ precision highp int;  // uniforms  // -uniform mat4 camera_matrix; +uniform highp mat4 camera_matrix;  /* clang-format on */ -uniform mat4 camera_inverse_matrix; -uniform mat4 projection_matrix; -uniform mat4 projection_inverse_matrix; +uniform highp mat4 camera_inverse_matrix; +uniform highp mat4 projection_matrix; +uniform highp mat4 projection_inverse_matrix; -uniform mat4 world_transform; +uniform highp mat4 world_transform;  uniform highp float time; @@ -704,9 +703,9 @@ varying mediump vec3 refprobe1_ambient_normal;  #else  uniform bool refprobe1_use_box_project; -uniform vec3 refprobe1_box_extents; +uniform highp vec3 refprobe1_box_extents;  uniform vec3 refprobe1_box_offset; -uniform mat4 refprobe1_local_matrix; +uniform highp mat4 refprobe1_local_matrix;  #endif //use vertex lighting @@ -731,9 +730,9 @@ varying mediump vec3 refprobe2_ambient_normal;  #else  uniform bool refprobe2_use_box_project; -uniform vec3 refprobe2_box_extents; +uniform highp vec3 refprobe2_box_extents;  uniform vec3 refprobe2_box_offset; -uniform mat4 refprobe2_local_matrix; +uniform highp mat4 refprobe2_local_matrix;  #endif //use vertex lighting @@ -874,29 +873,29 @@ uniform float ambient_energy;  varying highp vec3 diffuse_interp;  varying highp vec3 specular_interp; -uniform vec3 light_direction; //may be used by fog, so leave here +uniform highp vec3 light_direction; //may be used by fog, so leave here  #else  //done in fragment  // general for all lights -uniform vec4 light_color; -uniform float light_specular; +uniform highp vec4 light_color; +uniform highp float light_specular;  // directional -uniform vec3 light_direction; +uniform highp vec3 light_direction;  // omni -uniform vec3 light_position; +uniform highp vec3 light_position; -uniform float light_attenuation; +uniform highp float light_attenuation;  // spot -uniform float light_spot_attenuation; -uniform float light_spot_range; -uniform float light_spot_angle; +uniform highp float light_spot_attenuation; +uniform highp float light_spot_range; +uniform highp float light_spot_angle;  #endif  //this is needed outside above if because dual paraboloid wants it -uniform float light_range; +uniform highp float light_range;  #ifdef USE_SHADOW @@ -2021,8 +2020,8 @@ FRAGMENT_SHADER_CODE  #if defined(USE_VERTEX_LIGHTING) -	gl_FragColor.rgb = mix(gl_FragColor.rgb,fog_interp.rgb,fog_interp.a); -#else	//pixel based fog +	gl_FragColor.rgb = mix(gl_FragColor.rgb, fog_interp.rgb, fog_interp.a); +#else //pixel based fog  	float fog_amount = 0.0;  #ifdef LIGHT_MODE_DIRECTIONAL @@ -2036,26 +2035,26 @@ FRAGMENT_SHADER_CODE  	{ -	    float fog_z = smoothstep(fog_depth_begin, fog_max_distance, length(vertex)); +		float fog_z = smoothstep(fog_depth_begin, fog_max_distance, length(vertex)); -	    fog_amount = pow(fog_z, fog_depth_curve); +		fog_amount = pow(fog_z, fog_depth_curve); -	    if (fog_transmit_enabled) { -		vec3 total_light = gl_FragColor.rgb; -		float transmit = pow(fog_z, fog_transmit_curve); -		fog_color = mix(max(total_light, fog_color), fog_color, transmit); -	    } +		if (fog_transmit_enabled) { +			vec3 total_light = gl_FragColor.rgb; +			float transmit = pow(fog_z, fog_transmit_curve); +			fog_color = mix(max(total_light, fog_color), fog_color, transmit); +		}  	}  #endif  #ifdef FOG_HEIGHT_ENABLED  	{ -	    float y = (camera_matrix * vec4(vertex, 1.0)).y; -	    fog_amount = max(fog_amount, pow(smoothstep(fog_height_min, fog_height_max, y), fog_height_curve)); +		float y = (camera_matrix * vec4(vertex, 1.0)).y; +		fog_amount = max(fog_amount, pow(smoothstep(fog_height_min, fog_height_max, y), fog_height_curve));  	}  #endif -	gl_FragColor.rgb = mix(gl_FragColor.rgb,fog_color,fog_amount); +	gl_FragColor.rgb = mix(gl_FragColor.rgb, fog_color, fog_amount);  #endif //use vertex lit diff --git a/editor/plugins/spatial_editor_plugin.cpp b/editor/plugins/spatial_editor_plugin.cpp index 76928b1087..f57614b3b3 100644 --- a/editor/plugins/spatial_editor_plugin.cpp +++ b/editor/plugins/spatial_editor_plugin.cpp @@ -534,9 +534,9 @@ void SpatialEditorViewport::_update_name() {  	String view_mode = orthogonal ? TTR("Orthogonal") : TTR("Perspective");  	if (name != "") -		view_menu->set_text("[ " + name + " " + view_mode + " ]"); +		view_menu->set_text(name + " " + view_mode);  	else -		view_menu->set_text("[ " + view_mode + " ]"); +		view_menu->set_text(view_mode);  	view_menu->set_size(Vector2(0, 0)); // resets the button size  } @@ -2260,6 +2260,12 @@ void SpatialEditorViewport::_notification(int p_what) {  		surface->connect("mouse_exited", this, "_surface_mouse_exit");  		surface->connect("focus_entered", this, "_surface_focus_enter");  		surface->connect("focus_exited", this, "_surface_focus_exit"); +		view_menu->set_flat(false); +		view_menu->add_style_override("normal", editor->get_gui_base()->get_stylebox("Information3dViewport", "EditorStyles")); +		view_menu->add_style_override("hover", editor->get_gui_base()->get_stylebox("Information3dViewport", "EditorStyles")); +		view_menu->add_style_override("pressed", editor->get_gui_base()->get_stylebox("Information3dViewport", "EditorStyles")); +		view_menu->add_style_override("focus", editor->get_gui_base()->get_stylebox("Information3dViewport", "EditorStyles")); +		view_menu->add_style_override("disabled", editor->get_gui_base()->get_stylebox("Information3dViewport", "EditorStyles"));  		info_label->add_style_override("normal", editor->get_gui_base()->get_stylebox("Information3dViewport", "EditorStyles"));  		fps_label->add_style_override("normal", editor->get_gui_base()->get_stylebox("Information3dViewport", "EditorStyles"));  		cinema_label->add_style_override("normal", editor->get_gui_base()->get_stylebox("Information3dViewport", "EditorStyles")); @@ -3421,7 +3427,6 @@ SpatialEditorViewport::SpatialEditorViewport(SpatialEditor *p_spatial_editor, Ed  	view_menu = memnew(MenuButton);  	surface->add_child(view_menu);  	view_menu->set_position(Point2(4, 4) * EDSCALE); -	view_menu->set_self_modulate(Color(1, 1, 1, 0.5));  	view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/top_view"), VIEW_TOP);  	view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/bottom_view"), VIEW_BOTTOM);  	view_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("spatial_editor/left_view"), VIEW_LEFT); diff --git a/modules/mono/glue/nodepath_glue.cpp b/modules/mono/glue/nodepath_glue.cpp index 4b7648a4f9..422d73104d 100644 --- a/modules/mono/glue/nodepath_glue.cpp +++ b/modules/mono/glue/nodepath_glue.cpp @@ -40,7 +40,7 @@ NodePath *godot_icall_NodePath_Ctor(MonoString *p_path) {  void godot_icall_NodePath_Dtor(NodePath *p_ptr) {  	ERR_FAIL_NULL(p_ptr); -	_GodotSharp::get_singleton()->queue_dispose(p_ptr); +	memdelete(p_ptr);  }  MonoString *godot_icall_NodePath_operator_String(NodePath *p_np) { diff --git a/modules/mono/glue/rid_glue.cpp b/modules/mono/glue/rid_glue.cpp index 5d66b8aa6f..6c002b5b9d 100644 --- a/modules/mono/glue/rid_glue.cpp +++ b/modules/mono/glue/rid_glue.cpp @@ -45,7 +45,7 @@ RID *godot_icall_RID_Ctor(Object *p_from) {  void godot_icall_RID_Dtor(RID *p_ptr) {  	ERR_FAIL_NULL(p_ptr); -	_GodotSharp::get_singleton()->queue_dispose(p_ptr); +	memdelete(p_ptr);  }  uint32_t godot_icall_RID_get_id(RID *p_ptr) { diff --git a/modules/mono/mono_gd/gd_mono.cpp b/modules/mono/mono_gd/gd_mono.cpp index bf5455de16..0c4433112d 100644 --- a/modules/mono/mono_gd/gd_mono.cpp +++ b/modules/mono/mono_gd/gd_mono.cpp @@ -671,14 +671,18 @@ Error GDMono::_unload_scripts_domain() {  	print_verbose("Mono: Unloading scripts domain..."); -	_GodotSharp::get_singleton()->_dispose_callback(); -  	if (mono_domain_get() != root_domain)  		mono_domain_set(root_domain, true);  	mono_gc_collect(mono_gc_max_generation()); -	mono_domain_finalize(scripts_domain, 2000); +	finalizing_scripts_domain = true; + +	if (!mono_domain_finalize(scripts_domain, 2000)) { +		ERR_PRINT("Mono: Domain finalization timeout"); +	} + +	finalizing_scripts_domain = false;  	mono_gc_collect(mono_gc_max_generation()); @@ -696,8 +700,6 @@ Error GDMono::_unload_scripts_domain() {  	MonoDomain *domain = scripts_domain;  	scripts_domain = NULL; -	_GodotSharp::get_singleton()->_dispose_callback(); -  	MonoException *exc = NULL;  	mono_domain_try_unload(domain, (MonoObject **)&exc); @@ -800,7 +802,9 @@ Error GDMono::finalize_and_unload_domain(MonoDomain *p_domain) {  		mono_domain_set(root_domain, true);  	mono_gc_collect(mono_gc_max_generation()); -	mono_domain_finalize(p_domain, 2000); +	if (!mono_domain_finalize(p_domain, 2000)) { +		ERR_PRINT("Mono: Domain finalization timeout"); +	}  	mono_gc_collect(mono_gc_max_generation());  	_domain_assemblies_cleanup(mono_domain_get_id(p_domain)); @@ -875,6 +879,7 @@ GDMono::GDMono() {  	gdmono_log = memnew(GDMonoLog);  	runtime_initialized = false; +	finalizing_scripts_domain = false;  	root_domain = NULL;  	scripts_domain = NULL; @@ -941,29 +946,6 @@ GDMono::~GDMono() {  _GodotSharp *_GodotSharp::singleton = NULL; -void _GodotSharp::_dispose_callback() { - -#ifndef NO_THREADS -	queue_mutex->lock(); -#endif - -	for (List<NodePath *>::Element *E = np_delete_queue.front(); E; E = E->next()) { -		memdelete(E->get()); -	} - -	for (List<RID *>::Element *E = rid_delete_queue.front(); E; E = E->next()) { -		memdelete(E->get()); -	} - -	np_delete_queue.clear(); -	rid_delete_queue.clear(); -	queue_empty = true; - -#ifndef NO_THREADS -	queue_mutex->unlock(); -#endif -} -  void _GodotSharp::attach_thread() {  	GDMonoUtils::attach_current_thread(); @@ -1012,6 +994,8 @@ bool _GodotSharp::is_domain_finalizing_for_unload(MonoDomain *p_domain) {  	if (!p_domain)  		return true; +	if (p_domain == SCRIPTS_DOMAIN && GDMono::get_singleton()->is_finalizing_scripts_domain()) +		return true;  	return mono_domain_is_unloading(p_domain);  } @@ -1025,49 +1009,6 @@ bool _GodotSharp::is_runtime_initialized() {  	return GDMono::get_singleton()->is_runtime_initialized();  } -#define ENQUEUE_FOR_DISPOSAL(m_queue, m_inst)                                                            \ -	m_queue.push_back(m_inst);                                                                           \ -	if (queue_empty) {                                                                                   \ -		queue_empty = false;                                                                             \ -		if (!is_domain_finalizing_for_unload(SCRIPTS_DOMAIN)) { /* call_deferred may not be safe here */ \ -			call_deferred("_dispose_callback");                                                          \ -		}                                                                                                \ -	} - -void _GodotSharp::queue_dispose(NodePath *p_node_path) { - -	if (GDMonoUtils::is_main_thread() && !is_domain_finalizing_for_unload(SCRIPTS_DOMAIN)) { -		memdelete(p_node_path); -	} else { -#ifndef NO_THREADS -		queue_mutex->lock(); -#endif - -		ENQUEUE_FOR_DISPOSAL(np_delete_queue, p_node_path); - -#ifndef NO_THREADS -		queue_mutex->unlock(); -#endif -	} -} - -void _GodotSharp::queue_dispose(RID *p_rid) { - -	if (GDMonoUtils::is_main_thread() && !is_domain_finalizing_for_unload(SCRIPTS_DOMAIN)) { -		memdelete(p_rid); -	} else { -#ifndef NO_THREADS -		queue_mutex->lock(); -#endif - -		ENQUEUE_FOR_DISPOSAL(rid_delete_queue, p_rid); - -#ifndef NO_THREADS -		queue_mutex->unlock(); -#endif -	} -} -  void _GodotSharp::_bind_methods() {  	ClassDB::bind_method(D_METHOD("attach_thread"), &_GodotSharp::attach_thread); @@ -1080,8 +1021,6 @@ void _GodotSharp::_bind_methods() {  	ClassDB::bind_method(D_METHOD("is_runtime_shutting_down"), &_GodotSharp::is_runtime_shutting_down);  	ClassDB::bind_method(D_METHOD("is_runtime_initialized"), &_GodotSharp::is_runtime_initialized); - -	ClassDB::bind_method(D_METHOD("_dispose_callback"), &_GodotSharp::_dispose_callback);  }  _GodotSharp::_GodotSharp() { diff --git a/modules/mono/mono_gd/gd_mono.h b/modules/mono/mono_gd/gd_mono.h index 97c2252f7c..745dcc34eb 100644 --- a/modules/mono/mono_gd/gd_mono.h +++ b/modules/mono/mono_gd/gd_mono.h @@ -172,6 +172,8 @@ public:  	_FORCE_INLINE_ bool is_runtime_initialized() const { return runtime_initialized && !mono_runtime_is_shutting_down() /* stays true after shutdown finished */; } +	_FORCE_INLINE_ bool is_finalizing_scripts_domain() { return finalizing_scripts_domain; } +  	_FORCE_INLINE_ MonoDomain *get_scripts_domain() { return scripts_domain; }  #ifdef TOOLS_ENABLED  	_FORCE_INLINE_ MonoDomain *get_tools_domain() { return tools_domain; } @@ -260,8 +262,6 @@ class _GodotSharp : public Object {  	friend class GDMono; -	void _dispose_callback(); -  	bool _is_domain_finalizing_for_unload(int32_t p_domain_id);  	List<NodePath *> np_delete_queue; @@ -295,9 +295,6 @@ public:  	bool is_runtime_shutting_down();  	bool is_runtime_initialized(); -	void queue_dispose(NodePath *p_node_path); -	void queue_dispose(RID *p_rid); -  	_GodotSharp();  	~_GodotSharp();  };  |