﻿using System.IO;
using UnityEditor;
using UnityEditor.Experimental.AssetImporters;
using UnityEngine;

[ScriptedImporter(0, ".gmes")]
public class GaazarMesh : ScriptedImporter
{
    public override void OnImportAsset(AssetImportContext ctx)
    {
        string fileContent = File.ReadAllText(ctx.assetPath);
        GameObject m = ObjectFactory.CreateGameObject(Path.GetFileNameWithoutExtension(ctx.assetPath));
        GameObject g = ObjectFactory.CreateGameObject(Path.GetFileNameWithoutExtension(ctx.assetPath));
        MeshFilter mf = g.AddComponent<MeshFilter>();
        MeshRenderer mr = g.AddComponent<MeshRenderer>();
        Mesh mesh = ReadGmes(ctx.assetPath,g.transform);
        mesh.name = "mesh";
        mf.sharedMesh = mesh;
        g.name = "main";
        g.transform.SetParent(m.transform);
        ctx.AddObjectToAsset("main", g);
        ctx.AddObjectToAsset("mesh", mesh);
        //mr.sharedMaterial = Shader.Find("standard");
        ctx.AddObjectToAsset("None", m);
        ctx.SetMainObject(m);
    }
    Mesh ReadGmes(string path,Transform t)
    {
        Mesh mainMesh = new Mesh();
        FileStream fs = new FileStream(path, FileMode.Open);
        BinaryReader sr = new BinaryReader(fs);
        int geoCount = sr.ReadInt32();
        int[] indeces; Vector3[] verts; Vector2[] uv;
        mainMesh.subMeshCount = geoCount;
        CombineInstance[] ci = new CombineInstance[geoCount];
        for (int i = 0; i < geoCount; i++)
        {
            GetMesh(sr, out indeces, out verts, out uv);

            Mesh subMesh = new Mesh();
            subMesh.vertices = verts;
            subMesh.triangles = indeces;
            subMesh.uv = uv;
            ci[i].mesh = subMesh;
            ci[i].transform = t.localToWorldMatrix;

        }
        mainMesh.CombineMeshes(ci,false);
        sr.Dispose();
        return mainMesh;
    }
    void GetMesh(BinaryReader br, out int[] indeces, out Vector3[] verts, out Vector2[] uv)
    {
        indeces = new int[0];
        verts = new Vector3[0];
        uv = new Vector2[0];
        int indecesCount = br.ReadInt32();
        int vertices = br.ReadInt32();
        indeces = new int[indecesCount];
        verts = new Vector3[vertices];
        uv = new Vector2[vertices];
        for (int n = 0; n < indecesCount; n++)
        {
            indeces[n] = br.ReadInt32();
        }
        for (int n = 0; n < vertices; n++)
        {
            float x, y, z;
            x = br.ReadSingle();
            y = br.ReadSingle();
            z = br.ReadSingle();
            verts[n] = new Vector3(x, y, z);
        }
        for (int n = 0; n < vertices; n++)
        {
            float x, y;
            x = br.ReadSingle();
            y = br.ReadSingle();
            uv[n] = new Vector2(x, y);
        }
    }

}