Jump to content
Search In
  • More options...
Find results that contain...
Find results in...

[1.11] Ways to render in a TESR


Awesome_Spider
 Share

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

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
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.

 Share



×
×
  • Create New...

Important Information

By using this site, you agree to our Privacy Policy.