2025-01-03 13:42:53 +08:00

181 lines
6.0 KiB
C#

////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2007-2020 , Inc. All Rights Reserved.
//
////////////////////////////////////////////////////////////////////////////////
#if UNITY_EDITOR
using System;
using UnityEditor;
using UnityEngine;
using GCSeries.Core.Extensions;
using GCSeries.Core.Interop;
using GCSeries.Core.Sdk;
namespace GCSeries.Core
{
public sealed partial class ZCamera
{
////////////////////////////////////////////////////////////////////////
// Private Methods
////////////////////////////////////////////////////////////////////////
private void DestroyOverlayResources()
{
if (this._leftTexture != null)
{
Destroy(this._leftTexture);
this._leftTexture = null;
}
if (this._rightTexture != null)
{
Destroy(this._rightTexture);
this._rightTexture = null;
}
this._leftTexturePtr = IntPtr.Zero;
this._rightTexturePtr = IntPtr.Zero;
}
private void UpdateOverlay()
{
// If this is not the main camera, early out since
// overlay rendering can only support one camera.
if (!this.CompareTag("MainCamera"))
{
return;
}
// If the XR Overlay is enabled, render to it.
if (ZPlugin.IsXROverlayActive() && ZPlugin.IsXROverlayEnabled())
{
this.RefreshOverlayTextures();
this.RenderOverlayTextures();
// Set the left and right textures for the XR Overlay.
ZPlugin.SetXROverlayTextures(
this._leftTexturePtr, this._rightTexturePtr);
// Issue plugin event to queue up left and right textures
// to be copied and rendered by the XR Overlay.
ZPlugin.IssueEvent(ZPluginEvent.QueueXROverlayFrame);
}
}
private void RefreshOverlayTextures()
{
// Refresh the left render texture.
this.RefreshOverlayTexture(
ZProvider.WindowSizePixels,
ref this._leftTexture,
ref this._leftTexturePtr);
// Refresh the right render texture.
this.RefreshOverlayTexture(
ZProvider.WindowSizePixels,
ref this._rightTexture,
ref this._rightTexturePtr);
}
private void RefreshOverlayTexture(
Vector2Int size,
ref RenderTexture renderTexture,
ref IntPtr renderTexturePtr)
{
// Check to see if the render texture should be refreshed.
if (renderTexture == null ||
renderTexture.width != size.x ||
renderTexture.height != size.y)
{
// If a texture of a different size is already created,
// destroy it before attempting to create a new texture.
if (renderTexture != null)
{
DestroyImmediate(renderTexture);
}
// Create a new texture.
renderTexture = new RenderTexture(size.x, size.y, 24);
renderTexture.format = RenderTextureFormat.ARGB32;
renderTexture.filterMode = FilterMode.Bilinear;
renderTexture.Create();
// Cache the render texture's native pointer.
renderTexturePtr = renderTexture.GetNativeTexturePtr();
}
}
private void RenderOverlayTextures()
{
// Ensure that the target render textures are valid.
if (this._leftTexture == null || this._rightTexture == null)
{
return;
}
// Determine whether to swap the eyes.
bool swapEyes = EditorPrefs.GetBool(EnableEyeSwapMenuItem);
RenderTexture leftTexture =
swapEyes ? this._rightTexture : this._leftTexture;
RenderTexture rightTexture =
swapEyes ? this._leftTexture : this._rightTexture;
// Render the scene for each eye.
// switch (this.StereoRenderMode)
// {
// case RenderMode.SingleCamera:
// {
// this.Camera.enabled = false;
// this.Camera.Render(
// leftTexture,
// Camera.StereoscopicEye.Left,
// this.GetPose(ZEye.Left));
// this.Camera.Render(
// rightTexture,
// Camera.StereoscopicEye.Right,
// this.GetPose(ZEye.Right));
// }
// break;
// case RenderMode.MultiCamera:
// {
// this._leftCamera.enabled = false;
// this._leftCamera.Render(leftTexture);
// this._rightCamera.enabled = false;
// this._rightCamera.Render(rightTexture);
// }
// break;
// }
this._leftCamera.enabled = false;
this._leftCamera.Render(leftTexture);
this._rightCamera.enabled = false;
this._rightCamera.Render(rightTexture);
}
////////////////////////////////////////////////////////////////////////
// Private Members
////////////////////////////////////////////////////////////////////////
private const string EnableEyeSwapMenuItem = "/Enable Eye Swap";
private RenderTexture _leftTexture = null;
private RenderTexture _rightTexture = null;
private IntPtr _leftTexturePtr = IntPtr.Zero;
private IntPtr _rightTexturePtr = IntPtr.Zero;
}
}
#endif // UNITY_EDITOR