From e4db6d2e516740a827f702a4c5d33a8fccc840ae Mon Sep 17 00:00:00 2001 From: Adrien Bousquie Date: Wed, 11 Dec 2024 13:10:04 +0100 Subject: [PATCH 01/16] refactor(opengl): reorganize and relocate OpenGL utilities --- .../renderables/LabelTest.kt => util/opengl/LabelUtilsTest.kt} | 2 -- .../lookup/model/map/renderables/CircleRenderer.kt | 2 +- .../lookup/model/map/renderables/SphericalRenderable.kt | 2 +- .../lookupgroup27/lookup/util/{ => opengl}/BufferUtils.kt | 2 +- .../{model/map/renderables/label => util/opengl}/LabelUtils.kt | 2 +- .../lookupgroup27/lookup/util/{ => opengl}/ShaderUtils.kt | 2 +- 6 files changed, 5 insertions(+), 7 deletions(-) rename app/src/androidTest/java/com/github/lookupgroup27/lookup/{model/map/renderables/LabelTest.kt => util/opengl/LabelUtilsTest.kt} (92%) rename app/src/main/java/com/github/lookupgroup27/lookup/util/{ => opengl}/BufferUtils.kt (94%) rename app/src/main/java/com/github/lookupgroup27/lookup/{model/map/renderables/label => util/opengl}/LabelUtils.kt (92%) rename app/src/main/java/com/github/lookupgroup27/lookup/util/{ => opengl}/ShaderUtils.kt (92%) diff --git a/app/src/androidTest/java/com/github/lookupgroup27/lookup/model/map/renderables/LabelTest.kt b/app/src/androidTest/java/com/github/lookupgroup27/lookup/util/opengl/LabelUtilsTest.kt similarity index 92% rename from app/src/androidTest/java/com/github/lookupgroup27/lookup/model/map/renderables/LabelTest.kt rename to app/src/androidTest/java/com/github/lookupgroup27/lookup/util/opengl/LabelUtilsTest.kt index 830f81c7a..587331cfc 100644 --- a/app/src/androidTest/java/com/github/lookupgroup27/lookup/model/map/renderables/LabelTest.kt +++ b/app/src/androidTest/java/com/github/lookupgroup27/lookup/util/opengl/LabelUtilsTest.kt @@ -2,8 +2,6 @@ package com.github.lookupgroup27.lookup.model.map.renderables import android.graphics.Bitmap import androidx.test.ext.junit.runners.AndroidJUnit4 -import com.github.lookupgroup27.lookup.model.map.renderables.label.Label -import com.github.lookupgroup27.lookup.model.map.renderables.label.LabelUtils import org.junit.Assert.* import org.junit.Test import org.junit.runner.RunWith diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/CircleRenderer.kt b/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/CircleRenderer.kt index 0d67b3fe3..848209297 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/CircleRenderer.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/CircleRenderer.kt @@ -7,7 +7,7 @@ import com.github.lookupgroup27.lookup.model.map.renderables.utils.GeometryUtils import com.github.lookupgroup27.lookup.model.map.skybox.buffers.ColorBuffer import com.github.lookupgroup27.lookup.model.map.skybox.buffers.IndexBuffer import com.github.lookupgroup27.lookup.model.map.skybox.buffers.VertexBuffer -import com.github.lookupgroup27.lookup.util.ShaderUtils.readShader +import com.github.lookupgroup27.lookup.util.opengl.ShaderUtils.readShader import com.github.lookupgroup27.lookup.util.opengl.ShaderProgram /** diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/SphericalRenderable.kt b/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/SphericalRenderable.kt index 03501d7f8..3830b15f2 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/SphericalRenderable.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/SphericalRenderable.kt @@ -7,7 +7,7 @@ import com.github.lookupgroup27.lookup.model.map.skybox.buffers.ColorBuffer import com.github.lookupgroup27.lookup.model.map.skybox.buffers.IndexBuffer import com.github.lookupgroup27.lookup.model.map.skybox.buffers.TextureBuffer import com.github.lookupgroup27.lookup.model.map.skybox.buffers.VertexBuffer -import com.github.lookupgroup27.lookup.util.ShaderUtils.readShader +import com.github.lookupgroup27.lookup.util.opengl.ShaderUtils.readShader import com.github.lookupgroup27.lookup.util.opengl.ShaderProgram /** diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/util/BufferUtils.kt b/app/src/main/java/com/github/lookupgroup27/lookup/util/opengl/BufferUtils.kt similarity index 94% rename from app/src/main/java/com/github/lookupgroup27/lookup/util/BufferUtils.kt rename to app/src/main/java/com/github/lookupgroup27/lookup/util/opengl/BufferUtils.kt index 3ab47c48d..f1f8cea6f 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/util/BufferUtils.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/util/opengl/BufferUtils.kt @@ -1,4 +1,4 @@ -package com.github.lookupgroup27.lookup.util +package com.github.lookupgroup27.lookup.util.opengl import java.nio.ByteBuffer import java.nio.ByteOrder diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/label/LabelUtils.kt b/app/src/main/java/com/github/lookupgroup27/lookup/util/opengl/LabelUtils.kt similarity index 92% rename from app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/label/LabelUtils.kt rename to app/src/main/java/com/github/lookupgroup27/lookup/util/opengl/LabelUtils.kt index 85e98912d..894dc5cfe 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/label/LabelUtils.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/util/opengl/LabelUtils.kt @@ -1,4 +1,4 @@ -package com.github.lookupgroup27.lookup.model.map.renderables.label +package com.github.lookupgroup27.lookup.util.opengl import android.graphics.Bitmap import android.graphics.Canvas diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/util/ShaderUtils.kt b/app/src/main/java/com/github/lookupgroup27/lookup/util/opengl/ShaderUtils.kt similarity index 92% rename from app/src/main/java/com/github/lookupgroup27/lookup/util/ShaderUtils.kt rename to app/src/main/java/com/github/lookupgroup27/lookup/util/opengl/ShaderUtils.kt index 119c81e54..c895882a8 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/util/ShaderUtils.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/util/opengl/ShaderUtils.kt @@ -1,4 +1,4 @@ -package com.github.lookupgroup27.lookup.util +package com.github.lookupgroup27.lookup.util.opengl import android.content.Context import android.util.Log From 6a1b03cf7315137d256210c0e7445d4da525969f Mon Sep 17 00:00:00 2001 From: Adrien Bousquie Date: Wed, 11 Dec 2024 13:21:47 +0100 Subject: [PATCH 02/16] feat: add Label rendering Introduced `Label` class for rendering text labels in 3D space. Added vertex shader (`label_vertex_shader.glsl`) to handle label positioning. Added fragment shader (`label_fragment_shader.glsl`) for texture mapping. --- .../assets/shaders/label_fragment_shader.glsl | 8 ++ .../assets/shaders/label_vertex_shader.glsl | 13 ++ .../lookup/ui/map/renderables/Label.kt | 121 ++++++++++++++++++ 3 files changed, 142 insertions(+) create mode 100644 app/src/main/assets/shaders/label_fragment_shader.glsl create mode 100644 app/src/main/assets/shaders/label_vertex_shader.glsl create mode 100644 app/src/main/java/com/github/lookupgroup27/lookup/ui/map/renderables/Label.kt diff --git a/app/src/main/assets/shaders/label_fragment_shader.glsl b/app/src/main/assets/shaders/label_fragment_shader.glsl new file mode 100644 index 000000000..bb765f066 --- /dev/null +++ b/app/src/main/assets/shaders/label_fragment_shader.glsl @@ -0,0 +1,8 @@ +precision mediump float; + +uniform sampler2D uTexture; +varying vec2 vTexCoordinate; + +void main() { + gl_FragColor = texture2D(uTexture, vTexCoordinate); +} \ No newline at end of file diff --git a/app/src/main/assets/shaders/label_vertex_shader.glsl b/app/src/main/assets/shaders/label_vertex_shader.glsl new file mode 100644 index 000000000..8771db411 --- /dev/null +++ b/app/src/main/assets/shaders/label_vertex_shader.glsl @@ -0,0 +1,13 @@ +uniform mat4 uModelMatrix; +uniform mat4 uViewMatrix; +uniform mat4 uProjMatrix; + +attribute vec4 aPosition; +attribute vec2 aTexCoordinate; + +varying vec2 vTexCoordinate; + +void main() { + gl_Position = uProjMatrix * uViewMatrix * uModelMatrix * aPosition; + vTexCoordinate = aTexCoordinate; +} \ No newline at end of file diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/ui/map/renderables/Label.kt b/app/src/main/java/com/github/lookupgroup27/lookup/ui/map/renderables/Label.kt new file mode 100644 index 000000000..37906b2fd --- /dev/null +++ b/app/src/main/java/com/github/lookupgroup27/lookup/ui/map/renderables/Label.kt @@ -0,0 +1,121 @@ +package com.github.lookupgroup27.lookup.ui.map.renderables + +import android.content.Context +import android.opengl.GLES20 +import android.opengl.GLUtils +import com.github.lookupgroup27.lookup.model.map.Camera +import com.github.lookupgroup27.lookup.util.opengl.BufferUtils.toBuffer +import com.github.lookupgroup27.lookup.util.opengl.ShaderUtils.readShader +import com.github.lookupgroup27.lookup.util.opengl.LabelUtils +import com.github.lookupgroup27.lookup.util.opengl.ShaderProgram +import java.nio.FloatBuffer + +/** + * A label that displays text in the 3D world. + * + * @param context The application context + * @param text The text to display on the label + * @param position The position of the label in 3D coordinates (x, y, z) + */ +class Label(context: Context, text: String, position: FloatArray) { + private val shaderProgram: ShaderProgram + private val textureId: Int + private val vertexBuffer: FloatBuffer + private val texCoordBuffer: FloatBuffer + + init { + // Initialize shader program + val vertexShaderCode = readShader(context, "label_vertex_shader.glsl") + val fragmentShaderCode = readShader(context, "label_fragment_shader.glsl") + + shaderProgram = ShaderProgram(vertexShaderCode, fragmentShaderCode) + + // Define vertices for a quad that will display the label + // These coordinates represent a quad that fills the screen + val vertices = + floatArrayOf( + -1f + position[0], + -1f + position[1], + 0f + position[2], // Bottom left + 1f + position[0], + -1f + position[1], + 0f + position[2], // Bottom right + -1f + position[0], + 1f + position[1], + 0f + position[2], // Top left + 1f + position[0], + 1f + position[1], + 0f + position[2] // Top right + ) + vertexBuffer = vertices.toBuffer() + + // Define texture coordinates + val texCoords = + floatArrayOf( + 0f, + 1f, // Bottom left + 1f, + 1f, // Bottom right + 0f, + 0f, // Top left + 1f, + 0f // Top right + ) + texCoordBuffer = texCoords.toBuffer() + + // Initialize Label texture + val textureHandles = IntArray(1) + GLES20.glGenTextures(1, textureHandles, 0) + textureId = textureHandles[0] + + // Bind texture + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId) + + // Set texture parameters + GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MIN_FILTER, GLES20.GL_LINEAR) + GLES20.glTexParameteri(GLES20.GL_TEXTURE_2D, GLES20.GL_TEXTURE_MAG_FILTER, GLES20.GL_LINEAR) + + // Load bitmap to OpenGL + val bitmap = LabelUtils.createLabelBitmap(text) + GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, bitmap, 0) + } + + /** + * Draws the label in the 3D world. + * + * @param camera The camera used to render the label + */ + fun draw(camera: Camera) { + shaderProgram.use() // FIXME: Remove this one line method ? + + // Get attribute and uniform locations + val modelMatrixHandle = GLES20.glGetUniformLocation(shaderProgram.programId, "uModelMatrix") + val viewMatrixHandle = GLES20.glGetUniformLocation(shaderProgram.programId, "uViewMatrix") + val projMatrixHandle = GLES20.glGetUniformLocation(shaderProgram.programId, "uProjMatrix") + val positionHandle = GLES20.glGetAttribLocation(shaderProgram.programId, "aPosition") + val texCoordHandle = GLES20.glGetAttribLocation(shaderProgram.programId, "aTexCoordinate") + val textureHandle = GLES20.glGetUniformLocation(shaderProgram.programId, "uTexture") + + // Bind texture + GLES20.glActiveTexture(GLES20.GL_TEXTURE0) + GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId) + GLES20.glUniform1i(textureHandle, 0) + + // Set up vertex and texture coordinate buffers + vertexBuffer.position(0) + GLES20.glVertexAttribPointer(positionHandle, 3, GLES20.GL_FLOAT, false, 0, vertexBuffer) + GLES20.glEnableVertexAttribArray(positionHandle) + + texCoordBuffer.position(0) + GLES20.glVertexAttribPointer(texCoordHandle, 2, GLES20.GL_FLOAT, false, 0, texCoordBuffer) + GLES20.glEnableVertexAttribArray(texCoordHandle) + + // Set the MVP matrix + GLES20.glUniformMatrix4fv(modelMatrixHandle, 1, false, camera.modelMatrix, 0) + GLES20.glUniformMatrix4fv(viewMatrixHandle, 1, false, camera.viewMatrix, 0) + GLES20.glUniformMatrix4fv(projMatrixHandle, 1, false, camera.projMatrix, 0) + + // Draw the text + GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4) + } +} From 1058a6fbb17bb870e5edcb6e3225596fff76c0ad Mon Sep 17 00:00:00 2001 From: Adrien Bousquie Date: Wed, 11 Dec 2024 13:22:44 +0100 Subject: [PATCH 03/16] refactor(label): remove obsolete Label data class and related test Deleted the `Label` data class from `renderables.label` as it was replaced by the new `Label` class with OpenGL functionality. --- .../lookup/util/opengl/LabelUtilsTest.kt | 17 ++--------------- .../lookup/model/map/renderables/label/Label.kt | 14 -------------- 2 files changed, 2 insertions(+), 29 deletions(-) delete mode 100644 app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/label/Label.kt diff --git a/app/src/androidTest/java/com/github/lookupgroup27/lookup/util/opengl/LabelUtilsTest.kt b/app/src/androidTest/java/com/github/lookupgroup27/lookup/util/opengl/LabelUtilsTest.kt index 587331cfc..3bb4bce75 100644 --- a/app/src/androidTest/java/com/github/lookupgroup27/lookup/util/opengl/LabelUtilsTest.kt +++ b/app/src/androidTest/java/com/github/lookupgroup27/lookup/util/opengl/LabelUtilsTest.kt @@ -1,4 +1,4 @@ -package com.github.lookupgroup27.lookup.model.map.renderables +package com.github.lookupgroup27.lookup.util.opengl import android.graphics.Bitmap import androidx.test.ext.junit.runners.AndroidJUnit4 @@ -8,20 +8,7 @@ import org.junit.runner.RunWith /** Instrumented tests for LabelUtils and the Label class. */ @RunWith(AndroidJUnit4::class) -class LabelTest { - - /** Tests that a Label object can be created successfully. */ - @Test - fun testLabelCreation() { - val text = "Star A" - val position = floatArrayOf(1.0f, 2.0f, 3.0f) - val label = Label(text, position) - - assertEquals("Label text should be 'Star A'", "Star A", label.text) - assertArrayEquals( - "Label position should match", floatArrayOf(1.0f, 2.0f, 3.0f), label.position, 0.0f) - assertNull("Label textureId should be null by default", label.textureId) - } +class LabelUtilsTest { /** Tests that the bitmap is created successfully. */ @Test diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/label/Label.kt b/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/label/Label.kt deleted file mode 100644 index 17222e843..000000000 --- a/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/label/Label.kt +++ /dev/null @@ -1,14 +0,0 @@ -package com.github.lookupgroup27.lookup.model.map.renderables.label - -/** - * Data class representing a label in the skymap. - * - * @property text The text of the label. - * @property position The position of the label in 3D space (x, y, z). - * @property textureId The OpenGL texture ID for the label's bitmap (optional). - */ -data class Label( - val text: String, - val position: FloatArray, - var textureId: Int? = null // Optional texture ID for OpenGL -) From 7ad884863b647c6a3a18e1125de5097772f8375a Mon Sep 17 00:00:00 2001 From: Adrien Bousquie Date: Wed, 11 Dec 2024 14:53:49 +0100 Subject: [PATCH 04/16] feat(label): add size parameter to Label for adjustable scaling --- .../lookup/ui/map/renderables/Label.kt | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/ui/map/renderables/Label.kt b/app/src/main/java/com/github/lookupgroup27/lookup/ui/map/renderables/Label.kt index 37906b2fd..a5bf1b5d3 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/ui/map/renderables/Label.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/ui/map/renderables/Label.kt @@ -17,7 +17,7 @@ import java.nio.FloatBuffer * @param text The text to display on the label * @param position The position of the label in 3D coordinates (x, y, z) */ -class Label(context: Context, text: String, position: FloatArray) { +class Label(context: Context, text: String, position: FloatArray, size: Float) { private val shaderProgram: ShaderProgram private val textureId: Int private val vertexBuffer: FloatBuffer @@ -34,17 +34,17 @@ class Label(context: Context, text: String, position: FloatArray) { // These coordinates represent a quad that fills the screen val vertices = floatArrayOf( - -1f + position[0], - -1f + position[1], + -size + position[0], + -size + position[1], 0f + position[2], // Bottom left - 1f + position[0], - -1f + position[1], + size + position[0], + -size + position[1], 0f + position[2], // Bottom right - -1f + position[0], - 1f + position[1], + -size + position[0], + size + position[1], 0f + position[2], // Top left - 1f + position[0], - 1f + position[1], + size + position[0], + size + position[1], 0f + position[2] // Top right ) vertexBuffer = vertices.toBuffer() From 1fb8a3097a2ef27d5ad8ba0df129862ddbf8bc0e Mon Sep 17 00:00:00 2001 From: Adrien Bousquie Date: Wed, 11 Dec 2024 19:46:29 +0100 Subject: [PATCH 05/16] feat(label): integrate Position class and implement billboard effect Added `Position` class to encapsulate 3D coordinates for improved clarity and reusability. Implemented billboard effect in `Label`, ensuring labels always face the camera dynamically. Refined vertex buffer calculations for labels, simplifying positional adjustments. --- .../lookup/ui/map/renderables/Label.kt | 104 +++++++++++++----- .../lookup/util/opengl/Position.kt | 7 ++ 2 files changed, 84 insertions(+), 27 deletions(-) create mode 100644 app/src/main/java/com/github/lookupgroup27/lookup/util/opengl/Position.kt diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/ui/map/renderables/Label.kt b/app/src/main/java/com/github/lookupgroup27/lookup/ui/map/renderables/Label.kt index a5bf1b5d3..c3fc3001a 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/ui/map/renderables/Label.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/ui/map/renderables/Label.kt @@ -3,10 +3,12 @@ package com.github.lookupgroup27.lookup.ui.map.renderables import android.content.Context import android.opengl.GLES20 import android.opengl.GLUtils +import android.opengl.Matrix import com.github.lookupgroup27.lookup.model.map.Camera import com.github.lookupgroup27.lookup.util.opengl.BufferUtils.toBuffer import com.github.lookupgroup27.lookup.util.opengl.ShaderUtils.readShader import com.github.lookupgroup27.lookup.util.opengl.LabelUtils +import com.github.lookupgroup27.lookup.util.opengl.Position import com.github.lookupgroup27.lookup.util.opengl.ShaderProgram import java.nio.FloatBuffer @@ -15,9 +17,9 @@ import java.nio.FloatBuffer * * @param context The application context * @param text The text to display on the label - * @param position The position of the label in 3D coordinates (x, y, z) + * @param pos The position of the label TODO Implement this in others OpenGL classes */ -class Label(context: Context, text: String, position: FloatArray, size: Float) { +class Label(context: Context, text: String, var pos: Position, size: Float) { private val shaderProgram: ShaderProgram private val textureId: Int private val vertexBuffer: FloatBuffer @@ -33,34 +35,34 @@ class Label(context: Context, text: String, position: FloatArray, size: Float) { // Define vertices for a quad that will display the label // These coordinates represent a quad that fills the screen val vertices = - floatArrayOf( - -size + position[0], - -size + position[1], - 0f + position[2], // Bottom left - size + position[0], - -size + position[1], - 0f + position[2], // Bottom right - -size + position[0], - size + position[1], - 0f + position[2], // Top left - size + position[0], - size + position[1], - 0f + position[2] // Top right - ) + floatArrayOf( + -size, + -size, + 0f, // Bottom left + size, + -size, + 0f, // Bottom right + -size, + size, + 0f, // Top left + size, + size, + 0f // Top right + ) vertexBuffer = vertices.toBuffer() // Define texture coordinates val texCoords = - floatArrayOf( - 0f, - 1f, // Bottom left - 1f, - 1f, // Bottom right - 0f, - 0f, // Top left - 1f, - 0f // Top right - ) + floatArrayOf( + 0f, + 1f, // Bottom left + 1f, + 1f, // Bottom right + 0f, + 0f, // Top left + 1f, + 0f // Top right + ) texCoordBuffer = texCoords.toBuffer() // Initialize Label texture @@ -110,8 +112,56 @@ class Label(context: Context, text: String, position: FloatArray, size: Float) { GLES20.glVertexAttribPointer(texCoordHandle, 2, GLES20.GL_FLOAT, false, 0, texCoordBuffer) GLES20.glEnableVertexAttribArray(texCoordHandle) + val billboardMatrix = FloatArray(16) + val modelMatrix = camera.modelMatrix.clone() + + // Extract camera look direction from view matrix + val lookX = -camera.viewMatrix[2] + val lookY = -camera.viewMatrix[6] + val lookZ = -camera.viewMatrix[10] + + // Create billboard rotation (this is the vector compared to the object that points up for the text + // Example we take a text Hello, we have: + // ↑ Hello + val upX = camera.viewMatrix[1] + val upY = camera.viewMatrix[5] + val upZ = camera.viewMatrix[9] + + // Calculate right vector (cross product) + val rightX = upY * lookZ - upZ * lookY + val rightY = upZ * lookX - upX * lookZ + val rightZ = upX * lookY - upY * lookX + + // Set billboard matrix + billboardMatrix[0] = -rightX + billboardMatrix[1] = -rightY + billboardMatrix[2] = -rightZ + billboardMatrix[3] = 0f + + billboardMatrix[4] = upX + billboardMatrix[5] = upY + billboardMatrix[6] = upZ + billboardMatrix[7] = 0f + + billboardMatrix[8] = lookX + billboardMatrix[9] = lookY + billboardMatrix[10] = lookZ + billboardMatrix[11] = 0f + + billboardMatrix[12] = 0f + billboardMatrix[13] = 0f + billboardMatrix[14] = 0f + billboardMatrix[15] = 1f + + // First translate to position + Matrix.translateM(modelMatrix, 0, pos.x, pos.y, pos.z) + + // Then apply billboard rotation + val rotatedMatrix = FloatArray(16) + Matrix.multiplyMM(rotatedMatrix, 0, modelMatrix, 0, billboardMatrix, 0) + // Set the MVP matrix - GLES20.glUniformMatrix4fv(modelMatrixHandle, 1, false, camera.modelMatrix, 0) + GLES20.glUniformMatrix4fv(modelMatrixHandle, 1, false, rotatedMatrix, 0) GLES20.glUniformMatrix4fv(viewMatrixHandle, 1, false, camera.viewMatrix, 0) GLES20.glUniformMatrix4fv(projMatrixHandle, 1, false, camera.projMatrix, 0) diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/util/opengl/Position.kt b/app/src/main/java/com/github/lookupgroup27/lookup/util/opengl/Position.kt new file mode 100644 index 000000000..032924123 --- /dev/null +++ b/app/src/main/java/com/github/lookupgroup27/lookup/util/opengl/Position.kt @@ -0,0 +1,7 @@ +package com.github.lookupgroup27.lookup.util.opengl + +data class Position( + val x: Float, + val y: Float, + val z: Float +) From 05bfe07cf6a56521f3e341a4d80764e77d4071bb Mon Sep 17 00:00:00 2001 From: Adrien Bousquie Date: Sat, 14 Dec 2024 13:55:26 +0100 Subject: [PATCH 06/16] feat(label): update label bitmap dimensions and alignment Changed the height of the bitmap in `LabelUtils.createLabelBitmap` to fix the bad looking aspect ratio of the text. Updated text alignment logic to center the text horizontally and vertically. Updated test case accordingly. --- .../lookup/util/opengl/LabelUtilsTest.kt | 2 +- .../lookupgroup27/lookup/util/opengl/LabelUtils.kt | 12 ++++++------ 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/app/src/androidTest/java/com/github/lookupgroup27/lookup/util/opengl/LabelUtilsTest.kt b/app/src/androidTest/java/com/github/lookupgroup27/lookup/util/opengl/LabelUtilsTest.kt index 3bb4bce75..b3e72e998 100644 --- a/app/src/androidTest/java/com/github/lookupgroup27/lookup/util/opengl/LabelUtilsTest.kt +++ b/app/src/androidTest/java/com/github/lookupgroup27/lookup/util/opengl/LabelUtilsTest.kt @@ -18,7 +18,7 @@ class LabelUtilsTest { assertNotNull("Bitmap should not be null", bitmap) assertEquals("Bitmap width should be 256", 256, bitmap.width) - assertEquals("Bitmap height should be 128", 128, bitmap.height) + assertEquals("Bitmap height should be 256", 256, bitmap.height) } /** Tests that the bitmap contains non-transparent pixels. */ diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/util/opengl/LabelUtils.kt b/app/src/main/java/com/github/lookupgroup27/lookup/util/opengl/LabelUtils.kt index 894dc5cfe..5e52f6042 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/util/opengl/LabelUtils.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/util/opengl/LabelUtils.kt @@ -15,19 +15,19 @@ object LabelUtils { */ fun createLabelBitmap(text: String): Bitmap { val width = 256 // Width of the bitmap - val height = 128 // Height of the bitmap + val height = 256 // Height of the bitmap val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888) - val canvas = Canvas(bitmap) - canvas.drawColor(android.graphics.Color.BLACK) // Background color - val paint = Paint() paint.color = android.graphics.Color.WHITE // Text color paint.textSize = 32f paint.isAntiAlias = true - val x = 20f - val y = height / 2f + val x = width / 2f - paint.measureText(text) / 2 + val y = height / 2f - (paint.descent() + paint.ascent()) / 2 + + val canvas = Canvas(bitmap) + canvas.drawColor(android.graphics.Color.BLACK) // Background color canvas.drawText(text, x, y, paint) return bitmap From a460c3512fdbceb90994142907cbaec0375f9b20 Mon Sep 17 00:00:00 2001 From: Adrien Bousquie Date: Sat, 14 Dec 2024 16:35:48 +0100 Subject: [PATCH 07/16] refactor(label): adjust label position and size logic Enhanced the `Label` class to accept `objectSize` to better align the label relative to the object. --- .../lookup/ui/map/renderables/Label.kt | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/ui/map/renderables/Label.kt b/app/src/main/java/com/github/lookupgroup27/lookup/ui/map/renderables/Label.kt index c3fc3001a..b43d547d9 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/ui/map/renderables/Label.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/ui/map/renderables/Label.kt @@ -18,8 +18,16 @@ import java.nio.FloatBuffer * @param context The application context * @param text The text to display on the label * @param pos The position of the label TODO Implement this in others OpenGL classes + * @param size The size of the label + * @param objectSize The size of the object to label */ -class Label(context: Context, text: String, var pos: Position, size: Float) { +class Label( + context: Context, + text: String, + var pos: Position, + size: Float, + objectSize: Float +) { private val shaderProgram: ShaderProgram private val textureId: Int private val vertexBuffer: FloatBuffer @@ -36,18 +44,10 @@ class Label(context: Context, text: String, var pos: Position, size: Float) { // These coordinates represent a quad that fills the screen val vertices = floatArrayOf( - -size, - -size, - 0f, // Bottom left - size, - -size, - 0f, // Bottom right - -size, - size, - 0f, // Top left - size, - size, - 0f // Top right + -size, -size - objectSize - size, 0f, // Bottom left + size, -size - objectSize - size, 0f, // Bottom right + -size, size - objectSize - size, 0f, // Top left + size, size - objectSize - size, 0f // Top right ) vertexBuffer = vertices.toBuffer() From a4659db00594c1160abe4accaee72116b40c2795 Mon Sep 17 00:00:00 2001 From: Adrien Bousquie Date: Sat, 14 Dec 2024 16:36:57 +0100 Subject: [PATCH 08/16] feat(map-renderables): integrate label rendering for Star and Planet objects Added a `Label` to the `Star` and `Planet` classes to display object names in the 3D map. --- .../lookupgroup27/lookup/model/map/renderables/Planet.kt | 8 ++++++-- .../lookupgroup27/lookup/model/map/renderables/Star.kt | 4 ++++ 2 files changed, 10 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/Planet.kt b/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/Planet.kt index 8b5e8769a..4eea4b4ba 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/Planet.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/Planet.kt @@ -4,6 +4,8 @@ import android.content.Context import android.opengl.GLES20 import android.opengl.Matrix import com.github.lookupgroup27.lookup.model.map.Camera +import com.github.lookupgroup27.lookup.ui.map.renderables.Label +import com.github.lookupgroup27.lookup.util.opengl.Position import com.github.lookupgroup27.lookup.util.opengl.TextureManager /** @@ -27,7 +29,7 @@ import com.github.lookupgroup27.lookup.util.opengl.TextureManager */ open class Planet( private val context: Context, - private val name: String? = "Planet", + private val name: String = "Planet", private val position: FloatArray = floatArrayOf(0.0f, 0.0f, -2.0f), protected var textureId: Int, numBands: Int = SphereRenderer.DEFAULT_NUM_BANDS, @@ -37,12 +39,13 @@ open class Planet( ) : Object(vertexShaderCode, fragmentShaderCode) { private val sphereRenderer = SphereRenderer(context, numBands, stepsPerBand) - // Make textureHandle protected so it can be accessed by subclasses protected var textureHandle: Int = 0 private var scale: Float = 0.3f + private var textureManager: TextureManager + private val label = Label(context, name, Position(position[0], position[1], position[2]), 0.1f, scale) /** Initializes the planet's geometry, shaders, and texture. */ init { @@ -81,6 +84,7 @@ open class Planet( * @param camera The camera used for rendering the scene. */ override fun draw(camera: Camera) { + label.draw(camera) val modelMatrix = FloatArray(16) Matrix.setIdentityM(modelMatrix, 0) val viewMatrix = FloatArray(16) diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/Star.kt b/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/Star.kt index 9199c4c9a..20fa9f324 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/Star.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/Star.kt @@ -3,6 +3,8 @@ package com.github.lookupgroup27.lookup.model.map.renderables import android.content.Context import android.opengl.Matrix import com.github.lookupgroup27.lookup.model.map.Camera +import com.github.lookupgroup27.lookup.ui.map.renderables.Label +import com.github.lookupgroup27.lookup.util.opengl.Position /** * Represents a star in 3D space using the CircleRenderer for rendering. @@ -24,6 +26,7 @@ class Star( ) : Object(vertexShaderCode, fragmentShaderCode) { private val circleRenderer = CircleRenderer(context, segments, 1.0f, color.copyOf(4)) + private val label = Label(context, "Star", Position(position[0], position[1], position[2]), 0.1f, size) init { // Initialize shaders and buffers once, no textures needed @@ -32,6 +35,7 @@ class Star( } override fun draw(camera: Camera) { + label.draw(camera) // Model-View-Projection (MVP) Matrix val mvpMatrix = FloatArray(16) val modelMatrix = FloatArray(16) From 2d672f95764b9518c2d01269cf068295e1f0fdeb Mon Sep 17 00:00:00 2001 From: Adrien Bousquie Date: Sat, 14 Dec 2024 16:37:32 +0100 Subject: [PATCH 09/16] docs(planet): correct documentation for Planet class parameters --- .../lookupgroup27/lookup/model/map/renderables/Planet.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/Planet.kt b/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/Planet.kt index 4eea4b4ba..a187de52a 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/Planet.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/Planet.kt @@ -22,9 +22,9 @@ import com.github.lookupgroup27.lookup.util.opengl.TextureManager * @property name The name of the planet (e.g., "Earth"). Defaults to "Planet". * @property position The planet's position in 3D space, represented as a float array [x, y, z]. * @property textureId The resource ID of the texture applied to the planet's surface. - * @property numBands The number of latitude bands used for tessellating the sphere. Higher values + * @param numBands The number of latitude bands used for tessellating the sphere. Higher values * create smoother spheres. - * @property stepsPerBand The number of longitude steps per latitude band. Higher values improve + * @param stepsPerBand The number of longitude steps per latitude band. Higher values improve * rendering fidelity. */ open class Planet( From a9439c7e7cf9f4a11b41b374cae481326b3c9ef2 Mon Sep 17 00:00:00 2001 From: Adrien Bousquie Date: Sun, 15 Dec 2024 18:52:46 +0100 Subject: [PATCH 10/16] feat: add transparency to the label background --- .../github/lookupgroup27/lookup/ui/map/renderables/Label.kt | 4 ++++ .../com/github/lookupgroup27/lookup/util/opengl/LabelUtils.kt | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/ui/map/renderables/Label.kt b/app/src/main/java/com/github/lookupgroup27/lookup/ui/map/renderables/Label.kt index b43d547d9..e8a76bf92 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/ui/map/renderables/Label.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/ui/map/renderables/Label.kt @@ -88,6 +88,8 @@ class Label( * @param camera The camera used to render the label */ fun draw(camera: Camera) { + GLES20.glEnable(GLES20.GL_BLEND) + GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA) shaderProgram.use() // FIXME: Remove this one line method ? // Get attribute and uniform locations @@ -167,5 +169,7 @@ class Label( // Draw the text GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4) + + GLES20.glDisable(GLES20.GL_BLEND) } } diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/util/opengl/LabelUtils.kt b/app/src/main/java/com/github/lookupgroup27/lookup/util/opengl/LabelUtils.kt index 5e52f6042..65c0d706e 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/util/opengl/LabelUtils.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/util/opengl/LabelUtils.kt @@ -27,7 +27,7 @@ object LabelUtils { val y = height / 2f - (paint.descent() + paint.ascent()) / 2 val canvas = Canvas(bitmap) - canvas.drawColor(android.graphics.Color.BLACK) // Background color + canvas.drawColor(android.graphics.Color.TRANSPARENT) // Background color canvas.drawText(text, x, y, paint) return bitmap From 255f94c5fe76dde8d83f0b123e831e8c1587ced3 Mon Sep 17 00:00:00 2001 From: Adrien Bousquie Date: Sun, 15 Dec 2024 18:53:15 +0100 Subject: [PATCH 11/16] style: apply ktfmt format --- .../model/map/renderables/CircleRenderer.kt | 2 +- .../lookup/model/map/renderables/Planet.kt | 11 ++-- .../map/renderables/SphericalRenderable.kt | 2 +- .../lookup/model/map/renderables/Star.kt | 3 +- .../lookup/ui/map/renderables/Label.kt | 53 ++++++++++--------- .../lookup/util/opengl/Position.kt | 6 +-- 6 files changed, 39 insertions(+), 38 deletions(-) diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/CircleRenderer.kt b/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/CircleRenderer.kt index 848209297..566afd47d 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/CircleRenderer.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/CircleRenderer.kt @@ -7,8 +7,8 @@ import com.github.lookupgroup27.lookup.model.map.renderables.utils.GeometryUtils import com.github.lookupgroup27.lookup.model.map.skybox.buffers.ColorBuffer import com.github.lookupgroup27.lookup.model.map.skybox.buffers.IndexBuffer import com.github.lookupgroup27.lookup.model.map.skybox.buffers.VertexBuffer -import com.github.lookupgroup27.lookup.util.opengl.ShaderUtils.readShader import com.github.lookupgroup27.lookup.util.opengl.ShaderProgram +import com.github.lookupgroup27.lookup.util.opengl.ShaderUtils.readShader /** * Renderer for creating circular 2D objects in an OpenGL environment. diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/Planet.kt b/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/Planet.kt index a187de52a..959dec618 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/Planet.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/Planet.kt @@ -18,14 +18,14 @@ import com.github.lookupgroup27.lookup.util.opengl.TextureManager * - Support for custom textures, colors, and scaling. * - Integration with OpenGL shaders for rendering. * - * @property context The Android context used for resource access. - * @property name The name of the planet (e.g., "Earth"). Defaults to "Planet". - * @property position The planet's position in 3D space, represented as a float array [x, y, z]. - * @property textureId The resource ID of the texture applied to the planet's surface. * @param numBands The number of latitude bands used for tessellating the sphere. Higher values * create smoother spheres. * @param stepsPerBand The number of longitude steps per latitude band. Higher values improve * rendering fidelity. + * @property context The Android context used for resource access. + * @property name The name of the planet (e.g., "Earth"). Defaults to "Planet". + * @property position The planet's position in 3D space, represented as a float array [x, y, z]. + * @property textureId The resource ID of the texture applied to the planet's surface. */ open class Planet( private val context: Context, @@ -45,7 +45,8 @@ open class Planet( private var scale: Float = 0.3f private var textureManager: TextureManager - private val label = Label(context, name, Position(position[0], position[1], position[2]), 0.1f, scale) + private val label = + Label(context, name, Position(position[0], position[1], position[2]), 0.1f, scale) /** Initializes the planet's geometry, shaders, and texture. */ init { diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/SphericalRenderable.kt b/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/SphericalRenderable.kt index 3830b15f2..6011fd5a7 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/SphericalRenderable.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/SphericalRenderable.kt @@ -7,8 +7,8 @@ import com.github.lookupgroup27.lookup.model.map.skybox.buffers.ColorBuffer import com.github.lookupgroup27.lookup.model.map.skybox.buffers.IndexBuffer import com.github.lookupgroup27.lookup.model.map.skybox.buffers.TextureBuffer import com.github.lookupgroup27.lookup.model.map.skybox.buffers.VertexBuffer -import com.github.lookupgroup27.lookup.util.opengl.ShaderUtils.readShader import com.github.lookupgroup27.lookup.util.opengl.ShaderProgram +import com.github.lookupgroup27.lookup.util.opengl.ShaderUtils.readShader /** * Base class for rendering spherical 3D objects in an OpenGL environment. diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/Star.kt b/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/Star.kt index 20fa9f324..f4f876bd1 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/Star.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/Star.kt @@ -26,7 +26,8 @@ class Star( ) : Object(vertexShaderCode, fragmentShaderCode) { private val circleRenderer = CircleRenderer(context, segments, 1.0f, color.copyOf(4)) - private val label = Label(context, "Star", Position(position[0], position[1], position[2]), 0.1f, size) + private val label = + Label(context, "Star", Position(position[0], position[1], position[2]), 0.1f, size) init { // Initialize shaders and buffers once, no textures needed diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/ui/map/renderables/Label.kt b/app/src/main/java/com/github/lookupgroup27/lookup/ui/map/renderables/Label.kt index e8a76bf92..f25ee4797 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/ui/map/renderables/Label.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/ui/map/renderables/Label.kt @@ -6,10 +6,10 @@ import android.opengl.GLUtils import android.opengl.Matrix import com.github.lookupgroup27.lookup.model.map.Camera import com.github.lookupgroup27.lookup.util.opengl.BufferUtils.toBuffer -import com.github.lookupgroup27.lookup.util.opengl.ShaderUtils.readShader import com.github.lookupgroup27.lookup.util.opengl.LabelUtils import com.github.lookupgroup27.lookup.util.opengl.Position import com.github.lookupgroup27.lookup.util.opengl.ShaderProgram +import com.github.lookupgroup27.lookup.util.opengl.ShaderUtils.readShader import java.nio.FloatBuffer /** @@ -21,13 +21,7 @@ import java.nio.FloatBuffer * @param size The size of the label * @param objectSize The size of the object to label */ -class Label( - context: Context, - text: String, - var pos: Position, - size: Float, - objectSize: Float -) { +class Label(context: Context, text: String, var pos: Position, size: Float, objectSize: Float) { private val shaderProgram: ShaderProgram private val textureId: Int private val vertexBuffer: FloatBuffer @@ -43,26 +37,34 @@ class Label( // Define vertices for a quad that will display the label // These coordinates represent a quad that fills the screen val vertices = - floatArrayOf( - -size, -size - objectSize - size, 0f, // Bottom left - size, -size - objectSize - size, 0f, // Bottom right - -size, size - objectSize - size, 0f, // Top left - size, size - objectSize - size, 0f // Top right - ) + floatArrayOf( + -size, + -size - objectSize - size, + 0f, // Bottom left + size, + -size - objectSize - size, + 0f, // Bottom right + -size, + size - objectSize - size, + 0f, // Top left + size, + size - objectSize - size, + 0f // Top right + ) vertexBuffer = vertices.toBuffer() // Define texture coordinates val texCoords = - floatArrayOf( - 0f, - 1f, // Bottom left - 1f, - 1f, // Bottom right - 0f, - 0f, // Top left - 1f, - 0f // Top right - ) + floatArrayOf( + 0f, + 1f, // Bottom left + 1f, + 1f, // Bottom right + 0f, + 0f, // Top left + 1f, + 0f // Top right + ) texCoordBuffer = texCoords.toBuffer() // Initialize Label texture @@ -122,7 +124,8 @@ class Label( val lookY = -camera.viewMatrix[6] val lookZ = -camera.viewMatrix[10] - // Create billboard rotation (this is the vector compared to the object that points up for the text + // Create billboard rotation (this is the vector compared to the object that points up for the + // text // Example we take a text Hello, we have: // ↑ Hello val upX = camera.viewMatrix[1] diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/util/opengl/Position.kt b/app/src/main/java/com/github/lookupgroup27/lookup/util/opengl/Position.kt index 032924123..5e206a728 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/util/opengl/Position.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/util/opengl/Position.kt @@ -1,7 +1,3 @@ package com.github.lookupgroup27.lookup.util.opengl -data class Position( - val x: Float, - val y: Float, - val z: Float -) +data class Position(val x: Float, val y: Float, val z: Float) From b7c58f144867a9b4c45962e94aedfffc794ca2fb Mon Sep 17 00:00:00 2001 From: Adrien Bousquie Date: Sun, 15 Dec 2024 19:34:00 +0100 Subject: [PATCH 12/16] refactor(star): remove label --- .../github/lookupgroup27/lookup/model/map/renderables/Star.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/Star.kt b/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/Star.kt index f4f876bd1..7d4479afd 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/Star.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/model/map/renderables/Star.kt @@ -26,8 +26,6 @@ class Star( ) : Object(vertexShaderCode, fragmentShaderCode) { private val circleRenderer = CircleRenderer(context, segments, 1.0f, color.copyOf(4)) - private val label = - Label(context, "Star", Position(position[0], position[1], position[2]), 0.1f, size) init { // Initialize shaders and buffers once, no textures needed @@ -36,7 +34,6 @@ class Star( } override fun draw(camera: Camera) { - label.draw(camera) // Model-View-Projection (MVP) Matrix val mvpMatrix = FloatArray(16) val modelMatrix = FloatArray(16) From a29560968df70188a60235ed3c413ee3a1144130 Mon Sep 17 00:00:00 2001 From: Adrien Bousquie Date: Wed, 18 Dec 2024 17:34:56 +0100 Subject: [PATCH 13/16] feat(ui): add padding constant to Label.kt and update vertex positions Introduced a `PADDING` constant in the `Label` class for better control of spacing. --- .../lookupgroup27/lookup/ui/map/renderables/Label.kt | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/ui/map/renderables/Label.kt b/app/src/main/java/com/github/lookupgroup27/lookup/ui/map/renderables/Label.kt index f25ee4797..8dc9c0140 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/ui/map/renderables/Label.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/ui/map/renderables/Label.kt @@ -27,6 +27,10 @@ class Label(context: Context, text: String, var pos: Position, size: Float, obje private val vertexBuffer: FloatBuffer private val texCoordBuffer: FloatBuffer + companion object { + private const val PADDING = 0.025f + } + init { // Initialize shader program val vertexShaderCode = readShader(context, "label_vertex_shader.glsl") @@ -39,16 +43,16 @@ class Label(context: Context, text: String, var pos: Position, size: Float, obje val vertices = floatArrayOf( -size, - -size - objectSize - size, + -size - objectSize - PADDING, 0f, // Bottom left size, - -size - objectSize - size, + -size - objectSize - PADDING, 0f, // Bottom right -size, - size - objectSize - size, + size - objectSize - PADDING, 0f, // Top left size, - size - objectSize - size, + size - objectSize - PADDING, 0f // Top right ) vertexBuffer = vertices.toBuffer() From b7bac3619df411dbb03ce11c55b1e9d5106e2df8 Mon Sep 17 00:00:00 2001 From: Adrien Bousquie Date: Thu, 19 Dec 2024 11:15:49 +0100 Subject: [PATCH 14/16] fix: update incorrect import --- .../github/lookupgroup27/lookup/model/map/MapRendererTest.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/test/java/com/github/lookupgroup27/lookup/model/map/MapRendererTest.kt b/app/src/test/java/com/github/lookupgroup27/lookup/model/map/MapRendererTest.kt index ee8959892..f811cf04d 100644 --- a/app/src/test/java/com/github/lookupgroup27/lookup/model/map/MapRendererTest.kt +++ b/app/src/test/java/com/github/lookupgroup27/lookup/model/map/MapRendererTest.kt @@ -1,7 +1,7 @@ package com.github.lookupgroup27.lookup.model.map -import PlanetsRepository import android.content.Context +import com.github.lookupgroup27.lookup.model.map.planets.PlanetsRepository import com.github.lookupgroup27.lookup.model.map.stars.StarDataRepository import org.junit.Assert.assertEquals import org.junit.Before From 6aafe7553b2b35abddaa52542bce77196b079dd4 Mon Sep 17 00:00:00 2001 From: Adrien Bousquie Date: Thu, 19 Dec 2024 11:29:51 +0100 Subject: [PATCH 15/16] refactor(label): remove outdated comment in Label.kt --- .../com/github/lookupgroup27/lookup/ui/map/renderables/Label.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/ui/map/renderables/Label.kt b/app/src/main/java/com/github/lookupgroup27/lookup/ui/map/renderables/Label.kt index 8dc9c0140..3a8854672 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/ui/map/renderables/Label.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/ui/map/renderables/Label.kt @@ -96,7 +96,7 @@ class Label(context: Context, text: String, var pos: Position, size: Float, obje fun draw(camera: Camera) { GLES20.glEnable(GLES20.GL_BLEND) GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA) - shaderProgram.use() // FIXME: Remove this one line method ? + shaderProgram.use() // Get attribute and uniform locations val modelMatrixHandle = GLES20.glGetUniformLocation(shaderProgram.programId, "uModelMatrix") From 00ca378c8ade35faf03eff250c0c084c82a49e0e Mon Sep 17 00:00:00 2001 From: Adrien Bousquie Date: Thu, 19 Dec 2024 11:50:24 +0100 Subject: [PATCH 16/16] fix: re-enable SkyBox drawing in MapRenderer - Uncommented the `skyBox.draw(camera)` line to render the SkyBox with the current texture. - Ensures SkyBox rendering works as intended after texture changes. --- .../com/github/lookupgroup27/lookup/model/map/MapRenderer.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/src/main/java/com/github/lookupgroup27/lookup/model/map/MapRenderer.kt b/app/src/main/java/com/github/lookupgroup27/lookup/model/map/MapRenderer.kt index 7f90d1da2..738c9bcc8 100644 --- a/app/src/main/java/com/github/lookupgroup27/lookup/model/map/MapRenderer.kt +++ b/app/src/main/java/com/github/lookupgroup27/lookup/model/map/MapRenderer.kt @@ -91,7 +91,7 @@ class MapRenderer( // Bind the texture and render the SkyBox GLES20.glDepthMask(false) textureManager.bindTexture(skyBoxTextureHandle) - // skyBox.draw(camera) commented out until the texture is changed to see stars + skyBox.draw(camera) GLES20.glDepthMask(true) val deltaTime = computeDeltaTime()