diff --git a/package-lock.json b/package-lock.json index 8c5e888..4bb79f3 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,6 +10,7 @@ "babel-loader": "^8.2.2", "css-loader": "^5.1.3", "gh-pages": "^3.1.0", + "immutability-helper": "^3.1.1", "mini-css-extract-plugin": "^1.4.0", "postcss": "^8.2.9", "postcss-loader": "^5.2.0", @@ -3633,6 +3634,12 @@ "postcss": "^8.1.0" } }, + "node_modules/immutability-helper": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/immutability-helper/-/immutability-helper-3.1.1.tgz", + "integrity": "sha512-Q0QaXjPjwIju/28TsugCHNEASwoCcJSyJV3uO1sOIQGI0jKgm9f41Lvz0DZj3n46cNCyAZTsEYoY4C2bVRUzyQ==", + "dev": true + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -11406,6 +11413,12 @@ "dev": true, "requires": {} }, + "immutability-helper": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/immutability-helper/-/immutability-helper-3.1.1.tgz", + "integrity": "sha512-Q0QaXjPjwIju/28TsugCHNEASwoCcJSyJV3uO1sOIQGI0jKgm9f41Lvz0DZj3n46cNCyAZTsEYoY4C2bVRUzyQ==", + "dev": true + }, "import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", diff --git a/package.json b/package.json index 242f612..e85352f 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "babel-loader": "^8.2.2", "css-loader": "^5.1.3", "gh-pages": "^3.1.0", + "immutability-helper": "^3.1.1", "mini-css-extract-plugin": "^1.4.0", "postcss": "^8.2.9", "postcss-loader": "^5.2.0", diff --git a/src/app.jsx b/src/app.jsx index 24de728..b76b1f2 100644 --- a/src/app.jsx +++ b/src/app.jsx @@ -5,8 +5,7 @@ import './app.css' import { Provider, useDispatch, useSelector } from 'react-redux' import { FaCube, FaEdit } from 'react-icons/fa' -import { MdEdit, MdDone, MdVisibilityOff, MdVisibility } from 'react-icons/md' -import { RiShape2Fill } from 'react-icons/ri' +import { MdEdit, MdDone, MdVisibilityOff, MdVisibility, MdDelete } from 'react-icons/md' import * as Icon from "./icons"; import { color } from './utils/shared' @@ -22,16 +21,11 @@ export const Root = ({ store }) => ( const App = () => { const dispatch = useDispatch() const treeEntries = useSelector(state => state.treeEntries) - const activeSketchNid = useSelector(state => state.activeSketchNid) - - // const [state, setState] = useState('x') - // useEffect(()=>{ - // console.log('hereeee') - // },[state]) + const activeSketchId = useSelector(state => state.activeSketchId) useEffect(() => { - if (!activeSketchNid) { + if (!activeSketchId) { sc.canvas.addEventListener('pointermove', sc.onHover) sc.canvas.addEventListener('pointerdown', sc.onPick) return () => { @@ -39,27 +33,38 @@ const App = () => { sc.canvas.removeEventListener('pointerdown', sc.onPick) } } - }, [activeSketchNid]) + }, [activeSketchId]) const btnz = [ - activeSketchNid ? + activeSketchId ? [MdDone, () => { - treeEntries.byNid[activeSketchNid].deactivate() + treeEntries.byId[activeSketchId].deactivate() sc.activeSketch = null // sc.activeDim = this.activeSketch.obj3d.children[1].children }, 'Finish'] : [FaEdit, sc.addSketch, 'Sketch'] , - [FaCube, () => sc.extrude(treeEntries.byNid[activeSketchNid]), 'Extrude'], - [Icon.Union, () => sc.extrude(treeEntries.byNid[activeSketchNid]), 'Union'], - [Icon.Subtract, subtract, 'Subtract'], - [Icon.Intersect, () => sc.extrude(treeEntries.byNid[activeSketchNid]), 'Intersect'], - [Icon.Dimension, () => sc.extrude(treeEntries.byNid[activeSketchNid]), 'Dimension'], - [Icon.Line, () => sc.extrude(treeEntries.byNid[activeSketchNid]), 'Line'], - [Icon.Arc, () => sc.extrude(treeEntries.byNid[activeSketchNid]), 'Arc'], + [FaCube, () => sc.extrude(treeEntries.byId[activeSketchId]), 'Extrude'], + [Icon.Union, () => sc.extrude(treeEntries.byId[activeSketchId]), 'Union'], + [Icon.Subtract, ()=> { + if (sc.selected.length != 2 || !sc.selected.every(e => e.userData.type == 'mesh')) return + // console.log('here') + const [m1, m2] = sc.selected + const mesh = subtract(m1,m2) + + dispatch({ type: 'rx-extrusion', mesh, deps:[m1.name,m2.name] }) + sc.render() + forceUpdate() + }, 'Subtract'], + [Icon.Intersect, () => sc.extrude(treeEntries.byId[activeSketchId]), 'Intersect'], + [Icon.Dimension, () => sc.extrude(treeEntries.byId[activeSketchId]), 'Dimension'], + [Icon.Line, () => sc.extrude(treeEntries.byId[activeSketchId]), 'Line'], + [Icon.Arc, () => sc.extrude(treeEntries.byId[activeSketchId]), 'Arc'], ] + const [_, forceUpdate] = useReducer(x => x + 1, 0); + return