freeform-modeling-mcp 1.0.26
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 +61 -0
- package/index.cjs +21 -0
- package/package.json +48 -0
- package/src/cli.ts +47 -0
- package/src/commands/start.ts +88 -0
- package/src/commands/status.ts +81 -0
- package/src/dev.ts +24 -0
- package/src/lib/fileproxy/index.ts +505 -0
- package/src/lib/fileproxy/proxy-server.js +347 -0
- package/src/lib/gltf2obj/compress.js +33 -0
- package/src/lib/gltf2obj/engine/core/core.js +34 -0
- package/src/lib/gltf2obj/engine/core/eventnotifier.js +39 -0
- package/src/lib/gltf2obj/engine/core/taskrunner.js +88 -0
- package/src/lib/gltf2obj/engine/export/exporter.js +38 -0
- package/src/lib/gltf2obj/engine/export/exporterbase.js +86 -0
- package/src/lib/gltf2obj/engine/export/exportermodel.js +117 -0
- package/src/lib/gltf2obj/engine/export/exporterobj.js +147 -0
- package/src/lib/gltf2obj/engine/geometry/box3d.js +60 -0
- package/src/lib/gltf2obj/engine/geometry/coord2d.js +35 -0
- package/src/lib/gltf2obj/engine/geometry/coord3d.js +126 -0
- package/src/lib/gltf2obj/engine/geometry/coord4d.js +15 -0
- package/src/lib/gltf2obj/engine/geometry/geometry.js +56 -0
- package/src/lib/gltf2obj/engine/geometry/matrix.js +440 -0
- package/src/lib/gltf2obj/engine/geometry/octree.js +160 -0
- package/src/lib/gltf2obj/engine/geometry/quaternion.js +83 -0
- package/src/lib/gltf2obj/engine/geometry/transformation.js +63 -0
- package/src/lib/gltf2obj/engine/geometry/tween.js +31 -0
- package/src/lib/gltf2obj/engine/import/importer.js +270 -0
- package/src/lib/gltf2obj/engine/import/importerbase.js +115 -0
- package/src/lib/gltf2obj/engine/import/importerfiles.js +139 -0
- package/src/lib/gltf2obj/engine/import/importergltf.js +1045 -0
- package/src/lib/gltf2obj/engine/import/importerutils.js +102 -0
- package/src/lib/gltf2obj/engine/io/binaryreader.js +93 -0
- package/src/lib/gltf2obj/engine/io/binarywriter.js +92 -0
- package/src/lib/gltf2obj/engine/io/bufferutils.js +85 -0
- package/src/lib/gltf2obj/engine/io/externallibs.js +42 -0
- package/src/lib/gltf2obj/engine/io/fileutils.js +120 -0
- package/src/lib/gltf2obj/engine/io/textwriter.js +41 -0
- package/src/lib/gltf2obj/engine/main.js +19 -0
- package/src/lib/gltf2obj/engine/model/color.js +130 -0
- package/src/lib/gltf2obj/engine/model/generator.js +433 -0
- package/src/lib/gltf2obj/engine/model/material.js +243 -0
- package/src/lib/gltf2obj/engine/model/mesh.js +173 -0
- package/src/lib/gltf2obj/engine/model/meshbuffer.js +233 -0
- package/src/lib/gltf2obj/engine/model/meshinstance.js +128 -0
- package/src/lib/gltf2obj/engine/model/meshutils.js +64 -0
- package/src/lib/gltf2obj/engine/model/model.js +195 -0
- package/src/lib/gltf2obj/engine/model/modelfinalization.js +377 -0
- package/src/lib/gltf2obj/engine/model/modelutils.js +117 -0
- package/src/lib/gltf2obj/engine/model/node.js +178 -0
- package/src/lib/gltf2obj/engine/model/object.js +90 -0
- package/src/lib/gltf2obj/engine/model/property.js +86 -0
- package/src/lib/gltf2obj/engine/model/quantities.js +46 -0
- package/src/lib/gltf2obj/engine/model/topology.js +139 -0
- package/src/lib/gltf2obj/engine/model/triangle.js +99 -0
- package/src/lib/gltf2obj/engine/threejs/threemodelloader.js +85 -0
- package/src/lib/gltf2obj/handler.js +63 -0
- package/src/lib/gltf2obj/index.js +47 -0
- package/src/lib/logger.ts +304 -0
- package/src/lib/print.ts +37 -0
- package/src/lib/utils.ts +34 -0
- package/src/lib/wsbridge/bridge.ts +639 -0
- package/src/lib/wsbridge/lock.ts +258 -0
- package/src/llmClient.ts +245 -0
- package/src/prompt.ts +187 -0
- package/src/server.ts +125 -0
- package/src/tools/assets-tool.ts +314 -0
- package/src/tools/basic-tools.ts +531 -0
- package/src/tools/index.ts +2 -0
- package/src/tools/material-tools.ts +88 -0
- package/src/tools/modeling/auxiliary-curve-tool.ts +44 -0
- package/src/tools/modeling/find-face.ts +38 -0
- package/src/tools/modeling/sweep-tool.ts +60 -0
- package/src/tools/modeling/utils.ts +181 -0
- package/src/tools/modeling-tools.ts +135 -0
- package/src/tools/screenshot-tools.ts +107 -0
- package/src/tools/tools-info.ts +107 -0
- package/src/tools/tripo3d-tools.ts +496 -0
- package/src/types/index.ts +25 -0
- package/src/types/tripo3d.ts +38 -0
- package/tsconfig.json +22 -0
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { TransformMesh } from './meshutils.js';
|
|
2
|
+
import { ModelObject3D } from './object.js';
|
|
3
|
+
|
|
4
|
+
export class MeshInstanceId
|
|
5
|
+
{
|
|
6
|
+
constructor (nodeId, meshIndex)
|
|
7
|
+
{
|
|
8
|
+
this.nodeId = nodeId;
|
|
9
|
+
this.meshIndex = meshIndex;
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
IsEqual (rhs)
|
|
13
|
+
{
|
|
14
|
+
return this.nodeId === rhs.nodeId && this.meshIndex === rhs.meshIndex;
|
|
15
|
+
}
|
|
16
|
+
|
|
17
|
+
GetKey ()
|
|
18
|
+
{
|
|
19
|
+
return this.nodeId.toString () + ':' + this.meshIndex.toString ();
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
export class MeshInstance extends ModelObject3D
|
|
24
|
+
{
|
|
25
|
+
constructor (id, node, mesh)
|
|
26
|
+
{
|
|
27
|
+
super ();
|
|
28
|
+
this.id = id;
|
|
29
|
+
this.node = node;
|
|
30
|
+
this.mesh = mesh;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
GetId ()
|
|
34
|
+
{
|
|
35
|
+
return this.id;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
GetTransformation ()
|
|
39
|
+
{
|
|
40
|
+
return this.node.GetWorldTransformation ();
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
GetMesh ()
|
|
44
|
+
{
|
|
45
|
+
return this.mesh;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
VertexCount ()
|
|
49
|
+
{
|
|
50
|
+
return this.mesh.VertexCount ();
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
VertexColorCount ()
|
|
54
|
+
{
|
|
55
|
+
return this.mesh.VertexColorCount ();
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
NormalCount ()
|
|
59
|
+
{
|
|
60
|
+
return this.mesh.NormalCount ();
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
TextureUVCount ()
|
|
64
|
+
{
|
|
65
|
+
return this.mesh.TextureUVCount ();
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
TriangleCount ()
|
|
69
|
+
{
|
|
70
|
+
return this.mesh.TriangleCount ();
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
EnumerateVertices (onVertex)
|
|
74
|
+
{
|
|
75
|
+
let transformation = this.node.GetWorldTransformation ();
|
|
76
|
+
if (transformation.IsIdentity ()) {
|
|
77
|
+
this.mesh.EnumerateVertices (onVertex);
|
|
78
|
+
} else {
|
|
79
|
+
this.mesh.EnumerateVertices ((vertex) => {
|
|
80
|
+
const transformed = transformation.TransformCoord3D (vertex);
|
|
81
|
+
onVertex (transformed);
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
EnumerateTriangleVertexIndices (onTriangleVertexIndices)
|
|
87
|
+
{
|
|
88
|
+
this.mesh.EnumerateTriangleVertexIndices (onTriangleVertexIndices);
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
EnumerateTriangleVertices (onTriangleVertices)
|
|
92
|
+
{
|
|
93
|
+
let transformation = this.node.GetWorldTransformation ();
|
|
94
|
+
if (transformation.IsIdentity ()) {
|
|
95
|
+
this.mesh.EnumerateTriangleVertices (onTriangleVertices);
|
|
96
|
+
} else {
|
|
97
|
+
this.mesh.EnumerateTriangleVertices ((v0, v1, v2) => {
|
|
98
|
+
const v0Transformed = transformation.TransformCoord3D (v0);
|
|
99
|
+
const v1Transformed = transformation.TransformCoord3D (v1);
|
|
100
|
+
const v2Transformed = transformation.TransformCoord3D (v2);
|
|
101
|
+
onTriangleVertices (v0Transformed, v1Transformed, v2Transformed);
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
PropertyGroupCount ()
|
|
107
|
+
{
|
|
108
|
+
return this.mesh.PropertyGroupCount ();
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
AddPropertyGroup (propertyGroup)
|
|
112
|
+
{
|
|
113
|
+
return this.mesh.AddPropertyGroup (propertyGroup);
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
GetPropertyGroup (index)
|
|
117
|
+
{
|
|
118
|
+
return this.mesh.GetPropertyGroup (index);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
GetTransformedMesh ()
|
|
122
|
+
{
|
|
123
|
+
let transformation = this.node.GetWorldTransformation ();
|
|
124
|
+
let transformed = this.mesh.Clone ();
|
|
125
|
+
TransformMesh (transformed, transformation);
|
|
126
|
+
return transformed;
|
|
127
|
+
}
|
|
128
|
+
}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
import { CrossVector3D, SubCoord3D } from '../geometry/coord3d.js';
|
|
2
|
+
import { Transformation } from '../geometry/transformation.js';
|
|
3
|
+
|
|
4
|
+
export const MeshType =
|
|
5
|
+
{
|
|
6
|
+
Empty : 0,
|
|
7
|
+
TriangleMesh : 1
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export function GetMeshType (mesh)
|
|
11
|
+
{
|
|
12
|
+
if (mesh.TriangleCount () > 0) {
|
|
13
|
+
return MeshType.TriangleMesh;
|
|
14
|
+
}
|
|
15
|
+
return MeshType.Empty;
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
export function CalculateTriangleNormal (v0, v1, v2)
|
|
19
|
+
{
|
|
20
|
+
let v = SubCoord3D (v1, v0);
|
|
21
|
+
let w = SubCoord3D (v2, v0);
|
|
22
|
+
let normal = CrossVector3D (v, w);
|
|
23
|
+
normal.Normalize ();
|
|
24
|
+
return normal;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function TransformMesh (mesh, transformation)
|
|
28
|
+
{
|
|
29
|
+
if (transformation.IsIdentity ()) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
for (let i = 0; i < mesh.VertexCount (); i++) {
|
|
34
|
+
let vertex = mesh.GetVertex (i);
|
|
35
|
+
let transformed = transformation.TransformCoord3D (vertex);
|
|
36
|
+
vertex.x = transformed.x;
|
|
37
|
+
vertex.y = transformed.y;
|
|
38
|
+
vertex.z = transformed.z;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
if (mesh.NormalCount () > 0) {
|
|
42
|
+
let normalMatrix = transformation.GetMatrix ().InvertTranspose ();
|
|
43
|
+
if (normalMatrix !== null) {
|
|
44
|
+
let normalTransformation = new Transformation (normalMatrix);
|
|
45
|
+
for (let i = 0; i < mesh.NormalCount (); i++) {
|
|
46
|
+
let normal = mesh.GetNormal (i);
|
|
47
|
+
let transformed = normalTransformation.TransformCoord3D (normal);
|
|
48
|
+
normal.x = transformed.x;
|
|
49
|
+
normal.y = transformed.y;
|
|
50
|
+
normal.z = transformed.z;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export function FlipMeshTrianglesOrientation (mesh)
|
|
57
|
+
{
|
|
58
|
+
for (let i = 0; i < mesh.TriangleCount (); i++) {
|
|
59
|
+
let triangle = mesh.GetTriangle (i);
|
|
60
|
+
let tmp = triangle.v1;
|
|
61
|
+
triangle.v1 = triangle.v2;
|
|
62
|
+
triangle.v2 = tmp;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
@@ -0,0 +1,195 @@
|
|
|
1
|
+
import { MeshInstance, MeshInstanceId } from './meshinstance.js';
|
|
2
|
+
import { Node } from './node.js';
|
|
3
|
+
import { ModelObject3D } from './object.js';
|
|
4
|
+
|
|
5
|
+
export class Model extends ModelObject3D
|
|
6
|
+
{
|
|
7
|
+
constructor ()
|
|
8
|
+
{
|
|
9
|
+
super ();
|
|
10
|
+
this.root = new Node ();
|
|
11
|
+
this.materials = [];
|
|
12
|
+
this.meshes = [];
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
GetRootNode ()
|
|
16
|
+
{
|
|
17
|
+
return this.root;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
MaterialCount ()
|
|
21
|
+
{
|
|
22
|
+
return this.materials.length;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
MeshCount ()
|
|
26
|
+
{
|
|
27
|
+
return this.meshes.length;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
MeshInstanceCount ()
|
|
31
|
+
{
|
|
32
|
+
let count = 0;
|
|
33
|
+
this.root.Enumerate ((node) => {
|
|
34
|
+
count += node.MeshIndexCount ();
|
|
35
|
+
});
|
|
36
|
+
return count;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
VertexCount ()
|
|
40
|
+
{
|
|
41
|
+
let count = 0;
|
|
42
|
+
this.EnumerateMeshInstances ((meshInstance) => {
|
|
43
|
+
count += meshInstance.VertexCount ();
|
|
44
|
+
});
|
|
45
|
+
return count;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
VertexColorCount ()
|
|
49
|
+
{
|
|
50
|
+
let count = 0;
|
|
51
|
+
this.EnumerateMeshInstances ((meshInstance) => {
|
|
52
|
+
count += meshInstance.VertexColorCount ();
|
|
53
|
+
});
|
|
54
|
+
return count;
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
NormalCount ()
|
|
58
|
+
{
|
|
59
|
+
let count = 0;
|
|
60
|
+
this.EnumerateMeshInstances ((meshInstance) => {
|
|
61
|
+
count += meshInstance.NormalCount ();
|
|
62
|
+
});
|
|
63
|
+
return count;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
TextureUVCount ()
|
|
67
|
+
{
|
|
68
|
+
let count = 0;
|
|
69
|
+
this.EnumerateMeshInstances ((meshInstance) => {
|
|
70
|
+
count += meshInstance.TextureUVCount ();
|
|
71
|
+
});
|
|
72
|
+
return count;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
TriangleCount ()
|
|
76
|
+
{
|
|
77
|
+
let count = 0;
|
|
78
|
+
this.EnumerateMeshInstances ((meshInstance) => {
|
|
79
|
+
count += meshInstance.TriangleCount ();
|
|
80
|
+
});
|
|
81
|
+
return count;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
AddMaterial (material)
|
|
85
|
+
{
|
|
86
|
+
this.materials.push (material);
|
|
87
|
+
return this.materials.length - 1;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
GetMaterial (index)
|
|
91
|
+
{
|
|
92
|
+
return this.materials[index];
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
AddMesh (mesh)
|
|
96
|
+
{
|
|
97
|
+
this.meshes.push (mesh);
|
|
98
|
+
return this.meshes.length - 1;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
AddMeshToRootNode (mesh)
|
|
102
|
+
{
|
|
103
|
+
const meshIndex = this.AddMesh (mesh);
|
|
104
|
+
this.root.AddMeshIndex (meshIndex);
|
|
105
|
+
return meshIndex;
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
RemoveMesh (index)
|
|
109
|
+
{
|
|
110
|
+
this.meshes.splice (index, 1);
|
|
111
|
+
this.root.Enumerate ((node) => {
|
|
112
|
+
for (let i = 0; i < node.meshIndices.length; i++) {
|
|
113
|
+
if (node.meshIndices[i] === index) {
|
|
114
|
+
node.meshIndices.splice (i, 1);
|
|
115
|
+
i -= 1;
|
|
116
|
+
} else if (node.meshIndices[i] > index) {
|
|
117
|
+
node.meshIndices[i] -= 1;
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
});
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
GetMesh (index)
|
|
124
|
+
{
|
|
125
|
+
return this.meshes[index];
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
GetMeshInstance (instanceId)
|
|
129
|
+
{
|
|
130
|
+
let foundNode = null;
|
|
131
|
+
this.root.Enumerate ((node) => {
|
|
132
|
+
if (node.GetId () === instanceId.nodeId) {
|
|
133
|
+
foundNode = node;
|
|
134
|
+
}
|
|
135
|
+
});
|
|
136
|
+
if (foundNode === null) {
|
|
137
|
+
return null;
|
|
138
|
+
}
|
|
139
|
+
const nodeMeshIndices = foundNode.GetMeshIndices ();
|
|
140
|
+
if (nodeMeshIndices.indexOf (instanceId.meshIndex) === -1) {
|
|
141
|
+
return null;
|
|
142
|
+
}
|
|
143
|
+
let foundMesh = this.GetMesh (instanceId.meshIndex);
|
|
144
|
+
let id = new MeshInstanceId (foundNode.GetId (), instanceId.meshIndex);
|
|
145
|
+
return new MeshInstance (id, foundNode, foundMesh);
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
EnumerateMeshes (onMesh)
|
|
149
|
+
{
|
|
150
|
+
for (const mesh of this.meshes) {
|
|
151
|
+
onMesh (mesh);
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
EnumerateMeshInstances (onMeshInstance)
|
|
156
|
+
{
|
|
157
|
+
this.root.Enumerate ((node) => {
|
|
158
|
+
for (let meshIndex of node.GetMeshIndices ()) {
|
|
159
|
+
let id = new MeshInstanceId (node.GetId (), meshIndex);
|
|
160
|
+
let mesh = this.GetMesh (meshIndex);
|
|
161
|
+
let meshInstance = new MeshInstance (id, node, mesh);
|
|
162
|
+
onMeshInstance (meshInstance);
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
}
|
|
166
|
+
|
|
167
|
+
EnumerateTransformedMeshes (onMesh)
|
|
168
|
+
{
|
|
169
|
+
this.EnumerateMeshInstances ((meshInstance) => {
|
|
170
|
+
const transformed = meshInstance.GetTransformedMesh ();
|
|
171
|
+
onMesh (transformed);
|
|
172
|
+
});
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
EnumerateVertices (onVertex)
|
|
176
|
+
{
|
|
177
|
+
this.EnumerateMeshInstances ((meshInstance) => {
|
|
178
|
+
meshInstance.EnumerateVertices (onVertex);
|
|
179
|
+
});
|
|
180
|
+
}
|
|
181
|
+
|
|
182
|
+
EnumerateTriangleVertexIndices (onTriangleVertexIndices)
|
|
183
|
+
{
|
|
184
|
+
this.EnumerateMeshInstances ((meshInstance) => {
|
|
185
|
+
meshInstance.EnumerateTriangleVertexIndices (onTriangleVertexIndices);
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
EnumerateTriangleVertices (onTriangleVertices)
|
|
190
|
+
{
|
|
191
|
+
this.EnumerateMeshInstances ((meshInstance) => {
|
|
192
|
+
meshInstance.EnumerateTriangleVertices (onTriangleVertices);
|
|
193
|
+
});
|
|
194
|
+
}
|
|
195
|
+
}
|