diff --git a/modules/props/doc_classes/PropInstance.xml b/modules/props/doc_classes/PropInstance.xml index 630b85ac3..af5a6fb27 100644 --- a/modules/props/doc_classes/PropInstance.xml +++ b/modules/props/doc_classes/PropInstance.xml @@ -24,7 +24,7 @@ - + @@ -46,7 +46,7 @@ - + diff --git a/modules/props/prop_instance.cpp b/modules/props/prop_instance.cpp index 26244c483..6061814e1 100644 --- a/modules/props/prop_instance.cpp +++ b/modules/props/prop_instance.cpp @@ -342,11 +342,11 @@ void PropInstance::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::INT, "collision_mask", PROPERTY_HINT_LAYERS_3D_PHYSICS), "set_collision_mask", "get_collision_mask"); BIND_VMETHOD(MethodInfo("_prop_preprocess", - PropertyInfo(Variant::TRANSFORM, "tarnsform"), + PropertyInfo(Variant::TRANSFORM, "transform"), PropertyInfo(Variant::OBJECT, "prop_data", PROPERTY_HINT_RESOURCE_TYPE, "PropData"))); - ClassDB::bind_method(D_METHOD("prop_preprocess", "tarnsform", "prop"), &PropInstance::prop_preprocess); - ClassDB::bind_method(D_METHOD("_prop_preprocess", "tarnsform", "prop"), &PropInstance::_prop_preprocess); + ClassDB::bind_method(D_METHOD("prop_preprocess", "transform", "prop"), &PropInstance::prop_preprocess); + ClassDB::bind_method(D_METHOD("_prop_preprocess", "transform", "prop"), &PropInstance::_prop_preprocess); //--- BIND_VMETHOD(MethodInfo("_init_materials")); diff --git a/modules/props/prop_instance.h b/modules/props/prop_instance.h index cb74d7417..459896c90 100644 --- a/modules/props/prop_instance.h +++ b/modules/props/prop_instance.h @@ -69,8 +69,8 @@ public: virtual void _build(); virtual void _build_finished(); - void prop_preprocess(Transform tarnsform, const Ref &prop); - virtual void _prop_preprocess(Transform tarnsform, const Ref &prop); + void prop_preprocess(Transform transform, const Ref &prop); + virtual void _prop_preprocess(Transform transform, const Ref &prop); PropInstance(); ~PropInstance(); diff --git a/modules/props/prop_instance_merger.h b/modules/props/prop_instance_merger.h index 455a29df1..679594078 100644 --- a/modules/props/prop_instance_merger.h +++ b/modules/props/prop_instance_merger.h @@ -122,7 +122,7 @@ public: virtual void _build(); virtual void _build_finished(); - void _prop_preprocess(Transform tarnsform, const Ref &prop); + void _prop_preprocess(Transform transform, const Ref &prop); void collision_layer_changed(); void collision_mask_changed(); diff --git a/modules/props_2d/doc_classes/Prop2DInstance.xml b/modules/props_2d/doc_classes/Prop2DInstance.xml index 035bb7510..f3e6aa38d 100644 --- a/modules/props_2d/doc_classes/Prop2DInstance.xml +++ b/modules/props_2d/doc_classes/Prop2DInstance.xml @@ -24,7 +24,7 @@ - + @@ -46,7 +46,7 @@ - + diff --git a/modules/props_2d/prop_2d_instance.cpp b/modules/props_2d/prop_2d_instance.cpp index 8b4cb5937..069036e99 100644 --- a/modules/props_2d/prop_2d_instance.cpp +++ b/modules/props_2d/prop_2d_instance.cpp @@ -295,11 +295,11 @@ void Prop2DInstance::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::INT, "collision_mask", PROPERTY_HINT_LAYERS_3D_PHYSICS), "set_collision_mask", "get_collision_mask"); BIND_VMETHOD(MethodInfo("_prop_preprocess", - PropertyInfo(Variant::TRANSFORM, "tarnsform"), + PropertyInfo(Variant::TRANSFORM, "transform"), PropertyInfo(Variant::OBJECT, "prop_data", PROPERTY_HINT_RESOURCE_TYPE, "Prop2DData"))); - ClassDB::bind_method(D_METHOD("prop_preprocess", "tarnsform", "prop"), &Prop2DInstance::prop_preprocess); - ClassDB::bind_method(D_METHOD("_prop_preprocess", "tarnsform", "prop"), &Prop2DInstance::_prop_preprocess); + ClassDB::bind_method(D_METHOD("prop_preprocess", "transform", "prop"), &Prop2DInstance::prop_preprocess); + ClassDB::bind_method(D_METHOD("_prop_preprocess", "transform", "prop"), &Prop2DInstance::_prop_preprocess); //--- BIND_VMETHOD(MethodInfo("_init_materials")); diff --git a/modules/props_2d/prop_2d_instance.h b/modules/props_2d/prop_2d_instance.h index 9985c0318..a65527381 100644 --- a/modules/props_2d/prop_2d_instance.h +++ b/modules/props_2d/prop_2d_instance.h @@ -66,8 +66,8 @@ public: virtual void _build(); virtual void _build_finished(); - void prop_preprocess(Transform2D tarnsform, const Ref &prop); - virtual void _prop_preprocess(Transform2D tarnsform, const Ref &prop); + void prop_preprocess(Transform2D transform, const Ref &prop); + virtual void _prop_preprocess(Transform2D transform, const Ref &prop); Prop2DInstance(); ~Prop2DInstance(); diff --git a/modules/props_2d/prop_2d_instance_merger.h b/modules/props_2d/prop_2d_instance_merger.h index 6cab89da6..121712476 100644 --- a/modules/props_2d/prop_2d_instance_merger.h +++ b/modules/props_2d/prop_2d_instance_merger.h @@ -95,7 +95,7 @@ public: virtual void _build(); virtual void _build_finished(); - void _prop_preprocess(Transform2D tarnsform, const Ref &prop); + void _prop_preprocess(Transform2D transform, const Ref &prop); void collision_layer_changed(); void collision_mask_changed(); diff --git a/modules/terraman/world/jobs/terrain_prop_job.cpp b/modules/terraman/world/jobs/terrain_prop_job.cpp index ac2ed282a..001da7c35 100644 --- a/modules/terraman/world/jobs/terrain_prop_job.cpp +++ b/modules/terraman/world/jobs/terrain_prop_job.cpp @@ -143,7 +143,7 @@ void TerrainPropJob::phase_physics_process() { #ifdef MODULE_PROPS_ENABLED for (int i = 0; i < chunk->prop_get_count(); ++i) { Ref prop = chunk->prop_get(i); - Transform prop_transform = chunk->prop_get_tarnsform(i); + Transform prop_transform = chunk->prop_get_transform(i); Transform chunk_prop_local_tform = prop_transform; chunk_prop_local_tform.origin = chunk->to_local(chunk_prop_local_tform.origin); diff --git a/modules/terraman/world/terrain_chunk.cpp b/modules/terraman/world/terrain_chunk.cpp index 17e02dc81..c910c30c6 100644 --- a/modules/terraman/world/terrain_chunk.cpp +++ b/modules/terraman/world/terrain_chunk.cpp @@ -869,6 +869,97 @@ void TerrainChunk::voxel_structures_set(const Vector &structures) { } } +//Scenes + +void TerrainChunk::scene_add(const Ref &p_scene, const Transform &p_transform, const bool p_original) { + ERR_FAIL_COND(!p_scene.is_valid()); + + SceneDataStore s; + s.original = p_original; + s.transform = p_transform; + s.scene = p_scene; + + _scenes.push_back(s); +} + +Ref TerrainChunk::scene_get(int index) { + ERR_FAIL_INDEX_V(index, _scenes.size(), Ref()); + + return _scenes.get(index).scene; +} +void TerrainChunk::scene_set(const int index, const Ref &p_scene) { + ERR_FAIL_INDEX(index, _scenes.size()); + + _scenes.write[index].scene = p_scene; +} + +Transform TerrainChunk::scene_get_transform(const int index) { + ERR_FAIL_INDEX_V(index, _scenes.size(), Transform()); + + return _scenes.get(index).transform; +} +void TerrainChunk::scene_set_transform(const int index, const Transform &p_transform) { + ERR_FAIL_INDEX(index, _scenes.size()); + + _scenes.write[index].transform = p_transform; +} + +bool TerrainChunk::scene_get_is_original(const int index) { + ERR_FAIL_INDEX_V(index, _scenes.size(), false); + + return _scenes.get(index).original; +} +void TerrainChunk::scene_set_is_original(const int index, const bool p_original) { + ERR_FAIL_INDEX(index, _scenes.size()); + + _scenes.write[index].original = p_original; +} + +int TerrainChunk::scene_get_count() const { + return _scenes.size(); +} +void TerrainChunk::scene_remove(const int index) { + ERR_FAIL_INDEX(index, _scenes.size()); + + _scenes.remove(index); +} +void TerrainChunk::scenes_clear() { + _scenes.clear(); +} + +Array TerrainChunk::scenes_get() { + Array ret; + + for (int i = 0; i < _scenes.size(); i++) { + Array prop_data; + + prop_data.push_back(_scenes[i].original); + prop_data.push_back(_scenes[i].transform); + prop_data.push_back(_scenes[i].scene.get_ref_ptr()); + + ret.push_back(prop_data); + } + + return ret; +} +void TerrainChunk::scenes_set(const Array &p_scenes) { + props_clear(); + + for (int i = 0; i < p_scenes.size(); ++i) { + Array scene_data = p_scenes[i]; + + ERR_CONTINUE(scene_data.size() != 3); + + bool original = scene_data[0]; + Transform transform = scene_data[1]; + Ref scene = Ref(scene_data[2]); + + scene_add(scene, transform, original); + } +} + +//Meshing + void TerrainChunk::build() { ERR_FAIL_COND(!ObjectDB::instance_validate(get_voxel_world())); ERR_FAIL_COND(!get_voxel_world()->is_inside_tree()); @@ -956,12 +1047,12 @@ void TerrainChunk::clear_baked_lights() { } #ifdef MODULE_PROPS_ENABLED -void TerrainChunk::prop_add(const Transform &tarnsform, const Ref &prop, const bool p_original) { +void TerrainChunk::prop_add(const Transform &transform, const Ref &prop, const bool p_original) { ERR_FAIL_COND(!prop.is_valid()); PropDataStore s; s.original = p_original; - s.transform = tarnsform; + s.transform = transform; s.prop = prop; _props.push_back(s); @@ -978,12 +1069,12 @@ void TerrainChunk::prop_set(const int index, const Ref &p_prop) { _props.write[index].prop = p_prop; } -Transform TerrainChunk::prop_get_tarnsform(const int index) { +Transform TerrainChunk::prop_get_transform(const int index) { ERR_FAIL_INDEX_V(index, _props.size(), Transform()); return _props.get(index).transform; } -void TerrainChunk::prop_set_tarnsform(const int index, const Transform &p_transform) { +void TerrainChunk::prop_set_transform(const int index, const Transform &p_transform) { ERR_FAIL_INDEX(index, _props.size()); _props.write[index].transform = p_transform; @@ -1884,16 +1975,37 @@ void TerrainChunk::_bind_methods() { ClassDB::bind_method(D_METHOD("voxel_structures_set"), &TerrainChunk::voxel_structures_set); ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "voxel_structures", PROPERTY_HINT_NONE, "23/20:TerrainStructure", PROPERTY_USAGE_DEFAULT, "TerrainStructure"), "voxel_structures_set", "voxel_structures_get"); - //Meshes + //Scenes + + ClassDB::bind_method(D_METHOD("scene_add", "scene", "transform", "original"), &TerrainChunk::scene_add, DEFVAL(Transform()), DEFVAL(true)); + + ClassDB::bind_method(D_METHOD("scene_get", "index"), &TerrainChunk::scene_get); + ClassDB::bind_method(D_METHOD("scene_set", "index", "scene"), &TerrainChunk::scene_set); + + ClassDB::bind_method(D_METHOD("scene_get_transform", "index"), &TerrainChunk::scene_get_transform); + ClassDB::bind_method(D_METHOD("scene_set_transform", "index", "transform"), &TerrainChunk::scene_set_transform); + + ClassDB::bind_method(D_METHOD("scene_get_is_original", "index"), &TerrainChunk::scene_get_is_original); + ClassDB::bind_method(D_METHOD("scene_set_is_original", "index", "original"), &TerrainChunk::scene_set_is_original); + + ClassDB::bind_method(D_METHOD("scene_get_count"), &TerrainChunk::scene_get_count); + ClassDB::bind_method(D_METHOD("scene_remove", "index"), &TerrainChunk::scene_remove); + ClassDB::bind_method(D_METHOD("scenes_clear"), &TerrainChunk::scenes_clear); + + ClassDB::bind_method(D_METHOD("scenes_get"), &TerrainChunk::scenes_get); + ClassDB::bind_method(D_METHOD("scenes_set"), &TerrainChunk::scenes_set); + ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "scenes"), "scenes_set", "scenes_get"); + + //Props #ifdef MODULE_PROPS_ENABLED - ClassDB::bind_method(D_METHOD("prop_add", "prop", "original"), &TerrainChunk::prop_add, DEFVAL(true)); + ClassDB::bind_method(D_METHOD("prop_add", "transform", "prop", "original"), &TerrainChunk::prop_add, DEFVAL(true)); ClassDB::bind_method(D_METHOD("prop_get", "index"), &TerrainChunk::prop_get); ClassDB::bind_method(D_METHOD("prop_set", "index", "prop"), &TerrainChunk::prop_set); - ClassDB::bind_method(D_METHOD("prop_get_tarnsform", "index"), &TerrainChunk::prop_get_tarnsform); - ClassDB::bind_method(D_METHOD("prop_set_tarnsform", "index", "transform"), &TerrainChunk::prop_set_tarnsform); + ClassDB::bind_method(D_METHOD("prop_get_transform", "index"), &TerrainChunk::prop_get_transform); + ClassDB::bind_method(D_METHOD("prop_set_transform", "index", "transform"), &TerrainChunk::prop_set_transform); ClassDB::bind_method(D_METHOD("prop_get_is_original", "index"), &TerrainChunk::prop_get_is_original); ClassDB::bind_method(D_METHOD("prop_set_is_original", "index", "original"), &TerrainChunk::prop_set_is_original); @@ -1907,6 +2019,8 @@ void TerrainChunk::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "props"), "props_set", "props_get"); #endif + //Meshes + #ifdef MODULE_MESH_DATA_RESOURCE_ENABLED ClassDB::bind_method(D_METHOD("mesh_data_resource_addv", "local_data_pos", "mesh", "texture", "color", "apply_voxel_scale"), &TerrainChunk::mesh_data_resource_addv, DEFVAL(Ref()), DEFVAL(Color(1, 1, 1, 1)), DEFVAL(true)); ClassDB::bind_method(D_METHOD("mesh_data_resource_add", "local_transform", "mesh", "texture", "color", "apply_voxel_scale"), &TerrainChunk::mesh_data_resource_add, DEFVAL(Ref()), DEFVAL(Color(1, 1, 1, 1)), DEFVAL(true)); diff --git a/modules/terraman/world/terrain_chunk.h b/modules/terraman/world/terrain_chunk.h index 955541b93..da114dfe2 100644 --- a/modules/terraman/world/terrain_chunk.h +++ b/modules/terraman/world/terrain_chunk.h @@ -247,6 +247,25 @@ public: Vector voxel_structures_get(); void voxel_structures_set(const Vector &structures); + //Scenes + void scene_add(const Ref &p_scene, const Transform &p_transform = Transform(), const bool p_original = true); + + Ref scene_get(const int index); + void scene_set(const int index, const Ref &p_scene); + + Transform scene_get_transform(const int index); + void scene_set_transform(const int index, const Transform &p_transform); + + bool scene_get_is_original(const int index); + void scene_set_is_original(const int index, const bool p_original); + + int scene_get_count() const; + void scene_remove(const int index); + void scenes_clear(); + + Array scenes_get(); + void scenes_set(const Array &p_scenes); + //Meshing void build(); void build_immediate(); @@ -263,13 +282,13 @@ public: void clear_baked_lights(); #ifdef MODULE_PROPS_ENABLED - void prop_add(const Transform &tarnsform, const Ref &prop, const bool p_original = true); + void prop_add(const Transform &transform, const Ref &prop, const bool p_original = true); Ref prop_get(const int index); void prop_set(const int index, const Ref &p_prop); - Transform prop_get_tarnsform(const int index); - void prop_set_tarnsform(const int index, const Transform &p_transform); + Transform prop_get_transform(const int index); + void prop_set_transform(const int index, const Transform &p_transform); bool prop_get_is_original(const int index); void prop_set_is_original(const int index, const bool p_original); @@ -365,6 +384,12 @@ protected: virtual void _generation_physics_process(const float delta); protected: + struct SceneDataStore { + bool original; + Transform transform; + Ref scene; + }; + #ifdef MODULE_PROPS_ENABLED struct PropDataStore { bool original; @@ -456,6 +481,8 @@ protected: Vector> _voxel_structures; + Vector _scenes; + #ifdef MODULE_PROPS_ENABLED Vector _props; #endif diff --git a/modules/terraman_2d/world/terrain_2d_chunk.cpp b/modules/terraman_2d/world/terrain_2d_chunk.cpp index 06d9aea50..94dc373fb 100644 --- a/modules/terraman_2d/world/terrain_2d_chunk.cpp +++ b/modules/terraman_2d/world/terrain_2d_chunk.cpp @@ -753,11 +753,11 @@ void Terrain2DChunk::clear_baked_lights() { } #ifdef MODULE_PROPS_2D_ENABLED -void Terrain2DChunk::prop_add(const Transform2D &tarnsform, const Ref &prop) { +void Terrain2DChunk::prop_add(const Transform2D &transform, const Ref &prop) { ERR_FAIL_COND(!prop.is_valid()); Prop2DDataStore s; - s.transform = tarnsform; + s.transform = transform; s.prop = prop; _props.push_back(s); @@ -767,7 +767,7 @@ Ref Terrain2DChunk::prop_get(int index) { return _props.get(index).prop; } -Transform2D Terrain2DChunk::prop_get_tarnsform(const int index) { +Transform2D Terrain2DChunk::prop_get_transform(const int index) { ERR_FAIL_INDEX_V(index, _props.size(), Transform2D()); return _props.get(index).transform; diff --git a/modules/terraman_2d/world/terrain_2d_chunk.h b/modules/terraman_2d/world/terrain_2d_chunk.h index 9e2ead810..305db68ab 100644 --- a/modules/terraman_2d/world/terrain_2d_chunk.h +++ b/modules/terraman_2d/world/terrain_2d_chunk.h @@ -271,9 +271,9 @@ public: void clear_baked_lights(); #ifdef MODULE_PROPS_2D_ENABLED - void prop_add(const Transform2D &tarnsform, const Ref &prop); + void prop_add(const Transform2D &transform, const Ref &prop); Ref prop_get(const int index); - Transform2D prop_get_tarnsform(const int index); + Transform2D prop_get_transform(const int index); int prop_get_count() const; void prop_remove(const int index); void props_clear(); diff --git a/modules/voxelman/world/jobs/voxel_prop_job.cpp b/modules/voxelman/world/jobs/voxel_prop_job.cpp index 9219502db..bd982daf3 100644 --- a/modules/voxelman/world/jobs/voxel_prop_job.cpp +++ b/modules/voxelman/world/jobs/voxel_prop_job.cpp @@ -144,7 +144,7 @@ void VoxelPropJob::phase_physics_process() { #ifdef MODULE_PROPS_ENABLED for (int i = 0; i < chunk->prop_get_count(); ++i) { Ref prop = chunk->prop_get(i); - Transform prop_transform = chunk->prop_get_tarnsform(i); + Transform prop_transform = chunk->prop_get_transform(i); Transform chunk_prop_local_tform = prop_transform; chunk_prop_local_tform.origin = chunk->to_local(chunk_prop_local_tform.origin); diff --git a/modules/voxelman/world/voxel_chunk.cpp b/modules/voxelman/world/voxel_chunk.cpp index 0cd3880a6..46bcb91a8 100644 --- a/modules/voxelman/world/voxel_chunk.cpp +++ b/modules/voxelman/world/voxel_chunk.cpp @@ -714,11 +714,11 @@ void VoxelChunk::clear_baked_lights() { } #ifdef MODULE_PROPS_ENABLED -void VoxelChunk::prop_add(const Transform &tarnsform, const Ref &prop) { +void VoxelChunk::prop_add(const Transform &transform, const Ref &prop) { ERR_FAIL_COND(!prop.is_valid()); PropDataStore s; - s.transform = tarnsform; + s.transform = transform; s.prop = prop; _props.push_back(s); @@ -728,7 +728,7 @@ Ref VoxelChunk::prop_get(int index) { return _props.get(index).prop; } -Transform VoxelChunk::prop_get_tarnsform(const int index) { +Transform VoxelChunk::prop_get_transform(const int index) { ERR_FAIL_INDEX_V(index, _props.size(), Transform()); return _props.get(index).transform; diff --git a/modules/voxelman/world/voxel_chunk.h b/modules/voxelman/world/voxel_chunk.h index d029f9afb..a730bfca7 100644 --- a/modules/voxelman/world/voxel_chunk.h +++ b/modules/voxelman/world/voxel_chunk.h @@ -235,9 +235,9 @@ public: void clear_baked_lights(); #ifdef MODULE_PROPS_ENABLED - void prop_add(const Transform &tarnsform, const Ref &prop); + void prop_add(const Transform &transform, const Ref &prop); Ref prop_get(const int index); - Transform prop_get_tarnsform(const int index); + Transform prop_get_transform(const int index); int prop_get_count() const; void prop_remove(const int index); void props_clear(); diff --git a/modules/voxelman/world/voxel_world.cpp b/modules/voxelman/world/voxel_world.cpp index 288891afe..91ce28ce0 100644 --- a/modules/voxelman/world/voxel_world.cpp +++ b/modules/voxelman/world/voxel_world.cpp @@ -568,18 +568,18 @@ int VoxelWorld::generation_get_size() const { } #ifdef MODULE_PROPS_ENABLED -void VoxelWorld::prop_add(Transform tarnsform, const Ref &prop, const bool apply_voxel_scael) { +void VoxelWorld::prop_add(Transform transform, const Ref &prop, const bool apply_voxel_scael) { ERR_FAIL_COND(!prop.is_valid()); if (apply_voxel_scael) { - tarnsform = tarnsform.scaled(Vector3(get_voxel_scale(), get_voxel_scale(), get_voxel_scale())); + transform = transform.scaled(Vector3(get_voxel_scale(), get_voxel_scale(), get_voxel_scale())); } Vector3 wp; - wp = tarnsform.xform(wp); + wp = transform.xform(wp); Ref chunk = get_or_create_chunk_at_world_position(wp); - chunk->prop_add(tarnsform, prop); + chunk->prop_add(transform, prop); int count = prop->get_prop_count(); for (int i = 0; i < count; ++i) { @@ -589,7 +589,7 @@ void VoxelWorld::prop_add(Transform tarnsform, const Ref &prop, const continue; } - Transform t = tarnsform * entry->get_transform(); + Transform t = transform * entry->get_transform(); wp = t.xform(Vector3()); chunk = get_or_create_chunk_at_world_position(wp); diff --git a/modules/voxelman/world/voxel_world.h b/modules/voxelman/world/voxel_world.h index 3f76c86f0..34bb33c5d 100644 --- a/modules/voxelman/world/voxel_world.h +++ b/modules/voxelman/world/voxel_world.h @@ -173,7 +173,7 @@ public: int generation_get_size() const; #ifdef MODULE_PROPS_ENABLED - void prop_add(Transform tarnsform, const Ref &prop, const bool apply_voxel_scael = true); + void prop_add(Transform transform, const Ref &prop, const bool apply_voxel_scael = true); #endif //Lights