コード例 #1
0
 /**************************************************************************/
 public void loadMap(uint mapID, uint tileX, uint tileY, MeshData meshData, VMapManager2 vm)
 {
     if (loadMap(mapID, tileX, tileY, meshData, Spot.Entire))
     {
         loadMap(mapID, tileX + 1, tileY, meshData, Spot.Left);
         loadMap(mapID, tileX - 1, tileY, meshData, Spot.Right);
         loadMap(mapID, tileX, tileY + 1, meshData, Spot.Top);
         loadMap(mapID, tileX, tileY - 1, meshData, Spot.Bottom);
     }
 }
コード例 #2
0
        public TerrainBuilder(VMapManager2 vm)
        {
            vmapManager = vm;

            liquidTypeStorage = DBReader.Read <LiquidTypeRecord>(1371380);
            if (liquidTypeStorage == null)
            {
                Console.WriteLine("Fatal error: Invalid LiquidType.db2 file format!");
            }
        }
コード例 #3
0
ファイル: MapBuilder.cs プロジェクト: jungrok5/Tools
        public MapBuilder(VMapManager2 vm)
        {
            _vmapManager = vm;

            m_maxWalkableAngle = 70.0f;

            m_terrainBuilder = new TerrainBuilder(vm);
            m_rcContext      = new rcContext(false);

            discoverTiles();
        }
コード例 #4
0
ファイル: MapBuilder.cs プロジェクト: Sylvamore/Tools
        public MapBuilder(VMapManager2 vm, bool debugMaps)
        {
            _vmapManager = vm;
            _debugMaps   = debugMaps;

            m_maxWalkableAngle = 70.0f;

            m_terrainBuilder = new TerrainBuilder(vm);
            m_rcContext      = new rcContext();

            discoverTiles();
        }
コード例 #5
0
        /**************************************************************************/
        public bool loadVMap(uint mapID, uint tileX, uint tileY, MeshData meshData)
        {
            var            vmapManager = new VMapManager2();
            VMAPLoadResult result      = vmapManager.loadMap("vmaps", mapID, tileX, tileY);
            bool           retval      = false;

            do
            {
                if (result == 0)
                {
                    break;
                }

                Dictionary <uint, StaticMapTree> instanceTrees;
                vmapManager.getInstanceMapTree(out instanceTrees);

                if (instanceTrees[mapID] == null)
                {
                    break;
                }

                ModelInstance[] models = null;
                uint            count;
                instanceTrees[mapID].getModelInstances(out models, out count);

                if (models == null)
                {
                    break;
                }

                for (uint i = 0; i < count; ++i)
                {
                    ModelInstance instance = models[i];
                    if (instance == null)
                    {
                        continue;
                    }

                    // model instances exist in tree even though there are instances of that model in this tile
                    WorldModel worldModel = instance.getWorldModel();
                    if (worldModel == null)
                    {
                        continue;
                    }

                    // now we have a model to add to the meshdata
                    retval = true;

                    List <GroupModel> groupModels;
                    worldModel.getGroupModels(out groupModels);

                    // all M2s need to have triangle indices reversed
                    bool isM2 = instance.name.Contains(".m2") || instance.name.Contains(".M2");

                    // transform data
                    float   scale    = instance.iScale;
                    Matrix3 rotation = Matrix3.fromEulerAnglesXYZ(MathF.PI * instance.iRot.Z / -180.0f, MathF.PI * instance.iRot.X / -180.0f, MathF.PI * instance.iRot.Y / -180.0f);
                    Vector3 position = instance.iPos;
                    position.X -= 32 * SharedConst.GRID_SIZE;
                    position.Y -= 32 * SharedConst.GRID_SIZE;

                    foreach (var it in groupModels)
                    {
                        List <Vector3>      tempVertices;
                        List <Vector3>      transformedVertices = new List <Vector3>();
                        List <MeshTriangle> tempTriangles;
                        WmoLiquid           liquid = null;

                        it.getMeshData(out tempVertices, out tempTriangles, out liquid);

                        // first handle collision mesh
                        transform(tempVertices.ToArray(), transformedVertices, scale, rotation, position);

                        int offset = meshData.solidVerts.Count / 3;

                        copyVertices(transformedVertices.ToArray(), meshData.solidVerts);
                        copyIndices(tempTriangles, meshData.solidTris, offset, isM2);

                        // now handle liquid data
                        if (liquid != null)
                        {
                            List <Vector3> liqVerts = new List <Vector3>();
                            List <uint>    liqTris = new List <uint>();
                            uint           tilesX, tilesY, vertsX, vertsY;
                            Vector3        corner;
                            liquid.getPosInfo(out tilesX, out tilesY, out corner);
                            vertsX = tilesX + 1;
                            vertsY = tilesY + 1;
                            byte[]     flags = liquid.iFlags;
                            float[]    data  = liquid.iHeight;
                            NavTerrain type  = NavTerrain.Empty;

                            // convert liquid type to NavTerrain
                            switch (liquid.iType & 3)
                            {
                            case 0:
                            case 1:
                                type = NavTerrain.Water;
                                break;

                            case 2:
                                type = NavTerrain.Magma;
                                break;

                            case 3:
                                type = NavTerrain.Slime;
                                break;
                            }

                            // indexing is weird...
                            // after a lot of trial and error, this is what works:
                            // vertex = y*vertsX+x
                            // tile   = x*tilesY+y
                            // flag   = y*tilesY+x

                            Vector3 vert;
                            for (uint x = 0; x < vertsX; ++x)
                            {
                                for (uint y = 0; y < vertsY; ++y)
                                {
                                    vert    = new Vector3(corner.X + x * SharedConst.GRID_PART_SIZE, corner.Y + y * SharedConst.GRID_PART_SIZE, data[y * vertsX + x]);
                                    vert    = vert * rotation * scale + position;
                                    vert.X *= -1.0f;
                                    vert.Y *= -1.0f;
                                    liqVerts.Add(vert);
                                }
                            }

                            uint idx1, idx2, idx3, idx4;
                            uint square;
                            for (uint x = 0; x < tilesX; ++x)
                            {
                                for (uint y = 0; y < tilesY; ++y)
                                {
                                    if ((flags[x + y * tilesX] & 0x0f) != 0x0f)
                                    {
                                        square = x * tilesY + y;
                                        idx1   = square + x;
                                        idx2   = square + 1 + x;
                                        idx3   = square + tilesY + 1 + 1 + x;
                                        idx4   = square + tilesY + 1 + x;

                                        // top triangle
                                        liqTris.Add(idx3);
                                        liqTris.Add(idx2);
                                        liqTris.Add(idx1);
                                        // bottom triangle
                                        liqTris.Add(idx4);
                                        liqTris.Add(idx3);
                                        liqTris.Add(idx1);
                                    }
                                }
                            }

                            int liqOffset = meshData.liquidVerts.Count / 3;
                            for (int x = 0; x < liqVerts.Count; ++x)
                            {
                                meshData.liquidVerts.Add(liqVerts[x].Y);
                                meshData.liquidVerts.Add(liqVerts[x].Z);
                                meshData.liquidVerts.Add(liqVerts[x].X);
                            }

                            for (int x = 0; x < liqTris.Count / 3; ++x)
                            {
                                meshData.liquidTris.Add((int)(liqTris[x * 3 + 1] + liqOffset));
                                meshData.liquidTris.Add((int)(liqTris[x * 3 + 2] + liqOffset));
                                meshData.liquidTris.Add((int)(liqTris[x * 3] + liqOffset));
                                meshData.liquidType.Add((byte)type);
                            }
                        }
                    }
                }
            }while (false);

            vmapManager.unloadMap(mapID, tileX, tileY);

            return(retval);
        }
コード例 #6
0
ファイル: TerrainBuilder.cs プロジェクト: yurlik-karu/Tools
 public TerrainBuilder(VMapManager2 vm)
 {
     vmapManager = vm;
 }