add spline component controls
This commit is contained in:
parent
903ffbc607
commit
e06d12213f
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
Loading…
Reference in a new issue