Advertisement
Guest User

Prism v2

a guest
Oct 7th, 2017
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 9.80 KB | None | 0 0
  1. using Microsoft.Xna.Framework;
  2. using Microsoft.Xna.Framework.Graphics;
  3. using System;
  4. using System.Collections.Generic;
  5. using System.Linq;
  6. using System.Text;
  7. using System.Threading.Tasks;
  8.  
  9. namespace Pyramid
  10. {
  11.     class Prism
  12.     {
  13.         #region Variables
  14.         /// <summary>
  15.         /// Number of prism faces
  16.         /// </summary>
  17.         private int prismSides;
  18.  
  19.         /// <summary>
  20.         /// Height of the prism
  21.         /// </summary>
  22.         private float prismHeight;
  23.  
  24.         /// <summary>
  25.         /// Diameter of the prism
  26.         /// </summary>
  27.         private float prismRadius;
  28.  
  29.         /// <summary>
  30.         /// Placeholder for the texture on the sides
  31.         /// </summary>
  32.         private Texture2D prismSideTexture;
  33.  
  34.         /// <summary>
  35.         /// prism BasicEffect
  36.         /// </summary>
  37.         private BasicEffect effect;
  38.        
  39.         /// <summary>
  40.         /// Bottom face vertices
  41.         /// </summary>
  42.         public VertexPositionTexture[] BotFace { get; set; }
  43.  
  44.         /// <summary>
  45.         /// Top face vertices
  46.         /// </summary>
  47.         public VertexPositionTexture[] TopFace { get; set; }
  48.  
  49.         /// <summary>
  50.         /// Sides vertices
  51.         /// </summary>
  52.         public VertexPositionTexture[] Sides { get; set; }
  53.  
  54.         /// <summary>
  55.         /// Stores the top and bot base coords
  56.         /// </summary>
  57.         private List<Vector2> baseCoords = new List<Vector2>();
  58.  
  59.         /// <summary>
  60.         /// IndexBuffer index for base and top
  61.         /// </summary>
  62.         public short[] TopBotIndex;
  63.  
  64.         /// <summary>
  65.         /// IndexBuffer index for sides
  66.         /// </summary>
  67.         public short[] SideIndex;
  68.  
  69.         /// <summary>
  70.         /// Bottom vertex buffer
  71.         /// </summary>
  72.         private VertexBuffer botVertexBuffer;
  73.  
  74.         /// <summary>
  75.         /// Top Vertex buffer
  76.         /// </summary>
  77.         private VertexBuffer topVertexBuffer;
  78.  
  79.         /// <summary>
  80.         /// Side Vertex Buffer
  81.         /// </summary>
  82.         private VertexBuffer sideVertexBuffer;
  83.  
  84.         /// <summary>
  85.         /// Top/bottom index Buffer
  86.         /// </summary>
  87.         private IndexBuffer topBotBuffer;
  88.  
  89.         /// <summary>
  90.         /// Sides index Buffer
  91.         /// </summary>
  92.         private IndexBuffer sidesBuffer;
  93.  
  94.         /// <summary>
  95.         /// The World Matrix
  96.         /// </summary>
  97.         private Matrix worldMatrix;
  98.         #endregion
  99.  
  100.         /// <summary>
  101.         /// Initializes the Prism class
  102.         /// </summary>
  103.         /// <param name="nSides">Number prism faces, min 3</param>
  104.         /// <param name="height">Height of the prism, min 1</param>
  105.         /// <param name="radius">Diameter of the prism, min 1</param>
  106.         /// <param name="sideTexture">Texture of the prism faces</param>
  107.         /// <param name="topBotTexture">Textue of the top and bottom sides</param>
  108.         public Prism(GraphicsDevice device, int nSides, float height, float radius, Texture2D sideTexture)
  109.         {
  110.             // Does a simple side number check
  111.             if (nSides < 3)
  112.                 prismSides = 3;
  113.             else
  114.                 prismSides = nSides;
  115.  
  116.             // Does a simple height check
  117.             if (height < 1f)
  118.                 prismHeight = 1f;
  119.             else
  120.                 prismHeight = height;
  121.  
  122.             //Does a simple diameter check
  123.             if (radius < 1f)
  124.                 prismRadius = 1f;
  125.             else
  126.                 prismRadius = radius;
  127.  
  128.             // initializes the vertices list
  129.             if (BotFace == null)
  130.                 BotFace = new VertexPositionTexture[prismSides + 1];
  131.  
  132.             if (TopFace == null)
  133.                 TopFace = new VertexPositionTexture[prismSides + 1];
  134.  
  135.             if (Sides == null)
  136.                 Sides = new VertexPositionTexture[2 * prismSides + 2]; // 4 vertices for each side + 2 more to close it
  137.  
  138.             if (SideIndex == null)
  139.                 SideIndex = new short[2 * prismSides + 2];
  140.  
  141.             if(worldMatrix == null)
  142.                 worldMatrix = Matrix.Identity;
  143.  
  144.             // initializes the indexbuffer
  145.             if (TopBotIndex == null)
  146.                 TopBotIndex = new short[prismSides * 2 + 2];
  147.  
  148.             prismSideTexture = sideTexture;
  149.  
  150.             PrismEffect(device);
  151.             BuildTopBot();
  152.             BuildSides();
  153.             CreateBuffers(device);
  154.         }
  155.  
  156.         /// <summary>
  157.         /// Builds top and bottom layer
  158.         /// </summary>
  159.         private void BuildTopBot()
  160.         {
  161.             baseCoords = Helper.GetCirclePositions(prismRadius, prismSides);
  162.  
  163.             // stores the data into 2 arrays
  164.             //sets the middle vertice
  165.             TopFace[0] = new VertexPositionTexture(new Vector3(0f, prismHeight, 0f), new Vector2(0.0f, 0.0f));
  166.             BotFace[0] = new VertexPositionTexture(new Vector3(0f, 0f, 0f), new Vector2(0.0f, 0.0f));
  167.  
  168.             for (int i = 0; i < baseCoords.Count; i++)
  169.             {
  170.                 TopFace[i + 1] = new VertexPositionTexture(new Vector3(baseCoords[i].X, prismHeight, baseCoords[i].Y),  new Vector2(0.0f, 0.0f));
  171.                 BotFace[i + 1] = new VertexPositionTexture(new Vector3(baseCoords[i].X, 0f, baseCoords[i].Y), new Vector2(0.0f, 0.0f));
  172.             }
  173.  
  174.             // Builds the indexbuffer
  175.             for (int i = 0; i < prismSides + 1; i++)
  176.             {
  177.                 if (i < prismSides)
  178.                     TopBotIndex[2 * i] = (short)(i + 1);
  179.                 else
  180.                     TopBotIndex[2 * i] = 1;
  181.  
  182.                 TopBotIndex[2 * i + 1] = 0;
  183.             }
  184.         }
  185.  
  186.         /// <summary>
  187.         /// Builds the sides of the prism
  188.         /// </summary>
  189.         private void BuildSides()
  190.         {
  191.             float x;
  192.  
  193.             for (int i = 0; i < prismSides + 1; i++)
  194.             {
  195.                 x = (float)i / (float)prismSides; // gets texutre absiss
  196.  
  197.                 if (i < prismSides)
  198.                 {
  199.                     Sides[2 * i + 1] = new VertexPositionTexture(new Vector3(baseCoords[i].X, prismHeight, baseCoords[i].Y), new Vector2(x, 0.0f));
  200.                     Sides[2 * i] = new VertexPositionTexture(new Vector3(baseCoords[i].X, 0.0f, baseCoords[i].Y), new Vector2(x, 1.0f));
  201.                 }
  202.                 else // closes the prism with the 2 last vertices
  203.                 {
  204.                     Sides[2 * i + 1] = new VertexPositionTexture(new Vector3(baseCoords[0].X, prismHeight, baseCoords[0].Y), new Vector2(x, 0.0f));
  205.                     Sides[2 * i] = new VertexPositionTexture(new Vector3(baseCoords[0].X, 0.0f, baseCoords[0].Y), new Vector2(x, 1.0f));
  206.                 }
  207.             }
  208.  
  209.             // draws the vertices by the creation order
  210.             for (int i = 0; i < 2 * prismSides + 2; i++)
  211.                 SideIndex[i] = (short)i;
  212.         }
  213.  
  214.         /// <summary>
  215.         /// Handles the vertex and index buffers creation
  216.         /// </summary>
  217.         /// <param name="device"></param>
  218.         private void CreateBuffers(GraphicsDevice device)
  219.         {
  220.             botVertexBuffer = new VertexBuffer(device, typeof(VertexPositionTexture), BotFace.Length, BufferUsage.None);
  221.             botVertexBuffer.SetData<VertexPositionTexture>(BotFace);
  222.             topVertexBuffer = new VertexBuffer(device, typeof(VertexPositionTexture), TopFace.Length, BufferUsage.None);
  223.             topVertexBuffer.SetData<VertexPositionTexture>(TopFace);
  224.  
  225.             topBotBuffer = new IndexBuffer(device, typeof(short), TopBotIndex.Length, BufferUsage.None);
  226.             topBotBuffer.SetData<short>(TopBotIndex);
  227.  
  228.             sideVertexBuffer = new VertexBuffer(device, typeof(VertexPositionTexture), SideIndex.Length, BufferUsage.None);
  229.             sideVertexBuffer.SetData<VertexPositionTexture>(Sides);
  230.  
  231.             sidesBuffer = new IndexBuffer(device, typeof(short), SideIndex.Length, BufferUsage.None);
  232.             sidesBuffer.SetData<short>(SideIndex);
  233.         }
  234.  
  235.         //TODO :  Put all the drawing and moving logic to the Draw Triangles class
  236.  
  237.         /// <summary>
  238.         /// Prism effect
  239.         /// </summary>
  240.         /// <param name="device"></param>
  241.         public void PrismEffect(GraphicsDevice device)
  242.         {
  243.             effect = new BasicEffect(device);
  244.  
  245.             float aspectRatio = (float)device.Viewport.Width / device.Viewport.Height;
  246.             effect.View = Matrix.CreateLookAt(new Vector3(0f, 4f, 0f), Vector3.Zero, Vector3.Up);
  247.             effect.Projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.0f), aspectRatio, 1.0f, 10.0f);
  248.  
  249.             effect.LightingEnabled = false;
  250.             effect.TextureEnabled = true;            
  251.             effect.Texture = prismSideTexture;
  252.         }
  253.  
  254.         public void Draw(GraphicsDevice device)
  255.         {
  256.             //World Matrix
  257.             effect.World = worldMatrix;
  258.             effect.CurrentTechnique.Passes[0].Apply();
  259.  
  260.             //Prism top face render
  261.             device.Indices = topBotBuffer;
  262.             device.SetVertexBuffer(botVertexBuffer);
  263.             device.DrawUserIndexedPrimitives<VertexPositionTexture>(PrimitiveType.TriangleStrip, TopFace, 0, prismSides + 1, TopBotIndex, 0, prismSides * 2);
  264.  
  265.             //Prism bottom face render
  266.             device.Indices = topBotBuffer;
  267.             device.SetVertexBuffer(botVertexBuffer);
  268.             device.DrawUserIndexedPrimitives<VertexPositionTexture>(PrimitiveType.TriangleStrip, BotFace, 0, prismSides + 1, TopBotIndex, 0, prismSides * 2);
  269.  
  270.             //Prism sides render
  271.             device.Indices = sidesBuffer;
  272.             device.SetVertexBuffer(sideVertexBuffer);
  273.             device.DrawUserIndexedPrimitives<VertexPositionTexture>(PrimitiveType.TriangleStrip, Sides, 0, Sides.Length, SideIndex, 0, prismSides * 2);
  274.  
  275.            
  276.         }
  277.  
  278.     }
  279. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement