您最多选择25个主题
主题必须以中文或者字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符
168 行
5.7 KiB
168 行
5.7 KiB
using System;
|
|
using UnityEditor;
|
|
using UnityEngine;
|
|
|
|
|
|
namespace UniVRM10
|
|
{
|
|
/// <summary>
|
|
/// based
|
|
///
|
|
/// * https://gist.github.com/radiatoryang/a2282d44ba71848e498bb2e03da98991
|
|
/// </summary>
|
|
|
|
/// <summary>
|
|
/// PreviewRenderUtilityを管理する
|
|
/// PreviewSceneをレンダリングする
|
|
/// </summary>
|
|
public class PreviewFaceRenderer : IDisposable
|
|
{
|
|
PreviewRenderUtility m_previewUtility;
|
|
public Camera PreviewCamera
|
|
{
|
|
get
|
|
{
|
|
#if UNITY_2017_1_OR_NEWER
|
|
return m_previewUtility.camera;
|
|
#else
|
|
return m_previewUtility.m_Camera;
|
|
#endif
|
|
}
|
|
}
|
|
|
|
public Light[] PreviewLights
|
|
{
|
|
get
|
|
{
|
|
#if UNITY_2017_1_OR_NEWER
|
|
return m_previewUtility.lights;
|
|
#else
|
|
return m_previewUtility.m_Light;
|
|
#endif
|
|
}
|
|
}
|
|
|
|
public void SetAmbientColor(Color color)
|
|
{
|
|
#if UNITY_2017_1_OR_NEWER
|
|
m_previewUtility.ambientColor = color;
|
|
#else
|
|
// ?
|
|
#endif
|
|
}
|
|
|
|
public PreviewFaceRenderer()
|
|
{
|
|
m_previewUtility = new PreviewRenderUtility();
|
|
|
|
foreach (var light in PreviewLights)
|
|
{
|
|
if (light == null) continue;
|
|
light.intensity = 0f;
|
|
}
|
|
|
|
if (PreviewLights.Length > 0 && PreviewLights[0] != null)
|
|
{
|
|
PreviewLights[0].intensity = 1f;
|
|
PreviewLights[0].transform.rotation = Quaternion.Euler(20f, 200f, 0);
|
|
PreviewLights[0].color = new Color(1f, 1f, 1f, 1f);
|
|
}
|
|
|
|
SetAmbientColor(new Color(0.1f, 0.1f, 0.1f, 1f));
|
|
}
|
|
|
|
class FogScope : IDisposable
|
|
{
|
|
bool fog;
|
|
|
|
public FogScope()
|
|
{
|
|
fog = RenderSettings.fog; // ... let's remember the current fog setting...
|
|
// we are technically rendering everything in the scene, so scene fog might affect it...
|
|
Unsupported.SetRenderSettingsUseFogNoDirty(false); // ... and then temporarily turn it off
|
|
}
|
|
|
|
public void Dispose()
|
|
{
|
|
Unsupported.SetRenderSettingsUseFogNoDirty(fog);
|
|
}
|
|
}
|
|
|
|
//const float FACTOR = 0.1f;
|
|
|
|
public Texture Render(Rect r, GUIStyle background, PreviewSceneManager scene,
|
|
float yaw, float pitch, Vector3 position)
|
|
{
|
|
if (scene == null) return null;
|
|
|
|
using (var fog = new FogScope())
|
|
{
|
|
m_previewUtility.BeginPreview(r, background); // set up the PreviewRenderUtility's mini internal scene
|
|
|
|
// setup the ObjectPreview's camera
|
|
scene.SetupCamera(PreviewCamera, scene.TargetPosition, yaw, pitch, position);
|
|
|
|
foreach (var item in scene.EnumRenderItems)
|
|
{
|
|
// now, actually render out the RenderTexture
|
|
//RenderMeshPreview(previewMesh, skinMeshRender.sharedMaterials);
|
|
// submesh support, in case the mesh is made of multiple parts
|
|
int subMeshCount = item.Mesh.subMeshCount;
|
|
for (int i = 0; i < subMeshCount; i++)
|
|
{
|
|
m_previewUtility.DrawMesh(item.Mesh,
|
|
item.Position, item.Rotation,
|
|
item.Materials[i], i);
|
|
}
|
|
}
|
|
|
|
// VERY IMPORTANT: this manually tells the camera to render and produce the render texture
|
|
PreviewCamera.Render();
|
|
//m_previewUtility.Render(false, false);
|
|
|
|
// reset the scene's fog from before
|
|
return m_previewUtility.EndPreview();
|
|
}
|
|
}
|
|
|
|
#region IDisposable Support
|
|
private bool disposedValue = false; // 重複する呼び出しを検出するには
|
|
|
|
protected virtual void Dispose(bool disposing)
|
|
{
|
|
if (!disposedValue)
|
|
{
|
|
if (disposing)
|
|
{
|
|
// TODO: マネージ状態を破棄します (マネージ オブジェクト)。
|
|
if (this.m_previewUtility != null)
|
|
{
|
|
this.m_previewUtility.Cleanup();
|
|
this.m_previewUtility = null;
|
|
}
|
|
}
|
|
|
|
// TODO: アンマネージ リソース (アンマネージ オブジェクト) を解放し、下のファイナライザーをオーバーライドします。
|
|
// TODO: 大きなフィールドを null に設定します。
|
|
|
|
disposedValue = true;
|
|
}
|
|
}
|
|
|
|
// TODO: 上の Dispose(bool disposing) にアンマネージ リソースを解放するコードが含まれる場合にのみ、ファイナライザーをオーバーライドします。
|
|
// ~PreviewFaceRenderer() {
|
|
// // このコードを変更しないでください。クリーンアップ コードを上の Dispose(bool disposing) に記述します。
|
|
// Dispose(false);
|
|
// }
|
|
|
|
// このコードは、破棄可能なパターンを正しく実装できるように追加されました。
|
|
public void Dispose()
|
|
{
|
|
// このコードを変更しないでください。クリーンアップ コードを上の Dispose(bool disposing) に記述します。
|
|
Dispose(true);
|
|
// TODO: 上のファイナライザーがオーバーライドされる場合は、次の行のコメントを解除してください。
|
|
// GC.SuppressFinalize(this);
|
|
}
|
|
#endregion
|
|
}
|
|
}
|