CuboidMesh constructor

CuboidMesh({
  1. required Vector3 size,
  2. Material? material,
  3. bool useFaceNormals = true,
})

Represents a Cuboid's geometry with a single surface.

Implementation

CuboidMesh({
  required Vector3 size,
  Material? material,
  bool useFaceNormals = true,
}) {
  final Vector3(:x, :y, :z) = size / 2;

  Vertex vertex({
    required Vector3 position,
    required Vector2 texCoord,
    required Vector3 normal,
  }) {
    return Vertex(
      position: position,
      texCoord: texCoord,
      normal: useFaceNormals ? normal : null,
    );
  }

  final vertices = [
    // Face 1 (front)
    vertex(
      position: Vector3(-x, -y, -z),
      texCoord: Vector2(0, 0),
      normal: Vector3(0, 0, -1),
    ),
    vertex(
      position: Vector3(x, -y, -z),
      texCoord: Vector2(1, 0),
      normal: Vector3(0, 0, -1),
    ),
    vertex(
      position: Vector3(x, y, -z),
      texCoord: Vector2(1, 1),
      normal: Vector3(0, 0, -1),
    ),
    vertex(
      position: Vector3(-x, y, -z),
      texCoord: Vector2(0, 1),
      normal: Vector3(0, 0, -1),
    ),

    // Face 2 (back)
    vertex(
      position: Vector3(-x, -y, z),
      texCoord: Vector2(0, 0),
      normal: Vector3(0, 0, 1),
    ),
    vertex(
      position: Vector3(x, -y, z),
      texCoord: Vector2(1, 0),
      normal: Vector3(0, 0, 1),
    ),
    vertex(
      position: Vector3(x, y, z),
      texCoord: Vector2(1, 1),
      normal: Vector3(0, 0, 1),
    ),
    vertex(
      position: Vector3(-x, y, z),
      texCoord: Vector2(0, 1),
      normal: Vector3(0, 0, 1),
    ),

    // Face 3 (left)
    vertex(
      position: Vector3(-x, -y, z),
      texCoord: Vector2(0, 0),
      normal: Vector3(-1, 0, 0),
    ),
    vertex(
      position: Vector3(-x, -y, -z),
      texCoord: Vector2(1, 0),
      normal: Vector3(-1, 0, 0),
    ),
    vertex(
      position: Vector3(-x, y, -z),
      texCoord: Vector2(1, 1),
      normal: Vector3(-1, 0, 0),
    ),
    vertex(
      position: Vector3(-x, y, z),
      texCoord: Vector2(0, 1),
      normal: Vector3(-1, 0, 0),
    ),

    // Face 4 (right)
    vertex(
      position: Vector3(x, -y, -z),
      texCoord: Vector2(0, 0),
      normal: Vector3(1, 0, 0),
    ),
    vertex(
      position: Vector3(x, -y, z),
      texCoord: Vector2(1, 0),
      normal: Vector3(1, 0, 0),
    ),
    vertex(
      position: Vector3(x, y, z),
      texCoord: Vector2(1, 1),
      normal: Vector3(1, 0, 0),
    ),
    vertex(
      position: Vector3(x, y, -z),
      texCoord: Vector2(0, 1),
      normal: Vector3(1, 0, 0),
    ),

    // Face 5 (top)
    vertex(
      position: Vector3(-x, y, -z),
      texCoord: Vector2(0, 0),
      normal: Vector3(0, 1, 0),
    ),
    vertex(
      position: Vector3(x, y, -z),
      texCoord: Vector2(1, 0),
      normal: Vector3(0, 1, 0),
    ),
    vertex(
      position: Vector3(x, y, z),
      texCoord: Vector2(1, 1),
      normal: Vector3(0, 1, 0),
    ),
    vertex(
      position: Vector3(-x, y, z),
      texCoord: Vector2(0, 1),
      normal: Vector3(0, 1, 0),
    ),

    // Face 6 (bottom)
    vertex(
      position: Vector3(-x, -y, z),
      texCoord: Vector2(0, 0),
      normal: Vector3(0, -1, 0),
    ),
    vertex(
      position: Vector3(x, -y, z),
      texCoord: Vector2(1, 0),
      normal: Vector3(0, -1, 0),
    ),
    vertex(
      position: Vector3(x, -y, -z),
      texCoord: Vector2(1, 1),
      normal: Vector3(0, -1, 0),
    ),
    vertex(
      position: Vector3(-x, -y, -z),
      texCoord: Vector2(0, 1),
      normal: Vector3(0, -1, 0),
    ),
  ];

  final indices = [
    0, 1, 2, 2, 3, 0, // Face 1
    4, 5, 6, 6, 7, 4, // Face 2
    8, 9, 10, 10, 11, 8, // Face 3
    12, 13, 14, 14, 15, 12, // Face 4
    16, 17, 18, 18, 19, 16, // Face 5
    20, 21, 22, 22, 23, 20, // Face 6
  ];

  addSurface(
    Surface(
      vertices: vertices,
      indices: indices,
      material: material,
    ),
  );
}