Пример #1
0
        internal MyLodModel AddLOD(float distance, string model)
        {
            try
            {
                MyLodModel lodModel = new MyLodModel();
                if (!string.IsNullOrEmpty(model))
                {
                    lodModel.Model = MyRenderModels.GetModel(model);
                    if (lodModel.Model.LoadState == LoadState.Error)
                    {
                        return(null);
                    }

                    lodModel.Model.CloneMaterials(lodModel.MeshMaterials);
                }
                lodModel.Distance = distance;

                m_lods.Add(lodModel);

                return(lodModel);
            }
            catch (Exception e)
            {
                throw new ApplicationException("Error adding lod: " + model + ", distance: " + distance, e);
            }
        }
Пример #2
0
 public void ChangeShadowModels(int lodIndex, string model)
 {
     if (model != null)
     {
         m_lods[lodIndex].ShadowModel = MyRenderModels.GetModel(model);
     }
 }
Пример #3
0
 public void ChangeModels(int lodIndex, string model)
 {
     if (model != null)
     {
         m_lods[lodIndex].Model = MyRenderModels.GetModel(model);
         m_lods[lodIndex].Model.CloneMaterials(m_lods[lodIndex].MeshMaterials);
     }
 }
Пример #4
0
        private void CreateVertexBuffer(List <MyRenderBatchPart> batchParts, int vbSize)
        {
            if (m_vertexBuffer == null || m_vertexBuffer.Description.SizeInBytes < vbSize)
            {
                if (m_vertexBuffer != null)
                {
                    m_vertexBuffer.Dispose();
                }

                m_vertexBuffer = new VertexBuffer(MyRender.GraphicsDevice, vbSize, Usage.WriteOnly, VertexFormat.None, Pool.Default);
            }

            // Transform and copy vertices
            int vbOffset = 0;

            for (int i = 0; i < batchParts.Count; i++)
            {
                var part   = batchParts[i];
                var model  = MyRenderModels.GetModel(part.Model);
                var matrix = part.ModelMatrix;

                var modelVb = model.VertexBuffer.Lock(0, model.GetVBSize, LockFlags.ReadOnly);

                var compoundVb = m_vertexBuffer.Lock(vbOffset, model.GetVBSize, LockFlags.None);

                for (int v = 0; v < model.GetVerticesCount(); v++)
                {
                    var vertexPos = v * model.GetVertexStride();
                    modelVb.Seek(vertexPos, System.IO.SeekOrigin.Begin);

                    var      position       = modelVb.Read <HalfVector4>();
                    Vector3D pos            = (Vector3D)VF_Packer.UnpackPosition(ref position);
                    var      transformedPos = Vector3D.Transform(pos, matrix);
                    m_localAABB = m_localAABB.Include(ref transformedPos);
                    var transformedPos2 = (Vector3)transformedPos;
                    compoundVb.Write <HalfVector4>(VF_Packer.PackPosition(ref transformedPos2));                              // Transform and copy position
                    compoundVb.WriteRange(modelVb.PositionPointer, model.GetVertexStride() - (modelVb.Position - vertexPos)); // Copy rest
                }

                m_vertexBuffer.Unlock();
                model.VertexBuffer.Unlock();
                vbOffset += model.GetVBSize;
            }

            BoundingSphereD.CreateFromBoundingBox(ref m_localAABB, out m_localVolume);
            m_localVolumeOffset = m_localVolume.Center;
            SetDirty();
        }
Пример #5
0
        private static void DrawDebugMessages()
        {
            //DepthStencilState.None.Apply();
            DepthStencilState.DepthRead.Apply();
            BlendState.NonPremultiplied.Apply();

            while (m_debugDrawMessages.Count > 0)
            {
                IMyRenderMessage debugDrawMessage = m_debugDrawMessages.Dequeue();

                MyRenderMessageEnum messageType = debugDrawMessage.MessageType;

                switch (messageType)
                {
                case MyRenderMessageEnum.DebugDrawLine3D:
                {
                    MyRenderMessageDebugDrawLine3D message = (MyRenderMessageDebugDrawLine3D)debugDrawMessage;

                    MyDebugDraw.DrawLine3D(
                        message.PointFrom,
                        message.PointTo,
                        message.ColorFrom,
                        message.ColorTo,
                        message.DepthRead);

                    break;
                }

                case MyRenderMessageEnum.DebugDrawLine2D:
                {
                    MyRenderMessageDebugDrawLine2D message = (MyRenderMessageDebugDrawLine2D)debugDrawMessage;

                    MyDebugDraw.DrawLine2D(
                        message.PointFrom,
                        message.PointTo,
                        message.ColorFrom,
                        message.ColorTo,
                        message.Projection);

                    break;
                }

                case MyRenderMessageEnum.DebugDrawSphere:
                {
                    MyRenderMessageDebugDrawSphere message = (MyRenderMessageDebugDrawSphere)debugDrawMessage;

                    MyDebugDraw.DrawSphere(
                        message.Position,
                        message.Radius,
                        message.Color,
                        message.Alpha,
                        message.DepthRead,
                        message.Smooth,
                        message.Cull);

                    break;
                }

                case MyRenderMessageEnum.DebugDrawAABB:
                {
                    MyRenderMessageDebugDrawAABB message = (MyRenderMessageDebugDrawAABB)debugDrawMessage;

                    Color color = new Color(message.Color, message.Alpha);
                    var   aabb  = new BoundingBoxD(message.AABB.Min, message.AABB.Max);
                    MyDebugDraw.DrawAABBLine(
                        ref aabb,
                        ref color,
                        message.Scale,
                        message.DepthRead);

                    break;
                }

                case MyRenderMessageEnum.DebugDrawAxis:
                {
                    MyRenderMessageDebugDrawAxis message = (MyRenderMessageDebugDrawAxis)debugDrawMessage;

                    MyDebugDraw.DrawAxis(
                        (MatrixD)message.Matrix,
                        message.AxisLength,
                        1,
                        message.DepthRead);

                    break;
                }

                case MyRenderMessageEnum.DebugDrawOBB:
                {
                    MyRenderMessageDebugDrawOBB message = (MyRenderMessageDebugDrawOBB)debugDrawMessage;

                    if (message.Smooth)
                    {
                        MyDebugDraw.DrawLowresBoxSmooth(
                            message.Matrix,
                            message.Color,
                            message.Alpha,
                            message.DepthRead,
                            message.Cull);
                    }
                    else
                    {
                        MyDebugDraw.DrawOBBLine(
                            new MyOrientedBoundingBoxD(message.Matrix),
                            message.Color,
                            message.Alpha,
                            message.DepthRead);

                        //BoundingBoxD bd = new BoundingBoxD(message.Matrix.Translation - new Vector3(100),message.Matrix.Translation + new Vector3(100));

                        //Vector4 c = new Vector4(message.Color.X, message.Color.Y, message.Color.Z, message.Alpha);
                        //MyDebugDraw.DrawAABBLine(ref bd, ref c, 1, false);
                    }
                    break;
                }

                case MyRenderMessageEnum.DebugDrawCylinder:
                {
                    MyRenderMessageDebugDrawCylinder message = (MyRenderMessageDebugDrawCylinder)debugDrawMessage;

                    if (message.Smooth)
                    {
                        MyDebugDraw.DrawLowresCylinderSmooth(
                            (MatrixD)message.Matrix,
                            message.Color,
                            message.Alpha,
                            message.DepthRead);
                    }
                    else
                    {
                        MyDebugDraw.DrawLowresCylinderWireframe(
                            (MatrixD)message.Matrix,
                            message.Color,
                            message.Alpha,
                            message.DepthRead);
                    }
                    break;
                }

                case MyRenderMessageEnum.DebugDrawTriangle:
                {
                    MyRenderMessageDebugDrawTriangle message = (MyRenderMessageDebugDrawTriangle)debugDrawMessage;

                    MyDebugDraw.DrawTriangle((Vector3D)message.Vertex0, (Vector3D)message.Vertex1, (Vector3D)message.Vertex2, message.Color, message.Color, message.Color, message.Smooth, message.DepthRead);

                    break;
                }

                case MyRenderMessageEnum.DebugDrawTriangles:
                {
                    MyRenderMessageDebugDrawTriangles message = (MyRenderMessageDebugDrawTriangles)debugDrawMessage;

                    MyDebugDraw.DrawTriangles(message.WorldMatrix, message.Vertices, message.Indices, message.Color,
                                              message.DepthRead, message.Shaded);
                    break;
                }

                case MyRenderMessageEnum.DebugDrawCapsule:
                {
                    MyRenderMessageDebugDrawCapsule message = (MyRenderMessageDebugDrawCapsule)debugDrawMessage;

                    if (message.Shaded)
                    {
                        MyDebugDraw.DrawCapsuleShaded(message.P0, message.P1, message.Radius, message.Color, message.DepthRead);
                    }
                    else
                    {
                        MyDebugDraw.DrawCapsule(message.P0, message.P1, message.Radius, message.Color, message.DepthRead);
                    }

                    break;
                }

                case MyRenderMessageEnum.DebugDrawText2D:
                {
                    MyRenderMessageDebugDrawText2D message = (MyRenderMessageDebugDrawText2D)debugDrawMessage;

                    MyDebugDraw.DrawText(
                        message.Coord,
                        new StringBuilder(message.Text),
                        message.Color,
                        message.Scale,
                        false,
                        message.Align);

                    break;
                }

                case MyRenderMessageEnum.DebugDrawText3D:
                {
                    MyRenderMessageDebugDrawText3D message = (MyRenderMessageDebugDrawText3D)debugDrawMessage;

                    MyDebugDraw.DrawText(
                        (Vector3D)message.Coord,
                        new StringBuilder(message.Text),
                        message.Color,
                        message.Scale,
                        message.DepthRead,
                        message.Align,
                        message.CustomViewProjection);

                    break;
                }

                case MyRenderMessageEnum.DebugDrawModel:
                {
                    MyRenderMessageDebugDrawModel message = (MyRenderMessageDebugDrawModel)debugDrawMessage;

                    MyDebugDraw.DrawModel(MyRenderModels.GetModel(message.Model), message.WorldMatrix, message.Color,
                                          message.DepthRead);

                    break;
                }

                case MyRenderMessageEnum.DebugDrawPlane:
                {
                    MyRenderMessageDebugDrawPlane message = (MyRenderMessageDebugDrawPlane)debugDrawMessage;

                    MyDebugDraw.DrawPlane((Vector3D)message.Position, message.Normal, message.Color, message.DepthRead);

                    break;
                }

                default:
                {
                    System.Diagnostics.Debug.Assert(false, "Unknown debug draw message");
                    break;
                }
                }
            }
        }
Пример #6
0
        void UpdateBatch(List <MyRenderBatchPart> batchParts)
        {
            // Clear all lists
            foreach (var pair in m_materialGroups)
            {
                pair.Value.Clear();
            }

            int vbSize        = 0;
            int triangleCount = 0;

            m_vertexCount       = 0;
            m_vertexDeclaration = null;

            if (batchParts.Count == 0)
            {
                return;
            }

            // Add meshes to lists
            for (int i = 0; i < batchParts.Count; i++)
            {
                var part  = batchParts[i];
                var model = MyRenderModels.GetModel(part.Model);
                model.LoadData();

                if (model.LoadState == LoadState.Unloaded)
                {
                    model.LoadInDraw(LoadingMode.Immediate);
                }
                if (model.LoadState == LoadState.Loading)
                {
                    Debug.Fail("Batch model is loading, this should not happen");
                }

                if (m_vertexDeclaration == null)
                {
                    m_vertexStride      = model.GetVertexStride();
                    m_vertexDeclaration = model.GetVertexDeclaration();
                }
                else if (m_vertexDeclaration != model.GetVertexDeclaration())
                {
                    Debug.Fail("Models in batch must have same declaration");
                    continue;
                }

                foreach (var mesh in model.GetMeshList())
                {
                    List <MyRenderMeshInfo> meshList = new List <MyRenderMeshInfo>();
                    if (!m_materialGroups.TryGetValue(mesh.Material, out meshList))
                    {
                        meshList = new List <MyRenderMeshInfo>();
                        m_materialGroups.Add(mesh.Material, meshList);
                    }
                    meshList.Add(new MyRenderMeshInfo()
                    {
                        Model = model, Mesh = mesh, VertexOffset = m_vertexCount
                    });
                }

                vbSize        += model.GetVBSize;
                m_vertexCount += model.GetVerticesCount();
                triangleCount += model.GetTrianglesCount();
            }

            CreateVertexBuffer(batchParts, vbSize);
            CreateIndexBuffer(triangleCount);
        }
Пример #7
0
        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);
        }