JeLLQ

Untitled

Dec 14th, 2016
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.88 KB | None | 0 0
  1. package com.jellekcompany.startrip.startrip;
  2.  
  3. import android.content.Context;
  4. import android.graphics.Bitmap;
  5. import android.graphics.BitmapFactory;
  6. import android.opengl.GLUtils;
  7.  
  8. import java.io.IOException;
  9. import java.io.InputStream;
  10. import java.nio.ByteBuffer;
  11. import java.nio.ByteOrder;
  12. import java.nio.FloatBuffer;
  13.  
  14. import javax.microedition.khronos.opengles.GL10;
  15.  
  16. /**
  17. * Created by JeLLQ_Bajceps on 2016-12-12.
  18. */
  19.  
  20. public class STBackground {
  21. /*
  22. Wszystkie obrazki tekstur musza być pochodną 256x256
  23. */
  24. //współżędne potrzebne do interakcji ze środowiskiem OpenGL - współrzędne wierzchołków oraz krawędzi pomiędzy wierzchołkami
  25. private int[] textures = new int[1];
  26.  
  27. //Bufory w których będą przechowywane zdefiniowane niżej tablice
  28. private FloatBuffer vertexBuffer;
  29. private FloatBuffer textureBuffer;
  30. private ByteBuffer indexBuffer;
  31.  
  32. private float vertices[] = {
  33. /*
  34. 3 2
  35.  
  36.  
  37. 0 1
  38. każda z linijek reprezętuje kolejne wierzchołki kwadratu w pozycji x, y, z, w tym wypadku pokryje on całe tło
  39. */
  40. 0.0f, 0.0f, 0.0f,
  41. 1.0f, 0,0f, 0.0f,
  42. 1.0f, 1.0f, 0,0f,
  43. 0.0f, 1.0f, 0,0f,
  44. };
  45.  
  46. private float texture[] = {
  47. //narożniki tekstury pokrywające się z narożnikami namalowanego kwadratu, wczytywany jest tylko jeden obrazek tła więc zczytuję wierzchołki na "sztywno"
  48. 0.0f, 0.0f,
  49. 1.0f, 0.0f,
  50. 1.0f, 1.0f,
  51. 0.0f, 1.0f,
  52. };
  53.  
  54. private byte indices[] = {
  55. /*
  56. 3 2
  57. ______
  58. | / |
  59. | / |
  60. |/_____|
  61. 0 1
  62.  
  63. Przechowuę tutaj numery ścian tworzące trójkąty z kwadratu odwrotnie do wskazuwek zegara
  64. */
  65. 0, 1, 2,
  66. 0, 2, 3,
  67. };
  68.  
  69. //konstruktor klasy
  70. public STBackground(){
  71. //odpowiednie bufory wypełniamy odpowiednimi teksturami
  72. //byteBuff jest mnożony razy 4 bo float przechowuje 4 bajty, indices tylko 1
  73. ByteBuffer byteBuf = ByteBuffer.allocateDirect(vertices.length*4);
  74. byteBuf.order(ByteOrder.nativeOrder());
  75. vertexBuffer = byteBuf.asFloatBuffer();
  76. vertexBuffer.put(vertices);
  77. vertexBuffer.position(0);
  78.  
  79. byteBuf = ByteBuffer.allocateDirect(texture.length*4);
  80. byteBuf.order(ByteOrder.nativeOrder());
  81. textureBuffer = byteBuf.asFloatBuffer();
  82. textureBuffer.put(texture);
  83. textureBuffer.position(0);
  84.  
  85. indexBuffer = ByteBuffer.allocateDirect(indices.length);
  86. indexBuffer.put(indices);
  87. indexBuffer.position(0);
  88. }
  89.  
  90. //Wczytywanie tekstur
  91. public void loadTexture(GL10 gl, int texture, Context context){
  92. //Na podstawie wskaźnika wczytywanie tekstury a potem zamykanie strumienai bitmapy
  93. InputStream imagestream = context.getResources().openRawResource(texture);
  94. Bitmap bitmap = null;
  95. try{
  96. bitmap = BitmapFactory.decodeStream(imagestream);
  97. }catch (Exception e){
  98. }finally {
  99. //zawsze zamykaj
  100. try {
  101. imagestream.close();
  102. imagestream = null;
  103. }catch (IOException e) {
  104. }
  105. }
  106.  
  107. //wskaźnik na teksturę, mający strukturę słownikową (liczba nazw tekstur do wygenerowania, tablica liczb całkowitych by przechowywać liczbę dla każdej tekstury, przesunięcie wskaźnika tablicy)
  108. gl.glGenTextures(1, textures, 0);
  109. //wiązanie tekstury ze środowiskiem OpenGL. Gdyby były wczytywane dwie tekstury należałobu tą metodę powturzyć dwa razy dla każdej z testur
  110. gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
  111. //sposób mapowania na wierzchołkach, szybki, ale wyostrzony
  112. gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
  113. gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
  114. //płynne powtarzanie obrazka w nieskończoność, tekstura będzie przemieszczana na wierzchołkach
  115. gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT);
  116. gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT);
  117. //skojarzenie bitmapowego strumienia wejściowego z pierwszą teksturą i poddanie go recyklingowi
  118. GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
  119. bitmap.recycle();
  120. }
  121.  
  122. //Nanoszenie tekstury na wierzchołki
  123. //będzie ona wykorzystywana za każdym razem gdy będzie wyświetlane tło, w przeciwieństwie do ładowania tekstury które nastąpi tylko raz
  124. public void draw(GL10 gl){
  125. //Wczytywanie tekstury, dzięki temu będzie gotowa do użycia (wiązanie tekstury z celem)
  126. gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
  127. //usuwanie niewidocznych powierzchni (Wszystkich, które nie znajdują się w zasięg wzroku)
  128. gl.glFrontFace(GL10.GL_CCW);
  129. gl.glEnable(GL10.GL_CULL_FACE);
  130. gl.glCullFace(GL10.GL_BACK);
  131. //odblokowanie stanu wierzchołków i tekstur i wczytanie ich buforu
  132. gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);
  133. gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
  134. gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer);
  135. gl.glTexCoordPointer(2, GL10.GL_FLOAT, 0, textureBuffer);
  136. //Nakładanie tekstury na wierzchołki i blokowanie wszystkich odblokowanych stanów
  137. gl.glDrawElements(GL10.GL_TRIANGLES, indices.length, GL10.GL_UNSIGNED_BYTE, indexBuffer);
  138. gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);
  139. gl.glDisableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
  140. gl.glDisable(GL10.GL_CULL_FACE);
  141.  
  142. }
  143. }
Advertisement
Add Comment
Please, Sign In to add comment