/// <summary> /// Checks if the position is below the maximum possible wave height. Can be used as a fast broad-phase check, before actually using the more expensive SampleWaves function /// </summary> /// <param name="position"></param> /// <param name="waterObject"></param> /// <returns></returns> public static bool CanTouchWater(Vector3 position, WaterObject waterObject) { if (!waterObject) { return(false); } return(position.y < (waterObject.transform.position.y + WaveParameters.GetMaxWaveHeight(waterObject.material))); }
private void Reset() { //Auto-assign water object if there is only one if (waterObject == null && WaterObject.Instances.Count > 0) { waterObject = WaterObject.Instances[0]; UnityEditor.EditorUtility.SetDirty(this); } }
public void Recreate() { RecreateMesh(); bool requireRecreate = (m_rowsColumns != rowsColumns) || objects.Count < (rowsColumns * rowsColumns); if (requireRecreate) { m_rowsColumns = rowsColumns; } //Only destroy/recreate objects if grid subdivision has changed if (requireRecreate && objects.Count > 0) { foreach (WaterObject obj in objects) { if (obj) { DestroyImmediate(obj.gameObject); } } objects.Clear(); } int index = 0; for (int x = 0; x < rowsColumns; x++) { for (int z = 0; z < rowsColumns; z++) { if (requireRecreate) { m_waterObject = WaterObject.New(material, mesh); objects.Add(m_waterObject); m_waterObject.transform.parent = this.transform; m_waterObject.gameObject.layer = 4; m_waterObject.name = "WaterTile_x" + x + "z" + z; } else { m_waterObject = objects[index]; m_waterObject.AssignMesh(mesh); m_waterObject.AssignMaterial(material); } m_waterObject.transform.localPosition = GridLocalCenterPosition(x, z); index++; } } }
/// <summary> /// Creates a new GameObject with a MeshFilter, MeshRenderer and WaterObject component /// </summary> /// <param name="waterMaterial">If assigned, this material is automatically added to the MeshRenderer</param> /// <returns></returns> public static WaterObject New(Material waterMaterial = null, Mesh mesh = null) { GameObject go = new GameObject("Water Object", typeof(MeshFilter), typeof(MeshRenderer), typeof(WaterObject)); WaterObject waterObject = go.GetComponent <WaterObject>(); waterObject.meshRenderer = waterObject.gameObject.GetComponent <MeshRenderer>(); waterObject.meshFilter = waterObject.gameObject.GetComponent <MeshFilter>(); waterObject.meshFilter.sharedMesh = mesh; waterObject.meshRenderer.sharedMaterial = waterMaterial; waterObject.material = waterMaterial; return(waterObject); }
public void FixedUpdate() { if (!this || !this.enabled || Disable) { return; } #if UNITY_EDITOR if (!EnableInEditor && Application.isPlaying == false) { return; } #endif if (autoFind) { waterObject = WaterObject.Find(this.transform.position, false); } if (!waterObject || !waterObject.material) { return; } m_waterLevel = waterObject && waterLevelSource == WaterLevelSource.WaterObject? waterObject.transform.position.y : waterLevel; normal = Vector3.up; height = 0f; if (samples.Count == 0) { height = Buoyancy.SampleWaves(this.transform.position, waterObject.material, m_waterLevel - heightOffset, rollAmount, dynamicMaterial, out normal); } else { Vector3 avgNormal = Vector3.zero; for (int i = 0; i < samples.Count; i++) { height += Buoyancy.SampleWaves(ConvertToWorldSpace(samples[i]), waterObject.material, m_waterLevel - heightOffset, rollAmount, dynamicMaterial, out normal); avgNormal += normal; } height /= samples.Count; normal = (avgNormal / samples.Count).normalized; } ApplyTransform(); }
/// <summary> /// Given a position in world-space, returns the wave height and normal /// </summary> /// <param name="position">Sample position in world-space</param> /// <param name="waterObject">Water object component, used to get the water material and level (height)</param> /// <param name="rollStrength">Multiplier for the the normal strength</param> /// <param name="dynamicMaterial">If true, the material's wave parameters will be re-fetched with every function call</param> /// <param name="normal">Output upwards normal vector, perpendicular to the wave</param> /// <returns>Wave height, in world-space.</returns> public static float SampleWaves(UnityEngine.Vector3 position, WaterObject waterObject, float rollStrength, bool dynamicMaterial, out UnityEngine.Vector3 normal) { return(SampleWaves(position, waterObject.material, waterObject.transform.position.y, rollStrength, dynamicMaterial, out normal)); }
/// <summary> /// Faux-raycast against the water surface /// </summary> /// <param name="waterObject">Water object component, used to get the water material and level (height)</param> /// <param name="origin">Ray origin</param> /// <param name="direction">Ray direction</param> /// <param name="dynamicMaterial">If true, the material's wave parameters will be re-fetched with every function call</param> /// <param name="hit">Reference to a RaycastHit, hit point and normal will be set</param> public static void Raycast(WaterObject waterObject, Vector3 origin, Vector3 direction, bool dynamicMaterial, out RaycastHit hit) { Raycast(waterObject.material, waterObject.transform.position.y, origin, direction, dynamicMaterial, out hit); }