// 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();
            }
        }
Exemple #2
0
        // 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();
            }
        }