Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
GeometricPrimitive.Torus.cs
Go to the documentation of this file.
1 // Copyright (c) 2014 Silicon Studio Corp. (http://siliconstudio.co.jp)
2 // This file is distributed under GPL v3. See LICENSE.md for details.
3 //
4 // Copyright (c) 2010-2013 SharpDX - Alexandre Mutel
5 //
6 // Permission is hereby granted, free of charge, to any person obtaining a copy
7 // of this software and associated documentation files (the "Software"), to deal
8 // in the Software without restriction, including without limitation the rights
9 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
10 // copies of the Software, and to permit persons to whom the Software is
11 // furnished to do so, subject to the following conditions:
12 //
13 // The above copyright notice and this permission notice shall be included in
14 // all copies or substantial portions of the Software.
15 //
16 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
19 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
21 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 // THE SOFTWARE.
23 // -----------------------------------------------------------------------------
24 // The following code is a port of DirectXTk http://directxtk.codeplex.com
25 // -----------------------------------------------------------------------------
26 // Microsoft Public License (Ms-PL)
27 //
28 // This license governs use of the accompanying software. If you use the
29 // software, you accept this license. If you do not accept the license, do not
30 // use the software.
31 //
32 // 1. Definitions
33 // The terms "reproduce," "reproduction," "derivative works," and
34 // "distribution" have the same meaning here as under U.S. copyright law.
35 // A "contribution" is the original software, or any additions or changes to
36 // the software.
37 // A "contributor" is any person that distributes its contribution under this
38 // license.
39 // "Licensed patents" are a contributor's patent claims that read directly on
40 // its contribution.
41 //
42 // 2. Grant of Rights
43 // (A) Copyright Grant- Subject to the terms of this license, including the
44 // license conditions and limitations in section 3, each contributor grants
45 // you a non-exclusive, worldwide, royalty-free copyright license to reproduce
46 // its contribution, prepare derivative works of its contribution, and
47 // distribute its contribution or any derivative works that you create.
48 // (B) Patent Grant- Subject to the terms of this license, including the license
49 // conditions and limitations in section 3, each contributor grants you a
50 // non-exclusive, worldwide, royalty-free license under its licensed patents to
51 // make, have made, use, sell, offer for sale, import, and/or otherwise dispose
52 // of its contribution in the software or derivative works of the contribution
53 // in the software.
54 //
55 // 3. Conditions and Limitations
56 // (A) No Trademark License- This license does not grant you rights to use any
57 // contributors' name, logo, or trademarks.
58 // (B) If you bring a patent claim against any contributor over patents that
59 // you claim are infringed by the software, your patent license from such
60 // contributor to the software ends automatically.
61 // (C) If you distribute any portion of the software, you must retain all
62 // copyright, patent, trademark, and attribution notices that are present in the
63 // software.
64 // (D) If you distribute any portion of the software in source code form, you
65 // may do so only under this license by including a complete copy of this
66 // license with your distribution. If you distribute any portion of the software
67 // in compiled or object code form, you may only do so under a license that
68 // complies with this license.
69 // (E) The software is licensed "as-is." You bear the risk of using it. The
70 // contributors give no express warranties, guarantees or conditions. You may
71 // have additional consumer rights under your local laws which this license
72 // cannot change. To the extent permitted under your local laws, the
73 // contributors exclude the implied warranties of merchantability, fitness for a
74 // particular purpose and non-infringement.
75 
76 using System;
77 using System.Collections.Generic;
78 using SiliconStudio.Core.Mathematics;
79 
80 namespace SiliconStudio.Paradox.Graphics
81 {
82  public partial class GeometricPrimitive
83  {
84  /// <summary>
85  /// A Torus primitive.
86  /// </summary>
87  public struct Torus
88  {
89  /// <summary>
90  /// Creates a torus primitive.
91  /// </summary>
92  /// <param name="device">The device.</param>
93  /// <param name="diameter">The diameter.</param>
94  /// <param name="thickness">The thickness.</param>
95  /// <param name="tessellation">The tessellation.</param>
96  /// <param name="toLeftHanded">if set to <c>true</c> vertices and indices will be transformed to left handed. Default is false.</param>
97  /// <returns>A Torus primitive.</returns>
98  /// <exception cref="System.ArgumentOutOfRangeException">tessellation;tessellation parameter out of range</exception>
99  public static GeometricPrimitive New(GraphicsDevice device, float diameter = 1.0f, float thickness = 0.33333f, int tessellation = 32, bool toLeftHanded = false)
100  {
101  return new GeometricPrimitive(device, New(diameter, thickness, tessellation, toLeftHanded));
102  }
103 
104  /// <summary>
105  /// Creates a torus primitive.
106  /// </summary>
107  /// <param name="diameter">The diameter.</param>
108  /// <param name="thickness">The thickness.</param>
109  /// <param name="tessellation">The tessellation.</param>
110  /// <param name="toLeftHanded">if set to <c>true</c> vertices and indices will be transformed to left handed. Default is false.</param>
111  /// <returns>A Torus primitive.</returns>
112  /// <exception cref="System.ArgumentOutOfRangeException">tessellation;tessellation parameter out of range</exception>
113  public static GeometricMeshData<VertexPositionNormalTexture> New(float diameter = 1.0f, float thickness = 0.33333f, int tessellation = 32, bool toLeftHanded = false)
114  {
115  var vertices = new List<VertexPositionNormalTexture>();
116  var indices = new List<int>();
117 
118  if (tessellation < 3)
119  throw new ArgumentOutOfRangeException("tessellation", "tessellation parameter out of range");
120 
121  int stride = tessellation + 1;
122 
123  // First we loop around the main ring of the torus.
124  for (int i = 0; i <= tessellation; i++)
125  {
126  float u = (float) i/tessellation;
127 
128  float outerAngle = i*MathUtil.TwoPi/tessellation - MathUtil.PiOverTwo;
129 
130  // Create a transform matrix that will align geometry to
131  // slice perpendicularly though the current ring position.
132  var transform = Matrix.Translation(diameter/2, 0, 0)*Matrix.RotationY(outerAngle);
133 
134  // Now we loop along the other axis, around the side of the tube.
135  for (int j = 0; j <= tessellation; j++)
136  {
137  float v = 1 - (float) j/tessellation;
138 
139  float innerAngle = j*MathUtil.TwoPi/tessellation + MathUtil.Pi;
140  float dx = (float) Math.Cos(innerAngle), dy = (float) Math.Sin(innerAngle);
141 
142  // Create a vertex.
143  var normal = new Vector3(dx, dy, 0);
144  var position = normal*thickness/2;
145  var textureCoordinate = new Vector2(u, v);
146 
147  Vector3.TransformCoordinate(ref position, ref transform, out position);
148  Vector3.TransformNormal(ref normal, ref transform, out normal);
149 
150  vertices.Add(new VertexPositionNormalTexture(position, normal, textureCoordinate));
151 
152  // And create indices for two triangles.
153  int nextI = (i + 1)%stride;
154  int nextJ = (j + 1)%stride;
155 
156  indices.Add(i*stride + j);
157  indices.Add(i*stride + nextJ);
158  indices.Add(nextI*stride + j);
159 
160  indices.Add(i*stride + nextJ);
161  indices.Add(nextI*stride + nextJ);
162  indices.Add(nextI*stride + j);
163  }
164  }
165 
166  // Create the primitive object.
167  return new GeometricMeshData<VertexPositionNormalTexture>(vertices.ToArray(), indices.ToArray(), toLeftHanded) { Name = "Torus" };
168  }
169  }
170  }
171 }
SiliconStudio.Paradox.Games.Mathematics.Vector2 Vector2
A geometric primitive. Use Cube, Cylinder, GeoSphere, Plane, Sphere, Teapot, Torus. See Draw+vertices to learn how to use it.
static GeometricMeshData< VertexPositionNormalTexture > New(float diameter=1.0f, float thickness=0.33333f, int tessellation=32, bool toLeftHanded=false)
Creates a torus primitive.
Describes a custom vertex format structure that contains position, normal and texture information...
static void RotationY(float angle, out Matrix result)
Creates a matrix that rotates around the y-axis.
Definition: Matrix.cs:2500
Performs primitive-based rendering, creates resources, handles system-level variables, adjusts gamma ramp levels, and creates shaders. See The+GraphicsDevice+class to learn more about the class.
static GeometricPrimitive New(GraphicsDevice device, float diameter=1.0f, float thickness=0.33333f, int tessellation=32, bool toLeftHanded=false)
Creates a torus primitive.
SiliconStudio.Core.Mathematics.Vector3 Vector3
Represents a 4x4 mathematical matrix.
Definition: Matrix.cs:47