Jump to content

Recommended Posts

Posted

Hello there,

 

So i saw that we can register .obj models again wich is cool (thx fry)!

But im a little confused why it not loads, i mean it should right?

 

In the preInit, i got this, after the item is registered:

if(event.getSide() == Side.CLIENT){
OBJLoader.instance.addDomain(Csgo.ModID);
ModelLoader.setCustomModelResourceLocation(Usp, 0, new ModelResourceLocation(ModID + ":Usp", "inventory"));
	}

 

The modid is already lower case!!!

 

The model are in: assets/modid/models/item

Both .obj and .mtl!

I didnt forget about: mtllib models/item/Usp.mtl

 

And here is my .mtl

newmtl pist_223.bmp
Ns 96.078431
Ka 1.000000 1.000000 1.000000
Kd 0.762566 0.426902 0.414958
Ks 0.500000 0.500000 0.500000
Ke 0.000000 0.000000 0.000000
Ni 1.000000
d 1.000000
illum 2
map_Kd csgo:Usp

The texture is in: assets/modid/textures!

 

In case, i triangulated the faces, but thats the only thing i have done to the model.

 

Also, can i implement IPerspectiveModelAware, event if its an obj model?

 

Thanks for helping!

 

 

 

 

Posted

First off, don't just thank fry, thank shadekiller666 as well (he wrote the loader). Where exactly are you registering your custom model resource location? In your Main class or in a proxy? What is the unlocalized name of the item "Usp"? Do you have your blockstate for the item in the correct area? You need to give more info.

Posted

Oh, i didnt know that. shadekiller666, THANK YOU as well!

Its inside my main class, like its should be.

This: if(event.getSide() == Side.CLIENT) actullay is useful there, but it shouldnt really matter, the server wont gonan crash.

The Unlocalized and Registered name are both "Usp".

Now... Why would i exactly need a blocksate file for an item? :D

Posted

You need proxies for this kind of thing. Any *reference* to a class/field/method with the @SideOnly annotation that is detected on the wrong side will crash the game, even if the code isn't ever executed. Try and run your mod on a "dedicated* server, and you'll see it chashes.

catch(Exception e)

{

 

}

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

Posted

Look, im not that stupid, i know what im doing thats not the problem anyways.

You can trust me i started a server and it worked fine. You can use Side.CLIENT checking if you know how and where.

In the matter of fact Side checking, prevents the Client/Server to even see the code. Not like isRemote.

Thats why most are confused, and create a crash.

 

Anyways i fixed the 1st problem, now it detects the model, but i get this error:

net.minecraftforge.client.model.obj.OBJModel$UVsOutOfBoundsException: Model 'csgo:models/item/Usp.obj' has UVs ('vt') out of bounds 0-1! The missing model will be used instead. Support for UV processing will be added to the OBJ loader in the future.

 

I see what it means, but i dont know how i could fix the model.

Posted

Yeah, i was wrong and i wrote the lines about @SideOnly, oups. :(

 

What i meant was, as far as i know in the inits, you can use event.getSide() checking for resource registering.

 

 

Posted

So how did you get it to work?

I'm currently unable use OBJ's for items. (Blocks were easy, just followed the forge debug examples. now waiting on the custom tag one)

 

I know its something relatively simple I'm overlooking, but for the life of me I'm stumped and I wasn't able to fine an example to go by.

 

 

The 'fun' I've had trying to get this to work is in the spoiler, so unless you care to read you can skip opening it. ;D

 

 

my proxy's preint already has:

OBJLoader.instance.addDomain("terraqueous");

 


I've tried the following. (all in my proxy's preint)

 

named my OBJ itemScythe.obj and placed it in  /models/item/  (the mtl is also there)

 

I attempted each of these line (one by one)

ModelLoader.setCustomModelResourceLocation(itemScythe, 0, new ModelResourceLocation("terraqueous:itemScythe", "inventory"));
ModelLoader.setCustomModelResourceLocation(itemScythe, 0, new ModelResourceLocation("terraqueous:item/itemScythe", "inventory"));
ModelLoader.setCustomModelResourceLocation(itemScythe, 0, new ModelResourceLocation("terraqueous:models/item/itemScythe", "inventory"));

I also tried with .obj added to the file name, and all of those again without the "inventory"

 

all gave the same error: terraqueous:itemScythe#inventory not found

 


I figured since my blocks needed ModelBakery.addVariantName I'd give it a try for the item.

ModelBakery.addVariantName(itemScythe, "terraqueous:itemScythe.obj");

 

That got rid of the error but still didn't render.

So in my proxy's int I added another line my blocks use

 

ClientFunction.registerItemModel(itemScythe, 0, "terraqueous:itemScythe.obj");

 

no error, no render

 


 

Next thing I tried was using a json

renamed my model to scythe.obj

created a itemScythe.json

{
    "forge_marker": 1,
    "variants": {
        "inventory": {
            "model": "terraqueous:item/scythe.obj"
        }
    }
}

 

but that throws an error too: com.google.gson.JsonParseException: BlockModel requires either elements or parent, found neither

 

 

Posted

Texture Coordinates are generally specified as 0-1 along axis named U and V. In 1.7, textures were generally loaded individually, and going outside of 0->1 would result in textures being repeated.

 

In 1.8's model world, textures are stitched onto the main block sheet, which should be a good performance boost. However it means that if you use a UV coordinates less than 0, or greater than 1, you may end up with part of the texture of another block. For this reason, an error was introduced because your model will more than likely not render the way you intended it to.

Posted

Yeah, after a bit of testing i figured this out. So i fixed the UV mapping, and also fixed the material.

So it renders okay now. I can see that some triangular face has rendering issues, because they are brighter, so it looks wierd.

 

But other than that, i manage to get it working!

Posted

Well I had some time to take another crack at this.

 

You can not use a forge state json with the obj defined at a model, works for blocks but not items.

Nor can you use a model json with the obj defined as a parent.

Both throw the error: com.google.gson.JsonParseException: BlockModel requires either elements or parent, found neither

 

What did work, partly.

In the proxy preinit add a variant name that points to the obj file and include the '.obj'

In the proxy init register the item model, also needs to point to the obj and include '.obj'

 

That works to get the obj in game, just need to solve how to set transformations.

I'm guessing that will need to be done with the ModelBakeEvent but it will have to wait until I get another chance to go digging.

 

Posted

Well i did achived to get items to work. Since my pistol is an item only.

I think you have problems with your json.

 

Here is what i did:

-Create blockstate folder

-Create models/item folders

-Put obj with mtl into the models/item folder

-In the blockstate create a .json file with the registered name

 

Here is my Usp.json file:

{
    "forge_marker": 1,
    "defaults": {
        "textures": {
            "#Usp": "csgo:Usp"
        },
        "model": "csgo:Usp.obj"
    },
    "variants": {
        "normal": [{}],
        "inventory": [{
            "transform": {
                "firstperson": {
                    "translation": [0.1, 0, -0.3],
                    "rotation": [ { "y": 130}, {"x": 0}, {"z": 0} ],
                    "scale": 0.2
                },
                "thirdperson": {
                    "translation": [0.02, 0.05, -0.05],
                    "rotation": [ { "y": 0}, {"x": -92}, {"z": 0} ],
                    "scale": 0.07
                },
                "gui": {
                    "translation": [0, -0.1, 0],
                    "scale": 0.16
                }
            }
        }]
    }
}

 

In the textures "#Usp" has to match the material name, that is in the mtl file.

Also check out the Forge's ModelLoaderRegistryDebug.class in github, also the resources and the actual debug obj/mtl files. You need to correct some data in your model, or in wont load!

Posted

So my problem was me putting the forge state json in the wrong place, I had put it in the items folder.

I ended up writing my own baked model that extended OBJBakedModel.

Not a waste of time though as I needed to change the render based on nbt anyway.

 

I ran into the obj/mtl file edits requirement while working on blocks, but the Debug files helped out there.

Only issues there is:

- not knowing how to get the "custom" tag, but I don't think that can be done as the debug is just a placeholder last I checked.

- break particles being white, block renders fine though. Had the same issue when I used a model and mtl from the debug folders, so maybe not implemented yet.

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.