superposition map behaviours bug fix

This commit is contained in:
2023-09-13 21:30:12 +02:00
parent 119ae3f242
commit ef0d8cedf6
5 changed files with 163 additions and 137 deletions

View File

@@ -221,7 +221,7 @@ export default {
},
map_mode: {
handler (n, o) {
console.log('concernementMap watch map_mode', o, n);
console.log('concernementMap watch map_mode o n', o, n);
if (n === 'superposition' && !this.opened_concernement) {
// create constraints
this.setSuperpositionsMatterConstraints();
@@ -232,6 +232,18 @@ export default {
},
deep: true
},
opened_concernement: {
handler (n, o) {
console.log('concernementMap watch opened_concernement o n', o, n);
// if (n && this.map_mode === 'superposition') {
// this.clearSuperpositionsMatterConstraints();
// }
// if(o && !n){
// this.setSuperpositionsMatterConstraints();
// }
},
deep: true
},
allSuperpositions: {
handler (n, o) {
console.log('concernementMap watch allSuperpositions', o, n);
@@ -1050,11 +1062,7 @@ export default {
async setSuperpositionsMatterConstraints(){
await nextTick(); // wait for dom to be upadted before applying consraint
console.log('setSuperpositionsMatterConstraints this.allSuperpositions', this.allSuperpositions);
// let allBodies = Matter.Composite.allBodies(this.world);
// console.log('allBodies', allBodies);
// let allComposites = Matter.Composite.allComposites(this.world);
// console.log('allComposites', allComposites);
// loop through all supperposition couple
for(let [couple_id, superpositions] of Object.entries(this.allSuperpositions_byid)){
// if couple has only one superposition, use regular mapItems
@@ -1062,25 +1070,30 @@ export default {
let i = 0;
for(let [superposition_id, superposition] of Object.entries(superpositions)){
i++;
// console.log('superposition', superposition[0].cid, superposition[1].cid);
let matter_bodyA_id, matter_bodyB_id;
if (superpositions_ids.length === 1 || i === 1) {
matter_bodyA_id = superposition[0].cid
matter_bodyB_id = superposition[1].cid
let concernementA = this.concernementsByID[superposition[0].cid];
// console.log('concernementA', concernementA);
let concernementB = this.concernementsByID[superposition[1].cid];
// console.log('concernementB', concernementB);
// console.log('superposition', superposition_id, superposition);
let mapitemA_id, mapitemB_id;
if (i === 1) {
mapitemA_id = superposition[0].cid
mapitemB_id = superposition[1].cid
} else {
matter_bodyA_id = `${superposition[0].cid}___${superposition_id}`
matter_bodyB_id = `${superposition[1].cid}___${superposition_id}`
mapitemA_id = `${superposition[0].cid}___${superposition_id}`
mapitemB_id = `${superposition[1].cid}___${superposition_id}`
}
// get the concernement matter bodies with id
let bodyA = Matter.Composite.get(this.world, matter_bodyA_id, 'body');
let bodyB = Matter.Composite.get(this.world, matter_bodyB_id, 'body');
let bodyA = Matter.Composite.get(this.world, mapitemA_id, 'body'); // matter body id is the same as mapitem_id
let bodyB = Matter.Composite.get(this.world, mapitemB_id, 'body'); // matter body id is the same as mapitem_id
// console.log('bodyA, bodyB', bodyA, bodyB);
// get the entite coordinates inside the concernement body
let pointA = null;
let concernementA = this.concernementsByID[superposition[0].cid];
// console.log('concernementA', concernementA);
for(let entiteA of concernementA.revisions_byid[concernementA.active_revision].entites){
if (entiteA.entite && entiteA.entite.id === superposition[0].eid && entiteA.display) {
// console.log('entiteA', entiteA);
@@ -1089,8 +1102,6 @@ export default {
}
}
let pointB = null;
let concernementB = this.concernementsByID[superposition[1].cid];
// console.log('concernementB', concernementB);
for(let entiteB of concernementB.revisions_byid[concernementB.active_revision].entites){
if (entiteB.entite && entiteB.entite.id === superposition[1].eid && entiteB.display) {
// console.log('entiteB', entiteB);
@@ -1115,14 +1126,36 @@ 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_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);
if(!concernementA.superposition_constraints_id[mapitemA_id]){
concernementA.superposition_constraints_id[mapitemA_id] = [];
}
if (concernementB.superposed_concernements_id.indexOf(concernementA.id) < 0) {
concernementB.superposed_concernements_id.push(concernementA.id);
concernementA.superposition_constraints_id[mapitemA_id].push(c.id);
if(!concernementB.superposition_constraints_id[mapitemB_id]){
concernementB.superposition_constraints_id[mapitemB_id] = [];
}
concernementB.superposition_constraints_id[mapitemB_id].push(c.id);
// record all superposed concernements for each concernement
if (concernementA.all_superposed_concernements_id.indexOf(concernementB.id) < 0) {
concernementA.all_superposed_concernements_id.push(concernementB.id);
}
if (concernementB.all_superposed_concernements_id.indexOf(concernementA.id) < 0) {
concernementB.all_superposed_concernements_id.push(concernementA.id);
}
// record all superposed concernements for each concernement by mapitem_id
// A
if (!concernementA.superposed_mapitem_id_by_mapitem_id[mapitemA_id]) {
concernementA.superposed_mapitem_id_by_mapitem_id[mapitemA_id] = []
}
if (concernementA.superposed_mapitem_id_by_mapitem_id[mapitemA_id].indexOf(mapitemB_id) < 0) {
concernementA.superposed_mapitem_id_by_mapitem_id[mapitemA_id].push(mapitemB_id);
}
// B
if (!concernementB.superposed_mapitem_id_by_mapitem_id[mapitemB_id]) {
concernementB.superposed_mapitem_id_by_mapitem_id[mapitemB_id] = []
}
if (concernementB.superposed_mapitem_id_by_mapitem_id[mapitemB_id].indexOf(mapitemA_id) < 0) {
concernementB.superposed_mapitem_id_by_mapitem_id[mapitemB_id].push(mapitemA_id);
}
}
@@ -1134,21 +1167,18 @@ export default {
console.log('clearSuperpositionsMatterConstraints', this.superpositions_constraints);
for(let constraint of this.superpositions_constraints){
// 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];
// Delete superposition constraints ids recorded in concernement object
['A', 'B'].forEach(ab => {
for( let [mapitem_id, constraint_ids] of Object.entries(constraint[`concernement${ab}`].superposition_constraints_id)){
let indexes = Object.keys(constraint_ids);
indexes.forEach(i => {
if(constraint_ids[i] === constraint.id) {
delete constraint[`concernement${ab}`].superposition_constraints_id[mapitem_id][i];
}
})
}
});
Matter.Composite.remove(this.world, constraint, true);
}
this.superpositions_constraints = [];