private void InteractionHandler() { //Add new Geometry if (Keyboard.GetKey(KeyCodes.D1) && _keyTimeout < 0) { _keyTimeout = 1; Geometry geometry = CreatePrimitiveGeometry.CreateCuboidGeometry(1, 1, 1); AddGeometryToSceneNode(geometry, new float3(0, 0, 0)); } if (Keyboard.GetKey(KeyCodes.D2) && _keyTimeout < 0) { _keyTimeout = 1; Geometry geometry = CreatePrimitiveGeometry.CreatePyramidGeometry(1, 1, 1); AddGeometryToSceneNode(geometry, new float3(0, 0, 0)); } if (Keyboard.GetKey(KeyCodes.D3) && _keyTimeout < 0) { _keyTimeout = 1; Geometry geometry = CreatePrimitiveGeometry.CreateConeGeometry(1, 1, 15); AddGeometryToSceneNode(geometry, new float3(0, 0, 0)); } if (Keyboard.GetKey(KeyCodes.D4) && _keyTimeout < 0) { _keyTimeout = 1; Geometry geometry = CreatePrimitiveGeometry.CreateSpehreGeometry(1, 30, 15); AddGeometryToSceneNode(geometry, new float3(0, 0, 0)); } _keyTimeout -= DeltaTime; //following actions are only allowed if something is selected if (_selectedNode == null) { return; } //Translate Geometry if (Keyboard.GetKey(KeyCodes.G)) { _isTranslating = true; } if (_isTranslating) { float3 worldPos = new float3(Mouse.Velocity.x * .0001f, Mouse.Velocity.y * -.0001f, Mouse.WheelVel * .001f); _selectedNode.GetTransform().Translation += worldPos.xyz; if (Mouse.LeftButton) { _isTranslating = false; } } //Scaling Geometry if (Keyboard.GetKey(KeyCodes.S)) { _isScaling = true; } if (_isScaling) { _selectedNode.GetTransform().Scale += new float3(Mouse.Velocity.y, Mouse.Velocity.y, Mouse.Velocity.y) * .0001f; if (Mouse.LeftButton) { _isScaling = false; } } //DeleteGeom if (Keyboard.GetKey(KeyCodes.Delete) && _keyTimeout < 0) { _keyTimeout = 1; int currentGeometryIndex = _parentNode.Children.IndexOf(_selectedNode); _activeGeometrys.Remove(currentGeometryIndex); Dictionary <int, Geometry> zwerg = new Dictionary <int, Geometry>(); foreach (int key in _activeGeometrys.Keys) { if (key > currentGeometryIndex) { Geometry test = _activeGeometrys[key]; zwerg.Add(key - 1, test); } else { zwerg.Add(key, _activeGeometrys[key]); } } _activeGeometrys.Clear(); foreach (KeyValuePair <int, Geometry> item in zwerg) { _activeGeometrys.Add(item.Key, item.Value); } _parentNode.Children.RemoveAt(currentGeometryIndex); _selectedNode = null; _currentPick = null; } //Insert if (Keyboard.GetKey(KeyCodes.I) && _keyTimeout < 0) { _keyTimeout = .25f; int currentGeometryIndex = _parentNode.Children.IndexOf(_selectedNode); SceneNode currentSelection = _parentNode.Children[currentGeometryIndex]; Geometry currentSelectedGeometry = _activeGeometrys[currentGeometryIndex]; currentSelectedGeometry.InsetFace(rng.Next(4, currentSelectedGeometry.GetAllFaces().Count()), .5f); Geometry copy = currentSelectedGeometry.CloneGeometry(); _activeGeometrys[currentGeometryIndex] = copy; currentSelectedGeometry.Triangulate(); JometriMesh geometryMesh = new JometriMesh(currentSelectedGeometry); Mesh meshComponent = new Mesh { Vertices = geometryMesh.Vertices, Triangles = geometryMesh.Triangles, Normals = geometryMesh.Normals, }; currentSelection.Components[2] = meshComponent; } //Extrude if (Keyboard.GetKey(KeyCodes.E) && _keyTimeout < 0) { _keyTimeout = .25f; int currentGeometryIndex = _parentNode.Children.IndexOf(_selectedNode); SceneNode currentSelection = _parentNode.Children[currentGeometryIndex]; Geometry currentSelectedGeometry = _activeGeometrys[currentGeometryIndex]; currentSelectedGeometry.ExtrudeFace(rng.Next(4, currentSelectedGeometry.GetAllFaces().Count()), 1); Geometry copy = currentSelectedGeometry.CloneGeometry(); _activeGeometrys[currentGeometryIndex] = copy; currentSelectedGeometry.Triangulate(); JometriMesh geometryMesh = new JometriMesh(currentSelectedGeometry); Mesh meshComponent = new Mesh { Vertices = geometryMesh.Vertices, Triangles = geometryMesh.Triangles, Normals = geometryMesh.Normals, }; currentSelection.Components[2] = meshComponent; } //Add Catmull-Clark if (Keyboard.GetKey(KeyCodes.C) && _keyTimeout < 0) { _keyTimeout = .25f; int currentGeometryIndex = _parentNode.Children.IndexOf(_selectedNode); SceneNode currentSelection = _parentNode.Children[currentGeometryIndex]; Geometry currentSelectedGeometry = _activeGeometrys[currentGeometryIndex]; currentSelectedGeometry = SubdivisionSurface.CatmullClarkSubdivision(currentSelectedGeometry); Geometry copy = currentSelectedGeometry.CloneGeometry(); _activeGeometrys[currentGeometryIndex] = copy; currentSelectedGeometry.Triangulate(); JometriMesh geometryMesh = new JometriMesh(currentSelectedGeometry); Mesh meshComponent = new Mesh { Vertices = geometryMesh.Vertices, Triangles = geometryMesh.Triangles, Normals = geometryMesh.Normals, }; currentSelection.Components[2] = meshComponent; } }