Advertisement
Guest User

EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0000000058d2

a guest
Jul 14th, 2017
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 9.50 KB | None | 0 0
  1. import org.joml.Matrix4f
  2. import org.joml.Vector3f
  3. import org.lwjgl.glfw.Callbacks.glfwFreeCallbacks
  4. import org.lwjgl.glfw.GLFW.*
  5. import org.lwjgl.glfw.GLFWErrorCallback
  6. import org.lwjgl.opengl.GL
  7. import org.lwjgl.opengl.GL11.*
  8. import org.lwjgl.opengl.GL15.*
  9. import org.lwjgl.opengl.GL20.*
  10. import org.lwjgl.opengl.GL30.*
  11. import org.lwjgl.opengl.GL31.glDrawElementsInstanced
  12. import org.lwjgl.opengl.GL33.glVertexAttribDivisor
  13. import org.lwjgl.system.MemoryStack.stackPush
  14. import org.lwjgl.system.MemoryUtil.NULL
  15. import java.io.BufferedReader
  16. import java.io.FileReader
  17.  
  18. const val SHADER_PATH = "src/main/kotlin/"
  19. const val PER_INSTANCE_SIZE = 3 * FLOAT_SIZE
  20. const val PER_VERTEX_SIZE = 3 * FLOAT_SIZE + 3 * FLOAT_SIZE
  21. const val WINDOW_WIDTH = 800
  22. const val WINDOW_HEIGHT = 600
  23. const val SIZE = 2
  24. // X Y Z R G B
  25. val cube_vertices = floatArrayOf(
  26.         -0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f,
  27.         0.5f, -0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
  28.         0.5f, 0.5f, -0.5f, 0.0f, 0.0f, 1.0f,
  29.         0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f,
  30.         -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
  31.         -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, 1.0f,
  32.  
  33.         -0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
  34.         0.5f, -0.5f, 0.5f, 0.0f, 1.0f, 0.0f,
  35.         0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
  36.         0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
  37.         -0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f,
  38.         -0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
  39.  
  40.         -0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
  41.         -0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
  42.         -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, 1.0f,
  43.         -0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f,
  44.         -0.5f, -0.5f, 0.5f, 0.0f, 1.0f, 0.0f,
  45.         -0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
  46.  
  47.         0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
  48.         0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
  49.         0.5f, -0.5f, -0.5f, 0.0f, 0.0f, 1.0f,
  50.         0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f,
  51.         0.5f, -0.5f, 0.5f, 0.0f, 1.0f, 0.0f,
  52.         0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
  53.  
  54.         -0.5f, -0.5f, -0.5f, 1.0f, 0.0f, 0.0f,
  55.         0.5f, -0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
  56.         0.5f, -0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
  57.         0.5f, -0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
  58.         -0.5f, -0.5f, 0.5f, 0.0f, 1.0f, 0.0f,
  59.         -0.5f, -0.5f, -0.5f, 0.0f, 0.0f, 1.0f,
  60.  
  61.         -0.5f, 0.5f, -0.5f, 1.0f, 0.0f, 0.0f,
  62.         0.5f, 0.5f, -0.5f, 0.0f, 1.0f, 0.0f,
  63.         0.5f, 0.5f, 0.5f, 0.0f, 0.0f, 1.0f,
  64.         0.5f, 0.5f, 0.5f, 1.0f, 0.0f, 0.0f,
  65.         -0.5f, 0.5f, 0.5f, 0.0f, 1.0f, 0.0f,
  66.         -0.5f, 0.5f, -0.5f, 0.0f, 0.0f, 1.0f
  67. )
  68.  
  69. class Game {
  70.     var window = NULL
  71.  
  72.     fun run() {
  73.         initWindow()
  74.         loop()
  75.  
  76.         glfwFreeCallbacks(window)
  77.         glfwDestroyWindow(window)
  78.  
  79.         glfwTerminate()
  80.         glfwSetErrorCallback(null).free()
  81.     }
  82.  
  83.     private fun initWindow() {
  84.         GLFWErrorCallback.createPrint(System.err).set()
  85.         if (!glfwInit()) throw IllegalStateException("Unable to initialize GLFW")
  86.  
  87.         glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE)
  88.         glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE)
  89.  
  90.         window = glfwCreateWindow(WINDOW_WIDTH, WINDOW_HEIGHT, "GraphicTest", NULL, NULL)
  91.         if (window == NULL) throw RuntimeException("Failed to create GLFW window")
  92.  
  93.         glfwSetKeyCallback(window) { window, key, _, action, _ ->
  94.             if (key == GLFW_KEY_ESCAPE && action == GLFW_RELEASE)
  95.                 glfwSetWindowShouldClose(window, true) // We will detect this in the rendering loop
  96.         }
  97.  
  98.         stackPush().use { stack ->
  99.             val pWidth = stack.mallocInt(1)
  100.             val pHeight = stack.mallocInt(1)
  101.  
  102.             // Get the window SIZE passed to glfwCreateWindow
  103.             glfwGetWindowSize(window, pWidth, pHeight)
  104.  
  105.             // Get the resolution of the primary monitor
  106.             val vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor())
  107.  
  108.             // Center the window
  109.             glfwSetWindowPos(
  110.                     window,
  111.                     (vidmode.width() - pWidth.get(0)) / 2,
  112.                     (vidmode.height() - pHeight.get(0)) / 2
  113.             )
  114.         }
  115.  
  116.         glfwMakeContextCurrent(window)
  117.         glfwSwapInterval(1)// Enable vSync
  118.         glfwShowWindow(window)
  119.     }
  120.  
  121.     private fun loop() {
  122.         GL.createCapabilities()
  123.         glEnable(GL_DEPTH_TEST)
  124.         val vao = glGenVertexArrays()
  125.         glBindVertexArray(vao)
  126.  
  127.         val perVertexVBO = glGenBuffers()
  128.         glBindBuffer(GL_ARRAY_BUFFER, perVertexVBO)
  129.         stackPush().use { stack ->
  130.             val buffer = stack.mallocFloat(cube_vertices.size)
  131.             buffer.put(cube_vertices)
  132.             buffer.flip()
  133.  
  134.             glBufferData(GL_ARRAY_BUFFER, buffer, GL_DYNAMIC_DRAW)
  135.         }
  136.  
  137.         //OPEN SHADER PROGRAM
  138.         val vertexShader = loadAndCompileShader(GL_VERTEX_SHADER, SHADER_PATH + "vertex_shader.vert")
  139.         val fragShader = loadAndCompileShader(GL_FRAGMENT_SHADER, SHADER_PATH + "fragment_shader.frag")
  140.         val shaderProgram = glCreateProgram()
  141.         glAttachShader(shaderProgram, vertexShader)
  142.         glAttachShader(shaderProgram, fragShader)
  143.         glBindFragDataLocation(shaderProgram, 0, "outColor")
  144.         glLinkProgram(shaderProgram)
  145.         glUseProgram(shaderProgram)
  146.  
  147.         var offset: Long = 0
  148.         val inVertexAttrib = glGetAttribLocation(shaderProgram, "in_vertex")
  149.         glEnableVertexAttribArray(inVertexAttrib)
  150.         glVertexAttribPointer(inVertexAttrib, 3, GL_FLOAT, false, PER_VERTEX_SIZE, offset)
  151.         offset += 3 * FLOAT_SIZE
  152.         val inNormalAttrib = glGetAttribLocation(shaderProgram, "color")
  153.         glEnableVertexAttribArray(inNormalAttrib)
  154.         glVertexAttribPointer(inNormalAttrib, 3, GL_FLOAT, false, PER_VERTEX_SIZE, offset)
  155.         offset += 3 * FLOAT_SIZE
  156.  
  157.         val perInstanceVBO = glGenBuffers()
  158.         glBindBuffer(GL_ARRAY_BUFFER, perInstanceVBO)
  159.  
  160.         val locAttrib = glGetAttribLocation(shaderProgram, "pos")
  161.         glEnableVertexAttribArray(locAttrib)
  162.         glVertexAttribPointer(locAttrib, 3, GL_FLOAT, false, PER_INSTANCE_SIZE, 0)
  163.         glVertexAttribDivisor(locAttrib, 1)
  164.  
  165.         val uniView = glGetUniformLocation(shaderProgram, "view")
  166.         val uniProj = glGetUniformLocation(shaderProgram, "proj")
  167.         val uniTrans = glGetUniformLocation(shaderProgram, "model")
  168.  
  169.         val view = Matrix4f().lookAt(
  170.                 Vector3f(1.5F, 4.5F, 1.5F),
  171.                 Vector3f(0.0F, 0.0F, 0.0F),
  172.                 Vector3f(0.0F, 0.0F, 1.0F)
  173.         )
  174.         stackPush().use { stack ->
  175.             val buffer = stack.mallocFloat(4 * 4)
  176.             view.get(buffer)
  177.             glUniformMatrix4fv(uniView, false, buffer)
  178.         }
  179.  
  180.         val proj = Matrix4f().perspective(Math.toRadians(45.0).toFloat(), WINDOW_WIDTH.toFloat() / WINDOW_HEIGHT.toFloat(), 1.0F, 10.0F)
  181.         stackPush().use { stack ->
  182.             val buffer = stack.mallocFloat(4 * 4)
  183.             proj.get(buffer)
  184.             glUniformMatrix4fv(uniProj, false, buffer)
  185.         }
  186.  
  187.         while (!glfwWindowShouldClose(window)) {
  188.             glClearColor(0.0f, 0.0f, 0.0f, 1.0f)
  189.             glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT)
  190.  
  191.             val model = Matrix4f().rotate((glfwGetTime() * Math.toRadians(180.0)).toFloat(), Vector3f(0.0F, 0.0F, 1.0F))
  192.             stackPush().use { stack ->
  193.                 val buffer = stack.mallocFloat(4 * 4)
  194.                 model.get(buffer)
  195.                 glUniformMatrix4fv(uniTrans, false, buffer)
  196.             }
  197.  
  198.             glBindBuffer(GL_ARRAY_BUFFER, perInstanceVBO)
  199.             stackPush().use { stack ->
  200.                 val buffer = stack.mallocFloat(SIZE * SIZE * 3)
  201.                 for (c in 0 until SIZE) {
  202.                     for (d in 0 until SIZE) {
  203.                         buffer.put((c * 3 - SIZE).toFloat())
  204.                         buffer.put((-2 + 0.5 * Math.sin(Math.toRadians((c + d + 1) * glfwGetTime()))).toFloat())
  205.                         buffer.put(-d * 3.0F)
  206.                     }
  207.                 }
  208.                 buffer.flip()
  209.  
  210.                 glBufferData(GL_ARRAY_BUFFER, buffer, GL_DYNAMIC_DRAW)
  211.             }
  212.  
  213.             glDrawElementsInstanced(GL_TRIANGLES, 36, GL_UNSIGNED_INT, 0, SIZE * SIZE)
  214.             //glDrawArrays(GL_TRIANGLES, 0, 36)
  215.  
  216.             glfwSwapBuffers(window)
  217.             glfwPollEvents()
  218.         }
  219.  
  220.         glDeleteProgram(shaderProgram)
  221.         glDeleteShader(fragShader)
  222.         glDeleteShader(vertexShader)
  223.         glDeleteBuffers(intArrayOf(perInstanceVBO, perVertexVBO))
  224.         glDeleteVertexArrays(vao)
  225.     }
  226.  
  227.     private fun loadAndCompileShader(shaderType: Int, fileName: String): Int {
  228.         val shader = glCreateShader(shaderType)
  229.         glShaderSource(shader, loadFile(fileName))
  230.         glCompileShader(shader)
  231.         val status = glGetShaderi(shader, GL_COMPILE_STATUS)
  232.         if (status != GL_TRUE) {
  233.             throw RuntimeException(glGetShaderInfoLog(shader))
  234.         }
  235.         return shader
  236.     }
  237.  
  238.     /**
  239.      * Load a text file and return its content as a String.
  240.      */
  241.     private fun loadFile(fileName: String): String {
  242.         val vertexCode = StringBuilder()
  243.         try {
  244.             val reader = BufferedReader(FileReader(fileName))
  245.             var line = reader.readLine()
  246.             while (line != null) {
  247.                 vertexCode.append(line)
  248.                 vertexCode.append('\n')
  249.                 line = reader.readLine()
  250.             }
  251.         } catch (e: Exception) {
  252.             throw IllegalArgumentException("unable to load shader from file [$fileName]", e)
  253.         }
  254.  
  255.         return vertexCode.toString()
  256.     }
  257. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement