// Multiple sims run at different scales in the world. Count how many sims this interaction will overlap, so that // we can normalize the interaction force for the number of sims. bool LateUpdateCountOverlappingSims(out int simsActive, out int simsPresent) { simsActive = 0; simsPresent = 0; var thisRect = new Rect(new Vector2(transform.position.x, transform.position.z), Vector3.zero); var minLod = LodDataMgrAnimWaves.SuggestDataLOD(thisRect); if (minLod == -1) { // Outside all lods, nothing to update! return(false); } // How many active wave sims currently apply to this object - ideally this would eliminate sims that are too // low res, by providing a max grid size param LodDataMgrDynWaves.CountWaveSims(minLod, out simsPresent, out simsActive); if (simsPresent == 0) { return(false); } // No sims running - abort return(simsActive > 0); }
private void LateUpdate() { if (OceanRenderer.Instance == null) { return; } // find which lod this object is overlapping var rect = new Rect(transform.position.x, transform.position.z, 0f, 0f); var lodIdx = LodDataMgrAnimWaves.SuggestDataLOD(rect); if (lodIdx > -1) { if (_mpb == null) { _mpb = new PropertyWrapperMPB(); } _rend.GetPropertyBlock(_mpb.materialPropertyBlock); _mpb.SetInt(LodDataMgr.sp_LD_SliceIndex, lodIdx); _rend.SetPropertyBlock(_mpb.materialPropertyBlock); } LateUpdateBounds(); }
private void LateUpdate() { // find which lod this object is overlapping var rect = new Rect(transform.position.x, transform.position.z, 0f, 0f); var idx = LodDataMgrAnimWaves.SuggestDataLOD(rect); if (idx > -1) { if (_mpb == null) { _mpb = new MaterialPropertyBlock(); } _rend.GetPropertyBlock(_mpb); var lodCount = OceanRenderer.Instance.CurrentLodCount; var ldaw = OceanRenderer.Instance._lodDataAnimWaves; ldaw.BindResultData(idx, 0, _mpb); int idx1 = Mathf.Min(idx + 1, lodCount - 1); ldaw.BindResultData(idx1, 1, _mpb); // blend LOD 0 shape in/out to avoid pop, if the ocean might scale up later (it is smaller than its maximum scale) bool needToBlendOutShape = idx == 0 && OceanRenderer.Instance.ScaleCouldIncrease; float meshScaleLerp = needToBlendOutShape ? OceanRenderer.Instance.ViewerAltitudeLevelAlpha : 0f; // blend furthest normals scale in/out to avoid pop, if scale could reduce bool needToBlendOutNormals = idx == lodCount - 1 && OceanRenderer.Instance.ScaleCouldDecrease; float farNormalsWeight = needToBlendOutNormals ? OceanRenderer.Instance.ViewerAltitudeLevelAlpha : 1f; _mpb.SetVector("_InstanceData", new Vector4(meshScaleLerp, farNormalsWeight, idx)); _rend.SetPropertyBlock(_mpb); } LateUpdateBounds(); }
private void LateUpdate() { if (OceanRenderer.Instance == null) { return; } // Prevents possible conflicts since overlapping doesn't work for every case. if (_disableClipSurfaceWhenTooFarFromSurface) { var position = transform.position; _sampleHeightHelper.Init(position, 0f); float waterHeight = 0f; if (_sampleHeightHelper.Sample(ref waterHeight)) { position.y = waterHeight; _enabled = Mathf.Abs(_rend.bounds.ClosestPoint(position).y - waterHeight) < 1; } } else { _enabled = true; } // find which lod this object is overlapping var rect = new Rect(transform.position.x, transform.position.z, 0f, 0f); var lodIdx = LodDataMgrAnimWaves.SuggestDataLOD(rect); if (lodIdx > -1) { if (_mpb == null) { _mpb = new PropertyWrapperMPB(); } _rend.GetPropertyBlock(_mpb.materialPropertyBlock); var lodCount = OceanRenderer.Instance.CurrentLodCount; var lodDataAnimWaves = OceanRenderer.Instance._lodDataAnimWaves; _mpb.SetInt(LodDataMgr.sp_LD_SliceIndex, lodIdx); _mpb.SetInt(sp_DisplacementSamplingIterations, (int)_animatedWavesDisplacementSamplingIterations); lodDataAnimWaves.BindResultData(_mpb); // blend LOD 0 shape in/out to avoid pop, if the ocean might scale up later (it is smaller than its maximum scale) bool needToBlendOutShape = lodIdx == 0 && OceanRenderer.Instance.ScaleCouldIncrease; float meshScaleLerp = needToBlendOutShape ? OceanRenderer.Instance.ViewerAltitudeLevelAlpha : 0f; // blend furthest normals scale in/out to avoid pop, if scale could reduce bool needToBlendOutNormals = lodIdx == lodCount - 1 && OceanRenderer.Instance.ScaleCouldDecrease; float farNormalsWeight = needToBlendOutNormals ? OceanRenderer.Instance.ViewerAltitudeLevelAlpha : 1f; _mpb.SetVector(OceanChunkRenderer.sp_InstanceData, new Vector3(meshScaleLerp, farNormalsWeight, lodIdx)); _rend.SetPropertyBlock(_mpb.materialPropertyBlock); } }
private void LateUpdate() { if (OceanRenderer.Instance == null) { return; } // find which lod this object is overlapping var rect = new Rect(transform.position.x, transform.position.z, 0f, 0f); var lodIdx = LodDataMgrAnimWaves.SuggestDataLOD(rect); if (lodIdx > -1) { if (_mpb == null) { _mpb = new PropertyWrapperMPB(); } _rend.GetPropertyBlock(_mpb.materialPropertyBlock); var lodCount = OceanRenderer.Instance.CurrentLodCount; var lodDataAnimWaves = OceanRenderer.Instance._lodDataAnimWaves; _mpb.SetInt(LodDataMgr.sp_LD_SliceIndex, lodIdx); lodDataAnimWaves.BindResultData(_mpb); var lodDataClipSurface = OceanRenderer.Instance._lodDataClipSurface; if (lodDataClipSurface != null) { lodDataClipSurface.BindResultData(_mpb); } else { LodDataMgrClipSurface.BindNull(_mpb); } // blend LOD 0 shape in/out to avoid pop, if the ocean might scale up later (it is smaller than its maximum scale) bool needToBlendOutShape = lodIdx == 0 && OceanRenderer.Instance.ScaleCouldIncrease; float meshScaleLerp = needToBlendOutShape ? OceanRenderer.Instance.ViewerAltitudeLevelAlpha : 0f; // blend furthest normals scale in/out to avoid pop, if scale could reduce bool needToBlendOutNormals = lodIdx == lodCount - 1 && OceanRenderer.Instance.ScaleCouldDecrease; float farNormalsWeight = needToBlendOutNormals ? OceanRenderer.Instance.ViewerAltitudeLevelAlpha : 1f; _mpb.SetVector(OceanChunkRenderer.sp_InstanceData, new Vector3(meshScaleLerp, farNormalsWeight, lodIdx)); _rend.SetPropertyBlock(_mpb.materialPropertyBlock); } LateUpdateBounds(); }
private void LateUpdate() { if (OceanRenderer.Instance == null || _renderer == null) { return; } // Prevents possible conflicts since overlapping doesn't work for every case. if (_disableClipSurfaceWhenTooFarFromSurface) { var position = transform.position; _sampleHeightHelper.Init(position, 0f); if (_sampleHeightHelper.Sample(out float waterHeight)) { position.y = waterHeight; _enabled = Mathf.Abs(_renderer.bounds.ClosestPoint(position).y - waterHeight) < 1; } } else { _enabled = true; } // find which lod this object is overlapping var rect = new Rect(transform.position.x, transform.position.z, 0f, 0f); var lodIdx = LodDataMgrAnimWaves.SuggestDataLOD(rect); if (lodIdx > -1) { if (_mpb == null) { _mpb = new PropertyWrapperMPB(); } _renderer.GetPropertyBlock(_mpb.materialPropertyBlock); _mpb.SetInt(LodDataMgr.sp_LD_SliceIndex, lodIdx); _mpb.SetInt(sp_DisplacementSamplingIterations, (int)_animatedWavesDisplacementSamplingIterations); _renderer.SetPropertyBlock(_mpb.materialPropertyBlock); } }
void LateUpdate() { if (OceanRenderer.Instance == null) { return; } // which lod is this object in (roughly)? var thisRect = new Rect(new Vector2(transform.position.x, transform.position.z), Vector3.zero); var minLod = LodDataMgrAnimWaves.SuggestDataLOD(thisRect); if (minLod == -1) { // outside all lods, nothing to update! return; } // how many active wave sims currently apply to this object - ideally this would eliminate sims that are too // low res, by providing a max grid size param int simsPresent, simsActive; LodDataMgrDynWaves.CountWaveSims(minLod, out simsPresent, out simsActive); // counting non-existent sims is expensive - stop updating if none found if (simsPresent == 0) { enabled = false; return; } // no sims running - abort. don't bother switching off renderer - camera wont be active if (simsActive == 0) { return; } transform.position = transform.parent.TransformPoint(_localOffset) + _velocityPositionOffset * _boat.Velocity; var ocean = OceanRenderer.Instance; // feed in water velocity var vel = (transform.position - _posLast) / ocean.DeltaTimeDynamics; if (ocean.DeltaTimeDynamics < 0.0001f) { vel = Vector3.zero; } { _sampleFlowHelper.Init(transform.position, _boat.ObjectWidth); _sampleFlowHelper.Sample(out var surfaceFlow); vel -= new Vector3(surfaceFlow.x, 0, surfaceFlow.y); } vel.y *= _weightUpDownMul; var speedKmh = vel.magnitude * 3.6f; if (speedKmh > _teleportSpeed) { // teleport detected vel *= 0f; if (_warnOnTeleport) { Debug.LogWarning("Teleport detected (speed = " + speedKmh.ToString() + "), velocity discarded.", this); } } else if (speedKmh > _maxSpeed) { // limit speed to max vel *= _maxSpeed / speedKmh; if (_warnOnSpeedClamp) { Debug.LogWarning("Speed (" + speedKmh.ToString() + ") exceeded max limited, clamped.", this); } } var dt = 1f / ocean._lodDataDynWaves.Settings._simulationFrequency; var weight = _boat.InWater ? 1f / simsActive : 0f; _renderer.GetPropertyBlock(_mpb); _mpb.SetVector("_Velocity", vel); _mpb.SetFloat("_SimDeltaTime", dt); // Weighting with this value helps keep ripples consistent for different gravity values var gravityMul = Mathf.Sqrt(ocean._lodDataDynWaves.Settings._gravityMultiplier / 25f); _mpb.SetFloat("_Weight", weight * gravityMul); _renderer.SetPropertyBlock(_mpb); _posLast = transform.position; }
void LateUpdate() { // which lod is this object in (roughly)? var thisRect = new Rect(new Vector2(transform.position.x, transform.position.z), Vector3.zero); var minLod = LodDataMgrAnimWaves.SuggestDataLOD(thisRect); if (minLod == -1) { // outside all lods, nothing to update! return; } // how many active wave sims currently apply to this object - ideally this would eliminate sims that are too // low res, by providing a max grid size param int simsPresent, simsActive; LodDataMgrDynWaves.CountWaveSims(minLod, out simsPresent, out simsActive); // counting non-existent sims is expensive - stop updating if none found if (simsPresent == 0) { enabled = false; return; } // no sims running - abort. don't bother switching off renderer - camera wont be active if (simsActive == 0) { return; } var disp = _boat.CalculateDisplacementToObject(); transform.position = transform.parent.TransformPoint(_localOffset) - disp + _velocityPositionOffset * _boat.Velocity; var ocean = OceanRenderer.Instance; var rnd = 1f + _noiseAmp * (2f * Mathf.PerlinNoise(_noiseFreq * ocean.CurrentTime, 0.5f) - 1f); // feed in water velocity var vel = (transform.position - _posLast) / ocean.DeltaTimeDynamics; if (ocean.DeltaTimeDynamics < 0.0001f) { vel = Vector3.zero; } if (QueryFlow.Instance) { _sampleFlowHelper.Init(transform.position, _boat.ObjectWidth); Vector2 surfaceFlow = Vector2.zero; _sampleFlowHelper.Sample(ref surfaceFlow); vel -= new Vector3(surfaceFlow.x, 0, surfaceFlow.y); } vel.y *= _weightUpDownMul; var speedKmh = vel.magnitude * 3.6f; if (speedKmh > _teleportSpeed) { // teleport detected vel *= 0f; if (_warnOnTeleport) { Debug.LogWarning("Teleport detected (speed = " + speedKmh.ToString() + "), velocity discarded.", this); } } else if (speedKmh > _maxSpeed) { // limit speed to max vel *= _maxSpeed / speedKmh; if (_warnOnSpeedClamp) { Debug.LogWarning("Speed (" + speedKmh.ToString() + ") exceeded max limited, clamped.", this); } } float dt; int steps; ocean._lodDataDynWaves.GetSimSubstepData(ocean.DeltaTimeDynamics, out steps, out dt); float weight = _boat.InWater ? _weight / simsActive : 0f; _renderer.GetPropertyBlock(_mpb); _mpb.SetVector("_Velocity", vel); _mpb.SetFloat("_Weight", weight); _mpb.SetFloat("_SimDeltaTime", dt); _renderer.SetPropertyBlock(_mpb); _posLast = transform.position; }
void LateUpdate() { // which lod is this object in (roughly)? var thisRect = new Rect(new Vector2(transform.position.x, transform.position.z), Vector3.zero); var minLod = LodDataMgrAnimWaves.SuggestDataLOD(thisRect); if (minLod == -1) { // outside all lods, nothing to update! return; } // how many active wave sims currently apply to this object - ideally this would eliminate sims that are too // low res, by providing a max grid size param int simsPresent, simsActive; LodDataMgrDynWaves.CountWaveSims(minLod, out simsPresent, out simsActive); // counting non-existent sims is expensive - stop updating if none found if (simsPresent == 0) { enabled = false; return; } // no sims running - abort. don't bother switching off renderer - camera wont be active if (simsActive == 0) { return; } var disp = _boat.CalculateDisplacementToObject(); transform.position = transform.parent.TransformPoint(_localOffset) - disp + _velocityPositionOffset * _boat.RB.velocity; var rnd = 1f + _noiseAmp * (2f * Mathf.PerlinNoise(_noiseFreq * OceanRenderer.Instance.CurrentTime, 0.5f) - 1f); // feed in water velocity var vel = (transform.position - _posLast) / Time.deltaTime; if (OceanRenderer.Instance._simSettingsFlow != null && OceanRenderer.Instance._simSettingsFlow._readbackData && GPUReadbackFlow.Instance) { var position = transform.position; var samplingArea = new Rect(position.x, position.z, 0f, 0f); GPUReadbackFlow.Instance.GetSamplingData(ref samplingArea, _boat.ObjectWidth, _samplingDataFlow); Vector2 surfaceFlow; GPUReadbackFlow.Instance.SampleFlow(ref position, _samplingDataFlow, out surfaceFlow); vel -= new Vector3(surfaceFlow.x, 0, surfaceFlow.y); GPUReadbackFlow.Instance.ReturnSamplingData(_samplingDataFlow); } vel.y *= _weightUpDownMul; var speedKmh = vel.magnitude * 3.6f; if (speedKmh > _teleportSpeed) { // teleport detected vel *= 0f; if (_warnOnTeleport) { Debug.LogWarning("Teleport detected (speed = " + speedKmh.ToString() + "), velocity discarded.", this); } } else if (speedKmh > _maxSpeed) { // limit speed to max vel *= _maxSpeed / speedKmh; if (_warnOnSpeedClamp) { Debug.LogWarning("Speed (" + speedKmh.ToString() + ") exceeded max limited, clamped.", this); } } float dt; int steps; OceanRenderer.Instance._lodDataDynWaves.GetSimSubstepData(Time.deltaTime, out steps, out dt); float weight = _boat.InWater ? _weight / simsActive : 0f; for (int mati = 0; mati < _dynWavesInput.MaterialCount; mati++) { var mat = _dynWavesInput.GetMaterial(mati); mat.SetVector("_Velocity", vel); mat.SetFloat("_Weight", weight); mat.SetFloat("_SimDeltaTime", dt); } _posLast = transform.position; }