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)); }
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); }
public MapAllObjectCeilingObject() : base() { _tris = TriangleUtilities.GetObjectTriangles() .FindAll(tri => tri.IsCeiling()); _autoUpdate = true; }
private void ResetTriangles() { _triList.Clear(); _triList.AddRange(TriangleUtilities.GetLevelTriangles() .FindAll(tri => tri.IsWall())); _triangleListForm?.RefreshAndSort(); }
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); }
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); }
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())); } }
public MapObjectLevelWall() : this(TriangleUtilities.GetLevelTriangles() .FindAll(tri => tri.IsWall())) { _removeCurrentTri = false; _triangleListForm = null; _autoUpdate = true; _numLevelTris = _triList.Count; _useCurrentCellTris = false; }
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; }
public MapLevelFloorObject() : base() { _triAddressList = TriangleUtilities.GetLevelTriangles() .FindAll(tri => tri.IsFloor()) .ConvertAll(tri => tri.Address); _removeCurrentTri = false; _triangleListForm = null; _autoUpdate = true; _numLevelTris = _triAddressList.Count; }
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); }
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)); }
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); }
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()); }
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); }
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(); }
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); }
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()); }
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; }
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); }
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); }
protected override List <TriangleDataModel> GetUnfilteredTriangles() { return(TriangleUtilities.GetObjectTrianglesForObject(_objAddress) .FindAll(tri => tri.IsCeiling())); }
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; }
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"), }; }
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); }; }