Add toggle for dispersion in playground app
This commit is contained in:
1 parent
e9da3e9238
commit
3966c1be60
8 files changed
+28
-20
No files matched your search
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -167,13 +167,19 @@ fun ConfigurationBottomSheet(
|
|||||||
providerState,
|
providerState,
|
||||||
Modifier.fillMaxWidth()
|
Modifier.fillMaxWidth()
|
||||||
)
|
)
|
||||||
SliderChip(
|
Button(
|
||||||
state.dispersionHeight,
|
{ state.isDispersionEnabled = !state.isDispersionEnabled },
|
||||||
stringResource(R.string.dispersion_height),
|
Modifier.liquidGlass(providerState, GlassStyle(CornerShape.full)),
|
||||||
{ Icon(painterResource(R.drawable.star_shine_24px)) },
|
colors = ButtonColors.filled(
|
||||||
providerState,
|
containerColor = primary.copy(alpha = 0.85f)
|
||||||
Modifier.fillMaxWidth()
|
)
|
||||||
)
|
) {
|
||||||
|
Text(
|
||||||
|
if (state.isDispersionEnabled) stringResource(R.string.disable_dispersion)
|
||||||
|
else stringResource(R.string.enable_dispersion),
|
||||||
|
Modifier.animateContentSize(MotionScheme.fastSpatial())
|
||||||
|
)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
null -> {}
|
null -> {}
|
||||||
|
|||||||
@@ -153,6 +153,7 @@ fun Preview() {
|
|||||||
shape = RoundedRectangle(state.cornerRadius.value)
|
shape = RoundedRectangle(state.cornerRadius.value)
|
||||||
}
|
}
|
||||||
.graphicsLayer { // dispersion effect
|
.graphicsLayer { // dispersion effect
|
||||||
|
if (!state.isDispersionEnabled) return@graphicsLayer
|
||||||
renderEffect = RenderEffect.createRuntimeShaderEffect(
|
renderEffect = RenderEffect.createRuntimeShaderEffect(
|
||||||
RuntimeShader(
|
RuntimeShader(
|
||||||
"""
|
"""
|
||||||
@@ -160,7 +161,9 @@ fun Preview() {
|
|||||||
|
|
||||||
uniform float2 size;
|
uniform float2 size;
|
||||||
uniform float cornerRadius;
|
uniform float cornerRadius;
|
||||||
|
|
||||||
uniform float dispersionHeight;
|
uniform float dispersionHeight;
|
||||||
|
uniform float dispersionAmount;
|
||||||
|
|
||||||
float lerp(float a, float b, float t) {
|
float lerp(float a, float b, float t) {
|
||||||
return a + (b - a) * t;
|
return a + (b - a) * t;
|
||||||
@@ -206,20 +209,19 @@ fun Preview() {
|
|||||||
float2 normal = gradSdRoundedRectangle(centeredCoord, halfSize, cornerRadius);
|
float2 normal = gradSdRoundedRectangle(centeredCoord, halfSize, cornerRadius);
|
||||||
float2 tangent = normalToTangent(normal);
|
float2 tangent = normalToTangent(normal);
|
||||||
|
|
||||||
float dispersionFraction = 1.0 - -sd / dispersionHeight;
|
float dispersionDistance = circleMap(1.0 - -sd / dispersionHeight) * dispersionAmount;
|
||||||
float dispersionWidth = dispersionHeight * circleMap(dispersionFraction);
|
if (dispersionDistance < 2.0) {
|
||||||
if (dispersionWidth < 2.0) {
|
|
||||||
half4 color = image.eval(coord);
|
half4 color = image.eval(coord);
|
||||||
return color;
|
return color;
|
||||||
}
|
}
|
||||||
|
|
||||||
half4 dispersedColor = half4(0.0);
|
half4 dispersedColor = half4(0.0);
|
||||||
half4 weight = half4(0.0);
|
half4 weight = half4(0.0);
|
||||||
float maxI = min(dispersionWidth, 20.0);
|
float maxI = min(dispersionDistance, 20.0);
|
||||||
for (float i = 0.0; i < 20.0; i++) {
|
for (float i = 0.0; i < 20.0; i++) {
|
||||||
float t = i / maxI;
|
float t = i / maxI;
|
||||||
if (t > 1.0) break;
|
if (t > 1.0) break;
|
||||||
half4 color = image.eval(coord + tangent * float2(t - 0.5) * dispersionWidth);
|
half4 color = image.eval(coord + tangent * float2(t - 0.5) * dispersionDistance);
|
||||||
half rMask = step(0.5, t);
|
half rMask = step(0.5, t);
|
||||||
half gMask = step(0.25, t) * step(t, 0.75);
|
half gMask = step(0.25, t) * step(t, 0.75);
|
||||||
half bMask = step(t, 0.5);
|
half bMask = step(t, 0.5);
|
||||||
@@ -242,7 +244,9 @@ fun Preview() {
|
|||||||
|
|
||||||
setFloatUniform("size", size.width, size.height)
|
setFloatUniform("size", size.width, size.height)
|
||||||
setFloatUniform("cornerRadius", cornerRadius)
|
setFloatUniform("cornerRadius", cornerRadius)
|
||||||
|
|
||||||
setFloatUniform("dispersionHeight", state.refractionHeight.value.toPx())
|
setFloatUniform("dispersionHeight", state.refractionHeight.value.toPx())
|
||||||
|
setFloatUniform("dispersionAmount", -state.refractionAmount.value.toPx())
|
||||||
},
|
},
|
||||||
"image"
|
"image"
|
||||||
).asComposeRenderEffect()
|
).asComposeRenderEffect()
|
||||||
|
|||||||
@@ -107,13 +107,7 @@ class PreviewState {
|
|||||||
typeConverter = Float.VectorConverter,
|
typeConverter = Float.VectorConverter,
|
||||||
valueLabel = { "%.2f".format(it) }
|
valueLabel = { "%.2f".format(it) }
|
||||||
)
|
)
|
||||||
val dispersionHeight: LiquidGlassParamValue<Dp> =
|
var isDispersionEnabled: Boolean by mutableStateOf(false)
|
||||||
LiquidGlassParamValue(
|
|
||||||
initialValue = 0.dp,
|
|
||||||
valueRange = { 0.dp..cornerRadius.value },
|
|
||||||
typeConverter = Dp.VectorConverter,
|
|
||||||
valueLabel = { "${it.value.fastRoundToInt()} dp" }
|
|
||||||
)
|
|
||||||
|
|
||||||
val bleedAmount: LiquidGlassParamValue<Dp> =
|
val bleedAmount: LiquidGlassParamValue<Dp> =
|
||||||
LiquidGlassParamValue(
|
LiquidGlassParamValue(
|
||||||
@@ -181,7 +175,7 @@ class PreviewState {
|
|||||||
launch { refractionHeight.reset() }
|
launch { refractionHeight.reset() }
|
||||||
launch { refractionAmount.reset() }
|
launch { refractionAmount.reset() }
|
||||||
launch { eccentricFactor.reset() }
|
launch { eccentricFactor.reset() }
|
||||||
launch { dispersionHeight.reset() }
|
isDispersionEnabled = false
|
||||||
|
|
||||||
launch { bleedAmount.reset() }
|
launch { bleedAmount.reset() }
|
||||||
launch { bleedBlurRadius.reset() }
|
launch { bleedBlurRadius.reset() }
|
||||||
|
|||||||
@@ -12,9 +12,11 @@
|
|||||||
<string name="colors">颜色</string>
|
<string name="colors">颜色</string>
|
||||||
<string name="contrast">对比度</string>
|
<string name="contrast">对比度</string>
|
||||||
<string name="corner_radius">圆角半径</string>
|
<string name="corner_radius">圆角半径</string>
|
||||||
|
<string name="disable_dispersion">禁用色散</string>
|
||||||
<string name="disable_unsafe_mode">禁用不安全值</string>
|
<string name="disable_unsafe_mode">禁用不安全值</string>
|
||||||
<string name="dispersion_height">色散高度</string>
|
<string name="dispersion_height">色散高度</string>
|
||||||
<string name="eccentric_factor">离心系数</string>
|
<string name="eccentric_factor">离心系数</string>
|
||||||
|
<string name="enable_dispersion">启用色散</string>
|
||||||
<string name="enable_unsafe_mode">启用不安全值</string>
|
<string name="enable_unsafe_mode">启用不安全值</string>
|
||||||
<string name="height">高度</string>
|
<string name="height">高度</string>
|
||||||
<string name="hide_controls">隐藏控件</string>
|
<string name="hide_controls">隐藏控件</string>
|
||||||
|
|||||||
@@ -12,9 +12,11 @@
|
|||||||
<string name="colors">Colors</string>
|
<string name="colors">Colors</string>
|
||||||
<string name="contrast">Contrast</string>
|
<string name="contrast">Contrast</string>
|
||||||
<string name="corner_radius">Corner radius</string>
|
<string name="corner_radius">Corner radius</string>
|
||||||
|
<string name="disable_dispersion">Disable dispersion</string>
|
||||||
<string name="disable_unsafe_mode">Disable unsafe values</string>
|
<string name="disable_unsafe_mode">Disable unsafe values</string>
|
||||||
<string name="dispersion_height">Dispersion height</string>
|
<string name="dispersion_height">Dispersion height</string>
|
||||||
<string name="eccentric_factor">Eccentric factor</string>
|
<string name="eccentric_factor">Eccentric factor</string>
|
||||||
|
<string name="enable_dispersion">Enable dispersion</string>
|
||||||
<string name="enable_unsafe_mode">Enable unsafe values</string>
|
<string name="enable_unsafe_mode">Enable unsafe values</string>
|
||||||
<string name="height">Height</string>
|
<string name="height">Height</string>
|
||||||
<string name="hide_controls">Hide controls</string>
|
<string name="hide_controls">Hide controls</string>
|
||||||
|
|||||||
Reference in new issue
Block a user