diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/gles2/rasterizer_gles2.cpp | 27 | ||||
-rw-r--r-- | drivers/gles2/rasterizer_gles2.h | 2 |
2 files changed, 24 insertions, 5 deletions
diff --git a/drivers/gles2/rasterizer_gles2.cpp b/drivers/gles2/rasterizer_gles2.cpp index 7714a5d17a..0aff730916 100644 --- a/drivers/gles2/rasterizer_gles2.cpp +++ b/drivers/gles2/rasterizer_gles2.cpp @@ -4781,9 +4781,12 @@ void RasterizerGLES2::_add_geometry( const Geometry* p_geometry, const InstanceD if (has_blend_alpha || (has_base_alpha && m->depth_draw_mode!=VS::MATERIAL_DEPTH_DRAW_OPAQUE_PRE_PASS_ALPHA)) return; //bye - if (m->shader_cache && !m->shader_cache->writes_vertex && !m->shader_cache->uses_discard && m->depth_draw_mode!=VS::MATERIAL_DEPTH_DRAW_OPAQUE_PRE_PASS_ALPHA) { + if (!m->shader_cache || (!m->shader_cache->writes_vertex && !m->shader_cache->uses_discard && m->depth_draw_mode!=VS::MATERIAL_DEPTH_DRAW_OPAQUE_PRE_PASS_ALPHA)) { //shader does not use discard and does not write a vertex position, use generic material - m = shadow_mat_ptr; + if (p_instance->cast_shadows == VS::SHADOW_CASTING_SETTING_DOUBLE_SIDED) + m = shadow_mat_double_sided_ptr; + else + m = shadow_mat_ptr; if (m->last_pass!=frame) { if (m->shader.is_valid()) { @@ -6368,6 +6371,7 @@ void RasterizerGLES2::_render_list_forward(RenderList *p_render_list,const Trans uint8_t prev_sort_flags=0xFF; const BakedLightData *prev_baked_light=NULL; RID prev_baked_light_texture; + const float *prev_morph_values=NULL; Geometry::Type prev_geometry_type=Geometry::GEOMETRY_INVALID; @@ -6406,6 +6410,7 @@ void RasterizerGLES2::_render_list_forward(RenderList *p_render_list,const Trans const Skeleton *skeleton = e->skeleton; const Geometry *geometry_cmp = e->geometry_cmp; const BakedLightData *baked_light = e->instance->baked_light; + const float *morph_values = e->instance->morph_values.ptr(); bool rebind=false; bool bind_baked_light_octree=false; @@ -6428,6 +6433,7 @@ void RasterizerGLES2::_render_list_forward(RenderList *p_render_list,const Trans prev_overrides=NULL; // make it diferent than NULL prev_skeleton =NULL; prev_sort_flags=0xFF; + prev_morph_values=NULL; prev_geometry_type=Geometry::GEOMETRY_INVALID; glEnable(GL_BLEND); glDepthMask(GL_TRUE); @@ -6640,10 +6646,14 @@ void RasterizerGLES2::_render_list_forward(RenderList *p_render_list,const Trans rebind=true; } - if (use_hw_skeleton_xform && skeleton!=prev_skeleton) { + if (use_hw_skeleton_xform && (skeleton!=prev_skeleton||morph_values!=prev_morph_values)) { if (!prev_skeleton || !skeleton) rebind=true; //went from skeleton <-> no skeleton, needs rebind - _setup_skeleton(skeleton); + + if (morph_values==NULL) + _setup_skeleton(skeleton); + else + _setup_skeleton(NULL); } if (material!=prev_material || rebind) { @@ -6731,7 +6741,7 @@ void RasterizerGLES2::_render_list_forward(RenderList *p_render_list,const Trans } if (skeleton != prev_skeleton || rebind) { - if (skeleton) { + if (skeleton && morph_values == NULL) { material_shader.set_uniform(MaterialShaderGLES2::SKELETON_MATRICES, max_texture_units - 2); material_shader.set_uniform(MaterialShaderGLES2::SKELTEX_PIXEL_SIZE, skeleton->pixel_size); } @@ -6788,6 +6798,7 @@ void RasterizerGLES2::_render_list_forward(RenderList *p_render_list,const Trans prev_light_type=e->light_type; prev_sort_flags=sort_flags; prev_baked_light=baked_light; + prev_morph_values=morph_values; // prev_geometry_type=geometry->type; } @@ -10961,6 +10972,12 @@ void RasterizerGLES2::init() { shadow_material = material_create(); //empty with nothing shadow_mat_ptr = material_owner.get(shadow_material); + + // Now create a second shadow material for double-sided shadow instances + shadow_material_double_sided = material_create(); + shadow_mat_double_sided_ptr = material_owner.get(shadow_material_double_sided); + shadow_mat_double_sided_ptr->flags[VS::MATERIAL_FLAG_DOUBLE_SIDED] = true; + overdraw_material = create_overdraw_debug_material(); copy_shader.set_conditional(CopyShaderGLES2::USE_8BIT_HDR,!use_fp16_fb); canvas_shader.set_conditional(CanvasShaderGLES2::USE_DEPTH_SHADOWS,read_depth_supported); diff --git a/drivers/gles2/rasterizer_gles2.h b/drivers/gles2/rasterizer_gles2.h index 0f70ceaa97..2a2f587f11 100644 --- a/drivers/gles2/rasterizer_gles2.h +++ b/drivers/gles2/rasterizer_gles2.h @@ -829,7 +829,9 @@ class RasterizerGLES2 : public Rasterizer { bool fragment_lighting; RID shadow_material; + RID shadow_material_double_sided; Material *shadow_mat_ptr; + Material *shadow_mat_double_sided_ptr; int max_texture_units; GLuint base_framebuffer; |