correct polygon2d saving and editing

This commit is contained in:
John Alanbrook 2023-09-27 17:36:32 +00:00
parent 7984c90140
commit 98ba229c9c
8 changed files with 58 additions and 31 deletions

View file

@ -392,14 +392,6 @@ Object.defineProperty(Array.prototype, 'rotate', {
} }
}); });
Object.defineProperty(Array.prototype, '$add', {
value: function(b) {
for (var i = 0; i < this.length; i++) {
this[i] += b[i];
}
}});
function setelem(n) { function setelem(n) {
return { return {
get: function() { return this[n]; }, get: function() { return this[n]; },
@ -421,7 +413,6 @@ arrsetelem('g', 1);
arrsetelem('b', 2); arrsetelem('b', 2);
arrsetelem('a', 3); arrsetelem('a', 3);
Object.defineProperty(Array.prototype, 'add', { Object.defineProperty(Array.prototype, 'add', {
value: function(b) { value: function(b) {
var c = []; var c = [];

View file

@ -351,11 +351,6 @@ collider2d.inputs['M-t'] = function() { this.enabled = !this.enabled; }
collider2d.inputs['M-t'].doc = "Toggle if this collider is enabled."; collider2d.inputs['M-t'].doc = "Toggle if this collider is enabled.";
component.polygon2d = Object.copy(collider2d, { component.polygon2d = Object.copy(collider2d, {
ur: {
flipx: false,
flipy: false
},
sync() { sync() {
cmd_poly2d(0, this.id, this.spoints); cmd_poly2d(0, this.id, this.spoints);
}, },
@ -367,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 = []; poly.points = [0,0];
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));
@ -398,8 +393,6 @@ component.polygon2d = Object.copy(collider2d, {
}, },
gizmo() { gizmo() {
if (!this.hasOwn('points')) this.points = this.__proto__.points.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);
@ -410,7 +403,19 @@ component.polygon2d = Object.copy(collider2d, {
}, },
pick(pos) { pick(pos) {
return Gizmos.pick_gameobject_points(pos, this.gameobject, this.points); var p = Gizmos.pick_gameobject_points(pos, this.gameobject, this.points);
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;
}, },
query() { query() {

View file

@ -1,7 +1,7 @@
var Gizmos = { var Gizmos = {
pick_gameobject_points(worldpos, gameobject, points) { pick_gameobject_points(worldpos, gameobject, points) {
var idx = grab_from_points(worldpos, points.map(gameobject.this2world,gameobject), 25); var idx = grab_from_points(worldpos, points.map(gameobject.this2world,gameobject), 25);
if (idx === -1) return null; if (idx === -1) return undefined;
return points[idx]; return points[idx];
}, },
}; };

View file

@ -992,10 +992,7 @@ 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); editor.grabselect = [editor.sel_comp.pick(Mouse.worldpos)];
if (!editor.grabselect) return;
// editor.moveoffset = editor.sel_comp.gameobject.editor2world(editor.grabselect).sub(Mouse.worldpos);
return; return;
} }
@ -1045,7 +1042,11 @@ editor.inputs.mouse.move = function(pos, dpos)
editor.camera.pos = editor.camera.pos.sub(dpos.scale(editor.camera.zoom)); editor.camera.pos = editor.camera.pos.sub(dpos.scale(editor.camera.zoom));
} }
editor.grabselect?.forEach(x => x.pos = x.pos.add(dpos.scale(editor.camera.zoom))); editor.grabselect?.forEach(function(x) {
x.pos = x.pos.add(dpos.scale(editor.camera.zoom));
if ('sync' in x)
x.sync();
});
var relpos = Mouse.worldpos.sub(editor.cursor); var relpos = Mouse.worldpos.sub(editor.cursor);
var dist = Vector.length(relpos); var dist = Vector.length(relpos);

View file

@ -542,16 +542,35 @@ 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) {
if (!from[key] || !to[key]) continue; if (!from[key] || !to[key]) continue;
if (typeof from[key] === 'function') continue; if (typeof from[key] === 'function') continue;
if (typeof to === 'object' && !(key in to)) continue; if (typeof to === 'object' && !(key in to)) continue;
if (typeof from[key] === 'object') { if (Array.isArray(from[key])) {
if (!Array.isArray(to[key]))
ret[key] = from[key].slice();
if (from[key].length !== to[key].length)
ret[key] = from[key].slice();
var diff = objdiff(from[key], to[key]); var diff = objdiff(from[key], to[key]);
if (diff && !diff.empty) ret[key] = diff; if (diff && !diff.empty)
ret[key] = from[key];
continue;
}
if (typeof from[key] === 'object') {
if (key === 'points') Log.warn("POINTS");
var diff = objdiff(from[key], to[key]);
if (diff && !diff.empty)
ret[key] = diff;
continue; continue;
} }

View file

@ -205,7 +205,12 @@ var gameobject = {
set friction(x) { cmd(108,this.body,x); }, set friction(x) { cmd(108,this.body,x); },
set mass(x) { set_body(7,this.body,x); }, set mass(x) { set_body(7,this.body,x); },
get mass() { return q_body(5, this.body); }, get mass() {
if (!(this.phys === Physics.dynamic))
return this.ur.mass;
return q_body(5, this.body);
},
set phys(x) { set_body(1, this.body, x); }, set phys(x) { set_body(1, this.body, x); },
get phys() { return q_body(0,this.body); }, get phys() { return q_body(0,this.body); },
@ -363,13 +368,12 @@ var gameobject = {
Log.warn(`spawning a ${p.comp}`); Log.warn(`spawning a ${p.comp}`);
obj[prop] = component[p.comp].make(obj); obj[prop] = component[p.comp].make(obj);
obj.components[prop] = obj[prop]; obj.components[prop] = obj[prop];
// obj[prop].ur = Object.create(obj[prop].ur);
// Object.totalmerge(obj[prop].ur, p);
} }
}; };
Object.totalmerge(obj,ur); Object.totalmerge(obj,ur);
obj.$.forEach(function(x) { x.pos = obj.pos.add(x.pos); }); obj.$.forEach(function(x) { x.pos = obj.pos.add(x.pos); });
obj.components.forEach(function(x) { if ('sync' in x) x.sync(); });
obj.check_registers(obj); obj.check_registers(obj);
if (typeof obj.start === 'function') obj.start(); if (typeof obj.start === 'function') obj.start();

View file

@ -51,11 +51,15 @@ var Log = {
}, },
write(msg) { write(msg) {
if (typeof msg === 'object')
msg = JSON.stringify(msg,null,2);
cmd(91,msg); cmd(91,msg);
}, },
say(msg) { say(msg) {
cmd(91, `${msg}\n`); Log.write(msg);
Log.write('\n');
}, },
stack(skip = 0) { stack(skip = 0) {

View file

@ -296,6 +296,7 @@ struct phys2d_box *Make2DBox(int go) {
new->offset[0] = 0.f; new->offset[0] = 0.f;
new->offset[1] = 0.f; new->offset[1] = 0.f;
new->shape.go = go; new->shape.go = go;
new->shape.apply = phys2d_applybox;
phys2d_applybox(new); phys2d_applybox(new);
new->shape.debugdraw = phys2d_dbgdrawbox; new->shape.debugdraw = phys2d_dbgdrawbox;
new->shape.moi = phys2d_box_moi; new->shape.moi = phys2d_box_moi;
@ -362,6 +363,7 @@ struct phys2d_poly *Make2DPoly(int go) {
new->shape.shape = cpSpaceAddShape(space, cpPolyShapeNewRaw(id2go(go)->body, 0, new->points, new->radius)); new->shape.shape = cpSpaceAddShape(space, cpPolyShapeNewRaw(id2go(go)->body, 0, new->points, new->radius));
new->shape.debugdraw = phys2d_dbgdrawpoly; new->shape.debugdraw = phys2d_dbgdrawpoly;
new->shape.moi = phys2d_poly_moi; new->shape.moi = phys2d_poly_moi;
new->shape.apply = phys2d_applypoly;
init_phys2dshape(&new->shape, go, new); init_phys2dshape(&new->shape, go, new);
return new; return new;
} }
@ -433,6 +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->draws = 0; new->draws = 0;
new->closed = 0; new->closed = 0;
phys2d_applyedge(new); phys2d_applyedge(new);