/* * Can first format be used where second is expected */ public static boolean moreSpecific(VertexFormat first, VertexFormat second) { int size = first.getNextOffset(); if (size != second.getNextOffset()) return false; int padding = 0; int j = 0; for (VertexFormatElement firstAttr : (List<VertexFormatElement>) first.getElements()) { while (j < second.getElementCount() && second.getElement(j).getUsage() == EnumUsage.PADDING) { padding += second.getElement(j++).getSize(); } if (j >= second.getElementCount() && 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 = second.getElement(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 != second.getElementCount()) return false; return true; }
private float[] getFor(VertexFormatElement element) { EnumUsage usage = element.getUsage(); if (usage == EnumUsage.POSITION) { return position; } else if (usage == EnumUsage.NORMAL) { return normal; } else if (usage == EnumUsage.COLOR) { return colour; } else if (usage == EnumUsage.UV) { if (element.getIndex() == 0) { return uv; } else if (element.getIndex() == 1) { return light; } } // Otherwise... thats not good. String s = element.toString(); if (!failedStrings.contains(s)) { failedStrings.add(s); TrainCraft.trainCraftLog.warn("Element failed: " + s); } return new float[element.getElementCount()]; }
public void putIntoBakedQuadBuilder( UnpackedBakedQuad.Builder builder, TextureAtlasSprite sprite) { Vertex transformed = getTransformedVertex(); Tuple4f positionBuffer = new Vector4f(); transformed.getPosition(positionBuffer); Tuple3f normalBuffer = new Vector3f(); transformed.getNormal(normalBuffer); Tuple2f uvBuffer = new Vector2f(); transformed.getUV(uvBuffer); VertexFormat vertexFormat = builder.getVertexFormat(); int elementCount = vertexFormat.getElementCount(); for (int e = 0; e < elementCount; e++) { VertexFormatElement element = vertexFormat.getElement(e); switch (element.getUsage()) { case POSITION: builder.put(e, positionBuffer.x, positionBuffer.z, -positionBuffer.y, positionBuffer.w); break; case NORMAL: builder.put(e, normalBuffer.x, normalBuffer.z, -normalBuffer.y, 0); break; case UV: if (element.getIndex() != 0) break; builder.put( e, sprite.getInterpolatedU(uvBuffer.x * 16), sprite.getInterpolatedV(uvBuffer.y * 16), 0, 1); break; case COLOR: builder.put(e, 1, 1, 1, 1); break; default: builder.put(e); } } }