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(); } } }