// Return values: 0 = no intersection, // 1 = intersection, // 2 = box is completely inside frustum public int Intersect(BoundingBox box) { var totalIn = 0; foreach (var plane in Planes) { var intersection = Plane.Intersects(plane, box); if (intersection == PlaneIntersectionType.Back) return 0; if (intersection == PlaneIntersectionType.Front) { totalIn++; } } if (totalIn == 6) { return 2; } return 1; }
private void BuildSkullGeometryBuffers() { try { var min = new Vector3(float.MaxValue, float.MaxValue, float.MaxValue); var max = new Vector3(float.MinValue, float.MinValue, float.MinValue); var vertices = new List<Basic32>(); var indices = new List<int>(); var vcount = 0; var tcount = 0; using (var reader = new StreamReader("Models\\skull.txt")) { var input = reader.ReadLine(); if (input != null) // VertexCount: X vcount = Convert.ToInt32(input.Split(new[] { ':' })[1].Trim()); input = reader.ReadLine(); if (input != null) //TriangleCount: X tcount = Convert.ToInt32(input.Split(new[] { ':' })[1].Trim()); // skip ahead to the vertex data do { input = reader.ReadLine(); } while (input != null && !input.StartsWith("{")); // Get the vertices for (int i = 0; i < vcount; i++) { input = reader.ReadLine(); if (input != null) { var vals = input.Split(new[] { ' ' }); var position = new Vector3(Convert.ToSingle(vals[0].Trim()), Convert.ToSingle(vals[1].Trim()), Convert.ToSingle(vals[2].Trim())); vertices.Add( new Basic32( position, new Vector3( Convert.ToSingle(vals[3].Trim()), Convert.ToSingle(vals[4].Trim()), Convert.ToSingle(vals[5].Trim())), new Vector2() ) ); min = Vector3.Minimize(min, position); max = Vector3.Maximize(max, position); } } _skullBox = new BoundingBox(min, max); // skip ahead to the index data do { input = reader.ReadLine(); } while (input != null && !input.StartsWith("{")); // Get the indices _skullIndexCount = 3 * tcount; for (var i = 0; i < tcount; i++) { input = reader.ReadLine(); if (input == null) { break; } var m = input.Trim().Split(new[] { ' ' }); indices.Add(Convert.ToInt32(m[0].Trim())); indices.Add(Convert.ToInt32(m[1].Trim())); indices.Add(Convert.ToInt32(m[2].Trim())); } } var vbd = new BufferDescription(Basic32.Stride * vcount, ResourceUsage.Immutable, BindFlags.VertexBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0); _skullVB = new Buffer(Device, new DataStream(vertices.ToArray(), false, false), vbd); var ibd = new BufferDescription(sizeof(int) * _skullIndexCount, ResourceUsage.Immutable, BindFlags.IndexBuffer, CpuAccessFlags.None, ResourceOptionFlags.None, 0); _skullIB = new Buffer(Device, new DataStream(indices.ToArray(), false, false), ibd); } catch (Exception ex) { MessageBox.Show(ex.Message); } }
public override void UpdateScene(float dt) { base.UpdateScene(dt); if (Util.IsKeyDown(Keys.Up)) { _cam.Walk(10.0f*dt); } if (Util.IsKeyDown(Keys.Down)) { _cam.Walk(-10.0f * dt); } if (Util.IsKeyDown(Keys.Left)) { _cam.Strafe(-10.0f * dt); } if (Util.IsKeyDown(Keys.Right)) { _cam.Strafe(10.0f * dt); } if (Util.IsKeyDown(Keys.D1)) { _frustumCullingEnabled = true; } if (Util.IsKeyDown(Keys.D2)) { _frustumCullingEnabled = false; } if (Util.IsKeyDown(Keys.U)) { _instancing = false; } if (Util.IsKeyDown(Keys.I)) { _instancing = true; } if (Util.IsKeyDown(Keys.B)) { _skullsOrBoxes = false; } if (Util.IsKeyDown(Keys.S)) { _skullsOrBoxes = true; } _cam.UpdateViewMatrix(); _visibleObjectCount = 0; if (_frustumCullingEnabled) { var db = ImmediateContext.MapSubresource(_instanceBuffer, MapMode.WriteDiscard, MapFlags.None); foreach (var instancedData in _instancedData) { var w = instancedData.World; var box = new BoundingBox( Vector3.TransformCoordinate(_skullBox.Minimum, w), Vector3.TransformCoordinate(_skullBox.Maximum, w) ); if (_cam.Visible(box)) { db.Data.Write(instancedData); _visibleObjectCount++; } } ImmediateContext.UnmapSubresource(_instanceBuffer, 0); } else { var db = ImmediateContext.MapSubresource(_instanceBuffer, MapMode.WriteDiscard, MapFlags.None); foreach (var instancedData in _instancedData) { db.Data.Write(instancedData); _visibleObjectCount++; } ImmediateContext.UnmapSubresource(_instanceBuffer, 0); } MainWindowCaption = String.Format("Instancing and Culling Demo {0} objects visible out of {1}", _visibleObjectCount, _instancedData.Count); }