Skip to content

Commit 896a8ae

Browse files
committed
Implement RasterizedMeshTexture
Implement mesh_rasterizer_rd and add `RS::mesh_rasterizer_*` api and new shader type `mesh_rasterizer`
1 parent b89c47b commit 896a8ae

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

43 files changed

+1741
-10
lines changed

doc/classes/RasterizedMeshTexture.xml

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
<?xml version="1.0" encoding="UTF-8" ?>
2+
<class name="RasterizedMeshTexture" inherits="Texture2D" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
3+
<brief_description>
4+
</brief_description>
5+
<description>
6+
</description>
7+
<tutorials>
8+
</tutorials>
9+
<members>
10+
<member name="bg_color" type="Color" setter="set_bg_color" getter="get_bg_color" default="Color(0, 0, 0, 0)">
11+
</member>
12+
<member name="generate_mipmaps" type="bool" setter="set_generate_mipmaps" getter="is_generating_mipmaps" default="false">
13+
</member>
14+
<member name="height" type="int" setter="set_height" getter="get_height" default="256">
15+
</member>
16+
<member name="material" type="ShaderMaterial" setter="set_material" getter="get_material">
17+
</member>
18+
<member name="mesh" type="Mesh" setter="set_mesh" getter="get_mesh">
19+
</member>
20+
<member name="multisample" type="int" setter="set_multisample" getter="get_multisample" enum="RenderingDevice.TextureSamples" default="0">
21+
</member>
22+
<member name="resource_local_to_scene" type="bool" setter="set_local_to_scene" getter="is_local_to_scene" overrides="Resource" default="false" />
23+
<member name="surface_index" type="int" setter="set_surface_index" getter="get_surface_index" default="0">
24+
</member>
25+
<member name="texture_format" type="int" setter="set_texture_format" getter="get_texture_format" enum="RenderingDevice.DataFormat" default="36">
26+
</member>
27+
<member name="width" type="int" setter="set_width" getter="get_width" default="256">
28+
</member>
29+
</members>
30+
</class>

doc/classes/RasterizerBlendState.xml

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
<?xml version="1.0" encoding="UTF-8" ?>
2+
<class name="RasterizerBlendState" inherits="RefCounted" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd">
3+
<brief_description>
4+
</brief_description>
5+
<description>
6+
</description>
7+
<tutorials>
8+
</tutorials>
9+
<members>
10+
<member name="alpha_blend_op" type="int" setter="set_alpha_blend_op" getter="get_alpha_blend_op" enum="RenderingDevice.BlendOperation" default="0">
11+
</member>
12+
<member name="blend_constant" type="Color" setter="set_blend_constant" getter="get_blend_constant" default="Color(0, 0, 0, 1)">
13+
</member>
14+
<member name="color_blend_op" type="int" setter="set_color_blend_op" getter="get_color_blend_op" enum="RenderingDevice.BlendOperation" default="0">
15+
</member>
16+
<member name="dst_alpha_blend_factor" type="int" setter="set_dst_alpha_blend_factor" getter="get_dst_alpha_blend_factor" enum="RenderingDevice.BlendFactor" default="0">
17+
</member>
18+
<member name="dst_color_blend_factor" type="int" setter="set_dst_color_blend_factor" getter="get_dst_color_blend_factor" enum="RenderingDevice.BlendFactor" default="0">
19+
</member>
20+
<member name="enable_blend" type="bool" setter="set_enable_blend" getter="get_enable_blend" default="false">
21+
</member>
22+
<member name="src_alpha_blend_factor" type="int" setter="set_src_alpha_blend_factor" getter="get_src_alpha_blend_factor" enum="RenderingDevice.BlendFactor" default="0">
23+
</member>
24+
<member name="src_color_blend_factor" type="int" setter="set_src_color_blend_factor" getter="get_src_color_blend_factor" enum="RenderingDevice.BlendFactor" default="0">
25+
</member>
26+
<member name="write_a" type="bool" setter="set_write_a" getter="get_write_a" default="true">
27+
</member>
28+
<member name="write_b" type="bool" setter="set_write_b" getter="get_write_b" default="true">
29+
</member>
30+
<member name="write_g" type="bool" setter="set_write_g" getter="get_write_g" default="true">
31+
</member>
32+
<member name="write_r" type="bool" setter="set_write_r" getter="get_write_r" default="true">
33+
</member>
34+
</members>
35+
</class>

doc/classes/RenderingServer.xml

Lines changed: 34 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2422,6 +2422,24 @@
24222422
Returns a mesh's number of surfaces.
24232423
</description>
24242424
</method>
2425+
<method name="mesh_rasterizer_create">
2426+
<return type="RID" />
2427+
<param index="0" name="mesh" type="RID" />
2428+
<param index="1" name="surface_index" type="int" />
2429+
<description>
2430+
</description>
2431+
</method>
2432+
<method name="mesh_rasterizer_draw">
2433+
<return type="void" />
2434+
<param index="0" name="mesh_rasterizer" type="RID" />
2435+
<param index="1" name="material" type="RID" />
2436+
<param index="2" name="texture_drawable" type="RID" />
2437+
<param index="3" name="blend_state" type="RasterizerBlendState" />
2438+
<param index="4" name="clear_color" type="Color" />
2439+
<param index="5" name="multisamples" type="int" enum="RenderingDevice.TextureSamples" default="0" />
2440+
<description>
2441+
</description>
2442+
</method>
24252443
<method name="mesh_set_blend_shape_mode">
24262444
<return type="void" />
24272445
<param index="0" name="mesh" type="RID" />
@@ -3730,6 +3748,21 @@
37303748
[b]Note:[/b] If using only the rendering device renderer, it's recommend to use [method RenderingDevice.texture_create_from_extension] together with [method RenderingServer.texture_rd_create], rather than this method. It will give you much more control over the texture's format and usage.
37313749
</description>
37323750
</method>
3751+
<method name="texture_drawable_ctreate">
3752+
<return type="RID" />
3753+
<param index="0" name="width" type="int" />
3754+
<param index="1" name="height" type="int" />
3755+
<param index="2" name="texture_format" type="int" enum="RenderingDevice.DataFormat" />
3756+
<param index="3" name="use_mipmaps" type="bool" default="false" />
3757+
<description>
3758+
</description>
3759+
</method>
3760+
<method name="texture_drawable_generate_mipmaps">
3761+
<return type="void" />
3762+
<param index="0" name="texture_drawable" type="RID" />
3763+
<description>
3764+
</description>
3765+
</method>
37333766
<method name="texture_get_format" qualifiers="const">
37343767
<return type="int" enum="Image.Format" />
37353768
<param index="0" name="texture" type="RID" />
@@ -4519,7 +4552,7 @@
45194552
<constant name="SHADER_FOG" value="4" enum="ShaderMode">
45204553
Shader is a 3D fog shader.
45214554
</constant>
4522-
<constant name="SHADER_MAX" value="5" enum="ShaderMode">
4555+
<constant name="SHADER_MAX" value="6" enum="ShaderMode">
45234556
Represents the size of the [enum ShaderMode] enum.
45244557
</constant>
45254558
<constant name="MATERIAL_RENDER_PRIORITY_MIN" value="-128">

doc/classes/ShaderMaterial.xml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,4 +35,10 @@
3535
The [Shader] program used to render this material.
3636
</member>
3737
</members>
38+
<signals>
39+
<signal name="shader_parameter_changed">
40+
<description>
41+
</description>
42+
</signal>
43+
</signals>
3844
</class>

drivers/gles3/rasterizer_gles3.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,6 @@
3131
#pragma once
3232

3333
#ifdef GLES3_ENABLED
34-
3534
#include "effects/copy_effects.h"
3635
#include "effects/cubemap_filter.h"
3736
#include "effects/feed_effects.h"
@@ -41,6 +40,7 @@
4140
#include "environment/gi.h"
4241
#include "rasterizer_canvas_gles3.h"
4342
#include "rasterizer_scene_gles3.h"
43+
#include "servers/rendering/dummy/mesh_rasterizer_dummy.h"
4444
#include "servers/rendering/renderer_compositor.h"
4545
#include "storage/config.h"
4646
#include "storage/light_storage.h"
@@ -81,6 +81,8 @@ class RasterizerGLES3 : public RendererCompositor {
8181
GLES3::FeedEffects *feed_effects = nullptr;
8282
RasterizerCanvasGLES3 *canvas = nullptr;
8383
RasterizerSceneGLES3 *scene = nullptr;
84+
RendererDummy::MeshRasterizerDummy mesh_rasterizer;
85+
8486
static RasterizerGLES3 *singleton;
8587

8688
void _blit_render_target_to_screen(RID p_render_target, DisplayServer::WindowID p_screen, const Rect2 &p_screen_rect, uint32_t p_layer, bool p_first = true);
@@ -92,6 +94,7 @@ class RasterizerGLES3 : public RendererCompositor {
9294
RendererMeshStorage *get_mesh_storage() { return mesh_storage; }
9395
RendererParticlesStorage *get_particles_storage() { return particles_storage; }
9496
RendererTextureStorage *get_texture_storage() { return texture_storage; }
97+
MeshRasterizer *get_mesh_rasterizer() { return &mesh_rasterizer; }
9598
RendererGI *get_gi() { return gi; }
9699
RendererFog *get_fog() { return fog; }
97100
RendererCanvasRender *get_canvas() { return canvas; }

drivers/gles3/storage/texture_storage.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2090,6 +2090,14 @@ AABB TextureStorage::decal_get_aabb(RID p_decal) const {
20902090
return AABB();
20912091
}
20922092

2093+
/* TEXTURE DRAWABLE API */
2094+
2095+
void GLES3::TextureStorage::texture_drawable_initialize(RID p_rid, int p_width, int p_height, RD::DataFormat p_texture_format, bool p_use_mipmaps) {
2096+
}
2097+
2098+
void GLES3::TextureStorage::texture_drawable_generate_mipmaps(RID p_texture_drawable) {
2099+
}
2100+
20932101
/* RENDER TARGET API */
20942102

20952103
GLuint TextureStorage::system_fbo = 0;

drivers/gles3/storage/texture_storage.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -615,6 +615,11 @@ class TextureStorage : public RendererTextureStorage {
615615
virtual void decal_instance_set_transform(RID p_decal, const Transform3D &p_transform) override {}
616616
virtual void decal_instance_set_sorting_offset(RID p_decal_instance, float p_sorting_offset) override {}
617617

618+
/* TEXTURE DRAWABLE API */
619+
620+
void texture_drawable_initialize(RID p_rid, int p_width, int p_height, RD::DataFormat p_texture_format, bool p_use_mipmaps = false) override;
621+
void texture_drawable_generate_mipmaps(RID p_texture_drawable) override;
622+
618623
/* RENDER TARGET API */
619624

620625
static GLuint system_fbo;

editor/editor_properties.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,7 @@
5757
#include "scene/main/window.h"
5858
#include "scene/resources/font.h"
5959
#include "scene/resources/mesh.h"
60+
#include "scene/resources/rasterized_mesh_texture.h"
6061
#include "scene/resources/visual_shader_nodes.h"
6162

6263
///////////////////// NIL /////////////////////////
@@ -3340,6 +3341,8 @@ void EditorPropertyResource::_update_preferred_shader() {
33403341
shader_picker->set_preferred_mode(Shader::MODE_SPATIAL);
33413342
} else if (Object::cast_to<Sky>(ed_object)) {
33423343
shader_picker->set_preferred_mode(Shader::MODE_SKY);
3344+
} else if (Object::cast_to<RasterizedMeshTexture>(ed_object)) {
3345+
shader_picker->set_preferred_mode(Shader::MODE_MESH_RASTERIZER);
33433346
}
33443347
}
33453348
}

editor/shader_create_dialog.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,21 @@ void fog() {
216216
// a given FogVolume will still be used.
217217
}
218218
)";
219+
break;
220+
case Shader::MODE_MESH_RASTERIZER:
221+
code += R"(
222+
uniform mat4 projection;
223+
uniform sampler2D base_texture: source_color;
224+
225+
void vertex() {
226+
VERTEX = projection * VERTEX;
227+
}
228+
229+
void fragment() {
230+
COLOR = texture(base_texture, UV);
231+
}
232+
)";
233+
break;
219234
}
220235
}
221236
text_shader->set_code(code.as_string());

scene/register_scene_types.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,7 @@
131131
#include "scene/resources/mesh_data_tool.h"
132132
#include "scene/resources/mesh_texture.h"
133133
#include "scene/resources/multimesh.h"
134+
#include "scene/resources/rasterized_mesh_texture.h"
134135
#if !defined(NAVIGATION_2D_DISABLED) || !defined(NAVIGATION_3D_DISABLED)
135136
#include "scene/resources/navigation_mesh.h"
136137
#endif // !defined(NAVIGATION_2D_DISABLED) || !defined(NAVIGATION_3D_DISABLED)
@@ -1041,6 +1042,7 @@ void register_scene_types() {
10411042
GDREGISTER_CLASS(TextureCubemapRD);
10421043
GDREGISTER_CLASS(TextureCubemapArrayRD);
10431044
GDREGISTER_CLASS(Texture3DRD);
1045+
GDREGISTER_CLASS(RasterizedMeshTexture);
10441046

10451047
GDREGISTER_CLASS(Animation);
10461048
GDREGISTER_CLASS(AnimationLibrary);
@@ -1425,7 +1427,6 @@ void unregister_scene_types() {
14251427
ProceduralSkyMaterial::cleanup_shader();
14261428
FogMaterial::cleanup_shader();
14271429
#endif // _3D_DISABLED
1428-
14291430
ParticleProcessMaterial::finish_shaders();
14301431
CanvasItemMaterial::finish_shaders();
14311432
ColorPicker::finish_shaders();

0 commit comments

Comments
 (0)