/// <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 }); } } }
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); }
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); }