Jump to content

[1.11][Solved] Rendering huge amounts of Blocks


MCenderdragon

Recommended Posts

I have an 3-d-Array of IblockStates and using renderBlock to rendem them. (this works fine)

BlockRendererDispatcher.renderBlock(IBlockState state, BlockPos pos, IBlockAccess blockAccess, VertexBuffer worldRendererIn)

Everything is correctly in the VertexBuffer I give to this methode and I can render this VertexBuffer using draw. (This is the code inside the Tesselator.draw() methode)

WorldVertexBufferUploader.draw(VertexBuffer vertexBufferIn)

But calling everytime renderBlock is slow and the blocks and the data doesnt change so I try to keep the data inside the VertexBuffer and just render them again, but now the issue happens.

 

The VertexData is stored inside a ByteBuffer you can get them via getByteBuffer() inside VertexData. VertexData also has the methode addVertexData(int[] vertexData), to add alot of data in one go. With some Buffer magic I convert the ByteBuffer to a IntBuffer and add the data to a new VertexBuffer (the one that is currently inuse from the Tesselator). But somehow the face and vertex amount is correct but nothing is rendered. But rendering the "old" VertexBuffer works. Has anybody any advise were a possible bug is?

 

 

Conversation Code:

private static final WorldVertexBufferUploader vboUploader = new WorldVertexBufferUploader();

private static void rotateStaticData(VertexBuffer target, VertexBuffer data, float[] rotation, float[] translation)
	{	
		if(target.getVertexFormat() != data.getVertexFormat())
		{
			return; //this should not happen!
		}
		
		float[] rot = new float[6];
		rot[0] = (float) Math.sin(rotation[0]);
		rot[1] = (float) Math.sin(rotation[1]);
		rot[2] = (float) Math.sin(rotation[2]);
		
		rot[3] = (float) Math.cos(rotation[0]);
		rot[4] = (float) Math.cos(rotation[1]);
		rot[5] = (float) Math.cos(rotation[2]);
				
		if(data.getVertexFormat() == DefaultVertexFormats.BLOCK)
		{
			
			//vboUploader.draw(data);
			VertexFormat format = data.getVertexFormat();
			
			ByteBuffer read = data.getByteBuffer().asReadOnlyBuffer();
			read.position(0);
			ByteBuffer write = ByteBuffer.allocate(data.getVertexCount() * format.getNextOffset());
			
			
			//target.setTranslation(translation[0], translation[1], translation[2]);
			
			IntBuffer intBuf = write.asIntBuffer();
			intBuf.position(0);
			int[] vertexData = new int[intBuf.limit()];
			intBuf.get(vertexData);
						
			target.addVertexData(vertexData);//TODO: this still is not rendering
			
			//vboUploader.draw(data); is this is used in renders Correctly
			
			return;
		}
	}

 

Edited by MCenderdragon

catch(Exception e)

{

 

}

Yay, Pokémon exception handling, gotta catch 'em all (and then do nothing with 'em).

Link to comment
Share on other sites

 

Quote

face and vertex amount

well lets asume this statement is wrong, what else is importent and inside the VertexBuffer ?

 

Also is their anyother way to "bake" a custom block construction an render them? Also I need to translate and rotate them but if the rendering is working this is not so hard to achieve.

catch(Exception e)

{

 

}

Yay, Pokémon exception handling, gotta catch 'em all (and then do nothing with 'em).

Link to comment
Share on other sites

Also I noticed the FastTESR starts and stops the Tesselator from the renderTileEntityAT even if I tell the block to be have an AnimatedModel, dosnt all FastTESR should render at once?

catch(Exception e)

{

 

}

Yay, Pokémon exception handling, gotta catch 'em all (and then do nothing with 'em).

Link to comment
Share on other sites

16 hours ago, diesieben07 said:

Yes, it does, for legacy purposes. Normally renderTileEntityAt is not called for a FastTESR.

Ahh okay, I will try to check the bytes before and after again, maybe only some bytes are wrong but still result in no gl error.

catch(Exception e)

{

 

}

Yay, Pokémon exception handling, gotta catch 'em all (and then do nothing with 'em).

Link to comment
Share on other sites

Ok I fixed it, too things too note here for the others:

1.) at conversation to the IntBuffer somehow the bytes got twisted so everything was wrong, i fixed this by accessing the vertexCount and the byteBuffer field or the VertexBuffer via reflection

2.) to propeply read/write and edit the data inside the buffer you need to use ByteOrder.LITTLE_ENDIAN, but too let it work while rendering it has to be ByteOrder.BIG_ENDIAN, so just changed this to little befor editing and back to big to let it render.

catch(Exception e)

{

 

}

Yay, Pokémon exception handling, gotta catch 'em all (and then do nothing with 'em).

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.