diff --git a/src/components/ConcernementMapItem.vue b/src/components/ConcernementMapItem.vue index 7bb8cfc..b5cfaf5 100644 --- a/src/components/ConcernementMapItem.vue +++ b/src/components/ConcernementMapItem.vue @@ -1392,19 +1392,30 @@ export default { Matter.Body.scale(this.body, obj.s, obj.s) this.paper_main_object.scale(obj.s); - // update superposition constraints - if (Object.keys(this.concernement.superposition_constraints).length) { - // console.log('concernement superposition_constraints', this.concernement.superposition_constraints); - for(let constraint_id in this.concernement.superposition_constraints) { - let constraint = this.concernement.superposition_constraints[constraint_id]; - // console.log('concernement mapitem constraint', constraint); - let ab = this.id === constraint.concernementA.id ? 'A' : 'B'; - let point = constraint[`point${ab}`]; - // console.log('point', point); - // revert to the original point - let oripoint = Matter.Vector.create(point.x / this.scale, point.y / this.scale) - let newpoint = Matter.Vector.create(oripoint.x * obj.s, oripoint.y * obj.s) - constraint[`point${ab}`] = newpoint; + // update superposition constraints points + if (this.concernement.superposition_constraints_id.length) { + // get all the constraints of the world + let all_constrains = Matter.Composite.allConstraints(this.matterEngine.world); + // loop through all constraint ids recorded in the concernement + for(let constraint_id of this.concernement.superposition_constraints_id) { + // get the right constraint object from matter + let constraint; + for (const c of all_constrains) { + if (c.id === constraint_id) { + constraint = c; + break; + } + } + 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) this.paper_main_object.scale(obj.s); - // update superposition constraints - if (this.concernement.superposition_constraints && Object.keys(this.concernement.superposition_constraints).length) { - // console.log('concernement superposition_constraints', this.concernement.superposition_constraints); - for(let constraint_id in this.concernement.superposition_constraints) { - let constraint = this.concernement.superposition_constraints[constraint_id]; - // console.log('concernement mapitem constraint', constraint); - let ab = this.id === constraint.concernementA.id ? 'A' : 'B'; - let point = constraint[`point${ab}`]; - // console.log('point', point); - // revert to the original point - let oripoint = Matter.Vector.create(point.x / this.scale, point.y / this.scale) - let newpoint = Matter.Vector.create(oripoint.x * obj.s, oripoint.y * obj.s) - constraint[`point${ab}`] = newpoint; + // update superposition constraints points + if (this.concernement.superposition_constraints_id.length) { + // get all the constraints of the world + let all_constrains = Matter.Composite.allConstraints(this.matterEngine.world); + // loop through all constraint ids recorded in the concernement + for(let constraint_id of this.concernement.superposition_constraints_id) { + // get the right constraint object from matter + let constraint; + for (const c of all_constrains) { + if (c.id === constraint_id) { + constraint = c; + break; + } + } + 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; + } } } diff --git a/src/components/MapConcernements.vue b/src/components/MapConcernements.vue index 290ccc2..58c4f94 100644 --- a/src/components/MapConcernements.vue +++ b/src/components/MapConcernements.vue @@ -1097,8 +1097,11 @@ export default { this.superpositions_constraints.push(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) - concernementA.superposition_constraints[c.id] = c; - concernementB.superposition_constraints[c.id] = c; + // TODO this two lines make the all thing very slow + // 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 if (concernementA.superposed_concernements_id.indexOf(concernementB.id) < 0) { concernementA.superposed_concernements_id.push(concernementB.id); @@ -1113,8 +1116,22 @@ export default { clearSuperpositionsMatterConstraints(){ console.log('clearSuperpositionsMatterConstraints', 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); } this.superpositions_constraints = []; diff --git a/src/stores/concernements.js b/src/stores/concernements.js index 74f24b5..df40990 100644 --- a/src/stores/concernements.js +++ b/src/stores/concernements.js @@ -92,7 +92,7 @@ export const ConcernementsStore = defineStore({ // SUPERPOSITIONS if (entite.entite.superposition.length) { concernement.has_superpositions = true; - concernement.superposition_constraints = {}; + concernement.superposition_constraints_id = []; concernement.superposed_concernements_id = []; entite.entite.superposition.forEach(entite_superpose => { // console.log(`superposition eid:${entite.entite.id}, teid:${entite_superpose.id}`);