Esempio n. 1
0
 static ClientCrateIconHelper()
 {
     RenderingMaterialCrateIcon = RenderingMaterial.Create(
         new EffectResource("Special/CrateIcon"));
     RenderingMaterialCrateIcon.EffectParameters
     .Set("MaskTexture", new TextureResource("FX/Special/CrateIconMask"));
 }
        public static void Setup(
            IComponentSpriteRenderer renderer,
            float power,
            float pivotY,
            bool canFlip = true)
        {
            var worldObject = renderer.SceneObject.AttachedWorldObject;

            if (worldObject == null)
            {
                // blueprint - use default rendering
                return;
            }

            var isRenderingFlipped = canFlip &&
                                     PositionalRandom.Get(worldObject.TilePosition, 0, 3, seed: 9125835) == 0;

            var phaseOffset = (byte)PositionalRandom.Get(worldObject.TilePosition, 0, 8, seed: 614392664);

            var preset = new GrassAnimationPreset(power, pivotY, phaseOffset, isRenderingFlipped);

            if (!Materials.TryGetValue(preset, out var material))
            {
                // no cached material found for the required preset - create and setup new material
                Materials[preset] = material = RenderingMaterial.Create(EffectResource);
                material.EffectParameters
                .Set("Flip", isRenderingFlipped ? 1 : 0)
                .Set("Power", power)
                .Set("PivotY", pivotY)
                .Set("PhaseOffset", phaseOffset);
            }

            renderer.RenderingMaterial = material;
        }
        public ClientBlueprintTilesRenderer(IClientSceneObject sceneObjectRoot)
        {
            this.sceneObjectRoot = sceneObjectRoot;

            if (renderingMaterial is null)
            {
                renderingMaterial = RenderingMaterial.Create(new EffectResource("SolidColor"));
                renderingMaterial.EffectParameters.Set(EffectParameters);
            }

            this.Reset();
        }
        public ClientBlueprintRenderer(IClientSceneObject sceneObjectRoot)
        {
            this.sceneObjectRoot = sceneObjectRoot;
            this.SpriteRenderer  = Api.Client.Rendering.CreateSpriteRenderer(
                sceneObjectRoot,
                TextureResource.NoTexture);

            this.SpriteRenderer.RenderingMaterial =
                RenderingMaterial.Create(new EffectResource("ConstructionPlacement"));

            this.Reset();
        }
 public void Setup(
     ApplyToolDelegate selectedCallback,
     Func <List <Vector2Ushort>, bool> validateCallback,
     bool isRepeatOnMove,
     Action inputReleasedCallback = null)
 {
     this.selectedCallback      = selectedCallback;
     this.inputReleasedCallback = inputReleasedCallback;
     this.validateCallback      = validateCallback;
     this.isRepeatOnMove        = isRepeatOnMove;
     this.material = RenderingMaterial.Create(new EffectResource("ConstructionBlueprint"));
     this.material.EffectParameters.Set(EffectParametersDefault);
 }
Esempio n. 6
0
        public EditorToolZoneRenderer(ClientZoneProvider zoneProvider)
        {
            this.material = RenderingMaterial.Create(new EffectResource("SolidColor"));

            this.sceneObject = Api.Client.Scene.CreateSceneObject(
                "EditorToolZones / Zone renderer - " + zoneProvider.ProtoZone.ShortId);

            this.ZoneProvider = zoneProvider;
            this.ZoneProvider.ZoneModified             += this.ZoneModifiedHandler;
            this.ZoneProvider.ZoneReset                += this.ZoneResetHandler;
            ClientComponentUpdateHelper.UpdateCallback += this.Update;

            this.RebuildAllRenderers();
        }
Esempio n. 7
0
        private static RenderingMaterial GetRenderingMaterial(Vector2Ushort size)
        {
            var outlineSize = (float)(0.02 * 256.0 / size.X);

            if (RenderingMaterialLockedEntryByOutlineSize.TryGetValue(outlineSize, out var result))
            {
                return(result);
            }

            result = RenderingMaterial.Create(
                new EffectResource("Special/CompletionistLockedEntryIcon"));
            result.EffectParameters.Set("OutlineSize", outlineSize);
            RenderingMaterialLockedEntryByOutlineSize[outlineSize] = result;
            return(result);
        }
        public EditorToolZoneRenderer(ClientZoneProvider zoneProvider)
        {
            this.material = RenderingMaterial.Create(new EffectResource("LandClaimArea"));
            this.material.EffectParameters.Set("SpriteTexture",
                                               new TextureResource("FX/EditorZoneTile"));

            this.sceneObject = Api.Client.Scene.CreateSceneObject(
                "EditorToolZones / Zone renderer - " + zoneProvider.ProtoZone.ShortId);

            this.ZoneProvider = zoneProvider;
            this.ZoneProvider.ZoneModified    += this.ZoneModifiedHandler;
            this.ZoneProvider.ZoneReset       += this.ZoneResetHandler;
            ClientUpdateHelper.UpdateCallback += this.Update;

            this.RebuildAllRenderers();
        }
        //public override async void ClientInitialize()
        //{
        //    await CreateTestTexturePreviewer();
        //}

        private static async Task CreateTestTexturePreviewer()
        {
            var sourceTextureResource = new TextureResource("FX/SkinToneMaps/ImageToModify.png");
            var lutTextureResource    = new TextureResource3D("FX/SkinToneMaps/Lut1.png", depth: 24, isTransparent: false);
            var lutTexture3D          = await Client.Rendering.LoadTexture3D(lutTextureResource);

            var textureSize = await Client.Rendering.GetTextureSize(sourceTextureResource);

            var textureWidth  = textureSize.X;
            var textureHeight = textureSize.Y;

            var renderingTag      = nameof(BootstrapperSkinToneRemapping);
            var renderingMaterial = RenderingMaterial.Create(new EffectResource("ColorLutRemap"));

            renderingMaterial.EffectParameters.Set("TextureLut", lutTexture3D);

            var sceneObjectCamera = Client.Scene.CreateSceneObject("Skin tone remapping camera");
            var camera            = Client.Rendering.CreateCamera(sceneObjectCamera,
                                                                  renderingTag: renderingTag,
                                                                  drawOrder: -10,
                                                                  drawMode: CameraDrawMode.Auto);

            var renderTarget = Client.Rendering.CreateRenderTexture(renderingTag, textureWidth, textureHeight);

            camera.RenderTarget = renderTarget;
            camera.ClearColor   = Color.FromArgb(0, 0, 0, 0);
            camera.SetOrthographicProjection(textureWidth, textureHeight);

            Client.Rendering.CreateSpriteRenderer(sceneObjectCamera,
                                                  sourceTextureResource,
                                                  renderingTag: renderingTag,
                                                  // draw down
                                                  spritePivotPoint: (0, 1))
            .RenderingMaterial = renderingMaterial;

            var rectangle = new Rectangle
            {
                Width             = textureWidth,
                Height            = textureHeight,
                Fill              = Api.Client.UI.CreateImageBrushForRenderTarget(camera.RenderTarget),
                Stretch           = Stretch.Uniform,
                UseLayoutRounding = true
            };

            Panel.SetZIndex(rectangle, int.MaxValue);
            Api.Client.UI.LayoutRootChildren.Add(rectangle);
        }
Esempio n. 10
0
        static ObjectDecorationBannerFaction()
        {
            if (IsServer)
            {
                return;
            }

            RenderingMaterialEmblem = RenderingMaterial.Create(
                new EffectResource("DrawWithMask"));

            var maskTextureResource = new TextureResource(
                GenerateTexturePath(typeof(ObjectDecorationBannerFaction)) + "_Mask",
                qualityOffset: ClientFactionEmblemTextureProvider.SpriteQualityOffset);

            RenderingMaterialEmblem.EffectParameters
            .Set("MaskTextureArray", maskTextureResource);
        }
        public ClientBlueprintRenderer(
            IClientSceneObject sceneObjectRoot,
            bool isConstructionSite,
            Vector2D centerOffset)
        {
            this.sceneObjectRoot    = sceneObjectRoot;
            this.IsConstructionSite = isConstructionSite;
            this.textBlockCannotBuildReasonOffset = centerOffset + (0, TextBlockCannotBuildReasonOffsetY);

            this.SpriteRenderer = Api.Client.Rendering.CreateSpriteRenderer(
                sceneObjectRoot,
                TextureResource.NoTexture);

            this.SpriteRenderer.RenderingMaterial =
                RenderingMaterial.Create(new EffectResource("ConstructionPlacement"));

            this.Reset();
        }
        public static async Task <IRenderTarget2D> ApplyColorizerLut(
            ProceduralTextureRequest request,
            ITextureResource sourceTextureResource,
            string lutTextureFilePath)
        {
            var lutTextureResource = new TextureResource3D(lutTextureFilePath, depth: 24, isTransparent: false);
            var lutTexture3D       = await Renderer.LoadTexture3D(lutTextureResource);

            var textureSize = await Renderer.GetTextureSize(sourceTextureResource);

            var textureWidth  = textureSize.X;
            var textureHeight = textureSize.Y;

            var renderingMaterial = RenderingMaterial.Create(new EffectResource("ColorLutRemap"));

            renderingMaterial.EffectParameters.Set("TextureLut", lutTexture3D);

            var renderingTag = "Colorizer camera for procedural texture: " + request.TextureName;
            var cameraObject = Api.Client.Scene.CreateSceneObject(renderingTag);
            var camera       = Renderer.CreateCamera(cameraObject,
                                                     renderingTag: renderingTag,
                                                     drawOrder: -10,
                                                     drawMode: CameraDrawMode.Manual);

            var renderTarget = Renderer.CreateRenderTexture(renderingTag, textureWidth, textureHeight);

            camera.RenderTarget = renderTarget;
            camera.ClearColor   = Color.FromArgb(0, 0, 0, 0);
            camera.SetOrthographicProjection(textureWidth, textureHeight);

            Renderer.CreateSpriteRenderer(cameraObject,
                                          sourceTextureResource,
                                          renderingTag: renderingTag,
                                          // draw down
                                          spritePivotPoint: (0, 1))
            .RenderingMaterial = renderingMaterial;

            await camera.DrawAsync();

            cameraObject.Destroy();
            request.ThrowIfCancelled();

            return(renderTarget);
        }
Esempio n. 13
0
        public void Setup(
            IComponentSpriteRenderer spriteRenderer,
            double amplitude,
            double speed,
            double verticalStartOffsetRelative)
        {
            this.spriteRenderer         = spriteRenderer;
            this.originalPositionOffset = spriteRenderer.PositionOffset;
            this.originalMaterial       = spriteRenderer.RenderingMaterial;
            Client.Rendering.PreloadEffectAsync(EffectResource);

            this.material = RenderingMaterial.Create(EffectResource);
            this.material.EffectParameters
            .Set("Amplitude", (float)amplitude)
            .Set("Speed", (float)speed)
            .Set("VerticalStartOffsetRelative", (float)verticalStartOffsetRelative);

            this.RefreshMaterial();
        }
Esempio n. 14
0
        protected override void PrepareProtoTile(Settings settings)
        {
            if (IsServer)
            {
                return;
            }

            // Please note: this is a texture used for the ground UNDER the water.
            // The water sprite itself is assigned at ClientTileWaterHelper class.
            settings.GroundTextures.Add(
                new ProtoTileGroundTexture(
                    texture: this.UnderwaterGroundTextureAtlas,
                    blendMaskTexture: BlendMaskTextureSpraySmooth,
                    noiseSelector: null));

            this.waterPrimaryMaterial = RenderingMaterial.Create(WaterEffectResource);
            this.SetupMaterial(this.waterPrimaryMaterial);

            this.allMaterials.Add(this.waterPrimaryMaterial);
        }
Esempio n. 15
0
        public RenderingMaterial ClientGetWaterBlendMaterial(ClientTileBlendHelper.BlendLayer blendLayer)
        {
            var cacheKey = blendLayer.BlendSides;

            if (this.cachedBlendMaskMaterials.TryGetValue(cacheKey, out var material))
            {
                return(material);
            }

            var masks = new List <TileMaskSet>();

            ClientTileBlendHelper.CalculateMasks(blendLayer.BlendSides, masks);
            masks = ClientTileBlendHelper.DetectMasksInnerCorners(masks);
            Api.Assert(masks.Count > 0, "No masks?!");

            var effect = EffectForMaskCounts[masks.Count - 1];

            material = RenderingMaterial.Create(effect);
            this.SetupMaterial(material);

            var effectParameters = material.EffectParameters;

            effectParameters.Set("MaskTextureArray", BlendMaskTextureAtlas);

            for (var i = 0; i < masks.Count; i++)
            {
                var mask = masks[i];
                var flip = (mask.IsFlipHorizontally ? 1f : 0,
                            mask.IsFlipVertically ? 1f : 0);
                effectParameters.Set("Mask" + (i + 1) + "ArraySlice", mask.TextureMaskArraySlice)
                .Set("Mask" + (i + 1) + "Flip", flip);
            }

            material.EffectResource = effect;
            this.cachedBlendMaskMaterials[cacheKey] = material;
            this.allMaterials.Add(material);
            return(material);
        }
        public void Setup(
            IComponentSpriteRenderer spriteRenderer,
            ITextureResource[] framesTextureResources,
            double frameDurationSeconds)
        {
            if (framesTextureResources is null ||
                framesTextureResources.Length == 0)
            {
                throw new Exception("Incorrect sprite sheet");
            }

            this.spriteRenderer              = spriteRenderer;
            this.renderingMaterial           = RenderingMaterial.Create(EffectResourceDrawBlendAnimation);
            spriteRenderer.RenderingMaterial = this.renderingMaterial;

            this.framesTextureResources = framesTextureResources;
            this.frameDurationSeconds   = frameDurationSeconds;
            this.totalDurationSeconds   = frameDurationSeconds * framesTextureResources.Length;

            this.Reset();

            this.Update(0f);
        }
Esempio n. 17
0
        public static void ClientExplode(
            Vector2D position,
            ExplosionPreset explosionPreset,
            float volume = 1.0f)
        {
            // add screen shakes
            ClientComponentCameraScreenShakes.AddRandomShakes(
                duration: explosionPreset.ScreenShakesDuration,
                worldDistanceMin: explosionPreset.ScreenShakesWorldDistanceMin,
                worldDistanceMax: explosionPreset.ScreenShakesWorldDistanceMax);

            // play sound
            var explosionSoundEmitter = Client.Audio.PlayOneShot(explosionPreset.SoundSet.GetSound(),
                                                                 worldPosition: position,
                                                                 volume: volume,
                                                                 pitch: RandomHelper.Range(0.95f, 1.05f));

            // extend explosion sound distance
            explosionSoundEmitter.CustomMinDistance = (float)explosionPreset.LightWorldSize / 3;
            explosionSoundEmitter.CustomMaxDistance = (float)explosionPreset.LightWorldSize;

            // create explosion renderer
            var explosionSpriteAnimationDuration = explosionPreset.SpriteAnimationDuration;
            var explosionSceneObject             = Client.Scene.CreateSceneObject("Temp explosion",
                                                                                  position);

            explosionSceneObject.Destroy(delay: explosionSpriteAnimationDuration);

            var explosionSpriteRenderer = Client.Rendering.CreateSpriteRenderer(
                explosionSceneObject,
                TextureResource.NoTexture,
                drawOrder: DrawOrder.Explosion,
                spritePivotPoint: (0.5, 0.5));

            explosionSpriteRenderer.Color = explosionPreset.SpriteColorMultiplicative;
            explosionSpriteRenderer.Size  = explosionPreset.SpriteSize;
            if (explosionPreset.SpriteColorAdditive.HasValue
                // ReSharper disable once CompareOfFloatsByEqualityOperator
                || explosionPreset.SpriteBrightness != 1)
            {
                var renderingMaterial = RenderingMaterial.Create(EffectResourceAdditiveColorEffect);
                renderingMaterial.EffectParameters
                .Set("ColorAdditive", explosionPreset.SpriteColorAdditive ?? Colors.Black)
                .Set("Brightness", explosionPreset.SpriteBrightness);
                explosionSpriteRenderer.RenderingMaterial = renderingMaterial;
            }

            var isFlipped = 0
                            == PositionalRandom.Get(position.ToVector2Ushort(),
                                                    minInclusive: 0,
                                                    maxExclusive: 2,
                                                    seed: 893243289);

            if (isFlipped)
            {
                explosionSpriteRenderer.DrawMode = DrawMode.FlipHorizontally;
            }

            ClientComponentOneShotSpriteSheetAnimationHelper.Setup(
                explosionSpriteRenderer,
                explosionPreset.SpriteAtlasResources.TakeByRandom(),
                explosionSpriteAnimationDuration);

            // add light source for the explosion
            var explosionLight = ClientLighting.CreateLightSourceSpot(
                explosionSceneObject,
                explosionPreset.LightColor,
                size: explosionPreset.LightWorldSize,
                positionOffset: (0, 0),
                spritePivotPoint: (0.5, 0.5));

            ClientComponentOneShotLightAnimation.Setup(
                explosionLight,
                explosionPreset.LightDuration);

            // add blast wave
            var blastAnimationDuration = explosionPreset.BlastwaveAnimationDuration;

            if (blastAnimationDuration > 0)
            {
                ClientTimersSystem.AddAction(
                    explosionPreset.BlastwaveDelay,
                    () =>
                {
                    var blastSceneObject = Client.Scene.CreateSceneObject("Temp explosion",
                                                                          position);

                    blastSceneObject.Destroy(delay: blastAnimationDuration);

                    var blastSpriteRenderer = Client.Rendering.CreateSpriteRenderer(
                        blastSceneObject,
                        new TextureResource("FX/ExplosionBlast"),
                        drawOrder: DrawOrder.Explosion - 1,
                        spritePivotPoint: (0.5, 0.5));

                    // animate blast wave
                    ClientComponentGenericAnimationHelper.Setup(
                        blastSceneObject,
                        blastAnimationDuration,
                        updateCallback: alpha =>
                    {
                        var blastwaveAlpha        = (byte)(byte.MaxValue * (1 - alpha));
                        blastSpriteRenderer.Color = explosionPreset.BlastWaveColor
                                                    .WithAlpha(blastwaveAlpha);

                        var sizeX = MathHelper.Lerp(explosionPreset.BlastwaveSizeFrom.X,
                                                    explosionPreset.BlastwaveSizeTo.X,
                                                    alpha);
                        var sizeY = MathHelper.Lerp(explosionPreset.BlastwaveSizeFrom.Y,
                                                    explosionPreset.BlastwaveSizeTo.Y,
                                                    alpha);
                        blastSpriteRenderer.Size = new Size2F(sizeX, sizeY);
                    });
                });
            }

            ClientGroundExplosionAnimationHelper.OnExplode(
                delaySeconds: explosionSpriteAnimationDuration / 2,
                position: position);
        }
Esempio n. 18
0
        public static async Task <IRenderTarget2D> ApplyMaskToRenderTargetAsync(
            ProceduralTextureRequest request,
            IRenderTarget2D sourceRenderTarget,
            TextureResource maskResource)
        {
            var textureWidth     = (ushort)sourceRenderTarget.Width;
            var textureHeight    = (ushort)sourceRenderTarget.Height;
            var maskSizeAbsolute = await Renderer.GetTextureSize(maskResource);

            var maskScale = new Vector2F((float)(textureWidth / (double)maskSizeAbsolute.X),
                                         (float)(textureHeight / (double)maskSizeAbsolute.Y));

            var maskOffset = new Vector2F((float)((maskSizeAbsolute.X - textureWidth) / (2.0 * textureWidth)),
                                          (float)((maskSizeAbsolute.Y - textureHeight) / (2.0 * textureHeight)));

            /*Api.Logger.Dev(
            *   string.Format("Texture size: X={0} Y={1}"
            + "{2}Mask size: X={3} Y={4}"
            + "{2}Mask scale: X={5:F2} Y={6:F2}"
            + "{2}Mask offset: X={7:F2} Y={8:F2}",
            +                 textureWidth,
            +                 textureHeight,
            +                 Environment.NewLine,
            +                 maskSizeAbsolute.X,
            +                 maskSizeAbsolute.Y,
            +                 maskScale.X,
            +                 maskScale.Y,
            +                 maskOffset.X,
            +                 maskOffset.Y));*/

            var renderingMaterial = RenderingMaterial.Create(new EffectResource("DrawWithMaskOffset"));

            renderingMaterial.EffectParameters
            .Set("MaskTextureArray", maskResource)
            .Set("MaskScale", maskScale)
            .Set("MaskOffset", maskOffset);

            var renderingTag = "Mask camera for procedural texture: " + request.TextureName;
            var cameraObject = Api.Client.Scene.CreateSceneObject(renderingTag);
            var camera       = Renderer.CreateCamera(cameraObject,
                                                     renderingTag: renderingTag,
                                                     drawOrder: -10,
                                                     drawMode: CameraDrawMode.Manual);

            var renderTarget = Renderer.CreateRenderTexture(renderingTag, textureWidth, textureHeight);

            camera.RenderTarget = renderTarget;
            camera.ClearColor   = Color.FromArgb(0, 0, 0, 0);
            camera.SetOrthographicProjection(textureWidth, textureHeight);

            Renderer.CreateSpriteRenderer(cameraObject,
                                          sourceRenderTarget,
                                          renderingTag: renderingTag,
                                          // draw down
                                          spritePivotPoint: (0, 1))
            .RenderingMaterial = renderingMaterial;

            await camera.DrawAsync();

            cameraObject.Destroy();
            request.ThrowIfCancelled();

            return(renderTarget);
        }