summaryrefslogtreecommitdiff
path: root/drivers
diff options
context:
space:
mode:
authorJuan Linietsky <reduzio@gmail.com>2015-01-12 20:44:02 -0300
committerJuan Linietsky <reduzio@gmail.com>2015-01-12 20:44:02 -0300
commit30d36581100f0bf71c6d2502be9a03443bdf8708 (patch)
tree2ac0ce5967e150269a71bece0ea0bd16c3eb1054 /drivers
parent544ce2a1dbaa5548490c975c2f6f6ed7c21377b9 (diff)
-fixed issue with shader not being reset on layers, closes #1199
-ability for shader to use parent shader and params, closes #1198
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gles2/rasterizer_gles2.cpp39
-rw-r--r--drivers/gles2/rasterizer_gles2.h6
2 files changed, 21 insertions, 24 deletions
diff --git a/drivers/gles2/rasterizer_gles2.cpp b/drivers/gles2/rasterizer_gles2.cpp
index 80dd1a7898..44fb210526 100644
--- a/drivers/gles2/rasterizer_gles2.cpp
+++ b/drivers/gles2/rasterizer_gles2.cpp
@@ -4961,7 +4961,7 @@ _FORCE_INLINE_ void RasterizerGLES2::_update_material_shader_params(Material *p_
keep=false;
else if (old_mparams[E->key()].value.get_type()!=E->value().default_value.get_type()) {
//type changed between old and new
- /*if (old_mparams[E->key()].value.get_type()==Variant::OBJECT) {
+ /* if (old_mparams[E->key()].value.get_type()==Variant::OBJECT) {
if (E->value().default_value.get_type()!=Variant::_RID) //hackfor textures
keep=false;
} else if (!old_mparams[E->key()].value.is_num() || !E->value().default_value.get_type())
@@ -7799,7 +7799,7 @@ void RasterizerGLES2::canvas_begin() {
canvas_shader.bind();
canvas_shader.set_uniform(CanvasShaderGLES2::TEXTURE, 0);
_set_color_attrib(Color(1,1,1));
- Transform canvas_transform;
+ canvas_transform=Transform();
canvas_transform.translate(-(viewport.width / 2.0f), -(viewport.height / 2.0f), 0.0f);
float csy = 1.0;
if (current_rt && current_rt_vflip)
@@ -7813,6 +7813,9 @@ void RasterizerGLES2::canvas_begin() {
canvas_opacity=1.0;
canvas_blend_mode=VS::MATERIAL_BLEND_MODE_MIX;
+ canvas_texscreen_used=false;
+ uses_texpixel_size=false;
+ canvas_last_shader=RID();
}
@@ -8294,26 +8297,13 @@ void RasterizerGLES2::canvas_set_transform(const Matrix32& p_transform) {
//canvas_transform = Variant(p_transform);
}
+
void RasterizerGLES2::canvas_render_items(CanvasItem *p_item_list) {
CanvasItem *current_clip=NULL;
- RID last_shader;
-
- Transform canvas_transform;
- canvas_transform.translate(-(viewport.width / 2.0f), -(viewport.height / 2.0f), 0.0f);
- float csy = 1.0;
- if (current_rt && current_rt_vflip)
- csy = -1.0;
- canvas_transform.scale( Vector3( 2.0f / viewport.width, csy * -2.0f / viewport.height, 1.0f ) );
canvas_opacity=1.0;
- uses_texpixel_size=false;
-
-
- canvas_shader.set_uniform(CanvasShaderGLES2::PROJECTION_MATRIX,canvas_transform);
- canvas_shader.set_uniform(CanvasShaderGLES2::EXTRA_MATRIX,Matrix32());
-
while(p_item_list) {
CanvasItem *ci=p_item_list;
@@ -8324,7 +8314,7 @@ void RasterizerGLES2::canvas_render_items(CanvasItem *p_item_list) {
}
memdelete(ci->vp_render);
ci->vp_render=NULL;
- last_shader=RID();
+ canvas_last_shader=RID();
}
if (current_clip!=ci->final_clip_owner) {
@@ -8345,12 +8335,13 @@ void RasterizerGLES2::canvas_render_items(CanvasItem *p_item_list) {
//begin rect
+ CanvasItem *shader_owner = ci->shader_owner?ci->shader_owner:ci;
- if (ci->shader!=last_shader) {
+ if (shader_owner->shader!=canvas_last_shader) {
Shader *shader = NULL;
- if (ci->shader.is_valid()) {
- shader = shader_owner.get(ci->shader);
+ if (shader_owner->shader.is_valid()) {
+ shader = this->shader_owner.get(shader_owner->shader);
if (shader && !shader->valid) {
shader=NULL;
}
@@ -8361,9 +8352,9 @@ void RasterizerGLES2::canvas_render_items(CanvasItem *p_item_list) {
if (canvas_shader.bind())
rebind_texpixel_size=true;
- if (ci->shader_version!=shader->version) {
+ if (shader_owner->shader_version!=shader->version) {
//todo optimize uniforms
- ci->shader_version=shader->version;
+ shader_owner->shader_version=shader->version;
}
//this can be optimized..
int tex_id=1;
@@ -8371,7 +8362,7 @@ void RasterizerGLES2::canvas_render_items(CanvasItem *p_item_list) {
for(Map<StringName,ShaderLanguage::Uniform>::Element *E=shader->uniforms.front();E;E=E->next()) {
- Map<StringName,Variant>::Element *F=ci->shader_param.find(E->key());
+ Map<StringName,Variant>::Element *F=shader_owner->shader_param.find(E->key());
Variant &v=F?F->get():E->get().default_value;
if (v.get_type()==Variant::_RID || v.get_type()==Variant::OBJECT) {
int loc = canvas_shader.get_custom_uniform_location(idx); //should be automatic..
@@ -8422,7 +8413,7 @@ void RasterizerGLES2::canvas_render_items(CanvasItem *p_item_list) {
}
canvas_shader.set_uniform(CanvasShaderGLES2::PROJECTION_MATRIX,canvas_transform);
- last_shader=ci->shader;
+ canvas_last_shader=shader_owner->shader;
}
canvas_shader.set_uniform(CanvasShaderGLES2::MODELVIEW_MATRIX,ci->final_transform);
diff --git a/drivers/gles2/rasterizer_gles2.h b/drivers/gles2/rasterizer_gles2.h
index 65947fb034..0f77d18dee 100644
--- a/drivers/gles2/rasterizer_gles2.h
+++ b/drivers/gles2/rasterizer_gles2.h
@@ -1174,6 +1174,11 @@ class RasterizerGLES2 : public Rasterizer {
float canvas_opacity;
bool uses_texpixel_size;
bool rebind_texpixel_size;
+ Transform canvas_transform;
+ RID canvas_last_shader;
+ bool canvas_texscreen_used;
+
+
_FORCE_INLINE_ Texture* _bind_canvas_texture(const RID& p_texture);
VS::MaterialBlendMode canvas_blend_mode;
@@ -1542,6 +1547,7 @@ public:
virtual void canvas_draw_primitive(const Vector<Point2>& p_points, const Vector<Color>& p_colors,const Vector<Point2>& p_uvs, RID p_texture,float p_width);
virtual void canvas_draw_polygon(int p_vertex_count, const int* p_indices, const Vector2* p_vertices, const Vector2* p_uvs, const Color* p_colors,const RID& p_texture,bool p_singlecolor);
virtual void canvas_set_transform(const Matrix32& p_transform);
+
virtual void canvas_render_items(CanvasItem *p_item_list);
/* ENVIRONMENT */