Пример #1
0
        public void Dying()
        {
            List <Soldier> soldiers = FindOpponentSoldiers(mark, position, (s) =>
            {
                return(withinCircleArea(position, attackArea, s.position));
            });

            for (int i = 0; i < soldiers.Count; i++)
            {
                soldiers[i].Hurt(damage, hurtType, false, this);
            }

            debuffHandler.Destory();
            buffHandler.Destory();

            RenderMessage message = new RenderMessage();

            message.type      = RenderMessage.Type.CrystalCarDestroy;
            message.ownerId   = id;
            message.direction = direction.vector3;
            message.arguments.Add("mark", mark);
            PostRenderMessage(message);

            ChangeState(CrystalCarState.DEATH, fsmDead);
        }
Пример #2
0
        private void Fire()
        {
            DebugUtils.Log(DebugUtils.Type.AI_Tower, "the tower " + id + " begins to fire to target " + target.id);

            damage = GetDamageValue();

            Projectile projectile = GenerateProjectile(this, projectileId, towerFirePos, target);

            projectile.RegisterRenderMessageHandler(PostRenderMessage);
            projectile.RegisterDestroyHandler(PostDestroy);
            projectile.RegisterRandomMethod(GetRandomNumber);
            projectile.RegisterWithinCircleAreaPredicate(WithinCircleAreaPredicate);
            projectile.RegisterWithinFrontRectangleAreaPredicate(WithinFrontRectAreaPredicate);

            RenderMessage rm = new RenderMessage();

            rm.type      = RenderMessage.Type.SpawnProjectile;
            rm.ownerId   = projectile.id;
            rm.position  = projectile.position.vector3;
            rm.direction = projectile.speed.vector3;
            rm.arguments.Add("mark", projectile.mark);
            rm.arguments.Add("metaId", projectile.metaId);
            rm.arguments.Add("holderType", (int)projectile.owner.type);
            rm.arguments.Add("holderId", projectile.owner.id);
            PostRenderMessage(rm);
        }
Пример #3
0
        private void SpawnProjectile()
        {
            MoFaBaoLieDanArrow projectile = (MoFaBaoLieDanArrow)GenerateProjectile(owner, carrierId, owner.position, owner.target);

            projectile.RegisterRenderMessageHandler(PostRenderMessage);
            projectile.RegisterDestroyHandler(PostDestroy);
            projectile.RegisterRandomMethod(GetRandomNumber);
            projectile.RegisterFindOpponentSoldiers(FindOpponentSoldiers);
            projectile.RegisterFindOpponentCrystalCars(FindOpponentCrystalCars);
            projectile.RegisterFindOpponentDemolishers(FindOpponentDemolishers);
            projectile.RegisterWithinCircleAreaPredicate(WithinCircleAreaPredicate);
            projectile.RegisterWithinFrontRectangleAreaPredicate(WithinFrontRectAreaPredicate);
            projectile.RegisterGenerateAttributeEffect(GenerateAttributeEffect);
            projectile.RegisterFindNeutralUnits(FindNeutralUnits);
            projectile.SetRadius(radius);


            RenderMessage rm = new RenderMessage();

            rm.type      = RenderMessage.Type.SpawnProjectile;
            rm.ownerId   = projectile.id;
            rm.position  = projectile.position.vector3;
            rm.direction = projectile.speed.vector3;
            rm.arguments.Add("mark", projectile.mark);
            rm.arguments.Add("metaId", projectile.metaId);
            rm.arguments.Add("holderType", (int)projectile.owner.type);
            rm.arguments.Add("holderId", projectile.owner.id);
            PostRenderMessage(rm);

            ReleaseEnd();
            DebugUtils.Log(DebugUtils.Type.AI_Projectile, "SpawnProjectile+MoFaBaoLieDanArrow");
        }
Пример #4
0
        private void Work()
        {
            if (carrierType != 2)
            {
                DebugUtils.LogError(DebugUtils.Type.AI_Skill, "MoFaXianJingSkill carrierType != 2");
                return;
            }
            Trap trap = GenerateTrap(owner, carrierId, owner.position, FixVector3.forward);

            trap.RegisterRenderMessageHandler(PostRenderMessage);
            trap.RegisterDestroyHandler(PostDestroy);
            trap.RegisterBattleAgentMessageHandler(PostBattleMessage);
            trap.RegisterFindOpponentSoldiers(FindOpponentSoldiers);
            trap.RegisterWithinCircleAreaPredicate(WithinCircleAreaPredicate);
            trap.RegisterGenerateAttributeEffect(GenerateAttributeEffect);

            RenderMessage rm = new RenderMessage();

            rm.type      = RenderMessage.Type.SpawnTrap;
            rm.ownerId   = trap.id;
            rm.position  = trap.position.vector3;
            rm.direction = trap.rotation.vector3;
            rm.arguments.Add("mark", trap.mark);
            rm.arguments.Add("metaId", carrierId);
            rm.arguments.Add("holderType", (int)trap.owner.type);
            rm.arguments.Add("holderId", trap.owner.id);
            rm.arguments.Add("model", trap.modelId);

            PostRenderMessage(rm);

            ReleaseEnd();
        }
Пример #5
0
        private void SpawnProjectile()
        {
            if (owner.target != null && owner.target.Alive() && owner.targetId == owner.target.id)
            {
                DebugUtils.Log(DebugUtils.Type.AI_Soldier, "the " + owner.type + " soldier " + id + " skill to fire to target " + owner.target.id);
                Projectile projectile = GenerateProjectile(owner, carrierId, owner.position, owner.target);
                projectile.RegisterRenderMessageHandler(PostRenderMessage);
                projectile.RegisterDestroyHandler(PostDestroy);
                projectile.RegisterRandomMethod(GetRandomNumber);
                projectile.RegisterFindOpponentSoldiers(FindOpponentSoldiers);
                projectile.RegisterFindOpponentCrystalCars(FindOpponentCrystalCars);
                projectile.RegisterFindOpponentDemolishers(FindOpponentDemolishers);
                projectile.RegisterWithinCircleAreaPredicate(WithinCircleAreaPredicate);
                projectile.RegisterWithinFrontRectangleAreaPredicate(WithinFrontRectAreaPredicate);

                RenderMessage rm = new RenderMessage();
                rm.type      = RenderMessage.Type.SpawnProjectile;
                rm.ownerId   = projectile.id;
                rm.position  = projectile.position.vector3;
                rm.direction = projectile.speed.vector3;
                rm.arguments.Add("mark", projectile.mark);
                rm.arguments.Add("metaId", projectile.metaId);
                rm.arguments.Add("holderType", (int)projectile.owner.type);
                rm.arguments.Add("holderId", projectile.owner.id);
                PostRenderMessage(rm);
            }
            ReleaseEnd();
        }
Пример #6
0
        protected void HealthRecover(int deltaTime)
        {
            if (Alive())
            {
                if (hp < maxHp)
                {
                    if (healthRecoverTimer >= healthRecoverInterval)
                    {
                        hp += healthRegen;
                        healthRecoverTimer = 0;

                        RenderMessage rm = new RenderMessage();
                        rm.type    = RenderMessage.Type.SyncHP;
                        rm.ownerId = id;
                        rm.arguments.Add("type", (int)type);
                        rm.arguments.Add("hp", hp);
                        rm.arguments.Add("maxHp", maxHp);
                        rm.arguments.Add("mark", mark);

                        PostRenderMessage(rm);
                    }
                    else
                    {
                        healthRecoverTimer += deltaTime;
                    }
                }
            }
        }
Пример #7
0
        public override void Hurt(int hurtValue, AttackPropertyType hurtType, bool isCrit, LogicUnit injurer)
        {
            if (Alive())
            {
                int value = GetActualHurtValue(hurtType, hurtValue);
                hp -= value;

                RenderMessage message = new RenderMessage();
                message.type     = RenderMessage.Type.NpcHurt;
                message.ownerId  = id;
                message.position = transform.position;
                message.arguments.Add("value", value);
                PostRenderMessage(message);

                if (hp <= 0)
                {
                    injurer.OnKillEnemy(killReward, injurer, this);
                    Dying();
                }
                else
                {
                    Attack(injurer);
                }
            }
        }
Пример #8
0
        private void GenerateOneTrap()
        {
            //--need register TrapGenerator
            Trap trap = GenerateTrap(owner, trapMetaId, destination, FixVector3.forward);

            trap.RegisterRenderMessageHandler(PostRenderMessage);
            trap.RegisterDestroyHandler(PostDestroy);
            trap.RegisterBattleAgentMessageHandler(PostBattleMessage);
            trap.RegisterFindOpponentSoldiers(FindOpponentSoldiers);
            trap.RegisterWithinCircleAreaPredicate(WithinCircleAreaPredicate);
            trap.RegisterGenerateAttributeEffect(GenerateAttributeEffect);

            RenderMessage rm = new RenderMessage();

            rm.type      = RenderMessage.Type.SpawnTrap;
            rm.ownerId   = trap.id;
            rm.position  = trap.position.vector3;
            rm.direction = trap.rotation.vector3;
            rm.arguments.Add("mark", trap.mark);
            rm.arguments.Add("metaId", trap.metaId);
            rm.arguments.Add("holderType", (int)trap.owner.type);
            rm.arguments.Add("holderId", trap.owner.id);
            rm.arguments.Add("model", trap.modelId);
            PostRenderMessage(rm);
            //--TODO
        }
Пример #9
0
        private void Dash()
        {
            RenderMessage rm = new RenderMessage();

            rm.type    = RenderMessage.Type.SoldierDash;
            rm.ownerId = owner.id;
            rm.arguments.Add("state", 2);   // Start Dash
            PostRenderMessage(rm);
        }
Пример #10
0
        public void Destroy()
        {
            state = BuildingState.DESTROY;

            RenderMessage message = new RenderMessage();

            message.type    = RenderMessage.Type.CrystalDestroy;
            message.ownerId = id;
            PostRenderMessage(message);
        }
Пример #11
0
    public void SpawnUnitOnMap(long playerId, int unitMetaId)
    {
        RenderMessage rm = new RenderMessage();

        rm.type = RenderMessage.Type.ShowDeployMouseEffect;
        //TODO:There maby add new show effect
        //HandleRenderMessage( rm );

        logicWorld.SpawnUnit(playerId, unitMetaId);
    }
Пример #12
0
        public virtual void Idle()
        {
            ChangeState(NpcState.IDLE, fsmIdle);

            RenderMessage rm = new RenderMessage();

            rm.ownerId   = id;
            rm.type      = RenderMessage.Type.NpcIdle;
            rm.direction = brithDirection.vector3;
            PostRenderMessage(rm);
        }
Пример #13
0
        public void Dying()
        {
            ChangeState(IdolGuardState.DYING, fsmDying);

            RenderMessage renderMessage = new RenderMessage();

            renderMessage.type    = RenderMessage.Type.IdolGuardDeath;
            renderMessage.ownerId = id;

            PostRenderMessage(renderMessage);
        }
Пример #14
0
        public void SyncPosition()
        {
            RenderMessage rm = new RenderMessage();

            rm.type    = RenderMessage.Type.SyncPosition;
            rm.ownerId = id;
            rm.arguments.Add("type", (int)type);
            rm.position  = position.vector3;
            rm.direction = speed.vector3;
            PostRenderMessage(rm);
        }
Пример #15
0
        public override void OnEnter()
        {
            base.OnEnter();

            RenderMessage rm = new RenderMessage();

            rm.ownerId   = owner.id;
            rm.direction = owner.direction.vector3;
            rm.type      = RenderMessage.Type.SummonedUnitDeath;
            owner.PostRenderMessage(rm);
        }
Пример #16
0
        private void Line2D3D(Line2D3DCommand command, FlatBufferBuilder builder, List <Offset <RenderMessage> > messages)
        {
            //FlatBuffer doesn't like nesting "create" commands within each other so declare them early instead (vectors are immune for some reason)
            var color = command.Color.ToFlatBuffer(builder);

            RenderMessage.StartRenderMessage(builder);
            RenderMessage.AddRenderType(builder, RenderType.DrawLine2D_3D);
            RenderMessage.AddColor(builder, color);
            RenderMessage.AddStart(builder, command.Start.ToFlatBuffer(builder));
            RenderMessage.AddEnd(builder, command.End.ToFlatBuffer(builder));
            messages.Add(RenderMessage.EndRenderMessage(builder));
        }
Пример #17
0
        public void Dying()
        {
            ChangeState(IdolState.DYING, fsmDying);

            RenderMessage renderMessage = new RenderMessage();

            renderMessage.type    = RenderMessage.Type.IdolDeath;
            renderMessage.ownerId = id;
            PostRenderMessage(renderMessage);

            // TODO: maybe release skill
        }
Пример #18
0
        public void DistanceOut()
        {
            DebugUtils.Log(DebugUtils.Type.AI_Projectile, "the projectile " + id + " enter distance out state ");

            RenderMessage rm = new RenderMessage();

            rm.type    = RenderMessage.Type.ProjectileHit;
            rm.ownerId = id;
            PostRenderMessage(rm);

            PostDestroy(this);
        }
Пример #19
0
        public override void ReleaseEnd()
        {
            base.ReleaseEnd();

            tempEffect.Clear();

            RenderMessage rm = new RenderMessage();

            rm.type    = RenderMessage.Type.SkillHit;
            rm.ownerId = owner.id;
            PostRenderMessage(rm);
        }
Пример #20
0
        private void DashEnd()
        {
            // play end animation
            RenderMessage rm = new RenderMessage();

            rm.type    = RenderMessage.Type.SoldierDash;
            rm.ownerId = owner.id;
            rm.arguments.Add("state", 3);   // Start Dash
            PostRenderMessage(rm);

            DelayChangeState(GameConstants.UNIT_DASHEND_DURATION, State.ReleaseEnd);
        }
Пример #21
0
        public virtual void TrapDestroy()
        {
            DebugUtils.Log(DebugUtils.Type.AI_Trap, string.Format("Trap has been Release id = {0}", id));

            RenderMessage rm = new RenderMessage();

            rm.ownerId = id;
            rm.type    = RenderMessage.Type.TrapDestroy;
            PostRenderMessage(rm);

            PostDestroy(this);
        }
Пример #22
0
        public virtual void Hit()
        {
            DebugUtils.Log(DebugUtils.Type.AI_Projectile, string.Format("Projectile {0} enter hit state", id));

            RenderMessage message = new RenderMessage();

            message.type    = RenderMessage.Type.ProjectileHit;
            message.ownerId = id;
            PostRenderMessage(message);

            PostDestroy(this);
        }
Пример #23
0
        public override void Fire()
        {
            base.Fire();

            RenderMessage rm = new RenderMessage();

            rm.ownerId = owner.id;
            rm.type    = RenderMessage.Type.SoldierReleaseSkill;
            rm.arguments.Add("index", index);
            rm.arguments.Add("metaId", metaId);

            PostRenderMessage(rm);
        }
Пример #24
0
        /// <summary>
        /// Draws a line in screen space.
        /// </summary>
        /// <param name="color">The color of the line.</param>
        /// <param name="start">The start point of the line.</param>
        /// <param name="end">The end point of the line.</param>
        public void DrawLine2D(Color color, Vector2 start, Vector2 end)
        {
            var colorOffset = color.ToOffsetColor(Builder);

            RenderMessage.StartRenderMessage(Builder);
            RenderMessage.AddRenderType(Builder, RenderType.DrawLine2D);
            RenderMessage.AddColor(Builder, colorOffset);
            RenderMessage.AddStart(Builder, start.ToOffsetVector(Builder));
            RenderMessage.AddEnd(Builder, end.ToOffsetVector(Builder));
            var finalOffset = RenderMessage.EndRenderMessage(Builder);

            _renderMessageOffsets.Add(finalOffset);
        }
Пример #25
0
        public void Idle()
        {
            ChangeState(CrystalCarState.IDLE, fsmIdle);

            direction = speed.normalized;

            RenderMessage message = new RenderMessage();

            message.type      = RenderMessage.Type.CrystalCarIdle;
            message.direction = direction.vector3;
            message.ownerId   = id;
            PostRenderMessage(message);
        }
Пример #26
0
        public virtual void Reborn()
        {
            Reset();

            Initialize(id, npcProto, brithPosition, brithDirection);

            RenderMessage rm = new RenderMessage();

            rm.type    = RenderMessage.Type.NpcReborn;
            rm.ownerId = id;
            PostRenderMessage(rm);

            DebugUtils.Log(DebugUtils.Type.AI_Npc, string.Format(" {0} {1} has been reborn", npcType, id));
        }
Пример #27
0
        public virtual void Dying()
        {
            ChangeState(NpcState.DYING, fsmDying);

            debuffHandler.Destory();
            buffHandler.Destory();

            RenderMessage renderMessage = new RenderMessage();

            renderMessage.type    = RenderMessage.Type.NpcDeath;
            renderMessage.ownerId = id;

            PostRenderMessage(renderMessage);
        }
Пример #28
0
        public void Fight(LogicUnit building)
        {
            target    = building;
            direction = speed.normalized;

            ChangeState(DemolisherState.FIGHT, fsmFight);

            RenderMessage message = new RenderMessage();

            message.type      = RenderMessage.Type.DemolisherFight;
            message.ownerId   = id;
            message.direction = direction.vector3;
            PostRenderMessage(message);
        }
Пример #29
0
        public void Mining(Crystal crystal)
        {
            target    = crystal;
            direction = speed.normalized;

            ChangeState(CrystalCarState.MINING, fsmMining);

            RenderMessage message = new RenderMessage();

            message.type      = RenderMessage.Type.CrystalCarMining;
            message.ownerId   = id;
            message.direction = direction.vector3;
            PostRenderMessage(message);
        }
Пример #30
0
        public override void Fire()
        {
            state = State.Fire;
            base.Fire();

            RenderMessage rm = new RenderMessage();

            rm.type      = RenderMessage.Type.SoldierWalk;
            rm.ownerId   = owner.id;
            rm.direction = owner.direction.vector3;
            PostRenderMessage(rm);

            owner.FindChasePath(owner.target.position);
        }
        public void OnInitialise(InitialiseMessage msg)
        {
            // Initialise renderer
            Console.WriteLine("Initialising renderer...");
            rendermsg = new RenderMessage();
            updatemsg = new UpdateMessage();

            // Create the window
            window = new RenderForm("Castle Renderer - 11030062");
            window.Width = 1280;
            window.Height = 720;

            // Add form events
            window.FormClosed += window_FormClosed;

            // Defaults
            ClearColour = new Color4(1.0f, 0.0f, 0.0f, 1.0f);

            // Setup the device
            var description = new SwapChainDescription()
            {
                BufferCount = 1,
                Usage = Usage.RenderTargetOutput,
                OutputHandle = window.Handle,
                IsWindowed = true,
                ModeDescription = new ModeDescription(0, 0, new Rational(60, 1), Format.R8G8B8A8_UNorm),
                SampleDescription = new SampleDescription(1, 0),
                Flags = SwapChainFlags.AllowModeSwitch,
                SwapEffect = SwapEffect.Discard
            };
            Device tmp;
            var result = Device.CreateWithSwapChain(DriverType.Hardware, DeviceCreationFlags.None, description, out tmp, out swapchain);
            if (result.IsFailure)
            {
                Console.WriteLine("Failed to create Direct3D11 device (" + result.Code.ToString() + ":" + result.Description + ")");
                return;
            }
            Device = tmp;
            context = Device.ImmediateContext;
            using (var factory = swapchain.GetParent<Factory>())
                factory.SetWindowAssociation(window.Handle, WindowAssociationFlags.IgnoreAltEnter);

            // Check AA stuff
            int q = Device.CheckMultisampleQualityLevels(Format.R8G8B8A8_UNorm, 8);

            // Setup the viewport
            viewport = new Viewport(0.0f, 0.0f, window.ClientSize.Width, window.ClientSize.Height);
            viewport.MinZ = 0.0f;
            viewport.MaxZ = 1.0f;
            context.Rasterizer.SetViewports(viewport);

            // Setup the backbuffer
            using (var resource = Resource.FromSwapChain<Texture2D>(swapchain, 0))
                rtBackbuffer = new RenderTargetView(Device, resource);

            // Setup depth for backbuffer
            {
                Texture2DDescription texdesc = new Texture2DDescription()
                {
                    ArraySize = 1,
                    BindFlags = BindFlags.DepthStencil,
                    CpuAccessFlags = CpuAccessFlags.None,
                    Format = Format.D32_Float,
                    Width = (int)viewport.Width,
                    Height = (int)viewport.Height,
                    MipLevels = 1,
                    OptionFlags = ResourceOptionFlags.None,
                    SampleDescription = new SampleDescription(1, 0),
                    Usage = ResourceUsage.Default
                };
                texDepthBuffer = new Texture2D(Device, texdesc);
                DepthStencilViewDescription viewdesc = new DepthStencilViewDescription()
                {
                    ArraySize = 0,
                    Format = Format.D32_Float,
                    Dimension = DepthStencilViewDimension.Texture2D,
                    MipSlice = 0,
                    Flags = 0,
                    FirstArraySlice = 0
                };
                vwDepthBuffer = new DepthStencilView(Device, texDepthBuffer, viewdesc);
            }

            // Setup states
            #region Depth States
            // Setup depth states
            {
                DepthStencilStateDescription desc = new DepthStencilStateDescription()
                {
                    IsDepthEnabled = true,
                    IsStencilEnabled = false,
                    DepthWriteMask = DepthWriteMask.All,
                    DepthComparison = Comparison.Less
                };
                Depth_Enabled = DepthStencilState.FromDescription(Device, desc);
            }
            {
                DepthStencilStateDescription desc = new DepthStencilStateDescription()
                {
                    IsDepthEnabled = false,
                    IsStencilEnabled = false,
                    DepthWriteMask = DepthWriteMask.Zero,
                    DepthComparison = Comparison.Less
                };
                Depth_Disabled = DepthStencilState.FromDescription(Device, desc);
            }
            {
                DepthStencilStateDescription desc = new DepthStencilStateDescription()
                {
                    IsDepthEnabled = true,
                    IsStencilEnabled = false,
                    DepthWriteMask = DepthWriteMask.Zero,
                    DepthComparison = Comparison.Less
                };
                Depth_ReadOnly = DepthStencilState.FromDescription(Device, desc);
            }
            #endregion
            #region Sampler States
            Sampler_Clamp = SamplerState.FromDescription(Device, new SamplerDescription()
            {
                AddressU = TextureAddressMode.Clamp,
                AddressV = TextureAddressMode.Clamp,
                AddressW = TextureAddressMode.Clamp,
                Filter = Filter.Anisotropic,
                MinimumLod = 0.0f,
                MaximumLod = float.MaxValue,
                MaximumAnisotropy = 16
            });
            Sampler_Clamp_Point = SamplerState.FromDescription(Device, new SamplerDescription()
            {
                AddressU = TextureAddressMode.Clamp,
                AddressV = TextureAddressMode.Clamp,
                AddressW = TextureAddressMode.Clamp,
                Filter = Filter.MinMagMipPoint
            });
            Sampler_Clamp_Linear = SamplerState.FromDescription(Device, new SamplerDescription()
            {
                AddressU = TextureAddressMode.Clamp,
                AddressV = TextureAddressMode.Clamp,
                AddressW = TextureAddressMode.Clamp,
                Filter = Filter.MinMagMipLinear
            });
            Sampler_Wrap = SamplerState.FromDescription(Device, new SamplerDescription()
            {
                AddressU = TextureAddressMode.Wrap,
                AddressV = TextureAddressMode.Wrap,
                AddressW = TextureAddressMode.Wrap,
                Filter = Filter.Anisotropic,
                MinimumLod = 0.0f,
                MaximumLod = float.MaxValue,
                MaximumAnisotropy = 16
            });
            #endregion
            #region Rasterizer States
            Culling_Backface = RasterizerState.FromDescription(Device, new RasterizerStateDescription()
            {
                CullMode = CullMode.Back,
                DepthBias = 0,
                DepthBiasClamp = 0.0f,
                IsDepthClipEnabled = true,
                FillMode = FillMode.Solid,
                IsAntialiasedLineEnabled = false,
                IsFrontCounterclockwise = false,
                IsMultisampleEnabled = true,
                IsScissorEnabled = false,
                SlopeScaledDepthBias = 0.0f
            });
            Culling_Frontface = RasterizerState.FromDescription(Device, new RasterizerStateDescription()
            {
                CullMode = CullMode.Front,
                DepthBias = 0,
                DepthBiasClamp = 0.0f,
                IsDepthClipEnabled = true,
                FillMode = FillMode.Solid,
                IsAntialiasedLineEnabled = false,
                IsFrontCounterclockwise = false,
                IsMultisampleEnabled = true,
                IsScissorEnabled = false,
                SlopeScaledDepthBias = 0.0f
            });
            Culling_None = RasterizerState.FromDescription(Device, new RasterizerStateDescription()
            {
                CullMode = CullMode.None,
                DepthBias = 0,
                DepthBiasClamp = 0.0f,
                IsDepthClipEnabled = true,
                FillMode = FillMode.Solid,
                IsAntialiasedLineEnabled = false,
                IsFrontCounterclockwise = false,
                IsMultisampleEnabled = true,
                IsScissorEnabled = false,
                SlopeScaledDepthBias = 0.0f
            });
            #endregion
            #region Blend States
            {
                BlendStateDescription desc = new BlendStateDescription();
                desc.RenderTargets[0].BlendEnable = true;
                desc.RenderTargets[0].BlendOperation = BlendOperation.Add;
                desc.RenderTargets[0].SourceBlend = BlendOption.One;
                desc.RenderTargets[0].DestinationBlend = BlendOption.Zero;
                desc.RenderTargets[0].BlendOperationAlpha = BlendOperation.Add;
                desc.RenderTargets[0].SourceBlendAlpha = BlendOption.One;
                desc.RenderTargets[0].DestinationBlendAlpha = BlendOption.Zero;
                desc.RenderTargets[0].RenderTargetWriteMask = ColorWriteMaskFlags.All;
                Blend_Opaque = BlendState.FromDescription(Device, desc);
            }
            {
                BlendStateDescription desc = new BlendStateDescription();
                desc.RenderTargets[0].BlendEnable = true;
                desc.RenderTargets[0].BlendOperation = BlendOperation.Add;
                desc.RenderTargets[0].SourceBlend = BlendOption.SourceAlpha;
                desc.RenderTargets[0].DestinationBlend = BlendOption.InverseSourceAlpha;
                desc.RenderTargets[0].BlendOperationAlpha = BlendOperation.Add;
                desc.RenderTargets[0].SourceBlendAlpha = BlendOption.One;
                desc.RenderTargets[0].DestinationBlendAlpha = BlendOption.Zero;
                desc.RenderTargets[0].RenderTargetWriteMask = ColorWriteMaskFlags.All;
                Blend_Alpha = BlendState.FromDescription(Device, desc);
            }
            {
                BlendStateDescription desc = new BlendStateDescription();
                desc.RenderTargets[0].BlendEnable = true;
                desc.RenderTargets[0].BlendOperation = BlendOperation.Add;
                desc.RenderTargets[0].SourceBlend = BlendOption.One;
                desc.RenderTargets[0].DestinationBlend = BlendOption.One;
                desc.RenderTargets[0].BlendOperationAlpha = BlendOperation.Add;
                desc.RenderTargets[0].SourceBlendAlpha = BlendOption.One;
                desc.RenderTargets[0].DestinationBlendAlpha = BlendOption.Zero;
                desc.RenderTargets[0].RenderTargetWriteMask = ColorWriteMaskFlags.All;
                Blend_Add = BlendState.FromDescription(Device, desc);
            }
            {
                BlendStateDescription desc = new BlendStateDescription();
                desc.RenderTargets[0].BlendEnable = true;
                desc.RenderTargets[0].BlendOperation = BlendOperation.Add;
                desc.RenderTargets[0].SourceBlend = BlendOption.DestinationColor;
                desc.RenderTargets[0].DestinationBlend = BlendOption.Zero;
                desc.RenderTargets[0].BlendOperationAlpha = BlendOperation.Add;
                desc.RenderTargets[0].SourceBlendAlpha = BlendOption.One;
                desc.RenderTargets[0].DestinationBlendAlpha = BlendOption.Zero;
                desc.RenderTargets[0].RenderTargetWriteMask = ColorWriteMaskFlags.All;
                Blend_Multiply = BlendState.FromDescription(Device, desc);
            }
            #endregion

            // Setup default states
            Depth = Depth_Enabled;
            Culling = Culling_Backface;
            Blend = Blend_Opaque;

            // Setup other objects
            shaderresourcemap = new Dictionary<Resource, ShaderResourceView>();
            resourceviewslots = new ShaderResourceViewData[MaxPixelShaderResourceViewSlots];

            // Send the window created message
            WindowCreatedMessage windowcreatedmsg = new WindowCreatedMessage();
            windowcreatedmsg.Form = window;
            Owner.MessagePool.SendMessage(windowcreatedmsg);

            // Show the form
            window.Show();
        }
        public void OnRender(RenderMessage msg)
        {
            // Clear the render queue ready for new work
            ClearRenderQueue();

            // Populate render queue with new work items
            Owner.MessagePool.SendMessage(queuemsg);

            // Populate camera list with active cameras
            cameramsg.Cameras.Clear();
            cameramsg.ShadowCasters.Clear();
            Owner.MessagePool.SendMessage(cameramsg);

            // Populate light list with active lights
            lightmsg.Lights.Clear();
            Owner.MessagePool.SendMessage(lightmsg);

            // Populate psystem list with active particle systems
            psysmsg.ParticleSystems.Clear();
            Owner.MessagePool.SendMessage(psysmsg);

            // Cache the renderer
            Renderer renderer = Owner.GetComponent<Renderer>();

            // Setup initial state
            renderer.Depth = renderer.Depth_Enabled;
            renderer.Blend = renderer.Blend_Opaque;
            renderer.Culling = renderer.Culling_None;

            // Loop each shadow caster
            foreach (ShadowCaster caster in cameramsg.ShadowCasters)
            {
                // Get the projection view matrix and transform
                Matrix projview = caster.ProjectionView;
                Transform transform = caster.Owner.GetComponent<Transform>();
                Vector3 position = transform.Position;

                // Does it belong to a directional-light?
                /*Light light = caster.Owner.GetComponent<Light>();
                if (light.Type == LightType.Directional)
                {
                    // We're responsible for positioning this light such that the shadow maps across the whole scene

                }*/

                // Bind the caster render target
                caster.RT.Bind();
                caster.RT.Clear();

                // Draw all items in the render queue to the shadowmap
                Material activematerial = null;
                foreach (RenderWorkItem item in renderqueue)
                {
                    // Set the material
                    if (activematerial != item.Material)
                    {
                        activematerial = item.Material;
                        if (activematerial.ShadowShader != null)
                            activematerial.ShadowShader.SetVariable("light_position", position);
                        renderer.SetActiveMaterial(activematerial, true);
                    }

                    // Draw it
                    renderer.DrawImmediate(item.Mesh, item.SubmeshIndex, projview, item.Transform);
                }
            }

            // Loop each camera
            foreach (Camera cam in cameramsg.Cameras)
            {
                // Get the projection view matrix and transform
                Matrix projview = cam.ProjectionView;
                Transform transform = cam.Owner.GetComponent<Transform>();
                Vector3 position = transform.Position;
                Vector3 forward = transform.Forward;
                Vector4 clip = new Vector4(cam.ClipPlane.Normal, cam.ClipPlane.D);

                // Setup initial state
                renderer.Depth = renderer.Depth_Enabled;
                renderer.Blend = renderer.Blend_Opaque;
                renderer.Culling = renderer.Culling_Backface;
                gbuffer.Bind();
                gbuffer.Clear();

                // TODO (IN THIS ORDER)
                // Note: The amount of RTs in use here is quite ridiculous
                // 1) Bind GBuffer (and set blend to normal, depth to on)
                // 2) Loop each item in the render queue
                // 2a) Check for visibility against camera
                // 2b) Bind the material
                // 2c) Draw the item
                // 3) Bind light accum buffer (and set blend to additive, depth to off)
                // 4) Loop each light
                // 4a) Check for visibility against camera
                // 4b) Draw the light layer
                // 5) Bind SwapA
                // 6) Draw camera background (skybox)
                // 7) Using the light blit material (inputs include GBuffer's colour buffer & light accum buffers), blit the image
                // 8) Loop each item in the postprocess queue
                // 8a) Bind SwapB
                // 8b) Draw postprocess effect, use SwapA as input
                // 8c) Swap SwapA and SwapB
                // 9) Bind camera target (or backbuffer if null)
                // 10) Blit SwapA to screen

                // Draw all items in the render queue to the GBuffer
                foreach (RenderWorkItem item in renderqueue)
                {
                    // Set the material
                    item.Material.SetParameter("useclip", cam.UseClipping ? 1.0f : 0.0f);
                    if (cam.UseClipping) item.Material.SetParameter("clip", clip);
                    renderer.SetActiveMaterial(item.Material);
                    var desiredculling = item.Material.CullingMode != null ? item.Material.CullingMode : renderer.Culling_Backface;
                    if (renderer.Culling != desiredculling) renderer.Culling = desiredculling;

                    // Draw it
                    renderer.DrawImmediate(item.Mesh, item.SubmeshIndex, projview, item.Transform);
                }

                // Setup light accum state
                lightaccum.Bind();
                lightaccum.Clear();
                renderer.Depth = renderer.Depth_Disabled;
                renderer.Blend = renderer.Blend_Add;
                renderer.Culling = renderer.Culling_None;

                // Update camera details on all light types
                foreach (Material lightmat in mat_lights.Values)
                {
                    lightmat.SetParameter("camera_position", position);
                    lightmat.SetParameter("camera_forward", forward);
                }

                // Draw all lights
                foreach (Light light in lightmsg.Lights)
                {
                    // Set the material
                    Material lightmat = mat_lights[light.Type];
                    light.ApplyLightSettings(lightmat);
                    lightmat.Apply(false);
                    renderer.SetActiveMaterial(lightmat);

                    // Draw it
                    renderer.DrawImmediate(mesh_fs, 0);
                }

                // Are there particle systems to draw?
                if (psysmsg.ParticleSystems.Count > 0)
                {
                    // Setup state
                    renderer.Depth = renderer.Depth_ReadOnly;
                    //renderer.Depth = renderer.Depth_Disabled;

                    // Bind particle system RT (hybrid of GBuffer depth and RT colour)
                    particleaccum.BindHybrid(gbuffer.GetDepthView());
                    //particleaccum.Bind();
                    particleaccum.Clear();

                    // Render
                    for (int i = 0; i < psysmsg.ParticleSystems.Count; i++)
                    {
                        ParticleSystem psys = psysmsg.ParticleSystems[i];
                        if (psys.TransferMode == ParticleTransferMode.Add)
                            renderer.Blend = renderer.Blend_Add;
                        else if (psys.TransferMode == ParticleTransferMode.Alpha)
                            renderer.Blend = renderer.Blend_Alpha;
                        else
                            renderer.Blend = renderer.Blend_Opaque;
                        psys.Material.Shader.SetVariable("view", transform.WorldToObject);
                        psys.Material.Shader.SetVariable("projection", cam.Projection);
                        renderer.SetActiveMaterial(psys.Material);
                        renderer.DrawImmediate(psys.Mesh, 0, projview, Matrix.Identity);
                    }
                }

                // Setup blit state
                swapA.Bind();
                renderer.Blend = renderer.Blend_Alpha;
                renderer.Depth = renderer.Depth_Disabled;

                // Draw background
                if (cam.Background == BackgroundType.Skybox)
                {
                    if (cam.Skybox != null)
                    {
                        renderer.SetActiveMaterial(cam.Skybox);
                        Vector3 campos = transform.Position;
                        renderer.DrawImmediate(mesh_skybox, 0, cam.ProjectionView, Matrix.Translation(campos.X - 0.5f, campos.Y - 0.5f, campos.Z - 0.5f));
                    }
                }

                // Blit lighting
                renderer.SetActiveMaterial(mat_blitlight);
                renderer.DrawImmediate(mesh_fs, 0);

                // Are there particle systems to draw?
                if (psysmsg.ParticleSystems.Count > 0)
                {
                    // Blit particles
                    renderer.Blend = renderer.Blend_Add;
                    mat_blit.SetParameter("texSource", particleaccum.GetTexture(particleaccum_colour));
                    renderer.SetActiveMaterial(mat_blit);
                    renderer.DrawImmediate(mesh_fs, 0);
                }

                // Setup state
                renderer.Blend = renderer.Blend_Opaque;

                // Loop each postprocess
                RenderTarget pp_source = swapA;
                RenderTarget pp_target = swapB;
                foreach (PostProcessEffect effect in effectqueue)
                {
                    // Bind target
                    pp_target.Bind();

                    // Apply material
                    effect.Material.SetParameter("texImage", pp_source.GetTexture(0));
                    effect.Material.SetParameter("imagesize", new Vector2(pp_source.Width, pp_source.Height));
                    renderer.SetActiveMaterial(effect.Material, false, true);

                    // Blit
                    renderer.DrawImmediate(mesh_fs, 0);

                    // Swap
                    Util.Swap(ref pp_source, ref pp_target);
                }

                // Bind camera target
                if (cam.Target != null)
                    cam.Target.Bind();
                else
                    renderer.BindBackbuffer();

                // Blit final result
                mat_blit.SetParameter("texSource", pp_source.GetTexture(0));
                renderer.SetActiveMaterial(mat_blit, false, true);
                renderer.DrawImmediate(mesh_fs, 0);
            }
        }
 public RCS_Render_Job_Message(RenderMessage message, Guid concernedRenderJobID, RemoteType remote) : base(remote)
 {
     this.Message = message;
     this.ConcernedRenderJobID = concernedRenderJobID;
 }