GaitGeneration by Graph Search
読み取り中…
検索中…
一致する文字列を見つけられません
graphic_main_basic.cpp
[詳解]
1
3
4// Copyright(c) 2023-2025 Design Engineering Laboratory, Saitama University
5// Released under the MIT license
6// https://opensource.org/licenses/mit-license.php
7
9
10#include <Dxlib.h>
11
12#include "camera_dragger.h"
13#include "dxlib_gui_camera.h"
16#include "dxlib_util.h"
18#include "keyboard.h"
19#include "map_renderer.h"
20#include "world_grid_renderer.h"
21
22
23namespace designlab
24{
25
27 const std::shared_ptr<const GraphicDataBroker>& broker_ptr,
28 const std::shared_ptr<const IHexapodCoordinateConverter>& converter_ptr,
29 const std::shared_ptr<const IHexapodJointCalculator>& calculator_ptr,
30 const std::shared_ptr<const IHexapodPostureValidator>& checker_ptr,
31 const std::shared_ptr<const ApplicationSettingRecord>& setting_ptr) :
32 kNodeGetCount(setting_ptr->window_fps * 2),
33 kInterpolatedAnimeCount(1),
34 broker_ptr_(broker_ptr),
35 mouse_ptr_(std::make_shared<Mouse>()),
36 display_node_switch_gui_(std::make_shared<DxlibGuiDisplayNodeSwitcher>(setting_ptr->window_size_x, setting_ptr->window_size_y)),
37 map_renderer_ptr_(std::make_shared<MapRenderer>()),
38 movement_locus_renderer_{},
39 interpolated_node_creator_{ converter_ptr },
40 robot_ground_point_renderer_{ converter_ptr },
41 map_state_(broker_ptr->map_state.GetData()),
42 graph_({})
43{
44 if (setting_ptr->gui_display_quality == DisplayQuality::kHigh)
45 {
46 movement_locus_renderer_.SetIsHighQuality(true);
47 }
48
49 const auto camera = std::make_shared<DxlibCamera>();
50 const auto camera_gui = std::make_shared<DxlibGuiCamera>(setting_ptr->window_size_x, setting_ptr->window_size_y, camera);
51 camera_gui->SetPos(10, 10, designlab::kDxlibGuiAnchorLeftTop, true);
52 display_node_switch_gui_->SetPos(10, setting_ptr->window_size_y - 10, designlab::kDxlibGuiAnchorLeftBottom, true);
53 const auto camera_parameter_gui = std::make_shared<DxlibGuiCameraParameterDisplayer>(setting_ptr->window_size_x, setting_ptr->window_size_y, camera);
54 camera_parameter_gui->SetPos(10, 10, designlab::kDxlibGuiAnchorLeftTop, true);
55 camera_parameter_gui->SetVisible(false);
56 const auto node_display_gui = std::make_shared<DxlibGuiNodeDisplayer>(setting_ptr->window_size_x, setting_ptr->window_size_y, converter_ptr, calculator_ptr, checker_ptr);
57 node_display_gui->SetPos(setting_ptr->window_size_x - 10, 10, designlab::kDxlibGuiAnchorRightTop, true);
58 const auto camera_dragger = std::make_shared<CameraDragger>(camera);
59
60 const auto [hexapod_renderer, hexapod_node_setter] =
61 HexapodRendererBuilder::Build(converter_ptr, calculator_ptr, setting_ptr->gui_display_quality);
62 const auto stability_margin_renderer = std::make_shared<StabilityMarginRenderer>(converter_ptr);
63 const auto world_grid_renderer = std::make_shared<WorldGridRenderer>();
64
65 gui_updater_.Register(display_node_switch_gui_, DxlibGuiUpdater::kTopPriority);
66 gui_updater_.Register(camera_parameter_gui, DxlibGuiUpdater::kTopPriority);
67 gui_updater_.Register(camera_gui, DxlibGuiUpdater::kTopPriority);
68 gui_updater_.Register(node_display_gui, DxlibGuiUpdater::kTopPriority);
69 gui_updater_.Register(camera_dragger, DxlibGuiUpdater::kBottomPriority);
70
71 gui_updater_.OpenTerminal();
72
73 render_group_.Register(map_renderer_ptr_);
74 render_group_.Register(hexapod_renderer);
75 // render_group_.Register(stability_margin_renderer);
76 render_group_.Register(world_grid_renderer);
77
78 node_setter_group_.Register(map_renderer_ptr_);
79 node_setter_group_.Register(camera_gui);
80 node_setter_group_.Register(hexapod_node_setter);
81 node_setter_group_.Register(node_display_gui);
82 node_setter_group_.Register(stability_margin_renderer);
83}
84
86{
87 mouse_ptr_->Update();
88
89 if (map_update_count != broker_ptr_->map_state.GetUpdateCount())
90 {
91 map_update_count = broker_ptr_->map_state.GetUpdateCount();
92 map_state_ = broker_ptr_->map_state.GetData();
93
94 map_renderer_ptr_->SetMapState(map_state_);
95 }
96
97
98 // ノードを読み出す時間になったら,仲介人からデータを読み出す.
99 if (counter_ % kNodeGetCount == 0 && graph_update_count != broker_ptr_->graph.GetUpdateCount())
100 {
101 // 仲介人からデータを読み出す.
102 graph_ = broker_ptr_->graph.GetData();
103
104 std::vector<size_t> simu_end_index;
105
106 simu_end_index = broker_ptr_->simulation_end_index.GetData();
107
108 // ノードの情報を表示するGUIに情報を伝達する.
109 display_node_switch_gui_->SetGraphData(graph_.size(), simu_end_index);
110
111
112 // 移動軌跡を更新する.
113 movement_locus_renderer_.SetMoveLocusPoint(graph_);
114
115 movement_locus_renderer_.SetSimulationEndIndexes(simu_end_index);
116
117
118 // ロボットの接地点を更新する.
119 robot_ground_point_renderer_.SetNodeAndSimulationEndNodeIndex(graph_, simu_end_index);
120
121
122 graph_update_count = broker_ptr_->graph.GetUpdateCount();
123 }
124
125
126 // ノードが存在しているのならば,各クラスに情報を伝達する
127 if (!graph_.empty())
128 {
129 // 表示ノードが更新されたら,表示するノードを変更する.
130 if (display_node_index_ != display_node_switch_gui_->GetDisplayNodeNum())
131 {
132 if (display_node_index_ > 0)
133 {
134 // 0番目のアニメーションを指定する.
135 interpolated_anime_start_count_ = 0;
136
137 interpolated_node_.clear();
138
139 interpolated_node_ = interpolated_node_creator_.CreateInterpolatedNode(
140 graph_[display_node_index_],
141 graph_[display_node_switch_gui_->GetDisplayNodeNum()]);
142 }
143
144 // 表示するノードを取得する.
145 display_node_index_ = display_node_switch_gui_->GetDisplayNodeNum();
146 display_node_switch_gui_->InAnimation(true);
147
148 // ノードの情報を設定するGUIに情報を伝達する.
149 node_setter_group_.SetNode(graph_.at(display_node_index_));
150 }
151
152 if (0 < interpolated_node_.size() &&
153 0 <= interpolated_anime_start_count_ &&
154 interpolated_anime_start_count_ < interpolated_node_.size())
155 {
156 // アニメーション中は interpolated_node_ の補完されたノードを表示する.
157 if (counter_ % kInterpolatedAnimeCount == 0)
158 {
159 interpolated_anime_start_count_ += display_node_switch_gui_->GetAnimeSpeed();
160 }
161
162 if (interpolated_anime_start_count_ < interpolated_node_.size())
163 {
164 node_setter_group_.SetNode(interpolated_node_[interpolated_anime_start_count_]);
165 }
166 }
167 else if (interpolated_node_.size() <= interpolated_anime_start_count_)
168 {
169 display_node_switch_gui_->InAnimation(false);
170 interpolated_anime_start_count_ = -1;
171 node_setter_group_.SetNode(graph_.at(display_node_index_));
172 }
173 }
174
175 ++counter_; // カウンタを進める.
176
177 gui_updater_.Activate(mouse_ptr_); // GUIをアクティブにする.
178
179 return true;
180}
181
182
184{
185 render_group_.Draw();
186
187 // 移動軌跡を描画する.
188 movement_locus_renderer_.Draw(display_node_switch_gui_->GetSimulationNum());
189
190 // robot_ground_point_renderer_.Draw(display_node_switch_gui_->GetSimulationNum());
191
192 // 2DのGUIの描画.
193 gui_updater_.Draw();
194}
195
196} // namespace designlab
void Draw() const
登録されているクラスの draw 関数を呼ぶ. また,Zソートを行う.
ノードの表示・切り替えを行うGUIのクラス.
static constexpr int kBottomPriority
最も優先度が低い.
void Draw() const
登録済みのGUIのDraw関数を実行する.
void Activate(const std::shared_ptr< const Mouse > &mouse_ptr)
GUIのUpdate関数を実行し,クリック,ドラッグなどの判定を行う. 優先度の高いものから順に各種判定を行う.
static constexpr int kTopPriority
最も優先的に処理される.
void SetNode(const RobotStateNode &node)
登録済みの全てのクラスに対してノードの設定を行う.
bool Update() override
描画画面の更新を行う.純粋仮想関数のため, 継承先では必ず override する必要がある.
void Draw() const override
描画を行う. ここでは描画系の処理のみを行い内部のデータを 更新しないため const を付けている.
static std::tuple< std::shared_ptr< IDxlib3dRenderer >, std::shared_ptr< IDxlibNodeSetter > > Build(const std::shared_ptr< const IHexapodCoordinateConverter > &converter_ptr, const std::shared_ptr< const IHexapodJointCalculator > &calculator_ptr, DisplayQuality display_quality)
HexapodRendererクラスのインスタンスを作成する. static関数なので,HexapodRendererBuilder::Build()と呼び出す.
std::vector< RobotStateNode > CreateInterpolatedNode(const RobotStateNode &node, const RobotStateNode &next_node) const
ノード間を補間する.
マップの描画を行うクラス.
Dxlibでマウス入力を取得するクラス.
Definition mouse.h:21
void SetMoveLocusPoint(const std::vector< RobotStateNode > &locus)
ロボットの移動軌跡を記録する.ノードの配列から,重心位置の軌跡を取得する.
void SetSimulationEndIndexes(const std::vector< size_t > &index)
シミュレーションの終了点を取得する.
void Draw(const size_t draw_simulation_num, bool draw_all_simulation=false) const
ロボットの移動軌跡を描画する.
void SetNodeAndSimulationEndNodeIndex(const std::vector< RobotStateNode > &result_node, const std::vector< size_t > &simulation_end_node_index)
constexpr unsigned int kDxlibGuiAnchorLeftBottom
constexpr unsigned int kDxlibGuiAnchorRightTop
constexpr unsigned int kDxlibGuiAnchorLeftTop
Definition com_type.h:24