Example usage for com.badlogic.gdx.utils FloatArray addAll

List of usage examples for com.badlogic.gdx.utils FloatArray addAll

Introduction

In this page you can find the example usage for com.badlogic.gdx.utils FloatArray addAll.

Prototype

public void addAll(float[] array, int offset, int length) 

Source Link

Usage

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;
}