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; }
@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] ); } } } }
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!" ); } }
@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] ); } } } }
final VertexFormatElement attr = vf.getElement(i); final int offset = vf.getOffset(i); final int count = attr.getElementCount(); final int constant = attr.getType().getGlConstant(); final int index = attr.getIndex(); final EnumUsage usage = attr.getUsage();
@Override public BufferBuilder pos(double x, double y, double z) { int i = this.vertexCount * this.vertexFormat.getNextOffset() + this.vertexFormat.getOffset(this.vertexFormatIndex); switch (this.vertexFormatElement.getType()) { case FLOAT: this.byteBuffer.putFloat(i, (float) (x + this.xOffset)); this.byteBuffer.putFloat(i + 4, (float) (y + this.yOffset)); this.byteBuffer.putFloat(i + 8, (float) (z + this.zOffset)); break; case UINT: case INT: this.byteBuffer.putInt(i, Float.floatToRawIntBits((float) (x + this.xOffset))); this.byteBuffer.putInt(i + 4, Float.floatToRawIntBits((float) (y + this.yOffset))); this.byteBuffer.putInt(i + 8, Float.floatToRawIntBits((float) (z + this.zOffset))); break; case USHORT: case SHORT: this.byteBuffer.putShort(i, (short) ((int) (x + this.xOffset))); this.byteBuffer.putShort(i + 2, (short) ((int) (y + this.yOffset))); this.byteBuffer.putShort(i + 4, (short) ((int) (z + this.zOffset))); break; case UBYTE: case BYTE: this.byteBuffer.put(i, (byte) ((int) (x + this.xOffset))); this.byteBuffer.put(i + 1, (byte) ((int) (y + this.yOffset))); this.byteBuffer.put(i + 2, (byte) ((int) (z + this.zOffset))); } this.nextVertexFormatIndex(); return this; }
@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; } } } };
@Override public BufferBuilder normal(float x, float y, float z) { int i = this.vertexCount * this.vertexFormat.getNextOffset() + this.vertexFormat.getOffset(this.vertexFormatIndex); switch (this.vertexFormatElement.getType()) { case FLOAT: this.byteBuffer.putFloat(i, x); this.byteBuffer.putFloat(i + 4, y); this.byteBuffer.putFloat(i + 8, z); break; case UINT: case INT: this.byteBuffer.putInt(i, (int) x); this.byteBuffer.putInt(i + 4, (int) y); this.byteBuffer.putInt(i + 8, (int) z); break; case USHORT: case SHORT: this.byteBuffer.putShort(i, (short) ((int) (x * 32767) & 65535)); this.byteBuffer.putShort(i + 2, (short) ((int) (y * 32767) & 65535)); this.byteBuffer.putShort(i + 4, (short) ((int) (z * 32767) & 65535)); break; case UBYTE: case BYTE: this.byteBuffer.put(i, (byte) ((int) (x * 127) & 255)); this.byteBuffer.put(i + 1, (byte) ((int) (y * 127) & 255)); this.byteBuffer.put(i + 2, (byte) ((int) (z * 127) & 255)); } this.nextVertexFormatIndex(); return this; }
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; } } }
@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; } } } };
@Override public void put( final int element, final float... data ) { final VertexFormatElement e = getVertexFormat().getElement( element ); if ( e.getUsage() == EnumUsage.UV && e.getIndex() == 1 && e.getType() == EnumType.SHORT && data.length >= 2 && hasLightMap ) { final int lvFromData_sky = (int) ( data[0] / maxLightmap ) & 0xf; final int lvFromData_block = (int) ( data[1] / maxLightmap ) & 0xf; lv = Math.max( lvFromData_sky, lv ); lv = Math.max( lvFromData_block, lv ); } }
@Override protected void processQuad() { VertexFormat format = 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) { parent.put(e, transform(quadData[e][v], element.getElementCount())); } else if (element.getUsage() == VertexFormatElement.EnumUsage.NORMAL) { parent.put(e, transformNormal(quadData[e][v])); } else { parent.put(e, quadData[e][v]); } } } }
@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; }
@Override public void put( final int element, final float... data ) { final VertexFormatElement e = getVertexFormat().getElement( element ); if ( e.getUsage() == EnumUsage.POSITION ) { if ( vertCount == 0 ) { minSumX = data[0]; minSumY = data[1]; minSumZ = data[2]; maxSumX = data[0]; maxSumY = data[1]; maxSumZ = data[2]; } else { minSumX = Math.min( data[0], minSumX ); minSumY = Math.min( data[1], minSumY ); minSumZ = Math.min( data[2], minSumZ ); maxSumX = Math.max( data[0], maxSumX ); maxSumY = Math.max( data[1], maxSumY ); maxSumZ = Math.max( data[2], maxSumZ ); } ++vertCount; } }
finalLengths[x] = format.getElement( x ).getElementCount(); indexLengths[x] = finalLengths[x]; switch ( format.getElement( x ).getUsage() )