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!" ); } }
this.elementCount = format.getElementCount(); for( int i = 0; i < this.elementCount; i++ ) VertexFormatElement element = format.getElement( i ); switch( element.getUsage() ) break; case UV: if( element.getIndex() == 0 ) break; else if( element.getIndex() == 1 )
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; } }
@Override protected void processQuad() { VertexFormat format = this.parent.getVertexFormat(); int count = format.getElementCount(); for( int v = 0; v < 4; v++ ) { for( int e = 0; e < count; e++ ) { VertexFormatElement element = format.getElement( e ); if( element.getUsage() == VertexFormatElement.EnumUsage.POSITION ) { this.parent.put( e, this.transform( this.quadData[e][v] ) ); } else if( element.getUsage() == VertexFormatElement.EnumUsage.NORMAL ) { this.parent.put( e, this.transformNormal( this.quadData[e][v] ) ); } else { this.parent.put( e, this.quadData[e][v] ); } } } }
@Override protected void processQuad() { VertexFormat format = this.parent.getVertexFormat(); int count = format.getElementCount(); for( int v = 0; v < 4; v++ ) { for( int e = 0; e < count; e++ ) { VertexFormatElement element = format.getElement( e ); if( element.getUsage() == VertexFormatElement.EnumUsage.POSITION ) { this.parent.put( e, this.transform( this.quadData[e][v], element.getElementCount() ) ); } else if( element.getUsage() == VertexFormatElement.EnumUsage.NORMAL ) { this.parent.put( e, this.transformNormal( this.quadData[e][v] ) ); } else { this.parent.put( e, this.quadData[e][v] ); } } } }
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 ) normalType = element.getType();
@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; } } } };
private void drawVboOrList(net.minecraft.client.renderer.vertex.VertexBuffer vbo, int displayList) { if (OpenGlHelper.useVbo()) { vbo.bindBuffer(); GlStateManager.glEnableClientState(GL11.GL_VERTEX_ARRAY); GlStateManager.glVertexPointer(3, GL11.GL_FLOAT, 12, 0); vbo.drawArrays(GL11.GL_QUADS); vbo.unbindBuffer(); GlStateManager.glDisableClientState(GL11.GL_VERTEX_ARRAY); } else { GlStateManager.callList(displayList); } }
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; } }
/** * 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; }
/** * 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 ); }
@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);
@Override public void run() { vertBuffer.deleteGlBuffers(); }
private void putVertex( UnpackedBakedQuad.Builder builder, Vec3d normal, double x, double y, double z, TextureAtlasSprite sprite, float u, float v ) { for( int e = 0; e < this.vertexFormat.getElementCount(); e++ ) { switch( this.vertexFormat.getElement( e ).getUsage() ) { case POSITION: builder.put( e, (float) x, (float) y, (float) z, 1.0f ); break; case COLOR: builder.put( e, 1.0f, 1.0f, 1.0f, 1.0f ); break; case UV: if( this.vertexFormat.getElement( e ).getIndex() == 0 ) { u = sprite.getInterpolatedU( u ); v = sprite.getInterpolatedV( v ); builder.put( e, u, v, 0f, 1f ); break; } case NORMAL: builder.put( e, (float) normal.x, (float) normal.y, (float) normal.z, 0f ); break; default: builder.put( e ); break; } } }
private void nextVertexFormatIndex() { ++this.vertexFormatIndex; this.vertexFormatIndex %= this.vertexFormat.getElementCount(); this.vertexFormatElement = this.vertexFormat.getElement(this.vertexFormatIndex); if (this.vertexFormatElement.getUsage() == VertexFormatElement.EnumUsage.PADDING) { this.nextVertexFormatIndex(); } }
@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; } } } };
skyVBO.bindBuffer(); GlStateManager.glEnableClientState(32884); GlStateManager.glVertexPointer(3, 5126, 12, 0); skyVBO.drawArrays(7); skyVBO.unbindBuffer(); GlStateManager.glDisableClientState(32884);
@Override public void destroy() { if ( vertexbuffer != null ) { vertexbuffer.deleteGlBuffers(); vertexbuffer = null; } }
for( int i = 0; i < format.getElementCount(); i++ ) VertexFormatElement e = format.getElement( i ); switch( e.getUsage() ) break; case UV: if( e.getIndex() == 0 )
public void setVertexFormat( VertexFormat format ) { hasLightMap = false; int eCount = format.getElementCount(); for ( int x = 0; x < eCount; x++ ) { VertexFormatElement e = format.getElement( x ); if ( e.getUsage() == EnumUsage.UV && e.getIndex() == 1 && e.getType() == EnumType.SHORT ) { hasLightMap = true; } } this.format = format; }