From 2c9c21f64201e95f6fdf329c42b8e8b22f525c5c Mon Sep 17 00:00:00 2001 From: Mark Mooibroek Date: Thu, 23 Feb 2023 09:55:00 +0100 Subject: [PATCH] dispose native arrays --- lib/three3d/core/buffer_geometry.dart | 24 +++++++++++-- lib/three3d/geometries/box_geometry.dart | 19 +++++++++-- lib/three3d/geometries/circle_geometry.dart | 19 +++++++++-- lib/three3d/geometries/convex_geometry.dart | 14 ++++++-- lib/three3d/geometries/cylinder_geometry.dart | 18 ++++++++-- lib/three3d/geometries/edges_geometry.dart | 10 +++++- lib/three3d/geometries/extrude_geometry.dart | 17 ++++++++-- lib/three3d/geometries/lathe_geometry.dart | 19 +++++++++-- .../geometries/parametric_geometry.dart | 19 +++++++++-- lib/three3d/geometries/plane_geometry.dart | 18 ++++++++-- .../geometries/polyhedron_geometry.dart | 22 +++++++++--- lib/three3d/geometries/ring_geometry.dart | 19 +++++++++-- lib/three3d/geometries/shape_geometry.dart | 19 ++++++++--- lib/three3d/geometries/sphere_geometry.dart | 18 ++++++++-- lib/three3d/geometries/torus_geometry.dart | 18 ++++++++-- .../geometries/torus_knot_geometry.dart | 18 ++++++++-- lib/three3d/geometries/tube_geometry.dart | 18 ++++++++-- .../geometries/wireframe_geometry.dart | 10 +++++- lib/three3d/helpers/arrow_helper.dart | 15 +++++++- lib/three3d/helpers/axes_helper.dart | 2 +- lib/three3d/math/matrix3.dart | 4 +++ lib/three3d/math/matrix4.dart | 4 +++ pubspec.lock | 34 +++++++++++++++---- pubspec.yaml | 9 +++-- 24 files changed, 326 insertions(+), 61 deletions(-) diff --git a/lib/three3d/core/buffer_geometry.dart b/lib/three3d/core/buffer_geometry.dart index 9f5a9be5..a3ed5edf 100644 --- a/lib/three3d/core/buffer_geometry.dart +++ b/lib/three3d/core/buffer_geometry.dart @@ -57,6 +57,8 @@ class BufferGeometry with EventDispatcher { int? maxInstanceCount; int? instanceCount; + Float32Array? array; + BufferGeometry(); BufferGeometry.fromJSON(Map json, Map rootJSON) { @@ -268,8 +270,9 @@ class BufferGeometry with EventDispatcher { } } - final array = Float32Array.from(position); - setAttribute('position', Float32BufferAttribute(array, 3, false)); + array?.dispose(); + array = Float32Array.from(position); + setAttribute('position', Float32BufferAttribute(array!, 3, false)); return this; } @@ -947,6 +950,23 @@ class BufferGeometry with EventDispatcher { print(" BufferGeometry dispose ........... "); dispatchEvent(Event({"type": "dispose"})); + + if (attributes["color"] is BufferAttribute) { + (attributes["color"] as BufferAttribute).array.dispose(); + } + if (attributes["position"] is BufferAttribute) { + (attributes["position"] as BufferAttribute).array.dispose(); + } + + if (attributes["normal"] is BufferAttribute) { + (attributes["normal"] as BufferAttribute).array.dispose(); + } + if (attributes["uv"] is BufferAttribute) { + (attributes["uv"] as BufferAttribute).array.dispose(); + } + + index?.array.dispose(); + array?.dispose(); } } diff --git a/lib/three3d/geometries/box_geometry.dart b/lib/three3d/geometries/box_geometry.dart index 1e6b4a1f..f61a113f 100644 --- a/lib/three3d/geometries/box_geometry.dart +++ b/lib/three3d/geometries/box_geometry.dart @@ -6,6 +6,10 @@ class BoxGeometry extends BufferGeometry { late int groupStart; late int numberOfVertices; + NativeArray? positionsArray; + NativeArray? normalsArray; + NativeArray? uvsArray; + BoxGeometry([ width = 1, height = 1, @@ -170,9 +174,9 @@ class BoxGeometry extends BufferGeometry { // build geometry setIndex(indices); - setAttribute('position', Float32BufferAttribute(Float32Array.from(vertices), 3, false)); - setAttribute('normal', Float32BufferAttribute(Float32Array.from(normals), 3, false)); - setAttribute('uv', Float32BufferAttribute(Float32Array.from(uvs), 2, false)); + setAttribute('position', Float32BufferAttribute(positionsArray = Float32Array.from(vertices), 3, false)); + setAttribute('normal', Float32BufferAttribute(normalsArray = Float32Array.from(normals), 3, false)); + setAttribute('uv', Float32BufferAttribute(uvsArray = Float32Array.from(uvs), 2, false)); } static fromJSON(data) { @@ -185,4 +189,13 @@ class BoxGeometry extends BufferGeometry { data["depthSegments"], ); } + + @override + void dispose() { + positionsArray?.dispose(); + normalsArray?.dispose(); + uvsArray?.dispose(); + + super.dispose(); + } } diff --git a/lib/three3d/geometries/circle_geometry.dart b/lib/three3d/geometries/circle_geometry.dart index f318c02e..196fd912 100644 --- a/lib/three3d/geometries/circle_geometry.dart +++ b/lib/three3d/geometries/circle_geometry.dart @@ -3,6 +3,10 @@ import 'package:three_dart/three3d/core/index.dart'; import 'package:three_dart/three3d/math/index.dart'; class CircleGeometry extends BufferGeometry { + NativeArray? positionsArray; + NativeArray? normalsArray; + NativeArray? uvsArray; + CircleGeometry({radius = 1, segments = 8, thetaStart = 0, thetaLength = Math.pi * 2}) : super() { type = 'CircleGeometry'; @@ -59,8 +63,17 @@ class CircleGeometry extends BufferGeometry { // build geometry setIndex(indices); - setAttribute('position', Float32BufferAttribute(Float32Array.from(vertices), 3, false)); - setAttribute('normal', Float32BufferAttribute(Float32Array.from(normals), 3, false)); - setAttribute('uv', Float32BufferAttribute(Float32Array.from(uvs), 2, false)); + setAttribute('position', Float32BufferAttribute(positionsArray = Float32Array.from(vertices), 3, false)); + setAttribute('normal', Float32BufferAttribute(normalsArray = Float32Array.from(normals), 3, false)); + setAttribute('uv', Float32BufferAttribute(uvsArray = Float32Array.from(uvs), 2, false)); + } + + @override + void dispose() { + positionsArray?.dispose(); + normalsArray?.dispose(); + uvsArray?.dispose(); + + super.dispose(); } } diff --git a/lib/three3d/geometries/convex_geometry.dart b/lib/three3d/geometries/convex_geometry.dart index 0487e03c..783398e3 100644 --- a/lib/three3d/geometries/convex_geometry.dart +++ b/lib/three3d/geometries/convex_geometry.dart @@ -3,6 +3,9 @@ import 'package:three_dart/three3d/core/index.dart'; import 'package:three_dart/three3d/math/index.dart'; class ConvexGeometry extends BufferGeometry { + NativeArray? verticesArray; + NativeArray? normalsArray; + ConvexGeometry(points) : super() { List vertices = []; List normals = []; @@ -32,8 +35,15 @@ class ConvexGeometry extends BufferGeometry { } // build geometry + setAttribute('position', Float32BufferAttribute(verticesArray = Float32Array.from(vertices), 3, false)); + setAttribute('normal', Float32BufferAttribute(normalsArray = Float32Array.from(normals), 3, false)); + } + + @override + void dispose() { + verticesArray?.dispose(); + normalsArray?.dispose(); - setAttribute('position', Float32BufferAttribute(Float32Array.from(vertices), 3, false)); - setAttribute('normal', Float32BufferAttribute(Float32Array.from(normals), 3, false)); + super.dispose(); } } diff --git a/lib/three3d/geometries/cylinder_geometry.dart b/lib/three3d/geometries/cylinder_geometry.dart index 7859ea56..54426257 100644 --- a/lib/three3d/geometries/cylinder_geometry.dart +++ b/lib/three3d/geometries/cylinder_geometry.dart @@ -3,6 +3,10 @@ import 'package:three_dart/three3d/core/index.dart'; import 'package:three_dart/three3d/math/index.dart'; class CylinderGeometry extends BufferGeometry { + NativeArray? verticesArray; + NativeArray? normalsArray; + NativeArray? uvsArray; + CylinderGeometry([ radiusTop = 1, radiusBottom = 1, @@ -237,9 +241,9 @@ class CylinderGeometry extends BufferGeometry { // build geometry setIndex(indices); - setAttribute('position', Float32BufferAttribute(Float32Array.from(vertices), 3, false)); - setAttribute('normal', Float32BufferAttribute(Float32Array.from(normals), 3, false)); - setAttribute('uv', Float32BufferAttribute(Float32Array.from(uvs), 2, false)); + setAttribute('position', Float32BufferAttribute(verticesArray = Float32Array.from(vertices), 3, false)); + setAttribute('normal', Float32BufferAttribute(normalsArray = Float32Array.from(normals), 3, false)); + setAttribute('uv', Float32BufferAttribute(uvsArray = Float32Array.from(uvs), 2, false)); } static CylinderGeometry fromJSON(data) { @@ -254,4 +258,12 @@ class CylinderGeometry extends BufferGeometry { data["thetaLength"], ); } + + @override + void dispose() { + verticesArray?.dispose(); + normalsArray?.dispose(); + uvsArray?.dispose(); + super.dispose(); + } } diff --git a/lib/three3d/geometries/edges_geometry.dart b/lib/three3d/geometries/edges_geometry.dart index 8ff59ba6..a47fe6da 100644 --- a/lib/three3d/geometries/edges_geometry.dart +++ b/lib/three3d/geometries/edges_geometry.dart @@ -8,6 +8,8 @@ class EdgesGeometry extends BufferGeometry { final _normal = Vector3.init(); final _triangle = Triangle.init(); + NativeArray? verticesArray; + EdgesGeometry(BufferGeometry geometry, thresholdAngle) : super() { type = "EdgesGeometry"; parameters = {"thresholdAngle": thresholdAngle}; @@ -102,6 +104,12 @@ class EdgesGeometry extends BufferGeometry { } } - setAttribute('position', Float32BufferAttribute(Float32Array.from(vertices), 3, false)); + setAttribute('position', Float32BufferAttribute(verticesArray = Float32Array.from(vertices), 3, false)); + } + + @override + void dispose() { + verticesArray?.dispose(); + super.dispose(); } } diff --git a/lib/three3d/geometries/extrude_geometry.dart b/lib/three3d/geometries/extrude_geometry.dart index 9b7896ce..446e5da3 100644 --- a/lib/three3d/geometries/extrude_geometry.dart +++ b/lib/three3d/geometries/extrude_geometry.dart @@ -529,9 +529,12 @@ class ExtrudeGeometry extends BufferGeometry { } // build geometry + final nativeVertices = Float32Array.from(verticesArray); + final nativeUv = Float32Array.from(uvArray); + arrays.addAll([nativeVertices, nativeUv]); - setAttribute('position', Float32BufferAttribute(Float32Array.from(verticesArray), 3, false)); - setAttribute('uv', Float32BufferAttribute(Float32Array.from(uvArray), 2, false)); + setAttribute('position', Float32BufferAttribute(nativeVertices, 3, false)); + setAttribute('uv', Float32BufferAttribute(nativeUv, 2, false)); computeVertexNormals(); @@ -549,6 +552,16 @@ class ExtrudeGeometry extends BufferGeometry { return toJSON2(shapes, options, data); } + + final arrays = []; + + @override + void dispose() { + for (var element in arrays) { + element.dispose(); + } + super.dispose(); + } } class WorldUVGenerator { diff --git a/lib/three3d/geometries/lathe_geometry.dart b/lib/three3d/geometries/lathe_geometry.dart index 9d93ad9d..fe0d9a49 100644 --- a/lib/three3d/geometries/lathe_geometry.dart +++ b/lib/three3d/geometries/lathe_geometry.dart @@ -3,6 +3,10 @@ import 'package:three_dart/three3d/core/index.dart'; import 'package:three_dart/three3d/math/index.dart'; class LatheGeometry extends BufferGeometry { + NativeArray? verticesArray; + NativeArray? uvsArray; + NativeArray? normalsArray; + LatheGeometry( points, { segments = 12, @@ -142,8 +146,17 @@ class LatheGeometry extends BufferGeometry { // build geometry setIndex(indices); - setAttribute('position', Float32BufferAttribute(Float32Array.from(vertices), 3, false)); - setAttribute('uv', Float32BufferAttribute(Float32Array.from(uvs), 2, false)); - setAttribute('normal', Float32BufferAttribute(Float32Array.from(normals), 3, false)); + setAttribute('position', Float32BufferAttribute(verticesArray = Float32Array.from(vertices), 3, false)); + setAttribute('normal', Float32BufferAttribute(normalsArray = Float32Array.from(normals), 3, false)); + setAttribute('uv', Float32BufferAttribute(uvsArray = Float32Array.from(uvs), 2, false)); + } + + @override + void dispose() { + verticesArray?.dispose(); + uvsArray?.dispose(); + normalsArray?.dispose(); + + super.dispose(); } } diff --git a/lib/three3d/geometries/parametric_geometry.dart b/lib/three3d/geometries/parametric_geometry.dart index 35ec956d..9de0eef7 100644 --- a/lib/three3d/geometries/parametric_geometry.dart +++ b/lib/three3d/geometries/parametric_geometry.dart @@ -3,6 +3,10 @@ import 'package:three_dart/three3d/core/index.dart'; import 'package:three_dart/three3d/math/index.dart'; class ParametricGeometry extends BufferGeometry { + NativeArray? verticesArray; + NativeArray? uvsArray; + NativeArray? normalsArray; + ParametricGeometry(func, slices, stacks) : super() { type = "ParametricGeometry"; parameters = {"func": func, "slices": slices, "stacks": stacks}; @@ -91,8 +95,17 @@ class ParametricGeometry extends BufferGeometry { // build geometry setIndex(indices); - setAttribute('position', Float32BufferAttribute(Float32Array.from(vertices), 3)); - setAttribute('normal', Float32BufferAttribute(Float32Array.from(normals), 3)); - setAttribute('uv', Float32BufferAttribute(Float32Array.from(uvs), 2)); + setAttribute('position', Float32BufferAttribute(verticesArray = Float32Array.from(vertices), 3)); + setAttribute('normal', Float32BufferAttribute(normalsArray = Float32Array.from(normals), 3)); + setAttribute('uv', Float32BufferAttribute(uvsArray = Float32Array.from(uvs), 2)); + } + + @override + void dispose() { + verticesArray?.dispose(); + uvsArray?.dispose(); + normalsArray?.dispose(); + + super.dispose(); } } diff --git a/lib/three3d/geometries/plane_geometry.dart b/lib/three3d/geometries/plane_geometry.dart index 578491ee..a680d92b 100644 --- a/lib/three3d/geometries/plane_geometry.dart +++ b/lib/three3d/geometries/plane_geometry.dart @@ -3,6 +3,10 @@ import 'package:three_dart/three3d/core/index.dart'; import 'package:three_dart/three3d/math/index.dart'; class PlaneGeometry extends BufferGeometry { + NativeArray? verticesArray; + NativeArray? normalsArray; + NativeArray? uvsArray; + PlaneGeometry([num width = 1, num height = 1, num widthSegments = 1, num heightSegments = 1]) : super() { type = 'PlaneGeometry'; @@ -55,12 +59,20 @@ class PlaneGeometry extends BufferGeometry { } setIndex(indices); - setAttribute('position', Float32BufferAttribute(Float32Array.from(vertices), 3, false)); - setAttribute('normal', Float32BufferAttribute(Float32Array.from(normals), 3, false)); - setAttribute('uv', Float32BufferAttribute(Float32Array.from(uvs), 2, false)); + setAttribute('position', Float32BufferAttribute(verticesArray = Float32Array.from(vertices), 3, false)); + setAttribute('normal', Float32BufferAttribute(normalsArray = Float32Array.from(normals), 3, false)); + setAttribute('uv', Float32BufferAttribute(uvsArray = Float32Array.from(uvs), 2, false)); } static fromJSON(data) { return PlaneGeometry(data["width"], data["height"], data["widthSegments"], data["heightSegments"]); } + + @override + void dispose() { + verticesArray?.dispose(); + normalsArray?.dispose(); + uvsArray?.dispose(); + super.dispose(); + } } diff --git a/lib/three3d/geometries/polyhedron_geometry.dart b/lib/three3d/geometries/polyhedron_geometry.dart index 12b12209..4a87c719 100644 --- a/lib/three3d/geometries/polyhedron_geometry.dart +++ b/lib/three3d/geometries/polyhedron_geometry.dart @@ -4,6 +4,10 @@ import 'package:three_dart/three3d/dart_helpers.dart'; import 'package:three_dart/three3d/math/index.dart'; class PolyhedronGeometry extends BufferGeometry { + NativeArray? verticesArray; + NativeArray? normalsArray; + NativeArray? uvsArray; + PolyhedronGeometry(vertices, indices, [radius = 1, detail = 0]) : super() { type = "PolyhedronGeometry"; // default buffer data @@ -217,16 +221,24 @@ class PolyhedronGeometry extends BufferGeometry { // build non-indexed geometry - setAttribute('position', Float32BufferAttribute(Float32Array.from(vertexBuffer), 3, false)); - setAttribute('normal', Float32BufferAttribute(Float32Array.from(slice(vertexBuffer, 0)), 3, false)); - setAttribute('uv', Float32BufferAttribute(Float32Array.from(uvBuffer), 2, false)); + setAttribute('position', Float32BufferAttribute(verticesArray = Float32Array.from(vertexBuffer), 3, false)); + setAttribute( + 'normal', Float32BufferAttribute(normalsArray = Float32Array.from(slice(vertexBuffer, 0)), 3, false)); + setAttribute('uv', Float32BufferAttribute(uvsArray = Float32Array.from(uvBuffer), 2, false)); if (detail == 0) { computeVertexNormals(); // flat normals - } else { normalizeNormals(); // smooth normals - } } + + @override + void dispose() { + verticesArray?.dispose(); + normalsArray?.dispose(); + uvsArray?.dispose(); + + super.dispose(); + } } diff --git a/lib/three3d/geometries/ring_geometry.dart b/lib/three3d/geometries/ring_geometry.dart index 7b4acf7f..36e29dfe 100644 --- a/lib/three3d/geometries/ring_geometry.dart +++ b/lib/three3d/geometries/ring_geometry.dart @@ -3,6 +3,10 @@ import 'package:three_dart/three3d/core/index.dart'; import 'package:three_dart/three3d/math/index.dart'; class RingGeometry extends BufferGeometry { + NativeArray? verticesArray; + NativeArray? normalsArray; + NativeArray? uvsArray; + RingGeometry([ innerRadius = 0.5, outerRadius = 1, @@ -93,13 +97,22 @@ class RingGeometry extends BufferGeometry { // build geometry setIndex(indices); - setAttribute('position', Float32BufferAttribute(Float32Array.from(vertices), 3)); - setAttribute('normal', Float32BufferAttribute(Float32Array.from(normals), 3)); - setAttribute('uv', Float32BufferAttribute(Float32Array.from(uvs), 2)); + setAttribute('position', Float32BufferAttribute(verticesArray = Float32Array.from(vertices), 3)); + setAttribute('normal', Float32BufferAttribute(normalsArray = Float32Array.from(normals), 3)); + setAttribute('uv', Float32BufferAttribute(uvsArray = Float32Array.from(uvs), 2)); } static fromJSON(data) { return RingGeometry( data.innerRadius, data.outerRadius, data.thetaSegments, data.phiSegments, data.thetaStart, data.thetaLength); } + + @override + void dispose() { + verticesArray?.dispose(); + normalsArray?.dispose(); + uvsArray?.dispose(); + + super.dispose(); + } } diff --git a/lib/three3d/geometries/shape_geometry.dart b/lib/three3d/geometries/shape_geometry.dart index 0ab31ade..170755da 100644 --- a/lib/three3d/geometries/shape_geometry.dart +++ b/lib/three3d/geometries/shape_geometry.dart @@ -3,6 +3,10 @@ import 'package:three_dart/three3d/core/index.dart'; import 'package:three_dart/three3d/extras/index.dart'; class ShapeGeometry extends BufferGeometry { + NativeArray? verticesArray; + NativeArray? normalsArray; + NativeArray? uvsArray; + ShapeGeometry(shapes, {num curveSegments = 12}) : super() { type = 'ShapeGeometry'; parameters = {}; @@ -93,7 +97,6 @@ class ShapeGeometry extends BufferGeometry { vertices.addAll([vertex.x.toDouble(), vertex.y.toDouble(), 0.0]); normals.addAll([0.0, 0.0, 1.0]); uvs.addAll([vertex.x.toDouble(), vertex.y.toDouble()]); // world uvs - } // incides @@ -135,13 +138,21 @@ class ShapeGeometry extends BufferGeometry { // build geometry setIndex(indices); - setAttribute('position', Float32BufferAttribute(Float32Array.from(vertices), 3, false)); - setAttribute('normal', Float32BufferAttribute(Float32Array.from(normals), 3, false)); - setAttribute('uv', Float32BufferAttribute(Float32Array.from(uvs), 2, false)); + setAttribute('position', Float32BufferAttribute(verticesArray = Float32Array.from(vertices), 3, false)); + setAttribute('normal', Float32BufferAttribute(normalsArray = Float32Array.from(normals), 3, false)); + setAttribute('uv', Float32BufferAttribute(uvsArray = Float32Array.from(uvs), 2, false)); // helper functions } + @override + void dispose() { + verticesArray?.dispose(); + normalsArray?.dispose(); + uvsArray?.dispose(); + super.dispose(); + } + // addShape( List vertices, List normals, List uvs, shape, groupCount ) { // var indexOffset = vertices.length / 3; diff --git a/lib/three3d/geometries/sphere_geometry.dart b/lib/three3d/geometries/sphere_geometry.dart index 0aadb77e..2a530f7d 100644 --- a/lib/three3d/geometries/sphere_geometry.dart +++ b/lib/three3d/geometries/sphere_geometry.dart @@ -3,6 +3,10 @@ import 'package:three_dart/three3d/core/index.dart'; import 'package:three_dart/three3d/math/index.dart'; class SphereGeometry extends BufferGeometry { + NativeArray? verticesArray; + NativeArray? normalsArray; + NativeArray? uvsArray; + SphereGeometry([ radius = 1, num widthSegments = 32, @@ -103,9 +107,17 @@ class SphereGeometry extends BufferGeometry { // build geometry setIndex(indices); - setAttribute('position', Float32BufferAttribute(Float32Array.from(vertices), 3, false)); - setAttribute('normal', Float32BufferAttribute(Float32Array.from(normals), 3, false)); - setAttribute('uv', Float32BufferAttribute(Float32Array.from(uvs), 2, false)); + setAttribute('position', Float32BufferAttribute(verticesArray = Float32Array.from(vertices), 3, false)); + setAttribute('normal', Float32BufferAttribute(normalsArray = Float32Array.from(normals), 3, false)); + setAttribute('uv', Float32BufferAttribute(uvsArray = Float32Array.from(uvs), 2, false)); + } + + @override + void dispose() { + verticesArray?.dispose(); + normalsArray?.dispose(); + uvsArray?.dispose(); + super.dispose(); } static fromJSON(data) { diff --git a/lib/three3d/geometries/torus_geometry.dart b/lib/three3d/geometries/torus_geometry.dart index 75ae4f37..8830c5f0 100644 --- a/lib/three3d/geometries/torus_geometry.dart +++ b/lib/three3d/geometries/torus_geometry.dart @@ -3,6 +3,10 @@ import 'package:three_dart/three3d/core/index.dart'; import 'package:three_dart/three3d/math/index.dart'; class TorusGeometry extends BufferGeometry { + NativeArray? verticesArray; + NativeArray? normalsArray; + NativeArray? uvsArray; + TorusGeometry([ radius = 1, tube = 0.4, @@ -86,9 +90,17 @@ class TorusGeometry extends BufferGeometry { // build geometry setIndex(indices); - setAttribute('position', Float32BufferAttribute(Float32Array.from(vertices), 3)); - setAttribute('normal', Float32BufferAttribute(Float32Array.from(normals), 3)); - setAttribute('uv', Float32BufferAttribute(Float32Array.from(uvs), 2)); + setAttribute('position', Float32BufferAttribute(verticesArray = Float32Array.from(vertices), 3)); + setAttribute('normal', Float32BufferAttribute(normalsArray = Float32Array.from(normals), 3)); + setAttribute('uv', Float32BufferAttribute(uvsArray = Float32Array.from(uvs), 2)); + } + + @override + void dispose() { + verticesArray?.dispose(); + normalsArray?.dispose(); + uvsArray?.dispose(); + super.dispose(); } static fromJSON(data) { diff --git a/lib/three3d/geometries/torus_knot_geometry.dart b/lib/three3d/geometries/torus_knot_geometry.dart index d4c2ed57..c649ffb7 100644 --- a/lib/three3d/geometries/torus_knot_geometry.dart +++ b/lib/three3d/geometries/torus_knot_geometry.dart @@ -3,6 +3,10 @@ import 'package:three_dart/three3d/core/index.dart'; import 'package:three_dart/three3d/math/index.dart'; class TorusKnotGeometry extends BufferGeometry { + NativeArray? verticesArray; + NativeArray? normalsArray; + NativeArray? uvsArray; + TorusKnotGeometry([ double radius = 1, double tube = 0.4, @@ -130,10 +134,18 @@ class TorusKnotGeometry extends BufferGeometry { // build geometry setIndex(indices); - setAttribute('position', Float32BufferAttribute(Float32Array.from(vertices), 3, false)); - setAttribute('normal', Float32BufferAttribute(Float32Array.from(normals), 3, false)); - setAttribute('uv', Float32BufferAttribute(Float32Array.from(uvs), 2, false)); + setAttribute('position', Float32BufferAttribute(verticesArray = Float32Array.from(vertices), 3, false)); + setAttribute('normal', Float32BufferAttribute(normalsArray = Float32Array.from(normals), 3, false)); + setAttribute('uv', Float32BufferAttribute(uvsArray = Float32Array.from(uvs), 2, false)); // this function calculates the current position on the torus curve } + + @override + void dispose() { + verticesArray?.dispose(); + normalsArray?.dispose(); + uvsArray?.dispose(); + super.dispose(); + } } diff --git a/lib/three3d/geometries/tube_geometry.dart b/lib/three3d/geometries/tube_geometry.dart index 20eb1293..a2c00107 100644 --- a/lib/three3d/geometries/tube_geometry.dart +++ b/lib/three3d/geometries/tube_geometry.dart @@ -4,6 +4,10 @@ import 'package:three_dart/three3d/extras/curves/quadratic_bezier_curve.dart'; import 'package:three_dart/three3d/math/index.dart'; class TubeGeometry extends BufferGeometry { + NativeArray? verticesArray; + NativeArray? normalsArray; + NativeArray? uvsArray; + TubeGeometry([ curve, tubularSegments = 64, @@ -116,8 +120,16 @@ class TubeGeometry extends BufferGeometry { generateBufferData(); setIndex(indices); - setAttribute('position', Float32BufferAttribute(Float32Array.from(vertices), 3, false)); - setAttribute('normal', Float32BufferAttribute(Float32Array.from(normals), 3, false)); - setAttribute('uv', Float32BufferAttribute(Float32Array.from(uvs), 2, false)); + setAttribute('position', Float32BufferAttribute(verticesArray = Float32Array.from(vertices), 3, false)); + setAttribute('normal', Float32BufferAttribute(normalsArray = Float32Array.from(normals), 3, false)); + setAttribute('uv', Float32BufferAttribute(uvsArray = Float32Array.from(uvs), 2, false)); + } + + @override + void dispose() { + verticesArray?.dispose(); + normalsArray?.dispose(); + uvsArray?.dispose(); + super.dispose(); } } diff --git a/lib/three3d/geometries/wireframe_geometry.dart b/lib/three3d/geometries/wireframe_geometry.dart index e1db42b0..f02a5e0a 100644 --- a/lib/three3d/geometries/wireframe_geometry.dart +++ b/lib/three3d/geometries/wireframe_geometry.dart @@ -3,6 +3,8 @@ import 'package:three_dart/three3d/core/index.dart'; import 'package:three_dart/three3d/math/index.dart'; class WireframeGeometry extends BufferGeometry { + NativeArray? verticesArray; + WireframeGeometry(BufferGeometry geometry) : super() { type = "WireframeGeometry"; // buffer @@ -77,7 +79,13 @@ class WireframeGeometry extends BufferGeometry { // build geometry - setAttribute('position', Float32BufferAttribute(Float32Array.from(vertices), 3, false)); + setAttribute('position', Float32BufferAttribute(verticesArray = Float32Array.from(vertices), 3, false)); + } + + @override + void dispose() { + verticesArray?.dispose(); + super.dispose(); } } diff --git a/lib/three3d/helpers/arrow_helper.dart b/lib/three3d/helpers/arrow_helper.dart index 0746ccd2..e8a64507 100644 --- a/lib/three3d/helpers/arrow_helper.dart +++ b/lib/three3d/helpers/arrow_helper.dart @@ -13,6 +13,8 @@ class ArrowHelper extends Object3D { late Line line; late Mesh cone; + NativeArray? positionArray; + ArrowHelper(dir, origin, length, color, headLength, headWidth) : super() { // dir is assumed to be normalized @@ -27,7 +29,8 @@ class ArrowHelper extends Object3D { if (_lineGeometry == null) { _lineGeometry = BufferGeometry(); - _lineGeometry.setAttribute('position', Float32BufferAttribute(Float32Array.from([0, 0, 0, 0, 1, 0]), 3, false)); + _lineGeometry.setAttribute( + 'position', Float32BufferAttribute(positionArray = Float32Array.from([0, 0, 0, 0, 1, 0]), 3, false)); _coneGeometry = CylinderGeometry(0, 0.5, 1, 5, 1); _coneGeometry.translate(0, -0.5, 0); @@ -89,4 +92,14 @@ class ArrowHelper extends Object3D { } return this; } + + @override + void dispose() { + positionArray?.dispose(); + + line.dispose(); + cone.dispose(); + + super.dispose(); + } } diff --git a/lib/three3d/helpers/axes_helper.dart b/lib/three3d/helpers/axes_helper.dart index e4de826f..9604222a 100644 --- a/lib/three3d/helpers/axes_helper.dart +++ b/lib/three3d/helpers/axes_helper.dart @@ -72,7 +72,7 @@ class AxesHelper extends LineSegments { @override void dispose() { - geometry!.dispose(); + geometry?.dispose(); material.dispose(); } } diff --git a/lib/three3d/math/matrix3.dart b/lib/three3d/math/matrix3.dart index 20867661..107555e6 100644 --- a/lib/three3d/math/matrix3.dart +++ b/lib/three3d/math/matrix3.dart @@ -308,4 +308,8 @@ class Matrix3 { Map toJson() { return {'elements': elements}; } + + void dispose() { + elements.dispose(); + } } diff --git a/lib/three3d/math/matrix4.dart b/lib/three3d/math/matrix4.dart index d8cfde76..f2729403 100644 --- a/lib/three3d/math/matrix4.dart +++ b/lib/three3d/math/matrix4.dart @@ -827,4 +827,8 @@ class Matrix4 { print('three.Matrix4: .getInverse() has been removed. Use matrixInv.copy( matrix ).invert(); instead.'); return copy(matrix).invert(); } + + void dispose() { + elements.dispose(); + } } diff --git a/pubspec.lock b/pubspec.lock index cda2c310..4d482261 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -105,10 +105,9 @@ packages: flutter_gl: dependency: "direct main" description: - name: flutter_gl - sha256: de74c88f77228f47dd280e2092b50eb49fe1fc008de74047d195a27f2db0b491 - url: "https://pub.dev" - source: hosted + path: "../flutter_gl/flutter_gl" + relative: true + source: path version: "0.0.21" flutter_gl_macos: dependency: transitive @@ -217,13 +216,21 @@ packages: source: hosted version: "0.2.0" meta: - dependency: transitive + dependency: "direct main" description: name: meta sha256: "6c268b42ed578a53088d834796959e4a1814b5e9e164f147f580a386e5decf42" url: "https://pub.dev" source: hosted version: "1.8.0" + opentype_dart: + dependency: transitive + description: + name: opentype_dart + sha256: "4bd96aeed494289a87e92bde20afe60f59648dcef253c0a7159b65ffa23899dc" + url: "https://pub.dev" + source: hosted + version: "0.0.1" path: dependency: transitive description: @@ -309,6 +316,13 @@ packages: url: "https://pub.dev" source: hosted version: "0.4.16" + three_dart_jsm: + dependency: "direct overridden" + description: + path: "../three_dart_jsm" + relative: true + source: path + version: "0.0.10" typed_data: dependency: transitive description: @@ -317,6 +331,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.3.1" + typr_dart: + dependency: transitive + description: + name: typr_dart + sha256: e8aa717c1445ceccd77bd6ba471683c8e17a9b14797ac09db3bd52d6fbd2fe7b + url: "https://pub.dev" + source: hosted + version: "0.0.2" universal_html: dependency: "direct main" description: @@ -351,4 +373,4 @@ packages: version: "6.2.2" sdks: dart: ">=2.18.0 <3.0.0" - flutter: ">=3.0.1" + flutter: ">=2.5.0" diff --git a/pubspec.yaml b/pubspec.yaml index 8ee71e17..9c520726 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -15,6 +15,7 @@ dependencies: image: ^3.1.1 flutter_gl: ^0.0.20 crypto: ^3.0.1 + meta: # opentype: # git: git@github.com:wasabia/opentype.git @@ -27,9 +28,11 @@ dependencies: # flutter_webgpu: # path: ../flutter_webgpu -# dependency_overrides: -# three_dart_jsm: -# path: ../three_dart_jsm +dependency_overrides: + three_dart_jsm: + path: ../three_dart_jsm + flutter_gl: + path: ../flutter_gl/flutter_gl dev_dependencies: flutter_test: