Several bugfixes, improving the import workflow

This commit is contained in:
Juan Linietsky 2017-02-06 00:38:39 -03:00
parent af3fabeb77
commit 6f2e16306a
31 changed files with 483 additions and 155 deletions

View file

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

View file

@ -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 {
ERR_FAIL_INDEX_V(p_mipmap,(mipmaps+1),-1);
ERR_FAIL_INDEX_V(p_mipmap,get_mipmap_count()+1,-1);
int 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)) {
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);
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();
@ -1043,18 +1042,16 @@ Error Image::generate_mipmaps(bool p_keep_existing) {
int 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;
@ -1077,18 +1074,15 @@ Error Image::generate_mipmaps(bool p_keep_existing) {
int 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;
@ -1096,8 +1090,11 @@ Error Image::generate_mipmaps(bool p_keep_existing) {
prev_h=h;
}
}
mipmaps=true;
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);
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()) {
ERR_EXPLAIN("Expected data size of "+itos(size)+" in Image::create()");

View file

@ -196,7 +196,7 @@ public:
/**
* 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();

View file

@ -1,5 +1,6 @@
#include "resource_import.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 {
@ -36,7 +37,13 @@ Error ResourceFormatImporter::_get_path_and_type(const String& p_path, PathAndTy
}
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;
} else if (assign=="type") {
r_path_and_type.type=value;
@ -154,6 +161,20 @@ bool ResourceFormatImporter::handles_type(const String& p_type) const {
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 {
PathAndType pat;

View file

@ -31,6 +31,7 @@ public:
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); }
Ref<ResourceImporter> get_importer_by_name(const String& p_name);

View file

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

View file

@ -1081,6 +1081,18 @@ bool RasterizerSceneGLES3::_setup_material(RasterizerStorageGLES3::Material* p_m
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) {
switch(p_material->shader->spatial.depth_draw_mode) {
case RasterizerStorageGLES3::Shader::Spatial::DEPTH_DRAW_ALPHA_PREPASS:
@ -1204,6 +1216,11 @@ bool RasterizerSceneGLES3::_setup_material(RasterizerStorageGLES3::Material* p_m
} else {
#ifdef TOOLS_ENABLED
if (t->detect_3d) {
t->detect_3d(t->detect_3d_ud);
}
#endif
if (storage->config.srgb_decode_supported) {
//if SRGB decode extension is present, simply switch the texture to whathever is needed
bool must_srgb=false;
@ -1216,9 +1233,8 @@ bool RasterizerSceneGLES3::_setup_material(RasterizerStorageGLES3::Material* p_m
if (must_srgb) {
glTexParameteri(t->target,_TEXTURE_SRGB_DECODE_EXT,_DECODE_EXT);
#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
@ -1714,6 +1730,9 @@ void RasterizerSceneGLES3::_render_list(RenderList::Element **p_elements,int p_e
state.cull_front=false;
glCullFace(GL_BACK);
state.current_depth_test=true;
glEnable(GL_DEPTH_TEST);
state.scene_shader.set_conditional(SceneShaderGLES3::USE_SKELETON,false);
state.current_blend_mode=-1;

View file

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

View file

@ -218,7 +218,7 @@ Image RasterizerStorageGLES3::_get_gl_image_and_format(const Image& p_image, Ima
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_type=GL_UNSIGNED_BYTE;
r_compressed=true;
@ -785,7 +785,7 @@ void RasterizerStorageGLES3::texture_set_data(RID p_texture,const Image& p_image
if (texture->compressed) {
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 {
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)) {
//generate mipmaps if they were requested and the image does not contain them
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;
@ -1066,6 +1070,26 @@ void RasterizerStorageGLES3::textures_keep_original(bool 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 {
Texture * texture = texture_owner.get(p_source);
@ -1515,12 +1539,12 @@ void RasterizerStorageGLES3::_update_shader(Shader* p_shader) const {
actions->uniforms=&p_shader->uniforms;
}
} break;
case VS::SHADER_PARTICLES: {
actions=&shaders.actions_particles;
actions->uniforms=&p_shader->uniforms;
}
} break;
}
@ -6294,6 +6318,25 @@ bool RasterizerStorageGLES3::free(RID p_rid){
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;
}
////////////////////////////////////////////

View file

@ -228,6 +228,12 @@ public:
Image images[6];
VisualServer::TextureDetectCallback detect_3d;
void *detect_3d_ud;
VisualServer::TextureDetectCallback detect_srgb;
void *detect_srgb_ud;
Texture() {
using_srgb=false;
@ -243,6 +249,10 @@ public:
total_data_size=0;
target=GL_TEXTURE_2D;
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 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 */
struct SkyBox : public RID_Data {
@ -1237,6 +1251,7 @@ public:
void initialize();
void finalize();
virtual bool has_os_feature(const String& p_feature) const;
RasterizerStorageGLES3();

View file

@ -582,6 +582,7 @@ Error ShaderCompilerGLES3::compile(VS::ShaderMode p_mode, const String& p_code,
used_name_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]);

View file

@ -30,6 +30,7 @@
#ifdef UNIX_ENABLED
#include "servers/visual_server.h"
#include "thread_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 p=get_global_settings_path();
if (p!="")

View file

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

View file

@ -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()));
*p_img=Image(p_img->get_width(),p_img->get_height(),p_img->has_mipmaps(),Image::FORMAT_RGB8,dst);
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);
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> dst_data;
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 ofs=0;
PoolVector<uint8_t>::Write w=dst_data.write();
rg_etc1::etc1_pack_params pp;
@ -133,9 +134,9 @@ static void _compress_etc(Image *p_img) {
int bh=MAX(imgh/4,1);
const uint8_t *src = &r[img.get_mipmap_offset(i)];
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));

View file

@ -64,10 +64,9 @@ void image_compress_squish(Image *p_image) {
p_image->convert(Image::FORMAT_RGBA8); //always expects rgba
int mm_count = p_image->get_mipmap_count();
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);
PoolVector<uint8_t>::Read rb = p_image->get_data().read();

View file

@ -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++) {
@ -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)
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);
@ -1009,6 +1018,10 @@ void GIProbe::_find_meshes(Node *p_at_node,Baker *p_baker){
Baker::PlotMesh pm;
pm.local_xform=xf;
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);
}
@ -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()));
_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);

View file

@ -114,6 +114,8 @@ private:
int axis_cell_size[3];
struct PlotMesh {
Ref<Material> override_material;
Vector<Ref<Material> > instance_materials;
Ref<Mesh> mesh;
Transform local_xform;
};
@ -141,7 +143,7 @@ private:
Vector<Color> _get_bake_texture(Image &p_image,const Color& p_color);
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_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 _fixup_plot(int p_idx, int p_level,int p_x,int p_y, int p_z,Baker *p_baker);

View file

@ -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 {
@ -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("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)) {
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();
int bytes = f->get_buffer(w.ptr(),total_size - ofs);
print_line("requested read: "+itos(total_size - ofs)+" but got: "+itos(bytes));
memdelete(f);
@ -722,6 +760,12 @@ void StreamTexture::set_flags(uint32_t p_flags){
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);
}

View file

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

View file

@ -196,6 +196,8 @@ public:
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;
@ -512,6 +514,7 @@ public:
virtual VS::InstanceType get_base_type(RID p_rid) const=0;
virtual bool free(RID p_rid)=0;
virtual bool has_os_feature(const String& p_feature) const=0;
static RasterizerStorage*base_signleton;
RasterizerStorage();

View file

@ -157,6 +157,12 @@ RID VisualServerRaster::get_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() {
VSG::canvas = memnew( VisualServerCanvas);

View file

@ -622,7 +622,8 @@ public:
BIND3(texture_set_size_override,RID,int,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&)
BIND1RC(String,texture_get_path,RID)
@ -1135,6 +1136,8 @@ public:
virtual bool has_feature(Features p_feature) const;
virtual bool has_os_feature(const String& p_feature) const;
VisualServerRaster();
~VisualServerRaster();

View file

@ -129,6 +129,11 @@ public:
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 {
RID texture;
Size2 size;
@ -938,6 +943,8 @@ public:
virtual bool has_feature(Features p_feature) const=0;
virtual bool has_os_feature(const String& p_feature) const=0;
VisualServer();
virtual ~VisualServer();

View file

@ -1028,7 +1028,7 @@ void EditorFileSystem::_notification(int p_what) {
bool EditorFileSystem::is_scanning() const {
return scanning;
return scanning || scanning_changes;
}
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()+"\"");
}
if (importer->get_save_extension()=="") {
//no path
} 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()) {
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 {
@ -1426,6 +1430,8 @@ void EditorFileSystem::_reimport_file(const String& p_file) {
f->store_line("");
//store options in provided order, to avoid file changing
for (List<ResourceImporter::ImportOption>::Element *E=opts.front();E;E=E->next()) {
String base = E->get().option.name;
@ -1442,11 +1448,25 @@ void EditorFileSystem::_reimport_file(const String& p_file) {
//update modified times, to avoid reimport
fs->files[cpos]->modified_time = FileAccess::get_modified_time(p_file);
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) {
importing=true;
EditorProgress pr("reimport",TTR("(Re)Importing Assets"),p_files.size());
for(int i=0;i<p_files.size();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();
importing=false;
if (!is_scanning()) {
emit_signal("filesystem_changed");
}
}
void EditorFileSystem::_bind_methods() {
@ -1503,6 +1527,7 @@ EditorFileSystem::EditorFileSystem() {
thread = NULL;
scanning=false;
importing=false;
use_threads=true;
thread_sources=NULL;
new_filesystem=NULL;

View file

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

View file

@ -308,6 +308,8 @@ void EditorNode::_notification(int p_what) {
}
ResourceImporterTexture::get_singleton()->update_imports();
}
if (p_what==NOTIFICATION_ENTER_TREE) {
@ -411,8 +413,10 @@ void EditorNode::_fs_changed() {
if (E->get()->get_import_path()!=String()) {
//imported resource
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()) {
print_line("success");
changed.push_back(E->get());
}

View file

@ -430,9 +430,10 @@ Error ColladaImport::_create_material(const String& p_target) {
}
} else {
//material->set_parameter(FixedSpatialMaterial::PARAM_SPECULAR,effect.specular.color);
material->set_metalness(effect.specular.color.get_v());
}
// EMISSION
if (effect.emission.texture!="") {
@ -443,17 +444,21 @@ Error ColladaImport::_create_material(const String& p_target) {
Ref<Texture> texture = ResourceLoader::load(texfile,"Texture");
if (texture.is_valid()) {
material->set_feature(FixedSpatialMaterial::FEATURE_EMISSION,true);
material->set_texture(FixedSpatialMaterial::TEXTURE_EMISSION,texture);
material->set_emission(Color(1,1,1,1));
//material->set_parameter(FixedSpatialMaterial::PARAM_EMISSION,Color(1,1,1,1));
}else {
//missing_textures.push_back(texfile.get_file());
missing_textures.push_back(texfile.get_file());
}
}
} 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
@ -465,6 +470,7 @@ Error ColladaImport::_create_material(const String& p_target) {
Ref<Texture> texture = ResourceLoader::load(texfile,"Texture");
if (texture.is_valid()) {
material->set_feature(FixedSpatialMaterial::FEATURE_NORMAL_MAPPING,true);
material->set_texture(FixedSpatialMaterial::TEXTURE_NORMAL,texture);
//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) {
material->set_cull_mode(FixedSpatialMaterial::CULL_DISABLED);
}

View file

@ -1,6 +1,106 @@
#include "resource_importer_texture.h"
#include "io/image_loader.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 {
@ -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/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/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/premult_alpha"),true));
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);
@ -86,6 +186,11 @@ void ResourceImporterTexture::_save_stex(const Image& p_image,const String& p_to
format|=StreamTexture::FORMAT_BIT_STREAM;
if (p_mipmaps || p_compress_mode==COMPRESS_VIDEO_RAM) //VRAM always uses mipmaps
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) {
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;
format=StreamTexture::FORMAT_BIT_LOSSLESS;
format|=StreamTexture::FORMAT_BIT_LOSSLESS;
f->store_32(format);
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;
format=StreamTexture::FORMAT_BIT_LOSSY;
format|=StreamTexture::FORMAT_BIT_LOSSY;
f->store_32(format);
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();
int dl = data.size();
PoolVector<uint8_t>::Read r = data.read();
f->store_buffer(r.ptr(),dl);
} break;
@ -198,7 +302,7 @@ Error ResourceImporterTexture::import(const String& p_source_file, const String&
bool filter= p_options["flags/filter"];
bool mipmaps= p_options["flags/mipmaps"];
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 premult_alpha= p_options["process/premult_alpha"];
bool stream = p_options["stream"];
@ -222,7 +326,7 @@ Error ResourceImporterTexture::import(const String& p_source_file, const String&
tex_flags|=Texture::FLAG_MIPMAPS;
if (anisotropic)
tex_flags|=Texture::FLAG_ANISOTROPIC_FILTER;
if (srgb)
if (srgb==1)
tex_flags|=Texture::FLAG_CONVERT_TO_LINEAR;
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();
}
bool detect_3d = p_options["detect_3d"];
bool detect_srgb = srgb==2;
if (compress_mode==COMPRESS_VIDEO_RAM) {
//must import in all formats
//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");
//_save_stex(image,p_save_path+".etc2.stex",compress_mode,lossy,Image::COMPRESS_ETC2,mipmaps,tex_flags,stream);
//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");
} else {
//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;
}
ResourceImporterTexture *ResourceImporterTexture::singleton=NULL;
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);
}

View file

@ -2,10 +2,33 @@
#define RESOURCEIMPORTTEXTURE_H
#include "io/resource_import.h"
class StreamTexture;
class ResourceImporterTexture : public 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:
static ResourceImporterTexture *get_singleton() { return singleton; }
virtual String get_importer_name() const;
virtual String get_visible_name() 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 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);
void update_imports();
ResourceImporterTexture();
~ResourceImporterTexture();
};
#endif // RESOURCEIMPORTTEXTURE_H

View file

@ -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() );
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++) {
@ -318,84 +316,30 @@ ObjectID SpatialEditorViewport::_select_ray(const Point2& p_pos, bool p_append,b
if (dist<0)
continue;
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())
return 0;
results.sort();
Spatial *s=NULL;
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)
*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;
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 (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 (!s)
if (!item)
return 0;
return s->get_instance_ID();
if (!editor_selection->is_selected(item) || (r_gizmo_handle && selected_handle>=0)) {
if (r_gizmo_handle)
*r_gizmo_handle=selected_handle;
}
return closest;
}
@ -3143,7 +3087,7 @@ void SpatialEditor::_init_indicators() {
indicator_mat.instance();
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_SRGB_VERTEX_COLOR,true);

View file

@ -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;
@ -3406,7 +3406,7 @@ SpatialEditorGizmos::SpatialEditorGizmos() {
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));
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));
stream_player_icon = Ref<FixedSpatialMaterial>( memnew( FixedSpatialMaterial ));