{"action":"created","comment":{"url":"https://api.github.com/repos/MovingBlocks/Terasology/pulls/comments/75030586","id":75030586,"diff_hunk":"@@ -0,0 +1,269 @@\n+/*\n+ * Copyright 2016 MovingBlocks\n+ *\n+ * Licensed under the Apache License, Version 2.0 (the \"License\");\n+ * you may not use this file except in compliance with the License.\n+ * You may obtain a copy of the License at\n+ *\n+ *      http://www.apache.org/licenses/LICENSE-2.0\n+ *\n+ * Unless required by applicable law or agreed to in writing, software\n+ * distributed under the License is distributed on an \"AS IS\" BASIS,\n+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+ * See the License for the specific language governing permissions and\n+ * limitations under the License.\n+ */\n+package org.terasology.rendering.opengl;\n+\n+import com.google.common.base.Preconditions;\n+import com.google.common.collect.Maps;\n+import com.google.common.collect.Sets;\n+import java.util.Map;\n+import java.util.Set;\n+import org.slf4j.Logger;\n+import org.slf4j.LoggerFactory;\n+import org.terasology.assets.ResourceUrn;\n+\n+\n+/**\n+ * The FrameBuffersManager generates and maintains a number of Frame Buffer Objects (FBOs) used throughout the\n+ * rendering engine.\n+ * <p>\n+ * In most instances Frame Buffers can be thought of as 2D arrays of pixels in GPU memory: shaders write to them or\n+ * read from them. Some buffers are static and never change for the lifetime of the manager. Some buffers are dynamic:\n+ * they get disposed and regenerated, i.e. in case the display resolution changes. Some buffers hold intermediate\n+ * steps of the rendering process and the content of one buffer, \"sceneFinal\", is eventually sent to the display.\n+ * <br/>\n+ * At this stage no buffer can be added or deleted: the list of buffers and their characteristics is hardcoded.\n+ * <br/>\n+ * The existing set of public methods is primarily intended to allow communication between this manager and other parts\n+ * of the rendering engine, most notably the PostProcessor and the GraphicState instances and the shaders system.\n+ * <br/>\n+ * An important exception is the takeScreenshot() method which prompts the renderer to eventually (not immediately)\n+ * redirect its output to a file. This is the only public method that is intended to be used from outside the\n+ * rendering engine.\n+ * <p>\n+ * Default FBOs:\n+ * sceneOpaque:  Primary FBO: most visual information eventually ends up here\n+ * sceneOpaquePingPong:  The sceneOpaque FBOs are swapped every frame, to use one for reading and the other for writing\n+ * Notice that these two FBOs hold a number of buffers, for color, depth, normals, etc.\n+ * sceneSkyBand0:  two buffers used to generate a depth cue: things in the distance fades into the atmosphere's color.\n+ * sceneSkyBand1:\n+ * sceneReflectiveRefractive:  used to render reflective and refractive surfaces, most obvious case being the water surface\n+ * sceneReflected:  the water surface displays a reflected version of the scene. This version is stored here.\n+ * outline:  greyscale depth-based rendering of object outlines\n+ * ssao:  greyscale screen-space ambient occlusion rendering\n+ * ssaoBlurred:  greyscale screen-space ambient occlusion rendering - blurred version\n+ * scenePrePost:  intermediate step, combining a number of renderings made available so far\n+ * lightShafts:  light shafts rendering\n+ * sceneHighPass:  a number of buffers to create the bloom effect\n+ * sceneBloom0:\n+ * sceneBloom1:\n+ * sceneBloom2:\n+ * sceneBlur0:  a pair of buffers holding blurred versions of the rendered scene,\n+ * sceneBlur1:  also used for the bloom effect, but not only.\n+ * ocUndistorted:  if OculusRift support is enabled this buffer holds the side-by-side views\n+ * for each eye, with no lens distortion applied.\n+ * sceneFinal:  the content of this buffer is eventually shown on the display or sent to a file if taking a screenshot\n+ */\n+\n+/**\n+ * TODO: fix above, add javadocs\n+ */\n+public abstract class AbstractFBM implements BaseFBM {\n+    protected static final Logger logger = LoggerFactory.getLogger(AbstractFBM.class);\n+    protected Map<ResourceUrn, FBOConfig> fboConfigs;\n+    protected Map<ResourceUrn, FBO> fboLookup;\n+    protected Map<ResourceUrn, Integer> fboUsageCountMap;\n+\n+\n+    private Set<FBOManagerSubscriber> fboManagerSubscribers;\n+\n+    @Override\n+    public void initialise() {\n+        fboLookup = Maps.newHashMap();\n+        fboUsageCountMap = Maps.newHashMap();\n+        fboConfigs = Maps.newHashMap();\n+        fboManagerSubscribers = Sets.newHashSet();\n+    }\n+\n+    protected FBO generate(FBOConfig fboConfig, FBO.Dimensions dimensions) {\n+        FBO fbo = FBO.create(fboConfig, dimensions);\n+\n+        // At this stage it's unclear what should be done in this circumstances as I (manu3d) do not know what\n+        // the effects of using an incomplete FrameBuffer are. Throw an exception? Live with visual artifacts?\n+        if (fbo.getStatus() == FBO.Status.INCOMPLETE) {\n+            logger.error(\"FBO \" + fboConfig.getResourceUrn() + \" is incomplete. Look earlier in the log for details.\");\n+        } else if (fbo.getStatus() == FBO.Status.UNEXPECTED) {\n+            logger.error(\"FBO \" + fboConfig.getResourceUrn() + \" has generated an unexpected status code. Look earlier in the log for details.\");\n+        }\n+        fboLookup.put(fboConfig.getResourceUrn(), fbo);\n+        fboConfigs.put(fboConfig.getResourceUrn(), fboConfig);\n+        return fbo;\n+    }\n+\n+    protected void notifySubscribers() {\n+        for (FBOManagerSubscriber subscriber : fboManagerSubscribers) {\n+            subscriber.update();\n+        }\n+    }\n+\n+\n+    protected void retain(ResourceUrn resourceUrn) {\n+        if (!fboUsageCountMap.containsKey(resourceUrn)) {\n+            fboUsageCountMap.put(resourceUrn, 1);\n+            return;\n+        }\n+        int usageCount = fboUsageCountMap.get(resourceUrn) + 1;\n+        fboUsageCountMap.put(resourceUrn, usageCount);","path":"engine/src/main/java/org/terasology/rendering/opengl/AbstractFBM.java","position":118,"original_position":118,"commit_id":"de5e7be8aba7269227d78b95ed7aacd20c0a5abd","original_commit_id":"614374d2ef5db5fa337ec60b556b45bc678a25a5","user":{"login":"emanuele3d","id":6934584,"avatar_url":"https://avatars.githubusercontent.com/u/6934584?v=3","gravatar_id":"","url":"https://api.github.com/users/emanuele3d","html_url":"https://github.com/emanuele3d","followers_url":"https://api.github.com/users/emanuele3d/followers","following_url":"https://api.github.com/users/emanuele3d/following{/other_user}","gists_url":"https://api.github.com/users/emanuele3d/gists{/gist_id}","starred_url":"https://api.github.com/users/emanuele3d/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/emanuele3d/subscriptions","organizations_url":"https://api.github.com/users/emanuele3d/orgs","repos_url":"https://api.github.com/users/emanuele3d/repos","events_url":"https://api.github.com/users/emanuele3d/events{/privacy}","received_events_url":"https://api.github.com/users/emanuele3d/received_events","type":"User","site_admin":false},"body":"You should wrap the last two lines in the IF block and place them first, as the most likely case.","created_at":"2016-08-16T22:12:06Z","updated_at":"2016-08-16T22:12:06Z","html_url":"https://github.com/MovingBlocks/Terasology/pull/2431#discussion_r75030586","pull_request_url":"https://api.github.com/repos/MovingBlocks/Terasology/pulls/2431","_links":{"self":{"href":"https://api.github.com/repos/MovingBlocks/Terasology/pulls/comments/75030586"},"html":{"href":"https://github.com/MovingBlocks/Terasology/pull/2431#discussion_r75030586"},"pull_request":{"href":"https://api.github.com/repos/MovingBlocks/Terasology/pulls/2431"}}},"pull_request":{"url":"https://api.github.com/repos/MovingBlocks/Terasology/pulls/2431","id":80144433,"html_url":"https://github.com/MovingBlocks/Terasology/pull/2431","diff_url":"https://github.com/MovingBlocks/Terasology/pull/2431.diff","patch_url":"https://github.com/MovingBlocks/Terasology/pull/2431.patch","issue_url":"https://api.github.com/repos/MovingBlocks/Terasology/issues/2431","number":2431,"state":"open","locked":false,"title":"[RFR] Nodes use FBOConfig to add their desired FBOs to FBM","user":{"login":"tdgunes","id":136392,"avatar_url":"https://avatars.githubusercontent.com/u/136392?v=3","gravatar_id":"","url":"https://api.github.com/users/tdgunes","html_url":"https://github.com/tdgunes","followers_url":"https://api.github.com/users/tdgunes/followers","following_url":"https://api.github.com/users/tdgunes/following{/other_user}","gists_url":"https://api.github.com/users/tdgunes/gists{/gist_id}","starred_url":"https://api.github.com/users/tdgunes/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tdgunes/subscriptions","organizations_url":"https://api.github.com/users/tdgunes/orgs","repos_url":"https://api.github.com/users/tdgunes/repos","events_url":"https://api.github.com/users/tdgunes/events{/privacy}","received_events_url":"https://api.github.com/users/tdgunes/received_events","type":"User","site_admin":false},"body":"<!-- Thanks for submitting a pull request for Terasology! :-)\r\nPlease fill in some brief details below about the PR.\r\nIf it contains source code please make sure to run Checkstyle on it first\r\nIf you add unit tests we'll love you forever! -->\r\n\r\n### Contains\r\n\r\nInitial but working PR for the issue: [Nodes generate and publish the FBOs they need, unless available already](https://github.com/tdgunes/Terasology/issues/7). All current-default nodes in this PR have `requireFBO` statements.  \r\n\r\n### How to test\r\n\r\nPlease check any weirdness on rendering in the PR. Sorry for not specifying any particular rendering operation since all nodes were modified. \r\n","created_at":"2016-08-04T20:30:11Z","updated_at":"2016-08-16T22:12:06Z","closed_at":null,"merged_at":null,"merge_commit_sha":"998aa0f7ea6ca72e5a17cd8763206d6c51ff783d","assignee":{"login":"msteiger","id":1820007,"avatar_url":"https://avatars.githubusercontent.com/u/1820007?v=3","gravatar_id":"","url":"https://api.github.com/users/msteiger","html_url":"https://github.com/msteiger","followers_url":"https://api.github.com/users/msteiger/followers","following_url":"https://api.github.com/users/msteiger/following{/other_user}","gists_url":"https://api.github.com/users/msteiger/gists{/gist_id}","starred_url":"https://api.github.com/users/msteiger/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/msteiger/subscriptions","organizations_url":"https://api.github.com/users/msteiger/orgs","repos_url":"https://api.github.com/users/msteiger/repos","events_url":"https://api.github.com/users/msteiger/events{/privacy}","received_events_url":"https://api.github.com/users/msteiger/received_events","type":"User","site_admin":false},"assignees":[{"login":"msteiger","id":1820007,"avatar_url":"https://avatars.githubusercontent.com/u/1820007?v=3","gravatar_id":"","url":"https://api.github.com/users/msteiger","html_url":"https://github.com/msteiger","followers_url":"https://api.github.com/users/msteiger/followers","following_url":"https://api.github.com/users/msteiger/following{/other_user}","gists_url":"https://api.github.com/users/msteiger/gists{/gist_id}","starred_url":"https://api.github.com/users/msteiger/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/msteiger/subscriptions","organizations_url":"https://api.github.com/users/msteiger/orgs","repos_url":"https://api.github.com/users/msteiger/repos","events_url":"https://api.github.com/users/msteiger/events{/privacy}","received_events_url":"https://api.github.com/users/msteiger/received_events","type":"User","site_admin":false},{"login":"emanuele3d","id":6934584,"avatar_url":"https://avatars.githubusercontent.com/u/6934584?v=3","gravatar_id":"","url":"https://api.github.com/users/emanuele3d","html_url":"https://github.com/emanuele3d","followers_url":"https://api.github.com/users/emanuele3d/followers","following_url":"https://api.github.com/users/emanuele3d/following{/other_user}","gists_url":"https://api.github.com/users/emanuele3d/gists{/gist_id}","starred_url":"https://api.github.com/users/emanuele3d/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/emanuele3d/subscriptions","organizations_url":"https://api.github.com/users/emanuele3d/orgs","repos_url":"https://api.github.com/users/emanuele3d/repos","events_url":"https://api.github.com/users/emanuele3d/events{/privacy}","received_events_url":"https://api.github.com/users/emanuele3d/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/MovingBlocks/Terasology/pulls/2431/commits","review_comments_url":"https://api.github.com/repos/MovingBlocks/Terasology/pulls/2431/comments","review_comment_url":"https://api.github.com/repos/MovingBlocks/Terasology/pulls/comments{/number}","comments_url":"https://api.github.com/repos/MovingBlocks/Terasology/issues/2431/comments","statuses_url":"https://api.github.com/repos/MovingBlocks/Terasology/statuses/de5e7be8aba7269227d78b95ed7aacd20c0a5abd","head":{"label":"tdgunes:dag-fbos","ref":"dag-fbos","sha":"de5e7be8aba7269227d78b95ed7aacd20c0a5abd","user":{"login":"tdgunes","id":136392,"avatar_url":"https://avatars.githubusercontent.com/u/136392?v=3","gravatar_id":"","url":"https://api.github.com/users/tdgunes","html_url":"https://github.com/tdgunes","followers_url":"https://api.github.com/users/tdgunes/followers","following_url":"https://api.github.com/users/tdgunes/following{/other_user}","gists_url":"https://api.github.com/users/tdgunes/gists{/gist_id}","starred_url":"https://api.github.com/users/tdgunes/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tdgunes/subscriptions","organizations_url":"https://api.github.com/users/tdgunes/orgs","repos_url":"https://api.github.com/users/tdgunes/repos","events_url":"https://api.github.com/users/tdgunes/events{/privacy}","received_events_url":"https://api.github.com/users/tdgunes/received_events","type":"User","site_admin":false},"repo":{"id":55730673,"name":"Terasology","full_name":"tdgunes/Terasology","owner":{"login":"tdgunes","id":136392,"avatar_url":"https://avatars.githubusercontent.com/u/136392?v=3","gravatar_id":"","url":"https://api.github.com/users/tdgunes","html_url":"https://github.com/tdgunes","followers_url":"https://api.github.com/users/tdgunes/followers","following_url":"https://api.github.com/users/tdgunes/following{/other_user}","gists_url":"https://api.github.com/users/tdgunes/gists{/gist_id}","starred_url":"https://api.github.com/users/tdgunes/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tdgunes/subscriptions","organizations_url":"https://api.github.com/users/tdgunes/orgs","repos_url":"https://api.github.com/users/tdgunes/repos","events_url":"https://api.github.com/users/tdgunes/events{/privacy}","received_events_url":"https://api.github.com/users/tdgunes/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/tdgunes/Terasology","description":"Terasology - open source voxel world","fork":true,"url":"https://api.github.com/repos/tdgunes/Terasology","forks_url":"https://api.github.com/repos/tdgunes/Terasology/forks","keys_url":"https://api.github.com/repos/tdgunes/Terasology/keys{/key_id}","collaborators_url":"https://api.github.com/repos/tdgunes/Terasology/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/tdgunes/Terasology/teams","hooks_url":"https://api.github.com/repos/tdgunes/Terasology/hooks","issue_events_url":"https://api.github.com/repos/tdgunes/Terasology/issues/events{/number}","events_url":"https://api.github.com/repos/tdgunes/Terasology/events","assignees_url":"https://api.github.com/repos/tdgunes/Terasology/assignees{/user}","branches_url":"https://api.github.com/repos/tdgunes/Terasology/branches{/branch}","tags_url":"https://api.github.com/repos/tdgunes/Terasology/tags","blobs_url":"https://api.github.com/repos/tdgunes/Terasology/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/tdgunes/Terasology/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/tdgunes/Terasology/git/refs{/sha}","trees_url":"https://api.github.com/repos/tdgunes/Terasology/git/trees{/sha}","statuses_url":"https://api.github.com/repos/tdgunes/Terasology/statuses/{sha}","languages_url":"https://api.github.com/repos/tdgunes/Terasology/languages","stargazers_url":"https://api.github.com/repos/tdgunes/Terasology/stargazers","contributors_url":"https://api.github.com/repos/tdgunes/Terasology/contributors","subscribers_url":"https://api.github.com/repos/tdgunes/Terasology/subscribers","subscription_url":"https://api.github.com/repos/tdgunes/Terasology/subscription","commits_url":"https://api.github.com/repos/tdgunes/Terasology/commits{/sha}","git_commits_url":"https://api.github.com/repos/tdgunes/Terasology/git/commits{/sha}","comments_url":"https://api.github.com/repos/tdgunes/Terasology/comments{/number}","issue_comment_url":"https://api.github.com/repos/tdgunes/Terasology/issues/comments{/number}","contents_url":"https://api.github.com/repos/tdgunes/Terasology/contents/{+path}","compare_url":"https://api.github.com/repos/tdgunes/Terasology/compare/{base}...{head}","merges_url":"https://api.github.com/repos/tdgunes/Terasology/merges","archive_url":"https://api.github.com/repos/tdgunes/Terasology/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/tdgunes/Terasology/downloads","issues_url":"https://api.github.com/repos/tdgunes/Terasology/issues{/number}","pulls_url":"https://api.github.com/repos/tdgunes/Terasology/pulls{/number}","milestones_url":"https://api.github.com/repos/tdgunes/Terasology/milestones{/number}","notifications_url":"https://api.github.com/repos/tdgunes/Terasology/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/tdgunes/Terasology/labels{/name}","releases_url":"https://api.github.com/repos/tdgunes/Terasology/releases{/id}","deployments_url":"https://api.github.com/repos/tdgunes/Terasology/deployments","created_at":"2016-04-07T21:52:38Z","updated_at":"2016-06-30T22:35:05Z","pushed_at":"2016-08-16T04:11:36Z","git_url":"git://github.com/tdgunes/Terasology.git","ssh_url":"git@github.com:tdgunes/Terasology.git","clone_url":"https://github.com/tdgunes/Terasology.git","svn_url":"https://github.com/tdgunes/Terasology","homepage":"http://terasology.org","size":267940,"stargazers_count":0,"watchers_count":0,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":12,"forks":0,"open_issues":12,"watchers":0,"default_branch":"develop"}},"base":{"label":"MovingBlocks:develop","ref":"develop","sha":"7df19a958ea5f853733895785c10855fee2052d3","user":{"login":"MovingBlocks","id":1292442,"avatar_url":"https://avatars.githubusercontent.com/u/1292442?v=3","gravatar_id":"","url":"https://api.github.com/users/MovingBlocks","html_url":"https://github.com/MovingBlocks","followers_url":"https://api.github.com/users/MovingBlocks/followers","following_url":"https://api.github.com/users/MovingBlocks/following{/other_user}","gists_url":"https://api.github.com/users/MovingBlocks/gists{/gist_id}","starred_url":"https://api.github.com/users/MovingBlocks/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/MovingBlocks/subscriptions","organizations_url":"https://api.github.com/users/MovingBlocks/orgs","repos_url":"https://api.github.com/users/MovingBlocks/repos","events_url":"https://api.github.com/users/MovingBlocks/events{/privacy}","received_events_url":"https://api.github.com/users/MovingBlocks/received_events","type":"Organization","site_admin":false},"repo":{"id":1438007,"name":"Terasology","full_name":"MovingBlocks/Terasology","owner":{"login":"MovingBlocks","id":1292442,"avatar_url":"https://avatars.githubusercontent.com/u/1292442?v=3","gravatar_id":"","url":"https://api.github.com/users/MovingBlocks","html_url":"https://github.com/MovingBlocks","followers_url":"https://api.github.com/users/MovingBlocks/followers","following_url":"https://api.github.com/users/MovingBlocks/following{/other_user}","gists_url":"https://api.github.com/users/MovingBlocks/gists{/gist_id}","starred_url":"https://api.github.com/users/MovingBlocks/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/MovingBlocks/subscriptions","organizations_url":"https://api.github.com/users/MovingBlocks/orgs","repos_url":"https://api.github.com/users/MovingBlocks/repos","events_url":"https://api.github.com/users/MovingBlocks/events{/privacy}","received_events_url":"https://api.github.com/users/MovingBlocks/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/MovingBlocks/Terasology","description":"Terasology - open source voxel world","fork":false,"url":"https://api.github.com/repos/MovingBlocks/Terasology","forks_url":"https://api.github.com/repos/MovingBlocks/Terasology/forks","keys_url":"https://api.github.com/repos/MovingBlocks/Terasology/keys{/key_id}","collaborators_url":"https://api.github.com/repos/MovingBlocks/Terasology/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/MovingBlocks/Terasology/teams","hooks_url":"https://api.github.com/repos/MovingBlocks/Terasology/hooks","issue_events_url":"https://api.github.com/repos/MovingBlocks/Terasology/issues/events{/number}","events_url":"https://api.github.com/repos/MovingBlocks/Terasology/events","assignees_url":"https://api.github.com/repos/MovingBlocks/Terasology/assignees{/user}","branches_url":"https://api.github.com/repos/MovingBlocks/Terasology/branches{/branch}","tags_url":"https://api.github.com/repos/MovingBlocks/Terasology/tags","blobs_url":"https://api.github.com/repos/MovingBlocks/Terasology/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/MovingBlocks/Terasology/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/MovingBlocks/Terasology/git/refs{/sha}","trees_url":"https://api.github.com/repos/MovingBlocks/Terasology/git/trees{/sha}","statuses_url":"https://api.github.com/repos/MovingBlocks/Terasology/statuses/{sha}","languages_url":"https://api.github.com/repos/MovingBlocks/Terasology/languages","stargazers_url":"https://api.github.com/repos/MovingBlocks/Terasology/stargazers","contributors_url":"https://api.github.com/repos/MovingBlocks/Terasology/contributors","subscribers_url":"https://api.github.com/repos/MovingBlocks/Terasology/subscribers","subscription_url":"https://api.github.com/repos/MovingBlocks/Terasology/subscription","commits_url":"https://api.github.com/repos/MovingBlocks/Terasology/commits{/sha}","git_commits_url":"https://api.github.com/repos/MovingBlocks/Terasology/git/commits{/sha}","comments_url":"https://api.github.com/repos/MovingBlocks/Terasology/comments{/number}","issue_comment_url":"https://api.github.com/repos/MovingBlocks/Terasology/issues/comments{/number}","contents_url":"https://api.github.com/repos/MovingBlocks/Terasology/contents/{+path}","compare_url":"https://api.github.com/repos/MovingBlocks/Terasology/compare/{base}...{head}","merges_url":"https://api.github.com/repos/MovingBlocks/Terasology/merges","archive_url":"https://api.github.com/repos/MovingBlocks/Terasology/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/MovingBlocks/Terasology/downloads","issues_url":"https://api.github.com/repos/MovingBlocks/Terasology/issues{/number}","pulls_url":"https://api.github.com/repos/MovingBlocks/Terasology/pulls{/number}","milestones_url":"https://api.github.com/repos/MovingBlocks/Terasology/milestones{/number}","notifications_url":"https://api.github.com/repos/MovingBlocks/Terasology/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/MovingBlocks/Terasology/labels{/name}","releases_url":"https://api.github.com/repos/MovingBlocks/Terasology/releases{/id}","deployments_url":"https://api.github.com/repos/MovingBlocks/Terasology/deployments","created_at":"2011-03-04T03:49:19Z","updated_at":"2016-08-16T14:01:12Z","pushed_at":"2016-08-16T18:58:36Z","git_url":"git://github.com/MovingBlocks/Terasology.git","ssh_url":"git@github.com:MovingBlocks/Terasology.git","clone_url":"https://github.com/MovingBlocks/Terasology.git","svn_url":"https://github.com/MovingBlocks/Terasology","homepage":"http://terasology.org","size":335664,"stargazers_count":1589,"watchers_count":1589,"language":"Java","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":642,"mirror_url":null,"open_issues_count":324,"forks":642,"open_issues":324,"watchers":1589,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/MovingBlocks/Terasology/pulls/2431"},"html":{"href":"https://github.com/MovingBlocks/Terasology/pull/2431"},"issue":{"href":"https://api.github.com/repos/MovingBlocks/Terasology/issues/2431"},"comments":{"href":"https://api.github.com/repos/MovingBlocks/Terasology/issues/2431/comments"},"review_comments":{"href":"https://api.github.com/repos/MovingBlocks/Terasology/pulls/2431/comments"},"review_comment":{"href":"https://api.github.com/repos/MovingBlocks/Terasology/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/MovingBlocks/Terasology/pulls/2431/commits"},"statuses":{"href":"https://api.github.com/repos/MovingBlocks/Terasology/statuses/de5e7be8aba7269227d78b95ed7aacd20c0a5abd"}}}}
{"actor":{"display_login":"emanuele3d"}}