add spline component controls

This commit is contained in:
John Alanbrook 2023-12-13 14:06:24 +00:00
parent 903ffbc607
commit e06d12213f
2 changed files with 21 additions and 28 deletions

View file

@ -551,9 +551,10 @@ polygon2d.inputs['C-b'].doc = "Freeze mirroring in place.";
component.edge2d = Object.copy(collider2d, { component.edge2d = Object.copy(collider2d, {
dimensions:2, dimensions:2,
thickness:0, thickness:0,
/* if type === -1, point to point */
type: Spline.type.catmull, type: Spline.type.catmull,
looped: false, looped: false,
angle: 3, angle: 3, /* maximum angle between two segments */
flipx: false, flipx: false,
flipy: false, flipy: false,
@ -603,8 +604,13 @@ component.edge2d = Object.copy(collider2d, {
this.cpoints = []; this.cpoints = [];
}, },
sample(n) { sample() {
var spoints = this.spoints(); var spoints = this.spoints();
if (this.type === -1) {
if (this.looped) spoints.push(spoints[0]);
return spoints;
}
if (this.looped) { if (this.looped) {
spoints.unshift(spoints[spoints.length-1]); spoints.unshift(spoints[spoints.length-1]);
spoints.push(spoints[1]); spoints.push(spoints[1]);
@ -617,8 +623,6 @@ component.edge2d = Object.copy(collider2d, {
return Spline.sample_angle(this.type, spoints, this.angle); return Spline.sample_angle(this.type, spoints, this.angle);
}, },
samples: 1,
boundingbox() { boundingbox() {
return points2bb(this.points.map(x => x.scale(this.gameobject.scale))); return points2bb(this.points.map(x => x.scale(this.gameobject.scale)));
}, },
@ -656,17 +660,6 @@ component.edge2d = Object.copy(collider2d, {
}, this); }, this);
return picks; return picks;
}, },
sample_calc() {
var n = this.spoints().length-1;
if (this.looped) n++;
return n;
},
samples_per_cp() {
var s = this.sample_calc();
return this.samples/s;
},
}); });
component.edge2d.impl = Object.mix({ component.edge2d.impl = Object.mix({
@ -676,7 +669,7 @@ component.edge2d.impl = Object.mix({
get thickness() { return cmd(112,this.id); }, get thickness() { return cmd(112,this.id); },
sync() { sync() {
var sensor = this.sensor; var sensor = this.sensor;
var points = this.sample(this.samples); var points = this.sample();
if (!points) return; if (!points) return;
cmd_edge2d(0,this.id,points); cmd_edge2d(0,this.id,points);
this.sensor = sensor; this.sensor = sensor;
@ -714,15 +707,16 @@ bucket.inputs['M-b'].doc = "Increase spline thickness.";
bucket.inputs['M-b'].rep = true; bucket.inputs['M-b'].rep = true;
bucket.inputs.plus = function() { bucket.inputs.plus = function() {
this.samples++; if (this.angle <= 1) {
this.angle = 1;
return;
}
this.angle *= 0.9;
}; };
bucket.inputs.plus.doc = "Increase the number of samples of this spline."; bucket.inputs.plus.doc = "Increase the number of samples of this spline.";
bucket.inputs.plus.rep = true; bucket.inputs.plus.rep = true;
bucket.inputs.minus = function() { bucket.inputs.minus = function() { this.angle *= 1.1; };
if (this.samples === 1) return;
this.samples--;
};
bucket.inputs.minus.doc = "Decrease the number of samples on this spline."; bucket.inputs.minus.doc = "Decrease the number of samples on this spline.";
bucket.inputs.minus.rep = true; bucket.inputs.minus.rep = true;
@ -732,14 +726,11 @@ bucket.inputs['C-r'].doc = "Reverse the order of the spline's points.";
bucket.inputs['C-l'] = function() { this.looped = !this.looped}; bucket.inputs['C-l'] = function() { this.looped = !this.looped};
bucket.inputs['C-l'].doc = "Toggle spline being looped."; bucket.inputs['C-l'].doc = "Toggle spline being looped.";
bucket.inputs['C-c'] = function() { this.type = Spline.type.clamped; this.looped = false; }; bucket.inputs['C-c'] = function() { this.type = Spline.type.catmull; };
bucket.inputs['C-c'].doc = "Set type of spline to clamped."; bucket.inputs['C-c'].doc = "Set type of spline to catmull-rom.";
bucket.inputs['C-o'] = function() { this.type = Spline.type.open; this.looped = false; }; bucket.inputs['C-o'] = function() { this.type = -1; };
bucket.inputs['C-o'].doc = "Set spline to open."; bucket.inputs['C-o'].doc = "Set spline to linear.";
bucket.inputs['C-b'] = function() { this.type = Spline.type.bezier; this.looped = false;};
bucket.inputs['C-b'].doc = "Set spline to bezier.";
bucket.inputs['C-M-lm'] = function() { bucket.inputs['C-M-lm'] = function() {
var idx = Math.grab_from_points(Mouse.worldpos, this.cpoints.map(p => this.gameobject.this2world(p)), 25); var idx = Math.grab_from_points(Mouse.worldpos, this.cpoints.map(p => this.gameobject.this2world(p)), 25);

View file

@ -294,7 +294,9 @@ HMM_Vec2 *catmull_rom_ma_v2(HMM_Vec2 *cp, float ma)
{ {
if (arrlen(cp) < 4) return NULL; if (arrlen(cp) < 4) return NULL;
HMM_Vec2 *ret = NULL; HMM_Vec2 *ret = NULL;
int segments = arrlen(cp)-3; int segments = arrlen(cp)-3;
arrsetcap(ret,segments*(ma>=2 ? 3 : 7));
arrput(ret, cp[1]); arrput(ret, cp[1]);
for (int i = 1; i < arrlen(cp)-2; i++) for (int i = 1; i < arrlen(cp)-2; i++)
ret = catmull_rom_min_angle(&cp[i-1], &cp[i], &cp[i+1], &cp[i+2], ma, ret); ret = catmull_rom_min_angle(&cp[i-1], &cp[i], &cp[i+1], &cp[i+2], ma, ret);