示例#1
0
		internal override void CalculateTangents(TangentMixer t, TangentMixer b)
		{
			throw new NotImplementedException();
		}
示例#2
0
		internal virtual void CalculateTangents(TangentMixer t, TangentMixer b)
		{
			//throw new System.NotImplementedException();
		}
示例#3
0
		internal override void CalculateTangents(TangentMixer t, TangentMixer b)
		{
			switch (this.VertexSourceType)
			{
				case VertexSourceType.QuadList:
					this.CalculateTangentsQuadList(t, b);
					return;
				case VertexSourceType.TriangleList:
					this.CalculateTangentsTrianleList(t, b);
					return;
				case VertexSourceType.TriangleStrip:
					this.CalculateTangentsTrianleStrip(t, b);
					return;
			}
		}
示例#4
0
		private void CalculateTangentsTrianleStrip(TangentMixer t, TangentMixer b)
		{
			throw new NotImplementedException();
		}
示例#5
0
		private void CalculateTangentsTrianleList(TangentMixer t, TangentMixer b)
		{
			for (int i = 0; i < this.indices.Count; i += 3)
			{
				Vector3 p2 = this.Mesh.Vertices[this.indices[i + 2].Vertex];
				Vector3 p1 = this.Mesh.Vertices[this.indices[i + 1].Vertex];
				Vector3 p0 = this.Mesh.Vertices[this.indices[i].Vertex];

				Vector3 n2 = this.Mesh.Normals[this.indices[i + 2].Normal];
				Vector3 n1 = this.Mesh.Normals[this.indices[i + 1].Normal];
				Vector3 n0 = this.Mesh.Normals[this.indices[i].Normal];

				Vector3 v1 = p1 - p0;
				Vector3 v2 = p2 - p0;

				var pu0 = this.Mesh.IsUV0StreamAvailable?this.Mesh.UV0[this.indices[i].UV0]:Vector2.Zero;
				var pu1 = this.Mesh.IsUV0StreamAvailable?this.Mesh.UV0[this.indices[i + 1].UV0]:Vector2.Zero;
				var pu2 = this.Mesh.IsUV0StreamAvailable ? this.Mesh.UV0[this.indices[i + 2].UV0] : Vector2.Zero;

				var u1 = pu1 - pu0;
				var u2 = pu2 - pu0;

				var det = u1.X * u2.Y - u2.X * u1.Y;
				if (det == 0)
				{
					det = 1;
				}
				det = 1 / det;

				var tangent =
					Vector3.Normalize(
						new Vector3(
							(v1.X * u2.Y - v2.X * u1.Y) * det, (v1.Y * u2.Y - v2.Y * u1.Y) * det, (v1.Z * u2.Y - v2.Z * u1.Y) * det));
				var bitangent =
					Vector3.Normalize(
						new Vector3(
							(-v1.X * u2.X + v2.X * u1.X) * det, (-v1.Y * u2.X + v2.Y * u1.X) * det, (-v1.Z * u2.X + v2.Z * u1.X) * det));

				var key0 = new TangentKey(p0, pu0);
				var key1 = new TangentKey(p1, pu1);
				var key2 = new TangentKey(p2, pu2);

				{
					var old = this.indices[i]; 
					old.Tangent = t.Add(key0, ref n0, tangent);
					old.Binormal = b.Add(key0, ref n0, bitangent);
					this.indices[i] = old;
				}
				{
					var old = this.indices[i+1];
					old.Tangent = t.Add(key1, ref n1, tangent);
					old.Binormal = b.Add(key1, ref n1, bitangent);
					this.indices[i+1] = old;
				}
				{
					var old = this.indices[i + 2];
					old.Tangent = t.Add(key2, ref n2, tangent);
					old.Binormal = b.Add(key2, ref n2, bitangent);
					this.indices[i + 2] = old;
				}
			}
		}
示例#6
0
		private void CalculateTangentsQuadList(TangentMixer t, TangentMixer b)
		{
			throw new NotImplementedException();
		}