public int TotalLightnings { get { return indexBuffer.Count / (2 * 10); } } // number of points for each line is 2, number of lines for each lightning is 10 public LightningShot(SceneManager sceneManager, TriangleSelector worldTriangles, float worldInfinity = 5000, float shotSpeed = 0.1f, float shotRadius = 100) { this.sceneManager = sceneManager; this.worldTriangles = worldTriangles; this.worldInfinity = worldInfinity; this.shotSpeed = shotSpeed; this.shotRadius = shotRadius; indexBuffer = IndexBuffer.Create(IndexType._16Bit); indexBuffer.Reallocate(64000); for (int i = 0; i < indexBuffer.AllocatedCount - 1; i++) indexBuffer.Add(i); vertexBuffer = VertexBuffer.Create(); }
static void openFolder(string newFolder) { textureManager.Stop(); textureManager.Start(TextureManagerThreadCount); textureManager.EnqueueUnloadingOfAllLoadedTextures(); animationManager.Clear(); previewPlateInfo.Clear(); irr.GUI.RootElement.GetElementFromID(CurrentFolderStaticTextId).Text = newFolder; SceneNode p = irr.Scene.GetSceneNodeFromID(PreviewRootNodeId); p.RemoveChildren(); int r = 10; float x = 0, z = 0; Mesh m = irr.Scene.MeshCache.GetMesh(PreviewPlateMeshName); string[] f = Directory.GetFiles(newFolder, "*.*", SearchOption.TopDirectoryOnly); for (int i = 0; i < f.Length; i++) { x += PreviewPlateSize * 1.1f; if ((i % r) == 0) { x = 0; z += PreviewPlateSize * 1.1f; } MeshSceneNode n = irr.Scene.AddMeshSceneNode(m, p, i | PreviewPlateNodeIdFlag); n.SetMaterialFlag(MaterialFlag.Lighting, false); n.Position = new Vector3Df(x, 1000, z); textureManager.LoadTexture(n, f[i], PreviewTextureSize); TriangleSelector s = irr.Scene.CreateTriangleSelector(n.Mesh, n); n.TriangleSelector = s; s.Drop(); previewPlateInfo.Add(n.ID, Path.GetFileName(f[i])); } irr.Scene.ActiveCamera.Position = new Vector3Df(PreviewPlateSize * (r - 1) * 1.1f / 2, 6 * PreviewPlateSize, 0); irr.Scene.ActiveCamera.Target = new Vector3Df(irr.Scene.ActiveCamera.Position.X, 0, PreviewPlateSize * 5); maxScrollPosition = (f.Length / r) * PreviewPlateSize * 1.1f; tasksAddedToTextureManager = textureManager.GetCommandQueueLength(); }
} // number of points for each line is 2, number of lines for each lightning is 10 public LightningShot(SceneManager sceneManager, TriangleSelector worldTriangles, float worldInfinity = 5000, float shotSpeed = 0.1f, float shotRadius = 100) { this.sceneManager = sceneManager; this.worldTriangles = worldTriangles; this.worldInfinity = worldInfinity; this.shotSpeed = shotSpeed; this.shotRadius = shotRadius; indexBuffer = IndexBuffer.Create(IndexType._16Bit); indexBuffer.Reallocate(64000); for (int i = 0; i < indexBuffer.AllocatedCount - 1; i++) { indexBuffer.Add(i); } vertexBuffer = VertexBuffer.Create(); }
public void deformCyl(MeshSceneNode t, Vector3Df position, Vector3Df direction, Triangle3Df triangle) { //get the closest vector to this point //USE BRUTE FORCE FOR RIGHT NOW Vertex3D[] v = (Vertex3D[])t.Mesh.MeshBuffers[0].Vertices; TriangleSelector tri = device.SceneManager.CreateTriangleSelector(t.Mesh, t); t.TriangleSelector = tri; tri.Drop(); int size = t.Mesh.MeshBuffers[0].VertexCount; int min = 0; float minDist = v[0].Position.GetDistanceFromSQ(position); for (int i = 1; i < size; i++) { //nsole.WriteLine(v[i].Position.SphericalCoordinateAngles.X); //query verts float currDist = v[i].Position.GetDistanceFromSQ(position); // float currDist = v[i].TCoords - position; if (currDist < minDist) { min = i; minDist = currDist; } } //int radius = 2; //for (; radius > 0; radius--) //{// this should give a staircase like effect //v[min - radius].Position = new Vector3Df(v[min - radius].Position + v[min - radius].Normal * direction); if ((v[min].Position.X * v[min].Position.X + v[min].Position.Z * v[min].Position.Z) > 100 || direction.X > 0) { Console.WriteLine("Min = " + min); v[min].Position = new Vector3Df(v[min].Position + v[min].Normal * 2 * direction); //} t.Mesh.MeshBuffers[0].UpdateVertices(v, 0); t.Mesh.MeshBuffers[0].SetDirty(HardwareBufferType.VertexAndIndex); } //device.SceneManager.MeshManipulator.RecalculateNormals(t.Mesh); }
public void Initialize() { //var light = Scene.AddLightSceneNode(Scene.RootNode,new Vector3Df(2, 6, 3), new Colorf(200, 200, 180), 20); var light = Scene.AddLightSceneNode(null, new Vector3Df(-30, 35, -25)); light.Radius = 25; light.CastShadows = true; light.LightType = LightType.Point; var sun = Scene.AddLightSceneNode(null, new Vector3Df(40, 100, 40)); sun.Radius = 50; sun.CastShadows = true; sun.LightType = LightType.Point; sphere = Scene.AddAnimatedMeshSceneNode(Scene.AddSphereMesh("sphere", 10f)); sphere.Scale = new Vector3Df(1); sphere.SetMaterialFlag(MaterialFlag.Lighting, true); sphere.Position = new Vector3Df(1, 11, 1); //sphere.SetMaterialTexture(0, Driver.GetTexture("Mars.jpg")); sphere.SetMaterialTexture(0, GeneratePlanetTexture(new Vector2Dd(300, 300))); Scene.MeshManipulator.SetVertexColors(sphere.Mesh, new Color(200, 200, 200)); var terrain = Scene.AddAnimatedMeshSceneNode(Scene.AddHillPlaneMesh("terrain", new Dimension2Df(1, 1), new Dimension2Di(128, 128), new Material(), 0)); terrain.Position = new Vector3Df(0, 0, 0); terrain.SetMaterialFlag(MaterialFlag.Lighting, true); Scene.MeshManipulator.SetVertexColors(terrain.Mesh, new Color(220, 220, 220)); selector = Scene.CreateOctreeTriangleSelector(terrain.Mesh, terrain, 128); terrain.TriangleSelector = selector; Scene.CreateCollisionResponseAnimator(selector, terrain); _cam = new Camera(this); selectionCube = Scene.AddCubeSceneNode(10, null, -1); selectionCube.SetMaterialFlag(MaterialFlag.Wireframe, true); }
static void Main(string[] args) { DriverType driverType; if (!AskUserForDriver(out driverType)) { return; } IrrlichtDevice device = IrrlichtDevice.CreateDevice(driverType, new Dimension2Di(640, 480)); if (device == null) { return; } VideoDriver driver = device.VideoDriver; SceneManager smgr = device.SceneManager; // load the scene if (args.Length > 0) { smgr.LoadScene(args[0]); } else { smgr.LoadScene("../../media/example.irr"); } CameraSceneNode camera = smgr.AddCameraSceneNodeFPS(null, 50, 0.1f); // create a meta triangle selector to hold several triangle selectors MetaTriangleSelector meta = smgr.CreateMetaTriangleSelector(); List <SceneNode> nodes = smgr.GetSceneNodesFromType(SceneNodeType.Any); // find all nodes foreach (SceneNode n in nodes) { TriangleSelector selector = null; switch (n.Type) { case SceneNodeType.Cube: case SceneNodeType.AnimatedMesh: // because the selector won't animate with the mesh, // and is only being used for camera collision, we'll just use an approximate // bounding box instead of "(node as AnimatedMeshSceneNode).GetMesh(0)" selector = smgr.CreateTriangleSelectorFromBoundingBox(n); break; case SceneNodeType.Mesh: case SceneNodeType.Sphere: // derived from MeshSceneNode selector = smgr.CreateTriangleSelector((n as MeshSceneNode).Mesh, n); break; case SceneNodeType.Terrain: selector = smgr.CreateTerrainTriangleSelector(n as TerrainSceneNode); break; case SceneNodeType.Octree: selector = smgr.CreateOctreeTriangleSelector((n as MeshSceneNode).Mesh, n); break; } if (selector != null) { // add it to the meta selector, which will take a reference to it meta.AddTriangleSelector(selector); // and drop my reference to it, so that the meta selector owns it selector.Drop(); } } SceneNodeAnimator anim = smgr.CreateCollisionResponseAnimator(meta, camera, new Vector3Df(5), new Vector3Df(0)); meta.Drop(); // i'm done with the meta selector now camera.AddAnimator(anim); anim.Drop(); // i'm done with the animator now // and set the camera position so that it doesn't start off stuck in the geometry camera.Position = new Vector3Df(0, 20, 0); // point the camera at the cube node, by finding the first node of type SceneNodeType.Cube SceneNode cube = smgr.GetSceneNodeFromType(SceneNodeType.Cube); if (cube != null) { camera.Target = cube.AbsolutePosition; } int lastFPS = -1; while (device.Run()) { if (device.WindowActive) { driver.BeginScene(true, true, new Color(200, 200, 200)); smgr.DrawAll(); driver.EndScene(); int fps = driver.FPS; if (lastFPS != fps) { device.SetWindowCaption(String.Format( "Load Irrlicht File example - Irrlicht Engine [{0}] fps: {1}", driver.Name, fps)); lastFPS = fps; } } } device.Drop(); }
static void Main() { DriverType?driverType = AskForDriver(); if (!driverType.HasValue) { return; } IrrlichtDevice device = IrrlichtDevice.CreateDevice(driverType.Value, new Dimension2Di(640, 480)); if (device == null) { return; } VideoDriver driver = device.VideoDriver; SceneManager smgr = device.SceneManager; device.FileSystem.AddFileArchive("../../media/map-20kdm2.pk3"); AnimatedMesh q3levelmesh = smgr.GetMesh("20kdm2.bsp"); MeshSceneNode q3node = null; // The Quake mesh is pickable, but doesn't get highlighted. if (q3levelmesh != null) { q3node = smgr.AddOctreeSceneNode(q3levelmesh.GetMesh(0), null, IDFlag_IsPickable); } TriangleSelector selector = null; if (q3node != null) { q3node.Position = new Vector3Df(-1350, -130, -1400); selector = smgr.CreateOctreeTriangleSelector(q3node.Mesh, q3node, 128); q3node.TriangleSelector = selector; // We're not done with this selector yet, so don't drop it. } // Set a jump speed of 3 units per second, which gives a fairly realistic jump // when used with the gravity of (0, -1000, 0) in the collision response animator. CameraSceneNode camera = smgr.AddCameraSceneNodeFPS(null, 100.0f, 0.3f, ID_IsNotPickable, null, true, 3.0f); camera.Position = new Vector3Df(50, 50, -60); camera.Target = new Vector3Df(-70, 30, -60); if (selector != null) { SceneNodeAnimator anim = smgr.CreateCollisionResponseAnimator( selector, camera, new Vector3Df(30, 50, 30), new Vector3Df(0, -1000, 0), new Vector3Df(0, 30, 0)); selector.Drop(); // As soon as we're done with the selector, drop it. camera.AddAnimator(anim); anim.Drop(); // And likewise, drop the animator when we're done referring to it. } // Now I create three animated characters which we can pick, a dynamic light for // lighting them, and a billboard for drawing where we found an intersection. // First, let's get rid of the mouse cursor. We'll use a billboard to show what we're looking at. device.CursorControl.Visible = false; // Add the billboard. BillboardSceneNode bill = smgr.AddBillboardSceneNode(); bill.SetMaterialType(MaterialType.TransparentAddColor); bill.SetMaterialTexture(0, driver.GetTexture("../../media/particle.bmp")); bill.SetMaterialFlag(MaterialFlag.Lighting, false); bill.SetMaterialFlag(MaterialFlag.ZBuffer, false); bill.SetSize(20, 20, 20); bill.ID = ID_IsNotPickable; // This ensures that we don't accidentally ray-pick it AnimatedMeshSceneNode node = null; // Add an MD2 node, which uses vertex-based animation. node = smgr.AddAnimatedMeshSceneNode(smgr.GetMesh("../../media/faerie.md2"), null, IDFlag_IsPickable | IDFlag_IsHighlightable); node.Position = new Vector3Df(-90, -15, -140); // Put its feet on the floor. node.Scale = new Vector3Df(1.6f); // Make it appear realistically scaled node.SetMD2Animation(AnimationTypeMD2.Point); node.AnimationSpeed = 20.0f; node.GetMaterial(0).SetTexture(0, driver.GetTexture("../../media/faerie2.bmp")); node.GetMaterial(0).Lighting = true; node.GetMaterial(0).NormalizeNormals = true; // Now create a triangle selector for it. The selector will know that it // is associated with an animated node, and will update itself as necessary. selector = smgr.CreateTriangleSelector(node); node.TriangleSelector = selector; selector.Drop(); // We're done with this selector, so drop it now. // And this B3D file uses skinned skeletal animation. node = smgr.AddAnimatedMeshSceneNode(smgr.GetMesh("../../media/ninja.b3d"), null, IDFlag_IsPickable | IDFlag_IsHighlightable); node.Scale = new Vector3Df(10); node.Position = new Vector3Df(-75, -66, -80); node.Rotation = new Vector3Df(0, 90, 0); node.AnimationSpeed = 8.0f; node.GetMaterial(0).NormalizeNormals = true; // Just do the same as we did above. selector = smgr.CreateTriangleSelector(node); node.TriangleSelector = selector; selector.Drop(); // This X files uses skeletal animation, but without skinning. node = smgr.AddAnimatedMeshSceneNode(smgr.GetMesh("../../media/dwarf.x"), null, IDFlag_IsPickable | IDFlag_IsHighlightable); node.Position = new Vector3Df(-70, -66, -30); // Put its feet on the floor. node.Rotation = new Vector3Df(0, -90, 0); // And turn it towards the camera. node.AnimationSpeed = 20.0f; selector = smgr.CreateTriangleSelector(node); node.TriangleSelector = selector; selector.Drop(); // And this mdl file uses skinned skeletal animation. node = smgr.AddAnimatedMeshSceneNode(smgr.GetMesh("../../media/yodan.mdl"), null, IDFlag_IsPickable | IDFlag_IsHighlightable); node.Position = new Vector3Df(-90, -25, 20); node.Scale = new Vector3Df(0.8f); node.GetMaterial(0).Lighting = true; node.AnimationSpeed = 20.0f; // Just do the same as we did above. selector = smgr.CreateTriangleSelector(node); node.TriangleSelector = selector; selector.Drop(); // Add a light, so that the unselected nodes aren't completely dark. LightSceneNode light = smgr.AddLightSceneNode(null, new Vector3Df(-60, 100, 400), new Colorf(1.0f, 1.0f, 1.0f), 600.0f); light.ID = ID_IsNotPickable; // Make it an invalid target for selection. // Remember which scene node is highlighted SceneNode highlightedSceneNode = null; SceneCollisionManager collMan = smgr.SceneCollisionManager; int lastFPS = -1; // draw the selection triangle only as wireframe Material material = new Material(); material.Lighting = false; material.Wireframe = true; while (device.Run()) { if (device.WindowActive) { driver.BeginScene(ClearBufferFlag.All, new Color(0)); smgr.DrawAll(); // Unlight any currently highlighted scene node if (highlightedSceneNode != null) { highlightedSceneNode.SetMaterialFlag(MaterialFlag.Lighting, true); highlightedSceneNode = null; } // All intersections in this example are done with a ray cast out from the camera to // a distance of 1000. You can easily modify this to check (e.g.) a bullet // trajectory or a sword's position, or create a ray from a mouse click position using // collMan.GetRayFromScreenCoordinates() Line3Df ray = new Line3Df(); ray.Start = camera.Position; ray.End = ray.Start + (camera.Target - ray.Start).Normalize() * 1000.0f; // This call is all you need to perform ray/triangle collision on every scene node // that has a triangle selector, including the Quake level mesh. It finds the nearest // collision point/triangle, and returns the scene node containing that point. // Irrlicht provides other types of selection, including ray/triangle selector, // ray/box and ellipse/triangle selector, plus associated helpers. // See the methods of ISceneCollisionManager SceneNode selectedSceneNode = collMan.GetSceneNodeAndCollisionPointFromRay( ray, out Vector3Df intersection, // This will be the position of the collision out Triangle3Df hitTriangle, // This will be the triangle hit in the collision IDFlag_IsPickable); // This ensures that only nodes that we have set up to be pickable are considered // If the ray hit anything, move the billboard to the collision position // and draw the triangle that was hit. if (selectedSceneNode != null) { bill.Position = intersection; // We need to reset the transform before doing our own rendering. driver.SetTransform(TransformationState.World, Matrix.Identity); driver.SetMaterial(material); driver.Draw3DTriangle(hitTriangle, new Color(255, 0, 0)); // We can check the flags for the scene node that was hit to see if it should be // highlighted. The animated nodes can be highlighted, but not the Quake level mesh if ((selectedSceneNode.ID & IDFlag_IsHighlightable) == IDFlag_IsHighlightable) { highlightedSceneNode = selectedSceneNode; // Highlighting in this case means turning lighting OFF for this node, // which means that it will be drawn with full brightness. highlightedSceneNode.SetMaterialFlag(MaterialFlag.Lighting, false); } } // We're all done drawing, so end the scene. driver.EndScene(); int fps = driver.FPS; if (lastFPS != fps) { device.SetWindowCaption(String.Format( "Collision detection example - Irrlicht Engine [{0}] fps: {1}", driver.Name, fps)); lastFPS = fps; } } } device.Drop(); }
static void Main() { DriverType?driverType = AskForDriver(); if (!driverType.HasValue) { return; } IrrlichtDevice device = IrrlichtDevice.CreateDevice(driverType.Value, new Dimension2Di(640, 480)); if (device == null) { return; } VideoDriver driver = device.VideoDriver; SceneManager smgr = device.SceneManager; GUIEnvironment env = device.GUIEnvironment; driver.SetTextureCreationFlag(TextureCreationFlag.Always32Bit, true); // add irrlicht logo env.AddImage(driver.GetTexture("../../media/irrlichtlogoalpha2.tga"), new Vector2Di(10)); // set gui font env.Skin.SetFont(env.GetFont("../../media/fontlucida.png")); // add some help text env.AddStaticText( "Press 'W' to change wireframe mode\nPress 'D' to toggle detail map\nPress 'S' to toggle skybox/skydome", new Recti(10, 421, 250, 475), true, true, null, -1, true); // add camera CameraSceneNode camera = smgr.AddCameraSceneNodeFPS(null, 100.0f, 1.2f); camera.Position = new Vector3Df(2700 * 2, 255 * 2, 2600 * 2); camera.Target = new Vector3Df(2397 * 2, 343 * 2, 2700 * 2); camera.FarValue = 42000.0f; // disable mouse cursor device.CursorControl.Visible = false; // add terrain scene node TerrainSceneNode terrain = smgr.AddTerrainSceneNode( "../../media/terrain-heightmap.bmp", // heightmap null, // parent node -1, // node id new Vector3Df(), // position new Vector3Df(), // rotation new Vector3Df(40, 4.4f, 40), // scale new Color(255, 255, 255), // vertex color 5, // max LOD TerrainPatchSize._17, // patch size 4); // smooth factor terrain.SetMaterialFlag(MaterialFlag.Lighting, false); terrain.SetMaterialTexture(0, driver.GetTexture("../../media/terrain-texture.jpg")); terrain.SetMaterialTexture(1, driver.GetTexture("../../media/detailmap3.jpg")); terrain.SetMaterialType(MaterialType.DetailMap); terrain.ScaleTexture(1, 20); // create triangle selector for the terrain TriangleSelector selector = smgr.CreateTerrainTriangleSelector(terrain, 0); terrain.TriangleSelector = selector; // create collision response animator and attach it to the camera SceneNodeAnimator anim = smgr.CreateCollisionResponseAnimator( selector, camera, new Vector3Df(60, 100, 60), new Vector3Df(0, 0, 0), new Vector3Df(0, 50, 0)); selector.Drop(); camera.AddAnimator(anim); anim.Drop(); // create skybox and skydome driver.SetTextureCreationFlag(TextureCreationFlag.CreateMipMaps, false); SceneNode skybox = smgr.AddSkyBoxSceneNode( "../../media/irrlicht2_up.jpg", "../../media/irrlicht2_dn.jpg", "../../media/irrlicht2_lf.jpg", "../../media/irrlicht2_rt.jpg", "../../media/irrlicht2_ft.jpg", "../../media/irrlicht2_bk.jpg"); SceneNode skydome = smgr.AddSkyDomeSceneNode(driver.GetTexture("../../media/skydome.jpg"), 16, 8, 0.95f, 2); driver.SetTextureCreationFlag(TextureCreationFlag.CreateMipMaps, true); // create event receiver new MyEventReceiver(device, terrain, skybox, skydome); int lastFPS = -1; while (device.Run()) { if (device.WindowActive) { driver.BeginScene(ClearBufferFlag.All, new Color(0)); smgr.DrawAll(); env.DrawAll(); driver.EndScene(); // display frames per second in window title int fps = driver.FPS; if (lastFPS != fps) { // also print terrain height of current camera position // we can use camera position because terrain is located at coordinate origin device.SetWindowCaption(String.Format( "Terrain rendering example - Irrlicht Engine [{0}] fps: {1} Height: {2}", driver.Name, fps, terrain.GetHeight(camera.AbsolutePosition.X, camera.AbsolutePosition.Z))); lastFPS = fps; } } } device.Drop(); }
public Application() { _01.HelloWorld.Kinect kinect = new _01.HelloWorld.Kinect(); mfX = mouseX = 840; mfY = mouseY = 525; mouseL = false; mouseR = false; //device = IrrlichtDevice.CreateDevice( // DriverType.Direct3D9, new Dimension2Di(800, 600), 16, false, true, false); // | device = IrrlichtDevice.CreateDevice( // \|/ Fullscreen DriverType.Direct3D9, new Dimension2Di(1680, 1050), 32, false, true, false); device.SetWindowCaption("BENder3D"); VideoDriver driver = device.VideoDriver; SceneManager smgr = device.SceneManager; GUIEnvironment gui = device.GUIEnvironment; device.OnEvent += new IrrlichtDevice.EventHandler(device_OnEvent); smgr.AmbientLight = new Colorf(128, 128, 128, 128); //smgr.AddLightSceneNode(null, new Vector3Df(0, 70, 0), new Colorf(122,0,122,0), (float)10); MeshSceneNode box = smgr.AddCubeSceneNode(100, null, 9001, new Vector3Df(0.0f, -ballRadius * 3 / 2, 0.0f)); box.Scale = new Vector3Df(100.0f, 0.1f, 100.0f); //Mesh cyl = smgr.GeometryCreator.CreateCylinderMesh(ballRadius, 50, 256); //Mesh sphere = smgr.GeometryCreator.CreateSphereMesh(ballRadius, 16,16); //MeshSceneNode t = smgr.AddSphereSceneNode(ballRadius, 32); //MeshSceneNode t = smgr.AddOctreeSceneNode(sphere); MeshSceneNode t = smgr.AddMeshSceneNode(smgr.GetMesh("pill.obj")); //MeshSceneNode t = smgr.AddMeshSceneNode(cyl); TriangleSelector triselect = smgr.CreateTriangleSelector(t.Mesh, t); t.TriangleSelector = triselect; triselect.Drop(); //t = smgr.AddMeshSceneNode(smgr.GetMesh("../../media/sphere.x")); //smgr t.SetMaterialTexture(0, driver.GetTexture("rockwall.jpg")); //t.SetMaterialFlag(MaterialFlag.Lighting, true); t.GetMaterial(0).SpecularColor.Set(0, 0, 0); //t.GetMaterial(0).Lighting = true; t.GetMaterial(0).NormalizeNormals = false; /*Texture citrus = driver.AddTexture(new Dimension2Di(200, 200), "citrus.png"); * gui.AddImage(citrus, new Vector2Di(824, 0), true);*/ gui.AddStaticText("Hey, Listen! Press C to switch the mesh to a cylinder!\n Press S to change to a sphere, and enter to send yourself the obj file!", new Recti(0, 0, 400, 60)); //t.AddShadowVolumeSceneNode(); // driver.GPUProgrammingServices.OnSetConstants += new GPUProgrammingServices.SetConstantsHandler(gpu_OnSetConstants); /* * MaterialType shaderMat = MaterialType.Solid; * shaderMat = driver.GPUProgrammingServices.AddHighLevelShaderMaterialFromFiles("C:/IrrlichtLime-1.4/examples/01.HelloWorld/bumpmap.hlsl", "VertexShaderFunction", VertexShaderType.VS_3_0, * "C:/IrrlichtLime-1.4/examples/01.HelloWorld/bumpmap.hlsl", "PixelShaderFunction", PixelShaderType.PS_3_0, MaterialType.Solid); * * t.SetMaterialType(shaderMat); * t.SetMaterialTexture(1, driver.GetTexture("../../media/rockwall_height.bmp"));*/ GPUProgrammingServices gpu = driver.GPUProgrammingServices; MaterialType newMaterialType1 = MaterialType.Solid; MaterialType newMaterialType2 = MaterialType.TransparentAddColor; gpu.OnSetConstants += new GPUProgrammingServices.SetConstantsHandler(gpu_OnSetConstants); // create the shaders depending on if the user wanted high level or low level shaders newMaterialType1 = gpu.AddHighLevelShaderMaterialFromFiles( "d3d9.hlsl", "vertexMain", VertexShaderType.VS_1_1, "d3d9.hlsl", "pixelMain", PixelShaderType.PS_1_1, MaterialType.Solid, 0, GPUShadingLanguage.Default); t.SetMaterialType(newMaterialType1); //t.GetMaterial(0).Wireframe = true; //t.DebugDataVisible = DebugSceneType.Full; //t.AddShadowVolumeSceneNode(null, -1, false, 1000.0f); smgr.AddLightSceneNode(null, new Vector3Df(40, 150, -50), new Colorf(255, 255, 255, 255), 250.0f); //CSampleSceneNode sceneNode = new CSampleSceneNode(smgr.RootNode, smgr, 667); camera = smgr.AddCameraSceneNode(null, new Vector3Df(0, 50, -140), new Vector3Df(0, 5, 0)); //camera.Target = new Vector3Df(-70, 30, -60); //smgr.AddCameraSceneNodeFPS(null, (float)50.0); Material m = new Material(); m.Lighting = false; double PI = 3.1415926f; float distance = 200.0f; double angle = 180.0f; double angleY = 20.0f; int oldMouseX = mouseX; int oldMouseY = mouseY; uint then = device.Timer.Time; uint currentAutism = device.Timer.Time; bool autism = false; while (device.Run()) { uint now = device.Timer.Time; float frameDeltaTime = (float)(now - then) / 1000.0f; then = now; if (kinect.isTranslating && (kinect.translation.X < 30 && kinect.translation.X > -30)) { mfX -= (int)(kinect.translation.X); mfY -= (int)(kinect.translation.Y); Console.WriteLine(mouseX + ", " + mouseY + " ----------------- " + (int)(kinect.translation.X) + ", " + (int)(kinect.translation.Y)); } kinect.resetTranslation(); /* * if (getDistance((int)mfX, (int)mfY, 512, 384) > 150) * { * mfX = 512; mfY= 384; * }*/ mouseX = Math.Abs((int)mfX) % 1024; mouseY = Math.Abs((int)mfY) % 768; //mouseX = kinect.position.X; device.CursorControl.Position = new Vector2Di(mouseX, mouseY); if (!potterWheelDown && IsKeyDown(KeyCode.Up)) { potterWheelDown = true; deltaAngle = 1.0d; potterWheelActivate = !potterWheelActivate; } else if (!IsKeyDown(KeyCode.Up)) { potterWheelDown = false; } if (!leftKeyPressed && IsKeyDown(KeyCode.Left)) { leftKeyPressed = true; deltaAngle /= 2; } else if (!IsKeyDown(KeyCode.Left)) { leftKeyPressed = false; } if (!rightKeyPressed && IsKeyDown(KeyCode.Right)) { rightKeyPressed = true; deltaAngle *= 2; } else if (!IsKeyDown(KeyCode.Right)) { rightKeyPressed = false; } if (potterWheelActivate) { angle -= 700.0f * deltaAngle * frameDeltaTime; } if (angle > 360) { angle -= 360; } else if (angle < 0) { angle += 360; } if (angleY > 360) { angle -= 360; } else if (angleY < 0) { angleY += 360; } driver.BeginScene(true, true, new Color(100, 101, 140)); camera.Target = new Vector3Df(0, 0, 0); double temp = Math.Cos(angleY * PI / 180.0) * distance; double X = Math.Sin(angle * PI / 180.0) * temp; double Y = Math.Sin(angleY * PI / 180.0) * distance; double Z = Math.Cos(angle * PI / 180.0) * temp; camera.Position = new Vector3Df((float)X, (float)Y, (float)Z); smgr.DrawAll(); gui.DrawAll(); driver.SetMaterial(m); Triangle3Df triangle = interpolateFrom2D(new Vector2Di(mouseX, mouseY)); if (kinect.isMorphing && kinect.morphDist > 0) //if (IsKeyDown(KeyCode.KeyW)) { //Console.WriteLine("PRESSED KEY"); triangle.A *= new Vector3Df(0.5f); triangle.B *= new Vector3Df(0.5f); triangle.C *= new Vector3Df(0.5f); if (isCyl) { deformCyl(t, triangle.A, new Vector3Df(.5f / (potterWheelActivate ? (float)(1 / deltaAngle) : 60f)), triangle); } else { deformMesh(t, triangle.A, new Vector3Df(.5f / (potterWheelActivate ? (float)(1 / deltaAngle) : 60f)), triangle); } } else if (kinect.isMorphing && kinect.morphDist < 0) { //Console.WriteLine("PRESSED KEY"); triangle.A *= new Vector3Df(1.5f); triangle.B *= new Vector3Df(1.5f); triangle.C *= new Vector3Df(1.5f); if (isCyl) { deformCyl(t, triangle.A, new Vector3Df(-.5f / (potterWheelActivate ? (float)(1 / deltaAngle) : 60f)), triangle); } else { deformMesh(t, triangle.A, new Vector3Df(-.5f / (potterWheelActivate ? (float)(1 / deltaAngle) : 60f)), triangle); } } if (kinect.isZoom && kinect.zoomDist < 0) { if (distance < 300.0f) { distance += .0625f; } } if (kinect.isZoom && kinect.zoomDist > 0) { if (distance > 150) { distance -= .0625f; } } if (kinect.isRotating && kinect.rotation > 0) { angle += 200 * frameDeltaTime; } if (kinect.isRotating && kinect.rotation < 0) { angle -= 200 * frameDeltaTime; } //Change shape if (IsKeyDown(KeyCode.KeyA)) { IrrlichtLime.IO.WriteFile file = device.FileSystem.CreateWriteFile("./Saved.obj"); writeMesh(file, t.Mesh, 1); mail(); } if (IsKeyDown(KeyCode.KeyC)) { isCyl = true; t.Remove(); t = smgr.AddMeshSceneNode(smgr.GetMesh("pill.obj")); //MeshSceneNode t = smgr.AddMeshSceneNode(cyl); triselect = smgr.CreateTriangleSelector(t.Mesh, t); t.TriangleSelector = triselect; triselect.Drop(); //t = smgr.AddMeshSceneNode(smgr.GetMesh("../../media/sphere.x")); //smgr t.SetMaterialTexture(0, driver.GetTexture("rockwall.jpg")); //t.SetMaterialFlag(MaterialFlag.Lighting, true); t.GetMaterial(0).SpecularColor.Set(0, 0, 0); //t.GetMaterial(0).Lighting = true; t.GetMaterial(0).NormalizeNormals = false; t.SetMaterialType(newMaterialType1); } else if (IsKeyDown(KeyCode.KeyS)) { isCyl = false; t.Remove(); t = smgr.AddSphereSceneNode(ballRadius, 32); triselect = smgr.CreateTriangleSelector(t.Mesh, t); t.TriangleSelector = triselect; triselect.Drop(); //t = smgr.AddMeshSceneNode(smgr.GetMesh("../../media/sphere.x")); //smgr t.SetMaterialTexture(0, driver.GetTexture("rockwall.jpg")); //t.SetMaterialFlag(MaterialFlag.Lighting, true); t.GetMaterial(0).SpecularColor.Set(0, 0, 0); //t.GetMaterial(0).Lighting = true; t.GetMaterial(0).NormalizeNormals = false; t.SetMaterialType(newMaterialType1); } driver.EndScene(); } device.Drop(); }
public void Initialize3D() { device = new IrrlichtDevice(DriverType.Direct3D9, /* TODO: for Linux/OSX it should be OpenGL */ new Dimension2D(800, 600), 32, false, true, true, true, GetHandle()); device.FileSystem.WorkingDirectory = "3d"; device.Resizeable = true; // setup a simple 3d scene SceneManager sceneManager = device.SceneManager; VideoDriver driver = device.VideoDriver; camera = sceneManager.AddCameraSceneNodeFPS(null, 100.0f, 50000.0f, false); camera.Position = new Vector3D(1900 * 2, 255 * 2, 3700 * 2); camera.Target = new Vector3D(2397 * 2, 343 * 2, 2700 * 2); camera.FarValue = 12000.0f; camera.InputReceiverEnabled = false; /* * Here comes the terrain renderer scene node: We add it just like any * other scene node to the scene using ISceneManager::addTerrainSceneNode(). * The only parameter we use is a file name to the heightmap we use. A heightmap * is simply a gray scale texture. The terrain renderer loads it and creates * the 3D terrain from it. * To make the terrain look more big, we change the scale factor of it to (40, 4.4, 40). * Because we don't have any dynamic lights in the scene, we switch off the lighting, * and we set the file terrain-texture.jpg as texture for the terrain and * detailmap3.jpg as second texture, called detail map. At last, we set * the scale values for the texture: The first texture will be repeated only one time over * the whole terrain, and the second one (detail map) 20 times. */ terrain = sceneManager.AddTerrainSceneNode("terrain-heightmap.bmp", null, // parent node -1, // node id new Vector3D(0f, 0f, 0f), // position new Vector3D(0f, 0f, 0f), // rotation new Vector3D(40f, 4.4f, 40f), // scale new Color(255, 255, 255, 255), // vertexColor, 5, // maxLOD TerrainPatchSize.TPS17 // patchSize ); terrain.SetMaterialFlag(MaterialFlag.Lighting, false); terrain.SetMaterialTexture(0, driver.GetTexture("terrain-texture.jpg")); terrain.SetMaterialTexture(1, driver.GetTexture("detailmap3.jpg")); terrain.SetMaterialType(MaterialType.DetailMap); terrain.ScaleTexture(1.0f, 20.0f); //terrain->setDebugDataVisible ( true ); /* * To be able to do collision with the terrain, we create a triangle selector. * If you want to know what triangle selectors do, just take a look into the * collision tutorial. The terrain triangle selector works together with the * terrain. To demonstrate this, we create a collision response animator * and attach it to the camera, so that the camera will not be able to fly * through the terrain. */ // create triangle selector for the terrain TriangleSelector selector = sceneManager.CreateTerrainTriangleSelector(terrain, 0); terrain.TriangleSelector = selector; // create collision response animator and attach it to the camera Animator animator = sceneManager.CreateCollisionResponseAnimator(selector, camera, new Vector3D(60, 100, 60), new Vector3D(0, 0, 0), new Vector3D(0, 50, 0), 0); selector.Dispose(); camera.AddAnimator(animator); animator.Dispose();; /* * To make the user be able to switch between normal and wireframe mode, we create * an instance of the event reciever from above and let Irrlicht know about it. In * addition, we add the skybox which we already used in lots of Irrlicht examples. */ // create skybox driver.SetTextureFlag(TextureCreationFlag.CreateMipMaps, false); sceneManager.AddSkyBoxSceneNode(null, new Texture[] { driver.GetTexture("irrlicht2_up.jpg"), driver.GetTexture("irrlicht2_dn.jpg"), driver.GetTexture("irrlicht2_lf.jpg"), driver.GetTexture("irrlicht2_rt.jpg"), driver.GetTexture("irrlicht2_ft.jpg"), driver.GetTexture("irrlicht2_bk.jpg") }, -1); while (device.Run()) { driver.BeginScene(true, true, new Color()); sceneManager.DrawAll(); driver.EndScene(); } device.Dispose(); return; }
/// <summary> /// The irrlicht thread for rendering. /// </summary> private void StartIrr() { try { //Setup IrrlichtCreationParameters irrparam = new IrrlichtCreationParameters(); if (irrlichtPanel.IsDisposed) { throw new Exception("Form closed!"); } if (irrlichtPanel.InvokeRequired) { irrlichtPanel.Invoke(new MethodInvoker(delegate { irrparam.WindowID = irrlichtPanel.Handle; })); } irrparam.DriverType = DriverType.Direct3D9; irrparam.DriverType = DriverType.OpenGL; irrparam.BitsPerPixel = 16; device = IrrlichtDevice.CreateDevice(irrparam); if (device == null) { throw new NullReferenceException("Could not create device for engine!"); } driver = device.VideoDriver; smgr = device.SceneManager; gui = device.GUIEnvironment; var cam = smgr.AddCameraSceneNode(null); cam.TargetAndRotationBinding = true; cam.Position = new Vector3Df(-100.0f, 500.0f, 100.0f); cam.Target = new Vector3Df(0.0f); cam.FarValue = 42000.0f; device.CursorControl.Visible = false; //Terrain heightmap = driver.CreateImage("Terrain\\basemap.bmp"); terrain = smgr.AddTerrainSceneNode( "Terrain\\basemap.bmp", null, -1, new Vector3Df(0.0f) ); terrain.Scale = new Vector3Df(32, 5, 32); terrain.SetMaterialFlag(MaterialFlag.Lighting, false); terrain.SetMaterialTexture(0, driver.GetTexture("Terrain\\rockwall.jpg")); selector = smgr.CreateTerrainTriangleSelector(terrain, 0); var arrow = smgr.AddAnimatedMeshSceneNode(smgr.AddArrowMesh("arrow", new IrrlichtLime.Video.Color(255, 255, 0, 0), new IrrlichtLime.Video.Color(255, 0, 255, 0)), null); arrow.SetMaterialFlag(MaterialFlag.Lighting, false); arrow.Scale = new Vector3Df(100.0f); arrow.Rotation = new Vector3Df(0.0f, 0.0f, 180.0f); //Skybox and skydome driver.SetTextureCreationFlag(TextureCreationFlag.CreateMipMaps, false); /*var box = smgr.AddSkyBoxSceneNode( * ("Terrain\\irrlicht2_up.jpg"), * ("Terrain\\irrlicht2_dn.jpg"), * ("Terrain\\irrlicht2_lf.jpg"), * ("Terrain\\irrlicht2_rt.jpg"), * ("Terrain\\irrlicht2_ft.jpg"), * ("Terrain\\irrlicht2_bk.jpg")); * box.Visible = true;*/ var dome = smgr.AddSkyDomeSceneNode(driver.GetTexture("Terrain\\skydome.jpg"), 16, 8, 0.95f, 2.0f); dome.Visible = true; driver.SetTextureCreationFlag(TextureCreationFlag.CreateMipMaps, true); var helpq = gui.AddStaticText("Press Q to disable focus!", new Recti(0, this.ClientSize.Height - 40, 100, this.ClientSize.Height), true, true, null, 1, true); var helpesc = gui.AddStaticText("Press ESC to quit", new Recti(0, this.ClientSize.Height - 20, 100, this.ClientSize.Height), true, true, null, 1, true); middletext = gui.AddStaticText("Click to enable mouselook and move with WASD", new Recti(ClientSize.Width / 2 - 100, this.ClientSize.Height / 2, ClientSize.Width / 2 + 100, this.ClientSize.Height / 2 + 30), true, true, null, 1, true); middletext.OverrideColor = IrrlichtLime.Video.Color.SolidWhite; middletext.BackgroundColor = IrrlichtLime.Video.Color.SolidBlack; var irrTimer = device.Timer; var then = 0; var then30 = 0; device.CursorControl.Visible = false; Vector2Df lastcurr = new Vector2Df(0f); uint dt = 0; while (device.Run()) { driver.BeginScene(ClearBufferFlag.All); if (catchmouse) { // move the arrow to the nearest vertex ... IrrlichtLime.Core.Vector2Di center = new IrrlichtLime.Core.Vector2Di(irrlichtPanel.Width / 2, irrlichtPanel.Height / 2); Line3Df ray = smgr.SceneCollisionManager.GetRayFromScreenCoordinates(center, cam); Vector3Df pos; Triangle3Df Tri; var curr = device.CursorControl.RelativePosition; // Threshold and periodical check so we don't spin around due to float conversions if (device.Timer.Time > dt && curr.GetDistanceFrom(lastcurr) > 0.01f) { Line3Df cursor_ray = smgr.SceneCollisionManager .GetRayFromScreenCoordinates(new Vector2Di((int)(curr.X * irrlichtPanel.Width), (int)(curr.Y * irrlichtPanel.Height)), cam); smgr.ActiveCamera.Target = cursor_ray.Middle; dt = device.Timer.Time + 30; lastcurr = curr; device.CursorControl.Position = center; } if (smgr.SceneCollisionManager.GetCollisionPoint(ray, selector, out pos, out Tri, out outnode)) { var scale = 32; // terrain is scaled 32X var size = 512; // heightmap is 512x512 pixels var x = (pos.X / scale); var z = (pos.Z / scale); var index = x * size + z; x *= scale; z *= scale; arrow.Position = new Vector3Df(x, terrain.GetHeight(x, z) + 100, z); } } smgr.DrawAll(); gui.DrawAll(); driver.EndScene(); //device.CursorControl.Position = new Vector2Di(irrlichtPanel. } device.Drop(); } catch (ThreadAbortException) { } catch (NullReferenceException) { } catch (Exception ex) { if (!this.IsDisposed) { MessageBox.Show(ex.Message); //this.Invoke(new MethodInvoker(delegate { this.Close(); })); } } }