private void CreateCopyMeshes(MyRenderModel m)
 {
     m_meshes = m.GetMeshList().Select(s => new MyRenderGroup()
     {
         IndexStart = s.IndexStart, TriangleCount = s.TriCount, Material = s.Material
     }).ToList();
 }
        SharpDX.Direct3D9.VertexDeclaration CreateInstanceDeclaration(MyRenderModel model)
        {
            var modelElements = model.GetVertexDeclaration().Elements;
            List <SharpDX.Direct3D9.VertexElement> elements = new List <SharpDX.Direct3D9.VertexElement>(modelElements.Take(modelElements.Length - 1)); // Remove decl end

            elements.AddList(m_instanceBuffer.VertexElements);
            elements.Add(SharpDX.Direct3D9.VertexElement.VertexDeclarationEnd);
            return(new SharpDX.Direct3D9.VertexDeclaration(MyRender.GraphicsDevice, elements.ToArray()));
        }
 public static void AddRuntimeModel(string name, MyRenderModel model)
 {
     if (m_modelsByAssetName.ContainsKey(name))
     {
         //System.Diagnostics.Debug.Fail(name + " runtime model is already added");
         return;
     }
     m_modelsByAssetName.Add(name, model);
 }
 internal static void LoadModelInDrawInBackground(MyRenderModel model)
 {          /*
             * if (MyFakes.LOAD_MODELS_IMMEDIATELY)
             * {
             * model.LoadInDraw(Managers.LoadingMode.Immediate);
             * }
             * else */
     {
         m_loadingQueue.Enqueue(model);
         m_loadModelEvent.Set();
     }
 }
        public static MyRenderModel GetMaterials(string assetName)
        {
            MyRenderModel model;

            m_modelsByAssetName.TryGetValue(assetName, out model);

            if (model == null)
            {
                model = new MyRenderModel(assetName, MyMeshDrawTechnique.MESH);
            }


            model.LoadMaterials();

            return(model);
        }
        /*
         * //  Lazy-loading and then returning reference to model
         * //  Doesn't load vertex/index shader and doesn't touch GPU. Use it when you need model data - vertex, triangles, octre...
         * public static MyModel GetModelOnlyData(MyModelsEnum modelEnum)
         * {
         * int modelInt = (int)modelEnum;
         * m_models[modelInt].LoadData();
         * return m_models[modelInt];
         * }
         *
         * //  Lazy-loading and then returning reference to model
         * //  Doesn't load vertex/index shader and doesn't touch GPU. Use it when you need model data - vertex, triangles, octre...
         * public static MyModel GetModelOnlyDummies(MyModelsEnum modelEnum)
         * {
         * int modelInt = (int)modelEnum;
         * m_models[modelInt].LoadOnlyDummies();
         * return m_models[modelInt];
         * }
         *
         * public static MyModel GetModelOnlyModelInfo(MyModelsEnum modelEnum)
         * {
         * int modelInt = (int)modelEnum;
         * m_models[modelInt].LoadOnlyModelInfo();
         * return m_models[modelInt];
         * }  */

        public static MyRenderModel GetModel(string assetName)
        {
            MyRenderModel model;

            m_modelsByAssetName.TryGetValue(assetName, out model);

            if (model == null)
            {
                model = new MyRenderModel(assetName, MyMeshDrawTechnique.MESH);
                m_modelsByAssetName.Add(assetName, model);
            }


            model.LoadData();
            model.LoadContent();

            return(model);
        }
        public override void GetRenderElements(MyLodTypeEnum lodTypeEnum, List <MyRender.MyRenderElement> elements, List <MyRender.MyRenderElement> transparentElements)
        {
            if (MyRender.CurrentRenderSetup.CallerID.HasValue && MyRender.CurrentRenderSetup.CallerID.Value == MyRenderCallerEnum.EnvironmentMap && this.EntityDithering > 0)
            {
                return;
            }

            Debug.Assert(m_isDataSet, "Data is not set, have you forgotten to send SetRenderEntityData message?");

            MyRenderModel currentModel = m_lods[0].Model;
            List <MyRenderMeshMaterial> currentMaterials = m_lods[0].MeshMaterials;

            var volume   = WorldVolume;
            var lodIndex = 0;

            if (lodTypeEnum == MyLodTypeEnum.LOD_NEAR)
            {
            }
            else
            if (lodTypeEnum == MyLodTypeEnum.LOD0)
            {
                if (m_lods.Count > 1)
                {
                    var distance = MyUtils.GetSmallestDistanceToSphereAlwaysPositive(ref MyRenderCamera.Position, ref volume);

                    if (distance > MyRenderCamera.FAR_PLANE_DISTANCE)
                    {
                        return;
                    }

                    for (int i = 1; i < m_lods.Count; i++)
                    {
                        var lod = m_lods[i];
                        if (distance < lod.Distance)
                        {
                            break;
                        }

                        currentModel     = lod.Model;
                        currentMaterials = lod.MeshMaterials;
                        lodIndex         = i;
                    }
                }
            }
            else
            {
                return;     //nothing to render in LOD1
            }
            if (currentModel == null)
            {
                return;
            }

            int instanceCount = m_instanceBuffer != null ? m_instanceCount : 1;

            MyRender.ModelTrianglesCountStats += currentModel.GetTrianglesCount() * instanceCount;

            MyPerformanceCounter.PerCameraDrawWrite.EntitiesRendered++;

            CollectRenderElements(elements, transparentElements, currentModel, currentMaterials, lodIndex);
        }
        internal void CollectRenderElements(List <VRageRender.MyRender.MyRenderElement> renderElements, List <VRageRender.MyRender.MyRenderElement> transparentRenderElements, MyRenderModel model, List <MyRenderMeshMaterial> materials, int lodIndex)
        {
            if (model.LoadState == LoadState.Unloaded)
            {
                //model.LoadInDraw(LoadingMode.Background);
                model.LoadInDraw(LoadingMode.Immediate);
                return;
            }
            if (model.LoadState == LoadState.Loading)
            {
                return;
            }

            if (m_instanceBuffer != null && m_instanceCount == 0)
            {
                return;
            }

            var drawMatrix = GetWorldMatrixForDraw();

            int meshCount = model.GetMeshList().Count;

            for (int i = 0; i < meshCount; i++)
            {
                MyRenderMesh mesh = model.GetMeshList()[i];

                MyRenderMeshMaterial material = model.HasSharedMaterials ? mesh.Material : materials[i];

                if (!material.Enabled)
                {
                    continue;
                }

                if (material.DrawTechnique == MyMeshDrawTechnique.GLASS && EntityDithering == 0)
                {
                    m_drawTechnique = MyMeshDrawTechnique.GLASS;
                    continue;
                }

                //Preload needs to be here because of reloadcontent
                material.PreloadTexture(LoadingMode.Background);

                VRageRender.MyRender.MyRenderElement renderElement;
                VRageRender.MyRender.AllocateRenderElement(out renderElement);

                if (!MyRender.IsRenderOverloaded)
                {
                    //renderElement.DebugName = entity.Name;
                    renderElement.RenderObject = this;

                    renderElement.VertexBuffer      = model.VertexBuffer;
                    renderElement.IndexBuffer       = model.IndexBuffer;
                    renderElement.VertexCount       = model.GetVerticesCount();
                    renderElement.VertexDeclaration = model.GetVertexDeclaration();
                    renderElement.VertexStride      = model.GetVertexStride();
                    renderElement.InstanceBuffer    = null;
                    renderElement.BonesUsed         = mesh.BonesUsed;

                    renderElement.IndexStart = mesh.IndexStart;
                    renderElement.TriCount   = mesh.TriCount;

                    renderElement.WorldMatrixForDraw = drawMatrix;
                    renderElement.WorldMatrix        = WorldMatrix;

                    renderElement.Material      = material;
                    renderElement.DrawTechnique = m_drawTechnique == MyMeshDrawTechnique.MESH || m_drawTechnique == MyMeshDrawTechnique.GLASS ? material.DrawTechnique : m_drawTechnique;
                    renderElement.Color         = EntityColor * material.DiffuseColor;
                    renderElement.Dithering     = mesh.GlassDithering == 0 ? EntityDithering : mesh.GlassDithering;
                    renderElement.ColorMaskHSV  = EntityColorMaskHSV;

                    if (m_instanceBuffer != null)
                    {
                        renderElement.VertexStride      = m_lods[lodIndex].VertexStride;
                        renderElement.VertexDeclaration = m_lods[lodIndex].VertexDeclaration;
                        renderElement.InstanceBuffer    = m_instanceBuffer.InstanceBuffer;
                        renderElement.InstanceStart     = m_instanceStart;
                        renderElement.InstanceCount     = m_instanceCount;
                        renderElement.InstanceStride    = m_instanceBuffer.Stride;

                        if (m_instanceBuffer.Type == MyRenderInstanceBufferType.Generic)
                        {
                            renderElement.DrawTechnique = renderElement.DrawTechnique == MyMeshDrawTechnique.ALPHA_MASKED ? MyMeshDrawTechnique.MESH_INSTANCED_GENERIC_MASKED : MyMeshDrawTechnique.MESH_INSTANCED_GENERIC;
                        }
                        else
                        {
                            renderElement.DrawTechnique = model.BoneIndices.Length > 0 ? MyMeshDrawTechnique.MESH_INSTANCED_SKINNED : MyMeshDrawTechnique.MESH_INSTANCED;
                        }
                    }

                    Debug.Assert(renderElement.VertexBuffer != null, "Vertex buffer cannot be null!");
                    Debug.Assert(renderElement.IndexBuffer != null, "Index buffer cannot be null!");

                    if (material.DrawTechnique == MyMeshDrawTechnique.HOLO)
                    {
                        if (transparentRenderElements != null)
                        {
                            transparentRenderElements.Add(renderElement);
                        }
                    }
                    else
                    {
                        renderElements.Add(renderElement);
                    }
                }
            }
        }
        public static void Draw()
        {
            if (!Visible)
            {
                return;
            }

            MyRenderModel model = MyRenderModels.GetModel(Model);//MySession.Static.PlayerShip.CockpitGlassModelEnum);

            RasterizerState.CullNone.Apply();

            MyStateObjects.DepthStencil_StencilReadOnly.Apply();

            BlendState.NonPremultiplied.Apply();

            MyEffectCockpitGlass effect = (MyEffectCockpitGlass)MyRender.GetEffect(MyEffects.CockpitGlass);

            effect.SetGlassDirtLevelAlpha(new Vector4(GlassDirtAlpha, 0, 0, 0));

            var     inMatrix = PlayerHeadForCockpitInteriorWorldMatrix;
            MatrixD drawMatrix;

            MatrixD.Multiply(ref inMatrix, ref MyRenderCamera.InversePositionTranslationMatrix, out drawMatrix);

            effect.SetWorldMatrix((Matrix)drawMatrix);
            effect.SetViewMatrix((Matrix)MyRenderCamera.ViewMatrix);

            Matrix projection = MyRenderCamera.ProjectionMatrixForNearObjects;

            effect.SetWorldViewProjectionMatrix((Matrix)(drawMatrix * MyRenderCamera.ViewMatrixAtZero * projection));

            MyRenderMeshMaterial cockpitMaterial = model.GetMeshList()[0].Material;

            cockpitMaterial.PreloadTexture();
            effect.SetCockpitGlassTexture(cockpitMaterial.DiffuseTexture);

            Texture depthRT = MyRender.GetRenderTarget(MyRenderTargets.Depth);

            effect.SetDepthTexture(depthRT);

            effect.SetHalfPixel(MyUtilsRender9.GetHalfPixel(depthRT.GetLevelDescription(0).Width, depthRT.GetLevelDescription(0).Height));

            Vector4 sunColor = MyRender.Sun.Color;

            effect.SetSunColor(new Vector3(sunColor.X, sunColor.Y, sunColor.Z));

            effect.SetDirectionToSun(-MyRender.Sun.Direction);

            effect.SetAmbientColor(Vector3.Zero);
            effect.SetReflectorPosition((Vector3)((Vector3)MyRenderCamera.Position - 4 * MyRenderCamera.ForwardVector));

            if (MyRender.RenderLightsForDraw.Count > 0)
            {
                effect.SetNearLightColor(MyRender.RenderLightsForDraw[0].Color);
                effect.SetNearLightRange(MyRender.RenderLightsForDraw[0].Range);
            }

            MyRender.GetShadowRenderer().SetupShadowBaseEffect(effect);
            effect.SetShadowBias(0.001f);

            MyLights.UpdateEffect(effect, true);

            effect.Begin();
            model.Render();
            effect.End();

            //MyDebugDraw.DrawSphereWireframe(PlayerHeadForCockpitInteriorWorldMatrix, Vector3.One, 1);
        }