Remove custom vertex format from BakedQuad

This commit is contained in:
tterrag 2020-01-01 22:25:30 -05:00
parent b6c12f5fff
commit 90035ab084
22 changed files with 390 additions and 523 deletions

View file

@ -9,7 +9,7 @@
Logger field_227884_f_ = LogManager.getLogger();
IVertexBuilder func_225582_a_(double p_225582_1_, double p_225582_3_, double p_225582_5_);
@@ -95,7 +95,7 @@
@@ -95,11 +95,12 @@
f5 = p_227890_3_[k] * p_227890_6_;
}
@ -18,3 +18,8 @@
float f9 = bytebuffer.getFloat(16);
float f10 = bytebuffer.getFloat(20);
Vector4f vector4f = new Vector4f(f, f1, f2, 1.0F);
vector4f.func_229372_a_(matrix4f);
+ applyBakedNormals(vector3f, bytebuffer);
this.func_225588_a_(vector4f.func_195910_a(), vector4f.func_195913_b(), vector4f.func_195914_c(), f3, f4, f5, 1.0F, f9, f10, p_227890_8_, l, vector3f.func_195899_a(), vector3f.func_195900_b(), vector3f.func_195902_c());
}
}

View file

@ -1,6 +1,6 @@
--- a/net/minecraft/client/renderer/model/BakedQuad.java
+++ b/net/minecraft/client/renderer/model/BakedQuad.java
@@ -6,13 +6,23 @@
@@ -6,13 +6,22 @@
import net.minecraftforge.api.distmarker.OnlyIn;
@OnlyIn(Dist.CLIENT)
@ -16,22 +16,20 @@
+ */
+ @Deprecated
public BakedQuad(int[] p_i46574_1_, int p_i46574_2_, Direction p_i46574_3_, TextureAtlasSprite p_i46574_4_) {
+ this(p_i46574_1_, p_i46574_2_, p_i46574_3_, p_i46574_4_, true, net.minecraft.client.renderer.vertex.DefaultVertexFormats.field_176600_a);
+ this(p_i46574_1_, p_i46574_2_, p_i46574_3_, p_i46574_4_, true);
+ }
+
+ public BakedQuad(int[] p_i46574_1_, int p_i46574_2_, Direction p_i46574_3_, TextureAtlasSprite p_i46574_4_, boolean applyDiffuseLighting, net.minecraft.client.renderer.vertex.VertexFormat format) {
+ this.format = format;
+ public BakedQuad(int[] p_i46574_1_, int p_i46574_2_, Direction p_i46574_3_, TextureAtlasSprite p_i46574_4_, boolean applyDiffuseLighting) {
+ this.applyDiffuseLighting = applyDiffuseLighting;
this.field_178215_a = p_i46574_1_;
this.field_178213_b = p_i46574_2_;
this.field_178214_c = p_i46574_3_;
@@ -34,4 +44,25 @@
@@ -34,4 +43,20 @@
public Direction func_178210_d() {
return this.field_178214_c;
}
+
+ // Forge start
+ protected final net.minecraft.client.renderer.vertex.VertexFormat format;
+ protected final boolean applyDiffuseLighting;
+
+ @Override
@ -39,10 +37,6 @@
+ net.minecraftforge.client.model.pipeline.LightUtil.putBakedQuad(consumer, this);
+ }
+
+ public net.minecraft.client.renderer.vertex.VertexFormat getFormat() {
+ return format;
+ }
+
+ public TextureAtlasSprite func_187508_a() {
+ return field_187509_d;
+ }

View file

@ -15,14 +15,16 @@
- return new BakedQuad(aint, p_228824_3_.field_178245_c, direction, p_228824_4_);
+ net.minecraftforge.client.ForgeHooksClient.fillNormal(aint, direction);
+ return new BakedQuad(aint, p_228824_3_.field_178245_c, direction, p_228824_4_, p_228824_8_, net.minecraft.client.renderer.vertex.DefaultVertexFormats.field_176600_a);
+ return new BakedQuad(aint, p_228824_3_.field_178245_c, direction, p_228824_4_, p_228824_8_);
}
public static BlockFaceUV func_228821_a_(BlockFaceUV p_228821_0_, Direction p_228821_1_, TransformationMatrix p_228821_2_, ResourceLocation p_228821_3_) {
@@ -152,6 +154,8 @@
@@ -150,8 +152,8 @@
p_228826_1_[i + 1] = Float.floatToRawIntBits(p_228826_3_.func_195900_b());
p_228826_1_[i + 2] = Float.floatToRawIntBits(p_228826_3_.func_195902_c());
p_228826_1_[i + 3] = p_228826_4_;
p_228826_1_[i + 4] = Float.floatToRawIntBits(p_228826_5_.func_94214_a((double)p_228826_6_.func_178348_a(p_228826_2_)));
p_228826_1_[i + 4 + 1] = Float.floatToRawIntBits(p_228826_5_.func_94207_b((double)p_228826_6_.func_178346_b(p_228826_2_)));
- p_228826_1_[i + 4] = Float.floatToRawIntBits(p_228826_5_.func_94214_a((double)p_228826_6_.func_178348_a(p_228826_2_)));
- p_228826_1_[i + 4 + 1] = Float.floatToRawIntBits(p_228826_5_.func_94207_b((double)p_228826_6_.func_178346_b(p_228826_2_)));
+ p_228826_1_[i + 4] = Float.floatToRawIntBits(p_228826_5_.func_94214_a((double)p_228826_6_.func_178348_a(p_228826_2_) * .999 + p_228826_6_.func_178348_a((p_228826_2_ + 2) % 4) * .001));
+ p_228826_1_[i + 4 + 1] = Float.floatToRawIntBits(p_228826_5_.func_94207_b((double)p_228826_6_.func_178346_b(p_228826_2_) * .999 + p_228826_6_.func_178346_b((p_228826_2_ + 2) % 4) * .001));
}

View file

@ -643,14 +643,11 @@ public class ForgeHooksClient
int bl = 0;
int sl = 0;
if (q.getFormat().hasUV(1))
LightUtil.putBakedQuad(lightGatherer, q);
if (lightGatherer.hasLighting())
{
LightUtil.putBakedQuad(lightGatherer, q);
if (lightGatherer.hasLighting())
{
bl = lightGatherer.blockLight;
sl = lightGatherer.skyLight;
}
bl = lightGatherer.blockLight;
sl = lightGatherer.skyLight;
}
boolean shade = q.shouldApplyDiffuseLighting();

View file

@ -21,6 +21,8 @@ package net.minecraftforge.client.extensions;
import com.mojang.blaze3d.matrix.MatrixStack;
import com.mojang.blaze3d.vertex.IVertexBuilder;
import net.minecraft.client.renderer.LightTexture;
import net.minecraft.client.renderer.Matrix4f;
import net.minecraft.client.renderer.Vector3f;
import net.minecraft.client.renderer.Vector4f;
@ -96,16 +98,26 @@ public interface IForgeVertexBuilder
float f10 = bytebuffer.getFloat(20);
Vector4f pos = new Vector4f(f, f1, f2, 1.0F);
pos.func_229372_a_(matrix4f);
applyBakedNormals(normal, bytebuffer);
((IVertexBuilder)this).func_225588_a_(pos.getX(), pos.getY(), pos.getZ(), cr, cg, cb, ca, f9, f10, overlayCoords, lightmapCoord, normal.getX(), normal.getY(), normal.getZ());
}
}
}
default int applyBakedLighting(int lightmapCoord, ByteBuffer data) {
int sl = (lightmapCoord >> 16) & 0xFFFF;
int bl = lightmapCoord & 0xFFFF;
sl = Math.max(sl, Short.toUnsignedInt(data.getShort(24)));
int bl = LightTexture.func_228450_a_(lightmapCoord);
int sl = LightTexture.func_228454_b_(lightmapCoord);
bl = Math.max(bl, Short.toUnsignedInt(data.getShort(26)));
return (sl << 16) | bl;
sl = Math.max(sl, Short.toUnsignedInt(data.getShort(24)));
return LightTexture.func_228451_a_(bl, sl);
}
default void applyBakedNormals(Vector3f generated, ByteBuffer data) {
byte nx = data.get(28);
byte ny = data.get(29);
byte nz = data.get(30);
if (nx != 0 || ny != 0 || nz != 0) {
generated.set(nx / 127f, ny / 127f, nz / 127f);
}
}
}

View file

@ -1,83 +0,0 @@
/*
* Minecraft Forge
* Copyright (c) 2016-2019.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation version 2.1
* of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
package net.minecraftforge.client.model;
import com.google.common.collect.ImmutableList;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.client.renderer.vertex.VertexFormat;
import net.minecraft.client.renderer.vertex.VertexFormatElement;
import net.minecraft.client.renderer.vertex.VertexFormatElement.Type;
import net.minecraft.client.renderer.vertex.VertexFormatElement.Usage;
public class Attributes
{
/*
* Default format of the data in IBakedModel
*/
public static final VertexFormat DEFAULT_BAKED_FORMAT = DefaultVertexFormats.BLOCK;
/*
* Can first format be used where second is expected
*/
public static boolean moreSpecific(VertexFormat first, VertexFormat second)
{
int size = first.getSize();
if(size != second.getSize()) return false;
int padding = 0;
int j = 0;
ImmutableList<VertexFormatElement> elementsFirst = first.func_227894_c_();
ImmutableList<VertexFormatElement> elementsSecond = second.func_227894_c_();
for(VertexFormatElement firstAttr : elementsFirst)
{
while(j < elementsSecond.size() && elementsSecond.get(j).getUsage() == Usage.PADDING)
{
padding += elementsSecond.get(j++).getSize();
}
if(j >= elementsSecond.size() && padding == 0)
{
// if no padding is left, but there are still elements in first (we're processing one) - it doesn't fit
return false;
}
if(padding == 0)
{
// no padding - attributes have to match
VertexFormatElement secondAttr = elementsSecond.get(j++);
if(
firstAttr.getIndex() != secondAttr.getIndex() ||
firstAttr.getElementCount() != secondAttr.getElementCount() ||
firstAttr.getType() != secondAttr.getType() ||
firstAttr.getUsage() != secondAttr.getUsage())
{
return false;
}
}
else
{
// padding - attribute should fit in it
padding -= firstAttr.getSize();
if(padding < 0) return false;
}
}
if(padding != 0 || j != elementsSecond.size()) return false;
return true;
}
}

View file

@ -147,7 +147,7 @@ public final class DynamicBucketModel implements IModelGeometry<DynamicBucketMod
if (baseLocation != null)
{
// build base (insidest)
builder.addAll(ItemLayerModel.getQuadsForSprites(ImmutableList.of(baseLocation), DefaultVertexFormats.BLOCK, transform, spriteGetter));
builder.addAll(ItemLayerModel.getQuadsForSprites(ImmutableList.of(baseLocation), transform, spriteGetter));
}
if (fluidMaskLocation != null && fluidSprite != null)
@ -156,8 +156,8 @@ public final class DynamicBucketModel implements IModelGeometry<DynamicBucketMod
if (templateSprite != null)
{
// build liquid layer (inside)
builder.addAll(ItemTextureQuadConverter.convertTexture(DefaultVertexFormats.BLOCK, transform, templateSprite, fluidSprite, NORTH_Z_FLUID, Direction.NORTH, tint ? fluid.getAttributes().getColor() : 0xFFFFFFFF, 1));
builder.addAll(ItemTextureQuadConverter.convertTexture(DefaultVertexFormats.BLOCK, transform, templateSprite, fluidSprite, SOUTH_Z_FLUID, Direction.SOUTH, tint ? fluid.getAttributes().getColor() : 0xFFFFFFFF, 1));
builder.addAll(ItemTextureQuadConverter.convertTexture(transform, templateSprite, fluidSprite, NORTH_Z_FLUID, Direction.NORTH, tint ? fluid.getAttributes().getColor() : 0xFFFFFFFF, 1));
builder.addAll(ItemTextureQuadConverter.convertTexture(transform, templateSprite, fluidSprite, SOUTH_Z_FLUID, Direction.SOUTH, tint ? fluid.getAttributes().getColor() : 0xFFFFFFFF, 1));
}
}
@ -170,13 +170,13 @@ public final class DynamicBucketModel implements IModelGeometry<DynamicBucketMod
if (coverIsMask)
{
TextureAtlasSprite baseSprite = spriteGetter.apply(baseLocation);
builder.addAll(ItemTextureQuadConverter.convertTexture(DefaultVertexFormats.BLOCK, transform, coverSprite, baseSprite, NORTH_Z_COVER, Direction.NORTH, 0xFFFFFFFF, 1));
builder.addAll(ItemTextureQuadConverter.convertTexture(DefaultVertexFormats.BLOCK, transform, coverSprite, baseSprite, SOUTH_Z_COVER, Direction.SOUTH, 0xFFFFFFFF, 1));
builder.addAll(ItemTextureQuadConverter.convertTexture(transform, coverSprite, baseSprite, NORTH_Z_COVER, Direction.NORTH, 0xFFFFFFFF, 1));
builder.addAll(ItemTextureQuadConverter.convertTexture(transform, coverSprite, baseSprite, SOUTH_Z_COVER, Direction.SOUTH, 0xFFFFFFFF, 1));
}
else
{
builder.add(ItemTextureQuadConverter.genQuad(DefaultVertexFormats.BLOCK, transform, 0, 0, 16, 16, NORTH_Z_COVER, coverSprite, Direction.NORTH, 0xFFFFFFFF, 2));
builder.add(ItemTextureQuadConverter.genQuad(DefaultVertexFormats.BLOCK, transform, 0, 0, 16, 16, SOUTH_Z_COVER, coverSprite, Direction.SOUTH, 0xFFFFFFFF, 2));
builder.add(ItemTextureQuadConverter.genQuad(transform, 0, 0, 16, 16, NORTH_Z_COVER, coverSprite, Direction.NORTH, 0xFFFFFFFF, 2));
builder.add(ItemTextureQuadConverter.genQuad(transform, 0, 0, 16, 16, SOUTH_Z_COVER, coverSprite, Direction.SOUTH, 0xFFFFFFFF, 2));
if (particleSprite == null)
{
particleSprite = coverSprite;

View file

@ -40,6 +40,7 @@ import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.client.renderer.vertex.VertexFormat;
import net.minecraft.util.Direction;
import net.minecraft.util.ResourceLocation;
import net.minecraft.util.Util;
import net.minecraftforge.common.ForgeConfig;
import net.minecraftforge.common.model.TransformationHelper;
@ -56,34 +57,28 @@ final class FancyMissingModel implements IUnbakedModel
private static final Material font2 = new Material(AtlasTexture.LOCATION_BLOCKS_TEXTURE, new ResourceLocation("minecraft", "font/ascii"));
private static final TransformationMatrix smallTransformation = new TransformationMatrix(null, null, new Vector3f(.25f, .25f, .25f), null)
.blockCenterToCorner();
private static final LoadingCache<VertexFormat, SimpleModelFontRenderer> fontCache = CacheBuilder.newBuilder().maximumSize(3).build(new CacheLoader<VertexFormat, SimpleModelFontRenderer>()
{
@Override
public SimpleModelFontRenderer load(VertexFormat format) throws Exception
{
float [] mv = new float[16];
mv[2*4+0] = 1f / 128f;
mv[0*4+1] =mv[1*4+2] = -mv[2*4+0];
mv[3*4+3] = 1;
mv[0*4+3] = 1;
mv[0*4+3] = 1 + 1f / 0x100;
mv[0*4+3] = 0;
Matrix4f m = new Matrix4f(mv);
return new SimpleModelFontRenderer(
Minecraft.getInstance().gameSettings,
font,
Minecraft.getInstance().getTextureManager(),
false,
m,
format
) {/* TODO Implement once SimpleModelFontRenderer is fixed
@Override
protected float renderUnicodeChar(char c, boolean italic)
{
return super.renderDefaultChar(126, italic);
}
*/};
}
private static final SimpleModelFontRenderer fontRenderer = Util.make(() -> {
float [] mv = new float[16];
mv[2*4+0] = 1f / 128f;
mv[0*4+1] =mv[1*4+2] = -mv[2*4+0];
mv[3*4+3] = 1;
mv[0*4+3] = 1;
mv[0*4+3] = 1 + 1f / 0x100;
mv[0*4+3] = 0;
Matrix4f m = new Matrix4f(mv);
return new SimpleModelFontRenderer(
Minecraft.getInstance().gameSettings,
font,
Minecraft.getInstance().getTextureManager(),
false,
m
) {/* TODO Implement once SimpleModelFontRenderer is fixed
@Override
protected float renderUnicodeChar(char c, boolean italic)
{
return super.renderDefaultChar(126, italic);
}
*/};
});
private final IUnbakedModel missingModel;
@ -114,7 +109,7 @@ final class FancyMissingModel implements IUnbakedModel
IBakedModel bigMissing = missingModel.func_225613_a_(bakery, spriteGetter, modelTransform, modelLocation);
ModelTransformComposition smallState = new ModelTransformComposition(modelTransform, new SimpleModelTransform(smallTransformation));
IBakedModel smallMissing = missingModel.func_225613_a_(bakery, spriteGetter, smallState, modelLocation);
return new BakedModel(bigMissing, smallMissing, fontCache.getUnchecked(DefaultVertexFormats.BLOCK), message, spriteGetter.apply(font2));
return new BakedModel(bigMissing, smallMissing, fontRenderer, message, spriteGetter.apply(font2));
}
static final class BakedModel implements IBakedModel

View file

@ -47,9 +47,9 @@ import net.minecraft.util.math.MathHelper;
import net.minecraftforge.client.ForgeHooksClient;
import net.minecraftforge.client.model.data.IModelData;
import net.minecraftforge.client.model.geometry.IModelGeometry;
import net.minecraftforge.client.model.pipeline.BakedQuadBuilder;
import net.minecraftforge.client.model.pipeline.IVertexConsumer;
import net.minecraftforge.client.model.pipeline.TRSRTransformer;
import net.minecraftforge.client.model.pipeline.UnpackedBakedQuad;
import net.minecraftforge.fluids.FluidAttributes;
import com.google.common.cache.CacheBuilder;
@ -364,7 +364,7 @@ public final class FluidModel implements IModelGeometry<FluidModel>
private BakedQuad buildQuad(Direction side, TextureAtlasSprite texture, boolean flip, boolean offset, VertexParameter x, VertexParameter y, VertexParameter z, VertexParameter u, VertexParameter v)
{
UnpackedBakedQuad.Builder builder = new UnpackedBakedQuad.Builder(DefaultVertexFormats.BLOCK);
BakedQuadBuilder builder = new BakedQuadBuilder();
builder.setQuadOrientation(side);
builder.setTexture(texture);

View file

@ -31,9 +31,9 @@ import net.minecraft.client.renderer.vertex.VertexFormat;
import net.minecraft.util.Direction;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.model.geometry.IModelGeometry;
import net.minecraftforge.client.model.pipeline.BakedQuadBuilder;
import net.minecraftforge.client.model.pipeline.IVertexConsumer;
import net.minecraftforge.client.model.pipeline.TRSRTransformer;
import net.minecraftforge.client.model.pipeline.UnpackedBakedQuad;
import java.util.Arrays;
import java.util.BitSet;
@ -86,7 +86,7 @@ public final class ItemLayerModel implements IModelGeometry<ItemLayerModel>
{
//TODO: Verify
TransformationMatrix transform = modelTransform.func_225615_b_();
ImmutableList<BakedQuad> quads = getQuadsForSprites(textures, DefaultVertexFormats.BLOCK, transform, spriteGetter);
ImmutableList<BakedQuad> quads = getQuadsForSprites(textures, transform, spriteGetter);
TextureAtlasSprite particle = spriteGetter.apply(
owner.isTexturePresent("particle") ? owner.resolveTexture("particle") : textures.get(0)
);
@ -94,18 +94,18 @@ public final class ItemLayerModel implements IModelGeometry<ItemLayerModel>
return new BakedItemModel(quads, particle, map, overrides, transform.isIdentity());
}
public static ImmutableList<BakedQuad> getQuadsForSprites(List<Material> textures, VertexFormat format, TransformationMatrix transform, Function<Material, TextureAtlasSprite> spriteGetter)
public static ImmutableList<BakedQuad> getQuadsForSprites(List<Material> textures, TransformationMatrix transform, Function<Material, TextureAtlasSprite> spriteGetter)
{
ImmutableList.Builder<BakedQuad> builder = ImmutableList.builder();
for(int i = 0; i < textures.size(); i++)
{
TextureAtlasSprite tas = spriteGetter.apply(textures.get(i));
builder.addAll(getQuadsForSprite(i, tas, format, transform));
builder.addAll(getQuadsForSprite(i, tas, transform));
}
return builder.build();
}
public static ImmutableList<BakedQuad> getQuadsForSprite(int tint, TextureAtlasSprite sprite, VertexFormat format, TransformationMatrix transform)
public static ImmutableList<BakedQuad> getQuadsForSprite(int tint, TextureAtlasSprite sprite, TransformationMatrix transform)
{
ImmutableList.Builder<BakedQuad> builder = ImmutableList.builder();
@ -196,7 +196,7 @@ public final class ItemLayerModel implements IModelGeometry<ItemLayerModel>
{
// make quad [uStart, u]
int off = facing == Direction.DOWN ? 1 : 0;
builder.add(buildSideQuad(format, transform, facing, tint, sprite, uStart, v+off, u-uStart));
builder.add(buildSideQuad(transform, facing, tint, sprite, uStart, v+off, u-uStart));
building = false;
}
else if (!building && face) // start new quad
@ -210,7 +210,7 @@ public final class ItemLayerModel implements IModelGeometry<ItemLayerModel>
{
// make quad [uStart, uEnd]
int off = facing == Direction.DOWN ? 1 : 0;
builder.add(buildSideQuad(format, transform, facing, tint, sprite, uStart, v+off, uEnd-uStart));
builder.add(buildSideQuad(transform, facing, tint, sprite, uStart, v+off, uEnd-uStart));
}
}
}
@ -243,7 +243,7 @@ public final class ItemLayerModel implements IModelGeometry<ItemLayerModel>
{
// make quad [vStart, v]
int off = facing == Direction.EAST ? 1 : 0;
builder.add(buildSideQuad(format, transform, facing, tint, sprite, u+off, vStart, v-vStart));
builder.add(buildSideQuad(transform, facing, tint, sprite, u+off, vStart, v-vStart));
building = false;
}
else if (!building && face) // start new quad
@ -257,20 +257,20 @@ public final class ItemLayerModel implements IModelGeometry<ItemLayerModel>
{
// make quad [vStart, vEnd]
int off = facing == Direction.EAST ? 1 : 0;
builder.add(buildSideQuad(format, transform, facing, tint, sprite, u+off, vStart, vEnd-vStart));
builder.add(buildSideQuad(transform, facing, tint, sprite, u+off, vStart, vEnd-vStart));
}
}
}
// front
builder.add(buildQuad(format, transform, Direction.NORTH, sprite, tint,
builder.add(buildQuad(transform, Direction.NORTH, sprite, tint,
0, 0, 7.5f / 16f, sprite.getMinU(), sprite.getMaxV(),
0, 1, 7.5f / 16f, sprite.getMinU(), sprite.getMinV(),
1, 1, 7.5f / 16f, sprite.getMaxU(), sprite.getMinV(),
1, 0, 7.5f / 16f, sprite.getMaxU(), sprite.getMaxV()
));
// back
builder.add(buildQuad(format, transform, Direction.SOUTH, sprite, tint,
builder.add(buildQuad(transform, Direction.SOUTH, sprite, tint,
0, 0, 8.5f / 16f, sprite.getMinU(), sprite.getMaxV(),
1, 0, 8.5f / 16f, sprite.getMaxU(), sprite.getMaxV(),
1, 1, 8.5f / 16f, sprite.getMaxU(), sprite.getMinV(),
@ -319,7 +319,7 @@ public final class ItemLayerModel implements IModelGeometry<ItemLayerModel>
}
}
private static BakedQuad buildSideQuad(VertexFormat format, TransformationMatrix transform, Direction side, int tint, TextureAtlasSprite sprite, int u, int v, int size)
private static BakedQuad buildSideQuad(TransformationMatrix transform, Direction side, int tint, TextureAtlasSprite sprite, int u, int v, int size)
{
final float eps = 1e-2f;
@ -358,7 +358,7 @@ public final class ItemLayerModel implements IModelGeometry<ItemLayerModel>
float v1 = 16f * (1f - y1 - dy);
return buildQuad(
format, transform, remap(side), sprite, tint,
transform, remap(side), sprite, tint,
x0, y0, z0, sprite.getInterpolatedU(u0), sprite.getInterpolatedV(v0),
x1, y1, z0, sprite.getInterpolatedU(u1), sprite.getInterpolatedV(v1),
x1, y1, z1, sprite.getInterpolatedU(u1), sprite.getInterpolatedV(v1),
@ -372,14 +372,13 @@ public final class ItemLayerModel implements IModelGeometry<ItemLayerModel>
return side.getAxis() == Direction.Axis.Y ? side.getOpposite() : side;
}
private static BakedQuad buildQuad(
VertexFormat format, TransformationMatrix transform, Direction side, TextureAtlasSprite sprite, int tint,
private static BakedQuad buildQuad(TransformationMatrix transform, Direction side, TextureAtlasSprite sprite, int tint,
float x0, float y0, float z0, float u0, float v0,
float x1, float y1, float z1, float u1, float v1,
float x2, float y2, float z2, float u2, float v2,
float x3, float y3, float z3, float u3, float v3)
{
UnpackedBakedQuad.Builder builder = new UnpackedBakedQuad.Builder(format);
BakedQuadBuilder builder = new BakedQuadBuilder();
builder.setQuadTint(tint);
builder.setQuadOrientation(side);
@ -388,16 +387,17 @@ public final class ItemLayerModel implements IModelGeometry<ItemLayerModel>
boolean hasTransform = !transform.isIdentity();
IVertexConsumer consumer = hasTransform ? new TRSRTransformer(builder, transform) : builder;
putVertex(consumer, format, side, x0, y0, z0, u0, v0);
putVertex(consumer, format, side, x1, y1, z1, u1, v1);
putVertex(consumer, format, side, x2, y2, z2, u2, v2);
putVertex(consumer, format, side, x3, y3, z3, u3, v3);
putVertex(consumer, side, x0, y0, z0, u0, v0);
putVertex(consumer, side, x1, y1, z1, u1, v1);
putVertex(consumer, side, x2, y2, z2, u2, v2);
putVertex(consumer, side, x3, y3, z3, u3, v3);
return builder.build();
}
private static void putVertex(IVertexConsumer consumer, VertexFormat format, Direction side, float x, float y, float z, float u, float v)
private static void putVertex(IVertexConsumer consumer, Direction side, float x, float y, float z, float u, float v)
{
VertexFormat format = consumer.getVertexFormat();
for(int e = 0; e < format.func_227894_c_().size(); e++)
{
switch(format.func_227894_c_().get(e).getUsage())

View file

@ -22,12 +22,13 @@ package net.minecraftforge.client.model;
import com.google.common.collect.Lists;
import net.minecraft.client.renderer.TransformationMatrix;
import net.minecraft.client.renderer.model.BakedQuad;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.vertex.VertexFormat;
import net.minecraft.util.Direction;
import net.minecraftforge.client.model.pipeline.BakedQuadBuilder;
import net.minecraftforge.client.model.pipeline.IVertexConsumer;
import net.minecraftforge.client.model.pipeline.TRSRTransformer;
import net.minecraftforge.client.model.pipeline.UnpackedBakedQuad;
import java.util.List;
@ -51,10 +52,10 @@ public final class ItemTextureQuadConverter
* @param sprite The texture whose UVs shall be used
* @return The generated quads.
*/
public static List<UnpackedBakedQuad> convertTexture(VertexFormat format, TransformationMatrix transform, TextureAtlasSprite template, TextureAtlasSprite sprite, float z, Direction facing, int color, int tint)
public static List<BakedQuad> convertTexture(TransformationMatrix transform, TextureAtlasSprite template, TextureAtlasSprite sprite, float z, Direction facing, int color, int tint)
{
List<UnpackedBakedQuad> horizontal = convertTextureHorizontal(format, transform, template, sprite, z, facing, color, tint);
List<UnpackedBakedQuad> vertical = convertTextureVertical(format, transform, template, sprite, z, facing, color, tint);
List<BakedQuad> horizontal = convertTextureHorizontal(transform, template, sprite, z, facing, color, tint);
List<BakedQuad> vertical = convertTextureVertical(transform, template, sprite, z, facing, color, tint);
return horizontal.size() <= vertical.size() ? horizontal : vertical;
}
@ -63,13 +64,13 @@ public final class ItemTextureQuadConverter
* Scans a texture and converts it into a list of horizontal strips stacked on top of each other.
* The height of the strips is as big as possible.
*/
public static List<UnpackedBakedQuad> convertTextureHorizontal(VertexFormat format, TransformationMatrix transform, TextureAtlasSprite template, TextureAtlasSprite sprite, float z, Direction facing, int color, int tint)
public static List<BakedQuad> convertTextureHorizontal(TransformationMatrix transform, TextureAtlasSprite template, TextureAtlasSprite sprite, float z, Direction facing, int color, int tint)
{
int w = template.getWidth();
int h = template.getHeight();
float wScale = 16f / (float)w;
float hScale = 16f / (float)h;
List<UnpackedBakedQuad> quads = Lists.newArrayList();
List<BakedQuad> quads = Lists.newArrayList();
// the upper left x-position of the current quad
int start = -1;
@ -109,7 +110,7 @@ public final class ItemTextureQuadConverter
}
// create the quad
quads.add(genQuad(format, transform,
quads.add(genQuad(transform,
(float)start * wScale,
(float)y * hScale,
(float)x * wScale,
@ -134,13 +135,13 @@ public final class ItemTextureQuadConverter
* Scans a texture and converts it into a list of vertical strips stacked next to each other from left to right.
* The width of the strips is as big as possible.
*/
public static List<UnpackedBakedQuad> convertTextureVertical(VertexFormat format, TransformationMatrix transform, TextureAtlasSprite template, TextureAtlasSprite sprite, float z, Direction facing, int color, int tint)
public static List<BakedQuad> convertTextureVertical(TransformationMatrix transform, TextureAtlasSprite template, TextureAtlasSprite sprite, float z, Direction facing, int color, int tint)
{
int w = template.getWidth();
int h = template.getHeight();
float wScale = 16f / (float)w;
float hScale = 16f / (float)h;
List<UnpackedBakedQuad> quads = Lists.newArrayList();
List<BakedQuad> quads = Lists.newArrayList();
// the upper left y-position of the current quad
int start = -1;
@ -180,7 +181,7 @@ public final class ItemTextureQuadConverter
}
// create the quad
quads.add(genQuad(format, transform,
quads.add(genQuad(transform,
(float)x * wScale,
(float)start * hScale,
(float)endX * wScale,
@ -210,7 +211,7 @@ public final class ItemTextureQuadConverter
* Generates a Front/Back quad for an itemmodel. Therefore only supports facing NORTH and SOUTH.
* Coordinates are [0,16] to match the usual coordinates used in TextureAtlasSprites
*/
public static UnpackedBakedQuad genQuad(VertexFormat format, TransformationMatrix transform, float x1, float y1, float x2, float y2, float z, TextureAtlasSprite sprite, Direction facing, int color, int tint)
public static BakedQuad genQuad(TransformationMatrix transform, float x1, float y1, float x2, float y2, float z, TextureAtlasSprite sprite, Direction facing, int color, int tint)
{
float u1 = sprite.getInterpolatedU(x1);
float v1 = sprite.getInterpolatedV(y1);
@ -226,14 +227,14 @@ public final class ItemTextureQuadConverter
y1 = 1f - y2;
y2 = 1f - tmp;
return putQuad(format, transform, facing, sprite, color, tint, x1, y1, x2, y2, z, u1, v1, u2, v2);
return putQuad(transform, facing, sprite, color, tint, x1, y1, x2, y2, z, u1, v1, u2, v2);
}
private static UnpackedBakedQuad putQuad(VertexFormat format, TransformationMatrix transform, Direction side, TextureAtlasSprite sprite, int color, int tint,
private static BakedQuad putQuad(TransformationMatrix transform, Direction side, TextureAtlasSprite sprite, int color, int tint,
float x1, float y1, float x2, float y2, float z,
float u1, float v1, float u2, float v2)
{
UnpackedBakedQuad.Builder builder = new UnpackedBakedQuad.Builder(format);
BakedQuadBuilder builder = new BakedQuadBuilder();
builder.setQuadTint(tint);
builder.setQuadOrientation(side);
@ -245,24 +246,25 @@ public final class ItemTextureQuadConverter
if (side == Direction.SOUTH)
{
putVertex(consumer, format, side, x1, y1, z, u1, v2, color);
putVertex(consumer, format, side, x2, y1, z, u2, v2, color);
putVertex(consumer, format, side, x2, y2, z, u2, v1, color);
putVertex(consumer, format, side, x1, y2, z, u1, v1, color);
putVertex(consumer, side, x1, y1, z, u1, v2, color);
putVertex(consumer, side, x2, y1, z, u2, v2, color);
putVertex(consumer, side, x2, y2, z, u2, v1, color);
putVertex(consumer, side, x1, y2, z, u1, v1, color);
}
else
{
putVertex(consumer, format, side, x1, y1, z, u1, v2, color);
putVertex(consumer, format, side, x1, y2, z, u1, v1, color);
putVertex(consumer, format, side, x2, y2, z, u2, v1, color);
putVertex(consumer, format, side, x2, y1, z, u2, v2, color);
putVertex(consumer, side, x1, y1, z, u1, v2, color);
putVertex(consumer, side, x1, y2, z, u1, v1, color);
putVertex(consumer, side, x2, y2, z, u2, v1, color);
putVertex(consumer, side, x2, y1, z, u2, v2, color);
}
return builder.build();
}
private static void putVertex(IVertexConsumer consumer, VertexFormat format, Direction side,
private static void putVertex(IVertexConsumer consumer, Direction side,
float x, float y, float z, float u, float v, int color)
{
VertexFormat format = consumer.getVertexFormat();
for (int e = 0; e < format.func_227894_c_().size(); e++)
{
switch (format.func_227894_c_().get(e).getUsage())

View file

@ -19,40 +19,38 @@
package net.minecraftforge.client.model;
import com.google.common.collect.Lists;
import net.minecraft.client.renderer.TransformationMatrix;
import net.minecraft.client.renderer.Vector3f;
import net.minecraft.client.renderer.Vector4f;
import net.minecraft.client.renderer.model.BakedQuad;
import net.minecraft.client.renderer.vertex.VertexFormat;
import net.minecraft.client.renderer.vertex.VertexFormatElement;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;
import com.google.common.collect.Lists;
import net.minecraft.client.renderer.TransformationMatrix;
import net.minecraft.client.renderer.Vector3f;
import net.minecraft.client.renderer.Vector4f;
import net.minecraft.client.renderer.model.BakedQuad;
import net.minecraft.client.renderer.vertex.DefaultVertexFormats;
import net.minecraft.client.renderer.vertex.VertexFormat;
import net.minecraft.client.renderer.vertex.VertexFormatElement;
public class QuadTransformer
{
private final VertexFormat format;
private final int positionOffset;
private final int normalOffset;
private static final int POSITION = findPositionOffset(DefaultVertexFormats.BLOCK);
private static final int NORMAL = findNormalOffset(DefaultVertexFormats.BLOCK);
private final TransformationMatrix transform;
public QuadTransformer(VertexFormat format, TransformationMatrix transform)
public QuadTransformer(TransformationMatrix transform)
{
this.format = format;
this.positionOffset = findPositionOffset(format);
this.normalOffset = findNormalOffset(format);
this.transform = transform;
}
private void processVertices(int[] inData, int[] outData)
{
int stride = format.getSize();
int stride = DefaultVertexFormats.BLOCK.getSize();
int count = (inData.length * 4) / stride;
for (int i=0;i<count;i++)
{
int offset = positionOffset + i * stride;
int offset = POSITION + i * stride;
float x = Float.intBitsToFloat(getAtByteOffset(inData, offset ));
float y = Float.intBitsToFloat(getAtByteOffset(inData, offset + 4));
float z = Float.intBitsToFloat(getAtByteOffset(inData, offset + 8));
@ -66,29 +64,26 @@ public class QuadTransformer
putAtByteOffset(outData,offset + 8, Float.floatToRawIntBits(pos.getZ()));
}
if (normalOffset >= 0)
for (int i=0;i<count;i++)
{
for (int i=0;i<count;i++)
int offset = NORMAL + i * stride;
int normalIn = getAtByteOffset(inData,offset);
if (normalIn != 0)
{
int offset = normalOffset + i * stride;
int normalIn = getAtByteOffset(inData,offset);
if (normalIn != 0)
{
float x = (((normalIn) >> 24) & 0xFF) / 255.0f;
float y = (((normalIn << 8) >> 24) & 0xFF) / 255.0f;
float z = (((normalIn << 16) >> 24) & 0xFF) / 255.0f;
float x = (((normalIn) >> 24) & 0xFF) / 255.0f;
float y = (((normalIn << 8) >> 24) & 0xFF) / 255.0f;
float z = (((normalIn << 16) >> 24) & 0xFF) / 255.0f;
Vector3f pos = new Vector3f(x, y, z);
transform.transformNormal(pos);
pos.func_229194_d_();
Vector3f pos = new Vector3f(x, y, z);
transform.transformNormal(pos);
pos.func_229194_d_();
int normalOut = (((int) (x / 255.0) & 0xFF) << 24) |
(((int) (y / 255.0) & 0xFF) << 16) |
(((int) (z / 255.0) & 0xFF) << 8) |
(normalIn & 0xFF);
int normalOut = (((int) (x / 255.0) & 0xFF) << 24) |
(((int) (y / 255.0) & 0xFF) << 16) |
(((int) (z / 255.0) & 0xFF) << 8) |
(normalIn & 0xFF);
putAtByteOffset(outData, offset, normalOut);
}
putAtByteOffset(outData, offset, normalOut);
}
}
}
@ -158,7 +153,7 @@ public class QuadTransformer
}
}
if (index == fmt.func_227894_c_().size() || element == null)
return -1;
throw new IllegalStateException("BLOCK format does not have normals?");
if (element.getType() != VertexFormatElement.Type.BYTE)
throw new RuntimeException("Expected NORMAL attribute to have data type BYTE");
if (element.getSize() < 3)
@ -177,7 +172,7 @@ public class QuadTransformer
int[] outData = Arrays.copyOf(inData, inData.length);
processVertices(inData, outData);
return new BakedQuad(outData, input.getTintIndex(), input.getFace(), input.getSprite(), input.shouldApplyDiffuseLighting(), format);
return new BakedQuad(outData, input.getTintIndex(), input.getFace(), input.getSprite(), input.shouldApplyDiffuseLighting());
}
/**
@ -209,7 +204,7 @@ public class QuadTransformer
int[] outData = Arrays.copyOf(inData, inData.length);
processVertices(inData, outData);
outputs.add(new BakedQuad(outData, input.getTintIndex(), input.getFace(), input.getSprite(), input.shouldApplyDiffuseLighting(), format));
outputs.add(new BakedQuad(outData, input.getTintIndex(), input.getFace(), input.getSprite(), input.shouldApplyDiffuseLighting()));
}
return outputs;
}

View file

@ -19,41 +19,38 @@
package net.minecraftforge.client.model;
import net.minecraft.client.renderer.Matrix4f;
import net.minecraft.client.renderer.TransformationMatrix;
import net.minecraft.client.renderer.Vector3f;
import net.minecraft.client.renderer.Vector4f;
import net.minecraft.client.renderer.vertex.VertexFormatElement;
import net.minecraftforge.client.model.pipeline.UnpackedBakedQuad;
import com.google.common.collect.ImmutableList;
import net.minecraft.client.GameSettings;
import net.minecraft.client.gui.FontRenderer;
import net.minecraft.client.renderer.Matrix4f;
import net.minecraft.client.renderer.TransformationMatrix;
import net.minecraft.client.renderer.Vector3f;
import net.minecraft.client.renderer.Vector4f;
import net.minecraft.client.renderer.model.BakedQuad;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.texture.TextureManager;
import net.minecraft.client.renderer.vertex.VertexFormat;
import net.minecraft.client.renderer.vertex.VertexFormatElement;
import net.minecraft.util.Direction;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.model.pipeline.BakedQuadBuilder;
public abstract class SimpleModelFontRenderer extends FontRenderer {
private float r, g, b, a;
private final TransformationMatrix transform;
private ImmutableList.Builder<BakedQuad> builder = ImmutableList.builder();
private final VertexFormat format;
private final Vector3f normal = new Vector3f(0, 0, 1);
private final Direction orientation;
private boolean fillBlanks = false;
private TextureAtlasSprite sprite;
public SimpleModelFontRenderer(GameSettings settings, ResourceLocation font, TextureManager manager, boolean isUnicode, Matrix4f matrix, VertexFormat format)
public SimpleModelFontRenderer(GameSettings settings, ResourceLocation font, TextureManager manager, boolean isUnicode, Matrix4f matrix)
{
super(manager, null);
this.transform = new TransformationMatrix(matrix);
this.format = format;
transform.transformNormal(normal);
orientation = Direction.getFacingFromVector(normal.getX(), normal.getY(), normal.getZ());
}
@ -70,9 +67,9 @@ public abstract class SimpleModelFontRenderer extends FontRenderer {
private final Vector4f vec = new Vector4f();
private void addVertex(UnpackedBakedQuad.Builder quadBuilder, float x, float y, float u, float v)
private void addVertex(BakedQuadBuilder quadBuilder, float x, float y, float u, float v)
{
ImmutableList<VertexFormatElement> elements = format.func_227894_c_();
ImmutableList<VertexFormatElement> elements = quadBuilder.getVertexFormat().func_227894_c_();
for(int e = 0; e < elements.size(); e++)
{
VertexFormatElement element = elements.get(e);

View file

@ -27,7 +27,6 @@ import javax.annotation.Nullable;
import net.minecraft.client.Minecraft;
import net.minecraft.client.renderer.model.*;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.vertex.VertexFormat;
import net.minecraft.entity.LivingEntity;
import net.minecraft.item.ItemStack;
import net.minecraft.util.ResourceLocation;

View file

@ -68,7 +68,6 @@ import com.google.gson.JsonParser;
import net.minecraft.block.BlockState;
import net.minecraft.client.renderer.model.ItemCameraTransforms.TransformType;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.vertex.VertexFormat;
import net.minecraft.resources.IResource;
import net.minecraft.resources.IResourceManager;
import net.minecraft.util.Direction;
@ -83,7 +82,8 @@ import net.minecraftforge.client.model.b3d.B3DModel.Texture;
import net.minecraftforge.client.model.b3d.B3DModel.Vertex;
import net.minecraftforge.client.model.data.IDynamicBakedModel;
import net.minecraftforge.client.model.data.IModelData;
import net.minecraftforge.client.model.pipeline.UnpackedBakedQuad;
import net.minecraftforge.client.model.pipeline.BakedQuadBuilder;
import net.minecraftforge.client.model.pipeline.IVertexConsumer;
import net.minecraftforge.common.model.animation.IClip;
import net.minecraftforge.common.model.animation.IJoint;
import net.minecraftforge.common.property.Properties;
@ -477,7 +477,7 @@ public enum B3DLoader implements ISelectiveResourceReloadListener
}
}
builder.put("missingno", missing);
return new BakedWrapper(model.getRoot(), modelTransform, smooth, gui3d, DefaultVertexFormats.BLOCK, meshes, builder.build());
return new BakedWrapper(model.getRoot(), modelTransform, smooth, gui3d, meshes, builder.build());
}
public ModelWrapper retexture(ImmutableMap<String, String> textures)
@ -597,16 +597,15 @@ public enum B3DLoader implements ISelectiveResourceReloadListener
private final IModelTransform state;
private final boolean smooth;
private final boolean gui3d;
private final VertexFormat format;
private final ImmutableSet<String> meshes;
private final ImmutableMap<String, TextureAtlasSprite> textures;
private final LoadingCache<Integer, B3DState> cache;
private ImmutableList<BakedQuad> quads;
public BakedWrapper(final Node<?> node, final IModelTransform state, final boolean smooth, final boolean gui3d, final VertexFormat format, final ImmutableSet<String> meshes, final ImmutableMap<String, TextureAtlasSprite> textures)
public BakedWrapper(final Node<?> node, final IModelTransform state, final boolean smooth, final boolean gui3d, final ImmutableSet<String> meshes, final ImmutableMap<String, TextureAtlasSprite> textures)
{
this(node, state, smooth, gui3d, format, meshes, textures, CacheBuilder.newBuilder()
this(node, state, smooth, gui3d, meshes, textures, CacheBuilder.newBuilder()
.maximumSize(128)
.expireAfterAccess(2, TimeUnit.MINUTES)
.build(new CacheLoader<Integer, B3DState>()
@ -626,13 +625,12 @@ public enum B3DLoader implements ISelectiveResourceReloadListener
}));
}
public BakedWrapper(Node<?> node, IModelTransform state, boolean smooth, boolean gui3d, VertexFormat format, ImmutableSet<String> meshes, ImmutableMap<String, TextureAtlasSprite> textures, LoadingCache<Integer, B3DState> cache)
public BakedWrapper(Node<?> node, IModelTransform state, boolean smooth, boolean gui3d, ImmutableSet<String> meshes, ImmutableMap<String, TextureAtlasSprite> textures, LoadingCache<Integer, B3DState> cache)
{
this.node = node;
this.state = state;
this.smooth = smooth;
this.gui3d = gui3d;
this.format = format;
this.meshes = meshes;
this.textures = textures;
this.cache = cache;
@ -713,7 +711,7 @@ public enum B3DLoader implements ISelectiveResourceReloadListener
});
for(Face f : faces)
{
UnpackedBakedQuad.Builder quadBuilder = new UnpackedBakedQuad.Builder(format);
BakedQuadBuilder quadBuilder = new BakedQuadBuilder();
quadBuilder.setContractUVs(true);
quadBuilder.setQuadOrientation(Direction.getFacingFromVector(f.getNormal().getX(), f.getNormal().getY(), f.getNormal().getZ()));
List<Texture> textures = null;
@ -732,32 +730,32 @@ public enum B3DLoader implements ISelectiveResourceReloadListener
}
}
private final void putVertexData(UnpackedBakedQuad.Builder builder, Vertex v, Vector3f faceNormal, TextureAtlasSprite sprite)
private final void putVertexData(IVertexConsumer consumer, Vertex v, Vector3f faceNormal, TextureAtlasSprite sprite)
{
// TODO handle everything not handled (texture transformations, bones, transformations, normals, e.t.c)
ImmutableList<VertexFormatElement> vertexFormatElements = format.func_227894_c_();
ImmutableList<VertexFormatElement> vertexFormatElements = consumer.getVertexFormat().func_227894_c_();
for(int e = 0; e < vertexFormatElements.size(); e++)
{
switch(vertexFormatElements.get(e).getUsage())
{
case POSITION:
builder.put(e, v.getPos().getX(), v.getPos().getY(), v.getPos().getZ(), 1);
consumer.put(e, v.getPos().getX(), v.getPos().getY(), v.getPos().getZ(), 1);
break;
case COLOR:
if(v.getColor() != null)
{
builder.put(e, v.getColor().getX(), v.getColor().getY(), v.getColor().getZ(), v.getColor().getW());
consumer.put(e, v.getColor().getX(), v.getColor().getY(), v.getColor().getZ(), v.getColor().getW());
}
else
{
builder.put(e, 1, 1, 1, 1);
consumer.put(e, 1, 1, 1, 1);
}
break;
case UV:
// TODO handle more brushes
if(vertexFormatElements.get(e).getIndex() < v.getTexCoords().length)
{
builder.put(e,
consumer.put(e,
sprite.getInterpolatedU(v.getTexCoords()[0].getX() * 16),
sprite.getInterpolatedV(v.getTexCoords()[0].getY() * 16),
0,
@ -766,21 +764,21 @@ public enum B3DLoader implements ISelectiveResourceReloadListener
}
else
{
builder.put(e, 0, 0, 0, 1);
consumer.put(e, 0, 0, 0, 1);
}
break;
case NORMAL:
if(v.getNormal() != null)
{
builder.put(e, v.getNormal().getX(), v.getNormal().getY(), v.getNormal().getZ(), 0);
consumer.put(e, v.getNormal().getX(), v.getNormal().getY(), v.getNormal().getZ(), 0);
}
else
{
builder.put(e, faceNormal.getX(), faceNormal.getY(), faceNormal.getZ(), 0);
consumer.put(e, faceNormal.getX(), faceNormal.getY(), faceNormal.getZ(), 0);
}
break;
default:
builder.put(e);
consumer.put(e);
}
}
}

View file

@ -25,7 +25,6 @@ import net.minecraft.client.renderer.model.IUnbakedModel;
import net.minecraft.client.renderer.model.Material;
import net.minecraft.client.renderer.model.ModelBakery;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.vertex.VertexFormat;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.model.IModelBuilder;
import net.minecraftforge.client.model.IModelConfiguration;

View file

@ -29,8 +29,6 @@ import net.minecraft.client.renderer.Vector3f;
import net.minecraft.client.renderer.Vector4f;
import net.minecraft.client.renderer.model.*;
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.renderer.vertex.VertexFormatElement;
import net.minecraft.util.Direction;
import net.minecraft.util.ResourceLocation;
@ -39,8 +37,8 @@ import net.minecraft.util.math.Vec2f;
import net.minecraftforge.client.model.*;
import net.minecraftforge.client.model.geometry.IModelGeometryPart;
import net.minecraftforge.client.model.geometry.IMultipartModelGeometry;
import net.minecraftforge.client.model.pipeline.BakedQuadBuilder;
import net.minecraftforge.client.model.pipeline.IVertexConsumer;
import net.minecraftforge.client.model.pipeline.UnpackedBakedQuad;
import net.minecraftforge.common.model.TransformationHelper;
import org.apache.commons.lang3.tuple.Pair;
@ -339,7 +337,7 @@ public class OBJModel implements IMultipartModelGeometry<OBJModel>
return Optional.ofNullable(parts.get(name));
}
private Pair<BakedQuad,Direction> makeQuad(int[][] indices, int tintIndex, Vector4f colorTint, Vector4f ambientColor, boolean isFullbright, TextureAtlasSprite texture, VertexFormat format, TransformationMatrix transform)
private Pair<BakedQuad,Direction> makeQuad(int[][] indices, int tintIndex, Vector4f colorTint, Vector4f ambientColor, boolean isFullbright, TextureAtlasSprite texture, TransformationMatrix transform)
{
boolean needsNormalRecalculation = false;
for (int[] ints : indices)
@ -363,7 +361,7 @@ public class OBJModel implements IMultipartModelGeometry<OBJModel>
Vector4f[] pos = new Vector4f[4];
Vector3f[] norm = new Vector3f[4];
UnpackedBakedQuad.Builder builder = new UnpackedBakedQuad.Builder(format);
BakedQuadBuilder builder = new BakedQuadBuilder();
builder.setQuadTint(tintIndex);
builder.setTexture(texture);
@ -396,7 +394,7 @@ public class OBJModel implements IMultipartModelGeometry<OBJModel>
color.getY() * colorTint.getY(),
color.getZ() * colorTint.getZ(),
color.getW() * colorTint.getW());
putVertexData(builder, format, position, texCoord, normal, tintedColor, uv2, texture);
putVertexData(builder, position, texCoord, normal, tintedColor, uv2, texture);
pos[i] = position;
norm[i] = normal;
}
@ -459,9 +457,9 @@ public class OBJModel implements IMultipartModelGeometry<OBJModel>
return Pair.of(builder.build(), cull);
}
private void putVertexData(IVertexConsumer consumer, VertexFormat format, Vector4f position0, Vec2f texCoord0, Vector3f normal0, Vector4f color0, Vec2f uv2, TextureAtlasSprite texture)
private void putVertexData(IVertexConsumer consumer, Vector4f position0, Vec2f texCoord0, Vector3f normal0, Vector4f color0, Vec2f uv2, TextureAtlasSprite texture)
{
ImmutableList<VertexFormatElement> elements = format.func_227894_c_();
ImmutableList<VertexFormatElement> elements = consumer.getVertexFormat().func_227894_c_();
for(int j=0;j<elements.size();j++)
{
VertexFormatElement e = elements.get(j);
@ -532,7 +530,7 @@ public class OBJModel implements IMultipartModelGeometry<OBJModel>
for (int[][] face : mesh.faces)
{
Pair<BakedQuad, Direction> quad = makeQuad(face, tintIndex, colorTint, mat.ambientColor, isFullbright, texture, DefaultVertexFormats.BLOCK, modelTransform.func_225615_b_());
Pair<BakedQuad, Direction> quad = makeQuad(face, tintIndex, colorTint, mat.ambientColor, isFullbright, texture, modelTransform.func_225615_b_());
if (quad.getRight() == null)
modelBuilder.addGeneralQuad(quad.getLeft());
else

View file

@ -0,0 +1,192 @@
/*
* Minecraft Forge
* Copyright (c) 2016-2019.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation version 2.1
* of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
package net.minecraftforge.client.model.pipeline;
import com.google.common.collect.ImmutableList;
import net.minecraft.client.renderer.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.renderer.vertex.VertexFormatElement;
import net.minecraft.util.Direction;
// advantages: non-fixed-length vertex format, no overhead of packing and unpacking attributes to transform the model
// disadvantages: (possibly) larger memory footprint, overhead on packing the attributes at the final rendering stage
public class BakedQuadBuilder implements IVertexConsumer
{
private static final int SIZE = DefaultVertexFormats.BLOCK.func_227894_c_().size();
private final float[][][] unpackedData;
private int tint = -1;
private Direction orientation;
private TextureAtlasSprite texture;
private boolean applyDiffuseLighting = true;
private int vertices = 0;
private int elements = 0;
private boolean full = false;
private boolean contractUVs = false;
public BakedQuadBuilder()
{
unpackedData = new float[4][SIZE][4];
}
public void setContractUVs(boolean value)
{
this.contractUVs = value;
}
@Override
public VertexFormat getVertexFormat()
{
return DefaultVertexFormats.BLOCK;
}
@Override
public void setQuadTint(int tint)
{
this.tint = tint;
}
@Override
public void setQuadOrientation(Direction orientation)
{
this.orientation = orientation;
}
// FIXME: move (or at least add) into constructor
@Override
public void setTexture(TextureAtlasSprite texture)
{
this.texture = texture;
}
@Override
public void setApplyDiffuseLighting(boolean diffuse)
{
this.applyDiffuseLighting = diffuse;
}
@Override
public void put(int element, float... data)
{
for(int i = 0; i < 4; i++)
{
if(i < data.length)
{
unpackedData[vertices][element][i] = data[i];
}
else
{
unpackedData[vertices][element][i] = 0;
}
}
elements++;
if(elements == SIZE)
{
vertices++;
elements = 0;
}
if(vertices == 4)
{
full = true;
}
}
private final float eps = 1f / 0x100;
public BakedQuad build()
{
if(!full)
{
throw new IllegalStateException("not enough data");
}
if(texture == null)
{
throw new IllegalStateException("texture not set");
}
if(contractUVs)
{
float tX = texture.getWidth() / (texture.getMaxU() - texture.getMinU());
float tY = texture.getHeight() / (texture.getMaxV() - texture.getMinV());
float tS = tX > tY ? tX : tY;
float ep = 1f / (tS * 0x100);
int uve = 0;
ImmutableList<VertexFormatElement> elements = DefaultVertexFormats.BLOCK.func_227894_c_();
while(uve < elements.size())
{
VertexFormatElement e = elements.get(uve);
if(e.getUsage() == VertexFormatElement.Usage.UV && e.getIndex() == 0)
{
break;
}
uve++;
}
if(uve == elements.size())
{
throw new IllegalStateException("Can't contract UVs: format doesn't contain UVs");
}
float[] uvc = new float[4];
for(int v = 0; v < 4; v++)
{
for(int i = 0; i < 4; i++)
{
uvc[i] += unpackedData[v][uve][i] / 4;
}
}
for(int v = 0; v < 4; v++)
{
for (int i = 0; i < 4; i++)
{
float uo = unpackedData[v][uve][i];
float un = uo * (1 - eps) + uvc[i] * eps;
float ud = uo - un;
float aud = ud;
if(aud < 0) aud = -aud;
if(aud < ep) // not moving a fraction of a pixel
{
float udc = uo - uvc[i];
if(udc < 0) udc = -udc;
if(udc < 2 * ep) // center is closer than 2 fractions of a pixel, don't move too close
{
un = (uo + uvc[i]) / 2;
}
else // move at least by a fraction
{
un = uo + (ud < 0 ? ep : -ep);
}
}
unpackedData[v][uve][i] = un;
}
}
}
int[] packed = new int[SIZE * 4];
for (int v = 0; v < 4; v++)
{
for (int e = 0; e < SIZE; e++)
{
LightUtil.pack(unpackedData[v][e], packed, DefaultVertexFormats.BLOCK, v, e);
}
}
return new BakedQuad(packed, tint, orientation, texture, applyDiffuseLighting);
}
}

View file

@ -96,7 +96,7 @@ public class LightUtil
consumer.setApplyDiffuseLighting(quad.shouldApplyDiffuseLighting());
float[] data = new float[4];
VertexFormat formatFrom = consumer.getVertexFormat();
VertexFormat formatTo = quad.getFormat();
VertexFormat formatTo = DefaultVertexFormats.BLOCK;
int countFrom = formatFrom.func_227894_c_().size();
int countTo = formatTo.func_227894_c_().size();
int[] eMap = mapFormats(formatFrom, formatTo);

View file

@ -1,240 +0,0 @@
/*
* Minecraft Forge
* Copyright (c) 2016-2019.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation version 2.1
* of the License.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*/
package net.minecraftforge.client.model.pipeline;
import com.google.common.collect.ImmutableList;
import net.minecraft.client.renderer.model.BakedQuad;
import net.minecraft.client.renderer.texture.TextureAtlasSprite;
import net.minecraft.client.renderer.vertex.VertexFormat;
import net.minecraft.client.renderer.vertex.VertexFormatElement;
import net.minecraft.util.Direction;
// advantages: non-fixed-length vertex format, no overhead of packing and unpacking attributes to transform the model
// disadvantages: (possibly) larger memory footprint, overhead on packing the attributes at the final rendering stage
public class UnpackedBakedQuad extends BakedQuad
{
protected final float[][][] unpackedData;
protected final VertexFormat format;
protected boolean packed = false;
public UnpackedBakedQuad(float[][][] unpackedData, int tint, Direction orientation, TextureAtlasSprite texture, boolean applyDiffuseLighting, VertexFormat format)
{
super(new int[format.getSize() /* / 4 * 4 */], tint, orientation, texture, applyDiffuseLighting, format);
this.unpackedData = unpackedData;
this.format = format;
}
@Override
public int[] getVertexData()
{
if(!packed)
{
packed = true;
for(int v = 0; v < 4; v++)
{
for(int e = 0; e < format.func_227894_c_().size(); e++)
{
LightUtil.pack(unpackedData[v][e], vertexData, format, v, e);
}
}
}
return vertexData;
}
@Override
public void pipe(IVertexConsumer consumer)
{
int[] eMap = LightUtil.mapFormats(consumer.getVertexFormat(), format);
if(hasTintIndex())
{
consumer.setQuadTint(getTintIndex());
}
consumer.setTexture(sprite);
consumer.setApplyDiffuseLighting(applyDiffuseLighting);
consumer.setQuadOrientation(getFace());
for(int v = 0; v < 4; v++)
{
for(int e = 0; e < consumer.getVertexFormat().func_227894_c_().size(); e++)
{
if(eMap[e] != format.func_227894_c_().size())
{
consumer.put(e, unpackedData[v][eMap[e]]);
}
else
{
consumer.put(e);
}
}
}
}
public static class Builder implements IVertexConsumer
{
private final VertexFormat format;
private final float[][][] unpackedData;
private int tint = -1;
private Direction orientation;
private TextureAtlasSprite texture;
private boolean applyDiffuseLighting = true;
private int vertices = 0;
private int elements = 0;
private boolean full = false;
private boolean contractUVs = false;
public Builder(VertexFormat format)
{
this.format = format;
unpackedData = new float[4][format.func_227894_c_().size()][4];
}
@Override
public VertexFormat getVertexFormat()
{
return format;
}
public void setContractUVs(boolean value)
{
this.contractUVs = value;
}
@Override
public void setQuadTint(int tint)
{
this.tint = tint;
}
@Override
public void setQuadOrientation(Direction orientation)
{
this.orientation = orientation;
}
// FIXME: move (or at least add) into constructor
@Override
public void setTexture(TextureAtlasSprite texture)
{
this.texture = texture;
}
@Override
public void setApplyDiffuseLighting(boolean diffuse)
{
this.applyDiffuseLighting = diffuse;
}
@Override
public void put(int element, float... data)
{
for(int i = 0; i < 4; i++)
{
if(i < data.length)
{
unpackedData[vertices][element][i] = data[i];
}
else
{
unpackedData[vertices][element][i] = 0;
}
}
elements++;
if(elements == format.func_227894_c_().size())
{
vertices++;
elements = 0;
}
if(vertices == 4)
{
full = true;
}
}
private final float eps = 1f / 0x100;
public UnpackedBakedQuad build()
{
if(!full)
{
throw new IllegalStateException("not enough data");
}
if(texture == null)
{
throw new IllegalStateException("texture not set");
}
if(contractUVs)
{
float tX = texture.getWidth() / (texture.getMaxU() - texture.getMinU());
float tY = texture.getHeight() / (texture.getMaxV() - texture.getMinV());
float tS = tX > tY ? tX : tY;
float ep = 1f / (tS * 0x100);
int uve = 0;
ImmutableList<VertexFormatElement> elements = format.func_227894_c_();
while(uve < elements.size())
{
VertexFormatElement e = elements.get(uve);
if(e.getUsage() == VertexFormatElement.Usage.UV && e.getIndex() == 0)
{
break;
}
uve++;
}
if(uve == elements.size())
{
throw new IllegalStateException("Can't contract UVs: format doesn't contain UVs");
}
float[] uvc = new float[4];
for(int v = 0; v < 4; v++)
{
for(int i = 0; i < 4; i++)
{
uvc[i] += unpackedData[v][uve][i] / 4;
}
}
for(int v = 0; v < 4; v++)
{
for (int i = 0; i < 4; i++)
{
float uo = unpackedData[v][uve][i];
float un = uo * (1 - eps) + uvc[i] * eps;
float ud = uo - un;
float aud = ud;
if(aud < 0) aud = -aud;
if(aud < ep) // not moving a fraction of a pixel
{
float udc = uo - uvc[i];
if(udc < 0) udc = -udc;
if(udc < 2 * ep) // center is closer than 2 fractions of a pixel, don't move too close
{
un = (uo + uvc[i]) / 2;
}
else // move at least by a fraction
{
un = uo + (ud < 0 ? ep : -ep);
}
}
unpackedData[v][uve][i] = un;
}
}
}
return new UnpackedBakedQuad(unpackedData, tint, orientation, texture, applyDiffuseLighting, format);
}
}
}

View file

@ -14,7 +14,7 @@ net/minecraft/client/renderer/FluidBlockRenderer.func_228797_a_(Lcom/mojang/blaz
net/minecraft/client/renderer/FogRenderer.setupFog(Lnet/minecraft/client/renderer/ActiveRenderInfo;Lnet/minecraft/client/renderer/FogRenderer$FogType;FZF)V=|p_228372_0_,p_228372_1_,p_228372_2_,p_228372_3_,partialTicks
net/minecraft/client/renderer/model/BakedQuad.<init>([IILnet/minecraft/util/Direction;Lnet/minecraft/client/renderer/texture/TextureAtlasSprite;ZLnet/minecraft/client/renderer/vertex/VertexFormat;)V=|p_i46574_1_,p_i46574_2_,p_i46574_3_,p_i46574_4_,applyDiffuseLighting,format
net/minecraft/client/renderer/model/BakedQuad.<init>([IILnet/minecraft/util/Direction;Lnet/minecraft/client/renderer/texture/TextureAtlasSprite;Z)V=|p_i46574_1_,p_i46574_2_,p_i46574_3_,p_i46574_4_,applyDiffuseLighting
net/minecraft/client/renderer/model/ModelBakery.getBakedModel(Lnet/minecraft/util/ResourceLocation;Lnet/minecraft/client/renderer/texture/IModelTransform;Ljava/util/function/Function;Lnet/minecraft/client/renderer/vertex/VertexFormat;)Lnet/minecraft/client/renderer/model/IBakedModel;=|p_217845_1_,p_217845_2_,textureGetter,format

View file

@ -19,7 +19,13 @@
package net.minecraftforge.debug.client.model;
import java.util.List;
import java.util.Random;
import javax.annotation.Nullable;
import com.google.common.collect.ImmutableList;
import net.minecraft.block.Block;
import net.minecraft.block.BlockState;
import net.minecraft.block.material.Material;
@ -37,8 +43,11 @@ import net.minecraft.util.Direction;
import net.minecraft.util.ResourceLocation;
import net.minecraftforge.client.event.ModelBakeEvent;
import net.minecraftforge.client.model.QuadTransformer;
import net.minecraftforge.client.model.data.EmptyModelData;
import net.minecraftforge.client.model.data.IDynamicBakedModel;
import net.minecraftforge.client.model.data.IModelData;
import net.minecraftforge.client.model.pipeline.BakedQuadBuilder;
import net.minecraftforge.client.model.pipeline.TRSRTransformer;
import net.minecraftforge.client.model.pipeline.UnpackedBakedQuad;
import net.minecraftforge.common.MinecraftForge;
import net.minecraftforge.common.model.TransformationHelper;
import net.minecraftforge.event.RegistryEvent;
@ -47,10 +56,6 @@ import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
import net.minecraftforge.registries.ObjectHolder;
import javax.annotation.Nullable;
import java.util.List;
import java.util.Random;
@Mod(TRSRTransformerTest.MODID)
public class TRSRTransformerTest {
public static final String MODID = "trsr_transformer_test";
@ -71,7 +76,7 @@ public class TRSRTransformerTest {
}
}
public class MyBakedModel implements IBakedModel
public class MyBakedModel implements IDynamicBakedModel
{
private final IBakedModel base;
@ -80,7 +85,7 @@ public class TRSRTransformerTest {
}
@Override
public List<BakedQuad> getQuads(@Nullable BlockState state, @Nullable Direction side, Random rand) {
public List<BakedQuad> getQuads(@Nullable BlockState state, @Nullable Direction side, Random rand, IModelData data) {
ImmutableList.Builder<BakedQuad> quads = new ImmutableList.Builder<>();
Quaternion rot = TransformationHelper.quatFromXYZ(new Vector3f(0, 45, 0), true);
@ -88,11 +93,11 @@ public class TRSRTransformerTest {
TransformationMatrix trans = new TransformationMatrix(translation, rot, null, null).blockCenterToCorner();
for (BakedQuad quad : base.getQuads(state, side, rand)) {
for (BakedQuad quad : base.getQuads(state, side, rand, data)) {
if(true)
{
UnpackedBakedQuad.Builder builder = new UnpackedBakedQuad.Builder(quad.getFormat());
BakedQuadBuilder builder = new BakedQuadBuilder();
TRSRTransformer transformer = new TRSRTransformer(builder, trans);
@ -102,7 +107,7 @@ public class TRSRTransformerTest {
}
else
{
QuadTransformer qt = new QuadTransformer(quad.getFormat(), trans);
QuadTransformer qt = new QuadTransformer(trans);
quads.add(qt.processOne(quad));
}
}