protected void requestMaterials(object sender, IRequestInterface args) // Only works with the v2 server using the v1 API // Materials can be shared { MaterialsRequest reqObj = args as MaterialsRequest; HashSet <int> collectIds = new HashSet <int> (); foreach (int matId in reqObj.materialIds) { collectIds.Add(matId); } string matIds = string.Join(",", collectIds); reqObj.uri = new System.Uri(ForgeLoaderConstants._endpoint + URN + "/materials/" + matIds); //UnityEngine.Debug.Log ("URI request: " + reqObj.uri.ToString ()); _mgr.Register(reqObj); }
public override GameObject BuildScene(string name, bool saveToDisk = false) { Clear(); GameObject pivot = null; try { gameObject = new GameObject(name); if (lmvtkDef == null) { return(null); } ForgeProperties properties = gameObject.AddComponent <ForgeProperties> (); properties.Properties = lmvtkDef ["metadata"]; foreach (JSONNode child in lmvtkDef["childs"].AsArray) { IteratorNodes(child, gameObject); } base.BuildScene(name, saveToDisk); pivot = ForgeLoaderEngine.SetupForSceneOrientationAndUnits(gameObject, properties.Properties); // Create as much Meshes requests we need to load chunks of 0.5Mb-0.7Mb pack files // 1-499 polys = factor of 25 // >500 poly = factor of 17 int compSize = 0; List <Eppy.Tuple <int, int> > components = new List <Eppy.Tuple <int, int> > (); List <Eppy.Tuple <int, int, GameObject, JSONNode> > fragments = new List <Eppy.Tuple <int, int, GameObject, JSONNode> > (); foreach (KeyValuePair <int, InstanceTreeData> data in _components) { //if ( data.Value.fragments.Count == 0 ) //continue; foreach (Eppy.Tuple <int, int, GameObject, JSONNode> frag in data.Value.fragments) { JSONArray json = frag.Item4 ["fragments"].AsArray; JSONArray json2 = frag.Item4 ["fragPolys"].AsArray; int index = 0; for ( ; index < json.Count && json [index].AsInt != frag.Item1; index++) { } if (index >= json2.Count) { continue; } compSize += json2 [index].AsInt; //Debug.Log (data.Key + "-" + frag.Item1 + " " + json2 [index].AsInt); components.Add(new Eppy.Tuple <int, int> (data.Key, frag.Item1)); fragments.Add(frag); } if (compSize > 29411 /* 29411 * 17 = 500kb */) { MeshesRequest reqMeshes = new MeshesRequest(loader, null, bearer, components, fragments, null); reqMeshes.gameObject = null; if (fireRequestCallback != null) { fireRequestCallback(this, reqMeshes); } compSize = 0; components = new List <Eppy.Tuple <int, int> > (); fragments = new List <Eppy.Tuple <int, int, GameObject, JSONNode> > (); } } if (components.Count > 0) { MeshesRequest reqMeshes = new MeshesRequest(loader, null, bearer, components, fragments, null); reqMeshes.gameObject = null; if (fireRequestCallback != null) { fireRequestCallback(this, reqMeshes); } } if (loader.GetMgr()._materials.Count > 0) { MaterialsRequest reqMaterials = new MaterialsRequest(loader, null, bearer, loader.GetMgr()._materials, lmvtkDef); reqMaterials.gameObject = null; if (fireRequestCallback != null) { fireRequestCallback(this, reqMaterials); } } // Textures will be requested by the material request (one by one) // Now Properties int [] dbIds = _components.Keys.ToArray(); int [] [] chunks = dbIds .Select((s, i) => new { Value = s, Index = i }) .GroupBy(x => x.Index / 100) .Select(grp => grp.Select(x => x.Value).ToArray()) .ToArray(); for (int i = 0; i < chunks.Length; i++) { List <Eppy.Tuple <int, GameObject> > dbIdsTuple = new List <Eppy.Tuple <int, GameObject> > (); foreach (int dbId in chunks[i]) { dbIdsTuple.Add(new Eppy.Tuple <int, GameObject> (dbId, _components [dbId].obj)); } PropertiesRequest2 reqProps = new PropertiesRequest2(loader, null, bearer, dbIdsTuple); reqProps.gameObject = null; if (fireRequestCallback != null) { fireRequestCallback(this, reqProps); } } Clear(); } catch (Exception ex) { if (gameObject) { GameObject.DestroyImmediate(gameObject); } gameObject = null; pivot = null; } return(pivot); }