// Called when visible to a camera void OnWillRenderObject() { // per instance data // 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 = _lodIndex == 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 = _lodIndex == _totalLodCount - 1 && OceanRenderer.Instance.ScaleCouldDecrease; float farNormalsWeight = needToBlendOutNormals ? OceanRenderer.Instance.ViewerAltitudeLevelAlpha : 1f; _rend.material.SetVector("_InstanceData", new Vector4(meshScaleLerp, farNormalsWeight, _lodIndex)); // geometry data float squareSize = transform.lossyScale.x / _baseVertDensity; float mul = 1.875f; // fudge 1 float pow = 1.4f; // fudge 2 float normalScrollSpeed0 = Mathf.Pow(Mathf.Log(1f + 2f * squareSize) * mul, pow); float normalScrollSpeed1 = Mathf.Pow(Mathf.Log(1f + 4f * squareSize) * mul, pow); _rend.material.SetVector("_GeomData", new Vector4(squareSize, normalScrollSpeed0, normalScrollSpeed1, _baseVertDensity)); // assign shape textures to shader // this relies on the render textures being init'd in CreateAssignRenderTexture::Awake(). Camera[] shapeCams = OceanRenderer.Instance.Builder._shapeCameras; WaveDataCam wdc0 = shapeCams[_lodIndex].GetComponent <WaveDataCam>(); wdc0.ApplyMaterialParams(0, _rend.material); WaveDataCam wdc1 = (_lodIndex + 1) < shapeCams.Length ? shapeCams[_lodIndex + 1].GetComponent <WaveDataCam>() : null; if (wdc1) { wdc1.ApplyMaterialParams(1, _rend.material); } else { _rend.material.SetTexture("_WD_Sampler_1", null); } // killing this as we use heightmaps now, not displacement textures, and im not sure if/when this will change #if USING_DISPLACEMENT_TEXTURES // expand mesh bounds - bounds need to completely encapsulate verts after any dynamic displacement Bounds bounds = _boundsLocal; float boundsPadding = OceanRenderer.Instance._chop * OceanRenderer.Instance._maxWaveHeight; float expand = boundsPadding / transform.lossyScale.x; bounds.extents += new Vector3(expand, 0f, expand); _mesh.bounds = bounds; #endif if (_drawRenderBounds) { DebugDrawRendererBounds(); } }
// Called when visible to a camera void OnWillRenderObject() { // per instance data if (_mpb == null) { _mpb = new MaterialPropertyBlock(); } _rend.GetPropertyBlock(_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 = _lodIndex == 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 = _lodIndex == _totalLodCount - 1 && OceanRenderer.Instance.ScaleCouldDecrease; float farNormalsWeight = needToBlendOutNormals ? OceanRenderer.Instance.ViewerAltitudeLevelAlpha : 1f; _mpb.SetVector("_InstanceData", new Vector4(meshScaleLerp, farNormalsWeight, _lodIndex)); // geometry data float squareSize = transform.lossyScale.x / _baseVertDensity; float mul = 1.875f; // fudge 1 float pow = 1.4f; // fudge 2 float normalScrollSpeed0 = Mathf.Pow(Mathf.Log(1f + 2f * squareSize) * mul, pow); float normalScrollSpeed1 = Mathf.Pow(Mathf.Log(1f + 4f * squareSize) * mul, pow); _mpb.SetVector("_GeomData", new Vector4(squareSize, normalScrollSpeed0, normalScrollSpeed1, _baseVertDensity)); // assign shape textures to shader // this relies on the render textures being init'd in CreateAssignRenderTexture::Awake(). Camera[] shapeCams = OceanRenderer.Instance.Builder._shapeCameras; WaveDataCam wdc0 = shapeCams[_lodIndex].GetComponent <WaveDataCam>(); wdc0.ApplyMaterialParams(0, new PropertyWrapperMPB(_mpb)); WaveDataCam wdc1 = (_lodIndex + 1) < shapeCams.Length ? shapeCams[_lodIndex + 1].GetComponent <WaveDataCam>() : null; if (wdc1) { wdc1.ApplyMaterialParams(1, new PropertyWrapperMPB(_mpb)); } _rend.SetPropertyBlock(_mpb); if (_drawRenderBounds) { DebugDrawRendererBounds(); } }
// Called when visible to a camera void OnWillRenderObject() { // per instance data // blend closest geometry in/out to avoid pop float meshScaleLerp = _lodIndex == 0 ? OceanRenderer.Instance.ViewerAltitudeLevelAlpha : 0f; // blend furthest normals scale in/out to avoid pop float farNormalsWeight = _lodIndex == _totalLodCount - 1 ? OceanRenderer.Instance.ViewerAltitudeLevelAlpha : 1f; _rend.material.SetVector("_InstanceData", new Vector4(meshScaleLerp, farNormalsWeight, _lodIndex)); // geometry data float squareSize = Mathf.Abs(transform.lossyScale.x) / _baseVertDensity; float normalScrollSpeed0 = Mathf.Log(1f + 2f * squareSize) * 1.875f; float normalScrollSpeed1 = Mathf.Log(1f + 4f * squareSize) * 1.875f; _rend.material.SetVector("_GeomData", new Vector4(squareSize, normalScrollSpeed0, normalScrollSpeed1, _baseVertDensity)); // assign shape textures to shader // this relies on the render textures being init'd in CreateAssignRenderTexture::Awake(). Camera[] shapeCams = OceanRenderer.Instance.Builder._shapeCameras; WaveDataCam wdc0 = shapeCams[_lodIndex].GetComponent <WaveDataCam>(); wdc0.ApplyMaterialParams(0, _rend.material); WaveDataCam wdc1 = (_lodIndex + 1) < shapeCams.Length ? shapeCams[_lodIndex + 1].GetComponent <WaveDataCam>() : null; if (wdc1) { wdc1.ApplyMaterialParams(1, _rend.material); } else { _rend.material.SetTexture("_WD_Sampler_1", null); } // expand mesh bounds - bounds need to completely encapsulate verts after any dynamic displacement Bounds bounds = _boundsLocal; float expand = _boundsPadding / Mathf.Abs(transform.lossyScale.x); bounds.extents += new Vector3(expand, 0f, expand); _mesh.bounds = bounds; if (_drawRenderBounds) { DebugDrawRendererBounds(); } }