-
Notifications
You must be signed in to change notification settings - Fork 497
/
LensPluggableModel.java
125 lines (100 loc) · 5.46 KB
/
LensPluggableModel.java
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
package buildcraft.transport.pluggable;
import java.util.Collections;
import java.util.List;
import javax.vecmath.Matrix4f;
import com.google.common.collect.Lists;
import net.minecraft.client.renderer.block.model.BakedQuad;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.client.renderer.vertex.VertexFormat;
import net.minecraft.client.resources.model.ModelRotation;
import net.minecraft.item.EnumDyeColor;
import net.minecraft.util.EnumFacing;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.event.TextureStitchEvent;
import net.minecraftforge.client.model.IFlexibleBakedModel;
import net.minecraftforge.client.model.IModel;
import net.minecraftforge.fml.common.eventhandler.SubscribeEvent;
import buildcraft.api.transport.IPipe;
import buildcraft.api.transport.pluggable.IPipePluggableState;
import buildcraft.api.transport.pluggable.IPipePluggableStaticRenderer;
import buildcraft.api.transport.pluggable.IPipeRenderState;
import buildcraft.api.transport.pluggable.PipePluggable;
import buildcraft.core.lib.render.BakedModelHolder;
import buildcraft.core.lib.utils.ColorUtils;
import buildcraft.core.lib.utils.MatrixUtils;
public final class LensPluggableModel extends BakedModelHolder implements IPipePluggableStaticRenderer.Translucent {
public static final LensPluggableModel INSTANCE = new LensPluggableModel();
private static final ResourceLocation cutoutLensLoc = new ResourceLocation("buildcrafttransport:models/blocks/pluggables/lens_cutout.obj");
private static final ResourceLocation cutoutFilterLoc = new ResourceLocation("buildcrafttransport:models/blocks/pluggables/filter_cutout.obj");
private static final ResourceLocation translucentLoc = new ResourceLocation("buildcrafttransport:models/blocks/pluggables/lens_translucent.obj");
private static final ResourceLocation cutoutLensSpriteLoc = new ResourceLocation("buildcrafttransport:pipes/lens");
private static final ResourceLocation cutoutFilterSpriteLoc = new ResourceLocation("buildcrafttransport:pipes/filter");
private static final ResourceLocation translucentSpriteLoc = new ResourceLocation("buildcrafttransport:pipes/overlay_lens");
private static TextureAtlasSprite spriteLensCutout, spriteFilterCutout, spriteTranslucent;
private LensPluggableModel() {}
public IModel modelCutoutLens() {
return getModelOBJ(cutoutLensLoc);
}
public IModel modelCutoutFilter() {
return getModelOBJ(cutoutFilterLoc);
}
public IModel modelTranslucent() {
return getModelOBJ(translucentLoc);
}
@SubscribeEvent
public void textureStitch(TextureStitchEvent.Pre event) {
spriteLensCutout = null;
spriteLensCutout = event.map.getTextureExtry(cutoutLensSpriteLoc.toString());
if (spriteLensCutout == null) spriteLensCutout = event.map.registerSprite(cutoutLensSpriteLoc);
spriteFilterCutout = null;
spriteFilterCutout = event.map.getTextureExtry(cutoutFilterSpriteLoc.toString());
if (spriteFilterCutout == null) spriteFilterCutout = event.map.registerSprite(cutoutFilterSpriteLoc);
spriteTranslucent = null;
spriteTranslucent = event.map.getTextureExtry(translucentSpriteLoc.toString());
if (spriteTranslucent == null) spriteLensCutout = event.map.registerSprite(translucentSpriteLoc);
}
@Override
public List<BakedQuad> bakeCutout(IPipeRenderState render, IPipePluggableState pluggableState, IPipe pipe, PipePluggable pluggable,
EnumFacing face) {
LensPluggable lens = (LensPluggable) pluggable;
IModel model = lens.isFilter ? modelCutoutFilter() : modelCutoutLens();
TextureAtlasSprite sprite = lens.isFilter ? spriteFilterCutout : spriteLensCutout;
List<BakedQuad> quads = Lists.newArrayList();
List<BakedQuad> bakedQuads = renderLens(model, sprite, DefaultVertexFormats.BLOCK);
Matrix4f matrix = MatrixUtils.rotateTowardsFace(face);
for (BakedQuad quad : bakedQuads) {
quad = transform(quad, matrix);
quad = applyDiffuse(quad);
quads.add(quad);
}
return quads;
}
public List<BakedQuad> renderLens(IModel model, TextureAtlasSprite sprite, VertexFormat format) {
List<BakedQuad> quads = Lists.newArrayList();
IFlexibleBakedModel baked = model.bake(ModelRotation.X0_Y0, format, singleTextureFunction(sprite));
for (BakedQuad quad : baked.getGeneralQuads()) {
quad = replaceShade(quad, 0xFFFFFF);
quads.add(quad);
}
return quads;
}
@Override
public List<BakedQuad> bakeTranslucent(IPipeRenderState render, IPipePluggableState pluggableState, IPipe pipe, PipePluggable pluggable,
EnumFacing face) {
LensPluggable lens = (LensPluggable) pluggable;
EnumDyeColor colour = lens.getColour();
if (colour == null) return Collections.emptyList();
int shade = ColorUtils.getLightHex(colour);
List<BakedQuad> quads = Lists.newArrayList();
List<BakedQuad> bakedQuads = renderLens(modelTranslucent(), spriteTranslucent, DefaultVertexFormats.BLOCK);
Matrix4f matrix = MatrixUtils.rotateTowardsFace(face);
for (BakedQuad quad : bakedQuads) {
quad = transform(quad, matrix);
quad = applyDiffuse(quad);
quad = replaceTint(quad, shade);
quads.add(quad);
}
return quads;
}
}