Browse Source

Several bugfixes, improving the import workflow

Juan Linietsky 8 years ago
parent
commit
6f2e16306a

+ 1 - 0
core/globals.cpp

@@ -125,6 +125,7 @@ bool GlobalConfig::_set(const StringName& p_name, const Variant& p_value) {
 
 
 	_THREAD_SAFE_METHOD_
 	_THREAD_SAFE_METHOD_
 
 
+
 	if (p_value.get_type()==Variant::NIL)
 	if (p_value.get_type()==Variant::NIL)
 		props.erase(p_name);
 		props.erase(p_name);
 	else {
 	else {

+ 26 - 29
core/image.cpp

@@ -245,7 +245,7 @@ void Image::_get_mipmap_offset_and_size(int p_mipmap,int &r_offset, int &r_width
 }
 }
 int Image::get_mipmap_offset(int p_mipmap) const {
 int Image::get_mipmap_offset(int p_mipmap) const {
 
 
-	ERR_FAIL_INDEX_V(p_mipmap,(mipmaps+1),-1);
+	ERR_FAIL_INDEX_V(p_mipmap,get_mipmap_count()+1,-1);
 
 
 	int ofs,w,h;
 	int ofs,w,h;
 	_get_mipmap_offset_and_size(p_mipmap,ofs,w,h);
 	_get_mipmap_offset_and_size(p_mipmap,ofs,w,h);
@@ -1011,7 +1011,7 @@ void Image::shrink_x2() {
 	}
 	}
 }
 }
 
 
-Error Image::generate_mipmaps(bool p_keep_existing)  {
+Error Image::generate_mipmaps()  {
 
 
 	if (!_can_modify(format)) {
 	if (!_can_modify(format)) {
 		ERR_EXPLAIN("Cannot generate mipmaps in indexed, compressed or custom image formats.");
 		ERR_EXPLAIN("Cannot generate mipmaps in indexed, compressed or custom image formats.");
@@ -1019,15 +1019,14 @@ Error Image::generate_mipmaps(bool p_keep_existing)  {
 
 
 	}
 	}
 
 
-	int mmcount = get_mipmap_count();
+	ERR_FAIL_COND_V(width==0 || height==0,ERR_UNCONFIGURED);
+
+	int mmcount;
 
 
-	int from_mm=1;
-	if (p_keep_existing) {
-		from_mm=mmcount+1;
-	}
 	int size = _get_dst_image_size(width,height,format,mmcount);
 	int size = _get_dst_image_size(width,height,format,mmcount);
 
 
 	data.resize(size);
 	data.resize(size);
+	print_line("to gen mipmaps w "+itos(width)+" h "+itos(height) +" format "+get_format_name(format)+" mipmaps " +itos(mmcount)+" new size is: "+itos(size));
 
 
 	PoolVector<uint8_t>::Write wp=data.write();
 	PoolVector<uint8_t>::Write wp=data.write();
 
 
@@ -1043,18 +1042,16 @@ Error Image::generate_mipmaps(bool p_keep_existing)  {
 			int ofs,w,h;
 			int ofs,w,h;
 			_get_mipmap_offset_and_size(i,ofs, w,h);
 			_get_mipmap_offset_and_size(i,ofs, w,h);
 
 
-			if (i>=from_mm) {
 
 
-				switch(format) {
+			switch(format) {
 
 
-					case FORMAT_L8:
-					case FORMAT_R8: _generate_po2_mipmap<1>(&wp[prev_ofs], &wp[ofs], prev_w,prev_h); break;
-					case FORMAT_LA8:
-					case FORMAT_RG8: _generate_po2_mipmap<2>(&wp[prev_ofs], &wp[ofs], prev_w,prev_h); break;
-					case FORMAT_RGB8: _generate_po2_mipmap<3>(&wp[prev_ofs], &wp[ofs], prev_w,prev_h); break;
-					case FORMAT_RGBA8: _generate_po2_mipmap<4>(&wp[prev_ofs], &wp[ofs], prev_w,prev_h); break;
-					default: {}
-				}
+				case FORMAT_L8:
+				case FORMAT_R8: _generate_po2_mipmap<1>(&wp[prev_ofs], &wp[ofs], prev_w,prev_h); break;
+				case FORMAT_LA8:
+				case FORMAT_RG8: _generate_po2_mipmap<2>(&wp[prev_ofs], &wp[ofs], prev_w,prev_h); break;
+				case FORMAT_RGB8: _generate_po2_mipmap<3>(&wp[prev_ofs], &wp[ofs], prev_w,prev_h); break;
+				case FORMAT_RGBA8: _generate_po2_mipmap<4>(&wp[prev_ofs], &wp[ofs], prev_w,prev_h); break;
+				default: {}
 			}
 			}
 
 
 			prev_ofs=ofs;
 			prev_ofs=ofs;
@@ -1077,18 +1074,15 @@ Error Image::generate_mipmaps(bool p_keep_existing)  {
 			int ofs,w,h;
 			int ofs,w,h;
 			_get_mipmap_offset_and_size(i,ofs, w,h);
 			_get_mipmap_offset_and_size(i,ofs, w,h);
 
 
-			if (i>=from_mm) {
-
-				switch(format) {
+			switch(format) {
 
 
-					case FORMAT_L8:
-					case FORMAT_R8: _scale_bilinear<1>(&wp[prev_ofs], &wp[ofs], prev_w,prev_h,w,h); break;
-					case FORMAT_LA8:
-					case FORMAT_RG8: _scale_bilinear<2>(&wp[prev_ofs], &wp[ofs], prev_w,prev_h,w,h); break;
-					case FORMAT_RGB8:_scale_bilinear<3>(&wp[prev_ofs], &wp[ofs], prev_w,prev_h,w,h); break;
-					case FORMAT_RGBA8: _scale_bilinear<4>(&wp[prev_ofs], &wp[ofs], prev_w,prev_h,w,h); break;
-					default: {}
-				}
+				case FORMAT_L8:
+				case FORMAT_R8: _scale_bilinear<1>(&wp[prev_ofs], &wp[ofs], prev_w,prev_h,w,h); break;
+				case FORMAT_LA8:
+				case FORMAT_RG8: _scale_bilinear<2>(&wp[prev_ofs], &wp[ofs], prev_w,prev_h,w,h); break;
+				case FORMAT_RGB8:_scale_bilinear<3>(&wp[prev_ofs], &wp[ofs], prev_w,prev_h,w,h); break;
+				case FORMAT_RGBA8: _scale_bilinear<4>(&wp[prev_ofs], &wp[ofs], prev_w,prev_h,w,h); break;
+				default: {}
 			}
 			}
 
 
 			prev_ofs=ofs;
 			prev_ofs=ofs;
@@ -1096,8 +1090,11 @@ Error Image::generate_mipmaps(bool p_keep_existing)  {
 			prev_h=h;
 			prev_h=h;
 		}
 		}
 
 
+
+
 	}
 	}
 
 
+	mipmaps=true;
 
 
 	return OK;
 	return OK;
 }
 }
@@ -1154,7 +1151,7 @@ void Image::create(int p_width, int p_height, bool p_use_mipmaps, Format p_forma
 	ERR_FAIL_INDEX(p_height-1,MAX_HEIGHT);
 	ERR_FAIL_INDEX(p_height-1,MAX_HEIGHT);
 
 
 	int mm;
 	int mm;
-	int size = _get_dst_image_size(p_width,p_height,p_format,mm,p_use_mipmaps);
+	int size = _get_dst_image_size(p_width,p_height,p_format,mm,p_use_mipmaps?-1:0);
 
 
 	if (size!=p_data.size()) {
 	if (size!=p_data.size()) {
 		ERR_EXPLAIN("Expected data size of "+itos(size)+" in Image::create()");
 		ERR_EXPLAIN("Expected data size of "+itos(size)+" in Image::create()");

+ 1 - 1
core/image.h

@@ -196,7 +196,7 @@ public:
 	/**
 	/**
 	 * Generate a mipmap to an image (creates an image 1/4 the size, with averaging of 4->1)
 	 * Generate a mipmap to an image (creates an image 1/4 the size, with averaging of 4->1)
 	 */
 	 */
-	Error generate_mipmaps(bool p_keep_existing=false);
+	Error generate_mipmaps();
 
 
 	void clear_mipmaps();
 	void clear_mipmaps();
 
 

+ 22 - 1
core/io/resource_import.cpp

@@ -1,5 +1,6 @@
 #include "resource_import.h"
 #include "resource_import.h"
 #include "variant_parser.h"
 #include "variant_parser.h"
+#include "os/os.h"
 
 
 Error ResourceFormatImporter::_get_path_and_type(const String& p_path, PathAndType &r_path_and_type) const {
 Error ResourceFormatImporter::_get_path_and_type(const String& p_path, PathAndType &r_path_and_type) const {
 
 
@@ -36,7 +37,13 @@ Error ResourceFormatImporter::_get_path_and_type(const String& p_path, PathAndTy
 		}
 		}
 
 
 		if (assign!=String()) {
 		if (assign!=String()) {
-			if (assign=="path") {
+			if (assign.begins_with("path.") && r_path_and_type.path==String()) {
+				String feature = assign.get_slicec('.',1);
+				if (OS::get_singleton()->check_feature_support(feature)) {
+					r_path_and_type.path=value;
+				}
+
+			} else if (assign=="path") {
 				r_path_and_type.path=value;
 				r_path_and_type.path=value;
 			} else if (assign=="type") {
 			} else if (assign=="type") {
 				r_path_and_type.type=value;
 				r_path_and_type.type=value;
@@ -154,6 +161,20 @@ bool ResourceFormatImporter::handles_type(const String& p_type) const {
 	return true;
 	return true;
 }
 }
 
 
+
+String ResourceFormatImporter::get_internal_resource_path(const String& p_path) const {
+
+	PathAndType pat;
+	Error err = _get_path_and_type(p_path,pat);
+
+	if (err!=OK) {
+
+		return String();
+	}
+
+	return pat.path;
+}
+
 String ResourceFormatImporter::get_resource_type(const String &p_path) const {
 String ResourceFormatImporter::get_resource_type(const String &p_path) const {
 
 
 	PathAndType pat;
 	PathAndType pat;

+ 1 - 0
core/io/resource_import.h

@@ -31,6 +31,7 @@ public:
 
 
 	virtual bool can_be_imported(const String& p_path) const;
 	virtual bool can_be_imported(const String& p_path) const;
 
 
+	String get_internal_resource_path(const String& p_path) const;
 
 
 	void add_importer(const Ref<ResourceImporter>& p_importer) { importers.insert(p_importer); }
 	void add_importer(const Ref<ResourceImporter>& p_importer) { importers.insert(p_importer); }
 	Ref<ResourceImporter> get_importer_by_name(const String& p_name);
 	Ref<ResourceImporter> get_importer_by_name(const String& p_name);

+ 2 - 0
core/os/os.h

@@ -403,6 +403,8 @@ public:
 	virtual void set_use_vsync(bool p_enable);
 	virtual void set_use_vsync(bool p_enable);
 	virtual bool is_vsync_enabled() const;
 	virtual bool is_vsync_enabled() const;
 
 
+	virtual bool check_feature_support(const String& p_feature)=0;
+
 	bool is_hidpi_allowed() const { return _allow_hidpi; }
 	bool is_hidpi_allowed() const { return _allow_hidpi; }
 	OS();
 	OS();
 	virtual ~OS();
 	virtual ~OS();

+ 22 - 3
drivers/gles3/rasterizer_scene_gles3.cpp

@@ -1081,6 +1081,18 @@ bool RasterizerSceneGLES3::_setup_material(RasterizerStorageGLES3::Material* p_m
 		state.current_line_width=p_material->line_width;
 		state.current_line_width=p_material->line_width;
 	}
 	}
 
 
+	if (state.current_depth_test!=(!p_material->shader->spatial.ontop)) {
+		if (p_material->shader->spatial.ontop) {
+			glDisable(GL_DEPTH_TEST);
+
+		} else {
+			glEnable(GL_DEPTH_TEST);
+
+		}
+
+		state.current_depth_test=!p_material->shader->spatial.ontop;
+	}
+
 	if (state.current_depth_draw!=p_material->shader->spatial.depth_draw_mode) {
 	if (state.current_depth_draw!=p_material->shader->spatial.depth_draw_mode) {
 		switch(p_material->shader->spatial.depth_draw_mode) {
 		switch(p_material->shader->spatial.depth_draw_mode) {
 			case RasterizerStorageGLES3::Shader::Spatial::DEPTH_DRAW_ALPHA_PREPASS:
 			case RasterizerStorageGLES3::Shader::Spatial::DEPTH_DRAW_ALPHA_PREPASS:
@@ -1204,6 +1216,11 @@ bool RasterizerSceneGLES3::_setup_material(RasterizerStorageGLES3::Material* p_m
 
 
 		} else {
 		} else {
 
 
+#ifdef TOOLS_ENABLED
+			if (t->detect_3d) {
+				t->detect_3d(t->detect_3d_ud);
+			}
+#endif
 			if (storage->config.srgb_decode_supported) {
 			if (storage->config.srgb_decode_supported) {
 				//if SRGB decode extension is present, simply switch the texture to whathever is needed
 				//if SRGB decode extension is present, simply switch the texture to whathever is needed
 				bool must_srgb=false;
 				bool must_srgb=false;
@@ -1216,9 +1233,8 @@ bool RasterizerSceneGLES3::_setup_material(RasterizerStorageGLES3::Material* p_m
 					if (must_srgb) {
 					if (must_srgb) {
 						glTexParameteri(t->target,_TEXTURE_SRGB_DECODE_EXT,_DECODE_EXT);
 						glTexParameteri(t->target,_TEXTURE_SRGB_DECODE_EXT,_DECODE_EXT);
 #ifdef TOOLS_ENABLED
 #ifdef TOOLS_ENABLED
-						if (!(t->flags&VS::TEXTURE_FLAG_CONVERT_TO_LINEAR)) {
-							t->flags|=VS::TEXTURE_FLAG_CONVERT_TO_LINEAR;
-							//notify that texture must be set to linear beforehand, so it works in other platforms when exported
+						if (t->detect_srgb) {
+							t->detect_srgb(t->detect_srgb_ud);
 						}
 						}
 #endif
 #endif
 
 
@@ -1714,6 +1730,9 @@ void RasterizerSceneGLES3::_render_list(RenderList::Element **p_elements,int p_e
 	state.cull_front=false;
 	state.cull_front=false;
 	glCullFace(GL_BACK);
 	glCullFace(GL_BACK);
 
 
+	state.current_depth_test=true;
+	glEnable(GL_DEPTH_TEST);
+
 	state.scene_shader.set_conditional(SceneShaderGLES3::USE_SKELETON,false);
 	state.scene_shader.set_conditional(SceneShaderGLES3::USE_SKELETON,false);
 
 
 	state.current_blend_mode=-1;
 	state.current_blend_mode=-1;

+ 1 - 0
drivers/gles3/rasterizer_scene_gles3.h

@@ -61,6 +61,7 @@ public:
 		int current_blend_mode;
 		int current_blend_mode;
 		float current_line_width;
 		float current_line_width;
 		int current_depth_draw;
 		int current_depth_draw;
+		bool current_depth_test;
 		GLuint current_main_tex;
 		GLuint current_main_tex;
 
 
 		SceneShaderGLES3 scene_shader;
 		SceneShaderGLES3 scene_shader;

+ 47 - 4
drivers/gles3/rasterizer_storage_gles3.cpp

@@ -218,7 +218,7 @@ Image RasterizerStorageGLES3::_get_gl_image_and_format(const Image& p_image, Ima
 			if (config.s3tc_supported) {
 			if (config.s3tc_supported) {
 
 
 
 
-				r_gl_internal_format=(config.srgb_decode_supported || p_flags&VS::TEXTURE_FLAG_CONVERT_TO_LINEAR)?_EXT_COMPRESSED_SRGB_ALPHA_S3TC_DXT1_NV:_EXT_COMPRESSED_RGBA_S3TC_DXT1_EXT;
+				r_gl_internal_format=(config.srgb_decode_supported || p_flags&VS::TEXTURE_FLAG_CONVERT_TO_LINEAR)?_EXT_COMPRESSED_SRGB_S3TC_DXT1_NV:_EXT_COMPRESSED_RGBA_S3TC_DXT1_EXT;
 				r_gl_format=GL_RGBA;
 				r_gl_format=GL_RGBA;
 				r_gl_type=GL_UNSIGNED_BYTE;
 				r_gl_type=GL_UNSIGNED_BYTE;
 				r_compressed=true;
 				r_compressed=true;
@@ -785,7 +785,7 @@ void RasterizerStorageGLES3::texture_set_data(RID p_texture,const Image& p_image
 
 
 		if (texture->compressed) {
 		if (texture->compressed) {
 			glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
 			glPixelStorei(GL_UNPACK_ALIGNMENT, 4);
-			glCompressedTexImage2D( blit_target, i, format,w,h,0,size,&read[ofs] );
+			glCompressedTexImage2D( blit_target, i, internal_format,w,h,0,size,&read[ofs] );
 
 
 		} else {
 		} else {
 			glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
 			glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
@@ -814,6 +814,10 @@ void RasterizerStorageGLES3::texture_set_data(RID p_texture,const Image& p_image
 	if (texture->flags&VS::TEXTURE_FLAG_MIPMAPS && mipmaps==1 && !texture->ignore_mipmaps && (!(texture->flags&VS::TEXTURE_FLAG_CUBEMAP) || texture->stored_cube_sides==(1<<6)-1)) {
 	if (texture->flags&VS::TEXTURE_FLAG_MIPMAPS && mipmaps==1 && !texture->ignore_mipmaps && (!(texture->flags&VS::TEXTURE_FLAG_CUBEMAP) || texture->stored_cube_sides==(1<<6)-1)) {
 		//generate mipmaps if they were requested and the image does not contain them
 		//generate mipmaps if they were requested and the image does not contain them
 		glGenerateMipmap(texture->target);
 		glGenerateMipmap(texture->target);
+	} else if (mipmaps>1) {
+		glTexParameteri(texture->target, GL_TEXTURE_BASE_LEVEL, 0);
+		glTexParameteri(texture->target, GL_TEXTURE_MAX_LEVEL, mipmaps-1);
+
 	}
 	}
 
 
 	texture->mipmaps=mipmaps;
 	texture->mipmaps=mipmaps;
@@ -1066,6 +1070,26 @@ void RasterizerStorageGLES3::textures_keep_original(bool p_enable) {
 	config.keep_original_textures=p_enable;
 	config.keep_original_textures=p_enable;
 }
 }
 
 
+void RasterizerStorageGLES3::texture_set_detect_3d_callback(RID p_texture,VisualServer::TextureDetectCallback p_callback,void* p_userdata) {
+
+	Texture * texture = texture_owner.get(p_texture);
+	ERR_FAIL_COND(!texture);
+
+	texture->detect_3d=p_callback;
+	texture->detect_3d_ud=p_userdata;
+}
+
+void RasterizerStorageGLES3::texture_set_detect_srgb_callback(RID p_texture,VisualServer::TextureDetectCallback p_callback,void* p_userdata){
+	Texture * texture = texture_owner.get(p_texture);
+	ERR_FAIL_COND(!texture);
+
+	texture->detect_srgb=p_callback;
+	texture->detect_srgb_ud=p_userdata;
+
+}
+
+
+
 RID RasterizerStorageGLES3::texture_create_radiance_cubemap(RID p_source,int p_resolution) const {
 RID RasterizerStorageGLES3::texture_create_radiance_cubemap(RID p_source,int p_resolution) const {
 
 
 	Texture * texture = texture_owner.get(p_source);
 	Texture * texture = texture_owner.get(p_source);
@@ -1515,12 +1539,12 @@ void RasterizerStorageGLES3::_update_shader(Shader* p_shader) const {
 			actions->uniforms=&p_shader->uniforms;
 			actions->uniforms=&p_shader->uniforms;
 
 
 
 
-		}
+		} break;
 		case VS::SHADER_PARTICLES: {
 		case VS::SHADER_PARTICLES: {
 
 
 			actions=&shaders.actions_particles;
 			actions=&shaders.actions_particles;
 			actions->uniforms=&p_shader->uniforms;
 			actions->uniforms=&p_shader->uniforms;
-		}
+		} break;
 
 
 	}
 	}
 
 
@@ -6294,6 +6318,25 @@ bool RasterizerStorageGLES3::free(RID p_rid){
 	return true;
 	return true;
 }
 }
 
 
+
+bool RasterizerStorageGLES3::has_os_feature(const String& p_feature) const {
+
+	if (p_feature=="s3tc")
+		return config.s3tc_supported;
+
+	if (p_feature=="etc")
+		return config.etc_supported;
+
+	if (p_feature=="etc2")
+		return config.etc2_supported;
+
+	if (p_feature=="pvrtc")
+		return config.pvrtc_supported;
+
+	return false;
+
+}
+
 ////////////////////////////////////////////
 ////////////////////////////////////////////
 
 
 
 

+ 15 - 0
drivers/gles3/rasterizer_storage_gles3.h

@@ -228,6 +228,12 @@ public:
 
 
 		Image images[6];
 		Image images[6];
 
 
+		VisualServer::TextureDetectCallback detect_3d;
+		void *detect_3d_ud;
+
+		VisualServer::TextureDetectCallback detect_srgb;
+		void *detect_srgb_ud;
+
 		Texture() {
 		Texture() {
 
 
 			using_srgb=false;
 			using_srgb=false;
@@ -243,6 +249,10 @@ public:
 			total_data_size=0;
 			total_data_size=0;
 			target=GL_TEXTURE_2D;
 			target=GL_TEXTURE_2D;
 			mipmaps=0;
 			mipmaps=0;
+			detect_3d=NULL;
+			detect_3d_ud=NULL;
+			detect_srgb=NULL;
+			detect_srgb_ud=NULL;
 
 
 		}
 		}
 
 
@@ -281,6 +291,10 @@ public:
 
 
 	virtual void textures_keep_original(bool p_enable);
 	virtual void textures_keep_original(bool p_enable);
 
 
+	virtual void texture_set_detect_3d_callback(RID p_texture,VisualServer::TextureDetectCallback p_callback,void* p_userdata);
+	virtual void texture_set_detect_srgb_callback(RID p_texture,VisualServer::TextureDetectCallback p_callback,void* p_userdata);
+
+
 	/* SKYBOX API */
 	/* SKYBOX API */
 
 
 	struct SkyBox : public RID_Data {
 	struct SkyBox : public RID_Data {
@@ -1237,6 +1251,7 @@ public:
 	void initialize();
 	void initialize();
 	void finalize();
 	void finalize();
 
 
+	virtual bool has_os_feature(const String& p_feature) const;
 
 
 
 
 	RasterizerStorageGLES3();
 	RasterizerStorageGLES3();

+ 1 - 0
drivers/gles3/shader_compiler_gles3.cpp

@@ -582,6 +582,7 @@ Error ShaderCompilerGLES3::compile(VS::ShaderMode p_mode, const String& p_code,
 
 
 	used_name_defines.clear();
 	used_name_defines.clear();
 	used_rmode_defines.clear();
 	used_rmode_defines.clear();
+	used_flag_pointers.clear();
 
 
 	_dump_node_code(parser.get_shader(),1,r_gen_code,*p_actions,actions[p_mode]);
 	_dump_node_code(parser.get_shader(),1,r_gen_code,*p_actions,actions[p_mode]);
 
 

+ 8 - 0
drivers/unix/os_unix.cpp

@@ -30,6 +30,7 @@
 
 
 #ifdef UNIX_ENABLED
 #ifdef UNIX_ENABLED
 
 
+#include "servers/visual_server.h"
 
 
 #include "thread_posix.h"
 #include "thread_posix.h"
 #include "semaphore_posix.h"
 #include "semaphore_posix.h"
@@ -478,6 +479,13 @@ String OS_Unix::get_data_dir() const {
 
 
 }
 }
 
 
+bool OS_Unix::check_feature_support(const String& p_feature) {
+
+	return VisualServer::get_singleton()->has_os_feature(p_feature);
+
+}
+
+
 String OS_Unix::get_installed_templates_path() const {
 String OS_Unix::get_installed_templates_path() const {
 	String p=get_global_settings_path();
 	String p=get_global_settings_path();
 	if (p!="")
 	if (p!="")

+ 2 - 0
drivers/unix/os_unix.h

@@ -117,6 +117,8 @@ public:
 	virtual String get_executable_path() const;
 	virtual String get_executable_path() const;
 	virtual String get_data_dir() const;
 	virtual String get_data_dir() const;
 
 
+	virtual bool check_feature_support(const String& p_feature);
+
 	//virtual void run( MainLoop * p_main_loop );
 	//virtual void run( MainLoop * p_main_loop );
 
 
 
 

+ 10 - 9
modules/etc1/image_etc.cpp

@@ -95,7 +95,7 @@ static void _decompress_etc(Image *p_img) {
 	//print_line("Re Creating ETC into regular image: w "+itos(p_img->get_width())+" h "+itos(p_img->get_height())+" mm "+itos(p_img->get_mipmaps()));
 	//print_line("Re Creating ETC into regular image: w "+itos(p_img->get_width())+" h "+itos(p_img->get_height())+" mm "+itos(p_img->get_mipmaps()));
 	*p_img=Image(p_img->get_width(),p_img->get_height(),p_img->has_mipmaps(),Image::FORMAT_RGB8,dst);
 	*p_img=Image(p_img->get_width(),p_img->get_height(),p_img->has_mipmaps(),Image::FORMAT_RGB8,dst);
 	if (p_img->has_mipmaps())
 	if (p_img->has_mipmaps())
-		p_img->generate_mipmaps(true);
+		p_img->generate_mipmaps();
 
 
 
 
 }
 }
@@ -112,16 +112,17 @@ static void _compress_etc(Image *p_img) {
 		img.convert(Image::FORMAT_RGB8);
 		img.convert(Image::FORMAT_RGB8);
 
 
 
 
-	int mmc=img.get_mipmap_count();
-	if (mmc==0)
-		img.generate_mipmaps(); // force mipmaps, so it works on most hardware
-
-
 	PoolVector<uint8_t> res_data;
 	PoolVector<uint8_t> res_data;
 	PoolVector<uint8_t> dst_data;
 	PoolVector<uint8_t> dst_data;
 	PoolVector<uint8_t>::Read r = img.get_data().read();
 	PoolVector<uint8_t>::Read r = img.get_data().read();
 
 
+	int target_size = Image::get_image_data_size(p_img->get_width(),p_img->get_height(),Image::FORMAT_ETC,p_img->has_mipmaps()?-1:0);
+	int mmc = p_img->has_mipmaps() ? Image::get_image_required_mipmaps(p_img->get_width(),p_img->get_height(),Image::FORMAT_ETC) : 0;
+
+	dst_data.resize(target_size);
 	int mc=0;
 	int mc=0;
+	int ofs=0;
+	PoolVector<uint8_t>::Write w=dst_data.write();
 
 
 
 
 	rg_etc1::etc1_pack_params pp;
 	rg_etc1::etc1_pack_params pp;
@@ -133,9 +134,9 @@ static void _compress_etc(Image *p_img) {
 		int bh=MAX(imgh/4,1);
 		int bh=MAX(imgh/4,1);
 		const uint8_t *src = &r[img.get_mipmap_offset(i)];
 		const uint8_t *src = &r[img.get_mipmap_offset(i)];
 		int mmsize = MAX(bw,1)*MAX(bh,1)*8;
 		int mmsize = MAX(bw,1)*MAX(bh,1)*8;
-		dst_data.resize(dst_data.size()+mmsize);
-		PoolVector<uint8_t>::Write w=dst_data.write();
-		uint8_t *dst = &w[dst_data.size()-mmsize];
+
+		uint8_t *dst = &w[ofs];
+		ofs+=mmsize;
 
 
 
 
 		//print_line("bh: "+itos(bh)+" bw: "+itos(bw));
 		//print_line("bh: "+itos(bh)+" bw: "+itos(bw));

+ 2 - 3
modules/squish/image_compress_squish.cpp

@@ -64,10 +64,9 @@ void image_compress_squish(Image *p_image) {
 
 
 	p_image->convert(Image::FORMAT_RGBA8); //always expects rgba
 	p_image->convert(Image::FORMAT_RGBA8); //always expects rgba
 
 
-	int mm_count = p_image->get_mipmap_count();
-
 	PoolVector<uint8_t> data;
 	PoolVector<uint8_t> data;
-	int target_size = Image::get_image_data_size(w,h,target_format,mm_count);
+	int target_size = Image::get_image_data_size(w,h,target_format,p_image->has_mipmaps()?-1:0);
+	int mm_count = p_image->has_mipmaps() ? Image::get_image_required_mipmaps(w,h,target_format) : 0;
 	data.resize(target_size);
 	data.resize(target_size);
 
 
 	PoolVector<uint8_t>::Read rb = p_image->get_data().read();
 	PoolVector<uint8_t>::Read rb = p_image->get_data().read();

+ 16 - 3
scene/3d/gi_probe.cpp

@@ -906,7 +906,7 @@ GIProbe::Baker::MaterialCache GIProbe::_get_material_cache(Ref<Material> p_mater
 
 
 }
 }
 
 
-void GIProbe::_plot_mesh(const Transform& p_xform, Ref<Mesh>& p_mesh, Baker *p_baker) {
+void GIProbe::_plot_mesh(const Transform& p_xform, Ref<Mesh>& p_mesh, Baker *p_baker, const Vector<Ref<Material> > &p_materials, const Ref<Material> &p_override_material) {
 
 
 
 
 	for(int i=0;i<p_mesh->get_surface_count();i++) {
 	for(int i=0;i<p_mesh->get_surface_count();i++) {
@@ -914,7 +914,16 @@ void GIProbe::_plot_mesh(const Transform& p_xform, Ref<Mesh>& p_mesh, Baker *p_b
 		if (p_mesh->surface_get_primitive_type(i)!=Mesh::PRIMITIVE_TRIANGLES)
 		if (p_mesh->surface_get_primitive_type(i)!=Mesh::PRIMITIVE_TRIANGLES)
 			continue; //only triangles
 			continue; //only triangles
 
 
-		Baker::MaterialCache material = _get_material_cache(p_mesh->surface_get_material(i),p_baker);
+		Ref<Material> src_material;
+
+		if (p_override_material.is_valid()) {
+			src_material=p_override_material;
+		} else if (i<p_materials.size() && p_materials[i].is_valid()) {
+			src_material=p_materials[i];
+		} else {
+			src_material=p_mesh->surface_get_material(i);
+		}
+		Baker::MaterialCache material = _get_material_cache(src_material,p_baker);
 
 
 		Array a = p_mesh->surface_get_arrays(i);
 		Array a = p_mesh->surface_get_arrays(i);
 
 
@@ -1009,6 +1018,10 @@ void GIProbe::_find_meshes(Node *p_at_node,Baker *p_baker){
 				Baker::PlotMesh pm;
 				Baker::PlotMesh pm;
 				pm.local_xform=xf;
 				pm.local_xform=xf;
 				pm.mesh=mesh;
 				pm.mesh=mesh;
+				for(int i=0;i<mesh->get_surface_count();i++) {
+					pm.instance_materials.push_back(mi->get_surface_material(i));
+				}
+				pm.override_material=mi->get_material_override();
 				p_baker->mesh_list.push_back(pm);
 				p_baker->mesh_list.push_back(pm);
 
 
 			}
 			}
@@ -1083,7 +1096,7 @@ void GIProbe::bake(Node *p_from_node, bool p_create_visual_debug){
 
 
 		print_line("plotting mesh "+itos(pmc++)+"/"+itos(baker.mesh_list.size()));
 		print_line("plotting mesh "+itos(pmc++)+"/"+itos(baker.mesh_list.size()));
 
 
-		_plot_mesh(E->get().local_xform,E->get().mesh,&baker);
+		_plot_mesh(E->get().local_xform,E->get().mesh,&baker,E->get().instance_materials,E->get().override_material);
 	}
 	}
 
 
 	_fixup_plot(0,0,0,0,0,&baker);
 	_fixup_plot(0,0,0,0,0,&baker);

+ 3 - 1
scene/3d/gi_probe.h

@@ -114,6 +114,8 @@ private:
 		int axis_cell_size[3];
 		int axis_cell_size[3];
 
 
 		struct PlotMesh {
 		struct PlotMesh {
+			Ref<Material> override_material;
+			Vector<Ref<Material> > instance_materials;
 			Ref<Mesh> mesh;
 			Ref<Mesh> mesh;
 			Transform local_xform;
 			Transform local_xform;
 		};
 		};
@@ -141,7 +143,7 @@ private:
 	Vector<Color> _get_bake_texture(Image &p_image,const Color& p_color);
 	Vector<Color> _get_bake_texture(Image &p_image,const Color& p_color);
 	Baker::MaterialCache _get_material_cache(Ref<Material> p_material,Baker *p_baker);
 	Baker::MaterialCache _get_material_cache(Ref<Material> p_material,Baker *p_baker);
 	void _plot_face(int p_idx, int p_level, int p_x,int p_y,int p_z,const Vector3 *p_vtx, const Vector2* p_uv, const Baker::MaterialCache& p_material, const Rect3 &p_aabb,Baker *p_baker);
 	void _plot_face(int p_idx, int p_level, int p_x,int p_y,int p_z,const Vector3 *p_vtx, const Vector2* p_uv, const Baker::MaterialCache& p_material, const Rect3 &p_aabb,Baker *p_baker);
-	void _plot_mesh(const Transform& p_xform, Ref<Mesh>& p_mesh, Baker *p_baker);
+	void _plot_mesh(const Transform& p_xform, Ref<Mesh>& p_mesh, Baker *p_baker,const Vector<Ref<Material> >& p_materials,const Ref<Material>& p_override_material);
 	void _find_meshes(Node *p_at_node,Baker *p_baker);
 	void _find_meshes(Node *p_at_node,Baker *p_baker);
 	void _fixup_plot(int p_idx, int p_level,int p_x,int p_y, int p_z,Baker *p_baker);
 	void _fixup_plot(int p_idx, int p_level,int p_x,int p_y, int p_z,Baker *p_baker);
 
 

+ 44 - 0
scene/resources/texture.cpp

@@ -456,6 +456,26 @@ ImageTexture::~ImageTexture() {
 //////////////////////////////////////////
 //////////////////////////////////////////
 
 
 
 
+void StreamTexture::_requested_3d(void* p_ud) {
+
+	StreamTexture *st = (StreamTexture *)p_ud;
+	Ref<StreamTexture> stex(st);
+	ERR_FAIL_COND(!request_3d_callback);
+	request_3d_callback(stex);
+}
+
+void StreamTexture::_requested_srgb(void* p_ud) {
+
+	StreamTexture *st = (StreamTexture *)p_ud;
+	Ref<StreamTexture> stex(st);
+	ERR_FAIL_COND(!request_srgb_callback);
+	request_srgb_callback(stex);
+
+}
+
+StreamTexture::TextureFormatRequestCallback StreamTexture::request_3d_callback=NULL;
+StreamTexture::TextureFormatRequestCallback StreamTexture::request_srgb_callback=NULL;
+
 
 
 uint32_t StreamTexture::get_flags() const {
 uint32_t StreamTexture::get_flags() const {
 
 
@@ -490,6 +510,23 @@ Error StreamTexture::_load_data(const String& p_path,int &tw,int &th,int& flags,
 	print_line("flags: "+itos(flags));
 	print_line("flags: "+itos(flags));
 	print_line("df: "+itos(df));
 	print_line("df: "+itos(df));
 
 
+
+	if (request_3d_callback && df&FORMAT_BIT_DETECT_3D) {
+		print_line("request detect 3D at "+p_path);
+		VS::get_singleton()->texture_set_detect_3d_callback(texture,_requested_3d,this);
+	} else {
+		print_line("not requesting detect 3D at "+p_path);
+		VS::get_singleton()->texture_set_detect_3d_callback(texture,NULL,NULL);
+	}
+
+	if (request_srgb_callback && df&FORMAT_BIT_DETECT_SRGB) {
+		print_line("request detect srgb at "+p_path);
+		VS::get_singleton()->texture_set_detect_srgb_callback(texture,_requested_srgb,this);
+	} else {
+		VS::get_singleton()->texture_set_detect_srgb_callback(texture,NULL,NULL);
+		print_line("not requesting detect srgb at "+p_path);
+	}
+
 	if (!(df&FORMAT_BIT_STREAM)) {
 	if (!(df&FORMAT_BIT_STREAM)) {
 		p_size_limit=0;
 		p_size_limit=0;
 	}
 	}
@@ -635,6 +672,7 @@ Error StreamTexture::_load_data(const String& p_path,int &tw,int &th,int& flags,
 			{
 			{
 				PoolVector<uint8_t>::Write w=img_data.write();
 				PoolVector<uint8_t>::Write w=img_data.write();
 				int bytes = f->get_buffer(w.ptr(),total_size - ofs);
 				int bytes = f->get_buffer(w.ptr(),total_size - ofs);
+				print_line("requested read: "+itos(total_size - ofs)+" but got: "+itos(bytes));
 
 
 				memdelete(f);
 				memdelete(f);
 
 
@@ -722,6 +760,12 @@ void StreamTexture::set_flags(uint32_t p_flags){
 
 
 void StreamTexture::reload_from_file() {
 void StreamTexture::reload_from_file() {
 
 
+#ifdef TOOLS_ENABLED
+	String ipath = get_import_path();
+	if (ipath.is_resource_file() && ipath!=path_to_file) {
+		path_to_file=ipath;
+	}
+#endif
 	load(path_to_file);
 	load(path_to_file);
 }
 }
 
 

+ 10 - 0
scene/resources/texture.h

@@ -178,6 +178,8 @@ public:
 		FORMAT_BIT_LOSSY=1<<21,
 		FORMAT_BIT_LOSSY=1<<21,
 		FORMAT_BIT_STREAM=1<<22,
 		FORMAT_BIT_STREAM=1<<22,
 		FORMAT_BIT_HAS_MIPMAPS=1<<23,
 		FORMAT_BIT_HAS_MIPMAPS=1<<23,
+		FORMAT_BIT_DETECT_3D=1<<24,
+		FORMAT_BIT_DETECT_SRGB=1<<25,
 	};
 	};
 
 
 private:
 private:
@@ -191,6 +193,9 @@ private:
 
 
 	virtual void reload_from_file();
 	virtual void reload_from_file();
 
 
+	static void _requested_3d(void* p_ud);
+	static void _requested_srgb(void* p_ud);
+
 protected:
 protected:
 
 
 	static void _bind_methods();
 	static void _bind_methods();
@@ -198,6 +203,11 @@ protected:
 public:
 public:
 
 
 
 
+	typedef void (*TextureFormatRequestCallback)(const Ref<StreamTexture>&);
+
+	static TextureFormatRequestCallback request_3d_callback;
+	static TextureFormatRequestCallback request_srgb_callback;
+
 	uint32_t get_flags() const;
 	uint32_t get_flags() const;
 	Image::Format get_format() const;
 	Image::Format get_format() const;
 	Error load(const String& p_path);
 	Error load(const String& p_path);

+ 3 - 0
servers/visual/rasterizer.h

@@ -196,6 +196,8 @@ public:
 
 
 	virtual RID texture_create_radiance_cubemap(RID p_source,int p_resolution=-1) const=0;
 	virtual RID texture_create_radiance_cubemap(RID p_source,int p_resolution=-1) const=0;
 
 
+	virtual void texture_set_detect_3d_callback(RID p_texture,VisualServer::TextureDetectCallback p_callback,void* p_userdata)=0;
+	virtual void texture_set_detect_srgb_callback(RID p_texture,VisualServer::TextureDetectCallback p_callback,void* p_userdata)=0;
 
 
 	virtual void textures_keep_original(bool p_enable)=0;
 	virtual void textures_keep_original(bool p_enable)=0;
 
 
@@ -512,6 +514,7 @@ public:
 	virtual VS::InstanceType get_base_type(RID p_rid) const=0;
 	virtual VS::InstanceType get_base_type(RID p_rid) const=0;
 	virtual bool free(RID p_rid)=0;
 	virtual bool free(RID p_rid)=0;
 
 
+	virtual bool has_os_feature(const String& p_feature) const=0;
 
 
 	static RasterizerStorage*base_signleton;
 	static RasterizerStorage*base_signleton;
 	RasterizerStorage();
 	RasterizerStorage();

+ 6 - 0
servers/visual/visual_server_raster.cpp

@@ -157,6 +157,12 @@ RID VisualServerRaster::get_test_cube() {
 	return test_cube;
 	return test_cube;
 }
 }
 
 
+
+bool VisualServerRaster::has_os_feature(const String& p_feature) const {
+
+	return VSG::storage->has_os_feature(p_feature);
+}
+
 VisualServerRaster::VisualServerRaster() {
 VisualServerRaster::VisualServerRaster() {
 
 
 	VSG::canvas = memnew( VisualServerCanvas);
 	VSG::canvas = memnew( VisualServerCanvas);

+ 4 - 1
servers/visual/visual_server_raster.h

@@ -622,7 +622,8 @@ public:
 	BIND3(texture_set_size_override,RID,int,int)
 	BIND3(texture_set_size_override,RID,int,int)
 	BIND2RC(RID,texture_create_radiance_cubemap,RID,int)
 	BIND2RC(RID,texture_create_radiance_cubemap,RID,int)
 
 
-
+	BIND3(texture_set_detect_3d_callback,RID,TextureDetectCallback,void*)
+	BIND3(texture_set_detect_srgb_callback,RID,TextureDetectCallback,void*)
 
 
 	BIND2(texture_set_path,RID,const String&)
 	BIND2(texture_set_path,RID,const String&)
 	BIND1RC(String,texture_get_path,RID)
 	BIND1RC(String,texture_get_path,RID)
@@ -1135,6 +1136,8 @@ public:
 
 
 	virtual bool has_feature(Features p_feature) const;
 	virtual bool has_feature(Features p_feature) const;
 
 
+	virtual bool has_os_feature(const String& p_feature) const;
+
 
 
 	VisualServerRaster();
 	VisualServerRaster();
 	~VisualServerRaster();
 	~VisualServerRaster();

+ 7 - 0
servers/visual_server.h

@@ -129,6 +129,11 @@ public:
 
 
 	virtual void texture_set_shrink_all_x2_on_set_data(bool p_enable)=0;
 	virtual void texture_set_shrink_all_x2_on_set_data(bool p_enable)=0;
 
 
+	typedef void (*TextureDetectCallback)(void*);
+
+	virtual void texture_set_detect_3d_callback(RID p_texture,TextureDetectCallback p_callback,void* p_userdata)=0;
+	virtual void texture_set_detect_srgb_callback(RID p_texture,TextureDetectCallback p_callback,void* p_userdata)=0;
+
 	struct TextureInfo {
 	struct TextureInfo {
 		RID texture;
 		RID texture;
 		Size2 size;
 		Size2 size;
@@ -938,6 +943,8 @@ public:
 
 
 	virtual bool has_feature(Features p_feature) const=0;
 	virtual bool has_feature(Features p_feature) const=0;
 
 
+	virtual bool has_os_feature(const String& p_feature) const=0;
+
 	VisualServer();
 	VisualServer();
 	virtual ~VisualServer();
 	virtual ~VisualServer();
 
 

+ 28 - 3
tools/editor/editor_file_system.cpp

@@ -1028,7 +1028,7 @@ void EditorFileSystem::_notification(int p_what) {
 
 
 bool EditorFileSystem::is_scanning() const {
 bool EditorFileSystem::is_scanning() const {
 
 
-	return scanning;
+	return scanning || scanning_changes;
 }
 }
 float EditorFileSystem::get_scanning_progress() const {
 float EditorFileSystem::get_scanning_progress() const {
 
 
@@ -1393,6 +1393,7 @@ void EditorFileSystem::_reimport_file(const String& p_file) {
 		f->store_line("type=\""+importer->get_resource_type()+"\"");
 		f->store_line("type=\""+importer->get_resource_type()+"\"");
 	}
 	}
 
 
+
 	if (importer->get_save_extension()=="") {
 	if (importer->get_save_extension()=="") {
 		//no path
 		//no path
 	} else if (import_variants.size()) {
 	} else if (import_variants.size()) {
@@ -1400,7 +1401,10 @@ void EditorFileSystem::_reimport_file(const String& p_file) {
 		for(List<String>::Element *E=import_variants.front();E;E=E->next()) {
 		for(List<String>::Element *E=import_variants.front();E;E=E->next()) {
 
 
 
 
-			f->store_line("path."+E->get()+"=\""+base_path.c_escape()+"."+E->get()+"."+importer->get_save_extension()+"\"");
+			String path = base_path.c_escape()+"."+E->get()+"."+importer->get_save_extension();
+
+			f->store_line("path."+E->get()+"=\""+path+"\"");
+
 		}
 		}
 	} else {
 	} else {
 
 
@@ -1426,6 +1430,8 @@ void EditorFileSystem::_reimport_file(const String& p_file) {
 	f->store_line("");
 	f->store_line("");
 
 
 	//store options in provided order, to avoid file changing
 	//store options in provided order, to avoid file changing
+
+
 	for (List<ResourceImporter::ImportOption>::Element *E=opts.front();E;E=E->next()) {
 	for (List<ResourceImporter::ImportOption>::Element *E=opts.front();E;E=E->next()) {
 
 
 		String base = E->get().option.name;
 		String base = E->get().option.name;
@@ -1442,11 +1448,25 @@ void EditorFileSystem::_reimport_file(const String& p_file) {
 	//update modified times, to avoid reimport
 	//update modified times, to avoid reimport
 	fs->files[cpos]->modified_time = FileAccess::get_modified_time(p_file);
 	fs->files[cpos]->modified_time = FileAccess::get_modified_time(p_file);
 	fs->files[cpos]->import_modified_time = FileAccess::get_modified_time(p_file+".import");
 	fs->files[cpos]->import_modified_time = FileAccess::get_modified_time(p_file+".import");
+
+	//if file is currently up, maybe the source it was loaded from changed, so import math must be updated for it
+	//to reload properly
+	if (ResourceCache::has(p_file)) {
+
+		Resource *r = ResourceCache::get(p_file);
+
+		if (r->get_import_path()!=String()) {
+
+			String dst_path = ResourceFormatImporter::get_singleton()->get_internal_resource_path(p_file);
+			r->set_import_path(dst_path);
+			r->set_import_last_modified_time(0);
+		}
+	}
 }
 }
 
 
 void EditorFileSystem::reimport_files(const Vector<String>& p_files) {
 void EditorFileSystem::reimport_files(const Vector<String>& p_files) {
 
 
-
+	importing=true;
 	EditorProgress pr("reimport",TTR("(Re)Importing Assets"),p_files.size());
 	EditorProgress pr("reimport",TTR("(Re)Importing Assets"),p_files.size());
 	for(int i=0;i<p_files.size();i++) {
 	for(int i=0;i<p_files.size();i++) {
 		pr.step(p_files[i].get_file(),i);
 		pr.step(p_files[i].get_file(),i);
@@ -1455,6 +1475,10 @@ void EditorFileSystem::reimport_files(const Vector<String>& p_files) {
 	}
 	}
 
 
 	_save_filesystem_cache();
 	_save_filesystem_cache();
+	importing=false;
+	if (!is_scanning()) {
+		emit_signal("filesystem_changed");
+	}
 }
 }
 
 
 void EditorFileSystem::_bind_methods() {
 void EditorFileSystem::_bind_methods() {
@@ -1503,6 +1527,7 @@ EditorFileSystem::EditorFileSystem() {
 
 
 	thread = NULL;
 	thread = NULL;
 	scanning=false;
 	scanning=false;
+	importing=false;
 	use_threads=true;
 	use_threads=true;
 	thread_sources=NULL;
 	thread_sources=NULL;
 	new_filesystem=NULL;
 	new_filesystem=NULL;

+ 2 - 0
tools/editor/editor_file_system.h

@@ -133,6 +133,7 @@ class EditorFileSystem : public Node {
 
 
 	bool abort_scan;
 	bool abort_scan;
 	bool scanning;
 	bool scanning;
+	bool importing;
 	float scan_total;
 	float scan_total;
 
 
 
 
@@ -210,6 +211,7 @@ public:
 
 
 	EditorFileSystemDirectory *get_filesystem();
 	EditorFileSystemDirectory *get_filesystem();
 	bool is_scanning() const;
 	bool is_scanning() const;
+	bool is_importing() const { return importing; }
 	float get_scanning_progress() const;
 	float get_scanning_progress() const;
 	void scan();
 	void scan();
 	void scan_changes();
 	void scan_changes();

+ 4 - 0
tools/editor/editor_node.cpp

@@ -308,6 +308,8 @@ void EditorNode::_notification(int p_what) {
 
 
 		}
 		}
 
 
+		ResourceImporterTexture::get_singleton()->update_imports();
+
 	}
 	}
 	if (p_what==NOTIFICATION_ENTER_TREE) {
 	if (p_what==NOTIFICATION_ENTER_TREE) {
 
 
@@ -411,8 +413,10 @@ void EditorNode::_fs_changed() {
 			if (E->get()->get_import_path()!=String()) {
 			if (E->get()->get_import_path()!=String()) {
 				//imported resource
 				//imported resource
 				uint64_t mt = FileAccess::get_modified_time(E->get()->get_import_path());
 				uint64_t mt = FileAccess::get_modified_time(E->get()->get_import_path());
+				print_line("testing modified: "+E->get()->get_import_path()+" "+itos(mt)+" vs "+itos(E->get()->get_import_last_modified_time()));
 
 
 				if (mt!=E->get()->get_import_last_modified_time()) {
 				if (mt!=E->get()->get_import_last_modified_time()) {
+					print_line("success");
 					changed.push_back(E->get());
 					changed.push_back(E->get());
 				}
 				}
 
 

+ 12 - 4
tools/editor/import/editor_import_collada.cpp

@@ -430,9 +430,10 @@ Error ColladaImport::_create_material(const String& p_target) {
 
 
 		}
 		}
 	} else {
 	} else {
-		//material->set_parameter(FixedSpatialMaterial::PARAM_SPECULAR,effect.specular.color);
+		material->set_metalness(effect.specular.color.get_v());
 	}
 	}
 
 
+
 	// EMISSION
 	// EMISSION
 
 
 	if (effect.emission.texture!="") {
 	if (effect.emission.texture!="") {
@@ -443,17 +444,21 @@ Error ColladaImport::_create_material(const String& p_target) {
 			Ref<Texture> texture = ResourceLoader::load(texfile,"Texture");
 			Ref<Texture> texture = ResourceLoader::load(texfile,"Texture");
 			if (texture.is_valid()) {
 			if (texture.is_valid()) {
 
 
+				material->set_feature(FixedSpatialMaterial::FEATURE_EMISSION,true);
 				material->set_texture(FixedSpatialMaterial::TEXTURE_EMISSION,texture);
 				material->set_texture(FixedSpatialMaterial::TEXTURE_EMISSION,texture);
 				material->set_emission(Color(1,1,1,1));
 				material->set_emission(Color(1,1,1,1));
 
 
 				//material->set_parameter(FixedSpatialMaterial::PARAM_EMISSION,Color(1,1,1,1));
 				//material->set_parameter(FixedSpatialMaterial::PARAM_EMISSION,Color(1,1,1,1));
 			}else {
 			}else {
-				//missing_textures.push_back(texfile.get_file());
+				missing_textures.push_back(texfile.get_file());
 			}
 			}
 
 
 		}
 		}
 	} else {
 	} else {
-		//material->set_parameter(FixedSpatialMaterial::PARAM_EMISSION,effect.emission.color);
+		if (effect.emission.color!=Color()) {
+			material->set_feature(FixedSpatialMaterial::FEATURE_EMISSION,true);
+			material->set_emission(effect.emission.color);
+		}
 	}
 	}
 
 
 	// NORMAL
 	// NORMAL
@@ -465,6 +470,7 @@ Error ColladaImport::_create_material(const String& p_target) {
 
 
 			Ref<Texture> texture = ResourceLoader::load(texfile,"Texture");
 			Ref<Texture> texture = ResourceLoader::load(texfile,"Texture");
 			if (texture.is_valid()) {
 			if (texture.is_valid()) {
+				material->set_feature(FixedSpatialMaterial::FEATURE_NORMAL_MAPPING,true);
 				material->set_texture(FixedSpatialMaterial::TEXTURE_NORMAL,texture);
 				material->set_texture(FixedSpatialMaterial::TEXTURE_NORMAL,texture);
 				//material->set_emission(Color(1,1,1,1));
 				//material->set_emission(Color(1,1,1,1));
 
 
@@ -477,7 +483,9 @@ Error ColladaImport::_create_material(const String& p_target) {
 	}
 	}
 
 
 
 
-	//material->set_parameter(FixedSpatialMaterial::PARAM_SPECULAR_EXP,effect.shininess);
+	float roughness = Math::sqrt(1.0-((Math::log(effect.shininess)/Math::log(2.0))/8.0)); //not very right..
+	material->set_roughness(roughness);
+
 	if (effect.double_sided) {
 	if (effect.double_sided) {
 		material->set_cull_mode(FixedSpatialMaterial::CULL_DISABLED);
 		material->set_cull_mode(FixedSpatialMaterial::CULL_DISABLED);
 	}
 	}

+ 129 - 10
tools/editor/import/resource_importer_texture.cpp

@@ -1,6 +1,106 @@
 #include "resource_importer_texture.h"
 #include "resource_importer_texture.h"
 #include "io/image_loader.h"
 #include "io/image_loader.h"
 #include "scene/resources/texture.h"
 #include "scene/resources/texture.h"
+#include "tools/editor/editor_file_system.h"
+#include "io/config_file.h"
+
+
+void ResourceImporterTexture::_texture_reimport_srgb(const Ref<StreamTexture>& p_tex) {
+
+	singleton->mutex->lock();
+	StringName path = p_tex->get_path();
+
+	if (!singleton->make_flags.has(path)) {
+		singleton->make_flags[path]=0;
+	}
+
+	singleton->make_flags[path]|=MAKE_SRGB_FLAG;
+
+	print_line("requesting srgb for "+String(path));
+
+	singleton->mutex->unlock();
+
+}
+
+
+
+void ResourceImporterTexture::_texture_reimport_3d(const Ref<StreamTexture>& p_tex) {
+
+
+	singleton->mutex->lock();
+	StringName path = p_tex->get_path();
+
+	if (!singleton->make_flags.has(path)) {
+		singleton->make_flags[path]=0;
+	}
+
+	singleton->make_flags[path]|=MAKE_3D_FLAG;
+
+	print_line("requesting 3d for "+String(path));
+
+	singleton->mutex->unlock();
+
+
+}
+
+void ResourceImporterTexture::update_imports() {
+
+	if (EditorFileSystem::get_singleton()->is_scanning() || EditorFileSystem::get_singleton()->is_importing()) {
+		return; // do nothing for noe
+	}
+	mutex->lock();
+
+	if (make_flags.empty()) {
+		mutex->unlock();
+		return;
+	}
+
+	Vector<String> to_reimport;
+	for (Map<StringName,int>::Element *E=make_flags.front();E;E=E->next()) {
+
+		print_line("checking for reimport "+String(E->key()));
+
+
+		Ref<ConfigFile> cf;
+		cf.instance();
+		String src_path = String(E->key())+".import";
+
+		Error err = cf->load(src_path);
+		ERR_CONTINUE(err!=OK);
+
+		bool changed=false;
+		if (E->get()&MAKE_SRGB_FLAG && int(cf->get_value("params","flags/srgb"))==2) {
+			cf->set_value("params","flags/srgb",1);
+			changed=true;
+		}
+
+		if (E->get()&MAKE_3D_FLAG && bool(cf->get_value("params","detect_3d"))) {
+			cf->set_value("params","detect_3d",false);
+			cf->set_value("params","compress/mode",2);
+			cf->set_value("params","flags/repeat",true);
+			cf->set_value("params","flags/filter",true);
+			cf->set_value("params","flags/mipmaps",true);
+			changed=true;
+		}
+
+		if (changed) {
+			cf->save(src_path);
+			to_reimport.push_back(E->key());
+		}
+
+	}
+
+	make_flags.clear();
+
+	mutex->unlock();
+
+	if (to_reimport.size()) {
+		EditorFileSystem::get_singleton()->reimport_files(to_reimport);
+	}
+
+}
+
+
 
 
 String ResourceImporterTexture::get_importer_name() const {
 String ResourceImporterTexture::get_importer_name() const {
 
 
@@ -57,7 +157,7 @@ void ResourceImporterTexture::get_import_options(List<ImportOption> *r_options,i
 	r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL,"flags/filter"),p_preset==PRESET_2D_PIXEL?false:true));
 	r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL,"flags/filter"),p_preset==PRESET_2D_PIXEL?false:true));
 	r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL,"flags/mipmaps"),p_preset==PRESET_3D?true:false));
 	r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL,"flags/mipmaps"),p_preset==PRESET_3D?true:false));
 	r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL,"flags/anisotropic"),false));
 	r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL,"flags/anisotropic"),false));
-	r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL,"flags/srgb",PROPERTY_HINT_ENUM,"Disable,Enable,Detect"),2));
+	r_options->push_back(ImportOption(PropertyInfo(Variant::INT,"flags/srgb",PROPERTY_HINT_ENUM,"Disable,Enable,Detect"),2));
 	r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL,"process/fix_alpha_border"),p_preset!=PRESET_3D?true:false));
 	r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL,"process/fix_alpha_border"),p_preset!=PRESET_3D?true:false));
 	r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL,"process/premult_alpha"),true));
 	r_options->push_back(ImportOption(PropertyInfo(Variant::BOOL,"process/premult_alpha"),true));
 	r_options->push_back(ImportOption(PropertyInfo(Variant::INT,"stream"),false));
 	r_options->push_back(ImportOption(PropertyInfo(Variant::INT,"stream"),false));
@@ -67,7 +167,7 @@ void ResourceImporterTexture::get_import_options(List<ImportOption> *r_options,i
 }
 }
 
 
 
 
-void ResourceImporterTexture::_save_stex(const Image& p_image,const String& p_to_path,int p_compress_mode,float p_lossy_quality,Image::CompressMode p_vram_compression,bool p_mipmaps,int p_texture_flags,bool p_streamable) {
+void ResourceImporterTexture::_save_stex(const Image& p_image, const String& p_to_path, int p_compress_mode, float p_lossy_quality, Image::CompressMode p_vram_compression, bool p_mipmaps, int p_texture_flags, bool p_streamable, bool p_detect_3d, bool p_detect_srgb) {
 
 
 
 
 	FileAccess *f = FileAccess::open(p_to_path,FileAccess::WRITE);
 	FileAccess *f = FileAccess::open(p_to_path,FileAccess::WRITE);
@@ -86,6 +186,11 @@ void ResourceImporterTexture::_save_stex(const Image& p_image,const String& p_to
 		format|=StreamTexture::FORMAT_BIT_STREAM;
 		format|=StreamTexture::FORMAT_BIT_STREAM;
 	if (p_mipmaps || p_compress_mode==COMPRESS_VIDEO_RAM) //VRAM always uses mipmaps
 	if (p_mipmaps || p_compress_mode==COMPRESS_VIDEO_RAM) //VRAM always uses mipmaps
 		format|=StreamTexture::FORMAT_BIT_HAS_MIPMAPS; //mipmaps bit
 		format|=StreamTexture::FORMAT_BIT_HAS_MIPMAPS; //mipmaps bit
+	if (p_detect_3d)
+		format|=StreamTexture::FORMAT_BIT_DETECT_3D;
+	if (p_detect_srgb)
+		format|=StreamTexture::FORMAT_BIT_DETECT_SRGB;
+
 
 
 	switch (p_compress_mode) {
 	switch (p_compress_mode) {
 		case COMPRESS_LOSSLESS: {
 		case COMPRESS_LOSSLESS: {
@@ -99,7 +204,7 @@ void ResourceImporterTexture::_save_stex(const Image& p_image,const String& p_to
 
 
 			int mmc = image.get_mipmap_count() + 1;
 			int mmc = image.get_mipmap_count() + 1;
 
 
-			format=StreamTexture::FORMAT_BIT_LOSSLESS;
+			format|=StreamTexture::FORMAT_BIT_LOSSLESS;
 			f->store_32(format);
 			f->store_32(format);
 			f->store_32(mmc);
 			f->store_32(mmc);
 
 
@@ -130,7 +235,7 @@ void ResourceImporterTexture::_save_stex(const Image& p_image,const String& p_to
 
 
 			int mmc = image.get_mipmap_count() + 1;
 			int mmc = image.get_mipmap_count() + 1;
 
 
-			format=StreamTexture::FORMAT_BIT_LOSSY;
+			format|=StreamTexture::FORMAT_BIT_LOSSY;
 			f->store_32(format);
 			f->store_32(format);
 			f->store_32(mmc);
 			f->store_32(mmc);
 
 
@@ -162,7 +267,6 @@ void ResourceImporterTexture::_save_stex(const Image& p_image,const String& p_to
 			PoolVector<uint8_t> data=image.get_data();
 			PoolVector<uint8_t> data=image.get_data();
 			int dl = data.size();
 			int dl = data.size();
 			PoolVector<uint8_t>::Read r = data.read();
 			PoolVector<uint8_t>::Read r = data.read();
-
 			f->store_buffer(r.ptr(),dl);
 			f->store_buffer(r.ptr(),dl);
 
 
 		} break;
 		} break;
@@ -198,7 +302,7 @@ Error ResourceImporterTexture::import(const String& p_source_file, const String&
 	bool filter= p_options["flags/filter"];
 	bool filter= p_options["flags/filter"];
 	bool mipmaps= p_options["flags/mipmaps"];
 	bool mipmaps= p_options["flags/mipmaps"];
 	bool anisotropic= p_options["flags/anisotropic"];
 	bool anisotropic= p_options["flags/anisotropic"];
-	bool srgb= p_options["flags/srgb"];
+	int srgb= p_options["flags/srgb"];
 	bool fix_alpha_border= p_options["process/fix_alpha_border"];
 	bool fix_alpha_border= p_options["process/fix_alpha_border"];
 	bool premult_alpha= p_options["process/premult_alpha"];
 	bool premult_alpha= p_options["process/premult_alpha"];
 	bool stream = p_options["stream"];
 	bool stream = p_options["stream"];
@@ -222,7 +326,7 @@ Error ResourceImporterTexture::import(const String& p_source_file, const String&
 		tex_flags|=Texture::FLAG_MIPMAPS;
 		tex_flags|=Texture::FLAG_MIPMAPS;
 	if (anisotropic)
 	if (anisotropic)
 		tex_flags|=Texture::FLAG_ANISOTROPIC_FILTER;
 		tex_flags|=Texture::FLAG_ANISOTROPIC_FILTER;
-	if (srgb)
+	if (srgb==1)
 		tex_flags|=Texture::FLAG_CONVERT_TO_LINEAR;
 		tex_flags|=Texture::FLAG_CONVERT_TO_LINEAR;
 
 
 	if (size_limit >0 && (image.get_width()>size_limit || image.get_height()>size_limit )) {
 	if (size_limit >0 && (image.get_width()>size_limit || image.get_height()>size_limit )) {
@@ -249,26 +353,41 @@ Error ResourceImporterTexture::import(const String& p_source_file, const String&
 		image.premultiply_alpha();
 		image.premultiply_alpha();
 	}
 	}
 
 
+	bool detect_3d = p_options["detect_3d"];
+	bool detect_srgb = srgb==2;
 
 
 	if (compress_mode==COMPRESS_VIDEO_RAM) {
 	if (compress_mode==COMPRESS_VIDEO_RAM) {
 		//must import in all formats
 		//must import in all formats
 		//Android, GLES 2.x
 		//Android, GLES 2.x
-		_save_stex(image,p_save_path+".etc.stex",compress_mode,lossy,Image::COMPRESS_ETC,mipmaps,tex_flags,stream);
+		_save_stex(image,p_save_path+".etc.stex",compress_mode,lossy,Image::COMPRESS_ETC,mipmaps,tex_flags,stream,detect_3d,detect_srgb);
 		r_platform_variants->push_back("etc");
 		r_platform_variants->push_back("etc");
 		//_save_stex(image,p_save_path+".etc2.stex",compress_mode,lossy,Image::COMPRESS_ETC2,mipmaps,tex_flags,stream);
 		//_save_stex(image,p_save_path+".etc2.stex",compress_mode,lossy,Image::COMPRESS_ETC2,mipmaps,tex_flags,stream);
 		//r_platform_variants->push_back("etc2");
 		//r_platform_variants->push_back("etc2");
-		_save_stex(image,p_save_path+".s3tc.stex",compress_mode,lossy,Image::COMPRESS_S3TC,mipmaps,tex_flags,stream);
+		_save_stex(image,p_save_path+".s3tc.stex",compress_mode,lossy,Image::COMPRESS_S3TC,mipmaps,tex_flags,stream,detect_3d,detect_srgb);
 		r_platform_variants->push_back("s3tc");
 		r_platform_variants->push_back("s3tc");
 
 
 	} else {
 	} else {
 		//import normally
 		//import normally
-		_save_stex(image,p_save_path+".stex",compress_mode,lossy,Image::COMPRESS_16BIT /*this is ignored */,mipmaps,tex_flags,stream);
+		_save_stex(image,p_save_path+".stex",compress_mode,lossy,Image::COMPRESS_16BIT /*this is ignored */,mipmaps,tex_flags,stream,detect_3d,detect_srgb);
 	}
 	}
 
 
 	return OK;
 	return OK;
 }
 }
 
 
+ResourceImporterTexture *ResourceImporterTexture::singleton=NULL;
+
 ResourceImporterTexture::ResourceImporterTexture()
 ResourceImporterTexture::ResourceImporterTexture()
 {
 {
 
 
+	singleton=this;
+	StreamTexture::request_3d_callback=_texture_reimport_3d;
+	StreamTexture::request_srgb_callback=_texture_reimport_srgb;
+	mutex = Mutex::create();
 }
 }
+
+ResourceImporterTexture::~ResourceImporterTexture()
+{
+
+	memdelete(mutex);
+}
+

+ 28 - 1
tools/editor/import/resource_importer_texture.h

@@ -2,10 +2,33 @@
 #define RESOURCEIMPORTTEXTURE_H
 #define RESOURCEIMPORTTEXTURE_H
 
 
 #include "io/resource_import.h"
 #include "io/resource_import.h"
+class StreamTexture;
 
 
 class ResourceImporterTexture : public ResourceImporter {
 class ResourceImporterTexture : public ResourceImporter {
 	GDCLASS(ResourceImporterTexture,ResourceImporter)
 	GDCLASS(ResourceImporterTexture,ResourceImporter)
+
+
+
+protected:
+
+	enum {
+		MAKE_3D_FLAG=1,
+		MAKE_SRGB_FLAG=2
+	};
+
+	Mutex *mutex;
+	Map<StringName,int> make_flags;
+
+	static void _texture_reimport_srgb(const Ref<StreamTexture>& p_tex);
+	static void _texture_reimport_3d(const Ref<StreamTexture>& p_tex);
+
+
+
+
+	static ResourceImporterTexture *singleton;
 public:
 public:
+
+	static ResourceImporterTexture *get_singleton() { return singleton; }
 	virtual String get_importer_name() const;
 	virtual String get_importer_name() const;
 	virtual String get_visible_name() const;
 	virtual String get_visible_name() const;
 	virtual void get_recognized_extensions(List<String> *p_extensions) const;
 	virtual void get_recognized_extensions(List<String> *p_extensions) const;
@@ -33,11 +56,15 @@ public:
 	virtual void get_import_options(List<ImportOption> *r_options,int p_preset=0) const;
 	virtual void get_import_options(List<ImportOption> *r_options,int p_preset=0) const;
 	virtual bool get_option_visibility(const String& p_option,const Map<StringName,Variant>& p_options) const;
 	virtual bool get_option_visibility(const String& p_option,const Map<StringName,Variant>& p_options) const;
 
 
-	void _save_stex(const Image& p_image, const String& p_to_path, int p_compress_mode, float p_lossy_quality, Image::CompressMode p_vram_compression, bool p_mipmaps, int p_texture_flags, bool p_streamable);
+	void _save_stex(const Image& p_image, const String& p_to_path, int p_compress_mode, float p_lossy_quality, Image::CompressMode p_vram_compression, bool p_mipmaps, int p_texture_flags, bool p_streamable,bool p_detect_3d,bool p_detect_srgb);
 
 
 	virtual Error import(const String& p_source_file,const String& p_save_path,const Map<StringName,Variant>& p_options,List<String>* r_platform_variants,List<String>* r_gen_files=NULL);
 	virtual Error import(const String& p_source_file,const String& p_save_path,const Map<StringName,Variant>& p_options,List<String>* r_platform_variants,List<String>* r_gen_files=NULL);
 
 
+
+	void update_imports();
+
 	ResourceImporterTexture();
 	ResourceImporterTexture();
+	~ResourceImporterTexture();
 };
 };
 
 
 #endif // RESOURCEIMPORTTEXTURE_H
 #endif // RESOURCEIMPORTTEXTURE_H

+ 17 - 73
tools/editor/plugins/spatial_editor_plugin.cpp

@@ -277,12 +277,10 @@ ObjectID SpatialEditorViewport::_select_ray(const Point2& p_pos, bool p_append,b
 	Vector<ObjectID> instances=VisualServer::get_singleton()->instances_cull_ray(pos,ray,get_tree()->get_root()->get_world()->get_scenario() );
 	Vector<ObjectID> instances=VisualServer::get_singleton()->instances_cull_ray(pos,ray,get_tree()->get_root()->get_world()->get_scenario() );
 	Set<Ref<SpatialEditorGizmo> > found_gizmos;
 	Set<Ref<SpatialEditorGizmo> > found_gizmos;
 
 
-	//uint32_t closest=0;
-	//float closest_dist=0;
-
-	r_includes_current=false;
-
-	List<_RayResult> results;
+	ObjectID closest=0;
+	Spatial *item=NULL;
+	float closest_dist=1e20;
+	int selected_handle=-1;
 
 
 	for (int i=0;i<instances.size();i++) {
 	for (int i=0;i<instances.size();i++) {
 
 
@@ -318,84 +316,30 @@ ObjectID SpatialEditorViewport::_select_ray(const Point2& p_pos, bool p_append,b
 		if (dist<0)
 		if (dist<0)
 			continue;
 			continue;
 
 
+		if (dist < closest_dist) {
+			closest=instances[i];
+			closest_dist=dist;
+			selected_handle=handle;
+			item=spat;
+		}
 
 
+	//	if (editor_selection->is_selected(spat))
+	//		r_includes_current=true;
 
 
-		if (editor_selection->is_selected(spat))
-			r_includes_current=true;
-
-		_RayResult res;
-		res.item=spat;
-		res.depth=dist;
-		res.handle=handle;
-		results.push_back(res);
 	}
 	}
 
 
 
 
-	if (results.empty())
+	if (!item)
 		return 0;
 		return 0;
 
 
-	results.sort();
-	Spatial *s=NULL;
-
+	if (!editor_selection->is_selected(item) || (r_gizmo_handle && selected_handle>=0)) {
 
 
-	if (!r_includes_current || results.size()==1 || (r_gizmo_handle && results.front()->get().handle>=0)) {
-
-		//return the nearest one
-		s = results.front()->get().item;
 		if (r_gizmo_handle)
 		if (r_gizmo_handle)
-			*r_gizmo_handle=results.front()->get().handle;
-
-	} else {
-
-		//returns the next one from a curent selection
-		List<_RayResult>::Element *E=results.front();
-		List<_RayResult>::Element *S=NULL;
-
+			*r_gizmo_handle=selected_handle;
 
 
-		while(true) {
-
-			//very strange loop algorithm that complies with object selection standards (tm).
-
-			if (S==E) {
-				//went all around and anothing was found
-				//since can't rotate the selection
-				//just return the first one
-
-				s=results.front()->get().item;
-				break;
-
-			}
-
-			if (!S && editor_selection->is_selected(E->get().item)) {
-				//found an item currently in the selection,
-				//so start from this one
-				S=E;
-			}
-
-			if (S && !editor_selection->is_selected(E->get().item)) {
-				// free item after a selected item, this one is desired.
-				s=E->get().item;
-				break;
-			}
-
-			E=E->next();
-			if (!E) {
-
-				if (!S) {
-					//did a loop but nothing was selected, select first
-					s=results.front()->get().item;
-					break;
-
-				}
-				E=results.front();
-			}
-		}
 	}
 	}
 
 
-	if (!s)
-		return 0;
-
-	return s->get_instance_ID();
+	return closest;
 
 
 }
 }
 
 
@@ -3143,7 +3087,7 @@ void SpatialEditor::_init_indicators() {
 
 
 		indicator_mat.instance();
 		indicator_mat.instance();
 		indicator_mat->set_flag(FixedSpatialMaterial::FLAG_UNSHADED,true);
 		indicator_mat->set_flag(FixedSpatialMaterial::FLAG_UNSHADED,true);
-		indicator_mat->set_flag(FixedSpatialMaterial::FLAG_ONTOP,true);
+		//indicator_mat->set_flag(FixedSpatialMaterial::FLAG_ONTOP,true);
 		indicator_mat->set_flag(FixedSpatialMaterial::FLAG_ALBEDO_FROM_VERTEX_COLOR,true);
 		indicator_mat->set_flag(FixedSpatialMaterial::FLAG_ALBEDO_FROM_VERTEX_COLOR,true);
 		indicator_mat->set_flag(FixedSpatialMaterial::FLAG_SRGB_VERTEX_COLOR,true);
 		indicator_mat->set_flag(FixedSpatialMaterial::FLAG_SRGB_VERTEX_COLOR,true);
 
 

+ 2 - 2
tools/editor/spatial_editor_gizmos.cpp

@@ -2484,7 +2484,7 @@ void GIProbeGizmo::redraw(){
 
 
 	}
 	}
 
 
-	add_lines(lines,SpatialEditorGizmos::singleton->reflection_probe_material_internal);
+	add_lines(lines,SpatialEditorGizmos::singleton->gi_probe_material_internal);
 
 
 	Vector<Vector3> handles;
 	Vector<Vector3> handles;
 
 
@@ -3406,7 +3406,7 @@ SpatialEditorGizmos::SpatialEditorGizmos() {
 	reflection_probe_material = create_line_material(Color(0.5,1.0,0.7));
 	reflection_probe_material = create_line_material(Color(0.5,1.0,0.7));
 	reflection_probe_material_internal = create_line_material(Color(0.3,0.8,0.5,0.15));
 	reflection_probe_material_internal = create_line_material(Color(0.3,0.8,0.5,0.15));
 	gi_probe_material = create_line_material(Color(0.7,1.0,0.5));
 	gi_probe_material = create_line_material(Color(0.7,1.0,0.5));
-	gi_probe_material_internal = create_line_material(Color(0.5,0.8,0.3,0.4));
+	gi_probe_material_internal = create_line_material(Color(0.5,0.8,0.3,0.1));
 	joint_material = create_line_material(Color(0.6,0.8,1.0));
 	joint_material = create_line_material(Color(0.6,0.8,1.0));
 
 
 	stream_player_icon = Ref<FixedSpatialMaterial>( memnew( FixedSpatialMaterial ));
 	stream_player_icon = Ref<FixedSpatialMaterial>( memnew( FixedSpatialMaterial ));