{"action":"created","comment":{"url":"https://api.github.com/repos/thefranke/unityx3d/pulls/comments/288450476","pull_request_review_id":243109287,"id":288450476,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI4ODQ1MDQ3Ng==","diff_hunk":"@@ -185,259 +226,435 @@ public static float ToDegrees(float radians)\n      */\n     class X3DImporter : AssetPostprocessor\n     {\n-        static protected Dictionary<string, GameObject> DefToObjMap = new Dictionary<string, GameObject>();\n+        //\n+        // Data containers, output of processing specific X3D nodes\n+        //\n \n-        public static string GetName(XmlNode node, GameObject obj)\n+        class MaterialInfo\n         {\n-            if (node.Attributes != null)\n-            {\n-                var name = node.Attributes[\"DEF\"];\n-                if (name != null)\n-                {\n-                    DefToObjMap[name.Value] = obj;\n-                    return name.Value;\n-                }\n-            }\n+            // Per-material\n+            public float smoothness, metalness;\n+            public Color diffuseColor, emissiveColor;\n \n-            if (node.Name != null)\n-                return node.Name;\n-            else\n-                return \"Unnamed\";\n+            // This is actually a global render setting\n+            public float ambientIntensity;\n         }\n \n-        static string GetAttribute(XmlNode node, string attrib)\n+        class AppearanceInfo\n         {\n-            if (node.Attributes != null)\n-            {\n-                var a = node.Attributes[attrib];\n-                if (a != null)\n-                    return a.Value;\n-            }\n-\n-            return \"\";\n+            public MaterialInfo material = null;\n+            public Texture2D texture = null;\n         }\n \n-        static Vector3 Vector3FromAttribute(XmlNode node, string attrib, float defaultScalar = 0)\n+        class TransformInfo\n         {\n-            return Tools.Vector3FromString(GetAttribute(node, attrib), defaultScalar);\n+            public Vector3 translation, scale;\n+            public Quaternion rotation;\n         }\n \n-        static Vector4 Vector4FromAttribute(XmlNode node, string attrib, float defaultScalar = 0)\n-        {\n-            return Tools.Vector4FromString(GetAttribute(node, attrib), defaultScalar);\n-        }\n+        //\n+        // Map to help implement DEF/USE in X3D's \"Shape\" nodes\n+        //\n \n-        static float FloatFromAttribute(XmlNode node, string attrib)\n-        {\n-            string v = GetAttribute(node, attrib);\n+        Dictionary<string, GameObject> DefToObjMap = new Dictionary<string, GameObject>();\n \n-            if (v == \"\")\n-                return 0;\n+        //\n+        // Extract node name (if present), populating DefToObj map as we go.\n+        //\n \n-            return float.Parse(v);\n+        string GetName(XmlNode node, GameObject obj)\n+        {\n+            if (node.Attributes != null)\n+            {\n+                XmlAttribute name = node.Attributes[\"DEF\"];\n+                if (name != null)\n+                {\n+                    DefToObjMap[name.Value] = obj;\n+                    return name.Value;\n+                }\n+            }\n+\n+            return node.Name ?? \"Unnamed\";\n         }\n \n-        static void ReadBox(XmlNode boxNode, GameObject obj)\n+        //\n+        // Mesh generation \n+        //\n+\n+        GameObject ReadBox(XmlNode boxNode, GameObject parent)\n         {\n-            Vector3 size = Vector3FromAttribute(boxNode, \"size\", 1);\n+            Vector3 size = Tools.Vector3FromAttribute(boxNode, \"size\", 1);\n+            GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);\n+\n+            GameObject obj = new GameObject(\"Box\");\n+\n+            obj.transform.SetParent(parent.transform);\n             obj.transform.localScale = size;\n \n-            GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);\n             MeshFilter meshFilter = obj.AddComponent<MeshFilter>();\n             meshFilter.mesh = cube.GetComponent<MeshFilter>().sharedMesh;\n+\n             GameObject.DestroyImmediate(cube);\n+\n+            return obj;\n         }\n \n-        static void ReadIndexedFaceSet(XmlNode indexedFaceSetNode, GameObject obj)\n+        List<GameObject> ReadIndexedFaceSet(XmlNode indexedFaceSetNode, GameObject parent)\n         {\n-            int[] coordIndex = Tools.IntArrayFromString(GetAttribute(indexedFaceSetNode, \"coordIndex\"));\n-            if (coordIndex.Length == 0)\n-                return;\n-\n-            XmlNode coordinateNode = null;\n-            XmlNode normalNode = null;\n-\n-            foreach(XmlNode child in indexedFaceSetNode)\n+            List<GameObject> components = new List<GameObject>();\n+            float[] _vtx = null, _uv = null, _nrm = null, _rgba = null;\n+\n+            //\n+            // Both of the following contain per-triangle indices into flat coord / tex coord arrays;\n+            // each set of triangle info is stored as a 4-tuple, with the 4th element ignored (it's a\n+            // sentinel with value -1 denoting the end of polygonal faces; we obviously assume triangles).\n+            //\n+            int[] _tri_vtx_idx = Tools.IntArrayFromString(Tools.GetAttribute(indexedFaceSetNode, \"coordIndex\"));\n+            int[] _tri_uv_idx = Tools.IntArrayFromString(Tools.GetAttribute(indexedFaceSetNode, \"texCoordIndex\"));\n+\n+            // If we have no triangle vertices, we can't really do anything; return empty list.\n+            if (_tri_vtx_idx.Length == 0) return components;\n+\n+            // Extract raw data arrays\n+            foreach (XmlNode child in indexedFaceSetNode)\n             {\n                 if (child.Name == \"Coordinate\")\n-                    coordinateNode = child;\n+                    _vtx = Tools.FloatArrayFromString(Tools.GetAttribute(child, \"point\"));\n+\n+                if (child.Name == \"TextureCoordinate\")\n+                    _uv = Tools.FloatArrayFromString(Tools.GetAttribute(child, \"point\"));\n \n                 if (child.Name == \"Normal\")\n-                    normalNode = child;\n-            }\n+                    _nrm = Tools.FloatArrayFromString(Tools.GetAttribute(child, \"vector\"));\n \n-            if (coordinateNode == null)\n-                return;\n-            \n-            MeshFilter meshFilter = obj.AddComponent<MeshFilter>();\n-            Mesh mesh = new Mesh();\n+                if (child.Name == \"ColorRGBA\")\n+                    _rgba = Tools.FloatArrayFromString(Tools.GetAttribute(child, \"color\"));\n+            }\n \n-            // Setup vertices\n+            // This should probably be treated as an error: We expect at least one vertex!\n+            if (_vtx == null) return components;\n+\n+            //\n+            // Each triangle has per-vertex indices into the arrays containing the coordinate,\n+            // uv, normal, and rgba data. Walk the triangles, creating UNIQUE vertex data for\n+            // each triangle; Unity meshes assume separate per-vertex data for eg texture\n+            // coords etc (this is not guaranteed in X3D files).\n+            // \n+            // Unity also typically limits vertex count in a mesh due to using 16 bit indices\n+            // (x < 2^16, so x < 65,536); if this limit is reached, add remaining data to a new,\n+            // different mesh. Unity GameObjects can only have one mesh, so meshes are assigned\n+            // to child objects (with new child objects created as and when needed).\n+            //\n+\n+            // 65535 % 3 == 0, so (x >= max_mesh_vtx) OK for adding sets of 3 vertices\n+            const int max_mesh_vtx = 65535;\n+\n+            // Current mesh to which we're adding vertex and triangle information\n+            Mesh mesh = null;\n+\n+            // Current mesh data is accumulated into these Lists\n+            List<int> tri = new List<int>();\n+            List<Vector3> vtx = new List<Vector3>();\n+            List<Vector3> nrm = new List<Vector3>();\n+            List<Vector2> uv = new List<Vector2>();\n+            List<Color> rgba = new List<Color>();\n+\n+            // Raw index arrays are sequential integer 4-tuples, so n_tri = length/4\n+            int n_tri = _tri_vtx_idx.Length / 4;","path":"unityx3d.cs","position":303,"original_position":303,"commit_id":"75fbb4fee3a7f7b23db6d52191e9815a1ed590a9","original_commit_id":"75fbb4fee3a7f7b23db6d52191e9815a1ed590a9","user":{"login":"thefranke","id":834956,"node_id":"MDQ6VXNlcjgzNDk1Ng==","avatar_url":"https://avatars0.githubusercontent.com/u/834956?v=4","gravatar_id":"","url":"https://api.github.com/users/thefranke","html_url":"https://github.com/thefranke","followers_url":"https://api.github.com/users/thefranke/followers","following_url":"https://api.github.com/users/thefranke/following{/other_user}","gists_url":"https://api.github.com/users/thefranke/gists{/gist_id}","starred_url":"https://api.github.com/users/thefranke/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thefranke/subscriptions","organizations_url":"https://api.github.com/users/thefranke/orgs","repos_url":"https://api.github.com/users/thefranke/repos","events_url":"https://api.github.com/users/thefranke/events{/privacy}","received_events_url":"https://api.github.com/users/thefranke/received_events","type":"User","site_admin":false},"body":"CamelCase (see above).","created_at":"2019-05-29T08:31:33Z","updated_at":"2019-05-29T08:51:43Z","html_url":"https://github.com/thefranke/unityx3d/pull/3#discussion_r288450476","pull_request_url":"https://api.github.com/repos/thefranke/unityx3d/pulls/3","author_association":"OWNER","_links":{"self":{"href":"https://api.github.com/repos/thefranke/unityx3d/pulls/comments/288450476"},"html":{"href":"https://github.com/thefranke/unityx3d/pull/3#discussion_r288450476"},"pull_request":{"href":"https://api.github.com/repos/thefranke/unityx3d/pulls/3"}}},"pull_request":{"url":"https://api.github.com/repos/thefranke/unityx3d/pulls/3","id":282895543,"node_id":"MDExOlB1bGxSZXF1ZXN0MjgyODk1NTQz","html_url":"https://github.com/thefranke/unityx3d/pull/3","diff_url":"https://github.com/thefranke/unityx3d/pull/3.diff","patch_url":"https://github.com/thefranke/unityx3d/pull/3.patch","issue_url":"https://api.github.com/repos/thefranke/unityx3d/issues/3","number":3,"state":"open","locked":false,"title":"2019-05-28 John Grime","user":{"login":"JohnGrime","id":4098291,"node_id":"MDQ6VXNlcjQwOTgyOTE=","avatar_url":"https://avatars2.githubusercontent.com/u/4098291?v=4","gravatar_id":"","url":"https://api.github.com/users/JohnGrime","html_url":"https://github.com/JohnGrime","followers_url":"https://api.github.com/users/JohnGrime/followers","following_url":"https://api.github.com/users/JohnGrime/following{/other_user}","gists_url":"https://api.github.com/users/JohnGrime/gists{/gist_id}","starred_url":"https://api.github.com/users/JohnGrime/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JohnGrime/subscriptions","organizations_url":"https://api.github.com/users/JohnGrime/orgs","repos_url":"https://api.github.com/users/JohnGrime/repos","events_url":"https://api.github.com/users/JohnGrime/events{/privacy}","received_events_url":"https://api.github.com/users/JohnGrime/received_events","type":"User","site_admin":false},"body":"* Moved data extraction from XML attributes into Tools class, joining\r\n  similar routines to process string data that were already there.\r\n\r\n* X3DImporter class:\r\n\r\n  - Now non-static, so can import more than one X3D object without e.g.\r\n    getting confused by previous entries into the DEF map etc; this should\r\n    not happen, but I've changed it anyway out of an abundance of caution.\r\n\r\n  - I've tried to avoid passing GameObjects into routines to be modified;\r\n    instead, I try to return data structures for collation/application\r\n    to game objects in fewer locations so it's easier to see exactly what\r\n    is modified and when. This also allows us to defer changes in some cases\r\n    until we have collected other information that may be relevant.\r\n\r\n  - ReadX3D() returns scene GameObject, and the processed XmlDocument; the\r\n    latter is important if we want to modify the X3D file and save the\r\n    results in as close to the original form as possible.\r\n\r\n  - Reworked ReadIndexedFaceSet(); now handles meshes with > 2^16 vertices\r\n    by creating child objects for each (sub-)mesh.\r\n\r\n  - Added rudimentary texture support. This can require some notion of\r\n    what the current directory path is, so some routines now have a\r\n    \"filepathPrefix\" parameter.","created_at":"2019-05-28T15:56:01Z","updated_at":"2019-05-29T08:51:43Z","closed_at":null,"merged_at":null,"merge_commit_sha":"665b3e4a3abe3e1a79d37056d18e6d2d06b97aad","assignee":{"login":"thefranke","id":834956,"node_id":"MDQ6VXNlcjgzNDk1Ng==","avatar_url":"https://avatars0.githubusercontent.com/u/834956?v=4","gravatar_id":"","url":"https://api.github.com/users/thefranke","html_url":"https://github.com/thefranke","followers_url":"https://api.github.com/users/thefranke/followers","following_url":"https://api.github.com/users/thefranke/following{/other_user}","gists_url":"https://api.github.com/users/thefranke/gists{/gist_id}","starred_url":"https://api.github.com/users/thefranke/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thefranke/subscriptions","organizations_url":"https://api.github.com/users/thefranke/orgs","repos_url":"https://api.github.com/users/thefranke/repos","events_url":"https://api.github.com/users/thefranke/events{/privacy}","received_events_url":"https://api.github.com/users/thefranke/received_events","type":"User","site_admin":false},"assignees":[{"login":"thefranke","id":834956,"node_id":"MDQ6VXNlcjgzNDk1Ng==","avatar_url":"https://avatars0.githubusercontent.com/u/834956?v=4","gravatar_id":"","url":"https://api.github.com/users/thefranke","html_url":"https://github.com/thefranke","followers_url":"https://api.github.com/users/thefranke/followers","following_url":"https://api.github.com/users/thefranke/following{/other_user}","gists_url":"https://api.github.com/users/thefranke/gists{/gist_id}","starred_url":"https://api.github.com/users/thefranke/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thefranke/subscriptions","organizations_url":"https://api.github.com/users/thefranke/orgs","repos_url":"https://api.github.com/users/thefranke/repos","events_url":"https://api.github.com/users/thefranke/events{/privacy}","received_events_url":"https://api.github.com/users/thefranke/received_events","type":"User","site_admin":false}],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/thefranke/unityx3d/pulls/3/commits","review_comments_url":"https://api.github.com/repos/thefranke/unityx3d/pulls/3/comments","review_comment_url":"https://api.github.com/repos/thefranke/unityx3d/pulls/comments{/number}","comments_url":"https://api.github.com/repos/thefranke/unityx3d/issues/3/comments","statuses_url":"https://api.github.com/repos/thefranke/unityx3d/statuses/75fbb4fee3a7f7b23db6d52191e9815a1ed590a9","head":{"label":"JohnGrime:master","ref":"master","sha":"75fbb4fee3a7f7b23db6d52191e9815a1ed590a9","user":{"login":"JohnGrime","id":4098291,"node_id":"MDQ6VXNlcjQwOTgyOTE=","avatar_url":"https://avatars2.githubusercontent.com/u/4098291?v=4","gravatar_id":"","url":"https://api.github.com/users/JohnGrime","html_url":"https://github.com/JohnGrime","followers_url":"https://api.github.com/users/JohnGrime/followers","following_url":"https://api.github.com/users/JohnGrime/following{/other_user}","gists_url":"https://api.github.com/users/JohnGrime/gists{/gist_id}","starred_url":"https://api.github.com/users/JohnGrime/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JohnGrime/subscriptions","organizations_url":"https://api.github.com/users/JohnGrime/orgs","repos_url":"https://api.github.com/users/JohnGrime/repos","events_url":"https://api.github.com/users/JohnGrime/events{/privacy}","received_events_url":"https://api.github.com/users/JohnGrime/received_events","type":"User","site_admin":false},"repo":{"id":189055599,"node_id":"MDEwOlJlcG9zaXRvcnkxODkwNTU1OTk=","name":"unityx3d","full_name":"JohnGrime/unityx3d","private":false,"owner":{"login":"JohnGrime","id":4098291,"node_id":"MDQ6VXNlcjQwOTgyOTE=","avatar_url":"https://avatars2.githubusercontent.com/u/4098291?v=4","gravatar_id":"","url":"https://api.github.com/users/JohnGrime","html_url":"https://github.com/JohnGrime","followers_url":"https://api.github.com/users/JohnGrime/followers","following_url":"https://api.github.com/users/JohnGrime/following{/other_user}","gists_url":"https://api.github.com/users/JohnGrime/gists{/gist_id}","starred_url":"https://api.github.com/users/JohnGrime/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/JohnGrime/subscriptions","organizations_url":"https://api.github.com/users/JohnGrime/orgs","repos_url":"https://api.github.com/users/JohnGrime/repos","events_url":"https://api.github.com/users/JohnGrime/events{/privacy}","received_events_url":"https://api.github.com/users/JohnGrime/received_events","type":"User","site_admin":false},"html_url":"https://github.com/JohnGrime/unityx3d","description":"A script to import/export X3D to/from Unity","fork":true,"url":"https://api.github.com/repos/JohnGrime/unityx3d","forks_url":"https://api.github.com/repos/JohnGrime/unityx3d/forks","keys_url":"https://api.github.com/repos/JohnGrime/unityx3d/keys{/key_id}","collaborators_url":"https://api.github.com/repos/JohnGrime/unityx3d/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/JohnGrime/unityx3d/teams","hooks_url":"https://api.github.com/repos/JohnGrime/unityx3d/hooks","issue_events_url":"https://api.github.com/repos/JohnGrime/unityx3d/issues/events{/number}","events_url":"https://api.github.com/repos/JohnGrime/unityx3d/events","assignees_url":"https://api.github.com/repos/JohnGrime/unityx3d/assignees{/user}","branches_url":"https://api.github.com/repos/JohnGrime/unityx3d/branches{/branch}","tags_url":"https://api.github.com/repos/JohnGrime/unityx3d/tags","blobs_url":"https://api.github.com/repos/JohnGrime/unityx3d/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/JohnGrime/unityx3d/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/JohnGrime/unityx3d/git/refs{/sha}","trees_url":"https://api.github.com/repos/JohnGrime/unityx3d/git/trees{/sha}","statuses_url":"https://api.github.com/repos/JohnGrime/unityx3d/statuses/{sha}","languages_url":"https://api.github.com/repos/JohnGrime/unityx3d/languages","stargazers_url":"https://api.github.com/repos/JohnGrime/unityx3d/stargazers","contributors_url":"https://api.github.com/repos/JohnGrime/unityx3d/contributors","subscribers_url":"https://api.github.com/repos/JohnGrime/unityx3d/subscribers","subscription_url":"https://api.github.com/repos/JohnGrime/unityx3d/subscription","commits_url":"https://api.github.com/repos/JohnGrime/unityx3d/commits{/sha}","git_commits_url":"https://api.github.com/repos/JohnGrime/unityx3d/git/commits{/sha}","comments_url":"https://api.github.com/repos/JohnGrime/unityx3d/comments{/number}","issue_comment_url":"https://api.github.com/repos/JohnGrime/unityx3d/issues/comments{/number}","contents_url":"https://api.github.com/repos/JohnGrime/unityx3d/contents/{+path}","compare_url":"https://api.github.com/repos/JohnGrime/unityx3d/compare/{base}...{head}","merges_url":"https://api.github.com/repos/JohnGrime/unityx3d/merges","archive_url":"https://api.github.com/repos/JohnGrime/unityx3d/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/JohnGrime/unityx3d/downloads","issues_url":"https://api.github.com/repos/JohnGrime/unityx3d/issues{/number}","pulls_url":"https://api.github.com/repos/JohnGrime/unityx3d/pulls{/number}","milestones_url":"https://api.github.com/repos/JohnGrime/unityx3d/milestones{/number}","notifications_url":"https://api.github.com/repos/JohnGrime/unityx3d/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/JohnGrime/unityx3d/labels{/name}","releases_url":"https://api.github.com/repos/JohnGrime/unityx3d/releases{/id}","deployments_url":"https://api.github.com/repos/JohnGrime/unityx3d/deployments","created_at":"2019-05-28T15:29:35Z","updated_at":"2019-05-28T15:50:28Z","pushed_at":"2019-05-28T15:50:26Z","git_url":"git://github.com/JohnGrime/unityx3d.git","ssh_url":"git@github.com:JohnGrime/unityx3d.git","clone_url":"https://github.com/JohnGrime/unityx3d.git","svn_url":"https://github.com/JohnGrime/unityx3d","homepage":null,"size":32,"stargazers_count":0,"watchers_count":0,"language":"C#","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":0,"license":null,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"thefranke:master","ref":"master","sha":"4b3a98886f1f351dd1b952da3cf4114aa226fff4","user":{"login":"thefranke","id":834956,"node_id":"MDQ6VXNlcjgzNDk1Ng==","avatar_url":"https://avatars0.githubusercontent.com/u/834956?v=4","gravatar_id":"","url":"https://api.github.com/users/thefranke","html_url":"https://github.com/thefranke","followers_url":"https://api.github.com/users/thefranke/followers","following_url":"https://api.github.com/users/thefranke/following{/other_user}","gists_url":"https://api.github.com/users/thefranke/gists{/gist_id}","starred_url":"https://api.github.com/users/thefranke/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thefranke/subscriptions","organizations_url":"https://api.github.com/users/thefranke/orgs","repos_url":"https://api.github.com/users/thefranke/repos","events_url":"https://api.github.com/users/thefranke/events{/privacy}","received_events_url":"https://api.github.com/users/thefranke/received_events","type":"User","site_admin":false},"repo":{"id":39592665,"node_id":"MDEwOlJlcG9zaXRvcnkzOTU5MjY2NQ==","name":"unityx3d","full_name":"thefranke/unityx3d","private":false,"owner":{"login":"thefranke","id":834956,"node_id":"MDQ6VXNlcjgzNDk1Ng==","avatar_url":"https://avatars0.githubusercontent.com/u/834956?v=4","gravatar_id":"","url":"https://api.github.com/users/thefranke","html_url":"https://github.com/thefranke","followers_url":"https://api.github.com/users/thefranke/followers","following_url":"https://api.github.com/users/thefranke/following{/other_user}","gists_url":"https://api.github.com/users/thefranke/gists{/gist_id}","starred_url":"https://api.github.com/users/thefranke/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thefranke/subscriptions","organizations_url":"https://api.github.com/users/thefranke/orgs","repos_url":"https://api.github.com/users/thefranke/repos","events_url":"https://api.github.com/users/thefranke/events{/privacy}","received_events_url":"https://api.github.com/users/thefranke/received_events","type":"User","site_admin":false},"html_url":"https://github.com/thefranke/unityx3d","description":"A script to import/export X3D to/from Unity","fork":false,"url":"https://api.github.com/repos/thefranke/unityx3d","forks_url":"https://api.github.com/repos/thefranke/unityx3d/forks","keys_url":"https://api.github.com/repos/thefranke/unityx3d/keys{/key_id}","collaborators_url":"https://api.github.com/repos/thefranke/unityx3d/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/thefranke/unityx3d/teams","hooks_url":"https://api.github.com/repos/thefranke/unityx3d/hooks","issue_events_url":"https://api.github.com/repos/thefranke/unityx3d/issues/events{/number}","events_url":"https://api.github.com/repos/thefranke/unityx3d/events","assignees_url":"https://api.github.com/repos/thefranke/unityx3d/assignees{/user}","branches_url":"https://api.github.com/repos/thefranke/unityx3d/branches{/branch}","tags_url":"https://api.github.com/repos/thefranke/unityx3d/tags","blobs_url":"https://api.github.com/repos/thefranke/unityx3d/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/thefranke/unityx3d/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/thefranke/unityx3d/git/refs{/sha}","trees_url":"https://api.github.com/repos/thefranke/unityx3d/git/trees{/sha}","statuses_url":"https://api.github.com/repos/thefranke/unityx3d/statuses/{sha}","languages_url":"https://api.github.com/repos/thefranke/unityx3d/languages","stargazers_url":"https://api.github.com/repos/thefranke/unityx3d/stargazers","contributors_url":"https://api.github.com/repos/thefranke/unityx3d/contributors","subscribers_url":"https://api.github.com/repos/thefranke/unityx3d/subscribers","subscription_url":"https://api.github.com/repos/thefranke/unityx3d/subscription","commits_url":"https://api.github.com/repos/thefranke/unityx3d/commits{/sha}","git_commits_url":"https://api.github.com/repos/thefranke/unityx3d/git/commits{/sha}","comments_url":"https://api.github.com/repos/thefranke/unityx3d/comments{/number}","issue_comment_url":"https://api.github.com/repos/thefranke/unityx3d/issues/comments{/number}","contents_url":"https://api.github.com/repos/thefranke/unityx3d/contents/{+path}","compare_url":"https://api.github.com/repos/thefranke/unityx3d/compare/{base}...{head}","merges_url":"https://api.github.com/repos/thefranke/unityx3d/merges","archive_url":"https://api.github.com/repos/thefranke/unityx3d/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/thefranke/unityx3d/downloads","issues_url":"https://api.github.com/repos/thefranke/unityx3d/issues{/number}","pulls_url":"https://api.github.com/repos/thefranke/unityx3d/pulls{/number}","milestones_url":"https://api.github.com/repos/thefranke/unityx3d/milestones{/number}","notifications_url":"https://api.github.com/repos/thefranke/unityx3d/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/thefranke/unityx3d/labels{/name}","releases_url":"https://api.github.com/repos/thefranke/unityx3d/releases{/id}","deployments_url":"https://api.github.com/repos/thefranke/unityx3d/deployments","created_at":"2015-07-23T21:02:26Z","updated_at":"2019-03-16T15:40:51Z","pushed_at":"2019-05-28T15:56:02Z","git_url":"git://github.com/thefranke/unityx3d.git","ssh_url":"git@github.com:thefranke/unityx3d.git","clone_url":"https://github.com/thefranke/unityx3d.git","svn_url":"https://github.com/thefranke/unityx3d","homepage":null,"size":26,"stargazers_count":16,"watchers_count":16,"language":"C#","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":2,"mirror_url":null,"archived":false,"disabled":false,"open_issues_count":2,"license":null,"forks":2,"open_issues":2,"watchers":16,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/thefranke/unityx3d/pulls/3"},"html":{"href":"https://github.com/thefranke/unityx3d/pull/3"},"issue":{"href":"https://api.github.com/repos/thefranke/unityx3d/issues/3"},"comments":{"href":"https://api.github.com/repos/thefranke/unityx3d/issues/3/comments"},"review_comments":{"href":"https://api.github.com/repos/thefranke/unityx3d/pulls/3/comments"},"review_comment":{"href":"https://api.github.com/repos/thefranke/unityx3d/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/thefranke/unityx3d/pulls/3/commits"},"statuses":{"href":"https://api.github.com/repos/thefranke/unityx3d/statuses/75fbb4fee3a7f7b23db6d52191e9815a1ed590a9"}},"author_association":"NONE"}}
{"actor":{"display_login":"thefranke"}}