// Copyright (c) 2025, the Dart project authors.  Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.
//
// API docs from [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web).
// Attributions and copyright licensing by Mozilla Contributors is licensed
// under [CC-BY-SA 2.5](https://creativecommons.org/licenses/by-sa/2.5/.

// Generated from Web IDL definitions.

// ignore_for_file: unintended_html_in_doc_comment

@JS()
library;

import 'dart:js_interop';

import 'webgl1.dart';

/// The **`ANGLE_instanced_arrays`** extension is part of the
/// [WebGL API](https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API) and
/// allows to draw the same object, or groups of similar objects multiple times,
/// if they share the same vertex data, primitive count and type.
///
/// WebGL extensions are available using the
/// [WebGLRenderingContext.getExtension] method. For more information, see also
/// [Using Extensions](https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Using_Extensions)
/// in the
/// [WebGL tutorial](https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API/Tutorial).
///
/// > [!NOTE]
/// > This extension is only available to [WebGLRenderingContext] contexts. In
/// > [WebGL2RenderingContext], the functionality of this extension is available
/// > on the WebGL2 context by default and the constants and methods are
/// > available without the `ANGLE_` suffix.
/// >
/// > Despite the name "ANGLE", this extension works on any device if the
/// > hardware supports it and not just on Windows when using the ANGLE library.
/// > "ANGLE" just indicates that this extension has been written by the ANGLE
/// > library authors.
///
/// ---
///
/// API documentation sourced from
/// [MDN Web Docs](https://developer.mozilla.org/en-US/docs/Web/API/ANGLE_instanced_arrays).
extension type ANGLE_instanced_arrays._(JSObject _) implements JSObject {
  static const GLenum VERTEX_ATTRIB_ARRAY_DIVISOR_ANGLE = 35070;

  /// The **`ANGLE_instanced_arrays.drawArraysInstancedANGLE()`** method of the
  /// [WebGL API](https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API)
  /// renders primitives from array data like the
  /// [WebGLRenderingContext.drawArrays] method. In addition, it can execute
  /// multiple instances of the range of elements.
  ///
  /// > [!NOTE]
  /// > When using [WebGL2RenderingContext], this method is available as
  /// > [WebGL2RenderingContext.drawArraysInstanced] by default.
  external void drawArraysInstancedANGLE(
    GLenum mode,
    GLint first,
    GLsizei count,
    GLsizei primcount,
  );

  /// The **`ANGLE_instanced_arrays.drawElementsInstancedANGLE()`** method of
  /// the
  /// [WebGL API](https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API)
  /// renders primitives from array data like the
  /// [WebGLRenderingContext.drawElements] method. In addition, it can execute
  /// multiple instances of a set of elements.
  ///
  /// > [!NOTE]
  /// > When using [WebGL2RenderingContext], this method is available as
  /// > [WebGL2RenderingContext.drawElementsInstanced] by default.
  external void drawElementsInstancedANGLE(
    GLenum mode,
    GLsizei count,
    GLenum type,
    GLintptr offset,
    GLsizei primcount,
  );

  /// The **ANGLE_instanced_arrays.vertexAttribDivisorANGLE()** method of the
  /// [WebGL API](https://developer.mozilla.org/en-US/docs/Web/API/WebGL_API)
  /// modifies the rate at which generic vertex attributes advance when
  /// rendering multiple instances of primitives with
  /// [ANGLE_instanced_arrays.drawArraysInstancedANGLE] and
  /// [ANGLE_instanced_arrays.drawElementsInstancedANGLE].
  ///
  /// > [!NOTE]
  /// > When using [WebGL2RenderingContext], this method is available as
  /// > [WebGL2RenderingContext.vertexAttribDivisor] by default.
  external void vertexAttribDivisorANGLE(
    GLuint index,
    GLuint divisor,
  );
}
