Skip to content

Commit 191c529

Browse files
committed
Add data classes to represent map view
1 parent abdc60f commit 191c529

File tree

6 files changed

+173
-0
lines changed

6 files changed

+173
-0
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package net.mullvad.mullvadvpn.lib.map.data
2+
3+
import androidx.compose.runtime.Immutable
4+
import net.mullvad.mullvadvpn.model.LatLong
5+
6+
@Immutable
7+
data class CameraPosition(val latLong: LatLong, val zoom: Float, val verticalBias: Float)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package net.mullvad.mullvadvpn.lib.map.data
2+
3+
import androidx.compose.runtime.Immutable
4+
import androidx.compose.ui.graphics.Color
5+
import net.mullvad.mullvadvpn.lib.map.internal.toFloatArray
6+
7+
@Immutable
8+
data class GlobeColors(
9+
val landColor: Color,
10+
val oceanColor: Color,
11+
val contourColor: Color = oceanColor,
12+
) {
13+
val landColorArray = landColor.toFloatArray()
14+
val oceanColorArray = oceanColor.toFloatArray()
15+
val contourColorArray = contourColor.toFloatArray()
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package net.mullvad.mullvadvpn.lib.map.data
2+
3+
import androidx.compose.runtime.Immutable
4+
import androidx.compose.ui.graphics.Color
5+
6+
@Immutable
7+
data class LocationMarkerColors(
8+
val centerColor: Color,
9+
val ringBorderColor: Color = Color.White,
10+
val shadowColor: Color = Color.Black.copy(alpha = DEFAULT_SHADOW_ALPHA),
11+
val perimeterColors: Color = centerColor.copy(alpha = DEFAULT_PERIMETER_ALPHA)
12+
) {
13+
companion object {
14+
private const val DEFAULT_SHADOW_ALPHA = 0.55f
15+
private const val DEFAULT_PERIMETER_ALPHA = 0.4f
16+
}
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package net.mullvad.mullvadvpn.lib.map.data
2+
3+
import androidx.compose.runtime.Immutable
4+
5+
@Immutable
6+
class MapViewState(
7+
val cameraPosition: CameraPosition,
8+
val locationMarker: List<Marker>,
9+
val globeColors: GlobeColors
10+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package net.mullvad.mullvadvpn.lib.map.data
2+
3+
import androidx.compose.runtime.Immutable
4+
import net.mullvad.mullvadvpn.model.LatLong
5+
6+
@Immutable
7+
data class Marker(
8+
val latLong: LatLong,
9+
val size: Float = DEFAULT_MARKER_SIZE,
10+
val colors: LocationMarkerColors
11+
) {
12+
companion object {
13+
private const val DEFAULT_MARKER_SIZE = 0.02f
14+
}
15+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,108 @@
1+
package net.mullvad.mullvadvpn.lib.map.internal
2+
3+
import android.opengl.GLES20
4+
import android.opengl.Matrix
5+
import android.util.Log
6+
import androidx.compose.ui.graphics.Color
7+
import java.nio.Buffer
8+
import java.nio.ByteBuffer
9+
import java.nio.FloatBuffer
10+
11+
internal fun initShaderProgram(vsSource: String, fsSource: String): Int {
12+
val vertexShader = loadShader(GLES20.GL_VERTEX_SHADER, vsSource)
13+
require(vertexShader != -1) { "Failed to load vertexShader, result: -1" }
14+
15+
val fragmentShader = loadShader(GLES20.GL_FRAGMENT_SHADER, fsSource)
16+
require(fragmentShader != -1) { "fragmentShader == -1" }
17+
18+
val program = GLES20.glCreateProgram()
19+
check(program != 0) { "Could not create program" }
20+
21+
// Add the vertex shader to program
22+
GLES20.glAttachShader(program, vertexShader)
23+
24+
// Add the fragment shader to program
25+
GLES20.glAttachShader(program, fragmentShader)
26+
27+
// Creates OpenGL ES program executables
28+
GLES20.glLinkProgram(program)
29+
30+
val linked = IntArray(1)
31+
GLES20.glGetProgramiv(program, GLES20.GL_LINK_STATUS, linked, 0)
32+
if (linked[0] == GLES20.GL_FALSE) {
33+
val infoLog = GLES20.glGetProgramInfoLog(program)
34+
Log.e("GLHelper", "Could not link program: $infoLog")
35+
GLES20.glDeleteProgram(program)
36+
error("Could not link program with vsSource: $vsSource and fsSource: $fsSource")
37+
}
38+
39+
return program
40+
}
41+
42+
private fun loadShader(type: Int, shaderCode: String): Int {
43+
// Create a vertex shader type (GLES20.GL_VERTEX_SHADER)
44+
// or a fragment shader type (GLES20.GL_FRAGMENT_SHADER)
45+
val shader = GLES20.glCreateShader(type)
46+
47+
require(shader != 0) { "Unable to create shader" }
48+
49+
// Add the source code to the shader and compile it
50+
GLES20.glShaderSource(shader, shaderCode)
51+
GLES20.glCompileShader(shader)
52+
53+
val compiled = IntArray(1)
54+
GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0)
55+
if (compiled[0] == GLES20.GL_FALSE) {
56+
val infoLog = GLES20.glGetShaderInfoLog(shader)
57+
Log.e("GLHelper", "Could not compile shader $type:$infoLog")
58+
GLES20.glDeleteShader(shader)
59+
60+
error("Could not compile shader with shaderCode: $shaderCode")
61+
}
62+
63+
return shader
64+
}
65+
66+
internal fun initArrayBuffer(buffer: ByteBuffer) = initArrayBuffer(buffer, Byte.SIZE_BYTES)
67+
68+
internal fun initArrayBuffer(buffer: FloatBuffer) = initArrayBuffer(buffer, Float.SIZE_BYTES)
69+
70+
private fun initArrayBuffer(dataBuffer: Buffer, unitSizeInBytes: Int = 1): Int {
71+
val buffer = IntArray(1)
72+
GLES20.glGenBuffers(1, buffer, 0)
73+
74+
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, buffer[0])
75+
GLES20.glBufferData(
76+
GLES20.GL_ARRAY_BUFFER,
77+
dataBuffer.capacity() * unitSizeInBytes,
78+
dataBuffer,
79+
GLES20.GL_STATIC_DRAW
80+
)
81+
return buffer[0]
82+
}
83+
84+
internal fun initIndexBuffer(dataBuffer: Buffer): IndexBufferWithLength {
85+
val buffer = IntArray(1)
86+
GLES20.glGenBuffers(1, buffer, 0)
87+
88+
GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, buffer[0])
89+
GLES20.glBufferData(
90+
GLES20.GL_ELEMENT_ARRAY_BUFFER,
91+
dataBuffer.capacity(),
92+
dataBuffer,
93+
GLES20.GL_STATIC_DRAW
94+
)
95+
return IndexBufferWithLength(
96+
indexBuffer = buffer[0],
97+
length = dataBuffer.capacity() / Float.SIZE_BYTES
98+
)
99+
}
100+
101+
internal class IndexBufferWithLength(val indexBuffer: Int, val length: Int)
102+
103+
internal fun newIdentityMatrix(): FloatArray =
104+
FloatArray(MATRIX_SIZE).apply { Matrix.setIdentityM(this, 0) }
105+
106+
internal fun Color.toFloatArray(): FloatArray {
107+
return floatArrayOf(red, green, blue, alpha)
108+
}

0 commit comments

Comments
 (0)