Visual Shader Editing for 2D
Editing 2D shaders with visual editor seems to work now.
This commit is contained in:
@@ -4588,6 +4588,9 @@ void RasterizerGLES2::_update_shader( Shader* p_shader) const {
|
||||
enablers.push_back("#define USE_TEXPIXEL_SIZE\n");
|
||||
}
|
||||
|
||||
if (fragment_flags.uses_worldvec) {
|
||||
enablers.push_back("#define USE_WORLD_VEC\n");
|
||||
}
|
||||
canvas_shader.set_custom_shader_code(p_shader->custom_code_id,vertex_code, vertex_globals,fragment_code, light_code, fragment_globals,uniform_names,enablers);
|
||||
|
||||
//postprocess_shader.set_custom_shader_code(p_shader->custom_code_id,vertex_code, vertex_globals,fragment_code, fragment_globals,uniform_names);
|
||||
@@ -8362,24 +8365,39 @@ void RasterizerGLES2::canvas_render_items(CanvasItem *p_item_list) {
|
||||
int idx=0;
|
||||
for(Map<StringName,ShaderLanguage::Uniform>::Element *E=shader->uniforms.front();E;E=E->next()) {
|
||||
|
||||
|
||||
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..
|
||||
|
||||
glActiveTexture(GL_TEXTURE0+tex_id);
|
||||
RID tex = v;
|
||||
Texture *t=texture_owner.get(tex);
|
||||
if (!t)
|
||||
glBindTexture(GL_TEXTURE_2D,white_tex);
|
||||
else
|
||||
glBindTexture(t->target,t->tex_id);
|
||||
if ((E->get().type==ShaderLanguage::TYPE_TEXTURE || E->get().type==ShaderLanguage::TYPE_CUBEMAP)) {
|
||||
|
||||
glUniform1i(loc,tex_id);
|
||||
tex_id++;
|
||||
RID rid;
|
||||
if (F) {
|
||||
rid=F->get();
|
||||
}
|
||||
|
||||
if (!rid.is_valid()) {
|
||||
|
||||
Map<StringName,RID>::Element *DT=shader->default_textures.find(E->key());
|
||||
if (DT) {
|
||||
rid=DT->get();
|
||||
}
|
||||
}
|
||||
|
||||
if (rid.is_valid()) {
|
||||
|
||||
int loc = canvas_shader.get_custom_uniform_location(idx); //should be automatic..
|
||||
|
||||
glActiveTexture(GL_TEXTURE0+tex_id);
|
||||
Texture *t=texture_owner.get(rid);
|
||||
if (!t)
|
||||
glBindTexture(GL_TEXTURE_2D,white_tex);
|
||||
else
|
||||
glBindTexture(t->target,t->tex_id);
|
||||
|
||||
glUniform1i(loc,tex_id);
|
||||
tex_id++;
|
||||
}
|
||||
} else {
|
||||
Variant &v=F?F->get():E->get().default_value;
|
||||
canvas_shader.set_custom_uniform(idx,v);
|
||||
}
|
||||
|
||||
@@ -8403,7 +8421,7 @@ void RasterizerGLES2::canvas_render_items(CanvasItem *p_item_list) {
|
||||
#endif
|
||||
glCopyTexSubImage2D(GL_TEXTURE_2D,0,x,y,x,y,viewport.width,viewport.height);
|
||||
if (current_clip) {
|
||||
print_line(" a clip ");
|
||||
// print_line(" a clip ");
|
||||
}
|
||||
|
||||
canvas_texscreen_used=true;
|
||||
|
||||
@@ -239,6 +239,9 @@ String ShaderCompilerGLES2::dump_node_code(SL::Node *p_node,int p_level,bool p_a
|
||||
if (vnode->name==vname_normal) {
|
||||
uses_normal=true;
|
||||
}
|
||||
if (vnode->name==vname_world_vec) {
|
||||
uses_worldvec=true;
|
||||
}
|
||||
|
||||
if (vnode->name==vname_screen_uv) {
|
||||
uses_screen_uv=true;
|
||||
@@ -599,6 +602,7 @@ Error ShaderCompilerGLES2::compile(const String& p_code, ShaderLanguage::ShaderT
|
||||
uses_normalmap=false;
|
||||
uses_normal=false;
|
||||
uses_texpixel_size=false;
|
||||
uses_worldvec=false;
|
||||
vertex_code_writes_vertex=false;
|
||||
uniforms=r_uniforms;
|
||||
flags=&r_flags;
|
||||
@@ -634,6 +638,7 @@ Error ShaderCompilerGLES2::compile(const String& p_code, ShaderLanguage::ShaderT
|
||||
r_flags.uses_normalmap=uses_normalmap;
|
||||
r_flags.uses_normal=uses_normalmap;
|
||||
r_flags.uses_texpixel_size=uses_texpixel_size;
|
||||
r_flags.uses_worldvec=uses_worldvec;
|
||||
r_code_line=code;
|
||||
r_globals_line=global_code;
|
||||
|
||||
@@ -774,6 +779,7 @@ ShaderCompilerGLES2::ShaderCompilerGLES2() {
|
||||
|
||||
mode_replace_table[3]["SRC_VERTEX"]="src_vtx";
|
||||
mode_replace_table[3]["VERTEX"]="outvec.xy";
|
||||
mode_replace_table[3]["WORLD_VERTEX"]="outvec.xy";
|
||||
mode_replace_table[3]["UV"]="uv_interp";
|
||||
mode_replace_table[3]["COLOR"]="color_interp";
|
||||
mode_replace_table[3]["VAR1"]="var1_interp";
|
||||
@@ -830,5 +836,6 @@ ShaderCompilerGLES2::ShaderCompilerGLES2() {
|
||||
vname_normalmap="NORMALMAP";
|
||||
vname_normal="NORMAL";
|
||||
vname_texpixel_size="TEXTURE_PIXEL_SIZE";
|
||||
vname_world_vec="WORLD_VERTEX";
|
||||
|
||||
}
|
||||
|
||||
@@ -53,6 +53,7 @@ private:
|
||||
bool uses_normalmap;
|
||||
bool uses_normal;
|
||||
bool uses_texpixel_size;
|
||||
bool uses_worldvec;
|
||||
bool vertex_code_writes_vertex;
|
||||
Flags *flags;
|
||||
|
||||
@@ -72,6 +73,7 @@ private:
|
||||
StringName vname_normalmap;
|
||||
StringName vname_normal;
|
||||
StringName vname_texpixel_size;
|
||||
StringName vname_world_vec;
|
||||
|
||||
Map<StringName,ShaderLanguage::Uniform> *uniforms;
|
||||
|
||||
@@ -107,6 +109,7 @@ public:
|
||||
bool uses_time;
|
||||
bool uses_normal;
|
||||
bool uses_texpixel_size;
|
||||
bool uses_worldvec;
|
||||
};
|
||||
|
||||
Error compile(const String& p_code, ShaderLanguage::ShaderType p_type, String& r_code_line, String& r_globals_line, Flags& r_flags, Map<StringName,ShaderLanguage::Uniform> *r_uniforms=NULL);
|
||||
|
||||
@@ -52,8 +52,10 @@ void main() {
|
||||
VERTEX_SHADER_CODE
|
||||
|
||||
}
|
||||
#if !defined(USE_WORLD_VEC)
|
||||
outvec = extra_matrix * outvec;
|
||||
outvec = modelview_matrix * outvec;
|
||||
#endif
|
||||
|
||||
#ifdef USE_PIXEL_SNAP
|
||||
|
||||
@@ -61,15 +63,15 @@ VERTEX_SHADER_CODE
|
||||
#endif
|
||||
|
||||
|
||||
gl_Position = projection_matrix * outvec;
|
||||
|
||||
#ifdef USE_LIGHTING
|
||||
|
||||
light_tex_pos.xy = light_matrix * outvec;
|
||||
light_tex_pos.xy = light_matrix * gl_Position;
|
||||
light_tex_pos.zw=outvec.xy - light_matrix[4].xy; //likely wrong
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
gl_Position = projection_matrix * outvec;
|
||||
}
|
||||
|
||||
[fragment]
|
||||
|
||||
Reference in New Issue
Block a user