blob: 9ee0a730e0a5cae9f2330be2e7ccf549ddbd1edc [file] [log] [blame]
//
// Copyright 2022 Rive
//
#ifndef _RIVE_SOKOL_TESS_RENDERER_HPP_
#define _RIVE_SOKOL_TESS_RENDERER_HPP_
#include "rive/tess/tess_renderer.hpp"
#include "sokol_gfx.h"
namespace rive {
// The actual graphics device image.
class SokolRenderImageResource : public RefCnt {
private:
sg_image m_gpuResource;
public:
// bytes is expected to be tightly packed RGBA*width*height.
SokolRenderImageResource(const uint8_t* bytes, uint32_t width, uint32_t height);
~SokolRenderImageResource();
sg_image image() const { return m_gpuResource; }
};
// The unique render image associated with a given source Rive asset. Can be stored in sub-region of
// an actual graphics device image (SokolRenderImageResource).
class SokolRenderImage : public RenderImage {
private:
rcp<SokolRenderImageResource> m_gpuImage;
sg_buffer m_vertexBuffer;
sg_buffer m_uvBuffer;
public:
// Needed by std::unique_ptr
// SokolRenderImage() {}
SokolRenderImage(rcp<SokolRenderImageResource> image,
uint32_t width,
uint32_t height,
const Mat2D& uvTransform);
~SokolRenderImage() override;
sg_image image() const { return m_gpuImage->image(); }
sg_buffer vertexBuffer() const { return m_vertexBuffer; }
sg_buffer uvBuffer() const { return m_uvBuffer; }
};
class SokolTessRenderer : public TessRenderer {
private:
static const std::size_t maxClippingPaths = 16;
sg_pipeline m_meshPipeline;
sg_pipeline m_currentPipeline = {0};
int m_clipCount = 0;
// Src Over Pipelines
sg_pipeline m_pathPipeline[maxClippingPaths + 1];
// Screen Pipelines
sg_pipeline m_pathScreenPipeline[maxClippingPaths + 1];
// Additive
sg_pipeline m_pathAdditivePipeline[maxClippingPaths + 1];
// Multiply
sg_pipeline m_pathMultiplyPipeline[maxClippingPaths + 1];
sg_pipeline m_incClipPipeline;
sg_pipeline m_decClipPipeline;
sg_buffer m_boundsIndices;
std::vector<SubPath> m_ClipPaths;
void applyClipping();
void setPipeline(sg_pipeline pipeline);
public:
SokolTessRenderer();
~SokolTessRenderer();
void orthographicProjection(float left,
float right,
float bottom,
float top,
float near,
float far) override;
void drawPath(RenderPath* path, RenderPaint* paint) override;
void drawImage(const RenderImage*, BlendMode, float opacity) override;
void drawImageMesh(const RenderImage*,
rcp<RenderBuffer> vertices_f32,
rcp<RenderBuffer> uvCoords_f32,
rcp<RenderBuffer> indices_u16,
BlendMode,
float opacity) override;
void restore() override;
void reset();
};
} // namespace rive
#endif