Jump to content

[1.11] Ways to render in a TESR


Awesome_Spider

Recommended Posts

Yes, I'm pretty sure. The TileEntity would have a model where different parts rotate depending on which inventory around the TileEntity it is interacting with, if that makes sense. Code in an ItemStack (last topic) would tell it where to move/which inventory to interact with. I'm thinking this might be way more complex than a IBakedModel or something along those lines could provide.

Link to comment
Share on other sites

Thank you. I now have this basic code for my renderer:

protected static BlockRendererDispatcher blockRenderer;

    @Override
    public void renderTileEntityFast(TileEntityRobot te, double x, double y, double z, float partialTicks, int destroyStage, VertexBuffer renderer) {
        if(blockRenderer == null) blockRenderer = Minecraft.getMinecraft().getBlockRendererDispatcher();
        BlockPos pos = te.getPos();
        IBlockAccess world = MinecraftForgeClient.getRegionRenderCache(te.getWorld(), pos);
        IBlockState state = world.getBlockState(pos);

        IBakedModel model = blockRenderer.getBlockModelShapes().getModelForState(state);

        renderer.setTranslation(x - pos.getX(), y - pos.getY(), z - pos.getZ());

        blockRenderer.getBlockModelRenderer().renderModel(world, model, state, pos, renderer, false);
    }

 

I have tested it by adding an offset to the translation (for testing), and it works. It renders the model I defined in my blockstate file. Now how would I add rotation/change the position of some of the parts of the model?

Link to comment
Share on other sites

Does anyone know how I could do this?

 

PS: Kind of off-topic but these spammers are getting really annoying. So glad the moderators are working on getting it fixed. I translated one of their user names on google translate from Chinese and it meant "Make a Fortune". They are obviously gaining something from this.

Link to comment
Share on other sites

I don't completely understand matrices yet, as I am only in grade 12 math currently. I tried it and got this code in my Renderer:

    protected static BlockRendererDispatcher blockRenderer;

    @Override
    public void renderTileEntityFast(TileEntityRobot te, double x, double y, double z, float partialTicks, int destroyStage, VertexBuffer renderer) {
        if(blockRenderer == null) blockRenderer = Minecraft.getMinecraft().getBlockRendererDispatcher();
        BlockPos pos = te.getPos();
        IBlockAccess world = MinecraftForgeClient.getRegionRenderCache(te.getWorld(), pos);
        IBlockState state = world.getBlockState(pos);

        IBakedModel model = blockRenderer.getBlockModelShapes().getModelForState(state);

        renderer.setTranslation(x - pos.getX() + 2.0f, y - pos.getY(), z - pos.getZ() + 2.0f);

        BakedQuad bq = model.getQuads(state, null, 0L).get(0);

        int[] vertexData = handleXRotation(bq.getVertexData(), 45);

        model.getQuads(state, null, 0L).set(0, new BakedQuad(vertexData, bq.getTintIndex(), bq.getFace(), bq.getSprite(), bq.shouldApplyDiffuseLighting(), bq.getFormat()));

        blockRenderer.getBlockModelRenderer().renderModel(world, model, state, pos, renderer, false);
    }

    public int[] handleXRotation(int[] vertexData, double rot) {
        int vx = vertexData[0];
        int vy = vertexData[1];

        vx = (int)((vx * Math.cos(Math.toRadians(rot))) - (vy * Math.sin(Math.toRadians(rot))));
        vy = (int)((vx * Math.sin(Math.toRadians(rot))) + (vy * Math.cos(Math.toRadians(rot))));

        vertexData[0] = vx;
        vertexData[1] = vy;

        //Next Vertex
        vx = vertexData[8];
        vy = vertexData[9];

        vx = (int)((vx * Math.cos(Math.toRadians(rot))) - (vy * Math.sin(Math.toRadians(rot))));
        vy = (int)((vx * Math.sin(Math.toRadians(rot))) + (vy * Math.cos(Math.toRadians(rot))));

        vertexData[8] = vx;
        vertexData[9] = vy;

        //Next Vertex
        vx = vertexData[14];
        vy = vertexData[15];

        vx = (int)((vx * Math.cos(Math.toRadians(-rot))) - (vy * Math.sin(Math.toRadians(-rot))));
        vy = (int)((vx * Math.sin(Math.toRadians(-rot))) + (vy * Math.cos(Math.toRadians(-rot))));

        vertexData[14] = vx;
        vertexData[15] = vy;

        //Next Vertex
        vx = vertexData[20];
        vy = vertexData[21];

        vx = (int)((vx * Math.cos(Math.toRadians(-rot))) - (vy * Math.sin(Math.toRadians(-rot))));
        vy = (int)((vx * Math.sin(Math.toRadians(-rot))) + (vy * Math.cos(Math.toRadians(-rot))));

        vertexData[20] = vx;
        vertexData[21] = vy;

        return vertexData;
    }

 

The method handleXRotation only handles the top face so far. I'm probably doing this way wrong, but this what I got. When I test this code the top face disappears.

Link to comment
Share on other sites

Ok, I now have the following code, and it isn't rotating like I wanted it to.

Spoiler

    protected static BlockRendererDispatcher blockRenderer;

    @Override
    public void renderTileEntityFast(TileEntityRobot te, double x, double y, double z, float partialTicks, int destroyStage, VertexBuffer renderer) {
        if(blockRenderer == null) blockRenderer = Minecraft.getMinecraft().getBlockRendererDispatcher();
        BlockPos pos = te.getPos();
        IBlockAccess world = MinecraftForgeClient.getRegionRenderCache(te.getWorld(), pos);
        IBlockState state = world.getBlockState(pos);

        IBakedModel model = blockRenderer.getBlockModelShapes().getModelForState(state);

        renderer.setTranslation(x - pos.getX() + 2.0f, y - pos.getY(), z - pos.getZ() + 2.0f);

        BakedQuad bq = model.getQuads(state, null, 0L).get(0);

        transform(bq, new TRSRTransformation(new Vector3f(0, 0, 0), new Quat4f(-0.49f, 0, 0, -0.87f), new Vector3f(1, 1, 1), new Quat4f(0.49f, 0, 0, 0.87f)));

        model.getQuads(state, null, 0L).set(0, bq);

        blockRenderer.getBlockModelRenderer().renderModel(world, model, state, pos, renderer, false);
    }

    public static BakedQuad transform(BakedQuad quad, final TRSRTransformation transform) {
        UnpackedBakedQuad.Builder builder = new UnpackedBakedQuad.Builder(DefaultVertexFormats.BLOCK);
        final IVertexConsumer consumer = new VertexTransformer(builder) {
            @Override
            public void put(int element, float... data) {
                VertexFormatElement formatElement = DefaultVertexFormats.BLOCK.getElement(element);
                switch(formatElement.getUsage()) {
                    case POSITION: {
                        float[] newData = new float[3];
                        Vector3f vec = new Vector3f(data);
                        transform.getMatrix().transform(vec);
                        vec.get(newData);
                        parent.put(element, newData);
                        break;
                    }
                    default: {
                        parent.put(element, data);
                        break;
                    }
                }
            }
        };

        quad.pipe(consumer);
        return builder.build();
    }

 

 

Link to comment
Share on other sites

It's still not working.

Spoiler

protected static BlockRendererDispatcher blockRenderer;

    public int curStep = 0;
    public int totalSteps = 0;

    @Override
    public void renderTileEntityFast(TileEntityRobot te, double x, double y, double z, float partialTicks, int destroyStage, VertexBuffer renderer) {
        if(blockRenderer == null) blockRenderer = Minecraft.getMinecraft().getBlockRendererDispatcher();
        BlockPos pos = te.getPos();
        IBlockAccess world = MinecraftForgeClient.getRegionRenderCache(te.getWorld(), pos);
        IBlockState state = world.getBlockState(pos);

        IBakedModel model = blockRenderer.getBlockModelShapes().getModelForState(state);

        renderer.setTranslation(x - pos.getX() + 2.0f, y - pos.getY(), z - pos.getZ() + 2.0f);

        List<BakedQuad> quadList = model.getQuads(state, null, 0L);

        for(BakedQuad quad : quadList) {
            transform(quad, new TRSRTransformation(new Vector3f(0, 0, 0), new Quat4f(-0.49f, 0, 0, -0.87f), new Vector3f(1, 1, 1), new Quat4f(0.49f, 0, 0, 0.87f)));
        }

        blockRenderer.getBlockModelRenderer().renderModel(world, model, state, pos, renderer, false);
    }

    public static BakedQuad transform(BakedQuad quad, final TRSRTransformation transform) {
        UnpackedBakedQuad.Builder builder = new UnpackedBakedQuad.Builder(DefaultVertexFormats.BLOCK);
        final IVertexConsumer consumer = new VertexTransformer(builder) {
            @Override
            public void put(int element, float... data) {
                VertexFormatElement formatElement = DefaultVertexFormats.BLOCK.getElement(element);
                switch(formatElement.getUsage()) {
                    case POSITION: {
                        float[] newData = new float[3];
                        Vector3f vec = new Vector3f(data);
                        transform.getMatrix().transform(vec);
                        vec.get(newData);
                        parent.put(element, newData);
                        break;
                    }
                    default: {
                        parent.put(element, data);
                        break;
                    }
                }
            }
        };

        quad.pipe(consumer);
        return builder.build();
    }

 

 

10 minutes ago, diesieben07 said:
  • Don't try to modify the model's quads, this is a terrible idea.

Isn't that what I'm doing? I'm rotating one of the cubes?

Link to comment
Share on other sites

Ok. I tried that and it only renders the top face (unrotated). I'm probably still doing it wrong.

    protected static BlockRendererDispatcher blockRenderer;

    public int curStep = 0;
    public int totalSteps = 0;

    @Override
    public void renderTileEntityFast(TileEntityRobot te, double x, double y, double z, float partialTicks, int destroyStage, VertexBuffer renderer) {
        if(blockRenderer == null) blockRenderer = Minecraft.getMinecraft().getBlockRendererDispatcher();
        BlockPos pos = te.getPos();
        IBlockAccess world = MinecraftForgeClient.getRegionRenderCache(te.getWorld(), pos);
        IBlockState state = world.getBlockState(pos);

        final IBakedModel model = blockRenderer.getBlockModelShapes().getModelForState(state);

        renderer.setTranslation(x - pos.getX() + 2.0f, y - pos.getY(), z - pos.getZ() + 2.0f);

        final List<BakedQuad> quadList = model.getQuads(state, null, 0L);

        for(BakedQuad quad : quadList) {
            transform(quad, new TRSRTransformation(new Vector3f(0, 0, 0), new Quat4f(-0.49f, 0, 0, -0.87f), new Vector3f(1, 1, 1), new Quat4f(0.49f, 0, 0, 0.87f)));
        }

        final IBakedModel newModel = new IBakedModel() {
            @Override
            public List<BakedQuad> getQuads(IBlockState state, EnumFacing side, long rand) {
                return quadList;
            }

            @Override
            public boolean isAmbientOcclusion() {
                return model.isAmbientOcclusion();
            }

            @Override
            public boolean isGui3d() {
                return model.isGui3d();
            }

            @Override
            public boolean isBuiltInRenderer() {
                return model.isBuiltInRenderer();
            }

            @Override
            public TextureAtlasSprite getParticleTexture() {
                return model.getParticleTexture();
            }

            @Override
            public ItemCameraTransforms getItemCameraTransforms() {
                return model.getItemCameraTransforms();
            }

            @Override
            public ItemOverrideList getOverrides() {
                return model.getOverrides();
            }
        };

        blockRenderer.getBlockModelRenderer().renderModel(world, newModel, state, pos, renderer, false);
    }

    //This method was borrowed from Vazkii's mod called Botania. It was modified to work for a block instead of an item.
    public static BakedQuad transform(BakedQuad quad, final TRSRTransformation transform) {
        UnpackedBakedQuad.Builder builder = new UnpackedBakedQuad.Builder(DefaultVertexFormats.BLOCK);
        final IVertexConsumer consumer = new VertexTransformer(builder) {
            @Override
            public void put(int element, float... data) {
                VertexFormatElement formatElement = DefaultVertexFormats.BLOCK.getElement(element);
                switch(formatElement.getUsage()) {
                    case POSITION: {
                        float[] newData = new float[3];
                        Vector3f vec = new Vector3f(data);
                        transform.getMatrix().transform(vec);
                        vec.get(newData);
                        parent.put(element, newData);
                        break;
                    }
                    default: {
                        parent.put(element, data);
                        break;
                    }
                }
            }
        };

        quad.pipe(consumer);
        return builder.build();
    }

 

Mind you, I am creating a new instance of the model every rendering tick. Not sure how to get around that.

Link to comment
Share on other sites

Thanks for pointing that out. Now it isn't rendering.

protected static BlockRendererDispatcher blockRenderer;

    @Override
    public void renderTileEntityFast(TileEntityRobot te, double x, double y, double z, float partialTicks, int destroyStage, VertexBuffer renderer) {
        if(blockRenderer == null) blockRenderer = Minecraft.getMinecraft().getBlockRendererDispatcher();
        BlockPos pos = te.getPos();
        IBlockAccess world = MinecraftForgeClient.getRegionRenderCache(te.getWorld(), pos);
        IBlockState state = world.getBlockState(pos);

        final IBakedModel model = blockRenderer.getBlockModelShapes().getModelForState(state);

        renderer.setTranslation(x - pos.getX() + 2.0f, y - pos.getY(), z - pos.getZ() + 2.0f);

        final List<BakedQuad> quadList = model.getQuads(state, null, 0L);
        final List<BakedQuad> newQuadList = Lists.newArrayList();


        for(BakedQuad quad : quadList) {
            newQuadList.add(transform(quad, new TRSRTransformation(new Vector3f(0, 0, 0), new Quat4f(-0.49f, 0, 0, -0.87f), new Vector3f(1, 1, 1), new Quat4f(0.49f, 0, 0, 0.87f))));
        }

        final IBakedModel newModel = new IBakedModel() {
            @Override
            public List<BakedQuad> getQuads(IBlockState state, EnumFacing side, long rand) {
                return newQuadList;
            }

            @Override
            public boolean isAmbientOcclusion() {
                return model.isAmbientOcclusion();
            }

            @Override
            public boolean isGui3d() {
                return model.isGui3d();
            }

            @Override
            public boolean isBuiltInRenderer() {
                return model.isBuiltInRenderer();
            }

            @Override
            public TextureAtlasSprite getParticleTexture() {
                return model.getParticleTexture();
            }

            @Override
            public ItemCameraTransforms getItemCameraTransforms() {
                return model.getItemCameraTransforms();
            }

            @Override
            public ItemOverrideList getOverrides() {
                return model.getOverrides();
            }
        };

        blockRenderer.getBlockModelRenderer().renderModel(world, newModel, state, pos, renderer, false);
    }

    //This method was borrowed from Vazkii's mod called Botania. It was modified to work for a block instead of an item.
    public static BakedQuad transform(BakedQuad quad, final TRSRTransformation transform) {
        UnpackedBakedQuad.Builder builder = new UnpackedBakedQuad.Builder(DefaultVertexFormats.BLOCK);
        final IVertexConsumer consumer = new VertexTransformer(builder) {
            @Override
            public void put(int element, float... data) {
                VertexFormatElement formatElement = DefaultVertexFormats.BLOCK.getElement(element);
                switch(formatElement.getUsage()) {
                    case POSITION: {
                        float[] newData = new float[3];
                        Vector3f vec = new Vector3f(data);
                        transform.getMatrix().transform(vec);
                        vec.get(newData);
                        parent.put(element, newData);
                        break;
                    }
                    default: {
                        parent.put(element, data);
                        break;
                    }
                }
            }
        };

        quad.pipe(consumer);
        return builder.build();
    }

 

Did I get the Quat4fs right? I haven't really worked with them. I used this to get the numbers for them.

Edited by Awesome_Spider
Link to comment
Share on other sites

Ok. I think I'm doing that now. But it isn't rendering.

 

protected static BlockRendererDispatcher blockRenderer;

    @Override
    public void renderTileEntityFast(TileEntityRobot te, double x, double y, double z, float partialTicks, int destroyStage, VertexBuffer renderer) {
        if(blockRenderer == null) blockRenderer = Minecraft.getMinecraft().getBlockRendererDispatcher();
        BlockPos pos = te.getPos();
        IBlockAccess world = MinecraftForgeClient.getRegionRenderCache(te.getWorld(), pos);
        IBlockState state = world.getBlockState(pos);

        final IBakedModel model = blockRenderer.getBlockModelShapes().getModelForState(state);

        renderer.setTranslation(x - pos.getX() + 2.0f, y - pos.getY(), z - pos.getZ() + 2.0f);

        for(int i = 0; i > model.getQuads(state, null, 0L).size(); i++) {
            BakedQuad quad = model.getQuads(state, null, 0L).get(i);
            quad = transform(quad, new TRSRTransformation(new Vector3f(0, 0, 0), new Quat4f(-0.49f, 0, 0, -0.87f), new Vector3f(1, 1, 1), new Quat4f(0.49f, 0, 0, 0.87f)));

            renderer.addVertexData(quad.getVertexData());
        }
    }

    //This method was borrowed from Vazkii's mod called Botania. It was modified to work for a block instead of an item.
    public static BakedQuad transform(BakedQuad quad, final TRSRTransformation transform) {
        UnpackedBakedQuad.Builder builder = new UnpackedBakedQuad.Builder(DefaultVertexFormats.BLOCK);
        final IVertexConsumer consumer = new VertexTransformer(builder) {
            @Override
            public void put(int element, float... data) {
                VertexFormatElement formatElement = DefaultVertexFormats.BLOCK.getElement(element);
                switch(formatElement.getUsage()) {
                    case POSITION: {
                        float[] newData = new float[3];
                        Vector3f vec = new Vector3f(data);
                        transform.getMatrix().transform(vec);
                        vec.get(newData);
                        parent.put(element, newData);
                        break;
                    }
                    default: {
                        parent.put(element, data);
                        break;
                    }
                }
            }
        };

        quad.pipe(consumer);
        return builder.build();
    }

 

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.



  • Recently Browsing

    • No registered users viewing this page.
  • Posts

    • The Carolina Panthers slice their roster down in the direction of 53 avid gamers upon Tuesday inside of accordance with NFL inside optimum seasons, we experienced a favourable thought of almost certainly 45 or hence of the adult men that have been likely in direction of crank out the 's these previous destinations that are often up inside of the are typically a few of surprises upon roster slice working day, and this a single was no Marshall , Jalen Coker inThe Panthers employed a instant spherical choose upon TMJ accurately a few seasons in the past, and he's hardly ever Incredibly found out his experienced flashes of assurance, nonetheless individuals normally appeared in the direction of be adopted as a result of disappearing functions and greatest specifically performed zero snaps within just a activity very last time a person 7 days at the time top the workers in just catches mainly because the instruction personnel effectively forgot regarding matter of the place the blame lies https://www.pantherssportsstore.com/dj-wonnum-jacket, Marshall is his location is undrafted novice Jalen Coker, who acquired the Steve Smith of endorsement all experienced a potent greatest activity of the preseason and obviously did sufficient in the direction of generate the education staff members's have confidence in addition performed distinctive groups snaps, which is constantly a likely tiebreaker Even though analyzing upon element avid gamers at confident placement aren't a great number of exceptional groups acesMost last roster cuts contain a number of of gentlemen that are tagged as the exceptional groups 're normally linebackers, limited finishes, and once in a while defensive Smith-Marsette and Raheem Blackshear are the staff members's shift-in the direction of returners, nevertheless there aren't particularly any other gamers that adhere out as remaining upon the roster essentially for their distinctive groups 's likely not a huge offer https://www.pantherssportsstore.com/taylor-moton-t-shirt, and it's not challenging towards argue that yourself need to have your gamers in direction of be constructive at their basic careers whilst instruction them up upon their unique groups , it's a distinguished departure versus what the personnel is made up of finished made a decision in just the defensive again positional battleWe talked above positional battles likely into the Expenses sport past 7 one of the far more tightly contested kinds was the overcome for the detail locations in just the Panthers secondary.A great deal of avid gamers experienced good scenarios in direction of produce the Panthers elected for D'Shawn Jamison and Chau Smith-Wade earlier mentioned Dicaprio Robinson is shown as a stability and developed the employees alongside with Demani Richardson, the Panthers lone go interceptor of the , cornerback Dane Jackson and protection Sam Franklin are both of those specified towards return in opposition to IR afterwards this period, hence not all of Those adult males can count on in direction of adhere in excess of for way too Matthews' effective preseason not more than enough in direction of gain a roster spotMatthews was arguably the personnel's least difficult move catcher within just the preseason online games with 7 catches for 68 yards and a touchdown throughout the a few online now, he was still left off the roster within want of incumbents Ian Thomas and Tommy Tremble and starter fourth spherical decide on J'Tavion any luck Nick Thurman Jacket, the 32 12 months previous at minimum amount did more than enough towards generate himself a minimal little bit extra period inside the 's a applicant for a veteran vacation spot upon the coach rusher element seeking thenThe Panthers' first 53 male roster contains 4 Gain avid gamers upon it, and they wear't overall look specially Clowney will start out upon a person aspect with possibly DJ Johnson or K'Lavon Chaisson contrary Leota experienced some durable situations within just the preseason, nevertheless I have on't understand that he can be counted upon in the direction of build reliably inside legitimate game Wonnum and Amare Barno will give reinforcements every time they cure versus their respective personal injury, yet the stage community seems to be slim in just the Panthers may well scour the waiver cord for support below.
    • Revenge of the Birds at 8 a. just about every working video game will dwell within just a fresh new write-up every working day for your self toward engage in, discuss with regards to https://www.cardinalsplayersapparel.com/clayton-tune-hoodie, and Deliver necessary take note: this sport involves a marketplace of recent and previous random NFL gamers, not accurately present-day and prior Cardinals 13th gameSeptember 12th gameSeptember 11th gameWhat we have to have against youPlay the gameShare your consequence within just the responses and upon social mediaProvide feedbackSee SB Country inside of-5 sport directions here the Region inside of-5The reason of the video game is in direction of wager the acceptable random NFL participant with the support of up in the direction of 5 'll combination in just Both of those Busy AND RETIRED Gamers this 7 gained't be uncomplicated towards determine it out inside of one particular or 2 guesses, yet some of on your own could be equipped in direction of nail will be a blend of perfectly-recognized avid gamers and some "that men" that we haven't concept of in just some video game will glimpse within just slot 3 of the structure just about every working day this 7 days, with a clean short article each and every working day for the after by yourself accurately wager the participant JuJu Hughes Hoodie, yourself can click on "Percentage Success" toward percentage how on your own did within the feedback and upon social received't shift into other information relating to the sport as we'd such as your responses upon it performs, what on your own imagine of it, the problem issue, and every little thing else your self can imagine of that will enable us recognize what by yourself consider and how we can enhance the yourself can give feed-back in just the suggestions of this report https://www.cardinalsplayersapparel.com/juju-hughes-jacket, or by yourself can fill out this Google !  
    • Hello, I was wondering how I could actually begin to run the server?  Whenever I click on the server file, it says “Check console for possible errors related to” and the name of the file. 
    • idk if im right, but i think that minecraft dont use texture atlas anymore, maybe imi wrong tho  
    • im trying to make a java class for a block, that if you mine it with a hammer it gives you a shard instead of the but, but the code i have its not working rn :c public class BauxiteOreBlock extends Block { public BauxiteOreBlock() { super(BlockBehaviour.Properties.of().strength(1.5f, 4.0f).requiresCorrectToolForDrops()); } @Override public void playerDestroy(Level level, Player player, BlockPos pos, BlockState state, @Nullable BlockEntity blockEntity, @Nullable ItemStack stack) { if (stack.getItem() == ModItems.HAMMER.get()) { popResource(level, pos, new ItemStack(ModItems.BAUXITESHARD.get())); } else { super.playerDestroy(level, player, pos, state, blockEntity, stack); } } }  
  • Topics

×
×
  • Create New...

Important Information

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