Added material_override

This commit is contained in:
Marc Gilleron 2021-01-01 01:39:06 +00:00
parent 586b5bc0b8
commit 37a202a00b
4 changed files with 28 additions and 2 deletions

View File

@ -249,6 +249,14 @@ void VoxelInstancer::set_layer_max_height(int layer_index, float h) {
layer->max_height = h;
}
void VoxelInstancer::set_layer_material_override(int layer_index, Ref<Material> material) {
ERR_FAIL_INDEX(layer_index, _layers.size());
Layer *layer = _layers[layer_index];
ERR_FAIL_COND(layer == nullptr);
layer->material_override = material;
}
void VoxelInstancer::remove_layer(int layer_index) {
ERR_FAIL_INDEX(layer_index, _layers.size());
Layer *layer = _layers[layer_index];
@ -279,7 +287,6 @@ void VoxelInstancer::remove_layer(int layer_index) {
memdelete(layer);
}
// TODO Had block_index way out of bounds here. Still not fixed, could not find cause yet
void VoxelInstancer::remove_block(int block_index) {
#ifdef DEBUG_ENABLED
CRASH_COND(block_index < 0 || block_index >= _blocks.size());
@ -563,6 +570,7 @@ void VoxelInstancer::on_block_enter(Vector3i grid_position, int lod_index, Array
block->multimesh_instance.set_multimesh(multimesh);
block->multimesh_instance.set_world(world);
block->multimesh_instance.set_transform(block_transform);
block->multimesh_instance.set_material_override(layer->material_override);
block->layer_index = layer_index;
block->grid_position = grid_position;
const int block_index = _blocks.size();
@ -696,6 +704,8 @@ void VoxelInstancer::_bind_methods() {
ClassDB::bind_method(D_METHOD("add_layer", "lod_index"), &VoxelInstancer::add_layer);
ClassDB::bind_method(D_METHOD("set_layer_mesh", "layer_index", "mesh"), &VoxelInstancer::set_layer_mesh);
ClassDB::bind_method(D_METHOD("set_layer_mesh_material_override", "layer_index", "material"),
&VoxelInstancer::set_layer_material_override);
ClassDB::bind_method(D_METHOD("set_layer_density", "layer_index", "density"), &VoxelInstancer::set_layer_density);
ClassDB::bind_method(D_METHOD("set_layer_min_scale", "layer_index", "min_scale"),
&VoxelInstancer::set_layer_min_scale);

View File

@ -6,6 +6,7 @@
#include "../util/fixed_array.h"
#include <scene/3d/spatial.h>
//#include <scene/resources/material.h> // Included by node.h lol
#include <vector>
class VoxelGenerator;
@ -35,6 +36,7 @@ public:
int add_layer(int lod_index);
void set_layer_mesh(int layer_index, Ref<Mesh> mesh);
void set_layer_material_override(int layer_index, Ref<Material> material);
void set_layer_random_vertical_flip(int layer_index, bool flip_enabled);
void set_layer_density(int layer_index, float density);
void set_layer_min_scale(int layer_index, float min_scale);
@ -78,15 +80,18 @@ private:
float min_scale = 1.f;
float max_scale = 1.f;
float offset_along_normal = 0.f;
bool random_vertical_flip = false;
float min_surface_normal_y = -1.f;
float max_surface_normal_y = 1.f;
float min_height = std::numeric_limits<float>::min();
float max_height = std::numeric_limits<float>::max();
bool random_vertical_flip = false;
// TODO lods?
Ref<Mesh> mesh;
// It is preferred to have materials on the mesh already,
// but this is in case OBJ meshes are used, which often dont have a material of their own
Ref<Material> material_override;
// TODO Collision shapes
HashMap<Vector3i, int, Vector3iHasher> blocks;

View File

@ -69,3 +69,13 @@ void DirectMultiMeshInstance::set_visible(bool visible) {
VisualServer &vs = *VisualServer::get_singleton();
vs.instance_set_visible(_multimesh_instance, visible);
}
void DirectMultiMeshInstance::set_material_override(Ref<Material> material) {
ERR_FAIL_COND(!_multimesh_instance.is_valid());
VisualServer &vs = *VisualServer::get_singleton();
if (material.is_valid()) {
vs.instance_geometry_set_material_override(_multimesh_instance, material->get_rid());
} else {
vs.instance_geometry_set_material_override(_multimesh_instance, RID());
}
}

View File

@ -20,6 +20,7 @@ public:
Ref<MultiMesh> get_multimesh() const;
void set_transform(Transform world_transform);
void set_visible(bool visible);
void set_material_override(Ref<Material> material);
private:
RID _multimesh_instance;