Skip to content

Commit cf91792

Browse files
committed
Implement RasterizedMeshTexture
Add RS::mesh_rasterizer_* api and new shader type `rasterize_mesh`
1 parent b7b3a1a commit cf91792

34 files changed

+1389
-11
lines changed

doc/classes/RasterizedMeshTexture.xml

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
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="resource_local_to_scene" type="bool" setter="set_local_to_scene" getter="is_local_to_scene" overrides="Resource" default="false" />
21+
<member name="surface_index" type="int" setter="set_surface_index" getter="get_surface_index" default="0">
22+
</member>
23+
<member name="texture_format" type="int" setter="set_texture_format" getter="get_texture_format" enum="RenderingServer.RasterizedTextureFormat" default="0">
24+
</member>
25+
<member name="width" type="int" setter="set_width" getter="get_width" default="256">
26+
</member>
27+
</members>
28+
</class>

doc/classes/RenderingServer.xml

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2422,6 +2422,49 @@
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="width" type="int" />
2428+
<param index="1" name="height" type="int" />
2429+
<param index="2" name="texture_format" type="int" enum="RenderingServer.RasterizedTextureFormat" />
2430+
<param index="3" name="generate_mipmaps" type="bool" default="false" />
2431+
<description>
2432+
</description>
2433+
</method>
2434+
<method name="mesh_rasterizer_draw">
2435+
<return type="void" />
2436+
<param index="0" name="mesh_rasterizer" type="RID" />
2437+
<description>
2438+
</description>
2439+
</method>
2440+
<method name="mesh_rasterizer_get_rd_texture">
2441+
<return type="RID" />
2442+
<param index="0" name="mesh_rasterizer" type="RID" />
2443+
<description>
2444+
</description>
2445+
</method>
2446+
<method name="mesh_rasterizer_set_bg_color">
2447+
<return type="void" />
2448+
<param index="0" name="mesh_rasterizer" type="RID" />
2449+
<param index="1" name="bg_color" type="Color" />
2450+
<description>
2451+
</description>
2452+
</method>
2453+
<method name="mesh_rasterizer_set_material">
2454+
<return type="void" />
2455+
<param index="0" name="mesh_rasterizer" type="RID" />
2456+
<param index="1" name="material" type="RID" />
2457+
<description>
2458+
</description>
2459+
</method>
2460+
<method name="mesh_rasterizer_set_mesh">
2461+
<return type="void" />
2462+
<param index="0" name="mesh_rasterizer" type="RID" />
2463+
<param index="1" name="mesh" type="RID" />
2464+
<param index="2" name="surface_index" type="int" />
2465+
<description>
2466+
</description>
2467+
</method>
24252468
<method name="mesh_set_blend_shape_mode">
24262469
<return type="void" />
24272470
<param index="0" name="mesh" type="RID" />
@@ -4519,7 +4562,7 @@
45194562
<constant name="SHADER_FOG" value="4" enum="ShaderMode">
45204563
Shader is a 3D fog shader.
45214564
</constant>
4522-
<constant name="SHADER_MAX" value="5" enum="ShaderMode">
4565+
<constant name="SHADER_MAX" value="6" enum="ShaderMode">
45234566
Represents the size of the [enum ShaderMode] enum.
45244567
</constant>
45254568
<constant name="MATERIAL_RENDER_PRIORITY_MIN" value="-128">
@@ -4735,6 +4778,14 @@
47354778
<constant name="MULTIMESH_INTERP_QUALITY_HIGH" value="1" enum="MultimeshPhysicsInterpolationQuality">
47364779
MultiMesh physics interpolation favors quality over speed.
47374780
</constant>
4781+
<constant name="RASTERIZED_TEXTURE_FORMAT_RGBA8" value="0" enum="RasterizedTextureFormat">
4782+
</constant>
4783+
<constant name="RASTERIZED_TEXTURE_FORMAT_RGBA8_SRGB" value="1" enum="RasterizedTextureFormat">
4784+
</constant>
4785+
<constant name="RASTERIZED_TEXTURE_FORMAT_RGBAH" value="2" enum="RasterizedTextureFormat">
4786+
</constant>
4787+
<constant name="RASTERIZED_TEXTURE_FORMAT_RGBAF" value="3" enum="RasterizedTextureFormat">
4788+
</constant>
47384789
<constant name="LIGHT_PROJECTOR_FILTER_NEAREST" value="0" enum="LightProjectorFilter">
47394790
Nearest-neighbor filter for light projectors (use for pixel art light projectors). No mipmaps are used for rendering, which means light projectors at a distance will look sharp but grainy. This has roughly the same performance cost as using mipmaps.
47404791
</constant>

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; }

editor/editor_properties.cpp

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

6162
///////////////////// 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_RASTERIZE_MESH);
33433346
}
33443347
}
33453348
}

editor/shader_create_dialog.cpp

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -212,6 +212,21 @@ void fog() {
212212
// a given FogVolume will still be used.
213213
}
214214
)";
215+
break;
216+
case Shader::MODE_RASTERIZE_MESH:
217+
code += R"(
218+
uniform mat4 projection;
219+
uniform sampler2D base_texture: source_color;
220+
221+
void vertex() {
222+
VERTEX = projection * VERTEX;
223+
}
224+
225+
void fragment() {
226+
COLOR = texture(base_texture, UV);
227+
}
228+
)";
229+
break;
215230
}
216231
}
217232
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)
@@ -1042,6 +1043,7 @@ void register_scene_types() {
10421043
GDREGISTER_CLASS(TextureCubemapRD);
10431044
GDREGISTER_CLASS(TextureCubemapArrayRD);
10441045
GDREGISTER_CLASS(Texture3DRD);
1046+
GDREGISTER_CLASS(RasterizedMeshTexture);
10451047

10461048
GDREGISTER_CLASS(Animation);
10471049
GDREGISTER_CLASS(AnimationLibrary);
@@ -1426,7 +1428,6 @@ void unregister_scene_types() {
14261428
ProceduralSkyMaterial::cleanup_shader();
14271429
FogMaterial::cleanup_shader();
14281430
#endif // _3D_DISABLED
1429-
14301431
ParticleProcessMaterial::finish_shaders();
14311432
CanvasItemMaterial::finish_shaders();
14321433
ColorPicker::finish_shaders();

0 commit comments

Comments
 (0)