Advertisement
wiresegal

Untitled

Mar 8th, 2017
106
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.19 KB | None | 0 0
  1. package talent.bearers.ccomp.client.core
  2.  
  3. import com.google.common.collect.ImmutableList
  4. import com.teamwizardry.librarianlib.common.util.ItemNBTHelper
  5. import gnu.trove.map.hash.TIntObjectHashMap
  6. import net.minecraft.block.state.IBlockState
  7. import net.minecraft.client.Minecraft
  8. import net.minecraft.client.renderer.block.model.*
  9. import net.minecraft.client.renderer.texture.TextureAtlasSprite
  10. import net.minecraft.client.renderer.vertex.DefaultVertexFormats
  11. import net.minecraft.client.renderer.vertex.DefaultVertexFormats.POSITION
  12. import net.minecraft.entity.EntityLivingBase
  13. import net.minecraft.item.ItemStack
  14. import net.minecraft.util.EnumFacing
  15. import net.minecraft.world.World
  16. import net.minecraftforge.client.model.IPerspectiveAwareModel
  17. import net.minecraftforge.client.model.pipeline.UnpackedBakedQuad
  18. import net.minecraftforge.client.model.pipeline.VertexTransformer
  19. import net.minecraftforge.common.model.TRSRTransformation
  20. import net.minecraftforge.fluids.Fluid
  21. import net.minecraftforge.fluids.FluidStack
  22. import org.lwjgl.util.vector.Vector3f
  23. import talent.bearers.ccomp.common.core.FluidStack
  24. import java.util.*
  25. import javax.vecmath.Matrix4f
  26. import javax.vecmath.Vector4f
  27. import org.apache.commons.lang3.tuple.Pair as ApachePair
  28.  
  29.  
  30. /**
  31. * @author WireSegal
  32. * Created at 2:38 PM on 3/8/17.
  33. */
  34. class TankModel(val original: IBakedModel) : IBakedModel by original {
  35.  
  36. val overrideList = object : ItemOverrideList(listOf()) {
  37. override fun handleItemState(originalModel: IBakedModel, stack: ItemStack, world: World?, entity: EntityLivingBase?): IBakedModel {
  38. if (ItemNBTHelper.verifyExistence(stack, "fluid")) {
  39. val fluid = FluidStack(ItemNBTHelper.getCompound(stack, "fluid", false)!!)
  40. return getModel(fluid)
  41. }
  42. return super.handleItemState(originalModel, stack, world, entity)
  43. }
  44. }
  45.  
  46. override fun getOverrides(): ItemOverrideList = overrideList
  47.  
  48. private fun getModel(stack: FluidStack): CompositeBakedModel {
  49. val amount = stack.amount
  50. val clamped = amount / 125
  51.  
  52. val key = clamped to stack.fluid
  53.  
  54. var model = cache[key]
  55. if(model == null) {
  56. val parent = FluidModel(stack, clamped)
  57. model = CompositeBakedModel(parent, original)
  58. cache.put(key, model)
  59. }
  60. return model
  61. }
  62.  
  63. private inner class FluidModel(fluid: FluidStack, amount: Int) : IBakedModel {
  64. val still: TextureAtlasSprite = Minecraft.getMinecraft().textureMapBlocks
  65. .getTextureExtry(fluid.fluid.getStill(fluid).toString())
  66. val flowing: TextureAtlasSprite = Minecraft.getMinecraft().textureMapBlocks
  67. .getTextureExtry(fluid.fluid.getFlowing(fluid).toString())
  68.  
  69.  
  70. val minSize = 0.16f * 16
  71. val maxSize = 0.86f * 16
  72. val baseHeight = 0.02f * 16
  73.  
  74. val actualHeight = amount.toFloat() / 32
  75. val height = (actualHeight - 0.08f) * 16 + baseHeight
  76.  
  77. val minCorner = Vector3f(minSize, baseHeight, minSize)
  78. val xCorner = Vector3f(maxSize, baseHeight, minSize)
  79. val zCorner = Vector3f(minSize, baseHeight, maxSize)
  80. val maxCorner = Vector3f(maxSize, baseHeight, maxSize)
  81. val minTopCorner = Vector3f(minSize, height, minSize)
  82. val xTopCorner = Vector3f(maxSize, height, minSize)
  83. val zTopCorner = Vector3f(minSize, height, maxSize)
  84. val maxTopCorner = Vector3f(maxSize, height, maxSize)
  85.  
  86. val quads: List<BakedQuad>
  87.  
  88. init {
  89. val builder = ImmutableList.builder<BakedQuad>()
  90. val bakery = FaceBakery()
  91. createSide(builder, bakery, EnumFacing.DOWN, still, minCorner, maxCorner)
  92. createSide(builder, bakery, EnumFacing.UP, still, minTopCorner, maxTopCorner)
  93. createSide(builder, bakery, EnumFacing.NORTH, flowing, minCorner, xTopCorner)
  94. createSide(builder, bakery, EnumFacing.SOUTH, flowing, zCorner, maxTopCorner)
  95. createSide(builder, bakery, EnumFacing.WEST, flowing, minCorner, zTopCorner)
  96. createSide(builder, bakery, EnumFacing.EAST, flowing, xCorner, maxTopCorner)
  97. quads = builder.build()
  98. }
  99.  
  100. fun createSide(builder: ImmutableList.Builder<BakedQuad>, bakery: FaceBakery, side: EnumFacing, tex: TextureAtlasSprite, min: Vector3f, max: Vector3f) {
  101. val defUVs = floatArrayOf(baseHeight, baseHeight, height, height)
  102. val uv = BlockFaceUV(defUVs, 0)
  103. val bpf = BlockPartFace(null, 0, "", uv)
  104. builder.add(bakery.makeBakedQuad(min, max, bpf, tex, side, ModelRotation.X0_Y0, null, true, true))
  105. }
  106.  
  107. override fun getParticleTexture(): TextureAtlasSprite = still
  108.  
  109. override fun getQuads(state: IBlockState?, side: EnumFacing?, rand: Long): List<BakedQuad> = quads
  110.  
  111. override fun getItemCameraTransforms(): ItemCameraTransforms = this@TankModel.itemCameraTransforms
  112.  
  113. override fun isBuiltInRenderer() = false
  114. override fun isAmbientOcclusion() = original.isAmbientOcclusion
  115. override fun isGui3d() = true
  116.  
  117. override fun getOverrides(): ItemOverrideList = ItemOverrideList.NONE
  118. }
  119.  
  120. companion object {
  121. private val cache = HashMap<Pair<Int, Fluid>, CompositeBakedModel>()
  122.  
  123. private fun transform(quad: BakedQuad, transform: TRSRTransformation): BakedQuad {
  124. val builder = UnpackedBakedQuad.Builder(DefaultVertexFormats.ITEM)
  125. val consumer = object : VertexTransformer(builder) {
  126. override fun put(element: Int, vararg data: Float) {
  127. val formatElement = DefaultVertexFormats.ITEM.getElement(element)
  128. when (formatElement.usage) {
  129. POSITION -> {
  130. val newData = FloatArray(4)
  131. val vec = Vector4f(data)
  132. transform.matrix.transform(vec)
  133. vec.get(newData)
  134. parent.put(element, *newData)
  135. }
  136. else -> parent.put(element, *data)
  137. }
  138. }
  139. }
  140. quad.pipe(consumer)
  141. return builder.build()
  142. }
  143. }
  144.  
  145. private class CompositeBakedModel(toAdd: IBakedModel, private val parent: IBakedModel) : IPerspectiveAwareModel, IBakedModel by parent {
  146. private val genQuads: List<BakedQuad>
  147. private val faceQuads = EnumMap<EnumFacing, MutableList<BakedQuad>>(EnumFacing::class.java)
  148.  
  149. init {
  150. val genBuilder = ImmutableList.builder<BakedQuad>()
  151. val transform = TRSRTransformation.blockCenterToCorner(TRSRTransformation(javax.vecmath.Vector3f(-0.4f, 0.25f, 0f), null, javax.vecmath.Vector3f(0.625f, 0.625f, 0.625f), TRSRTransformation.quatFromXYZ(0f, Math.PI.toFloat() / 2, 0f)))
  152.  
  153. for (e in EnumFacing.VALUES)
  154. faceQuads.put(e, ArrayList())
  155.  
  156. toAdd.getQuads(null, null, 0).forEach {
  157. genBuilder.add(transform(it, transform))
  158. }
  159.  
  160. for (e in EnumFacing.VALUES) {
  161. faceQuads[e]?.addAll(toAdd.getQuads(null, e, 0).map({ input -> transform(input, transform) }))
  162. }
  163.  
  164. genBuilder.addAll(parent.getQuads(null, null, 0))
  165. for (e in EnumFacing.VALUES) {
  166. faceQuads[e]?.addAll(parent.getQuads(null, e, 0))
  167. }
  168.  
  169. genQuads = genBuilder.build()
  170. }
  171.  
  172. override fun getQuads(state: IBlockState?, face: EnumFacing?, rand: Long): List<BakedQuad> {
  173. return if (face == null) genQuads else faceQuads[face]!!
  174. }
  175.  
  176. override fun getOverrides(): ItemOverrideList = ItemOverrideList.NONE
  177.  
  178. override fun handlePerspective(cameraTransformType: ItemCameraTransforms.TransformType): ApachePair<IBakedModel, Matrix4f> {
  179. if (parent is IPerspectiveAwareModel) {
  180. val pair = parent.handlePerspective(cameraTransformType)
  181. if (pair != null && pair.right != null)
  182. return ApachePair.of(this, pair.right)
  183. }
  184. return ApachePair.of(this, TRSRTransformation.identity().matrix)
  185. }
  186. }
  187. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement