1 | /**************************************************************************/ |
2 | /* mesh.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 | #ifndef MESH_H |
32 | #define MESH_H |
33 | |
34 | #include "core/io/resource.h" |
35 | #include "core/math/face3.h" |
36 | #include "core/math/triangle_mesh.h" |
37 | #include "scene/resources/material.h" |
38 | #include "servers/rendering_server.h" |
39 | |
40 | class ConcavePolygonShape3D; |
41 | class ConvexPolygonShape3D; |
42 | class MeshConvexDecompositionSettings; |
43 | class Shape3D; |
44 | |
45 | class Mesh : public Resource { |
46 | GDCLASS(Mesh, Resource); |
47 | |
48 | mutable Ref<TriangleMesh> triangle_mesh; //cached |
49 | mutable Vector<Ref<TriangleMesh>> surface_triangle_meshes; //cached |
50 | mutable Vector<Vector3> debug_lines; |
51 | Size2i lightmap_size_hint; |
52 | |
53 | Vector<Vector3> _get_faces() const; |
54 | |
55 | public: |
56 | enum PrimitiveType { |
57 | PRIMITIVE_POINTS = RenderingServer::PRIMITIVE_POINTS, |
58 | PRIMITIVE_LINES = RenderingServer::PRIMITIVE_LINES, |
59 | PRIMITIVE_LINE_STRIP = RenderingServer::PRIMITIVE_LINE_STRIP, |
60 | PRIMITIVE_TRIANGLES = RenderingServer::PRIMITIVE_TRIANGLES, |
61 | PRIMITIVE_TRIANGLE_STRIP = RenderingServer::PRIMITIVE_TRIANGLE_STRIP, |
62 | PRIMITIVE_MAX = RenderingServer::PRIMITIVE_MAX, |
63 | }; |
64 | |
65 | protected: |
66 | static void _bind_methods(); |
67 | |
68 | GDVIRTUAL0RC(int, _get_surface_count) |
69 | GDVIRTUAL1RC(int, _surface_get_array_len, int) |
70 | GDVIRTUAL1RC(int, _surface_get_array_index_len, int) |
71 | GDVIRTUAL1RC(Array, _surface_get_arrays, int) |
72 | GDVIRTUAL1RC(TypedArray<Array>, _surface_get_blend_shape_arrays, int) |
73 | GDVIRTUAL1RC(Dictionary, _surface_get_lods, int) |
74 | GDVIRTUAL1RC(uint32_t, _surface_get_format, int) |
75 | GDVIRTUAL1RC(uint32_t, _surface_get_primitive_type, int) |
76 | GDVIRTUAL2(_surface_set_material, int, Ref<Material>) |
77 | GDVIRTUAL1RC(Ref<Material>, _surface_get_material, int) |
78 | GDVIRTUAL0RC(int, _get_blend_shape_count) |
79 | GDVIRTUAL1RC(StringName, _get_blend_shape_name, int) |
80 | GDVIRTUAL2(_set_blend_shape_name, int, StringName) |
81 | GDVIRTUAL0RC(AABB, _get_aabb) |
82 | |
83 | public: |
84 | enum { |
85 | NO_INDEX_ARRAY = RenderingServer::NO_INDEX_ARRAY, |
86 | ARRAY_WEIGHTS_SIZE = RenderingServer::ARRAY_WEIGHTS_SIZE |
87 | }; |
88 | enum BlendShapeMode { |
89 | BLEND_SHAPE_MODE_NORMALIZED = RS::BLEND_SHAPE_MODE_NORMALIZED, |
90 | BLEND_SHAPE_MODE_RELATIVE = RS::BLEND_SHAPE_MODE_RELATIVE, |
91 | }; |
92 | enum ArrayType { |
93 | ARRAY_VERTEX = RenderingServer::ARRAY_VERTEX, |
94 | ARRAY_NORMAL = RenderingServer::ARRAY_NORMAL, |
95 | ARRAY_TANGENT = RenderingServer::ARRAY_TANGENT, |
96 | ARRAY_COLOR = RenderingServer::ARRAY_COLOR, |
97 | ARRAY_TEX_UV = RenderingServer::ARRAY_TEX_UV, |
98 | ARRAY_TEX_UV2 = RenderingServer::ARRAY_TEX_UV2, |
99 | ARRAY_CUSTOM0 = RenderingServer::ARRAY_CUSTOM0, |
100 | ARRAY_CUSTOM1 = RenderingServer::ARRAY_CUSTOM1, |
101 | ARRAY_CUSTOM2 = RenderingServer::ARRAY_CUSTOM2, |
102 | ARRAY_CUSTOM3 = RenderingServer::ARRAY_CUSTOM3, |
103 | ARRAY_BONES = RenderingServer::ARRAY_BONES, |
104 | ARRAY_WEIGHTS = RenderingServer::ARRAY_WEIGHTS, |
105 | ARRAY_INDEX = RenderingServer::ARRAY_INDEX, |
106 | ARRAY_MAX = RenderingServer::ARRAY_MAX |
107 | |
108 | }; |
109 | |
110 | enum ArrayCustomFormat { |
111 | ARRAY_CUSTOM_RGBA8_UNORM, |
112 | ARRAY_CUSTOM_RGBA8_SNORM, |
113 | ARRAY_CUSTOM_RG_HALF, |
114 | ARRAY_CUSTOM_RGBA_HALF, |
115 | ARRAY_CUSTOM_R_FLOAT, |
116 | ARRAY_CUSTOM_RG_FLOAT, |
117 | ARRAY_CUSTOM_RGB_FLOAT, |
118 | ARRAY_CUSTOM_RGBA_FLOAT, |
119 | ARRAY_CUSTOM_MAX |
120 | }; |
121 | |
122 | enum ArrayFormat { |
123 | ARRAY_FORMAT_VERTEX = RS::ARRAY_FORMAT_VERTEX, |
124 | ARRAY_FORMAT_NORMAL = RS::ARRAY_FORMAT_NORMAL, |
125 | ARRAY_FORMAT_TANGENT = RS::ARRAY_FORMAT_TANGENT, |
126 | ARRAY_FORMAT_COLOR = RS::ARRAY_FORMAT_COLOR, |
127 | ARRAY_FORMAT_TEX_UV = RS::ARRAY_FORMAT_TEX_UV, |
128 | ARRAY_FORMAT_TEX_UV2 = RS::ARRAY_FORMAT_TEX_UV2, |
129 | ARRAY_FORMAT_CUSTOM0 = RS::ARRAY_FORMAT_CUSTOM0, |
130 | ARRAY_FORMAT_CUSTOM1 = RS::ARRAY_FORMAT_CUSTOM1, |
131 | ARRAY_FORMAT_CUSTOM2 = RS::ARRAY_FORMAT_CUSTOM2, |
132 | ARRAY_FORMAT_CUSTOM3 = RS::ARRAY_FORMAT_CUSTOM3, |
133 | ARRAY_FORMAT_BONES = RS::ARRAY_FORMAT_BONES, |
134 | ARRAY_FORMAT_WEIGHTS = RS::ARRAY_FORMAT_WEIGHTS, |
135 | ARRAY_FORMAT_INDEX = RS::ARRAY_FORMAT_INDEX, |
136 | |
137 | ARRAY_FORMAT_BLEND_SHAPE_MASK = RS::ARRAY_FORMAT_BLEND_SHAPE_MASK, |
138 | |
139 | ARRAY_FORMAT_CUSTOM_BASE = RS::ARRAY_FORMAT_CUSTOM_BASE, |
140 | ARRAY_FORMAT_CUSTOM_BITS = RS::ARRAY_FORMAT_CUSTOM_BITS, |
141 | ARRAY_FORMAT_CUSTOM0_SHIFT = RS::ARRAY_FORMAT_CUSTOM0_SHIFT, |
142 | ARRAY_FORMAT_CUSTOM1_SHIFT = RS::ARRAY_FORMAT_CUSTOM1_SHIFT, |
143 | ARRAY_FORMAT_CUSTOM2_SHIFT = RS::ARRAY_FORMAT_CUSTOM2_SHIFT, |
144 | ARRAY_FORMAT_CUSTOM3_SHIFT = RS::ARRAY_FORMAT_CUSTOM3_SHIFT, |
145 | |
146 | ARRAY_FORMAT_CUSTOM_MASK = RS::ARRAY_FORMAT_CUSTOM_MASK, |
147 | ARRAY_COMPRESS_FLAGS_BASE = RS::ARRAY_COMPRESS_FLAGS_BASE, |
148 | |
149 | ARRAY_FLAG_USE_2D_VERTICES = RS::ARRAY_FLAG_USE_2D_VERTICES, |
150 | ARRAY_FLAG_USE_DYNAMIC_UPDATE = RS::ARRAY_FLAG_USE_DYNAMIC_UPDATE, |
151 | ARRAY_FLAG_USE_8_BONE_WEIGHTS = RS::ARRAY_FLAG_USE_8_BONE_WEIGHTS, |
152 | |
153 | ARRAY_FLAG_USES_EMPTY_VERTEX_ARRAY = RS::ARRAY_FLAG_USES_EMPTY_VERTEX_ARRAY, |
154 | }; |
155 | |
156 | virtual int get_surface_count() const; |
157 | virtual int surface_get_array_len(int p_idx) const; |
158 | virtual int surface_get_array_index_len(int p_idx) const; |
159 | virtual Array surface_get_arrays(int p_surface) const; |
160 | virtual TypedArray<Array> surface_get_blend_shape_arrays(int p_surface) const; |
161 | virtual Dictionary surface_get_lods(int p_surface) const; |
162 | virtual BitField<ArrayFormat> surface_get_format(int p_idx) const; |
163 | virtual PrimitiveType surface_get_primitive_type(int p_idx) const; |
164 | virtual void surface_set_material(int p_idx, const Ref<Material> &p_material); |
165 | virtual Ref<Material> surface_get_material(int p_idx) const; |
166 | virtual int get_blend_shape_count() const; |
167 | virtual StringName get_blend_shape_name(int p_index) const; |
168 | virtual void set_blend_shape_name(int p_index, const StringName &p_name); |
169 | virtual AABB get_aabb() const; |
170 | |
171 | Vector<Face3> get_faces() const; |
172 | Vector<Face3> get_surface_faces(int p_surface) const; |
173 | Ref<TriangleMesh> generate_triangle_mesh() const; |
174 | Ref<TriangleMesh> generate_surface_triangle_mesh(int p_surface) const; |
175 | void generate_debug_mesh_lines(Vector<Vector3> &r_lines); |
176 | void generate_debug_mesh_indices(Vector<Vector3> &r_points); |
177 | |
178 | Ref<Mesh> create_outline(float p_margin) const; |
179 | |
180 | void set_lightmap_size_hint(const Size2i &p_size); |
181 | Size2i get_lightmap_size_hint() const; |
182 | void clear_cache() const; |
183 | |
184 | typedef Vector<Vector<Vector3>> (*ConvexDecompositionFunc)(const real_t *p_vertices, int p_vertex_count, const uint32_t *p_triangles, int p_triangle_count, const Ref<MeshConvexDecompositionSettings> &p_settings, Vector<Vector<uint32_t>> *r_convex_indices); |
185 | |
186 | static ConvexDecompositionFunc convex_decomposition_function; |
187 | |
188 | Vector<Ref<Shape3D>> convex_decompose(const Ref<MeshConvexDecompositionSettings> &p_settings) const; |
189 | Ref<ConvexPolygonShape3D> create_convex_shape(bool p_clean = true, bool p_simplify = false) const; |
190 | Ref<ConcavePolygonShape3D> create_trimesh_shape() const; |
191 | |
192 | virtual int get_builtin_bind_pose_count() const; |
193 | virtual Transform3D get_builtin_bind_pose(int p_index) const; |
194 | |
195 | virtual Ref<Resource> create_placeholder() const; |
196 | |
197 | Mesh(); |
198 | }; |
199 | |
200 | class MeshConvexDecompositionSettings : public RefCounted { |
201 | GDCLASS(MeshConvexDecompositionSettings, RefCounted); |
202 | |
203 | public: |
204 | enum Mode : int { |
205 | CONVEX_DECOMPOSITION_MODE_VOXEL = 0, |
206 | CONVEX_DECOMPOSITION_MODE_TETRAHEDRON = 1 |
207 | }; |
208 | |
209 | private: |
210 | Mode mode = CONVEX_DECOMPOSITION_MODE_VOXEL; |
211 | |
212 | /// Maximum concavity. [Range: 0.0 -> 1.0] |
213 | real_t max_concavity = 1.0; |
214 | /// Controls the bias toward clipping along symmetry planes. [Range: 0.0 -> 1.0] |
215 | real_t symmetry_planes_clipping_bias = 0.05; |
216 | /// Controls the bias toward clipping along revolution axes. [Range: 0.0 -> 1.0] |
217 | real_t revolution_axes_clipping_bias = 0.05; |
218 | real_t min_volume_per_convex_hull = 0.0001; |
219 | /// Maximum number of voxels generated during the voxelization stage. |
220 | uint32_t resolution = 10'000; |
221 | uint32_t max_num_vertices_per_convex_hull = 32; |
222 | /// Controls the granularity of the search for the "best" clipping plane. |
223 | /// [Range: 1 -> 16] |
224 | uint32_t plane_downsampling = 4; |
225 | /// Controls the precision of the convex-hull generation process during the |
226 | /// clipping plane selection stage. |
227 | /// [Range: 1 -> 16] |
228 | uint32_t convex_hull_downsampling = 4; |
229 | /// enable/disable normalizing the mesh before applying the convex decomposition. |
230 | bool normalize_mesh = false; |
231 | |
232 | bool convex_hull_approximation = true; |
233 | /// This is the maximum number of convex hulls to produce from the merge operation. |
234 | uint32_t max_convex_hulls = 1; |
235 | bool project_hull_vertices = true; |
236 | |
237 | protected: |
238 | static void _bind_methods(); |
239 | |
240 | public: |
241 | void set_max_concavity(real_t p_max_concavity); |
242 | real_t get_max_concavity() const; |
243 | |
244 | void set_symmetry_planes_clipping_bias(real_t p_symmetry_planes_clipping_bias); |
245 | real_t get_symmetry_planes_clipping_bias() const; |
246 | |
247 | void set_revolution_axes_clipping_bias(real_t p_revolution_axes_clipping_bias); |
248 | real_t get_revolution_axes_clipping_bias() const; |
249 | |
250 | void set_min_volume_per_convex_hull(real_t p_min_volume_per_convex_hull); |
251 | real_t get_min_volume_per_convex_hull() const; |
252 | |
253 | void set_resolution(uint32_t p_resolution); |
254 | uint32_t get_resolution() const; |
255 | |
256 | void set_max_num_vertices_per_convex_hull(uint32_t p_max_num_vertices_per_convex_hull); |
257 | uint32_t get_max_num_vertices_per_convex_hull() const; |
258 | |
259 | void set_plane_downsampling(uint32_t p_plane_downsampling); |
260 | uint32_t get_plane_downsampling() const; |
261 | |
262 | void set_convex_hull_downsampling(uint32_t p_convex_hull_downsampling); |
263 | uint32_t get_convex_hull_downsampling() const; |
264 | |
265 | void set_normalize_mesh(bool p_normalize_mesh); |
266 | bool get_normalize_mesh() const; |
267 | |
268 | void set_mode(Mode p_mode); |
269 | Mode get_mode() const; |
270 | |
271 | void set_convex_hull_approximation(bool p_convex_hull_approximation); |
272 | bool get_convex_hull_approximation() const; |
273 | |
274 | void set_max_convex_hulls(uint32_t p_max_convex_hulls); |
275 | uint32_t get_max_convex_hulls() const; |
276 | |
277 | void set_project_hull_vertices(bool p_project_hull_vertices); |
278 | bool get_project_hull_vertices() const; |
279 | }; |
280 | |
281 | VARIANT_ENUM_CAST(MeshConvexDecompositionSettings::Mode); |
282 | |
283 | class ArrayMesh : public Mesh { |
284 | GDCLASS(ArrayMesh, Mesh); |
285 | RES_BASE_EXTENSION("mesh" ); |
286 | |
287 | PackedStringArray _get_blend_shape_names() const; |
288 | void _set_blend_shape_names(const PackedStringArray &p_names); |
289 | |
290 | Array _get_surfaces() const; |
291 | void _set_surfaces(const Array &p_data); |
292 | Ref<ArrayMesh> shadow_mesh; |
293 | |
294 | private: |
295 | struct Surface { |
296 | uint32_t format = 0; |
297 | int array_length = 0; |
298 | int index_array_length = 0; |
299 | PrimitiveType primitive = PrimitiveType::PRIMITIVE_MAX; |
300 | |
301 | String name; |
302 | AABB aabb; |
303 | Ref<Material> material; |
304 | bool is_2d = false; |
305 | }; |
306 | Vector<Surface> surfaces; |
307 | mutable RID mesh; |
308 | AABB aabb; |
309 | BlendShapeMode blend_shape_mode = BLEND_SHAPE_MODE_RELATIVE; |
310 | Vector<StringName> blend_shapes; |
311 | AABB custom_aabb; |
312 | |
313 | _FORCE_INLINE_ void _create_if_empty() const; |
314 | void _recompute_aabb(); |
315 | |
316 | protected: |
317 | virtual bool _is_generated() const { return false; } |
318 | |
319 | bool _set(const StringName &p_name, const Variant &p_value); |
320 | bool _get(const StringName &p_name, Variant &r_ret) const; |
321 | void _get_property_list(List<PropertyInfo> *p_list) const; |
322 | bool surface_index_0 = false; |
323 | |
324 | virtual void reset_state() override; |
325 | |
326 | static void _bind_methods(); |
327 | |
328 | public: |
329 | void add_surface_from_arrays(PrimitiveType p_primitive, const Array &p_arrays, const TypedArray<Array> &p_blend_shapes = TypedArray<Array>(), const Dictionary &p_lods = Dictionary(), BitField<ArrayFormat> p_flags = 0); |
330 | |
331 | void add_surface(BitField<ArrayFormat> p_format, PrimitiveType p_primitive, const Vector<uint8_t> &p_array, const Vector<uint8_t> &p_attribute_array, const Vector<uint8_t> &p_skin_array, int p_vertex_count, const Vector<uint8_t> &p_index_array, int p_index_count, const AABB &p_aabb, const Vector<uint8_t> &p_blend_shape_data = Vector<uint8_t>(), const Vector<AABB> &p_bone_aabbs = Vector<AABB>(), const Vector<RS::SurfaceData::LOD> &p_lods = Vector<RS::SurfaceData::LOD>()); |
332 | |
333 | Array surface_get_arrays(int p_surface) const override; |
334 | TypedArray<Array> surface_get_blend_shape_arrays(int p_surface) const override; |
335 | Dictionary surface_get_lods(int p_surface) const override; |
336 | |
337 | void add_blend_shape(const StringName &p_name); |
338 | int get_blend_shape_count() const override; |
339 | StringName get_blend_shape_name(int p_index) const override; |
340 | void set_blend_shape_name(int p_index, const StringName &p_name) override; |
341 | void clear_blend_shapes(); |
342 | |
343 | void set_blend_shape_mode(BlendShapeMode p_mode); |
344 | BlendShapeMode get_blend_shape_mode() const; |
345 | |
346 | void surface_update_vertex_region(int p_surface, int p_offset, const Vector<uint8_t> &p_data); |
347 | void surface_update_attribute_region(int p_surface, int p_offset, const Vector<uint8_t> &p_data); |
348 | void surface_update_skin_region(int p_surface, int p_offset, const Vector<uint8_t> &p_data); |
349 | |
350 | int get_surface_count() const override; |
351 | |
352 | void clear_surfaces(); |
353 | |
354 | void surface_set_custom_aabb(int p_idx, const AABB &p_aabb); //only recognized by driver |
355 | |
356 | int surface_get_array_len(int p_idx) const override; |
357 | int surface_get_array_index_len(int p_idx) const override; |
358 | BitField<ArrayFormat> surface_get_format(int p_idx) const override; |
359 | PrimitiveType surface_get_primitive_type(int p_idx) const override; |
360 | |
361 | virtual void surface_set_material(int p_idx, const Ref<Material> &p_material) override; |
362 | virtual Ref<Material> surface_get_material(int p_idx) const override; |
363 | |
364 | int surface_find_by_name(const String &p_name) const; |
365 | void surface_set_name(int p_idx, const String &p_name); |
366 | String surface_get_name(int p_idx) const; |
367 | |
368 | void set_custom_aabb(const AABB &p_custom); |
369 | AABB get_custom_aabb() const; |
370 | |
371 | AABB get_aabb() const override; |
372 | virtual RID get_rid() const override; |
373 | |
374 | void regen_normal_maps(); |
375 | |
376 | Error lightmap_unwrap(const Transform3D &p_base_transform = Transform3D(), float p_texel_size = 0.05); |
377 | Error lightmap_unwrap_cached(const Transform3D &p_base_transform, float p_texel_size, const Vector<uint8_t> &p_src_cache, Vector<uint8_t> &r_dst_cache, bool p_generate_cache = true); |
378 | |
379 | virtual void reload_from_file() override; |
380 | |
381 | void set_shadow_mesh(const Ref<ArrayMesh> &p_mesh); |
382 | Ref<ArrayMesh> get_shadow_mesh() const; |
383 | |
384 | ArrayMesh(); |
385 | |
386 | ~ArrayMesh(); |
387 | }; |
388 | |
389 | VARIANT_ENUM_CAST(Mesh::ArrayType); |
390 | VARIANT_BITFIELD_CAST(Mesh::ArrayFormat); |
391 | VARIANT_ENUM_CAST(Mesh::ArrayCustomFormat); |
392 | VARIANT_ENUM_CAST(Mesh::PrimitiveType); |
393 | VARIANT_ENUM_CAST(Mesh::BlendShapeMode); |
394 | |
395 | class PlaceholderMesh : public Mesh { |
396 | GDCLASS(PlaceholderMesh, Mesh); |
397 | |
398 | RID rid; |
399 | AABB aabb; |
400 | |
401 | protected: |
402 | static void _bind_methods(); |
403 | |
404 | public: |
405 | virtual int get_surface_count() const override { return 0; } |
406 | virtual int surface_get_array_len(int p_idx) const override { return 0; } |
407 | virtual int surface_get_array_index_len(int p_idx) const override { return 0; } |
408 | virtual Array surface_get_arrays(int p_surface) const override { return Array(); } |
409 | virtual TypedArray<Array> surface_get_blend_shape_arrays(int p_surface) const override { return TypedArray<Array>(); } |
410 | virtual Dictionary surface_get_lods(int p_surface) const override { return Dictionary(); } |
411 | virtual BitField<ArrayFormat> surface_get_format(int p_idx) const override { return 0; } |
412 | virtual PrimitiveType surface_get_primitive_type(int p_idx) const override { return PRIMITIVE_TRIANGLES; } |
413 | virtual void surface_set_material(int p_idx, const Ref<Material> &p_material) override {} |
414 | virtual Ref<Material> surface_get_material(int p_idx) const override { return Ref<Material>(); } |
415 | virtual int get_blend_shape_count() const override { return 0; } |
416 | virtual StringName get_blend_shape_name(int p_index) const override { return StringName(); } |
417 | virtual void set_blend_shape_name(int p_index, const StringName &p_name) override {} |
418 | virtual RID get_rid() const override { return rid; } |
419 | virtual AABB get_aabb() const override { return aabb; } |
420 | void set_aabb(const AABB &p_aabb) { aabb = p_aabb; } |
421 | |
422 | virtual int get_builtin_bind_pose_count() const override { return 0; } |
423 | virtual Transform3D get_builtin_bind_pose(int p_index) const override { return Transform3D(); } |
424 | |
425 | PlaceholderMesh(); |
426 | ~PlaceholderMesh(); |
427 | }; |
428 | |
429 | #endif // MESH_H |
430 | |