use of org.lwjgl.opengl.GL11.glViewport in project BuildCraft by BuildCraft.
the class GuiZonePlanner method drawForegroundLayer.
@SuppressWarnings("PointlessBitwiseExpression")
@Override
protected void drawForegroundLayer() {
camY += scaleSpeed;
scaleSpeed *= 0.7F;
int posX = (int) positionX;
int posZ = (int) positionZ;
int dimension = mc.world.provider.getDimension();
{
ChunkPos chunkPos = new ChunkPos(posX >> 4, posZ >> 4);
ZonePlannerMapChunk zonePlannerMapChunk = ZonePlannerMapDataClient.INSTANCE.getChunk(mc.world, new ZonePlannerMapChunkKey(chunkPos, dimension, container.tile.getLevel()));
BlockPos pos = null;
if (zonePlannerMapChunk != null) {
MapColourData data = zonePlannerMapChunk.getData(posX, posZ);
if (data != null) {
pos = new BlockPos(posX, data.posY, posZ);
}
}
if (pos != null && pos.getY() + 10 > camY) {
camY = Math.max(camY, pos.getY() + 10);
}
}
int x = guiLeft;
int y = guiTop;
if (lastSelected != null) {
String text = "X: " + lastSelected.getX() + " Y: " + lastSelected.getY() + " Z: " + lastSelected.getZ();
fontRenderer.drawString(text, x + 130, y + 130, 0x404040);
}
int offsetX = 8;
int offsetY = 9;
int sizeX = 213;
int sizeY = 100;
GlStateManager.pushMatrix();
GlStateManager.matrixMode(GL11.GL_PROJECTION);
GlStateManager.pushMatrix();
GlStateManager.loadIdentity();
ScaledResolution scaledResolution = new ScaledResolution(mc);
int viewportX = (x + offsetX) * scaledResolution.getScaleFactor();
int viewportY = mc.displayHeight - (sizeY + y + offsetY) * scaledResolution.getScaleFactor();
int viewportWidth = sizeX * scaledResolution.getScaleFactor();
int viewportHeight = sizeY * scaledResolution.getScaleFactor();
GL11.glEnable(GL11.GL_SCISSOR_TEST);
GL11.glScissor(viewportX, viewportY, viewportWidth, viewportHeight);
GlStateManager.clear(GL11.GL_DEPTH_BUFFER_BIT);
GL11.glDisable(GL11.GL_SCISSOR_TEST);
GlStateManager.viewport(viewportX, viewportY, viewportWidth, viewportHeight);
GlStateManager.scale(scaledResolution.getScaleFactor(), scaledResolution.getScaleFactor(), 1);
GLU.gluPerspective(70.0F, (float) sizeX / sizeY, 1F, 10000.0F);
GlStateManager.matrixMode(GL11.GL_MODELVIEW);
GlStateManager.loadIdentity();
RenderHelper.enableStandardItemLighting();
GlStateManager.enableRescaleNormal();
// look down
GlStateManager.rotate(90, 1, 0, 0);
GlStateManager.pushMatrix();
GlStateManager.translate(-positionX, -camY, -positionZ);
GlStateManager.disableBlend();
GlStateManager.disableAlpha();
GlStateManager.disableTexture2D();
int minScreenX = (x + offsetX) * scaledResolution.getScaleFactor();
int minScreenY = (scaledResolution.getScaledHeight() - (y + offsetY)) * scaledResolution.getScaleFactor();
int maxScreenX = (x + offsetX + sizeX) * scaledResolution.getScaleFactor();
int maxScreenY = (scaledResolution.getScaledHeight() - (y + offsetY + sizeY)) * scaledResolution.getScaleFactor();
int minChunkX = (posX >> 4) - 8;
int minChunkZ = (posZ >> 4) - 8;
int maxChunkX = (posX >> 4) + 8;
int maxChunkZ = (posZ >> 4) + 8;
// noinspection SuspiciousNameCombination
List<ChunkPos> chunkPosBounds = Stream.of(Pair.of(minScreenX, minScreenY), Pair.of(minScreenX, maxScreenY), Pair.of(maxScreenX, minScreenY), Pair.of(maxScreenX, maxScreenY)).map(p -> rayTrace(p.getLeft(), p.getRight())).filter(Objects::nonNull).map(ChunkPos::new).collect(Collectors.toList());
for (ChunkPos chunkPos : chunkPosBounds) {
if (chunkPos.x < minChunkX) {
minChunkX = chunkPos.x;
}
if (chunkPos.z < minChunkZ) {
minChunkZ = chunkPos.z;
}
if (chunkPos.x > maxChunkX) {
maxChunkX = chunkPos.x;
}
if (chunkPos.z > maxChunkZ) {
maxChunkZ = chunkPos.z;
}
}
minChunkX--;
minChunkZ--;
maxChunkX++;
maxChunkZ++;
for (int chunkX = minChunkX; chunkX <= maxChunkX; chunkX++) {
for (int chunkZ = minChunkZ; chunkZ <= maxChunkZ; chunkZ++) {
ZonePlannerMapRenderer.INSTANCE.getChunkGlList(new ZonePlannerMapChunkKey(new ChunkPos(chunkX, chunkZ), dimension, container.tile.getLevel())).ifPresent(GlStateManager::callList);
}
}
BlockPos found = null;
int foundColor = 0;
if (Mouse.getX() >= minScreenX && Mouse.getY() <= minScreenY && Mouse.getX() <= maxScreenX && Mouse.getY() >= maxScreenY) {
found = rayTrace(Mouse.getX(), Mouse.getY());
}
if (found != null) {
ZonePlannerMapChunk zonePlannerMapChunk = ZonePlannerMapDataClient.INSTANCE.getChunk(mc.world, new ZonePlannerMapChunkKey(new ChunkPos(found), mc.world.provider.getDimension(), container.tile.getLevel()));
if (zonePlannerMapChunk != null) {
MapColourData data = zonePlannerMapChunk.getData(found.getX(), found.getZ());
if (data != null) {
foundColor = data.colour;
}
}
}
if (found != null) {
GlStateManager.disableDepth();
GlStateManager.enableBlend();
GlStateManager.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_LINE);
GlStateManager.glLineWidth(2);
int r = (int) (((foundColor >> 16) & 0xFF) * 0.7);
int g = (int) (((foundColor >> 8) & 0xFF) * 0.7);
int b = (int) (((foundColor >> 0) & 0xFF) * 0.7);
int a = 0x77;
ZonePlannerMapRenderer.INSTANCE.setColor(r << 16 | g << 8 | b << 0 | a << 24);
BufferBuilder builder = Tessellator.getInstance().getBuffer();
builder.begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_COLOR);
ZonePlannerMapRenderer.INSTANCE.drawBlockCuboid(builder, found.getX(), found.getY(), found.getZ());
Tessellator.getInstance().draw();
GlStateManager.glPolygonMode(GL11.GL_FRONT_AND_BACK, GL11.GL_FILL);
GlStateManager.disableBlend();
GlStateManager.enableDepth();
}
GlStateManager.disableLighting();
GlStateManager.enableBlend();
for (int i = 0; i < container.tile.layers.length; i++) {
if (getPaintbrushBrush() != null && getPaintbrushBrush().colour.getMetadata() != i) {
continue;
}
ZonePlan layer = container.tile.layers[i];
if (getPaintbrushBrush() != null && getPaintbrushBrush().colour.getMetadata() == i && bufferLayer != null) {
layer = bufferLayer;
}
if (!layer.getChunkPoses().isEmpty()) {
Tessellator.getInstance().getBuffer().begin(GL11.GL_QUADS, DefaultVertexFormats.POSITION_COLOR);
for (int chunkX = minChunkX; chunkX <= maxChunkX; chunkX++) {
for (int chunkZ = minChunkZ; chunkZ <= maxChunkZ; chunkZ++) {
ChunkPos chunkPos = new ChunkPos(chunkX, chunkZ);
for (int blockX = chunkPos.getXStart(); blockX <= chunkPos.getXEnd(); blockX++) {
for (int blockZ = chunkPos.getZStart(); blockZ <= chunkPos.getZEnd(); blockZ++) {
if (!layer.get(blockX - container.tile.getPos().getX(), blockZ - container.tile.getPos().getZ())) {
continue;
}
int height;
ZonePlannerMapChunk zonePlannerMapChunk = ZonePlannerMapDataClient.INSTANCE.getChunk(mc.world, new ZonePlannerMapChunkKey(chunkPos, dimension, container.tile.getLevel()));
if (zonePlannerMapChunk != null) {
MapColourData data = zonePlannerMapChunk.getData(blockX, blockZ);
if (data != null) {
height = data.posY;
} else {
continue;
}
} else {
continue;
}
int color = EnumDyeColor.byMetadata(i).getColorValue();
int r = (color >> 16) & 0xFF;
int g = (color >> 8) & 0xFF;
int b = (color >> 0) & 0xFF;
int a = 0x55;
ZonePlannerMapRenderer.INSTANCE.setColor(r << 16 | g << 8 | b << 0 | a << 24);
ZonePlannerMapRenderer.INSTANCE.drawBlockCuboid(Tessellator.getInstance().getBuffer(), blockX, height + 0.1, blockZ, height, 0.6);
}
}
}
}
Tessellator.getInstance().draw();
}
}
GlStateManager.disableBlend();
GlStateManager.disableLighting();
GlStateManager.enableTexture2D();
lastSelected = found;
GlStateManager.popMatrix();
GlStateManager.disableRescaleNormal();
GlStateManager.matrixMode(GL11.GL_PROJECTION);
GlStateManager.viewport(0, 0, mc.displayWidth, mc.displayHeight);
GlStateManager.popMatrix();
GlStateManager.matrixMode(GL11.GL_MODELVIEW);
GlStateManager.popMatrix();
RenderHelper.disableStandardItemLighting();
GlStateManager.disableBlend();
}
use of org.lwjgl.opengl.GL11.glViewport in project legui by SpinyOwl.
the class MultipleWindowsExample method main.
public static void main(String[] args) {
System.setProperty("joml.nounsafe", Boolean.TRUE.toString());
System.setProperty("java.awt.headless", Boolean.TRUE.toString());
if (!GLFW.glfwInit()) {
throw new RuntimeException("Can't initialize GLFW");
}
glfwSetErrorCallback(GLFWErrorCallback.createPrint(System.err));
int N = 3;
long[] windows = new long[N];
Renderer[] renderers = new NvgRenderer[N];
Context[] contexts = new Context[N];
Frame[] frames = new Frame[N];
CallbackKeeper[] keepers = new DefaultCallbackKeeper[N];
SystemEventProcessor[] systemEventProcessors = new SystemEventProcessor[N];
GLFWKeyCallbackI glfwKeyCallbackI = (w1, key, code, action, mods) -> running = !(key == GLFW_KEY_ESCAPE && action != GLFW_RELEASE);
GLFWWindowCloseCallbackI glfwWindowCloseCallbackI = w -> running = false;
for (int i = 0; i < N; i++) {
windows[i] = glfwCreateWindow(WIDTH, HEIGHT, "Multiple Windows Example " + (i + 1), NULL, NULL);
glfwShowWindow(windows[i]);
glfwMakeContextCurrent(windows[i]);
GL.createCapabilities();
glfwSwapInterval(0);
glfwSetWindowPos(windows[i], 50, 50 + (HEIGHT + 50) * i);
// Renderer which will render our ui components.
renderers[i] = new NvgRenderer();
renderers[i].initialize();
createGuiElements(frames[i] = new Frame(WIDTH, HEIGHT));
contexts[i] = new Context(windows[i]);
keepers[i] = new DefaultCallbackKeeper();
CallbackKeeper.registerCallbacks(windows[i], keepers[i]);
keepers[i].getChainKeyCallback().add(glfwKeyCallbackI);
keepers[i].getChainWindowCloseCallback().add(glfwWindowCloseCallbackI);
systemEventProcessors[i] = new SystemEventProcessorImpl();
SystemEventProcessor.addDefaultCallbacks(keepers[i], systemEventProcessors[i]);
}
running = true;
while (running) {
for (int i = 0; i < N; i++) {
glfwMakeContextCurrent(windows[i]);
GL.getCapabilities();
glfwSwapInterval(0);
contexts[i].updateGlfwWindow();
Vector2i windowSize = contexts[i].getFramebufferSize();
glClearColor(1, 1, 1, 1);
glViewport(0, 0, windowSize.x, windowSize.y);
glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
renderers[i].render(frames[i], contexts[i]);
glfwPollEvents();
glfwSwapBuffers(windows[i]);
systemEventProcessors[i].processEvents(frames[i], contexts[i]);
EventProcessorProvider.getInstance().processEvents();
// When everything done we need to relayout components.
LayoutManager.getInstance().layout(frames[i]);
}
}
for (int i = 0; i < N; i++) {
renderers[i].destroy();
glfwDestroyWindow(windows[i]);
}
glfwTerminate();
}
use of org.lwjgl.opengl.GL11.glViewport in project legui by SpinyOwl.
the class SingleClassExample2 method main.
public static void main(String[] args) throws IOException {
System.setProperty("joml.nounsafe", Boolean.TRUE.toString());
System.setProperty("java.awt.headless", Boolean.TRUE.toString());
if (!GLFW.glfwInit()) {
throw new RuntimeException("Can't initialize GLFW");
}
long window = glfwCreateWindow(WIDTH, HEIGHT, "Legui", NULL, NULL);
glfwShowWindow(window);
glfwMakeContextCurrent(window);
GL.createCapabilities();
glfwSwapInterval(0);
// Firstly we need to create frame component for window.
Frame frame = new Frame(WIDTH, HEIGHT);
// we can add elements here or on the fly
// We need to create legui context which shared by renderer and event processor.
// Also we need to pass event processor for ui events such as click on component, key typing and
// etc.
Context context = new Context(window);
// We need to create callback keeper which will hold all of callbacks.
// These callbacks will be used in initialization of system event processor
// (will be added callbacks which will push system events to event queue and after that
// processed by SystemEventProcessor)
CallbackKeeper keeper = new DefaultCallbackKeeper();
// register callbacks for window. Note: all previously binded callbacks will be unbinded.
CallbackKeeper.registerCallbacks(window, keeper);
GLFWKeyCallbackI glfwKeyCallbackI = (w1, key, code, action, mods) -> running = !(key == GLFW_KEY_ESCAPE && action != GLFW_RELEASE);
GLFWWindowCloseCallbackI glfwWindowCloseCallbackI = w -> running = false;
// if we want to create some callbacks for system events you should create and put them to
// keeper
//
// Wrong:
// glfwSetKeyCallback(window, glfwKeyCallbackI);
// glfwSetWindowCloseCallback(window, glfwWindowCloseCallbackI);
//
// Right:
keeper.getChainKeyCallback().add(glfwKeyCallbackI);
keeper.getChainWindowCloseCallback().add(glfwWindowCloseCallbackI);
// Event processor for system events. System events should be processed and translated to gui
// events.
SystemEventProcessor systemEventProcessor = new SystemEventProcessorImpl();
SystemEventProcessor.addDefaultCallbacks(keeper, systemEventProcessor);
// Also we need to create renderer provider
// and create renderer which will render our ui components.
Renderer renderer = new NvgRenderer();
// Initialization finished, so we can start render loop.
running = true;
// Everything can be done in one thread as well as in separated threads.
// Here is one-thread example.
// before render loop we need to initialize renderer
renderer.initialize();
AtomicBoolean needToUpdate = new AtomicBoolean(true);
keeper.getChainKeyCallback().add((w, key, scancode, action, mods) -> {
if (key == GLFW_KEY_F1 && action == GLFW_RELEASE)
needToUpdate.set(true);
});
// createUI(frame);
while (running) {
if (needToUpdate.getAndSet(false))
createUI(frame);
// Before rendering we need to update context with window size and window framebuffer size
// {
// int[] windowWidth = {0}, windowHeight = {0};
// GLFW.glfwGetWindowSize(window, windowWidth, windowHeight);
// int[] frameBufferWidth = {0}, frameBufferHeight = {0};
// GLFW.glfwGetFramebufferSize(window, frameBufferWidth, frameBufferHeight);
// int[] xpos = {0}, ypos = {0};
// GLFW.glfwGetWindowPos(window, xpos, ypos);
// double[] mx = {0}, my = {0};
// GLFW.glfwGetCursorPos(window, mx, my);
//
// context.update(windowWidth[0], windowHeight[0],
// frameBufferWidth[0], frameBufferHeight[0],
// xpos[0], ypos[0],
// mx[0], my[0]
// );
// }
// Also we can do it in one line
context.updateGlfwWindow();
Vector2i windowSize = context.getFramebufferSize();
glClearColor(1, 1, 1, 1);
// Set viewport size
glViewport(0, 0, windowSize.x, windowSize.y);
// Clear screen
glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
// render frame
renderer.render(frame, context);
// poll events to callbacks
glfwPollEvents();
glfwSwapBuffers(window);
// Now we need to process events. Firstly we need to process system events.
systemEventProcessor.processEvents(frame, context);
// When system events are translated to GUI events we need to process them.
// This event processor calls listeners added to ui components
EventProcessorProvider.getInstance().processEvents();
// When everything done we need to relayout components.
LayoutManager.getInstance().layout(frame);
// Run animations. Should be also called cause some components use animations for updating
// state.
AnimatorProvider.getAnimator().runAnimations();
}
// And when rendering is ended we need to destroy renderer
renderer.destroy();
glfwDestroyWindow(window);
glfwTerminate();
}
use of org.lwjgl.opengl.GL11.glViewport in project legui by SpinyOwl.
the class SingleClassExample method main.
public static void main(String[] args) throws IOException {
System.setProperty("joml.nounsafe", Boolean.TRUE.toString());
System.setProperty("java.awt.headless", Boolean.TRUE.toString());
if (!GLFW.glfwInit()) {
throw new RuntimeException("Can't initialize GLFW");
}
long window = glfwCreateWindow(WIDTH, HEIGHT, "Single Class Example", NULL, NULL);
glfwShowWindow(window);
glfwMakeContextCurrent(window);
GL.createCapabilities();
glfwSwapInterval(0);
// Firstly we need to create frame component for window.
Frame frame = new Frame(WIDTH, HEIGHT);
// we can add elements here or on the fly
createGuiElements(frame);
// We need to create legui context which shared by renderer and event processor.
// Also we need to pass event processor for ui events such as click on component, key typing and
// etc.
Context context = new Context(window);
// We need to create callback keeper which will hold all of callbacks.
// These callbacks will be used in initialization of system event processor
// (will be added callbacks which will push system events to event queue and after that
// processed by SystemEventProcessor)
CallbackKeeper keeper = new DefaultCallbackKeeper();
// register callbacks for window. Note: all previously binded callbacks will be unbinded.
CallbackKeeper.registerCallbacks(window, keeper);
GLFWKeyCallbackI glfwKeyCallbackI = (w1, key, code, action, mods) -> running = !(key == GLFW_KEY_ESCAPE && action != GLFW_RELEASE);
GLFWWindowCloseCallbackI glfwWindowCloseCallbackI = w -> running = false;
// if we want to create some callbacks for system events you should create and put them to
// keeper
//
// Wrong:
// glfwSetKeyCallback(window, glfwKeyCallbackI);
// glfwSetWindowCloseCallback(window, glfwWindowCloseCallbackI);
//
// Right:
keeper.getChainKeyCallback().add(glfwKeyCallbackI);
keeper.getChainWindowCloseCallback().add(glfwWindowCloseCallbackI);
// Event processor for system events. System events should be processed and translated to gui
// events.
SystemEventProcessor systemEventProcessor = new SystemEventProcessorImpl();
SystemEventProcessor.addDefaultCallbacks(keeper, systemEventProcessor);
// Also we need to create renderer provider
// and create renderer which will render our ui components.
Renderer renderer = new NvgRenderer();
// Initialization finished, so we can start render loop.
running = true;
// Everything can be done in one thread as well as in separated threads.
// Here is one-thread example.
// before render loop we need to initialize renderer
renderer.initialize();
while (running) {
// Before rendering we need to update context with window size and window framebuffer size
// {
// int[] windowWidth = {0}, windowHeight = {0};
// GLFW.glfwGetWindowSize(window, windowWidth, windowHeight);
// int[] frameBufferWidth = {0}, frameBufferHeight = {0};
// GLFW.glfwGetFramebufferSize(window, frameBufferWidth, frameBufferHeight);
// int[] xpos = {0}, ypos = {0};
// GLFW.glfwGetWindowPos(window, xpos, ypos);
// double[] mx = {0}, my = {0};
// GLFW.glfwGetCursorPos(window, mx, my);
//
// context.update(windowWidth[0], windowHeight[0],
// frameBufferWidth[0], frameBufferHeight[0],
// xpos[0], ypos[0],
// mx[0], my[0]
// );
// }
// Also we can do it in one line
context.updateGlfwWindow();
Vector2i windowSize = context.getFramebufferSize();
glClearColor(1, 1, 1, 1);
// Set viewport size
glViewport(0, 0, windowSize.x, windowSize.y);
// Clear screen
glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
// render frame
renderer.render(frame, context);
// poll events to callbacks
glfwPollEvents();
glfwSwapBuffers(window);
// Now we need to process events. Firstly we need to process system events.
systemEventProcessor.processEvents(frame, context);
// When system events are translated to GUI events we need to process them.
// This event processor calls listeners added to ui components
EventProcessorProvider.getInstance().processEvents();
// When everything done we need to relayout components.
LayoutManager.getInstance().layout(frame);
// Run animations. Should be also called cause some components use animations for updating
// state.
AnimatorProvider.getAnimator().runAnimations();
update(context);
}
// And when rendering is ended we need to destroy renderer
renderer.destroy();
glfwDestroyWindow(window);
glfwTerminate();
}
use of org.lwjgl.opengl.GL11.glViewport in project legui by SpinyOwl.
the class FBOImageExample method main.
public static void main(String[] args) throws IOException {
System.setProperty("joml.nounsafe", Boolean.TRUE.toString());
System.setProperty("java.awt.headless", Boolean.TRUE.toString());
if (!GLFW.glfwInit()) {
throw new RuntimeException("Can't initialize GLFW");
}
long window = glfwCreateWindow(WIDTH, HEIGHT, "FBO Image example", NULL, NULL);
glfwShowWindow(window);
glfwMakeContextCurrent(window);
GL.createCapabilities();
glfwSwapInterval(0);
// Firstly we need to create frame component for window.
Frame frame = new Frame(WIDTH, HEIGHT);
// We need to create legui context which shared by renderer and event processor.
// Also we need to pass event processor for ui events such as click on component, key typing and etc.
Context context = new Context(window);
// We need to create callback keeper which will hold all of callbacks.
// These callbacks will be used in initialization of system event processor
// (will be added callbacks which will push system events to event queue and after that processed by SystemEventProcessor)
CallbackKeeper keeper = new DefaultCallbackKeeper();
// register callbacks for window. Note: all previously binded callbacks will be unbinded.
CallbackKeeper.registerCallbacks(window, keeper);
GLFWKeyCallbackI glfwKeyCallbackI = (w1, key, code, action, mods) -> running = !(key == GLFW_KEY_ESCAPE && action != GLFW_RELEASE);
GLFWWindowCloseCallbackI glfwWindowCloseCallbackI = w -> running = false;
// if we want to create some callbacks for system events you should create and put them to keeper
//
// Wrong:
// glfwSetKeyCallback(window, glfwKeyCallbackI);
// glfwSetWindowCloseCallback(window, glfwWindowCloseCallbackI);
//
// Right:
keeper.getChainKeyCallback().add(glfwKeyCallbackI);
keeper.getChainWindowCloseCallback().add(glfwWindowCloseCallbackI);
// Event processor for system events. System events should be processed and translated to gui events.
SystemEventProcessor systemEventProcessor = new SystemEventProcessorImpl();
SystemEventProcessor.addDefaultCallbacks(keeper, systemEventProcessor);
// Also we need to create renderer provider
// and create renderer which will render our ui components.
Renderer renderer = new NvgRenderer();
// Initialization finished, so we can start render loop.
running = true;
// Everything can be done in one thread as well as in separated threads.
// Here is one-thread example.
// before render loop we need to initialize renderer
renderer.initialize();
// //// rendering to texture and use this texture as image
long nvgContext = 0;
FBOImage fboTexture = null;
boolean isVersionNew = (glGetInteger(GL_MAJOR_VERSION) > 3) || (glGetInteger(GL_MAJOR_VERSION) == 3 && glGetInteger(GL_MINOR_VERSION) >= 2);
if (isVersionNew) {
int flags = NanoVGGL3.NVG_STENCIL_STROKES | NanoVGGL3.NVG_ANTIALIAS;
nvgContext = NanoVGGL3.nvgCreate(flags);
} else {
int flags = NanoVGGL2.NVG_STENCIL_STROKES | NanoVGGL2.NVG_ANTIALIAS;
nvgContext = NanoVGGL2.nvgCreate(flags);
}
if (nvgContext != 0) {
fboTexture = createFBOTexture(textureWidth, textureHeight);
Widget widget = new Widget(10, 10, 100, 100);
widget.setCloseable(false);
widget.setMinimizable(false);
widget.setResizable(true);
widget.getContainer().getStyle().setDisplay(DisplayType.FLEX);
ImageView imageView = new ImageView(fboTexture);
imageView.setPosition(10, 10);
imageView.getStyle().setPosition(PositionType.RELATIVE);
imageView.getStyle().getFlexStyle().setFlexGrow(1);
imageView.getStyle().setMargin(10f);
imageView.getStyle().setMinimumSize(50, 50);
widget.getContainer().add(imageView);
frame.getContainer().add(widget);
}
while (running) {
if (fboTexture != null) {
renderToFBO(nvgContext);
}
// Before rendering we need to update context with window size and window framebuffer size
// {
// int[] windowWidth = {0}, windowHeight = {0};
// GLFW.glfwGetWindowSize(window, windowWidth, windowHeight);
// int[] frameBufferWidth = {0}, frameBufferHeight = {0};
// GLFW.glfwGetFramebufferSize(window, frameBufferWidth, frameBufferHeight);
// int[] xpos = {0}, ypos = {0};
// GLFW.glfwGetWindowPos(window, xpos, ypos);
// double[] mx = {0}, my = {0};
// GLFW.glfwGetCursorPos(window, mx, my);
//
// context.update(windowWidth[0], windowHeight[0],
// frameBufferWidth[0], frameBufferHeight[0],
// xpos[0], ypos[0],
// mx[0], my[0]
// );
// }
// Also we can do it in one line
context.updateGlfwWindow();
Vector2i windowSize = context.getFramebufferSize();
glClearColor(1, 1, 1, 1);
// Set viewport size
glViewport(0, 0, windowSize.x, windowSize.y);
// Clear screen
glClear(GL_COLOR_BUFFER_BIT | GL_STENCIL_BUFFER_BIT);
// render frame
renderer.render(frame, context);
// poll events to callbacks
glfwPollEvents();
glfwSwapBuffers(window);
// Now we need to process events. Firstly we need to process system events.
systemEventProcessor.processEvents(frame, context);
// When system events are translated to GUI events we need to process them.
// This event processor calls listeners added to ui components
EventProcessorProvider.getInstance().processEvents();
// When everything done we need to relayout components.
LayoutManager.getInstance().layout(frame);
// Run animations. Should be also called cause some components use animations for updating state.
AnimatorProvider.getAnimator().runAnimations();
}
if (nvgContext != 0) {
glDeleteRenderbuffers(renderBufferID);
glDeleteTextures(textureID);
glDeleteFramebuffers(frameBufferID);
if (isVersionNew) {
NanoVGGL3.nnvgDelete(nvgContext);
} else {
NanoVGGL2.nnvgDelete(nvgContext);
}
}
// And when rendering is ended we need to destroy renderer
renderer.destroy();
glfwDestroyWindow(window);
glfwTerminate();
}
Aggregations