Posted July 14, 20169 yr I have created some working smart baked models, but they all have the same strange bug. In most chunks (16x16x16 chunks, not 16x16 from world height to bedrock) the model renders very dark. The texture is still rendered if you look closely, but incredibly darkly. Every time any block in one of those chunks that is working is changed (even a block not touching the baked model blocks) the chunk changes to be broken. Every time I close and re-open the world, which chunks are broken resets and changes, each time to a seemingly random pattern. Here are a couple of screenshots to demonstrate: What they should look like: What the broken ones look like: And an overview of a bunch of working and broken chunks And this is the code for the baked model itself: public class ConduitBakedModel implements IBakedModel{ private TextureAtlasSprite temp;//TODO private VertexFormat format; private Function<ResourceLocation, TextureAtlasSprite> bakedTextureGetter; public static final ModelResourceLocation BAKED_MODEL = new ModelResourceLocation(Main.MODID + ":heatcable"); public ConduitBakedModel(IModelState state, VertexFormat format, Function<ResourceLocation, TextureAtlasSprite> bakedTextureGetter) { this.bakedTextureGetter = bakedTextureGetter; this.format = format; } private void putVertex(UnpackedBakedQuad.Builder builder, Vec3d normal, double x, double y, double z, float u, float v, TextureAtlasSprite sprite) { for (int e = 0; e < format.getElementCount(); e++) { switch (format.getElement(e).getUsage()) { case POSITION: builder.put(e, (float)x, (float)y, (float)z, 1.0f); break; case COLOR: builder.put(e, 1.0f, 1.0f, 1.0f, 1.0f); break; case UV: if (format.getElement(e).getIndex() == 0) { u = sprite.getInterpolatedU(u); v = sprite.getInterpolatedV(v); builder.put(e, u, v, 0f, 1f); break; } case NORMAL: builder.put(e, (float) normal.xCoord, (float) normal.yCoord, (float) normal.zCoord, 0f); break; default: builder.put(e); break; } } } private BakedQuad createQuad(Vec3d v1, Vec3d v2, Vec3d v3, Vec3d v4, TextureAtlasSprite sprite) { Vec3d normal = v1.subtract(v2).crossProduct(v3.subtract(v2)); UnpackedBakedQuad.Builder builder = new UnpackedBakedQuad.Builder(format); builder.setTexture(sprite); putVertex(builder, normal, v1.xCoord, v1.yCoord, v1.zCoord, 0, 0, sprite); putVertex(builder, normal, v2.xCoord, v2.yCoord, v2.zCoord, 0, 16, sprite); putVertex(builder, normal, v3.xCoord, v3.yCoord, v3.zCoord, 16, 16, sprite); putVertex(builder, normal, v4.xCoord, v4.yCoord, v4.zCoord, 16, 0, sprite); return builder.build(); } @Override public List<BakedQuad> getQuads(IBlockState state, EnumFacing side, long rand) { if (side != null) { return Collections.emptyList(); } TextureAtlasSprite sprite = bakedTextureGetter.apply(((IConduitModel) state.getBlock()).getTexture()); temp = sprite; //TODO IExtendedBlockState extendedBlockState = (IExtendedBlockState) state; Boolean north = extendedBlockState.getValue(Properties.CONNECT)[2]; Boolean south = extendedBlockState.getValue(Properties.CONNECT)[3]; Boolean west = extendedBlockState.getValue(Properties.CONNECT)[4]; Boolean east = extendedBlockState.getValue(Properties.CONNECT)[5]; Boolean up = extendedBlockState.getValue(Properties.CONNECT)[1]; Boolean down = extendedBlockState.getValue(Properties.CONNECT)[0]; List<BakedQuad> quads = new ArrayList<>(); double o = ((IConduitModel) state.getBlock()).getSize(); // For each side we either cap it off if there is no similar block adjacent on that side // or else we extend so that we touch the adjacent block: if (up) { quads.add(createQuad(new Vec3d(1 - o, 1 - o, o), new Vec3d(1 - o, 1, o), new Vec3d(1 - o, 1, 1 - o), new Vec3d(1 - o, 1 - o, 1 - o), sprite)); quads.add(createQuad(new Vec3d(o, 1 - o, 1 - o), new Vec3d(o, 1, 1 - o), new Vec3d(o, 1, o), new Vec3d(o, 1 - o, o), sprite)); quads.add(createQuad(new Vec3d(o, 1, o), new Vec3d(1 - o, 1, o), new Vec3d(1 - o, 1 - o, o), new Vec3d(o, 1 - o, o), sprite)); quads.add(createQuad(new Vec3d(o, 1 - o, 1 - o), new Vec3d(1 - o, 1 - o, 1 - o), new Vec3d(1 - o, 1, 1 - o), new Vec3d(o, 1, 1 - o), sprite)); } else { quads.add(createQuad(new Vec3d(o, 1 - o, 1 - o), new Vec3d(1 - o, 1 - o, 1 - o), new Vec3d(1 - o, 1 - o, o), new Vec3d(o, 1 - o, o), sprite)); } if (down) { quads.add(createQuad(new Vec3d(1 - o, 0, o), new Vec3d(1 - o, o, o), new Vec3d(1 - o, o, 1 - o), new Vec3d(1 - o, 0, 1 - o), sprite)); quads.add(createQuad(new Vec3d(o, 0, 1 - o), new Vec3d(o, o, 1 - o), new Vec3d(o, o, o), new Vec3d(o, 0, o), sprite)); quads.add(createQuad(new Vec3d(o, o, o), new Vec3d(1 - o, o, o), new Vec3d(1 - o, 0, o), new Vec3d(o, 0, o), sprite)); quads.add(createQuad(new Vec3d(o, 0, 1 - o), new Vec3d(1 - o, 0, 1 - o), new Vec3d(1 - o, o, 1 - o), new Vec3d(o, o, 1 - o), sprite)); } else { quads.add(createQuad(new Vec3d(o, o, o), new Vec3d(1 - o, o, o), new Vec3d(1 - o, o, 1 - o), new Vec3d(o, o, 1 - o), sprite)); } if (east) { quads.add(createQuad(new Vec3d(1 - o, 1 - o, 1 - o), new Vec3d(1, 1 - o, 1 - o), new Vec3d(1, 1 - o, o), new Vec3d(1 - o, 1 - o, o), sprite)); quads.add(createQuad(new Vec3d(1 - o, o, o), new Vec3d(1, o, o), new Vec3d(1, o, 1 - o), new Vec3d(1 - o, o, 1 - o), sprite)); quads.add(createQuad(new Vec3d(1 - o, 1 - o, o), new Vec3d(1, 1 - o, o), new Vec3d(1, o, o), new Vec3d(1 - o, o, o), sprite)); quads.add(createQuad(new Vec3d(1 - o, o, 1 - o), new Vec3d(1, o, 1 - o), new Vec3d(1, 1 - o, 1 - o), new Vec3d(1 - o, 1 - o, 1 - o), sprite)); } else { quads.add(createQuad(new Vec3d(1 - o, o, o), new Vec3d(1 - o, 1 - o, o), new Vec3d(1 - o, 1 - o, 1 - o), new Vec3d(1 - o, o, 1 - o), sprite)); } if (west) { quads.add(createQuad(new Vec3d(0, 1 - o, 1 - o), new Vec3d(o, 1 - o, 1 - o), new Vec3d(o, 1 - o, o), new Vec3d(0, 1 - o, o), sprite)); quads.add(createQuad(new Vec3d(0, o, o), new Vec3d(o, o, o), new Vec3d(o, o, 1 - o), new Vec3d(0, o, 1 - o), sprite)); quads.add(createQuad(new Vec3d(0, 1 - o, o), new Vec3d(o, 1 - o, o), new Vec3d(o, o, o), new Vec3d(0, o, o), sprite)); quads.add(createQuad(new Vec3d(0, o, 1 - o), new Vec3d(o, o, 1 - o), new Vec3d(o, 1 - o, 1 - o), new Vec3d(0, 1 - o, 1 - o), sprite)); } else { quads.add(createQuad(new Vec3d(o, o, 1 - o), new Vec3d(o, 1 - o, 1 - o), new Vec3d(o, 1 - o, o), new Vec3d(o, o, o), sprite)); } if (north) { quads.add(createQuad(new Vec3d(o, 1 - o, o), new Vec3d(1 - o, 1 - o, o), new Vec3d(1 - o, 1 - o, 0), new Vec3d(o, 1 - o, 0), sprite)); quads.add(createQuad(new Vec3d(o, o, 0), new Vec3d(1 - o, o, 0), new Vec3d(1 - o, o, o), new Vec3d(o, o, o), sprite)); quads.add(createQuad(new Vec3d(1 - o, o, 0), new Vec3d(1 - o, 1 - o, 0), new Vec3d(1 - o, 1 - o, o), new Vec3d(1 - o, o, o), sprite)); quads.add(createQuad(new Vec3d(o, o, o), new Vec3d(o, 1 - o, o), new Vec3d(o, 1 - o, 0), new Vec3d(o, o, 0), sprite)); } else { quads.add(createQuad(new Vec3d(o, 1 - o, o), new Vec3d(1 - o, 1 - o, o), new Vec3d(1 - o, o, o), new Vec3d(o, o, o), sprite)); } if (south) { quads.add(createQuad(new Vec3d(o, 1 - o, 1), new Vec3d(1 - o, 1 - o, 1), new Vec3d(1 - o, 1 - o, 1 - o), new Vec3d(o, 1 - o, 1 - o), sprite)); quads.add(createQuad(new Vec3d(o, o, 1 - o), new Vec3d(1 - o, o, 1 - o), new Vec3d(1 - o, o, 1), new Vec3d(o, o, 1), sprite)); quads.add(createQuad(new Vec3d(1 - o, o, 1 - o), new Vec3d(1 - o, 1 - o, 1 - o), new Vec3d(1 - o, 1 - o, 1), new Vec3d(1 - o, o, 1), sprite)); quads.add(createQuad(new Vec3d(o, o, 1), new Vec3d(o, 1 - o, 1), new Vec3d(o, 1 - o, 1 - o), new Vec3d(o, o, 1 - o), sprite)); } else { quads.add(createQuad(new Vec3d(o, o, 1 - o), new Vec3d(1 - o, o, 1 - o), new Vec3d(1 - o, 1 - o, 1 - o), new Vec3d(o, 1 - o, 1 - o), sprite)); } return quads; } @Override public ItemOverrideList getOverrides() { return null; } @Override public boolean isAmbientOcclusion() { return false; } @Override public boolean isGui3d() { return false; } @Override public boolean isBuiltInRenderer() { return false; } @Override public TextureAtlasSprite getParticleTexture() { return temp; } @Override public ItemCameraTransforms getItemCameraTransforms() { return ItemCameraTransforms.DEFAULT; } }
October 1, 20169 yr You could solve the problem? I have a similar problem and want to solve it but do not think tips on how to do this.
October 1, 20169 yr Probably a total shot in the dark (get it? Lol!) but have you tried getting light from neighbours to keep it at the same light level?
February 13, 20178 yr Hi, just poking around with the same model in 11.2 to make it work, I had to add the line: builder.setApplyDiffuseLighting(false); after the line builder.setTexture(sprite); Hope that helps
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.