/// <summary> /// Returns color of normal /// </summary> /// <param name="c"></param> /// <param name="normals"></param> /// <param name="material"></param> /// <returns></returns> private Color GetNormalColor(LVDCollision c, Vector2 normals, LVDCollisionMaterial material) { float angle = (float)(Math.Atan2(normals.Y, normals.X) * 180 / Math.PI); if (c.PassThrough) { return(Color.FromArgb(128, Color.Yellow)); } else if (material.GetFlag(4) && ((angle <= 0 && angle >= -70) || (angle <= -110 && angle >= -180) || angle == 180)) { return(Color.FromArgb(128, Color.Purple)); } else if ((angle <= 0 && angle >= -70) || (angle <= -110 && angle >= -180) || angle == 180) { return(Color.FromArgb(128, Color.Lime)); } else if (normals.Y < 0) { return(Color.FromArgb(128, Color.Red)); } else { return(Color.FromArgb(128, Color.Cyan)); } }
/// <summary> /// deletes lvdvector2 /// </summary> /// <param name="v"></param> private void DeleteVertex(LVDVector2 v) { LVDCollision remove = null; foreach (var col in LVD.Collisions) { int index = col.Vertices.IndexOf(v); if (index == -1) { continue; } if (index >= 1) { PropertyGrid.SelectedObject = col.Vertices[index - 1]; } if (col.Normals.Count > 0) { if (index == col.Normals.Count) { col.Normals.RemoveAt(index - 1); col.Materials.RemoveAt(index - 1); } else { col.Normals.RemoveAt(index); col.Materials.RemoveAt(index); } } col.Vertices.RemoveAt(index); if (index == col.Vertices.Count) { index--; } if (col.Normals.Count > 0 && index > 0) { col.Normals[index - 1] = LVDVector2.GenerateNormal(col.Vertices[index - 1], col.Vertices[index]); } if (col.Vertices.Count < 2) { remove = col; } break; } // remove collision that is marked for removal if (remove != null) { LVD.Collisions.Remove(remove); RefreshNodes(); } }
/// <summary> /// Renders a collision wall /// </summary> /// <param name="col"></param> /// <param name="p1"></param> /// <param name="p2"></param> /// <param name="mat"></param> /// <param name="normal"></param> private void RenderWall(LVDCollision col, LVDVector2 p1, LVDVector2 p2, LVDCollisionMaterial mat, Vector2 normal) { Vector2 v1 = new Vector2(p1.X, p1.Y); Vector2 v2 = new Vector2(p2.X, p2.Y); Vector2 mid = (v1 + v2) / 2; Vector2 nrm = mid + normal * 3; Vector3 p1Color = GetElementColor(p1); Vector3 p2Color = GetElementColor(p2); if (PropertyGrid.SelectedObject == col) { p1Color = FlashColor; p2Color = FlashColor; } // material var materialColor = GetMatlColor(mat); GL.Color4(materialColor.R / 255f, materialColor.G / 255f, materialColor.B / 255f, 0.75f); GL.Begin(PrimitiveType.Quads); GL.Vertex3(p1.X, p1.Y, 0); GL.Vertex3(p1.X, p1.Y, -PlatformWidth); GL.Vertex3(p2.X, p2.Y, -PlatformWidth); GL.Vertex3(p2.X, p2.Y, 0); GL.End(); GL.LineWidth(2f); GL.Begin(PrimitiveType.Lines); // point line 1 GL.Color3(p1Color); GL.Vertex3(v1.X, v1.Y, 0); GL.Color3(p1Color); GL.Vertex3(v1.X, v1.Y, -PlatformWidth); // point line 2 GL.Color3(p2Color); GL.Vertex3(v2.X, v2.Y, 0); GL.Color3(p2Color); GL.Vertex3(v2.X, v2.Y, -PlatformWidth); // front line GL.Color3(p1Color); GL.Vertex3(v1.X, v1.Y, 0); GL.Color3(p2Color); GL.Vertex3(v2.X, v2.Y, 0); // back line GL.Color3(p1Color); GL.Vertex3(v1.X, v1.Y, -PlatformWidth); GL.Color3(p2Color); GL.Vertex3(v2.X, v2.Y, -PlatformWidth); // normal GL.Color3(GetNormalColor(col, normal, mat)); GL.Vertex3(mid.X, mid.Y, -PlatformWidth / 2); GL.Color3(GetNormalColor(col, normal, mat)); GL.Vertex3(nrm.X, nrm.Y, -PlatformWidth / 2); GL.End(); }