예제 #1
0
        public ShadowRenderingRequest(TrueShadow shadow)
        {
            this.shadow = shadow;

            var casterScale = 1f;

            try
            {
                casterScale = shadow.Graphic.canvas.scaleFactor;
            }
            catch (NullReferenceException) { }

            shadowSize   = shadow.Size * casterScale;
            shadowOffset = shadow.Offset.Rotate(-shadow.RectTransform.eulerAngles.z) * casterScale;
            rect         = shadow.RectTransform.rect;
            dimensions   = rect.size * casterScale;

            // Tiled type cannot be batched by similar size
            int dimensionHash = shadow.Graphic is Image image && image.type == Image.Type.Tiled
                                ? dimensions.GetHashCode()
                                : HashUtils.CombineHashCodes(
                Mathf.CeilToInt(dimensions.x / DIMENSIONS_HASH_STEP) * DIMENSIONS_HASH_STEP,
                Mathf.CeilToInt(dimensions.y / DIMENSIONS_HASH_STEP) * DIMENSIONS_HASH_STEP
                );

            hash = HashUtils.CombineHashCodes(
                Mathf.CeilToInt(shadowSize * 100),
                dimensionHash,
                shadow.ContentHash
                );
        }
        void CalcHash()
        {
            var graphic = shadow.Graphic;

            int canvasScaleHash = (int)(canvasScale * 1e4);
            int insetHash       = shadow.Inset ? 1 : 0;

            var clearColor = shadow.ClearColor;
            var imageColor = graphic.color;
            int colorHash  = HashUtils.CombineHashCodes(
                shadow.IgnoreCasterColor ? 1 : 0,
                (int)shadow.ColorBleedMode,
                (int)(imageColor.r * 255),
                (int)(imageColor.g * 255),
                (int)(imageColor.b * 255),
                (int)(imageColor.a * 255),
                (int)(clearColor.r * 255),
                (int)(clearColor.g * 255),
                (int)(clearColor.b * 255),
                (int)(clearColor.a * 255)
                );

            // Hack until we have separated cutout cache, or proper sibling mode
            int offsetHash = HashUtils.CombineHashCodes(
                shadow.Cutout ? 1 : 0,
                (int)(canvasRelativeOffset.x * 100),
                (int)(canvasRelativeOffset.y * 100)
                );

            // Tiled type cannot be batched by similar size
            int dimensionHash = graphic is Image im && im.type == Image.Type.Tiled
                                ? dimensions.GetHashCode()
                                : HashUtils.CombineHashCodes(
                Mathf.CeilToInt(dimensions.x / DIMENSIONS_HASH_STEP) * DIMENSIONS_HASH_STEP,
                Mathf.CeilToInt(dimensions.y / DIMENSIONS_HASH_STEP) * DIMENSIONS_HASH_STEP
                );

            var sizeHash = Mathf.CeilToInt(size * 100);

            var commonHash = HashUtils.CombineHashCodes(
                shadow.TextureRevision,
                canvasScaleHash,
                insetHash,
                colorHash,
                offsetHash,
                dimensionHash,
                sizeHash
                );

            switch (graphic)
            {
            case Image image:
                int spriteHash = 0;
                if (image.sprite)
                {
                    spriteHash = image.sprite.GetHashCode();
                }

                int imageHash = HashUtils.CombineHashCodes(
                    (int)image.type,
                    (int)(image.fillAmount * 360 * 20),
                    (int)image.fillMethod,
                    image.fillOrigin,
                    image.fillClockwise ? 1 : 0
                    );

                hash = HashUtils.CombineHashCodes(
                    commonHash,
                    spriteHash,
                    imageHash
                    );
                break;

            case RawImage rawImage:
                var textureHash = 0;
                if (rawImage.texture)
                {
                    textureHash = rawImage.texture.GetInstanceID();
                }

                hash = HashUtils.CombineHashCodes(
                    commonHash,
                    textureHash
                    );
                break;

            default:
                hash = commonHash;
                break;
            }
        }
 public override int GetHashCode()
 {
     return(HashUtils.CombineHashCodes(Key.GetHashCode(), Value.GetHashCode()));
 }
예제 #4
0
 public override int GetHashCode()
 {
     return(HashUtils.CombineHashCodes(_variants.Select(v => v.GetHashCode()).ToArray()));
 }