コード例 #1
0
ファイル: CollisionModel.cs プロジェクト: JOJOyh/ldd-modder
 protected override void ApplyTransformToElement(Matrix4 transform)
 {
     if (PartCollision.Parent is PartBone partBone)
     {
         var parentTrans = partBone.Transform.ToMatrixD().ToGL();
         var localTrans  = transform.ToMatrix4d() * parentTrans.Inverted();
         //transform = localTrans.ToMatrix4();
         PartCollision.Transform = ItemTransform.FromMatrix(localTrans.ToLDD());
     }
     else
     {
         base.ApplyTransformToElement(transform);
     }
 }
コード例 #2
0
            public void Render(DrawingContext2D drawingContext)
            {
                var shapeBoundingBox = _shape.BoundingBox;

                var translation = new Vector2(-shapeBoundingBox.X, -shapeBoundingBox.Y);

                var itemTransform = new ItemTransform(
                    ColorRgbaF.White,
                    Matrix3x2.CreateScale(_scale, _scale),
                    translation);

                AptRenderer.RenderGeometry(
                    drawingContext,
                    _context,
                    _shape,
                    itemTransform);
            }
コード例 #3
0
        public override void RenderModel(Camera camera, MeshRenderMode mode = MeshRenderMode.Solid)
        {
            if (ClonePattern?.Repetitions > 1)
            {
                if (ClonePattern is LinearPattern linearPattern)
                {
                    float lineLength = (linearPattern.Repetitions - 1) * linearPattern.Offset;
                    //var dir = linearPattern.Direction.ToGL();
                    RenderHelper.DrawLine(Transform, new Vector4(1f, 1f, 0f, 1f), Vector3.Zero, Vector3.UnitZ * lineLength, 1.5f);
                }

                if (ElementModels == null || ElementModels.Count == 0)
                {
                    return;
                }

                foreach (var elem in ClonePattern.Elements)
                {
                    var elemModel = ElementModels.FirstOrDefault(x => x.Element == elem);
                    if (elemModel != null && elemModel.Visible)
                    {
                        var  originalTrans = elemModel.Transform;
                        var  baseTransform = ItemTransform.FromMatrix(elemModel.Transform.ToLDD());
                        bool isSelected    = elemModel.IsSelected;

                        for (int i = 1; i < ClonePattern.Repetitions; i++)
                        {
                            if (ClonePattern.SkippedInstances.Contains(i))
                            {
                                continue;
                            }

                            var trans = ClonePattern.ApplyTransform(baseTransform, i).ToMatrix().ToGL();
                            //elemModel.SetTransform(trans, false);
                            elemModel.IsSelected = false;
                            elemModel.SetTemporaryTransform(trans);
                            elemModel.RenderModel(camera, mode);
                            elemModel.SetTemporaryTransform(null);
                        }
                        elemModel.IsSelected = isSelected;
                        //elemModel.SetTransform(originalTrans, false);
                    }
                }
            }
        }
コード例 #4
0
            public void Render(DrawingContext2D drawingContext)
            {
                var shapeBoundingBox = _shape.BoundingBox;

                var translation = new Vector2(-shapeBoundingBox.X, -shapeBoundingBox.Y);

                var itemTransform = new ItemTransform(
                    ColorRgbaF.White,
                    Matrix3x2.CreateScale(_scale, _scale),
                    translation);

                _renderingContext.SetDrawingContext(drawingContext);
                _renderingContext.PushTransform(itemTransform);

                _renderingContext.RenderGeometry(_shape, null);

                _renderingContext.PopTransform();
            }
コード例 #5
0
        public static List <ItemTransform> UpdateItem(ItemTransform iExt)
        {
            for (int ix = 0; ix < itemXForms.Count; ix++)
            {
                if (itemXForms[ix].ID == iExt.ID)
                {
                    itemXForms[ix] = iExt;
                    Debug.Log("in" + itemXForms[ix].Position);
                }
                else
                {
                    Debug.Log(itemXForms[ix].Position);
                }
            }

            UpdateData();
            return(itemXForms);
        }
コード例 #6
0
        protected virtual void ApplyTransformToElement(Matrix4 transform)
        {
            IsApplyingTransform = true;

            if (Element is IPhysicalElement physicalElement)
            {
                if (Element.Parent is IPhysicalElement parentElem)
                {
                    var parentTrans = parentElem.Transform.ToMatrixD().ToGL();
                    var localTrans  = transform.ToMatrix4d() * parentTrans.Inverted();
                    physicalElement.Transform = ItemTransform.FromMatrix(localTrans.ToLDD());
                }
                else
                {
                    physicalElement.Transform = ItemTransform.FromMatrix(transform.ToLDD());
                }
            }
            IsApplyingTransform = false;
        }
コード例 #7
0
        private List <BoneMapping> GetBoneMappings()
        {
            var bones     = new List <BoneMapping>();
            var boneNames = SceneToImport.Meshes.SelectMany(x => x.Bones).Select(x => x.Name).Distinct().ToList();

            if (!boneNames.Any())
            {
                return(bones);
            }

            var boneNodes = Assimp.AssimpHelper.GetNodeHierarchy(SceneToImport.RootNode)
                            .Where(x => boneNames.Contains(x.Name)) /*.OrderBy(x => x.GetLevel())*/.ToList();

            //include last bone if no weight
            if (boneNodes.LastOrDefault()?.ChildCount > 0)
            {
                var lastBone = boneNodes.Last();
                if (lastBone.MeshCount == 0)
                {
                    boneNodes.Add(lastBone.Children[0]);
                }
            }

            boneNames = boneNodes.Select(x => x.Name).ToList();//names in order

            foreach (var boneNode in boneNodes)
            {
                //var meshBone = SceneToImport.Meshes.SelectMany(x => x.Bones).FirstOrDefault(x => x.Name == boneNode.Name);
                //var pos1 = ItemTransform.FromMatrix(meshBone.OffsetMatrix.ToLDD());

                string parentName = boneNode.Parent?.Name;
                if (!boneNames.Contains(parentName))
                {
                    parentName = null;
                }

                var boneTransform = boneNode.GetFinalTransform().ToLDD();
                //var yAxis = boneTransform.TransformNormal(Simple3D.Vector3.UnitY);
                //boneTransform = Simple3D.Matrix4.FromAngleAxis((float)Math.PI * -0.5f, yAxis) * boneTransform;

                var mapping = new BoneMapping()
                {
                    Name       = boneNode.Name,
                    ParentName = parentName,
                    Transform  = ItemTransform.FromMatrix(boneTransform),
                    AssimpID   = boneNames.IndexOf(boneNode.Name)
                };
                bones.Add(mapping);
            }

            //Adjust bone rotation for LDD
            foreach (var bone in bones)
            {
                var target = bones.FirstOrDefault(x => x.ParentName == bone.Name);
                if (target != null)
                {
                    var dir   = (target.Transform.Position - bone.Transform.Position).Normalized();
                    var angle = Simple3D.Vector3d.AngleBetween(Simple3D.Vector3d.UnitX, dir);
                    var yAxis = Simple3D.Vector3d.Cross(Simple3D.Vector3d.UnitX, dir);
                    var rot   = Simple3D.Matrix4d.FromAngleAxis(angle, yAxis);
                    bone.Transform.Rotation = Quaterniond.ToEuler(rot.ExtractRotation()) * (180d / Math.PI);
                }
                else if (bone.ParentName != null)
                {
                    var parent = bones.FirstOrDefault(x => x.Name == bone.ParentName);
                    bone.Transform.Rotation = parent.Transform.Rotation;
                }
            }

            return(bones);
        }