コード例 #1
0
ファイル: BspReader.cs プロジェクト: gleblebedev/toe
		protected override void BuildScene()
		{
			var maxTextures = this.textures.Length;

			SeparateStreamsSubmesh[] submeshes = new SeparateStreamsSubmesh[maxTextures];
			this.BuildSubmeshes(maxTextures, submeshes, streamMesh, meshStreams);
			var submeshStreams = submeshes.Select(x => (x == null)?null: new BspSubmeshStreams(x, meshStreams,StreamConverterFactory)).ToArray();

			var node = new Node();
			this.Scene.Nodes.Add(node);
			node.Mesh = streamMesh;

			foreach (var quake3Face in this.faces)
			{
				switch (quake3Face.type)
				{
					case 2: //Patch
						this.BuildPatch(quake3Face, submeshStreams[quake3Face.texinfo_id]);

						break;
					case 1: //Polygon
					case 3: //Mesh
						for (int i = 0; i < quake3Face.numMeshVerts; ++i)
						{

							AddVertexToMesh((int)(quake3Face.vertexIndex + this.meshverts[quake3Face.meshVertIndex + i]),submeshStreams[quake3Face.texinfo_id]);
						}
						break;
					case 4: //Billboard
						break;
				}
			}
			this.Scene.Geometries.Add(streamMesh);
		}
コード例 #2
0
ファイル: BspSubmeshStreams.cs プロジェクト: gleblebedev/toe
		public BspSubmeshStreams(SeparateStreamsSubmesh separateStreamsSubmesh, BspMeshStreams meshStreams,IStreamConverterFactory streamConverterFactory)
		{
			this.streamConverterFactory = streamConverterFactory;
			if (meshStreams.Positions != null)
			{
				PositionIndices = EnsureStream(separateStreamsSubmesh, Streams.Position, 0);
			}
			if (meshStreams.Normals != null)
				NormalIndices = EnsureStream(separateStreamsSubmesh, Streams.Normal, 0);
			if (meshStreams.TexCoord0 != null)
				TexCoord0Indices = EnsureStream(separateStreamsSubmesh, Streams.TexCoord, 0);
			if (meshStreams.TexCoord1 != null)
				TexCoord1Indices = EnsureStream(separateStreamsSubmesh, Streams.TexCoord, 1);
			if (meshStreams.Colors != null)
				ColorsIndices = EnsureStream(separateStreamsSubmesh, Streams.Color, 0);
		}
コード例 #3
0
ファイル: BspSubmeshStreams.cs プロジェクト: gleblebedev/toe
		private ListMeshStream<int> EnsureStream(SeparateStreamsSubmesh separateStreamsSubmesh, string key, int channel)
		{
			return separateStreamsSubmesh.GetIndexStream(key, channel) as ListMeshStream<int> ?? separateStreamsSubmesh.SetIndexStream(key, channel, new ListMeshStream<int>(streamConverterFactory));
		}
コード例 #4
0
ファイル: DaeReader.cs プロジェクト: gleblebedev/toe
		private List<Tuple<int, ListMeshStream<int>>> StreamListOrderedByOffset(MeshInputs meshInputs, SeparateStreamsSubmesh subMesh)
		{
			var streamList = new List<Tuple<int, ListMeshStream<int>>>();
			foreach (var meshInput in meshInputs.Inputs.OrderBy(x => x.Offset))
			{
				var listMeshStream = new ListMeshStream<int>(meshInputs.Count, streamConverterFactory);
				streamList.Add(new Tuple<int, ListMeshStream<int>>(meshInput.Offset, listMeshStream));
				var key = meshInput.Semantic;
				if (key == "VERTEX") key = Streams.Position;
				subMesh.SetIndexStream(key, meshInput.Set, listMeshStream);
			}
			return streamList;
		}
コード例 #5
0
ファイル: BspReader.cs プロジェクト: gleblebedev/toe
		private void BuildSubmeshes(int maxTextures, SeparateStreamsSubmesh[] submeshes, SeparateStreamsMesh streamMesh, BspMeshStreams meshStreams)
		{
			int[] textureToMaterial = new int[maxTextures];
			foreach (var quake3Face in this.faces)
			{
				++textureToMaterial[quake3Face.texinfo_id];
			}
			for (int i = 0; i < maxTextures; ++i)
			{
				if (textureToMaterial[i] > 0)
				{
					submeshes[i] = streamMesh.CreateSubmesh();
					int index = this.Scene.Materials.Count;
					var baseFileName = Path.Combine(this.GameRootPath, this.textures[i].name);
					var imagePath = baseFileName;
					if (!File.Exists(imagePath))
					{
						imagePath = baseFileName + ".jpg";
						if (!File.Exists(imagePath))
						{
							imagePath = baseFileName + ".png";
							if (!File.Exists(imagePath))
							{
								imagePath = baseFileName + ".tga";
								if (!File.Exists(imagePath))
								{
									imagePath = this.textures[i].name;
								}
							}
						}
					}
					var texture = new FileReferenceImage { Path = imagePath };
					this.Scene.Images.Add(texture);
					var effect = new SceneEffect { Diffuse = new ImageColorSource { Image = texture }, CullMode = CullMode.Front};
					this.Scene.Effects.Add(effect);
					var sceneMaterial = new SceneMaterial { Effect = effect };
					this.Scene.Materials.Add(sceneMaterial);
					submeshes[i].Material = sceneMaterial;
					textureToMaterial[i] = index;
				}
			}
		}