Advertisement
MateuszGrabarczyk

myrenderer

Dec 8th, 2022
255
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 5.11 KB | None | 0 0
  1. package com.example.lab5
  2.  
  3. import android.content.Context
  4. import android.hardware.Sensor
  5. import android.hardware.SensorEvent
  6. import android.hardware.SensorEventListener
  7. import android.hardware.SensorManager
  8. import android.opengl.GLSurfaceView
  9. import android.opengl.GLU
  10. import java.nio.ByteBuffer
  11. import java.nio.ByteOrder
  12. import java.nio.FloatBuffer
  13. import javax.microedition.khronos.egl.EGLConfig
  14. import javax.microedition.khronos.opengles.GL10
  15. import kotlin.math.cos
  16. import kotlin.math.sin
  17.  
  18.  
  19. /* Implementacja renderera - malarza na płótnie */
  20.  
  21. class MyRenderer : /*dziedziczenie*/GLSurfaceView.Renderer, SensorEventListener {
  22.     private var shift=0f; //kąt do obracania figury na płótnie
  23.     private var screenHeight = 0f;
  24.     private var screenWidth = 0f;
  25.     private var direction = false;
  26.     private var speed = 0.01f
  27.  
  28.     constructor(context: Context) {
  29.         val sensorService = context?.getSystemService(Context.SENSOR_SERVICE) as SensorManager
  30.         val sensorList = sensorService.getSensorList(Sensor.TYPE_ACCELEROMETER)
  31.         val thermometer = sensorList[0]
  32.         sensorService.registerListener(this, thermometer, SensorManager.SENSOR_DELAY_NORMAL)
  33.     }
  34.     //funkcja wywoływana przy tworzeniu płótna
  35.     override fun onSurfaceCreated(gl: GL10?, p1: EGLConfig?) {
  36.  
  37.     }
  38.  
  39.     //funkcja wywoływana przy zmianie i tworzeniu płótna
  40.     override fun onSurfaceChanged(gl: GL10?, width: Int, height: Int) {
  41.         /* OpenGL jest silnikiem z implementacją nieobiektową, dlatego jego funkcje dostępne są
  42.         w wraperach w obiekcie gl
  43.          */
  44.         //konfiguracja rzutni
  45.         screenWidth = width.toFloat()
  46.         screenHeight = height.toFloat()
  47.         gl?.glViewport(0, 0, width, height)
  48.         //załadowanie jednostkowej macierzy jako macierzy projekcji
  49.         gl?.glMatrixMode(GL10.GL_PROJECTION)
  50.         gl?.glLoadIdentity()
  51.         //konfiguracja perspektywy, korzystamy z GLU czyli narzędzi OpenGL
  52.         GLU.gluPerspective(gl, 45.0f, width.toFloat() / height.toFloat(), -1.0f, -10.0f)
  53.         //ustawienie domyslnego koloru w modelu barw RGBA
  54.         gl?.glClearColor(0.0f, 1.0f, 0.0f, 1.0f)
  55.     }
  56.     override fun onDrawFrame(gl: GL10?) {
  57.  
  58.         //wierchołki trójkąta w 3D
  59.         var vertices = floatArrayOf(
  60.             0.0f, 0.0f, 0.0f
  61.         )
  62.  
  63.         //currentYMove = 0f
  64.         val screenRatio: Float = (screenWidth/screenHeight)
  65.         var numberOfVertices: Int = 1
  66.         var angle: Float = 0.0f
  67.  
  68.         val radius: Float = 0.0001f * screenHeight
  69.         while (angle <= 2*Math.PI + 0.05f){
  70.  
  71.             //dodanie współrzędnej X
  72.             vertices += radius * sin(angle)
  73.  
  74.             //dodanie współrzędnej Y
  75.             vertices += radius * cos(angle) * screenRatio
  76.  
  77.             //dodanie współrzędnej Z
  78.             vertices += 0.0f
  79.  
  80.             numberOfVertices++
  81.  
  82.             angle += 0.15f
  83.         }
  84.  
  85.  
  86.         //wierchołki trzeba przekazać poza JVM więc trzeba zaalokować bufor
  87.         //numberOfVertices - wierzchołki, 3 - wymiary 4 - bajty na float
  88.  
  89.         val buffer: ByteBuffer = ByteBuffer.allocateDirect(numberOfVertices * 3 * 4)
  90.         //natywny dla sprzętu układ bajtów w słowie maszynowym
  91.         buffer.order(ByteOrder.nativeOrder())
  92.         //do tego bufora chcemy się odwoływać jak do bufora floatów
  93.         val verticesBuffer: FloatBuffer = buffer.asFloatBuffer()
  94.         //wrzucamy wierzchołki do bufora poza JVM
  95.         verticesBuffer.put(vertices)
  96.         //ustawiamy pozycję w buforze
  97.         verticesBuffer.position(0)
  98.         //konfiguracja bufora kolorów i bufora głębi
  99.         gl?.glClear(GL10.GL_COLOR_BUFFER_BIT or GL10.GL_DEPTH_BUFFER_BIT)
  100.         //ustawienie koloru malowania i wypełniania
  101.         gl?.glColor4f(0.0f, 0.0f, 1.0f, 1.0f)
  102.         //załadowanie macierzy jednostkowej do macierzy transformacji
  103.         gl?.glLoadIdentity()
  104.         //obrót figury tj. wymnożenie macierzy transformacji
  105.         //gl?.glRotatef(angle++ /*kąt obrotu*/, 0.0f, 0.0f, 1.0f /*oś obrotu*/)
  106.  
  107.         if(shift+radius/2f<=0.995f && shift-radius/2f >= -0.995f) {
  108.             shift -= speed
  109.         }
  110.         if(shift>=0.995f-radius/2f) {
  111.             shift = 0.995f - radius/2f
  112.         }
  113.         if(shift<=-0.995f+radius/2f) {
  114.             shift = -0.995f + radius/2f
  115.         }
  116.  
  117.         gl?.glTranslatef(0.0f, shift, 0.0f)
  118.         //przechodzimy do stanu przekazania wierzchołków silnikowi OpenGL
  119.         gl?.glEnableClientState(GL10.GL_VERTEX_ARRAY)
  120.         //przekazujemy do silnika informację o wierzchołkach
  121.         gl?.glVertexPointer(3, GL10.GL_FLOAT, 0, verticesBuffer)
  122.         //zlecamy namalowanie trójkąta
  123.         gl?.glDrawArrays(GL10.GL_TRIANGLE_FAN, 0 /*początek*/, numberOfVertices/*liczba wierz.*/)
  124.  
  125.         //opuszczamy ten stan
  126.         gl?.glDisableClientState(GL10.GL_VERTEX_ARRAY)
  127.     }
  128.  
  129.     override fun onSensorChanged(event: SensorEvent?) {
  130.         val value = event?.values?.get(1)
  131.  
  132.         if(value != null) {
  133.             this.speed = value * 0.0025f
  134.         }
  135.     }
  136.  
  137.     override fun onAccuracyChanged(sensor: Sensor?, accuracy: Int) {
  138.     }
  139. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement