Skip to content

Commit 0458721

Browse files
register hardcoded spline to scene for science
1 parent a1882fa commit 0458721

File tree

7 files changed

+68
-1
lines changed

7 files changed

+68
-1
lines changed

CMakeLists.txt

+2-1
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,8 @@ target_link_libraries(audio Eigen3::Eigen alure2)
7575
target_include_directories(audio PUBLIC ${OPENAL_INCLUDE_DIR})
7676

7777
add_library(geometry SHARED src/geometry/geometry.cpp
78-
src/geometry/collision.cpp)
78+
src/geometry/collision.cpp
79+
src/geometry/spline.cpp)
7980
target_link_libraries(geometry Eigen3::Eigen)
8081
target_compile_options(geometry PRIVATE -Wall -Wextra -pedantic -Werror)
8182

include/ecs/components.h

+6
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <Eigen/Dense>
77

88
#include "geometry/geometry.h"
9+
#include "geometry/spline.h"
910
#include "rendering/model.h"
1011
#include "rendering/texture.h"
1112
#include "urdf/fighter_input.h"
@@ -105,3 +106,8 @@ struct HealthComponent
105106

106107
void take_damage(const float damage);
107108
};
109+
110+
struct SplineComponent
111+
{
112+
geometry::CubicBezierCurve curve;
113+
};

include/ecs/scene.h

+4
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,10 @@ class Scene
3737
entt::entity register_sound_effect(const std::string buffer_name,
3838
const Eigen::Vector3f,
3939
const Eigen::Quaternionf& orientation);
40+
entt::entity register_spline(const Eigen::Vector3f& c0,
41+
const Eigen::Vector3f& c1,
42+
const Eigen::Vector3f& c2,
43+
const Eigen::Vector3f& c3);
4044

4145
entt::registry registry;
4246
ecs::ResourceManager resource_manager; // Could be made shared_ptr to allow scenes to share

include/geometry/spline.h

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
#pragma once
2+
3+
#include <Eigen/Dense>
4+
#include <Eigen/Geometry>
5+
6+
namespace geometry
7+
{
8+
9+
class CubicBezierCurve
10+
{
11+
public:
12+
static constexpr int NUM_SAMPLES = 16;
13+
14+
CubicBezierCurve(const Eigen::Vector3f& c0,
15+
const Eigen::Vector3f& c1,
16+
const Eigen::Vector3f& c2,
17+
const Eigen::Vector3f& c3);
18+
19+
Eigen::Vector3f at(const float t) const;
20+
21+
Eigen::Vector3f project_to_closest_point(const Eigen::Vector3f& pos) const;
22+
const Eigen::Matrix<float, NUM_SAMPLES, 3>& get_sample_points() const;
23+
24+
Eigen::Matrix<float, 4, 3> C;
25+
26+
private:
27+
Eigen::Matrix<float, NUM_SAMPLES, 3> sample_points;
28+
};
29+
} // namespace geometry

src/ecs/scene.cpp

+13
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
#include "ecs/scene.h"
22
#include <iostream>
33

4+
#include "geometry/spline.h"
45
#include "resources/load_model.h"
56
#include "resources/load_texture.h"
67
#include "rendering/primitives.h"
@@ -145,4 +146,16 @@ entt::entity Scene::register_sound_effect(const std::string buffer_name,
145146
return entity;
146147
}
147148

149+
entt::entity Scene::register_spline(const Eigen::Vector3f& c0,
150+
const Eigen::Vector3f& c1,
151+
const Eigen::Vector3f& c2,
152+
const Eigen::Vector3f& c3)
153+
{
154+
auto entity = registry.create();
155+
156+
registry.emplace<SplineComponent>(entity, geometry::CubicBezierCurve(c0, c1, c2, c3));
157+
158+
return entity;
159+
}
160+
148161
} // namespace ecs

src/ecs/systems.cpp

+10
Original file line numberDiff line numberDiff line change
@@ -122,6 +122,16 @@ void render(const Scene& scene, const float t)
122122

123123
glDepthMask(true);
124124
glDisable(GL_BLEND);
125+
126+
const auto& shader_spline = resource_manager.get_shader("spline").get();
127+
shader_spline.use();
128+
shader_spline.setUniformMatrix4fv("camera", T_opengl_ros * camera_matrix);
129+
130+
for (const auto [entity, spline_component] : scene.registry.view<SplineComponent>().each())
131+
{
132+
shader_spline.setUniformMatrix3x4fv("C", spline_component.curve.C);
133+
glDrawArrays(GL_POINTS, 0, 1);
134+
}
125135
}
126136

127137
void integrate(Scene& scene, const float t, const float dt)

src/main.cpp

+4
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ int main(int argc, char* argv[])
88
auto context_manager = rendering::ContextManager("Main Window", 1200, 900);
99

1010
auto scene = ecs::SceneFactory::create_from_scenario("scenario");
11+
scene->register_spline(Eigen::Vector3f(0.0f, 0.0f, 0.0f),
12+
Eigen::Vector3f(50.0f, 0.0f, 0.0f),
13+
Eigen::Vector3f(50.0f, 50.0f, 0.0f),
14+
Eigen::Vector3f(100.0f, 50.0f, 0.0f));
1115

1216
float current_time = SDL_GetTicks() / 1000.0f;
1317
const float dt = 1.0f / 60.f;

0 commit comments

Comments
 (0)