Beispiel #1
0
        public override void PerformRelevantOperation(string name, int iShapeIndex, int iShapeCount)
        {
            base.PerformRelevantOperation(name, iShapeIndex, iShapeCount);


            if (name == RO_ADJUST_BBOX)
            {
                ShapeLink src = GetVisibilityLinkSource();
                if (src == null || src.Links.Count == 0)
                {
                    return;
                }

                BoundingBox newbbox = new BoundingBox();
                foreach (LinkTarget tgt in src.Links)
                {
                    BoundingBox bbox = tgt.OwnerShape.AbsoluteBoundingBox;
                    if (bbox != null && bbox.Valid)
                    {
                        newbbox.AddBox(bbox);
                    }
                }
                if (newbbox.Valid)
                {
                    EditorManager.Actions.StartGroup(RO_ADJUST_BBOX);
                    Vector3F size = new Vector3F(newbbox.SizeX, newbbox.SizeY, newbbox.SizeZ);
                    EditorManager.Actions.Add(new MoveShapeAction(this, this.Position, newbbox.Center));
                    EditorManager.Actions.Add(SetPropertyAction.CreateSetPropertyAction(this, "BoxSize", size));

                    EditorManager.Actions.EndGroup();
                }
            }

            if (name == RO_LINK_TO_TOUCHING_SHAPES || name == RO_LINK_TO_SHAPES_INSIDE)
            {
                EvaluateBBoxLinksVisitor visitor = new EvaluateBBoxLinksVisitor(this, name == RO_LINK_TO_TOUCHING_SHAPES);
                foreach (Layer layer in EditorManager.Scene.Layers)
                {
                    if (layer.Modifiable)
                    {
                        layer.Root.RunVisitor(visitor);
                    }
                }

                if (visitor.RelevantTargets.Count > 0)
                {
                    LinkSource linkSrc = GetVisibilityLinkSource();
                    EditorManager.Actions.StartGroup(name);
                    foreach (LinkTarget target in visitor.RelevantTargets)
                    {
                        EditorManager.Actions.Add(new LinkAction(linkSrc, target));
                    }

                    EditorManager.Actions.EndGroup();
                }
            }
        }
Beispiel #2
0
        bool GetShapePosAndBox(ShapeBase shape, out Vector3F pos, out BoundingBox box)
        {
            if (shape.HasChildren())
            {
                int         iValidCount = 0;
                BoundingBox baccum      = new BoundingBox();
                Vector3F    paccum      = Vector3F.Zero;
                foreach (ShapeBase child in shape.ChildCollection)
                {
                    BoundingBox b1;
                    Vector3F    p1;
                    if (!GetShapePosAndBox(child, out p1, out b1))
                    {
                        continue;
                    }
                    iValidCount++;
                    paccum += p1;
                    if (b1 != null && b1.Valid)
                    {
                        baccum.AddBox(b1);
                    }
                }
                pos = paccum;
                box = baccum;
                if (iValidCount == 0)
                {
                    return(false);
                }
                pos *= (1.0f / (float)iValidCount); // average position
                return(true);
            }

            if (shape is Shape3D)
            {
                pos = ((Shape3D)shape).Position;
                box = ((Shape3D)shape).AbsoluteBoundingBox;
                if (box == null || !box.Valid)
                {
                    box = null;
                }
                return(true);
            }
            pos = Vector3F.Zero;
            box = null;
            return(false);
        }
    public override void PerformRelevantOperation(string name, int iShapeIndex, int iShapeCount)
    {
      base.PerformRelevantOperation(name, iShapeIndex, iShapeCount);

      if (name == RO_RECENTER)
      {
        ShapeCollection shapes = GetRelevantShapes();
        TriggerRecenterPosition(shapes);
        return;
      }

     #if (MESHGROUP_USE_LINKING)
      if (name == RO_ADJUST_BBOX)
      {
        ShapeLink src = GetGroupStaticMeshesLinkSource();
        if (src == null || src.Links.Count == 0)
          return;

        BoundingBox newbbox = new BoundingBox();
        foreach (LinkTarget tgt in src.Links)
        {
          BoundingBox bbox = tgt.OwnerShape.AbsoluteBoundingBox;
          if (bbox != null && bbox.Valid)
            newbbox.AddBox(bbox);
        }
        if (newbbox.Valid)
        {
          EditorManager.Actions.StartGroup(RO_ADJUST_BBOX);
          Vector3F size = new Vector3F(newbbox.SizeX,newbbox.SizeY,newbbox.SizeZ);
          EditorManager.Actions.Add(new MoveShapeAction(this,this.Position,newbbox.Center));
          EditorManager.Actions.Add(SetPropertyAction.CreateSetPropertyAction(this, "BoxSize", size));

          EditorManager.Actions.EndGroup();
        }
      }

      if (name == RO_LINK_TO_TOUCHING_SHAPES || name == RO_LINK_TO_SHAPES_INSIDE)
      {
        EvaluateBBoxLinksVisitor visitor = new EvaluateBBoxLinksVisitor(this, name == RO_LINK_TO_TOUCHING_SHAPES);
        foreach (Layer layer in EditorManager.Scene.Layers)
          if (layer.Modifiable)
            layer.Root.RunVisitor(visitor);

        if (visitor.RelevantTargets.Count > 0)
        {
          LinkSource linkSrc = GetGroupStaticMeshesLinkSource();
          EditorManager.Actions.StartGroup(name);
          foreach (LinkTarget target in visitor.RelevantTargets)
            EditorManager.Actions.Add(new LinkAction(linkSrc, target));

          EditorManager.Actions.EndGroup();
        }
      }
     #endif
    }
        bool GetShapePosAndBox(ShapeBase shape, out Vector3F pos, out BoundingBox box)
        {
            if (shape.HasChildren())
              {
            int iValidCount = 0;
            BoundingBox baccum = new BoundingBox();
            Vector3F paccum = Vector3F.Zero;
            foreach (ShapeBase child in shape.ChildCollection)
            {
              BoundingBox b1;
              Vector3F p1;
              if (!GetShapePosAndBox(child, out p1, out b1))
            continue;
              iValidCount++;
              paccum += p1;
              if (b1 != null && b1.Valid)
            baccum.AddBox(b1);
            }
            pos = paccum;
            box = baccum;
            if (iValidCount == 0)
              return false;
            pos *= (1.0f / (float)iValidCount); // average position
            return true;
              }

              if (shape is Shape3D)
              {
            pos = ((Shape3D)shape).Position;
            box = ((Shape3D)shape).AbsoluteBoundingBox;
            if (box == null || !box.Valid)
              box = null;
            return true;
              }
              pos = Vector3F.Zero;
              box = null;
              return false;
        }