备份CatanBuilding瘦身独立工程
This commit is contained in:
@@ -0,0 +1,149 @@
|
||||
using System;
|
||||
using UnityEngine;
|
||||
using StylizedWater2;
|
||||
#if UNITY_EDITOR
|
||||
using UnityEditor;
|
||||
#endif
|
||||
|
||||
namespace NWH.DWP2.WaterData
|
||||
{
|
||||
#if NWH_DWP2
|
||||
public class StylizedWaterDataProvider : WaterDataProvider
|
||||
{
|
||||
[Tooltip("This reference is required to grab the wave distance and height values")]
|
||||
public Material waterMat;
|
||||
public enum WaterLevelSource
|
||||
{
|
||||
Value,
|
||||
Mesh
|
||||
}
|
||||
[Tooltip("Configure what should be used to set the base water level. Relative wave height is added to this value")]
|
||||
public WaterLevelSource waterLevelSource = WaterLevelSource.Value;
|
||||
[Tooltip("This reference is required to get the base water height. Relative wave height is added to this")]
|
||||
public MeshRenderer waterPlane;
|
||||
public float waterLevel;
|
||||
|
||||
[Tooltip("Enable if the wave settings are being changed at runtime. Incurs some overhead")]
|
||||
public bool dynamicMaterial;
|
||||
|
||||
private float m_waterLevel = 0f;
|
||||
private Vector3[] _normals;
|
||||
private int _prevArraySize;
|
||||
|
||||
private void Reset()
|
||||
{
|
||||
MeshRenderer r = GetComponent<MeshRenderer>();
|
||||
|
||||
if (r)
|
||||
{
|
||||
waterPlane = r;
|
||||
waterMat = r.sharedMaterial;
|
||||
}
|
||||
|
||||
waterLevel = this.transform.position.y;
|
||||
}
|
||||
|
||||
private void OnValidate()
|
||||
{
|
||||
if (!waterMat && waterPlane) waterMat = waterPlane.sharedMaterial;
|
||||
}
|
||||
|
||||
public override bool SupportsWaterHeightQueries()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public override bool SupportsWaterNormalQueries()
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
public override bool SupportsWaterFlowQueries()
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
public override void GetWaterHeights(NWH.DWP2.WaterObjects.WaterObject waterObject, ref Vector3[] points, ref float[] waterHeights)
|
||||
{
|
||||
var n = points.Length;
|
||||
|
||||
m_waterLevel = waterPlane && waterLevelSource == WaterLevelSource.Mesh ? waterPlane.transform.position.y : waterLevel;
|
||||
|
||||
// Resize array if data size changed
|
||||
if (n != _prevArraySize)
|
||||
{
|
||||
_normals = new Vector3[n];
|
||||
waterHeights = new float[n];
|
||||
|
||||
_prevArraySize = n;
|
||||
}
|
||||
|
||||
for (int i = 0; i < points.Length; i++)
|
||||
{
|
||||
waterHeights[i] = Buoyancy.SampleWaves(points[i], waterMat, m_waterLevel, 0f, dynamicMaterial, out _normals[i]);
|
||||
}
|
||||
}
|
||||
|
||||
public override void GetWaterNormals(NWH.DWP2.WaterObjects.WaterObject waterObject, ref Vector3[] points, ref Vector3[] waterNormals)
|
||||
{
|
||||
waterNormals = _normals; // Already queried in GetWaterHeights
|
||||
}
|
||||
|
||||
public override float GetWaterHeightSingle(NWH.DWP2.WaterObjects.WaterObject waterObject, Vector3 point)
|
||||
{
|
||||
return Buoyancy.SampleWaves(point, waterMat, m_waterLevel, 0f, dynamicMaterial, out _);
|
||||
}
|
||||
}
|
||||
|
||||
#if UNITY_EDITOR
|
||||
[CustomEditor(typeof(StylizedWaterDataProvider))]
|
||||
public class StylizedWaterDataProviderInspector : Editor
|
||||
{
|
||||
SerializedProperty waterMat;
|
||||
SerializedProperty dynamicMaterial;
|
||||
SerializedProperty waterLevelSource;
|
||||
SerializedProperty waterPlane;
|
||||
SerializedProperty waterLevel;
|
||||
|
||||
private void OnEnable()
|
||||
{
|
||||
waterMat = serializedObject.FindProperty("waterMat");
|
||||
dynamicMaterial = serializedObject.FindProperty("dynamicMaterial");
|
||||
waterLevelSource = serializedObject.FindProperty("waterLevelSource");
|
||||
waterPlane = serializedObject.FindProperty("waterPlane");
|
||||
waterLevel = serializedObject.FindProperty("waterLevel");
|
||||
}
|
||||
|
||||
public override void OnInspectorGUI()
|
||||
{
|
||||
serializedObject.Update();
|
||||
|
||||
EditorGUI.BeginChangeCheck();
|
||||
|
||||
EditorGUILayout.PropertyField(waterMat);
|
||||
|
||||
if (waterMat.objectReferenceValue == null)
|
||||
{
|
||||
EditorGUILayout.HelpBox("A water material must be assigned!", MessageType.Error);
|
||||
}
|
||||
|
||||
EditorGUILayout.PropertyField(dynamicMaterial);
|
||||
|
||||
using (new EditorGUILayout.HorizontalScope())
|
||||
{
|
||||
EditorGUILayout.PrefixLabel("Water level source");
|
||||
waterLevelSource.intValue = GUILayout.Toolbar(waterLevelSource.intValue, new GUIContent[] { new GUIContent("Fixed Value"), new GUIContent("Mesh Object") });
|
||||
}
|
||||
|
||||
if (waterLevelSource.intValue == (int)StylizedWaterDataProvider.WaterLevelSource.Value) EditorGUILayout.PropertyField(waterLevel);
|
||||
if (waterLevelSource.intValue == (int)StylizedWaterDataProvider.WaterLevelSource.Mesh) EditorGUILayout.PropertyField(waterPlane);
|
||||
|
||||
if (EditorGUI.EndChangeCheck())
|
||||
{
|
||||
serializedObject.ApplyModifiedProperties();
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
}
|
||||
Reference in New Issue
Block a user