From ea32b0cc73130eb91661c291e7367ad2c7041f6e Mon Sep 17 00:00:00 2001 From: howard Date: Wed, 7 Apr 2021 21:05:54 -0700 Subject: [PATCH] add dimension to origin --- dist/solver.wasm | Bin 138893 -> 139393 bytes src/Scene.js | 2 +- src/Sketch.js | 52 ++++++++++++++++++++++++++++++++-------- src/constraintEvents.js | 52 +++++++++++++++++++++++----------------- src/drawEvents.js | 14 +++++++++++ src/drawLine.js | 2 ++ src/extrude.js | 2 +- src/patch.js | 5 +++- src/react/toolTip.jsx | 16 ++++--------- src/shared.js | 4 ++-- src/sketchAxes.js | 4 ++-- wasm/solver.c | 19 ++++++++------- 12 files changed, 112 insertions(+), 60 deletions(-) diff --git a/dist/solver.wasm b/dist/solver.wasm index 01d053cb76df9d8470e2d9cd449ee33d3bf855a3..a4a67f0bbfed73c230ba5b6bc4e031f3117b8f94 100755 GIT binary patch delta 7660 zcmYkBcWhnBb;jSDcIlI(17nctjmX6}@G=MHNu z>b0(D>A!l}&}(3M=7vc!CC%BAzbW4QftwTZpZnu~{P`Py`rC|z+^w{yf9)Tyc@!br z&9vyR>1LYs*LE{!^w)JWC-m2MGe>+bE1#kLnQrDlTJPWg;DDFca?`zhfzB_K$rtfO z`4X88Riv1m7r=FXPMdCf@8~GqNh+^H`OB5Z(-p0e_9g z^rP@W!oXk6jr3_lc)iP_fWODr@l`C+AS1nWWst6A@($jSZ{QmmWOYCntWKXX$eMtE zz?$@Lk{IOOT)9twk-XkzalrTReY}gs8l>FI`wa4anfw4hkRIrvLDmL*2W!)+gT9Y%9wz)!I;t)#gr z;D4|w-COi#esjP_*c`rTGPx4@8O!~wOn#1^=+7_ki!LT3TLONLEs-daUy}G`ne-&V zpI_luN;C!ZM3WNV&&0o5-;pJOJ^X9@x<)EPuF1;(ji9M8l$nb%R_FUOB*`KSC(tE zflhX5v|Wt0JB!^}*^|Yd7;Sez6FsTz*g4q~u#f)q>m5JT@pvkm+mnv&_}*K4tX$IK zmsq?diZzco+;TY2H<)iqO}@FiEYOSv%y?>;u~1VB znQArWUHh&UZZ)!q-cobT%VL8?MwS?`LX`$IDoqbrYPb$n87wuZGCgIP!7}q+$1I)8 zHD`sva)TAjS;?Ss6Q^jxTHZ=1gr=pe@wKJ+kK|H z>@HZm?|WFkyzDjDW3ZQn_Gu3Gu~c*SoRj@AW54-C4j8c10U`(EFc@RykO40(by%ei zv(T70&^UjNM2I8qC?|!%enQ6-Iu`3gm)_?I2_~?g^D9HH#mI5ZKThxj=SU3AAS-qC zD3X%~ls(DJQ%2d-%ARKOi~%prIBRe=_SB_-QwEp9H*H3{jC4!T(k;=`)&uAM(gWvB z9_I_qXpW6_i7TSF! zwtHfNiEMXu$Q?0qjrv8nM)119bt5+ncu|0%s zwjW8Kc7I=+Gt$qZZ{DIGGy2=ybRz?pjRCey23icXGRWqdvNG6WkOf0CC~b!5Z%aO} z_z=a15FctWlq-6)`ggL@Vx@YDvBFBVR;R|I+M>qhfB42x*Ieo<>tYvUZL)6KHp zqMk`kkp?Zi%A&zy6)W4QxvMRBHL}WaimZvbYwX9e)}qd0ExC2EhmLqzZ?T?@Dw3%Q zrm|7_X>F~Vo?u#n>1@>oiw$hm#zLz$YOAKQRhuj}S=szjtF~BdQBN^8TWN|4oO@f_ zrM6jYi~Tnv!3;{xY*U(*U}l0@RN8Kl-%hC=1*sh>HG@(+Ep}Sj^^(+Xi{0ue#x5&+ z+7Ul7=@0<$S_z~X?FgA~ZO-=aenhtyS! zgH{gP+?lK#p$?9)_l{Z|wQ?*j2gfarS+KQiCvDc{uq}B_@e_)lAb!%~q?J<^r{Yw& z6Tt4j6K73VIc+s{n%Efy^3gnNaW=Adxw~83jclo$i|jeF=aq$8%@)lOy~lmt;$B1{ z7b1Frz{QBFb;;sVMDKH{wzwbBPSO(576O;q{|u|<6^kp8eGowRgUFW1)yQ5Ya4m*a z>pB;qh&~LU_hCefh-hm7y{(EC9*AypanJ#t?=E+A4Bus|3nToV zj_~_z8EecC4>b27Wmu{95#AbeTRFlXv12VBk$c=eD4tk6;h^Xs^AgPCpr~jY6!Q~Q zB$&@Z@zmle2gNfT6!~}YOh?5$j*918(5$?8Y1oxJlskHg@q&Aa(-ngwymvG>nff^N zaXOh6Bv?SHg>6!c5-d!xh*EtW`nva|pNlI*KS!knRO;{0-^l>?()b(bz!#MPt{4NH z3~E;x>@b)L8CjfQF%_1yDO4s{lAw|bLmY-sVQ4{Ns46U`!Z3$nPKHyVeSnW}7@?kG z40kfJT_8WoVH6ddEKRVK3RP_i%Mw&2SVo1>4x_1%78FudSW1O44r82r`jWy}hq3A@ z#-~okxm-n7##0C59rqiD2~H+D-BBmG+{KJcc9`gpXRoq9Cpj?9X0u}BT*()->=Z3K zg=MEYOm#BNVVdj0u6V?^CEoKm?7GTyr>W`0W+)J?nGQ1}`Z$2z#}O@+SrMH@baq75 z%Fl6_6WJ#LbU%qKWNu{Vl9(4+wJIDcBKkCd-lq}mB=aLWpTL5Mszp+VIwm(sqChLY)eKqYjQLFTO77HX>xpA+v;-DhXvUd$Iy1yemt^9 zYC`TpMs~QIm7Ok^mt77`4h+22VVlEthnj#L4m%x~wab-!F-M8rDzQ6HjXe%~oa}Yj z>+~(BJOQg&p6G*ZSJ~$@wU5|-1)_Dp;Xp)tC7`!gL`&shL=O@@6j8MfI~qvZe%dUr9(OZ1g;fljm*Hf-JTyy$Po{{Sg*9)WSM!sNjMBP;U zmcvblTa0;IGjO|oFx`n6cQ}~tI^1x$OXOax4(oM48eEwlMB|K?hYk~e$K9c~ zXBBE#g+3mAy!4H4&V}d4ejfeQQ;fbm9*VP>3IjX_P@#j=C#a`FLz}{?1PuvRQDLCR zKne^h2ng>`KT>l3Ww zJfy-{kFiu3S5O$I3Tvq_-ebI%2`?#3^q8ogVodNd$#d>brVJ+gGMVBr#miK$yU#R_ zsU93M94s$f9!&F|u~XS<)@zdI^1y9Hi%w_J86Gpd%=DP)b#WMwfWvM;oJ3t^meO@)eOC#Ag+cL6L>bkL-LB3nHu5LXU+J z9n5D9-oJ=;l0^|+L|}15)mp+AmxvDGLxabVh?YoYL@Nm_ji_2x?Ek9B4(0aGF%a1z zSr*x4B$h{3trZ?CB07w7iruAX+iJd2KNVDatn{cRS)-j-!%qma<4YEYYOT+8k~;RZ zM;(EB1?mZ$$@}z)NH2P9A{@b#;Fa%a}2fL~Lidm2Do|I9fBZA;AVcCEV`YP6>B-Z1>o~qC34#DV`GU^4RHRx5q9o zdpv0D@jsNkDzwjIug5;p`TZXIefu#XPhGQe(Bpu|L1rFeEpX^1{lgxIqyEMO8@brj z1=Q&&;qc_;Q^FAmh9?-2^pTOtcUc$x(^JAx2}UL|I>D$!(gZZpB>!WH-+7LD@G0Ra zMUQzLD^y7Pl8rv@aXgA{O89sYzYd+?Jv`~bYg0Tl>?Ei3Zk(d~w8!ZXBOB^HSvv07M!XUE)pqW`l0M6P(S$Q2S-J+At%*&?YAs1Mb$ne~e8;&-rX zK99>}uB-6%C`=zVC*R_+MVs=CcIBHMyj1j-;WDB2f^FSyyI~v>NNy3P;X1S z-d)cc-t)N2xkc{22DzUvh|;$uiWaK&K+%UD4?G?cZB?{2lCkUFmPgtPk3AlFJSOl& zfhPpsj5PJ6sb32C(GNZ_B{A`IX9`z~_U({A3g` zID8^Q0+=%-@T4qYDA9}zBZ*<5TizhIut2UIiF zJ1c47`b>^Gx(Wc}ujqS*e(R{~M5Xx~3#b}ijP!PQ&cI+BOS`^K%8Ze3mC}<^) z6Q^;L*pJ#*ijuDOmD;JD+9^@{O0A@JYNsShqIPQErG94~nKIM`-kCGsIo~-mXJ+ml z_1KVKx+cH!U%b>l=~t3>&7|`R8&iefEZFysd+4);fBv^G-~Qt7@+4%|C!hKk|6#R9 zK2lvwmHwJ8W~u(#E~Zj{T^BP?e|;BI;WH_Dj`DL|%=BcHfA{_AUS7;JJ9&x9mx|?O zyewZQrb8xAUcoCXq$J?$=zted5(?WZ@Kpj|EtYTK8}b@n>typ}Xu#JnGpQK;u)HC2G_$j)fr#h)~@-CgcTP#1r&*VM4r%px${0JkGMd{bV z$bf&s$Yg)|{lG|mkr|V`p8r;AO!BY!FNRS8|Bg|~$N8^?(Et>$vB}>2*RtaRKE}B4eUq0dlwZ;ASH<#ce5600;FC@!PsRuQ8sj4(Uw%WxZ;Itp zBKY%L{8kYY0zSnAMf@}`{x$zddIgT~@9?`7(mQ0vc=?RUd{!*K$M5BTGDE%mf$cvO zOP9~_x%_XYzn4E!@yBBM6aFNB&Xjohg6%Jg0S^mmqts*+b?9AY;v?fzTHnPo2;y4 z7gnZzJMzuqK76$v?M?-nK_?%(j2X)Z3)GoqW5$ zdaJjxN4@Q#x7rkHQ&N{gUGz3BpeBWBiEZC8Jw0Gw3e%If+JC6^crukKPlmUD=k;r!X_=_(I3@tbl7N%u0Svxgy|33Khv8 zDbEhLox<#72IV;c_fnXX)KQ)r@GynB$)guO%qMkUlW8)^M_=jkdXte-L+(;jEJF;2 z7%4L-Gs-YHfOMT z++>DYnW@d0Y}Uu-EN#wW^MK(NQK790w(2MpaqE%Us+n!FUCb`S>YigT#}t{yt}<6U z<`PLMCjalBqI7^PVhH%Eio(iJ4DjiNO-{ zPWu#{)KIrd#eGmJ^cK65I-d73K|&^4Wm1q429xWirqBmzI?VRR$|* zyUJurN=hE5rP^SXk<|v(M%EZmSYtkrwaT>4V6DMAqSqU&H|FgDP%Q(v`aL$x^O`fTf|AEDJwoEc$olEboWK(XeCV1^2I^jt zFDDI1dy<`}jA9!U+rZ{&13ubu#^6jGsp^1JEQ|1c%fjkpiC!JldUe#q5y*Cxvws-@ z#>_|4I2V&Y7n4_==6&9P(DUrQ5L05_O$L0_;G%|cv2EU$B8YikHsGUqUs2GNm^W3L z_JwS~1?D{{WXg?P)&8plUNg965=w6HsJG!DO~BA`GGu%y-!Scd1`Ra;3;v>V&2>&N~{((E1*XdI9xp~J@&HbY0=Am zEWN4EvhTYezx#y z3LmWS!GxDulv){LF~sUdy)J+ut&1CMXDPGVDkE&D0+3a4n8mP&T^~U8`iL!(;SoEW zfFxp78euUaLO1Xbw%8D%kdYBOl7LYWs?unS(Gj{afZB}_+Cj!d=okXV5}LJ8ah%1t zh}{%G^`?j|l<^Teo`4C_tx6LuCPwJy0BSc!XueE}&`AVLj!>1#Ey^QwO8~W76xy=c zOtDZW8)6tv8x6mpdHxbU?be*jk7SkB(%cX#e0hhvuve;s=eMgp9Jy5X3@-%4* z6|&S~sg-3`cRt;rKbPee%T-f=Wi~4-G@dGp6&6+YgIE7@9<8u1n7mXxFIHNtv~h{7 zvP`?$qMA)Ek=1Iu#$vU_8V0*od)Ha;S<8^)5?LR6*W2#0!D1CFhPaJ!gqZ9mo5dz( zl`oh1`ogTPv}AQP;7Y(%X0@49%&fNLvf83qU1nBWEw)MZJ1Q-E44 zds`XyS?nW&lN)^HBE!v=Ty6#247f#t{TBO4a3Du;Knb!p$Z*i&pp`>y7!F$;R!sp8 zS*f>~ij*874~}s3j#?bGax88K$1RRoFk9wHnX%N{!WR{OLg6O}KWTB&$|;LeaVcyK z;P7vatERIwWVtXc8i+fsh$x-0I1{nk0;t^*m( zbS>TEt39diw@^I@xF7I<_1DLtk9$Y@y0}C1by|P-NY&4wpOgM=s0KI;P)z~)I~mx@ zFvwvL8S>;IKN!gHsD0q1oxg&WKo*W;)D_ z*xCSUYa_PIb*PKb4l*Y~=MXSALRFgQFfT&)22i^s3M{<)q29NRMkqVy0;#%-DMSZ zMZ7hVYKK)$Ry$NXS>r%qjeAel(yOdM*J{fY&>^% zMo^`fT@JhAnkh-6Bt1xaq<<36?Vf4$NTX*q{h{o3*v*pOlPl>xTGA!y3aRD%JE?0^ z(t9~~swn_(l=ityd1;XSoFk4sgE)|5a?&e}Ug>HX%Ce;++f|KmUR)$Lsm&ov< zl%`Qih9NBsWoZmaql^rf9WImMN{-=*GL(|xs>4+$*V-^#cet*a0$g*_>@uC@23c@} zlXTPJrjuLTc~WxQ;TH2}4Y67{du(&gIH=5;VKuwLmuY%OP4Ce3uESj?_Z;py{ro+^ zyCa&#&zR0~-)ZYUVGk4#rH2j=BlIA*f7U>R7RjRseMIPE$NirRo8l9PClPyy8##+1 zVj)i>_9+3+qFa?pJW9MqaF{!?!{G?+AU(WB(8Cu?Pp=WE)XSq+gw_X8TOXl?(mO(X z6VN9cu`2fU=o_&|c(dejBx3WWU&Qt!pnrs_G{9p(gdPo`_NYR&*1O9p`4D;YK)E5rW-D9}N za9?D`{7@1f&(FlS&!c{Xa*UvhH(R%;H)Ukp;&?wa%44LL(H^6`jPal_#=j?HHOg@w zV?DCt{HHSBW4zB@5KYjoi5?R?CbDNzq>6Nth=^J4GBVj?ve$!nXc|M)ydNs}E%!rH zJjy+$&~&PAxgVP5G1bd-k7-_Jcu<((KaiP9G>iGq^q56BcjXG-dOJLh=J_L#%I zxr_pH+wk*>eqQ7smc}q{HKhTidOvjRukMGAvzP;p^M2^WU)>L#uS+Z~N;Io#Pjp}7%Bvw_D{sBK&TbMVsGH>?aqoi9Dz9o{XO8K^W5V)0{ z+dQ^KzOsNa@{Ndmq^t3aa66Zk$9A9P;iX=7|$ zp(v6A3Owj>kYhdchjPf{fS1D_hrHB#P^jnPIii$Dxj}H@vrLY89E)owPmX&Wr{&-u z$_aW`hbKMnRZe-F^f<-AY4BiA0|PznahlLP$)3?b&M;(T=H|;;pMf;0s*$L39%nty z#h7yr&nx)_kMkZE2xwAd6OD^XBOrPgFGdt4?Pw~i}nf7RoPmuntZ zy=1R@P`d8lm1ga`;nD1IgNfbD?J_rY*<}{-PD>r%_PFJ7J37|U-I_0VRDajwj>p}o zFVGK~d#b(f!RH?1Q^dwuJT72kRz^&fZt4;og2dH?_b diff --git a/src/Scene.js b/src/Scene.js index 95ff9d1..e21d596 100644 --- a/src/Scene.js +++ b/src/Scene.js @@ -300,7 +300,7 @@ async function addSketch() { } window.sc = new Scene(store) -sc.loadState() +// sc.loadState() diff --git a/src/Sketch.js b/src/Sketch.js index bc5e70a..d019f06 100644 --- a/src/Sketch.js +++ b/src/Sketch.js @@ -2,11 +2,11 @@ import * as THREE from '../node_modules/three/src/Three'; -import { _vec2, _vec3, raycaster, awaitPts } from './shared' +import { _vec2, _vec3, raycaster, awaitPts, ptObj } from './shared' -import { drawOnClick1, drawOnClick2, drawPreClick2, drawClear } from './drawEvents' +import { drawOnClick1, drawOnClick2, drawPreClick2, drawClear, drawPoint } from './drawEvents' import { onHover, onDrag, onPick, onRelease } from './mouseEvents' -import { setCoincident } from './constraintEvents' +import { setCoincident, setOrdinate } from './constraintEvents' import { get3PtArc } from './drawArc' import { replacer, reviver } from './utils' import { AxesHelper } from './sketchAxes' @@ -47,13 +47,25 @@ class Sketch { this.l_id = 0; this.constraints = new Map() - this.c_id = 0; + this.c_id = 1; this.obj3d.add(new THREE.Group().add(new AxesHelper(0.5))); this.obj3d.add(new THREE.Group()); this.obj3d.add(new THREE.Group()); this.labels = [] + + + const p1 = ptObj() + p1.matrixAutoUpdate = false; + p1.userData.constraints = [] + this.obj3d.add(p1) + this.updatePointsBuffer() + + + + + } else { @@ -138,7 +150,7 @@ class Sketch { this.canvas.addEventListener('pointermove', this.onHover) this.store.dispatch({ type: 'set-active-sketch', sketch: this.obj3d.name }) - + this.setDimLines() window.sketcher = this @@ -199,6 +211,14 @@ class Sketch { case 'd': this.drawDimension() this.mode = "" + break; + case 'p': + this.canvas.addEventListener('pointerdown', + (e) => { + drawPoint.call(this, e) + } + ) + break; case 'x': this.deleteSelected() @@ -207,6 +227,18 @@ class Sketch { setCoincident.call(this) + this.mode = "" + break; + case 'v': + + setOrdinate.call(this, 0) + + this.mode = "" + break; + case 'h': + + setOrdinate.call(this, 1) + this.mode = "" break; @@ -340,12 +372,12 @@ class Sketch { updateBoundingSpheres() { - for (let x = 3; x < this.obj3d.children.length; x++) { + for (let x = 3; x < this.obj3d.children.length; x++) { // geometry boundign spheres const obj = this.obj3d.children[x] obj.geometry.computeBoundingSphere() } - - for (let x = 0; x < this.obj3d.children[1].children.length; x++) { + + for (let x = 0; x < this.obj3d.children[1].children.length; x++) { // dimension bounding sphere const obj = this.obj3d.children[1].children[x] obj.geometry.computeBoundingSphere() } @@ -354,8 +386,8 @@ class Sketch { raycaster.setFromCamera( _vec2.set( - (e.clientX - this.rect.left)/ this.rect.width * 2 - 1, - - (e.clientY - this.rect.top)/ this.rect.height * 2 + 1 + (e.clientX - this.rect.left) / this.rect.width * 2 - 1, + - (e.clientY - this.rect.top) / this.rect.height * 2 + 1 ), this.camera ); diff --git a/src/constraintEvents.js b/src/constraintEvents.js index 521334f..bf0c5fc 100644 --- a/src/constraintEvents.js +++ b/src/constraintEvents.js @@ -1,22 +1,5 @@ -export function addDimension(ent1, ent2, distance) { - - - // if (ent1.type ==) - - this.constraints.set(++this.c_id, - [ - 'distance', distance, - [p1, p2, -1, -1] - ] - ) - - ent1.userData.constraints.push(this.c_id) - ent2.userData.constraints.push(this.c_id) -} - - export function setCoincident() { const s = new Set() const toComb = [] @@ -41,12 +24,37 @@ export function setCoincident() { this.updateOtherBuffers() this.solve() - + this.updateBoundingSpheres() + // update state of points - for (let obj of this.selected) { - obj.geometry.computeBoundingSphere() - obj.material.color.set(0x555555) - } + // for (let obj of this.selected) { + // obj.geometry.computeBoundingSphere() + // obj.material.color.set(0x555555) + // } this.selected = [] this.obj3d.dispatchEvent({ type: 'change' }) } + + +export function setOrdinate(dir = 0) { + + + const line = this.selected[0] + this.constraints.set(++this.c_id, + [ + dir ? 'vertical' : 'horizontal', -1, + [-1, -1, line.name, -1] /////// + ] + ) + line.userData.constraints.push(this.c_id) + + + this.updateOtherBuffers() + this.solve() + this.updateBoundingSpheres() + + this.selected = [] + this.obj3d.dispatchEvent({ type: 'change' }) +} + + diff --git a/src/drawEvents.js b/src/drawEvents.js index 3d78ca8..765a701 100644 --- a/src/drawEvents.js +++ b/src/drawEvents.js @@ -2,6 +2,7 @@ import { drawArc, drawArc2 } from './drawArc' import { drawLine, drawLine2 } from './drawLine' // import { drawDimension } from "./drawDimension"; +import { ptObj } from './shared' export function drawOnClick1(e) { if (e.buttons !== 1) return @@ -95,3 +96,16 @@ export function drawClear() { this.toPush = [] } } + + +export function drawPoint(e) { + + const mouseLoc = this.getLocation(e).toArray(); + const p1 = ptObj() + p1.matrixAutoUpdate = false; + p1.userData.constraints = [] + p1.geometry.attributes.position.set(mouseLoc) + this.obj3d.add(p1) + this.updatePointsBuffer() + this.obj3d.dispatchEvent({ type: 'change' }) +} \ No newline at end of file diff --git a/src/drawLine.js b/src/drawLine.js index e1f8831..4f1f16d 100644 --- a/src/drawLine.js +++ b/src/drawLine.js @@ -33,6 +33,8 @@ export function drawLine(mouseLoc) { p1.userData.constraints.push(this.c_id) this.obj3d.children[this.obj3d.children.length - 2].userData.constraints.push(this.c_id) + + } diff --git a/src/extrude.js b/src/extrude.js index 3c47dc3..cdcadb7 100644 --- a/src/extrude.js +++ b/src/extrude.js @@ -64,7 +64,7 @@ export function extrude(sketch) { } - findPair(children[3]) //??? need fixing + findPair(children[4]) //??? need fixing const shape = new THREE.Shape(v2s); const extrudeSettings = { depth: 8, bevelEnabled: false }; diff --git a/src/patch.js b/src/patch.js index b8ee71f..75e9d99 100644 --- a/src/patch.js +++ b/src/patch.js @@ -5,7 +5,10 @@ import { LineSegments, MeshBasicMaterial, Float32BufferAttribute, BufferGeometry, Mesh, DoubleSide } from '../node_modules/three/src/Three' -class Patch extends Mesh { + +import * as THREE from '../node_modules/three/src/Three'; + +class Patch extends THREE.Mesh { constructor(s = 1) { diff --git a/src/react/toolTip.jsx b/src/react/toolTip.jsx index e3ae4f5..5620d8f 100644 --- a/src/react/toolTip.jsx +++ b/src/react/toolTip.jsx @@ -12,7 +12,7 @@ export const ToolTip = () => { * child mouseover is novel. If it's not, we ignore the event */ - const [state, setState] = useState(null) + const [text, setText] = useState(null) const ref = useRef() @@ -38,14 +38,11 @@ export const ToolTip = () => { prevTooltip.current = tooltip // svg workaround clearTimeout(timeout.current) - if (tooltip) { let { left, top, width, height } = node.getBoundingClientRect() left = left + width / 2 - getTextWidth(tooltip) / 2 - 4 // 4 is padding top = top + height + 6 // 6 is arrow height/width - - setState(tooltip) - + setText(tooltip) if (activated.current) { ref.current.setAttribute('style', `left:${left}px; top:${top}px; visibility:visible`) } else { @@ -54,22 +51,16 @@ export const ToolTip = () => { activated.current = true }, 1000); } - } else { - ref.current.setAttribute('style', `visibility:hidden`) activated.current = false - } - }) - - }, []) return
- {state} + {text}
@@ -77,6 +68,7 @@ export const ToolTip = () => { function getTextWidth(text, font = "16px sans-serif") { + // https://stackoverflow.com/a/21015393 // re-use canvas object for better performance let canvas = getTextWidth.canvas || (getTextWidth.canvas = document.createElement("canvas")); let context = canvas.getContext("2d"); diff --git a/src/shared.js b/src/shared.js index 828cad4..1603783 100644 --- a/src/shared.js +++ b/src/shared.js @@ -7,8 +7,8 @@ const _vec3 = new THREE.Vector3() const raycaster = new THREE.Raycaster(); -raycaster.params.Line.threshold = 0.8; -raycaster.params.Points.threshold = 0.6; +raycaster.params.Line.threshold = 0.1; +raycaster.params.Points.threshold = 0.1; const color = { diff --git a/src/sketchAxes.js b/src/sketchAxes.js index 741f5f2..d9d983b 100644 --- a/src/sketchAxes.js +++ b/src/sketchAxes.js @@ -11,7 +11,7 @@ class AxesHelper extends LineSegments { const vertices = [ 0, 0, 0, 0.5 * s, 0, 0, - 0.5 * s, 0, 0, 0.35 * s, 0.08*s, 0, + 0.5 * s, 0, 0, 0.3 * s, 0.08*s, 0, 0, 0, 0, 0, s, 0, ]; @@ -20,7 +20,7 @@ class AxesHelper extends LineSegments { const geometry = new BufferGeometry(); geometry.setAttribute('position', new Float32BufferAttribute(vertices, 3)); - const material = new LineBasicMaterial({ color: 0xff0000, toneMapped: false }); + const material = new LineBasicMaterial({ color: 0xff0000, toneMapped: false, linewidth:2 }); super(geometry, material); diff --git a/wasm/solver.c b/wasm/solver.c index 34881f3..22ce85a 100644 --- a/wasm/solver.c +++ b/wasm/solver.c @@ -69,18 +69,16 @@ int solver(int nPts, float *p_ptr, int nConst, float *c_ptr, int nLinks, float * Slvs_hParam vh = 301, vh_s = 301; Slvs_hParam lh = 400, lh_s = 400; - Slvs_hParam con_id = 1; - float *buf_pt_start = p_ptr; int p_start = sys.params; for (int i = 0; i < nPts; i++) { if (isnan((float)*p_ptr)) { - // printf("%i\n",i); p_ptr += 3; continue; } + sys.param[sys.params++] = Slvs_MakeParam(ph++, g, (float)*p_ptr++); sys.param[sys.params++] = Slvs_MakeParam(ph++, g, (float)*p_ptr++); sys.entity[sys.entities++] = Slvs_MakePoint2d(i, g, 200, ph - 1, ph - 2); @@ -93,13 +91,10 @@ int solver(int nPts, float *p_ptr, int nConst, float *c_ptr, int nLinks, float * switch ((int)*l_ptr++) { case 0: - // printf("matching %i\n",(int)*(l_ptr + 2)); sys.entity[sys.entities++] = Slvs_MakeLineSegment((int)*(l_ptr + 2), g, 200, (int)*l_ptr, (int)*(l_ptr + 1)); break; case 1: - /* And arc, centered at point 303, starting at point 304, ending at - * point 305. */ sys.entity[sys.entities++] = Slvs_MakeArcOfCircle((int)*(l_ptr + 3), g, 200, 102, (int)*(l_ptr + 2), (int)*(l_ptr), (int)*(l_ptr + 1)); break; @@ -110,11 +105,17 @@ int solver(int nPts, float *p_ptr, int nConst, float *c_ptr, int nLinks, float * l_ptr += 4; } - for (int i = 0; i < nConst; i++, c_ptr += 6) + int c_id = 1; + sys.constraint[sys.constraints++] = Slvs_MakeConstraint( + c_id++, 2, + SLVS_C_POINTS_COINCIDENT, + 200, + -1, + 101, 3, -1, -1); + for (; c_id < 2 + nConst; c_id++, c_ptr += 6) { - // printf("%i here %i\n",(int)*c_ptr, nConst); sys.constraint[sys.constraints++] = Slvs_MakeConstraint( - con_id++, g, + c_id, g, (int)*c_ptr + 100000, 200, *(c_ptr + 1),