예제 #1
0
 private void GenNearestVoxelPointForEdgePointTable()
 {
     for (int caseValue = 0; caseValue < 256; caseValue++)
     {
         for (int edge = 0; edge < 12; edge++)
         {
             Vector3 edgePosition = Edge2Position(edge, 0, 0, 0);
             int     minVoxel     = -1;
             float   minDistance  = 1000;
             for (int voxel = 0; voxel < 8; voxel++)
             {
                 int keyvalue = 1 << voxel;
                 if ((caseValue & keyvalue) > 0)
                 {
                     IntVector3 voxelPosition = VoxelPointPosition(voxel);
                     float      dist          = (voxelPosition.ToFloat() - edgePosition).sqrMagnitude;
                     if (dist < minDistance)
                     {
                         minDistance = dist;
                         minVoxel    = voxel;
                     }
                 }
             }
             _nearestVoxelPointForEdgePointTable[caseValue, edge] = minVoxel;
         }
     }
 }
예제 #2
0
 void AddVertex(Vector3 node, Vector2 uv)
 {
     _vertices.Add(node + _origin.ToFloat());
     _uvs.Add(uv);
     _colors.Add(Color.green);
 }
예제 #3
0
    void MouseBrush()
    {
        go_extruder.SetActive(_editorState.GetEditMode() == EditorState.EditMode.EXTRUDE);

        RaycastHit hit;
        int        layerMask = 1 << LayerMask.NameToLayer("PolyObjectSelected");
        bool       mouseHit  = Physics.Raycast(Camera.main.ScreenPointToRay(Input.mousePosition), out hit, Mathf.Infinity, layerMask);

        _currentShapeGo.SetActive(mouseHit);

        if (!mouseHit)
        {
            return;
        }

        MeshCollider meshCollider = hit.collider as MeshCollider;

        if (meshCollider == null || meshCollider.sharedMesh == null)
        {
            return;
        }


        Mesh mesh = meshCollider.sharedMesh;

        Vector3[] vertices     = mesh.vertices;
        int[]     triangles    = mesh.triangles;
        Vector3   p0           = vertices[triangles[hit.triangleIndex * 3 + 0]];
        Vector3   p1           = vertices[triangles[hit.triangleIndex * 3 + 1]];
        Vector3   p2           = vertices[triangles[hit.triangleIndex * 3 + 2]];
        Transform hitTransform = hit.collider.transform;

        p0 = hitTransform.TransformPoint(p0);
        p1 = hitTransform.TransformPoint(p1);
        p2 = hitTransform.TransformPoint(p2);
        Debug.DrawLine(p0, p1);
        Debug.DrawLine(p1, p2);
        Debug.DrawLine(p2, p0);
        Debug.DrawRay(hit.point, hit.normal * 10f);


        Vector3 localPoint  = transform.InverseTransformPoint(hit.point);
        Vector3 localNormal = transform.InverseTransformDirection(hit.normal);

        HelpSetColidderPosition(localPoint, localNormal);

        IntVector3 centerVoxel = IntVector3.FromFloat(localPoint);
        int        len         = (int)Mathf.Ceil(Mathf.Sqrt(_brushWidth * _brushWidth + _brushHeight * _brushHeight) * 0.5f);
//		Debug.Log ("len" + len.ToString () + centerVoxel.ToString());
        Collider cld = _brushShape == BrushShape.Cube ? cld_cube :
                       _brushShape == BrushShape.Cylinder ? cld_cylinder : cld_sphere;
        var outside = Camera.main.transform.position;         //new Vector3 (300, 300, 300);

        if (_editorState.GetEditMode() == EditorState.EditMode.BRUSH)
        {
            if (Input.GetMouseButtonDown(0) || Input.GetMouseButton(0))
            {
                for (int x = -len; x <= len; x++)
                {
                    for (int y = -len; y <= len; y++)
                    {
                        for (int z = -len; z <= len; z++)
                        {
                            Vector3 underTestPoint = transform.TransformPoint(centerVoxel.ToFloat() + new Vector3(x, y, z));

                            if (Doge.IsColliderContainPoint(outside, underTestPoint, cld))
                            {
                                var key = new IntVector3(centerVoxel.x + x, centerVoxel.y + y, centerVoxel.z + z);
                                if (_brushVoxelPoolBefore.ContainsKey(key))
                                {
                                    _brushVoxelPoolBefore.Remove(key);
                                }
                                _brushVoxelPoolAfter.Add(key, 0);

                                /*
                                 * if (_editorState.is_add){
                                 *      _targetPolyObject.AddEditSpacePoint (centerVoxel.x + x, centerVoxel.y + y, centerVoxel.z + z);
                                 * } else {
                                 *      _targetPolyObject.DeleteEditSpacePoint (centerVoxel.x + x, centerVoxel.y + y, centerVoxel.z + z);
                                 * }
                                 */
                            }
                        }
                    }
                }

                foreach (var k in _brushVoxelPoolBefore.Keys)
                {
                    _targetPolyObject.ConfigEditSpacePoint(k, _editorState.is_add);
                }

                _brushVoxelPoolBefore.Clear();
                var tmpAfter = _brushVoxelPoolAfter;
                _brushVoxelPoolAfter  = _brushVoxelPoolBefore;
                _brushVoxelPoolBefore = tmpAfter;

                _targetPolyObject.RefreshMesh();
            }

            if (Input.GetMouseButtonUp(0))
            {
                foreach (var k in _brushVoxelPoolBefore.Keys)
                {
                    _targetPolyObject.ConfigEditSpacePoint(k, _editorState.is_add);
                }
                _brushVoxelPoolBefore.Clear();
                _brushVoxelPoolAfter.Clear();
                _targetPolyObject.RefreshMesh();
            }
        }
        else
        {
            // ** extrude **
            if (Input.GetKey("v"))
            {
                if (Input.GetMouseButtonDown(0) || Input.GetMouseButton(0))
                {
                    for (int x = -len; x <= len; x++)
                    {
                        for (int y = -len; y <= len; y++)
                        {
                            for (int z = -len; z <= len; z++)
                            {
                                Vector3 underTestPoint = transform.TransformPoint(centerVoxel.ToFloat() + new Vector3(x, y, z));

                                if (Doge.IsColliderContainPoint(outside, underTestPoint, cld))
                                {
                                    var key = new IntVector3(centerVoxel.x + x, centerVoxel.y + y, centerVoxel.z + z);
                                    if (_targetPolyObject.GetEditSpacePoint(key.x, key.y, key.z) > 0)
                                    {
                                        _extrudeVoxelPool[key] = 1;
                                    }
                                }
                            }
                        }
                    }
                }

                RefreshExtruderPosition();
            }
        }
    }
예제 #4
0
    void GenNearestVoxelPointTable()
    {
        for (int caseValue = 0; caseValue < 256; caseValue++)
        {
            int[,] caseTriangles = _marchingCubes.getCaseTriangles(caseValue);

            int[,] groupTrignales = new int[4, 14];

            for (int i = 0; i < 4; i++)
            {
                groupTrignales[i, 0] = 0;
                groupTrignales[i, 1] = 0;
            }

            int groupNum = 0;

            for (int i = 0; i < caseTriangles.GetLength(0); i++)
            {
                int edgeA = caseTriangles[i, 0];
                int edgeB = caseTriangles[i, 1];
                int edgeC = caseTriangles[i, 2];

                bool newGroup  = true;
                int  group2put = 0;
                for (int j = 0; j < groupNum; j++)
                {
                    for (int k = 0; k < groupTrignales[j, 1]; k++)
                    {
                        int v = groupTrignales[j, k + 2];
                        if (edgeA == v || edgeB == v || edgeC == v)
                        {
                            newGroup  = false;
                            group2put = j;
                            break;
                        }
                    }
                }

                if (newGroup)
                {
                    groupTrignales[groupNum, 1] = 3;
                    groupTrignales[groupNum, 2] = edgeA;
                    groupTrignales[groupNum, 3] = edgeB;
                    groupTrignales[groupNum, 4] = edgeC;
                    groupNum++;
                }
                else
                {
                    {
                        int  value = edgeA;
                        bool toPut = true;
                        for (int j = 0; j < groupTrignales[group2put, 1]; j++)
                        {
                            if (groupTrignales[group2put, j + 2] == value)
                            {
                                toPut = false;
                                break;
                            }
                        }
                        if (toPut)
                        {
                            groupTrignales[group2put, groupTrignales[group2put, 1] + 2] = value;
                            groupTrignales[group2put, 1]++;
                        }
                    }
                    {
                        int  value = edgeB;
                        bool toPut = true;
                        for (int j = 0; j < groupTrignales[group2put, 1]; j++)
                        {
                            if (groupTrignales[group2put, j + 2] == value)
                            {
                                toPut = false;
                                break;
                            }
                        }
                        if (toPut)
                        {
                            groupTrignales[group2put, groupTrignales[group2put, 1] + 2] = value;
                            groupTrignales[group2put, 1]++;
                        }
                    }
                    {
                        int  value = edgeB;
                        bool toPut = true;
                        for (int j = 0; j < groupTrignales[group2put, 1]; j++)
                        {
                            if (groupTrignales[group2put, j + 2] == value)
                            {
                                toPut = false;
                                break;
                            }
                        }
                        if (toPut)
                        {
                            groupTrignales[group2put, groupTrignales[group2put, 1] + 2] = value;
                            groupTrignales[group2put, 1]++;
                        }
                    }
                }
            }


            // calc per group
            for (int i = 0; i < groupNum; i++)
            {
                Vector3 sum = Vector3.zero;
                for (int j = 0; j < groupTrignales[i, 1]; j++)
                {
                    sum += Edge2Position(groupTrignales[i, 2 + j], 0, 0, 0);
                }
                Vector3 center = sum / (groupTrignales[i, 1] * 1f);

                int   caseValueIndex = 1;
                int   minVoxelPoint  = 0;
                float minDistance    = 100000f;
                for (int j = 0; j < 8; j++)
                {
                    caseValueIndex = 1 << j;
                    if ((caseValueIndex & caseValue) > 0)
                    {
                        IntVector3 voxelPosInt = VoxelPointPosition(j);
                        float      distance    = (voxelPosInt.ToFloat() - center).sqrMagnitude;
                        if (distance < minDistance)
                        {
                            minDistance   = distance;
                            minVoxelPoint = j;
                        }
                    }
                }
                groupTrignales[i, 0] = minVoxelPoint;
            }

            for (int i = 0; i < caseTriangles.GetLength(0); i++)
            {
                int edgeA = caseTriangles[i, 0];

                /*
                 * int edgeB = caseTriangles[i,1];
                 * int edgeC = caseTriangles[i,2];
                 *
                 * Vector3 center = ( Edge2Position(edgeA,0,0,0) + Edge2Position(edgeB, 0,0,0) + Edge2Position(edgeC, 0,0,0))/3f;
                 * int caseValueIndex = 1;
                 * int minVoxelPoint = 0;
                 * float minDistance = 100000f;
                 * for (int j = 0; j < 8; j++) {
                 *      caseValueIndex = 1 << j;
                 *      if ((caseValueIndex & caseValue) > 0) {
                 *              IntVector3 voxelPosInt =  VoxelPointPosition(j);
                 *              float distance = (voxelPosInt.ToFloat() - center).sqrMagnitude;
                 *              if (distance < minDistance) {
                 *                      minDistance = distance;
                 *                      minVoxelPoint = j;
                 *              }
                 *      }
                 * }*/

                for (int j = 0; j < groupNum; j++)
                {
                    for (int k = 0; k < groupTrignales[j, 1]; k++)
                    {
                        if (edgeA == groupTrignales[j, 2 + k])
                        {
                            _nearestVoxelPointTable[caseValue, i] = groupTrignales[j, 0];
                            break;
                        }
                    }
                }
            }
        }
    }