Exemplo n.º 1
0
        public static void GeneratePatternImage(int [,] Voxels, float ScaleX, float ScaleY, LockBitMap PatternImage, LockBitMap TextureLookup)
        {
            float VoxelSizeX = PatternImage.Width / (Voxels.GetLength(0));
            float VoxelSizeY = PatternImage.Height / (Voxels.GetLength(1));

            int ISX = TextureLookup.Width / 16;
            int ISY = TextureLookup.Height / 16;

            Vector2[] Position = new Vector2[]
            {
                new Vector2(0, 0),
                new Vector2(VoxelSizeX, 0),
                new Vector2(0, VoxelSizeY),
                new Vector2(VoxelSizeX, VoxelSizeY),
                new Vector2(VoxelSizeX / 2, 0),
                new Vector2(0, VoxelSizeY / 2),
                new Vector2(VoxelSizeX, VoxelSizeY / 2),
                new Vector2(VoxelSizeX / 2, VoxelSizeY),
                new Vector2(VoxelSizeX / 2, VoxelSizeY / 2)
            };

            PatternImage.Clear();

            List <int[, ]> SplitVoxelFields = VoxelUtil.SplitVoxels(Voxels, 239);

            Vector2 Scale = new Vector2(1.0f / VoxelSizeX, 1.0f / VoxelSizeY);

            for (int index = 0; index < SplitVoxelFields.Count; index++)
            {
                int[,] VoxelField = SplitVoxelFields[index];

                for (int i = 0; i < VoxelField.GetLength(0) - 1; i++)
                {
                    for (int j = 0; j < VoxelField.GetLength(1) - 1; j++)
                    {
                        int Val = 0;
                        Val += VoxelField[i, j] != 0 ? 1 : 0;
                        Val += VoxelField[i + 1, j] != 0 ? 2 : 0;
                        Val += VoxelField[i, j + 1] != 0 ? 4 : 0;
                        Val += VoxelField[i + 1, j + 1] != 0 ? 8 : 0;

                        //int Material = MathUtil.CalculateMost(new int[] { VoxelField[i, j], VoxelField[i + 1, j], VoxelField[i, j + 1], VoxelField[i + 1, j + 1] });

                        Vector2 VoxelPosition = new Vector2(i * VoxelSizeX, j * VoxelSizeY);


                        for (int k = 0; k < MarchingSquaresIndices[Val].Length; k += 3)
                        {
                            Vector2 P1 = Position[MarchingSquaresIndices[Val][k]] + VoxelPosition;
                            Vector2 P2 = Position[MarchingSquaresIndices[Val][k + 1]] + VoxelPosition;
                            Vector2 P3 = Position[MarchingSquaresIndices[Val][k + 2]] + VoxelPosition;

                            int Material = VoxelUtil.GetClosestMaterialVertex(P1, P2, P3, Scale, VoxelField);

                            int MX = (Material / 16);
                            int MY = (Material % 16);

                            FillTriangle(VoxelSizeX, VoxelSizeY, ISX, ISY, MX, MY, ScaleX, ScaleY, P1, P2, P3, PatternImage, TextureLookup);
                        }
                    }
                }
            }
        }