Jump to content

[1.12.2] [Solved] Unable to load texture onto a model


WORMSTweaker

Recommended Posts

Hello!
I'm trying, for now at least, to render a small model onto the player model
I first tried to use layers, but then I simply rendered my model on the player entity when the player is rendered.
Anyway, for now, my problem is, that my model doesn't have any textures, and that Minecraft simply spit this error:
 

Spoiler

[Client thread/WARN] [minecraft/TextureManager]: Failed to load texture: hyper:textures/render/modelcube.png
java.io.FileNotFoundException: hyper:textures/render/modelcube.png
	at net.minecraft.client.resources.SimpleReloadableResourceManager.getResource(SimpleReloadableResourceManager.java:69) ~[SimpleReloadableResourceManager.class:?]
	at net.minecraft.client.renderer.texture.SimpleTexture.loadTexture(SimpleTexture.java:34) ~[SimpleTexture.class:?]
	at net.minecraft.client.renderer.texture.TextureManager.loadTexture(TextureManager.java:69) [TextureManager.class:?]
	at net.minecraft.client.renderer.texture.TextureManager.bindTexture(TextureManager.java:44) [TextureManager.class:?]
	at net.minecraft.client.renderer.entity.Render.bindTexture(Render.java:130) [Render.class:?]
	at net.minecraft.client.renderer.entity.Render.bindEntityTexture(Render.java:123) [Render.class:?]
	at net.minecraft.client.renderer.entity.RenderLivingBase.renderModel(RenderLivingBase.java:251) [RenderLivingBase.class:?]
	at net.minecraft.client.renderer.entity.RenderLivingBase.doRender(RenderLivingBase.java:183) [RenderLivingBase.class:?]
	at fr.wormstweaker.hyper.EventHandlerClient.onPlayerRender(EventHandlerClient.java:46) [EventHandlerClient.class:?]
	at net.minecraftforge.fml.common.eventhandler.ASMEventHandler_5_EventHandlerClient_onPlayerRender_Post.invoke(.dynamic) [?:?]
	at net.minecraftforge.fml.common.eventhandler.ASMEventHandler.invoke(ASMEventHandler.java:90) [ASMEventHandler.class:?]
	at net.minecraftforge.fml.common.eventhandler.EventBus.post(EventBus.java:182) [EventBus.class:?]
	at net.minecraft.client.renderer.entity.RenderPlayer.doRender(RenderPlayer.java:78) [RenderPlayer.class:?]
	at net.minecraft.client.renderer.entity.RenderPlayer.doRender(RenderPlayer.java:28) [RenderPlayer.class:?]
	at net.minecraft.client.renderer.entity.RenderManager.renderEntity(RenderManager.java:390) [RenderManager.class:?]
	at net.minecraft.client.renderer.entity.RenderManager.renderEntityStatic(RenderManager.java:374) [RenderManager.class:?]
	at net.minecraft.client.renderer.RenderGlobal.renderEntities(RenderGlobal.java:655) [RenderGlobal.class:?]
	at net.minecraft.client.renderer.EntityRenderer.renderWorldPass(EntityRenderer.java:1400) [EntityRenderer.class:?]
	at net.minecraft.client.renderer.EntityRenderer.renderWorld(EntityRenderer.java:1312) [EntityRenderer.class:?]
	at net.minecraft.client.renderer.EntityRenderer.updateCameraAndRender(EntityRenderer.java:1115) [EntityRenderer.class:?]
	at net.minecraft.client.Minecraft.runGameLoop(Minecraft.java:1209) [Minecraft.class:?]
	at net.minecraft.client.Minecraft.run(Minecraft.java:442) [Minecraft.class:?]
	at net.minecraft.client.main.Main.main(Main.java:118) [Main.class:?]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_171]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_171]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_171]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_171]
	at net.minecraft.launchwrapper.Launch.launch(Launch.java:135) [launchwrapper-1.12.jar:?]
	at net.minecraft.launchwrapper.Launch.main(Launch.java:28) [launchwrapper-1.12.jar:?]
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[?:1.8.0_171]
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[?:1.8.0_171]
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[?:1.8.0_171]
	at java.lang.reflect.Method.invoke(Method.java:498) ~[?:1.8.0_171]
	at net.minecraftforge.gradle.GradleStartCommon.launch(GradleStartCommon.java:97) [start/:?]
	at GradleStart.main(GradleStart.java:25) [start/:?]

 

Of course, the file does exist, my path in my ResourceLocation is correct, but still no textures.
I register my model entity in my ClientProxy:
 

Spoiler

SideOnly(Side.CLIENT)
public class ClientProxy extends CommonProxy {
   @Override
    public void preInit()
    {
      super.preInit();
    }
    @Override
    public void init()
    {}
    @Override
    public void postInit()
    {}

    @Override
    @SideOnly(Side.CLIENT)
    public void registerRenderers()
    {
      RenderingRegistry.registerEntityRenderingHandler(EntityPlayer.class, RenderCube::new);
      System.out.println("Registered renderer");
    }
}

 

And I render it on the onPlayerRender event, in my EventHandlerClient:

Spoiler

@Mod.EventBusSubscriber
public class EventHandlerClient {

    @SideOnly(Side.CLIENT)
    @SubscribeEvent
    public static void onHandRender(RenderHandEvent event)
    {
        //TODO: Fill this up
    }

    @SideOnly(Side.CLIENT)
    @SubscribeEvent
    public static void onPlayerRender(RenderPlayerEvent.Pre event)
    {
        ResourceLocation texture = new ResourceLocation(Hyper.MOD_ID,"textures/render/modelcube.png");
        RenderManager manager = Minecraft.getMinecraft().getRenderManager();
        RenderCube cubeRenderer = new RenderCube(manager);
        RenderCube.setCubeTextures(texture);	//Setting the texture directly trough the model
        //cubeRenderer.bindTexture(texture);	//Or else nothing renders
        cubeRenderer.doRender(event.getEntityLiving(), 0D, 0D, 0D, 0.65F, 0.65F);
    }

}

 

RenderCube:
 

Spoiler

public class RenderCube extends RenderLivingBase {

  private static ResourceLocation cubeTextures = null;

  public RenderCube(RenderManager renderManagerIn) {
    super(renderManagerIn, new ModelCube(), 0.0F);
  }

  public static void setCubeTextures(ResourceLocation texture)
  {
    cubeTextures = texture;
  }

  @Nullable
  @Override
  protected ResourceLocation getEntityTexture(Entity entity) {
    return cubeTextures;
  }
}

 

And the model, for good measure:
 

Spoiler

/**
 * ModelCube - WORMSTweaker
 * Created using Tabula 7.0.1
 */
public class ModelCube extends ModelBase {
    public ModelRenderer Cube;

    public ModelCube() {
        this.textureWidth = 4;
        this.textureHeight = 2;
        this.Cube = new ModelRenderer(this, 0, 0);
        this.Cube.setRotationPoint(0.6F, 12.0F, -2.5F);
        this.Cube.addBox(-0.5F, -0.5F, -0.5F, 1, 1, 1, 10.0F);
    }

    @Override
    public void render(Entity entity, float f, float f1, float f2, float f3, float f4, float f5) { 
        this.Cube.render(f5);
    }

    /**
     * This is a helper function from Tabula to set the rotation of model parts
     */
    public void setRotateAngle(ModelRenderer modelRenderer, float x, float y, float z) {
        modelRenderer.rotateAngleX = x;
        modelRenderer.rotateAngleY = y;
        modelRenderer.rotateAngleZ = z;
    }
}

 

I'm using Intellij, and before you ask, I already tried to put 'idea { module { inheritOutputDirs = true } }' or similar stuff to try to fix this kind of error.
If anybody has a clue on what's going on, feel free to respond! And also, if you have some time, maybe you can teach me how to use layers on the player model, as I think it would be more appropriate to use them instead of rendering directly over the player model.

Edited by WORMSTweaker
Solved
Link to comment
Share on other sites

  • Okay, removed the @SideOnly
  • Is a check like this a good solution, or should I find another way to do it?
    Spoiler
    
        private static boolean renderManagerStarted = false;
        private static ResourceLocation texture;
        private static RenderCube cubeRenderer;
    
        @SubscribeEvent
        public static void onPlayerRender(RenderPlayerEvent.Pre event)
        {
            if(!renderManagerStarted)
            {
                texture = new ResourceLocation(Hyper.MOD_ID, "textures/render/modelcube.png");
                RenderManager manager = Minecraft.getMinecraft().getRenderManager();
                cubeRenderer = new RenderCube(manager);
                renderManagerStarted = true;
            }
    	}

     

  • This strange setup (as I stated in the comments next to RenderCube.setCubeTextures(texture); ) is to let me change the texture without directly accessing the cubeTextures in the RenderCube class. I agree that it is weird, and probably useless, so I might remove it.
    Also, if the model isn't assigned a texture, it doesn't render at all, not even with a missing texture pattern. This might indicate that I again did something wrong.

    Why would you want me to return the texture? Since i'm trying to assign the texture to my model, why should I use getEntityTexture()?
  • My evidence that it does exist, please do not pay attention to the fact that my classes are not organized, I will do that when I'll get a working render:
    idea64_2019-06-17_12-43-25.png.ede0ccf77106331a8a52a6e9f8956360.png
Link to comment
Share on other sites

  • getEntityTexture() simply returns null,which is expected since I'm not giving any texture to the model inside the RenderCube class, and I want to assign the texture from outside the renderer
    What should I do to achieve this the correct way?
  • Urgh, again I missed out something this simple, even though I looked at previous code that I made, and countless examples...
    It does work and load correctly now, when I'm using my weird setCubeTextures() function
Link to comment
Share on other sites

Yes of course, but I was just saying that since I'm not setting any texture (unless I directly access RenderCube.cubeTextures or use setCubeTextures() ) cubeTextures is null, and that it is normal that I get this null

Now again, since I'm trying to change this texture from outside of the RenderCube class, should I simply do something like RenderCube.cubeTextures = new ResourceLocation(Hyper.MOD_ID, "bla/bla/new/path"), or should I do it differently?

Link to comment
Share on other sites

I'm planning on making my model change the way it looks when a certain event happen, and so I just want to be sure that it is the right way to change the model texture

I suppose that the change should be immediate? Since I'm calling cubeRenderer.doRender() each frame

Link to comment
Share on other sites

I'm not going to lie, I'm having trouble understanding what you want me to do with getEntityTexture()...
I understand that it returns cubeTexture, and also as I read is apparently called when do .bindTextures(), but I don't know how it can help me change the texture itself. Mind developping a bit?
Also, please excuse my lack of knowledge on the matter

Link to comment
Share on other sites

Oh okay, I didn't knew you were talking about making something like this

Anyway, thanks for your help!
I'm going to mark this as solved now, and as I said in my first post, look at how layers works, since it seems a bit more appropriated for what I want to do with my model

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.