Example #1
0
        // 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;
        }
Example #2
0
        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);
            }
        }
Example #3
0
        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);
        }