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); } }
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); }
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); } } } }
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(); }
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); }
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; }
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); }