diff --git a/src/main/java/gregtechlite/gtlitecore/client/renderer/TranscendentRenderBehavior.java b/src/main/java/gregtechlite/gtlitecore/client/renderer/TranscendentRenderBehavior.java new file mode 100644 index 000000000..dfa82a528 --- /dev/null +++ b/src/main/java/gregtechlite/gtlitecore/client/renderer/TranscendentRenderBehavior.java @@ -0,0 +1,25 @@ +package gregtechlite.gtlitecore.client.renderer; + +import net.minecraftforge.fml.relauncher.Side; +import net.minecraftforge.fml.relauncher.SideOnly; + +public interface TranscendentRenderBehavior extends ItemRendererManager +{ + + float getRotationSpeed(); + + float getRotationAxisX(); + + float getRotationAxisY(); + + float getRotationAxisZ(); + + float getFloatingOffset(); + + @SideOnly(Side.CLIENT) + default float[] getRotationAxis() + { + return new float[] { getRotationAxisX(), getRotationAxisY(), getRotationAxisZ() }; + } + +} \ No newline at end of file diff --git a/src/main/java/gregtechlite/gtlitecore/client/renderer/handler/TranscendentItemRenderer.java b/src/main/java/gregtechlite/gtlitecore/client/renderer/handler/TranscendentItemRenderer.java new file mode 100644 index 000000000..5bcfa6841 --- /dev/null +++ b/src/main/java/gregtechlite/gtlitecore/client/renderer/handler/TranscendentItemRenderer.java @@ -0,0 +1,150 @@ +package gregtechlite.gtlitecore.client.renderer.handler; + +import com.morphismmc.morphismlib.client.Games; +import gregtech.api.items.metaitem.MetaItem; +import gregtechlite.gtlitecore.client.model.WrappedModelGetter; +import gregtechlite.gtlitecore.client.renderer.CustomItemRenderer; +import gregtechlite.gtlitecore.client.renderer.TranscendentRenderBehavior; +import gregtechlite.gtlitecore.client.shader.CosmicShaderHelper; +import net.minecraft.client.renderer.GlStateManager; +import net.minecraft.client.renderer.block.model.IBakedModel; +import net.minecraft.client.renderer.block.model.ItemCameraTransforms; +import net.minecraft.entity.EntityLivingBase; +import net.minecraft.item.ItemStack; +import net.minecraft.world.World; +import net.minecraftforge.common.model.IModelState; + +public class TranscendentItemRenderer extends WrappedItemRenderer +{ + + private long animationTick = 0; + + public TranscendentItemRenderer(IModelState state, IBakedModel model) + { + super(state, model); + } + + public TranscendentItemRenderer(IModelState state, WrappedModelGetter getter) + { + super(state, getter); + } + + @Override + public void renderItem(ItemStack stack, ItemCameraTransforms.TransformType transformType) + { + if (!(stack.getItem() instanceof MetaItem)) { + renderModel(wrapped, stack); + return; + } + + MetaItem.MetaValueItem valueItem = ((MetaItem) stack.getItem()).getItem(stack); + TranscendentRenderBehavior trb = null; + if (valueItem != null) { + trb = (TranscendentRenderBehavior) ((CustomItemRenderer) valueItem).getRendererManager(); + } + + if (trb == null) { + renderModel(wrapped, stack); + return; + } + + processLightLevel(transformType); + + if (transformType == ItemCameraTransforms.TransformType.GUI) + { + renderInventory(stack, renderEntity, trb); + } + else + { + renderSimple(stack, renderEntity, trb); + } + } + + protected void renderSimple(ItemStack stack, EntityLivingBase player, TranscendentRenderBehavior trb) + { + GlStateManager.pushMatrix(); + GlStateManager.enableBlend(); + GlStateManager.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); + GlStateManager.color(1F, 1F, 1F, 1F); + + World world = player != null ? player.world : null; + IBakedModel model = wrapped.getOverrides().handleItemState(wrapped, stack, world, player); + + applyEffect(trb); + renderModel(model, stack); + GlStateManager.disableBlend(); + GlStateManager.popMatrix(); + } + + protected void renderInventory(ItemStack stack, EntityLivingBase player, TranscendentRenderBehavior trb) + { + GlStateManager.pushMatrix(); + GlStateManager.enableBlend(); + GlStateManager.blendFunc(GlStateManager.SourceFactor.SRC_ALPHA, GlStateManager.DestFactor.ONE_MINUS_SRC_ALPHA); + GlStateManager.disableAlpha(); + GlStateManager.disableDepth(); + + World world = player != null ? player.world : null; + IBakedModel model = wrapped.getOverrides().handleItemState(wrapped, stack, world, player); + + applyEffect(trb); + renderModel(model, stack); + + GlStateManager.enableAlpha(); + GlStateManager.enableRescaleNormal(); + GlStateManager.enableDepth(); + GlStateManager.disableBlend(); + GlStateManager.popMatrix(); + } + + protected void applyEffect(TranscendentRenderBehavior trb) + { + updateAnimationTick(); + float rotation = (animationTick * trb.getRotationSpeed()) % 360; + + GlStateManager.translate(0.5f, 0.5f, 0.0f); + + float[] axis = trb.getRotationAxis(); + GlStateManager.rotate(rotation, axis[0], axis[1], axis[2]); + GlStateManager.rotate(180, 0.5f, 0.0f, 0.0f); + GlStateManager.translate(-0.5f, -0.5f, 0.0f); + } + + private void updateAnimationTick() + { + if (Games.world() != null) { + animationTick = Games.world().getWorldTime() % Integer.MAX_VALUE; + } + } + + protected void processLightLevel(ItemCameraTransforms.TransformType transformType) + { + switch (transformType) + { + case GROUND: + if (entityPos != null) + { + CosmicShaderHelper.setLightFromLocation(world, entityPos); + return; + } + break; + case THIRD_PERSON_LEFT_HAND: + case THIRD_PERSON_RIGHT_HAND: + case FIRST_PERSON_LEFT_HAND: + case FIRST_PERSON_RIGHT_HAND: + case HEAD: + if (renderEntity != null) + { + CosmicShaderHelper.setLightFromLocation(world, entityPos); + return; + } + break; + case GUI: + CosmicShaderHelper.setLightLevel(1.2F); + return; + default: + break; + } + CosmicShaderHelper.setLightLevel(1.0F); + } +} \ No newline at end of file diff --git a/src/main/kotlin/gregtechlite/gtlitecore/api/unification/material/GTLiteElementMaterials.kt b/src/main/kotlin/gregtechlite/gtlitecore/api/unification/material/GTLiteElementMaterials.kt index ba43de6c7..f168ac754 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/unification/material/GTLiteElementMaterials.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/unification/material/GTLiteElementMaterials.kt @@ -96,6 +96,7 @@ import gregtechlite.gtlitecore.api.unification.material.info.GTLiteMaterialIconS import gregtechlite.gtlitecore.api.unification.material.info.GTLiteMaterialIconSet.MAGNETIUM import gregtechlite.gtlitecore.api.unification.material.info.GTLiteMaterialIconSet.OMNIUM import gregtechlite.gtlitecore.api.unification.material.info.GTLiteMaterialIconSet.SPACETIME +import gregtechlite.gtlitecore.api.unification.material.info.GTLiteMaterialIconSet.TRANSCENDENT import gregtechlite.gtlitecore.api.unification.material.info.GTLiteMaterialIconSet.UNIVERSIUM import net.minecraft.init.Enchantments @@ -345,13 +346,12 @@ object GTLiteElementMaterials rotorProp(144.0F, 2.4F, 786_432) } - // TODO: New renderer with rotate animation. // 15 Transcendent Metal TranscendentMetal = addMaterial(15, "transcendent_metal") { ingot() liquid() - color(0x1A1A1A).iconSet(METALLIC) + color(0x1A1A1A).iconSet(TRANSCENDENT) element(Tsx) flags(EXT2_METAL, GENERATE_DOUBLE_PLATE, GENERATE_DENSE, GENERATE_ROTOR, GENERATE_FRAME, GENERATE_GEAR, GENERATE_SMALL_GEAR, GENERATE_ROUND, GENERATE_SPRING, GENERATE_SPRING_SMALL, GENERATE_FINE_WIRE, diff --git a/src/main/kotlin/gregtechlite/gtlitecore/api/unification/material/info/GTLiteMaterialIconSet.kt b/src/main/kotlin/gregtechlite/gtlitecore/api/unification/material/info/GTLiteMaterialIconSet.kt index 4bd85f422..60974463a 100644 --- a/src/main/kotlin/gregtechlite/gtlitecore/api/unification/material/info/GTLiteMaterialIconSet.kt +++ b/src/main/kotlin/gregtechlite/gtlitecore/api/unification/material/info/GTLiteMaterialIconSet.kt @@ -10,6 +10,7 @@ import gregtech.api.unification.material.Materials.Uranium238 import gregtech.api.unification.material.info.MaterialIconSet import gregtechlite.gtlitecore.client.renderer.texture.GTLiteTextures import gregtechlite.gtlitecore.common.item.behavior.HaloRenderItemBehavior +import gregtechlite.gtlitecore.common.item.behavior.TranscendentRenderItemBehavior object GTLiteMaterialIconSet { @@ -119,6 +120,10 @@ object GTLiteMaterialIconSet val ETERNITY = MaterialIconSetWithRenderer("eternity", null, true, HaloRenderItemBehavior(10, 0xFF000000.toInt(), {{ GTLiteTextures.HALO }}, true)) + @JvmField + val TRANSCENDENT = MaterialIconSetWithRenderer("transcendent", MaterialIconSet.METALLIC, false, + TranscendentRenderItemBehavior()) + // endregion fun setMaterialIconSets() diff --git a/src/main/kotlin/gregtechlite/gtlitecore/common/item/behavior/TranscendentRenderItemBehavior.kt b/src/main/kotlin/gregtechlite/gtlitecore/common/item/behavior/TranscendentRenderItemBehavior.kt new file mode 100644 index 000000000..2aabec6b4 --- /dev/null +++ b/src/main/kotlin/gregtechlite/gtlitecore/common/item/behavior/TranscendentRenderItemBehavior.kt @@ -0,0 +1,40 @@ +package gregtechlite.gtlitecore.common.item.behavior + +import codechicken.lib.model.ModelRegistryHelper +import codechicken.lib.util.TransformUtils +import gregtechlite.gtlitecore.client.renderer.TranscendentRenderBehavior +import gregtechlite.gtlitecore.client.renderer.handler.TranscendentItemRenderer +import net.minecraft.client.renderer.block.model.ModelResourceLocation +import net.minecraft.util.ResourceLocation +import net.minecraftforge.fml.relauncher.Side +import net.minecraftforge.fml.relauncher.SideOnly + + +class TranscendentRenderItemBehavior( + private val rotationSpeed: Float = 3.5f, + private val rotationAxisX: Float = 0.3f, + private val rotationAxisY: Float = 0.5f, + private val rotationAxisZ: Float = 0.2f, + private val floatingOffset: Float = 0.03125f) : TranscendentRenderBehavior +{ + + override fun getRotationSpeed(): Float = this.rotationSpeed + + override fun getRotationAxisX(): Float = this.rotationAxisX + + override fun getRotationAxisY(): Float = this.rotationAxisY + + override fun getRotationAxisZ(): Float = this.rotationAxisZ + + override fun getFloatingOffset(): Float = this.floatingOffset + + @SideOnly(Side.CLIENT) + override fun onRendererRegistry(location: ResourceLocation) + { + ModelRegistryHelper.register(ModelResourceLocation(location, "inventory"), + TranscendentItemRenderer(TransformUtils.DEFAULT_ITEM) { modelRegistry -> + modelRegistry.getObject(ModelResourceLocation(location, "inventory")) + }) + } + +} \ No newline at end of file