@mindexec/cli 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +275 -0
- package/codex-runtime.js +960 -0
- package/launch-bridge.cjs +162 -0
- package/package.json +61 -0
- package/port-guard.cjs +232 -0
- package/scripts/setup-tree-sitter-grammars.mjs +59 -0
- package/server.js +8422 -0
- package/start-bridge.bat +32 -0
- package/start-bridge.sh +81 -0
- package/tree-sitter-grammars/README.md +18 -0
- package/tree-sitter-grammars/tree-sitter-c_sharp.wasm +0 -0
- package/tree-sitter-grammars/tree-sitter-go.wasm +0 -0
- package/tree-sitter-grammars/tree-sitter-java.wasm +0 -0
- package/tree-sitter-grammars/tree-sitter-javascript.wasm +0 -0
- package/tree-sitter-grammars/tree-sitter-python.wasm +0 -0
- package/tree-sitter-grammars/tree-sitter-rust.wasm +0 -0
- package/tree-sitter-grammars/tree-sitter-tsx.wasm +0 -0
- package/tree-sitter-grammars/tree-sitter-typescript.wasm +0 -0
- package/wwwroot/MindExecution.Web.styles.css +3 -0
- package/wwwroot/_content/MindExecution.Plugins.Admin/css/admin-dashboard.css +546 -0
- package/wwwroot/_content/MindExecution.Plugins.Directory/MindExecution.Plugins.Directory.u7utcng611.bundle.scp.css +7 -0
- package/wwwroot/_content/MindExecution.Plugins.Directory/background.png +0 -0
- package/wwwroot/_content/MindExecution.Plugins.Directory/directory-manager.js +202 -0
- package/wwwroot/_content/MindExecution.Plugins.Directory/exampleJsInterop.js +6 -0
- package/wwwroot/_content/MindExecution.Plugins.YouTube/css/youtube-search.css +251 -0
- package/wwwroot/_content/MindExecution.Shared/MindExecution.Shared.wsano1j4wp.bundle.scp.css +4 -0
- package/wwwroot/_content/MindExecution.Shared/css/admin-dashboard.css +559 -0
- package/wwwroot/_content/MindExecution.Shared/css/app.css +1 -0
- package/wwwroot/_content/MindExecution.Shared/css/mind-map-overrides.css +2936 -0
- package/wwwroot/_content/MindExecution.Shared/fonts/NotoSansKR-Bold.ttf +0 -0
- package/wwwroot/_content/MindExecution.Shared/fonts/NotoSansKR-Regular.ttf +0 -0
- package/wwwroot/_content/MindExecution.Shared/js/agent-visualization.js +359 -0
- package/wwwroot/_content/MindExecution.Shared/js/background-themes.js +1721 -0
- package/wwwroot/_content/MindExecution.Shared/js/code-master.js +8316 -0
- package/wwwroot/_content/MindExecution.Shared/js/file-system-helper.js +639 -0
- package/wwwroot/_content/MindExecution.Shared/js/helpers/InfiniteGridHelper.js +109 -0
- package/wwwroot/_content/MindExecution.Shared/js/marked.min.js +69 -0
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-core.js +7982 -0
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-core.js.backup +1059 -0
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-css3d-manager.js +15803 -0
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-dev-guards.js +325 -0
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-dnd.js +1430 -0
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-dnd.js.bak +434 -0
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-glow-shader.js +260 -0
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-interactions.js +7640 -0
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-lod-plan-worker.js +160 -0
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-lod-renderer.js +9923 -0
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-logic-workers.js +977 -0
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-menu-manager.js +1431 -0
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-multi-select.js +1716 -0
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-node-search-worker.js +553 -0
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-nodes.js +4541 -0
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-object-manager.js +489 -0
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-object-manager.js.backup +372 -0
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-pipeline.js +2075 -0
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-text-lod-system.js +646 -0
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-text-overlay-v2.js +4323 -0
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-texture-factory.js +2260 -0
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-texture-factory.js.backup +1258 -0
- package/wwwroot/_content/MindExecution.Shared/js/mind-map-visibility-worker.js +890 -0
- package/wwwroot/_content/MindExecution.Shared/js/mindmap-toolbar.js +594 -0
- package/wwwroot/_content/MindExecution.Shared/js/native-drop-handler.js +170 -0
- package/wwwroot/_content/MindExecution.Shared/js/plan-master.js +788 -0
- package/wwwroot/_content/MindExecution.Shared/js/renderers/CSS3DRenderer.js +50 -0
- package/wwwroot/_content/MindExecution.Shared/js/texture-worker-manager.js +188 -0
- package/wwwroot/_content/MindExecution.Shared/js/texture-worker.js +208 -0
- package/wwwroot/_content/MindExecution.Shared/js/three.min.js +6 -0
- package/wwwroot/_content/MindExecution.Shared/js/titlebar-handler.js +191 -0
- package/wwwroot/_content/MindExecution.Shared/js/token-manager.js +37 -0
- package/wwwroot/_content/MindExecution.Shared/js/token-worker.js +28 -0
- package/wwwroot/_content/MindExecution.Shared/js/troika-bundle.js +5626 -0
- package/wwwroot/_content/MindExecution.Shared/js/troika-bundle.js.map +7 -0
- package/wwwroot/_content/MindExecution.Shared/lib/font-awesome/css/all.min.css +9 -0
- package/wwwroot/_content/MindExecution.Shared/lib/font-awesome/webfonts/fa-brands-400.ttf +0 -0
- package/wwwroot/_content/MindExecution.Shared/lib/font-awesome/webfonts/fa-brands-400.woff2 +0 -0
- package/wwwroot/_content/MindExecution.Shared/lib/font-awesome/webfonts/fa-regular-400.ttf +0 -0
- package/wwwroot/_content/MindExecution.Shared/lib/font-awesome/webfonts/fa-regular-400.woff2 +0 -0
- package/wwwroot/_content/MindExecution.Shared/lib/font-awesome/webfonts/fa-solid-900.ttf +0 -0
- package/wwwroot/_content/MindExecution.Shared/lib/font-awesome/webfonts/fa-solid-900.woff2 +0 -0
- package/wwwroot/_content/MindExecution.Shared/models/all-MiniLM-L6-v2-quantized.onnx +0 -0
- package/wwwroot/_content/MindExecution.Shared/models/vocab.txt +30522 -0
- package/wwwroot/_framework/Google.Protobuf.9h59ukbel7.dll +0 -0
- package/wwwroot/_framework/Markdig.d1j7v41cl1.dll +0 -0
- package/wwwroot/_framework/MessagePack.Annotations.l6qv48kgpt.dll +0 -0
- package/wwwroot/_framework/MessagePack.eqoptzx9d5.dll +0 -0
- package/wwwroot/_framework/Microsoft.AspNetCore.Authorization.k7dsih5y5g.dll +0 -0
- package/wwwroot/_framework/Microsoft.AspNetCore.Components.6nyje9sa0g.dll +0 -0
- package/wwwroot/_framework/Microsoft.AspNetCore.Components.Authorization.iycd6unprw.dll +0 -0
- package/wwwroot/_framework/Microsoft.AspNetCore.Components.Web.487u3twia4.dll +0 -0
- package/wwwroot/_framework/Microsoft.AspNetCore.Components.WebAssembly.d0gcnmlxxz.dll +0 -0
- package/wwwroot/_framework/Microsoft.AspNetCore.Metadata.h4yevl9adi.dll +0 -0
- package/wwwroot/_framework/Microsoft.CSharp.qrvp77qmhs.dll +0 -0
- package/wwwroot/_framework/Microsoft.Data.Sqlite.jdlxgv2jtg.dll +0 -0
- package/wwwroot/_framework/Microsoft.EntityFrameworkCore.4gjazp7kjf.dll +0 -0
- package/wwwroot/_framework/Microsoft.EntityFrameworkCore.Abstractions.gocudnvz7b.dll +0 -0
- package/wwwroot/_framework/Microsoft.EntityFrameworkCore.Relational.lt4rsvinuo.dll +0 -0
- package/wwwroot/_framework/Microsoft.EntityFrameworkCore.Sqlite.69luj0fa9r.dll +0 -0
- package/wwwroot/_framework/Microsoft.Extensions.Caching.Abstractions.364t4jh3zz.dll +0 -0
- package/wwwroot/_framework/Microsoft.Extensions.Caching.Memory.izlxhpzosu.dll +0 -0
- package/wwwroot/_framework/Microsoft.Extensions.Configuration.8zq7hh41o7.dll +0 -0
- package/wwwroot/_framework/Microsoft.Extensions.Configuration.Abstractions.8if74zs6ea.dll +0 -0
- package/wwwroot/_framework/Microsoft.Extensions.Configuration.Json.duvlngw8i0.dll +0 -0
- package/wwwroot/_framework/Microsoft.Extensions.DependencyInjection.Abstractions.t2hh9kvx0o.dll +0 -0
- package/wwwroot/_framework/Microsoft.Extensions.DependencyInjection.n4tg99oy8l.dll +0 -0
- package/wwwroot/_framework/Microsoft.Extensions.DependencyModel.h0d06ixk3e.dll +0 -0
- package/wwwroot/_framework/Microsoft.Extensions.Logging.Abstractions.rl32bkx2sd.dll +0 -0
- package/wwwroot/_framework/Microsoft.Extensions.Logging.dlht1xei0t.dll +0 -0
- package/wwwroot/_framework/Microsoft.Extensions.Options.qeunebioml.dll +0 -0
- package/wwwroot/_framework/Microsoft.Extensions.Primitives.18cr6vnuuz.dll +0 -0
- package/wwwroot/_framework/Microsoft.IO.RecyclableMemoryStream.r915vovvw4.dll +0 -0
- package/wwwroot/_framework/Microsoft.IdentityModel.Abstractions.1ejljk3erv.dll +0 -0
- package/wwwroot/_framework/Microsoft.IdentityModel.JsonWebTokens.1596zr8gne.dll +0 -0
- package/wwwroot/_framework/Microsoft.IdentityModel.Logging.229uyvpgio.dll +0 -0
- package/wwwroot/_framework/Microsoft.IdentityModel.Tokens.9sibtajc9f.dll +0 -0
- package/wwwroot/_framework/Microsoft.JSInterop.17lq4j1j7g.dll +0 -0
- package/wwwroot/_framework/Microsoft.JSInterop.WebAssembly.ryia5gxiad.dll +0 -0
- package/wwwroot/_framework/Microsoft.ML.OnnxRuntime.w9deo1m5ss.dll +0 -0
- package/wwwroot/_framework/Microsoft.ML.Tokenizers.cm2vuv2z61.dll +0 -0
- package/wwwroot/_framework/Microsoft.NET.StringTools.3qbrf4v2ki.dll +0 -0
- package/wwwroot/_framework/MimeMapping.og9ys58ylm.dll +0 -0
- package/wwwroot/_framework/MindExecution.Core.1q1trifbuu.dll +0 -0
- package/wwwroot/_framework/MindExecution.Kernel.gwwc40sc45.dll +0 -0
- package/wwwroot/_framework/MindExecution.Plugins.Admin.0jgrn1sckv.dll +0 -0
- package/wwwroot/_framework/MindExecution.Plugins.Business.13mme2qcag.dll +0 -0
- package/wwwroot/_framework/MindExecution.Plugins.Concept.dfp2mdt45q.dll +0 -0
- package/wwwroot/_framework/MindExecution.Plugins.Directory.3w4t6n3se0.dll +0 -0
- package/wwwroot/_framework/MindExecution.Plugins.PlanMaster.s0qpntz420.dll +0 -0
- package/wwwroot/_framework/MindExecution.Plugins.YouTube.iu11fq8d16.dll +0 -0
- package/wwwroot/_framework/MindExecution.Shared.7j27dcqnrc.dll +0 -0
- package/wwwroot/_framework/MindExecution.Web.pq1ty8ov2v.dll +0 -0
- package/wwwroot/_framework/Newtonsoft.Json.a56zs13vug.dll +0 -0
- package/wwwroot/_framework/SQLitePCLRaw.batteries_v2.rrd1nzawpp.dll +0 -0
- package/wwwroot/_framework/SQLitePCLRaw.core.1dxloztpfz.dll +0 -0
- package/wwwroot/_framework/SQLitePCLRaw.provider.e_sqlite3.oekyzl53i1.dll +0 -0
- package/wwwroot/_framework/Supabase.Core.s1pkj4aj0l.dll +0 -0
- package/wwwroot/_framework/Supabase.Functions.qz4nu782sg.dll +0 -0
- package/wwwroot/_framework/Supabase.Gotrue.twah27pkik.dll +0 -0
- package/wwwroot/_framework/Supabase.Postgrest.gmuuv369ih.dll +0 -0
- package/wwwroot/_framework/Supabase.Realtime.ox3kchdy3w.dll +0 -0
- package/wwwroot/_framework/Supabase.Storage.fnjnepaowr.dll +0 -0
- package/wwwroot/_framework/Supabase.azmaw5pgcz.dll +0 -0
- package/wwwroot/_framework/System.Collections.Concurrent.y1zmvuyipi.dll +0 -0
- package/wwwroot/_framework/System.Collections.Immutable.ug3j698qms.dll +0 -0
- package/wwwroot/_framework/System.Collections.NonGeneric.h66hj3863h.dll +0 -0
- package/wwwroot/_framework/System.Collections.Specialized.umr3y27ntj.dll +0 -0
- package/wwwroot/_framework/System.Collections.x53e19vfsj.dll +0 -0
- package/wwwroot/_framework/System.ComponentModel.Annotations.tz6gnt4ebt.dll +0 -0
- package/wwwroot/_framework/System.ComponentModel.Primitives.j7tiphu4rg.dll +0 -0
- package/wwwroot/_framework/System.ComponentModel.TypeConverter.ujlztox1gx.dll +0 -0
- package/wwwroot/_framework/System.ComponentModel.x9xz0ojfb6.dll +0 -0
- package/wwwroot/_framework/System.Console.ijzpqmj7ne.dll +0 -0
- package/wwwroot/_framework/System.Data.Common.1r0sqffq1p.dll +0 -0
- package/wwwroot/_framework/System.Diagnostics.DiagnosticSource.9upoqwq09o.dll +0 -0
- package/wwwroot/_framework/System.Diagnostics.Process.m99azzntjm.dll +0 -0
- package/wwwroot/_framework/System.Diagnostics.TraceSource.pl7wv26myr.dll +0 -0
- package/wwwroot/_framework/System.Diagnostics.Tracing.crlhfx6tut.dll +0 -0
- package/wwwroot/_framework/System.Drawing.Primitives.22e4y9ikq9.dll +0 -0
- package/wwwroot/_framework/System.Drawing.mi7d8hwowb.dll +0 -0
- package/wwwroot/_framework/System.Formats.Asn1.jx23sjiqnn.dll +0 -0
- package/wwwroot/_framework/System.IO.Compression.6fyoii3uej.dll +0 -0
- package/wwwroot/_framework/System.IO.Pipelines.vg77t4cd4d.dll +0 -0
- package/wwwroot/_framework/System.IdentityModel.Tokens.Jwt.t67es60z5b.dll +0 -0
- package/wwwroot/_framework/System.Linq.1bkoxlqgmq.dll +0 -0
- package/wwwroot/_framework/System.Linq.Expressions.24xqiypwdt.dll +0 -0
- package/wwwroot/_framework/System.Linq.Queryable.hvd01d6rsa.dll +0 -0
- package/wwwroot/_framework/System.Memory.8dx3lwgym4.dll +0 -0
- package/wwwroot/_framework/System.Net.Http.Json.3mhdm9l1rf.dll +0 -0
- package/wwwroot/_framework/System.Net.Http.eitrz660my.dll +0 -0
- package/wwwroot/_framework/System.Net.NetworkInformation.3pkuofcv9r.dll +0 -0
- package/wwwroot/_framework/System.Net.Ping.8clj5pklrp.dll +0 -0
- package/wwwroot/_framework/System.Net.Primitives.qrp4wcjz1p.dll +0 -0
- package/wwwroot/_framework/System.Net.WebSockets.Client.2u6pv01g69.dll +0 -0
- package/wwwroot/_framework/System.Net.WebSockets.qp6u31zvm5.dll +0 -0
- package/wwwroot/_framework/System.Numerics.Tensors.0c7z4mt3on.dll +0 -0
- package/wwwroot/_framework/System.Numerics.Vectors.kc7ufp2j4l.dll +0 -0
- package/wwwroot/_framework/System.ObjectModel.qv82fot1ib.dll +0 -0
- package/wwwroot/_framework/System.Private.CoreLib.rkafq04oma.dll +0 -0
- package/wwwroot/_framework/System.Private.Uri.t9542hmr6j.dll +0 -0
- package/wwwroot/_framework/System.Private.Xml.Linq.n8n3ptrbwu.dll +0 -0
- package/wwwroot/_framework/System.Private.Xml.rxd3tytisn.dll +0 -0
- package/wwwroot/_framework/System.Reactive.t3fuon548l.dll +0 -0
- package/wwwroot/_framework/System.Reflection.Emit.9tjhp6y0j3.dll +0 -0
- package/wwwroot/_framework/System.Reflection.Emit.ILGeneration.stxyk8zoo1.dll +0 -0
- package/wwwroot/_framework/System.Reflection.Emit.Lightweight.6xrd5v8vg0.dll +0 -0
- package/wwwroot/_framework/System.Reflection.Primitives.wgn8fpwwvv.dll +0 -0
- package/wwwroot/_framework/System.Runtime.InteropServices.JavaScript.sliym526xh.dll +0 -0
- package/wwwroot/_framework/System.Runtime.InteropServices.RuntimeInformation.oji7zut14z.dll +0 -0
- package/wwwroot/_framework/System.Runtime.InteropServices.te07xr2we9.dll +0 -0
- package/wwwroot/_framework/System.Runtime.Intrinsics.507y4h8nzq.dll +0 -0
- package/wwwroot/_framework/System.Runtime.Loader.v7gk4bse0k.dll +0 -0
- package/wwwroot/_framework/System.Runtime.Numerics.eqy5xjv3nd.dll +0 -0
- package/wwwroot/_framework/System.Runtime.Serialization.Formatters.zpkrub8lab.dll +0 -0
- package/wwwroot/_framework/System.Runtime.Serialization.Primitives.vhkpnbxjip.dll +0 -0
- package/wwwroot/_framework/System.Runtime.jn319d5nyg.dll +0 -0
- package/wwwroot/_framework/System.Security.Claims.0ztig1q9vo.dll +0 -0
- package/wwwroot/_framework/System.Security.Cryptography.vttizqc9ho.dll +0 -0
- package/wwwroot/_framework/System.Text.Encoding.Extensions.utdd47ny8f.dll +0 -0
- package/wwwroot/_framework/System.Text.Encodings.Web.wah8r1zoe0.dll +0 -0
- package/wwwroot/_framework/System.Text.Json.kxlfxj0wrs.dll +0 -0
- package/wwwroot/_framework/System.Text.RegularExpressions.dbqn58klox.dll +0 -0
- package/wwwroot/_framework/System.Threading.42ao9vi047.dll +0 -0
- package/wwwroot/_framework/System.Threading.Channels.hfa7j0uv2w.dll +0 -0
- package/wwwroot/_framework/System.Threading.Thread.caul0pdqul.dll +0 -0
- package/wwwroot/_framework/System.Transactions.Local.fimi2hamzo.dll +0 -0
- package/wwwroot/_framework/System.Web.HttpUtility.gq8yz50p2e.dll +0 -0
- package/wwwroot/_framework/System.Xml.Linq.kitin4zjoj.dll +0 -0
- package/wwwroot/_framework/System.Xml.ReaderWriter.kzvw3qgxb0.dll +0 -0
- package/wwwroot/_framework/System.Xml.XDocument.c539ki6cuq.dll +0 -0
- package/wwwroot/_framework/System.m05i39uvk9.dll +0 -0
- package/wwwroot/_framework/Websocket.Client.vapounvmnl.dll +0 -0
- package/wwwroot/_framework/blazor.boot.json +305 -0
- package/wwwroot/_framework/blazor.webassembly.js +1 -0
- package/wwwroot/_framework/dotnet.js +4 -0
- package/wwwroot/_framework/dotnet.native.vz0adxojrz.wasm +0 -0
- package/wwwroot/_framework/dotnet.native.xsn1d6x2kd.js +16 -0
- package/wwwroot/_framework/dotnet.runtime.dstopyvqzi.js +4 -0
- package/wwwroot/_framework/icudt_CJK.tjcz0u77k5.dat +0 -0
- package/wwwroot/_framework/icudt_EFIGS.tptq2av103.dat +0 -0
- package/wwwroot/_framework/icudt_no_CJK.lfu7j35m59.dat +0 -0
- package/wwwroot/_framework/netstandard.0xet7jg7ky.dll +0 -0
- package/wwwroot/_headers +40 -0
- package/wwwroot/_redirects +1 -0
- package/wwwroot/appsettings.json +71 -0
- package/wwwroot/icon-192.png +0 -0
- package/wwwroot/icon-512.png +0 -0
- package/wwwroot/index.html +710 -0
- package/wwwroot/js/marketing-tool.js +180 -0
- package/wwwroot/manifest.webmanifest +22 -0
- package/wwwroot/robots.txt +4 -0
- package/wwwroot/service-worker-assets.js +857 -0
- package/wwwroot/service-worker.js +33 -0
- package/wwwroot/sitemap.xml +27 -0
|
@@ -0,0 +1,372 @@
|
|
|
1
|
+
// File: mind-map-object-manager.js
|
|
2
|
+
// [Refactor] Creates and updates WebGL node groups (THREE.Group / THREE.Mesh).
|
|
3
|
+
(function () {
|
|
4
|
+
'use strict';
|
|
5
|
+
|
|
6
|
+
function createRoundedRectGeometry(width, height, radius) {
|
|
7
|
+
const shape = new THREE.Shape();
|
|
8
|
+
const x = -width / 2;
|
|
9
|
+
const y = -height / 2;
|
|
10
|
+
|
|
11
|
+
// Start at bottom-left, go clockwise
|
|
12
|
+
shape.moveTo(x, y + radius);
|
|
13
|
+
shape.quadraticCurveTo(x, y, x + radius, y);
|
|
14
|
+
|
|
15
|
+
shape.lineTo(x + width - radius, y);
|
|
16
|
+
shape.quadraticCurveTo(x + width, y, x + width, y + radius);
|
|
17
|
+
|
|
18
|
+
shape.lineTo(x + width, y + height - radius);
|
|
19
|
+
shape.quadraticCurveTo(x + width, y + height, x + width - radius, y + height);
|
|
20
|
+
|
|
21
|
+
shape.lineTo(x + radius, y + height);
|
|
22
|
+
shape.quadraticCurveTo(x, y + height, x, y + height - radius);
|
|
23
|
+
|
|
24
|
+
shape.lineTo(x, y + radius);
|
|
25
|
+
|
|
26
|
+
const points = shape.getPoints();
|
|
27
|
+
return new THREE.BufferGeometry().setFromPoints(points);
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// ▲▲▲ [Change] ▲▲▲
|
|
31
|
+
|
|
32
|
+
// ▼▼▼ [Atlas] Shared materials for Atlas mode (created lazily) ▼▼▼
|
|
33
|
+
let atlasBodyMaterial = null;
|
|
34
|
+
let atlasBodyMaterials = []; // Array of materials (one per atlas page)
|
|
35
|
+
// ▲▲▲ [Atlas] ▲▲▲
|
|
36
|
+
|
|
37
|
+
async function createOrUpdateCanvasTextureNode(module, nodeModel, existingGroup = null, zPos = 0, textures, width, height, atlasResult = null) {
|
|
38
|
+
// ▼▼▼ [Atlas] Check if this is Atlas mode ▼▼▼
|
|
39
|
+
const isAtlasMode = atlasResult?.isAtlasMode === true;
|
|
40
|
+
|
|
41
|
+
if (isAtlasMode) {
|
|
42
|
+
// Atlas mode uses shared materials - textures.default.body is null
|
|
43
|
+
// We need to create/update the mesh differently
|
|
44
|
+
console.log(`[ObjectManager] Creating node ${nodeModel.id} in ATLAS mode`);
|
|
45
|
+
}
|
|
46
|
+
// ▲▲▲ [Atlas] ▲▲▲
|
|
47
|
+
|
|
48
|
+
// For non-Atlas mode, validate textures
|
|
49
|
+
if (!isAtlasMode && (!textures || !textures.default || !textures.selected)) {
|
|
50
|
+
console.error(`[MindMapObjectManager] Cannot create node ${nodeModel.id}: Invalid textures object provided.`);
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
const TAIL_HEIGHT = 12;
|
|
55
|
+
const HANDLE_SIZE = 24;
|
|
56
|
+
const CORNER_RADIUS = 20; // value chosen to visually match the texture corner radius
|
|
57
|
+
const DEFAULT_OUTLINE_COLOR = 0x374151;
|
|
58
|
+
const SELECTED_OUTLINE_COLOR = 0x2563eb;
|
|
59
|
+
const isSelected = module.multiSelectedNodeIds.has(nodeModel.id);
|
|
60
|
+
const outlineColor = isSelected ? SELECTED_OUTLINE_COLOR : DEFAULT_OUTLINE_COLOR;
|
|
61
|
+
const OUTLINE_SHRINK = 2;
|
|
62
|
+
const OUTLINE_RADIUS = Math.max(1, CORNER_RADIUS - 1);
|
|
63
|
+
|
|
64
|
+
if (existingGroup) {
|
|
65
|
+
const bodyMesh = existingGroup.getObjectByName('body');
|
|
66
|
+
const tailMesh = existingGroup.getObjectByName('tail');
|
|
67
|
+
const glowMesh = existingGroup.getObjectByName('glow');
|
|
68
|
+
let outline = existingGroup.getObjectByName('outline');
|
|
69
|
+
let baseRenderOrder = existingGroup.userData?.baseRenderOrder;
|
|
70
|
+
if (baseRenderOrder === undefined) {
|
|
71
|
+
baseRenderOrder = bodyMesh?.renderOrder ?? module.nodeZCounter++;
|
|
72
|
+
existingGroup.userData = {
|
|
73
|
+
...(existingGroup.userData || {}),
|
|
74
|
+
baseRenderOrder
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
if (bodyMesh) {
|
|
79
|
+
const gp = bodyMesh.geometry && bodyMesh.geometry.parameters;
|
|
80
|
+
if (!gp || gp.width !== width || gp.height !== height) {
|
|
81
|
+
bodyMesh.geometry.dispose();
|
|
82
|
+
bodyMesh.geometry = new THREE.PlaneGeometry(width, height);
|
|
83
|
+
|
|
84
|
+
if (outline) {
|
|
85
|
+
outline.geometry.dispose();
|
|
86
|
+
outline.geometry = createRoundedRectGeometry(
|
|
87
|
+
width - OUTLINE_SHRINK,
|
|
88
|
+
height - OUTLINE_SHRINK,
|
|
89
|
+
OUTLINE_RADIUS
|
|
90
|
+
);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
bodyMesh.position.set(width / 2, -height / 2, 0);
|
|
94
|
+
if (outline) {
|
|
95
|
+
outline.position.copy(bodyMesh.position);
|
|
96
|
+
outline.position.z = 0.1; // place slightly in front of body to avoid Z-fighting
|
|
97
|
+
outline.visible = isSelected;
|
|
98
|
+
if (outline.material) {
|
|
99
|
+
outline.material.color.setHex(isSelected ? SELECTED_OUTLINE_COLOR : DEFAULT_OUTLINE_COLOR);
|
|
100
|
+
outline.material.opacity = isSelected ? 1.0 : 0.5;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
if (tailMesh) {
|
|
105
|
+
tailMesh.position.set(width / 2, -height - (TAIL_HEIGHT / 2), 0);
|
|
106
|
+
}
|
|
107
|
+
// ▼▼▼ [Changed] Update eight resize handles (4 corners + 4 edges with geometry) ▼▼▼
|
|
108
|
+
if (nodeModel.contentType !== 'pdf') {
|
|
109
|
+
const edgeWidthLength = Math.max(10, width - HANDLE_SIZE * 2);
|
|
110
|
+
const edgeHeightLength = Math.max(10, height - HANDLE_SIZE * 2);
|
|
111
|
+
const handleConfigs = {
|
|
112
|
+
// Corners (square, no geometry update needed)
|
|
113
|
+
'resizeHandle_TL': { x: HANDLE_SIZE / 2, y: -HANDLE_SIZE / 2, w: HANDLE_SIZE, h: HANDLE_SIZE, z: 1.1 },
|
|
114
|
+
'resizeHandle_TR': { x: width - HANDLE_SIZE / 2, y: -HANDLE_SIZE / 2, w: HANDLE_SIZE, h: HANDLE_SIZE, z: 1.1 },
|
|
115
|
+
'resizeHandle_BL': { x: HANDLE_SIZE / 2, y: -height + HANDLE_SIZE / 2, w: HANDLE_SIZE, h: HANDLE_SIZE, z: 1.1 },
|
|
116
|
+
'resizeHandle_BR': { x: width - HANDLE_SIZE / 2, y: -height + HANDLE_SIZE / 2, w: HANDLE_SIZE, h: HANDLE_SIZE, z: 1.1 },
|
|
117
|
+
// Edges (dynamic length, need geometry update)
|
|
118
|
+
'resizeHandle_T': { x: width / 2, y: -HANDLE_SIZE / 2, w: edgeWidthLength, h: HANDLE_SIZE, z: 1 },
|
|
119
|
+
'resizeHandle_B': { x: width / 2, y: -height + HANDLE_SIZE / 2, w: edgeWidthLength, h: HANDLE_SIZE, z: 1 },
|
|
120
|
+
'resizeHandle_L': { x: HANDLE_SIZE / 2, y: -height / 2, w: HANDLE_SIZE, h: edgeHeightLength, z: 1 },
|
|
121
|
+
'resizeHandle_R': { x: width - HANDLE_SIZE / 2, y: -height / 2, w: HANDLE_SIZE, h: edgeHeightLength, z: 1 }
|
|
122
|
+
};
|
|
123
|
+
Object.entries(handleConfigs).forEach(([name, cfg]) => {
|
|
124
|
+
const handle = existingGroup.getObjectByName(name);
|
|
125
|
+
if (handle) {
|
|
126
|
+
handle.position.set(cfg.x, cfg.y, cfg.z);
|
|
127
|
+
// Update geometry for edge handles (they change size with node size)
|
|
128
|
+
const gp = handle.geometry?.parameters;
|
|
129
|
+
if (gp && (gp.width !== cfg.w || gp.height !== cfg.h)) {
|
|
130
|
+
handle.geometry.dispose();
|
|
131
|
+
handle.geometry = new THREE.PlaneGeometry(cfg.w, cfg.h);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
// ▲▲▲ [Changed] ▲▲▲
|
|
137
|
+
|
|
138
|
+
const active = isSelected ? textures.selected : textures.default;
|
|
139
|
+
if (bodyMesh && bodyMesh.material) { bodyMesh.material.map = active.body; bodyMesh.material.needsUpdate = true; }
|
|
140
|
+
if (tailMesh && tailMesh.material) { tailMesh.material.map = active.tail; tailMesh.material.needsUpdate = true; }
|
|
141
|
+
|
|
142
|
+
const glowColor = isSelected ? 0x2563eb : 0x000000;
|
|
143
|
+
const glowOpacity = isSelected ? 0.6 : 0.3;
|
|
144
|
+
if (textures.glow) {
|
|
145
|
+
const gData = textures.glow;
|
|
146
|
+
const gWidth = gData.width / 2;
|
|
147
|
+
const gHeight = gData.height / 2;
|
|
148
|
+
if (!glowMesh) {
|
|
149
|
+
const gGeo = new THREE.PlaneGeometry(gWidth, gHeight);
|
|
150
|
+
const gMat = new THREE.MeshBasicMaterial({
|
|
151
|
+
map: gData.texture,
|
|
152
|
+
transparent: true,
|
|
153
|
+
opacity: glowOpacity,
|
|
154
|
+
color: glowColor,
|
|
155
|
+
depthWrite: false,
|
|
156
|
+
depthTest: true
|
|
157
|
+
});
|
|
158
|
+
const glow = new THREE.Mesh(gGeo, gMat);
|
|
159
|
+
glow.name = 'glow';
|
|
160
|
+
glow.position.set(width / 2, -height / 2, -0.1);
|
|
161
|
+
glow.renderOrder = baseRenderOrder - 5;
|
|
162
|
+
glow.raycast = () => { };
|
|
163
|
+
existingGroup.add(glow);
|
|
164
|
+
} else {
|
|
165
|
+
if (glowMesh.geometry) glowMesh.geometry.dispose();
|
|
166
|
+
glowMesh.geometry = new THREE.PlaneGeometry(gWidth, gHeight);
|
|
167
|
+
glowMesh.material.map = gData.texture;
|
|
168
|
+
glowMesh.material.color.setHex(glowColor);
|
|
169
|
+
glowMesh.material.opacity = glowOpacity;
|
|
170
|
+
glowMesh.position.set(width / 2, -height / 2, -0.1);
|
|
171
|
+
glowMesh.renderOrder = baseRenderOrder - 5;
|
|
172
|
+
glowMesh.raycast = () => { };
|
|
173
|
+
glowMesh.material.needsUpdate = true;
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
existingGroup.userData.worldWidth = width;
|
|
178
|
+
existingGroup.userData.worldHeight = height;
|
|
179
|
+
existingGroup.userData.baseRenderOrder = baseRenderOrder;
|
|
180
|
+
|
|
181
|
+
return existingGroup;
|
|
182
|
+
|
|
183
|
+
} else {
|
|
184
|
+
// --- Create new group ---
|
|
185
|
+
const group = new THREE.Group();
|
|
186
|
+
const baseRenderOrder = module.nodeZCounter++;
|
|
187
|
+
// ▼▼▼ [Atlas] Safe access for Atlas mode where textures.selected/default may have null body ▼▼▼
|
|
188
|
+
const active = isSelected ? (textures?.selected || {}) : (textures?.default || {});
|
|
189
|
+
// ▲▲▲ [Atlas] ▲▲▲
|
|
190
|
+
|
|
191
|
+
// ▼▼▼ [Atlas] Glow handling - may be null in Atlas mode ▼▼▼
|
|
192
|
+
if (textures?.glow && textures.glow.texture) {
|
|
193
|
+
const glowData = textures.glow;
|
|
194
|
+
const gWidth = glowData.width / 2;
|
|
195
|
+
const gHeight = glowData.height / 2;
|
|
196
|
+
const gGeo = new THREE.PlaneGeometry(gWidth, gHeight);
|
|
197
|
+
const gMat = new THREE.MeshBasicMaterial({
|
|
198
|
+
map: glowData.texture,
|
|
199
|
+
transparent: true,
|
|
200
|
+
opacity: isSelected ? 0.6 : 0.3,
|
|
201
|
+
color: isSelected ? 0x2563eb : 0x000000,
|
|
202
|
+
depthWrite: false,
|
|
203
|
+
depthTest: true
|
|
204
|
+
});
|
|
205
|
+
const glowMesh = new THREE.Mesh(gGeo, gMat);
|
|
206
|
+
glowMesh.name = 'glow';
|
|
207
|
+
glowMesh.position.set(width / 2, -height / 2, -0.1);
|
|
208
|
+
glowMesh.renderOrder = baseRenderOrder - 5;
|
|
209
|
+
glowMesh.raycast = () => { };
|
|
210
|
+
group.add(glowMesh);
|
|
211
|
+
} else if (!isAtlasMode) {
|
|
212
|
+
// Non-atlas mode without glow - create a placeholder glow
|
|
213
|
+
const gWidth = (width + 40);
|
|
214
|
+
const gHeight = (height + 40);
|
|
215
|
+
const gGeo = new THREE.PlaneGeometry(gWidth, gHeight);
|
|
216
|
+
const gMat = new THREE.MeshBasicMaterial({
|
|
217
|
+
color: 0x000000,
|
|
218
|
+
transparent: true,
|
|
219
|
+
opacity: 0.3,
|
|
220
|
+
depthWrite: false,
|
|
221
|
+
depthTest: true
|
|
222
|
+
});
|
|
223
|
+
const glowMesh = new THREE.Mesh(gGeo, gMat);
|
|
224
|
+
glowMesh.name = 'glow';
|
|
225
|
+
glowMesh.position.set(width / 2, -height / 2, -0.1);
|
|
226
|
+
glowMesh.renderOrder = baseRenderOrder - 5;
|
|
227
|
+
glowMesh.raycast = () => { };
|
|
228
|
+
group.add(glowMesh);
|
|
229
|
+
}
|
|
230
|
+
// ▲▲▲ [Atlas] ▲▲▲
|
|
231
|
+
|
|
232
|
+
// Body
|
|
233
|
+
const bodyGeometry = new THREE.PlaneGeometry(width, height);
|
|
234
|
+
let bodyMaterial;
|
|
235
|
+
|
|
236
|
+
// ▼▼▼ [Atlas] Use atlas texture or individual texture ▼▼▼
|
|
237
|
+
if (isAtlasMode && atlasResult?.uvMap?.body) {
|
|
238
|
+
// Get the atlas texture from the manager
|
|
239
|
+
const uvRect = atlasResult.uvMap.body;
|
|
240
|
+
const atlasTexture = module.atlasManager.getAtlasTexture('body', uvRect.atlasIndex);
|
|
241
|
+
|
|
242
|
+
if (atlasTexture) {
|
|
243
|
+
// Create a material that samples from the atlas
|
|
244
|
+
// For now, use a standard material with a placeholder (full atlas)
|
|
245
|
+
// TODO: Implement proper UV-mapped instanced rendering
|
|
246
|
+
bodyMaterial = new THREE.MeshBasicMaterial({
|
|
247
|
+
map: atlasTexture,
|
|
248
|
+
transparent: true,
|
|
249
|
+
depthWrite: false,
|
|
250
|
+
depthTest: false
|
|
251
|
+
});
|
|
252
|
+
|
|
253
|
+
// Store UV info for potential shader-based rendering later
|
|
254
|
+
bodyGeometry.userData = { uvRect };
|
|
255
|
+
|
|
256
|
+
// Modify UVs to sample only the node's region from the atlas
|
|
257
|
+
const uvAttr = bodyGeometry.attributes.uv;
|
|
258
|
+
for (let i = 0; i < uvAttr.count; i++) {
|
|
259
|
+
const u = uvAttr.getX(i);
|
|
260
|
+
const v = uvAttr.getY(i);
|
|
261
|
+
uvAttr.setXY(
|
|
262
|
+
i,
|
|
263
|
+
uvRect.u + u * uvRect.w,
|
|
264
|
+
uvRect.v + (1 - v) * uvRect.h // Flip V for WebGL coordinates
|
|
265
|
+
);
|
|
266
|
+
}
|
|
267
|
+
uvAttr.needsUpdate = true;
|
|
268
|
+
|
|
269
|
+
console.log(`[ObjectManager] Atlas body UV applied for ${nodeModel.id}: u=${uvRect.u.toFixed(3)}, v=${uvRect.v.toFixed(3)}, w=${uvRect.w.toFixed(3)}, h=${uvRect.h.toFixed(3)}`);
|
|
270
|
+
} else {
|
|
271
|
+
// Fallback to placeholder if atlas texture not ready
|
|
272
|
+
console.warn(`[ObjectManager] Atlas texture not available for ${nodeModel.id}, using placeholder`);
|
|
273
|
+
bodyMaterial = new THREE.MeshBasicMaterial({ color: 0x333333, transparent: true, opacity: 0.5, depthWrite: false, depthTest: false });
|
|
274
|
+
}
|
|
275
|
+
} else {
|
|
276
|
+
// Standard mode: use individual texture
|
|
277
|
+
bodyMaterial = new THREE.MeshBasicMaterial({ map: active.body, transparent: true, depthWrite: false, depthTest: false });
|
|
278
|
+
}
|
|
279
|
+
// ▲▲▲ [Atlas] ▲▲▲
|
|
280
|
+
|
|
281
|
+
const bodyMesh = new THREE.Mesh(bodyGeometry, bodyMaterial);
|
|
282
|
+
bodyMesh.renderOrder = baseRenderOrder;
|
|
283
|
+
bodyMesh.name = 'body';
|
|
284
|
+
bodyMesh.position.set(width / 2, -height / 2, 0);
|
|
285
|
+
bodyMesh.userData.nodeId = nodeModel.id;
|
|
286
|
+
if (isAtlasMode) {
|
|
287
|
+
bodyMesh.userData.isAtlasMode = true;
|
|
288
|
+
bodyMesh.userData.atlasUVRect = atlasResult?.uvMap?.body;
|
|
289
|
+
}
|
|
290
|
+
group.add(bodyMesh);
|
|
291
|
+
|
|
292
|
+
const outlineGeometry = createRoundedRectGeometry(
|
|
293
|
+
width - OUTLINE_SHRINK,
|
|
294
|
+
height - OUTLINE_SHRINK,
|
|
295
|
+
OUTLINE_RADIUS
|
|
296
|
+
);
|
|
297
|
+
const outlineMaterial = new THREE.LineBasicMaterial({
|
|
298
|
+
color: outlineColor,
|
|
299
|
+
transparent: true,
|
|
300
|
+
opacity: 0.5
|
|
301
|
+
});
|
|
302
|
+
const outline = new THREE.LineLoop(outlineGeometry, outlineMaterial);
|
|
303
|
+
outline.name = 'outline';
|
|
304
|
+
outline.position.copy(bodyMesh.position);
|
|
305
|
+
outline.position.z = 0.1;
|
|
306
|
+
outline.visible = isSelected;
|
|
307
|
+
outline.renderOrder = baseRenderOrder + 1;
|
|
308
|
+
group.add(outline);
|
|
309
|
+
|
|
310
|
+
// Tail
|
|
311
|
+
const tailGeometry = new THREE.PlaneGeometry(TAIL_HEIGHT * 2, TAIL_HEIGHT);
|
|
312
|
+
// ▼▼▼ [Atlas] Handle atlas mode where tail texture may not be individual ▼▼▼
|
|
313
|
+
let tailMaterial;
|
|
314
|
+
if (isAtlasMode && !active?.tail) {
|
|
315
|
+
// For atlas mode, use a solid color or atlas tail texture
|
|
316
|
+
tailMaterial = new THREE.MeshBasicMaterial({ color: 0xfefefe, transparent: true, opacity: 0.9, depthWrite: false, depthTest: false });
|
|
317
|
+
} else {
|
|
318
|
+
tailMaterial = new THREE.MeshBasicMaterial({ map: active?.tail, transparent: true, depthWrite: false, depthTest: false });
|
|
319
|
+
}
|
|
320
|
+
// ▲▲▲ [Atlas] ▲▲▲
|
|
321
|
+
const tailMesh = new THREE.Mesh(tailGeometry, tailMaterial);
|
|
322
|
+
tailMesh.renderOrder = baseRenderOrder;
|
|
323
|
+
tailMesh.name = 'tail';
|
|
324
|
+
tailMesh.position.set(width / 2, -height - (TAIL_HEIGHT / 2), 0);
|
|
325
|
+
// ▼▼▼ [New] Add flags for tail click/hover hit-testing ▼▼▼
|
|
326
|
+
tailMesh.userData = { nodeId: nodeModel.id, isTailHandle: true };
|
|
327
|
+
// ▲▲▲ [New] ▲▲▲
|
|
328
|
+
group.add(tailMesh);
|
|
329
|
+
|
|
330
|
+
// ▼▼▼ [Changed] Add eight resize handles (4 corners + 4 edges spanning full length) ▼▼▼
|
|
331
|
+
if (nodeModel.contentType !== 'pdf') {
|
|
332
|
+
// Edge handles span from corner to corner (minus corner handle size)
|
|
333
|
+
const edgeWidthLength = Math.max(10, width - HANDLE_SIZE * 2); // horizontal edge length
|
|
334
|
+
const edgeHeightLength = Math.max(10, height - HANDLE_SIZE * 2); // vertical edge length
|
|
335
|
+
const handles = [
|
|
336
|
+
// Edges first (lower renderOrder, so corners have priority)
|
|
337
|
+
{ name: 'resizeHandle_T', corner: 'T', x: width / 2, y: -HANDLE_SIZE / 2, w: edgeWidthLength, h: HANDLE_SIZE, order: 0 },
|
|
338
|
+
{ name: 'resizeHandle_B', corner: 'B', x: width / 2, y: -height + HANDLE_SIZE / 2, w: edgeWidthLength, h: HANDLE_SIZE, order: 0 },
|
|
339
|
+
{ name: 'resizeHandle_L', corner: 'L', x: HANDLE_SIZE / 2, y: -height / 2, w: HANDLE_SIZE, h: edgeHeightLength, order: 0 },
|
|
340
|
+
{ name: 'resizeHandle_R', corner: 'R', x: width - HANDLE_SIZE / 2, y: -height / 2, w: HANDLE_SIZE, h: edgeHeightLength, order: 0 },
|
|
341
|
+
// Corners last (higher renderOrder, overlays edges)
|
|
342
|
+
{ name: 'resizeHandle_TL', corner: 'TL', x: HANDLE_SIZE / 2, y: -HANDLE_SIZE / 2, w: HANDLE_SIZE, h: HANDLE_SIZE, order: 1 },
|
|
343
|
+
{ name: 'resizeHandle_TR', corner: 'TR', x: width - HANDLE_SIZE / 2, y: -HANDLE_SIZE / 2, w: HANDLE_SIZE, h: HANDLE_SIZE, order: 1 },
|
|
344
|
+
{ name: 'resizeHandle_BL', corner: 'BL', x: HANDLE_SIZE / 2, y: -height + HANDLE_SIZE / 2, w: HANDLE_SIZE, h: HANDLE_SIZE, order: 1 },
|
|
345
|
+
{ name: 'resizeHandle_BR', corner: 'BR', x: width - HANDLE_SIZE / 2, y: -height + HANDLE_SIZE / 2, w: HANDLE_SIZE, h: HANDLE_SIZE, order: 1 }
|
|
346
|
+
];
|
|
347
|
+
handles.forEach(c => {
|
|
348
|
+
const handleGeom = new THREE.PlaneGeometry(c.w, c.h);
|
|
349
|
+
const handleMat = new THREE.MeshBasicMaterial({ color: 0xff0000, transparent: true, opacity: 0.0, depthWrite: false, depthTest: false });
|
|
350
|
+
const handleMesh = new THREE.Mesh(handleGeom, handleMat);
|
|
351
|
+
handleMesh.name = c.name;
|
|
352
|
+
handleMesh.userData = { nodeId: nodeModel.id, isResizeHandle: true, corner: c.corner };
|
|
353
|
+
handleMesh.renderOrder = baseRenderOrder + 1 + c.order; // corners get +2, edges get +1
|
|
354
|
+
handleMesh.position.set(c.x, c.y, 1 + c.order * 0.1); // corners slightly in front
|
|
355
|
+
group.add(handleMesh);
|
|
356
|
+
});
|
|
357
|
+
}
|
|
358
|
+
// ▲▲▲ [Changed] ▲▲▲
|
|
359
|
+
|
|
360
|
+
group.position.set(nodeModel.positionX, nodeModel.positionY, zPos);
|
|
361
|
+
group.userData = { worldWidth: width, worldHeight: height, nodeId: nodeModel.id, baseRenderOrder };
|
|
362
|
+
return group;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
// Expose MindMapObjectManager globally
|
|
367
|
+
window.MindMapObjectManager = {
|
|
368
|
+
createOrUpdateCanvasTextureNode: createOrUpdateCanvasTextureNode
|
|
369
|
+
};
|
|
370
|
+
|
|
371
|
+
console.log('✅ mind-map-object-manager.js loaded (Rounded Outline)');
|
|
372
|
+
})();
|