Created
March 12, 2017 17:31
-
-
Save aristotaloss/cc318504530ddf416659400408b42c7b to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package renderx; | |
import org.lwjgl.*; | |
import org.lwjgl.glfw.*; | |
import org.lwjgl.opengl.*; | |
import org.lwjgl.system.*; | |
import java.io.IOException; | |
import java.nio.*; | |
import static org.lwjgl.glfw.Callbacks.*; | |
import static org.lwjgl.glfw.GLFW.*; | |
import static org.lwjgl.opengl.GL11.*; | |
import static org.lwjgl.opengl.GL15.*; | |
import static org.lwjgl.opengl.GL20.*; | |
import static org.lwjgl.opengl.GL30.*; | |
import static org.lwjgl.system.MemoryStack.*; | |
import static org.lwjgl.system.MemoryUtil.*; | |
/** | |
* Created by Bart on 3/12/2017. | |
*/ | |
public class RenderXTarget extends Thread { | |
private long window; | |
private RXShader mainShader; | |
public RenderXTarget() { | |
super("RenderX-GLTHREAD"); | |
} | |
public void run() { | |
System.out.println("Hello LWJGL " + Version.getVersion() + "!"); | |
init(); | |
loop(); | |
// Free the window callbacks and destroy the window | |
glfwFreeCallbacks(window); | |
glfwDestroyWindow(window); | |
// Terminate GLFW and free the error callback | |
glfwTerminate(); | |
glfwSetErrorCallback(null).free(); | |
} | |
private void initResources() throws IOException { | |
mainShader = RXShaderFactory.makeShader(getClass().getResource("/renderx/vertex_shader.vs"), getClass().getResource("/renderx/fragment_shader.fs")); | |
} | |
private void init() { | |
// Setup an error callback. The default implementation | |
// will print the error message in System.err. | |
GLFWErrorCallback.createPrint(System.err).set(); | |
// Initialize GLFW. Most GLFW functions will not work before doing this. | |
if ( !glfwInit() ) | |
throw new IllegalStateException("Unable to initialize GLFW"); | |
// Configure GLFW | |
glfwDefaultWindowHints(); // optional, the current window hints are already the default | |
glfwWindowHint(GLFW_VISIBLE, GL_FALSE); // the window will stay hidden after creation | |
glfwWindowHint(GLFW_RESIZABLE, GL_TRUE); // the window will be resizable | |
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3); | |
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 2); | |
glfwWindowHint(GLFW_OPENGL_PROFILE, GLFW_OPENGL_CORE_PROFILE); | |
glfwWindowHint(GLFW_OPENGL_FORWARD_COMPAT, GL_TRUE); | |
// Create the window | |
window = glfwCreateWindow(765, 503, "RenderX", NULL, NULL); | |
if ( window == NULL ) | |
throw new RuntimeException("Failed to create the GLFW window"); | |
glfwSetWindowPos(window, 0, 0); | |
// Setup a key callback. It will be called every time a key is pressed, repeated or released. | |
glfwSetKeyCallback(window, (window, key, scancode, action, mods) -> { | |
if ( key == GLFW_KEY_ESCAPE && action == GLFW_RELEASE ) | |
glfwSetWindowShouldClose(window, true); // We will detect this in the rendering loop | |
}); | |
// Get the thread stack and push a new frame | |
try ( MemoryStack stack = stackPush() ) { | |
IntBuffer pWidth = stack.mallocInt(1); // int* | |
IntBuffer pHeight = stack.mallocInt(1); // int* | |
// Get the window size passed to glfwCreateWindow | |
glfwGetWindowSize(window, pWidth, pHeight); | |
// Get the resolution of the primary monitor | |
GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor()); | |
int div = vidmode.width() >= 3840 ? 4 : 2; | |
// Center the window | |
glfwSetWindowPos( | |
window, | |
(vidmode.width() - pWidth.get(0)) / div, | |
(vidmode.height() - pHeight.get(0)) / div | |
); | |
} // the stack frame is popped automatically | |
// Make the OpenGL context current | |
glfwMakeContextCurrent(window); | |
// Enable v-sync | |
glfwSwapInterval(1); | |
// Make the window visible | |
glfwShowWindow(window); | |
} | |
private void loop() { | |
// This line is critical for LWJGL's interoperation with GLFW's | |
// OpenGL context, or any context that is managed externally. | |
// LWJGL detects the context that is current in the current thread, | |
// creates the GLCapabilities instance and makes the OpenGL | |
// bindings available for use. | |
GL.createCapabilities(); | |
// Set the clear color | |
clearColor(0xC8EDFA); | |
glViewport(0, 0, 765, 503); | |
try { | |
initResources(); | |
} catch (IOException e) { | |
e.printStackTrace(); | |
return; | |
} | |
float[] vertices = new float[]{ | |
0.0f, 0.5f, 0.0f, | |
-0.5f, -0.5f, 0.0f, | |
0.5f, -0.5f, 0.0f | |
}; | |
FloatBuffer verticesBuffer = MemoryUtil.memAllocFloat(vertices.length); | |
verticesBuffer.put(vertices).flip(); | |
// Create the VAO and bind to it | |
int vaoId = glGenVertexArrays(); | |
glBindVertexArray(vaoId); | |
// Create the VBO and bint to it | |
int vboId = glGenBuffers(); | |
glBindBuffer(GL_ARRAY_BUFFER, vboId); | |
glBufferData(GL_ARRAY_BUFFER, verticesBuffer, GL_STATIC_DRAW); | |
// Define structure of the data | |
glVertexAttribPointer(0, 3, GL_FLOAT, false, 0, 0); | |
// Unbind the VBO | |
glBindBuffer(GL_ARRAY_BUFFER, 0); | |
// Unbind the VAO | |
glBindVertexArray(0); | |
// Run the rendering loop until the user has attempted to close | |
// the window or has pressed the ESCAPE key. | |
System.out.println(mainShader); | |
while ( !glfwWindowShouldClose(window) ) { | |
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); // clear the framebuffer | |
glfwSwapBuffers(window); // swap the color buffers | |
// Poll for window events. The key callback above will only be | |
// invoked during this call. | |
glfwPollEvents(); | |
mainShader.bind(); | |
// Bind to the VAO | |
glBindVertexArray(vaoId); | |
glEnableVertexAttribArray(0); | |
// Draw the vertices | |
glDrawArrays(GL_TRIANGLES, 0, vertices.length/3); | |
// Restore state | |
glDisableVertexAttribArray(0); | |
glBindVertexArray(0); | |
mainShader.unbind(); | |
} | |
} | |
public static void clearColor(int color) { | |
glClearColor((float) ((color >> 16) & 0xFF) / 255f, (float) ((color >> 8) & 0xFF) / 255f, (float) (color & 0xFF) / 255f, 1f); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment