/extensions/org/mt4jx/util/extension3D/MergeHelper.java

http://mt4j.googlecode.com/ · Java · 175 lines · 115 code · 37 blank · 23 comment · 11 complexity · 29a4cfcd1ad62481eda067ef1b9692a6 MD5 · raw file

  1. package org.mt4jx.util.extension3D;
  2. import java.util.ArrayList;
  3. import java.util.HashMap;
  4. import org.mt4j.components.MTCanvas;
  5. import org.mt4j.components.MTComponent;
  6. import org.mt4j.components.StateChange;
  7. import org.mt4j.components.StateChangeEvent;
  8. import org.mt4j.components.StateChangeListener;
  9. import org.mt4j.components.TransformSpace;
  10. import org.mt4j.components.bounds.IBoundingShape;
  11. import org.mt4j.components.bounds.IBoundingShapeMergable;
  12. import org.mt4jx.input.inputProcessors.componentProcessors.Group3DProcessorNew.Cluster;
  13. public class MergeHelper implements StateChangeListener {
  14. HashMap<Integer,IBoundingShape> boundingShapes = new HashMap<Integer,IBoundingShape>();
  15. private int mergedCounter = 0;
  16. private int normalCounter = 0;
  17. private int dirtyCounter = 0;
  18. private int normalInsideCounter;
  19. private int addedCounter;
  20. private int isNorMergedCounter;
  21. private int isMergedCounter;
  22. private int case1;
  23. private int case2;
  24. private int getboundsinside;
  25. private static MergeHelper helperSingleton;
  26. private static long counter = 0;
  27. private MergeHelper()
  28. {
  29. }
  30. public static MergeHelper getInstance()
  31. {
  32. if(helperSingleton==null)
  33. {
  34. helperSingleton = new MergeHelper();
  35. return helperSingleton;
  36. }else
  37. {
  38. return helperSingleton;
  39. }
  40. }
  41. /**
  42. * return the merged Bounds of the component with all children
  43. * @param comp, the component which should be merged
  44. * @param dirty if the passed component has changed its matrix
  45. * true in case of calling this method after a statechange
  46. * @return
  47. */
  48. private IBoundingShape mergeBoundsWithChildren(MTComponent comp,boolean dirty)
  49. {
  50. // System.out.println("Dirtycounter " + dirtyCounter + " normalCounter " + normalCounter + " mergedCounter " + mergedCounter);
  51. if (isMergedOfChildrenBounds(comp)==true&&!dirty) return getMergedBoundsForComponent(comp);
  52. //System.out.println("normalinside " + normalInsideCounter++);
  53. if(comp.getChildren().length==0)
  54. {
  55. addMTComponentWithMergedBounding(comp,comp.getBounds());
  56. return comp.getBounds();
  57. }
  58. ArrayList<IBoundingShapeMergable> shapesToMerge = new ArrayList<IBoundingShapeMergable>();
  59. if(comp.hasBounds())
  60. {
  61. if (comp.getBounds() instanceof IBoundingShapeMergable) {
  62. IBoundingShapeMergable mergeableBounds = (IBoundingShapeMergable)comp.getBounds();
  63. addMTComponentWithMergedBounding(comp, mergeableBounds);
  64. shapesToMerge.add(mergeableBounds);
  65. }
  66. }
  67. for(int i=0;i < comp.getChildren().length;i++)
  68. {
  69. MTComponent children = comp.getChildren()[i];
  70. IBoundingShape shape1 = mergeBoundsWithChildren(children,false);
  71. if (shape1 instanceof IBoundingShapeMergable) {
  72. IBoundingShapeMergable mergeableBounds = (IBoundingShapeMergable)shape1;
  73. IBoundingShapeMergable shape = mergeableBounds.getBoundsTransformed(TransformSpace.RELATIVE_TO_PARENT);
  74. shapesToMerge.add(shape);
  75. }
  76. }
  77. for(int i=shapesToMerge.size()-1;i>0;i--)
  78. {
  79. IBoundingShapeMergable mergedShape = shapesToMerge.get(i).merge(shapesToMerge.get(i-1));
  80. shapesToMerge.set(i-1,mergedShape);
  81. }
  82. if(shapesToMerge.size()>0)
  83. {
  84. addMTComponentWithMergedBounding(comp,shapesToMerge.get(0));
  85. return shapesToMerge.get(0);
  86. }else
  87. {
  88. return null;
  89. }
  90. }
  91. private void addMTComponentWithMergedBounding(MTComponent comp,IBoundingShape shape)
  92. {
  93. //System.out.println("Added counter " + comp.getID() + " " + addedCounter++ + " " + boundingShapes.size());
  94. boundingShapes.put(comp.getID(),shape);
  95. }
  96. private void removeMTComponentWithMergedBounding(MTComponent comp)
  97. {
  98. boundingShapes.remove(comp.getID());
  99. }
  100. public IBoundingShape getMergedBoundsForComponent(MTComponent comp)
  101. {
  102. if(boundingShapes.containsKey(comp.getID()))
  103. {
  104. return boundingShapes.get(comp.getID());
  105. }else
  106. {
  107. IBoundingShape shape = mergeBoundsWithChildren(comp,true);
  108. updateParentAfterMerge(comp);
  109. return shape;
  110. }
  111. }
  112. /**
  113. *
  114. * @param comp
  115. */
  116. private void updateParentAfterMerge(MTComponent comp)
  117. {
  118. if(comp.getParent()!=null&&boundingShapes.containsKey(comp.getParent().getID())==true)
  119. {
  120. mergeBoundsWithChildren(comp.getParent(),true);
  121. }
  122. }
  123. public boolean isMergedOfChildrenBounds(MTComponent comp)
  124. {
  125. //System.out.println(comp.getID());
  126. return boundingShapes.containsKey(comp.getID());
  127. }
  128. public void stateChanged(StateChangeEvent evt) {
  129. //IF needed add a new state to StateChange.GLOBAL_TRANSFORM_CHANGED to StateChange
  130. //and in MTComponent propagteMatrixChange fire this StateChange
  131. /*if(evt.getSource() instanceof MTComponent&&evt.getState()==StateChange.GLOBAL_TRANSFORM_CHANGED)
  132. {
  133. MTComponent comp = (MTComponent)evt.getSource();
  134. mergeBoundsWithChildren(comp,true);
  135. updateParentAfterMerge(comp);
  136. }*/
  137. }
  138. }