shenjianxing 6b341ae2b4 适配VR
2025-04-01 16:16:45 +08:00

136 lines
4.5 KiB
C#

////////////////////////////////////////////////////////////////////////////////
//
// Copyright (C) 2007-2020 , Inc. All Rights Reserved.
//
////////////////////////////////////////////////////////////////////////////////
using UnityEngine;
namespace GCSeries.Core.Extensions
{
public static class CameraExtensions
{
/// <summary>
/// Makes this camera's settings match the other camera.
/// </summary>
///
/// <remarks>
/// This will copy all camera variables (field of view, clear flags,
/// culling mask, etc.) from the other camera.
///
/// Additionally it will copy the other camera's stereo projection
/// matrix to this camera's mono/stereo projection matrices and set
/// the stereo target eye based on the specified eye.
/// </remarks>
///
/// <param name="other">
/// The camera to copy settings from.
/// </param>
/// <param name="eye">
/// The stereo target eye to copy the projection matrix from.
/// </param>
public static void CopyFrom(
this Camera c, Camera other, Camera.StereoscopicEye eye)
{
c.CopyFrom(other);
c.projectionMatrix = c.GetStereoProjectionMatrix(eye);
switch (eye)
{
case Camera.StereoscopicEye.Left:
c.stereoTargetEye = StereoTargetEyeMask.Left;
break;
case Camera.StereoscopicEye.Right:
c.stereoTargetEye = StereoTargetEyeMask.Right;
break;
}
}
/// <summary>
/// Renders the camera to the specified target texture.
/// </summary>
///
/// <param name="targetTexture">
/// The target texture to render to.
/// </param>
public static void Render(
this Camera c, RenderTexture targetTexture)
{
RenderTexture originalTargetTexture = c.targetTexture;
{
c.targetTexture = targetTexture;
c.Render();
}
c.targetTexture = originalTargetTexture;
}
/// <summary>
/// Renders the camera to the specified target texture.
/// </summary>
///
/// <remarks>
/// The specified target eye will determine which projection matrix
/// to use when rendering. For example, if the eye is set to
/// Camera.StereoscopicEye.Left, the camera will use its left eye
/// stereo projection matrix.
/// </remarks>
///
/// <param name="targetTexture">
/// The target texture to render to.
/// </param>
/// <param name="eye">
/// The target eye to render the perspective from.
/// </param>
public static void Render(
this Camera c,
RenderTexture targetTexture,
Camera.StereoscopicEye eye)
{
Matrix4x4 originalProjectionMatrix = c.projectionMatrix;
{
c.projectionMatrix = c.GetStereoProjectionMatrix(eye);
c.Render(targetTexture);
}
c.projectionMatrix = originalProjectionMatrix;
}
/// <summary>
/// Renders the camera to the specified target texture.
/// </summary>
///
/// <remarks>
/// The specified target eye will determine which projection matrix
/// to use when rendering. For example, if the eye is set to
/// Camera.StereoscopicEye.Left, the camera will use its left eye
/// stereo projection matrix.
///
/// Additionally, the specified pose corresponds to the desired world
/// pose to render the camera perspective from.
/// </remarks>
///
/// <param name="targetTexture">
/// The target texture to render to.
/// </param>
/// <param name="eye">
/// The target eye to render the perspective from.
/// </param>
/// <param name="pose">
/// The world pose to render the perspective from.
/// </param>
public static void Render(
this Camera c,
RenderTexture targetTexture,
Camera.StereoscopicEye eye,
Pose pose)
{
Pose originalPose = c.transform.ToPose();
{
c.transform.SetPose(pose);
c.Render(targetTexture, eye);
}
c.transform.SetPose(originalPose);
}
}
}