Пример #1
0
        private void InitGameObject()
        {
            gao = new GameObject(name);

            /*System.Diagnostics.Stopwatch w = new System.Diagnostics.Stopwatch();
             * w.Start();*/

            gao.tag   = "Visual";
            gao.layer = LayerMask.NameToLayer("Visual");
            if (bones != null)
            {
                GameObject child = bones.Gao;
                child.transform.SetParent(gao.transform);
                child.transform.localPosition = Vector3.zero;
            }
            for (uint i = 0; i < num_elements; i++)
            {
                if (elements[i] != null)
                {
                    GameObject child = elements[i].Gao;
                    child.transform.SetParent(gao.transform);
                    child.transform.localPosition = Vector3.zero;
                }
            }
            if (lookAtMode != 0)
            {
                BillboardBehaviour billboard = gao.AddComponent <BillboardBehaviour>();
                billboard.mode = (BillboardBehaviour.LookAtMode)lookAtMode;
            }

            /*MapLoader.Loader.print("GEO: " + offset + " - " + w.ElapsedMilliseconds);
             * w.Stop();*/
        }
Пример #2
0
 public void InitGameObject()
 {
     gao       = new GameObject(name);
     gao.tag   = "Visual";
     gao.layer = LayerMask.NameToLayer("Visual");
     if (bones != null)
     {
         GameObject child = bones.Gao;
         child.transform.SetParent(gao.transform);
         child.transform.localPosition = Vector3.zero;
     }
     for (uint i = 0; i < num_elements; i++)
     {
         if (elements[i] != null)
         {
             GameObject child = elements[i].Gao;
             child.transform.SetParent(gao.transform);
             child.transform.localPosition = Vector3.zero;
         }
     }
     if (lookAtMode != 0)
     {
         BillboardBehaviour billboard = gao.AddComponent <BillboardBehaviour>();
         billboard.mode = (BillboardBehaviour.LookAtMode)lookAtMode;
     }
 }
        public GameObject GetGameObject(GeometricObject.Type type, GeometricObject go, CollideType collideType = CollideType.None)
        {
            GameObject gao = null;

            if (type == GeometricObject.Type.Collide)
            {
                gao       = new GameObject("Element Spheres @ " + Offset);
                gao.layer = LayerMask.NameToLayer("Collide");
                gao.transform.localPosition = Vector3.zero;
                if (spheres.Value != null)
                {
                    Vector3[] verts = go.verticesCollide.Value?.GetVectors(go.ScaleFactor);
                    GeometricObjectElementCollideSphereArray.GeometricElementCollideSphere[] sphere = spheres.Value.spheres;
                    for (int i = 0; i < num_spheres; i++)
                    {
                        GameObject sphere_gao = GameObject.CreatePrimitive(PrimitiveType.Sphere);
                        sphere_gao.name = "Sphere " + i;
                        sphere_gao.transform.SetParent(gao.transform);
                        MeshRenderer mr = sphere_gao.GetComponent <MeshRenderer>();
                        sphere_gao.transform.localPosition = verts[sphere[i].centerPoint];
                        sphere_gao.transform.localScale    = Vector3.one * sphere[i].radius * 2;                      // default Unity sphere radius is 0.5
                        sphere_gao.layer = LayerMask.NameToLayer("Collide");

                        BillboardBehaviour bill = sphere_gao.AddComponent <BillboardBehaviour>();
                        bill.mode = BillboardBehaviour.LookAtMode.CameraPosXYZ;

                        mr.material = MapLoader.Loader.collideMaterial;
                        GameMaterial gmt = spheres.Value.spheres[i].material.Value;
                        if (gmt != null && gmt.collideMaterial.Value != null)
                        {
                            gmt.collideMaterial.Value.SetMaterial(mr);
                        }
                        if (collideType != CollideType.None)
                        {
                            Color col = mr.material.color;
                            mr.material       = MapLoader.Loader.collideTransparentMaterial;
                            mr.material.color = new Color(col.r, col.g, col.b, col.a * 0.7f);
                            switch (collideType)
                            {
                            case CollideType.ZDD:
                                mr.material.SetTexture("_MainTex", Resources.Load <Texture2D>("Textures/zdd")); break;

                            case CollideType.ZDE:
                                mr.material.SetTexture("_MainTex", Resources.Load <Texture2D>("Textures/zde")); break;

                            case CollideType.ZDM:
                                mr.material.SetTexture("_MainTex", Resources.Load <Texture2D>("Textures/zdm")); break;

                            case CollideType.ZDR:
                                mr.material.SetTexture("_MainTex", Resources.Load <Texture2D>("Textures/zdr")); break;
                            }
                        }
                    }
                }
            }
            return(gao);
        }
Пример #4
0
        public GameObject GetGameObject(GameObject parent, int index, CollideType collideType = CollideType.None)
        {
            GameObject gao = GameObject.CreatePrimitive(PrimitiveType.Sphere);

            gao.name = "Sphere " + index;
            gao.transform.SetParent(parent.transform);
            MeshRenderer mr = gao.GetComponent <MeshRenderer>();

            gao.transform.localPosition = new Vector3(x / 256f, z / 256f, y / 256f);
            gao.transform.localScale    = Vector3.one * (radius / 256f) * 2;          // default Unity sphere radius is 0.5
            gao.layer = LayerMask.NameToLayer("Collide");

            BillboardBehaviour bill = gao.AddComponent <BillboardBehaviour>();

            bill.mode = BillboardBehaviour.LookAtMode.CameraPosXYZ;

            GameMaterial    gm = (Load as R2PS1Loader).levelHeader.gameMaterials?[gameMaterial];
            CollideMaterial cm = gm?.collideMaterial;

            if (cm != null)
            {
                mr.material = cm.CreateMaterial();
            }
            else
            {
                mr.material = new Material(MapLoader.Loader.collideMaterial);
            }
            if (collideType != CollideType.None)
            {
                Color col = mr.material.color;
                mr.material       = new Material(MapLoader.Loader.collideTransparentMaterial);
                mr.material.color = new Color(col.r, col.g, col.b, col.a * 0.7f);
                switch (collideType)
                {
                case CollideType.ZDD:
                    mr.material.SetTexture("_MainTex", Resources.Load <Texture2D>("Textures/zdd")); break;

                case CollideType.ZDM:
                    mr.material.SetTexture("_MainTex", Resources.Load <Texture2D>("Textures/zdm")); break;

                case CollideType.ZDE:
                    mr.material.SetTexture("_MainTex", Resources.Load <Texture2D>("Textures/zde")); break;

                case CollideType.ZDR:
                    mr.material.SetTexture("_MainTex", Resources.Load <Texture2D>("Textures/zdr")); break;
                }
            }
            CollideComponent cc = gao.AddComponent <CollideComponent>();

            cc.collidePS1 = this;
            cc.type       = collideType;

            return(gao);
        }
Пример #5
0
        private void CreateUnityMesh()
        {
            for (uint i = 0; i < num_spheres; i++)
            {
                GameObject sphere_gao = GameObject.CreatePrimitive(PrimitiveType.Sphere);
                sphere_gao.name = "Collide Spheres @ " + offset + " - " + i + " radius @ " + spheres[i].debug_radiusAddress;
                sphere_gao.transform.SetParent(gao.transform);
                MeshFilter       mf = sphere_gao.GetComponent <MeshFilter>();
                MeshRenderer     mr = sphere_gao.GetComponent <MeshRenderer>();
                CollideComponent cc = sphere_gao.AddComponent <CollideComponent>();
                cc.collide = this;
                cc.type    = geo.type;
                cc.index   = (int)i;
                //MonoBehaviour.Destroy(sphere_gao.GetComponent<SphereCollider>());
                sphere_gao.transform.localPosition = geo.vertices[spheres[i].centerPoint];
                sphere_gao.transform.localScale    = Vector3.one * spheres[i].radius * 2; // default Unity sphere radius is 0.5
                sphere_gao.layer = LayerMask.NameToLayer("Collide");

                BillboardBehaviour b = sphere_gao.AddComponent <BillboardBehaviour>();
                b.mode = BillboardBehaviour.LookAtMode.CameraPosXYZ;

                mr.material = MapLoader.Loader.collideMaterial;
                if (spheres[i].gameMaterial != null && spheres[i].gameMaterial.collideMaterial != null)
                {
                    spheres[i].gameMaterial.collideMaterial.SetMaterial(mr);
                }
                if (geo.type != CollideType.None)
                {
                    Color col = mr.material.color;
                    mr.material       = new Material(MapLoader.Loader.collideTransparentMaterial);
                    mr.material.color = new Color(col.r, col.g, col.b, col.a * 0.7f);
                    switch (geo.type)
                    {
                    case CollideType.ZDD:
                        mr.material.SetTexture("_MainTex", Resources.Load <Texture2D>("Textures/zdd")); break;

                    case CollideType.ZDE:
                        mr.material.SetTexture("_MainTex", Resources.Load <Texture2D>("Textures/zde")); break;

                    case CollideType.ZDM:
                        mr.material.SetTexture("_MainTex", Resources.Load <Texture2D>("Textures/zdm")); break;

                    case CollideType.ZDR:
                        mr.material.SetTexture("_MainTex", Resources.Load <Texture2D>("Textures/zdr")); break;
                    }
                }
            }
        }
Пример #6
0
        public GameObject GetGameObject(out GameObject[] boneGaos, GeometricObject morphObject = null, float morphProgress = 0f)
        {
            GameObject parentGao = new GameObject(Offset.ToString());

            // Bones
            boneGaos = null;
            if (bones != null && bones.Length > 0)
            {
                GameObject rootBone = new GameObject("Root bone");
                boneGaos = new GameObject[] { rootBone };
                boneGaos[0].transform.SetParent(parentGao.transform);
                boneGaos[0].transform.localPosition = Vector3.zero;
                boneGaos[0].transform.localRotation = Quaternion.identity;
                boneGaos[0].transform.localScale    = Vector3.one;
                boneGaos = boneGaos.Concat(bones.Select(b => b.GetGameObject(parentGao))).ToArray();
            }

            // Morph
            Vector3[] mainVertices = vertices.Select(s => new Vector3(
                                                         s.x / 256f,
                                                         s.z / 256f,
                                                         s.y / 256f)).ToArray();
            Color[] mainColors = vertices.Select(s => new Color(
                                                     s.r / (float)0x80,
                                                     s.g / (float)0x80,
                                                     s.b / (float)0x80,
                                                     1f)).ToArray();
            if (morphProgress > 0f && morphObject != null && morphObject.vertices.Length == vertices.Length)
            {
                Vector3[] morphVertices = morphObject.vertices.Select(s => new Vector3(
                                                                          s.x / 256f,
                                                                          s.z / 256f,
                                                                          s.y / 256f)).ToArray();
                Color[] morphColors = morphObject.vertices.Select(s => new Color(
                                                                      s.r / (float)0x80,
                                                                      s.g / (float)0x80,
                                                                      s.b / (float)0x80,
                                                                      1f)).ToArray();
                for (int i = 0; i < vertices.Length; i++)
                {
                    mainVertices[i] = Vector3.Lerp(mainVertices[i], morphVertices[i], morphProgress);
                    mainColors[i]   = Color.Lerp(mainColors[i], morphColors[i], morphProgress);
                }
            }

            // First pass

            Dictionary <VisualMaterial, List <IPS1Polygon> > textured = new Dictionary <VisualMaterial, List <IPS1Polygon> >();
            List <IPS1Polygon> untextured = new List <IPS1Polygon>();

            for (int i = 0; i < triangleLists.Length; i++)
            {
                PolygonList polys = triangleLists[i];
                if (polys.polygons != null)
                {
                    foreach (IPS1Polygon p in polys.polygons)
                    {
                        if (p is QuadLOD && (p as QuadLOD).quads?.Length > 0)
                        {
                            Quad[] quads = (p as QuadLOD).quads;
                            foreach (Quad q in quads)
                            {
                                VisualMaterial b = q.Material;
                                if (b == null)
                                {
                                    untextured.Add(q);
                                }
                                else
                                {
                                    if (!textured.ContainsKey(b))
                                    {
                                        textured[b] = new List <IPS1Polygon>();
                                    }
                                    textured[b].Add(q);
                                }
                            }
                        }
                        else
                        {
                            VisualMaterial b = p.Material;
                            if (b == null)
                            {
                                untextured.Add(p);
                            }
                            else
                            {
                                if (!textured.ContainsKey(b))
                                {
                                    textured[b] = new List <IPS1Polygon>();
                                }
                                textured[b].Add(p);
                            }
                        }
                    }
                }
            }

            // Second pass
            VisualMaterial[] textures = textured.Keys.ToArray();
            for (int i = 0; i < textures.Length; i++)
            {
                VisualMaterial vm = textures[i];
                TextureBounds  b  = vm.texture;

                float alpha = 1f;
                //if (!vm.IsLight) {

                /*switch (vm.BlendMode) {
                 *      case VisualMaterial.SemiTransparentMode.Point25:
                 *              alpha = 0.25f * 4f;
                 *              break;
                 *      case VisualMaterial.SemiTransparentMode.Point5:
                 *              alpha = 0.5f * 4f;
                 *              break;
                 * }*/
                //}

                IPS1Polygon pf  = textured[vm].FirstOrDefault();
                GameObject  gao = new GameObject(Offset.ToString()
                                                 + " - " + i
                                                 + " - " + pf?.Offset
                                                 + " - " + pf?.GetType()
                                                 + " - " + string.Format("{0:X2}", vm.materialFlags)
                                                 + "|" + string.Format("{0:X2}", vm.scroll)
                                                 + " - " + vm.BlendMode);
                gao.transform.SetParent(parentGao.transform);
                gao.layer = LayerMask.NameToLayer("Visual");
                gao.transform.localPosition = Vector3.zero;

                List <int>     vertIndices = new List <int>();
                List <int>     triIndices  = new List <int>();
                List <Vector2> uvs         = new List <Vector2>();
                foreach (IPS1Polygon p in textured[vm])
                {
                    int currentCount = vertIndices.Count;
                    switch (p)
                    {
                    case Triangle t:
                        vertIndices.Add(t.v0);
                        vertIndices.Add(t.v1);
                        vertIndices.Add(t.v2);

                        uvs.Add(b.CalculateUV(t.x0, t.y0));
                        uvs.Add(b.CalculateUV(t.x1, t.y1));
                        uvs.Add(b.CalculateUV(t.x2, t.y2));

                        /*Vector2 uv0 = b.CalculateUV(t.x0, t.y0);
                         * Vector2 uv1 = b.CalculateUV(t.x1, t.y1);
                         * Vector2 uv2 = b.CalculateUV(t.x2, t.y2);
                         * uvs.Add(uv0);
                         * uvs.Add(uv1);
                         * uvs.Add(uv2);*/

                        triIndices.Add(currentCount);
                        triIndices.Add(currentCount + 1);
                        triIndices.Add(currentCount + 2);
                        break;

                    case Quad q:
                        vertIndices.Add(q.v0);
                        vertIndices.Add(q.v1);
                        vertIndices.Add(q.v2);
                        vertIndices.Add(q.v3);

                        uvs.Add(b.CalculateUV(q.x0, q.y0));
                        uvs.Add(b.CalculateUV(q.x1, q.y1));
                        uvs.Add(b.CalculateUV(q.x2, q.y2));
                        uvs.Add(b.CalculateUV(q.x3, q.y3));

                        triIndices.Add(currentCount);
                        triIndices.Add(currentCount + 1);
                        triIndices.Add(currentCount + 2);

                        triIndices.Add(currentCount + 2);
                        triIndices.Add(currentCount + 1);
                        triIndices.Add(currentCount + 3);
                        break;

                    case Sprite s:

                        GameObject spr_gao = new GameObject("Sprite");
                        spr_gao.transform.SetParent(gao.transform);
                        spr_gao.transform.localPosition = mainVertices[s.v0];
                        BillboardBehaviour billboard = spr_gao.AddComponent <BillboardBehaviour>();
                        billboard.mode = BillboardBehaviour.LookAtMode.ViewRotation;
                        MeshFilter   sprites_mf = spr_gao.AddComponent <MeshFilter>();
                        MeshRenderer sprites_mr = spr_gao.AddComponent <MeshRenderer>();

                        spr_gao.layer = LayerMask.NameToLayer("Visual");

                        //Material unityMat = sprites[i].visualMaterial.MaterialBillboard;

                        sprites_mr.receiveShadows = false;
                        sprites_mr.material       = vm.CreateMaterial();

                        var       meshUnity = new Mesh();
                        Vector3[] vertices  = new Vector3[4];

                        float scale_x = 1.0f;
                        float scale_y = 1.0f;

                        scale_x = ((float)s.height / 256f) / 2.0f;
                        scale_y = ((float)s.width / 256f) / 2.0f;

                        BoxCollider bc = spr_gao.AddComponent <BoxCollider>();
                        bc.size = new Vector3(0, scale_y * 2, scale_x * 2);

                        vertices[0] = new Vector3(0, -scale_y, -scale_x);
                        vertices[1] = new Vector3(0, -scale_y, scale_x);
                        vertices[2] = new Vector3(0, scale_y, -scale_x);
                        vertices[3] = new Vector3(0, scale_y, scale_x);
                        Vector3[] normals = new Vector3[4];
                        normals[0] = Vector3.forward;
                        normals[1] = Vector3.forward;
                        normals[2] = Vector3.forward;
                        normals[3] = Vector3.forward;
                        Vector3[] sprite_uvs = new Vector3[4];

                        bool mirrorX = false;
                        bool mirrorY = false;

                        sprite_uvs[0] = new Vector3(0, 0 - (mirrorY ? 1 : 0), alpha);
                        sprite_uvs[1] = new Vector3(1 + (mirrorX ? 1 : 0), 0 - (mirrorY ? 1 : 0), alpha);
                        sprite_uvs[2] = new Vector3(0, 1, alpha);
                        sprite_uvs[3] = new Vector3(1 + (mirrorX ? 1 : 0), 1, alpha);
                        int[] triangles = new int[] { 0, 2, 1, 1, 2, 3 };

                        meshUnity.vertices  = vertices;
                        meshUnity.normals   = normals;
                        meshUnity.triangles = triangles;
                        meshUnity.SetUVs(0, sprite_uvs.ToList());
                        sprites_mf.sharedMesh = meshUnity;

                        break;
                    }
                }
                //Vertex[] v = vertIndices.Select(vi => vertices[vi]).ToArray();
                BoneWeight[] w = null;
                if (bones != null && bones.Length > 0 && boneWeights != null)
                {
                    w = new BoneWeight[vertIndices.Count];
                    for (int vi = 0; vi < w.Length; vi++)
                    {
                        DeformVertexWeights dvw = boneWeights.FirstOrDefault(bw => bw.ind_vertex == vertIndices[vi]);
                        if (dvw != null)
                        {
                            w[vi] = dvw.UnityWeight;
                        }
                        else
                        {
                            w[vi] = new BoneWeight()
                            {
                                boneIndex0 = 0, weight0 = 1f
                            };
                        }
                    }
                }
                if (vertIndices.Any())
                {
                    MeshFilter mf = gao.AddComponent <MeshFilter>();
                    gao.AddComponent <ExportableModel>();
                    MeshRenderer        mr        = null;
                    SkinnedMeshRenderer smr       = null;
                    Matrix4x4[]         bindPoses = null;
                    if (bones == null || bones.Length <= 0)
                    {
                        mr = gao.AddComponent <MeshRenderer>();
                    }
                    else
                    {
                        smr = gao.AddComponent <SkinnedMeshRenderer>();
                        //smr = (SkinnedMeshRenderer)mr;
                        smr.bones = boneGaos.Select(bo => bo.transform).ToArray();
                        bindPoses = new Matrix4x4[smr.bones.Length];
                        for (int bi = 0; bi < smr.bones.Length; bi++)
                        {
                            bindPoses[bi] = smr.bones[bi].worldToLocalMatrix * parentGao.transform.localToWorldMatrix;
                        }
                        smr.rootBone = smr.bones[0];
                    }

                    Mesh m = new Mesh();
                    m.vertices = vertIndices.Select(vi => mainVertices[vi]).ToArray();
                    m.colors   = vertIndices.Select(vi => mainColors[vi]).ToArray();
                    m.SetUVs(0, uvs.Select(s => new Vector4(s.x, s.y, alpha, 0f)).ToList());
                    m.triangles = triIndices.ToArray();
                    m.RecalculateNormals();
                    if (w != null)
                    {
                        m.boneWeights = w;
                        m.bindposes   = bindPoses;
                    }
                    mf.mesh = m;

                    if (mr != null)
                    {
                        mr.material = vm.CreateMaterial();
                    }
                    else if (smr != null)
                    {
                        smr.material   = vm.CreateMaterial();
                        smr.sharedMesh = m;
                    }
                    try {
                        MeshCollider mc = gao.AddComponent <MeshCollider>();
                        mc.isTrigger = false;
                        //mc.cookingOptions = MeshColliderCookingOptions.None;
                        //mc.sharedMesh = mesh;
                    } catch (Exception) { }
                }
            }
            // Untextured (some skyboxes, etc)
            if (untextured.Count > 0)
            {
                GameObject gao = new GameObject(Offset.ToString() + " - Untextured");
                gao.transform.SetParent(parentGao.transform);
                gao.layer = LayerMask.NameToLayer("Visual");
                gao.transform.localPosition = Vector3.zero;
                MeshFilter mf = gao.AddComponent <MeshFilter>();
                gao.AddComponent <ExportableModel>();
                MeshRenderer mr          = gao.AddComponent <MeshRenderer>();
                List <int>   vertIndices = new List <int>();
                List <int>   triIndices  = new List <int>();

                foreach (IPS1Polygon p in untextured)
                {
                    int currentCount = vertIndices.Count;
                    switch (p)
                    {
                    case TriangleNoTexture t:
                        vertIndices.Add(t.v0);
                        vertIndices.Add(t.v1);
                        vertIndices.Add(t.v2);

                        triIndices.Add(currentCount);
                        triIndices.Add(currentCount + 1);
                        triIndices.Add(currentCount + 2);
                        break;

                    case QuadNoTexture q:
                        vertIndices.Add(q.v0);
                        vertIndices.Add(q.v1);
                        vertIndices.Add(q.v2);
                        vertIndices.Add(q.v3);

                        triIndices.Add(currentCount);
                        triIndices.Add(currentCount + 1);
                        triIndices.Add(currentCount + 2);

                        triIndices.Add(currentCount + 2);
                        triIndices.Add(currentCount + 1);
                        triIndices.Add(currentCount + 3);
                        break;

                    default:
                        Debug.LogWarning(p.GetType()); break;
                    }
                }
                //Vertex[] v = vertIndices.Select(vi => vertices[vi]).ToArray();
                Mesh m = new Mesh();
                m.vertices = vertIndices.Select(vi => mainVertices[vi]).ToArray();
                m.colors   = vertIndices.Select(vi => mainColors[vi]).ToArray();
                m.SetUVs(0, vertIndices.Select(s => new Vector4(0.5f, 0.5f, 1f, 1f)).ToList());
                m.triangles = triIndices.ToArray();
                m.RecalculateNormals();
                mf.mesh = m;

                Material baseMaterial;

                /*if (m.colors.Any(c => c.a != 1f)) {
                 *      baseMaterial = Load.baseTransparentMaterial;
                 * } else {*/
                baseMaterial = Load.baseMaterial;
                //}
                Material mat = new Material(baseMaterial);
                mat.SetInt("_NumTextures", 1);
                string    textureName = "_Tex0";
                Texture2D tex         = Util.GrayTexture();
                mat.SetTexture(textureName, tex);
                mat.SetVector("_AmbientCoef", Vector4.one);
                mat.SetFloat("_Prelit", 1f);
                mr.material = mat;

                try {
                    MeshCollider mc = gao.AddComponent <MeshCollider>();
                    mc.isTrigger = false;
                    //mc.cookingOptions = MeshColliderCookingOptions.None;
                    //mc.sharedMesh = mesh;
                } catch (Exception) { }
            }

            return(parentGao);
        }
Пример #7
0
        public GameObject GetGameObject(Type type, CollideType collideType = CollideType.None)
        {
            GameObject gao = new GameObject("GeometricObject @ " + Offset);

            if (type == Type.Visual)
            {
                gao.layer = LayerMask.NameToLayer("Visual");
            }
            else
            {
                gao.layer = LayerMask.NameToLayer("Collide");
            }
            gao.name = gao.name + " - S0:" + scaleFactor
                       + " - S1:" + factor_1
                       + " - U0:" + string.Format("{0:X4}", unk0)
                       + " - U1:" + string.Format("{0:X4}", unk1)
                       + " - U2:" + string.Format("{0:X4}", hasVertexColors)
                       + " - U3:" + string.Format("{0:X4}", lookAtMode);
            MapLoader l = MapLoader.Loader;

            if (type == Type.Visual)
            {
                if (elementsVisual.Value != null)
                {
                    // First, reset vertex buffer
                    if (Settings.s.platform == Settings.Platform.N64)
                    {
                        foreach (GeometricObjectElementVisualList.GeometricElementListEntry entry in elementsVisual.Value.elements)
                        {
                            if (entry.element.Value is GeometricObjectElementTriangles)
                            {
                                GeometricObjectElementTriangles el = entry.element.Value as GeometricObjectElementTriangles;
                                el.ResetVertexBuffer();
                            }
                        }
                    }
                    //gao.transform.position = new Vector3(UnityEngine.Random.Range(-100f, 100f), UnityEngine.Random.Range(-100f, 100f), UnityEngine.Random.Range(-100f, 100f));
                    foreach (GeometricObjectElementVisualList.GeometricElementListEntry entry in elementsVisual.Value.elements)
                    {
                        /*if (entry.element.Value == null) {
                         *      l.print("Visual element null: " + entry.element.type);
                         * }*/
                        if (entry.element.Value != null)
                        {
                            GameObject child = null;
                            if (entry.element.Value is GeometricObjectElementTriangles)
                            {
                                GeometricObjectElementTriangles el = entry.element.Value as GeometricObjectElementTriangles;
                                child = el.GetGameObject(type, this);
                            }
                            else if (entry.element.Value is GeometricObjectElementSprites)
                            {
                                GeometricObjectElementSprites el = entry.element.Value as GeometricObjectElementSprites;
                                child = el.GetGameObject(type, this);
                            }
                            if (child != null)
                            {
                                child.transform.SetParent(gao.transform);
                                child.transform.localPosition = Vector3.zero;
                            }
                        }
                    }
                }
                if (lookAtMode != 0)
                {
                    BillboardBehaviour billboard = gao.AddComponent <BillboardBehaviour>();
                    billboard.mode = (BillboardBehaviour.LookAtMode)lookAtMode;
                }
            }
            else
            {
                if (elementsCollide.Value != null)
                {
                    foreach (GeometricObjectElementCollideList.GeometricElementListEntry entry in elementsCollide.Value.elements)
                    {
                        if (entry.element.Value == null)
                        {
                            l.print("Collide element null: " + entry.element.type);
                        }
                        if (entry.element.Value != null)
                        {
                            GameObject child = null;
                            if (entry.element.Value is GeometricObjectElementCollideTriangles)
                            {
                                GeometricObjectElementCollideTriangles el = entry.element.Value as GeometricObjectElementCollideTriangles;
                                child = el.GetGameObject(type, this, collideType: collideType);
                            }
                            else if (entry.element.Value is GeometricObjectElementCollideSpheres)
                            {
                                GeometricObjectElementCollideSpheres el = entry.element.Value as GeometricObjectElementCollideSpheres;
                                child = el.GetGameObject(type, this, collideType: collideType);
                            }
                            else if (entry.element.Value is GeometricObjectElementCollideAlignedBoxes)
                            {
                                GeometricObjectElementCollideAlignedBoxes el = entry.element.Value as GeometricObjectElementCollideAlignedBoxes;
                                child = el.GetGameObject(type, this, collideType: collideType);
                            }
                            if (child != null)
                            {
                                child.transform.SetParent(gao.transform);
                                child.transform.localPosition = Vector3.zero;
                            }
                        }
                    }
                }
            }
            return(gao);
        }
        public GameObject GetGameObject(GeometricObject.Type type, GeometricObject go)
        {
            if (type == GeometricObject.Type.Visual)
            {
                float      curScaleX = scaleX / 2f;
                float      curScaleY = scaleY / 2f;
                GameObject gao       = new GameObject("ElementSprites @ " + Offset);
                gao.layer = LayerMask.NameToLayer("Visual");
                gao.transform.localPosition = Vector3.zero;

                GameObject spr_gao = new GameObject("Sprite 0");
                spr_gao.transform.SetParent(gao.transform);
                spr_gao.transform.localPosition = go.verticesCollide.Value.vectors[vertexIndex].GetVector(go.ScaleFactor);
                BillboardBehaviour billboard = spr_gao.AddComponent <BillboardBehaviour>();
                billboard.mode = BillboardBehaviour.LookAtMode.ViewRotation;
                MeshFilter   mf = spr_gao.AddComponent <MeshFilter>();
                MeshRenderer mr = spr_gao.AddComponent <MeshRenderer>();
                BoxCollider  bc = spr_gao.AddComponent <BoxCollider>();
                bc.size       = new Vector3(0, curScaleY * 2, curScaleX * 2);
                spr_gao.layer = LayerMask.NameToLayer("Visual");
                mr.material   = visualMaterial.Value.GetMaterial(VisualMaterial.Hint.Billboard, gao: spr_gao);

                bool mirrorX = false;
                bool mirrorY = false;
                if (visualMaterial.Value.num_textures > 0 &&
                    visualMaterial.Value.textures.Value.vmTex[0].texRef.Value != null &&
                    visualMaterial.Value.textures.Value.vmTex[0].texRef.Value.texInfo.Value != null)
                {
                    TextureInfo ti = visualMaterial.Value.textures.Value.vmTex[0].texRef.Value.texInfo.Value;
                    if (ti.IsMirrorX)
                    {
                        mirrorX = true;
                    }
                    if (ti.IsMirrorY)
                    {
                        mirrorY = true;
                    }

                    /*spr_gao.name += " " + string.Format("0x{0:X4}", visualMaterial.Value.num_textures) + " " + string.Format("0x{0:X4}", visualMaterial.Value.num_animTextures);
                     * for (int i = 0; i < visualMaterial.Value.num_textures; i++) {
                     *      spr_gao.name += " " + visualMaterial.Value.textures.Value.vmTex[i].time;
                     * }*/
                }

                /*if (visualMaterial.Value.num_textures > 1) {
                 *      MultiTextureMaterial mtmat = mr.gameObject.AddComponent<MultiTextureMaterial>();
                 *      mtmat.visMat = sprites[i].visualMaterial;
                 *      mtmat.mat = mr.sharedMaterial;
                 * }*/
                Mesh      meshUnity = new Mesh();
                Vector3[] vertices  = new Vector3[4];
                vertices[0] = new Vector3(0, -curScaleY, -curScaleX);
                vertices[1] = new Vector3(0, -curScaleY, curScaleX);
                vertices[2] = new Vector3(0, curScaleY, -curScaleX);
                vertices[3] = new Vector3(0, curScaleY, curScaleX);
                Vector3[] normals = new Vector3[4];
                normals[0] = Vector3.forward;
                normals[1] = Vector3.forward;
                normals[2] = Vector3.forward;
                normals[3] = Vector3.forward;
                Vector3[] uvs = new Vector3[4];
                if (Settings.s.platform == Settings.Platform.N64)
                {
                    uvs[0] = new Vector3(0, -(mirrorY ? 1 : 0), 1);
                    uvs[1] = new Vector3(1 + (mirrorX ? 1 : 0), -(mirrorY ? 1 : 0), 1);
                    uvs[2] = new Vector3(0, 1, 1);
                    uvs[3] = new Vector3(1 + (mirrorX ? 1 : 0), 1, 1);
                }
                else
                {
                    uvs[0] = new Vector3(0, 1 + (mirrorY ? 1 : 0), 1);
                    uvs[1] = new Vector3(1 + (mirrorX ? 1 : 0), 1 + (mirrorY ? 1 : 0), 1);
                    uvs[2] = new Vector3(0, 0, 1);
                    uvs[3] = new Vector3(1 + (mirrorX ? 1 : 0), 0, 1);
                }
                int[] triangles = new int[] { 0, 2, 1, 1, 2, 3 };

                meshUnity.vertices  = vertices;
                meshUnity.normals   = normals;
                meshUnity.triangles = triangles;
                meshUnity.SetUVs(0, uvs.ToList());


                mf.sharedMesh = meshUnity;
                return(gao);
            }
            else
            {
                return(null);
            }
        }
Пример #9
0
        private void CreateUnityMesh()
        {
            for (uint i = 0; i < num_sprites; i++)
            {
                bool       mirrorX = false;
                bool       mirrorY = false;
                GameObject spr_gao = new GameObject(name + " - Sprite " + i);
                spr_gao.transform.SetParent(gao.transform);
                spr_gao.transform.localPosition = geo.vertices[sprites[i].centerPoint];
                BillboardBehaviour billboard = spr_gao.AddComponent <BillboardBehaviour>();
                billboard.mode = BillboardBehaviour.LookAtMode.ViewRotation;
                MeshFilter   mf = spr_gao.AddComponent <MeshFilter>();
                MeshRenderer mr = spr_gao.AddComponent <MeshRenderer>();
                BoxCollider  bc = spr_gao.AddComponent <BoxCollider>();
                bc.size       = new Vector3(0, sprites[i].info_scale.y * 2, sprites[i].info_scale.x * 2);
                spr_gao.layer = LayerMask.NameToLayer("Visual");
                if (sprites[i].visualMaterial != null)
                {
                    if (Settings.s.game != Settings.Game.R2Revolution &&
                        sprites[i].visualMaterial.textures != null &&
                        sprites[i].visualMaterial.textures.Count > 0)
                    {
                        TextureInfo mainTex = sprites[i].visualMaterial.textures[0].texture;

                        if (mainTex != null && mainTex.IsMirrorX)
                        {
                            mirrorX = true;
                        }
                        if (mainTex != null && mainTex.IsMirrorY)
                        {
                            mirrorY = true;
                        }
                    }
                    //Material unityMat = sprites[i].visualMaterial.MaterialBillboard;
                    Material unityMat       = sprites[i].visualMaterial.GetMaterial(VisualMaterial.Hint.Billboard);
                    bool     receiveShadows = (sprites[i].visualMaterial.properties & VisualMaterial.property_receiveShadows) != 0;
                    //if (num_uvMaps > 1) unityMat.SetFloat("_UVSec", 50f);
                    //if (r3mat.Material.GetColor("_EmissionColor") != Color.black) print("Mesh with emission: " + name);
                    mr.sharedMaterial = unityMat;

                    /*mr.material.SetFloat("_ScaleX", sprites[i].info_scale.x);
                    *  mr.material.SetFloat("_ScaleY", sprites[i].info_scale.y);*/
                    if (!receiveShadows)
                    {
                        mr.receiveShadows = false;
                    }
                    if (sprites[i].visualMaterial.animTextures.Count > 0)
                    {
                        MultiTextureMaterial mtmat = mr.gameObject.AddComponent <MultiTextureMaterial>();
                        mtmat.visMat = sprites[i].visualMaterial;
                        mtmat.mat    = mr.material;
                    }
                }
                else
                {
                    Material  transMat = new Material(MapLoader.Loader.baseTransparentMaterial);
                    Texture2D tex      = new Texture2D(1, 1);
                    tex.SetPixel(0, 0, new Color(0, 0, 0, 0));
                    transMat.SetTexture("_Tex0", tex);
                    mr.sharedMaterial = transMat;
                }
                if (sprites[i].meshUnity == null)
                {
                    sprites[i].meshUnity = new Mesh();
                    Vector3[] vertices = new Vector3[4];
                    vertices[0] = new Vector3(0, -sprites[i].info_scale.y, -sprites[i].info_scale.x);
                    vertices[1] = new Vector3(0, -sprites[i].info_scale.y, sprites[i].info_scale.x);
                    vertices[2] = new Vector3(0, sprites[i].info_scale.y, -sprites[i].info_scale.x);
                    vertices[3] = new Vector3(0, sprites[i].info_scale.y, sprites[i].info_scale.x);
                    Vector3[] normals = new Vector3[4];
                    normals[0] = Vector3.forward;
                    normals[1] = Vector3.forward;
                    normals[2] = Vector3.forward;
                    normals[3] = Vector3.forward;
                    Vector3[] uvs = new Vector3[4];
                    uvs[0] = new Vector3(0, 0 - (mirrorY ? 1 : 0), 1);
                    uvs[1] = new Vector3(1 + (mirrorX ? 1 : 0), 0 - (mirrorY ? 1 : 0), 1);
                    uvs[2] = new Vector3(0, 1, 1);
                    uvs[3] = new Vector3(1 + (mirrorX ? 1 : 0), 1, 1);
                    int[] triangles = new int[] { 0, 2, 1, 1, 2, 3 };

                    sprites[i].meshUnity.vertices  = vertices;
                    sprites[i].meshUnity.normals   = normals;
                    sprites[i].meshUnity.triangles = triangles;
                    sprites[i].meshUnity.SetUVs(0, uvs.ToList());
                }


                mf.sharedMesh = sprites[i].meshUnity;
            }
        }