private static Texture2D ExtractHoudiniImageToTexturePNGJPEG(HEU_SessionBase session, HAPI_MaterialInfo materialInfo, string imagePlanes)
		{
			Texture2D textureResult = null;

			HAPI_ImageInfo imageInfo = new HAPI_ImageInfo();
			if (!session.GetImageInfo(materialInfo.nodeId, ref imageInfo))
			{
				return textureResult;
			}

			// This will return null if the current imageInfo file format is supported by Unity, otherwise
			// returns a Unity supported file format.
			string desiredFileFormatName = HEU_MaterialData.GetSupportedFileFormat(session, ref imageInfo);

			imageInfo.gamma = HEU_PluginSettings.ImageGamma;
			session.SetImageInfo(materialInfo.nodeId, ref imageInfo);

			// Download the image into memory buffer
			byte[] imageData = null;
			if (!session.ExtractImageToMemory(materialInfo.nodeId, desiredFileFormatName, imagePlanes, out imageData))
			{
				return textureResult;
			}

			// Upload to Unity
			textureResult = new Texture2D(1, 1);
			textureResult.LoadImage(imageData);

			return textureResult;
		}
	/// <summary>
	/// Returns null if the given image info supports a Unity friendly image format.
	/// Otherwise returns a file format that we know Unity supports.
	/// </summary>
	/// <param name="imageInfo">Image info containing the current image file format</param>
	/// <returns></returns>
	internal static string GetSupportedFileFormat(HEU_SessionBase session, ref HAPI_ImageInfo imageInfo)
	{
	    string desiredFileFormatName = null;

	    string imageInfoFileFormat = HEU_SessionManager.GetString(imageInfo.imageFileFormatNameSH, session);

	    if (!imageInfoFileFormat.Equals(HEU_HAPIConstants.HAPI_PNG_FORMAT_NAME)
		    && !imageInfoFileFormat.Equals(HEU_HAPIConstants.HAPI_JPEG_FORMAT_NAME)
		    && !imageInfoFileFormat.Equals(HEU_HAPIConstants.HAPI_BMP_FORMAT_NAME)
		    && !imageInfoFileFormat.Equals(HEU_HAPIConstants.HAPI_TGA_FORMAT_NAME))
	    {
		desiredFileFormatName = HEU_HAPIConstants.HAPI_PNG_FORMAT_NAME;
	    }
	    return desiredFileFormatName;
	}
		private static Texture2D ExtractHoudiniImageToTextureRaw(HEU_SessionBase session, HAPI_MaterialInfo materialInfo, string imagePlanes)
		{
			Texture2D textureResult = null;

			HAPI_ImageInfo imageInfo = new HAPI_ImageInfo();
			if (!session.GetImageInfo(materialInfo.nodeId, ref imageInfo))
			{
				return textureResult;
			}

			imageInfo.dataFormat = HAPI_ImageDataFormat.HAPI_IMAGE_DATA_INT8;
			imageInfo.interleaved = true;
			imageInfo.packing = HAPI_ImagePacking.HAPI_IMAGE_PACKING_RGBA;
			imageInfo.gamma = HEU_PluginSettings.ImageGamma;

			session.SetImageInfo(materialInfo.nodeId, ref imageInfo);

			// Extract image to buffer
			byte[] imageData = null;
			if (!session.ExtractImageToMemory(materialInfo.nodeId, HEU_Defines.HAPI_RAW_FORMAT_NAME, imagePlanes, out imageData))
			{
				return textureResult;
			}

			int colorDataSize = imageInfo.xRes * imageInfo.yRes;
			if (colorDataSize * 4 != imageData.Length)
			{
				Debug.LogErrorFormat("Extracted image size does not match expected image info size."
					+ " Try using non-raw format for texture extraction.");
				return textureResult;
			}

			Color32[] colorData = new Color32[colorDataSize];
			for (int i = 0; i < colorDataSize; ++i)
			{
				colorData[i].r = imageData[i * 4 + 0];
				colorData[i].g = imageData[i * 4 + 1];
				colorData[i].b = imageData[i * 4 + 2];
				colorData[i].a = imageData[i * 4 + 3];
			}

			textureResult = new Texture2D(imageInfo.xRes, imageInfo.yRes, TextureFormat.ARGB32, false);
			textureResult.SetPixels32(colorData);
			textureResult.Apply();

			return textureResult;
		}
		public static Texture2D ExtractHoudiniImageToTextureFile(HEU_SessionBase session, HAPI_MaterialInfo materialInfo, string imagePlanes, string assetCacheFolderPath)
		{
			Texture2D textureResult = null;

			// Get the Textures folder in the assetCacheFolderPath. Make sure it exists.
			assetCacheFolderPath = HEU_AssetDatabase.AppendTexturesPathToAssetFolder(assetCacheFolderPath);
			HEU_AssetDatabase.CreatePathWithFolders(assetCacheFolderPath);

			// Need to pass in full path to Houdini to write out the file
			assetCacheFolderPath = HEU_AssetDatabase.GetAssetFullPath(assetCacheFolderPath);
			if (assetCacheFolderPath == null)
			{
				return textureResult;
			}

			HAPI_ImageInfo imageInfo = new HAPI_ImageInfo();
			if (!session.GetImageInfo(materialInfo.nodeId, ref imageInfo))
			{
				return textureResult;
			}

			// This will return null if the current imageInfo file format is supported by Unity, otherwise
			// returns a Unity supported file format.
			string desiredFileFormatName = HEU_MaterialData.GetSupportedFileFormat(session, ref imageInfo);

			// Extract image to file
			string writtenFilePath = null;
			if (!session.ExtractImageToFile(materialInfo.nodeId, desiredFileFormatName, imagePlanes, assetCacheFolderPath, out writtenFilePath))
			{
				return textureResult;
			}
			

			HEU_AssetDatabase.SaveAndRefreshDatabase();

			// Convert full path back to relative in order to work with AssetDatabase
			string assetRelativePath = HEU_AssetDatabase.GetAssetRelativePath(writtenFilePath);

			// Re-import to refresh the project
			HEU_AssetDatabase.ImportAsset(assetRelativePath, HEU_AssetDatabase.HEU_ImportAssetOptions.Default);

			textureResult = HEU_AssetDatabase.LoadAssetAtPath(assetRelativePath, typeof(Texture2D)) as Texture2D;
			//Debug.LogFormat("Loaded texture to file {0} with format {1}", writtenFilePath, textureResult != null ? textureResult.format.ToString() : "none");

			return textureResult;
		}
		public virtual bool SetImageInfo(HAPI_NodeId materialNodeID, ref HAPI_ImageInfo imageInfo)
		{
			return false;
		}