Source file: /examples/texture/arrays.js

import { GUI } from 'dat.gui';
import Stats from "stats.js";
import {
  MeshMaterial3D,
  WebGLRenderer,
  TextureLoader,
  PerspectiveProjection,
  Camera,
  WebGLRenderDevice,
  PlaneMeshBuilder,
  MeshMaterialPlugin,
  Material,
  TextureType,
  Texture,
  basicVertex,
  Sampler,
  CanvasTarget,
  CameraPlugin
} from 'webgllis';

// Material to view the texture array
class TextureArrayMaterial extends Material {
  /**
   * @param {Texture} image
   */
  constructor(image){
    super()
    this.image = image
    this.layer  = 0
  }

  /**
   * @override
   */
  vertex(){
    return basicVertex
  }

  /**
   * @override
   */
  fragment(){
    return `
    precision mediump float;
    precision mediump sampler2DArray;

    in vec2 v_uv;

    uniform MaterialBlock {
      uint layer;
    };
    uniform sampler2DArray color_image;

    out vec4 fragment_color;

    void main(){
      vec4 sample_color = texture(color_image, vec3(v_uv, layer));
      fragment_color = vec4(sample_color.rgb, 1.0);
    }
    `
  }

  /**
   * @override
   */
  getData(){
    return new Uint32Array([this.layer]).buffer
  }

  /**
   * @override
   * @returns {[string, number, Texture | undefined, Sampler | undefined][]}
   */
  getTextures(){
    return [
      ['color_image',0,this.image, undefined]
    ]
  }
}
// performance monitor
const stats = new Stats()
stats.showPanel(1)
document.body.append(stats.dom)
stats.dom.removeAttribute('style')
stats.dom.classList.add('performance-monitor')

const canvas = document.createElement('canvas')
const renderTarget = new CanvasTarget(canvas)
const renderDevice = new WebGLRenderDevice(canvas,{
  depth:true
})
const renderer = new WebGLRenderer({
  plugins:[
    new MeshMaterialPlugin(),
    new CameraPlugin()
  ]
})
const camera = new Camera(renderTarget)
const textureLoader = new TextureLoader()
const texture = textureLoader.load({
  paths: [
    "/assets/images/skybox/miramar_right.png",
    "/assets/images/skybox/miramar_left.png",
    "/assets/images/skybox/miramar_top.png",
    "/assets/images/skybox/miramar_bottom.png",
    "/assets/images/skybox/miramar_back.png",
    "/assets/images/skybox/miramar_front.png",
  ],
  type:TextureType.Texture2DArray
})

const mesh = new PlaneMeshBuilder().build()
const material = new TextureArrayMaterial(texture)

const object1 = new MeshMaterial3D(mesh, material)

camera.transform.position.z = 2
if (camera.projection instanceof PerspectiveProjection) {
  camera.projection.fov = Math.PI / 180 * 120
}

document.body.append(canvas)
updateView()
addEventListener("resize", updateView)
requestAnimationFrame(update)

function update() {
  stats.begin()
  renderer.render([object1, camera], renderDevice)
  stats.end()

  requestAnimationFrame(update)
}

function updateView() {
  canvas.style.width = innerWidth + "px"
  canvas.style.height = innerHeight + "px"
  canvas.width = innerWidth * devicePixelRatio
  canvas.height = innerHeight * devicePixelRatio

  if (camera.projection instanceof PerspectiveProjection) {
    camera.projection.aspect = innerWidth / innerHeight
  }
}

// gui controls
const controls = new GUI()
const optFolder = controls.addFolder('Settings')

optFolder.add(material,'layer',0, 5, 1).name('Layer')
optFolder.open()