Пример #1
0
    /// 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);
    }
Пример #2
0
    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);
    }
Пример #3
0
    // 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);
    }
Пример #4
0
    /// 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);
    }
Пример #5
0
    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;
    }
Пример #6
0
 static extern unsafe IntPtr obx_MagicaExtractFaces(IntPtr model, ref PointQuadList opaqueFaces, ref PointQuadList transparentFaces);
Пример #7
0
 static extern unsafe void obx_ExtractFaces(IntPtr colors, Vec3i size, ref PointQuadList opaqueFaces, ref PointQuadList transparentFaces);