Example usage for com.google.common.io LittleEndianDataOutputStream writeFloat

List of usage examples for com.google.common.io LittleEndianDataOutputStream writeFloat

Introduction

In this page you can find the example usage for com.google.common.io LittleEndianDataOutputStream writeFloat.

Prototype

@Override
public void writeFloat(float v) throws IOException 

Source Link

Document

Writes a float as specified by DataOutputStream#writeFloat(float) , except using little-endian byte order.

Usage

From source file:org.bimserver.serializers.binarygeometry.Float3.java

public void writeTo(LittleEndianDataOutputStream dataOutputStream) throws IOException {
    dataOutputStream.writeFloat(x);
    dataOutputStream.writeFloat(y);//from  w w w . j  a  v a  2s.c  om
    dataOutputStream.writeFloat(z);
}

From source file:org.bimserver.serializers.binarygeometry.BinaryGeometryMessagingSerializer.java

@SuppressWarnings("unchecked")
private boolean writeData(OutputStream outputStream) throws IOException {
    IdEObject ifcProduct = iterator.next();
    LittleEndianDataOutputStream dataOutputStream = new LittleEndianDataOutputStream(outputStream);
    GeometryInfo geometryInfo = (GeometryInfo) ifcProduct
            .eGet(ifcProduct.eClass().getEStructuralFeature("geometry"));
    if (geometryInfo != null && geometryInfo.getTransformation() != null) {
        GeometryData geometryData = geometryInfo.getData();

        int totalNrIndices = geometryData.getIndices().length / 4;
        int maxIndexValues = 16389;

        Object reuse = concreteGeometrySent.get(geometryData.getOid());
        MessageType messageType = null;/*from   w w w. jav  a 2s.c  o m*/
        if (reuse == null) {
            if (totalNrIndices > maxIndexValues) {
                messageType = MessageType.GEOMETRY_TRIANGLES_PARTED;
            } else {
                messageType = MessageType.GEOMETRY_TRIANGLES;
            }
        } else {
            if (reuse instanceof List) {
                messageType = MessageType.GEOMETRY_INSTANCE_PARTED;
            } else {
                messageType = MessageType.GEOMETRY_INSTANCE;
            }
        }
        dataOutputStream.writeByte(messageType.getId());
        dataOutputStream.writeUTF(ifcProduct.eClass().getName());
        Long roid = model.getPidRoidMap().get(ifcProduct.getPid());
        dataOutputStream.writeLong(roid);
        dataOutputStream.writeLong(ifcProduct.getOid());

        // BEWARE, ByteOrder is always LITTLE_ENDIAN, because that's what GPU's seem to prefer, Java's ByteBuffer default is BIG_ENDIAN though!

        int skip = 4 - ((3 + ifcProduct.eClass().getName().getBytes(Charsets.UTF_8).length) % 4);
        if (skip != 0 && skip != 4) {
            dataOutputStream.write(new byte[skip]);
        }

        dataOutputStream.write(geometryInfo.getTransformation());

        if (reuse != null && reuse instanceof Long) {
            // Reused geometry, only send the id of the reused geometry data
            dataOutputStream.writeLong(geometryData.getOid());
        } else if (reuse != null && reuse instanceof List) {
            List<Long> list = (List<Long>) reuse;
            dataOutputStream.writeInt(list.size());
            for (long coreId : list) {
                dataOutputStream.writeLong(coreId);
            }
        } else {
            if (totalNrIndices > maxIndexValues) {
                // Split geometry, this algorithm - for now - just throws away all the reuse of vertices that might be there
                // Also, although usually the vertices buffers are too large, this algorithm is based on the indices, so we
                // probably are not cramming as much data as we can in each "part", but that's not really a problem I think

                int nrParts = (totalNrIndices + maxIndexValues - 1) / maxIndexValues;
                dataOutputStream.writeInt(nrParts);

                Bounds objectBounds = new Bounds(geometryInfo.getMinBounds(), geometryInfo.getMaxBounds());
                objectBounds.writeTo(dataOutputStream);

                ByteBuffer indicesBuffer = ByteBuffer.wrap(geometryData.getIndices());
                indicesBuffer.order(ByteOrder.LITTLE_ENDIAN);
                IntBuffer indicesIntBuffer = indicesBuffer.asIntBuffer();

                ByteBuffer vertexBuffer = ByteBuffer.wrap(geometryData.getVertices());
                vertexBuffer.order(ByteOrder.LITTLE_ENDIAN);
                FloatBuffer verticesFloatBuffer = vertexBuffer.asFloatBuffer();

                ByteBuffer normalsBuffer = ByteBuffer.wrap(geometryData.getNormals());
                normalsBuffer.order(ByteOrder.LITTLE_ENDIAN);
                FloatBuffer normalsFloatBuffer = normalsBuffer.asFloatBuffer();

                for (int part = 0; part < nrParts; part++) {
                    long splitId = splitCounter--;
                    dataOutputStream.writeLong(splitId);

                    int indexCounter = 0;
                    int upto = Math.min((part + 1) * maxIndexValues, totalNrIndices);
                    dataOutputStream.writeInt(upto - part * maxIndexValues);
                    for (int i = part * maxIndexValues; i < upto; i++) {
                        dataOutputStream.writeInt(indexCounter++);
                    }

                    dataOutputStream.writeInt((upto - part * maxIndexValues) * 3);
                    for (int i = part * maxIndexValues; i < upto; i += 3) {
                        int oldIndex1 = indicesIntBuffer.get(i);
                        int oldIndex2 = indicesIntBuffer.get(i + 1);
                        int oldIndex3 = indicesIntBuffer.get(i + 2);
                        dataOutputStream.writeFloat(verticesFloatBuffer.get(oldIndex1 * 3));
                        dataOutputStream.writeFloat(verticesFloatBuffer.get(oldIndex1 * 3 + 1));
                        dataOutputStream.writeFloat(verticesFloatBuffer.get(oldIndex1 * 3 + 2));
                        dataOutputStream.writeFloat(verticesFloatBuffer.get(oldIndex2 * 3));
                        dataOutputStream.writeFloat(verticesFloatBuffer.get(oldIndex2 * 3 + 1));
                        dataOutputStream.writeFloat(verticesFloatBuffer.get(oldIndex2 * 3 + 2));
                        dataOutputStream.writeFloat(verticesFloatBuffer.get(oldIndex3 * 3));
                        dataOutputStream.writeFloat(verticesFloatBuffer.get(oldIndex3 * 3 + 1));
                        dataOutputStream.writeFloat(verticesFloatBuffer.get(oldIndex3 * 3 + 2));
                    }
                    dataOutputStream.writeInt((upto - part * maxIndexValues) * 3);
                    for (int i = part * maxIndexValues; i < upto; i += 3) {
                        int oldIndex1 = indicesIntBuffer.get(i);
                        int oldIndex2 = indicesIntBuffer.get(i + 1);
                        int oldIndex3 = indicesIntBuffer.get(i + 2);

                        dataOutputStream.writeFloat(normalsFloatBuffer.get(oldIndex1 * 3));
                        dataOutputStream.writeFloat(normalsFloatBuffer.get(oldIndex1 * 3 + 1));
                        dataOutputStream.writeFloat(normalsFloatBuffer.get(oldIndex1 * 3 + 2));
                        dataOutputStream.writeFloat(normalsFloatBuffer.get(oldIndex2 * 3));
                        dataOutputStream.writeFloat(normalsFloatBuffer.get(oldIndex2 * 3 + 1));
                        dataOutputStream.writeFloat(normalsFloatBuffer.get(oldIndex2 * 3 + 2));
                        dataOutputStream.writeFloat(normalsFloatBuffer.get(oldIndex3 * 3));
                        dataOutputStream.writeFloat(normalsFloatBuffer.get(oldIndex3 * 3 + 1));
                        dataOutputStream.writeFloat(normalsFloatBuffer.get(oldIndex3 * 3 + 2));
                    }

                    dataOutputStream.writeInt(0);
                }
            } else {
                Bounds objectBounds = new Bounds(geometryInfo.getMinBounds(), geometryInfo.getMaxBounds());
                objectBounds.writeTo(dataOutputStream);

                dataOutputStream.writeLong(geometryData.getOid());

                ByteBuffer indicesBuffer = ByteBuffer.wrap(geometryData.getIndices());
                dataOutputStream.writeInt(indicesBuffer.capacity() / 4);
                dataOutputStream.write(indicesBuffer.array());

                ByteBuffer vertexByteBuffer = ByteBuffer.wrap(geometryData.getVertices());
                dataOutputStream.writeInt(vertexByteBuffer.capacity() / 4);
                dataOutputStream.write(vertexByteBuffer.array());

                ByteBuffer normalsBuffer = ByteBuffer.wrap(geometryData.getNormals());
                dataOutputStream.writeInt(normalsBuffer.capacity() / 4);
                dataOutputStream.write(normalsBuffer.array());

                // Only when materials are used we send them
                if (geometryData.getMaterials() != null) {
                    ByteBuffer materialsByteBuffer = ByteBuffer.wrap(geometryData.getMaterials());

                    dataOutputStream.writeInt(materialsByteBuffer.capacity() / 4);
                    dataOutputStream.write(materialsByteBuffer.array());
                } else {
                    // No materials used
                    dataOutputStream.writeInt(0);
                }
                List<Long> arrayList = new ArrayList<Long>();
                arrayList.add(geometryData.getOid());
                concreteGeometrySent.put(geometryData.getOid(), arrayList);
            }
        }
    }
    return iterator.hasNext();
}