Example #1
0
        private void GetCameraOffsetForCenterAlignmentUsingVertices_ProcessObject(Kn5RenderableObject obj, Matrix matrix, ref Vector3 min, ref Vector3 max)
        {
            if (min.Z != 0f && obj.BoundingBox.HasValue)
            {
                var corners = obj.BoundingBox.Value.GetCorners();
                foreach (var c in corners)
                {
                    var sp = Vector3.TransformCoordinate(c, matrix);
                    if (sp.X < min.X || sp.Y < min.Y || sp.Z < min.Z ||
                        sp.X > max.X || sp.Y > max.Y || sp.Z > max.Z)
                    {
                        goto NextStep;
                    }
                }

                return;
            }

NextStep:
            var wm = obj.ParentMatrix * matrix;
            var vertices = obj.Vertices;

            for (var i = 0; i < vertices.Length; i++)
            {
                var sp = Vector3.TransformCoordinate(vertices[i].Position, wm);
                if (min.Z == 0f)
                {
                    min = sp;
                    max = sp;
                }
                else
                {
                    if (sp.X < min.X)
                    {
                        min.X = sp.X;
                    }
                    if (sp.Y < min.Y)
                    {
                        min.Y = sp.Y;
                    }
                    if (sp.Z < min.Z)
                    {
                        min.Z = sp.Z;
                    }
                    if (sp.X > max.X)
                    {
                        max.X = sp.X;
                    }
                    if (sp.Y > max.Y)
                    {
                        max.Y = sp.Y;
                    }
                    if (sp.Z > max.Z)
                    {
                        max.Z = sp.Z;
                    }
                }
            }
        }
        public void OnClick(Vector2 mousePosition) {
            var ray = Camera.GetPickingRay(mousePosition, new Vector2(Width, Height));

            var nodes = Scene.SelectManyRecursive(x => x as RenderableList)
                             .OfType<Kn5RenderableObject>()
                             .Where(node => {
                                 float d;
                                 return node.BoundingBox.HasValue && Ray.Intersects(ray, node.BoundingBox.Value, out d);
                             })
                             .Select(node => {
                                 var min = float.MaxValue;
                                 var found = false;

                                 var indices = node.Indices;
                                 var vertices = node.Vertices;
                                 var matrix = node.ParentMatrix;
                                 for (int i = 0, n = indices.Length / 3; i < n; i++) {
                                     var v0 = Vector3.TransformCoordinate(vertices[indices[i * 3]].Position, matrix);
                                     var v1 = Vector3.TransformCoordinate(vertices[indices[i * 3 + 1]].Position, matrix);
                                     var v2 = Vector3.TransformCoordinate(vertices[indices[i * 3 + 2]].Position, matrix);

                                     float distance;
                                     if (!Ray.Intersects(ray, v0, v1, v2, out distance) || distance >= min) continue;
                                     min = distance;
                                     found = true;
                                 }

                                 return found ? new {
                                     Node = node,
                                     Distance = min
                                 } : null;
                             })
                             .Where(x => x != null)
                             .OrderBy(x => x.Distance)
                             .Select(x => x.Node)
                             .ToList();

            if (nodes.Any()) {
                var first = nodes[0];
                if (first != _previousSelectedFirstObject) {
                    _previousSelectedObjects.Clear();
                    _previousSelectedObjects.Add(first);
                    _previousSelectedFirstObject = first;
                    SelectedObject = first;
                } else {
                    var filtered = nodes.Where(x => !_previousSelectedObjects.Contains(x)).ToList();
                    if (filtered.Any()) {
                        _previousSelectedObjects.Add(filtered[0]);
                        SelectedObject = filtered[0];
                    } else {
                        _previousSelectedObjects.Clear();
                        _previousSelectedObjects.Add(first);
                        SelectedObject = first;
                    }
                }
            } else {
                Deselect();
            }
        }
 public void Deselect() {
     SelectedObject = null;
     _previousSelectedObjects.Clear();
     _previousSelectedFirstObject = null;
 }
Example #4
0
 public virtual void Initialize(CarLightType type, Kn5RenderableList main, IniFileSection section) {
     Type = type;
     Name = section.GetNonEmpty("NAME");
     Emissive = section.GetVector3("COLOR").Select(y => (float)y).ToArray().ToVector3();
     Node = main.GetByName(Name);
 }