public static void CreateCliffRenderer(
     IClientSceneObject sceneObject,
     ColumnRow textureRegion,
     TextureAtlasResource cliffAtlas)
 {
     RenderingService.CreateSpriteRenderer(
         sceneObject,
         cliffAtlas.Chunk(textureRegion.Column, textureRegion.Row),
         drawOrder: DrawOrder.GroundCliffs,
         positionOffset: (0, 0));
 }
Exemplo n.º 2
0
        protected override void ClientSetupRenderer(IComponentSpriteRenderer renderer)
        {
            renderer.PositionOffset   = (0.5, 0.0);
            renderer.SpritePivotPoint = (0.5, 0);
            renderer.DrawOrderOffsetY = 0.38;
            renderer.Scale            = 1.3;

            // making the grass choose random element of the atlas depending on world position
            var position   = renderer.SceneObject.Position.ToVector2Ushort();
            var atlasChunk = (byte)PositionalRandom.Get(position, 0, 4, seed: 12345);

            renderer.TextureResource = textureAtlas.Chunk(atlasChunk, 0);

            ClientGrassRenderingHelper.Setup(renderer,
                                             power: 0.1f,
                                             pivotY: 0.2f);
        }
Exemplo n.º 3
0
        private async Task <IGeneratedTexture2D> GenerateProceduralTextureInternal(
            string textureName,
            TextureAtlasResource sourceTextureAtlas,
            ProceduralTextureRequest request,
            bool isAtlas)
        {
            var renderingTag = string.Format("Procedural texture \"{0}\" camera \"{1}\"",
                                             textureName,
                                             sourceTextureAtlas.TextureResource);
            var client       = Api.Client;
            var cameraObject = client.Scene.CreateSceneObject(renderingTag);
            var camera       = client.Rendering.CreateCamera(cameraObject,
                                                             renderingTag,
                                                             -10);

            var wallChunkTypes = FloorChunkPresets;
            var atlasSize      = AtlasSize;
            var textureWidth   = this.AtlasTextureWidth;
            var textureHeight  = this.AtlasTextureHeight;

            var rendering     = Api.Client.Rendering;
            var renderTexture = rendering.CreateRenderTexture(renderingTag, textureWidth, textureHeight);

            camera.RenderTarget = renderTexture;
            // TODO: we cannot use Colors.Transparent because RGB=FFFFFF in that case.
            camera.ClearColor = Color.FromArgb(0, 0, 0, 0);
            camera.SetOrthographicProjection(textureWidth, textureHeight);
            camera.TextureFilter = TextureFilter.Point;

            foreach (var variant in wallChunkTypes.Values)
            {
                if (variant.Layers == null)
                {
                    // reusing layers from another chunk
                    continue;
                }

                var targetRow    = variant.TargetRow;
                var targetColumn = variant.TargetColumn;

                if (targetRow >= atlasSize.RowsCount)
                {
                    Api.Logger.Error(
                        $"Floor chunk target row is exceed rows count: {targetRow} >= {atlasSize.RowsCount}");
                }

                if (targetColumn >= atlasSize.ColumnsCount)
                {
                    Api.Logger.Error(
                        $"Floor chunk target column is exceed columns count: {targetColumn} >= {atlasSize.ColumnsCount}");
                }

                foreach (var layer in variant.Layers)
                {
                    rendering.CreateSpriteRenderer(
                        cameraObject,
                        sourceTextureAtlas.Chunk(layer.Column, layer.Row),
                        positionOffset: (this.TileTextureSize * targetColumn, -this.TileTextureSize * targetRow),
                        // draw down
                        spritePivotPoint: (0, 1),
                        renderingTag: renderingTag);
                }
            }

            await camera.DrawAsync();

            cameraObject.Destroy();

            request.ThrowIfCancelled();

            IGeneratedTexture2D generatedTexture;

            if (isAtlas)
            {
                generatedTexture = await renderTexture.SaveToTextureAtlas(atlasSize, isTransparent : true);

                //Api.Logger.Write($"Texture atlas generated: {renderingTag} atlas size: {atlasSize}");
            }
            else
            {
                generatedTexture = await renderTexture.SaveToTexture(isTransparent : true);
            }

            renderTexture.Dispose();
            request.ThrowIfCancelled();
            return(generatedTexture);
        }