code: private void processMesh(
              GVRAssetLoader.AssetRequest assetRequest,
              GVRSceneObject sceneObject,
              int meshId)
      {
          EnumSet<GVRImportSettings> settings = assetRequest.getImportSettings();
          AiMesh aiMesh = mScene.getMeshes().get(meshId);
          GVRMesh mesh = mMeshes[meshId];
          GVRMaterial gvrMaterial = mMaterials[aiMesh.getMaterialIndex()];
  
          if (mesh == null)
          {
              mesh = createMesh(mContext, aiMesh, settings);
              mMeshes[meshId] = mesh;
              if (aiMesh.hasBones() && (mSkeleton != null))
              {
                  GVRSkin skin = processBones(mesh, aiMesh.getBones());
                  if (skin != null)
                  {
                      sceneObject.attachComponent(skin);
                  }
              }
          }
          else
          {
              Log.v("BONE", "instancing mesh %s", sceneObject.getName());
          }
          if (gvrMaterial == null)
          {
              AiMaterial material = mScene.getMaterials().get(aiMesh.getMaterialIndex());
              gvrMaterial = processMaterial(assetRequest, material, aiMesh);
              mMaterials[aiMesh.getMaterialIndex()] = gvrMaterial;
          }
          GVRRenderData renderData = new GVRRenderData(mContext, gvrMaterial);
  
          renderData.setMesh(mesh);
          if (settings.contains(GVRImportSettings.NO_LIGHTING))
          {
              renderData.disableLight();
          }
          sceneObject.attachRenderData(renderData);
          setMeshMorphComponent(mesh, sceneObject, aiMesh);
      }
docs: Helper method to create a new {@link GVRSceneObject} with a given mesh
  
  @param assetRequest
  GVRAssetRequest containing the original request to load the model
  
  @param sceneObject
  The GVRSceneObject to process
  
  @param meshId
  The index of the assimp mesh in the AiScene mesh list