private void CreateVoxelizedMesh()
    {
        selectedObject = (Selection.activeObject != null) ? (GameObject)Selection.activeObject : null;

        Mesh       mesh;
        MeshFilter meshFilter = selectedObject.GetComponent <MeshFilter>();

        if (meshFilter != null)
        {
            mesh = meshFilter.sharedMesh;
        }
        else
        {
            mesh = selectedObject.GetComponent <SkinnedMeshRenderer>().sharedMesh;
        }

        List <Voxel_t> voxels;

        CPUVoxelizer.Voxelize(
            mesh,       // a target mesh
            resolution, // # of voxels for largest AABB bounds
            out voxels,
            out float unit
            );

        // build voxel cubes integrated mesh
        GameObject parent = new GameObject("Voxelized");

        parent.AddComponent <MeshRenderer>();
        parent.GetComponent <MeshFilter>().sharedMesh = VoxelMesh.Build(voxels.ToArray(), unit, useUv);
    }
    private void CreateVoxelizedMultibody()
    {
        selectedObject = (Selection.activeObject != null) ? (GameObject)Selection.activeObject : null;

        Mesh       mesh;
        MeshFilter meshFilter = selectedObject.GetComponent <MeshFilter>();

        if (meshFilter != null)
        {
            mesh = meshFilter.sharedMesh;
        }
        else
        {
            mesh = selectedObject.GetComponent <SkinnedMeshRenderer>().sharedMesh;
        }

        List <Voxel_t> voxels;

        CPUVoxelizer.Voxelize(
            mesh,           // a target mesh
            resolution,     // # of voxels for largest AABB bounds
            out voxels,
            out float unit
            );

        // build gameobject with individual, colliding voxel cube objects
        Material   material = selectedObject.GetComponent <MeshRenderer>().sharedMaterial;
        GameObject go       = VoxelMesh.BuildObject(voxels.ToArray(), unit, material, folderName, useUv);

        go.GetComponent <MeshRenderer>().material = material;
    }
        Mesh Voxelize(Mesh source)
        {
            List <Voxel_t> voxels;
            float          size;

            CPUVoxelizer.Voxelize(source, resolution, out voxels, out size, surfaceOnly);
            return(VoxelMesh.Build(voxels.ToArray(), size));
        }
Beispiel #4
0
 void Start()
 {
     voxels = CPUVoxelizer.Voxelize(mesh, count);
     voxels.ForEach(voxel => {
         var cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
         cube.transform.parent        = transform;
         cube.transform.localPosition = voxel.position;
         cube.transform.localScale    = voxel.size * Vector3.one;
         cube.transform.localRotation = Quaternion.identity;
     });
 }
Beispiel #5
0
        void Start()
        {
            List <Voxel_t> voxels;
            float          unit;

            CPUVoxelizer.Voxelize(mesh, resolution, out voxels, out unit);

            var filter = GetComponent <MeshFilter>();

            filter.sharedMesh = VoxelMesh.Build(voxels.ToArray(), unit, useUV);
        }
Beispiel #6
0
 public void Generate()
 {
     Clear();
     Setup(transform);
     if (Resolution == 0)
     {
         return;
     }
     if (Combine)
     {
         List <Voxel_t> voxels;
         float          unit;
         CPUVoxelizer.Voxelize(ComputeMesh(), Resolution, out voxels, out unit);
         List <BoxCollider> colliders = new List <BoxCollider>();
         for (int i = 0; i < voxels.Count; i++)
         {
             BoxCollider c = GetColliders().gameObject.AddComponent <BoxCollider>();
             c.center = voxels[i].position;
             c.size   = new Vector3(unit, unit, unit);
             colliders.Add(c);
         }
         if (Optimise)
         {
             FilterVoxels(colliders, Axis.XPositive);
             FilterVoxels(colliders, Axis.YPositive);
             FilterVoxels(colliders, Axis.ZPositive);
         }
     }
     else
     {
         foreach (MeshFilter filter in GetComponentsInChildren <MeshFilter>())
         {
             Matrix4x4      delta = filter.transform.parent == null ? Matrix4x4.identity : filter.transform.parent.GetWorldMatrix().GetRelativeTransformationTo(transform.GetWorldMatrix());
             List <Voxel_t> voxels;
             float          unit;
             CPUVoxelizer.Voxelize(filter.sharedMesh, Resolution, out voxels, out unit);
             List <BoxCollider> colliders = new List <BoxCollider>();
             for (int i = 0; i < voxels.Count; i++)
             {
                 BoxCollider c = GetColliders().gameObject.AddComponent <BoxCollider>();
                 c.center = voxels[i].position.GetRelativePositionFrom(delta);
                 c.size   = new Vector3(unit, unit, unit);
                 colliders.Add(c);
             }
             if (Optimise)
             {
                 FilterVoxels(colliders, Axis.XPositive);
                 FilterVoxels(colliders, Axis.YPositive);
                 FilterVoxels(colliders, Axis.ZPositive);
             }
         }
     }
     CalculateBounds();
 }
        void Start()
        {
            Measure(() => {
                List <Voxel_t> voxels;
                float unit;
                CPUVoxelizer.Voxelize(source, resolution, out voxels, out unit);
            }, iterations);

            Measure(() => {
                var data = GPUVoxelizer.Voxelize(voxelizer, source, resolution);
                data.Dispose();
            }, iterations);
        }
Beispiel #8
0
    public void VoxelizeHull()
    {
        Mesh mesh = _Hull.sharedMesh;

        // Apply transform to the hull mesh
        Matrix4x4 mat = this.transform.worldToLocalMatrix * _Hull.gameObject.transform.localToWorldMatrix;

        Vector3[] transformedVertices = mesh.vertices;
        for (int i = 0; i < transformedVertices.Length; i++)
        {
            transformedVertices[i] = mat.MultiplyPoint3x4(transformedVertices[i]);
        }

        Mesh transformedMesh = new Mesh();

        transformedMesh.vertices  = transformedVertices;
        transformedMesh.triangles = mesh.triangles;
        transformedMesh.normals   = mesh.normals;

        // Voxelize the mesh
        List <Voxel_t> voxels;

        CPUVoxelizer.Voxelize(transformedMesh, _VoxelResolution, out voxels, out float voxelSize);
        SymmetrizeVoxels(voxels);

        // Save voxels to samples
        Vector3 sampleCenter = Vector3.zero;

        _samplePositions.Clear();
        foreach (Voxel_t voxel in voxels)
        {
            _samplePositions.Add(voxel.position);
            sampleCenter += voxel.position;
        }

        // Save sample radius and center
        _sampleRadius = voxelSize * _SampleSizeMultiplier * 2.4f;

        sampleCenter           /= _samplePositions.Count;
        _Rigidbody.centerOfMass = transform.worldToLocalMatrix.MultiplyPoint3x4(sampleCenter);

        // Calculate average length along axis
        transformedMesh.RecalculateBounds();
        Vector3 size = transformedMesh.bounds.size;

        _AverageWidth = (size.x + size.y + size.z) / 3f;
    }
 public void Generate()
 {
     Clear();
     Setup(transform);
     if (Resolution == 0)
     {
         return;
     }
     if (Combine)
     {
         List <Voxel_t> voxels;
         float          unit;
         CPUVoxelizer.Voxelize(ComputeMesh(), Resolution, out voxels, out unit);
         List <BoxCollider> colliders = new List <BoxCollider>();
         for (int i = 0; i < voxels.Count; i++)
         {
             BoxCollider c = GetContainer().gameObject.AddComponent <BoxCollider>();
             c.center = voxels[i].position;
             c.size   = new Vector3(unit, unit, unit);
             colliders.Add(c);
         }
         if (Optimise)
         {
             FilterVoxels(colliders, Axis.XPositive);
             FilterVoxels(colliders, Axis.YPositive);
             FilterVoxels(colliders, Axis.ZPositive);
         }
     }
     else
     {
         foreach (MeshFilter filter in GetComponentsInChildren <MeshFilter>())
         {
             List <Voxel_t> voxels;
             float          unit;
             CPUVoxelizer.Voxelize(filter.sharedMesh, Resolution, out voxels, out unit);
             List <BoxCollider> colliders = new List <BoxCollider>();
             for (int i = 0; i < voxels.Count; i++)
             {
                 BoxCollider c = GetContainer().gameObject.AddComponent <BoxCollider>();
                 c.center = (transform.worldToLocalMatrix * filter.transform.localToWorldMatrix).MultiplyPoint3x4(voxels[i].position);
                 c.size   = new Vector3(unit, unit, unit);
                 colliders.Add(c);
             }
             if (Optimise)
             {
                 FilterVoxels(colliders, Axis.XPositive);
                 FilterVoxels(colliders, Axis.YPositive);
                 FilterVoxels(colliders, Axis.ZPositive);
             }
         }
     }
     {
         BoundsMin = Vector3.zero;
         BoundsMax = Vector3.zero;
         BoxCollider[] colliders = GetColliders();
         foreach (BoxCollider c in colliders)
         {
             BoundsMin = Vector3.Min(BoundsMin, c.center - 0.5f * c.size);
             BoundsMax = Vector3.Max(BoundsMax, c.center + 0.5f * c.size);
         }
     }
 }