public override bool GetValue(MapDataStore.Tile tile, MeshLayer layer, out T value)
    {
        Content cont;

        switch (layer)
        {
        case MeshLayer.BuildingMaterial:
        case MeshLayer.NoMaterialBuilding:
        case MeshLayer.BuildingMaterialCutout:
        case MeshLayer.NoMaterialBuildingCutout:
            if (defaultTile != null)
            {
                value = defaultTile.GetValue(tile, layer);
                return(true);
            }
            break;

        default:
            if (tiletypeMatcher.Get(tile.tileType, out cont))
            {
                value = cont.GetValue(tile, layer);
                return(true);
            }
            break;
        }
        value = invalidContent.GetValue(tile, layer);
        return(false);
    }
    bool GetMaterialRef(MatPairStruct material, MapDataStore.Tile tile, MeshLayer layer, out T value)
    {
        Content cont;

        if (materialMatcher.TryGetValue(material, out cont))
        {
            if (thisMaterialMatcher == null)
            {
                value = cont.GetValue(tile, layer);
                return(true);
            }
            else if (cont.overloadedItem != null)
            {
                if (cont.overloadedItem.GetValue(tile, layer, out value))
                {
                    return(true);
                }
            }
        }
        if (thisMaterialMatcher != null && thisMaterialMatcher.TryGetValue(material, out value))
        {
            return(true);
        }
        value = default(T);
        return(false);
    }
    public override bool GetValue(MapDataStore.Tile tile, MeshLayer layer, out T value)
    {
        Content cont;

        //if (layer == MeshLayer.BuildingMaterial
        //    || layer == MeshLayer.BuildingMaterialCutout
        //    || layer == MeshLayer.NoMaterialBuilding
        //    || layer == MeshLayer.NoMaterialBuildingCutout
        //    )
        //{
        //    //Buildings are always built from the same item type, generally.
        //    if (itemMatcher.Get(new MatPairStruct(-1, -1), out cont))
        //    {
        //        value = cont.GetValue(tile, layer);
        //        return true;
        //    }
        //}
        //else
        if (itemMatcher.Get(tile.construction_item, out cont))
        {
            value = cont.GetValue(tile, layer);
            return(true);
        }
        value = default(T);
        return(false);
    }
        private void RemoveActorLayer(VisualizationDataSource dataSource)
        {
            MeshLayer meshLayer = meshLayers.Find(ml => ml.Guid == dataSource.Guid);

            if (meshLayer != null)
            {
                meshLayers.Remove(meshLayer);
            }
        }
Beispiel #5
0
        public void MeshDataTest(MeshLayer input)
        {
            var serializer = new MeshLayerHandler();
            var output     = (MeshLayer)serializer.Reserialize(input);

            Assert.That(output.Id, Is.EqualTo(input.Id));
            Assert.That(output.Ref, Is.EqualTo(input.Ref));
            Assert.That(output.MaterialId, Is.EqualTo(input.MaterialId));
            Assert.That(output.Indexes, Is.EquivalentTo(input.Indexes));
            Assert.That(output.RData, Is.EquivalentTo(input.RData));
        }
    public override bool GetValue(MapDataStore.Tile tile, MeshLayer layer, out T value)
    {
        Content cont;

        if (buildingMatcher.Get(tile.buildingType, out cont))
        {
            value = cont.GetValue(tile, layer);
            return(true);
        }
        value = default(T);
        return(false);
    }
Beispiel #7
0
    public override bool GetValue(MapDataStore.Tile tile, MeshLayer layer, out T value)
    {
        Content cont;

        if (tiletypeMatcher.Get(tile.tileType, out cont))
        {
            value = cont.GetValue(tile, layer);
            return(true);
        }
        value = invalidContent.GetValue(tile, layer);
        return(false);
    }
    public override bool GetValue(MapDataStore.Tile tile, MeshLayer layer, out T value)
    {
        Content cont;

        if (itemMatcher.Get(tile.construction_item, out cont))
        {
            value = cont.GetValue(tile, layer);
            return(true);
        }
        value = default(T);
        return(false);
    }
Beispiel #9
0
    public override bool GetValue(MapDataStore.Tile tile, MeshLayer layer, out T value)
    {
        if (tile.Up == null)
        {
            if (open != null)
            {
                value = open.GetValue(tile, layer);
                return(true);
            }
            else
            {
                value = default(T);
                return(false);
            }
        }
        switch (tile.Up.shape)
        {
        case RemoteFortressReader.TiletypeShape.NO_SHAPE:
        case RemoteFortressReader.TiletypeShape.EMPTY:
        case RemoteFortressReader.TiletypeShape.RAMP_TOP:
        case RemoteFortressReader.TiletypeShape.BROOK_TOP:
        case RemoteFortressReader.TiletypeShape.ENDLESS_PIT:
        case RemoteFortressReader.TiletypeShape.BRANCH:
        case RemoteFortressReader.TiletypeShape.TRUNK_BRANCH:
        case RemoteFortressReader.TiletypeShape.TWIG:
            if (open != null)
            {
                value = open.GetValue(tile, layer);
                return(true);
            }
            else
            {
                value = default(T);
                return(false);
            }

        default:
            if (covered != null)
            {
                value = covered.GetValue(tile, layer);
                return(true);
            }
            else
            {
                value = default(T);
                return(false);
            }
        }
    }
Beispiel #10
0
    public override bool GetValue(MapDataStore.Tile tile, MeshLayer layer, out T value)
    {
        if (coordList.ContainsKey(tile.buildingLocalPos))
        {
            value = coordList[tile.buildingLocalPos].GetValue(tile, layer);
            return(true);
        }
        DFCoord2d any = new DFCoord2d(-1, -1);

        if (coordList.ContainsKey(any))
        {
            value = coordList[any].GetValue(tile, layer);
            return(true);
        }
        value = default(T);
        return(false);
    }
Beispiel #11
0
    public override bool GetValue(MapDataStore.Tile tile, MeshLayer layer, out T value)
    {
        if (tile.shape != RemoteFortressReader.TiletypeShape.RAMP)
        {
            value = default(T);
            return(false);
        }
        int index = tile.RampType - 1;

        if (rampList[index] == null)
        {
            value = default(T);
            return(false);
        }
        value = rampList[index].GetValue(tile, layer);
        return(true);
    }
Beispiel #12
0
 public T GetValue(MapDataStore.Tile tile, MeshLayer layer)
 {
     if (overloadedItem == null)
     {
         return(defaultItem);
     }
     else
     {
         T item;
         if (overloadedItem.GetValue(tile, layer, out item))
         {
             return(item);
         }
         else
         {
             return(defaultItem);
         }
     }
 }
    public override bool GetValue(MapDataStore.Tile tile, MeshLayer layer, out T value)
    {
        double  maxValue   = float.MinValue;
        Content maxContent = null;

        foreach (var item in items)
        {
            double curValue = (
                item.noise.eval(tile.position.x / item.scale_x, tile.position.y / item.scale_y, tile.position.z / item.scale_z)
                + 0.944824004155211) * item.intensity; // -0.944824004155211 was found on testing to be the minimum.
            if (curValue > maxValue)
            {
                maxValue   = curValue;
                maxContent = item.content;
            }
        }
        if (maxContent == null)
        {
            value = default(T);
            return(false);
        }
        value = maxContent.GetValue(tile, layer);
        return(true);
    }
Beispiel #14
0
        public SceneImportResult LoadStaticMesh(string filename)
        {
            var file                = new FileInfo(filename);
            VertexDescriptor vd     = VertexDescriptor.Get <ModelVertex>();
            List <MeshLayer> layers = new List <MeshLayer>();

            int[] adjacency;
            ExtendedMaterial[] meshMaterials;
            Mesh mesh = new Mesh(vd);
            List <MeshMaterial> material = new List <MeshMaterial>();

            using (SlimDX.Direct3D9.Mesh d3dMesh = SlimDX.Direct3D9.Mesh.FromFile(Engine.Graphics, filename, MeshFlags.Managed))
            {
                adjacency     = d3dMesh.GetAdjacency();
                meshMaterials = d3dMesh.GetMaterials();

                for (int i = 0; i < meshMaterials.Length; i++)
                {
                    var    matd3d          = meshMaterials[i].MaterialD3D;
                    string textureFilename = meshMaterials[i].TextureFileName;
                    if (textureFilename != null && !Path.IsPathRooted(textureFilename))
                    {
                        textureFilename = Path.Combine(Path.GetDirectoryName(filename), textureFilename);
                    }
                    material.Add(new MeshMaterial()
                    {
                        Name          = file.Name + "_material" + i,
                        Alpha         = matd3d.Diffuse.Alpha,
                        Diffuse       = matd3d.Diffuse.ToVector3(),
                        Specular      = matd3d.Specular.ToVector3(),
                        SpecularPower = Math.Max(1, matd3d.Power),
                        Reflectivity  = 0,
                        Refractitity  = 0,
                        EmissiveColor = matd3d.Emissive.ToVector3(),
                        DiffuseMap    = textureFilename != null && File.Exists(textureFilename) ?
                                        textureFilename : null
                    });
                }

                ModelVertex[] vertexes = new ModelVertex[d3dMesh.VertexCount];
                Array         indices;

                if (d3dMesh.IndexBuffer.Description.Format == Format.Index16)
                {
                    indices = new ushort[d3dMesh.FaceCount * 3];
                }
                else
                {
                    indices = new uint[d3dMesh.FaceCount * 3];
                }

                DataStream       vertexStream = d3dMesh.LockVertexBuffer(0);
                VertexDescriptor meshVD       = new VertexDescriptor(d3dMesh.GetDeclaration());
                int    positionOffset         = meshVD.GetOffset(DeclarationUsage.Position, 0);
                int    normalOffset           = meshVD.GetOffset(DeclarationUsage.Normal, 0);
                int    texCoordOffset         = meshVD.GetOffset(DeclarationUsage.TextureCoordinate, 0);
                byte[] buffer;
                unsafe
                {
                    buffer = new byte[vertexStream.Length];
                    vertexStream.Read(buffer, 0, (int)vertexStream.Length);
                    fixed(byte *_pter = buffer)
                    {
                        byte *pter = _pter;

                        for (int i = 0; i < d3dMesh.VertexCount; i++)
                        {
                            vertexes[i].Position = *((Vector3 *)(pter + positionOffset));
                            if (normalOffset > 0)
                            {
                                vertexes[i].Normal = *((Vector3 *)(pter + normalOffset));
                            }
                            if (texCoordOffset > 0)
                            {
                                vertexes[i].TexCoord = *((Vector2 *)(pter + texCoordOffset));
                            }

                            pter += d3dMesh.BytesPerVertex;
                        }
                    }

                    d3dMesh.UnlockVertexBuffer();

                    DataStream indexStream = d3dMesh.LockIndexBuffer(0);
                    GCHandle   handler     = GCHandle.Alloc(indices, GCHandleType.Pinned);
                    byte *     indexPter   = (byte *)Marshal.UnsafeAddrOfPinnedArrayElement(indices, 0);

                    buffer = new byte[indexStream.Length];
                    indexStream.Read(buffer, 0, (int)indexStream.Length);
                    for (int i = 0; i < indexStream.Length; i++)
                    {
                        indexPter[i] = buffer[i];
                    }
                    handler.Free();
                    d3dMesh.UnlockIndexBuffer();
                }

                mesh.CreateVertexBuffer(vertexes);
                if (d3dMesh.IndexBuffer.Description.Format == Format.Index16)
                {
                    mesh.CreateIndexBuffer((ushort[])indices);
                }
                else
                {
                    mesh.CreateIndexBuffer((uint[])indices);
                }

                var d3dComponents = d3dMesh.GetAttributeTable();
                if (d3dComponents == null)
                {
                    MeshLayer component = new MeshLayer();
                    layers.Add(component);
                    material.Add(MeshMaterial.CreateDefaultMaterial(file.Name + "_default"));

                    component.materialIndex  = 0;
                    component.primitiveCount = mesh.FaceCount;
                    component.startIndex     = 0;
                    component.startVertex    = 0;
                    component.vertexCount    = mesh.VertexCount;
                }
                else
                {
                    for (int i = 0; i < d3dComponents.Length; i++)
                    {
                        AttributeRange ar = d3dComponents[i];

                        MeshLayer component = new MeshLayer();
                        layers.Add(component);

                        component.materialIndex  = ar.AttribId;
                        component.primitiveCount = ar.FaceCount;
                        component.startIndex     = ar.FaceStart * 3;
                        component.startVertex    = ar.VertexStart;
                        component.vertexCount    = ar.VertexCount;
                    }
                }

                mesh.Materials = material.ToArray();
                mesh.SetLayers(layers.ToArray());

                if (normalOffset < 0)
                {
                    mesh.ComputeNormals();
                }
                if (texCoordOffset < 0)
                {
                    mesh.ComputeTextureCoords(CoordMappingType.Spherical);
                }

                mesh.ComputeTangents();

                meshVD.Dispose();
            }

            StaticMeshSceneNode meshNode = new StaticMeshSceneNode(file.Name, mesh);

            return(new SceneImportResult {
                VisualSceneRoot = meshNode, VisualMaterials = material
            });
        }
    /// <summary>
    /// This is the function that actually decides what mesh and texture each tile gets
    /// </summary>
    /// <param name="buffer">Buffer to put the chosen meshes into for combining</param>
    /// <param name="layer">layer currently being worked on</param>
    /// <param name="tile">The tile to get all the needed info from.</param>
    void FillMeshBuffer(out MeshCombineUtility.MeshInstance buffer, MeshLayer layer, MapDataStore.Tile tile, Vector3 pos)
    {
        buffer = new MeshCombineUtility.MeshInstance();
        MeshContent meshContent = null;

        if (layer == MeshLayer.Collision)
        {
            if (!ContentLoader.Instance.CollisionMeshConfiguration.GetValue(tile, layer, out meshContent))
            {
                buffer.meshData = null;
                return;
            }
            if (meshContent.MeshData.ContainsKey(MeshLayer.Collision))
            {
                buffer.meshData = meshContent.MeshData[MeshLayer.Collision];
            }
            else if (meshContent.MeshData.ContainsKey(MeshLayer.StaticMaterial))
            {
                buffer.meshData = meshContent.MeshData[MeshLayer.StaticMaterial];
            }
            else
            {
                buffer.meshData = null;
                return;
            }
            buffer.transform   = Matrix4x4.TRS(pos, meshContent.GetRotation(tile), Vector3.one);
            buffer.hiddenFaces = CalculateHiddenFaces(tile, meshContent.Rotation);
            return;
        }
        if (layer == MeshLayer.BuildingCollision)
        {
            if (tile.buildingType == default(BuildingStruct) || !ContentLoader.Instance.BuildingCollisionMeshConfiguration.GetValue(tile, layer, out meshContent))
            {
                buffer.meshData = null;
                return;
            }
            if (meshContent.MeshData.ContainsKey(MeshLayer.Collision))
            {
                buffer.meshData = meshContent.MeshData[MeshLayer.Collision];
            }
            else if (meshContent.MeshData.ContainsKey(MeshLayer.BuildingMaterial))
            {
                buffer.meshData = meshContent.MeshData[MeshLayer.BuildingMaterial];
            }
            else if (meshContent.MeshData.ContainsKey(MeshLayer.BuildingMaterialCutout))
            {
                buffer.meshData = meshContent.MeshData[MeshLayer.BuildingMaterialCutout];
            }
            else if (meshContent.MeshData.ContainsKey(MeshLayer.BuildingMaterialTransparent))
            {
                buffer.meshData = meshContent.MeshData[MeshLayer.BuildingMaterialTransparent];
            }
            else
            {
                buffer.meshData = null;
                return;
            }
            buffer.transform   = Matrix4x4.TRS(pos, meshContent.GetRotation(tile), Vector3.one);
            buffer.hiddenFaces = CalculateHiddenFaces(tile, meshContent.Rotation);
            return;
        }
        if (ContentLoader.Instance.DesignationMeshConfiguration.GetValue(tile, layer, out meshContent))
        {
            if (!meshContent.MeshData.ContainsKey(layer))
            {
                buffer.meshData = null;
                return;
            }
            buffer.meshData  = meshContent.MeshData[layer];
            buffer.transform = Matrix4x4.TRS(pos, meshContent.GetRotation(tile), Vector3.one);
            if (meshContent.MaterialTexture != null)
            {
                buffer.uv1Transform = meshContent.MaterialTexture.UVTransform;
            }
            else
            {
                buffer.uv1Transform = ContentLoader.Instance.DefaultMatTexTransform;
            }
            if (meshContent.ShapeTexture != null)
            {
                buffer.uv2Transform = meshContent.ShapeTexture.UVTransform;
            }
            else
            {
                buffer.uv2Transform = ContentLoader.Instance.DefaultShapeTexTransform;
            }
            if (meshContent.SpecialTexture != null)
            {
                buffer.uv3Transform = meshContent.SpecialTexture.UVTransform;
            }
            else
            {
                buffer.uv3Transform = ContentLoader.Instance.DefaultSpecialTexTransform;
            }
            buffer.hiddenFaces = CalculateHiddenFaces(tile, meshContent.Rotation);
            return;
        }
        switch (layer)
        {
        case MeshLayer.GrowthMaterial:
        case MeshLayer.GrowthMaterial1:
        case MeshLayer.GrowthMaterial2:
        case MeshLayer.GrowthMaterial3:
        case MeshLayer.GrowthCutout:
        case MeshLayer.GrowthCutout1:
        case MeshLayer.GrowthCutout2:
        case MeshLayer.GrowthCutout3:
        case MeshLayer.GrowthTransparent:
        case MeshLayer.GrowthTransparent1:
        case MeshLayer.GrowthTransparent2:
        case MeshLayer.GrowthTransparent3:
        {
            switch (tile.tiletypeMaterial)
            {
            case TiletypeMaterial.PLANT:
            case TiletypeMaterial.ROOT:
            case TiletypeMaterial.TREE_MATERIAL:
            case TiletypeMaterial.MUSHROOM:
                if (!ContentLoader.Instance.GrowthMeshConfiguration.GetValue(tile, layer, out meshContent))
                {
                    buffer.meshData = null;
                    return;
                }
                break;

            default:
                buffer.meshData = null;
                return;
            }
        }
        break;

        case MeshLayer.BuildingMaterial:
        case MeshLayer.NoMaterialBuilding:
        case MeshLayer.BuildingMaterialCutout:
        case MeshLayer.NoMaterialBuildingCutout:
        case MeshLayer.BuildingMaterialTransparent:
        case MeshLayer.NoMaterialBuildingTransparent:
        {
            if (tile.buildingType == default(BuildingStruct))
            {
                buffer.meshData = null;
                return;
            }
            if (!ContentLoader.Instance.BuildingMeshConfiguration.GetValue(tile, layer, out meshContent))
            {
                buffer.meshData = null;
                return;
            }
        }
        break;

        default:
        {
            if (!ContentLoader.Instance.TileMeshConfiguration.GetValue(tile, layer, out meshContent))
            {
                buffer.meshData = null;
                return;
            }
        }
        break;
        }

        if (!meshContent.MeshData.ContainsKey(layer))
        {
            buffer.meshData = null;
            return;
        }
        buffer.meshData  = meshContent.MeshData[layer];
        buffer.transform = Matrix4x4.TRS(pos, meshContent.GetRotation(tile), Vector3.one);
        Matrix4x4     shapeTextTransform = ContentLoader.Instance.DefaultShapeTexTransform;
        NormalContent tileTexContent;

        if (meshContent.ShapeTexture == null)
        {
            if (layer == MeshLayer.BuildingMaterial ||
                layer == MeshLayer.BuildingMaterialCutout ||
                layer == MeshLayer.NoMaterialBuilding ||
                layer == MeshLayer.NoMaterialBuildingCutout ||
                layer == MeshLayer.BuildingMaterialTransparent ||
                layer == MeshLayer.NoMaterialBuildingTransparent
                )
            {
                if (ContentLoader.Instance.BuildingShapeTextureConfiguration.GetValue(tile, layer, out tileTexContent))
                {
                    shapeTextTransform = tileTexContent.UVTransform;
                }
            }
            else
            {
                if (ContentLoader.Instance.ShapeTextureConfiguration.GetValue(tile, layer, out tileTexContent))
                {
                    shapeTextTransform = tileTexContent.UVTransform;
                }
            }
        }
        else
        {
            shapeTextTransform = meshContent.ShapeTexture.UVTransform;
        }

        Matrix4x4 matTexTransform = ContentLoader.Instance.DefaultMatTexTransform;

        if (meshContent.MaterialTexture != null &&
            (layer == MeshLayer.NoMaterial ||
             layer == MeshLayer.NoMaterialBuilding ||
             layer == MeshLayer.NoMaterialBuildingCutout ||
             layer == MeshLayer.NoMaterialBuildingTransparent ||
             layer == MeshLayer.NoMaterialCutout ||
             layer == MeshLayer.NoMaterialTransparent))
        {
            matTexTransform = meshContent.MaterialTexture.UVTransform;
        }
        else
        {
            TextureContent matTexContent;

            if (ContentLoader.Instance.MaterialTextureConfiguration.GetValue(tile, layer, out matTexContent))
            {
                matTexTransform = matTexContent.UVTransform;
            }
        }

        Matrix4x4 specialTexTransform = Matrix4x4.identity;

        if (meshContent.SpecialTexture != null)
        {
            specialTexTransform = meshContent.SpecialTexture.UVTransform;
        }
        else
        {
            specialTexTransform = ContentLoader.Instance.DefaultSpecialTexTransform;
        }

        ColorContent newColorContent;
        Color        newColor;

        if (ContentLoader.Instance.ColorConfiguration.GetValue(tile, layer, out newColorContent))
        {
            newColor = newColorContent.value;
        }
        else
        {
            MatPairStruct mat = new MatPairStruct(-1, -1);
            switch (layer)
            {
            case MeshLayer.StaticMaterial:
            case MeshLayer.StaticCutout:
            case MeshLayer.StaticTransparent:
                mat = tile.material;
                break;

            case MeshLayer.BaseMaterial:
            case MeshLayer.BaseCutout:
            case MeshLayer.BaseTransparent:
                mat = tile.base_material;
                break;

            case MeshLayer.LayerMaterial:
            case MeshLayer.LayerCutout:
            case MeshLayer.LayerTransparent:
                mat = tile.layer_material;
                break;

            case MeshLayer.VeinMaterial:
            case MeshLayer.VeinCutout:
            case MeshLayer.VeinTransparent:
                mat = tile.vein_material;
                break;

            case MeshLayer.NoMaterial:
            case MeshLayer.NoMaterialCutout:
            case MeshLayer.NoMaterialBuildingCutout:
            case MeshLayer.NoMaterialBuilding:
            case MeshLayer.NoMaterialBuildingTransparent:
            case MeshLayer.NoMaterialTransparent:
                break;

            case MeshLayer.BuildingMaterial:
            case MeshLayer.BuildingMaterialCutout:
            case MeshLayer.BuildingMaterialTransparent:
                mat = tile.buildingMaterial;
                break;

            default:
                break;
            }
            MaterialDefinition mattie;
            if (materials.TryGetValue(mat, out mattie))
            {
                ColorDefinition color = mattie.state_color;
                if (color == null)
                {
                    newColor = Color.cyan;
                }
                else
                {
                    newColor = new Color(color.red / 255.0f, color.green / 255.0f, color.blue / 255.0f, 1);
                }
            }
            else
            {
                newColor = Color.grey;
            }
        }
        buffer.color        = newColor;
        buffer.uv1Transform = matTexTransform;
        buffer.uv2Transform = shapeTextTransform;
        buffer.uv3Transform = specialTexTransform;
        buffer.hiddenFaces  = CalculateHiddenFaces(tile, meshContent.Rotation);
    }
Beispiel #16
0
    /// <summary>
    /// This is the function that actually decides what mesh and texture each tile gets
    /// </summary>
    /// <param name="buffer">Buffer to put the chosen meshes into for combining</param>
    /// <param name="layer">layer currently being worked on</param>
    /// <param name="tile">The tile to get all the needed info from.</param>
    void FillMeshBuffer(out MeshCombineUtility.MeshInstance buffer, MeshLayer layer, MapDataStore.Tile tile, Vector3 pos)
    {
        buffer = new MeshCombineUtility.MeshInstance();
        MeshContent meshContent = null;
        if(contentLoader.DesignationMeshConfiguration.GetValue(tile, layer, out meshContent))
        {
            if(!meshContent.MeshData.ContainsKey(layer))
            {
                buffer.meshData = null;
                return;
            }
            buffer.meshData = meshContent.MeshData[layer];
            buffer.transform = Matrix4x4.TRS(pos, meshContent.GetRotation(tile), Vector3.one);
            if (meshContent.MaterialTexture != null)
                buffer.uv1Transform = meshContent.MaterialTexture.UVTransform;
            else
                buffer.uv1Transform = contentLoader.DefaultMatTexTransform;
            if (meshContent.ShapeTexture != null)
                buffer.uv2Transform = meshContent.ShapeTexture.UVTransform;
            else
                buffer.uv2Transform = contentLoader.DefaultShapeTexTransform;
            if (meshContent.SpecialTexture != null)
                buffer.uv3Transform = meshContent.SpecialTexture.UVTransform;
            else
                buffer.uv3Transform = contentLoader.DefaultSpecialTexTransform;
            buffer.hiddenFaces = CalculateHiddenFaces(tile);
            return;
        }
        switch (layer)
        {
            case MeshLayer.GrowthMaterial:
            case MeshLayer.GrowthMaterial1:
            case MeshLayer.GrowthMaterial2:
            case MeshLayer.GrowthMaterial3:
            case MeshLayer.GrowthCutout:
            case MeshLayer.GrowthCutout1:
            case MeshLayer.GrowthCutout2:
            case MeshLayer.GrowthCutout3:
            case MeshLayer.GrowthTransparent:
            case MeshLayer.GrowthTransparent1:
            case MeshLayer.GrowthTransparent2:
            case MeshLayer.GrowthTransparent3:
                {
                    switch (tile.tiletypeMaterial)
                    {
                        case TiletypeMaterial.PLANT:
                        case TiletypeMaterial.ROOT:
                        case TiletypeMaterial.TREE_MATERIAL:
                        case TiletypeMaterial.MUSHROOM:
                            if (!contentLoader.GrowthMeshConfiguration.GetValue(tile, layer, out meshContent))
                            {
                                buffer.meshData = null;
                                return;
                            }
                            break;
                        default:
                            buffer.meshData = null;
                            return;
                    }
                }
                break;
            case MeshLayer.BuildingMaterial:
            case MeshLayer.NoMaterialBuilding:
            case MeshLayer.BuildingMaterialCutout:
            case MeshLayer.NoMaterialBuildingCutout:
            case MeshLayer.BuildingMaterialTransparent:
            case MeshLayer.NoMaterialBuildingTransparent:
                {
                    if (tile.buildingType == default(BuildingStruct))
                    {
                        buffer.meshData = null;
                        return;
                    }
                    if (!contentLoader.BuildingMeshConfiguration.GetValue(tile, layer, out meshContent))
                    {
                        buffer.meshData = null;
                        return;
                    }
                }
                break;
            default:
                {
                    if (!contentLoader.TileMeshConfiguration.GetValue(tile, layer, out meshContent))
                    {
                        buffer.meshData = null;
                        return;
                    }
                }
                break;
        }

        if (!meshContent.MeshData.ContainsKey(layer))
        {
            buffer.meshData = null;
            return;
        }
        buffer.meshData = meshContent.MeshData[layer];
        buffer.transform = Matrix4x4.TRS(pos, meshContent.GetRotation(tile), Vector3.one);
        Matrix4x4 shapeTextTransform = contentLoader.DefaultShapeTexTransform;
        NormalContent tileTexContent;
        if (meshContent.ShapeTexture == null)
        {
            if (layer == MeshLayer.BuildingMaterial
                || layer == MeshLayer.BuildingMaterialCutout
                || layer == MeshLayer.NoMaterialBuilding
                || layer == MeshLayer.NoMaterialBuildingCutout
                || layer == MeshLayer.BuildingMaterialTransparent
                || layer == MeshLayer.NoMaterialBuildingTransparent
                )
            {
                if (contentLoader.BuildingShapeTextureConfiguration.GetValue(tile, layer, out tileTexContent))
                    shapeTextTransform = tileTexContent.UVTransform;
            }
            else
            {
                if (contentLoader.ShapeTextureConfiguration.GetValue(tile, layer, out tileTexContent))
                    shapeTextTransform = tileTexContent.UVTransform;
            }
        }
        else
        {
            shapeTextTransform = meshContent.ShapeTexture.UVTransform;
        }

        Matrix4x4 matTexTransform = contentLoader.DefaultMatTexTransform;
        if (meshContent.MaterialTexture != null
            && (layer == MeshLayer.NoMaterial
            || layer == MeshLayer.NoMaterialBuilding
            || layer == MeshLayer.NoMaterialBuildingCutout
            || layer == MeshLayer.NoMaterialBuildingTransparent
            || layer == MeshLayer.NoMaterialCutout
            || layer == MeshLayer.NoMaterialTransparent))
        {
            matTexTransform = meshContent.MaterialTexture.UVTransform;
        }
        else
        {
            TextureContent matTexContent;

            if (contentLoader.MaterialTextureConfiguration.GetValue(tile, layer, out matTexContent))
                matTexTransform = matTexContent.UVTransform;
        }

        Matrix4x4 specialTexTransform = Matrix4x4.identity;

        if(meshContent.SpecialTexture != null)
        {
            specialTexTransform = meshContent.SpecialTexture.UVTransform;
        }
        else
        {
            specialTexTransform = contentLoader.DefaultSpecialTexTransform;
        }

        ColorContent newColorContent;
        Color newColor;
        if (contentLoader.ColorConfiguration.GetValue(tile, layer, out newColorContent))
        {
            newColor = newColorContent.value;
        }
        else
        {
            MatPairStruct mat = new MatPairStruct(-1, -1);
            switch (layer)
            {
                case MeshLayer.StaticMaterial:
                case MeshLayer.StaticCutout:
                case MeshLayer.StaticTransparent:
                    mat = tile.material;
                    break;
                case MeshLayer.BaseMaterial:
                case MeshLayer.BaseCutout:
                case MeshLayer.BaseTransparent:
                    mat = tile.base_material;
                    break;
                case MeshLayer.LayerMaterial:
                case MeshLayer.LayerCutout:
                case MeshLayer.LayerTransparent:
                    mat = tile.layer_material;
                    break;
                case MeshLayer.VeinMaterial:
                case MeshLayer.VeinCutout:
                case MeshLayer.VeinTransparent:
                    mat = tile.vein_material;
                    break;
                case MeshLayer.NoMaterial:
                case MeshLayer.NoMaterialCutout:
                case MeshLayer.NoMaterialBuildingCutout:
                case MeshLayer.NoMaterialBuilding:
                case MeshLayer.NoMaterialBuildingTransparent:
                case MeshLayer.NoMaterialTransparent:
                    break;
                case MeshLayer.BuildingMaterial:
                case MeshLayer.BuildingMaterialCutout:
                case MeshLayer.BuildingMaterialTransparent:
                    mat = tile.buildingMaterial;
                    break;
                default:
                    break;
            }
            MaterialDefinition mattie;
            if (materials.TryGetValue(mat, out mattie))
            {
                ColorDefinition color = mattie.state_color;
                if (color == null)
                    newColor = Color.cyan;
                else
                    newColor = new Color(color.red / 255.0f, color.green / 255.0f, color.blue / 255.0f, 1);
            }
            else
            {
                newColor = Color.grey;
            }
        }
        buffer.color = newColor;
        buffer.uv1Transform = matTexTransform;
        buffer.uv2Transform = shapeTextTransform;
        buffer.uv3Transform = specialTexTransform;
        buffer.hiddenFaces = CalculateHiddenFaces(tile);
    }
Beispiel #17
0
    //Dictionary<string, Texture2D> diffuseTextures = new Dictionary<string, Texture2D>();
    //Dictionary<string, Texture2D> specularTextures = new Dictionary<string, Texture2D>();
    //Dictionary<string, geometry> geometryLibrary = new Dictionary<string, geometry>();
    //List<node> nodeList = new List<node>();

    //this is very similar to the blockmesher function.
    void CollectModel(MapDataStore.Tile tile, MeshLayer layer, DFCoord pos)
    {
        if (layer == MeshLayer.Collision)
        {
            return;
        }

        #region Mesh Selection
        MeshContent meshContent = null;
        switch (layer)
        {
        case MeshLayer.GrowthMaterial:
        case MeshLayer.GrowthMaterial1:
        case MeshLayer.GrowthMaterial2:
        case MeshLayer.GrowthMaterial3:
        case MeshLayer.GrowthCutout:
        case MeshLayer.GrowthCutout1:
        case MeshLayer.GrowthCutout2:
        case MeshLayer.GrowthCutout3:
        case MeshLayer.GrowthTransparent:
        case MeshLayer.GrowthTransparent1:
        case MeshLayer.GrowthTransparent2:
        case MeshLayer.GrowthTransparent3:
        {
            switch (tile.tiletypeMaterial)
            {
            case TiletypeMaterial.PLANT:
            case TiletypeMaterial.ROOT:
            case TiletypeMaterial.TREE_MATERIAL:
            case TiletypeMaterial.MUSHROOM:
                if (!ContentLoader.Instance.GrowthMeshConfiguration.GetValue(tile, layer, out meshContent))
                {
                    return;
                }
                break;

            default:
                return;
            }
        }
        break;

        //case MeshLayer.BuildingMaterial:
        //case MeshLayer.NoMaterialBuilding:
        //case MeshLayer.BuildingMaterialCutout:
        //case MeshLayer.NoMaterialBuildingCutout:
        //case MeshLayer.BuildingMaterialTransparent:
        //case MeshLayer.NoMaterialBuildingTransparent:
        //    {
        //        if (tile.buildingType == default(BuildingStruct))
        //            return;
        //        if (!ContentLoader.Instance.BuildingMeshConfiguration.GetValue(tile, layer, out meshContent))
        //            return;
        //    }
        //    break;
        default:
        {
            if (!ContentLoader.Instance.TileMeshConfiguration.GetValue(tile, layer, out meshContent))
            {
                return;
            }
        }
        break;
        }

        if (!meshContent.MeshData.ContainsKey(layer))
        {
            return;
        }
        #endregion

        node tileNode = new node();

        tileNode.id = string.Format("Tile[{0},{1},{2}]_{3}", pos.x, pos.y, pos.z, layer);

        tileNode.Items = new object[]
        {
            COLLADA.ConvertMatrix(Matrix4x4.TRS(
                                      GameMap.DFtoUnityCoord(pos),
                                      meshContent.GetRotation(tile),
                                      Vector3.one))
        };
        tileNode.ItemsElementName = new ItemsChoiceType2[] { ItemsChoiceType2.matrix };

        //string geometryName = "Mesh-" + meshContent.UniqueIndex;

        //if (!geometryLibrary.ContainsKey(geometryName))
        //{
        //    geometryLibrary[geometryName] = COLLADA.MeshToGeometry(meshContent.MeshData[layer], geometryName);
        //}

        //instance_geometry geometryInstance = new instance_geometry();
        //geometryInstance.url = "#" + geometryLibrary[geometryName].id;
        //tileNode.instance_geometry = new instance_geometry[] { geometryInstance };

        //nodeList.Add(tileNode);
        //return;
        //-----------------------------------------------------------
        //Put normal map stuff here! Remember!
        //-----------------------------------------------------------


        //string patternName = "Tex-";

        //Texture2D tiletexture = null;
        //TextureContent textureContent;
        //if (ContentLoader.Instance.MaterialTextureConfiguration.GetValue(tile, layer, out textureContent))
        //{
        //    tiletexture = textureContent.Texture;
        //    patternName += textureContent.UniqueIndex;
        //}
        //else patternName += "#";

        //patternName += "-#";

        //Color color = Color.grey;
        //ColorContent colorContent;
        //if (ContentLoader.Instance.ColorConfiguration.GetValue(tile, layer, out colorContent))
        //{
        //    color = colorContent.color;
        //}

        //patternName += string.Format("{0:X2}{1:X2}{2:X2}", ((Color32)color).r, ((Color32)color).g, ((Color32)color).b);

        //if (diffuseTextures.ContainsKey(patternName))
        //    return;

        //Color neutralSpec = new Color(0.04f, 0.04f, 0.04f);
        //Texture2D outputDiffuse;
        //Texture2D outputSpec;
        //if (tiletexture != null)
        //{
        //    outputDiffuse = new Texture2D(tiletexture.width, tiletexture.height);
        //    outputSpec = new Texture2D(tiletexture.width, tiletexture.height);
        //    Color[] colors = tiletexture.GetPixels();
        //    Color[] specs = new Color[colors.Length];
        //    for (int i = 0; i < colors.Length; i++)
        //    {
        //        var diffuseColor = OverlayBlend(colors[i], color);
        //        diffuseColor.a = 1;
        //        colors[i] = Color.Lerp(Color.black, diffuseColor, color.a);
        //        specs[i] = Color.Lerp(diffuseColor, neutralSpec, color.a);
        //    }
        //    outputDiffuse.SetPixels(colors);
        //    outputSpec.SetPixels(specs);
        //}
        //else
        //{
        //    outputDiffuse = ContentLoader.CreateFlatTexture(color);
        //    outputSpec = ContentLoader.CreateFlatTexture(neutralSpec);
        //}
        //outputDiffuse.name = patternName + "_Diffuse";
        //outputSpec.name = patternName + "_Specular";

        //diffuseTextures[patternName] = outputDiffuse;
        //specularTextures[patternName] = outputSpec;
    }
Beispiel #18
0
 abstract public bool GetValue(MapDataStore.Tile tile, MeshLayer layer, out T value);
Beispiel #19
0
 /// <summary>
 /// This is the function that actually decides what mesh and texture each tile gets
 /// </summary>
 /// <param name="buffer">Buffer to put the chosen meshes into for combining</param>
 /// <param name="layer">layer currently being worked on</param>
 /// <param name="tile">The tile to get all the needed info from.</param>
 void FillMeshBuffer(out MeshCombineUtility.MeshInstance buffer, MeshLayer layer, MapDataStore.Tile tile)
 {
     buffer = new MeshCombineUtility.MeshInstance();
     MeshContent mesh = null;
     if (tile.hidden)
     {
         buffer.meshData = null;
         return;
     }
     if (layer == MeshLayer.BuildingMaterial
         || layer == MeshLayer.BuildingMaterialCutout
         || layer == MeshLayer.NoMaterialBuilding
         || layer == MeshLayer.NoMaterialBuildingCutout
         || layer == MeshLayer.BuildingMaterialTransparent
         || layer == MeshLayer.NoMaterialBuildingTransparent
         )
     {
         if(tile.buildingType == default(BuildingStruct))
         {
             buffer.meshData = null;
             return;
         }
         if (!contentLoader.BuildingMeshConfiguration.GetValue(tile, layer, out mesh))
         {
             buffer.meshData = null;
             return;
         }
     }
     else
     {
         if (!contentLoader.TileMeshConfiguration.GetValue(tile, layer, out mesh))
         {
             buffer.meshData = null;
             return;
         }
     }
     buffer.meshData = mesh.MeshData[(int)layer];
     buffer.transform = Matrix4x4.TRS(GameMap.DFtoUnityCoord(tile.position), mesh.GetRotation(tile), Vector3.one);
     Matrix4x4 shapeTextTransform = Matrix4x4.identity;
     NormalContent tileTexContent;
     if (mesh.NormalTexture == null)
     {
         if (layer == MeshLayer.BuildingMaterial
             || layer == MeshLayer.BuildingMaterialCutout
             || layer == MeshLayer.NoMaterialBuilding
             || layer == MeshLayer.NoMaterialBuildingCutout
             || layer == MeshLayer.BuildingMaterialTransparent
             || layer == MeshLayer.NoMaterialBuildingTransparent
             )
         {
             if (contentLoader.BuildingShapeTextureConfiguration.GetValue(tile, layer, out tileTexContent))
                 shapeTextTransform = tileTexContent.UVTransform;
         }
         else
         {
             if (contentLoader.ShapeTextureConfiguration.GetValue(tile, layer, out tileTexContent))
                 shapeTextTransform = tileTexContent.UVTransform;
         }
     }
     else
     {
         shapeTextTransform = mesh.NormalTexture.UVTransform;
     }
     Matrix4x4 matTexTransform = Matrix4x4.identity;
     TextureContent matTexContent;
     if (contentLoader.MaterialTextureConfiguration.GetValue(tile, layer, out matTexContent))
         matTexTransform = matTexContent.UVTransform;
     ColorContent newColorContent;
     Color newColor;
     if (contentLoader.ColorConfiguration.GetValue(tile, layer, out newColorContent))
     {
         newColor = newColorContent.value;
     }
     else
     {
         MatPairStruct mat = new MatPairStruct(-1, -1);
         switch (layer)
         {
             case MeshLayer.StaticMaterial:
             case MeshLayer.StaticCutout:
             case MeshLayer.StaticTransparent:
                 mat = tile.material;
                 break;
             case MeshLayer.BaseMaterial:
             case MeshLayer.BaseCutout:
             case MeshLayer.BaseTransparent:
                 mat = tile.base_material;
                 break;
             case MeshLayer.LayerMaterial:
             case MeshLayer.LayerCutout:
             case MeshLayer.LayerTransparent:
                 mat = tile.layer_material;
                 break;
             case MeshLayer.VeinMaterial:
             case MeshLayer.VeinCutout:
             case MeshLayer.VeinTransparent:
                 mat = tile.vein_material;
                 break;
             case MeshLayer.NoMaterial:
             case MeshLayer.NoMaterialCutout:
             case MeshLayer.NoMaterialBuildingCutout:
             case MeshLayer.NoMaterialBuilding:
             case MeshLayer.NoMaterialBuildingTransparent:
             case MeshLayer.NoMaterialTransparent:
                 break;
             case MeshLayer.Growth0Cutout:
                 break;
             case MeshLayer.Growth1Cutout:
                 break;
             case MeshLayer.Growth2Cutout:
                 break;
             case MeshLayer.Growth3Cutout:
                 break;
             case MeshLayer.BuildingMaterial:
             case MeshLayer.BuildingMaterialCutout:
             case MeshLayer.BuildingMaterialTransparent:
                 mat = tile.buildingMaterial;
                 break;
             default:
                 break;
         }
         MaterialDefinition mattie;
         if (materials.TryGetValue(mat, out mattie))
         {
             ColorDefinition color = mattie.state_color;
             if (color == null)
                 newColor = Color.cyan;
             else
                 newColor = new Color(color.red / 255.0f, color.green / 255.0f, color.blue / 255.0f, 1);
         }
         else
         {
             newColor = Color.grey;
         }
     }
     buffer.color = newColor;
     buffer.uv1Transform = matTexTransform;
     buffer.uv2Transform = shapeTextTransform;
     buffer.hiddenFaces = MeshCombineUtility.HiddenFaces.None;
     if (tile.North != null && tile.North.isWall)
         buffer.hiddenFaces |= MeshCombineUtility.HiddenFaces.North;
     if (tile.South != null && tile.South.isWall)
         buffer.hiddenFaces |= MeshCombineUtility.HiddenFaces.South;
     if (tile.East != null && tile.East.isWall)
         buffer.hiddenFaces |= MeshCombineUtility.HiddenFaces.East;
     if (tile.West != null && tile.West.isWall)
         buffer.hiddenFaces |= MeshCombineUtility.HiddenFaces.West;
     if (tile.Up != null && tile.Up.isSolidBase)
         buffer.hiddenFaces |= MeshCombineUtility.HiddenFaces.Up;
     if (tile.Down != null && tile.Down.isWall)
         buffer.hiddenFaces |= MeshCombineUtility.HiddenFaces.Down;
 }
    void FillMeshBuffer(out MeshCombineUtility.MeshInstance buffer, MeshLayer layer, MapDataStore.Tile tile)
    {
        buffer = new MeshCombineUtility.MeshInstance();
        MeshContent content = null;

        if (!contentLoader.TileMeshConfiguration.GetValue(tile, layer, out content))
        {
            buffer.meshData = null;
            return;
        }
        buffer.meshData  = content.meshData[(int)layer];
        buffer.transform = Matrix4x4.TRS(GameMap.DFtoUnityCoord(tile.position), Quaternion.identity, Vector3.one);
        Matrix4x4     shapeTextTransform = Matrix4x4.identity;
        NormalContent tileTexContent;

        if (contentLoader.ShapeTextureConfiguration.GetValue(tile, layer, out tileTexContent))
        {
            shapeTextTransform = tileTexContent.UVTransform;
        }
        Matrix4x4      matTexTransform = Matrix4x4.identity;
        TextureContent matTexContent;

        if (contentLoader.MaterialTextureConfiguration.GetValue(tile, layer, out matTexContent))
        {
            matTexTransform = matTexContent.UVTransform;
        }
        ColorContent newColorContent;
        Color        newColor;

        if (contentLoader.ColorConfiguration.GetValue(tile, layer, out newColorContent))
        {
            newColor = newColorContent.value;
        }
        else
        {
            MatPairStruct mat;
            mat.mat_type  = -1;
            mat.mat_index = -1;
            switch (layer)
            {
            case MeshLayer.StaticMaterial:
            case MeshLayer.StaticCutout:
                mat = tile.material;
                break;

            case MeshLayer.BaseMaterial:
            case MeshLayer.BaseCutout:
                mat = tile.base_material;
                break;

            case MeshLayer.LayerMaterial:
            case MeshLayer.LayerCutout:
                mat = tile.layer_material;
                break;

            case MeshLayer.VeinMaterial:
            case MeshLayer.VeinCutout:
                mat = tile.vein_material;
                break;

            case MeshLayer.NoMaterial:
            case MeshLayer.NoMaterialCutout:
                break;

            case MeshLayer.Growth0Cutout:
                break;

            case MeshLayer.Growth1Cutout:
                break;

            case MeshLayer.Growth2Cutout:
                break;

            case MeshLayer.Growth3Cutout:
                break;

            default:
                break;
            }
            MaterialDefinition mattie;
            if (materials.TryGetValue(mat, out mattie))
            {
                ColorDefinition color = mattie.state_color;
                if (color == null)
                {
                    newColor = Color.cyan;
                }
                else
                {
                    newColor = new Color(color.red / 255.0f, color.green / 255.0f, color.blue / 255.0f, 1);
                }
            }
            else
            {
                newColor = Color.grey;
            }
        }
        buffer.color        = newColor;
        buffer.uv1Transform = matTexTransform;
        buffer.uv2Transform = shapeTextTransform;
        buffer.hiddenFaces  = MeshCombineUtility.HiddenFaces.None;
        if (tile.North != null && tile.North.Value.isWall)
        {
            buffer.hiddenFaces |= MeshCombineUtility.HiddenFaces.North;
        }
        if (tile.South != null && tile.South.Value.isWall)
        {
            buffer.hiddenFaces |= MeshCombineUtility.HiddenFaces.South;
        }
        if (tile.East != null && tile.East.Value.isWall)
        {
            buffer.hiddenFaces |= MeshCombineUtility.HiddenFaces.East;
        }
        if (tile.West != null && tile.West.Value.isWall)
        {
            buffer.hiddenFaces |= MeshCombineUtility.HiddenFaces.West;
        }
        if (tile.Up != null && tile.Up.Value.isSolidBase)
        {
            buffer.hiddenFaces |= MeshCombineUtility.HiddenFaces.Up;
        }
        if (tile.Down != null && tile.Down.Value.isWall)
        {
            buffer.hiddenFaces |= MeshCombineUtility.HiddenFaces.Down;
        }
    }
    public override bool GetValue(MapDataStore.Tile tile, MeshLayer layer, out T value)
    {
        MatPairStruct mat        = tile.material;
        int           plantIndex = mat.mat_index;

        switch (layer)
        {
        case MeshLayer.StaticMaterial:
        case MeshLayer.StaticCutout:
        case MeshLayer.StaticTransparent:
            return(GetMaterialRef(tile.material, tile, layer, out value));

        case MeshLayer.BaseMaterial:
        case MeshLayer.BaseCutout:
        case MeshLayer.BaseTransparent:
            return(GetMaterialRef(tile.base_material, tile, layer, out value));

        case MeshLayer.LayerMaterial:
        case MeshLayer.LayerCutout:
        case MeshLayer.LayerTransparent:
            return(GetMaterialRef(tile.layer_material, tile, layer, out value));

        case MeshLayer.VeinMaterial:
        case MeshLayer.VeinCutout:
        case MeshLayer.VeinTransparent:
            return(GetMaterialRef(tile.vein_material, tile, layer, out value));

        case MeshLayer.NoMaterial:
        case MeshLayer.NoMaterialCutout:
        case MeshLayer.NoMaterialBuildingCutout:
        case MeshLayer.NoMaterialBuilding:
        case MeshLayer.NoMaterialBuildingTransparent:
        case MeshLayer.NoMaterialTransparent:
            if (defaultMaterial == null)
            {
                break;
            }
            value = defaultMaterial.GetValue(tile, layer);
            return(true);

        case MeshLayer.BuildingMaterial:
        case MeshLayer.BuildingMaterialCutout:
        case MeshLayer.BuildingMaterialTransparent:
            return(GetMaterialRef(tile.buildingMaterial, tile, layer, out value));

        case MeshLayer.GrowthMaterial:
        case MeshLayer.GrowthCutout:
        case MeshLayer.GrowthTransparent:
            if ((mat.mat_type != PlantType) ||
                DFConnection.Instance.NetPlantRawList == null ||
                DFConnection.Instance.NetPlantRawList.plant_raws.Count <= plantIndex ||
                DFConnection.Instance.NetPlantRawList.plant_raws[plantIndex].growths.Count <= 0 ||
                DFConnection.Instance.NetPlantRawList.plant_raws[plantIndex].growths[0].mat == null)
            {
                value = default(T);
                return(false);
            }
            return(GetMaterialRef(DFConnection.Instance.NetPlantRawList.plant_raws[plantIndex].growths[0].mat, tile, layer, out value));

        case MeshLayer.GrowthMaterial1:
        case MeshLayer.GrowthCutout1:
        case MeshLayer.GrowthTransparent1:
            if ((mat.mat_type != PlantType) ||
                DFConnection.Instance.NetPlantRawList == null ||
                DFConnection.Instance.NetPlantRawList.plant_raws.Count <= plantIndex ||
                DFConnection.Instance.NetPlantRawList.plant_raws[plantIndex].growths.Count <= 1 ||
                DFConnection.Instance.NetPlantRawList.plant_raws[plantIndex].growths[0].mat == null)
            {
                value = default(T);
                return(false);
            }
            return(GetMaterialRef(DFConnection.Instance.NetPlantRawList.plant_raws[plantIndex].growths[1].mat, tile, layer, out value));

        case MeshLayer.GrowthMaterial2:
        case MeshLayer.GrowthCutout2:
        case MeshLayer.GrowthTransparent2:
            if ((mat.mat_type != PlantType) ||
                DFConnection.Instance.NetPlantRawList == null ||
                DFConnection.Instance.NetPlantRawList.plant_raws.Count <= plantIndex ||
                DFConnection.Instance.NetPlantRawList.plant_raws[plantIndex].growths.Count <= 2 ||
                DFConnection.Instance.NetPlantRawList.plant_raws[plantIndex].growths[0].mat == null)
            {
                value = default(T);
                return(false);
            }
            return(GetMaterialRef(DFConnection.Instance.NetPlantRawList.plant_raws[plantIndex].growths[2].mat, tile, layer, out value));

        case MeshLayer.GrowthMaterial3:
        case MeshLayer.GrowthCutout3:
        case MeshLayer.GrowthTransparent3:
            if ((mat.mat_type != PlantType) ||
                DFConnection.Instance.NetPlantRawList == null ||
                DFConnection.Instance.NetPlantRawList.plant_raws.Count <= plantIndex ||
                DFConnection.Instance.NetPlantRawList.plant_raws[plantIndex].growths.Count <= 3 ||
                DFConnection.Instance.NetPlantRawList.plant_raws[plantIndex].growths[0].mat == null)
            {
                value = default(T);
                return(false);
            }
            return(GetMaterialRef(DFConnection.Instance.NetPlantRawList.plant_raws[plantIndex].growths[3].mat, tile, layer, out value));

        default:
            break;
        }
        value = default(T);
        return(false);
    }
Beispiel #22
0
 public override bool GetValue(MapDataStore.Tile tile, MeshLayer layer, out T value)
 {
     value = content.GetValue(tile, layer);
     return(true);
 }
Beispiel #23
0
    public override bool GetValue(MapDataStore.Tile tile, MeshLayer layer, out T value)
    {
        switch (tile.digDesignation)
        {
        case RemoteFortressReader.TileDigDesignation.NO_DIG:
            break;

        case RemoteFortressReader.TileDigDesignation.DEFAULT_DIG:
            if (designationBlocks.ContainsKey(DesignationTypes.Default))
            {
                value = designationBlocks[DesignationTypes.Default].GetValue(tile, layer);
                return(true);
            }
            break;

        case RemoteFortressReader.TileDigDesignation.UP_DOWN_STAIR_DIG:
            if (designationBlocks.ContainsKey(DesignationTypes.UpDownStairs))
            {
                value = designationBlocks[DesignationTypes.UpDownStairs].GetValue(tile, layer);
                return(true);
            }
            break;

        case RemoteFortressReader.TileDigDesignation.CHANNEL_DIG:
            if (designationBlocks.ContainsKey(DesignationTypes.Channel))
            {
                value = designationBlocks[DesignationTypes.Channel].GetValue(tile, layer);
                return(true);
            }
            break;

        case RemoteFortressReader.TileDigDesignation.RAMP_DIG:
            if (designationBlocks.ContainsKey(DesignationTypes.Ramp))
            {
                value = designationBlocks[DesignationTypes.Ramp].GetValue(tile, layer);
                return(true);
            }
            break;

        case RemoteFortressReader.TileDigDesignation.DOWN_STAIR_DIG:
            if (designationBlocks.ContainsKey(DesignationTypes.DownStairs))
            {
                value = designationBlocks[DesignationTypes.DownStairs].GetValue(tile, layer);
                return(true);
            }
            break;

        case RemoteFortressReader.TileDigDesignation.UP_STAIR_DIG:
            if (designationBlocks.ContainsKey(DesignationTypes.UpStairs))
            {
                value = designationBlocks[DesignationTypes.UpStairs].GetValue(tile, layer);
                return(true);
            }
            break;

        default:
            break;
        }
        if (tile.Hidden)
        {
            if (designationBlocks.ContainsKey(DesignationTypes.Hidden))
            {
                value = designationBlocks[DesignationTypes.Hidden].GetValue(tile, layer);
                return(true);
            }
        }
        value = default(T);
        return(false);
    }
Beispiel #24
0
        public EngineContent ToSceneNode()
        {
            string                       name   = Path.GetFileNameWithoutExtension(this.name);
            VertexDescriptor             vd     = EngineResources.CreateVertexDescriptor <ModelVertex>();
            List <Tuple <string, Mesh> > meshes = new List <Tuple <string, Mesh> >(groups.Count);
            List <SceneNode>             nodes  = new List <SceneNode>(groups.Count);

            MeshMaterial[] sceneMaterials = new MeshMaterial[materials.Count];
            Dictionary <string, MeshMaterial> materialLookup = new Dictionary <string, MeshMaterial>();

            for (int i = 0; i < materials.Values.Count; i++)
            {
                var sourceMat = materials.Values[i];
                sceneMaterials[i] = new MeshMaterial
                {
                    Name       = name + "_" + sourceMat.Name,
                    Surface    = sourceMat.ToSurfaceInfo(),
                    NormalMap  = sourceMat.NormalMap,
                    DiffuseMap = sourceMat.Textures != null && sourceMat.Textures.Length > 0 ?
                                 sourceMat.Textures[0] : null
                };
                materialLookup.Add(sceneMaterials[i].Name, sceneMaterials[i]);
            }


            List <MeshLayer> layers = new List <MeshLayer>();

            //register for each positionIndex in the source container the List of the destination vertices that contain that position
            Dictionary <int, List <VertexInfo> > lookup = new Dictionary <int, List <VertexInfo> >();
            VertexInfo  vi;
            ModelVertex v;

            List <ModelVertex> vertexes = new List <ModelVertex>();

            uint[] indexes;

            #region Groups

            foreach (var g in groups)
            {
                List <MeshMaterial> meshMaterials = new List <MeshMaterial>();
                Mesh mesh = new Mesh(vd: vd);
                mesh.Name = g.Name;
                indexes   = new uint[g.FaceCount * 3];
                int k = 0;

                #region Layers

                layers.Clear();
                foreach (var layer in g.Layers)
                {
                    int startVertex = int.MaxValue;
                    int vertexCount = 0;

                    MeshLayer meshLayer = new MeshLayer();
                    meshLayer.startIndex     = k;
                    meshLayer.primitiveCount = layer.Faces.Count;

                    var mat = materialLookup[name + "_" + layer.MaterialName];
                    meshLayer.materialIndex = meshMaterials.IndexOf(mat);
                    if (meshLayer.materialIndex < 0)
                    {
                        meshLayer.materialIndex = meshMaterials.Count;
                        meshMaterials.Add(mat);
                    }

                    #region Faces

                    foreach (var face in layer.Faces)
                    {
                        //for each vertex of the face create a new mesh vertex if the vertex if not yet in the mesh add it to the VertexBuffer
                        //and create a new face in the IndexBuffer
                        for (int i = 0; i < 3; i++)
                        {
                            //vi describe a new vertex
                            vi = new VertexInfo()
                            {
                                PositionIndex = face.Vertexes[i].Position, NormalIndex = -1, TcIndex = -1
                            };

                            //if the vertex position is not in the VertexBuffer add it
                            if (!lookup.ContainsKey(vi.PositionIndex))
                            {
                                v = new ModelVertex(position: positions[vi.PositionIndex]);

                                if ((vertexFormat & VertexFormat.Normal) == VertexFormat.Normal && face.Vertexes[i].Normal >= 0)
                                {
                                    vi.NormalIndex = face.Vertexes[i].Normal;
                                    v.Normal       = normals[vi.NormalIndex];
                                }
                                if ((vertexFormat & VertexFormat.TexCoord) == VertexFormat.TexCoord && face.Vertexes[i].TexCoord >= 0)
                                {
                                    vi.TcIndex = face.Vertexes[i].TexCoord;
                                    v.TexCoord = texCoords[vi.TcIndex];
                                }

                                vi.VertexIndex = vertexes.Count;
                                lookup.Add(vi.PositionIndex, new List <VertexInfo>()
                                {
                                    vi
                                });

                                vertexes.Add(v);
                                vertexCount++;
                                indexes[k] = (uint)vi.VertexIndex;
                            }
                            else
                            {
                                //else get the list of vertices that contains that position and
                                // if new vertex is not in the list create the new destination vertex and add it to the VertexBuffer

                                var vlist = lookup[vi.PositionIndex];

                                if ((vertexFormat & VertexFormat.Normal) == VertexFormat.Normal)
                                {
                                    vi.NormalIndex = face.Vertexes[i].Normal;
                                }
                                if ((vertexFormat & VertexFormat.TexCoord) == VertexFormat.TexCoord)
                                {
                                    vi.TcIndex = face.Vertexes[i].TexCoord;
                                }

                                int index = vlist.FindIndex(x => x.Equals(vi));

                                if (index < 0)
                                {
                                    v = new ModelVertex(positions[vi.PositionIndex]);
                                    if (vi.NormalIndex >= 0)
                                    {
                                        v.Normal = normals[vi.NormalIndex];
                                    }
                                    if (vi.TcIndex >= 0)
                                    {
                                        v.TexCoord = texCoords[vi.TcIndex];
                                    }

                                    vi.VertexIndex = vertexes.Count;
                                    indexes[k]     = (uint)vi.VertexIndex;
                                    vertexCount++;
                                    vertexes.Add(v);
                                    vlist.Add(vi);
                                }
                                else
                                {
                                    //else the vertex is already in the VertexBuffer so create add the vertex index
                                    //to the indexbuffer

                                    vi         = vlist[index];
                                    indexes[k] = (uint)vi.VertexIndex;
                                }
                            }
                            k++;
                            startVertex = Math.Min(startVertex, vi.VertexIndex);
                        }
                    }

                    #endregion Faces

                    meshLayer.startVertex = startVertex;
                    meshLayer.vertexCount = vertexCount;
                    layers.Add(meshLayer);
                }

                #endregion Layers

                mesh.SetLayers(layers.ToArray());
                var data = vertexes.ToArray();
                mesh.CreateVertexBuffer(data);
                if (mesh.VertexCount < ushort.MaxValue)
                {
                    mesh.CreateIndexBuffer(indexes.Select(x => (ushort)x).ToArray());
                }
                else
                {
                    mesh.CreateIndexBuffer(indexes);
                }

                mesh.DefragmentLayers();
                mesh.BlendLayers();

                if ((vertexFormat & VertexFormat.Normal) != VertexFormat.Normal)
                {
                    mesh.ComputeNormals();
                }
                if ((vertexFormat & VertexFormat.TexCoord) != VertexFormat.TexCoord)
                {
                    mesh.ComputeTextureCoords(CoordMappingType.Spherical);
                }

                mesh.ComputeTangents();
                nodes.Add(new SceneNode <MeshInstance>(g.Name, new MeshInstance(meshMaterials.ToArray(), mesh)));

                vertexes.Clear();

                //test
                lookup.Clear();
            }

            #endregion

            QuadTreeSceneNode node = new QuadTreeSceneNode(name, 10);
            node.Context = new TechniqueRenderContext(node);

            foreach (var item in nodes)
            {
                node.Add(item);
            }

            node.UpdateLayout();

            var package = new EngineContent(name);
            package.Providers.AddRange(sceneMaterials);
            package.Providers.Add(node);
            return(package);
        }
Beispiel #25
0
    public override bool GetValue(MapDataStore.Tile tile, MeshLayer layer, out T value)
    {
        Content cont;

        switch (layer)
        {
        case MeshLayer.StaticMaterial:
        case MeshLayer.StaticCutout:
            if (materialMatcher.Get(tile.material, out cont))
            {
                value = cont.GetValue(tile, layer);
                return(true);
            }
            break;

        case MeshLayer.BaseMaterial:
        case MeshLayer.BaseCutout:
            if (materialMatcher.Get(tile.base_material, out cont))
            {
                value = cont.GetValue(tile, layer);
                return(true);
            }
            break;

        case MeshLayer.LayerMaterial:
        case MeshLayer.LayerCutout:
            if (materialMatcher.Get(tile.layer_material, out cont))
            {
                value = cont.GetValue(tile, layer);
                return(true);
            }
            break;

        case MeshLayer.VeinMaterial:
        case MeshLayer.VeinCutout:
            if (materialMatcher.Get(tile.vein_material, out cont))
            {
                value = cont.GetValue(tile, layer);
                return(true);
            }
            break;

        case MeshLayer.NoMaterial:
        case MeshLayer.NoMaterialCutout:
            if (defaultMaterial == null)
            {
                break;
            }
            value = defaultMaterial.GetValue(tile, layer);
            return(true);

        case MeshLayer.Growth0Cutout:
            break;

        case MeshLayer.Growth1Cutout:
            break;

        case MeshLayer.Growth2Cutout:
            break;

        case MeshLayer.Growth3Cutout:
            break;

        default:
            break;
        }
        value = default(T);
        return(false);
    }
Beispiel #26
0
    void FillMeshBuffer(out MeshCombineUtility.MeshInstance buffer, MeshLayer layer, MapTile tile)
    {
        buffer = new MeshCombineUtility.MeshInstance();
        MeshContent content = null;

        if (!contentLoader.tileMeshConfiguration.GetValue(tile, layer, out content))
        {
            buffer.mesh = null;
            return;
        }
        buffer.mesh      = content.mesh[(int)layer];
        buffer.transform = Matrix4x4.TRS(DFtoUnityCoord(tile.position), Quaternion.identity, Vector3.one);
        if (tile != null)
        {
            int          tileTexIndex = 0;
            IndexContent tileTexContent;
            if (contentLoader.tileTextureConfiguration.GetValue(tile, layer, out tileTexContent))
            {
                tileTexIndex = tileTexContent.value;
            }
            int          matTexIndex = 0;
            IndexContent matTexContent;
            if (contentLoader.materialTextureConfiguration.GetValue(tile, layer, out matTexContent))
            {
                matTexIndex = matTexContent.value;
            }
            ColorContent newColorContent;
            Color        newColor;
            if (contentLoader.colorConfiguration.GetValue(tile, layer, out newColorContent))
            {
                newColor = newColorContent.value;
            }
            else
            {
                MatPairStruct mat;
                mat.mat_type  = -1;
                mat.mat_index = -1;
                switch (layer)
                {
                case MeshLayer.StaticMaterial:
                case MeshLayer.StaticCutout:
                    mat = tile.material;
                    break;

                case MeshLayer.BaseMaterial:
                case MeshLayer.BaseCutout:
                    mat = tile.base_material;
                    break;

                case MeshLayer.LayerMaterial:
                case MeshLayer.LayerCutout:
                    mat = tile.layer_material;
                    break;

                case MeshLayer.VeinMaterial:
                case MeshLayer.VeinCutout:
                    mat = tile.vein_material;
                    break;

                case MeshLayer.NoMaterial:
                case MeshLayer.NoMaterialCutout:
                    break;

                case MeshLayer.Growth0Cutout:
                    break;

                case MeshLayer.Growth1Cutout:
                    break;

                case MeshLayer.Growth2Cutout:
                    break;

                case MeshLayer.Growth3Cutout:
                    break;

                default:
                    break;
                }
                MaterialDefinition mattie;
                if (materials.TryGetValue(mat, out mattie))
                {
                    ColorDefinition color = mattie.state_color;
                    if (color == null)
                    {
                        newColor = Color.cyan;
                    }
                    else
                    {
                        newColor = new Color(color.red / 255.0f, color.green / 255.0f, color.blue / 255.0f, 1);
                    }
                }
                else
                {
                    newColor = Color.white;
                }
            }
            buffer.color    = newColor;
            buffer.uv1Index = matTexIndex;
            buffer.uv2Index = tileTexIndex;
        }
    }
Beispiel #27
0
    /// <summary>
    /// This is the function that actually decides what mesh and texture each tile gets
    /// </summary>
    /// <param name="buffer">Buffer to put the chosen meshes into for combining</param>
    /// <param name="layer">layer currently being worked on</param>
    /// <param name="tile">The tile to get all the needed info from.</param>
    void FillMeshBuffer(out MeshCombineUtility.MeshInstance buffer, MeshLayer layer, MapDataStore.Tile tile, Vector3 pos)
    {
        buffer = new MeshCombineUtility.MeshInstance();
        Vector2     index1      = Vector2.zero;
        Vector2     index2      = Vector2.zero;
        MeshContent meshContent = null;

        buffer.color = Color.grey;
        if (layer == MeshLayer.Collision)
        {
            if (!ContentLoader.Instance.CollisionMeshConfiguration.GetValue(tile, layer, out meshContent))
            {
                buffer.meshData = null;
                return;
            }
            if (meshContent.MeshData.ContainsKey(MeshLayer.Collision))
            {
                buffer.meshData = meshContent.MeshData[MeshLayer.Collision];
            }
            else if (meshContent.MeshData.ContainsKey(MeshLayer.StaticMaterial))
            {
                buffer.meshData = meshContent.MeshData[MeshLayer.StaticMaterial];
            }
            else
            {
                buffer.meshData = null;
                return;
            }
            buffer.transform   = Matrix4x4.TRS(pos, meshContent.GetRotation(tile), Vector3.one);
            buffer.hiddenFaces = CalculateHiddenFaces(tile, meshContent.Rotation);
            return;
        }
        if (ContentLoader.Instance.DesignationMeshConfiguration.GetValue(tile, layer, out meshContent))
        {
            if (!meshContent.MeshData.ContainsKey(layer))
            {
                buffer.meshData = null;
                return;
            }
            buffer.meshData  = meshContent.MeshData[layer];
            buffer.transform = Matrix4x4.TRS(pos, meshContent.GetRotation(tile), Vector3.one);

            index1.x     = ContentLoader.GetPatternIndex(tile.DesignationMat) / ContentLoader.Instance.PatternTextureDepth;
            buffer.color = ContentLoader.GetColor(tile.DesignationMat);
            if (meshContent.ShapeTexture != null)
            {
                index1.y = meshContent.ShapeTexture.ArrayIndex;
            }
            else
            {
                index1.y = ContentLoader.Instance.DefaultShapeTexArrayIndex;
            }
            if (meshContent.SpecialTexture != null)
            {
                index2.x = meshContent.SpecialTexture.ArrayIndex;
            }
            else
            {
                index2.x = ContentLoader.Instance.DefaultSpecialTexArrayIndex;
            }

            buffer.uv1Transform = Matrix4x4.identity;
            buffer.uv2Force     = index1;
            buffer.uv3Force     = index2;
            buffer.hiddenFaces  = CalculateHiddenFaces(tile, meshContent.Rotation);
            return;
        }

        var matColor        = ContentLoader.GetColor(tile.GetMaterial(layer));
        var matPatternIndex = ContentLoader.GetPatternIndex(tile.GetMaterial(layer));

        switch (layer)
        {
        case MeshLayer.GrowthMaterial:
        case MeshLayer.GrowthCutout:
        case MeshLayer.GrowthTransparent:
            matColor = ContentLoader.GetColor(new MatPairStruct(55, 0), tile.GetMaterial(layer));
            break;

        case MeshLayer.GrowthMaterial1:
        case MeshLayer.GrowthCutout1:
        case MeshLayer.GrowthTransparent1:
            matColor = ContentLoader.GetColor(new MatPairStruct(55, 1), tile.GetMaterial(layer));
            break;

        case MeshLayer.GrowthMaterial2:
        case MeshLayer.GrowthCutout2:
        case MeshLayer.GrowthTransparent2:
            matColor = ContentLoader.GetColor(new MatPairStruct(55, 2), tile.GetMaterial(layer));
            break;

        case MeshLayer.GrowthMaterial3:
        case MeshLayer.GrowthCutout3:
        case MeshLayer.GrowthTransparent3:
            matColor = ContentLoader.GetColor(new MatPairStruct(55, 3), tile.GetMaterial(layer));
            break;

        default:
            break;
        }

        switch (layer)
        {
        case MeshLayer.GrowthMaterial:
        case MeshLayer.GrowthMaterial1:
        case MeshLayer.GrowthMaterial2:
        case MeshLayer.GrowthMaterial3:
        case MeshLayer.GrowthCutout:
        case MeshLayer.GrowthCutout1:
        case MeshLayer.GrowthCutout2:
        case MeshLayer.GrowthCutout3:
        case MeshLayer.GrowthTransparent:
        case MeshLayer.GrowthTransparent1:
        case MeshLayer.GrowthTransparent2:
        case MeshLayer.GrowthTransparent3:
        {
            switch (tile.tiletypeMaterial)
            {
            case TiletypeMaterial.PLANT:
            case TiletypeMaterial.ROOT:
            case TiletypeMaterial.TREE_MATERIAL:
            case TiletypeMaterial.MUSHROOM:
                if (!ContentLoader.Instance.GrowthMeshConfiguration.GetValue(tile, layer, out meshContent))
                {
                    buffer.meshData = null;
                    return;
                }
                break;

            default:
                buffer.meshData = null;
                return;
            }
        }
        break;

        default:
        {
            if (layer == MeshLayer.NaturalTerrain)
            {
                if (VoxelGenerator.IsNatural(tile) && !VoxelGenerator.HandleShape(tile) && !VoxelGenerator.UseBoth(tile))
                {
                    layer = MeshLayer.StaticMaterial;
                }
                else
                {
                    buffer.meshData = null;
                    return;
                }
            }
            else if (VoxelGenerator.IsNatural(tile) && !VoxelGenerator.UseBoth(tile))
            {
                buffer.meshData = null;
                return;
            }
            if (!ContentLoader.Instance.TileMeshConfiguration.GetValue(tile, layer, out meshContent))
            {
                buffer.meshData = null;
                return;
            }
        }
        break;
        }

        //Use the transparent shader instead of the opaque shader if the material is transparent.
        if (matColor.a < 0.5f)
        {
            switch (layer)
            {
            case MeshLayer.StaticMaterial:
            case MeshLayer.BaseMaterial:
            case MeshLayer.LayerMaterial:
            case MeshLayer.VeinMaterial:
                buffer.meshData = null;
                return;

            case MeshLayer.StaticTransparent:
                layer = MeshLayer.StaticMaterial;
                break;

            case MeshLayer.BaseTransparent:
                layer = MeshLayer.BaseMaterial;
                break;

            case MeshLayer.LayerTransparent:
                layer = MeshLayer.LayerMaterial;
                break;

            case MeshLayer.VeinTransparent:
                layer = MeshLayer.VeinMaterial;
                break;

            default:
                break;
            }
        }

        if (!meshContent.MeshData.ContainsKey(layer))
        {
            buffer.meshData = null;
            return;
        }
        buffer.meshData  = meshContent.MeshData[layer];
        buffer.transform = Matrix4x4.TRS(pos, meshContent.GetRotation(tile), Vector3.one);
        Matrix4x4 shapeTextTransform  = ContentLoader.Instance.DefaultShapeTexTransform;
        Matrix4x4 specialTexTransform = Matrix4x4.identity;

        NormalContent tileTexContent;

        if (meshContent.ShapeTexture == null)
        {
            if (ContentLoader.Instance.ShapeTextureConfiguration.GetValue(tile, layer, out tileTexContent))
            {
                shapeTextTransform = tileTexContent.UVTransform;
                index1.y           = tileTexContent.ArrayIndex;
            }
        }
        else
        {
            shapeTextTransform = meshContent.ShapeTexture.UVTransform;
            index1.y           = meshContent.ShapeTexture.ArrayIndex;
        }

        index1.x = matPatternIndex / ContentLoader.Instance.PatternTextureDepth;



        if (meshContent.SpecialTexture != null)
        {
            specialTexTransform = meshContent.SpecialTexture.UVTransform;
            index2.x            = meshContent.SpecialTexture.ArrayIndex;
        }
        else
        {
            specialTexTransform = ContentLoader.Instance.DefaultSpecialTexTransform;
            index2.x            = ContentLoader.Instance.DefaultSpecialTexArrayIndex;
        }

        buffer.color = matColor;

        buffer.uv1Transform = Matrix4x4.identity;
        buffer.uv2Force     = index1;
        buffer.uv3Force     = index2;

        buffer.hiddenFaces = CalculateHiddenFaces(tile, meshContent.Rotation);
    }
Beispiel #28
0
    bool GenerateTiles(int block_x, int block_y, int block_z)
    {
        if (!blockDirtyBits[block_x, block_y, block_z])
        {
            return(true);
        }
        blockDirtyBits[block_x, block_y, block_z] = false;
        int bufferIndex        = 0;
        int stencilBufferIndex = 0;

        for (int xx = (block_x * blockSize); xx < (block_x + 1) * blockSize; xx++)
        {
            for (int yy = (block_y * blockSize); yy < (block_y + 1) * blockSize; yy++)
            {
                ////do lights first
                //if (tiles[xx, yy, block_z] != null)
                //{
                //    //do magma lights
                //    if ((xx % 1 == 0) && (yy % 1 == 0) && (block_z % 1 == 0))
                //        if (tiles[xx, yy, block_z].magma > 0 && magmaGlow[xx, yy, block_z] == null)
                //        {
                //            magmaGlow[xx, yy, block_z] = (Light)Instantiate(magmaGlowPrefab);
                //            magmaGlow[xx, yy, block_z].gameObject.SetActive(true);
                //            magmaGlow[xx, yy, block_z].transform.parent = this.transform;
                //            magmaGlow[xx, yy, block_z].transform.position = DFtoUnityCoord(xx, yy, block_z + 1);
                //        }
                //}

                if (meshBuffer == null)
                {
                    meshBuffer = new MeshCombineUtility.MeshInstance[blockSize * blockSize * (int)MeshLayer.StaticCutout];
                }
                if (stencilMeshBuffer == null)
                {
                    stencilMeshBuffer = new MeshCombineUtility.MeshInstance[blockSize * blockSize * ((int)MeshLayer.Count - (int)MeshLayer.StaticCutout)];
                }

                for (int i = 0; i < (int)MeshLayer.Count; i++)
                {
                    MeshLayer layer = (MeshLayer)i;
                    switch (layer)
                    {
                    case MeshLayer.StaticMaterial:
                    case MeshLayer.BaseMaterial:
                    case MeshLayer.LayerMaterial:
                    case MeshLayer.VeinMaterial:
                    case MeshLayer.NoMaterial:
                        FillMeshBuffer(out meshBuffer[bufferIndex], layer, tiles[xx, yy, block_z]);
                        bufferIndex++;
                        break;

                    case MeshLayer.StaticCutout:
                    case MeshLayer.BaseCutout:
                    case MeshLayer.LayerCutout:
                    case MeshLayer.VeinCutout:
                    case MeshLayer.Growth0Cutout:
                    case MeshLayer.Growth1Cutout:
                    case MeshLayer.Growth2Cutout:
                    case MeshLayer.Growth3Cutout:
                    case MeshLayer.NoMaterialCutout:
                        FillMeshBuffer(out stencilMeshBuffer[stencilBufferIndex], layer, tiles[xx, yy, block_z]);
                        stencilBufferIndex++;
                        break;

                    default:
                        break;
                    }
                }
            }
        }
        if (blocks[block_x, block_y, block_z] == null)
        {
            GameObject block = Instantiate(defaultMapBlock) as GameObject;
            block.SetActive(true);
            block.transform.parent            = this.transform;
            block.name                        = "terrain(" + block_x + ", " + block_y + ", " + block_z + ")";
            blocks[block_x, block_y, block_z] = block.GetComponent <MeshFilter>();
        }
        MeshFilter mf = blocks[block_x, block_y, block_z];

        if (mf == null)
        {
            Debug.LogError("MF is null");
        }
        if (mf.mesh == null)
        {
            mf.mesh = new Mesh();
        }
        mf.mesh.Clear();
        //mf.mesh.CombineMeshes(meshBuffer);
        if (stencilBlocks[block_x, block_y, block_z] == null)
        {
            GameObject stencilBlock = Instantiate(defaultStencilMapBLock) as GameObject;
            stencilBlock.SetActive(true);
            stencilBlock.transform.parent            = this.transform;
            stencilBlock.name                        = "foliage(" + block_x + ", " + block_y + ", " + block_z + ")";
            stencilBlocks[block_x, block_y, block_z] = stencilBlock.GetComponent <MeshFilter>();
        }
        MeshFilter mfs = stencilBlocks[block_x, block_y, block_z];

        if (mfs == null)
        {
            Debug.LogError("MFS is null");
        }
        if (mfs.mesh == null)
        {
            mfs.mesh = new Mesh();
        }
        mfs.mesh.Clear();
        MeshCombineUtility.ColorCombine(mfs.mesh, stencilMeshBuffer);
        return(MeshCombineUtility.ColorCombine(mf.mesh, meshBuffer));
        //Debug.Log("Generated a mesh with " + (mf.mesh.triangles.Length / 3) + " tris");
    }
Beispiel #29
0
 internal void GetValue(MapDataStore.Tile tempTile, MeshLayer staticMaterial, out object colorContent)
 {
     throw new NotImplementedException();
 }
Beispiel #30
0
    //Dictionary<string, Texture2D> diffuseTextures = new Dictionary<string, Texture2D>();
    //Dictionary<string, Texture2D> specularTextures = new Dictionary<string, Texture2D>();
    //Dictionary<string, geometry> geometryLibrary = new Dictionary<string, geometry>();
    //List<node> nodeList = new List<node>();
    //this is very similar to the blockmesher function.
    void CollectModel(MapDataStore.Tile tile, MeshLayer layer, DFCoord pos)
    {
        if (layer == MeshLayer.Collision || layer == MeshLayer.BuildingCollision)
            return;

        #region Mesh Selection
        MeshContent meshContent = null;
        switch (layer)
        {
            case MeshLayer.GrowthMaterial:
            case MeshLayer.GrowthMaterial1:
            case MeshLayer.GrowthMaterial2:
            case MeshLayer.GrowthMaterial3:
            case MeshLayer.GrowthCutout:
            case MeshLayer.GrowthCutout1:
            case MeshLayer.GrowthCutout2:
            case MeshLayer.GrowthCutout3:
            case MeshLayer.GrowthTransparent:
            case MeshLayer.GrowthTransparent1:
            case MeshLayer.GrowthTransparent2:
            case MeshLayer.GrowthTransparent3:
                {
                    switch (tile.tiletypeMaterial)
                    {
                        case TiletypeMaterial.PLANT:
                        case TiletypeMaterial.ROOT:
                        case TiletypeMaterial.TREE_MATERIAL:
                        case TiletypeMaterial.MUSHROOM:
                            if (!ContentLoader.Instance.GrowthMeshConfiguration.GetValue(tile, layer, out meshContent))
                                return;
                            break;
                        default:
                            return;
                    }
                }
                break;
            case MeshLayer.BuildingMaterial:
            case MeshLayer.NoMaterialBuilding:
            case MeshLayer.BuildingMaterialCutout:
            case MeshLayer.NoMaterialBuildingCutout:
            case MeshLayer.BuildingMaterialTransparent:
            case MeshLayer.NoMaterialBuildingTransparent:
                {
                    if (tile.buildingType == default(BuildingStruct))
                        return;
                    if (!ContentLoader.Instance.BuildingMeshConfiguration.GetValue(tile, layer, out meshContent))
                        return;
                }
                break;
            default:
                {
                    if (!ContentLoader.Instance.TileMeshConfiguration.GetValue(tile, layer, out meshContent))
                        return;
                }
                break;
        }

        if (!meshContent.MeshData.ContainsKey(layer))
            return;
        #endregion

        node tileNode = new node();

        tileNode.id = string.Format("Tile[{0},{1},{2}]_{3}", pos.x, pos.y, pos.z, layer);

        tileNode.Items = new object[]
        {
            COLLADA.ConvertMatrix(Matrix4x4.TRS(
                GameMap.DFtoUnityCoord(pos),
                meshContent.GetRotation(tile),
                Vector3.one))
        };
        tileNode.ItemsElementName = new ItemsChoiceType2[] { ItemsChoiceType2.matrix };

        //string geometryName = "Mesh-" + meshContent.UniqueIndex;

        //if (!geometryLibrary.ContainsKey(geometryName))
        //{
        //    geometryLibrary[geometryName] = COLLADA.MeshToGeometry(meshContent.MeshData[layer], geometryName);
        //}

        //instance_geometry geometryInstance = new instance_geometry();
        //geometryInstance.url = "#" + geometryLibrary[geometryName].id;
        //tileNode.instance_geometry = new instance_geometry[] { geometryInstance };

        //nodeList.Add(tileNode);
        //return;
        //-----------------------------------------------------------
        //Put normal map stuff here! Remember!
        //-----------------------------------------------------------

        //string patternName = "Tex-";

        //Texture2D tiletexture = null;
        //TextureContent textureContent;
        //if (ContentLoader.Instance.MaterialTextureConfiguration.GetValue(tile, layer, out textureContent))
        //{
        //    tiletexture = textureContent.Texture;
        //    patternName += textureContent.UniqueIndex;
        //}
        //else patternName += "#";

        //patternName += "-#";

        //Color color = Color.grey;
        //ColorContent colorContent;
        //if (ContentLoader.Instance.ColorConfiguration.GetValue(tile, layer, out colorContent))
        //{
        //    color = colorContent.color;
        //}

        //patternName += string.Format("{0:X2}{1:X2}{2:X2}", ((Color32)color).r, ((Color32)color).g, ((Color32)color).b);

        //if (diffuseTextures.ContainsKey(patternName))
        //    return;

        //Color neutralSpec = new Color(0.04f, 0.04f, 0.04f);
        //Texture2D outputDiffuse;
        //Texture2D outputSpec;
        //if (tiletexture != null)
        //{
        //    outputDiffuse = new Texture2D(tiletexture.width, tiletexture.height);
        //    outputSpec = new Texture2D(tiletexture.width, tiletexture.height);
        //    Color[] colors = tiletexture.GetPixels();
        //    Color[] specs = new Color[colors.Length];
        //    for (int i = 0; i < colors.Length; i++)
        //    {
        //        var diffuseColor = OverlayBlend(colors[i], color);
        //        diffuseColor.a = 1;
        //        colors[i] = Color.Lerp(Color.black, diffuseColor, color.a);
        //        specs[i] = Color.Lerp(diffuseColor, neutralSpec, color.a);
        //    }
        //    outputDiffuse.SetPixels(colors);
        //    outputSpec.SetPixels(specs);
        //}
        //else
        //{
        //    outputDiffuse = ContentLoader.CreateFlatTexture(color);
        //    outputSpec = ContentLoader.CreateFlatTexture(neutralSpec);
        //}
        //outputDiffuse.name = patternName + "_Diffuse";
        //outputSpec.name = patternName + "_Specular";

        //diffuseTextures[patternName] = outputDiffuse;
        //specularTextures[patternName] = outputSpec;
    }
Beispiel #31
0
    public override bool GetValue(MapDataStore.Tile tile, MeshLayer layer, out T value)
    {
        //let's just get rid of dead trees right away
        if (tile.special == TiletypeSpecial.DEAD ||
            tile.special == TiletypeSpecial.SMOOTH_DEAD)
        {
            value = default(T);
            return(false);
        }
        int growthLayer = int.MaxValue;

        switch (layer)
        {
        case MeshLayer.GrowthMaterial:
        case MeshLayer.GrowthCutout:
        case MeshLayer.GrowthTransparent:
            growthLayer = 0;
            break;

        case MeshLayer.GrowthMaterial1:
        case MeshLayer.GrowthCutout1:
        case MeshLayer.GrowthTransparent1:
            growthLayer = 1;
            break;

        case MeshLayer.GrowthMaterial2:
        case MeshLayer.GrowthCutout2:
        case MeshLayer.GrowthTransparent2:
            growthLayer = 2;
            break;

        case MeshLayer.GrowthMaterial3:
        case MeshLayer.GrowthCutout3:
        case MeshLayer.GrowthTransparent3:
            growthLayer = 3;
            break;

        default:
            break;
        }
        MatPairStruct mat = tile.material;

        if (mat.mat_type != PlantType ||
            mat.mat_index < 0 ||
            DFConnection.Instance.NetPlantRawList == null ||
            DFConnection.Instance.NetPlantRawList.plant_raws.Count <= mat.mat_index ||
            DFConnection.Instance.NetPlantRawList.plant_raws[mat.mat_index].growths.Count <= growthLayer)
        {
            value = default(T);
            return(false);
        }
        TreeGrowth growth = DFConnection.Instance.NetPlantRawList.plant_raws[mat.mat_index].growths[growthLayer];

        if (!tile.GrowthAppliesNow(growth))
        {
            value = default(T);
            return(false);
        }

        int currentTicks = TimeHolder.DisplayedTime.CurrentYearTicks;

        GrowthPrint print      = null;
        int         printIndex = 0;

        for (int i = 0; i < growth.prints.Count; i++)
        {
            var tempPrint = growth.prints[i];
            if (!((tempPrint.timing_start != -1 && tempPrint.timing_start > currentTicks) || (tempPrint.timing_end != -1 && tempPrint.timing_end < currentTicks)))
            {
                print      = tempPrint;
                printIndex = i;
            }
        }
        if (print == null)
        {
            value = default(T);
            return(false);
        }
        BuildingStruct growthIndex = new BuildingStruct(mat.mat_index, growthLayer, printIndex);
        Content        cont;

        if (growthMatcher.TryGetValue(growthIndex, out cont))
        {
            value = cont.GetValue(tile, layer);
            return(true);
        }
        value = default(T);
        return(false);
    }
Beispiel #32
0
        private SkelletalMesh GetMesh(GMeshContainer meshContainer, Bone root, VertexDescriptor vd)
        {
            SlimDX.Direct3D9.Mesh d3dMesh = meshContainer.Mesh;

            var adjacency                 = meshContainer.GetAdjacency();
            var meshMaterials             = meshContainer.GetMaterials();
            List <MeshMaterial> materials = new List <MeshMaterial>();

            for (int i = 0; i < meshMaterials.Length; i++)
            {
                var matd3d = meshMaterials[i].MaterialD3D;

                string textureFilename = meshMaterials[i].TextureFileName;
                if (textureFilename != null && !Path.IsPathRooted(textureFilename))
                {
                    textureFilename = Path.Combine(Path.GetDirectoryName(xFile), textureFilename);
                }

                materials.Add(new MeshMaterial()
                {
                    Name          = root.Name + "_material" + i,
                    Alpha         = matd3d.Diffuse.Alpha,
                    Diffuse       = matd3d.Diffuse.ToVector3(),
                    Specular      = matd3d.Specular.ToVector3(),
                    SpecularPower = Math.Max(1, matd3d.Power),
                    Reflectivity  = 0,
                    Refractitity  = 0,
                    EmissiveColor = matd3d.Emissive.ToVector3(),
                    DiffuseMap    = textureFilename
                });
            }


            SkelletalMesh mesh = new SkelletalMesh(vd);

            mesh.Adjacency = adjacency;
            SkinVertex[] vertexes = new SkinVertex[d3dMesh.VertexCount];
            Array        indices;

            if (d3dMesh.IndexBuffer.Description.Format == Format.Index16)
            {
                indices = new ushort[d3dMesh.FaceCount * 3];
            }
            else
            {
                indices = new uint[d3dMesh.FaceCount * 3];
            }

            VertexDescriptor meshVD = new VertexDescriptor(d3dMesh.GetDeclaration());
            int positionOffset      = meshVD.GetOffset(DeclarationUsage.Position, 0);
            int normalOffset        = meshVD.GetOffset(DeclarationUsage.Normal, 0);
            int texCoordOffset      = meshVD.GetOffset(DeclarationUsage.TextureCoordinate, 0);
            int blendIndicesOffset  = meshVD.GetOffset(DeclarationUsage.BlendIndices, 0);
            int blendIndicesSize    = meshVD.SizeOfElement(DeclarationUsage.BlendIndices, 0);
            int blendWeightsOffset  = meshVD.GetOffset(DeclarationUsage.BlendWeight, 0);
            int blendWeightSize     = meshVD.SizeOfElement(DeclarationUsage.BlendWeight, 0);

            byte[] buffer;
            unsafe
            {
                DataStream vertexStream = d3dMesh.LockVertexBuffer(0);
                buffer = new byte[vertexStream.Length];
                vertexStream.Read(buffer, 0, (int)vertexStream.Length);
                fixed(byte *_pter = buffer)
                {
                    fixed(SkinVertex *pVertexes = vertexes)
                    {
                        byte *pter = _pter;
                        int   j    = 0;

                        for (int i = 0; i < d3dMesh.VertexCount; i++)
                        {
                            pVertexes[i].Position = *((Vector3 *)(pter + positionOffset));

                            if (normalOffset >= 0)
                            {
                                pVertexes[i].Normal = *((Vector3 *)(pter + normalOffset));
                            }
                            if (texCoordOffset >= 0)
                            {
                                pVertexes[i].TexCoord = *((Vector2 *)(pter + texCoordOffset));
                            }
                            if (blendIndicesOffset >= 0)
                            {
                                byte *indicesPter = (pter + blendIndicesOffset);
                                uint *pDest       = (uint *)&(pVertexes[i].BlendIndices);
                                for (j = 0; j < blendIndicesSize; j++)
                                {
                                    *(((byte *)pDest) + j) = *(indicesPter + j);
                                }
                            }
                            if (blendWeightsOffset >= 0)
                            {
                                byte *   weightsPter = (pter + blendWeightsOffset);
                                Vector4 *pDest       = &(pVertexes[i].BlendWeights);

                                for (j = 0; j < blendWeightSize; j++)
                                {
                                    *(((byte *)pDest) + j) = *(weightsPter + j);
                                }
                            }

                            pter += d3dMesh.BytesPerVertex;
                        }
                    }
                }

                d3dMesh.UnlockVertexBuffer();

                DataStream indexStream = d3dMesh.LockIndexBuffer(0);
                GCHandle   handler     = GCHandle.Alloc(indices, GCHandleType.Pinned);
                IntPtr     indexPter   = Marshal.UnsafeAddrOfPinnedArrayElement(indices, 0);

                buffer = new byte[indexStream.Length];
                indexStream.Read(buffer, 0, (int)indexStream.Length);
                Marshal.Copy(buffer, 0, indexPter, buffer.Length);

                handler.Free();
                d3dMesh.UnlockIndexBuffer();
            }

            mesh.CreateVertexBuffer(vertexes);
            if (d3dMesh.IndexBuffer.Description.Format == Format.Index16)
            {
                mesh.CreateIndexBuffer((ushort[])indices);
            }
            else
            {
                mesh.CreateIndexBuffer((uint[])indices);
            }

            List <MeshLayer> layers = new List <MeshLayer>();

            if (meshContainer.BoneCombinations == null || meshContainer.BoneCombinations.Length == 0)
            {
                MeshLayer component = new MeshLayer();
                materials.Add(MeshMaterial.CreateDefaultMaterial(meshContainer.Name + "_default"));
                component.materialIndex  = 0;
                component.primitiveCount = mesh.FaceCount;
                component.startIndex     = 0;
                component.startVertex    = 0;
                component.vertexCount    = mesh.VertexCount;
                layers.Add(component);
            }
            else
            {
                for (int i = 0; i < meshContainer.BoneCombinations.Length; i++)
                {
                    BoneCombination comb = meshContainer.BoneCombinations[i];

                    MeshLayer component = new MeshLayer();
                    component.materialIndex  = comb.AttributeId;
                    component.primitiveCount = comb.FaceCount;
                    component.startIndex     = comb.FaceStart * 3;
                    component.startVertex    = comb.VertexStart;
                    component.vertexCount    = comb.VertexCount;

                    layers.Add(component);
                }
            }

            var layerArray = layers.ToArray();

            mesh.Materials = materials.ToArray();
            mesh.SetLayers(layerArray);

            var skinInfo = meshContainer.SkinInfo;

            mesh.MaxVertexInfluences = skinInfo.MaximumVertexInfluences;

            var bones = new Bone[skinInfo.BoneCount];
            var boneOffsetMatrices = new Matrix[bones.Length];

            for (int i = 0; i < bones.Length; i++)
            {
                bones[i] = root.FindChild(skinInfo.GetBoneName(i));
                boneOffsetMatrices[i] = skinInfo.GetBoneOffsetMatrix(i);
            }

            mesh.Bones = bones;
            mesh.BoneBindingMatrices = boneOffsetMatrices;

            if (meshContainer.BoneCombinations != null && meshContainer.BoneCombinations.Length > 0)
            {
                for (int layerIndex = 0; layerIndex < layerArray.Length; layerIndex++)
                {
                    mesh.SetLayerBones(layerIndex, meshContainer.BoneCombinations[layerIndex].BoneIds);
                }
            }

            mesh.LockVertexBuffer();
            int[]   vertices;
            float[] weights;
            for (int i = 0; i < mesh.bones.Length; i++)
            {
                skinInfo.GetBoneInfluence(i, out vertices, out weights);
                VertexStreamView <Vector3> positions = mesh.GetVertexViewStream <Vector3>(DeclarationUsage.Position, 0, vertices);
            }
            mesh.UnlockVertexBuffer();

            meshVD.Dispose();

            if (normalOffset < 0)
            {
                mesh.ComputeNormals();
            }
            if (texCoordOffset < 0)
            {
                mesh.ComputeTextureCoords(CoordMappingType.Spherical);
            }

            mesh.ComputeTangents();

            return(mesh);
        }
Beispiel #33
0
        internal HeaderSectionInfo LoadHeader(EndianBinaryReader input, MeshLayer newLayer)
        {
            Layer = newLayer;

            uint renderFlagsUint = input.ReadUInt32();

            if ((renderFlagsUint & ~(uint)(RenderFlag.UnkFlag01 |
                                           RenderFlag.TwoSided |
                                           RenderFlag.UnkFlag04 |
                                           RenderFlag.UnkFlag08 |
                                           RenderFlag.UnkFlag10 |
                                           RenderFlag.UnkFlag20 |
                                           RenderFlag.UnkFlag40 |
                                           RenderFlag.UnkFlag200)) != 0)
            {
                throw new InvalidOperationException("Unknown RenderFlags set.");
            }
            RenderFlags = (RenderFlag)renderFlagsUint;

            Unk4  = input.ReadUInt32();
            Unk8  = input.ReadUInt32();
            UnkC  = input.ReadUInt32();
            Unk10 = input.ReadUInt16();
            byte usedMaterialCount = input.ReadByte();
            byte sectionFlags      = input.ReadByte();

            Unk14 = input.ReadUInt16();
            PrimaryMaterialIdx   = input.ReadUInt16();
            SecondaryMaterialIdx = input.ReadUInt16();
            TertiaryMaterialIdx  = input.ReadUInt16();
            int calculatedUsedMaterialCount = (byte)(
                ((PrimaryMaterialIdx != ushort.MaxValue) ? 1 : 0) +
                ((SecondaryMaterialIdx != ushort.MaxValue) ? 1 : 0) +
                ((TertiaryMaterialIdx != ushort.MaxValue) ? 1 : 0));

            if (calculatedUsedMaterialCount != usedMaterialCount)
            {
                throw new InvalidOperationException("Expected GcmfTriangleMesh[0x13] to match used material count.");
            }
            uint vertexFlags = input.ReadUInt32();

            input.Read(TransformMatrixSpecificIdxsObj1, 0, 8);
            int chunk1Size = input.ReadInt32();
            int chunk2Size = input.ReadInt32();

            BoundingSphereCenter = new Vector3(input.ReadSingle(), input.ReadSingle(), input.ReadSingle());
            Unk3C = input.ReadSingle();
            Unk40 = input.ReadUInt32();
            if (input.ReadUInt32() != 0)
            {
                throw new InvalidGmaFileException("Expected GcmfTriangleMesh[0x44] == 0");
            }
            if (input.ReadUInt32() != 0)
            {
                throw new InvalidGmaFileException("Expected GcmfTriangleMesh[0x48] == 0");
            }
            if (input.ReadUInt32() != 0)
            {
                throw new InvalidGmaFileException("Expected GcmfTriangleMesh[0x4C] == 0");
            }
            if (input.ReadUInt32() != 0)
            {
                throw new InvalidGmaFileException("Expected GcmfTriangleMesh[0x50] == 0");
            }
            if (input.ReadUInt32() != 0)
            {
                throw new InvalidGmaFileException("Expected GcmfTriangleMesh[0x54] == 0");
            }
            if (input.ReadUInt32() != 0)
            {
                throw new InvalidGmaFileException("Expected GcmfTriangleMesh[0x58] == 0");
            }
            if (input.ReadUInt32() != 0)
            {
                throw new InvalidGmaFileException("Expected GcmfTriangleMesh[0x5C] == 0");
            }

            return(new HeaderSectionInfo
            {
                SectionFlags = sectionFlags,
                VertexFlags = vertexFlags,
                Chunk1Size = chunk1Size,
                Chunk2Size = chunk2Size
            });
        }
Beispiel #34
0
    /// <summary>
    /// This is the function that actually decides what mesh and texture each tile gets
    /// </summary>
    /// <param name="buffer">Buffer to put the chosen meshes into for combining</param>
    /// <param name="layer">layer currently being worked on</param>
    /// <param name="tile">The tile to get all the needed info from.</param>
    void FillMeshBuffer(out MeshCombineUtility.MeshInstance buffer, MeshLayer layer, MapDataStore.Tile tile, Vector3 pos)
    {
        buffer = new MeshCombineUtility.MeshInstance();
        Vector2 index1 = Vector2.zero;
        Vector2 index2 = Vector2.zero;
        MeshContent meshContent = null;
        buffer.color = Color.grey;
        if (layer == MeshLayer.Collision)
        {
            if (!ContentLoader.Instance.CollisionMeshConfiguration.GetValue(tile, layer, out meshContent))
            {
                buffer.meshData = null;
                return;
            }
            if (meshContent.MeshData.ContainsKey(MeshLayer.Collision))
                buffer.meshData = meshContent.MeshData[MeshLayer.Collision];
            else if (meshContent.MeshData.ContainsKey(MeshLayer.StaticMaterial))
                buffer.meshData = meshContent.MeshData[MeshLayer.StaticMaterial];
            else
            {
                buffer.meshData = null;
                return;
            }
            buffer.transform = Matrix4x4.TRS(pos, meshContent.GetRotation(tile), Vector3.one);
            buffer.hiddenFaces = CalculateHiddenFaces(tile, meshContent.Rotation);
            return;
        }

        if (layer == MeshLayer.BuildingCollision)
        {
            if (tile.buildingType == default(BuildingStruct) || !ContentLoader.Instance.BuildingCollisionMeshConfiguration.GetValue(tile, layer, out meshContent))
            {
                buffer.meshData = null;
                return;
            }
            if (meshContent.MeshData.ContainsKey(MeshLayer.Collision))
                buffer.meshData = meshContent.MeshData[MeshLayer.Collision];
            else if (meshContent.MeshData.ContainsKey(MeshLayer.BuildingMaterial))
                buffer.meshData = meshContent.MeshData[MeshLayer.BuildingMaterial];
            else if (meshContent.MeshData.ContainsKey(MeshLayer.BuildingMaterialCutout))
                buffer.meshData = meshContent.MeshData[MeshLayer.BuildingMaterialCutout];
            else if (meshContent.MeshData.ContainsKey(MeshLayer.BuildingMaterialTransparent))
                buffer.meshData = meshContent.MeshData[MeshLayer.BuildingMaterialTransparent];
            else
            {
                buffer.meshData = null;
                return;
            }
            buffer.transform = Matrix4x4.TRS(pos, meshContent.GetRotation(tile), Vector3.one);
            buffer.hiddenFaces = CalculateHiddenFaces(tile, meshContent.Rotation);
            return;
        }
        if (ContentLoader.Instance.DesignationMeshConfiguration.GetValue(tile, layer, out meshContent))
        {
            if (!meshContent.MeshData.ContainsKey(layer))
            {
                buffer.meshData = null;
                return;
            }
            buffer.meshData = meshContent.MeshData[layer];
            buffer.transform = Matrix4x4.TRS(pos, meshContent.GetRotation(tile), Vector3.one);

            if (TextureStorage.UsingArray)
            {
                if (meshContent.MaterialTexture != null)
                    index1.x = meshContent.MaterialTexture.ArrayIndex;
                else
                    index1.x = ContentLoader.Instance.DefaultMatTexArrayIndex;
                if (meshContent.ShapeTexture != null)
                    index1.y = meshContent.ShapeTexture.ArrayIndex;
                else
                    index1.y = ContentLoader.Instance.DefaultShapeTexArrayIndex;
                if (meshContent.SpecialTexture != null)
                    index2.x = meshContent.SpecialTexture.ArrayIndex;
                else
                    index2.x = ContentLoader.Instance.DefaultSpecialTexArrayIndex;

                buffer.uv1Transform = Matrix4x4.identity;
                buffer.uv2Force = index1;
                buffer.uv3Force = index2;
            }
            else
            {
                if (meshContent.MaterialTexture != null)
                    buffer.uv1Transform = meshContent.MaterialTexture.UVTransform;
                else
                    buffer.uv1Transform = ContentLoader.Instance.DefaultMatTexTransform;
                if (meshContent.ShapeTexture != null)
                    buffer.uv2Transform = meshContent.ShapeTexture.UVTransform;
                else
                    buffer.uv2Transform = ContentLoader.Instance.DefaultShapeTexTransform;
                if (meshContent.SpecialTexture != null)
                    buffer.uv3Transform = meshContent.SpecialTexture.UVTransform;
                else
                    buffer.uv3Transform = ContentLoader.Instance.DefaultSpecialTexTransform;
            }
            buffer.hiddenFaces = CalculateHiddenFaces(tile, meshContent.Rotation);
            return;
        }
        switch (layer)
        {
            case MeshLayer.GrowthMaterial:
            case MeshLayer.GrowthMaterial1:
            case MeshLayer.GrowthMaterial2:
            case MeshLayer.GrowthMaterial3:
            case MeshLayer.GrowthCutout:
            case MeshLayer.GrowthCutout1:
            case MeshLayer.GrowthCutout2:
            case MeshLayer.GrowthCutout3:
            case MeshLayer.GrowthTransparent:
            case MeshLayer.GrowthTransparent1:
            case MeshLayer.GrowthTransparent2:
            case MeshLayer.GrowthTransparent3:
                {
                    switch (tile.tiletypeMaterial)
                    {
                        case TiletypeMaterial.PLANT:
                        case TiletypeMaterial.ROOT:
                        case TiletypeMaterial.TREE_MATERIAL:
                        case TiletypeMaterial.MUSHROOM:
                            if (!ContentLoader.Instance.GrowthMeshConfiguration.GetValue(tile, layer, out meshContent))
                            {
                                buffer.meshData = null;
                                return;
                            }
                            break;
                        default:
                            buffer.meshData = null;
                            return;
                    }
                }
                break;
            case MeshLayer.BuildingMaterial:
            case MeshLayer.NoMaterialBuilding:
            case MeshLayer.BuildingMaterialCutout:
            case MeshLayer.NoMaterialBuildingCutout:
            case MeshLayer.BuildingMaterialTransparent:
            case MeshLayer.NoMaterialBuildingTransparent:
                {
                    if (tile.buildingType == default(BuildingStruct))
                    {
                        buffer.meshData = null;
                        return;
                    }
                    if (!ContentLoader.Instance.BuildingMeshConfiguration.GetValue(tile, layer, out meshContent))
                    {
                        buffer.meshData = null;
                        return;
                    }
                }
                break;
            default:
                {
                    if (layer == MeshLayer.NaturalTerrain)
                    {
                        if (VoxelGenerator.IsNatural(tile) && !VoxelGenerator.HandleShape(tile) && !VoxelGenerator.UseBoth(tile))
                            layer = MeshLayer.StaticMaterial;
                        else
                        {
                            buffer.meshData = null;
                            return;
                        }
                    }
                    else if (VoxelGenerator.IsNatural(tile) && !VoxelGenerator.UseBoth(tile))
                    {
                        buffer.meshData = null;
                        return;
                    }
                    if (!ContentLoader.Instance.TileMeshConfiguration.GetValue(tile, layer, out meshContent))
                    {
                        buffer.meshData = null;
                        return;
                    }
                }
                break;
        }

        if (!meshContent.MeshData.ContainsKey(layer))
        {
            buffer.meshData = null;
            return;
        }
        buffer.meshData = meshContent.MeshData[layer];
        buffer.transform = Matrix4x4.TRS(pos, meshContent.GetRotation(tile), Vector3.one);
        Matrix4x4 matTexTransform = ContentLoader.Instance.DefaultMatTexTransform;
        Matrix4x4 shapeTextTransform = ContentLoader.Instance.DefaultShapeTexTransform;
        Matrix4x4 specialTexTransform = Matrix4x4.identity;

        NormalContent tileTexContent;
        if (meshContent.ShapeTexture == null)
        {
            if (layer == MeshLayer.BuildingMaterial
                || layer == MeshLayer.BuildingMaterialCutout
                || layer == MeshLayer.NoMaterialBuilding
                || layer == MeshLayer.NoMaterialBuildingCutout
                || layer == MeshLayer.BuildingMaterialTransparent
                || layer == MeshLayer.NoMaterialBuildingTransparent
                )
            {
                if (ContentLoader.Instance.BuildingShapeTextureConfiguration.GetValue(tile, layer, out tileTexContent))
                {
                    shapeTextTransform = tileTexContent.UVTransform;
                    index1.y = tileTexContent.ArrayIndex;
                }
            }
            else
            {
                if (ContentLoader.Instance.ShapeTextureConfiguration.GetValue(tile, layer, out tileTexContent))
                {
                    shapeTextTransform = tileTexContent.UVTransform;
                    index1.y = tileTexContent.ArrayIndex;
                }
            }
        }
        else
        {
            shapeTextTransform = meshContent.ShapeTexture.UVTransform;
            index1.y = meshContent.ShapeTexture.ArrayIndex;
        }

        if (meshContent.MaterialTexture != null
            && (layer == MeshLayer.NoMaterial
            || layer == MeshLayer.NoMaterialBuilding
            || layer == MeshLayer.NoMaterialBuildingCutout
            || layer == MeshLayer.NoMaterialBuildingTransparent
            || layer == MeshLayer.NoMaterialCutout
            || layer == MeshLayer.NoMaterialTransparent))
        {
            matTexTransform = meshContent.MaterialTexture.UVTransform;
            index1.x = meshContent.MaterialTexture.ArrayIndex;
        }
        else
        {
            TextureContent matTexContent;

            if (ContentLoader.Instance.MaterialTextureConfiguration.GetValue(tile, layer, out matTexContent))
            {
                matTexTransform = matTexContent.UVTransform;
                index1.x = matTexContent.ArrayIndex;
            }
        }

        if (meshContent.SpecialTexture != null)
        {
            specialTexTransform = meshContent.SpecialTexture.UVTransform;
            index2.x = meshContent.SpecialTexture.ArrayIndex;
        }
        else
        {
            specialTexTransform = ContentLoader.Instance.DefaultSpecialTexTransform;
            index2.x = ContentLoader.Instance.DefaultSpecialTexArrayIndex;
        }

        ColorContent newColorContent;
        Color newColor;
        if (ContentLoader.Instance.ColorConfiguration.GetValue(tile, layer, out newColorContent))
        {
            newColor = newColorContent.color;
        }
        else
        {
            MatPairStruct mat = new MatPairStruct(-1, -1);
            switch (layer)
            {
                case MeshLayer.StaticMaterial:
                case MeshLayer.StaticCutout:
                case MeshLayer.StaticTransparent:
                    mat = tile.material;
                    break;
                case MeshLayer.BaseMaterial:
                case MeshLayer.BaseCutout:
                case MeshLayer.BaseTransparent:
                    mat = tile.base_material;
                    break;
                case MeshLayer.LayerMaterial:
                case MeshLayer.LayerCutout:
                case MeshLayer.LayerTransparent:
                    mat = tile.layer_material;
                    break;
                case MeshLayer.VeinMaterial:
                case MeshLayer.VeinCutout:
                case MeshLayer.VeinTransparent:
                    mat = tile.vein_material;
                    break;
                case MeshLayer.NoMaterial:
                case MeshLayer.NoMaterialCutout:
                case MeshLayer.NoMaterialBuildingCutout:
                case MeshLayer.NoMaterialBuilding:
                case MeshLayer.NoMaterialBuildingTransparent:
                case MeshLayer.NoMaterialTransparent:
                    break;
                case MeshLayer.BuildingMaterial:
                case MeshLayer.BuildingMaterialCutout:
                case MeshLayer.BuildingMaterialTransparent:
                    mat = tile.buildingMaterial;
                    break;
                default:
                    break;
            }
            MaterialDefinition mattie;
            if (materials.TryGetValue(mat, out mattie))
            {
                ColorDefinition color = mattie.state_color;
                if (color == null)
                    newColor = Color.cyan;
                else
                    newColor = new Color(color.red / 255.0f, color.green / 255.0f, color.blue / 255.0f, 1);
            }
            else
            {
                newColor = Color.grey;
            }
        }
        buffer.color = newColor;

        if (TextureStorage.UsingArray)
        {
            buffer.uv1Transform = Matrix4x4.identity;
            buffer.uv2Force = index1;
            buffer.uv3Force = index2;
        }
        else
        {
            buffer.uv1Transform = matTexTransform;
            buffer.uv2Transform = shapeTextTransform;
            buffer.uv3Transform = specialTexTransform;
        }
        buffer.hiddenFaces = CalculateHiddenFaces(tile, meshContent.Rotation);
    }