Skip to content

Commit cab9b28

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

33 files changed

+1352
-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_RGBA8_RGBAH" value="2" enum="RasterizedTextureFormat">
4786+
</constant>
4787+
<constant name="RASTERIZED_TEXTURE_FORMAT_RGBA8_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();
Lines changed: 195 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,195 @@
1+
/**************************************************************************/
2+
/* rasterized_mesh_texture.cpp */
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+
#include "rasterized_mesh_texture.h"
32+
#include "scene/resources/mesh.h"
33+
34+
int RasterizedMeshTexture::get_width() const {
35+
return size.width;
36+
}
37+
38+
int RasterizedMeshTexture::get_height() const {
39+
return size.height;
40+
}
41+
42+
bool RasterizedMeshTexture::has_alpha() const {
43+
return true;
44+
}
45+
46+
RID RasterizedMeshTexture::get_rid() const {
47+
return texture;
48+
}
49+
50+
Ref<Image> RasterizedMeshTexture::get_image() const {
51+
if (texture.is_null()) {
52+
return Ref<Image>();
53+
}
54+
return RenderingServer::get_singleton()->texture_2d_get(texture);
55+
}
56+
57+
void RasterizedMeshTexture::set_width(int p_width) {
58+
ERR_FAIL_COND(p_width <= 0 || p_width > 16384);
59+
size.width = p_width;
60+
rasterizer_dirty = true;
61+
queue_update_texture();
62+
}
63+
64+
void RasterizedMeshTexture::set_height(int p_height) {
65+
ERR_FAIL_COND(p_height <= 0 || p_height > 16384);
66+
size.height = p_height;
67+
rasterizer_dirty = true;
68+
queue_update_texture();
69+
}
70+
71+
void RasterizedMeshTexture::set_mesh(const Ref<Mesh> &p_mesh) {
72+
mesh = p_mesh;
73+
mesh_drity = true;
74+
queue_update_texture();
75+
}
76+
77+
Ref<Mesh> RasterizedMeshTexture::get_mesh() const {
78+
return mesh;
79+
}
80+
81+
void RasterizedMeshTexture::set_bg_color(const Color &p_color) {
82+
bg_color = p_color;
83+
queue_update_texture();
84+
}
85+
86+
Color RasterizedMeshTexture::get_bg_color() const {
87+
return bg_color;
88+
}
89+
90+
void RasterizedMeshTexture::set_material(const Ref<ShaderMaterial> &p_material) {
91+
material = p_material;
92+
material_drity = true;
93+
queue_update_texture();
94+
}
95+
96+
Ref<ShaderMaterial> RasterizedMeshTexture::get_material() const {
97+
return material;
98+
}
99+
100+
void RasterizedMeshTexture::set_surface_index(int p_surface_index) {
101+
surface_index = p_surface_index;
102+
mesh_drity = true;
103+
RS::get_singleton()->mesh_rasterizer_draw(mesh_rasterizer);
104+
}
105+
106+
int RasterizedMeshTexture::get_surface_index() const {
107+
return surface_index;
108+
}
109+
110+
void RasterizedMeshTexture::set_texture_format(RS::RasterizedTextureFormat p_texture_format) {
111+
texture_format = p_texture_format;
112+
rasterizer_dirty = true;
113+
queue_update_texture();
114+
}
115+
116+
RS::RasterizedTextureFormat RasterizedMeshTexture::get_texture_format() const {
117+
return texture_format;
118+
}
119+
120+
void RasterizedMeshTexture::set_generate_mipmaps(bool p_generate_mipmaps) {
121+
generate_mipmaps = p_generate_mipmaps;
122+
rasterizer_dirty = true;
123+
queue_update_texture();
124+
}
125+
126+
bool RasterizedMeshTexture::is_generating_mipmaps() const {
127+
return generate_mipmaps;
128+
}
129+
130+
RasterizedMeshTexture::RasterizedMeshTexture() {
131+
mesh_rasterizer = RS::get_singleton()->mesh_rasterizer_create(size.width, size.height, texture_format, generate_mipmaps);
132+
texture = RS::get_singleton()->texture_rd_create(RS::get_singleton()->mesh_rasterizer_get_rd_texture(mesh_rasterizer));
133+
}
134+
135+
RasterizedMeshTexture::~RasterizedMeshTexture() {
136+
RS::get_singleton()->free(texture);
137+
RS::get_singleton()->free(mesh_rasterizer);
138+
}
139+
140+
void RasterizedMeshTexture::update_texture() {
141+
if (rasterizer_dirty) {
142+
RID new_mesh_rasterizer = RS::get_singleton()->mesh_rasterizer_create(size.width, size.height, texture_format, generate_mipmaps);
143+
RID new_texture = RS::get_singleton()->texture_rd_create(RS::get_singleton()->mesh_rasterizer_get_rd_texture(new_mesh_rasterizer));
144+
RS::get_singleton()->texture_replace(texture, new_texture);
145+
RS::get_singleton()->free(mesh_rasterizer);
146+
mesh_rasterizer = new_mesh_rasterizer;
147+
}
148+
if (rasterizer_dirty || mesh_drity) {
149+
RS::get_singleton()->mesh_rasterizer_set_mesh(mesh_rasterizer, mesh.is_valid() ? mesh->get_rid() : RID(), surface_index);
150+
mesh_drity = false;
151+
}
152+
if (rasterizer_dirty || material_drity) {
153+
RS::get_singleton()->mesh_rasterizer_set_material(mesh_rasterizer, material.is_valid() ? material->get_rid() : RID());
154+
material_drity = false;
155+
}
156+
RS::get_singleton()->mesh_rasterizer_set_bg_color(mesh_rasterizer, bg_color);
157+
RS::get_singleton()->mesh_rasterizer_draw(mesh_rasterizer);
158+
rasterizer_dirty = false;
159+
update_queued = false;
160+
emit_changed();
161+
}
162+
163+
void RasterizedMeshTexture::queue_update_texture() {
164+
if (update_queued) {
165+
return;
166+
}
167+
callable_mp(this, &RasterizedMeshTexture::update_texture).call_deferred();
168+
update_queued = true;
169+
}
170+
171+
void RasterizedMeshTexture::_bind_methods() {
172+
ClassDB::bind_method(D_METHOD("set_width", "width"), &RasterizedMeshTexture::set_width);
173+
ClassDB::bind_method(D_METHOD("set_height", "height"), &RasterizedMeshTexture::set_height);
174+
ClassDB::bind_method(D_METHOD("set_mesh", "mesh"), &RasterizedMeshTexture::set_mesh);
175+
ClassDB::bind_method(D_METHOD("get_mesh"), &RasterizedMeshTexture::get_mesh);
176+
ClassDB::bind_method(D_METHOD("set_bg_color", "color"), &RasterizedMeshTexture::set_bg_color);
177+
ClassDB::bind_method(D_METHOD("get_bg_color"), &RasterizedMeshTexture::get_bg_color);
178+
ClassDB::bind_method(D_METHOD("set_material", "material"), &RasterizedMeshTexture::set_material);
179+
ClassDB::bind_method(D_METHOD("get_material"), &RasterizedMeshTexture::get_material);
180+
ClassDB::bind_method(D_METHOD("set_surface_index", "surface_index"), &RasterizedMeshTexture::set_surface_index);
181+
ClassDB::bind_method(D_METHOD("get_surface_index"), &RasterizedMeshTexture::get_surface_index);
182+
ClassDB::bind_method(D_METHOD("set_texture_format", "texture_format"), &RasterizedMeshTexture::set_texture_format);
183+
ClassDB::bind_method(D_METHOD("get_texture_format"), &RasterizedMeshTexture::get_texture_format);
184+
ClassDB::bind_method(D_METHOD("set_generate_mipmaps", "generate_mipmaps"), &RasterizedMeshTexture::set_generate_mipmaps);
185+
ClassDB::bind_method(D_METHOD("is_generating_mipmaps"), &RasterizedMeshTexture::is_generating_mipmaps);
186+
187+
ADD_PROPERTY(PropertyInfo(Variant::INT, "width", PROPERTY_HINT_RANGE, "1,2048,or_greater,suffix:px"), "set_width", "get_width");
188+
ADD_PROPERTY(PropertyInfo(Variant::INT, "height", PROPERTY_HINT_RANGE, "1,2048,or_greater,suffix:px"), "set_height", "get_height");
189+
ADD_PROPERTY(PropertyInfo(Variant::COLOR, "bg_color"), "set_bg_color", "get_bg_color");
190+
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "mesh", PROPERTY_HINT_RESOURCE_TYPE, "Mesh"), "set_mesh", "get_mesh");
191+
ADD_PROPERTY(PropertyInfo(Variant::INT, "surface_index", PROPERTY_HINT_RANGE, "0,10,1,or_greater"), "set_surface_index", "get_surface_index");
192+
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "material", PROPERTY_HINT_RESOURCE_TYPE, "ShaderMaterial"), "set_material", "get_material");
193+
ADD_PROPERTY(PropertyInfo(Variant::INT, "texture_format", PROPERTY_HINT_ENUM, "RGBA8,RGBA8_SRGB,RGBAH,RGBAF"), "set_texture_format", "get_texture_format");
194+
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "generate_mipmaps"), "set_generate_mipmaps", "is_generating_mipmaps");
195+
}

0 commit comments

Comments
 (0)