mirror of
https://github.com/thorvg/thorvg.git
synced 2025-06-08 13:43:43 +00:00
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:
parent
6c4a74e7f1
commit
4e98f12743
3 changed files with 54 additions and 49 deletions
|
@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Add table
Reference in a new issue