示例#1
0
            //!!!!physics shape
            //!!!!triangle index

            public ResultItem(Component_ObjectInSpace obj, Vector3?position, double distanceScale, PhysicsRayTestItem.ResultItem testResult = null)
            {
                Object        = obj;
                Position      = position;
                DistanceScale = distanceScale;
                RayTestResult = testResult;
            }
        protected override void OnCreate()
        {
            base.OnCreate();

            if (ObjectInSpace != null)
            {
                var scene = CreateScene(false);
                scene.DisplayPhysicalObjects = true;

                instanceInScene = (Component_ObjectInSpace)ObjectInSpace.Clone();
                scene.AddComponent(instanceInScene);

                scene.Enabled = true;

                if (Document != null)
                {
                    Document.UndoSystem.ListOfActionsChanged += UndoSystem_ListOfActionsChanged;
                }

                if (ObjectOfEditor != null)
                {
                    SelectObjects(new object[] { ObjectOfEditor });
                }
            }
        }
 internal void ObjectsInSpace_ObjectRemove(Component_ObjectInSpace obj)
 {
     if (octree != null && obj.sceneOctreeIndex != -1)
     {
         octreeObjects[obj.sceneOctreeIndex] = null;
         octree.RemoveObject(obj.sceneOctreeIndex);
         obj.sceneOctreeIndex = -1;
     }
 }
示例#4
0
        void ParentMeshInSpace_GetRenderSceneDataBefore(Component_ObjectInSpace sender, ViewportRenderingContext context, GetRenderSceneDataMode mode)
        {
            //check need modifiable mesh
            bool needModifiableMesh = CheckNeedModifiableMesh();

            //check need recreate
            if (needRecreateModifiableMesh)
            {
                if (ParentMeshInSpace.ModifiableMesh_CreatedByObject == this)
                {
                    ParentMeshInSpace.ModifiableMesh_Destroy();
                }
                needRecreateModifiableMesh = false;
            }

            //recreate
            if (needModifiableMesh)
            {
                if (ParentMeshInSpace.ModifiableMesh == null)
                {
                    if (CalculateOnCPU)
                    {
                        var flags = Component_MeshInSpace.ModifiableMeshCreationFlags.VertexBuffersCreateDuplicate | Component_MeshInSpace.ModifiableMeshCreationFlags.VertexBuffersDynamic;

                        ParentMeshInSpace.ModifiableMesh_Create(this, flags);
                    }

                    //var flags = Component_MeshInSpace.ModifiableMeshCreationFlags.VertexBuffersCreateDuplicate;
                    //if( CalculateOnCPU )
                    //	flags |= Component_MeshInSpace.ModifiableMeshCreationFlags.VertexBuffersDynamic;
                    //else
                    //	flags |= Component_MeshInSpace.ModifiableMeshCreationFlags.VertexBuffersComputeWrite;
                    //ParentMeshInSpace.ModifiableMesh_Create( this, flags );

                    needRecreateModifiableMesh = false;
                }
            }
            else
            {
                if (ParentMeshInSpace.ModifiableMesh_CreatedByObject == this)
                {
                    ParentMeshInSpace.ModifiableMesh_Destroy();
                    needRecreateModifiableMesh = false;
                }
            }

            //update data
            if (ParentMeshInSpace.ModifiableMesh_CreatedByObject == this)
            {
                UpdateModifiableMesh(context);
            }

            if (DisplaySkeleton)
            {
                RenderSkeleton(context.Owner);
            }
        }
        /// <summary>
        /// Get object to transform. find by reference. must be child of selected object.
        /// </summary>
        /// <param name="selectedObject"></param>
        /// <returns></returns>
        public static Component_ObjectInSpace CalculateObjectToTransform(Component_ObjectInSpace selectedObject)
        {
            Component_ObjectInSpace objectToTransform = null;

            //get object to transform. find by reference. must be child of selected object.
            //Component_TransformOffset specific

            Component current = selectedObject;

            while (current != null)
            {
                //check outside parent
                {
                    bool inside = current == selectedObject || ComponentUtility.IsChildInHierarchy(selectedObject, current);
                    if (!inside)
                    {
                        break;
                    }
                }

                //_ObjectInSpace
                var objectInSpace = current as Component_ObjectInSpace;
                if (objectInSpace != null)
                {
                    //check found result
                    if (!objectInSpace.Transform.ReferenceSpecified)
                    {
                        //found
                        objectToTransform = objectInSpace;
                        break;
                    }

                    objectInSpace.Transform.GetMember(current, out var outObject, out var outMember);
                    current = outObject as Component;
                    continue;
                }

                //_TransformOffset
                var transformOffset = current as Component_TransformOffset;
                if (transformOffset != null)
                {
                    if (transformOffset.Source.ReferenceSpecified)
                    {
                        transformOffset.Source.GetMember(current, out var outObject, out var outMember);
                        current = outObject as Component;
                        continue;
                    }
                }

                //stop
                break;
            }

            return(objectToTransform);
        }
        public void AddBaseObject(Component_ObjectInSpace obj)
        {
            var groupOfObjects = GetOrCreateGroupOfObjects();

            if (groupOfObjects != null)
            {
                if (!groupOfObjects.BaseObjects.Contains((Component)obj))
                {
                    groupOfObjects.BaseObjects.Add(ReferenceUtility.MakeRootReference <Component>(obj));
                }
            }
        }
示例#7
0
        public static void ShowBoxAroundObject(Component_ObjectInSpace obj, Viewport viewport)
        {
            // Find object by the cursor.
            //var obj = GetObjectByCursor(viewport);

            // Draw selection border.
            if (obj != null)
            {
                viewport.Simple3DRenderer.SetColor(new ColorValue(1, 1, 0));
                viewport.Simple3DRenderer.AddBounds(obj.SpaceBounds.CalculatedBoundingBox);
            }
        }
        protected override void OnViewportUpdateBeforeOutput()
        {
            base.OnViewportUpdateBeforeOutput();

            if (ObjectInSpace != null && needRecreateInstance)
            {
                instanceInScene?.Dispose();

                instanceInScene = (Component_ObjectInSpace)ObjectInSpace.Clone();
                Scene.AddComponent(instanceInScene);

                needRecreateInstance = false;
            }
        }
示例#9
0
        public Component_Character2DAITask_MoveToObject MoveTo(Component_ObjectInSpace target, bool run, bool clearTaskQueue = true)
        {
            if (clearTaskQueue)
            {
                ClearTaskQueue();
            }

            var task = CreateComponent <Component_Character2DAITask_MoveToObject>(enabled: false);

            task.Target  = target;
            task.Run     = run;
            task.Enabled = true;

            return(task);
        }
        public static void Detach(Component_ObjectInSpace objectToDetach, DocumentInstance documentforUndoRedo = null, UndoMultiAction undoMultiAction = null)
        {
            const string transformOffsetName = "Attach Transform Offset";

            var objectInSpace = objectToDetach;
            //var objectToTransform = CalculateObjectToTransform( objectInSpace );
            //if( objectToTransform != null )
            //	objectInSpace = objectToTransform;

            var transformOffset = objectInSpace.GetComponent(transformOffsetName) as Component_TransformOffset;

            if (transformOffset != null)
            {
                //change Transform
                {
                    //undo action
                    if (undoMultiAction != null)
                    {
                        var property = (Metadata.Property)objectInSpace.MetadataGetMemberBySignature("property:Transform");
                        var undoItem = new UndoActionPropertiesChange.Item(objectInSpace, property, objectInSpace.Transform, new object[0]);
                        undoMultiAction.AddAction(new UndoActionPropertiesChange(new UndoActionPropertiesChange.Item[] { undoItem }));
                    }

                    //remove reference
                    objectInSpace.Transform = new Reference <Transform>(objectInSpace.Transform, "");
                }

                //delete
                if (undoMultiAction != null)
                {
                    undoMultiAction.AddAction(new UndoActionComponentCreateDelete(documentforUndoRedo, new Component[] { transformOffset }, false));
                }
                else
                {
                    transformOffset.Dispose();
                }
            }
        }
        /////////////////////////////////////////

        internal void ObjectsInSpace_ObjectUpdate(Component_ObjectInSpace obj)
        {
            if (octree != null)
            {
                if (obj.sceneOctreeIndex == -1)
                {
                    //add object to the scene graph
                    obj.sceneOctreeIndex = octree.AddObject(obj.SpaceBounds.CalculatedBoundingBox, 0);                      // obj.sceneOctreeGroup );

                    //add to sceneGraphObjects
                    while (octreeObjects.Count <= obj.sceneOctreeIndex)
                    {
                        octreeObjects.Add(null);
                    }
                    octreeObjects[obj.sceneOctreeIndex] = obj;
                }
                else
                {
                    //update
                    octree.UpdateObject(obj.sceneOctreeIndex, obj.SpaceBounds.CalculatedBoundingBox, 0);                      // obj.sceneOctreeGroup );
                }
            }
        }
示例#12
0
            protected virtual bool CalculatePointPosition(Viewport viewport, out Vector3 position, out Component_ObjectInSpace collidedWith)
            {
                if (!viewport.MouseRelativeMode)
                {
                    var sceneDocumentWindow = DocumentWindow as Component_Scene_DocumentWindow;
                    if (sceneDocumentWindow != null)
                    {
                        var result = sceneDocumentWindow.CalculateCreateObjectPositionUnderCursor(viewport);
                        if (result.found)
                        {
                            position     = result.position;
                            collidedWith = result.collidedWith;
                            return(true);
                        }
                    }
                }

                position     = Vector3.Zero;
                collidedWith = null;
                return(false);
            }
        //

        public TransformToolObject_ObjectInSpace(Component_ObjectInSpace selectedObject)
            : base(selectedObject)
        {
            this.selectedObject = selectedObject;
            //objectToTransform = Component_ObjectInSpace_Utility.CalculateObjectToTransform( this.selectedObject );
        }
示例#14
0
 public static void SetRenderSceneIndex(Component_ObjectInSpace obj, int v)
 {
     obj._internalRenderSceneIndex = v;
 }
示例#15
0
        /////////////////////////////////////////
        //Component_ObjectInSpace

        public static int GetRenderSceneIndex(Component_ObjectInSpace obj)
        {
            return(obj._internalRenderSceneIndex);
        }
            protected override bool CalculatePointPosition(Viewport viewport, out Vector3 position, out Component_ObjectInSpace collidedWith)
            {
                var result = base.CalculatePointPosition(viewport, out position, out collidedWith);

                if (result)
                {
                    if (collidedWith != null)
                    {
                        CreatingObject.AddBaseObject(collidedWith);
                    }
                }

                return(result);
            }
        public static Component_TransformOffset Attach(Component_ObjectInSpace attachTo, Component_ObjectInSpace objectToAttach, DocumentInstance documentforUndoRedo = null, UndoMultiAction undoMultiAction = null)
        {
            var objectToTransform = CalculateObjectToTransform(objectToAttach);

            if (objectToTransform != null)
            {
                objectToAttach = objectToTransform;
            }

            //create _TransformOffset
            Component_TransformOffset transformOffset;

            {
                const string transformOffsetName = "Attach Transform Offset";

                transformOffset        = objectToAttach.CreateComponent <Component_TransformOffset>(enabled: false);
                transformOffset.Name   = transformOffsetName;
                transformOffset.Source = ReferenceUtility.MakeReference <Transform>(null, ReferenceUtility.CalculateThisReference(transformOffset, attachTo, "Transform"));

                try
                {
                    var f      = attachTo.Transform.Value;
                    var s      = objectToAttach.Transform.Value;
                    var offset = f.ToMatrix4().GetInverse() * s.ToMatrix4();
                    offset.Decompose(out Vector3 pos, out Quaternion rot, out Vector3 scl);

                    transformOffset.PositionOffset = pos;
                    transformOffset.RotationOffset = rot;
                    transformOffset.ScaleOffset    = scl;
                    //transformOffset.Matrix = offset;

                    //var offset = new Mat4( s.Rotation.ToMat3(), s.Position ) * new Mat4( f.Rotation.ToMat3(), f.Position ).GetInverse();
                    //var f = first.Transform.Value;
                    //var s = second.Transform.Value;
                    //var offset = new Mat4( s.Rotation.ToMat3(), s.Position ) * new Mat4( f.Rotation.ToMat3(), f.Position ).GetInverse();
                    ////var offset = second.Transform.Value.ToMat4() * first.Transform.Value.ToMat4().GetInverse();
                    //offset.Decompose( out Vec3 pos, out Quat rot, out Vec3 scl );

                    //transformOffset.PositionOffset = pos / f.Scale;// / s.Scale;
                    //transformOffset.RotationOffset = rot;

                    //transformOffset.ScaleOffset = s.Scale / f.Scale;
                    ////transformOffset.ScaleOffset = scl;
                }
                catch { }

                transformOffset.Enabled = true;

                if (undoMultiAction != null)
                {
                    undoMultiAction.AddAction(new UndoActionComponentCreateDelete(documentforUndoRedo, new Component[] { transformOffset }, true));
                }
            }

            //change Transform
            {
                //undo action
                if (undoMultiAction != null)
                {
                    var property = (Metadata.Property)objectToAttach.MetadataGetMemberBySignature("property:Transform");
                    var undoItem = new UndoActionPropertiesChange.Item(objectToAttach, property, objectToAttach.Transform, new object[0]);
                    undoMultiAction.AddAction(new UndoActionPropertiesChange(new UndoActionPropertiesChange.Item[] { undoItem }));
                }

                //configure reference
                objectToAttach.Transform = ReferenceUtility.MakeReference <Transform>(null, ReferenceUtility.CalculateThisReference(objectToAttach, transformOffset, "Result"));
            }

            return(transformOffset);
        }
示例#18
0
 public static void PerformGetRenderSceneData(Component_ObjectInSpace obj, ViewportRenderingContext context, GetRenderSceneDataMode mode)
 {
     obj.PerformGetRenderSceneData(context, mode);
 }
        //!!!!подобное для Brush режима
        //public delegate void CalculateCreateObjectPositionUnderCursorEventDelegate( Component_ObjectInSpace objectInSpace, ref bool found, ref Vector3 position );
        //public static event CalculateCreateObjectPositionUnderCursorEventDelegate CalculateCreateObjectPositionUnderCursorEvent;

        //public class CalculateCreateObjectPositionByRayResult
        //{
        //	public bool Found;
        //	public Vector3 Position;
        //	public Component_ObjectInSpace CollidedWith;
        //	public Vector3F Normal;
        //}

        public static (bool found, Vector3 position, Component_ObjectInSpace collidedWith) CalculateCreateObjectPositionByRay(Component_Scene scene, Component_ObjectInSpace objectInSpace, Ray ray, bool allowSnap)
        {
            //var viewport = ViewportControl.Viewport;

            //Vector2 mouse;
            //if( overrideMouse.HasValue )
            //	mouse = overrideMouse.Value;
            //else
            //{
            //	mouse = viewport.MousePosition;
            //	if( !new Rectangle( 0, 0, 1, 1 ).Contains( mouse ) )
            //		mouse = new Vector2( 0.5, 0.5 );
            //}

            //Ray ray;
            //if( overrideRay.HasValue )
            //	ray = overrideRay.Value;
            //else
            //	ray = viewport.CameraSettings.GetRayByScreenCoordinates( mouse );
            //!!!!? clamp max distance
            //ray.Direction = ray.Direction.GetNormalize() * 100;

            //!!!!можно конвекс форму делать вместо бокса
            Bounds localBounds = new Bounds();

            if (objectInSpace != null)
            {
                //particle system specific
                if (!(objectInSpace is Component_ParticleSystemInSpace))
                {
                    localBounds = objectInSpace.SpaceBounds.CalculatedBoundingBox - objectInSpace.Transform.Value.Position;
                }
            }
            if (localBounds.GetSize().X < 0.001)
            {
                localBounds.Expand(new Vector3(0.001, 0, 0));
            }
            if (localBounds.GetSize().Y < 0.001)
            {
                localBounds.Expand(new Vector3(0, 0.001, 0));
            }
            if (localBounds.GetSize().Z < 0.001)
            {
                localBounds.Expand(new Vector3(0, 0, 0.001));
            }

            double resultMinScale = 1.01;
            Component_ObjectInSpace resultMinScaleCollidedWith = null;

            if (objectInSpace != null)
            {
                //when objectInSpace != null

                Plane[] planes;
                {
                    var b1     = localBounds + ray.Origin;
                    var b2     = b1 + ray.Direction;
                    var points = CollectionUtility.Merge(b1.ToPoints(), b2.ToPoints());
                    ConvexHullAlgorithm.Create(points, out planes);
                }

                var item = new Component_Scene.GetObjectsInSpaceItem(Component_Scene.GetObjectsInSpaceItem.CastTypeEnum.All, null, true, planes);
                scene.GetObjectsInSpace(item);

                foreach (var resultItem in item.Result)
                {
                    if (objectInSpace != resultItem.Object && !resultItem.Object.GetAllParents(false).Contains(objectInSpace))
                    {
                        //mesh in space
                        if (resultItem.Object is Component_MeshInSpace meshInSpace)
                        {
                            Vector3[] verticesFull;
                            int[]     indices;
                            {
                                var b1     = localBounds + ray.Origin;
                                var b2     = b1 + ray.Direction;
                                var points = CollectionUtility.Merge(b1.ToPoints(), b2.ToPoints());
                                ConvexHullAlgorithm.Create(points, out verticesFull, out indices);
                            }

                            if (meshInSpace._Intersects(verticesFull, indices))
                            {
                                double minScale = 1.01;

                                double currentScale = 0.5;
                                //!!!!?
                                const double threshold = 0.00001;

                                double step = 0.25;
                                while (step > threshold)
                                {
                                    Vector3[] vertices = new Vector3[verticesFull.Length];
                                    for (int n = 0; n < vertices.Length; n++)
                                    {
                                        vertices[n] = verticesFull[n] - ray.Direction + ray.Direction * currentScale;
                                    }
                                    //Vector3[] vertices;
                                    //int[] indices;
                                    //{
                                    //	var b1 = localBounds + ray.Origin;
                                    //	var b2 = b1 + ray.Direction * currentScale;
                                    //	var points = CollectionUtility.Merge( b1.ToPoints(), b2.ToPoints() );
                                    //	ConvexHullAlgorithm.Create( points, out vertices, out indices );
                                    //}

                                    bool intersects = meshInSpace._Intersects(vertices, indices);

                                    if (!intersects)
                                    {
                                        minScale = currentScale;
                                    }

                                    if (intersects)
                                    {
                                        currentScale -= step;
                                    }
                                    else
                                    {
                                        currentScale += step;
                                    }
                                    step /= 2;
                                }

                                if (minScale <= 1 && minScale < resultMinScale)
                                {
                                    resultMinScale             = minScale;
                                    resultMinScaleCollidedWith = meshInSpace;
                                }
                            }
                        }

                        //!!!!какие еще
                    }
                }
            }
            else
            {
                //when objectInSpace == null

                var item = new Component_Scene.GetObjectsInSpaceItem(Component_Scene.GetObjectsInSpaceItem.CastTypeEnum.All, null, true, ray);
                scene.GetObjectsInSpace(item);

                foreach (var resultItem in item.Result)
                {
                    //mesh in space
                    if (resultItem.Object is Component_MeshInSpace meshInSpace)
                    {
                        if (meshInSpace.RayCast(ray, Component_Mesh.CompiledData.RayCastMode.Auto, out var scale, out var triangleIndex))
                        {
                            if (scale <= 1 && scale < resultMinScale)
                            {
                                resultMinScale             = scale;
                                resultMinScaleCollidedWith = meshInSpace;
                                //if( triangleIndex != -1 )
                                //{
                                //}
                            }
                        }
                    }

                    //!!!!какие еще
                }
            }

            bool    found;
            Vector3 pos;

            if (resultMinScale <= 1)
            {
                found = true;
                pos   = ray.GetPointOnRay(resultMinScale);
            }
            else
            {
                found = false;
                pos   = ray.Origin + ray.Direction.GetNormalize() * Math.Max(localBounds.GetBoundingSphere().Radius, 1) * 20;
            }

            //snap for 2D mode
            if (scene.Mode.Value == Component_Scene.ModeEnum._2D)
            {
                pos.Z = Math.Ceiling(pos.Z);
            }

            //snap
            if (allowSnap)
            {
                double snap;

                //if( Form.ModifierKeys.HasFlag( Keys.Control ) )
                snap = ProjectSettings.Get.SceneEditorStepMovement;
                //else
                //	snap = 0;
                if (snap != 0)
                {
                    Vector3 snapVec = new Vector3(snap, snap, snap);
                    pos += snapVec / 2;
                    pos /= snapVec;
                    pos  = new Vector3I((int)pos.X, (int)pos.Y, (int)pos.Z).ToVector3();
                    pos *= snapVec;
                }
            }

            //CalculateCreateObjectPositionUnderCursorEvent?.Invoke( objectInSpace, ref found, ref pos );

            return(found, pos, resultMinScaleCollidedWith);
            //objectToTransform.Transform = new Transform( pos, objectToTransform.Transform.Value.Rotation, objectToTransform.Transform.Value.Scale );
            //}
            //else
            //{
            //	var localBounds = objectInSpace.SpaceBounds.CalculatedBoundingBox - objectInSpace.Transform.Value.Position;

            //	//disable object to disable collisions
            //	var disable = ContainsPhysicsBodies( objectInSpace );
            //	if( disable )
            //		objectInSpace.Enabled = false;

            //	//!!!!contact group
            //	PhysicsConvexSweepTestItem castItem = new PhysicsConvexSweepTestItem( Matrix4.FromTranslate( ray.Origin ),
            //		Matrix4.FromTranslate( ray.Origin + ray.Direction ), 1, -1, PhysicsConvexSweepTestItem.ModeEnum.OneClosest, localBounds );
            //	Scene.PhysicsConvexSweepTest( new PhysicsConvexSweepTestItem[] { castItem } );

            //	//restore disabled object
            //	if( disable )
            //		objectInSpace.Enabled = true;

            //	Vector3 pos;
            //	if( castItem.Result.Length != 0 )
            //		pos = castItem.Result[ 0 ].Position;
            //	else
            //	{
            //		pos = ray.Origin + ray.Direction.GetNormalize() * Math.Max( localBounds.GetBoundingSphere().Radius, 1 ) * 20;
            //	}

            //	objectInSpace.Transform = new Transform( pos, objectInSpace.Transform.Value.Rotation, objectInSpace.Transform.Value.Scale );
            //}
        }
示例#20
0
 public static void PerformGetRenderSceneData(Component_ObjectInSpace obj, ViewportRenderingContext context, GetRenderSceneDataMode mode, Component_Scene.GetObjectsInSpaceItem modeGetObjectsItem)
 {
     obj.PerformGetRenderSceneData(context, mode, modeGetObjectsItem);
 }