List of usage examples for com.google.common.io LittleEndianDataOutputStream writeFloat
@Override public void writeFloat(float v) throws IOException
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(); }