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)
現在の脚状態から重心パターンを取得する.