Exemplo n.º 1
0
        protected override void ReadInternal(Reader reader)
        {
            ushort_00           = reader.ReadUInt16();
            ushort_02           = reader.ReadUInt16();
            off_collideMaterial = Pointer.Read(reader);
            int_08  = reader.ReadInt32();
            uint_0C = reader.ReadUInt32();

            collideMaterial = Load.FromOffsetOrRead <CollideMaterial>(reader, off_collideMaterial);
        }
Exemplo n.º 2
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);
        }
Exemplo n.º 3
0
        public GameObject GetGameObject(GameObject parent, int index, CollideType collideType = CollideType.None)
        {
            GameObject gao = GameObject.CreatePrimitive(PrimitiveType.Cube);

            gao.name = "Box " + index + " - " + Offset;
            gao.transform.SetParent(parent.transform);
            MeshRenderer mr        = gao.GetComponent <MeshRenderer>();
            Vector3      minVertex = new Vector3(x0, z0, y0) / R2PS1Loader.CoordinateFactor;
            Vector3      maxVertex = new Vector3(x1, z1, y1) / R2PS1Loader.CoordinateFactor;
            Vector3      center    = Vector3.Lerp(minVertex, maxVertex, 0.5f);

            gao.transform.localPosition = center;
            gao.transform.localScale    = maxVertex - minVertex;
            gao.layer = LayerMask.NameToLayer("Collide");

            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);
        }
Exemplo n.º 4
0
        public GameObject GetGameObject()
        {
            GameObject parentGao = new GameObject(Offset.ToString());

            // First pass

            Dictionary <byte, List <IPS1PolygonCollide> > elementsDict = new Dictionary <byte, List <IPS1PolygonCollide> >();

            foreach (GeometricObjectCollideTriangle t in triangles)
            {
                byte gmi = t.MaterialIndex;
                if (!elementsDict.ContainsKey(gmi))
                {
                    elementsDict[gmi] = new List <IPS1PolygonCollide>();
                }
                elementsDict[gmi].Add(t);
            }
            foreach (GeometricObjectCollideQuad q in quads)
            {
                byte gmi = q.MaterialIndex;
                if (!elementsDict.ContainsKey(gmi))
                {
                    elementsDict[gmi] = new List <IPS1PolygonCollide>();
                }
                elementsDict[gmi].Add(q);
            }

            // Second pass
            byte[] elements = elementsDict.Keys.ToArray();
            for (int i = 0; i < elements.Length; i++)
            {
                byte            gmi = elements[i];
                GameMaterial    gm  = (Load as R2PS1Loader).levelHeader.gameMaterials?[gmi];
                CollideMaterial cm  = gm?.collideMaterial;

                IPS1PolygonCollide pf  = elementsDict[gmi].FirstOrDefault();
                GameObject         gao = new GameObject(Offset.ToString());
                if (cm != null)
                {
                    /*+ " - " + i
                     + " - " + pf?.Offset*/
                    gao.name += " - " + string.Format("{0:X2}", cm.type)
                                + "|" + string.Format("{0:X2}", cm.identifier);
                }
                gao.transform.SetParent(parentGao.transform);
                gao.transform.localPosition = Vector3.zero;
                gao.layer = LayerMask.NameToLayer("Collide");
                MeshFilter   mf = gao.AddComponent <MeshFilter>();
                MeshRenderer mr = gao.AddComponent <MeshRenderer>();

                List <int>     vertIndices   = new List <int>();
                List <int>     triIndices    = new List <int>();
                List <int>     normalIndices = new List <int>();
                List <Vector3> normals2      = new List <Vector3>();
                foreach (IPS1PolygonCollide p in elementsDict[gmi])
                {
                    int currentCount = vertIndices.Count;
                    switch (p)
                    {
                    case GeometricObjectCollideTriangle t:
                        vertIndices.Add(t.v0);
                        vertIndices.Add(t.v1);
                        vertIndices.Add(t.v2);

                        normalIndices.Add(t.normal);
                        normalIndices.Add(t.normal);
                        normalIndices.Add(t.normal);

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

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

                        normalIndices.Add(q.normal);
                        normalIndices.Add(q.normal);
                        normalIndices.Add(q.normal);
                        normalIndices.Add(q.normal);

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

                        triIndices.Add(currentCount + 2);
                        triIndices.Add(currentCount + 1);
                        triIndices.Add(currentCount + 3);
                        break;
                    }
                }
                GeometricObjectCollideVector[] v = vertIndices.Select(vi => vertices[vi]).ToArray();
                GeometricObjectCollideVector[] n = normalIndices.Select(ni => normals[ni]).ToArray();
                Mesh m = new Mesh();
                m.vertices = v.Select(s => new Vector3(s.x, s.z, s.y) / R2PS1Loader.CoordinateFactor).ToArray();
                //m.vertices = verts2.ToArray();
                m.normals = n.Select(s => new Vector3(
                                         s.x / (short.MaxValue / 8f),
                                         s.z / (short.MaxValue / 8f),
                                         s.y / (short.MaxValue / 8f))).ToArray();

                /*for(int j = 0; j < m.normals.Length; j++) {
                 *      GameObject g = GameObject.CreatePrimitive(PrimitiveType.Sphere);
                 *      g.transform.parent = gao.transform;
                 *      g.transform.localPosition = m.vertices[j] + m.normals[j];
                 *      g.transform.localScale = Vector3.one * 0.1f;
                 *      Load.print(m.normals[j].magnitude);
                 * }*/
                //m.SetUVs(0, uvs.Select(s => new Vector4(s.x, s.y, alpha, 0f)).ToList());
                m.triangles = triIndices.ToArray();

                Vector2[] uvs = new Vector2[m.vertexCount];

                // Generate simple UVs for collision checkerboard (basically a box projection)
                for (int j = 0; j < m.vertexCount; j++)
                {
                    Vector3 normal = m.normals[j];
                    normal = new Vector3(Mathf.Abs(normal.x), Mathf.Abs(normal.y), Mathf.Abs(normal.z));
                    float biggestNorm = Mathf.Max(normal.x, normal.y, normal.z);

                    float uvX = (m.vertices[j].x / 20.0f);
                    float uvY = (m.vertices[j].y / 20.0f);
                    float uvZ = (m.vertices[j].z / 20.0f);

                    //Debug.Log("Norms: " + normal.x+","+normal.y+","+normal.z);
                    //Debug.Log("Biggest norm: " + biggestNorm);
                    if (biggestNorm == Mathf.Abs(normal.x))
                    {
                        uvs[j] = new Vector2(uvY, uvZ);
                    }
                    else if (biggestNorm == Mathf.Abs(normal.y))
                    {
                        uvs[j] = new Vector2(uvX, uvZ);
                    }
                    else if (biggestNorm == Mathf.Abs(normal.z))
                    {
                        uvs[j] = new Vector2(uvX, uvY);
                    }
                    else
                    {
                        Debug.LogError("HALP");
                    }
                }
                m.uv = uvs;

                mf.mesh = m;

                mr.material = gm.CreateMaterial();

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

                CollideComponent cc = gao.AddComponent <CollideComponent>();
                cc.collidePS1 = this;
                cc.index      = gmi;            // Abuse the index for the game material index
            }
            return(parentGao);
        }