mirror of
https://github.com/tym1116/BH3.git
synced 2025-12-19 01:45:07 +01:00
228 lines
5.9 KiB
C#
228 lines
5.9 KiB
C#
using UnityEngine;
|
|
|
|
namespace RenderHeads.Media.AVProVideo
|
|
{
|
|
[RequireComponent(typeof(MeshRenderer))]
|
|
[RequireComponent(typeof(MeshFilter))]
|
|
[AddComponentMenu("AVPro Video/Cubemap Cube (VR)")]
|
|
public class CubemapCube : MonoBehaviour
|
|
{
|
|
private Mesh _mesh;
|
|
|
|
private MeshRenderer _renderer;
|
|
|
|
[SerializeField]
|
|
private Material _material;
|
|
|
|
[SerializeField]
|
|
private MediaPlayer _mediaPlayer;
|
|
|
|
[SerializeField]
|
|
private float expansion_coeff = 1.01f;
|
|
|
|
public MediaPlayer Player
|
|
{
|
|
get
|
|
{
|
|
return _mediaPlayer;
|
|
}
|
|
set
|
|
{
|
|
_mediaPlayer = value;
|
|
}
|
|
}
|
|
|
|
private void Start()
|
|
{
|
|
if (_mesh == null)
|
|
{
|
|
_mesh = new Mesh();
|
|
_mesh.MarkDynamic();
|
|
MeshFilter component = GetComponent<MeshFilter>();
|
|
if (component != null)
|
|
{
|
|
component.mesh = _mesh;
|
|
}
|
|
_renderer = GetComponent<MeshRenderer>();
|
|
if (_renderer != null)
|
|
{
|
|
_renderer.material = _material;
|
|
}
|
|
BuildMesh();
|
|
}
|
|
}
|
|
|
|
private void OnDestroy()
|
|
{
|
|
if (_mesh != null)
|
|
{
|
|
MeshFilter component = GetComponent<MeshFilter>();
|
|
if (component != null)
|
|
{
|
|
component.mesh = null;
|
|
}
|
|
Object.Destroy(_mesh);
|
|
_mesh = null;
|
|
}
|
|
if (_renderer != null)
|
|
{
|
|
_renderer.material = null;
|
|
_renderer = null;
|
|
}
|
|
}
|
|
|
|
private void LateUpdate()
|
|
{
|
|
if (Application.isPlaying)
|
|
{
|
|
Texture texture = null;
|
|
bool requiresFlip = false;
|
|
if (_mediaPlayer != null && _mediaPlayer.Control != null && _mediaPlayer.TextureProducer != null)
|
|
{
|
|
texture = _mediaPlayer.TextureProducer.GetTexture();
|
|
requiresFlip = _mediaPlayer.TextureProducer.RequiresVerticalFlip();
|
|
}
|
|
UpdateMaterial(texture, requiresFlip);
|
|
if (texture != null)
|
|
{
|
|
UpdateMeshUV(texture.width, texture.height, _mediaPlayer.TextureProducer.RequiresVerticalFlip());
|
|
}
|
|
}
|
|
}
|
|
|
|
private void UpdateMaterial(Texture texture, bool requiresFlip)
|
|
{
|
|
_renderer.material.mainTexture = texture;
|
|
if (requiresFlip)
|
|
{
|
|
_material.mainTextureScale = new Vector2(1f, -1f);
|
|
_material.mainTextureOffset = Vector2.up;
|
|
}
|
|
else
|
|
{
|
|
_material.mainTextureScale = Vector2.one;
|
|
_material.mainTextureOffset = Vector2.zero;
|
|
}
|
|
}
|
|
|
|
private void BuildMesh()
|
|
{
|
|
Vector3 vector = new Vector3(-0.5f, -0.5f, -0.5f);
|
|
Vector3[] array = new Vector3[24]
|
|
{
|
|
new Vector3(0f, -1f, 0f) - vector,
|
|
new Vector3(0f, 0f, 0f) - vector,
|
|
new Vector3(0f, 0f, -1f) - vector,
|
|
new Vector3(0f, -1f, -1f) - vector,
|
|
new Vector3(0f, 0f, 0f) - vector,
|
|
new Vector3(-1f, 0f, 0f) - vector,
|
|
new Vector3(-1f, 0f, -1f) - vector,
|
|
new Vector3(0f, 0f, -1f) - vector,
|
|
new Vector3(-1f, 0f, 0f) - vector,
|
|
new Vector3(-1f, -1f, 0f) - vector,
|
|
new Vector3(-1f, -1f, -1f) - vector,
|
|
new Vector3(-1f, 0f, -1f) - vector,
|
|
new Vector3(-1f, -1f, 0f) - vector,
|
|
new Vector3(0f, -1f, 0f) - vector,
|
|
new Vector3(0f, -1f, -1f) - vector,
|
|
new Vector3(-1f, -1f, -1f) - vector,
|
|
new Vector3(0f, -1f, -1f) - vector,
|
|
new Vector3(0f, 0f, -1f) - vector,
|
|
new Vector3(-1f, 0f, -1f) - vector,
|
|
new Vector3(-1f, -1f, -1f) - vector,
|
|
new Vector3(-1f, -1f, 0f) - vector,
|
|
new Vector3(-1f, 0f, 0f) - vector,
|
|
new Vector3(0f, 0f, 0f) - vector,
|
|
new Vector3(0f, -1f, 0f) - vector
|
|
};
|
|
Matrix4x4 matrix4x = Matrix4x4.TRS(Vector3.zero, Quaternion.AngleAxis(-90f, Vector3.right), Vector3.one);
|
|
for (int i = 0; i < array.Length; i++)
|
|
{
|
|
array[i] = matrix4x.MultiplyPoint(array[i]);
|
|
}
|
|
_mesh.vertices = array;
|
|
_mesh.triangles = new int[36]
|
|
{
|
|
0, 1, 2, 0, 2, 3, 4, 5, 6, 4,
|
|
6, 7, 8, 9, 10, 8, 10, 11, 12, 13,
|
|
14, 12, 14, 15, 16, 17, 18, 16, 18, 19,
|
|
20, 21, 22, 20, 22, 23
|
|
};
|
|
_mesh.normals = new Vector3[24]
|
|
{
|
|
new Vector3(-1f, 0f, 0f),
|
|
new Vector3(-1f, 0f, 0f),
|
|
new Vector3(-1f, 0f, 0f),
|
|
new Vector3(-1f, 0f, 0f),
|
|
new Vector3(0f, -1f, 0f),
|
|
new Vector3(0f, -1f, 0f),
|
|
new Vector3(0f, -1f, 0f),
|
|
new Vector3(0f, -1f, 0f),
|
|
new Vector3(1f, 0f, 0f),
|
|
new Vector3(1f, 0f, 0f),
|
|
new Vector3(1f, 0f, 0f),
|
|
new Vector3(1f, 0f, 0f),
|
|
new Vector3(0f, 1f, 0f),
|
|
new Vector3(0f, 1f, 0f),
|
|
new Vector3(0f, 1f, 0f),
|
|
new Vector3(0f, 1f, 0f),
|
|
new Vector3(0f, 0f, 1f),
|
|
new Vector3(0f, 0f, 1f),
|
|
new Vector3(0f, 0f, 1f),
|
|
new Vector3(0f, 0f, 1f),
|
|
new Vector3(0f, 0f, -1f),
|
|
new Vector3(0f, 0f, -1f),
|
|
new Vector3(0f, 0f, -1f),
|
|
new Vector3(0f, 0f, -1f)
|
|
};
|
|
UpdateMeshUV(512, 512, false);
|
|
}
|
|
|
|
private void UpdateMeshUV(int textureWidth, int textureHeight, bool flipY)
|
|
{
|
|
float num = textureWidth;
|
|
float num2 = textureHeight;
|
|
float num3 = num / 3f;
|
|
float num4 = Mathf.Floor((expansion_coeff * num3 - num3) / 2f);
|
|
float num5 = num4 / num;
|
|
float num6 = num4 / num2;
|
|
Vector2[] array = new Vector2[24]
|
|
{
|
|
new Vector2(1f / 3f + num5, 1f - num6),
|
|
new Vector2(2f / 3f - num5, 1f - num6),
|
|
new Vector2(2f / 3f - num5, 0.5f + num6),
|
|
new Vector2(1f / 3f + num5, 0.5f + num6),
|
|
new Vector2(1f / 3f + num5, 0.5f - num6),
|
|
new Vector2(2f / 3f - num5, 0.5f - num6),
|
|
new Vector2(2f / 3f - num5, 0f + num6),
|
|
new Vector2(1f / 3f + num5, 0f + num6),
|
|
new Vector2(0f + num5, 1f - num6),
|
|
new Vector2(1f / 3f - num5, 1f - num6),
|
|
new Vector2(1f / 3f - num5, 0.5f + num6),
|
|
new Vector2(0f + num5, 0.5f + num6),
|
|
new Vector2(2f / 3f + num5, 0.5f - num6),
|
|
new Vector2(1f - num5, 0.5f - num6),
|
|
new Vector2(1f - num5, 0f + num6),
|
|
new Vector2(2f / 3f + num5, 0f + num6),
|
|
new Vector2(0f + num5, 0f + num6),
|
|
new Vector2(0f + num5, 0.5f - num6),
|
|
new Vector2(1f / 3f - num5, 0.5f - num6),
|
|
new Vector2(1f / 3f - num5, 0f + num6),
|
|
new Vector2(1f - num5, 1f - num6),
|
|
new Vector2(1f - num5, 0.5f + num6),
|
|
new Vector2(2f / 3f + num5, 0.5f + num6),
|
|
new Vector2(2f / 3f + num5, 1f - num6)
|
|
};
|
|
if (flipY)
|
|
{
|
|
for (int i = 0; i < array.Length; i++)
|
|
{
|
|
array[i].y = 1f - array[i].y;
|
|
}
|
|
}
|
|
_mesh.uv = array;
|
|
_mesh.UploadMeshData(false);
|
|
}
|
|
}
|
|
}
|