示例#1
0
    public override void Initialize(string extraData)
    {
        base.Initialize(extraData);

        string[] strs = extraData.Split(' ');

        MeshData sign = new MeshData(BlockMeshes.FindMesh(strs[0] + "_Sign"));
        MeshData post = new MeshData(BlockMeshes.FindMesh(strs[0] + "_Post"));

        int paintedTexSlot = int.Parse(strs[1]);

        for (int i = 0; i < 16; i++)
        {
            bool      hanging = (i & 8) != 0;
            Matrix4x4 matrix  = Matrix4x4.Rotate(Quaternion.Euler(0, 45 * i, 0));
            if (hanging)
            {
                matrix *= Matrix4x4.Scale(new Vector3(1f, -1f, 1f)) * Matrix4x4.Translate(new Vector3(0f, 1f, 0f));
            }
            matrix         = Matrix4x4.Translate(new Vector3(0.5f, 0f, 0.5f)) * matrix;
            blockMeshes[i] = sign.Clone();
            blockMeshes[i].Append(post);
            blockMeshes[i].Transform(matrix);
            blockMeshes[i].WrapInTextureSlotTerrain(TextureSlot);

            paintedBlockMeshes[i] = sign.Clone();
            paintedBlockMeshes[i].Append(post);
            paintedBlockMeshes[i].Transform(matrix);
            paintedBlockMeshes[i].WrapInTextureSlotTerrain(paintedTexSlot);
        }
    }
示例#2
0
    public override void Initialize(string extraData)
    {
        MeshData mesh = new MeshData(BlockMeshes.FindMesh("Torch"));

        meshes[0] = mesh.Clone();
        meshes[0].Transform(Matrix4x4.Rotate(Quaternion.Euler(34, 0, 0)) * Matrix4x4.Translate(new Vector3(0.5f, 0.15f, -0.05f)));
        meshes[1] = mesh.Clone();
        meshes[1].Transform(Matrix4x4.Rotate(Quaternion.Euler(34, 90, 0)) * Matrix4x4.Translate(new Vector3(-0.05f, 0.15f, 0.5f)));
        meshes[2] = mesh.Clone();
        meshes[2].Transform(Matrix4x4.Rotate(Quaternion.Euler(34, 180, 0)) * Matrix4x4.Translate(new Vector3(0.5f, 0.15f, 1.05f)));
        meshes[3] = mesh.Clone();
        meshes[3].Transform(Matrix4x4.Rotate(Quaternion.Euler(34, 270, 0)) * Matrix4x4.Translate(new Vector3(1.05f, 0.15f, 0.5f)));
        meshes[4] = mesh.Clone();
        meshes[4].Transform(Matrix4x4.Translate(new Vector3(0.5f, 0f, 0.5f)));
    }
示例#3
0
    public override void Initialize(string extraData)
    {
        base.Initialize(extraData);
        //IsCubic = false;

        Matrix4x4 matrix = Matrix4x4.Translate(new Vector3(0.5f, 0f, 0.5f));

        float     y;
        Matrix4x4 m;
        Mesh      mesh;

        for (int i = 0; i < 24; i++)
        {
            y = 0;

            y -= GetRotation(i) * 90;

            m = Matrix4x4.Rotate(Quaternion.Euler(0, y, 0));
            switch ((i >> 3) & 3)
            {
            case 1:
                mesh = BlockMeshes.FindMesh("Stair0");
                break;

            case 0:
                mesh = BlockMeshes.FindMesh("Stair1");
                break;

            case 2:
                mesh = BlockMeshes.FindMesh("Stair2");
                break;

            default:
                throw new System.Exception("unknown stair module: " + ((i >> 3) & 3));
            }

            blockMeshes[i] = new MeshData(mesh);
            blockMeshes[i].Transform(matrix * m);
            if ((i & 4) != 0)
            {
                blockMeshes[i].FlipVertical();
            }
            paintedBlockMeshes[i] = blockMeshes[i].Clone();

            blockMeshes[i].WrapInTextureSlotTerrain(TextureSlot);
            paintedBlockMeshes[i].WrapInTextureSlotTerrain(BlocksData.paintedTextures[TextureSlot]);
        }
    }
    void Update()
    {
        switch (state)
        {
        case State.Created:
            state = State.GeneratingMap;
            logger.Log("generating new map");

            GenerationParameters parameters = GetParameters();
            MapGenerator         generator  = new MapGenerator(parameters);
            MapGenerationProgress.InstantiateNew(generator);
            oldParameters  = parameters;
            generationTask = Task.Run(() => GridMap.Instance.GenerateMap(generator));
            break;

        case State.GeneratingMap:
        case State.LoadingMap:
            if (GridMap.Instance.IsGenerationDone())
            {
                logger.Log("Map finished generation");
                state = State.MapGenerated;
            }
            break;

        case State.MapGenerated:
            logger.Log("Creating meshGenerators");
            BlockMeshes.LoadMeshes();
            createMeshCreators();
            UpdateMaxVerticalLevel();
            RegenerateMeshes();
            state          = State.MeshGeneratorsCreated;
            cameraObserver = new SimpleObserver <CameraController>(mainCam, (cam) =>
            {
                UpdateMaxVerticalLevel();
                RegenerateMeshes();
            });

            break;

        case State.MeshGeneratorsCreated:
            break;
        }
        if (!oldParameters.Equals(GetParameters()) && generationTask != null && !generationTask.Status.Equals(TaskStatus.Running))
        {
            regenerateMap = false;
            RegenerateMap();
        }
    }
示例#5
0
    public static void TransformAllMesh()
    {
        MeshFilter[] ms = Selection.activeGameObject.GetComponentsInChildren <MeshFilter>();
        foreach (MeshFilter m in ms)
        {
            Mesh meshToSave = BlockMeshes.TranslateMesh(m.sharedMesh, m.transform.localToWorldMatrix);

            string path = EditorUtility.SaveFilePanel("Save Separate Mesh Asset", "Assets/Meshes/", meshToSave.name, "asset");
            if (string.IsNullOrEmpty(path))
            {
                continue;
            }

            path = FileUtil.GetProjectRelativePath(path);

            MeshUtility.Optimize(meshToSave);

            AssetDatabase.CreateAsset(meshToSave, path);
            AssetDatabase.SaveAssets();
        }
    }
示例#6
0
    public void AllNormalBlockTimeTrial()
    {
        BlockMeshes meshes = new BlockMeshes();

        meshes.Initialize();
        BlocksData data = new BlocksData();

        data.Initialize();

        BlockTerrain.Chunk chunk = new BlockTerrain.Chunk(16, 128, 16);
        MeshGenerator      g     = new MeshGenerator();

        Stopwatch stopwatch = new Stopwatch();

        int count = BlocksData.Blocks.Length;

        for (int i = 0; i < count; i++)
        {
            if (BlocksData.IsTransparent[i])
            {
                try
                {
                    stopwatch.Reset();
                    stopwatch.Start();
                    for (int k = 0; k < 50; k++)
                    {
                        BlocksData.NormalBlocks[i].GenerateTerrain(1, 1, 1, i, chunk, g);
                    }
                    stopwatch.Stop();
                    UnityEngine.Debug.LogFormat("tested block: {0}; time: {1}ms", BlocksData.Blocks[i].Name, stopwatch.ElapsedMilliseconds);
                }
                catch (System.Exception e)
                {
                    //UnityEngine.Debug.LogException(e);
                }
            }
        }
    }
示例#7
0
    public override void Initialize(string extraData)
    {
        base.Initialize(extraData);
        //IsCubic = false;

        Mesh      slab   = BlockMeshes.FindMesh("Slab");
        Matrix4x4 matrix = Matrix4x4.Translate(new Vector3(0.5f, 0f, 0.5f));

        blockMeshes[0] = new MeshData(slab);
        blockMeshes[0].Transform(matrix);

        blockMeshes[1] = new MeshData(slab);
        blockMeshes[1].Transform(matrix);
        blockMeshes[1].FlipVertical();

        paintedBlockMeshes[0] = blockMeshes[0].Clone();
        paintedBlockMeshes[1] = blockMeshes[1].Clone();

        blockMeshes[0].WrapInTextureSlotTerrain(TextureSlot);
        blockMeshes[1].WrapInTextureSlotTerrain(TextureSlot);
        paintedBlockMeshes[0].WrapInTextureSlotTerrain(BlocksData.paintedTextures[TextureSlot]);
        paintedBlockMeshes[1].WrapInTextureSlotTerrain(BlocksData.paintedTextures[TextureSlot]);
    }
示例#8
0
    public override void Initialize(string extraData)
    {
        base.Initialize(extraData);

        string[] strs = extraData.Split(' ');

        string modelName = strs[0];

        useAlphaTest = bool.Parse(strs[1]);
        bool doubleSidedPlanks = bool.Parse(strs[2]);

        unpaintedColor = new Color32(byte.Parse(strs[3]), byte.Parse(strs[4]), byte.Parse(strs[5]), 255);

        MeshData post = new MeshData(BlockMeshes.FindMesh(modelName + "_Post"));

        post.Transform(Matrix4x4.Translate(new Vector3(0.5f, 0f, 0.5f)));
        MeshData plank = new MeshData(BlockMeshes.FindMesh(modelName + "_Planks"));

        for (int i = 0; i < 16; i++)
        {
            MeshData data = MeshData.CreateEmpty();

            if ((i & 1) != 0)
            {
                MeshData data1 = plank.Clone();
                data1.Transform(Matrix4x4.Translate(new Vector3(0.5f, 0f, 0.5f)) * Matrix4x4.Rotate(Quaternion.identity));
                data.Append(data1);
                if (doubleSidedPlanks)
                {
                    data1.FlipWindingOrder();
                    data.Append(data1);
                }
            }
            if ((i & 2) != 0)
            {
                MeshData data1 = plank.Clone();
                data1.Transform(Matrix4x4.Translate(new Vector3(0.5f, 0f, 0.5f)) * Matrix4x4.Rotate(Quaternion.Euler(0, -180, 0)));
                data.Append(data1);
                if (doubleSidedPlanks)
                {
                    data1.FlipWindingOrder();
                    data.Append(data1);
                }
            }
            if ((i & 4) != 0)
            {
                MeshData data1 = plank.Clone();
                data1.Transform(Matrix4x4.Translate(new Vector3(0.5f, 0f, 0.5f)) * Matrix4x4.Rotate(Quaternion.Euler(0, 90, 0)));
                data.Append(data1);
                if (doubleSidedPlanks)
                {
                    data1.FlipWindingOrder();
                    data.Append(data1);
                }
            }
            if ((i & 8) != 0)
            {
                MeshData data1 = plank.Clone();
                data1.Transform(Matrix4x4.Translate(new Vector3(0.5f, 0f, 0.5f)) * Matrix4x4.Rotate(Quaternion.Euler(0, 270, 0)));
                data.Append(data1);
                if (doubleSidedPlanks)
                {
                    data1.FlipWindingOrder();
                    data.Append(data1);
                }
            }

            blockMeshes[i] = post.Clone();
            blockMeshes[i].Append(data);

            paintedBlockMeshes[i] = post.Clone();
            paintedBlockMeshes[i].Append(data);

            if (useAlphaTest)
            {
                blockMeshes[i].WrapInTextureSlot(TextureSlot);
                paintedBlockMeshes[i].WrapInTextureSlot(BlocksData.paintedTextures[TextureSlot]);
            }
            else
            {
                blockMeshes[i].WrapInTextureSlotTerrain(TextureSlot);
                paintedBlockMeshes[i].WrapInTextureSlotTerrain(BlocksData.paintedTextures[TextureSlot]);
            }
        }
    }
示例#9
0
    public override void Initialize(string extraData)
    {
        Mesh blockMesh;

        switch (Index)
        {
        case 134:
            blockMesh = BlockMeshes.FindMesh("NandGate");
            break;

        case 135:
            blockMesh = BlockMeshes.FindMesh("NorGate");
            break;

        case 137:
            blockMesh = BlockMeshes.FindMesh("AndGate");
            break;

        case 140:
            blockMesh = BlockMeshes.FindMesh("NotGate");
            break;

        case 143:
            blockMesh = BlockMeshes.FindMesh("OrGate");
            break;

        case 145:
            blockMesh = BlockMeshes.FindMesh("DelayGate");
            break;

        case 146:
            blockMesh = BlockMeshes.FindMesh("SRLatch");
            break;

        case 156:
            blockMesh = BlockMeshes.FindMesh("XorGate");
            break;

        case 157:
            blockMesh = BlockMeshes.FindMesh("RandomGenerator");
            break;

        case 179:
            blockMesh = BlockMeshes.FindMesh("MotionDetector");
            break;

        case 180:
            blockMesh = BlockMeshes.FindMesh("DigitalToAnalogConverter");
            break;

        case 181:
            blockMesh = BlockMeshes.FindMesh("AnalogToDigitalConverter");
            break;

        case 183:
            blockMesh = BlockMeshes.FindMesh("SoundGenerator");
            break;

        case 184:
            blockMesh = BlockMeshes.FindMesh("Counter");
            break;

        case 186:
            blockMesh = BlockMeshes.FindMesh("MemoryBank");
            break;

        case 187:
            blockMesh = BlockMeshes.FindMesh("RealTimeClock");
            break;

        case 188:
            blockMesh = BlockMeshes.FindMesh("TruthTableCircuit");
            break;

        default:
            throw new System.Exception("unsupported electric gate: " + Index);
        }

        Matrix4x4 m;
        Matrix4x4 m2;

        Matrix4x4 half        = Matrix4x4.Translate(new Vector3(0.5f, 0.5f, 0.5f));
        Matrix4x4 inverseHalf = half.inverse;

        for (int i = 0; i < 4; i++)
        {
            for (int j = 0; j < 6; j++)
            {
                switch (j)
                {
                case 0:
                    m  = Matrix4x4.Rotate(Quaternion.Euler(0, 0, i * 90));
                    m2 = Matrix4x4.TRS(new Vector3(0.5f, -0.5f, 0f), Quaternion.Euler(90, 0, 0), Vector3.one);
                    break;

                case 1:
                    m  = Matrix4x4.Rotate(Quaternion.Euler(i * -90, 0, 0));
                    m2 = Matrix4x4.TRS(new Vector3(0f, -0.5f, 0.5f), Quaternion.Euler(90, 0, -270), Vector3.one);
                    break;

                case 2:
                    m  = Matrix4x4.Rotate(Quaternion.Euler(0, 0, i * -90));
                    m2 = Matrix4x4.TRS(new Vector3(-0.5f, -0.5f, 0f), Quaternion.Euler(90, 0, -180), Vector3.one);
                    break;

                case 3:
                    m  = Matrix4x4.Rotate(Quaternion.Euler(i * 90, 0, 0));
                    m2 = Matrix4x4.TRS(new Vector3(0f, -0.5f, -0.5f), Quaternion.Euler(90, 0, -90), Vector3.one);
                    break;

                case 4:
                    m  = Matrix4x4.Rotate(Quaternion.Euler(0, i * 90, 0));
                    m2 = Matrix4x4.Translate(new Vector3(0.5f, 0f, 0.5f));
                    break;

                case 5:
                    m  = Matrix4x4.Rotate(Quaternion.Euler(0, i * -90, 0));
                    m2 = Matrix4x4.TRS(new Vector3(0.5f, 0f, -0.5f), Quaternion.Euler(180, 0, 0), Vector3.one);
                    break;

                default:
                    throw new System.Exception();
                }

                MeshData data = new MeshData(blockMesh);
                data.Transform(half * m * m2 * inverseHalf);
                meshes[(j << 2) + i] = data;
            }
        }
    }