예제 #1
0
        public Material PickMaterial(Decal canvas, out bool isDirty)
        {
            var  size = new DecalSize(canvas.decalTexture.width, canvas.decalTexture.height);
            Pool pool;

            if (m_pool.TryGetValue(size, out pool))
            {
                return(pool.Pick(out isDirty));
            }
            isDirty = false;
            return(null);
        }
예제 #2
0
        public virtual void Mark(Decal decal, Vector3 point)
        {
            if (useGradientColors)
            {
                color = Decal.GetNextGradient();
            }
            if (lightnessVariation > 0)
            {
                float h, s, v;
                Color.RGBToHSV(color, out h, out s, out v);
                color = Color.HSVToRGB(h, s, _startV - Random.Range(0, lightnessVariation));
            }
            if (placeSmudge)
            {
                decal.PlaceSmudge(point, color, lerp);
            }
            else
            {
                decal.PlacePixel(point, color, lerp);
            }
            switch (onMarkAction)
            {
            case OnMarkAction.Disable:
                gameObject.SetActive(false);
                break;

            case OnMarkAction.ScaleDown:
                if (_cachedTransform.localScale.x <= 0)
                {
                    goto case OnMarkAction.Disable;
                }
                _cachedTransform.localScale = Vector3.MoveTowards(_cachedTransform.localScale, Vector3.zero, scaleDownRate);
                break;

            case OnMarkAction.BounceScaleDown:
                if (_cachedTransform.localScale.x <= 0)
                {
                    goto case OnMarkAction.Disable;
                }
                _cachedTransform.localScale = Vector3.MoveTowards(_startScale, Vector3.zero, 1f - ((float)bounces / _bounceStart));
                bounces--;
                break;

            case OnMarkAction.BounceAndDisable:
                if (bounces <= 0)
                {
                    goto case OnMarkAction.Disable;
                }
                bounces--;
                break;
            }
        }
예제 #3
0
        void OnParticleCollision(GameObject other)
        {
            var   collCount = part.GetCollisionEvents(other, m_collisionEvents);
            var   safe      = part.GetSafeCollisionEventSize();
            Decal decal     = other.GetComponentInChildren <Decal>();
            var   count     = useSafeCollision ? safe : collCount;

            if (decal == null)
            {
                return;
            }

            for (int i = 0; i < count; i++)
            {
                Mark(decal, m_collisionEvents[i].intersection);
            }
        }
예제 #4
0
        public void RegisterDecal(Decal canvas)
        {
            var size       = new DecalSize(canvas.decalTexture.width, canvas.decalTexture.height);
            var pixelCount = size.width * size.height;

            if (!m_blankCache.ContainsKey(pixelCount))
            {
                var colorArray = new Color32[pixelCount];
                m_blankCache.Add(pixelCount, colorArray);
            }
            if (m_pool.ContainsKey(size))
            {
                var pool = m_pool[size];
                pool.AddMaterial();
            }
            else
            {
                var pool = new Pool(canvas.decalMaterial, 10);
                m_pool.Add(size, pool);
            }
        }