Added material_override
This commit is contained in:
parent
586b5bc0b8
commit
37a202a00b
@ -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);
|
||||
|
@ -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;
|
||||
|
@ -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());
|
||||
}
|
||||
}
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user