Jump to content

Render GUI inside rectangle


CAS_ual_TY

Recommended Posts

Hello,

 

I would like to render my GUI content inside a certain rectangle with anything beyond the edge of that rectangle getting cut off.

I have looked into the advancement GUI for that but it is honestly too confusing for me. (I also tried google)

 

 

Personally I think it is done here (but I am not sure and I would also like to understand why and how):

GuiScreenAdvancement:176

 

If anyone could point me in the right direction that would be great. I would really like to understand how this works. I mean I could also just check every single element, if it is at the edge and then adjust it, but I am quite sure there is a simpler solution to this (?).

 

Thanks in advance! Any tip or piece of knowledge would be greatly appreciated

 

EDIT: Fixed spoiler and formatting

Edited by CAS_ual_TY
Link to comment
Share on other sites

6 hours ago, CAS_ual_TY said:

I have looked into the advancement GUI for that but it is honestly too confusing for me. (I also tried google)

First off dont post code that isnt yours here or anywhere without permission from the writers.

 

Second when you render your image you specify where on your image you want to start at (x, y) then you specify where on the screen (x, y) then you give the width and height to the method. So if you want the image to have a scrolling appearance change where on the image you want to start.

VANILLA MINECRAFT CLASSES ARE THE BEST RESOURCES WHEN MODDING

I will be posting 1.15.2 modding tutorials on this channel. If you want to be notified of it do the normal YouTube stuff like subscribing, ect.

Forge and vanilla BlockState generator.

Link to comment
Share on other sites

Animefan8888 is right about creating a scrolling image by changing the start,height. I wrote most of my guis like that, But if you were wanting to have a bunch of images and text and dont want to write all the logic for that. Than I have used GL Scissor to do what your asking. I've used it to draw scroll-able guis inside other guis. Anything outside the borders will get cut off. 

 

Spoiler

GL_SCISSOR_TEST:

 


public drawScreen(int mouseX, int mouseY, float partialTicks){
	GL11.glEnable(GL11.GL_SCISSOR_TEST);
		GlStateManager.disableLighting();
    	guiScissor(mc, x, y, width, height);
    	CallYourDrawCode(mouseX, mouseY, partialTicks); 
	GlStateManager.enableLighting();
	GL11.glDisable(GL11.GL_SCISSOR_TEST);
}


// This gets the scaledResolution to get proper placement. 
public static void guiScissor(Minecraft mc, int x, int y, int w, int h){
	ScaledResolution r = new ScaledResolution(mc);
	int f = r.getScaleFactor();
	GL11.glScissor(x * f, (r.getScaledHeight() - y - h)*f, w * f, h * f);
}

 

 

It really depends on what you trying to do. As this can be a bit much for a simple scrolling window. You will still have to handle all the key inputs & mouse inputs. This only handles the rendering.  Also This was written for mc1.12.2.

  • Like 2
Link to comment
Share on other sites

13 hours ago, Animefan8888 said:

First off dont post code that isnt yours here or anywhere without permission from the writers.

 

Second when you render your image you specify where on your image you want to start at (x, y) then you specify where on the screen (x, y) then you give the width and height to the method. So if you want the image to have a scrolling appearance change where on the image you want to start.

I removed the code you are right. I was thinking I would be posting a general concept instead of someone's code which is obviously not true.

 

I should have emphasized it a bit more that I was looking for something the glScissor solution. I mentioned it slightly below the spoiler but I should have been more clear.

 

10 hours ago, gendeathrow said:

Animefan8888 is right about creating a scrolling image by changing the start,height. I wrote most of my guis like that, But if you were wanting to have a bunch of images and text and dont want to write all the logic for that. Than I have used GL Scissor to do what your asking. I've used it to draw scroll-able guis inside other guis. Anything outside the borders will get cut off. 

 

  Reveal hidden contents

GL_SCISSOR_TEST:

 



public drawScreen(int mouseX, int mouseY, float partialTicks){
	GL11.glEnable(GL11.GL_SCISSOR_TEST);
		GlStateManager.disableLighting();
    	guiScissor(mc, x, y, width, height);
    	CallYourDrawCode(mouseX, mouseY, partialTicks); 
	GlStateManager.enableLighting();
	GL11.glDisable(GL11.GL_SCISSOR_TEST);
}


// This gets the scaledResolution to get proper placement. 
public static void guiScissor(Minecraft mc, int x, int y, int w, int h){
	ScaledResolution r = new ScaledResolution(mc);
	int f = r.getScaleFactor();
	GL11.glScissor(x * f, (r.getScaledHeight() - y - h)*f, w * f, h * f);
}

 

 

It really depends on what you trying to do. As this can be a bit much for a simple scrolling window. You will still have to handle all the key inputs & mouse inputs. This only handles the rendering.  Also This was written for mc1.12.2.

Thank you, this is exactly what I was looking for. The following is how I did it:

 

/**
	 * Cut everything off outside the given rectangle. Call this, then the all the draw code, then {@link #innerEnd()} for cleanup.
	 * @param x Pos X of the rectangle.
	 * @param y Pos Y of the rectangle.
	 * @param w Width of the rectangle.
	 * @param h Height of the rectangle.
	 */
	protected void innerStart(int x, int y, int w, int h)
	{
		GL11.glEnable(GL11.GL_SCISSOR_TEST);
		//* scaleFactor due to the automatic resizing depending on window size (or the GUI size settings)
		//All the derparoundery with the Y position because Minecraft 0,0 is at the top left, but lwjgl 0,0 is at the bottom left
		GL11.glScissor(x * this.sr.getScaleFactor(), (this.sr.getScaledHeight() - y - h) * this.sr.getScaleFactor(), w * this.sr.getScaleFactor(), h * this.sr.getScaleFactor());
		this.applyZoomAndShift();
		GL11.glPushMatrix();
	}
	
	/**
	 * Scissor cleanup. Call {@link #innerStart(int, int, int, int)}, then all the draw code, then this.
	 */
	protected void innerEnd()
	{
		GL11.glPopMatrix();
		GL11.glDisable(GL11.GL_SCISSOR_TEST);
	}

From: https://github.com/CAS-ual-TY/Visibilis/blob/bee136b8243cbd7796be3b334cf5c681d38a5347/src/main/java/de/cas_ual_ty/visibilis/GuiPrint.java#L394

(Experimental, untested code, the entire GUI. Something could be terribly wrong, everything in this repo is only theory. I was too lazy yet to write a ReadMe pls no shame)

 

Thanks for the help.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Announcements



×
×
  • Create New...

Important Information

By using this site, you agree to our Terms of Use.