/// <summary> /// Constructeur /// </summary> /// <param name="NbSegments"></param> /// <param name="x"></param> /// <param name="y"></param> /// <param name="longueurSegment"></param> public Herbe(float x, float y, float longueurSegment, float raideur) { if (_pens == null) { InitPens(); } _x = x; _y = y; _raideur = raideur; _longueurSegments = new float[NbSegments]; _anglesSegments = new double[NbSegments]; double courbureHerbe = DisplayedObject.FloatRandom((float)-Math.PI, (float)Math.PI) / 20.0; float X = x; float Y = y; double angle = Math.PI; for (int i = 0; i < NbSegments; i++) { _longueurSegments[i] = longueurSegment; _anglesSegments[i] = angle; longueurSegment *= ratioSegments; angle += courbureHerbe; } }
public override void GetVertexData(List <VertexPositionNormalTexture> vertices, List <ushort> indices) { var points = new List <Vector3>(); Vector3 max; var direction = new Vector3(); float margin = DisplayedObject.CollisionMargin - DisplayedObject.AllowedPenetration; float angleChange = MathHelper.TwoPi / NumSamples; Vector3 centerPosition = DisplayedObject.CenterPosition; Matrix transposeOrientation = Matrix.Transpose(DisplayedObject.OrientationMatrix); for (int i = 1; i < NumSamples / 2 - 1; i++) { float phi = MathHelper.PiOver2 - i * angleChange; var sinPhi = (float)Math.Sin(phi); var cosPhi = (float)Math.Cos(phi); for (int j = 0; j < NumSamples; j++) { float theta = j * angleChange; direction.X = (float)Math.Cos(theta) * cosPhi; direction.Y = sinPhi; direction.Z = (float)Math.Sin(theta) * cosPhi; DisplayedObject.GetExtremePoint(ref direction, margin, out max); points.Add(Vector3.TransformNormal(max - centerPosition, transposeOrientation)); } } DisplayedObject.GetExtremePoint(ref Toolbox.UpVector, margin, out max); points.Add(Vector3.TransformNormal(max - centerPosition, transposeOrientation)); DisplayedObject.GetExtremePoint(ref Toolbox.DownVector, margin, out max); points.Add(Vector3.TransformNormal(max - centerPosition, transposeOrientation)); var hullTriangleVertices = new List <Vector3>(); var hullTriangleIndices = new List <int>(); Toolbox.GetConvexHull(points, hullTriangleIndices, hullTriangleVertices); //The hull triangle vertices are used as a dummy to get the unnecessary hull vertices, which are cleared afterwards. hullTriangleVertices.Clear(); foreach (int i in hullTriangleIndices) { hullTriangleVertices.Add(points[i]); } Vector3 normal; for (ushort i = 0; i < hullTriangleVertices.Count; i += 3) { normal = Vector3.Normalize(Vector3.Cross(hullTriangleVertices[i + 2] - hullTriangleVertices[i], hullTriangleVertices[i + 1] - hullTriangleVertices[i])); vertices.Add(new VertexPositionNormalTexture(hullTriangleVertices[i], normal, new Vector2(0, 0))); vertices.Add(new VertexPositionNormalTexture(hullTriangleVertices[i + 1], normal, new Vector2(1, 0))); vertices.Add(new VertexPositionNormalTexture(hullTriangleVertices[i + 2], normal, new Vector2(0, 1))); indices.Add(i); indices.Add((ushort)(i + 1)); indices.Add((ushort)(i + 2)); } }
public override void GetVertexData(List <VertexPositionNormalTexture> vertices, List <ushort> indices) { Vector3 normal; int numColumns = DisplayedObject.Heights.GetLength(0); int numRows = DisplayedObject.Heights.GetLength(1); for (int i = 0; i < numColumns; i++) { for (int j = 0; j < numRows; j++) { normal = DisplayedObject.GetNormal(i, j); vertices.Add(new VertexPositionNormalTexture( new Vector3(i * DisplayedObject.GetSpacingX(), DisplayedObject.Heights[i, j], j * DisplayedObject.GetSpacingZ()), normal, new Vector2(i, j))); } } for (int i = 0; i < numColumns - 1; i++) { for (int j = 0; j < numRows - 1; j++) { for (int k = DisplayedObject.QuadTriangles.Length - 1; k >= 0; k--) { switch (DisplayedObject.QuadTriangles[k]) { case 0: indices.Add((ushort)(numRows * j + i)); break; case 1: indices.Add((ushort)(numRows * j + i + 1)); break; case 2: indices.Add((ushort)(numRows * (j + 1) + i)); break; case 3: indices.Add((ushort)(numRows * (j + 1) + i + 1)); break; } } } } }
private async Task ReplyToUser( DisplayedObject displayedObject, Activity activity, ConnectorClient connector) { var reply = activity.CreateReply(displayedObject.DisplayInformation); reply.Attachments = new List <Attachment> { new Attachment { ContentUrl = Url.Content($"~/content/{displayedObject.ImageName}"), ContentType = "image/png", Name = $"{displayedObject.ImageName}" } }; await connector.Conversations.ReplyToActivityAsync(reply); }
public override void GetMeshData(List <VertexPositionNormalTexture> vertices, List <ushort> indices) { ModelDrawer.ShapeMeshGetters[DisplayedObject.GetType()](DisplayedObject, vertices, indices); }
public override void GetMeshData(List <VertexPositionNormalTexture> vertices, List <ushort> indices) { int numColumns = DisplayedObject.Shape.Heights.GetLength(0); int numRows = DisplayedObject.Shape.Heights.GetLength(1); TerrainShape shape = DisplayedObject.Shape; //The terrain can be transformed arbitrarily. However, the collision against the triangles is always oriented such that the transformed local //up vector points in the same direction as the collidable surfaces. //To make sure the graphics match the terrain collision, try transforming the local space up direction into world space. Treat it as a normal- it requires an adjugate transpose, not a regular transformation. var normalTransform = Matrix3x3.AdjugateTranspose(DisplayedObject.WorldTransform.LinearTransform); var reverseWinding = BEPUutilities.Vector3.Dot(normalTransform.Up, DisplayedObject.WorldTransform.LinearTransform.Up) < 0; for (int j = 0; j < numRows; j++) { for (int i = 0; i < numColumns; i++) { VertexPositionNormalTexture v; BEPUutilities.Vector3 position, n; DisplayedObject.GetPosition(i, j, out position); shape.GetLocalNormal(i, j, out n); Matrix3x3.Transform(ref n, ref normalTransform, out n); n.Normalize(); MathConverter.Convert(ref position, out v.Position); MathConverter.Convert(ref n, out v.Normal); if (reverseWinding) { Vector3.Negate(ref v.Normal, out v.Normal); } v.TextureCoordinate = new Vector2(i, j); vertices.Add(v); if (i < numColumns - 1 && j < numRows - 1) { if (shape.QuadTriangleOrganization == QuadTriangleOrganization.BottomLeftUpperRight) { //v3 v4 //v1 v2 //v1 v2 v3 indices.Add((ushort)(numColumns * j + i)); if (reverseWinding) { indices.Add((ushort)(numColumns * (j + 1) + i)); indices.Add((ushort)(numColumns * j + i + 1)); } else { indices.Add((ushort)(numColumns * j + i + 1)); indices.Add((ushort)(numColumns * (j + 1) + i)); } //v2 v4 v3 indices.Add((ushort)(numColumns * j + i + 1)); if (reverseWinding) { indices.Add((ushort)(numColumns * (j + 1) + i)); indices.Add((ushort)(numColumns * (j + 1) + i + 1)); } else { indices.Add((ushort)(numColumns * (j + 1) + i + 1)); indices.Add((ushort)(numColumns * (j + 1) + i)); } } else if (shape.QuadTriangleOrganization == QuadTriangleOrganization.BottomRightUpperLeft) { //v1 v2 v4 indices.Add((ushort)(numColumns * j + i)); if (reverseWinding) { indices.Add((ushort)(numColumns * (j + 1) + i + 1)); indices.Add((ushort)(numColumns * j + i + 1)); } else { indices.Add((ushort)(numColumns * j + i + 1)); indices.Add((ushort)(numColumns * (j + 1) + i + 1)); } //v1 v4 v3 indices.Add((ushort)(numColumns * j + i)); if (reverseWinding) { indices.Add((ushort)(numColumns * (j + 1) + i)); indices.Add((ushort)(numColumns * (j + 1) + i + 1)); } else { indices.Add((ushort)(numColumns * (j + 1) + i + 1)); indices.Add((ushort)(numColumns * (j + 1) + i)); } } } } } }
public override void Update() { WorldTransform = Matrix.CreateTranslation(DisplayedObject.GetPosition()); }
public override void GetMeshData(List <VertexPositionNormalTexture> vertices, List <ushort> indices) { int numColumns = DisplayedObject.Shape.Heights.GetLength(0); int numRows = DisplayedObject.Shape.Heights.GetLength(1); TerrainShape shape = DisplayedObject.Shape; //The terrain can be transformed arbitrarily. However, the collision against the triangles is always oriented such that the transformed local //up vector points in the same direction as the collidable surfaces. //To make sure the graphics match the terrain collision, see if a triangle normal faces in the same direction as the local up vector. //If not, construct the graphics with reversed winding. Vector3 a, b, c; DisplayedObject.GetPosition(0, 0, out a); DisplayedObject.GetPosition(1, 0, out b); DisplayedObject.GetPosition(0, 1, out c); Vector3 normal = Vector3.Cross(c - a, b - a); Vector3 terrainUp = new Vector3(DisplayedObject.WorldTransform.LinearTransform.M21, DisplayedObject.WorldTransform.LinearTransform.M22, DisplayedObject.WorldTransform.LinearTransform.M23); float dot; Vector3.Dot(ref normal, ref terrainUp, out dot); bool reverseWinding = dot < 0; for (int j = 0; j < numRows; j++) { for (int i = 0; i < numColumns; i++) { VertexPositionNormalTexture v; DisplayedObject.GetPosition(i, j, out v.Position); DisplayedObject.GetNormal(i, j, out v.Normal); if (reverseWinding) { Vector3.Negate(ref v.Normal, out v.Normal); } v.TextureCoordinate = new Vector2(i, j); vertices.Add(v); if (i < numColumns - 1 && j < numRows - 1) { if (shape.QuadTriangleOrganization == QuadTriangleOrganization.BottomLeftUpperRight) { //v3 v4 //v1 v2 //v1 v2 v3 indices.Add((ushort)(numColumns * j + i)); if (reverseWinding) { indices.Add((ushort)(numColumns * (j + 1) + i)); indices.Add((ushort)(numColumns * j + i + 1)); } else { indices.Add((ushort)(numColumns * j + i + 1)); indices.Add((ushort)(numColumns * (j + 1) + i)); } //v2 v4 v3 indices.Add((ushort)(numColumns * j + i + 1)); if (reverseWinding) { indices.Add((ushort)(numColumns * (j + 1) + i)); indices.Add((ushort)(numColumns * (j + 1) + i + 1)); } else { indices.Add((ushort)(numColumns * (j + 1) + i + 1)); indices.Add((ushort)(numColumns * (j + 1) + i)); } } else if (shape.QuadTriangleOrganization == QuadTriangleOrganization.BottomRightUpperLeft) { //v1 v2 v4 indices.Add((ushort)(numColumns * j + i)); if (reverseWinding) { indices.Add((ushort)(numColumns * (j + 1) + i + 1)); indices.Add((ushort)(numColumns * j + i + 1)); } else { indices.Add((ushort)(numColumns * j + i + 1)); indices.Add((ushort)(numColumns * (j + 1) + i + 1)); } //v1 v4 v3 indices.Add((ushort)(numColumns * j + i)); if (reverseWinding) { indices.Add((ushort)(numColumns * (j + 1) + i)); indices.Add((ushort)(numColumns * (j + 1) + i + 1)); } else { indices.Add((ushort)(numColumns * (j + 1) + i + 1)); indices.Add((ushort)(numColumns * (j + 1) + i)); } } } } } }
public void SetSlot(DisplayedObject slot) { displaySlot = slot; }