Skip to content
This repository was archived by the owner on Feb 13, 2023. It is now read-only.

Commit 0bda8d2

Browse files
authored
Merge pull request #15 from igalata/feature/place_bubbles
done
2 parents 6b5af0c + c4f01e2 commit 0bda8d2

File tree

6 files changed

+33
-5
lines changed

6 files changed

+33
-5
lines changed

bubblepicker/src/main/java/com/igalata/bubblepicker/physics/CircleBody.kt

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ class CircleBody(val world: World, var position: Vec2, var radius: Float, var in
2929

3030
var increased = false
3131

32+
var isVisible = true
33+
3234
private val margin = 0.01f
3335
private val damping = 25f
3436
private val shape: CircleShape

bubblepicker/src/main/java/com/igalata/bubblepicker/physics/Engine.kt

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
package com.igalata.bubblepicker.physics
22

3-
import com.igalata.bubblepicker.even
43
import com.igalata.bubblepicker.rendering.Item
54
import com.igalata.bubblepicker.sqr
65
import org.jbox2d.common.Vec2
@@ -22,6 +21,7 @@ object Engine {
2221
gravity = interpolate(20f, 80f, value / 100f)
2322
standardIncreasedGravity = interpolate(500f, 800f, value / 100f)
2423
}
24+
var centerImmediately = false
2525
private var standardIncreasedGravity = interpolate(500f, 800f, 0.5f)
2626
private var bubbleRadius = 0.17f
2727

@@ -39,12 +39,15 @@ object Engine {
3939
private val currentGravity: Float
4040
get() = if (touch) increasedGravity else gravity
4141
private val toBeResized = ArrayList<Item>()
42+
private val startX
43+
get() = if (centerImmediately) 0.5f else 2.2f
44+
private var stepsCount = 0
4245

4346
fun build(bodiesCount: Int, scaleX: Float, scaleY: Float): List<CircleBody> {
4447
val density = interpolate(0.8f, 0.2f, radius / 100f)
4548
for (i in 0..bodiesCount - 1) {
46-
val x = if (Random().nextInt(2).even()) -2.2f else 2.2f
47-
val y = if (Random().nextInt(2).even()) -0.5f / scaleY else 0.5f / scaleY
49+
val x = if (Random().nextBoolean()) -startX else startX
50+
val y = if (Random().nextBoolean()) -0.5f / scaleY else 0.5f / scaleY
4851
bodies.add(CircleBody(world, Vec2(x, y), bubbleRadius * scaleX, (bubbleRadius * scaleX) * 1.3f, density))
4952
}
5053
this.scaleX = scaleX
@@ -56,9 +59,13 @@ object Engine {
5659

5760
fun move() {
5861
toBeResized.forEach { it.circleBody.resize(resizeStep) }
59-
world.step(step, 11, 11)
62+
world.step(if (centerImmediately) 0.035f else step, 11, 11)
6063
bodies.forEach { move(it) }
6164
toBeResized.removeAll(toBeResized.filter { it.circleBody.finished })
65+
stepsCount++
66+
if (stepsCount >= 10) {
67+
centerImmediately = false
68+
}
6269
}
6370

6471
fun swipe(x: Float, y: Float) {
@@ -102,6 +109,7 @@ object Engine {
102109

103110
private fun move(body: CircleBody) {
104111
body.physicalBody.apply {
112+
body.isVisible = centerImmediately.not()
105113
val direction = gravityCenter.sub(position)
106114
val distance = direction.length()
107115
val gravity = if (body.increased) 1.3f * currentGravity else currentGravity

bubblepicker/src/main/java/com/igalata/bubblepicker/rendering/BubblePicker.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,12 @@ class BubblePicker : GLSurfaceView {
4444
val selectedItems: List<PickerItem?>
4545
get() = renderer.selectedItems
4646

47+
var centerImmediately = false
48+
set(value) {
49+
field = value
50+
renderer.centerImmediately = value
51+
}
52+
4753
private val renderer = PickerRenderer(this)
4854
private var startX = 0f
4955
private var startY = 0f

bubblepicker/src/main/java/com/igalata/bubblepicker/rendering/BubbleShader.kt

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ object BubbleShader {
88
const val U_MATRIX = "u_Matrix"
99
const val U_BACKGROUND = "u_Background"
1010
const val U_TEXT = "u_Text"
11+
const val U_VISIBILITY = "u_Visibility"
1112

1213
const val A_POSITION = "a_Position"
1314
const val A_UV = "a_UV"
@@ -34,13 +35,15 @@ object BubbleShader {
3435
3536
uniform vec4 u_Background;
3637
uniform sampler2D u_Texture;
38+
uniform int u_Visibility;
3739
3840
varying vec2 v_UV;
3941
4042
void main()
4143
{
4244
float distance = distance(vec2(0.5, 0.5), v_UV);
43-
gl_FragColor = mix(texture2D(u_Texture, v_UV), u_Background, smoothstep(0.49, 0.5, distance));
45+
gl_FragColor = u_Visibility > 0 ?
46+
mix(texture2D(u_Texture, v_UV), u_Background, smoothstep(0.49, 0.5, distance)) : vec4(0);
4447
}
4548
"""
4649

bubblepicker/src/main/java/com/igalata/bubblepicker/rendering/Item.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ data class Item(val pickerItem: PickerItem, val circleBody: CircleBody) {
3434
val currentPosition: Vec2
3535
get() = circleBody.physicalBody.position
3636

37+
private var isVisible = true
38+
get() = circleBody.isVisible
3739
private var texture: Int = 0
3840
private var imageTexture: Int = 0
3941
private val currentTexture: Int
@@ -55,6 +57,7 @@ data class Item(val pickerItem: PickerItem, val circleBody: CircleBody) {
5557
glActiveTexture(GL_TEXTURE)
5658
glBindTexture(GL_TEXTURE_2D, currentTexture)
5759
glUniform1i(glGetUniformLocation(programId, BubbleShader.U_TEXT), 0)
60+
glUniform1i(glGetUniformLocation(programId, BubbleShader.U_VISIBILITY), if (isVisible) 1 else -1)
5861
glUniformMatrix4fv(glGetUniformLocation(programId, U_MATRIX), 1, false, calculateMatrix(scaleX, scaleY), 0)
5962
glDrawArrays(GL_TRIANGLE_STRIP, index * 4, 4)
6063
}

bubblepicker/src/main/java/com/igalata/bubblepicker/rendering/PickerRenderer.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,11 @@ class PickerRenderer(val glView: View) : GLSurfaceView.Renderer {
3737
lateinit var items: ArrayList<PickerItem>
3838
val selectedItems: List<PickerItem?>
3939
get() = Engine.selectedBodies.map { circles.firstOrNull { circle -> circle.circleBody == it }?.pickerItem }
40+
var centerImmediately = false
41+
set(value) {
42+
field = value
43+
Engine.centerImmediately = value
44+
}
4045

4146
private var programId = 0
4247
private var verticesBuffer: FloatBuffer? = null
@@ -70,6 +75,7 @@ class PickerRenderer(val glView: View) : GLSurfaceView.Renderer {
7075

7176
private fun initialize() {
7277
clear()
78+
Engine.centerImmediately = centerImmediately
7379
Engine.build(items.size, scaleX, scaleY).forEachIndexed { index, body ->
7480
circles.add(Item(items[index], body))
7581
}

0 commit comments

Comments
 (0)