@@ -51,11 +51,6 @@ void Terrain3D::_initialize() {
51
51
}
52
52
53
53
// Connect signals
54
- // Region size changed, update material
55
- if (!_storage->is_connected (" region_size_changed" , callable_mp (_material.ptr (), &Terrain3DMaterial::_update_maps))) {
56
- LOG (DEBUG, " Connecting region_size_changed signal to _material->_update_regions()" );
57
- _storage->connect (" region_size_changed" , callable_mp (_material.ptr (), &Terrain3DMaterial::_update_maps));
58
- }
59
54
// Any region was changed, update region labels
60
55
if (!_storage->is_connected (" region_map_changed" , callable_mp (this , &Terrain3D::update_region_labels))) {
61
56
LOG (DEBUG, " Connecting _storage::region_map_changed signal to set_show_region_locations()" );
@@ -420,8 +415,7 @@ void Terrain3D::_update_collision() {
420
415
}
421
416
422
417
int time = Time::get_singleton ()->get_ticks_msec ();
423
- int region_size = _storage->get_region_size ();
424
- int shape_size = region_size + 1 ;
418
+ int shape_size = _region_size + 1 ;
425
419
float hole_const = NAN;
426
420
// DEPRECATED - Jolt v0.12 supports NAN. Remove check when it's old.
427
421
if (ProjectSettings::get_singleton ()->get_setting (" physics/3d/physics_engine" ) == " JoltPhysics3D" ) {
@@ -433,7 +427,7 @@ void Terrain3D::_update_collision() {
433
427
map_data.resize (shape_size * shape_size);
434
428
435
429
Vector2i region_loc = _storage->get_region_locations ()[i];
436
- Vector2i global_loc = region_loc * region_size ;
430
+ Vector2i global_loc = region_loc * _region_size ;
437
431
Vector3 global_pos = Vector3 (global_loc.x , 0 .f , global_loc.y );
438
432
439
433
Ref<Image> map, map_x, map_z, map_xz;
@@ -446,17 +440,17 @@ void Terrain3D::_update_collision() {
446
440
map = region->get_map (TYPE_HEIGHT);
447
441
cmap = region->get_map (TYPE_CONTROL);
448
442
449
- region = _storage->get_regionp (Vector3 (global_pos.x + region_size , 0 .f , global_pos.z ) * _mesh_vertex_spacing);
443
+ region = _storage->get_regionp (Vector3 (global_pos.x + _region_size , 0 .f , global_pos.z ) * _mesh_vertex_spacing);
450
444
if (region.is_valid ()) {
451
445
map_x = region->get_map (TYPE_HEIGHT);
452
446
cmap_x = region->get_map (TYPE_CONTROL);
453
447
}
454
- region = _storage->get_regionp (Vector3 (global_pos.x , 0 .f , global_pos.z + region_size ) * _mesh_vertex_spacing);
448
+ region = _storage->get_regionp (Vector3 (global_pos.x , 0 .f , global_pos.z + _region_size ) * _mesh_vertex_spacing);
455
449
if (region.is_valid ()) {
456
450
map_z = region->get_map (TYPE_HEIGHT);
457
451
cmap_z = region->get_map (TYPE_CONTROL);
458
452
}
459
- region = _storage->get_regionp (Vector3 (global_pos.x + region_size , 0 .f , global_pos.z + region_size ) * _mesh_vertex_spacing);
453
+ region = _storage->get_regionp (Vector3 (global_pos.x + _region_size , 0 .f , global_pos.z + _region_size ) * _mesh_vertex_spacing);
460
454
if (region.is_valid ()) {
461
455
map_xz = region->get_map (TYPE_HEIGHT);
462
456
cmap_xz = region->get_map (TYPE_CONTROL);
@@ -472,21 +466,21 @@ void Terrain3D::_update_collision() {
472
466
int index = shape_size - 1 - z + x * shape_size;
473
467
474
468
// Set heights on local map, or adjacent maps if on the last row/col
475
- if (x < region_size && z < region_size ) {
469
+ if (x < _region_size && z < _region_size ) {
476
470
map_data[index ] = (is_hole (cmap->get_pixel (x, z).r )) ? hole_const : map->get_pixel (x, z).r ;
477
- } else if (x == region_size && z < region_size ) {
471
+ } else if (x == _region_size && z < _region_size ) {
478
472
if (map_x.is_valid ()) {
479
473
map_data[index ] = (is_hole (cmap_x->get_pixel (0 , z).r )) ? hole_const : map_x->get_pixel (0 , z).r ;
480
474
} else {
481
475
map_data[index ] = 0 .0f ;
482
476
}
483
- } else if (z == region_size && x < region_size ) {
477
+ } else if (z == _region_size && x < _region_size ) {
484
478
if (map_z.is_valid ()) {
485
479
map_data[index ] = (is_hole (cmap_z->get_pixel (x, 0 ).r )) ? hole_const : map_z->get_pixel (x, 0 ).r ;
486
480
} else {
487
481
map_data[index ] = 0 .0f ;
488
482
}
489
- } else if (x == region_size && z == region_size ) {
483
+ } else if (x == _region_size && z == _region_size ) {
490
484
if (map_xz.is_valid ()) {
491
485
map_data[index ] = (is_hole (cmap_xz->get_pixel (0 , 0 ).r )) ? hole_const : map_xz->get_pixel (0 , 0 ).r ;
492
486
} else {
@@ -500,7 +494,7 @@ void Terrain3D::_update_collision() {
500
494
// Transform3D xform = Transform3D(Basis(), global_pos);
501
495
// Rotated shape Y=90 for -90 rotated array index
502
496
Transform3D xform = Transform3D (Basis (Vector3 (0 .f , 1 .f , 0 .f ), Math_PI * .5f ),
503
- global_pos + Vector3 (region_size , 0 .f , region_size ) * .5f );
497
+ global_pos + Vector3 (_region_size , 0 .f , _region_size ) * .5f );
504
498
xform.scale (Vector3 (_mesh_vertex_spacing, 1 .f , _mesh_vertex_spacing));
505
499
506
500
if (!_show_debug_collision) {
@@ -575,7 +569,7 @@ void Terrain3D::_generate_triangles(PackedVector3Array &p_vertices, PackedVector
575
569
int32_t step = 1 << CLAMP (p_lod, 0 , 8 );
576
570
577
571
if (!p_global_aabb.has_volume ()) {
578
- int32_t region_size = (int )_storage-> get_region_size () ;
572
+ int32_t region_size = (int32_t )_region_size ;
579
573
580
574
TypedArray<Vector2i> region_locations = _storage->get_region_locations ();
581
575
for (int r = 0 ; r < region_locations.size (); ++r) {
@@ -684,6 +678,22 @@ void Terrain3D::set_debug_level(const int p_level) {
684
678
debug_level = CLAMP (p_level, 0 , DEBUG_MAX);
685
679
}
686
680
681
+ void Terrain3D::set_region_size (const RegionSize p_size) {
682
+ LOG (INFO, p_size);
683
+ // ERR_FAIL_COND(p_size < SIZE_64);
684
+ // ERR_FAIL_COND(p_size > SIZE_2048);
685
+ ERR_FAIL_COND (p_size != SIZE_1024);
686
+ _region_size = p_size;
687
+ // Region size changed, update downstream
688
+ if (_storage) {
689
+ _storage->_region_size = _region_size;
690
+ _storage->_region_sizev = Vector2i (_region_size, _region_size);
691
+ }
692
+ if (_material.is_valid ()) {
693
+ _material->_update_maps ();
694
+ }
695
+ }
696
+
687
697
void Terrain3D::set_mesh_lods (const int p_count) {
688
698
if (_mesh_lods != p_count) {
689
699
_clear_meshes ();
@@ -1117,8 +1127,7 @@ void Terrain3D::update_region_labels() {
1117
1127
label->set_visibility_range_fade_mode (GeometryInstance3D::VISIBILITY_RANGE_FADE_SELF);
1118
1128
_label_nodes->add_child (label, true );
1119
1129
Vector2i loc = region_locations[i];
1120
- int region_size = _storage->get_region_size ();
1121
- Vector3 pos = Vector3 (real_t (loc.x ) + .5f , 0 .f , real_t (loc.y ) + .5f ) * region_size * _mesh_vertex_spacing;
1130
+ Vector3 pos = Vector3 (real_t (loc.x ) + .5f , 0 .f , real_t (loc.y ) + .5f ) * _region_size * _mesh_vertex_spacing;
1122
1131
label->set_position (pos);
1123
1132
}
1124
1133
}
@@ -1345,6 +1354,13 @@ void Terrain3D::_notification(const int p_what) {
1345
1354
}
1346
1355
1347
1356
void Terrain3D::_bind_methods () {
1357
+ // BIND_ENUM_CONSTANT(SIZE_64);
1358
+ // BIND_ENUM_CONSTANT(SIZE_128);
1359
+ // BIND_ENUM_CONSTANT(SIZE_256);
1360
+ // BIND_ENUM_CONSTANT(SIZE_512);
1361
+ BIND_ENUM_CONSTANT (SIZE_1024);
1362
+ // BIND_ENUM_CONSTANT(SIZE_2048);
1363
+
1348
1364
ClassDB::bind_method (D_METHOD (" get_version" ), &Terrain3D::get_version);
1349
1365
ClassDB::bind_method (D_METHOD (" set_debug_level" , " level" ), &Terrain3D::set_debug_level);
1350
1366
ClassDB::bind_method (D_METHOD (" get_debug_level" ), &Terrain3D::get_debug_level);
@@ -1357,6 +1373,9 @@ void Terrain3D::_bind_methods() {
1357
1373
ClassDB::bind_method (D_METHOD (" set_save_16_bit" , " enabled" ), &Terrain3D::set_save_16_bit);
1358
1374
ClassDB::bind_method (D_METHOD (" get_save_16_bit" ), &Terrain3D::get_save_16_bit);
1359
1375
1376
+ ClassDB::bind_method (D_METHOD (" set_region_size" , " size" ), &Terrain3D::set_region_size);
1377
+ ClassDB::bind_method (D_METHOD (" get_region_size" ), &Terrain3D::get_region_size);
1378
+
1360
1379
ClassDB::bind_method (D_METHOD (" set_mesh_lods" , " count" ), &Terrain3D::set_mesh_lods);
1361
1380
ClassDB::bind_method (D_METHOD (" get_mesh_lods" ), &Terrain3D::get_mesh_lods);
1362
1381
ClassDB::bind_method (D_METHOD (" set_mesh_size" , " size" ), &Terrain3D::set_mesh_size);
@@ -1402,8 +1421,12 @@ void Terrain3D::_bind_methods() {
1402
1421
ClassDB::bind_method (D_METHOD (" bake_mesh" , " lod" , " filter" ), &Terrain3D::bake_mesh);
1403
1422
ClassDB::bind_method (D_METHOD (" generate_nav_mesh_source_geometry" , " global_aabb" , " require_nav" ), &Terrain3D::generate_nav_mesh_source_geometry, DEFVAL (true ));
1404
1423
1424
+ int ro_flags = PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_READ_ONLY;
1425
+
1405
1426
ADD_PROPERTY (PropertyInfo (Variant::STRING, " version" , PROPERTY_HINT_NONE, " " , PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_READ_ONLY), " " , " get_version" );
1406
1427
ADD_PROPERTY (PropertyInfo (Variant::STRING, " storage_directory" , PROPERTY_HINT_DIR), " set_storage_directory" , " get_storage_directory" );
1428
+ // ADD_PROPERTY(PropertyInfo(Variant::INT, "region_size", PROPERTY_HINT_ENUM, "64:64, 128:128, 256:256, 512:512, 1024:1024, 2048:2048"), "set_region_size", "get_region_size");
1429
+ ADD_PROPERTY (PropertyInfo (Variant::INT, " region_size" , PROPERTY_HINT_ENUM, " 1024:1024" ), " set_region_size" , " get_region_size" );
1407
1430
ADD_PROPERTY (PropertyInfo (Variant::BOOL, " save_16_bit" , PROPERTY_HINT_NONE), " set_save_16_bit" , " get_save_16_bit" );
1408
1431
ADD_PROPERTY (PropertyInfo (Variant::OBJECT, " material" , PROPERTY_HINT_RESOURCE_TYPE, " Terrain3DMaterial" ), " set_material" , " get_material" );
1409
1432
ADD_PROPERTY (PropertyInfo (Variant::OBJECT, " assets" , PROPERTY_HINT_RESOURCE_TYPE, " Terrain3DAssets" ), " set_assets" , " get_assets" );
0 commit comments