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); }
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); }
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)); }
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; }
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; } } }