private Quaternion tileRotation(LBDTile tile)
        {
            switch (tile.TileDirection)
            {
            case LBDTile.TileDirections.Deg90:
            {
                return(Quaternion.AngleAxis(90, Vector3.up));
            }

            case LBDTile.TileDirections.Deg180:
            {
                return(Quaternion.AngleAxis(180, Vector3.up));
            }

            case LBDTile.TileDirections.Deg270:
            {
                return(Quaternion.AngleAxis(270, Vector3.up));
            }

            default:
            {
                return(Quaternion.identity);
            }
            }
        }
Exemple #2
0
        public static List <IRenderable> CreateLBDTileMesh(LBDTile tile,
                                                           LBDTile[] extraTiles,
                                                           int x,
                                                           int y,
                                                           TMD tilesTmd,
                                                           Shader shader,
                                                           ITexture2D vram,
                                                           bool headless)
        {
            List <IRenderable> returnMeshList = new List <IRenderable>();

            returnMeshList.Add(createSingleLBDTileMesh(tile, x, y, tilesTmd, shader, vram, headless));

            LBDTile currentTile = tile;
            int     i           = 0;

            while (currentTile.ExtraTileIndex >= 0 && i <= 1)
            {
                LBDTile extraTile = extraTiles[currentTile.ExtraTileIndex];
                returnMeshList.Add(createSingleLBDTileMesh(extraTile, x, y, tilesTmd, shader, vram, headless));
                currentTile = extraTile;
                i++;
            }

            return(returnMeshList);
        }
        // create an LBD tile GameObject
        private static GameObject createLBDTile(LBDTile tile,
                                                LBDTile[] extraTiles,
                                                int x,
                                                int y,
                                                TMD tilesTmd,
                                                List <CombineInstance> meshesCreated)
        {
            // create the GameObject for the base tile
            GameObject lbdTile = createSingleLBDTile(tile, x, y, tilesTmd, meshesCreated);

            // now see if it has any extra tiles, and create those
            LBDTile curTile = tile;
            int     i       = 0;

            while (curTile.ExtraTileIndex >= 0 && i <= 1)
            {
                LBDTile    extraTile    = extraTiles[curTile.ExtraTileIndex];
                GameObject extraTileObj = createSingleLBDTile(extraTile, x, y, tilesTmd, meshesCreated);
                extraTileObj.transform.SetParent(lbdTile.transform, true); // parent them to original tile
                curTile = extraTile;
                i++;
            }

            return(lbdTile);
        }
        private FastMesh createTileMesh(LBDTile tile, TMD tilesTmd, Dictionary <TMDObject, FastMesh> tileCache)
        {
            TMDObject tileObj = tilesTmd.ObjectTable[tile.TileType];

            if (tileCache.ContainsKey(tileObj))
            {
                return(tileCache[tileObj]);
            }

            Mesh     m  = LibLSDUnity.MeshFromTMDObject(tileObj);
            FastMesh fm = new FastMesh(m, new[] { LBDDiffuse, LBDAlpha });

            tileCache[tileObj] = fm;
            return(fm);
        }
Exemple #5
0
        public LBDTileTreeNode(string text,
                               IRenderable tileMesh,
                               LBDTile tile,
                               List <IRenderable> meshes) : base(text, meshes)
        {
            _tileMesh = tileMesh;

            var footstepSoundAndCollision = Convert.ToString(tile.FootstepSoundAndCollision, 2);
            var unknown = tile.UnknownFlag == 1 ? "true" : "false";

            _tooltip = () =>
            {
                ImGui.Text($"{footstepSoundAndCollision} - footstep/collision");
                ImGui.Text($"{unknown} - unknown");
                ImGui.Text($"{tile.UnknownFlag}");
            };
        }
Exemple #6
0
        private static IRenderable createSingleLBDTileMesh(LBDTile tile,
                                                           int x,
                                                           int y,
                                                           TMD tilesTmd,
                                                           Shader shader,
                                                           ITexture2D vram,
                                                           bool headless)
        {
            TMDObject   tileObj  = tilesTmd.ObjectTable[tile.TileType];
            IRenderable tileMesh = MeshFromTMDObject(tileObj, shader, headless);

            switch (tile.TileDirection)
            {
            case LBDTile.TileDirections.Deg90:
            {
                tileMesh.Transform.Rotation =
                    Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(90));
                break;
            }

            case LBDTile.TileDirections.Deg180:
            {
                tileMesh.Transform.Rotation =
                    Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(180));
                break;
            }

            case LBDTile.TileDirections.Deg270:
            {
                tileMesh.Transform.Rotation =
                    Quaternion.FromAxisAngle(Vector3.UnitY, MathHelper.DegreesToRadians(270));
                break;
            }
            }

            tileMesh.Transform.Position = new Vector3(x, tile.TileHeight, y);

            tileMesh.Textures.Add(vram);

            return(tileMesh);
        }
        private GameObject createLBDTileMap(LBD lbd, Vector3 posOffset, Dictionary <TMDObject, FastMesh> tileCache)
        {
            List <CombineInstance> colliderMeshes = new List <CombineInstance>();

            int tileNo = 0;

            for (int i = 0; i < lbd.TileLayout.Length; i++)
            {
                int     x    = tileNo % lbd.Header.TileWidth;
                int     y    = tileNo / lbd.Header.TileWidth;
                LBDTile tile = lbd.TileLayout[x, y];

                // create an LBD tile if we should draw it
                if (tile.DrawTile)
                {
                    FastMesh mesh   = createTileMesh(tile, lbd.Tiles, tileCache);
                    var      matrix = mesh.AddInstance(new Vector3(x, -tile.TileHeight, y) + posOffset, tileRotation(tile));
                    colliderMeshes.Add(new CombineInstance
                    {
                        mesh         = mesh.Mesh,
                        transform    = matrix,
                        subMeshIndex = 0
                    });
                    if (mesh.Mesh.subMeshCount > 1)
                    {
                        colliderMeshes.Add(new CombineInstance
                        {
                            mesh         = mesh.Mesh,
                            transform    = matrix,
                            subMeshIndex = 1
                        });
                    }

                    // now do extra tiles
                    LBDTile curTile = tile;
                    int     j       = 0;
                    while (curTile.ExtraTileIndex >= 0 && j <= 1)
                    {
                        LBDTile  extraTile     = lbd.ExtraTiles[curTile.ExtraTileIndex];
                        FastMesh extraTileMesh = createTileMesh(extraTile, lbd.Tiles, tileCache);
                        var      extraMatrix   =
                            extraTileMesh.AddInstance(new Vector3(x, -extraTile.TileHeight, y) + posOffset,
                                                      tileRotation(extraTile));
                        colliderMeshes.Add(new CombineInstance
                        {
                            mesh         = extraTileMesh.Mesh,
                            transform    = extraMatrix,
                            subMeshIndex = 0
                        });
                        if (extraTileMesh.Mesh.subMeshCount > 1)
                        {
                            colliderMeshes.Add(new CombineInstance
                            {
                                mesh         = extraTileMesh.Mesh,
                                transform    = extraMatrix,
                                subMeshIndex = 1
                            });
                        }

                        curTile = extraTile;
                        j++;
                    }
                }

                tileNo++;
            }

            return(createLBDCollider(colliderMeshes, posOffset));
        }
        // create a single LBD tile GameObject (not including extra tiles)
        private GameObject createSingleLBDTile(LBDTile tile, int x, int y, TMD tilesTmd,
                                               List <CombineInstance> meshesCreated, Dictionary <TMDObject, Mesh> cache)
        {
            // rotate the tile based on its direction
            Quaternion tileRot = Quaternion.identity;

            switch (tile.TileDirection)
            {
            case LBDTile.TileDirections.Deg90:
            {
                tileRot = Quaternion.AngleAxis(90, Vector3.up);
                break;
            }

            case LBDTile.TileDirections.Deg180:
            {
                tileRot = Quaternion.AngleAxis(180, Vector3.up);
                break;
            }

            case LBDTile.TileDirections.Deg270:
            {
                tileRot = Quaternion.AngleAxis(270, Vector3.up);
                break;
            }
            }

            // create the GameObject and add/setup necessary components
            GameObject   lbdTile = LBDTilePool.Summon(new Vector3(x, -tile.TileHeight, y), tileRot);
            MeshFilter   mf      = lbdTile.GetComponent <MeshFilter>();
            MeshRenderer mr      = lbdTile.GetComponent <MeshRenderer>();
            TMDObject    tileObj = tilesTmd.ObjectTable[tile.TileType];
            Mesh         tileMesh;

            if (cache.ContainsKey(tileObj))
            {
                tileMesh = cache[tileObj];
            }
            else
            {
                tileMesh       = LibLSDUnity.MeshFromTMDObject(tileObj);
                cache[tileObj] = tileMesh;
            }
            mf.sharedMesh = tileMesh;

            // the renderer needs to use virtual PSX Vram as its materials
            mr.sharedMaterials = new[] { LBDDiffuse, LBDAlpha };

            // set the tile's height
            lbdTile.transform.position = new Vector3(x, -tile.TileHeight, y);

            // make a CombineInstance for combining all tiles into one mesh later on
            var             localToWorldMatrix = lbdTile.transform.localToWorldMatrix;
            CombineInstance combine            = new CombineInstance()
            {
                mesh         = tileMesh,
                transform    = localToWorldMatrix,
                subMeshIndex = 0
            };

            meshesCreated.Add(combine);

            // if tile has transparent part, do the same for the transparent mesh
            if (tileMesh.subMeshCount > 1)
            {
                CombineInstance combineTrans = new CombineInstance()
                {
                    mesh         = tileMesh,
                    transform    = localToWorldMatrix,
                    subMeshIndex = 1
                };
                meshesCreated.Add(combineTrans);
            }

            return(lbdTile);
        }
Exemple #9
0
        // create a single LBD tile GameObject (not including extra tiles)
        private static GameObject createSingleLBDTile(LBDTile tile, int x, int y, TMD tilesTmd,
                                                      List <CombineInstance> meshesCreated)
        {
            // create the GameObject and add/setup necessary components
            GameObject   lbdTile = new GameObject($"Tile {tile.TileType}");
            MeshFilter   mf      = lbdTile.AddComponent <MeshFilter>();
            MeshRenderer mr      = lbdTile.AddComponent <MeshRenderer>();

            lbdTile.AddComponent <CullMeshOnDistance>();
            lbdTile.AddComponent <MeshFog>();
            TMDObject tileObj  = tilesTmd.ObjectTable[tile.TileType];
            Mesh      tileMesh = MeshFromTMDObject(tileObj);

            mf.mesh = tileMesh;

            // the renderer needs to use virtual PSX Vram as its materials
            mr.sharedMaterials = new[] { PsxVram.VramMaterial, PsxVram.VramAlphaBlendMaterial };

            // rotate the tile based on its direction
            switch (tile.TileDirection)
            {
            case LBDTile.TileDirections.Deg90:
            {
                lbdTile.transform.Rotate(Vector3.up, 90);
                break;
            }

            case LBDTile.TileDirections.Deg180:
            {
                lbdTile.transform.Rotate(Vector3.up, 180);
                break;
            }

            case LBDTile.TileDirections.Deg270:
            {
                lbdTile.transform.Rotate(Vector3.up, 270);
                break;
            }
            }

            // set the tile's height
            lbdTile.transform.position = new Vector3(x, -tile.TileHeight, y);

            // make a CombineInstance for combining all tiles into one mesh later on
            var             localToWorldMatrix = lbdTile.transform.localToWorldMatrix;
            CombineInstance combine            = new CombineInstance()
            {
                mesh         = tileMesh,
                transform    = localToWorldMatrix,
                subMeshIndex = 0
            };

            meshesCreated.Add(combine);

            // if tile has transparent part, do the same for the transparent mesh
            if (tileMesh.subMeshCount > 1)
            {
                CombineInstance combineTrans = new CombineInstance()
                {
                    mesh         = tileMesh,
                    transform    = localToWorldMatrix,
                    subMeshIndex = 1
                };
                meshesCreated.Add(combineTrans);
            }

            return(lbdTile);
        }
Exemple #10
0
        private MeshListTreeNode createLBDNode(string name, LBDDocument lbdDoc)
        {
            MeshListTreeNode rootNode = new MeshListTreeNode(name, lbdDoc.TileLayout, contextMenu: new ContextMenu(
                                                                 new Dictionary <string, Action>
            {
                {
                    "Export as LBD",
                    () =>
                    {
                        _exportController.OpenDialog(
                            filePath => { _exportController.ExportOriginal(lbdDoc.Document, filePath); }, ".lbd");
                    }
                },
                {
                    "Export as OBJ",
                    () =>
                    {
                        _exportController.OpenDialog(
                            filePath => { _exportController.ExportOBJ(lbdDoc.TileLayout, filePath); }, ".obj");
                    }
                },
                {
                    "Export as PLY",
                    () =>
                    {
                        _exportController.OpenDialog(
                            filePath => { _exportController.ExportPLY(lbdDoc.TileLayout, filePath); }, ".ply");
                    }
                }
            }));

            TreeNode tilesNode = createTMDNode("Tiles", lbdDoc.TilesTMD);

            rootNode.AddNode(tilesNode);

            TreeNode tileInfoNode = new TreeNode("Tile info");

            rootNode.AddNode(tileInfoNode);
            int tileNo = 0;
            int i      = 0;

            foreach (LBDTile tile in lbdDoc.Document.TileLayout)
            {
                if (tile.DrawTile)
                {
                    int             x        = tileNo / lbdDoc.Document.Header.TileWidth;
                    int             y        = tileNo % lbdDoc.Document.Header.TileWidth;
                    var             tileMesh = lbdDoc.TileLayout[i];
                    LBDTileTreeNode tileNode =
                        new LBDTileTreeNode($"({x}, {y})", tileMesh, tile, lbdDoc.TileLayout);
                    tileInfoNode.AddNode(tileNode);
                    LBDTile currentTile = tile;
                    int     j           = 0;
                    while (currentTile.ExtraTileIndex >= 0 && j <= 1)
                    {
                        LBDTile extraTile = lbdDoc.Document.ExtraTiles[currentTile.ExtraTileIndex];
                        tileMesh = lbdDoc.TileLayout[i + j + 1];
                        tileNode =
                            new LBDTileTreeNode($"({x}, {y}) extra", tileMesh, tile, lbdDoc.TileLayout);
                        tileInfoNode.AddNode(tileNode);
                        currentTile = extraTile;
                        j++;
                    }

                    i += j + 1;
                }

                tileNo++;
            }

            if (lbdDoc.Entities != null)
            {
                TreeNode objectsNode = createMMLNode("Entities", lbdDoc.Entities, lbdDoc.Document.MML.Value);
                rootNode.AddNode(objectsNode);
            }

            return(rootNode);
        }