{"action":"created","comment":{"url":"https://api.github.com/repos/highfidelity/hifi/pulls/comments/23651880","id":23651880,"diff_hunk":"@@ -0,0 +1,336 @@\n+//\r\n+//  Texture.cpp\r\n+//  libraries/gpu/src/gpu\r\n+//\r\n+//  Created by Sam Gateau on 1/17/2015.\r\n+//  Copyright 2014 High Fidelity, Inc.\r\n+//\r\n+//  Distributed under the Apache License, Version 2.0.\r\n+//  See the accompanying file LICENSE or http://www.apache.org/licenses/LICENSE-2.0.html\r\n+//\r\n+\r\n+#include \"Texture.h\"\r\n+#include <math.h>\r\n+#include <QDebug>\r\n+\r\n+using namespace gpu;\r\n+\r\n+Texture::Pixels::Pixels(const Element& format, Size size, const Byte* bytes) :\r\n+    _sysmem(size, bytes),\r\n+    _format(format) {\r\n+}\r\n+\r\n+Texture::Pixels::~Pixels() {\r\n+}\r\n+\r\n+void Texture::Storage::assignTexture(Texture* texture) {\r\n+    _texture = texture;\r\n+}\r\n+\r\n+Stamp Texture::Storage::getStamp(uint16 level) const {\r\n+    PixelsPointer mip = getMip(level);\r\n+    if (mip) {\r\n+        return mip->_sysmem.getStamp();\r\n+    } else {\r\n+        return 0;\r\n+    }\r\n+}\r\n+\r\n+void Texture::Storage::reset() {\r\n+    _mips.clear();\r\n+}\r\n+\r\n+Texture::PixelsPointer Texture::Storage::editMip(uint16 level) {\r\n+    if (level < _mips.size()) {\r\n+        return _mips[level];\r\n+    } else {\r\n+        return PixelsPointer();\r\n+    }\r\n+}\r\n+\r\n+const Texture::PixelsPointer Texture::Storage::getMip(uint16 level) const {\r\n+    if (level < _mips.size()) {\r\n+        return _mips[level];\r\n+    } else {\r\n+        return PixelsPointer();\r\n+    }\r\n+}\r\n+\r\n+bool Texture::Storage::isMipAvailable(uint16 level) const {\r\n+    PixelsPointer mip = getMip(level);\r\n+    return (mip && mip->_sysmem.getSize());\r\n+}\r\n+\r\n+bool Texture::Storage::allocateMip(uint16 level) {\r\n+    bool changed = false;\r\n+    if (level >= _mips.size()) {\r\n+        _mips.resize(level+1, PixelsPointer());\r\n+        changed = true;\r\n+    }\r\n+\r\n+    if (!_mips[level]) {\r\n+        _mips[level] = PixelsPointer(new Pixels());\r\n+        changed = true;\r\n+    }\r\n+\r\n+    return changed;\r\n+}\r\n+\r\n+bool Texture::Storage::assignMipData(uint16 level, const Element& format, Size size, const Byte* bytes) {\r\n+        // Ok we should be able to do that...\r\n+    allocateMip(level);\r\n+    _mips[level]->_format = format;\r\n+    Size allocated = _mips[level]->_sysmem.setData(size, bytes);\r\n+    return allocated == size;\r\n+}\r\n+\r\n+Texture* Texture::create1D(const Element& texelFormat, uint16 width) {\r\n+    return create(TEX_1D, texelFormat, width, 1, 1, 1, 1);\r\n+}\r\n+\r\n+Texture* Texture::create2D(const Element& texelFormat, uint16 width, uint16 height) {\r\n+    return create(TEX_2D, texelFormat, width, height, 1, 1, 1);\r\n+}\r\n+\r\n+Texture* Texture::create3D(const Element& texelFormat, uint16 width, uint16 height, uint16 depth) {\r\n+    return create(TEX_3D, texelFormat, width, height, depth, 1, 1);\r\n+}\r\n+\r\n+Texture* Texture::createCube(const Element& texelFormat, uint16 width) {\r\n+    return create(TEX_CUBE, texelFormat, width, width, 1, 1, 1);\r\n+}\r\n+\r\n+Texture* Texture::create(Type type, const Element& texelFormat, uint16 width, uint16 height, uint16 depth, uint16 numSamples, uint16 numSlices)\r\n+{\r\n+    Texture* tex = new Texture();\r\n+    tex->_storage.reset(new Storage());\r\n+    tex->_storage->_texture = tex;\r\n+    tex->_type = type;\r\n+    tex->_maxMip = 0;\r\n+    tex->resize(type, texelFormat, width, height, depth, numSamples, numSlices);\r\n+\r\n+    return tex;\r\n+}\r\n+\r\n+Texture* Texture::createFromStorage(Storage* storage) {\r\n+   Texture* tex = new Texture();\r\n+   tex->_storage.reset(storage);\r\n+   storage->assignTexture(tex);\r\n+   return tex;\r\n+}\r\n+\r\n+Texture::Texture():\r\n+    Resource(),\r\n+    _storage(),\r\n+    _stamp(0),\r\n+    _size(0),\r\n+    _width(1),\r\n+    _height(1),\r\n+    _depth(1),\r\n+    _numSamples(1),\r\n+    _numSlices(1),\r\n+    _maxMip(0),\r\n+    _type(TEX_1D),\r\n+    _autoGenerateMips(false),\r\n+    _defined(false)\r\n+{\r\n+}\r\n+\r\n+Texture::~Texture()\r\n+{\r\n+}\r\n+\r\n+Texture::Size Texture::resize(Type type, const Element& texelFormat, uint16 width, uint16 height, uint16 depth, uint16 numSamples, uint16 numSlices) {\r\n+    if (width && height && depth && numSamples && numSlices) {\r\n+        bool changed = false;\r\n+\r\n+        if ( _type != type) {\r\n+            _type = type;\r\n+            changed = true;\r\n+        }\r\n+\r\n+        if (_numSlices != numSlices) {\r\n+            _numSlices = numSlices;\r\n+            changed = true;\r\n+        }\r\n+\r\n+        numSamples = evalNumSamplesUsed(numSamples);\r\n+        if ((_type >= TEX_2D) && (_numSamples != numSamples)) {\r\n+            _numSamples = numSamples;\r\n+            changed = true;\r\n+        }\r\n+\r\n+        if (_width != width) {\r\n+            _width = width;\r\n+            changed = true;\r\n+        }\r\n+\r\n+        if ((_type >= TEX_2D) && (_height != height)) {\r\n+            _height = height;\r\n+            changed = true;\r\n+        }\r\n+\r\n+\r\n+        if ((_type >= TEX_3D) && (_depth != depth)) {\r\n+            _depth = depth;\r\n+            changed = true;\r\n+        }\r\n+\r\n+        // Evaluate the new size with the new format\r\n+        const int DIM_SIZE[] = {1, 1, 1, 6};\r\n+        int size = DIM_SIZE[_type] *_width * _height * _depth * _numSamples * texelFormat.getSize();\r\n+\r\n+        // If size change then we need to reset \r\n+        if (changed || (size != getSize())) {\r\n+            _size = size;\r\n+            _storage->reset();\r\n+            _stamp++;\r\n+        }\r\n+\r\n+        // TexelFormat might have change, but it's mostly interpretation\r\n+        if (texelFormat != _texelFormat) {\r\n+            _texelFormat = texelFormat;\r\n+            _stamp++;\r\n+        }\r\n+\r\n+        // Here the Texture has been fully defined from the gpu point of view (size and format)\r\n+         _defined = true;\r\n+    } else {\r\n+         _stamp++;\r\n+    }\r\n+\r\n+    return _size;\r\n+}\r\n+\r\n+Texture::Size Texture::resize1D(uint16 width, uint16 numSamples) {\r\n+    return resize(TEX_1D, getTexelFormat(), width, 1, 1, numSamples, 1);\r\n+}\r\n+Texture::Size Texture::resize2D(uint16 width, uint16 height, uint16 numSamples) {\r\n+    return resize(TEX_2D, getTexelFormat(), width, height, 1, numSamples, 1);\r\n+}\r\n+Texture::Size Texture::resize3D(uint16 width, uint16 height, uint16 depth, uint16 numSamples) {\r\n+    return resize(TEX_3D, getTexelFormat(), width, height, depth, numSamples, 1);\r\n+}\r\n+Texture::Size Texture::resizeCube(uint16 width, uint16 numSamples) {\r\n+    return resize(TEX_CUBE, getTexelFormat(), width, 1, 1, numSamples, 1);\r\n+}\r\n+\r\n+Texture::Size Texture::reformat(const Element& texelFormat) {\r\n+    return resize(_type, texelFormat, getWidth(), getHeight(), getDepth(), getNumSamples(), getNumSlices());\r\n+}\r\n+\r\n+bool Texture::isColorRenderTarget() const {\r\n+    return (_texelFormat.getSemantic() == gpu::RGBA);\r\n+}\r\n+\r\n+bool Texture::isDepthStencilRenderTarget() const {\r\n+    return (_texelFormat.getSemantic() == gpu::DEPTH) || (_texelFormat.getSemantic() == gpu::DEPTH_STENCIL);\r\n+}\r\n+\r\n+uint16 Texture::evalDimNumMips(uint16 size) {\r\n+    double largerDim = size;\r\n+    double val = log(largerDim)/log(2.0);\r\n+    return 1 + (uint16) val;\r\n+}\r\n+\r\n+// The number mips that the texture could have if all existed\r\n+// = log2(max(width, height, depth))\r\n+uint16 Texture::evalNumMips() const {\r\n+    double largerDim = std::max(std::max(_width, _height), _depth);\r\n+    double val = log(largerDim)/log(2.0);\r\n+    return 1 + (uint16) val;\r\n+}\r\n+\r\n+uint16 Texture::maxMip() const {\r\n+    return _maxMip;\r\n+}\r\n+\r\n+bool Texture::assignStoredMip(uint16 level, const Element& format, Size size, const Byte* bytes) {\r\n+    // Check that level accessed make sense\r\n+    if (level != 0) {\r\n+        if (_autoGenerateMips) {\r\n+            return false;\r\n+        }\r\n+        if (level >= evalNumMips()) {\r\n+            return false;\r\n+        }\r\n+    }\r\n+\r\n+    // THen check that the mem buffer passed make sense with its format\r\n+    if (size == evalStoredMipSize(level, format)) {\r\n+        _storage->assignMipData(level, format, size, bytes);\r\n+        _stamp++;\r\n+        return true;\r\n+    }\r\n+\r\n+    return false;\r\n+}\r\n+\r\n+uint16 Texture::autoGenerateMips(uint16 maxMip) {\r\n+    _autoGenerateMips = true;\r\n+    _maxMip = std::min((uint16) (evalNumMips() - 1), maxMip);\r\n+    _stamp++;\r\n+    return _maxMip;\r\n+}\r\n+\r\n+uint16 Texture::getStoredMipWidth(uint16 level) const {\r\n+    PixelsPointer mip = accessStoredMip(level);\r\n+    if (mip && mip->_sysmem.getSize()) {\r\n+        return evalMipWidth(level);\r\n+    } else {\r\n+        return 0;\r\n+    }\r\n+}\r\n+\r\n+uint16 Texture::getStoredMipHeight(uint16 level) const {\r\n+    PixelsPointer mip = accessStoredMip(level);\r\n+    if (mip && mip->_sysmem.getSize()) {\r\n+        return evalMipHeight(level);\r\n+    } else {\r\n+        return 0;\r\n+    }\r\n+}\r\n+\r\n+uint16 Texture::getStoredMipDepth(uint16 level) const {\r\n+    PixelsPointer mip = accessStoredMip(level);\r\n+    if (mip && mip->_sysmem.getSize()) {\r\n+        return evalMipDepth(level);\r\n+    } else {\r\n+        return 0;\r","path":"libraries/gpu/src/gpu/Texture.cpp","position":299,"original_position":299,"commit_id":"1a044b4ea691670bfa2edcb5850749138aacbcec","original_commit_id":"1a044b4ea691670bfa2edcb5850749138aacbcec","user":{"login":"ZappoMan","id":2093195,"avatar_url":"https://avatars.githubusercontent.com/u/2093195?v=3","gravatar_id":"","url":"https://api.github.com/users/ZappoMan","html_url":"https://github.com/ZappoMan","followers_url":"https://api.github.com/users/ZappoMan/followers","following_url":"https://api.github.com/users/ZappoMan/following{/other_user}","gists_url":"https://api.github.com/users/ZappoMan/gists{/gist_id}","starred_url":"https://api.github.com/users/ZappoMan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ZappoMan/subscriptions","organizations_url":"https://api.github.com/users/ZappoMan/orgs","repos_url":"https://api.github.com/users/ZappoMan/repos","events_url":"https://api.github.com/users/ZappoMan/events{/privacy}","received_events_url":"https://api.github.com/users/ZappoMan/received_events","type":"User","site_admin":false},"body":"let's have return at end of function... recommended rewrite...\r\n```\r\nif (..) {\r\n    return ...\r\n}\r\nreturn 0;\r\n```","created_at":"2015-01-27T23:06:49Z","updated_at":"2015-01-27T23:06:49Z","html_url":"https://github.com/highfidelity/hifi/pull/4160#discussion_r23651880","pull_request_url":"https://api.github.com/repos/highfidelity/hifi/pulls/4160","_links":{"self":{"href":"https://api.github.com/repos/highfidelity/hifi/pulls/comments/23651880"},"html":{"href":"https://github.com/highfidelity/hifi/pull/4160#discussion_r23651880"},"pull_request":{"href":"https://api.github.com/repos/highfidelity/hifi/pulls/4160"}}},"pull_request":{"url":"https://api.github.com/repos/highfidelity/hifi/pulls/4160","id":27969634,"html_url":"https://github.com/highfidelity/hifi/pull/4160","diff_url":"https://github.com/highfidelity/hifi/pull/4160.diff","patch_url":"https://github.com/highfidelity/hifi/pull/4160.patch","issue_url":"https://api.github.com/repos/highfidelity/hifi/issues/4160","number":4160,"state":"open","locked":false,"title":"Introducing the gpu::Texture class and using it for model rendering","user":{"login":"samcake","id":2230265,"avatar_url":"https://avatars.githubusercontent.com/u/2230265?v=3","gravatar_id":"","url":"https://api.github.com/users/samcake","html_url":"https://github.com/samcake","followers_url":"https://api.github.com/users/samcake/followers","following_url":"https://api.github.com/users/samcake/following{/other_user}","gists_url":"https://api.github.com/users/samcake/gists{/gist_id}","starred_url":"https://api.github.com/users/samcake/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/samcake/subscriptions","organizations_url":"https://api.github.com/users/samcake/orgs","repos_url":"https://api.github.com/users/samcake/repos","events_url":"https://api.github.com/users/samcake/events{/privacy}","received_events_url":"https://api.github.com/users/samcake/received_events","type":"User","site_admin":false},"body":"- Introduce the gpu::Texture class \r\n   gpu::Texture is a gpu::Resource equivalent to the GLuint representing a Texture from GL\r\n\r\n- Introduce the gpu::Texture instead of the GLuint _id in the NetworkTexture class and also replace all the opengl code to load and create the GL texture using the equivalent from gpu::Texture\r\n\r\n- Introduce the gpu::Batch:;setUniformTexture allowing to bind a gpu:;Texture to a specific slot, it's equivalent to\r\n -- Checking the gpu::Texture and creating the corresponding GL object underneath if not created yet\r\n -- THen activate the Texture unit corresponding to the slot\r\n-- Bind the texture\r\n\r\n- Added support for gamma correction and loading texture as srgb but not activated yet\r\n ","created_at":"2015-01-24T02:04:54Z","updated_at":"2015-01-27T23:06:49Z","closed_at":null,"merged_at":null,"merge_commit_sha":"35967ce100b44bb84752297053273d28901bea2e","assignee":{"login":"ZappoMan","id":2093195,"avatar_url":"https://avatars.githubusercontent.com/u/2093195?v=3","gravatar_id":"","url":"https://api.github.com/users/ZappoMan","html_url":"https://github.com/ZappoMan","followers_url":"https://api.github.com/users/ZappoMan/followers","following_url":"https://api.github.com/users/ZappoMan/following{/other_user}","gists_url":"https://api.github.com/users/ZappoMan/gists{/gist_id}","starred_url":"https://api.github.com/users/ZappoMan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ZappoMan/subscriptions","organizations_url":"https://api.github.com/users/ZappoMan/orgs","repos_url":"https://api.github.com/users/ZappoMan/repos","events_url":"https://api.github.com/users/ZappoMan/events{/privacy}","received_events_url":"https://api.github.com/users/ZappoMan/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/highfidelity/hifi/pulls/4160/commits","review_comments_url":"https://api.github.com/repos/highfidelity/hifi/pulls/4160/comments","review_comment_url":"https://api.github.com/repos/highfidelity/hifi/pulls/comments/{number}","comments_url":"https://api.github.com/repos/highfidelity/hifi/issues/4160/comments","statuses_url":"https://api.github.com/repos/highfidelity/hifi/statuses/1a044b4ea691670bfa2edcb5850749138aacbcec","head":{"label":"samcake:temp0","ref":"temp0","sha":"1a044b4ea691670bfa2edcb5850749138aacbcec","user":{"login":"samcake","id":2230265,"avatar_url":"https://avatars.githubusercontent.com/u/2230265?v=3","gravatar_id":"","url":"https://api.github.com/users/samcake","html_url":"https://github.com/samcake","followers_url":"https://api.github.com/users/samcake/followers","following_url":"https://api.github.com/users/samcake/following{/other_user}","gists_url":"https://api.github.com/users/samcake/gists{/gist_id}","starred_url":"https://api.github.com/users/samcake/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/samcake/subscriptions","organizations_url":"https://api.github.com/users/samcake/orgs","repos_url":"https://api.github.com/users/samcake/repos","events_url":"https://api.github.com/users/samcake/events{/privacy}","received_events_url":"https://api.github.com/users/samcake/received_events","type":"User","site_admin":false},"repo":{"id":24736064,"name":"hifi","full_name":"samcake/hifi","owner":{"login":"samcake","id":2230265,"avatar_url":"https://avatars.githubusercontent.com/u/2230265?v=3","gravatar_id":"","url":"https://api.github.com/users/samcake","html_url":"https://github.com/samcake","followers_url":"https://api.github.com/users/samcake/followers","following_url":"https://api.github.com/users/samcake/following{/other_user}","gists_url":"https://api.github.com/users/samcake/gists{/gist_id}","starred_url":"https://api.github.com/users/samcake/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/samcake/subscriptions","organizations_url":"https://api.github.com/users/samcake/orgs","repos_url":"https://api.github.com/users/samcake/repos","events_url":"https://api.github.com/users/samcake/events{/privacy}","received_events_url":"https://api.github.com/users/samcake/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/samcake/hifi","description":"Open, decentralized virtual worlds using sensors to control avatars and dynamically assigned devices as servers.  San Francisco based startup, we are hiring: http://highfidelity.io/jobs  Contribute by reporting bugs & doing jobs on http://worklist.net","fork":true,"url":"https://api.github.com/repos/samcake/hifi","forks_url":"https://api.github.com/repos/samcake/hifi/forks","keys_url":"https://api.github.com/repos/samcake/hifi/keys{/key_id}","collaborators_url":"https://api.github.com/repos/samcake/hifi/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/samcake/hifi/teams","hooks_url":"https://api.github.com/repos/samcake/hifi/hooks","issue_events_url":"https://api.github.com/repos/samcake/hifi/issues/events{/number}","events_url":"https://api.github.com/repos/samcake/hifi/events","assignees_url":"https://api.github.com/repos/samcake/hifi/assignees{/user}","branches_url":"https://api.github.com/repos/samcake/hifi/branches{/branch}","tags_url":"https://api.github.com/repos/samcake/hifi/tags","blobs_url":"https://api.github.com/repos/samcake/hifi/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/samcake/hifi/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/samcake/hifi/git/refs{/sha}","trees_url":"https://api.github.com/repos/samcake/hifi/git/trees{/sha}","statuses_url":"https://api.github.com/repos/samcake/hifi/statuses/{sha}","languages_url":"https://api.github.com/repos/samcake/hifi/languages","stargazers_url":"https://api.github.com/repos/samcake/hifi/stargazers","contributors_url":"https://api.github.com/repos/samcake/hifi/contributors","subscribers_url":"https://api.github.com/repos/samcake/hifi/subscribers","subscription_url":"https://api.github.com/repos/samcake/hifi/subscription","commits_url":"https://api.github.com/repos/samcake/hifi/commits{/sha}","git_commits_url":"https://api.github.com/repos/samcake/hifi/git/commits{/sha}","comments_url":"https://api.github.com/repos/samcake/hifi/comments{/number}","issue_comment_url":"https://api.github.com/repos/samcake/hifi/issues/comments/{number}","contents_url":"https://api.github.com/repos/samcake/hifi/contents/{+path}","compare_url":"https://api.github.com/repos/samcake/hifi/compare/{base}...{head}","merges_url":"https://api.github.com/repos/samcake/hifi/merges","archive_url":"https://api.github.com/repos/samcake/hifi/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/samcake/hifi/downloads","issues_url":"https://api.github.com/repos/samcake/hifi/issues{/number}","pulls_url":"https://api.github.com/repos/samcake/hifi/pulls{/number}","milestones_url":"https://api.github.com/repos/samcake/hifi/milestones{/number}","notifications_url":"https://api.github.com/repos/samcake/hifi/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/samcake/hifi/labels{/name}","releases_url":"https://api.github.com/repos/samcake/hifi/releases{/id}","created_at":"2014-10-02T20:49:37Z","updated_at":"2015-01-16T19:20:17Z","pushed_at":"2015-01-24T07:31:49Z","git_url":"git://github.com/samcake/hifi.git","ssh_url":"git@github.com:samcake/hifi.git","clone_url":"https://github.com/samcake/hifi.git","svn_url":"https://github.com/samcake/hifi","homepage":"","size":129617,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"highfidelity:master","ref":"master","sha":"18e0a91ea85649094105cf75f61a228d79d748cb","user":{"login":"highfidelity","id":1565370,"avatar_url":"https://avatars.githubusercontent.com/u/1565370?v=3","gravatar_id":"","url":"https://api.github.com/users/highfidelity","html_url":"https://github.com/highfidelity","followers_url":"https://api.github.com/users/highfidelity/followers","following_url":"https://api.github.com/users/highfidelity/following{/other_user}","gists_url":"https://api.github.com/users/highfidelity/gists{/gist_id}","starred_url":"https://api.github.com/users/highfidelity/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/highfidelity/subscriptions","organizations_url":"https://api.github.com/users/highfidelity/orgs","repos_url":"https://api.github.com/users/highfidelity/repos","events_url":"https://api.github.com/users/highfidelity/events{/privacy}","received_events_url":"https://api.github.com/users/highfidelity/received_events","type":"Organization","site_admin":false},"repo":{"id":5372872,"name":"hifi","full_name":"highfidelity/hifi","owner":{"login":"highfidelity","id":1565370,"avatar_url":"https://avatars.githubusercontent.com/u/1565370?v=3","gravatar_id":"","url":"https://api.github.com/users/highfidelity","html_url":"https://github.com/highfidelity","followers_url":"https://api.github.com/users/highfidelity/followers","following_url":"https://api.github.com/users/highfidelity/following{/other_user}","gists_url":"https://api.github.com/users/highfidelity/gists{/gist_id}","starred_url":"https://api.github.com/users/highfidelity/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/highfidelity/subscriptions","organizations_url":"https://api.github.com/users/highfidelity/orgs","repos_url":"https://api.github.com/users/highfidelity/repos","events_url":"https://api.github.com/users/highfidelity/events{/privacy}","received_events_url":"https://api.github.com/users/highfidelity/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/highfidelity/hifi","description":"Open, decentralized virtual worlds using sensors to control avatars and dynamically assigned devices as servers.  San Francisco based startup, we are hiring: http://highfidelity.io/jobs  Documentation at http://docs.highfidelity.io  Contribute by reporting bugs & doing jobs on http://worklist.net","fork":false,"url":"https://api.github.com/repos/highfidelity/hifi","forks_url":"https://api.github.com/repos/highfidelity/hifi/forks","keys_url":"https://api.github.com/repos/highfidelity/hifi/keys{/key_id}","collaborators_url":"https://api.github.com/repos/highfidelity/hifi/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/highfidelity/hifi/teams","hooks_url":"https://api.github.com/repos/highfidelity/hifi/hooks","issue_events_url":"https://api.github.com/repos/highfidelity/hifi/issues/events{/number}","events_url":"https://api.github.com/repos/highfidelity/hifi/events","assignees_url":"https://api.github.com/repos/highfidelity/hifi/assignees{/user}","branches_url":"https://api.github.com/repos/highfidelity/hifi/branches{/branch}","tags_url":"https://api.github.com/repos/highfidelity/hifi/tags","blobs_url":"https://api.github.com/repos/highfidelity/hifi/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/highfidelity/hifi/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/highfidelity/hifi/git/refs{/sha}","trees_url":"https://api.github.com/repos/highfidelity/hifi/git/trees{/sha}","statuses_url":"https://api.github.com/repos/highfidelity/hifi/statuses/{sha}","languages_url":"https://api.github.com/repos/highfidelity/hifi/languages","stargazers_url":"https://api.github.com/repos/highfidelity/hifi/stargazers","contributors_url":"https://api.github.com/repos/highfidelity/hifi/contributors","subscribers_url":"https://api.github.com/repos/highfidelity/hifi/subscribers","subscription_url":"https://api.github.com/repos/highfidelity/hifi/subscription","commits_url":"https://api.github.com/repos/highfidelity/hifi/commits{/sha}","git_commits_url":"https://api.github.com/repos/highfidelity/hifi/git/commits{/sha}","comments_url":"https://api.github.com/repos/highfidelity/hifi/comments{/number}","issue_comment_url":"https://api.github.com/repos/highfidelity/hifi/issues/comments/{number}","contents_url":"https://api.github.com/repos/highfidelity/hifi/contents/{+path}","compare_url":"https://api.github.com/repos/highfidelity/hifi/compare/{base}...{head}","merges_url":"https://api.github.com/repos/highfidelity/hifi/merges","archive_url":"https://api.github.com/repos/highfidelity/hifi/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/highfidelity/hifi/downloads","issues_url":"https://api.github.com/repos/highfidelity/hifi/issues{/number}","pulls_url":"https://api.github.com/repos/highfidelity/hifi/pulls{/number}","milestones_url":"https://api.github.com/repos/highfidelity/hifi/milestones{/number}","notifications_url":"https://api.github.com/repos/highfidelity/hifi/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/highfidelity/hifi/labels{/name}","releases_url":"https://api.github.com/repos/highfidelity/hifi/releases{/id}","created_at":"2012-08-10T18:26:22Z","updated_at":"2015-01-27T22:37:23Z","pushed_at":"2015-01-27T22:37:23Z","git_url":"git://github.com/highfidelity/hifi.git","ssh_url":"git@github.com:highfidelity/hifi.git","clone_url":"https://github.com/highfidelity/hifi.git","svn_url":"https://github.com/highfidelity/hifi","homepage":"","size":176631,"stargazers_count":223,"watchers_count":223,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":129,"mirror_url":null,"open_issues_count":49,"forks":129,"open_issues":49,"watchers":223,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/highfidelity/hifi/pulls/4160"},"html":{"href":"https://github.com/highfidelity/hifi/pull/4160"},"issue":{"href":"https://api.github.com/repos/highfidelity/hifi/issues/4160"},"comments":{"href":"https://api.github.com/repos/highfidelity/hifi/issues/4160/comments"},"review_comments":{"href":"https://api.github.com/repos/highfidelity/hifi/pulls/4160/comments"},"review_comment":{"href":"https://api.github.com/repos/highfidelity/hifi/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/highfidelity/hifi/pulls/4160/commits"},"statuses":{"href":"https://api.github.com/repos/highfidelity/hifi/statuses/1a044b4ea691670bfa2edcb5850749138aacbcec"}}}}