bucket renamed to edge2d and saves now; proper input blocking with reversed()

This commit is contained in:
John Alanbrook 2023-09-27 22:40:04 +00:00
parent 98ba229c9c
commit 70e4105e1b
10 changed files with 67 additions and 64 deletions

View file

@ -92,7 +92,7 @@ Object.mergekey = function(o1,o2,k)
Object.defineProperty(o1, k, Object.getOwnPropertyDescriptor(o2,k)); Object.defineProperty(o1, k, Object.getOwnPropertyDescriptor(o2,k));
else if (typeof o2[k] === 'object') { else if (typeof o2[k] === 'object') {
if (Array.isArray(o2[k])) if (Array.isArray(o2[k]))
o1[k] = o2[k].slice(); o1[k] = deep_copy(o2[k]);
else { else {
if (!o1[k]) o1[k] = {}; if (!o1[k]) o1[k] = {};
if (typeof o1[k] === 'object') if (typeof o1[k] === 'object')
@ -386,6 +386,13 @@ Object.defineProperty(Array.prototype, 'copy', {
} }
}); });
Object.defineProperty(Array.prototype, 'reversed', {
value: function() {
var c = this.slice();
return c.reverse();
}
});
Object.defineProperty(Array.prototype, 'rotate', { Object.defineProperty(Array.prototype, 'rotate', {
value: function(a) { value: function(a) {
return Vector.rotate(this, a); return Vector.rotate(this, a);

View file

@ -362,7 +362,7 @@ component.polygon2d = Object.copy(collider2d, {
make(go) { make(go) {
var poly = Object.create(this); var poly = Object.create(this);
poly.gameobject = go; poly.gameobject = go;
poly.points = [0,0]; poly.points = [];
poly.flipx = false; poly.flipx = false;
poly.flipy = false; poly.flipy = false;
Object.assign(poly, make_poly2d(go.body, poly.points)); Object.assign(poly, make_poly2d(go.body, poly.points));
@ -453,9 +453,7 @@ polygon2d.inputs['C-b'].doc = "Freeze mirroring in place.";
Object.freeze(polygon2d); Object.freeze(polygon2d);
component.bucket = Object.copy(collider2d, { component.edge2d = Object.copy(collider2d, {
name: "bucket",
cpoints:[],
degrees:2, degrees:2,
dimensions:2, dimensions:2,
/* open: 0 /* open: 0
@ -532,52 +530,42 @@ component.bucket = Object.copy(collider2d, {
assert knots%order != 0 assert knots%order != 0
*/ */
if (this.type === bucket.typeid.looped) if (this.type === typeid.this.looped)
return spline_cmd(0, this.degrees, this.dimensions, 0, spoints.wrapped(this.degrees), n); return spline_cmd(0, this.degrees, this.dimensions, 0, spoints.wrapped(this.degrees), n);
return spline_cmd(0, this.degrees, this.dimensions, this.type, spoints, n); return spline_cmd(0, this.degrees, this.dimensions, this.type, spoints, n);
}, },
set thickness(x) {
cmd_edge2d(1,this.id,x);
},
get thickness() { return cmd(112,this.id); },
samples: 10, samples: 10,
points:[],
thickness:0, /* Number of pixels out the edge is */
boundingbox() {
return points2bb(this.points.map(x => x.scale(this.gameobject.scale)));
},
make(go) { make(go) {
var edge = Object.create(this); var edge = Object.create(this);
edge.gameobject = go; edge.gameobject = go;
Object.assign(edge, make_edge2d(go.body, this.points, this.thickness)); edge.cpoints = [];
Object.assign(edge, { edge.points = [];
set thickness(x) { Object.assign(edge, make_edge2d(go.body, edge.points, 0));
cmd_edge2d(1,this.id,x); edge.thickness = 0;
},
get thickness() { return cmd(112,this.id); },
boundingbox() {
return points2bb(this.points.map(x => x.scale(this.gameobject.scale)));
},
sync() {
var sensor = this.sensor;
this.points = this.sample(this.samples);
cmd_edge2d(0,this.id,this.points);
this.sensor = sensor;
},
});
Object.assign(edge, this.make_fns);
Object.defineProperty(edge, 'id', {enumerable:false});
Object.defineProperty(edge, 'shape', {enumerable:false});
edge.defn('points', []);
return edge; return edge;
}, },
sync() {
var sensor = this.sensor;
this.points = this.sample(this.samples);
cmd_edge2d(0,this.id,this.points);
this.sensor = sensor;
},
/* EDITOR */ /* EDITOR */
gizmo() { gizmo() {
if (!this.hasOwn('cpoints')) this.cpoints = this.__proto__.cpoints.copy();
this.spoints.forEach(function(x) { this.spoints.forEach(function(x) {
Debug.point(world2screen(this.gameobject.this2world(x)), 3, Color.green); Debug.point(world2screen(this.gameobject.this2world(x)), 3, Color.green);
}, this); }, this);
@ -591,10 +579,20 @@ component.bucket = Object.copy(collider2d, {
this.cpoints = this.cpoints.map(function(x) { return x.sub(change); }); this.cpoints = this.cpoints.map(function(x) { return x.sub(change); });
}, },
pick(pos) { return Gizmos.pick_gameobject_points(pos, this.gameobject, this.cpoints); }, pick(pos) {
var p = Gizmos.pick_gameobject_points(pos, this.gameobject, this.cpoints);
if (p) return {
set pos(n) { p.x = n.x; p.y = n.y; },
get pos() { return p; },
sync: this.sync.bind(this),
};
return undefined;
},
}); });
var bucket = component.bucket; var bucket = component.edge2d;
bucket.inputs = {}; bucket.inputs = {};
bucket.inputs.h = function() { this.hollow = !this.hollow; }; bucket.inputs.h = function() { this.hollow = !this.hollow; };
bucket.inputs.h.doc = "Toggle hollow."; bucket.inputs.h.doc = "Toggle hollow.";

View file

@ -992,7 +992,9 @@ editor.inputs.mm = function() {
} }
if (editor.sel_comp && 'pick' in editor.sel_comp) { if (editor.sel_comp && 'pick' in editor.sel_comp) {
editor.grabselect = [editor.sel_comp.pick(Mouse.worldpos)]; var o = editor.sel_comp.pick(Mouse.worldpos);
if (o)
editor.grabselect = [o];
return; return;
} }

View file

@ -543,7 +543,6 @@ var ur_json = function()
function objdiff(from, to) { function objdiff(from, to) {
if (!to) return from; // Everything on from is unique if (!to) return from; // Everything on from is unique
var ret = {}; var ret = {};
for (var key in from) { for (var key in from) {
@ -565,7 +564,6 @@ var ur_json = function()
continue; continue;
} }
if (typeof from[key] === 'object') { if (typeof from[key] === 'object') {
if (key === 'points') Log.warn("POINTS"); if (key === 'points') Log.warn("POINTS");
var diff = objdiff(from[key], to[key]); var diff = objdiff(from[key], to[key]);

View file

@ -448,7 +448,8 @@ prototypes.from_file = function(file)
var urpath = file; var urpath = file;
var path = urpath.split('.'); var path = urpath.split('.');
if (path.length > 1 && (path.at(-1) === path.at(-2))) { if (path.length > 1 && (path.at(-1) === path.at(-2))) {
return prototypes.get_ur(path.at(-1)); urpath = path.slice(0,-1).join('.');
return prototypes.get_ur(urpath);
} }
var upperur = gameobject.ur; var upperur = gameobject.ur;
@ -477,18 +478,15 @@ prototypes.from_file = function(file)
jsfile = urpath + "/" + path.at(-1) + ".js"; jsfile = urpath + "/" + path.at(-1) + ".js";
if (IO.exists(jsfile)) script = IO.slurp(jsfile); if (IO.exists(jsfile)) script = IO.slurp(jsfile);
} }
if (IO.exists(jsonfile)) { try {
try { try {json = JSON.parse(IO.slurp(jsonfile)); }
json = JSON.parse(IO.slurp(jsonfile));
}
catch(e) { catch(e) {
Log.warn(`JSON in file ${jsonfile} is malformed.`); jsonfile = file + "/" + path.at(-1) + ".json";
if (IO.exists(jsonfile)) json = JSON.parse(IO.slurp(jsonfile));
} }
} } catch(e) {
else { Log.warn(`JSON in file ${jsonfile} is malformed.${e}`);
jsonfile = urpath + "/" + path.at(-1) + ".json";
if (IO.exists(jsonfile)) json = JSON.parse(IO.slurp(jsonfile));
} }
if (!json && !script) { if (!json && !script) {

View file

@ -110,7 +110,7 @@ var Player = {
}, },
mouse_input(type, ...args) { mouse_input(type, ...args) {
for (var pawn of this.pawns.reverse()) { for (var pawn of this.pawns.reversed()) {
if (typeof pawn.inputs?.mouse?.[type] === 'function') { if (typeof pawn.inputs?.mouse?.[type] === 'function') {
pawn.inputs.mouse[type].call(pawn,...args); pawn.inputs.mouse[type].call(pawn,...args);
pawn.inputs.post?.call(pawn); pawn.inputs.post?.call(pawn);
@ -120,7 +120,7 @@ var Player = {
}, },
char_input(c) { char_input(c) {
for (var pawn of this.pawns.reverse()) { for (var pawn of this.pawns.reversed()) {
if (typeof pawn.inputs?.char === 'function') { if (typeof pawn.inputs?.char === 'function') {
pawn.inputs.char.call(pawn, c); pawn.inputs.char.call(pawn, c);
pawn.inputs.post?.call(pawn); pawn.inputs.post?.call(pawn);
@ -130,7 +130,7 @@ var Player = {
}, },
raw_input(cmd, state, ...args) { raw_input(cmd, state, ...args) {
for (var pawn of this.pawns.reverse()) { for (var pawn of this.pawns.reversed()) {
if (typeof pawn.inputs?.any === 'function') { if (typeof pawn.inputs?.any === 'function') {
pawn.inputs.any(cmd); pawn.inputs.any(cmd);
return; return;
@ -156,6 +156,7 @@ var Player = {
if (typeof fn === 'function') { if (typeof fn === 'function') {
fn.call(pawn, ... args); fn.call(pawn, ... args);
pawn.inputs.post?.call(pawn); pawn.inputs.post?.call(pawn);
return;
} }
} }
}, },

View file

@ -75,11 +75,10 @@ var Log = {
var IO = { var IO = {
exists(file) { return cmd(65, file);}, exists(file) { return cmd(65, file);},
slurp(file) { slurp(file) {
if (!this.exists(file)) { if (IO.exists(file))
Log.warn(`File ${file} does not exist; can't slurp.`); return cmd(38,file);
return ""; else
} throw new Error(`File ${file} does not exist; can't slurp`);
return cmd(38,file);
}, },
slurpwrite(str, file) { return cmd(39, str, file); }, slurpwrite(str, file) { return cmd(39, str, file); },
extensions(ext) { extensions(ext) {

View file

@ -435,7 +435,7 @@ struct phys2d_edge *Make2DEdge(int go) {
new->shape.debugdraw = phys2d_dbgdrawedge; new->shape.debugdraw = phys2d_dbgdrawedge;
new->shape.moi = phys2d_edge_moi; new->shape.moi = phys2d_edge_moi;
new->shape.shape = NULL; new->shape.shape = NULL;
new->shape.apply = phys2d_applyedge; new->shape.apply = NULL;
new->draws = 0; new->draws = 0;
new->closed = 0; new->closed = 0;
phys2d_applyedge(new); phys2d_applyedge(new);

View file

@ -138,7 +138,7 @@ struct sFont *MakeFont(const char *fontfile, int height) {
stbtt_GetFontVMetrics(&fontinfo, &newfont->ascent, &newfont->descent, &newfont->linegap); stbtt_GetFontVMetrics(&fontinfo, &newfont->ascent, &newfont->descent, &newfont->linegap);
newfont->emscale = stbtt_ScaleForMappingEmToPixels(&fontinfo, 16); newfont->emscale = stbtt_ScaleForMappingEmToPixels(&fontinfo, 16);
newfont->linegap = (newfont->ascent - newfont->descent)* 2 * newfont->emscale; newfont->linegap = (newfont->ascent - newfont->descent) * newfont->emscale;
newfont->texID = sg_make_image(&(sg_image_desc){ newfont->texID = sg_make_image(&(sg_image_desc){
.type = SG_IMAGETYPE_2D, .type = SG_IMAGETYPE_2D,

View file

@ -97,7 +97,7 @@ void go_shape_apply(cpBody *body, cpShape *shape, struct gameobject *go) {
cpShapeSetFilter(shape, filter); cpShapeSetFilter(shape, filter);
struct phys2d_shape *ape = cpShapeGetUserData(shape); struct phys2d_shape *ape = cpShapeGetUserData(shape);
if (ape) if (ape && ape->apply)
ape->apply(ape->data); ape->apply(ape->data);
} }