List of usage examples for com.badlogic.gdx.utils FloatArray addAll
public void addAll(float[] array, int offset, int length)
From source file:com.esotericsoftware.spine.utils.SkeletonClipping.java
License:Open Source License
/** Clips the input triangle against the convex, clockwise clipping area. If the triangle lies entirely within the clipping * area, false is returned. The clipping area must duplicate the first vertex at the end of the vertices list. */ boolean clip(float x1, float y1, float x2, float y2, float x3, float y3, FloatArray clippingArea, FloatArray output) {/*from w w w. j a va2 s . co m*/ FloatArray originalOutput = output; boolean clipped = false; // Avoid copy at the end. FloatArray input = null; if (clippingArea.size % 4 >= 2) { input = output; output = scratch; } else input = scratch; input.clear(); input.add(x1); input.add(y1); input.add(x2); input.add(y2); input.add(x3); input.add(y3); input.add(x1); input.add(y1); output.clear(); float[] clippingVertices = clippingArea.items; int clippingVerticesLast = clippingArea.size - 4; for (int i = 0;; i += 2) { float edgeX = clippingVertices[i], edgeY = clippingVertices[i + 1]; float edgeX2 = clippingVertices[i + 2], edgeY2 = clippingVertices[i + 3]; float deltaX = edgeX - edgeX2, deltaY = edgeY - edgeY2; float[] inputVertices = input.items; int inputVerticesLength = input.size - 2, outputStart = output.size; for (int ii = 0; ii < inputVerticesLength; ii += 2) { float inputX = inputVertices[ii], inputY = inputVertices[ii + 1]; float inputX2 = inputVertices[ii + 2], inputY2 = inputVertices[ii + 3]; boolean side2 = deltaX * (inputY2 - edgeY2) - deltaY * (inputX2 - edgeX2) > 0; if (deltaX * (inputY - edgeY2) - deltaY * (inputX - edgeX2) > 0) { if (side2) { // v1 inside, v2 inside output.add(inputX2); output.add(inputY2); continue; } // v1 inside, v2 outside float c0 = inputY2 - inputY, c2 = inputX2 - inputX; float s = c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY); if (Math.abs(s) > 0.000001f) { float ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / s; output.add(edgeX + (edgeX2 - edgeX) * ua); output.add(edgeY + (edgeY2 - edgeY) * ua); } else { output.add(edgeX); output.add(edgeY); } } else if (side2) { // v1 outside, v2 inside float c0 = inputY2 - inputY, c2 = inputX2 - inputX; float s = c0 * (edgeX2 - edgeX) - c2 * (edgeY2 - edgeY); if (Math.abs(s) > 0.000001f) { float ua = (c2 * (edgeY - inputY) - c0 * (edgeX - inputX)) / s; output.add(edgeX + (edgeX2 - edgeX) * ua); output.add(edgeY + (edgeY2 - edgeY) * ua); } else { output.add(edgeX); output.add(edgeY); } output.add(inputX2); output.add(inputY2); } clipped = true; } if (outputStart == output.size) { // All edges outside. originalOutput.clear(); return true; } output.add(output.items[0]); output.add(output.items[1]); if (i == clippingVerticesLast) break; FloatArray temp = output; output = input; output.clear(); input = temp; } if (originalOutput != output) { originalOutput.clear(); originalOutput.addAll(output.items, 0, output.size - 2); } else originalOutput.setSize(originalOutput.size - 2); return clipped; }