code: public static GVRTexture loadFutureCubemapTexture(
              GVRContext gvrContext, ResourceCache<GVRImage> textureCache,
              GVRAndroidResource resource, int priority,
              Map<String, Integer> faceIndexMap) {
          GVRTexture tex = new GVRTexture(gvrContext);
          GVRImage cached = textureCache.get(resource);
          if (cached != null)
          {
              Log.v("ASSET", "Future Texture: %s loaded from cache", cached.getFileName());
              tex.setImage(cached);
          }
          else
          {
              AsyncCubemapTexture.get().loadTexture(gvrContext,
                      CancelableCallbackWrapper.wrap(GVRCubemapImage.class, tex),
                      resource, priority, faceIndexMap);
  
          }
          return tex;
      }
docs: Load a cube map texture asynchronously.
  
  This is the implementation of
  {@link GVRAssetLoader#loadCubemapTexture(GVRAndroidResource)} - it will
  usually be more convenient (and more efficient) to call that directly.
  
  @param gvrContext
  The GVRF context
  @param textureCache
  Texture cache - may be {@code null}
  @param resource
  A steam containing a zip file which contains six bitmaps. The
  six bitmaps correspond to +x, -x, +y, -y, +z, and -z faces of
  the cube map texture respectively. The default names of the
  six images are "posx.png", "negx.png", "posy.png", "negx.png",
  "posz.png", and "negz.png", which can be changed by calling
  {@link GVRCubemapImage#setFaceNames(String[])}.
  @param priority
  This request's priority. Please see the notes on asynchronous
  priorities in the <a href="package-summary.html#async">package
  description</a>.
  @return A {@link Future} that you can pass to methods like
  {@link GVRShaderData#setMainTexture(Future)}