summaryrefslogtreecommitdiff
path: root/src/main/java/darkknight/jewelrycraft/model/ModelHandPedestal.java
blob: 0fc16b0401d4176ba92a8a04304a27070b5b1864 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
package darkknight.jewelrycraft.model;

import com.pau101.util.CubicBezier;
import darkknight.jewelrycraft.tileentity.TileEntityHandPedestal;
import net.minecraft.client.model.ModelBase;
import net.minecraft.client.model.ModelRenderer;
import net.minecraft.item.Item;
import net.minecraft.item.ItemBlock;
import net.minecraft.item.ItemStack;
import net.minecraft.util.MathHelper;
import net.minecraft.util.ResourceLocation;

/**
 * @author Paul Fulham (pau101)
 */
public class ModelHandPedestal extends ModelBase
{
    protected ModelRenderer plinth;
    protected ModelRenderer base;
    protected ModelRenderer shaft;
    private ModelRenderer palm;
    private ModelRenderer[] fingers;
    private ModelRenderer thumb;
    private ItemStackModelRenderer heldItemStack;
    private CubicBezier easeInOut;
    
    /**
     * @param resetResourceLocation
     */
    public ModelHandPedestal(ResourceLocation resetResourceLocation)
    {
        initPedestalRenderers();
        plinth.setRotationPoint(0, 16, 0);
        plinth.addChild(base);
        base.addChild(shaft);
        initHandModelRenderers(resetResourceLocation);
        initCubicBeziers();
    }
    
    /**
     * 
     */
    protected void initPedestalRenderers()
    {
        plinth = createModelRenderer(0, 0).addBox(-6, 4, -6, 12, 4, 12);
        base = createModelRenderer(0, 0).addBox(-4, 0, -4, 8, 4, 8);
        shaft = createModelRenderer(0, 0).addBox(-3, -4, -3, 6, 4, 6);
    }
    
    /**
     * 
     */
    private void initCubicBeziers()
    {
        easeInOut = new CubicBezier(0.4F, 0, 0.6F, 1);
    }
    
    /**
     * @param textureOffsetX
     * @param textureOffsetY
     * @return
     */
    protected final ModelRenderer createModelRenderer(int textureOffsetX, int textureOffsetY)
    {
        ModelRenderer modelRenderer = new ModelRenderer(this, textureOffsetX, textureOffsetY);
        modelRenderer.setTextureSize(textureWidth, textureHeight);
        return modelRenderer;
    }
    
    /**
     * @return
     */
    private ModelRenderer createPhalanges()
    {
        return createModelRenderer(0, 0).addBox(-1, -1.5F, 0, 2, 3, 5).addBox(-1, -5.5F, 2, 2, 4, 3);
    }
    
    /**
     * @param resetResourceLocation
     */
    private void initHandModelRenderers(ResourceLocation resetResourceLocation)
    {
        palm = createModelRenderer(0, 0).addBox(-4, -8, -4, 8, 4, 8);
        shaft.addChild(palm);
        int fingerCount = 4;
        fingers = new ModelRenderer[fingerCount];
        for(int i = 0; i < fingerCount; i++){
            ModelRenderer phalanges = createPhalanges();
            float theta = (i / (float)fingerCount - 0.5F + 1F / fingerCount / 2) * ((float)Math.PI * 0.6F);
            phalanges.rotateAngleY = theta;
            phalanges.setRotationPoint(MathHelper.sin(theta) * 5, -5.75F, MathHelper.cos(theta) * 5 - 1);
            fingers[i] = phalanges;
            palm.addChild(phalanges);
        }
        thumb = createPhalanges();
        thumb.rotateAngleY = (float)Math.PI;
        thumb.rotationPointY = -5.75F;
        thumb.rotationPointZ = -3;
        palm.addChild(thumb);
        heldItemStack = new ItemStackModelRenderer(this, resetResourceLocation);
        heldItemStack.rotateAngleZ = (float)Math.PI;
        heldItemStack.rotateAngleX = (float)(Math.PI / 2);
        heldItemStack.setRotationPoint(0, -8.5F, -3.5F);
        palm.addChild(heldItemStack);
    }
    
    /**
     * @param pedestal
     * @param partialRenderTicks
     * @param scale
     */
    public void render(TileEntityHandPedestal pedestal, float partialRenderTicks, float scale)
    {
        handleHeldItemStack(pedestal.getHeldItemStack());
        float gripScale = pedestal.getGripScale();
        float grip = easeInOut.eval(pedestal.getGrip(partialRenderTicks)) * gripScale;
        float rotateAngleX = (float)(grip * 75 * Math.PI / 180 + (1 - grip) * 10 * Math.PI / 180);
        float rotateAngleZ = (float)(grip * 20 * Math.PI / 180);
        for(int i = 0; i < fingers.length; i++){
            ModelRenderer phalanges = fingers[i];
            phalanges.rotateAngleX = rotateAngleX;
            phalanges.rotateAngleZ = rotateAngleZ * (2F / (fingers.length - 1) * i - 1);
        }
        thumb.rotateAngleX = (float)(grip * 60 * Math.PI / 180 + (1 - grip) * 10 * Math.PI / 180);
        thumb.rotateAngleZ = rotateAngleZ;
        plinth.render(scale);
    }
    
    /**
     * @param itemStack
     */
    private void handleHeldItemStack(ItemStack itemStack)
    {
        heldItemStack.setItemStack(itemStack);
        if (itemStack != null){
            Item item = itemStack.getItem();
            if (item instanceof ItemBlock){
                heldItemStack.rotateAngleX = 0;
                heldItemStack.rotationPointZ = 0;
            }else{
                heldItemStack.rotateAngleX = (float)(Math.PI / 2);
                heldItemStack.rotationPointZ = -3.5F;
            }
        }
    }
}