GaitGeneration by Graph Search
読み取り中…
検索中…
一致する文字列を見つけられません
graphic_main_graph_viewer.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 <memory>
11
12#include "cassert_define.h"
13#include "camera_dragger.h"
14#include "dxlib_gui_camera.h"
17#include "dxlib_util.h"
19#include "keyboard.h"
20#include "map_renderer.h"
21#include "node_initializer.h"
22#include "world_grid_renderer.h"
23
24
25namespace designlab
26{
27
29 const std::shared_ptr<const GraphicDataBroker>& broker_ptr,
30 const std::shared_ptr<const IHexapodCoordinateConverter>& converter_ptr,
31 const std::shared_ptr<const IHexapodJointCalculator>& calculator_ptr,
32 const std::shared_ptr<const IHexapodPostureValidator>& checker_ptr,
33 const std::shared_ptr<const ApplicationSettingRecord>& setting_ptr) :
34 broker_ptr_(broker_ptr),
35 mouse_ptr_(std::make_shared<Mouse>()),
36 graph_({}),
37 gui_controller_ptr_(std::make_unique<GraphViewerGUIController>(&graph_, &display_node_index_, setting_ptr))
38{
39 assert(broker_ptr_ != nullptr);
40
41 // 適当なノードを生成して,描画クラスを初期化する.
42 NodeInitializer node_initializer{ Vector3{0.f, 0.f, 30.f}, EulerXYZ(), HexapodMove::kNone };
43 RobotStateNode init_node = node_initializer.InitNode();
44
45
46 const auto camera = std::make_shared<DxlibCamera>();
47
48 const auto camera_gui = std::make_shared<DxlibGuiCamera>(setting_ptr->window_size_x, setting_ptr->window_size_y, camera);
49 camera_gui->SetPos(10, setting_ptr->window_size_y - 10, kDxlibGuiAnchorLeftBottom, true);
50
51 const auto camera_dragger = std::make_shared<CameraDragger>(camera);
52
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, kDxlibGuiAnchorLeftTop, true);
55 camera_parameter_gui->SetVisible(false);
56
57 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);
58 node_display_gui->SetPos(setting_ptr->window_size_x - 10, 10, kDxlibGuiAnchorRightTop, true);
59
60 const auto [hexapod_renderer_, hexapod_node_setter] =
61 HexapodRendererBuilder::Build(converter_ptr, calculator_ptr, setting_ptr->gui_display_quality);
62
63 const auto map_renderer = std::make_shared<MapRenderer>();
64 map_renderer->SetMapState(broker_ptr->map_state.GetData());
65
66 const auto world_grid_renderer = std::make_shared<WorldGridRenderer>();
67
68
69 gui_updater_.Register(camera_dragger, DxlibGuiUpdater::kBottomPriority);
70 gui_updater_.Register(camera_parameter_gui, DxlibGuiUpdater::kTopPriority);
71 gui_updater_.Register(camera_gui, DxlibGuiUpdater::kTopPriority);
72 gui_updater_.Register(node_display_gui, DxlibGuiUpdater::kTopPriority);
73
74 gui_updater_.OpenTerminal();
75
76 renderer_group_.Register(hexapod_renderer_);
77 renderer_group_.Register(map_renderer);
78 renderer_group_.Register(world_grid_renderer);
79
80 node_setter_group_.Register(camera_gui);
81 node_setter_group_.Register(node_display_gui);
82 node_setter_group_.Register(hexapod_node_setter);
83 node_setter_group_.Register(map_renderer);
84}
85
86
88{
89 mouse_ptr_->Update();
90
91 gui_controller_ptr_->Update();
92
93 if (graph_update_count_ != broker_ptr_->graph.GetUpdateCount())
94 {
95 graph_.clear(); // グラフを初期化する.
96
97 graph_ = broker_ptr_->graph.GetData(); // データを更新する.
98
99 // グラフの中身が空でないならば,表示するノードを初期化する.
100 if (!graph_.empty())
101 {
102 display_node_index_ = 0;
103 }
104
105 gui_controller_ptr_->UpdateGraphNodeDepthData();
106
107 graph_update_count_ = broker_ptr_->graph.GetUpdateCount();
108 }
109
110 if (display_node_index_ < graph_.size() && graph_.size() != 0)
111 {
112 node_setter_group_.SetNode(graph_.at(display_node_index_));
113 }
114
115 gui_updater_.Activate(mouse_ptr_);
116
117 return true;
118}
119
120
122{
123 renderer_group_.Draw();
124
125 gui_controller_ptr_->Draw();
126
127 gui_updater_.Draw();
128}
129
130} // namespace designlab
void Draw() const
登録されているクラスの draw 関数を呼ぶ. また,Zソートを行う.
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)
登録済みの全てのクラスに対してノードの設定を行う.
GraphicMainGraphViewer(const std::shared_ptr< const GraphicDataBroker > &broker_ptr, const std::shared_ptr< const IHexapodCoordinateConverter > &converter_ptr, const std::shared_ptr< const IHexapodJointCalculator > &calculator_ptr, const std::shared_ptr< const IHexapodPostureValidator > &checker_ptr, const std::shared_ptr< const ApplicationSettingRecord > &setting_ptr)
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()と呼び出す.
Dxlibでマウス入力を取得するクラス.
Definition mouse.h:21
ノードの初期化を行うクラス. シミュレーション時にノードの初期値を設定するために使用する.
constexpr unsigned int kDxlibGuiAnchorLeftBottom
constexpr unsigned int kDxlibGuiAnchorRightTop
@ kNone
何も動作をしない.
constexpr unsigned int kDxlibGuiAnchorLeftTop
Definition com_type.h:24
3次元の位置ベクトルを表す構造体.