Files
FlaxEngine/Source/Engine/Graphics/PixelFormatSampler.h

83 lines
3.8 KiB
C++

// Copyright (c) Wojciech Figat. All rights reserved.
#pragma once
#include "PixelFormat.h"
/// <summary>
/// Utility for writing and reading from different pixels formats within a single code path.
/// </summary>
API_STRUCT(NoDefault) struct FLAXENGINE_API PixelFormatSampler
{
DECLARE_SCRIPTING_TYPE_MINIMAL(PixelFormatSampler);
typedef Float4 (*ReadPixel)(const void* data);
typedef void (*WritePixel)(void* data, const Float4& value);
public:
// Element format.
PixelFormat Format;
// Element size in bytes.
int32 PixelSize;
// Read data function.
ReadPixel Read;
// Write data function.
WritePixel Write;
public:
/// <summary>
/// Stores the color into the specified texture data (uses no interpolation).
/// </summary>
/// <param name="data">The data pointer for the texture slice (1D or 2D image).</param>
/// <param name="x">The X texture coordinates (normalized to range 0-width).</param>
/// <param name="y">The Y texture coordinates (normalized to range 0-height).</param>
/// <param name="rowPitch">The row pitch (in bytes). The offset between each image rows.</param>
/// <param name="color">The color to store (linear).</param>
void Store(void* data, int32 x, int32 y, int32 rowPitch, const Color& color) const;
/// <summary>
/// Samples the specified linear data (uses no interpolation).
/// </summary>
/// <param name="data">The data pointer for the data slice (linear buffer or 1D image).</param>
/// <param name="x">Index of the element.</param>
/// <returns>The sampled value.</returns>
Float4 Sample(const void* data, int32 x) const;
/// <summary>
/// Samples the specified texture data (uses no interpolation).
/// </summary>
/// <param name="data">The data pointer for the texture slice (1D or 2D image).</param>
/// <param name="uv">The texture coordinates (normalized to range 0-1).</param>
/// <param name="size">The size of the input texture (in pixels).</param>
/// <param name="rowPitch">The row pitch (in bytes). The offset between each image rows.</param>
/// <returns>The sampled color (linear).</returns>
Color SamplePoint(const void* data, const Float2& uv, const Int2& size, int32 rowPitch) const;
/// <summary>
/// Samples the specified texture data (uses no interpolation).
/// </summary>
/// <param name="data">The data pointer for the texture slice (1D or 2D image).</param>
/// <param name="x">The X texture coordinates (normalized to range 0-width).</param>
/// <param name="y">The Y texture coordinates (normalized to range 0-height).</param>
/// <param name="rowPitch">The row pitch (in bytes). The offset between each image rows.</param>
/// <returns>The sampled color (linear).</returns>
Color SamplePoint(const void* data, int32 x, int32 y, int32 rowPitch) const;
/// <summary>
/// Samples the specified texture data (uses linear interpolation).
/// </summary>
/// <param name="data">The data pointer for the texture slice (1D or 2D image).</param>
/// <param name="uv">The texture coordinates (normalized to range 0-1).</param>
/// <param name="size">The size of the input texture (in pixels).</param>
/// <param name="rowPitch">The row pitch (in bytes). The offset between each image rows.</param>
/// <returns>The sampled color (linear).</returns>
Color SampleLinear(const void* data, const Float2& uv, const Int2& size, int32 rowPitch) const;
public:
/// <summary>
/// Tries to get a sampler tool for the specified format to read pixels.
/// </summary>
/// <param name="format">The format.</param>
/// <returns>The pointer to the sampler object or null when cannot sample the given format.</returns>
static const PixelFormatSampler* Get(PixelFormat format);
};