feat: camera zoom

This commit is contained in:
Sara 2024-09-09 20:23:00 +02:00
parent dc25687db2
commit 8fe3bf10a8
4 changed files with 30 additions and 8 deletions

View file

@ -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)

View file

@ -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)

View file

@ -3,6 +3,7 @@
#include "unit.hpp"
#include "utils/godot_macros.hpp"
#include "utils/util_functions.hpp"
#include <godot_cpp/classes/curve.hpp>
#include <godot_cpp/classes/packed_scene.hpp>
#include <godot_cpp/classes/physics_direct_space_state3d.hpp>
#include <godot_cpp/classes/physics_direct_space_state3d.hpp>
@ -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<gd::PackedScene> RTSPlayer::get_ground_marker_scene() const {
return this->ground_marker_scene;
}
void RTSPlayer::set_zoom_curve(gd::Ref<gd::Curve> curve) {
this->zoom_curve = curve;
}
gd::Ref<gd::Curve> RTSPlayer::get_zoom_curve() const {
return this->zoom_curve;
}
#ifdef DEBUG_ENABLED
void RTSPlayer::DEBUG_enable_debug(gd::Ref<gd::InputEvent>, float value) {
if(value != 0) {

View file

@ -5,10 +5,11 @@
#include "utils/player.hpp"
#include "utils/player_input.hpp"
#include <cstdint>
#include <godot_cpp/classes/camera3d.hpp>
#include <godot_cpp/classes/curve.hpp>
#include <godot_cpp/classes/input_event.hpp>
#include <godot_cpp/classes/node3d.hpp>
#include <godot_cpp/classes/packed_scene.hpp>
#include <godot_cpp/classes/camera3d.hpp>
namespace gd = godot;
@ -58,6 +59,8 @@ private:
gd::Vector3 get_left_direction() const;
void set_ground_marker_scene(gd::Ref<gd::PackedScene> scene);
gd::Ref<gd::PackedScene> get_ground_marker_scene() const;
void set_zoom_curve(gd::Ref<gd::Curve> curve);
gd::Ref<gd::Curve> 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<gd::PackedScene> ground_marker_scene{nullptr};
gd::Ref<gd::Curve> 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};