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); }
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); }
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; }
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); }
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); }
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; } } }
////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++; } }