Beispiel #1
0
        //Get a resource given an id
        // the id is coming from	TILEART -> TEXTURES
        //					or		TERRAINDEF -> TEXTURES
        public static UOResource getResource(Tileart tileart)
        {
            UOResource resource = null;

            //WorldArt Texture
            if (tileart.textures[0].texturePresent == 1)
            {
                resource = getResource(tileart.textures[0].texturesArray[0], ShaderTypes.Sprite);
            }
            //LegacyTexture
            if (resource == null && tileart.textures[1].texturePresent == 1)
            {
                resource = getLegacyResource(tileart.textures[1].texturesArray[0]);
            }
            //EnhancedTexture
            //Is this really necessary?
            //Light Texture
            if (resource != null && tileart.textures[3].texturePresent == 1)
            {
                //TODO: light texture load
            }
            //
            if (resource == null)
            {
                UOConsole.Fatal("texture is not present {0}", tileart.id);
                tileart  = UOResourceManager.getTileart(1);
                resource = getResource(tileart.textures[0].texturesArray[0], ShaderTypes.Sprite);
            }

            return(resource);
        }
Beispiel #2
0
        public UOSprite(uint spriteID)
        {
            tileart  = UOResourceManager.getTileart(spriteID);
            resource = UOResourceManager.getResource(tileart);

            if (resource.isLegacy)
            {
                _imageOffset = tileart.offset2D;
            }
            else
            {
                _imageOffset = tileart.offsetEC;
            }

            _drawOffsetX = tileart.offsetEC.offX / UOEC_SIZE;
            _drawOffsetY = tileart.offsetEC.offY / UOEC_SIZE;
        }
Beispiel #3
0
        /// <summary>
        /// MAIN THREAD -> TODO : Separate loading from GameObjects.
        /// Build the terrain mesh for the current sectorID
        /// </summary>
        /// <param name="fs"></param>
        /// <returns></returns>
        private static facetSectorMesh buildTerrainMesh(FacetSector fs)
        {
            facetSectorMesh mesh = new facetSectorMesh();

            int worldY = (fs.sectorID % 64) * 64;
            int worldX = (fs.sectorID / 64) * 64;

            mesh.vertices = new Vector3[4 * (64 * 64)];
            mesh.normals  = new Vector3[4 * (64 * 64)];
            mesh.uvs      = new Vector2[4 * 64 * 64];

            mesh.triangles = new int[3 * (64 * 64 * 2)];

            int flipper = -1;

            for (int x = 0; x < fs.tiles.Length; ++x)
            {
                for (int y = 0; y < fs.tiles[x].Length; ++y)
                {
                    float z           = +fs.tiles[x][y].z * 6 / UOSprite.UOEC_SIZE;
                    int   idxVertices = 4 * (x + y * 64);

                    float z0, z1, z2, z3;
                    z0 = z;
                    z1 = z;
                    z2 = z;
                    z3 = z;
                    if (x == 0)
                    {
                        //TODO: take information from other sector delimiters
                    }
                    else if (y == 0)
                    {
                    }
                    else
                    {
                        z0 = (fs.tiles[x - 1][y - 1].z) * 6 / (UOSprite.UOEC_SIZE);
                        z1 = (fs.tiles[x][y - 1].z) * 6 / (UOSprite.UOEC_SIZE);
                        z2 = (fs.tiles[x - 1][y].z) * 6 / (UOSprite.UOEC_SIZE);
                        z3 = (fs.tiles[x][y].z) * 6 / (UOSprite.UOEC_SIZE);
                    }

                    int _x = x + worldX, _y = y + worldY;
                    // 0	1
                    // |  \ |
                    // 2	3
                    //Vertices
                    mesh.vertices[idxVertices + 0] = new Vector3(_x - z0, flipper * _y + z0, 100 - z0);
                    mesh.vertices[idxVertices + 1] = new Vector3(_x + 1 - z1, flipper * _y + z1, 100 - z1);
                    mesh.vertices[idxVertices + 2] = new Vector3(_x - z2, flipper * (_y + 1) + z2, 100 - z2);
                    mesh.vertices[idxVertices + 3] = new Vector3(_x + 1 - z3, flipper * (_y + 1) + z3, 100 - z3);

                    //Normals
                    mesh.normals[idxVertices + 0] = mesh.normals[idxVertices + 1] = mesh.normals[idxVertices + 2] = mesh.normals[idxVertices + 3] = Vector3.up;


                    //Triangles - Clockwise
                    List <int> subTriangles;                   // List containin all indices of sametexture
                    uvStatus   uvOffset;

                    TextureImageInfo textureInfo = UOResourceManager.getLandtileTextureID(fs.tiles[x][y].landtileGraphic);
                    if (mesh.subMeshes.ContainsKey(textureInfo.textureIDX))
                    {
                        subTriangles = mesh.subMeshes[textureInfo.textureIDX];                        //Get the already instanced list
                        uvOffset     = mesh.subMeshTextureOffset[textureInfo.textureIDX];
                    }
                    else
                    {
                        //Create a new list and set it
                        subTriangles = new List <int>();
                        mesh.subMeshes.Add(textureInfo.textureIDX, subTriangles);
                        //Each subMesh has a material
                        Material mat = UOResourceManager.getResource(textureInfo, ShaderTypes.Terrain).getMaterial();
                        mesh.materials.Add(mat);
                        //
                        uvOffset   = new uvStatus();
                        uvOffset.u = 0;
                        uvOffset.v = 0;
                        mesh.subMeshTextureOffset[textureInfo.textureIDX] = uvOffset;
                    }

                    //Bottom triangles
                    int offset = idxVertices;
                    subTriangles.Add(offset);
                    subTriangles.Add(offset + 3);
                    subTriangles.Add(offset + 2);
                    //Upper triangles
                    subTriangles.Add(offset);
                    subTriangles.Add(offset + 1);
                    subTriangles.Add(offset + 3);
                    //End Triangles

                    //UVs
                    float us, ue, vs, ve;
                    float texSize = 1.0f / textureInfo.repetition;
                    us = uvOffset.u;
                    ue = uvOffset.u + texSize;
                    vs = uvOffset.v;
                    ve = uvOffset.v + texSize;

                    if (ue > 1.0f)
                    {
                        ue -= 1.0f;
                    }
                    if (ve > 1.0f)
                    {
                        ve -= 1.0f;
                    }
                    mesh.uvs[idxVertices + 0] = new Vector2(us, ve);
                    mesh.uvs[idxVertices + 1] = new Vector2(ue, ve);
                    mesh.uvs[idxVertices + 2] = new Vector2(us, vs);
                    mesh.uvs[idxVertices + 3] = new Vector2(ue, vs);

                    //TODO Correct handling
                    //uvOffset.u += texSize;
                    //uvOffset.v += texSize;
                    if (uvOffset.v >= 1.0f)
                    {
                        uvOffset.v = 0;
                    }
                    if (uvOffset.u >= 1.0f)
                    {
                        uvOffset.u = 0;
                    }
                }
            }


            return(mesh);
        }