Skip to content

Commit a3d9165

Browse files
committed
Fix blocky mesh model didn't use materials directly in the mesh resource
1 parent 28e2e67 commit a3d9165

File tree

3 files changed

+22
-6
lines changed

3 files changed

+22
-6
lines changed

meshers/blocky/voxel_blocky_model.cpp

+13-4
Original file line numberDiff line numberDiff line change
@@ -186,6 +186,15 @@ Ref<Material> VoxelBlockyModel::get_material_override(int index) const {
186186
return _surface_params[index].material_override;
187187
}
188188

189+
bool VoxelBlockyModel::has_material_override() const {
190+
for (const SurfaceParams &sp : _surface_params) {
191+
if (sp.material_override.is_valid()) {
192+
return true;
193+
}
194+
}
195+
return false;
196+
}
197+
189198
void VoxelBlockyModel::set_mesh_collision_enabled(int surface_index, bool enabled) {
190199
// TODO Can't check for `_surface_count` instead, because there is no guarantee about the order in which Godot will
191200
// set properties when loading the resource. The mesh could be set later, so we can't know the number of surfaces.
@@ -265,12 +274,12 @@ void VoxelBlockyModel::bake(BakedData &baked_data, bool bake_tangents, MaterialI
265274
for (unsigned int surface_index = 0; surface_index < model.surface_count; ++surface_index) {
266275
if (surface_index < _surface_count) {
267276
const SurfaceParams &surface_params = _surface_params[surface_index];
268-
const Ref<Material> material = surface_params.material_override;
269-
270277
BakedData::Surface &surface = model.surfaces[surface_index];
271278

272-
const unsigned int material_index = materials.get_or_create_index(material);
273-
surface.material_id = material_index;
279+
if (surface_params.material_override.is_valid()) {
280+
const unsigned int material_index = materials.get_or_create_index(surface_params.material_override);
281+
surface.material_id = material_index;
282+
}
274283

275284
surface.collision_enabled = surface_params.collision_enabled;
276285
}

meshers/blocky/voxel_blocky_model.h

+1
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,7 @@ class VoxelBlockyModel : public Resource {
139139

140140
void set_material_override(int index, Ref<Material> material);
141141
Ref<Material> get_material_override(int index) const;
142+
bool has_material_override() const;
142143

143144
void set_mesh_collision_enabled(int surface_index, bool enabled);
144145
bool is_mesh_collision_enabled(int surface_index) const;

meshers/blocky/voxel_blocky_model_cube.cpp

+8-2
Original file line numberDiff line numberDiff line change
@@ -119,12 +119,16 @@ void bake_cube_geometry(
119119
const VoxelBlockyModelCube &config,
120120
VoxelBlockyModel::BakedData &baked_data,
121121
Vector2i p_atlas_size,
122+
VoxelBlockyModel::MaterialIndexer &material_indexer,
122123
bool bake_tangents
123124
) {
124125
const float height = config.get_height();
125126

126127
baked_data.model.surface_count = 1;
127128
VoxelBlockyModel::BakedData::Surface &surface = baked_data.model.surfaces[0];
129+
// The only way to specify matererials in this model is via "material overrides", since there is no base mesh.
130+
// Even if none are specified, we should at least index the "empty" material.
131+
surface.material_id = material_indexer.get_or_create_index(config.get_material_override(0));
128132

129133
for (unsigned int side = 0; side < Cube::SIDE_COUNT; ++side) {
130134
VoxelBlockyModel::BakedData::SideSurface &side_surface = surface.sides[side];
@@ -198,7 +202,7 @@ void bake_cube_geometry(
198202

199203
void VoxelBlockyModelCube::bake(BakedData &baked_data, bool bake_tangents, MaterialIndexer &materials) const {
200204
baked_data.clear();
201-
bake_cube_geometry(*this, baked_data, _atlas_size_in_tiles, bake_tangents);
205+
bake_cube_geometry(*this, baked_data, _atlas_size_in_tiles, materials, bake_tangents);
202206
VoxelBlockyModel::bake(baked_data, bake_tangents, materials);
203207
}
204208

@@ -211,7 +215,9 @@ Ref<Mesh> VoxelBlockyModelCube::get_preview_mesh() const {
211215

212216
VoxelBlockyModel::BakedData baked_data;
213217
baked_data.color = get_color();
214-
bake_cube_geometry(*this, baked_data, _atlas_size_in_tiles, bake_tangents);
218+
StdVector<Ref<Material>> materials;
219+
MaterialIndexer material_indexer{ materials };
220+
bake_cube_geometry(*this, baked_data, _atlas_size_in_tiles, material_indexer, bake_tangents);
215221

216222
Ref<Mesh> mesh = make_mesh_from_baked_data(baked_data, bake_tangents);
217223

0 commit comments

Comments
 (0)