Merge branch 'mc1.18/dev' into mc1.18/global-railways

Conflicts:
	gradle.properties
	src/main/java/com/simibubi/create/foundation/render/SuperByteBuffer.java
This commit is contained in:
PepperCode1 2022-02-21 10:51:42 -08:00
commit fcb5267ae0
100 changed files with 703 additions and 731 deletions

View file

@ -49,6 +49,7 @@ body:
label: Mod Version label: Mod Version
description: The version of the mod you were using when the bug occured description: The version of the mod you were using when the bug occured
options: options:
- "0.4.0d"
- "0.4.0c" - "0.4.0c"
- "0.4.0b" - "0.4.0b"
- "0.4.0a" - "0.4.0a"

View file

@ -27,10 +27,10 @@ boolean dev = System.getenv('RELEASE') == null || System.getenv('RELEASE').equal
// The project is named Flywheel-Forge, but sub-projects are named by folder. // The project is named Flywheel-Forge, but sub-projects are named by folder.
boolean inWorkspace = findProject(':Flywheel') != null boolean inWorkspace = findProject(':Flywheel') != null
ext.buildnumber = 0 ext.buildNumber = System.getenv('BUILD_NUMBER')
project.buildnumber = System.getenv('BUILD_NUMBER') != null ? System.getenv('BUILD_NUMBER') : 'custom' if (buildNumber == null) buildNumber = 'custom'
version = "mc${minecraft_version}_v${mod_version}" + (dev && !buildnumber.equals('custom') ? "+${buildnumber}" : '') version = "mc${minecraft_version}_v${mod_version}" + (dev && !buildNumber.equals('custom') ? "+${buildNumber}" : '')
group = 'com.simibubi.create' group = 'com.simibubi.create'
archivesBaseName = 'create' archivesBaseName = 'create'

View file

@ -19,9 +19,9 @@ parchment_version = 2022.01.23
# dependency versions # dependency versions
registrate_version = MC1.18-1.0.21 registrate_version = MC1.18-1.0.21
flywheel_version = 1.18-0.6.1.57 flywheel_version = 1.18-0.6.1.62
jei_minecraft_version = 1.18.1 jei_minecraft_version = 1.18.1
jei_version = 9.2.1.69 jei_version = 9.3.2.92
# curseforge information # curseforge information
projectId = 328085 projectId = 328085

View file

@ -289,16 +289,17 @@ public class AllItems {
public static final ItemEntry<PotatoCannonItem> POTATO_CANNON = public static final ItemEntry<PotatoCannonItem> POTATO_CANNON =
REGISTRATE.item("potato_cannon", PotatoCannonItem::new) REGISTRATE.item("potato_cannon", PotatoCannonItem::new)
.properties(p -> p.stacksTo(1))
.model(AssetLookup.itemModelWithPartials()) .model(AssetLookup.itemModelWithPartials())
.register(); .register();
public static final ItemEntry<ExtendoGripItem> EXTENDO_GRIP = REGISTRATE.item("extendo_grip", ExtendoGripItem::new) public static final ItemEntry<ExtendoGripItem> EXTENDO_GRIP = REGISTRATE.item("extendo_grip", ExtendoGripItem::new)
.properties(p -> p.rarity(Rarity.UNCOMMON))
.model(AssetLookup.itemModelWithPartials()) .model(AssetLookup.itemModelWithPartials())
.register(); .register();
public static final ItemEntry<SymmetryWandItem> WAND_OF_SYMMETRY = public static final ItemEntry<SymmetryWandItem> WAND_OF_SYMMETRY =
REGISTRATE.item("wand_of_symmetry", SymmetryWandItem::new) REGISTRATE.item("wand_of_symmetry", SymmetryWandItem::new)
.properties(p -> p.stacksTo(1).rarity(Rarity.UNCOMMON))
.model(AssetLookup.itemModelWithPartials()) .model(AssetLookup.itemModelWithPartials())
.register(); .register();

View file

@ -110,6 +110,7 @@ public class CreateClient {
public static void invalidateRenderers() { public static void invalidateRenderers() {
BUFFER_CACHE.invalidate(); BUFFER_CACHE.invalidate();
SCHEMATIC_HANDLER.updateRenderers();
ContraptionRenderDispatcher.reset(); ContraptionRenderDispatcher.reset();
} }

View file

@ -3,6 +3,7 @@ package com.simibubi.create.compat.jei.category;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.AllItems; import com.simibubi.create.AllItems;
import com.simibubi.create.compat.jei.category.animations.AnimatedKinetics; import com.simibubi.create.compat.jei.category.animations.AnimatedKinetics;
import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.gui.element.GuiGameElement; import com.simibubi.create.foundation.gui.element.GuiGameElement;
import net.minecraft.world.item.Items; import net.minecraft.world.item.Items;
@ -21,16 +22,17 @@ public class FanBlastingCategory extends ProcessingViaFanCategory<AbstractCookin
} }
@Override @Override
public void renderAttachedBlock(PoseStack matrixStack) { protected AllGuiTextures getBlockShadow() {
matrixStack.pushPose(); return AllGuiTextures.JEI_LIGHT;
}
@Override
protected void renderAttachedBlock(PoseStack matrixStack) {
GuiGameElement.of(Fluids.LAVA) GuiGameElement.of(Fluids.LAVA)
.scale(24) .scale(SCALE)
.atLocal(0, 0, 2) .atLocal(0, 0, 2)
.lighting(AnimatedKinetics.DEFAULT_LIGHTING) .lighting(AnimatedKinetics.DEFAULT_LIGHTING)
.render(matrixStack); .render(matrixStack);
matrixStack.popPose();
} }
} }

View file

@ -1,27 +1,19 @@
package com.simibubi.create.compat.jei.category; package com.simibubi.create.compat.jei.category;
import java.util.Arrays;
import java.util.List;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.AllItems; import com.simibubi.create.AllItems;
import com.simibubi.create.compat.jei.category.animations.AnimatedKinetics; import com.simibubi.create.compat.jei.category.animations.AnimatedKinetics;
import com.simibubi.create.content.contraptions.components.fan.HauntingRecipe; import com.simibubi.create.content.contraptions.components.fan.HauntingRecipe;
import com.simibubi.create.content.contraptions.processing.ProcessingOutput;
import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.gui.element.GuiGameElement; import com.simibubi.create.foundation.gui.element.GuiGameElement;
import mezz.jei.api.constants.VanillaTypes;
import mezz.jei.api.gui.IRecipeLayout;
import mezz.jei.api.gui.ingredient.IGuiItemStackGroup;
import mezz.jei.api.ingredients.IIngredients;
import net.minecraft.world.item.Items; import net.minecraft.world.item.Items;
import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.Blocks;
public class FanHauntingCategory extends ProcessingViaFanCategory<HauntingRecipe> { public class FanHauntingCategory extends ProcessingViaFanCategory.MultiOutput<HauntingRecipe> {
public FanHauntingCategory() { public FanHauntingCategory() {
super(185, doubleItemIcon(AllItems.PROPELLER.get(), Items.SOUL_CAMPFIRE)); super(doubleItemIcon(AllItems.PROPELLER.get(), Items.SOUL_CAMPFIRE));
} }
@Override @Override
@ -30,76 +22,17 @@ public class FanHauntingCategory extends ProcessingViaFanCategory<HauntingRecipe
} }
@Override @Override
public void setIngredients(HauntingRecipe recipe, IIngredients ingredients) { protected AllGuiTextures getBlockShadow() {
ingredients.setInputIngredients(recipe.getIngredients()); return AllGuiTextures.JEI_LIGHT;
ingredients.setOutputs(VanillaTypes.ITEM, recipe.getRollableResultsAsItemStacks());
} }
@Override @Override
public void setRecipe(IRecipeLayout recipeLayout, HauntingRecipe recipe, IIngredients ingredients) { protected void renderAttachedBlock(PoseStack matrixStack) {
IGuiItemStackGroup itemStacks = recipeLayout.getItemStacks();
List<ProcessingOutput> results = recipe.getRollableResults();
int xOffsetGlobal = 8 * (3 - Math.min(3, results.size()));
itemStacks.init(0, true, xOffsetGlobal + 12, 47);
itemStacks.set(0, Arrays.asList(recipe.getIngredients()
.get(0)
.getItems()));
boolean single = results.size() == 1;
boolean excessive = results.size() > 9;
for (int outputIndex = 0; outputIndex < results.size(); outputIndex++) {
int xOffset = (outputIndex % 3) * 19;
int yOffset = (outputIndex / 3) * -19;
itemStacks.init(outputIndex + 1, false, xOffsetGlobal + (single ? 126 : 126 + xOffset),
47 + yOffset + (excessive ? 8 : 0));
itemStacks.set(outputIndex + 1, results.get(outputIndex)
.getStack());
}
addStochasticTooltip(itemStacks, results);
}
@Override
protected void renderWidgets(PoseStack matrixStack, HauntingRecipe recipe, double mouseX, double mouseY) {
int size = recipe.getRollableResultsAsItemStacks()
.size();
int xOffsetGlobal = 8 * (3 - Math.min(3, size));
AllGuiTextures.JEI_SLOT.render(matrixStack, xOffsetGlobal + 12, 47);
AllGuiTextures.JEI_SHADOW.render(matrixStack, 47 + 4, 29);
AllGuiTextures.JEI_SHADOW.render(matrixStack, 66 + 4, 39);
AllGuiTextures.JEI_LONG_ARROW.render(matrixStack, xOffsetGlobal + 42, 51);
if (size == 1) {
getRenderedSlot(recipe, 0).render(matrixStack, xOffsetGlobal + 126, 47);
return;
}
for (int i = 0; i < size; i++) {
int xOffset = (i % 3) * 19;
int yOffset = (i / 3) * -19 + (size > 9 ? 8 : 0);
getRenderedSlot(recipe, i).render(matrixStack, xOffsetGlobal + 126 + xOffset, 47 + yOffset);
}
}
@Override
protected void translateFan(PoseStack ms) {
ms.translate(56 + 4, 33, 0);
}
@Override
public void renderAttachedBlock(PoseStack matrixStack) {
matrixStack.pushPose();
GuiGameElement.of(Blocks.SOUL_FIRE.defaultBlockState()) GuiGameElement.of(Blocks.SOUL_FIRE.defaultBlockState())
.scale(24) .scale(SCALE)
.atLocal(0, 0, 2) .atLocal(0, 0, 2)
.lighting(AnimatedKinetics.DEFAULT_LIGHTING) .lighting(AnimatedKinetics.DEFAULT_LIGHTING)
.render(matrixStack); .render(matrixStack);
matrixStack.popPose();
} }
} }

View file

@ -2,6 +2,8 @@ package com.simibubi.create.compat.jei.category;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.AllItems; import com.simibubi.create.AllItems;
import com.simibubi.create.compat.jei.category.animations.AnimatedKinetics;
import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.gui.element.GuiGameElement; import com.simibubi.create.foundation.gui.element.GuiGameElement;
import net.minecraft.world.item.Items; import net.minecraft.world.item.Items;
@ -20,11 +22,17 @@ public class FanSmokingCategory extends ProcessingViaFanCategory<SmokingRecipe>
} }
@Override @Override
public void renderAttachedBlock(PoseStack matrixStack) { protected AllGuiTextures getBlockShadow() {
return AllGuiTextures.JEI_LIGHT;
}
@Override
protected void renderAttachedBlock(PoseStack matrixStack) {
GuiGameElement.of(Blocks.FIRE.defaultBlockState()) GuiGameElement.of(Blocks.FIRE.defaultBlockState())
.scale(24) .scale(SCALE)
.atLocal(0, 0, 2) .atLocal(0, 0, 2)
.render(matrixStack); .lighting(AnimatedKinetics.DEFAULT_LIGHTING)
.render(matrixStack);
} }
} }

View file

@ -1,27 +1,18 @@
package com.simibubi.create.compat.jei.category; package com.simibubi.create.compat.jei.category;
import java.util.Arrays;
import java.util.List;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.AllItems; import com.simibubi.create.AllItems;
import com.simibubi.create.compat.jei.category.animations.AnimatedKinetics; import com.simibubi.create.compat.jei.category.animations.AnimatedKinetics;
import com.simibubi.create.content.contraptions.components.fan.SplashingRecipe; import com.simibubi.create.content.contraptions.components.fan.SplashingRecipe;
import com.simibubi.create.content.contraptions.processing.ProcessingOutput;
import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.gui.element.GuiGameElement; import com.simibubi.create.foundation.gui.element.GuiGameElement;
import mezz.jei.api.constants.VanillaTypes;
import mezz.jei.api.gui.IRecipeLayout;
import mezz.jei.api.gui.ingredient.IGuiItemStackGroup;
import mezz.jei.api.ingredients.IIngredients;
import net.minecraft.world.item.Items; import net.minecraft.world.item.Items;
import net.minecraft.world.level.material.Fluids; import net.minecraft.world.level.material.Fluids;
public class FanWashingCategory extends ProcessingViaFanCategory<SplashingRecipe> { public class FanWashingCategory extends ProcessingViaFanCategory.MultiOutput<SplashingRecipe> {
public FanWashingCategory() { public FanWashingCategory() {
super(185, doubleItemIcon(AllItems.PROPELLER.get(), Items.WATER_BUCKET)); super(doubleItemIcon(AllItems.PROPELLER.get(), Items.WATER_BUCKET));
} }
@Override @Override
@ -30,76 +21,12 @@ public class FanWashingCategory extends ProcessingViaFanCategory<SplashingRecipe
} }
@Override @Override
public void setIngredients(SplashingRecipe recipe, IIngredients ingredients) { protected void renderAttachedBlock(PoseStack matrixStack) {
ingredients.setInputIngredients(recipe.getIngredients());
ingredients.setOutputs(VanillaTypes.ITEM, recipe.getRollableResultsAsItemStacks());
}
@Override
public void setRecipe(IRecipeLayout recipeLayout, SplashingRecipe recipe, IIngredients ingredients) {
IGuiItemStackGroup itemStacks = recipeLayout.getItemStacks();
List<ProcessingOutput> results = recipe.getRollableResults();
int xOffsetGlobal = 8 * (3 - Math.min(3, results.size()));
itemStacks.init(0, true, xOffsetGlobal + 12, 47);
itemStacks.set(0, Arrays.asList(recipe.getIngredients()
.get(0)
.getItems()));
boolean single = results.size() == 1;
boolean excessive = results.size() > 9;
for (int outputIndex = 0; outputIndex < results.size(); outputIndex++) {
int xOffset = (outputIndex % 3) * 19;
int yOffset = (outputIndex / 3) * -19;
itemStacks.init(outputIndex + 1, false, xOffsetGlobal + (single ? 126 : 126 + xOffset),
47 + yOffset + (excessive ? 8 : 0));
itemStacks.set(outputIndex + 1, results.get(outputIndex)
.getStack());
}
addStochasticTooltip(itemStacks, results);
}
@Override
protected void renderWidgets(PoseStack matrixStack, SplashingRecipe recipe, double mouseX, double mouseY) {
int size = recipe.getRollableResultsAsItemStacks()
.size();
int xOffsetGlobal = 8 * (3 - Math.min(3, size));
AllGuiTextures.JEI_SLOT.render(matrixStack, xOffsetGlobal + 12, 47);
AllGuiTextures.JEI_SHADOW.render(matrixStack, 47 + 4, 29);
AllGuiTextures.JEI_SHADOW.render(matrixStack, 66 + 4, 39);
AllGuiTextures.JEI_LONG_ARROW.render(matrixStack, xOffsetGlobal + 42, 51);
if (size == 1) {
getRenderedSlot(recipe, 0).render(matrixStack, xOffsetGlobal + 126, 47);
return;
}
for (int i = 0; i < size; i++) {
int xOffset = (i % 3) * 19;
int yOffset = (i / 3) * -19 + (size > 9 ? 8 : 0);
getRenderedSlot(recipe, i).render(matrixStack, xOffsetGlobal + 126 + xOffset, 47 + yOffset);
}
}
@Override
protected void translateFan(PoseStack ms) {
ms.translate(56 + 4, 33, 0);
}
@Override
public void renderAttachedBlock(PoseStack matrixStack) {
matrixStack.pushPose();
GuiGameElement.of(Fluids.WATER) GuiGameElement.of(Fluids.WATER)
.scale(24) .scale(SCALE)
.atLocal(0, 0, 2) .atLocal(0, 0, 2)
.lighting(AnimatedKinetics.DEFAULT_LIGHTING) .lighting(AnimatedKinetics.DEFAULT_LIGHTING)
.render(matrixStack); .render(matrixStack);
matrixStack.popPose();
} }
} }

View file

@ -1,15 +1,15 @@
package com.simibubi.create.compat.jei.category; package com.simibubi.create.compat.jei.category;
import java.util.Arrays; import java.util.List;
import java.util.function.Supplier; import java.util.function.Supplier;
import javax.annotation.Nullable;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.math.Vector3f; import com.mojang.math.Vector3f;
import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
import com.simibubi.create.compat.jei.category.animations.AnimatedKinetics; import com.simibubi.create.compat.jei.category.animations.AnimatedKinetics;
import com.simibubi.create.content.contraptions.processing.ProcessingOutput;
import com.simibubi.create.content.contraptions.processing.ProcessingRecipe;
import com.simibubi.create.foundation.gui.AllGuiTextures; import com.simibubi.create.foundation.gui.AllGuiTextures;
import com.simibubi.create.foundation.utility.Lang; import com.simibubi.create.foundation.utility.Lang;
@ -23,18 +23,14 @@ import net.minecraft.world.item.crafting.Recipe;
public abstract class ProcessingViaFanCategory<T extends Recipe<?>> extends CreateRecipeCategory<T> { public abstract class ProcessingViaFanCategory<T extends Recipe<?>> extends CreateRecipeCategory<T> {
protected static final int SCALE = 24;
public ProcessingViaFanCategory(IDrawable icon) { public ProcessingViaFanCategory(IDrawable icon) {
this(177, icon); this(178, icon);
} }
protected ProcessingViaFanCategory(int width, IDrawable icon) { public ProcessingViaFanCategory(int width, IDrawable icon) {
super(icon, emptyBackground(width, 71)); super(icon, emptyBackground(width, 72));
}
@Override
public void setIngredients(T recipe, IIngredients ingredients) {
ingredients.setInputIngredients(recipe.getIngredients());
ingredients.setOutput(VanillaTypes.ITEM, recipe.getResultItem());
} }
public static Supplier<ItemStack> getFan(String name) { public static Supplier<ItemStack> getFan(String name) {
@ -43,56 +39,123 @@ public abstract class ProcessingViaFanCategory<T extends Recipe<?>> extends Crea
} }
@Override @Override
public void setRecipe(IRecipeLayout recipeLayout, T recipe, @Nullable IIngredients ingredients) { public void setIngredients(T recipe, IIngredients ingredients) {
IGuiItemStackGroup itemStacks = recipeLayout.getItemStacks(); ingredients.setInputIngredients(recipe.getIngredients());
itemStacks.init(0, true, 20, 47); ingredients.setOutput(VanillaTypes.ITEM, recipe.getResultItem());
itemStacks.set(0, Arrays.asList(recipe.getIngredients()
.get(0)
.getItems()));
itemStacks.init(1, false, 139, 47);
itemStacks.set(1, recipe.getResultItem());
}
protected void renderWidgets(PoseStack matrixStack, T recipe, double mouseX, double mouseY) {
AllGuiTextures.JEI_SLOT.render(matrixStack, 20, 47);
AllGuiTextures.JEI_SLOT.render(matrixStack, 139, 47);
AllGuiTextures.JEI_SHADOW.render(matrixStack, 47, 29);
AllGuiTextures.JEI_LIGHT.render(matrixStack, 66, 39);
AllGuiTextures.JEI_LONG_ARROW.render(matrixStack, 53, 51);
} }
@Override @Override
public void draw(@Nullable T recipe, @Nullable PoseStack matrixStack, double mouseX, double mouseY) { public void setRecipe(IRecipeLayout recipeLayout, T recipe, IIngredients ingredients) {
if (matrixStack == null) IGuiItemStackGroup itemStacks = recipeLayout.getItemStacks();
return;
itemStacks.init(0, true, 20, 47);
itemStacks.set(0, ingredients.getInputs(VanillaTypes.ITEM).get(0));
itemStacks.init(1, false, 140, 47);
itemStacks.set(1, ingredients.getOutputs(VanillaTypes.ITEM).get(0));
}
@Override
public void draw(T recipe, PoseStack matrixStack, double mouseX, double mouseY) {
renderWidgets(matrixStack, recipe, mouseX, mouseY); renderWidgets(matrixStack, recipe, mouseX, mouseY);
matrixStack.pushPose(); matrixStack.pushPose();
translateFan(matrixStack); translateFan(matrixStack);
matrixStack.mulPose(Vector3f.XP.rotationDegrees(-12.5f)); matrixStack.mulPose(Vector3f.XP.rotationDegrees(-12.5f));
matrixStack.mulPose(Vector3f.YP.rotationDegrees(22.5f)); matrixStack.mulPose(Vector3f.YP.rotationDegrees(22.5f));
int scale = 24;
AnimatedKinetics.defaultBlockElement(AllBlockPartials.ENCASED_FAN_INNER) AnimatedKinetics.defaultBlockElement(AllBlockPartials.ENCASED_FAN_INNER)
.rotateBlock(180, 0, AnimatedKinetics.getCurrentAngle() * 16) .rotateBlock(180, 0, AnimatedKinetics.getCurrentAngle() * 16)
.scale(scale) .scale(SCALE)
.render(matrixStack); .render(matrixStack);
AnimatedKinetics.defaultBlockElement(AllBlocks.ENCASED_FAN.getDefaultState()) AnimatedKinetics.defaultBlockElement(AllBlocks.ENCASED_FAN.getDefaultState())
.rotateBlock(0, 180, 0) .rotateBlock(0, 180, 0)
.atLocal(0, 0, 0) .atLocal(0, 0, 0)
.scale(scale) .scale(SCALE)
.render(matrixStack); .render(matrixStack);
renderAttachedBlock(matrixStack); renderAttachedBlock(matrixStack);
matrixStack.popPose(); matrixStack.popPose();
} }
protected void renderWidgets(PoseStack matrixStack, T recipe, double mouseX, double mouseY) {
AllGuiTextures.JEI_SHADOW.render(matrixStack, 46, 29);
getBlockShadow().render(matrixStack, 65, 39);
AllGuiTextures.JEI_LONG_ARROW.render(matrixStack, 54, 51);
AllGuiTextures.JEI_SLOT.render(matrixStack, 20, 47);
AllGuiTextures.JEI_SLOT.render(matrixStack, 140, 47);
}
protected AllGuiTextures getBlockShadow() {
return AllGuiTextures.JEI_SHADOW;
}
protected void translateFan(PoseStack matrixStack) { protected void translateFan(PoseStack matrixStack) {
matrixStack.translate(56, 33, 0); matrixStack.translate(56, 33, 0);
} }
public abstract void renderAttachedBlock(PoseStack matrixStack); protected abstract void renderAttachedBlock(PoseStack matrixStack);
public static abstract class MultiOutput<T extends ProcessingRecipe<?>> extends ProcessingViaFanCategory<T> {
public MultiOutput(IDrawable icon) {
super(icon);
}
public MultiOutput(int width, IDrawable icon) {
super(width, icon);
}
@Override
public void setIngredients(T recipe, IIngredients ingredients) {
ingredients.setInputIngredients(recipe.getIngredients());
ingredients.setOutputs(VanillaTypes.ITEM, recipe.getRollableResultsAsItemStacks());
}
@Override
public void setRecipe(IRecipeLayout recipeLayout, T recipe, IIngredients ingredients) {
IGuiItemStackGroup itemStacks = recipeLayout.getItemStacks();
List<ProcessingOutput> results = recipe.getRollableResults();
int xOffsetAmount = 1 - Math.min(3, results.size());
itemStacks.init(0, true, 5 * xOffsetAmount + 20, 47);
itemStacks.set(0, ingredients.getInputs(VanillaTypes.ITEM).get(0));
int xOffsetOutput = 9 * xOffsetAmount;
boolean excessive = results.size() > 9;
for (int outputIndex = 0; outputIndex < results.size(); outputIndex++) {
int xOffset = (outputIndex % 3) * 19 + xOffsetOutput;
int yOffset = (outputIndex / 3) * -19 + (excessive ? 8 : 0);
itemStacks.init(outputIndex + 1, false, 140 + xOffset, 47 + yOffset);
itemStacks.set(outputIndex + 1, results.get(outputIndex).getStack());
}
addStochasticTooltip(itemStacks, results);
}
@Override
protected void renderWidgets(PoseStack matrixStack, T recipe, double mouseX, double mouseY) {
int size = recipe.getRollableResultsAsItemStacks()
.size();
int xOffsetAmount = 1 - Math.min(3, size);
AllGuiTextures.JEI_SHADOW.render(matrixStack, 46, 29);
getBlockShadow().render(matrixStack, 65, 39);
AllGuiTextures.JEI_LONG_ARROW.render(matrixStack, 7 * xOffsetAmount + 54, 51);
AllGuiTextures.JEI_SLOT.render(matrixStack, 5 * xOffsetAmount + 20, 47);
int xOffsetOutput = 9 * xOffsetAmount;
boolean excessive = size > 9;
for (int i = 0; i < size; i++) {
int xOffset = (i % 3) * 19 + xOffsetOutput;
int yOffset = (i / 3) * -19 + (excessive ? 8 : 0);
getRenderedSlot(recipe, i).render(matrixStack, 140 + xOffset, 47 + yOffset);
}
}
}
} }

View file

@ -127,6 +127,8 @@ public class SequencedAssemblyCategory extends CreateRecipeCategory<SequencedAss
public void draw(SequencedAssemblyRecipe recipe, PoseStack matrixStack, double mouseX, double mouseY) { public void draw(SequencedAssemblyRecipe recipe, PoseStack matrixStack, double mouseX, double mouseY) {
Font font = Minecraft.getInstance().font; Font font = Minecraft.getInstance().font;
matrixStack.pushPose();
matrixStack.pushPose(); matrixStack.pushPose();
matrixStack.translate(0, 15, 0); matrixStack.translate(0, 15, 0);
boolean singleOutput = recipe.getOutputChance() == 1; boolean singleOutput = recipe.getOutputChance() == 1;
@ -171,6 +173,8 @@ public class SequencedAssemblyCategory extends CreateRecipeCategory<SequencedAss
matrixStack.translate(subWidth + margin, 0, 0); matrixStack.translate(subWidth + margin, 0, 0);
} }
matrixStack.popPose(); matrixStack.popPose();
matrixStack.popPose();
} }
@Override @Override

View file

@ -42,7 +42,6 @@ import net.minecraft.world.level.block.Block;
import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.AABB;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn; import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.DistExecutor;
@ -96,7 +95,6 @@ public class KineticTileEntity extends SmartTileEntity
effects.tick(); effects.tick();
if (level.isClientSide) { if (level.isClientSide) {
cachedBoundingBox = null; // cache the bounding box for every frame between ticks
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> this.tickAudio()); DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> this.tickAudio());
return; return;
} }
@ -570,20 +568,6 @@ public class KineticTileEntity extends SmartTileEntity
DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> InstancedRenderDispatcher.enqueueUpdate(this)); DistExecutor.unsafeRunWhenOn(Dist.CLIENT, () -> () -> InstancedRenderDispatcher.enqueueUpdate(this));
} }
protected AABB cachedBoundingBox;
@OnlyIn(Dist.CLIENT)
public AABB getRenderBoundingBox() {
if (cachedBoundingBox == null) {
cachedBoundingBox = makeRenderBoundingBox();
}
return cachedBoundingBox;
}
protected AABB makeRenderBoundingBox() {
return super.getRenderBoundingBox();
}
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
public void tickAudio() { public void tickAudio() {
float componentSpeed = Math.abs(getSpeed()); float componentSpeed = Math.abs(getSpeed());

View file

@ -1,17 +1,13 @@
package com.simibubi.create.content.contraptions.components.actors; package com.simibubi.create.content.contraptions.components.actors;
import com.simibubi.create.foundation.tileEntity.SyncedTileEntity; import com.simibubi.create.foundation.tileEntity.CachedRenderBBTileEntity;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.AABB;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
public class HarvesterTileEntity extends SyncedTileEntity { public class HarvesterTileEntity extends CachedRenderBBTileEntity {
private static final AABB RENDER_BOX = new AABB(0, 0, 0, 1, 1, 1);
// For simulations such as Ponder // For simulations such as Ponder
private float manuallyAnimatedSpeed; private float manuallyAnimatedSpeed;
@ -21,9 +17,8 @@ public class HarvesterTileEntity extends SyncedTileEntity {
} }
@Override @Override
@OnlyIn(Dist.CLIENT) protected AABB createRenderBoundingBox() {
public AABB getRenderBoundingBox() { return new AABB(worldPosition);
return RENDER_BOX.move(worldPosition);
} }
public float getAnimatedSpeed() { public float getAnimatedSpeed() {

View file

@ -35,7 +35,8 @@ public class PortableStorageInterfaceRenderer extends SafeTileEntityRenderer<Por
@Override @Override
protected void renderSafe(PortableStorageInterfaceTileEntity te, float partialTicks, PoseStack ms, protected void renderSafe(PortableStorageInterfaceTileEntity te, float partialTicks, PoseStack ms,
MultiBufferSource buffer, int light, int overlay) { MultiBufferSource buffer, int light, int overlay) {
if (Backend.isOn()) return; if (Backend.canUseInstancing(te.getLevel()))
return;
BlockState blockState = te.getBlockState(); BlockState blockState = te.getBlockState();
float progress = te.getExtensionDistance(partialTicks); float progress = te.getExtensionDistance(partialTicks);

View file

@ -15,8 +15,6 @@ import net.minecraft.world.entity.Entity;
import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.AABB;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
public abstract class PortableStorageInterfaceTileEntity extends SmartTileEntity { public abstract class PortableStorageInterfaceTileEntity extends SmartTileEntity {
@ -134,15 +132,9 @@ public abstract class PortableStorageInterfaceTileEntity extends SmartTileEntity
return powered; return powered;
} }
protected AABB cachedBoundingBox;
@Override @Override
@OnlyIn(Dist.CLIENT) protected AABB createRenderBoundingBox() {
public AABB getRenderBoundingBox() { return super.createRenderBoundingBox().inflate(2);
if (cachedBoundingBox == null) {
cachedBoundingBox = super.getRenderBoundingBox().inflate(2);
}
return cachedBoundingBox;
} }
public boolean isTransferring() { public boolean isTransferring() {

View file

@ -231,7 +231,7 @@ public class CrushingWheelControllerTileEntity extends SmartTileEntity {
processingEntity.setPos(entityOutPos.x, entityOutPos.y, entityOutPos.z); processingEntity.setPos(entityOutPos.x, entityOutPos.y, entityOutPos.z);
} }
} }
processingEntity.hurt(CrushingWheelTileEntity.damageSource, crusherDamage); processingEntity.hurt(CrushingWheelTileEntity.DAMAGE_SOURCE, crusherDamage);
if (!processingEntity.isAlive()) { if (!processingEntity.isAlive()) {
processingEntity.setPos(entityOutPos.x, entityOutPos.y, entityOutPos.z); processingEntity.setPos(entityOutPos.x, entityOutPos.y, entityOutPos.z);
} }

View file

@ -19,7 +19,7 @@ import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
@EventBusSubscriber @EventBusSubscriber
public class CrushingWheelTileEntity extends KineticTileEntity { public class CrushingWheelTileEntity extends KineticTileEntity {
public static DamageSource damageSource = new DamageSource("create.crush").bypassArmor() public static final DamageSource DAMAGE_SOURCE = new DamageSource("create.crush").bypassArmor()
.setScalesWithDifficulty(); .setScalesWithDifficulty();
public CrushingWheelTileEntity(BlockEntityType<?> type, BlockPos pos, BlockState state) { public CrushingWheelTileEntity(BlockEntityType<?> type, BlockPos pos, BlockState state) {
@ -40,7 +40,7 @@ public class CrushingWheelTileEntity extends KineticTileEntity {
} }
@Override @Override
public AABB makeRenderBoundingBox() { protected AABB createRenderBoundingBox() {
return new AABB(worldPosition).inflate(1); return new AABB(worldPosition).inflate(1);
} }
@ -52,14 +52,14 @@ public class CrushingWheelTileEntity extends KineticTileEntity {
@SubscribeEvent @SubscribeEvent
public static void crushingIsFortunate(LootingLevelEvent event) { public static void crushingIsFortunate(LootingLevelEvent event) {
if (event.getDamageSource() != damageSource) if (event.getDamageSource() != DAMAGE_SOURCE)
return; return;
event.setLootingLevel(2); //This does not currently increase mob drops. It seems like this only works for damage done by an entity. event.setLootingLevel(2); //This does not currently increase mob drops. It seems like this only works for damage done by an entity.
} }
@SubscribeEvent @SubscribeEvent
public static void handleCrushedMobDrops(LivingDropsEvent event) { public static void handleCrushedMobDrops(LivingDropsEvent event) {
if (event.getSource() != CrushingWheelTileEntity.damageSource) if (event.getSource() != CrushingWheelTileEntity.DAMAGE_SOURCE)
return; return;
Vec3 outSpeed = Vec3.ZERO; Vec3 outSpeed = Vec3.ZERO;
for (ItemEntity outputItem : event.getDrops()) { for (ItemEntity outputItem : event.getDrops()) {

View file

@ -9,7 +9,8 @@ import com.jozufozu.flywheel.core.Materials;
import com.jozufozu.flywheel.core.PartialModel; import com.jozufozu.flywheel.core.PartialModel;
import com.jozufozu.flywheel.core.materials.model.ModelData; import com.jozufozu.flywheel.core.materials.model.ModelData;
import com.jozufozu.flywheel.core.virtual.VirtualRenderWorld; import com.jozufozu.flywheel.core.virtual.VirtualRenderWorld;
import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.jozufozu.flywheel.util.transform.TransformStack;
import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.content.contraptions.base.IRotate; import com.simibubi.create.content.contraptions.base.IRotate;
import com.simibubi.create.content.contraptions.base.KineticTileInstance; import com.simibubi.create.content.contraptions.base.KineticTileInstance;
@ -30,7 +31,7 @@ import net.minecraft.world.phys.Vec3;
public class DeployerActorInstance extends ActorInstance { public class DeployerActorInstance extends ActorInstance {
private final MatrixTransformStack stack = new MatrixTransformStack(); private final PoseStack stack = new PoseStack();
Direction facing; Direction facing;
boolean stationaryTimer; boolean stationaryTimer;
@ -94,27 +95,29 @@ public class DeployerActorInstance extends ActorInstance {
Vec3 offset = Vec3.atLowerCornerOf(facing.getNormal()).scale(factor); Vec3 offset = Vec3.atLowerCornerOf(facing.getNormal()).scale(factor);
stack.setIdentity() TransformStack tstack = TransformStack.cast(stack);
.translate(context.localPos) stack.setIdentity();
tstack.translate(context.localPos)
.translate(offset); .translate(offset);
transformModel(stack, pole, hand, yRot, xRot, zRot); transformModel(stack, pole, hand, yRot, xRot, zRot);
} }
static void transformModel(MatrixTransformStack msr, ModelData pole, ModelData hand, float yRot, float xRot, float zRot) { static void transformModel(PoseStack stack, ModelData pole, ModelData hand, float yRot, float xRot, float zRot) {
TransformStack tstack = TransformStack.cast(stack);
msr.centre(); tstack.centre();
msr.rotate(Direction.UP, (float) ((yRot) / 180 * Math.PI)); tstack.rotate(Direction.UP, (float) ((yRot) / 180 * Math.PI));
msr.rotate(Direction.EAST, (float) ((xRot) / 180 * Math.PI)); tstack.rotate(Direction.EAST, (float) ((xRot) / 180 * Math.PI));
msr.pushPose(); stack.pushPose();
msr.rotate(Direction.SOUTH, (float) ((zRot) / 180 * Math.PI)); tstack.rotate(Direction.SOUTH, (float) ((zRot) / 180 * Math.PI));
msr.unCentre(); tstack.unCentre();
pole.setTransform(msr.unwrap()); pole.setTransform(stack);
msr.popPose(); stack.popPose();
msr.unCentre(); tstack.unCentre();
hand.setTransform(msr.unwrap()); hand.setTransform(stack);
} }
} }

View file

@ -6,7 +6,7 @@ import static com.simibubi.create.content.contraptions.base.DirectionalKineticBl
import com.jozufozu.flywheel.backend.Backend; import com.jozufozu.flywheel.backend.Backend;
import com.jozufozu.flywheel.core.PartialModel; import com.jozufozu.flywheel.core.PartialModel;
import com.jozufozu.flywheel.core.virtual.VirtualRenderWorld; import com.jozufozu.flywheel.core.virtual.VirtualRenderWorld;
import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.jozufozu.flywheel.util.transform.TransformStack;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.VertexConsumer; import com.mojang.blaze3d.vertex.VertexConsumer;
import com.mojang.math.Vector3f; import com.mojang.math.Vector3f;
@ -197,7 +197,7 @@ public class DeployerRenderer extends SafeTileEntityRenderer<DeployerTileEntity>
float time = AnimationTickHolder.getRenderTime(context.world) / 20; float time = AnimationTickHolder.getRenderTime(context.world) / 20;
float angle = (time * speed) % 360; float angle = (time * speed) % 360;
new MatrixTransformStack(m) TransformStack.cast(m)
.centre() .centre()
.rotateY(axis == Axis.Z ? 90 : 0) .rotateY(axis == Axis.Z ? 90 : 0)
.rotateZ(axis.isHorizontal() ? 90 : 0) .rotateZ(axis.isHorizontal() ? 90 : 0)

View file

@ -388,8 +388,8 @@ public class DeployerTileEntity extends KineticTileEntity {
} }
@Override @Override
public AABB makeRenderBoundingBox() { protected AABB createRenderBoundingBox() {
return super.makeRenderBoundingBox().inflate(3); return super.createRenderBoundingBox().inflate(3);
} }
@Override @Override

View file

@ -50,8 +50,8 @@ public class FlywheelTileEntity extends GeneratingKineticTileEntity {
} }
@Override @Override
public AABB makeRenderBoundingBox() { protected AABB createRenderBoundingBox() {
return super.makeRenderBoundingBox().inflate(2); return super.createRenderBoundingBox().inflate(2);
} }
@Override @Override

View file

@ -14,8 +14,6 @@ import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.AABB;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
public class EngineTileEntity extends SmartTileEntity { public class EngineTileEntity extends SmartTileEntity {
@ -31,14 +29,9 @@ public class EngineTileEntity extends SmartTileEntity {
public void addBehaviours(List<TileEntityBehaviour> behaviours) { public void addBehaviours(List<TileEntityBehaviour> behaviours) {
} }
protected AABB cachedBoundingBox;
@Override @Override
@OnlyIn(Dist.CLIENT) protected AABB createRenderBoundingBox() {
public AABB getRenderBoundingBox() { return super.createRenderBoundingBox().inflate(1.5f);
if (cachedBoundingBox == null) {
cachedBoundingBox = super.getRenderBoundingBox().inflate(1.5f);
}
return cachedBoundingBox;
} }
@Override @Override

View file

@ -91,7 +91,7 @@ public class MechanicalMixerTileEntity extends BasinOperatingTileEntity {
} }
@Override @Override
public AABB makeRenderBoundingBox() { protected AABB createRenderBoundingBox() {
return new AABB(worldPosition).expandTowards(0, -1.5, 0); return new AABB(worldPosition).expandTowards(0, -1.5, 0);
} }

View file

@ -111,7 +111,7 @@ public class MechanicalPressTileEntity extends BasinOperatingTileEntity {
} }
@Override @Override
public AABB makeRenderBoundingBox() { protected AABB createRenderBoundingBox() {
return new AABB(worldPosition).expandTowards(0, -1.5, 0) return new AABB(worldPosition).expandTowards(0, -1.5, 0)
.expandTowards(0, 1, 0); .expandTowards(0, 1, 0);
} }

View file

@ -73,8 +73,6 @@ import net.minecraftforge.items.IItemHandler;
@MethodsReturnNonnullByDefault @MethodsReturnNonnullByDefault
public class SawTileEntity extends BlockBreakingKineticTileEntity { public class SawTileEntity extends BlockBreakingKineticTileEntity {
private static final AABB RENDER_BOX = new AABB(0, 0, 0, 1, 1, 1);
private static final Object cuttingRecipesKey = new Object(); private static final Object cuttingRecipesKey = new Object();
public static final Supplier<RecipeType<?>> woodcuttingRecipeType = public static final Supplier<RecipeType<?>> woodcuttingRecipeType =
Suppliers.memoize(() -> Registry.RECIPE_TYPE.get(new ResourceLocation("druidcraft", "woodcutting"))); Suppliers.memoize(() -> Registry.RECIPE_TYPE.get(new ResourceLocation("druidcraft", "woodcutting")));
@ -125,9 +123,8 @@ public class SawTileEntity extends BlockBreakingKineticTileEntity {
} }
@Override @Override
protected AABB makeRenderBoundingBox() { protected AABB createRenderBoundingBox() {
return RENDER_BOX.inflate(.125f) return new AABB(worldPosition).inflate(.125f);
.move(worldPosition);
} }
@Override @Override

View file

@ -1,7 +1,7 @@
package com.simibubi.create.content.contraptions.components.structureMovement.interaction.controls; package com.simibubi.create.content.contraptions.components.structureMovement.interaction.controls;
import com.jozufozu.flywheel.core.virtual.VirtualRenderWorld; import com.jozufozu.flywheel.core.virtual.VirtualRenderWorld;
import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.jozufozu.flywheel.util.transform.TransformStack;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext; import com.simibubi.create.content.contraptions.components.structureMovement.MovementContext;
@ -41,7 +41,8 @@ public class ControlsRenderer {
float vAngle = (float) Mth.clamp(first ? firstLever * 70 - 25 : secondLever * 15, -45, 45); float vAngle = (float) Mth.clamp(first ? firstLever * 70 - 25 : secondLever * 15, -45, 45);
SuperByteBuffer lever = CachedBufferer.partial(AllBlockPartials.TRAIN_CONTROLS_LEVER, state); SuperByteBuffer lever = CachedBufferer.partial(AllBlockPartials.TRAIN_CONTROLS_LEVER, state);
ms.pushPose(); ms.pushPose();
new MatrixTransformStack(ms).centre() TransformStack.cast(ms)
.centre()
.rotateY(hAngle) .rotateY(hAngle)
.translate(0, 0, 4 / 16f) .translate(0, 0, 4 / 16f)
.rotateX(vAngle - 45) .rotateX(vAngle - 45)

View file

@ -34,8 +34,8 @@ public class PulleyTileEntity extends LinearActuatorTileEntity {
} }
@Override @Override
public AABB makeRenderBoundingBox() { protected AABB createRenderBoundingBox() {
return super.makeRenderBoundingBox().expandTowards(0, -offset, 0); return super.createRenderBoundingBox().expandTowards(0, -offset, 0);
} }
@Override @Override
@ -43,6 +43,7 @@ public class PulleyTileEntity extends LinearActuatorTileEntity {
super.tick(); super.tick();
if (isVirtual()) if (isVirtual())
prevAnimatedOffset = offset; prevAnimatedOffset = offset;
invalidateRenderBoundingBox();
} }
@Override @Override

View file

@ -38,7 +38,7 @@ public class WaterWheelTileEntity extends GeneratingKineticTileEntity {
} }
@Override @Override
public AABB makeRenderBoundingBox() { protected AABB createRenderBoundingBox() {
return new AABB(worldPosition).inflate(1); return new AABB(worldPosition).inflate(1);
} }

View file

@ -16,8 +16,6 @@ import net.minecraft.network.chat.Component;
import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.AABB;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidStack;
@ -99,9 +97,8 @@ public class HosePulleyTileEntity extends KineticTileEntity {
} }
@Override @Override
@OnlyIn(Dist.CLIENT) protected AABB createRenderBoundingBox() {
public AABB getRenderBoundingBox() { return super.createRenderBoundingBox().expandTowards(0, -offset.getValue(), 0);
return super.getRenderBoundingBox().expandTowards(0, -offset.getValue(), 0);
} }
@Override @Override
@ -122,6 +119,7 @@ public class HosePulleyTileEntity extends KineticTileEntity {
isMoving = false; isMoving = false;
offset.setValue(newOffset); offset.setValue(newOffset);
invalidateRenderBoundingBox();
} }
@Override @Override

View file

@ -33,8 +33,6 @@ import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.fluids.FluidStack; import net.minecraftforge.fluids.FluidStack;
@ -56,14 +54,9 @@ public class SpoutTileEntity extends SmartTileEntity implements IHaveGoggleInfor
processingTicks = -1; processingTicks = -1;
} }
protected AABB cachedBoundingBox;
@Override @Override
@OnlyIn(Dist.CLIENT) protected AABB createRenderBoundingBox() {
public AABB getRenderBoundingBox() { return super.createRenderBoundingBox().expandTowards(0, -2, 0);
if (cachedBoundingBox == null)
cachedBoundingBox = super.getRenderBoundingBox().expandTowards(0, -2, 0);
return cachedBoundingBox;
} }
@Override @Override

View file

@ -25,8 +25,6 @@ import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.AABB;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.common.capabilities.Capability; import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.fluids.FluidAttributes; import net.minecraftforge.fluids.FluidAttributes;
@ -58,7 +56,6 @@ public class FluidTankTileEntity extends SmartTileEntity implements IHaveGoggleI
// For rendering purposes only // For rendering purposes only
private InterpolatedChasingValue fluidLevel; private InterpolatedChasingValue fluidLevel;
private AABB renderBoundingBox;
public FluidTankTileEntity(BlockEntityType<?> type, BlockPos pos, BlockState state) { public FluidTankTileEntity(BlockEntityType<?> type, BlockPos pos, BlockState state) {
super(type, pos, state); super(type, pos, state);
@ -123,7 +120,7 @@ public class FluidTankTileEntity extends SmartTileEntity implements IHaveGoggleI
super.initialize(); super.initialize();
sendData(); sendData();
if (level.isClientSide) if (level.isClientSide)
updateRenderBoundingBox(); invalidateRenderBoundingBox();
} }
private void onPositionChanged() { private void onPositionChanged() {
@ -304,20 +301,12 @@ public class FluidTankTileEntity extends SmartTileEntity implements IHaveGoggleI
return isController() ? worldPosition : controller; return isController() ? worldPosition : controller;
} }
public void updateRenderBoundingBox() {
if (isController())
renderBoundingBox = super.getRenderBoundingBox().expandTowards(width - 1, height - 1, width - 1);
else
renderBoundingBox = super.getRenderBoundingBox();
}
@Override @Override
@OnlyIn(Dist.CLIENT) protected AABB createRenderBoundingBox() {
public AABB getRenderBoundingBox() { if (isController())
if (renderBoundingBox == null) { return super.createRenderBoundingBox().expandTowards(width - 1, height - 1, width - 1);
renderBoundingBox = super.getRenderBoundingBox(); else
} return super.createRenderBoundingBox();
return renderBoundingBox;
} }
@Nullable @Nullable
@ -380,7 +369,7 @@ public class FluidTankTileEntity extends SmartTileEntity implements IHaveGoggleI
level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), 16); level.sendBlockUpdated(getBlockPos(), getBlockState(), getBlockState(), 16);
if (isController()) if (isController())
tankInventory.setCapacity(getCapacityMultiplier() * getTotalTankSize()); tankInventory.setCapacity(getCapacityMultiplier() * getTotalTankSize());
updateRenderBoundingBox(); invalidateRenderBoundingBox();
} }
if (isController()) { if (isController()) {
float fillState = getFillState(); float fillState = getFillState();

View file

@ -126,6 +126,7 @@ public class BeltTileEntity extends KineticTileEntity {
lighter = new BeltLighter(); lighter = new BeltLighter();
} }
}); });
invalidateRenderBoundingBox();
getInventory().tick(); getInventory().tick();
@ -160,11 +161,11 @@ public class BeltTileEntity extends KineticTileEntity {
} }
@Override @Override
public AABB makeRenderBoundingBox() { public AABB createRenderBoundingBox() {
if (!isController()) if (!isController())
return super.makeRenderBoundingBox(); return super.createRenderBoundingBox();
else else
return super.makeRenderBoundingBox().inflate(beltLength + 1); return super.createRenderBoundingBox().inflate(beltLength + 1);
} }
protected void initializeItemHandler() { protected void initializeItemHandler() {

View file

@ -17,7 +17,7 @@ public class SimpleKineticTileEntity extends KineticTileEntity {
} }
@Override @Override
public AABB makeRenderBoundingBox() { protected AABB createRenderBoundingBox() {
return new AABB(worldPosition).inflate(1); return new AABB(worldPosition).inflate(1);
} }

View file

@ -10,8 +10,6 @@ import net.minecraft.world.entity.EquipmentSlot;
import net.minecraft.world.item.ArmorMaterial; import net.minecraft.world.item.ArmorMaterial;
import net.minecraft.world.item.Items; import net.minecraft.world.item.Items;
import net.minecraft.world.item.crafting.Ingredient; import net.minecraft.world.item.crafting.Ingredient;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
public enum AllArmorMaterials implements ArmorMaterial { public enum AllArmorMaterials implements ArmorMaterial {
@ -30,49 +28,56 @@ public enum AllArmorMaterials implements ArmorMaterial {
private final float knockbackResistance; private final float knockbackResistance;
private final Supplier<Ingredient> repairMaterial; private final Supplier<Ingredient> repairMaterial;
private AllArmorMaterials(String p_i231593_3_, int p_i231593_4_, int[] p_i231593_5_, int p_i231593_6_, private AllArmorMaterials(String name, int maxDamageFactor, int[] damageReductionAmountArray, int enchantability,
SoundEvent p_i231593_7_, float p_i231593_8_, float p_i231593_9_, Supplier<Ingredient> p_i231593_10_) { SoundEvent soundEvent, float toughness, float knockbackResistance, Supplier<Ingredient> repairMaterial) {
this.name = p_i231593_3_; this.name = name;
this.maxDamageFactor = p_i231593_4_; this.maxDamageFactor = maxDamageFactor;
this.damageReductionAmountArray = p_i231593_5_; this.damageReductionAmountArray = damageReductionAmountArray;
this.enchantability = p_i231593_6_; this.enchantability = enchantability;
this.soundEvent = p_i231593_7_; this.soundEvent = soundEvent;
this.toughness = p_i231593_8_; this.toughness = toughness;
this.knockbackResistance = p_i231593_9_; this.knockbackResistance = knockbackResistance;
this.repairMaterial = Suppliers.memoize(p_i231593_10_::get); this.repairMaterial = Suppliers.memoize(repairMaterial::get);
} }
public int getDurabilityForSlot(EquipmentSlot p_200896_1_) { @Override
return MAX_DAMAGE_ARRAY[p_200896_1_.getIndex()] * this.maxDamageFactor; public int getDurabilityForSlot(EquipmentSlot slot) {
return MAX_DAMAGE_ARRAY[slot.getIndex()] * this.maxDamageFactor;
} }
public int getDefenseForSlot(EquipmentSlot p_200902_1_) { @Override
return this.damageReductionAmountArray[p_200902_1_.getIndex()]; public int getDefenseForSlot(EquipmentSlot slot) {
return this.damageReductionAmountArray[slot.getIndex()];
} }
@Override
public int getEnchantmentValue() { public int getEnchantmentValue() {
return this.enchantability; return this.enchantability;
} }
@Override
public SoundEvent getEquipSound() { public SoundEvent getEquipSound() {
return this.soundEvent; return this.soundEvent;
} }
@Override
public Ingredient getRepairIngredient() { public Ingredient getRepairIngredient() {
return this.repairMaterial.get(); return this.repairMaterial.get();
} }
@OnlyIn(Dist.CLIENT) @Override
public String getName() { public String getName() {
return this.name; return this.name;
} }
@Override
public float getToughness() { public float getToughness() {
return this.toughness; return this.toughness;
} }
@Override
public float getKnockbackResistance() { public float getKnockbackResistance() {
return this.knockbackResistance; return this.knockbackResistance;
} }
} }

View file

@ -63,7 +63,7 @@ public class CustomRotationParticle extends SimpleAnimatedParticle {
float maxU = mirror ? getU0() : getU1(); float maxU = mirror ? getU0() : getU1();
float minV = getV0(); float minV = getV0();
float maxV = getV1(); float maxV = getV1();
int brightness = OptifineHandler.usingShaders() ? LightTexture.pack(12, 15 ) : getLightColor(partialTicks); int brightness = OptifineHandler.isUsingShaders() ? LightTexture.pack(12, 15) : getLightColor(partialTicks);
builder.vertex(vertices[0].x(), vertices[0].y(), vertices[0].z()).uv(maxU, maxV).color(rCol, gCol, bCol, alpha).uv2(brightness).endVertex(); builder.vertex(vertices[0].x(), vertices[0].y(), vertices[0].z()).uv(maxU, maxV).color(rCol, gCol, bCol, alpha).uv2(brightness).endVertex();
builder.vertex(vertices[1].x(), vertices[1].y(), vertices[1].z()).uv(maxU, minV).color(rCol, gCol, bCol, alpha).uv2(brightness).endVertex(); builder.vertex(vertices[1].x(), vertices[1].y(), vertices[1].z()).uv(maxU, minV).color(rCol, gCol, bCol, alpha).uv2(brightness).endVertex();
builder.vertex(vertices[2].x(), vertices[2].y(), vertices[2].z()).uv(minU, minV).color(rCol, gCol, bCol, alpha).uv2(brightness).endVertex(); builder.vertex(vertices[2].x(), vertices[2].y(), vertices[2].z()).uv(minU, minV).color(rCol, gCol, bCol, alpha).uv2(brightness).endVertex();

View file

@ -32,7 +32,6 @@ import net.minecraft.world.entity.player.Player;
import net.minecraft.world.item.BlockItem; import net.minecraft.world.item.BlockItem;
import net.minecraft.world.item.Item; import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Rarity;
import net.minecraft.world.item.context.UseOnContext; import net.minecraft.world.item.context.UseOnContext;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraft.world.level.block.Block; import net.minecraft.world.level.block.Block;
@ -57,8 +56,7 @@ public class SymmetryWandItem extends Item {
private static final String ENABLE = "enable"; private static final String ENABLE = "enable";
public SymmetryWandItem(Properties properties) { public SymmetryWandItem(Properties properties) {
super(properties.stacksTo(1) super(properties);
.rarity(Rarity.UNCOMMON));
} }
@Nonnull @Nonnull

View file

@ -30,7 +30,6 @@ import net.minecraft.world.entity.player.Player;
import net.minecraft.world.entity.projectile.ProjectileUtil; import net.minecraft.world.entity.projectile.ProjectileUtil;
import net.minecraft.world.item.Item; import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.item.Rarity;
import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.BlockHitResult; import net.minecraft.world.phys.BlockHitResult;
import net.minecraft.world.phys.EntityHitResult; import net.minecraft.world.phys.EntityHitResult;
@ -55,8 +54,6 @@ import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
@EventBusSubscriber @EventBusSubscriber
public class ExtendoGripItem extends Item { public class ExtendoGripItem extends Item {
private static DamageSource lastActiveDamageSource;
public static final int MAX_DAMAGE = 200; public static final int MAX_DAMAGE = 200;
public static final AttributeModifier singleRangeAttributeModifier = public static final AttributeModifier singleRangeAttributeModifier =
@ -66,19 +63,19 @@ public class ExtendoGripItem extends Item {
new AttributeModifier(UUID.fromString("8f7dbdb2-0d0d-458a-aa40-ac7633691f66"), "Range modifier", 5, new AttributeModifier(UUID.fromString("8f7dbdb2-0d0d-458a-aa40-ac7633691f66"), "Range modifier", 5,
AttributeModifier.Operation.ADDITION); AttributeModifier.Operation.ADDITION);
static Supplier<Multimap<Attribute, AttributeModifier>> rangeModifier = Suppliers.memoize(() -> private static final Supplier<Multimap<Attribute, AttributeModifier>> rangeModifier = Suppliers.memoize(() ->
// Holding an ExtendoGrip // Holding an ExtendoGrip
ImmutableMultimap.of(ForgeMod.REACH_DISTANCE.get(), singleRangeAttributeModifier) ImmutableMultimap.of(ForgeMod.REACH_DISTANCE.get(), singleRangeAttributeModifier)
); );
private static final Supplier<Multimap<Attribute, AttributeModifier>> doubleRangeModifier = Suppliers.memoize(() ->
static Supplier<Multimap<Attribute, AttributeModifier>> doubleRangeModifier = Suppliers.memoize(() ->
// Holding two ExtendoGrips o.O // Holding two ExtendoGrips o.O
ImmutableMultimap.of(ForgeMod.REACH_DISTANCE.get(), doubleRangeAttributeModifier) ImmutableMultimap.of(ForgeMod.REACH_DISTANCE.get(), doubleRangeAttributeModifier)
); );
private static DamageSource lastActiveDamageSource;
public ExtendoGripItem(Properties properties) { public ExtendoGripItem(Properties properties) {
super(properties.stacksTo(1) super(properties.defaultDurability(MAX_DAMAGE));
.rarity(Rarity.UNCOMMON));
} }
public static final String EXTENDO_MARKER = "createExtendo"; public static final String EXTENDO_MARKER = "createExtendo";
@ -194,10 +191,10 @@ public class ExtendoGripItem extends Item {
findAndDamageExtendoGrip((Player) entity); findAndDamageExtendoGrip((Player) entity);
} }
@SubscribeEvent(priority = EventPriority.LOWEST) // @SubscribeEvent(priority = EventPriority.LOWEST)
public static void consumeDurabilityOnPlace(PlayerInteractEvent event) { // public static void consumeDurabilityOnPlace(PlayerInteractEvent event) {
// findAndDamageExtendoGrip(event.getPlayer()); // findAndDamageExtendoGrip(event.getPlayer());
} // }
private static void findAndDamageExtendoGrip(Player player) { private static void findAndDamageExtendoGrip(Player player) {
if (player == null) if (player == null)
@ -236,16 +233,6 @@ public class ExtendoGripItem extends Item {
return AllConfigs.SERVER.curiosities.maxExtendoGripActions.get(); return AllConfigs.SERVER.curiosities.maxExtendoGripActions.get();
} }
@Override
public boolean canBeDepleted() {
return true;
}
@Override
public int getMaxDamage(ItemStack stack) {
return MAX_DAMAGE;
}
@SubscribeEvent @SubscribeEvent
public static void bufferLivingAttackEvent(LivingAttackEvent event) { public static void bufferLivingAttackEvent(LivingAttackEvent event) {
// Workaround for removed patch to get the attacking entity. // Workaround for removed patch to get the attacking entity.

View file

@ -45,7 +45,7 @@ import net.minecraftforge.common.util.FakePlayer;
public class SandPaperItem extends Item implements CustomUseEffectsItem { public class SandPaperItem extends Item implements CustomUseEffectsItem {
public SandPaperItem(Properties properties) { public SandPaperItem(Properties properties) {
super(properties.durability(8)); super(properties.defaultDurability(8));
} }
@Override @Override

View file

@ -98,6 +98,16 @@ public class BuiltinPotatoProjectileTypes {
.soundPitch(1.25f) .soundPitch(1.25f)
.registerAndAssign(Items.SWEET_BERRIES), .registerAndAssign(Items.SWEET_BERRIES),
GLOW_BERRIES = create("glow_berry").damage(2)
.reloadTicks(10)
.knockback(0.05f)
.velocity(1.05f)
.renderTumbling()
.splitInto(2)
.soundPitch(1.2f)
.onEntityHit(potion(MobEffects.GLOWING, 1, 200, false))
.registerAndAssign(Items.GLOW_BERRIES),
CHOCOLATE_BERRIES = create("chocolate_berry").damage(4) CHOCOLATE_BERRIES = create("chocolate_berry").damage(4)
.reloadTicks(10) .reloadTicks(10)
.knockback(0.2f) .knockback(0.2f)
@ -112,7 +122,7 @@ public class BuiltinPotatoProjectileTypes {
.knockback(0.05f) .knockback(0.05f)
.velocity(1.25f) .velocity(1.25f)
.renderTumbling() .renderTumbling()
.onEntityHit(potion(MobEffects.POISON, 1,160, true)) .onEntityHit(potion(MobEffects.POISON, 1, 160, true))
.registerAndAssign(Items.POISONOUS_POTATO), .registerAndAssign(Items.POISONOUS_POTATO),
CHORUS_FRUIT = create("chorus_fruit").damage(3) CHORUS_FRUIT = create("chorus_fruit").damage(3)
@ -188,7 +198,7 @@ public class BuiltinPotatoProjectileTypes {
.soundPitch(1.5f) .soundPitch(1.5f)
.registerAndAssign(Items.MELON_SLICE), .registerAndAssign(Items.MELON_SLICE),
GLISTENING_MELON = create("glistening_melon").damage(5) GLISTERING_MELON = create("glistering_melon").damage(5)
.reloadTicks(8) .reloadTicks(8)
.knockback(0.1f) .knockback(0.1f)
.velocity(1.45f) .velocity(1.45f)
@ -283,7 +293,7 @@ public class BuiltinPotatoProjectileTypes {
}; };
} }
public static void applyEffect(LivingEntity entity, MobEffectInstance effect) { private static void applyEffect(LivingEntity entity, MobEffectInstance effect) {
if (effect.getEffect().isInstantenous()) if (effect.getEffect().isInstantenous())
effect.getEffect().applyInstantenousEffect(null, null, entity, effect.getDuration(), 1.0); effect.getEffect().applyInstantenousEffect(null, null, entity, effect.getDuration(), 1.0);
else else

View file

@ -53,7 +53,7 @@ public class PotatoCannonItem extends ProjectileWeaponItem {
public static final int MAX_DAMAGE = 100; public static final int MAX_DAMAGE = 100;
public PotatoCannonItem(Properties properties) { public PotatoCannonItem(Properties properties) {
super(properties); super(properties.defaultDurability(MAX_DAMAGE));
} }
@Override @Override
@ -81,11 +81,6 @@ public class PotatoCannonItem extends ProjectileWeaponItem {
return use(context.getLevel(), context.getPlayer(), context.getHand()).getResult(); return use(context.getLevel(), context.getPlayer(), context.getHand()).getResult();
} }
@Override
public int getItemStackLimit(ItemStack stack) {
return 1;
}
@Override @Override
public boolean isBarVisible(ItemStack stack) { public boolean isBarVisible(ItemStack stack) {
return BackTankUtil.isBarVisible(stack, maxUses()); return BackTankUtil.isBarVisible(stack, maxUses());
@ -105,20 +100,10 @@ public class PotatoCannonItem extends ProjectileWeaponItem {
return AllConfigs.SERVER.curiosities.maxPotatoCannonShots.get(); return AllConfigs.SERVER.curiosities.maxPotatoCannonShots.get();
} }
@Override
public boolean canBeDepleted() {
return true;
}
public boolean isCannon(ItemStack stack) { public boolean isCannon(ItemStack stack) {
return stack.getItem() instanceof PotatoCannonItem; return stack.getItem() instanceof PotatoCannonItem;
} }
@Override
public int getMaxDamage(ItemStack stack) {
return MAX_DAMAGE;
}
@Override @Override
public InteractionResultHolder<ItemStack> use(Level world, Player player, InteractionHand hand) { public InteractionResultHolder<ItemStack> use(Level world, Player player, InteractionHand hand) {
ItemStack stack = player.getItemInHand(hand); ItemStack stack = player.getItemInHand(hand);
@ -275,11 +260,6 @@ public class PotatoCannonItem extends ProjectileWeaponItem {
.isPresent(); .isPresent();
} }
@Override
public int getEnchantmentValue() {
return 1;
}
@Override @Override
public boolean onEntitySwing(ItemStack stack, LivingEntity entity) { public boolean onEntitySwing(ItemStack stack, LivingEntity entity) {
return true; return true;

View file

@ -37,9 +37,11 @@ public class WorldshaperItemRenderer extends ZapperItemRenderer<WorldshaperModel
float animation = getAnimationProgress(pt, leftHanded, mainHand); float animation = getAnimationProgress(pt, leftHanded, mainHand);
// Core glows // Core glows
float multiplier = Mth.sin(worldTime * 5); float multiplier;
if (mainHand || offHand) if (mainHand || offHand)
multiplier = animation; multiplier = animation;
else
multiplier = Mth.sin(worldTime * 5);
int lightItensity = (int) (15 * Mth.clamp(multiplier, 0, 1)); int lightItensity = (int) (15 * Mth.clamp(multiplier, 0, 1));
int glowLight = LightTexture.pack(lightItensity, max(lightItensity, 4)); int glowLight = LightTexture.pack(lightItensity, max(lightItensity, 4));

View file

@ -127,7 +127,7 @@ public class ChuteTileEntity extends SmartTileEntity implements IHaveGoggleInfor
} }
@Override @Override
public AABB getRenderBoundingBox() { protected AABB createRenderBoundingBox() {
return new AABB(worldPosition).expandTowards(0, -3, 0); return new AABB(worldPosition).expandTowards(0, -3, 0);
} }

View file

@ -40,8 +40,6 @@ import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
public class ArmTileEntity extends KineticTileEntity implements ITransformableTE { public class ArmTileEntity extends KineticTileEntity implements ITransformableTE {
@ -160,9 +158,8 @@ public class ArmTileEntity extends KineticTileEntity implements ITransformableTE
} }
@Override @Override
@OnlyIn(Dist.CLIENT) protected AABB createRenderBoundingBox() {
public AABB makeRenderBoundingBox() { return super.createRenderBoundingBox().inflate(3);
return super.makeRenderBoundingBox().inflate(3);
} }
private boolean checkForMusicAmong(List<ArmInteractionPoint> list) { private boolean checkForMusicAmong(List<ArmInteractionPoint> list) {

View file

@ -3,7 +3,8 @@ package com.simibubi.create.content.logistics.trains;
import java.util.Iterator; import java.util.Iterator;
import com.jozufozu.flywheel.repack.joml.Math; import com.jozufozu.flywheel.repack.joml.Math;
import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.jozufozu.flywheel.util.transform.TransformStack;
import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.blaze3d.vertex.PoseStack.Pose; import com.mojang.blaze3d.vertex.PoseStack.Pose;
import com.simibubi.create.content.logistics.trains.track.TrackRenderer; import com.simibubi.create.content.logistics.trains.track.TrackRenderer;
import com.simibubi.create.foundation.utility.Couple; import com.simibubi.create.foundation.utility.Couple;
@ -362,6 +363,8 @@ public class BezierConnection implements Iterable<BezierConnection.Segment> {
if (bakedSegments != null) if (bakedSegments != null)
return bakedSegments; return bakedSegments;
PoseStack poseStack = new PoseStack();
TransformStack tstack = TransformStack.cast(poseStack);
int segmentCount = getSegmentCount(); int segmentCount = getSegmentCount();
bakedSegments = new SegmentAngles[segmentCount + 1]; bakedSegments = new SegmentAngles[segmentCount + 1];
Couple<Vec3> previousOffsets = null; Couple<Vec3> previousOffsets = null;
@ -389,15 +392,15 @@ public class BezierConnection implements Iterable<BezierConnection.Segment> {
Vec3 tieAngles = TrackRenderer.getModelAngles(segment.normal, railMiddle.subtract(prevMiddle)); Vec3 tieAngles = TrackRenderer.getModelAngles(segment.normal, railMiddle.subtract(prevMiddle));
angles.lightPosition = new BlockPos(railMiddle); angles.lightPosition = new BlockPos(railMiddle);
MatrixTransformStack mts = new MatrixTransformStack(); poseStack.pushPose();
mts.translate(prevMiddle) tstack.translate(prevMiddle)
.rotateYRadians(tieAngles.y) .rotateYRadians(tieAngles.y)
.rotateXRadians(tieAngles.x) .rotateXRadians(tieAngles.x)
.rotateZRadians(tieAngles.z) .rotateZRadians(tieAngles.z)
.translate(-1 / 2f, -2 / 16f - 1 / 256f, 0); .translate(-1 / 2f, -2 / 16f - 1 / 256f, 0);
angles.tieTransform = mts.unwrap() angles.tieTransform = poseStack.last();
.last();
angles.railTransforms = Couple.create(null, null); angles.railTransforms = Couple.create(null, null);
poseStack.popPose();
// Rails // Rails
float scale = end ? 2.2f : 2.1f; float scale = end ? 2.2f : 2.1f;
@ -407,15 +410,15 @@ public class BezierConnection implements Iterable<BezierConnection.Segment> {
Vec3 diff = railI.subtract(prevI); Vec3 diff = railI.subtract(prevI);
Vec3 anglesI = TrackRenderer.getModelAngles(segment.normal, diff); Vec3 anglesI = TrackRenderer.getModelAngles(segment.normal, diff);
mts = new MatrixTransformStack(); poseStack.pushPose();
mts.translate(prevI) tstack.translate(prevI)
.rotateYRadians(anglesI.y) .rotateYRadians(anglesI.y)
.rotateXRadians(anglesI.x) .rotateXRadians(anglesI.x)
.rotateZRadians(anglesI.z) .rotateZRadians(anglesI.z)
.translate(0, -2 / 16f + (i % 2 == 0 ? 1 : -1) / 2048f - 1 / 256f, -1 / 32f) .translate(0, -2 / 16f + (i % 2 == 0 ? 1 : -1) / 2048f - 1 / 256f, -1 / 32f)
.scale(1, 1, (float) diff.length() * scale); .scale(1, 1, (float) diff.length() * scale);
angles.railTransforms.set(first, mts.unwrap() angles.railTransforms.set(first, poseStack.last());
.last()); poseStack.popPose();
} }
previousOffsets = railOffsets; previousOffsets = railOffsets;
@ -429,6 +432,8 @@ public class BezierConnection implements Iterable<BezierConnection.Segment> {
if (bakedGirders != null) if (bakedGirders != null)
return bakedGirders; return bakedGirders;
PoseStack poseStack = new PoseStack();
TransformStack tstack = TransformStack.cast(poseStack);
int segmentCount = getSegmentCount(); int segmentCount = getSegmentCount();
bakedGirders = new GirderAngles[segmentCount + 1]; bakedGirders = new GirderAngles[segmentCount + 1];
Couple<Couple<Vec3>> previousOffsets = null; Couple<Couple<Vec3>> previousOffsets = null;
@ -482,15 +487,15 @@ public class BezierConnection implements Iterable<BezierConnection.Segment> {
Vec3 beamDiff = currentBeam.subtract(previousBeam); Vec3 beamDiff = currentBeam.subtract(previousBeam);
Vec3 beamAngles = TrackRenderer.getModelAngles(segment.normal, beamDiff); Vec3 beamAngles = TrackRenderer.getModelAngles(segment.normal, beamDiff);
MatrixTransformStack mts = new MatrixTransformStack(); poseStack.pushPose();
mts.translate(previousBeam) tstack.translate(previousBeam)
.rotateYRadians(beamAngles.y) .rotateYRadians(beamAngles.y)
.rotateXRadians(beamAngles.x) .rotateXRadians(beamAngles.x)
.rotateZRadians(beamAngles.z) .rotateZRadians(beamAngles.z)
.translate(0, 2 / 16f + (segment.index % 2 == 0 ? 1 : -1) / 2048f - 1 / 1024f, -1 / 32f) .translate(0, 2 / 16f + (segment.index % 2 == 0 ? 1 : -1) / 2048f - 1 / 1024f, -1 / 32f)
.scale(1, 1, (float) beamDiff.length() * scale); .scale(1, 1, (float) beamDiff.length() * scale);
angles.beams.set(first, mts.unwrap() angles.beams.set(first, poseStack.last());
.last()); poseStack.popPose();
// Caps // Caps
for (boolean top : Iterate.trueAndFalse) { for (boolean top : Iterate.trueAndFalse) {
@ -501,8 +506,8 @@ public class BezierConnection implements Iterable<BezierConnection.Segment> {
Vec3 diff = current.subtract(previous); Vec3 diff = current.subtract(previous);
Vec3 capAngles = TrackRenderer.getModelAngles(segment.normal, diff); Vec3 capAngles = TrackRenderer.getModelAngles(segment.normal, diff);
mts = new MatrixTransformStack(); poseStack.pushPose();
mts.translate(previous) tstack.translate(previous)
.rotateYRadians(capAngles.y) .rotateYRadians(capAngles.y)
.rotateXRadians(capAngles.x) .rotateXRadians(capAngles.x)
.rotateZRadians(capAngles.z) .rotateZRadians(capAngles.z)
@ -510,8 +515,8 @@ public class BezierConnection implements Iterable<BezierConnection.Segment> {
.rotateZ(top ? 0 : 0) .rotateZ(top ? 0 : 0)
.scale(1, 1, (float) diff.length() * scale); .scale(1, 1, (float) diff.length() * scale);
angles.beamCaps.get(top) angles.beamCaps.get(top)
.set(first, mts.unwrap() .set(first, poseStack.last());
.last()); poseStack.popPose();
} }
} }

View file

@ -1,6 +1,6 @@
package com.simibubi.create.content.logistics.trains.entity; package com.simibubi.create.content.logistics.trains.entity;
import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.jozufozu.flywheel.util.transform.TransformStack;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionEntityRenderer; import com.simibubi.create.content.contraptions.components.structureMovement.ContraptionEntityRenderer;
@ -40,11 +40,11 @@ public class CarriageContraptionEntityRenderer extends ContraptionEntityRenderer
return; return;
ms.pushPose(); ms.pushPose();
MatrixTransformStack msr = new MatrixTransformStack(ms);
float viewYRot = entity.getViewYRot(partialTicks); float viewYRot = entity.getViewYRot(partialTicks);
float viewXRot = entity.getViewXRot(partialTicks); float viewXRot = entity.getViewXRot(partialTicks);
int bogeySpacing = carriage.bogeySpacing; int bogeySpacing = carriage.bogeySpacing;
msr.rotateY(viewYRot + 90) TransformStack.cast(ms)
.rotateY(viewYRot + 90)
.rotateX(-viewXRot) .rotateX(-viewXRot)
.rotateY(180) .rotateY(180)
.translate(0, 0, first ? 0 : -bogeySpacing) .translate(0, 0, first ? 0 : -bogeySpacing)

View file

@ -11,7 +11,7 @@ import org.lwjgl.opengl.GL11;
import org.lwjgl.opengl.GL30; import org.lwjgl.opengl.GL30;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.jozufozu.flywheel.util.transform.TransformStack;
import com.mojang.blaze3d.platform.InputConstants; import com.mojang.blaze3d.platform.InputConstants;
import com.mojang.blaze3d.systems.RenderSystem; import com.mojang.blaze3d.systems.RenderSystem;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
@ -435,7 +435,7 @@ public class ScheduleScreen extends AbstractSimiContainerScreen<ScheduleContaine
matrixStack.popPose(); matrixStack.popPose();
if (xOffset + 16 > cardWidth - 26) { if (xOffset + 16 > cardWidth - 26) {
new MatrixTransformStack(matrixStack).rotateZ(-90); TransformStack.cast(matrixStack).rotateZ(-90);
Matrix4f m = matrixStack.last() Matrix4f m = matrixStack.last()
.pose(); .pose();
GuiUtils.drawGradientRect(m, 200, -cardHeight + 2, 18, -2 - cardHeader, 28, 0x44000000, 0x00000000); GuiUtils.drawGradientRect(m, 200, -cardHeight + 2, 18, -2 - cardHeader, 28, 0x44000000, 0x00000000);

View file

@ -41,6 +41,8 @@ import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.levelgen.structure.BoundingBox; import net.minecraft.world.level.levelgen.structure.BoundingBox;
import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
public class StationTileEntity extends SmartTileEntity { public class StationTileEntity extends SmartTileEntity {
@ -118,7 +120,7 @@ public class StationTileEntity extends SmartTileEntity {
super.read(tag, clientPacket); super.read(tag, clientPacket);
if (tag.contains("ToMigrate")) if (tag.contains("ToMigrate"))
toMigrate = tag.getCompound("ToMigrate"); toMigrate = tag.getCompound("ToMigrate");
renderBounds = null; invalidateRenderBoundingBox();
} }
@Override @Override
@ -511,17 +513,17 @@ public class StationTileEntity extends SmartTileEntity {
sendData(); sendData();
} }
// Render
private AABB renderBounds = null;
@Override @Override
@OnlyIn(Dist.CLIENT)
public AABB getRenderBoundingBox() { public AABB getRenderBoundingBox() {
if (isAssembling()) if (isAssembling())
return INFINITE_EXTENT_AABB; return INFINITE_EXTENT_AABB;
if (renderBounds == null) return super.getRenderBoundingBox();
renderBounds = new AABB(worldPosition, getTarget().getGlobalPosition()).inflate(2); }
return renderBounds;
@Override
protected AABB createRenderBoundingBox() {
return new AABB(worldPosition, getTarget().getGlobalPosition()).inflate(2);
} }
} }

View file

@ -69,6 +69,7 @@ public class SignalTileEntity extends SmartTileEntity {
id = tag.getUUID("Id"); id = tag.getUUID("Id");
state = NBTHelper.readEnum(tag, "State", SignalState.class); state = NBTHelper.readEnum(tag, "State", SignalState.class);
overlay = NBTHelper.readEnum(tag, "Overlay", OverlayState.class); overlay = NBTHelper.readEnum(tag, "Overlay", OverlayState.class);
invalidateRenderBoundingBox();
} }
public boolean isPowered() { public boolean isPowered() {
@ -210,15 +211,9 @@ public class SignalTileEntity extends SmartTileEntity {
scheduleBlockTick(); scheduleBlockTick();
} }
// Render
private AABB renderBounds = null;
@Override @Override
public AABB getRenderBoundingBox() { protected AABB createRenderBoundingBox() {
if (renderBounds == null) return new AABB(worldPosition, getTarget().getGlobalPosition()).inflate(2);
renderBounds = new AABB(worldPosition, getTarget().getGlobalPosition()).inflate(2);
return renderBounds;
} }
} }

View file

@ -1,21 +1,21 @@
package com.simibubi.create.content.logistics.trains.track; package com.simibubi.create.content.logistics.trains.track;
import com.simibubi.create.foundation.tileEntity.SyncedTileEntity; import com.simibubi.create.foundation.tileEntity.CachedRenderBBTileEntity;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.world.level.block.entity.BlockEntityType; import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.AABB;
public class StandardBogeyTileEntity extends SyncedTileEntity { public class StandardBogeyTileEntity extends CachedRenderBBTileEntity {
public StandardBogeyTileEntity(BlockEntityType<?> type, BlockPos pos, BlockState state) { public StandardBogeyTileEntity(BlockEntityType<?> type, BlockPos pos, BlockState state) {
super(type, pos, state); super(type, pos, state);
} }
@Override @Override
public AABB getRenderBoundingBox() { protected AABB createRenderBoundingBox() {
return super.getRenderBoundingBox().inflate(2); return super.createRenderBoundingBox().inflate(2);
} }
} }

View file

@ -8,7 +8,7 @@ import java.util.Map.Entry;
import java.util.Random; import java.util.Random;
import com.jozufozu.flywheel.core.PartialModel; import com.jozufozu.flywheel.core.PartialModel;
import com.jozufozu.flywheel.util.transform.MatrixTransformStack; import com.jozufozu.flywheel.util.transform.TransformStack;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.simibubi.create.AllBlockPartials; import com.simibubi.create.AllBlockPartials;
import com.simibubi.create.AllBlocks; import com.simibubi.create.AllBlocks;
@ -348,7 +348,7 @@ public class TrackBlock extends Block implements EntityBlock, IWrenchable, ITrac
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
public PartialModel prepareAssemblyOverlay(BlockGetter world, BlockPos pos, BlockState state, Direction direction, public PartialModel prepareAssemblyOverlay(BlockGetter world, BlockPos pos, BlockState state, Direction direction,
PoseStack ms) { PoseStack ms) {
new MatrixTransformStack(ms).rotateCentered(Direction.UP, TransformStack.cast(ms).rotateCentered(Direction.UP,
AngleHelper.rad(AngleHelper.horizontalAngle(direction))); AngleHelper.rad(AngleHelper.horizontalAngle(direction)));
return AllBlockPartials.TRACK_ASSEMBLING_OVERLAY; return AllBlockPartials.TRACK_ASSEMBLING_OVERLAY;
} }
@ -365,7 +365,7 @@ public class TrackBlock extends Block implements EntityBlock, IWrenchable, ITrac
Vec3 normal = getUpNormal(world, pos, state); Vec3 normal = getUpNormal(world, pos, state);
Vec3 angles = TrackRenderer.getModelAngles(normal, directionVec); Vec3 angles = TrackRenderer.getModelAngles(normal, directionVec);
new MatrixTransformStack(ms).centre() TransformStack.cast(ms).centre()
.rotateYRadians(angles.y) .rotateYRadians(angles.y)
.rotateXRadians(angles.x) .rotateXRadians(angles.x)
.unCentre() .unCentre()

View file

@ -29,6 +29,7 @@ import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.AABB;
import net.minecraft.world.phys.Vec3; import net.minecraft.world.phys.Vec3;
import net.minecraftforge.api.distmarker.Dist; import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.fml.DistExecutor; import net.minecraftforge.fml.DistExecutor;
public class TrackTileEntity extends SmartTileEntity implements ITransformableTE, IMergeableTE { public class TrackTileEntity extends SmartTileEntity implements ITransformableTE, IMergeableTE {
@ -118,6 +119,7 @@ public class TrackTileEntity extends SmartTileEntity implements ITransformableTE
} }
@Override @Override
@OnlyIn(Dist.CLIENT)
public AABB getRenderBoundingBox() { public AABB getRenderBoundingBox() {
return INFINITE_EXTENT_AABB; return INFINITE_EXTENT_AABB;
} }

View file

@ -1,30 +0,0 @@
package com.simibubi.create.content.palettes;
import com.simibubi.create.foundation.block.render.IBlockVertexColor;
import com.simibubi.create.foundation.utility.Color;
public class ScoriaVertexColor implements IBlockVertexColor {
public static final ScoriaVertexColor INSTANCE = new ScoriaVertexColor();
@Override
public int getColor(float x, float y, float z) {
float x2 = (float) Math.floor(z + x - y * .5);
float y2 = (float) Math.floor(y * 1.5 + x * .5 - z);
float z2 = (float) Math.floor(y - z * .5 - x);
Color color = new Color(0x448888);
if (x2 % 2 == 0)
color.modifyValue(v -> v | 0x0011ff);
if (z2 % 2 == 0)
color.modifyValue(v -> v | 0x888888);
color.mixWith(Color.rainbowColor((int) (x + y + z) * 170), .4f);
if ((x2 % 4 == 0) || (y2 % 4 == 0))
color.mixWith(Color.WHITE, .8f);
return color.getRGB() & 0x00_ffffff;
}
}

View file

@ -13,6 +13,7 @@ import com.simibubi.create.Create;
import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld; import com.simibubi.create.foundation.utility.worldWrappers.WrappedWorld;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.server.level.ServerLevel; import net.minecraft.server.level.ServerLevel;
import net.minecraft.world.entity.Entity; import net.minecraft.world.entity.Entity;
import net.minecraft.world.entity.decoration.ArmorStand; import net.minecraft.world.entity.decoration.ArmorStand;
@ -142,10 +143,15 @@ public class SchematicWorld extends WrappedWorld implements ServerLevelAccessor
} }
@Override @Override
public int getBrightness(LightLayer p_226658_1_, BlockPos p_226658_2_) { public int getBrightness(LightLayer lightLayer, BlockPos pos) {
return 15; return 15;
} }
@Override
public float getShade(Direction face, boolean hasShade) {
return 1f;
}
@Override @Override
public LevelTickAccess<Block> getBlockTicks() { public LevelTickAccess<Block> getBlockTicks() {
return BlackholeTickAccess.emptyLevelList(); return BlackholeTickAccess.emptyLevelList();

View file

@ -55,6 +55,8 @@ import net.minecraft.world.level.block.state.properties.BedPart;
import net.minecraft.world.level.block.state.properties.BlockStateProperties; import net.minecraft.world.level.block.state.properties.BlockStateProperties;
import net.minecraft.world.level.block.state.properties.DoubleBlockHalf; import net.minecraft.world.level.block.state.properties.DoubleBlockHalf;
import net.minecraft.world.phys.AABB; import net.minecraft.world.phys.AABB;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
import net.minecraftforge.common.util.LazyOptional; import net.minecraftforge.common.util.LazyOptional;
import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.CapabilityItemHandler;
import net.minecraftforge.items.IItemHandler; import net.minecraftforge.items.IItemHandler;
@ -812,6 +814,7 @@ public class SchematicannonTileEntity extends SmartTileEntity implements MenuPro
} }
@Override @Override
@OnlyIn(Dist.CLIENT)
public AABB getRenderBoundingBox() { public AABB getRenderBoundingBox() {
return INFINITE_EXTENT_AABB; return INFINITE_EXTENT_AABB;
} }

View file

@ -211,6 +211,12 @@ public class SchematicHandler {
} }
public void updateRenderers() {
for (SchematicRenderer renderer : renderers) {
renderer.update();
}
}
public IIngameOverlay getOverlayRenderer() { public IIngameOverlay getOverlayRenderer() {
return overlayRenderer; return overlayRenderer;
} }

View file

@ -1,14 +1,12 @@
package com.simibubi.create.content.schematics.client; package com.simibubi.create.content.schematics.client;
import java.util.HashMap; import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Random; import java.util.Random;
import java.util.Set;
import com.jozufozu.flywheel.util.transform.TransformStack; import com.jozufozu.flywheel.core.model.ModelUtil;
import com.jozufozu.flywheel.core.model.ShadeSeparatedBufferBuilder;
import com.jozufozu.flywheel.core.model.ShadeSeparatingVertexConsumer;
import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.BufferBuilder;
import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.DefaultVertexFormat;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
@ -22,17 +20,20 @@ import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.ItemBlockRenderTypes; import net.minecraft.client.renderer.ItemBlockRenderTypes;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.block.BlockRenderDispatcher; import net.minecraft.client.renderer.block.BlockRenderDispatcher;
import net.minecraft.client.renderer.block.ModelBlockRenderer;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.world.level.block.RenderShape;
import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.entity.BlockEntity;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.levelgen.structure.BoundingBox;
import net.minecraftforge.client.ForgeHooksClient; import net.minecraftforge.client.ForgeHooksClient;
import net.minecraftforge.client.model.data.EmptyModelData; import net.minecraftforge.client.model.data.EmptyModelData;
public class SchematicRenderer { public class SchematicRenderer {
private static final ThreadLocal<ThreadLocalObjects> THREAD_LOCAL_OBJECTS = ThreadLocal.withInitial(ThreadLocalObjects::new);
private final Map<RenderType, SuperByteBuffer> bufferCache = new HashMap<>(getLayerCount()); private final Map<RenderType, SuperByteBuffer> bufferCache = new HashMap<>(getLayerCount());
private final Set<RenderType> usedBlockRenderLayers = new HashSet<>(getLayerCount());
private final Set<RenderType> startedBufferBuilders = new HashSet<>(getLayerCount());
private boolean active; private boolean active;
private boolean changed; private boolean changed;
protected SchematicWorld schematic; protected SchematicWorld schematic;
@ -64,81 +65,85 @@ public class SchematicRenderer {
if (mc.level == null || mc.player == null || !changed) if (mc.level == null || mc.player == null || !changed)
return; return;
redraw(mc); redraw();
changed = false; changed = false;
} }
public void render(PoseStack ms, SuperRenderTypeBuffer buffer) { public void render(PoseStack ms, SuperRenderTypeBuffer buffers) {
if (!active) if (!active)
return; return;
buffer.getBuffer(RenderType.solid()); bufferCache.forEach((layer, buffer) -> {
for (RenderType layer : RenderType.chunkBufferLayers()) { buffer.renderInto(ms, buffers.getBuffer(layer));
if (!usedBlockRenderLayers.contains(layer)) });
continue; TileEntityRenderHelper.renderTileEntities(schematic, schematic.getRenderedTileEntities(), ms, buffers);
SuperByteBuffer superByteBuffer = bufferCache.get(layer);
superByteBuffer.disableDiffuseMult();
superByteBuffer.renderInto(ms, buffer.getBuffer(layer));
}
TileEntityRenderHelper.renderTileEntities(schematic, schematic.getRenderedTileEntities(), ms, buffer);
} }
protected void redraw(Minecraft minecraft) { protected void redraw() {
usedBlockRenderLayers.clear(); bufferCache.clear();
startedBufferBuilders.clear();
final SchematicWorld blockAccess = schematic;
final BlockRenderDispatcher blockRendererDispatcher = minecraft.getBlockRenderer();
List<BlockState> blockstates = new LinkedList<>();
Map<RenderType, BufferBuilder> buffers = new HashMap<>();
PoseStack ms = new PoseStack();
Random random = new Random();
BlockPos.betweenClosedStream(blockAccess.getBounds())
.forEach(localPos -> {
ms.pushPose();
TransformStack.cast(ms)
.translate(localPos);
BlockPos pos = localPos.offset(anchor);
BlockState state = blockAccess.getBlockState(pos);
for (RenderType blockRenderLayer : RenderType.chunkBufferLayers()) {
if (!ItemBlockRenderTypes.canRenderInLayer(state, blockRenderLayer))
continue;
ForgeHooksClient.setRenderType(blockRenderLayer);
if (!buffers.containsKey(blockRenderLayer))
buffers.put(blockRenderLayer, new BufferBuilder(512));
BufferBuilder bufferBuilder = buffers.get(blockRenderLayer);
if (startedBufferBuilders.add(blockRenderLayer))
bufferBuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.BLOCK);
BlockEntity tileEntity = blockAccess.getBlockEntity(localPos);
if (blockRendererDispatcher.renderBatched(state, pos, blockAccess, ms, bufferBuilder, true,
random, tileEntity != null ? tileEntity.getModelData() : EmptyModelData.INSTANCE)) {
usedBlockRenderLayers.add(blockRenderLayer);
}
blockstates.add(state);
}
ForgeHooksClient.setRenderType(null);
ms.popPose();
});
// finishDrawing
for (RenderType layer : RenderType.chunkBufferLayers()) { for (RenderType layer : RenderType.chunkBufferLayers()) {
if (!startedBufferBuilders.contains(layer)) SuperByteBuffer buffer = drawLayer(layer);
continue; if (!buffer.isEmpty())
BufferBuilder buf = buffers.get(layer); bufferCache.put(layer, buffer);
buf.end();
bufferCache.put(layer, new SuperByteBuffer(buf));
} }
} }
protected SuperByteBuffer drawLayer(RenderType layer) {
BlockRenderDispatcher dispatcher = ModelUtil.VANILLA_RENDERER;
ThreadLocalObjects objects = THREAD_LOCAL_OBJECTS.get();
PoseStack poseStack = objects.poseStack;
Random random = objects.random;
BlockPos.MutableBlockPos mutableBlockPos = objects.mutableBlockPos;
SchematicWorld renderWorld = schematic;
BoundingBox bounds = renderWorld.getBounds();
ShadeSeparatingVertexConsumer shadeSeparatingWrapper = objects.shadeSeparatingWrapper;
ShadeSeparatedBufferBuilder builder = new ShadeSeparatedBufferBuilder(512);
BufferBuilder unshadedBuilder = objects.unshadedBuilder;
builder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.BLOCK);
unshadedBuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.BLOCK);
shadeSeparatingWrapper.prepare(builder, unshadedBuilder);
ForgeHooksClient.setRenderType(layer);
ModelBlockRenderer.enableCaching();
for (BlockPos localPos : BlockPos.betweenClosed(bounds.minX(), bounds.minY(), bounds.minZ(), bounds.maxX(), bounds.maxY(), bounds.maxZ())) {
BlockPos pos = mutableBlockPos.setWithOffset(localPos, anchor);
BlockState state = renderWorld.getBlockState(pos);
poseStack.pushPose();
poseStack.translate(localPos.getX(), localPos.getY(), localPos.getZ());
if (state.getRenderShape() == RenderShape.MODEL && ItemBlockRenderTypes.canRenderInLayer(state, layer)) {
BlockEntity tileEntity = renderWorld.getBlockEntity(localPos);
dispatcher.renderBatched(state, pos, renderWorld, poseStack, shadeSeparatingWrapper, true, random,
tileEntity != null ? tileEntity.getModelData() : EmptyModelData.INSTANCE);
}
poseStack.popPose();
}
ModelBlockRenderer.clearCache();
ForgeHooksClient.setRenderType(null);
shadeSeparatingWrapper.clear();
unshadedBuilder.end();
builder.appendUnshadedVertices(unshadedBuilder);
builder.end();
return new SuperByteBuffer(builder);
}
private static int getLayerCount() { private static int getLayerCount() {
return RenderType.chunkBufferLayers() return RenderType.chunkBufferLayers()
.size(); .size();
} }
private static class ThreadLocalObjects {
public final PoseStack poseStack = new PoseStack();
public final Random random = new Random();
public final BlockPos.MutableBlockPos mutableBlockPos = new BlockPos.MutableBlockPos();
public final ShadeSeparatingVertexConsumer shadeSeparatingWrapper = new ShadeSeparatingVertexConsumer();
public final BufferBuilder unshadedBuilder = new BufferBuilder(512);
}
} }

View file

@ -56,7 +56,7 @@ public class SchematicItem extends Item {
private static final Logger LOGGER = LogManager.getLogger(); private static final Logger LOGGER = LogManager.getLogger();
public SchematicItem(Properties properties) { public SchematicItem(Properties properties) {
super(properties.stacksTo(1)); super(properties);
} }
public static ItemStack create(String schematic, String owner) { public static ItemStack create(String schematic, String owner) {

View file

@ -1,76 +0,0 @@
package com.simibubi.create.foundation.block.render;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
import com.mojang.blaze3d.vertex.DefaultVertexFormat;
import com.mojang.blaze3d.vertex.VertexFormat;
import com.mojang.blaze3d.vertex.VertexFormatElement;
import net.minecraft.client.renderer.block.model.BakedQuad;
import net.minecraft.client.resources.model.BakedModel;
import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction;
import net.minecraft.world.level.BlockAndTintGetter;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraftforge.client.model.BakedModelWrapper;
import net.minecraftforge.client.model.data.IModelData;
import net.minecraftforge.client.model.data.ModelDataMap;
import net.minecraftforge.client.model.data.ModelProperty;
public class ColoredVertexModel extends BakedModelWrapper<BakedModel> {
private static final ModelProperty<BlockPos> POSITION_PROPERTY = new ModelProperty<>();
private IBlockVertexColor color;
public ColoredVertexModel(BakedModel originalModel, IBlockVertexColor color) {
super(originalModel);
this.color = color;
}
@Override
public IModelData getModelData(BlockAndTintGetter world, BlockPos pos, BlockState state, IModelData tileData) {
return new ModelDataMap.Builder().withInitial(POSITION_PROPERTY, pos).build();
}
@Override
public List<BakedQuad> getQuads(BlockState state, Direction side, Random rand, IModelData extraData) {
List<BakedQuad> quads = super.getQuads(state, side, rand, extraData);
if (quads.isEmpty())
return quads;
if (!extraData.hasProperty(POSITION_PROPERTY))
return quads;
BlockPos data = extraData.getData(POSITION_PROPERTY);
quads = new ArrayList<>(quads);
// Optifine might've rejigged vertex data
VertexFormat format = DefaultVertexFormat.BLOCK;
int colorIndex = 0;
for (int elementId = 0; elementId < format.getElements().size(); elementId++) {
VertexFormatElement element = format.getElements().get(elementId);
if (element.getUsage() == VertexFormatElement.Usage.COLOR)
colorIndex = elementId;
}
int colorOffset = format.getOffset(colorIndex) / 4;
for (int i = 0; i < quads.size(); i++) {
BakedQuad quad = quads.get(i);
BakedQuad newQuad = QuadHelper.clone(quad);
int[] vertexData = newQuad.getVertices();
for (int vertex = 0; vertex < vertexData.length; vertex += format.getIntegerSize()) {
float x = Float.intBitsToFloat(vertexData[vertex]);
float y = Float.intBitsToFloat(vertexData[vertex + 1]);
float z = Float.intBitsToFloat(vertexData[vertex + 2]);
int color = this.color.getColor(x + data.getX(), y + data.getY(), z + data.getZ());
vertexData[vertex + colorOffset] = color;
}
quads.set(i, newQuad);
}
return quads;
}
}

View file

@ -1,8 +0,0 @@
package com.simibubi.create.foundation.block.render;
@FunctionalInterface
public interface IBlockVertexColor {
public int getColor(float x, float y, float z);
}

View file

@ -19,8 +19,6 @@ public class CClient extends ConfigBase {
public final ConfigFloat filterItemRenderDistance = f(10f, 1, "filterItemRenderDistance", Comments.filterItemRenderDistance); public final ConfigFloat filterItemRenderDistance = f(10f, 1, "filterItemRenderDistance", Comments.filterItemRenderDistance);
public final ConfigBool rainbowDebug = b(true, "enableRainbowDebug", public final ConfigBool rainbowDebug = b(true, "enableRainbowDebug",
Comments.rainbowDebug); Comments.rainbowDebug);
public final ConfigBool experimentalRendering = b(true, "experimentalRendering",
Comments.experimentalRendering);
public final ConfigInt maxContraptionLightVolume = i(16384, 0, Integer.MAX_VALUE, "maximumContraptionLightVolume", public final ConfigInt maxContraptionLightVolume = i(16384, 0, Integer.MAX_VALUE, "maximumContraptionLightVolume",
Comments.maxContraptionLightVolume); Comments.maxContraptionLightVolume);
// no group // no group
@ -95,7 +93,6 @@ public class CClient extends ConfigBase {
"Maximum Distance to the player at which items in Blocks' filter slots will be displayed" "Maximum Distance to the player at which items in Blocks' filter slots will be displayed"
}; };
static String rainbowDebug = "Show colourful debug information while the F3-Menu is open."; static String rainbowDebug = "Show colourful debug information while the F3-Menu is open.";
static String experimentalRendering = "Use modern OpenGL features to drastically increase performance.";
static String maxContraptionLightVolume = "The maximum amount of blocks for which to try and calculate dynamic contraption lighting. Decrease if large contraption cause too much lag"; static String maxContraptionLightVolume = "The maximum amount of blocks for which to try and calculate dynamic contraption lighting. Decrease if large contraption cause too much lag";
static String[] mainMenuConfigButtonRow = new String[]{ static String[] mainMenuConfigButtonRow = new String[]{
"Choose the menu row that the Create config button appears on in the main menu", "Choose the menu row that the Create config button appears on in the main menu",

View file

@ -18,8 +18,6 @@ import com.simibubi.create.content.contraptions.fluids.VirtualFluid;
import com.simibubi.create.content.contraptions.relays.encased.CasingConnectivity; import com.simibubi.create.content.contraptions.relays.encased.CasingConnectivity;
import com.simibubi.create.foundation.block.connected.CTModel; import com.simibubi.create.foundation.block.connected.CTModel;
import com.simibubi.create.foundation.block.connected.ConnectedTextureBehaviour; import com.simibubi.create.foundation.block.connected.ConnectedTextureBehaviour;
import com.simibubi.create.foundation.block.render.ColoredVertexModel;
import com.simibubi.create.foundation.block.render.IBlockVertexColor;
import com.tterrag.registrate.AbstractRegistrate; import com.tterrag.registrate.AbstractRegistrate;
import com.tterrag.registrate.builders.BlockBuilder; import com.tterrag.registrate.builders.BlockBuilder;
import com.tterrag.registrate.builders.BlockEntityBuilder.BlockEntityFactory; import com.tterrag.registrate.builders.BlockEntityBuilder.BlockEntityFactory;
@ -198,10 +196,6 @@ public class CreateRegistrate extends AbstractRegistrate<CreateRegistrate> {
return entry -> onClient(() -> () -> registerCasingConnectivity(entry, consumer)); return entry -> onClient(() -> () -> registerCasingConnectivity(entry, consumer));
} }
public static <T extends Block> NonNullConsumer<? super T> blockVertexColors(IBlockVertexColor colorFunc) {
return entry -> onClient(() -> () -> registerBlockVertexColor(entry, colorFunc));
}
public static <T extends Block> NonNullConsumer<? super T> blockModel( public static <T extends Block> NonNullConsumer<? super T> blockModel(
Supplier<NonNullFunction<BakedModel, ? extends BakedModel>> func) { Supplier<NonNullFunction<BakedModel, ? extends BakedModel>> func) {
return entry -> onClient(() -> () -> registerBlockModel(entry, func)); return entry -> onClient(() -> () -> registerBlockModel(entry, func));
@ -229,12 +223,6 @@ public class CreateRegistrate extends AbstractRegistrate<CreateRegistrate> {
consumer.accept(entry, CreateClient.CASING_CONNECTIVITY); consumer.accept(entry, CreateClient.CASING_CONNECTIVITY);
} }
@OnlyIn(Dist.CLIENT)
private static void registerBlockVertexColor(Block entry, IBlockVertexColor colorFunc) {
CreateClient.MODEL_SWAPPER.getCustomBlockModels()
.register(entry.delegate, model -> new ColoredVertexModel(model, colorFunc));
}
@OnlyIn(Dist.CLIENT) @OnlyIn(Dist.CLIENT)
private static void registerBlockModel(Block entry, private static void registerBlockModel(Block entry,
Supplier<NonNullFunction<BakedModel, ? extends BakedModel>> func) { Supplier<NonNullFunction<BakedModel, ? extends BakedModel>> func) {

View file

@ -33,8 +33,8 @@ import net.minecraft.core.BlockPos;
import net.minecraft.world.inventory.InventoryMenu; import net.minecraft.world.inventory.InventoryMenu;
import net.minecraft.world.item.ItemStack; import net.minecraft.world.item.ItemStack;
import net.minecraft.world.level.ItemLike; import net.minecraft.world.level.ItemLike;
import net.minecraft.world.level.block.BaseFireBlock;
import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.Blocks;
import net.minecraft.world.level.block.FireBlock;
import net.minecraft.world.level.block.LiquidBlock; import net.minecraft.world.level.block.LiquidBlock;
import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.level.material.Fluid; import net.minecraft.world.level.material.Fluid;
@ -208,7 +208,7 @@ public class GuiGameElement {
@Override @Override
protected void renderModel(BlockRenderDispatcher blockRenderer, MultiBufferSource.BufferSource buffer, protected void renderModel(BlockRenderDispatcher blockRenderer, MultiBufferSource.BufferSource buffer,
RenderType renderType, VertexConsumer vb, PoseStack ms) { RenderType renderType, VertexConsumer vb, PoseStack ms) {
if (blockState.getBlock() instanceof FireBlock) { if (blockState.getBlock() instanceof BaseFireBlock) {
Lighting.setupForFlatItems(); Lighting.setupForFlatItems();
blockRenderer.renderSingleBlock(blockState, ms, buffer, LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY, blockRenderer.renderSingleBlock(blockState, ms, buffer, LightTexture.FULL_BRIGHT, OverlayTexture.NO_OVERLAY,
VirtualEmptyModelData.INSTANCE); VirtualEmptyModelData.INSTANCE);

View file

@ -18,6 +18,7 @@ import javax.annotation.Nullable;
import org.apache.commons.lang3.mutable.MutableDouble; import org.apache.commons.lang3.mutable.MutableDouble;
import org.apache.commons.lang3.mutable.MutableObject; import org.apache.commons.lang3.mutable.MutableObject;
import com.jozufozu.flywheel.util.DiffuseLightCalculator;
import com.jozufozu.flywheel.util.transform.TransformStack; import com.jozufozu.flywheel.util.transform.TransformStack;
import com.mojang.blaze3d.vertex.PoseStack; import com.mojang.blaze3d.vertex.PoseStack;
import com.mojang.math.Matrix4f; import com.mojang.math.Matrix4f;
@ -31,6 +32,7 @@ import com.simibubi.create.foundation.ponder.element.WorldSectionElement;
import com.simibubi.create.foundation.ponder.instruction.HideAllInstruction; import com.simibubi.create.foundation.ponder.instruction.HideAllInstruction;
import com.simibubi.create.foundation.ponder.instruction.PonderInstruction; import com.simibubi.create.foundation.ponder.instruction.PonderInstruction;
import com.simibubi.create.foundation.ponder.ui.PonderUI; import com.simibubi.create.foundation.ponder.ui.PonderUI;
import com.simibubi.create.foundation.render.ForcedDiffuseState;
import com.simibubi.create.foundation.render.SuperRenderTypeBuffer; import com.simibubi.create.foundation.render.SuperRenderTypeBuffer;
import com.simibubi.create.foundation.utility.AnimationTickHolder; import com.simibubi.create.foundation.utility.AnimationTickHolder;
import com.simibubi.create.foundation.utility.Pair; import com.simibubi.create.foundation.utility.Pair;
@ -224,6 +226,7 @@ public class PonderScene {
} }
public void renderScene(SuperRenderTypeBuffer buffer, PoseStack ms, float pt) { public void renderScene(SuperRenderTypeBuffer buffer, PoseStack ms, float pt) {
ForcedDiffuseState.pushCalculator(DiffuseLightCalculator.DEFAULT);
ms.pushPose(); ms.pushPose();
Minecraft mc = Minecraft.getInstance(); Minecraft mc = Minecraft.getInstance();
Entity prevRVE = mc.cameraEntity; Entity prevRVE = mc.cameraEntity;
@ -242,6 +245,7 @@ public class PonderScene {
outliner.renderOutlines(ms, buffer, pt); outliner.renderOutlines(ms, buffer, pt);
ms.popPose(); ms.popPose();
ForcedDiffuseState.popCalculator();
} }
public void renderOverlay(PonderUI screen, PoseStack ms, float partialTicks) { public void renderOverlay(PonderUI screen, PoseStack ms, float partialTicks) {

View file

@ -7,6 +7,9 @@ import java.util.Map.Entry;
import java.util.Random; import java.util.Random;
import java.util.function.Consumer; import java.util.function.Consumer;
import com.jozufozu.flywheel.core.model.ModelUtil;
import com.jozufozu.flywheel.core.model.ShadeSeparatedBufferBuilder;
import com.jozufozu.flywheel.core.model.ShadeSeparatingVertexConsumer;
import com.jozufozu.flywheel.util.transform.TransformStack; import com.jozufozu.flywheel.util.transform.TransformStack;
import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.BufferBuilder;
import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.DefaultVertexFormat;
@ -32,6 +35,7 @@ import net.minecraft.client.renderer.ItemBlockRenderTypes;
import net.minecraft.client.renderer.MultiBufferSource; import net.minecraft.client.renderer.MultiBufferSource;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.block.BlockRenderDispatcher; import net.minecraft.client.renderer.block.BlockRenderDispatcher;
import net.minecraft.client.renderer.block.ModelBlockRenderer;
import net.minecraft.client.resources.model.ModelBakery; import net.minecraft.client.resources.model.ModelBakery;
import net.minecraft.core.BlockPos; import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction.Axis; import net.minecraft.core.Direction.Axis;
@ -57,6 +61,8 @@ public class WorldSectionElement extends AnimatedSceneElement {
public static final SuperByteBufferCache.Compartment<Pair<Integer, Integer>> DOC_WORLD_SECTION = public static final SuperByteBufferCache.Compartment<Pair<Integer, Integer>> DOC_WORLD_SECTION =
new SuperByteBufferCache.Compartment<>(); new SuperByteBufferCache.Compartment<>();
private static final ThreadLocal<ThreadLocalObjects> THREAD_LOCAL_OBJECTS = ThreadLocal.withInitial(ThreadLocalObjects::new);
List<BlockEntity> renderedTileEntities; List<BlockEntity> renderedTileEntities;
List<Pair<BlockEntity, Consumer<Level>>> tickableTileEntities; List<Pair<BlockEntity, Consumer<Level>>> tickableTileEntities;
Selection section; Selection section;
@ -298,13 +304,6 @@ public class WorldSectionElement extends AnimatedSceneElement {
tileEntity.getBlockPos(), tileEntity.getBlockState(), tileEntity))); tileEntity.getBlockPos(), tileEntity.getBlockState(), tileEntity)));
} }
@Override
protected void renderLayer(PonderWorld world, MultiBufferSource buffer, RenderType type, PoseStack ms, float fade,
float pt) {
transformMS(ms, pt);
renderStructure(world, ms, buffer, type, fade);
}
@Override @Override
public void renderFirst(PonderWorld world, MultiBufferSource buffer, PoseStack ms, float fade, float pt) { public void renderFirst(PonderWorld world, MultiBufferSource buffer, PoseStack ms, float fade, float pt) {
int light = -1; int light = -1;
@ -342,8 +341,7 @@ public class WorldSectionElement extends AnimatedSceneElement {
.pose(), .pose(),
overlayMS.last() overlayMS.last()
.normal()); .normal());
Minecraft.getInstance() ModelUtil.VANILLA_RENDERER
.getBlockRenderer()
.renderBatched(world.getBlockState(pos), pos, world, ms, builder, true, new Random(), .renderBatched(world.getBlockState(pos), pos, world, ms, builder, true, new Random(),
EmptyModelData.INSTANCE); EmptyModelData.INSTANCE);
ms.popPose(); ms.popPose();
@ -352,13 +350,15 @@ public class WorldSectionElement extends AnimatedSceneElement {
ms.popPose(); ms.popPose();
} }
protected void renderStructure(PonderWorld world, PoseStack ms, MultiBufferSource buffer, RenderType type, @Override
float fade) { protected void renderLayer(PonderWorld world, MultiBufferSource buffer, RenderType type, PoseStack ms, float fade,
float pt) {
SuperByteBufferCache bufferCache = CreateClient.BUFFER_CACHE; SuperByteBufferCache bufferCache = CreateClient.BUFFER_CACHE;
int code = hashCode() ^ world.hashCode();
int code = hashCode() ^ world.hashCode();
Pair<Integer, Integer> key = Pair.of(code, RenderType.chunkBufferLayers() Pair<Integer, Integer> key = Pair.of(code, RenderType.chunkBufferLayers()
.indexOf(type)); .indexOf(type));
if (redraw) if (redraw)
bufferCache.invalidate(DOC_WORLD_SECTION, key); bufferCache.invalidate(DOC_WORLD_SECTION, key);
SuperByteBuffer contraptionBuffer = SuperByteBuffer contraptionBuffer =
@ -366,8 +366,10 @@ public class WorldSectionElement extends AnimatedSceneElement {
if (contraptionBuffer.isEmpty()) if (contraptionBuffer.isEmpty())
return; return;
transformMS(contraptionBuffer.getTransforms(), pt);
int light = lightCoordsFromFade(fade); int light = lightCoordsFromFade(fade);
contraptionBuffer.light(light) contraptionBuffer
.light(light)
.renderInto(ms, buffer.getBuffer(type)); .renderInto(ms, buffer.getBuffer(type));
} }
@ -404,38 +406,57 @@ public class WorldSectionElement extends AnimatedSceneElement {
} }
private SuperByteBuffer buildStructureBuffer(PonderWorld world, RenderType layer) { private SuperByteBuffer buildStructureBuffer(PonderWorld world, RenderType layer) {
ForgeHooksClient.setRenderType(layer); BlockRenderDispatcher dispatcher = ModelUtil.VANILLA_RENDERER;
BlockRenderDispatcher dispatcher = Minecraft.getInstance() ThreadLocalObjects objects = THREAD_LOCAL_OBJECTS.get();
.getBlockRenderer();
PoseStack ms = new PoseStack();
Random random = new Random();
BufferBuilder builder = new BufferBuilder(512);
builder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.BLOCK);
world.setMask(this.section);
PoseStack poseStack = objects.poseStack;
Random random = objects.random;
ShadeSeparatingVertexConsumer shadeSeparatingWrapper = objects.shadeSeparatingWrapper;
ShadeSeparatedBufferBuilder builder = new ShadeSeparatedBufferBuilder(512);
BufferBuilder unshadedBuilder = objects.unshadedBuilder;
builder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.BLOCK);
unshadedBuilder.begin(VertexFormat.Mode.QUADS, DefaultVertexFormat.BLOCK);
shadeSeparatingWrapper.prepare(builder, unshadedBuilder);
world.setMask(this.section);
ForgeHooksClient.setRenderType(layer);
ModelBlockRenderer.enableCaching();
section.forEach(pos -> { section.forEach(pos -> {
BlockState state = world.getBlockState(pos); BlockState state = world.getBlockState(pos);
FluidState ifluidstate = world.getFluidState(pos); FluidState fluidState = world.getFluidState(pos);
ms.pushPose(); poseStack.pushPose();
ms.translate(pos.getX(), pos.getY(), pos.getZ()); poseStack.translate(pos.getX(), pos.getY(), pos.getZ());
if (state.getRenderShape() == RenderShape.MODEL && ItemBlockRenderTypes.canRenderInLayer(state, layer)) { if (state.getRenderShape() == RenderShape.MODEL && ItemBlockRenderTypes.canRenderInLayer(state, layer)) {
BlockEntity tileEntity = world.getBlockEntity(pos); BlockEntity tileEntity = world.getBlockEntity(pos);
dispatcher.renderBatched(state, pos, world, ms, builder, true, random, dispatcher.renderBatched(state, pos, world, poseStack, shadeSeparatingWrapper, true, random,
tileEntity != null ? tileEntity.getModelData() : EmptyModelData.INSTANCE); tileEntity != null ? tileEntity.getModelData() : EmptyModelData.INSTANCE);
} }
if (!ifluidstate.isEmpty() && ItemBlockRenderTypes.canRenderInLayer(ifluidstate, layer)) if (!fluidState.isEmpty() && ItemBlockRenderTypes.canRenderInLayer(fluidState, layer))
dispatcher.renderLiquid(pos, world, builder, ifluidstate); dispatcher.renderLiquid(pos, world, builder, fluidState);
ms.popPose(); poseStack.popPose();
}); });
ModelBlockRenderer.clearCache();
world.clearMask();
builder.end();
ForgeHooksClient.setRenderType(null); ForgeHooksClient.setRenderType(null);
world.clearMask();
shadeSeparatingWrapper.clear();
unshadedBuilder.end();
builder.appendUnshadedVertices(unshadedBuilder);
builder.end();
return new SuperByteBuffer(builder); return new SuperByteBuffer(builder);
} }
private static class ThreadLocalObjects {
public final PoseStack poseStack = new PoseStack();
public final Random random = new Random();
public final ShadeSeparatingVertexConsumer shadeSeparatingWrapper = new ShadeSeparatingVertexConsumer();
public final BufferBuilder unshadedBuilder = new BufferBuilder(512);
}
} }

View file

@ -0,0 +1,31 @@
package com.simibubi.create.foundation.render;
import javax.annotation.Nullable;
import com.jozufozu.flywheel.util.DiffuseLightCalculator;
import it.unimi.dsi.fastutil.objects.ObjectArrayList;
public final class ForcedDiffuseState {
private static final ThreadLocal<ObjectArrayList<DiffuseLightCalculator>> FORCED_DIFFUSE = ThreadLocal.withInitial(ObjectArrayList::new);
private ForcedDiffuseState() {
}
public static void pushCalculator(DiffuseLightCalculator calculator) {
FORCED_DIFFUSE.get().push(calculator);
}
public static void popCalculator() {
FORCED_DIFFUSE.get().pop();
}
@Nullable
public static DiffuseLightCalculator getForcedCalculator() {
ObjectArrayList<DiffuseLightCalculator> stack = FORCED_DIFFUSE.get();
if (stack.isEmpty()) {
return null;
}
return stack.top();
}
}

View file

@ -1,5 +1,7 @@
package com.simibubi.create.foundation.render; package com.simibubi.create.foundation.render;
import java.io.IOException;
import com.mojang.blaze3d.vertex.DefaultVertexFormat; import com.mojang.blaze3d.vertex.DefaultVertexFormat;
import com.mojang.blaze3d.vertex.VertexFormat; import com.mojang.blaze3d.vertex.VertexFormat;
import com.simibubi.create.AllSpecialTextures; import com.simibubi.create.AllSpecialTextures;
@ -7,20 +9,29 @@ import com.simibubi.create.Create;
import net.minecraft.client.renderer.RenderStateShard; import net.minecraft.client.renderer.RenderStateShard;
import net.minecraft.client.renderer.RenderType; import net.minecraft.client.renderer.RenderType;
import net.minecraft.client.renderer.ShaderInstance;
import net.minecraft.resources.ResourceLocation; import net.minecraft.resources.ResourceLocation;
import net.minecraft.server.packs.resources.ResourceManager;
import net.minecraft.world.inventory.InventoryMenu; import net.minecraft.world.inventory.InventoryMenu;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.client.event.RegisterShadersEvent;
import net.minecraftforge.eventbus.api.SubscribeEvent;
import net.minecraftforge.fml.common.Mod.EventBusSubscriber;
// TODO 1.17: use custom shaders instead of vanilla ones // TODO 1.17: use custom shaders instead of vanilla ones
public class RenderTypes extends RenderStateShard { public class RenderTypes extends RenderStateShard {
public static final RenderStateShard.ShaderStateShard GLOWING_SHADER = new RenderStateShard.ShaderStateShard(() -> Shaders.glowingShader);
private static final RenderType OUTLINE_SOLID = private static final RenderType OUTLINE_SOLID =
RenderType.create(createLayerName("outline_solid"), DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, true, RenderType.create(createLayerName("outline_solid"), DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, false,
false, RenderType.CompositeState.builder() false, RenderType.CompositeState.builder()
.setShaderState(RENDERTYPE_ENTITY_SOLID_SHADER) .setShaderState(RENDERTYPE_ENTITY_SOLID_SHADER)
.setTextureState(new RenderStateShard.TextureStateShard(AllSpecialTextures.BLANK.getLocation(), false, false)) .setTextureState(new RenderStateShard.TextureStateShard(AllSpecialTextures.BLANK.getLocation(), false, false))
.setCullState(CULL)
.setLightmapState(LIGHTMAP) .setLightmapState(LIGHTMAP)
.setOverlayState(OVERLAY) .setOverlayState(OVERLAY)
.createCompositeState(true)); .createCompositeState(false));
public static RenderType getOutlineSolid() { public static RenderType getOutlineSolid() {
return OUTLINE_SOLID; return OUTLINE_SOLID;
@ -28,22 +39,23 @@ public class RenderTypes extends RenderStateShard {
public static RenderType getOutlineTranslucent(ResourceLocation texture, boolean cull) { public static RenderType getOutlineTranslucent(ResourceLocation texture, boolean cull) {
return RenderType.create(createLayerName("outline_translucent" + (cull ? "_cull" : "")), return RenderType.create(createLayerName("outline_translucent" + (cull ? "_cull" : "")),
DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, true, true, RenderType.CompositeState.builder() DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, false, true, RenderType.CompositeState.builder()
.setShaderState(RENDERTYPE_ENTITY_TRANSLUCENT_SHADER) .setShaderState(cull ? RENDERTYPE_ENTITY_TRANSLUCENT_CULL_SHADER : RENDERTYPE_ENTITY_TRANSLUCENT_SHADER)
.setTextureState(new RenderStateShard.TextureStateShard(texture, false, false)) .setTextureState(new RenderStateShard.TextureStateShard(texture, false, false))
.setTransparencyState(TRANSLUCENT_TRANSPARENCY) .setTransparencyState(TRANSLUCENT_TRANSPARENCY)
.setCullState(cull ? CULL : NO_CULL) .setCullState(cull ? CULL : NO_CULL)
.setLightmapState(LIGHTMAP) .setLightmapState(LIGHTMAP)
.setOverlayState(OVERLAY) .setOverlayState(OVERLAY)
.setWriteMaskState(COLOR_WRITE) .setWriteMaskState(COLOR_WRITE)
.createCompositeState(true)); .createCompositeState(false));
} }
public static RenderType getGlowingSolid(ResourceLocation texture) { public static RenderType getGlowingSolid(ResourceLocation texture) {
return RenderType.create(createLayerName("glowing_solid"), DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, return RenderType.create(createLayerName("glowing_solid"), DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256,
true, false, RenderType.CompositeState.builder() true, false, RenderType.CompositeState.builder()
.setShaderState(NEW_ENTITY_SHADER) .setShaderState(GLOWING_SHADER)
.setTextureState(new RenderStateShard.TextureStateShard(texture, false, false)) .setTextureState(new RenderStateShard.TextureStateShard(texture, false, false))
.setCullState(CULL)
.setLightmapState(LIGHTMAP) .setLightmapState(LIGHTMAP)
.setOverlayState(OVERLAY) .setOverlayState(OVERLAY)
.createCompositeState(true)); .createCompositeState(true));
@ -58,10 +70,9 @@ public class RenderTypes extends RenderStateShard {
public static RenderType getGlowingTranslucent(ResourceLocation texture) { public static RenderType getGlowingTranslucent(ResourceLocation texture) {
return RenderType.create(createLayerName("glowing_translucent"), DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, return RenderType.create(createLayerName("glowing_translucent"), DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS,
256, true, true, RenderType.CompositeState.builder() 256, true, true, RenderType.CompositeState.builder()
.setShaderState(NEW_ENTITY_SHADER) .setShaderState(GLOWING_SHADER)
.setTextureState(new RenderStateShard.TextureStateShard(texture, false, false)) .setTextureState(new RenderStateShard.TextureStateShard(texture, false, false))
.setTransparencyState(TRANSLUCENT_TRANSPARENCY) .setTransparencyState(TRANSLUCENT_TRANSPARENCY)
.setCullState(NO_CULL)
.setLightmapState(LIGHTMAP) .setLightmapState(LIGHTMAP)
.setOverlayState(OVERLAY) .setOverlayState(OVERLAY)
.createCompositeState(true)); .createCompositeState(true));
@ -92,7 +103,7 @@ public class RenderTypes extends RenderStateShard {
false, RenderType.CompositeState.builder() false, RenderType.CompositeState.builder()
.setShaderState(RENDERTYPE_ENTITY_SOLID_SHADER) .setShaderState(RENDERTYPE_ENTITY_SOLID_SHADER)
.setTextureState(BLOCK_SHEET) .setTextureState(BLOCK_SHEET)
.setTransparencyState(NO_TRANSPARENCY) .setCullState(CULL)
.setLightmapState(LIGHTMAP) .setLightmapState(LIGHTMAP)
.setOverlayState(OVERLAY) .setOverlayState(OVERLAY)
.createCompositeState(true)); .createCompositeState(true));
@ -103,7 +114,7 @@ public class RenderTypes extends RenderStateShard {
private static final RenderType ITEM_PARTIAL_TRANSLUCENT = RenderType.create(createLayerName("item_partial_translucent"), private static final RenderType ITEM_PARTIAL_TRANSLUCENT = RenderType.create(createLayerName("item_partial_translucent"),
DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, true, true, RenderType.CompositeState.builder() DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, true, true, RenderType.CompositeState.builder()
.setShaderState(RENDERTYPE_ENTITY_TRANSLUCENT_SHADER) .setShaderState(RENDERTYPE_ENTITY_TRANSLUCENT_CULL_SHADER)
.setTextureState(BLOCK_SHEET) .setTextureState(BLOCK_SHEET)
.setTransparencyState(TRANSLUCENT_TRANSPARENCY) .setTransparencyState(TRANSLUCENT_TRANSPARENCY)
.setLightmapState(LIGHTMAP) .setLightmapState(LIGHTMAP)
@ -115,8 +126,8 @@ public class RenderTypes extends RenderStateShard {
} }
private static final RenderType FLUID = RenderType.create(createLayerName("fluid"), private static final RenderType FLUID = RenderType.create(createLayerName("fluid"),
DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, true, true, RenderType.CompositeState.builder() DefaultVertexFormat.NEW_ENTITY, VertexFormat.Mode.QUADS, 256, false, true, RenderType.CompositeState.builder()
.setShaderState(RENDERTYPE_ENTITY_TRANSLUCENT_SHADER) .setShaderState(RENDERTYPE_ENTITY_TRANSLUCENT_CULL_SHADER)
.setTextureState(BLOCK_SHEET_MIPPED) .setTextureState(BLOCK_SHEET_MIPPED)
.setTransparencyState(TRANSLUCENT_TRANSPARENCY) .setTransparencyState(TRANSLUCENT_TRANSPARENCY)
.setLightmapState(LIGHTMAP) .setLightmapState(LIGHTMAP)
@ -136,4 +147,15 @@ public class RenderTypes extends RenderStateShard {
super(null, null, null); super(null, null, null);
} }
@EventBusSubscriber(value = Dist.CLIENT, bus = EventBusSubscriber.Bus.MOD)
private static class Shaders {
private static ShaderInstance glowingShader;
@SubscribeEvent
public static void onRegisterShaders(RegisterShadersEvent event) throws IOException {
ResourceManager resourceManager = event.getResourceManager();
event.registerShader(new ShaderInstance(resourceManager, Create.asResource("glowing_shader"), DefaultVertexFormat.NEW_ENTITY), shader -> glowingShader = shader);
}
}
} }

View file

@ -1,8 +1,13 @@
package com.simibubi.create.foundation.render; package com.simibubi.create.foundation.render;
import java.util.function.IntPredicate;
import com.jozufozu.flywheel.api.vertex.ShadedVertexList;
import com.jozufozu.flywheel.api.vertex.VertexList; import com.jozufozu.flywheel.api.vertex.VertexList;
import com.jozufozu.flywheel.backend.OptifineHandler; import com.jozufozu.flywheel.backend.OptifineHandler;
import com.jozufozu.flywheel.core.model.ShadeSeparatedBufferBuilder;
import com.jozufozu.flywheel.core.vertex.BlockVertexList; import com.jozufozu.flywheel.core.vertex.BlockVertexList;
import com.jozufozu.flywheel.util.DiffuseLightCalculator;
import com.jozufozu.flywheel.util.transform.TStack; import com.jozufozu.flywheel.util.transform.TStack;
import com.jozufozu.flywheel.util.transform.Transform; import com.jozufozu.flywheel.util.transform.Transform;
import com.mojang.blaze3d.vertex.BufferBuilder; import com.mojang.blaze3d.vertex.BufferBuilder;
@ -27,11 +32,11 @@ import net.minecraft.core.BlockPos;
import net.minecraft.core.Direction; import net.minecraft.core.Direction;
import net.minecraft.util.Mth; import net.minecraft.util.Mth;
import net.minecraft.world.level.Level; import net.minecraft.world.level.Level;
import net.minecraftforge.client.model.pipeline.LightUtil;
public class SuperByteBuffer implements Transform<SuperByteBuffer>, TStack<SuperByteBuffer> { public class SuperByteBuffer implements Transform<SuperByteBuffer>, TStack<SuperByteBuffer> {
private final VertexList template; private final VertexList template;
private final IntPredicate shadedPredicate;
// Vertex Position // Vertex Position
private final PoseStack transforms; private final PoseStack transforms;
@ -40,13 +45,14 @@ public class SuperByteBuffer implements Transform<SuperByteBuffer>, TStack<Super
private boolean shouldColor; private boolean shouldColor;
private int r, g, b, a; private int r, g, b, a;
private boolean disableDiffuseMult; private boolean disableDiffuseMult;
private DiffuseLightCalculator diffuseCalculator;
// Vertex Texture Coords // Vertex Texture Coords
private SpriteShiftFunc spriteShiftFunc; private SpriteShiftFunc spriteShiftFunc;
// Vertex Overlay Color // Vertex Overlay Color
private boolean hasOverlay; private boolean hasOverlay;
private int overlay = OverlayTexture.NO_OVERLAY;; private int overlay = OverlayTexture.NO_OVERLAY;
// Vertex Lighting // Vertex Lighting
private boolean useWorldLight; private boolean useWorldLight;
@ -62,7 +68,14 @@ public class SuperByteBuffer implements Transform<SuperByteBuffer>, TStack<Super
private static final Long2IntMap WORLD_LIGHT_CACHE = new Long2IntOpenHashMap(); private static final Long2IntMap WORLD_LIGHT_CACHE = new Long2IntOpenHashMap();
public SuperByteBuffer(BufferBuilder buf) { public SuperByteBuffer(BufferBuilder buf) {
template = new BlockVertexList(buf); if (buf instanceof ShadeSeparatedBufferBuilder separated) {
ShadedVertexList template = new BlockVertexList.Shaded(separated);
shadedPredicate = template::isShaded;
this.template = template;
} else {
template = new BlockVertexList(buf);
shadedPredicate = index -> true;
}
transforms = new PoseStack(); transforms = new PoseStack();
transforms.pushPose(); transforms.pushPose();
} }
@ -95,8 +108,16 @@ public class SuperByteBuffer implements Transform<SuperByteBuffer>, TStack<Super
final Vector3f normal = new Vector3f(); final Vector3f normal = new Vector3f();
final Vector4f lightPos = new Vector4f(); final Vector4f lightPos = new Vector4f();
float f = .5f; DiffuseLightCalculator diffuseCalculator = ForcedDiffuseState.getForcedCalculator();
int vertexCount = template.getVertexCount(); final boolean disableDiffuseMult = this.disableDiffuseMult || (OptifineHandler.isUsingShaders() && diffuseCalculator == null);
if (diffuseCalculator == null) {
diffuseCalculator = this.diffuseCalculator;
if (diffuseCalculator == null) {
diffuseCalculator = DiffuseLightCalculator.forCurrentLevel();
}
}
final int vertexCount = template.getVertexCount();
for (int i = 0; i < vertexCount; i++) { for (int i = 0; i < vertexCount; i++) {
float x = template.getX(i); float x = template.getX(i);
float y = template.getY(i); float y = template.getY(i);
@ -128,10 +149,10 @@ public class SuperByteBuffer implements Transform<SuperByteBuffer>, TStack<Super
b = template.getB(i); b = template.getB(i);
a = template.getA(i); a = template.getA(i);
} }
if (disableDiffuseMult || OptifineHandler.usingShaders()) { if (disableDiffuseMult) {
builder.color(r, g, b, a); builder.color(r, g, b, a);
} else { } else {
float instanceDiffuse = LightUtil.diffuseLight(nx, ny, nz); float instanceDiffuse = diffuseCalculator.getDiffuse(nx, ny, nz, shadedPredicate.test(i));
int colorR = transformColor(r, instanceDiffuse); int colorR = transformColor(r, instanceDiffuse);
int colorG = transformColor(g, instanceDiffuse); int colorG = transformColor(g, instanceDiffuse);
int colorB = transformColor(b, instanceDiffuse); int colorB = transformColor(b, instanceDiffuse);
@ -152,7 +173,7 @@ public class SuperByteBuffer implements Transform<SuperByteBuffer>, TStack<Super
int light; int light;
if (useWorldLight) { if (useWorldLight) {
lightPos.set(((x - f) * 15 / 16f) + f, (y - f) * 15 / 16f + f, (z - f) * 15 / 16f + f, 1F); lightPos.set(((x - .5f) * 15 / 16f) + .5f, (y - .5f) * 15 / 16f + .5f, (z - .5f) * 15 / 16f + .5f, 1f);
lightPos.transform(localTransforms); lightPos.transform(localTransforms);
if (lightTransform != null) { if (lightTransform != null) {
lightPos.transform(lightTransform); lightPos.transform(lightTransform);
@ -193,6 +214,7 @@ public class SuperByteBuffer implements Transform<SuperByteBuffer>, TStack<Super
b = 0; b = 0;
a = 0; a = 0;
disableDiffuseMult = false; disableDiffuseMult = false;
diffuseCalculator = null;
spriteShiftFunc = null; spriteShiftFunc = null;
hasOverlay = false; hasOverlay = false;
overlay = OverlayTexture.NO_OVERLAY; overlay = OverlayTexture.NO_OVERLAY;
@ -209,6 +231,10 @@ public class SuperByteBuffer implements Transform<SuperByteBuffer>, TStack<Super
return template.isEmpty(); return template.isEmpty();
} }
public PoseStack getTransforms() {
return transforms;
}
@Override @Override
public SuperByteBuffer translate(double x, double y, double z) { public SuperByteBuffer translate(double x, double y, double z) {
transforms.translate(x, y, z); transforms.translate(x, y, z);
@ -310,6 +336,11 @@ public class SuperByteBuffer implements Transform<SuperByteBuffer>, TStack<Super
return this; return this;
} }
public SuperByteBuffer diffuseCalculator(DiffuseLightCalculator diffuseCalculator) {
this.diffuseCalculator = diffuseCalculator;
return this;
}
public SuperByteBuffer shiftUV(SpriteShiftEntry entry) { public SuperByteBuffer shiftUV(SpriteShiftEntry entry) {
this.spriteShiftFunc = (builder, u, v) -> { this.spriteShiftFunc = (builder, u, v) -> {
float targetU = entry.getTarget() float targetU = entry.getTarget()
@ -441,8 +472,8 @@ public class SuperByteBuffer implements Transform<SuperByteBuffer>, TStack<Super
} }
@FunctionalInterface @FunctionalInterface
public interface IVertexLighter { public interface VertexLighter {
public int getPackedLight(float x, float y, float z); int getPackedLight(float x, float y, float z);
} }
} }

View file

@ -15,7 +15,7 @@ import net.minecraft.client.resources.model.ModelBakery;
public class SuperRenderTypeBuffer implements MultiBufferSource { public class SuperRenderTypeBuffer implements MultiBufferSource {
private static final SuperRenderTypeBuffer INSTANCE = new SuperRenderTypeBuffer();; private static final SuperRenderTypeBuffer INSTANCE = new SuperRenderTypeBuffer();
public static SuperRenderTypeBuffer getInstance() { public static SuperRenderTypeBuffer getInstance() {
return INSTANCE; return INSTANCE;

View file

@ -77,9 +77,9 @@ public class TileEntityRenderHelper {
} catch (Exception e) { } catch (Exception e) {
iterator.remove(); iterator.remove();
String message = "TileEntity " + tileEntity.getType() String message = "BlockEntity " + tileEntity.getType()
.getRegistryName() .getRegistryName()
.toString() + " didn't want to render while moved.\n"; .toString() + " could not be rendered virtually.";
if (AllConfigs.CLIENT.explainRenderErrors.get()) if (AllConfigs.CLIENT.explainRenderErrors.get())
Create.LOGGER.error(message, e); Create.LOGGER.error(message, e);
else else

View file

@ -0,0 +1,35 @@
package com.simibubi.create.foundation.tileEntity;
import net.minecraft.core.BlockPos;
import net.minecraft.world.level.block.entity.BlockEntityType;
import net.minecraft.world.level.block.state.BlockState;
import net.minecraft.world.phys.AABB;
import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.api.distmarker.OnlyIn;
public abstract class CachedRenderBBTileEntity extends SyncedTileEntity {
private AABB renderBoundingBox;
public CachedRenderBBTileEntity(BlockEntityType<?> type, BlockPos pos, BlockState state) {
super(type, pos, state);
}
@Override
@OnlyIn(Dist.CLIENT)
public AABB getRenderBoundingBox() {
if (renderBoundingBox == null) {
renderBoundingBox = createRenderBoundingBox();
}
return renderBoundingBox;
}
protected void invalidateRenderBoundingBox() {
renderBoundingBox = null;
}
protected AABB createRenderBoundingBox() {
return super.getRenderBoundingBox();
}
}

View file

@ -23,7 +23,7 @@ import net.minecraftforge.common.capabilities.Capability;
import net.minecraftforge.fluids.capability.CapabilityFluidHandler; import net.minecraftforge.fluids.capability.CapabilityFluidHandler;
import net.minecraftforge.items.CapabilityItemHandler; import net.minecraftforge.items.CapabilityItemHandler;
public abstract class SmartTileEntity extends SyncedTileEntity implements IPartialSafeNBT, IInteractionChecker { public abstract class SmartTileEntity extends CachedRenderBBTileEntity implements IPartialSafeNBT, IInteractionChecker {
private final Map<BehaviourType<?>, TileEntityBehaviour> behaviours = new HashMap<>(); private final Map<BehaviourType<?>, TileEntityBehaviour> behaviours = new HashMap<>();
private boolean initialized = false; private boolean initialized = false;

View file

@ -10,11 +10,11 @@ import net.minecraft.world.level.LevelAccessor;
public class AnimationTickHolder { public class AnimationTickHolder {
private static int ticks; private static int ticks;
private static int paused_ticks; private static int pausedTicks;
public static void reset() { public static void reset() {
ticks = 0; ticks = 0;
paused_ticks = 0; pausedTicks = 0;
} }
public static void tick() { public static void tick() {
@ -22,7 +22,7 @@ public class AnimationTickHolder {
.isPaused()) { .isPaused()) {
ticks = (ticks + 1) % 1_728_000; // wrap around every 24 hours so we maintain enough floating point precision ticks = (ticks + 1) % 1_728_000; // wrap around every 24 hours so we maintain enough floating point precision
} else { } else {
paused_ticks = (paused_ticks + 1) % 1_728_000; pausedTicks = (pausedTicks + 1) % 1_728_000;
} }
} }
@ -31,7 +31,7 @@ public class AnimationTickHolder {
} }
public static int getTicks(boolean includePaused) { public static int getTicks(boolean includePaused) {
return includePaused ? ticks + paused_ticks : ticks; return includePaused ? ticks + pausedTicks : ticks;
} }
public static float getRenderTime() { public static float getRenderTime() {

View file

@ -9,7 +9,7 @@ import net.minecraft.util.Mth;
// InterpolatedChasingValue, InterpolatedValue, InterpolatedChasingAngle, InterpolatedAngle // InterpolatedChasingValue, InterpolatedValue, InterpolatedChasingAngle, InterpolatedAngle
public class LerpedFloat { public class LerpedFloat {
protected Interpolater interpolater; protected Interpolator interpolator;
protected float previousValue; protected float previousValue;
protected float value; protected float value;
@ -19,8 +19,8 @@ public class LerpedFloat {
protected boolean forcedSync; protected boolean forcedSync;
public LerpedFloat(Interpolater interpolater) { public LerpedFloat(Interpolator interpolator) {
this.interpolater = interpolater; this.interpolator = interpolator;
startWithValue(0); startWithValue(0);
forcedSync = true; forcedSync = true;
} }
@ -79,7 +79,7 @@ public class LerpedFloat {
} }
public float getValue(float partialTicks) { public float getValue(float partialTicks) {
return interpolater.interpolate(partialTicks, previousValue, value); return interpolator.interpolate(partialTicks, previousValue, value);
} }
public boolean settled() { public boolean settled() {
@ -117,7 +117,7 @@ public class LerpedFloat {
} }
@FunctionalInterface @FunctionalInterface
public interface Interpolater { public interface Interpolator {
float interpolate(double progress, double current, double target); float interpolate(double progress, double current, double target);
} }

View file

@ -1,5 +1,4 @@
#use "flywheel:context/fog.glsl" #use "flywheel:context/fog.glsl"
#use "flywheel:core/diffuse.glsl"
uniform sampler3D uLightVolume; uniform sampler3D uLightVolume;

View file

@ -13,7 +13,6 @@
"name": "Axis", "name": "Axis",
"from": [6, 0, 6], "from": [6, 0, 6],
"to": [10, 16, 10], "to": [10, 16, 10],
"shade": false,
"faces": { "faces": {
"north": {"uv": [6, 0, 10, 16], "texture": "#0"}, "north": {"uv": [6, 0, 10, 16], "texture": "#0"},
"east": {"uv": [6, 0, 10, 16], "texture": "#0"}, "east": {"uv": [6, 0, 10, 16], "texture": "#0"},

View file

@ -13,7 +13,6 @@
"name": "Axis", "name": "Axis",
"from": [6, 0, 6], "from": [6, 0, 6],
"to": [10, 16, 10], "to": [10, 16, 10],
"shade": false,
"faces": { "faces": {
"north": {"uv": [6, 0, 10, 16], "texture": "#0"}, "north": {"uv": [6, 0, 10, 16], "texture": "#0"},
"east": {"uv": [6, 0, 10, 16], "texture": "#0"}, "east": {"uv": [6, 0, 10, 16], "texture": "#0"},

View file

@ -139,7 +139,6 @@
"name": "Axis", "name": "Axis",
"from": [6, 6, 6], "from": [6, 6, 6],
"to": [10, 10, 16], "to": [10, 10, 16],
"shade": false,
"rotation": {"angle": 22.5, "axis": "z", "origin": [8, 8, 8]}, "rotation": {"angle": 22.5, "axis": "z", "origin": [8, 8, 8]},
"faces": { "faces": {
"north": {"uv": [6, 6, 10, 10], "rotation": 180, "texture": "#1_1"}, "north": {"uv": [6, 6, 10, 10], "rotation": 180, "texture": "#1_1"},

View file

@ -14,7 +14,6 @@
"name": "Axis", "name": "Axis",
"from": [6, 0, 6], "from": [6, 0, 6],
"to": [10, 16, 10], "to": [10, 16, 10],
"shade": false,
"faces": { "faces": {
"north": {"uv": [6, 0, 10, 16], "texture": "#axis"}, "north": {"uv": [6, 0, 10, 16], "texture": "#axis"},
"east": {"uv": [6, 0, 10, 16], "texture": "#axis"}, "east": {"uv": [6, 0, 10, 16], "texture": "#axis"},

View file

@ -185,7 +185,6 @@
"name": "Axis", "name": "Axis",
"from": [6, 0, 6], "from": [6, 0, 6],
"to": [10, 16, 10], "to": [10, 16, 10],
"shade": false,
"faces": { "faces": {
"north": {"uv": [6, 0, 10, 16], "texture": "#0"}, "north": {"uv": [6, 0, 10, 16], "texture": "#0"},
"east": {"uv": [6, 0, 10, 16], "texture": "#0"}, "east": {"uv": [6, 0, 10, 16], "texture": "#0"},

View file

@ -27,7 +27,6 @@
"name": "Axis", "name": "Axis",
"from": [6, 6, 0], "from": [6, 6, 0],
"to": [10, 10, 16], "to": [10, 10, 16],
"shade": false,
"faces": { "faces": {
"north": {"uv": [6, 6, 10, 10], "rotation": 180, "texture": "#1_1"}, "north": {"uv": [6, 6, 10, 10], "rotation": 180, "texture": "#1_1"},
"east": {"uv": [6, 0, 10, 16], "rotation": 90, "texture": "#1_0"}, "east": {"uv": [6, 0, 10, 16], "rotation": 90, "texture": "#1_0"},

View file

@ -36,7 +36,6 @@
"name": "Axis", "name": "Axis",
"from": [6, 0, 6], "from": [6, 0, 6],
"to": [10, 16, 10], "to": [10, 16, 10],
"shade": false,
"faces": { "faces": {
"north": {"uv": [6, 0, 10, 16], "texture": "#0"}, "north": {"uv": [6, 0, 10, 16], "texture": "#0"},
"east": {"uv": [6, 0, 10, 16], "texture": "#0"}, "east": {"uv": [6, 0, 10, 16], "texture": "#0"},

View file

@ -25,7 +25,6 @@
"name": "Axis", "name": "Axis",
"from": [6, 0, 6], "from": [6, 0, 6],
"to": [10, 16, 10], "to": [10, 16, 10],
"shade": false,
"faces": { "faces": {
"north": {"uv": [6, 0, 10, 16], "rotation": 180, "texture": "#0"}, "north": {"uv": [6, 0, 10, 16], "rotation": 180, "texture": "#0"},
"east": {"uv": [6, 0, 10, 16], "rotation": 180, "texture": "#0"}, "east": {"uv": [6, 0, 10, 16], "rotation": 180, "texture": "#0"},

View file

@ -36,7 +36,6 @@
"name": "Axis", "name": "Axis",
"from": [6, 0, 6], "from": [6, 0, 6],
"to": [10, 16, 10], "to": [10, 16, 10],
"shade": false,
"faces": { "faces": {
"north": {"uv": [6, 0, 10, 16], "texture": "#0"}, "north": {"uv": [6, 0, 10, 16], "texture": "#0"},
"east": {"uv": [6, 0, 10, 16], "texture": "#0"}, "east": {"uv": [6, 0, 10, 16], "texture": "#0"},

View file

@ -11,7 +11,6 @@
"name": "Axis", "name": "Axis",
"from": [6, 0, 6], "from": [6, 0, 6],
"to": [10, 5, 10], "to": [10, 5, 10],
"shade": false,
"faces": { "faces": {
"north": {"uv": [6, 0, 10, 5], "rotation": 180, "texture": "#0"}, "north": {"uv": [6, 0, 10, 5], "rotation": 180, "texture": "#0"},
"east": {"uv": [6, 0, 10, 5], "rotation": 180, "texture": "#0"}, "east": {"uv": [6, 0, 10, 5], "rotation": 180, "texture": "#0"},

View file

@ -13,7 +13,6 @@
"name": "Axis", "name": "Axis",
"from": [6, 6, 11], "from": [6, 6, 11],
"to": [10, 10, 16], "to": [10, 10, 16],
"shade": false,
"faces": { "faces": {
"east": {"uv": [6, 0, 10, 5], "rotation": 270, "texture": "#0"}, "east": {"uv": [6, 0, 10, 5], "rotation": 270, "texture": "#0"},
"south": {"uv": [6, 6, 10, 10], "texture": "#1"}, "south": {"uv": [6, 6, 10, 10], "texture": "#1"},

View file

@ -27,7 +27,6 @@
"name": "Axis", "name": "Axis",
"from": [6, 0, 6], "from": [6, 0, 6],
"to": [10, 16, 10], "to": [10, 16, 10],
"shade": false,
"faces": { "faces": {
"north": {"uv": [6, 0, 10, 16], "texture": "#0"}, "north": {"uv": [6, 0, 10, 16], "texture": "#0"},
"east": {"uv": [6, 0, 10, 16], "texture": "#0"}, "east": {"uv": [6, 0, 10, 16], "texture": "#0"},

View file

@ -14,7 +14,6 @@
"name": "Axle", "name": "Axle",
"from": [6, 6, 0], "from": [6, 6, 0],
"to": [10, 10, 4], "to": [10, 10, 4],
"shade": false,
"faces": { "faces": {
"north": {"uv": [6, 6, 10, 10], "texture": "#0"}, "north": {"uv": [6, 6, 10, 10], "texture": "#0"},
"east": {"uv": [6, 12, 10, 16], "rotation": 90, "texture": "#1"}, "east": {"uv": [6, 12, 10, 16], "rotation": 90, "texture": "#1"},

View file

@ -17,7 +17,6 @@
"name": "Axle", "name": "Axle",
"from": [6, 6, 0], "from": [6, 6, 0],
"to": [10, 10, 4], "to": [10, 10, 4],
"shade": false,
"faces": { "faces": {
"north": {"uv": [6, 6, 10, 10], "texture": "#0"}, "north": {"uv": [6, 6, 10, 10], "texture": "#0"},
"east": {"uv": [6, 12, 10, 16], "rotation": 90, "texture": "#1"}, "east": {"uv": [6, 12, 10, 16], "rotation": 90, "texture": "#1"},

View file

@ -11,7 +11,6 @@
"name": "MixerCenter", "name": "MixerCenter",
"from": [7, -4.5, 7], "from": [7, -4.5, 7],
"to": [9, 7.5, 9], "to": [9, 7.5, 9],
"shade": false,
"rotation": {"angle": 0, "axis": "y", "origin": [8, 7, 8]}, "rotation": {"angle": 0, "axis": "y", "origin": [8, 7, 8]},
"faces": { "faces": {
"north": {"uv": [0, 12, 12, 14], "rotation": 90, "texture": "#6"}, "north": {"uv": [0, 12, 12, 14], "rotation": 90, "texture": "#6"},

View file

@ -121,7 +121,6 @@
"name": "MixerCenter", "name": "MixerCenter",
"from": [7, -4.5, 7], "from": [7, -4.5, 7],
"to": [9, 7.5, 9], "to": [9, 7.5, 9],
"shade": false,
"rotation": {"angle": 22.5, "axis": "y", "origin": [8, 7, 8]}, "rotation": {"angle": 22.5, "axis": "y", "origin": [8, 7, 8]},
"faces": { "faces": {
"north": {"uv": [0, 12, 12, 14], "rotation": 90, "texture": "#6"}, "north": {"uv": [0, 12, 12, 14], "rotation": 90, "texture": "#6"},

View file

@ -94,7 +94,6 @@
"name": "Axis", "name": "Axis",
"from": [6, 0, 6], "from": [6, 0, 6],
"to": [10, 8, 10], "to": [10, 8, 10],
"shade": false,
"faces": { "faces": {
"north": {"uv": [6, 8, 10, 16], "rotation": 180, "texture": "#1_0"}, "north": {"uv": [6, 8, 10, 16], "rotation": 180, "texture": "#1_0"},
"east": {"uv": [6, 8, 10, 16], "rotation": 180, "texture": "#1_0"}, "east": {"uv": [6, 8, 10, 16], "rotation": 180, "texture": "#1_0"},

View file

@ -11,7 +11,6 @@
"name": "Axis", "name": "Axis",
"from": [ 6.0, 0.0, 6.0 ], "from": [ 6.0, 0.0, 6.0 ],
"to": [ 10.0, 16.0, 10.0 ], "to": [ 10.0, 16.0, 10.0 ],
"shade": false,
"faces": { "faces": {
"north": { "texture": "#0", "uv": [ 6.0, 0.0, 10.0, 16.0 ] }, "north": { "texture": "#0", "uv": [ 6.0, 0.0, 10.0, 16.0 ] },
"east": { "texture": "#0", "uv": [ 6.0, 0.0, 10.0, 16.0 ] }, "east": { "texture": "#0", "uv": [ 6.0, 0.0, 10.0, 16.0 ] },

View file

@ -11,7 +11,6 @@
"name": "Axis", "name": "Axis",
"from": [6, 6, 8], "from": [6, 6, 8],
"to": [10, 10, 16], "to": [10, 10, 16],
"shade": false,
"faces": { "faces": {
"north": {"uv": [6, 6, 10, 10], "rotation": 180, "texture": "#1"}, "north": {"uv": [6, 6, 10, 10], "rotation": 180, "texture": "#1"},
"east": {"uv": [6, 0, 10, 8], "rotation": 270, "texture": "#0"}, "east": {"uv": [6, 0, 10, 8], "rotation": 270, "texture": "#0"},

View file

@ -15,7 +15,6 @@
"name": "Axis", "name": "Axis",
"from": [6, 0, 6], "from": [6, 0, 6],
"to": [10, 7, 10], "to": [10, 7, 10],
"shade": false,
"faces": { "faces": {
"north": {"uv": [6, 9, 10, 16], "texture": "#0"}, "north": {"uv": [6, 9, 10, 16], "texture": "#0"},
"east": {"uv": [6, 9, 10, 16], "texture": "#0"}, "east": {"uv": [6, 9, 10, 16], "texture": "#0"},

View file

@ -14,7 +14,6 @@
"name": "Axis", "name": "Axis",
"from": [6, 0, 6], "from": [6, 0, 6],
"to": [10, 16, 10], "to": [10, 16, 10],
"shade": false,
"faces": { "faces": {
"north": {"uv": [6, 0, 10, 16], "texture": "#axis"}, "north": {"uv": [6, 0, 10, 16], "texture": "#axis"},
"east": {"uv": [6, 0, 10, 16], "texture": "#axis"}, "east": {"uv": [6, 0, 10, 16], "texture": "#axis"},

View file

@ -13,7 +13,6 @@
"name": "Axis", "name": "Axis",
"from": [6, 0, 6], "from": [6, 0, 6],
"to": [10, 16, 10], "to": [10, 16, 10],
"shade": false,
"faces": { "faces": {
"north": {"uv": [6, 0, 10, 16], "texture": "#0"}, "north": {"uv": [6, 0, 10, 16], "texture": "#0"},
"east": {"uv": [6, 0, 10, 16], "texture": "#0"}, "east": {"uv": [6, 0, 10, 16], "texture": "#0"},

View file

@ -13,7 +13,6 @@
"name": "Axis", "name": "Axis",
"from": [6, 0, 6], "from": [6, 0, 6],
"to": [10, 16, 10], "to": [10, 16, 10],
"shade": false,
"faces": { "faces": {
"north": {"uv": [6, 0, 10, 16], "texture": "#0"}, "north": {"uv": [6, 0, 10, 16], "texture": "#0"},
"east": {"uv": [6, 0, 10, 16], "texture": "#0"}, "east": {"uv": [6, 0, 10, 16], "texture": "#0"},

View file

@ -0,0 +1,25 @@
#version 150
#moj_import <fog.glsl>
uniform sampler2D Sampler0;
uniform vec4 ColorModulator;
uniform float FogStart;
uniform float FogEnd;
uniform vec4 FogColor;
uniform float GameTime;
in float vertexDistance;
in vec4 vertexColor;
in vec4 lightMapColor;
in vec2 texCoord0;
in vec4 normal;
out vec4 fragColor;
void main() {
vec4 color = texture(Sampler0, texCoord0) * vertexColor * ColorModulator;
color *= lightMapColor;
fragColor = linear_fog(color, vertexDistance, FogStart, FogEnd, FogColor);
}

View file

@ -0,0 +1,30 @@
{
"blend": {
"func": "add",
"srcrgb": "srcalpha",
"dstrgb": "1-srcalpha"
},
"vertex": "create:glowing_shader",
"fragment": "create:glowing_shader",
"attributes": [
"Position",
"Color",
"UV0",
"UV1",
"UV2",
"Normal"
],
"samplers": [
{ "name": "Sampler0" },
{ "name": "Sampler2" }
],
"uniforms": [
{ "name": "ModelViewMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] },
{ "name": "ProjMat", "type": "matrix4x4", "count": 16, "values": [ 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0 ] },
{ "name": "IViewRotMat", "type": "matrix3x3", "count": 9, "values": [ 1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0 ] },
{ "name": "ColorModulator", "type": "float", "count": 4, "values": [ 1.0, 1.0, 1.0, 1.0 ] },
{ "name": "FogStart", "type": "float", "count": 1, "values": [ 0.0 ] },
{ "name": "FogEnd", "type": "float", "count": 1, "values": [ 1.0 ] },
{ "name": "FogColor", "type": "float", "count": 4, "values": [ 0.0, 0.0, 0.0, 0.0 ] }
]
}

View file

@ -0,0 +1,35 @@
#version 150
#moj_import <fog.glsl>
in vec3 Position;
in vec4 Color;
in vec2 UV0;
in vec2 UV1;
in ivec2 UV2;
in vec3 Normal;
uniform sampler2D Sampler1;
uniform sampler2D Sampler2;
uniform mat4 ModelViewMat;
uniform mat4 ProjMat;
uniform mat3 IViewRotMat;
out float vertexDistance;
out vec4 vertexColor;
out vec4 lightMapColor;
out vec2 texCoord0;
out vec2 texCoord1;
out vec4 normal;
void main() {
gl_Position = ProjMat * ModelViewMat * vec4(Position, 1.0);
vertexDistance = cylindrical_distance(ModelViewMat, IViewRotMat * Position);
vertexColor = Color;
lightMapColor = texelFetch(Sampler2, UV2 / 16, 0);
texCoord0 = UV0;
texCoord1 = UV1;
normal = ProjMat * ModelViewMat * vec4(Normal, 0.0);
}