package funkin.graphics.rendering;

import flixel.FlxStrip;
import flixel.util.FlxColor;

/**
 * Yoinked from AustinEast, thanks hopefully u dont mind me using some of ur good code
 * instead of my dumbass ugly code bro
 */
class MeshRender extends FlxStrip
{
  public var vertex_count(default, null):Int = 0;
  public var index_count(default, null):Int = 0;

  var tri_offset:Int = 0;

  public function new(x, y, ?col:FlxColor = FlxColor.WHITE)
  {
    super(x, y);
    makeGraphic(1, 1, col);
  }

  public inline function start()
  {
    tri_offset = vertex_count;
  }

  public inline function add_vertex(x:Float, y:Float, u:Float = 0, v:Float = 0)
  {
    final pos = vertex_count << 1;

    vertices[pos] = x;
    vertices[pos + 1] = y;

    uvtData[pos] = u;
    uvtData[pos + 1] = v;

    vertex_count++;
  }

  public function add_tri(a:Int, b:Int, c:Int)
  {
    indices[index_count] = a + tri_offset;
    indices[index_count + 1] = b + tri_offset;
    indices[index_count + 2] = c + tri_offset;

    index_count += 3;
  }

  /**
   *
   * top left - a
   *
   * top right - b
   *
   * bottom left  - c
   *
   * bottom right - d
   */
  public function add_quad(ax:Float, ay:Float, bx:Float, by:Float, cx:Float, cy:Float, dx:Float, dy:Float, au:Float = 0, av:Float = 0, bu:Float = 0,
      bv:Float = 0, cu:Float = 0, cv:Float = 0, du:Float = 0, dv:Float = 0)
  {
    start();
    // top left
    add_vertex(bx, by, bu, bv);
    // top right
    add_vertex(ax, ay, au, av);
    // bottom left
    add_vertex(cx, cy, cu, cv);
    // bottom right
    add_vertex(dx, dy, du, dv);

    add_tri(0, 1, 2);
    add_tri(0, 2, 3);
  }

  public function clear()
  {
    vertices.length = 0;
    indices.length = 0;
    vertex_count = 0;
    index_count = 0;
  }
}