Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/drivers/gles3/storage/material_storage.h
10000 views
1
/**************************************************************************/
2
/* material_storage.h */
3
/**************************************************************************/
4
/* This file is part of: */
5
/* GODOT ENGINE */
6
/* https://godotengine.org */
7
/**************************************************************************/
8
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
9
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
10
/* */
11
/* Permission is hereby granted, free of charge, to any person obtaining */
12
/* a copy of this software and associated documentation files (the */
13
/* "Software"), to deal in the Software without restriction, including */
14
/* without limitation the rights to use, copy, modify, merge, publish, */
15
/* distribute, sublicense, and/or sell copies of the Software, and to */
16
/* permit persons to whom the Software is furnished to do so, subject to */
17
/* the following conditions: */
18
/* */
19
/* The above copyright notice and this permission notice shall be */
20
/* included in all copies or substantial portions of the Software. */
21
/* */
22
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
23
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
24
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
25
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
26
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
27
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
28
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
29
/**************************************************************************/
30
31
#pragma once
32
33
#ifdef GLES3_ENABLED
34
35
#include "core/templates/rid_owner.h"
36
#include "core/templates/self_list.h"
37
#include "servers/rendering/shader_compiler.h"
38
#include "servers/rendering/shader_language.h"
39
#include "servers/rendering/storage/material_storage.h"
40
#include "servers/rendering/storage/utilities.h"
41
42
#include "drivers/gles3/shaders/canvas.glsl.gen.h"
43
#include "drivers/gles3/shaders/particles.glsl.gen.h"
44
#include "drivers/gles3/shaders/scene.glsl.gen.h"
45
#include "drivers/gles3/shaders/sky.glsl.gen.h"
46
47
namespace GLES3 {
48
49
/* Shader Structs */
50
51
struct ShaderData {
52
String path;
53
HashMap<StringName, ShaderLanguage::ShaderNode::Uniform> uniforms;
54
HashMap<StringName, HashMap<int, RID>> default_texture_params;
55
56
virtual void set_path_hint(const String &p_hint);
57
virtual void set_default_texture_parameter(const StringName &p_name, RID p_texture, int p_index);
58
virtual Variant get_default_parameter(const StringName &p_parameter) const;
59
virtual void get_shader_uniform_list(List<PropertyInfo> *p_param_list) const;
60
virtual void get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const;
61
virtual bool is_parameter_texture(const StringName &p_param) const;
62
63
virtual void set_code(const String &p_Code) = 0;
64
virtual bool is_animated() const = 0;
65
virtual bool casts_shadows() const = 0;
66
virtual RS::ShaderNativeSourceCode get_native_source_code() const { return RS::ShaderNativeSourceCode(); }
67
68
virtual ~ShaderData() {}
69
};
70
71
typedef ShaderData *(*ShaderDataRequestFunction)();
72
73
struct Material;
74
75
struct Shader {
76
ShaderData *data = nullptr;
77
String code;
78
String path_hint;
79
RS::ShaderMode mode;
80
HashMap<StringName, HashMap<int, RID>> default_texture_parameter;
81
HashSet<Material *> owners;
82
};
83
84
/* Material structs */
85
86
struct MaterialData {
87
void update_uniform_buffer(const HashMap<StringName, ShaderLanguage::ShaderNode::Uniform> &p_uniforms, const uint32_t *p_uniform_offsets, const HashMap<StringName, Variant> &p_parameters, uint8_t *p_buffer, uint32_t p_buffer_size);
88
void update_textures(const HashMap<StringName, Variant> &p_parameters, const HashMap<StringName, HashMap<int, RID>> &p_default_textures, const Vector<ShaderCompiler::GeneratedCode::Texture> &p_texture_uniforms, RID *p_textures, bool p_use_linear_color);
89
90
virtual void set_render_priority(int p_priority) = 0;
91
virtual void set_next_pass(RID p_pass) = 0;
92
virtual void update_parameters(const HashMap<StringName, Variant> &p_parameters, bool p_uniform_dirty, bool p_textures_dirty) = 0;
93
virtual void bind_uniforms() = 0;
94
virtual ~MaterialData();
95
96
// Used internally by all Materials
97
void update_parameters_internal(const HashMap<StringName, Variant> &p_parameters, bool p_uniform_dirty, bool p_textures_dirty, const HashMap<StringName, ShaderLanguage::ShaderNode::Uniform> &p_uniforms, const uint32_t *p_uniform_offsets, const Vector<ShaderCompiler::GeneratedCode::Texture> &p_texture_uniforms, const HashMap<StringName, HashMap<int, RID>> &p_default_texture_params, uint32_t p_ubo_size, bool p_is_3d_shader_type);
98
99
protected:
100
Vector<uint8_t> ubo_data;
101
GLuint uniform_buffer = GLuint(0);
102
Vector<RID> texture_cache;
103
104
private:
105
friend class MaterialStorage;
106
RID self;
107
List<RID>::Element *global_buffer_E = nullptr;
108
List<RID>::Element *global_texture_E = nullptr;
109
uint64_t global_textures_pass = 0;
110
HashMap<StringName, uint64_t> used_global_textures;
111
};
112
113
typedef MaterialData *(*MaterialDataRequestFunction)(ShaderData *);
114
115
struct Material {
116
RID self;
117
MaterialData *data = nullptr;
118
Shader *shader = nullptr;
119
//shortcut to shader data and type
120
RS::ShaderMode shader_mode = RS::SHADER_MAX;
121
uint32_t shader_id = 0;
122
bool uniform_dirty = false;
123
bool texture_dirty = false;
124
HashMap<StringName, Variant> params;
125
int32_t priority = 0;
126
RID next_pass;
127
SelfList<Material> update_element;
128
129
Dependency dependency;
130
131
Material() :
132
update_element(this) {}
133
};
134
135
/* CanvasItem Materials */
136
137
struct CanvasShaderData : public ShaderData {
138
enum BlendMode { // Used internally.
139
BLEND_MODE_MIX,
140
BLEND_MODE_ADD,
141
BLEND_MODE_SUB,
142
BLEND_MODE_MUL,
143
BLEND_MODE_PMALPHA,
144
BLEND_MODE_DISABLED,
145
BLEND_MODE_LCD,
146
};
147
148
// All these members are (re)initialized in `set_code`.
149
// Make sure to add the init to `set_code` whenever adding new members.
150
151
bool valid;
152
RID version;
153
154
Vector<ShaderCompiler::GeneratedCode::Texture> texture_uniforms;
155
156
Vector<uint32_t> ubo_offsets;
157
uint32_t ubo_size;
158
159
String code;
160
161
BlendMode blend_mode;
162
163
bool uses_screen_texture;
164
bool uses_screen_texture_mipmaps;
165
bool uses_sdf;
166
bool uses_time;
167
bool uses_custom0;
168
bool uses_custom1;
169
170
uint64_t vertex_input_mask;
171
172
virtual void set_code(const String &p_Code);
173
virtual bool is_animated() const;
174
virtual bool casts_shadows() const;
175
virtual RS::ShaderNativeSourceCode get_native_source_code() const;
176
177
CanvasShaderData();
178
virtual ~CanvasShaderData();
179
};
180
181
ShaderData *_create_canvas_shader_func();
182
183
struct CanvasMaterialData : public MaterialData {
184
CanvasShaderData *shader_data = nullptr;
185
186
virtual void set_render_priority(int p_priority) {}
187
virtual void set_next_pass(RID p_pass) {}
188
virtual void update_parameters(const HashMap<StringName, Variant> &p_parameters, bool p_uniform_dirty, bool p_textures_dirty);
189
virtual void bind_uniforms();
190
virtual ~CanvasMaterialData();
191
};
192
193
MaterialData *_create_canvas_material_func(ShaderData *p_shader);
194
195
/* Sky Materials */
196
197
struct SkyShaderData : public ShaderData {
198
// All these members are (re)initialized in `set_code`.
199
// Make sure to add the init to `set_code` whenever adding new members.
200
201
bool valid;
202
RID version;
203
204
Vector<ShaderCompiler::GeneratedCode::Texture> texture_uniforms;
205
206
Vector<uint32_t> ubo_offsets;
207
uint32_t ubo_size;
208
209
String code;
210
211
bool uses_time;
212
bool uses_position;
213
bool uses_half_res;
214
bool uses_quarter_res;
215
bool uses_light;
216
217
virtual void set_code(const String &p_Code);
218
virtual bool is_animated() const;
219
virtual bool casts_shadows() const;
220
virtual RS::ShaderNativeSourceCode get_native_source_code() const;
221
SkyShaderData();
222
virtual ~SkyShaderData();
223
};
224
225
ShaderData *_create_sky_shader_func();
226
227
struct SkyMaterialData : public MaterialData {
228
SkyShaderData *shader_data = nullptr;
229
bool uniform_set_updated = false;
230
231
virtual void set_render_priority(int p_priority) {}
232
virtual void set_next_pass(RID p_pass) {}
233
virtual void update_parameters(const HashMap<StringName, Variant> &p_parameters, bool p_uniform_dirty, bool p_textures_dirty);
234
virtual void bind_uniforms();
235
virtual ~SkyMaterialData();
236
};
237
238
MaterialData *_create_sky_material_func(ShaderData *p_shader);
239
240
/* Scene Materials */
241
242
struct SceneShaderData : public ShaderData {
243
enum BlendMode { // Used internally.
244
BLEND_MODE_MIX,
245
BLEND_MODE_ADD,
246
BLEND_MODE_SUB,
247
BLEND_MODE_MUL,
248
BLEND_MODE_PREMULT_ALPHA,
249
BLEND_MODE_ALPHA_TO_COVERAGE
250
};
251
252
enum DepthDraw {
253
DEPTH_DRAW_DISABLED,
254
DEPTH_DRAW_OPAQUE,
255
DEPTH_DRAW_ALWAYS
256
};
257
258
enum DepthTest {
259
DEPTH_TEST_DISABLED,
260
DEPTH_TEST_ENABLED,
261
DEPTH_TEST_ENABLED_INVERTED,
262
};
263
264
enum StencilCompare {
265
STENCIL_COMPARE_LESS,
266
STENCIL_COMPARE_EQUAL,
267
STENCIL_COMPARE_LESS_OR_EQUAL,
268
STENCIL_COMPARE_GREATER,
269
STENCIL_COMPARE_NOT_EQUAL,
270
STENCIL_COMPARE_GREATER_OR_EQUAL,
271
STENCIL_COMPARE_ALWAYS,
272
STENCIL_COMPARE_MAX // not an actual operator, just the amount of operators
273
};
274
275
enum StencilFlags {
276
STENCIL_FLAG_READ = 1,
277
STENCIL_FLAG_WRITE = 2,
278
STENCIL_FLAG_WRITE_DEPTH_FAIL = 4,
279
};
280
281
enum AlphaAntiAliasing {
282
ALPHA_ANTIALIASING_OFF,
283
ALPHA_ANTIALIASING_ALPHA_TO_COVERAGE,
284
ALPHA_ANTIALIASING_ALPHA_TO_COVERAGE_AND_TO_ONE
285
};
286
287
// All these members are (re)initialized in `set_code`.
288
// Make sure to add the init to `set_code` whenever adding new members.
289
290
bool valid;
291
RID version;
292
293
Vector<ShaderCompiler::GeneratedCode::Texture> texture_uniforms;
294
295
Vector<uint32_t> ubo_offsets;
296
uint32_t ubo_size;
297
298
String code;
299
300
BlendMode blend_mode;
301
AlphaAntiAliasing alpha_antialiasing_mode;
302
DepthDraw depth_draw;
303
DepthTest depth_test;
304
RS::CullMode cull_mode;
305
306
StencilCompare stencil_compare;
307
uint32_t stencil_flags;
308
int32_t stencil_reference;
309
bool stencil_enabled;
310
311
bool uses_point_size;
312
bool uses_alpha;
313
bool uses_alpha_clip;
314
bool uses_blend_alpha;
315
bool uses_depth_prepass_alpha;
316
bool uses_discard;
317
bool uses_roughness;
318
bool uses_normal;
319
bool uses_particle_trails;
320
bool wireframe;
321
322
bool unshaded;
323
bool uses_vertex;
324
bool uses_position;
325
bool uses_sss;
326
bool uses_transmittance;
327
bool uses_screen_texture;
328
bool uses_screen_texture_mipmaps;
329
bool uses_depth_texture;
330
bool uses_normal_texture;
331
bool uses_bent_normal_texture;
332
bool uses_time;
333
bool uses_vertex_time;
334
bool uses_fragment_time;
335
bool writes_modelview_or_projection;
336
bool uses_world_coordinates;
337
bool uses_tangent;
338
bool uses_color;
339
bool uses_uv;
340
bool uses_uv2;
341
bool uses_custom0;
342
bool uses_custom1;
343
bool uses_custom2;
344
bool uses_custom3;
345
bool uses_bones;
346
bool uses_weights;
347
348
uint64_t vertex_input_mask;
349
350
virtual void set_code(const String &p_Code);
351
virtual bool is_animated() const;
352
virtual bool casts_shadows() const;
353
virtual RS::ShaderNativeSourceCode get_native_source_code() const;
354
355
SceneShaderData();
356
virtual ~SceneShaderData();
357
};
358
359
ShaderData *_create_scene_shader_func();
360
361
struct SceneMaterialData : public MaterialData {
362
SceneShaderData *shader_data = nullptr;
363
uint64_t last_pass = 0;
364
uint32_t index = 0;
365
RID next_pass;
366
uint8_t priority = 0;
367
virtual void set_render_priority(int p_priority);
368
virtual void set_next_pass(RID p_pass);
369
virtual void update_parameters(const HashMap<StringName, Variant> &p_parameters, bool p_uniform_dirty, bool p_textures_dirty);
370
virtual void bind_uniforms();
371
virtual ~SceneMaterialData();
372
};
373
374
MaterialData *_create_scene_material_func(ShaderData *p_shader);
375
376
/* Particle Shader */
377
378
enum {
379
PARTICLES_MAX_USERDATAS = 6
380
};
381
382
struct ParticlesShaderData : public ShaderData {
383
// All these members are (re)initialized in `set_code`.
384
// Make sure to add the init to `set_code` whenever adding new members.
385
386
bool valid;
387
RID version;
388
389
Vector<ShaderCompiler::GeneratedCode::Texture> texture_uniforms;
390
391
Vector<uint32_t> ubo_offsets;
392
uint32_t ubo_size;
393
394
String code;
395
396
bool uses_collision;
397
bool uses_time;
398
399
bool userdatas_used[PARTICLES_MAX_USERDATAS] = {};
400
uint32_t userdata_count;
401
402
virtual void set_code(const String &p_Code);
403
virtual bool is_animated() const;
404
virtual bool casts_shadows() const;
405
virtual RS::ShaderNativeSourceCode get_native_source_code() const;
406
407
ParticlesShaderData() {}
408
virtual ~ParticlesShaderData();
409
};
410
411
ShaderData *_create_particles_shader_func();
412
413
struct ParticleProcessMaterialData : public MaterialData {
414
ParticlesShaderData *shader_data = nullptr;
415
RID uniform_set;
416
417
virtual void set_render_priority(int p_priority) {}
418
virtual void set_next_pass(RID p_pass) {}
419
virtual void update_parameters(const HashMap<StringName, Variant> &p_parameters, bool p_uniform_dirty, bool p_textures_dirty);
420
virtual void bind_uniforms();
421
virtual ~ParticleProcessMaterialData();
422
};
423
424
MaterialData *_create_particles_material_func(ShaderData *p_shader);
425
426
/* Global shader uniform structs */
427
struct GlobalShaderUniforms {
428
enum {
429
BUFFER_DIRTY_REGION_SIZE = 1024
430
};
431
struct Variable {
432
HashSet<RID> texture_materials; // materials using this
433
434
RS::GlobalShaderParameterType type;
435
Variant value;
436
Variant override;
437
int32_t buffer_index; //for vectors
438
int32_t buffer_elements; //for vectors
439
};
440
441
HashMap<StringName, Variable> variables;
442
443
struct Value {
444
float x;
445
float y;
446
float z;
447
float w;
448
};
449
450
struct ValueInt {
451
int32_t x;
452
int32_t y;
453
int32_t z;
454
int32_t w;
455
};
456
457
struct ValueUInt {
458
uint32_t x;
459
uint32_t y;
460
uint32_t z;
461
uint32_t w;
462
};
463
464
struct ValueUsage {
465
uint32_t elements = 0;
466
};
467
468
List<RID> materials_using_buffer;
469
List<RID> materials_using_texture;
470
471
GLuint buffer = GLuint(0);
472
Value *buffer_values = nullptr;
473
ValueUsage *buffer_usage = nullptr;
474
bool *buffer_dirty_regions = nullptr;
475
uint32_t buffer_dirty_region_count = 0;
476
477
uint32_t buffer_size;
478
479
bool must_update_texture_materials = false;
480
bool must_update_buffer_materials = false;
481
482
HashMap<RID, int32_t> instance_buffer_pos;
483
};
484
485
class MaterialStorage : public RendererMaterialStorage {
486
private:
487
friend struct MaterialData;
488
static MaterialStorage *singleton;
489
490
/* GLOBAL SHADER UNIFORM API */
491
492
GlobalShaderUniforms global_shader_uniforms;
493
494
int32_t _global_shader_uniform_allocate(uint32_t p_elements);
495
void _global_shader_uniform_store_in_buffer(int32_t p_index, RS::GlobalShaderParameterType p_type, const Variant &p_value);
496
void _global_shader_uniform_mark_buffer_dirty(int32_t p_index, int32_t p_elements);
497
498
/* SHADER API */
499
500
ShaderDataRequestFunction shader_data_request_func[RS::SHADER_MAX];
501
mutable RID_Owner<Shader, true> shader_owner;
502
503
/* MATERIAL API */
504
MaterialDataRequestFunction material_data_request_func[RS::SHADER_MAX];
505
mutable RID_Owner<Material, true> material_owner;
506
507
SelfList<Material>::List material_update_list;
508
HashSet<RID> dummy_embedded_set;
509
510
public:
511
static MaterialStorage *get_singleton();
512
513
MaterialStorage();
514
virtual ~MaterialStorage();
515
516
static _FORCE_INLINE_ void store_transform(const Transform3D &p_mtx, float *p_array) {
517
p_array[0] = p_mtx.basis.rows[0][0];
518
p_array[1] = p_mtx.basis.rows[1][0];
519
p_array[2] = p_mtx.basis.rows[2][0];
520
p_array[3] = 0;
521
p_array[4] = p_mtx.basis.rows[0][1];
522
p_array[5] = p_mtx.basis.rows[1][1];
523
p_array[6] = p_mtx.basis.rows[2][1];
524
p_array[7] = 0;
525
p_array[8] = p_mtx.basis.rows[0][2];
526
p_array[9] = p_mtx.basis.rows[1][2];
527
p_array[10] = p_mtx.basis.rows[2][2];
528
p_array[11] = 0;
529
p_array[12] = p_mtx.origin.x;
530
p_array[13] = p_mtx.origin.y;
531
p_array[14] = p_mtx.origin.z;
532
p_array[15] = 1;
533
}
534
535
static _FORCE_INLINE_ void store_transform_3x3(const Basis &p_mtx, float *p_array) {
536
p_array[0] = p_mtx.rows[0][0];
537
p_array[1] = p_mtx.rows[1][0];
538
p_array[2] = p_mtx.rows[2][0];
539
p_array[3] = 0;
540
p_array[4] = p_mtx.rows[0][1];
541
p_array[5] = p_mtx.rows[1][1];
542
p_array[6] = p_mtx.rows[2][1];
543
p_array[7] = 0;
544
p_array[8] = p_mtx.rows[0][2];
545
p_array[9] = p_mtx.rows[1][2];
546
p_array[10] = p_mtx.rows[2][2];
547
p_array[11] = 0;
548
}
549
550
static _FORCE_INLINE_ void store_camera(const Projection &p_mtx, float *p_array) {
551
for (int i = 0; i < 4; i++) {
552
for (int j = 0; j < 4; j++) {
553
p_array[i * 4 + j] = p_mtx.columns[i][j];
554
}
555
}
556
}
557
558
struct Shaders {
559
CanvasShaderGLES3 canvas_shader;
560
SkyShaderGLES3 sky_shader;
561
SceneShaderGLES3 scene_shader;
562
ParticlesShaderGLES3 particles_process_shader;
563
564
ShaderCompiler compiler_canvas;
565
ShaderCompiler compiler_scene;
566
ShaderCompiler compiler_particles;
567
ShaderCompiler compiler_sky;
568
} shaders;
569
570
/* GLOBAL SHADER UNIFORM API */
571
572
void _update_global_shader_uniforms();
573
574
virtual void global_shader_parameter_add(const StringName &p_name, RS::GlobalShaderParameterType p_type, const Variant &p_value) override;
575
virtual void global_shader_parameter_remove(const StringName &p_name) override;
576
virtual Vector<StringName> global_shader_parameter_get_list() const override;
577
578
virtual void global_shader_parameter_set(const StringName &p_name, const Variant &p_value) override;
579
virtual void global_shader_parameter_set_override(const StringName &p_name, const Variant &p_value) override;
580
virtual Variant global_shader_parameter_get(const StringName &p_name) const override;
581
virtual RS::GlobalShaderParameterType global_shader_parameter_get_type(const StringName &p_name) const override;
582
RS::GlobalShaderParameterType global_shader_parameter_get_type_internal(const StringName &p_name) const;
583
584
virtual void global_shader_parameters_load_settings(bool p_load_textures = true) override;
585
virtual void global_shader_parameters_clear() override;
586
587
virtual int32_t global_shader_parameters_instance_allocate(RID p_instance) override;
588
virtual void global_shader_parameters_instance_free(RID p_instance) override;
589
virtual void global_shader_parameters_instance_update(RID p_instance, int p_index, const Variant &p_value, int p_flags_count = 0) override;
590
591
GLuint global_shader_parameters_get_uniform_buffer() const;
592
593
/* SHADER API */
594
595
Shader *get_shader(RID p_rid) { return shader_owner.get_or_null(p_rid); }
596
bool owns_shader(RID p_rid) { return shader_owner.owns(p_rid); }
597
598
void _shader_make_dirty(Shader *p_shader);
599
600
virtual RID shader_allocate() override;
601
virtual void shader_initialize(RID p_rid, bool p_embedded = true) override;
602
virtual void shader_free(RID p_rid) override;
603
604
virtual void shader_set_code(RID p_shader, const String &p_code) override;
605
virtual void shader_set_path_hint(RID p_shader, const String &p_path) override;
606
virtual String shader_get_code(RID p_shader) const override;
607
virtual void get_shader_parameter_list(RID p_shader, List<PropertyInfo> *p_param_list) const override;
608
609
virtual void shader_set_default_texture_parameter(RID p_shader, const StringName &p_name, RID p_texture, int p_index) override;
610
virtual RID shader_get_default_texture_parameter(RID p_shader, const StringName &p_name, int p_index) const override;
611
virtual Variant shader_get_parameter_default(RID p_shader, const StringName &p_name) const override;
612
613
virtual RS::ShaderNativeSourceCode shader_get_native_source_code(RID p_shader) const override;
614
virtual void shader_embedded_set_lock() override {}
615
virtual const HashSet<RID> &shader_embedded_set_get() const override { return dummy_embedded_set; }
616
virtual void shader_embedded_set_unlock() override {}
617
618
/* MATERIAL API */
619
620
Material *get_material(RID p_rid) { return material_owner.get_or_null(p_rid); }
621
bool owns_material(RID p_rid) { return material_owner.owns(p_rid); }
622
623
void _material_queue_update(Material *material, bool p_uniform, bool p_texture);
624
void _update_queued_materials();
625
626
virtual RID material_allocate() override;
627
virtual void material_initialize(RID p_rid) override;
628
virtual void material_free(RID p_rid) override;
629
630
virtual void material_set_shader(RID p_material, RID p_shader) override;
631
632
virtual void material_set_param(RID p_material, const StringName &p_param, const Variant &p_value) override;
633
virtual Variant material_get_param(RID p_material, const StringName &p_param) const override;
634
635
virtual void material_set_next_pass(RID p_material, RID p_next_material) override;
636
virtual void material_set_render_priority(RID p_material, int priority) override;
637
638
virtual bool material_is_animated(RID p_material) override;
639
virtual bool material_casts_shadows(RID p_material) override;
640
virtual RS::CullMode material_get_cull_mode(RID p_material) const override;
641
642
virtual void material_get_instance_shader_parameters(RID p_material, List<InstanceShaderParam> *r_parameters) override;
643
644
virtual void material_update_dependency(RID p_material, DependencyTracker *p_instance) override;
645
646
_FORCE_INLINE_ uint32_t material_get_shader_id(RID p_material) {
647
Material *material = material_owner.get_or_null(p_material);
648
return material->shader_id;
649
}
650
651
_FORCE_INLINE_ MaterialData *material_get_data(RID p_material, RS::ShaderMode p_shader_mode) {
652
Material *material = material_owner.get_or_null(p_material);
653
if (!material || material->shader_mode != p_shader_mode) {
654
return nullptr;
655
} else {
656
return material->data;
657
}
658
}
659
};
660
661
} // namespace GLES3
662
663
#endif // GLES3_ENABLED
664
665