private void AddMesh(Model3DGroup group, render_model.ModelSection part, render_model.ModelSection.Submesh submesh, bool force) { try { var geom = new MeshGeometry3D(); var iList = ModelFunctions.GetTriangleList(part.Indices, submesh.FaceIndex, submesh.FaceCount, mode.IndexInfoList[part.FacesIndex].FaceFormat); int min = iList.Min(); int max = iList.Max(); for (int i = 0; i < iList.Count; i++) { iList[i] -= min; } var vArray = new Vertex[(max - min) + 1]; Array.Copy(part.Vertices.ToArray(), min, vArray, 0, (max - min) + 1); foreach (var vertex in vArray) { if (vertex == null) { continue; } VertexValue pos, tex, norm; vertex.TryGetValue("position", 0, out pos); vertex.TryGetValue("texcoords", 0, out tex); geom.Positions.Add(new Point3D(pos.Data.x, pos.Data.y, pos.Data.z)); geom.TextureCoordinates.Add(new System.Windows.Point(tex.Data.x, 1f - tex.Data.y)); if (vertex.TryGetValue("normal", 0, out norm)) { geom.Normals.Add(new Vector3D(norm.Data.x, norm.Data.y, norm.Data.z)); } } foreach (var index in iList) { geom.TriangleIndices.Add(index); } GeometryModel3D modeld = new GeometryModel3D(geom, shaders[submesh.ShaderIndex]) { BackMaterial = shaders[submesh.ShaderIndex] }; group.Children.Add(modeld); } catch (Exception ex) { if (!force) { throw ex; } } }
private void AddCopy(Model3DGroup newGroup, Model3DGroup oldGroup, render_model.ModelSection part, int submeshIndex, bool force) { try { GeometryModel3D modeld = new GeometryModel3D(); modeld.Geometry = ((GeometryModel3D)oldGroup.Children[submeshIndex]).Geometry; modeld.Material = modeld.BackMaterial = shaders[part.Submeshes[submeshIndex].ShaderIndex]; newGroup.Children.Add(modeld); } catch (Exception ex) { if (!force) { throw ex; } } }