private void AddGeometryToSceneNode(Geometry geometry, float3 position) { Geometry newGeo = geometry.CloneGeometry(); newGeo.Triangulate(); JometriMesh geometryMesh = new JometriMesh(newGeo); SceneNode sceneNodeContainer = new SceneNode { Components = new List <SceneComponent>() }; Mesh meshComponent = new Mesh { Vertices = geometryMesh.Vertices, Triangles = geometryMesh.Triangles, Normals = geometryMesh.Normals, }; Transform translationComponent = new Transform { Rotation = float3.Zero, Scale = new float3(1, 1, 1), Translation = position }; sceneNodeContainer.Components.Add(translationComponent); sceneNodeContainer.Components.Add(MakeEffect.FromDiffuseSpecular(_defaultColor, float4.Zero)); sceneNodeContainer.Components.Add(meshComponent); _parentNode.Children.Add(sceneNodeContainer); _activeGeometrys.Add(_parentNode.Children.IndexOf(sceneNodeContainer), geometry); }
private void AddGeometryToSceneNode(Geometry geometry, float3 position) { Geometry newGeo = geometry.CloneGeometry(); newGeo.Triangulate(); var geometryMesh = new JometriMesh(newGeo); var sceneNodeContainer = new SceneNode { Components = new List <SceneComponent>() }; var meshComponent = new Mesh { Vertices = geometryMesh.Vertices, Triangles = geometryMesh.Triangles, Normals = geometryMesh.Normals, }; var translationComponent = new Transform { Rotation = float3.Zero, Scale = new float3(1, 1, 1), Translation = position }; var shaderEffect = ShaderCodeBuilder.Default; shaderEffect.SetEffectParam(UniformNameDeclarations.AlbedoColor, _defaultColor); sceneNodeContainer.Components.Add(translationComponent); sceneNodeContainer.Components.Add(shaderEffect); sceneNodeContainer.Components.Add(meshComponent); _parentNode.Children.Add(sceneNodeContainer); _activeGeometrys.Add(_parentNode.Children.IndexOf(sceneNodeContainer), geometry); }
private void AddGeometryToSceneNode(Geometry geometry, float3 position) { Geometry newGeo = geometry.CloneGeometry(); newGeo.Triangulate(); var geometryMesh = new JometriMesh(newGeo); var sceneNodeContainer = new SceneNodeContainer { Components = new List <SceneComponentContainer>() }; var meshComponent = new Mesh { Vertices = geometryMesh.Vertices, Triangles = geometryMesh.Triangles, Normals = geometryMesh.Normals, }; var translationComponent = new TransformComponent { Rotation = float3.Zero, Scale = new float3(1, 1, 1), Translation = position }; var materialComponent = new MaterialComponent { Diffuse = new MatChannelContainer(), Specular = new SpecularChannelContainer(), }; materialComponent.Diffuse.Color = _defaultColor; sceneNodeContainer.Components.Add(translationComponent); sceneNodeContainer.Components.Add(materialComponent); sceneNodeContainer.Components.Add(meshComponent); _parentNode.Children.Add(sceneNodeContainer); _activeGeometrys.Add(_parentNode.Children.IndexOf(sceneNodeContainer), geometry); }
private void InteractionHandler() { //Add new Geometry if (Keyboard.GetKey(KeyCodes.D1) && _keyTimeout < 0) { _keyTimeout = 1; var geometry = CreatePrimitiveGeometry.CreateCuboidGeometry(1, 1, 1); AddGeometryToSceneNode(geometry, new float3(0, 0, 0)); } if (Keyboard.GetKey(KeyCodes.D2) && _keyTimeout < 0) { _keyTimeout = 1; var geometry = CreatePrimitiveGeometry.CreatePyramidGeometry(1, 1, 1); AddGeometryToSceneNode(geometry, new float3(0, 0, 0)); } if (Keyboard.GetKey(KeyCodes.D3) && _keyTimeout < 0) { _keyTimeout = 1; var geometry = CreatePrimitiveGeometry.CreateConeGeometry(1, 1, 15); AddGeometryToSceneNode(geometry, new float3(0, 0, 0)); } if (Keyboard.GetKey(KeyCodes.D4) && _keyTimeout < 0) { _keyTimeout = 1; var 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) { var 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); var zwerg = new Dictionary <int, Geometry>(); foreach (var key in _activeGeometrys.Keys) { if (key > currentGeometryIndex) { var test = _activeGeometrys[key]; zwerg.Add(key - 1, test); } else { zwerg.Add(key, _activeGeometrys[key]); } } _activeGeometrys.Clear(); foreach (var 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; var currentGeometryIndex = _parentNode.Children.IndexOf(_selectedNode); var currentSelection = _parentNode.Children[currentGeometryIndex]; var currentSelectedGeometry = _activeGeometrys[currentGeometryIndex]; currentSelectedGeometry.InsetFace(rng.Next(4, currentSelectedGeometry.GetAllFaces().Count()), .5f); var copy = currentSelectedGeometry.CloneGeometry(); _activeGeometrys[currentGeometryIndex] = copy; currentSelectedGeometry.Triangulate(); var geometryMesh = new JometriMesh(currentSelectedGeometry); var 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; var currentGeometryIndex = _parentNode.Children.IndexOf(_selectedNode); var currentSelection = _parentNode.Children[currentGeometryIndex]; var currentSelectedGeometry = _activeGeometrys[currentGeometryIndex]; currentSelectedGeometry.ExtrudeFace(rng.Next(4, currentSelectedGeometry.GetAllFaces().Count()), 1); var copy = currentSelectedGeometry.CloneGeometry(); _activeGeometrys[currentGeometryIndex] = copy; currentSelectedGeometry.Triangulate(); var geometryMesh = new JometriMesh(currentSelectedGeometry); var 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; var currentGeometryIndex = _parentNode.Children.IndexOf(_selectedNode); var currentSelection = _parentNode.Children[currentGeometryIndex]; var currentSelectedGeometry = _activeGeometrys[currentGeometryIndex]; currentSelectedGeometry = SubdivisionSurface.CatmullClarkSubdivision(currentSelectedGeometry); var copy = currentSelectedGeometry.CloneGeometry(); _activeGeometrys[currentGeometryIndex] = copy; currentSelectedGeometry.Triangulate(); var geometryMesh = new JometriMesh(currentSelectedGeometry); var meshComponent = new Mesh { Vertices = geometryMesh.Vertices, Triangles = geometryMesh.Triangles, Normals = geometryMesh.Normals, }; currentSelection.Components[2] = meshComponent; } }
// Init is called on startup. public override void Init() { var outlineOne = new PolyBoundary //CCW!! { Points = new List <float3> { new float3(1, 0, 0), new float3(1.25f, 0.5f, 0.5f), new float3(1, 1, 1), new float3(0, 1, 1), new float3(-0.25f, 0.5f, 0.5f), new float3(0, 0, 0) }, IsOuter = true }; var outlineOneHole = new PolyBoundary //CW!! { Points = new List <float3> { new float3(0.75f, 0.25f, 0.25f), new float3(0.25f, 0.25f, 0.25f), new float3(0.25f, 0.75f, 0.75f), new float3(0.75f, 0.75f, 0.75f) }, IsOuter = false }; var outlineTwo = new PolyBoundary //CCW!! { Points = new List <float3> { new float3(1, 0, 0), new float3(1, 0.707f, 0.707f), new float3(0, 0.707f, 0.707f), new float3(0, 0, 0) }, IsOuter = true }; var outlineThree = new PolyBoundary //CCW!! { Points = new List <float3> { new float3(0, 0, 0), new float3(1, 0, 1), new float3(0, 0.5f, 0.5f) }, IsOuter = true }; var geomOutlinesOne = new List <PolyBoundary> { outlineOne, outlineOneHole }; var geomOne = new Geometry(geomOutlinesOne); geomOne.Extrude2DPolygon(0.5f, true); geomOne.Triangulate(); var meshOne = new JometriMesh(geomOne); var geomCubeOutlines = new List <PolyBoundary> { outlineTwo }; var geomCube = new Geometry(geomCubeOutlines); geomCube.Extrude2DPolygon(1, false); //geomCube.Extrude2DPolygon(1, true); geomCube.Triangulate(); var cube = new JometriMesh(geomCube); var geomTriangleOutlines = new List <PolyBoundary> { outlineThree }; var geomTri = new Geometry(geomTriangleOutlines); geomTri.Triangulate(); var triangle = new JometriMesh(geomTri); ////////////////// Fill SceneNode //////////////////////////////// var parentNode = new SceneNode { Components = new List <SceneComponent>(), Children = new ChildList() }; var parentTrans = new Transform { Rotation = float3.Zero, Scale = float3.One, Translation = new float3(0, 0, 0) }; parentNode.Components.Add(parentTrans); var sceneNodeCOne = new SceneNode { Components = new List <SceneComponent>() }; var meshCOne = new Mesh { Vertices = meshOne.Vertices, Triangles = meshOne.Triangles, Normals = meshOne.Normals, }; var tranC = new Transform { Rotation = float3.Zero, Scale = float3.One, Translation = new float3(0, 0, 0) }; sceneNodeCOne.Components.Add(tranC); sceneNodeCOne.Components.Add(meshCOne); /////////////////////////////////////////////////////////// var sceneNodeCCube = new SceneNode { Components = new List <SceneComponent>() }; var meshCCube = new Mesh { Vertices = cube.Vertices, Triangles = cube.Triangles, Normals = cube.Normals, }; var tranCube = new Transform { Rotation = float3.Zero, Scale = float3.One, Translation = new float3(-2, -1, 0) }; sceneNodeCCube.Components.Add(tranCube); sceneNodeCCube.Components.Add(meshCCube); ////////////////////////////////////////////////////////////////// var sceneNodeCTri = new SceneNode { Components = new List <SceneComponent>() }; var meshCTri = new Mesh { Vertices = triangle.Vertices, Triangles = triangle.Triangles, Normals = triangle.Normals, }; var tranTri = new Transform { Rotation = float3.Zero, Scale = float3.One, Translation = new float3(1.5f, -1, 0) }; sceneNodeCTri.Components.Add(tranTri); sceneNodeCTri.Components.Add(meshCTri); ////////////////////////////////////////////////////////////////// parentNode.Children.Add(sceneNodeCTri); parentNode.Children.Add(sceneNodeCOne); parentNode.Children.Add(sceneNodeCCube); var sc = new SceneContainer { Children = new List <SceneNode> { parentNode } }; _renderer = new SceneRendererForward(sc); // Set the clear color for the back buffer to white (100% intensity in all color channels R, G, B, A). RC.ClearColor = new float4(0, 1, 1, 1); }