use of org.lwjgl.glfw.GLFWFramebufferSizeCallback in project lwjgl3-demos by LWJGL.
the class InstancedSpheresDemo method main.
public static void main(String[] args) throws IOException {
if (!glfwInit()) {
throw new RuntimeException("Failed to initialize GLFW");
}
if (!glfwVulkanSupported()) {
throw new AssertionError("GLFW failed to find the Vulkan loader");
}
/* Look for instance extensions */
PointerBuffer requiredExtensions = glfwGetRequiredInstanceExtensions();
if (requiredExtensions == null) {
throw new AssertionError("Failed to find list of required Vulkan extensions");
}
// Create the Vulkan instance
final VkInstance instance = createInstance(requiredExtensions);
final VkDebugReportCallbackEXT debugCallback = new VkDebugReportCallbackEXT() {
public int invoke(int flags, int objectType, long object, long location, int messageCode, long pLayerPrefix, long pMessage, long pUserData) {
System.err.println("ERROR OCCURED: " + VkDebugReportCallbackEXT.getString(pMessage));
return 0;
}
};
final long debugCallbackHandle = setupDebugging(instance, VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT, debugCallback);
final VkPhysicalDevice physicalDevice = getFirstPhysicalDevice(instance);
final DeviceAndGraphicsQueueFamily deviceAndGraphicsQueueFamily = createDeviceAndGetGraphicsQueueFamily(physicalDevice);
final VkDevice device = deviceAndGraphicsQueueFamily.device;
int queueFamilyIndex = deviceAndGraphicsQueueFamily.queueFamilyIndex;
final VkPhysicalDeviceMemoryProperties memoryProperties = deviceAndGraphicsQueueFamily.memoryProperties;
// Create GLFW window
glfwDefaultWindowHints();
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);
long window = glfwCreateWindow(800, 600, "GLFW Vulkan Demo", NULL, NULL);
GLFWKeyCallback keyCallback;
glfwSetKeyCallback(window, keyCallback = new GLFWKeyCallback() {
public void invoke(long window, int key, int scancode, int action, int mods) {
if (action != GLFW_RELEASE)
return;
if (key == GLFW_KEY_ESCAPE)
glfwSetWindowShouldClose(window, true);
}
});
LongBuffer pSurface = memAllocLong(1);
int err = glfwCreateWindowSurface(instance, window, null, pSurface);
final long surface = pSurface.get(0);
if (err != VK_SUCCESS) {
throw new AssertionError("Failed to create surface: " + translateVulkanResult(err));
}
// Create static Vulkan resources
final ColorAndDepthFormatAndSpace colorAndDepthFormatAndSpace = getColorFormatAndSpace(physicalDevice, surface);
final long commandPool = createCommandPool(device, queueFamilyIndex);
final VkCommandBuffer setupCommandBuffer = createCommandBuffer(device, commandPool);
final VkCommandBuffer postPresentCommandBuffer = createCommandBuffer(device, commandPool);
final VkQueue queue = createDeviceQueue(device, queueFamilyIndex);
final long renderPass = createRenderPass(device, colorAndDepthFormatAndSpace.colorFormat, colorAndDepthFormatAndSpace.depthFormat);
final long renderCommandPool = createCommandPool(device, queueFamilyIndex);
final Vertices vertices = createVertices(memoryProperties, device);
UboDescriptor uboDescriptor = createUniformBuffer(memoryProperties, device);
final long descriptorPool = createDescriptorPool(device);
final long descriptorSetLayout = createDescriptorSetLayout(device);
final long descriptorSet = createDescriptorSet(device, descriptorPool, descriptorSetLayout, uboDescriptor);
final Pipeline pipeline = createPipeline(device, renderPass, vertices.createInfo, descriptorSetLayout);
final class SwapchainRecreator {
boolean mustRecreate = true;
void recreate() {
// Begin the setup command buffer (the one we will use for swapchain/framebuffer creation)
VkCommandBufferBeginInfo cmdBufInfo = VkCommandBufferBeginInfo.calloc().sType(VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO).pNext(NULL);
int err = vkBeginCommandBuffer(setupCommandBuffer, cmdBufInfo);
cmdBufInfo.free();
if (err != VK_SUCCESS) {
throw new AssertionError("Failed to begin setup command buffer: " + translateVulkanResult(err));
}
long oldChain = swapchain != null ? swapchain.swapchainHandle : VK_NULL_HANDLE;
// Create the swapchain (this will also add a memory barrier to initialize the framebuffer images)
swapchain = createSwapChain(device, physicalDevice, surface, oldChain, setupCommandBuffer, width, height, colorAndDepthFormatAndSpace.colorFormat, colorAndDepthFormatAndSpace.colorSpace);
// Create depth-stencil image
depthStencil = createDepthStencil(device, memoryProperties, colorAndDepthFormatAndSpace.depthFormat, setupCommandBuffer);
err = vkEndCommandBuffer(setupCommandBuffer);
if (err != VK_SUCCESS) {
throw new AssertionError("Failed to end setup command buffer: " + translateVulkanResult(err));
}
submitCommandBuffer(queue, setupCommandBuffer);
vkQueueWaitIdle(queue);
if (framebuffers != null) {
for (int i = 0; i < framebuffers.length; i++) vkDestroyFramebuffer(device, framebuffers[i], null);
}
framebuffers = createFramebuffers(device, swapchain, renderPass, width, height, depthStencil);
// Create render command buffers
if (renderCommandBuffers != null) {
vkResetCommandPool(device, renderCommandPool, VK_FLAGS_NONE);
}
renderCommandBuffers = createRenderCommandBuffers(device, renderCommandPool, framebuffers, renderPass, width, height, pipeline, descriptorSet, vertices.verticesBuf);
mustRecreate = false;
}
}
final SwapchainRecreator swapchainRecreator = new SwapchainRecreator();
// Handle canvas resize
GLFWFramebufferSizeCallback framebufferSizeCallback = new GLFWFramebufferSizeCallback() {
public void invoke(long window, int width, int height) {
if (width <= 0 || height <= 0)
return;
swapchainRecreator.mustRecreate = true;
InstancedSpheresDemo.width = width;
InstancedSpheresDemo.height = height;
}
};
glfwSetFramebufferSizeCallback(window, framebufferSizeCallback);
glfwShowWindow(window);
// Pre-allocate everything needed in the render loop
IntBuffer pImageIndex = memAllocInt(1);
int currentBuffer = 0;
PointerBuffer pCommandBuffers = memAllocPointer(1);
LongBuffer pSwapchains = memAllocLong(1);
LongBuffer pImageAcquiredSemaphore = memAllocLong(1);
LongBuffer pRenderCompleteSemaphore = memAllocLong(1);
// Info struct to create a semaphore
VkSemaphoreCreateInfo semaphoreCreateInfo = VkSemaphoreCreateInfo.calloc().sType(VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO).pNext(NULL).flags(VK_FLAGS_NONE);
// Info struct to submit a command buffer which will wait on the semaphore
IntBuffer pWaitDstStageMask = memAllocInt(1);
pWaitDstStageMask.put(0, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT);
VkSubmitInfo submitInfo = VkSubmitInfo.calloc().sType(VK_STRUCTURE_TYPE_SUBMIT_INFO).pNext(NULL).waitSemaphoreCount(pImageAcquiredSemaphore.remaining()).pWaitSemaphores(pImageAcquiredSemaphore).pWaitDstStageMask(pWaitDstStageMask).pCommandBuffers(pCommandBuffers).pSignalSemaphores(pRenderCompleteSemaphore);
// Info struct to present the current swapchain image to the display
VkPresentInfoKHR presentInfo = VkPresentInfoKHR.calloc().sType(VK_STRUCTURE_TYPE_PRESENT_INFO_KHR).pNext(NULL).pWaitSemaphores(pRenderCompleteSemaphore).swapchainCount(pSwapchains.remaining()).pSwapchains(pSwapchains).pImageIndices(pImageIndex).pResults(null);
// The render loop
long lastTime = System.nanoTime();
float time = 0.0f;
while (!glfwWindowShouldClose(window)) {
// Handle window messages. Resize events happen exactly here.
// So it is safe to use the new swapchain images and framebuffers afterwards.
glfwPollEvents();
if (swapchainRecreator.mustRecreate)
swapchainRecreator.recreate();
// Create a semaphore to wait for the swapchain to acquire the next image
err = vkCreateSemaphore(device, semaphoreCreateInfo, null, pImageAcquiredSemaphore);
if (err != VK_SUCCESS) {
throw new AssertionError("Failed to create image acquired semaphore: " + translateVulkanResult(err));
}
// Create a semaphore to wait for the render to complete, before presenting
err = vkCreateSemaphore(device, semaphoreCreateInfo, null, pRenderCompleteSemaphore);
if (err != VK_SUCCESS) {
throw new AssertionError("Failed to create render complete semaphore: " + translateVulkanResult(err));
}
// Get next image from the swap chain (back/front buffer).
// This will setup the imageAquiredSemaphore to be signalled when the operation is complete
err = vkAcquireNextImageKHR(device, swapchain.swapchainHandle, UINT64_MAX, pImageAcquiredSemaphore.get(0), VK_NULL_HANDLE, pImageIndex);
currentBuffer = pImageIndex.get(0);
if (err != VK_SUCCESS) {
throw new AssertionError("Failed to acquire next swapchain image: " + translateVulkanResult(err));
}
// Select the command buffer for the current framebuffer image/attachment
pCommandBuffers.put(0, renderCommandBuffers[currentBuffer]);
// Update UBO
long thisTime = System.nanoTime();
time += (thisTime - lastTime) / 1E9f;
lastTime = thisTime;
updateUbo(device, uboDescriptor, time);
// Submit to the graphics queue
err = vkQueueSubmit(queue, submitInfo, VK_NULL_HANDLE);
if (err != VK_SUCCESS) {
throw new AssertionError("Failed to submit render queue: " + translateVulkanResult(err));
}
// Present the current buffer to the swap chain
// This will display the image
pSwapchains.put(0, swapchain.swapchainHandle);
err = vkQueuePresentKHR(queue, presentInfo);
if (err != VK_SUCCESS) {
throw new AssertionError("Failed to present the swapchain image: " + translateVulkanResult(err));
}
// Create and submit post present barrier
vkQueueWaitIdle(queue);
// Destroy this semaphore (we will create a new one in the next frame)
vkDestroySemaphore(device, pImageAcquiredSemaphore.get(0), null);
vkDestroySemaphore(device, pRenderCompleteSemaphore.get(0), null);
submitPostPresentBarrier(swapchain.images[currentBuffer], postPresentCommandBuffer, queue);
}
presentInfo.free();
memFree(pWaitDstStageMask);
submitInfo.free();
memFree(pImageAcquiredSemaphore);
memFree(pRenderCompleteSemaphore);
semaphoreCreateInfo.free();
memFree(pSwapchains);
memFree(pCommandBuffers);
vkDestroyDebugReportCallbackEXT(instance, debugCallbackHandle, null);
framebufferSizeCallback.free();
keyCallback.free();
glfwDestroyWindow(window);
glfwTerminate();
// We don't bother disposing of all Vulkan resources.
// Let the OS process manager take care of it.
}
use of org.lwjgl.glfw.GLFWFramebufferSizeCallback in project lwjgl3-demos by LWJGL.
the class TwoRotatingTrianglesInvDepthDemo method main.
public static void main(String[] args) throws IOException {
if (!glfwInit()) {
throw new RuntimeException("Failed to initialize GLFW");
}
if (!glfwVulkanSupported()) {
throw new AssertionError("GLFW failed to find the Vulkan loader");
}
/* Look for instance extensions */
PointerBuffer requiredExtensions = glfwGetRequiredInstanceExtensions();
if (requiredExtensions == null) {
throw new AssertionError("Failed to find list of required Vulkan extensions");
}
// Create the Vulkan instance
final VkInstance instance = createInstance(requiredExtensions);
final VkDebugReportCallbackEXT debugCallback = new VkDebugReportCallbackEXT() {
public int invoke(int flags, int objectType, long object, long location, int messageCode, long pLayerPrefix, long pMessage, long pUserData) {
System.err.println("ERROR OCCURED: " + VkDebugReportCallbackEXT.getString(pMessage));
return 0;
}
};
final long debugCallbackHandle = setupDebugging(instance, VK_DEBUG_REPORT_ERROR_BIT_EXT | VK_DEBUG_REPORT_WARNING_BIT_EXT, debugCallback);
final VkPhysicalDevice physicalDevice = getFirstPhysicalDevice(instance);
final DeviceAndGraphicsQueueFamily deviceAndGraphicsQueueFamily = createDeviceAndGetGraphicsQueueFamily(physicalDevice);
final VkDevice device = deviceAndGraphicsQueueFamily.device;
int queueFamilyIndex = deviceAndGraphicsQueueFamily.queueFamilyIndex;
final VkPhysicalDeviceMemoryProperties memoryProperties = deviceAndGraphicsQueueFamily.memoryProperties;
// Create GLFW window
glfwDefaultWindowHints();
glfwWindowHint(GLFW_CLIENT_API, GLFW_NO_API);
glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);
long window = glfwCreateWindow(800, 600, "GLFW Vulkan Demo", NULL, NULL);
GLFWKeyCallback keyCallback;
glfwSetKeyCallback(window, keyCallback = new GLFWKeyCallback() {
public void invoke(long window, int key, int scancode, int action, int mods) {
if (action != GLFW_RELEASE)
return;
if (key == GLFW_KEY_ESCAPE)
glfwSetWindowShouldClose(window, true);
}
});
LongBuffer pSurface = memAllocLong(1);
int err = glfwCreateWindowSurface(instance, window, null, pSurface);
final long surface = pSurface.get(0);
if (err != VK_SUCCESS) {
throw new AssertionError("Failed to create surface: " + translateVulkanResult(err));
}
// Create static Vulkan resources
final ColorAndDepthFormatAndSpace colorAndDepthFormatAndSpace = getColorFormatAndSpace(physicalDevice, surface);
final long commandPool = createCommandPool(device, queueFamilyIndex);
final VkCommandBuffer setupCommandBuffer = createCommandBuffer(device, commandPool);
final VkCommandBuffer postPresentCommandBuffer = createCommandBuffer(device, commandPool);
final VkQueue queue = createDeviceQueue(device, queueFamilyIndex);
final long renderPass = createRenderPass(device, colorAndDepthFormatAndSpace.colorFormat, colorAndDepthFormatAndSpace.depthFormat);
final long renderCommandPool = createCommandPool(device, queueFamilyIndex);
final Vertices vertices = createVertices(memoryProperties, device);
UboDescriptor uboDescriptor = createUniformBuffer(memoryProperties, device);
final long descriptorPool = createDescriptorPool(device);
final long descriptorSetLayout = createDescriptorSetLayout(device);
final long descriptorSet = createDescriptorSet(device, descriptorPool, descriptorSetLayout, uboDescriptor);
final Pipeline pipeline = createPipeline(device, renderPass, vertices.createInfo, descriptorSetLayout);
final class SwapchainRecreator {
boolean mustRecreate = true;
void recreate() {
// Begin the setup command buffer (the one we will use for swapchain/framebuffer creation)
VkCommandBufferBeginInfo cmdBufInfo = VkCommandBufferBeginInfo.calloc().sType(VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO).pNext(NULL);
int err = vkBeginCommandBuffer(setupCommandBuffer, cmdBufInfo);
cmdBufInfo.free();
if (err != VK_SUCCESS) {
throw new AssertionError("Failed to begin setup command buffer: " + translateVulkanResult(err));
}
long oldChain = swapchain != null ? swapchain.swapchainHandle : VK_NULL_HANDLE;
// Create the swapchain (this will also add a memory barrier to initialize the framebuffer images)
swapchain = createSwapChain(device, physicalDevice, surface, oldChain, setupCommandBuffer, width, height, colorAndDepthFormatAndSpace.colorFormat, colorAndDepthFormatAndSpace.colorSpace);
// Create depth-stencil image
depthStencil = createDepthStencil(device, memoryProperties, colorAndDepthFormatAndSpace.depthFormat, setupCommandBuffer);
err = vkEndCommandBuffer(setupCommandBuffer);
if (err != VK_SUCCESS) {
throw new AssertionError("Failed to end setup command buffer: " + translateVulkanResult(err));
}
submitCommandBuffer(queue, setupCommandBuffer);
vkQueueWaitIdle(queue);
if (framebuffers != null) {
for (int i = 0; i < framebuffers.length; i++) vkDestroyFramebuffer(device, framebuffers[i], null);
}
framebuffers = createFramebuffers(device, swapchain, renderPass, width, height, depthStencil);
// Create render command buffers
if (renderCommandBuffers != null) {
vkResetCommandPool(device, renderCommandPool, VK_FLAGS_NONE);
}
renderCommandBuffers = createRenderCommandBuffers(device, renderCommandPool, framebuffers, renderPass, width, height, pipeline, descriptorSet, vertices.verticesBuf);
mustRecreate = false;
}
}
final SwapchainRecreator swapchainRecreator = new SwapchainRecreator();
// Handle canvas resize
GLFWFramebufferSizeCallback framebufferSizeCallback = new GLFWFramebufferSizeCallback() {
public void invoke(long window, int width, int height) {
if (width <= 0 || height <= 0)
return;
swapchainRecreator.mustRecreate = true;
TwoRotatingTrianglesInvDepthDemo.width = width;
TwoRotatingTrianglesInvDepthDemo.height = height;
}
};
glfwSetFramebufferSizeCallback(window, framebufferSizeCallback);
glfwShowWindow(window);
// Pre-allocate everything needed in the render loop
IntBuffer pImageIndex = memAllocInt(1);
int currentBuffer = 0;
PointerBuffer pCommandBuffers = memAllocPointer(1);
LongBuffer pSwapchains = memAllocLong(1);
LongBuffer pImageAcquiredSemaphore = memAllocLong(1);
LongBuffer pRenderCompleteSemaphore = memAllocLong(1);
// Info struct to create a semaphore
VkSemaphoreCreateInfo semaphoreCreateInfo = VkSemaphoreCreateInfo.calloc().sType(VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO).pNext(NULL).flags(VK_FLAGS_NONE);
// Info struct to submit a command buffer which will wait on the semaphore
IntBuffer pWaitDstStageMask = memAllocInt(1);
pWaitDstStageMask.put(0, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT);
VkSubmitInfo submitInfo = VkSubmitInfo.calloc().sType(VK_STRUCTURE_TYPE_SUBMIT_INFO).pNext(NULL).waitSemaphoreCount(pImageAcquiredSemaphore.remaining()).pWaitSemaphores(pImageAcquiredSemaphore).pWaitDstStageMask(pWaitDstStageMask).pCommandBuffers(pCommandBuffers).pSignalSemaphores(pRenderCompleteSemaphore);
// Info struct to present the current swapchain image to the display
VkPresentInfoKHR presentInfo = VkPresentInfoKHR.calloc().sType(VK_STRUCTURE_TYPE_PRESENT_INFO_KHR).pNext(NULL).pWaitSemaphores(pRenderCompleteSemaphore).swapchainCount(pSwapchains.remaining()).pSwapchains(pSwapchains).pImageIndices(pImageIndex).pResults(null);
// The render loop
long lastTime = System.nanoTime();
float time = 0.0f;
while (!glfwWindowShouldClose(window)) {
// Handle window messages. Resize events happen exactly here.
// So it is safe to use the new swapchain images and framebuffers afterwards.
glfwPollEvents();
if (swapchainRecreator.mustRecreate)
swapchainRecreator.recreate();
// Create a semaphore to wait for the swapchain to acquire the next image
err = vkCreateSemaphore(device, semaphoreCreateInfo, null, pImageAcquiredSemaphore);
if (err != VK_SUCCESS) {
throw new AssertionError("Failed to create image acquired semaphore: " + translateVulkanResult(err));
}
// Create a semaphore to wait for the render to complete, before presenting
err = vkCreateSemaphore(device, semaphoreCreateInfo, null, pRenderCompleteSemaphore);
if (err != VK_SUCCESS) {
throw new AssertionError("Failed to create render complete semaphore: " + translateVulkanResult(err));
}
// Get next image from the swap chain (back/front buffer).
// This will setup the imageAquiredSemaphore to be signalled when the operation is complete
err = vkAcquireNextImageKHR(device, swapchain.swapchainHandle, UINT64_MAX, pImageAcquiredSemaphore.get(0), VK_NULL_HANDLE, pImageIndex);
currentBuffer = pImageIndex.get(0);
if (err != VK_SUCCESS) {
throw new AssertionError("Failed to acquire next swapchain image: " + translateVulkanResult(err));
}
// Select the command buffer for the current framebuffer image/attachment
pCommandBuffers.put(0, renderCommandBuffers[currentBuffer]);
// Update UBO
long thisTime = System.nanoTime();
time += (thisTime - lastTime) / 1E9f;
lastTime = thisTime;
updateUbo(device, uboDescriptor, time);
// Submit to the graphics queue
err = vkQueueSubmit(queue, submitInfo, VK_NULL_HANDLE);
if (err != VK_SUCCESS) {
throw new AssertionError("Failed to submit render queue: " + translateVulkanResult(err));
}
// Present the current buffer to the swap chain
// This will display the image
pSwapchains.put(0, swapchain.swapchainHandle);
err = vkQueuePresentKHR(queue, presentInfo);
if (err != VK_SUCCESS) {
throw new AssertionError("Failed to present the swapchain image: " + translateVulkanResult(err));
}
// Create and submit post present barrier
vkQueueWaitIdle(queue);
// Destroy this semaphore (we will create a new one in the next frame)
vkDestroySemaphore(device, pImageAcquiredSemaphore.get(0), null);
vkDestroySemaphore(device, pRenderCompleteSemaphore.get(0), null);
submitPostPresentBarrier(swapchain.images[currentBuffer], postPresentCommandBuffer, queue);
}
presentInfo.free();
memFree(pWaitDstStageMask);
submitInfo.free();
memFree(pImageAcquiredSemaphore);
memFree(pRenderCompleteSemaphore);
semaphoreCreateInfo.free();
memFree(pSwapchains);
memFree(pCommandBuffers);
vkDestroyDebugReportCallbackEXT(instance, debugCallbackHandle, null);
framebufferSizeCallback.free();
keyCallback.free();
glfwDestroyWindow(window);
glfwTerminate();
// We don't bother disposing of all Vulkan resources.
// Let the OS process manager take care of it.
}
use of org.lwjgl.glfw.GLFWFramebufferSizeCallback in project lwjgl3-demos by LWJGL.
the class Demo20 method init.
private void init() throws IOException {
glfwSetErrorCallback(errCallback = new GLFWErrorCallback() {
private GLFWErrorCallback delegate = GLFWErrorCallback.createPrint(System.err);
@Override
public void invoke(int error, long description) {
if (error == GLFW_VERSION_UNAVAILABLE)
System.err.println("This demo requires OpenGL 2.0 or higher.");
delegate.invoke(error, description);
}
@Override
public void free() {
delegate.free();
}
});
if (!glfwInit())
throw new IllegalStateException("Unable to initialize GLFW");
glfwDefaultWindowHints();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 2);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);
glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE);
window = glfwCreateWindow(width, height, "Raytracing Demo (fragment shader)", 0L, 0L);
if (window == 0L) {
throw new AssertionError("Failed to create the GLFW window");
}
System.out.println("Press keypad '+' or 'page up' to increase the number of bounces.");
System.out.println("Press keypad '-' or 'page down' to decrease the number of bounces.");
glfwSetKeyCallback(window, keyCallback = new GLFWKeyCallback() {
@Override
public void invoke(long window, int key, int scancode, int action, int mods) {
if (action != GLFW_RELEASE) {
return;
}
if (key == GLFW_KEY_ESCAPE) {
glfwSetWindowShouldClose(window, true);
} else if (key == GLFW_KEY_KP_ADD || key == GLFW_KEY_PAGE_UP) {
int newBounceCount = Math.min(4, Demo20.this.bounceCount + 1);
if (newBounceCount != Demo20.this.bounceCount) {
Demo20.this.bounceCount = newBounceCount;
System.out.println("Ray bounce count is now: " + Demo20.this.bounceCount);
Demo20.this.frameNumber = 0;
}
} else if (key == GLFW_KEY_KP_SUBTRACT || key == GLFW_KEY_PAGE_DOWN) {
int newBounceCount = Math.max(1, Demo20.this.bounceCount - 1);
if (newBounceCount != Demo20.this.bounceCount) {
Demo20.this.bounceCount = newBounceCount;
System.out.println("Ray bounce count is now: " + Demo20.this.bounceCount);
Demo20.this.frameNumber = 0;
}
}
}
});
glfwSetFramebufferSizeCallback(window, fbCallback = new GLFWFramebufferSizeCallback() {
@Override
public void invoke(long window, int width, int height) {
if (width > 0 && height > 0 && (Demo20.this.width != width || Demo20.this.height != height)) {
Demo20.this.width = width;
Demo20.this.height = height;
Demo20.this.resetFramebuffer = true;
Demo20.this.frameNumber = 0;
}
}
});
glfwSetCursorPosCallback(window, cpCallback = new GLFWCursorPosCallback() {
@Override
public void invoke(long window, double x, double y) {
Demo20.this.mouseX = (float) x;
if (mouseDown) {
Demo20.this.frameNumber = 0;
}
}
});
glfwSetMouseButtonCallback(window, mbCallback = new GLFWMouseButtonCallback() {
@Override
public void invoke(long window, int button, int action, int mods) {
if (action == GLFW_PRESS) {
Demo20.this.mouseDownX = Demo20.this.mouseX;
Demo20.this.mouseDown = true;
} else if (action == GLFW_RELEASE) {
Demo20.this.mouseDown = false;
Demo20.this.rotationAboutY = Demo20.this.currRotationAboutY;
}
}
});
GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor());
glfwSetWindowPos(window, (vidmode.width() - width) / 2, (vidmode.height() - height) / 2);
glfwMakeContextCurrent(window);
glfwSwapInterval(0);
glfwShowWindow(window);
IntBuffer framebufferSize = BufferUtils.createIntBuffer(2);
nglfwGetFramebufferSize(window, memAddress(framebufferSize), memAddress(framebufferSize) + 4);
width = framebufferSize.get(0);
height = framebufferSize.get(1);
GLCapabilities caps = GL.createCapabilities();
if (!caps.GL_EXT_framebuffer_object) {
throw new AssertionError("This demo requires the EXT_framebuffer_object extensions");
}
if (!caps.GL_ARB_texture_float) {
throw new AssertionError("This demo requires the ARB_texture_float extensions");
}
debugProc = GLUtil.setupDebugMessageCallback();
/* Create all needed GL resources */
createFramebufferTexture();
createFrameBufferObject();
quadFullScreenVbo();
createBoxesTexture();
createRayTracingProgram();
initRayTracingProgram();
createQuadProgram();
initQuadProgram();
firstTime = System.nanoTime();
}
use of org.lwjgl.glfw.GLFWFramebufferSizeCallback in project lwjgl3-demos by LWJGL.
the class ImmediateModeDemo method init.
void init() throws IOException {
glfwSetErrorCallback(errCallback = new GLFWErrorCallback() {
GLFWErrorCallback delegate = GLFWErrorCallback.createPrint(System.err);
@Override
public void invoke(int error, long description) {
if (error == GLFW_VERSION_UNAVAILABLE)
System.err.println("This demo requires OpenGL 2.0 or higher.");
delegate.invoke(error, description);
}
@Override
public void free() {
delegate.free();
}
});
if (!glfwInit())
throw new IllegalStateException("Unable to initialize GLFW");
glfwDefaultWindowHints();
glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);
glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE);
window = glfwCreateWindow(width, height, "Immediate mode shader demo", NULL, NULL);
if (window == NULL) {
throw new AssertionError("Failed to create the GLFW window");
}
glfwSetFramebufferSizeCallback(window, fbCallback = new GLFWFramebufferSizeCallback() {
@Override
public void invoke(long window, int width, int height) {
if (width > 0 && height > 0 && (ImmediateModeDemo.this.width != width || ImmediateModeDemo.this.height != height)) {
ImmediateModeDemo.this.width = width;
ImmediateModeDemo.this.height = height;
}
}
});
glfwSetKeyCallback(window, keyCallback = new GLFWKeyCallback() {
@Override
public void invoke(long window, int key, int scancode, int action, int mods) {
if (action != GLFW_RELEASE)
return;
if (key == GLFW_KEY_ESCAPE) {
glfwSetWindowShouldClose(window, true);
}
}
});
GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor());
glfwSetWindowPos(window, (vidmode.width() - width) / 2, (vidmode.height() - height) / 2);
glfwMakeContextCurrent(window);
glfwSwapInterval(1);
glfwShowWindow(window);
caps = GL.createCapabilities();
debugProc = GLUtil.setupDebugMessageCallback();
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
// Create all needed GL resources
createProgram();
// and set some GL state
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
}
use of org.lwjgl.glfw.GLFWFramebufferSizeCallback in project lwjgl3-demos by LWJGL.
the class NoVerticesGridDemo method init.
void init() throws IOException {
glfwSetErrorCallback(errCallback = new GLFWErrorCallback() {
GLFWErrorCallback delegate = GLFWErrorCallback.createPrint(System.err);
@Override
public void invoke(int error, long description) {
if (error == GLFW_VERSION_UNAVAILABLE)
System.err.println("This demo requires OpenGL 3.0 or higher.");
delegate.invoke(error, description);
}
@Override
public void free() {
delegate.free();
}
});
if (!glfwInit())
throw new IllegalStateException("Unable to initialize GLFW");
glfwDefaultWindowHints();
glfwWindowHint(GLFW_CONTEXT_VERSION_MAJOR, 3);
glfwWindowHint(GLFW_CONTEXT_VERSION_MINOR, 0);
glfwWindowHint(GLFW_VISIBLE, GLFW_FALSE);
glfwWindowHint(GLFW_RESIZABLE, GLFW_TRUE);
window = glfwCreateWindow(width, height, "No vertices grid shader demo", NULL, NULL);
if (window == NULL) {
throw new AssertionError("Failed to create the GLFW window");
}
glfwSetFramebufferSizeCallback(window, fbCallback = new GLFWFramebufferSizeCallback() {
@Override
public void invoke(long window, int width, int height) {
if (width > 0 && height > 0 && (NoVerticesGridDemo.this.width != width || NoVerticesGridDemo.this.height != height)) {
NoVerticesGridDemo.this.width = width;
NoVerticesGridDemo.this.height = height;
}
}
});
System.out.println("Press 'arrow right' to increase the grid size in X");
System.out.println("Press 'arrow left' to decrease the grid size in X");
System.out.println("Press 'arrow up' to increase the grid size in Y");
System.out.println("Press 'arrow down' to decrease the grid size in Y");
glfwSetKeyCallback(window, keyCallback = new GLFWKeyCallback() {
@Override
public void invoke(long window, int key, int scancode, int action, int mods) {
if (key == GLFW_KEY_ESCAPE && action == GLFW_RELEASE) {
glfwSetWindowShouldClose(window, true);
}
if (key == GLFW_KEY_LEFT && (action == GLFW_RELEASE || action == GLFW_REPEAT)) {
sizeX = Math.max(1, sizeX - 1);
} else if (key == GLFW_KEY_RIGHT && (action == GLFW_RELEASE || action == GLFW_REPEAT)) {
sizeX++;
} else if (key == GLFW_KEY_DOWN && (action == GLFW_RELEASE || action == GLFW_REPEAT)) {
sizeY = Math.max(1, sizeY - 1);
} else if (key == GLFW_KEY_UP && (action == GLFW_RELEASE || action == GLFW_REPEAT)) {
sizeY++;
}
}
});
GLFWVidMode vidmode = glfwGetVideoMode(glfwGetPrimaryMonitor());
glfwSetWindowPos(window, (vidmode.width() - width) / 2, (vidmode.height() - height) / 2);
glfwMakeContextCurrent(window);
glfwSwapInterval(0);
glfwShowWindow(window);
caps = createCapabilities();
debugProc = GLUtil.setupDebugMessageCallback();
glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
// Create all needed GL resources
createProgram();
// and set some GL state
glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
}
Aggregations