Fixed power not depleting to zero when no mechanical energy input

This commit is contained in:
Calclavia 2014-11-09 13:55:01 +08:00
parent e0f341753f
commit 3d8f2551c7
13 changed files with 85 additions and 89 deletions

View file

@ -61,7 +61,7 @@ class TilePump extends TileMechanical(Material.iron) with IRotatable with IFluid
val notRendered = mutable.Set.empty[String]
GL11.glPushMatrix
GL11.glRotated(Math.toDegrees(mechanicalNode.renderAngle.asInstanceOf[Float]), 0, 0, 1)
GL11.glRotated(Math.toDegrees(mechanicalNode.angle.asInstanceOf[Float]), 0, 0, 1)
for (i <- 1 to 12)
{

View file

@ -142,7 +142,7 @@ public class DebugFrameMechanical extends FrameNodeDebug
@Override
public String buildLabel()
{
return super.buildLabel() + DebugFrameMechanical.this.getNode().renderAngle();
return super.buildLabel() + DebugFrameMechanical.this.getNode().angle();
}
};
topPanel.add(angleLabel);

View file

@ -131,7 +131,7 @@ class PartGear extends PartMechanical with IMultiBlockStructure[PartGear]
{
if (pass == 0)
{
RenderGear.INSTANCE.renderDynamic(this, pos.x, pos.y, pos.z, tier)
RenderGear.renderDynamic(this, pos.x, pos.y, pos.z, tier)
}
}

View file

@ -1,76 +1,69 @@
package resonantinduction.mechanical.mech.gear
import cpw.mods.fml.relauncher.Side
import cpw.mods.fml.relauncher.SideOnly
import cpw.mods.fml.relauncher.{Side, SideOnly}
import net.minecraft.item.ItemStack
import net.minecraft.util.ResourceLocation
import net.minecraftforge.client.IItemRenderer
import net.minecraftforge.client.model.AdvancedModelLoader
import net.minecraftforge.client.model.IModelCustom
import net.minecraftforge.client.model.{AdvancedModelLoader, IModelCustom}
import net.minecraftforge.common.util.ForgeDirection
import org.lwjgl.opengl.GL11
import resonant.content.prefab.scal.render.ISimpleItemRenderer
import resonant.lib.render.RenderUtility
import resonantinduction.core.Reference
@SideOnly(Side.CLIENT) object RenderGear
{
final val INSTANCE: RenderGear = new RenderGear
}
@SideOnly(Side.CLIENT)
class RenderGear extends ISimpleItemRenderer
object RenderGear
{
final val MODEL: IModelCustom = AdvancedModelLoader.loadModel(new ResourceLocation(Reference.domain, Reference.modelPath + "gears.obj"))
final val model: IModelCustom = AdvancedModelLoader.loadModel(new ResourceLocation(Reference.domain, Reference.modelPath + "gears.obj"))
def renderGear(side: Int, tier: Int, isLarge: Boolean, angle: Double)
def renderGear(side: Int, tier: Int, isLarge: Boolean, angle: Double)
{
if (tier == 1)
{
if (tier == 1)
{
RenderUtility.bind(Reference.blockTextureDirectory + "cobblestone.png")
}
else if (tier == 2)
{
RenderUtility.bind(Reference.blockTextureDirectory + "iron_block.png")
}
else if (tier == 10)
{
RenderUtility.bind(Reference.blockTextureDirectory + "pumpkin_top.png")
}
else
{
RenderUtility.bind(Reference.blockTextureDirectory + "planks_oak.png")
}
RenderUtility.rotateFaceBlockToSide(ForgeDirection.getOrientation(side))
GL11.glRotated(angle, 0, 1, 0)
if (isLarge)
{
MODEL.renderOnly("LargeGear")
}
else
{
MODEL.renderOnly("SmallGear")
}
RenderUtility.bind(Reference.blockTextureDirectory + "cobblestone.png")
}
else if (tier == 2)
{
RenderUtility.bind(Reference.blockTextureDirectory + "iron_block.png")
}
else if (tier == 10)
{
RenderUtility.bind(Reference.blockTextureDirectory + "pumpkin_top.png")
}
else
{
RenderUtility.bind(Reference.blockTextureDirectory + "planks_oak.png")
}
def renderDynamic(part: PartGear, x: Double, y: Double, z: Double, tier: Int)
{
if (part.getMultiBlock.isPrimary)
{
GL11.glPushMatrix
GL11.glTranslatef(x.asInstanceOf[Float] + 0.5f, y.asInstanceOf[Float] + 0.5f, z.asInstanceOf[Float] + 0.5f)
GL11.glPushMatrix
renderGear(part.placementSide.ordinal, part.tier, part.getMultiBlock.isConstructed, Math.toDegrees(part.mechanicalNode.renderAngle))
GL11.glPopMatrix
GL11.glPopMatrix
}
}
RenderUtility.rotateFaceBlockToSide(ForgeDirection.getOrientation(side))
GL11.glRotated(angle, 0, 1, 0)
def renderInventoryItem(`type`: IItemRenderer.ItemRenderType, itemStack: ItemStack, data: AnyRef*)
if (isLarge)
{
GL11.glRotatef(90, 1, 0, 0)
renderGear(-1, itemStack.getItemDamage, false, 0)
RenderGear.model.renderOnly("LargeGear")
}
else
{
RenderGear.model.renderOnly("SmallGear")
}
}
def renderDynamic(part: PartGear, x: Double, y: Double, z: Double, tier: Int)
{
if (part.getMultiBlock.isPrimary)
{
GL11.glPushMatrix()
GL11.glTranslatef(x.asInstanceOf[Float] + 0.5f, y.asInstanceOf[Float] + 0.5f, z.asInstanceOf[Float] + 0.5f)
GL11.glPushMatrix()
renderGear(part.placementSide.ordinal, part.tier, part.getMultiBlock.isConstructed, Math.toDegrees(part.mechanicalNode.angle))
GL11.glPopMatrix()
GL11.glPopMatrix()
}
}
def renderInventoryItem(`type`: IItemRenderer.ItemRenderType, itemStack: ItemStack, data: AnyRef*)
{
GL11.glRotatef(90, 1, 0, 0)
renderGear(-1, itemStack.getItemDamage, false, 0)
}
}

View file

@ -53,7 +53,7 @@ import resonantinduction.core.Reference
{
glRotatef(90, 0, 0, 1)
}
GL11.glRotatef(Math.toDegrees(part.mechanicalNode.renderAngle).asInstanceOf[Float], 0, 1, 0)
GL11.glRotatef(Math.toDegrees(part.mechanicalNode.angle).asInstanceOf[Float], 0, 1, 0)
if (part.tier == 1)
{

View file

@ -57,6 +57,8 @@ class MechanicalGrid extends GridNode[MechanicalNode](classOf[MechanicalNode]) w
})
.foldLeft((0D, 0D))((b, a) => (a._1 + b._1, a._2 + b._2))
var delta = (0D, 0D)
if (input._1 != 0 && input._2 != 0)
{
//Calculate the total resistance of all nodes
@ -66,25 +68,26 @@ class MechanicalGrid extends GridNode[MechanicalNode](classOf[MechanicalNode]) w
.foldLeft((0D, 0D))((b, a) => (a._1 + b._1, a._2 + b._2))
//Calculate the total change in torque and angular velocity
val delta = (input._1 - input._1 * resistance._1, input._2 - input._2 * resistance._2)
//Calculate power
_power = delta._1 * delta._2
//Set torque and angular velocity of all nodes
getNodes.foreach(n =>
{
n.torque = delta._1 * n.ratio
n.angularVelocity = delta._2 / n.ratio
})
//Clear buffers
inputs.foreach(n =>
{
n.bufferTorque = 0
n.bufferAngle = 0
})
delta = (input._1 - input._1 * resistance._1, input._2 - input._2 * resistance._2)
}
//Calculate power
_power = delta._1 * delta._2
//Set torque and angular velocity of all nodes
getNodes.foreach(n =>
{
val inversion = if (spinMap(n)) 1 else -1
n.torque = delta._1 * n.ratio * inversion
n.angularVelocity = delta._2 / n.ratio * inversion
})
//Clear buffers
inputs.foreach(n =>
{
n.bufferTorque = 0
n.bufferAngle = 0
})
}
override def continueUpdate = getNodes.size > 0

View file

@ -33,18 +33,18 @@ class MechanicalNode(parent: INodeProvider) extends NodeGrid[MechanicalNode](par
var onVelocityChanged: () => Unit = () => ()
private var prevTime = 0L
private var angle = 0D
private var prevAngle = 0D
/**
* An arbitrary angle value computed based on velocity
* @return The angle in radians
*/
def renderAngle: Double =
def angle: Double =
{
val deltaTime = (System.currentTimeMillis() - prevTime) / 1000D
prevTime = System.currentTimeMillis()
angle = (angle + deltaTime * angularVelocity) % (2 * Math.PI)
return angle
prevAngle = (prevAngle + deltaTime * angularVelocity) % (2 * Math.PI)
return prevAngle
}
override def getRadius(dir: ForgeDirection, `with`: TMechanicalNode): Double = 0.5

View file

@ -37,7 +37,7 @@ import cpw.mods.fml.relauncher.SideOnly
else RenderUtility.rotateBlockBasedOnDirection(tile.getDirection)
}
RenderUtility.bind(RenderMechanicalPiston.TEXTURE)
val angle: Double = tile.mechanicalNode.renderAngle
val angle: Double = tile.mechanicalNode.angle
GL11.glPushMatrix
GL11.glRotated(-Math.toDegrees(angle), 0, 0, 1)
RenderMechanicalPiston.MODEL.renderAllExcept(ArrayUtils.addAll(shaftParts, staticParts: _*): _*)

View file

@ -37,7 +37,7 @@ import cpw.mods.fml.relauncher.SideOnly
glScalef(0.51f, 0.5f, 0.5f)
val dir: ForgeDirection = tile.getDirection
RenderUtility.rotateBlockBasedOnDirection(dir)
glRotatef(Math.toDegrees(tile.mechanicalNode.renderAngle).asInstanceOf[Float], 0, 0, 1)
glRotatef(Math.toDegrees(tile.mechanicalNode.angle).asInstanceOf[Float], 0, 0, 1)
RenderUtility.bind(Reference.blockTextureDirectory + "planks_oak.png")
RenderGrindingWheel.MODEL.renderAllExcept("teeth")
RenderUtility.bind(Reference.blockTextureDirectory + "cobblestone.png")

View file

@ -209,7 +209,7 @@ class TileMixer extends TileMechanical(Material.iron)
RenderUtility.bind(RenderMixer.TEXTURE)
RenderMixer.MODEL.renderOnly("centerTop", "centerBase")
glPushMatrix()
glRotatef(Math.toDegrees(mechanicalNode.renderAngle.asInstanceOf[Float]).asInstanceOf[Float], 0, 1, 0)
glRotatef(Math.toDegrees(mechanicalNode.angle.asInstanceOf[Float]).asInstanceOf[Float], 0, 1, 0)
RenderMixer.MODEL.renderAllExcept("centerTop", "centerBase")
glPopMatrix()
GL11.glPopMatrix()

View file

@ -33,12 +33,12 @@ import resonantinduction.core.Reference
val mediumBlades: Array[String] = Array[String]("MediumBlade1", "MediumBlade2", "MediumBlade3", "MediumBlade4", "MediumBlade5", "MediumBlade6")
val largeBlades: Array[String] = Array[String]("LargeBlade1", "LargeBlade2", "LargeBlade3", "LargeBlade4", "LargeBlade5", "LargeBlade6")
GL11.glPushMatrix
GL11.glRotated(Math.toDegrees(tile.mechanicalNode.renderAngle), 0, 1, 0)
GL11.glRotated(Math.toDegrees(tile.mechanicalNode.angle), 0, 1, 0)
RenderElectricTurbine.MODEL_LARGE.renderOnly(blades: _*)
RenderElectricTurbine.MODEL_LARGE.renderOnly(largeBlades: _*)
GL11.glPopMatrix
GL11.glPushMatrix
GL11.glRotated(-Math.toDegrees(tile.mechanicalNode.renderAngle), 0, 1, 0)
GL11.glRotated(-Math.toDegrees(tile.mechanicalNode.angle), 0, 1, 0)
RenderElectricTurbine.MODEL_LARGE.renderOnly(mediumBlades: _*)
GL11.glPopMatrix
RenderElectricTurbine.MODEL_LARGE.renderAllExcept(ArrayUtils.addAll(ArrayUtils.addAll(blades, mediumBlades: _*), largeBlades: _*): _*)
@ -78,11 +78,11 @@ import resonantinduction.core.Reference
val renderA: Array[String] = ArrayUtils.addAll(bladesA, sheildsA: _*)
val renderB: Array[String] = ArrayUtils.addAll(bladesB, sheildsB: _*)
GL11.glPushMatrix
GL11.glRotated(Math.toDegrees(tile.mechanicalNode.renderAngle), 0, 1, 0)
GL11.glRotated(Math.toDegrees(tile.mechanicalNode.angle), 0, 1, 0)
RenderElectricTurbine.MODEL_SMALL.renderOnly(renderA: _*)
GL11.glPopMatrix
GL11.glPushMatrix
GL11.glRotated(-Math.toDegrees(tile.mechanicalNode.renderAngle), 0, 1, 0)
GL11.glRotated(-Math.toDegrees(tile.mechanicalNode.angle), 0, 1, 0)
RenderElectricTurbine.MODEL_SMALL.renderOnly(renderB: _*)
GL11.glPopMatrix
RenderElectricTurbine.MODEL_SMALL.renderAllExcept(ArrayUtils.addAll(renderA, renderB: _*): _*)

View file

@ -30,7 +30,7 @@ import resonantinduction.core.Reference
GL11.glTranslatef(x.asInstanceOf[Float] + 0.5f, y.asInstanceOf[Float] + 0.5f, z.asInstanceOf[Float] + 0.5f)
GL11.glPushMatrix
RenderUtility.rotateBlockBasedOnDirectionUp(tile.getDirection)
val mechanicalNodeRenderAngle: Double = tile.mechanicalNode.renderAngle
val mechanicalNodeRenderAngle: Double = tile.mechanicalNode.angle
var renderAngleInDegrees: Float = 0
if (!java.lang.Double.isNaN(mechanicalNodeRenderAngle))
{

View file

@ -30,7 +30,7 @@ import resonantinduction.core.Reference
RenderUtility.rotateBlockBasedOnDirectionUp(tile.getDirection)
GL11.glTranslatef(0, 0.35f, 0)
GL11.glRotatef(180, 1, 0, 0)
GL11.glRotatef(Math.toDegrees(tile.mechanicalNode.renderAngle).asInstanceOf[Float], 0, 1, 0)
GL11.glRotatef(Math.toDegrees(tile.mechanicalNode.angle).asInstanceOf[Float], 0, 1, 0)
render(tile.tier, tile.multiBlockRadius, tile.getMultiBlock.isConstructed)
GL11.glPopMatrix
GL11.glPopMatrix