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; } } }
void AddVertex(Vector3 node, Vector2 uv) { _vertices.Add(node + _origin.ToFloat()); _uvs.Add(uv); _colors.Add(Color.green); }
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(); } } }
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; } } } } } }