3030
3131#include " material_storage.h"
3232
33+ #include " core/config/project_settings.h"
34+
3335using namespace RendererDummy ;
3436
3537MaterialStorage *MaterialStorage::singleton = nullptr ;
@@ -42,6 +44,103 @@ MaterialStorage::MaterialStorage() {
4244
4345MaterialStorage::~MaterialStorage () {
4446 singleton = nullptr ;
47+ global_shader_variables.clear ();
48+ }
49+
50+ void MaterialStorage::global_shader_parameter_add (const StringName &p_name, RS::GlobalShaderParameterType p_type, const Variant &p_value) {
51+ ERR_FAIL_COND (global_shader_variables.has (p_name));
52+
53+ global_shader_variables[p_name] = p_type;
54+ }
55+
56+ void MaterialStorage::global_shader_parameter_remove (const StringName &p_name) {
57+ if (!global_shader_variables.has (p_name)) {
58+ return ;
59+ }
60+
61+ global_shader_variables.erase (p_name);
62+ }
63+
64+ Vector<StringName> MaterialStorage::global_shader_parameter_get_list () const {
65+ Vector<StringName> names;
66+ for (const KeyValue<StringName, RS::GlobalShaderParameterType> &E : global_shader_variables) {
67+ names.push_back (E.key );
68+ }
69+ names.sort_custom <StringName::AlphCompare>();
70+ return names;
71+ }
72+
73+ RS::GlobalShaderParameterType MaterialStorage::global_shader_parameter_get_type (const StringName &p_name) const {
74+ if (!global_shader_variables.has (p_name)) {
75+ print_line (" don't have name, sorry" );
76+ return RS::GLOBAL_VAR_TYPE_MAX;
77+ }
78+
79+ return global_shader_variables[p_name];
80+ }
81+
82+ void MaterialStorage::global_shader_parameters_load_settings (bool p_load_textures) {
83+ List<PropertyInfo> settings;
84+ ProjectSettings::get_singleton ()->get_property_list (&settings);
85+
86+ for (const PropertyInfo &E : settings) {
87+ if (E.name .begins_with (" shader_globals/" )) {
88+ StringName name = E.name .get_slice (" /" , 1 );
89+ Dictionary d = GLOBAL_GET (E.name );
90+
91+ ERR_CONTINUE (!d.has (" type" ));
92+ ERR_CONTINUE (!d.has (" value" ));
93+
94+ String type = d[" type" ];
95+
96+ static const char *global_var_type_names[RS::GLOBAL_VAR_TYPE_MAX] = {
97+ " bool" ,
98+ " bvec2" ,
99+ " bvec3" ,
100+ " bvec4" ,
101+ " int" ,
102+ " ivec2" ,
103+ " ivec3" ,
104+ " ivec4" ,
105+ " rect2i" ,
106+ " uint" ,
107+ " uvec2" ,
108+ " uvec3" ,
109+ " uvec4" ,
110+ " float" ,
111+ " vec2" ,
112+ " vec3" ,
113+ " vec4" ,
114+ " color" ,
115+ " rect2" ,
116+ " mat2" ,
117+ " mat3" ,
118+ " mat4" ,
119+ " transform_2d" ,
120+ " transform" ,
121+ " sampler2D" ,
122+ " sampler2DArray" ,
123+ " sampler3D" ,
124+ " samplerCube" ,
125+ " samplerExternalOES"
126+ };
127+
128+ RS::GlobalShaderParameterType gvtype = RS::GLOBAL_VAR_TYPE_MAX;
129+
130+ for (int i = 0 ; i < RS::GLOBAL_VAR_TYPE_MAX; i++) {
131+ if (global_var_type_names[i] == type) {
132+ gvtype = RS::GlobalShaderParameterType (i);
133+ break ;
134+ }
135+ }
136+
137+ ERR_CONTINUE (gvtype == RS::GLOBAL_VAR_TYPE_MAX); // type invalid
138+
139+ if (!global_shader_variables.has (name)) {
140+ global_shader_parameter_add (name, gvtype, Variant ());
141+ }
142+ }
143+ }
45144}
46145
47146RID MaterialStorage::shader_allocate () {
@@ -131,3 +230,56 @@ void MaterialStorage::get_shader_parameter_list(RID p_shader, List<PropertyInfo>
131230 p_param_list->push_back (pi);
132231 }
133232}
233+
234+ RID MaterialStorage::material_allocate () {
235+ return material_owner.allocate_rid ();
236+ }
237+
238+ void MaterialStorage::material_initialize (RID p_rid) {
239+ material_owner.initialize_rid (p_rid, DummyMaterial ());
240+ }
241+
242+ void MaterialStorage::material_free (RID p_rid) {
243+ DummyMaterial *material = material_owner.get_or_null (p_rid);
244+ ERR_FAIL_NULL (material);
245+
246+ material_owner.free (p_rid);
247+ }
248+
249+ void MaterialStorage::material_set_shader (RID p_material, RID p_shader) {
250+ DummyMaterial *material = material_owner.get_or_null (p_material);
251+ ERR_FAIL_NULL (material);
252+
253+ material->shader = p_shader;
254+ }
255+
256+ void MaterialStorage::material_set_next_pass (RID p_material, RID p_next_material) {
257+ DummyMaterial *material = material_owner.get_or_null (p_material);
258+ ERR_FAIL_NULL (material);
259+
260+ material->next_pass = p_next_material;
261+ }
262+
263+ void MaterialStorage::material_get_instance_shader_parameters (RID p_material, List<InstanceShaderParam> *r_parameters) {
264+ DummyMaterial *material = material_owner.get_or_null (p_material);
265+ ERR_FAIL_NULL (material);
266+ DummyShader *shader = shader_owner.get_or_null (material->shader );
267+
268+ if (shader) {
269+ for (const KeyValue<StringName, ShaderLanguage::ShaderNode::Uniform> &E : shader->uniforms ) {
270+ if (E.value .scope != ShaderLanguage::ShaderNode::Uniform::SCOPE_INSTANCE) {
271+ continue ;
272+ }
273+
274+ RendererMaterialStorage::InstanceShaderParam p;
275+ p.info = ShaderLanguage::uniform_to_property_info (E.value );
276+ p.info .name = E.key ; // supply name
277+ p.index = E.value .instance_index ;
278+ p.default_value = ShaderLanguage::constant_value_to_variant (E.value .default_value , E.value .type , E.value .array_size , E.value .hint );
279+ r_parameters->push_back (p);
280+ }
281+ }
282+ if (material->next_pass .is_valid ()) {
283+ material_get_instance_shader_parameters (material->next_pass , r_parameters);
284+ }
285+ }
0 commit comments