tomdodd4598

Untitled

Jul 8th, 2020
253
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 7.96 KB | None | 0 0
  1. package nc.render.tile;
  2.  
  3. import javax.vecmath.Vector3f;
  4.  
  5. import nc.multiblock.turbine.*;
  6. import nc.multiblock.turbine.Turbine.PlaneDir;
  7. import nc.multiblock.turbine.TurbineRotorBladeUtil.TurbinePartDir;
  8. import nc.multiblock.turbine.tile.TileTurbineController;
  9. import nc.util.NCMath;
  10. import net.minecraft.block.state.IBlockState;
  11. import net.minecraft.client.Minecraft;
  12. import net.minecraft.client.renderer.*;
  13. import net.minecraft.client.renderer.texture.TextureMap;
  14. import net.minecraft.client.renderer.tileentity.TileEntitySpecialRenderer;
  15. import net.minecraft.util.EnumFacing;
  16. import net.minecraft.util.EnumFacing.*;
  17. import net.minecraft.util.math.BlockPos;
  18. import net.minecraftforge.fml.relauncher.*;
  19.  
  20. @SideOnly(Side.CLIENT)
  21. public class RenderTurbineRotor extends TileEntitySpecialRenderer<TileTurbineController> {
  22.    
  23.     private static final Minecraft MC = Minecraft.getMinecraft();
  24.    
  25.     private final float[] brightness = new float[] {1F, 1F, 1F, 1F, 1F, 1F, 1F, 1F};
  26.     private byte count = 0;
  27.    
  28.     @Override
  29.     public boolean isGlobalRenderer(TileTurbineController tile) {
  30.         // return tile.isRenderer && tile.isMultiblockAssembled();
  31.         return false;
  32.     }
  33.    
  34.     @Override
  35.     public void render(TileTurbineController controller, double posX, double posY, double posZ, float partialTicks, int destroyStage, float alpha) {
  36.         if (!controller.isRenderer || !controller.isMultiblockAssembled()) {
  37.             return;
  38.         }
  39.        
  40.         Turbine turbine = controller.getMultiblock();
  41.         if (turbine == null) return;
  42.        
  43.         EnumFacing dir = turbine.flowDir;
  44.         if (dir == null) return;
  45.        
  46.         BlockRendererDispatcher renderer = MC.getBlockRendererDispatcher();
  47.        
  48.         // brightness = tile.getWorld().getLightBrightness(turbine.getMinimumInteriorPlaneCoord(dir, turbine.getFlowLength()/2, bladeLength - 1,bladeLength - 1));
  49.         brightness[count] = controller.getWorld().getLightBrightness(turbine.getExtremeInteriorCoord(NCMath.getBit(count, 0) == 1, NCMath.getBit(count, 1) == 1, NCMath.getBit(count, 2) == 1));
  50.         count++;
  51.         count %= 8;
  52.         float bright = (brightness[0] + brightness[1] + brightness[2] + brightness[3] + brightness[4] + brightness[5] + brightness[6] + brightness[7]) / 8F;
  53.        
  54.         MC.renderEngine.bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE);
  55.         GlStateManager.color(1F, 1F, 1F, 1F);
  56.         OpenGlHelper.setLightmapTextureCoords(OpenGlHelper.lightmapTexUnit, 0, 15 * 16);
  57.        
  58.         BlockPos pos = controller.getPos();
  59.         double r = turbine.getRotorRadius();
  60.         double rX = -turbine.getMaxX() + pos.getX() + (dir.getAxis() == Axis.X ? 0D : r);
  61.         double rY = -turbine.getMaxY() + pos.getY() + (dir.getAxis() == Axis.Y ? 0D : r);
  62.         double rZ = -turbine.getMaxZ() + pos.getZ() + (dir.getAxis() == Axis.Z ? 0D : r);
  63.        
  64.         int flowLength = turbine.getFlowLength(), bladeLength = turbine.bladeLength, shaftWidth = turbine.shaftWidth;
  65.         double scale = r / Math.sqrt(r * r + NCMath.sq(shaftWidth) / 4D);
  66.        
  67.         // Enter rotated frame
  68.         GlStateManager.pushMatrix();
  69.         GlStateManager.translate(posX - rX, posY - rY, posZ - rZ);
  70.         GlStateManager.scale(dir.getAxis() == Axis.X ? 1D : scale, dir.getAxis() == Axis.Y ? 1D : scale, dir.getAxis() == Axis.Z ? 1D : scale);
  71.         {
  72.             long systemTime = Minecraft.getSystemTime();
  73.             if (!MC.isGamePaused()) turbine.rotorAngle = (turbine.rotorAngle + (systemTime - turbine.prevRenderTime) * turbine.angVel) % 360F;
  74.             turbine.prevRenderTime = systemTime;
  75.             GlStateManager.rotate(turbine.rotorAngle, dir.getAxis() == Axis.X ? 1F : 0F, dir.getAxis() == Axis.Y ? 1F : 0F, dir.getAxis() == Axis.Z ? 1F : 0F);
  76.         }
  77.         GlStateManager.translate(-pos.getX() + rX, -pos.getY() + rY, -pos.getZ() + rZ);
  78.        
  79.         if (turbine.rotorStateArray == null) return;
  80.         IBlockState shaftState = turbine.rotorStateArray[turbine.bladePosArray.length];
  81.        
  82.         double bladeWidth = NCMath.SQRT2;
  83.        
  84.         for (int depth : turbine.bladeDepths) {
  85.             renderRotor(turbine, renderer, bright, shaftState, dir, flowLength, bladeLength, shaftWidth, bladeWidth, depth);
  86.         }
  87.        
  88.         // Leave rotated frame
  89.         GlStateManager.popMatrix();
  90.        
  91.         // Enter stationary frame
  92.         GlStateManager.pushMatrix();
  93.         pos = controller.getPos();
  94.         GlStateManager.translate(posX - rX, posY - rY, posZ - rZ);
  95.         GlStateManager.scale(dir.getAxis() == Axis.X ? 1D : scale, dir.getAxis() == Axis.Y ? 1D : scale, dir.getAxis() == Axis.Z ? 1D : scale);
  96.         GlStateManager.translate(-pos.getX() + rX, -pos.getY() + rY, -pos.getZ() + rZ);
  97.        
  98.         for (int depth : turbine.statorDepths) {
  99.             renderRotor(turbine, renderer, bright, shaftState, dir, flowLength, bladeLength, shaftWidth, bladeWidth, depth);
  100.         }
  101.        
  102.         GlStateManager.popMatrix();
  103.     }
  104.    
  105.     public void renderRotor(Turbine turbine, BlockRendererDispatcher renderer, float bright, IBlockState shaftState, EnumFacing flowDir, int flowLength, int bladeLength, int shaftWidth, double bladeWidth, int depth) {
  106.         double depthScale = (0.0D + Math.pow(4D, (double) (1 + depth - flowLength) / (double) flowLength)) / 1.0D;
  107.        
  108.         GlStateManager.pushMatrix();
  109.        
  110.         Vector3f renderPos = turbine.renderPosArray[4 * flowLength * shaftWidth + depth];
  111.         GlStateManager.translate(renderPos.x + 0.5D, renderPos.y + 0.5D, renderPos.z + 0.5D);
  112.         GlStateManager.scale(flowDir.getAxis() == Axis.X ? 1D : depthScale, flowDir.getAxis() == Axis.Y ? 1D : depthScale, flowDir.getAxis() == Axis.Z ? 1D : depthScale);
  113.         GlStateManager.translate(-renderPos.x - 0.5D, -renderPos.y - 0.5D, -renderPos.z - 0.5D);
  114.        
  115.         renderShaft(turbine, renderer, bright, shaftState, flowDir, flowLength, shaftWidth, depth);
  116.         for (int j : new int[] { 0, flowLength, 2 * flowLength, 3 * flowLength }) {
  117.             renderBlades(turbine, renderer, bright, flowDir, flowLength, bladeLength, shaftWidth, bladeWidth, j, depth);
  118.         }
  119.        
  120.         GlStateManager.popMatrix();
  121.     }
  122.    
  123.     public void renderShaft(Turbine turbine, BlockRendererDispatcher renderer, float bright, IBlockState shaftState, EnumFacing flowDir, int flowLength, int shaftWidth, int depth) {
  124.         GlStateManager.pushMatrix();
  125.        
  126.         Vector3f renderPos = turbine.renderPosArray[4 * flowLength * shaftWidth + depth];
  127.         GlStateManager.translate(renderPos.x + 0.5D, renderPos.y + 0.5D, renderPos.z + 0.5D);
  128.         GlStateManager.scale(flowDir.getAxis() == Axis.X ? 1D : shaftWidth, flowDir.getAxis() == Axis.Y ? 1D : shaftWidth, flowDir.getAxis() == Axis.Z ? 1D : shaftWidth);
  129.        
  130.         GlStateManager.translate(-0.5D, -0.5D, -0.5D);
  131.         GlStateManager.rotate(-90F, 0F, 1F, 0F);
  132.        
  133.         renderer.renderBlockBrightness(shaftState, bright);
  134.        
  135.         GlStateManager.popMatrix();
  136.     }
  137.    
  138.     public void renderBlades(Turbine turbine, BlockRendererDispatcher renderer, float bright, EnumFacing flowDir, int flowLength, int bladeLength, int shaftWidth, double bladeWidth, int jMult, int depth) {
  139.         Vector3f renderPos;
  140.         IBlockState rotorState;
  141.         TurbinePartDir bladeDir;
  142.         PlaneDir planeDir;
  143.        
  144.         int i = jMult + depth;
  145.        
  146.         for (int w = 0; w < shaftWidth; w++) {
  147.             GlStateManager.pushMatrix();
  148.            
  149.             renderPos = turbine.renderPosArray[w + i * shaftWidth];
  150.             rotorState = turbine.rotorStateArray[i];
  151.             bladeDir = rotorState.getValue(TurbineRotorBladeUtil.DIR);
  152.             planeDir = (i < flowLength || i >= 3 * flowLength) ? PlaneDir.V : PlaneDir.U;
  153.            
  154.             GlStateManager.translate(renderPos.x + 0.5D, renderPos.y + 0.5D, renderPos.z + 0.5D);
  155.             GlStateManager.scale(flowDir.getAxis() == Axis.X ? 1D : (turbine.getBladeDir(planeDir) == TurbinePartDir.X ? bladeLength : bladeWidth), flowDir.getAxis() == Axis.Y ? 1D : (turbine.getBladeDir(planeDir) == TurbinePartDir.Y ? bladeLength : bladeWidth), flowDir.getAxis() == Axis.Z ? 1D : (turbine.getBladeDir(planeDir) == TurbinePartDir.Z ? bladeLength : bladeWidth));
  156.             GlStateManager.rotate(turbine.bladeAngleArray[i] * (flowDir.getAxisDirection() == AxisDirection.POSITIVE ^ flowDir.getAxis() == Axis.X ? 1F : -1F), bladeDir == TurbinePartDir.X ? 1F : 0F, bladeDir == TurbinePartDir.Y ? 1F : 0F, bladeDir == TurbinePartDir.Z ? 1F : 0F);
  157.            
  158.             GlStateManager.translate(-0.5D, -0.5D, -0.5D);
  159.             GlStateManager.rotate(-90F, 0F, 1F, 0F);
  160.            
  161.             renderer.renderBlockBrightness(rotorState, bright);
  162.            
  163.             GlStateManager.popMatrix();
  164.         }
  165.     }
  166. }
Add Comment
Please, Sign In to add comment