GitHub PullRequestReviewCommentEvent at 2014-08-02 04:26:48
Repository: dolphin
Actor: lioncash
Payload: {"action":"created","comment":{"url":"https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/15727174","id":15727174,"diff_hunk":"@@ -0,0 +1,316 @@\n+// Copyright 2013 Dolphin Emulator Project\n+// Licensed under GPLv2\n+// Refer to the license.txt file included.\n+\n+#include <math.h>\n+#include <unordered_map>\n+\n+#include <wx/button.h>\n+#include <wx/notebook.h>\n+#include <wx/panel.h>\n+#include <wx/sizer.h>\n+#include <wx/slider.h>\n+#include <wx/stattext.h>\n+#include <wx/textctrl.h>\n+\n+#include \"Common/StringUtil.h\"\n+\n+#include \"DolphinWX/PostProcessingConfigDiag.h\"\n+\n+#include \"VideoCommon/RenderBase.h\"\n+\n+PostProcessingConfigDiag::PostProcessingConfigDiag(wxWindow* parent, const std::string& shader)\n+\t: wxDialog(parent, -1,\n+\t\twxString::Format(_(\"Post Processing Shader Configuration\"))),\n+\t  m_shader(shader)\n+{\n+\t// Depending on if we are running already, either use the one from the videobackend\n+\t// or generate our own.\n+\tif (g_renderer && g_renderer->GetPostProcessor())\n+\t{\n+\t\tm_post_processor = g_renderer->GetPostProcessor();\n+\t}\n+\telse\n+\t{\n+\t\tm_post_processor = new PostProcessingShaderConfiguration();\n+\t\tm_post_processor->LoadShader(m_shader);\n+\t}\n+\n+\t// Create our UI classes\n+\tconst PostProcessingShaderConfiguration::ConfigMap& config_map = m_post_processor->GetOptions();\n+\tfor (const auto& it : config_map)\n+\t{\n+\t\tif (it.second.m_type == PostProcessingShaderConfiguration::ConfigurationOption::OptionType::OPTION_BOOL)\n+\t\t{\n+\t\t\tConfigGrouping* group = new ConfigGrouping(ConfigGrouping::WidgetType::TYPE_TOGGLE,\n+\t\t\t\tit.second.m_gui_name, it.first, it.second.m_dependent_option,\n+\t\t\t\t&it.second);\n+\t\t\tm_config_map[it.first] = group;\n+\t\t}\n+\t\telse\n+\t\t{\n+\t\t\tConfigGrouping* group = new ConfigGrouping(ConfigGrouping::WidgetType::TYPE_SLIDER,\n+\t\t\t\tit.second.m_gui_name, it.first, it.second.m_dependent_option,\n+\t\t\t\t&it.second);\n+\t\t\tm_config_map[it.first] = group;\n+\t\t}\n+\t}\n+\n+\t// Arrange our vectors based on dependency\n+\tfor (const auto& it : m_config_map)\n+\t{\n+\t\tconst std::string parent_name = it.second->GetParent();\n+\t\tif (parent_name.size())\n+\t\t{\n+\t\t\t// Since it depends on a different object, push it to a parent's object\n+\t\t\tm_config_map[parent_name]->AddChild(m_config_map[it.first]);\n+\t\t}\n+\t\telse\n+\t\t{\n+\t\t\t// It doesn't have a child, just push it to the vector\n+\t\t\tm_config_groups.push_back(m_config_map[it.first]);\n+\t\t}\n+\t}\n+\n+\t// Generate our UI\n+\twxNotebook* const notebook = new wxNotebook(this, -1);\n+\twxPanel* const page_general = new wxPanel(notebook, -1);\n+\twxFlexGridSizer* const szr_general = new wxFlexGridSizer(2, 5, 5);\n+\n+\t// Now let's actually populate our window with our information\n+\tbool add_general_page = false;\n+\tfor (const auto& it : m_config_groups)\n+\t{\n+\t\tif (it->HasChildren())\n+\t\t{\n+\t\t\t// Options with children get their own tab\n+\t\t\twxPanel* const page_option = new wxPanel(notebook, -1);\n+\t\t\twxFlexGridSizer* const szr_option = new wxFlexGridSizer(2, 10, 5);\n+\t\t\tit->GenerateUI(this, page_option, szr_option);\n+\n+\t\t\t// Add all the children\n+\t\t\tfor (const auto& child : it->GetChildren())\n+\t\t\t{\n+\t\t\t\tchild->GenerateUI(this, page_option, szr_option);\n+\t\t\t}\n+\t\t\tpage_option->SetSizerAndFit(szr_option);\n+\t\t\tnotebook->AddPage(page_option, _(it->GetGUIName()));\n+\t\t}\n+\t\telse\n+\t\t{\n+\t\t\t// Options with no children go in to the general tab\n+\t\t\tif (!add_general_page)\n+\t\t\t{\n+\t\t\t\t// Make it so it doesn't show up if there aren't any options without children.\n+\t\t\t\tadd_general_page = true;\n+\t\t\t}\n+\t\t\tit->GenerateUI(this, page_general, szr_general);\n+\t\t}\n+\t}\n+\n+\tif (add_general_page)\n+\t{\n+\t\tpage_general->SetSizerAndFit(szr_general);\n+\t\tnotebook->InsertPage(0, page_general, _(\"General\"));\n+\t}\n+\n+\t// Close Button\n+\twxButton* const btn_close = new wxButton(this, wxID_OK, _(\"Close\"));\n+\tbtn_close->Bind(wxEVT_BUTTON, &PostProcessingConfigDiag::Event_ClickClose, this);\n+\n+\tBind(wxEVT_CLOSE_WINDOW, &PostProcessingConfigDiag::Event_Close, this);\n+\n+\twxBoxSizer* const szr_main = new wxBoxSizer(wxVERTICAL);\n+\tszr_main->Add(notebook, 1, wxEXPAND | wxALL, 5);\n+\tszr_main->Add(btn_close, 0, wxALIGN_RIGHT | wxRIGHT | wxBOTTOM, 5);\n+\n+\tSetSizerAndFit(szr_main);\n+\tCenter();\n+\tSetFocus();\n+\n+\tUpdateWindowUI();\n+}\n+\n+PostProcessingConfigDiag::~PostProcessingConfigDiag()\n+{\n+\tm_post_processor->SaveOptionsConfiguration();\n+\tif (g_renderer && g_renderer->GetPostProcessor())\n+\t\tm_post_processor = nullptr;\n+\telse\n+\t\tdelete m_post_processor;\n+}\n+\n+void PostProcessingConfigDiag::ConfigGrouping::GenerateUI(PostProcessingConfigDiag* dialog, wxWindow* parent, wxFlexGridSizer* sizer)\n+{\n+\tif (m_type == WidgetType::TYPE_TOGGLE)\n+\t{\n+\t\tm_option_checkbox = new wxCheckBox(parent, wxID_ANY, _(m_gui_name));\n+\t\tm_option_checkbox->SetValue(m_config_option->m_bool_value);\n+\t\tm_option_checkbox->Bind(wxEVT_CHECKBOX, &PostProcessingConfigDiag::Event_CheckBox,\n+\t\t                        dialog, wxID_ANY, wxID_ANY, new UserEventData(m_option));\n+\n+\t\tsizer->Add(m_option_checkbox);\n+\t\tsizer->AddStretchSpacer();\n+\t}\n+\telse\n+\t{\n+\t\tsize_t vector_size = 0;\n+\t\tif (m_config_option->m_type == PostProcessingShaderConfiguration::ConfigurationOption::OptionType::OPTION_INTEGER)\n+\t\t\tvector_size = m_config_option->m_integer_values.size();\n+\t\telse\n+\t\t\tvector_size = m_config_option->m_float_values.size();\n+\n+\t\twxFlexGridSizer* const szr_values = new wxFlexGridSizer(vector_size + 1, 0, 0);\n+\t\twxStaticText* const option_static_text = new wxStaticText(parent, wxID_ANY, _(m_gui_name));\n+\t\tsizer->Add(option_static_text);\n+\n+\t\tfor (size_t i = 0; i < vector_size; ++i)\n+\t\t{\n+\t\t\t// wxSlider uses a signed integer for it's minimum and maximum values\n+\t\t\t// This won't work for floats.\n+\t\t\t// Let's determine how many steps we can take and use that instead.\n+\t\t\tint steps = 0;\n+\t\t\tint current_value = 0;\n+\t\t\tstd::string string_value;\n+\t\t\tif (m_config_option->m_type == PostProcessingShaderConfiguration::ConfigurationOption::OptionType::OPTION_INTEGER)\n+\t\t\t{\n+\t\t\t\t// Find out our range by taking the max subtracting the minimum.\n+\t\t\t\tdouble range = m_config_option->m_integer_max_values[i] - m_config_option->m_integer_min_values[i];\n+\n+\t\t\t\t// How many steps we have is the range divided by the step interval configured.\n+\t\t\t\t// This may not be 100% spot on accurate since developers can have odd stepping intervals set.\n+\t\t\t\t// Round up so if it is outside our range, then set it to the minimum or maximum\n+\t\t\t\tsteps = ceil(range / (double)m_config_option->m_integer_step_values[i]);\n+\n+\t\t\t\t// Default value is just the currently set value here\n+\t\t\t\tcurrent_value = m_config_option->m_integer_values[i];\n+\t\t\t\tstring_value = StringFromFormat(\"%d\", m_config_option->m_integer_values[i]);\n+\t\t\t}\n+\t\t\telse\n+\t\t\t{\n+\t\t\t\t// Same as above but with floats\n+\t\t\t\tfloat range = m_config_option->m_float_max_values[i] - m_config_option->m_float_min_values[i];\n+\t\t\t\tsteps = ceil(range / m_config_option->m_float_step_values[i]);\n+\n+\t\t\t\t// We need to convert our default float value from a float to the nearest step value range\n+\t\t\t\tcurrent_value = (m_config_option->m_float_values[i] / m_config_option->m_float_step_values[i]);\n+\t\t\t\tstring_value = StringFromFormat(\"%f\", m_config_option->m_float_values[i]);\n+\t\t\t}\n+\n+\t\t\twxSlider* slider = new wxSlider(parent, wxID_ANY, current_value, 0, steps,\n+\t\t\t                                wxDefaultPosition, wxSize(200, -1), wxSL_HORIZONTAL | wxSL_BOTTOM);\n+\t\t\twxTextCtrl* text_ctrl = new wxTextCtrl(parent, wxID_ANY, string_value);\n+\n+\t\t\t// Disable the textctrl, it's only there to show the absolute value from the slider\n+\t\t\ttext_ctrl->Enable(false);\n+\n+\t\t\t// wxWidget takes over the pointer provided to it in the event handler.\n+\t\t\t// This won't be a memory leak, it'll be destroyed on dialog close.\n+\t\t\tslider->Bind(wxEVT_SLIDER, &PostProcessingConfigDiag::Event_Slider,\n+\t\t\t\t\t dialog, wxID_ANY, wxID_ANY, new UserEventData(m_option));\n+\n+\t\t\tm_option_sliders.push_back(slider);\n+\t\t\tm_option_text_ctrls.push_back(text_ctrl);\n+\t\t}\n+\n+\t\tif (vector_size == 1)\n+\t\t{\n+\t\t\tszr_values->Add(m_option_sliders[0], wxSizerFlags().Align(wxALIGN_CENTER_VERTICAL));\n+\t\t\tszr_values->Add(m_option_text_ctrls[0]);\n+\n+\t\t\tsizer->Add(szr_values);\n+\t\t}\n+\t\telse\n+\t\t{\n+\t\t\twxFlexGridSizer* const szr_inside = new wxFlexGridSizer(2, 0, 0);\n+\t\t\tfor (size_t i = 0; i < vector_size; ++i)\n+\t\t\t{\n+\t\t\t\tszr_inside->Add(m_option_sliders[i], wxSizerFlags().Align(wxALIGN_CENTER_VERTICAL));\n+\t\t\t\tszr_inside->Add(m_option_text_ctrls[i]);\n+\t\t\t}\n+\n+\t\t\tszr_values->Add(szr_inside);\n+\t\t\tsizer->Add(szr_values);\n+\t\t}\n+\t}\n+}\n+\n+void PostProcessingConfigDiag::ConfigGrouping::EnableDependentChildren(bool enable)\n+{\n+\t// Enable or disable all the children\n+\tfor (auto& it : m_children)\n+\t{\n+\t\tif (it->m_type == ConfigGrouping::WidgetType::TYPE_TOGGLE)\n+\t\t{\n+\t\t\tit->m_option_checkbox->Enable(enable);\n+\t\t}\n+\t\telse\n+\t\t{\n+\t\t\tfor (auto& slider : it->m_option_sliders)\n+\t\t\t\tslider->Enable(enable);\n+\t\t}\n+\t\t// Set this objects children as well\n+\t\tit->EnableDependentChildren(enable);\n+\t}\n+}\n+\n+void PostProcessingConfigDiag::Event_CheckBox(wxCommandEvent &ev)\n+{\n+\tUserEventData* config_option = (UserEventData*)ev.GetEventUserData();\n+\tConfigGrouping* config = m_config_map[config_option->GetData()];\n+\n+\tm_post_processor->SetOptionb(config->GetOption(), ev.IsChecked());\n+\n+\tconfig->EnableDependentChildren(ev.IsChecked());\n+\n+\tev.Skip();\n+}\n+\n+void PostProcessingConfigDiag::Event_Slider(wxCommandEvent &ev)\n+{\n+\tUserEventData* config_option = (UserEventData*)ev.GetEventUserData();\n+\tConfigGrouping* config = m_config_map[config_option->GetData()];\n+\n+\tconst auto& option_data = m_post_processor->GetOption(config->GetOption());\n+\n+\tsize_t vector_size = 0;\n+\tif (option_data.m_type == PostProcessingShaderConfiguration::ConfigurationOption::OptionType::OPTION_INTEGER)\n+\t\tvector_size = option_data.m_integer_values.size();\n+\telse\n+\t\tvector_size = option_data.m_float_values.size();\n+\n+\tfor (size_t i = 0; i < vector_size; ++i)\n+\t{\n+\t\t// Got to do this garbage again.\n+\t\t// Convert current step in to the real range value\n+\t\tint current_step = config->GetSliderValue(i);\n+\t\tstd::string string_value;\n+\t\tif (option_data.m_type == PostProcessingShaderConfiguration::ConfigurationOption::OptionType::OPTION_INTEGER)\n+\t\t{\n+\t\t\ts32 value = option_data.m_integer_step_values[i] * current_step + option_data.m_integer_min_values[i];\n+\t\t\tm_post_processor->SetOptioni(config->GetOption(), i, value);\n+\t\t\tstring_value = StringFromFormat(\"%d\", value);\n+\n+\t\t}\n+\t\telse\n+\t\t{\n+\t\t\tfloat value = option_data.m_float_step_values[i] * current_step + option_data.m_float_min_values[i];\n+\t\t\tm_post_processor->SetOptionf(config->GetOption(), i, value);\n+\t\t\tstring_value = StringFromFormat(\"%f\", value);","path":"Source/Core/DolphinWX/PostProcessingConfigDiag.cpp","position":299,"original_position":299,"commit_id":"78191e8d4786eb0179828590966c0e9a88a7000b","original_commit_id":"78191e8d4786eb0179828590966c0e9a88a7000b","user":{"login":"lioncash","id":712067,"avatar_url":"https://avatars.githubusercontent.com/u/712067?v=1","gravatar_id":"5d49a662d2758e9d5728ab17caf327e9","url":"https://api.github.com/users/lioncash","html_url":"https://github.com/lioncash","followers_url":"https://api.github.com/users/lioncash/followers","following_url":"https://api.github.com/users/lioncash/following{/other_user}","gists_url":"https://api.github.com/users/lioncash/gists{/gist_id}","starred_url":"https://api.github.com/users/lioncash/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/lioncash/subscriptions","organizations_url":"https://api.github.com/users/lioncash/orgs","repos_url":"https://api.github.com/users/lioncash/repos","events_url":"https://api.github.com/users/lioncash/events{/privacy}","received_events_url":"https://api.github.com/users/lioncash/received_events","type":"User","site_admin":false},"body":"std::to_string","created_at":"2014-08-02T04:26:48Z","updated_at":"2014-08-02T04:26:48Z","html_url":"https://github.com/dolphin-emu/dolphin/pull/693#discussion_r15727174","pull_request_url":"https://api.github.com/repos/dolphin-emu/dolphin/pulls/693","_links":{"self":{"href":"https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/15727174"},"html":{"href":"https://github.com/dolphin-emu/dolphin/pull/693#discussion_r15727174"},"pull_request":{"href":"https://api.github.com/repos/dolphin-emu/dolphin/pulls/693"}}},"pull_request":{"url":"https://api.github.com/repos/dolphin-emu/dolphin/pulls/693","id":19040937,"html_url":"https://github.com/dolphin-emu/dolphin/pull/693","diff_url":"https://github.com/dolphin-emu/dolphin/pull/693.diff","patch_url":"https://github.com/dolphin-emu/dolphin/pull/693.patch","issue_url":"https://api.github.com/repos/dolphin-emu/dolphin/issues/693","number":693,"state":"open","title":"Improved system for post processing shaders.","user":{"login":"Sonicadvance1","id":1018829,"avatar_url":"https://avatars.githubusercontent.com/u/1018829?v=1","gravatar_id":"260346efb6171dec817a5d92c637663c","url":"https://api.github.com/users/Sonicadvance1","html_url":"https://github.com/Sonicadvance1","followers_url":"https://api.github.com/users/Sonicadvance1/followers","following_url":"https://api.github.com/users/Sonicadvance1/following{/other_user}","gists_url":"https://api.github.com/users/Sonicadvance1/gists{/gist_id}","starred_url":"https://api.github.com/users/Sonicadvance1/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Sonicadvance1/subscriptions","organizations_url":"https://api.github.com/users/Sonicadvance1/orgs","repos_url":"https://api.github.com/users/Sonicadvance1/repos","events_url":"https://api.github.com/users/Sonicadvance1/events{/privacy}","received_events_url":"https://api.github.com/users/Sonicadvance1/received_events","type":"User","site_admin":false},"body":"This is the system for improving configurability of shaders from a user perspective.\r\n\r\nThis doesn't have multiple render stages in the PP shader backend, but is more centered towards bringing configurations of the shaders options to the UI.","created_at":"2014-07-29T17:19:24Z","updated_at":"2014-08-02T04:26:48Z","closed_at":null,"merged_at":null,"merge_commit_sha":"27b97c1ccfdf7e261b00b530b93dfd4ad11e8906","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/dolphin-emu/dolphin/pulls/693/commits","review_comments_url":"https://api.github.com/repos/dolphin-emu/dolphin/pulls/693/comments","review_comment_url":"https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/{number}","comments_url":"https://api.github.com/repos/dolphin-emu/dolphin/issues/693/comments","statuses_url":"https://api.github.com/repos/dolphin-emu/dolphin/statuses/78191e8d4786eb0179828590966c0e9a88a7000b","head":{"label":"Sonicadvance1:PP-shaders-improvement","ref":"PP-shaders-improvement","sha":"78191e8d4786eb0179828590966c0e9a88a7000b","user":{"login":"Sonicadvance1","id":1018829,"avatar_url":"https://avatars.githubusercontent.com/u/1018829?v=1","gravatar_id":"260346efb6171dec817a5d92c637663c","url":"https://api.github.com/users/Sonicadvance1","html_url":"https://github.com/Sonicadvance1","followers_url":"https://api.github.com/users/Sonicadvance1/followers","following_url":"https://api.github.com/users/Sonicadvance1/following{/other_user}","gists_url":"https://api.github.com/users/Sonicadvance1/gists{/gist_id}","starred_url":"https://api.github.com/users/Sonicadvance1/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Sonicadvance1/subscriptions","organizations_url":"https://api.github.com/users/Sonicadvance1/orgs","repos_url":"https://api.github.com/users/Sonicadvance1/repos","events_url":"https://api.github.com/users/Sonicadvance1/events{/privacy}","received_events_url":"https://api.github.com/users/Sonicadvance1/received_events","type":"User","site_admin":false},"repo":{"id":16360220,"name":"dolphin","full_name":"Sonicadvance1/dolphin","owner":{"login":"Sonicadvance1","id":1018829,"avatar_url":"https://avatars.githubusercontent.com/u/1018829?v=1","gravatar_id":"260346efb6171dec817a5d92c637663c","url":"https://api.github.com/users/Sonicadvance1","html_url":"https://github.com/Sonicadvance1","followers_url":"https://api.github.com/users/Sonicadvance1/followers","following_url":"https://api.github.com/users/Sonicadvance1/following{/other_user}","gists_url":"https://api.github.com/users/Sonicadvance1/gists{/gist_id}","starred_url":"https://api.github.com/users/Sonicadvance1/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Sonicadvance1/subscriptions","organizations_url":"https://api.github.com/users/Sonicadvance1/orgs","repos_url":"https://api.github.com/users/Sonicadvance1/repos","events_url":"https://api.github.com/users/Sonicadvance1/events{/privacy}","received_events_url":"https://api.github.com/users/Sonicadvance1/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/Sonicadvance1/dolphin","description":"Dolphin is a GameCube/Wii emulator, allowing you to play games for these two platforms on PC, with improvements.","fork":true,"url":"https://api.github.com/repos/Sonicadvance1/dolphin","forks_url":"https://api.github.com/repos/Sonicadvance1/dolphin/forks","keys_url":"https://api.github.com/repos/Sonicadvance1/dolphin/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Sonicadvance1/dolphin/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Sonicadvance1/dolphin/teams","hooks_url":"https://api.github.com/repos/Sonicadvance1/dolphin/hooks","issue_events_url":"https://api.github.com/repos/Sonicadvance1/dolphin/issues/events{/number}","events_url":"https://api.github.com/repos/Sonicadvance1/dolphin/events","assignees_url":"https://api.github.com/repos/Sonicadvance1/dolphin/assignees{/user}","branches_url":"https://api.github.com/repos/Sonicadvance1/dolphin/branches{/branch}","tags_url":"https://api.github.com/repos/Sonicadvance1/dolphin/tags","blobs_url":"https://api.github.com/repos/Sonicadvance1/dolphin/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Sonicadvance1/dolphin/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Sonicadvance1/dolphin/git/refs{/sha}","trees_url":"https://api.github.com/repos/Sonicadvance1/dolphin/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Sonicadvance1/dolphin/statuses/{sha}","languages_url":"https://api.github.com/repos/Sonicadvance1/dolphin/languages","stargazers_url":"https://api.github.com/repos/Sonicadvance1/dolphin/stargazers","contributors_url":"https://api.github.com/repos/Sonicadvance1/dolphin/contributors","subscribers_url":"https://api.github.com/repos/Sonicadvance1/dolphin/subscribers","subscription_url":"https://api.github.com/repos/Sonicadvance1/dolphin/subscription","commits_url":"https://api.github.com/repos/Sonicadvance1/dolphin/commits{/sha}","git_commits_url":"https://api.github.com/repos/Sonicadvance1/dolphin/git/commits{/sha}","comments_url":"https://api.github.com/repos/Sonicadvance1/dolphin/comments{/number}","issue_comment_url":"https://api.github.com/repos/Sonicadvance1/dolphin/issues/comments/{number}","contents_url":"https://api.github.com/repos/Sonicadvance1/dolphin/contents/{+path}","compare_url":"https://api.github.com/repos/Sonicadvance1/dolphin/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Sonicadvance1/dolphin/merges","archive_url":"https://api.github.com/repos/Sonicadvance1/dolphin/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Sonicadvance1/dolphin/downloads","issues_url":"https://api.github.com/repos/Sonicadvance1/dolphin/issues{/number}","pulls_url":"https://api.github.com/repos/Sonicadvance1/dolphin/pulls{/number}","milestones_url":"https://api.github.com/repos/Sonicadvance1/dolphin/milestones{/number}","notifications_url":"https://api.github.com/repos/Sonicadvance1/dolphin/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Sonicadvance1/dolphin/labels{/name}","releases_url":"https://api.github.com/repos/Sonicadvance1/dolphin/releases{/id}","created_at":"2014-01-29T21:48:46Z","updated_at":"2014-06-17T03:54:40Z","pushed_at":"2014-08-02T04:24:16Z","git_url":"git://github.com/Sonicadvance1/dolphin.git","ssh_url":"git@github.com:Sonicadvance1/dolphin.git","clone_url":"https://github.com/Sonicadvance1/dolphin.git","svn_url":"https://github.com/Sonicadvance1/dolphin","homepage":null,"size":194411,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"dolphin-emu:master","ref":"master","sha":"7e83a0ea9be49abee3a4c8a2e953ca0905271434","user":{"login":"dolphin-emu","id":5050316,"avatar_url":"https://avatars.githubusercontent.com/u/5050316?v=1","gravatar_id":"889eb5c76644c10900f277bef9b7b516","url":"https://api.github.com/users/dolphin-emu","html_url":"https://github.com/dolphin-emu","followers_url":"https://api.github.com/users/dolphin-emu/followers","following_url":"https://api.github.com/users/dolphin-emu/following{/other_user}","gists_url":"https://api.github.com/users/dolphin-emu/gists{/gist_id}","starred_url":"https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dolphin-emu/subscriptions","organizations_url":"https://api.github.com/users/dolphin-emu/orgs","repos_url":"https://api.github.com/users/dolphin-emu/repos","events_url":"https://api.github.com/users/dolphin-emu/events{/privacy}","received_events_url":"https://api.github.com/users/dolphin-emu/received_events","type":"Organization","site_admin":false},"repo":{"id":11577304,"name":"dolphin","full_name":"dolphin-emu/dolphin","owner":{"login":"dolphin-emu","id":5050316,"avatar_url":"https://avatars.githubusercontent.com/u/5050316?v=1","gravatar_id":"889eb5c76644c10900f277bef9b7b516","url":"https://api.github.com/users/dolphin-emu","html_url":"https://github.com/dolphin-emu","followers_url":"https://api.github.com/users/dolphin-emu/followers","following_url":"https://api.github.com/users/dolphin-emu/following{/other_user}","gists_url":"https://api.github.com/users/dolphin-emu/gists{/gist_id}","starred_url":"https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dolphin-emu/subscriptions","organizations_url":"https://api.github.com/users/dolphin-emu/orgs","repos_url":"https://api.github.com/users/dolphin-emu/repos","events_url":"https://api.github.com/users/dolphin-emu/events{/privacy}","received_events_url":"https://api.github.com/users/dolphin-emu/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/dolphin-emu/dolphin","description":"Dolphin is a GameCube/Wii emulator, allowing you to play games for these two platforms on PC, with improvements.","fork":false,"url":"https://api.github.com/repos/dolphin-emu/dolphin","forks_url":"https://api.github.com/repos/dolphin-emu/dolphin/forks","keys_url":"https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}","collaborators_url":"https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/dolphin-emu/dolphin/teams","hooks_url":"https://api.github.com/repos/dolphin-emu/dolphin/hooks","issue_events_url":"https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}","events_url":"https://api.github.com/repos/dolphin-emu/dolphin/events","assignees_url":"https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}","branches_url":"https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}","tags_url":"https://api.github.com/repos/dolphin-emu/dolphin/tags","blobs_url":"https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}","trees_url":"https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}","statuses_url":"https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}","languages_url":"https://api.github.com/repos/dolphin-emu/dolphin/languages","stargazers_url":"https://api.github.com/repos/dolphin-emu/dolphin/stargazers","contributors_url":"https://api.github.com/repos/dolphin-emu/dolphin/contributors","subscribers_url":"https://api.github.com/repos/dolphin-emu/dolphin/subscribers","subscription_url":"https://api.github.com/repos/dolphin-emu/dolphin/subscription","commits_url":"https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}","git_commits_url":"https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}","comments_url":"https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}","issue_comment_url":"https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/{number}","contents_url":"https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}","compare_url":"https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}","merges_url":"https://api.github.com/repos/dolphin-emu/dolphin/merges","archive_url":"https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/dolphin-emu/dolphin/downloads","issues_url":"https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}","pulls_url":"https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}","milestones_url":"https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}","notifications_url":"https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}","releases_url":"https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}","created_at":"2013-07-22T09:07:57Z","updated_at":"2014-08-02T01:35:54Z","pushed_at":"2014-08-02T03:57:44Z","git_url":"git://github.com/dolphin-emu/dolphin.git","ssh_url":"git@github.com:dolphin-emu/dolphin.git","clone_url":"https://github.com/dolphin-emu/dolphin.git","svn_url":"https://github.com/dolphin-emu/dolphin","homepage":null,"size":232471,"stargazers_count":405,"watchers_count":405,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":true,"forks_count":144,"mirror_url":null,"open_issues_count":36,"forks":144,"open_issues":36,"watchers":405,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/dolphin-emu/dolphin/pulls/693"},"html":{"href":"https://github.com/dolphin-emu/dolphin/pull/693"},"issue":{"href":"https://api.github.com/repos/dolphin-emu/dolphin/issues/693"},"comments":{"href":"https://api.github.com/repos/dolphin-emu/dolphin/issues/693/comments"},"review_comments":{"href":"https://api.github.com/repos/dolphin-emu/dolphin/pulls/693/comments"},"review_comment":{"href":"https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/dolphin-emu/dolphin/pulls/693/commits"},"statuses":{"href":"https://api.github.com/repos/dolphin-emu/dolphin/statuses/78191e8d4786eb0179828590966c0e9a88a7000b"}}}}