Paradox Game Engine  v1.0.0 beta06
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Events Macros Pages
GeometricPrimitive.Cube.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 
77 using SiliconStudio.Core.Mathematics;
78 
79 namespace SiliconStudio.Paradox.Graphics
80 {
81  public partial class GeometricPrimitive
82  {
83  /// <summary>
84  /// A cube has six faces, each one pointing in a different direction.
85  /// </summary>
86  public struct Cube
87  {
88  private const int CubeFaceCount = 6;
89 
90  private static readonly Vector3[] faceNormals = new Vector3[CubeFaceCount]
91  {
92  new Vector3(0, 0, 1),
93  new Vector3(0, 0, -1),
94  new Vector3(1, 0, 0),
95  new Vector3(-1, 0, 0),
96  new Vector3(0, 1, 0),
97  new Vector3(0, -1, 0),
98  };
99 
100  private static readonly Vector2[] textureCoordinates = new Vector2[4]
101  {
102  new Vector2(1, 0),
103  new Vector2(1, 1),
104  new Vector2(0, 1),
105  new Vector2(0, 0),
106  };
107 
108  /// <summary>
109  /// Creates a cube with six faces each one pointing in a different direction.
110  /// </summary>
111  /// <param name="device">The device.</param>
112  /// <param name="size">The size.</param>
113  /// <param name="toLeftHanded">if set to <c>true</c> vertices and indices will be transformed to left handed. Default is false.</param>
114  /// <returns>A cube.</returns>
115  public static GeometricPrimitive New(GraphicsDevice device, float size = 1.0f, bool toLeftHanded = false)
116  {
117  // Create the primitive object.
118  return new GeometricPrimitive(device, New(size, toLeftHanded));
119  }
120 
121  /// <summary>
122  /// Creates a cube with six faces each one pointing in a different direction.
123  /// </summary>
124  /// <param name="size">The size.</param>
125  /// <param name="toLeftHanded">if set to <c>true</c> vertices and indices will be transformed to left handed. Default is false.</param>
126  /// <returns>A cube.</returns>
127  public static GeometricMeshData<VertexPositionNormalTexture> New(float size = 1.0f, bool toLeftHanded = false)
128  {
129  var vertices = new VertexPositionNormalTexture[CubeFaceCount * 4];
130  var indices = new int[CubeFaceCount * 6];
131 
132  size /= 2.0f;
133 
134  int vertexCount = 0;
135  int indexCount = 0;
136  // Create each face in turn.
137  for (int i = 0; i < CubeFaceCount; i++)
138  {
139  Vector3 normal = faceNormals[i];
140 
141  // Get two vectors perpendicular both to the face normal and to each other.
142  Vector3 basis = (i >= 4) ? Vector3.UnitZ : Vector3.UnitY;
143 
144  Vector3 side1;
145  Vector3.Cross(ref normal, ref basis, out side1);
146 
147  Vector3 side2;
148  Vector3.Cross(ref normal, ref side1, out side2);
149 
150  // Six indices (two triangles) per face.
151  int vbase = i * 4;
152  indices[indexCount++] = (vbase + 0);
153  indices[indexCount++] = (vbase + 1);
154  indices[indexCount++] = (vbase + 2);
155 
156  indices[indexCount++] = (vbase + 0);
157  indices[indexCount++] = (vbase + 2);
158  indices[indexCount++] = (vbase + 3);
159 
160  // Four vertices per face.
161  vertices[vertexCount++] = new VertexPositionNormalTexture((normal - side1 - side2) * size, normal, textureCoordinates[0]);
162  vertices[vertexCount++] = new VertexPositionNormalTexture((normal - side1 + side2) * size, normal, textureCoordinates[1]);
163  vertices[vertexCount++] = new VertexPositionNormalTexture((normal + side1 + side2) * size, normal, textureCoordinates[2]);
164  vertices[vertexCount++] = new VertexPositionNormalTexture((normal + side1 - side2) * size, normal, textureCoordinates[3]);
165  }
166 
167  // Create the primitive object.
168  return new GeometricMeshData<VertexPositionNormalTexture>(vertices, indices, toLeftHanded) {Name = "Cube"};
169  }
170  }
171  }
172 }
static void Cross(ref Vector3 left, ref Vector3 right, out Vector3 result)
Calculates the cross product of two vectors.
Definition: Vector3.cs:476
SiliconStudio.Paradox.Games.Mathematics.Vector2 Vector2
Represents a two dimensional mathematical vector.
Definition: Vector2.cs:42
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...
Represents a three dimensional mathematical vector.
Definition: Vector3.cs:42
static readonly Vector3 UnitZ
The Z unit SiliconStudio.Core.Mathematics.Vector3 (0, 0, 1).
Definition: Vector3.cs:67
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 readonly Vector3 UnitY
The Y unit SiliconStudio.Core.Mathematics.Vector3 (0, 1, 0).
Definition: Vector3.cs:62
SiliconStudio.Core.Mathematics.Vector3 Vector3
A cube has six faces, each one pointing in a different direction.
static GeometricMeshData< VertexPositionNormalTexture > New(float size=1.0f, bool toLeftHanded=false)
Creates a cube with six faces each one pointing in a different direction.
_In_ size_t _In_ size_t size
Definition: DirectXTexP.h:175
static GeometricPrimitive New(GraphicsDevice device, float size=1.0f, bool toLeftHanded=false)
Creates a cube with six faces each one pointing in a different direction.