Advertisement
Guest User

EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x0000000058d2

a guest
Jul 14th, 2017
181
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Kotlin 9.74 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, 1.0f, 1.0f,
  27.         0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 1.0f,
  28.         0.5f,  0.5f, -0.5f, 1.0f, 1.0f, 1.0f,
  29.         0.5f,  0.5f, -0.5f, 1.0f, 1.0f, 1.0f,
  30.         -0.5f,  0.5f, -0.5f, 1.0f, 1.0f, 1.0f,
  31.         -0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 1.0f,
  32.  
  33.         -0.5f, -0.5f,  0.5f, 1.0f, 1.0f, 1.0f,
  34.         0.5f, -0.5f,  0.5f, 1.0f, 1.0f, 1.0f,
  35.         0.5f,  0.5f,  0.5f, 1.0f, 1.0f, 1.0f,
  36.         0.5f,  0.5f,  0.5f, 1.0f, 1.0f, 1.0f,
  37.         -0.5f,  0.5f,  0.5f, 1.0f, 1.0f, 1.0f,
  38.         -0.5f, -0.5f,  0.5f, 1.0f, 1.0f, 1.0f,
  39.  
  40.         -0.5f,  0.5f,  0.5f, 1.0f, 1.0f, 1.0f,
  41.         -0.5f,  0.5f, -0.5f, 1.0f, 1.0f, 1.0f,
  42.         -0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 1.0f,
  43.         -0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 1.0f,
  44.         -0.5f, -0.5f,  0.5f, 1.0f, 1.0f, 1.0f,
  45.         -0.5f,  0.5f,  0.5f, 1.0f, 1.0f, 1.0f,
  46.  
  47.         0.5f,  0.5f,  0.5f, 1.0f, 1.0f, 1.0f,
  48.         0.5f,  0.5f, -0.5f, 1.0f, 1.0f, 1.0f,
  49.         0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 1.0f,
  50.         0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 1.0f,
  51.         0.5f, -0.5f,  0.5f, 1.0f, 1.0f, 1.0f,
  52.         0.5f,  0.5f,  0.5f, 1.0f, 1.0f, 1.0f,
  53.  
  54.         -0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 1.0f,
  55.         0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 1.0f,
  56.         0.5f, -0.5f,  0.5f, 1.0f, 1.0f, 1.0f,
  57.         0.5f, -0.5f,  0.5f, 1.0f, 1.0f, 1.0f,
  58.         -0.5f, -0.5f,  0.5f, 1.0f, 1.0f, 1.0f,
  59.         -0.5f, -0.5f, -0.5f, 1.0f, 1.0f, 1.0f,
  60.  
  61.         -0.5f,  0.5f, -0.5f, 1.0f, 1.0f, 1.0f,
  62.         0.5f,  0.5f, -0.5f, 1.0f, 1.0f, 1.0f,
  63.         0.5f,  0.5f,  0.5f, 1.0f, 1.0f, 1.0f,
  64.         0.5f,  0.5f,  0.5f, 1.0f, 1.0f, 1.0f,
  65.         -0.5f,  0.5f,  0.5f, 1.0f, 1.0f, 1.0f,
  66.         -0.5f,  0.5f, -0.5f, 1.0f, 1.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.  
  125.         //OPEN SHADER PROGRAM
  126.         val vertexShader = loadAndCompileShader(GL_VERTEX_SHADER, SHADER_PATH + "vertex_shader.vert")
  127.         val fragShader = loadAndCompileShader(GL_FRAGMENT_SHADER, SHADER_PATH + "fragment_shader.frag")
  128.         val shaderProgram = glCreateProgram()
  129.         glAttachShader(shaderProgram, vertexShader)
  130.         glAttachShader(shaderProgram, fragShader)
  131.         glBindFragDataLocation(shaderProgram, 0, "outColor")
  132.         glLinkProgram(shaderProgram)
  133.         glUseProgram(shaderProgram)
  134.  
  135.         val vao = glGenVertexArrays()
  136.         glBindVertexArray(vao)
  137.  
  138.         //ATTRIBUTES
  139.         val perVertexVBO = glGenBuffers()
  140.         glBindBuffer(GL_ARRAY_BUFFER, perVertexVBO)
  141.  
  142.         val inVertexAttrib = glGetAttribLocation(shaderProgram, "in_vertex")
  143.         glEnableVertexAttribArray(inVertexAttrib)
  144.         var offset: Long = 0
  145.         glVertexAttribPointer(inVertexAttrib, 3, GL_FLOAT, false, PER_VERTEX_SIZE, offset)
  146.         offset += 3 * FLOAT_SIZE
  147.         val inNormalAttrib = glGetAttribLocation(shaderProgram, "color")
  148.         glEnableVertexAttribArray(inNormalAttrib)
  149.         glVertexAttribPointer(inNormalAttrib, 3, GL_FLOAT, false, PER_VERTEX_SIZE, offset)
  150.         offset += 3 * FLOAT_SIZE
  151.  
  152.         val perInstanceVBO = glGenBuffers()
  153.         glBindBuffer(GL_ARRAY_BUFFER, perInstanceVBO)
  154.  
  155.         val locAttrib = glGetAttribLocation(shaderProgram, "pos")
  156.         glEnableVertexAttribArray(locAttrib)
  157.         glVertexAttribPointer(locAttrib, 3, GL_FLOAT, false, PER_INSTANCE_SIZE, 0)
  158.         glVertexAttribDivisor(locAttrib, 1)
  159.  
  160.         val view = Matrix4f().lookAt(
  161.                 Vector3f(1.2F, 4.2F, 1.0F),
  162.                 Vector3f(0.0F, 0.0F, 0.0F),
  163.                 Vector3f(0.0F, 0.0F, 1.0F)
  164.         )
  165.         stackPush().use { stack ->
  166.             val buffer = stack.mallocFloat(4 * 4)
  167.             view.get(buffer)
  168.             val uniView = glGetUniformLocation(shaderProgram, "view")
  169.             glUniformMatrix4fv(uniView, false, buffer)
  170.         }
  171.  
  172.         val proj = Matrix4f().perspective(Math.toRadians(45.0).toFloat(), WINDOW_WIDTH.toFloat() / WINDOW_HEIGHT.toFloat(), 1.0F, 10.0F)
  173.         stackPush().use { stack ->
  174.             val buffer = stack.mallocFloat(4 * 4)
  175.             proj.get(buffer)
  176.             val uniProj = glGetUniformLocation(shaderProgram, "proj")
  177.             glUniformMatrix4fv(uniProj, false, buffer)
  178.         }
  179.  
  180.         glBindBuffer(GL_ARRAY_BUFFER, perVertexVBO)
  181.         stackPush().use { stack ->
  182.             val buffer = stack.mallocFloat(cube_vertices.size)
  183.             buffer.put(cube_vertices)
  184.             buffer.flip()
  185.  
  186.             glBufferData(GL_ARRAY_BUFFER, buffer, GL_DYNAMIC_DRAW)
  187.         }
  188.  
  189.         while (!glfwWindowShouldClose(window)) {
  190.             glClearColor(1.0f, 1.0f, 1.0f, 1.0f)
  191.             glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT)
  192.  
  193.             glBindVertexArray(vao)
  194.  
  195.             val positions = FloatArray(SIZE * SIZE * 3, { _ -> 0.0F })
  196.             for (c in 0..SIZE) {
  197.                 for (d in 0..SIZE) {
  198.                     positions[c * SIZE + d + 0] = ((c * 3 - SIZE).toFloat())
  199.                     positions[c * SIZE + d + 1] = (-2 + 0.5 * Math.sin(Math.toRadians((c + d + 1) * glfwGetTime()))).toFloat()
  200.                     positions[c * SIZE + d + 2] = -d * 3.0F
  201.                 }
  202.             }
  203.  
  204.             glBindBuffer(GL_ARRAY_BUFFER, perInstanceVBO)
  205.             stackPush().use { stack ->
  206.                 val buffer = stack.mallocFloat(positions.size)
  207.                 buffer.put(positions)
  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.  
  215.             val trans = Matrix4f().rotate((glfwGetTime() * Math.toRadians(180.0)).toFloat(), Vector3f(0.0F, 0.0F, 1.0F))
  216.             stackPush().use { stack ->
  217.                 val buffer = stack.mallocFloat(4 * 4)
  218.                 trans.get(buffer)
  219.                 val uniTrans = glGetUniformLocation(shaderProgram, "model")
  220.                 glUniformMatrix4fv(uniTrans, false, buffer)
  221.             }
  222.  
  223.             glfwSwapBuffers(window)
  224.             glfwPollEvents()
  225.         }
  226.  
  227.         glDeleteProgram(shaderProgram)
  228.         glDeleteShader(fragShader)
  229.         glDeleteShader(vertexShader)
  230.         glDeleteBuffers(intArrayOf(perInstanceVBO, perVertexVBO))
  231.         glDeleteVertexArrays(vao)
  232.     }
  233.  
  234.     private fun loadAndCompileShader(shaderType: Int, fileName: String): Int {
  235.         val shader = glCreateShader(shaderType)
  236.         glShaderSource(shader, loadFile(fileName))
  237.         glCompileShader(shader)
  238.         val status = glGetShaderi(shader, GL_COMPILE_STATUS)
  239.         if (status != GL_TRUE) {
  240.             throw RuntimeException(glGetShaderInfoLog(shader))
  241.         }
  242.         return shader
  243.     }
  244.  
  245.     /**
  246.      * Load a text file and return its content as a String.
  247.      */
  248.     private fun loadFile(fileName: String): String {
  249.         val vertexCode = StringBuilder()
  250.         try {
  251.             val reader = BufferedReader(FileReader(fileName))
  252.             var line = reader.readLine()
  253.             while (line != null) {
  254.                 vertexCode.append(line)
  255.                 vertexCode.append('\n')
  256.                 line = reader.readLine()
  257.             }
  258.         } catch (e: Exception) {
  259.             throw IllegalArgumentException("unable to load shader from file [$fileName]", e)
  260.         }
  261.  
  262.         return vertexCode.toString()
  263.     }
  264. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement