Example #1
0
        public static void Export(BF2StaticMesh mesh, string filename, int geoMatIdx)
        {
            StringBuilder sb = new StringBuilder();

            Helper.BF2MeshSTMGeometryMaterial lod0 = mesh.geomat[geoMatIdx];
            int vertexcounter = 1;

            for (int i = 0; i < lod0.numMaterials; i++)
            {
                Helper.BF2MeshSTMMaterial          mat  = lod0.materials[i];
                List <RenderObject.VertexTextured> list = new List <RenderObject.VertexTextured>();
                int m = mesh.geometry.vertices.Count / (int)mesh.geometry.numVertices;
                for (int j = 0; j < mat.numIndicies; j++)
                {
                    int pos = (mesh.geometry.indices[(int)mat.indiciesStartIndex + j] + (int)mat.vertexStartIndex) * m;
                    list.Add(mesh.GetVertex(pos));
                }
                if (mat.numIndicies != 0)
                {
                    WriteObject(sb, list, "Material" + i, vertexcounter);
                    vertexcounter += list.Count();
                }
            }
            File.WriteAllText(filename, sb.ToString());
        }
Example #2
0
        public static void CloneEntry(int n)
        {
            BF2LevelObject lo = objects[n];
            BF2LevelObject nlo;

            switch (lo.type)
            {
            case BF2LevelObject.BF2LOTYPE.StaticObject:
                nlo            = new BF2LevelObject(lo.position, lo.rotation, BF2LevelObject.BF2LOTYPE.StaticObject);
                nlo._data      = lo._data.ToArray();
                nlo._template  = lo._template;
                nlo._name      = lo._name;
                nlo.properties = new List <string>(lo.properties.ToArray());
                BF2StaticMesh stm = new BF2StaticMesh(nlo._data);
                if (stm == null)
                {
                    return;
                }
                nlo.staticMeshes = stm.ConvertForEngine(engine, true, 0);
                foreach (RenderObject ro in nlo.staticMeshes)
                {
                    nlo.transform = lo.transform;
                }
                nlo._valid = true;
                objects.Add(nlo);
                break;

            case BF2LevelObject.BF2LOTYPE.Road:
                nlo            = new BF2LevelObject(lo.position, lo.rotation, BF2LevelObject.BF2LOTYPE.Road);
                nlo._data      = lo._data.ToArray();
                nlo._template  = lo._template;
                nlo._name      = lo._name;
                nlo.properties = new List <string>(lo.properties.ToArray());
                BF2Mesh mesh = new BF2Mesh(nlo._data);
                if (mesh == null)
                {
                    return;
                }
                Texture2D tex = FindRoadTexture(nlo._name);
                nlo.meshes = mesh.ConvertForEngine(engine, tex);
                foreach (RenderObject ro in nlo.meshes)
                {
                    ro.transform = nlo.transform;
                }
                nlo._valid = true;
                objects.Add(nlo);
                break;
            }
        }
Example #3
0
        private void PickMesh()
        {
            if (tv2.SelectedNode == null)
            {
                return;
            }
            engineMeshExplorer.ClearScene();
            byte[] data = BF2FileSystem.GetFileFromNode(tv2.SelectedNode);
            if (data == null)
            {
                return;
            }
            string ending = Path.GetExtension(BF2FileSystem.GetPathFromNode(tv2.SelectedNode)).ToLower();

            switch (ending)
            {
            case ".staticmesh":
                BF2StaticMesh stm = new BF2StaticMesh(data);
                engineMeshExplorer.objects.AddRange(stm.ConvertForEngine(engineMeshExplorer, toolStripButton3.Checked, toolStripComboBox1.SelectedIndex));
                break;

            case ".bundledmesh":
                BF2BundledMesh bm = new BF2BundledMesh(data);
                engineMeshExplorer.objects.AddRange(bm.ConvertForEngine(engineMeshExplorer, toolStripButton3.Checked, toolStripComboBox1.SelectedIndex));
                break;

            case ".skinnedmesh":
                BF2SkinnedMesh skm = new BF2SkinnedMesh(data);
                engineMeshExplorer.objects.AddRange(skm.ConvertForEngine(engineMeshExplorer, toolStripButton3.Checked, toolStripComboBox1.SelectedIndex));
                break;

            case ".collisionmesh":
                BF2CollisionMesh cm = new BF2CollisionMesh(data);
                engineMeshExplorer.objects.AddRange(cm.ConvertForEngine(engineMeshExplorer));
                break;

            default:
                RenderObject o = new RenderObject(engineMeshExplorer.device, RenderObject.RenderType.TriListWired, engineMeshExplorer.defaultTexture, engineMeshExplorer);
                o.InitGeometry();
                engineMeshExplorer.objects.Add(o);
                break;
            }
            engineMeshExplorer.ResetCameraDistance();
        }
Example #4
0
        private static void LoadStaticObject(List <string> infos)
        {
            string templateName = Helper.FindLineStartingWith(infos, "Object.create");

            if (templateName == null)
            {
                return;
            }
            string  position = Helper.FindLineStartingWith(infos, "Object.absolutePosition");
            string  rotation = Helper.FindLineStartingWith(infos, "Object.rotation");
            Vector3 pos      = Vector3.Zero;
            Vector3 rot      = Vector3.Zero;

            if (position != null)
            {
                pos = Helper.ParseVector3(position.Split(' ')[1]);
            }
            if (rotation != null)
            {
                rot = Helper.ParseVector3(rotation.Split(' ')[1]);
            }
            templateName = templateName.Split(' ')[1] + ".con";
            BF2LevelObject lo          = null;
            bool           foundCached = false;

            foreach (BF2LevelObject obj in objects)
            {
                if (obj._template == templateName && obj.type == BF2LevelObject.BF2LOTYPE.StaticObject)
                {
                    lo            = new BF2LevelObject(pos, rot, obj.type);
                    lo._template  = templateName;
                    lo._name      = templateName;
                    lo._data      = obj._data.ToArray();
                    lo.properties = infos;
                    switch (obj.type)
                    {
                    case BF2LevelObject.BF2LOTYPE.StaticObject:
                        BF2StaticMesh stm = new BF2StaticMesh(lo._data);
                        if (stm == null)
                        {
                            return;
                        }
                        lo.staticMeshes = stm.ConvertForEngine(engine, true, 0);
                        foreach (RenderObject ro in lo.staticMeshes)
                        {
                            ro.transform = lo.transform;
                        }
                        lo._valid   = true;
                        foundCached = true;
                        break;
                    }
                    break;
                }
            }
            if (!foundCached)
            {
                BF2FileSystem.BF2FSEntry entry = BF2FileSystem.FindFirstEntry(templateName);
                byte[] data = BF2FileSystem.GetFileFromEntry(entry);
                if (data == null)
                {
                    return;
                }
                List <string> infosObject = new List <string>(Encoding.ASCII.GetString(data).Split('\n'));
                string        geoTemplate = Helper.FindLineStartingWith(infosObject, "GeometryTemplate.create");
                if (geoTemplate == null)
                {
                    return;
                }
                string[] parts = geoTemplate.Split(' ');
                switch (parts[1].ToLower())
                {
                case "staticmesh":
                    lo            = new BF2LevelObject(pos, rot, BF2LevelObject.BF2LOTYPE.StaticObject);
                    lo._template  = templateName;
                    lo._name      = templateName;
                    lo.properties = infos;
                    BF2StaticMesh stm = LoadStaticMesh(infosObject, lo);
                    if (stm == null)
                    {
                        return;
                    }
                    lo.staticMeshes = stm.ConvertForEngine(engine, true, 0);
                    foreach (RenderObject ro in lo.staticMeshes)
                    {
                        ro.transform = lo.transform;
                    }
                    lo._valid = true;
                    break;
                }
            }
            if (lo != null && lo._valid)
            {
                objects.Add(lo);
            }
        }
Example #5
0
        private void exportALLAsObjToolStripMenuItem_Click(object sender, EventArgs e)
        {
            exportALLAsObjToolStripMenuItem.Enabled = false;
            FolderBrowserDialog fbd = new FolderBrowserDialog();

            if (fbd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
            {
                string basePath = fbd.SelectedPath + "\\";
                pb1.Maximum = BF2FileSystem.clientFS.Count;
                int count = 0;
                foreach (BF2FileSystem.BF2FSEntry entry in BF2FileSystem.clientFS)
                {
                    pb1.Value = count++;
                    try
                    {
                        string ending = Path.GetExtension(entry.inFSPath).ToLower();
                        switch (ending)
                        {
                        case ".staticmesh":
                        case ".bundledmesh":
                        case ".skinnedmesh":
                        case ".collisionmesh":
                            break;

                        default:
                            continue;
                        }
                        string path = basePath + Path.GetDirectoryName(entry.inFSPath);
                        byte[] data = BF2FileSystem.GetFileFromEntry(entry);
                        if (data == null)
                        {
                            continue;
                        }
                        switch (ending)
                        {
                        case ".staticmesh":
                            CheckAndMakeDir(path);
                            path += "\\" + Path.GetFileNameWithoutExtension(entry.inFSPath);
                            Log.WriteLine("Exporting \"" + path + ".staticmesh\"...");
                            BF2StaticMesh stm = new BF2StaticMesh(data);
                            for (int i = 0; i < stm.geomat.Count; i++)
                            {
                                ExporterObj.Export(stm, path + ".lod" + i + ".obj", i);
                            }
                            break;

                        case ".bundledmesh":
                            CheckAndMakeDir(path);
                            path += "\\" + Path.GetFileNameWithoutExtension(entry.inFSPath);
                            Log.WriteLine("Exporting \"" + path + ".bundledmesh\"...");
                            BF2BundledMesh bm = new BF2BundledMesh(data);
                            for (int i = 0; i < bm.geomat.Count; i++)
                            {
                                ExporterObj.Export(bm, path + ".lod" + i + ".obj", i);
                            }
                            break;

                        case ".skinnedmesh":
                            CheckAndMakeDir(path);
                            path += "\\" + Path.GetFileNameWithoutExtension(entry.inFSPath);
                            Log.WriteLine("Exporting \"" + path + ".skinnedmesh\"...");
                            BF2SkinnedMesh skm = new BF2SkinnedMesh(data);
                            for (int i = 0; i < skm.geomat.Count; i++)
                            {
                                ExporterObj.Export(skm, path + ".lod" + i + ".obj", i);
                            }
                            break;

                        case ".collisionmesh":
                            CheckAndMakeDir(path);
                            path += "\\" + Path.GetFileNameWithoutExtension(entry.inFSPath);
                            Log.WriteLine("Exporting \"" + path + ".bundledmesh\"...");
                            ExporterObj.Export(new BF2CollisionMesh(data), path + ".obj");
                            break;
                        }
                    }
                    catch (Exception ex)
                    {
                        Log.WriteLine("ERROR: " + ex.Message);
                    }
                    Application.DoEvents();
                }
                pb1.Value = 0;
                exportALLAsObjToolStripMenuItem.Enabled = true;
            }
        }