From 89fa598c3cd8a898103928f5d6a0d2d267771e14 Mon Sep 17 00:00:00 2001 From: Zsolt Kocsi Date: Sat, 30 Sep 2023 10:31:04 +0100 Subject: [PATCH 01/10] Update content description --- .../kotlin/com/bumble/puzzyx/node/app/PuzzyxAppNode.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/src/commonMain/kotlin/com/bumble/puzzyx/node/app/PuzzyxAppNode.kt b/shared/src/commonMain/kotlin/com/bumble/puzzyx/node/app/PuzzyxAppNode.kt index 852ecf91..0c2f0402 100644 --- a/shared/src/commonMain/kotlin/com/bumble/puzzyx/node/app/PuzzyxAppNode.kt +++ b/shared/src/commonMain/kotlin/com/bumble/puzzyx/node/app/PuzzyxAppNode.kt @@ -151,7 +151,7 @@ class PuzzyxAppNode( ) { Icon( imageVector = if (isAutoPlayOn) Icons.Filled.Pause else Icons.Filled.PlayArrow, - contentDescription = "Toggle manual controls", + contentDescription = "Toggle auto-play", tint = MaterialTheme.colorScheme.onPrimaryContainer, modifier = Modifier.alpha(if (isAutoPlayOn) 0.035f else 1f), ) From 11be1fd81e6f2d95879a53698817dfd8fa23f8d2 Mon Sep 17 00:00:00 2001 From: Zsolt Kocsi Date: Tue, 3 Oct 2023 14:02:59 +0100 Subject: [PATCH 02/10] Automatically calculate target radius --- .../kotlin/com/bumble/puzzyx/node/app/PuzzyxAppNode.kt | 8 -------- .../kotlin/com/bumble/puzzyx/ui/DottedMeshShape.kt | 8 +++++--- 2 files changed, 5 insertions(+), 11 deletions(-) diff --git a/shared/src/commonMain/kotlin/com/bumble/puzzyx/node/app/PuzzyxAppNode.kt b/shared/src/commonMain/kotlin/com/bumble/puzzyx/node/app/PuzzyxAppNode.kt index 0c2f0402..17dba1d9 100644 --- a/shared/src/commonMain/kotlin/com/bumble/puzzyx/node/app/PuzzyxAppNode.kt +++ b/shared/src/commonMain/kotlin/com/bumble/puzzyx/node/app/PuzzyxAppNode.kt @@ -23,8 +23,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Shape -import androidx.compose.ui.platform.LocalDensity -import androidx.compose.ui.unit.max import com.bumble.appyx.components.backstack.BackStack import com.bumble.appyx.components.backstack.BackStackModel import com.bumble.appyx.components.backstack.operation.replace @@ -192,18 +190,12 @@ private fun ClipShape(progress: Float): Shape { val (meshMin, meshMax) = 15 to 25 val meshSizeX = if (screenSize.widthDp > screenSize.heightDp) meshMax else meshMin val meshSizeY = if (screenSize.widthDp > screenSize.heightDp) meshMin else meshMax - val maxRadius = remember(screenSize) { - with(density) { - max(screenSize.widthDp, screenSize.heightDp).toPx() / meshMin * 1.5f - } - } val shape by remember(progress) { mutableStateOf( DottedMeshShape( meshSizeX, meshSizeY, - maxRadius, progress ) ) diff --git a/shared/src/commonMain/kotlin/com/bumble/puzzyx/ui/DottedMeshShape.kt b/shared/src/commonMain/kotlin/com/bumble/puzzyx/ui/DottedMeshShape.kt index 0318a464..93927681 100644 --- a/shared/src/commonMain/kotlin/com/bumble/puzzyx/ui/DottedMeshShape.kt +++ b/shared/src/commonMain/kotlin/com/bumble/puzzyx/ui/DottedMeshShape.kt @@ -13,6 +13,7 @@ import com.bumble.appyx.interactions.core.annotations.FloatRange import com.bumble.appyx.interactions.core.ui.math.clamp import com.bumble.appyx.interactions.core.ui.math.lerpFloat import com.bumble.puzzyx.math.mapValueRange +import java.lang.Integer.max import kotlin.math.abs import kotlin.math.sqrt @@ -23,7 +24,7 @@ import kotlin.math.sqrt * Expecting a [progress] value that represents the state of the animation in the [0f..1f] range, * each circle's radius will be calculated for the current frame such that: * - the starting value for radius is 0 - * - the maximum radius is [maxRadius] + * - the maximum radius is determined automatically based on mesh size * - the radius animation for a given circle is delayed based on its position in the mesh, * center ones starting first, gradually followed by ones closer to the edges * @@ -33,7 +34,6 @@ import kotlin.math.sqrt class DottedMeshShape( private val meshSizeX: Int, private val meshSizeY: Int, - private val maxRadius: Float, @FloatRange(from = 0.0, to = 1.0) private val progress: Float = 0f ) : Shape { @@ -44,6 +44,7 @@ class DottedMeshShape( ): Outline { val (width, height) = size val progressDelayed = lerpFloat(-1.0f, 1f, progress) + val targetRadius = size.maxDimension / max(meshSizeX, meshSizeY) val sheet = Path().apply { addRect(Rect(0f, 0f, width, height)) @@ -53,6 +54,7 @@ class DottedMeshShape( val halfMeshWidth = 0.5f * (width / appliedMeshSizeX) val halfMeshHeight = 0.5f * (height / appliedMeshSizeY) val clampRadius = sqrt(halfMeshWidth * halfMeshWidth + halfMeshHeight * halfMeshHeight) + val dots = Path().apply { for (y in 0 until meshSizeY) { for (x in 0 until meshSizeX) { @@ -72,7 +74,7 @@ class DottedMeshShape( fromRangeMin = 0f, fromRangeMax = 2f, destRangeMin = 0f, - destRangeMax = maxRadius + destRangeMax = targetRadius ), min = 0f, max = clampRadius, From c0abd609399c9d6d11ef75b78153bb1137ec651c Mon Sep 17 00:00:00 2001 From: Zsolt Kocsi Date: Tue, 3 Oct 2023 14:04:18 +0100 Subject: [PATCH 03/10] Max out value range at 0,1 instead of 0,2 --- .../kotlin/com/bumble/puzzyx/ui/DottedMeshShape.kt | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/shared/src/commonMain/kotlin/com/bumble/puzzyx/ui/DottedMeshShape.kt b/shared/src/commonMain/kotlin/com/bumble/puzzyx/ui/DottedMeshShape.kt index 93927681..310861c0 100644 --- a/shared/src/commonMain/kotlin/com/bumble/puzzyx/ui/DottedMeshShape.kt +++ b/shared/src/commonMain/kotlin/com/bumble/puzzyx/ui/DottedMeshShape.kt @@ -66,13 +66,15 @@ class DottedMeshShape( y = lerpFloat(0f, height, v) ) + val value = (progressDelayed + + (0.5f - abs(u - 0.5f)) + + (0.5f - abs(v - 0.5f))) + val radius = clamp( x = mapValueRange( - value = progressDelayed - + (0.5f - abs(u - 0.5f)) - + (0.5f - abs(v - 0.5f)), + value.coerceAtMost(1f), fromRangeMin = 0f, - fromRangeMax = 2f, + fromRangeMax = 1f, destRangeMin = 0f, destRangeMax = targetRadius ), From 43e30b76bae6f0841af29bd1b431549c1c9a50c4 Mon Sep 17 00:00:00 2001 From: Zsolt Kocsi Date: Tue, 3 Oct 2023 14:06:20 +0100 Subject: [PATCH 04/10] Update mesh size to 16:9 ratio --- .../kotlin/com/bumble/puzzyx/node/app/PuzzyxAppNode.kt | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/shared/src/commonMain/kotlin/com/bumble/puzzyx/node/app/PuzzyxAppNode.kt b/shared/src/commonMain/kotlin/com/bumble/puzzyx/node/app/PuzzyxAppNode.kt index 17dba1d9..be6445c9 100644 --- a/shared/src/commonMain/kotlin/com/bumble/puzzyx/node/app/PuzzyxAppNode.kt +++ b/shared/src/commonMain/kotlin/com/bumble/puzzyx/node/app/PuzzyxAppNode.kt @@ -186,8 +186,7 @@ class PuzzyxAppNode( @Composable private fun ClipShape(progress: Float): Shape { val screenSize = LocalScreenSize.current - val density = LocalDensity.current - val (meshMin, meshMax) = 15 to 25 + val (meshMin, meshMax) = 14 to 25 val meshSizeX = if (screenSize.widthDp > screenSize.heightDp) meshMax else meshMin val meshSizeY = if (screenSize.widthDp > screenSize.heightDp) meshMin else meshMax From f68955380e29a68338b63ae52e7c8379ccebb112 Mon Sep 17 00:00:00 2001 From: Manel Martos Date: Tue, 3 Oct 2023 19:10:37 +0200 Subject: [PATCH 05/10] Rotate through all entries in reversed order without showing more than 16 (configurable) --- .../gridpuzzle/GridPuzzleVisualisation.kt | 2 +- .../gridpuzzle/operation/Assemble.kt | 6 +- .../gridpuzzle/operation/Carousel.kt | 6 +- .../component/gridpuzzle/operation/Flip.kt | 6 +- .../component/gridpuzzle/operation/Scatter.kt | 6 +- .../composable/StarFieldMessageBoard.kt | 64 ++--- .../kotlin/com/bumble/puzzyx/model/Entries.kt | 231 +++++++++--------- .../bumble/puzzyx/node/app/PuzzyxAppNode.kt | 4 +- 8 files changed, 162 insertions(+), 163 deletions(-) diff --git a/shared/src/commonMain/kotlin/com/bumble/puzzyx/appyx/component/gridpuzzle/GridPuzzleVisualisation.kt b/shared/src/commonMain/kotlin/com/bumble/puzzyx/appyx/component/gridpuzzle/GridPuzzleVisualisation.kt index 9448fd6f..5a4f6751 100644 --- a/shared/src/commonMain/kotlin/com/bumble/puzzyx/appyx/component/gridpuzzle/GridPuzzleVisualisation.kt +++ b/shared/src/commonMain/kotlin/com/bumble/puzzyx/appyx/component/gridpuzzle/GridPuzzleVisualisation.kt @@ -26,7 +26,7 @@ import kotlin.math.min import kotlin.random.Random class GridPuzzleVisualisation( - private val uiContext: UiContext, + uiContext: UiContext, defaultAnimationSpec: SpringSpec ) : BaseMotionController( uiContext = uiContext, diff --git a/shared/src/commonMain/kotlin/com/bumble/puzzyx/appyx/component/gridpuzzle/operation/Assemble.kt b/shared/src/commonMain/kotlin/com/bumble/puzzyx/appyx/component/gridpuzzle/operation/Assemble.kt index a5bd74c5..eaca3ac0 100644 --- a/shared/src/commonMain/kotlin/com/bumble/puzzyx/appyx/component/gridpuzzle/operation/Assemble.kt +++ b/shared/src/commonMain/kotlin/com/bumble/puzzyx/appyx/component/gridpuzzle/operation/Assemble.kt @@ -13,13 +13,13 @@ class Assemble( override var mode: Operation.Mode ) : BaseOperation() { - override fun isApplicable(state: GridPuzzleModel.State): Boolean = + override fun isApplicable(state: State): Boolean = true - override fun createFromState(baseLineState: GridPuzzleModel.State): GridPuzzleModel.State = + override fun createFromState(baseLineState: State): State = baseLineState - override fun createTargetState(fromState: GridPuzzleModel.State): GridPuzzleModel.State = + override fun createTargetState(fromState: State): State = fromState.copy( puzzleMode = GridPuzzleModel.PuzzleMode.ASSEMBLED ) diff --git a/shared/src/commonMain/kotlin/com/bumble/puzzyx/appyx/component/gridpuzzle/operation/Carousel.kt b/shared/src/commonMain/kotlin/com/bumble/puzzyx/appyx/component/gridpuzzle/operation/Carousel.kt index 43b86ae0..c124a5c6 100644 --- a/shared/src/commonMain/kotlin/com/bumble/puzzyx/appyx/component/gridpuzzle/operation/Carousel.kt +++ b/shared/src/commonMain/kotlin/com/bumble/puzzyx/appyx/component/gridpuzzle/operation/Carousel.kt @@ -13,13 +13,13 @@ class Carousel( override var mode: Operation.Mode ) : BaseOperation() { - override fun isApplicable(state: GridPuzzleModel.State): Boolean = + override fun isApplicable(state: State): Boolean = true - override fun createFromState(baseLineState: GridPuzzleModel.State): GridPuzzleModel.State = + override fun createFromState(baseLineState: State): State = baseLineState - override fun createTargetState(fromState: GridPuzzleModel.State): GridPuzzleModel.State = + override fun createTargetState(fromState: State): State = fromState.copy( puzzleMode = GridPuzzleModel.PuzzleMode.CAROUSEL ) diff --git a/shared/src/commonMain/kotlin/com/bumble/puzzyx/appyx/component/gridpuzzle/operation/Flip.kt b/shared/src/commonMain/kotlin/com/bumble/puzzyx/appyx/component/gridpuzzle/operation/Flip.kt index ab5fe3bc..c65d62c9 100644 --- a/shared/src/commonMain/kotlin/com/bumble/puzzyx/appyx/component/gridpuzzle/operation/Flip.kt +++ b/shared/src/commonMain/kotlin/com/bumble/puzzyx/appyx/component/gridpuzzle/operation/Flip.kt @@ -13,13 +13,13 @@ class Flip( override var mode: Operation.Mode ) : BaseOperation() { - override fun isApplicable(state: GridPuzzleModel.State): Boolean = + override fun isApplicable(state: State): Boolean = true - override fun createFromState(baseLineState: GridPuzzleModel.State): GridPuzzleModel.State = + override fun createFromState(baseLineState: State): State = baseLineState - override fun createTargetState(fromState: GridPuzzleModel.State): GridPuzzleModel.State = + override fun createTargetState(fromState: State): State = fromState.copy( puzzleMode = GridPuzzleModel.PuzzleMode.FLIPPED ) diff --git a/shared/src/commonMain/kotlin/com/bumble/puzzyx/appyx/component/gridpuzzle/operation/Scatter.kt b/shared/src/commonMain/kotlin/com/bumble/puzzyx/appyx/component/gridpuzzle/operation/Scatter.kt index 297e045d..237cc105 100644 --- a/shared/src/commonMain/kotlin/com/bumble/puzzyx/appyx/component/gridpuzzle/operation/Scatter.kt +++ b/shared/src/commonMain/kotlin/com/bumble/puzzyx/appyx/component/gridpuzzle/operation/Scatter.kt @@ -13,13 +13,13 @@ class Scatter( override var mode: Operation.Mode ) : BaseOperation() { - override fun isApplicable(state: GridPuzzleModel.State): Boolean = + override fun isApplicable(state: State): Boolean = true - override fun createFromState(baseLineState: GridPuzzleModel.State): GridPuzzleModel.State = + override fun createFromState(baseLineState: State): State = baseLineState - override fun createTargetState(fromState: GridPuzzleModel.State): GridPuzzleModel.State = + override fun createTargetState(fromState: State): State = fromState.copy( puzzleMode = GridPuzzleModel.PuzzleMode.SCATTERED ) diff --git a/shared/src/commonMain/kotlin/com/bumble/puzzyx/composable/StarFieldMessageBoard.kt b/shared/src/commonMain/kotlin/com/bumble/puzzyx/composable/StarFieldMessageBoard.kt index 85ec5c96..8b5bca4b 100644 --- a/shared/src/commonMain/kotlin/com/bumble/puzzyx/composable/StarFieldMessageBoard.kt +++ b/shared/src/commonMain/kotlin/com/bumble/puzzyx/composable/StarFieldMessageBoard.kt @@ -5,11 +5,11 @@ import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.foundation.layout.size import androidx.compose.runtime.Composable import androidx.compose.runtime.Immutable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue +import androidx.compose.runtime.key import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue @@ -19,7 +19,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.scale import androidx.compose.ui.graphics.Color -import androidx.compose.ui.unit.dp import androidx.compose.ui.zIndex import com.bumble.appyx.interactions.core.ui.math.smoothstep import com.bumble.appyx.navigation.collections.ImmutableList @@ -34,6 +33,7 @@ import kotlin.random.Random @Immutable private data class StarFieldSpecs( val regularStarCounter: Int = 200, + val maxEntries: Int = 16, val speed: Float = 0.1f, val zNewCoord: Float = 0f, val zFadeInStart: Float = 0.3f, @@ -66,25 +66,22 @@ private sealed class Star { @Immutable private data class StarField( val specs: StarFieldSpecs, - val stars: ImmutableList + val stars: ImmutableList, ) { companion object { fun generateStars(starFieldSpecs: StarFieldSpecs): StarField = StarField( specs = starFieldSpecs, - stars = (entryStars(starFieldSpecs) + regularStars(starFieldSpecs)) - .shuffled() - .toImmutableList() + stars = (entryStars(starFieldSpecs) + regularStars(starFieldSpecs)).toImmutableList() ) private fun entryStars(starFieldSpecs: StarFieldSpecs) = - entries.map { + entries.reversed().mapIndexed { index, entry -> + val zChunkLength = starFieldSpecs.zFadeInStart - -1.0f + val zOffset = zChunkLength / starFieldSpecs.maxEntries Star.EntryStar( - zCoord = Random.nextDouble( - from = starFieldSpecs.zNewCoord.toDouble(), - until = starFieldSpecs.zFadeOutEnd.toDouble(), - ).toFloat(), - entry = it, + zCoord = starFieldSpecs.zFadeInStart - index * zOffset, + entry = entry, ) } @@ -156,23 +153,32 @@ private fun StarFieldContent( modifier: Modifier = Modifier, ) { Box(modifier = modifier) { - starField.stars.forEach { star -> - val zPos = star.zCoord - val xPos = star.xCoord * zPos - val yPos = star.yCoord * zPos - val alpha = smoothstep(starField.specs.zFadeInStart, starField.specs.zFadeInEnd, zPos) - - smoothstep(starField.specs.zFadeOutStart, starField.specs.zFadeOutEnd, zPos) - - StarContent( - star, - modifier = Modifier - .scale(zPos) - .size(290.dp) - .aspectRatio(1.5f) - .align(BiasAlignment(xPos, yPos)) - .alpha(alpha) - .zIndex(zPos) - ) + starField.stars.forEachIndexed { index, star -> + key(index) { + val zPos = star.zCoord + val xPos = star.xCoord * zPos + val yPos = star.yCoord * zPos + val alpha = + smoothstep(starField.specs.zFadeInStart, starField.specs.zFadeInEnd, zPos) - + smoothstep( + starField.specs.zFadeOutStart, + starField.specs.zFadeOutEnd, + zPos + ) + + if (alpha > 0f) { + StarContent( + star, + modifier = Modifier + .scale(zPos) + .fillMaxSize(0.13f) + .aspectRatio(1.5f) + .align(BiasAlignment(xPos, yPos)) + .alpha(alpha) + .zIndex(zPos) + ) + } + } } } } diff --git a/shared/src/commonMain/kotlin/com/bumble/puzzyx/model/Entries.kt b/shared/src/commonMain/kotlin/com/bumble/puzzyx/model/Entries.kt index 185d4252..6235b49f 100644 --- a/shared/src/commonMain/kotlin/com/bumble/puzzyx/model/Entries.kt +++ b/shared/src/commonMain/kotlin/com/bumble/puzzyx/model/Entries.kt @@ -1,127 +1,120 @@ package com.bumble.puzzyx.model -import androidx.compose.animation.animateColor -import androidx.compose.animation.core.LinearEasing -import androidx.compose.animation.core.RepeatMode -import androidx.compose.animation.core.infiniteRepeatable -import androidx.compose.animation.core.rememberInfiniteTransition -import androidx.compose.animation.core.tween -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.fillMaxSize -import androidx.compose.runtime.getValue -import androidx.compose.ui.Modifier -import androidx.compose.ui.layout.ContentScale -import com.bumble.puzzyx.ui.md_indigo_500 -import com.bumble.puzzyx.ui.md_lime_500 - -val entries = listOf( - Entry.Text( - puzzle = Puzzle.PUZZLE1, - githubUserName = "codeNinja", - message = "Having a blast at the conference!" - ), - Entry.Text( - puzzle = Puzzle.PUZZLE1, - githubUserName = "techWanderlust", - message = "Keynote was inspiring" - ), - Entry.Text( - puzzle = Puzzle.PUZZLE1, - githubUserName = "dataGeek", - message = "Shoutout to the organizers for an amazing lineup!" - ), - Entry.Text( - puzzle = Puzzle.PUZZLE1, - githubUserName = "codeCraftsman", - message = "Learning, networking, and free coffee – conference life is good!" - ), - Entry.Text( - puzzle = Puzzle.PUZZLE1, - githubUserName = "byteBender", - message = "Let's connect! Find me at the networking session!" - ), - Entry.Text( - puzzle = Puzzle.PUZZLE1, - githubUserName = "stellarCoder", - message = "L77tc0der was here" - ), - Entry.Text( - puzzle = Puzzle.PUZZLE1, - githubUserName = "codeWaveSurfer", - message = "Mind blown by the innovative ideas shared today." - ), - Entry.Text( - puzzle = Puzzle.PUZZLE1, - githubUserName = "devDreamer", - message = "Great to see old friends and make new ones!" - ), - Entry.Text( - puzzle = Puzzle.PUZZLE1, - githubUserName = "cyberPioneer", - message = "Who's up for a post-conference karaoke session tonight?" - ), - Entry.Text( - puzzle = Puzzle.PUZZLE1, - githubUserName = "codeMaverick", - message = "Kudos to the speakers for keeping us engaged all day." - ), - Entry.Text( - puzzle = Puzzle.PUZZLE1, - githubUserName = "gitGuru", - message = "Highlight of the day: the interactive workshop on Appyx." - ), - Entry.Text( - puzzle = Puzzle.PUZZLE1, - githubUserName = "byteBlaze", - message = "Impressed by the cool tech showcased in the exhibition hall!" - ), - Entry.Text( - puzzle = Puzzle.PUZZLE1, - githubUserName = "bugHuntingHero", - message = "Taking copious notes – my brain might explode!" - ), +val entries = Array(5) { Entry.Text( puzzle = Puzzle.PUZZLE1, - githubUserName = "algoExplorer", - message = "Attending from NYC – making my hometown proud!" - ), - Entry.Image( - puzzle = Puzzle.PUZZLE1, - githubUserName = "codeWhizKid", - path = "cake.png", - contentScale = ContentScale.Crop - ), - Entry.ComposableContent( - puzzle = Puzzle.PUZZLE1, - githubUserName = "pixelPirate", - content = { - val infiniteTransition = rememberInfiniteTransition() - val color by infiniteTransition.animateColor( - initialValue = md_indigo_500, - targetValue = md_lime_500, - animationSpec = infiniteRepeatable( - animation = tween(500, easing = LinearEasing), - repeatMode = RepeatMode.Reverse - ) - ) - - Box( - modifier = Modifier - .fillMaxSize() - .background(color) - ) - } + githubUserName = "userId #$it", + message = "Having a blast at the conference! $it" ) -) +}.toList() + +//val entries = listOf( +// Entry.Text( +// puzzle = Puzzle.PUZZLE1, +// githubUserName = "codeNinja", +// message = "Having a blast at the conference!" +// ), +// Entry.Text( +// puzzle = Puzzle.PUZZLE1, +// githubUserName = "techWanderlust", +// message = "Keynote was inspiring" +// ), +// Entry.Text( +// puzzle = Puzzle.PUZZLE1, +// githubUserName = "dataGeek", +// message = "Shoutout to the organizers for an amazing lineup!" +// ), +// Entry.Text( +// puzzle = Puzzle.PUZZLE1, +// githubUserName = "codeCraftsman", +// message = "Learning, networking, and free coffee – conference life is good!" +// ), +// Entry.Text( +// puzzle = Puzzle.PUZZLE1, +// githubUserName = "byteBender", +// message = "Let's connect! Find me at the networking session!" +// ), +// Entry.Text( +// puzzle = Puzzle.PUZZLE1, +// githubUserName = "stellarCoder", +// message = "L77tc0der was here" +// ), +// Entry.Text( +// puzzle = Puzzle.PUZZLE1, +// githubUserName = "codeWaveSurfer", +// message = "Mind blown by the innovative ideas shared today." +// ), +// Entry.Text( +// puzzle = Puzzle.PUZZLE1, +// githubUserName = "devDreamer", +// message = "Great to see old friends and make new ones!" +// ), +// Entry.Text( +// puzzle = Puzzle.PUZZLE1, +// githubUserName = "cyberPioneer", +// message = "Who's up for a post-conference karaoke session tonight?" +// ), +// Entry.Text( +// puzzle = Puzzle.PUZZLE1, +// githubUserName = "codeMaverick", +// message = "Kudos to the speakers for keeping us engaged all day." +// ), +// Entry.Text( +// puzzle = Puzzle.PUZZLE1, +// githubUserName = "gitGuru", +// message = "Highlight of the day: the interactive workshop on Appyx." +// ), +// Entry.Text( +// puzzle = Puzzle.PUZZLE1, +// githubUserName = "byteBlaze", +// message = "Impressed by the cool tech showcased in the exhibition hall!" +// ), +// Entry.Text( +// puzzle = Puzzle.PUZZLE1, +// githubUserName = "bugHuntingHero", +// message = "Taking copious notes – my brain might explode!" +// ), +// Entry.Text( +// puzzle = Puzzle.PUZZLE1, +// githubUserName = "algoExplorer", +// message = "Attending from NYC – making my hometown proud!" +// ), +// Entry.Image( +// puzzle = Puzzle.PUZZLE1, +// githubUserName = "codeWhizKid", +// path = "cake.png", +// contentScale = ContentScale.Crop +// ), +// Entry.ComposableContent( +// puzzle = Puzzle.PUZZLE1, +// githubUserName = "pixelPirate", +// content = { +// val infiniteTransition = rememberInfiniteTransition() +// val color by infiniteTransition.animateColor( +// initialValue = md_indigo_500, +// targetValue = md_lime_500, +// animationSpec = infiniteRepeatable( +// animation = tween(500, easing = LinearEasing), +// repeatMode = RepeatMode.Reverse +// ) +// ) +// +// Box( +// modifier = Modifier +// .fillMaxSize() +// .background(color) +// ) +// } +// ) +//) val puzzle1Entries = entries .filter { it.puzzle == Puzzle.PUZZLE1 } - .also { - if (it.size > Puzzle.PUZZLE1.maxEntryCount) - error("This puzzle is already filled up. Add your entry to another one!") - - if (it.map { it.githubUserName }.distinct().size < it.size) { - error("One entry per puzzle is the limit, but you can try again in the next one!") - } - } +// .also { +// if (it.size > Puzzle.PUZZLE1.maxEntryCount) +// error("This puzzle is already filled up. Add your entry to another one!") +// +// if (it.map { it.githubUserName }.distinct().size < it.size) { +// error("One entry per puzzle is the limit, but you can try again in the next one!") +// } +// } diff --git a/shared/src/commonMain/kotlin/com/bumble/puzzyx/node/app/PuzzyxAppNode.kt b/shared/src/commonMain/kotlin/com/bumble/puzzyx/node/app/PuzzyxAppNode.kt index 852ecf91..10a4f790 100644 --- a/shared/src/commonMain/kotlin/com/bumble/puzzyx/node/app/PuzzyxAppNode.kt +++ b/shared/src/commonMain/kotlin/com/bumble/puzzyx/node/app/PuzzyxAppNode.kt @@ -54,10 +54,10 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.update private val screens = listOf( + StarFieldMessageBoard, Puzzle1, CallToAction, MessageBoard, - StarFieldMessageBoard, ) class PuzzyxAppNode( @@ -105,7 +105,7 @@ class PuzzyxAppNode( MessageBoard(modifier) } is StarFieldMessageBoard -> node(buildContext) { modifier -> - AutoPlayScript(initialDelayMs = 5000) { nextScreen() } + AutoPlayScript(initialDelayMs = 50000) { nextScreen() } StarFieldMessageBoard(modifier) } } From 250fb27ed24e7c116e0cf42fa65fe4cdf2056e11 Mon Sep 17 00:00:00 2001 From: Manel Martos Date: Tue, 3 Oct 2023 23:21:35 +0200 Subject: [PATCH 06/10] More tweaks + add logo star type --- .../composable/StarFieldMessageBoard.kt | 196 ++++++++++----- .../kotlin/com/bumble/puzzyx/model/Entries.kt | 231 +++++++++--------- .../bumble/puzzyx/node/app/PuzzyxAppNode.kt | 4 +- .../src/commonMain/resources/logos/appyx.png | Bin 0 -> 13986 bytes .../src/commonMain/resources/logos/bumble.png | Bin 0 -> 6615 bytes .../commonMain/resources/logos/droidcon.png | Bin 0 -> 4862 bytes 6 files changed, 262 insertions(+), 169 deletions(-) create mode 100644 shared/src/commonMain/resources/logos/appyx.png create mode 100644 shared/src/commonMain/resources/logos/bumble.png create mode 100644 shared/src/commonMain/resources/logos/droidcon.png diff --git a/shared/src/commonMain/kotlin/com/bumble/puzzyx/composable/StarFieldMessageBoard.kt b/shared/src/commonMain/kotlin/com/bumble/puzzyx/composable/StarFieldMessageBoard.kt index 8b5bca4b..cbe92ae6 100644 --- a/shared/src/commonMain/kotlin/com/bumble/puzzyx/composable/StarFieldMessageBoard.kt +++ b/shared/src/commonMain/kotlin/com/bumble/puzzyx/composable/StarFieldMessageBoard.kt @@ -3,8 +3,10 @@ package com.bumble.puzzyx.composable import androidx.compose.foundation.Canvas import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.absoluteOffset import androidx.compose.foundation.layout.aspectRatio import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.size import androidx.compose.runtime.Composable import androidx.compose.runtime.Immutable import androidx.compose.runtime.LaunchedEffect @@ -14,20 +16,28 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.runtime.withFrameMillis -import androidx.compose.ui.BiasAlignment +import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.scale import androidx.compose.ui.graphics.Color +import androidx.compose.ui.layout.ContentScale +import androidx.compose.ui.layout.onSizeChanged +import androidx.compose.ui.unit.IntOffset +import androidx.compose.ui.unit.IntSize +import androidx.compose.ui.unit.dp import androidx.compose.ui.zIndex import com.bumble.appyx.interactions.core.ui.math.smoothstep import com.bumble.appyx.navigation.collections.ImmutableList import com.bumble.appyx.navigation.collections.toImmutableList import com.bumble.puzzyx.composable.StarField.Companion.generateStars +import com.bumble.puzzyx.imageloader.ResourceImage import com.bumble.puzzyx.model.Entry import com.bumble.puzzyx.model.entries import com.bumble.puzzyx.ui.appyx_dark import kotlinx.coroutines.isActive +import kotlin.math.max +import kotlin.math.roundToInt import kotlin.random.Random @Immutable @@ -35,32 +45,49 @@ private data class StarFieldSpecs( val regularStarCounter: Int = 200, val maxEntries: Int = 16, val speed: Float = 0.1f, - val zNewCoord: Float = 0f, + val zNewCoord: Float = -1f, val zFadeInStart: Float = 0.3f, val zFadeInEnd: Float = 0.4f, val zFadeOutStart: Float = 1.3f, val zFadeOutEnd: Float = 1.4f, +) { + val zOffset = (zFadeOutEnd - zFadeInStart) / maxEntries +} + +private data class Star( + val xCoord: Float = Random.nextDouble(-1.0, 1.0).toFloat(), + val yCoord: Float = Random.nextDouble(-1.0, 1.0).toFloat(), + val zCoord: Float, + val size: Modifier, + val type: StarType, ) @Immutable -private sealed class Star { - abstract val xCoord: Float - abstract val yCoord: Float - abstract val zCoord: Float - - data class EntryStar( - override val xCoord: Float = Random.nextDouble(-1.0, 1.0).toFloat(), - override val yCoord: Float = Random.nextDouble(-1.0, 1.0).toFloat(), - override val zCoord: Float, - val entry: Entry, - ) : Star() - - data class RegularStar( - override val xCoord: Float = Random.nextDouble(-1.0, 1.0).toFloat(), - override val yCoord: Float = Random.nextDouble(-1.0, 1.0).toFloat(), - override val zCoord: Float, - val color: Color, - ) : Star() +private sealed class StarType { + data class RegularType(val color: Color) : StarType() { + companion object { + val size: Modifier = Modifier.size(2.dp) + } + } + + data class EntryType(val entry: Entry) : StarType() { + companion object { + val size: Modifier = Modifier.fillMaxSize(0.15f).aspectRatio(1.5f) + } + } + + data class LogoType(val imagePath: String) : StarType() { + companion object { + val size: Modifier = Modifier.fillMaxSize(0.05f).aspectRatio(1f) + } + } + + fun calcZNewCoord(zFadeInStart: Float, zOffset: Float, maxEntries: Int): Float = + when (this) { + is EntryType -> zFadeInStart - zOffset * max(0, entries.size - maxEntries) + is LogoType -> zFadeInStart + is RegularType -> zFadeInStart + } } @Immutable @@ -72,33 +99,65 @@ private data class StarField( fun generateStars(starFieldSpecs: StarFieldSpecs): StarField = StarField( specs = starFieldSpecs, - stars = (entryStars(starFieldSpecs) + regularStars(starFieldSpecs)).toImmutableList() + stars = (regularStars(starFieldSpecs) + entryStars(starFieldSpecs) + logoStars( + starFieldSpecs + )).toImmutableList() ) - private fun entryStars(starFieldSpecs: StarFieldSpecs) = - entries.reversed().mapIndexed { index, entry -> - val zChunkLength = starFieldSpecs.zFadeInStart - -1.0f - val zOffset = zChunkLength / starFieldSpecs.maxEntries - Star.EntryStar( - zCoord = starFieldSpecs.zFadeInStart - index * zOffset, - entry = entry, - ) - } - private fun regularStars(starFieldSpecs: StarFieldSpecs) = Array(starFieldSpecs.regularStarCounter) { - Star.RegularStar( + Star( zCoord = Random.nextDouble( from = starFieldSpecs.zNewCoord.toDouble(), until = starFieldSpecs.zFadeOutEnd.toDouble(), ).toFloat(), - color = Color( - red = Random.nextDouble(0.60, 0.66).toFloat(), - green = Random.nextDouble(0.60, 0.66).toFloat(), - blue = Random.nextDouble(0.97, 1.0).toFloat(), + size = StarType.RegularType.size, + type = StarType.RegularType( + color = Color( + red = Random.nextDouble(0.60, 0.66).toFloat(), + green = Random.nextDouble(0.60, 0.66).toFloat(), + blue = Random.nextDouble(0.97, 1.0).toFloat(), + ) ), ) + }.toList() + + private fun entryStars(starFieldSpecs: StarFieldSpecs) = + entries.reversed().mapIndexed { index, entry -> + Star( + zCoord = starFieldSpecs.zFadeInStart - index * starFieldSpecs.zOffset, + size = StarType.EntryType.size, + type = StarType.EntryType(entry = entry), + ) } + + private fun logoStars(starFieldSpecs: StarFieldSpecs) = + listOf( + Star( + zCoord = Random.nextDouble( + from = starFieldSpecs.zNewCoord.toDouble(), + until = starFieldSpecs.zFadeInStart.toDouble(), + ).toFloat(), + size = StarType.LogoType.size, + type = StarType.LogoType(imagePath = "logos/appyx.png"), + ), + Star( + zCoord = Random.nextDouble( + from = starFieldSpecs.zNewCoord.toDouble(), + until = starFieldSpecs.zFadeInStart.toDouble(), + ).toFloat(), + size = StarType.LogoType.size, + type = StarType.LogoType(imagePath = "logos/bumble.png"), + ), + Star( + zCoord = Random.nextDouble( + from = starFieldSpecs.zNewCoord.toDouble(), + until = starFieldSpecs.zFadeInStart.toDouble(), + ).toFloat(), + size = StarType.LogoType.size, + type = StarType.LogoType(imagePath = "logos/droidcon.png"), + ), + ) } } @@ -108,12 +167,19 @@ private fun StarField.update( ): StarField = copy( stars = stars.map { star -> - val zNewCoord = - (star.zCoord + specs.speed * timeInSecs).takeIf { it < specs.zFadeOutEnd } - ?: specs.zNewCoord - when (star) { - is Star.EntryStar -> star.copy(zCoord = zNewCoord) - is Star.RegularStar -> star.copy(zCoord = zNewCoord) + val zUpdatedCoord = star.zCoord + specs.speed * timeInSecs + if (zUpdatedCoord < specs.zFadeOutEnd) { + star.copy(zCoord = zUpdatedCoord) + } else { + star.copy( + xCoord = Random.nextDouble(-1.0, 1.0).toFloat(), + yCoord = Random.nextDouble(-1.0, 1.0).toFloat(), + zCoord = star.type.calcZNewCoord( + specs.zFadeInStart, + specs.zOffset, + specs.maxEntries + ), + ) } }.toImmutableList() ) @@ -152,7 +218,9 @@ private fun StarFieldContent( starField: StarField, modifier: Modifier = Modifier, ) { - Box(modifier = modifier) { + var size by remember { mutableStateOf(IntSize.Zero) } + Box(modifier = modifier + .onSizeChanged { size = it }) { starField.stars.forEachIndexed { index, star -> key(index) { val zPos = star.zCoord @@ -168,12 +236,17 @@ private fun StarFieldContent( if (alpha > 0f) { StarContent( - star, + star.type, modifier = Modifier .scale(zPos) - .fillMaxSize(0.13f) - .aspectRatio(1.5f) - .align(BiasAlignment(xPos, yPos)) + .then(star.size) + .align(Alignment.Center) + .absoluteOffset { + IntOffset( + x = (size.width * xPos).roundToInt(), + y = (size.height * yPos).roundToInt(), + ) + } .alpha(alpha) .zIndex(zPos) ) @@ -185,34 +258,47 @@ private fun StarFieldContent( @Composable private fun StarContent( - star: Star, + type: StarType, modifier: Modifier = Modifier, ) { - when (star) { - is Star.EntryStar -> EntryStarContent(star, modifier) - is Star.RegularStar -> RegularStarContent(star, modifier) + when (type) { + is StarType.EntryType -> EntryStarContent(type.entry, modifier) + is StarType.RegularType -> RegularStarContent(type.color, modifier) + is StarType.LogoType -> LogoStarContent(type.imagePath, modifier) } } @Composable private fun EntryStarContent( - star: Star.EntryStar, + entry: Entry, modifier: Modifier = Modifier, ) { EntryCard( - entry = star.entry, + entry = entry, modifier = modifier ) } @Composable private fun RegularStarContent( - star: Star.RegularStar, + color: Color, modifier: Modifier = Modifier, ) { Canvas( modifier = modifier ) { - drawCircle(color = star.color, radius = density * 2f) + drawCircle(color = color, radius = density * 2f) } } + +@Composable +private fun LogoStarContent( + imagePath: String, + modifier: Modifier = Modifier, +) { + ResourceImage( + path = imagePath, + contentScale = ContentScale.Inside, + modifier = modifier + ) +} diff --git a/shared/src/commonMain/kotlin/com/bumble/puzzyx/model/Entries.kt b/shared/src/commonMain/kotlin/com/bumble/puzzyx/model/Entries.kt index 6235b49f..93921523 100644 --- a/shared/src/commonMain/kotlin/com/bumble/puzzyx/model/Entries.kt +++ b/shared/src/commonMain/kotlin/com/bumble/puzzyx/model/Entries.kt @@ -1,120 +1,127 @@ package com.bumble.puzzyx.model -val entries = Array(5) { +import androidx.compose.animation.animateColor +import androidx.compose.animation.core.LinearEasing +import androidx.compose.animation.core.RepeatMode +import androidx.compose.animation.core.infiniteRepeatable +import androidx.compose.animation.core.rememberInfiniteTransition +import androidx.compose.animation.core.tween +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.runtime.getValue +import androidx.compose.ui.Modifier +import androidx.compose.ui.layout.ContentScale +import com.bumble.puzzyx.ui.md_indigo_500 +import com.bumble.puzzyx.ui.md_lime_500 + +val entries = listOf( + Entry.Text( + puzzle = Puzzle.PUZZLE1, + githubUserName = "codeNinja", + message = "Having a blast at the conference!" + ), + Entry.Text( + puzzle = Puzzle.PUZZLE1, + githubUserName = "techWanderlust", + message = "Keynote was inspiring" + ), + Entry.Text( + puzzle = Puzzle.PUZZLE1, + githubUserName = "dataGeek", + message = "Shoutout to the organizers for an amazing lineup!" + ), + Entry.Text( + puzzle = Puzzle.PUZZLE1, + githubUserName = "codeCraftsman", + message = "Learning, networking, and free coffee – conference life is good!" + ), + Entry.Text( + puzzle = Puzzle.PUZZLE1, + githubUserName = "byteBender", + message = "Let's connect! Find me at the networking session!" + ), + Entry.Text( + puzzle = Puzzle.PUZZLE1, + githubUserName = "stellarCoder", + message = "L77tc0der was here" + ), + Entry.Text( + puzzle = Puzzle.PUZZLE1, + githubUserName = "codeWaveSurfer", + message = "Mind blown by the innovative ideas shared today." + ), Entry.Text( puzzle = Puzzle.PUZZLE1, - githubUserName = "userId #$it", - message = "Having a blast at the conference! $it" - ) -}.toList() + githubUserName = "devDreamer", + message = "Great to see old friends and make new ones!" + ), + Entry.Text( + puzzle = Puzzle.PUZZLE1, + githubUserName = "cyberPioneer", + message = "Who's up for a post-conference karaoke session tonight?" + ), + Entry.Text( + puzzle = Puzzle.PUZZLE1, + githubUserName = "codeMaverick", + message = "Kudos to the speakers for keeping us engaged all day." + ), + Entry.Text( + puzzle = Puzzle.PUZZLE1, + githubUserName = "gitGuru", + message = "Highlight of the day: the interactive workshop on Appyx." + ), + Entry.Text( + puzzle = Puzzle.PUZZLE1, + githubUserName = "byteBlaze", + message = "Impressed by the cool tech showcased in the exhibition hall!" + ), + Entry.Text( + puzzle = Puzzle.PUZZLE1, + githubUserName = "bugHuntingHero", + message = "Taking copious notes – my brain might explode!" + ), + Entry.Text( + puzzle = Puzzle.PUZZLE1, + githubUserName = "algoExplorer", + message = "Attending from NYC – making my hometown proud!" + ), + Entry.Image( + puzzle = Puzzle.PUZZLE1, + githubUserName = "codeWhizKid", + path = "cake.png", + contentScale = ContentScale.Crop + ), + Entry.ComposableContent( + puzzle = Puzzle.PUZZLE1, + githubUserName = "pixelPirate", + content = { + val infiniteTransition = rememberInfiniteTransition() + val color by infiniteTransition.animateColor( + initialValue = md_indigo_500, + targetValue = md_lime_500, + animationSpec = infiniteRepeatable( + animation = tween(500, easing = LinearEasing), + repeatMode = RepeatMode.Reverse + ) + ) -//val entries = listOf( -// Entry.Text( -// puzzle = Puzzle.PUZZLE1, -// githubUserName = "codeNinja", -// message = "Having a blast at the conference!" -// ), -// Entry.Text( -// puzzle = Puzzle.PUZZLE1, -// githubUserName = "techWanderlust", -// message = "Keynote was inspiring" -// ), -// Entry.Text( -// puzzle = Puzzle.PUZZLE1, -// githubUserName = "dataGeek", -// message = "Shoutout to the organizers for an amazing lineup!" -// ), -// Entry.Text( -// puzzle = Puzzle.PUZZLE1, -// githubUserName = "codeCraftsman", -// message = "Learning, networking, and free coffee – conference life is good!" -// ), -// Entry.Text( -// puzzle = Puzzle.PUZZLE1, -// githubUserName = "byteBender", -// message = "Let's connect! Find me at the networking session!" -// ), -// Entry.Text( -// puzzle = Puzzle.PUZZLE1, -// githubUserName = "stellarCoder", -// message = "L77tc0der was here" -// ), -// Entry.Text( -// puzzle = Puzzle.PUZZLE1, -// githubUserName = "codeWaveSurfer", -// message = "Mind blown by the innovative ideas shared today." -// ), -// Entry.Text( -// puzzle = Puzzle.PUZZLE1, -// githubUserName = "devDreamer", -// message = "Great to see old friends and make new ones!" -// ), -// Entry.Text( -// puzzle = Puzzle.PUZZLE1, -// githubUserName = "cyberPioneer", -// message = "Who's up for a post-conference karaoke session tonight?" -// ), -// Entry.Text( -// puzzle = Puzzle.PUZZLE1, -// githubUserName = "codeMaverick", -// message = "Kudos to the speakers for keeping us engaged all day." -// ), -// Entry.Text( -// puzzle = Puzzle.PUZZLE1, -// githubUserName = "gitGuru", -// message = "Highlight of the day: the interactive workshop on Appyx." -// ), -// Entry.Text( -// puzzle = Puzzle.PUZZLE1, -// githubUserName = "byteBlaze", -// message = "Impressed by the cool tech showcased in the exhibition hall!" -// ), -// Entry.Text( -// puzzle = Puzzle.PUZZLE1, -// githubUserName = "bugHuntingHero", -// message = "Taking copious notes – my brain might explode!" -// ), -// Entry.Text( -// puzzle = Puzzle.PUZZLE1, -// githubUserName = "algoExplorer", -// message = "Attending from NYC – making my hometown proud!" -// ), -// Entry.Image( -// puzzle = Puzzle.PUZZLE1, -// githubUserName = "codeWhizKid", -// path = "cake.png", -// contentScale = ContentScale.Crop -// ), -// Entry.ComposableContent( -// puzzle = Puzzle.PUZZLE1, -// githubUserName = "pixelPirate", -// content = { -// val infiniteTransition = rememberInfiniteTransition() -// val color by infiniteTransition.animateColor( -// initialValue = md_indigo_500, -// targetValue = md_lime_500, -// animationSpec = infiniteRepeatable( -// animation = tween(500, easing = LinearEasing), -// repeatMode = RepeatMode.Reverse -// ) -// ) -// -// Box( -// modifier = Modifier -// .fillMaxSize() -// .background(color) -// ) -// } -// ) -//) + Box( + modifier = Modifier + .fillMaxSize() + .background(color) + ) + } + ), +) val puzzle1Entries = entries .filter { it.puzzle == Puzzle.PUZZLE1 } -// .also { -// if (it.size > Puzzle.PUZZLE1.maxEntryCount) -// error("This puzzle is already filled up. Add your entry to another one!") -// -// if (it.map { it.githubUserName }.distinct().size < it.size) { -// error("One entry per puzzle is the limit, but you can try again in the next one!") -// } -// } + .also { + if (it.size > Puzzle.PUZZLE1.maxEntryCount) + error("This puzzle is already filled up. Add your entry to another one!") + + if (it.map { it.githubUserName }.distinct().size < it.size) { + error("One entry per puzzle is the limit, but you can try again in the next one!") + } + } diff --git a/shared/src/commonMain/kotlin/com/bumble/puzzyx/node/app/PuzzyxAppNode.kt b/shared/src/commonMain/kotlin/com/bumble/puzzyx/node/app/PuzzyxAppNode.kt index 10a4f790..a6ab386a 100644 --- a/shared/src/commonMain/kotlin/com/bumble/puzzyx/node/app/PuzzyxAppNode.kt +++ b/shared/src/commonMain/kotlin/com/bumble/puzzyx/node/app/PuzzyxAppNode.kt @@ -54,10 +54,10 @@ import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.update private val screens = listOf( - StarFieldMessageBoard, Puzzle1, CallToAction, MessageBoard, + StarFieldMessageBoard, ) class PuzzyxAppNode( @@ -105,7 +105,7 @@ class PuzzyxAppNode( MessageBoard(modifier) } is StarFieldMessageBoard -> node(buildContext) { modifier -> - AutoPlayScript(initialDelayMs = 50000) { nextScreen() } + AutoPlayScript(initialDelayMs = 15000) { nextScreen() } StarFieldMessageBoard(modifier) } } diff --git a/shared/src/commonMain/resources/logos/appyx.png b/shared/src/commonMain/resources/logos/appyx.png new file mode 100644 index 0000000000000000000000000000000000000000..acccfe13568f49863c5a56674bc577fed6321c48 GIT binary patch literal 13986 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 IM6N<$f)Q+kKL7v# literal 0 HcmV?d00001 diff --git a/shared/src/commonMain/resources/logos/bumble.png b/shared/src/commonMain/resources/logos/bumble.png new file mode 100644 index 0000000000000000000000000000000000000000..7ee047636771c94f962008a793b6d3a63f85b7f3 GIT binary patch literal 6615 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 literal 0 HcmV?d00001 From 4324e5cb5897d749bf14bec14b9b030e5f99436a Mon Sep 17 00:00:00 2001 From: Manel Martos Date: Wed, 4 Oct 2023 06:53:18 +0200 Subject: [PATCH 07/10] Fix regular star size --- .../bumble/puzzyx/composable/StarFieldMessageBoard.kt | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/shared/src/commonMain/kotlin/com/bumble/puzzyx/composable/StarFieldMessageBoard.kt b/shared/src/commonMain/kotlin/com/bumble/puzzyx/composable/StarFieldMessageBoard.kt index cbe92ae6..378818b0 100644 --- a/shared/src/commonMain/kotlin/com/bumble/puzzyx/composable/StarFieldMessageBoard.kt +++ b/shared/src/commonMain/kotlin/com/bumble/puzzyx/composable/StarFieldMessageBoard.kt @@ -66,7 +66,7 @@ private data class Star( private sealed class StarType { data class RegularType(val color: Color) : StarType() { companion object { - val size: Modifier = Modifier.size(2.dp) + val size: Modifier = Modifier.size(4.dp) } } @@ -99,9 +99,10 @@ private data class StarField( fun generateStars(starFieldSpecs: StarFieldSpecs): StarField = StarField( specs = starFieldSpecs, - stars = (regularStars(starFieldSpecs) + entryStars(starFieldSpecs) + logoStars( - starFieldSpecs - )).toImmutableList() + stars = (regularStars(starFieldSpecs) + + entryStars(starFieldSpecs) + + logoStars(starFieldSpecs) + ).toImmutableList() ) private fun regularStars(starFieldSpecs: StarFieldSpecs) = From 457040f42889ee4d05bf4feeedf40b12c744ecc8 Mon Sep 17 00:00:00 2001 From: Manel Martos Date: Wed, 4 Oct 2023 07:01:08 +0200 Subject: [PATCH 08/10] Make stars appear less scattered --- .../bumble/puzzyx/composable/StarFieldMessageBoard.kt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/shared/src/commonMain/kotlin/com/bumble/puzzyx/composable/StarFieldMessageBoard.kt b/shared/src/commonMain/kotlin/com/bumble/puzzyx/composable/StarFieldMessageBoard.kt index 378818b0..2dd260b3 100644 --- a/shared/src/commonMain/kotlin/com/bumble/puzzyx/composable/StarFieldMessageBoard.kt +++ b/shared/src/commonMain/kotlin/com/bumble/puzzyx/composable/StarFieldMessageBoard.kt @@ -43,7 +43,7 @@ import kotlin.random.Random @Immutable private data class StarFieldSpecs( val regularStarCounter: Int = 200, - val maxEntries: Int = 16, + val maxEntries: Int = 12, val speed: Float = 0.1f, val zNewCoord: Float = -1f, val zFadeInStart: Float = 0.3f, @@ -55,8 +55,8 @@ private data class StarFieldSpecs( } private data class Star( - val xCoord: Float = Random.nextDouble(-1.0, 1.0).toFloat(), - val yCoord: Float = Random.nextDouble(-1.0, 1.0).toFloat(), + val xCoord: Float = Random.nextDouble(-0.5, 0.5).toFloat(), + val yCoord: Float = Random.nextDouble(-0.5, 0.5).toFloat(), val zCoord: Float, val size: Modifier, val type: StarType, @@ -173,8 +173,8 @@ private fun StarField.update( star.copy(zCoord = zUpdatedCoord) } else { star.copy( - xCoord = Random.nextDouble(-1.0, 1.0).toFloat(), - yCoord = Random.nextDouble(-1.0, 1.0).toFloat(), + xCoord = Random.nextDouble(-0.5, 0.5).toFloat(), + yCoord = Random.nextDouble(-0.5, 0.5).toFloat(), zCoord = star.type.calcZNewCoord( specs.zFadeInStart, specs.zOffset, From 1b569772e59814ce63c632ece23aca96e250856e Mon Sep 17 00:00:00 2001 From: Manel Martos Date: Wed, 4 Oct 2023 21:51:36 +0200 Subject: [PATCH 09/10] Remove logos --- .../composable/StarFieldMessageBoard.kt | 55 +----------------- .../src/commonMain/resources/logos/appyx.png | Bin 13986 -> 0 bytes .../src/commonMain/resources/logos/bumble.png | Bin 6615 -> 0 bytes .../commonMain/resources/logos/droidcon.png | Bin 4862 -> 0 bytes 4 files changed, 2 insertions(+), 53 deletions(-) delete mode 100644 shared/src/commonMain/resources/logos/appyx.png delete mode 100644 shared/src/commonMain/resources/logos/bumble.png delete mode 100644 shared/src/commonMain/resources/logos/droidcon.png diff --git a/shared/src/commonMain/kotlin/com/bumble/puzzyx/composable/StarFieldMessageBoard.kt b/shared/src/commonMain/kotlin/com/bumble/puzzyx/composable/StarFieldMessageBoard.kt index 2dd260b3..7432c20b 100644 --- a/shared/src/commonMain/kotlin/com/bumble/puzzyx/composable/StarFieldMessageBoard.kt +++ b/shared/src/commonMain/kotlin/com/bumble/puzzyx/composable/StarFieldMessageBoard.kt @@ -21,7 +21,6 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.alpha import androidx.compose.ui.draw.scale import androidx.compose.ui.graphics.Color -import androidx.compose.ui.layout.ContentScale import androidx.compose.ui.layout.onSizeChanged import androidx.compose.ui.unit.IntOffset import androidx.compose.ui.unit.IntSize @@ -31,7 +30,6 @@ import com.bumble.appyx.interactions.core.ui.math.smoothstep import com.bumble.appyx.navigation.collections.ImmutableList import com.bumble.appyx.navigation.collections.toImmutableList import com.bumble.puzzyx.composable.StarField.Companion.generateStars -import com.bumble.puzzyx.imageloader.ResourceImage import com.bumble.puzzyx.model.Entry import com.bumble.puzzyx.model.entries import com.bumble.puzzyx.ui.appyx_dark @@ -76,17 +74,10 @@ private sealed class StarType { } } - data class LogoType(val imagePath: String) : StarType() { - companion object { - val size: Modifier = Modifier.fillMaxSize(0.05f).aspectRatio(1f) - } - } - fun calcZNewCoord(zFadeInStart: Float, zOffset: Float, maxEntries: Int): Float = when (this) { - is EntryType -> zFadeInStart - zOffset * max(0, entries.size - maxEntries) - is LogoType -> zFadeInStart is RegularType -> zFadeInStart + is EntryType -> zFadeInStart - zOffset * max(0, entries.size - maxEntries) } } @@ -101,7 +92,6 @@ private data class StarField( specs = starFieldSpecs, stars = (regularStars(starFieldSpecs) + entryStars(starFieldSpecs) - + logoStars(starFieldSpecs) ).toImmutableList() ) @@ -131,34 +121,6 @@ private data class StarField( type = StarType.EntryType(entry = entry), ) } - - private fun logoStars(starFieldSpecs: StarFieldSpecs) = - listOf( - Star( - zCoord = Random.nextDouble( - from = starFieldSpecs.zNewCoord.toDouble(), - until = starFieldSpecs.zFadeInStart.toDouble(), - ).toFloat(), - size = StarType.LogoType.size, - type = StarType.LogoType(imagePath = "logos/appyx.png"), - ), - Star( - zCoord = Random.nextDouble( - from = starFieldSpecs.zNewCoord.toDouble(), - until = starFieldSpecs.zFadeInStart.toDouble(), - ).toFloat(), - size = StarType.LogoType.size, - type = StarType.LogoType(imagePath = "logos/bumble.png"), - ), - Star( - zCoord = Random.nextDouble( - from = starFieldSpecs.zNewCoord.toDouble(), - until = starFieldSpecs.zFadeInStart.toDouble(), - ).toFloat(), - size = StarType.LogoType.size, - type = StarType.LogoType(imagePath = "logos/droidcon.png"), - ), - ) } } @@ -263,9 +225,8 @@ private fun StarContent( modifier: Modifier = Modifier, ) { when (type) { - is StarType.EntryType -> EntryStarContent(type.entry, modifier) is StarType.RegularType -> RegularStarContent(type.color, modifier) - is StarType.LogoType -> LogoStarContent(type.imagePath, modifier) + is StarType.EntryType -> EntryStarContent(type.entry, modifier) } } @@ -291,15 +252,3 @@ private fun RegularStarContent( drawCircle(color = color, radius = density * 2f) } } - -@Composable -private fun LogoStarContent( - imagePath: String, - modifier: Modifier = Modifier, -) { - ResourceImage( - path = imagePath, - contentScale = ContentScale.Inside, - modifier = modifier - ) -} diff --git a/shared/src/commonMain/resources/logos/appyx.png b/shared/src/commonMain/resources/logos/appyx.png deleted file mode 100644 index acccfe13568f49863c5a56674bc577fed6321c48..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 13986 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 IM6N<$f)Q+kKL7v# diff --git a/shared/src/commonMain/resources/logos/bumble.png b/shared/src/commonMain/resources/logos/bumble.png deleted file mode 100644 index 7ee047636771c94f962008a793b6d3a63f85b7f3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6615 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 From 934400dea896517d2bd5a225ed74aa80e5020b15 Mon Sep 17 00:00:00 2001 From: Manel Martos Date: Thu, 5 Oct 2023 08:16:54 +0200 Subject: [PATCH 10/10] Improve readability as suggested by comments on PR --- .../puzzyx/composable/StarFieldMessageBoard.kt | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/shared/src/commonMain/kotlin/com/bumble/puzzyx/composable/StarFieldMessageBoard.kt b/shared/src/commonMain/kotlin/com/bumble/puzzyx/composable/StarFieldMessageBoard.kt index 7432c20b..adb5f968 100644 --- a/shared/src/commonMain/kotlin/com/bumble/puzzyx/composable/StarFieldMessageBoard.kt +++ b/shared/src/commonMain/kotlin/com/bumble/puzzyx/composable/StarFieldMessageBoard.kt @@ -182,21 +182,15 @@ private fun StarFieldContent( modifier: Modifier = Modifier, ) { var size by remember { mutableStateOf(IntSize.Zero) } - Box(modifier = modifier - .onSizeChanged { size = it }) { + Box( + modifier = modifier.onSizeChanged { size = it }, + ) { starField.stars.forEachIndexed { index, star -> key(index) { val zPos = star.zCoord val xPos = star.xCoord * zPos val yPos = star.yCoord * zPos - val alpha = - smoothstep(starField.specs.zFadeInStart, starField.specs.zFadeInEnd, zPos) - - smoothstep( - starField.specs.zFadeOutStart, - starField.specs.zFadeOutEnd, - zPos - ) - + val alpha = starField.specs.calcAlpha(zPos) if (alpha > 0f) { StarContent( star.type, @@ -219,6 +213,9 @@ private fun StarFieldContent( } } +private fun StarFieldSpecs.calcAlpha(zPos: Float) = + smoothstep(zFadeInStart, zFadeInEnd, zPos) - smoothstep(zFadeOutStart, zFadeOutEnd, zPos) + @Composable private fun StarContent( type: StarType,