Создание текстуры с Canvas2D

Если вам нужно создавать текстуры во время выполнения, чтобы динамически рисовать на них, вы можете воспользоваться CanvasRenderingContext2D, набором методов рисования 2D в браузерах для элемента <canvas>.

В Wonderland Engine создайте текстуру из canvas с помощью API TextureManager.create(): this.engine.textures.create(canvas).

Пример 

Ниже представлен пример с страницы MDN по CanvasRenderingContext2D, интегрированный в Wonderland Engine:

import {Component, Property} from '@wonderlandengine/api';

export class MyCanvasTexture extends Component {
    static TypeName = 'my-canvas-texture';
    static Properties = {
        /* Установите этот материал в редакторе. Текстура применяется ко
         * всем объектам, которые ее используют. */
        material: Property.material()
    };

    start() {
        const canvas = document.createElement('canvas');
        canvas.width = 300;
        canvas.height = 300;

        const ctx = canvas.getContext('2d');
        /* Здесь проводите свое 2D рисование (это пример из MDN) */

        // Заливка фона белым
        ctx.beginPath();
        ctx.fillStyle = '#fff';
        ctx.fillRect(0, 0, canvas.width, canvas.height);

        // Изменение цвета заливки на черный
        ctx.fillStyle = '#000';
        // Установка ширины линии
        ctx.lineWidth = 10;

        // Стена
        ctx.strokeRect(75, 140, 150, 110);

        // Дверь
        ctx.fillRect(130, 190, 40, 60);

        // Крыша
        ctx.beginPath();
        ctx.moveTo(50, 140);
        ctx.lineTo(150, 60);
        ctx.lineTo(250, 140);
        ctx.closePath();
        ctx.stroke();

        /* Создайте текстуру из canvas через TextureManager */
        this.canvasTexture = this.engine.textures.create(canvas);
        /* Примените текстуру к материалу (используйте сгенерированный сеттер) */
        this.material.setDiffuseTexture(this.canvasTexture);
    }
}

Обновление после изменений 

После внесения изменений в canvas после создания первоначальной текстуры, убедитесь, что обновили текстуру, чтобы отразить изменения.

Для приведенного выше примера, выполните:

this.canvasTexture.update();

Чтобы обновить только подрегион для улучшения производительности, используйте Texture.updateSubImage() вместо этого:

// Обновление региона размером 100x60 в месте назначения (0, 0) из источника (28, 4)
this.canvasTexture.updateSubImage(28, 4, 100, 60, 0, 0, canvas);