// Returns an ExtendedPrimGroup with a mesh for the passed heightmap. // Note that the returned EPG does not include any face information -- the caller must add a texture. public DisplayableRenderable MeshFromHeightMap(float[,] pHeightMap, int regionSizeX, int regionSizeY, IAssetFetcher assetFetcher, OMV.Primitive.TextureEntryFace defaultTexture) { // OMVR.Face rawMesh = m_mesher.TerrainMesh(pHeightMap, 0, pHeightMap.GetLength(0)-1, 0, pHeightMap.GetLength(1)-1); ConvOAR.Globals.log.DebugFormat("{0} MeshFromHeightMap: heightmap=<{1},{2}>, regionSize=<{3},{4}>", _logHeader, pHeightMap.GetLength(0), pHeightMap.GetLength(1), regionSizeX, regionSizeY); OMVR.Face rawMesh = ConvoarTerrain.TerrainMesh(pHeightMap, (float)regionSizeX, (float)regionSizeY); RenderableMesh rm = ConvertFaceToRenderableMesh(rawMesh, assetFetcher, defaultTexture, new OMV.Vector3(1, 1, 1)); RenderableMeshGroup rmg = new RenderableMeshGroup(); rmg.meshes.Add(rm); return(rmg); }
public Promise <BScene> ConvertOarToScene(IAssetService assetService, IAssetFetcher assetFetcher) { Promise <BScene> prom = new Promise <BScene>(); // Assemble all the parameters that loadoar takes and uses Dictionary <string, object> options = new Dictionary <string, object>(); // options.Add("merge", false); options.Add("displacement", ConvOAR.Globals.parms.P <OMV.Vector3>("Displacement")); string optRotation = ConvOAR.Globals.parms.P <string>("Rotation"); if (optRotation != null) { options.Add("rotation", float.Parse(optRotation, System.Threading.Thread.CurrentThread.CurrentCulture)); } // options.Add("default-user", OMV.UUID.Random()); // if (optSkipAssets != null) options.Add('skipAssets', true); // if (optForceTerrain != null) options.Add("force-terrain", true); // if (optNoObjects != null) options.Add("no-objects", true); string optSubRegion = ConvOAR.Globals.parms.P <string>("SubRegion"); if (optSubRegion != null) { List <float> bounds = optSubRegion.Split(',').Select <string, float>(x => { return(float.Parse(x)); }).ToList(); options.Add("bounding-origin", new OMV.Vector3(bounds[0], bounds[1], bounds[2])); options.Add("bounding-size", new OMV.Vector3(bounds[3] - bounds[0], bounds[4] - bounds[1], bounds[5] - bounds[2])); } // Create an OpenSimulator region and scene to load the OAR into string regionName = "convoar"; if (String.IsNullOrEmpty(ConvOAR.Globals.parms.P <String>("RegionName"))) { // Try to build the region name from the OAR filesname regionName = Path.GetFileNameWithoutExtension(ConvOAR.Globals.parms.P <string>("InputOAR")); } else { regionName = ConvOAR.Globals.parms.P <string>("RegionName"); } Scene scene = CreateScene(assetService, regionName); // Load the archive into our scene ArchiveReadRequest archive = new ArchiveReadRequest(scene, ConvOAR.Globals.parms.P <string>("InputOAR"), Guid.Empty, options); archive.DearchiveRegion(false); // Convert SOGs from OAR into EntityGroups // ConvOAR.Globals.log.Log("Num assets = {0}", assetService.NumAssets); LogBProgress("Num SOGs = {0}", scene.GetSceneObjectGroups().Count); PrimToMesh mesher = new PrimToMesh(); // Convert SOGs => BInstances Promise <BInstance> .All( scene.GetSceneObjectGroups().Select(sog => { return(ConvertSogToInstance(sog, assetFetcher, mesher)); }) ) .Done(instances => { ConvOAR.Globals.log.DebugFormat("{0} Num instances = {1}", _logHeader, instances.ToList().Count); List <BInstance> instanceList = new List <BInstance>(); instanceList.AddRange(instances); // Add the terrain mesh to the scene BInstance terrainInstance = null; if (ConvOAR.Globals.parms.P <bool>("AddTerrainMesh")) { ConvOAR.Globals.log.DebugFormat("{0} Creating terrain for scene", _logHeader); // instanceList.Add(ConvoarTerrain.CreateTerrainMesh(scene, mesher, assetFetcher)); terrainInstance = ConvoarTerrain.CreateTerrainMesh(scene, mesher, assetFetcher); CoordAxis.FixCoordinates(terrainInstance, new CoordAxis(CoordAxis.RightHand_Yup | CoordAxis.UVOriginLowerLeft)); } // Twist the OpenSimulator Z-up coordinate system to the OpenGL Y-up foreach (var inst in instanceList) { CoordAxis.FixCoordinates(inst, new CoordAxis(CoordAxis.RightHand_Yup | CoordAxis.UVOriginLowerLeft)); } // package instances into a BScene BScene bScene = new BScene(); bScene.instances = instanceList; RegionInfo ri = scene.RegionInfo; bScene.name = ri.RegionName; bScene.terrainInstance = terrainInstance; bScene.attributes.Add("RegionName", ri.RegionName); bScene.attributes.Add("RegionSizeX", ri.RegionSizeX); bScene.attributes.Add("RegionSizeY", ri.RegionSizeY); bScene.attributes.Add("RegionSizeZ", ri.RegionSizeZ); bScene.attributes.Add("RegionLocX", ri.RegionLocX); bScene.attributes.Add("RegionLocY", ri.RegionLocY); bScene.attributes.Add("WorldLocX", ri.WorldLocX); bScene.attributes.Add("WorldLocY", ri.WorldLocY); bScene.attributes.Add("WaterHeight", ri.RegionSettings.WaterHeight); bScene.attributes.Add("DefaultLandingPorint", ri.DefaultLandingPoint); prom.Resolve(bScene); }, e => { ConvOAR.Globals.log.ErrorFormat("{0} failed SOG conversion: {1}", _logHeader, e); // prom.Reject(new Exception(String.Format("Failed conversion: {0}", e))); }); return(prom); }