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)); }
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); }
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); }