private void BuildNormalMesh(NiGeometry triShape, GameObject holder) { if (!(triShape.Data.Object is NiTriShapeData data)) { throw new Exception($"{_context.assetPath} has invalid NiTriShapeData."); } var mesh = new Mesh { name = triShape.Name, vertices = data.HasVertices ? data.Vertices.Select(s => (Vector3)s).ToArray() : null, triangles = data.HasTriangles ? data.Triangles.SelectMany(s => s != null ? (int[])s : new int[0]).ToArray() : null, normals = data.HasNormals ? data.Normals.Select(s => (Vector3)s).ToArray() : null, colors = data.HasVertexColors ? data.VertexColors.Select(s => new Color(s.R, s.G, s.B, s.A)).ToArray() : null, tangents = data.Tangents?.Select(s => (Vector4)(Vector3)s).ToArray(), bounds = new Bounds(data.Center, Vector3.one * data.Radius) }; for (var i = 0; i < data.Uv.Length; i++) { var uvLayer = data.Uv[i]; mesh.SetUVs(i, uvLayer.Select(s => (Vector2)s).ToList()); } var filter = holder.AddComponent <MeshFilter>(); var renderer = holder.AddComponent <MeshRenderer>(); RegisterRenderer(renderer); /* * renderer.sharedMaterial = new Material(Shader.Find("Nif/VertexColor")); * _context.AddObjectToAsset($"Lit {holder.name}", renderer.sharedMaterial); */ filter.mesh = mesh; _context.AddObjectToAsset(mesh.name, mesh); if (triShape.SkinInstance.Key != -1) { _skinMeshes.Add(new SkinMesh { Holder = holder, SkinInstance = triShape.SkinInstance.Object }); } }
private void BuildNormalMesh(NiGeometry triShape, GameObject holder) { if (!(triShape.Data.Object is NiTriShapeData data)) { throw new Exception($"{_assetPath} has invalid NiTriShapeData."); } var mesh = new Mesh { name = triShape.Name, vertices = data.HasVertices ? data.Vertices.Select(s => (Vector3)s).ToArray() : null, triangles = data.HasTriangles ? data.Triangles.SelectMany(s => s != null ? (int[])s : new int[0]).ToArray() : null, normals = data.HasNormals ? data.Normals.Select(s => (Vector3)s).ToArray() : null, colors = data.HasVertexColors ? data.VertexColors.Select(s => new Color(s.R, s.G, s.B, s.A)).ToArray() : null, tangents = data.Tangents?.Select(s => (Vector4)(Vector3)s).ToArray(), bounds = new Bounds(data.Center, Vector3.one * data.Radius) }; for (var i = 0; i < data.Uv.Length; i++) { var uvLayer = data.Uv[i]; mesh.SetUVs(i, uvLayer.Select(s => (Vector2)s).ToList()); } var filter = holder.AddComponent <MeshFilter>(); var renderer = holder.AddComponent <MeshRenderer>(); RegisterRenderer(renderer); renderer.sharedMaterial = DefaultMaterial; var textureProperty = triShape.GetProperty <NiTexturingProperty>(); if (textureProperty != null) { if (textureProperty.HasBaseTexture) { var image = textureProperty.BaseTexture.Source.Object.FilePath.String.ToLower(); if (!_textures.ContainsKey(image)) { try { Texture texture; switch (textureProperty.BaseTexture.Source.Object.FormatPrefs.Alpha) { case AlphaFormat.AlphaNone: texture = LoadTextureDxt( File.ReadAllBytes($"{Path.Combine(UniverseImporter.NifImportDir, image)}"), TextureFormat.DXT1 ); break; case AlphaFormat.AlphaBinary: case AlphaFormat.AlphaSmooth: case AlphaFormat.AlphaDefault: texture = LoadTextureDxt( File.ReadAllBytes($"{Path.Combine(UniverseImporter.NifImportDir, image)}"), TextureFormat.DXT5 ); break; default: throw new ArgumentOutOfRangeException(); } Debug.Log($"Got texture from {image}"); texture.name = $"{image} Texture"; var material = new Material(Shader.Find("Standard")) { mainTexture = texture, name = $"{image} Material" }; if (UniverseImporter.CheckTransparency) { switch (textureProperty.BaseTexture.Source.Object.FormatPrefs.Alpha) { case AlphaFormat.AlphaNone: break; case AlphaFormat.AlphaDefault: case AlphaFormat.AlphaSmooth: case AlphaFormat.AlphaBinary: StandardShaderUtils.ChangeRenderMode( material, StandardShaderUtils.BlendMode.Transparent ); break; default: throw new ArgumentOutOfRangeException(); } } material.SetTextureScale(MainTex, new Vector2(1, -1)); Debug.Log($"Loaded texture {image}"); _textures.Add(image, material); } catch { Debug.Log($"Failed to load texture {image}"); } } if (_textures.ContainsKey(image)) { Debug.Log($"Got texture {image}"); renderer.material = _textures[image]; } } } filter.mesh = mesh; if (triShape.SkinInstance.Key != -1) { _skinMeshes.Add(new SkinMesh { Holder = holder, SkinInstance = triShape.SkinInstance.Object }); } }
private void BuildStripsMesh(NiGeometry triStrips, GameObject holder) { if (!(triStrips.Data.Object is NiTriStripsData data)) { throw new Exception($"{_assetPath} has invalid NiTriStripsData."); } var triangles = new List <int>(); foreach (var point in data.Points) { Debug.Log(point.Length); for (var i = 0; i < point.Length - 2; i++) { triangles.AddRange(new int[] { point[i], point[i + 1], point[i + 2] }); } } var mesh = new Mesh { name = triStrips.Name, vertices = data.HasVertices ? data.Vertices.Select(s => (Vector3)s).ToArray() : null, normals = data.HasNormals ? data.Normals.Select(s => (Vector3)s).ToArray() : null, colors = data.HasVertexColors ? data.VertexColors.Select(s => new Color(s.R, s.G, s.B, s.A)).ToArray() : null, tangents = data.Tangents?.Select(s => (Vector4)(Vector3)s).ToArray(), bounds = new Bounds(data.Center, Vector3.one * data.Radius), triangles = triangles.ToArray() }; for (var i = 0; i < data.Uv.Length; i++) { var uvLayer = data.Uv[i]; mesh.SetUVs(i, uvLayer.Select(s => (Vector2)s).ToList()); } mesh.SetIndices(data.Points.SelectMany(s => s.Select(t => (int)t)).ToArray(), MeshTopology.Lines, 0); var filter = holder.AddComponent <MeshFilter>(); var renderer = holder.AddComponent <MeshRenderer>(); RegisterRenderer(renderer); renderer.sharedMaterial = DefaultMaterial; filter.mesh = mesh; if (triStrips.SkinInstance.Key != -1) { _skinMeshes.Add(new SkinMesh { Holder = holder, SkinInstance = triStrips.SkinInstance.Object }); } }