Esempio n. 1
0
    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
            });
        }
    }
Esempio n. 2
0
        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
                });
            }
        }
Esempio n. 3
0
        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
                });
            }
        }