diff --git a/godot/GameObjects/player_camera.tscn b/godot/GameObjects/player_camera.tscn index b07202b..2f3e78a 100644 --- a/godot/GameObjects/player_camera.tscn +++ b/godot/GameObjects/player_camera.tscn @@ -1,9 +1,15 @@ -[gd_scene load_steps=2 format=3 uid="uid://bmm2quy62exfr"] +[gd_scene load_steps=3 format=3 uid="uid://bmm2quy62exfr"] [ext_resource type="PackedScene" uid="uid://btnlq0xajbfit" path="res://GameObjects/ground_goal_marker.tscn" id="1_t46fa"] +[sub_resource type="Curve" id="Curve_1gutb"] +max_value = 3.0 +_data = [Vector2(0, 3), 48.2693, -7.95486, 0, 0, Vector2(1, 0), 0.0, -0.0746434, 0, 0] +point_count = 2 + [node name="PlayerCamera" type="RTSPlayer"] ground_marker_scene = ExtResource("1_t46fa") +zoom_curve = SubResource("Curve_1gutb") [node name="Camera3D" type="Camera3D" parent="."] -transform = Transform3D(-1, 7.57104e-08, -4.37114e-08, 0, 0.5, 0.866025, 8.74228e-08, 0.866025, -0.5, 0, 10.1792, -3.46957) +transform = Transform3D(-1, 7.57104e-08, -4.37114e-08, 0, 0.5, 0.866025, 8.74228e-08, 0.866025, -0.5, 0, 12.3291, -7.13882) diff --git a/godot/Levels/test_level.tscn b/godot/Levels/test_level.tscn index 0eba452..88eea65 100644 --- a/godot/Levels/test_level.tscn +++ b/godot/Levels/test_level.tscn @@ -175,10 +175,10 @@ transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -9.70088, 2.69981, 0.976042) size = Vector3(52.4059, 6.08215, 28.8534) [node name="CSGBox3D" type="CSGBox3D" parent="WorldEnvironment/NavigationRegion3D/brushwork"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.0895901, 5.23133, -5.44301) +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 0.17791, 5.23133, -5.44301) operation = 2 use_collision = true -size = Vector3(19.7566, 10.5501, 8.86726) +size = Vector3(19.58, 10.5501, 8.86726) [node name="CSGBox3D4" type="CSGBox3D" parent="WorldEnvironment/NavigationRegion3D/brushwork"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 7.08391, 5.23133, -0.270959) @@ -187,10 +187,10 @@ use_collision = true size = Vector3(5.654, 10.5501, 2.34937) [node name="CSGBox3D6" type="CSGBox3D" parent="WorldEnvironment/NavigationRegion3D/brushwork"] -transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 7.08391, 5.23133, -0.270959) +transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, 6.79959, 5.23133, -0.270959) operation = 2 use_collision = true -size = Vector3(5.654, 10.5501, 2.34937) +size = Vector3(5.4255, 10.5501, 2.34937) [node name="CSGBox3D5" type="CSGBox3D" parent="WorldEnvironment/NavigationRegion3D/brushwork"] transform = Transform3D(1, 0, 0, 0, 1, 0, 0, 0, 1, -1.81458, 5.23133, -0.270959) diff --git a/src/rts_player.cpp b/src/rts_player.cpp index 5ec4d61..afbc2cd 100644 --- a/src/rts_player.cpp +++ b/src/rts_player.cpp @@ -3,6 +3,7 @@ #include "unit.hpp" #include "utils/godot_macros.hpp" #include "utils/util_functions.hpp" +#include #include #include #include @@ -14,6 +15,7 @@ void RTSPlayer::_bind_methods() { #define CLASSNAME RTSPlayer GDPROPERTY_HINTED(ground_marker_scene, gd::Variant::OBJECT, gd::PROPERTY_HINT_RESOURCE_TYPE, "PackedScene"); + GDPROPERTY_HINTED(zoom_curve, gd::Variant::OBJECT, gd::PROPERTY_HINT_RESOURCE_TYPE, "Curve"); } void RTSPlayer::_ready() { @@ -145,7 +147,9 @@ void RTSPlayer::select_unit(Unit *unit) { void RTSPlayer::set_zoom_level(float level) { this->current_zoom_level = gd::Math::clamp(level, this->min_zoom_level, this->max_zoom_level); - this->camera->set_position(this->local_zoom_direction * this->current_zoom_level); + float const zoom_factor{(this->current_zoom_level - this->min_zoom_level) / (this->max_zoom_level - this->min_zoom_level)}; + gd::Vector3 const outward{gd::Vector3{this->local_zoom_direction.x, 0.f, this->local_zoom_direction.z}.normalized() * this->zoom_curve->sample(zoom_factor)}; + this->camera->set_position((this->local_zoom_direction * this->current_zoom_level) + outward); gd::Vector3 const forward_vector{(this->camera->get_global_position() - this->get_global_position()).normalized()}; gd::Vector3 const left_vector{gd::Vector3{0.f, 1.f, 0.f}.cross(forward_vector)}; this->camera->set_global_basis({left_vector, forward_vector.cross(left_vector), forward_vector}); @@ -216,6 +220,14 @@ gd::Ref RTSPlayer::get_ground_marker_scene() const { return this->ground_marker_scene; } +void RTSPlayer::set_zoom_curve(gd::Ref curve) { + this->zoom_curve = curve; +} + +gd::Ref RTSPlayer::get_zoom_curve() const { + return this->zoom_curve; +} + #ifdef DEBUG_ENABLED void RTSPlayer::DEBUG_enable_debug(gd::Ref, float value) { if(value != 0) { diff --git a/src/rts_player.hpp b/src/rts_player.hpp index 7ba9823..4c699a0 100644 --- a/src/rts_player.hpp +++ b/src/rts_player.hpp @@ -5,10 +5,11 @@ #include "utils/player.hpp" #include "utils/player_input.hpp" #include +#include +#include #include #include #include -#include namespace gd = godot; @@ -58,6 +59,8 @@ private: gd::Vector3 get_left_direction() const; void set_ground_marker_scene(gd::Ref scene); gd::Ref get_ground_marker_scene() const; + void set_zoom_curve(gd::Ref curve); + gd::Ref get_zoom_curve() const; private: gd::Callable const on_selected_unit_destroyed{callable_mp(this, &RTSPlayer::clear_selected_unit)}; private: @@ -79,6 +82,7 @@ private: gd::Vector3 cursor_camera_normal{0.f, 0.f, 0.f}; gd::Camera3D *camera{nullptr}; gd::Ref ground_marker_scene{nullptr}; + gd::Ref zoom_curve{}; gd::Vector3 local_zoom_direction{0.f, 0.f, 0.f}; float current_zoom_level{1.f}; float max_zoom_level{1.f};