Exemplo n.º 1
0
    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;
    }
Exemplo n.º 2
0
        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);
        }