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); }
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(); }
//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(); }
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); } } } } }
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)); } } } }