1
+ package dev.sterner.client.renderer.entity
2
+
3
+ import com.mojang.blaze3d.vertex.PoseStack
4
+ import com.mojang.math.Axis
5
+ import com.sammy.malum.client.RenderUtils
6
+ import com.sammy.malum.client.SpiritBasedWorldVFXBuilder
7
+ import com.sammy.malum.common.entity.FloatingItemEntity
8
+ import com.sammy.malum.core.systems.spirit.MalumSpiritType
9
+ import com.sammy.malum.registry.client.MalumRenderTypeTokens
10
+ import com.sammy.malum.registry.common.SpiritTypeRegistry
11
+ import dev.sterner.common.entity.ItemCarrierItemEntity
12
+ import net.minecraft.client.Minecraft
13
+ import net.minecraft.client.renderer.MultiBufferSource
14
+ import net.minecraft.client.renderer.entity.EntityRenderer
15
+ import net.minecraft.client.renderer.entity.EntityRendererProvider
16
+ import net.minecraft.client.renderer.entity.ItemRenderer
17
+ import net.minecraft.client.renderer.texture.OverlayTexture
18
+ import net.minecraft.client.renderer.texture.TextureAtlas
19
+ import net.minecraft.resources.ResourceLocation
20
+ import net.minecraft.world.entity.LivingEntity
21
+ import net.minecraft.world.item.ItemDisplayContext
22
+ import net.minecraft.world.level.Level
23
+ import team.lodestar.lodestone.helpers.EasingHelper
24
+ import team.lodestar.lodestone.registry.client.LodestoneRenderTypeRegistry
25
+ import team.lodestar.lodestone.systems.easing.Easing
26
+ import team.lodestar.lodestone.systems.rendering.LodestoneRenderType
27
+ import team.lodestar.lodestone.systems.rendering.VFXBuilders.WorldVFXBuilder
28
+ import java.awt.Color
29
+ import kotlin.math.abs
30
+ import kotlin.math.sin
31
+
32
+ class ItemCarrierItemEntityRenderer (context : EntityRendererProvider .Context ) :
33
+ EntityRenderer <ItemCarrierItemEntity >(context) {
34
+
35
+ val itemRenderer: ItemRenderer = context.itemRenderer
36
+
37
+ override fun render (
38
+ entity : ItemCarrierItemEntity ,
39
+ entityYaw : Float ,
40
+ partialTicks : Float ,
41
+ poseStack : PoseStack ,
42
+ bufferIn : MultiBufferSource ,
43
+ packedLightIn : Int
44
+ ) {
45
+ val spiritType = SpiritTypeRegistry .AQUEOUS_SPIRIT
46
+ val trailBuilder = SpiritBasedWorldVFXBuilder .create(spiritType).setRenderType(TRAIL_TYPE )
47
+ RenderUtils .renderEntityTrail(
48
+ poseStack,
49
+ trailBuilder,
50
+ entity.trailPointBuilder,
51
+ entity,
52
+ spiritType.primaryColor,
53
+ spiritType.secondaryColor,
54
+ 1.0f ,
55
+ partialTicks
56
+ )
57
+ renderSpiritEntity(
58
+ entity,
59
+ this .itemRenderer, partialTicks, poseStack, bufferIn, packedLightIn
60
+ )
61
+ super .render(entity, entityYaw, partialTicks, poseStack, bufferIn, packedLightIn)
62
+ }
63
+
64
+ override fun getTextureLocation (entity : ItemCarrierItemEntity ): ResourceLocation {
65
+ return TextureAtlas .LOCATION_BLOCKS
66
+ }
67
+
68
+ init {
69
+ this .shadowRadius = 0.0f
70
+ this .shadowStrength = 0.0f
71
+ }
72
+
73
+ companion object {
74
+ private val TRAIL_TYPE : LodestoneRenderType =
75
+ LodestoneRenderTypeRegistry .ADDITIVE_TEXTURE_TRIANGLE .applyAndCache(MalumRenderTypeTokens .CONCENTRATED_TRAIL )
76
+ private val TWINKLE : LodestoneRenderType =
77
+ LodestoneRenderTypeRegistry .ADDITIVE_TEXTURE .applyAndCache(MalumRenderTypeTokens .TWINKLE )
78
+ private val STAR : LodestoneRenderType =
79
+ LodestoneRenderTypeRegistry .ADDITIVE_TEXTURE .applyAndCache(MalumRenderTypeTokens .STAR )
80
+
81
+ fun renderSpiritEntity (
82
+ entity : ItemCarrierItemEntity ,
83
+ itemRenderer : ItemRenderer ,
84
+ partialTicks : Float ,
85
+ poseStack : PoseStack ,
86
+ bufferIn : MultiBufferSource ? ,
87
+ packedLightIn : Int
88
+ ) {
89
+ val itemStack = entity.itemStack
90
+ val model = itemRenderer.getModel(itemStack, entity.level(), null as LivingEntity ? , entity.itemStack.count)
91
+ val yOffset = entity.getYOffset(partialTicks)
92
+ val scale = model.transforms.getTransform(ItemDisplayContext .GROUND ).scale.y()
93
+ val rotation = entity.getRotation(partialTicks)
94
+ poseStack.pushPose()
95
+ poseStack.translate(0.0 , (yOffset - 0.25f * scale).toDouble(), 0.0 )
96
+ poseStack.mulPose(Axis .YP .rotation(rotation))
97
+ itemRenderer.render(
98
+ itemStack,
99
+ ItemDisplayContext .GROUND ,
100
+ false ,
101
+ poseStack,
102
+ bufferIn,
103
+ packedLightIn,
104
+ OverlayTexture .NO_OVERLAY ,
105
+ model
106
+ )
107
+ poseStack.popPose()
108
+ poseStack.pushPose()
109
+ poseStack.translate(0.0 , yOffset.toDouble(), 0.0 )
110
+ renderSpiritGlimmer(poseStack, SpiritTypeRegistry .AQUEOUS_SPIRIT , partialTicks)
111
+ poseStack.popPose()
112
+ }
113
+
114
+ fun renderSpiritGlimmer (poseStack : PoseStack , spiritType : MalumSpiritType , partialTicks : Float ) {
115
+ renderSpiritGlimmer(poseStack, spiritType, 1.0f , partialTicks)
116
+ }
117
+
118
+ fun renderSpiritGlimmer (poseStack : PoseStack , spiritType : MalumSpiritType , scalar : Float , partialTicks : Float ) {
119
+ renderSpiritGlimmer(
120
+ poseStack,
121
+ SpiritBasedWorldVFXBuilder .create(spiritType),
122
+ spiritType.primaryColor,
123
+ spiritType.secondaryColor,
124
+ scalar,
125
+ scalar,
126
+ partialTicks
127
+ )
128
+ }
129
+
130
+ fun renderSpiritGlimmer (
131
+ poseStack : PoseStack ,
132
+ builder : WorldVFXBuilder ,
133
+ primaryColor : Color ? ,
134
+ secondaryColor : Color ? ,
135
+ scaleScalar : Float ,
136
+ alphaScalar : Float ,
137
+ partialTicks : Float
138
+ ) {
139
+ val level: Level ? = Minecraft .getInstance().level
140
+ val gameTime = level!! .gameTime.toFloat() + partialTicks
141
+ val sine = abs(sin((gameTime / 80.0f % 360.0f ).toDouble()) * 0.07500000298023224 )
142
+ .toFloat()
143
+ val bounce =
144
+ EasingHelper .weightedEasingLerp(Easing .BOUNCE_IN_OUT , gameTime % 20.0f / 20.0f , 0.025f , 0.05f , 0.025f )
145
+ val scale = (0.12f + sine + bounce) * scaleScalar
146
+ poseStack.pushPose()
147
+ poseStack.mulPose(Minecraft .getInstance().entityRenderDispatcher.cameraOrientation())
148
+ poseStack.mulPose(Axis .YP .rotationDegrees(180.0f ))
149
+ builder.setAlpha(0.6f * alphaScalar).setColor(primaryColor).setRenderType(STAR )
150
+ .renderQuad(poseStack, scale * 0.8f )
151
+ builder.setAlpha(0.8f * alphaScalar).setRenderType(TWINKLE ).renderQuad(poseStack, scale * 0.8f )
152
+ builder.setAlpha(0.2f * alphaScalar).setColor(secondaryColor).renderQuad(poseStack, scale * 1.2f )
153
+ poseStack.popPose()
154
+ }
155
+ }
156
+ }
0 commit comments