Jump to content

[1.8.9] Multiblocks structures and OBJ models: is it possible?


ZeroNoRyouki

Recommended Posts

 

Hi!

 

I'm working on a mod and I like very much big multiblock machines and structures but I'd like to make them look a bit better than a Borg cube, something like an Arc Furnace from Immersive Engineering instead of a Steam Boiler from Railcraft to give you an idea :)

 

What I'd like to do is make a 3D model for the whole multiblock in Blender or 3DS MAX and use the resulting OBJ model to render the assembled multiblock in game

 

The question is how to do that :D

 

 

So far I came up with the following ideas / concepts:

 

 

1) use TESR to render the whole model by delegating the job to one of the TEs of the multiblock structure

 

This can turn ugly performance-wise and I don't know if the Minecraft rendering engine support models much bigger than 1 or 2 block spaces

 

 

2) cut the 3D model in pieces and generate an OBJ for each of the blocks in the multiblock structure

 

Aside from the cutting nightmare, there will probably be problems regarding the orientation of the multiblock

 

 

What do you think guys?

 

Link to comment
Share on other sites

Not my profession for a long time now, but in past I think I stumbled upon something like this.

Design was pretty much: Place one block (center) which renders whole thing and fill air around with special invisible blocks.

I am unsure if it was in Entity or Block class, but I remember there is a method that allows you to change rendering distance hit-box (meaning you start seeing (render) block before you actually see central-block). But as said - this might have been method for Entity (that was like a year ago, idk).

 

Note that you will need some pretty big recursion to break such a structure. Way I would do it is to make that one of those structures (when trying to place them) cannot ever be in 1-block contact with other. Then (since "invisible block" is of your design) you can NOT care about checking whether your recursion is removing structure wanted or passed onto another one next to it, and just make tail call. Just an idea.

 

Hope anything here is helpful, but you got to do the actual research (or wait for someone else). :D

1.7.10 is no longer supported by forge, you are on your own.

Link to comment
Share on other sites

The invisible blocks are every real block in your multiblock structure.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

Oh, I've done this recently!

Basically, in your TESR and Block classes, in the rendering functions(renderTileEntityAt, isOpaqueCube, shouldSideBeRendered,etc) check the tile entity for a boolean method called isMultiblock or something. This will use worldObj.getBlock to check if the required blocks are not null, and the right blocks. Then, return if it is.

Make sure you don't render the obj if it isn't multiblock, and you do render the blocks.

Remember also to translate the model!

Don't forget to also update the fake blocks. I'd suggest doing something along the lines of:

if(te.isMultiblock() || te.isToldMultiblock)
//don't render sides

if(isMultiblock())
//render OBJ

if(multiblockcode)
//set blocks isToldMulitblock()

 

And the model can be huge! But be careful on scale and don't go overboard with the vertices

[shadow=gray,left][glow=red,2,300]KEEGAN[/glow][/shadow]

Link to comment
Share on other sites

Sorry guys for the late reply and thank you for your help!

 

I was able to make this work using the standard blockstate tying it into my multiblock controller with getActualState and shouldSideBeRendered and delegating the "you should render the model" state to one of the block (selected when then whole machine became fully assembled)

 

PNJdonr.png

 

J3wMgn6.png

(no texture on the model right now)

 

 

In the tests so far I dont' see any performance drops so all good. The next step is to animate things a bit :)

 

Link to comment
Share on other sites

Your invisible blocks should also be transparent, so the model gets light.

Apparently I'm a complete and utter jerk and come to this forum just like to make fun of people, be confrontational, and make your personal life miserable.  If you think this is the case, JUST REPORT ME.  Otherwise you're just going to get reported when you reply to my posts and point it out, because odds are, I was trying to be nice.

 

Exception: If you do not understand Java, I WILL NOT HELP YOU and your thread will get locked.

 

DO NOT PM ME WITH PROBLEMS. No help will be given.

Link to comment
Share on other sites

  • 2 months later...

You got the model to work? How did you do this!?

 

Yup, with plain vanilla blockstate :)

 

 

All the blocks use the same blockstate:

 

{
    "variants": {
        "state=single": { "model": "sand" },
	"state=invisible": { "model": "thedarkkin:transparentBlock" },
	"state=renderer": { "model": "thedarkkin:mblock1/multib1.obj" }
    }
}

 

 

 

"single" is for blocks that are not part of a formed multiblock (I used the vanilla sand block model because this was a proof of concept rather then an actual machine)

 

"invisible" is for blocks that are part of a formed mutiblock but are not the mutiblock render delegate. they are actualy invisible in game

 

"renderer" is for the block selected to be the render delegate of the formed multiblock

 

 

Basically when the multiblock form itself, I select one block and delegate to it the job of rendering the 3D model (using the "render" blockstate and it's OBJ model). All the other block will render as an invisible cube.

 

You must create the 3D model keeping in mind where the render delegate of your choice is in the whole structure. Mine was in the center of the bottom layer

 

 

The block class override getActualState() and return one of the three possibile states according to the state of the multiblock (how to actualy do that depends on how you implement your multiblock logic)

 

 

 

 

 

Link to comment
Share on other sites

Thanks, I don't actually want a multiblock structure, but for what I understood I can simply "load" the obj file with the json, is that really everything to it? Seems way too easy, I've found three tutorials with overly complicated ways to load obj.

Link to comment
Share on other sites

Hi, glad it worked for you too ;)

 

You need to export the material library (.MTL) along with the OBJ file and place it in the same directory of the OBJ file

 

Then, open the MTL file in a text editor and change the path of your texture files using the same format as in all the other resource locations you use in your mod (basically, yourmodid:path_to_texture)

 

Hope that helps :)

 

Z

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.