wg_engine: fix stroke update

The stroke was not updated because the update function
handled flags related to the color/gradient only.
This commit is contained in:
Mira Grudzinska 2025-02-17 15:12:53 +01:00 committed by Hermet Park
parent 6c4a74e7f1
commit 4e98f12743
3 changed files with 54 additions and 49 deletions

View file

@ -223,53 +223,54 @@ void WgImageData::release(WgContext& context)
// WgRenderSettings // WgRenderSettings
//*********************************************************************** //***********************************************************************
void WgRenderSettings::update(WgContext& context, const Fill* fill, const RenderColor& c, const RenderUpdateFlag flags) void WgRenderSettings::updateFill(WgContext& context, const Fill* fill)
{ {
// setup fill properties rasterType = WgRenderRasterType::Gradient;
if ((flags & (RenderUpdateFlag::Gradient)) && fill) { // get gradient transfrom matrix
rasterType = WgRenderRasterType::Gradient; Matrix invFillTransform;
// get gradient transfrom matrix WgShaderTypeMat4x4f gradientTrans; // identity by default
Matrix invFillTransform; if (inverse(&fill->transform(), &invFillTransform))
WgShaderTypeMat4x4f gradientTrans; // identity by default gradientTrans.update(invFillTransform);
if (inverse(&fill->transform(), &invFillTransform)) // get gradient rasterisation settings
gradientTrans.update(invFillTransform); WgShaderTypeGradient gradient;
// get gradient rasterisation settings if (fill->type() == Type::LinearGradient) {
WgShaderTypeGradient gradient; gradient.update((LinearGradient*)fill);
if (fill->type() == Type::LinearGradient) { fillType = WgRenderSettingsType::Linear;
gradient.update((LinearGradient*)fill); } else if (fill->type() == Type::RadialGradient) {
fillType = WgRenderSettingsType::Linear; gradient.update((RadialGradient*)fill);
} else if (fill->type() == Type::RadialGradient) { fillType = WgRenderSettingsType::Radial;
gradient.update((RadialGradient*)fill);
fillType = WgRenderSettingsType::Radial;
}
// update gpu assets
bool bufferGradientSettingsChanged = context.allocateBufferUniform(bufferGroupGradient, &gradient.settings, sizeof(gradient.settings));
bool bufferGradientTransformChanged = context.allocateBufferUniform(bufferGroupTransfromGrad, &gradientTrans.mat, sizeof(gradientTrans.mat));
bool textureGradientChanged = context.allocateTexture(texGradient, WG_TEXTURE_GRADIENT_SIZE, 1, WGPUTextureFormat_RGBA8Unorm, gradient.texData);
if (bufferGradientSettingsChanged || textureGradientChanged || bufferGradientTransformChanged) {
// update texture view
context.releaseTextureView(texViewGradient);
texViewGradient = context.createTextureView(texGradient);
// get sampler by spread type
WGPUSampler sampler = context.samplerLinearClamp;
if (fill->spread() == FillSpread::Reflect) sampler = context.samplerLinearMirror;
if (fill->spread() == FillSpread::Repeat) sampler = context.samplerLinearRepeat;
// update bind group
context.layouts.releaseBindGroup(bindGroupGradient);
bindGroupGradient = context.layouts.createBindGroupTexSampledBuff2Un(
sampler, texViewGradient, bufferGroupGradient, bufferGroupTransfromGrad);
}
skip = false;
} else if ((flags & RenderUpdateFlag::Color) && !fill) {
rasterType = WgRenderRasterType::Solid;
WgShaderTypeVec4f solidColor(c);
if (context.allocateBufferUniform(bufferGroupSolid, &solidColor, sizeof(solidColor))) {
context.layouts.releaseBindGroup(bindGroupSolid);
bindGroupSolid = context.layouts.createBindGroupBuffer1Un(bufferGroupSolid);
}
fillType = WgRenderSettingsType::Solid;
skip = (c.a == 0);
} }
// update gpu assets
bool bufferGradientSettingsChanged = context.allocateBufferUniform(bufferGroupGradient, &gradient.settings, sizeof(gradient.settings));
bool bufferGradientTransformChanged = context.allocateBufferUniform(bufferGroupTransfromGrad, &gradientTrans.mat, sizeof(gradientTrans.mat));
bool textureGradientChanged = context.allocateTexture(texGradient, WG_TEXTURE_GRADIENT_SIZE, 1, WGPUTextureFormat_RGBA8Unorm, gradient.texData);
if (bufferGradientSettingsChanged || textureGradientChanged || bufferGradientTransformChanged) {
// update texture view
context.releaseTextureView(texViewGradient);
texViewGradient = context.createTextureView(texGradient);
// get sampler by spread type
WGPUSampler sampler = context.samplerLinearClamp;
if (fill->spread() == FillSpread::Reflect) sampler = context.samplerLinearMirror;
if (fill->spread() == FillSpread::Repeat) sampler = context.samplerLinearRepeat;
// update bind group
context.layouts.releaseBindGroup(bindGroupGradient);
bindGroupGradient = context.layouts.createBindGroupTexSampledBuff2Un(
sampler, texViewGradient, bufferGroupGradient, bufferGroupTransfromGrad);
}
skip = false;
};
void WgRenderSettings::updateColor(WgContext& context, const RenderColor& c)
{
rasterType = WgRenderRasterType::Solid;
WgShaderTypeVec4f solidColor(c);
if (context.allocateBufferUniform(bufferGroupSolid, &solidColor, sizeof(solidColor))) {
context.layouts.releaseBindGroup(bindGroupSolid);
bindGroupSolid = context.layouts.createBindGroupBuffer1Un(bufferGroupSolid);
}
fillType = WgRenderSettingsType::Solid;
skip = (c.a == 0);
}; };

View file

@ -89,7 +89,8 @@ struct WgRenderSettings
WgRenderRasterType rasterType{}; WgRenderRasterType rasterType{};
bool skip{}; bool skip{};
void update(WgContext& context, const Fill* fill, const RenderColor& c, const RenderUpdateFlag flags); void updateFill(WgContext& context, const Fill* fill);
void updateColor(WgContext& context, const RenderColor& c);
void release(WgContext& context); void release(WgContext& context);
}; };

View file

@ -160,9 +160,12 @@ RenderData WgRenderer::prepare(const RenderShape& rshape, RenderData data, const
// setup fill settings // setup fill settings
renderDataShape->viewport = mViewport; renderDataShape->viewport = mViewport;
renderDataShape->opacity = opacity; renderDataShape->opacity = opacity;
renderDataShape->renderSettingsShape.update(mContext, rshape.fill, rshape.color, flags); if (flags & RenderUpdateFlag::Gradient && rshape.fill) renderDataShape->renderSettingsShape.updateFill(mContext, rshape.fill);
if (rshape.stroke) else if (flags & RenderUpdateFlag::Color) renderDataShape->renderSettingsShape.updateColor(mContext, rshape.color);
renderDataShape->renderSettingsStroke.update(mContext, rshape.stroke->fill, rshape.stroke->color, flags); if (rshape.stroke) {
if (flags & RenderUpdateFlag::GradientStroke && rshape.stroke->fill) renderDataShape->renderSettingsStroke.updateFill(mContext, rshape.stroke->fill);
else if (flags & RenderUpdateFlag::Stroke) renderDataShape->renderSettingsStroke.updateColor(mContext, rshape.stroke->color);
}
// store clips data // store clips data
renderDataShape->updateClips(clips); renderDataShape->updateClips(clips);