/// Loads a MagicaVoxel model into the current model. public void LoadMagicaModel(string magicaVoxelFile, bool retainVoxels, VoxelFactory.ColliderType colliderType, MagicaFlags flags) { Clear(); this.colliderType = colliderType; PointQuadList opaqueFaces = new PointQuadList(); PointQuadList transparentFaces = new PointQuadList(); IntPtr model = OpenBoxNative.MagicaLoadModel(magicaVoxelFile, flags); OpenBoxNative.MagicaExtractFaces(model, ref opaqueFaces, ref transparentFaces); if (retainVoxels || colliderType != VoxelFactory.ColliderType.None) { // Copy voxels over to the C# side voxels = new VoxelSet <Color32>(OpenBoxNative.MagicaModelSize(model)); OpenBoxNative.MagicaCopyVoxels(voxels.Pin(), model); voxels.Unpin(); // TODO: Calculate colliders natively UpdateColliders(); } OpenBoxNative.MagicaFreeModel(model); MakeMeshFromQuadLists(opaqueFaces, transparentFaces); OpenBoxNative.FreeFacesHandle(opaqueFaces.handle); OpenBoxNative.FreeFacesHandle(transparentFaces.handle); }
public static void MakeMeshNative(string magicaVoxelFile, out Mesh mesh, out Material[] materials) { PointQuadList opaqueFaces = new PointQuadList(); PointQuadList transparentFaces = new PointQuadList(); IntPtr model = obx_MagicaLoadModel(magicaVoxelFile); obx_MagicaExtractFaces(model, ref opaqueFaces, ref transparentFaces); obx_MagicaFreeModel(model); MakeMeshFromQuadLists(opaqueFaces, transparentFaces, out mesh, out materials); obx_FreeFacesHandle(opaqueFaces.handle); obx_FreeFacesHandle(transparentFaces.handle); }
// Makes a mesh from the given voxel set. public static void MakeMeshNative(VoxelSet <Vec4b> voxels, out Mesh mesh, out Material[] materials) { PointQuadList opaqueFaces = new PointQuadList(); PointQuadList transparentFaces = new PointQuadList(); IntPtr voxelsPtr = voxels.Pin(); obx_ExtractFaces(voxelsPtr, voxels.Size, ref opaqueFaces, ref transparentFaces); voxels.Unpin(); MakeMeshFromQuadLists(opaqueFaces, transparentFaces, out mesh, out materials); obx_FreeFacesHandle(opaqueFaces.handle); obx_FreeFacesHandle(transparentFaces.handle); }
/// Turns the current voxel set into a mesh, replacing any currently attached mesh. public void UpdateMesh() { MeshFilter mf = GetComponent <MeshFilter>(); // TODO: Remove old mesh? PointQuadList opaqueFaces = new PointQuadList(); PointQuadList transparentFaces = new PointQuadList(); IntPtr voxelsPtr = voxels.Pin(); OpenBoxNative.ExtractFaces(voxelsPtr, voxels.Size, ref opaqueFaces, ref transparentFaces); voxels.Unpin(); MakeMeshFromQuadLists(opaqueFaces, transparentFaces); OpenBoxNative.FreeFacesHandle(opaqueFaces.handle); OpenBoxNative.FreeFacesHandle(transparentFaces.handle); }
void MakeMeshFromQuadLists(PointQuadList opaqueFaces, PointQuadList transparentFaces) { Mesh mesh = new Mesh(); mesh.indexFormat = UnityEngine.Rendering.IndexFormat.UInt32; int subMeshCount = AddMeshGeometry(new PointQuadList[] { opaqueFaces, transparentFaces }, mesh); mesh.subMeshCount = subMeshCount; Material[] materials = new Material[subMeshCount]; int submeshIdx = 0; int nextPointIdx = 0; // Opaque quads if (opaqueFaces.count > 0) { AddMeshIndices(opaqueFaces.count, mesh, nextPointIdx, submeshIdx); materials[submeshIdx] = new Material(Shader.Find("Voxel/PointQuads")); nextPointIdx += opaqueFaces.count; submeshIdx++; } // Transparent quads if (transparentFaces.count > 0) { AddMeshIndices(transparentFaces.count, mesh, nextPointIdx, submeshIdx); materials[submeshIdx] = new Material(Shader.Find("Voxel/PointQuadsTransparent")); nextPointIdx += transparentFaces.count; submeshIdx++; } GetComponent <MeshRenderer>().sharedMaterials = materials; GetComponent <MeshFilter>().sharedMesh = mesh; }
static extern unsafe IntPtr obx_MagicaExtractFaces(IntPtr model, ref PointQuadList opaqueFaces, ref PointQuadList transparentFaces);
static extern unsafe void obx_ExtractFaces(IntPtr colors, Vec3i size, ref PointQuadList opaqueFaces, ref PointQuadList transparentFaces);