Implement saddlebags as a separate component with more interesting animations

This commit is contained in:
Sollace 2018-06-04 22:24:32 +02:00
parent 4123ee8c6e
commit 3ea22fd67c
4 changed files with 115 additions and 40 deletions

View file

@ -6,25 +6,20 @@ import com.minelittlepony.model.AbstractPonyModel;
import com.minelittlepony.render.PonyRenderer; import com.minelittlepony.render.PonyRenderer;
public class ModelWing { public class ModelWing {
public PonyRenderer extended; private PonyRenderer extended;
public PonyRenderer folded; private PonyRenderer folded;
private boolean mirror;
public ModelWing(AbstractPonyModel pony, boolean mirror, float x, float y, float scale, int texY) { public ModelWing(AbstractPonyModel pony, boolean mirror, float x, float y, float scale, int texY) {
this.mirror = mirror; folded = new PonyRenderer(pony, 56, texY);
extended = new PonyRenderer(pony, 56, texY + 3);
folded = new PonyRenderer(pony, 56, texY)
.around(HEAD_RP_X, WING_FOLDED_RP_Y, WING_FOLDED_RP_Z);
extended = new PonyRenderer(pony, 56, texY + 3)
.around(HEAD_RP_X, WING_FOLDED_RP_Y, WING_FOLDED_RP_Z);
addClosedWing(x, y, scale); addClosedWing(x, y, scale);
addFeathers(mirror, y, scale); addFeathers(mirror, y, scale);
} }
private void addClosedWing(float x, float y, float scale) { private void addClosedWing(float x, float y, float scale) {
folded.box(x, 5, 2, 2, 6, 2, scale) folded.around(HEAD_RP_X, WING_FOLDED_RP_Y, WING_FOLDED_RP_Z)
.box(x, 5, 2, 2, 6, 2, scale)
.box(x, 5, 4, 2, 8, 2, scale) .box(x, 5, 4, 2, 8, 2, scale)
.box(x, 5, 6, 2, 6, 2, scale) .box(x, 5, 6, 2, 6, 2, scale)
.rotateAngleX = ROTATE_90; .rotateAngleX = ROTATE_90;
@ -32,7 +27,6 @@ public class ModelWing {
private void addFeathers(boolean mirror, float y, float scale) { private void addFeathers(boolean mirror, float y, float scale) {
float r = mirror ? -1 : 1; float r = mirror ? -1 : 1;
extended.cubeList.clear();
extended.around(r * LEFT_WING_EXT_RP_X, LEFT_WING_EXT_RP_Y + y, LEFT_WING_EXT_RP_Z); extended.around(r * LEFT_WING_EXT_RP_X, LEFT_WING_EXT_RP_Y + y, LEFT_WING_EXT_RP_Z);
addFeather(0, r, y, 6, 0, 8, scale + 0.1F); addFeather(0, r, y, 6, 0, 8, scale + 0.1F);
addFeather(1, r, y, -1.2F, -0.2F, 8, scale + 0.2F) .rotateAngleX = -0.85F; addFeather(1, r, y, -1.2F, -0.2F, 8, scale + 0.2F) .rotateAngleX = -0.85F;
@ -52,9 +46,6 @@ public class ModelWing {
public void render(boolean extend, float scale) { public void render(boolean extend, float scale) {
extended.rotationPointX = (mirror ? -1 : 1) * LEFT_WING_EXT_RP_X;
extended.rotationPointY = LEFT_WING_EXT_RP_Y;
extended.rotateAngleY = 3; extended.rotateAngleY = 3;
if (extend) { if (extend) {
extended.render(scale); extended.render(scale);

View file

@ -12,8 +12,8 @@ public class PegasusWings implements IModelPart {
private final IModelPegasus pegasus; private final IModelPegasus pegasus;
public final ModelWing leftWing; private final ModelWing leftWing;
public final ModelWing rightWing; private final ModelWing rightWing;
public <T extends AbstractPonyModel & IModelPegasus> PegasusWings(T model, float yOffset, float stretch) { public <T extends AbstractPonyModel & IModelPegasus> PegasusWings(T model, float yOffset, float stretch) {
pegasus = model; pegasus = model;

View file

@ -0,0 +1,99 @@
package com.minelittlepony.model.components;
import static com.minelittlepony.model.PonyModelConstants.*;
import com.minelittlepony.model.AbstractPonyModel;
import com.minelittlepony.model.capabilities.IModel;
import com.minelittlepony.model.capabilities.IModelPart;
import com.minelittlepony.render.plane.PlaneRenderer;
import net.minecraft.client.renderer.GlStateManager;
import net.minecraft.util.math.MathHelper;
public class SaddleBags implements IModelPart {
private PlaneRenderer leftBag;
private PlaneRenderer rightBag;
private PlaneRenderer strap;
private IModel model;
public SaddleBags(AbstractPonyModel model) {
this.model = model;
leftBag = new PlaneRenderer(model, 56, 19);
rightBag = new PlaneRenderer(model, 56, 19);
strap = new PlaneRenderer(model, 56, 19);
}
@Override
public void init(float yOffset, float stretch) {
float y = -0.5F;
int x = 4;
int z = -2;
strap.offset(-x, y + 0.2F, z + 3).around(0, 4, 4)
.tex(56, 31).addTopPlane(0, 0, 0, 8, 1, stretch)
.addTopPlane(0, 0, 1, 8, 1, stretch)
.addBackPlane(0, 0, 2, 8, 1, stretch)
.addFrontPlane(0, 0, 0, 8, 1, stretch);
leftBag.offset(x, y, z).around(0, 4, 4)
.tex(56, 25).addBackPlane(0, 0, 0, 3, 6, stretch)
.tex(59, 25).addBackPlane(0, 0, 8, 3, 6, stretch)
.tex(56, 19).addWestPlane(3, 0, 0, 6, 8, stretch)
.addWestPlane(0, 0, 0, 6, 8, stretch)
.child(0).offset(z, y, -x).tex(56, 16)
.addTopPlane(0, 0, -3, 8, 3, stretch)
.tex(56, 22).flipZ().addBottomPlane(0, 6, -3, 8, 3, stretch)
.rotateAngleY = ROTATE_270;
x += 3;
rightBag.offset(-x, y, z).around(0, 4, 4)
.tex(56, 25).addBackPlane(0, 0, 0, 3, 6, stretch)
.tex(59, 25).addBackPlane(0, 0, 8, 3, 6, stretch)
.tex(56, 19).addWestPlane(3, 0, 0, 6, 8, stretch)
.addWestPlane(0, 0, 0, 6, 8, stretch)
.child(0).offset(z, y, x).tex(56, 16)
.flipZ().addTopPlane(0, 0, -3, 8, 3, stretch)
.tex(56, 22).flipZ().addBottomPlane(0, 6, -3, 8, 3, stretch)
.rotateAngleY = ROTATE_270;
}
@Override
public void setRotationAndAngles(boolean rainboom, float move, float swing, float bodySwing, float ticks) {
float pi = PI * (float) Math.pow(swing, 16);
float mve = move * 0.6662f;
float srt = swing / 4;
bodySwing = MathHelper.cos(mve + pi) * srt;
leftBag.rotateAngleX = bodySwing;
rightBag.rotateAngleX = bodySwing;
leftBag.rotateAngleZ = bodySwing;
rightBag.rotateAngleZ = -bodySwing;
}
@Override
public void renderPart(float scale) {
if (model.canFly()) {
GlStateManager.pushMatrix();
GlStateManager.translate(0, 0.3F, 0);
}
leftBag.render(scale);
rightBag.render(scale);
strap.render(scale);
if (model.canFly()) {
GlStateManager.popMatrix();
}
}
}

View file

@ -5,12 +5,15 @@ import net.minecraft.entity.monster.EntityZombieVillager;
import net.minecraft.entity.passive.EntityVillager; import net.minecraft.entity.passive.EntityVillager;
import static com.minelittlepony.model.PonyModelConstants.*; import static com.minelittlepony.model.PonyModelConstants.*;
import com.minelittlepony.model.components.SaddleBags;
import com.minelittlepony.model.player.ModelAlicorn; import com.minelittlepony.model.player.ModelAlicorn;
import com.minelittlepony.render.plane.PlaneRenderer; import com.minelittlepony.render.plane.PlaneRenderer;
public class ModelVillagerPony extends ModelAlicorn { public class ModelVillagerPony extends ModelAlicorn {
public PlaneRenderer bag, apron, trinket; public PlaneRenderer apron, trinket;
public SaddleBags saddlebags;
public ModelVillagerPony() { public ModelVillagerPony() {
super(false); super(false);
@ -20,7 +23,7 @@ public class ModelVillagerPony extends ModelAlicorn {
protected void shakeBody(float move, float swing, float bodySwing, float ticks) { protected void shakeBody(float move, float swing, float bodySwing, float ticks) {
super.shakeBody(move, swing, bodySwing, ticks); super.shakeBody(move, swing, bodySwing, ticks);
bag.rotateAngleY = bodySwing; saddlebags.setRotationAndAngles(rainboom, move, swing, bodySwing, ticks);
apron.rotateAngleY = bodySwing; apron.rotateAngleY = bodySwing;
trinket.rotateAngleY = bodySwing; trinket.rotateAngleY = bodySwing;
} }
@ -32,7 +35,7 @@ public class ModelVillagerPony extends ModelAlicorn {
int profession = getProfession(entity); int profession = getProfession(entity);
if (profession > -1) { if (profession > -1) {
if (profession < 2) { if (profession < 2) {
bag.render(scale); saddlebags.renderPart(scale);
} else if (profession == 2) { } else if (profession == 2) {
trinket.render(scale); trinket.render(scale);
} else if (profession > 2) { } else if (profession > 2) {
@ -54,7 +57,7 @@ public class ModelVillagerPony extends ModelAlicorn {
@Override @Override
protected void initTextures() { protected void initTextures() {
super.initTextures(); super.initTextures();
bag = new PlaneRenderer(this, 56, 19); saddlebags = new SaddleBags(this);
apron = new PlaneRenderer(this, 56, 16); apron = new PlaneRenderer(this, 56, 16);
trinket = new PlaneRenderer(this, 0, 3); trinket = new PlaneRenderer(this, 0, 3);
} }
@ -63,25 +66,7 @@ public class ModelVillagerPony extends ModelAlicorn {
protected void initPositions(float yOffset, float stretch) { protected void initPositions(float yOffset, float stretch) {
super.initPositions(yOffset, stretch); super.initPositions(yOffset, stretch);
bag.offset(BODY_CENTRE_X, BODY_CENTRE_Y, BODY_CENTRE_Z) saddlebags.init(yOffset, stretch);
.around(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z)
.tex(56, 25).addBackPlane(-7, -5, -4, 3, 6, stretch) //right bag front
.addBackPlane( 4, -5, -4, 3, 6, stretch) //left bag front
.tex(59, 25).addBackPlane(-7, -5, 4, 3, 6, stretch) //right bag back
.addBackPlane( 4, -5, 4, 3, 6, stretch) //left bag back
.tex(56, 19).addWestPlane(-7, -5, -4, 6, 8, stretch) //right bag outside
.addWestPlane( 7, -5, -4, 6, 8, stretch) //left bag outside
.addWestPlane(-4.01f, -5, -4, 6, 8, stretch) //right bag inside
.addWestPlane( 4.01f, -5, -4, 6, 8, stretch) //left bag inside
.tex(56, 31) .addTopPlane(-4, -4.5F, -1, 8, 1, stretch) //strap front
.addTopPlane(-4, -4.5F, 0, 8, 1, stretch) //strap back
.addBackPlane(-4, -4.5F, 0, 8, 1, stretch)
.addFrontPlane(-4, -4.5F, 0, 8, 1, stretch)
.child(0).tex(56, 16).addTopPlane(2, -5, -13, 8, 3, stretch) //left bag top
.flipZ().addTopPlane(2, -5, -2, 8, 3, stretch) //right bag top
.tex(56, 22).addBottomPlane(2, 1, -13, 8, 3, stretch) //left bag bottom
.flipZ().addBottomPlane(2, 1, -2, 8, 3, stretch) //right bag bottom
.rotateAngleY = 4.712389F;
apron.offset(BODY_CENTRE_X, BODY_CENTRE_Y, BODY_CENTRE_Z) apron.offset(BODY_CENTRE_X, BODY_CENTRE_Y, BODY_CENTRE_Z)
.around(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z) .around(HEAD_RP_X, HEAD_RP_Y + yOffset, HEAD_RP_Z)