public static void CollectRenderElements(List<MyRenderElement> renderElements, List<MyRenderElement> transparentRenderElements, MyEntity entity, MyModel model, bool collectTransparentElements) { // MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("LoadInDraw"); if (model.LoadState == LoadState.Unloaded) { //model.LoadInDraw(LoadingMode.Background); model.LoadInDraw(LoadingMode.Immediate); return; } if (model.LoadState == LoadState.Loading) return; // MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); var drawMatrix = entity.GetWorldMatrixForDraw(); int meshCount = model.GetMeshList().Count; for (int i = 0; i < meshCount; i++) { MyMesh mesh = model.GetMeshList()[i]; // MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().StartProfilingBlock("Add render element"); //if (mesh.Materials[entity.MaterialIndex].DrawTechnique == MyMeshDrawTechnique.DECAL || // mesh.Materials[entity.MaterialIndex].DrawTechnique == MyMeshDrawTechnique.HOLO) // continue; MyMeshMaterial material = entity.GetMaterial(mesh); bool createElement = true; if (createElement) { MyRenderElement renderElement; AllocateRenderElement(out renderElement); //renderElement.DebugName = entity.Name; renderElement.Entity = entity; renderElement.VertexBuffer = model.VertexBuffer; renderElement.IndexBuffer = model.IndexBuffer; renderElement.VertexCount = model.GetVerticesCount(); renderElement.VertexDeclaration = model.GetVertexDeclaration(); renderElement.VertexStride = model.GetVertexStride(); renderElement.IndexStart = mesh.IndexStart; renderElement.TriCount = mesh.TriCount; //renderElement.UseChannels = model.UseChannels; //renderElement.MaskTexture = model.MaskTexture; renderElement.WorldMatrixForDraw = drawMatrix; renderElement.WorldMatrix = entity.WorldMatrix; renderElement.Material = material; renderElement.DrawTechnique = material.DrawTechnique; renderElement.VoxelBatch = null; 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 (collectTransparentElements) transparentRenderElements.Add(renderElement); } else { renderElements.Add(renderElement); } } //MinerWars.AppCode.Game.Render.MyRender.GetRenderProfiler().EndProfilingBlock(); } }
public MyIntersectionResultLineTriangleEx? GetIntersectionInNearSpace(MyEntity entity, ref MyLine worldLine, bool convertLine) { if (!entity.IsVisible()) return null; MyLine line = worldLine; if (convertLine) { ConvertLineToNearWorldCoordinates(ref line); } Matrix drawMatrix = entity.GetWorldMatrixForDraw(); drawMatrix.Translation += MyCamera.Position; Matrix worldInv = Matrix.Invert(drawMatrix); MyIntersectionResultLineTriangleEx? ret = entity.ModelLod0.GetTrianglePruningStructure().GetIntersectionWithLine(entity, ref line, ref worldInv, IntersectionFlags.ALL_TRIANGLES); if (ret == null) { foreach (MyEntity child in entity.Children) { if (!child.IsVisible()) continue; drawMatrix = child.GetWorldMatrixForDraw(); drawMatrix.Translation += MyCamera.Position; worldInv = Matrix.Invert(drawMatrix); System.Diagnostics.Debug.Assert(!float.IsNaN(worldInv.M11)); ret = child.ModelLod0.GetTrianglePruningStructure().GetIntersectionWithLine(child, ref line, ref worldInv, IntersectionFlags.ALL_TRIANGLES); if (ret != null) return ret; } } return ret; }