Example #1
0
        /// <summary>
        /// Renders the shadow map using the orthographic camera created in
        /// CalculateFrustum.
        /// </summary>
        /// <param name="modelList">The list of models to be rendered</param>
        protected void RenderShadowMap(int splitIndex)
        {
            PrepareViewportForCascade(splitIndex);

            // Set up the effect
            MyEffectShadowMap shadowMapEffect = MyRender.GetEffect(MyEffects.ShadowMap) as Effects.MyEffectShadowMap;

            shadowMapEffect.SetDitheringTexture((SharpDX.Direct3D9.Texture)MyTextureManager.GetTexture <MyTexture2D>(@"Textures\Models\Dither.png"));
            shadowMapEffect.SetHalfPixel(MyShadowRenderer.NumSplits * MyRender.GetShadowCascadeSize(), MyRender.GetShadowCascadeSize());

            // Clear shadow map
            shadowMapEffect.SetTechnique(MyEffectShadowMap.ShadowTechnique.Clear);

            MyRender.GetFullscreenQuad().Draw(shadowMapEffect);

            shadowMapEffect.SetViewProjMatrix((Matrix)m_lightCameras[splitIndex].ViewProjMatrixAtZero);

            MyRender.GetRenderProfiler().StartProfilingBlock("draw elements");
            // Draw the models
            DrawElements(m_lightCameras[splitIndex].CastingRenderElements, shadowMapEffect, true, m_lightCameras[splitIndex].WorldMatrix.Translation, splitIndex, true);

            m_lightCameras[splitIndex].CastingRenderElements.Clear();

            MyRender.GetRenderProfiler().EndProfilingBlock();
        }
        protected static void DrawElements(List <MyRender.MyRenderElement> elements, MyEffectShadowMap effect, bool relativeCamera, int perfCounterIndex)
        {
            // Draw shadows.
            effect.SetTechnique(MyEffectShadowMap.ShadowTechnique.GenerateShadow);
            DrawShadowsForElements(effect, relativeCamera, elements, false, perfCounterIndex);

            effect.SetTechnique(MyEffectShadowMap.ShadowTechnique.GenerateShadowForVoxels);
            DrawShadowsForElements(effect, relativeCamera, elements, true, perfCounterIndex);
        }
        protected void RenderShadowMap(Matrix lightViewProjectionAtZero)
        {
            // Set up the effect
            MyEffectShadowMap shadowMapEffect = MyRender.GetEffect(MyEffects.ShadowMap) as MyEffectShadowMap;

            shadowMapEffect.SetViewProjMatrix(lightViewProjectionAtZero);
            shadowMapEffect.SetDitheringTexture((SharpDX.Direct3D9.Texture)MyTextureManager.GetTexture <MyTexture2D>(@"Textures\Models\Dither.png"));
            shadowMapEffect.SetHalfPixel(MySpotShadowRenderer.SpotShadowMapSize, MySpotShadowRenderer.SpotShadowMapSize);

            // Draw the models
            DrawElements(m_renderElementsForShadows, shadowMapEffect, true, MyRenderCamera.Position, MyShadowRenderer.NumSplits, false);
        }
        public override void RecreateControls(bool contructor)
        {
            Controls.Clear();

            m_scale = 0.7f;

            AddCaption(new System.Text.StringBuilder("Render Lights debug"), Color.Yellow.ToVector4());

            MyGuiControlLabel label = new MyGuiControlLabel(this, new Vector2(0.01f, -m_size.Value.Y / 2.0f + 0.07f), null, new System.Text.StringBuilder("(press ALT to share focus)"), Color.Yellow.ToVector4(), MyGuiConstants.LABEL_TEXT_SCALE * 0.7f,
                                                            MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_TOP);

            Controls.Add(label);

            m_currentPosition = -m_size.Value / 2.0f + new Vector2(0.02f, 0.10f);

            m_currentPosition.Y += 0.01f;
            AddLabel(new StringBuilder("Lights"), Color.Yellow.ToVector4(), 1.2f);

            AddCheckBox(new StringBuilder("Enable lights"), null, MemberHelper.GetMember(() => EnableRenderLights));
            AddCheckBox(new StringBuilder("Enable light glares"), null, MemberHelper.GetMember(() => MyLightGlare.EnableLightGlares));
            AddCheckBox(new StringBuilder("Enable spot shadows"), null, MemberHelper.GetMember(() => MyRender.EnableSpotShadows));
            AddCheckBox(new StringBuilder("Enable spectator light"), null, MemberHelper.GetMember(() => MyRender.EnableSpectatorReflector));
            AddCheckBox(new StringBuilder("Only specular intensity"), null, MemberHelper.GetMember(() => MyRender.ShowSpecularIntensity));
            AddCheckBox(new StringBuilder("Only specular power"), null, MemberHelper.GetMember(() => MyRender.ShowSpecularPower));
            AddCheckBox(new StringBuilder("Only emissivity"), null, MemberHelper.GetMember(() => MyRender.ShowEmissivity));
            AddCheckBox(new StringBuilder("Only reflectivity"), null, MemberHelper.GetMember(() => MyRender.ShowReflectivity));

            MyEffectShadowMap shadowMapEffect = MyRender.GetEffect(MyEffects.ShadowMap) as MyEffectShadowMap;

            if (shadowMapEffect != null)
            {
                m_currentPosition.Y += 0.01f;
                AddLabel(new StringBuilder("Sun"), Color.Yellow.ToVector4(), 1.2f);
                AddCheckBox(new StringBuilder("Enable sun"), null, MemberHelper.GetMember(() => MyRender.EnableSun));
                AddCheckBox(new StringBuilder("Enable shadows"), null, MemberHelper.GetMember(() => MyRender.EnableShadows));
                AddCheckBox(new StringBuilder("Enable asteroid shadows"), null, MemberHelper.GetMember(() => MyRender.EnableAsteroidShadows));
                AddCheckBox(new StringBuilder("Enable ambient map"), MyRender.EnableEnvironmentMapAmbient, OnAmbientMapChecked);
                AddCheckBox(new StringBuilder("Enable reflection map"), MyRender.EnableEnvironmentMapReflection, OnReflectionMapChecked);
                AddCheckBox(new StringBuilder("Enable voxel ambient"), null, MemberHelper.GetMember(() => MyRender.EnablePerVertexVoxelAmbient));
                AddSlider(new StringBuilder("Intensity"), 0, 10.0f, MySector.SunProperties, MemberHelper.GetMember(() => MySector.SunProperties.SunIntensity));
                AddCheckBox(new StringBuilder("Show cascade splits"), null, MemberHelper.GetMember(() => MyRender.ShowCascadeSplits));
                //nefunguje po obfuskaci
                // AddSlider(new StringBuilder("ShadowBias"), 0, 0.01f, shadowMapEffect, MemberHelper.GetMember(() => shadowMapEffect.ShadowBias));

                AddCheckBox(new StringBuilder("Enable shadow interleaving"), null, MemberHelper.GetMember(() => MyRender.ShadowInterleaving));
                AddCheckBox(new StringBuilder("Freeze cascade 0"), null, MemberHelper.GetMember(() => MyRender.FreezeCascade0));
                AddCheckBox(new StringBuilder("Freeze cascade 1"), null, MemberHelper.GetMember(() => MyRender.FreezeCascade1));
                AddCheckBox(new StringBuilder("Freeze cascade 2"), null, MemberHelper.GetMember(() => MyRender.FreezeCascade2));
                AddCheckBox(new StringBuilder("Freeze cascade 3"), null, MemberHelper.GetMember(() => MyRender.FreezeCascade3));
            }
        }
        protected void RenderShadowMap(Matrix lightViewProjection)
        {
            // Set up the effect
            MyEffectShadowMap shadowMapEffect = MyRender.GetEffect(MyEffects.ShadowMap) as MinerWars.AppCode.Game.Effects.MyEffectShadowMap;

            shadowMapEffect.SetViewProjMatrix(lightViewProjection);

            /*
             * m_culledElements.Clear();
             * foreach (MyRender.MyRenderElement element in m_renderElementsForShadows)
             * {
             * m_culledElements.Add(element);
             * }
             */
            // Draw the models
            DrawElements(m_renderElementsForShadows, shadowMapEffect, false, MyPerformanceCounter.NoSplit);
        }
        /// <summary>
        /// Renders the shadow map using the orthographic camera created in
        /// CalculateFrustum.
        /// </summary>
        /// <param name="modelList">The list of models to be rendered</param>
        protected void RenderShadowMap(int splitIndex)
        {
            PrepareViewportForCascade(splitIndex);

            // Set up the effect
            MyEffectShadowMap shadowMapEffect = MyRender.GetEffect(MyEffects.ShadowMap) as MinerWars.AppCode.Game.Effects.MyEffectShadowMap;

            // Clear shadow map
            shadowMapEffect.SetTechnique(MyEffectShadowMap.ShadowTechnique.Clear);
            MyGuiManager.GetFullscreenQuad().Draw(shadowMapEffect);

            shadowMapEffect.SetViewProjMatrix(m_lightCameras[splitIndex].ViewProjectionMatrix);

            MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("draw elements");
            // Draw the models
            DrawElements(m_lightCameras[splitIndex].CastingRenderElements, shadowMapEffect, false, splitIndex);

            MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock();
        }
        private static void DrawShadowsForElements(MyEffectShadowMap effect, bool relativeCamera, List <MyRender.MyRenderElement> elements, bool voxelShadows, int perfCounterIndex)
        {
            effect.Begin();

            long lastVertexBuffer = 0;

            for (int i = 0; i < elements.Count; i++)
            {
                MyRender.MyRenderElement renderElement = elements[i];

                if ((renderElement.Entity is MyVoxelMap) != voxelShadows ||
                    renderElement.VertexBuffer.IsDisposed ||
                    renderElement.IndexBuffer.IsDisposed)
                {
                    continue;
                }

                long currentVertexBuffer = renderElement.VertexBuffer.GetHashCode();
                if (lastVertexBuffer != currentVertexBuffer)
                {
                    lastVertexBuffer = currentVertexBuffer;

                    MyMinerGame.Static.GraphicsDevice.SetStreamSource(0, renderElement.VertexBuffer, 0, renderElement.VertexStride);
                    MyMinerGame.Static.GraphicsDevice.VertexDeclaration = renderElement.VertexDeclaration;
                    MyMinerGame.Static.GraphicsDevice.Indices           = renderElement.IndexBuffer;

                    System.Diagnostics.Debug.Assert(renderElement.IndexBuffer != null);
                }

                effect.SetWorldMatrix(relativeCamera ? renderElement.WorldMatrixForDraw : renderElement.WorldMatrix);

                MyPerformanceCounter.PerCameraDraw.ShadowDrawCalls[perfCounterIndex]++;

                effect.D3DEffect.CommitChanges();
                MyMinerGame.Static.GraphicsDevice.DrawIndexedPrimitive(SharpDX.Direct3D9.PrimitiveType.TriangleList, 0, 0, renderElement.VertexCount, renderElement.IndexStart, renderElement.TriCount);

                MyPerformanceCounter.PerCameraDraw.TotalDrawCalls++;
            }

            effect.End();
        }
        protected static void DrawElements(List <MyRender.MyRenderElement> elements, MyEffectShadowMap effect, bool relativeCamera, Vector3D cameraPos, int perfCounterIndex, bool ditheredShadows)
        {
            // Draw shadows.
            effect.SetTechnique(MyEffectShadowMap.ShadowTechnique.GenerateShadow);
            DrawShadowsForElements(effect, relativeCamera, cameraPos, elements, false, false, false, false, perfCounterIndex, ditheredShadows);

            effect.SetTechnique(MyEffectShadowMap.ShadowTechnique.GenerateShadowForVoxels);
            DrawShadowsForElements(effect, relativeCamera, cameraPos, elements, true, false, false, false, perfCounterIndex, ditheredShadows);

            effect.SetTechnique(MyEffectShadowMap.ShadowTechnique.GenerateShadowForSkinned);
            DrawShadowsForElements(effect, relativeCamera, cameraPos, elements, false, true, false, false, perfCounterIndex, ditheredShadows);

            effect.SetTechnique(MyEffectShadowMap.ShadowTechnique.GenerateShadowInstanced);
            DrawShadowsForElements(effect, relativeCamera, cameraPos, elements, false, false, true, false, perfCounterIndex, ditheredShadows);

            effect.SetTechnique(MyEffectShadowMap.ShadowTechnique.GenerateShadowInstancedGeneric);
            DrawShadowsForElements(effect, relativeCamera, cameraPos, elements, false, false, false, true, perfCounterIndex, ditheredShadows);

            // We don't want to keep objects alive
            Clear();
        }
        private static void DrawShadowsForElements(MyEffectShadowMap effect, bool relativeCamera, Vector3D cameraPos, List <MyRender.MyRenderElement> elements, bool voxelShadows, bool skinnedShadows, bool instancedShadows, bool genericInstancedShadows, int perfCounterIndex, bool ditheredShadows)
        {
            effect.Begin();

            long lastVertexBuffer = 0;

            for (int i = 0; i < elements.Count; i++)
            {
                MyRender.MyRenderElement renderElement = elements[i];

                if ((renderElement.RenderObject is MyRenderVoxelCell) != voxelShadows ||
                    renderElement.VertexBuffer.IsDisposed ||
                    renderElement.IndexBuffer.IsDisposed)
                {
                    continue;
                }

                if ((renderElement.RenderObject is MyRenderCharacter) != skinnedShadows)
                {
                    continue;
                }

                //if ((renderElement.InstanceBuffer != null) != instancedShadows)
                //    continue;

                if ((renderElement.InstanceBuffer != null && renderElement.InstanceStride == 64) != instancedShadows)
                {
                    continue;
                }

                if ((renderElement.InstanceBuffer != null && renderElement.InstanceStride == 32) != genericInstancedShadows)
                {
                    continue;
                }

                long currentVertexBuffer = renderElement.VertexBuffer.GetHashCode();
                if ((lastVertexBuffer != currentVertexBuffer) || instancedShadows || genericInstancedShadows)
                {
                    lastVertexBuffer = currentVertexBuffer;

                    MyRender.GraphicsDevice.Indices           = renderElement.IndexBuffer;
                    MyRender.GraphicsDevice.VertexDeclaration = renderElement.VertexDeclaration;

                    if (renderElement.InstanceBuffer == null)
                    {
                        MyRender.GraphicsDevice.ResetStreamSourceFrequency(0);
                        MyRender.GraphicsDevice.ResetStreamSourceFrequency(1);
                        MyRender.GraphicsDevice.SetStreamSource(1, null, 0, 0);
                    }
                    else
                    {
                        MyRender.GraphicsDevice.SetStreamSourceFrequency(0, renderElement.InstanceCount, StreamSource.IndexedData);
                        MyRender.GraphicsDevice.SetStreamSourceFrequency(1, 1, StreamSource.InstanceData);
                        MyRender.GraphicsDevice.SetStreamSource(1, renderElement.InstanceBuffer, renderElement.InstanceStart * renderElement.InstanceStride, renderElement.InstanceStride);
                    }
                    MyRender.GraphicsDevice.SetStreamSource(0, renderElement.VertexBuffer, 0, renderElement.VertexStride);

                    System.Diagnostics.Debug.Assert(renderElement.IndexBuffer != null);
                }

                if (relativeCamera)
                {
                    MatrixD m = renderElement.WorldMatrix;
                    m.Translation -= cameraPos;
                    effect.SetWorldMatrix((Matrix)m);
                }
                else
                {
                    effect.SetWorldMatrix((Matrix)renderElement.WorldMatrix);
                }

                if (voxelShadows)
                {
                    var voxelCell = renderElement.RenderObject as MyRenderVoxelCell;
                    if (voxelCell != null)
                    {
                        MyRenderVoxelCell.EffectArgs args;
                        voxelCell.GetEffectArgs(out args);
                        effect.VoxelVertex.SetArgs(ref args);
                    }
                }

                var skinMatrices = skinnedShadows ? ((MyRenderCharacter)renderElement.RenderObject).SkinMatrices : null;
                if (skinMatrices != null)
                {
                    var bonesUsed = renderElement.BonesUsed;
                    if (bonesUsed == null)
                    {
                        for (int b = 0; b < Math.Min(skinMatrices.Length, MyRenderConstants.MAX_SHADER_BONES); b++)
                        {
                            m_bonesBuffer[b] = skinMatrices[b];
                        }
                    }
                    else
                    {
                        for (int b = 0; b < bonesUsed.Length; b++)
                        {
                            m_bonesBuffer[b] = skinMatrices[bonesUsed[b]];
                        }
                    }
                    effect.SetBones(m_bonesBuffer);
                }

                effect.SetDithering(ditheredShadows ? renderElement.Dithering : 0);

                MyPerformanceCounter.PerCameraDrawWrite.ShadowDrawCalls[perfCounterIndex]++;

                effect.D3DEffect.CommitChanges();

                MyRender.GraphicsDevice.DrawIndexedPrimitive(SharpDX.Direct3D9.PrimitiveType.TriangleList, 0, 0, renderElement.VertexCount, renderElement.IndexStart, renderElement.TriCount);
                MyPerformanceCounter.PerCameraDrawWrite.TotalDrawCalls++;
            }

            MyRender.GraphicsDevice.ResetStreamSourceFrequency(0);
            MyRender.GraphicsDevice.ResetStreamSourceFrequency(1);

            effect.End();
        }
Example #10
0
        public override void RecreateControls(bool contructor)
        {
            Controls.Clear();



            m_scale = 0.62f;

            AddCaption(new System.Text.StringBuilder("Colors settings"), Color.Yellow.ToVector4());

            MyGuiControlLabel label = new MyGuiControlLabel(this, new Vector2(0.01f, -m_size.Value.Y / 2.0f + 0.07f), null, new System.Text.StringBuilder("(press ALT to share focus)"), Color.Yellow.ToVector4(), MyGuiConstants.LABEL_TEXT_SCALE * 0.7f,
                                                            MyGuiDrawAlignEnum.HORISONTAL_CENTER_AND_VERTICAL_TOP);

            Controls.Add(label);

            m_currentPosition = -m_size.Value / 2.0f + new Vector2(0.02f, 0.10f);

            m_currentPosition.Y += 0.01f;
            AddLabel(new StringBuilder("Sun"), Color.Yellow.ToVector4(), 1.2f);

            var sunObj = MySector.SunProperties;

            MyEffectShadowMap shadowMapEffect = MyRender.GetEffect(MyEffects.ShadowMap) as MyEffectShadowMap;

            if (shadowMapEffect != null)
            {
                m_currentPosition.Y += 0.01f;
                AddSlider(new StringBuilder("Intensity"), 0, 10.0f, sunObj, MemberHelper.GetMember(() => MySector.SunProperties.SunIntensity));

                m_currentPosition.Y += 0.01f;
                AddColor(new StringBuilder("Sun color"), sunObj, MemberHelper.GetMember(() => MySector.SunProperties.SunDiffuse));

                m_currentPosition.Y += 0.02f;
                AddColor(new StringBuilder("Sun specular"), sunObj, MemberHelper.GetMember(() => MySector.SunProperties.SunSpecular));

                m_currentPosition.Y += 0.02f;
                AddSlider(new StringBuilder("Back sun intensity"), 0, 5.0f, sunObj, MemberHelper.GetMember(() => MySector.SunProperties.BackSunIntensity));

                m_currentPosition.Y += 0.01f;
                AddColor(new StringBuilder("Back sun color"), sunObj, MemberHelper.GetMember(() => MySector.SunProperties.BackSunDiffuse));

                m_currentPosition.Y += 0.02f;
                AddColor(new StringBuilder("Ambient color"), sunObj, MemberHelper.GetMember(() => MySector.SunProperties.AmbientColor));

                m_currentPosition.Y += 0.02f;
                AddSlider(new StringBuilder("Ambient multiplier"), 0, 5.0f, sunObj, MemberHelper.GetMember(() => MySector.SunProperties.AmbientMultiplier));

                AddSlider(new StringBuilder("Env. ambient intensity"), 0, 5.0f, sunObj, MemberHelper.GetMember(() => MySector.SunProperties.EnvironmentAmbientIntensity));
            }

            /*
             * //m_currentPosition.Y += 0.01f;
             * AddLabel(new StringBuilder("Player ship"), Color.Yellow.ToVector4(), 1.2f);
             *
             * //m_currentPosition.Y += 0.01f;
             * AddSlider(new StringBuilder("Light range multiplier"), 0, 10, null, MemberHelper.GetMember(() => MySmallShip.LightRangeMultiplier));
             * AddSlider(new StringBuilder("Light intensity multiplier"), 0, 10, null, MemberHelper.GetMember(() => MySmallShip.LightIntensityMultiplier));
             * AddSlider(new StringBuilder("Reflector intensity multiplier"), 0, 10, null, MemberHelper.GetMember(() => MySmallShip.ReflectorIntensityMultiplier));
             */
            //m_currentPosition.Y += 0.01f;
            AddLabel(new StringBuilder("Post process"), Color.Yellow.ToVector4(), 1.2f);
            //m_currentPosition.Y += 0.01f;
            MyPostProcessContrast contrastPP = MyRender.GetPostProcess(MyPostProcessEnum.Contrast) as MyPostProcessContrast;

            if (contrastPP != null)
            {
                AddSlider(new StringBuilder("Contrast"), -10, 10, contrastPP, MemberHelper.GetMember(() => contrastPP.Contrast));
                AddSlider(new StringBuilder("Hue"), -10, 10, contrastPP, MemberHelper.GetMember(() => contrastPP.Hue));
                AddSlider(new StringBuilder("Saturation"), -10, 10, contrastPP, MemberHelper.GetMember(() => contrastPP.Saturation));
            }


            m_currentPosition.Y += 0.01f;
        }