示例#1
0
        private (List <TriangleShape> floors, List <TriangleShape> walls) GetTriShapes(int numSides)
        {
            double dist       = 850;
            double radius     = 300;
            double xOffset    = 1300;
            double zOffset    = 0;
            double angleScale = 256;

            double globalTimerAngle;

            if (Config.Stream != null)
            {
                uint   globalTimer       = Config.Stream.GetUInt32(MiscConfig.GlobalTimerAddress);
                ushort globalTimerUShort = (ushort)(globalTimer % 65536);
                globalTimerAngle = -1 * globalTimerUShort * angleScale;
            }
            else
            {
                globalTimerAngle = 0;
            }

            int    index = numSides - SHAPE_MIN_SIDES;
            double x     = (index % 3) * dist + xOffset;
            double z     = (index / 3) * dist + zOffset;

            return(TriangleUtilities.GetWallFoorTrianglesForShape(numSides, radius, globalTimerAngle, x, z));
        }
示例#2
0
        private void UpdateBasedOnCoordinates(
            uint triAddress, int x1, int y1, int z1, int x2, int y2, int z2, int x3, int y3, int z3)
        {
            if (triAddress == 0)
            {
                return;
            }

            // update norms
            (float normX, float normY, float normZ, float normOffset) =
                TriangleUtilities.GetNorms(x1, y1, z1, x2, y2, z2, x3, y3, z3);
            Config.Stream.SetValue(normX, triAddress + TriangleOffsetsConfig.NormX);
            Config.Stream.SetValue(normY, triAddress + TriangleOffsetsConfig.NormY);
            Config.Stream.SetValue(normZ, triAddress + TriangleOffsetsConfig.NormZ);
            TriangleOffsetsConfig.SetNormalOffset(normOffset, triAddress);

            // update y bounds
            short yMinMinus5 = (short)(MoreMath.Min(y1, y2, y3) - 5);
            short yMaxPlus5  = (short)(MoreMath.Max(y1, y2, y3) + 5);

            Config.Stream.SetValue(yMinMinus5, triAddress + TriangleOffsetsConfig.YMinMinus5);
            Config.Stream.SetValue(yMaxPlus5, triAddress + TriangleOffsetsConfig.YMaxPlus5);

            // update x projection
            bool xProjection = normX <-0.707 || normX> 0.707;

            Config.Stream.SetValue(
                (byte)(xProjection ? TriangleOffsetsConfig.XProjectionMask : 0),
                triAddress + TriangleOffsetsConfig.Flags,
                mask: TriangleOffsetsConfig.XProjectionMask);
        }
示例#3
0
 public MapAllObjectCeilingObject()
     : base()
 {
     _tris = TriangleUtilities.GetObjectTriangles()
             .FindAll(tri => tri.IsCeiling());
     _autoUpdate = true;
 }
示例#4
0
 private void ResetTriangles()
 {
     _triList.Clear();
     _triList.AddRange(TriangleUtilities.GetLevelTriangles()
                       .FindAll(tri => tri.IsWall()));
     _triangleListForm?.RefreshAndSort();
 }
示例#5
0
 private void ResetTriangles()
 {
     _triAddressList.Clear();
     _triAddressList.AddRange(TriangleUtilities.GetLevelTriangles()
                              .FindAll(tri => tri.IsFloor())
                              .ConvertAll(tri => tri.Address));
     _triangleListForm?.RefreshAndSort();
 }
 protected override List <TriangleDataModel> GetTrianglesOfAnyDist()
 {
     if (_autoUpdate)
     {
         return(TriangleUtilities.GetObjectTriangles().FindAll(tri => tri.IsWall()));
     }
     return(null);
 }
示例#7
0
        public void Reset()
        {
            _levelTriAddressList.Clear();
            _levelTriAddressList.AddRange(TriangleUtilities.GetLevelTriangles());

            _objTriAddressList.Clear();
            _objTriAddressList.AddRange(TriangleUtilities.GetObjectTriangles());
        }
 public MapObjectAllObjectCeiling()
     : base()
 {
     _tris = TriangleUtilities.GetObjectTriangles()
             .FindAll(tri => tri.IsCeiling());
     _autoUpdate         = true;
     _useCurrentCellTris = false;
 }
 protected override List <TriangleDataModel> GetUnfilteredTriangles()
 {
     if (_autoUpdate)
     {
         _tris = TriangleUtilities.GetObjectTrianglesForObject(_posAngle.GetObjAddress())
                 .FindAll(tri => tri.IsCeiling());
     }
     return(_tris);
 }
示例#10
0
        public override ContextMenuStrip GetContextMenuStrip()
        {
            if (_contextMenuStrip == null)
            {
                ToolStripMenuItem itemAutoUpdate = new ToolStripMenuItem("Auto Update");
                itemAutoUpdate.Click += (sender, e) =>
                {
                    _autoUpdate            = !_autoUpdate;
                    itemAutoUpdate.Checked = _autoUpdate;
                };
                itemAutoUpdate.Checked = _autoUpdate;

                ToolStripMenuItem itemReset = new ToolStripMenuItem("Reset");
                itemReset.Click += (sender, e) => ResetTriangles();

                ToolStripMenuItem itemRemoveCurrentTri = new ToolStripMenuItem("Remove Current Tri");
                itemRemoveCurrentTri.Click += (sender, e) =>
                {
                    _removeCurrentTri            = !_removeCurrentTri;
                    itemRemoveCurrentTri.Checked = _removeCurrentTri;
                };

                ToolStripMenuItem itemShowTriData = new ToolStripMenuItem("Show Tri Data");
                itemShowTriData.Click += (sender, e) =>
                {
                    List <TriangleDataModel> tris = _triAddressList.ConvertAll(address => TriangleDataModel.Create(address));
                    TriangleUtilities.ShowTriangles(tris);
                };

                ToolStripMenuItem itemOpenForm = new ToolStripMenuItem("Open Form");
                itemOpenForm.Click += (sender, e) =>
                {
                    if (_triangleListForm != null)
                    {
                        return;
                    }
                    _triangleListForm = new TriangleListForm(
                        this, TriangleClassification.Floor, _triAddressList);
                    _triangleListForm.Show();
                };

                _contextMenuStrip = new ContextMenuStrip();
                _contextMenuStrip.Items.Add(itemAutoUpdate);
                _contextMenuStrip.Items.Add(itemReset);
                _contextMenuStrip.Items.Add(itemRemoveCurrentTri);
                _contextMenuStrip.Items.Add(itemShowTriData);
                _contextMenuStrip.Items.Add(itemOpenForm);
                _contextMenuStrip.Items.Add(new ToolStripSeparator());
                GetFloorToolStripMenuItems().ForEach(item => _contextMenuStrip.Items.Add(item));
                _contextMenuStrip.Items.Add(new ToolStripSeparator());
                GetHorizontalTriangleToolStripMenuItems().ForEach(item => _contextMenuStrip.Items.Add(item));
                _contextMenuStrip.Items.Add(new ToolStripSeparator());
                GetTriangleToolStripMenuItems().ForEach(item => _contextMenuStrip.Items.Add(item));
            }

            return(_contextMenuStrip);
        }
 public override void Update()
 {
     if (_autoUpdate)
     {
         _tris.Clear();
         _tris.AddRange(TriangleUtilities.GetObjectTriangles()
                        .FindAll(tri => tri.IsCeiling()));
     }
 }
示例#12
0
 public MapObjectLevelWall()
     : this(TriangleUtilities.GetLevelTriangles()
            .FindAll(tri => tri.IsWall()))
 {
     _removeCurrentTri   = false;
     _triangleListForm   = null;
     _autoUpdate         = true;
     _numLevelTris       = _triList.Count;
     _useCurrentCellTris = false;
 }
示例#13
0
        public MapObjectHitboxTriangle(bool isDefaultInstance)
            : base()
        {
            _isDefaultInstance   = isDefaultInstance;
            _levelTriAddressList = TriangleUtilities.GetLevelTriangles();
            _objTriAddressList   = TriangleUtilities.GetObjectTriangles();

            Size      = 40;
            LineWidth = 0;
        }
        public MapHitboxHackTriangleObject(bool isDefaultInstance)
            : base()
        {
            _isDefaultInstance   = isDefaultInstance;
            _levelTriAddressList = TriangleUtilities.GetLevelTriangles().ConvertAll(tri => tri.Address);
            _objTriAddressList   = TriangleUtilities.GetObjectTriangles().ConvertAll(tri => tri.Address);

            Size         = 40;
            OutlineWidth = 0;
        }
示例#15
0
 public MapLevelFloorObject()
     : base()
 {
     _triAddressList = TriangleUtilities.GetLevelTriangles()
                       .FindAll(tri => tri.IsFloor())
                       .ConvertAll(tri => tri.Address);
     _removeCurrentTri = false;
     _triangleListForm = null;
     _autoUpdate       = true;
     _numLevelTris     = _triAddressList.Count;
 }
示例#16
0
        protected override ContextMenuStrip GetContextMenuStrip(MapTracker targetTracker)
        {
            if (_contextMenuStrip == null)
            {
                itemAutoUpdate         = new ToolStripMenuItem("Auto Update");
                itemAutoUpdate.Click  += (sender, e) => itemAutoUpdate.Checked = !itemAutoUpdate.Checked;
                itemAutoUpdate.Checked = true;

                ToolStripMenuItem itemReset = new ToolStripMenuItem("Reset");
                itemReset.Click += (sender, e) => ResetTriangles();

                ToolStripMenuItem itemRemoveCurrentTri = new ToolStripMenuItem("Remove Current Tri");
                itemRemoveCurrentTri.Click += (sender, e) =>
                {
                    _removeCurrentTri            = !_removeCurrentTri;
                    itemRemoveCurrentTri.Checked = _removeCurrentTri;
                };

                ToolStripMenuItem itemShowTriData = new ToolStripMenuItem("Show Tri Data");
                itemShowTriData.Click += (sender, e) =>
                {
                    TriangleUtilities.ShowTriangles(_tris);
                };

                ToolStripMenuItem itemOpenForm = new ToolStripMenuItem("Open Form");
                itemOpenForm.Click += (sender, e) =>
                {
                    if (_triangleListForm != null)
                    {
                        return;
                    }
                    _triangleListForm = new TriangleListForm(
                        this, TriangleClassification.Floor, _tris.ConvertAll(_ => _.Address));
                    _triangleListForm.Show();
                };

                _contextMenuStrip = new ContextMenuStrip();
                _contextMenuStrip.Items.Add(itemAutoUpdate);
                _contextMenuStrip.Items.Add(itemReset);
                _contextMenuStrip.Items.Add(itemRemoveCurrentTri);
                _contextMenuStrip.Items.Add(itemShowTriData);
                _contextMenuStrip.Items.Add(itemOpenForm);
                _contextMenuStrip.Items.Add(new ToolStripSeparator());
                GetFloorToolStripMenuItems().ForEach(item => _contextMenuStrip.Items.Add(item));
                _contextMenuStrip.Items.Add(new ToolStripSeparator());
                GetHorizontalTriangleToolStripMenuItems(targetTracker).ForEach(item => _contextMenuStrip.Items.Add(item));
                _contextMenuStrip.Items.Add(new ToolStripSeparator());
                GetTriangleToolStripMenuItems().ForEach(item => _contextMenuStrip.Items.Add(item));
            }

            return(_contextMenuStrip);
        }
示例#17
0
 private static List <uint> GetCUpTriangleList()
 {
     return(TriangleUtilities.GetLevelTriangles()
            .FindAll(tri => tri.IsFloor())
            .FindAll(tri =>
     {
         double slopeAccel = tri.SlopeAccel;
         double slopeDecel = 2.0 * tri.SlopeDecelValue;
         double normalH = Math.Sqrt(tri.NormX * tri.NormX + tri.NormZ * tri.NormZ);
         return slopeAccel * normalH > slopeDecel;
     })
            .ConvertAll(tri => tri.Address));
 }
示例#18
0
        public override string GetAnswer()
        {
            const int tripletSum = 1000;

            List <Triangle> triangles = TriangleUtilities.GetRightTrianglesWithPerimeter(tripletSum);

            if (triangles.Count > 0)
            {
                return(triangles[0].SideProduct.ToString());
            }

            return(null);
        }
示例#19
0
        public override void Update()
        {
            int numAllTriangles   = Config.Stream.GetInt(TriangleConfig.TotalTriangleCountAddress);
            int numLevelTriangles = Config.Stream.GetInt(TriangleConfig.LevelTriangleCountAddress);

            if (_levelTriAddressList.Count != numLevelTriangles)
            {
                _levelTriAddressList.Clear();
                _levelTriAddressList.AddRange(TriangleUtilities.GetLevelTriangles());
            }

            _objTriAddressList.Clear();
            _objTriAddressList.AddRange(TriangleUtilities.GetObjectTriangles());
        }
示例#20
0
        void UpdateTriangles()
        {
            List <Vertex> vertices = new List <Vertex>();

            foreach (TriangleDataModel tri in TriangleUtilities.GetAllTriangles())
            {
                Color4 color = Color4.Black;

                switch (ColorMethod)
                {
                case ColorMethodType.WallsFloorsCeilings:
                    switch (tri.Classification)
                    {
                    case TriangleClassification.Wall:
                        color = Color4.LightGreen;
                        break;

                    case TriangleClassification.Floor:
                        color = Color4.LightBlue;
                        break;

                    case TriangleClassification.Ceiling:
                        color = Color4.Pink;
                        break;
                    }

                    var i = (float)(Math.Atan2(tri.NormY, tri.NormX) / Math.PI / 2) * 0.1f - 0.2f;
                    i       += tri.NormY * 0.1f - 0.2f;
                    color.R += i;
                    color.B += i;
                    color.G += i;
                    break;

                case ColorMethodType.RGBXYZNormalComponents:
                    color = new Color4(Math.Abs(tri.NormX), Math.Abs(tri.NormY), Math.Abs(tri.NormZ), 1.0f);
                    break;

                case ColorMethodType.NormalY:
                    color = new Color4(Math.Abs(tri.NormY), Math.Abs(tri.NormY), Math.Abs(tri.NormY), 1.0f);
                    break;
                }


                vertices.Add(new Vertex(new Vector3(tri.X1, tri.Y1, tri.Z1), color));
                vertices.Add(new Vertex(new Vector3(tri.X2, tri.Y2, tri.Z2), color));
                vertices.Add(new Vertex(new Vector3(tri.X3, tri.Y3, tri.Z3), color));
            }

            _triangles.SetTriangles(vertices);
        }
示例#21
0
        private void ResetTriangles()
        {
            _tris.Clear();
            uint currentTriAddress = Config.Stream.GetUInt32(MarioConfig.StructAddress + MarioConfig.WallTriangleOffset);

            foreach (var tri in TriangleUtilities.GetLevelTriangles())
            {
                if (tri.IsFloor() && !(_removeCurrentTri && tri.Address == currentTriAddress))
                {
                    _tris.Add(tri);
                }
            }

            _triangleListForm?.RefreshAndSort();
        }
示例#22
0
        protected override List <TriangleDataModel> GetTrianglesOfAnyDist()
        {
            var lst = new List <TriangleDataModel>();

            foreach (var posAngle in positionAngleProvider())
            {
                var obj = posAngle.GetObjAddress();
                foreach (var tri in TriangleUtilities.GetObjectTrianglesForObject(obj))
                {
                    if (tri.IsFloor())
                    {
                        lst.Add(tri);
                    }
                }
            }
            return(lst);
        }
示例#23
0
        public override string GetAnswer()
        {
            // Iterate through values of p.
            // Find all values of a, b, c where a + b + c = p AND a^2 + b^2 = c^2 (AND a <= b < c)
            const int limit      = 1000;
            int       bestP      = 0;
            int       bestPCount = 0;

            // 3 + 4 + 5 = 12, start there.
            for (int p = limit; p >= 12; --p)
            {
                List <Triangle> triangles = TriangleUtilities.GetRightTrianglesWithPerimeter(p);
                if (triangles.Count > bestPCount)
                {
                    bestP      = p;
                    bestPCount = triangles.Count;
                }
            }

            return(bestP.ToString());
        }
示例#24
0
        private void SwitchLevelModel()
        {
            List <TriangleDataModel> triangleStructs = TriangleUtilities.GetLevelTriangles();

            // Build vertice and triangle list from triangle set
            List <int[]>   triangles    = new List <int[]>();
            List <short[]> vertices     = new List <short[]>();
            List <int>     surfaceTypes = new List <int>();

            triangleStructs.ForEach(t =>
            {
                var vIndex = vertices.Count;
                triangles.Add(new int[] { vIndex, vIndex + 1, vIndex + 2 });
                surfaceTypes.Add(t.SurfaceType);
                vertices.Add(new short[] { t.X1, t.Y1, t.Z1 });
                vertices.Add(new short[] { t.X2, t.Y2, t.Z2 });
                vertices.Add(new short[] { t.X3, t.Y3, t.Z3 });
            });

            _modelView?.ChangeModel(vertices, triangles);

            // Update tables
            dataGridViewVertices.Rows.Clear();
            for (int i = 0; i < vertices.Count; i++)
            {
                short[] v = vertices[i];
                dataGridViewVertices.Rows.Add(i, v[0], v[1], v[2]);
            }
            dataGridViewTriangles.Rows.Clear();
            for (int i = 0; i < triangles.Count; i++)
            {
                int[] t = triangles[i];
                dataGridViewTriangles.Rows.Add(0, surfaceTypes[i], t[0], t[1], t[2]);
            }
            dataGridViewTriangles.SelectAll();

            ModelObjectAddress = _previousModelPointer = 0;
        }
示例#25
0
        public TriangleShape(
            double x1,
            double y1,
            double z1,
            double x2,
            double y2,
            double z2,
            double x3,
            double y3,
            double z3)
        {
            X1 = x1;
            Y1 = y1;
            Z1 = z1;
            X2 = x2;
            Y2 = y2;
            Z2 = z2;
            X3 = x3;
            Y3 = y3;
            Z3 = z3;

            (NormX, NormY, NormZ, NormOffset) = TriangleUtilities.GetNorms((int)X1, (int)Y1, (int)Z1, (int)X2, (int)Y2, (int)Z2, (int)X3, (int)Y3, (int)Z3);
        }
示例#26
0
        private void UpdateBasedOnCoordinates(
            uint triAddress, int x1, int y1, int z1, int x2, int y2, int z2, int x3, int y3, int z3)
        {
            if (triAddress == 0)
            {
                return;
            }

            // update norms
            (float normX, float normY, float normZ, float normOffset) =
                TriangleUtilities.GetNorms(x1, y1, z1, x2, y2, z2, x3, y3, z3);
            Config.Stream.SetValue(normX, triAddress + TriangleOffsetsConfig.NormX);
            Config.Stream.SetValue(normY, triAddress + TriangleOffsetsConfig.NormY);
            Config.Stream.SetValue(normZ, triAddress + TriangleOffsetsConfig.NormZ);
            Config.Stream.SetValue(normOffset, triAddress + TriangleOffsetsConfig.NormOffset);

            // update y bounds
            short yMinMinus5 = (short)(MoreMath.Min(y1, y2, y3) - 5);
            short yMaxPlus5  = (short)(MoreMath.Max(y1, y2, y3) + 5);

            Config.Stream.SetValue(yMinMinus5, triAddress + TriangleOffsetsConfig.YMinMinus5);
            Config.Stream.SetValue(yMaxPlus5, triAddress + TriangleOffsetsConfig.YMaxPlus5);
        }
示例#27
0
 protected override List <TriangleDataModel> GetUnfilteredTriangles()
 {
     return(TriangleUtilities.GetObjectTrianglesForObject(_objAddress)
            .FindAll(tri => tri.IsCeiling()));
 }
示例#28
0
        public void UpdateFromMarioTab()
        {
            // Get Mario position and rotation
            float  x           = Config.Stream.GetSingle(MarioConfig.StructAddress + MarioConfig.XOffset);
            float  y           = Config.Stream.GetSingle(MarioConfig.StructAddress + MarioConfig.YOffset);
            float  z           = Config.Stream.GetSingle(MarioConfig.StructAddress + MarioConfig.ZOffset);
            ushort marioFacing = Config.Stream.GetUInt16(MarioConfig.StructAddress + MarioConfig.FacingYawOffset);
            float  rot         = (float)MoreMath.AngleUnitsToDegrees(marioFacing);

            // Update Mario map object
            MarioMapObject.X        = x;
            MarioMapObject.Y        = y;
            MarioMapObject.Z        = z;
            MarioMapObject.Rotation = rot;
            MarioMapObject.Show     = true;

            // Get holp position
            float holpX = Config.Stream.GetSingle(MarioConfig.StructAddress + MarioConfig.HolpXOffset);
            float holpY = Config.Stream.GetSingle(MarioConfig.StructAddress + MarioConfig.HolpYOffset);
            float holpZ = Config.Stream.GetSingle(MarioConfig.StructAddress + MarioConfig.HolpZOffset);

            // Update holp map object position
            HolpMapObject.X    = holpX;
            HolpMapObject.Y    = holpY;
            HolpMapObject.Z    = holpZ;
            HolpMapObject.Show = true;

            // Update camera position and rotation
            float  cameraX   = Config.Stream.GetSingle(CameraConfig.StructAddress + CameraConfig.XOffset);
            float  cameraY   = Config.Stream.GetSingle(CameraConfig.StructAddress + CameraConfig.YOffset);
            float  cameraZ   = Config.Stream.GetSingle(CameraConfig.StructAddress + CameraConfig.ZOffset);
            ushort cameraYaw = Config.Stream.GetUInt16(CameraConfig.StructAddress + CameraConfig.FacingYawOffset);
            float  cameraRot = (float)MoreMath.AngleUnitsToDegrees(cameraYaw);

            // Update floor triangle
            UInt32 floorTriangle = Config.Stream.GetUInt32(MarioConfig.StructAddress + MarioConfig.FloorTriangleOffset);

            if (floorTriangle != 0x00)
            {
                Int16 x1 = Config.Stream.GetInt16(floorTriangle + TriangleOffsetsConfig.X1);
                Int16 y1 = Config.Stream.GetInt16(floorTriangle + TriangleOffsetsConfig.Y1);
                Int16 z1 = Config.Stream.GetInt16(floorTriangle + TriangleOffsetsConfig.Z1);
                Int16 x2 = Config.Stream.GetInt16(floorTriangle + TriangleOffsetsConfig.X2);
                Int16 y2 = Config.Stream.GetInt16(floorTriangle + TriangleOffsetsConfig.Y2);
                Int16 z2 = Config.Stream.GetInt16(floorTriangle + TriangleOffsetsConfig.Z2);
                Int16 x3 = Config.Stream.GetInt16(floorTriangle + TriangleOffsetsConfig.X3);
                Int16 y3 = Config.Stream.GetInt16(floorTriangle + TriangleOffsetsConfig.Y3);
                Int16 z3 = Config.Stream.GetInt16(floorTriangle + TriangleOffsetsConfig.Z3);
                FloorTriangleMapObject.X1 = x1;
                FloorTriangleMapObject.Z1 = z1;
                FloorTriangleMapObject.X2 = x2;
                FloorTriangleMapObject.Z2 = z2;
                FloorTriangleMapObject.X3 = x3;
                FloorTriangleMapObject.Z3 = z3;
                FloorTriangleMapObject.Y  = (y1 + y2 + y3) / 3;
            }
            FloorTriangleMapObject.Show = (floorTriangle != 0x00);

            // Update ceiling triangle
            UInt32 ceilingTriangle = Config.Stream.GetUInt32(MarioConfig.StructAddress + MarioConfig.CeilingTriangleOffset);

            if (ceilingTriangle != 0x00)
            {
                Int16 x1 = Config.Stream.GetInt16(ceilingTriangle + TriangleOffsetsConfig.X1);
                Int16 y1 = Config.Stream.GetInt16(ceilingTriangle + TriangleOffsetsConfig.Y1);
                Int16 z1 = Config.Stream.GetInt16(ceilingTriangle + TriangleOffsetsConfig.Z1);
                Int16 x2 = Config.Stream.GetInt16(ceilingTriangle + TriangleOffsetsConfig.X2);
                Int16 y2 = Config.Stream.GetInt16(ceilingTriangle + TriangleOffsetsConfig.Y2);
                Int16 z2 = Config.Stream.GetInt16(ceilingTriangle + TriangleOffsetsConfig.Z2);
                Int16 x3 = Config.Stream.GetInt16(ceilingTriangle + TriangleOffsetsConfig.X3);
                Int16 y3 = Config.Stream.GetInt16(ceilingTriangle + TriangleOffsetsConfig.Y3);
                Int16 z3 = Config.Stream.GetInt16(ceilingTriangle + TriangleOffsetsConfig.Z3);
                CeilingTriangleMapObject.X1 = x1;
                CeilingTriangleMapObject.Z1 = z1;
                CeilingTriangleMapObject.X2 = x2;
                CeilingTriangleMapObject.Z2 = z2;
                CeilingTriangleMapObject.X3 = x3;
                CeilingTriangleMapObject.Z3 = z3;
                CeilingTriangleMapObject.Y  = (y1 + y2 + y3) / 3;
            }
            CeilingTriangleMapObject.Show = (ceilingTriangle != 0x00);

            //List<TriangleDataModel> cogFloorTris = TriangleUtilities.GetObjectTrianglesForObject(0x80341E28)
            List <TriangleDataModel> cogFloorTris = TriangleUtilities.GetTrianglesInRange(0x8016DE30, 20)
                                                    .FindAll(tri => tri.Classification == TriangleClassification.Floor);

            for (int i = 0; i < _cogFloorTris.Count; i++)
            {
                if (i < cogFloorTris.Count)
                {
                    _cogFloorTris[i].Update(cogFloorTris[i]);
                    _cogFloorTris[i].Show = true;
                }
                else
                {
                    _cogFloorTris[i].Show = false;
                }
            }

            //List<TriangleDataModel> cog2FloorTris = TriangleUtilities.GetObjectTrianglesForObject(0x80342088)
            List <TriangleDataModel> cog2FloorTris = TriangleUtilities.GetTrianglesInRange(0x8016E1F0, 20)
                                                     .FindAll(tri => tri.Classification == TriangleClassification.Floor);

            for (int i = 0; i < _cog2FloorTris.Count; i++)
            {
                if (i < cog2FloorTris.Count)
                {
                    _cog2FloorTris[i].Update(cog2FloorTris[i]);
                    _cog2FloorTris[i].Show = true;
                }
                else
                {
                    _cog2FloorTris[i].Show = false;
                }
            }

            List <TriangleShape> cogWallTris = TriangleUtilities.GetWallTriangleHitboxComponents(
                TriangleUtilities.GetObjectTrianglesForObject(0x80341E28)
                .FindAll(tri => tri.Classification == TriangleClassification.Wall));

            for (int i = 0; i < _cogWallTris.Count; i++)
            {
                if (i < cogWallTris.Count)
                {
                    _cogWallTris[i].Update(cogWallTris[i]);
                    _cogWallTris[i].Show = true;
                }
                else
                {
                    _cogWallTris[i].Show = false;
                }
            }

            for (int numSides = SHAPE_MIN_SIDES; numSides <= SHAPE_MAX_SIDSE; numSides++)
            {
                (List <TriangleShape> floors, List <TriangleShape> walls) = GetTriShapes(numSides);
                int index = numSides - SHAPE_MIN_SIDES;
                List <TriangleMap2Object> floorTris = _triObjectFloors[index];
                List <TriangleMap2Object> wallTris  = _triObjectWalls[index];
                for (int i = 0; i < floorTris.Count; i++)
                {
                    floorTris[i].Update(floors[i]);
                    floorTris[i].Show = true;
                }
                for (int i = 0; i < wallTris.Count; i++)
                {
                    wallTris[i].Update(walls[i]);
                    wallTris[i].Show = true;
                }
            }

            // Update intended next position map object position
            float  normY               = floorTriangle == 0 ? 1 : Config.Stream.GetSingle(floorTriangle + TriangleOffsetsConfig.NormY);
            float  hSpeed              = Config.Stream.GetSingle(MarioConfig.StructAddress + MarioConfig.HSpeedOffset);
            float  floorY              = Config.Stream.GetSingle(MarioConfig.StructAddress + MarioConfig.FloorYOffset);
            bool   aboveFloor          = y > floorY + 0.001;
            double multiplier          = aboveFloor ? 1 : normY;
            double defactoSpeed        = hSpeed * multiplier;
            double defactoSpeedQStep   = defactoSpeed * 0.25;
            ushort marioAngle          = Config.Stream.GetUInt16(MarioConfig.StructAddress + MarioConfig.FacingYawOffset);
            ushort marioAngleTruncated = MoreMath.NormalizeAngleTruncated(marioAngle);

            (double xDist, double zDist) = MoreMath.GetComponentsFromVector(defactoSpeedQStep, marioAngleTruncated);
            double intendedNextPositionX = MoreMath.MaybeNegativeModulus(x + xDist, 65536);
            double intendedNextPositionZ = MoreMath.MaybeNegativeModulus(z + zDist, 65536);

            IntendedNextPositionMapObject.X = (float)intendedNextPositionX;
            IntendedNextPositionMapObject.Z = (float)intendedNextPositionZ;
            bool   marioStationary             = x == intendedNextPositionX && z == intendedNextPositionZ;
            double angleToIntendedNextPosition = MoreMath.AngleTo_AngleUnits(x, z, intendedNextPositionX, intendedNextPositionZ);

            IntendedNextPositionMapObject.Rotation =
                marioStationary ? (float)MoreMath.AngleUnitsToDegrees(marioAngle) : (float)MoreMath.AngleUnitsToDegrees(angleToIntendedNextPosition);
            IntendedNextPositionMapObject.Rotation = rot;

            // Update camera map object position
            CameraMapObject.X        = cameraX;
            CameraMapObject.Y        = cameraY;
            CameraMapObject.Z        = cameraZ;
            CameraMapObject.Rotation = cameraRot;
        }
示例#29
0
        public TriangleStruct(uint triangleAddress)
        {
            Address = triangleAddress;

            SurfaceType        = Config.Stream.GetUInt16(triangleAddress + TriangleOffsetsConfig.SurfaceType);
            ExertionForceIndex = Config.Stream.GetByte(triangleAddress + TriangleOffsetsConfig.ExertionForceIndex);
            ExertionAngle      = Config.Stream.GetByte(triangleAddress + TriangleOffsetsConfig.ExertionAngle);
            Flags = Config.Stream.GetByte(triangleAddress + TriangleOffsetsConfig.Flags);
            Room  = Config.Stream.GetByte(triangleAddress + TriangleOffsetsConfig.Room);

            YMin = Config.Stream.GetInt16(triangleAddress + TriangleOffsetsConfig.YMin);
            YMax = Config.Stream.GetInt16(triangleAddress + TriangleOffsetsConfig.YMax);

            X1 = Config.Stream.GetInt16(triangleAddress + TriangleOffsetsConfig.X1);
            Y1 = Config.Stream.GetInt16(triangleAddress + TriangleOffsetsConfig.Y1);
            Z1 = Config.Stream.GetInt16(triangleAddress + TriangleOffsetsConfig.Z1);
            X2 = Config.Stream.GetInt16(triangleAddress + TriangleOffsetsConfig.X2);
            Y2 = Config.Stream.GetInt16(triangleAddress + TriangleOffsetsConfig.Y2);
            Z2 = Config.Stream.GetInt16(triangleAddress + TriangleOffsetsConfig.Z2);
            X3 = Config.Stream.GetInt16(triangleAddress + TriangleOffsetsConfig.X3);
            Y3 = Config.Stream.GetInt16(triangleAddress + TriangleOffsetsConfig.Y3);
            Z3 = Config.Stream.GetInt16(triangleAddress + TriangleOffsetsConfig.Z3);

            NormX      = Config.Stream.GetSingle(triangleAddress + TriangleOffsetsConfig.NormX);
            NormY      = Config.Stream.GetSingle(triangleAddress + TriangleOffsetsConfig.NormY);
            NormZ      = Config.Stream.GetSingle(triangleAddress + TriangleOffsetsConfig.NormZ);
            NormOffset = Config.Stream.GetSingle(triangleAddress + TriangleOffsetsConfig.NormOffset);

            AssociatedObject = Config.Stream.GetUInt32(triangleAddress + TriangleOffsetsConfig.AssociatedObject);

            Classification = TriangleUtilities.CalculateClassification(NormY);

            XProjection     = (Flags & TriangleOffsetsConfig.XProjectionMask) != 0;
            BelongsToObject = (Flags & TriangleOffsetsConfig.BelongsToObjectMask) != 0;
            NoCamCollision  = (Flags & TriangleOffsetsConfig.NoCamCollisionMask) != 0;

            FieldValueList = new List <object> {
                "0x" + Address.ToString("X8"),
                Classification,
                SurfaceType,
                ExertionForceIndex,
                ExertionAngle,
                "0x" + Flags.ToString("X2"),
                XProjection,
                BelongsToObject,
                NoCamCollision,
                Room,
                YMin,
                YMax,
                X1,
                Y1,
                Z1,
                X2,
                Y2,
                Z2,
                X3,
                Y3,
                Z3,
                NormX,
                NormY,
                NormZ,
                NormOffset,
                "0x" + AssociatedObject.ToString("X8"),
            };
        }
示例#30
0
        public TriangleManager(Control tabControl, string varFilePath, WatchVariableFlowLayoutPanel watchVariablePanel)
            : base(varFilePath, watchVariablePanel, ALL_VAR_GROUPS, VISIBLE_VAR_GROUPS)
        {
            _recordedTriangleAddresses = new List <uint>();

            SplitContainer splitContainerTriangles = tabControl.Controls["splitContainerTriangles"] as SplitContainer;

            _addressBox = splitContainerTriangles.Panel1.Controls["textBoxCustomTriangle"] as BetterTextbox;
            _useMisalignmentOffsetCheckbox = splitContainerTriangles.Panel1.Controls["checkBoxVertexMisalignment"] as CheckBox;

            _addressBox.AddEnterAction(() => AddressBoxEnter());

            _radioButtonTriFloor          = splitContainerTriangles.Panel1.Controls["radioButtonTriFloor"] as RadioButton;
            _radioButtonTriFloor.Click   += (sender, e) => Mode_Click(sender, e, TriangleMode.Floor);
            _radioButtonTriWall           = splitContainerTriangles.Panel1.Controls["radioButtonTriWall"] as RadioButton;
            _radioButtonTriWall.Click    += (sender, e) => Mode_Click(sender, e, TriangleMode.Wall);
            _radioButtonTriCeiling        = splitContainerTriangles.Panel1.Controls["radioButtonTriCeiling"] as RadioButton;
            _radioButtonTriCeiling.Click += (sender, e) => Mode_Click(sender, e, TriangleMode.Ceiling);
            _radioButtonTriCustom         = splitContainerTriangles.Panel1.Controls["radioButtonTriCustom"] as RadioButton;
            _radioButtonTriCustom.Click  += (sender, e) => Mode_Click(sender, e, TriangleMode.Custom);

            ControlUtilities.AddContextMenuStripFunctions(
                _radioButtonTriCustom,
                new List <string>()
            {
                "Paste Addresses",
            },
                new List <Action>()
            {
                () => EnterCustomText(Clipboard.GetText()),
            });

            Label labelTriangleSelection = splitContainerTriangles.Panel1.Controls["labelTriangleSelection"] as Label;

            ControlUtilities.AddContextMenuStripFunctions(
                labelTriangleSelection,
                new List <string>()
            {
                "Update Based on Coordinates",
                "Paste Triangles",
            },
                new List <Action>()
            {
                () => UpdateBasedOnCoordinates(),
                () => PasteTriangles(),
            });

            (splitContainerTriangles.Panel1.Controls["buttonGotoV1"] as Button).Click
                += (sender, e) => ButtonUtilities.GotoTriangleVertex(TriangleAddresses[0], 1, _useMisalignmentOffsetCheckbox.Checked);
            (splitContainerTriangles.Panel1.Controls["buttonGotoV2"] as Button).Click
                += (sender, e) => ButtonUtilities.GotoTriangleVertex(TriangleAddresses[0], 2, _useMisalignmentOffsetCheckbox.Checked);
            (splitContainerTriangles.Panel1.Controls["buttonGotoV3"] as Button).Click
                += (sender, e) => ButtonUtilities.GotoTriangleVertex(TriangleAddresses[0], 3, _useMisalignmentOffsetCheckbox.Checked);
            (splitContainerTriangles.Panel1.Controls["buttonGotoVClosest"] as Button).Click += (sender, e) =>
                                                                                               ButtonUtilities.GotoTriangleVertexClosest(TriangleAddresses[0], _useMisalignmentOffsetCheckbox.Checked);

            (splitContainerTriangles.Panel1.Controls["buttonRetrieveTriangle"] as Button).Click
                += (sender, e) => ButtonUtilities.RetrieveTriangle(TriangleAddresses);

            Button buttonNeutralizeTriangle = splitContainerTriangles.Panel1.Controls["buttonNeutralizeTriangle"] as Button;

            buttonNeutralizeTriangle.Click += (sender, e) => ButtonUtilities.NeutralizeTriangle(TriangleAddresses);
            ControlUtilities.AddContextMenuStripFunctions(
                buttonNeutralizeTriangle,
                new List <string>()
            {
                "Neutralize", "Neutralize with 0", "Neutralize with 0x15"
            },
                new List <Action>()
            {
                () => ButtonUtilities.NeutralizeTriangle(TriangleAddresses),
                () => ButtonUtilities.NeutralizeTriangle(TriangleAddresses, false),
                () => ButtonUtilities.NeutralizeTriangle(TriangleAddresses, true),
            });

            Button buttonAnnihilateTriangle = splitContainerTriangles.Panel1.Controls["buttonAnnihilateTriangle"] as Button;

            buttonAnnihilateTriangle.Click += (sender, e) => ButtonUtilities.AnnihilateTriangle(TriangleAddresses);
            ControlUtilities.AddContextMenuStripFunctions(
                buttonAnnihilateTriangle,
                new List <string>()
            {
                "Annihilate All Tri But Death Barriers",
                "Annihilate All Ceilings",
            },
                new List <Action>()
            {
                () => TriangleUtilities.AnnihilateAllTrianglesButDeathBarriers(),
                () => TriangleUtilities.AnnihilateAllCeilings(),
            });

            var trianglePosGroupBox = splitContainerTriangles.Panel1.Controls["groupBoxTrianglePos"] as GroupBox;

            ControlUtilities.InitializeThreeDimensionController(
                CoordinateSystem.Euler,
                true,
                trianglePosGroupBox,
                trianglePosGroupBox.Controls["buttonTrianglePosXn"] as Button,
                trianglePosGroupBox.Controls["buttonTrianglePosXp"] as Button,
                trianglePosGroupBox.Controls["buttonTrianglePosZn"] as Button,
                trianglePosGroupBox.Controls["buttonTrianglePosZp"] as Button,
                trianglePosGroupBox.Controls["buttonTrianglePosXnZn"] as Button,
                trianglePosGroupBox.Controls["buttonTrianglePosXnZp"] as Button,
                trianglePosGroupBox.Controls["buttonTrianglePosXpZn"] as Button,
                trianglePosGroupBox.Controls["buttonTrianglePosXpZp"] as Button,
                trianglePosGroupBox.Controls["buttonTrianglePosYp"] as Button,
                trianglePosGroupBox.Controls["buttonTrianglePosYn"] as Button,
                trianglePosGroupBox.Controls["textBoxTrianglePosXZ"] as TextBox,
                trianglePosGroupBox.Controls["textBoxTrianglePosY"] as TextBox,
                trianglePosGroupBox.Controls["checkBoxTrianglePosRelative"] as CheckBox,
                (float hOffset, float vOffset, float nOffset, bool useRelative) =>
            {
                ButtonUtilities.MoveTriangle(
                    TriangleAddresses,
                    hOffset,
                    nOffset,
                    -1 * vOffset,
                    useRelative);
            });

            var triangleNormalGroupBox = splitContainerTriangles.Panel1.Controls["groupBoxTriangleNormal"] as GroupBox;

            ControlUtilities.InitializeScalarController(
                triangleNormalGroupBox.Controls["buttontriangleNormalN"] as Button,
                triangleNormalGroupBox.Controls["buttontriangleNormalP"] as Button,
                triangleNormalGroupBox.Controls["textBoxTriangleNormal"] as TextBox,
                (float normalValue) =>
            {
                ButtonUtilities.MoveTriangleNormal(TriangleAddresses, normalValue);
            });

            _checkBoxNeutralizeTriangle = splitContainerTriangles.Panel1.Controls["checkBoxNeutralizeTriangle"] as CheckBox;

            (splitContainerTriangles.Panel1.Controls["buttonTriangleShowCoords"] as Button).Click
                += (sender, e) => ShowTriangleCoordinates();
            (splitContainerTriangles.Panel1.Controls["buttonTriangleShowEquation"] as Button).Click
                += (sender, e) => ShowTriangleEquation();

            _recordTriangleDataCheckbox = splitContainerTriangles.Panel1.Controls["checkBoxRecordTriangleData"] as CheckBox;
            _recordTriangleCountLabel   = splitContainerTriangles.Panel1.Controls["labelRecordTriangleCount"] as Label;

            (splitContainerTriangles.Panel1.Controls["buttonTriangleShowData"] as Button).Click
                += (sender, e) => ShowTriangleData();
            (splitContainerTriangles.Panel1.Controls["buttonTriangleShowVertices"] as Button).Click
                += (sender, e) => ShowTriangleVertices();
            (splitContainerTriangles.Panel1.Controls["buttonTriangleShowAddresses"] as Button).Click
                += (sender, e) => ShowTriangleAddresses();
            (splitContainerTriangles.Panel1.Controls["buttonTriangleClearData"] as Button).Click
                += (sender, e) => ClearTriangleData();

            _repeatFirstVertexCheckbox = splitContainerTriangles.Panel1.Controls["checkBoxRepeatFirstVertex"] as CheckBox;

            (splitContainerTriangles.Panel1.Controls["buttonTriangleShowLevelTris"] as Button).Click
                += (sender, e) => TriangleUtilities.ShowTriangles(TriangleUtilities.GetLevelTriangles());

            Button buttonTriangleShowObjTris = splitContainerTriangles.Panel1.Controls["buttonTriangleShowObjTris"] as Button;

            buttonTriangleShowObjTris.Click += (sender, e) => TriangleUtilities.ShowTriangles(TriangleUtilities.GetObjectTriangles());
            ControlUtilities.AddContextMenuStripFunctions(
                buttonTriangleShowObjTris,
                new List <string>()
            {
                "Show All Object Tris", "Show Selected Object Tris"
            },
                new List <Action>()
            {
                () => TriangleUtilities.ShowTriangles(TriangleUtilities.GetObjectTriangles()),
                () => TriangleUtilities.ShowTriangles(TriangleUtilities.GetSelectedObjectTriangles()),
            });

            (splitContainerTriangles.Panel1.Controls["buttonTriangleShowAllTris"] as Button).Click
                += (sender, e) => TriangleUtilities.ShowTriangles(TriangleUtilities.GetAllTriangles());

            var buttonTriangleNeutralizeAllTriangles = splitContainerTriangles.Panel1.Controls["buttonTriangleNeutralizeAllTriangles"] as Button;

            buttonTriangleNeutralizeAllTriangles.Click += (sender, e) => TriangleUtilities.NeutralizeTriangles();

            ControlUtilities.AddContextMenuStripFunctions(
                buttonTriangleNeutralizeAllTriangles,
                new List <string>()
            {
                "Neutralize All Triangles",
                "Neutralize Wall Triangles",
                "Neutralize Floor Triangles",
                "Neutralize Ceiling Triangles",
                "Neutralize Death Barriers",
                "Neutralize Lava",
                "Neutralize Sleeping",
                "Neutralize Loading Zones"
            },
                new List <Action>()
            {
                () => TriangleUtilities.NeutralizeTriangles(),
                () => TriangleUtilities.NeutralizeTriangles(TriangleClassification.Wall),
                () => TriangleUtilities.NeutralizeTriangles(TriangleClassification.Floor),
                () => TriangleUtilities.NeutralizeTriangles(TriangleClassification.Ceiling),
                () => TriangleUtilities.NeutralizeTriangles(0x0A),
                () => TriangleUtilities.NeutralizeTriangles(0x01),
                () => TriangleUtilities.NeutralizeSleeping(),
                () => {
                    TriangleUtilities.NeutralizeTriangles(0x1B);
                    TriangleUtilities.NeutralizeTriangles(0x1C);
                    TriangleUtilities.NeutralizeTriangles(0x1D);
                    TriangleUtilities.NeutralizeTriangles(0x1E);
                },
            });

            var buttonTriangleDisableAllCamCollision = splitContainerTriangles.Panel1.Controls["buttonTriangleDisableAllCamCollision"] as Button;

            buttonTriangleDisableAllCamCollision.Click += (sender, e) => TriangleUtilities.DisableCamCollision();

            ControlUtilities.AddContextMenuStripFunctions(
                buttonTriangleDisableAllCamCollision,
                new List <string>()
            {
                "Disable Cam Collision for All Triangles",
                "Disable Cam Collision for Wall Triangles",
                "Disable Cam Collision for Floor Triangles",
                "Disable Cam Collision for Ceiling Triangles",
            },
                new List <Action>()
            {
                () => TriangleUtilities.DisableCamCollision(),
                () => TriangleUtilities.DisableCamCollision(TriangleClassification.Wall),
                () => TriangleUtilities.DisableCamCollision(TriangleClassification.Floor),
                () => TriangleUtilities.DisableCamCollision(TriangleClassification.Ceiling),
            });

            GroupBox groupBoxTriangleTypeConversion        = splitContainerTriangles.Panel1.Controls["groupBoxTriangleTypeConversion"] as GroupBox;
            ComboBox comboBoxTriangleTypeConversionConvert = groupBoxTriangleTypeConversion.Controls["comboBoxTriangleTypeConversionConvert"] as ComboBox;
            TextBox  textBoxTriangleTypeConversionFromType = groupBoxTriangleTypeConversion.Controls["textBoxTriangleTypeConversionFromType"] as TextBox;
            TextBox  textBoxTriangleTypeConversionToType   = groupBoxTriangleTypeConversion.Controls["textBoxTriangleTypeConversionToType"] as TextBox;
            Button   buttonTriangleTypeConversionConvert   = groupBoxTriangleTypeConversion.Controls["buttonTriangleTypeConversionConvert"] as Button;

            comboBoxTriangleTypeConversionConvert.DataSource = EnumUtilities.GetEnumValues <TriangleClassificationExtended>(typeof(TriangleClassificationExtended));

            buttonTriangleTypeConversionConvert.Click += (sender, e) =>
            {
                TriangleClassificationExtended classification = (TriangleClassificationExtended)comboBoxTriangleTypeConversionConvert.SelectedItem;
                short?fromType = (short?)ParsingUtilities.ParseHexNullable(textBoxTriangleTypeConversionFromType.Text);
                short?toType   = (short?)ParsingUtilities.ParseHexNullable(textBoxTriangleTypeConversionToType.Text);
                if (!fromType.HasValue || !toType.HasValue)
                {
                    return;
                }
                TriangleUtilities.ConvertSurfaceTypes(classification, fromType.Value, toType.Value);
            };
        }