Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
GeometricPrimitive.Capsule.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 SiliconStudio.Core.Mathematics;
78 
79 namespace SiliconStudio.Paradox.Graphics
80 {
81  public partial class GeometricPrimitive
82  {
83  /// <summary>
84  /// A sphere primitive.
85  /// </summary>
86  public struct Capsule
87  {
88  /// <summary>
89  /// Creates a sphere primitive.
90  /// </summary>
91  /// <param name="device">The device.</param>
92  /// <param name="diameter">The diameter.</param>
93  /// <param name="tessellation">The tessellation.</param>
94  /// <param name="toLeftHanded">if set to <c>true</c> vertices and indices will be transformed to left handed. Default is false.</param>
95  /// <returns>A sphere primitive.</returns>
96  /// <exception cref="System.ArgumentOutOfRangeException">tessellation;Must be >= 3</exception>
97  public static GeometricPrimitive New(GraphicsDevice device, float height = 1.0f, float radius = 0.5f, int tessellation = 16, bool toLeftHanded = false)
98  {
99  return new GeometricPrimitive(device, New(height, radius, tessellation, toLeftHanded));
100  }
101 
102  /// <summary>
103  /// Creates a sphere primitive.
104  /// </summary>
105  /// <param name="diameter">The diameter.</param>
106  /// <param name="tessellation">The tessellation.</param>
107  /// <param name="toLeftHanded">if set to <c>true</c> vertices and indices will be transformed to left handed. Default is false.</param>
108  /// <returns>A sphere primitive.</returns>
109  /// <exception cref="System.ArgumentOutOfRangeException">tessellation;Must be >= 3</exception>
110  public static GeometricMeshData<VertexPositionNormalTexture> New(float height = 1.0f, float radius = 0.5f, int tessellation = 16, bool toLeftHanded = false)
111  {
112  if (tessellation < 3) throw new ArgumentOutOfRangeException("tessellation", "Must be >= 3");
113 
114  int verticalSegments = tessellation;
115  int horizontalSegments = tessellation * 2;
116 
117  var vertices = new VertexPositionNormalTexture[(verticalSegments + 1) * (horizontalSegments + 1)];
118  var indices = new int[(verticalSegments) * (horizontalSegments + 1) * 6];
119 
120  var middle = verticalSegments / 2;
121 
122  int vertexCount = 0;
123  // Create rings of vertices at progressively higher latitudes.
124  for (int i = 0; i <= verticalSegments; i++)
125  {
126  float v = 1.0f - (float)i / verticalSegments;
127 
128  var latitude = (float)((i * Math.PI / verticalSegments) - Math.PI / 2.0);
129  var dy = (float)Math.Sin(latitude);
130  var dxz = (float)Math.Cos(latitude);
131 
132  var deltaY = latitude <= 0.0f ? -height : height;
133  dy += deltaY;
134 
135  // Create a single ring of vertices at this latitude.
136  for (int j = 0; j <= horizontalSegments; j++)
137  {
138  float u = (float)j / horizontalSegments;
139 
140  var longitude = (float)(j * 2.0 * Math.PI / horizontalSegments);
141  var dx = (float)Math.Sin(longitude);
142  var dz = (float)Math.Cos(longitude);
143 
144  dx *= dxz;
145  dz *= dxz;
146 
147  var normal = new Vector3(dx, dy, dz);
148  var textureCoordinate = new Vector2(u, v);
149 
150  vertices[vertexCount++] = new VertexPositionNormalTexture(normal * radius, normal, textureCoordinate);
151  }
152  }
153 
154  // Fill the index buffer with triangles joining each pair of latitude rings.
155  int stride = horizontalSegments + 1;
156 
157  int indexCount = 0;
158  for (int i = 0; i < verticalSegments; i++)
159  {
160  for (int j = 0; j <= horizontalSegments; j++)
161  {
162  int nextI = i + 1;
163  int nextJ = (j + 1) % stride;
164 
165  indices[indexCount++] = (i * stride + j);
166  indices[indexCount++] = (nextI * stride + j);
167  indices[indexCount++] = (i * stride + nextJ);
168 
169  indices[indexCount++] = (i * stride + nextJ);
170  indices[indexCount++] = (nextI * stride + j);
171  indices[indexCount++] = (nextI * stride + nextJ);
172  }
173  }
174 
175  // Create the primitive object.
176  // Create the primitive object.
177  return new GeometricMeshData<VertexPositionNormalTexture>(vertices, indices, toLeftHanded) { Name = "Capsule" };
178  }
179  }
180  }
181 }
SiliconStudio.Paradox.Games.Mathematics.Vector2 Vector2
static GeometricMeshData< VertexPositionNormalTexture > New(float height=1.0f, float radius=0.5f, int tessellation=16, bool toLeftHanded=false)
Creates a sphere primitive.
A geometric primitive. Use Cube, Cylinder, GeoSphere, Plane, Sphere, Teapot, Torus. See Draw+vertices to learn how to use it.
Describes a custom vertex format structure that contains position, normal and texture information...
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 height=1.0f, float radius=0.5f, int tessellation=16, bool toLeftHanded=false)
Creates a sphere primitive.
SiliconStudio.Core.Mathematics.Vector3 Vector3