Пример #1
0
        private void InitPlane(Vector4 InPlane, Matrix4x4 InMatrix, uint VertexOffset, uint IndexOffset, Color Colour)
        {
            Vector3 Position = InMatrix.Translation;
            Plane   OurPlane = new Plane(InPlane);

            Vector3 ClosestPtOnPlane = Position - PlaneDot(InPlane, Position) * OurPlane.Normal;

            FindBestAxisVectors(OurPlane.Normal, out Vector3 U, out Vector3 V);
            U *= InPlane.W;
            V *= InPlane.W;

            vertices[VertexOffset + 0]          = new VertexLayouts.BasicLayout.Vertex();
            vertices[VertexOffset + 0].Position = ClosestPtOnPlane + U + V;
            vertices[VertexOffset + 0].Colour   = Colour.ToArgb();
            vertices[VertexOffset + 1]          = new VertexLayouts.BasicLayout.Vertex();
            vertices[VertexOffset + 1].Position = ClosestPtOnPlane - U + V;
            vertices[VertexOffset + 1].Colour   = Colour.ToArgb();
            vertices[VertexOffset + 2]          = new VertexLayouts.BasicLayout.Vertex();
            vertices[VertexOffset + 2].Position = ClosestPtOnPlane + U - V;
            vertices[VertexOffset + 2].Colour   = Colour.ToArgb();
            vertices[VertexOffset + 3]          = new VertexLayouts.BasicLayout.Vertex();
            vertices[VertexOffset + 3].Position = ClosestPtOnPlane - U - V;
            vertices[VertexOffset + 3].Colour   = Colour.ToArgb();

            indices[IndexOffset + 0] = (ushort)(VertexOffset + 0); indices[IndexOffset + 1] = (ushort)(VertexOffset + 2); indices[IndexOffset + 2] = (ushort)(VertexOffset + 1);
            indices[IndexOffset + 3] = (ushort)(VertexOffset + 1); indices[IndexOffset + 4] = (ushort)(VertexOffset + 2); indices[IndexOffset + 5] = (ushort)(VertexOffset + 3);
        }
Пример #2
0
        public VertexLayouts.BasicLayout.Vertex[] GetTransformVertices()
        {
            VertexLayouts.BasicLayout.Vertex[] NewVertices = new VertexLayouts.BasicLayout.Vertex[vertices.Length];
            System.Array.Copy(vertices, NewVertices, vertices.Length);

            for (int i = 0; i < NewVertices.Length; i++)
            {
                Vector3 Result = Vector3.Transform(vertices[i].Position, Transform);
                NewVertices[i].Position = new Vector3(Result.X, Result.Y, Result.Z);
            }

            return(NewVertices);
        }
Пример #3
0
        public void UpdateVertices(bool selected = false)
        {
            vertices = new VertexLayouts.BasicLayout.Vertex[points.Length];

            for (int i = 0; i != vertices.Length; i++)
            {
                VertexLayouts.BasicLayout.Vertex vertex = new VertexLayouts.BasicLayout.Vertex();
                vertex.Position = points[i];
                vertex.Colour   = (selected ? SelectedColour : UnselectedColour);
                vertices[i]     = vertex;
            }
            isUpdatedNeeded = true;
        }
Пример #4
0
        public bool Init(BoundingBox bbox)
        {
            BoundingBox = bbox;

            vertices = new VertexLayouts.BasicLayout.Vertex[8];

            Vector3[] corners = bbox.GetCorners();
            for (int i = 0; i < corners.Length; i++)
            {
                vertices[i]          = new VertexLayouts.BasicLayout.Vertex();
                vertices[i].Position = corners[i];
                vertices[i].Colour   = CurrentColour.ToArgb();
            }

            shader = RenderStorageSingleton.Instance.ShaderManager.shaders[1];
            return(true);
        }
Пример #5
0
        public bool Init(BoundingBox bbox)
        {
            BoundingBox = bbox;

            vertices = new VertexLayouts.BasicLayout.Vertex[8];

            Vector3[] corners = bbox.GetCorners();
            for (int i = 0; i < corners.Length; i++)
            {
                vertices[i]          = new VertexLayouts.BasicLayout.Vertex();
                vertices[i].Position = corners[i];
                vertices[i].Colour   = colour.ToArgb();
            }

            indices = new ushort[] {
                0, 1, 1, 2, 2, 3, 3, 0, // Front edges
                4, 5, 5, 6, 6, 7, 7, 4, // Back edges
                0, 4, 1, 5, 2, 6, 3, 7  // Side edges connecting front and back
            };

            shader = RenderStorageSingleton.Instance.ShaderManager.shaders[1];
            return(true);
        }
Пример #6
0
        public void Init(ref Vector3[] points, ResourceTypes.Navigation.LaneProperties lane, ResourceTypes.Navigation.RoadFlags roadFlags)
        {
            vertices = new VertexLayouts.BasicLayout.Vertex[points.Length * 2];
            indices  = new ushort[(vertices.Length - 2) * 3];
            int idx = 0;

            for (int i = 0; i < points.Length; i++)
            {
                if (lane.Flags.HasFlag(ResourceTypes.Navigation.LaneTypes.MainRoad) || (lane.Flags.HasFlag(ResourceTypes.Navigation.LaneTypes.IsHighway)))
                {
                    colour = Color.Blue;
                }
                else if (lane.Flags.HasFlag(ResourceTypes.Navigation.LaneTypes.Parking))
                {
                    colour = Color.Green;
                }
                else if (lane.Flags.HasFlag(ResourceTypes.Navigation.LaneTypes.ExcludeImpassible))
                {
                    colour = Color.FromArgb(255, 128, 26, 0);
                }
                else if (lane.Flags.HasFlag(ResourceTypes.Navigation.LaneTypes.ExcludeImpassible) && lane.Flags.HasFlag(ResourceTypes.Navigation.LaneTypes.BackRoad))
                {
                    colour = Color.FromArgb(255, 128, 51, 230);
                }
                else if (lane.Flags.HasFlag(ResourceTypes.Navigation.LaneTypes.BackRoad))
                {
                    colour = Color.FromArgb(255, 128, 51, 230);
                }

                vertices[idx]          = new VertexLayouts.BasicLayout.Vertex();
                vertices[idx].Position = points[i];
                vertices[idx].Colour   = colour.ToArgb();
                Vector2 forward = Vector2.Zero;

                if (i < points.Length - 1)
                {
                    forward += (new Vector2(points[(i + 1) % points.Length].X, points[(i + 1) % points.Length].Y) - new Vector2(points[i].X, points[i].Y));
                }
                if (i > 0)
                {
                    forward += new Vector2(points[i].X, points[i].Y) - new Vector2(points[(i - 1) % points.Length].X, points[(i - 1) % points.Length].Y);
                }

                forward.Normalize();
                Vector3 left = new Vector3(-forward.Y, forward.X, points[i].Z);
                idx++;
                vertices[idx] = new VertexLayouts.BasicLayout.Vertex();

                float x = 0.0f;
                float y = 0.0f;

                if (roadFlags.HasFlag(ResourceTypes.Navigation.RoadFlags.BackwardDirection))
                {
                    x = (points[i].X - left.X * lane.Width);
                    y = (points[i].Y - left.Y * lane.Width);
                }
                else
                {
                    x = (points[i].X + left.X * lane.Width);
                    y = (points[i].Y + left.Y * lane.Width);
                }

                vertices[idx].Position = new Vector3(x, y, points[i].Z);
                vertices[idx].Colour   = colour.ToArgb();
                points[i] = vertices[idx].Position;

                RenderLine line = new RenderLine();
                line.SetUnselectedColour(Color.Blue);
                line.Init(new Vector3[2] {
                    vertices[idx - 1].Position, vertices[idx].Position
                });
                idx++;

                ushort sIdx       = 0;
                int    indIdx     = 0;
                bool   switcheroo = false;
                while (indIdx < indices.Length)
                {
                    if (switcheroo == false)
                    {
                        indices[indIdx]     = sIdx++;
                        indices[indIdx + 1] = sIdx++;
                        indices[indIdx + 2] = sIdx++;
                        switcheroo          = true;
                    }
                    else
                    {
                        indices[indIdx]     = sIdx--;
                        indices[indIdx + 1] = sIdx--;
                        indices[indIdx + 2] = sIdx--;

                        switcheroo = false;
                    }
                    sIdx    = (ushort)(indices[indIdx + 2] + 1);
                    indIdx += 3;
                }
            }
        }
Пример #7
0
        ////TEMP
        //public void ConvertNavOBJDataToRender(ResourceTypes.Navigation.NAVData.OBJData data)
        //{
        //    SetTransform(new Vector3(), new Matrix33());
        //    Indices = data.indices;
        //    numTriangles = (uint)(data.indices.Length);
        //    Vertices = new VertexLayouts.BasicLayout.Vertex[data.vertices.Length];
        //    for (int i = 0; i < data.vertices.Length; i++)
        //    {
        //        VertexLayouts.BasicLayout.Vertex vertex = new VertexLayouts.BasicLayout.Vertex();
        //        vertex.Position = data.vertices[i].position;
        //        vertex.Colour = new Vector4(1.0f, 0.0f, 0.0f, 1.0f);
        //        Vertices[i] = vertex;
        //    }
        //}

        public void ConvertCollisionToRender(MeshData data)
        {
            DoRender    = true;
            BoundingBox = new RenderBoundingBox();
            BoundingBox.Init(data.BoundingBox);
            BoundingBox.DoRender = false;

            Indices      = data.Indices;
            numTriangles = Convert.ToUInt32(data.Indices.Length * 3);
            Vertices     = new VertexLayouts.BasicLayout.Vertex[data.Vertices.Length];
            materials    = data.Materials;
            for (int i = 0; i != data.Vertices.Length; i++)
            {
                VertexLayouts.BasicLayout.Vertex vertex = new VertexLayouts.BasicLayout.Vertex();
                vertex.Position = data.Vertices[i];
                vertex.Colour   = new Vector4(1.0f);
                Vertices[i]     = vertex;
            }

            int materialIDX = 0;

            for (int i = 0; i != data.Indices.Length; i += 3)
            {
                switch (materials[materialIDX])
                {
                case CollisionMaterials.GrassAndSnow:
                    Vertices[data.Indices[i]].Colour     = new Vector4(0, 0.4f, 0, 1.0f);
                    Vertices[data.Indices[i + 1]].Colour = new Vector4(0, 0.4f, 0, 1.0f);
                    Vertices[data.Indices[i + 2]].Colour = new Vector4(0, 0.4f, 0, 1.0f);
                    break;

                case CollisionMaterials.Water:
                    Vertices[data.Indices[i]].Colour     = new Vector4(0, 0.3f, 0.8f, 1.0f);
                    Vertices[data.Indices[i + 1]].Colour = new Vector4(0, 0.3f, 0.8f, 1.0f);
                    Vertices[data.Indices[i + 2]].Colour = new Vector4(0, 0.3f, 0.8f, 1.0f);
                    break;

                case CollisionMaterials.Gravel:
                case CollisionMaterials.Tarmac:
                case CollisionMaterials.Sidewalk:
                case CollisionMaterials.SidewalkEdge:
                    Vertices[data.Indices[i]].Colour     = new Vector4(0.5f, 0.5f, 0.5f, 1.0f);
                    Vertices[data.Indices[i + 1]].Colour = new Vector4(0.5f, 0.5f, 0.5f, 1.0f);
                    Vertices[data.Indices[i + 2]].Colour = new Vector4(0.5f, 0.5f, 0.5f, 1.0f);
                    break;

                case CollisionMaterials.Mud:
                    Vertices[data.Indices[i]].Colour     = new Vector4(0.4f, 0.2f, 0.0f, 1.0f);
                    Vertices[data.Indices[i + 1]].Colour = new Vector4(0.4f, 0.2f, 0.0f, 1.0f);
                    Vertices[data.Indices[i + 2]].Colour = new Vector4(0.4f, 0.2f, 0.0f, 1.0f);
                    break;

                case CollisionMaterials.PlayerCollision:
                    Vertices[data.Indices[i]].Colour     = new Vector4(1.0f, 1.0f, 1.0f, 1.0f);
                    Vertices[data.Indices[i + 1]].Colour = new Vector4(1.0f, 1.0f, 1.0f, 1.0f);
                    Vertices[data.Indices[i + 2]].Colour = new Vector4(1.0f, 1.0f, 1.0f, 1.0f);
                    break;
                }
                materialIDX++;
            }
        }