diff options
Diffstat (limited to 'drivers/gles2')
-rw-r--r-- | drivers/gles2/rasterizer_gles2.cpp | 37 | ||||
-rw-r--r-- | drivers/gles2/rasterizer_gles2.h | 2 | ||||
-rw-r--r-- | drivers/gles2/shader_compiler_gles2.cpp | 4 | ||||
-rw-r--r-- | drivers/gles2/shader_gles2.cpp | 4 | ||||
-rw-r--r-- | drivers/gles2/shaders/material.glsl | 2 |
5 files changed, 45 insertions, 4 deletions
diff --git a/drivers/gles2/rasterizer_gles2.cpp b/drivers/gles2/rasterizer_gles2.cpp index d55557bdbc..4a1362f9f8 100644 --- a/drivers/gles2/rasterizer_gles2.cpp +++ b/drivers/gles2/rasterizer_gles2.cpp @@ -1504,6 +1504,23 @@ void RasterizerGLES2::mesh_add_surface(RID p_mesh,VS::PrimitiveType p_primitive, ERR_FAIL_COND((format&VS::ARRAY_FORMAT_VERTEX)==0); // mandatory + ERR_FAIL_COND( mesh->morph_target_count!=p_blend_shapes.size() ); + if (mesh->morph_target_count) { + //validate format for morphs + for(int i=0;i<p_blend_shapes.size();i++) { + + uint32_t bsformat=0; + Array arr = p_blend_shapes[i]; + for(int j=0;j<arr.size();j++) { + + + if (arr[j].get_type()!=Variant::NIL) + bsformat|=(1<<j); + } + + ERR_FAIL_COND( (bsformat)!=(format&(VS::ARRAY_FORMAT_BONES-1))); + } + } Surface *surface = memnew( Surface ); ERR_FAIL_COND( !surface ); @@ -1701,7 +1718,9 @@ void RasterizerGLES2::mesh_add_surface(RID p_mesh,VS::PrimitiveType p_primitive, surface->array_len=array_len; surface->format=format; surface->primitive=p_primitive; + surface->morph_target_count=mesh->morph_target_count; surface->configured_format=0; + surface->mesh=mesh; if (keep_copies) { surface->data=p_arrays; surface->morph_data=p_blend_shapes; @@ -1735,6 +1754,17 @@ void RasterizerGLES2::mesh_add_surface(RID p_mesh,VS::PrimitiveType p_primitive, surface->index_array_local = (uint8_t*)memalloc(index_array_len*surface->array[VS::ARRAY_INDEX].size); index_array_ptr=(uint8_t*)surface->index_array_local; } + + if (mesh->morph_target_count) { + + surface->morph_targets_local = memnew_arr(Surface::MorphTarget,mesh->morph_target_count); + for(int i=0;i<mesh->morph_target_count;i++) { + + surface->morph_targets_local[i].array=memnew_arr(uint8_t,surface->local_stride*surface->array_len); + surface->morph_targets_local[i].configured_format=surface->morph_format; + _surface_set_arrays(surface,surface->morph_targets_local[i].array,NULL,p_blend_shapes[i],false); + } + } } @@ -4946,8 +4976,11 @@ Error RasterizerGLES2::_setup_geometry(const Geometry *p_geometry, const Materia /* compute morphs */ + if (p_morphs && surf->morph_target_count && can_copy_to_local) { + + base = skinned_buffer; stride=surf->local_stride; @@ -7773,9 +7806,9 @@ void RasterizerGLES2::free(const RID& p_rid) { for(int i=0;i<mesh->morph_target_count;i++) { - memfree(surface->morph_targets_local[i].array); + memdelete_arr(surface->morph_targets_local[i].array); } - memfree(surface->morph_targets_local); + memdelete_arr(surface->morph_targets_local); surface->morph_targets_local=NULL; } diff --git a/drivers/gles2/rasterizer_gles2.h b/drivers/gles2/rasterizer_gles2.h index a6df10f70b..d905d817c9 100644 --- a/drivers/gles2/rasterizer_gles2.h +++ b/drivers/gles2/rasterizer_gles2.h @@ -840,7 +840,7 @@ class RasterizerGLES2 : public Rasterizer { } } else { - return B->material->shader_cache < B->material->shader_cache; + return A->material->shader_cache < B->material->shader_cache; } } }; diff --git a/drivers/gles2/shader_compiler_gles2.cpp b/drivers/gles2/shader_compiler_gles2.cpp index b928d3709b..ada9efa4b3 100644 --- a/drivers/gles2/shader_compiler_gles2.cpp +++ b/drivers/gles2/shader_compiler_gles2.cpp @@ -611,7 +611,11 @@ ShaderCompilerGLES2::ShaderCompilerGLES2() { replace_table["sign"]= "sign"; replace_table["floor"]= "floor"; replace_table["trunc"]= "trunc"; +#ifdef GLEW_ENABLED + replace_table["round"]= "roundfix"; +#else replace_table["round"]= "round"; +#endif replace_table["ceil" ]= "ceil"; replace_table["fract"]= "fract"; replace_table["mod" ]= "mod"; diff --git a/drivers/gles2/shader_gles2.cpp b/drivers/gles2/shader_gles2.cpp index dc68ee489a..6a4596cb1e 100644 --- a/drivers/gles2/shader_gles2.cpp +++ b/drivers/gles2/shader_gles2.cpp @@ -267,7 +267,9 @@ ShaderGLES2::Version* ShaderGLES2::get_current_version() { /* SETUP CONDITIONALS */ Vector<const char*> strings; - //strings.push_back("#version 120\n"); //ATI requieres this before anything +#ifdef GLEW_ENABLED + strings.push_back("#version 120\n"); //ATI requieres this before anything +#endif int define_line_ofs=1; for(int j=0;j<conditional_count;j++) { diff --git a/drivers/gles2/shaders/material.glsl b/drivers/gles2/shaders/material.glsl index 3aa27c98ff..ad8a364ac1 100644 --- a/drivers/gles2/shaders/material.glsl +++ b/drivers/gles2/shaders/material.glsl @@ -4,6 +4,7 @@ #ifdef USE_GLES_OVER_GL #define mediump #define highp +#define roundfix( m_val ) floor( (m_val) + 0.5 ) #else precision mediump float; precision mediump int; @@ -470,6 +471,7 @@ VERTEX_SHADER_CODE #ifdef USE_GLES_OVER_GL #define mediump #define highp +#define roundfix( m_val ) floor( (m_val) + 0.5 ) #else precision mediump float; |