mirror of
https://github.com/godotengine/godot.git
synced 2025-10-19 16:03:29 +00:00
add GLES 2 renderer for 2D
This commit adds a new rendering backend, GLES2, and adds a project setting to enable it. Currently this backend can only be used on the X11 platform, but integrating into other platforms is planned.
This commit is contained in:
parent
7f3024d343
commit
eac4c984df
41 changed files with 12286 additions and 719 deletions
722
methods.py
722
methods.py
|
@ -19,637 +19,6 @@ def add_source_files(self, sources, filetype, lib_env=None, shared=False):
|
|||
sources.append(self.Object(f))
|
||||
|
||||
|
||||
def build_shader_header(target, source, env):
|
||||
|
||||
for x in source:
|
||||
print(x)
|
||||
|
||||
name = str(x)
|
||||
name = name[name.rfind("/") + 1:]
|
||||
name = name[name.rfind("\\") + 1:]
|
||||
name = name.replace(".", "_")
|
||||
|
||||
fs = open(str(x), "r")
|
||||
fd = open(str(x) + ".gen.h", "w")
|
||||
fd.write("/* this file has been generated by SCons, do not edit! */\n")
|
||||
fd.write("static const char *" + name + "=\n")
|
||||
line = fs.readline()
|
||||
while(line):
|
||||
line = line.replace("\r", "")
|
||||
line = line.replace("\n", "")
|
||||
line = line.replace("\\", "\\\\")
|
||||
line = line.replace("\"", "\\\"")
|
||||
fd.write("\"" + line + "\\n\"\n")
|
||||
line = fs.readline()
|
||||
|
||||
fd.write(";\n")
|
||||
|
||||
return 0
|
||||
|
||||
|
||||
def build_glsl_header(filename):
|
||||
|
||||
fs = open(filename, "r")
|
||||
line = fs.readline()
|
||||
|
||||
vertex_lines = []
|
||||
fragment_lines = []
|
||||
uniforms = []
|
||||
attributes = []
|
||||
fbos = []
|
||||
conditionals = []
|
||||
texunits = []
|
||||
texunit_names = []
|
||||
ubos = []
|
||||
ubo_names = []
|
||||
|
||||
reading = ""
|
||||
line_offset = 0
|
||||
vertex_offset = 0
|
||||
fragment_offset = 0
|
||||
|
||||
while(line):
|
||||
|
||||
if (line.find("[vertex]") != -1):
|
||||
reading = "vertex"
|
||||
line = fs.readline()
|
||||
line_offset += 1
|
||||
vertex_offset = line_offset
|
||||
continue
|
||||
|
||||
if (line.find("[fragment]") != -1):
|
||||
reading = "fragment"
|
||||
line = fs.readline()
|
||||
line_offset += 1
|
||||
fragment_offset = line_offset
|
||||
continue
|
||||
|
||||
if (line.find("#ifdef ") != -1):
|
||||
ifdefline = line.replace("#ifdef ", "").strip()
|
||||
if (not ifdefline in conditionals):
|
||||
conditionals += [ifdefline]
|
||||
|
||||
if (line.find("#elif defined(") != -1):
|
||||
ifdefline = line.replace("#elif defined(", "").strip()
|
||||
ifdefline = ifdefline.replace(")", "").strip()
|
||||
if (not ifdefline in conditionals):
|
||||
conditionals += [ifdefline]
|
||||
|
||||
import re
|
||||
if re.search(r"^\s*uniform", line):
|
||||
|
||||
if (line.lower().find("texunit:") != -1):
|
||||
# texture unit
|
||||
texunit = str(int(line[line.find(":") + 1:].strip()))
|
||||
uline = line[:line.lower().find("//")]
|
||||
uline = uline.replace("uniform", "")
|
||||
uline = uline.replace(";", "")
|
||||
lines = uline.split(",")
|
||||
for x in lines:
|
||||
|
||||
x = x.strip()
|
||||
x = x[x.rfind(" ") + 1:]
|
||||
if (x.find("[") != -1):
|
||||
# unfiorm array
|
||||
x = x[:x.find("[")]
|
||||
|
||||
if (not x in texunit_names):
|
||||
texunits += [(x, texunit)]
|
||||
texunit_names += [x]
|
||||
|
||||
elif (line.lower().find("ubo:") != -1):
|
||||
# ubo
|
||||
uboidx = str(int(line[line.find(":") + 1:].strip()))
|
||||
uline = line[:line.lower().find("//")]
|
||||
uline = uline[uline.find("uniform") + len("uniform"):]
|
||||
uline = uline.replace(";", "")
|
||||
uline = uline.replace("{", "").strip()
|
||||
lines = uline.split(",")
|
||||
for x in lines:
|
||||
|
||||
x = x.strip()
|
||||
x = x[x.rfind(" ") + 1:]
|
||||
if (x.find("[") != -1):
|
||||
# unfiorm array
|
||||
x = x[:x.find("[")]
|
||||
|
||||
if (not x in ubo_names):
|
||||
ubos += [(x, uboidx)]
|
||||
ubo_names += [x]
|
||||
|
||||
else:
|
||||
uline = line.replace("uniform", "")
|
||||
uline = uline.replace(";", "")
|
||||
lines = uline.split(",")
|
||||
for x in lines:
|
||||
|
||||
x = x.strip()
|
||||
x = x[x.rfind(" ") + 1:]
|
||||
if (x.find("[") != -1):
|
||||
# unfiorm array
|
||||
x = x[:x.find("[")]
|
||||
|
||||
if (not x in uniforms):
|
||||
uniforms += [x]
|
||||
|
||||
if ((line.strip().find("in ") == 0 or line.strip().find("attribute ") == 0) and line.find("attrib:") != -1):
|
||||
uline = line.replace("in ", "")
|
||||
uline = uline.replace("attribute ", "")
|
||||
uline = uline.replace(";", "")
|
||||
uline = uline[uline.find(" "):].strip()
|
||||
|
||||
if (uline.find("//") != -1):
|
||||
name, bind = uline.split("//")
|
||||
if (bind.find("attrib:") != -1):
|
||||
name = name.strip()
|
||||
bind = bind.replace("attrib:", "").strip()
|
||||
attributes += [(name, bind)]
|
||||
|
||||
if (line.strip().find("out ") == 0):
|
||||
uline = line.replace("out", "").strip()
|
||||
uline = uline.replace(";", "")
|
||||
uline = uline[uline.find(" "):].strip()
|
||||
|
||||
if (uline.find("//") != -1):
|
||||
name, bind = uline.split("//")
|
||||
if (bind.find("drawbuffer:") != -1):
|
||||
name = name.strip()
|
||||
bind = bind.replace("drawbuffer:", "").strip()
|
||||
fbos += [(name, bind)]
|
||||
|
||||
line = line.replace("\r", "")
|
||||
line = line.replace("\n", "")
|
||||
line = line.replace("\\", "\\\\")
|
||||
line = line.replace("\"", "\\\"")
|
||||
# line=line+"\\n\\" no need to anymore
|
||||
|
||||
if (reading == "vertex"):
|
||||
vertex_lines += [line]
|
||||
if (reading == "fragment"):
|
||||
fragment_lines += [line]
|
||||
|
||||
line = fs.readline()
|
||||
line_offset += 1
|
||||
|
||||
fs.close()
|
||||
|
||||
out_file = filename + ".gen.h"
|
||||
fd = open(out_file, "w")
|
||||
|
||||
fd.write("/* WARNING, THIS FILE WAS GENERATED, DO NOT EDIT */\n")
|
||||
|
||||
out_file_base = out_file
|
||||
out_file_base = out_file_base[out_file_base.rfind("/") + 1:]
|
||||
out_file_base = out_file_base[out_file_base.rfind("\\") + 1:]
|
||||
# print("out file "+out_file+" base " +out_file_base)
|
||||
out_file_ifdef = out_file_base.replace(".", "_").upper()
|
||||
fd.write("#ifndef " + out_file_ifdef + "\n")
|
||||
fd.write("#define " + out_file_ifdef + "\n")
|
||||
|
||||
out_file_class = out_file_base.replace(".glsl.h", "").title().replace("_", "").replace(".", "") + "ShaderGL"
|
||||
fd.write("\n\n")
|
||||
fd.write("#include \"drivers/opengl/shader_gl.h\"\n\n\n")
|
||||
fd.write("class " + out_file_class + " : public ShaderGL {\n\n")
|
||||
fd.write("\t virtual String get_shader_name() const { return \"" + out_file_class + "\"; }\n")
|
||||
fd.write("public:\n\n")
|
||||
|
||||
if (len(conditionals)):
|
||||
fd.write("\tenum Conditionals {\n")
|
||||
for x in conditionals:
|
||||
fd.write("\t\t" + x + ",\n")
|
||||
fd.write("\t};\n\n")
|
||||
if (len(uniforms)):
|
||||
fd.write("\tenum Uniforms {\n")
|
||||
for x in uniforms:
|
||||
fd.write("\t\t" + x.upper() + ",\n")
|
||||
fd.write("\t};\n\n")
|
||||
|
||||
fd.write("\t_FORCE_INLINE_ int get_uniform(Uniforms p_uniform) const { return _get_uniform(p_uniform); }\n\n")
|
||||
if (len(conditionals)):
|
||||
|
||||
fd.write("\t_FORCE_INLINE_ void set_conditional(Conditionals p_conditional,bool p_enable) { _set_conditional(p_conditional,p_enable); }\n\n")
|
||||
fd.write("\t#define _FU if (get_uniform(p_uniform)<0) return; ERR_FAIL_COND( get_active()!=this );\n\n ")
|
||||
fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, bool p_value) { _FU glUniform1i(get_uniform(p_uniform),p_value?1:0); }\n\n")
|
||||
fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, float p_value) { _FU glUniform1f(get_uniform(p_uniform),p_value); }\n\n")
|
||||
fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, double p_value) { _FU glUniform1f(get_uniform(p_uniform),p_value); }\n\n")
|
||||
fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, uint8_t p_value) { _FU glUniform1i(get_uniform(p_uniform),p_value); }\n\n")
|
||||
fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, int8_t p_value) { _FU glUniform1i(get_uniform(p_uniform),p_value); }\n\n")
|
||||
fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, uint16_t p_value) { _FU glUniform1i(get_uniform(p_uniform),p_value); }\n\n")
|
||||
fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, int16_t p_value) { _FU glUniform1i(get_uniform(p_uniform),p_value); }\n\n")
|
||||
fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, uint32_t p_value) { _FU glUniform1i(get_uniform(p_uniform),p_value); }\n\n")
|
||||
fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, int32_t p_value) { _FU glUniform1i(get_uniform(p_uniform),p_value); }\n\n")
|
||||
#fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, uint64_t p_value) { _FU glUniform1i(get_uniform(p_uniform),p_value); }\n\n");
|
||||
#fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, int64_t p_value) { _FU glUniform1i(get_uniform(p_uniform),p_value); }\n\n");
|
||||
fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, unsigned long p_value) { _FU glUniform1i(get_uniform(p_uniform),p_value); }\n\n")
|
||||
fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, long p_value) { _FU glUniform1i(get_uniform(p_uniform),p_value); }\n\n")
|
||||
fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, const Color& p_color) { _FU GLfloat col[4]={p_color.r,p_color.g,p_color.b,p_color.a}; glUniform4fv(get_uniform(p_uniform),1,col); }\n\n")
|
||||
fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, const Vector2& p_vec2) { _FU GLfloat vec2[2]={p_vec2.x,p_vec2.y}; glUniform2fv(get_uniform(p_uniform),1,vec2); }\n\n")
|
||||
fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, const Vector3& p_vec3) { _FU GLfloat vec3[3]={p_vec3.x,p_vec3.y,p_vec3.z}; glUniform3fv(get_uniform(p_uniform),1,vec3); }\n\n")
|
||||
fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, const Plane& p_plane) { _FU GLfloat plane[4]={p_plane.normal.x,p_plane.normal.y,p_plane.normal.z,p_plane.d}; glUniform4fv(get_uniform(p_uniform),1,plane); }\n\n")
|
||||
fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, float p_a, float p_b) { _FU glUniform2f(get_uniform(p_uniform),p_a,p_b); }\n\n")
|
||||
fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, float p_a, float p_b, float p_c) { _FU glUniform3f(get_uniform(p_uniform),p_a,p_b,p_c); }\n\n")
|
||||
fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, float p_a, float p_b, float p_c, float p_d) { _FU glUniform4f(get_uniform(p_uniform),p_a,p_b,p_c,p_d); }\n\n")
|
||||
|
||||
fd.write("""\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, const Transform& p_transform) { _FU
|
||||
|
||||
const Transform &tr = p_transform;
|
||||
|
||||
GLfloat matrix[16]={ /* build a 16x16 matrix */
|
||||
tr.basis.elements[0][0],
|
||||
tr.basis.elements[1][0],
|
||||
tr.basis.elements[2][0],
|
||||
0,
|
||||
tr.basis.elements[0][1],
|
||||
tr.basis.elements[1][1],
|
||||
tr.basis.elements[2][1],
|
||||
0,
|
||||
tr.basis.elements[0][2],
|
||||
tr.basis.elements[1][2],
|
||||
tr.basis.elements[2][2],
|
||||
0,
|
||||
tr.origin.x,
|
||||
tr.origin.y,
|
||||
tr.origin.z,
|
||||
1
|
||||
};
|
||||
|
||||
|
||||
glUniformMatrix4fv(get_uniform(p_uniform),1,false,matrix);
|
||||
|
||||
|
||||
}
|
||||
|
||||
""")
|
||||
|
||||
fd.write("""\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, const Transform2D& p_transform) { _FU
|
||||
|
||||
const Transform2D &tr = p_transform;
|
||||
|
||||
GLfloat matrix[16]={ /* build a 16x16 matrix */
|
||||
tr.elements[0][0],
|
||||
tr.elements[0][1],
|
||||
0,
|
||||
0,
|
||||
tr.elements[1][0],
|
||||
tr.elements[1][1],
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1,
|
||||
0,
|
||||
tr.elements[2][0],
|
||||
tr.elements[2][1],
|
||||
0,
|
||||
1
|
||||
};
|
||||
|
||||
|
||||
glUniformMatrix4fv(get_uniform(p_uniform),1,false,matrix);
|
||||
|
||||
|
||||
}
|
||||
|
||||
""")
|
||||
|
||||
fd.write("""\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, const CameraMatrix& p_matrix) { _FU
|
||||
|
||||
GLfloat matrix[16];
|
||||
|
||||
for (int i=0;i<4;i++) {
|
||||
for (int j=0;j<4;j++) {
|
||||
|
||||
matrix[i*4+j]=p_matrix.matrix[i][j];
|
||||
}
|
||||
}
|
||||
|
||||
glUniformMatrix4fv(get_uniform(p_uniform),1,false,matrix);
|
||||
}; """)
|
||||
|
||||
fd.write("\n\n#undef _FU\n\n\n")
|
||||
|
||||
fd.write("\tvirtual void init() {\n\n")
|
||||
if (len(conditionals)):
|
||||
|
||||
fd.write("\t\tstatic const char* _conditional_strings[]={\n")
|
||||
if (len(conditionals)):
|
||||
for x in conditionals:
|
||||
fd.write("\t\t\t\"#define " + x + "\\n\",\n")
|
||||
fd.write("\t\t};\n\n")
|
||||
else:
|
||||
fd.write("\t\tstatic const char **_conditional_strings=NULL;\n")
|
||||
|
||||
if (len(uniforms)):
|
||||
|
||||
fd.write("\t\tstatic const char* _uniform_strings[]={\n")
|
||||
if (len(uniforms)):
|
||||
for x in uniforms:
|
||||
fd.write("\t\t\t\"" + x + "\",\n")
|
||||
fd.write("\t\t};\n\n")
|
||||
else:
|
||||
fd.write("\t\tstatic const char **_uniform_strings=NULL;\n")
|
||||
|
||||
if (len(attributes)):
|
||||
|
||||
fd.write("\t\tstatic AttributePair _attribute_pairs[]={\n")
|
||||
for x in attributes:
|
||||
fd.write("\t\t\t{\"" + x[0] + "\"," + x[1] + "},\n")
|
||||
fd.write("\t\t};\n\n")
|
||||
else:
|
||||
fd.write("\t\tstatic AttributePair *_attribute_pairs=NULL;\n")
|
||||
|
||||
if (len(fbos)):
|
||||
fd.write("\t\tstatic FBOPair _fbo_pairs[]={\n")
|
||||
for x in fbos:
|
||||
fd.write("\t\t\t{\"" + x[0] + "\"," + x[1] + "},\n")
|
||||
fd.write("\t\t};\n\n")
|
||||
else:
|
||||
fd.write("\t\tstatic FBOPair *_fbo_pairs=NULL;\n")
|
||||
|
||||
if (len(ubos)):
|
||||
fd.write("\t\tstatic UBOPair _ubo_pairs[]={\n")
|
||||
for x in ubos:
|
||||
fd.write("\t\t\t{\"" + x[0] + "\"," + x[1] + "},\n")
|
||||
fd.write("\t\t};\n\n")
|
||||
else:
|
||||
fd.write("\t\tstatic UBOPair *_ubo_pairs=NULL;\n")
|
||||
|
||||
if (len(texunits)):
|
||||
fd.write("\t\tstatic TexUnitPair _texunit_pairs[]={\n")
|
||||
for x in texunits:
|
||||
fd.write("\t\t\t{\"" + x[0] + "\"," + x[1] + "},\n")
|
||||
fd.write("\t\t};\n\n")
|
||||
else:
|
||||
fd.write("\t\tstatic TexUnitPair *_texunit_pairs=NULL;\n")
|
||||
|
||||
fd.write("\t\tstatic const char* _vertex_code=\"\\\n")
|
||||
for x in vertex_lines:
|
||||
fd.write("\t\t\t" + x + "\n")
|
||||
fd.write("\t\t\";\n\n")
|
||||
|
||||
fd.write("\t\tstatic const int _vertex_code_start=" + str(vertex_offset) + ";\n")
|
||||
|
||||
fd.write("\t\tstatic const char* _fragment_code=\"\\\n")
|
||||
for x in fragment_lines:
|
||||
fd.write("\t\t\t" + x + "\n")
|
||||
fd.write("\t\t\";\n\n")
|
||||
|
||||
fd.write("\t\tstatic const int _fragment_code_start=" + str(fragment_offset) + ";\n")
|
||||
|
||||
fd.write("\t\tsetup(_conditional_strings," + str(len(conditionals)) + ",_uniform_strings," + str(len(uniforms)) + ",_attribute_pairs," + str(len(attributes)) + ",_fbo_pairs," + str(len(fbos)) + ",_ubo_pairs," + str(len(ubos)) + ",_texunit_pairs," + str(len(texunits)) + ",_vertex_code,_fragment_code,_vertex_code_start,_fragment_code_start);\n")
|
||||
fd.write("\t};\n\n")
|
||||
|
||||
fd.write("};\n\n")
|
||||
fd.write("#endif\n\n")
|
||||
fd.close()
|
||||
|
||||
|
||||
def build_glsl_headers(target, source, env):
|
||||
|
||||
for x in source:
|
||||
|
||||
build_glsl_header(str(x))
|
||||
|
||||
return 0
|
||||
|
||||
|
||||
def build_hlsl_dx9_header(filename):
|
||||
|
||||
fs = open(filename, "r")
|
||||
line = fs.readline()
|
||||
|
||||
vertex_lines = []
|
||||
fragment_lines = []
|
||||
uniforms = []
|
||||
fragment_uniforms = []
|
||||
attributes = []
|
||||
fbos = []
|
||||
conditionals = []
|
||||
|
||||
reading = ""
|
||||
line_offset = 0
|
||||
vertex_offset = 0
|
||||
fragment_offset = 0
|
||||
|
||||
while(line):
|
||||
|
||||
if (line.find("[vertex]") != -1):
|
||||
reading = "vertex"
|
||||
line = fs.readline()
|
||||
line_offset += 1
|
||||
vertex_offset = line_offset
|
||||
continue
|
||||
|
||||
if (line.find("[fragment]") != -1):
|
||||
reading = "fragment"
|
||||
line = fs.readline()
|
||||
line_offset += 1
|
||||
fragment_offset = line_offset
|
||||
continue
|
||||
|
||||
if (line.find("#ifdef ") != -1):
|
||||
ifdefline = line.replace("#ifdef ", "").strip()
|
||||
if (not ifdefline in conditionals):
|
||||
conditionals += [ifdefline]
|
||||
|
||||
if (line.find("#elif defined(") != -1):
|
||||
ifdefline = line.replace("#elif defined(", "").strip()
|
||||
ifdefline = ifdefline.replace(")", "").strip()
|
||||
if (not ifdefline in conditionals):
|
||||
conditionals += [ifdefline]
|
||||
if (line.find("uniform") != -1):
|
||||
uline = line.replace("uniform", "")
|
||||
uline = uline.replace(";", "")
|
||||
lines = uline.split(",")
|
||||
for x in lines:
|
||||
|
||||
x = x.strip()
|
||||
x = x[x.rfind(" ") + 1:]
|
||||
if (x.find("[") != -1):
|
||||
# unfiorm array
|
||||
x = x[:x.find("[")]
|
||||
|
||||
if (not x in uniforms):
|
||||
uniforms += [x]
|
||||
fragment_uniforms += [reading == "fragment"]
|
||||
line = line.replace("\r", "")
|
||||
line = line.replace("\n", "")
|
||||
line = line.replace("\\", "\\\\")
|
||||
line = line.replace("\"", "\\\"")
|
||||
line = line + "\\n\\"
|
||||
|
||||
if (reading == "vertex"):
|
||||
vertex_lines += [line]
|
||||
if (reading == "fragment"):
|
||||
fragment_lines += [line]
|
||||
|
||||
line = fs.readline()
|
||||
line_offset += 1
|
||||
|
||||
fs.close()
|
||||
|
||||
out_file = filename + ".gen.h"
|
||||
fd = open(out_file, "w")
|
||||
|
||||
fd.write("/* WARNING, THIS FILE WAS GENERATED, DO NOT EDIT */\n")
|
||||
|
||||
out_file_base = out_file
|
||||
out_file_base = out_file_base[out_file_base.rfind("/") + 1:]
|
||||
out_file_base = out_file_base[out_file_base.rfind("\\") + 1:]
|
||||
# print("out file "+out_file+" base " +out_file_base)
|
||||
out_file_ifdef = out_file_base.replace(".", "_").upper()
|
||||
fd.write("#ifndef " + out_file_ifdef + "\n")
|
||||
fd.write("#define " + out_file_ifdef + "\n")
|
||||
|
||||
out_file_class = out_file_base.replace(".hlsl.h", "").title().replace("_", "").replace(".", "") + "ShaderDX9"
|
||||
fd.write("\n\n")
|
||||
fd.write("#include \"drivers/directx9/shader_dx9.h\"\n\n\n")
|
||||
fd.write("class " + out_file_class + " : public ShaderDX9 {\n\n")
|
||||
fd.write("\t virtual String get_shader_name() const { return \"" + out_file_class + "\"; }\n")
|
||||
fd.write("public:\n\n")
|
||||
|
||||
if (len(conditionals)):
|
||||
fd.write("\tenum Conditionals {\n")
|
||||
for x in conditionals:
|
||||
fd.write("\t\t" + x + ",\n")
|
||||
fd.write("\t};\n\n")
|
||||
if (len(uniforms)):
|
||||
fd.write("\tenum Uniforms {\n")
|
||||
for x in uniforms:
|
||||
fd.write("\t\t" + x.upper() + ",\n")
|
||||
fd.write("\t};\n\n")
|
||||
|
||||
if (len(conditionals)):
|
||||
fd.write("\t_FORCE_INLINE_ void set_conditional(Conditionals p_conditional,bool p_enable) { _set_conditional(p_conditional,p_enable); }\n\n")
|
||||
|
||||
fd.write("\t#define _FU if (!_uniform_valid(p_uniform)) return; ERR_FAIL_COND( get_active()!=this );\n\n ")
|
||||
fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, bool p_value) { _FU set_uniformb(p_uniform,p_value); }\n\n")
|
||||
fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, float p_value) { _FU set_uniformf(p_uniform,p_value); }\n\n")
|
||||
fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, double p_value) { _FU set_uniformf(p_uniform,p_value); }\n\n")
|
||||
fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, uint8_t p_value) { _FU set_uniformi(p_uniform,p_value); }\n\n")
|
||||
fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, int8_t p_value) { _FU set_uniformi(p_uniform,p_value); }\n\n")
|
||||
fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, uint16_t p_value) { _FU set_uniformi(p_uniform,p_value); }\n\n")
|
||||
fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, int16_t p_value) { _FU set_uniformi(p_uniform,p_value); }\n\n")
|
||||
fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, uint32_t p_value) { _FU set_uniformi(p_uniform,p_value); }\n\n")
|
||||
fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, int32_t p_value) { _FU set_uniformi(p_uniform,p_value); }\n\n")
|
||||
#fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, uint64_t p_value) { _FU set_uniformi(p_uniform,p_value); }\n\n");
|
||||
#fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, int64_t p_value) { _FU set_uniformi(p_uniform,p_value); }\n\n");
|
||||
fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, unsigned long p_value) { _FU set_uniformi(p_uniform,p_value); }\n\n")
|
||||
fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, long p_value) { _FU set_uniformi(p_uniform,p_value); }\n\n")
|
||||
fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, const Color& p_color) { _FU float col[4]={p_color.r,p_color.g,p_color.b,p_color.a}; set_uniformfv(p_uniform,col); }\n\n")
|
||||
fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, const Vector2& p_vec2) { _FU float vec2[4]={p_vec2.x,p_vec2.y,0,0}; set_uniformfv(p_uniform,vec2); }\n\n")
|
||||
fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, const Vector3& p_vec3) { _FU float vec3[4]={p_vec3.x,p_vec3.y,p_vec3.z,0}; set_uniformfv(p_uniform,vec3); }\n\n")
|
||||
fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, float p_a, float p_b) { _FU float vec2[4]={p_a,p_b,0,0}; set_uniformfv(p_uniform,vec2); }\n\n")
|
||||
fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, float p_a, float p_b, float p_c) { _FU float vec3[4]={p_a,p_b,p_c,0}; set_uniformfv(p_uniform,vec3); }\n\n")
|
||||
fd.write("\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, float p_a, float p_b, float p_c, float p_d) { _FU float vec4[4]={p_a,p_b,p_c,p_d}; set_uniformfv(p_uniform,vec4); }\n\n")
|
||||
|
||||
fd.write("""\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, const Transform& p_transform) { _FU
|
||||
|
||||
const Transform &tr = p_transform;
|
||||
|
||||
float matrix[16]={ /* build a 16x16 matrix */
|
||||
tr.basis.elements[0][0],
|
||||
tr.basis.elements[0][1],
|
||||
tr.basis.elements[0][2],
|
||||
tr.origin.x,
|
||||
tr.basis.elements[1][0],
|
||||
tr.basis.elements[1][1],
|
||||
tr.basis.elements[1][2],
|
||||
tr.origin.y,
|
||||
tr.basis.elements[2][0],
|
||||
tr.basis.elements[2][1],
|
||||
tr.basis.elements[2][2],
|
||||
tr.origin.z,
|
||||
0,
|
||||
0,
|
||||
0,
|
||||
1
|
||||
};
|
||||
|
||||
set_uniformfv(p_uniform,&matrix[0],4);
|
||||
|
||||
}
|
||||
|
||||
""")
|
||||
|
||||
fd.write("""\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, const CameraMatrix& p_matrix) { _FU
|
||||
|
||||
float matrix[16];
|
||||
|
||||
for (int i=0;i<4;i++) {
|
||||
for (int j=0;j<4;j++) {
|
||||
|
||||
matrix[i*4+j]=p_matrix.matrix[j][i];
|
||||
}
|
||||
}
|
||||
|
||||
set_uniformfv(p_uniform,&matrix[0],4);
|
||||
}; """)
|
||||
|
||||
fd.write("\n\n#undef _FU\n\n\n")
|
||||
|
||||
fd.write("\tvirtual void init(IDirect3DDevice9 *p_device,ShaderSupport p_version) {\n\n")
|
||||
if (len(conditionals)):
|
||||
|
||||
fd.write("\t\tstatic const char* _conditional_strings[]={\n")
|
||||
if (len(conditionals)):
|
||||
for x in conditionals:
|
||||
fd.write("\t\t\t\"" + x + "\",\n")
|
||||
fd.write("\t\t};\n\n")
|
||||
else:
|
||||
fd.write("\t\tstatic const char **_conditional_strings=NULL;\n")
|
||||
|
||||
if (len(uniforms)):
|
||||
|
||||
fd.write("\t\tstatic const char* _uniform_strings[]={\n")
|
||||
if (len(uniforms)):
|
||||
for x in uniforms:
|
||||
fd.write("\t\t\t\"" + x + "\",\n")
|
||||
fd.write("\t\t};\n\n")
|
||||
|
||||
fd.write("\t\tstatic const bool _fragment_uniforms[]={\n")
|
||||
|
||||
if (len(uniforms)):
|
||||
for x in fragment_uniforms:
|
||||
if (x):
|
||||
fd.write("\t\t\ttrue,\n")
|
||||
else:
|
||||
fd.write("\t\t\tfalse,\n")
|
||||
fd.write("\t\t};\n\n")
|
||||
else:
|
||||
fd.write("\t\tstatic const char **_uniform_strings=NULL;\n")
|
||||
fd.write("\t\tstatic const bool *_fragment_uniforms=NULL;\n")
|
||||
|
||||
fd.write("\t\tstatic const char* _vertex_code=\"\\\n")
|
||||
for x in vertex_lines:
|
||||
fd.write("\t\t\t" + x + "\n")
|
||||
fd.write("\t\t\";\n\n")
|
||||
|
||||
fd.write("\t\tstatic const int _vertex_code_start=" + str(vertex_offset) + ";\n")
|
||||
|
||||
fd.write("\t\tstatic const char* _fragment_code=\"\\\n")
|
||||
for x in fragment_lines:
|
||||
fd.write("\t\t\t" + x + "\n")
|
||||
fd.write("\t\t\";\n\n")
|
||||
|
||||
fd.write("\t\tstatic const int _fragment_code_start=" + str(fragment_offset) + ";\n")
|
||||
|
||||
fd.write("\t\tsetup(p_device,p_version,_conditional_strings," + str(len(conditionals)) + ",_uniform_strings," + str(len(uniforms)) + ",_fragment_uniforms,_vertex_code,_fragment_code,_vertex_code_start,_fragment_code_start);\n")
|
||||
fd.write("\t};\n\n")
|
||||
|
||||
fd.write("};\n\n")
|
||||
fd.write("#endif\n\n")
|
||||
fd.close()
|
||||
|
||||
|
||||
def build_hlsl_dx9_headers(target, source, env):
|
||||
|
||||
for x in source:
|
||||
|
||||
build_hlsl_dx9_header(str(x))
|
||||
|
||||
return 0
|
||||
|
||||
|
||||
class LegacyGLHeaderStruct:
|
||||
|
||||
|
@ -840,7 +209,7 @@ def include_file_in_legacygl_header(filename, header_data, depth):
|
|||
return header_data
|
||||
|
||||
|
||||
def build_legacygl_header(filename, include, class_suffix, output_attribs):
|
||||
def build_legacygl_header(filename, include, class_suffix, output_attribs, gles2=False):
|
||||
|
||||
header_data = LegacyGLHeaderStruct()
|
||||
include_file_in_legacygl_header(filename, header_data, 0)
|
||||
|
@ -928,14 +297,14 @@ def build_legacygl_header(filename, include, class_suffix, output_attribs):
|
|||
};
|
||||
|
||||
|
||||
glUniformMatrix4fv(get_uniform(p_uniform),1,false,matrix);
|
||||
glUniformMatrix4fv(get_uniform(p_uniform),1,false,matrix);
|
||||
|
||||
|
||||
}
|
||||
|
||||
""")
|
||||
|
||||
fd.write("""\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, const Transform2D& p_transform) { _FU
|
||||
fd.write("""_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, const Transform2D& p_transform) { _FU
|
||||
|
||||
const Transform2D &tr = p_transform;
|
||||
|
||||
|
@ -959,14 +328,14 @@ def build_legacygl_header(filename, include, class_suffix, output_attribs):
|
|||
};
|
||||
|
||||
|
||||
glUniformMatrix4fv(get_uniform(p_uniform),1,false,matrix);
|
||||
glUniformMatrix4fv(get_uniform(p_uniform),1,false,matrix);
|
||||
|
||||
|
||||
}
|
||||
|
||||
""")
|
||||
|
||||
fd.write("""\t_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, const CameraMatrix& p_matrix) { _FU
|
||||
fd.write("""_FORCE_INLINE_ void set_uniform(Uniforms p_uniform, const CameraMatrix& p_matrix) { _FU
|
||||
|
||||
GLfloat matrix[16];
|
||||
|
||||
|
@ -978,7 +347,7 @@ def build_legacygl_header(filename, include, class_suffix, output_attribs):
|
|||
}
|
||||
|
||||
glUniformMatrix4fv(get_uniform(p_uniform),1,false,matrix);
|
||||
}; """)
|
||||
} """)
|
||||
|
||||
fd.write("\n\n#undef _FU\n\n\n")
|
||||
|
||||
|
@ -1061,7 +430,7 @@ def build_legacygl_header(filename, include, class_suffix, output_attribs):
|
|||
|
||||
feedback_count = 0
|
||||
|
||||
if (len(header_data.feedbacks)):
|
||||
if (not gles2 and len(header_data.feedbacks)):
|
||||
|
||||
fd.write("\t\tstatic const Feedback _feedbacks[]={\n")
|
||||
for x in header_data.feedbacks:
|
||||
|
@ -1076,7 +445,10 @@ def build_legacygl_header(filename, include, class_suffix, output_attribs):
|
|||
|
||||
fd.write("\t\t};\n\n")
|
||||
else:
|
||||
fd.write("\t\tstatic const Feedback* _feedbacks=NULL;\n")
|
||||
if gles2:
|
||||
pass
|
||||
else:
|
||||
fd.write("\t\tstatic const Feedback* _feedbacks=NULL;\n")
|
||||
|
||||
if (len(header_data.texunits)):
|
||||
fd.write("\t\tstatic TexUnitPair _texunit_pairs[]={\n")
|
||||
|
@ -1086,13 +458,16 @@ def build_legacygl_header(filename, include, class_suffix, output_attribs):
|
|||
else:
|
||||
fd.write("\t\tstatic TexUnitPair *_texunit_pairs=NULL;\n")
|
||||
|
||||
if (len(header_data.ubos)):
|
||||
if (not gles2 and len(header_data.ubos)):
|
||||
fd.write("\t\tstatic UBOPair _ubo_pairs[]={\n")
|
||||
for x in header_data.ubos:
|
||||
fd.write("\t\t\t{\"" + x[0] + "\"," + x[1] + "},\n")
|
||||
fd.write("\t\t};\n\n")
|
||||
else:
|
||||
fd.write("\t\tstatic UBOPair *_ubo_pairs=NULL;\n")
|
||||
if gles2:
|
||||
pass
|
||||
else:
|
||||
fd.write("\t\tstatic UBOPair *_ubo_pairs=NULL;\n")
|
||||
|
||||
fd.write("\t\tstatic const char _vertex_code[]={\n")
|
||||
for x in header_data.vertex_lines:
|
||||
|
@ -1115,11 +490,17 @@ def build_legacygl_header(filename, include, class_suffix, output_attribs):
|
|||
fd.write("\t\tstatic const int _fragment_code_start=" + str(header_data.fragment_offset) + ";\n")
|
||||
|
||||
if output_attribs:
|
||||
fd.write("\t\tsetup(_conditional_strings," + str(len(header_data.conditionals)) + ",_uniform_strings," + str(len(header_data.uniforms)) + ",_attribute_pairs," + str(len(header_data.attributes)) + ", _texunit_pairs," + str(len(header_data.texunits)) + ",_ubo_pairs," + str(len(header_data.ubos)) + ",_feedbacks," + str(feedback_count) + ",_vertex_code,_fragment_code,_vertex_code_start,_fragment_code_start);\n")
|
||||
if gles2:
|
||||
fd.write("\t\tsetup(_conditional_strings," + str(len(header_data.conditionals)) + ",_uniform_strings," + str(len(header_data.uniforms)) + ",_attribute_pairs," + str(len(header_data.attributes)) + ", _texunit_pairs," + str(len(header_data.texunits)) + ",_vertex_code,_fragment_code,_vertex_code_start,_fragment_code_start);\n")
|
||||
else:
|
||||
fd.write("\t\tsetup(_conditional_strings," + str(len(header_data.conditionals)) + ",_uniform_strings," + str(len(header_data.uniforms)) + ",_attribute_pairs," + str(len(header_data.attributes)) + ", _texunit_pairs," + str(len(header_data.texunits)) + ",_ubo_pairs," + str(len(header_data.ubos)) + ",_feedbacks," + str(feedback_count) + ",_vertex_code,_fragment_code,_vertex_code_start,_fragment_code_start);\n")
|
||||
else:
|
||||
fd.write("\t\tsetup(_conditional_strings," + str(len(header_data.conditionals)) + ",_uniform_strings," + str(len(header_data.uniforms)) + ",_texunit_pairs," + str(len(header_data.texunits)) + ",_enums," + str(len(header_data.enums)) + ",_enum_values," + str(enum_value_count) + ",_ubo_pairs," + str(len(header_data.ubos)) + ",_feedbacks," + str(feedback_count) + ",_vertex_code,_fragment_code,_vertex_code_start,_fragment_code_start);\n")
|
||||
if gles2:
|
||||
fd.write("\t\tsetup(_conditional_strings," + str(len(header_data.conditionals)) + ",_uniform_strings," + str(len(header_data.uniforms)) + ",_texunit_pairs," + str(len(header_data.texunits)) + ",_enums," + str(len(header_data.enums)) + ",_enum_values," + str(enum_value_count) + ",_vertex_code,_fragment_code,_vertex_code_start,_fragment_code_start);\n")
|
||||
else:
|
||||
fd.write("\t\tsetup(_conditional_strings," + str(len(header_data.conditionals)) + ",_uniform_strings," + str(len(header_data.uniforms)) + ",_texunit_pairs," + str(len(header_data.texunits)) + ",_enums," + str(len(header_data.enums)) + ",_enum_values," + str(enum_value_count) + ",_ubo_pairs," + str(len(header_data.ubos)) + ",_feedbacks," + str(feedback_count) + ",_vertex_code,_fragment_code,_vertex_code_start,_fragment_code_start);\n")
|
||||
|
||||
fd.write("\t};\n\n")
|
||||
fd.write("\t}\n\n")
|
||||
|
||||
if (len(enum_constants)):
|
||||
|
||||
|
@ -1134,21 +515,17 @@ def build_legacygl_header(filename, include, class_suffix, output_attribs):
|
|||
fd.close()
|
||||
|
||||
|
||||
def build_legacygl_headers(target, source, env):
|
||||
|
||||
for x in source:
|
||||
|
||||
build_legacygl_header(str(x), include="drivers/legacygl/shader_lgl.h", class_suffix="LGL", output_attribs=False)
|
||||
|
||||
return 0
|
||||
|
||||
|
||||
def build_gles3_headers(target, source, env):
|
||||
|
||||
for x in source:
|
||||
build_legacygl_header(str(x), include="drivers/gles3/shader_gles3.h", class_suffix="GLES3", output_attribs=True)
|
||||
|
||||
|
||||
def build_gles2_headers(target, source, env):
|
||||
|
||||
for x in source:
|
||||
build_legacygl_header(str(x), include="drivers/gles2/shader_gles2.h", class_suffix="GLES2", output_attribs=True, gles2=True)
|
||||
|
||||
def add_module_version_string(self,s):
|
||||
self.module_version_string += "." + s
|
||||
|
||||
|
@ -1220,45 +597,6 @@ def parse_cg_file(fname, uniforms, sizes, conditionals):
|
|||
|
||||
line = fs.readline()
|
||||
|
||||
|
||||
def build_cg_shader(sname):
|
||||
|
||||
vp_uniforms = []
|
||||
vp_uniform_sizes = []
|
||||
vp_conditionals = []
|
||||
|
||||
parse_cg_file("vp_" + sname + ".cg", vp_uniforms, vp_uniform_sizes, vp_conditionals)
|
||||
|
||||
fp_uniforms = []
|
||||
fp_uniform_sizes = []
|
||||
fp_conditionals = []
|
||||
|
||||
parse_cg_file("fp_" + sname + ".cg", fp_uniforms, fp_uniform_sizes, fp_conditionals)
|
||||
|
||||
fd = open("shader_" + sname + ".cg.gen.h", "w")
|
||||
|
||||
fd.write('\n#include "shader_cell.h"\n')
|
||||
fd.write("\nclass Shader_" + sname + " : public ShaderCell {\n")
|
||||
fd.write("\n\tstatic struct VertexUniforms[] = {\n")
|
||||
|
||||
offset = 0
|
||||
for i in range(0, len(vp_uniforms)):
|
||||
|
||||
fd.write('\t\t{ "%s", %d, %d },\n' % (vp_uniforms[i], offset, vp_uniform_sizes[i]))
|
||||
offset = offset + vp_uniform_sizes[i]
|
||||
fd.write("\t};\n\n")
|
||||
|
||||
fd.write("public:\n\n")
|
||||
|
||||
fd.write("\tenum {\n")
|
||||
|
||||
for i in range(0, len(vp_uniforms)):
|
||||
|
||||
fd.write('\t\tVP_%s,\n' % vp_uniforms[i].upper())
|
||||
|
||||
fd.write("\t};\n")
|
||||
|
||||
|
||||
import glob
|
||||
|
||||
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue