11const std::vector<TextureBuffer::QuadVertex>
base_quad = {
12 { { -0.5F, -0.5F, 0.0F }, { 0.0F, 1.0F } },
13 { { 0.5F, -0.5F, 0.0F }, { 1.0F, 1.0F } },
14 { { -0.5F, 0.5F, 0.0F }, { 0.0F, 0.0F } },
15 { { 0.5F, 0.5F, 0.0F }, { 1.0F, 0.0F } }
22 const void* initial_pixel_data)
24 calculate_quad_vertex_size(),
26 Kakshya::DataModality::VERTEX_POSITIONS_3D)
31 if (initial_pixel_data) {
34 std::memcpy(
m_pixel_data.data(), initial_pixel_data, pixel_bytes);
40 "Created TextureBuffer: {}x{} ({} pixel bytes, {} vertex bytes)",
46 auto self = std::dynamic_pointer_cast<TextureBuffer>(shared_from_this());
55 chain = std::make_shared<BufferProcessingChain>();
58 chain->set_preferred_token(
token);
61 "TextureBuffer setup_processors: TextureProcessor will be attached on first registration");
69 0, 0, vk::DescriptorType::eCombinedImageSampler);
71 uint32_t binding_index = 1;
74 0, binding_index++, vk::DescriptorType::eCombinedImageSampler);
99 if (!data || size == 0) {
101 "set_pixel_data called with null or empty data");
110 "TextureBuffer: pixel data updated ({} bytes, marked dirty)", size);
129 "TextureBuffer: position set to ({}, {}), geometry marked dirty", x, y);
140 "TextureBuffer: scale set to ({}, {}), geometry marked dirty", width, height);
151 "TextureBuffer: rotation set to {}, geometry marked dirty", angle_radians);
161 if (vertices.size() != 4) {
163 "set_custom_vertices: must provide exactly 4 vertices, got {}", vertices.size());
173 "TextureBuffer: custom vertices set, geometry marked dirty");
184 "TextureBuffer: reset to default quad, geometry marked dirty");
207 .offset_in_vertex = offsetof(
QuadVertex, position),
208 .name =
"position" },
210 .offset_in_vertex = offsetof(
QuadVertex, texcoord),
211 .name =
"texcoord" } }
217 "TextureBuffer: generated default fullscreen quad");
224 "TextureBuffer: using custom vertices, skipping transform");
231 std::vector<QuadVertex> transformed(4);
232 for (
size_t i = 0; i < 4; ++i) {
238 float rotated_x = pos.x * cos_rot - pos.y * sin_rot;
239 float rotated_y = pos.x * sin_rot + pos.y * cos_rot;
244 transformed[i].position = pos;
245 transformed[i].texcoord =
base_quad[i].texcoord;
252 "TextureBuffer: regenerated quad with transform (pos={},{}, scale={},{}, rot={})",
#define MF_INFO(comp, ctx,...)
#define MF_ERROR(comp, ctx,...)
#define MF_WARN(comp, ctx,...)
#define MF_DEBUG(comp, ctx,...)
static MayaFlux::Nodes::ProcessingToken token
void setup_processors(ProcessingToken token) override
Setup processors with a processing token.
void use_default_quad()
Reset to default fullscreen quad Uses position and scale to generate quad geometry.
std::shared_ptr< TextureProcessor > m_texture_processor
bool m_uses_custom_vertices
void generate_quad_with_transform()
std::vector< uint8_t > m_pixel_data
std::shared_ptr< RenderProcessor > m_render_processor
void setup_rendering(const RenderConfig &config)
Setup rendering with RenderProcessor.
void mark_pixels_dirty()
Mark pixel data as changed Use this if you modify pixel data in-place without calling set_pixel_data(...
void set_position(float x, float y)
Set screen position (NDC or pixel coords depending on rendering setup)
static size_t calculate_quad_vertex_size()
TextureBuffer(uint32_t width, uint32_t height, Portal::Graphics::ImageFormat format, const void *initial_pixel_data=nullptr)
Create texture buffer with dimensions.
std::shared_ptr< Core::VKImage > get_texture() const
Get GPU texture image Suitable for binding to shaders via RenderProcessor::bind_texture()
std::vector< uint8_t > m_vertex_bytes
void set_rotation(float angle_radians)
Set rotation around center.
void generate_default_quad()
void set_scale(float width, float height)
Set display size.
void set_pixel_data(const void *data, size_t size)
Replace pixel data.
void set_custom_vertices(const std::vector< QuadVertex > &vertices)
void set_processing_chain(std::shared_ptr< Buffers::BufferProcessingChain > chain, bool force=false) override
Replace the buffer's processing chain.
void set_vertex_layout(const Kakshya::VertexLayout &layout)
Set vertex layout for this buffer.
void resize(size_t new_size, bool preserve_data=false)
Resize buffer and recreate GPU resources if needed.
void set_default_processor(std::shared_ptr< Buffers::BufferProcessor > processor) override
Set the buffer's default processor.
std::shared_ptr< Buffers::BufferProcessingChain > get_processing_chain() override
Access the buffer's processing chain.
Vulkan-backed buffer wrapper used in processing chains.
static size_t get_bytes_per_pixel(ImageFormat format)
Get bytes per pixel for a format.
const std::vector< TextureBuffer::QuadVertex > base_quad
ProcessingToken
Bitfield enum defining processing characteristics and backend requirements for buffer operations.
@ BufferProcessing
Buffer processing (Buffers::BufferManager, processing chains)
@ Init
Engine/subsystem initialization.
@ Buffers
Buffers, Managers, processors and processing chains.
ImageFormat
User-friendly image format enum.
Describes how a VKBuffer binds to a shader descriptor.
Complete configuration for shader processor.
Use custom vertex geometry instead of default quad.
std::string vertex_shader
std::vector< std::pair< std::string, std::shared_ptr< Core::VKImage > > > additional_textures
std::string fragment_shader
std::shared_ptr< Core::Window > target_window
std::string default_texture_binding
Portal::Graphics::PrimitiveTopology topology
uint32_t vertex_count
Total number of vertices in this buffer.
Complete description of vertex data layout in a buffer.