Преглед на файлове

refactored superposition constraint point tweening

bach преди 1 година
родител
ревизия
8a5c57cd13
променени са 3 файла, в които са добавени 70 реда и са изтрити 31 реда
  1. 48 26
      src/components/ConcernementMapItem.vue
  2. 21 4
      src/components/MapConcernements.vue
  3. 1 1
      src/stores/concernements.js

+ 48 - 26
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;
+                }
               }
             }
 

+ 21 - 4
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 = [];

+ 1 - 1
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}`);