void Start() { int tick = ConvertDateTimeInt(DateTime.Now); VoxelStruct vs = null; TaskList tl = new TaskList(); TaskManager.PushFront(tl, delegate { this.initMesh(); Debug.Log(DateTime.Now.Second); }); tl.push(readFileTask()); //tl.push (joinItTask()); //tl.push (arrangeTask ()); /*tl.push (new TaskPack(delegate { * return _director.task(vs2.datas.ToArray()); * } )); * /* * tl.push (createTask ()); * VoxelMeshBuild vmb = new VoxelMeshBuild (); * //vmb.build(product_); * tl.push (new TaskPack(delegate {return vmb.task(product_);})); * tl.push (subTask ()); * tl.push (geoemtryTask ()); */ TaskManager.PushBack(tl, delegate { print("all", ConvertDateTimeInt(DateTime.Now) - tick); Debug.Log(DateTime.Now.Second); }); TaskManager.Run(tl); }
// Use this for initialization void Start() { //读入文件数据 Stream sw = new MemoryStream(_file.bytes); System.IO.BinaryReader br = new System.IO.BinaryReader(sw); //从文件中解析MagicaVoxel文件,并转化成通用格式 MagicaVoxel magica = MagicaVoxelFormater.ReadFromBinary(br); VoxelStruct vs = magica.vs; //拿出体素数据 VoxelData[] datas = vs.datas.ToArray(); //创建体素“产品” VoxelProduct product = new VoxelProduct(); //将数据写入产品 (new VoxelData2Point(datas)).build(product); //切成8x8x8立方体,为了等下减面的时间可控,如果不切割的话,对于大模型减面时间太长 (new VoxelSplitSmall(new VectorInt3(8, 8, 8))).build(product); //构造模型 (new VoxelMeshBuild()).build(product); //减去重复的顶点 (new VoxelRemoveSameVertices()).build(product); //减去重复的面 (new VoxelRemoveFace()).build(product); //减去重复的顶点(在减面过程中出现的重复顶点) (new VoxelRemoveSameVertices()).build(product); //得到模型数据 VoxelMeshData data = product.getMeshData(); //以上是通过体素生成模型数据的代码,如果有别的算法生成,可以直接走下面代码 //通过模型数据生成Mesh 和 MeshFilter。 Mesh mesh = VoxelBuilder.Data2Mesh(data); MeshFilter filter = VoxelBuilder.Mesh2Filter(mesh); //别忘了加上材质。 VoxelBuilder.FilterAddRenderer(filter, _material); //设置模型的坐标和名称等。 filter.transform.SetParent(this.transform); filter.transform.localEulerAngles = Vector3.zero; filter.transform.localPosition = data.offset; filter.name = "Voxel"; }
public void SplitVoxelTest() { VectorInt3 a = new VectorInt3(3, 4, 5); VectorInt3 b = new VectorInt3(1, 2, 3); Assert.AreEqual(a - b, new VectorInt3(2, 2, 2)); FileStream sr2 = new FileStream(".//Assets//Voxel//grass.bytes", FileMode.OpenOrCreate, FileAccess.Read); System.IO.BinaryReader br2 = new System.IO.BinaryReader(sr2); VoxelStruct vs = VoxelFormater.ReadFromMagicaVoxel(br2); SplitVoxel split = new SplitVoxel(vs); split.addBox(new VectorInt3(0, 0, 0), new VectorInt3(16, 16, 3)); split.addBox(new VectorInt3(0, 17, 0), new VectorInt3(16, 16, 3)); split.addBox(new VectorInt3(0, 34, 0), new VectorInt3(16, 16, 3)); split.addBox(new VectorInt3(0, 54, 0), new VectorInt3(16, 16, 3)); split.addBox(new VectorInt3(20, 0, 0), new VectorInt3(16, 16, 3)); split.addBox(new VectorInt3(20, 17, 0), new VectorInt3(16, 16, 3)); split.addBox(new VectorInt3(20, 34, 0), new VectorInt3(16, 16, 3)); split.addBox(new VectorInt3(20, 54, 0), new VectorInt3(16, 16, 3)); split.addBox(new VectorInt3(37, 0, 0), new VectorInt3(16, 16, 3)); split.addBox(new VectorInt3(37, 17, 0), new VectorInt3(16, 16, 3)); split.addBox(new VectorInt3(37, 34, 0), new VectorInt3(16, 16, 3)); split.addBox(new VectorInt3(37, 54, 0), new VectorInt3(16, 16, 3)); split.addBox(new VectorInt3(54, 0, 0), new VectorInt3(16, 16, 3)); split.addBox(new VectorInt3(54, 17, 0), new VectorInt3(16, 16, 3)); split.addBox(new VectorInt3(54, 34, 0), new VectorInt3(16, 16, 3)); split.addBox(new VectorInt3(54, 54, 0), new VectorInt3(16, 16, 3)); /**/ VoxelStruct[] voxels = split.doIt(); for (int i = 0; i < voxels.Length; ++i) { FileStream sw = new FileStream("cool" + i + ".vox", FileMode.Create, FileAccess.Write); System.IO.BinaryWriter bw = new System.IO.BinaryWriter(sw); //voxels [i].normal ; VoxelFormater.WriteToMagicaVoxel(voxels[i], bw); sw.Close(); } //VoxelStruct vs2 = splice.spliceAll (); } [Test] public void JoinVoxelTest() { return; /* * FileStream sr2 = new FileStream ("fly2.vox", FileMode.OpenOrCreate, FileAccess.Read); * * * System.IO.BinaryReader br2 = new System.IO.BinaryReader (sr2); * * VoxelStruct vs = VoxelFormater.ReadFromMagicaVoxel (br2); * * sr2.Close (); * JoinVoxel join = new JoinVoxel (); * join.addVoxel(vs, new VectorInt3(0, 0, 0)); * join.addVoxel(vs, new VectorInt3(10, 10, 10)); * VoxelStruct vs2 = join.doIt (); * * FileStream sw = new FileStream ("fly3.vox", FileMode.Create, FileAccess.Write); * * System.IO.BinaryWriter bw = new System.IO.BinaryWriter (sw); * VoxelFormater.WriteToMagicaVoxel (vs2, bw); * sw.Close (); * /* * * Assert.AreEqual(vs.main.name, vs2.main.name); * Assert.AreEqual(vs.main.size, vs2.main.size); * Assert.AreEqual(vs.main.chunks, vs2.main.chunks); * * * Assert.AreEqual(vs.size.box, vs2.size.box); * Assert.AreEqual(vs.size.name, vs2.size.name); * Assert.AreEqual(vs.size.size, vs2.size.size); * Assert.AreEqual(vs.size.chunks, vs2.size.chunks); */ //Assert.AreEqual(vs.rgba.palette.Length, vs2.rgba.palette.Length); /*for (int i = 0; i < vs.rgba.palette.Length; ++i) { * Assert.AreEqual(vs.rgba.palette[i], vs2.rgba.palette[i]); * }*/ /*// Debug.Log (vs2.rgba.palette.Length); * Assert.AreEqual(vs.rgba.name, vs2.rgba.name); * Assert.AreEqual(vs.rgba.size, vs2.rgba.size); * Assert.AreEqual(vs.rgba.chunks, vs2.rgba.chunks); */ }
public void VoxelFormaterTest() { //Arrange // var gameObject = new GameObject(); //Act //Try to rename the GameObject // var newGameObjectName = "My game object"; //gameObject.name = newGameObjectName; //VoxelWriter writer = gameObject.GetComponent<VoxelWriter> (); //VoxelFormater formater = gameObject.GetComponent<VoxelFormater> (); FileStream sr = new FileStream(".//Assets//Voxel//chr_cop2.bytes", FileMode.OpenOrCreate, FileAccess.Read); System.IO.BinaryReader br = new System.IO.BinaryReader(sr); VoxelStruct vs = VoxelFormater.ReadFromMagicaVoxel(br); FileStream sw = new FileStream("fly2.vox", FileMode.Create, FileAccess.Write); System.IO.BinaryWriter bw = new System.IO.BinaryWriter(sw); VoxelFormater.WriteToMagicaVoxel(vs, bw); sw.Close(); sr.Close(); FileStream sr2 = new FileStream("fly2.vox", FileMode.OpenOrCreate, FileAccess.Read); System.IO.BinaryReader br2 = new System.IO.BinaryReader(sr2); VoxelStruct vs2 = VoxelFormater.ReadFromMagicaVoxel(br2); Assert.AreEqual(vs.main.name, vs2.main.name); Assert.AreEqual(vs.main.size, vs2.main.size); Assert.AreEqual(vs.main.chunks, vs2.main.chunks); Assert.AreEqual(vs.size.box, vs2.size.box); Assert.AreEqual(vs.size.name, vs2.size.name); Assert.AreEqual(vs.size.size, vs2.size.size); Assert.AreEqual(vs.size.chunks, vs2.size.chunks); Assert.AreEqual(vs.rgba.palette.Length, vs2.rgba.palette.Length); for (int i = 0; i < vs.rgba.palette.Length; ++i) { Assert.AreEqual(vs.rgba.palette[i], vs2.rgba.palette[i]); } // Debug.Log (vs2.rgba.palette.Length); Assert.AreEqual(vs.rgba.name, vs2.rgba.name); Assert.AreEqual(vs.rgba.size, vs2.rgba.size); Assert.AreEqual(vs.rgba.chunks, vs2.rgba.chunks); sr2.Close(); for (int i = 0; i < VoxelFormater.palette_.Length; ++i) { ushort s = VoxelFormater.palette_ [i]; Color c = VoxelFormater.Short2Color(s); ushort s2 = VoxelFormater.Color2Short(c); Color c2 = VoxelFormater.Short2Color(s2); Assert.AreEqual(s, s2); Assert.AreEqual(c, c2); } //Debug.Log (); Assert.AreEqual(vs.datas.Count, vs2.datas.Count); // Debug.Log (vs2.datas.Length); for (int i = 0; i < vs.datas.Count; ++i) { Assert.AreEqual(vs.datas[i].color, vs2.datas[i].color); Assert.AreEqual(vs.datas[i].pos.x, vs2.datas[i].pos.x); Assert.AreEqual(vs.datas[i].pos.y, vs2.datas[i].pos.y); Assert.AreEqual(vs.datas[i].pos.z, vs2.datas[i].pos.z); } Assert.AreEqual(vs.datas.Count, vs.datas.Count); }
public void SplitVoxelTest() { Vector3Int a = new Vector3Int(3, 4, 5); Vector3Int b = new Vector3Int(1, 2, 3); Assert.AreEqual(a - b, new Vector3Int(2, 2, 2)); FileStream sr2 = new FileStream(".//Assets//Voxel//grass.bytes", FileMode.OpenOrCreate, FileAccess.Read); System.IO.BinaryReader br2 = new System.IO.BinaryReader(sr2); VoxelStruct vs = MagicaVoxelFormater.ReadFromBinary(br2).structure; SplitVoxel split = new SplitVoxel(vs); split.addBox(new Vector3Int(0, 0, 0), new Vector3Int(16, 16, 3)); split.addBox(new Vector3Int(0, 17, 0), new Vector3Int(16, 16, 3)); split.addBox(new Vector3Int(0, 34, 0), new Vector3Int(16, 16, 3)); split.addBox(new Vector3Int(0, 54, 0), new Vector3Int(16, 16, 3)); split.addBox(new Vector3Int(20, 0, 0), new Vector3Int(16, 16, 3)); split.addBox(new Vector3Int(20, 17, 0), new Vector3Int(16, 16, 3)); split.addBox(new Vector3Int(20, 34, 0), new Vector3Int(16, 16, 3)); split.addBox(new Vector3Int(20, 54, 0), new Vector3Int(16, 16, 3)); split.addBox(new Vector3Int(37, 0, 0), new Vector3Int(16, 16, 3)); split.addBox(new Vector3Int(37, 17, 0), new Vector3Int(16, 16, 3)); split.addBox(new Vector3Int(37, 34, 0), new Vector3Int(16, 16, 3)); split.addBox(new Vector3Int(37, 54, 0), new Vector3Int(16, 16, 3)); split.addBox(new Vector3Int(54, 0, 0), new Vector3Int(16, 16, 3)); split.addBox(new Vector3Int(54, 17, 0), new Vector3Int(16, 16, 3)); split.addBox(new Vector3Int(54, 34, 0), new Vector3Int(16, 16, 3)); split.addBox(new Vector3Int(54, 54, 0), new Vector3Int(16, 16, 3)); /**/ VoxelStruct[] voxels = split.doIt(); for (int i = 0; i < voxels.Length; ++i) { FileStream sw = new FileStream("cool" + i + ".vox", FileMode.Create, FileAccess.Write); System.IO.BinaryWriter bw = new System.IO.BinaryWriter(sw); //voxels [i].normal ; MagicaVoxelFormater.WriteToBinary(voxels[i], bw); sw.Close(); } //VoxelStruct vs2 = splice.spliceAll (); } [Test] public void JoinVoxelTest() { FileStream sr2 = new FileStream(".//Assets//Voxel//temp.vox", FileMode.OpenOrCreate, FileAccess.Read); System.IO.BinaryReader br2 = new System.IO.BinaryReader(sr2); VoxelStruct vs = MagicaVoxelFormater.ReadFromBinary(br2).structure; Debug.Log(MagicaVoxelFormater.GetMd5(vs)); } [Test] public void VoxelMapMakerTest() /* * VoxelMapMaker vmm = Component.FindObjectOfType<VoxelMapMaker> (); * VoxelStruct map = vmm.building (); * FileStream sw = new FileStream ("map.vox", FileMode.Create, FileAccess.Write); * System.IO.BinaryWriter bw = new System.IO.BinaryWriter (sw); * VoxelFormater.WriteToMagicaVoxel (map, bw); * sw.Close (); * * Debug.Log (vmm);*/ { }