Ejemplo n.º 1
0
    void UpdateMesh()
    {
        for (int i = 0; i < transform.childCount; i++)
        {
            Destroy(transform.GetChild(i).gameObject);
        }

        List <Mesh>   subsetMesh  = new List <Mesh> ();
        List <string> subsetNames = new List <string> ();

        if (Util.FileExist(path))
        {
            BC2Mesh    bc2mesh = null;
            GameObject go      = Instantiate(Util.GetMapload().empty, Vector3.zero, Quaternion.identity) as GameObject;


            bc2mesh = MeshDataImporter.LoadMeshRaw(path, uvOffset, bigFloat, inverted);


            int subsetInt = 0;
            subsetMesh  = bc2mesh.subMesh;
            subsetNames = bc2mesh.subMeshNames;
            foreach (Mesh sub in subsetMesh)
            {
                GameObject   subGO = (GameObject)Instantiate(Util.GetMapload().empty, Vector3.zero, Quaternion.identity);
                MeshRenderer mr    = subGO.AddComponent <MeshRenderer>();
                MeshFilter   mf    = subGO.AddComponent <MeshFilter>();
                MeshCollider mc    = subGO.AddComponent <MeshCollider> ();

                mr.material = new Material(Util.GetMapload().materialwhite);

                if (texture != "")
                {
                    mr.material.mainTexture = Util.LoadiTexture(texture);
                }
                mr.material.name = subsetNames[subsetInt];
                mf.mesh          = sub;
                mf.mesh.RecalculateNormals();
                subGO.name             = subsetNames[subsetInt];
                subGO.transform.parent = go.transform;
                mc.sharedMesh          = mf.mesh;
                subsetInt++;
            }
            if (bc2mesh.inverted)
            {
                Vector3 localScale = go.transform.localScale;
                localScale.x           *= -1;
                go.transform.localScale = localScale;
            }
        }
    }
Ejemplo n.º 2
0
    public GameObject loadMesh(string meshpath, string refMeshName)
    {
        GameObject go = Instantiate(emptyGO, Vector3.zero, Quaternion.identity) as GameObject;


        if (Util.FileExist(meshpath))
        {
            BC2Mesh bc2mesh = null;

            List <Mesh>   subsetMesh  = new List <Mesh> ();
            List <string> subsetNames = new List <string> ();
            int           subsetInt   = 0;

            if (!(instantiatedMeshDictionary.TryGetValue(meshpath, out bc2mesh)))
            {
                bc2mesh = MeshDataImporter.LoadMesh(meshpath);
                instantiatedMeshDictionary.Add(meshpath, bc2mesh);
            }



            subsetMesh  = bc2mesh.subMesh;
            subsetNames = bc2mesh.subMeshNames;
            foreach (Mesh sub in subsetMesh)
            {
                GameObject   subGO = (GameObject)Instantiate(emptyGO, Vector3.zero, Quaternion.identity);
                MeshRenderer mr    = subGO.AddComponent <MeshRenderer>();
                MeshFilter   mf    = subGO.AddComponent <MeshFilter>();
                mr.material.name = subsetNames[subsetInt];
                mf.mesh          = sub;
                mf.mesh.RecalculateNormals();
                subGO.name             = subsetNames[subsetInt];
                subGO.transform.parent = go.transform;

                subsetInt++;
            }
            if (bc2mesh.inverted)
            {
                Vector3 localScale = go.transform.localScale;
                localScale.x           *= -1;
                go.transform.localScale = localScale;
            }
        }
        return(go);
    }
Ejemplo n.º 3
0
    // Horrible!

    //public IEnumerator GenerateItem(Inst inst) {
    void GenerateItem(Inst inst)
    {
        Vector3          pos          = Util.GetPosition(inst);
        Quaternion       rot          = Util.GetRotation(inst);
        string           name         = "Unknown";
        string           mesh         = inst.type + " | " + inst.guid;
        List <Partition> partitions   = new List <Partition>();
        string           shaderName   = "";
        string           shaderPath   = "";
        string           refMeshClean = "";

        //This part is just trying to get the actual model name. It goes through different partitions and blueprints in order to get an accurate model name.
        //Normally, it's fine to just do name + _lod0_data, but sometimes we have objects that reference non-existant objects, such as container_large_blue.
        //While container_large exists, _blue is just referencing an other instance, and thus an other material for said container.
        //It's mostly not an issue.
        if (inst.type == "Entity.ReferenceObjectData" && Util.GetField("ReferencedObject", inst) != null && (Util.GetField("ReferencedObject", inst).reference != null && Util.GetField("ReferencedObject", inst).reference != "null"))
        {
            name = Util.GetField("ReferencedObject", inst).reference;

            string cleanName = Util.ClearGUIDString(name);
            string refGuid   = Util.GetGuid(name);


            Partition refPartition = Util.LoadPartition(cleanName);
            partitions.Add(refPartition);

            if (refPartition != null && name != "null")
            {
                Inst   bluePrint = Util.GetInst(refGuid, refPartition);
                string refObject = "";
                if (bluePrint != null)
                {
                    refObject = Util.GetField("Object", bluePrint).reference;
                }


                if (Util.GetInst(refObject, refPartition) != null)
                {
                    Inst staticModelEntityData = Util.GetInst(refObject, refPartition);
                    if (staticModelEntityData != null)
                    {
                        if (Util.GetField("Mesh", staticModelEntityData) != null)
                        {
                            string refMesh = Util.GetField("Mesh", staticModelEntityData).reference;
                            refMeshClean = Util.ClearGUIDString(refMesh);

                            string refMeshGuid = Util.GetGuid(refMesh);

                            Partition meshPartition = Util.LoadPartition(refMeshClean);
                            if (meshPartition != null)
                            {
                                List <Inst> shaderInstances = Util.GetTypes("Render.MeshShaderSetAsset", meshPartition);
                                foreach (Inst shaderInstance in shaderInstances)
                                {
                                    foreach (Complex complex in Util.GetArray("SurfaceShaders", shaderInstance).complex)
                                    {
                                        List <string> textureNames = new List <string>();
                                        foreach (Field field in complex.field)
                                        {
                                            if (field.name == "Name")
                                            {
                                                shaderName = Util.ClearGUIDString(field.value);
                                            }

                                            if (field.name == "Shader")
                                            {
                                                shaderPath = Util.ClearGUIDString(field.reference);
                                            }
                                        }

                                        materialManager.RegisterShader(refMeshClean, shaderPath, shaderName);
                                    }
                                }
                                Inst rigidMeshAsset = Util.GetInst(refMeshGuid, meshPartition);
                                if (rigidMeshAsset != null)
                                {
                                    string refMeshMesh = Util.GetField("Name", rigidMeshAsset).value;

                                    mesh = refMeshMesh + "_lod0_data";
                                }
                            }
                        }
                    }
                }
            }
        }

        string        meshpath    = "Resources/" + mesh + ".meshdata";
        GameObject    go          = null;
        List <Mesh>   subsetMesh  = new List <Mesh> ();
        List <string> subsetNames = new List <string> ();

        if (Util.FileExist(meshpath))
        {
            BC2Mesh bc2mesh = null;
            go = Instantiate(empty, Vector3.zero, Quaternion.identity) as GameObject;

            if (!(instantiatedMeshDictionary.TryGetValue(mesh, out bc2mesh)))
            {
                bc2mesh = MeshDataImporter.LoadMesh(meshpath);


                foreach (string s in subsetNames)
                {
                    Debug.Log(s);
                }
                instantiatedMeshDictionary.Add(mesh, bc2mesh);
            }
            int subsetInt = 0;
            subsetMesh  = bc2mesh.subMesh;
            subsetNames = bc2mesh.subMeshNames;
            foreach (Mesh sub in subsetMesh)
            {
                GameObject   subGO = (GameObject)Instantiate(empty, Vector3.zero, Quaternion.identity);
                MeshRenderer mr    = subGO.AddComponent <MeshRenderer>();
                MeshFilter   mf    = subGO.AddComponent <MeshFilter>();
                MeshCollider mc    = subGO.AddComponent <MeshCollider> ();

                mr.material = materialManager.GetMaterial(refMeshClean, shaderPath, subsetNames[subsetInt]);

                mf.mesh = sub;
                mf.mesh.RecalculateNormals();
                subGO.name             = subsetNames[subsetInt];
                subGO.transform.parent = go.transform;
                mc.sharedMesh          = mf.mesh;
                subsetInt++;
            }
            if (bc2mesh.inverted)
            {
                Vector3 localScale = go.transform.localScale;
                localScale.x           *= -1;
                go.transform.localScale = localScale;
            }
        }
        else
        {
            go = Instantiate(placeholder.gameObject, pos, rot) as GameObject;
        }

        go.name = Util.ClearGUID(inst);

        //go.AddComponent<MeshRenderer>().material.color = new Color (UnityEngine.Random.Range (0.1f, 1.0f), UnityEngine.Random.Range (0.1f, 1.0f), UnityEngine.Random.Range (0.1f, 1.0f));
        GameObject parent = transform.GetComponent <MapItems>().SelectParent(inst.type);

        go.transform.parent = parent.transform;


        Matrix4x4  matrix  = Util.GenerateMatrix4x4(inst);
        Quaternion newQuat = MatrixHelper.QuatFromMatrix(matrix);

        //Quaternion newQuat = go.transform.localRotation;
        //newQuat.x *= -1;
        //newQuat.z *= -1f;
        go.transform.localRotation = newQuat;
        go.transform.position      = pos;
        if (inst.type == "Entity.ReferenceObjectData")
        {
            Vector3 scale = go.transform.localScale;
            scale.x *= -1;             // the meshimporter is inverted. This is a workaround.
            go.transform.localScale = scale;

            if (Regex.IsMatch(go.name.ToLower(), "invisiblewall"))
            {
                go.GetComponentInChildren <MeshRenderer>().material = new Material(materialInvisibleWall);
            }
        }
        BC2Instance instance = go.AddComponent <BC2Instance>();

        instance.instance   = inst;
        instance.id         = i;
        instance.mapLoad    = this;
        instance.partitions = partitions;
        instantiatedGameObjects.Add(go.gameObject);
        instantiatedDictionary.Add(inst.guid.ToUpper(), go.gameObject);
        i++;
        //	yield return null;
    }
    public static BC2Mesh LoadMesh(string loc)
    {
        BC2Mesh bc2mesh = new BC2Mesh ();
        List<Mesh> subsetMesh = new List<Mesh> ();
        List<string> subsetNames = new List<string> ();

        var s_Data = File.ReadAllBytes (loc);
        using (var s_Reader = new BinaryReader(new MemoryStream(s_Data))) {
            MeshData md = new MeshData();

            stream = s_Reader;
            //md.useFloat = float32;
            md.Init ();
            int i = 0;

            List<Vector3> v3 = new List<Vector3>();
            v3 = md.subset[0].GetV3(0);

            int v3int = 0;
            float v3float = 0;
            while(v3int < v3.Count()) {
                v3float += v3[v3int].x;
                v3int ++;
            }

            //hacky, but mostly works
            //Try creating something that detects corrupt mesh.
            //Perhaps overall distance or size?
            //Like, how tall the mesh is compared to how long it is.
            string name = loc.ToLower();
            float avg = (v3float / v3.Count);

            if (name.Contains ("sub_pen_outdoor") || name.Contains ("com_bridge_old/com_bridge_old") || name.Contains("sewer") || name.Contains("pickuppoint") ||
                name.Contains("com_bridge_small") || name.Contains("buffalo_dead" ) ) {

                md = new MeshData ();
                s_Reader.BaseStream.Seek (0, 0);
                md.useFloat = true;
                md.Init ();

                Debug.Log (loc + " is using 32 bit float | " + avg + " | " + v3float);
            }

            if ((name.Contains ("com_bridge_old/") || name.Contains("pickuppoint") || name.Contains("sewer"))){
                bc2mesh.inverted = true;
            }

            while (i < md.subset.Count) {

                if(!md.subset[i].name.Contains("ZOnly")) {
                    Mesh me = new Mesh ();
                    Vector3[] verts  = null;
                    verts = md.subset[i].GetV3(0).ToArray();
                    int[] tris = md.subset[i].GetIndices().ToArray();

                    if(bc2mesh.inverted == true) {
                        tris = tris.Reverse().ToArray();
                        Util.Log ("Inverted: " + loc);
                         //verts = md.subset[i].GetV3Inverted(0).ToArray();

                    }

                    ;
                    Vector2[] uv = null;
                    if(uvOffset != 0) {
                        md.subset[i].uvOffset = uvOffset;
                    } else {
                        md.subset[i].getV2offfsets();
                    }

                    List<Vector2> tempv2 = new List<Vector2>();
                    tempv2 = md.subset[i].getV2();
                    if(tempv2.Count != 0) {

                        uv = tempv2.ToArray();
                    }
                    me.vertices = verts;
                    me.triangles = tris;
                    me.uv = uv;
                    subsetNames.Add(md.subset[i].name);
                    subsetMesh.Add(me);
                }
                i++;
            }

        }
        bc2mesh.path = loc;
        bc2mesh.subMesh = subsetMesh;
        bc2mesh.subMeshNames = subsetNames;
        return bc2mesh;
    }
    public static BC2Mesh LoadMeshRaw(string loc, int uvOffset, bool bigFloat, bool inverted)
    {
        BC2Mesh bc2mesh = new BC2Mesh ();
        List<Mesh> subsetMesh = new List<Mesh> ();
        List<string> subsetNames = new List<string> ();

        var s_Data = File.ReadAllBytes (loc);
        using (var s_Reader = new BinaryReader(new MemoryStream(s_Data))) {
            MeshData md = new MeshData();

            stream = s_Reader;
            //md.useFloat = float32;
            md.Init ();

            string name = loc.ToLower();

            md = new MeshData ();
            s_Reader.BaseStream.Seek (0, 0);
            md.useFloat = bigFloat;
            md.Init ();

            bc2mesh.inverted = inverted;

            int i = 0;
            while (i < md.subset.Count) {

                if(!md.subset[i].name.Contains("ZOnly")) {
                    Mesh me = new Mesh ();
                    Vector3[] verts  = null;
                    verts = md.subset[i].GetV3(0).ToArray();
                    int[] tris = md.subset[i].GetIndices().ToArray();

                    if(bc2mesh.inverted == true) {
                        tris = tris.Reverse().ToArray();
                        Util.Log ("Inverted: " + loc);
                        //verts = md.subset[i].GetV3Inverted(0).ToArray();

                    }

                    ;
                    Vector2[] uv = null;

                    md.subset[i].uvOffset = uvOffset;

                    List<Vector2> tempv2 = new List<Vector2>();
                    tempv2 = md.subset[i].getV2();
                    if(tempv2.Count != 0) {

                        uv = tempv2.ToArray();
                    }
                    me.vertices = verts;
                    me.triangles = tris;
                    me.uv = uv;
                    subsetNames.Add(md.subset[i].name);
                    subsetMesh.Add(me);
                }
                i++;
            }

        }
        bc2mesh.path = loc;
        bc2mesh.subMesh = subsetMesh;
        bc2mesh.subMeshNames = subsetNames;
        return bc2mesh;
    }
Ejemplo n.º 6
0
    public static BC2Mesh LoadMesh(string loc)
    {
        BC2Mesh       bc2mesh     = new BC2Mesh();
        List <Mesh>   subsetMesh  = new List <Mesh> ();
        List <string> subsetNames = new List <string> ();


        var s_Data = File.ReadAllBytes(loc);

        using (var s_Reader = new BinaryReader(new MemoryStream(s_Data))) {
            MeshData md = new MeshData();

            stream = s_Reader;
            //md.useFloat = float32;
            md.Init();
            int i = 0;


            List <Vector3> v3 = new List <Vector3>();
            v3 = md.subset[0].GetV3(0);

            int   v3int   = 0;
            float v3float = 0;
            while (v3int < v3.Count())
            {
                v3float += v3[v3int].x;
                v3int++;
            }

            //hacky, but mostly works
            //Try creating something that detects corrupt mesh.
            //Perhaps overall distance or size?
            //Like, how tall the mesh is compared to how long it is.
            string name = loc.ToLower();
            float  avg  = (v3float / v3.Count);

            if (name.Contains("sub_pen_outdoor") || name.Contains("com_bridge_old/com_bridge_old") || name.Contains("sewer") || name.Contains("pickuppoint") ||
                name.Contains("com_bridge_small") || name.Contains("buffalo_dead"))
            {
                md = new MeshData();
                s_Reader.BaseStream.Seek(0, 0);
                md.useFloat = true;
                md.Init();

                Debug.Log(loc + " is using 32 bit float | " + avg + " | " + v3float);
            }


            if ((name.Contains("com_bridge_old/") || name.Contains("pickuppoint") || name.Contains("sewer")))
            {
                bc2mesh.inverted = true;
            }


            while (i < md.subset.Count)
            {
                if (!md.subset[i].name.Contains("ZOnly"))
                {
                    Mesh      me    = new Mesh();
                    Vector3[] verts = null;
                    verts = md.subset[i].GetV3(0).ToArray();
                    int[] tris = md.subset[i].GetIndices().ToArray();

                    if (bc2mesh.inverted == true)
                    {
                        tris = tris.Reverse().ToArray();
                        Util.Log("Inverted: " + loc);
                        //verts = md.subset[i].GetV3Inverted(0).ToArray();
                    }


                    ;
                    Vector2[] uv = null;
                    if (uvOffset != 0)
                    {
                        md.subset[i].uvOffset = uvOffset;
                    }
                    else
                    {
                        md.subset[i].getV2offfsets();
                    }

                    List <Vector2> tempv2 = new List <Vector2>();
                    tempv2 = md.subset[i].getV2();
                    if (tempv2.Count != 0)
                    {
                        uv = tempv2.ToArray();
                    }
                    me.vertices  = verts;
                    me.triangles = tris;
                    me.uv        = uv;
                    subsetNames.Add(md.subset[i].name);
                    subsetMesh.Add(me);
                }
                i++;
            }
        }
        bc2mesh.path         = loc;
        bc2mesh.subMesh      = subsetMesh;
        bc2mesh.subMeshNames = subsetNames;
        return(bc2mesh);
    }
Ejemplo n.º 7
0
    public static BC2Mesh LoadMeshRaw(string loc, int uvOffset, bool bigFloat, bool inverted)
    {
        BC2Mesh       bc2mesh     = new BC2Mesh();
        List <Mesh>   subsetMesh  = new List <Mesh> ();
        List <string> subsetNames = new List <string> ();


        var s_Data = File.ReadAllBytes(loc);

        using (var s_Reader = new BinaryReader(new MemoryStream(s_Data))) {
            MeshData md = new MeshData();

            stream = s_Reader;
            //md.useFloat = float32;
            md.Init();

            string name = loc.ToLower();



            md = new MeshData();
            s_Reader.BaseStream.Seek(0, 0);
            md.useFloat = bigFloat;
            md.Init();



            bc2mesh.inverted = inverted;


            int i = 0;
            while (i < md.subset.Count)
            {
                if (!md.subset[i].name.Contains("ZOnly"))
                {
                    Mesh      me    = new Mesh();
                    Vector3[] verts = null;
                    verts = md.subset[i].GetV3(0).ToArray();
                    int[] tris = md.subset[i].GetIndices().ToArray();

                    if (bc2mesh.inverted == true)
                    {
                        tris = tris.Reverse().ToArray();
                        Util.Log("Inverted: " + loc);
                        //verts = md.subset[i].GetV3Inverted(0).ToArray();
                    }


                    ;
                    Vector2[] uv = null;

                    md.subset[i].uvOffset = uvOffset;


                    List <Vector2> tempv2 = new List <Vector2>();
                    tempv2 = md.subset[i].getV2();
                    if (tempv2.Count != 0)
                    {
                        uv = tempv2.ToArray();
                    }
                    me.vertices  = verts;
                    me.triangles = tris;
                    me.uv        = uv;
                    subsetNames.Add(md.subset[i].name);
                    subsetMesh.Add(me);
                }
                i++;
            }
        }
        bc2mesh.path         = loc;
        bc2mesh.subMesh      = subsetMesh;
        bc2mesh.subMeshNames = subsetNames;
        return(bc2mesh);
    }