예제 #1
0
        public override void render(Graphics graphics, Camera camera)
        {
            if (power > 0 && isVisibleFromCamera(camera))
            {
                var size      = radius * 2f;
                var obstacles = Physics.boxcastBroadphase(new RectangleF(entity.transform.position.X - radius, entity.transform.position.Y - radius, size, size), collidesWithLayers);

                // Compute the visibility mesh
                var visibility = new VisibilityComputer(entity.transform.position, radius);
                foreach (var v in obstacles)
                {
                    visibility.addSquareOccluder(v.bounds);
                }

                // Generate a triangle list from the encounter points
                VertexPositionTexture[] vertices;
                short[] indices;

                var encounters = visibility.computeVisibilityPolygon();
                triangleListFromEncounters(encounters, out vertices, out indices);

                Core.graphicsDevice.BlendState      = BlendState.Additive;
                Core.graphicsDevice.RasterizerState = RasterizerState.CullNone;

                // Apply the effect
                _lightEffect.Parameters["viewProjectionMatrix"].SetValue(entity.scene.camera.viewProjectionMatrix);
                _lightEffect.Parameters["lightSource"].SetValue(entity.transform.position);
                _lightEffect.Parameters["lightColor"].SetValue(color.ToVector3() * power);
                _lightEffect.Parameters["lightRadius"].SetValue(radius);
                _lightEffect.Techniques[0].Passes[0].Apply();

                // Draw the light on screen, using the triangle fan from the computed
                // visibility mesh so that the light only influences the area that can be
                // "seen" from the light's position.
                Core.graphicsDevice.DrawUserIndexedPrimitives <VertexPositionTexture>
                (
                    PrimitiveType.TriangleList,
                    vertices,
                    0,
                    vertices.Length,
                    indices,
                    0,
                    indices.Length / 3
                );
            }
        }
예제 #2
0
파일: PolygonLight.cs 프로젝트: tykak/Nez
        public override void render(Graphics graphics, Camera camera)
        {
            if (power > 0 && isVisibleFromCamera(camera))
            {
                var totalOverlaps = Physics.overlapCircleAll(entity.position + _localOffset, _radius, _colliderCache, collidesWithLayers);

                // compute the visibility mesh
                _visibility.begin(entity.transform.position + _localOffset, _radius);
                for (var i = 0; i < totalOverlaps; i++)
                {
                    if (!_colliderCache[i].isTrigger)
                    {
                        _visibility.addSquareOccluder(_colliderCache[i].bounds);
                    }
                }
                System.Array.Clear(_colliderCache, 0, totalOverlaps);

                // generate a triangle list from the encounter points
                var encounters = _visibility.end();
                generateVertsFromEncounters(encounters);
                ListPool <Vector2> .free(encounters);

                Core.graphicsDevice.BlendState      = BlendState.Additive;
                Core.graphicsDevice.RasterizerState = RasterizerState.CullNone;

                // wireframe debug
                //var rasterizerState = new RasterizerState();
                //rasterizerState.FillMode = FillMode.WireFrame;
                //rasterizerState.CullMode = CullMode.None;
                //Core.graphicsDevice.RasterizerState = rasterizerState;

                // Apply the effect
                _lightEffect.Parameters["viewProjectionMatrix"].SetValue(entity.scene.camera.viewProjectionMatrix);
                _lightEffect.Parameters["lightSource"].SetValue(entity.transform.position);
                _lightEffect.Parameters["lightColor"].SetValue(color.ToVector3() * power);
                _lightEffect.Techniques[0].Passes[0].Apply();

                var primitiveCount = _vertices.length / 2;
                Core.graphicsDevice.DrawUserIndexedPrimitives(PrimitiveType.TriangleList, _vertices.buffer, 0, _vertices.length, _indices.buffer, 0, primitiveCount);
            }
        }