|
| 1 | +package generations.gg.generations.core.generationscore.common.client |
| 2 | + |
| 3 | +import com.cobblemon.mod.common.client.render.SpriteType |
| 4 | +import com.cobblemon.mod.common.client.render.item.PokemonItemRenderer |
| 5 | +import com.cobblemon.mod.common.client.render.item.PokemonItemRenderer.Companion.positions |
| 6 | +import com.cobblemon.mod.common.client.render.models.blockbench.FloatingState |
| 7 | +import com.cobblemon.mod.common.client.render.models.blockbench.repository.PokemonModelRepository |
| 8 | +import com.cobblemon.mod.common.client.render.models.blockbench.repository.RenderContext |
| 9 | +import com.cobblemon.mod.common.entity.PoseType |
| 10 | +import com.cobblemon.mod.common.item.PokemonItem |
| 11 | +import com.cobblemon.mod.common.util.math.fromEulerXYZDegrees |
| 12 | +import com.mojang.blaze3d.platform.Lighting |
| 13 | +import com.mojang.blaze3d.vertex.PoseStack |
| 14 | +import com.mojang.blaze3d.vertex.VertexConsumer |
| 15 | +import generations.gg.generations.core.generationscore.common.client.model.RareCandyBone |
| 16 | +import generations.gg.generations.core.generationscore.common.client.render.rarecandy.instanceOrNull |
| 17 | +import generations.gg.generations.core.generationscore.common.world.item.PokemonProvidingItem |
| 18 | +import net.minecraft.client.renderer.LightTexture |
| 19 | +import net.minecraft.client.renderer.MultiBufferSource |
| 20 | +import net.minecraft.client.renderer.RenderType |
| 21 | +import net.minecraft.client.renderer.texture.MissingTextureAtlasSprite |
| 22 | +import net.minecraft.client.renderer.texture.OverlayTexture |
| 23 | +import net.minecraft.world.item.ItemDisplayContext |
| 24 | +import net.minecraft.world.item.ItemStack |
| 25 | +import org.joml.Quaternionf |
| 26 | +import org.joml.Vector3f |
| 27 | + |
| 28 | +object PokemonItemRendererProxy { |
| 29 | + val context = RenderContext().also { |
| 30 | + it.put(RenderContext.RENDER_STATE, RenderContext.RenderState.PROFILE) |
| 31 | + it.put(RenderContext.DO_QUIRKS, false) |
| 32 | + } |
| 33 | + |
| 34 | + @JvmStatic |
| 35 | + fun render( |
| 36 | + stack: ItemStack, |
| 37 | + mode: ItemDisplayContext, |
| 38 | + matrices: PoseStack, |
| 39 | + vertexConsumers: MultiBufferSource, |
| 40 | + light: Int, |
| 41 | + overlay: Int, |
| 42 | + ) { |
| 43 | + val pokemonItem = stack.item as? PokemonProvidingItem ?: return |
| 44 | + val (species, aspects) = pokemonItem.getSpeciesAndAspectsPair(stack) ?: return |
| 45 | + val state = FloatingState() |
| 46 | + state.currentAspects = aspects |
| 47 | + matrices.pushPose() |
| 48 | + val model = PokemonModelRepository.getPoser(species.resourceIdentifier, state) |
| 49 | + |
| 50 | + val sprite = model.rootPart.instanceOrNull<RareCandyBone>()?.let { RenderType.entityCutoutNoCull(PokemonModelRepository.getSprite(species.resourceIdentifier, state, SpriteType.PROFILE) ?: MissingTextureAtlasSprite.getLocation()) } |
| 51 | + |
| 52 | + if(sprite == null) { |
| 53 | + |
| 54 | + model.context = context |
| 55 | + context.put(RenderContext.RENDER_STATE, RenderContext.RenderState.PROFILE) |
| 56 | + context.put(RenderContext.SPECIES, species.resourceIdentifier) |
| 57 | + context.put(RenderContext.ASPECTS, aspects) |
| 58 | + context.put(RenderContext.POSABLE_STATE, state) |
| 59 | + state.currentModel = model |
| 60 | + } |
| 61 | + |
| 62 | + val renderLayer = if(sprite == null) RenderType.entityCutout(PokemonModelRepository.getTexture(species.resourceIdentifier, state)) else sprite |
| 63 | + |
| 64 | + val transformations = if(sprite == null) positions[mode]!! else positionsSprite[mode]!! |
| 65 | + |
| 66 | + if (mode == ItemDisplayContext.GUI) { |
| 67 | + if(sprite == null) Lighting.setupForFlatItems() |
| 68 | + else Lighting.setupForEntityInInventory() |
| 69 | + } |
| 70 | + |
| 71 | + matrices.scale(transformations.scale.x, transformations.scale.y, transformations.scale.z) |
| 72 | + matrices.translate(transformations.translation.x, transformations.translation.y, transformations.translation.z) |
| 73 | + |
| 74 | + if(sprite == null) { |
| 75 | + state.setPoseToFirstSuitable(PoseType.PORTRAIT) |
| 76 | + model.applyAnimations(null, state, 0F, 0F, 0F, 0F, 0F) |
| 77 | + |
| 78 | + matrices.translate(model.profileTranslation.x, model.profileTranslation.y, -4.0) |
| 79 | + matrices.scale(model.profileScale, model.profileScale, 0.15F) |
| 80 | + } |
| 81 | + |
| 82 | + val rotation = Quaternionf().fromEulerXYZDegrees(Vector3f(transformations.rotation.x, transformations.rotation.y, transformations.rotation.z)) |
| 83 | + matrices.mulPose(rotation) |
| 84 | + rotation.conjugate() |
| 85 | + val buffer = vertexConsumers.getBuffer(renderLayer) |
| 86 | + matrices.pushPose() |
| 87 | + val packedLight = if (mode == ItemDisplayContext.GUI) { |
| 88 | + if(sprite == null) LightTexture.pack(13, 13) |
| 89 | + else LightTexture.FULL_BRIGHT |
| 90 | + } else { |
| 91 | + light |
| 92 | + } |
| 93 | + |
| 94 | + // x = red, y = green, z = blue, w = alpha |
| 95 | + val tint = pokemonItem.stackTint(stack) |
| 96 | + val tintRed = (tint.x * 255).toInt() |
| 97 | + val tintGreen = (tint.y * 255).toInt() |
| 98 | + val tintBlue = (tint.z * 255).toInt() |
| 99 | + val tintAlpha = (tint.w * 255).toInt() |
| 100 | + val color = (tintAlpha shl 24) or (tintRed shl 16) or (tintGreen shl 8) or tintBlue |
| 101 | + |
| 102 | + if(sprite == null) { |
| 103 | + model.withLayerContext( |
| 104 | + vertexConsumers, |
| 105 | + state, |
| 106 | + PokemonModelRepository.getLayers(species.resourceIdentifier, state) |
| 107 | + ) { |
| 108 | + model.render(context, matrices, buffer, packedLight, OverlayTexture.NO_OVERLAY, color) |
| 109 | + } |
| 110 | + |
| 111 | + model.setDefault() |
| 112 | + } else { |
| 113 | + val matrix = matrices.last() |
| 114 | + matrix.pose().translate(-0.5f, 0f, 0f) |
| 115 | + buffer.addVertex(matrix, 1f, 0f, 0f).setColor(color).setUv(1f, 0f).setOverlay(OverlayTexture.NO_OVERLAY) |
| 116 | + .setLight(packedLight).setNormal(matrix, 0f, 1f, 0f) |
| 117 | + buffer.addVertex(matrix, 0f, 0f, 0f).setColor(color).setUv(0f, 0f).setOverlay(OverlayTexture.NO_OVERLAY) |
| 118 | + .setLight(packedLight).setNormal(matrix, 0f, 1f, 0f) |
| 119 | + buffer.addVertex(matrix, 0f, 1f, 0f).setColor(color).setUv(0f, 1f).setOverlay(OverlayTexture.NO_OVERLAY) |
| 120 | + .setLight(packedLight).setNormal(matrix, 0f, 1f, 0f) |
| 121 | + buffer.addVertex(matrix, 1f, 1f, 0f).setColor(color).setUv(1f, 1f).setOverlay(OverlayTexture.NO_OVERLAY) |
| 122 | + .setLight(packedLight).setNormal(matrix, 0f, 1f, 0f) |
| 123 | + } |
| 124 | + |
| 125 | + matrices.popPose() |
| 126 | + matrices.popPose() |
| 127 | + |
| 128 | + if (mode == ItemDisplayContext.GUI) { |
| 129 | + Lighting.setupFor3DItems() |
| 130 | + } |
| 131 | + } |
| 132 | + |
| 133 | + val positionsSprite: MutableMap<ItemDisplayContext, PokemonItemRenderer.Transformations> = mutableMapOf() |
| 134 | + |
| 135 | + init { |
| 136 | + positionsSprite[ItemDisplayContext.GUI] = PokemonItemRenderer().Transformations( |
| 137 | + PokemonItemRenderer().Transformation(0.5, -1.0, -0.5), |
| 138 | + PokemonItemRenderer().Transformation(1F, -1F, -1F), |
| 139 | + PokemonItemRenderer().Transformation(0F, 0F, 0F)) |
| 140 | + |
| 141 | + positionsSprite[ItemDisplayContext.FIXED] = PokemonItemRenderer().Transformations( |
| 142 | + PokemonItemRenderer().Transformation(0.5, -1.0, -0.5), |
| 143 | + PokemonItemRenderer().Transformation(1F, -1F, -1F), |
| 144 | + PokemonItemRenderer().Transformation(0F, 0F, 0F)) |
| 145 | + |
| 146 | + positionsSprite[ItemDisplayContext.FIRST_PERSON_RIGHT_HAND] = PokemonItemRenderer().Transformations( |
| 147 | + PokemonItemRenderer().Transformation(2.75, -1.2, 0.0), |
| 148 | + PokemonItemRenderer().Transformation(0.5F, -0.5F, -0.5F), |
| 149 | + PokemonItemRenderer().Transformation(0F, 35F, 0F)) |
| 150 | + |
| 151 | + positionsSprite[ItemDisplayContext.FIRST_PERSON_LEFT_HAND] = PokemonItemRenderer().Transformations( |
| 152 | + PokemonItemRenderer().Transformation(-0.75, -1.2, 0.0), |
| 153 | + PokemonItemRenderer().Transformation(0.5F, -0.5F, -0.5F), |
| 154 | + PokemonItemRenderer().Transformation(0F, -35F, 0F)) |
| 155 | + |
| 156 | + positionsSprite[ItemDisplayContext.THIRD_PERSON_RIGHT_HAND] = PokemonItemRenderer().Transformations( |
| 157 | + PokemonItemRenderer().Transformation(1.0, -2.6, 0.75), |
| 158 | + PokemonItemRenderer().Transformation(0.5F, -0.5F, -0.5F), |
| 159 | + PokemonItemRenderer().Transformation(0F, 35F, 0F)) |
| 160 | + |
| 161 | + positionsSprite[ItemDisplayContext.THIRD_PERSON_LEFT_HAND] = PokemonItemRenderer().Transformations( |
| 162 | + PokemonItemRenderer().Transformation(1.0, -2.6, -0.75), |
| 163 | + PokemonItemRenderer().Transformation(0.5F, -0.5F, -0.5F), |
| 164 | + PokemonItemRenderer().Transformation(0F, -35F, 0F)) |
| 165 | + |
| 166 | + positionsSprite[ItemDisplayContext.GROUND] = PokemonItemRenderer().Transformations( |
| 167 | + PokemonItemRenderer().Transformation(1.0, -1.6, -1.0), |
| 168 | + PokemonItemRenderer().Transformation(0.5F, -0.5F, -0.5F), |
| 169 | + PokemonItemRenderer().Transformation(0F, 0f, 0F)) |
| 170 | + |
| 171 | + positionsSprite[ItemDisplayContext.HEAD] = PokemonItemRenderer().Transformations( |
| 172 | + PokemonItemRenderer().Transformation(1.0, -3.5, 3.0), |
| 173 | + PokemonItemRenderer().Transformation(0.5F, -0.5F, -0.5F), |
| 174 | + PokemonItemRenderer().Transformation(0F, 215F, 0F)) |
| 175 | + |
| 176 | + positionsSprite[ItemDisplayContext.NONE] = PokemonItemRenderer().Transformations( |
| 177 | + PokemonItemRenderer().Transformation(0.0, 0.0, 0.0), |
| 178 | + PokemonItemRenderer().Transformation(0.5F, -0.5F, -0.5F), |
| 179 | + PokemonItemRenderer().Transformation(0F, 0F, 0F)) |
| 180 | + } |
| 181 | +} |
0 commit comments