Exemplo n.º 1
0
        public static void DrawCollisions(Stopwatch timeSinceSelected)
        {
            Color color;

            GL.LineWidth(4);
            Matrix4 transform = Matrix4.Identity;

            foreach (Collision c in Runtime.TargetLVD.collisions)
            {
                bool  colSelected = (Runtime.LVDSelection == c);
                float addX = 0, addY = 0, addZ = 0;
                if (c.useStartPos)
                {
                    addX = c.startPos[0];
                    addY = c.startPos[1];
                    addZ = c.startPos[2];
                }
                if (c.flag2)
                {
                    //Flag2 == rigged collision
                    ModelContainer riggedModel = null;
                    Bone           riggedBone  = null;
                    foreach (ModelContainer m in Runtime.ModelContainers)
                    {
                        if (m.name.Equals(c.subname))
                        {
                            riggedModel = m;
                            if (m.vbn != null)
                            {
                                foreach (Bone b in m.vbn.bones)
                                {
                                    if (b.Equals(c.boneName))
                                    {
                                        riggedBone = b;
                                    }
                                }
                            }
                        }
                    }
                    if (riggedModel != null)
                    {
                        if (riggedBone == null && riggedModel.vbn != null && riggedModel.vbn.bones.Count > 0)
                        {
                            riggedBone = riggedModel.vbn.bones[0];
                        }
                        if (riggedBone != null)
                        {
                            transform = riggedBone.invert * riggedBone.transform;
                        }
                    }
                }

                for (int i = 0; i < c.verts.Count - 1; i++)
                {
                    Vector3 v1Pos  = Vector3.Transform(new Vector3(c.verts[i].x + addX, c.verts[i].y + addY, addZ + 5), transform);
                    Vector3 v1Neg  = Vector3.Transform(new Vector3(c.verts[i].x + addX, c.verts[i].y + addY, addZ - 5), transform);
                    Vector3 v1Zero = Vector3.Transform(new Vector3(c.verts[i].x + addX, c.verts[i].y + addY, addZ), transform);
                    Vector3 v2Pos  = Vector3.Transform(new Vector3(c.verts[i + 1].x + addX, c.verts[i + 1].y + addY, addZ + 5), transform);
                    Vector3 v2Neg  = Vector3.Transform(new Vector3(c.verts[i + 1].x + addX, c.verts[i + 1].y + addY, addZ - 5), transform);
                    Vector3 v2Zero = Vector3.Transform(new Vector3(c.verts[i + 1].x + addX, c.verts[i + 1].y + addY, addZ), transform);

                    GL.Begin(PrimitiveType.Quads);
                    if (c.normals.Count > i)
                    {
                        if (Runtime.renderCollisionNormals)
                        {
                            Vector3 v = Vector3.Add(Vector3.Divide(Vector3.Subtract(v1Zero, v2Zero), 2), v2Zero);
                            GL.End();
                            GL.Begin(PrimitiveType.Lines);
                            GL.Color3(Color.Blue);
                            GL.Vertex3(v);
                            GL.Vertex3(v.X + (c.normals[i].x * 5), v.Y + (c.normals[i].y * 5), v.Z);
                            GL.End();
                            GL.Begin(PrimitiveType.Quads);
                        }

                        if (c.flag4)
                        {
                            color = Color.FromArgb(128, Color.Yellow);
                        }
                        else if (c.materials[i].getFlag(4) && Math.Abs(c.normals[i].x) > Math.Abs(c.normals[i].y))
                        {
                            color = Color.FromArgb(128, Color.Purple);
                        }
                        else if (Math.Abs(c.normals[i].x) > Math.Abs(c.normals[i].y))
                        {
                            color = Color.FromArgb(128, Color.Lime);
                        }
                        else if (c.normals[i].y < 0)
                        {
                            color = Color.FromArgb(128, Color.Red);
                        }
                        else
                        {
                            color = Color.FromArgb(128, Color.Cyan);
                        }

                        if ((colSelected || Runtime.LVDSelection == c.normals[i]) && ((int)((timeSinceSelected.ElapsedMilliseconds % 1000) / 500) == 0))
                        {
                            color = ColorTools.invertColor(color);
                        }

                        GL.Color4(color);
                    }
                    else
                    {
                        GL.Color4(Color.FromArgb(128, Color.Gray));
                    }
                    GL.Vertex3(v1Pos);
                    GL.Vertex3(v1Neg);
                    GL.Vertex3(v2Neg);
                    GL.Vertex3(v2Pos);
                    GL.End();

                    GL.Begin(PrimitiveType.Lines);
                    if (c.materials.Count > i)
                    {
                        if (c.materials[i].getFlag(6) || (i > 0 && c.materials[i - 1].getFlag(7)))
                        {
                            color = Color.Purple;
                        }
                        else
                        {
                            color = Color.Orange;
                        }

                        if ((colSelected || Runtime.LVDSelection == c.verts[i]) && ((int)((timeSinceSelected.ElapsedMilliseconds % 1000) / 500) == 0))
                        {
                            color = ColorTools.invertColor(color);
                        }
                        GL.Color4(color);
                    }
                    else
                    {
                        GL.Color4(Color.Gray);
                    }
                    GL.Vertex3(v1Pos);
                    GL.Vertex3(v1Neg);

                    if (i == c.verts.Count - 2)
                    {
                        if (c.materials.Count > i)
                        {
                            if (c.materials[i].getFlag(7))
                            {
                                color = Color.Purple;
                            }
                            else
                            {
                                color = Color.Orange;
                            }

                            if (Runtime.LVDSelection == c.verts[i + 1] && ((int)((timeSinceSelected.ElapsedMilliseconds % 1000) / 500) == 0))
                            {
                                color = ColorTools.invertColor(color);
                            }
                            GL.Color4(color);
                        }
                        else
                        {
                            GL.Color4(Color.Gray);
                        }
                        GL.Vertex3(v2Pos);
                        GL.Vertex3(v2Neg);
                    }
                    GL.End();
                }
                for (int i = 0; i < c.cliffs.Count; i++)
                {
                    Vector3 pos = c.cliffs[i].useStartPos ? c.cliffs[i].startPos : new Vector3(c.cliffs[i].pos.x, c.cliffs[i].pos.y, 0);

                    GL.Color3(Color.White);
                    GL.Begin(PrimitiveType.Lines);
                    GL.Vertex3(pos[0], pos[1], pos[2] + 10);
                    GL.Vertex3(pos[0], pos[1], pos[2] - 10);
                    GL.End();

                    GL.LineWidth(2);
                    GL.Color3(Color.Blue);
                    GL.Begin(PrimitiveType.Lines);
                    GL.Vertex3(pos);
                    GL.Vertex3(pos[0] + (c.cliffs[i].angle.x * 10), pos[1] + (c.cliffs[i].angle.y * 10), pos[2]);
                    GL.End();

                    GL.LineWidth(4);
                }
            }
        }