Skip to content

Detached ArrayBuffer #2

Open
Open
@sudokit

Description

@sudokit

Converting Matrix4 to Float32Array via the builtin float32Array() method after a while results in:

error: Uncaught (in promise) TypeError: Cannot perform Construct on a detached ArrayBuffer
    return new Float32Array(this.#internal);
           ^
    at new Float32Array (<anonymous>)
    at Matrix4.toFloat32Array (https://deno.land/x/[email protected]/src/matrix4.ts:508:12)
    at Renderer.render (file:///C:/Users/user/Projects/weebeepeeuu/src/renderer.ts:223:28)
    at file:///C:/Users/user/Projects/weebeepeeuu/src/app.ts:72:21
    at fn (https://deno.land/x/[email protected]/src/platform/glfw/window.ts:1173:13)
    at Object.action (ext:deno_web/02_timers.js:154:11)
    at handleTimerMacrotask (ext:deno_web/02_timers.js:68:10)
    at eventLoopTick (ext:core/01_core.js:71:21)

part of the code that produces this:
(inside a render function which gets called every frame. not async)

    const projection = new PerspectiveFov(
      new Rad(Math.PI / 4),
      800 / 600,
      0.1,
      1000,
    )
      .toPerspective().toMatrix4();

    const view = Matrix4.lookAtRh(
      new Vector3(-2, 0, 2),
      new Vector3(0, 0, 0),
      new Vector3(0, 0, 1),
    );

    const model = Matrix4.fromAngleZ(new Rad(this.t));

    // lil hacky, but i know that the uniformbuffer is at index 0
    state.device.queue.writeBuffer(
      this.state.bBuffers[0].buffer,
      0,
      model.toFloat32Array(),
    ); // this doesnt. this gets updated with the value t, so i guess it has to have something to do with that
    state.device.queue.writeBuffer(
      this.state.bBuffers[0].buffer,
      64,
      view.toFloat32Array(),
    ); // for some foking reason this erros eventually with `TypeError: Cannot perform Construct on a detached ArrayBuffer`
    state.device.queue.writeBuffer(
      this.state.bBuffers[0].buffer,
      128,
      projection.toFloat32Array(),
    ); // this aswell

but as the comments say, the matrix which gets created every time with a different value (this.t) doesnt have this problem. not sure why.

EDIT: current fix is to call toFloat32Array() directly. like this:

const view = Matrix4.lookAtRh(
      new Vector3(-2, 0, 2),
      new Vector3(0, 0, 0),
      new Vector3(0, 0, 1),
    ).toFloat32Array();

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions