12#include <magic_enum.hpp>
22 const std::vector<RobotStateNode>*
const p_graph,
23 size_t*
const p_display_node_index,
24 const std::shared_ptr<const ApplicationSettingRecord>& setting_ptr)
25 : graph_ptr_(p_graph),
26 display_node_index_ptr_(p_display_node_index),
27 setting_ptr_(setting_ptr) {}
32 ChangeDisplayNodeIndex();
39 DrawNodeControlPanel();
41 if (graph_ptr_->size() != 0 &&
42 *display_node_index_ptr_ < graph_ptr_->size()) {
47void GraphViewerGUIController::DrawGraphData()
const {
48 const int kBoxSizeX = 250;
49 const int kBoxSizeY = 200;
50 const int kBoxMinX = setting_ptr_->window_size_x - kBoxSizeX - 10;
51 const int kBoxMinY = setting_ptr_->window_size_y - kBoxSizeY - 10;
52 const unsigned int kBaseColor = GetColor(255, 255, 255);
55 SetDrawBlendMode(DX_BLENDMODE_ALPHA, 128);
56 DrawBox(kBoxMinX, kBoxMinY, kBoxMinX + kBoxSizeX, kBoxMinY + kBoxSizeY,
58 SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);
60 const unsigned int kTextColor = GetColor(10, 10, 10);
63 if (graph_ptr_->size() == 0) {
64 DrawString(kBoxMinX + 10, kBoxMinY + 10,
"ノード数 : 0", kTextColor);
65 DrawString(kBoxMinX + 10, kBoxMinY + 30,
"グラフを生成してください",
68 DrawFormatString(kBoxMinX + 10, kBoxMinY + 10, kTextColor,
"総ノード数:%d",
70 DrawFormatString(kBoxMinX + 10, kBoxMinY + 30, kTextColor,
71 "表示ノード:%d番", *display_node_index_ptr_);
74 for (
size_t i = 0; i < graph_node_depth_data_.size(); i++) {
75 DrawFormatString(kBoxMinX + 10, kBoxMinY + 50 + 20 *
static_cast<int>(i),
76 kTextColor,
" (深さ%dのノード:%d)",
static_cast<int>(i),
77 static_cast<int>(graph_node_depth_data_.at(i)));
82void GraphViewerGUIController::DrawNodeControlPanel()
const {
83 const int kBoxSizeX = 350;
84 const int kBoxSizeY = 250;
85 const int kBoxMinX = 10;
86 const int kBoxMinY = 10;
87 const unsigned int kBaseColor = GetColor(255, 255, 255);
90 SetDrawBlendMode(DX_BLENDMODE_ALPHA, 128);
91 DrawBox(kBoxMinX, kBoxMinY, kBoxMinX + kBoxSizeX, kBoxMinY + kBoxSizeY,
93 SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);
95 const unsigned int kTextColor = GetColor(10, 10, 10);
98 DrawFormatString(kBoxMinX + 10, kBoxMinY + 10, kTextColor,
101 if (input_number_ < 0) {
102 DrawFormatString(kBoxMinX + 10, kBoxMinY + 30, kTextColor,
105 DrawFormatString(kBoxMinX + 10, kBoxMinY + 30, kTextColor,
" %d",
109 if (graph_ptr_->size() > *display_node_index_ptr_) {
110 DrawFormatString(kBoxMinX + 10, kBoxMinY + 60, kTextColor,
111 "%d番ノードの親ノード:%d番", *display_node_index_ptr_,
112 graph_ptr_->at(*display_node_index_ptr_).parent_index);
114 DrawFormatString(kBoxMinX + 10, kBoxMinY + 90, kTextColor,
115 "%d番ノードの子ノード数:%d個", children_list_.first,
116 children_list_.second.size());
118 std::string str = children_list_.second.size() == 0 ?
"None" :
" ";
120 for (
size_t i = 0; i < children_list_.second.size(); i++) {
121 if (i > (
size_t)6 * 5 - 1) {
126 str += std::to_string(children_list_.second.at(i)) +
",";
128 if (i % 6 == 0 && i != 0) {
133 DrawFormatString(kBoxMinX + 10, kBoxMinY + 110, kTextColor,
134 "%d番ノードの子ノードリスト", children_list_.first);
135 DrawFormatString(kBoxMinX + 10, kBoxMinY + 130, kTextColor, str.c_str());
139void GraphViewerGUIController::DrawNodeData(
const RobotStateNode& node)
const {
143 const int kBoxSizeX = 400;
144 const int KBoxSizeY = 300;
145 const int kBoxMinX = setting_ptr_->window_size_x - 25 - kBoxSizeX;
146 const int kBoxMinY = 25;
147 const unsigned int kBoxColor = GetColor(255, 255, 255);
148 const unsigned int kBoxAlpha = 128;
151 SetDrawBlendMode(DX_BLENDMODE_ALPHA, kBoxAlpha);
153 DrawBox(kBoxMinX, kBoxMinY, kBoxMinX + kBoxSizeX, kBoxMinY + KBoxSizeY,
156 SetDrawBlendMode(DX_BLENDMODE_NOBLEND, 0);
159 const unsigned int kTextColor = GetColor(10, 10, 10);
160 const int kTextXPos = kBoxMinX + 10;
161 const int kTextYMinPos = kBoxMinY + 10;
162 const int kTextYInterval = 30;
166 DrawFormatString(kTextXPos, kTextYMinPos + kTextYInterval * (text_line++),
167 kTextColor,
"重心:%d,脚位置:%d,%d,%d,%d,%d,%d",
178 kTextXPos, kTextYMinPos + kTextYInterval * (text_line++), kTextColor,
179 "重心位置(x:%5.3f,y:%5.3f,z:%5.3f)", node.center_of_mass_global_coord.x,
180 node.center_of_mass_global_coord.y, node.center_of_mass_global_coord.z);
183 std::string str =
"";
192 DrawFormatString(kTextXPos, kTextYMinPos + kTextYInterval * (text_line++),
193 kTextColor,
"脚の状態:%s", str.c_str());
197 DrawFormatString(kTextXPos, kTextYMinPos + kTextYInterval * (text_line++),
198 kTextColor,
"%d番脚の位置(x:%5.3f,y:%5.3f,z:%5.3f)", i,
199 node.leg_pos[i].x, node.leg_pos[i].y, node.leg_pos[i].z);
204 kTextXPos, kTextYMinPos + kTextYInterval * (text_line++), kTextColor,
205 "深さ:%d, 次の動作 : %s", node.depth,
206 static_cast<std::string
>(magic_enum::enum_name(node.next_move)).c_str());
209void GraphViewerGUIController::InputNumber() {
217 int input_number = -1;
241 if (input_number >= 0) {
242 if (input_number_ < 0) {
243 input_number_ = input_number;
246 input_number_ += input_number;
251void GraphViewerGUIController::ChangeDisplayNodeIndex() {
252 if (graph_ptr_->size() == 0) {
257 (*display_node_index_ptr_)--;
259 (*display_node_index_ptr_)++;
261 (*display_node_index_ptr_) = input_number_;
264 if (graph_ptr_->size() > *display_node_index_ptr_) {
265 (*display_node_index_ptr_) =
266 graph_ptr_->at(*display_node_index_ptr_).parent_index;
269 !children_list_.second.empty()) {
270 display_children_list_index_--;
272 if (display_children_list_index_ < 0) {
273 display_children_list_index_ =
274 static_cast<int>(children_list_.second.size()) - 1;
277 display_children_list_index_ =
278 (display_children_list_index_ < 0) ? 0 : display_children_list_index_;
280 (*display_node_index_ptr_) =
281 children_list_.second.at(display_children_list_index_);
283 !children_list_.second.empty()) {
284 display_children_list_index_++;
286 if (display_children_list_index_ >= children_list_.second.size()) {
287 display_children_list_index_ = 0;
290 (*display_node_index_ptr_) =
291 children_list_.second.at(display_children_list_index_);
294 if (*display_node_index_ptr_ < 0) {
295 *display_node_index_ptr_ = graph_ptr_->size() - 1;
296 }
else if (*display_node_index_ptr_ >= graph_ptr_->size()) {
297 *display_node_index_ptr_ = 0;
301void GraphViewerGUIController::UpdateChildrenList() {
302 if (graph_ptr_->size() == 0) {
307 children_list_.first =
static_cast<int>(*display_node_index_ptr_);
308 children_list_.second.clear();
310 const size_t kGraphSize = graph_ptr_->size();
312 for (
size_t i = 0; i < kGraphSize; i++) {
313 if (graph_ptr_->at(i).parent_index == children_list_.first) {
314 children_list_.second.push_back(
static_cast<int>(i));
321 graph_node_depth_data_.clear();
322 constexpr size_t kMaxDepth = 5;
324 if (graph_ptr_->size() > 0) {
325 graph_node_depth_data_.resize(kMaxDepth + 1);
327 for (
size_t i = 0; i < graph_ptr_->size(); ++i) {
328 const auto index =
static_cast<size_t>(graph_ptr_->at(i).depth);
329 graph_node_depth_data_.at(index)++;
void UpdateGraphNodeDepthData()
GraphViewerGUIController(const std::vector< RobotStateNode > *const graph_ptr, size_t *const display_node_index_ptr, const std::shared_ptr< const ApplicationSettingRecord > &setting_ptr)
static constexpr int kLegNum
void Update()
キー入力を更新する. これを毎フレーム実行しないと,キー入力を取得できない.
int GetPressingCount(const int key_code) const
keyCodeのキーが押されているフレーム数を取得する.
bool IsGrounded(const LegStateBit &leg_state, const int leg_index)
脚番号 leg_index 0 ~ 5 に応じて,その脚が接地しているかを調べる. 脚は右前脚を0番として,時計回りに0,1,2,3,4,5となる.左前足が5番.
DiscreteLegPos GetDiscreteLegPos(const LegStateBit &leg_state, const int leg_index)
脚状態を取得する.
enums::DiscreteComPos GetDiscreteComPos(const LegStateBit &leg_state)
現在の脚状態から重心パターンを取得する.