Пример #1
0
        /// <summary>
        /// Calculate the normal data
        /// </summary>
        /// <param name="worldMapTerrain">Manual Object</param>
        /// <param name="worldMap">World Map</param>
        private void calculateNormal(ManualObject worldMapTerrain, MBWorldMap worldMap)
        {
            worldMap.fcn = new List <float[]>();
            worldMap.vtn = new List <float[]>();
            worldMap.cfa = new List <float>();

            List <List <int> > vtxi = new List <List <int> >();

            for (int i = 0; i < worldMap.Vertics.Count; i++)
            {
                vtxi.Add(new List <int>());
            }
            for (int i = 0; i < worldMap.Faces.Count; i++)
            {
                worldMap.vtn.Add(new float[] { 0, 0, 0 });
            }

            for (int i = 0; i < worldMap.Faces.Count; i++)
            {
                int vta = worldMap.Faces[i].indexFirst;
                int vtb = worldMap.Faces[i].indexSecond;
                int vtc = worldMap.Faces[i].indexThird;

                vtxi[vta].Add(i);
                vtxi[vtb].Add(i);
                vtxi[vtc].Add(i);

                Vector3 normalData = computeNorm(new int[]
                {
                    worldMap.Faces[i].indexFirst,
                    worldMap.Faces[i].indexSecond,
                    worldMap.Faces[i].indexThird
                }, worldMap.Vertics);
                worldMap.fcn.Add(new float[] { normalData.x, normalData.y, normalData.z });

                worldMap.cfa.Add(computeArea(new int[]
                {
                    worldMap.Faces[i].indexFirst,
                    worldMap.Faces[i].indexSecond,
                    worldMap.Faces[i].indexThird
                }, worldMap.Vertics));
            }

            for (int i = 0; i < vtxi.Count; i++)
            {
                if (vtxi[i] != null && vtxi[i].Count > 0)
                {
                    Vector3 triangle = new Vector3(0, 0, 0);
                    for (int u = 0; u < vtxi[i].Count; u++)
                    {
                        var currentface = vtxi[i][u];
                        triangle = triangle + new Vector3(worldMap.Faces[currentface].indexFirst, worldMap.Faces[currentface].indexSecond, worldMap.Faces[currentface].indexThird) * worldMap.cfa[currentface];
                    }
                    var normalizedVector = (triangle / vtxi[i].Count).NormalisedCopy;
                    worldMap.vtn[i] = (new float[] { normalizedVector.x, normalizedVector.y, normalizedVector.z });
                }
            }
        }
Пример #2
0
        private void btnOK_Click(object sender, EventArgs e)
        {
            if (string.IsNullOrEmpty(txtMapXmlPath.Text))
            {
                MessageBox.Show("You must choose a valid map xml full path!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            if (string.IsNullOrEmpty(txtMBMapPath.Text))
            {
                MessageBox.Show("You must choose a valid map txt full path!", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }

            MBWorldMap worldmap = new MBWorldMap();

            worldmap.ParseTxt(txtMBMapPath.Text);
            worldmap.SaveAsXml(txtMapXmlPath.Text);
            MessageBox.Show("Export successfully!", "Success", MessageBoxButtons.OK, MessageBoxIcon.Information);
        }
Пример #3
0
        public MeshPtr LoadWorldMap(string worldMapID, SceneManager sceneManager, MBWorldMap worldMap, bool faceted = false)
        {
            //Convert Vertex and Faces to Ogre Mesh Format
            if (worldMap == null)
            {
                return(null);
            }
            if (meshes.ContainsKey(worldMapID))
            {
                return(meshes[worldMapID]);
            }
            ManualObject worldMapTerrain = sceneManager.CreateManualObject("WORLDMAP-MANUAL-OBJECT-" + worldMapID);

            worldMapTerrain.Begin("", RenderOperation.OperationTypes.OT_TRIANGLE_LIST);

            calculateNormal(worldMapTerrain, worldMap);

            for (int i = 0; i < worldMap.Faces.Count; i++)
            {
                int vindex1 = worldMap.Faces[i].indexFirst;
                int vindex2 = worldMap.Faces[i].indexSecond;
                int vindex3 = worldMap.Faces[i].indexThird;

                float[] vnindex1 = worldMap.fcn[i];
                float[] vnindex2 = worldMap.fcn[i];
                float[] vnindex3 = worldMap.fcn[i];

                worldMapTerrain.Position(
                    worldMap.Vertics[vindex1].x,
                    worldMap.Vertics[vindex1].z,
                    worldMap.Vertics[vindex1].y
                    );
                worldMapTerrain.Normal(vnindex1[0], vnindex1[1], vnindex1[2]);
                worldMapTerrain.Colour(worldMap.Color[worldMap.Faces[i].TerrainType]);

                worldMapTerrain.Position(
                    worldMap.Vertics[vindex2].x,
                    worldMap.Vertics[vindex2].z,
                    worldMap.Vertics[vindex2].y
                    );
                worldMapTerrain.Normal(vnindex2[0], vnindex2[1], vnindex2[2]);
                worldMapTerrain.Colour(worldMap.Color[worldMap.Faces[i].TerrainType]);

                worldMapTerrain.Position(
                    worldMap.Vertics[vindex3].x,
                    worldMap.Vertics[vindex3].z,
                    worldMap.Vertics[vindex3].y
                    );
                worldMapTerrain.Normal(vnindex3[0], vnindex3[1], vnindex3[2]);
                worldMapTerrain.Colour(worldMap.Color[worldMap.Faces[i].TerrainType]);

                worldMapTerrain.Triangle(
                    (uint)(vindex1),
                    (uint)(vindex2),
                    (uint)(vindex3)
                    );
            }

            worldMapTerrain.End();

            var mesh = worldMapTerrain.ConvertToMesh("WORLDMAP-" + worldMapID);

            meshes.Add(worldMapID, mesh);
            return(mesh);
        }