forked from cgvr/DeltaVR
		
	
		
			
				
	
	
		
			217 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
			
		
		
	
	
			217 lines
		
	
	
		
			6.3 KiB
		
	
	
	
		
			C#
		
	
	
	
	
	
/************************************************************************************
 | 
						|
 | 
						|
Copyright   :   Copyright (c) Facebook Technologies, LLC and its affiliates. All rights reserved.
 | 
						|
 | 
						|
Licensed under the Oculus SDK License Version 3.4.1 (the "License");
 | 
						|
you may not use the Oculus SDK except in compliance with the License,
 | 
						|
which is provided at the time of installation or download, or which
 | 
						|
otherwise accompanies this software in either electronic or hard copy form.
 | 
						|
 | 
						|
You may obtain a copy of the License at
 | 
						|
 | 
						|
https://developer.oculus.com/licenses/sdk-3.4.1
 | 
						|
 | 
						|
Unless required by applicable law or agreed to in writing, the Oculus SDK
 | 
						|
distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
See the License for the specific language governing permissions and
 | 
						|
limitations under the License.
 | 
						|
 | 
						|
************************************************************************************/
 | 
						|
 | 
						|
using UnityEngine;
 | 
						|
using UnityEditor;
 | 
						|
using System.IO;
 | 
						|
 | 
						|
/// <summary>
 | 
						|
/// From the selected transform, takes a cubemap screenshot that can be submitted with the application
 | 
						|
/// as a screenshot (or additionally used for reflection shaders).
 | 
						|
/// </summary>
 | 
						|
class OVRScreenshotWizard : ScriptableWizard
 | 
						|
{
 | 
						|
	public enum TexFormat
 | 
						|
	{
 | 
						|
		JPEG,	// 512kb at 1k x 1k resolution vs
 | 
						|
		PNG,	// 5.3mb
 | 
						|
	}
 | 
						|
 | 
						|
	public enum SaveMode {
 | 
						|
		SaveCubemapScreenshot,
 | 
						|
		SaveUnityCubemap,
 | 
						|
		SaveBoth,
 | 
						|
	}
 | 
						|
 | 
						|
	public GameObject		renderFrom = null;
 | 
						|
	public int				size = 2048;
 | 
						|
	public SaveMode			saveMode = SaveMode.SaveUnityCubemap;
 | 
						|
	public string			cubeMapFolder = "Assets/Textures/Cubemaps";
 | 
						|
	public TexFormat		textureFormat = TexFormat.PNG;
 | 
						|
 | 
						|
	/// <summary>
 | 
						|
	/// Validates the user's input
 | 
						|
	/// </summary>
 | 
						|
	void OnWizardUpdate()
 | 
						|
	{
 | 
						|
		helpString = "Select a game object positioned in the place where\nyou want to render the cubemap screenshot from: ";
 | 
						|
		isValid = (renderFrom != null);
 | 
						|
	}
 | 
						|
 | 
						|
	/// <summary>
 | 
						|
	/// Create the asset path if it is not available.
 | 
						|
	/// Assuming the newFolderPath is stated with "Assets", which is a requirement.
 | 
						|
	/// </summary>
 | 
						|
 	static bool CreateAssetPath( string newFolderPath )
 | 
						|
	{
 | 
						|
		const  int maxFoldersCount = 32;
 | 
						|
		string currentPath;
 | 
						|
		string[] pathFolders;
 | 
						|
 | 
						|
		pathFolders = newFolderPath.Split (new char[]{ '/' }, maxFoldersCount);
 | 
						|
 | 
						|
		if (!string.Equals ("Assets", pathFolders [0], System.StringComparison.OrdinalIgnoreCase))
 | 
						|
		{
 | 
						|
			Debug.LogError( "Folder path has to be started with \" Assets \" " );
 | 
						|
			return false;
 | 
						|
		}
 | 
						|
 | 
						|
		currentPath = "Assets";
 | 
						|
		for (int i = 1; i < pathFolders.Length; i++)
 | 
						|
		{
 | 
						|
			if (!string.IsNullOrEmpty(pathFolders[i]))
 | 
						|
			{
 | 
						|
				string newPath = currentPath + "/" + pathFolders[i];
 | 
						|
				if (!AssetDatabase.IsValidFolder(newPath))
 | 
						|
					AssetDatabase.CreateFolder(currentPath, pathFolders[i]);
 | 
						|
				currentPath = newPath;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		Debug.Log( "Created path: " + currentPath );
 | 
						|
		return true;
 | 
						|
	}
 | 
						|
 | 
						|
	/// <summary>
 | 
						|
	/// Renders the cubemap
 | 
						|
	/// </summary>
 | 
						|
	void OnWizardCreate()
 | 
						|
	{
 | 
						|
		if ( !AssetDatabase.IsValidFolder( cubeMapFolder ) )
 | 
						|
		{
 | 
						|
			if (!CreateAssetPath(cubeMapFolder))
 | 
						|
			{
 | 
						|
				Debug.LogError( "Created path failed: " + cubeMapFolder );
 | 
						|
				return;
 | 
						|
			}
 | 
						|
		}
 | 
						|
 | 
						|
		bool existingCamera = true;
 | 
						|
		bool existingCameraStateSave = true;
 | 
						|
		Camera camera = renderFrom.GetComponent<Camera>();
 | 
						|
		if (camera == null)
 | 
						|
		{
 | 
						|
			camera = renderFrom.AddComponent<Camera>();
 | 
						|
			camera.farClipPlane = 10000f;
 | 
						|
			existingCamera = false;
 | 
						|
		}
 | 
						|
		else
 | 
						|
		{
 | 
						|
			existingCameraStateSave = camera.enabled;
 | 
						|
			camera.enabled = true;
 | 
						|
		}
 | 
						|
		// find the last screenshot saved
 | 
						|
		if (cubeMapFolder[cubeMapFolder.Length-1] != '/')
 | 
						|
		{
 | 
						|
			cubeMapFolder += "/";
 | 
						|
		}
 | 
						|
		int idx = 0;
 | 
						|
		string[] fileNames = Directory.GetFiles(cubeMapFolder);
 | 
						|
		foreach(string fileName in fileNames)
 | 
						|
		{
 | 
						|
			if (!fileName.ToLower().EndsWith(".cubemap"))
 | 
						|
			{
 | 
						|
				continue;
 | 
						|
			}
 | 
						|
			string temp = fileName.Replace(cubeMapFolder + "vr_screenshot_", string.Empty);
 | 
						|
			temp = temp.Replace(".cubemap", string.Empty);
 | 
						|
			int tempIdx = 0;
 | 
						|
			if (int.TryParse( temp, out tempIdx ))
 | 
						|
			{
 | 
						|
				if (tempIdx > idx)
 | 
						|
				{
 | 
						|
					idx = tempIdx;
 | 
						|
				}
 | 
						|
			}
 | 
						|
		}
 | 
						|
		string pathName = string.Format("{0}vr_screenshot_{1}.cubemap", cubeMapFolder, (++idx).ToString("d2"));
 | 
						|
		Cubemap cubemap = new Cubemap(size, TextureFormat.RGB24, false);
 | 
						|
 | 
						|
		// render into cubemap
 | 
						|
		if ((camera != null) && (cubemap != null))
 | 
						|
		{
 | 
						|
			// set up cubemap defaults
 | 
						|
			OVRCubemapCapture.RenderIntoCubemap(camera, cubemap);
 | 
						|
			if (existingCamera)
 | 
						|
			{
 | 
						|
				camera.enabled = existingCameraStateSave;
 | 
						|
			}
 | 
						|
			else
 | 
						|
			{
 | 
						|
				DestroyImmediate(camera);
 | 
						|
			}
 | 
						|
			// generate a regular texture as well?
 | 
						|
			if ( ( saveMode == SaveMode.SaveCubemapScreenshot ) || ( saveMode == SaveMode.SaveBoth ) )
 | 
						|
			{
 | 
						|
				GenerateTexture(cubemap, pathName);
 | 
						|
			}
 | 
						|
 | 
						|
			if ( ( saveMode == SaveMode.SaveUnityCubemap ) || ( saveMode == SaveMode.SaveBoth ) )
 | 
						|
			{
 | 
						|
				Debug.Log( "Saving: " + pathName );
 | 
						|
				// by default the unity cubemap isn't saved
 | 
						|
				AssetDatabase.CreateAsset( cubemap, pathName );
 | 
						|
				// reimport as necessary
 | 
						|
				AssetDatabase.SaveAssets();
 | 
						|
				// select it in the project tree so developers can find it
 | 
						|
				EditorGUIUtility.PingObject( cubemap );
 | 
						|
				Selection.activeObject = cubemap;
 | 
						|
			}
 | 
						|
			AssetDatabase.Refresh();
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	/// <summary>
 | 
						|
	/// Generates a NPOT 6x1 cubemap in the following format PX NX PY NY PZ NZ
 | 
						|
	/// </summary>
 | 
						|
	void GenerateTexture(Cubemap cubemap, string pathName)
 | 
						|
	{
 | 
						|
		// Encode the texture and save it to disk
 | 
						|
		pathName = pathName.Replace(".cubemap", (textureFormat == TexFormat.PNG) ? ".png" : ".jpg" ).ToLower();
 | 
						|
		pathName = pathName.Replace( cubeMapFolder.ToLower(), "" );
 | 
						|
		string format = textureFormat.ToString();
 | 
						|
		string fullPath = EditorUtility.SaveFilePanel( string.Format( "Save Cubemap Screenshot as {0}", format ), "", pathName, format.ToLower() );
 | 
						|
		if ( !string.IsNullOrEmpty( fullPath ) )
 | 
						|
		{
 | 
						|
			Debug.Log( "Saving: " + fullPath );
 | 
						|
			OVRCubemapCapture.SaveCubemapCapture(cubemap, fullPath);
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
	/// <summary>
 | 
						|
	/// Unity Editor menu option to take a screenshot
 | 
						|
	/// </summary>
 | 
						|
	[MenuItem("Oculus/Tools/OVR Screenshot Wizard", false, 100000)]
 | 
						|
	static void TakeOVRScreenshot()
 | 
						|
	{
 | 
						|
		OVRScreenshotWizard wizard = ScriptableWizard.DisplayWizard<OVRScreenshotWizard>("OVR Screenshot Wizard", "Render Cubemap");
 | 
						|
		if (wizard != null)
 | 
						|
		{
 | 
						|
			if (Selection.activeGameObject != null)
 | 
						|
			wizard.renderFrom = Selection.activeGameObject;
 | 
						|
			else
 | 
						|
			wizard.renderFrom = Camera.main.gameObject;
 | 
						|
 | 
						|
			wizard.isValid = (wizard.renderFrom != null);
 | 
						|
		}
 | 
						|
	}
 | 
						|
}
 |