diff options
Diffstat (limited to 'drivers')
| -rw-r--r-- | drivers/gles2/rasterizer_gles2.cpp | 1 | ||||
| -rw-r--r-- | drivers/gles3/rasterizer_canvas_gles3.cpp | 7 | ||||
| -rw-r--r-- | drivers/gles3/rasterizer_scene_gles3.cpp | 60 | ||||
| -rw-r--r-- | drivers/gles3/rasterizer_scene_gles3.h | 5 | ||||
| -rw-r--r-- | drivers/gles3/rasterizer_storage_gles3.cpp | 20 | ||||
| -rw-r--r-- | drivers/gles3/rasterizer_storage_gles3.h | 2 | ||||
| -rw-r--r-- | drivers/gles3/shaders/subsurf_scattering.glsl | 145 | ||||
| -rw-r--r-- | drivers/gles3/shaders/tonemap.glsl | 2 | ||||
| -rw-r--r-- | drivers/png/image_loader_png.cpp | 2 | ||||
| -rw-r--r-- | drivers/png/image_loader_png.h | 2 | ||||
| -rw-r--r-- | drivers/unix/dir_access_unix.cpp | 45 |
11 files changed, 184 insertions, 107 deletions
diff --git a/drivers/gles2/rasterizer_gles2.cpp b/drivers/gles2/rasterizer_gles2.cpp index 6a6611ff81..75d5d01890 100644 --- a/drivers/gles2/rasterizer_gles2.cpp +++ b/drivers/gles2/rasterizer_gles2.cpp @@ -654,7 +654,6 @@ Ref<Image> RasterizerGLES2::_get_gl_image_and_format(const Ref<Image> &p_image, } else { - r_gl_internal_format = _EXT_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; r_gl_internal_format = (srgb_supported && p_flags & VS::TEXTURE_FLAG_CONVERT_TO_LINEAR) ? _EXT_COMPRESSED_SRGB_ALPHA_PVRTC_2BPPV1_EXT : _EXT_COMPRESSED_RGBA_PVRTC_2BPPV1_IMG; r_gl_components = 1; //doesn't matter much r_compressed = true; diff --git a/drivers/gles3/rasterizer_canvas_gles3.cpp b/drivers/gles3/rasterizer_canvas_gles3.cpp index e6ffa39197..376a208559 100644 --- a/drivers/gles3/rasterizer_canvas_gles3.cpp +++ b/drivers/gles3/rasterizer_canvas_gles3.cpp @@ -691,6 +691,13 @@ void RasterizerCanvasGLES3::_canvas_item_render_commands(Item *p_item, Item *cur state.canvas_shader.set_uniform(CanvasShaderGLES3::COLOR_TEXPIXEL_SIZE, texpixel_size); } _draw_polygon(polygon->indices.ptr(), polygon->count, polygon->points.size(), polygon->points.ptr(), polygon->uvs.ptr(), polygon->colors.ptr(), polygon->colors.size() == 1); +#ifdef GLES_OVER_GL + if (polygon->antialiased) { + glEnable(GL_LINE_SMOOTH); + _draw_generic(GL_LINE_LOOP, polygon->points.size(), polygon->points.ptr(), polygon->uvs.ptr(), polygon->colors.ptr(), polygon->colors.size() == 1); + glDisable(GL_LINE_SMOOTH); + } +#endif } break; case Item::Command::TYPE_PARTICLES: { diff --git a/drivers/gles3/rasterizer_scene_gles3.cpp b/drivers/gles3/rasterizer_scene_gles3.cpp index ac6ca1ec0c..c89fc0768f 100644 --- a/drivers/gles3/rasterizer_scene_gles3.cpp +++ b/drivers/gles3/rasterizer_scene_gles3.cpp @@ -1088,11 +1088,12 @@ void RasterizerSceneGLES3::gi_probe_instance_set_bounds(RID p_probe, const Vecto bool RasterizerSceneGLES3::_setup_material(RasterizerStorageGLES3::Material *p_material, bool p_alpha_pass) { + /* this is handled outside if (p_material->shader->spatial.cull_mode == RasterizerStorageGLES3::Shader::Spatial::CULL_MODE_DISABLED) { glDisable(GL_CULL_FACE); } else { glEnable(GL_CULL_FACE); - } + } */ if (state.current_line_width != p_material->line_width) { //glLineWidth(MAX(p_material->line_width,1.0)); @@ -1857,12 +1858,21 @@ void RasterizerSceneGLES3::_setup_light(RenderList::Element *e, const Transform } } -void RasterizerSceneGLES3::_set_cull(bool p_front, bool p_reverse_cull) { +void RasterizerSceneGLES3::_set_cull(bool p_front, bool p_disabled, bool p_reverse_cull) { bool front = p_front; if (p_reverse_cull) front = !front; + if (p_disabled != state.cull_disabled) { + if (p_disabled) + glDisable(GL_CULL_FACE); + else + glEnable(GL_CULL_FACE); + + state.cull_disabled = p_disabled; + } + if (front != state.cull_front) { glCullFace(front ? GL_FRONT : GL_BACK); @@ -1900,7 +1910,9 @@ void RasterizerSceneGLES3::_render_list(RenderList::Element **p_elements, int p_ } state.cull_front = false; + state.cull_disabled = false; glCullFace(GL_BACK); + glEnable(GL_CULL_FACE); state.current_depth_test = true; glEnable(GL_DEPTH_TEST); @@ -2101,7 +2113,7 @@ void RasterizerSceneGLES3::_render_list(RenderList::Element **p_elements, int p_ storage->info.render.surface_switch_count++; } - _set_cull(e->sort_key & RenderList::SORT_KEY_MIRROR_FLAG, p_reverse_cull); + _set_cull(e->sort_key & RenderList::SORT_KEY_MIRROR_FLAG, e->sort_key & RenderList::SORT_KEY_CULL_DISABLED_FLAG, p_reverse_cull); state.scene_shader.set_uniform(SceneShaderGLES3::NORMAL_MULT, e->instance->mirror ? -1.0 : 1.0); state.scene_shader.set_uniform(SceneShaderGLES3::WORLD_TRANSFORM, e->instance->transform); @@ -2188,8 +2200,12 @@ void RasterizerSceneGLES3::_add_geometry_with_material(RasterizerStorageGLES3::G bool shadow = false; bool mirror = p_instance->mirror; + bool no_cull = false; - if (p_material->shader->spatial.cull_mode == RasterizerStorageGLES3::Shader::Spatial::CULL_MODE_FRONT) { + if (p_material->shader->spatial.cull_mode == RasterizerStorageGLES3::Shader::Spatial::CULL_MODE_DISABLED) { + no_cull = true; + mirror = false; + } else if (p_material->shader->spatial.cull_mode == RasterizerStorageGLES3::Shader::Spatial::CULL_MODE_FRONT) { mirror = !mirror; } @@ -2208,10 +2224,13 @@ void RasterizerSceneGLES3::_add_geometry_with_material(RasterizerStorageGLES3::G if (!p_material->shader->spatial.uses_alpha_scissor && !p_material->shader->spatial.writes_modelview_or_projection && !p_material->shader->spatial.uses_vertex && !p_material->shader->spatial.uses_discard && p_material->shader->spatial.depth_draw_mode != RasterizerStorageGLES3::Shader::Spatial::DEPTH_DRAW_ALPHA_PREPASS) { //shader does not use discard and does not write a vertex position, use generic material - if (p_instance->cast_shadows == VS::SHADOW_CASTING_SETTING_DOUBLE_SIDED) + if (p_instance->cast_shadows == VS::SHADOW_CASTING_SETTING_DOUBLE_SIDED) { p_material = storage->material_owner.getptr(default_material_twosided); - else + no_cull = true; + mirror = false; + } else { p_material = storage->material_owner.getptr(default_material); + } } has_alpha = false; @@ -2275,6 +2294,10 @@ void RasterizerSceneGLES3::_add_geometry_with_material(RasterizerStorageGLES3::G e->sort_key |= RenderList::SORT_KEY_MIRROR_FLAG; } + if (no_cull) { + e->sort_key |= RenderList::SORT_KEY_CULL_DISABLED_FLAG; + } + //e->light_type=0xFF; // no lights! if (shadow || p_material->shader->spatial.unshaded || state.debug_draw == VS::VIEWPORT_DEBUG_DRAW_UNSHADED) { @@ -2286,6 +2309,16 @@ void RasterizerSceneGLES3::_add_geometry_with_material(RasterizerStorageGLES3::G e->sort_key |= SORT_KEY_VERTEX_LIT_FLAG; } + + if (!shadow && has_alpha && p_material->shader->spatial.depth_draw_mode == RasterizerStorageGLES3::Shader::Spatial::DEPTH_DRAW_ALPHA_PREPASS) { + //depth prepass for alpha + RenderList::Element *eo = render_list.add_element(); + + eo->instance = e->instance; + eo->geometry = e->geometry; + eo->material = e->material; + eo->sort_key = e->sort_key; + } } void RasterizerSceneGLES3::_draw_sky(RasterizerStorageGLES3::Sky *p_sky, const CameraMatrix &p_projection, const Transform &p_transform, bool p_vflip, float p_scale, float p_energy) { @@ -3269,6 +3302,10 @@ void RasterizerSceneGLES3::_render_mrts(Environment *env, const CameraMatrix &p_ if (state.used_sss) { //sss enabled //copy diffuse while performing sss + Plane p = p_cam_projection.xform4(Plane(1, 0, -1, 1)); + p.normal /= p.d; + float unit_size = p.normal.x; + //copy normal and roughness to effect buffer glBindFramebuffer(GL_READ_FRAMEBUFFER, storage->frame.current_rt->buffers.fbo); glReadBuffer(GL_COLOR_ATTACHMENT3); @@ -3279,9 +3316,10 @@ void RasterizerSceneGLES3::_render_mrts(Environment *env, const CameraMatrix &p_ state.sss_shader.set_conditional(SubsurfScatteringShaderGLES3::USE_17_SAMPLES, subsurface_scatter_quality == SSS_QUALITY_MEDIUM); state.sss_shader.set_conditional(SubsurfScatteringShaderGLES3::USE_25_SAMPLES, subsurface_scatter_quality == SSS_QUALITY_HIGH); state.sss_shader.set_conditional(SubsurfScatteringShaderGLES3::ENABLE_FOLLOW_SURFACE, subsurface_scatter_follow_surface); + state.sss_shader.set_conditional(SubsurfScatteringShaderGLES3::ENABLE_STRENGTH_WEIGHTING, subsurface_scatter_weight_samples); state.sss_shader.bind(); state.sss_shader.set_uniform(SubsurfScatteringShaderGLES3::MAX_RADIUS, subsurface_scatter_size); - state.sss_shader.set_uniform(SubsurfScatteringShaderGLES3::FOVY, p_cam_projection.get_fov()); + state.sss_shader.set_uniform(SubsurfScatteringShaderGLES3::UNIT_SIZE, unit_size); state.sss_shader.set_uniform(SubsurfScatteringShaderGLES3::CAMERA_Z_NEAR, p_cam_projection.get_z_near()); state.sss_shader.set_uniform(SubsurfScatteringShaderGLES3::CAMERA_Z_FAR, p_cam_projection.get_z_far()); state.sss_shader.set_uniform(SubsurfScatteringShaderGLES3::DIR, Vector2(1, 0)); @@ -3296,14 +3334,13 @@ void RasterizerSceneGLES3::_render_mrts(Environment *env, const CameraMatrix &p_ glBindTexture(GL_TEXTURE_2D, storage->frame.current_rt->effects.ssao.blur_red[0]); glActiveTexture(GL_TEXTURE2); glBindTexture(GL_TEXTURE_2D, storage->frame.current_rt->depth); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE); + //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_NONE); glBindFramebuffer(GL_FRAMEBUFFER, storage->frame.current_rt->fbo); //copy to front first _copy_screen(true); glActiveTexture(GL_TEXTURE0); - glBindTexture(GL_TEXTURE_2D, storage->frame.current_rt->color); state.sss_shader.set_uniform(SubsurfScatteringShaderGLES3::DIR, Vector2(0, 1)); glBindFramebuffer(GL_FRAMEBUFFER, storage->frame.current_rt->effects.mip_maps[0].sizes[0].fbo); // copy to base level @@ -4535,6 +4572,9 @@ void RasterizerSceneGLES3::render_shadow(RID p_light, RID p_shadow_atlas, int p_ state.scene_shader.set_conditional(SceneShaderGLES3::RENDER_DEPTH, true); + if (light->reverse_cull) { + flip_facing = !flip_facing; + } _render_list(render_list.elements, render_list.element_count, light_transform, light_projection, 0, flip_facing, false, true, false, false); state.scene_shader.set_conditional(SceneShaderGLES3::RENDER_DEPTH, false); @@ -4919,6 +4959,7 @@ void RasterizerSceneGLES3::initialize() { GLOBAL_DEF("rendering/quality/subsurface_scattering/scale", 1.0); ProjectSettings::get_singleton()->set_custom_property_info("rendering/quality/subsurface_scattering/scale", PropertyInfo(Variant::INT, "rendering/quality/subsurface_scattering/scale", PROPERTY_HINT_RANGE, "0.01,8,0.01")); GLOBAL_DEF("rendering/quality/subsurface_scattering/follow_surface", false); + GLOBAL_DEF("rendering/quality/subsurface_scattering/weight_samples", true); GLOBAL_DEF("rendering/quality/voxel_cone_tracing/high_quality", true); } @@ -4961,6 +5002,7 @@ void RasterizerSceneGLES3::iteration() { shadow_filter_mode = ShadowFilterMode(int(ProjectSettings::get_singleton()->get("rendering/quality/shadows/filter_mode"))); subsurface_scatter_follow_surface = ProjectSettings::get_singleton()->get("rendering/quality/subsurface_scattering/follow_surface"); + subsurface_scatter_weight_samples = ProjectSettings::get_singleton()->get("rendering/quality/subsurface_scattering/weight_samples"); subsurface_scatter_quality = SubSurfaceScatterQuality(int(ProjectSettings::get_singleton()->get("rendering/quality/subsurface_scattering/quality"))); subsurface_scatter_size = ProjectSettings::get_singleton()->get("rendering/quality/subsurface_scattering/scale"); diff --git a/drivers/gles3/rasterizer_scene_gles3.h b/drivers/gles3/rasterizer_scene_gles3.h index e1d96f23dd..94781c53e8 100644 --- a/drivers/gles3/rasterizer_scene_gles3.h +++ b/drivers/gles3/rasterizer_scene_gles3.h @@ -66,6 +66,7 @@ public: SubSurfaceScatterQuality subsurface_scatter_quality; float subsurface_scatter_size; bool subsurface_scatter_follow_surface; + bool subsurface_scatter_weight_samples; uint64_t render_pass; uint64_t scene_pass; @@ -187,6 +188,7 @@ public: int reflection_probe_count; bool cull_front; + bool cull_disabled; bool used_sss; bool used_screen_texture; bool using_contact_shadows; @@ -654,6 +656,7 @@ public: SORT_KEY_MATERIAL_INDEX_SHIFT = 40, SORT_KEY_GEOMETRY_INDEX_SHIFT = 20, SORT_KEY_GEOMETRY_TYPE_SHIFT = 15, + SORT_KEY_CULL_DISABLED_FLAG = 4, SORT_KEY_SKELETON_FLAG = 2, SORT_KEY_MIRROR_FLAG = 1 @@ -779,7 +782,7 @@ public: RenderList render_list; - _FORCE_INLINE_ void _set_cull(bool p_front, bool p_reverse_cull); + _FORCE_INLINE_ void _set_cull(bool p_front, bool p_disabled, bool p_reverse_cull); _FORCE_INLINE_ bool _setup_material(RasterizerStorageGLES3::Material *p_material, bool p_alpha_pass); _FORCE_INLINE_ void _setup_geometry(RenderList::Element *e, const Transform &p_view_transform); diff --git a/drivers/gles3/rasterizer_storage_gles3.cpp b/drivers/gles3/rasterizer_storage_gles3.cpp index 8dd083fbe8..68731308a9 100644 --- a/drivers/gles3/rasterizer_storage_gles3.cpp +++ b/drivers/gles3/rasterizer_storage_gles3.cpp @@ -2497,7 +2497,13 @@ void RasterizerStorageGLES3::_update_material(Material *material) { //value=E->get().default_value; } else { //zero because it was not provided - _fill_std140_ubo_empty(E->get().type, data); + if (E->get().type == ShaderLanguage::TYPE_VEC4 && E->get().hint == ShaderLanguage::ShaderNode::Uniform::HINT_COLOR) { + //colors must be set as black, with alpha as 1.0 + _fill_std140_variant_ubo_value(E->get().type, Color(0, 0, 0, 1), data, material->shader->mode == VS::SHADER_SPATIAL); + } else { + //else just zero it out + _fill_std140_ubo_empty(E->get().type, data); + } } } @@ -4451,7 +4457,7 @@ RID RasterizerStorageGLES3::light_create(VS::LightType p_type) { light->omni_shadow_mode = VS::LIGHT_OMNI_SHADOW_DUAL_PARABOLOID; light->omni_shadow_detail = VS::LIGHT_OMNI_SHADOW_DETAIL_VERTICAL; light->directional_blend_splits = false; - + light->reverse_cull = false; light->version = 0; return light_owner.make_rid(light); @@ -4530,6 +4536,14 @@ void RasterizerStorageGLES3::light_set_cull_mask(RID p_light, uint32_t p_mask) { light->instance_change_notify(); } +void RasterizerStorageGLES3::light_set_reverse_cull_face_mode(RID p_light, bool p_enabled) { + + Light *light = light_owner.getornull(p_light); + ERR_FAIL_COND(!light); + + light->reverse_cull = p_enabled; +} + void RasterizerStorageGLES3::light_omni_set_shadow_mode(RID p_light, VS::LightOmniShadowMode p_mode) { Light *light = light_owner.getornull(p_light); @@ -6239,7 +6253,7 @@ void RasterizerStorageGLES3::_render_target_allocate(RenderTarget *rt) { glBindFramebuffer(GL_FRAMEBUFFER, mm.fbo); glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, rt->effects.mip_maps[i].color, j); bool used_depth = false; - if (j == 0 && i == 0 && rt->buffers.active == false && !rt->flags[RENDER_TARGET_NO_3D]) { //will use this one for rendering 3D + if (j == 0 && i == 0) { //use always glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, rt->depth, 0); used_depth = true; } diff --git a/drivers/gles3/rasterizer_storage_gles3.h b/drivers/gles3/rasterizer_storage_gles3.h index 3c7ea000ba..f612d9e879 100644 --- a/drivers/gles3/rasterizer_storage_gles3.h +++ b/drivers/gles3/rasterizer_storage_gles3.h @@ -868,6 +868,7 @@ public: RID projector; bool shadow; bool negative; + bool reverse_cull; uint32_t cull_mask; VS::LightOmniShadowMode omni_shadow_mode; VS::LightOmniShadowDetail omni_shadow_detail; @@ -887,6 +888,7 @@ public: virtual void light_set_projector(RID p_light, RID p_texture); virtual void light_set_negative(RID p_light, bool p_enable); virtual void light_set_cull_mask(RID p_light, uint32_t p_mask); + virtual void light_set_reverse_cull_face_mode(RID p_light, bool p_enabled); virtual void light_omni_set_shadow_mode(RID p_light, VS::LightOmniShadowMode p_mode); virtual void light_omni_set_shadow_detail(RID p_light, VS::LightOmniShadowDetail p_detail); diff --git a/drivers/gles3/shaders/subsurf_scattering.glsl b/drivers/gles3/shaders/subsurf_scattering.glsl index 569be6c5fe..8873443727 100644 --- a/drivers/gles3/shaders/subsurf_scattering.glsl +++ b/drivers/gles3/shaders/subsurf_scattering.glsl @@ -17,36 +17,36 @@ void main() { //#define QUALIFIER uniform // some guy on the interweb says it may be faster with this #define QUALIFIER const - #ifdef USE_25_SAMPLES const int kernel_size=25; -QUALIFIER vec4 kernel[25] = vec4[] ( - vec4(0.530605, 0.613514, 0.739601, 0.0), - vec4(0.000973794, 1.11862e-005, 9.43437e-007, -3.0), - vec4(0.00333804, 7.85443e-005, 1.2945e-005, -2.52083), - vec4(0.00500364, 0.00020094, 5.28848e-005, -2.08333), - vec4(0.00700976, 0.00049366, 0.000151938, -1.6875), - vec4(0.0094389, 0.00139119, 0.000416598, -1.33333), - vec4(0.0128496, 0.00356329, 0.00132016, -1.02083), - vec4(0.017924, 0.00711691, 0.00347194, -0.75), - vec4(0.0263642, 0.0119715, 0.00684598, -0.520833), - vec4(0.0410172, 0.0199899, 0.0118481, -0.333333), - vec4(0.0493588, 0.0367726, 0.0219485, -0.1875), - vec4(0.0402784, 0.0657244, 0.04631, -0.0833333), - vec4(0.0211412, 0.0459286, 0.0378196, -0.0208333), - vec4(0.0211412, 0.0459286, 0.0378196, 0.0208333), - vec4(0.0402784, 0.0657244, 0.04631, 0.0833333), - vec4(0.0493588, 0.0367726, 0.0219485, 0.1875), - vec4(0.0410172, 0.0199899, 0.0118481, 0.333333), - vec4(0.0263642, 0.0119715, 0.00684598, 0.520833), - vec4(0.017924, 0.00711691, 0.00347194, 0.75), - vec4(0.0128496, 0.00356329, 0.00132016, 1.02083), - vec4(0.0094389, 0.00139119, 0.000416598, 1.33333), - vec4(0.00700976, 0.00049366, 0.000151938, 1.6875), - vec4(0.00500364, 0.00020094, 5.28848e-005, 2.08333), - vec4(0.00333804, 7.85443e-005, 1.2945e-005, 2.52083), - vec4(0.000973794, 1.11862e-005, 9.43437e-007, 3.0) + +QUALIFIER vec2 kernel[25] = vec2[] ( +vec2(0.099654,0.0), +vec2(0.001133,-3.0), +vec2(0.002316,-2.52083), +vec2(0.00445,-2.08333), +vec2(0.008033,-1.6875), +vec2(0.013627,-1.33333), +vec2(0.021724,-1.02083), +vec2(0.032542,-0.75), +vec2(0.04581,-0.520833), +vec2(0.0606,-0.333333), +vec2(0.075333,-0.1875), +vec2(0.088001,-0.0833333), +vec2(0.096603,-0.0208333), +vec2(0.096603,0.0208333), +vec2(0.088001,0.0833333), +vec2(0.075333,0.1875), +vec2(0.0606,0.333333), +vec2(0.04581,0.520833), +vec2(0.032542,0.75), +vec2(0.021724,1.02083), +vec2(0.013627,1.33333), +vec2(0.008033,1.6875), +vec2(0.00445,2.08333), +vec2(0.002316,2.52), +vec2(0.001133,3.0) ); #endif //USE_25_SAMPLES @@ -55,24 +55,24 @@ QUALIFIER vec4 kernel[25] = vec4[] ( const int kernel_size=17; -QUALIFIER vec4 kernel[17] = vec4[]( - vec4(0.536343, 0.624624, 0.748867, 0.0), - vec4(0.00317394, 0.000134823, 3.77269e-005, -2.0), - vec4(0.0100386, 0.000914679, 0.000275702, -1.53125), - vec4(0.0144609, 0.00317269, 0.00106399, -1.125), - vec4(0.0216301, 0.00794618, 0.00376991, -0.78125), - vec4(0.0347317, 0.0151085, 0.00871983, -0.5), - vec4(0.0571056, 0.0287432, 0.0172844, -0.28125), - vec4(0.0582416, 0.0659959, 0.0411329, -0.125), - vec4(0.0324462, 0.0656718, 0.0532821, -0.03125), - vec4(0.0324462, 0.0656718, 0.0532821, 0.03125), - vec4(0.0582416, 0.0659959, 0.0411329, 0.125), - vec4(0.0571056, 0.0287432, 0.0172844, 0.28125), - vec4(0.0347317, 0.0151085, 0.00871983, 0.5), - vec4(0.0216301, 0.00794618, 0.00376991, 0.78125), - vec4(0.0144609, 0.00317269, 0.00106399, 1.125), - vec4(0.0100386, 0.000914679, 0.000275702, 1.53125), - vec4(0.00317394, 0.000134823, 3.77269e-005, 2.0) +QUALIFIER vec2 kernel[17] = vec2[]( +vec2(0.197417,0.0), +vec2(0.000078,-2.0), +vec2(0.000489,-1.53125), +vec2(0.002403,-1.125), +vec2(0.009245,-0.78125), +vec2(0.027835,-0.5), +vec2(0.065592,-0.28125), +vec2(0.12098,-0.125), +vec2(0.17467,-0.03125), +vec2(0.17467,0.03125), +vec2(0.12098,0.125), +vec2(0.065592,0.28125), +vec2(0.027835,0.5), +vec2(0.009245,0.78125), +vec2(0.002403,1.125), +vec2(0.000489,1.53125), +vec2(0.000078,2.0) ); #endif //USE_17_SAMPLES @@ -82,27 +82,27 @@ QUALIFIER vec4 kernel[17] = vec4[]( const int kernel_size=11; -QUALIFIER vec4 kernel[11] = vec4[]( - vec4(0.560479, 0.669086, 0.784728, 0.0), - vec4(0.00471691, 0.000184771, 5.07566e-005, -2.0), - vec4(0.0192831, 0.00282018, 0.00084214, -1.28), - vec4(0.03639, 0.0130999, 0.00643685, -0.72), - vec4(0.0821904, 0.0358608, 0.0209261, -0.32), - vec4(0.0771802, 0.113491, 0.0793803, -0.08), - vec4(0.0771802, 0.113491, 0.0793803, 0.08), - vec4(0.0821904, 0.0358608, 0.0209261, 0.32), - vec4(0.03639, 0.0130999, 0.00643685, 0.72), - vec4(0.0192831, 0.00282018, 0.00084214, 1.28), - vec4(0.00471691, 0.000184771, 5.07565e-005, 2.0) +QUALIFIER vec2 kernel[kernel_size] = vec2[]( +vec2(0.198596,0.0), +vec2(0.0093,-2.0), +vec2(0.028002,-1.28), +vec2(0.065984,-0.72), +vec2(0.121703,-0.32), +vec2(0.175713,-0.08), +vec2(0.175713,0.08), +vec2(0.121703,0.32), +vec2(0.065984,0.72), +vec2(0.028002,1.28), +vec2(0.0093,2.0) ); #endif //USE_11_SAMPLES uniform float max_radius; -uniform float fovy; uniform float camera_z_far; uniform float camera_z_near; +uniform float unit_size; uniform vec2 dir; in vec2 uv_interp; @@ -120,19 +120,17 @@ void main() { // Fetch color of current pixel: vec4 base_color = texture(source_diffuse, uv_interp); + if (strength>0.0) { // Fetch linear depth of current pixel: float depth = texture(source_depth, uv_interp).r * 2.0 - 1.0; depth = 2.0 * camera_z_near * camera_z_far / (camera_z_far + camera_z_near - depth * (camera_z_far - camera_z_near)); - depth=-depth; - // Calculate the radius scale (1.0 for a unit plane sitting on the - // projection window): - float distance = 1.0 / tan(0.5 * fovy); - float scale = distance / -depth; //remember depth is negative by default in OpenGL + + float scale = unit_size / depth; //remember depth is negative by default in OpenGL // Calculate the final step to fetch the surrounding pixels: vec2 step = max_radius * scale * dir; @@ -141,19 +139,21 @@ void main() { // Accumulate the center sample: vec3 color_accum = base_color.rgb; - color_accum *= kernel[0].rgb; + color_accum *= kernel[0].x; +#ifdef ENABLE_STRENGTH_WEIGHTING + float color_weight = kernel[0].x; +#endif // Accumulate the other samples: for (int i = 1; i < kernel_size; i++) { // Fetch color and depth for current sample: - vec2 offset = uv_interp + kernel[i].a * step; + vec2 offset = uv_interp + kernel[i].y * step; vec3 color = texture(source_diffuse, offset).rgb; #ifdef ENABLE_FOLLOW_SURFACE // If the difference in depth is huge, we lerp color back to "colorM": float depth_cmp = texture(source_depth, offset).r *2.0 - 1.0; depth_cmp = 2.0 * camera_z_near * camera_z_far / (camera_z_far + camera_z_near - depth_cmp * (camera_z_far - camera_z_near)); - depth_cmp=-depth_cmp; float s = clamp(300.0f * distance * max_radius * abs(depth - depth_cmp),0.0,1.0); @@ -161,9 +161,20 @@ void main() { #endif // Accumulate: - color_accum += kernel[i].rgb * color; + color*=kernel[i].x; + +#ifdef ENABLE_STRENGTH_WEIGHTING + float color_s = texture(source_sss, offset).r; + color_weight+=color_s * kernel[i].x; + color*=color_s; +#endif + color_accum += color; + } +#ifdef ENABLE_STRENGTH_WEIGHTING + color_accum/=color_weight; +#endif frag_color = vec4(color_accum,base_color.a); //keep alpha (used for SSAO) } else { frag_color = base_color; diff --git a/drivers/gles3/shaders/tonemap.glsl b/drivers/gles3/shaders/tonemap.glsl index 988e31d1ea..73dec4f90c 100644 --- a/drivers/gles3/shaders/tonemap.glsl +++ b/drivers/gles3/shaders/tonemap.glsl @@ -170,7 +170,7 @@ vec3 tonemap_aces(vec3 color) { return color = clamp((color*(a*color+b))/(color*(c*color+d)+e),vec3(0.0),vec3(1.0)); } -vec3 tonemap_reindhart(vec3 color,vec3 white) { +vec3 tonemap_reindhart(vec3 color,float white) { return ( color * ( 1.0 + ( color / ( white) ) ) ) / ( 1.0 + color ); } diff --git a/drivers/png/image_loader_png.cpp b/drivers/png/image_loader_png.cpp index 33d271248c..30ec8cd036 100644 --- a/drivers/png/image_loader_png.cpp +++ b/drivers/png/image_loader_png.cpp @@ -201,7 +201,7 @@ Error ImageLoaderPNG::_load_image(void *rf_up, png_rw_ptr p_func, Ref<Image> p_i return OK; } -Error ImageLoaderPNG::load_image(Ref<Image> p_image, FileAccess *f, bool p_force_linear) { +Error ImageLoaderPNG::load_image(Ref<Image> p_image, FileAccess *f, bool p_force_linear, float p_scale) { Error err = _load_image(f, _read_png_data, p_image); f->close(); diff --git a/drivers/png/image_loader_png.h b/drivers/png/image_loader_png.h index f0a525a9eb..c11e25e1a4 100644 --- a/drivers/png/image_loader_png.h +++ b/drivers/png/image_loader_png.h @@ -43,7 +43,7 @@ class ImageLoaderPNG : public ImageFormatLoader { public: static Error _load_image(void *rf_up, png_rw_ptr p_func, Ref<Image> p_image); - virtual Error load_image(Ref<Image> p_image, FileAccess *f, bool p_force_linear); + virtual Error load_image(Ref<Image> p_image, FileAccess *f, bool p_force_linear, float p_scale); virtual void get_recognized_extensions(List<String> *p_extensions) const; ImageLoaderPNG(); }; diff --git a/drivers/unix/dir_access_unix.cpp b/drivers/unix/dir_access_unix.cpp index a183a37446..cf54f3fea0 100644 --- a/drivers/unix/dir_access_unix.cpp +++ b/drivers/unix/dir_access_unix.cpp @@ -223,37 +223,36 @@ Error DirAccessUnix::make_dir(String p_dir) { Error DirAccessUnix::change_dir(String p_dir) { GLOBAL_LOCK_FUNCTION + p_dir = fix_path(p_dir); - // make sure current_dir is valid absolute path - if (current_dir == "." || current_dir == "") { - char real_current_dir_name[2048]; - getcwd(real_current_dir_name, 2048); - current_dir.parse_utf8(real_current_dir_name); - } - - if (p_dir == ".") { - return OK; - } + char real_current_dir_name[2048]; + getcwd(real_current_dir_name, 2048); + String prev_dir; + if (prev_dir.parse_utf8(real_current_dir_name)) + prev_dir = real_current_dir_name; //no utf8, maybe latin? - p_dir = fix_path(p_dir); + chdir(current_dir.utf8().get_data()); //ascii since this may be unicode or wathever the host os wants + bool worked = (chdir(p_dir.utf8().get_data()) == 0); // we can only give this utf8 - String prev_dir = current_dir; + String base = _get_root_path(); + if (base != "") { - if (p_dir.is_rel_path()) { - String next_dir = current_dir + "/" + p_dir; - next_dir = next_dir.simplify_path(); - current_dir = next_dir; - } else { - current_dir = p_dir; + getcwd(real_current_dir_name, 2048); + String new_dir; + new_dir.parse_utf8(real_current_dir_name); + if (!new_dir.begins_with(base)) + worked = false; } - bool worked = (chdir(current_dir.utf8().get_data()) == 0); // we can only give this utf8 - if (!worked) { - current_dir = prev_dir; - return ERR_INVALID_PARAMETER; + if (worked) { + + getcwd(real_current_dir_name, 2048); + if (current_dir.parse_utf8(real_current_dir_name)) + current_dir = real_current_dir_name; //no utf8, maybe latin? } - return OK; + chdir(prev_dir.utf8().get_data()); + return worked ? OK : ERR_INVALID_PARAMETER; } String DirAccessUnix::get_current_dir() { |