/// <summary>
        /// Cache the materials to animate and anything else worth saving.
        /// </summary>
        private void Start()
        {
            var renderers = GetComponentsInChildren <Renderer>();

            for (int i = 0; i < renderers.Length; ++i)
            {
                var rend = renderers[i];
                if (!rend.material.HasProperty(diffuseName))
                {
                    continue;
                }
                if (!rend.material.HasProperty(emissiveName))
                {
                    continue;
                }

                AnimMat animMat = new AnimMat()
                {
                    material = rend.material,
                    diffuse  = rend.material.GetColor(diffuseName),
                    emissive = rend.material.GetColor(emissiveName),
                };
                rend.material.SetColor(diffuseName, Color.black);
                SetIntensity(0.0f, animMat);
                materials.Add(animMat);
            }
            initScale = transform.localScale;
            age       = 0.0f;
        }
        /// <summary>
        /// Ramp up the animation at beginning.
        /// </summary>
        /// <param name="age"></param>
        private void RampUp(float age)
        {
            float intensity = SmoothStep(0.0f, 1.0f, age / rampUp);

            for (var iter = materials.GetEnumerator(); iter.MoveNext();)
            {
                AnimMat animMat = iter.Current;
                SetIntensity(intensity, animMat);
            }
            SetSizeFromAge(age);
        }
        /// <summary>
        /// Turn off the animation at the end.
        /// </summary>
        private void SetStatic()
        {
#if BARN_DISABLE_AT_END
            gameObject.SetActive(false);
#else
            for (var iter = materials.GetEnumerator(); iter.MoveNext();)
            {
                AnimMat animMat  = iter.Current;
                Color   emissive = animMat.diffuse;
                animMat.material.SetColor(emissiveName, emissive);
            }
#endif
        }
        /// <summary>
        /// Interpolate between original emissive and diffuse colors based on intensity.
        /// </summary>
        /// <param name="intensity">Interpolant, as intensity goes to one, color goes to diffuse.</param>
        /// <param name="animMat">Which material to set.</param>
        private void BlendIntensity(float intensity, AnimMat animMat)
        {
            Color emissive = animMat.emissive * intensity + animMat.diffuse * (1.0f - intensity);

            animMat.material.SetColor(emissiveName, emissive);
        }
        /// <summary>
        /// Set the emissive color to intensity.
        /// </summary>
        /// <param name="intensity">Intensity to set emissive.</param>
        /// <param name="animMat">Which material to set.</param>
        private void SetIntensity(float intensity, AnimMat animMat)
        {
            Color emissive = animMat.emissive * intensity;

            animMat.material.SetColor(emissiveName, emissive);
        }