Skip to content

Commit

Permalink
Terrain3DStorage: Add get_normal() utility function
Browse files Browse the repository at this point in the history
  • Loading branch information
lw64 committed Nov 13, 2023
1 parent 5dfaa13 commit 350427b
Showing 2 changed files with 18 additions and 0 deletions.
15 changes: 15 additions & 0 deletions src/terrain_3d_storage.cpp
Original file line number Diff line number Diff line change
@@ -904,6 +904,20 @@ Ref<Image> 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");
3 changes: 3 additions & 0 deletions src/terrain_3d_storage.h
Original file line number Diff line number Diff line change
@@ -166,6 +166,9 @@ class Terrain3DStorage : public Resource {
Error export_image(String p_file_name, MapType p_map_type = TYPE_HEIGHT);
Ref<Image> layered_to_image(MapType p_map_type);

// Utility
Vector3 get_normal(Vector3 global_position, Vector3 *tangent, Vector3 *binormal);

// Testing
void print_audit_data();

0 comments on commit 350427b

Please sign in to comment.