예제 #1
0
    public static Mesh GetCacheItem(string url)
    {
        string path = Path.Combine(Application.persistentDataPath, url);

        if (File.Exists(path) == true)
        {
            byte[] bytes = File.ReadAllBytes(path);
            return(MeshSerializer.ReadMesh(bytes));
        }
        return(null);
    }
예제 #2
0
        void CreateMesh()
        {
            Debug.Log("CreateMesh");
            int index = 0;

            foreach (byte[] mesh in meshDic.Values)
            {
                GameObject tempObj = Instantiate(this.originMesh, transform);
                tempObj.GetComponent <MeshFilter>().sharedMesh   = MeshSerializer.ReadMesh(mesh);
                tempObj.GetComponent <MeshCollider>().sharedMesh = MeshSerializer.ReadMesh(mesh);
                tempObj.name = string.Format("Mesh {0}", index++);
            }
        }
예제 #3
0
    public static GameObject ReadAssetFromDisk(string filePath, string alternativeName)
    {
        var  bin = File.ReadAllBytes(filePath);
        Mesh m   = MeshSerializer.ReadMesh(bin);

        GameObject g = new GameObject(System.IO.Path.GetFileNameWithoutExtension(filePath));

        if (!string.IsNullOrEmpty(alternativeName))
        {
            g.name = alternativeName;
        }
        var mf = g.AddComponent <MeshFilter>();

        mf.sharedMesh = m;
        var coll = g.AddComponent <MeshCollider>();

        coll.sharedMesh = m;
        g.AddComponent <MeshRenderer>();
        return(g);
    }
예제 #4
0
    public static Mesh LoadMesh(string filename)
    {
        filename = filename.Replace(":", "-");
        string path = Application.persistentDataPath + "/" + filename + ".mesh";

        try
        {
            Byte[] bytes = System.IO.File.ReadAllBytes(path);
            return(MeshSerializer.ReadMesh(bytes));
        }
        catch (Exception e)
        {
            if (verbose)
            {
                Debug.Log("Load Mesh Exception: " + e.Message);
            }
        }

        return(null);
    }
예제 #5
0
    public void SetSdToObject() // load한 데이터를 오브젝트에 넣음
    {
        gameObject.name = sd.mFurniture;
        gameObject.transform.position   = sd.mPosition;
        gameObject.transform.rotation   = sd.mRotation;
        gameObject.transform.localScale = Vector3.one;
        gameObject.transform.localScale = new Vector3(
            sd.mScale.x / gameObject.transform.lossyScale.x,
            sd.mScale.y / gameObject.transform.lossyScale.y,
            sd.mScale.z / gameObject.transform.lossyScale.z);

        if (gameObject.GetComponent <changeColor>() != null)
        {
            gameObject.GetComponent <changeColor>().Start();
            gameObject.GetComponent <changeColor>().SetColor(sd.mColor);
        }
        if (gameObject.GetComponent <MeshFilter>() != null)
        {
            gameObject.GetComponent <MeshFilter>().mesh = MeshSerializer.ReadMesh(sd.mesh);
        }
    }
예제 #6
0
    public void LoadChunk(int x, int y)
    {
        //if chunk has already been initialised, return or set active if not active
        if (GameObject.Find("chunk: " + x + ", " + y))
        {
            if (GameObject.Find("chunk: " + x + ", " + y).activeSelf)
            {
                return;
            }

            GameObject.Find("chunk: " + x + ", " + y).SetActive(true);
        }

        //chunk gameobject setup

        GameObject newChunk  = MakeChunk(x, y);
        Mesh       chunkMesh = new Mesh();

        chunkMesh.name = x + ", " + y;

        // loading a chunk mesh, if not found a new one is generated

        string path = Path.Combine(Application.persistentDataPath, x + ", " + y);

        if (File.Exists(path) == true)
        {
            byte[] bytes = File.ReadAllBytes(path);
            chunkMesh = MeshSerializer.ReadMesh(bytes);
        }
        else
        {
            chunkMesh = GenerateChunk(x, y, chunkSize, magnitude, frequency);
        }

        chunkMesh.RecalculateNormals();
        newChunk.GetComponent <MeshFilter>().mesh         = chunkMesh;
        newChunk.GetComponent <MeshCollider>().sharedMesh = chunkMesh;
        newChunk.GetComponent <MeshRenderer>().material   = chunkMat;
    }
예제 #7
0
파일: LoadMesh.cs 프로젝트: lcbasu/Unity
    void  Update()
    {
        string path = "Assets/Resources/Meshes/";
        Mesh   mesh = MeshSerializer.ReadMesh(File.ReadAllBytes(path + fileName));

        if (mesh && !meshLoaded)
        {
            Debug.LogError("Mesh loaded");
            meshLoaded = true;
            MeshFilter meshFilter = GetComponent <MeshFilter>();
            if (!meshFilter)
            {
                meshFilter = gameObject.AddComponent <MeshFilter>();
                gameObject.AddComponent <MeshRenderer>();
                GetComponent <Renderer>().material.color = Color.red;
            }
            meshFilter.mesh = mesh;
        }
        else if (!mesh)
        {
            Debug.LogError("Failed to load mesh");
            return;
        }
    }
예제 #8
0
    public VesselControl.Vessel DrawVessel(MemoryBridge memoryBridge, Material drawMat, string vesselName)
    {
        VesselControl.Vessel newVessel;
        this.memoryBridge = memoryBridge;
        this.vesselName   = vesselName;

        var binFormatter = new BinaryFormatter();
        var mStream      = new MemoryStream();

        meshList = new List <Mesh>();
        parts    = new List <Part>();
        // partList = new List<VesselPart>();

        var vesselObject = new GameObject();

        vesselObject.name = vesselName;
        vessel            = vesselObject.transform;
        vessel.SetParent(transform);
        vessel.position         = Vector3.zero;
        vessel.localEulerAngles = Vector3.zero;
        //DebugVector.DrawVector(vessel);

        var modelObject = new GameObject();

        modelObject.name = "Vessel Offset";
        vesselOffset     = modelObject.transform;
        vesselOffset.SetParent(vessel);
        vesselOffset.position         = Vector3.zero;
        vesselOffset.localEulerAngles = Vector3.zero;

        if (vesselFile == null)
        {
            vesselFile = MemoryMappedFile.Open(MapAccess.FileMapAllAccess, "VesselFile" + memoryBridge.fileName);
        }

        if (vesselFile == null)
        {
            Debug.Log("file is null");
#if UNITY_EDITOR
            UnityEditor.EditorApplication.isPlaying = false;
#endif
        }


        int byteCount = 0;
        int partCount = 0;

        using (Stream mapStream = vesselFile.MapView(MapAccess.FileMapAllAccess, 0, 8))
        {
            var totalByteBuffer = new byte[4];
            var partCountBuffer = new byte[4];

            mapStream.Read(totalByteBuffer, 0, 4);
            mapStream.Read(partCountBuffer, 0, 4);

            byteCount = BitConverter.ToInt32(totalByteBuffer, 0);
            partCount = BitConverter.ToInt32(partCountBuffer, 0);
        }
        using (Stream mapStream = vesselFile.MapView(MapAccess.FileMapAllAccess, 0, byteCount))
        {
            mapStream.Position = 8;

            for (int i = 0; i < partCount; i++)
            {
                List <MeshRenderer> meshRenderers = new List <MeshRenderer>();
                //part unique id
                var totalpartBuffer = new byte[4];
                mapStream.Read(totalpartBuffer, 0, 4);
                var uniqueID = BitConverter.ToSingle(totalpartBuffer, 0);

                //parent unique id
                totalpartBuffer = new byte[4];
                mapStream.Read(totalpartBuffer, 0, 4);
                var parentUniqueID = BitConverter.ToSingle(totalpartBuffer, 0);

                //filter count
                totalpartBuffer = new byte[4];
                mapStream.Read(totalpartBuffer, 0, 4);
                var filterCount = BitConverter.ToSingle(totalpartBuffer, 0);

                GameObject newPart       = new GameObject();
                var        newPartObject = newPart.AddComponent(typeof(Part)) as Part;


                Vector3 vesselPartOffset = Vector3.zero;
                var     tempBuffer       = new Byte[4];
                mapStream.Read(tempBuffer, 0, 4);
                vesselPartOffset.x = BitConverter.ToSingle(tempBuffer, 0);
                mapStream.Read(tempBuffer, 0, 4);
                vesselPartOffset.y = BitConverter.ToSingle(tempBuffer, 0);
                mapStream.Read(tempBuffer, 0, 4);
                vesselPartOffset.z = BitConverter.ToSingle(tempBuffer, 0);
                newPart.transform.localPosition = vesselPartOffset;

                //rot offset
                Vector3 vesselPartRotOffset = Vector3.zero;
                tempBuffer = new Byte[4];
                mapStream.Read(tempBuffer, 0, 4);
                vesselPartRotOffset.x = BitConverter.ToSingle(tempBuffer, 0);
                mapStream.Read(tempBuffer, 0, 4);
                vesselPartRotOffset.y = BitConverter.ToSingle(tempBuffer, 0);
                mapStream.Read(tempBuffer, 0, 4);
                vesselPartRotOffset.z = BitConverter.ToSingle(tempBuffer, 0);
                newPart.transform.localEulerAngles = vesselPartRotOffset;

                //part name
                mapStream.Read(tempBuffer, 0, 4);
                var stringByteLength = BitConverter.ToSingle(tempBuffer, 0);
                var stringBuffer     = new byte[(int)stringByteLength];
                mapStream.Read(stringBuffer, 0, stringBuffer.Length);
                newPartObject.kspPartName = ASCIIEncoding.ASCII.GetString(stringBuffer);


                GameObject meshObjects = new GameObject();
                meshObjects.name         = "Mesh Objects";
                newPartObject.partMeshes = meshObjects;
                meshObjects.transform.SetParent(newPart.transform);
                meshObjects.transform.localEulerAngles = Vector3.zero;

                for (int k = 0; k < filterCount; k++)
                {
                    //Debug.Log("start writing filter at " + mapStream.Position);
                    var newMesh = Instantiate(Resources.Load("BlankPart", typeof(GameObject))) as GameObject;
                    newMesh.transform.SetParent(newPart.transform);
                    meshRenderers.Add(newMesh.GetComponent <MeshRenderer>());
                    newMesh.GetComponent <MeshRenderer>().material = drawMat;

                    Vector3 posVector = Vector3.zero;
                    tempBuffer = new Byte[4];
                    mapStream.Read(tempBuffer, 0, 4);
                    posVector.x = BitConverter.ToSingle(tempBuffer, 0);
                    mapStream.Read(tempBuffer, 0, 4);
                    posVector.y = BitConverter.ToSingle(tempBuffer, 0);
                    mapStream.Read(tempBuffer, 0, 4);
                    posVector.z = BitConverter.ToSingle(tempBuffer, 0);
                    newMesh.transform.localPosition = posVector;

                    var localEuler = Vector3.zero;
                    // tempBuffer = new Byte[4];
                    mapStream.Read(tempBuffer, 0, 4);
                    localEuler.x = BitConverter.ToSingle(tempBuffer, 0);
                    mapStream.Read(tempBuffer, 0, 4);
                    localEuler.y = BitConverter.ToSingle(tempBuffer, 0);
                    mapStream.Read(tempBuffer, 0, 4);
                    localEuler.z = BitConverter.ToSingle(tempBuffer, 0);
                    newMesh.transform.localEulerAngles = localEuler;

                    Vector3 scaleVector = Vector3.zero;
                    //  tempBuffer = new Byte[4];
                    mapStream.Read(tempBuffer, 0, 4);
                    scaleVector.x = BitConverter.ToSingle(tempBuffer, 0);
                    mapStream.Read(tempBuffer, 0, 4);
                    scaleVector.y = BitConverter.ToSingle(tempBuffer, 0);
                    mapStream.Read(tempBuffer, 0, 4);
                    scaleVector.z = BitConverter.ToSingle(tempBuffer, 0);
                    newMesh.transform.localScale = scaleVector;

                    var lengthBuffer = new Byte[4];
                    mapStream.Read(lengthBuffer, 0, 4);
                    var byteMeshLength = BitConverter.ToSingle(lengthBuffer, 0);


                    var meshBuffer = new Byte[(int)byteMeshLength];
                    mapStream.Read(meshBuffer, 0, (int)byteMeshLength);
                    newMesh.GetComponent <MeshFilter>().mesh = MeshSerializer.ReadMesh(meshBuffer);

                    //not sure why this doesnt work up top, but too lazy to figure it out
                    newMesh.transform.SetParent(meshObjects.transform);
                }

                newPartObject.CustomAwake((int)uniqueID, (int)parentUniqueID, vesselName, meshRenderers);
                parts.Add(newPartObject);
            }
        }

        newVessel.transform  = vessel;
        newVessel.parts      = parts;
        newVessel.meshOffset = vesselOffset;

        foreach (var part in newVessel.parts)
        {
            part.vessel = newVessel;
            part.FindParent();
        }
        return(newVessel);
    }
예제 #9
0
    private void OnDeserialized()
    { //So, we need to mod a little bit
        bool av = true;

        try
        { //First, try to know if the data come from Editor
            Vector3[] v = vertices;
            if (v.Length == 0)
            {
                av = false;
            }
        }
        catch
        {               //If it's from Editor nothing wouldn't be stored, so we have to take action in it...
            av = false; // vv As we saved it before in GameObject_DirectConvert, we can restore it safely!
        }
        Mesh mesh = new Mesh();

        if (av)
        {
            mesh.vertices     = vertices;
            mesh.normals      = normals;
            mesh.uv           = uv;
            mesh.uv2          = uv1;
            mesh.uv2          = uv2;
            mesh.colors       = colors;
            mesh.tangents     = tangents;
            mesh.subMeshCount = subMeshCount;
            for (var i = 0; i < subMeshCount; ++i)
            {
                mesh.SetTriangles(triangles[i], i);
            }
            mesh.RecalculateBounds();
            if (filter != null)
            {
                filter.mesh = mesh;
            }
            else if (skinnedMeshRenderer != null)
            {
                skinnedMeshRenderer.sharedMesh = mesh;
            }
        }
        else
        { //If it's from Editor nothing wouldn't be stored, so we have to take action in it...
            byte[] b = SerializerHelpers.LoadAsset("Mesh/" + LevelLoader.Current.Last.name + ".asset");
            if (b == null)
            {
                Debug.LogErrorFormat("{0} mesh couldn't be loaded.", LevelLoader.Current.Last.name);
                return;
            }
            mesh = MeshSerializer.ReadMesh(b); //As we saved it before in GameObject_DirectConvert, we can restore it safely!
            if (mesh == null)
            {
                Debug.LogFormat("{0} couldn't be rebuilt.", LevelLoader.Current.Last.name);
                return;
            }
        }
        if (filter != null)
        {
            filter.mesh = mesh;
        }
        else if (skinnedMeshRenderer != null)
        {
            skinnedMeshRenderer.sharedMesh = mesh;
        }
    }