Added shadow mode setting to VoxelInstanceLibraryItems

master
jacobcoughenour 2021-04-05 00:24:46 -04:00
parent ef5ec4b059
commit c0721a7404
5 changed files with 36 additions and 0 deletions

View File

@ -94,6 +94,18 @@ Ref<Material> VoxelInstanceLibraryItem::get_material_override() const {
return _material_override;
}
void VoxelInstanceLibraryItem::set_cast_shadows_setting(VisualServer::ShadowCastingSetting mode) {
if (mode == _shadow_casting_setting) {
return;
}
_shadow_casting_setting = mode;
notify_listeners(CHANGE_VISUAL);
}
VisualServer::ShadowCastingSetting VoxelInstanceLibraryItem::get_cast_shadows_setting() const {
return _shadow_casting_setting;
}
void VoxelInstanceLibraryItem::set_collision_layer(int collision_layer) {
_collision_layer = collision_layer;
}
@ -228,6 +240,10 @@ void VoxelInstanceLibraryItem::_bind_methods() {
&VoxelInstanceLibraryItem::set_material_override);
ClassDB::bind_method(D_METHOD("get_material_override"), &VoxelInstanceLibraryItem::get_material_override);
ClassDB::bind_method(D_METHOD("set_cast_shadows_setting", "mode"),
&VoxelInstanceLibraryItem::set_cast_shadows_setting);
ClassDB::bind_method(D_METHOD("get_cast_shadows_setting"), &VoxelInstanceLibraryItem::get_cast_shadows_setting);
ClassDB::bind_method(D_METHOD("set_collision_layer", "collision_layer"),
&VoxelInstanceLibraryItem::set_collision_layer);
ClassDB::bind_method(D_METHOD("get_collision_layer"), &VoxelInstanceLibraryItem::get_collision_layer);
@ -263,10 +279,17 @@ void VoxelInstanceLibraryItem::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "material_override", PROPERTY_HINT_RESOURCE_TYPE, "Material"),
"set_material_override", "get_material_override");
ADD_PROPERTY(PropertyInfo(Variant::INT, "cast_shadow", PROPERTY_HINT_ENUM, "Off,On,Double-Sided,Shadows Only"), "set_cast_shadows_setting", "get_cast_shadows_setting");
ADD_PROPERTY(PropertyInfo(Variant::INT, "collision_layer", PROPERTY_HINT_LAYERS_3D_PHYSICS),
"set_collision_layer", "get_collision_layer");
ADD_PROPERTY(PropertyInfo(Variant::INT, "collision_mask", PROPERTY_HINT_LAYERS_3D_PHYSICS),
"set_collision_mask", "get_collision_mask");
BIND_CONSTANT(MAX_MESH_LODS);
BIND_ENUM_CONSTANT(VisualServer::SHADOW_CASTING_SETTING_OFF);
BIND_ENUM_CONSTANT(VisualServer::SHADOW_CASTING_SETTING_ON);
BIND_ENUM_CONSTANT(VisualServer::SHADOW_CASTING_SETTING_DOUBLE_SIDED);
BIND_ENUM_CONSTANT(VisualServer::SHADOW_CASTING_SETTING_SHADOWS_ONLY);
}

View File

@ -51,6 +51,9 @@ public:
void set_material_override(Ref<Material> material);
Ref<Material> get_material_override() const;
void set_cast_shadows_setting(VisualServer::ShadowCastingSetting mode);
VisualServer::ShadowCastingSetting get_cast_shadows_setting() const;
void set_collision_layer(int collision_layer);
int get_collision_layer() const;
@ -111,6 +114,8 @@ private:
// but this is in case OBJ meshes are used, which often dont have a material of their own
Ref<Material> _material_override;
VisualServer::ShadowCastingSetting _shadow_casting_setting = VisualServer::SHADOW_CASTING_SETTING_ON;
int _collision_mask = 1;
int _collision_layer = 1;
Vector<CollisionShapeInfo> _collision_shapes;

View File

@ -714,6 +714,7 @@ void VoxelInstancer::update_block_from_transforms(int block_index, ArraySlice<co
block->multimesh_instance.set_world(world);
block->multimesh_instance.set_transform(block_transform);
block->multimesh_instance.set_material_override(item->get_material_override());
block->multimesh_instance.set_cast_shadows_setting(item->get_cast_shadows_setting());
}
// Update bodies

View File

@ -80,6 +80,12 @@ void DirectMultiMeshInstance::set_material_override(Ref<Material> material) {
}
}
void DirectMultiMeshInstance::set_cast_shadows_setting(VisualServer::ShadowCastingSetting mode) {
ERR_FAIL_COND(!_multimesh_instance.is_valid());
VisualServer &vs = *VisualServer::get_singleton();
vs.instance_geometry_set_cast_shadows_setting(_multimesh_instance, mode);
}
PoolRealArray DirectMultiMeshInstance::make_transform_3d_bulk_array(ArraySlice<const Transform> transforms) {
VOXEL_PROFILE_SCOPE();

View File

@ -23,6 +23,7 @@ public:
void set_transform(Transform world_transform);
void set_visible(bool visible);
void set_material_override(Ref<Material> material);
void set_cast_shadows_setting(VisualServer::ShadowCastingSetting mode);
static PoolRealArray make_transform_3d_bulk_array(ArraySlice<const Transform> transforms);