Exemplo n.º 1
0
 public PatternModel(int IX, int IY, LockBitMap Texture)
 {
     TextureLookup = Texture;
     PatternImage  = new LockBitMap(new Bitmap(IX, IY));
     VX            = 10;
     VY            = 10;
     UpdateSize(0, 0, 16);
 }
Exemplo n.º 2
0
 public PatternModel(String Name, int IX, int IY, int[,] ImportVoxels, LockBitMap Texture)
 {
     SaveName      = Name;
     TextureLookup = Texture;
     PatternImage  = new LockBitMap(new Bitmap(IX, IY));
     Voxels        = ImportVoxels;
     VX            = Voxels.GetLength(0);
     VY            = Voxels.GetLength(1);
     UpdateGeometry();
 }
Exemplo n.º 3
0
        //Unlocks Image After Refresh
        public void RefreshImage(string TextureName, LockBitMap Image)
        {
            if (!Image.IsLocked)
            {
                Image.LockBits();
            }

            if (Textures.ContainsKey(TextureName))
            {
                Textures[TextureName].SetData(Image.Pixels);
            }
            else
            {
                Texture2D NewTexture = new Texture2D(Graphics, Image.Width, Image.Height);
                NewTexture.SetData(Image.Pixels);
                Textures.Add(TextureName, NewTexture);
            }
            Image.UnlockBits();
        }
Exemplo n.º 4
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);
                        }
                    }
                }
            }
        }
Exemplo n.º 5
0
        private static void FillTriangle(float VoxelSizeX, float VoxelSizeY, int ISX, int ISY, int MX, int MY, float ScaleX, float ScaleY, Vector2 P1, Vector2 P2, Vector2 P3, LockBitMap ShadeMap, LockBitMap TextureLookup)
        {
            int MaxX = (int)Math.Max(P1.X, Math.Max(P2.X, P3.X));
            int MaxY = (int)Math.Max(P1.Y, Math.Max(P2.Y, P3.Y));
            int MinX = (int)Math.Min(P1.X, Math.Min(P2.X, P3.X));
            int MinY = (int)Math.Min(P1.Y, Math.Min(P2.Y, P3.Y));

            Vector2 Pos = new Vector2();

            for (int i = MinX; i <= MaxX; i++)
            {
                for (int j = MinY; j <= MaxY; j++)
                {
                    Pos.X = i;
                    Pos.Y = j;

                    int TX = (int)((i % VoxelSizeX) / VoxelSizeX * ISX);
                    int TY = (int)((j % VoxelSizeY) / VoxelSizeY * ISY);

                    if (CollisionUtil.InsideTriangle(Pos, P1, P2, P3))
                    {
                        ShadeMap.SetPixel(i, j, TextureLookup.GetPixel(TX + MX * ISX, TY + ISY * MY));
                    }
                }
            }
        }