public void SetCubePosition(int x, int y, int z, int lod, PyriteQuery query, CubeLoader manager) { _x = x; _y = y; _z = z; _lod = lod; _pyriteQuery = query; _cubeLoader = manager; name = string.Format("PH_L{3}:{0}_{1}_{2}", x, y, z, lod); }
IEnumerator Load() { DebugLog("START-PyriteQuery.LoadAll()"); tempPosition = transform.position; transform.position = Vector3.zero; pyriteQuery = new PyriteQuery(this, SetName, ModelVersion, PyriteServer); yield return StartCoroutine(pyriteQuery.LoadAll()); DebugLog("END-PyriteQuery.LoadAll()"); DebugLog("Pyrite Detail Levels Count: " + pyriteQuery.DetailLevels.Count); pyriteLevel = pyriteQuery.DetailLevels[DetailLevel]; //var centerVector = pyriteLevel.ModelBoundsMax - pyriteLevel.ModelBoundsMin; //var region = pyriteLevel.Octree.Octants; var setSize = pyriteLevel.SetSize; Debug.Log("Set Size " + setSize); //var camPos = new Vector3(setSize.x/2, setSize.y/2, 1.5f); //var octIntCubes = pyriteLevel.Octree.AllIntersections(new BoundingBox(centerPos, centerPos)); //var octIntCubes = pyriteLevel.Octree.AllIntersections(new BoundingSphere(centerPos, setSize.x / 6f)); //var octIntCubes = pyriteLevel.Octree.AllIntersections(new BoundingSphere(new Vector3(4.5f, 4.5f, 0f), 1f)); //var octIntCubes = pyriteLevel.Octree.AllIntersections(new BoundingBox(new Vector3(3, 3, 0), new Vector3(3f, 3f, 0f))); //var octIntCubes = pyriteLevel.Octree.AllIntersections(new Microsoft.Xna.Framework.BoundingBox(new Vector3(3, 3, 0), new Vector3(3f, 3f, 0f))); //var octIntCubes = pyriteLevel.Octree.AllIntersections(new Microsoft.Xna.Framework.BoundingSphere(new Vector3(3, 3, 0), 1f)); //var octIntCubes = pyriteLevel.Octree.AllIntersections(new BoundingSphere(centerVector, 2f)); cubeCamPos = pyriteLevel.GetCubeForWorldCoordinates(CameraRig.transform.position); LoadCamCubes(); var worldObject = new GameObject("WorldParent") as GameObject; worldObject.transform.position = Vector3.zero; worldObject.transform.rotation = Quaternion.identity; foreach (var i in pyriteLevel.Octree.AllItems()) { var pCube = CreateCubeFromCubeBounds(i); var cubePos = pyriteLevel.GetWorldCoordinatesForCube(pCube); var loc = Instantiate(WorldLocatorCube, cubePos, Quaternion.identity) as GameObject; loc.transform.localScale = new Vector3( pyriteLevel.WorldCubeScale.x, pyriteLevel.WorldCubeScale.z, pyriteLevel.WorldCubeScale.y); loc.transform.parent = worldObject.transform; } //var octCubes2 = pyriteLevel.Octree.AllItems(); //foreach (var octCube in octCubes2) //{ // var pCube = CreateCubeFromCubeBounds(octCube); // var cubePos = pyriteLevel.GetWorldCoordinatesForCube(pCube); // var loc = Instantiate(LocatorCube, cubePos, Quaternion.identity) as GameObject; // loc.transform.parent = gameObject.transform; //} transform.position = tempPosition; DataReady = true; }
public IEnumerator AddUpgradedDetectorCubes(PyriteQuery pyriteQuery, int x, int y, int z, int lod, Action<IEnumerable<GameObject>> registerCreatedDetectorCubes) { var newLod = lod - 1; var createdDetectors = new List<GameObject>(); var pyriteLevel = pyriteQuery.DetailLevels[newLod]; var cubeFactor = pyriteQuery.GetNextCubeFactor(lod); var min = new Vector3(x*(int) cubeFactor.x + 0.5f, y*(int) cubeFactor.y + 0.5f, z*(int) cubeFactor.z + 0.5f); var max = new Vector3((x + 1)*(int) cubeFactor.x - 0.5f, (y + 1)*(int) cubeFactor.y - 0.5f, (z + 1)*(int) cubeFactor.z - 0.5f); var intersections = pyriteQuery.DetailLevels[newLod].Octree.AllIntersections(new BoundingBox {Min = min, Max = max}); foreach (var i in intersections) { var newCube = CreateCubeFromCubeBounds(i.Object); var cubePos = pyriteLevel.GetWorldCoordinatesForCube(newCube); var g = (GameObject) Instantiate(PlaceHolderCube, new Vector3(-cubePos.x, cubePos.z + 600, -cubePos.y), Quaternion.identity); g.transform.parent = gameObject.transform; g.GetComponent<MeshRenderer>().material.color = _colorList[_colorSelector%_colorList.Length]; g.GetComponent<IsRendered>().SetCubePosition(newCube.X, newCube.Y, newCube.Z, newLod, pyriteQuery, this); g.transform.localScale = new Vector3( pyriteLevel.WorldCubeScale.x, pyriteLevel.WorldCubeScale.z, pyriteLevel.WorldCubeScale.y); _colorSelector++; createdDetectors.Add(g); } registerCreatedDetectorCubes(createdDetectors); yield break; }
public IEnumerator Load() { DebugLog("+Load()"); var pyriteQuery = new PyriteQuery(this, SetName, ModelVersion, PyriteServer); yield return StartCoroutine(pyriteQuery.LoadAll()); DebugLog("CubeQuery complete."); var pyriteLevel = pyriteQuery.DetailLevels[DetailLevel]; var allOctCubes = pyriteQuery.DetailLevels[DetailLevel].Octree.AllItems(); foreach (var octCube in allOctCubes) { var pCube = CreateCubeFromCubeBounds(octCube); var x = pCube.X; var y = pCube.Y; var z = pCube.Z; var cubePos = pyriteLevel.GetWorldCoordinatesForCube(pCube); if (UseCameraDetection) { // Move cube to the orientation we want also move it up since the model is around -600 var g = (GameObject) //Instantiate(PlaceHolderCube, new Vector3(-cubePos.x, cubePos.z + 600, -cubePos.y), //Instantiate(PlaceHolderCube, new Vector3(-cubePos.x, cubePos.z, -cubePos.y), Instantiate(PlaceHolderCube, new Vector3(cubePos.x, cubePos.y, cubePos.z), Quaternion.identity); //var loc = Instantiate(LocatorCube, new Vector3(cubePos.x, cubePos.y, cubePos.z), Quaternion.identity) as GameObject; var loc = Instantiate(LocatorCube, cubePos, Quaternion.identity) as GameObject; loc.transform.parent = gameObject.transform; g.transform.parent = gameObject.transform; //g.GetComponent<MeshRenderer>().material.color = _colorList[_colorSelector%_colorList.Length]; g.GetComponent<IsRendered>().SetCubePosition(x, y, z, DetailLevel, pyriteQuery, this); g.transform.localScale = new Vector3( pyriteLevel.WorldCubeScale.x, pyriteLevel.WorldCubeScale.z, pyriteLevel.WorldCubeScale.y); _colorSelector++; } else { var loadRequest = new LoadCubeRequest(x, y, z, DetailLevel, pyriteQuery, null); EnqueueLoadCubeRequest(loadRequest); } } if (CameraRig != null) { //DebugLog("Moving camera"); // Hardcoding some values for now //var min = new Vector3(pyriteLevel.ModelBoundsMin.x, pyriteLevel.ModelBoundsMin.y, // pyriteLevel.ModelBoundsMin.z); //var max = new Vector3(pyriteLevel.ModelBoundsMax.x, pyriteLevel.ModelBoundsMax.y, // pyriteLevel.ModelBoundsMax.z); //min += pyriteLevel.WorldCubeScale/2; //max -= pyriteLevel.WorldCubeScale/2; //var newCameraPosition = min + (max - min)/2.0f; //newCameraPosition += new Vector3(0, 0, (max - min).z*1.4f); //CameraRig.transform.position = newCameraPosition; //CameraRig.transform.rotation = Quaternion.Euler(0, 180, 0); //DebugLog("Done moving camera"); //var delta = pyriteLevel.ModelBoundsMax - pyriteLevel.ModelBoundsMin; //var center = pyriteLevel.ModelBoundsMin + new Vector3(-delta.x / 2, delta.z /2 , -delta.y); //CameraRig.transform.position = center; //var allOctCubes = pyriteQuery.DetailLevels[DetailLevel].Octree.AllItems(); // RPL CONVERSION List<GridPos> gList = new List<GridPos>(); Dictionary<string, CubeBounds> gDict = new Dictionary<string, CubeBounds>(); foreach (var octCube in allOctCubes) { var pCube = CreateCubeFromCubeBounds(octCube); var x = pCube.X; var y = pCube.Y; var z = pCube.Z; var gPos = new GridPos(x, y, z); gList.Add(gPos); gDict.Add(gPos.ToKeyString(), octCube); } int midIndex = gList.Count / 2; var gMid = gList.OrderBy(n => n.x).ThenBy(n => n.y).ThenBy(n => n.z).ToList()[midIndex]; var cubeBound = CreateCubeFromCubeBounds(gDict[gMid.ToKeyString()]); var cubeVector3 = pyriteLevel.GetWorldCoordinatesForCube(cubeBound); CameraRig.transform.position = cubeVector3; var r = Instantiate(LocatorCube, cubeVector3, Quaternion.identity) as GameObject; r.GetComponent<MeshRenderer>().material.color = Color.green; r.transform.localScale = new Vector3(12f, 12f, 12f); //Instantiate(RenderCubes); //RenderCubes.GetComponent<RenderCubes3D>().GridMinSize = (int)(pyriteQuery.DetailLevels[DetailLevel].WorldCubeScale.x); // World Size cut to 3x3x3 Sections //RenderCubes.GetComponent<RenderCubes3D>().CreateCubeLayers(CameraRig.transform.position); } DebugLog("-Load()"); }
public IEnumerator Load() { // load the cube meta data PyriteQuery = new PyriteQuery(this, SetName, ModelVersion, PyriteServer); yield return StartCoroutine(PyriteQuery.LoadAll()); var pyriteLevel = PyriteQuery.DetailLevels[DetailLevel]; // load the material files // yield return StartCoroutine(LoadMaterials()); List<MaterialData> materialDataList = new List<MaterialData>(); LoadDefaultMaterials(pyriteLevel, materialDataList); // testing preloading the textures data on a background thread - by this point, we should have the data we need to start downloading _textureLoader = new TextureLoader(PyriteQuery, materialDataList, UseUnlitShader); _textureLoader.DownloadCompleted += (s, e) => { _readyToBuild = true; }; yield return StartCoroutine(_textureLoader.DownloadTextures(pyriteLevel)); if (Camera != null || CameraRig != null) { Transform cTransform = Camera == null ? CameraRig.transform : Camera.transform; DebugLog("Moving camera"); // Hardcoding some values for now var newCameraPosition = pyriteLevel.WorldBoundsMin + (pyriteLevel.WorldBoundsSize)/2.0f; newCameraPosition += new Vector3(0, 0, pyriteLevel.WorldBoundsSize.z*1.4f); cTransform.position = newCameraPosition; cTransform.rotation = Quaternion.Euler(0, 180, 0); DebugLog("Done moving camera"); } int colorSelector = 0; for (int i = 0; i < pyriteLevel.Cubes.Length; i++) { int x = pyriteLevel.Cubes[i].X; int y = pyriteLevel.Cubes[i].Y; int z = pyriteLevel.Cubes[i].Z; if (UseCameraDetection) { var cubePos = pyriteLevel.GetWorldCoordinatesForCube(pyriteLevel.Cubes[i]); // Move cube to the orientation we want also move it up since the model is around -600 GameObject g = (GameObject) Instantiate(PlaceHolderCube, new Vector3(-cubePos.x, cubePos.z + 600, -cubePos.y), Quaternion.identity); g.transform.parent = gameObject.transform; g.GetComponent<MeshRenderer>().material.color = _colorList[colorSelector%3]; g.GetComponent<IsRendered>().SetCubePosition(x, y, z, DetailLevel, PyriteQuery, this); g.transform.localScale = new Vector3( pyriteLevel.WorldCubeScale.x, pyriteLevel.WorldCubeScale.z, pyriteLevel.WorldCubeScale.y); colorSelector++; } else { AddToQueue(new Cube() { MapPosition = new UnityEngine.Vector3(x, y, z), Query = PyriteQuery, Lod = DetailLevel }); } } yield return null; }
public TextureLoader(PyriteQuery query, List<MaterialData> materialDataList, bool useUnlitShader) { Query = query; MaterialDataList = materialDataList; UseUnlitShader = useUnlitShader; }