You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
126 lines
5.3 KiB
126 lines
5.3 KiB
using UnityEngine;
|
|
using UnityEngine.Rendering;
|
|
using UnityEngine.Rendering.HighDefinition;
|
|
|
|
namespace UnityEditor.Rendering
|
|
{
|
|
static class WaterSurfaceMenuItems
|
|
{
|
|
[MenuItem("GameObject/Water/Surface/Ocean Sea or Lake", priority = 13)]
|
|
static void CreateOcean(MenuCommand menuCommand)
|
|
{
|
|
// Create the holding game object
|
|
var go = CoreEditorUtils.CreateGameObject("Ocean", menuCommand.context);
|
|
|
|
// Place it at origin and set its scale
|
|
go.transform.position = new Vector3(0.0f, 0.0f, 0.0f);
|
|
|
|
// Add the water surface component
|
|
var waterSurface = go.AddComponent<WaterSurface>();
|
|
WaterSurfacePresets.ApplyWaterOceanPreset(waterSurface);
|
|
}
|
|
|
|
[MenuItem("GameObject/Water/Surface/River", priority = 15)]
|
|
static void CreateRiver(MenuCommand menuCommand)
|
|
{
|
|
// Create the holding game object
|
|
var go = CoreEditorUtils.CreateGameObject("River", menuCommand.context);
|
|
|
|
// Set a default scale
|
|
go.transform.localScale = new Vector3(150.0f, 1.0f, 20.0f);
|
|
|
|
// Add the water surface component
|
|
var waterSurface = go.AddComponent<WaterSurface>();
|
|
WaterSurfacePresets.ApplyWaterRiverPreset(waterSurface);
|
|
}
|
|
|
|
[MenuItem("GameObject/Water/Surface/Pool", priority = 14)]
|
|
static void CreatePool(MenuCommand menuCommand)
|
|
{
|
|
// Create the holding game object
|
|
var go = CoreEditorUtils.CreateGameObject("Pool", menuCommand.context);
|
|
|
|
// Set a default scale
|
|
go.transform.localScale = new Vector3(10.0f, 1.0f, 10.0f);
|
|
|
|
// Add the water surface component
|
|
var waterSurface = go.AddComponent<WaterSurface>();
|
|
WaterSurfacePresets.ApplyWaterPoolPreset(waterSurface);
|
|
|
|
// Box collider
|
|
var boxCollider = go.AddComponent<BoxCollider>();
|
|
waterSurface.volumeBounds = boxCollider;
|
|
boxCollider.center = new Vector3(0, -2, 0);
|
|
boxCollider.size = new Vector3(1, 5, 1);
|
|
boxCollider.isTrigger = true;
|
|
}
|
|
|
|
[MenuItem("GameObject/Water/Excluder", priority = 17)]
|
|
static void CreateWaterExcluder(MenuCommand menuCommand)
|
|
{
|
|
Transform targetParent = null;
|
|
GameObject toReplace = null;
|
|
bool replace = false;
|
|
// If an object was selected at the moment of the creation we have a different execution path
|
|
if (Selection.activeObject != null)
|
|
{
|
|
var gameObject = (GameObject)Selection.activeObject;
|
|
if (gameObject != null)
|
|
{
|
|
toReplace = gameObject;
|
|
targetParent = gameObject.transform.parent;
|
|
replace = true;
|
|
}
|
|
}
|
|
|
|
// Create the parent game object
|
|
var go = CoreEditorUtils.CreateGameObject("Water Excluder", menuCommand.context);
|
|
if (replace)
|
|
go.transform.SetParent(targetParent);
|
|
|
|
// Add the water excluder component
|
|
var waterExclusion = go.AddComponent<WaterExcluder>();
|
|
|
|
// Create the child excluder
|
|
waterExclusion.m_ExclusionRenderer = new GameObject("Water Excluder Renderer", typeof(MeshFilter), typeof(MeshRenderer));
|
|
waterExclusion.m_ExclusionRenderer.hideFlags = HideFlags.NotEditable;
|
|
waterExclusion.m_ExclusionRenderer.transform.SetParent(go.transform);
|
|
waterExclusion.m_ExclusionRenderer.transform.localPosition = Vector3.zero;
|
|
waterExclusion.m_ExclusionRenderer.transform.localRotation = Quaternion.identity;
|
|
waterExclusion.m_ExclusionRenderer.transform.localScale = Vector3.one;
|
|
|
|
// Assign the material
|
|
var excluderMeshRenderer = waterExclusion.m_ExclusionRenderer.GetComponent<MeshRenderer>();
|
|
excluderMeshRenderer.sharedMaterial = GraphicsSettings.GetRenderPipelineSettings<WaterSystemRuntimeResources>().waterExclusionMaterial;
|
|
excluderMeshRenderer.rayTracingMode = UnityEngine.Experimental.Rendering.RayTracingMode.Off;
|
|
|
|
// If an object was selected and it had a mesh filter, assign it
|
|
Mesh targetMesh = null;
|
|
if (replace)
|
|
{
|
|
if (toReplace.TryGetComponent<MeshFilter>(out var filter))
|
|
{
|
|
var excluderMeshFilter = waterExclusion.m_ExclusionRenderer.GetComponent<MeshFilter>();
|
|
targetMesh = filter.sharedMesh;
|
|
toReplace.SetActive(false);
|
|
}
|
|
}
|
|
else
|
|
targetMesh = Resources.GetBuiltinResource<Mesh>("Plane.fbx");
|
|
|
|
waterExclusion.SetExclusionMesh(targetMesh);
|
|
}
|
|
|
|
[MenuItem("GameObject/Water/Water Decal", priority = 16)]
|
|
static void CreateWaterDecal(MenuCommand menuCommand)
|
|
{
|
|
// Create the holding game object
|
|
var go = CoreEditorUtils.CreateGameObject("Water Decal", menuCommand.context);
|
|
go.transform.position = new Vector3(0.0f, 0.0f, 0.0f);
|
|
|
|
// Add the water surface component
|
|
var decal = go.AddComponent<WaterDecal>();
|
|
decal.Reset();
|
|
}
|
|
}
|
|
}
|