this.elementCount = format.getElementCount(); for( int i = 0; i < this.elementCount; i++ ) VertexFormatElement element = format.getElement( i ); switch( element.getUsage() )
int stride = format.getNextOffset() / 4; int normalIdx = format.getNormalOffset(); VertexFormatElement.EnumType normalType = null; for( int i = 0; i < format.getElements().size(); i++ ) VertexFormatElement element = format.getElement( i ); if( element.getUsage() == VertexFormatElement.EnumUsage.NORMAL )
public void addQuad( EnumFacing face, float x1, float y1, float z1, float x2, float y2, float z2 ) { // If brightness is forced to specific values, extend the vertex format to contain the multi-texturing lightmap // offset VertexFormat savedFormat = null; if( this.renderFullBright ) { savedFormat = this.format; this.format = new VertexFormat( savedFormat ); if( !this.format.getElements().contains( DefaultVertexFormats.TEX_2S ) ) { this.format.addElement( DefaultVertexFormats.TEX_2S ); } } this.putFace( face, x1, y1, z1, x2, y2, z2 ); // Restore old format if( savedFormat != null ) { this.format = savedFormat; } }
public static VertexFormat getFormatWithLightMap( VertexFormat format ) { // Do not use this when Optifine is present or if the vanilla lighting pipeline is used if( FMLClientHandler.instance().hasOptifine() || !ForgeModContainer.forgeLightPipelineEnabled ) { return format; } VertexFormat result; if( format == DefaultVertexFormats.BLOCK ) { result = DefaultVertexFormats.BLOCK; } else if( format == DefaultVertexFormats.ITEM ) { result = itemFormatWithLightMap; } else if( !format.hasUvOffset( 1 ) ) { result = new VertexFormat( format ); result.addElement( DefaultVertexFormats.TEX_2S ); } else { result = format; // Already has the needed UV, so keep it } return result; } }
@Override public void put(int element, float... data) { VertexFormatElement formatElement = DefaultVertexFormats.ITEM.getElement(element); switch(formatElement.getUsage()) { case POSITION: { float[] newData = new float[4]; Vector4f vec = new Vector4f(data); transform.getMatrix().transform(vec); vec.get(newData); parent.put(element, newData); break; } default: { parent.put(element, data); break; } } } };
Runnable cleanup = () -> {}; final int stride = vf.getNextOffset(); for (int i = vf.getElementCount() - 1; i >= 0; i--) { final VertexFormatElement attr = vf.getElement(i); final int offset = vf.getOffset(i); final int count = attr.getElementCount(); final int constant = attr.getType().getGlConstant();
@Override public void draw(VertexBuffer vertexBufferIn) { if (vertexBufferIn.getVertexCount() > 0) { GlStateManager.enableTexture2D(); OpenGlHelper.setActiveTexture(OpenGlHelper.defaultTexUnit); Minecraft.getMinecraft().getTextureManager().bindTexture(TextureMap.LOCATION_BLOCKS_TEXTURE); VertexFormat vertexformat = vertexBufferIn.getVertexFormat(); int i = vertexformat.getNextOffset(); ByteBuffer bytebuffer = vertexBufferIn.getByteBuffer(); List<VertexFormatElement> list = vertexformat.getElements(); for (int j = 0; j < list.size(); ++j) { bytebuffer.position(vertexformat.getOffset(j)); list.get(j).getUsage().preDraw(vertexformat, j, i, bytebuffer); } GlStateManager.glDrawArrays(vertexBufferIn.getDrawMode(), 0, vertexBufferIn.getVertexCount()); int i1 = 0; for (int j1 = list.size(); i1 < j1; ++i1) { list.get(i1).getUsage().postDraw(vertexformat, i1, i, bytebuffer); } } } }
@Override public void put( final int element, final 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 == getVertexFormat().getElementCount() ) { vertices++; elements = 0; } }
@Override public int[] getVertexData() { final int[] tmpData = new int[format.getNextOffset() /* / 4 * 4 */]; for ( int v = 0; v < 4; v++ ) { for ( int e = 0; e < format.getElementCount(); e++ ) { LightUtil.pack( getRawPart( v, e ), tmpData, format, v, e ); } } return tmpData; }
@Override public BufferBuilder tex(double u, double v) { int i = this.vertexCount * this.vertexFormat.getNextOffset() + this.vertexFormat.getOffset(this.vertexFormatIndex); switch (this.vertexFormatElement.getType()) { case FLOAT: this.byteBuffer.putFloat(i, (float) u); this.byteBuffer.putFloat(i + 4, (float) v); break; case UINT: case INT: this.byteBuffer.putInt(i, (int) u); this.byteBuffer.putInt(i + 4, (int) v); break; case USHORT: case SHORT: this.byteBuffer.putShort(i, (short) ((int) v)); this.byteBuffer.putShort(i + 2, (short) ((int) u)); break; case UBYTE: case BYTE: this.byteBuffer.put(i, (byte) ((int) v)); this.byteBuffer.put(i + 1, (byte) ((int) u)); } this.nextVertexFormatIndex(); return this; }
private int findPositionOffset( VertexFormat format ) { List<VertexFormatElement> elements = format.getElements(); for( int i = 0; i < elements.size(); i++ ) { VertexFormatElement e = elements.get( i ); if( e.isPositionElement() ) { if( e.getType() != VertexFormatElement.EnumType.FLOAT ) { throw new IllegalArgumentException( "Only floating point positions are supported" ); } return i; } } throw new IllegalArgumentException( "Vertex format " + format + " has no position attribute!" ); } }
/** * Bakes this Quad to a BakedQuad. * * @return The BakedQuad. */ public BakedQuad bake() { int[] packedData = new int[this.format.format.getNextOffset()]; for( int v = 0; v < 4; v++ ) { for( int e = 0; e < this.format.elementCount; e++ ) { LightUtil.pack( this.vertices[v].raw[e], packedData, this.format.format, v, e ); } } return new BakedQuad( packedData, this.tintIndex, this.orientation, this.sprite, this.diffuseLighting, this.format.format ); }
@Override public void addVertexData(int[] vertexData) { this.growBuffer(vertexData.length * 4 + this.vertexFormat.getNextOffset());//Forge, fix MC-122110 this.rawIntBuffer.position(this.getBufferSize()); this.rawIntBuffer.put(vertexData); this.vertexCount += vertexData.length / this.vertexFormat.getIntegerSize(); }
@Override public void putBrightness4(int p_178962_1_, int p_178962_2_, int p_178962_3_, int p_178962_4_) { int i = (this.vertexCount - 4) * this.vertexFormat.getIntegerSize() + this.vertexFormat.getUvOffsetById(1) / 4; int j = this.vertexFormat.getNextOffset() >> 2; this.rawIntBuffer.put(i, p_178962_1_); this.rawIntBuffer.put(i + j, p_178962_2_); this.rawIntBuffer.put(i + j * 2, p_178962_3_); this.rawIntBuffer.put(i + j * 3, p_178962_4_); }
@Override public void putNormal(float x, float y, float z) { int i = (byte) ((int) (x * 127.0F)) & 255; int j = (byte) ((int) (y * 127.0F)) & 255; int k = (byte) ((int) (z * 127.0F)) & 255; int l = i | j << 8 | k << 16; int i1 = this.vertexFormat.getNextOffset() >> 2; int j1 = (this.vertexCount - 4) * i1 + this.vertexFormat.getNormalOffset() / 4; this.rawIntBuffer.put(j1, l); this.rawIntBuffer.put(j1 + i1, l); this.rawIntBuffer.put(j1 + i1 * 2, l); this.rawIntBuffer.put(j1 + i1 * 3, l); }
@SideOnly(Side.CLIENT) public abstract class ParticleAttack extends Particle { public static final VertexFormat VERTEX_FORMAT = (new VertexFormat()).addElement(DefaultVertexFormats.POSITION_3F).addElement(DefaultVertexFormats.TEX_2F).addElement(DefaultVertexFormats.COLOR_4UB).addElement(DefaultVertexFormats.TEX_2S).addElement(DefaultVertexFormats.NORMAL_3B).addElement(DefaultVertexFormats.PADDING_1B);
/** * Gets the position into the vertex data buffer at which the given vertex's color data can be found, in {@code * int}s. */ @Override public int getColorIndex(int vertexIndex) { return ((this.vertexCount - vertexIndex) * this.vertexFormat.getNextOffset() + this.vertexFormat.getColorOffset()) / 4; }
@Override public void put(int element, float... data) { VertexFormatElement formatElement = DefaultVertexFormats.ITEM.getElement(element); switch(formatElement.getUsage()) { case POSITION: { float[] newData = new float[4]; Vector4f vec = new Vector4f(data); transform.getMatrix().transform(vec); vec.get(newData); parent.put(element, newData); break; } default: { parent.put(element, data); break; } } } };
int i = vertexformat.getNextOffset(); ByteBuffer bytebuffer = bufferBuilder.getByteBuffer(); List<VertexFormatElement> list = vertexformat.getElements(); bytebuffer.position(vertexformat.getOffset(j));
@Override public void begin() { if ( format != getVertexFormat() ) { throw new RuntimeException( "Bad format, can only be CNB." ); } unpackedData = new float[4][getVertexFormat().getElementCount()][4]; tint = -1; orientation = null; vertices = 0; elements = 0; }