private void RenderFloodFill() { foreach (NavigationNode vec in floodFiller.positions) { Color colorOfSphere = Color.Orange; if (vec == floodFiller.next) { colorOfSphere = Color.Blue; } if (floodFiller.justAdded.Contains(vec)) { colorOfSphere = Color.Red; } if (!vec.done) { DebugShapeRenderer.AddBoundingSphere(new BoundingSphere(vec.WorldPosition, 0.2f), colorOfSphere); } foreach (NavigationNode neighbour in vec.Neighbours) { DebugShapeRenderer.AddLine(vec.WorldPosition, neighbour.WorldPosition, Color.Green); } } }
private void RenderPartition() { foreach (Bucket b in floodFiller.partition.buckets) { DebugShapeRenderer.AddLine(b.bottomLeft, b.topLeft, Color.Aqua); DebugShapeRenderer.AddLine(b.topLeft, b.topRight, Color.Aqua); DebugShapeRenderer.AddLine(b.topRight, b.bottomRight, Color.Aqua); DebugShapeRenderer.AddLine(b.bottomRight, b.bottomLeft, Color.Aqua); } }
public override void Render(GameTime gameTime) { SystemCore.GraphicsDevice.Clear(Color.Black); DebugShapeRenderer.VisualiseAxes(5f); RenderLineDefs(); RenderFloodFill(); RenderPath(); //RenderPartition(); if (playerObj != null) { DoomComponent playerDoomComponent = playerObj.GetComponent <DoomComponent>(); Color forwardColor = Color.Red; Color leftColor = Color.Red; Color rightColor = Color.Red; if (playerDoomComponent.ForwardHitVector) { forwardColor = Color.Blue; } if (playerDoomComponent.LeftHitVector) { leftColor = Color.Blue; } if (playerDoomComponent.RightHightVector) { rightColor = Color.Blue; } Vector3 pos = playerObj.Transform.AbsoluteTransform.Translation; Vector3 forwardVec = playerObj.Transform.AbsoluteTransform.Translation + playerObj.Transform.AbsoluteTransform.Forward * playerDoomComponent.HitVectorSize; Vector3 rightVec = MonoMathHelper.RotateAroundPoint(forwardVec, playerObj.Transform.AbsoluteTransform.Translation, Vector3.Up, MathHelper.PiOver4); Vector3 leftVec = MonoMathHelper.RotateAroundPoint(forwardVec, playerObj.Transform.AbsoluteTransform.Translation, Vector3.Up, -MathHelper.PiOver4); DebugShapeRenderer.AddLine(pos, forwardVec, forwardColor); DebugShapeRenderer.AddLine(pos, leftVec, leftColor); DebugShapeRenderer.AddLine(pos, rightVec, rightColor); DebugText.Write(playerObj.Transform.AbsoluteTransform.Translation.ToString()); DebugText.Write(playerAngle.ToString()); } base.Render(gameTime); }
private void FeelForward() { DoomComponent playerDoomComponent = ParentObject.GetComponent <DoomComponent>(); Vector3 pos = ParentObject.Transform.AbsoluteTransform.Translation; Vector3 forwardVec = ParentObject.Transform.AbsoluteTransform.Translation + ParentObject.Transform.AbsoluteTransform.Forward * playerDoomComponent.HitVectorSize; Vector3 rightVec = MonoMathHelper.RotateAroundPoint(forwardVec, ParentObject.Transform.AbsoluteTransform.Translation, Vector3.Up, MathHelper.PiOver4 / 2); Vector3 leftVec = MonoMathHelper.RotateAroundPoint(forwardVec, ParentObject.Transform.AbsoluteTransform.Translation, Vector3.Up, -MathHelper.PiOver4 / 2); pos.Y = 0; forwardVec.Y = 0; rightVec.Y = 0; leftVec.Y = 0; Color forwardColor = Color.Red; Color leftColor = Color.Red; Color rightColor = Color.Red; if (mapHandler.IntersectsLevel(pos, forwardVec)) { forwardColor = Color.Blue; } if (mapHandler.IntersectsLevel(pos, rightVec)) { rightColor = Color.Blue; var strafe = new RestRequest("player/actions", Method.POST); strafe.RequestFormat = DataFormat.Json; strafe.AddBody(new PlayerAction() { type = "strafe-left", amount = 2 }); apiHandler.EnqueueCoolDownRequest("strafe-left", strafe, 400, x => { }); } if (mapHandler.IntersectsLevel(pos, leftVec)) { leftColor = Color.Blue; var strafe = new RestRequest("player/actions", Method.POST); strafe.RequestFormat = DataFormat.Json; strafe.AddBody(new PlayerAction() { type = "strafe-right", amount = 2 }); apiHandler.EnqueueCoolDownRequest("strafe-right", strafe, 400, x => { }); } DebugShapeRenderer.AddLine(pos, forwardVec, forwardColor); DebugShapeRenderer.AddLine(pos, leftVec, leftColor); DebugShapeRenderer.AddLine(pos, rightVec, rightColor); }
public void Render(GameTime gameTime) { Color xzColor = (ActivePlane == CurrentActivePlane.XZ) ? Color.OrangeRed : Color.DarkGray; Color yzColor = (ActivePlane == CurrentActivePlane.YZ) ? Color.CadetBlue : Color.DarkGray; Color xyColor = (ActivePlane == CurrentActivePlane.XY) ? Color.DarkGreen : Color.DarkGray; if (RenderGrid) { for (float i = -modellingAreaSize / 2; i <= modellingAreaSize / 2; i++) { if (RenderActivePlaneOnly && i == CurrentZIndex) { DebugShapeRenderer.AddXYGrid(new Vector3(-modellingAreaSize / 2, -modellingAreaSize / 2, i), modellingAreaSize, modellingAreaSize, 1, (i == CurrentZIndex) ? xyColor : Color.DarkGray); } if (RenderActivePlaneOnly && i == CurrentYIndex) { DebugShapeRenderer.AddXZGrid(new Vector3(-modellingAreaSize / 2, i, -modellingAreaSize / 2), modellingAreaSize, modellingAreaSize, 1, (i == CurrentYIndex) ? xzColor : Color.DarkGray); } if (RenderActivePlaneOnly && i == CurrentXIndex) { DebugShapeRenderer.AddYZGrid(new Vector3(i, -modellingAreaSize / 2, -modellingAreaSize / 2), modellingAreaSize, modellingAreaSize, 1, (i == CurrentXIndex) ? yzColor : Color.DarkGray); } } } if (CurrentMode == EditMode.Vertex) { if (currentVertices.Count > 0) { for (int i = 0; i < currentVertices.Count - 1; i++) { DebugShapeRenderer.AddLine(currentVertices[i], currentVertices[i + 1], currentColour); } DebugShapeRenderer.AddLine(currentVertices[currentVertices.Count - 1], currentbuildPoint, currentColour); } } }
private void RenderPath() { if (path == null) { return; } if (path.Count == 0) { return; } for (int i = 0; i < path.Count - 1; i++) { DebugShapeRenderer.AddLine(path[i].WorldPosition, path[i + 1].WorldPosition, Color.Purple); } }
private void RaycastTest() { RayCastResult result; Matrix camWorld = Matrix.Invert(SystemCore.ActiveCamera.View); BEPUutilities.Ray ray = new BEPUutilities.Ray(camWorld.Translation.ToBepuVector() + camWorld.Forward.ToBepuVector() * 3f, camWorld.Forward.ToBepuVector()); if (SystemCore.PhysicsSimulation.RayCast(ray, out result)) { hitPos = result.HitData.Location.ToXNAVector(); DebugShapeRenderer.AddLine(hitPos, hitPos + Vector3.Normalize(result.HitData.Normal.ToXNAVector() * 5f), Color.Blue); } }
public void Draw(GameTime gameTime) { //read render data from buffer. if (renderData == null) { RenderGeometryComponent renderGeometry = ParentObject.GetComponent <RenderGeometryComponent>(); renderData = new VertexPositionColorTextureNormal[renderGeometry.VertexBuffer.VertexCount]; renderGeometry.VertexBuffer.GetData <VertexPositionColorTextureNormal>(renderData); } for (int i = 0; i < renderData.Length; i++) { Vector3 transformedPosition = Vector3.Transform(renderData[i].Position, Matrix.CreateScale(ParentObject.Transform.Scale) * ParentObject.Transform.AbsoluteTransform); Vector3 transformedNormal = Vector3.Transform(renderData[i].Normal, Matrix.CreateScale(ParentObject.Transform.Scale) * ParentObject.Transform.AbsoluteTransform); DebugShapeRenderer.AddLine(transformedPosition, transformedPosition + transformedNormal * 0.1f, Color.Red); } }
public override void Render(GameTime gameTime) { SystemCore.GraphicsDevice.Clear(Color.Black); foreach (DoomLine l in mapHandler.GetLevelOutline()) { DebugShapeRenderer.AddLine(l.start, l.end, l.color); } foreach (DoomLine d in mapHandler.HazardLines) { DebugShapeRenderer.AddLine(d.start, d.end, d.color); } foreach (DoomLine d in mapHandler.Doors) { DebugShapeRenderer.AddLine(d.start, d.end, d.color); } foreach (DoomLine d in mapHandler.InternalLines) { DebugShapeRenderer.AddLine(d.start, d.end, d.color); } // if (!mapHandler.FloodFillComplete) // RenderFloodFill(); if (playerObj != null) { var moveComponent = playerObj.GetComponent <DoomMovementComponent>(); if (moveComponent.path != null) { if (moveComponent.path.Count > 0) { foreach (NavigationNode n in moveComponent.path) { DebugShapeRenderer.AddBoundingSphere(new BoundingSphere(n.WorldPosition, 0.3f), Color.Purple); } } } } DebugShapeRenderer.AddBoundingSphere(new BoundingSphere(mapHandler.LevelEnd, 1f), Color.Orange); base.Render(gameTime); }
public void Render(GameTime gameTime) { var playerList = SystemCore.GameObjectManager.GetAllObjects().FindAll(x => x is Player && !((Player)x).Dead); foreach (Player p in playerList) { DebugShapeRenderer.AddUnitSphere(p.Transform.AbsoluteTransform.Translation, p.PlayerColor); DebugShapeRenderer.AddLine(p.Transform.AbsoluteTransform.Translation, p.Transform.AbsoluteTransform.Translation + p.Transform.AbsoluteTransform.Forward * 1.5f, p.PlayerColor); } foreach (GameTile t in gameTiles) { foreach (GameTile n in t.Neighbours) { DebugShapeRenderer.AddLine(t.Center, n.Center, Color.Blue); } } }
private void RenderLineDefs() { foreach (DoomLine l in levelLines) { DebugShapeRenderer.AddLine(l.start, l.end, l.color); } //int numTriangles = tesselator.ElementCount; //for(int i = 0; i < numTriangles; i++) //{ // var v0 = tesselator.Vertices[tesselator.Elements[i * 3]].Position; // var v1 = tesselator.Vertices[tesselator.Elements[i * 3 + 1]].Position; // var v2 = tesselator.Vertices[tesselator.Elements[i * 3 + 2]].Position; // DebugShapeRenderer.AddLine(new Vector3((float)v0.X,0,(float)v0.Y), new Vector3((float)v1.X, 0, (float)v1.Y),Color.Orange); // DebugShapeRenderer.AddLine(new Vector3((float)v1.X, 0, (float)v1.Y), new Vector3((float)v2.X, 0, (float)v2.Y), Color.Orange); // DebugShapeRenderer.AddLine(new Vector3((float)v2.X, 0, (float)v2.Y), new Vector3((float)v0.X, 0, (float)v0.Y), Color.Orange); //} }
protected override void Draw(GameTime gameTime) { GraphicsDevice.Clear(Color.Black); Vector3 source = new Vector3(0, 0, 0); foreach (Vector3 v in routevectors) { DebugShapeRenderer.AddLine(source, v, Color.Red); } // System.Console.WriteLine(latLong.Latitude.); // latLong.GetCoordinate2D().ToString(); // TODO: Add your drawing code here // basicEffect.CurrentTechnique.Passes[0].Apply(); // var vertices = new[] { new VertexPositionColor(startPoint, Color.White), new VertexPositionColor(endPoint, Color.White) }; // GraphicsDevice.DrawUserPrimitives(PrimitiveType.LineList, vertices, 0, 1); // base.Draw(gameTime); // scene.BackgroundColor = Color.Black; scene.Draw(gameTime.ElapsedGameTime, gameTime.IsRunningSlowly); }
private void RenderConnections(PlanetNode node) { List <NeighbourTracker.Connection> connections = neighbourTracker.GetConnections(node); Color nodeQuadrantColor = Color.Red; if (neighbourTracker.nodeDictionary.ContainsKey(node.GetKeyPoint())) { NeighbourTrackerNode trackerNode = neighbourTracker.nodeDictionary[node.GetKeyPoint()]; if (trackerNode.quadrant == NeighbourTrackerNode.Quadrant.ne) { nodeQuadrantColor = Color.White; } if (trackerNode.quadrant == NeighbourTrackerNode.Quadrant.nw) { nodeQuadrantColor = Color.Green; } if (trackerNode.quadrant == NeighbourTrackerNode.Quadrant.se) { nodeQuadrantColor = Color.Pink; } if (trackerNode.quadrant == NeighbourTrackerNode.Quadrant.sw) { nodeQuadrantColor = Color.Yellow; } DebugShapeRenderer.AddBoundingSphere(new BoundingSphere(node.GetSurfaceMidPoint(), 100f / trackerNode.depth), nodeQuadrantColor); } foreach (NeighbourTracker.Connection conn in connections) { DebugShapeRenderer.AddLine(node.GetSurfaceMidPoint(), Vector3.Transform(Vector3.Normalize(conn.node.keyPoint) * radius, Transform.AbsoluteTransform), Color.Blue); } }
public void Update(GameTime gameTime) { ParentObject.GetComponent <DoomMovementComponent>().Enabled = true; //when in combat, get much more frequent updates on enemy movements. apiHandler.frequentRequests.Find(x => x.Request.Resource.Contains("world")).Fequency = 4000; //check LOS to monsters. If if (worldObjects == null) { shotsFired = 0; return; } if (worldObjects.Count == 0) { shotsFired = 0; return; } //get all the monsters from the world object list. //monsters are ALL IN CAPS var monsters = worldObjects.Values.Where(x => IsAllUpper(x.GetComponent <DoomComponent>().DoomType)).ToList(); //forget about the dead ones. monsters.RemoveAll(x => x.GetComponent <DoomComponent>().Health <= 0); //can we see any of these guys? List <GameObject> visibleMonsters = new List <GameObject>(); foreach (GameObject monster in monsters) { if (!mapHandler.IntersectsLevel(ParentObject.Transform.AbsoluteTransform.Translation, monster.Transform.AbsoluteTransform.Translation, true)) { //we can see it. visibleMonsters.Add(monster); foreach (DoomLine door in mapHandler.Doors) { if (MonoMathHelper.LineIntersection(ParentObject.Transform.AbsoluteTransform.Translation.ToVector2XZ(), monster.Transform.AbsoluteTransform.Translation.ToVector2XZ(), door.start.ToVector2XZ(), door.end.ToVector2XZ())) { //there's a door between us and the monster. remove it if (visibleMonsters.Contains(monster)) { visibleMonsters.Remove(monster); } } } } } if (visibleMonsters.Count == 0) { shotsFired = 0; return; } //when in combat, get much more frequent updates on enemy movements. apiHandler.frequentRequests.Find(x => x.Request.Resource.Contains("world")).Fequency = 500; GameObject target = null; float closestDist = float.MaxValue; foreach (GameObject vm in visibleMonsters) { Vector3 toMonsterVec = ParentObject.Transform.AbsoluteTransform.Translation - vm.Transform.AbsoluteTransform.Translation; if (toMonsterVec.Length() < closestDist) { target = vm; closestDist = toMonsterVec.Length(); } } if (closestDist > minimumCombatDistance) { shotsFired = 0; return; } //disable movement. ParentObject.GetComponent <DoomMovementComponent>().Enabled = false; DebugShapeRenderer.AddLine(ParentObject.Transform.AbsoluteTransform.Translation, target.Transform.AbsoluteTransform.Translation, Color.OrangeRed); Vector3 targetPosition = target.Transform.AbsoluteTransform.Translation; Vector3 toTarget = targetPosition - ParentObject.Transform.AbsoluteTransform.Translation; toTarget.Y = 0; toTarget.Normalize(); Vector3 rightV = ParentObject.Transform.AbsoluteTransform.Right; rightV.Y = 0; rightV.Normalize(); Vector3 forwardVec = ParentObject.Transform.AbsoluteTransform.Forward; forwardVec.Y = 0; forwardVec.Normalize(); float dot = Vector3.Dot(toTarget, rightV); //game units are roughly 105 in a circle. //so 1 unit = 360 / 105 degrees //1 degree = 105 / 360 var angle = MathHelper.ToDegrees(MonoMathHelper.GetAngleBetweenVectors(toTarget, forwardVec)); float heading = MathHelper.ToDegrees(MonoMathHelper.GetHeadingFromVector((toTarget).ToVector2XZ())); heading = (heading + 360) % 360; if (dot > 0.05f) { if (!turning) { //TurnLeft(2); TurnLeftToHeading(heading); } } if (dot < -0.05f) { if (!turning) { //TurnRight(2); TurnRightToHeading(heading); } } if (dot > -0.3f && dot < 0.3f) { //the node we need is right behind us. Instigate a turn. if (MonoMathHelper.AlmostEquals(180d, angle, 10)) { TurnLeftToHeading(heading); return; } Shoot(); if (shotsFired > 8) { //we keep missing. shift the aim a bit. bool left = RandomHelper.CoinToss(); if (left) { TurnLeft(1); } else { TurnRight(1); } shotsFired = 0; } } }
private void OptimisePath() { //tries to look ahead and skip nodes we have clear unobstructed path to already Vector3 pos = ParentObject.Transform.AbsoluteTransform.Translation; pos.Y = 0; int indexToRemove = -1; for (int i = 1; i < path.Count; i++) { NavigationNode nodeToExamine = path[i]; bool centerClear = false; bool leftClear = false; bool rightClear = false; Vector3 toNode = nodeToExamine.WorldPosition - pos; Vector3 perpendicularVec = Vector3.Cross(toNode, Vector3.Up); perpendicularVec.Y = 0; //width perpendicularVec *= 0.01f; //don't optimize route when we cross a hazard line boundary if (mapHandler.IntersectsHazardLine(pos, nodeToExamine.WorldPosition)) { continue; } //if we pass all 3 of these tests, this means we have clear LOS //to this node, wide enough to squeeze through. So we can skip prior nodes. if (!mapHandler.IntersectsLevel(pos, nodeToExamine.WorldPosition)) { centerClear = true; if (!mapHandler.IntersectsLevel(pos + perpendicularVec, nodeToExamine.WorldPosition + perpendicularVec)) { leftClear = true; if (!mapHandler.IntersectsLevel(pos - perpendicularVec, nodeToExamine.WorldPosition - perpendicularVec)) { rightClear = true; indexToRemove = i; } else { break; } } else { break; } } else { break; } DebugShapeRenderer.AddLine(pos, nodeToExamine.WorldPosition, rightClear ? Color.Blue : Color.Red); DebugShapeRenderer.AddLine(pos + perpendicularVec, nodeToExamine.WorldPosition + perpendicularVec, leftClear ? Color.Blue : Color.Red); DebugShapeRenderer.AddLine(pos - perpendicularVec, nodeToExamine.WorldPosition - perpendicularVec, rightClear ? Color.Blue : Color.Red); } if (indexToRemove != -1) { path.RemoveRange(0, indexToRemove); } }