-
Notifications
You must be signed in to change notification settings - Fork 20
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
emissives.json works, and is now resourcepackable
- Loading branch information
Showing
11 changed files
with
190 additions
and
180 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
1 change: 0 additions & 1 deletion
1
src/main/java/com/fusionflux/portalcubed/client/render/block/EmissiveSpriteRegistry.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
51 changes: 9 additions & 42 deletions
51
...n/java/com/fusionflux/portalcubed/client/render/models/PortalCubedModelLoadingPlugin.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,51 +1,18 @@ | ||
package com.fusionflux.portalcubed.client.render.models; | ||
|
||
import com.fusionflux.portalcubed.accessor.BlockElementExt; | ||
import com.fusionflux.portalcubed.client.render.models.rendertype.MultiRenderTypeUnbakedModel; | ||
import net.fabricmc.fabric.api.client.model.loading.v1.ModelLoadingPlugin; | ||
import com.fusionflux.portalcubed.client.render.models.emissive.EmissiveData; | ||
import com.fusionflux.portalcubed.client.render.models.emissive.EmissiveWrapper; | ||
import com.fusionflux.portalcubed.client.render.models.rendertype.MultiRenderTypeWrapper; | ||
import net.fabricmc.fabric.api.client.model.loading.v1.ModelLoadingPlugin.Context; | ||
import net.fabricmc.fabric.api.client.model.loading.v1.ModelModifier; | ||
import net.fabricmc.fabric.api.client.model.loading.v1.ModelModifier.BeforeBake; | ||
import net.fabricmc.fabric.api.event.Event; | ||
import net.fabricmc.fabric.api.renderer.v1.material.RenderMaterial; | ||
import net.fabricmc.fabric.api.client.model.loading.v1.PreparableModelLoadingPlugin; | ||
|
||
import net.minecraft.client.renderer.block.model.BlockElement; | ||
import net.minecraft.client.renderer.block.model.BlockModel; | ||
import net.minecraft.client.resources.model.UnbakedModel; | ||
|
||
public enum PortalCubedModelLoadingPlugin implements ModelLoadingPlugin { | ||
public enum PortalCubedModelLoadingPlugin implements PreparableModelLoadingPlugin<EmissiveData> { | ||
INSTANCE; | ||
|
||
@Override | ||
public void onInitializeModelLoader(Context ctx) { | ||
Event<BeforeBake> beforeBake = ctx.modifyModelBeforeBake(); | ||
beforeBake.register(ModelModifier.WRAP_PHASE, MultiRenderTypeWrapper.INSTANCE); | ||
beforeBake.register(ModelModifier.WRAP_PHASE, EmissiveWrapper.INSTANCE); | ||
} | ||
|
||
private enum MultiRenderTypeWrapper implements BeforeBake { | ||
INSTANCE; | ||
|
||
@Override | ||
public UnbakedModel modifyModelBeforeBake(UnbakedModel model, Context context) { | ||
if (model instanceof BlockModel blockModel) { | ||
for (BlockElement element : blockModel.getElements()) { | ||
RenderMaterial material = ((BlockElementExt) element).portalcubed$getRenderMaterial(); | ||
if (material != null) { | ||
return new MultiRenderTypeUnbakedModel(blockModel); | ||
} | ||
} | ||
} | ||
|
||
return model; | ||
} | ||
} | ||
|
||
private enum EmissiveWrapper implements BeforeBake { | ||
INSTANCE; | ||
|
||
@Override | ||
public UnbakedModel modifyModelBeforeBake(UnbakedModel model, Context context) { | ||
return model; | ||
} | ||
public void onInitializeModelLoader(EmissiveData emissiveData, Context ctx) { | ||
ctx.modifyModelBeforeBake().register(ModelModifier.WRAP_PHASE, new MultiRenderTypeWrapper()); | ||
ctx.modifyModelAfterBake().register(ModelModifier.WRAP_PHASE, new EmissiveWrapper(emissiveData)); | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
115 changes: 18 additions & 97 deletions
115
...ain/java/com/fusionflux/portalcubed/client/render/models/emissive/EmissiveBakedModel.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,108 +1,29 @@ | ||
package com.fusionflux.portalcubed.client.render.models.emissive; | ||
|
||
import com.fusionflux.portalcubed.client.render.block.EmissiveSpriteRegistry; | ||
import java.util.Collection; | ||
|
||
import com.fusionflux.portalcubed.client.render.models.RenderMaterials; | ||
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap; | ||
import com.fusionflux.portalcubed.client.render.models.rendertype.MultiRenderTypeBakedModel; | ||
import net.fabricmc.fabric.api.renderer.v1.material.RenderMaterial; | ||
import net.fabricmc.fabric.api.renderer.v1.model.ForwardingBakedModel; | ||
import net.fabricmc.fabric.api.renderer.v1.model.SpriteFinder; | ||
import net.fabricmc.fabric.api.renderer.v1.render.RenderContext; | ||
import net.fabricmc.fabric.api.renderer.v1.render.RenderContext.QuadTransform; | ||
import net.fabricmc.fabric.api.util.TriState; | ||
import net.minecraft.client.Minecraft; | ||
import org.apache.commons.lang3.tuple.Triple; | ||
|
||
import net.minecraft.client.renderer.block.model.BakedQuad; | ||
import net.minecraft.client.renderer.texture.TextureAtlas; | ||
import net.minecraft.client.renderer.texture.TextureAtlasSprite; | ||
import net.minecraft.client.resources.model.BakedModel; | ||
import net.minecraft.core.BlockPos; | ||
import net.minecraft.client.resources.model.SimpleBakedModel; | ||
import net.minecraft.core.Direction; | ||
import net.minecraft.resources.ResourceLocation; | ||
import net.minecraft.util.RandomSource; | ||
import net.minecraft.world.inventory.InventoryMenu; | ||
import net.minecraft.world.item.ItemStack; | ||
import net.minecraft.world.level.BlockAndTintGetter; | ||
import net.minecraft.world.level.block.state.BlockState; | ||
|
||
import java.util.List; | ||
import java.util.Map; | ||
import java.util.Optional; | ||
import java.util.concurrent.ConcurrentHashMap; | ||
import java.util.function.Function; | ||
import java.util.function.Supplier; | ||
|
||
public final class EmissiveBakedModel extends ForwardingBakedModel { | ||
|
||
private static final Map<ResourceLocation, Function<BakedModel, EmissiveBakedModel>> WRAPPERS = new Object2ObjectOpenHashMap<>(); | ||
|
||
public static void register(ResourceLocation modelId) { | ||
WRAPPERS.put(modelId, EmissiveBakedModel::new); | ||
} | ||
|
||
public static Optional<BakedModel> wrap(ResourceLocation modelId, BakedModel model) { | ||
if (!RenderMaterials.ARE_SUPPORTED) | ||
return Optional.empty(); | ||
final Function<BakedModel, EmissiveBakedModel> wrapper = WRAPPERS.get(new ResourceLocation(modelId.getNamespace(), modelId.getPath())); | ||
if (wrapper != null) return Optional.of(wrapper.apply(model)); | ||
return Optional.empty(); | ||
} | ||
|
||
private static final Map<RenderMaterial, RenderMaterial> TO_EMISSIVE = new ConcurrentHashMap<>(); | ||
|
||
private final QuadTransform emissiveTransform; | ||
|
||
EmissiveBakedModel(BakedModel model) { | ||
this.wrapped = model; | ||
this.emissiveTransform = quad -> { | ||
TextureAtlasSprite sprite = getSpriteFinder().find(quad); | ||
if (EmissiveSpriteRegistry.isEmissive(sprite.contents().name())) { | ||
RenderMaterial material = quad.material(); | ||
quad.material(getEmissiveMaterial(material)); | ||
public class EmissiveBakedModel extends MultiRenderTypeBakedModel { | ||
public EmissiveBakedModel(SimpleBakedModel model, Collection<ResourceLocation> emissiveTextures) { | ||
super(model); | ||
for (int i = 0; i < this.quads.size(); i++) { | ||
Triple<BakedQuad, RenderMaterial, Direction> triple = quads.get(i); | ||
ResourceLocation texture = triple.getLeft().getSprite().contents().name(); | ||
if (emissiveTextures.contains(texture)) { | ||
RenderMaterial material = triple.getMiddle(); | ||
RenderMaterial emissive = RenderMaterials.get(material.blendMode(), true); | ||
Triple<BakedQuad, RenderMaterial, Direction> newTriple = Triple.of(triple.getLeft(), emissive, triple.getRight()); | ||
quads.set(i, newTriple); | ||
} | ||
return true; | ||
}; | ||
} | ||
|
||
@Override | ||
public boolean isVanillaAdapter() { | ||
return false; | ||
} | ||
|
||
@Override | ||
public void emitBlockQuads(BlockAndTintGetter blockView, BlockState state, BlockPos pos, Supplier<RandomSource> randomSupplier, RenderContext context) { | ||
context.pushTransform(emissiveTransform); | ||
super.emitBlockQuads(blockView, state, pos, randomSupplier, context); | ||
context.popTransform(); | ||
} | ||
|
||
@Override | ||
public void emitItemQuads(ItemStack stack, Supplier<RandomSource> randomSupplier, RenderContext context) { | ||
context.pushTransform(emissiveTransform); | ||
super.emitItemQuads(stack, randomSupplier, context); | ||
context.popTransform(); | ||
} | ||
|
||
@Override | ||
public List<BakedQuad> getQuads(BlockState blockState, Direction face, RandomSource rand) { | ||
throw new UnsupportedOperationException("isVanillaAdapter is false! call emitBlockQuads/emitItemQuads!"); | ||
} | ||
|
||
public static RenderMaterial getEmissiveMaterial(RenderMaterial base) { | ||
return TO_EMISSIVE.computeIfAbsent(base, EmissiveBakedModel::makeEmissiveMaterial); | ||
} | ||
|
||
private static RenderMaterial makeEmissiveMaterial(RenderMaterial base) { | ||
throw new RuntimeException("a"); | ||
// return RenderMaterials.FINDER.copyFrom(base) | ||
// .emissive(true) | ||
// .disableDiffuse(true) | ||
// .ambientOcclusion(TriState.FALSE) | ||
// .find(); | ||
} | ||
|
||
private static SpriteFinder getSpriteFinder() { | ||
TextureAtlas blockAtlas = Minecraft.getInstance() | ||
.getModelManager() | ||
.getAtlas(InventoryMenu.BLOCK_ATLAS); | ||
return SpriteFinder.get(blockAtlas); | ||
} | ||
} | ||
} |
13 changes: 13 additions & 0 deletions
13
src/main/java/com/fusionflux/portalcubed/client/render/models/emissive/EmissiveData.java
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,13 @@ | ||
package com.fusionflux.portalcubed.client.render.models.emissive; | ||
|
||
import java.util.Collection; | ||
|
||
import com.google.common.collect.Multimap; | ||
|
||
import net.minecraft.resources.ResourceLocation; | ||
|
||
public record EmissiveData(Multimap<ResourceLocation, ResourceLocation> map) { | ||
public Collection<ResourceLocation> getEmissiveTexturesForModel(ResourceLocation modelId) { | ||
return map.get(modelId); | ||
} | ||
} |
Oops, something went wrong.