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



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • I have done this now but have got the error:   'food(net.minecraft.world.food.FoodProperties)' in 'net.minecraft.world.item.Item.Properties' cannot be applied to                '(net.minecraftforge.registries.RegistryObject<net.minecraft.world.item.Item>)' public static final RegistryObject<Item> LEMON_JUICE = ITEMS.register( "lemon_juice", () -> new Item( new HoneyBottleItem.Properties().stacksTo(1).food( (new FoodProperties.Builder()) .nutrition(3) .saturationMod(0.25F) .effect(() -> new MobEffectInstance(MobEffects.DAMAGE_RESISTANCE, 1500), 0.01f ) .build() ) )); The code above is from the ModFoods class, the one below from the ModItems class. public static final RegistryObject<Item> LEMON_JUICE = ITEMS.register("lemon_juice", () -> new Item(new Item.Properties().food(ModFoods.LEMON_JUICE)));   I shall keep going between them to try and figure out the cause. I am sorry if this is too much for you to help with, though I thank you greatly for your patience and all the effort you have put in to help me.
    • I have been following these exact tutorials for quite a while, I must agree that they are amazing and easy to follow. I have registered the item in the ModFoods class, I tried to do it in ModItems (Where all the items should be registered) but got errors, I think I may need to revert this and figure it out from there. Once again, thank you for your help! 👍 Just looking back, I have noticed in your code you added ITEMS.register, which I am guessing means that they are being registered in ModFoods, I shall go through the process of trial and error to figure this out.
    • ♈+2349027025197ஜ Are you a pastor, business man or woman, politician, civil engineer, civil servant, security officer, entrepreneur, Job seeker, poor or rich Seeking how to join a brotherhood for protection and wealth here’s is your opportunity, but you should know there’s no ritual without repercussions but with the right guidance and support from this great temple your destiny is certain to be changed for the better and equally protected depending if you’re destined for greatness Call now for enquiry +2349027025197☎+2349027025197₩™ I want to join ILLUMINATI occult without human sacrificeGREATORLDRADO BROTHERHOOD OCCULT , Is The Club of the Riches and Famous; is the world oldest and largest fraternity made up of 3 Millions Members. We are one Family under one father who is the Supreme Being. In Greatorldrado BROTHERHOOD we believe that we were born in paradise and no member should struggle in this world. Hence all our new members are given Money Rewards once they join in order to upgrade their lifestyle.; interested viewers should contact us; on. +2349027025197 ۝ஐℰ+2349027025197 ₩Greatorldrado BROTHERHOOD OCCULT IS A SACRED FRATERNITY WITH A GRAND LODGE TEMPLE SITUATED IN G.R.A PHASE 1 PORT HARCOURT NIGERIA, OUR NUMBER ONE OBLIGATION IS TO MAKE EVERY INITIATE MEMBER HERE RICH AND FAMOUS IN OTHER RISE THE POWERS OF GUARDIANS OF AGE+. +2349027025197   SEARCHING ON HOW TO JOIN THE Greatorldrado BROTHERHOOD MONEY RITUAL OCCULT IS NOT THE PROBLEM BUT MAKE SURE YOU'VE THOUGHT ABOUT IT VERY WELL BEFORE REACHING US HERE BECAUSE NOT EVERYONE HAS THE HEART TO DO WHAT IT TAKES TO BECOME ONE OF US HERE, BUT IF YOU THINK YOU'RE SERIOUS MINDED AND READY TO RUN THE SPIRITUAL RACE OF LIFE IN OTHER TO ACQUIRE ALL YOU NEED HERE ON EARTH CONTACT SPIRITUAL GRANDMASTER NOW FOR INQUIRY +2349027025197   +2349027025197 Are you a pastor, business man or woman, politician, civil engineer, civil servant, security officer, entrepreneur, Job seeker, poor or rich Seeking how to join
    • Hi, I'm trying to use datagen to create json files in my own mod. This is my ModRecipeProvider class. public class ModRecipeProvider extends RecipeProvider implements IConditionBuilder { public ModRecipeProvider(PackOutput pOutput) { super(pOutput); } @Override protected void buildRecipes(Consumer<FinishedRecipe> pWriter) { ShapedRecipeBuilder.shaped(RecipeCategory.MISC, ModBlocks.COMPRESSED_DIAMOND_BLOCK.get()) .pattern("SSS") .pattern("SSS") .pattern("SSS") .define('S', ModItems.COMPRESSED_DIAMOND.get()) .unlockedBy(getHasName(ModItems.COMPRESSED_DIAMOND.get()), has(ModItems.COMPRESSED_DIAMOND.get())) .save(pWriter); ShapelessRecipeBuilder.shapeless(RecipeCategory.MISC, ModItems.COMPRESSED_DIAMOND.get(),9) .requires(ModBlocks.COMPRESSED_DIAMOND_BLOCK.get()) .unlockedBy(getHasName(ModBlocks.COMPRESSED_DIAMOND_BLOCK.get()), has(ModBlocks.COMPRESSED_DIAMOND_BLOCK.get())) .save(pWriter); ShapedRecipeBuilder.shaped(RecipeCategory.MISC, ModItems.COMPRESSED_DIAMOND.get()) .pattern("SSS") .pattern("SSS") .pattern("SSS") .define('S', Blocks.DIAMOND_BLOCK) .unlockedBy(getHasName(ModItems.COMPRESSED_DIAMOND.get()), has(ModItems.COMPRESSED_DIAMOND.get())) .save(pWriter); } } When I try to run the runData client, it shows an error:  Caused by: java.lang.IllegalStateException: Duplicate recipe compressed:compressed_diamond I know that it's caused by the fact that there are two recipes for the ModItems.COMPRESSED_DIAMOND. But I need both of these recipes, because I need a way to craft ModItems.COMPRESSED_DIAMOND_BLOCK and restore 9 diamond blocks from ModItems.COMPRESSED_DIAMOND. Is there a way to solve this?
  • Topics

×
×
  • Create New...

Important Information

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