public void Init() { if (MapLoader.Loader is OpenSpace.Loader.R3Loader) { MapLoader l = MapLoader.Loader; foreach (SuperObject so in l.superObjects) { if (so.type == SuperObject.Type.IPO_2) { //Debug.LogWarning("TYPE 2 " + so.Gao.name); Portal portal = new Portal() { containerSO = so, containerIPO = so.data as IPO }; portal.cameraSO = SuperObject.FromOffset(portal.containerIPO.off_portalCamera); GeometricObject geo = portal.containerIPO.data.visualSet[0].obj as GeometricObject; portal.geometricObject = geo; if (geo != null) { GeometricObjectElementTriangles el = geo.elements[0] as GeometricObjectElementTriangles; portal.meshElement = el; portal.material = el.Gao.GetComponent <Renderer>().sharedMaterial; //Debug.LogWarning(so.type + " - " + portal.containerIPO.offset + " - " + portal.containerIPO.off_portalCamera); if (portal.cameraSO != null) { GameObject camGao = new GameObject("Portal Camera - " + portal.containerIPO.Gao.name + " - " + portal.cameraSO.Gao.name); Camera camera = camGao.AddComponent <Camera>(); camGao.transform.position = portal.cameraSO.matrix.GetPosition(true); camGao.transform.rotation = portal.cameraSO.matrix.GetRotation(true) * Quaternion.Euler(-180, 0, 0); camGao.transform.localScale = portal.cameraSO.matrix.GetScale(true); camera.fieldOfView = Camera.main.fieldOfView; camera.enabled = false; camGao.transform.SetParent(transform); portal.camera = camera; portals.Add(portal); } else { // it's a mirror portal.isMirror = true; GameObject camGao = new GameObject("Mirror Camera - " + portal.containerIPO.Gao.name); Camera camera = camGao.AddComponent <Camera>(); camGao.transform.position = geo.vertices[0]; /*camGao.transform.rotation = portal.cameraSO.matrix.GetRotation(true) * Quaternion.Euler(-180, 0, 0); * camGao.transform.localScale = portal.cameraSO.matrix.GetScale(true);*/ camera.fieldOfView = Camera.main.fieldOfView; camera.enabled = false; camGao.transform.SetParent(transform); portal.camera = camera; portals.Add(portal); } el.Gao.layer = LayerMask.NameToLayer("VisualMirror"); PortalBehaviour pb = el.Gao.AddComponent <PortalBehaviour>(); pb.m_ReflectLayers = (1 << LayerMask.NameToLayer("Visual")) | (1 << LayerMask.NameToLayer("VisualOnlyInMirror")); pb.portal = portal; pb.textureIndex = portal.material.GetInt("_NumTextures"); portal.material.SetInt("_NumTextures", pb.textureIndex + 1); } } } } loaded = true; }
private GeometricObject ConvertMeshSection(Section s) { Geometry g = (Geometry)s[0]["geometry"]; uint numMaterials = (uint)s[1][0]["numMaterials"]; uint numUniqueMaterials = (uint)s[1][0]["numUniqueMaterials"]; int[] materialIndices = (int[])s[1][0]["materialIndices"]; Section[] materialSections = new Section[numUniqueMaterials]; VisualMaterial[] materials = new VisualMaterial[numUniqueMaterials]; Array.Copy(s[1].children.ToArray(), 1, materialSections, 0, (int)numUniqueMaterials); materials = materialSections.Select(vms => ConvertMaterialSection(vms)).ToArray(); //if (numMaterials > 1) MapLoader.Loader.print("NUM MATERIALS " + numMaterials); GeometricObject m = new GeometricObject(null); m.num_vertices = (ushort)g.numVertices; m.normals = g.morphTargets[0].normals; m.vertices = g.morphTargets[0].vertices; m.num_elements = (ushort)numMaterials; m.elements = new IGeometricObjectElement[numMaterials]; uint currentUniqueMaterial = 0; for (int i = 0; i < numMaterials; i++) { GeometricObjectElementTriangles e = new GeometricObjectElementTriangles(null, m); List <Geometry.Triangle> triangles = new List <Geometry.Triangle>(); for (int j = 0; j < g.numTriangles; j++) { if (g.triangles[j].materialId == i) { triangles.Add(g.triangles[j]); } } e.OPT_num_mapping_entries = m.num_vertices; e.num_uvMaps = (ushort)g.numTexSets; e.OPT_mapping_uvs = new int[e.num_uvMaps][]; e.uvs = new Vector2[0]; e.vertexColors = g.vertexColors; for (int j = 0; j < g.numTexSets; j++) { e.OPT_mapping_uvs[j] = Enumerable.Range(e.num_uvs, m.num_vertices).ToArray(); Array.Resize(ref e.uvs, e.num_uvs + m.num_vertices); Array.Copy(g.uvs[j], 0, e.uvs, e.num_uvs, m.num_vertices); e.num_uvs += m.num_vertices; } e.OPT_mapping_vertices = Enumerable.Range(0, m.num_vertices).ToArray(); e.OPT_num_disconnectedTriangles = (ushort)triangles.Count; e.OPT_disconnectedTriangles = new int[triangles.Count * 3]; for (int j = 0; j < triangles.Count; j++) { e.OPT_disconnectedTriangles[j * 3] = triangles[j].vertex1; e.OPT_disconnectedTriangles[j * 3 + 1] = triangles[j].vertex2; e.OPT_disconnectedTriangles[j * 3 + 2] = triangles[j].vertex3; } e.visualMaterial = materialIndices[i] == -1 ? materials[currentUniqueMaterial] : materials[materialIndices[i]]; e.visualMaterialOG = e.visualMaterial; if (materialIndices[i] == -1) { currentUniqueMaterial++; } m.elements[i] = e; } m.name = "Mesh"; //GameObject gao = m.Gao; return(m); }