Fix lots of model animation errors.

This commit is contained in:
Matthew Messinger 2016-04-09 02:24:15 -04:00
parent 53eaa3c40e
commit 9b437ca587
10 changed files with 50 additions and 160 deletions

View file

@ -55,7 +55,7 @@ public abstract class AbstractPonyModel extends ModelPlayer {
this.initTextures(); this.initTextures();
this.initPositions(yOffset, stretch); this.initPositions(yOffset, stretch);
for (IPonyPart part : modelParts) { for (IPonyPart part : modelParts) {
part.init(this, yOffset, stretch); part.init(yOffset, stretch);
} }
} }

View file

@ -1,17 +1,16 @@
package com.brohoof.minelittlepony.model.part; package com.brohoof.minelittlepony.model.part;
import com.brohoof.minelittlepony.PonyData; import com.brohoof.minelittlepony.PonyData;
import com.brohoof.minelittlepony.model.BodyPart;
import com.brohoof.minelittlepony.model.AbstractPonyModel; import com.brohoof.minelittlepony.model.AbstractPonyModel;
import com.brohoof.minelittlepony.model.BodyPart;
import net.minecraft.client.renderer.GlStateManager; import net.minecraft.client.renderer.GlStateManager;
public abstract class AbstractHeadPart implements IPonyPart { public abstract class AbstractHeadPart implements IPonyPart {
private AbstractPonyModel pony; protected final AbstractPonyModel pony;
@Override public AbstractHeadPart(AbstractPonyModel pony) {
public void init(AbstractPonyModel pony, float yOffset, float stretch) {
this.pony = pony; this.pony = pony;
} }
@ -19,40 +18,11 @@ public abstract class AbstractHeadPart implements IPonyPart {
public void render(PonyData data, float scale) { public void render(PonyData data, float scale) {
pony.transform(BodyPart.HEAD); pony.transform(BodyPart.HEAD);
GlStateManager.translate(pony.bipedHead.offsetX, pony.bipedHead.offsetY, pony.bipedHead.offsetZ); GlStateManager.translate(pony.bipedHead.offsetX, pony.bipedHead.offsetY, pony.bipedHead.offsetZ);
pony.bipedHead.postRender(scale);
} }
@Override @Override
public final void animate(PonyData data, float move, float swing, float tick, float horz, float vert) { public void animate(PonyData metadata, float move, float swing, float tick, float horz, float vert) {
rotateHead(horz, vert);
if (pony.isSneak && !pony.isFlying) {
position(0, 6, -2);
} else {
position(0, 0, 0);
}
}
private void rotateHead(float horz, float vert) {
float y;
float x;
if (pony.isSleeping) {
y = 1.4F;
x = 0.1F;
} else {
y = horz / (float) (180 / Math.PI);
x = vert / (float) (180 / Math.PI);
}
x = Math.min(x, 0.5F);
x = Math.max(x, -1.25F);
rotate(x, y);
}
protected AbstractPonyModel getPony() {
return pony;
}
protected abstract void position(float posX, float posY, float posZ);
protected abstract void rotate(float rotX, float rotY);
} }
}

View file

@ -1,14 +1,13 @@
package com.brohoof.minelittlepony.model.part; package com.brohoof.minelittlepony.model.part;
import com.brohoof.minelittlepony.PonyData; import com.brohoof.minelittlepony.PonyData;
import com.brohoof.minelittlepony.model.AbstractPonyModel;
public interface IPonyPart { public interface IPonyPart {
void init(AbstractPonyModel pony, float yOffset, float stretch); void init(float yOffset, float stretch);
void animate(PonyData metadata, float move, float moveswing, float loop, float right, float down);
void render(PonyData data, float scale); void render(PonyData data, float scale);
void animate(PonyData metadata, float move, float swing, float tick, float horz, float vert);
} }

View file

@ -10,7 +10,7 @@ import net.minecraft.util.MathHelper;
public class PegasusWings implements IPonyPart, PonyModelConstants { public class PegasusWings implements IPonyPart, PonyModelConstants {
private AbstractPonyModel pony; private final AbstractPonyModel pony;
public ModelRenderer[] leftWing; public ModelRenderer[] leftWing;
public ModelRenderer[] rightWing; public ModelRenderer[] rightWing;
@ -18,10 +18,12 @@ public class PegasusWings implements IPonyPart, PonyModelConstants {
public ModelRenderer[] leftWingExt; public ModelRenderer[] leftWingExt;
public ModelRenderer[] rightWingExt; public ModelRenderer[] rightWingExt;
@Override public PegasusWings(AbstractPonyModel pony) {
public void init(AbstractPonyModel pony, float yOffset, float stretch) {
this.pony = pony; this.pony = pony;
}
@Override
public void init(float yOffset, float stretch) {
this.leftWing = new ModelRenderer[3]; this.leftWing = new ModelRenderer[3];
this.rightWing = new ModelRenderer[3]; this.rightWing = new ModelRenderer[3];
this.leftWingExt = new ModelRenderer[6]; this.leftWingExt = new ModelRenderer[6];
@ -110,7 +112,7 @@ public class PegasusWings implements IPonyPart, PonyModelConstants {
} }
float angle = pony.isRiding ? (float) (Math.PI * .3) : ROTATE_90; float angle = ROTATE_90;
for (int i = 0; i < this.leftWing.length; i++) { for (int i = 0; i < this.leftWing.length; i++) {
this.leftWing[i].rotateAngleX = angle; this.leftWing[i].rotateAngleX = angle;
@ -133,6 +135,7 @@ public class PegasusWings implements IPonyPart, PonyModelConstants {
@Override @Override
public void render(PonyData data, float scale) { public void render(PonyData data, float scale) {
pony.transform(BodyPart.BODY); pony.transform(BodyPart.BODY);
pony.bipedBody.postRender(scale);
if (data.getRace() != null && data.getRace().hasWings()) { if (data.getRace() != null && data.getRace().hasWings()) {
if (!pony.isFlying && !pony.isSneak) { if (!pony.isFlying && !pony.isSneak) {
@ -158,46 +161,28 @@ public class PegasusWings implements IPonyPart, PonyModelConstants {
private void sneak() { private void sneak() {
for (int i = 0; i < this.leftWingExt.length; ++i) { for (int i = 0; i < this.leftWingExt.length; ++i) {
this.leftWingExt[i].rotationPointY = LEFT_WING_RP_Y_SNEAK;
this.leftWingExt[i].rotationPointZ = LEFT_WING_RP_Z_SNEAK;
this.leftWingExt[i].rotateAngleX = EXT_WING_ROTATE_ANGLE_X; this.leftWingExt[i].rotateAngleX = EXT_WING_ROTATE_ANGLE_X;
this.leftWingExt[i].rotateAngleZ = LEFT_WING_ROTATE_ANGLE_Z_SNEAK; this.leftWingExt[i].rotateAngleZ = LEFT_WING_ROTATE_ANGLE_Z_SNEAK;
} }
for (int i = 0; i < this.leftWingExt.length; ++i) { for (int i = 0; i < this.leftWingExt.length; ++i) {
this.rightWingExt[i].rotationPointY = RIGHT_WING_RP_Y_SNEAK;
this.rightWingExt[i].rotationPointZ = RIGHT_WING_RP_Z_SNEAK;
this.rightWingExt[i].rotateAngleX = EXT_WING_ROTATE_ANGLE_X; this.rightWingExt[i].rotateAngleX = EXT_WING_ROTATE_ANGLE_X;
this.rightWingExt[i].rotateAngleZ = RIGHT_WING_ROTATE_ANGLE_Z_SNEAK; this.rightWingExt[i].rotateAngleZ = RIGHT_WING_ROTATE_ANGLE_Z_SNEAK;
} }
} }
private void unsneak(float tick) { private void unsneak(float tick) {
if (!pony.isFlying) { if (pony.isFlying) {
for (int i = 0; i < this.leftWing.length; ++i) {
this.leftWing[i].rotationPointY = WING_FOLDED_RP_Y;
this.leftWing[i].rotationPointZ = WING_FOLDED_RP_Z;
}
for (int i = 0; i < this.rightWing.length; ++i) {
this.rightWing[i].rotationPointY = WING_FOLDED_RP_Y;
this.rightWing[i].rotationPointZ = WING_FOLDED_RP_Z;
}
} else {
float WingRotateAngleZ = MathHelper.sin(tick * 0.536F) * 1.0F; float WingRotateAngleZ = MathHelper.sin(tick * 0.536F) * 1.0F;
for (int i = 0; i < this.leftWingExt.length; ++i) { for (int i = 0; i < this.leftWingExt.length; ++i) {
this.leftWingExt[i].rotateAngleX = EXT_WING_ROTATE_ANGLE_X; this.leftWingExt[i].rotateAngleX = EXT_WING_ROTATE_ANGLE_X;
this.leftWingExt[i].rotateAngleZ = -WingRotateAngleZ - ROTATE_270 - 0.4F; this.leftWingExt[i].rotateAngleZ = -WingRotateAngleZ - ROTATE_270 - 0.4F;
this.leftWingExt[i].rotationPointY = LEFT_WING_RP_Y_NOTSNEAK;
this.leftWingExt[i].rotationPointZ = LEFT_WING_RP_Z_NOTSNEAK;
} }
for (int i = 0; i < this.rightWingExt.length; ++i) { for (int i = 0; i < this.rightWingExt.length; ++i) {
this.rightWingExt[i].rotateAngleX = EXT_WING_ROTATE_ANGLE_X; this.rightWingExt[i].rotateAngleX = EXT_WING_ROTATE_ANGLE_X;
this.rightWingExt[i].rotateAngleZ = WingRotateAngleZ + ROTATE_270 + 0.4F; this.rightWingExt[i].rotateAngleZ = WingRotateAngleZ + ROTATE_270 + 0.4F;
this.rightWingExt[i].rotationPointY = RIGHT_WING_RP_Y_NOTSNEAK;
this.rightWingExt[i].rotationPointZ = RIGHT_WING_RP_Z_NOTSNEAK;
} }
} }
} }

View file

@ -11,9 +11,12 @@ public class PonyEars extends AbstractHeadPart implements PonyModelConstants {
private ModelRenderer left; private ModelRenderer left;
private ModelRenderer right; private ModelRenderer right;
public PonyEars(AbstractPonyModel pony) {
super(pony);
}
@Override @Override
public void init(AbstractPonyModel pony, float yOffset, float stretch) { public void init(float yOffset, float stretch) {
super.init(pony, yOffset, stretch);
this.left = new ModelRenderer(pony, 12, 16); this.left = new ModelRenderer(pony, 12, 16);
this.right = new ModelRenderer(pony, 12, 16); this.right = new ModelRenderer(pony, 12, 16);
this.right.mirror = true; this.right.mirror = true;
@ -24,20 +27,6 @@ public class PonyEars extends AbstractHeadPart implements PonyModelConstants {
this.right.setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); this.right.setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z);
} }
@Override
protected void position(float posX, float posY, float posZ) {
AbstractPonyModel.setRotationPoint(left, posX, posY, posZ);
AbstractPonyModel.setRotationPoint(right, posX, posY, posZ);
}
@Override
protected void rotate(float rotX, float rotY) {
this.left.rotateAngleX = rotX;
this.left.rotateAngleY = rotY;
this.right.rotateAngleX = rotX;
this.right.rotateAngleY = rotY;
}
@Override @Override
public void render(PonyData data, float scale) { public void render(PonyData data, float scale) {
super.render(data, scale); super.render(data, scale);

View file

@ -17,9 +17,12 @@ public class PonySnout extends AbstractHeadPart implements PonyModelConstants {
.put(PonyGender.STALLION, new PlaneRenderer[5]) .put(PonyGender.STALLION, new PlaneRenderer[5])
.build(); .build();
public PonySnout(AbstractPonyModel pony) {
super(pony);
}
@Override @Override
public void init(AbstractPonyModel pony, float yOffset, float stretch) { public void init(float yOffset, float stretch) {
super.init(pony, yOffset, stretch);
PlaneRenderer[] muzzle = MUZZLES.get(PonyGender.MARE); PlaneRenderer[] muzzle = MUZZLES.get(PonyGender.MARE);
muzzle[0] = new PlaneRenderer(pony, 10, 14); muzzle[0] = new PlaneRenderer(pony, 10, 14);
@ -84,23 +87,4 @@ public class PonySnout extends AbstractHeadPart implements PonyModelConstants {
} }
} }
@Override
protected void position(float posX, float posY, float posZ) {
for (PlaneRenderer[] pr : MUZZLES.values()) {
for (PlaneRenderer p : pr) {
AbstractPonyModel.setRotationPoint(p, posX, posY, posZ);
}
}
}
@Override
protected void rotate(float rotX, float rotY) {
for (PlaneRenderer[] pr : MUZZLES.values()) {
for (PlaneRenderer p : pr) {
p.rotateAngleX = rotX;
p.rotateAngleY = rotY;
}
}
}
} }

View file

@ -16,10 +16,12 @@ public class UnicornHorn extends AbstractHeadPart implements PonyModelConstants
private ModelRenderer horn; private ModelRenderer horn;
private HornGlowRenderer[] hornglow; private HornGlowRenderer[] hornglow;
@Override public UnicornHorn(AbstractPonyModel pony) {
public void init(AbstractPonyModel pony, float yOffset, float stretch) { super(pony);
super.init(pony, yOffset, stretch); }
@Override
public void init(float yOffset, float stretch) {
this.horn = new ModelRenderer(pony, 0, 3); this.horn = new ModelRenderer(pony, 0, 3);
this.hornglow = new HornGlowRenderer[2]; this.hornglow = new HornGlowRenderer[2];
for (int i = 0; i < hornglow.length; i++) { for (int i = 0; i < hornglow.length; i++) {
@ -28,11 +30,10 @@ public class UnicornHorn extends AbstractHeadPart implements PonyModelConstants
this.horn.addBox(-0.5F + HEAD_CENTRE_X, -10.0F + HEAD_CENTRE_Y, -1.5F + HEAD_CENTRE_Z, 1, 4, 1, stretch); this.horn.addBox(-0.5F + HEAD_CENTRE_X, -10.0F + HEAD_CENTRE_Y, -1.5F + HEAD_CENTRE_Z, 1, 4, 1, stretch);
this.horn.setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); this.horn.setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z);
this.horn.rotateAngleX = 0.5F;
this.hornglow[0].addBox(-0.5F + HEAD_CENTRE_X, -10.0F + HEAD_CENTRE_Y, -1.5F + HEAD_CENTRE_Z, 1, 4, 1, stretch + 0.5F); this.hornglow[0].addBox(-0.5F + HEAD_CENTRE_X, -10.0F + HEAD_CENTRE_Y, -1.5F + HEAD_CENTRE_Z, 1, 4, 1, stretch + 0.5F);
this.hornglow[0].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z);
this.hornglow[1].addBox(-0.5F + HEAD_CENTRE_X, -10.0F + HEAD_CENTRE_Y, -1.5F + HEAD_CENTRE_Z, 1, 3, 1, stretch + 0.8F); this.hornglow[1].addBox(-0.5F + HEAD_CENTRE_X, -10.0F + HEAD_CENTRE_Y, -1.5F + HEAD_CENTRE_Z, 1, 3, 1, stretch + 0.8F);
this.hornglow[1].setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z);
} }
@Override @Override
@ -40,7 +41,7 @@ public class UnicornHorn extends AbstractHeadPart implements PonyModelConstants
super.render(data, scale); super.render(data, scale);
if (data.getRace() != null && data.getRace().hasHorn()) { if (data.getRace() != null && data.getRace().hasHorn()) {
this.horn.render(scale); this.horn.render(scale);
if (getPony().heldItemRight != 0 && data.getGlowColor() != 0) { if (pony.heldItemRight != 0 && data.getGlowColor() != 0) {
GL11.glPushAttrib(24577); GL11.glPushAttrib(24577);
disableTexture2D(); disableTexture2D();
disableLighting(); disableLighting();
@ -51,6 +52,8 @@ public class UnicornHorn extends AbstractHeadPart implements PonyModelConstants
float blue = (data.getGlowColor() & 255) / 255.0F; float blue = (data.getGlowColor() & 255) / 255.0F;
blendFunc(GL11.GL_SRC_ALPHA, 1); blendFunc(GL11.GL_SRC_ALPHA, 1);
this.horn.postRender(scale);
color(var4, green, blue, 0.4F); color(var4, green, blue, 0.4F);
this.hornglow[0].render(scale); this.hornglow[0].render(scale);
color(var4, green, blue, 0.2F); color(var4, green, blue, 0.2F);
@ -64,24 +67,4 @@ public class UnicornHorn extends AbstractHeadPart implements PonyModelConstants
} }
} }
@Override
protected void position(float posX, float posY, float posZ) {
AbstractPonyModel.setRotationPoint(this.horn, posX, posY, posZ);
for (int i = 0; i < this.hornglow.length; i++) {
AbstractPonyModel.setRotationPoint(this.hornglow[i], posX, posY, posZ);
}
}
@Override
protected void rotate(float rotX, float rotY) {
this.horn.rotateAngleX = rotX + 0.5F;
this.horn.rotateAngleY = rotY;
for (int i = 0; i < this.hornglow.length; i++) {
this.hornglow[i].rotateAngleX = rotX + 0.5F;
this.hornglow[i].rotateAngleY = rotY;
}
}
} }

View file

@ -13,6 +13,7 @@ import com.brohoof.minelittlepony.model.part.UnicornHorn;
import com.brohoof.minelittlepony.renderer.PlaneRenderer; import com.brohoof.minelittlepony.renderer.PlaneRenderer;
import net.minecraft.client.model.ModelRenderer; import net.minecraft.client.model.ModelRenderer;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.util.MathHelper; import net.minecraft.util.MathHelper;
public class ModelPlayerPony extends AbstractPonyModel implements PonyModelConstants { public class ModelPlayerPony extends AbstractPonyModel implements PonyModelConstants {
@ -34,10 +35,10 @@ public class ModelPlayerPony extends AbstractPonyModel implements PonyModelConst
} }
protected void addParts() { protected void addParts() {
modelParts.add(new PonyEars()); modelParts.add(new PonyEars(this));
modelParts.add(new PonySnout()); modelParts.add(new PonySnout(this));
modelParts.add(new UnicornHorn()); modelParts.add(new UnicornHorn(this));
modelParts.add(new PegasusWings()); modelParts.add(new PegasusWings(this));
} }
@Override @Override
@ -149,6 +150,7 @@ public class ModelPlayerPony extends AbstractPonyModel implements PonyModelConst
animateWears(); animateWears();
this.bipedCape.rotationPointY = isSneak ? 2 : isRiding ? -4 : 0;
} }
private void animateWears() { private void animateWears() {
@ -517,10 +519,10 @@ public class ModelPlayerPony extends AbstractPonyModel implements PonyModelConst
} }
protected void renderNeck() { protected void renderNeck() {
GlStateManager.scale(0.9, 0.9, 0.9);
for (PlaneRenderer element : this.BodypieceNeck) { for (PlaneRenderer element : this.BodypieceNeck) {
element.render(this.scale); element.render(this.scale);
} }
} }
protected void renderBody() { protected void renderBody() {
@ -665,9 +667,9 @@ public class ModelPlayerPony extends AbstractPonyModel implements PonyModelConst
protected void initHeadPositions(float yOffset, float stretch) { protected void initHeadPositions(float yOffset, float stretch) {
this.bipedCape.addBox(-5.0F, 0.0F, -1.0F, 10, 16, 1, stretch); this.bipedCape.addBox(-5.0F, 0.0F, -1.0F, 10, 16, 1, stretch);
this.bipedHead.addBox(-4.0F + HEAD_CENTRE_X, -4 + HEAD_CENTRE_Y, -4.0F + HEAD_CENTRE_Z, 8, 8, 8, stretch); this.bipedHead.addBox(-4.0F + HEAD_CENTRE_X, -4 + HEAD_CENTRE_Y, -4.0F + HEAD_CENTRE_Z, 8, 8, 8, stretch);
this.bipedHead.setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); this.bipedHead.setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z - 2);
this.bipedHeadwear.addBox(-4.0F + HEAD_CENTRE_X, -4.0F + HEAD_CENTRE_Y, -4.0F + HEAD_CENTRE_Z, 8, 8, 8, stretch + 0.5F); this.bipedHeadwear.addBox(-4.0F + HEAD_CENTRE_X, -4.0F + HEAD_CENTRE_Y, -4.0F + HEAD_CENTRE_Z, 8, 8, 8, stretch + 0.5F);
this.bipedHeadwear.setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z); this.bipedHeadwear.setRotationPoint(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z - 2);
} }
protected void initBodyPositions(float yOffset, float stretch) { protected void initBodyPositions(float yOffset, float stretch) {

View file

@ -35,28 +35,11 @@ public class ModelVillagerPony extends ModelPlayerPony {
this.VillagerTrinket.rotateAngleY = bodySwingRotation * 0.2F; this.VillagerTrinket.rotateAngleY = bodySwingRotation * 0.2F;
} }
@Override
protected void adjustBodyComponents(float rotateAngleX, float rotationPointY, float rotationPointZ) {
super.adjustBodyComponents(rotateAngleX, rotationPointY, rotationPointZ);
for (int i = 0; i < this.VillagerBagPiece.length; ++i) {
this.VillagerBagPiece[i].rotateAngleX = rotateAngleX;
this.VillagerBagPiece[i].rotationPointY = rotationPointY;
this.VillagerBagPiece[i].rotationPointZ = rotationPointZ;
}
this.VillagerApron.rotateAngleX = rotateAngleX;
this.VillagerApron.rotationPointY = rotationPointY;
this.VillagerApron.rotationPointZ = rotationPointZ;
this.VillagerTrinket.rotateAngleX = rotateAngleX;
this.VillagerTrinket.rotationPointY = rotationPointY;
this.VillagerTrinket.rotationPointZ = rotationPointZ;
}
@Override @Override
protected void renderBody() { protected void renderBody() {
super.renderBody(); super.renderBody();
this.bipedBody.postRender(scale);
if (profession < 2) { if (profession < 2) {
for (int i = 0; i < this.VillagerBagPiece.length; ++i) { for (int i = 0; i < this.VillagerBagPiece.length; ++i) {
this.VillagerBagPiece[i].render(this.scale); this.VillagerBagPiece[i].render(this.scale);

View file

@ -40,9 +40,7 @@ public class LayerPonyCape implements LayerRenderer<AbstractClientPlayer> {
pushMatrix(); pushMatrix();
model.getModel().transform(BodyPart.BODY); model.getModel().transform(BodyPart.BODY);
translate(0.0F, 0.24F, 0.0F); translate(0.0F, 0.24F, 0.0F);
if (clientPlayer.isRiding()) { model.getModel().bipedBody.postRender(scale);
rotate(-36, 1, 0, 0);
}
double d = clientPlayer.prevChasingPosX + (clientPlayer.chasingPosX - clientPlayer.prevChasingPosX) * scale double d = clientPlayer.prevChasingPosX + (clientPlayer.chasingPosX - clientPlayer.prevChasingPosX) * scale
- (clientPlayer.prevPosX + (clientPlayer.posX - clientPlayer.prevPosX) * scale); - (clientPlayer.prevPosX + (clientPlayer.posX - clientPlayer.prevPosX) * scale);
@ -73,9 +71,6 @@ public class LayerPonyCape implements LayerRenderer<AbstractClientPlayer> {
f12 += MathHelper.sin((clientPlayer.prevDistanceWalkedModified f12 += MathHelper.sin((clientPlayer.prevDistanceWalkedModified
+ (clientPlayer.distanceWalkedModified - clientPlayer.prevDistanceWalkedModified) * scale) * 6.0F) + (clientPlayer.distanceWalkedModified - clientPlayer.prevDistanceWalkedModified) * scale) * 6.0F)
* 32.0F * f15; * 32.0F * f15;
if (clientPlayer.isSneaking()) {
f12 += 25.0F;
}
rotate(2.0F + f13 / 12.0F + f12, 1.0F, 0.0F, 0.0F); rotate(2.0F + f13 / 12.0F + f12, 1.0F, 0.0F, 0.0F);
rotate(f14 / 2.0F, 0.0F, 0.0F, 1.0F); rotate(f14 / 2.0F, 0.0F, 0.0F, 1.0F);