@pixel-normal-edit/mcp 2.0.10 → 2.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/clear-firebase.js +37 -0
- package/core/command-bus.js +6 -3
- package/core/server.js +98 -3
- package/domains/art-tree/README.md +134 -0
- package/domains/art-tree/REORGANIZATION_PLAN.md +168 -0
- package/domains/art-tree/REORGANIZATION_SUMMARY.md +260 -0
- package/domains/art-tree/index.js +58 -58
- package/domains/art-tree/lessons/3d/box-properties.js +38 -0
- package/domains/art-tree/lessons/3d/cone-properties.js +31 -0
- package/domains/art-tree/lessons/3d/cylinder-properties.js +29 -0
- package/domains/art-tree/lessons/3d/sphere-properties.js +25 -0
- package/domains/art-tree/lessons/advanced/angles.js +30 -0
- package/domains/art-tree/lessons/advanced/distances.js +26 -0
- package/domains/art-tree/lessons/advanced/shape-ratios.js +25 -0
- package/domains/art-tree/lessons/advanced/shape-relationships.js +28 -0
- package/domains/art-tree/lessons/advanced/symmetry-and-axis.js +26 -0
- package/domains/art-tree/{analysis_lessons.js → lessons/analysis/object-analysis.js} +5 -16
- package/domains/art-tree/lessons/basic/circles.js +26 -0
- package/domains/art-tree/lessons/basic/composition.js +34 -0
- package/domains/art-tree/lessons/basic/curves.js +31 -0
- package/domains/art-tree/lessons/basic/ellipses.js +26 -0
- package/domains/art-tree/lessons/basic/freehand.js +19 -0
- package/domains/art-tree/lessons/basic/index.js +36 -0
- package/domains/art-tree/lessons/basic/lines.js +38 -0
- package/domains/art-tree/lessons/basic/parallel-and-intersecting.js +22 -0
- package/domains/art-tree/lessons/basic/polygons.js +25 -0
- package/domains/art-tree/lessons/basic/proportions-and-angles.js +20 -0
- package/domains/art-tree/lessons/basic/spiral.js +21 -0
- package/domains/art-tree/lessons/basic/squares.js +28 -0
- package/domains/art-tree/lessons/basic/strokes.js +23 -0
- package/domains/art-tree/lessons/basic/triangles.js +30 -0
- package/domains/art-tree/lessons/cross-sections/bottle-sections.js +26 -0
- package/domains/art-tree/lessons/cross-sections/glass-sections.js +24 -0
- package/domains/art-tree/lessons/cross-sections/head-sections.js +17 -0
- package/domains/art-tree/lessons/curves/curve-properties.js +50 -0
- package/domains/art-tree/lessons/curves/curve-topology.js +45 -0
- package/domains/art-tree/lessons/curves/curve-types.js +44 -0
- package/domains/art-tree/lessons/ellipses/coaxial-ellipses.js +29 -0
- package/domains/art-tree/lessons/ellipses/ellipse-anatomy.js +26 -0
- package/domains/art-tree/lessons/ellipses/ellipse-orientations.js +28 -0
- package/domains/art-tree/lessons/ellipses/ellipse-proportions.js +27 -0
- package/domains/art-tree/lessons/hidden/hidden-box.js +20 -0
- package/domains/art-tree/lessons/hidden/hidden-cup.js +19 -0
- package/domains/art-tree/lessons/hidden/hidden-head.js +18 -0
- package/domains/art-tree/lessons/index.js +42 -0
- package/domains/art-tree/{layer_lessons.js → lessons/layers/layer-step.js} +5 -16
- package/domains/art-tree/lessons/lighting/contact-shadow.js +33 -0
- package/domains/art-tree/lessons/lighting/light-direction.js +30 -0
- package/domains/art-tree/lessons/lighting/light-zones.js +30 -0
- package/domains/art-tree/lessons/materials/material-glass.js +21 -0
- package/domains/art-tree/lessons/materials/material-shiny.js +26 -0
- package/domains/art-tree/lessons/materials/material-texture.js +26 -0
- package/domains/art-tree/lessons/perspective/1point-perspective.js +30 -0
- package/domains/art-tree/lessons/perspective/2point-perspective.js +30 -0
- package/domains/art-tree/lessons/perspective/3point-perspective.js +45 -0
- package/domains/art-tree/lessons/perspective/foreshortening.js +38 -0
- package/domains/art-tree/lessons/sky/sun-shapes.js +25 -0
- package/domains/art-tree/lessons/sky/sunset-colors.js +27 -0
- package/domains/art-tree/lessons/sky/sunset-sky.js +32 -0
- package/domains/art-tree/{structure_lessons.js → lessons/structure/axis-orientation.js} +3 -53
- package/domains/art-tree/lessons/structure/complex-structure.js +21 -0
- package/domains/art-tree/lessons/structure/x-yzaxes.js +28 -0
- package/domains/art-tree/lessons/surfaces/chair-analysis.js +17 -0
- package/domains/art-tree/lessons/surfaces/cup-analysis.js +18 -0
- package/domains/art-tree/lessons/surfaces/edge-types.js +40 -0
- package/domains/art-tree/lessons/surfaces/surface-types.js +42 -0
- package/domains/art-tree/lessons/transforms/bend.js +27 -0
- package/domains/art-tree/{transform_lessons_2.js → lessons/transforms/combine.js} +3 -54
- package/domains/art-tree/lessons/transforms/cut.js +25 -0
- package/domains/art-tree/lessons/transforms/hollow.js +24 -0
- package/domains/art-tree/lessons/transforms/rotate.js +16 -0
- package/domains/art-tree/lessons/transforms/squash.js +31 -0
- package/domains/art-tree/lessons/transforms/stretch.js +31 -0
- package/domains/art-tree/lessons/transforms/taper-swell.js +33 -0
- package/domains/art-tree/{vocab_lessons.js → lessons/vocab/vocab-house.js} +5 -16
- package/domains/art-tree/lib/tool-register.js +104 -0
- package/domains/art-tree/lib/validators.js +78 -0
- package/domains/art-tree/shapes/grid.js +37 -0
- package/domains/art-tree/shapes/polyline.js +26 -0
- package/domains/art-tree/{3d_tools.js → tools/3d.js} +2 -2
- package/domains/art-tree/{advanced_tools.js → tools/advanced.js} +2 -2
- package/domains/art-tree/{analysis_tools.js → tools/analysis.js} +2 -2
- package/domains/art-tree/{tools.js → tools/basic.js} +3 -3
- package/domains/art-tree/{cross_section_tools.js → tools/cross-sections.js} +2 -2
- package/domains/art-tree/{curve_tools.js → tools/curves.js} +2 -2
- package/domains/art-tree/{ellipse_tools.js → tools/ellipses.js} +2 -2
- package/domains/art-tree/{hidden_tools.js → tools/hidden.js} +2 -2
- package/domains/art-tree/tools/index.js +53 -0
- package/domains/art-tree/{layer_tools.js → tools/layers.js} +2 -2
- package/domains/art-tree/{light_tools.js → tools/lighting.js} +2 -2
- package/domains/art-tree/{material_tools.js → tools/materials.js} +2 -2
- package/domains/art-tree/{perspective_tools.js → tools/perspective.js} +2 -2
- package/domains/art-tree/{sky_tools.js → tools/sky.js} +2 -2
- package/domains/art-tree/{structure_tools.js → tools/structure.js} +2 -2
- package/domains/art-tree/{surface_tools.js → tools/surfaces.js} +2 -2
- package/domains/art-tree/{transform_tools.js → tools/transforms.js} +3 -3
- package/domains/art-tree/{vocab_tools.js → tools/vocab.js} +2 -2
- package/package.json +1 -1
- package/rules/README.md +358 -285
- package/rules/index.js +9 -9
- package/rules/prerequisites.js +121 -64
- package/rules/rules.js +76 -35
- package/rules/workflow.js +270 -56
- package/tools/canvas-tools.js +2 -2
- package/tools/drawing-tools.js +23 -12
- package/tools/workspace-tools.js +5 -4
- package/domains/art-tree/3d_lessons.js +0 -114
- package/domains/art-tree/advanced_lessons.js +0 -124
- package/domains/art-tree/cross_section_lessons.js +0 -65
- package/domains/art-tree/curve_lessons.js +0 -138
- package/domains/art-tree/ellipse_lessons.js +0 -105
- package/domains/art-tree/hidden_lessons.js +0 -55
- package/domains/art-tree/lessons.js +0 -305
- package/domains/art-tree/light_lessons.js +0 -92
- package/domains/art-tree/material_lessons.js +0 -71
- package/domains/art-tree/perspective_lessons.js +0 -138
- package/domains/art-tree/sky_lessons_1.js +0 -82
- package/domains/art-tree/surface_lessons.js +0 -112
- package/domains/art-tree/transform_lessons_1.js +0 -108
- /package/domains/art-tree/{3d_shapes.js → shapes/3d.js} +0 -0
- /package/domains/art-tree/{advanced_shapes.js → shapes/advanced.js} +0 -0
- /package/domains/art-tree/{analysis_shapes.js → shapes/analysis.js} +0 -0
- /package/domains/art-tree/{shapes.js → shapes/basic.js} +0 -0
- /package/domains/art-tree/{cross_section_shapes.js → shapes/cross-sections.js} +0 -0
- /package/domains/art-tree/{curve_shapes.js → shapes/curves.js} +0 -0
- /package/domains/art-tree/{ellipse_shapes.js → shapes/ellipses.js} +0 -0
- /package/domains/art-tree/{hidden_shapes.js → shapes/hidden.js} +0 -0
- /package/domains/art-tree/{layer_shapes.js → shapes/layers.js} +0 -0
- /package/domains/art-tree/{light_shapes.js → shapes/lighting.js} +0 -0
- /package/domains/art-tree/{material_shapes.js → shapes/materials.js} +0 -0
- /package/domains/art-tree/{perspective_shapes.js → shapes/perspective.js} +0 -0
- /package/domains/art-tree/{sky_shapes_1.js → shapes/sky.js} +0 -0
- /package/domains/art-tree/{structure_shapes.js → shapes/structure.js} +0 -0
- /package/domains/art-tree/{surface_shapes.js → shapes/surfaces.js} +0 -0
- /package/domains/art-tree/{transform_shapes.js → shapes/transforms.js} +0 -0
- /package/domains/art-tree/{vocab_shapes.js → shapes/vocab.js} +0 -0
|
@@ -1,112 +0,0 @@
|
|
|
1
|
-
const shapes = require('./shapes');
|
|
2
|
-
const surfaceShapes = require('./surface_shapes');
|
|
3
|
-
|
|
4
|
-
/**
|
|
5
|
-
* Lesson: Surface Types (Flat, convex, concave)
|
|
6
|
-
*/
|
|
7
|
-
function lessonSurfaceTypes(canvasSize = 32, color = '#2196f3') {
|
|
8
|
-
const commands = [];
|
|
9
|
-
const midY = Math.floor(canvasSize / 2);
|
|
10
|
-
const qX = Math.floor(canvasSize / 4);
|
|
11
|
-
const r = Math.floor(canvasSize * 0.15);
|
|
12
|
-
|
|
13
|
-
// 1. Flat Plane
|
|
14
|
-
const w = Math.floor(canvasSize * 0.2);
|
|
15
|
-
commands.push(shapes.drawRectangle(qX - w/2, midY - w/2, w, w, '#4caf50', false));
|
|
16
|
-
// Add some grid lines to show it's flat
|
|
17
|
-
commands.push(shapes.drawLine(qX, midY - w/2, qX, midY + w/2, '#4caf50'));
|
|
18
|
-
commands.push(shapes.drawLine(qX - w/2, midY, qX + w/2, midY, '#4caf50'));
|
|
19
|
-
|
|
20
|
-
// 2. Convex Surface (e.g. Dome/Sphere)
|
|
21
|
-
// We use an ellipse that curves outwards (downwards)
|
|
22
|
-
commands.push(shapes.drawEllipse(qX * 2, midY, r, r, '#ff9800', false));
|
|
23
|
-
// Cross contour curving DOWN (convex towards viewer)
|
|
24
|
-
commands.push(shapes.drawEllipse(qX * 2, midY + Math.floor(r*0.2), r, Math.floor(r*0.3), '#ff9800', false));
|
|
25
|
-
|
|
26
|
-
// 3. Concave Surface (e.g. Bowl)
|
|
27
|
-
// Draw the top rim of a bowl
|
|
28
|
-
commands.push(shapes.drawEllipse(qX * 3, midY, r, Math.floor(r*0.3), '#9c27b0', false));
|
|
29
|
-
// Draw the bottom curve (the inside of the bowl)
|
|
30
|
-
const bowlPoints = [];
|
|
31
|
-
for(let i=0; i<=18; i++) {
|
|
32
|
-
const a = (i/18) * Math.PI; // 0 to 180 degrees (bottom half)
|
|
33
|
-
bowlPoints.push({ x: Math.round(qX * 3 + r * Math.cos(a)), y: Math.round(midY + r * Math.sin(a)) });
|
|
34
|
-
}
|
|
35
|
-
commands.push(shapes.drawPolyline(bowlPoints, '#9c27b0'));
|
|
36
|
-
|
|
37
|
-
return commands;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
/**
|
|
41
|
-
* Lesson: Edge Types (Hard sharp corners vs Soft rounded edges)
|
|
42
|
-
*/
|
|
43
|
-
function lessonEdgeTypes(canvasSize = 32, color = '#ff5722') {
|
|
44
|
-
const commands = [];
|
|
45
|
-
const qX1 = Math.floor(canvasSize * 0.3);
|
|
46
|
-
const qX2 = Math.floor(canvasSize * 0.7);
|
|
47
|
-
const midY = Math.floor(canvasSize / 2);
|
|
48
|
-
const w = Math.floor(canvasSize * 0.25);
|
|
49
|
-
|
|
50
|
-
// 1. Hard Edge (Sharp corners)
|
|
51
|
-
commands.push(shapes.drawRectangle(qX1 - w/2, midY - w/2, w, w, '#e91e63', false));
|
|
52
|
-
|
|
53
|
-
// 2. Soft Edge / Transitional
|
|
54
|
-
// Draw a box with rounded corners (fillet)
|
|
55
|
-
const r = Math.floor(w * 0.2); // Corner radius
|
|
56
|
-
const rx = qX2 - w/2;
|
|
57
|
-
const ry = midY - w/2;
|
|
58
|
-
|
|
59
|
-
// Straight segments
|
|
60
|
-
commands.push(shapes.drawLine(rx + r, ry, rx + w - r, ry, '#00bcd4')); // Top
|
|
61
|
-
commands.push(shapes.drawLine(rx + w, ry + r, rx + w, ry + w - r, '#00bcd4')); // Right
|
|
62
|
-
commands.push(shapes.drawLine(rx + r, ry + w, rx + w - r, ry + w, '#00bcd4')); // Bottom
|
|
63
|
-
commands.push(shapes.drawLine(rx, ry + r, rx, ry + w - r, '#00bcd4')); // Left
|
|
64
|
-
|
|
65
|
-
// Rounded corners (approximated with small circles for visual simplicity)
|
|
66
|
-
commands.push(shapes.drawCircle(rx + r, ry + r, r, '#00bcd4', false)); // TL
|
|
67
|
-
commands.push(shapes.drawCircle(rx + w - r, ry + r, r, '#00bcd4', false)); // TR
|
|
68
|
-
commands.push(shapes.drawCircle(rx + w - r, ry + w - r, r, '#00bcd4', false)); // BR
|
|
69
|
-
commands.push(shapes.drawCircle(rx + r, ry + w - r, r, '#00bcd4', false)); // BL
|
|
70
|
-
|
|
71
|
-
return commands;
|
|
72
|
-
}
|
|
73
|
-
|
|
74
|
-
/**
|
|
75
|
-
* Lesson: Cup Analysis (Analyzing surfaces of a cup)
|
|
76
|
-
*/
|
|
77
|
-
function lessonCupAnalysis(canvasSize = 32, color = '#607d8b') {
|
|
78
|
-
const cx = Math.floor(canvasSize / 2);
|
|
79
|
-
const cy = Math.floor(canvasSize / 2);
|
|
80
|
-
const r = Math.floor(canvasSize * 0.2);
|
|
81
|
-
const h = Math.floor(canvasSize * 0.4);
|
|
82
|
-
|
|
83
|
-
return surfaceShapes.drawCupAnalysis(cx, cy, r, h);
|
|
84
|
-
}
|
|
85
|
-
|
|
86
|
-
/**
|
|
87
|
-
* Lesson: Chair Analysis (Analyzing surfaces and edges of a chair)
|
|
88
|
-
*/
|
|
89
|
-
function lessonChairAnalysis(canvasSize = 32, color = '#795548') {
|
|
90
|
-
const cx = Math.floor(canvasSize / 2);
|
|
91
|
-
const cy = Math.floor(canvasSize / 2);
|
|
92
|
-
const w = Math.floor(canvasSize * 0.3);
|
|
93
|
-
|
|
94
|
-
return surfaceShapes.drawChairAnalysis(cx, cy, w);
|
|
95
|
-
}
|
|
96
|
-
|
|
97
|
-
function getSurfaceLessonCatalog() {
|
|
98
|
-
return [
|
|
99
|
-
{ id: 'surface_types', name: 'Surface Types', description: 'Flat, Convex, Concave planes', fn: lessonSurfaceTypes },
|
|
100
|
-
{ id: 'edge_types', name: 'Edge Types', description: 'Hard vs Soft (Transitional) edges', fn: lessonEdgeTypes },
|
|
101
|
-
{ id: 'surface_cup', name: 'Cup Analysis', description: 'Real object: Convex/Concave walls, Rim, Tube handle', fn: lessonCupAnalysis },
|
|
102
|
-
{ id: 'surface_chair', name: 'Chair Analysis', description: 'Real object: Flat planes, Hard edges, Cylindrical legs', fn: lessonChairAnalysis },
|
|
103
|
-
];
|
|
104
|
-
}
|
|
105
|
-
|
|
106
|
-
module.exports = {
|
|
107
|
-
lessonSurfaceTypes,
|
|
108
|
-
lessonEdgeTypes,
|
|
109
|
-
lessonCupAnalysis,
|
|
110
|
-
lessonChairAnalysis,
|
|
111
|
-
getSurfaceLessonCatalog
|
|
112
|
-
};
|
|
@@ -1,108 +0,0 @@
|
|
|
1
|
-
const shapes = require('./shapes');
|
|
2
|
-
const transformShapes = require('./transform_shapes');
|
|
3
|
-
const csShapes = require('./cross_section_shapes');
|
|
4
|
-
|
|
5
|
-
/**
|
|
6
|
-
* Lesson: Stretch (Elongate)
|
|
7
|
-
* Sphere -> Egg, Box -> Bar
|
|
8
|
-
*/
|
|
9
|
-
function lessonStretch(canvasSize = 32, color = '#2196f3') {
|
|
10
|
-
const commands = [];
|
|
11
|
-
const qX1 = Math.floor(canvasSize * 0.25);
|
|
12
|
-
const qX2 = Math.floor(canvasSize * 0.75);
|
|
13
|
-
const cy = Math.floor(canvasSize / 2);
|
|
14
|
-
const r = Math.floor(canvasSize * 0.15);
|
|
15
|
-
|
|
16
|
-
// 1. Stretch: Sphere -> Egg
|
|
17
|
-
commands.push(shapes.drawCircle(qX1, cy, r, '#bdbdbd', false)); // Original sphere (ghost)
|
|
18
|
-
commands.push(...transformShapes.drawEgg(qX1, cy, r, color)); // Stretched into egg
|
|
19
|
-
|
|
20
|
-
// 2. Stretch: Box -> Bar (Tall)
|
|
21
|
-
const w = Math.floor(canvasSize * 0.15);
|
|
22
|
-
// Original box (ghost)
|
|
23
|
-
commands.push(shapes.drawRectangle(qX2 - w/2, cy - w/2, w, w, '#bdbdbd', false));
|
|
24
|
-
// Stretched bar
|
|
25
|
-
commands.push(shapes.drawRectangle(qX2 - w/2, cy - w * 1.5, w, w * 3, '#9c27b0', false));
|
|
26
|
-
|
|
27
|
-
return commands;
|
|
28
|
-
}
|
|
29
|
-
|
|
30
|
-
/**
|
|
31
|
-
* Lesson: Squash (Compress)
|
|
32
|
-
* Sphere -> Disk, Box -> Plate
|
|
33
|
-
*/
|
|
34
|
-
function lessonSquash(canvasSize = 32, color = '#ff9800') {
|
|
35
|
-
const commands = [];
|
|
36
|
-
const qX1 = Math.floor(canvasSize * 0.25);
|
|
37
|
-
const qX2 = Math.floor(canvasSize * 0.75);
|
|
38
|
-
const cy = Math.floor(canvasSize / 2);
|
|
39
|
-
const r = Math.floor(canvasSize * 0.15);
|
|
40
|
-
|
|
41
|
-
// 1. Squash: Sphere -> Disk
|
|
42
|
-
commands.push(shapes.drawCircle(qX1, cy, r, '#bdbdbd', false)); // Original
|
|
43
|
-
// Squashed into a flat ellipse/disk
|
|
44
|
-
commands.push(shapes.drawEllipse(qX1, cy, r * 1.2, Math.floor(r * 0.3), color, false));
|
|
45
|
-
|
|
46
|
-
// 2. Squash: Box -> Plate
|
|
47
|
-
const w = Math.floor(canvasSize * 0.2);
|
|
48
|
-
commands.push(shapes.drawRectangle(qX2 - w/2, cy - w/2, w, w, '#bdbdbd', false)); // Original
|
|
49
|
-
// Squashed into plate
|
|
50
|
-
commands.push(shapes.drawRectangle(qX2 - w, cy - Math.floor(w*0.2), w * 2, Math.floor(w*0.4), '#4caf50', false));
|
|
51
|
-
|
|
52
|
-
return commands;
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
/**
|
|
56
|
-
* Lesson: Taper & Swell (Narrow or bulge)
|
|
57
|
-
* Cylinder -> Bottle
|
|
58
|
-
*/
|
|
59
|
-
function lessonTaperSwell(canvasSize = 32, color = '#00bcd4') {
|
|
60
|
-
const commands = [];
|
|
61
|
-
const cx = Math.floor(canvasSize / 2);
|
|
62
|
-
const totalH = Math.floor(canvasSize * 0.8);
|
|
63
|
-
const topY = Math.floor(canvasSize * 0.1);
|
|
64
|
-
const bottomY = topY + totalH;
|
|
65
|
-
const r = Math.floor(canvasSize * 0.25);
|
|
66
|
-
|
|
67
|
-
// Original Cylinder (ghost)
|
|
68
|
-
commands.push(shapes.drawLine(cx - r, topY, cx - r, bottomY, '#bdbdbd'));
|
|
69
|
-
commands.push(shapes.drawLine(cx + r, topY, cx + r, bottomY, '#bdbdbd'));
|
|
70
|
-
|
|
71
|
-
// Tapered and Swelled form (Bottle)
|
|
72
|
-
const sections = [
|
|
73
|
-
{ y: topY, r: Math.floor(r * 0.3) }, // Neck (Tapered)
|
|
74
|
-
{ y: topY + Math.floor(totalH * 0.4), r: r },// Body (Swelled back to original radius)
|
|
75
|
-
{ y: bottomY, r: Math.floor(r * 0.8) } // Base (Slightly tapered)
|
|
76
|
-
];
|
|
77
|
-
commands.push(...csShapes.drawLoftedForm(cx, topY, bottomY, sections, color, true));
|
|
78
|
-
|
|
79
|
-
return commands;
|
|
80
|
-
}
|
|
81
|
-
|
|
82
|
-
/**
|
|
83
|
-
* Lesson: Bend (Curved bending)
|
|
84
|
-
* Cylinder -> Bent Tube
|
|
85
|
-
*/
|
|
86
|
-
function lessonBend(canvasSize = 32, color = '#e91e63') {
|
|
87
|
-
const commands = [];
|
|
88
|
-
const cx = Math.floor(canvasSize / 2);
|
|
89
|
-
const cy = Math.floor(canvasSize / 2);
|
|
90
|
-
const r = Math.floor(canvasSize * 0.1);
|
|
91
|
-
const length = Math.floor(canvasSize * 0.35);
|
|
92
|
-
|
|
93
|
-
// Original straight tube (ghost, pointing right)
|
|
94
|
-
commands.push(shapes.drawLine(cx, cy - r, cx + length * 2, cy - r, '#bdbdbd'));
|
|
95
|
-
commands.push(shapes.drawLine(cx, cy + r, cx + length * 2, cy + r, '#bdbdbd'));
|
|
96
|
-
|
|
97
|
-
// Bent tube
|
|
98
|
-
commands.push(...transformShapes.drawBentTube(cx, cy + length, r, length, color));
|
|
99
|
-
|
|
100
|
-
return commands;
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
module.exports = {
|
|
104
|
-
lessonStretch,
|
|
105
|
-
lessonSquash,
|
|
106
|
-
lessonTaperSwell,
|
|
107
|
-
lessonBend
|
|
108
|
-
};
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|