diff --git a/src/terrain_3d_storage.cpp b/src/terrain_3d_storage.cpp index eb75e2a79..0ef0b8cba 100644 --- a/src/terrain_3d_storage.cpp +++ b/src/terrain_3d_storage.cpp @@ -904,6 +904,20 @@ Ref Terrain3DStorage::layered_to_image(MapType p_map_type) { return img; } +Vector3 Terrain3DStorage::get_normal(Vector3 p_global_position, Vector3 *p_tangent, Vector3 *p_binormal) { + float left = get_height(p_global_position + Vector3(-_region_size, 0, 0)); + float right = get_height(p_global_position + Vector3(_region_size, 0, 0)); + float back = get_height(p_global_position + Vector3(0, 0, -_region_size)); + float fore = get_height(p_global_position + Vector3(0, 0, _region_size)); + Vector3 horizontal = Vector3(2, right - left, 0); + Vector3 vertical = Vector3(0, back - fore, 2); + Vector3 normal = vertical.cross(horizontal).normalized(); + normal.z *= -1; + *p_tangent = normal.cross(Vector3(0, 0, 1)); + *p_binormal = normal.cross(*p_tangent); + return normal; +} + void Terrain3DStorage::print_audit_data() { LOG(INFO, "Dumping storage data"); LOG(INFO, "_modified: ", _modified); @@ -1016,6 +1030,7 @@ void Terrain3DStorage::_bind_methods() { ClassDB::bind_method(D_METHOD("import_images", "images", "global_position", "offset", "scale"), &Terrain3DStorage::import_images, DEFVAL(Vector3(0, 0, 0)), DEFVAL(0.0), DEFVAL(1.0)); ClassDB::bind_method(D_METHOD("export_image", "file_name", "map_type"), &Terrain3DStorage::export_image); ClassDB::bind_method(D_METHOD("layered_to_image", "map_type"), &Terrain3DStorage::layered_to_image); + ClassDB::bind_method(D_METHOD("get_normal", "global_position", "tangent", "binormal"), &Terrain3DStorage::get_normal); int ro_flags = PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_READ_ONLY; ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "version", PROPERTY_HINT_NONE, "", ro_flags), "set_version", "get_version"); diff --git a/src/terrain_3d_storage.h b/src/terrain_3d_storage.h index 85fab0309..da860694f 100644 --- a/src/terrain_3d_storage.h +++ b/src/terrain_3d_storage.h @@ -166,6 +166,9 @@ class Terrain3DStorage : public Resource { Error export_image(String p_file_name, MapType p_map_type = TYPE_HEIGHT); Ref layered_to_image(MapType p_map_type); + // Utility + Vector3 get_normal(Vector3 global_position, Vector3 *tangent, Vector3 *binormal); + // Testing void print_audit_data();