public void SceneUpdated(string fileName) { //create the default camera, and update all viewports to use this camera //not all file formats support camera(e.g. STL/obj), and even they support, the file may not define a camera //so we need to manually define one camera = new Camera(); cameraNode = Scene.RootNode.CreateChildNode("aab-camera", camera); CalculateCamera(Scene, camera); //calculate the center of the whole scene foreach (Viewport vp in viewports) { vp.Frustum = camera; } movement = Movement.Create <StandardMovement>(this, camera, Scene); //update camera's position with new elevation UpdateCameraPosition(); //if the scene loaded has no light, we should also add some lights, otherwise the renderer will disable lighting and only show diffuse color int lights = 0; Scene.RootNode.Accept(delegate(Node n) { if (n.GetEntity <Light>() != null)//found the light, increment the light counter { lights++; } return(lights == 0);//continue to search if no lights found }); if (lights == 0) { //no light found in the scene, manually add a direction light Node lightNode = Scene.RootNode.CreateChildNode("aab-light1", new Light() { LightType = LightType.Directional, RotationMode = RotationMode.FixedDirection, Direction = new Vector3(1, 0.4, 0), NearPlane = 0.1, Color = new Vector3(Color.Lavender) }); lightNode.Excluded = true; //generated by Asset browser, we don't want it to be exported lightNode = Scene.RootNode.CreateChildNode("aab-light2", new Light() { LightType = LightType.Directional, RotationMode = RotationMode.FixedDirection, Direction = new Vector3(-1, -0.4, 0), NearPlane = 0.1, Color = new Vector3(Color.Lavender) }); lightNode.Excluded = true; //generated by Asset browser, we don't want it to be exported } //prepare the global ambient color, because a lot of file formats doesn't have this if (!Scene.AssetInfo.Ambient.HasValue) { Scene.AssetInfo.Ambient = new Vector4(Color.AliceBlue); } //make sure the renderer can find the texture in the same folder renderer.AssetDirectories.Clear(); if (!string.IsNullOrEmpty(fileName)) { var fileDir = Path.GetDirectoryName(fileName); renderer.AssetDirectories.Add(fileDir); renderer.AssetDirectories.Add("textures"); } //when scene reloaded, should manually clear the internal cache(textures/models) used in previous scene //it's ok to not clear the cache but may make your application consume more system and video memories renderer.ClearCache(); //now we attach a grid object to the scene ABUtils.CreateInternalNode(Scene.RootNode, "aab-grid", grid = new Grid()); ABUtils.CreateInternalNode(Scene.RootNode, "aab-axises", new Axises()); ABUtils.CreateInternalNode(Scene.RootNode, "aab-background", new Background()); SetUpVector(up); Invalidate(); }
public void SceneUpdated(string fileName) { //create the default camera, and update all viewports to use this camera //not all file formats support camera(e.g. STL/obj), and even they support, the file may not define a camera //so we need to manually define one camera = new Camera(); cameraNode = Scene.RootNode.CreateChildNode("aab-camera", camera); cameraNode.Excluded = true;//generated by Asset browser, we don't want it to be exported camera.FarPlane = 4000; camera.NearPlane = 0.1; cameraNode.Transform.Translation = new Vector3(10, 10, 10); camera.LookAt = Vector3.Origin; foreach (Viewport vp in viewports) { vp.Frustum = camera; } movement = Movement.Create <StandardMovement>(this, camera, Scene); //update camera's position with new elevation UpdateCameraPosition(); //if the scene loaded has no light, we should also add some lights, otherwise the renderer will disable lighting and only show diffuse color int lights = 0; Scene.RootNode.Accept(delegate(Node n) { if (n.GetEntity <Light>() != null)//found the light, increment the light counter { lights++; } return(lights == 0);//continue to search if no lights found }); if (lights == 0) { //no light found in the scene, manually add some lights in random positions Random r = new Random(); double elevation = Scene.RootNode.GetBoundingBox().Maximum.Length; for (int i = 0; i < 2; i++) { Vector3 pos = new Vector3(); pos.x = (r.NextDouble() - 0.5) * 2 * elevation; pos.y = (r.NextDouble() - 0.5) * 2 * elevation; pos.z = (r.NextDouble() - 0.5) * 2 * elevation; Node lightNode = Scene.RootNode.CreateChildNode("aab-light#" + i, new Light() { LightType = LightType.Point, NearPlane = 0.1, Color = new Vector3(Color.Lavender) }); lightNode.Transform.Translation = pos; lightNode.Excluded = true;//generated by Asset browser, we don't want it to be exported } } //prepare the global ambient color, because a lot of file formats doesn't have this if (!Scene.AssetInfo.Ambient.HasValue) { Scene.AssetInfo.Ambient = new Vector4(Color.AliceBlue); } //make sure the renderer can find the texture in the same folder renderer.AssetDirectories.Clear(); if (!string.IsNullOrEmpty(fileName)) { renderer.AssetDirectories.Add(Path.GetDirectoryName(fileName)); } //when scene reloaded, should manually clear the internal cache(textures/models) used in previous scene //it's ok to not clear the cache but may make your application consume more system and video memories renderer.ClearCache(); //now we attach a grid object to the scene ABUtils.CreateInternalNode(Scene.RootNode, "aab-grid", new Grid(renderer, gridShader)); Invalidate(); }