@Override public void write(Kryo kryo, Output output, BSpline bSpline) { Class<? extends Vector> vectorType = null; if (bSpline.controlPoints != null && bSpline.controlPoints.length > 0) vectorType = bSpline.controlPoints[0].getClass(); else if (bSpline.knots != null && bSpline.knots.size > 0) vectorType = ((Vector)bSpline.knots.first()).getClass(); kryo.writeClass(output, vectorType); output.writeInt(bSpline.controlPoints != null ? bSpline.controlPoints.length : -1); // -1 for null array if (bSpline.controlPoints != null){ for (int i = 0; i < bSpline.controlPoints.length; i++) { kryo.writeObjectOrNull(output, bSpline.controlPoints[i], vectorType); } } kryo.writeObjectOrNull(output, bSpline.knots, Array.class); output.writeInt(bSpline.degree, true); output.writeBoolean(bSpline.continuous); output.writeInt(bSpline.spanCount, true); }
@Override public BSpline read(Kryo kryo, Input input, Class<BSpline> type) { BSpline bSpline = new BSpline(); Class<? extends Vector> vectorType = kryo.readClass(input).getType(); int controlPointsLength = input.readInt(); if (controlPointsLength >= 0){ Vector<?>[] controlPoints = (Vector<?>[])java.lang.reflect.Array.newInstance(vectorType, controlPointsLength); for (int i = 0; i < controlPointsLength; i++) { controlPoints[i] = kryo.readObjectOrNull(input, vectorType); // vector type won't be null if control points had a length } bSpline.controlPoints = controlPoints; } bSpline.knots = kryo.readObjectOrNull(input, Array.class); bSpline.degree = input.readInt(true); bSpline.continuous = input.readBoolean(); bSpline.spanCount = input.readInt(true); return bSpline; }
@Override public CatmullRomSpline read(Kryo kryo, Input input, Class<CatmullRomSpline> type) { CatmullRomSpline catmullRomSpline = new CatmullRomSpline(); Class<? extends Vector> vectorType = kryo.readClass(input).getType(); int controlPointsLength = input.readInt(); if (controlPointsLength >= 0){ Vector<?>[] controlPoints = (Vector<?>[])java.lang.reflect.Array.newInstance(vectorType, controlPointsLength); for (int i = 0; i < controlPointsLength; i++) { controlPoints[i] = kryo.readObjectOrNull(input, vectorType); // vector type won't be null if control points had a length } catmullRomSpline.controlPoints = controlPoints; } catmullRomSpline.continuous = input.readBoolean(); catmullRomSpline.spanCount = input.readInt(true); return catmullRomSpline; }
private void calculatePrecisionPoints(T[] controlPoints, double maxDistance, Class<T> type) { List<Vector<T>> precisionPointsList = new ArrayList<Vector<T>>(); precisionPointsList.add(controlPoints[1 % spanCount]); for (int lastPoint = 1 % spanCount; lastPoint < spanCount + 1; lastPoint++) { int nextPoint = lastPoint + 1; final T previous = controlPoints[lastPoint]; final T next = controlPoints[nextPoint]; final float dstNext = previous.dst(next); if (dstNext > maxDistance) { int splitLineIntoNumberOfPoints = (int) (dstNext / maxDistance); for (int j = 0; j < splitLineIntoNumberOfPoints - 1; j++) { T precisionPoint = newVector(type); double distanceOnSpan = maxDistance + maxDistance * j; valueAt(precisionPoint, lastPoint - 1, (float) distanceOnSpan / dstNext); precisionPointsList.add(precisionPoint); } } precisionPointsList.add(next); } precisionPoints = (T[]) Array.newInstance(type, precisionPointsList.size()); precisionPoints = precisionPointsList.toArray(precisionPoints); precisionPointsCount = precisionPoints.length; }
@Override public void write(Kryo kryo, Output output, CatmullRomSpline catmullRomSpline) { Class<? extends Vector> vectorType = null; if (catmullRomSpline.controlPoints != null && catmullRomSpline.controlPoints.length > 0) vectorType = catmullRomSpline.controlPoints[0].getClass(); kryo.writeClass(output, vectorType); output.writeInt(catmullRomSpline.controlPoints != null ? catmullRomSpline.controlPoints.length : -1); // -1 for null array if (catmullRomSpline.controlPoints != null){ for (int i = 0; i < catmullRomSpline.controlPoints.length; i++) { kryo.writeObjectOrNull(output, catmullRomSpline.controlPoints[i], vectorType); } } output.writeBoolean(catmullRomSpline.continuous); output.writeInt(catmullRomSpline.spanCount, true); }