refactored superposition constraint point tweening

This commit is contained in:
Bachir Soussi Chiadmi 2023-09-05 11:06:40 +02:00
parent a418682a72
commit 8a5c57cd13
3 changed files with 70 additions and 31 deletions

View File

@ -1392,19 +1392,30 @@ export default {
Matter.Body.scale(this.body, obj.s, obj.s) Matter.Body.scale(this.body, obj.s, obj.s)
this.paper_main_object.scale(obj.s); this.paper_main_object.scale(obj.s);
// update superposition constraints // update superposition constraints points
if (Object.keys(this.concernement.superposition_constraints).length) { if (this.concernement.superposition_constraints_id.length) {
// console.log('concernement superposition_constraints', this.concernement.superposition_constraints); // get all the constraints of the world
for(let constraint_id in this.concernement.superposition_constraints) { let all_constrains = Matter.Composite.allConstraints(this.matterEngine.world);
let constraint = this.concernement.superposition_constraints[constraint_id]; // loop through all constraint ids recorded in the concernement
// console.log('concernement mapitem constraint', constraint); for(let constraint_id of this.concernement.superposition_constraints_id) {
let ab = this.id === constraint.concernementA.id ? 'A' : 'B'; // get the right constraint object from matter
let point = constraint[`point${ab}`]; let constraint;
// console.log('point', point); for (const c of all_constrains) {
// revert to the original point if (c.id === constraint_id) {
let oripoint = Matter.Vector.create(point.x / this.scale, point.y / this.scale) constraint = c;
let newpoint = Matter.Vector.create(oripoint.x * obj.s, oripoint.y * obj.s) break;
constraint[`point${ab}`] = newpoint; }
}
if (constraint) {
// tween the constraint point
let ab = this.id === constraint.concernementA.id ? 'A' : 'B';
let point = constraint[`point${ab}`];
// revert to the original point
let oripoint = Matter.Vector.create(point.x / this.scale, point.y / this.scale)
// newpoint from original point
let newpoint = Matter.Vector.create(oripoint.x * obj.s, oripoint.y * obj.s)
constraint[`point${ab}`] = newpoint;
}
} }
} }
@ -1468,19 +1479,30 @@ export default {
Matter.Body.scale(this.body, obj.s, obj.s) Matter.Body.scale(this.body, obj.s, obj.s)
this.paper_main_object.scale(obj.s); this.paper_main_object.scale(obj.s);
// update superposition constraints // update superposition constraints points
if (this.concernement.superposition_constraints && Object.keys(this.concernement.superposition_constraints).length) { if (this.concernement.superposition_constraints_id.length) {
// console.log('concernement superposition_constraints', this.concernement.superposition_constraints); // get all the constraints of the world
for(let constraint_id in this.concernement.superposition_constraints) { let all_constrains = Matter.Composite.allConstraints(this.matterEngine.world);
let constraint = this.concernement.superposition_constraints[constraint_id]; // loop through all constraint ids recorded in the concernement
// console.log('concernement mapitem constraint', constraint); for(let constraint_id of this.concernement.superposition_constraints_id) {
let ab = this.id === constraint.concernementA.id ? 'A' : 'B'; // get the right constraint object from matter
let point = constraint[`point${ab}`]; let constraint;
// console.log('point', point); for (const c of all_constrains) {
// revert to the original point if (c.id === constraint_id) {
let oripoint = Matter.Vector.create(point.x / this.scale, point.y / this.scale) constraint = c;
let newpoint = Matter.Vector.create(oripoint.x * obj.s, oripoint.y * obj.s) break;
constraint[`point${ab}`] = newpoint; }
}
if (constraint) {
// tween the constraint point
let ab = this.id === constraint.concernementA.id ? 'A' : 'B';
let point = constraint[`point${ab}`];
// revert to the original point
let oripoint = Matter.Vector.create(point.x / this.scale, point.y / this.scale)
// newpoint from original point
let newpoint = Matter.Vector.create(oripoint.x * obj.s, oripoint.y * obj.s)
constraint[`point${ab}`] = newpoint;
}
} }
} }

View File

@ -1097,8 +1097,11 @@ export default {
this.superpositions_constraints.push(c); this.superpositions_constraints.push(c);
Matter.Composite.add(this.world, c); Matter.Composite.add(this.world, c);
// keep a link the constraint into the concernement object (useful for tweening the constraint pointA & pointB in concernementMapItem) // keep a link the constraint into the concernement object (useful for tweening the constraint pointA & pointB in concernementMapItem)
concernementA.superposition_constraints[c.id] = c; // TODO this two lines make the all thing very slow
concernementB.superposition_constraints[c.id] = c; // concernementA.superposition_constraints[c.id] = c;
// concernementB.superposition_constraints[c.id] = c;
concernementA.superposition_constraints_id.push(c.id);
concernementB.superposition_constraints_id.push(c.id);
// record all superposed concernements for each concernement // record all superposed concernements for each concernement
if (concernementA.superposed_concernements_id.indexOf(concernementB.id) < 0) { if (concernementA.superposed_concernements_id.indexOf(concernementB.id) < 0) {
concernementA.superposed_concernements_id.push(concernementB.id); concernementA.superposed_concernements_id.push(concernementB.id);
@ -1113,8 +1116,22 @@ export default {
clearSuperpositionsMatterConstraints(){ clearSuperpositionsMatterConstraints(){
console.log('clearSuperpositionsMatterConstraints', this.superpositions_constraints); console.log('clearSuperpositionsMatterConstraints', this.superpositions_constraints);
for(let constraint of this.superpositions_constraints){ for(let constraint of this.superpositions_constraints){
delete constraint.concernementA.superposition_constraints[constraint.id];
delete constraint.concernementB.superposition_constraints[constraint.id]; // Delete superposition constraints recorded in concernement object
// delete constraint.concernementA.superposition_constraints[constraint.id];
// delete constraint.concernementB.superposition_constraints[constraint.id];
let keysA = constraint.concernementA.superposition_constraints_id;
keysA.forEach(i => {
if(constraint.concernementA.superposition_constraints_id[i] === constraint.id) {
delete constraint.concernementA.superposition_constraints_id[i];
}
});
let keysB = constraint.concernementB.superposition_constraints_id;
keysB.forEach(i => {
if(constraint.concernementB.superposition_constraints_id[i] === constraint.id) {
delete constraint.concernementB.superposition_constraints_id[i];
}
});
Matter.Composite.remove(this.world, constraint, true); Matter.Composite.remove(this.world, constraint, true);
} }
this.superpositions_constraints = []; this.superpositions_constraints = [];

View File

@ -92,7 +92,7 @@ export const ConcernementsStore = defineStore({
// SUPERPOSITIONS // SUPERPOSITIONS
if (entite.entite.superposition.length) { if (entite.entite.superposition.length) {
concernement.has_superpositions = true; concernement.has_superpositions = true;
concernement.superposition_constraints = {}; concernement.superposition_constraints_id = [];
concernement.superposed_concernements_id = []; concernement.superposed_concernements_id = [];
entite.entite.superposition.forEach(entite_superpose => { entite.entite.superposition.forEach(entite_superpose => {
// console.log(`superposition eid:${entite.entite.id}, teid:${entite_superpose.id}`); // console.log(`superposition eid:${entite.entite.id}, teid:${entite_superpose.id}`);