示例#1
0
        public override void SetupEntity(MyEffectBase shader, MyRender.MyRenderElement renderElement)
        {
            MyEffectAtmosphere effectAtmosphere = shader as MyEffectAtmosphere;

            effectAtmosphere.SetWorldMatrix((Matrix)renderElement.WorldMatrixForDraw);
            effectAtmosphere.SetDiffuseColor(renderElement.Color);

            var atmosphere = renderElement.RenderObject as MyRenderAtmosphere;

            float depthScale = 0.2f;

            effectAtmosphere.SetInnerRadius(atmosphere.PlanetRadius);
            effectAtmosphere.SetOutherRadius(atmosphere.AtmosphereRadius);

            float scaleAtmosphere = 1.0f / (atmosphere.AtmosphereRadius - atmosphere.PlanetRadius);

            effectAtmosphere.SetScaleAtmosphere(scaleAtmosphere);
            effectAtmosphere.SetScaleAtmosphereOverScaleDepth(scaleAtmosphere / depthScale);

            Vector3 cameraToCenter = atmosphere.GetRelativeCameraPos(MyRenderCamera.Position);

            effectAtmosphere.SetRelativeCameraPos(cameraToCenter);

            effectAtmosphere.SetLightPos(-MySunGlare.GetSunDirection());
            effectAtmosphere.SetIsInside(atmosphere.IsInside(MyRenderCamera.Position));

            effectAtmosphere.SetScaleDepth(depthScale);

            effectAtmosphere.SetWavelength(atmosphere.AtmosphereWavelengths);
        }
        public static void SetupVoxelEntity(MyLodTypeEnum lod, MyEffectBase shader, MyRender.MyRenderElement renderElement)
        {
            MyEffectVoxels effectVoxels = shader as MyEffectVoxels;

            {
                MatrixD worldMatrixD = renderElement.WorldMatrix;
                worldMatrixD.Translation -= MyRenderCamera.Position;
                var worldMatrix = (Matrix)worldMatrixD;
                effectVoxels.SetWorldMatrix(ref worldMatrix);
            }

            //effectVoxels.SetVoxelMapPosition((Vector3)(renderElement.WorldMatrix.Translation - MyRenderCamera.Position));
            //effectVoxels.SetPositionLocalOffset((Vector3)(renderElement.WorldMatrix.Right));
            //effectVoxels.SetPositionLocalScale((Vector3)(renderElement.WorldMatrix.Up));
            //effectVoxels.SetLodBounds(new Vector2((float)renderElement.WorldMatrix.M14, (float)renderElement.WorldMatrix.M24));
            effectVoxels.SetDiffuseColor(Vector3.One);
            if (MyRenderSettings.DebugClipmapLodColor && renderElement.VoxelBatch.Lod < MyRenderVoxelCell.LOD_COLORS.Length)
            {
                effectVoxels.SetDiffuseColor(MyRenderVoxelCell.LOD_COLORS[renderElement.VoxelBatch.Lod].ToVector3());
            }
            effectVoxels.EnablePerVertexAmbient(MyRender.Settings.EnablePerVertexVoxelAmbient);

            if (lod == MyLodTypeEnum.LOD_BACKGROUND && renderElement.RenderObject is MyRenderVoxelCellBackground)
            {
                SetupAtmosphere(effectVoxels, renderElement.RenderObject as MyRenderVoxelCellBackground);
            }
        }
        private void setupRenderElement(MyModel model, Matrix worldMatrix)
        {
            model.LoadInDraw();

            foreach (MyMesh mesh in model.GetMeshList())
            {
                MyRender.MyRenderElement renderElement =
                    mesh.GetMaterial().DrawTechnique == MyMeshDrawTechnique.HOLO ?
                    MyRender.AddTransparentRenderElement(m_setup.TransparentRenderElementsToDraw) :
                    MyRender.AddRenderElement(m_setup.RenderElementsToDraw);
                if (renderElement == null)
                {
                    return;
                }

                renderElement.Entity    = null;
                renderElement.DebugName = "";

                renderElement.VertexBuffer = model.VertexBuffer;
                renderElement.IndexBuffer  = mesh.IndexBuffer;

                renderElement.WorldMatrixForDraw = worldMatrix;
                renderElement.WorldMatrix        = worldMatrix;

                renderElement.BoundingBox = model.BoundingBox.Transform(renderElement.WorldMatrix);

                renderElement.Material = mesh.GetMaterial();
            }
        }
        public static void SetupVoxelEntity(MyLodTypeEnum lod, MyEffectBase shader, MyRender.MyRenderElement renderElement)
        {
            MyEffectVoxels effectVoxels = shader as MyEffectVoxels;

            {
                MatrixD worldMatrixD = renderElement.WorldMatrix;
                worldMatrixD.Translation -= MyRenderCamera.Position;
                var worldMatrix = (Matrix)worldMatrixD;
                effectVoxels.SetWorldMatrix(ref worldMatrix);
            }

            var voxelCell = renderElement.RenderObject as MyRenderVoxelCell;

            if (voxelCell != null)
            {
                MyRenderVoxelCell.EffectArgs args;
                voxelCell.GetEffectArgs(out args);
                effectVoxels.VoxelVertex.SetArgs(ref args);
            }

            effectVoxels.SetDiffuseColor(Vector3.One);
            if (MyRenderSettings.DebugClipmapLodColor && renderElement.VoxelBatch.Lod < MyRenderVoxelCell.LOD_COLORS.Length)
            {
                effectVoxels.SetDiffuseColor(MyRenderVoxelCell.LOD_COLORS[renderElement.VoxelBatch.Lod].ToVector3());
            }
            effectVoxels.EnablePerVertexAmbient(
                MyRenderSettings.EnableVoxelAo,
                MyRenderSettings.VoxelAoMin,
                MyRenderSettings.VoxelAoMax,
                MyRenderSettings.VoxelAoOffset);
        }
        public sealed override void SetupEntity(MyEffectBase shader, MyRender.MyRenderElement renderElement)
        {
            base.SetupEntity(shader, renderElement);

            MyEffectModelsDNS effectDNS = shader as MyEffectModelsDNS;

            MyRenderCharacter character = renderElement.RenderObject as MyRenderCharacter;

            var bonesUsed = renderElement.BonesUsed;

            if (character.SkinMatrices != null)
            {
                if (bonesUsed == null)
                {
                    for (int i = 0; i < Math.Min(character.SkinMatrices.Length, MyRenderConstants.MAX_SHADER_BONES); i++)
                    {
                        m_bonesBuffer[i] = character.SkinMatrices[i];
                    }
                }
                else
                {
                    for (int i = 0; i < bonesUsed.Length; i++)
                    {
                        m_bonesBuffer[i] = character.SkinMatrices[bonesUsed[i]];
                    }
                }

                effectDNS.SetBones(m_bonesBuffer);
            }
        }
示例#6
0
        private void SetupRenderElements(MyModel model, Matrix worldMatrix, int materialIndex = 0, bool staticAsteroid = false)
        {
            model.LoadInDraw();

            var meshList = model.GetMeshList();

            foreach (MyMesh mesh in meshList)
            {
                if (materialIndex > mesh.Materials.Length - 1)
                {
                    materialIndex = 0;
                }

                var material = staticAsteroid ? MyVoxelMaterials.GetMaterialForMesh(FakeEntity.VoxelMaterial) : mesh.Materials[materialIndex];

                material.PreloadTexture(Managers.LoadingMode.Immediate);

                if (material.DrawTechnique == MyMeshDrawTechnique.DECAL)
                {
                    continue;
                }

                if (staticAsteroid && material.DrawTechnique == MyMeshDrawTechnique.MESH)
                {
                    material.DrawTechnique = MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID;
                }

                //Do not use render alocator, it will reuse elements
                MyRender.MyRenderElement renderElement = new MyRender.MyRenderElement();
                //MyRender.AllocateRenderElement(out renderElement);

                renderElement.Entity = FakeEntity;

                renderElement.VertexBuffer = model.VertexBuffer;
                renderElement.IndexBuffer  = model.IndexBuffer;
                renderElement.IndexStart   = mesh.IndexStart;
                renderElement.TriCount     = mesh.TriCount;

                //renderElement.UseChannels = false;

                renderElement.WorldMatrixForDraw = worldMatrix;
                renderElement.WorldMatrix        = worldMatrix;

                renderElement.Material      = material;
                renderElement.DrawTechnique = material.DrawTechnique;
                renderElement.VoxelBatch    = null;

                if (material.DrawTechnique == MyMeshDrawTechnique.HOLO)
                {
                    m_setup.TransparentRenderElementsToDraw.Add(renderElement);
                }
                else
                {
                    m_setup.RenderElementsToDraw.Add(renderElement);
                }
            }
        }
        public override void SetupEntity(MyEffectBase shader, MyRender.MyRenderElement renderElement)
        {
            base.SetupEntity(shader, renderElement);

            if (renderElement.Dithering > 0)
            {
                //    renderElement.Dithering = 0;
            }
        }
示例#8
0
        public override void SetupEntity(MyEffectBase shader, MyRender.MyRenderElement renderElement)
        {
            MyEffectModelsDNS effectDNS = shader as MyEffectModelsDNS;

            effectDNS.SetWorldMatrix((Matrix)renderElement.WorldMatrixForDraw);
            effectDNS.SetDiffuseColor(renderElement.Color);
            effectDNS.Dithering = renderElement.Dithering;
            effectDNS.Time      = (float)MyRender.InterpolationTime.Miliseconds;
            effectDNS.SetColorMaskHSV(renderElement.ColorMaskHSV);
        }
        public override void SetupEntity(MyEffectBase shader, MyRender.MyRenderElement renderElement)
        {
            MyEffectModelsDNS effectDNS = shader as MyEffectModelsDNS;

            // This is required, it's position of whole group
            effectDNS.SetWorldMatrix((Matrix)renderElement.WorldMatrixForDraw);

            // This should be in instance buffer when required
            effectDNS.SetDiffuseColor(renderElement.Color);
            effectDNS.Dithering = renderElement.Dithering;
            effectDNS.SetColorMaskHSV(renderElement.ColorMaskHSV);
            effectDNS.SetEmissivity(0);
        }
        public override void SetupEntity(MyEffectBase shader, MyRender.MyRenderElement renderElement)
        {
            base.SetupEntity(shader, renderElement);

            var atmosphere = renderElement.RenderObject as MyRenderAtmosphere;

            if (atmosphere.IsInside(MyRenderCamera.Position))
            {
                MyEffectAtmosphere effectAtmosphere = shader as MyEffectAtmosphere;
                Matrix             optProjection    = Matrix.CreatePerspectiveFieldOfView(MyRenderCamera.FieldOfView, MyRenderCamera.AspectRatio, MyRenderCamera.NEAR_PLANE_DISTANCE, atmosphere.AtmosphereRadius * 2.0f / MyRenderAtmosphere.ATMOSPHERE_SCALE);
                effectAtmosphere.SetProjectionMatrix(ref optProjection);
            }
        }
        public override void SetupEntity(MyEffectBase shader, MyRender.MyRenderElement renderElement)
        {
            MyEffectVoxelsDebris effectVoxelsDebris = (MyEffectVoxelsDebris)shader;

            MyRenderVoxelDebris voxelDebris = renderElement.RenderObject as MyRenderVoxelDebris;

            //  Random texture coord scale and per-object random texture coord offset
            effectVoxelsDebris.SetTextureCoordRandomPositionOffset(voxelDebris.TextureCoordOffset);
            effectVoxelsDebris.SetTextureCoordScale(voxelDebris.TextureCoordScale);
            effectVoxelsDebris.SetDiffuseTextureColorMultiplier(voxelDebris.TextureColorMultiplier);

            Matrix m = (Matrix)renderElement.WorldMatrixForDraw;

            effectVoxelsDebris.SetViewWorldScaleMatrix(m * MyRenderCamera.ViewMatrixAtZero);

            effectVoxelsDebris.SetWorldMatrix(ref m);
            effectVoxelsDebris.SetDiffuseColor(Vector3.One);
            effectVoxelsDebris.SetEmissivity(0);

            effectVoxelsDebris.UpdateVoxelTextures(voxelDebris.VoxelMaterialIndex);
        }
        private void SetupRenderElements(MyModel model, Matrix worldMatrix, int materialIndex = 0, bool staticAsteroid = false)
        {              
            model.LoadInDraw();

            var meshList = model.GetMeshList();
            foreach (MyMesh mesh in meshList)
            {
                if (materialIndex > mesh.Materials.Length - 1)
                    materialIndex = 0;

                var material = staticAsteroid ? MyVoxelMaterials.GetMaterialForMesh(FakeEntity.VoxelMaterial) : mesh.Materials[materialIndex];

                material.PreloadTexture(Managers.LoadingMode.Immediate);

                if (material.DrawTechnique == MyMeshDrawTechnique.DECAL)
                    continue;

                if (staticAsteroid && material.DrawTechnique == MyMeshDrawTechnique.MESH)
                {
                    material.DrawTechnique = MyMeshDrawTechnique.VOXELS_STATIC_ASTEROID;
                }

                //Do not use render alocator, it will reuse elements
                MyRender.MyRenderElement renderElement = new MyRender.MyRenderElement();
                //MyRender.AllocateRenderElement(out renderElement);

                renderElement.Entity = FakeEntity;

                renderElement.VertexBuffer = model.VertexBuffer;
                renderElement.IndexBuffer = model.IndexBuffer;
                renderElement.IndexStart = mesh.IndexStart;
                renderElement.TriCount = mesh.TriCount;

                //renderElement.UseChannels = false;

                renderElement.WorldMatrixForDraw = worldMatrix;
                renderElement.WorldMatrix = worldMatrix;

                renderElement.Material = material;
                renderElement.DrawTechnique = material.DrawTechnique;
                renderElement.VoxelBatch = null;

                if (material.DrawTechnique == MyMeshDrawTechnique.HOLO)
                    m_setup.TransparentRenderElementsToDraw.Add(renderElement);
                else
                    m_setup.RenderElementsToDraw.Add(renderElement);
            }      
        }
        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();
        }
 public override void SetupEntity(MyEffectBase shader, MyRender.MyRenderElement renderElement)
 {
     MyDrawTechniqueVoxelSingle.SetupVoxelEntity(m_currentLod, shader, renderElement);
 }
示例#15
0
 public abstract void SetupEntity(MyEffectBase shader, MyRender.MyRenderElement renderElement);
示例#16
0
 public override void SetupEntity(MyEffectBase shader, MyRender.MyRenderElement renderElement)
 {
     SetupVoxelEntity(m_currentLod, shader, renderElement);
 }